{"version":3,"file":"filesystem-DJpgi1r3.cjs","names":["VersionedStorageDomain","normalizePerPage","calculatePagination","FilesystemVersionedHelpers"],"sources":["../src/storage/domains/skills/base.ts","../src/storage/domains/skills/skill-snapshot-field-equal.ts","../src/storage/domains/skills/inmemory.ts","../src/storage/domains/skills/filesystem.ts"],"sourcesContent":["import type {\n  StorageSkillType,\n  StorageSkillSnapshotType,\n  StorageResolvedSkillType,\n  StorageCreateSkillInput,\n  StorageUpdateSkillInput,\n  StorageListSkillsInput,\n  StorageListSkillsOutput,\n  StorageListSkillsResolvedOutput,\n} from '../../types';\nimport { VersionedStorageDomain } from '../versioned';\nimport type { VersionBase, CreateVersionInputBase, ListVersionsInputBase, ListVersionsOutputBase } from '../versioned';\n\n// ============================================================================\n// Skill Version Types\n// ============================================================================\n\n/**\n * Represents a stored version of a skill's definition.\n * Definition fields are top-level on the version row (no nested snapshot object).\n */\nexport interface SkillVersion extends StorageSkillSnapshotType, VersionBase {\n  /** ID of the skill this version belongs to */\n  skillId: string;\n}\n\n/**\n * Input for creating a new skill version.\n * Definition fields are top-level (no nested snapshot object).\n */\nexport interface CreateSkillVersionInput extends StorageSkillSnapshotType, CreateVersionInputBase {\n  /** ID of the skill this version belongs to */\n  skillId: string;\n}\n\n/**\n * Sort direction for version listings.\n */\nexport type SkillVersionSortDirection = 'ASC' | 'DESC';\n\n/**\n * Fields that can be used for ordering version listings.\n */\nexport type SkillVersionOrderBy = 'versionNumber' | 'createdAt';\n\n/**\n * Input for listing skill versions with pagination and sorting.\n */\nexport interface ListSkillVersionsInput extends ListVersionsInputBase {\n  /** ID of the skill to list versions for */\n  skillId: string;\n}\n\n/**\n * Output for listing skill versions with pagination info.\n */\nexport interface ListSkillVersionsOutput extends ListVersionsOutputBase<SkillVersion> {}\n\n// ============================================================================\n// SkillsStorage Base Class\n// ============================================================================\n\nexport abstract class SkillsStorage extends VersionedStorageDomain<\n  StorageSkillType,\n  StorageSkillSnapshotType,\n  StorageResolvedSkillType,\n  SkillVersion,\n  CreateSkillVersionInput,\n  ListSkillVersionsInput,\n  ListSkillVersionsOutput,\n  { skill: StorageCreateSkillInput },\n  StorageUpdateSkillInput,\n  StorageListSkillsInput | undefined,\n  StorageListSkillsOutput,\n  StorageListSkillsResolvedOutput\n> {\n  protected readonly listKey = 'skills';\n  protected readonly versionMetadataFields = [\n    'id',\n    'skillId',\n    'versionNumber',\n    'changedFields',\n    'changeMessage',\n    'createdAt',\n  ] satisfies (keyof SkillVersion)[];\n\n  constructor() {\n    super({\n      component: 'STORAGE',\n      name: 'SKILLS',\n    });\n  }\n}\n","export function skillSnapshotFieldValuesEqual(a: unknown, b: unknown): boolean {\n  if (a === b) return true;\n  if (a == null && b == null) return true;\n\n  if (a instanceof Date || b instanceof Date) {\n    return a instanceof Date && b instanceof Date && a.getTime() === b.getTime();\n  }\n\n  if (Array.isArray(a) || Array.isArray(b)) {\n    if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) return false;\n    return a.every((value, index) => skillSnapshotFieldValuesEqual(value, b[index]));\n  }\n\n  if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) {\n    return false;\n  }\n\n  const objectA = a as Record<string, unknown>;\n  const objectB = b as Record<string, unknown>;\n  const keys = Array.from(new Set([...Object.keys(objectA), ...Object.keys(objectB)]))\n    .filter(key => !(objectA[key] == null && objectB[key] == null))\n    .sort();\n\n  return keys.every(key => skillSnapshotFieldValuesEqual(objectA[key], objectB[key]));\n}\n","import { randomUUID } from 'node:crypto';\n\nimport { normalizePerPage, calculatePagination } from '../../base';\nimport type {\n  StorageSkillType,\n  StorageCreateSkillInput,\n  StorageUpdateSkillInput,\n  StorageListSkillsInput,\n  StorageListSkillsOutput,\n  ThreadOrderBy,\n  ThreadSortDirection,\n} from '../../types';\nimport type { InMemoryDB } from '../inmemory-db';\nimport type {\n  SkillVersion,\n  CreateSkillVersionInput,\n  ListSkillVersionsInput,\n  ListSkillVersionsOutput,\n  SkillVersionOrderBy,\n  SkillVersionSortDirection,\n} from './base';\nimport { SkillsStorage } from './base';\nimport { skillSnapshotFieldValuesEqual } from './skill-snapshot-field-equal';\n\nexport class InMemorySkillsStorage extends SkillsStorage {\n  private db: InMemoryDB;\n\n  constructor({ db }: { db: InMemoryDB }) {\n    super();\n    this.db = db;\n  }\n\n  async dangerouslyClearAll(): Promise<void> {\n    this.db.skills.clear();\n    this.db.skillVersions.clear();\n  }\n\n  // ==========================================================================\n  // Skill CRUD Methods\n  // ==========================================================================\n\n  async getById(id: string): Promise<StorageSkillType | null> {\n    const config = this.db.skills.get(id);\n    return config ? this.deepCopyConfig(config) : null;\n  }\n\n  async create(input: { skill: StorageCreateSkillInput }): Promise<StorageSkillType> {\n    const { skill } = input;\n\n    if (this.db.skills.has(skill.id)) {\n      throw new Error(`Skill with id ${skill.id} already exists`);\n    }\n\n    const now = new Date();\n    const visibility = skill.visibility ?? (skill.authorId ? 'private' : undefined);\n    const newConfig: StorageSkillType = {\n      id: skill.id,\n      status: 'draft',\n      activeVersionId: undefined,\n      authorId: skill.authorId,\n      visibility,\n      favoriteCount: 0,\n      createdAt: now,\n      updatedAt: now,\n    };\n\n    this.db.skills.set(skill.id, newConfig);\n\n    // Extract config fields from the flat input (everything except record fields)\n    const { id: _id, authorId: _authorId, visibility: _visibility, ...snapshotConfig } = skill;\n\n    // Create version 1 from the config\n    const versionId = randomUUID();\n    try {\n      await this.createVersion({\n        id: versionId,\n        skillId: skill.id,\n        versionNumber: 1,\n        ...snapshotConfig,\n        changedFields: Object.keys(snapshotConfig),\n        changeMessage: 'Initial version',\n      });\n    } catch (error) {\n      // Roll back the orphaned skill record\n      this.db.skills.delete(skill.id);\n      throw error;\n    }\n\n    // Return the thin record\n    return this.deepCopyConfig(newConfig);\n  }\n\n  async update(input: StorageUpdateSkillInput): Promise<StorageSkillType> {\n    const { id, ...updates } = input;\n\n    const existingConfig = this.db.skills.get(id);\n    if (!existingConfig) {\n      throw new Error(`Skill with id ${id} not found`);\n    }\n\n    // Separate metadata fields from config fields\n    const { authorId, visibility, activeVersionId, status, ...rawConfigFields } = updates;\n\n    // Filter out undefined keys: callers may spread partial snapshots into\n    // update() and rely on \"omit = no change\" semantics. Without this, an\n    // undefined value would clobber the latest version's populated field\n    // when spread into newConfig below.\n    const configFields: Record<string, unknown> = {};\n    for (const [key, value] of Object.entries(rawConfigFields)) {\n      if (value !== undefined) configFields[key] = value;\n    }\n\n    // Config field names from StorageSkillSnapshotType\n    const configFieldNames = [\n      'name',\n      'description',\n      'instructions',\n      'license',\n      'compatibility',\n      'source',\n      'references',\n      'scripts',\n      'assets',\n      'files',\n      'metadata',\n      'tree',\n    ];\n\n    // Check if any config fields are present in the update\n    const hasConfigUpdate = configFieldNames.some(field => field in configFields);\n\n    // Update metadata fields on the record\n    const updatedConfig: StorageSkillType = {\n      ...existingConfig,\n      ...(authorId !== undefined && { authorId }),\n      ...(visibility !== undefined && { visibility }),\n      ...(activeVersionId !== undefined && { activeVersionId }),\n      ...(status !== undefined && { status: status as StorageSkillType['status'] }),\n      updatedAt: new Date(),\n    };\n\n    // Auto-set status to 'published' when activeVersionId is set, only if status is not explicitly provided\n    if (activeVersionId !== undefined && status === undefined) {\n      updatedConfig.status = 'published';\n    }\n\n    // If config fields are being updated, create a new version\n    if (hasConfigUpdate) {\n      // Get the latest version to use as base\n      const latestVersion = await this.getLatestVersion(id);\n      if (!latestVersion) {\n        throw new Error(`No versions found for skill ${id}`);\n      }\n\n      // Extract config from latest version\n      const {\n        id: _versionId,\n        skillId: _skillId,\n        versionNumber: _versionNumber,\n        changedFields: _changedFields,\n        changeMessage: _changeMessage,\n        createdAt: _createdAt,\n        ...latestConfig\n      } = latestVersion;\n\n      // Merge updates into latest config\n      const newConfig = {\n        ...latestConfig,\n        ...configFields,\n      };\n\n      // Identify which fields changed\n      const changedFields = configFieldNames.filter(\n        field =>\n          field in configFields &&\n          !skillSnapshotFieldValuesEqual(\n            configFields[field as keyof typeof configFields],\n            latestConfig[field as keyof typeof latestConfig],\n          ),\n      );\n\n      // Only create a new version if something actually changed\n      if (changedFields.length > 0) {\n        const newVersionId = randomUUID();\n        const newVersionNumber = latestVersion.versionNumber + 1;\n\n        await this.createVersion({\n          id: newVersionId,\n          skillId: id,\n          versionNumber: newVersionNumber,\n          ...newConfig,\n          changedFields,\n          changeMessage: `Updated ${changedFields.join(', ')}`,\n        });\n      }\n    }\n\n    // Save the updated record\n    this.db.skills.set(id, updatedConfig);\n    return this.deepCopyConfig(updatedConfig);\n  }\n\n  async delete(id: string): Promise<void> {\n    // Idempotent delete\n    this.db.skills.delete(id);\n    // Also delete all versions for this skill\n    await this.deleteVersionsByParentId(id);\n  }\n\n  async list(args?: StorageListSkillsInput): Promise<StorageListSkillsOutput> {\n    const {\n      page = 0,\n      perPage: perPageInput,\n      orderBy,\n      authorId,\n      status,\n      visibility,\n      metadata,\n      entityIds,\n      pinFavoritedFor,\n      favoritedOnly,\n    } = args || {};\n    const { field, direction } = this.parseOrderBy(orderBy);\n\n    // Normalize perPage for query (false → MAX_SAFE_INTEGER, 0 → 0, undefined → 100)\n    const perPage = normalizePerPage(perPageInput, 100);\n\n    if (page < 0) {\n      throw new Error('page must be >= 0');\n    }\n\n    // Prevent unreasonably large page values\n    const maxOffset = Number.MAX_SAFE_INTEGER / 2;\n    if (page * perPage > maxOffset) {\n      throw new Error('page value too large');\n    }\n\n    // Get all skills and apply filters\n    let configs = Array.from(this.db.skills.values());\n\n    // Restrict to a set of IDs (used by ?favoritedOnly=true).\n    // An empty array means \"no candidates\" -> empty result.\n    if (entityIds !== undefined) {\n      if (entityIds.length === 0) {\n        return {\n          skills: [],\n          total: 0,\n          page,\n          perPage: perPageInput === false ? false : perPage,\n          hasMore: false,\n        };\n      }\n      const idSet = new Set(entityIds);\n      configs = configs.filter(config => idSet.has(config.id));\n    }\n\n    // Filter by authorId if provided\n    if (authorId !== undefined) {\n      configs = configs.filter(config => config.authorId === authorId);\n    }\n\n    // Filter by status if provided\n    if (status !== undefined) {\n      configs = configs.filter(config => config.status === status);\n    }\n\n    // Filter by visibility if provided\n    if (visibility !== undefined) {\n      configs = configs.filter(config => config.visibility === visibility);\n    }\n\n    // Filter by metadata if provided (AND logic) — skills don't have metadata on the record,\n    // but we support the filter interface for consistency\n    if (metadata && Object.keys(metadata).length > 0) {\n      configs = configs.filter(_config => {\n        // StorageSkillType doesn't have metadata on the thin record\n        return false;\n      });\n    }\n\n    // Optional favorited-first ordering / favorites-only filter.\n    const favoritedIds = pinFavoritedFor ? this.collectFavoritedIdsFor(pinFavoritedFor) : undefined;\n    if (favoritedOnly) {\n      if (favoritedIds) {\n        configs = configs.filter(config => favoritedIds.has(config.id));\n      } else {\n        // Defensive: favoritedOnly with no userId can never match a real row.\n        configs = [];\n      }\n    }\n\n    const sortedConfigs = this.sortConfigs(configs, field, direction, favoritedIds);\n\n    // Deep clone to avoid mutation\n    const clonedConfigs = sortedConfigs.map(config => this.deepCopyConfig(config));\n\n    const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n    return {\n      skills: clonedConfigs.slice(offset, offset + perPage),\n      total: clonedConfigs.length,\n      page,\n      perPage: perPageForResponse,\n      hasMore: offset + perPage < clonedConfigs.length,\n    };\n  }\n\n  // ==========================================================================\n  // Skill Version Methods\n  // ==========================================================================\n\n  async createVersion(input: CreateSkillVersionInput): Promise<SkillVersion> {\n    // Check if version with this ID already exists\n    if (this.db.skillVersions.has(input.id)) {\n      throw new Error(`Version with id ${input.id} already exists`);\n    }\n\n    // Check for duplicate (skillId, versionNumber) pair\n    for (const version of this.db.skillVersions.values()) {\n      if (version.skillId === input.skillId && version.versionNumber === input.versionNumber) {\n        throw new Error(`Version number ${input.versionNumber} already exists for skill ${input.skillId}`);\n      }\n    }\n\n    const version: SkillVersion = {\n      ...input,\n      createdAt: new Date(),\n    };\n\n    // Deep clone before storing\n    this.db.skillVersions.set(input.id, this.deepCopyVersion(version));\n    return this.deepCopyVersion(version);\n  }\n\n  async getVersion(id: string): Promise<SkillVersion | null> {\n    const version = this.db.skillVersions.get(id);\n    return version ? this.deepCopyVersion(version) : null;\n  }\n\n  async getVersionByNumber(skillId: string, versionNumber: number): Promise<SkillVersion | null> {\n    for (const version of this.db.skillVersions.values()) {\n      if (version.skillId === skillId && version.versionNumber === versionNumber) {\n        return this.deepCopyVersion(version);\n      }\n    }\n    return null;\n  }\n\n  async getLatestVersion(skillId: string): Promise<SkillVersion | null> {\n    let latest: SkillVersion | null = null;\n    for (const version of this.db.skillVersions.values()) {\n      if (version.skillId === skillId) {\n        if (!latest || version.versionNumber > latest.versionNumber) {\n          latest = version;\n        }\n      }\n    }\n    return latest ? this.deepCopyVersion(latest) : null;\n  }\n\n  async listVersions(input: ListSkillVersionsInput): Promise<ListSkillVersionsOutput> {\n    const { skillId, page = 0, perPage: perPageInput, orderBy } = input;\n    const { field, direction } = this.parseVersionOrderBy(orderBy);\n\n    // Normalize perPage (false -> MAX_SAFE_INTEGER, 0 -> 0, undefined -> 20)\n    const perPage = normalizePerPage(perPageInput, 20);\n\n    if (page < 0) {\n      throw new Error('page must be >= 0');\n    }\n\n    const maxOffset = Number.MAX_SAFE_INTEGER / 2;\n    if (page * perPage > maxOffset) {\n      throw new Error('page value too large');\n    }\n\n    // Filter versions by skillId\n    let versions = Array.from(this.db.skillVersions.values()).filter(v => v.skillId === skillId);\n\n    // Sort versions\n    versions = this.sortVersions(versions, field, direction);\n\n    // Deep clone\n    const clonedVersions = versions.map(v => this.deepCopyVersion(v));\n\n    const total = clonedVersions.length;\n    const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n    const paginatedVersions = clonedVersions.slice(offset, offset + perPage);\n\n    return {\n      versions: paginatedVersions,\n      total,\n      page,\n      perPage: perPageForResponse,\n      hasMore: offset + perPage < total,\n    };\n  }\n\n  async deleteVersion(id: string): Promise<void> {\n    this.db.skillVersions.delete(id);\n  }\n\n  async deleteVersionsByParentId(entityId: string): Promise<void> {\n    const idsToDelete: string[] = [];\n    for (const [id, version] of this.db.skillVersions.entries()) {\n      if (version.skillId === entityId) {\n        idsToDelete.push(id);\n      }\n    }\n\n    for (const id of idsToDelete) {\n      this.db.skillVersions.delete(id);\n    }\n  }\n\n  async countVersions(skillId: string): Promise<number> {\n    let count = 0;\n    for (const version of this.db.skillVersions.values()) {\n      if (version.skillId === skillId) {\n        count++;\n      }\n    }\n    return count;\n  }\n\n  // ==========================================================================\n  // Private Helper Methods\n  // ==========================================================================\n\n  private deepCopyConfig(config: StorageSkillType): StorageSkillType {\n    return {\n      ...config,\n    };\n  }\n\n  private deepCopyVersion(version: SkillVersion): SkillVersion {\n    return structuredClone(version);\n  }\n\n  private sortConfigs(\n    configs: StorageSkillType[],\n    field: ThreadOrderBy,\n    direction: ThreadSortDirection,\n    favoritedIds?: Set<string>,\n  ): StorageSkillType[] {\n    return configs.sort((a, b) => {\n      // Compound sort: favorited first, then existing orderBy, then id ASC for stable pagination.\n      if (favoritedIds) {\n        const aFav = favoritedIds.has(a.id) ? 1 : 0;\n        const bFav = favoritedIds.has(b.id) ? 1 : 0;\n        if (aFav !== bFav) return bFav - aFav;\n      }\n\n      const aValue = a[field].getTime();\n      const bValue = b[field].getTime();\n      if (aValue !== bValue) {\n        return direction === 'ASC' ? aValue - bValue : bValue - aValue;\n      }\n\n      // Stable tie-break for same `createdAt`/`updatedAt`.\n      return a.id < b.id ? -1 : a.id > b.id ? 1 : 0;\n    });\n  }\n\n  /**\n   * Collect the set of skill IDs favorited by the given user. Returns an empty\n   * Set when the favorites domain is not wired or the user has no favorites.\n   */\n  private collectFavoritedIdsFor(userId: string): Set<string> {\n    const favorited = new Set<string>();\n    for (const row of this.db.favorites.values()) {\n      if (row.userId === userId && row.entityType === 'skill') {\n        favorited.add(row.entityId);\n      }\n    }\n    return favorited;\n  }\n\n  private sortVersions(\n    versions: SkillVersion[],\n    field: SkillVersionOrderBy,\n    direction: SkillVersionSortDirection,\n  ): SkillVersion[] {\n    return versions.sort((a, b) => {\n      let aVal: number;\n      let bVal: number;\n\n      if (field === 'createdAt') {\n        aVal = a.createdAt.getTime();\n        bVal = b.createdAt.getTime();\n      } else {\n        // versionNumber\n        aVal = a.versionNumber;\n        bVal = b.versionNumber;\n      }\n\n      return direction === 'ASC' ? aVal - bVal : bVal - aVal;\n    });\n  }\n}\n","import type { FilesystemDB } from '../../filesystem-db';\nimport { FilesystemVersionedHelpers } from '../../filesystem-versioned';\nimport type {\n  StorageSkillType,\n  StorageCreateSkillInput,\n  StorageUpdateSkillInput,\n  StorageListSkillsInput,\n  StorageListSkillsOutput,\n} from '../../types';\nimport type { SkillVersion, CreateSkillVersionInput, ListSkillVersionsInput, ListSkillVersionsOutput } from './base';\nimport { SkillsStorage } from './base';\nimport { skillSnapshotFieldValuesEqual } from './skill-snapshot-field-equal';\n\nexport class FilesystemSkillsStorage extends SkillsStorage {\n  private helpers: FilesystemVersionedHelpers<StorageSkillType, SkillVersion>;\n\n  constructor({ db }: { db: FilesystemDB }) {\n    super();\n    this.helpers = new FilesystemVersionedHelpers({\n      db,\n      entitiesFile: 'skills.json',\n      parentIdField: 'skillId',\n      name: 'FilesystemSkillsStorage',\n      versionMetadataFields: ['id', 'skillId', 'versionNumber', 'changedFields', 'changeMessage', 'createdAt'],\n    });\n  }\n\n  override async init(): Promise<void> {\n    await this.helpers.db.init();\n  }\n\n  async dangerouslyClearAll(): Promise<void> {\n    await this.helpers.dangerouslyClearAll();\n  }\n\n  async getById(id: string): Promise<StorageSkillType | null> {\n    return this.helpers.getById(id);\n  }\n\n  async create(input: { skill: StorageCreateSkillInput }): Promise<StorageSkillType> {\n    const { skill } = input;\n    const now = new Date();\n    const visibility = skill.visibility ?? (skill.authorId ? 'private' : undefined);\n    const entity: StorageSkillType = {\n      id: skill.id,\n      status: 'draft',\n      activeVersionId: undefined,\n      authorId: skill.authorId,\n      visibility,\n      createdAt: now,\n      updatedAt: now,\n    };\n\n    await this.helpers.createEntity(skill.id, entity);\n\n    // Skills don't have metadata on the thin record, so only exclude id, authorId, visibility\n    const { id: _id, authorId: _authorId, visibility: _visibility, ...snapshotConfig } = skill;\n    const versionId = crypto.randomUUID();\n    await this.createVersion({\n      id: versionId,\n      skillId: skill.id,\n      versionNumber: 1,\n      ...snapshotConfig,\n      changedFields: Object.keys(snapshotConfig),\n      changeMessage: 'Initial version',\n    });\n\n    return structuredClone(entity);\n  }\n\n  async update(input: StorageUpdateSkillInput): Promise<StorageSkillType> {\n    const { id, ...updates } = input;\n\n    const existing = await this.helpers.getById(id);\n    if (!existing) {\n      throw new Error(`FilesystemSkillsStorage: skill with id ${id} not found`);\n    }\n\n    const { authorId, visibility, activeVersionId, status, ...rawConfigFields } = updates;\n\n    // Filter out undefined keys: callers may spread partial snapshots into\n    // update() and rely on \"omit = no change\" semantics. Without this, an\n    // undefined value would clobber the latest version's populated field\n    // when spread into newConfig below.\n    const configFields: Record<string, unknown> = {};\n    for (const [key, value] of Object.entries(rawConfigFields)) {\n      if (value !== undefined) configFields[key] = value;\n    }\n\n    // Config field names from StorageSkillSnapshotType\n    const configFieldNames = [\n      'name',\n      'description',\n      'instructions',\n      'license',\n      'compatibility',\n      'source',\n      'references',\n      'scripts',\n      'assets',\n      'files',\n      'metadata',\n      'tree',\n    ];\n\n    const hasConfigUpdate = configFieldNames.some(field => field in configFields);\n\n    // Update metadata fields on the record\n    const updatedEntity: StorageSkillType = {\n      ...existing,\n      ...(authorId !== undefined && { authorId }),\n      ...(visibility !== undefined && { visibility }),\n      ...(activeVersionId !== undefined && { activeVersionId }),\n      ...(status !== undefined && { status: status as StorageSkillType['status'] }),\n      updatedAt: new Date(),\n    };\n\n    // Auto-set status to 'published' when activeVersionId is set without explicit status\n    if (activeVersionId !== undefined && status === undefined) {\n      updatedEntity.status = 'published';\n    }\n\n    // If config fields are being updated, create a new version\n    if (hasConfigUpdate) {\n      const latestVersion = await this.getLatestVersion(id);\n      if (!latestVersion) {\n        throw new Error(`No versions found for skill ${id}`);\n      }\n\n      const {\n        id: _versionId,\n        skillId: _skillId,\n        versionNumber: _versionNumber,\n        changedFields: _changedFields,\n        changeMessage: _changeMessage,\n        createdAt: _createdAt,\n        ...latestConfig\n      } = latestVersion;\n\n      const newConfig = {\n        ...latestConfig,\n        ...configFields,\n      };\n\n      const changedFields = configFieldNames.filter(\n        field =>\n          field in configFields &&\n          !skillSnapshotFieldValuesEqual(\n            configFields[field as keyof typeof configFields],\n            latestConfig[field as keyof typeof latestConfig],\n          ),\n      );\n\n      if (changedFields.length > 0) {\n        const newVersionId = crypto.randomUUID();\n        const newVersionNumber = latestVersion.versionNumber + 1;\n\n        await this.createVersion({\n          id: newVersionId,\n          skillId: id,\n          versionNumber: newVersionNumber,\n          ...newConfig,\n          changedFields,\n          changeMessage: `Updated ${changedFields.join(', ')}`,\n        });\n      }\n    }\n\n    // Build the entity-level updates for the helpers\n    const entityUpdates: Record<string, unknown> = {\n      ...(authorId !== undefined && { authorId }),\n      ...(visibility !== undefined && { visibility }),\n      ...(activeVersionId !== undefined && { activeVersionId }),\n      ...(status !== undefined && { status }),\n    };\n    if (activeVersionId !== undefined && status === undefined) {\n      entityUpdates.status = 'published';\n    }\n    return await this.helpers.updateEntity(id, entityUpdates);\n  }\n\n  async delete(id: string): Promise<void> {\n    await this.helpers.deleteEntity(id);\n  }\n\n  async list(args?: StorageListSkillsInput): Promise<StorageListSkillsOutput> {\n    const { page, perPage, orderBy, authorId, visibility, metadata } = args || {};\n    const result = await this.helpers.listEntities({\n      page,\n      perPage,\n      orderBy,\n      listKey: 'skills',\n      filters: { authorId, visibility, metadata },\n    });\n    return result as unknown as StorageListSkillsOutput;\n  }\n\n  async createVersion(input: CreateSkillVersionInput): Promise<SkillVersion> {\n    return this.helpers.createVersion(input as SkillVersion);\n  }\n\n  async getVersion(id: string): Promise<SkillVersion | null> {\n    return this.helpers.getVersion(id);\n  }\n\n  async getVersionByNumber(skillId: string, versionNumber: number): Promise<SkillVersion | null> {\n    return this.helpers.getVersionByNumber(skillId, versionNumber);\n  }\n\n  async getLatestVersion(skillId: string): Promise<SkillVersion | null> {\n    return this.helpers.getLatestVersion(skillId);\n  }\n\n  async listVersions(input: ListSkillVersionsInput): Promise<ListSkillVersionsOutput> {\n    const result = await this.helpers.listVersions(input, 'skillId');\n    return result as ListSkillVersionsOutput;\n  }\n\n  async deleteVersion(id: string): Promise<void> {\n    await this.helpers.deleteVersion(id);\n  }\n\n  async deleteVersionsByParentId(entityId: string): Promise<void> {\n    await this.helpers.deleteVersionsByParentId(entityId);\n  }\n\n  async countVersions(skillId: string): Promise<number> {\n    return this.helpers.countVersions(skillId);\n  }\n}\n"],"mappings":"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"}