@aifabrix/builder 2.52.1 → 2.53.1

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 (225) hide show
  1. package/lib/app/deploy-config.js +3 -2
  2. package/lib/channels/add-channel.js +11 -41
  3. package/lib/channels/approval-guides/index.js +3 -0
  4. package/lib/channels/approval-guides/microsoft-copilot.js +26 -17
  5. package/lib/channels/channel-add-existing.js +72 -0
  6. package/lib/channels/channel-runtime-resolver.js +5 -1
  7. package/lib/channels/channel-status-display.js +30 -3
  8. package/lib/channels/microsoft-copilot-entra-sso-form.js +73 -2
  9. package/lib/channels/microsoft-copilot-entra-sso.js +26 -5
  10. package/lib/channels/microsoft-copilot-limits.js +22 -3
  11. package/lib/channels/microsoft-copilot-package.js +59 -14
  12. package/lib/channels/microsoft-copilot-validate.js +40 -10
  13. package/lib/cli/attach-default-help-examples.js +102 -0
  14. package/lib/cli/index.js +2 -0
  15. package/lib/cli/setup-credential-deployment.js +7 -5
  16. package/lib/cli/setup-utility-validate.js +1 -0
  17. package/lib/commands/credential-push.js +37 -5
  18. package/lib/commands/package-score.js +72 -0
  19. package/lib/commands/role-assistant.js +46 -8
  20. package/lib/deployment/deployer-poll-run.js +2 -2
  21. package/lib/deployment/deployer.js +1 -1
  22. package/lib/deployment/environment.js +2 -2
  23. package/lib/external-system/deploy.js +11 -21
  24. package/lib/integration-definition/apply.js +12 -14
  25. package/lib/integration-definition/enrich-openapi-operations.js +9 -10
  26. package/lib/lab/package-parity-score.js +417 -0
  27. package/lib/programmatic/capability-registry.js +1 -0
  28. package/lib/programmatic/help-content/channel-onboarding.md +35 -0
  29. package/lib/programmatic/help-content/cip-overview.md +27 -0
  30. package/lib/programmatic/help-content/connected-system-ui.md +70 -0
  31. package/lib/programmatic/help-content/dimensions-guide.md +23 -0
  32. package/lib/programmatic/help-content/enterprise-sync-fabrix.md +123 -0
  33. package/lib/programmatic/help-content/overview.md +25 -0
  34. package/lib/programmatic/help-content/subscription-guide.md +27 -0
  35. package/lib/programmatic/help-content/workflow.md +50 -0
  36. package/lib/programmatic/openapi-component-schemas.js +1 -0
  37. package/lib/programmatic/openapi-descriptions.js +6 -0
  38. package/lib/programmatic/openapi-envelope-examples.js +11 -0
  39. package/lib/programmatic/openapi-operation-bindings.js +5 -0
  40. package/lib/programmatic/openapi-request-schemas.js +39 -13
  41. package/lib/programmatic/openapi-result-schemas.js +30 -0
  42. package/lib/programmatic/openapi-schema-descriptions-core.js +18 -0
  43. package/lib/programmatic/openapi-schema-descriptions-operations.js +19 -0
  44. package/lib/programmatic/persist-supplied-openapi.js +180 -0
  45. package/lib/programmatic/route-handler-map.js +6 -0
  46. package/lib/programmatic/run-integration-definition.js +13 -5
  47. package/lib/role-assistant/evidence-sync.js +55 -7
  48. package/lib/role-assistant/test-runner-attachments.js +118 -0
  49. package/lib/role-assistant/test-runner-bid-apply.js +100 -21
  50. package/lib/role-assistant/test-runner-bid-document.js +1 -1
  51. package/lib/role-assistant/test-runner-start-payload.js +96 -0
  52. package/lib/role-assistant/test-runner-workhub-answers.js +11 -7
  53. package/lib/role-assistant/test-runner-workhub-helpers.js +100 -0
  54. package/lib/role-assistant/test-runner-workhub-soft.js +86 -0
  55. package/lib/role-assistant/test-runner-workhub.js +68 -105
  56. package/lib/role-assistant/test-runner.js +5 -63
  57. package/lib/role-assistant/test-suite.js +33 -40
  58. package/lib/schema/external-datasource.schema.json +13 -4
  59. package/lib/utils/compose-generator.js +10 -1
  60. package/lib/utils/compose-traefik-extra-routes.js +107 -0
  61. package/lib/utils/docker-build.js +2 -2
  62. package/lib/utils/help-builder.js +2 -1
  63. package/lib/utils/promote-dev-docker-image.js +15 -10
  64. package/package.json +14 -16
  65. package/templates/README.md +12 -1
  66. package/templates/applications/dataplane/application.yaml +8 -1
  67. package/templates/applications/dataplane/env.template +1 -1
  68. package/templates/applications/miso-controller/application.yaml +2 -1
  69. package/templates/applications/miso-controller/rbac.yaml +1 -0
  70. package/templates/channels/microsoft-copilot/ai-plugin.template.json.hbs +6 -2
  71. package/templates/channels/microsoft-copilot/entra-sso-registration.template.md.hbs +8 -5
  72. package/templates/channels/microsoft-copilot/fi-fi.template.json.hbs +7 -0
  73. package/templates/channels/microsoft-copilot/install.template.md.hbs +74 -22
  74. package/templates/channels/microsoft-copilot/manifest.template.json.hbs +29 -14
  75. package/templates/channels/microsoft-copilot/oauth-plugin-vault-required.template.md.hbs +6 -2
  76. package/templates/python/docker-compose.hbs +36 -0
  77. package/templates/typescript/docker-compose.hbs +36 -0
  78. package/.cursor/plans/Archive/157.1-security-quality-violations-by-type.csv +0 -374
  79. package/.cursor/process/README.md +0 -9
  80. package/.cursor/rules/anchor-docs.mdc +0 -15
  81. package/.cursor/rules/assistant-driven-integration-build.mdc +0 -40
  82. package/.cursor/rules/cli-layout.mdc +0 -81
  83. package/.cursor/rules/cli-product-neutral.mdc +0 -43
  84. package/.cursor/rules/deploy-rules/docker-image-ip-policy.mdc +0 -49
  85. package/.cursor/rules/docs-rules.mdc +0 -32
  86. package/.cursor/rules/plan-rules/application-lifecycle.mdc +0 -30
  87. package/.cursor/rules/plan-rules/plan-frontmatter.mdc +0 -35
  88. package/.cursor/rules/plan-rules/plan-lifecycle.mdc +0 -31
  89. package/.cursor/rules/plan-rules/plan-validation-gate.mdc +0 -34
  90. package/.cursor/rules/project-rules.mdc +0 -913
  91. package/.cursor/skills/README.md +0 -15
  92. package/.dockerignore +0 -52
  93. package/.eslintignore +0 -22
  94. package/.markdownlint.json +0 -14
  95. package/anchor-docs/README.md +0 -10
  96. package/anchor-docs/_TEMPLATE +0 -24
  97. package/babel.config.js +0 -6
  98. package/bin/builder-api-cleanup.js +0 -26
  99. package/bin/builder-api-nest.js +0 -10
  100. package/bin/builder-api-spike.js +0 -19
  101. package/enterprise-knowledge/README.md +0 -50
  102. package/enterprise-knowledge/enterprise-integration-lifecycle/README.md +0 -22
  103. package/enterprise-knowledge/enterprise-integration-lifecycle/application.json +0 -15
  104. package/enterprise-knowledge/enterprise-integration-lifecycle/deploy.js +0 -69
  105. package/enterprise-knowledge/enterprise-integration-lifecycle/enterprise-integration-lifecycle-deploy.json +0 -52
  106. package/enterprise-knowledge/enterprise-integration-lifecycle/enterprise-integration-lifecycle-system.json +0 -29
  107. package/enterprise-knowledge/enterprise-integration-lifecycle/env.template +0 -2
  108. package/integration/README.md +0 -81
  109. package/integration/github/README.md +0 -53
  110. package/integration/github/application.json +0 -21
  111. package/integration/github/deploy.js +0 -72
  112. package/integration/github/env.template +0 -11
  113. package/integration/github/github-datasource-issue-comments.json +0 -239
  114. package/integration/github/github-datasource-issues.json +0 -399
  115. package/integration/github/github-datasource-repository.json +0 -354
  116. package/integration/github/github-deploy.json +0 -1202
  117. package/integration/github/github-system.json +0 -82
  118. package/integration/hubspot-test/README.md +0 -159
  119. package/integration/hubspot-test/application.json +0 -54
  120. package/integration/hubspot-test/companies.json +0 -2048
  121. package/integration/hubspot-test/create-hubspot.js +0 -523
  122. package/integration/hubspot-test/env.template +0 -4
  123. package/integration/hubspot-test/hubspot-test-datasource-company.json +0 -138
  124. package/integration/hubspot-test/hubspot-test-datasource-contact.json +0 -146
  125. package/integration/hubspot-test/hubspot-test-datasource-deal.json +0 -146
  126. package/integration/hubspot-test/hubspot-test-datasource-users.json +0 -76
  127. package/integration/hubspot-test/hubspot-test-deploy.json +0 -2160
  128. package/integration/hubspot-test/hubspot-test-system.json +0 -74
  129. package/integration/hubspot-test/rbac.json +0 -166
  130. package/integration/hubspot-test/test-artifacts/wizard-hubspot-credential-real.yaml +0 -20
  131. package/integration/hubspot-test/test-artifacts/wizard-hubspot-env-vars.yaml +0 -9
  132. package/integration/hubspot-test/test-artifacts/wizard-invalid-add-datasource.yaml +0 -5
  133. package/integration/hubspot-test/test-artifacts/wizard-invalid-app-name.yaml +0 -5
  134. package/integration/hubspot-test/test-artifacts/wizard-invalid-credential-create.yaml +0 -7
  135. package/integration/hubspot-test/test-artifacts/wizard-invalid-credential-select.yaml +0 -7
  136. package/integration/hubspot-test/test-artifacts/wizard-invalid-known-platform.yaml +0 -4
  137. package/integration/hubspot-test/test-artifacts/wizard-invalid-missing-app.yaml +0 -4
  138. package/integration/hubspot-test/test-artifacts/wizard-invalid-missing-source.yaml +0 -2
  139. package/integration/hubspot-test/test-artifacts/wizard-invalid-mode.yaml +0 -5
  140. package/integration/hubspot-test/test-artifacts/wizard-invalid-openapi-file.yaml +0 -5
  141. package/integration/hubspot-test/test-artifacts/wizard-invalid-openapi-url.yaml +0 -4
  142. package/integration/hubspot-test/test-artifacts/wizard-invalid-source.yaml +0 -4
  143. package/integration/hubspot-test/test-artifacts/wizard-valid-for-dimension-array-test.yaml +0 -5
  144. package/integration/hubspot-test/test-artifacts/wizard-valid-for-dimension-key-test.yaml +0 -5
  145. package/integration/hubspot-test/test-artifacts/wizard-valid-for-dimension-path-test.yaml +0 -5
  146. package/integration/hubspot-test/test-artifacts/wizard-valid-for-dimension-test.yaml +0 -5
  147. package/integration/hubspot-test/test-artifacts/wizard-valid-for-rbac-test.yaml +0 -5
  148. package/integration/hubspot-test/test-artifacts/wizard-valid-for-rbac-yaml-test.yaml +0 -5
  149. package/integration/hubspot-test/test-dataplane-down-helpers.js +0 -249
  150. package/integration/hubspot-test/test-dataplane-down-tests.js +0 -386
  151. package/integration/hubspot-test/test-dataplane-down.js +0 -209
  152. package/integration/hubspot-test/test.js +0 -1588
  153. package/integration/hubspot-test/wizard-hubspot-e2e.yaml +0 -16
  154. package/integration/hubspot-test/wizard-hubspot-platform.yaml +0 -8
  155. package/integration/hubspot-test/wizard-hubspot-test-headless.yaml +0 -23
  156. package/integration/roundtrip-test-local/README.md +0 -143
  157. package/integration/roundtrip-test-local/application.yaml +0 -13
  158. package/integration/roundtrip-test-local/env.template +0 -15
  159. package/integration/roundtrip-test-local/roundtrip-test-local-datasource-roundtrip-test-company.yaml +0 -14
  160. package/integration/roundtrip-test-local/roundtrip-test-local-deploy.json +0 -61
  161. package/integration/roundtrip-test-local/roundtrip-test-local-system.yaml +0 -25
  162. package/integration/roundtrip-test-local2/README.md +0 -143
  163. package/integration/roundtrip-test-local2/application.yaml +0 -13
  164. package/integration/roundtrip-test-local2/env.template +0 -15
  165. package/integration/roundtrip-test-local2/roundtrip-test-local2-datasource-company.yaml +0 -31
  166. package/integration/roundtrip-test-local2/roundtrip-test-local2-deploy.json +0 -86
  167. package/integration/roundtrip-test-local2/roundtrip-test-local2-system.yaml +0 -25
  168. package/integration/test/wizard.yaml +0 -8
  169. package/jest.config.coverage.js +0 -37
  170. package/jest.config.default.js +0 -11
  171. package/jest.config.integration.fixtures.js +0 -22
  172. package/jest.config.integration.js +0 -33
  173. package/jest.config.isolated.js +0 -11
  174. package/jest.config.manual.js +0 -30
  175. package/jest.global-live-fabrix-hooks.js +0 -36
  176. package/jest.isolated-projects.js +0 -283
  177. package/jest.projects.js +0 -79
  178. package/lib/integration-definition/openapi-enrichment/hubspot-crm-companies.json +0 -205
  179. package/packages/builder-api/README.md +0 -120
  180. package/packages/builder-api/package.json +0 -30
  181. package/packages/builder-api/src/app.module.ts +0 -7
  182. package/packages/builder-api/src/auth/auth.module.ts +0 -5
  183. package/packages/builder-api/src/external-system/external-system.module.ts +0 -5
  184. package/packages/builder-api/src/main.ts +0 -16
  185. package/packages/builder-api/tsconfig.json +0 -15
  186. package/scripts/check-builder-api-architecture-grep.js +0 -79
  187. package/scripts/check-datasource-test-run-schema-sync.js +0 -34
  188. package/scripts/ci-fix.sh +0 -19
  189. package/scripts/ci-simulate.sh +0 -19
  190. package/scripts/diagnose-cli.js +0 -150
  191. package/scripts/docker_image_content_gate.js +0 -47
  192. package/scripts/docker_image_content_gate.sh +0 -5
  193. package/scripts/export-builder-api-evidence.js +0 -262
  194. package/scripts/install-local.js +0 -490
  195. package/scripts/lib/builder-api-docker-staging-copy.js +0 -60
  196. package/scripts/lib/builder-api-docker-staging-core.js +0 -183
  197. package/scripts/lib/docker-image-content-gate-core.js +0 -166
  198. package/scripts/lib/plan-actor.js +0 -109
  199. package/scripts/lib/plan-config.js +0 -20
  200. package/scripts/lib/plan-gates.js +0 -154
  201. package/scripts/lib/plan-meta.js +0 -104
  202. package/scripts/lib/plan-parse.js +0 -162
  203. package/scripts/lib/plan-prevalidate-gates.js +0 -337
  204. package/scripts/lib/plan-run-core.js +0 -125
  205. package/scripts/lib/plan-run-report.js +0 -119
  206. package/scripts/plan-approve.js +0 -24
  207. package/scripts/plan-archive.js +0 -49
  208. package/scripts/plan-run.js +0 -13
  209. package/scripts/plan-set-actor.js +0 -21
  210. package/scripts/plan-validate.js +0 -80
  211. package/scripts/pnpm/af.mjs +0 -125
  212. package/scripts/pnpm/check-quiet.mjs +0 -32
  213. package/scripts/pnpm/dev-install.mjs +0 -29
  214. package/scripts/pnpm/dev-reload.mjs +0 -18
  215. package/scripts/pnpm/help.mjs +0 -55
  216. package/scripts/pnpm/lib/dev-reload-core.mjs +0 -189
  217. package/scripts/pnpm/lib/dev-reload-log-capture.mjs +0 -67
  218. package/scripts/pnpm/lib/dev-reload-log-utils.mjs +0 -32
  219. package/scripts/pnpm/lib/resolve-aifabrix-bin.mjs +0 -124
  220. package/scripts/pnpm/lib/resolve-app-url.mjs +0 -183
  221. package/scripts/pnpm/lib/spinner.mjs +0 -42
  222. package/scripts/pnpm-global-remove.js +0 -48
  223. package/scripts/stage_builder_api_for_docker.js +0 -65
  224. package/scripts/sync-builder-api-template.js +0 -44
  225. package/scripts/test-dataplane-bootstrap.js +0 -331
@@ -12,24 +12,67 @@ apply for the Runtime MCP delegated scope.
12
12
  dist/channels/microsoft-copilot/source/manifest.json
13
13
  dist/channels/microsoft-copilot/source/declarativeAgent.json
14
14
  dist/channels/microsoft-copilot/source/ai-plugin.json
15
+ dist/channels/microsoft-copilot/source/fi-fi.json
15
16
  dist/channels/microsoft-copilot/build/appPackage.{{environment}}.zip
16
17
  ```
17
18
 
18
- ## Install in Microsoft Teams
19
+ ## Three Microsoft records (do not confuse)
19
20
 
20
- 1. Open Microsoft Teams using your target Microsoft 365 account.
21
- 2. Select **Apps → Manage your apps**.
22
- 3. Select **Upload an app → Upload a custom app**.
23
- 4. Upload `appPackage.{{environment}}.zip`.
24
- 5. Review the requested permissions and select **Add**.
25
- 6. Open **{{appName}}** from your installed apps.
26
- 7. If prompted, complete **Entra / admin consent** for the Runtime MCP resource (not an AI Fabrix OAuth client login).
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 |
27
26
 
28
- Upload only the ZIP package. Do not upload individual manifest files or `channel-microsoft-copilot.json`.
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.
29
28
 
30
- If **Upload a custom app** is unavailable, a Teams administrator must enable custom app uploads for your account in the Teams admin center or deploy the package centrally.
29
+ Do **not** configure AI Fabrix OAuth client secrets under Connected Systems → Authentication for this Entra SSO flow.
31
30
 
32
- Do **not** configure AI Fabrix OAuth client secrets in Connected Systems → Authentication for this flow. Entra SSO uses the Teams OAuthPluginVault auth-config id.
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.
33
76
 
34
77
  ## Runtime connection contract
35
78
 
@@ -37,10 +80,11 @@ Do **not** configure AI Fabrix OAuth client secrets in Connected Systems → Aut
37
80
  - **Remote MCP URL:** `{{{mcpUrl}}}`
38
81
  - **Transport:** `{{runtimeTransport}}`
39
82
  - **Auth mode:** `{{runtimeAuthMode}}` (Entra SSO / trustedIssuer; controller exchanges the Microsoft user token)
40
- - **Plugin auth:** `OAuthPluginVault` · Teams auth-config reference id `{{oauthPluginVaultReferenceId}}`
83
+ - **Plugin auth:** `OAuthPluginVault` · Teams auth-config reference id `{{{oauthPluginVaultReferenceId}}}`
41
84
  {{#if entraIssuer}}- **Entra issuer (from Trust source):** `{{{entraIssuer}}}`{{/if}}
42
- - **Delegated scopes:** {{#each scopes}}`{{this}}` {{else}}*(missing — package not install-ready)*{{/each}}
43
- - **Install ready:** {{#if installReady}}yes{{else}}no{{#if discoveryBlocker}} ({{discoveryBlocker}}){{/if}}{{/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}}
44
88
  - **Governed tools expected:**
45
89
  {{#each layerBToolNames}}
46
90
  - `{{this}}`
@@ -52,6 +96,7 @@ Do **not** configure AI Fabrix OAuth client secrets in Connected Systems → Aut
52
96
 
53
97
  - README / install guide: `INSTALL.md`
54
98
  - Package ZIP: `build/appPackage.{{environment}}.zip`
99
+
55
100
  ## Assistant catalog
56
101
 
57
102
  Runtime lists the assistants available to the signed-in user from:
@@ -60,14 +105,21 @@ Runtime lists the assistants available to the signed-in user from:
60
105
 
61
106
  ## Probe truthfulness
62
107
 
63
- - `builderValidated` means package files, ZIP structure, hashes, and secret checks passed.
64
- - `runtimeValidated` means Runtime MCP is reachable and its tool boundary checks passed.
65
- - `requiresMicrosoftAdmin` means Microsoft-side installation or approval remains incomplete. A user may install the package directly when their Teams custom-app policy permits it; otherwise, Teams administrator action is required.
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.
66
111
 
67
- ## Validate after Teams installation
112
+ `--force` regenerates the package artifacts. microsoft-copilot does not create Fabrix oauth2 channel credentials for Entra SSO.
68
113
 
69
- ```bash
70
- aifabrix channel add {{channelTarget}} --name "{{baseName}}" --oauth-plugin-vault-reference-id "{{oauthPluginVaultReferenceId}}" --probe
71
- ```
114
+ ## Delete / remove from the organisation
72
115
 
73
- `--force` regenerates the package artifacts. microsoft-copilot does not create Fabrix oauth2 channel credentials for Entra SSO.
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.
124
+
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.
@@ -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
7
  "short": "{{shortName}}",
8
8
  "full": "{{fullName}}"
9
9
  },
10
- "description": {
11
- "short": "{{shortDescription}}",
12
- "full": "{{fullDescription}}"
13
- },
14
10
  "developer": {
15
11
  "name": "AI Fabrix",
16
12
  "websiteUrl": "{{{dataplaneBaseUrl}}}",
17
13
  "privacyUrl": "{{{dataplaneBaseUrl}}}/privacy",
18
14
  "termsOfUseUrl": "{{{dataplaneBaseUrl}}}/terms"
19
15
  },
16
+ "description": {
17
+ "short": "{{shortDescription}}",
18
+ "full": "{{fullDescription}}"
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
  }
@@ -1,6 +1,8 @@
1
- microsoft-copilot packaging requires `--oauth-plugin-vault-reference-id` with the Teams Entra SSO auth-config id.
1
+ microsoft-copilot packaging requires `--oauth-plugin-vault-reference-id` with the Teams Entra SSO **registration / auth-config ID**.
2
2
 
3
- Register Entra SSO in the Teams Developer Portal **before** packaging (no ZIP needed first), paste the values below, Save, then re-run with the registration id.
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.
4
6
 
5
7
  {{> entraSsoRegistration}}
6
8
 
@@ -9,3 +11,5 @@ Then:
9
11
  ```bash
10
12
  aifabrix channel add microsoft-copilot --name "{{baseName}}" --oauth-plugin-vault-reference-id "<Teams-Entra-SSO-registration-id>"
11
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.
@@ -39,6 +39,42 @@ services:
39
39
  - "traefik.http.routers.{{app.key}}.middlewares={{app.key}}-stripprefix"
40
40
  {{/if}}
41
41
  {{/unless}}
42
+ {{#each traefik.passThroughRouters}}
43
+ {{#if ../traefik.tls}}
44
+ - "traefik.http.routers.{{../app.key}}-pass-{{this.id}}.rule=Host(`{{../traefik.host}}`) && PathPrefix(`{{this.pathPrefix}}`)"
45
+ - "traefik.http.routers.{{../app.key}}-pass-{{this.id}}.entrypoints=websecure"
46
+ - "traefik.http.routers.{{../app.key}}-pass-{{this.id}}.tls=true"
47
+ - "traefik.http.routers.{{../app.key}}-pass-{{this.id}}.service={{../app.key}}"
48
+ - "traefik.http.routers.{{../app.key}}-pass-{{this.id}}.priority=200"
49
+ {{#if ../traefik.certStore}}
50
+ - "traefik.http.routers.{{../app.key}}-pass-{{this.id}}.tls.certstore={{../traefik.certStore}}"
51
+ {{/if}}
52
+ - "traefik.http.routers.{{../app.key}}-pass-{{this.id}}-http.rule=Host(`{{../traefik.host}}`) && PathPrefix(`{{this.pathPrefix}}`)"
53
+ - "traefik.http.routers.{{../app.key}}-pass-{{this.id}}-http.entrypoints=web"
54
+ - "traefik.http.routers.{{../app.key}}-pass-{{this.id}}-http.service={{../app.key}}"
55
+ - "traefik.http.routers.{{../app.key}}-pass-{{this.id}}-http.priority=200"
56
+ {{else}}
57
+ - "traefik.http.routers.{{../app.key}}-pass-{{this.id}}.rule=Host(`{{../traefik.host}}`) && PathPrefix(`{{this.pathPrefix}}`)"
58
+ - "traefik.http.routers.{{../app.key}}-pass-{{this.id}}.entrypoints=web"
59
+ - "traefik.http.routers.{{../app.key}}-pass-{{this.id}}.service={{../app.key}}"
60
+ - "traefik.http.routers.{{../app.key}}-pass-{{this.id}}.priority=200"
61
+ {{/if}}
62
+ {{/each}}
63
+ {{#unless (eq traefik.path "/")}}
64
+ {{#each traefik.aliasRouters}}
65
+ - "traefik.http.middlewares.{{../app.key}}-alias-{{this.id}}-rw.replacepathregex.regex=^{{this.rewriteSource}}(/.*)?$"
66
+ - "traefik.http.middlewares.{{../app.key}}-alias-{{this.id}}-rw.replacepathregex.replacement={{this.rewriteDest}}$1"
67
+ {{#if this.stripPrimary}}
68
+ - "traefik.http.routers.{{../app.key}}-alias-{{this.id}}.middlewares={{../app.key}}-alias-{{this.id}}-rw,{{../app.key}}-stripprefix"
69
+ {{else}}
70
+ - "traefik.http.routers.{{../app.key}}-alias-{{this.id}}.middlewares={{../app.key}}-alias-{{this.id}}-rw"
71
+ {{/if}}
72
+ - "traefik.http.routers.{{../app.key}}-alias-{{this.id}}.rule=Host(`{{../traefik.host}}`) && PathPrefix(`{{this.pathPrefix}}`)"
73
+ - "traefik.http.routers.{{../app.key}}-alias-{{this.id}}.entrypoints=web"
74
+ - "traefik.http.routers.{{../app.key}}-alias-{{this.id}}.service={{../app.key}}"
75
+ - "traefik.http.routers.{{../app.key}}-alias-{{this.id}}.priority=200"
76
+ {{/each}}
77
+ {{/unless}}
42
78
  {{/if}}
43
79
  environment:
44
80
  - MISO_ENVIRONMENT={{misoEnvironment}}
@@ -39,6 +39,42 @@ services:
39
39
  - "traefik.http.routers.{{app.key}}.middlewares={{app.key}}-stripprefix"
40
40
  {{/if}}
41
41
  {{/unless}}
42
+ {{#each traefik.passThroughRouters}}
43
+ {{#if ../traefik.tls}}
44
+ - "traefik.http.routers.{{../app.key}}-pass-{{this.id}}.rule=Host(`{{../traefik.host}}`) && PathPrefix(`{{this.pathPrefix}}`)"
45
+ - "traefik.http.routers.{{../app.key}}-pass-{{this.id}}.entrypoints=websecure"
46
+ - "traefik.http.routers.{{../app.key}}-pass-{{this.id}}.tls=true"
47
+ - "traefik.http.routers.{{../app.key}}-pass-{{this.id}}.service={{../app.key}}"
48
+ - "traefik.http.routers.{{../app.key}}-pass-{{this.id}}.priority=200"
49
+ {{#if ../traefik.certStore}}
50
+ - "traefik.http.routers.{{../app.key}}-pass-{{this.id}}.tls.certstore={{../traefik.certStore}}"
51
+ {{/if}}
52
+ - "traefik.http.routers.{{../app.key}}-pass-{{this.id}}-http.rule=Host(`{{../traefik.host}}`) && PathPrefix(`{{this.pathPrefix}}`)"
53
+ - "traefik.http.routers.{{../app.key}}-pass-{{this.id}}-http.entrypoints=web"
54
+ - "traefik.http.routers.{{../app.key}}-pass-{{this.id}}-http.service={{../app.key}}"
55
+ - "traefik.http.routers.{{../app.key}}-pass-{{this.id}}-http.priority=200"
56
+ {{else}}
57
+ - "traefik.http.routers.{{../app.key}}-pass-{{this.id}}.rule=Host(`{{../traefik.host}}`) && PathPrefix(`{{this.pathPrefix}}`)"
58
+ - "traefik.http.routers.{{../app.key}}-pass-{{this.id}}.entrypoints=web"
59
+ - "traefik.http.routers.{{../app.key}}-pass-{{this.id}}.service={{../app.key}}"
60
+ - "traefik.http.routers.{{../app.key}}-pass-{{this.id}}.priority=200"
61
+ {{/if}}
62
+ {{/each}}
63
+ {{#unless (eq traefik.path "/")}}
64
+ {{#each traefik.aliasRouters}}
65
+ - "traefik.http.middlewares.{{../app.key}}-alias-{{this.id}}-rw.replacepathregex.regex=^{{this.rewriteSource}}(/.*)?$"
66
+ - "traefik.http.middlewares.{{../app.key}}-alias-{{this.id}}-rw.replacepathregex.replacement={{this.rewriteDest}}$1"
67
+ {{#if this.stripPrimary}}
68
+ - "traefik.http.routers.{{../app.key}}-alias-{{this.id}}.middlewares={{../app.key}}-alias-{{this.id}}-rw,{{../app.key}}-stripprefix"
69
+ {{else}}
70
+ - "traefik.http.routers.{{../app.key}}-alias-{{this.id}}.middlewares={{../app.key}}-alias-{{this.id}}-rw"
71
+ {{/if}}
72
+ - "traefik.http.routers.{{../app.key}}-alias-{{this.id}}.rule=Host(`{{../traefik.host}}`) && PathPrefix(`{{this.pathPrefix}}`)"
73
+ - "traefik.http.routers.{{../app.key}}-alias-{{this.id}}.entrypoints=web"
74
+ - "traefik.http.routers.{{../app.key}}-alias-{{this.id}}.service={{../app.key}}"
75
+ - "traefik.http.routers.{{../app.key}}-alias-{{this.id}}.priority=200"
76
+ {{/each}}
77
+ {{/unless}}
42
78
  {{/if}}
43
79
  environment:
44
80
  - MISO_ENVIRONMENT={{misoEnvironment}}