@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
@@ -74,8 +74,8 @@ ENABLE_API_DOCS=true
74
74
  # Rate Limiting Configuration (for local development)
75
75
  # Set DISABLE_RATE_LIMIT=true to disable rate limiting entirely (local development only)
76
76
  DISABLE_RATE_LIMIT=true
77
- # RATE_LIMIT_WINDOW_MS=600000 # 10 minutes in milliseconds (default: 600000)
78
- # RATE_LIMIT_MAX=100 # Max requests per window (default: 100)
77
+ RATE_LIMIT_WINDOW_MS=600000
78
+ RATE_LIMIT_MAX=100
79
79
 
80
80
  # Package Version (auto-set by npm/pnpm, optional override)
81
81
  # npm_package_version=1.0.0
@@ -142,6 +142,11 @@ KEYCLOAK_VERIFY_AUDIENCE=false
142
142
  KEYCLOAK_TOKEN_TIMEOUT=5000
143
143
  KEYCLOAK_DEFAULT_PASSWORD=kv://keycloak-default-passwordKeyVault
144
144
 
145
+ # Password setup for new local users (plan 209.0)
146
+ # email = send invitation email so the user sets their own password (default)
147
+ # admin-reveal = show a one-time temporary password to the admin (labs / no mail)
148
+ IDENTITY_LOCAL_PASSWORD_MODE=admin-reveal
149
+
145
150
  # Keycloak Events Configuration
146
151
  KEYCLOAK_EVENTS_ENABLED=true
147
152
  KEYCLOAK_EVENTS_VERIFY_SIGNATURE=true
@@ -317,6 +322,7 @@ MORI_PASSWORD=kv://mori-controller-basic-passwordKeyVault
317
322
  # LOG_FILE_PATH=/mnt/data/logs via deploy JSON and ensure the directory exists.
318
323
 
319
324
  LOG_TO_FILE=true
325
+ LOG_LEVEL=info
320
326
  LOG_FILE_PATH=./logs
321
327
 
322
328
  # =============================================================================
@@ -156,6 +156,7 @@ permissions:
156
156
  roles:
157
157
  [
158
158
  'aifabrix-platform-admin',
159
+ 'aifabrix-infrastructure-admin',
159
160
  'aifabrix-deployment-admin',
160
161
  'aifabrix-developer',
161
162
  'aifabrix-observer'
@@ -1,6 +1,6 @@
1
1
  # Channel integration templates
2
2
 
3
- Published copies of communication external-system manifests for `aifabrix channel scaffold <target>`.
3
+ Published copies of communication external-system manifests for `aifabrix channel scaffold <target>` (also used automatically by `aifabrix channel add`).
4
4
 
5
5
  ## SSOT
6
6
 
@@ -13,6 +13,16 @@ Published copies of communication external-system manifests for `aifabrix channe
13
13
 
14
14
  Do **not** hardcode manifests in `lib/channels/*.js`.
15
15
 
16
+ ## Brand icons (`brand/`)
17
+
18
+ Default AI Fabrix app icons for channel packages (from product icon pack).
19
+
20
+ | File / folder | Use |
21
+ | --- | --- |
22
+ | `color-192.png` | Microsoft Copilot / Teams `color.png` (192×192) |
23
+ | `outline-32.png` | Microsoft Copilot / Teams `outline.png` (32×32 mono) |
24
+ | `light/`, `dark/`, `mono-white/` | Size variants 32–512 for overrides / other surfaces |
25
+
16
26
  ## Slack App manifest (install)
17
27
 
18
28
  `manifest.template.json.hbs` and `install.template.md.hbs` are for `aifabrix channel add slack` (Slack developer portal), separate from the external-system integration tree above.
@@ -54,7 +54,7 @@ Before ChatGPT can connect successfully, the MCP deployment must meet all of the
54
54
 
55
55
  If this development endpoint is deliberately anonymous, select **No authentication** instead and declare `noauth` on the applicable tools. Do not describe the app as “OAuth or API key”; the selected mechanism must match the behavior advertised by the MCP server.
56
56
 
57
- ## Expected Runtime Layer B tools
57
+ ## Expected governed tools
58
58
 
59
59
  ChatGPT should discover the following tools from the live MCP server during **Scan tools**:
60
60
 
@@ -62,12 +62,14 @@ ChatGPT should discover the following tools from the live MCP server during **Sc
62
62
  - `{{this}}`
63
63
  {{/each}}
64
64
 
65
- The live server response is authoritative. This list is an expected deployment contract, not a substitute for MCP tool discovery.
65
+ {{#if installReady}}Install ready: yes{{else}}Install ready: no{{#if discoveryBlocker}} ({{discoveryBlocker}}){{/if}}{{/if}}
66
+
67
+ The live server response is authoritative. This list is an expected deployment contract from External AI Discovery, not a substitute for MCP tool discovery.
66
68
 
67
69
  ## Runtime and Role Assistant boundaries
68
70
 
69
71
  - Runtime resolves assistants dynamically for the current user from `{{{assistantCatalogUrl}}}`.
70
- - ChatGPT's top-level tool surface remains limited to the Runtime Layer B tools listed above.
72
+ - ChatGPT's top-level tool surface remains limited to the governed tools listed above.
71
73
  - Evidence authoring remains an internal Business Transformation Assistant capability. It is reached through `ChatGPT → runtime-orchestration → Business Transformation Assistant → internal evidence capabilities` and is not exposed as a top-level ChatGPT tool.
72
74
  - One authenticated Runtime connection can support multiple Role Assistants, subject to the current user's authorization.
73
75
 
@@ -90,7 +92,7 @@ Then run the AI Fabrix probe:
90
92
  aifabrix channel add {{channelTarget}} --name "{{baseName}}" --probe
91
93
  ```
92
94
 
93
- The probe should validate Runtime through the first-party MCP gateway, including Layer B discovery and BTA Evidence-authoring reachability. A successful AI Fabrix probe does not replace ChatGPT's own **Scan tools**, OAuth, and workspace publication checks.
95
+ The probe should validate Runtime through the first-party MCP gateway, including governed tool discovery and BTA Evidence-authoring reachability. A successful AI Fabrix probe does not replace ChatGPT's own **Scan tools**, OAuth, and workspace publication checks.
94
96
 
95
97
  Use `--force` only to regenerate artifacts and patch channel metadata. It does not rotate credentials.
96
98
 
@@ -5,11 +5,10 @@ Generated by `aifabrix channel scaffold chatgpt`.
5
5
  Recommended flow:
6
6
 
7
7
  ```bash
8
- aifabrix upload chatgpt --force
9
8
  aifabrix channel add chatgpt --name "Your Assistant" --probe
10
9
  ```
11
10
 
12
- The `channel add` step generates `dist/channels/chatgpt/channel-chatgpt.json` and
13
- `INSTALL.md`. Those files are deployment references for workspace admins: ChatGPT
14
- connects to the remote Runtime MCP URL (OAuth) and discovers tools; it does not
15
- install the JSON as a plugin archive.
11
+ `channel add` scaffolds (if needed), uploads when missing (always with `--force`), then
12
+ generates `dist/channels/chatgpt/channel-chatgpt.json` and `INSTALL.md`. Those files are
13
+ deployment references for workspace admins: ChatGPT connects to the remote Runtime MCP URL
14
+ (OAuth) and discovers tools; it does not install the JSON as a plugin archive.
@@ -6,22 +6,7 @@
6
6
  "systemKind": "communication",
7
7
  "enabled": true,
8
8
  "authentication": {
9
- "authType": "credential",
10
- "credential": {
11
- "credentialKey": "chatgpt-channel",
12
- "displayName": "ChatGPT custom MCP app channel",
13
- "method": "apikey",
14
- "writeOnce": true,
15
- "variables": {
16
- "baseUrl": "https://api.openai.com/v1"
17
- },
18
- "security": {
19
- "apiKey": "kv://chatgpt/apiKey"
20
- },
21
- "formFields": [
22
- { "name": "apiKey", "required": true }
23
- ]
24
- }
9
+ "authType": "system"
25
10
  },
26
11
  "configuration": [],
27
12
  "dataSources": [],
@@ -1,28 +1,26 @@
1
1
  {
2
2
  "$schema": "https://developer.microsoft.com/json-schemas/copilot/plugin/v2.4/schema.json",
3
3
  "schema_version": "v2.4",
4
- "name_for_human": "{{appName}}",
5
- "name_for_model": "aifabrix_runtime_orchestration",
6
- "description_for_human": "{{appDescription}}",
7
- "description_for_model": "Runtime orchestration tools for governed enterprise work.",
4
+ "name_for_human": "{{pluginNameForHuman}}",
5
+ "description_for_human": "{{pluginDescriptionForHuman}}",
6
+ "description_for_model": "Governed enterprise work tools for Role Assistants. Prefer discovery tool names only; resolve Role Assistants dynamically for the signed-in user. For listing available Role Assistants use work.roles; use assistant.describe only when an assistantKey is already known.",
7
+ "namespace": "{{pluginNamespace}}",
8
+ "privacy_policy_url": "{{{dataplaneBaseUrl}}}/privacy",
9
+ "legal_info_url": "{{{dataplaneBaseUrl}}}/terms",
10
+ "functions": [],
8
11
  "runtimes": [
9
12
  {
10
13
  "type": "RemoteMCPServer",
11
14
  "spec": {
12
- "url": "{{mcpUrl}}"
15
+ "url": "{{{mcpUrl}}}"
13
16
  },
17
+ "run_for_functions": [
18
+ "*"
19
+ ],
14
20
  "auth": {
15
- "type": "oauth",
16
- "scopes": {{{scopesJson}}}
21
+ "type": "OAuthPluginVault",
22
+ "reference_id": "{{{oauthPluginVaultReferenceId}}}"
17
23
  }
18
24
  }
19
- ],
20
- "mcp_tool_description": {
21
- "mode": "dynamic",
22
- "layerBToolNames": [
23
- {{#each layerBToolNames}}
24
- "{{this}}"{{#unless @last}},{{/unless}}
25
- {{/each}}
26
- ]
27
- }
25
+ ]
28
26
  }
@@ -1,8 +1,10 @@
1
1
  {
2
+ "$schema": "https://developer.microsoft.com/json-schemas/copilot/declarative-agent/v1.4/schema.json",
3
+ "version": "v1.4",
2
4
  "id": "{{packageAppId}}-agent",
3
- "name": "{{appName}}",
4
- "description": "{{appDescription}}",
5
- "instructions": "Use Runtime Layer B tools only. Resolve Role Assistants dynamically and keep business reasoning inside authorized Role Assistant boundaries.",
5
+ "name": "{{fullName}}",
6
+ "description": "{{fullDescription}}",
7
+ "instructions": "Use governed enterprise work tools only. Resolve Role Assistants dynamically and keep business reasoning inside authorized Role Assistant boundaries.",
6
8
  "conversation_starters": [
7
9
  {
8
10
  "title": "Show my role assistants",
@@ -0,0 +1,30 @@
1
+ ## Microsoft Entra SSO registration (Teams Developer Portal)
2
+
3
+ Direct URL:
4
+
5
+ {{{entraSsoRegistrationUrl}}}
6
+
7
+ Open **Tools → Microsoft Entra SSO client ID registration → Register client ID** (or New).
8
+
9
+ Do this **before** organisation publish. The registration / auth-config ID becomes `--oauth-plugin-vault-reference-id`. It is **not** the Entra Client (application) ID.
10
+
11
+ ### Values to paste into the form
12
+
13
+ | Field | Value |
14
+ | --- | --- |
15
+ | Registration name | `{{appName}}` |
16
+ | Base URL | {{#if entraSsoBaseUrl}}`{{{entraSsoBaseUrl}}}`{{else}}*(missing — Remote MCP URL not resolved)*{{/if}} |
17
+ | Restrict usage by organization | My organization only |
18
+ | Restrict usage by Teams app | Stable Teams app / manifest ID `{{packageAppId}}` (known before Import — bind to this ID at registration; do not use “Any Teams app”) |
19
+ | Client (application) ID | {{#if entraSsoClientId}}`{{entraSsoClientId}}`{{else}}*(missing — Entra SSO enterprise app (client) id from controller Keycloak status `entraIdentityProvider.enterpriseAppId`; complete Entra onboarding if empty)*{{/if}} |
20
+ | Scope | {{#if entraSsoScope}}`{{entraSsoScope}}`{{else}}*(missing — set Runtime MCP delegated scopes on Trust source `microsoft-entra-id` `allowedScopes`; not openid/profile alone)*{{/if}} |
21
+
22
+ ### Related (for your records)
23
+
24
+ {{#if mcpUrl}}- **Remote MCP URL (package):** `{{{mcpUrl}}}`{{/if}}
25
+ {{#if packageAppId}}- **Teams app / manifest ID:** `{{packageAppId}}` (preserve on Import app — do not create a new unrelated app){{/if}}
26
+ {{#if entraIssuer}}- **Entra issuer (Trust source):** `{{{entraIssuer}}}`{{/if}}
27
+ {{#if entraTenantId}}- **Tenant id:** `{{entraTenantId}}`{{/if}}
28
+ {{#if entraEnterpriseAppId}}- **Entra Client (application) ID (Keycloak enterprise app):** `{{entraEnterpriseAppId}}`{{/if}}
29
+
30
+ After Save, copy the **Microsoft Entra SSO registration ID** (auth-config id). Pass that value as `--oauth-plugin-vault-reference-id` and re-run `channel add` so `ai-plugin.json` embeds `OAuthPluginVault.reference_id`.
@@ -0,0 +1,7 @@
1
+ {
2
+ "$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.21/MicrosoftTeams.Localization.schema.json",
3
+ "name.short": "{{shortName}}",
4
+ "name.full": "{{fullName}}",
5
+ "description.short": "{{fiShortDescription}}",
6
+ "description.full": "{{fiFullDescription}}"
7
+ }
@@ -2,53 +2,124 @@
2
2
 
3
3
  {{appDescription}}
4
4
 
5
- Environment: **{{environment}}** · Credential key: `{{credentialKey}}`
5
+ Environment: **{{environment}}**
6
6
 
7
- This channel output is a Microsoft 365 Copilot app package:
7
+ This channel uses **Microsoft Entra SSO** (trustedIssuer). Users already signed into
8
+ Microsoft 365 do **not** complete a separate AI Fabrix sign-in. Admin consent may still
9
+ apply for the Runtime MCP delegated scope.
8
10
 
9
11
  ```text
10
12
  dist/channels/microsoft-copilot/source/manifest.json
11
13
  dist/channels/microsoft-copilot/source/declarativeAgent.json
12
14
  dist/channels/microsoft-copilot/source/ai-plugin.json
15
+ dist/channels/microsoft-copilot/source/fi-fi.json
13
16
  dist/channels/microsoft-copilot/build/appPackage.{{environment}}.zip
14
17
  ```
15
18
 
16
- ## Microsoft admin workflow (manual)
19
+ ## Three Microsoft records (do not confuse)
17
20
 
18
- 1. Sign in to [Microsoft 365 admin](https://admin.cloud.microsoft.com/) or Copilot Studio as a tenant admin.
19
- 2. Upload or sideload `appPackage.{{environment}}.zip` to your organization app catalog.
20
- 3. Review the declarative agent + Remote MCP plugin metadata and approve tenant distribution.
21
- 4. Configure workspace authentication and consent according to your Entra/OAuth policy.
22
- 5. Store credential references in AI Fabrix authentication settings: [Authentication settings]({{credentialPortalUrl}})
23
- 6. Assign the app to users/groups and complete first-user sign-in.
21
+ | Record | What it is | Typical ID |
22
+ | --- | --- | --- |
23
+ | **Entra app registration** | Protects the Runtime MCP API. **Client (application) ID** from Entra / Keycloak Trust. | Entra Client (application) ID |
24
+ | **Teams Developer Portal app** | Package definition (`manifest.json.id`) and organisation publish request. | Teams app / manifest ID |
25
+ | **Teams admin centre catalogue** | Approval, availability, policy, published state. | Catalogue entry after org publish |
26
+
27
+ `--oauth-plugin-vault-reference-id` is the **Teams Entra SSO registration / auth-config ID** from Developer Portal Tools → Microsoft Entra SSO. It is **not** the Entra Client (application) ID and **not** a client secret.
28
+
29
+ Do **not** configure AI Fabrix OAuth client secrets under Connected Systems → Authentication for this Entra SSO flow.
30
+
31
+ ## Package prerequisites (before Import)
32
+
33
+ 1. Generate the channel package with `aifabrix channel add microsoft-copilot`.
34
+ 2. Configure Microsoft Entra SSO: **Tools → Microsoft Entra SSO client ID registration** (see table below). Copy the generated registration / auth-config ID.
35
+ 3. Re-run packaging so `ai-plugin.json` gets `auth.type = OAuthPluginVault` and `auth.reference_id = <auth-config-id>`:
36
+
37
+ ```bash
38
+ aifabrix channel add microsoft-copilot --name "{{baseName}}" --oauth-plugin-vault-reference-id "<auth-config-id>"
39
+ ```
40
+
41
+ Keep any `webApplicationInfo` the portal binds for Entra SSO — do not strip it on re-import.
42
+
43
+ Upload **only** the ZIP package. Do not upload individual source files or `channel-microsoft-copilot.json`.
44
+
45
+ ## Install and publish
46
+
47
+ 1. Open [Teams Developer Portal](https://dev.teams.microsoft.com/).
48
+ 2. Click **Import an app** → import `appPackage.{{environment}}.zip`. Preserve the generated stable `manifest.json.id`. Do not create an unrelated new Teams app.
49
+ 3. Developer Portal → selected app → **Publish to your org** → Distribute / submit.
50
+ 4. Teams admin approves in [Teams admin centre → Manage apps](https://admin.teams.microsoft.com/policies/manage-apps) (Manage apps → search → allow). Expect **Published** / **Unblocked** per organisation policy. Allow several minutes for propagation.
51
+ 5. Open **Teams** → **Apps** (**Built for your org**), click **{{appName}}**, **Add** the application, then choose **Open with Copilot**.
52
+ 6. In Copilot, click **Show my role assistants** and run the command.
53
+ 7. Confirm Runtime MCP and governed tools using this guide, then re-run with `--probe` after organisation publish:
54
+
55
+ ```bash
56
+ aifabrix channel add {{channelTarget}} --name "{{baseName}}" --oauth-plugin-vault-reference-id "{{{oauthPluginVaultReferenceId}}}" --probe
57
+ ```
58
+
59
+ 8. After the app is available under **Built for your org**, re-run:
60
+
61
+ ```bash
62
+ aifabrix channel add {{channelTarget}} --name "{{appName}}"
63
+ ```
64
+
65
+ This is a **tenant-private organisation publish**. Microsoft Store app validation is not the Runtime/MCP functional test for this integration.
66
+
67
+ Do **not** use Developer Portal **Preview in Teams** as the normal organisation installation test (it sideloads and may be blocked by tenant policy).
68
+
69
+ ### Optional sideloading for development
70
+
71
+ Use **Upload a custom app** or **Preview in Teams** only if tenant policy permits custom app uploads. Sideloading is **not** required for central organisation publishing. A policy failure such as “Uploading custom apps is not allowed” does **not** mean the organisation-published package is invalid.
72
+
73
+ ## Activate languages
74
+
75
+ The package includes `localizationInfo` with **en-us** (default) and **fi-fi** (`fi-fi.json`). After import in Developer Portal, open the app → **Languages** (or localization) and **activate** additional languages you need for the organisation. Re-import an updated ZIP if you regenerate translations.
24
76
 
25
77
  ## Runtime connection contract
26
78
 
27
79
  - **Runtime system key:** `{{runtimeSystemKey}}`
28
- - **Remote MCP URL:** `{{mcpUrl}}`
80
+ - **Remote MCP URL:** `{{{mcpUrl}}}`
29
81
  - **Transport:** `{{runtimeTransport}}`
30
- - **Auth mode:** `{{runtimeAuthMode}}`
31
- - **Layer B tools expected:**
82
+ - **Auth mode:** `{{runtimeAuthMode}}` (Entra SSO / trustedIssuer; controller exchanges the Microsoft user token)
83
+ - **Plugin auth:** `OAuthPluginVault` · Teams auth-config reference id `{{{oauthPluginVaultReferenceId}}}`
84
+ {{#if entraIssuer}}- **Entra issuer (from Trust source):** `{{{entraIssuer}}}`{{/if}}
85
+ - **Delegated scopes:** {{#if entraSsoScope}}`{{entraSsoScope}}`{{else}}{{#each scopes}}`{{this}}` {{else}}*(set Runtime MCP delegated scopes on Trust source `microsoft-entra-id` `allowedScopes` — not openid/profile alone)*{{/each}}{{/if}}
86
+ - **Package / Runtime ready:** {{#if packageReady}}yes{{else}}no{{#if packageBlocker}} ({{packageBlocker}}){{/if}}{{/if}}
87
+ - **Microsoft publication:** {{#if microsoftPublicationPending}}pending — Developer Portal import → Publish to your org → Teams admin approval{{else}}cleared{{/if}}
88
+ - **Governed tools expected:**
32
89
  {{#each layerBToolNames}}
33
90
  - `{{this}}`
34
91
  {{/each}}
35
92
 
93
+ {{> entraSsoRegistration}}
94
+
95
+ ## Package links
96
+
97
+ - README / install guide: `INSTALL.md`
98
+ - Package ZIP: `build/appPackage.{{environment}}.zip`
99
+
36
100
  ## Assistant catalog
37
101
 
38
- Runtime lists **assistants** available to each user from:
102
+ Runtime lists the assistants available to the signed-in user from:
39
103
 
40
- {{assistantCatalogUrl}}
104
+ {{{assistantCatalogUrl}}}
41
105
 
42
106
  ## Probe truthfulness
43
107
 
44
- - `builderValidated` means package files, ZIP, hashes, and secret checks passed.
45
- - `runtimeValidated` means Runtime MCP is reachable and tool boundary checks pass.
46
- - `requiresMicrosoftAdmin` remains true until tenant upload/approval/assignment is complete.
108
+ - `builderValidated` — package files, ZIP structure, hashes, and secret checks passed.
109
+ - `runtimeValidated` — Runtime MCP is reachable and tool-boundary checks passed.
110
+ - `requiresMicrosoftAdmin` — organisation publish / Teams admin approval is still pending. This is **not** a sideload requirement and is separate from package/Runtime readiness.
47
111
 
48
- ## Validate after admin setup
112
+ `--force` regenerates the package artifacts. microsoft-copilot does not create Fabrix oauth2 channel credentials for Entra SSO.
49
113
 
50
- ```bash
51
- aifabrix channel add {{channelTarget}} --name "{{baseName}}" --probe
52
- ```
114
+ ## Delete / remove from the organisation
115
+
116
+ Use this when replacing the app, cleaning a failed publish, or removing **{{appName}}** entirely. Delete in this order so catalogue and Developer Portal records stay consistent.
117
+
118
+ 1. Open [Teams admin centre → Manage apps](https://admin.teams.microsoft.com/policies/manage-apps).
119
+ 2. Search for **{{appName}}**, open the app, open the action menu, choose **Delete**, and confirm.
120
+ 3. Open [Teams Developer Portal → Apps](https://dev.teams.microsoft.com/apps).
121
+ 4. Find the app in the list, open **…** (Actions) → **Delete**, and confirm by typing the app name.
122
+ 5. Open [Microsoft Entra SSO client ID registration](https://dev.teams.microsoft.com/tools/entra-configuration).
123
+ 6. Find the registration for this channel (same registration / auth-config used as `--oauth-plugin-vault-reference-id`), open **…** (Actions) → **Delete**, and confirm.
53
124
 
54
- `--force` regenerates artifacts but does not rotate credentials.
125
+ After Microsoft cleanup, delete local package output if needed (`dist/channels/microsoft-copilot/`) and re-run `aifabrix channel add` with a **new** Entra SSO registration / auth-config ID. Do not reuse a deleted registration id.
@@ -5,9 +5,8 @@ Generated by `aifabrix channel scaffold microsoft-copilot`.
5
5
  Recommended flow:
6
6
 
7
7
  ```bash
8
- aifabrix upload microsoft-copilot --force
9
8
  aifabrix channel add microsoft-copilot --name "Your Assistant" --probe
10
9
  ```
11
10
 
12
- `channel add` generates package artifacts under
13
- `dist/channels/microsoft-copilot/` for Microsoft 365 tenant admins.
11
+ `channel add` scaffolds (if needed), uploads when missing (always with `--force`), then
12
+ generates package artifacts under `dist/channels/microsoft-copilot/` for Microsoft 365 tenant admins.
@@ -6,28 +6,7 @@
6
6
  "systemKind": "communication",
7
7
  "enabled": true,
8
8
  "authentication": {
9
- "authType": "credential",
10
- "credential": {
11
- "credentialKey": "microsoft-copilot-channel",
12
- "displayName": "Microsoft Copilot package channel",
13
- "method": "oauth2",
14
- "writeOnce": true,
15
- "variables": {
16
- "baseUrl": "https://login.microsoftonline.com",
17
- "authorizationUrl": "https://login.microsoftonline.com/common/oauth2/v2.0/authorize",
18
- "tokenUrl": "https://login.microsoftonline.com/common/oauth2/v2.0/token",
19
- "grantType": "authorization_code",
20
- "scope": "openid profile offline_access"
21
- },
22
- "security": {
23
- "clientId": "kv://microsoft-copilot/clientId",
24
- "clientSecret": "kv://microsoft-copilot/clientSecret"
25
- },
26
- "formFields": [
27
- { "name": "clientId", "required": true },
28
- { "name": "clientSecret", "required": true }
29
- ]
30
- }
9
+ "authType": "system"
31
10
  },
32
11
  "configuration": [],
33
12
  "dataSources": [],
@@ -1,36 +1,51 @@
1
1
  {
2
- "$schema": "https://developer.microsoft.com/json-schemas/teams/v1.21/MicrosoftTeams.schema.json",
3
- "manifestVersion": "1.21",
2
+ "$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.27/MicrosoftTeams.schema.json",
4
3
  "version": "{{packageVersion}}",
4
+ "manifestVersion": "1.27",
5
5
  "id": "{{packageAppId}}",
6
6
  "name": {
7
- "short": "{{baseName}}",
8
- "full": "{{appName}}"
9
- },
10
- "description": {
11
- "short": "{{appDescription}}",
12
- "full": "{{appDescription}}"
7
+ "short": "{{shortName}}",
8
+ "full": "{{fullName}}"
13
9
  },
14
10
  "developer": {
15
11
  "name": "AI Fabrix",
16
- "websiteUrl": "{{dataplaneBaseUrl}}",
17
- "privacyUrl": "{{dataplaneBaseUrl}}/privacy",
18
- "termsOfUseUrl": "{{dataplaneBaseUrl}}/terms"
12
+ "websiteUrl": "{{{dataplaneBaseUrl}}}",
13
+ "privacyUrl": "{{{dataplaneBaseUrl}}}/privacy",
14
+ "termsOfUseUrl": "{{{dataplaneBaseUrl}}}/terms"
15
+ },
16
+ "description": {
17
+ "short": "{{shortDescription}}",
18
+ "full": "{{fullDescription}}"
19
19
  },
20
20
  "icons": {
21
- "color": "color.png",
22
- "outline": "outline.png"
21
+ "outline": "outline.png",
22
+ "color": "color.png"
23
23
  },
24
24
  "accentColor": "#0F172A",
25
+ "validDomains": [
26
+ "{{runtimeDomain}}"
27
+ ],
28
+ {{#if webApplicationInfoId}}
29
+ "webApplicationInfo": {
30
+ "id": "{{webApplicationInfoId}}",
31
+ "resource": "{{{webApplicationInfoResource}}}"
32
+ },
33
+ {{/if}}
34
+ "localizationInfo": {
35
+ "defaultLanguageTag": "en-us",
36
+ "additionalLanguages": [
37
+ {
38
+ "languageTag": "fi-fi",
39
+ "file": "fi-fi.json"
40
+ }
41
+ ]
42
+ },
25
43
  "copilotAgents": {
26
44
  "declarativeAgents": [
27
45
  {
28
- "id": "{{packageAppId}}-agent",
29
- "file": "declarativeAgent.json"
46
+ "file": "declarativeAgent.json",
47
+ "id": "{{packageAppId}}-agent"
30
48
  }
31
49
  ]
32
- },
33
- "validDomains": [
34
- "{{runtimeDomain}}"
35
- ]
50
+ }
36
51
  }
@@ -0,0 +1,15 @@
1
+ microsoft-copilot packaging requires `--oauth-plugin-vault-reference-id` with the Teams Entra SSO **registration / auth-config ID**.
2
+
3
+ That value is **not** the Entra Client (application) ID and **not** a client secret.
4
+
5
+ Register Entra SSO in the Teams Developer Portal **before** packaging (no ZIP needed first): paste the values below, Save, copy the registration id, then re-run.
6
+
7
+ {{> entraSsoRegistration}}
8
+
9
+ Then:
10
+
11
+ ```bash
12
+ aifabrix channel add microsoft-copilot --name "{{baseName}}" --oauth-plugin-vault-reference-id "<Teams-Entra-SSO-registration-id>"
13
+ ```
14
+
15
+ Next: Developer Portal → Apps → Import app (`appPackage.<env>.zip`) → Publish to your org → Teams admin centre approval. Sideloading is optional and not the organisation path.
@@ -30,9 +30,7 @@ Registered at `/api/v1/external/systems/slack/`:
30
30
  ## Workflow
31
31
 
32
32
  ```bash
33
- aifabrix channel scaffold slack # or use this folder as SSOT
34
- aifabrix upload slack --force
35
- aifabrix channel add slack --name "Your Assistant"
33
+ aifabrix channel add slack --name "Your Assistant" --probe
36
34
  ```
37
35
 
38
- Publish template changes: `make sync-json` in dataplane → `aifabrix-builder/templates/channels/slack/integration/`.
36
+ Optional low-level: `channel scaffold` / `upload`. Publish template changes: `make sync-json` in dataplane → `aifabrix-builder/templates/channels/slack/integration/`.
@@ -44,6 +44,10 @@ Users message the bot with:
44
44
 
45
45
  Review cards use **Approve**, **Reject**, and **Edit metadata** actions on the **Bot messages** endpoint. Proactive review notifications use the **Notifications** URL.
46
46
 
47
+ ## Authentication
48
+
49
+ Teams bot authentication uses a **Microsoft token**. AI Fabrix controller performs token exchange — generated package and INSTALL files carry public connection specs only (no secrets).
50
+
47
51
  ## Assistant catalog
48
52
 
49
53
  Runtime lists **assistants** available to each user from:
@@ -8,11 +8,9 @@ SSOT for Teams Bot Framework communication channel — **Role Assistants** and *
8
8
  - **Document approval:** `documents`, `document`, `approve`, `help` bot commands; review Adaptive Cards; proactive `/notifications`
9
9
 
10
10
  ```bash
11
- cd aifabrix-dataplane
12
- aifabrix validate teams-bot
13
- aifabrix upload teams-bot --probe
14
- aifabrix deploy teams-bot
15
- aifabrix channel add teams-bot --name "Your Assistant"
11
+ aifabrix channel add teams-bot --name "Your Assistant" --probe
16
12
  ```
17
13
 
14
+ Optional low-level (dataplane fixture tree): `validate` / `upload` / `deploy` before add.
15
+
18
16
  Authentication: oidc — prefilled discovery settings; operators add Microsoft App ID + client secret on Connected Systems → Authentication.