1.3.1 is a regular patch release. DeepSeek joins the Token Plan one-key setup, and most of the rest is reliability: asset uploads no longer hold database connections across slow object stores, requests stop waiting forever for a connection, and edits made just before leaving a page are kept. It has one upgrade condition and one new known issue; read Breaking Changes and Known issues before upgrading.
Breaking Changes
- Stop every 1.3.0 instance before 1.3.1 accepts writes, and plan rollback as a database restore.
@openmaic/storage0.39 adds asset migration v3. #2092- Do not run a mixed-version rolling deployment. An old collector does not read the new stage pins, so while both versions run it can delete bytes a new write has just uploaded, and if its own transaction then rolls back, that write can commit an entry naming missing bytes.
- Once v3 is applied, a 0.38 instance refuses to start against the database because the schema is newer than it knows. Roll back by restoring the previous database state, not by restarting the old version.
- A host that provisions
ASSET_PG_SCHEMAthrough its own migrations must first addasset_blob_stages (id, content_hash, expires_at)and its two indexes, since the collector reads that table.
Behavior Changes
- Classroom chat: the fixed limits on a discussion are removed (the six-turn agent limit, the Director tool-call and
call_agentattempt caps, the consecutive-empty guard and the Legacy action cap), so the Director finishes a discussion through its normal completion and terminal tools. Cancelling a request now stops active runs and pending event delivery. See Known issues for what this means when a child keeps failing. #2059 #2034 - Persistence: a request now fails after 10 s when every persistence connection is busy, instead of waiting forever with no error or log. Deployments that pass their own pool factory should set
connectionTimeoutMillison it too. #2093
Features
- Token Plan: add a DeepSeek one-key preset. One DeepSeek platform API key lights up chat (
deepseek-flashby default, anddeepseek-v4-pro), web search and web fetch athttps://api.deepseek.com/v1. Image, video and TTS are left untouched, and a personaldeepseekprovider is kept when the plan is connected or disconnected. #2064
Bug Fixes
- Server asset storage:
PgAssetStoreno longer holds a database transaction open across object-store byte I/O. With a byte store outside the registry's database (S3 and compatible stores),putandreplacestage the bytes: a short transaction records a stage pin, the upload runs with no connection or lock held, and a second short transaction checks the principal's quota under its lock, spends the pin and writes the entry.resolvereads the bytes after its registry transaction commits. Previously every upload and download held a pooled connection, the blob-row lock and (with a quota) the principal's quota lock for its whole duration, so a slow object store could exhaust the pool and stall every other write. The collector skips a blob any live pin names; a pin expires after the newstageTtlMsoption (default one day), and an upload or allocation that outlives it fails rather than naming bytes that may be gone. For a host that allocates inside a transaction of its own, the newPgAssetStore.stageBytes(blob)uploads before that transaction,putStaged(principal, staged, meta)allocates inside it, andreleaseStaged(staged)gives back a stage nothing will spend; generated media in the app now does this when its byte store is an object store. A staged handle is valid only in the process and package copy that produced it, and is not bound to a principal.stagesByteWrites()says whether a store stages at all; the in-database byte store keeps its single-transaction path. #2092 #2091 - Editing: an edit made just before a reload, a tab close or leaving the site is no longer lost. The autosave waits 500 ms and then reads the course before writing it, and leaving the page aborted that read, so the write was never sent. On the way out the page now writes changed pages and course settings directly, with keepalive requests that complete after the page is gone. When something cannot be written that way (a page added, removed or reordered, a project page, or changes larger than the browser allows for such requests), or an earlier save is still on its way with an older copy, the browser asks before leaving; with nothing pending it never asks. Leaving the editor (Done editing, the Learn tab, another page in the app) now saves at once instead of after the 500 ms wait.
@openmaic/storage0.39.1:HttpDocumentStore.putSceneandputStagetake an optional{ keepalive: true }(HttpDocumentWriteOptions) that sends the request withfetchkeepalive. #2113 #2112 - Workbench: when the agent changes a course's roster while that course is open, the open classroom shows the new roster without a reload. A local roster edit made in the classroom is kept. #2128
- Generation: an action type the model invented (most often
"text") is dropped with a warning instead of failing the whole scene. If every action was unknown, the scene uses the default actions, the same as an empty model response. Import paths and the write-boundary validation are unchanged. #2137 - Export: a long block formula stays on one line in the exported PPTX. The equation frame has no side insets and is not asked to wrap, so the full element width is available. #2016 #1905 (by @Frank-zhu2000)
Packages
@openmaic/storage0.39.1 (was 0.38.1; 0.39.0 was published along the way). Other packages are unchanged from 1.3.0.
Known issues
- With the classroom limits gone, a Director has nothing that stops it retrying a child that keeps failing (a Native child timing out or running out of its provider-call budget, or a Legacy child returning no visible text). The request then keeps calling the model until it is cancelled, and a self-hosted deployment has no platform request timeout to end it. #2122
- Qwen voice cloning still calls a retired model, so registering or synthesizing a cloned voice fails. The move to CosyVoice is in review in #1949. #1941
- Course issues ship their first phase only: thumbnail markers, all at warning level. An issues list and a single "Fix with agent" entry point are planned in #1900.
- On deployments protected by
ACCESS_CODE, the composer's attach button, drag-and-drop and image paste can stay unavailable after the access code is entered on a fresh page load, until the page is reloaded. A fix is in review in #1974. - The workbench agent is offered
generate_ttsandgenerate_imageeven when the deployment has no usable speech or image provider; the calls fail when made. #2040 - When one request creates several courses and their first pages are ready at the same moment, the request preview can open a tab for only one of them. #2070
- If an agent run is interrupted right after a page is saved but before the tool result is recorded, continuing the conversation regenerates that page. #2020