@mastra/mysql 0.3.2 → 0.3.3-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.
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { MastraError, ErrorCategory, ErrorDomain } from '@mastra/core/error';
2
- import { StoreOperations, TABLE_CONFIGS, TABLE_WORKFLOW_SNAPSHOT, TABLE_SPANS, AgentsStorage, TABLE_AGENTS, TABLE_AGENT_VERSIONS, AGENTS_SCHEMA, AGENT_VERSIONS_SCHEMA, createStorageErrorId, normalizePerPage, calculatePagination, BlobStore, SKILL_BLOBS_SCHEMA, TABLE_SKILL_BLOBS, DatasetsStorage, TABLE_DATASETS, TABLE_DATASET_ITEMS, TABLE_DATASET_VERSIONS, DATASETS_SCHEMA, DATASET_ITEMS_SCHEMA, DATASET_VERSIONS_SCHEMA, ExperimentsStorage, TABLE_EXPERIMENTS, TABLE_EXPERIMENT_RESULTS, EXPERIMENTS_SCHEMA, EXPERIMENT_RESULTS_SCHEMA, MCPClientsStorage, TABLE_MCP_CLIENTS, TABLE_MCP_CLIENT_VERSIONS, MCP_CLIENTS_SCHEMA, MCP_CLIENT_VERSIONS_SCHEMA, MCPServersStorage, TABLE_MCP_SERVERS, TABLE_MCP_SERVER_VERSIONS, MCP_SERVERS_SCHEMA, MCP_SERVER_VERSIONS_SCHEMA, MemoryStorage, TABLE_THREADS, TABLE_MESSAGES, TABLE_RESOURCES, TABLE_SCHEMAS, OBSERVATIONAL_MEMORY_TABLE_SCHEMA, ObservabilityStorage, SPAN_SCHEMA, listTracesArgsSchema, TraceStatus, toTraceSpans, PromptBlocksStorage, TABLE_PROMPT_BLOCKS, TABLE_PROMPT_BLOCK_VERSIONS, PROMPT_BLOCKS_SCHEMA, PROMPT_BLOCK_VERSIONS_SCHEMA, ScorerDefinitionsStorage, TABLE_SCORER_DEFINITIONS, TABLE_SCORER_DEFINITION_VERSIONS, SCORER_DEFINITIONS_SCHEMA, SCORER_DEFINITION_VERSIONS_SCHEMA, ScoresStorage, TABLE_SCORERS, SCORERS_SCHEMA, SkillsStorage, TABLE_SKILLS, TABLE_SKILL_VERSIONS, SKILLS_SCHEMA, SKILL_VERSIONS_SCHEMA, WorkflowsStorage, WorkspacesStorage, TABLE_WORKSPACES, TABLE_WORKSPACE_VERSIONS, WORKSPACES_SCHEMA, WORKSPACE_VERSIONS_SCHEMA, MastraCompositeStore, TABLE_FAVORITES, BackgroundTasksStorage, TABLE_BACKGROUND_TASKS, ChannelsStorage, TABLE_CHANNEL_INSTALLATIONS, TABLE_CHANNEL_CONFIG, FavoritesStorage, FAVORITES_SCHEMA, SchedulesStorage, TABLE_SCHEDULES, TABLE_SCHEDULE_TRIGGERS, ToolProviderConnectionsStorage, TABLE_TOOL_PROVIDER_CONNECTIONS, TOOL_PROVIDER_CONNECTIONS_SCHEMA } from '@mastra/core/storage';
2
+ import { StoreOperations, TABLE_CONFIGS, TABLE_WORKFLOW_SNAPSHOT, TABLE_SPANS, AgentsStorage, TABLE_AGENTS, TABLE_AGENT_VERSIONS, AGENTS_SCHEMA, AGENT_VERSIONS_SCHEMA, createStorageErrorId, normalizePerPage, calculatePagination, BlobStore, SKILL_BLOBS_SCHEMA, TABLE_SKILL_BLOBS, DatasetsStorage, TABLE_DATASETS, TABLE_DATASET_ITEMS, TABLE_DATASET_VERSIONS, DATASETS_SCHEMA, DATASET_ITEMS_SCHEMA, DATASET_VERSIONS_SCHEMA, TABLE_EXPERIMENTS, TABLE_EXPERIMENT_RESULTS, ExperimentsStorage, EXPERIMENTS_SCHEMA, EXPERIMENT_RESULTS_SCHEMA, MCPClientsStorage, TABLE_MCP_CLIENTS, TABLE_MCP_CLIENT_VERSIONS, MCP_CLIENTS_SCHEMA, MCP_CLIENT_VERSIONS_SCHEMA, MCPServersStorage, TABLE_MCP_SERVERS, TABLE_MCP_SERVER_VERSIONS, MCP_SERVERS_SCHEMA, MCP_SERVER_VERSIONS_SCHEMA, MemoryStorage, TABLE_THREADS, TABLE_MESSAGES, TABLE_RESOURCES, TABLE_SCHEMAS, OBSERVATIONAL_MEMORY_TABLE_SCHEMA, ObservabilityStorage, SPAN_SCHEMA, listTracesArgsSchema, TraceStatus, toTraceSpans, PromptBlocksStorage, TABLE_PROMPT_BLOCKS, TABLE_PROMPT_BLOCK_VERSIONS, PROMPT_BLOCKS_SCHEMA, PROMPT_BLOCK_VERSIONS_SCHEMA, ScorerDefinitionsStorage, TABLE_SCORER_DEFINITIONS, TABLE_SCORER_DEFINITION_VERSIONS, SCORER_DEFINITIONS_SCHEMA, SCORER_DEFINITION_VERSIONS_SCHEMA, ScoresStorage, TABLE_SCORERS, SCORERS_SCHEMA, SkillsStorage, TABLE_SKILLS, TABLE_SKILL_VERSIONS, SKILLS_SCHEMA, SKILL_VERSIONS_SCHEMA, WorkflowsStorage, WorkspacesStorage, TABLE_WORKSPACES, TABLE_WORKSPACE_VERSIONS, WORKSPACES_SCHEMA, WORKSPACE_VERSIONS_SCHEMA, MastraCompositeStore, TABLE_FAVORITES, BackgroundTasksStorage, TABLE_BACKGROUND_TASKS, ChannelsStorage, TABLE_CHANNEL_INSTALLATIONS, TABLE_CHANNEL_CONFIG, FavoritesStorage, FAVORITES_SCHEMA, SchedulesStorage, TABLE_SCHEDULES, TABLE_SCHEDULE_TRIGGERS, ToolProviderConnectionsStorage, TABLE_TOOL_PROVIDER_CONNECTIONS, TOOL_PROVIDER_CONNECTIONS_SCHEMA } from '@mastra/core/storage';
3
3
  import { createPool } from 'mysql2/promise';
4
4
  import { parseSqlIdentifier } from '@mastra/core/utils';
5
5
  import { randomUUID } from 'crypto';
@@ -2050,11 +2050,11 @@ function parseJSON(value) {
2050
2050
  try {
2051
2051
  return JSON.parse(value);
2052
2052
  } catch {
2053
- return void 0;
2053
+ return value;
2054
2054
  }
2055
2055
  }
2056
2056
  if (typeof value === "object") return value;
2057
- return void 0;
2057
+ return value;
2058
2058
  }
2059
2059
  function jsonArg(value) {
2060
2060
  return value === void 0 || value === null ? null : JSON.stringify(value);
@@ -2143,7 +2143,17 @@ var DatasetsMySQL = class _DatasetsMySQL extends DatasetsStorage {
2143
2143
  await this.operations.alterTable({
2144
2144
  tableName: TABLE_DATASETS,
2145
2145
  schema: DATASETS_SCHEMA,
2146
- ifNotExists: ["organizationId", "projectId", "candidateKey", "candidateId"]
2146
+ ifNotExists: [
2147
+ "organizationId",
2148
+ "projectId",
2149
+ "candidateKey",
2150
+ "candidateId",
2151
+ "requestContextSchema",
2152
+ "tags",
2153
+ "targetType",
2154
+ "targetIds",
2155
+ "scorerIds"
2156
+ ]
2147
2157
  });
2148
2158
  await this.operations.alterTable({
2149
2159
  tableName: TABLE_DATASET_ITEMS,
@@ -2158,6 +2168,19 @@ var DatasetsMySQL = class _DatasetsMySQL extends DatasetsStorage {
2158
2168
  await this.pool.execute(`DELETE FROM ${formatTableName(TABLE_DATASET_ITEMS)}`);
2159
2169
  await this.pool.execute(`DELETE FROM ${formatTableName(TABLE_DATASETS)}`);
2160
2170
  }
2171
+ async experimentTablesExist() {
2172
+ try {
2173
+ const [rows] = await this.pool.execute(
2174
+ `SELECT COUNT(*) AS c FROM information_schema.tables
2175
+ WHERE table_schema = DATABASE() AND table_name IN (?, ?)`,
2176
+ [TABLE_EXPERIMENTS, TABLE_EXPERIMENT_RESULTS]
2177
+ );
2178
+ const row = Array.isArray(rows) ? rows[0] : void 0;
2179
+ return Number(row?.c ?? 0) === 2;
2180
+ } catch {
2181
+ return false;
2182
+ }
2183
+ }
2161
2184
  // --- Row transformers ---
2162
2185
  mapDataset(row) {
2163
2186
  return {
@@ -2167,6 +2190,11 @@ var DatasetsMySQL = class _DatasetsMySQL extends DatasetsStorage {
2167
2190
  metadata: parseJSON(row.metadata),
2168
2191
  inputSchema: parseJSON(row.inputSchema),
2169
2192
  groundTruthSchema: parseJSON(row.groundTruthSchema),
2193
+ requestContextSchema: parseJSON(row.requestContextSchema),
2194
+ tags: parseJSON(row.tags) ?? null,
2195
+ targetType: row.targetType ?? null,
2196
+ targetIds: parseJSON(row.targetIds) ?? null,
2197
+ scorerIds: parseJSON(row.scorerIds) ?? null,
2170
2198
  version: row.version,
2171
2199
  organizationId: row.organizationId ?? null,
2172
2200
  projectId: row.projectId ?? null,
@@ -2228,6 +2256,10 @@ var DatasetsMySQL = class _DatasetsMySQL extends DatasetsStorage {
2228
2256
  metadata: jsonArg(input.metadata),
2229
2257
  inputSchema: jsonArg(input.inputSchema),
2230
2258
  groundTruthSchema: jsonArg(input.groundTruthSchema),
2259
+ requestContextSchema: jsonArg(input.requestContextSchema),
2260
+ targetType: input.targetType ?? null,
2261
+ targetIds: jsonArg(input.targetIds),
2262
+ scorerIds: jsonArg(input.scorerIds),
2231
2263
  version: 0,
2232
2264
  organizationId: input.organizationId ?? null,
2233
2265
  projectId: input.projectId ?? null,
@@ -2244,6 +2276,10 @@ var DatasetsMySQL = class _DatasetsMySQL extends DatasetsStorage {
2244
2276
  metadata: input.metadata,
2245
2277
  inputSchema: input.inputSchema ?? void 0,
2246
2278
  groundTruthSchema: input.groundTruthSchema ?? void 0,
2279
+ requestContextSchema: input.requestContextSchema ?? void 0,
2280
+ targetType: input.targetType ?? null,
2281
+ targetIds: input.targetIds ?? null,
2282
+ scorerIds: input.scorerIds ?? null,
2247
2283
  version: 0,
2248
2284
  organizationId: input.organizationId ?? null,
2249
2285
  projectId: input.projectId ?? null,
@@ -2263,11 +2299,18 @@ var DatasetsMySQL = class _DatasetsMySQL extends DatasetsStorage {
2263
2299
  );
2264
2300
  }
2265
2301
  }
2266
- async getDatasetById({ id }) {
2302
+ async getDatasetById({
2303
+ id,
2304
+ filters
2305
+ }) {
2267
2306
  try {
2268
2307
  const row = await this.operations.load({
2269
2308
  tableName: TABLE_DATASETS,
2270
- keys: { id }
2309
+ keys: {
2310
+ id,
2311
+ organizationId: filters?.organizationId,
2312
+ projectId: filters?.projectId
2313
+ }
2271
2314
  });
2272
2315
  return row ? this.mapDataset(row) : null;
2273
2316
  } catch (error) {
@@ -2283,7 +2326,7 @@ var DatasetsMySQL = class _DatasetsMySQL extends DatasetsStorage {
2283
2326
  }
2284
2327
  async _doUpdateDataset(args) {
2285
2328
  try {
2286
- const existing = await this.getDatasetById({ id: args.id });
2329
+ const existing = await this.getDatasetById({ id: args.id, filters: args.filters });
2287
2330
  if (!existing) {
2288
2331
  throw new MastraError({
2289
2332
  id: "MYSQL_UPDATE_DATASET_NOT_FOUND",
@@ -2300,6 +2343,14 @@ var DatasetsMySQL = class _DatasetsMySQL extends DatasetsStorage {
2300
2343
  data.inputSchema = args.inputSchema === null ? null : JSON.stringify(args.inputSchema);
2301
2344
  if (args.groundTruthSchema !== void 0)
2302
2345
  data.groundTruthSchema = args.groundTruthSchema === null ? null : JSON.stringify(args.groundTruthSchema);
2346
+ if (args.requestContextSchema !== void 0)
2347
+ data.requestContextSchema = args.requestContextSchema === null ? null : JSON.stringify(args.requestContextSchema);
2348
+ if (args.tags !== void 0) data.tags = args.tags === null ? null : JSON.stringify(args.tags);
2349
+ if (args.targetType !== void 0) data.targetType = args.targetType;
2350
+ if (args.targetIds !== void 0)
2351
+ data.targetIds = args.targetIds === null ? null : JSON.stringify(args.targetIds);
2352
+ if (args.scorerIds !== void 0)
2353
+ data.scorerIds = args.scorerIds === null ? null : JSON.stringify(args.scorerIds);
2303
2354
  await this.operations.update({
2304
2355
  tableName: TABLE_DATASETS,
2305
2356
  keys: { id: args.id },
@@ -2312,6 +2363,11 @@ var DatasetsMySQL = class _DatasetsMySQL extends DatasetsStorage {
2312
2363
  metadata: args.metadata ?? existing.metadata,
2313
2364
  inputSchema: (args.inputSchema !== void 0 ? args.inputSchema : existing.inputSchema) ?? void 0,
2314
2365
  groundTruthSchema: (args.groundTruthSchema !== void 0 ? args.groundTruthSchema : existing.groundTruthSchema) ?? void 0,
2366
+ requestContextSchema: (args.requestContextSchema !== void 0 ? args.requestContextSchema : existing.requestContextSchema) ?? void 0,
2367
+ tags: (args.tags !== void 0 ? args.tags : existing.tags) ?? null,
2368
+ targetType: (args.targetType !== void 0 ? args.targetType : existing.targetType) ?? null,
2369
+ targetIds: (args.targetIds !== void 0 ? args.targetIds : existing.targetIds) ?? null,
2370
+ scorerIds: (args.scorerIds !== void 0 ? args.scorerIds : existing.scorerIds) ?? null,
2315
2371
  updatedAt: data.updatedAt
2316
2372
  };
2317
2373
  } catch (error) {
@@ -2326,23 +2382,39 @@ var DatasetsMySQL = class _DatasetsMySQL extends DatasetsStorage {
2326
2382
  );
2327
2383
  }
2328
2384
  }
2329
- async deleteDataset({ id }) {
2385
+ async deleteDataset({ id, filters }) {
2386
+ const filterCols = [];
2387
+ const filterVals = [];
2388
+ if (filters?.organizationId !== void 0) {
2389
+ filterCols.push(`${quoteIdentifier("organizationId", "column name")} = ?`);
2390
+ filterVals.push(filters.organizationId);
2391
+ }
2392
+ if (filters?.projectId !== void 0) {
2393
+ filterCols.push(`${quoteIdentifier("projectId", "column name")} = ?`);
2394
+ filterVals.push(filters.projectId);
2395
+ }
2396
+ const scopedWhere = ["id = ?", ...filterCols].join(" AND ");
2397
+ const experimentTablesExist = await this.experimentTablesExist();
2330
2398
  const connection = await this.pool.getConnection();
2331
2399
  try {
2332
2400
  await connection.beginTransaction();
2333
- try {
2401
+ const [rows] = await connection.execute(
2402
+ `SELECT id FROM ${formatTableName(TABLE_DATASETS)} WHERE ${scopedWhere} FOR UPDATE`,
2403
+ [id, ...filterVals]
2404
+ );
2405
+ if (!Array.isArray(rows) || rows.length === 0) {
2406
+ await connection.commit();
2407
+ return;
2408
+ }
2409
+ if (experimentTablesExist) {
2334
2410
  await connection.execute(
2335
2411
  `DELETE FROM ${formatTableName(TABLE_EXPERIMENT_RESULTS)} WHERE ${quoteIdentifier("experimentId", "column name")} IN (SELECT id FROM ${formatTableName(TABLE_EXPERIMENTS)} WHERE ${quoteIdentifier("datasetId", "column name")} = ?)`,
2336
2412
  [id]
2337
2413
  );
2338
- } catch {
2339
- }
2340
- try {
2341
2414
  await connection.execute(
2342
2415
  `UPDATE ${formatTableName(TABLE_EXPERIMENTS)} SET ${quoteIdentifier("datasetId", "column name")} = NULL, ${quoteIdentifier("datasetVersion", "column name")} = NULL WHERE ${quoteIdentifier("datasetId", "column name")} = ?`,
2343
2416
  [id]
2344
2417
  );
2345
- } catch {
2346
2418
  }
2347
2419
  await connection.execute(
2348
2420
  `DELETE FROM ${formatTableName(TABLE_DATASET_VERSIONS)} WHERE ${quoteIdentifier("datasetId", "column name")} = ?`,
@@ -2352,7 +2424,10 @@ var DatasetsMySQL = class _DatasetsMySQL extends DatasetsStorage {
2352
2424
  `DELETE FROM ${formatTableName(TABLE_DATASET_ITEMS)} WHERE ${quoteIdentifier("datasetId", "column name")} = ?`,
2353
2425
  [id]
2354
2426
  );
2355
- await connection.execute(`DELETE FROM ${formatTableName(TABLE_DATASETS)} WHERE id = ?`, [id]);
2427
+ await connection.execute(`DELETE FROM ${formatTableName(TABLE_DATASETS)} WHERE ${scopedWhere}`, [
2428
+ id,
2429
+ ...filterVals
2430
+ ]);
2356
2431
  await connection.commit();
2357
2432
  } catch (error) {
2358
2433
  await connection.rollback();
@@ -2389,6 +2464,19 @@ var DatasetsMySQL = class _DatasetsMySQL extends DatasetsStorage {
2389
2464
  filterParts.push(`${quoteIdentifier("candidateId", "column name")} = ?`);
2390
2465
  filterArgs.push(args.filters.candidateId);
2391
2466
  }
2467
+ if (args.filters?.targetType !== void 0) {
2468
+ filterParts.push(`${quoteIdentifier("targetType", "column name")} = ?`);
2469
+ filterArgs.push(args.filters.targetType);
2470
+ }
2471
+ if (args.filters?.targetIds !== void 0 && args.filters.targetIds.length > 0) {
2472
+ const placeholders = args.filters.targetIds.map(() => "?").join(",");
2473
+ filterParts.push(`JSON_OVERLAPS(${quoteIdentifier("targetIds", "column name")}, JSON_ARRAY(${placeholders}))`);
2474
+ filterArgs.push(...args.filters.targetIds);
2475
+ }
2476
+ if (args.filters?.name !== void 0 && args.filters.name.length > 0) {
2477
+ filterParts.push(`LOWER(${quoteIdentifier("name", "column name")}) LIKE LOWER(?)`);
2478
+ filterArgs.push(`%${args.filters.name}%`);
2479
+ }
2392
2480
  const whereClause = {
2393
2481
  sql: filterParts.length > 0 ? `WHERE ${filterParts.join(" AND ")}` : "",
2394
2482
  args: filterArgs
@@ -3114,7 +3202,7 @@ var ExperimentsMySQL = class _ExperimentsMySQL extends ExperimentsStorage {
3114
3202
  await this.operations.alterTable({
3115
3203
  tableName: TABLE_EXPERIMENTS,
3116
3204
  schema: EXPERIMENTS_SCHEMA,
3117
- ifNotExists: ["organizationId", "projectId"]
3205
+ ifNotExists: ["agentVersion", "organizationId", "projectId"]
3118
3206
  });
3119
3207
  await this.operations.alterTable({
3120
3208
  tableName: TABLE_EXPERIMENT_RESULTS,
@@ -3133,6 +3221,7 @@ var ExperimentsMySQL = class _ExperimentsMySQL extends ExperimentsStorage {
3133
3221
  id: row.id,
3134
3222
  datasetId: row.datasetId ?? null,
3135
3223
  datasetVersion: row.datasetVersion ?? null,
3224
+ agentVersion: row.agentVersion ?? null,
3136
3225
  organizationId: row.organizationId ?? null,
3137
3226
  projectId: row.projectId ?? null,
3138
3227
  targetType: row.targetType,
@@ -3182,6 +3271,7 @@ var ExperimentsMySQL = class _ExperimentsMySQL extends ExperimentsStorage {
3182
3271
  id,
3183
3272
  datasetId: input.datasetId ?? null,
3184
3273
  datasetVersion: input.datasetVersion ?? null,
3274
+ agentVersion: input.agentVersion ?? null,
3185
3275
  organizationId: input.organizationId ?? null,
3186
3276
  projectId: input.projectId ?? null,
3187
3277
  targetType: input.targetType,
@@ -3204,6 +3294,7 @@ var ExperimentsMySQL = class _ExperimentsMySQL extends ExperimentsStorage {
3204
3294
  id,
3205
3295
  datasetId: input.datasetId,
3206
3296
  datasetVersion: input.datasetVersion,
3297
+ agentVersion: input.agentVersion ?? null,
3207
3298
  organizationId: input.organizationId ?? null,
3208
3299
  projectId: input.projectId ?? null,
3209
3300
  targetType: input.targetType,
@@ -3277,7 +3368,11 @@ var ExperimentsMySQL = class _ExperimentsMySQL extends ExperimentsStorage {
3277
3368
  try {
3278
3369
  const row = await this.operations.load({
3279
3370
  tableName: TABLE_EXPERIMENTS,
3280
- keys: { id: args.id }
3371
+ keys: {
3372
+ id: args.id,
3373
+ organizationId: args.filters?.organizationId,
3374
+ projectId: args.filters?.projectId
3375
+ }
3281
3376
  });
3282
3377
  return row ? this.mapExperiment(row) : null;
3283
3378
  } catch (error) {
@@ -3300,6 +3395,22 @@ var ExperimentsMySQL = class _ExperimentsMySQL extends ExperimentsStorage {
3300
3395
  conditions.push(`${quoteIdentifier("datasetId", "column name")} = ?`);
3301
3396
  params.push(args.datasetId);
3302
3397
  }
3398
+ if (args.targetType) {
3399
+ conditions.push(`${quoteIdentifier("targetType", "column name")} = ?`);
3400
+ params.push(args.targetType);
3401
+ }
3402
+ if (args.targetId) {
3403
+ conditions.push(`${quoteIdentifier("targetId", "column name")} = ?`);
3404
+ params.push(args.targetId);
3405
+ }
3406
+ if (args.agentVersion) {
3407
+ conditions.push(`${quoteIdentifier("agentVersion", "column name")} = ?`);
3408
+ params.push(args.agentVersion);
3409
+ }
3410
+ if (args.status) {
3411
+ conditions.push(`${quoteIdentifier("status", "column name")} = ?`);
3412
+ params.push(args.status);
3413
+ }
3303
3414
  if (args.filters) {
3304
3415
  const { organizationId, projectId } = args.filters;
3305
3416
  if (organizationId !== void 0) {
@@ -3354,9 +3465,28 @@ var ExperimentsMySQL = class _ExperimentsMySQL extends ExperimentsStorage {
3354
3465
  }
3355
3466
  async deleteExperiment(args) {
3356
3467
  try {
3468
+ const tenancyConditions = [];
3469
+ const tenancyParams = [];
3470
+ if (args.filters?.organizationId !== void 0) {
3471
+ tenancyConditions.push(`${quoteIdentifier("organizationId", "column name")} = ?`);
3472
+ tenancyParams.push(args.filters.organizationId);
3473
+ }
3474
+ if (args.filters?.projectId !== void 0) {
3475
+ tenancyConditions.push(`${quoteIdentifier("projectId", "column name")} = ?`);
3476
+ tenancyParams.push(args.filters.projectId);
3477
+ }
3478
+ const gateWhere = ["id = ?", ...tenancyConditions].join(" AND ");
3357
3479
  const connection = await this.pool.getConnection();
3358
3480
  try {
3359
3481
  await connection.beginTransaction();
3482
+ const [gateRows] = await connection.execute(
3483
+ `SELECT id FROM ${formatTableName(TABLE_EXPERIMENTS)} WHERE ${gateWhere} FOR UPDATE`,
3484
+ [args.id, ...tenancyParams]
3485
+ );
3486
+ if (!Array.isArray(gateRows) || gateRows.length === 0) {
3487
+ await connection.commit();
3488
+ return;
3489
+ }
3360
3490
  await connection.execute(
3361
3491
  `DELETE FROM ${formatTableName(TABLE_EXPERIMENT_RESULTS)} WHERE ${quoteIdentifier("experimentId", "column name")} = ?`,
3362
3492
  [args.id]
@@ -3463,7 +3593,11 @@ var ExperimentsMySQL = class _ExperimentsMySQL extends ExperimentsStorage {
3463
3593
  try {
3464
3594
  const row = await this.operations.load({
3465
3595
  tableName: TABLE_EXPERIMENT_RESULTS,
3466
- keys: { id: args.id }
3596
+ keys: {
3597
+ id: args.id,
3598
+ organizationId: args.filters?.organizationId,
3599
+ projectId: args.filters?.projectId
3600
+ }
3467
3601
  });
3468
3602
  return row ? this.mapExperimentResult(row) : null;
3469
3603
  } catch (error) {
@@ -3617,6 +3751,24 @@ var ExperimentsMySQL = class _ExperimentsMySQL extends ExperimentsStorage {
3617
3751
  }
3618
3752
  async deleteExperimentResults(args) {
3619
3753
  try {
3754
+ if (args.filters?.organizationId !== void 0 || args.filters?.projectId !== void 0) {
3755
+ const tenancyConditions = [];
3756
+ const tenancyParams = [];
3757
+ if (args.filters?.organizationId !== void 0) {
3758
+ tenancyConditions.push(`${quoteIdentifier("organizationId", "column name")} = ?`);
3759
+ tenancyParams.push(args.filters.organizationId);
3760
+ }
3761
+ if (args.filters?.projectId !== void 0) {
3762
+ tenancyConditions.push(`${quoteIdentifier("projectId", "column name")} = ?`);
3763
+ tenancyParams.push(args.filters.projectId);
3764
+ }
3765
+ const parentWhere = ["id = ?", ...tenancyConditions].join(" AND ");
3766
+ await this.pool.execute(
3767
+ `DELETE FROM ${formatTableName(TABLE_EXPERIMENT_RESULTS)} WHERE ${quoteIdentifier("experimentId", "column name")} IN (SELECT id FROM ${formatTableName(TABLE_EXPERIMENTS)} WHERE ${parentWhere})`,
3768
+ [args.experimentId, ...tenancyParams]
3769
+ );
3770
+ return;
3771
+ }
3620
3772
  await this.pool.execute(
3621
3773
  `DELETE FROM ${formatTableName(TABLE_EXPERIMENT_RESULTS)} WHERE ${quoteIdentifier("experimentId", "column name")} = ?`,
3622
3774
  [args.experimentId]
@@ -8766,7 +8918,7 @@ var ScoresMySQL = class _ScoresMySQL extends ScoresStorage {
8766
8918
  await this.operations.alterTable({
8767
8919
  tableName: TABLE_SCORERS,
8768
8920
  schema: SCORERS_SCHEMA,
8769
- ifNotExists: ["spanId", "requestContext"]
8921
+ ifNotExists: ["spanId", "requestContext", "organizationId", "projectId", "batchId", "datasetId", "datasetItemId"]
8770
8922
  });
8771
8923
  await this.createDefaultIndexes();
8772
8924
  await this.createCustomIndexes();
@@ -8841,6 +8993,11 @@ var ScoresMySQL = class _ScoresMySQL extends ScoresStorage {
8841
8993
  entityId: row.entityId ?? void 0,
8842
8994
  source: row.source ?? void 0,
8843
8995
  resourceId: row.resourceId ?? void 0,
8996
+ organizationId: row.organizationId ?? void 0,
8997
+ projectId: row.projectId ?? void 0,
8998
+ batchId: row.batchId ?? void 0,
8999
+ datasetId: row.datasetId ?? void 0,
9000
+ datasetItemId: row.datasetItemId ?? void 0,
8844
9001
  threadId: row.threadId ?? void 0,
8845
9002
  createdAt: parseDateTime(row.createdAt) ?? /* @__PURE__ */ new Date(),
8846
9003
  updatedAt: parseDateTime(row.updatedAt) ?? /* @__PURE__ */ new Date()
@@ -8876,6 +9033,11 @@ var ScoresMySQL = class _ScoresMySQL extends ScoresStorage {
8876
9033
  entity: toJson(score.entity),
8877
9034
  entityId: score.entityId ?? null,
8878
9035
  resourceId: score.resourceId ?? null,
9036
+ organizationId: score.organizationId ?? null,
9037
+ projectId: score.projectId ?? null,
9038
+ batchId: score.batchId ?? null,
9039
+ datasetId: score.datasetId ?? null,
9040
+ datasetItemId: score.datasetItemId ?? null,
8879
9041
  threadId: score.threadId ?? null,
8880
9042
  source: score.source ?? null,
8881
9043
  createdAt,
@@ -8979,33 +9141,74 @@ var ScoresMySQL = class _ScoresMySQL extends ScoresStorage {
8979
9141
  pagination,
8980
9142
  entityId,
8981
9143
  entityType,
8982
- source
9144
+ source,
9145
+ filters
8983
9146
  }) {
8984
- return this.fetchScores(this.buildWhereClause({ scorerId, entityId, entityType, source }), pagination);
9147
+ return this.fetchScores(
9148
+ this.buildWhereClause({
9149
+ scorerId,
9150
+ entityId,
9151
+ entityType,
9152
+ source,
9153
+ organizationId: filters?.organizationId,
9154
+ projectId: filters?.projectId
9155
+ }),
9156
+ pagination
9157
+ );
8985
9158
  }
8986
9159
  async listScoresByRunId({
8987
9160
  runId,
8988
9161
  pagination,
8989
9162
  entityId,
8990
9163
  entityType,
8991
- source
9164
+ source,
9165
+ filters
8992
9166
  }) {
8993
- return this.fetchScores(this.buildWhereClause({ runId, entityId, entityType, source }), pagination);
9167
+ return this.fetchScores(
9168
+ this.buildWhereClause({
9169
+ runId,
9170
+ entityId,
9171
+ entityType,
9172
+ source,
9173
+ organizationId: filters?.organizationId,
9174
+ projectId: filters?.projectId
9175
+ }),
9176
+ pagination
9177
+ );
8994
9178
  }
8995
9179
  async listScoresBySpan({
8996
9180
  traceId,
8997
9181
  spanId,
8998
- pagination
9182
+ pagination,
9183
+ filters
8999
9184
  }) {
9000
- return this.fetchScores(this.buildWhereClause({ traceId, spanId }), pagination);
9185
+ return this.fetchScores(
9186
+ this.buildWhereClause({
9187
+ traceId,
9188
+ spanId,
9189
+ organizationId: filters?.organizationId,
9190
+ projectId: filters?.projectId
9191
+ }),
9192
+ pagination
9193
+ );
9001
9194
  }
9002
9195
  async listScoresByEntityId({
9003
9196
  entityId,
9004
9197
  pagination,
9005
9198
  entityType,
9006
- source
9199
+ source,
9200
+ filters
9007
9201
  }) {
9008
- return this.fetchScores(this.buildWhereClause({ entityId, entityType, source }), pagination);
9202
+ return this.fetchScores(
9203
+ this.buildWhereClause({
9204
+ entityId,
9205
+ entityType,
9206
+ source,
9207
+ organizationId: filters?.organizationId,
9208
+ projectId: filters?.projectId
9209
+ }),
9210
+ pagination
9211
+ );
9009
9212
  }
9010
9213
  };
9011
9214
  var SNAPSHOT_FIELDS = [