---
title: "Platform Update — September 11, 2026"
slug: "platform-update-2026-09-11"
date: "2026-09-11"
tag: "Application"
summary: "Sixty-two production releases in a week — agents now manage their own long-term memory through a tool-calling toolkit with expiring facts, admins and watchers can read learner chat history under RBAC, every AI turn exposes its retrieved documents and tool calls, and opt-in TLS lands for Redis, ClickHouse and MongoDB."
author: "ibl.ai Engineering"
linkedin: |
  Sixty-two production releases in seven days. This week's theme: an agent that remembers the right things, and an operator who can see exactly how it answered.

  The headline is the long-term memory toolkit. Graph agents on tool-calling models now manage memory directly — save, update, forget, search — instead of paying for a separate worker LLM call after every turn. Memories default to the agent's own scope; only high-level facts (name, role, language, accessibility needs, broad goals) go global, and temporary state like "sitting an exam this week" carries an expiry that gets purged nightly. Duplicate detection runs semantically across an agent's categories.

  Paired with it, every AI turn is now inspectable. The conversation-detail endpoint surfaces the retrieved documents, the tool calls with their inputs and outputs, the model and provider that produced the answer, and the request context with credentials stripped. The conversation list carries per-conversation rollups, so an operator can see which conversations used documents or called tools without opening each one.

  Also shipped this week across the ibl.ai platform:

  → Admins and watchers can read another user's chat history and reports, authorized through RBAC grants rather than a role flag
  → Transcript and conversation search now match on learner email, not just username and first message
  → Opt-in TLS for Redis, ClickHouse and MongoDB, all defaulting off, with self-signed certs provisioned by sidecars and operator-supplied CAs supported
  → Stripe Connect via OAuth, so a tenant connects its own Stripe account, plus an embedded paywall checkout for member self-service
  → Per-turn credit capture: agent LLM usage is charged as each turn completes instead of waiting for the next reconciliation sweep
  → A redesigned analytics dashboard with capability grouping by surface and a memory admin tab
  → Files an OpenClaw agent returns are saved to the chat as attachments that survive reload and share links
  → The CLI gained deployment presets, generatable-vs-supplied secret categories, and unified-domain media routing

  That cadence is the point. When you run the platform yourself, upstream shipping velocity is something you receive rather than something you wait on — you pull the release on your own maintenance window.

  It is also why the ownership model matters. With ibl.ai you own all the code and the data — self-hosted inside your own perimeter, model-agnostic across any LLM, usage-based with no per-seat pricing, deployable anywhere from your own cloud to a fully air-gapped network.

  #iblai #AgenticAI #EnterpriseAI #ShipIt #LLMOps #DataSovereignty
---
Covers releases from **2026-09-04** through **2026-09-11** across `iblai/iblai-prod-images` (backend services) and `iblai/iblai-web-frontend` (web frontend monorepo). 62 releases total (17 prod-images, 45 web-frontend).

| Service | Image / Pin | Version Span |
|---|---|---|
| dm | `iblai-dm-pro` | `4.369.0-ai` → `4.378.2-ai` |
| os | `iblai-os-spa` | `0.140.2` → `0.142.3` |
| lms | `iblai-lms-spa` | `0.78.1` → `0.80.1` |
| edx | `iblai-edx-pro` | `sumac.2.58.0` → `sumac.2.59.1` |
| auth | `iblai-auth-spa` | `2.2.6` → `2.2.8` |
| cli | `ibl-cli` | `6.2.0` → `7.6.0` |
| agent-ai | `@iblai/agent-ai` | `2.9.3` → `2.10.0` |
| web-containers | `@iblai/web-containers` | `1.19.9` → `1.20.0` |
| web-utils | `@iblai/web-utils` | `2.4.0` → `2.4.6` |
| data-layer | `@iblai/data-layer` | `1.13.1` → `1.13.3` |
| auth (pkg) | `@iblai/auth` | `2.2.7` → `2.3.0` |
| mcp | `@iblai/mcp` | `1.12.7` → `1.12.12` |
| iblai-js | `@iblai/iblai-js` | `2.9.0` → `2.11.0` |

---

## iblai-dm-pro (`4.369.0-ai` → `4.378.2-ai`)

**Long-term memory toolkit.** Graph agents with tool-calling models now manage long-term memory directly through a hidden toolkit (save / update / forget / search) instead of a separate worker LLM call after every turn. Memories default to the agent's own scope; only high-level facts (name, role, language, accessibility needs, broad goals) are stored globally, and temporary state ("sitting an exam this week") carries an expiry. The worker extraction remains as a fallback for models without tool calling and for non-graph runners. Expired memories are purged nightly at 04:20 UTC by a new `purge_expired_memories` beat task. Duplicate detection covers global memories semantically and spans an agent's categories. `DISABLE_MEMORY_EXTRACTION` is the single kill switch for both the toolkit and the worker.
- **Migration** `0365`: adds nullable indexed `expires_at` column to the two user memory tables; no backfill, rolling-deploy safe.

**Admin/watcher access to learner chat history.** Tenant admins and watchers can now read another user's chat history and reports through the `my-chat-history` endpoints (list/filter views and report create/list/status/download). Authorization routes through RBAC: self-access via the username self-skip, watchers/admins via an `Ibl.Analytics/Core/read` grant on `/platforms/{pk}/users/{target_pk}/`, and usergroup owners via the `is_owner` bypass. Reports record `owner` = the actual creator and carry the subject in `filters.user_id`; list/status/download scope by that subject.

**Email in conversation search.** The conversation-list and transcript serializers now return the learner's `email`. The conversation-detail `summary` block also carries `email`, and transcript/message search matches on email in addition to first message and username.

**Extended per-turn conversation context.** The conversation-detail endpoint (`GET /dm/api/analytics/messages/details/`) now surfaces `documents` (retrieved sources), `tool_calls` (`[{name, input, output}]`), `metadata` (LLM model/provider/temperature + client metadata), and `request_context` (credential-stripped request payload) on each AI turn. The admin chat-history endpoint (`GET /dm/api/ai-analytics/orgs/{org}/users/{user_id}/chat-history/`) carries the same fields. The conversation-list endpoint additionally gains per-conversation rollups (`documents_count`, `tool_calls_count`, `used_documents`) computed in a single query, so the SPA can badge rows without opening each conversation. Learner-facing `my-chat-history` shares the serializer but omits admin-only fields.

**OpenClaw agent file attachments.** Files an OpenClaw agent returns are saved to the chat as attachments on its message, surviving reload and share links. An agent can only fetch files from its own workspace.

**Agent reasoning compatibility.** Reasoning-enabled agents now work correctly with workers whose model does not accept a thinking level, and gateway-produced replies end the turn instead of hanging until the stream timeout. Agents with tool calls produce cleaner output without duplicating model narration before the tool invocation.

**Connect with Stripe (OAuth) + member self-service paywall.** Tenants can connect their Stripe account via OAuth, and members can use an embedded paywall checkout for self-service purchases (DM 4.378.0).

**Opt-in TLS for Redis and ClickHouse.** `dl_manager` can now connect to Redis and ClickHouse over TLS (controlled by `ENABLE_REDIS_TLS` / `ENABLE_CLICKHOUSE_TLS`, default off). For Redis, the celery broker/result, django-redis cache, and channels layer use `rediss://`; a distinct `REDIS_TLS_PORT` means self-signed cert on its own port (`CERT_NONE`), while same-port keeps `CERT_REQUIRED` (managed CA). `REDIS_TLS_VERIFY` overrides that inference. For ClickHouse, the native connection uses `CLICKHOUSE_TCP_SECURE_PORT` (9440) and does not verify the server certificate by default; set `CLICKHOUSE_TLS_VERIFY=true` for a managed-CA cert. Pairs with `ibl-cli-ops` 7.5.0.

**MCP server list: per-user connection status.** The MCP server list endpoint (`GET /mcp-servers/`) now correctly reports whether the requesting user has authenticated to each per-user MCP server. Deactivated connections no longer read as "connected".

**Privacy mode: full Langfuse redaction.** Privacy mode now redacts user content across all processing paths sent to Langfuse — moderation, session-title generation, post-processing, and vector-results cleaning — ensuring trace data is fully anonymized. The redaction works correctly with the langfuse 3.x / opentelemetry-sdk 1.44 span lifecycle.

**Chat privacy preference enforcement.** A user's chat-privacy preference (anonymize or do not store) is now honoured by all agent runners, not just the graph runner.

---

## iblai-os-spa (`0.140.2` → `0.142.3`)

**Streamdown markdown pipeline.** Chat rendering now uses [Streamdown](https://github.com/vercel/streamdown) with unified/remark/rehype instead of the previous marked-based pipeline. Document-mode LaTeX (`\begin{document}…\end{document}`, `\section`, `\textbf`, etc.) is converted into markdown AST nodes and rendered in chat. Bare `&`-delimited display math is wrapped in `\begin{aligned}` automatically. KaTeX render failures and silent LaTeX conversion failures are reported to Sentry. Canvas HTML output is sanitised via rehype-sanitize.

**Agent-based lesson completion.** The OS SPA now supports agent-based lesson completion, waiting for the agent's websocket end-of-stream signal before dispatching the completion event.

**Embed auth stability.** The embedded SPA only saves and reloads when the host's auth data actually changes, accepts auth data sent as a JSON string from the host, and respects iframe cookie boundaries.

**Chunk-loading error recovery.** When a lazy-loaded chunk fails to fetch (e.g. after a deploy), the SPA auto-reloads a bounded number of times and then shows a recoverable error page instead of a blank screen.

---

## iblai-lms-spa (`0.78.1` → `0.80.1`)

**Course-tab auto-completion gating.** When unit auto-completion is disabled, auto-completion is now also disabled for course-level tabs, not just individual units. Lesson-completed dialog placeholders updated.

**SDK tenant auth provider.** Error handling in the SDK tenant auth provider has been refined with updated error logic and improved test coverage.

---

## iblai-edx-pro (`sumac.2.58.0` → `sumac.2.59.1`)

**Lesson auto-publish.** The auto-publish feature is now feature-flagged behind the post-message API autocomplete-disable flag (in `head-extra.html`).

**GDPR-retired email handling.** Creating a user with a previously GDPR-retired email now returns a clean 409 Conflict instead of an unhandled error, matching the existing behaviour for plain duplicate active emails.

---

## iblai-auth-spa (`2.2.6` → `2.2.8`)

**Tenant identification.** The auth SPA now reads `platform_key` as the requested tenant, aligning tenant resolution with the rest of the frontend stack. Token-exchange error logging improved.

---

## ibl-cli (`6.2.0` → `7.6.0`)

**Secrets and deployment overhaul (7.1.0).** Major CLI hardening across six PRs:
- Secrets are categorised as generatable vs. user-supplied; `ibl secrets set` and `rotate --all-generated` let operators manage each type independently.
- `ibl config group` and strict type coercion for config values.
- Secret gating overhaul: `generate_for` and `required_for` are now demand lists; AI-tier settings can veto generation.
- `ENVIRONMENT_CONFIG` removed; exporter gating restructured; `ibl init` is idempotent.
- Deployment presets (`single-server`, etc.) and `ibl services set-from` for copying service layouts.
- Shared-resource exporters (e.g. node-exporter) run once per fleet instead of per-service.

**Sentry DSN for LMS SPA (7.2.0).** New `IBL_SPA.LMS.SENTRY_DSN` renders `NEXT_PUBLIC_IBL_SENTRY_DSN` into `.env.lms`. Defaults to empty (Sentry SDK disables itself). Set per environment:
```bash
ibl config set IBL_SPA.LMS.SENTRY_DSN=<dsn>
ibl render
```

**Opt-in TLS for edX MongoDB (7.3.0).** New `IBL_EDX.ENABLE_MONGODB_TLS` (default `false`). Server starts `mongod --tlsMode allowTLS` with a self-signed cert; clients connect with `tls=True` + `tlsAllowInvalidCertificates=True`. Encryption-only, no CA/hostname verification. Follow-up needed for the Ruby forum (mongoid) client.

**Redis auth gating (7.4.0).** New `IBL_EDX.ENABLE_REDIS_AUTH` declares whether the deployment's edX redis requires a password. Default `false`, matching the stock tutor redis (no `requirepass`). Gating is `required_if=ENABLE_REDIS_AUTH` over the existing `required_for/generate_for` split, so the secret is neither required nor generated when the toggle is off.

**Opt-in TLS for Redis + ClickHouse (7.5.0).** Follows the postgres/mongo pattern; all flags default `false`.
- **Redis** reuses `IBL_DM.ENABLE_REDIS_TLS` / `IBL_EDX.ENABLE_REDIS_TLS`. Plaintext on `REDIS_PORT`, TLS on `REDIS_TLS_PORT` (DM default 6389); a `dm-redis-tls-init` sidecar provisions the self-signed cert.
- **ClickHouse** via `IBL_DM.ENABLE_CLICKHOUSE_TLS`. Keeps http `8123` / native `9000`, adds https `8443` + native-secure `9440`. Sidecar cert carries a SAN for host matching.
- **langfuse** trusts the self-signed cert via `NODE_EXTRA_CA_CERTS` instead of disabling verification; operator-provided CA via `IBL_DM.CLICKHOUSE_CA_CERT_HOST_PATH` for external ClickHouse.

**Unified domain media routes + credit capture (7.6.0).**
- `/media/...` now proxies to the LMS through the unified domain, so profile images and uploaded media resolve on the API hostname.
- `/lms/media/...` has the prefix stripped at the proxy to hit uwsgi's `/media` static map correctly.
- **`IBL_DM.CREDIT_CAPTURE_TASK_QUEUE`** (default `credit_capture`): the DM credits worker now consumes a per-turn capture queue alongside the reconciliation queue, so agent LLM usage is charged as each turn completes instead of waiting for the next sweep.

---

## @iblai/agent-ai (`2.9.3` → `2.10.0`)

**Auth relaying opt-in.** Auth relaying to embedded agent iframes is now opt-in via a `relayAuthMessage` attribute on the embed element, rather than relaying unconditionally. Nested embeds continue to relay auth through the chain when the attribute is set.

---

## @iblai/web-containers (`1.19.9` → `1.20.0`)

**Analytics revamp.** The analytics dashboard has been fully redesigned with new views, transcript user search by email (preferred over username), and conversation-list rollup badges (document count, tool-call count).

**Capability matrix.** Agent capabilities are now grouped by surface (embed, standalone, etc.) with a global toggle. New matrix primitives let toggle rows align to the capability structure. Embed capability fields flow through settings.

**Memory admin tab.** The memory admin tab is now exported and accessible from the management interface.

**Watcher scoping.** Management views for watcher-role users are restricted to the users tab only.

**Unauthenticated redirect.** When a user is not logged in, the application now redirects to display the tenant's authentication UI instead of showing a blank or error state.

---

## @iblai/web-utils (`2.4.0` → `2.4.6`)

**Agent lesson completion.** The lesson-completion dispatch now waits for the websocket end-of-stream signal before firing, preventing premature completion events.

**Tenant resolution stability.** `determineWhichTenantToUse` no longer re-runs on every render. The requested tenant is joined before the two-tenant fallback, and tenant-mismatch callbacks do not fire while resolution is still running.

**Logout redirect.** Logout now preserves the tenant query parameter so the user returns to the correct tenant's login page.

---

## @iblai/data-layer (`1.13.1` → `1.13.3`)

**Token refresh on 401.** API 401 responses now trigger a token refresh and retry instead of immediately logging the user out, reducing unnecessary session drops when tokens expire mid-session.

---

## @iblai/auth (`2.2.7` → `2.3.0`)

**Tenant identification.** The auth package reads `platform_key` as the requested tenant, aligning with the `web-utils` tenant resolution pipeline. Redirect-to parsing covered by new tests.

**Unauthenticated tenant auth UI.** When not logged in, the auth flow redirects to the tenant's authentication UI rather than a generic login page.

---

## @iblai/mcp (`1.12.7` → `1.12.12`)

Rollup releases tracking upstream changes from `web-containers`, `web-utils`, and backend API updates (4.371.0 → 4.378.2). No independent feature changes in this window.

---

## @iblai/iblai-js (`2.9.0` → `2.11.0`)

Rollup releases aggregating all monorepo package versions. 16 releases in this window; version bumps track the packages above. No independent feature changes.
