@aifabrix/builder 2.45.5 → 2.47.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 (355) hide show
  1. package/.cursor/rules/cli-layout.mdc +2 -0
  2. package/.cursor/rules/cli-product-neutral.mdc +43 -0
  3. package/.cursor/rules/project-rules.mdc +1 -0
  4. package/.npmrc.token +1 -0
  5. package/.temp/jest-protection-convert/run-IFN2nv/.protection/hubspot-companies.json +1 -0
  6. package/.temp/jest-protection-convert/run-IvmKLO/.protection/hubspot-companies.yaml +17 -0
  7. package/.temp/jest-protection-convert/run-SdvblF/.protection/hubspot-companies.json +1 -0
  8. package/.temp/jest-protection-convert/run-b51TsW/.protection/hubspot-companies.json +1 -0
  9. package/.temp/jest-protection-convert/run-fiLmb1/.protection/hubspot-companies.json +1 -0
  10. package/.temp/jest-protection-convert/run-qYGHMU/.protection/hubspot-companies.yaml +17 -0
  11. package/.temp/jest-protection-fixtures/hubspot-Mq5re8/hubspot-companies.yaml +17 -0
  12. package/.temp/jest-protection-fixtures/hubspot-f3u4YL/hubspot-companies.yaml +17 -0
  13. package/.temp/jest-protection-fixtures/hubspot-iQtd1O/hubspot-companies.yaml +17 -0
  14. package/.temp/jest-protection-fixtures/hubspot-mdmz5M/hubspot-companies.yaml +17 -0
  15. package/.temp/jest-protection-fixtures/hubspot-qbKYxQ/hubspot-companies.yaml +17 -0
  16. package/.temp/jest-protection-fixtures/hubspot-yzlJy6/hubspot-companies.yaml +17 -0
  17. package/.temp/validation/summary.txt +5 -0
  18. package/README.md +43 -17
  19. package/integration/hubspot-test/test-artifacts/wizard-hubspot-credential-real.yaml +1 -1
  20. package/integration/hubspot-test/test-artifacts/wizard-hubspot-env-vars.yaml +1 -1
  21. package/jest.config.default.js +2 -1
  22. package/jest.config.isolated.js +2 -1
  23. package/jest.global-live-fabrix-hooks.js +36 -0
  24. package/jest.isolated-projects.js +146 -0
  25. package/jest.projects.js +65 -136
  26. package/lib/api/api-response-errors.js +124 -0
  27. package/lib/api/dataplane-health.api.js +19 -7
  28. package/lib/api/governance-scenario-pack.api.js +159 -0
  29. package/lib/api/index.js +43 -3
  30. package/lib/api/lifecycle.api.js +98 -0
  31. package/lib/api/pipeline.api.js +3 -1
  32. package/lib/api/records-bulk.api.js +14 -1
  33. package/lib/api/resource-types.api.js +107 -0
  34. package/lib/api/runtime-configuration.api.js +72 -0
  35. package/lib/api/types/resource-types.types.js +45 -0
  36. package/lib/api/user-groups.api.js +9 -9
  37. package/lib/api/users.api.js +8 -8
  38. package/lib/api/validation-runner.js +3 -1
  39. package/lib/api/wizard.api.js +10 -2
  40. package/lib/app/deploy-config.js +4 -1
  41. package/lib/app/down.js +78 -27
  42. package/lib/app/index.js +2 -2
  43. package/lib/app/push.js +4 -5
  44. package/lib/app/register.js +7 -4
  45. package/lib/app/run-env-compose.js +84 -30
  46. package/lib/app/run-resolve-image.js +2 -1
  47. package/lib/app/run-stop-containers.js +113 -0
  48. package/lib/app/run.js +1 -31
  49. package/lib/app/show-display.js +35 -0
  50. package/lib/app/show.js +32 -1
  51. package/lib/build/index.js +22 -5
  52. package/lib/build/miso-controller-npm-sdk-guard.js +25 -0
  53. package/lib/certification/sync-system-certification.js +13 -6
  54. package/lib/channels/add-channel.js +348 -0
  55. package/lib/channels/channel-artifact-generator.js +141 -0
  56. package/lib/channels/channel-audit.js +101 -0
  57. package/lib/channels/channel-auth-context.js +37 -0
  58. package/lib/channels/channel-credential.js +200 -0
  59. package/lib/channels/channel-display-name.js +64 -0
  60. package/lib/channels/channel-external-system.js +106 -0
  61. package/lib/channels/channel-integration-generator.js +274 -0
  62. package/lib/channels/channel-probe.js +89 -0
  63. package/lib/channels/channel-runtime-resolver.js +152 -0
  64. package/lib/channels/channel-status-display.js +141 -0
  65. package/lib/channels/channel-targets.js +115 -0
  66. package/lib/cli/index.js +20 -4
  67. package/lib/cli/infra-guided-auth.js +109 -0
  68. package/lib/cli/infra-guided.js +84 -81
  69. package/lib/cli/setup-app.help.js +0 -31
  70. package/lib/cli/setup-app.js +82 -5
  71. package/lib/cli/setup-app.test-commands.js +5 -57
  72. package/lib/cli/setup-auth.js +25 -0
  73. package/lib/cli/setup-certification-commands.js +147 -0
  74. package/lib/cli/setup-certification.help.js +141 -0
  75. package/lib/cli/setup-environment.js +19 -2
  76. package/lib/cli/setup-external-system-help.js +62 -0
  77. package/lib/cli/setup-external-system.js +25 -3
  78. package/lib/cli/setup-infra-up-dataplane-action.js +2 -2
  79. package/lib/cli/setup-infra-up-platform-action.js +2 -1
  80. package/lib/cli/setup-infra.js +9 -1
  81. package/lib/cli/setup-platform.js +6 -1
  82. package/lib/cli/setup-secrets.js +33 -1
  83. package/lib/cli/setup-utility-help-after.js +25 -2
  84. package/lib/cli/setup-utility-repair.js +198 -0
  85. package/lib/cli/setup-utility-resolve.js +44 -5
  86. package/lib/cli/setup-utility-validate.js +197 -0
  87. package/lib/cli/setup-utility.js +4 -239
  88. package/lib/commands/app-logs.js +54 -26
  89. package/lib/commands/app.js +41 -0
  90. package/lib/commands/auth-status-client-tokens.js +214 -0
  91. package/lib/commands/auth-status-dataplane-version.js +142 -68
  92. package/lib/commands/auth-status.js +43 -54
  93. package/lib/commands/channel.js +58 -0
  94. package/lib/commands/datasource-test-trust-cli.js +27 -23
  95. package/lib/commands/datasource-unified-test-cli.js +6 -3
  96. package/lib/commands/datasource-unified-test-cli.options.js +5 -1
  97. package/lib/commands/datasource.js +8 -8
  98. package/lib/commands/dev-show-display.js +8 -1
  99. package/lib/commands/governance-cli-shared.js +94 -0
  100. package/lib/commands/governance-command-action.js +132 -0
  101. package/lib/commands/governance-download-external.js +34 -0
  102. package/lib/commands/governance-generate-external.js +71 -0
  103. package/lib/commands/governance-upload-external.js +36 -0
  104. package/lib/commands/governance-verify-external.js +64 -0
  105. package/lib/commands/governance.js +144 -0
  106. package/lib/commands/identity-apply-sync.js +49 -8
  107. package/lib/commands/identity-group-cli.js +66 -26
  108. package/lib/commands/identity-membership-role-cache.js +58 -37
  109. package/lib/commands/identity-shared.js +22 -1
  110. package/lib/commands/identity-user-cli.js +80 -34
  111. package/lib/commands/lifecycle-command-action.js +123 -0
  112. package/lib/commands/lifecycle-external.js +268 -0
  113. package/lib/commands/login.js +11 -2
  114. package/lib/commands/repair-auth-apply.js +153 -0
  115. package/lib/commands/repair-auth-config.js +8 -13
  116. package/lib/commands/repair-changed-files.js +41 -0
  117. package/lib/commands/repair-datasource-com-v2.js +15 -0
  118. package/lib/commands/repair-datasource-keys.js +4 -1
  119. package/lib/commands/repair-datasource-run.js +59 -0
  120. package/lib/commands/repair-datasource-service-contract.js +206 -0
  121. package/lib/commands/repair-datasource-test-payload.js +259 -0
  122. package/lib/commands/repair-datasource.js +49 -64
  123. package/lib/commands/repair-env-template.js +76 -25
  124. package/lib/commands/repair-external-run.js +216 -0
  125. package/lib/commands/repair-openapi-sync.js +49 -4
  126. package/lib/commands/repair-persist.js +4 -0
  127. package/lib/commands/repair-rbac.js +52 -1
  128. package/lib/commands/repair-steps.js +160 -0
  129. package/lib/commands/repair-system-alignment.js +7 -4
  130. package/lib/commands/repair.js +29 -296
  131. package/lib/commands/resource-type.js +371 -0
  132. package/lib/commands/secrets-get.js +184 -0
  133. package/lib/commands/secrets-remove-all.js +3 -1
  134. package/lib/commands/setup-image-refresh.js +146 -0
  135. package/lib/commands/setup-modes.js +158 -162
  136. package/lib/commands/setup-platform-auth.js +76 -0
  137. package/lib/commands/setup-prompts-admin.js +244 -0
  138. package/lib/commands/setup-prompts-platform-mode.js +70 -0
  139. package/lib/commands/setup-prompts-validators.js +36 -0
  140. package/lib/commands/setup-prompts.js +24 -76
  141. package/lib/commands/setup-run-context.js +45 -0
  142. package/lib/commands/setup-spinners.js +39 -0
  143. package/lib/commands/setup.js +27 -5
  144. package/lib/commands/teardown.js +39 -0
  145. package/lib/commands/test-e2e-external.js +24 -8
  146. package/lib/commands/test-governance-external.js +3 -24
  147. package/lib/commands/test-trust-external.js +48 -100
  148. package/lib/commands/up-common.js +57 -13
  149. package/lib/commands/up-dataplane.js +56 -15
  150. package/lib/commands/upload-publish-context.js +75 -0
  151. package/lib/commands/upload-sidecar-followups.js +89 -0
  152. package/lib/commands/upload.js +113 -110
  153. package/lib/commands/verify-governance-combined-external.js +61 -0
  154. package/lib/commands/verify-governance-command-action.js +64 -0
  155. package/lib/commands/verify-governance-db.js +102 -0
  156. package/lib/commands/verify-governance-external.js +77 -0
  157. package/lib/commands/verify-governance-result-builders.js +71 -0
  158. package/lib/commands/verify-operations-command-action.js +68 -0
  159. package/lib/commands/verify-operations-external.js +268 -0
  160. package/lib/commands/verify-operations-persist.js +75 -0
  161. package/lib/commands/verify-operations-step-plan.js +68 -0
  162. package/lib/commands/verify-operations-steps.js +111 -0
  163. package/lib/commands/verify-trust-command-action.js +73 -0
  164. package/lib/commands/verify-trust-external.js +59 -0
  165. package/lib/commands/wizard-config-normalizer.js +43 -23
  166. package/lib/commands/wizard-core.js +2 -0
  167. package/lib/core/admin-password-generator.js +38 -0
  168. package/lib/core/admin-secrets-bundle.js +111 -0
  169. package/lib/core/admin-secrets-env-overlay.js +62 -0
  170. package/lib/core/admin-secrets.js +32 -4
  171. package/lib/core/config-attach-extensions.js +3 -0
  172. package/lib/core/config-platform-controller.js +44 -0
  173. package/lib/core/config-setup-installation-profile.js +42 -0
  174. package/lib/core/config-setup-platform-mode.js +46 -0
  175. package/lib/core/config.js +46 -36
  176. package/lib/core/secrets-admin-env.js +6 -2
  177. package/lib/core/secrets-ensure.js +4 -0
  178. package/lib/core/secrets-env-content.js +54 -48
  179. package/lib/core/secrets-env-write.js +10 -1
  180. package/lib/core/secrets-infra-placeholder-sync.js +2 -0
  181. package/lib/core/setup-installation-profile.js +43 -0
  182. package/lib/core/setup-platform-mode.js +90 -0
  183. package/lib/datasource/agent-trust-debug-log.js +1 -1
  184. package/lib/datasource/agent-trust-run.js +5 -3
  185. package/lib/datasource/audit-evidence-extract-debug.js +30 -18
  186. package/lib/datasource/audit-evidence-extract.js +7 -4
  187. package/lib/datasource/audit-evidence-verify-matrix.js +54 -26
  188. package/lib/datasource/bulk-loader-run-batches.js +15 -3
  189. package/lib/datasource/capability/capability-diff-slice.js +2 -2
  190. package/lib/datasource/capability/capability-manifest.js +254 -0
  191. package/lib/datasource/capability/capability-resolve.js +3 -4
  192. package/lib/datasource/capability/copy-operations.js +5 -3
  193. package/lib/datasource/capability/remove-operations.js +2 -1
  194. package/lib/datasource/capability/run-capability-copy.js +32 -4
  195. package/lib/datasource/capability/run-capability-diff.js +3 -3
  196. package/lib/datasource/capability/run-capability-dimension.js +2 -4
  197. package/lib/datasource/capability/run-capability-edit.js +4 -7
  198. package/lib/datasource/capability/run-capability-relate.js +2 -4
  199. package/lib/datasource/capability/run-capability-remove.js +2 -4
  200. package/lib/datasource/capability/validate-capability-slice.js +2 -1
  201. package/lib/datasource/datasource-identifier.js +2 -1
  202. package/lib/datasource/datasource-load-export-context.js +3 -0
  203. package/lib/datasource/datasource-validate-display.js +1 -1
  204. package/lib/datasource/field-reference-validator.js +24 -3
  205. package/lib/datasource/log-cleaner.js +2 -2
  206. package/lib/datasource/log-viewer.js +8 -8
  207. package/lib/datasource/orphan-profiles-validator.js +98 -0
  208. package/lib/datasource/test-e2e.js +4 -1
  209. package/lib/datasource/unified-validation-run-body.js +3 -1
  210. package/lib/datasource/unified-validation-run.js +5 -2
  211. package/lib/datasource/validate.js +41 -23
  212. package/lib/deployment/environment-poll-status.js +138 -0
  213. package/lib/deployment/environment.js +42 -34
  214. package/lib/external-system/download-helpers.js +87 -0
  215. package/lib/external-system/download.js +78 -138
  216. package/lib/external-system/generator.js +1 -55
  217. package/lib/external-system/integration-auth-context.js +45 -0
  218. package/lib/external-system/test-auth.js +12 -5
  219. package/lib/external-system/test.js +16 -21
  220. package/lib/generator/builders.js +11 -1
  221. package/lib/generator/external-controller-manifest.js +18 -0
  222. package/lib/generator/split.js +3 -1
  223. package/lib/generator/wizard.js +1 -28
  224. package/lib/governance/governance-cli-errors.js +96 -0
  225. package/lib/governance/governance-download-display.js +38 -0
  226. package/lib/governance/governance-run-display.js +215 -25
  227. package/lib/identity/fk-reference.js +65 -0
  228. package/lib/identity/identity-apply-core.js +13 -58
  229. package/lib/identity/identity-apply-phases.js +5 -1
  230. package/lib/identity/identity-display.js +243 -0
  231. package/lib/identity/identity-response-helpers.js +52 -0
  232. package/lib/identity/identity-sync-errors.js +62 -0
  233. package/lib/identity/resolve-user-id.js +129 -0
  234. package/lib/identity/username-default.js +31 -0
  235. package/lib/infrastructure/admin-secrets-apply.js +84 -0
  236. package/lib/infrastructure/admin-secrets-ensure.js +130 -0
  237. package/lib/infrastructure/admin-secrets-resolve.js +95 -0
  238. package/lib/infrastructure/admin-secrets-sync.js +91 -0
  239. package/lib/infrastructure/helpers.js +23 -129
  240. package/lib/infrastructure/index.js +5 -6
  241. package/lib/infrastructure/orphan-infra-docker-teardown.js +11 -5
  242. package/lib/lifecycle/certification-progress.js +231 -0
  243. package/lib/lifecycle/dataplane-ui-url.js +145 -0
  244. package/lib/lifecycle/exit-codes.js +24 -0
  245. package/lib/lifecycle/json-envelope.js +25 -0
  246. package/lib/lifecycle/lifecycle-governance-options.js +51 -0
  247. package/lib/lifecycle/logger-quiet.js +29 -0
  248. package/lib/lifecycle/open-api-published.js +59 -0
  249. package/lib/lifecycle/operations-readiness-metrics.js +101 -0
  250. package/lib/lifecycle/product-model.js +196 -0
  251. package/lib/lifecycle/report-display-trust.js +70 -0
  252. package/lib/lifecycle/report-display.js +472 -0
  253. package/lib/lifecycle/scenario-upload.js +191 -0
  254. package/lib/lifecycle/verify-step-progress.js +87 -0
  255. package/lib/parameters/infra-kv-discovery.js +27 -2
  256. package/lib/protection/auth-context.js +10 -4
  257. package/lib/resolvers/datasource-resolver.js +2 -3
  258. package/lib/resolvers/resource-type-file.js +159 -0
  259. package/lib/schema/application-schema.json +17 -1
  260. package/lib/schema/datasource-test-run.schema.json +89 -6
  261. package/lib/schema/deployment-rules.yaml +2 -1
  262. package/lib/schema/external-datasource.schema.json +2947 -2619
  263. package/lib/schema/external-system.schema.json +1418 -761
  264. package/lib/schema/infra.parameter.yaml +45 -0
  265. package/lib/schema/type/credential-field-registry.json +103 -97
  266. package/lib/schema/type/document-storage.json +9 -5
  267. package/lib/utils/aifabrix-test-runtime-guard.js +125 -0
  268. package/lib/utils/api.js +55 -31
  269. package/lib/utils/app-relative-path-env.js +112 -0
  270. package/lib/utils/app-run-containers.js +25 -2
  271. package/lib/utils/authentication-shape.js +224 -0
  272. package/lib/utils/build-copy.js +36 -5
  273. package/lib/utils/build-resolve-image.js +66 -12
  274. package/lib/utils/celery-companion-apps.js +53 -0
  275. package/lib/utils/cli-secrets-error-format.js +83 -21
  276. package/lib/utils/cli-utils.js +20 -4
  277. package/lib/utils/compose-celery-worker.js +23 -0
  278. package/lib/utils/compose-generate-docker-compose.js +13 -1
  279. package/lib/utils/compose-traefik-ingress-base.js +16 -1
  280. package/lib/utils/config-secrets-path.js +46 -0
  281. package/lib/utils/configuration-env-resolver.js +36 -0
  282. package/lib/utils/controller-url.js +88 -1
  283. package/lib/utils/credential-secrets-env-kv.js +216 -0
  284. package/lib/utils/credential-secrets-env.js +175 -257
  285. package/lib/utils/dataplane-resolver.js +18 -2
  286. package/lib/utils/declarative-url-ports.js +27 -4
  287. package/lib/utils/deployment-auth-mode.js +41 -0
  288. package/lib/utils/developer-volume-id.js +33 -0
  289. package/lib/utils/docker-build.js +1 -4
  290. package/lib/utils/env-copy.js +14 -9
  291. package/lib/utils/env-kv-orphan-lines.js +43 -0
  292. package/lib/utils/error-formatters/network-errors.js +13 -4
  293. package/lib/utils/external-env-template.js +11 -3
  294. package/lib/utils/external-system-readiness-core.js +10 -0
  295. package/lib/utils/external-system-readiness-display.js +80 -23
  296. package/lib/utils/external-system-validators.js +8 -2
  297. package/lib/utils/health-check.js +4 -1
  298. package/lib/utils/help-builder.js +13 -8
  299. package/lib/utils/keycloak-realm-ready.js +101 -0
  300. package/lib/utils/load-cip-capacity-display-config.js +61 -15
  301. package/lib/utils/manifest-source-emit.js +2 -0
  302. package/lib/utils/paths.js +25 -0
  303. package/lib/utils/pipeline-upload-auth-retry.js +82 -0
  304. package/lib/utils/platform-controller-url.js +157 -0
  305. package/lib/utils/platform-kv-ref.js +57 -0
  306. package/lib/utils/postgres-platform-bootstrap.js +199 -0
  307. package/lib/utils/postgres-wipe.js +9 -2
  308. package/lib/utils/resolve-env-mode.js +47 -0
  309. package/lib/utils/runtime-configuration-download.js +189 -0
  310. package/lib/utils/runtime-configuration-values.js +119 -0
  311. package/lib/utils/schema-loader.js +19 -4
  312. package/lib/utils/secrets-generator.js +31 -25
  313. package/lib/utils/secrets-missing-error.js +164 -0
  314. package/lib/utils/service-url-label.js +81 -0
  315. package/lib/utils/setup-quiet-output.js +25 -0
  316. package/lib/utils/template-helpers.js +15 -0
  317. package/lib/utils/token-manager-client-credentials.js +201 -0
  318. package/lib/utils/token-manager-messages.js +8 -0
  319. package/lib/utils/token-manager-refresh.js +12 -2
  320. package/lib/utils/token-manager.js +86 -105
  321. package/lib/utils/upload-pipeline-ui.js +12 -5
  322. package/lib/utils/upload-sync-options.js +42 -0
  323. package/lib/utils/url-declarative-public-base.js +21 -3
  324. package/lib/utils/url-declarative-vdir-inactive-env.js +14 -4
  325. package/lib/utils/validation-poll-ui.js +8 -0
  326. package/lib/utils/validation-run-stage.js +45 -0
  327. package/lib/utils/worker-sidecars.js +142 -0
  328. package/lib/validation/external-manifest-validator.js +2 -0
  329. package/lib/validation/runtime-configuration-rules.js +98 -0
  330. package/lib/validation/validate-display-dimensions.js +154 -0
  331. package/lib/validation/validate-display-sections.js +276 -0
  332. package/lib/validation/validate-display-steps.js +67 -0
  333. package/lib/validation/validate-display.js +24 -402
  334. package/package.json +1 -1
  335. package/templates/applications/dataplane/application.yaml +7 -1
  336. package/templates/applications/dataplane/env.template +50 -14
  337. package/templates/applications/dataplane/rbac.yaml +108 -1
  338. package/templates/applications/miso-controller/application.yaml +2 -2
  339. package/templates/applications/miso-controller/env.template +53 -122
  340. package/templates/applications/miso-controller/rbac.yaml +28 -13
  341. package/templates/channels/chatgpt/install.template.md.hbs +49 -0
  342. package/templates/channels/chatgpt/manifest.template.json.hbs +9 -0
  343. package/templates/channels/microsoft-copilot/install.template.md.hbs +49 -0
  344. package/templates/channels/microsoft-copilot/manifest.template.json.hbs +8 -0
  345. package/templates/channels/slack/install.template.md.hbs +49 -0
  346. package/templates/channels/slack/manifest.template.json.hbs +66 -0
  347. package/templates/channels/teams-bot/install.template.md.hbs +49 -0
  348. package/templates/channels/teams-bot/manifest.template.json.hbs +13 -0
  349. package/templates/channels/web-embed/install.template.md.hbs +49 -0
  350. package/templates/channels/web-embed/manifest.template.json.hbs +8 -0
  351. package/templates/external-system/README.md.hbs +74 -17
  352. package/templates/python/docker-compose.hbs +75 -18
  353. package/templates/typescript/docker-compose.hbs +70 -17
  354. package/lib/commands/test-governance-command-action.js +0 -55
  355. package/lib/commands/test-trust-command-action.js +0 -118
@@ -1,762 +1,1419 @@
1
1
  {
2
- "$schema":"http://json-schema.org/draft-07/schema#",
3
- "$id":"aifabrix://schema/external-system.schema.json",
4
- "title":"AI Fabrix External System Configuration Schema",
5
- "description":"Schema for configuring an external system connected to the AI Fabrix Dataplane. This defines authentication, system-level OpenAPI/MCP connectivity hints (not the datasource-grade vendor contract; see external-datasource.schema.json root externalSpec), field mappings defaults, metadata handling and portal inputs.",
6
- "metadata":{
7
- "key":"external-system-schema",
8
- "name":"External System Configuration Schema",
9
- "description":"JSON schema for validating ExternalSystem configuration files",
10
- "version":"1.6.3",
11
- "type":"schema",
12
- "category":"integration",
13
- "author":"AI Fabrix Team",
14
- "createdAt":"2024-01-01T00:00:00Z",
15
- "updatedAt":"2026-05-10T00:00:00Z",
16
- "compatibility":{
17
- "minVersion":"1.4.0",
18
- "maxVersion":"2.0.0",
19
- "deprecated":false
20
- },
21
- "tags":[
22
- "schema",
23
- "external-system",
24
- "dataplane",
25
- "integration",
26
- "validation"
27
- ],
28
- "dependencies":[
29
-
30
- ],
31
- "changelog":[
32
- {
33
- "version":"1.6.3",
34
- "date":"2026-05-10T00:00:00Z",
35
- "changes":[
36
- "Documented split: system openapi/mcp objects are connectivity and bootstrap hints (specUrl, serverUrl, documentKey); datasource-level vendor/API provenance belongs in external-datasource externalSpec.",
37
- "Declared optional openapi.autoDiscoverEntities (wizard/tooling); tightened openapi and mcp to additionalProperties: false."
38
- ],
39
- "breaking":false
40
- },
41
- {
42
- "version":"1.6.2",
43
- "date":"2026-04-23T00:00:00Z",
44
- "changes":[
45
- "certification.algorithm: RS256 only (removed HS256 from enum)"
46
- ]
47
- },
48
- {
49
- "version":"1.6.1",
50
- "date":"2026-04-22T00:00:00Z",
51
- "changes":[
52
- "Optional certification.publicKeyFingerprint (sha256: hex of SPKI DER) for RS256 public key verification"
53
- ]
54
- },
55
- {
56
- "version":"1.6.0",
57
- "date":"2026-04-09T00:00:00Z",
58
- "changes":[
59
- "Added identityPropagation configuration for impersonation, attribution, and system identity execution modes",
60
- "Added tokenBroker mint endpoint and attribution field injection settings for runtime identity behavior"
61
- ]
62
- },
63
- {
64
- "version":"1.5.0",
65
- "date":"2026-03-07T00:00:00Z",
66
- "changes":[
67
- "Optional rateLimit: outbound per-system rate limit (requestsPerWindow/windowSeconds or requestsPerSecond/burstSize); dataplane enforces and handles 429"
68
- ]
69
- },
70
- {
71
- "version":"1.4.0",
72
- "date":"2026-03-07T00:00:00Z",
73
- "changes":[
74
- "Optional testEndpoint in authentication.variables for apikey: full URL or path (path resolved against baseUrl); credential test URL for E2E/credential step"
75
- ]
76
- },
77
- {
78
- "version":"1.3.0",
79
- "date":"2026-02-18T00:00:00Z",
80
- "changes":[
81
- "Template-based authentication: method, variables (baseUrl when method not none), security (kv:// only), credentialKey, writeOnce",
82
- "Credential created on deploy as authentication.credentialKey or <external-system.key>-cred"
83
- ]
84
- },
85
- {
86
- "version":"1.2.0",
87
- "date":"2025-02-01T00:00:00Z",
88
- "changes":[
89
- "Added generateMcpContract (boolean, default true): config-only control for MCP contract generation on publish",
90
- "Added generateOpenApiContract (boolean, default true): reserved for future use"
91
- ],
92
- "breaking":false
93
- },
94
- {
95
- "version":"1.1.0",
96
- "date":"2025-12-01T00:00:00Z",
97
- "changes":[
98
- "Added RBAC roles and permissions support",
99
- "RBAC roles/permissions are registered with miso-controller during deployment",
100
- "Roles support Azure AD group mapping via Groups property",
101
- "Permissions reference roles and are used for access control"
102
- ],
103
- "breaking":false
104
- },
105
- {
106
- "version":"1.0.0",
107
- "date":"2024-01-01T00:00:00Z",
108
- "changes":[
109
- "Initial schema for External Systems",
110
- "Added OpenAPI and MCP contract configuration",
111
- "Added authentication and environment variables",
112
- "Added portalInput for UI-driven onboarding",
113
- "Compatible with field-mappings.schema and security-model.schema"
114
- ],
115
- "breaking":false
116
- }
117
- ]
118
- },
119
- "$defs":{
120
- "authenticationVariablesByMethod":{
121
- "oauth2":{"variables":[{"key":"baseUrl","required":true,"description":"API base URL"},{"key":"tokenUrl","required":true,"description":"OAuth token endpoint. Full URL (https://...) or path (e.g. /oauth/v2/token); path is resolved against baseUrl."},{"key":"authorizationUrl","required":false,"description":"OAuth authorization endpoint. Full URL or path; path is resolved against baseUrl. Required when grantType is authorization_code or omitted."},{"key":"grantType","required":false,"description":"OAuth 2.0 grant type. One of: client_credentials, authorization_code. Default: authorization_code."},{"key":"scope","required":false},{"key":"tenantId","required":false},{"key":"testEndpoint","required":false,"description":"Optional URL used when testing the credential (GET). Full URL or path (path resolved against baseUrl). If omitted, baseUrl + /health is used."}],"security":[{"key":"clientId","required":true},{"key":"clientSecret","required":true}]},
122
- "aad":{"variables":[{"key":"baseUrl","required":true},{"key":"tokenUrl","required":true,"description":"Token endpoint. Full URL or path (path resolved against baseUrl)."},{"key":"authorizationUrl","required":false,"description":"Authorization endpoint. Full URL or path (path resolved against baseUrl). Required when grantType is authorization_code or omitted."},{"key":"grantType","required":false,"description":"OAuth 2.0 grant type. One of: client_credentials, authorization_code. Default: authorization_code."},{"key":"tenantId","required":false},{"key":"testEndpoint","required":false,"description":"Optional URL used when testing the credential (GET). Full URL or path (path resolved against baseUrl). If omitted, baseUrl + /health is used."}],"security":[{"key":"clientId","required":true},{"key":"clientSecret","required":true}]},
123
- "apikey":{"variables":[{"key":"baseUrl","required":true},{"key":"headerName","required":false},{"key":"prefix","required":false},{"key":"testEndpoint","required":false,"description":"Optional URL used when testing the credential (GET). Full URL (https://...) or path (e.g. /crm/v3/objects/contacts?limit=1); path is resolved against baseUrl. If omitted, baseUrl + /health is used."}],"security":[{"key":"apiKey","required":true}]},
124
- "basic":{"variables":[{"key":"baseUrl","required":true},{"key":"testEndpoint","required":false,"description":"Optional URL used when testing the credential (GET). Full URL or path (path resolved against baseUrl). If omitted, baseUrl + /health is used."}],"security":[{"key":"username","required":true},{"key":"password","required":true}]},
125
- "queryParam":{"variables":[{"key":"baseUrl","required":true},{"key":"paramName","required":true},{"key":"testEndpoint","required":false,"description":"Optional URL used when testing the credential (GET). Full URL or path (path resolved against baseUrl). If omitted, baseUrl + /health is used."}],"security":[{"key":"paramValue","required":true}]},
126
- "oidc":{"variables":[{"key":"openIdConfigUrl","required":true},{"key":"clientId","required":true},{"key":"expectedIssuer","required":false},{"key":"algorithms","required":false},{"key":"validateSignature","required":false},{"key":"clockSkewSeconds","required":false},{"key":"testEndpoint","required":false,"description":"Optional URL used when testing the credential (GET). Full URL or path. For OIDC, discovery URL is typically used if testEndpoint omitted."}],"security":[]},
127
- "hmac":{"variables":[{"key":"baseUrl","required":false},{"key":"algorithm","required":false},{"key":"signatureHeader","required":false},{"key":"timestampHeader","required":false},{"key":"signaturePrefix","required":false},{"key":"testEndpoint","required":false,"description":"Optional URL used when testing the credential (GET). Full URL or path (path resolved against baseUrl when baseUrl present)."}],"security":[{"key":"signingSecret","required":true}]},
128
- "none":{"variables":[],"security":[]}
129
- }
130
- },
131
- "type":"object",
132
- "required":[
133
- "key",
134
- "displayName",
135
- "description",
136
- "type",
137
- "authentication"
138
- ],
139
- "properties":{
140
- "key":{
141
- "type":"string",
142
- "description":"Unique external system identifier (cannot be changed after creation). Example: 'hubspot', 'salesforce', 'teams'.",
143
- "pattern":"^[a-z0-9-]+$",
144
- "minLength":3,
145
- "maxLength":40
146
- },
147
- "displayName":{
148
- "type":"string",
149
- "description":"Human-readable name for the external system",
150
- "minLength":1,
151
- "maxLength":100
152
- },
153
- "description":{
154
- "type":"string",
155
- "description":"Description of this external system integration",
156
- "minLength":1,
157
- "maxLength":500
158
- },
159
- "type":{
160
- "type":"string",
161
- "enum":[
162
- "openapi",
163
- "mcp",
164
- "custom"
165
- ],
166
- "description":"Integration type: openapi and mcp indicate how the system is wired at a high level; per-datasource vendor specifications and import provenance are authored on each ExternalDataSource (external-datasource.schema.json externalSpec), not duplicated as the full contract here."
167
- },
168
- "enabled":{
169
- "type":"boolean",
170
- "default":true
171
- },
172
- "credentialIdOrKey":{
173
- "type":"string",
174
- "description":"Credential identifier (ID or key) to attach to this system. Used by dataplane when creating/updating system from deploy config."
175
- },
176
- "internal":{
177
- "type":"boolean",
178
- "description":"When true, this integration is deployed on dataplane startup (internal integration). When false or absent, deployed via pipeline only.",
179
- "default":false
180
- },
181
- "authentication":{
182
- "type":"object",
183
- "description":"Template-based authentication. Required: method, variables. When method is not 'none', variables must include baseUrl and security must contain only kv:// references. On deploy, a credential is created with key authentication.credentialKey or <external-system.key>-cred. Template is write-once.",
184
- "required":[
185
- "method",
186
- "variables"
187
- ],
188
- "properties":{
189
- "credentialKey":{
190
- "type":"string",
191
- "description":"Stable reference key for the active credential. Default: <external-system.key>-cred."
192
- },
193
- "displayName":{
194
- "type":"string",
195
- "description":"Display name for the credential created from this template."
196
- },
197
- "method":{
198
- "type":"string",
199
- "enum":[
200
- "oauth2",
201
- "apikey",
202
- "basic",
203
- "aad",
204
- "none",
205
- "queryParam",
206
- "oidc",
207
- "hmac"
208
- ],
209
- "description":"Authentication method."
210
- },
211
- "variables":{
212
- "type":"object",
213
- "description":"Non-secret config. See $defs.authenticationVariablesByMethod for per-method keys. oauth2/aad: baseUrl, tokenUrl, authorizationUrl (optional; required when grantType is authorization_code or omitted), grantType (optional, default authorization_code); apikey: baseUrl, headerName (optional), prefix (optional), testEndpoint (optional); basic: baseUrl; queryParam: baseUrl, paramName; oidc: openIdConfigUrl, clientId; hmac: optional; none: empty. URL-valued variables (tokenUrl, authorizationUrl, testEndpoint) accept full URL or path; paths are resolved against baseUrl by the backend.",
214
- "additionalProperties":{
215
- "type":"string"
216
- }
217
- },
218
- "security":{
219
- "type":"object",
220
- "description":"Secret-bearing keys only. Values must be kv:// references. See $defs.authenticationVariablesByMethod. oauth2/aad: clientId, clientSecret; apikey: apiKey; basic: username, password; queryParam: paramValue; oidc: none; hmac: signingSecret.",
221
- "additionalProperties":{
222
- "type":"string",
223
- "pattern":"^kv://.+$"
224
- }
225
- },
226
- "writeOnce":{
227
- "type":"boolean",
228
- "description":"Template is immutable after first deploy; dataplane does not update the credential from this template again.",
229
- "default":true
230
- }
231
- },
232
- "examples":[
233
- {"method":"oauth2","variables":{"baseUrl":"https://api.example.com","tokenUrl":"https://api.example.com/oauth/token","authorizationUrl":"https://api.example.com/oauth/authorize"},"security":{"clientId":"kv://example/clientId","clientSecret":"kv://example/clientSecret"}},
234
- {"method":"oauth2","variables":{"baseUrl":"https://api.example.com","tokenUrl":"https://api.example.com/oauth/token","grantType":"client_credentials"},"security":{"clientId":"kv://example/clientId","clientSecret":"kv://example/clientSecret"}},
235
- {"method":"apikey","variables":{"baseUrl":"https://api.example.com","headerName":"X-API-Key","testEndpoint":"https://api.example.com/health"},"security":{"apiKey":"kv://example/apiKey"}},
236
- {"method":"apikey","variables":{"baseUrl":"https://api.example.com","headerName":"Authorization","prefix":"Bearer","testEndpoint":"/crm/v3/objects/contacts?limit=1"},"security":{"apiKey":"kv://example/apiKey"}},
237
- {"method":"basic","variables":{"baseUrl":"https://api.example.com"},"security":{"username":"kv://example/username","password":"kv://example/password"}},
238
- {"method":"queryParam","variables":{"baseUrl":"https://api.example.com","paramName":"api_key"},"security":{"paramValue":"kv://example/apiKey"}},
239
- {"method":"oidc","variables":{"openIdConfigUrl":"https://example.com/.well-known/openid-configuration","clientId":"app-id"}},
240
- {"method":"hmac","variables":{"signatureHeader":"X-Signature"},"security":{"signingSecret":"kv://example/signingSecret"}},
241
- {"method":"none","variables":{}}
242
- ],
243
- "additionalProperties":false
244
- },
245
- "openapi":{
246
- "type":"object",
247
- "description":"System-level connectivity and bootstrap hints for OpenAPI-backed systems (e.g. default specUrl for discovery, documentKey alignment with shared registry entries). Not the authoritative per-datasource vendor OpenAPI contract; that is declared on the datasource via externalSpec and validated against imported material.",
248
- "properties":{
249
- "documentKey":{
250
- "type":"string",
251
- "description":"Optional registry-oriented key associated with this system's default OpenAPI document (wizard/bootstrap)."
252
- },
253
- "specUrl":{
254
- "type":"string",
255
- "description":"Optional absolute URL to a representative OpenAPI specification for onboarding or tooling (not a substitute for datasource externalSpec).",
256
- "pattern":"^(http|https)://.*$"
257
- },
258
- "autoDiscoverEntities":{
259
- "type":"boolean",
260
- "description":"Optional wizard or tooling hint to discover entities from the system default spec. Not part of the per-datasource vendor contract (see external-datasource externalSpec)."
261
- }
262
- },
263
- "additionalProperties":false
264
- },
265
- "mcp":{
266
- "type":"object",
267
- "description":"System-level MCP connectivity hints (server URL, tool prefix). Not the datasource-level MCP security or operation contract; those live on ExternalDataSource configuration.",
268
- "properties":{
269
- "serverUrl":{
270
- "type":"string",
271
- "description":"MCP server URL",
272
- "pattern":"^(http|https)://.*$"
273
- },
274
- "toolPrefix":{
275
- "type":"string",
276
- "description":"Prefix for MCP tool names",
277
- "pattern":"^[a-zA-Z0-9_-]+$"
278
- }
279
- },
280
- "additionalProperties":false
281
- },
282
- "dataSources":{
283
- "type":"array",
284
- "description":"List of data source keys belonging to this external system. Each must match external-datasource.schema.json.",
285
- "items":{
286
- "type":"string",
287
- "pattern":"^[a-z0-9-]+$"
288
- },
289
- "uniqueItems":true
290
- },
291
- "configuration":{
292
- "type":"array",
293
- "description":"External system configuration variables (same pattern as application-schema).",
294
- "items":{
295
- "type":"object",
296
- "required":[
297
- "name",
298
- "value",
299
- "location",
300
- "required"
301
- ],
302
- "properties":{
303
- "name":{
304
- "type":"string",
305
- "pattern":"^[A-Z_][A-Z0-9_]*$"
306
- },
307
- "value":{
308
- "type":"string",
309
- "description":"Literal value or parameter reference ({{parameter}})"
310
- },
311
- "location":{
312
- "type":"string",
313
- "enum":[
314
- "variable",
315
- "keyvault"
316
- ]
317
- },
318
- "required":{
319
- "type":"boolean"
320
- },
321
- "portalInput":{
322
- "type":"object",
323
- "required":[
324
- "field",
325
- "label"
326
- ],
327
- "properties":{
328
- "field":{
329
- "type":"string",
330
- "enum":[
331
- "password",
332
- "text",
333
- "textarea",
334
- "select",
335
- "json"
336
- ]
337
- },
338
- "label":{
339
- "type":"string"
340
- },
341
- "placeholder":{
342
- "type":"string"
343
- },
344
- "options":{
345
- "type":"array",
346
- "items":{
347
- "type":"string"
348
- }
349
- },
350
- "masked":{
351
- "type":"boolean"
352
- },
353
- "validation":{
354
- "type":"object",
355
- "properties":{
356
- "minLength":{
357
- "type":"integer"
358
- },
359
- "maxLength":{
360
- "type":"integer"
361
- },
362
- "pattern":{
363
- "type":"string"
364
- },
365
- "required":{
366
- "type":"boolean"
367
- }
368
- },
369
- "additionalProperties":false
370
- }
371
- },
372
- "additionalProperties":false
373
- }
374
- },
375
- "additionalProperties":false
376
- }
377
- },
378
- "tags":{
379
- "type":"array",
380
- "description":"Optional tags for search / filtering",
381
- "items":{
382
- "type":"string"
383
- }
384
- },
385
- "roles":{
386
- "type":"array",
387
- "description":"External system roles for Azure AD group mapping",
388
- "items":{
389
- "type":"object",
390
- "required":[
391
- "name",
392
- "value",
393
- "description"
394
- ],
395
- "properties":{
396
- "name":{
397
- "type":"string",
398
- "description":"Human-readable role name",
399
- "minLength":1,
400
- "maxLength":100
401
- },
402
- "value":{
403
- "type":"string",
404
- "description":"Role identifier (used in JWT and ACL)",
405
- "pattern":"^[a-z0-9-]+$"
406
- },
407
- "description":{
408
- "type":"string",
409
- "description":"Role description",
410
- "minLength":1,
411
- "maxLength":500
412
- },
413
- "groups":{
414
- "type":"array",
415
- "description":"Azure AD groups mapped to this role",
416
- "items":{
417
- "type":"string",
418
- "minLength":1,
419
- "maxLength":100
420
- }
421
- }
422
- },
423
- "additionalProperties":false
424
- }
425
- },
426
- "permissions":{
427
- "type":"array",
428
- "description":"External system permissions with role mappings for access control",
429
- "items":{
430
- "type":"object",
431
- "required":[
432
- "name",
433
- "roles",
434
- "description"
435
- ],
436
- "properties":{
437
- "name":{
438
- "type":"string",
439
- "description":"Permission identifier (e.g., 'documentstore:read', 'flowise:dev:access')",
440
- "pattern":"^[a-z0-9-:]+$",
441
- "minLength":1,
442
- "maxLength":100
443
- },
444
- "roles":{
445
- "type":"array",
446
- "description":"Roles that have this permission",
447
- "items":{
448
- "type":"string",
449
- "pattern":"^[a-z0-9-]+$",
450
- "minLength":1,
451
- "maxLength":50
452
- },
453
- "minItems":1
454
- },
455
- "description":{
456
- "type":"string",
457
- "description":"Permission description",
458
- "minLength":1,
459
- "maxLength":500
460
- }
461
- },
462
- "additionalProperties":false
463
- }
464
- },
465
- "endpoints":{
466
- "type":"array",
467
- "description":"API endpoint configurations for this external system. Used for dynamic endpoint registration at application startup.",
468
- "items":{
469
- "type":"object",
470
- "required":[
471
- "type",
472
- "path"
473
- ],
474
- "properties":{
475
- "type":{
476
- "type":"string",
477
- "description":"Endpoint type identifier (e.g., 'commands', 'events', 'notifications')",
478
- "pattern":"^[a-z0-9-]+$"
479
- },
480
- "path":{
481
- "type":"string",
482
- "description":"URL path for this endpoint (e.g., '/commands', '/events')",
483
- "pattern":"^/[a-z0-9/-]*$"
484
- },
485
- "description":{
486
- "type":"string",
487
- "description":"Human-readable description of the endpoint"
488
- },
489
- "active":{
490
- "type":"boolean",
491
- "description":"Whether this endpoint should be registered (defaults to true)",
492
- "default":true
493
- },
494
- "router":{
495
- "type":"string",
496
- "description":"Custom router module path override (defaults to auto-discovery based on naming convention)"
497
- }
498
- },
499
- "additionalProperties":false
500
- }
501
- },
502
- "endpointsActive":{
503
- "type":"boolean",
504
- "description":"Master switch for all endpoints in this system. If false, no endpoints are registered regardless of individual endpoint active flags.",
505
- "default":true
506
- },
507
- "generateMcpContract":{
508
- "type":"boolean",
509
- "description":"Whether to generate MCP contract on publish. Config only (no query parameter); default true when absent.",
510
- "default":true
511
- },
512
- "generateOpenApiContract":{
513
- "type":"boolean",
514
- "description":"Reserved: whether to generate or expose OpenAPI contract on publish. Not yet implemented.",
515
- "default":true
516
- },
517
- "triggerPathsHash":{
518
- "type":"string",
519
- "description":"SHA256 hash of triggerPaths payload (64-char hex). Used to detect structural changes. Optional; Dataplane computes when absent.",
520
- "pattern":"^[a-f0-9]{64}$"
521
- },
522
- "identityPropagation":{
523
- "type":"object",
524
- "description":"Declares supported identity propagation modes and defaults for outbound operations.",
525
- "required":[
526
- "modes",
527
- "default"
528
- ],
529
- "properties":{
530
- "modes":{
531
- "type":"array",
532
- "items":{
533
- "type":"string",
534
- "enum":[
535
- "impersonation",
536
- "attribution",
537
- "system"
538
- ]
539
- },
540
- "uniqueItems":true,
541
- "minItems":1
542
- },
543
- "default":{
544
- "type":"string",
545
- "enum":[
546
- "impersonation",
547
- "attribution",
548
- "system"
549
- ]
550
- },
551
- "impersonation":{
552
- "type":"object",
553
- "properties":{
554
- "tokenBroker":{
555
- "type":"object",
556
- "properties":{
557
- "mintEndpoint":{
558
- "type":"string",
559
- "default":"/api/v1/auth/token/mint",
560
- "description":"Controller endpoint for delegated token minting."
561
- }
562
- },
563
- "additionalProperties":false
564
- },
565
- "scopes":{
566
- "type":"array",
567
- "items":{
568
- "type":"string"
569
- }
570
- },
571
- "requiredUserConsent":{
572
- "type":"boolean",
573
- "default":false
574
- }
575
- },
576
- "additionalProperties":false
577
- },
578
- "attribution":{
579
- "type":"object",
580
- "properties":{
581
- "actorFieldMappings":{
582
- "type":"object",
583
- "description":"Map target fields to actor templates (supports {{actor.*}} and {{request.*}}).",
584
- "additionalProperties":{
585
- "type":[
586
- "string",
587
- "number",
588
- "boolean"
589
- ]
590
- }
591
- },
592
- "commentTemplate":{
593
- "type":"string",
594
- "description":"Optional comment template for attribution logs (supports {{actor.*}})."
595
- },
596
- "injectionLocations":{
597
- "type":"array",
598
- "items":{
599
- "type":"string",
600
- "enum":[
601
- "body",
602
- "headers",
603
- "query",
604
- "comment"
605
- ]
606
- },
607
- "default":[
608
- "body"
609
- ],
610
- "uniqueItems":true
611
- }
612
- },
613
- "additionalProperties":false
614
- },
615
- "system":{
616
- "type":"object",
617
- "properties":{
618
- "allowWrites":{
619
- "type":"boolean",
620
- "default":true
621
- }
622
- },
623
- "additionalProperties":false
624
- }
625
- },
626
- "additionalProperties":false
627
- },
628
- "rateLimit":{
629
- "type":"object",
630
- "description":"Outbound rate limit for requests from the dataplane to this external system. When set, the dataplane enforces the limit per base URL and handles HTTP 429 (wait and retry). When absent, global env defaults apply (CIP_EXECUTION_RATE_LIMIT_REQUESTS_PER_SECOND, CIP_EXECUTION_RATE_LIMIT_BURST_SIZE). Supports window-based (e.g. HubSpot 100/10s) or token-bucket style (requestsPerSecond + burstSize).",
631
- "properties":{
632
- "requestsPerWindow":{
633
- "type":"integer",
634
- "minimum":1,
635
- "description":"Maximum requests allowed in the time window (window-based limit). Example: 100 for HubSpot's 100 requests per 10 seconds."
636
- },
637
- "windowSeconds":{
638
- "type":"integer",
639
- "minimum":1,
640
- "description":"Time window in seconds. Used with requestsPerWindow. Example: 10 for HubSpot (100 requests per 10 seconds)."
641
- },
642
- "requestsPerSecond":{
643
- "type":"number",
644
- "minimum":0.1,
645
- "description":"Sustained request rate (token-bucket style). When used with burstSize, allows short bursts up to burstSize while refilling at this rate."
646
- },
647
- "burstSize":{
648
- "type":"integer",
649
- "minimum":1,
650
- "description":"Maximum burst size in tokens (token-bucket style). Used with requestsPerSecond."
651
- }
652
- },
653
- "additionalProperties":false,
654
- "oneOf":[
655
- {
656
- "required":["requestsPerWindow","windowSeconds"]
657
- },
658
- {
659
- "required":["requestsPerSecond","burstSize"]
660
- }
661
- ],
662
- "examples":[
663
- {"requestsPerWindow":100,"windowSeconds":10},
664
- {"requestsPerSecond":10,"burstSize":100}
665
- ]
666
- },
667
- "performance":{
668
- "type":"object",
669
- "description":"Performance defaults for runtime paths in this external system.",
670
- "properties":{
671
- "cacheDefaults":{
672
- "type":"object",
673
- "description":"Default cache policy inherited by datasources unless overridden under sync.cache.",
674
- "properties":{
675
- "enabled":{
676
- "type":"boolean",
677
- "default":true
678
- },
679
- "ttlSeconds":{
680
- "type":"integer",
681
- "minimum":1,
682
- "maximum":604800,
683
- "default":1800
684
- }
685
- },
686
- "additionalProperties":false
687
- }
688
- },
689
- "additionalProperties":false
690
- },
691
- "certification":{
692
- "type":"object",
693
- "description":"Public certification settings for external system version verification.",
694
- "required":[
695
- "enabled",
696
- "publicKey",
697
- "algorithm",
698
- "issuer",
699
- "version"
700
- ],
701
- "properties":{
702
- "enabled":{
703
- "type":"boolean",
704
- "description":"Enable public certification metadata for this external system."
705
- },
706
- "publicKey":{
707
- "type":"string",
708
- "minLength":1,
709
- "description":"Public verification material (SPKI PEM for RS256). Private keys must never appear in config."
710
- },
711
- "publicKeyFingerprint":{
712
- "type":"string",
713
- "pattern":"^sha256:[0-9a-f]{64}$",
714
- "description":"SHA-256 fingerprint of the SubjectPublicKeyInfo DER (same convention as integration certificate publicKeyFingerprint); must match embedded publicKey."
715
- },
716
- "contractHash":{
717
- "type":"string",
718
- "pattern":"^sha256:[0-9a-f]{64}$",
719
- "description":"Optional copy of the active integration certificate contractHash (certification contract material digest) for drift checks; should match the dataplane active trusted certificate when present."
720
- },
721
- "algorithm":{
722
- "type":"string",
723
- "enum":[
724
- "RS256"
725
- ],
726
- "description":"Signing algorithm for integration certificate verification (RS256 only)."
727
- },
728
- "issuer":{
729
- "type":"string",
730
- "minLength":1,
731
- "description":"Certificate issuer identifier."
732
- },
733
- "version":{
734
- "type":"string",
735
- "minLength":1,
736
- "description":"Certification version identifier; must align with external system versioning."
737
- },
738
- "status":{
739
- "type":"string",
740
- "enum":[
741
- "passed",
742
- "not_passed",
743
- "pending"
744
- ],
745
- "description":"Outcome of certification evaluation for this block (aligns with DatasourceTestRun certificate.status)."
746
- },
747
- "level":{
748
- "type":"string",
749
- "enum":[
750
- "BRONZE",
751
- "SILVER",
752
- "GOLD",
753
- "PLATINUM"
754
- ],
755
- "description":"Achieved certification tier (aligns with integration certificate certificationLevel)."
756
- }
757
- },
758
- "additionalProperties":false
759
- }
760
- },
761
- "additionalProperties":false
762
- }
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "aifabrix://schema/external-system.schema.json",
4
+ "title": "AI Fabrix External System Configuration Schema",
5
+ "description": "Schema for configuring an external system connected to the AI Fabrix Dataplane. This defines authentication, system-level OpenAPI/MCP connectivity hints (not the datasource-grade vendor contract; see external-datasource.schema.json root externalSpec), field mappings defaults, metadata handling and portal inputs.",
6
+ "metadata": {
7
+ "key": "external-system-schema",
8
+ "name": "External System Configuration Schema",
9
+ "description": "JSON schema for validating ExternalSystem configuration files",
10
+ "version": "1.9.0",
11
+ "type": "schema",
12
+ "category": "integration",
13
+ "author": "AI Fabrix Team",
14
+ "createdAt": "2024-01-01T00:00:00Z",
15
+ "updatedAt": "2026-06-15T00:00:00Z",
16
+ "compatibility": {
17
+ "minVersion": "1.4.0",
18
+ "maxVersion": "2.0.0",
19
+ "deprecated": false
20
+ },
21
+ "tags": [
22
+ "schema",
23
+ "external-system",
24
+ "dataplane",
25
+ "integration",
26
+ "validation"
27
+ ],
28
+ "dependencies": [],
29
+ "changelog": [
30
+ {
31
+ "version": "1.9.0",
32
+ "date": "2026-06-15T00:00:00Z",
33
+ "changes": [
34
+ "Added systemKind digitalWorker to x-systemKindCatalog (enterpriseContext group).",
35
+ "Extended subscriptionFilter with roleKeys, includeSystemKinds, and excludeSystemKinds for Digital Worker generation inputs."
36
+ ],
37
+ "breaking": false
38
+ },
39
+ {
40
+ "version": "1.8.0",
41
+ "date": "2026-06-11T00:00:00Z",
42
+ "changes": [
43
+ "Added x-systemKindCatalog as single source of truth for systemKind keys, displayName labels, and UX filter groups (enterpriseContext, externalSystems, platformServices)."
44
+ ],
45
+ "breaking": false
46
+ },
47
+ {
48
+ "version": "1.7.0",
49
+ "date": "2026-05-20T00:00:00Z",
50
+ "changes": [
51
+ "Breaking: nested authentication with authType discriminator (credential | apiProvider | none)",
52
+ "Flat authentication.method at top level removed; credential template lives under authentication.credential",
53
+ "Added authentication.apiProvider.apiProviderKey for Miso delegated API Provider reference"
54
+ ],
55
+ "breaking": true
56
+ },
57
+ {
58
+ "version": "1.6.3",
59
+ "date": "2026-05-10T00:00:00Z",
60
+ "changes": [
61
+ "Documented split: system openapi/mcp objects are connectivity and bootstrap hints (specUrl, serverUrl, documentKey); datasource-level vendor/API provenance belongs in external-datasource externalSpec.",
62
+ "Declared optional openapi.autoDiscoverEntities (wizard/tooling); tightened openapi and mcp to additionalProperties: false."
63
+ ],
64
+ "breaking": false
65
+ },
66
+ {
67
+ "version": "1.6.2",
68
+ "date": "2026-04-23T00:00:00Z",
69
+ "changes": [
70
+ "certification.algorithm: RS256 only (removed HS256 from enum)"
71
+ ]
72
+ },
73
+ {
74
+ "version": "1.6.1",
75
+ "date": "2026-04-22T00:00:00Z",
76
+ "changes": [
77
+ "Optional certification.publicKeyFingerprint (sha256: hex of SPKI DER) for RS256 public key verification"
78
+ ]
79
+ },
80
+ {
81
+ "version": "1.6.0",
82
+ "date": "2026-04-09T00:00:00Z",
83
+ "changes": [
84
+ "Added identityPropagation configuration for impersonation, attribution, and system identity execution modes",
85
+ "Added tokenBroker mint endpoint and attribution field injection settings for runtime identity behavior"
86
+ ]
87
+ },
88
+ {
89
+ "version": "1.5.0",
90
+ "date": "2026-03-07T00:00:00Z",
91
+ "changes": [
92
+ "Optional rateLimit: outbound per-system rate limit (requestsPerWindow/windowSeconds or requestsPerSecond/burstSize); dataplane enforces and handles 429"
93
+ ]
94
+ },
95
+ {
96
+ "version": "1.4.0",
97
+ "date": "2026-03-07T00:00:00Z",
98
+ "changes": [
99
+ "Optional testEndpoint in authentication.variables for apikey: full URL or path (path resolved against baseUrl); credential test URL for E2E/credential step"
100
+ ]
101
+ },
102
+ {
103
+ "version": "1.3.0",
104
+ "date": "2026-02-18T00:00:00Z",
105
+ "changes": [
106
+ "Template-based authentication: method, variables (baseUrl when method not none), security (kv:// only), credentialKey, writeOnce",
107
+ "Credential created on deploy as authentication.credentialKey or <external-system.key>-cred"
108
+ ]
109
+ },
110
+ {
111
+ "version": "1.2.0",
112
+ "date": "2025-02-01T00:00:00Z",
113
+ "changes": [
114
+ "Added generateMcpContract (boolean, default true): config-only control for MCP contract generation on publish",
115
+ "Added generateOpenApiContract (boolean, default true): reserved for future use"
116
+ ],
117
+ "breaking": false
118
+ },
119
+ {
120
+ "version": "1.1.0",
121
+ "date": "2025-12-01T00:00:00Z",
122
+ "changes": [
123
+ "Added RBAC roles and permissions support",
124
+ "RBAC roles/permissions are registered with miso-controller during deployment",
125
+ "Roles support Azure AD group mapping via Groups property",
126
+ "Permissions reference roles and are used for access control"
127
+ ],
128
+ "breaking": false
129
+ },
130
+ {
131
+ "version": "1.0.0",
132
+ "date": "2024-01-01T00:00:00Z",
133
+ "changes": [
134
+ "Initial schema for External Systems",
135
+ "Added OpenAPI and MCP contract configuration",
136
+ "Added authentication and environment variables",
137
+ "Added portalInput for UI-driven onboarding",
138
+ "Compatible with field-mappings.schema and security-model.schema"
139
+ ],
140
+ "breaking": false
141
+ }
142
+ ]
143
+ },
144
+ "$defs": {
145
+ "subscriptionFilter": {
146
+ "type": "object",
147
+ "description": "Shared filter engine shape for subscription triggers and Digital Worker generation inputs.",
148
+ "properties": {
149
+ "resourceTypes": {
150
+ "type": "array",
151
+ "items": {
152
+ "type": "string",
153
+ "minLength": 1
154
+ },
155
+ "minItems": 1
156
+ },
157
+ "systemKeys": {
158
+ "type": "array",
159
+ "items": {
160
+ "type": "string",
161
+ "minLength": 1
162
+ },
163
+ "minItems": 1
164
+ },
165
+ "datasourceKeys": {
166
+ "type": "array",
167
+ "items": {
168
+ "type": "string",
169
+ "minLength": 1
170
+ },
171
+ "minItems": 1
172
+ },
173
+ "roleKeys": {
174
+ "type": "array",
175
+ "items": {
176
+ "type": "string",
177
+ "minLength": 1
178
+ },
179
+ "minItems": 1,
180
+ "description": "Role keys that scope Digital Worker or subscription generation."
181
+ },
182
+ "includeSystemKinds": {
183
+ "type": "array",
184
+ "items": {
185
+ "type": "string",
186
+ "minLength": 1
187
+ },
188
+ "minItems": 1,
189
+ "description": "Include external systems whose systemKind matches any listed value."
190
+ },
191
+ "excludeSystemKinds": {
192
+ "type": "array",
193
+ "items": {
194
+ "type": "string",
195
+ "minLength": 1
196
+ },
197
+ "minItems": 1,
198
+ "description": "Exclude external systems whose systemKind matches any listed value."
199
+ }
200
+ },
201
+ "additionalProperties": false
202
+ },
203
+ "subscriptionTask": {
204
+ "type": "object",
205
+ "required": [
206
+ "type"
207
+ ],
208
+ "properties": {
209
+ "type": {
210
+ "type": "string",
211
+ "enum": [
212
+ "compileCom",
213
+ "generateEnterpriseDatasources",
214
+ "generateRestContracts",
215
+ "generateMcpContracts"
216
+ ],
217
+ "description": "Platform task type executed when the subscription fires."
218
+ },
219
+ "version": {
220
+ "type": "integer",
221
+ "minimum": 1,
222
+ "default": 1,
223
+ "description": "Task definition version snapshot for audit."
224
+ }
225
+ },
226
+ "additionalProperties": false
227
+ },
228
+ "subscriptionEntry": {
229
+ "type": "object",
230
+ "required": [
231
+ "key",
232
+ "event",
233
+ "task"
234
+ ],
235
+ "properties": {
236
+ "key": {
237
+ "type": "string",
238
+ "pattern": "^[a-z][a-z0-9-]*$",
239
+ "minLength": 1,
240
+ "maxLength": 100,
241
+ "description": "Unique subscription key within the external system."
242
+ },
243
+ "displayName": {
244
+ "type": "string",
245
+ "maxLength": 255
246
+ },
247
+ "description": {
248
+ "type": "string",
249
+ "maxLength": 2000
250
+ },
251
+ "event": {
252
+ "type": "string",
253
+ "minLength": 1,
254
+ "description": "V1 event namespace (platform.* or schedule.*)."
255
+ },
256
+ "filter": {
257
+ "$ref": "#/$defs/subscriptionFilter"
258
+ },
259
+ "task": {
260
+ "$ref": "#/$defs/subscriptionTask"
261
+ },
262
+ "priority": {
263
+ "type": "string",
264
+ "enum": [
265
+ "low",
266
+ "normal",
267
+ "high",
268
+ "critical"
269
+ ],
270
+ "default": "normal"
271
+ },
272
+ "runOnCreate": {
273
+ "type": "boolean",
274
+ "default": false,
275
+ "description": "When true, run the subscription task once after publish/sync."
276
+ }
277
+ },
278
+ "additionalProperties": false
279
+ },
280
+ "authenticationVariablesByMethod": {
281
+ "oauth2": {
282
+ "variables": [
283
+ {
284
+ "key": "baseUrl",
285
+ "required": true,
286
+ "description": "API base URL"
287
+ },
288
+ {
289
+ "key": "tokenUrl",
290
+ "required": true,
291
+ "description": "OAuth token endpoint. Full URL (https://...) or path (e.g. /oauth/v2/token); path is resolved against baseUrl."
292
+ },
293
+ {
294
+ "key": "authorizationUrl",
295
+ "required": false,
296
+ "description": "OAuth authorization endpoint. Full URL or path; path is resolved against baseUrl. Required when grantType is authorization_code or omitted."
297
+ },
298
+ {
299
+ "key": "grantType",
300
+ "required": false,
301
+ "description": "OAuth 2.0 grant type. One of: client_credentials, authorization_code. Default: authorization_code."
302
+ },
303
+ {
304
+ "key": "scope",
305
+ "required": false
306
+ },
307
+ {
308
+ "key": "tenantId",
309
+ "required": false
310
+ },
311
+ {
312
+ "key": "testEndpoint",
313
+ "required": false,
314
+ "description": "Optional URL used when testing the credential (GET). Full URL or path (path resolved against baseUrl). If omitted, baseUrl + /health is used."
315
+ }
316
+ ],
317
+ "security": [
318
+ {
319
+ "key": "clientId",
320
+ "required": true
321
+ },
322
+ {
323
+ "key": "clientSecret",
324
+ "required": true
325
+ }
326
+ ]
327
+ },
328
+ "aad": {
329
+ "variables": [
330
+ {
331
+ "key": "baseUrl",
332
+ "required": true
333
+ },
334
+ {
335
+ "key": "tokenUrl",
336
+ "required": true,
337
+ "description": "Token endpoint. Full URL or path (path resolved against baseUrl)."
338
+ },
339
+ {
340
+ "key": "authorizationUrl",
341
+ "required": false,
342
+ "description": "Authorization endpoint. Full URL or path (path resolved against baseUrl). Required when grantType is authorization_code or omitted."
343
+ },
344
+ {
345
+ "key": "grantType",
346
+ "required": false,
347
+ "description": "OAuth 2.0 grant type. One of: client_credentials, authorization_code. Default: authorization_code."
348
+ },
349
+ {
350
+ "key": "tenantId",
351
+ "required": false
352
+ },
353
+ {
354
+ "key": "testEndpoint",
355
+ "required": false,
356
+ "description": "Optional URL used when testing the credential (GET). Full URL or path (path resolved against baseUrl). If omitted, baseUrl + /health is used."
357
+ }
358
+ ],
359
+ "security": [
360
+ {
361
+ "key": "clientId",
362
+ "required": true
363
+ },
364
+ {
365
+ "key": "clientSecret",
366
+ "required": true
367
+ }
368
+ ]
369
+ },
370
+ "apikey": {
371
+ "variables": [
372
+ {
373
+ "key": "baseUrl",
374
+ "required": true
375
+ },
376
+ {
377
+ "key": "headerName",
378
+ "required": false
379
+ },
380
+ {
381
+ "key": "prefix",
382
+ "required": false
383
+ },
384
+ {
385
+ "key": "testEndpoint",
386
+ "required": false,
387
+ "description": "Optional URL used when testing the credential (GET). Full URL (https://...) or path (e.g. /crm/v3/objects/contacts?limit=1); path is resolved against baseUrl. If omitted, baseUrl + /health is used."
388
+ }
389
+ ],
390
+ "security": [
391
+ {
392
+ "key": "apiKey",
393
+ "required": true
394
+ }
395
+ ]
396
+ },
397
+ "bearerToken": {
398
+ "variables": [
399
+ {
400
+ "key": "baseUrl",
401
+ "required": true
402
+ },
403
+ {
404
+ "key": "headerName",
405
+ "required": false
406
+ },
407
+ {
408
+ "key": "prefix",
409
+ "required": false
410
+ },
411
+ {
412
+ "key": "testEndpoint",
413
+ "required": false,
414
+ "description": "Optional URL used when testing the credential (GET). Full URL or path; path is resolved against baseUrl. If omitted, baseUrl + /health is used."
415
+ }
416
+ ],
417
+ "security": [
418
+ {
419
+ "key": "token",
420
+ "required": true
421
+ }
422
+ ]
423
+ },
424
+ "basic": {
425
+ "variables": [
426
+ {
427
+ "key": "baseUrl",
428
+ "required": true
429
+ },
430
+ {
431
+ "key": "testEndpoint",
432
+ "required": false,
433
+ "description": "Optional URL used when testing the credential (GET). Full URL or path (path resolved against baseUrl). If omitted, baseUrl + /health is used."
434
+ }
435
+ ],
436
+ "security": [
437
+ {
438
+ "key": "username",
439
+ "required": true
440
+ },
441
+ {
442
+ "key": "password",
443
+ "required": true
444
+ }
445
+ ]
446
+ },
447
+ "queryParam": {
448
+ "variables": [
449
+ {
450
+ "key": "baseUrl",
451
+ "required": true
452
+ },
453
+ {
454
+ "key": "paramName",
455
+ "required": true
456
+ },
457
+ {
458
+ "key": "testEndpoint",
459
+ "required": false,
460
+ "description": "Optional URL used when testing the credential (GET). Full URL or path (path resolved against baseUrl). If omitted, baseUrl + /health is used."
461
+ }
462
+ ],
463
+ "security": [
464
+ {
465
+ "key": "paramValue",
466
+ "required": true
467
+ }
468
+ ]
469
+ },
470
+ "oidc": {
471
+ "variables": [
472
+ {
473
+ "key": "openIdConfigUrl",
474
+ "required": true
475
+ },
476
+ {
477
+ "key": "clientId",
478
+ "required": true
479
+ },
480
+ {
481
+ "key": "expectedIssuer",
482
+ "required": false
483
+ },
484
+ {
485
+ "key": "algorithms",
486
+ "required": false
487
+ },
488
+ {
489
+ "key": "validateSignature",
490
+ "required": false
491
+ },
492
+ {
493
+ "key": "clockSkewSeconds",
494
+ "required": false
495
+ },
496
+ {
497
+ "key": "testEndpoint",
498
+ "required": false,
499
+ "description": "Optional URL used when testing the credential (GET). Full URL or path. For OIDC, discovery URL is typically used if testEndpoint omitted."
500
+ }
501
+ ],
502
+ "security": []
503
+ },
504
+ "hmac": {
505
+ "variables": [
506
+ {
507
+ "key": "baseUrl",
508
+ "required": false
509
+ },
510
+ {
511
+ "key": "algorithm",
512
+ "required": false
513
+ },
514
+ {
515
+ "key": "signatureHeader",
516
+ "required": false
517
+ },
518
+ {
519
+ "key": "timestampHeader",
520
+ "required": false
521
+ },
522
+ {
523
+ "key": "signaturePrefix",
524
+ "required": false
525
+ },
526
+ {
527
+ "key": "testEndpoint",
528
+ "required": false,
529
+ "description": "Optional URL used when testing the credential (GET). Full URL or path (path resolved against baseUrl when baseUrl present)."
530
+ }
531
+ ],
532
+ "security": [
533
+ {
534
+ "key": "signingSecret",
535
+ "required": true
536
+ }
537
+ ]
538
+ },
539
+ "none": {
540
+ "variables": [],
541
+ "security": []
542
+ }
543
+ },
544
+ "credentialTemplate": {
545
+ "type": "object",
546
+ "description": "Local credential template (method, variables, security with kv:// only). Materialized to credentials row on deploy.",
547
+ "required": [
548
+ "method",
549
+ "variables"
550
+ ],
551
+ "properties": {
552
+ "credentialKey": {
553
+ "type": "string",
554
+ "description": "Stable reference key for the active credential. Default: <external-system.key>-cred."
555
+ },
556
+ "displayName": {
557
+ "type": "string",
558
+ "description": "Display name for the credential created from this template."
559
+ },
560
+ "method": {
561
+ "type": "string",
562
+ "enum": [
563
+ "oauth2",
564
+ "apikey",
565
+ "bearerToken",
566
+ "basic",
567
+ "aad",
568
+ "none",
569
+ "queryParam",
570
+ "oidc",
571
+ "hmac"
572
+ ],
573
+ "description": "Authentication method."
574
+ },
575
+ "variables": {
576
+ "type": "object",
577
+ "description": "Non-secret config. See $defs.authenticationVariablesByMethod for per-method keys.",
578
+ "additionalProperties": {
579
+ "type": "string"
580
+ }
581
+ },
582
+ "security": {
583
+ "type": "object",
584
+ "description": "Secret-bearing keys only. Values must be kv:// references.",
585
+ "additionalProperties": {
586
+ "type": "string",
587
+ "pattern": "^kv://.+$"
588
+ }
589
+ },
590
+ "writeOnce": {
591
+ "type": "boolean",
592
+ "description": "Template is immutable after first deploy.",
593
+ "default": true
594
+ }
595
+ },
596
+ "additionalProperties": false
597
+ },
598
+ "apiProviderReference": {
599
+ "type": "object",
600
+ "description": "Reference to a Miso API Provider for delegated authentication (no dataplane secrets).",
601
+ "required": [
602
+ "apiProviderKey"
603
+ ],
604
+ "properties": {
605
+ "apiProviderKey": {
606
+ "type": "string",
607
+ "minLength": 1,
608
+ "description": "Stable key of the Miso API Provider configuration."
609
+ }
610
+ },
611
+ "additionalProperties": false
612
+ }
613
+ },
614
+ "x-systemKindCatalog": {
615
+ "description": "Single source of truth for systemKind keys, display labels, and UX filter groups. Runtime catalog API and validators derive from this block.",
616
+ "groups": [
617
+ {
618
+ "key": "enterpriseContext",
619
+ "displayName": "Enterprise Context"
620
+ },
621
+ {
622
+ "key": "externalSystems",
623
+ "displayName": "External Systems"
624
+ },
625
+ {
626
+ "key": "platformServices",
627
+ "displayName": "Platform Services"
628
+ }
629
+ ],
630
+ "kinds": [
631
+ {
632
+ "key": "crm",
633
+ "displayName": "CRM",
634
+ "group": "externalSystems"
635
+ },
636
+ {
637
+ "key": "erp",
638
+ "displayName": "ERP",
639
+ "group": "externalSystems"
640
+ },
641
+ {
642
+ "key": "hr",
643
+ "displayName": "HR",
644
+ "group": "externalSystems"
645
+ },
646
+ {
647
+ "key": "finance",
648
+ "displayName": "Finance",
649
+ "group": "externalSystems"
650
+ },
651
+ {
652
+ "key": "projectManagement",
653
+ "displayName": "Project Management",
654
+ "group": "externalSystems"
655
+ },
656
+ {
657
+ "key": "customerService",
658
+ "displayName": "Customer Service",
659
+ "group": "externalSystems"
660
+ },
661
+ {
662
+ "key": "marketing",
663
+ "displayName": "Marketing",
664
+ "group": "externalSystems"
665
+ },
666
+ {
667
+ "key": "procurement",
668
+ "displayName": "Procurement",
669
+ "group": "externalSystems"
670
+ },
671
+ {
672
+ "key": "supplyChain",
673
+ "displayName": "Supply Chain",
674
+ "group": "externalSystems"
675
+ },
676
+ {
677
+ "key": "collaboration",
678
+ "displayName": "Collaboration",
679
+ "group": "externalSystems"
680
+ },
681
+ {
682
+ "key": "communication",
683
+ "displayName": "Communication",
684
+ "group": "externalSystems"
685
+ },
686
+ {
687
+ "key": "documentManagement",
688
+ "displayName": "Document Management",
689
+ "group": "externalSystems"
690
+ },
691
+ {
692
+ "key": "identity",
693
+ "displayName": "Identity",
694
+ "group": "platformServices"
695
+ },
696
+ {
697
+ "key": "analytics",
698
+ "displayName": "Analytics",
699
+ "group": "platformServices"
700
+ },
701
+ {
702
+ "key": "dataPlatform",
703
+ "displayName": "Data Platform",
704
+ "group": "platformServices"
705
+ },
706
+ {
707
+ "key": "database",
708
+ "displayName": "Database",
709
+ "group": "platformServices"
710
+ },
711
+ {
712
+ "key": "vectorStore",
713
+ "displayName": "Vector Store",
714
+ "group": "platformServices"
715
+ },
716
+ {
717
+ "key": "llm",
718
+ "displayName": "LLM",
719
+ "group": "platformServices"
720
+ },
721
+ {
722
+ "key": "workflow",
723
+ "displayName": "Workflow",
724
+ "group": "platformServices"
725
+ },
726
+ {
727
+ "key": "integration",
728
+ "displayName": "Integration",
729
+ "group": "platformServices"
730
+ },
731
+ {
732
+ "key": "monitoring",
733
+ "displayName": "Monitoring",
734
+ "group": "platformServices"
735
+ },
736
+ {
737
+ "key": "enterpriseKnowledge",
738
+ "displayName": "Enterprise Knowledge",
739
+ "group": "enterpriseContext"
740
+ },
741
+ {
742
+ "key": "digitalWorker",
743
+ "displayName": "Digital Worker",
744
+ "group": "enterpriseContext"
745
+ },
746
+ {
747
+ "key": "custom",
748
+ "displayName": "Custom",
749
+ "group": null
750
+ }
751
+ ]
752
+ },
753
+ "type": "object",
754
+ "required": [
755
+ "key",
756
+ "displayName",
757
+ "description",
758
+ "type",
759
+ "authentication"
760
+ ],
761
+ "properties": {
762
+ "key": {
763
+ "type": "string",
764
+ "description": "Unique external system identifier (cannot be changed after creation). Example: 'hubspot', 'salesforce', 'teams'.",
765
+ "pattern": "^[a-z0-9-]+$",
766
+ "minLength": 3,
767
+ "maxLength": 40
768
+ },
769
+ "displayName": {
770
+ "type": "string",
771
+ "description": "Human-readable name for the external system",
772
+ "minLength": 1,
773
+ "maxLength": 100
774
+ },
775
+ "description": {
776
+ "type": "string",
777
+ "description": "Description of this external system integration",
778
+ "minLength": 1,
779
+ "maxLength": 500
780
+ },
781
+ "type": {
782
+ "type": "string",
783
+ "enum": [
784
+ "openapi",
785
+ "mcp",
786
+ "custom"
787
+ ],
788
+ "description": "Integration type: openapi and mcp indicate how the system is wired at a high level; per-datasource vendor specifications and import provenance are authored on each ExternalDataSource (external-datasource.schema.json externalSpec), not duplicated as the full contract here."
789
+ },
790
+ "enabled": {
791
+ "type": "boolean",
792
+ "default": true
793
+ },
794
+ "credentialIdOrKey": {
795
+ "type": "string",
796
+ "description": "Credential identifier (ID or key) to attach to this system. Used by dataplane when creating/updating system from deploy config."
797
+ },
798
+ "internal": {
799
+ "type": "boolean",
800
+ "description": "When true, this integration is deployed on dataplane startup (internal integration). When false or absent, deployed via pipeline only.",
801
+ "default": false
802
+ },
803
+ "authentication": {
804
+ "description": "Nested authentication: authType credential (local template), apiProvider (Miso delegated), or none.",
805
+ "oneOf": [
806
+ {
807
+ "type": "object",
808
+ "required": [
809
+ "authType",
810
+ "credential"
811
+ ],
812
+ "properties": {
813
+ "authType": {
814
+ "const": "credential"
815
+ },
816
+ "credential": {
817
+ "$ref": "#/$defs/credentialTemplate"
818
+ }
819
+ },
820
+ "additionalProperties": false
821
+ },
822
+ {
823
+ "type": "object",
824
+ "required": [
825
+ "authType",
826
+ "apiProvider"
827
+ ],
828
+ "properties": {
829
+ "authType": {
830
+ "const": "apiProvider"
831
+ },
832
+ "apiProvider": {
833
+ "$ref": "#/$defs/apiProviderReference"
834
+ }
835
+ },
836
+ "additionalProperties": false
837
+ },
838
+ {
839
+ "type": "object",
840
+ "required": [
841
+ "authType"
842
+ ],
843
+ "properties": {
844
+ "authType": {
845
+ "const": "none"
846
+ }
847
+ },
848
+ "additionalProperties": false
849
+ }
850
+ ]
851
+ },
852
+ "openapi": {
853
+ "type": "object",
854
+ "description": "System-level connectivity and bootstrap hints for OpenAPI-backed systems (e.g. default specUrl for discovery, documentKey alignment with shared registry entries). Not the authoritative per-datasource vendor OpenAPI contract; that is declared on the datasource via externalSpec and validated against imported material.",
855
+ "properties": {
856
+ "documentKey": {
857
+ "type": "string",
858
+ "description": "Optional registry-oriented key associated with this system's default OpenAPI document (wizard/bootstrap)."
859
+ },
860
+ "specUrl": {
861
+ "type": "string",
862
+ "description": "Optional absolute URL to a representative OpenAPI specification for onboarding or tooling (not a substitute for datasource externalSpec).",
863
+ "pattern": "^(http|https)://.*$"
864
+ },
865
+ "autoDiscoverEntities": {
866
+ "type": "boolean",
867
+ "description": "Optional wizard or tooling hint to discover entities from the system default spec. Not part of the per-datasource vendor contract (see external-datasource externalSpec)."
868
+ }
869
+ },
870
+ "additionalProperties": false
871
+ },
872
+ "mcp": {
873
+ "type": "object",
874
+ "description": "System-level MCP connectivity hints (server URL, tool prefix). Not the datasource-level MCP security or operation contract; those live on ExternalDataSource configuration.",
875
+ "properties": {
876
+ "serverUrl": {
877
+ "type": "string",
878
+ "description": "MCP server URL",
879
+ "pattern": "^(http|https)://.*$"
880
+ },
881
+ "toolPrefix": {
882
+ "type": "string",
883
+ "description": "Prefix for MCP tool names",
884
+ "pattern": "^[a-zA-Z0-9_-]+$"
885
+ }
886
+ },
887
+ "additionalProperties": false
888
+ },
889
+ "dataSources": {
890
+ "type": "array",
891
+ "description": "List of data source keys belonging to this external system. Each must match external-datasource.schema.json.",
892
+ "items": {
893
+ "type": "string",
894
+ "pattern": "^[a-z0-9-]+$"
895
+ },
896
+ "uniqueItems": true
897
+ },
898
+ "configuration": {
899
+ "type": "array",
900
+ "description": "External system configuration variables (same pattern as application-schema).",
901
+ "items": {
902
+ "type": "object",
903
+ "required": [
904
+ "name",
905
+ "value",
906
+ "location",
907
+ "required"
908
+ ],
909
+ "properties": {
910
+ "name": {
911
+ "type": "string",
912
+ "pattern": "^[A-Z_][A-Z0-9_]*$"
913
+ },
914
+ "value": {
915
+ "type": "string",
916
+ "description": "Literal value or parameter reference ({{parameter}})"
917
+ },
918
+ "location": {
919
+ "type": "string",
920
+ "enum": [
921
+ "variable",
922
+ "keyvault"
923
+ ]
924
+ },
925
+ "required": {
926
+ "type": "boolean"
927
+ },
928
+ "portalInput": {
929
+ "type": "object",
930
+ "required": [
931
+ "field",
932
+ "label"
933
+ ],
934
+ "properties": {
935
+ "field": {
936
+ "type": "string",
937
+ "enum": [
938
+ "password",
939
+ "text",
940
+ "textarea",
941
+ "select",
942
+ "json"
943
+ ]
944
+ },
945
+ "label": {
946
+ "type": "string"
947
+ },
948
+ "placeholder": {
949
+ "type": "string"
950
+ },
951
+ "options": {
952
+ "type": "array",
953
+ "items": {
954
+ "type": "string"
955
+ }
956
+ },
957
+ "masked": {
958
+ "type": "boolean"
959
+ },
960
+ "validation": {
961
+ "type": "object",
962
+ "properties": {
963
+ "minLength": {
964
+ "type": "integer"
965
+ },
966
+ "maxLength": {
967
+ "type": "integer"
968
+ },
969
+ "pattern": {
970
+ "type": "string"
971
+ },
972
+ "required": {
973
+ "type": "boolean"
974
+ }
975
+ },
976
+ "additionalProperties": false
977
+ }
978
+ },
979
+ "additionalProperties": false
980
+ }
981
+ },
982
+ "additionalProperties": false
983
+ }
984
+ },
985
+ "tags": {
986
+ "type": "array",
987
+ "description": "Optional tags for search / filtering",
988
+ "items": {
989
+ "type": "string"
990
+ }
991
+ },
992
+ "roles": {
993
+ "type": "array",
994
+ "description": "External system roles for Azure AD group mapping",
995
+ "items": {
996
+ "type": "object",
997
+ "required": [
998
+ "name",
999
+ "value",
1000
+ "description"
1001
+ ],
1002
+ "properties": {
1003
+ "name": {
1004
+ "type": "string",
1005
+ "description": "Human-readable role name",
1006
+ "minLength": 1,
1007
+ "maxLength": 100
1008
+ },
1009
+ "value": {
1010
+ "type": "string",
1011
+ "description": "Role identifier (used in JWT and ACL)",
1012
+ "pattern": "^[a-z0-9-]+$"
1013
+ },
1014
+ "description": {
1015
+ "type": "string",
1016
+ "description": "Role description",
1017
+ "minLength": 1,
1018
+ "maxLength": 500
1019
+ },
1020
+ "groups": {
1021
+ "type": "array",
1022
+ "description": "Azure AD groups mapped to this role",
1023
+ "items": {
1024
+ "type": "string",
1025
+ "minLength": 1,
1026
+ "maxLength": 100
1027
+ }
1028
+ }
1029
+ },
1030
+ "additionalProperties": false
1031
+ }
1032
+ },
1033
+ "permissions": {
1034
+ "type": "array",
1035
+ "description": "External system permissions with role mappings for access control",
1036
+ "items": {
1037
+ "type": "object",
1038
+ "required": [
1039
+ "name",
1040
+ "roles",
1041
+ "description"
1042
+ ],
1043
+ "properties": {
1044
+ "name": {
1045
+ "type": "string",
1046
+ "description": "Permission identifier (e.g., 'documentstore:read', 'flowise:dev:access')",
1047
+ "pattern": "^[a-z0-9-:]+$",
1048
+ "minLength": 1,
1049
+ "maxLength": 100
1050
+ },
1051
+ "roles": {
1052
+ "type": "array",
1053
+ "description": "Roles that have this permission",
1054
+ "items": {
1055
+ "type": "string",
1056
+ "pattern": "^[a-z0-9-]+$",
1057
+ "minLength": 1,
1058
+ "maxLength": 50
1059
+ },
1060
+ "minItems": 1
1061
+ },
1062
+ "description": {
1063
+ "type": "string",
1064
+ "description": "Permission description",
1065
+ "minLength": 1,
1066
+ "maxLength": 500
1067
+ }
1068
+ },
1069
+ "additionalProperties": false
1070
+ }
1071
+ },
1072
+ "endpoints": {
1073
+ "type": "array",
1074
+ "description": "API endpoint configurations for this external system. Used for dynamic endpoint registration at application startup.",
1075
+ "items": {
1076
+ "type": "object",
1077
+ "required": [
1078
+ "type",
1079
+ "path"
1080
+ ],
1081
+ "properties": {
1082
+ "type": {
1083
+ "type": "string",
1084
+ "description": "Endpoint type identifier (e.g., 'commands', 'events', 'notifications')",
1085
+ "pattern": "^[a-z0-9-]+$"
1086
+ },
1087
+ "path": {
1088
+ "type": "string",
1089
+ "description": "URL path for this endpoint (e.g., '/commands', '/events')",
1090
+ "pattern": "^/[a-z0-9/-]*$"
1091
+ },
1092
+ "description": {
1093
+ "type": "string",
1094
+ "description": "Human-readable description of the endpoint"
1095
+ },
1096
+ "active": {
1097
+ "type": "boolean",
1098
+ "description": "Whether this endpoint should be registered (defaults to true)",
1099
+ "default": true
1100
+ },
1101
+ "router": {
1102
+ "type": "string",
1103
+ "description": "Custom router module path override (defaults to auto-discovery based on naming convention)"
1104
+ }
1105
+ },
1106
+ "additionalProperties": false
1107
+ }
1108
+ },
1109
+ "endpointsActive": {
1110
+ "type": "boolean",
1111
+ "description": "Master switch for all endpoints in this system. If false, no endpoints are registered regardless of individual endpoint active flags.",
1112
+ "default": true
1113
+ },
1114
+ "generateMcpContract": {
1115
+ "type": "boolean",
1116
+ "description": "Whether to generate MCP contract on publish. Config only (no query parameter); default true when absent.",
1117
+ "default": true
1118
+ },
1119
+ "generateOpenApiContract": {
1120
+ "type": "boolean",
1121
+ "description": "Reserved: whether to generate or expose OpenAPI contract on publish. Not yet implemented.",
1122
+ "default": true
1123
+ },
1124
+ "triggerPathsHash": {
1125
+ "type": "string",
1126
+ "description": "SHA256 hash of triggerPaths payload (64-char hex). Used to detect structural changes. Optional; Dataplane computes when absent.",
1127
+ "pattern": "^[a-f0-9]{64}$"
1128
+ },
1129
+ "identityPropagation": {
1130
+ "type": "object",
1131
+ "description": "Declares supported identity propagation modes and defaults for outbound operations.",
1132
+ "required": [
1133
+ "modes",
1134
+ "default"
1135
+ ],
1136
+ "properties": {
1137
+ "modes": {
1138
+ "type": "array",
1139
+ "items": {
1140
+ "type": "string",
1141
+ "enum": [
1142
+ "impersonation",
1143
+ "attribution",
1144
+ "system"
1145
+ ]
1146
+ },
1147
+ "uniqueItems": true,
1148
+ "minItems": 1
1149
+ },
1150
+ "default": {
1151
+ "type": "string",
1152
+ "enum": [
1153
+ "impersonation",
1154
+ "attribution",
1155
+ "system"
1156
+ ]
1157
+ },
1158
+ "impersonation": {
1159
+ "type": "object",
1160
+ "properties": {
1161
+ "tokenBroker": {
1162
+ "type": "object",
1163
+ "properties": {
1164
+ "mintEndpoint": {
1165
+ "type": "string",
1166
+ "default": "/api/v1/auth/token/mint",
1167
+ "description": "Controller endpoint for delegated token minting."
1168
+ }
1169
+ },
1170
+ "additionalProperties": false
1171
+ },
1172
+ "scopes": {
1173
+ "type": "array",
1174
+ "items": {
1175
+ "type": "string"
1176
+ }
1177
+ },
1178
+ "requiredUserConsent": {
1179
+ "type": "boolean",
1180
+ "default": false
1181
+ }
1182
+ },
1183
+ "additionalProperties": false
1184
+ },
1185
+ "attribution": {
1186
+ "type": "object",
1187
+ "properties": {
1188
+ "actorFieldMappings": {
1189
+ "type": "object",
1190
+ "description": "Map target fields to actor templates (supports {{actor.*}} and {{request.*}}).",
1191
+ "additionalProperties": {
1192
+ "type": [
1193
+ "string",
1194
+ "number",
1195
+ "boolean"
1196
+ ]
1197
+ }
1198
+ },
1199
+ "commentTemplate": {
1200
+ "type": "string",
1201
+ "description": "Optional comment template for attribution logs (supports {{actor.*}})."
1202
+ },
1203
+ "injectionLocations": {
1204
+ "type": "array",
1205
+ "items": {
1206
+ "type": "string",
1207
+ "enum": [
1208
+ "body",
1209
+ "headers",
1210
+ "query",
1211
+ "comment"
1212
+ ]
1213
+ },
1214
+ "default": [
1215
+ "body"
1216
+ ],
1217
+ "uniqueItems": true
1218
+ }
1219
+ },
1220
+ "additionalProperties": false
1221
+ },
1222
+ "system": {
1223
+ "type": "object",
1224
+ "properties": {
1225
+ "allowWrites": {
1226
+ "type": "boolean",
1227
+ "default": true
1228
+ }
1229
+ },
1230
+ "additionalProperties": false
1231
+ }
1232
+ },
1233
+ "additionalProperties": false
1234
+ },
1235
+ "rateLimit": {
1236
+ "type": "object",
1237
+ "description": "Outbound rate limit for requests from the dataplane to this external system. When set, the dataplane enforces the limit per base URL and handles HTTP 429 (wait and retry). When absent, global env defaults apply (CIP_EXECUTION_RATE_LIMIT_REQUESTS_PER_SECOND, CIP_EXECUTION_RATE_LIMIT_BURST_SIZE). Supports window-based (e.g. HubSpot 100/10s) or token-bucket style (requestsPerSecond + burstSize).",
1238
+ "properties": {
1239
+ "requestsPerWindow": {
1240
+ "type": "integer",
1241
+ "minimum": 1,
1242
+ "description": "Maximum requests allowed in the time window (window-based limit). Example: 100 for HubSpot's 100 requests per 10 seconds."
1243
+ },
1244
+ "windowSeconds": {
1245
+ "type": "integer",
1246
+ "minimum": 1,
1247
+ "description": "Time window in seconds. Used with requestsPerWindow. Example: 10 for HubSpot (100 requests per 10 seconds)."
1248
+ },
1249
+ "requestsPerSecond": {
1250
+ "type": "number",
1251
+ "minimum": 0.1,
1252
+ "description": "Sustained request rate (token-bucket style). When used with burstSize, allows short bursts up to burstSize while refilling at this rate."
1253
+ },
1254
+ "burstSize": {
1255
+ "type": "integer",
1256
+ "minimum": 1,
1257
+ "description": "Maximum burst size in tokens (token-bucket style). Used with requestsPerSecond."
1258
+ }
1259
+ },
1260
+ "additionalProperties": false,
1261
+ "oneOf": [
1262
+ {
1263
+ "required": [
1264
+ "requestsPerWindow",
1265
+ "windowSeconds"
1266
+ ]
1267
+ },
1268
+ {
1269
+ "required": [
1270
+ "requestsPerSecond",
1271
+ "burstSize"
1272
+ ]
1273
+ }
1274
+ ],
1275
+ "examples": [
1276
+ {
1277
+ "requestsPerWindow": 100,
1278
+ "windowSeconds": 10
1279
+ },
1280
+ {
1281
+ "requestsPerSecond": 10,
1282
+ "burstSize": 100
1283
+ }
1284
+ ]
1285
+ },
1286
+ "performance": {
1287
+ "type": "object",
1288
+ "description": "Performance defaults for runtime paths in this external system.",
1289
+ "properties": {
1290
+ "cacheDefaults": {
1291
+ "type": "object",
1292
+ "description": "Default cache policy inherited by datasources unless overridden under sync.cache.",
1293
+ "properties": {
1294
+ "enabled": {
1295
+ "type": "boolean",
1296
+ "default": true
1297
+ },
1298
+ "ttlSeconds": {
1299
+ "type": "integer",
1300
+ "minimum": 1,
1301
+ "maximum": 604800,
1302
+ "default": 1800
1303
+ }
1304
+ },
1305
+ "additionalProperties": false
1306
+ }
1307
+ },
1308
+ "additionalProperties": false
1309
+ },
1310
+ "systemKind": {
1311
+ "type": "string",
1312
+ "enum": [
1313
+ "crm",
1314
+ "erp",
1315
+ "hr",
1316
+ "finance",
1317
+ "projectManagement",
1318
+ "customerService",
1319
+ "marketing",
1320
+ "procurement",
1321
+ "supplyChain",
1322
+ "collaboration",
1323
+ "communication",
1324
+ "documentManagement",
1325
+ "identity",
1326
+ "analytics",
1327
+ "dataPlatform",
1328
+ "database",
1329
+ "vectorStore",
1330
+ "llm",
1331
+ "workflow",
1332
+ "integration",
1333
+ "monitoring",
1334
+ "enterpriseKnowledge",
1335
+ "digitalWorker",
1336
+ "custom"
1337
+ ],
1338
+ "default": "custom",
1339
+ "description": "Enterprise system classification metadata (CRM, LLM, enterprise knowledge, etc.). Does not affect execution or routing. Valid keys, display labels, and UX groups are defined in x-systemKindCatalog at schema root — not stored per row."
1340
+ },
1341
+ "subscriptions": {
1342
+ "type": "array",
1343
+ "description": "Event subscriptions that bootstrap platform tasks on publish/sync. Runtime uses persisted Subscription rows after sync.",
1344
+ "items": {
1345
+ "$ref": "#/$defs/subscriptionEntry"
1346
+ }
1347
+ },
1348
+ "certification": {
1349
+ "type": "object",
1350
+ "description": "Public certification settings for external system version verification.",
1351
+ "required": [
1352
+ "enabled",
1353
+ "publicKey",
1354
+ "algorithm",
1355
+ "issuer",
1356
+ "version"
1357
+ ],
1358
+ "properties": {
1359
+ "enabled": {
1360
+ "type": "boolean",
1361
+ "description": "Enable public certification metadata for this external system."
1362
+ },
1363
+ "publicKey": {
1364
+ "type": "string",
1365
+ "minLength": 1,
1366
+ "description": "Public verification material (SPKI PEM for RS256). Private keys must never appear in config."
1367
+ },
1368
+ "publicKeyFingerprint": {
1369
+ "type": "string",
1370
+ "pattern": "^sha256:[0-9a-f]{64}$",
1371
+ "description": "SHA-256 fingerprint of the SubjectPublicKeyInfo DER (same convention as integration certificate publicKeyFingerprint); must match embedded publicKey."
1372
+ },
1373
+ "contractHash": {
1374
+ "type": "string",
1375
+ "pattern": "^sha256:[0-9a-f]{64}$",
1376
+ "description": "Optional copy of the active integration certificate contractHash (certification contract material digest) for drift checks; should match the dataplane active trusted certificate when present."
1377
+ },
1378
+ "algorithm": {
1379
+ "type": "string",
1380
+ "enum": [
1381
+ "RS256"
1382
+ ],
1383
+ "description": "Signing algorithm for integration certificate verification (RS256 only)."
1384
+ },
1385
+ "issuer": {
1386
+ "type": "string",
1387
+ "minLength": 1,
1388
+ "description": "Certificate issuer identifier."
1389
+ },
1390
+ "version": {
1391
+ "type": "string",
1392
+ "minLength": 1,
1393
+ "description": "Certification version identifier; must align with external system versioning."
1394
+ },
1395
+ "status": {
1396
+ "type": "string",
1397
+ "enum": [
1398
+ "passed",
1399
+ "not_passed",
1400
+ "pending"
1401
+ ],
1402
+ "description": "Outcome of certification evaluation for this block (aligns with DatasourceTestRun certificate.status)."
1403
+ },
1404
+ "level": {
1405
+ "type": "string",
1406
+ "enum": [
1407
+ "BRONZE",
1408
+ "SILVER",
1409
+ "GOLD",
1410
+ "PLATINUM"
1411
+ ],
1412
+ "description": "Achieved certification tier (aligns with integration certificate certificationLevel)."
1413
+ }
1414
+ },
1415
+ "additionalProperties": false
1416
+ }
1417
+ },
1418
+ "additionalProperties": false
1419
+ }