@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.
Files changed (187) 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/app/run-container-start.js +4 -0
  10. package/lib/app/run-deploy-job.js +135 -27
  11. package/lib/app/run-env-compose.js +32 -0
  12. package/lib/app/run-env-recovery.js +35 -0
  13. package/lib/app/run-helpers.js +5 -6
  14. package/lib/app/run.js +11 -3
  15. package/lib/channels/add-channel.js +126 -19
  16. package/lib/channels/approval-guides/chatgpt.js +12 -9
  17. package/lib/channels/approval-guides/microsoft-copilot.js +16 -12
  18. package/lib/channels/channel-add-ensure.js +128 -0
  19. package/lib/channels/channel-artifact-generator.js +11 -1
  20. package/lib/channels/channel-branding.js +94 -0
  21. package/lib/channels/channel-credential.js +8 -0
  22. package/lib/channels/channel-discovery.js +330 -0
  23. package/lib/channels/channel-external-system.js +1 -1
  24. package/lib/channels/channel-runtime-resolver.js +103 -14
  25. package/lib/channels/channel-status-display.js +7 -1
  26. package/lib/channels/channel-targets.js +18 -1
  27. package/lib/channels/chatgpt-runtime-contract.js +1 -1
  28. package/lib/channels/microsoft-copilot-channel-add.js +138 -0
  29. package/lib/channels/microsoft-copilot-entra-sso-form.js +180 -0
  30. package/lib/channels/microsoft-copilot-entra-sso.js +264 -0
  31. package/lib/channels/microsoft-copilot-icons.js +74 -0
  32. package/lib/channels/microsoft-copilot-limits.js +84 -0
  33. package/lib/channels/microsoft-copilot-package.js +130 -49
  34. package/lib/channels/microsoft-copilot-validate.js +197 -0
  35. package/lib/cli/index.js +2 -0
  36. package/lib/cli/infra-guided-footers.js +1 -1
  37. package/lib/cli/infra-guided-public-url-warn.js +55 -0
  38. package/lib/cli/infra-guided.js +78 -62
  39. package/lib/cli/setup-app.help.js +4 -0
  40. package/lib/cli/setup-app.test-commands.js +59 -28
  41. package/lib/cli/setup-external-system.js +50 -12
  42. package/lib/cli/setup-infra.js +31 -4
  43. package/lib/commands/channel-add-setup.js +35 -10
  44. package/lib/commands/channel.js +27 -12
  45. package/lib/commands/deploy-gate-orchestrator.js +3 -2
  46. package/lib/commands/governance-verify-external.js +2 -5
  47. package/lib/commands/integration-definition.js +158 -0
  48. package/lib/commands/lifecycle-external.js +14 -7
  49. package/lib/commands/repair-auth-apply.js +19 -5
  50. package/lib/commands/repair-datasource-sync-operations.js +4 -1
  51. package/lib/commands/role-assistant-test-output.js +200 -0
  52. package/lib/commands/role-assistant.js +131 -114
  53. package/lib/commands/test-governance-external.js +2 -5
  54. package/lib/commands/up-miso.js +61 -24
  55. package/lib/commands/upload-data-sync-finalize.js +20 -3
  56. package/lib/commands/verify-governance-external.js +2 -5
  57. package/lib/commands/verify-operations-external.js +2 -5
  58. package/lib/commands/verify-operations-step-plan.js +31 -0
  59. package/lib/commands/verify-trust-command-action.js +2 -5
  60. package/lib/datasource/capability/capability-resolve.js +15 -5
  61. package/lib/datasource/capability/copy-operations.js +14 -4
  62. package/lib/datasource/datasource-identifier.js +4 -3
  63. package/lib/datasource/integration-context.js +3 -3
  64. package/lib/datasource/resolve-app.js +90 -8
  65. package/lib/datasource/test-e2e.js +2 -2
  66. package/lib/datasource/unified-validation-run-body.js +15 -1
  67. package/lib/datasource/unified-validation-run-resolve.js +2 -2
  68. package/lib/external-system/deploy-helpers.js +9 -5
  69. package/lib/external-system/deploy.js +2 -1
  70. package/lib/external-system/test-system-level.js +21 -3
  71. package/lib/external-system/test.js +4 -4
  72. package/lib/generator/builders.js +9 -15
  73. package/lib/infrastructure/index.js +19 -4
  74. package/lib/integration-definition/apply.js +478 -0
  75. package/lib/integration-definition/canonical-json.js +51 -0
  76. package/lib/integration-definition/emit-suite-bid.js +94 -0
  77. package/lib/integration-definition/enrich-crm-field-mappings.js +240 -0
  78. package/lib/integration-definition/enrich-openapi-operations.js +434 -0
  79. package/lib/integration-definition/from-discovery.js +339 -0
  80. package/lib/integration-definition/hash.js +37 -0
  81. package/lib/integration-definition/index.js +37 -0
  82. package/lib/integration-definition/openapi-enrichment/hubspot-crm-companies.json +205 -0
  83. package/lib/integration-definition/resource-type-catalog.js +59 -0
  84. package/lib/integration-definition/system-kind-enum.js +40 -0
  85. package/lib/integration-definition/validate.js +148 -0
  86. package/lib/programmatic/builder-api-request.js +5 -1
  87. package/lib/programmatic/builder-help-governance.js +3 -2
  88. package/lib/programmatic/capability-registry.js +19 -0
  89. package/lib/programmatic/openapi-component-schemas.js +6 -1
  90. package/lib/programmatic/openapi-descriptions.js +40 -0
  91. package/lib/programmatic/openapi-envelope-examples.js +269 -0
  92. package/lib/programmatic/openapi-operation-bindings.js +45 -0
  93. package/lib/programmatic/openapi-request-schemas.js +14 -0
  94. package/lib/programmatic/openapi-result-schemas-overflow.js +101 -0
  95. package/lib/programmatic/openapi-result-schemas.js +46 -99
  96. package/lib/programmatic/openapi-schema-descriptions-core.js +7 -4
  97. package/lib/programmatic/openapi-schema-descriptions-help.js +1 -1
  98. package/lib/programmatic/openapi-schema-descriptions-operations.js +24 -0
  99. package/lib/programmatic/openapi-schema-helpers.js +9 -9
  100. package/lib/programmatic/openapi-spec.js +11 -1
  101. package/lib/programmatic/orchestration-openapi-meta.js +10 -0
  102. package/lib/programmatic/route-handler-map.js +29 -1
  103. package/lib/programmatic/run-channel-package.js +236 -0
  104. package/lib/programmatic/run-integration-definition.js +69 -0
  105. package/lib/role-assistant/knowledge-markdown-frontmatter.js +75 -0
  106. package/lib/role-assistant/knowledge-sync-logging.js +58 -0
  107. package/lib/role-assistant/knowledge-sync.js +104 -89
  108. package/lib/role-assistant/test-cases-bid.js +155 -0
  109. package/lib/role-assistant/test-cases-evaluate.js +9 -1
  110. package/lib/role-assistant/test-cases-honesty.js +24 -10
  111. package/lib/role-assistant/test-cases.js +28 -0
  112. package/lib/role-assistant/test-runner-bid-apply.js +122 -0
  113. package/lib/role-assistant/test-runner-bid-document.js +278 -0
  114. package/lib/role-assistant/test-runner-workhub-answers.js +289 -46
  115. package/lib/role-assistant/test-runner-workhub.js +121 -25
  116. package/lib/role-assistant/test-suite.js +119 -0
  117. package/lib/schema/application-schema.json +64 -32
  118. package/lib/schema/external-datasource.schema.json +103 -17
  119. package/lib/schema/external-system.schema.json +54 -3
  120. package/lib/schema/infra.parameter.yaml +0 -20
  121. package/lib/schema/integration-definition.schema.json +195 -0
  122. package/lib/utils/authentication-shape.js +6 -0
  123. package/lib/utils/certify-external-workspace.js +40 -0
  124. package/lib/utils/docker-build.js +3 -3
  125. package/lib/utils/docker-run-ephemeral.js +77 -17
  126. package/lib/utils/health-check-public-warn.js +31 -13
  127. package/lib/utils/health-check.js +11 -1
  128. package/lib/utils/help-builder.js +1 -0
  129. package/lib/utils/paths.js +13 -15
  130. package/lib/utils/promote-dev-docker-image.js +97 -18
  131. package/lib/utils/role-assistant-paths.js +76 -14
  132. package/lib/utils/transient-developer-id.js +28 -0
  133. package/lib/utils/upload-sync-options.js +7 -4
  134. package/lib/validation/reserved-system-key-prefixes.js +56 -0
  135. package/lib/validation/validate.js +54 -19
  136. package/package.json +1 -1
  137. package/scripts/pnpm/af.mjs +24 -9
  138. package/scripts/pnpm/help.mjs +1 -1
  139. package/templates/applications/builder-api/application.yaml +3 -3
  140. package/templates/applications/dataplane/application.yaml +5 -5
  141. package/templates/applications/dataplane/env.template +8 -7
  142. package/templates/applications/dataplane/rbac.yaml +10 -10
  143. package/templates/applications/keycloak/application.yaml +2 -2
  144. package/templates/applications/keycloak/env.template +5 -2
  145. package/templates/applications/miso-controller/application.yaml +25 -11
  146. package/templates/applications/miso-controller/env.template +24 -5
  147. package/templates/channels/README.md +11 -1
  148. package/templates/channels/brand/color-192.png +0 -0
  149. package/templates/channels/brand/dark/128.png +0 -0
  150. package/templates/channels/brand/dark/192.png +0 -0
  151. package/templates/channels/brand/dark/256.png +0 -0
  152. package/templates/channels/brand/dark/32.png +0 -0
  153. package/templates/channels/brand/dark/512.png +0 -0
  154. package/templates/channels/brand/dark/64.png +0 -0
  155. package/templates/channels/brand/light/128.png +0 -0
  156. package/templates/channels/brand/light/192.png +0 -0
  157. package/templates/channels/brand/light/256.png +0 -0
  158. package/templates/channels/brand/light/32.png +0 -0
  159. package/templates/channels/brand/light/512.png +0 -0
  160. package/templates/channels/brand/light/64.png +0 -0
  161. package/templates/channels/brand/mono-white/128.png +0 -0
  162. package/templates/channels/brand/mono-white/192.png +0 -0
  163. package/templates/channels/brand/mono-white/256.png +0 -0
  164. package/templates/channels/brand/mono-white/32.png +0 -0
  165. package/templates/channels/brand/mono-white/512.png +0 -0
  166. package/templates/channels/brand/mono-white/64.png +0 -0
  167. package/templates/channels/brand/outline-32.png +0 -0
  168. package/templates/channels/chatgpt/install.template.md.hbs +76 -36
  169. package/templates/channels/chatgpt/integration/README.md +4 -4
  170. package/templates/channels/chatgpt/integration/chatgpt-system.json +1 -16
  171. package/templates/channels/chatgpt/manifest.template.json.hbs +3 -3
  172. package/templates/channels/microsoft-copilot/ai-plugin.template.json.hbs +10 -16
  173. package/templates/channels/microsoft-copilot/declarative-agent.template.json.hbs +5 -3
  174. package/templates/channels/microsoft-copilot/entra-sso-registration.template.md.hbs +27 -0
  175. package/templates/channels/microsoft-copilot/install.template.md.hbs +39 -20
  176. package/templates/channels/microsoft-copilot/integration/README.md +2 -3
  177. package/templates/channels/microsoft-copilot/integration/microsoft-copilot-system.json +1 -22
  178. package/templates/channels/microsoft-copilot/manifest.template.json.hbs +7 -7
  179. package/templates/channels/microsoft-copilot/oauth-plugin-vault-required.template.md.hbs +11 -0
  180. package/templates/channels/slack/install.template.md.hbs +6 -1
  181. package/templates/channels/slack/integration/README.md +2 -4
  182. package/templates/channels/teams-bot/install.template.md.hbs +4 -0
  183. package/templates/channels/teams-bot/integration/README.md +3 -5
  184. package/templates/channels/web-embed/integration/web-embed-system.json +1 -16
  185. package/templates/python/docker-compose.hbs +10 -0
  186. package/templates/typescript/docker-compose.hbs +10 -0
  187. /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.15
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
- # When ≥2 LLM providers are published under enterprise-llm, set selectorKey
159
- # (system key), e.g. openai | azure-openai | ollama. Ignored when only one.
160
- # Prefer portal Configuration category LLM after deploy; this env is the resolve target.
161
- # Default LLM provider systemKey when ≥2 LLM providers are published under
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=30.0
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: "AI Fabrix Platform Admin"
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: "AI Fabrix Security Admin"
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: "AI Fabrix Deployment Admin"
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: "AI Fabrix Compliance Admin"
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: "AI Fabrix Developer"
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: "AI Fabrix Business Transformation"
34
- value: "aifabrix-business-transformation"
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: "AI Fabrix Observer"
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 Fabrix AI Trust Operator"
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: "AI Fabrix External System Discoverer"
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: aifabrixdevacr.azurecr.io
14
- registryMode: acr
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
- KC_HTTP_ENABLED=${HTTP_ENABLED}
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=url://vdir-public
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.10'
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: aifabrixdevacr.azurecr.io
16
- registryMode: acr
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: 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'
@@ -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
- # RATE_LIMIT_WINDOW_MS=600000 # 10 minutes in milliseconds (default: 600000)
74
- # RATE_LIMIT_MAX=100 # Max requests per window (default: 100)
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
- # Shared pro Mori (Entra handoff + Graph callback). Prefer this over url://mori-controller-public
292
- # unless a local Mori app is registered and running for the developer.
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.
@@ -2,63 +2,103 @@
2
2
 
3
3
  {{appDescription}}
4
4
 
5
- Environment: **{{environment}}** · Credential key: `{{credentialKey}}`
6
-
7
- This output is connection and administration material (`channel-chatgpt.json` + `INSTALL.md`), not a plugin archive.
8
-
9
- ## Workspace admin setup (manual)
10
-
11
- 1. Sign in to your ChatGPT workspace as an admin and enable **Developer mode / custom MCP apps** if required by workspace policy.
12
- 2. Create a custom MCP app and use the generated artifact from `dist/channels/chatgpt/channel-chatgpt.json` as the connection reference.
13
- 3. Configure the remote MCP URL and transport from **Runtime connection** below.
14
- 4. Complete authentication setup for your workspace policy. Store credential references in AI Fabrix: [Authentication settings]({{credentialPortalUrl}})
15
- 5. Refresh tools in ChatGPT after configuration changes so ChatGPT reads the latest Runtime tool list.
16
- 6. Publish the app to the workspace and configure workspace access controls (RBAC or equivalent).
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 these values in the ChatGPT custom MCP app. Do not place secrets in generated files.
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:** {{runtimeTransport}}
27
- - **Auth mode:** {{runtimeAuthMode}}
28
- - **Expected Layer B tools:**
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
- - `{{this}}`
62
+ - `{{this}}`
31
63
  {{/each}}
32
64
 
33
- AI Fabrix `--probe` validates Runtime through the first-party MCP gateway
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
- ## Runtime and Role Assistant boundary checks
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
- - Runtime should resolve assistants dynamically per user from:
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
- - The ChatGPT top-level tool surface should stay at Runtime Layer B tools.
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
- ## BTA Evidence-authoring proof scenario
78
+ Use this scenario to verify the ChatGPT → Runtime → BTA path without exposing Evidence commands as top-level ChatGPT tools:
48
79
 
49
- Use this scenario to verify ChatGPT → Runtime → BTA path without exposing Evidence commands as top-level ChatGPT tools:
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
- 1. Ask ChatGPT to improve an existing Role Assistant from process documentation.
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
- ## AI Fabrix validation commands
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
- After workspace publication and authentication setup:
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
- The `channel add` step generates `dist/channels/chatgpt/channel-chatgpt.json` and
13
- `INSTALL.md` for ChatGPT workspace admins to connect a custom MCP app to the
14
- runtime-orchestration server.
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": [],
@@ -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": "{{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",