Changelog
Changelog — 2026-05-21
Daily docs refresh.
Features
- Batch file lookup via
GET /files/resolve. A new endpoint (mirroring/actors/resolve) returns the files for a list of IDs in one round-trip, bounded to 100 IDs. The previous/files?ids=…query branch silently returned every file in the tenant becauseListFilesDtodid not declareids. Client API:client.resolveFiles(ids)replaces the implicitlistFiles({ ids })overload, anduseResolveFilesdrops its N-parallel-getFilefallback.ListFilesParams.idsis removed —listFilesis now strictly pagination/filtering. - Create-object dialog ported from lilycare. The sidebar
CreateObjectDialog(@stndrds/ui) now uses react-hook-form + zod, an inlineIconPicker, a description textarea, and kebab-case auto-slug from the label (with diacritic handling). Payload now sends the correctlabelExpression: "{{ name }}"(double braces), which fixes the HTTP 500 the previous"{name}"produced. The form lives in a reusableObjectFormcomponent ready for future edit mode. - Wide-table horizontal scroll in the rich-text tab. The record-edit
richtexttab now uses nativeoverflow-autowith container queries so wide Notion-style tables overflow rightward inside the tab without triggering a viewport-wide horizontal scrollbar. Table UI handles switched tofloating-uistrategy: "fixed"so they no longer extenddocument.body.scrollWidthon hover.
Fixes
- Archived agent definitions stop firing.
archiveDefinitionnow disables every trigger attached to the definition (the FK CASCADE did not fire on soft-delete, so triggers stayed enabled and silently created runs against the archived definition).restoreDefinitionre-enables them, andlaunchRunguards againstdefinition.deletedAtas a belt-and-suspenders check. See the Agents concept. ObjectBuildervalidation errors now surface as HTTP 400.ObjectBuilder.build()andvalidateNamepreviously threw plainError, which the NestJSSchemaExceptionFiltercould not map — invalid payloads came back as opaque 500s. Both throw sites now raiseSchemaErrorwithVALIDATION_FAILED/INVALID_OBJECT_NAMEcodes, so the filter returns actionable 4xx responses.- Race-safe default-view bootstrap for runtime-created objects. Navigating to a freshly-created object fired several concurrent
GET /v1/views/objects/:name/defaultcalls; the previous find-then-create upsert deadlocked into 500 cascades. The Supabase repo now treats23505(unique violation) as "winner already inserted" and polls the read with backoff;view.service.getDefaultViewfalls back to an in-memory view if the poll budget is exhausted; anduse-architect-panelwaits foruseObjectto settle before registering its config. GET /records/:object?deleted=truehonorsdeletedModeagain (#620). The Supabase repo'slistignored thedeletedModeenum the NestJS controller passes and only read the legacyincludeDeletedboolean, so the trash bin andarchivedOnlyconsumers returned live records. Both the PostgREST branch and thelist_filtered_object_recordsRPC now translatedeletedMode→liveOnly/archivedOnly/all, withincludeDeletedkept as a backward-compat fallback. The runtime mock applies the same precedence.
Other
- Documents tab polish. Fixes for file-name truncation in the list row, attribute-tag placement on the documents folder header, and a portal click that was bleeding through into the underlying list.