Highlights
Deploy-scoped worker provisioning for Mastra Cloud
@mastra/deployer can now statically emit a versioned workers.json manifest (when shared storage + PubSub are configured) to provision dedicated orchestration/scheduler/background/custom workers, and runtime workers expose an authenticated endpoint so Cloud can compare live topology vs build-time.
Advanced trace queries: richer filtering across span fields, metadata, feedback, and scores (with DB support)
Trace querying gains high-power predicates for same-span properties (model/provider, duration, outcome, identity, lineage), portable top-level metadata.* predicates, and richer feedback / scores filters—supported end-to-end in @mastra/server plus @mastra/pg, @mastra/clickhouse, and @mastra/duckdb.
Observability signal deletion (feedback + scores) across storage, server, and client
Core observability storage adds idempotent batch deleteFeedback() / deleteScores() (with optional org/resource scoping), with corresponding DELETE /api/observability/* routes in @mastra/server and client methods in @mastra/client-js; ClickHouse/DuckDB/Postgres (and others) implement backend handling.
Observational Memory transform hooks
@mastra/memory adds async transform hooks (beforeObservation, afterObservation, beforeReflection, afterReflection) so apps can filter/redact/reshape messages and generated observations/reflections before model calls or persistence.
Streaming reliability: first-chunk timeout + lower tracing overhead
modelSettings.timeout.firstChunkMs lets you fail fast if a streaming model doesn’t produce its first real content chunk in time (with fallback-model behavior preserved), and Agent.stream() no longer rebuilds observability contexts per chunk, preventing tracing overhead from scaling with response length.
Breaking Changes
- None called out in this changelog.
Changelog
@mastra/core@1.66.0
Minor Changes
-
Added trace filters for span names, model providers, timing, outcomes, identity, and version lineage. (#23018)
await mastraClient.queryTraces({ timeRange: { from: '2026-08-01T00:00:00.000Z', to: '2026-08-08T00:00:00.000Z' }, where: { spans: { some: { op: 'eq', left: { path: 'name' }, right: { literal: 'medication_lookup' } } } }, });
-
Added deleteFeedback() and deleteScores() to observability storage. Both accept a batch of ids and optional organizationId / resourceId tenant scope, are idempotent, and are implemented by the in-memory store. Storage adapters that don't implement them throw a not-implemented error. (#22558)
await observability.deleteFeedback({ feedbackIds: ['feedback-1'] }); await observability.deleteScores({ scoreIds: ['score-1'], organizationId: 'org-1' });
-
Added typed
inputandoutputpayloads for the spans Mastra records itself:AGENT_RUN,MODEL_GENERATION,MODEL_STEPandMODEL_INFERENCE. Every other span type keepsany. Stored spans narrow the same way withisSpanRecordOfType, which typesattributes,inputandoutputwithout a cast: (#23141)import { SpanType, isSpanRecordOfType } from '@mastra/core/observability'; if (isSpanRecordOfType(span, SpanType.MODEL_GENERATION)) { span.attributes?.usage; // UsageStats | undefined span.input?.messages; // MessageListInput }
A resumed agent run now always records its resume data as an object on the span input, wrapping a primitive or array under
resumeDatathe way it already did when the suspended tool was known.For rendering,
describeSpanInputanddescribeSpanOutputreturn the payload tagged by what it holds (messages,agent-run-resume,interrupted,model-generation-result,json, ...), so a UI can switch ontypeinstead of checking shapes. The tag is derived at read time and never stored.describeSpanErrorreturns the span's error info, typed. -
Added portable top-level string metadata predicates to advanced trace queries. Invalid metadata keys and values are rejected consistently, and valid predicates work inside recursive Boolean expressions. (#23027)
await mastraClient.queryTraces({ timeRange: { from: '2026-08-01T00:00:00.000Z', to: '2026-08-08T00:00:00.000Z', }, where: { op: 'eq', left: { path: 'metadata.messageId' }, right: { literal: 'message-123' } }, });
-
Added feedback predicates to advanced trace queries. (#23033)
await mastraClient.queryTraces({ timeRange: { from: '2026-08-01T00:00:00.000Z', to: '2026-08-08T00:00:00.000Z' }, where: { feedback: { some: { op: 'lt', left: { path: 'value' }, right: { literal: 0 } } } }, });
-
Added
modelSettings.timeout.firstChunkMsso you can bound how long a streaming model call may take to produce its first content. Stream-start and metadata chunks don't count; the budget is only satisfied by the first text, reasoning, tool call, file or source chunk. Going over the limit fails with aMastraTimeoutErrorwhosetimeoutTypeis'firstChunk'. LikestepMs, it's not retried against the same model but does move on to the next entry inmodelswhen fallback models are configured, and each provider retry attempt gets a fresh budget. Nestedtimeoutsettings are now merged per key across call-time and per-modelmodelSettings, so a per-modelstepMsoverride no longer discards a call-timefirstChunkMs. Closes #23072 (#23090) -
Added
Mastra.getWorkerConfig()for reporting the active worker topology and serializable instance-level settings so deployment tools can compare runtime and build-time configuration. (#22394)const workerConfig = mastra.getWorkerConfig();
-
Added richer
scores.someandscores.nonepredicates for scorer versions, sources, timestamps, span anchoring, and version lineage. (#22956)await mastraClient.queryTraces({ timeRange: { from: '2026-08-01T00:00:00.000Z', to: '2026-08-08T00:00:00.000Z' }, where: { scores: { some: { op: 'eq', left: { path: 'scorerVersion' }, right: { literal: '2.1.0' } } } }, });
Patch Changes
-
Update provider registry and model documentation with latest models and providers (
7eda39b) -
Improved suspended run discovery to retain fewer workflow snapshots while processing large sets of suspended runs. (#23506)
-
Text and reasoning spans now fold into message parts through one shared unit, used by both the live agent-controller message and the persisted message builder. The live message gains the redacted reasoning parts it ignored and the empty reasoning parts OpenAI needs for
item_reference, no longer draws an empty text part for a text block that never streamed, and keeps provider metadata off its parts since nothing live sends them back to a provider, so a running turn and its stored copy agree on every visible part. (#23310) -
Fixed Windows LocalSandbox sh -c commands losing shell operators and argument boundaries. (#23145)
-
Removed redundant type assertions in workflow execution without changing runtime behavior or public types. (#23502)
-
Fixed a terminal provider error leaving an unresolved provider-executed tool call in the final message list. When a model stream ends with an error before a provider-executed tool (e.g. Anthropic web_search) returns its result, the abandoned tool call is now reconciled to an
output-errorstate instead of remaining a dangling pendingcall. This preserves the original error, keeps successful tool results and surrounding text intact, and prevents observational memory from being deferred forever by an orphaned call. (#23356) -
Removed redundant type assertions in storage and channels without changing runtime behavior or public types. (#23503)
-
Fixed live agent trajectory scorers to receive extracted trajectories and save their results. (#23490)
-
Added storage-backed pagination, ordering, filtering, and message includes to Agent Controller message listing. Existing Session and numeric client APIs continue to return message arrays for compatibility. (#22977)
const page = await session.listMessages('thread-id', { perPage: 20, page: 0 });
Also in: @mastra/client-js@1.45.0, @mastra/server@1.66.0
-
Fixed
Agent.stream()rebuilding the observability logger and metrics contexts for every streamed chunk when tracing is enabled. The context is now resolved once per model step and reused, so tracing overhead no longer grows with the number of chunks in a response. Fixes #23198. (#23251) -
Added a
tagsfilter todataset.listExperimentResults()andGET /api/datasets/:datasetId/experiments/:experimentId/results. Only results that carry every listed tag are returned; results with extra tags still match. (#23311)const { results } = await dataset.listExperimentResults({ experimentId: 'exp-id', tags: ['regression', 'p0'], });
Over HTTP, pass repeated query params:
?tags=regression&tags=p0.Also in: @mastra/server@1.66.0
-
Added an optional
includeTotalflag to message listing. Internal message-only memory reads now disable totals so PostgresStore skips counting all matching messages. For paginated reads, it fetches one extra row to determinehasMore. The flag defaults totrue, preserving accurate totals for existing callers and Studio pagination. (#23389)const memoryStore = await storage.getStore('memory'); if (!memoryStore) throw new Error('Memory storage is unavailable'); // Default: include an accurate total. await memoryStore.listMessages({ threadId: 'thread-1', perPage: 20 }); // Skip the total when only messages and hasMore are needed. const { messages, hasMore } = await memoryStore.listMessages({ threadId: 'thread-1', perPage: 20, includeTotal: false, });
Also in: @mastra/memory@1.29.0, @mastra/pg@1.24.0
-
Use the Mastra Platform bot for default coding-agent commit attribution. (#23418)
Also in: @mastra/code-sdk@1.7.1
-
Fixed agent trajectories dropping thrown tool calls and using display labels as tool names. Trajectories now keep failed calls with success:false and prefer canonical tool identity from entityId/entityName. (#23462) (#23511)
-
Removed redundant type assertions without changing runtime behavior or public types. (#23501)
-
Fixed persisted-signal thread broadcasts emitting a
startchunk withoutfromandpayload. Threads created only from persisted signals (sendSignal(..., { ifIdle: { behavior: 'persist' } })) now stream astartchunk shaped like every other agent run, so chunk consumers such as Mastra Studio no longer crash when replaying them. Fixes #23244 (#23282)
@mastra/clickhouse@1.18.0
Minor Changes
-
Added ClickHouse trace filtering by richer same-span properties, including model, duration, outcome, identity, and lineage. (#23018)
await mastraClient.queryTraces({ timeRange: { from: '2026-08-01T00:00:00.000Z', to: '2026-08-08T00:00:00.000Z' }, where: { spans: { some: { op: 'in', value: { path: 'provider' }, set: ['openai'] } } }, });
-
Added ClickHouse support for top-level metadata predicates in advanced trace queries. (#23027)
await mastraClient.queryTraces({ timeRange: { from: '2026-08-01T00:00:00.000Z', to: '2026-08-08T00:00:00.000Z', }, where: { op: 'exists', path: 'metadata.protocolVersion' }, });
-
Added ClickHouse support for filtering traces by related feedback. Durable per-feedback write versions make the last accepted write current before trace correlation, independently of caller timestamps. Existing version-0 rows retain latest-timestamp ordering until their first post-migration replacement. (#23033)
await mastraClient.queryTraces({ timeRange: { from: '2026-08-01T00:00:00.000Z', to: '2026-08-08T00:00:00.000Z' }, where: { feedback: { some: { op: 'eq', left: { path: 'feedbackSource' }, right: { literal: 'clinician' } } } }, });
-
Added ClickHouse support for richer score predicates in advanced trace queries. (#22956)
await mastraClient.queryTraces({ timeRange: { from: '2026-08-01T00:00:00.000Z', to: '2026-08-08T00:00:00.000Z' }, where: { scores: { some: { op: 'gte', left: { path: 'timestamp' }, right: { literal: '2026-08-01T00:00:00.000Z' } } }, }, });
Patch Changes
-
Added observability feedback and score deletion. ClickHouse records deletion requests and immediately hides matching rows with lightweight deletes. Physical removal requires a configured observability retention period, which open-source deployments don't enable by default. Rows in the short-lived delta tables aren't touched and expire within two days. (#22558)
await observability.deleteFeedback({ feedbackIds: ['feedback-1'] }); await observability.deleteScores({ scoreIds: ['score-1'], organizationId: 'org-1' });
@mastra/client-js@1.45.0
Minor Changes
-
Added feedback predicates to
queryTraces. (#23033)await client.queryTraces({ timeRange: { from: '2026-08-01T00:00:00.000Z', to: '2026-08-08T00:00:00.000Z', }, where: { feedback: { some: { op: 'eq', left: { path: 'feedbackType' }, right: { literal: 'rating' } } } }, });
Patch Changes
-
Added deleteFeedback() and deleteScores() client methods for removing observability feedback and score records by id. (#22558)
await mastraClient.deleteFeedback({ feedbackIds: ['feedback-1'] });
-
Removed redundant type assertions without changing runtime behavior or public types. (#23497)
-
Added a
tagsoption tolistDatasetExperimentResults()so you can restrict results to those that carry every listed tag. (#23311)const { results } = await client.listDatasetExperimentResults('dataset-id', 'exp-id', { tags: ['regression', 'p0'], });
@mastra/code-sdk@1.7.1
Patch Changes
-
Added configurable commit co-author attribution with per-field defaults (#23495)
-
Upgraded
@libsql/clientto 0.18.0 so in-memory SQLite databases keep their tables across write transactions. (#23164)
@mastra/deployer@1.66.0
Minor Changes
-
Added deploy-scoped worker provisioning for Mastra Cloud. Deployment builds now use static analysis to emit a nullable, versioned
workers.jsonmanifest when a Mastra instance explicitly configures shared storage and PubSub. The manifest describes orchestration, scheduler, background task, and statically discoverable custom workers, andmastra deployuses it to coordinate dedicated worker services behind theplatform-workersrollout flag. Worker runtimes also expose an authenticated configuration endpoint so Mastra Cloud can compare the live topology with the build-time manifest. (#22394)Deploy preflight now detects missing or localhost database URLs, offers to attach managed Redis when interactive, and prints the exact command required for non-interactive runs. New environments prompt for a United States or Europe deployment region unless
--regionor--yesis provided. Deploy output also includes a colored architecture summary for Studio, server, workers, databases, observability, and region.
Patch Changes
- Fixed bundled Studio refresh endpoints to require configured server authentication in production while preserving development hot reload. (#23067)
@mastra/docker@0.7.1
Patch Changes
- Fixed Docker sandbox clones ignoring workingDirectory overrides. (#23430)
@mastra/duckdb@1.8.0
Minor Changes
-
Added DuckDB trace filtering by richer same-span properties, including model, duration, outcome, identity, and lineage. (#23018)
await mastraClient.queryTraces({ timeRange: { from: '2026-08-01T00:00:00.000Z', to: '2026-08-08T00:00:00.000Z' }, where: { spans: { some: { op: 'eq', left: { path: 'status' }, right: { literal: 'error' } } } }, });
-
Added DuckDB support for filtering traces by related feedback. Repeated writes for one
feedbackIdnow retain the latest record for feedback predicates. (#23033)await mastraClient.queryTraces({ timeRange: { from: '2026-08-01T00:00:00.000Z', to: '2026-08-08T00:00:00.000Z' }, where: { feedback: { some: { op: 'eq', left: { path: 'feedbackType' }, right: { literal: 'rating' } } } }, });
-
Added DuckDB support for richer score predicates in advanced trace queries. (#22956)
await mastraClient.queryTraces({ timeRange: { from: '2026-08-01T00:00:00.000Z', to: '2026-08-08T00:00:00.000Z' }, where: { scores: { some: { op: 'eq', left: { path: 'scoreSource' }, right: { literal: 'automated' } } } }, });
-
Added DuckDB support for top-level metadata predicates in advanced trace queries. (#23027)
await mastraClient.queryTraces({ timeRange: { from: '2026-08-01T00:00:00.000Z', to: '2026-08-08T00:00:00.000Z', }, where: { op: 'notExists', path: 'metadata.parentMessageId' }, });
Patch Changes
-
Added observability feedback and score deletion by id, with optional organization and resource filters. (#22558)
await observability.deleteFeedback({ feedbackIds: ['feedback-1'] }); await observability.deleteScores({ scoreIds: ['score-1'], resourceId: 'resource-1' });
@mastra/evals@1.10.1
Patch Changes
- Fixed trajectory budget scorers that treated missing token or duration measurements as zero success, and counted nested model-generation usage toward token totals. Configured token budgets now require complete model measurements; duration budgets require a valid total or complete top-level durations. Incomplete evidence rejects via the existing scorer preprocessing error path instead of certifying a perfect score. (#23468) (#23510)
@mastra/factory@0.14.0
Minor Changes
-
Added incident.io Intake integrations for direct API keys and Mastra Platform connections. (#23327)
Intake
- Import incidents and follow-ups onto any installed board, including custom boards.
- Include status, severity, ownership, labels, descriptions, and incident metadata on imported items.
- Refresh imported items when provider state changes.
API client
- Added typed read access to actions, incident updates, alerts, escalations, catalog data, teams, schedules, and policy findings.
import { IncidentioIntegration } from '@mastra/factory/integrations/incidentio/integration'; const integration = new IncidentioIntegration({ apiKey: process.env.INCIDENT_IO_API_KEY });
Patch Changes
-
The audit trail now records every stage move, run start and run end, whoever caused it. Before, only moves and starts made from the browser left a row: a rule, an agent tool, a GitHub event or the supervisor moving a card was invisible, and no run ever recorded that it ended. (#23247)
What lands in the trail now:
factory.work_item.stage_movedandfactory.work_item.transition_rejectedfor every accepted or rejected transition (deduplicated by transition identity), under the real actor: the person,agent:<binding>(also when the dispatcher carries an agent's approval),github:<login>, or actor typesystemfor a rule. A re-entry onto the stage a card already holds is recorded withreenter: true.factory.run.startedfor every kickoff that reaches an agent, including the ones the rule dispatcher starts on its own. Opening a card only prepares its session; confirmed dispatcher delivery records the kickoff, including when it reuses a live session. Concurrent retries share one local event and one mirror export.factory.run.ended, a new action, once per kickoff: the first turn that ends without suspending closes the run with itsreason,kickoffId,bindingId,role,startedByandagentName. Shared-thread role handoffs retain each kickoff, andstartedByidentifies the approver rather than the session credential ownerfactory.agent.pr_opened, a new action, when an agent'sgh pr createprints the pull request it opened; the row targets that pull request by URL, and a preview, a browser hand-off or a failed create records nothing- supervisor tool writes now go through the audit domain, so they reach the WorkOS mirror like every other row
- transition rows a person causes from the board carry that request's
locationanduserAgent, so the WorkOS mirror stops exporting them asunknown
Filing a session onto a role is audited as
factory.work_item.updatedwithfields: ['sessions'], no longer as a run start.The list route filters by namespace instead of by action list:
GET /audit?namespaces=run,agent. Anamespaces=naming no known namespace is a 400, never an unfiltered page. The actions each namespace holds live in one registry on the server,AUDIT_ACTIONSinstorage/domains/audit/actions, andrecord/emitonly accept actions from it. The same module reads an action back (parseAuditAction,isAuditAction), so a client derives its categories and labels from the registry instead of copying it.Two more modules under
storage/domains/auditcarry what a client needs without pulling storage code:actors(AUDIT_ACTOR_TYPES,isAuditActorType,isHumanActorId, the one place that knows which actor ids are the factory itself) andwire(WireAuditEvent,WireAuditPage,toWireAuditEvent). The list route now returnsWireAuditPage:orgId,factoryProjectId,projectRepositoryIdand the requestcontextno longer leave the server.const { events } = await audit.list({ orgId, factoryProjectId, actions: ['factory.run.ended'] }); // events[0].metadata → { reason: 'complete', bindingId, role, startedBy, agentName, sessionId, threadId }
-
The audit log's Load older events control now follows the board's Intake rule: coming into view loads one page of older events, and a page that adds nothing to scroll past waits for a click. With a time range selected, older events load on scroll as well, one page at a time, instead of only by click. (#23249)
-
Added a compile-time check that every built-in Factory stage has an explicit review-board visibility setting. (#23204)
-
Factory-generated commits now use the Mastra Platform bot as the commit co-author. (#23495)
-
Fixed the board's Intake column pulling every open pull request or issue of the repository on its own, behind a spinner, whenever a filter, cards already on the board, or drafts left the loaded pages with little to show. (#23249)
Reaching the end of the column now loads one page. A page that adds nothing to scroll past leaves the end where it is, so the next page waits for a scroll or the Load more button instead of loading by itself. The Activity, Attention, and Rules lists follow the same rule.
-
Fixed the
mastracode/webdev commands so the Factory API always starts on the checked-out code.dev:uinow runs the sameprebuildstep asbuildbefore starting the API, so@mastra/server, themastraCLI,@mastra/hono,@mastra/deployer,@mastra/platform-workspace,@mastra/redis-streamsand@mastra/e2bare rebuilt instead of served from a previous build. Switching to a branch that touches one of them no longer needs a root build by hand. (#23426) -
The Provider access section keeps the Org-wide scope visible for members who cannot manage org-wide credentials. It renders greyed out with a tooltip saying why, instead of disappearing and leaving only a Personal badge with no explanation. (#23421)
@mastra/inngest@1.8.11
Patch Changes
- Inngest durable agent runs now record their spans the same way core does. Token usage moves from the model span's
outputonto itsattributes, where every other model span reports it, so trace viewers show usage for Inngest agents. The agent span records the final text only; usage and steps remain on the run result. (#23141)
@mastra/libsql@1.22.5
Patch Changes
-
Added support for filtering experiment results by tags in
listExperimentResults. All requested tags must be present on a result for it to match. (#23311)const { results, pagination } = await storage.listExperimentResults({ experimentId: 'exp-id', pagination: { page: 0, perPage: 50 }, tags: ['regression', 'p0'], });
@mastra/libsqlalso fixesaddExperimentResultdouble-encodingtagson insert, and backfills previously affected rows oninit()so they match the new filter.Also in: @mastra/mongodb@1.18.7, @mastra/mysql@0.8.7, @mastra/pg@1.24.0, @mastra/spanner@1.6.6
-
Fixed
LibSQLStoreandLibSQLVectorwithurl: ':memory:'losing every table after the first interactive write transaction (e.g. any workflow step update). Upgraded@libsql/clientto 0.18.0 and queued store calls behind open transactions so concurrent reads and writes on in-memory databases and embedded replicas no longer fail withTRANSACTION_ACTIVE. Fixes #22328. (#23164)
@mastra/memory@1.29.0
Minor Changes
-
Added transform hooks to Observational Memory so applications can intercept and reshape data before it reaches the Observer/Reflector models or storage.
observationalMemory.hooksnow acceptsbeforeObservation(filter or redact messages before observation; returning no messages skips the model call),afterObservation(rewrite observations before they are persisted),beforeReflection(rewrite the observations sent to the Reflector), andafterReflection(rewrite the reflection before it is persisted). Transform hooks are always awaited,voidpasses data through unchanged, and a thrown error fails the cycle before committing its transformed observation or reflection text. After hooks replace text only: they don't recompute separate structured extractor results or undo callbacks and other side effects that already ran. Per-callobserve({ hooks })now accepts lifecycle hooks only. Fixes #15626. (#23167)Previously, lifecycle hooks could report cycle activity but could not replace the messages sent to the Observer. Configure a transform hook to filter those messages:
import { Memory } from '@mastra/memory'; const memory = new Memory({ options: { observationalMemory: { model: 'google/gemini-2.5-flash', hooks: { beforeObservation: ({ messages }) => ({ messages: messages.filter(message => message.role === 'user'), }), }, }, }, });
Patch Changes
-
Preserve provider error messages, HTTP status codes, and nested causes in observational memory failure events instead of only displaying generic errors such as Bad Request. (#23442)
-
Removed redundant type assertions without changing runtime behavior or public types. (#23499)
@mastra/observability@1.17.7
Patch Changes
- Model step and model inference spans now use the
ModelStepInputtype from@mastra/corefor their input. No change to what the spans record. (#23141)
@mastra/oracledb@0.2.4
Patch Changes
-
Added observability score deletion by id, with optional organization and resource filters. (#22558)
await observability.deleteScores({ scoreIds: ['score-1'], organizationId: 'org-1', resourceId: 'resource-1', });
@mastra/pg@1.24.0
Minor Changes
-
Added PostgreSQL trace filtering by richer same-span properties, including model, duration, outcome, identity, and lineage. (#23018)
await mastraClient.queryTraces({ timeRange: { from: '2026-08-01T00:00:00.000Z', to: '2026-08-08T00:00:00.000Z' }, where: { spans: { some: { op: 'gt', left: { path: 'durationMs' }, right: { literal: 1000 } } } }, });
-
Added PostgreSQL support for filtering traces by related feedback. Repeated writes for one
feedbackId, including writes with the same timestamp and repeated IDs in one batch, now retain the last accepted record for feedback predicates. (#23033)await mastraClient.queryTraces({ timeRange: { from: '2026-08-01T00:00:00.000Z', to: '2026-08-08T00:00:00.000Z' }, where: { feedback: { none: { op: 'eq', left: { path: 'feedbackType' }, right: { literal: 'clinical-review' } } } }, });
-
Added PostgreSQL support for top-level metadata predicates in advanced trace queries. (#23027)
await mastraClient.queryTraces({ timeRange: { from: '2026-08-01T00:00:00.000Z', to: '2026-08-08T00:00:00.000Z', }, where: { op: 'in', value: { path: 'metadata.actorRole' }, set: ['assistant', 'tool'] }, });
-
Added PostgreSQL support for richer score predicates in advanced trace queries. (#22956)
await mastraClient.queryTraces({ timeRange: { from: '2026-08-01T00:00:00.000Z', to: '2026-08-08T00:00:00.000Z' }, where: { scores: { some: { op: 'exists', path: 'spanId' } } }, });
Patch Changes
-
Added observability feedback and score deletion by id, with optional scope predicates. (#22558)
import { ObservabilityStoragePostgresVNext } from '@mastra/pg'; const observability = new ObservabilityStoragePostgresVNext({ connectionString: process.env.OBSERVABILITY_DATABASE_URL!, }); await observability.deleteFeedback({ feedbackIds: ['feedback-1'] }); await observability.deleteScores({ scoreIds: ['score-1'], organizationId: 'org-1' });
@mastra/platform-workspace@1.6.1
Patch Changes
- Reorganized the README so usage appears before configuration details. (#23488)
@mastra/playground-ui@54.0.0
Minor Changes
-
Adds
appearance="contained"to display tabs with a frame around the content panel. Chooseframe="stroke"for an outlined frame orframe="inset"for a filled frame. Tabs that do not fit the available width move into a+Ndropdown. (#23441)Set
attentionon a tab to show a line along its bottom edge. The line pulses briefly, then stays visible until you clear the prop. Users who prefer reduced motion see a static line.<Tabs defaultTab="overview" appearance="contained" frame="inset"> <TabList> <Tab value="overview">Overview</Tab> <Tab value="activity">Activity</Tab> </TabList> <TabContent value="overview">Overview content</TabContent> <TabContent value="activity">Activity content</TabContent> </Tabs>
-
Added SettingsLayout header options for pages that need more context or manage their own content layout. Use
titleAccessoryfor content beside the title,descriptionfor supporting text, andvariant="header"when the page already provides its content container. Existing layouts remain unchanged when these props are omitted. (#23424)<SettingsLayout title="Deployment" titleAccessory={<Badge size="sm">Studio</Badge>} description="Jan 1, 2025 07:00:00" variant="header" > <DeploymentDetails /> </SettingsLayout>
Patch Changes
-
Fix
DataListSkeletonrendering a broken grid when a column track contains spaces (e.g.minmax(0, 10rem)), as on the scorer detail page. (#23428) -
TraceTimelinegains arevealSpanIdprop that scrolls the given span into view once it renders, even when it is nested deep in the tree. (#23477) -
CollapsiblePanel now exposes a
CollapsiblePanelHandle(collapse()/expand()) through itsref, so a parent can hide and show it programmatically. Expanding restores the exact width the panel had whencollapse()was called, and falls back todefaultSizeafter a reload instead of opening atminSize. Removed the cursor-following pill on collapsed panel edges. (#23517) -
Added spacing between the "New Chat" button and the thread list in
ThreadList. (#23438)
@mastra/react@1.4.12
Patch Changes
- Fixed the chat message accumulator throwing when a
startchunk arrives without apayload, so previously recorded thread streams still render. (#23282)
@mastra/server@1.66.0
Minor Changes
-
Added advanced trace-query support for richer same-span filters while keeping lightweight responses unchanged. (#23018)
await mastraClient.queryTraces({ timeRange: { from: '2026-08-01T00:00:00.000Z', to: '2026-08-08T00:00:00.000Z' }, where: { spans: { some: { op: 'exists', path: 'model' } } }, });
Patch Changes
-
Added DELETE /api/observability/feedback and DELETE /api/observability/scores routes for deleting feedback and score records by id, gated behind the observability-signal-deletion core feature and the observability:delete permission. (#22558)
await fetch(`${baseUrl}/api/observability/feedback`, { method: 'DELETE', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ feedbackIds: ['feedback-1'] }), }); await fetch(`${baseUrl}/api/observability/scores`, { method: 'DELETE', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ scoreIds: ['score-1'], organizationId: 'org-1' }), });
-
Removed redundant type assertions without changing runtime behavior or public types. (#23498)
@mastra/voice-openai-realtime@0.13.10
Patch Changes
- Moved connection-failure and handshake-timeout guidance into the voice connection reference and linked it from the README. (#23488)
Other updated packages
The following packages were updated with dependency changes only:
- @mastra/agent-builder@1.1.18
- @mastra/arize@1.3.15
- @mastra/arthur@0.4.15
- @mastra/braintrust@1.3.12
- @mastra/datadog@1.4.7
- @mastra/deepeval@0.1.9
- @mastra/deployer-cloud@1.66.0
- @mastra/deployer-cloudflare@1.2.25
- @mastra/deployer-netlify@1.2.25
- @mastra/deployer-sandbox@0.3.10
- @mastra/deployer-vercel@1.2.25
- @mastra/editor@0.14.5
- @mastra/elysia@0.1.6
- @mastra/express@1.5.10
- @mastra/fastify@1.5.10
- @mastra/hono@1.7.8
- @mastra/koa@1.7.10
- @mastra/laminar@1.3.17
- @mastra/langfuse@1.5.6
- @mastra/langsmith@1.3.17
- @mastra/longmemeval@1.1.25
- @mastra/mcp-docs-server@1.2.25
- @mastra/nestjs@0.2.25
- @mastra/next@0.2.24
- @mastra/opencode@0.1.25
- @mastra/otel-bridge@1.5.7
- @mastra/otel-exporter@1.3.15
- @mastra/posthog@1.3.9
- @mastra/sentry@1.2.17
- @mastra/tanstack-start@0.2.24
- @mastra/temporal@0.4.4
- @mastra/turso@0.1.5