@aifabrix/builder 2.54.1 → 2.55.2

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 (253) hide show
  1. package/README.md +8 -0
  2. package/lib/agent-kit/apply-ops.js +82 -0
  3. package/lib/agent-kit/checksums.js +28 -0
  4. package/lib/agent-kit/classify.js +113 -0
  5. package/lib/agent-kit/claude-shim.js +61 -0
  6. package/lib/agent-kit/constants.js +55 -0
  7. package/lib/agent-kit/file-list.js +103 -0
  8. package/lib/agent-kit/host-approve.js +172 -0
  9. package/lib/agent-kit/hosting/github.js +63 -0
  10. package/lib/agent-kit/hosts.js +71 -0
  11. package/lib/agent-kit/init.js +319 -0
  12. package/lib/agent-kit/kit-root.js +17 -0
  13. package/lib/agent-kit/managed-section.js +79 -0
  14. package/lib/agent-kit/package-load.js +45 -0
  15. package/lib/agent-kit/plan-ops.js +69 -0
  16. package/lib/agent-kit/remote-prompts.js +272 -0
  17. package/lib/agent-kit/render-host-markdown.js +40 -0
  18. package/lib/agent-kit/repo-guard.js +47 -0
  19. package/lib/agent-kit/report.js +107 -0
  20. package/lib/agent-kit/run.js +82 -0
  21. package/lib/agent-kit/scm/git.js +122 -0
  22. package/lib/agent-kit/start.js +310 -0
  23. package/lib/agent-kit/state-file.js +83 -0
  24. package/lib/agent-kit/status.js +50 -0
  25. package/lib/agent-kit/v1-detect.js +81 -0
  26. package/lib/agent-kit/validate-kit.js +87 -0
  27. package/lib/agent-kit/workspace-name.js +40 -0
  28. package/lib/agent-kit/workspace-skeleton.js +103 -0
  29. package/lib/api/role-assistant-test-pack.api.js +86 -0
  30. package/lib/api/work-search.api.js +31 -4
  31. package/lib/api/work.api.js +19 -12
  32. package/lib/app/deploy.js +7 -4
  33. package/lib/app/list-external-systems.js +2 -1
  34. package/lib/app/offer-create-from-template.js +184 -0
  35. package/lib/app/show-display.js +33 -6
  36. package/lib/app/show.js +25 -2
  37. package/lib/channels/add-channel.js +1 -0
  38. package/lib/channels/approval-guides/claude.js +2 -2
  39. package/lib/channels/channel-add-failure.js +1 -0
  40. package/lib/channels/channel-add-remaining.js +15 -9
  41. package/lib/channels/channel-definition-status.js +115 -0
  42. package/lib/channels/channel-description.js +2 -1
  43. package/lib/channels/channel-install-envelope.js +4 -2
  44. package/lib/channels/channel-integration-generator.js +2 -0
  45. package/lib/channels/channel-runtime-resolver.js +14 -0
  46. package/lib/channels/channel-targets.js +31 -5
  47. package/lib/channels/claude-setup-values.js +4 -1
  48. package/lib/channels/slack-channel-add.js +59 -6
  49. package/lib/channels/slack-mcp-callback.js +51 -0
  50. package/lib/channels/slack-mcp-runtime.js +156 -0
  51. package/lib/channels/slack-provisioning/install-cli.js +14 -2
  52. package/lib/channels/slack-provisioning/with-curl-on-path.js +6 -1
  53. package/lib/cli/index.js +4 -0
  54. package/lib/cli/setup-app.js +8 -1
  55. package/lib/cli/setup-auth.js +11 -2
  56. package/lib/cli/setup-certification-commands.js +2 -2
  57. package/lib/cli/setup-certification.help.js +3 -1
  58. package/lib/commands/agent-kit-help.js +149 -0
  59. package/lib/commands/agent-kit.js +417 -0
  60. package/lib/commands/auth-status-user.js +99 -0
  61. package/lib/commands/auth-status.js +14 -4
  62. package/lib/commands/channel-add-help.js +5 -5
  63. package/lib/commands/datasource-capability-relate-cli.js +5 -4
  64. package/lib/commands/datasource-load-export-cli.js +7 -2
  65. package/lib/commands/datasource-test-trust-cli.js +5 -1
  66. package/lib/commands/governance-command-action.js +5 -4
  67. package/lib/commands/identity-membership-role-cache.js +6 -1
  68. package/lib/commands/lifecycle-command-action.js +16 -15
  69. package/lib/commands/login-credentials.js +8 -3
  70. package/lib/commands/login-device.js +14 -5
  71. package/lib/commands/login.js +14 -1
  72. package/lib/commands/logout.js +50 -15
  73. package/lib/commands/repair-auth-apply.js +1 -1
  74. package/lib/commands/repair-datasource-key-skip.js +39 -0
  75. package/lib/commands/repair-datasource-keys.js +24 -12
  76. package/lib/commands/repair-rbac.js +16 -10
  77. package/lib/commands/role-assistant-copy-output.js +61 -0
  78. package/lib/commands/role-assistant-copy.js +155 -0
  79. package/lib/commands/role-assistant-test-output.js +8 -9
  80. package/lib/commands/role-assistant-test-result-rows.js +42 -0
  81. package/lib/commands/role-assistant.js +140 -59
  82. package/lib/commands/search.js +143 -0
  83. package/lib/commands/test-trust-external.js +7 -5
  84. package/lib/commands/upload-sidecar-followups.js +4 -1
  85. package/lib/commands/verify-governance-command-action.js +9 -7
  86. package/lib/commands/verify-operations-command-action.js +9 -8
  87. package/lib/commands/verify-operations-skip-e2e.js +131 -0
  88. package/lib/commands/verify-operations-step-plan.js +6 -33
  89. package/lib/commands/verify-operations-steps.js +3 -1
  90. package/lib/commands/verify-trust-command-action.js +6 -5
  91. package/lib/datasource/capability/relate-operations.js +28 -10
  92. package/lib/datasource/capability/run-capability-relate.js +48 -25
  93. package/lib/datasource/datasource-identifier.js +13 -5
  94. package/lib/deployment/deployer-poll-run.js +117 -35
  95. package/lib/external-system/deploy-dataplane-published.js +70 -0
  96. package/lib/external-system/deploy.js +12 -2
  97. package/lib/external-system/download-role-assistant.js +41 -15
  98. package/lib/external-system/download.js +8 -3
  99. package/lib/generator/helpers.js +12 -1
  100. package/lib/generator/wizard-datasource-key.js +54 -0
  101. package/lib/generator/wizard.js +55 -54
  102. package/lib/integration-definition/apply-datasource-keys.js +75 -0
  103. package/lib/integration-definition/apply-relationships.js +195 -0
  104. package/lib/integration-definition/apply-static-enterprise.js +232 -0
  105. package/lib/integration-definition/apply-system-file.js +71 -0
  106. package/lib/integration-definition/apply-test-endpoint.js +89 -0
  107. package/lib/integration-definition/apply-viewpoint-defaults.js +157 -0
  108. package/lib/integration-definition/apply.js +78 -59
  109. package/lib/integration-definition/enrich-openapi-operations.js +36 -10
  110. package/lib/integration-definition/enrich-openapi-pick.js +87 -0
  111. package/lib/lifecycle/role-assistant-governance.js +56 -21
  112. package/lib/programmatic/capability-registry.js +1 -0
  113. package/lib/programmatic/index.js +2 -0
  114. package/lib/programmatic/openapi-apply-result-schemas.js +8 -0
  115. package/lib/programmatic/openapi-channel-install-schemas.js +4 -1
  116. package/lib/programmatic/openapi-component-schemas.js +1 -0
  117. package/lib/programmatic/openapi-descriptions.js +9 -3
  118. package/lib/programmatic/openapi-envelope-examples.js +7 -0
  119. package/lib/programmatic/openapi-operation-bindings.js +5 -0
  120. package/lib/programmatic/openapi-request-schemas.js +5 -0
  121. package/lib/programmatic/openapi-schema-descriptions-channel.js +8 -5
  122. package/lib/programmatic/openapi-schema-descriptions-operations.js +19 -0
  123. package/lib/programmatic/openapi-spec.js +1 -0
  124. package/lib/programmatic/request-timeout.js +3 -0
  125. package/lib/programmatic/route-handler-map.js +7 -0
  126. package/lib/programmatic/run-channel-catalog.js +50 -8
  127. package/lib/programmatic/run-channel-install-options.js +5 -1
  128. package/lib/programmatic/run-download.js +41 -0
  129. package/lib/protection/auth-context.js +3 -1
  130. package/lib/protection/protection-display.js +3 -2
  131. package/lib/protection/report-exit.js +50 -0
  132. package/lib/protection/run-commands.js +2 -0
  133. package/lib/role-assistant/knowledge-sync-settings-push.js +172 -0
  134. package/lib/role-assistant/knowledge-sync.js +9 -126
  135. package/lib/role-assistant/package-validate.js +175 -0
  136. package/lib/role-assistant/test-case-assertion-row.js +36 -0
  137. package/lib/role-assistant/test-case-copy-bind.js +77 -0
  138. package/lib/role-assistant/test-case-copy-expected.js +127 -0
  139. package/lib/role-assistant/test-case-copy-from-work.js +90 -0
  140. package/lib/role-assistant/test-case-copy-interactions.js +67 -0
  141. package/lib/role-assistant/test-case-copy.js +119 -0
  142. package/lib/role-assistant/test-case-expected-catalog.js +135 -0
  143. package/lib/role-assistant/test-case-validate.js +88 -0
  144. package/lib/role-assistant/test-cases-bid.js +117 -4
  145. package/lib/role-assistant/test-cases-evaluate.js +149 -31
  146. package/lib/role-assistant/test-cases-evidence.js +44 -5
  147. package/lib/role-assistant/test-cases-honesty.js +155 -6
  148. package/lib/role-assistant/test-cases-lifecycle.js +297 -0
  149. package/lib/role-assistant/test-cases-search-graph.js +122 -0
  150. package/lib/role-assistant/test-cases-search.js +20 -2
  151. package/lib/role-assistant/test-cases.js +34 -168
  152. package/lib/role-assistant/test-pack-map.js +180 -0
  153. package/lib/role-assistant/test-pack-sync.js +187 -0
  154. package/lib/role-assistant/test-runner-debug.js +54 -0
  155. package/lib/role-assistant/test-runner-respond-body.js +36 -0
  156. package/lib/role-assistant/test-runner-search.js +20 -5
  157. package/lib/role-assistant/test-runner-start-payload.js +63 -10
  158. package/lib/role-assistant/test-runner-workhub-answers.js +45 -16
  159. package/lib/role-assistant/test-runner-workhub.js +45 -21
  160. package/lib/role-assistant/test-runner.js +53 -10
  161. package/lib/schema/external-datasource.schema.json +36 -5
  162. package/lib/schema/external-system.schema.json +20 -2
  163. package/lib/schema/infra-parameter.schema.json +51 -3
  164. package/lib/schema/infra.parameter.yaml +476 -40
  165. package/lib/schema/role-assistant-test-case.schema.json +408 -0
  166. package/lib/schema/type/document-storage.json +1 -1
  167. package/lib/search/dataplane-context.js +23 -0
  168. package/lib/search/search-args.js +211 -0
  169. package/lib/search/search-display.js +238 -0
  170. package/lib/search/search-errors.js +50 -0
  171. package/lib/search/search-prompts.js +119 -0
  172. package/lib/search/search-roles.js +85 -0
  173. package/lib/search/search-run.js +241 -0
  174. package/lib/search/search-skills.js +198 -0
  175. package/lib/utils/api-required-permissions.js +271 -0
  176. package/lib/utils/api.js +16 -13
  177. package/lib/utils/authentication-slot-show.js +153 -0
  178. package/lib/utils/cli-json-exit.js +41 -0
  179. package/lib/utils/cli-utils.js +23 -5
  180. package/lib/utils/controller-url.js +78 -4
  181. package/lib/utils/credential-display.js +43 -1
  182. package/lib/utils/deployment-errors.js +15 -0
  183. package/lib/utils/deployment-validation-helpers.js +4 -1
  184. package/lib/utils/device-code.js +31 -10
  185. package/lib/utils/error-formatters/error-parser.js +16 -1
  186. package/lib/utils/error-formatters/permission-errors.js +19 -5
  187. package/lib/utils/external-system-readiness-compact-blocks.js +5 -1
  188. package/lib/utils/external-system-readiness-compact-display.js +30 -1
  189. package/lib/utils/external-system-validators.js +2 -1
  190. package/lib/utils/help-builder.js +3 -1
  191. package/lib/utils/keycloak-realm-ready.js +5 -2
  192. package/lib/utils/logger.js +1 -0
  193. package/lib/utils/paths.js +26 -5
  194. package/lib/utils/schema-loader.js +37 -0
  195. package/lib/utils/secrets-helpers.js +2 -2
  196. package/lib/utils/write-stream-and-wait.js +63 -0
  197. package/lib/validation/validate-external-file.js +5 -1
  198. package/lib/validation/validate.js +3 -2
  199. package/package.json +20 -6
  200. package/templates/agent-kit/adapters/claude/nested.CLAUDE.md +1 -0
  201. package/templates/agent-kit/adapters/claude/root.CLAUDE.md +5 -0
  202. package/templates/agent-kit/adapters/cursor/commands/cust-0-plan.md +5 -0
  203. package/templates/agent-kit/adapters/cursor/commands/cust-1-validate.md +5 -0
  204. package/templates/agent-kit/adapters/cursor/commands/cust-2-build.md +5 -0
  205. package/templates/agent-kit/adapters/cursor/commands/cust-3-push.md +5 -0
  206. package/templates/agent-kit/adapters/cursor/commands/cust-biz-1-validate.md +5 -0
  207. package/templates/agent-kit/adapters/cursor/commands/cust-biz-2-build.md +5 -0
  208. package/templates/agent-kit/adapters/cursor/commands/cust-biz-3-prove.md +5 -0
  209. package/templates/agent-kit/agent-kit.yaml +45 -0
  210. package/templates/agent-kit/instructions/AGENTKIT.md +104 -0
  211. package/templates/agent-kit/instructions/integration.AGENTS.md +25 -0
  212. package/templates/agent-kit/instructions/role-assistant.AGENTS.md +22 -0
  213. package/templates/agent-kit/instructions/root.AGENTS.md +37 -0
  214. package/templates/agent-kit/parity-inventory.yaml +188 -0
  215. package/templates/agent-kit/skills/aifabrix-connected-system/SKILL.md +59 -0
  216. package/templates/agent-kit/skills/aifabrix-connected-system/references/contract-checklist.md +40 -0
  217. package/templates/agent-kit/skills/aifabrix-connected-system/references/delivery-gates.md +54 -0
  218. package/templates/agent-kit/skills/aifabrix-connected-system/references/production-safety.md +35 -0
  219. package/templates/agent-kit/skills/aifabrix-connected-system/scripts/reserved-system-key.js +19 -0
  220. package/templates/agent-kit/skills/aifabrix-plan/SKILL.md +52 -0
  221. package/templates/agent-kit/skills/aifabrix-plan/references/challenge-checklist.md +108 -0
  222. package/templates/agent-kit/skills/aifabrix-plan/references/interaction.md +34 -0
  223. package/templates/agent-kit/skills/aifabrix-plan/references/plan-template.md +182 -0
  224. package/templates/agent-kit/skills/aifabrix-prove/SKILL.md +51 -0
  225. package/templates/agent-kit/skills/aifabrix-prove/references/demo-template.md +65 -0
  226. package/templates/agent-kit/skills/aifabrix-prove/references/evidence-lifecycle.md +68 -0
  227. package/templates/agent-kit/skills/aifabrix-prove/references/learning-template.md +66 -0
  228. package/templates/agent-kit/skills/aifabrix-role-assistant/SKILL.md +43 -0
  229. package/templates/agent-kit/skills/aifabrix-role-assistant/references/package-boundary.md +21 -0
  230. package/templates/agent-kit/skills/shared/hosts.md +65 -0
  231. package/templates/agent-kit/skills/shared/login.md +16 -0
  232. package/templates/agent-kit/workspace/.cursor/plans/README.md +22 -0
  233. package/templates/agent-kit/workspace/LICENSE.mit +21 -0
  234. package/templates/agent-kit/workspace/README.md +89 -0
  235. package/templates/applications/builder-api/Dockerfile +3 -1
  236. package/templates/applications/dataplane/application.yaml +2 -3
  237. package/templates/applications/dataplane/env.template +5 -5
  238. package/templates/applications/dataplane/rbac.yaml +28 -0
  239. package/templates/applications/keycloak/env.template +3 -3
  240. package/templates/applications/miso-controller/application.yaml +21 -2
  241. package/templates/applications/miso-controller/env.template +96 -25
  242. package/templates/applications/miso-controller/rbac.yaml +5 -0
  243. package/templates/channels/claude/TROUBLESHOOTING.md +3 -0
  244. package/templates/channels/claude/channel.json +1 -1
  245. package/templates/channels/claude/install.template.md.hbs +1 -0
  246. package/templates/channels/claude/integration/claude-system.json +1 -1
  247. package/templates/channels/slack/channel.json +11 -0
  248. package/templates/channels/slack/install.template.md.hbs +9 -0
  249. package/templates/channels/slack/integration/slack-system.json +11 -0
  250. package/templates/channels/slack/manifest.template.json.hbs +6 -3
  251. package/templates/channels/teams-bot/channel.json +1 -0
  252. package/templates/python/docker-compose.hbs +14 -0
  253. package/templates/typescript/docker-compose.hbs +14 -0
@@ -0,0 +1,89 @@
1
+ # {{workspaceName}}
2
+
3
+ AI Fabrix **customer delivery workspace** for Connected Systems and Role Assistants.
4
+
5
+ This repository holds **customer packages and data** only. Do not edit platform product source from this workspace.
6
+
7
+ Vendor limits, credentials, designated test subjects, and PII live only in each system’s `integration/<systemKey>/README.md`.
8
+
9
+ ## How to start
10
+
11
+ 1. Open **this folder** in Cursor, Claude Code, or Codex. Host install and sign-in: **[AGENTKIT.md](./AGENTKIT.md)**.
12
+ 2. The agent checks `aifabrix auth status`. If you are not signed in, it asks for the Miso Controller URL and gives you a browser link. You do not need a terminal. Details: **[AGENTKIT.md](./AGENTKIT.md)**.
13
+ 3. In chat, either **invoke a skill** or **paste a prompt** from the tables below. Work in order. Wait for the gate (`PLAN_READY`, `READY`, `BUILT`, then `PASS` or `PASS_WITH_SKIPS`) before the next step.
14
+
15
+ ### How to use prompts
16
+
17
+ | Host | Invoke a skill | Or type a prompt |
18
+ | --- | --- | --- |
19
+ | Cursor | `/aifabrix-plan` (and the other `/aifabrix-*` names) | Paste the sentence from **What to ask** |
20
+ | Claude Code | same `/aifabrix-*` names | same sentences |
21
+ | Codex | `$aifabrix-plan` (and the other `$aifabrix-*` names) | same sentences |
22
+
23
+ You can combine them: invoke the skill, then add the system key or paste a spec. Attach or `@` the specification file when you have one. Replace `<systemKey>` and `<catalogRole>` with real keys. Do not invent `ra-` / `ek-` system keys or `*-reader` roles.
24
+
25
+ ### Connected System (integration)
26
+
27
+ | Step | Skill | What to ask (prompt) |
28
+ | --- | --- | --- |
29
+ | Plan | `/aifabrix-plan` | Turn this specification into a delivery plan for `<systemKey>` |
30
+ | Validate and build | `/aifabrix-connected-system` | Validate and build the `<systemKey>` integration |
31
+ | Test and publish | `/aifabrix-connected-system` | Publish and certify this Connected System |
32
+
33
+ Example — plan:
34
+
35
+ ```text
36
+ /aifabrix-plan
37
+ Turn this specification into a delivery plan for <systemKey>
38
+ ```
39
+
40
+ `aifabrix upload` is a **draft**. Publish is **`aifabrix deploy`**. Secrets stay in `kv://` — never paste values into chat or git.
41
+
42
+ ### Role Assistant
43
+
44
+ Do this after the Connected Systems the role needs are **published** (deploy, not upload-only).
45
+
46
+ | Step | Skill | What to ask (prompt) |
47
+ | --- | --- | --- |
48
+ | Author, test, or upload | `/aifabrix-role-assistant` | Create or update the `<catalogRole>` Role Assistant |
49
+ | Prove the business case | `/aifabrix-prove` | Prove this business case and update learning |
50
+
51
+ Example — Role Assistant:
52
+
53
+ ```text
54
+ /aifabrix-role-assistant
55
+ Create or update the <catalogRole> Role Assistant
56
+ ```
57
+
58
+ Use a **catalog** role key (`finance-controller`, `cfo`, …). Package folder: `role-assistant/ra-<catalogRole>/`.
59
+
60
+ ## Layout
61
+
62
+ ```text
63
+ integration/<systemKey>/ Connected System packages (Builder output)
64
+ integration/<systemKey>/data/ Fixtures / source exports
65
+ role-assistant/ra-<roleKey>/ Role Assistant packages
66
+ .agents/skills/ Agent Kit skills (Cursor, Codex, Claude)
67
+ .cursor/plans/ Delivery plans
68
+ ```
69
+
70
+ As you add packages, list system keys and catalog roles in this README. Keep operational limits in each `integration/<systemKey>/README.md`.
71
+
72
+ ## Agent Kit
73
+
74
+ Install, coding hosts, auto-approve, and CLI auth: **[AGENTKIT.md](./AGENTKIT.md)**.
75
+
76
+ ```bash
77
+ aifabrix agent-kit status
78
+ aifabrix agent-kit validate
79
+ aifabrix agent-kit update
80
+ ```
81
+
82
+ `aifabrix agent-kit update` refreshes `AGENTKIT.md`. If this README is missing, install/update creates it. An existing README is never overwritten.
83
+
84
+ ## Docs
85
+
86
+ - [Agent Kit](./AGENTKIT.md) — hosts, install, auto-approve, CLI auth
87
+ - [Build AI-ready systems](https://docs.aifabrix.ai/docs/build-ai-ready-systems)
88
+ - [CLI workflow](https://docs.aifabrix.ai/docs/build-ai-ready-systems-validate-test-cli-workflow)
89
+ - [llms.txt](https://docs.aifabrix.ai/llms.txt)
@@ -13,7 +13,7 @@ ENV NODE_ENV=production \
13
13
  WORKDIR /app
14
14
 
15
15
  RUN apt-get update \
16
- && apt-get install -y --no-install-recommends dumb-init ca-certificates \
16
+ && apt-get install -y --no-install-recommends dumb-init ca-certificates curl \
17
17
  && rm -rf /var/lib/apt/lists/*
18
18
 
19
19
  COPY package.json package-lock.json ./
@@ -23,6 +23,8 @@ COPY docker-builder-api-staging/lib ./lib
23
23
  COPY docker-builder-api-staging/bin/builder-api-spike.js ./bin/builder-api-spike.js
24
24
  COPY docker-builder-api-staging/bin/builder-api-cleanup.js ./bin/builder-api-cleanup.js
25
25
  COPY docker-builder-api-staging/templates ./templates
26
+ # BID resource-type catalog + help fixtures (staged docs/builder-help only)
27
+ COPY docker-builder-api-staging/docs ./docs
26
28
 
27
29
  RUN addgroup --system appgroup \
28
30
  && adduser --system --ingroup appgroup --home /app appuser \
@@ -5,7 +5,7 @@ app:
5
5
  description: "AI Fabrix Dataplane is a secure, in-tenant integration and automation layer that supplies governed, normalized, and explainable enterprise data to AI agents. Using CIP as a declarative standard, it enforces RBAC and ABAC, executes integrations, and exposes trusted data via MCP and OpenAPI."
6
6
  type: webapp
7
7
  language: python # Explicitly specify Python language
8
- version: 2.0.47
8
+ version: 2.0.65
9
9
  # Image Configuration
10
10
  # Set tag to match your build (example: aifabrix build dataplane -t 1.0.0).
11
11
  # Registry is required so the controller can pull the image (avoids docker-not-found on the controller host).
@@ -71,7 +71,7 @@ build:
71
71
  envOutputPath: ../../.env # Copy to repo root for local dev
72
72
  language: python # Runtime language for template selection (typescript or python)
73
73
  # Dev reload: polling + watch /app/app only (avoids EMFILE on full repo bind-mount). See run_local.py, make af-reload.
74
- reloadStart: WATCHFILES_FORCE_POLLING=1 uvicorn app.main:app --host 0.0.0.0 --port ${PORT:-3001} --reload --reload-dir /app/app --timeout-graceful-shutdown 15
74
+ reloadStart: WATCHFILES_FORCE_POLLING=1 uvicorn app.main:app --host 0.0.0.0 --port ${PORT:-3001} --reload --reload-dir /app/app --reload-exclude tests --reload-exclude .temp --reload-exclude app-ui --timeout-graceful-shutdown 15
75
75
  # Pulled-image local compose (no bind-mount): drives `command` in generated docker-compose. Override for non-standard images (e.g. stub ACR tags).
76
76
  # Early ASGI (boot.api) binds PORT before heavy app.main import — Azure App Service warmup.
77
77
  imageRun: exec python -m uvicorn boot.api:app --host 0.0.0.0 --port ${PORT:-3001}
@@ -240,4 +240,3 @@ configuration:
240
240
  field: text
241
241
  label: "Default LLM provider (system key when two or more providers)"
242
242
  placeholder: "openai"
243
-
@@ -30,8 +30,8 @@ LOCAL_MODE=false
30
30
  # CELERY_WORKER_RUNTIME is set automatically by python -m app.core.celery_worker_main (NullPool per task).
31
31
  # CELERY_LOG_LEVEL=info
32
32
 
33
- # When API_KEY is set, a matching Bearer token bypasses OAuth2 validation
34
- # Same kv:// as miso-controller API_KEY so pipeline Bearer bypass uses one secrets.local entry
33
+ # When API_KEY is set, a matching Bearer token bypasses OAuth2 validation.
34
+ # Same kv:// as miso-controller API_KEY; Azure may leave this optional key empty.
35
35
  API_KEY=kv://miso-controller-secrets-apiKeyVault
36
36
  # Comma-separated realm roles attached to API_KEY bypass (JWT realm_access.roles). Default: operator.
37
37
  # Dev manual tests (437 governance, enterprise-llm llm.call): use full-access locally; restrict in tst/pro.
@@ -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
47
+ VERSION=2.0.65
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
@@ -258,7 +258,7 @@ DATAPLANE_PUBLIC_KEY_ID=
258
258
  CERTIFICATE_PRIVATE_KEY=kv://secrets-certificatePrivateKeyVault
259
259
  CERTIFICATE_PUBLIC_KEY=kv://secrets-certificatePublicKeyVault
260
260
  # Optional public key identifier for issued certificates; default if unset: dataplane-signing-key
261
- CERTIFICATE_PUBLIC_KEY_ID=dev01-dataplane-signing
261
+ CERTIFICATE_PUBLIC_KEY_ID=dataplane-signing-key
262
262
 
263
263
  # =============================================================================
264
264
  # VALIDATION ENGINE — YAML CONTRACTS
@@ -333,4 +333,4 @@ TRUST_AI_EXPOSURE_GATE_ENABLED=false
333
333
  # app/schemas/json/external-datasource.schema.json metadata.version. Set CERTIFICATION_RULES_VERSION
334
334
  # when 346.rules / §17 revisions must invalidate existing certificates without matching rulesVersion.
335
335
  CERTIFICATION_DATASOURCE_SCHEMA_VERSION=
336
- CERTIFICATION_RULES_VERSION=
336
+ CERTIFICATION_RULES_VERSION=
@@ -163,6 +163,34 @@ permissions:
163
163
  ]
164
164
  description: "Read the global Resource Type catalog (list/get)"
165
165
 
166
+ # Aspect catalog (read-only)
167
+ - name: "aspect:read"
168
+ roles:
169
+ [
170
+ "aifabrix-platform-admin",
171
+ "aifabrix-security-admin",
172
+ "aifabrix-deployment-admin",
173
+ "aifabrix-compliance-admin",
174
+ "aifabrix-developer",
175
+ "aifabrix-observer",
176
+ "aifabrix-ai-trust-operator",
177
+ ]
178
+ description: "Read the shared baseline Aspect catalog (list/get)"
179
+
180
+ # Knowledge Type catalog (read-only)
181
+ - name: "knowledge-type:read"
182
+ roles:
183
+ [
184
+ "aifabrix-platform-admin",
185
+ "aifabrix-security-admin",
186
+ "aifabrix-deployment-admin",
187
+ "aifabrix-compliance-admin",
188
+ "aifabrix-developer",
189
+ "aifabrix-observer",
190
+ "aifabrix-ai-trust-operator",
191
+ ]
192
+ description: "Read the Dataplane Knowledge Type catalog (list/get)"
193
+
166
194
  # Generic dataplane operations
167
195
  - name: "dataplane:read"
168
196
  roles: ["aifabrix-platform-admin", "aifabrix-security-admin", "aifabrix-deployment-admin", "aifabrix-compliance-admin", "aifabrix-developer", "aifabrix-observer"]
@@ -55,9 +55,9 @@ KC_HEALTH_ENABLED=true
55
55
  KC_HTTP_MANAGEMENT_HEALTH_ENABLED=false
56
56
  # Single-instance: use local cache so /health/ready passes (avoids Infinispan cluster check)
57
57
  KC_CACHE=local
58
- # Experimental OAuth Client ID Metadata Document (Keycloak 26.6+). Realm well-known
59
- # advertises client_id_metadata_document_supported. Rebuild the Keycloak image after change.
60
- KC_FEATURES=cimd
58
+ # Runtime features. Include cimd so Keycloak 26.7.2 advertises Client ID Metadata
59
+ # Documents. preview alone triggers a start-time rebuild that drops cimd.
60
+ KC_FEATURES=preview,cimd
61
61
 
62
62
  # =============================================================================
63
63
  # DATABASE CONFIGURATION
@@ -4,7 +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.43'
7
+ version: '2.0.66'
8
8
  # Image Configuration
9
9
  # Set tag to match your build (e.g. aifabrix build miso-controller -t 1.0.0 then tag: 1.0.0)
10
10
  # Registry is required so the controller can pull the image (avoids "docker: not found" on the controller host).
@@ -72,10 +72,29 @@ repository:
72
72
  #
73
73
  # NOT included (auto-configured):
74
74
  # - DATABASE_URL, REDIS_URL, KEYCLOAK_* → auto-generated during Azure install
75
- # - MISO_*, AZURE_*, kv:// → credentials and system parameters
75
+ # - Other MISO_*, AZURE_*, kv:// → credentials and system parameters
76
76
  # - PORT, NODE_ENV, MISO_ENVIRONMENT → set by deployment target
77
77
 
78
78
  configuration:
79
+ # -------------------------------------------------------------------------
80
+ # Security & browser session
81
+ # -------------------------------------------------------------------------
82
+ - name: MISO_APPLICATION_SECRETS_UI_ENABLED
83
+ category: Security
84
+ portalInput:
85
+ field: select
86
+ label: 'Enable Settings System Secrets tab'
87
+ options:
88
+ - 'false'
89
+ - 'true'
90
+
91
+ - name: AUTH_BROWSER_SESSION_TTL_SECONDS
92
+ category: Security
93
+ portalInput:
94
+ field: text
95
+ label: 'Browser Session Idle Timeout (seconds)'
96
+ placeholder: '1800'
97
+
79
98
  # -------------------------------------------------------------------------
80
99
  # Operations & Debugging
81
100
  # -------------------------------------------------------------------------
@@ -1,10 +1,24 @@
1
1
  # Environment Variables Template
2
2
  # Use kv:// references for secrets (resolved from secrets.local.yaml)
3
3
  # Use ${VAR} for environment-specific values
4
+ #
5
+ # =============================================================================
6
+ # HOW THIS FILE IS ORGANIZED (plan 220.0)
7
+ # =============================================================================
8
+ # One env.template, three documentation blocks. Every variable below is tagged:
9
+ #
10
+ # [always] applies to both hosted onboarding modes and local dev
11
+ # [saasDirect] eSystems-hosted SaaS activation (four-step wizard)
12
+ # [customerOwned] Azure-in-tenant activation (existing TA wizard)
13
+ #
14
+ # ONBOARDING_MODE selects the onboarding step list. It is orthogonal to DEPLOYMENT,
15
+ # which selects Azure SDK vs local execution. There is NO fifth DEPLOYMENT value:
16
+ # eSystems-hosted SaaS still runs DEPLOYMENT=azure. See the DEPLOYMENT TYPE and
17
+ # ONBOARDING MODE sections below.
4
18
 
5
19
 
6
20
  # =============================================================================
7
- # FIRST-TIME ONBOARDING CONFIGURATION
21
+ # FIRST-TIME ONBOARDING CONFIGURATION — [always]
8
22
  # =============================================================================
9
23
  #
10
24
  # Onboarding runs automatically when the database has no controller row (empty DB).
@@ -22,9 +36,10 @@
22
36
  SKIP_FIRST_TIME_SETUP=false
23
37
 
24
38
  # Force onboarding to run even when a controller row already exists (default: unset/false).
25
- # Use only when the DB already had a controller so onboarding was skipped and the admin
26
- # user was never created in the aifabrix realm. Set to true, restart controller once,
27
- # then set back to false so onboarding does not re-run on every start.
39
+ # Prefer SQL/API one-shot: POST /api/v1/controller/force-onboarding (controller:admin) or set
40
+ # controllers.configuration.setup.forceOnboarding=true — no App Service restart required.
41
+ # Env FORCE_ONBOARDING still works as bootstrap-only when you must restart: set true, restart once,
42
+ # then set back to false. This is NOT a Tenant Activation wizard reset (does not clear activation JSON).
28
43
  # FORCE_ONBOARDING=true
29
44
 
30
45
  # Optional custom controller key for onboarding (default: miso-controller)
@@ -44,17 +59,21 @@ ONBOARDING_ADMIN_PASSWORD=kv://miso-controller-admin-passwordKeyVault
44
59
  # Optional admin email for onboarding (default: admin@aifabrix.ai)
45
60
  ONBOARDING_ADMIN_EMAIL=kv://miso-controller-admin-emailKeyVault
46
61
 
47
- # Create development environment during onboarding (default: false)
62
+ # [customerOwned] Create development environment during onboarding (default: false)
48
63
  # Full platform: create miso, dev, tst, and pro during onboarding (default: false)
49
64
  # When true, supersedes ONBOARDING_CREATE_DEV_ENV for which extra environments are created
65
+ # [saasDirect] Keep false in the customer container — extra environments belong to the
66
+ # eSystems deploy path, not the customer wizard.
50
67
  ONBOARDING_FULL_PLATFORM=false
51
68
 
52
- # When true, run Azure env deploy for onboarding envs (SDK modules). Default false —
69
+ # [customerOwned] When true, run Azure env deploy for onboarding envs (SDK modules). Default false —
53
70
  # Marketplace already provisions infra; TA owns customer env deploy.
71
+ # [saasDirect] Keep false: eSystems already deployed the required runtime services.
54
72
  ONBOARDING_CREATE_MISO_ENV=false
55
73
 
56
- # Set to true to create both miso and dev environments during onboarding
74
+ # [customerOwned] Set to true to create both miso and dev environments during onboarding
57
75
  # When false (default), only the miso environment is created (ignored when ONBOARDING_FULL_PLATFORM=true)
76
+ # [saasDirect] Keep false in the customer container.
58
77
  ONBOARDING_CREATE_DEV_ENV=true
59
78
 
60
79
  # =============================================================================
@@ -127,7 +146,9 @@ REDIS_PERMISSIONS_TTL=900
127
146
  KEYCLOAK_REALM=aifabrix
128
147
  # Public issuer / browser URL (includes /auth when Keycloak uses KC_HTTP_RELATIVE_PATH=/auth).
129
148
  KEYCLOAK_SERVER_URL=url://keycloak-public
130
- # Internal token/JWKS calls: url://keycloak-internal (includes /auth when Keycloak uses KC_HTTP_RELATIVE_PATH).
149
+ # Internal token/JWKS calls use url://keycloak-internal.
150
+ # In Traefik/front-door mode, virtual directory mapping supplies relative path semantics.
151
+ # Do not append /auth again when frontDoorRouting is /auth/* — /auth/auth 404s.
131
152
  KEYCLOAK_INTERNAL_SERVER_URL=url://keycloak-internal
132
153
  # Docker/internal host and port: used when config from DB has localhost (getDockerKeycloakInternalUrl).
133
154
  # Resolved from env-config (e.g. KEYCLOAK_HOST=keycloak, KEYCLOAK_PORT=8080 for docker).
@@ -145,8 +166,19 @@ KEYCLOAK_DEFAULT_PASSWORD=kv://keycloak-default-passwordKeyVault
145
166
  # Password setup for new local users (plan 209.0)
146
167
  # email = send invitation email so the user sets their own password (default)
147
168
  # admin-reveal = show a one-time temporary password to the admin (labs / no mail)
169
+ # [saasDirect] MUST be `email` — the customer activates its own administrator account from the
170
+ # Keycloak UPDATE_PASSWORD invitation; eSystems never distributes a password.
171
+ # [customerOwned] `admin-reveal` is allowed only in labs.
148
172
  IDENTITY_LOCAL_PASSWORD_MODE=admin-reveal
149
173
 
174
+ # =============================================================================
175
+ # MANAGED NOTIFICATION EMAIL (Miso -> Mori REST)
176
+ # =============================================================================
177
+ # Both onboarding modes use Mori's AI Fabrix-owned sender. MORI_API_KEY below is the
178
+ # existing installation service key; no notification-specific secret is created.
179
+ NOTIFICATION_BINDING=aifabrixManaged
180
+ MORI_ENVIRONMENT_ID=
181
+
150
182
  # Keycloak Events Configuration
151
183
  KEYCLOAK_EVENTS_ENABLED=true
152
184
  KEYCLOAK_EVENTS_VERIFY_SIGNATURE=true
@@ -188,8 +220,11 @@ MISO_CLIENTSECRET=kv://miso-controller-client-secretKeyVault
188
220
  CONTROLLER_EVALUATION=
189
221
 
190
222
  # =============================================================================
191
- # ENTRA ID ONBOARDING (vendor multi-tenant app — admin consent)
223
+ # ENTRA ID ONBOARDING (vendor multi-tenant app — admin consent) — [always]
192
224
  # =============================================================================
225
+ # Kept in the shared block because EITHER mode may install Entra later from the plan 219
226
+ # provider catalogue: Azure hosting does not force Entra, and SaaS may choose it.
227
+ #
193
228
  # AI Fabrix vendor app for TA-1 admin consent and Entra ID configure flows.
194
229
  # Same ENTRA_ID_CLIENT_ID / ENTRA_ID_CLIENT_SECRET on every deployment.
195
230
  # Customer SSO after configure uses a separate enterprise app (AI Fabrix Miso);
@@ -202,13 +237,16 @@ CONTROLLER_EVALUATION=
202
237
  #
203
238
  # Delegated Graph (second redirect URI on the same vendor app): see section below.
204
239
  ENTRA_CALLBACK_STATE_SECRET=kv://entra-callback-state-secret
205
- ENTRA_ID_CENTRAL_CALLBACK_URI=https://aifabrix-pro-mori-web-we.azurewebsites.net/entra-id-concent/callback
240
+ ENTRA_ID_CENTRAL_CALLBACK_URI=https://aifabrix-pro-miso-mori.azurewebsites.net/entra-id-concent/callback
206
241
  ENTRA_ID_CLIENT_ID=kv://entra-client-idKeyVault
207
242
  ENTRA_ID_CLIENT_SECRET=kv://entra-client-secretKeyVault
208
243
 
209
244
  # =============================================================================
210
- # TENANT ACTIVATION (TA-3) — EXISTING LLM CATALOG
245
+ # TENANT ACTIVATION (TA-3) — EXISTING LLM CATALOG — [customerOwned]
211
246
  # =============================================================================
247
+ # [saasDirect] Omit this block entirely: the SaaS wizard has no Access Model step and
248
+ # creates no LLM resources.
249
+ #
212
250
  # Optional JSON array for GET /api/v1/tenant/existing-llm-configurations (and
213
251
  # access-model.existingLlmConfigurations). Merge order: env entries first, then
214
252
  # entries derived from saved activation LLM (same id in saved overrides).
@@ -220,23 +258,32 @@ ENTRA_ID_CLIENT_SECRET=kv://entra-client-secretKeyVault
220
258
  # EXISTING_LLM_CONFIGURATIONS=
221
259
 
222
260
  # =============================================================================
223
- # AZURE AD PROVIDER CONFIGURATION
261
+ # AZURE AD PROVIDER CONFIGURATION — [always]
224
262
  # =============================================================================
263
+ # [customerOwned] These are the customer subscription credentials collected by the TA wizard.
264
+ # [saasDirect] Present on the eSystems HOST controller so eSystems can deploy the hosted
265
+ # environment. They are never collected from, or shown to, the SaaS customer.
225
266
 
226
267
  AZURE_SUBSCRIPTION_ID=kv://azure-subscription-idKeyVault
227
268
  TENANT_ID=kv://azure-tenant-idKeyVault
228
269
  AZURE_SERVICE_NAME=kv://azure-service-nameKeyVault
229
- AZURE_CLIENT_ID=kv://azure-client-idKeyVault
230
- AZURE_CLIENT_SECRET=kv://azure-client-secretKeyVault
270
+ # Azure App Service uses managed identity through DefaultAzureCredential.
271
+ # Optional local service-principal overrides may be supplied in the runtime .env:
272
+ # AZURE_CLIENT_ID=
273
+ # AZURE_CLIENT_SECRET=
231
274
 
232
275
  # When true, environment infrastructure deploy skips the ai.azureOpenAI module (no new Cognitive Services account).
276
+ # [customerOwned] default false — Azure OpenAI is created only when the customer selects it.
277
+ # [saasDirect] leave unset or set true: the minimal SaaS baseline never creates Cognitive Services.
278
+ # When unset, ONBOARDING_MODE=saasDirect already defaults this to true.
233
279
  SKIP_AZURE_OPENAI=false
234
280
 
235
- # When true, environment deploy skips Postgres ARM/KV updates if the flexible server already exists (marketplace redeploy).
281
+ # [customerOwned] When true, environment deploy skips Postgres ARM/KV updates if the flexible server
282
+ # already exists (marketplace redeploy).
236
283
  SKIP_DB_REDEPLOY=true
237
284
 
238
285
  # =============================================================================
239
- # DEPLOYMENT TYPE
286
+ # DEPLOYMENT TYPE — [always]
240
287
  # =============================================================================
241
288
  # azure — Real Azure resources + tenant activation wizard until completed
242
289
  # azure-mock — Mock Azure SDK; dashboard after login (no wizard)
@@ -245,14 +292,28 @@ SKIP_DB_REDEPLOY=true
245
292
  #
246
293
  # Missing or invalid value defaults to azure (wizard + Azure credentials).
247
294
  # Bootstrap (SKIP_FIRST_TIME_SETUP=false) is separate from the activation wizard.
295
+ # NOTE: there is no `saas` value. eSystems-hosted SaaS runs DEPLOYMENT=azure with
296
+ # ONBOARDING_MODE=saasDirect (see next section).
248
297
  DEPLOYMENT=database
249
298
 
250
- # Dev/test: open /tenant-activation on Platform Apps (last step). Default false.
251
- # Does not skip server-side TA — use only when env is already activated/deployed.
252
- TA_SKIP_TO_APP_DEPLOY=false
299
+ # =============================================================================
300
+ # ONBOARDING MODE — [always]
301
+ # =============================================================================
302
+ # Orthogonal to DEPLOYMENT (Azure SDK vs local). Selects the onboarding step list
303
+ # served by GET /api/v1/tenant/status and rendered by the wizard stepper.
304
+ #
305
+ # customerOwned = Azure-in-tenant wizard
306
+ # consent → identity → size → access-model → endpoint → validation
307
+ # saasDirect = eSystems-hosted activation
308
+ # consent → identity → endpoint (domain only) → review
309
+ # Omits size, access-model, customer deploy and platform-apps.
310
+ #
311
+ # Unset defaults to customerOwned. An unknown value fails closed with HTTP 400.
312
+ ONBOARDING_MODE=customerOwned
253
313
 
254
314
  # Dev/test: show TA Entra "Completing setup" countdown (120s cap). Default false.
255
315
  # Exposed to UI via GET /api/v1/tenant/status → showTaCountdown (restart controller after change).
316
+ # [saasDirect] Omit — there is no TA Entra countdown in the SaaS wizard.
256
317
  SHOW_TA_COUNT_DOWN=false
257
318
 
258
319
  # =============================================================================
@@ -270,15 +331,25 @@ BOOTSTRAP_APPKEYS=dataplane,builder-api
270
331
  # When false (default), uses local AES-256-GCM encryption with ENCRYPTION_KEY
271
332
  KEY_VAULT_ENABLED=false
272
333
 
334
+ # Show Settings > System Secrets in the portal (runtime feature flag).
335
+ MISO_APPLICATION_SECRETS_UI_ENABLED=false
336
+
337
+ # Sliding browser-session idle timeout (30 minutes).
338
+ AUTH_BROWSER_SESSION_TTL_SECONDS=1800
339
+
273
340
  # JWT Configuration (for client token generation)
274
341
  JWT_SECRET=kv://miso-controller-jwt-secretKeyVault
275
342
 
276
- # When API_KEY is set, a matching Bearer token bypasses OAuth2 validation
343
+ # When API_KEY is set, a matching Bearer token bypasses OAuth2 validation.
344
+ # The key is optional: local environments may set it; Azure may leave it empty.
277
345
  API_KEY=kv://miso-controller-secrets-apiKeyVault
278
346
 
279
347
  # =============================================================================
280
- # LICENSE CONFIGURATION
348
+ # LICENSE CONFIGURATION — [always]
281
349
  # =============================================================================
350
+ # [saasDirect] Must use the Mori flow (never DEVELOPMENT): Mori issues and owns the
351
+ # 30-day STANDARD / M trial, and sales later updates the same subscription.
352
+ #
282
353
  # Offline JWT license (optional):
283
354
  # - If set, controller validates license offline (RS256) without Mori subscription status call.
284
355
  # - Value can be literal JWT or kv:// reference.
@@ -294,8 +365,8 @@ LICENSE_JWT=kv://miso-controller-jwt-licenseKeyVault
294
365
  # ENTRA ID ONBOARDING (delegated Graph via Mori)
295
366
  # =============================================================================
296
367
  # Must match a Web redirect URI on the vendor multi-tenant app and Mori’s route
297
- # …/entra-graph-delegated/callback. Shared pro Mori (CICD):
298
- ENTRA_GRAPH_DELEGATED_REDIRECT_URI=https://aifabrix-pro-mori-web-we.azurewebsites.net/entra-graph-delegated/callback
368
+ # …/entra-graph-delegated/callback. Shared pro Mori addon (CICD *-miso-rg):
369
+ ENTRA_GRAPH_DELEGATED_REDIRECT_URI=https://aifabrix-pro-miso-mori.azurewebsites.net/entra-graph-delegated/callback
299
370
 
300
371
  # Optional delegated Graph scopes for GET …/graph-auth-url (space- or comma-separated).
301
372
  # ENTRA_GRAPH_DELEGATED_SCOPES=https://graph.microsoft.com/Application.ReadWrite.All,https://graph.microsoft.com/Group.ReadWrite.All,https://graph.microsoft.com/Synchronization.ReadWrite.All,openid,profile,offline_access
@@ -310,7 +381,7 @@ ENTRA_GRAPH_DELEGATED_REDIRECT_URI=https://aifabrix-pro-mori-web-we.azurewebsite
310
381
  # only works when a local Mori app is registered and running for this developer.
311
382
  # MORI_CALLBACK_API_KEY must be the same secret as Mori MORI_CONTROLLER_CALLBACK_API_KEY
312
383
  # (both resolve from kv://mori-callback-api-keyKeyVault — do not generate separate values).
313
- MORI_BASE_URL=https://aifabrix-pro-mori-web-we.azurewebsites.net
384
+ MORI_BASE_URL=https://aifabrix-pro-miso-mori.azurewebsites.net
314
385
  MORI_AUTH_METHOD=kv://mori-controller-auth-methodKeyVault
315
386
  MORI_CALLBACK_API_KEY=kv://mori-callback-api-keyKeyVault
316
387
  MORI_API_KEY=kv://mori-controller-api-keyKeyVault
@@ -325,7 +396,7 @@ MORI_PASSWORD=kv://mori-controller-basic-passwordKeyVault
325
396
 
326
397
  LOG_TO_FILE=true
327
398
  LOG_LEVEL=info
328
- LOG_FILE_PATH=./logs
399
+ LOG_FILE_PATH=/mnt/data/logs
329
400
 
330
401
  # =============================================================================
331
402
  # OPENTELEMETRY CONFIGURATION
@@ -34,6 +34,11 @@ roles:
34
34
  description: 'Read-only access to monitoring, logs, and compliance reports'
35
35
  groups: ['AI-Fabrix-Observers']
36
36
 
37
+ - name: 'AI Fabrix Everyone'
38
+ value: 'aifabrix-everyone'
39
+ description: 'Authenticated-user consume access for Enterprise LLM and platform search (not a Role Assistant)'
40
+ groups: ['AI-Fabrix-Everyone']
41
+
37
42
  permissions:
38
43
  # Integration clients (Keycloak OIDC clients + control-plane metadata)
39
44
  - name: 'integration-client:create'
@@ -8,6 +8,7 @@ When Claude is activated, AI Fabrix must be self-describing enough that Claude o
8
8
 
9
9
  - Name
10
10
  - Server URL (Runtime MCP)
11
+ - Authentication: OAuth (the Runtime MCP requires sign-in; Claude’s form defaults to none)
11
12
 
12
13
  Claude then discovers protected-resource metadata, the authorization server, scopes, PKCE `S256`, and client registration. Pre-created `miso-claude` copy-paste is the fallback when discovery does not advertise registration.
13
14
 
@@ -24,6 +25,8 @@ Public Anthropic connector auth: https://claude.com/docs/connectors/building/aut
24
25
 
25
26
  Claude.ai web, Claude Desktop, Cowork, and mobile use the same account-level custom connector. Remote MCP is brokered by Anthropic, not by a local `claude_desktop_config.json`.
26
27
 
28
+ The Runtime MCP returns **401** without a user token. In Claude connector settings, Authentication must be **OAuth** (require sign-in). If the connector is saved as “not requiring sign-in”, Claude reports that mismatch (HTTP 401) and an `ofid_…` support reference. Edit the connector, set OAuth, then Connect.
29
+
27
30
  ## Claude-owned remaining steps
28
31
 
29
32
  Add the custom connector (Owners on Team or Enterprise), authenticate/consent, and enable it. There is no documented Anthropic API for those steps.
@@ -50,7 +50,7 @@
50
50
  "displayLabel": "Claude",
51
51
  "category": "employee-ai",
52
52
  "wizardOrder": 32,
53
- "remainingManualStep": "Add the custom connector (Owners for Team or Enterprise), authenticate, and enable it.",
53
+ "remainingManualStep": "Add the custom connector (Owners for Team or Enterprise), set Authentication to OAuth, authenticate, and enable it.",
54
54
  "docsAnchor": "claude",
55
55
  "approvalRequired": true,
56
56
  "vendorAuthRequired": true
@@ -17,5 +17,6 @@ When ready:
17
17
  2. Add a custom connector with:
18
18
  Name: {{appName}}
19
19
  Server URL: {{{mcpUrl}}}
20
+ Authentication: OAuth
20
21
 
21
22
  AI Fabrix validates Runtime and OAuth automatically.
@@ -50,7 +50,7 @@
50
50
  "displayLabel": "Claude",
51
51
  "category": "employee-ai",
52
52
  "wizardOrder": 32,
53
- "remainingManualStep": "Add the custom connector (Owners for Team or Enterprise), authenticate, and enable it.",
53
+ "remainingManualStep": "Add the custom connector (Owners for Team or Enterprise), set Authentication to OAuth, authenticate, and enable it.",
54
54
  "docsAnchor": "claude",
55
55
  "approvalRequired": true,
56
56
  "vendorAuthRequired": true
@@ -147,6 +147,17 @@
147
147
  }
148
148
  }
149
149
  },
150
+ {
151
+ "name": "ENABLE_MCP_SERVER",
152
+ "value": "false",
153
+ "location": "variable",
154
+ "required": false,
155
+ "portalInput": {
156
+ "field": "select",
157
+ "label": "MCP server",
158
+ "options": ["true", "false"]
159
+ }
160
+ },
150
161
  {
151
162
  "name": "ENABLE_PROACTIVE_MESSAGING",
152
163
  "value": "true",
@@ -25,6 +25,15 @@ Complete remaining Slack steps in this order:
25
25
 
26
26
  `aifabrix channel add` prints the filled URLs for your app. Do not paste client secrets into this file.
27
27
 
28
+ {{#if enableMcpServer}}
29
+ ## MCP server
30
+
31
+ This Slack app is also an MCP client of AI Fabrix Runtime. Connect the **AI Fabrix MCP server** in Slack, then sign in at **AI Fabrix** when Slack asks.
32
+
33
+ The Slack bot token and signing secret stay inbound Events and slash-command auth. They are not the MCP bearer. Do not paste an Integration Client secret into this file.
34
+
35
+ {{/if}}
36
+
28
37
  The command may ask **Onboard users?** Yes matches Slack profile email to an existing platform user email and stores the mapping. Unmatched people still use **Link account**. Non-interactive: `--onboard-users` or `--no-onboard-users`. `--force` does not re-onboard unless you pass `--onboard-users` or answer yes again.
29
38
 
30
39
  Optional validation:
@@ -147,6 +147,17 @@
147
147
  }
148
148
  }
149
149
  },
150
+ {
151
+ "name": "ENABLE_MCP_SERVER",
152
+ "value": "false",
153
+ "location": "variable",
154
+ "required": false,
155
+ "portalInput": {
156
+ "field": "select",
157
+ "label": "MCP server",
158
+ "options": ["true", "false"]
159
+ }
160
+ },
150
161
  {
151
162
  "name": "ENABLE_PROACTIVE_MESSAGING",
152
163
  "value": "true",
@@ -54,7 +54,8 @@
54
54
  "im:read",
55
55
  "im:write",
56
56
  "users:read",
57
- "users:read.email"
57
+ "users:read.email"{{#if enableMcpServer}},
58
+ "mcp:connect"{{/if}}
58
59
  ]
59
60
  },
60
61
  "pkce_enabled": false
@@ -74,6 +75,8 @@
74
75
  "org_deploy_enabled": true,
75
76
  "socket_mode_enabled": false,
76
77
  "token_rotation_enabled": {{slackTokenRotationEnabled}},
77
- "is_mcp_enabled": false
78
- }
78
+ "is_mcp_enabled": {{#if enableMcpServer}}true{{else}}false{{/if}}
79
+ }{{#if slackMcpServersJson}},
80
+ "mcp_servers": {{{slackMcpServersJson}}},
81
+ "external_auth_providers": {{{slackExternalAuthJson}}}{{/if}}
79
82
  }