mastra-ai/mastra · error · Error

Dataset not found: ${args.datasetId}

Error message

Dataset not found: ${args.datasetId}

What it means

InMemory storage's _doAddItem() fetches the dataset by args.datasetId and throws this plain Error if missing, before bumping the dataset version and inserting the SCD-2 row. Normally batchInsertItems() already verified existence, so this fires when the dataset vanishes between the base-class check and the subclass mutation, or when _doAddItem is reached with a stale/foreign datasetId.

Source

Thrown at packages/core/src/storage/domains/datasets/inmemory.ts:236

    const end = perPageInput === false ? datasets.length : start + perPage;

    return {
      datasets: datasets.slice(start, end).map(toDatasetRecord),
      pagination: {
        total: datasets.length,
        page,
        perPage: perPageForResponse,
        hasMore: perPageInput === false ? false : datasets.length > end,
      },
    };
  }

  // --- SCD-2 item mutations ---

  protected async _doAddItem(args: AddDatasetItemInput): Promise<DatasetItem> {
    const dataset = this.db.datasets.get(args.datasetId);
    if (!dataset) {
      throw new Error(`Dataset not found: ${args.datasetId}`);
    }

    // Bump version (T3.7, T3.26 — only bumps version, not updatedAt)
    const newVersion = dataset.version + 1;
    this.db.datasets.set(args.datasetId, { ...dataset, version: newVersion });

    const now = new Date();
    const id = crypto.randomUUID();
    const row: DatasetItemRow = {
      id,
      datasetId: args.datasetId,
      datasetVersion: newVersion,
      externalId: args.externalId ?? null,
      // Tenancy inherited from parent dataset (Option B — never settable per item)
      organizationId: dataset.organizationId ?? null,
      projectId: dataset.projectId ?? null,
      validTo: null,
      isDeleted: false,

View on GitHub (pinned to 75dd419e61)

Solutions

  1. Create the dataset first (createDataset) or confirm getDatasetById({id: datasetId}) returns a row.
  2. Check for concurrent deleteDataset calls racing with item inserts; serialize mutations per dataset.
  3. Use a persistent storage adapter if the process restarts between creating datasets and adding items.
  4. Fix tenancy filters so they match the dataset's stored organizationId/projectId.

Example fix

// before
await storage.datasets.addItems({ datasetId: 'ds', items: [item] });
// after
const ds = await storage.datasets.getDatasetById({ id: 'ds' });
if (!ds) throw new Error(`Create dataset 'ds' before adding items`);
await storage.datasets.addItems({ datasetId: 'ds', items: [item] });
Defensive patterns

Strategy: validation

Validate before calling

const ds = await storage.datasets.getDatasetById({ id: datasetId });
if (!ds) throw new Error(`Dataset '${datasetId}' must exist before adding items`);

Type guard

function datasetExists(ds: Awaited<ReturnType<typeof storage.datasets.getDatasetById>>): ds is NonNullable<typeof ds> {
  return ds !== null;
}

Try / catch

try {
  await storage.datasets.addItems({ datasetId, items });
} catch (e) {
  if (e instanceof Error && e.message.startsWith('Dataset not found:')) {
    await storage.datasets.createDataset({ id: datasetId, name: datasetId });
    await storage.datasets.addItems({ datasetId, items });
  } else throw e;
}

Prevention

When it happens

Trigger: addItems()/batchInsertItems() on an InMemory store where the datasetId does not exist, was deleted concurrently, or tenancy filters removed the row after the base check.

Common situations: Inserting items into a dataset after a concurrent deleteDataset, restart-erased InMemory state, or test scaffolding that never created the dataset.

Related errors


AI-assisted analysis of mastra-ai/mastra@75dd419e61 (2026-08-30). Data as JSON: /api/errors/b6d7f438504689c2. Report an issue: GitHub.