@mastra/spanner 1.5.0-alpha.1 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,109 @@
1
1
  # @mastra/spanner
2
2
 
3
+ ## 1.5.0
4
+
5
+ ### Minor Changes
6
+
7
+ - Added batch trace ID filtering to observability metric queries. ([#20535](https://github.com/mastra-ai/mastra/pull/20535))
8
+
9
+ ```ts
10
+ const result = await observability.getMetricBreakdown({
11
+ name: ['mastra_model_total_input_tokens'],
12
+ aggregation: 'sum',
13
+ groupBy: ['traceId'],
14
+ filters: { traceIds: ['trace-1', 'trace-2'] },
15
+ });
16
+ ```
17
+
18
+ - Added persistence for dataset item undeclared tool policies. ([#19643](https://github.com/mastra-ai/mastra/pull/19643))
19
+
20
+ ```typescript
21
+ await dataset.addItem({
22
+ input: 'What is the weather?',
23
+ unmockedToolPolicy: 'deny',
24
+ });
25
+ ```
26
+
27
+ - Stored workflow definitions now persist across restarts on every major database backend. ([#20471](https://github.com/mastra-ai/mastra/pull/20471))
28
+
29
+ Implement the `workflowDefinitions` storage domain for libsql, pg, mysql, mssql, mongodb, and spanner. Previously the stored-workflow persistence path (`POST /stored/workflows`, `Mastra.addStoredWorkflow`) only worked against `@mastra/core`'s in-memory store. Persistent adapters returned `undefined` from `storage.getStore('workflowDefinitions')` and threw when the HTTP handler tried to read/write a workflow.
30
+
31
+ ```ts
32
+ const workflowDefinitions = await storage.getStore('workflowDefinitions');
33
+ if (!workflowDefinitions) {
34
+ throw new Error('This storage adapter does not support the workflowDefinitions domain');
35
+ }
36
+
37
+ await workflowDefinitions.upsert({
38
+ id: 'greeting-workflow',
39
+ inputSchema: { type: 'object', properties: { name: { type: 'string' } }, required: ['name'] },
40
+ outputSchema: { type: 'object', properties: { text: { type: 'string' } }, required: ['text'] },
41
+ graph: [{ type: 'agent', id: 'greet', agentId: 'greeter-agent' }],
42
+ });
43
+
44
+ const { definitions, total } = await workflowDefinitions.list({ status: 'active' });
45
+ const definition = await workflowDefinitions.get('greeting-workflow');
46
+ await workflowDefinitions.delete('greeting-workflow');
47
+ ```
48
+
49
+ Each adapter now ships a `WorkflowDefinitions*` domain that:
50
+
51
+ - Creates the shared `mastra_workflow_definitions` table (or Mongo collection) from `WORKFLOW_DEFINITIONS_SCHEMA` during `init()`, plus a default index on `status`.
52
+ - Implements `upsert` / `get` / `list` / `delete` matching `WorkflowDefinitionsStorage` semantics (`list` supports `status` and `authorId` filters and orders by `updatedAt` desc). Partial upserts preserve unspecified fields, including `authorId` updates and `createdAt` / `updatedAt` semantics.
53
+ - Handles concurrent first-writes race-safely: if two callers upsert the same new id simultaneously, the losing insert detects the duplicate key, re-reads the row, and applies the partial-update path instead of failing.
54
+ - Round-trips the JSON columns (`inputSchema`, `outputSchema`, `stateSchema`, `requestContextSchema`, `metadata`, `graph`) through each adapter's JSON handling, so declarative workflow graphs rehydrate identically no matter which backend they were stored in. Malformed persisted JSON surfaces as an actionable error naming the row and column instead of hydrating raw strings.
55
+
56
+ Exported class names by adapter: `WorkflowDefinitionsLibSQL`, `WorkflowDefinitionsPG`, `WorkflowDefinitionsMySQL`, `WorkflowDefinitionsMSSQL`, `MongoDBWorkflowDefinitionsStore`, `WorkflowDefinitionsSpanner`. The composite stores (`LibSQLStore`, `PostgresStore`, `MySQLStore`, `MSSQLStore`, `MongoDBStore`, `SpannerStore`) auto-wire the new domain, so callers do not need to construct it manually — `storage.getStore('workflowDefinitions')` now returns a live handle.
57
+
58
+ The pg adapter reads `createdAt` / `updatedAt` from the auto-added `createdAtZ` / `updatedAtZ` `timestamptz` companion columns to avoid the naive-timestamp / local-TZ drift that a plain `TIMESTAMP` read exhibits under node-pg.
59
+
60
+ `@mastra/clickhouse` and `@mastra/cloudflare` register the new `mastra_workflow_definitions` table in their table/type maps so shared table constants stay exhaustive (no workflow-definitions domain implementation yet).
61
+
62
+ ### Patch Changes
63
+
64
+ - Added a comment column to experiment results so review comments persist. The column is added automatically and non-destructively on startup for existing databases (https://github.com/mastra-ai/mastra/issues/19857). ([#19865](https://github.com/mastra-ai/mastra/pull/19865))
65
+
66
+ - Dataset item scorer selections now persist across Spanner writes and reads. Setting `scorerIds` to `null` clears an item override, while `[]` remains an explicit override with no scorers. ([#20191](https://github.com/mastra-ai/mastra/pull/20191))
67
+
68
+ ```typescript
69
+ await dataset.addItem({
70
+ input: 'Evaluate this response',
71
+ scorerIds: [],
72
+ });
73
+ ```
74
+
75
+ - Updated dependencies [[`4844167`](https://github.com/mastra-ai/mastra/commit/4844167cff2d5ec5004e94edd34970833040fa3f), [`c5e56ff`](https://github.com/mastra-ai/mastra/commit/c5e56ff3bcabdf062708f2d48744fec304df6792), [`594f7b2`](https://github.com/mastra-ai/mastra/commit/594f7b28f5263fb9982fd50d95c471fb971ea984), [`7f4e26d`](https://github.com/mastra-ai/mastra/commit/7f4e26dd57bd9b23c278ea21235ab823a3810a6c), [`311f943`](https://github.com/mastra-ai/mastra/commit/311f943bee60e8fdf5c84499ea50e884276c936c), [`322daa6`](https://github.com/mastra-ai/mastra/commit/322daa6d90552909204044790d850958f6745fed), [`db4e6ff`](https://github.com/mastra-ai/mastra/commit/db4e6ff744503112eb64deeaf6c2b54bf26a54c7), [`5faf93f`](https://github.com/mastra-ai/mastra/commit/5faf93f03e19daea394b9e2a923f2e4f833407f2), [`82201f7`](https://github.com/mastra-ai/mastra/commit/82201f75fae8e050a8de2df08b74875ee74c6b83), [`cadaa13`](https://github.com/mastra-ai/mastra/commit/cadaa1372e1077c8e85eb64c5499ba8803caa323), [`0c89896`](https://github.com/mastra-ai/mastra/commit/0c8989673fb7d106837098398131e570c6023b68), [`6d19a65`](https://github.com/mastra-ai/mastra/commit/6d19a6517f5da3911023d446b7e2d5dad8adb1cb), [`23b4238`](https://github.com/mastra-ai/mastra/commit/23b423844ad0bcf2a502a68dd62866d6160f9f6d), [`80ad891`](https://github.com/mastra-ai/mastra/commit/80ad891f8cd10379aa5b5af7510c763783b2ab56), [`fb18da5`](https://github.com/mastra-ai/mastra/commit/fb18da56fc35689ae370621a8f10b5b0d8606e20), [`fb18da5`](https://github.com/mastra-ai/mastra/commit/fb18da56fc35689ae370621a8f10b5b0d8606e20), [`e320a76`](https://github.com/mastra-ai/mastra/commit/e320a763feaf65c6be3cebecf746defcbde161b3), [`03b4918`](https://github.com/mastra-ai/mastra/commit/03b4918c80d188ce375334c393e131c6e94bd7eb), [`14ef73a`](https://github.com/mastra-ai/mastra/commit/14ef73a4bbd73e7808414816eb0628ce1d80b5d7), [`b582f7f`](https://github.com/mastra-ai/mastra/commit/b582f7fa2f9c1f87d19efc63d344fbe5dda2608c), [`0a6598b`](https://github.com/mastra-ai/mastra/commit/0a6598bde80bde008986ad6616bed9632b9294cb), [`06000d7`](https://github.com/mastra-ai/mastra/commit/06000d73712911572e913b8a83339270296d0a22), [`1d677d5`](https://github.com/mastra-ai/mastra/commit/1d677d5f99d7db403f7828585e8c25f299f72628), [`9e1dad8`](https://github.com/mastra-ai/mastra/commit/9e1dad8f7b1cab2bb7ade90e5b7561f24577b88a), [`2f43145`](https://github.com/mastra-ai/mastra/commit/2f4314504c03cbba280414ac81ba3197448ee6b0), [`4e35a56`](https://github.com/mastra-ai/mastra/commit/4e35a56cdf8d74a5ff6d5eda01f2c1deaf6cc7be), [`d94b8e1`](https://github.com/mastra-ai/mastra/commit/d94b8e1cee67416d518a8c30099040061bef6a1c), [`93e28ec`](https://github.com/mastra-ai/mastra/commit/93e28ecce9031c02397e0ae8406593e5c7a95883), [`729dab4`](https://github.com/mastra-ai/mastra/commit/729dab408faccfaef0cbb048e5a4338f9172847e), [`484003d`](https://github.com/mastra-ai/mastra/commit/484003d33ff59330c86b19863e4a38732d7e4155), [`3de0188`](https://github.com/mastra-ai/mastra/commit/3de0188bfaf9a9c09c95fe322b53838cf52c70b6), [`34d34d8`](https://github.com/mastra-ai/mastra/commit/34d34d8c811df512fef4dd5459f79b7821be1866), [`b582f7f`](https://github.com/mastra-ai/mastra/commit/b582f7fa2f9c1f87d19efc63d344fbe5dda2608c), [`933d291`](https://github.com/mastra-ai/mastra/commit/933d291146b789c19442ad206f94da3e4be90c64), [`a1cb98d`](https://github.com/mastra-ai/mastra/commit/a1cb98d11990b560b98482292a1f34aa1a2d9092), [`598ad82`](https://github.com/mastra-ai/mastra/commit/598ad82d41c41389a686338a1d0e50b7400e1938), [`1fd6aad`](https://github.com/mastra-ai/mastra/commit/1fd6aad1ea4a9d32f65efa832307c35e981a4c0a)]:
76
+ - @mastra/core@1.56.0
77
+
78
+ ## 1.5.0-alpha.2
79
+
80
+ ### Minor Changes
81
+
82
+ - Added batch trace ID filtering to observability metric queries. ([#20535](https://github.com/mastra-ai/mastra/pull/20535))
83
+
84
+ ```ts
85
+ const result = await observability.getMetricBreakdown({
86
+ name: ['mastra_model_total_input_tokens'],
87
+ aggregation: 'sum',
88
+ groupBy: ['traceId'],
89
+ filters: { traceIds: ['trace-1', 'trace-2'] },
90
+ });
91
+ ```
92
+
93
+ ### Patch Changes
94
+
95
+ - Dataset item scorer selections now persist across Spanner writes and reads. Setting `scorerIds` to `null` clears an item override, while `[]` remains an explicit override with no scorers. ([#20191](https://github.com/mastra-ai/mastra/pull/20191))
96
+
97
+ ```typescript
98
+ await dataset.addItem({
99
+ input: 'Evaluate this response',
100
+ scorerIds: [],
101
+ });
102
+ ```
103
+
104
+ - Updated dependencies [[`82201f7`](https://github.com/mastra-ai/mastra/commit/82201f75fae8e050a8de2df08b74875ee74c6b83), [`fb18da5`](https://github.com/mastra-ai/mastra/commit/fb18da56fc35689ae370621a8f10b5b0d8606e20), [`fb18da5`](https://github.com/mastra-ai/mastra/commit/fb18da56fc35689ae370621a8f10b5b0d8606e20), [`0a6598b`](https://github.com/mastra-ai/mastra/commit/0a6598bde80bde008986ad6616bed9632b9294cb), [`9e1dad8`](https://github.com/mastra-ai/mastra/commit/9e1dad8f7b1cab2bb7ade90e5b7561f24577b88a), [`2f43145`](https://github.com/mastra-ai/mastra/commit/2f4314504c03cbba280414ac81ba3197448ee6b0), [`34d34d8`](https://github.com/mastra-ai/mastra/commit/34d34d8c811df512fef4dd5459f79b7821be1866)]:
105
+ - @mastra/core@1.56.0-alpha.6
106
+
3
107
  ## 1.5.0-alpha.1
4
108
 
5
109
  ### Minor Changes
@@ -3,7 +3,7 @@ name: mastra-spanner
3
3
  description: Documentation for @mastra/spanner. Use when working with @mastra/spanner APIs, configuration, or implementation.
4
4
  metadata:
5
5
  package: "@mastra/spanner"
6
- version: "1.5.0-alpha.1"
6
+ version: "1.5.0"
7
7
  ---
8
8
 
9
9
  ## When to use
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.5.0-alpha.1",
2
+ "version": "1.5.0",
3
3
  "package": "@mastra/spanner",
4
4
  "exports": {},
5
5
  "modules": {}
package/dist/index.cjs CHANGED
@@ -2789,6 +2789,7 @@ function rowToItem(row) {
2789
2789
  expectedTrajectory: t.expectedTrajectory ?? void 0,
2790
2790
  toolMocks: t.toolMocks ?? void 0,
2791
2791
  unmockedToolPolicy: t.unmockedToolPolicy ?? void 0,
2792
+ scorerIds: t.scorerIds ?? void 0,
2792
2793
  requestContext: t.requestContext ?? void 0,
2793
2794
  metadata: t.metadata ?? void 0,
2794
2795
  source: t.source ?? void 0,
@@ -2887,7 +2888,8 @@ var DatasetsSpanner = class DatasetsSpanner extends _mastra_core_storage.Dataset
2887
2888
  "organizationId",
2888
2889
  "projectId",
2889
2890
  "externalId",
2890
- "unmockedToolPolicy"
2891
+ "unmockedToolPolicy",
2892
+ "scorerIds"
2891
2893
  ]
2892
2894
  });
2893
2895
  await this.createDefaultIndexes();
@@ -3353,6 +3355,7 @@ var DatasetsSpanner = class DatasetsSpanner extends _mastra_core_storage.Dataset
3353
3355
  expectedTrajectory: args.expectedTrajectory ?? null,
3354
3356
  toolMocks: args.toolMocks ?? null,
3355
3357
  unmockedToolPolicy: args.unmockedToolPolicy ?? null,
3358
+ scorerIds: args.scorerIds ?? null,
3356
3359
  requestContext: args.requestContext ?? null,
3357
3360
  metadata: args.metadata ?? null,
3358
3361
  source: args.source ?? null,
@@ -3374,6 +3377,7 @@ var DatasetsSpanner = class DatasetsSpanner extends _mastra_core_storage.Dataset
3374
3377
  expectedTrajectory: args.expectedTrajectory,
3375
3378
  toolMocks: args.toolMocks,
3376
3379
  unmockedToolPolicy: args.unmockedToolPolicy,
3380
+ scorerIds: args.scorerIds,
3377
3381
  requestContext: args.requestContext,
3378
3382
  metadata: args.metadata,
3379
3383
  source: args.source,
@@ -3424,6 +3428,7 @@ var DatasetsSpanner = class DatasetsSpanner extends _mastra_core_storage.Dataset
3424
3428
  expectedTrajectory: args.expectedTrajectory !== void 0 ? args.expectedTrajectory : existing.expectedTrajectory,
3425
3429
  toolMocks: args.toolMocks !== void 0 ? args.toolMocks : existing.toolMocks,
3426
3430
  unmockedToolPolicy: args.unmockedToolPolicy !== void 0 ? args.unmockedToolPolicy : existing.unmockedToolPolicy,
3431
+ scorerIds: args.scorerIds !== void 0 ? args.scorerIds ?? void 0 : existing.scorerIds,
3427
3432
  requestContext: args.requestContext !== void 0 ? args.requestContext : existing.requestContext,
3428
3433
  metadata: args.metadata !== void 0 ? args.metadata : existing.metadata,
3429
3434
  source: args.source !== void 0 ? args.source : existing.source
@@ -3450,6 +3455,7 @@ var DatasetsSpanner = class DatasetsSpanner extends _mastra_core_storage.Dataset
3450
3455
  expectedTrajectory: merged.expectedTrajectory ?? null,
3451
3456
  toolMocks: merged.toolMocks ?? null,
3452
3457
  unmockedToolPolicy: merged.unmockedToolPolicy ?? null,
3458
+ scorerIds: merged.scorerIds ?? null,
3453
3459
  requestContext: merged.requestContext ?? null,
3454
3460
  metadata: merged.metadata ?? null,
3455
3461
  source: merged.source ?? null,
@@ -3472,6 +3478,7 @@ var DatasetsSpanner = class DatasetsSpanner extends _mastra_core_storage.Dataset
3472
3478
  expectedTrajectory: merged.expectedTrajectory,
3473
3479
  toolMocks: merged.toolMocks,
3474
3480
  unmockedToolPolicy: merged.unmockedToolPolicy,
3481
+ scorerIds: merged.scorerIds,
3475
3482
  requestContext: merged.requestContext,
3476
3483
  metadata: merged.metadata,
3477
3484
  source: merged.source,
@@ -3531,6 +3538,7 @@ var DatasetsSpanner = class DatasetsSpanner extends _mastra_core_storage.Dataset
3531
3538
  expectedTrajectory: existing.expectedTrajectory ?? null,
3532
3539
  toolMocks: existing.toolMocks ?? null,
3533
3540
  unmockedToolPolicy: existing.unmockedToolPolicy ?? null,
3541
+ scorerIds: existing.scorerIds ?? null,
3534
3542
  requestContext: existing.requestContext ?? null,
3535
3543
  metadata: existing.metadata ?? null,
3536
3544
  source: existing.source ?? null,
@@ -3848,6 +3856,7 @@ var DatasetsSpanner = class DatasetsSpanner extends _mastra_core_storage.Dataset
3848
3856
  expectedTrajectory: insert.item.expectedTrajectory,
3849
3857
  toolMocks: insert.item.toolMocks,
3850
3858
  unmockedToolPolicy: insert.item.unmockedToolPolicy,
3859
+ scorerIds: insert.item.scorerIds,
3851
3860
  requestContext: insert.item.requestContext,
3852
3861
  metadata: insert.item.metadata,
3853
3862
  source: insert.item.source,
@@ -3917,6 +3926,7 @@ var DatasetsSpanner = class DatasetsSpanner extends _mastra_core_storage.Dataset
3917
3926
  expectedTrajectory: existing.expectedTrajectory ?? null,
3918
3927
  toolMocks: existing.toolMocks ?? null,
3919
3928
  unmockedToolPolicy: existing.unmockedToolPolicy ?? null,
3929
+ scorerIds: existing.scorerIds ?? null,
3920
3930
  requestContext: existing.requestContext ?? null,
3921
3931
  metadata: existing.metadata ?? null,
3922
3932
  source: existing.source ?? null,
@@ -7730,6 +7740,7 @@ function buildWhereClause(filters, startIndex = 0) {
7730
7740
  const ts = filters.timestamp;
7731
7741
  if (ts?.start) bindScalar("timestamp", ts.start, ts.startExclusive ? ">" : ">=");
7732
7742
  if (ts?.end) bindScalar("timestamp", ts.end, ts.endExclusive ? "<" : "<=");
7743
+ if (Array.isArray(filters.traceIds)) bindIn("traceId", filters.traceIds);
7733
7744
  for (const k of [
7734
7745
  "traceId",
7735
7746
  "spanId",