@mastra/libsql 1.27.0 → 1.27.1-alpha.1

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.
Files changed (34) hide show
  1. package/dist/_types/@internal_core/dist/knowledge-compat/index.d.ts +48 -50
  2. package/dist/_types/@internal_core/dist/memory/index.d.ts +12 -15
  3. package/dist/docs/SKILL.md +2 -1
  4. package/dist/docs/assets/SOURCE_MAP.json +1 -1
  5. package/dist/docs/references/docs-agents-human-in-the-loop.md +27 -5
  6. package/dist/docs/references/docs-agents-networks.md +1 -1
  7. package/dist/docs/references/docs-memory-memory-processors.md +7 -7
  8. package/dist/docs/references/docs-memory-message-history.md +8 -5
  9. package/dist/docs/references/docs-memory-multi-user-threads.md +1 -1
  10. package/dist/docs/references/docs-memory-overview.md +6 -0
  11. package/dist/docs/references/docs-memory-semantic-recall.md +7 -3
  12. package/dist/docs/references/docs-memory-working-memory.md +2 -2
  13. package/dist/docs/references/docs-signals-overview.md +94 -0
  14. package/dist/docs/references/docs-storage.md +1 -1
  15. package/dist/docs/references/docs-studio-editor.md +39 -23
  16. package/dist/docs/references/integrations-channels-github.md +2 -2
  17. package/dist/docs/references/integrations-databases-dynamodb.md +4 -4
  18. package/dist/docs/references/reference-core-mastra-class.md +7 -5
  19. package/dist/docs/references/reference-memory-memory-class.md +5 -5
  20. package/dist/docs/references/reference-rag-retrieval.md +24 -13
  21. package/dist/docs/references/reference-storage-retention.md +1 -1
  22. package/dist/docs/references/reference-vectors-libsql.md +1 -1
  23. package/dist/index.cjs +137 -105
  24. package/dist/index.cjs.map +1 -1
  25. package/dist/index.js +137 -105
  26. package/dist/index.js.map +1 -1
  27. package/dist/storage/db/index.d.ts +12 -0
  28. package/dist/storage/db/index.d.ts.map +1 -1
  29. package/dist/storage/domains/memory/index.d.ts.map +1 -1
  30. package/dist/storage/domains/observability/index.d.ts +2 -1
  31. package/dist/storage/domains/observability/index.d.ts.map +1 -1
  32. package/dist/storage/domains/workflows/index.d.ts +9 -3
  33. package/dist/storage/domains/workflows/index.d.ts.map +1 -1
  34. package/package.json +10 -10
package/dist/index.js CHANGED
@@ -13,7 +13,7 @@ import { coreFeatures } from "@mastra/core/features";
13
13
  import { MessageList } from "@mastra/core/agent";
14
14
  import { saveScorePayloadSchema } from "@mastra/core/evals";
15
15
  import { skillSnapshotFieldValuesEqual } from "@mastra/core/storage/domains/skills";
16
- //#region src/shared/file-transaction-gate.ts
16
+ // src/shared/file-transaction-gate.ts
17
17
  /** Interactive transactions open in this process, per database file. */
18
18
  const openTransactions = /* @__PURE__ */ new Map();
19
19
  /** The database file a local `file:` url points at, or `undefined` for anything else. */
@@ -150,8 +150,7 @@ function gateIfLocalFile(client, url, options) {
150
150
  const key = localDatabaseFileKey(url);
151
151
  return key ? gateLocalFileClient(client, key, options) : client;
152
152
  }
153
- //#endregion
154
- //#region src/shared/reset-after-busy-client.ts
153
+ // src/shared/reset-after-busy-client.ts
155
154
  function isBusy(error) {
156
155
  return error?.code === "SQLITE_BUSY";
157
156
  }
@@ -354,8 +353,7 @@ function resetConnectionsAfterBusy(client, { afterReset, maxWaitMs = 5e3 } = {})
354
353
  }
355
354
  } });
356
355
  }
357
- //#endregion
358
- //#region src/shared/single-connection-client.ts
356
+ // src/shared/single-connection-client.ts
359
357
  /**
360
358
  * Whether `@libsql/client` backs this database with exactly one connection.
361
359
  *
@@ -433,8 +431,7 @@ function gateSingleConnectionClient(client) {
433
431
  }
434
432
  } });
435
433
  }
436
- //#endregion
437
- //#region src/vector/filter.ts
434
+ // src/vector/filter.ts
438
435
  /**
439
436
  * Translates MongoDB-style filters to LibSQL compatible filters.
440
437
  *
@@ -480,8 +477,7 @@ var LibSQLFilterTranslator = class extends BaseFilterTranslator {
480
477
  return result;
481
478
  }
482
479
  };
483
- //#endregion
484
- //#region src/vector/sql-builder.ts
480
+ // src/vector/sql-builder.ts
485
481
  const createBasicOperator = (symbol) => {
486
482
  return (key, value) => {
487
483
  const jsonPath = getJsonPath(key);
@@ -771,7 +767,7 @@ function handleLogicalOperator(key, value, parentPath) {
771
767
  const values = [];
772
768
  const joinOperator = key === "$or" || key === "$nor" ? "OR" : "AND";
773
769
  const joined = (Array.isArray(value) ? value.flatMap((f) => {
774
- const branch = (!!f ? Object.entries(f) : []).map(([k, v]) => buildCondition$1(k, v, key));
770
+ const branch = (f ? Object.entries(f) : []).map(([k, v]) => buildCondition$1(k, v, key));
775
771
  if (branch.length <= 1) return branch;
776
772
  return [{
777
773
  sql: `(${branch.map((c) => c.sql).join(" AND ")})`,
@@ -815,8 +811,7 @@ const processOperator = (key, operator, operatorValue) => {
815
811
  values: Array.isArray(transformed) ? transformed : [transformed]
816
812
  };
817
813
  };
818
- //#endregion
819
- //#region src/vector/write-lock.ts
814
+ // src/vector/write-lock.ts
820
815
  const databaseWriteChains = /* @__PURE__ */ new Map();
821
816
  async function getLocalFileDatabaseKey({ url, syncUrl, cwd }) {
822
817
  if (!url.startsWith("file:") || url.includes(":memory:") || syncUrl) return;
@@ -840,8 +835,7 @@ function withLocalFileDatabaseWriteLock(key, fn) {
840
835
  });
841
836
  return result;
842
837
  }
843
- //#endregion
844
- //#region src/vector/index.ts
838
+ // src/vector/index.ts
845
839
  var LibSQLVector = class extends MastraVector {
846
840
  turso;
847
841
  maxRetries;
@@ -1459,8 +1453,7 @@ var LibSQLVector = class extends MastraVector {
1459
1453
  });
1460
1454
  }
1461
1455
  };
1462
- //#endregion
1463
- //#region src/storage/db/write-lock.ts
1456
+ // src/storage/db/write-lock.ts
1464
1457
  /**
1465
1458
  * Per-client write serialization.
1466
1459
  *
@@ -1496,8 +1489,7 @@ function withClientWriteLock(client, fn) {
1496
1489
  clientWriteChains.set(client, result.then(() => void 0, () => void 0));
1497
1490
  return result;
1498
1491
  }
1499
- //#endregion
1500
- //#region src/storage/db/run-fencing.ts
1492
+ // src/storage/db/run-fencing.ts
1501
1493
  /**
1502
1494
  * Epoch milliseconds on the database clock. `julianday('now')` rather than
1503
1495
  * `unixepoch('subsec')`, which needs SQLite 3.42 on the server.
@@ -1564,8 +1556,7 @@ function withRunFence(client, check, write) {
1564
1556
  });
1565
1557
  });
1566
1558
  }
1567
- //#endregion
1568
- //#region src/storage/db/utils.ts
1559
+ // src/storage/db/utils.ts
1569
1560
  const MAX_DEPTH = 100;
1570
1561
  /**
1571
1562
  * Safely serializes a value to JSON string with pre-sanitization.
@@ -1838,8 +1829,7 @@ function transformFromSqlRow({ tableName, sqlRow }) {
1838
1829
  }
1839
1830
  return result;
1840
1831
  }
1841
- //#endregion
1842
- //#region src/storage/db/index.ts
1832
+ // src/storage/db/index.ts
1843
1833
  /**
1844
1834
  * Default SQLite `busy_timeout` (ms) for local LibSQL connections. Chosen to
1845
1835
  * comfortably exceed the write-retry backoff window so contended writes block
@@ -2068,6 +2058,41 @@ var LibSQLDB = class extends MastraBase {
2068
2058
  });
2069
2059
  }
2070
2060
  /**
2061
+ * Updates multiple records in one write batch, with the same retry behavior as
2062
+ * {@link batchUpdate}. Returns, in input order, whether each update changed a row,
2063
+ * so callers can put extra conditions in `keys` (for example `{ endedAt: null }`).
2064
+ */
2065
+ async batchUpdateReportingChanges({ tableName, updates }) {
2066
+ return this.executeWriteOperationWithRetry(async () => {
2067
+ const changed = updates.map(() => false);
2068
+ const statements = [];
2069
+ const statementIndexes = [];
2070
+ for (const [index, { keys, data }] of updates.entries()) {
2071
+ const filteredData = await this.filterRecordToKnownColumns(tableName, data);
2072
+ if (Object.keys(filteredData).length === 0) continue;
2073
+ statements.push(prepareUpdateStatement({
2074
+ tableName,
2075
+ updates: filteredData,
2076
+ keys
2077
+ }));
2078
+ statementIndexes.push(index);
2079
+ }
2080
+ if (statements.length === 0) return changed;
2081
+ (await withClientWriteLock(this.client, () => this.client.batch(statements, "write"))).forEach((result, i) => {
2082
+ const index = statementIndexes[i];
2083
+ if (index !== void 0) changed[index] = result.rowsAffected > 0;
2084
+ });
2085
+ return changed;
2086
+ }, `batch update in table ${tableName}`).catch((error) => {
2087
+ throw new MastraError({
2088
+ id: createStorageErrorId("LIBSQL", "BATCH_UPDATE_REPORTING_CHANGES", "FAILED"),
2089
+ domain: ErrorDomain.STORAGE,
2090
+ category: ErrorCategory.THIRD_PARTY,
2091
+ details: { tableName }
2092
+ }, error);
2093
+ });
2094
+ }
2095
+ /**
2071
2096
  * Internal batch delete implementation without retry logic.
2072
2097
  * Each record can be deleted based on single or composite keys.
2073
2098
  */
@@ -2200,7 +2225,7 @@ var LibSQLDB = class extends MastraBase {
2200
2225
  * @returns The total count of matching records
2201
2226
  */
2202
2227
  async selectTotalCount({ tableName, whereClause }) {
2203
- const statement = `SELECT COUNT(*) as count FROM ${parseSqlIdentifier(tableName, "table name")} ${whereClause ? `${whereClause.sql}` : ""}`;
2228
+ const statement = `SELECT COUNT(*) as count FROM ${parseSqlIdentifier(tableName, "table name")} ${whereClause ? whereClause.sql : ""}`;
2204
2229
  const result = await this.client.execute({
2205
2230
  sql: statement,
2206
2231
  args: whereClause?.args ?? []
@@ -2572,8 +2597,7 @@ MIGRATION REQUIRED: Duplicate spans detected in ${TABLE_SPANS}\n================
2572
2597
  await this.client.execute(`CREATE INDEX IF NOT EXISTS "${parsedIndex}" ON "${parsedTable}" ("${parsedColumn}")`);
2573
2598
  }
2574
2599
  };
2575
- //#endregion
2576
- //#region src/storage/domains/agents/index.ts
2600
+ // src/storage/domains/agents/index.ts
2577
2601
  var AgentsLibSQL = class extends AgentsStorage {
2578
2602
  #db;
2579
2603
  #client;
@@ -3317,8 +3341,7 @@ var AgentsLibSQL = class extends AgentsStorage {
3317
3341
  };
3318
3342
  }
3319
3343
  };
3320
- //#endregion
3321
- //#region src/storage/retention.ts
3344
+ // src/storage/retention.ts
3322
3345
  async function ensureAnchorIndex(db, target, logger) {
3323
3346
  if (!target.indexed) return;
3324
3347
  try {
@@ -3358,8 +3381,7 @@ function resolveTargets({ policies, descriptor, order }) {
3358
3381
  order
3359
3382
  });
3360
3383
  }
3361
- //#endregion
3362
- //#region src/storage/domains/background-tasks/index.ts
3384
+ // src/storage/domains/background-tasks/index.ts
3363
3385
  function serializeJson(v) {
3364
3386
  if (v === void 0) return null;
3365
3387
  let serialized;
@@ -3684,8 +3706,7 @@ var BackgroundTasksLibSQL = class BackgroundTasksLibSQL extends BackgroundTasksS
3684
3706
  return Number(result.rows[0]?.count ?? 0);
3685
3707
  }
3686
3708
  };
3687
- //#endregion
3688
- //#region src/storage/domains/blobs/index.ts
3709
+ // src/storage/domains/blobs/index.ts
3689
3710
  var BlobsLibSQL = class extends BlobStore {
3690
3711
  #db;
3691
3712
  #client;
@@ -3783,8 +3804,7 @@ var BlobsLibSQL = class extends BlobStore {
3783
3804
  };
3784
3805
  }
3785
3806
  };
3786
- //#endregion
3787
- //#region src/storage/domains/channels/index.ts
3807
+ // src/storage/domains/channels/index.ts
3788
3808
  var ChannelsLibSQL = class extends ChannelsStorage {
3789
3809
  #db;
3790
3810
  #client;
@@ -3932,8 +3952,7 @@ var ChannelsLibSQL = class extends ChannelsStorage {
3932
3952
  };
3933
3953
  }
3934
3954
  };
3935
- //#endregion
3936
- //#region src/storage/domains/utils.ts
3955
+ // src/storage/domains/utils.ts
3937
3956
  /**
3938
3957
  * Build additional `AND col = ?` conditions for a tenancy read-scope filter.
3939
3958
  * Returned in the shape expected by libsql's parameterized SQL builders.
@@ -3974,8 +3993,7 @@ function buildScopedWhere(idColumn, idValue, filters) {
3974
3993
  args: [idValue, ...params]
3975
3994
  };
3976
3995
  }
3977
- //#endregion
3978
- //#region src/storage/domains/datasets/index.ts
3996
+ // src/storage/domains/datasets/index.ts
3979
3997
  /** Serialize a value for a jsonb column. Returns null for null/undefined. */
3980
3998
  function jsonbArg(value) {
3981
3999
  return value === void 0 || value === null ? null : JSON.stringify(value);
@@ -5243,8 +5261,7 @@ var DatasetsLibSQL = class extends DatasetsStorage {
5243
5261
  }
5244
5262
  }
5245
5263
  };
5246
- //#endregion
5247
- //#region src/storage/domains/experiments/index.ts
5264
+ // src/storage/domains/experiments/index.ts
5248
5265
  const DEFAULT_PRUNE_BATCH_SIZE = 1e3;
5249
5266
  const TAGS_IS_JSON = `CASE typeof(tags) WHEN 'blob' THEN 1 WHEN 'text' THEN json_valid(tags) ELSE 0 END`;
5250
5267
  var ExperimentsLibSQL = class extends ExperimentsStorage {
@@ -6098,8 +6115,7 @@ var ExperimentsLibSQL = class extends ExperimentsStorage {
6098
6115
  }
6099
6116
  }
6100
6117
  };
6101
- //#endregion
6102
- //#region src/storage/domains/favorites/index.ts
6118
+ // src/storage/domains/favorites/index.ts
6103
6119
  /**
6104
6120
  * Maps a favorite entity type to its parent entity table.
6105
6121
  */
@@ -6352,8 +6368,7 @@ var FavoritesLibSQL = class extends FavoritesStorage {
6352
6368
  }
6353
6369
  }
6354
6370
  };
6355
- //#endregion
6356
- //#region src/storage/domains/harness/index.ts
6371
+ // src/storage/domains/harness/index.ts
6357
6372
  const toDate$1 = (value) => new Date(value);
6358
6373
  const toOptionalDate = (value) => {
6359
6374
  if (value == null) return void 0;
@@ -6497,8 +6512,7 @@ var HarnessLibSQL = class HarnessLibSQL extends HarnessStorage {
6497
6512
  })).map(rowToSession);
6498
6513
  }
6499
6514
  };
6500
- //#endregion
6501
- //#region ../../packages/_internal-core/dist/knowledge-compat/index.js
6515
+ // ../../packages/_internal-core/dist/knowledge-compat/index.js
6502
6516
  const KNOWLEDGE_V2_CORE_FEATURE = "knowledge-v2";
6503
6517
  /** Hard cap on scope nodes returned by one `listScopeNodes` read. */
6504
6518
  const MAX_KNOWLEDGE_SCOPE_NODES = 1e3;
@@ -7132,8 +7146,7 @@ function createKnowledgeV2CoreLoader(features, loadStorageModule) {
7132
7146
  return knowledgeV2Core;
7133
7147
  };
7134
7148
  }
7135
- //#endregion
7136
- //#region src/storage/domains/knowledge/index.ts
7149
+ // src/storage/domains/knowledge/index.ts
7137
7150
  const loadKnowledgeV2Core = createKnowledgeV2CoreLoader(coreFeatures, () => import("@mastra/core/storage"));
7138
7151
  async function assertKnowledgeDescriptionWithinBoundCompat(description) {
7139
7152
  const { assertKnowledgeDescriptionWithinBound } = await loadKnowledgeV2Core();
@@ -8468,8 +8481,7 @@ var KnowledgeLibSQL = class extends KnowledgeStorage {
8468
8481
  });
8469
8482
  }
8470
8483
  };
8471
- //#endregion
8472
- //#region src/storage/domains/mcp-clients/index.ts
8484
+ // src/storage/domains/mcp-clients/index.ts
8473
8485
  var MCPClientsLibSQL = class extends MCPClientsStorage {
8474
8486
  #db;
8475
8487
  #client;
@@ -8892,8 +8904,7 @@ var MCPClientsLibSQL = class extends MCPClientsStorage {
8892
8904
  };
8893
8905
  }
8894
8906
  };
8895
- //#endregion
8896
- //#region src/storage/domains/mcp-servers/index.ts
8907
+ // src/storage/domains/mcp-servers/index.ts
8897
8908
  var MCPServersLibSQL = class extends MCPServersStorage {
8898
8909
  #db;
8899
8910
  #client;
@@ -9323,8 +9334,7 @@ var MCPServersLibSQL = class extends MCPServersStorage {
9323
9334
  };
9324
9335
  }
9325
9336
  };
9326
- //#endregion
9327
- //#region ../../packages/_internal-core/dist/memory/index.js
9337
+ // ../../packages/_internal-core/dist/memory/index.js
9328
9338
  /**
9329
9339
  * Shared rules for observational memory lifecycle writes. Every storage adapter applies
9330
9340
  * these inside its own atomic section (lock, transaction, or conditional update), so the
@@ -9409,8 +9419,7 @@ function isAppendOnlySince(storedObservations, snapshotObservations) {
9409
9419
  const snapshot = snapshotObservations ?? "";
9410
9420
  return stored === snapshot || stored.startsWith(snapshot);
9411
9421
  }
9412
- //#endregion
9413
- //#region src/storage/domains/memory/index.ts
9422
+ // src/storage/domains/memory/index.ts
9414
9423
  /**
9415
9424
  * Local constant for the observational memory table name.
9416
9425
  * Defined locally to avoid a static import that crashes on older @mastra/core
@@ -11772,8 +11781,7 @@ var MemoryLibSQL = class MemoryLibSQL extends MemoryStorage {
11772
11781
  }
11773
11782
  }
11774
11783
  };
11775
- //#endregion
11776
- //#region src/storage/domains/notifications/index.ts
11784
+ // src/storage/domains/notifications/index.ts
11777
11785
  /** Ids per UPDATE statement — keeps bind parameters well under SQLite's per-statement limit. */
11778
11786
  const BULK_ID_BATCH_SIZE = 500;
11779
11787
  const statusTimestamp = (status, now) => {
@@ -12144,8 +12152,7 @@ var NotificationsLibSQL = class NotificationsLibSQL extends NotificationsStorage
12144
12152
  return row ? rowToNotification(row) : void 0;
12145
12153
  }
12146
12154
  };
12147
- //#endregion
12148
- //#region src/storage/domains/observability/index.ts
12155
+ // src/storage/domains/observability/index.ts
12149
12156
  var ObservabilityLibSQL = class ObservabilityLibSQL extends ObservabilityStorage {
12150
12157
  /**
12151
12158
  * Spans are the only physical table; traces are derived from them. Spans
@@ -12590,24 +12597,27 @@ var ObservabilityLibSQL = class ObservabilityLibSQL extends ObservabilityStorage
12590
12597
  }, error);
12591
12598
  }
12592
12599
  }
12593
- async batchUpdateSpans(args) {
12600
+ #toSpanUpdates(records) {
12594
12601
  const now = (/* @__PURE__ */ new Date()).toISOString();
12602
+ return records.map((record) => {
12603
+ const data = { ...record.updates };
12604
+ if (data.endedAt instanceof Date) data.endedAt = data.endedAt.toISOString();
12605
+ if (data.startedAt instanceof Date) data.startedAt = data.startedAt.toISOString();
12606
+ data.updatedAt = now;
12607
+ return {
12608
+ keys: {
12609
+ spanId: record.spanId,
12610
+ traceId: record.traceId
12611
+ },
12612
+ data
12613
+ };
12614
+ });
12615
+ }
12616
+ async batchUpdateSpans(args) {
12595
12617
  try {
12596
12618
  return this.#db.batchUpdate({
12597
12619
  tableName: TABLE_SPANS,
12598
- updates: args.records.map((record) => {
12599
- const data = { ...record.updates };
12600
- if (data.endedAt instanceof Date) data.endedAt = data.endedAt.toISOString();
12601
- if (data.startedAt instanceof Date) data.startedAt = data.startedAt.toISOString();
12602
- data.updatedAt = now;
12603
- return {
12604
- keys: {
12605
- spanId: record.spanId,
12606
- traceId: record.traceId
12607
- },
12608
- data
12609
- };
12610
- })
12620
+ updates: this.#toSpanUpdates(args.records)
12611
12621
  });
12612
12622
  } catch (error) {
12613
12623
  throw new MastraError({
@@ -12617,6 +12627,30 @@ var ObservabilityLibSQL = class ObservabilityLibSQL extends ObservabilityStorage
12617
12627
  }, error);
12618
12628
  }
12619
12629
  }
12630
+ async batchUpdateUnendedSpans(args) {
12631
+ try {
12632
+ const changed = await this.#db.batchUpdateReportingChanges({
12633
+ tableName: TABLE_SPANS,
12634
+ updates: this.#toSpanUpdates(args.records).map((update) => ({
12635
+ ...update,
12636
+ keys: {
12637
+ ...update.keys,
12638
+ endedAt: null
12639
+ }
12640
+ }))
12641
+ });
12642
+ return { updated: args.records.filter((_, index) => changed[index]).map(({ traceId, spanId }) => ({
12643
+ traceId,
12644
+ spanId
12645
+ })) };
12646
+ } catch (error) {
12647
+ throw new MastraError({
12648
+ id: createStorageErrorId("LIBSQL", "BATCH_UPDATE_UNENDED_SPANS", "FAILED"),
12649
+ domain: ErrorDomain.STORAGE,
12650
+ category: ErrorCategory.USER
12651
+ }, error);
12652
+ }
12653
+ }
12620
12654
  async batchDeleteTraces(args) {
12621
12655
  this.assertUnscopedBatchDeleteTraces(args);
12622
12656
  try {
@@ -12634,8 +12668,7 @@ var ObservabilityLibSQL = class ObservabilityLibSQL extends ObservabilityStorage
12634
12668
  }
12635
12669
  }
12636
12670
  };
12637
- //#endregion
12638
- //#region src/storage/domains/prompt-blocks/index.ts
12671
+ // src/storage/domains/prompt-blocks/index.ts
12639
12672
  var PromptBlocksLibSQL = class extends PromptBlocksStorage {
12640
12673
  #db;
12641
12674
  #client;
@@ -13061,8 +13094,7 @@ var PromptBlocksLibSQL = class extends PromptBlocksStorage {
13061
13094
  };
13062
13095
  }
13063
13096
  };
13064
- //#endregion
13065
- //#region src/storage/domains/schedules/index.ts
13097
+ // src/storage/domains/schedules/index.ts
13066
13098
  function parseJson$1(val) {
13067
13099
  if (val == null) return void 0;
13068
13100
  if (typeof val === "string") try {
@@ -13410,8 +13442,7 @@ var SchedulesLibSQL = class SchedulesLibSQL extends SchedulesStorage {
13410
13442
  })).rows.map((r) => rowToTrigger(r));
13411
13443
  }
13412
13444
  };
13413
- //#endregion
13414
- //#region src/storage/domains/scorer-definitions/index.ts
13445
+ // src/storage/domains/scorer-definitions/index.ts
13415
13446
  var ScorerDefinitionsLibSQL = class extends ScorerDefinitionsStorage {
13416
13447
  #db;
13417
13448
  #client;
@@ -13838,8 +13869,7 @@ var ScorerDefinitionsLibSQL = class extends ScorerDefinitionsStorage {
13838
13869
  };
13839
13870
  }
13840
13871
  };
13841
- //#endregion
13842
- //#region src/storage/domains/scores/index.ts
13872
+ // src/storage/domains/scores/index.ts
13843
13873
  /** Appends multi-tenant scope conditions (`?` placeholders). Mutates inputs. */
13844
13874
  function appendTenancyConditions(conditions, args, filters) {
13845
13875
  if (filters?.organizationId !== void 0) {
@@ -14175,8 +14205,7 @@ var ScoresLibSQL = class ScoresLibSQL extends ScoresStorage {
14175
14205
  }
14176
14206
  }
14177
14207
  };
14178
- //#endregion
14179
- //#region src/storage/domains/skills/index.ts
14208
+ // src/storage/domains/skills/index.ts
14180
14209
  /**
14181
14210
  * Config fields that live on version rows (from StorageSkillSnapshotType).
14182
14211
  */
@@ -14742,8 +14771,7 @@ var SkillsLibSQL = class extends SkillsStorage {
14742
14771
  };
14743
14772
  }
14744
14773
  };
14745
- //#endregion
14746
- //#region src/storage/domains/thread-state/index.ts
14774
+ // src/storage/domains/thread-state/index.ts
14747
14775
  /**
14748
14776
  * LibSQL implementation of {@link ThreadStateStorage}.
14749
14777
  *
@@ -14875,8 +14903,7 @@ var ThreadStateLibSQL = class ThreadStateLibSQL extends ThreadStateStorage {
14875
14903
  }
14876
14904
  }
14877
14905
  };
14878
- //#endregion
14879
- //#region src/storage/domains/tool-provider-connections/index.ts
14906
+ // src/storage/domains/tool-provider-connections/index.ts
14880
14907
  function normaliseScope(raw) {
14881
14908
  const value = raw == null ? "per-author" : String(raw);
14882
14909
  if (value === "shared") return "shared";
@@ -15086,8 +15113,7 @@ var ToolProviderConnectionsLibSQL = class extends ToolProviderConnectionsStorage
15086
15113
  }
15087
15114
  }
15088
15115
  };
15089
- //#endregion
15090
- //#region src/storage/domains/workflow-definitions/index.ts
15116
+ // src/storage/domains/workflow-definitions/index.ts
15091
15117
  function parseJson(val, column, rowId) {
15092
15118
  if (val == null) return void 0;
15093
15119
  if (typeof val === "string") try {
@@ -15255,8 +15281,7 @@ var WorkflowDefinitionsLibSQL = class extends WorkflowDefinitionsStorage {
15255
15281
  });
15256
15282
  }
15257
15283
  };
15258
- //#endregion
15259
- //#region src/storage/domains/workflows/index.ts
15284
+ // src/storage/domains/workflows/index.ts
15260
15285
  const RUN_OWNER_COLUMNS = `generation, ownerId, leaseExpiresAt, ${DB_NOW_MS} AS nowMs`;
15261
15286
  function toRunOwnershipRecord(runId, row) {
15262
15287
  const leaseExpiresAt = row.leaseExpiresAt === null ? null : Number(row.leaseExpiresAt);
@@ -15314,6 +15339,9 @@ var WorkflowsLibSQL = class WorkflowsLibSQL extends WorkflowsStorage {
15314
15339
  supportsConcurrentUpdates() {
15315
15340
  return true;
15316
15341
  }
15342
+ supportsGuardedSnapshotWrites() {
15343
+ return true;
15344
+ }
15317
15345
  parseWorkflowRun(row) {
15318
15346
  let parsedSnapshot = row.snapshot;
15319
15347
  if (typeof parsedSnapshot === "string") try {
@@ -15587,7 +15615,7 @@ var WorkflowsLibSQL = class WorkflowsLibSQL extends WorkflowsStorage {
15587
15615
  }
15588
15616
  }), "updateWorkflowState");
15589
15617
  }
15590
- async persistWorkflowSnapshot({ workflowName, runId, resourceId, snapshot, createdAt, updatedAt, fence }) {
15618
+ async persistWorkflowSnapshot({ workflowName, runId, resourceId, snapshot, createdAt, updatedAt, fence, expectedStatus }) {
15591
15619
  const now = /* @__PURE__ */ new Date();
15592
15620
  const createdAtValue = (createdAt ?? now).toISOString();
15593
15621
  const updatedAtValue = (updatedAt ?? now).toISOString();
@@ -15595,21 +15623,30 @@ var WorkflowsLibSQL = class WorkflowsLibSQL extends WorkflowsStorage {
15595
15623
  workflowName,
15596
15624
  runId
15597
15625
  });
15626
+ const expected = expectedStatus === void 0 ? [] : Array.isArray(expectedStatus) ? expectedStatus : [expectedStatus];
15627
+ const guard = expectedStatus === void 0 ? "" : expected.length ? ` WHERE json_extract(${TABLE_WORKFLOW_SNAPSHOT}.snapshot, '$.status') IN (${expected.map(() => "?").join(", ")})` : " WHERE 0";
15598
15628
  const check = this.#runFenceCheck(fence, runId, "persistWorkflowSnapshot");
15599
- await this.executeWithRetry(() => withRunFence(this.#client, check, (writer) => writer.execute({
15629
+ return (await this.executeWithRetry(() => withRunFence(this.#client, check, (writer) => writer.execute({
15600
15630
  sql: `INSERT INTO ${TABLE_WORKFLOW_SNAPSHOT} (workflow_name, run_id, resourceId, snapshot, createdAt, updatedAt)
15601
15631
  VALUES (?, ?, ?, jsonb(?), ?, ?)
15602
15632
  ON CONFLICT(workflow_name, run_id)
15603
- DO UPDATE SET resourceId = COALESCE(excluded.resourceId, ${TABLE_WORKFLOW_SNAPSHOT}.resourceId), snapshot = excluded.snapshot, updatedAt = excluded.updatedAt`,
15633
+ DO UPDATE SET resourceId = COALESCE(excluded.resourceId, ${TABLE_WORKFLOW_SNAPSHOT}.resourceId), snapshot = excluded.snapshot, updatedAt = excluded.updatedAt${guard}`,
15604
15634
  args: [
15605
15635
  workflowName,
15606
15636
  runId,
15607
15637
  resourceId ?? null,
15608
15638
  safeStringify(snapshot),
15609
15639
  createdAtValue,
15610
- updatedAtValue
15640
+ updatedAtValue,
15641
+ ...expected
15611
15642
  ]
15612
- })), "persistWorkflowSnapshot");
15643
+ })), "persistWorkflowSnapshot")).rowsAffected > 0;
15644
+ }
15645
+ async loadWorkflowRunStatus({ workflowName, runId }) {
15646
+ return (await this.#client.execute({
15647
+ sql: `SELECT json_extract(snapshot, '$.status') AS status FROM ${TABLE_WORKFLOW_SNAPSHOT} WHERE workflow_name = ? AND run_id = ?`,
15648
+ args: [workflowName, runId]
15649
+ })).rows?.[0]?.status ?? null;
15613
15650
  }
15614
15651
  async loadWorkflowSnapshot({ workflowName, runId }) {
15615
15652
  this.logger.debug("Loading workflow snapshot", {
@@ -15737,8 +15774,7 @@ var WorkflowsLibSQL = class WorkflowsLibSQL extends WorkflowsStorage {
15737
15774
  }
15738
15775
  }
15739
15776
  };
15740
- //#endregion
15741
- //#region src/storage/domains/workspaces/index.ts
15777
+ // src/storage/domains/workspaces/index.ts
15742
15778
  /**
15743
15779
  * Config fields that live on version rows (from StorageWorkspaceSnapshotType).
15744
15780
  */
@@ -16227,8 +16263,7 @@ var WorkspacesLibSQL = class extends WorkspacesStorage {
16227
16263
  };
16228
16264
  }
16229
16265
  };
16230
- //#endregion
16231
- //#region src/storage/factory-storage.ts
16266
+ // src/storage/factory-storage.ts
16232
16267
  const IDENTIFIER_RE = /^[A-Za-z_][A-Za-z0-9_]*$/;
16233
16268
  const COLUMN_DDL = {
16234
16269
  text: "TEXT",
@@ -16643,8 +16678,7 @@ var LibSQLFactoryStorage = class extends FactoryStorage {
16643
16678
  }
16644
16679
  }
16645
16680
  };
16646
- //#endregion
16647
- //#region src/storage/index.ts
16681
+ // src/storage/index.ts
16648
16682
  const REMOTE_INIT_CONCURRENCY = 5;
16649
16683
  const REMOTE_INIT_MAX_ATTEMPTS = 3;
16650
16684
  const DEFAULT_LOCAL_CACHE_SIZE = -16e3;
@@ -16861,8 +16895,7 @@ var LibSQLStore = class extends MastraCompositeStore {
16861
16895
  if (!this.client.closed) await this.client.close();
16862
16896
  }
16863
16897
  };
16864
- //#endregion
16865
- //#region src/vector/prompt.ts
16898
+ // src/vector/prompt.ts
16866
16899
  /**
16867
16900
  * Vector store specific prompt that details supported operators and examples.
16868
16901
  * This prompt helps users construct valid filters for LibSQL Vector.
@@ -16964,7 +16997,6 @@ Example Complex Query:
16964
16997
  ]}
16965
16998
  ]
16966
16999
  }`;
16967
- //#endregion
16968
17000
  export { AgentsLibSQL, BackgroundTasksLibSQL, BlobsLibSQL, ChannelsLibSQL, DatasetsLibSQL, LibSQLStore as DefaultStorage, LibSQLStore, ExperimentsLibSQL, FavoritesLibSQL, HarnessLibSQL, KnowledgeLibSQL, LIBSQL_PROMPT, LibSQLFactoryStorage, LibSQLVector, MCPClientsLibSQL, MCPServersLibSQL, MemoryLibSQL, NotificationsLibSQL, ObservabilityLibSQL, PromptBlocksLibSQL, SchedulesLibSQL, ScorerDefinitionsLibSQL, ScoresLibSQL, SkillsLibSQL, ThreadStateLibSQL, ToolProviderConnectionsLibSQL, WorkflowDefinitionsLibSQL, WorkflowsLibSQL, WorkspacesLibSQL };
16969
17001
 
16970
17002
  //# sourceMappingURL=index.js.map