Back to Updates

Platform Update — September 11, 2026

ibl.ai Engineering
Application

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.

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).

ServiceImage / PinVersion Span
dmiblai-dm-pro4.369.0-ai4.378.2-ai
osiblai-os-spa0.140.20.142.3
lmsiblai-lms-spa0.78.10.80.1
edxiblai-edx-prosumac.2.58.0sumac.2.59.1
authiblai-auth-spa2.2.62.2.8
cliibl-cli6.2.07.6.0
agent-ai@iblai/agent-ai2.9.32.10.0
web-containers@iblai/web-containers1.19.91.20.0
web-utils@iblai/web-utils2.4.02.4.6
data-layer@iblai/data-layer1.13.11.13.3
auth (pkg)@iblai/auth2.2.72.3.0
mcp@iblai/mcp1.12.71.12.12
iblai-js@iblai/iblai-js2.9.02.11.0

iblai-dm-pro (4.369.0-ai4.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.20.142.3)

Streamdown markdown pipeline. Chat rendering now uses 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.10.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.0sumac.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.62.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.07.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:

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.32.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.91.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.02.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.11.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.72.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.71.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.02.11.0)

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