---
title: "Platform Update — November 6, 2026"
slug: "platform-update-2026-11-06"
date: "2026-11-06"
tag: "Application"
summary: "Eleven services and packages moved in one week, led by a rewritten SSO module with generic OpenID Connect and Microsoft Entra sign-in, large-file offloading so chat reads PDFs over 600 pages, capability flags on every agent, a platform MCP server over a 79-route v1 facade, agent messaging channels, sandbox VMs on by default, an organization chooser in the auth app, and a default-deny edX firewall."
author: "ibl.ai Engineering"
linkedin: |
  Your agents can now read a 600-page PDF in chat, sign your users in through any OpenID Connect provider or a Microsoft Entra tenant, and start life inside a sandbox virtual machine by default.

  That is one week of platform releases, 1.356.0 to 1.398.0, across eleven services and packages:

  → SSO rewritten: a generic OIDC provider for any spec-compliant identity provider, one Azure app registration covering personal and work accounts from any Entra tenant, and the auth app discovering providers from the platform itself
  → Large files stay in storage and the agent reads them through a read-only route, so big CSVs and PDFs over 600 pages no longer fail
  → Capability flags on every agent and session decide which tools run, including a new subagents capability
  → A platform MCP server exposes sessions, projects, notifications, LLMs, audit logs and RBAC checks, and the v1 facade grows from 50 to 79 routes with 29 analytics endpoints
  → Agent channels and channel credentials lay the groundwork for connecting agents to external messaging channels, with their own RBAC actions
  → New agents start with the sandbox VM on, controlled per tenant
  → Organization switching moves into the auth app, with the chooser in its own tab across the web app, embeds, the Chrome extension and the desktop app
  → Chrome extension 1.1.11 batches form actions and runs silently until it is done
  → The course About page plays the intro video inline, and Google Drive's file picker works past the cookie screen
  → The edX firewall moves to allow-lists, denying everything not in use, with a CLI command for the DM's egress IPs

  Every one of these lands as an image tag you pull on your own schedule. When you run the platform yourself, the maintenance window is yours, and nobody else decides when you upgrade.

  With ibl.ai you own all the code and the data: self-hosted inside your own perimeter, model-agnostic across any LLM, with no per-seat pricing, deployable anywhere from your own cloud to a fully air-gapped network.

  #iblai #AgenticAI #EnterpriseAI #AIAgents #SSO #SelfHosted
---

Platform digest covering releases from `iblai/iblai-prod-images` (platform pins 1.356.0 – 1.398.0) and `iblai/iblai-web-frontend` (SDK and app packages), published between 2026-10-30 and 2026-11-06.
| Service / Package | Image / Pin | Version Span |
|---|---|---|
| dm | `iblai-dm-pro` | `4.462.0-ai` → `4.476.0-ai` |
| os | `iblai-os-spa` | `0.183.1` → `0.190.0` |
| lms | `iblai-lms-spa` | `0.100.1` → `0.102.0` |
| cli | `ibl-cli` | `7.33.0` → `7.39.0` |
| auth | `iblai-auth-spa` | `2.9.0` → `2.10.1` |
| web-containers | `@iblai/web-containers` | `1.59.1` → `1.65.3` |
| web-utils | `@iblai/web-utils` | `2.18.0` → `2.21.2` |
| data-layer | `@iblai/data-layer` | `1.38.1` → `1.39.0` |
| mcp | `@iblai/mcp` | `1.37.1` → `1.41.0` |
| agent-ai | `@iblai/agent-ai` | `2.13.3` → `2.13.4` |
| iblai-js | `@iblai/iblai-js` | `2.59.1` → `2.65.4` |

---

## iblai-dm-pro (`4.462.0-ai` → `4.476.0-ai`)

**DM SSO overhaul.** The SSO module (`ibl-dm-sso-app 0.4.0`) was rewritten. DM now serves edX's `/api/mfe_context` document from `GET /auth/providers/`, so the auth SPA can discover providers from DM instead of edX. A new `POST /auth/login/` proxies the auth SPA's password-grant form to edX (rate-limited by `EDX_PROXY_LOGIN_RATE`, default `20/5m`), and `GET /auth/sso-login-url/` and `GET /auth/provider-slugs/` replace the edX SSO helpers. New SSO provider flavours: `GENERIC_OIDC` (a catch-all for any spec-compliant OpenID Connect IdP), `MICROSOFT_GRAPH` (one Azure app registration accepting both personal and work/school accounts from any Entra tenant, resolving email from Graph `mail` with a deliverable UPN fallback), `ATOM_BROKER`, `CLOUD_OAUTH2` and `IHP_OAUTH2`. New accounts created through SSO take the IdP's username when valid and free, otherwise a generated one. Disposable-email blocking, already on magic-link sign-up, now applies to SSO account creation (`ENABLE_DISPOSABLE_EMAIL_BLOCK`, on by default; existing users are not affected). Per-IP rate limits on SSO, magic-link and edX-proxy endpoints respect `THROTTLE_TRUSTED_PROXIES` behind a load balancer. Per-provider `STRIP_REDIRECT_URI_TRAILING_SLASH` setting accommodates IdPs that exact-match a slashless callback URI. Deploy: migration `0002` (choices-only `AlterField`). Set `THROTTLE_TRUSTED_PROXIES` to the load-balancer addresses where it is not already set.

**Channel credentials and agent channels.** Two new subsystems lay the groundwork for connecting agents to external messaging channels:
- `ChannelCredential` and native `GET /v1/channels` (catalog) and `/v1/channels/credentials` CRUD, with values masked by default and a separate unmask action. The creator owns a credential (new `channel-credential-owner` role). Credentials are verified with their provider on create and on value changes; a rejection is recorded on the credential. RBAC actions `Ibl.Mentor/ChannelCredentials/*` and `Ibl.Mentor/ChannelCredentialsUnmask/action`, seeded to no member role.
- `AgentChannel`, `ChannelAllowEntry`, `ChannelPairingRequest`, `ChannelIdentity`, `ChannelConversation`, and native `/v1/agents/{agent_id}/channels[/{channel}[/allow-entries|/pairings]]`. Tenant admins connect credentials; the agent's owner can manage ordinary channel settings. Deleting a credential in use by an agent channel returns 409. RBAC actions `Ibl.Mentor/AgentChannels/*` and `Ibl.Mentor/AgentChannelAccess/*`.
- Deploy: migrations `core.0075`, `ibl_ai_mentor.0410_channelcredential`, `ibl_ai_mentor.0412_agent_channels`, then `seed_rbac_data`.

**Capability flags on mentors and sessions.** `capability_*` booleans on `Mentor` and `Session` replace the `tools` many-to-many relationships as the source of truth for which tools run. New flags include `capability_subagents` (gates the deep agent's `task` tool) and `Mentor.embed_enable_screen_sharing`. The existing `tool_slugs`, session `tools`, `mentor_tools` and tool-list endpoints keep working and both stores stay in step. Turning a capability off on a mentor stops it on the next turn of existing sessions. Web Search and Web Fetch are one capability. Course Creation, Google Docs/Slides/Calendar, Deep Research and Study Mode are hidden from the tool lists but keep working where already enabled. Deploy: migration `ibl_ai_mentor.0411_capability_flags`, then `seed_rbac_data`, `seed_tools`, `sync_capability_flags` (add `--sessions` to repair session rows).

**MCP v1 facade migration (Phases 1–2).** Built-in MCP tools are now generated only from routes staged in the `/v1` facade, named after the facade's SDK operations, with organization and user taken from the caller's credentials. No tool is built from a legacy `/api/...` URL. The Canvas user and Canvas course MCP servers are removed. A new `platform` MCP server at `/mcp/platform` serves sessions, projects, disclaimers, configurations, notifications, organization, LLMs, features, audit logs, and RBAC checks. Agent-create uses the staged `/v1/agents/*` routes. 29 `/v1/analytics/*` routes (overview, users, sessions, topics, chat history and reports, costs, content, financial, LLM usage, time update) are staged, taking the facade from 50 to 79 routes. Failed tool calls now return `isError: true` with the view's response body as the error text. Deploy: no migration. The ASGI image must ship `/code/facade/routes.json`. Mentors and external clients attached to the analytics, user, search or workflow servers lose generated tools until the routes are staged.

**Large-file offloading in chat.** On the graph runner, files too large for the active model stay in storage and the agent reads them through a read-only `/uploads/` route, so large CSVs and PDFs over 600 pages no longer fail. Files that fit are sent inline as before. VM mentors without privacy rails get every session upload under `/workspace/chat_uploads/`, and the system prompt lists the exact paths. Threads stuck on an oversized file recover on their next turn; a provider's file rejection before any output retries once with the current turn's documents offloaded. `POST users/<user_id>/chat/files/upload-url/` and the chat consumer allow PDF, text and Office files up to `MENTOR_IN_CHAT_MAXIMUM_FILE_SIZE` on graph-routed mentors. New optional settings: `CHAT_FILE_OFFLOAD_ENABLED` (default on), `CHAT_FILE_INLINE_MAX_TOKENS`, `CHAT_FILE_PDF_INLINE_MAX_PAGES`, `CHAT_FILE_PDF_INLINE_MAX_BYTES`, `CHAT_FILE_IMAGE_INLINE_MAX_BYTES`.

**Isolated fetch proxy for document training.** Optional isolated proxy for URL, web-crawler, multilingual and remote-file document fetches during training: `ENABLE_TRAINING_FETCH_PROXY`, `TRAINING_FETCH_PROXY_URL`, `fetch_proxy_key` credential. When enabled, fetches run on a separate host with no platform data; sitemap documents are refused. Off by default. CLI setting: `IBL_DM.TRAINING_FETCH_PROXY_URL` (default `https://training.<BASE_DOMAIN>`).

**Multimodal capabilities after catalogue sync.** Catalogue/route syncs now write default `multimodal_capabilities` for multimodal models. Vertex Gemini and Claude on Vertex are registered multimodal. `get_multimodal_llm` uses any provider's multimodal model instead of forcing non-OpenAI/Google providers onto `gpt-4o`. New settings: `DEFAULT_MULTIMODAL_LLM_PROVIDER` / `DEFAULT_MULTIMODAL_LLM_MODEL` (tenant-overridable; built-in `openai` / `gpt-4o`). Run `seed_llm_registry` on affected deployments.

**Sandbox VM default for new agents.** New mentors start with the sandbox virtual machine on and `public` egress, controlled by `DEFAULT_MENTOR_ENABLE_VIRTUAL_MACHINE` / `DEFAULT_MENTOR_VIRTUAL_MACHINE_EGRESS` (global defaults from env, with per-tenant overrides through `Config`). Existing mentors are not changed. Set a tenant override to `false` / `none` for tenants that should not get VMs by default.

**Lesson context in the system prompt.** When a chat payload carries an edX `lesson_context`, the agent system prompt names the learner's current lesson and says page content in the student's latest message comes from that lesson. Mentors with `enable_prompt_caching` miss the cache when the learner moves to a new lesson.

**PHI clinical entity options.** PHI clinical entity options now match the medical recognizer labels the app can serve; unsupported labels are rejected on mentor settings/template requests.

**Chat auth refactor.** Chat and session creation are now handled by a single unified authentication pipeline.

**Deploy summary (DM):** migrations `core.0075`, `ibl_ai_mentor.0410`–`0412`, `ibl_dm_sso.0002`. Post-migration commands: `seed_rbac_data`, `seed_tools`, `sync_capability_flags [--sessions]`, `seed_llm_registry`.

---

## iblai-os-spa (`0.183.1` → `0.190.0`)

**Organization chooser.** Organization switching is now handled by the auth app. Clicking the org switcher opens the auth app's chooser in its own tab. Embeds and the Chrome extension forward the switch request so the host page can navigate to the chooser. The desktop app (Tauri v0.95.31) also routes through the auth app.

**MCP in the chat prompt box.** The MCP server selector is now available directly in the OS chat composer, matching the SDK's chat-composer MCP integration.

**Discovery sub-tab redesign.** A redesigned Discovery sub-tab with access labels (`mentor_visibility` controls), a pill-style latest-features banner, and a new e2e journey covering Discovery audience and catalog.

**History conversation list.** The agent History conversation list is uncluttered for faster scanning.

**Tenant and user metadata from storage.** The OS reads tenant metadata from the tenant object and user metadata from `localStorage`, eliminating extra API calls. Saved org metadata syncs to `localStorage` on update.

**RBAC for anonymous viewers.** Anonymous viewers can now chat on anonymous-allowed mentors without hitting RBAC gates.

**Embed organization switching.** The embed's generated code answers the auth app's tenant-switch request, and the embed no longer reloads — it switches through `/join`.

**Mobile layout.** The app shell `<main>` no longer scrolls in the mobile apps; the Tauri CSS offsets the status bar.

**Chrome extension v1.1.11.** Silent runs, batched form actions, longer retries, and named rows.

**Desktop app v0.95.31.**

---

## iblai-lms-spa (`0.100.1` → `0.102.0`)

**Discussion tab conditional.** The Discussion tab no longer displays when discussions are disabled for a course.

**Profile sidebar shortcuts.** Sidebar shortcuts now open the full profile component instead of a partial view.

**Course intro video.** The course About page now plays the course intro video inline.

---

## ibl-cli (`7.33.0` → `7.39.0`)

**edX default-deny WAF.** The edX web-application firewall moves from block-lists to allow-lists: `edx-lms-allow.yml` and `edx-studio-allow.yml` list what is used and deny everything else, like `dm.yml`. Both files cover every host that reaches edX — the edX host, the unified API gateway, and each SPA's same-origin `/backend/lms` and `/backend/studio`. New rule key `from_dm: true` grants an exception to `IBL_REVERSE_PROXY.MODSECURITY_DM_EGRESS_IPS`, so the DM's requests to edX are never blocked. `ibl global-proxy dm-ips` (`--add`/`--remove`/`--set`) manages the IP list. The old `edx-lms.yml` and `edx-studio.yml` block-lists are removed. `/styles/lms.css` and `/faq` are also allowed to stop logging false positives.

**Firewall targets for renamed SPAs.** `ibl global-proxy firewall targets` (`--add`/`--remove`/`--set`) and `IBL_REVERSE_PROXY.MODSECURITY_SPA_HOSTS` cover SPAs on renamed domains (e.g. `mentorai.<domain>`, `os.ibl.ai`). Each listed host joins every configured file that targets the SPAs. The list lives in `config.yml`, so reinstalling a rule file with `--force` no longer loses it.

**v1 facade analytics routes.** `routes.json` ships the 29 `/v1/analytics/*` routes the SPAs call. `dm.yml` also allows `/mcp/` on every DM target. Deploy: upgrade CLI, `ibl config save`, `ibl global-proxy reload`.

**Isolated fetch proxy address.** `IBL_DM.TRAINING_FETCH_PROXY_URL` (default `https://training.<BASE_DOMAIN>`).

**DM SSO registration.** `IBL_DM.ENABLE_DM_SSO` (default `false`) is now registered, so `ibl render` no longer stops on nodes that set it.

---

## iblai-auth-spa (`2.9.0` → `2.10.1`)

**Organization chooser.** Organization switching is now handled inside the auth app. The chooser opens in its own tab, replacing the inline org-switch dropdown in each SPA. The login flow joins the tenant the login was started for. An expired forwarded token recovers instead of failing.

---

## @iblai/web-containers (`1.59.1` → `1.65.3`)

**Discovery sub-tab redesign.** The discovery sub-tab, latest-features banner (pill-style), access labels, and `mentor_visibility` controls are redesigned.

**Full profile components.** Gradebook, skills, credentials, and the organization account sheet now open the full profile component instead of a partial view.

**Create Agent with RBAC.** The Create Agent form enforces RBAC permissions.

**Conversation history.** The profile history conversation list is uncluttered.

**Transcript viewer.** Transcript conversations render at a bigger size.

**Google Drive picker.** Users can get past Google Drive's cookie screen in the file picker.

**Tenant metadata.** The component reacts to tenant metadata changes in Advanced settings and reads user metadata from storage only.

**Logo version.** The logo version bumps after a light-logo upload, so the cached logo refreshes.

**Embed tenant switching.** Generated embed code answers the auth app's tenant-switch request; the embed re-renders in place.

**Cowork panel.** A panel Cowork turn stays alive on socket close; private skills are no longer assigned in panel contexts.

---

## @iblai/web-utils (`2.18.0` → `2.21.2`)

**Replaced-session guard.** Chat history that arrives for a replaced session is ignored, preventing stale messages from appearing in a new session.

**Tenant metadata from storage.** `useTenantObjectMetadata` reads from the tenant object; the `TenantProvider` metadata fetch is dropped for the resolved tenant. User metadata from `localStorage` is synchronized on update.

**Logo version hook.** Per-organization logo version for cache busting.

**Organization switching.** Helpers for the auth-app org chooser flow, including embed address hand-off and desktop-app support.

---

## @iblai/data-layer (`1.38.1` → `1.39.0`)

**API types for v1 facade.** Typed endpoints for the DM's MCP v1 facade migration and agent channel endpoints.

---

## @iblai/mcp (`1.37.1` → `1.41.0`)

Rolls up the `web-containers`, `data-layer`, and `web-utils` changes above — discovery redesign, create-agent RBAC, logo version hooks, and org-chooser support.

---

## @iblai/agent-ai (`2.13.3` → `2.13.4`)

**Expired host session.** The embed no longer replays an expired host session, preventing stale auth from being sent to the iframe.

---

## @iblai/iblai-js (`2.59.1` → `2.65.4`)

Umbrella SDK package. Rolls up all `agent-ai`, `web-containers`, `web-utils`, `data-layer`, `mcp`, and `auth` changes listed above.
