@mastra/spanner 1.9.3 → 1.9.4-alpha.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.
@@ -0,0 +1,23 @@
1
+ import type { Transaction } from '@google-cloud/spanner';
2
+ import type { RunFence } from '@mastra/core/storage';
3
+ import type { SpannerDB } from './index.js';
4
+ /** Epoch milliseconds on the database clock, read when the statement runs. */
5
+ export declare const DB_NOW_MS = "UNIX_MILLIS(CURRENT_TIMESTAMP())";
6
+ /**
7
+ * The check half of a fenced write; call it first inside the write's
8
+ * read-write transaction. Reads in a read-write transaction lock the rows they
9
+ * return until commit, so a claim that updates the row either waits for the
10
+ * write to commit or aborts it, and the retried write sees the new claim.
11
+ */
12
+ export declare function assertRunFence(tx: Transaction, claimsTable: string, fence: RunFence, operation: string): Promise<void>;
13
+ /**
14
+ * Runs `fn` in a read-write transaction and commits it, retrying the whole
15
+ * transaction when Spanner aborts it for conflicting with another one.
16
+ */
17
+ export declare function inTransaction<T>(db: SpannerDB, fn: (tx: Transaction) => Promise<T>): Promise<T>;
18
+ /**
19
+ * Runs `write` directly when it carries no fence, or in a transaction behind
20
+ * the fence check when it does.
21
+ */
22
+ export declare function withRunFence<T>(db: SpannerDB, claimsTable: string, fence: RunFence | undefined, operation: string, write: (tx: Transaction | undefined) => Promise<T>): Promise<T>;
23
+ //# sourceMappingURL=run-fencing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-fencing.d.ts","sourceRoot":"","sources":["../../../src/storage/db/run-fencing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEzC,8EAA8E;AAC9E,eAAO,MAAM,SAAS,qCAAqC,CAAC;AAE5D;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,EAAE,EAAE,WAAW,EACf,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,QAAQ,EACf,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAaf;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAiB/F;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAC5B,EAAE,EAAE,SAAS,EACb,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,QAAQ,GAAG,SAAS,EAC3B,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,CAAC,EAAE,EAAE,WAAW,GAAG,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,GACjD,OAAO,CAAC,CAAC,CAAC,CAMZ"}
@@ -1,13 +1,14 @@
1
1
  import type { MastraMessageContentV2 } from '@mastra/core/agent';
2
2
  import type { MastraDBMessage, StorageThreadType } from '@mastra/core/memory';
3
3
  import { MemoryStorage } from '@mastra/core/storage';
4
- import type { StorageResourceType, StorageListMessagesInput, StorageListMessagesOutput, StorageListThreadsInput, StorageListThreadsOutput, CreateIndexOptions } from '@mastra/core/storage';
4
+ import type { RunFence, StorageResourceType, StorageListMessagesInput, StorageListMessagesOutput, StorageListThreadsInput, StorageListThreadsOutput, CreateIndexOptions } from '@mastra/core/storage';
5
5
  import type { SpannerDomainConfig } from '../../db/index.js';
6
6
  /**
7
7
  * Spanner-backed storage for memory primitives: threads, messages, and resources
8
8
  * (the durable state surface used by `@mastra/memory`).
9
9
  */
10
10
  export declare class MemorySpanner extends MemoryStorage {
11
+ #private;
11
12
  readonly supportsPartialThreadUpdate = true;
12
13
  private database;
13
14
  private db;
@@ -15,7 +16,7 @@ export declare class MemorySpanner extends MemoryStorage {
15
16
  private readonly indexes?;
16
17
  static readonly MANAGED_TABLES: readonly ["mastra_threads", "mastra_messages", "mastra_resources"];
17
18
  constructor(config: SpannerDomainConfig);
18
- /** Creates the threads/messages/resources tables and any indexes. */
19
+ /** Creates the threads/messages/resources and run fence tables and any indexes. */
19
20
  init(): Promise<void>;
20
21
  /** Returns the default index set this domain creates during `init()`. */
21
22
  getDefaultIndexDefinitions(): CreateIndexOptions[];
@@ -23,8 +24,11 @@ export declare class MemorySpanner extends MemoryStorage {
23
24
  createDefaultIndexes(): Promise<void>;
24
25
  /** Creates custom indexes routed to this domain's tables; no-op when none supplied. */
25
26
  createCustomIndexes(): Promise<void>;
26
- /** Removes every row from threads/messages/resources tables. Intended for tests. */
27
+ /** Removes every row from threads/messages/resources and run fence tables. Intended for tests. */
27
28
  dangerouslyClearAll(): Promise<void>;
29
+ supportsRunFencing(): boolean;
30
+ raiseRunFence(fence: RunFence): Promise<boolean>;
31
+ retireRunFence(fence: RunFence): Promise<boolean>;
28
32
  /**
29
33
  * Fetches a thread row by id, or `null` when absent.
30
34
  *
@@ -41,14 +45,16 @@ export declare class MemorySpanner extends MemoryStorage {
41
45
  /** Paginated thread listing with optional resourceId/metadata/date-range filters. */
42
46
  listThreads(args: StorageListThreadsInput): Promise<StorageListThreadsOutput>;
43
47
  /** Upserts a thread row by id (`INSERT OR UPDATE` semantics). */
44
- saveThread({ thread }: {
48
+ saveThread({ thread, fence }: {
45
49
  thread: StorageThreadType;
50
+ fence?: RunFence;
46
51
  }): Promise<StorageThreadType>;
47
52
  /** Updates a thread's title and merges the metadata payload. */
48
- updateThread({ id, title, metadata, }: {
53
+ updateThread({ id, title, metadata, fence: explicitFence, }: {
49
54
  id: string;
50
55
  title?: string;
51
56
  metadata?: Record<string, unknown>;
57
+ fence?: RunFence;
52
58
  }): Promise<StorageThreadType>;
53
59
  /**
54
60
  * Atomically reassign a thread and all of its messages to a different resource.
@@ -87,13 +93,14 @@ export declare class MemorySpanner extends MemoryStorage {
87
93
  /** Paginated message listing for a thread, with optional pinned-include and date-range filters. */
88
94
  listMessages(args: StorageListMessagesInput): Promise<StorageListMessagesOutput>;
89
95
  /** Upserts a batch of messages and bumps every touched thread's `updatedAt` in a single transaction. */
90
- saveMessages({ messages }: {
96
+ saveMessages({ messages, fence: explicitFence, }: {
91
97
  messages: MastraDBMessage[];
98
+ fence?: RunFence;
92
99
  }): Promise<{
93
100
  messages: MastraDBMessage[];
94
101
  }>;
95
102
  /** Merges partial updates onto existing messages and bumps affected thread `updatedAt`. */
96
- updateMessages({ messages, }: {
103
+ updateMessages({ messages, fence: explicitFence, }: {
97
104
  messages: (Partial<Omit<MastraDBMessage, 'createdAt'>> & {
98
105
  id: string;
99
106
  content?: {
@@ -101,9 +108,12 @@ export declare class MemorySpanner extends MemoryStorage {
101
108
  content?: MastraMessageContentV2['content'];
102
109
  };
103
110
  })[];
111
+ fence?: RunFence;
104
112
  }): Promise<MastraDBMessage[]>;
105
113
  /** Deletes a batch of messages and bumps the affected threads' `updatedAt`. */
106
- deleteMessages(messageIds: string[]): Promise<void>;
114
+ deleteMessages(messageIds: string[], options?: {
115
+ fence?: RunFence;
116
+ }): Promise<void>;
107
117
  /** Fetches a resource row by id, or `null` when absent. */
108
118
  getResourceById({ resourceId }: {
109
119
  resourceId: string;
@@ -113,10 +123,11 @@ export declare class MemorySpanner extends MemoryStorage {
113
123
  resource: StorageResourceType;
114
124
  }): Promise<StorageResourceType>;
115
125
  /** Updates a resource's `workingMemory` and merges its `metadata`. */
116
- updateResource({ resourceId, workingMemory, metadata, }: {
126
+ updateResource({ resourceId, workingMemory, metadata, fence: explicitFence, }: {
117
127
  resourceId: string;
118
128
  workingMemory?: string;
119
129
  metadata?: Record<string, unknown>;
130
+ fence?: RunFence;
120
131
  }): Promise<StorageResourceType>;
121
132
  }
122
133
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/storage/domains/memory/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/storage/domains/memory/index.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { WorkflowsStorage } from '@mastra/core/storage';
2
- import type { StorageListWorkflowRunsInput, WorkflowRun, WorkflowRuns, UpdateWorkflowStateOptions, CreateIndexOptions } from '@mastra/core/storage';
2
+ import type { ClaimRunOwnershipInput, ClaimRunOwnershipResult, RenewRunOwnershipInput, RenewRunOwnershipResult, RunFence, RunOwnershipRecord, StorageListWorkflowRunsInput, WorkflowRun, WorkflowRuns, UpdateWorkflowStateOptions, CreateIndexOptions } from '@mastra/core/storage';
3
3
  import type { StepResult, WorkflowRunState } from '@mastra/core/workflows';
4
4
  import type { SpannerDomainConfig } from '../../db/index.js';
5
5
  /**
@@ -7,6 +7,7 @@ import type { SpannerDomainConfig } from '../../db/index.js';
7
7
  * incremental updates, and listing of historical runs.
8
8
  */
9
9
  export declare class WorkflowsSpanner extends WorkflowsStorage {
10
+ #private;
10
11
  private database;
11
12
  private db;
12
13
  private readonly skipDefaultIndexes?;
@@ -24,7 +25,10 @@ export declare class WorkflowsSpanner extends WorkflowsStorage {
24
25
  * DDL). Otherwise the createIndex call would fail on a missing column.
25
26
  */
26
27
  createDefaultIndexes(): Promise<void>;
27
- /** Creates the workflow snapshot table, the snapshotStatus generated column, and indexes. */
28
+ /**
29
+ * Creates the workflow snapshot and run ownership tables, the snapshotStatus
30
+ * generated column, and indexes.
31
+ */
28
32
  init(): Promise<void>;
29
33
  /**
30
34
  * Spanner-specific optimization: add a STORED generated column that extracts
@@ -49,18 +53,26 @@ export declare class WorkflowsSpanner extends WorkflowsStorage {
49
53
  private hasStatusColumn;
50
54
  /** Creates custom indexes routed to this domain's tables; no-op when none supplied. */
51
55
  createCustomIndexes(): Promise<void>;
52
- /** Removes every workflow snapshot row. Intended for tests. */
56
+ /** Removes every workflow snapshot and run ownership row. Intended for tests. */
53
57
  dangerouslyClearAll(): Promise<void>;
58
+ supportsRunFencing(): boolean;
59
+ claimRunOwnership({ runId, ownerId, leaseMs, force, expectedGeneration, }: ClaimRunOwnershipInput): Promise<ClaimRunOwnershipResult>;
60
+ renewRunOwnership({ leaseMs, ...fence }: RenewRunOwnershipInput): Promise<RenewRunOwnershipResult>;
61
+ releaseRunOwnership(fence: RunFence): Promise<boolean>;
62
+ getRunOwnership({ runId }: {
63
+ runId: string;
64
+ }): Promise<RunOwnershipRecord | null>;
54
65
  /** Decodes a raw Spanner snapshot row into the public `WorkflowRun` shape. */
55
66
  private parseWorkflowRun;
56
67
  /** Upserts a workflow run snapshot, preserving the original `createdAt` on update. */
57
- persistWorkflowSnapshot({ workflowName, runId, resourceId, snapshot, createdAt, updatedAt, }: {
68
+ persistWorkflowSnapshot({ workflowName, runId, resourceId, snapshot, createdAt, updatedAt, fence: explicitFence, }: {
58
69
  workflowName: string;
59
70
  runId: string;
60
71
  resourceId?: string;
61
72
  snapshot: WorkflowRunState;
62
73
  createdAt?: Date;
63
74
  updatedAt?: Date;
75
+ fence?: RunFence;
64
76
  }): Promise<void>;
65
77
  /** Loads the snapshot payload for a `(workflowName, runId)` pair, or `null` when absent. */
66
78
  loadWorkflowSnapshot({ workflowName, runId, }: {
@@ -68,19 +80,21 @@ export declare class WorkflowsSpanner extends WorkflowsStorage {
68
80
  runId: string;
69
81
  }): Promise<WorkflowRunState | null>;
70
82
  /** Merges a step result and request-context delta into a snapshot inside an RW transaction. */
71
- updateWorkflowResults({ workflowName, runId, stepId, result, requestContext, state, }: {
83
+ updateWorkflowResults({ workflowName, runId, stepId, result, requestContext, state, fence: explicitFence, }: {
72
84
  workflowName: string;
73
85
  runId: string;
74
86
  stepId: string;
75
87
  result: StepResult<any, any, any, any>;
76
88
  requestContext: Record<string, any>;
77
89
  state?: Record<string, any>;
90
+ fence?: RunFence;
78
91
  }): Promise<Record<string, StepResult<any, any, any, any>>>;
79
92
  /** Applies a top-level snapshot patch (e.g. status, value) inside an RW transaction. */
80
- updateWorkflowState({ workflowName, runId, opts, }: {
93
+ updateWorkflowState({ workflowName, runId, opts, fence: explicitFence, }: {
81
94
  workflowName: string;
82
95
  runId: string;
83
96
  opts: UpdateWorkflowStateOptions;
97
+ fence?: RunFence;
84
98
  }): Promise<WorkflowRunState | undefined>;
85
99
  /** Fetches a single workflow run by `runId` (optionally narrowed by `workflowName`). */
86
100
  getWorkflowRunById({ runId, workflowName, }: {
@@ -88,9 +102,10 @@ export declare class WorkflowsSpanner extends WorkflowsStorage {
88
102
  workflowName?: string;
89
103
  }): Promise<WorkflowRun | null>;
90
104
  /** Deletes the snapshot row for a `(workflowName, runId)` pair. */
91
- deleteWorkflowRunById({ runId, workflowName }: {
105
+ deleteWorkflowRunById({ runId, workflowName, fence, }: {
92
106
  runId: string;
93
107
  workflowName: string;
108
+ fence?: RunFence;
94
109
  }): Promise<void>;
95
110
  /** Paginated listing with optional workflowName, status, resourceId, and date-range filters. */
96
111
  listWorkflowRuns({ workflowName, fromDate, toDate, page, perPage, resourceId, status, }?: StorageListWorkflowRunsInput): Promise<WorkflowRuns>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/storage/domains/workflows/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/storage/domains/workflows/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mastra/spanner",
3
- "version": "1.9.3",
3
+ "version": "1.9.4-alpha.0",
4
4
  "description": "Google Cloud Spanner provider for Mastra - db storage capabilities (GoogleSQL dialect)",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -31,13 +31,13 @@
31
31
  "tsx": "^4.23.1",
32
32
  "typescript": "^7.0.2",
33
33
  "vitest": "4.1.11",
34
- "@internal/storage-test-utils": "0.0.138",
35
34
  "@internal/lint": "0.0.142",
35
+ "@internal/storage-test-utils": "0.0.138",
36
36
  "@internal/types-builder": "0.0.117",
37
- "@mastra/core": "1.76.0"
37
+ "@mastra/core": "1.77.0-alpha.4"
38
38
  },
39
39
  "peerDependencies": {
40
- "@mastra/core": ">=1.68.0-0 <2.0.0-0"
40
+ "@mastra/core": ">=1.76.0-0 <2.0.0-0"
41
41
  },
42
42
  "files": [
43
43
  "dist"