@aifabrix/builder 2.52.0 → 2.52.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 (134) hide show
  1. package/jest.isolated-projects.js +25 -2
  2. package/jest.projects.js +4 -1
  3. package/lib/api/datasources-extended.api.js +8 -8
  4. package/lib/api/keycloak.api.js +92 -0
  5. package/lib/api/token-providers.api.js +77 -0
  6. package/lib/api/types/keycloak.types.js +23 -0
  7. package/lib/api/types/token-providers.types.js +65 -0
  8. package/lib/app/down.js +16 -1
  9. package/lib/channels/add-channel.js +126 -19
  10. package/lib/channels/approval-guides/chatgpt.js +1 -1
  11. package/lib/channels/approval-guides/microsoft-copilot.js +16 -12
  12. package/lib/channels/channel-add-ensure.js +128 -0
  13. package/lib/channels/channel-artifact-generator.js +11 -1
  14. package/lib/channels/channel-branding.js +94 -0
  15. package/lib/channels/channel-credential.js +8 -0
  16. package/lib/channels/channel-discovery.js +330 -0
  17. package/lib/channels/channel-external-system.js +1 -1
  18. package/lib/channels/channel-runtime-resolver.js +103 -14
  19. package/lib/channels/channel-status-display.js +7 -1
  20. package/lib/channels/microsoft-copilot-channel-add.js +138 -0
  21. package/lib/channels/microsoft-copilot-entra-sso-form.js +180 -0
  22. package/lib/channels/microsoft-copilot-entra-sso.js +264 -0
  23. package/lib/channels/microsoft-copilot-icons.js +74 -0
  24. package/lib/channels/microsoft-copilot-limits.js +84 -0
  25. package/lib/channels/microsoft-copilot-package.js +130 -49
  26. package/lib/channels/microsoft-copilot-validate.js +197 -0
  27. package/lib/cli/index.js +2 -0
  28. package/lib/cli/infra-guided.js +13 -6
  29. package/lib/cli/setup-infra.js +31 -4
  30. package/lib/commands/channel-add-setup.js +28 -9
  31. package/lib/commands/channel.js +14 -10
  32. package/lib/commands/integration-definition.js +158 -0
  33. package/lib/commands/repair-auth-apply.js +19 -5
  34. package/lib/commands/repair-datasource-sync-operations.js +4 -1
  35. package/lib/commands/role-assistant-test-output.js +200 -0
  36. package/lib/commands/role-assistant.js +125 -166
  37. package/lib/datasource/capability/capability-resolve.js +15 -5
  38. package/lib/datasource/capability/copy-operations.js +14 -4
  39. package/lib/infrastructure/index.js +19 -4
  40. package/lib/integration-definition/apply.js +478 -0
  41. package/lib/integration-definition/canonical-json.js +51 -0
  42. package/lib/integration-definition/emit-suite-bid.js +94 -0
  43. package/lib/integration-definition/enrich-crm-field-mappings.js +240 -0
  44. package/lib/integration-definition/enrich-openapi-operations.js +434 -0
  45. package/lib/integration-definition/from-discovery.js +339 -0
  46. package/lib/integration-definition/hash.js +37 -0
  47. package/lib/integration-definition/index.js +37 -0
  48. package/lib/integration-definition/openapi-enrichment/hubspot-crm-companies.json +205 -0
  49. package/lib/integration-definition/resource-type-catalog.js +59 -0
  50. package/lib/integration-definition/system-kind-enum.js +40 -0
  51. package/lib/integration-definition/validate.js +148 -0
  52. package/lib/programmatic/builder-api-request.js +5 -1
  53. package/lib/programmatic/builder-help-governance.js +3 -2
  54. package/lib/programmatic/capability-registry.js +19 -0
  55. package/lib/programmatic/openapi-component-schemas.js +6 -1
  56. package/lib/programmatic/openapi-descriptions.js +40 -0
  57. package/lib/programmatic/openapi-envelope-examples.js +269 -0
  58. package/lib/programmatic/openapi-operation-bindings.js +45 -0
  59. package/lib/programmatic/openapi-request-schemas.js +14 -0
  60. package/lib/programmatic/openapi-result-schemas-overflow.js +101 -0
  61. package/lib/programmatic/openapi-result-schemas.js +46 -99
  62. package/lib/programmatic/openapi-schema-descriptions-core.js +7 -4
  63. package/lib/programmatic/openapi-schema-descriptions-help.js +1 -1
  64. package/lib/programmatic/openapi-schema-descriptions-operations.js +24 -0
  65. package/lib/programmatic/openapi-schema-helpers.js +9 -9
  66. package/lib/programmatic/openapi-spec.js +11 -1
  67. package/lib/programmatic/orchestration-openapi-meta.js +10 -0
  68. package/lib/programmatic/route-handler-map.js +29 -1
  69. package/lib/programmatic/run-channel-package.js +236 -0
  70. package/lib/programmatic/run-integration-definition.js +69 -0
  71. package/lib/role-assistant/knowledge-sync-logging.js +58 -0
  72. package/lib/role-assistant/knowledge-sync.js +88 -93
  73. package/lib/role-assistant/test-cases-bid.js +155 -0
  74. package/lib/role-assistant/test-cases-evaluate.js +9 -1
  75. package/lib/role-assistant/test-cases-honesty.js +24 -10
  76. package/lib/role-assistant/test-cases.js +28 -0
  77. package/lib/role-assistant/test-runner-bid-apply.js +122 -0
  78. package/lib/role-assistant/test-runner-bid-document.js +278 -0
  79. package/lib/role-assistant/test-runner-workhub-answers.js +245 -20
  80. package/lib/role-assistant/test-runner-workhub.js +100 -18
  81. package/lib/role-assistant/test-suite.js +119 -0
  82. package/lib/schema/application-schema.json +56 -6
  83. package/lib/schema/external-datasource.schema.json +103 -17
  84. package/lib/schema/external-system.schema.json +54 -3
  85. package/lib/schema/integration-definition.schema.json +195 -0
  86. package/lib/utils/authentication-shape.js +6 -0
  87. package/lib/utils/docker-build.js +3 -3
  88. package/lib/utils/help-builder.js +1 -0
  89. package/lib/utils/promote-dev-docker-image.js +97 -18
  90. package/lib/utils/transient-developer-id.js +28 -0
  91. package/package.json +1 -1
  92. package/scripts/pnpm/af.mjs +24 -9
  93. package/scripts/pnpm/help.mjs +1 -1
  94. package/templates/applications/dataplane/application.yaml +3 -2
  95. package/templates/applications/dataplane/env.template +7 -6
  96. package/templates/applications/miso-controller/application.yaml +23 -9
  97. package/templates/applications/miso-controller/env.template +8 -2
  98. package/templates/channels/README.md +11 -1
  99. package/templates/channels/brand/color-192.png +0 -0
  100. package/templates/channels/brand/dark/128.png +0 -0
  101. package/templates/channels/brand/dark/192.png +0 -0
  102. package/templates/channels/brand/dark/256.png +0 -0
  103. package/templates/channels/brand/dark/32.png +0 -0
  104. package/templates/channels/brand/dark/512.png +0 -0
  105. package/templates/channels/brand/dark/64.png +0 -0
  106. package/templates/channels/brand/light/128.png +0 -0
  107. package/templates/channels/brand/light/192.png +0 -0
  108. package/templates/channels/brand/light/256.png +0 -0
  109. package/templates/channels/brand/light/32.png +0 -0
  110. package/templates/channels/brand/light/512.png +0 -0
  111. package/templates/channels/brand/light/64.png +0 -0
  112. package/templates/channels/brand/mono-white/128.png +0 -0
  113. package/templates/channels/brand/mono-white/192.png +0 -0
  114. package/templates/channels/brand/mono-white/256.png +0 -0
  115. package/templates/channels/brand/mono-white/32.png +0 -0
  116. package/templates/channels/brand/mono-white/512.png +0 -0
  117. package/templates/channels/brand/mono-white/64.png +0 -0
  118. package/templates/channels/brand/outline-32.png +0 -0
  119. package/templates/channels/chatgpt/install.template.md.hbs +6 -4
  120. package/templates/channels/chatgpt/integration/README.md +4 -5
  121. package/templates/channels/chatgpt/integration/chatgpt-system.json +1 -16
  122. package/templates/channels/microsoft-copilot/ai-plugin.template.json.hbs +10 -16
  123. package/templates/channels/microsoft-copilot/declarative-agent.template.json.hbs +5 -3
  124. package/templates/channels/microsoft-copilot/entra-sso-registration.template.md.hbs +27 -0
  125. package/templates/channels/microsoft-copilot/install.template.md.hbs +39 -20
  126. package/templates/channels/microsoft-copilot/integration/README.md +2 -3
  127. package/templates/channels/microsoft-copilot/integration/microsoft-copilot-system.json +1 -22
  128. package/templates/channels/microsoft-copilot/manifest.template.json.hbs +7 -7
  129. package/templates/channels/microsoft-copilot/oauth-plugin-vault-required.template.md.hbs +11 -0
  130. package/templates/channels/slack/integration/README.md +2 -4
  131. package/templates/channels/teams-bot/install.template.md.hbs +4 -0
  132. package/templates/channels/teams-bot/integration/README.md +3 -5
  133. package/templates/channels/web-embed/integration/web-embed-system.json +1 -16
  134. /package/.cursor/plans/{Done → Archive}/157.1-security-quality-violations-by-type.csv +0 -0
@@ -4,8 +4,7 @@ app:
4
4
  displayName: 'Miso Controller'
5
5
  description: 'Miso is the AI Fabrix in-tenant controller and portal layer for securely operating enterprise AI apps inside a customer’s Azure tenant. It provides Entra ID SSO, RBAC, audit logs, environment/app configuration via schemas, and safe secret handling via Key Vault references—ensuring governance, traceability, and predictable UX across portal, SDK, and CLI.'
6
6
  type: webapp
7
- version: '2.0.20'
8
-
7
+ version: '2.0.29'
9
8
  # Image Configuration
10
9
  # Set tag to match your build (e.g. aifabrix build miso-controller -t 1.0.0 then tag: 1.0.0)
11
10
  # Registry is required so the controller can pull the image (avoids "docker: not found" on the controller host).
@@ -81,7 +80,7 @@ configuration:
81
80
  # Operations & Debugging
82
81
  # -------------------------------------------------------------------------
83
82
  - name: LOG_LEVEL
84
- category: General
83
+ category: Operations & Debugging
85
84
  portalInput:
86
85
  field: select
87
86
  label: 'Log Level'
@@ -92,7 +91,7 @@ configuration:
92
91
  - error
93
92
 
94
93
  - name: ENABLE_API_DOCS
95
- category: General
94
+ category: Operations & Debugging
96
95
  portalInput:
97
96
  field: select
98
97
  label: 'Enable API Documentation (Swagger/ReDoc)'
@@ -101,7 +100,7 @@ configuration:
101
100
  - 'false'
102
101
 
103
102
  - name: FAST_STARTUP
104
- category: General
103
+ category: Operations & Debugging
105
104
  portalInput:
106
105
  field: select
107
106
  label: 'Fast Startup (skip non-critical init)'
@@ -110,7 +109,7 @@ configuration:
110
109
  - 'false'
111
110
 
112
111
  - name: LOG_TO_FILE
113
- category: General
112
+ category: Operations & Debugging
114
113
  portalInput:
115
114
  field: select
116
115
  label: 'Log to File'
@@ -122,7 +121,7 @@ configuration:
122
121
  # Keycloak Events (feature flag)
123
122
  # -------------------------------------------------------------------------
124
123
  - name: KEYCLOAK_EVENTS_ENABLED
125
- category: General
124
+ category: Keycloak Events
126
125
  portalInput:
127
126
  field: select
128
127
  label: 'Keycloak Events (sync users/groups)'
@@ -130,18 +129,33 @@ configuration:
130
129
  - 'true'
131
130
  - 'false'
132
131
 
132
+ # -------------------------------------------------------------------------
133
+ # Identity — local user password / invitation
134
+ # -------------------------------------------------------------------------
135
+ - name: IDENTITY_LOCAL_PASSWORD_MODE
136
+ category: Identity
137
+ portalInput:
138
+ field: select
139
+ label: 'Password setup for new local users'
140
+ placeholder: 'Choose how new users set their password'
141
+ options:
142
+ - label: 'Send invitation email (user sets their own password)'
143
+ value: email
144
+ - label: 'Show a one-time temporary password to the admin'
145
+ value: admin-reveal
146
+
133
147
  # -------------------------------------------------------------------------
134
148
  # Rate Limiting (tune for environment)
135
149
  # -------------------------------------------------------------------------
136
150
  - name: RATE_LIMIT_WINDOW_MS
137
- category: General
151
+ category: Rate Limiting
138
152
  portalInput:
139
153
  field: text
140
154
  label: 'Rate Limit Window (milliseconds)'
141
155
  placeholder: '900000'
142
156
 
143
157
  - name: RATE_LIMIT_MAX
144
- category: General
158
+ category: Rate Limiting
145
159
  portalInput:
146
160
  field: text
147
161
  label: 'Rate Limit Max Requests per Window'
@@ -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
  # =============================================================================
@@ -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,22 @@
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.",
7
+ "namespace": "{{pluginNamespace}}",
8
+ "privacy_policy_url": "{{{dataplaneBaseUrl}}}/privacy",
9
+ "legal_info_url": "{{{dataplaneBaseUrl}}}/terms",
8
10
  "runtimes": [
9
11
  {
10
12
  "type": "RemoteMCPServer",
11
13
  "spec": {
12
- "url": "{{mcpUrl}}"
14
+ "url": "{{{mcpUrl}}}"
13
15
  },
14
16
  "auth": {
15
- "type": "oauth",
16
- "scopes": {{{scopesJson}}}
17
+ "type": "OAuthPluginVault",
18
+ "reference_id": "{{oauthPluginVaultReferenceId}}"
17
19
  }
18
20
  }
19
- ],
20
- "mcp_tool_description": {
21
- "mode": "dynamic",
22
- "layerBToolNames": [
23
- {{#each layerBToolNames}}
24
- "{{this}}"{{#unless @last}},{{/unless}}
25
- {{/each}}
26
- ]
27
- }
21
+ ]
28
22
  }
@@ -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,27 @@
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
+ ### Values to paste into the form
10
+
11
+ | Field | Value |
12
+ | --- | --- |
13
+ | Registration name | `{{appName}}` |
14
+ | Base URL | {{#if entraSsoBaseUrl}}`{{{entraSsoBaseUrl}}}`{{else}}*(missing — dataplane URL not resolved)*{{/if}} |
15
+ | Restrict usage by organization | My organization only (DEV) |
16
+ | Restrict usage by Teams app | Any Teams app (until the Teams app id is stable) |
17
+ | 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}} |
18
+ | Scope | {{#if entraSsoScope}}`{{entraSsoScope}}`{{else}}*(missing — set Runtime MCP delegated scopes on Trust source `microsoft-entra-id` `allowedScopes`; not openid/profile alone)*{{/if}} |
19
+
20
+ ### Related (for your records)
21
+
22
+ {{#if mcpUrl}}- **Remote MCP URL (package):** `{{{mcpUrl}}}`{{/if}}
23
+ {{#if entraIssuer}}- **Entra issuer (Trust source):** `{{{entraIssuer}}}`{{/if}}
24
+ {{#if entraTenantId}}- **Tenant id:** `{{entraTenantId}}`{{/if}}
25
+ {{#if entraEnterpriseAppId}}- **Enterprise app id (Keycloak):** `{{entraEnterpriseAppId}}`{{/if}}
26
+
27
+ After Save, copy the **Microsoft Entra SSO registration ID** (auth config id). That value is `--oauth-plugin-vault-reference-id`.
@@ -2,9 +2,11 @@
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
@@ -13,42 +15,59 @@ dist/channels/microsoft-copilot/source/ai-plugin.json
13
15
  dist/channels/microsoft-copilot/build/appPackage.{{environment}}.zip
14
16
  ```
15
17
 
16
- ## Microsoft admin workflow (manual)
18
+ ## Install in Microsoft Teams
17
19
 
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.
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).
27
+
28
+ Upload only the ZIP package. Do not upload individual manifest files or `channel-microsoft-copilot.json`.
29
+
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.
31
+
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.
24
33
 
25
34
  ## Runtime connection contract
26
35
 
27
36
  - **Runtime system key:** `{{runtimeSystemKey}}`
28
- - **Remote MCP URL:** `{{mcpUrl}}`
37
+ - **Remote MCP URL:** `{{{mcpUrl}}}`
29
38
  - **Transport:** `{{runtimeTransport}}`
30
- - **Auth mode:** `{{runtimeAuthMode}}`
31
- - **Layer B tools expected:**
39
+ - **Auth mode:** `{{runtimeAuthMode}}` (Entra SSO / trustedIssuer; controller exchanges the Microsoft user token)
40
+ - **Plugin auth:** `OAuthPluginVault` · Teams auth-config reference id `{{oauthPluginVaultReferenceId}}`
41
+ {{#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}}
44
+ - **Governed tools expected:**
32
45
  {{#each layerBToolNames}}
33
46
  - `{{this}}`
34
47
  {{/each}}
35
48
 
49
+ {{> entraSsoRegistration}}
50
+
51
+ ## Package links
52
+
53
+ - README / install guide: `INSTALL.md`
54
+ - Package ZIP: `build/appPackage.{{environment}}.zip`
36
55
  ## Assistant catalog
37
56
 
38
- Runtime lists **assistants** available to each user from:
57
+ Runtime lists the assistants available to the signed-in user from:
39
58
 
40
- {{assistantCatalogUrl}}
59
+ {{{assistantCatalogUrl}}}
41
60
 
42
61
  ## Probe truthfulness
43
62
 
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.
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.
47
66
 
48
- ## Validate after admin setup
67
+ ## Validate after Teams installation
49
68
 
50
69
  ```bash
51
- aifabrix channel add {{channelTarget}} --name "{{baseName}}" --probe
70
+ aifabrix channel add {{channelTarget}} --name "{{baseName}}" --oauth-plugin-vault-reference-id "{{oauthPluginVaultReferenceId}}" --probe
52
71
  ```
53
72
 
54
- `--force` regenerates artifacts but does not rotate credentials.
73
+ `--force` regenerates the package artifacts. microsoft-copilot does not create Fabrix oauth2 channel credentials for Entra SSO.
@@ -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": [],
@@ -4,18 +4,18 @@
4
4
  "version": "{{packageVersion}}",
5
5
  "id": "{{packageAppId}}",
6
6
  "name": {
7
- "short": "{{baseName}}",
8
- "full": "{{appName}}"
7
+ "short": "{{shortName}}",
8
+ "full": "{{fullName}}"
9
9
  },
10
10
  "description": {
11
- "short": "{{appDescription}}",
12
- "full": "{{appDescription}}"
11
+ "short": "{{shortDescription}}",
12
+ "full": "{{fullDescription}}"
13
13
  },
14
14
  "developer": {
15
15
  "name": "AI Fabrix",
16
- "websiteUrl": "{{dataplaneBaseUrl}}",
17
- "privacyUrl": "{{dataplaneBaseUrl}}/privacy",
18
- "termsOfUseUrl": "{{dataplaneBaseUrl}}/terms"
16
+ "websiteUrl": "{{{dataplaneBaseUrl}}}",
17
+ "privacyUrl": "{{{dataplaneBaseUrl}}}/privacy",
18
+ "termsOfUseUrl": "{{{dataplaneBaseUrl}}}/terms"
19
19
  },
20
20
  "icons": {
21
21
  "color": "color.png",
@@ -0,0 +1,11 @@
1
+ microsoft-copilot packaging requires `--oauth-plugin-vault-reference-id` with the Teams Entra SSO auth-config id.
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.
4
+
5
+ {{> entraSsoRegistration}}
6
+
7
+ Then:
8
+
9
+ ```bash
10
+ aifabrix channel add microsoft-copilot --name "{{baseName}}" --oauth-plugin-vault-reference-id "<Teams-Entra-SSO-registration-id>"
11
+ ```
@@ -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.
@@ -6,22 +6,7 @@
6
6
  "systemKind": "communication",
7
7
  "enabled": true,
8
8
  "authentication": {
9
- "authType": "credential",
10
- "credential": {
11
- "credentialKey": "web-embed-channel",
12
- "displayName": "Web embed assistant channel",
13
- "method": "apikey",
14
- "writeOnce": true,
15
- "variables": {
16
- "baseUrl": "https://embed.aifabrix.dev"
17
- },
18
- "security": {
19
- "apiKey": "kv://web-embed/apiKey"
20
- },
21
- "formFields": [
22
- { "name": "apiKey", "required": true }
23
- ]
24
- }
9
+ "authType": "system"
25
10
  },
26
11
  "configuration": [],
27
12
  "dataSources": [],