@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.
- package/jest.isolated-projects.js +25 -2
- package/jest.projects.js +4 -1
- package/lib/api/datasources-extended.api.js +8 -8
- package/lib/api/keycloak.api.js +92 -0
- package/lib/api/token-providers.api.js +77 -0
- package/lib/api/types/keycloak.types.js +23 -0
- package/lib/api/types/token-providers.types.js +65 -0
- package/lib/app/down.js +16 -1
- package/lib/channels/add-channel.js +126 -19
- package/lib/channels/approval-guides/chatgpt.js +1 -1
- package/lib/channels/approval-guides/microsoft-copilot.js +16 -12
- package/lib/channels/channel-add-ensure.js +128 -0
- package/lib/channels/channel-artifact-generator.js +11 -1
- package/lib/channels/channel-branding.js +94 -0
- package/lib/channels/channel-credential.js +8 -0
- package/lib/channels/channel-discovery.js +330 -0
- package/lib/channels/channel-external-system.js +1 -1
- package/lib/channels/channel-runtime-resolver.js +103 -14
- package/lib/channels/channel-status-display.js +7 -1
- package/lib/channels/microsoft-copilot-channel-add.js +138 -0
- package/lib/channels/microsoft-copilot-entra-sso-form.js +180 -0
- package/lib/channels/microsoft-copilot-entra-sso.js +264 -0
- package/lib/channels/microsoft-copilot-icons.js +74 -0
- package/lib/channels/microsoft-copilot-limits.js +84 -0
- package/lib/channels/microsoft-copilot-package.js +130 -49
- package/lib/channels/microsoft-copilot-validate.js +197 -0
- package/lib/cli/index.js +2 -0
- package/lib/cli/infra-guided.js +13 -6
- package/lib/cli/setup-infra.js +31 -4
- package/lib/commands/channel-add-setup.js +28 -9
- package/lib/commands/channel.js +14 -10
- package/lib/commands/integration-definition.js +158 -0
- package/lib/commands/repair-auth-apply.js +19 -5
- package/lib/commands/repair-datasource-sync-operations.js +4 -1
- package/lib/commands/role-assistant-test-output.js +200 -0
- package/lib/commands/role-assistant.js +125 -166
- package/lib/datasource/capability/capability-resolve.js +15 -5
- package/lib/datasource/capability/copy-operations.js +14 -4
- package/lib/infrastructure/index.js +19 -4
- package/lib/integration-definition/apply.js +478 -0
- package/lib/integration-definition/canonical-json.js +51 -0
- package/lib/integration-definition/emit-suite-bid.js +94 -0
- package/lib/integration-definition/enrich-crm-field-mappings.js +240 -0
- package/lib/integration-definition/enrich-openapi-operations.js +434 -0
- package/lib/integration-definition/from-discovery.js +339 -0
- package/lib/integration-definition/hash.js +37 -0
- package/lib/integration-definition/index.js +37 -0
- package/lib/integration-definition/openapi-enrichment/hubspot-crm-companies.json +205 -0
- package/lib/integration-definition/resource-type-catalog.js +59 -0
- package/lib/integration-definition/system-kind-enum.js +40 -0
- package/lib/integration-definition/validate.js +148 -0
- package/lib/programmatic/builder-api-request.js +5 -1
- package/lib/programmatic/builder-help-governance.js +3 -2
- package/lib/programmatic/capability-registry.js +19 -0
- package/lib/programmatic/openapi-component-schemas.js +6 -1
- package/lib/programmatic/openapi-descriptions.js +40 -0
- package/lib/programmatic/openapi-envelope-examples.js +269 -0
- package/lib/programmatic/openapi-operation-bindings.js +45 -0
- package/lib/programmatic/openapi-request-schemas.js +14 -0
- package/lib/programmatic/openapi-result-schemas-overflow.js +101 -0
- package/lib/programmatic/openapi-result-schemas.js +46 -99
- package/lib/programmatic/openapi-schema-descriptions-core.js +7 -4
- package/lib/programmatic/openapi-schema-descriptions-help.js +1 -1
- package/lib/programmatic/openapi-schema-descriptions-operations.js +24 -0
- package/lib/programmatic/openapi-schema-helpers.js +9 -9
- package/lib/programmatic/openapi-spec.js +11 -1
- package/lib/programmatic/orchestration-openapi-meta.js +10 -0
- package/lib/programmatic/route-handler-map.js +29 -1
- package/lib/programmatic/run-channel-package.js +236 -0
- package/lib/programmatic/run-integration-definition.js +69 -0
- package/lib/role-assistant/knowledge-sync-logging.js +58 -0
- package/lib/role-assistant/knowledge-sync.js +88 -93
- package/lib/role-assistant/test-cases-bid.js +155 -0
- package/lib/role-assistant/test-cases-evaluate.js +9 -1
- package/lib/role-assistant/test-cases-honesty.js +24 -10
- package/lib/role-assistant/test-cases.js +28 -0
- package/lib/role-assistant/test-runner-bid-apply.js +122 -0
- package/lib/role-assistant/test-runner-bid-document.js +278 -0
- package/lib/role-assistant/test-runner-workhub-answers.js +245 -20
- package/lib/role-assistant/test-runner-workhub.js +100 -18
- package/lib/role-assistant/test-suite.js +119 -0
- package/lib/schema/application-schema.json +56 -6
- package/lib/schema/external-datasource.schema.json +103 -17
- package/lib/schema/external-system.schema.json +54 -3
- package/lib/schema/integration-definition.schema.json +195 -0
- package/lib/utils/authentication-shape.js +6 -0
- package/lib/utils/docker-build.js +3 -3
- package/lib/utils/help-builder.js +1 -0
- package/lib/utils/promote-dev-docker-image.js +97 -18
- package/lib/utils/transient-developer-id.js +28 -0
- package/package.json +1 -1
- package/scripts/pnpm/af.mjs +24 -9
- package/scripts/pnpm/help.mjs +1 -1
- package/templates/applications/dataplane/application.yaml +3 -2
- package/templates/applications/dataplane/env.template +7 -6
- package/templates/applications/miso-controller/application.yaml +23 -9
- package/templates/applications/miso-controller/env.template +8 -2
- package/templates/channels/README.md +11 -1
- package/templates/channels/brand/color-192.png +0 -0
- package/templates/channels/brand/dark/128.png +0 -0
- package/templates/channels/brand/dark/192.png +0 -0
- package/templates/channels/brand/dark/256.png +0 -0
- package/templates/channels/brand/dark/32.png +0 -0
- package/templates/channels/brand/dark/512.png +0 -0
- package/templates/channels/brand/dark/64.png +0 -0
- package/templates/channels/brand/light/128.png +0 -0
- package/templates/channels/brand/light/192.png +0 -0
- package/templates/channels/brand/light/256.png +0 -0
- package/templates/channels/brand/light/32.png +0 -0
- package/templates/channels/brand/light/512.png +0 -0
- package/templates/channels/brand/light/64.png +0 -0
- package/templates/channels/brand/mono-white/128.png +0 -0
- package/templates/channels/brand/mono-white/192.png +0 -0
- package/templates/channels/brand/mono-white/256.png +0 -0
- package/templates/channels/brand/mono-white/32.png +0 -0
- package/templates/channels/brand/mono-white/512.png +0 -0
- package/templates/channels/brand/mono-white/64.png +0 -0
- package/templates/channels/brand/outline-32.png +0 -0
- package/templates/channels/chatgpt/install.template.md.hbs +6 -4
- package/templates/channels/chatgpt/integration/README.md +4 -5
- package/templates/channels/chatgpt/integration/chatgpt-system.json +1 -16
- package/templates/channels/microsoft-copilot/ai-plugin.template.json.hbs +10 -16
- package/templates/channels/microsoft-copilot/declarative-agent.template.json.hbs +5 -3
- package/templates/channels/microsoft-copilot/entra-sso-registration.template.md.hbs +27 -0
- package/templates/channels/microsoft-copilot/install.template.md.hbs +39 -20
- package/templates/channels/microsoft-copilot/integration/README.md +2 -3
- package/templates/channels/microsoft-copilot/integration/microsoft-copilot-system.json +1 -22
- package/templates/channels/microsoft-copilot/manifest.template.json.hbs +7 -7
- package/templates/channels/microsoft-copilot/oauth-plugin-vault-required.template.md.hbs +11 -0
- package/templates/channels/slack/integration/README.md +2 -4
- package/templates/channels/teams-bot/install.template.md.hbs +4 -0
- package/templates/channels/teams-bot/integration/README.md +3 -5
- package/templates/channels/web-embed/integration/web-embed-system.json +1 -16
- /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.
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
-
|
|
78
|
-
|
|
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.
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
13
|
-
`INSTALL.md`. Those files are
|
|
14
|
-
connects to the remote Runtime MCP URL
|
|
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": "
|
|
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": "{{
|
|
5
|
-
"
|
|
6
|
-
"
|
|
7
|
-
"
|
|
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": "
|
|
16
|
-
"
|
|
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": "{{
|
|
4
|
-
"description": "{{
|
|
5
|
-
"instructions": "Use
|
|
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}}**
|
|
5
|
+
Environment: **{{environment}}**
|
|
6
6
|
|
|
7
|
-
This channel
|
|
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
|
-
##
|
|
18
|
+
## Install in Microsoft Teams
|
|
17
19
|
|
|
18
|
-
1.
|
|
19
|
-
2.
|
|
20
|
-
3.
|
|
21
|
-
4.
|
|
22
|
-
5.
|
|
23
|
-
6.
|
|
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
|
-
- **
|
|
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
|
|
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
|
|
46
|
-
- `requiresMicrosoftAdmin`
|
|
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
|
|
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
|
|
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`
|
|
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": "
|
|
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": "{{
|
|
8
|
-
"full": "{{
|
|
7
|
+
"short": "{{shortName}}",
|
|
8
|
+
"full": "{{fullName}}"
|
|
9
9
|
},
|
|
10
10
|
"description": {
|
|
11
|
-
"short": "{{
|
|
12
|
-
"full": "{{
|
|
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
|
|
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
|
-
|
|
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": "
|
|
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": [],
|
|
File without changes
|