@aifabrix/builder 2.55.0 → 2.56.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 (101) hide show
  1. package/lib/agent-kit/host-approve.js +48 -6
  2. package/lib/agent-kit/init.js +2 -2
  3. package/lib/agent-kit/remote-prompts.js +46 -13
  4. package/lib/agent-kit/run.js +1 -1
  5. package/lib/agent-kit/start.js +310 -0
  6. package/lib/api/pipeline.api.js +32 -3
  7. package/lib/app/deploy.js +13 -9
  8. package/lib/app/offer-create-from-template.js +184 -0
  9. package/lib/cli/setup-app.js +15 -7
  10. package/lib/cli/setup-auth.js +11 -2
  11. package/lib/cli/setup-external-system-help.js +15 -3
  12. package/lib/cli/setup-external-system.js +21 -3
  13. package/lib/commands/agent-kit-help.js +74 -4
  14. package/lib/commands/agent-kit.js +83 -12
  15. package/lib/commands/auth-status-user.js +99 -0
  16. package/lib/commands/auth-status.js +14 -4
  17. package/lib/commands/datasource-load-export-cli.js +7 -2
  18. package/lib/commands/datasource-test-trust-cli.js +5 -1
  19. package/lib/commands/governance-command-action.js +5 -4
  20. package/lib/commands/identity-membership-role-cache.js +6 -1
  21. package/lib/commands/lifecycle-command-action.js +16 -15
  22. package/lib/commands/login-credentials.js +8 -3
  23. package/lib/commands/login-device.js +14 -5
  24. package/lib/commands/login.js +14 -1
  25. package/lib/commands/logout.js +50 -15
  26. package/lib/commands/repair-datasource-auto-rbac.js +4 -9
  27. package/lib/commands/role-assistant.js +24 -12
  28. package/lib/commands/upload-openapi-sync-followup.js +59 -0
  29. package/lib/commands/upload-qualification-client.js +131 -0
  30. package/lib/commands/upload-qualification-followups.js +104 -0
  31. package/lib/commands/upload-qualification-poll.js +143 -0
  32. package/lib/commands/upload.js +37 -156
  33. package/lib/commands/verify-governance-command-action.js +9 -7
  34. package/lib/commands/verify-operations-command-action.js +9 -8
  35. package/lib/commands/verify-trust-command-action.js +6 -5
  36. package/lib/deployment/deploy-poll-ui.js +14 -10
  37. package/lib/deployment/deployer-status.js +4 -4
  38. package/lib/external-system/deploy.js +46 -51
  39. package/lib/external-system/download.js +1 -2
  40. package/lib/generator/helpers.js +14 -46
  41. package/lib/generator/index.js +0 -4
  42. package/lib/integration-definition/apply-static-enterprise.js +5 -2
  43. package/lib/programmatic/builder-api-request.js +8 -4
  44. package/lib/programmatic/capability-registry.js +2 -0
  45. package/lib/programmatic/get-deploy-status.js +45 -0
  46. package/lib/programmatic/get-upload-status.js +45 -0
  47. package/lib/programmatic/http-accepted-response.js +31 -0
  48. package/lib/programmatic/openapi-descriptions.js +14 -4
  49. package/lib/programmatic/request-timeout.js +21 -15
  50. package/lib/programmatic/route-handler-map.js +6 -0
  51. package/lib/programmatic/run-deploy.js +7 -3
  52. package/lib/programmatic/run-upload.js +11 -7
  53. package/lib/role-assistant/knowledge-sync-settings-push.js +172 -0
  54. package/lib/role-assistant/knowledge-sync.js +9 -126
  55. package/lib/role-assistant/test-cases-evaluate.js +12 -1
  56. package/lib/role-assistant/test-cases-evidence.js +44 -5
  57. package/lib/role-assistant/test-cases-lifecycle.js +9 -3
  58. package/lib/role-assistant/test-runner.js +3 -0
  59. package/lib/schema/infra-parameter.schema.json +51 -3
  60. package/lib/schema/infra.parameter.yaml +482 -47
  61. package/lib/schema/type/document-storage.json +1 -1
  62. package/lib/utils/api-required-permissions.js +271 -0
  63. package/lib/utils/api.js +16 -13
  64. package/lib/utils/cli-json-exit.js +41 -0
  65. package/lib/utils/cli-utils.js +26 -7
  66. package/lib/utils/controller-url.js +78 -4
  67. package/lib/utils/deployment-errors.js +15 -0
  68. package/lib/utils/deployment-validation-helpers.js +4 -1
  69. package/lib/utils/device-code.js +31 -10
  70. package/lib/utils/error-formatters/error-parser.js +16 -1
  71. package/lib/utils/error-formatters/permission-errors.js +19 -5
  72. package/lib/utils/keycloak-realm-ready.js +5 -2
  73. package/lib/utils/logger.js +1 -0
  74. package/lib/utils/paths.js +26 -5
  75. package/lib/utils/qualification-poll-ui.js +136 -0
  76. package/lib/utils/secrets-helpers.js +2 -2
  77. package/lib/utils/write-stream-and-wait.js +63 -0
  78. package/package.json +22 -7
  79. package/templates/agent-kit/agent-kit.yaml +1 -1
  80. package/templates/agent-kit/instructions/AGENTKIT.md +25 -4
  81. package/templates/agent-kit/instructions/root.AGENTS.md +1 -1
  82. package/templates/agent-kit/skills/aifabrix-connected-system/SKILL.md +2 -1
  83. package/templates/agent-kit/skills/aifabrix-connected-system/references/delivery-gates.md +1 -1
  84. package/templates/agent-kit/skills/aifabrix-plan/SKILL.md +2 -1
  85. package/templates/agent-kit/skills/aifabrix-prove/SKILL.md +1 -0
  86. package/templates/agent-kit/skills/aifabrix-role-assistant/SKILL.md +1 -0
  87. package/templates/agent-kit/skills/shared/hosts.md +13 -26
  88. package/templates/agent-kit/skills/shared/login.md +16 -0
  89. package/templates/agent-kit/workspace/README.md +1 -1
  90. package/templates/applications/builder-api/env.template +4 -0
  91. package/templates/applications/dataplane/application.yaml +1 -2
  92. package/templates/applications/dataplane/env.template +5 -5
  93. package/templates/applications/keycloak/Dockerfile +12 -5
  94. package/templates/applications/keycloak/application.yaml +2 -2
  95. package/templates/applications/keycloak/cimd-lenient-parse/AbstractClientIdMetadataDocumentExecutor.java +3 -3
  96. package/templates/applications/keycloak/cimd-lenient-parse/SOURCE.md +6 -6
  97. package/templates/applications/keycloak/env.template +13 -1
  98. package/templates/applications/miso-controller/application.yaml +21 -2
  99. package/templates/applications/miso-controller/env.template +97 -28
  100. package/templates/applications/miso-controller/rbac.yaml +5 -0
  101. package/lib/generator/deploy-manifest-azure-kv.js +0 -81
@@ -2,7 +2,7 @@
2
2
 
3
3
  Use this workspace from **Cursor**, **Claude Code**, and **Codex**. Skills live in `.agents/skills/`. Invoke `/aifabrix-*` in Cursor and Claude Code, and `$aifabrix-*` in Codex.
4
4
 
5
- Install and sign-in steps are in `AGENTKIT.md`. This file is how to **run** each host on a local machine or over SSH.
5
+ Install and sign-in steps are in `AGENTKIT.md`. This file is how to **run** each host on a local machine or over SSH. Builder CLI login from chat: [login.md](login.md).
6
6
 
7
7
  Do not start Claude or Codex in your home directory. `cd` into this git workspace first.
8
8
 
@@ -13,7 +13,7 @@ Do not start Claude or Codex in your home directory. `cd` into this git workspac
13
13
  - Claude Code: `.claude/settings.local.json` (`permissions.defaultMode` = `bypassPermissions`, `allow` = `Bash(aifabrix *)` and `Read(~/**)`)
14
14
  - Codex: `.codex/config.toml` (`approval_policy = "never"`, `sandbox_mode = "workspace-write"`)
15
15
 
16
- Those files stay in **this workspace**. Claude may **read** files under the developer home (`Read(~/**)`) and run the delivery CLI (`Bash(aifabrix *)`). They do not add sibling folders as extra workspaces, do not grant Write outside this repo, and do not allow every shell command. TTY asks (default yes). `--yes` or a non-TTY / `--json` run writes them. `--skip-approve-all` skips. `--force` overwrites existing local files. Builder never writes `~/.claude` or `~/.codex`.
16
+ Those files stay in **this workspace**. Claude may **read** files under the developer home (`Read(~/**)`) and run the delivery CLI (`Bash(aifabrix *)`). They do not add sibling folders as extra workspaces, do not grant Write outside this repo, and do not allow every shell command. TTY asks which host to auto-approve when both are selected. `--approve-all claude` or `--approve-all codex` writes only that host. `--yes` or a non-TTY / `--json` run writes them. `--skip-approve-all` skips. `--force` overwrites existing local files. Builder never writes `~/.claude` or `~/.codex`.
17
17
 
18
18
  ## Cursor
19
19
 
@@ -23,48 +23,35 @@ Those files stay in **this workspace**. Claude may **read** files under the deve
23
23
 
24
24
  ## Claude Code
25
25
 
26
- **Local.**
26
+ **Local or SSH — tmux.** Closing the terminal must not kill Claude. Agent Kit starts Claude **inside tmux**. `--remote-control` is the **same** session on this PC, [claude.ai/code](https://claude.ai/code), and the Claude mobile app (**Code**). Do not use `claude --cloud` for this — that starts a different machine that clones GitHub. Claude `--tmux` is only for `--worktree` sessions, not this wrapper.
27
27
 
28
28
  ```bash
29
- cd /path/to/this-workspace
30
- claude
31
- ```
32
-
33
- Then `/aifabrix-plan` (or another `/aifabrix-*` skill). First run in a project asks you to trust the folder; accept only this workspace.
34
-
35
- **SSH (keep the session after you disconnect).** tmux holds the process on the remote machine:
36
-
37
- ```bash
38
- tmux new -s claude -c /path/to/this-workspace
39
- claude --remote-control
29
+ aifabrix agent-kit start claude --remote-control --approve-all --yes
40
30
  ```
41
31
 
42
- Detach without killing Claude: `Ctrl-b` then `d`. Reattach: `tmux attach -t claude`.
32
+ tmux session name is this folder (for example `aifabrix-docs`). Remote Control name is `hostname-user-folder` (for example `builder01-dev03-aifabrix-docs`). `--name` overrides the folder. Several workspaces can run at once. Detach without killing Claude: `Ctrl-b` then `d`. Reattach: `tmux attach -t aifabrix-docs`, or run `start` again from the same folder. Then `/aifabrix-plan` (or another `/aifabrix-*` skill). First run in a project asks you to trust the folder; accept only this workspace.
43
33
 
44
- **Phone and web.** `--remote-control` (or `claude remote-control` in server mode) publishes the same session to [claude.ai/code](https://claude.ai/code) and the Claude mobile app (**Code**). Press space in server mode for a QR code. In an interactive session, `/remote-control` or `/mobile`. Requires a Claude Pro/Max/Team login (`claude auth login`), not an API key.
34
+ **Phone and PC.** Sign in with the same Claude Pro/Max/Team account (`claude auth login` — not an API key). After Remote Control starts, open **Code** in the Claude mobile app and/or [claude.ai/code](https://claude.ai/code) on the PC. In an already-running session, `/remote-control` or `/mobile`.
45
35
 
46
- Closing SSH does not stop a tmux session. Stopping tmux or the machine does.
36
+ Closing the terminal (or SSH) does not stop a tmux session. Stopping tmux or the machine does. Remote Control also stops if this host goes down.
47
37
 
48
38
  ## Codex
49
39
 
50
- **Local.**
40
+ **Local or SSH — tmux (recommended).** Same recipe on your PC and on a remote host. tmux keeps Codex running if you close the terminal or disconnect SSH. Codex has no Claude-style phone/web Remote Control.
51
41
 
52
42
  ```bash
53
- cd /path/to/this-workspace
54
- codex
43
+ aifabrix agent-kit start codex --approve-all --yes
55
44
  ```
56
45
 
57
- Then `$aifabrix-plan` (and the other `$aifabrix-*` skills). Codex reads `AGENTS.md`.
46
+ Equivalent: `tmux new -s aifabrix-docs -c /path/to/this-workspace` then `codex`. Default `--name` is the last folder. If that session already exists, `start` attaches. Detach: `Ctrl-b` then `d`. Then `$aifabrix-plan` (and the other `$aifabrix-*` skills). Codex reads `AGENTS.md`.
58
47
 
59
- **SSH (keep the session after you disconnect).**
48
+ **Foreground only (no tmux).**
60
49
 
61
50
  ```bash
62
- tmux new -s codex -c /path/to/this-workspace
51
+ cd /path/to/this-workspace
63
52
  codex
64
53
  ```
65
54
 
66
- Detach: `Ctrl-b` then `d`. Reattach: `tmux attach -t codex`. Codex has no Claude-style phone/web Remote Control; stay in tmux (or reattach later) to see the session.
67
-
68
55
  ## tmux cheat sheet
69
56
 
70
57
  | Action | Keys / command |
@@ -75,4 +62,4 @@ Detach: `Ctrl-b` then `d`. Reattach: `tmux attach -t codex`. Codex has no Claude
75
62
  | Attach | `tmux attach -t <name>` |
76
63
  | Kill session | `tmux kill-session -t <name>` |
77
64
 
78
- Use separate session names (`claude` vs `codex`) if both run on the same host.
65
+ Use a different `--name` per workspace so several Claude or Codex sessions can run on the same host. Claude and Codex in the **same** folder also need two names.
@@ -0,0 +1,16 @@
1
+ # Delivery CLI login (no terminal)
2
+
3
+ Before any online Builder command (`deploy`, `upload`, `role list`, `show --online`):
4
+
5
+ 1. Run `aifabrix auth status`. If authenticated, continue.
6
+ 2. If not, ask the user in chat for the Miso Controller URL. Do not invent it. Paste whatever they give you; extra path segments are ignored.
7
+ 3. Run (environment **dev** unless they named another):
8
+
9
+ ```bash
10
+ aifabrix login --method device -c <url> -e dev
11
+ ```
12
+
13
+ 4. As soon as the command prints **Open this URL to authenticate:**, copy that full URL into chat and ask the user to open it and approve. Do not ask them to use a terminal.
14
+ 5. Leave the login command running until it reports success (or fails). Then run `aifabrix auth status` again.
15
+
16
+ On 401 later, repeat this flow once, then retry the original command.
@@ -9,7 +9,7 @@ Vendor limits, credentials, designated test subjects, and PII live only in each
9
9
  ## How to start
10
10
 
11
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).
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
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
14
 
15
15
  ### How to use prompts
@@ -37,6 +37,10 @@ DATAPLANE_URL=url://dataplane-internal
37
37
  # Public: Slack/Teams/ChatGPT callbacks, packages, and portal remaining-step URLs
38
38
  DATAPLANE_PUBLIC_URL=url://dataplane-public
39
39
 
40
+ # Self URLs: internal service calls and public links generated by Builder API
41
+ BUILDER_API_URL=url://internal
42
+ BUILDER_API_PUBLIC_URL=url://public
43
+
40
44
  DEFAULT_ENVIRONMENT=dev
41
45
 
42
46
  # Browser Origin allowlist for portal calls (CORS). url:// expands at resolve.
@@ -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.56
8
+ version: 2.0.68
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).
@@ -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.56
47
+ VERSION=2.0.68
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=
@@ -1,29 +1,34 @@
1
1
  # Keycloak Identity and Access Management with Custom Themes
2
- # Official 26.7.2 distro + experimental CIMD. Does not compile Keycloak from source.
2
+ # Official 26.7.3 distro + experimental CIMD. Does not compile Keycloak from source.
3
3
  # One class is recompiled against this image's jars:
4
4
  # - PR 51235: CIMD parse ignores unknown JSON fields (ChatGPT client.json)
5
5
  # - #50362: strip jwt-bearer (and other confidential-only grants) on public CIMD
6
6
  # 26.7 advertises token_endpoint_auth_methods_supported "none" for Claude CIMD.
7
7
 
8
- FROM quay.io/keycloak/keycloak:26.7.2 AS keycloak-base
8
+ FROM quay.io/keycloak/keycloak:26.7.3 AS keycloak-base
9
9
 
10
10
  FROM eclipse-temurin:21-jdk-jammy AS cimd-patch
11
11
  COPY --from=keycloak-base /opt/keycloak/lib/lib/main /opt/kc-jars/main
12
12
  COPY --from=keycloak-base /opt/keycloak/lib/lib/boot /opt/kc-jars/boot
13
13
  COPY cimd-lenient-parse/AbstractClientIdMetadataDocumentExecutor.java \
14
14
  /tmp/src/org/keycloak/protocol/oauth2/cimd/clientpolicy/executor/AbstractClientIdMetadataDocumentExecutor.java
15
+ COPY mori-email-sender/com /tmp/src/com
16
+ COPY mori-email-sender/META-INF /tmp/mori-provider/META-INF
15
17
  RUN mkdir -p /tmp/classes \
16
18
  && find /opt/kc-jars -name '*.jar' | paste -sd: - > /tmp/cp.txt \
17
19
  && { \
18
20
  echo --release; echo 21; echo -cp; cat /tmp/cp.txt; echo -d; echo /tmp/classes; \
19
21
  echo /tmp/src/org/keycloak/protocol/oauth2/cimd/clientpolicy/executor/AbstractClientIdMetadataDocumentExecutor.java; \
22
+ find /tmp/src/com -name '*.java'; \
20
23
  } > /tmp/javac.args \
21
24
  && javac @/tmp/javac.args \
22
25
  && SERVICES_JAR=$(ls /opt/kc-jars/main/org.keycloak.keycloak-services-*.jar) \
23
26
  && cp "$SERVICES_JAR" /tmp/keycloak-services-patched.jar \
24
- && jar uf /tmp/keycloak-services-patched.jar -C /tmp/classes .
27
+ && jar uf /tmp/keycloak-services-patched.jar -C /tmp/classes org/keycloak \
28
+ && cp -r /tmp/classes/com /tmp/mori-provider/ \
29
+ && jar cf /tmp/mori-email-sender.jar -C /tmp/mori-provider .
25
30
 
26
- FROM quay.io/keycloak/keycloak:26.7.2
31
+ FROM quay.io/keycloak/keycloak:26.7.3
27
32
 
28
33
  # Set working directory
29
34
  WORKDIR /opt/keycloak
@@ -31,6 +36,7 @@ WORKDIR /opt/keycloak
31
36
  # Copy custom themes from share directory (only if themes/ folder exists)
32
37
  USER root
33
38
  COPY --from=cimd-patch /tmp/keycloak-services-patched.jar /tmp/keycloak-services-patched.jar
39
+ COPY --from=cimd-patch /tmp/mori-email-sender.jar /opt/keycloak/providers/mori-email-sender.jar
34
40
  RUN SERVICES_JAR=$(ls /opt/keycloak/lib/lib/main/org.keycloak.keycloak-services-*.jar) \
35
41
  && cp /tmp/keycloak-services-patched.jar "$SERVICES_JAR" \
36
42
  && rm /tmp/keycloak-services-patched.jar
@@ -50,7 +56,8 @@ RUN if [ -d "/tmp/build-context/themes" ] && [ "$(ls -A /tmp/build-context/theme
50
56
  # Build Keycloak with health checks enabled (similar to Keycloak 24.0)
51
57
  # This enables the /health, /health/live, /health/ready, and /health/started endpoints
52
58
  # Expose health endpoints on main HTTP port (like 24.0) instead of management port
53
- RUN /opt/keycloak/bin/kc.sh build --health-enabled=true --http-management-health-enabled=false --features=cimd
59
+ RUN /opt/keycloak/bin/kc.sh build --health-enabled=true --http-management-health-enabled=false \
60
+ --features=cimd --spi-email-sender--provider=mori
54
61
 
55
62
  # Switch back to keycloak user
56
63
  USER keycloak
@@ -4,12 +4,12 @@ app:
4
4
  displayName: 'AI Fabrix Keycloak'
5
5
  description: 'Identity and Access Management'
6
6
  type: webapp
7
- version: '26.7.2'
7
+ version: '26.7.3-aifabrix.1'
8
8
 
9
9
  # Image Configuration
10
10
  image:
11
11
  name: aifabrix/keycloak
12
- tag: 'latest'
12
+ tag: '26.7.3-aifabrix.1'
13
13
  registry: aifabrixacr.azurecr.io
14
14
  registryMode: external
15
15
 
@@ -1,6 +1,6 @@
1
1
  package org.keycloak.protocol.oauth2.cimd.clientpolicy.executor;
2
2
 
3
- // AI Fabrix Keycloak image patch on 26.7.2 (not a Keycloak source build):
3
+ // AI Fabrix Keycloak image patch on 26.7.3 (not a Keycloak source build):
4
4
  // 1) PR 51235 — ignore unknown CIMD JSON fields (ChatGPT client.json).
5
5
  // 2) keycloak#50362 / PR 50411 idea — drop confidential-only grants (jwt-bearer)
6
6
  // from public CIMD metadata so Claude hosted Connect can register.
@@ -848,7 +848,7 @@ public abstract class AbstractClientIdMetadataDocumentExecutor<CONFIG extends Ab
848
848
 
849
849
  /**
850
850
  * Grant types Keycloak's DescriptionConverter refuses on a public client.
851
- * Same set as Keycloak PR 50411 (not in 26.7.2).
851
+ * Same set as Keycloak PR 50411 (not in 26.7.3).
852
852
  */
853
853
  protected static final Set<String> CONFIDENTIAL_ONLY_GRANT_TYPES = new LinkedHashSet<>(Arrays.asList(
854
854
  OAuth2Constants.CLIENT_CREDENTIALS,
@@ -873,7 +873,7 @@ public abstract class AbstractClientIdMetadataDocumentExecutor<CONFIG extends Ab
873
873
 
874
874
  /**
875
875
  * RFC 7591 §3.2.1 lets the AS replace requested grant_types. Claude CIMD is public
876
- * (`none`) plus jwt-bearer; Keycloak 26.7.2 rejects that combination (#50362).
876
+ * (`none`) plus jwt-bearer; Keycloak 26.7.3 rejects that combination (#50362).
877
877
  */
878
878
  protected void stripConfidentialOnlyGrantsForPublicClient(OIDCClientRepresentation oidcClient) {
879
879
  if (!"none".equals(oidcClient.getTokenEndpointAuthMethod())) {
@@ -1,19 +1,19 @@
1
- # CIMD image patch (Keycloak 26.7.2)
1
+ # CIMD image patch (Keycloak 26.7.3)
2
2
 
3
- This directory is **not** a Keycloak source build. `aifabrix build keycloak` still starts from `quay.io/keycloak/keycloak:26.7.2`. A Docker stage recompiles this one class against that image’s jars and injects it into `org.keycloak.keycloak-services-*.jar` before `kc.sh build`.
3
+ This directory is **not** a Keycloak source build. `aifabrix build keycloak` still starts from `quay.io/keycloak/keycloak:26.7.3`. A Docker stage recompiles this one class against that image’s jars and injects it into `org.keycloak.keycloak-services-*.jar` before `kc.sh build`.
4
4
 
5
- Upstream file: `services/.../AbstractClientIdMetadataDocumentExecutor.java` @ tag `26.7.2` (Apache 2.0).
5
+ Upstream file: `services/.../AbstractClientIdMetadataDocumentExecutor.java` @ tag `26.7.3` (Apache 2.0).
6
6
 
7
7
  ## Lenient parse (ChatGPT)
8
8
 
9
9
  ChatGPT’s CIMD `client.json` includes extra fields (for example `token_endpoint_auth_methods_supported`) that Keycloak 26.7.x rejects because CIMD parse uses Jackson `FAIL_ON_UNKNOWN_PROPERTIES`.
10
10
 
11
- - [keycloak/keycloak#51235](https://github.com/keycloak/keycloak/pull/51235) (open; not in 26.7.2)
11
+ - [keycloak/keycloak#51235](https://github.com/keycloak/keycloak/pull/51235) (open; not in 26.7.3)
12
12
 
13
13
  ## Public client + jwt-bearer (Claude hosted)
14
14
 
15
- Claude’s CIMD is a public client (`token_endpoint_auth_method: none`) that also lists `urn:ietf:params:oauth:grant-type:jwt-bearer`. Keycloak 26.7.2 then fails authorize with `JWT authorization grant cannot be enabled in a public client` ([#50362](https://github.com/keycloak/keycloak/issues/50362)). Official [PR 50411](https://github.com/keycloak/keycloak/pull/50411) is still a draft and defaults the filter **off**. This image always drops confidential-only grants on public CIMD metadata (RFC 7591 §3.2.1), which is enough for hosted Claude Connect (authorization_code). It does **not** implement public-client JWT Authorization Grant / EMA.
15
+ Claude’s CIMD is a public client (`token_endpoint_auth_method: none`) that also lists `urn:ietf:params:oauth:grant-type:jwt-bearer`. Keycloak 26.7.3 then fails authorize with `JWT authorization grant cannot be enabled in a public client` ([#50362](https://github.com/keycloak/keycloak/issues/50362)). Official [PR 50411](https://github.com/keycloak/keycloak/pull/50411) is still a draft and defaults the filter **off**. This image always drops confidential-only grants on public CIMD metadata (RFC 7591 §3.2.1), which is enough for hosted Claude Connect (authorization_code). It does **not** implement public-client JWT Authorization Grant / EMA.
16
16
 
17
- 26.7.2 already advertises `token_endpoint_auth_methods_supported` `"none"` when `--features=cimd`.
17
+ 26.7.3 already advertises `token_endpoint_auth_methods_supported` `"none"` when `--features=cimd`.
18
18
 
19
19
  Drop this patched class when the consumed `quay.io` tag includes both behaviors.
@@ -55,7 +55,7 @@ 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
- # Runtime features. Include cimd so Keycloak 26.7.2 advertises Client ID Metadata
58
+ # Runtime features. Include cimd so Keycloak 26.7.3 advertises Client ID Metadata
59
59
  # Documents. preview alone triggers a start-time rebuild that drops cimd.
60
60
  KC_FEATURES=preview,cimd
61
61
 
@@ -67,6 +67,18 @@ KC_FEATURES=preview,cimd
67
67
  MISO_CLIENTID=kv://keycloak-client-idKeyVault
68
68
  MISO_CLIENTSECRET=kv://keycloak-client-secretKeyVault
69
69
 
70
+ # =============================================================================
71
+ # MANAGED ACTION EMAIL (Keycloak -> Mori REST)
72
+ # =============================================================================
73
+ # The custom EmailSenderProvider relays Keycloak-rendered signed action emails to
74
+ # Mori. It never receives ACS credentials and never sends the action URL to Miso.
75
+ # Installation must supply the Mori environment returned during registration.
76
+ MORI_BASE_URL=kv://mori-controller-web-server-url
77
+ MORI_ENVIRONMENT_ID=kv://mori-controller-environment-idKeyVault
78
+ MORI_API_KEY=kv://mori-controller-api-keyKeyVault
79
+ MORI_NOTIFICATION_TIMEOUT_MS=10000
80
+ MORI_NOTIFICATION_MAX_ATTEMPTS=2
81
+
70
82
  # Connects to postgres service in Docker network (postgres) or localhost (local)
71
83
 
72
84
  KC_DB=postgres
@@ -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.51'
7
+ version: '2.0.78'
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).
@@ -45,17 +59,21 @@ ONBOARDING_ADMIN_PASSWORD=kv://miso-controller-admin-passwordKeyVault
45
59
  # Optional admin email for onboarding (default: admin@aifabrix.ai)
46
60
  ONBOARDING_ADMIN_EMAIL=kv://miso-controller-admin-emailKeyVault
47
61
 
48
- # Create development environment during onboarding (default: false)
62
+ # [customerOwned] Create development environment during onboarding (default: false)
49
63
  # Full platform: create miso, dev, tst, and pro during onboarding (default: false)
50
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.
51
67
  ONBOARDING_FULL_PLATFORM=false
52
68
 
53
- # 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 —
54
70
  # Marketplace already provisions infra; TA owns customer env deploy.
71
+ # [saasDirect] Keep false: eSystems already deployed the required runtime services.
55
72
  ONBOARDING_CREATE_MISO_ENV=false
56
73
 
57
- # 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
58
75
  # When false (default), only the miso environment is created (ignored when ONBOARDING_FULL_PLATFORM=true)
76
+ # [saasDirect] Keep false in the customer container.
59
77
  ONBOARDING_CREATE_DEV_ENV=true
60
78
 
61
79
  # =============================================================================
@@ -148,8 +166,19 @@ KEYCLOAK_DEFAULT_PASSWORD=kv://keycloak-default-passwordKeyVault
148
166
  # Password setup for new local users (plan 209.0)
149
167
  # email = send invitation email so the user sets their own password (default)
150
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.
151
172
  IDENTITY_LOCAL_PASSWORD_MODE=admin-reveal
152
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=kv://mori-controller-environment-idKeyVault
181
+
153
182
  # Keycloak Events Configuration
154
183
  KEYCLOAK_EVENTS_ENABLED=true
155
184
  KEYCLOAK_EVENTS_VERIFY_SIGNATURE=true
@@ -191,8 +220,11 @@ MISO_CLIENTSECRET=kv://miso-controller-client-secretKeyVault
191
220
  CONTROLLER_EVALUATION=
192
221
 
193
222
  # =============================================================================
194
- # ENTRA ID ONBOARDING (vendor multi-tenant app — admin consent)
223
+ # ENTRA ID ONBOARDING (vendor multi-tenant app — admin consent) — [always]
195
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
+ #
196
228
  # AI Fabrix vendor app for TA-1 admin consent and Entra ID configure flows.
197
229
  # Same ENTRA_ID_CLIENT_ID / ENTRA_ID_CLIENT_SECRET on every deployment.
198
230
  # Customer SSO after configure uses a separate enterprise app (AI Fabrix Miso);
@@ -205,13 +237,16 @@ CONTROLLER_EVALUATION=
205
237
  #
206
238
  # Delegated Graph (second redirect URI on the same vendor app): see section below.
207
239
  ENTRA_CALLBACK_STATE_SECRET=kv://entra-callback-state-secret
208
- ENTRA_ID_CENTRAL_CALLBACK_URI=https://aifabrix-pro-mori-web-we.azurewebsites.net/entra-id-concent/callback
240
+ ENTRA_ID_CENTRAL_CALLBACK_URI=https://dev01.aifabrix.dev/mori/entra-id-concent/callback
209
241
  ENTRA_ID_CLIENT_ID=kv://entra-client-idKeyVault
210
242
  ENTRA_ID_CLIENT_SECRET=kv://entra-client-secretKeyVault
211
243
 
212
244
  # =============================================================================
213
- # TENANT ACTIVATION (TA-3) — EXISTING LLM CATALOG
245
+ # TENANT ACTIVATION (TA-3) — EXISTING LLM CATALOG — [customerOwned]
214
246
  # =============================================================================
247
+ # [saasDirect] Omit this block entirely: the SaaS wizard has no Access Model step and
248
+ # creates no LLM resources.
249
+ #
215
250
  # Optional JSON array for GET /api/v1/tenant/existing-llm-configurations (and
216
251
  # access-model.existingLlmConfigurations). Merge order: env entries first, then
217
252
  # entries derived from saved activation LLM (same id in saved overrides).
@@ -223,23 +258,32 @@ ENTRA_ID_CLIENT_SECRET=kv://entra-client-secretKeyVault
223
258
  # EXISTING_LLM_CONFIGURATIONS=
224
259
 
225
260
  # =============================================================================
226
- # AZURE AD PROVIDER CONFIGURATION
261
+ # AZURE AD PROVIDER CONFIGURATION — [always]
227
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.
228
266
 
229
267
  AZURE_SUBSCRIPTION_ID=kv://azure-subscription-idKeyVault
230
268
  TENANT_ID=kv://azure-tenant-idKeyVault
231
269
  AZURE_SERVICE_NAME=kv://azure-service-nameKeyVault
232
- AZURE_CLIENT_ID=kv://azure-client-idKeyVault
233
- 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=
234
274
 
235
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.
236
279
  SKIP_AZURE_OPENAI=false
237
280
 
238
- # 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).
239
283
  SKIP_DB_REDEPLOY=true
240
284
 
241
285
  # =============================================================================
242
- # DEPLOYMENT TYPE
286
+ # DEPLOYMENT TYPE — [always]
243
287
  # =============================================================================
244
288
  # azure — Real Azure resources + tenant activation wizard until completed
245
289
  # azure-mock — Mock Azure SDK; dashboard after login (no wizard)
@@ -248,10 +292,28 @@ SKIP_DB_REDEPLOY=true
248
292
  #
249
293
  # Missing or invalid value defaults to azure (wizard + Azure credentials).
250
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).
251
297
  DEPLOYMENT=database
252
298
 
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
313
+
253
314
  # Dev/test: show TA Entra "Completing setup" countdown (120s cap). Default false.
254
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.
255
317
  SHOW_TA_COUNT_DOWN=false
256
318
 
257
319
  # =============================================================================
@@ -261,40 +323,50 @@ SHOW_TA_COUNT_DOWN=false
261
323
  # Encryption Key for Database Secrets
262
324
  ENCRYPTION_KEY=kv://miso-controller-secrets-encryptionKeyVault
263
325
 
264
- # Comma-separated application keys allowed for POST .../applications/bootstrap (install-time only)
265
- BOOTSTRAP_APPKEYS=dataplane,builder-api
326
+ # Comma-separated application keys allowed for POST .../applications/bootstrap (install-time only).
327
+ # Environment placement is a separate controller rule: workloads (dataplane, builder-api) install into
328
+ # dev/tst/pro but never `miso`; miso-controller and keycloak only into `miso`; mori-controller anywhere.
329
+ BOOTSTRAP_APPKEYS=dataplane,builder-api,mori-controller
266
330
 
267
331
  # Key Vault Integration (for security parameter encryption)
268
332
  # Set to true to enable Azure Key Vault for storing security parameters
269
333
  # When false (default), uses local AES-256-GCM encryption with ENCRYPTION_KEY
270
334
  KEY_VAULT_ENABLED=false
271
335
 
336
+ # Show Settings > System Secrets in the portal (runtime feature flag).
337
+ MISO_APPLICATION_SECRETS_UI_ENABLED=false
338
+
339
+ # Sliding browser-session idle timeout (30 minutes).
340
+ AUTH_BROWSER_SESSION_TTL_SECONDS=1800
341
+
272
342
  # JWT Configuration (for client token generation)
273
343
  JWT_SECRET=kv://miso-controller-jwt-secretKeyVault
274
344
 
275
- # When API_KEY is set, a matching Bearer token bypasses OAuth2 validation
345
+ # When API_KEY is set, a matching Bearer token bypasses OAuth2 validation.
346
+ # The key is optional: local environments may set it; Azure may leave it empty.
276
347
  API_KEY=kv://miso-controller-secrets-apiKeyVault
277
348
 
278
349
  # =============================================================================
279
- # LICENSE CONFIGURATION
350
+ # LICENSE CONFIGURATION — [always]
280
351
  # =============================================================================
352
+ # [saasDirect] Must use the Mori flow: Mori issues and owns the
353
+ # 30-day STANDARD / M trial, and sales later updates the same subscription.
354
+ #
281
355
  # Offline JWT license (optional):
282
356
  # - If set, controller validates license offline (RS256) without Mori subscription status call.
283
357
  # - Value can be literal JWT or kv:// reference.
284
- # - If not set, controller falls back to existing Mori subscription validation flow.
285
- #
286
- # Development: set to DEVELOPMENT to disable license validation (no Mori/JWT required):
287
- # LICENSE_JWT=DEVELOPMENT
288
- # - Use only for local development (DEPLOYMENT=local|database|azure-mock).
289
- # - Ignored when DEPLOYMENT=azure (Azure marketplace / App Service installs).
358
+ # - If empty and no stored licence exists, controller runs as Community edition
359
+ # (DEV environment, size S, shared resources).
360
+ # - Set only to a real signed offline licence JWT. Controlled tests may use the separate
361
+ # LICENSE_VALIDATION_DISABLED=true switch; do not use it in deployed installations.
290
362
  LICENSE_JWT=kv://miso-controller-jwt-licenseKeyVault
291
363
 
292
364
  # =============================================================================
293
365
  # ENTRA ID ONBOARDING (delegated Graph via Mori)
294
366
  # =============================================================================
295
367
  # Must match a Web redirect URI on the vendor multi-tenant app and Mori’s route
296
- # …/entra-graph-delegated/callback. Shared pro Mori (CICD):
297
- 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://dev01.aifabrix.dev/mori/entra-graph-delegated/callback
298
370
 
299
371
  # Optional delegated Graph scopes for GET …/graph-auth-url (space- or comma-separated).
300
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
@@ -309,12 +381,9 @@ ENTRA_GRAPH_DELEGATED_REDIRECT_URI=https://aifabrix-pro-mori-web-we.azurewebsite
309
381
  # only works when a local Mori app is registered and running for this developer.
310
382
  # MORI_CALLBACK_API_KEY must be the same secret as Mori MORI_CONTROLLER_CALLBACK_API_KEY
311
383
  # (both resolve from kv://mori-callback-api-keyKeyVault — do not generate separate values).
312
- MORI_BASE_URL=https://aifabrix-pro-mori-web-we.azurewebsites.net
313
- MORI_AUTH_METHOD=kv://mori-controller-auth-methodKeyVault
384
+ MORI_BASE_URL=kv://mori-controller-web-server-url
314
385
  MORI_CALLBACK_API_KEY=kv://mori-callback-api-keyKeyVault
315
386
  MORI_API_KEY=kv://mori-controller-api-keyKeyVault
316
- MORI_USERNAME=kv://mori-controller-basic-usernameKeyVault
317
- MORI_PASSWORD=kv://mori-controller-basic-passwordKeyVault
318
387
 
319
388
  # =============================================================================
320
389
  # LOGGING 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'