{"version":3,"sources":["../src/memory/adapters/typeorm/conversation-message.entity.ts","../src/memory/adapters/typeorm/typeorm-conversation.store.ts"],"names":["ConversationMessageEntity","id","conversationId","role","content","position","createdAt","type","default","TypeOrmConversationStore","repository","load","rows","find","where","order","map","row","append","messages","length","base","count","entities","message","index","create","save","clear","delete"],"mappings":";;;;;;;;;;;;;;;;;AAQaA,oCAAN,+BAAA,CAAMA;AAAAA,EAAAA;;;AAEXC,EAAAA,EAAAA;AAIAC,EAAAA,cAAAA;AAGAC,EAAAA,IAAAA;;AAIAC,EAAAA,OAAAA;AAGAC,EAAAA,QAAAA;AAGAC,EAAAA,SAAAA;AACF;;;;;;;;;;;;;;;;IARYC,IAAAA,EAAM;;;;;;IAGNA,IAAAA,EAAM;;;;;;IAGNA,IAAAA,EAAM,UAAA;AAAYC,IAAAA,OAAAA,+BAAe,mBAAA,EAAN,SAAA;;;;;;;;;ACLhC,IAAMC,2BAAN,MAAMA;EAhBb;;;;AAiBE,EAAA,WAAA,CACmBC,UAAAA,EACjB;SADiBA,UAAAA,GAAAA,UAAAA;AAChB,EAAA;AAEH,EAAA,MAAMC,KAAKT,cAAAA,EAA8C;AACvD,IAAA,MAAMU,IAAAA,GAAO,MAAM,IAAA,CAAKF,UAAAA,CAAWG,IAAAA,CAAK;MACtCC,KAAAA,EAAO;AAAEZ,QAAAA;AAAe,OAAA;MACxBa,KAAAA,EAAO;QAAEV,QAAAA,EAAU;AAAM;KAC3B,CAAA;AACA,IAAA,OAAOO,IAAAA,CAAKI,GAAAA,CAAI,CAACC,GAAAA,MAAS;AACxBd,MAAAA,IAAAA,EAAMc,GAAAA,CAAId,IAAAA;AACVC,MAAAA,OAAAA,EAASa,GAAAA,CAAIb;KACf,CAAA,CAAA;AACF,EAAA;EAEA,MAAMc,MAAAA,CACJhB,gBACAiB,QAAAA,EACe;AACf,IAAA,IAAIA,QAAAA,CAASC,WAAW,CAAA,EAAG;AACzB,MAAA;AACF,IAAA;AACA,IAAA,MAAMC,IAAAA,GAAO,MAAM,IAAA,CAAKX,UAAAA,CAAWY,KAAAA,CAAM;MAAER,KAAAA,EAAO;AAAEZ,QAAAA;AAAe;KAAE,CAAA;AACrE,IAAA,MAAMqB,QAAAA,GAAWJ,SAASH,GAAAA,CAAI,CAACQ,SAASC,KAAAA,KACtC,IAAA,CAAKf,WAAWgB,MAAAA,CAAO;AACrBxB,MAAAA,cAAAA;AACAC,MAAAA,IAAAA,EAAMqB,OAAAA,CAAQrB,IAAAA;AACdC,MAAAA,OAAAA,EAASoB,OAAAA,CAAQpB,OAAAA;AACjBC,MAAAA,QAAAA,EAAUgB,IAAAA,GAAOI;AACnB,KAAA,CAAA,CAAA;AAEF,IAAA,MAAM,IAAA,CAAKf,UAAAA,CAAWiB,IAAAA,CAAKJ,QAAAA,CAAAA;AAC7B,EAAA;AAEA,EAAA,MAAMK,MAAM1B,cAAAA,EAAuC;AACjD,IAAA,MAAM,IAAA,CAAKQ,WAAWmB,MAAAA,CAAO;AAAE3B,MAAAA;KAAe,CAAA;AAChD,EAAA;AACF","file":"typeorm.cjs","sourcesContent":["import { Column, Entity, Index, PrimaryGeneratedColumn } from 'typeorm';\n\n/**\n * Persisted conversation message. Register this entity in your TypeORM\n * `DataSource` (`entities: [ConversationMessageEntity]`) and wire\n * `TypeOrmConversationStore` as the module's `conversationStore`.\n */\n@Entity('ai_conversation_messages')\nexport class ConversationMessageEntity {\n  @PrimaryGeneratedColumn('uuid')\n  id!: string;\n\n  @Index()\n  @Column()\n  conversationId!: string;\n\n  @Column()\n  role!: string;\n\n  /** Message content stored as JSON to preserve structured parts. */\n  @Column({ type: 'simple-json' })\n  content!: unknown;\n\n  @Column({ type: 'bigint' })\n  position!: number;\n\n  @Column({ type: 'datetime', default: () => 'CURRENT_TIMESTAMP' })\n  createdAt!: Date;\n}\n","import type { Repository } from 'typeorm';\nimport type { AiMessage } from '../../../messages/message.types.js';\nimport type { ConversationStore } from '../../conversation-store.interface.js';\nimport { ConversationMessageEntity } from './conversation-message.entity.js';\n\n/**\n * TypeORM-backed conversation store. Framework-agnostic: pass a\n * `Repository<ConversationMessageEntity>` (obtain it via `@nestjs/typeorm`'s\n * `getRepositoryToken` in a factory provider). Messages are ordered by an\n * append-only `position` column.\n *\n * @example\n * ```ts\n * AiModule.forRoot({\n *   conversationStore: {\n *     useFactory: (repo) => new TypeOrmConversationStore(repo),\n *     inject: [getRepositoryToken(ConversationMessageEntity)],\n *   },\n * })\n * ```\n */\nexport class TypeOrmConversationStore implements ConversationStore {\n  constructor(\n    private readonly repository: Repository<ConversationMessageEntity>,\n  ) {}\n\n  async load(conversationId: string): Promise<AiMessage[]> {\n    const rows = await this.repository.find({\n      where: { conversationId },\n      order: { position: 'ASC' },\n    });\n    return rows.map((row) => ({\n      role: row.role,\n      content: row.content,\n    })) as AiMessage[];\n  }\n\n  async append(\n    conversationId: string,\n    messages: AiMessage[],\n  ): Promise<void> {\n    if (messages.length === 0) {\n      return;\n    }\n    const base = await this.repository.count({ where: { conversationId } });\n    const entities = messages.map((message, index) =>\n      this.repository.create({\n        conversationId,\n        role: message.role,\n        content: message.content,\n        position: base + index,\n      }),\n    );\n    await this.repository.save(entities);\n  }\n\n  async clear(conversationId: string): Promise<void> {\n    await this.repository.delete({ conversationId });\n  }\n}\n"]}