Skip to content

September 10, 2026

Latest

Choose a tag to compare

@PaulieScanlon PaulieScanlon released this 11 Sep 09:37
· 59 commits to main since this release

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

    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)

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

    const workerConfig = mastra.getWorkerConfig();
  • Added richer scores.some and scores.none predicates 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-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)

    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)

    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)

    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 #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 tags option to listDatasetExperimentResults() 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/client to 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.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

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 feedbackId now 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_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.

    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

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

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/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

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:

    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 ModelStepInput type from @mastra/core for 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. 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.

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

    <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

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

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: