UNPKG

@mastra/core

Version:

Mastra is a framework for building AI-powered applications and agents with a modern TypeScript stack.

369 lines (364 loc) • 13.1 kB
'use strict'; var chunk3VBF5IP7_cjs = require('./chunk-3VBF5IP7.cjs'); var chunk7JE7FOGJ_cjs = require('./chunk-7JE7FOGJ.cjs'); // src/storage/domains/scorer-definitions/base.ts var ScorerDefinitionsStorage = class extends chunk3VBF5IP7_cjs.VersionedStorageDomain { listKey = "scorerDefinitions"; versionMetadataFields = [ "id", "scorerDefinitionId", "versionNumber", "changedFields", "changeMessage", "createdAt" ]; constructor() { super({ component: "STORAGE", name: "SCORER_DEFINITIONS" }); } }; // src/storage/domains/scorer-definitions/inmemory.ts var InMemoryScorerDefinitionsStorage = class extends ScorerDefinitionsStorage { db; constructor({ db }) { super(); this.db = db; } async dangerouslyClearAll() { this.db.scorerDefinitions.clear(); this.db.scorerDefinitionVersions.clear(); } // ========================================================================== // Scorer Definition CRUD Methods // ========================================================================== async getById(id) { const scorer = this.db.scorerDefinitions.get(id); return scorer ? this.deepCopyScorer(scorer) : null; } async create(input) { const { scorerDefinition } = input; if (this.db.scorerDefinitions.has(scorerDefinition.id)) { throw new Error(`Scorer definition with id ${scorerDefinition.id} already exists`); } const now = /* @__PURE__ */ new Date(); const newScorer = { id: scorerDefinition.id, status: "draft", activeVersionId: void 0, authorId: scorerDefinition.authorId, metadata: scorerDefinition.metadata, createdAt: now, updatedAt: now }; this.db.scorerDefinitions.set(scorerDefinition.id, newScorer); const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshotConfig } = scorerDefinition; const versionId = crypto.randomUUID(); await this.createVersion({ id: versionId, scorerDefinitionId: scorerDefinition.id, versionNumber: 1, ...snapshotConfig, changedFields: Object.keys(snapshotConfig), changeMessage: "Initial version" }); return this.deepCopyScorer(newScorer); } async update(input) { const { id, ...updates } = input; const existingScorer = this.db.scorerDefinitions.get(id); if (!existingScorer) { throw new Error(`Scorer definition with id ${id} not found`); } const { authorId, activeVersionId, metadata, status } = updates; const updatedScorer = { ...existingScorer, ...authorId !== void 0 && { authorId }, ...activeVersionId !== void 0 && { activeVersionId }, ...status !== void 0 && { status }, ...metadata !== void 0 && { metadata: { ...existingScorer.metadata, ...metadata } }, updatedAt: /* @__PURE__ */ new Date() }; this.db.scorerDefinitions.set(id, updatedScorer); return this.deepCopyScorer(updatedScorer); } async delete(id) { this.db.scorerDefinitions.delete(id); await this.deleteVersionsByParentId(id); } async list(args) { const { page = 0, perPage: perPageInput, orderBy, authorId, metadata, status } = args || {}; const { field, direction } = this.parseOrderBy(orderBy); const perPage = chunk3VBF5IP7_cjs.normalizePerPage(perPageInput, 100); if (page < 0) { throw new Error("page must be >= 0"); } const maxOffset = Number.MAX_SAFE_INTEGER / 2; if (page * perPage > maxOffset) { throw new Error("page value too large"); } let scorers = Array.from(this.db.scorerDefinitions.values()); if (status) { scorers = scorers.filter((scorer) => scorer.status === status); } if (authorId !== void 0) { scorers = scorers.filter((scorer) => scorer.authorId === authorId); } if (metadata && Object.keys(metadata).length > 0) { scorers = scorers.filter((scorer) => { if (!scorer.metadata) return false; return Object.entries(metadata).every(([key, value]) => chunk7JE7FOGJ_cjs.deepEqual(scorer.metadata[key], value)); }); } const sortedScorers = this.sortScorers(scorers, field, direction); const clonedScorers = sortedScorers.map((scorer) => this.deepCopyScorer(scorer)); const { offset, perPage: perPageForResponse } = chunk3VBF5IP7_cjs.calculatePagination(page, perPageInput, perPage); return { scorerDefinitions: clonedScorers.slice(offset, offset + perPage), total: clonedScorers.length, page, perPage: perPageForResponse, hasMore: offset + perPage < clonedScorers.length }; } // ========================================================================== // Scorer Definition Version Methods // ========================================================================== async createVersion(input) { if (this.db.scorerDefinitionVersions.has(input.id)) { throw new Error(`Version with id ${input.id} already exists`); } for (const version2 of this.db.scorerDefinitionVersions.values()) { if (version2.scorerDefinitionId === input.scorerDefinitionId && version2.versionNumber === input.versionNumber) { throw new Error( `Version number ${input.versionNumber} already exists for scorer definition ${input.scorerDefinitionId}` ); } } const version = { ...input, createdAt: /* @__PURE__ */ new Date() }; this.db.scorerDefinitionVersions.set(input.id, this.deepCopyVersion(version)); return this.deepCopyVersion(version); } async getVersion(id) { const version = this.db.scorerDefinitionVersions.get(id); return version ? this.deepCopyVersion(version) : null; } async getVersionByNumber(scorerDefinitionId, versionNumber) { for (const version of this.db.scorerDefinitionVersions.values()) { if (version.scorerDefinitionId === scorerDefinitionId && version.versionNumber === versionNumber) { return this.deepCopyVersion(version); } } return null; } async getLatestVersion(scorerDefinitionId) { let latest = null; for (const version of this.db.scorerDefinitionVersions.values()) { if (version.scorerDefinitionId === scorerDefinitionId) { if (!latest || version.versionNumber > latest.versionNumber) { latest = version; } } } return latest ? this.deepCopyVersion(latest) : null; } async listVersions(input) { const { scorerDefinitionId, page = 0, perPage: perPageInput, orderBy } = input; const { field, direction } = this.parseVersionOrderBy(orderBy); const perPage = chunk3VBF5IP7_cjs.normalizePerPage(perPageInput, 20); if (page < 0) { throw new Error("page must be >= 0"); } const maxOffset = Number.MAX_SAFE_INTEGER / 2; if (page * perPage > maxOffset) { throw new Error("page value too large"); } let versions = Array.from(this.db.scorerDefinitionVersions.values()).filter( (v) => v.scorerDefinitionId === scorerDefinitionId ); versions = this.sortVersions(versions, field, direction); const clonedVersions = versions.map((v) => this.deepCopyVersion(v)); const total = clonedVersions.length; const { offset, perPage: perPageForResponse } = chunk3VBF5IP7_cjs.calculatePagination(page, perPageInput, perPage); const paginatedVersions = clonedVersions.slice(offset, offset + perPage); return { versions: paginatedVersions, total, page, perPage: perPageForResponse, hasMore: offset + perPage < total }; } async deleteVersion(id) { this.db.scorerDefinitionVersions.delete(id); } async deleteVersionsByParentId(entityId) { const idsToDelete = []; for (const [id, version] of this.db.scorerDefinitionVersions.entries()) { if (version.scorerDefinitionId === entityId) { idsToDelete.push(id); } } for (const id of idsToDelete) { this.db.scorerDefinitionVersions.delete(id); } } async countVersions(scorerDefinitionId) { let count = 0; for (const version of this.db.scorerDefinitionVersions.values()) { if (version.scorerDefinitionId === scorerDefinitionId) { count++; } } return count; } // ========================================================================== // Private Helper Methods // ========================================================================== deepCopyScorer(scorer) { return { ...scorer, metadata: scorer.metadata ? { ...scorer.metadata } : scorer.metadata }; } deepCopyVersion(version) { return { ...version, model: version.model ? JSON.parse(JSON.stringify(version.model)) : version.model, scoreRange: version.scoreRange ? JSON.parse(JSON.stringify(version.scoreRange)) : version.scoreRange, presetConfig: version.presetConfig ? JSON.parse(JSON.stringify(version.presetConfig)) : version.presetConfig, defaultSampling: version.defaultSampling ? JSON.parse(JSON.stringify(version.defaultSampling)) : version.defaultSampling, changedFields: version.changedFields ? [...version.changedFields] : version.changedFields }; } sortScorers(scorers, field, direction) { return scorers.sort((a, b) => { const aValue = a[field].getTime(); const bValue = b[field].getTime(); return direction === "ASC" ? aValue - bValue : bValue - aValue; }); } sortVersions(versions, field, direction) { return versions.sort((a, b) => { let aVal; let bVal; if (field === "createdAt") { aVal = a.createdAt.getTime(); bVal = b.createdAt.getTime(); } else { aVal = a.versionNumber; bVal = b.versionNumber; } return direction === "ASC" ? aVal - bVal : bVal - aVal; }); } }; // src/storage/domains/scorer-definitions/filesystem.ts var FilesystemScorerDefinitionsStorage = class extends ScorerDefinitionsStorage { helpers; constructor({ db }) { super(); this.helpers = new chunk3VBF5IP7_cjs.FilesystemVersionedHelpers({ db, entitiesFile: "scorer-definitions.json", parentIdField: "scorerDefinitionId", name: "FilesystemScorerDefinitionsStorage", versionMetadataFields: [ "id", "scorerDefinitionId", "versionNumber", "changedFields", "changeMessage", "createdAt" ] }); } async init() { await this.helpers.db.init(); } async dangerouslyClearAll() { await this.helpers.dangerouslyClearAll(); } async getById(id) { return this.helpers.getById(id); } async create(input) { const { scorerDefinition } = input; const now = /* @__PURE__ */ new Date(); const entity = { id: scorerDefinition.id, status: "draft", activeVersionId: void 0, authorId: scorerDefinition.authorId, metadata: scorerDefinition.metadata, createdAt: now, updatedAt: now }; await this.helpers.createEntity(scorerDefinition.id, entity); const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshotConfig } = scorerDefinition; const versionId = crypto.randomUUID(); await this.createVersion({ id: versionId, scorerDefinitionId: scorerDefinition.id, versionNumber: 1, ...snapshotConfig, changedFields: Object.keys(snapshotConfig), changeMessage: "Initial version" }); return structuredClone(entity); } async update(input) { const { id, ...updates } = input; return this.helpers.updateEntity(id, updates); } async delete(id) { await this.helpers.deleteEntity(id); } async list(args) { const { page, perPage, orderBy, authorId, metadata, status } = args || {}; const result = await this.helpers.listEntities({ page, perPage, orderBy, listKey: "scorerDefinitions", filters: { authorId, metadata, status } }); return result; } async createVersion(input) { return this.helpers.createVersion(input); } async getVersion(id) { return this.helpers.getVersion(id); } async getVersionByNumber(scorerDefinitionId, versionNumber) { return this.helpers.getVersionByNumber(scorerDefinitionId, versionNumber); } async getLatestVersion(scorerDefinitionId) { return this.helpers.getLatestVersion(scorerDefinitionId); } async listVersions(input) { const result = await this.helpers.listVersions(input, "scorerDefinitionId"); return result; } async deleteVersion(id) { await this.helpers.deleteVersion(id); } async deleteVersionsByParentId(entityId) { await this.helpers.deleteVersionsByParentId(entityId); } async countVersions(scorerDefinitionId) { return this.helpers.countVersions(scorerDefinitionId); } }; exports.FilesystemScorerDefinitionsStorage = FilesystemScorerDefinitionsStorage; exports.InMemoryScorerDefinitionsStorage = InMemoryScorerDefinitionsStorage; exports.ScorerDefinitionsStorage = ScorerDefinitionsStorage; //# sourceMappingURL=chunk-YOXBFIMG.cjs.map //# sourceMappingURL=chunk-YOXBFIMG.cjs.map