@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.
- package/lib/agent-kit/host-approve.js +48 -6
- package/lib/agent-kit/init.js +2 -2
- package/lib/agent-kit/remote-prompts.js +46 -13
- package/lib/agent-kit/run.js +1 -1
- package/lib/agent-kit/start.js +310 -0
- package/lib/api/pipeline.api.js +32 -3
- package/lib/app/deploy.js +13 -9
- package/lib/app/offer-create-from-template.js +184 -0
- package/lib/cli/setup-app.js +15 -7
- package/lib/cli/setup-auth.js +11 -2
- package/lib/cli/setup-external-system-help.js +15 -3
- package/lib/cli/setup-external-system.js +21 -3
- package/lib/commands/agent-kit-help.js +74 -4
- package/lib/commands/agent-kit.js +83 -12
- package/lib/commands/auth-status-user.js +99 -0
- package/lib/commands/auth-status.js +14 -4
- package/lib/commands/datasource-load-export-cli.js +7 -2
- package/lib/commands/datasource-test-trust-cli.js +5 -1
- package/lib/commands/governance-command-action.js +5 -4
- package/lib/commands/identity-membership-role-cache.js +6 -1
- package/lib/commands/lifecycle-command-action.js +16 -15
- package/lib/commands/login-credentials.js +8 -3
- package/lib/commands/login-device.js +14 -5
- package/lib/commands/login.js +14 -1
- package/lib/commands/logout.js +50 -15
- package/lib/commands/repair-datasource-auto-rbac.js +4 -9
- package/lib/commands/role-assistant.js +24 -12
- package/lib/commands/upload-openapi-sync-followup.js +59 -0
- package/lib/commands/upload-qualification-client.js +131 -0
- package/lib/commands/upload-qualification-followups.js +104 -0
- package/lib/commands/upload-qualification-poll.js +143 -0
- package/lib/commands/upload.js +37 -156
- package/lib/commands/verify-governance-command-action.js +9 -7
- package/lib/commands/verify-operations-command-action.js +9 -8
- package/lib/commands/verify-trust-command-action.js +6 -5
- package/lib/deployment/deploy-poll-ui.js +14 -10
- package/lib/deployment/deployer-status.js +4 -4
- package/lib/external-system/deploy.js +46 -51
- package/lib/external-system/download.js +1 -2
- package/lib/generator/helpers.js +14 -46
- package/lib/generator/index.js +0 -4
- package/lib/integration-definition/apply-static-enterprise.js +5 -2
- package/lib/programmatic/builder-api-request.js +8 -4
- package/lib/programmatic/capability-registry.js +2 -0
- package/lib/programmatic/get-deploy-status.js +45 -0
- package/lib/programmatic/get-upload-status.js +45 -0
- package/lib/programmatic/http-accepted-response.js +31 -0
- package/lib/programmatic/openapi-descriptions.js +14 -4
- package/lib/programmatic/request-timeout.js +21 -15
- package/lib/programmatic/route-handler-map.js +6 -0
- package/lib/programmatic/run-deploy.js +7 -3
- package/lib/programmatic/run-upload.js +11 -7
- package/lib/role-assistant/knowledge-sync-settings-push.js +172 -0
- package/lib/role-assistant/knowledge-sync.js +9 -126
- package/lib/role-assistant/test-cases-evaluate.js +12 -1
- package/lib/role-assistant/test-cases-evidence.js +44 -5
- package/lib/role-assistant/test-cases-lifecycle.js +9 -3
- package/lib/role-assistant/test-runner.js +3 -0
- package/lib/schema/infra-parameter.schema.json +51 -3
- package/lib/schema/infra.parameter.yaml +482 -47
- package/lib/schema/type/document-storage.json +1 -1
- package/lib/utils/api-required-permissions.js +271 -0
- package/lib/utils/api.js +16 -13
- package/lib/utils/cli-json-exit.js +41 -0
- package/lib/utils/cli-utils.js +26 -7
- package/lib/utils/controller-url.js +78 -4
- package/lib/utils/deployment-errors.js +15 -0
- package/lib/utils/deployment-validation-helpers.js +4 -1
- package/lib/utils/device-code.js +31 -10
- package/lib/utils/error-formatters/error-parser.js +16 -1
- package/lib/utils/error-formatters/permission-errors.js +19 -5
- package/lib/utils/keycloak-realm-ready.js +5 -2
- package/lib/utils/logger.js +1 -0
- package/lib/utils/paths.js +26 -5
- package/lib/utils/qualification-poll-ui.js +136 -0
- package/lib/utils/secrets-helpers.js +2 -2
- package/lib/utils/write-stream-and-wait.js +63 -0
- package/package.json +22 -7
- package/templates/agent-kit/agent-kit.yaml +1 -1
- package/templates/agent-kit/instructions/AGENTKIT.md +25 -4
- package/templates/agent-kit/instructions/root.AGENTS.md +1 -1
- package/templates/agent-kit/skills/aifabrix-connected-system/SKILL.md +2 -1
- package/templates/agent-kit/skills/aifabrix-connected-system/references/delivery-gates.md +1 -1
- package/templates/agent-kit/skills/aifabrix-plan/SKILL.md +2 -1
- package/templates/agent-kit/skills/aifabrix-prove/SKILL.md +1 -0
- package/templates/agent-kit/skills/aifabrix-role-assistant/SKILL.md +1 -0
- package/templates/agent-kit/skills/shared/hosts.md +13 -26
- package/templates/agent-kit/skills/shared/login.md +16 -0
- package/templates/agent-kit/workspace/README.md +1 -1
- package/templates/applications/builder-api/env.template +4 -0
- package/templates/applications/dataplane/application.yaml +1 -2
- package/templates/applications/dataplane/env.template +5 -5
- package/templates/applications/keycloak/Dockerfile +12 -5
- package/templates/applications/keycloak/application.yaml +2 -2
- package/templates/applications/keycloak/cimd-lenient-parse/AbstractClientIdMetadataDocumentExecutor.java +3 -3
- package/templates/applications/keycloak/cimd-lenient-parse/SOURCE.md +6 -6
- package/templates/applications/keycloak/env.template +13 -1
- package/templates/applications/miso-controller/application.yaml +21 -2
- package/templates/applications/miso-controller/env.template +97 -28
- package/templates/applications/miso-controller/rbac.yaml +5 -0
- 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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
**
|
|
48
|
+
**Foreground only (no tmux).**
|
|
60
49
|
|
|
61
50
|
```bash
|
|
62
|
-
|
|
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
|
|
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.
|
|
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.
|
|
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
|
|
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
|
+
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=
|
|
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
|
+
# 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.
|
|
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.
|
|
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
|
|
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.
|
|
7
|
+
version: '26.7.3-aifabrix.1'
|
|
8
8
|
|
|
9
9
|
# Image Configuration
|
|
10
10
|
image:
|
|
11
11
|
name: aifabrix/keycloak
|
|
12
|
-
tag: '
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
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
|
-
|
|
233
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
285
|
-
#
|
|
286
|
-
#
|
|
287
|
-
#
|
|
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
|
|
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=
|
|
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'
|