@aifabrix/builder 2.54.1 → 2.55.0

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 (210) 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 +130 -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 +239 -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/state-file.js +83 -0
  23. package/lib/agent-kit/status.js +50 -0
  24. package/lib/agent-kit/v1-detect.js +81 -0
  25. package/lib/agent-kit/validate-kit.js +87 -0
  26. package/lib/agent-kit/workspace-name.js +40 -0
  27. package/lib/agent-kit/workspace-skeleton.js +103 -0
  28. package/lib/api/role-assistant-test-pack.api.js +86 -0
  29. package/lib/api/work-search.api.js +31 -4
  30. package/lib/api/work.api.js +19 -12
  31. package/lib/app/list-external-systems.js +2 -1
  32. package/lib/app/show-display.js +33 -6
  33. package/lib/app/show.js +25 -2
  34. package/lib/channels/add-channel.js +1 -0
  35. package/lib/channels/approval-guides/claude.js +2 -2
  36. package/lib/channels/channel-add-failure.js +1 -0
  37. package/lib/channels/channel-add-remaining.js +15 -9
  38. package/lib/channels/channel-definition-status.js +115 -0
  39. package/lib/channels/channel-description.js +2 -1
  40. package/lib/channels/channel-install-envelope.js +4 -2
  41. package/lib/channels/channel-integration-generator.js +2 -0
  42. package/lib/channels/channel-runtime-resolver.js +14 -0
  43. package/lib/channels/channel-targets.js +31 -5
  44. package/lib/channels/claude-setup-values.js +4 -1
  45. package/lib/channels/slack-channel-add.js +59 -6
  46. package/lib/channels/slack-mcp-callback.js +51 -0
  47. package/lib/channels/slack-mcp-runtime.js +156 -0
  48. package/lib/channels/slack-provisioning/install-cli.js +14 -2
  49. package/lib/channels/slack-provisioning/with-curl-on-path.js +6 -1
  50. package/lib/cli/index.js +4 -0
  51. package/lib/cli/setup-certification-commands.js +2 -2
  52. package/lib/cli/setup-certification.help.js +3 -1
  53. package/lib/commands/agent-kit-help.js +79 -0
  54. package/lib/commands/agent-kit.js +346 -0
  55. package/lib/commands/channel-add-help.js +5 -5
  56. package/lib/commands/datasource-capability-relate-cli.js +5 -4
  57. package/lib/commands/repair-auth-apply.js +1 -1
  58. package/lib/commands/repair-datasource-key-skip.js +39 -0
  59. package/lib/commands/repair-datasource-keys.js +24 -12
  60. package/lib/commands/repair-rbac.js +16 -10
  61. package/lib/commands/role-assistant-copy-output.js +61 -0
  62. package/lib/commands/role-assistant-copy.js +155 -0
  63. package/lib/commands/role-assistant-test-output.js +8 -9
  64. package/lib/commands/role-assistant-test-result-rows.js +42 -0
  65. package/lib/commands/role-assistant.js +117 -48
  66. package/lib/commands/search.js +143 -0
  67. package/lib/commands/test-trust-external.js +7 -5
  68. package/lib/commands/upload-sidecar-followups.js +4 -1
  69. package/lib/commands/verify-operations-skip-e2e.js +131 -0
  70. package/lib/commands/verify-operations-step-plan.js +6 -33
  71. package/lib/commands/verify-operations-steps.js +3 -1
  72. package/lib/datasource/capability/relate-operations.js +28 -10
  73. package/lib/datasource/capability/run-capability-relate.js +48 -25
  74. package/lib/datasource/datasource-identifier.js +13 -5
  75. package/lib/deployment/deployer-poll-run.js +117 -35
  76. package/lib/external-system/deploy-dataplane-published.js +70 -0
  77. package/lib/external-system/deploy.js +12 -2
  78. package/lib/external-system/download-role-assistant.js +41 -15
  79. package/lib/external-system/download.js +7 -1
  80. package/lib/generator/wizard-datasource-key.js +54 -0
  81. package/lib/generator/wizard.js +55 -54
  82. package/lib/integration-definition/apply-datasource-keys.js +75 -0
  83. package/lib/integration-definition/apply-relationships.js +195 -0
  84. package/lib/integration-definition/apply-static-enterprise.js +229 -0
  85. package/lib/integration-definition/apply-system-file.js +71 -0
  86. package/lib/integration-definition/apply-test-endpoint.js +89 -0
  87. package/lib/integration-definition/apply-viewpoint-defaults.js +157 -0
  88. package/lib/integration-definition/apply.js +78 -59
  89. package/lib/integration-definition/enrich-openapi-operations.js +36 -10
  90. package/lib/integration-definition/enrich-openapi-pick.js +87 -0
  91. package/lib/lifecycle/role-assistant-governance.js +56 -21
  92. package/lib/programmatic/capability-registry.js +1 -0
  93. package/lib/programmatic/index.js +2 -0
  94. package/lib/programmatic/openapi-apply-result-schemas.js +8 -0
  95. package/lib/programmatic/openapi-channel-install-schemas.js +4 -1
  96. package/lib/programmatic/openapi-component-schemas.js +1 -0
  97. package/lib/programmatic/openapi-descriptions.js +9 -3
  98. package/lib/programmatic/openapi-envelope-examples.js +7 -0
  99. package/lib/programmatic/openapi-operation-bindings.js +5 -0
  100. package/lib/programmatic/openapi-request-schemas.js +5 -0
  101. package/lib/programmatic/openapi-schema-descriptions-channel.js +8 -5
  102. package/lib/programmatic/openapi-schema-descriptions-operations.js +19 -0
  103. package/lib/programmatic/openapi-spec.js +1 -0
  104. package/lib/programmatic/request-timeout.js +3 -0
  105. package/lib/programmatic/route-handler-map.js +7 -0
  106. package/lib/programmatic/run-channel-catalog.js +50 -8
  107. package/lib/programmatic/run-channel-install-options.js +5 -1
  108. package/lib/programmatic/run-download.js +41 -0
  109. package/lib/protection/auth-context.js +3 -1
  110. package/lib/protection/protection-display.js +3 -2
  111. package/lib/protection/report-exit.js +50 -0
  112. package/lib/protection/run-commands.js +2 -0
  113. package/lib/role-assistant/package-validate.js +175 -0
  114. package/lib/role-assistant/test-case-assertion-row.js +36 -0
  115. package/lib/role-assistant/test-case-copy-bind.js +77 -0
  116. package/lib/role-assistant/test-case-copy-expected.js +127 -0
  117. package/lib/role-assistant/test-case-copy-from-work.js +90 -0
  118. package/lib/role-assistant/test-case-copy-interactions.js +67 -0
  119. package/lib/role-assistant/test-case-copy.js +119 -0
  120. package/lib/role-assistant/test-case-expected-catalog.js +135 -0
  121. package/lib/role-assistant/test-case-validate.js +88 -0
  122. package/lib/role-assistant/test-cases-bid.js +117 -4
  123. package/lib/role-assistant/test-cases-evaluate.js +137 -30
  124. package/lib/role-assistant/test-cases-honesty.js +155 -6
  125. package/lib/role-assistant/test-cases-lifecycle.js +291 -0
  126. package/lib/role-assistant/test-cases-search-graph.js +122 -0
  127. package/lib/role-assistant/test-cases-search.js +20 -2
  128. package/lib/role-assistant/test-cases.js +34 -168
  129. package/lib/role-assistant/test-pack-map.js +180 -0
  130. package/lib/role-assistant/test-pack-sync.js +187 -0
  131. package/lib/role-assistant/test-runner-debug.js +54 -0
  132. package/lib/role-assistant/test-runner-respond-body.js +36 -0
  133. package/lib/role-assistant/test-runner-search.js +20 -5
  134. package/lib/role-assistant/test-runner-start-payload.js +63 -10
  135. package/lib/role-assistant/test-runner-workhub-answers.js +45 -16
  136. package/lib/role-assistant/test-runner-workhub.js +45 -21
  137. package/lib/role-assistant/test-runner.js +50 -10
  138. package/lib/schema/external-datasource.schema.json +36 -5
  139. package/lib/schema/external-system.schema.json +20 -2
  140. package/lib/schema/role-assistant-test-case.schema.json +408 -0
  141. package/lib/search/dataplane-context.js +23 -0
  142. package/lib/search/search-args.js +211 -0
  143. package/lib/search/search-display.js +238 -0
  144. package/lib/search/search-errors.js +50 -0
  145. package/lib/search/search-prompts.js +119 -0
  146. package/lib/search/search-roles.js +85 -0
  147. package/lib/search/search-run.js +241 -0
  148. package/lib/search/search-skills.js +198 -0
  149. package/lib/utils/authentication-slot-show.js +153 -0
  150. package/lib/utils/credential-display.js +43 -1
  151. package/lib/utils/external-system-readiness-compact-blocks.js +5 -1
  152. package/lib/utils/external-system-readiness-compact-display.js +30 -1
  153. package/lib/utils/external-system-validators.js +2 -1
  154. package/lib/utils/help-builder.js +3 -1
  155. package/lib/utils/schema-loader.js +37 -0
  156. package/lib/validation/validate-external-file.js +5 -1
  157. package/lib/validation/validate.js +3 -2
  158. package/package.json +1 -1
  159. package/templates/agent-kit/adapters/claude/nested.CLAUDE.md +1 -0
  160. package/templates/agent-kit/adapters/claude/root.CLAUDE.md +5 -0
  161. package/templates/agent-kit/adapters/cursor/commands/cust-0-plan.md +5 -0
  162. package/templates/agent-kit/adapters/cursor/commands/cust-1-validate.md +5 -0
  163. package/templates/agent-kit/adapters/cursor/commands/cust-2-build.md +5 -0
  164. package/templates/agent-kit/adapters/cursor/commands/cust-3-push.md +5 -0
  165. package/templates/agent-kit/adapters/cursor/commands/cust-biz-1-validate.md +5 -0
  166. package/templates/agent-kit/adapters/cursor/commands/cust-biz-2-build.md +5 -0
  167. package/templates/agent-kit/adapters/cursor/commands/cust-biz-3-prove.md +5 -0
  168. package/templates/agent-kit/agent-kit.yaml +45 -0
  169. package/templates/agent-kit/instructions/AGENTKIT.md +83 -0
  170. package/templates/agent-kit/instructions/integration.AGENTS.md +25 -0
  171. package/templates/agent-kit/instructions/role-assistant.AGENTS.md +22 -0
  172. package/templates/agent-kit/instructions/root.AGENTS.md +37 -0
  173. package/templates/agent-kit/parity-inventory.yaml +188 -0
  174. package/templates/agent-kit/skills/aifabrix-connected-system/SKILL.md +58 -0
  175. package/templates/agent-kit/skills/aifabrix-connected-system/references/contract-checklist.md +40 -0
  176. package/templates/agent-kit/skills/aifabrix-connected-system/references/delivery-gates.md +54 -0
  177. package/templates/agent-kit/skills/aifabrix-connected-system/references/production-safety.md +35 -0
  178. package/templates/agent-kit/skills/aifabrix-connected-system/scripts/reserved-system-key.js +19 -0
  179. package/templates/agent-kit/skills/aifabrix-plan/SKILL.md +51 -0
  180. package/templates/agent-kit/skills/aifabrix-plan/references/challenge-checklist.md +108 -0
  181. package/templates/agent-kit/skills/aifabrix-plan/references/interaction.md +34 -0
  182. package/templates/agent-kit/skills/aifabrix-plan/references/plan-template.md +182 -0
  183. package/templates/agent-kit/skills/aifabrix-prove/SKILL.md +50 -0
  184. package/templates/agent-kit/skills/aifabrix-prove/references/demo-template.md +65 -0
  185. package/templates/agent-kit/skills/aifabrix-prove/references/evidence-lifecycle.md +68 -0
  186. package/templates/agent-kit/skills/aifabrix-prove/references/learning-template.md +66 -0
  187. package/templates/agent-kit/skills/aifabrix-role-assistant/SKILL.md +42 -0
  188. package/templates/agent-kit/skills/aifabrix-role-assistant/references/package-boundary.md +21 -0
  189. package/templates/agent-kit/skills/shared/hosts.md +78 -0
  190. package/templates/agent-kit/workspace/.cursor/plans/README.md +22 -0
  191. package/templates/agent-kit/workspace/LICENSE.mit +21 -0
  192. package/templates/agent-kit/workspace/README.md +89 -0
  193. package/templates/applications/builder-api/Dockerfile +3 -1
  194. package/templates/applications/dataplane/application.yaml +2 -2
  195. package/templates/applications/dataplane/env.template +1 -1
  196. package/templates/applications/dataplane/rbac.yaml +28 -0
  197. package/templates/applications/keycloak/env.template +3 -3
  198. package/templates/applications/miso-controller/application.yaml +1 -1
  199. package/templates/applications/miso-controller/env.template +8 -9
  200. package/templates/channels/claude/TROUBLESHOOTING.md +3 -0
  201. package/templates/channels/claude/channel.json +1 -1
  202. package/templates/channels/claude/install.template.md.hbs +1 -0
  203. package/templates/channels/claude/integration/claude-system.json +1 -1
  204. package/templates/channels/slack/channel.json +11 -0
  205. package/templates/channels/slack/install.template.md.hbs +9 -0
  206. package/templates/channels/slack/integration/slack-system.json +11 -0
  207. package/templates/channels/slack/manifest.template.json.hbs +6 -3
  208. package/templates/channels/teams-bot/channel.json +1 -0
  209. package/templates/python/docker-compose.hbs +14 -0
  210. 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. In a terminal here, run `aifabrix auth status`. If you are not authenticated, run `aifabrix login` (the agent cannot log in for you).
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.56
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}
@@ -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.56
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
@@ -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.51'
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).
@@ -22,9 +22,10 @@
22
22
  SKIP_FIRST_TIME_SETUP=false
23
23
 
24
24
  # 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.
25
+ # Prefer SQL/API one-shot: POST /api/v1/controller/force-onboarding (controller:admin) or set
26
+ # controllers.configuration.setup.forceOnboarding=true — no App Service restart required.
27
+ # Env FORCE_ONBOARDING still works as bootstrap-only when you must restart: set true, restart once,
28
+ # then set back to false. This is NOT a Tenant Activation wizard reset (does not clear activation JSON).
28
29
  # FORCE_ONBOARDING=true
29
30
 
30
31
  # Optional custom controller key for onboarding (default: miso-controller)
@@ -127,7 +128,9 @@ REDIS_PERMISSIONS_TTL=900
127
128
  KEYCLOAK_REALM=aifabrix
128
129
  # Public issuer / browser URL (includes /auth when Keycloak uses KC_HTTP_RELATIVE_PATH=/auth).
129
130
  KEYCLOAK_SERVER_URL=url://keycloak-public
130
- # Internal token/JWKS calls: url://keycloak-internal (includes /auth when Keycloak uses KC_HTTP_RELATIVE_PATH).
131
+ # Internal token/JWKS calls use url://keycloak-internal.
132
+ # In Traefik/front-door mode, virtual directory mapping supplies relative path semantics.
133
+ # Do not append /auth again when frontDoorRouting is /auth/* — /auth/auth 404s.
131
134
  KEYCLOAK_INTERNAL_SERVER_URL=url://keycloak-internal
132
135
  # Docker/internal host and port: used when config from DB has localhost (getDockerKeycloakInternalUrl).
133
136
  # Resolved from env-config (e.g. KEYCLOAK_HOST=keycloak, KEYCLOAK_PORT=8080 for docker).
@@ -247,10 +250,6 @@ SKIP_DB_REDEPLOY=true
247
250
  # Bootstrap (SKIP_FIRST_TIME_SETUP=false) is separate from the activation wizard.
248
251
  DEPLOYMENT=database
249
252
 
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
253
-
254
253
  # Dev/test: show TA Entra "Completing setup" countdown (120s cap). Default false.
255
254
  # Exposed to UI via GET /api/v1/tenant/status → showTaCountdown (restart controller after change).
256
255
  SHOW_TA_COUNT_DOWN=false
@@ -325,7 +324,7 @@ MORI_PASSWORD=kv://mori-controller-basic-passwordKeyVault
325
324
 
326
325
  LOG_TO_FILE=true
327
326
  LOG_LEVEL=info
328
- LOG_FILE_PATH=./logs
327
+ LOG_FILE_PATH=/mnt/data/logs
329
328
 
330
329
  # =============================================================================
331
330
  # OPENTELEMETRY CONFIGURATION
@@ -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
  }
@@ -136,6 +136,7 @@
136
136
  "configurable": true
137
137
  },
138
138
  "experimental": false,
139
+ "status": "coming-soon",
139
140
  "maxInstances": 1,
140
141
  "profiles": [],
141
142
  "packaging": {
@@ -160,6 +160,13 @@ services:
160
160
  {{#if devMountPath}}
161
161
  volumes:
162
162
  - {{devMountPath}}:/app
163
+ {{#if requiresStorage}}
164
+ {{#if localDataMountPath}}
165
+ - {{localDataMountPath}}:/mnt/data
166
+ {{else}}
167
+ - {{#if (eq devId 0)}}aifabrix_{{app.key}}_data{{else}}aifabrix_dev{{devId}}_{{app.key}}_data{{/if}}:/mnt/data
168
+ {{/if}}
169
+ {{/if}}
163
170
  user: "${AIFABRIX_UID:-1000}:${AIFABRIX_GID:-1000}"
164
171
  {{/if}}
165
172
  depends_on:
@@ -188,6 +195,13 @@ services:
188
195
  {{#if devMountPath}}
189
196
  volumes:
190
197
  - {{devMountPath}}:/app
198
+ {{#if requiresStorage}}
199
+ {{#if localDataMountPath}}
200
+ - {{localDataMountPath}}:/mnt/data
201
+ {{else}}
202
+ - {{#if (eq devId 0)}}aifabrix_{{app.key}}_data{{else}}aifabrix_dev{{devId}}_{{app.key}}_data{{/if}}:/mnt/data
203
+ {{/if}}
204
+ {{/if}}
191
205
  user: "${AIFABRIX_UID:-1000}:${AIFABRIX_GID:-1000}"
192
206
  {{/if}}
193
207
  depends_on:
@@ -160,6 +160,13 @@ services:
160
160
  {{#if devMountPath}}
161
161
  volumes:
162
162
  - {{devMountPath}}:/app
163
+ {{#if requiresStorage}}
164
+ {{#if localDataMountPath}}
165
+ - {{localDataMountPath}}:/mnt/data
166
+ {{else}}
167
+ - {{#if (eq devId 0)}}aifabrix_{{app.key}}_data{{else}}aifabrix_dev{{devId}}_{{app.key}}_data{{/if}}:/mnt/data
168
+ {{/if}}
169
+ {{/if}}
163
170
  user: "${AIFABRIX_UID:-1000}:${AIFABRIX_GID:-1000}"
164
171
  {{/if}}
165
172
  depends_on:
@@ -186,6 +193,13 @@ services:
186
193
  {{#if devMountPath}}
187
194
  volumes:
188
195
  - {{devMountPath}}:/app
196
+ {{#if requiresStorage}}
197
+ {{#if localDataMountPath}}
198
+ - {{localDataMountPath}}:/mnt/data
199
+ {{else}}
200
+ - {{#if (eq devId 0)}}aifabrix_{{app.key}}_data{{else}}aifabrix_dev{{devId}}_{{app.key}}_data{{/if}}:/mnt/data
201
+ {{/if}}
202
+ {{/if}}
189
203
  user: "${AIFABRIX_UID:-1000}:${AIFABRIX_GID:-1000}"
190
204
  {{/if}}
191
205
  depends_on: