@aifabrix/builder 2.51.1 → 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/app/run-container-start.js +4 -0
- package/lib/app/run-deploy-job.js +135 -27
- package/lib/app/run-env-compose.js +32 -0
- package/lib/app/run-env-recovery.js +35 -0
- package/lib/app/run-helpers.js +5 -6
- package/lib/app/run.js +11 -3
- package/lib/channels/add-channel.js +126 -19
- package/lib/channels/approval-guides/chatgpt.js +12 -9
- 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/channel-targets.js +18 -1
- package/lib/channels/chatgpt-runtime-contract.js +1 -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-footers.js +1 -1
- package/lib/cli/infra-guided-public-url-warn.js +55 -0
- package/lib/cli/infra-guided.js +78 -62
- package/lib/cli/setup-app.help.js +4 -0
- package/lib/cli/setup-app.test-commands.js +59 -28
- package/lib/cli/setup-external-system.js +50 -12
- package/lib/cli/setup-infra.js +31 -4
- package/lib/commands/channel-add-setup.js +35 -10
- package/lib/commands/channel.js +27 -12
- package/lib/commands/deploy-gate-orchestrator.js +3 -2
- package/lib/commands/governance-verify-external.js +2 -5
- package/lib/commands/integration-definition.js +158 -0
- package/lib/commands/lifecycle-external.js +14 -7
- 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 +131 -114
- package/lib/commands/test-governance-external.js +2 -5
- package/lib/commands/up-miso.js +61 -24
- package/lib/commands/upload-data-sync-finalize.js +20 -3
- package/lib/commands/verify-governance-external.js +2 -5
- package/lib/commands/verify-operations-external.js +2 -5
- package/lib/commands/verify-operations-step-plan.js +31 -0
- package/lib/commands/verify-trust-command-action.js +2 -5
- package/lib/datasource/capability/capability-resolve.js +15 -5
- package/lib/datasource/capability/copy-operations.js +14 -4
- package/lib/datasource/datasource-identifier.js +4 -3
- package/lib/datasource/integration-context.js +3 -3
- package/lib/datasource/resolve-app.js +90 -8
- package/lib/datasource/test-e2e.js +2 -2
- package/lib/datasource/unified-validation-run-body.js +15 -1
- package/lib/datasource/unified-validation-run-resolve.js +2 -2
- package/lib/external-system/deploy-helpers.js +9 -5
- package/lib/external-system/deploy.js +2 -1
- package/lib/external-system/test-system-level.js +21 -3
- package/lib/external-system/test.js +4 -4
- package/lib/generator/builders.js +9 -15
- 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-markdown-frontmatter.js +75 -0
- package/lib/role-assistant/knowledge-sync-logging.js +58 -0
- package/lib/role-assistant/knowledge-sync.js +104 -89
- 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 +289 -46
- package/lib/role-assistant/test-runner-workhub.js +121 -25
- package/lib/role-assistant/test-suite.js +119 -0
- package/lib/schema/application-schema.json +64 -32
- package/lib/schema/external-datasource.schema.json +103 -17
- package/lib/schema/external-system.schema.json +54 -3
- package/lib/schema/infra.parameter.yaml +0 -20
- package/lib/schema/integration-definition.schema.json +195 -0
- package/lib/utils/authentication-shape.js +6 -0
- package/lib/utils/certify-external-workspace.js +40 -0
- package/lib/utils/docker-build.js +3 -3
- package/lib/utils/docker-run-ephemeral.js +77 -17
- package/lib/utils/health-check-public-warn.js +31 -13
- package/lib/utils/health-check.js +11 -1
- package/lib/utils/help-builder.js +1 -0
- package/lib/utils/paths.js +13 -15
- package/lib/utils/promote-dev-docker-image.js +97 -18
- package/lib/utils/role-assistant-paths.js +76 -14
- package/lib/utils/transient-developer-id.js +28 -0
- package/lib/utils/upload-sync-options.js +7 -4
- package/lib/validation/reserved-system-key-prefixes.js +56 -0
- package/lib/validation/validate.js +54 -19
- package/package.json +1 -1
- package/scripts/pnpm/af.mjs +24 -9
- package/scripts/pnpm/help.mjs +1 -1
- package/templates/applications/builder-api/application.yaml +3 -3
- package/templates/applications/dataplane/application.yaml +5 -5
- package/templates/applications/dataplane/env.template +8 -7
- package/templates/applications/dataplane/rbac.yaml +10 -10
- package/templates/applications/keycloak/application.yaml +2 -2
- package/templates/applications/keycloak/env.template +5 -2
- package/templates/applications/miso-controller/application.yaml +25 -11
- package/templates/applications/miso-controller/env.template +24 -5
- 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 +76 -36
- package/templates/channels/chatgpt/integration/README.md +4 -4
- package/templates/channels/chatgpt/integration/chatgpt-system.json +1 -16
- package/templates/channels/chatgpt/manifest.template.json.hbs +3 -3
- 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/install.template.md.hbs +6 -1
- 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/templates/python/docker-compose.hbs +10 -0
- package/templates/typescript/docker-compose.hbs +10 -0
- /package/.cursor/plans/{Done → Archive}/157.1-security-quality-violations-by-type.csv +0 -0
|
@@ -44,7 +44,7 @@ API_KEY_BYPASS_ROLES=full-access
|
|
|
44
44
|
|
|
45
45
|
# API Configuration
|
|
46
46
|
API_V1_STR=/api/v1
|
|
47
|
-
VERSION=2.0.
|
|
47
|
+
VERSION=2.0.26
|
|
48
48
|
# Minimum supported aifabrix-builder CLI semver (advertised on /health and /api/v1/health; empty = no gate)
|
|
49
49
|
# MIN_BUILDER_CLI_VERSION=2.45.0
|
|
50
50
|
MIN_BUILDER_CLI_VERSION=2.45.5
|
|
@@ -155,11 +155,10 @@ MISO_PIPELINE_ENV_KEY=
|
|
|
155
155
|
|
|
156
156
|
# LLM: chat/embed route through governed enterprise-llm only. Provider credentials
|
|
157
157
|
# live on LLM provider external systems + dataplane secret store (not product .env).
|
|
158
|
-
#
|
|
159
|
-
#
|
|
160
|
-
#
|
|
161
|
-
#
|
|
162
|
-
# enterprise-llm (fail-closed if empty). Portal category LLM can override.
|
|
158
|
+
# Deploy-time default provider (systemKey) when Environment Settings ai.llmProvider
|
|
159
|
+
# is empty. Operators can override in Environment Settings without redeploying.
|
|
160
|
+
# When ≥2 LLM providers are published and both settings and this env are empty,
|
|
161
|
+
# resolve fails closed. Ignored when only one provider is published.
|
|
163
162
|
# Lab default: openai (catalog also ships azure-openai).
|
|
164
163
|
ENTERPRISE_LLM_DEFAULT_SELECTOR=openai
|
|
165
164
|
|
|
@@ -180,6 +179,8 @@ ABAC_EXPLAIN_MODE_ENABLED=false
|
|
|
180
179
|
ABAC_PERFORMANCE_THRESHOLD_MS=1000
|
|
181
180
|
|
|
182
181
|
# RBAC Audit Configuration
|
|
182
|
+
# When true, audit denials (rbac.permission.check.failure) and decision traces.
|
|
183
|
+
# Successful allow checks are not audited (no forensic value; floods every request).
|
|
183
184
|
RBAC_AUDIT_ENABLED=true
|
|
184
185
|
# RBAC audit detail: summary | detailed | explain
|
|
185
186
|
RBAC_AUDIT_DETAIL_LEVEL=summary
|
|
@@ -284,7 +285,7 @@ VALIDATION_AUTO_ISSUE_INTEGRATION_CERTIFICATE=true
|
|
|
284
285
|
CIP_EXECUTION_MAX_RESPONSE_SIZE_MB=100.0
|
|
285
286
|
CIP_EXECUTION_MAX_RECORDS=100000
|
|
286
287
|
CIP_EXECUTION_OPERATION_TIMEOUT=300.0
|
|
287
|
-
CIP_EXECUTION_HTTP_TIMEOUT=
|
|
288
|
+
CIP_EXECUTION_HTTP_TIMEOUT=120.0
|
|
288
289
|
CIP_EXECUTION_MAX_RETRIES=3
|
|
289
290
|
CIP_EXECUTION_RETRY_BACKOFF_FACTOR=2.0
|
|
290
291
|
CIP_EXECUTION_RETRY_INITIAL_DELAY=1.0
|
|
@@ -5,47 +5,47 @@
|
|
|
5
5
|
# MisoClient validates environment access automatically based on user/application permissions.
|
|
6
6
|
|
|
7
7
|
roles:
|
|
8
|
-
- name: "
|
|
8
|
+
- name: "Platform Admin"
|
|
9
9
|
value: "aifabrix-platform-admin"
|
|
10
10
|
description: "Full platform infrastructure management and enterprise controller access"
|
|
11
11
|
groups: ["AI-Fabrix-Platform-Admins"]
|
|
12
12
|
|
|
13
|
-
- name: "
|
|
13
|
+
- name: "Security Admin"
|
|
14
14
|
value: "aifabrix-security-admin"
|
|
15
15
|
description: "Security and compliance management for enterprise controller"
|
|
16
16
|
groups: ["AI-Fabrix-Security-Admins"]
|
|
17
17
|
|
|
18
|
-
- name: "
|
|
18
|
+
- name: "Deployment Admin"
|
|
19
19
|
value: "aifabrix-deployment-admin"
|
|
20
20
|
description: "Application deployment orchestration and environment management"
|
|
21
21
|
groups: ["AI-Fabrix-Deployment-Admins"]
|
|
22
22
|
|
|
23
|
-
- name: "
|
|
23
|
+
- name: "Compliance Admin"
|
|
24
24
|
value: "aifabrix-compliance-admin"
|
|
25
25
|
description: "ISO 27001 compliance monitoring and audit management"
|
|
26
26
|
groups: ["AI-Fabrix-Compliance-Admins"]
|
|
27
27
|
|
|
28
|
-
- name: "
|
|
28
|
+
- name: "Developer"
|
|
29
29
|
value: "aifabrix-developer"
|
|
30
30
|
description: "Developer access to deploy applications via CI pipelines"
|
|
31
31
|
groups: ["AI-Fabrix-Developers"]
|
|
32
32
|
|
|
33
|
-
- name: "
|
|
34
|
-
value: "
|
|
33
|
+
- name: "Business Transformation"
|
|
34
|
+
value: "business-transformation"
|
|
35
35
|
description: "Built-in assistant: business intention → governed Connected Systems via Runtime and builder-api"
|
|
36
36
|
groups: ["AI-Fabrix-Business-Transformation"]
|
|
37
37
|
|
|
38
|
-
- name: "
|
|
38
|
+
- name: "Observer"
|
|
39
39
|
value: "aifabrix-observer"
|
|
40
40
|
description: "Read-only access to monitoring, logs, and compliance reports"
|
|
41
41
|
groups: ["AI-Fabrix-Observers"]
|
|
42
42
|
|
|
43
|
-
- name: "AI
|
|
43
|
+
- name: "AI Trust Operator"
|
|
44
44
|
value: "aifabrix-ai-trust-operator"
|
|
45
45
|
description: "Run AI Trust access evaluation and explain visibility for governed users"
|
|
46
46
|
groups: ["AI-Fabrix-AI-Trust-Operators"]
|
|
47
47
|
|
|
48
|
-
- name: "
|
|
48
|
+
- name: "External System Discoverer"
|
|
49
49
|
value: "aifabrix-external-system-discoverer"
|
|
50
50
|
description: "Discover business context for external systems via REST and MCP"
|
|
51
51
|
groups: ["AI-Fabrix-External-System-Discoverers"]
|
|
@@ -10,8 +10,8 @@ app:
|
|
|
10
10
|
image:
|
|
11
11
|
name: aifabrix/keycloak
|
|
12
12
|
tag: 'latest'
|
|
13
|
-
registry:
|
|
14
|
-
registryMode:
|
|
13
|
+
registry: aifabrixacr.azurecr.io
|
|
14
|
+
registryMode: external
|
|
15
15
|
|
|
16
16
|
# Port Configuration (base for host; host port = 8082 + developer_id*100 from ~/.aifabrix/config.yaml)
|
|
17
17
|
port: 8082
|
|
@@ -9,11 +9,14 @@
|
|
|
9
9
|
KC_BOOTSTRAP_ADMIN_USERNAME=admin
|
|
10
10
|
KC_BOOTSTRAP_ADMIN_PASSWORD=kv://keycloak-admin-passwordKeyVault
|
|
11
11
|
KC_HOSTNAME_STRICT=false
|
|
12
|
-
|
|
12
|
+
# Follows tlsEnabled in ~/.aifabrix/config.yaml (same as ${TLS_ENABLED}).
|
|
13
|
+
# Traefik/edge HTTPS on → true (proxy forwards HTTP to Keycloak :8080).
|
|
14
|
+
# Single container without HTTPS (tlsEnabled false) → false.
|
|
15
|
+
KC_HTTP_ENABLED=${TLS_ENABLED}
|
|
13
16
|
# When Traefik + frontDoorRouting.enabled are on, same vdir as url://public. If the front door is off, env generation
|
|
14
17
|
# rewrites url://vdir-public to "/" before expansion (empty path is invalid — Keycloak 26 SRCFG00040).
|
|
15
18
|
# Docker-only templates may use url://vdir-internal instead.
|
|
16
|
-
KC_HTTP_RELATIVE_PATH
|
|
19
|
+
KC_HTTP_RELATIVE_PATH=/auth
|
|
17
20
|
|
|
18
21
|
# =============================================================================
|
|
19
22
|
# HOSTNAME / ISSUER (Docker vs localhost)
|
|
@@ -4,16 +4,15 @@ 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).
|
|
12
11
|
image:
|
|
13
12
|
name: aifabrix/miso-controller
|
|
14
13
|
tag: latest
|
|
15
|
-
registry:
|
|
16
|
-
registryMode:
|
|
14
|
+
registry: aifabrixacr.azurecr.io
|
|
15
|
+
registryMode: external
|
|
17
16
|
|
|
18
17
|
# Port Configuration (container port; host port = 3000 + developer_id*100 from ~/.aifabrix/config.yaml)
|
|
19
18
|
port: 3000
|
|
@@ -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'
|
|
@@ -49,6 +49,10 @@ ONBOARDING_ADMIN_EMAIL=kv://miso-controller-admin-emailKeyVault
|
|
|
49
49
|
# When true, supersedes ONBOARDING_CREATE_DEV_ENV for which extra environments are created
|
|
50
50
|
ONBOARDING_FULL_PLATFORM=false
|
|
51
51
|
|
|
52
|
+
# When true, run Azure env deploy for onboarding envs (SDK modules). Default false —
|
|
53
|
+
# Marketplace already provisions infra; TA owns customer env deploy.
|
|
54
|
+
ONBOARDING_CREATE_MISO_ENV=false
|
|
55
|
+
|
|
52
56
|
# Set to true to create both miso and dev environments during onboarding
|
|
53
57
|
# When false (default), only the miso environment is created (ignored when ONBOARDING_FULL_PLATFORM=true)
|
|
54
58
|
ONBOARDING_CREATE_DEV_ENV=true
|
|
@@ -70,8 +74,8 @@ ENABLE_API_DOCS=true
|
|
|
70
74
|
# Rate Limiting Configuration (for local development)
|
|
71
75
|
# Set DISABLE_RATE_LIMIT=true to disable rate limiting entirely (local development only)
|
|
72
76
|
DISABLE_RATE_LIMIT=true
|
|
73
|
-
|
|
74
|
-
|
|
77
|
+
RATE_LIMIT_WINDOW_MS=600000
|
|
78
|
+
RATE_LIMIT_MAX=100
|
|
75
79
|
|
|
76
80
|
# Package Version (auto-set by npm/pnpm, optional override)
|
|
77
81
|
# npm_package_version=1.0.0
|
|
@@ -138,6 +142,11 @@ KEYCLOAK_VERIFY_AUDIENCE=false
|
|
|
138
142
|
KEYCLOAK_TOKEN_TIMEOUT=5000
|
|
139
143
|
KEYCLOAK_DEFAULT_PASSWORD=kv://keycloak-default-passwordKeyVault
|
|
140
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
|
+
|
|
141
150
|
# Keycloak Events Configuration
|
|
142
151
|
KEYCLOAK_EVENTS_ENABLED=true
|
|
143
152
|
KEYCLOAK_EVENTS_VERIFY_SIGNATURE=true
|
|
@@ -236,6 +245,14 @@ SKIP_DB_REDEPLOY=true
|
|
|
236
245
|
# Bootstrap (SKIP_FIRST_TIME_SETUP=false) is separate from the activation wizard.
|
|
237
246
|
DEPLOYMENT=database
|
|
238
247
|
|
|
248
|
+
# Dev/test: open /tenant-activation on Platform Apps (last step). Default false.
|
|
249
|
+
# Does not skip server-side TA — use only when env is already activated/deployed.
|
|
250
|
+
TA_SKIP_TO_APP_DEPLOY=false
|
|
251
|
+
|
|
252
|
+
# Dev/test: show TA Entra "Completing setup" countdown (120s cap). Default false.
|
|
253
|
+
# Exposed to UI via GET /api/v1/tenant/status → showTaCountdown (restart controller after change).
|
|
254
|
+
SHOW_TA_COUNT_DOWN=false
|
|
255
|
+
|
|
239
256
|
# =============================================================================
|
|
240
257
|
# SECURITY & ENCRYPTION
|
|
241
258
|
# =============================================================================
|
|
@@ -287,9 +304,10 @@ ENTRA_GRAPH_DELEGATED_REDIRECT_URI=https://aifabrix-pro-mori-web-we.azurewebsite
|
|
|
287
304
|
# =============================================================================
|
|
288
305
|
# MORI SERVICE CONFIGURATION
|
|
289
306
|
# =============================================================================
|
|
290
|
-
|
|
291
|
-
#
|
|
292
|
-
#
|
|
307
|
+
# Shared Mori (handoff poll + Entra callback). Local `url://mori-controller-public`
|
|
308
|
+
# only works when a local Mori app is registered and running for this developer.
|
|
309
|
+
# MORI_CALLBACK_API_KEY must be the same secret as Mori MORI_CONTROLLER_CALLBACK_API_KEY
|
|
310
|
+
# (both resolve from kv://mori-callback-api-keyKeyVault — do not generate separate values).
|
|
293
311
|
MORI_BASE_URL=https://aifabrix-pro-mori-web-we.azurewebsites.net
|
|
294
312
|
MORI_AUTH_METHOD=kv://mori-controller-auth-methodKeyVault
|
|
295
313
|
MORI_CALLBACK_API_KEY=kv://mori-callback-api-keyKeyVault
|
|
@@ -304,6 +322,7 @@ MORI_PASSWORD=kv://mori-controller-basic-passwordKeyVault
|
|
|
304
322
|
# LOG_FILE_PATH=/mnt/data/logs via deploy JSON and ensure the directory exists.
|
|
305
323
|
|
|
306
324
|
LOG_TO_FILE=true
|
|
325
|
+
LOG_LEVEL=info
|
|
307
326
|
LOG_FILE_PATH=./logs
|
|
308
327
|
|
|
309
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
|
|
@@ -2,63 +2,103 @@
|
|
|
2
2
|
|
|
3
3
|
{{appDescription}}
|
|
4
4
|
|
|
5
|
-
Environment
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
5
|
+
**Environment:** {{environment}}
|
|
6
|
+
**AI Fabrix credential reference:** `{{credentialKey}}`
|
|
7
|
+
|
|
8
|
+
> This document and `dist/channels/chatgpt/channel-chatgpt.json` are deployment references for administrators. ChatGPT does not install the JSON file as a plugin archive. ChatGPT connects directly to the remote MCP endpoint and discovers the tools exposed by that server.
|
|
9
|
+
|
|
10
|
+
## ChatGPT workspace setup
|
|
11
|
+
|
|
12
|
+
1. Sign in to the ChatGPT web app as a workspace admin or owner.
|
|
13
|
+
2. Enable Developer mode for custom MCP apps:
|
|
14
|
+
- **Business:** **Workspace settings → Apps → Create**, or **Settings → Apps → Advanced settings**.
|
|
15
|
+
- **Enterprise/Edu:** grant the appropriate Developer mode permission under **Workspace settings → Permissions & roles → Connected data**, then enable it under **Settings → Apps → Advanced settings**.
|
|
16
|
+
3. Open **Settings → Apps → Create** (or the equivalent **Workspace settings → Apps → Create** entry).
|
|
17
|
+
4. Enter the app name `{{appName}}` and the remote MCP URL shown under **Runtime connection** below.
|
|
18
|
+
5. Select **OAuth** as the authentication mechanism. Do not configure a custom API key in ChatGPT; custom API-key authentication is not supported for a remote custom MCP app.
|
|
19
|
+
6. Select **Scan tools**. If prompted, complete the OAuth authorization flow and wait for ChatGPT to finish scanning the Runtime tool list.
|
|
20
|
+
7. Review the discovered tools and create the app as a draft.
|
|
21
|
+
8. Test representative read and write workflows. Confirm that user authorization and action confirmations behave as expected.
|
|
22
|
+
9. Publish the app to the workspace and configure its access and action controls. Only workspace admins or owners can publish it.
|
|
23
|
+
10. After MCP tool names, schemas, annotations, or authentication metadata change, use **Refresh** in the app's action controls and review the changes before enabling them.
|
|
17
24
|
|
|
18
25
|
## Runtime connection
|
|
19
26
|
|
|
20
|
-
Configure
|
|
27
|
+
Configure the following values in the ChatGPT custom MCP app. Never place access tokens, client secrets, or API keys in generated files.
|
|
21
28
|
|
|
29
|
+
- **App name:** `{{appName}}`
|
|
22
30
|
{{#if mcpUrl}}
|
|
23
|
-
- **Remote MCP URL:** {{mcpUrl}}
|
|
31
|
+
- **Remote MCP URL:** `{{{mcpUrl}}}`
|
|
24
32
|
{{/if}}
|
|
25
|
-
- **Runtime system key:** {{runtimeSystemKey}}
|
|
26
|
-
- **Transport:**
|
|
27
|
-
- **
|
|
28
|
-
- **
|
|
33
|
+
- **Runtime system key:** `{{runtimeSystemKey}}`
|
|
34
|
+
- **Transport:** Streamable HTTP
|
|
35
|
+
- **Authentication:** OAuth 2.1 authorization-code flow with PKCE (`S256`)
|
|
36
|
+
- **AI Fabrix credential reference:** `{{credentialKey}}`
|
|
37
|
+
- **AI Fabrix authentication settings:** [Open authentication settings]({{{credentialPortalUrl}}})
|
|
38
|
+
|
|
39
|
+
The `{{credentialKey}}` value is an AI Fabrix credential reference. It is not a secret to paste into ChatGPT.
|
|
40
|
+
|
|
41
|
+
## OAuth requirements
|
|
42
|
+
|
|
43
|
+
Before ChatGPT can connect successfully, the MCP deployment must meet all of these requirements:
|
|
44
|
+
|
|
45
|
+
- The MCP endpoint is reachable over public HTTPS with a publicly trusted TLS certificate chain.
|
|
46
|
+
- The MCP server publishes OAuth protected-resource metadata, normally at `/.well-known/oauth-protected-resource`, or points to it in the `WWW-Authenticate` header returned with a `401 Unauthorized` response.
|
|
47
|
+
- The protected-resource document identifies the canonical resource URL, authorization server, and supported scopes.
|
|
48
|
+
- The authorization server publishes OAuth or OpenID Connect discovery metadata.
|
|
49
|
+
- The authorization server supports the authorization-code flow and PKCE with `S256`.
|
|
50
|
+
- The OAuth flow preserves the MCP `resource` parameter, and issued access tokens contain the expected audience and scopes.
|
|
51
|
+
- The redirect URI shown by ChatGPT when the app is created is allowlisted in the authorization server.
|
|
52
|
+
- The MCP server validates every access token's signature, issuer, audience, expiry, and scopes.
|
|
53
|
+
- Each authenticated MCP tool declares an `oauth2` security scheme with the scopes it needs.
|
|
54
|
+
|
|
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
|
+
|
|
57
|
+
## Expected governed tools
|
|
58
|
+
|
|
59
|
+
ChatGPT should discover the following tools from the live MCP server during **Scan tools**:
|
|
60
|
+
|
|
29
61
|
{{#each layerBToolNames}}
|
|
30
|
-
|
|
62
|
+
- `{{this}}`
|
|
31
63
|
{{/each}}
|
|
32
64
|
|
|
33
|
-
|
|
34
|
-
(`/api/v1/mcp/servers/tools` and MCP docs for `{{runtimeSystemKey}}`), including
|
|
35
|
-
Layer B discovery and BTA Evidence authoring reachability. ChatGPT workspace apps still
|
|
36
|
-
require a working streamable-http Remote MCP URL and admin publication.
|
|
65
|
+
{{#if installReady}}Install ready: yes{{else}}Install ready: no{{#if discoveryBlocker}} ({{discoveryBlocker}}){{/if}}{{/if}}
|
|
37
66
|
|
|
38
|
-
|
|
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.
|
|
39
68
|
|
|
40
|
-
|
|
69
|
+
## Runtime and Role Assistant boundaries
|
|
41
70
|
|
|
42
|
-
{{assistantCatalogUrl}}
|
|
71
|
+
- Runtime resolves assistants dynamically for the current user from `{{{assistantCatalogUrl}}}`.
|
|
72
|
+
- ChatGPT's top-level tool surface remains limited to the governed tools listed above.
|
|
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.
|
|
74
|
+
- One authenticated Runtime connection can support multiple Role Assistants, subject to the current user's authorization.
|
|
43
75
|
|
|
44
|
-
|
|
45
|
-
- Evidence authoring remains an internal Business Transformation Assistant capability path, not top-level ChatGPT tools.
|
|
76
|
+
## BTA evidence-authoring proof scenario
|
|
46
77
|
|
|
47
|
-
|
|
78
|
+
Use this scenario to verify the ChatGPT → Runtime → BTA path without exposing Evidence commands as top-level ChatGPT tools:
|
|
48
79
|
|
|
49
|
-
|
|
80
|
+
1. Ask {{baseName}} to improve an existing Role Assistant from process documentation.
|
|
81
|
+
2. Confirm that {{baseName}} starts or continues Business Transformation Assistant work through Runtime.
|
|
82
|
+
3. Confirm that BTA performs evidence metadata, download, upload, and reasoning operations internally and presents certified proposals.
|
|
83
|
+
4. Approve selected proposals and confirm that activation remains an explicit human action.
|
|
50
84
|
|
|
51
|
-
|
|
52
|
-
2. Confirm ChatGPT starts or continues Business Transformation Assistant work through Runtime.
|
|
53
|
-
3. Confirm BTA performs evidence metadata/download/upload reasoning and presents certified proposals.
|
|
54
|
-
4. Approve selected proposals and confirm activation remains an explicit human action.
|
|
85
|
+
## AI Fabrix validation
|
|
55
86
|
|
|
56
|
-
|
|
87
|
+
Before workspace publication, validate the live Streamable HTTP endpoint with MCP Inspector and confirm that initialization, tool discovery, representative calls, invalid inputs, OAuth challenges, and authorization checks all work.
|
|
57
88
|
|
|
58
|
-
|
|
89
|
+
Then run the AI Fabrix probe:
|
|
59
90
|
|
|
60
91
|
```bash
|
|
61
92
|
aifabrix channel add {{channelTarget}} --name "{{baseName}}" --probe
|
|
62
93
|
```
|
|
63
94
|
|
|
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.
|
|
96
|
+
|
|
64
97
|
Use `--force` only to regenerate artifacts and patch channel metadata. It does not rotate credentials.
|
|
98
|
+
|
|
99
|
+
## Current validation status
|
|
100
|
+
|
|
101
|
+
- Local artifact validation: complete
|
|
102
|
+
- Live Runtime validation: pending
|
|
103
|
+
- ChatGPT workspace tool scan: pending
|
|
104
|
+
- ChatGPT workspace publication: requires a workspace admin or owner
|
|
@@ -5,10 +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
|
-
`
|
|
14
|
-
|
|
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": [],
|
|
@@ -6,9 +6,9 @@
|
|
|
6
6
|
"environment": "{{environment}}",
|
|
7
7
|
"runtime": {
|
|
8
8
|
"runtimeSystemKey": "{{runtimeSystemKey}}",
|
|
9
|
-
"remoteMcpUrl": "{{mcpUrl}}",
|
|
9
|
+
"remoteMcpUrl": "{{{mcpUrl}}}",
|
|
10
10
|
"transport": "{{runtimeTransport}}",
|
|
11
|
-
"assistantCatalogUrl": "{{assistantCatalogUrl}}",
|
|
11
|
+
"assistantCatalogUrl": "{{{assistantCatalogUrl}}}",
|
|
12
12
|
"roleAssistantResolution": "dynamic-runtime",
|
|
13
13
|
"layerBToolNames": [
|
|
14
14
|
{{#each layerBToolNames}}
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"authentication": {
|
|
20
20
|
"mode": "{{runtimeAuthMode}}",
|
|
21
21
|
"credentialKey": "{{credentialKey}}",
|
|
22
|
-
"credentialPortalUrl": "{{credentialPortalUrl}}",
|
|
22
|
+
"credentialPortalUrl": "{{{credentialPortalUrl}}}",
|
|
23
23
|
"scopes": {{{scopesJson}}}
|
|
24
24
|
},
|
|
25
25
|
"boundaries": {
|
|
@@ -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",
|