{"version":3,"sources":["../../src/memory/slidingMemory.ts"],"names":["SlidingMemory","BaseMemory","messages","config","handlers","removalSelector","aliases","register","add","message","index","size","isOverflow","length","pipe","castArray","filter","isTruthy","forEach","indexOf","MemoryFatalError","context","splice","ensureRange","min","max","delete","removeFromArray","reset","createSnapshot","shallowCopy","loadSnapshot","state","Object","assign"],"mappings":";;;;;;;;;;AAsBO,MAAMA,sBAAsBC,mBAAAA,CAAAA;EAtBnC;;;AAuBkBC,EAAAA,QAAAA,GAAsB,EAAA;AACtBC,EAAAA,MAAAA;AAEhB,EAAA,WAAA,CAAYA,MAAAA,EAAkC;AAC5C,IAAA,KAAA,EAAK;AACL,IAAA,IAAA,CAAKA,MAAAA,GAAS;MACZ,GAAGA,MAAAA;MACHC,QAAAA,EAAU;AACRC,QAAAA,eAAAA,EACEF,MAAAA,CAAOC,QAAAA,EAAUC,eAAAA,KAAoB,CAACH,QAAAA,KAAwB;AAACA,UAAAA,QAAAA,CAAS,CAAA;;AAC5E;AACF,KAAA;AACF,EAAA;EAEA;AACE,IAAA,MAAMI,OAAAA,GAAU;AAAC,MAAA;;AACjB,IAAA,IAAA,CAAKC,SAASD,OAAAA,CAAAA;AAChB;EAEA,MAAME,GAAAA,CAAIC,SAAkBC,KAAAA,EAAgB;AAC1C,IAAA,MAAM,EAAEC,IAAAA,EAAMP,QAAAA,EAAQ,GAAK,IAAA,CAAKD,MAAAA;AAChC,IAAA,MAAMS,6BAAa,MAAA,CAAA,MAAM,IAAA,CAAKV,QAAAA,CAASW,MAAAA,GAAS,IAAIF,IAAAA,EAAjC,YAAA,CAAA;AAEnB,IAAA,IAAIC,YAAAA,EAAc;AAChBE,MAAAA,WAAAA,CACE,IAAA,CAAKZ,QAAAA,EACLE,QAAAA,CAASC,eAAAA,EACTU,mBAAAA,EACAC,cAAOC,eAAAA,CAAAA,EACPC,cAAAA,CAAQ,CAACT,QAAAA,KAAAA;AACP,QAAA,MAAMC,MAAAA,GAAQ,IAAA,CAAKR,QAAAA,CAASiB,OAAAA,CAAQV,QAAAA,CAAAA;AACpC,QAAA,IAAIC,WAAU,EAAA,EAAI;AAChB,UAAA,MAAM,IAAIU,yBAAAA,CAAiB,CAAA,mCAAA,CAAA,EAAuC,EAAA,EAAI;YACpEC,OAAAA,EAAS;cAAEZ,OAAAA,EAAAA,QAAAA;AAASP,cAAAA,QAAAA,EAAU,IAAA,CAAKA;AAAS;WAC9C,CAAA;AACF,QAAA;AACA,QAAA,IAAA,CAAKA,QAAAA,CAASoB,MAAAA,CAAOZ,MAAAA,EAAO,CAAA,CAAA;AAC9B,MAAA,CAAA,CAAA,CAAA;AAGF,MAAA,IAAIE,YAAAA,EAAc;AAChB,QAAA,MAAM,IAAIQ,0BACR,CAAA,uFAAA,CAAyF,CAAA;AAE7F,MAAA;AACF,IAAA;AAEAV,IAAAA,KAAAA,GAAQa,sBAAAA,CAAYb,KAAAA,IAAS,IAAA,CAAKR,QAAAA,CAASW,MAAAA,EAAQ;MAAEW,GAAAA,EAAK,CAAA;AAAGC,MAAAA,GAAAA,EAAK,KAAKvB,QAAAA,CAASW;KAAO,CAAA;AACvF,IAAA,IAAA,CAAKX,QAAAA,CAASoB,MAAAA,CAAOZ,KAAAA,EAAO,CAAA,EAAGD,OAAAA,CAAAA;AACjC,EAAA;AAEA,EAAA,MAAMiB,OAAOjB,OAAAA,EAAkB;AAC7B,IAAA,OAAOkB,yBAAAA,CAAgB,IAAA,CAAKzB,QAAAA,EAAUO,OAAAA,CAAAA;AACxC,EAAA;EAEAmB,KAAAA,GAAQ;AACN,IAAA,IAAA,CAAK1B,SAASW,MAAAA,GAAS,CAAA;AACzB,EAAA;EAEAgB,cAAAA,GAAiB;AACf,IAAA,OAAO;MAAE1B,MAAAA,EAAQ2B,qBAAAA,CAAY,KAAK3B,MAAM,CAAA;MAAGD,QAAAA,EAAU4B,qBAAAA,CAAY,KAAK5B,QAAQ;AAAE,KAAA;AAClF,EAAA;AAEA6B,EAAAA,YAAAA,CAAaC,KAAAA,EAA+C;AAC1DC,IAAAA,MAAAA,CAAOC,MAAAA,CAAO,MAAMF,KAAAA,CAAAA;AACtB,EAAA;AACF","file":"slidingMemory.cjs","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { Message } from \"@/backend/message.js\";\nimport { BaseMemory, MemoryFatalError } from \"@/memory/base.js\";\nimport { shallowCopy } from \"@/serializer/utils.js\";\nimport { filter, forEach, isTruthy, pipe } from \"remeda\";\nimport { castArray, removeFromArray } from \"@/internals/helpers/array.js\";\nimport { RequiredNested } from \"@/internals/types.js\";\nimport { ensureRange } from \"@/internals/helpers/number.js\";\n\nexport interface Handlers {\n  removalSelector: (messages: Message[]) => Message | Message[];\n}\n\nexport interface SlidingWindowMemoryInput {\n  size: number;\n  handlers?: Partial<Handlers>;\n}\n\nexport class SlidingMemory extends BaseMemory {\n  public readonly messages: Message[] = [];\n  public readonly config: RequiredNested<SlidingWindowMemoryInput>;\n\n  constructor(config: SlidingWindowMemoryInput) {\n    super();\n    this.config = {\n      ...config,\n      handlers: {\n        removalSelector:\n          config.handlers?.removalSelector ?? ((messages: Message[]) => [messages[0]]),\n      },\n    };\n  }\n\n  static {\n    const aliases = [\"SlidingWindowMemory\"];\n    this.register(aliases);\n  }\n\n  async add(message: Message, index?: number) {\n    const { size, handlers } = this.config;\n    const isOverflow = () => this.messages.length + 1 > size;\n\n    if (isOverflow()) {\n      pipe(\n        this.messages,\n        handlers.removalSelector,\n        castArray,\n        filter(isTruthy),\n        forEach((message) => {\n          const index = this.messages.indexOf(message);\n          if (index === -1) {\n            throw new MemoryFatalError(`Cannot delete non existing message.`, [], {\n              context: { message, messages: this.messages },\n            });\n          }\n          this.messages.splice(index, 1);\n        }),\n      );\n\n      if (isOverflow()) {\n        throw new MemoryFatalError(\n          `Custom memory removalSelector did not return any message. Memory overflow has occurred.`,\n        );\n      }\n    }\n\n    index = ensureRange(index ?? this.messages.length, { min: 0, max: this.messages.length });\n    this.messages.splice(index, 0, message);\n  }\n\n  async delete(message: Message) {\n    return removeFromArray(this.messages, message);\n  }\n\n  reset() {\n    this.messages.length = 0;\n  }\n\n  createSnapshot() {\n    return { config: shallowCopy(this.config), messages: shallowCopy(this.messages) };\n  }\n\n  loadSnapshot(state: ReturnType<typeof this.createSnapshot>) {\n    Object.assign(this, state);\n  }\n}\n"]}