@mastra/core@1.66.0
ParthaEth/GIF@mastra/core@1.66.0Sep 11, 2026by PaulieScanlon
Upgrading?
AI Summary
This release introduces deploy-scoped worker provisioning, advanced trace query filtering, observability signal deletion, and streaming reliability improvements.
Key Highlights
- Deploy-scoped worker provisioning for Mastra Cloud
- Advanced trace queries with richer filtering across span fields, metadata, feedback, and scores
- Observability signal deletion (feedback + scores) across storage, server, and client
- Observational Memory transform hooks
- Streaming reliability: first-chunk timeout + lower tracing overhead
New Features
- modelSettings.timeout.firstChunkMs for fast-failing streaming
- Mastra.getWorkerConfig() for runtime topology reporting
- deleteFeedback() and deleteScores() methods
- beforeObservation and afterObservation transform hooks
- Typed input and output payloads for spans
Full Release Notes
## 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](https://github.com/mastra-ai/mastra/blob/@mastra/core@1.66.0/packages/core/CHANGELOG.md)
#### Minor Changes
- Added trace filters for span names, model providers, timing, outcomes, identity, and version lineage. (#23018)
```ts
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)
```typescript
await observability.deleteFeedback({ feedbackIds: ['feedback-1'] });
await observability.deleteScores({ scoreIds: ['score-1'], organizationId: 'org-1' });
```
- Added typed `input` and `output` payloads for the spans Mastra records itself: `AGENT_RUN`, `MODEL_GENERATION`, `MODEL_STEP` and `MODEL_INFERENCE`. Every other span type keeps `any`. Stored spans narrow the same way with `isSpanRecordOfType`, which types `attributes`, `input` and `output` without a cast: (#23141)
```ts
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 `resumeData` the way it already did when the suspended tool was known.
For rendering, `describeSpanInput` and `describeSpanOutput` return the payload tagged by what it holds (`messages`, `agent-run-resume`, `interrupted`, `model-generation-result`, `json`, ...), so a UI can switch on `type` instead of checking shapes. The tag is derived at read time and never stored. `describeSpanError` returns 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)
```ts
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)
```typescript
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.firstChunkMs` so 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 a `MastraTimeoutError` whose `timeoutType` is `'firstChunk'`. Like `stepMs`, it's not retried against the same model but does move on to the next entry in `models` when fallback models are configured, and each provider retry attempt gets a fresh budget. Nested `timeout` settings are now merged per key across call-time and per-model `modelSettings`, so a per-model `stepMs` override no longer discards a call-time `firstChunkMs`. 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)
```ts
const workerConfig = mastra.getWorkerConfig();
```
- Added richer `scores.some` and `scores.none` predicates for scorer versions, sources, timestamps, span anchoring, and version lineage. (#22956)
```ts
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-error` state instead of remaining a dangling pending `call`. 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)
```ts
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 `tags` filter to `dataset.listExperimentResults()` and `GET /api/datasets/:datasetId/experiments/:experimentId/results`. Only results that carry every listed tag are returned; results with extra tags still match. (#23311)
```ts
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 `includeTotal` flag 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 determine `hasMore`. The flag defaults to `true`, preserving accurate totals for existing callers and Studio pagination. (#23389)
```typescript
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 `start` chunk without `from` and `payload`. Threads created only from persisted signals (`sendSignal(..., { ifIdle: { behavior: 'persist' } })`) now stream a `start` chunk shaped like every other agent run, so chunk consumers such as Mastra Studio no longer crash when replaying them. Fixes https://github.com/mastra-ai/mastra/issues/23244 (#23282)
### [@mastra/clickhouse@1.18.0](https://github.com/mastra-ai/mastra/blob/@mastra/clickhouse@1.18.0/stores/clickhouse/CHANGELOG.md)
#### Minor Changes
- Added ClickHouse trace filtering by richer same-span properties, including model, duration, outcome, identity, and lineage. (#23018)
```ts
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)
```ts
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)
```typescript
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)
```ts
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)
```typescript
await observability.deleteFeedback({ feedbackIds: ['feedback-1'] });
await observability.deleteScores({ scoreIds: ['score-1'], organizationId: 'org-1' });
```
### [@mastra/client-js@1.45.0](https://github.com/mastra-ai/mastra/blob/@mastra/client-js@1.45.0/client-sdks/client-js/CHANGELOG.md)
#### Minor Changes
- Added feedback predicates to `queryTraces`. (#23033)
```typescript
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)
```typescript
await mastraClient.deleteFeedback({ feedbackIds: ['feedback-1'] });
```
- Removed redundant type assertions without changing runtime behavior or public types. (#23497)
- Added a `tags` option to `listDatasetExperimentResults()` so you can restrict results to those that carry every listed tag. (#23311)
```ts
const { results } = await client.listDatasetExperimentResults('dataset-id', 'exp-id', {
tags: ['regression', 'p0'],
});
```
### [@mastra/code-sdk@1.7.1](https://github.com/mastra-ai/mastra/blob/@mastra/code-sdk@1.7.1/mastracode/sdk/CHANGELOG.md)
#### Patch Changes
- Added configurable commit co-author attribution with per-field defaults (#23495)
- Upgraded `@libsql/client` to 0.18.0 so in-memory SQLite databases keep their tables across write transactions. (#23164)
### [@mastra/deployer@1.66.0](https://github.com/mastra-ai/mastra/blob/@mastra/deployer@1.66.0/packages/deployer/CHANGELOG.md)
#### Minor Changes
- Added deploy-scoped worker provisioning for Mastra Cloud. Deployment builds now use static analysis to emit a nullable, versioned `workers.json` manifest when a Mastra instance explicitly configures shared storage and PubSub. The manifest describes orchestration, scheduler, background task, and statically discoverable custom workers, and `mastra deploy` uses it to coordinate dedicated worker services behind the `platform-workers` rollout 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 `--region` or `--yes` is 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](https://github.com/mastra-ai/mastra/blob/@mastra/docker@0.7.1/workspaces/docker/CHANGELOG.md)
#### Patch Changes
- Fixed Docker sandbox clones ignoring workingDirectory overrides. (#23430)
### [@mastra/duckdb@1.8.0](https://github.com/mastra-ai/mastra/blob/@mastra/duckdb@1.8.0/stores/duckdb/CHANGELOG.md)
#### Minor Changes
- Added DuckDB trace filtering by richer same-span properties, including model, duration, outcome, identity, and lineage. (#23018)
```ts
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 `feedbackId` now retain the latest record for feedback predicates. (#23033)
```typescript
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)
```ts
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)
```ts
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)
```typescript
await observability.deleteFeedback({ feedbackIds: ['feedback-1'] });
await observability.deleteScores({ scoreIds: ['score-1'], resourceId: 'resource-1' });
```
### [@mastra/evals@1.10.1](https://github.com/mastra-ai/mastra/blob/@mastra/evals@1.10.1/packages/evals/CHANGELOG.md)
#### 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](https://github.com/mastra-ai/mastra/blob/@mastra/factory@0.14.0/mastracode/factory/CHANGELOG.md)
#### 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.
```typescript
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_moved` and `factory.work_item.transition_rejected` for 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 type `system` for a rule. A re-entry onto the stage a card already holds is recorded with `reenter: true`.
- `factory.run.started` for 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 its `reason`, `kickoffId`, `bindingId`, `role`, `startedBy` and `agentName`. Shared-thread role handoffs retain each kickoff, and `startedBy` identifies the approver rather than the session credential owner
- `factory.agent.pr_opened`, a new action, when an agent's `gh pr create` prints 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 `location` and `userAgent`, so the WorkOS mirror stops exporting them as `unknown`
Filing a session onto a role is audited as `factory.work_item.updated` with `fields: ['sessions']`, no longer as a run start.
The list route filters by namespace instead of by action list: `GET /audit?namespaces=run,agent`. A `namespaces=` naming no known namespace is a 400, never an unfiltered page. The actions each namespace holds live in one registry on the server, `AUDIT_ACTIONS` in `storage/domains/audit/actions`, and `record`/`emit` only 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/audit` carry 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) and `wire` (`WireAuditEvent`, `WireAuditPage`, `toWireAuditEvent`). The list route now returns `WireAuditPage`: `orgId`, `factoryProjectId`, `projectRepositoryId` and the request `context` no longer leave the server.
```ts
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/web` dev commands so the Factory API always starts on the checked-out code. `dev:ui` now runs the same `prebuild` step as `build` before starting the API, so `@mastra/server`, the `mastra` CLI, `@mastra/hono`, `@mastra/deployer`, `@mastra/platform-workspace`, `@mastra/redis-streams` and `@mastra/e2b` are 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](https://github.com/mastra-ai/mastra/blob/@mastra/inngest@1.8.11/workflows/inngest/CHANGELOG.md)
#### Patch Changes
- Inngest durable agent runs now record their spans the same way core does. Token usage moves from the model span's `output` onto its `attributes`, 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](https://github.com/mastra-ai/mastra/blob/@mastra/libsql@1.22.5/stores/libsql/CHANGELOG.md)
#### 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)
```ts
const { results, pagination } = await storage.listExperimentResults({
experimentId: 'exp-id',
pagination: { page: 0, perPage: 50 },
tags: ['regression', 'p0'],
});
```
`@mastra/libsql` also fixes `addExperimentResult` double-encoding `tags` on insert, and backfills previously affected rows on `init()` 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 `LibSQLStore` and `LibSQLVector` with `url: ':memory:'` losing every table after the first interactive write transaction (e.g. any workflow step update). Upgraded `@libsql/client` to 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 with `TRANSACTION_ACTIVE`. Fixes #22328. (#23164)
### [@mastra/memory@1.29.0](https://github.com/mastra-ai/mastra/blob/@mastra/memory@1.29.0/packages/memory/CHANGELOG.md)
#### 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.hooks` now accepts `beforeObservation` (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), and `afterReflection` (rewrite the reflection before it is persisted). Transform hooks are always awaited, `void` passes 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-call `observe({ 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:
```typescript
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](https://github.com/mastra-ai/mastra/blob/@mastra/observability@1.17.7/observability/mastra/CHANGELOG.md)
#### Patch Changes
- Model step and model inference spans now use the `ModelStepInput` type from `@mastra/core` for their input. No change to what the spans record. (#23141)
### [@mastra/oracledb@0.2.4](https://github.com/mastra-ai/mastra/blob/@mastra/oracledb@0.2.4/stores/oracledb/CHANGELOG.md)
#### Patch Changes
- Added observability score deletion by id, with optional organization and resource filters. (#22558)
```typescript
await observability.deleteScores({
scoreIds: ['score-1'],
organizationId: 'org-1',
resourceId: 'resource-1',
});
```
### [@mastra/pg@1.24.0](https://github.com/mastra-ai/mastra/blob/@mastra/pg@1.24.0/stores/pg/CHANGELOG.md)
#### Minor Changes
- Added PostgreSQL trace filtering by richer same-span properties, including model, duration, outcome, identity, and lineage. (#23018)
```ts
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)
```typescript
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)
```ts
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)
```ts
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)
```typescript
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](https://github.com/mastra-ai/mastra/blob/@mastra/platform-workspace@1.6.1/workspaces/platform-workspace/CHANGELOG.md)
#### Patch Changes
- Reorganized the README so usage appears before configuration details. (#23488)
### [@mastra/playground-ui@54.0.0](https://github.com/mastra-ai/mastra/blob/@mastra/playground-ui@54.0.0/packages/playground-ui/CHANGELOG.md)
#### Minor Changes
- Adds `appearance="contained"` to display tabs with a frame around the content panel. Choose `frame="stroke"` for an outlined frame or `frame="inset"` for a filled frame. Tabs that do not fit the available width move into a `+N` dropdown. (#23441)
Set `attention` on 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.
```tsx
<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 `titleAccessory` for content beside the title, `description` for supporting text, and `variant="header"` when the page already provides its content container. Existing layouts remain unchanged when these props are omitted. (#23424)
```tsx
<SettingsLayout
title="Deployment"
titleAccessory={<Badge size="sm">Studio</Badge>}
description="Jan 1, 2025 07:00:00"
variant="header"
>
<DeploymentDetails />
</SettingsLayout>
```
#### Patch Changes
- Fix `DataListSkeleton` rendering a broken grid when a column track contains spaces (e.g. `minmax(0, 10rem)`), as on the scorer detail page. (#23428)
- `TraceTimeline` gains a `revealSpanId` prop 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 its `ref`, so a parent can hide and show it programmatically. Expanding restores the exact width the panel had when `collapse()` was called, and falls back to `defaultSize` after a reload instead of opening at `minSize`. 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](https://github.com/mastra-ai/mastra/blob/@mastra/react@1.4.12/client-sdks/react/CHANGELOG.md)
#### Patch Changes
- Fixed the chat message accumulator throwing when a `start` chunk arrives without a `payload`, so previously recorded thread streams still render. (#23282)
### [@mastra/server@1.66.0](https://github.com/mastra-ai/mastra/blob/@mastra/server@1.66.0/packages/server/CHANGELOG.md)
#### Minor Changes
- Added advanced trace-query support for richer same-span filters while keeping lightweight responses unchanged. (#23018)
```ts
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)
```typescript
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](https://github.com/mastra-ai/mastra/blob/@mastra/voice-openai-realtime@0.13.10/voice/openai-realtime-api/CHANGELOG.md)
#### 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](https://github.com/mastra-ai/mastra/blob/@mastra/agent-builder@1.1.18/packages/agent-builder/CHANGELOG.md)
- [@mastra/arize@1.3.15](https://github.com/mastra-ai/mastra/blob/@mastra/arize@1.3.15/observability/arize/CHANGELOG.md)
- [@mastra/arthur@0.4.15](https://github.com/mastra-ai/mastra/blob/@mastra/arthur@0.4.15/observability/arthur/CHANGELOG.md)
- [@mastra/braintrust@1.3.12](https://github.com/mastra-ai/mastra/blob/@mastra/braintrust@1.3.12/observability/braintrust/CHANGELOG.md)
- [@mastra/datadog@1.4.7](https://github.com/mastra-ai/mastra/blob/@mastra/datadog@1.4.7/observability/datadog/CHANGELOG.md)
- [@mastra/deepeval@0.1.9](https://github.com/mastra-ai/mastra/blob/@mastra/deepeval@0.1.9/observability/deepeval/CHANGELOG.md)
- [@mastra/deployer-cloud@1.66.0](https://github.com/mastra-ai/mastra/blob/@mastra/deployer-cloud@1.66.0/deployers/cloud/CHANGELOG.md)
- [@mastra/deployer-cloudflare@1.2.25](https://github.com/mastra-ai/mastra/blob/@mastra/deployer-cloudflare@1.2.25/deployers/cloudflare/CHANGELOG.md)
- [@mastra/deployer-netlify@1.2.25](https://github.com/mastra-ai/mastra/blob/@mastra/deployer-netlify@1.2.25/deployers/netlify/CHANGELOG.md)
- [@mastra/deployer-sandbox@0.3.10](https://github.com/mastra-ai/mastra/blob/@mastra/deployer-sandbox@0.3.10/deployers/sandbox/CHANGELOG.md)
- [@mastra/deployer-vercel@1.2.25](https://github.com/mastra-ai/mastra/blob/@mastra/deployer-vercel@1.2.25/deployers/vercel/CHANGELOG.md)
- [@mastra/editor@0.14.5](https://github.com/mastra-ai/mastra/blob/@mastra/editor@0.14.5/packages/editor/CHANGELOG.md)
- [@mastra/elysia@0.1.6](https://github.com/mastra-ai/mastra/blob/@mastra/elysia@0.1.6/server-adapters/elysia/CHANGELOG.md)
- [@mastra/express@1.5.10](https://github.com/mastra-ai/mastra/blob/@mastra/express@1.5.10/server-adapters/express/CHANGELOG.md)
- [@mastra/fastify@1.5.10](https://github.com/mastra-ai/mastra/blob/@mastra/fastify@1.5.10/server-adapters/fastify/CHANGELOG.md)
- [@mastra/hono@1.7.8](https://github.com/mastra-ai/mastra/blob/@mastra/hono@1.7.8/server-adapters/hono/CHANGELOG.md)
- [@mastra/koa@1.7.10](https://github.com/mastra-ai/mastra/blob/@mastra/koa@1.7.10/server-adapters/koa/CHANGELOG.md)
- [@mastra/laminar@1.3.17](https://github.com/mastra-ai/mastra/blob/@mastra/laminar@1.3.17/observability/laminar/CHANGELOG.md)
- [@mastra/langfuse@1.5.6](https://github.com/mastra-ai/mastra/blob/@mastra/langfuse@1.5.6/observability/langfuse/CHANGELOG.md)
- [@mastra/langsmith@1.3.17](https://github.com/mastra-ai/mastra/blob/@mastra/langsmith@1.3.17/observability/langsmith/CHANGELOG.md)
- [@mastra/longmemeval@1.1.25](https://github.com/mastra-ai/mastra/blob/@mastra/longmemeval@1.1.25/explorations/longmemeval/CHANGELOG.md)
- [@mastra/mcp-docs-server@1.2.25](https://github.com/mastra-ai/mastra/blob/@mastra/mcp-docs-server@1.2.25/packages/mcp-docs-server/CHANGELOG.md)
- [@mastra/nestjs@0.2.25](https://github.com/mastra-ai/mastra/blob/@mastra/nestjs@0.2.25/server-adapters/nestjs/CHANGELOG.md)
- [@mastra/next@0.2.24](https://github.com/mastra-ai/mastra/blob/@mastra/next@0.2.24/server-adapters/next/CHANGELOG.md)
- [@mastra/opencode@0.1.25](https://github.com/mastra-ai/mastra/blob/@mastra/opencode@0.1.25/integrations/opencode/CHANGELOG.md)
- [@mastra/otel-bridge@1.5.7](https://github.com/mastra-ai/mastra/blob/@mastra/otel-bridge@1.5.7/observability/otel-bridge/CHANGELOG.md)
- [@mastra/otel-exporter@1.3.15](https://github.com/mastra-ai/mastra/blob/@mastra/otel-exporter@1.3.15/observability/otel-exporter/CHANGELOG.md)
- [@mastra/posthog@1.3.9](https://github.com/mastra-ai/mastra/blob/@mastra/posthog@1.3.9/observability/posthog/CHANGELOG.md)
- [@mastra/sentry@1.2.17](https://github.com/mastra-ai/mastra/blob/@mastra/sentry@1.2.17/observability/sentry/CHANGELOG.md)
- [@mastra/tanstack-start@0.2.24](https://github.com/mastra-ai/mastra/blob/@mastra/tanstack-start@0.2.24/server-adapters/tanstack-start/CHANGELOG.md)
- [@mastra/temporal@0.4.4](https://github.com/mastra-ai/mastra/blob/@mastra/temporal@0.4.4/workflows/temporal/CHANGELOG.md)
- [@mastra/turso@0.1.5](https://github.com/mastra-ai/mastra/blob/@mastra/turso@0.1.5/stores/turso/CHANGELOG.md)
Related Repositories
public-apis/public-apis★ 491,151
A collective list of free APIs
NousResearch/hermes-agent★ 255,993
The agent that grows with you
yt-dlp/yt-dlp★ 200,104
A feature-rich command-line audio/video downloader
microsoft/markitdown★ 191,504
Python tool for converting files and office documents to Markdown.
Significant-Gravitas/AutoGPT★ 187,703
AutoGPT is the vision of accessible AI for everyone, to use and to build on. Our mission is to provide the tools, so that you can focus on what matters.