@mastra/libsql 1.16.0-alpha.0 → 1.16.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/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { createClient } from '@libsql/client';
2
2
  import { MastraError, ErrorCategory, ErrorDomain } from '@mastra/core/error';
3
- import { createVectorErrorId, AgentsStorage, AGENTS_SCHEMA, TABLE_AGENTS, AGENT_VERSIONS_SCHEMA, TABLE_AGENT_VERSIONS, createStorageErrorId, normalizePerPage, calculatePagination, BackgroundTasksStorage, TABLE_BACKGROUND_TASKS, TABLE_SCHEMAS, BlobStore, TABLE_SKILL_BLOBS, SKILL_BLOBS_SCHEMA, ChannelsStorage, TABLE_CHANNEL_INSTALLATIONS, TABLE_CHANNEL_CONFIG, DatasetsStorage, DATASETS_SCHEMA, TABLE_DATASETS, DATASET_ITEMS_SCHEMA, TABLE_DATASET_ITEMS, DATASET_VERSIONS_SCHEMA, TABLE_DATASET_VERSIONS, TABLE_EXPERIMENTS, TABLE_EXPERIMENT_RESULTS, ensureDate, safelyParseJSON, ExperimentsStorage, EXPERIMENTS_SCHEMA, EXPERIMENT_RESULTS_SCHEMA, FavoritesStorage, FAVORITES_SCHEMA, TABLE_FAVORITES, TABLE_SKILLS, HarnessStorage, TABLE_HARNESS_SESSIONS, MCPClientsStorage, MCP_CLIENTS_SCHEMA, TABLE_MCP_CLIENTS, MCP_CLIENT_VERSIONS_SCHEMA, TABLE_MCP_CLIENT_VERSIONS, MCPServersStorage, MCP_SERVERS_SCHEMA, TABLE_MCP_SERVERS, MCP_SERVER_VERSIONS_SCHEMA, TABLE_MCP_SERVER_VERSIONS, MemoryStorage, TABLE_THREADS, TABLE_RESOURCES, TABLE_MESSAGES, OBSERVATIONAL_MEMORY_TABLE_SCHEMA, NotificationsStorage, TABLE_NOTIFICATIONS, ObservabilityStorage, TABLE_SPANS, SPAN_SCHEMA, listTracesArgsSchema, toTraceSpans, PromptBlocksStorage, PROMPT_BLOCKS_SCHEMA, TABLE_PROMPT_BLOCKS, PROMPT_BLOCK_VERSIONS_SCHEMA, TABLE_PROMPT_BLOCK_VERSIONS, SchedulesStorage, TABLE_SCHEDULE_TRIGGERS, TABLE_SCHEDULES, ScorerDefinitionsStorage, SCORER_DEFINITIONS_SCHEMA, TABLE_SCORER_DEFINITIONS, SCORER_DEFINITION_VERSIONS_SCHEMA, TABLE_SCORER_DEFINITION_VERSIONS, ScoresStorage, TABLE_SCORERS, SCORERS_SCHEMA, transformScoreRow, SkillsStorage, SKILLS_SCHEMA, SKILL_VERSIONS_SCHEMA, TABLE_SKILL_VERSIONS, ThreadStateStorage, TABLE_THREAD_STATE, THREAD_STATE_SCHEMA, ToolProviderConnectionsStorage, TOOL_PROVIDER_CONNECTIONS_SCHEMA, TABLE_TOOL_PROVIDER_CONNECTIONS, WorkflowsStorage, TABLE_WORKFLOW_SNAPSHOT, WorkspacesStorage, WORKSPACES_SCHEMA, TABLE_WORKSPACES, WORKSPACE_VERSIONS_SCHEMA, TABLE_WORKSPACE_VERSIONS, MastraCompositeStore, getSqlType, parseDuration, normalizeScheduleTarget, TraceStatus, mergeWorkflowStepResult } from '@mastra/core/storage';
3
+ import { createVectorErrorId, AgentsStorage, AGENTS_SCHEMA, TABLE_AGENTS, AGENT_VERSIONS_SCHEMA, TABLE_AGENT_VERSIONS, createStorageErrorId, normalizePerPage, calculatePagination, BackgroundTasksStorage, TABLE_BACKGROUND_TASKS, TABLE_SCHEMAS, BlobStore, TABLE_SKILL_BLOBS, SKILL_BLOBS_SCHEMA, ChannelsStorage, TABLE_CHANNEL_INSTALLATIONS, TABLE_CHANNEL_CONFIG, DatasetsStorage, DATASETS_SCHEMA, TABLE_DATASETS, DATASET_ITEMS_SCHEMA, TABLE_DATASET_ITEMS, DATASET_VERSIONS_SCHEMA, TABLE_DATASET_VERSIONS, TABLE_EXPERIMENTS, TABLE_EXPERIMENT_RESULTS, ensureDate, safelyParseJSON, hasErrorCode, ExperimentsStorage, EXPERIMENTS_SCHEMA, EXPERIMENT_RESULTS_SCHEMA, FavoritesStorage, FAVORITES_SCHEMA, TABLE_FAVORITES, TABLE_SKILLS, HarnessStorage, TABLE_HARNESS_SESSIONS, MCPClientsStorage, MCP_CLIENTS_SCHEMA, TABLE_MCP_CLIENTS, MCP_CLIENT_VERSIONS_SCHEMA, TABLE_MCP_CLIENT_VERSIONS, MCPServersStorage, MCP_SERVERS_SCHEMA, TABLE_MCP_SERVERS, MCP_SERVER_VERSIONS_SCHEMA, TABLE_MCP_SERVER_VERSIONS, MemoryStorage, TABLE_THREADS, TABLE_RESOURCES, TABLE_MESSAGES, OBSERVATIONAL_MEMORY_TABLE_SCHEMA, NotificationsStorage, TABLE_NOTIFICATIONS, ObservabilityStorage, TABLE_SPANS, SPAN_SCHEMA, listTracesArgsSchema, toTraceSpans, PromptBlocksStorage, PROMPT_BLOCKS_SCHEMA, TABLE_PROMPT_BLOCKS, PROMPT_BLOCK_VERSIONS_SCHEMA, TABLE_PROMPT_BLOCK_VERSIONS, SchedulesStorage, TABLE_SCHEDULE_TRIGGERS, TABLE_SCHEDULES, ScorerDefinitionsStorage, SCORER_DEFINITIONS_SCHEMA, TABLE_SCORER_DEFINITIONS, SCORER_DEFINITION_VERSIONS_SCHEMA, TABLE_SCORER_DEFINITION_VERSIONS, ScoresStorage, TABLE_SCORERS, SCORERS_SCHEMA, transformScoreRow, SkillsStorage, SKILLS_SCHEMA, SKILL_VERSIONS_SCHEMA, TABLE_SKILL_VERSIONS, ThreadStateStorage, TABLE_THREAD_STATE, THREAD_STATE_SCHEMA, ToolProviderConnectionsStorage, TOOL_PROVIDER_CONNECTIONS_SCHEMA, TABLE_TOOL_PROVIDER_CONNECTIONS, WorkflowsStorage, TABLE_WORKFLOW_SNAPSHOT, WorkspacesStorage, WORKSPACES_SCHEMA, TABLE_WORKSPACES, WORKSPACE_VERSIONS_SCHEMA, TABLE_WORKSPACE_VERSIONS, MastraCompositeStore, getSqlType, parseDuration, normalizeScheduleTarget, TraceStatus, mergeWorkflowStepResult } from '@mastra/core/storage';
4
4
  import { parseSqlIdentifier, parseFieldKey } from '@mastra/core/utils';
5
5
  import { MastraVector, validateTopK, validateUpsertInput } from '@mastra/core/vector';
6
6
  import { BaseFilterTranslator } from '@mastra/core/vector/filter';
@@ -1595,6 +1595,19 @@ var LibSQLDB = class extends MastraBase {
1595
1595
  insert(args) {
1596
1596
  return this.executeWriteOperationWithRetry(() => this.doInsert(args), `insert into table ${args.tableName}`);
1597
1597
  }
1598
+ /** Inserts a record without replacing an existing primary key. */
1599
+ insertOnly(args) {
1600
+ return this.executeWriteOperationWithRetry(async () => {
1601
+ const filteredRecord = await this.filterRecordToKnownColumns(args.tableName, args.record);
1602
+ if (Object.keys(filteredRecord).length === 0) return;
1603
+ const statement = prepareStatement({ tableName: args.tableName, record: filteredRecord });
1604
+ if (!statement.sql.startsWith("INSERT OR REPLACE")) {
1605
+ throw new Error(`Unexpected insert statement generated for table ${args.tableName}`);
1606
+ }
1607
+ statement.sql = statement.sql.replace("INSERT OR REPLACE", "INSERT");
1608
+ await withClientWriteLock(this.client, () => this.client.execute(statement));
1609
+ }, `insert into table ${args.tableName}`);
1610
+ }
1598
1611
  /**
1599
1612
  * Internal update implementation without retry logic.
1600
1613
  */
@@ -3904,6 +3917,7 @@ var DatasetsLibSQL = class extends DatasetsStorage {
3904
3917
  await this.#addColumnIfNotExists(TABLE_DATASET_ITEMS, "organizationId", "TEXT");
3905
3918
  await this.#addColumnIfNotExists(TABLE_DATASET_ITEMS, "projectId", "TEXT");
3906
3919
  await this.#addColumnIfNotExists(TABLE_DATASET_ITEMS, "toolMocks", "TEXT");
3920
+ await this.#addColumnIfNotExists(TABLE_DATASET_ITEMS, "externalId", "TEXT");
3907
3921
  await this.#client.batch(
3908
3922
  [
3909
3923
  {
@@ -3914,6 +3928,10 @@ var DatasetsLibSQL = class extends DatasetsStorage {
3914
3928
  sql: `CREATE INDEX IF NOT EXISTS idx_dataset_items_dataset_version ON "${TABLE_DATASET_ITEMS}" ("datasetId", "datasetVersion")`,
3915
3929
  args: []
3916
3930
  },
3931
+ {
3932
+ sql: `CREATE INDEX IF NOT EXISTS idx_dataset_items_dataset_externalid_version ON "${TABLE_DATASET_ITEMS}" ("datasetId", "externalId", "datasetVersion")`,
3933
+ args: []
3934
+ },
3917
3935
  {
3918
3936
  sql: `CREATE INDEX IF NOT EXISTS idx_dataset_items_dataset_validto_deleted ON "${TABLE_DATASET_ITEMS}" ("datasetId", "validTo", "isDeleted")`,
3919
3937
  args: []
@@ -3993,6 +4011,7 @@ var DatasetsLibSQL = class extends DatasetsStorage {
3993
4011
  id: row.id,
3994
4012
  datasetId: row.datasetId,
3995
4013
  datasetVersion: row.datasetVersion,
4014
+ externalId: row.externalId ?? null,
3996
4015
  organizationId: row.organizationId ?? null,
3997
4016
  projectId: row.projectId ?? null,
3998
4017
  input: safelyParseJSON(row.input),
@@ -4011,6 +4030,7 @@ var DatasetsLibSQL = class extends DatasetsStorage {
4011
4030
  id: row.id,
4012
4031
  datasetId: row.datasetId,
4013
4032
  datasetVersion: row.datasetVersion,
4033
+ externalId: row.externalId ?? null,
4014
4034
  organizationId: row.organizationId ?? null,
4015
4035
  projectId: row.projectId ?? null,
4016
4036
  validTo: row.validTo,
@@ -4037,10 +4057,11 @@ var DatasetsLibSQL = class extends DatasetsStorage {
4037
4057
  // --- Dataset CRUD ---
4038
4058
  async createDataset(input) {
4039
4059
  try {
4040
- const id = crypto.randomUUID();
4060
+ const id = input.id ?? crypto.randomUUID();
4061
+ if (input.id !== void 0) this.validateCallerDefinedDatasetId(input.id);
4041
4062
  const now = /* @__PURE__ */ new Date();
4042
4063
  const nowIso = now.toISOString();
4043
- await this.#db.insert({
4064
+ await this.#db.insertOnly({
4044
4065
  tableName: TABLE_DATASETS,
4045
4066
  record: {
4046
4067
  id,
@@ -4082,6 +4103,11 @@ var DatasetsLibSQL = class extends DatasetsStorage {
4082
4103
  updatedAt: now
4083
4104
  };
4084
4105
  } catch (error) {
4106
+ if (input.id !== void 0 && hasErrorCode(error, /* @__PURE__ */ new Set(["SQLITE_CONSTRAINT", "SQLITE_CONSTRAINT_PRIMARYKEY", "SQLITE_CONSTRAINT_UNIQUE"]))) {
4107
+ const existing = await this.getDatasetById({ id: input.id });
4108
+ if (existing) return this.resolveExistingDataset(existing, { ...input, id: input.id });
4109
+ }
4110
+ if (error instanceof MastraError) throw error;
4085
4111
  throw new MastraError(
4086
4112
  {
4087
4113
  id: createStorageErrorId("LIBSQL", "CREATE_DATASET", "FAILED"),
@@ -4327,11 +4353,12 @@ var DatasetsLibSQL = class extends DatasetsStorage {
4327
4353
  args: [args.datasetId]
4328
4354
  },
4329
4355
  {
4330
- sql: `INSERT INTO ${TABLE_DATASET_ITEMS} (id, datasetId, datasetVersion, organizationId, projectId, validTo, isDeleted, input, groundTruth, expectedTrajectory, toolMocks, requestContext, metadata, source, createdAt, updatedAt) VALUES (?, ?, (SELECT version FROM ${TABLE_DATASETS} WHERE id = ?), (SELECT organizationId FROM ${TABLE_DATASETS} WHERE id = ?), (SELECT projectId FROM ${TABLE_DATASETS} WHERE id = ?), NULL, 0, jsonb(?), jsonb(?), jsonb(?), jsonb(?), jsonb(?), jsonb(?), jsonb(?), ?, ?)`,
4356
+ sql: `INSERT INTO ${TABLE_DATASET_ITEMS} (id, datasetId, datasetVersion, externalId, organizationId, projectId, validTo, isDeleted, input, groundTruth, expectedTrajectory, toolMocks, requestContext, metadata, source, createdAt, updatedAt) VALUES (?, ?, (SELECT version FROM ${TABLE_DATASETS} WHERE id = ?), ?, (SELECT organizationId FROM ${TABLE_DATASETS} WHERE id = ?), (SELECT projectId FROM ${TABLE_DATASETS} WHERE id = ?), NULL, 0, jsonb(?), jsonb(?), jsonb(?), jsonb(?), jsonb(?), jsonb(?), jsonb(?), ?, ?)`,
4331
4357
  args: [
4332
4358
  id,
4333
4359
  args.datasetId,
4334
4360
  args.datasetId,
4361
+ args.externalId ?? null,
4335
4362
  args.datasetId,
4336
4363
  args.datasetId,
4337
4364
  jsonbArg(args.input),
@@ -4357,6 +4384,7 @@ var DatasetsLibSQL = class extends DatasetsStorage {
4357
4384
  id,
4358
4385
  datasetId: args.datasetId,
4359
4386
  datasetVersion: newVersion,
4387
+ externalId: args.externalId ?? null,
4360
4388
  organizationId: dataset?.organizationId ?? null,
4361
4389
  projectId: dataset?.projectId ?? null,
4362
4390
  input: args.input,
@@ -4422,11 +4450,12 @@ var DatasetsLibSQL = class extends DatasetsStorage {
4422
4450
  args: [args.datasetId, args.id]
4423
4451
  },
4424
4452
  {
4425
- sql: `INSERT INTO ${TABLE_DATASET_ITEMS} (id, datasetId, datasetVersion, organizationId, projectId, validTo, isDeleted, input, groundTruth, expectedTrajectory, toolMocks, requestContext, metadata, source, createdAt, updatedAt) VALUES (?, ?, (SELECT version FROM ${TABLE_DATASETS} WHERE id = ?), (SELECT organizationId FROM ${TABLE_DATASETS} WHERE id = ?), (SELECT projectId FROM ${TABLE_DATASETS} WHERE id = ?), NULL, 0, jsonb(?), jsonb(?), jsonb(?), jsonb(?), jsonb(?), jsonb(?), jsonb(?), ?, ?)`,
4453
+ sql: `INSERT INTO ${TABLE_DATASET_ITEMS} (id, datasetId, datasetVersion, externalId, organizationId, projectId, validTo, isDeleted, input, groundTruth, expectedTrajectory, toolMocks, requestContext, metadata, source, createdAt, updatedAt) VALUES (?, ?, (SELECT version FROM ${TABLE_DATASETS} WHERE id = ?), ?, (SELECT organizationId FROM ${TABLE_DATASETS} WHERE id = ?), (SELECT projectId FROM ${TABLE_DATASETS} WHERE id = ?), NULL, 0, jsonb(?), jsonb(?), jsonb(?), jsonb(?), jsonb(?), jsonb(?), jsonb(?), ?, ?)`,
4426
4454
  args: [
4427
4455
  args.id,
4428
4456
  args.datasetId,
4429
4457
  args.datasetId,
4458
+ existing.externalId ?? null,
4430
4459
  args.datasetId,
4431
4460
  args.datasetId,
4432
4461
  jsonbArg(mergedInput),
@@ -4499,11 +4528,12 @@ var DatasetsLibSQL = class extends DatasetsStorage {
4499
4528
  args: [datasetId, id]
4500
4529
  },
4501
4530
  {
4502
- sql: `INSERT INTO ${TABLE_DATASET_ITEMS} (id, datasetId, datasetVersion, organizationId, projectId, validTo, isDeleted, input, groundTruth, expectedTrajectory, toolMocks, requestContext, metadata, source, createdAt, updatedAt) VALUES (?, ?, (SELECT version FROM ${TABLE_DATASETS} WHERE id = ?), (SELECT organizationId FROM ${TABLE_DATASETS} WHERE id = ?), (SELECT projectId FROM ${TABLE_DATASETS} WHERE id = ?), NULL, 1, jsonb(?), jsonb(?), jsonb(?), jsonb(?), jsonb(?), jsonb(?), jsonb(?), ?, ?)`,
4531
+ sql: `INSERT INTO ${TABLE_DATASET_ITEMS} (id, datasetId, datasetVersion, externalId, organizationId, projectId, validTo, isDeleted, input, groundTruth, expectedTrajectory, toolMocks, requestContext, metadata, source, createdAt, updatedAt) VALUES (?, ?, (SELECT version FROM ${TABLE_DATASETS} WHERE id = ?), ?, (SELECT organizationId FROM ${TABLE_DATASETS} WHERE id = ?), (SELECT projectId FROM ${TABLE_DATASETS} WHERE id = ?), NULL, 1, jsonb(?), jsonb(?), jsonb(?), jsonb(?), jsonb(?), jsonb(?), jsonb(?), ?, ?)`,
4503
4532
  args: [
4504
4533
  id,
4505
4534
  datasetId,
4506
4535
  datasetId,
4536
+ existing.externalId ?? null,
4507
4537
  datasetId,
4508
4538
  datasetId,
4509
4539
  jsonbArg(existing.input),
@@ -4785,70 +4815,94 @@ var DatasetsLibSQL = class extends DatasetsStorage {
4785
4815
  // --- Bulk operations (SCD-2 internally) ---
4786
4816
  async _doBatchInsertItems(input) {
4787
4817
  try {
4788
- const dataset = await this.getDatasetById({ id: input.datasetId });
4789
- if (!dataset) {
4790
- throw new MastraError({
4791
- id: createStorageErrorId("LIBSQL", "BULK_ADD_ITEMS", "DATASET_NOT_FOUND"),
4792
- domain: ErrorDomain.STORAGE,
4793
- category: ErrorCategory.USER,
4794
- details: { datasetId: input.datasetId }
4795
- });
4796
- }
4797
- const now = /* @__PURE__ */ new Date();
4798
- const nowIso = now.toISOString();
4799
- const versionId = crypto.randomUUID();
4800
- const statements = [
4801
- {
4802
- sql: `UPDATE ${TABLE_DATASETS} SET version = version + 1 WHERE id = ? RETURNING version`,
4803
- args: [input.datasetId]
4818
+ if (input.items.length === 0) return [];
4819
+ return await withClientWriteLock(this.#client, async () => {
4820
+ const tx = await this.#client.transaction("write");
4821
+ try {
4822
+ const datasetResult = await tx.execute({
4823
+ sql: `SELECT version, organizationId, projectId FROM ${TABLE_DATASETS} WHERE id = ?`,
4824
+ args: [input.datasetId]
4825
+ });
4826
+ const dataset = datasetResult.rows[0];
4827
+ if (!dataset)
4828
+ throw new MastraError({
4829
+ id: createStorageErrorId("LIBSQL", "BULK_ADD_ITEMS", "DATASET_NOT_FOUND"),
4830
+ domain: ErrorDomain.STORAGE,
4831
+ category: ErrorCategory.USER,
4832
+ details: { datasetId: input.datasetId }
4833
+ });
4834
+ const externalIds = [...new Set(input.items.flatMap((item) => item.externalId ? [item.externalId] : []))];
4835
+ const historyResult = externalIds.length ? await tx.execute({
4836
+ sql: `SELECT id, datasetId, datasetVersion, externalId, organizationId, projectId, validTo, isDeleted, json(input) AS input, json(groundTruth) AS groundTruth, json(expectedTrajectory) AS expectedTrajectory, json(toolMocks) AS toolMocks, json(requestContext) AS requestContext, json(metadata) AS metadata, json(source) AS source, createdAt, updatedAt FROM ${TABLE_DATASET_ITEMS} WHERE datasetId = ? AND externalId IN (${externalIds.map(() => "?").join(",")}) ORDER BY datasetVersion`,
4837
+ args: [input.datasetId, ...externalIds]
4838
+ }) : { rows: [] };
4839
+ const plan = this.planDatasetItemBatch(
4840
+ input.items,
4841
+ historyResult.rows.map((row) => this.transformItemRowFull(row)),
4842
+ () => crypto.randomUUID()
4843
+ );
4844
+ const resolved = new Map(
4845
+ [...plan.existingCurrentItems].map(([id, row]) => [id, this.datasetItemFromRow(row)])
4846
+ );
4847
+ if (plan.inserts.length > 0) {
4848
+ const newVersion = Number(dataset.version) + 1;
4849
+ const now = /* @__PURE__ */ new Date();
4850
+ const nowIso = now.toISOString();
4851
+ await tx.execute({
4852
+ sql: `UPDATE ${TABLE_DATASETS} SET version = ? WHERE id = ?`,
4853
+ args: [newVersion, input.datasetId]
4854
+ });
4855
+ for (const { id, item } of plan.inserts) {
4856
+ await tx.execute({
4857
+ sql: `INSERT INTO ${TABLE_DATASET_ITEMS} (id, datasetId, datasetVersion, externalId, organizationId, projectId, validTo, isDeleted, input, groundTruth, expectedTrajectory, toolMocks, requestContext, metadata, source, createdAt, updatedAt) VALUES (?, ?, ?, ?, ?, ?, NULL, 0, jsonb(?), jsonb(?), jsonb(?), jsonb(?), jsonb(?), jsonb(?), jsonb(?), ?, ?)`,
4858
+ args: [
4859
+ id,
4860
+ input.datasetId,
4861
+ newVersion,
4862
+ item.externalId ?? null,
4863
+ dataset.organizationId ?? null,
4864
+ dataset.projectId ?? null,
4865
+ jsonbArg(item.input),
4866
+ jsonbArg(item.groundTruth),
4867
+ jsonbArg(item.expectedTrajectory),
4868
+ jsonbArg(item.toolMocks),
4869
+ jsonbArg(item.requestContext),
4870
+ jsonbArg(item.metadata),
4871
+ jsonbArg(item.source),
4872
+ nowIso,
4873
+ nowIso
4874
+ ]
4875
+ });
4876
+ resolved.set(id, {
4877
+ id,
4878
+ datasetId: input.datasetId,
4879
+ datasetVersion: newVersion,
4880
+ externalId: item.externalId ?? null,
4881
+ organizationId: dataset.organizationId,
4882
+ projectId: dataset.projectId,
4883
+ input: item.input,
4884
+ groundTruth: item.groundTruth,
4885
+ expectedTrajectory: item.expectedTrajectory,
4886
+ toolMocks: item.toolMocks,
4887
+ requestContext: item.requestContext,
4888
+ metadata: item.metadata,
4889
+ source: item.source,
4890
+ createdAt: now,
4891
+ updatedAt: now
4892
+ });
4893
+ }
4894
+ await tx.execute({
4895
+ sql: `INSERT INTO ${TABLE_DATASET_VERSIONS} (id, datasetId, version, createdAt) VALUES (?, ?, ?, ?)`,
4896
+ args: [crypto.randomUUID(), input.datasetId, newVersion, nowIso]
4897
+ });
4898
+ }
4899
+ await tx.commit();
4900
+ return plan.resolvedIds.map((id) => resolved.get(id));
4901
+ } catch (error) {
4902
+ if (!tx.closed) await tx.rollback();
4903
+ throw error;
4804
4904
  }
4805
- ];
4806
- const items = [];
4807
- for (const itemInput of input.items) {
4808
- const id = crypto.randomUUID();
4809
- items.push({ id, input: itemInput });
4810
- statements.push({
4811
- sql: `INSERT INTO ${TABLE_DATASET_ITEMS} (id, datasetId, datasetVersion, organizationId, projectId, validTo, isDeleted, input, groundTruth, expectedTrajectory, toolMocks, requestContext, metadata, source, createdAt, updatedAt) VALUES (?, ?, (SELECT version FROM ${TABLE_DATASETS} WHERE id = ?), ?, ?, NULL, 0, jsonb(?), jsonb(?), jsonb(?), jsonb(?), jsonb(?), jsonb(?), jsonb(?), ?, ?)`,
4812
- args: [
4813
- id,
4814
- input.datasetId,
4815
- input.datasetId,
4816
- dataset.organizationId ?? null,
4817
- dataset.projectId ?? null,
4818
- jsonbArg(itemInput.input),
4819
- jsonbArg(itemInput.groundTruth),
4820
- jsonbArg(itemInput.expectedTrajectory),
4821
- jsonbArg(itemInput.toolMocks),
4822
- jsonbArg(itemInput.requestContext),
4823
- jsonbArg(itemInput.metadata),
4824
- jsonbArg(itemInput.source),
4825
- nowIso,
4826
- nowIso
4827
- ]
4828
- });
4829
- }
4830
- statements.push({
4831
- sql: `INSERT INTO ${TABLE_DATASET_VERSIONS} (id, datasetId, version, createdAt) VALUES (?, ?, (SELECT version FROM ${TABLE_DATASETS} WHERE id = ?), ?)`,
4832
- args: [versionId, input.datasetId, input.datasetId, nowIso]
4833
4905
  });
4834
- const results = await this.#client.batch(statements, "write");
4835
- const newVersion = Number(results[0].rows[0].version);
4836
- return items.map(({ id, input: itemInput }) => ({
4837
- id,
4838
- datasetId: input.datasetId,
4839
- datasetVersion: newVersion,
4840
- organizationId: dataset.organizationId ?? null,
4841
- projectId: dataset.projectId ?? null,
4842
- input: itemInput.input,
4843
- groundTruth: itemInput.groundTruth,
4844
- expectedTrajectory: itemInput.expectedTrajectory,
4845
- toolMocks: itemInput.toolMocks,
4846
- requestContext: itemInput.requestContext,
4847
- metadata: itemInput.metadata,
4848
- source: itemInput.source,
4849
- createdAt: now,
4850
- updatedAt: now
4851
- }));
4852
4906
  } catch (error) {
4853
4907
  if (error instanceof MastraError) throw error;
4854
4908
  throw new MastraError(
@@ -4894,11 +4948,12 @@ var DatasetsLibSQL = class extends DatasetsStorage {
4894
4948
  args: [input.datasetId, item.id]
4895
4949
  });
4896
4950
  statements.push({
4897
- sql: `INSERT INTO ${TABLE_DATASET_ITEMS} (id, datasetId, datasetVersion, organizationId, projectId, validTo, isDeleted, input, groundTruth, expectedTrajectory, toolMocks, requestContext, metadata, source, createdAt, updatedAt) VALUES (?, ?, (SELECT version FROM ${TABLE_DATASETS} WHERE id = ?), ?, ?, NULL, 1, jsonb(?), jsonb(?), jsonb(?), jsonb(?), jsonb(?), jsonb(?), jsonb(?), ?, ?)`,
4951
+ sql: `INSERT INTO ${TABLE_DATASET_ITEMS} (id, datasetId, datasetVersion, externalId, organizationId, projectId, validTo, isDeleted, input, groundTruth, expectedTrajectory, toolMocks, requestContext, metadata, source, createdAt, updatedAt) VALUES (?, ?, (SELECT version FROM ${TABLE_DATASETS} WHERE id = ?), ?, ?, ?, NULL, 1, jsonb(?), jsonb(?), jsonb(?), jsonb(?), jsonb(?), jsonb(?), jsonb(?), ?, ?)`,
4898
4952
  args: [
4899
4953
  item.id,
4900
4954
  input.datasetId,
4901
4955
  input.datasetId,
4956
+ item.externalId ?? null,
4902
4957
  dataset.organizationId ?? null,
4903
4958
  dataset.projectId ?? null,
4904
4959
  jsonbArg(item.input),