@mastra/libsql 1.22.0-alpha.1 → 1.22.0-alpha.2

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,34 @@
1
1
  # @mastra/libsql
2
2
 
3
+ ## 1.22.0-alpha.2
4
+
5
+ ### Minor Changes
6
+
7
+ - Added embedded-replica sync support to LibSQLStore. You can now pass `syncUrl` and `syncInterval` to keep a local database file synced with a remote libSQL primary (for example Turso), matching the options LibSQLVector already supports. ([#22261](https://github.com/mastra-ai/mastra/pull/22261))
8
+
9
+ ```typescript
10
+ import { LibSQLStore } from '@mastra/libsql';
11
+
12
+ const storage = new LibSQLStore({
13
+ id: 'libsql-storage',
14
+ url: 'file:./replica.db',
15
+ syncUrl: 'libsql://your-db-name.turso.io',
16
+ authToken: process.env.TURSO_AUTH_TOKEN,
17
+ syncInterval: 60,
18
+ });
19
+ ```
20
+
21
+ See https://github.com/mastra-ai/mastra/issues/21994
22
+
23
+ ### Patch Changes
24
+
25
+ - Experiment results now include isolated metadata snapshots from the dataset items that ran. ([#22005](https://github.com/mastra-ai/mastra/pull/22005))
26
+
27
+ - Enforce atomic conditional background task state updates so cancellation cannot be overwritten during dispatch. Background task storage is no longer exposed by Cloudflare KV or ClickHouse, which cannot provide the required compare-and-set semantics. ([#22228](https://github.com/mastra-ai/mastra/pull/22228))
28
+
29
+ - Updated dependencies [[`aa3a85d`](https://github.com/mastra-ai/mastra/commit/aa3a85daf094c683bb97efdf4b6a696d2e474af5), [`d29d06f`](https://github.com/mastra-ai/mastra/commit/d29d06fe00bbd35b4571150ea04c59d2ed783c71), [`e6516df`](https://github.com/mastra-ai/mastra/commit/e6516dfcdae4f4ac0e7971d84359a81385ee602f), [`0b2a3d1`](https://github.com/mastra-ai/mastra/commit/0b2a3d1783875c5b97b7b36ab3d03d7360e0dde7), [`6bb5d71`](https://github.com/mastra-ai/mastra/commit/6bb5d7193fe9166b219f0fccae17db7a5ae86e65), [`57de7d6`](https://github.com/mastra-ai/mastra/commit/57de7d644ba7146edb4e9e6111ec4fa98c3a59e9), [`e8e299c`](https://github.com/mastra-ai/mastra/commit/e8e299cc6abdfc39947e2fec25803493015d3882), [`edfc548`](https://github.com/mastra-ai/mastra/commit/edfc548886bc7bae17b681f8b6b41a47eb32bcd2), [`a8a4871`](https://github.com/mastra-ai/mastra/commit/a8a4871215f51da95c47129602157ce5372f634a), [`5165cdc`](https://github.com/mastra-ai/mastra/commit/5165cdcdcf50e144bb8113278535196cc9b07065), [`6bb5d71`](https://github.com/mastra-ai/mastra/commit/6bb5d7193fe9166b219f0fccae17db7a5ae86e65), [`9ee8120`](https://github.com/mastra-ai/mastra/commit/9ee8120ce17f76b9f617489e05a283353742690a), [`d975e92`](https://github.com/mastra-ai/mastra/commit/d975e924d4936f46c386bd3dee39c671720289f6), [`1cfa878`](https://github.com/mastra-ai/mastra/commit/1cfa8784d8da0dfaa0317e5048bc48b6084a5ea5), [`c118318`](https://github.com/mastra-ai/mastra/commit/c1183181c9804303db4b511c2e2648f8b714712b), [`fc07c64`](https://github.com/mastra-ai/mastra/commit/fc07c6465043e08e99193a6751a01c56ffc2e7a1), [`542dee2`](https://github.com/mastra-ai/mastra/commit/542dee254167f974ff8cbbbfc0ce10f9a2616a7b), [`a58483c`](https://github.com/mastra-ai/mastra/commit/a58483cff1a9d41fce7c931843f48cb0ac450f64), [`a58483c`](https://github.com/mastra-ai/mastra/commit/a58483cff1a9d41fce7c931843f48cb0ac450f64), [`895e9df`](https://github.com/mastra-ai/mastra/commit/895e9dfc17d6f34299eca64e317ded9e5f5e5ef8)]:
30
+ - @mastra/core@1.62.0-alpha.8
31
+
3
32
  ## 1.22.0-alpha.1
4
33
 
5
34
  ### Minor Changes
@@ -3,7 +3,7 @@ name: mastra-libsql
3
3
  description: Documentation for @mastra/libsql. Use when working with @mastra/libsql APIs, configuration, or implementation.
4
4
  metadata:
5
5
  package: "@mastra/libsql"
6
- version: "1.22.0-alpha.1"
6
+ version: "1.22.0-alpha.2"
7
7
  ---
8
8
 
9
9
  ## When to use
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.22.0-alpha.1",
2
+ "version": "1.22.0-alpha.2",
3
3
  "package": "@mastra/libsql",
4
4
  "exports": {},
5
5
  "modules": {}
@@ -197,6 +197,7 @@ Each provider page includes installation instructions, configuration parameters,
197
197
  - [Convex](https://mastra.ai/integrations/databases/convex)
198
198
  - [DuckDB](https://mastra.ai/integrations/databases/duckdb)
199
199
  - [DynamoDB](https://mastra.ai/integrations/databases/dynamodb)
200
+ - [Elasticsearch](https://mastra.ai/integrations/databases/elasticsearch)
200
201
  - [Google Cloud Spanner](https://mastra.ai/integrations/databases/spanner)
201
202
  - [LanceDB](https://mastra.ai/integrations/databases/lancedb)
202
203
  - [libSQL](https://mastra.ai/integrations/databases/libsql)
@@ -89,12 +89,28 @@ storage: new LibSQLStore({
89
89
 
90
90
  > **Warning:** In-memory storage resets when the process changes. Only suitable for development.
91
91
 
92
+ Embedded replica synced with a remote primary (for example Turso):
93
+
94
+ ```typescript
95
+ storage: new LibSQLStore({
96
+ id: 'libsql-storage',
97
+ url: 'file:./replica.db',
98
+ syncUrl: 'libsql://your-db-name.aws-ap-northeast-1.turso.io',
99
+ authToken: process.env.TURSO_AUTH_TOKEN,
100
+ syncInterval: 60,
101
+ })
102
+ ```
103
+
92
104
  ## Options
93
105
 
94
106
  **url** (`string`): Database URL. Use :memory: for in-memory database, file:filename.db for a file database, or a libSQL connection string (e.g., libsql://your-database.turso.io) for remote storage.
95
107
 
96
108
  **authToken** (`string`): Authentication token for remote libSQL databases.
97
109
 
110
+ **syncUrl** (`string`): URL of the remote primary database to sync from, enabling an embedded replica. Requires a local file: url.
111
+
112
+ **syncInterval** (`number`): Interval in seconds for automatic sync with the remote primary. Only applies when syncUrl is set.
113
+
98
114
  ## Managed tables
99
115
 
100
116
  The storage implementation creates the core storage tables automatically, including `mastra_notifications` for notification inbox records and delivery metadata.
package/dist/index.cjs CHANGED
@@ -2967,7 +2967,7 @@ var BackgroundTasksLibSQL = class BackgroundTasksLibSQL extends _mastra_core_sto
2967
2967
  }
2968
2968
  });
2969
2969
  }
2970
- async updateTask(taskId, update) {
2970
+ async updateTask(taskId, update, options) {
2971
2971
  const setClauses = [];
2972
2972
  const params = [];
2973
2973
  if ("status" in update) {
@@ -3002,12 +3002,17 @@ var BackgroundTasksLibSQL = class BackgroundTasksLibSQL extends _mastra_core_sto
3002
3002
  setClauses.push("completedAt = ?");
3003
3003
  params.push(update.completedAt?.toISOString() ?? null);
3004
3004
  }
3005
- if (setClauses.length === 0) return;
3005
+ if (setClauses.length === 0) return false;
3006
3006
  params.push(taskId);
3007
- await this.#client.execute({
3008
- sql: `UPDATE ${_mastra_core_storage.TABLE_BACKGROUND_TASKS} SET ${setClauses.join(", ")} WHERE id = ?`,
3007
+ let where = "id = ?";
3008
+ if (options?.expectedStatus) {
3009
+ where += " AND status = ?";
3010
+ params.push(options.expectedStatus);
3011
+ }
3012
+ return (await this.#client.execute({
3013
+ sql: `UPDATE ${_mastra_core_storage.TABLE_BACKGROUND_TASKS} SET ${setClauses.join(", ")} WHERE ${where}`,
3009
3014
  args: params
3010
- });
3015
+ })).rowsAffected > 0;
3011
3016
  }
3012
3017
  async getTask(taskId) {
3013
3018
  const row = (await this.#client.execute({
@@ -4617,6 +4622,7 @@ var ExperimentsLibSQL = class extends _mastra_core_storage.ExperimentsStorage {
4617
4622
  "tags",
4618
4623
  "comment",
4619
4624
  "toolMockReport",
4625
+ "metadata",
4620
4626
  "organizationId",
4621
4627
  "projectId",
4622
4628
  "attempt"
@@ -4763,6 +4769,7 @@ var ExperimentsLibSQL = class extends _mastra_core_storage.ExperimentsStorage {
4763
4769
  input: (0, _mastra_core_storage.safelyParseJSON)(row.input),
4764
4770
  output: row.output ? (0, _mastra_core_storage.safelyParseJSON)(row.output) : null,
4765
4771
  groundTruth: row.groundTruth ? (0, _mastra_core_storage.safelyParseJSON)(row.groundTruth) : null,
4772
+ metadata: row.metadata ? (0, _mastra_core_storage.safelyParseJSON)(row.metadata) : null,
4766
4773
  error: row.error ? (0, _mastra_core_storage.safelyParseJSON)(row.error) : null,
4767
4774
  startedAt: (0, _mastra_core_storage.ensureDate)(row.startedAt),
4768
4775
  completedAt: (0, _mastra_core_storage.ensureDate)(row.completedAt),
@@ -5065,6 +5072,7 @@ var ExperimentsLibSQL = class extends _mastra_core_storage.ExperimentsStorage {
5065
5072
  input: input.input,
5066
5073
  output: input.output,
5067
5074
  groundTruth: input.groundTruth,
5075
+ metadata: input.metadata ?? null,
5068
5076
  error: input.error ?? null,
5069
5077
  startedAt: input.startedAt.toISOString(),
5070
5078
  completedAt: input.completedAt.toISOString(),
@@ -5087,6 +5095,7 @@ var ExperimentsLibSQL = class extends _mastra_core_storage.ExperimentsStorage {
5087
5095
  input: input.input,
5088
5096
  output: input.output,
5089
5097
  groundTruth: input.groundTruth,
5098
+ metadata: input.metadata ?? null,
5090
5099
  error: input.error,
5091
5100
  startedAt: input.startedAt,
5092
5101
  completedAt: input.completedAt,
@@ -5141,7 +5150,7 @@ var ExperimentsLibSQL = class extends _mastra_core_storage.ExperimentsStorage {
5141
5150
  await this.#client.execute({
5142
5151
  sql: `UPDATE ${_mastra_core_storage.TABLE_EXPERIMENT_RESULTS} SET
5143
5152
  "itemDatasetVersion" = ?, "organizationId" = ?, "projectId" = ?,
5144
- "input" = ?, "output" = ?, "groundTruth" = ?, "error" = ?,
5153
+ "input" = ?, "output" = ?, "groundTruth" = ?, "metadata" = ?, "error" = ?,
5145
5154
  "startedAt" = ?, "completedAt" = ?, "retryCount" = ?, "attempt" = ?,
5146
5155
  "traceId" = ?, "status" = ?, "tags" = ?, "toolMockReport" = ?
5147
5156
  WHERE "id" = ?`,
@@ -5152,6 +5161,7 @@ var ExperimentsLibSQL = class extends _mastra_core_storage.ExperimentsStorage {
5152
5161
  JSON.stringify(input.input),
5153
5162
  input.output != null ? JSON.stringify(input.output) : null,
5154
5163
  input.groundTruth != null ? JSON.stringify(input.groundTruth) : null,
5164
+ input.metadata != null ? JSON.stringify(input.metadata) : null,
5155
5165
  input.error != null ? JSON.stringify(input.error) : null,
5156
5166
  input.startedAt.toISOString(),
5157
5167
  input.completedAt.toISOString(),
@@ -14133,10 +14143,12 @@ var LibSQLStore = class extends _mastra_core_storage.MastraCompositeStore {
14133
14143
  };
14134
14144
  if ("url" in config) {
14135
14145
  if (config.url.includes(":memory:")) this.shouldCacheInit = false;
14136
- this.isLocalDb = config.url.startsWith("file:") || config.url.includes(":memory:");
14146
+ this.isLocalDb = (config.url.startsWith("file:") || config.url.includes(":memory:")) && !config.syncUrl;
14137
14147
  this.client = (0, _libsql_client.createClient)({
14138
14148
  url: config.url,
14139
14149
  ...config.authToken ? { authToken: config.authToken } : {},
14150
+ ...config.syncUrl ? { syncUrl: config.syncUrl } : {},
14151
+ ...config.syncInterval !== void 0 ? { syncInterval: config.syncInterval } : {},
14140
14152
  ...this.isLocalDb ? { timeout: this.connectionTimeoutMs } : {}
14141
14153
  });
14142
14154
  this.pragmasReady = this.isLocalDb ? this.applyLocalPragmas() : Promise.resolve();