@chat-adapter/state-memory 4.17.0 → 4.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -3,12 +3,14 @@
3
3
  [![npm version](https://img.shields.io/npm/v/@chat-adapter/state-memory)](https://www.npmjs.com/package/@chat-adapter/state-memory)
4
4
  [![npm downloads](https://img.shields.io/npm/dm/@chat-adapter/state-memory)](https://www.npmjs.com/package/@chat-adapter/state-memory)
5
5
 
6
- In-memory state adapter for [Chat SDK](https://chat-sdk.dev/docs). For development and testing only — state is lost on restart.
6
+ In-memory state adapter for [Chat SDK](https://chat-sdk.dev). For development and testing only — state is lost on restart.
7
+
8
+ > **Warning:** Only use the memory adapter for local development and testing. State is lost on restart and locks don't work across multiple instances. For production, use [@chat-adapter/state-redis](https://github.com/vercel/chat/tree/main/packages/state-redis), [@chat-adapter/state-ioredis](https://github.com/vercel/chat/tree/main/packages/state-ioredis), or [@chat-adapter/state-pg](https://github.com/vercel/chat/tree/main/packages/state-pg).
7
9
 
8
10
  ## Installation
9
11
 
10
12
  ```bash
11
- npm install chat @chat-adapter/state-memory
13
+ pnpm add @chat-adapter/state-memory
12
14
  ```
13
15
 
14
16
  ## Usage
@@ -24,11 +26,30 @@ const bot = new Chat({
24
26
  });
25
27
  ```
26
28
 
27
- ## Documentation
29
+ No configuration options are needed.
30
+
31
+ ## Features
32
+
33
+ | Feature | Supported |
34
+ |---------|-----------|
35
+ | Persistence | No |
36
+ | Multi-instance | No |
37
+ | Subscriptions | Yes (in-memory) |
38
+ | Locking | Yes (single-process only) |
39
+ | Key-value caching | Yes (in-memory) |
40
+ | Zero configuration | Yes |
41
+
42
+ ## Limitations
43
+
44
+ - **Not suitable for production** — state is lost on restart
45
+ - **Single process only** — locks don't work across multiple instances
46
+ - **No persistence** — subscriptions reset when the process restarts
28
47
 
29
- Full documentation at [chat-sdk.dev/docs/state/memory](https://chat-sdk.dev/docs/state/memory).
48
+ ## When to use
30
49
 
31
- For production, use [Redis](https://chat-sdk.dev/docs/state/redis) or [ioredis](https://chat-sdk.dev/docs/state/ioredis).
50
+ - Local development
51
+ - Unit testing
52
+ - Quick prototyping
32
53
 
33
54
  ## License
34
55
 
package/dist/index.d.ts CHANGED
@@ -18,6 +18,7 @@ declare class MemoryStateAdapter implements StateAdapter {
18
18
  unsubscribe(threadId: string): Promise<void>;
19
19
  isSubscribed(threadId: string): Promise<boolean>;
20
20
  acquireLock(threadId: string, ttlMs: number): Promise<Lock | null>;
21
+ forceReleaseLock(threadId: string): Promise<void>;
21
22
  releaseLock(lock: Lock): Promise<void>;
22
23
  extendLock(lock: Lock, ttlMs: number): Promise<boolean>;
23
24
  get<T = unknown>(key: string): Promise<T | null>;
package/dist/index.js CHANGED
@@ -54,6 +54,10 @@ var MemoryStateAdapter = class {
54
54
  this.locks.set(threadId, lock);
55
55
  return lock;
56
56
  }
57
+ async forceReleaseLock(threadId) {
58
+ this.ensureConnected();
59
+ this.locks.delete(threadId);
60
+ }
57
61
  async releaseLock(lock) {
58
62
  this.ensureConnected();
59
63
  const existingLock = this.locks.get(lock.threadId);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { Lock, StateAdapter } from \"chat\";\n\ninterface MemoryLock extends Lock {\n expiresAt: number;\n threadId: string;\n token: string;\n}\n\ninterface CachedValue<T = unknown> {\n expiresAt: number | null; // null = no expiry\n value: T;\n}\n\n/**\n * In-memory state adapter for development and testing.\n *\n * WARNING: State is not persisted across restarts.\n * Use RedisStateAdapter for production.\n */\nexport class MemoryStateAdapter implements StateAdapter {\n private readonly subscriptions = new Set<string>();\n private readonly locks = new Map<string, MemoryLock>();\n private readonly cache = new Map<string, CachedValue>();\n private connected = false;\n private connectPromise: Promise<void> | null = null;\n\n async connect(): Promise<void> {\n if (this.connected) {\n return;\n }\n\n // Reuse existing connection attempt to avoid race conditions\n if (!this.connectPromise) {\n this.connectPromise = Promise.resolve().then(() => {\n if (process.env.NODE_ENV === \"production\") {\n console.warn(\n \"[chat] MemoryStateAdapter is not recommended for production. \" +\n \"Consider using @chat-adapter/state-redis instead.\"\n );\n }\n this.connected = true;\n });\n }\n\n await this.connectPromise;\n }\n\n async disconnect(): Promise<void> {\n this.connected = false;\n this.connectPromise = null;\n this.subscriptions.clear();\n this.locks.clear();\n }\n\n async subscribe(threadId: string): Promise<void> {\n this.ensureConnected();\n this.subscriptions.add(threadId);\n }\n\n async unsubscribe(threadId: string): Promise<void> {\n this.ensureConnected();\n this.subscriptions.delete(threadId);\n }\n\n async isSubscribed(threadId: string): Promise<boolean> {\n this.ensureConnected();\n return this.subscriptions.has(threadId);\n }\n\n async acquireLock(threadId: string, ttlMs: number): Promise<Lock | null> {\n this.ensureConnected();\n this.cleanExpiredLocks();\n\n // Check if already locked\n const existingLock = this.locks.get(threadId);\n if (existingLock && existingLock.expiresAt > Date.now()) {\n return null;\n }\n\n // Create new lock\n const lock: MemoryLock = {\n threadId,\n token: generateToken(),\n expiresAt: Date.now() + ttlMs,\n };\n\n this.locks.set(threadId, lock);\n return lock;\n }\n\n async releaseLock(lock: Lock): Promise<void> {\n this.ensureConnected();\n\n const existingLock = this.locks.get(lock.threadId);\n if (existingLock && existingLock.token === lock.token) {\n this.locks.delete(lock.threadId);\n }\n }\n\n async extendLock(lock: Lock, ttlMs: number): Promise<boolean> {\n this.ensureConnected();\n\n const existingLock = this.locks.get(lock.threadId);\n if (!existingLock || existingLock.token !== lock.token) {\n return false;\n }\n\n if (existingLock.expiresAt < Date.now()) {\n // Lock has already expired\n this.locks.delete(lock.threadId);\n return false;\n }\n\n // Extend the lock\n existingLock.expiresAt = Date.now() + ttlMs;\n return true;\n }\n\n async get<T = unknown>(key: string): Promise<T | null> {\n this.ensureConnected();\n\n const cached = this.cache.get(key);\n if (!cached) {\n return null;\n }\n\n // Check if expired\n if (cached.expiresAt !== null && cached.expiresAt <= Date.now()) {\n this.cache.delete(key);\n return null;\n }\n\n return cached.value as T;\n }\n\n async set<T = unknown>(key: string, value: T, ttlMs?: number): Promise<void> {\n this.ensureConnected();\n\n this.cache.set(key, {\n value,\n expiresAt: ttlMs ? Date.now() + ttlMs : null,\n });\n }\n\n async setIfNotExists(\n key: string,\n value: unknown,\n ttlMs?: number\n ): Promise<boolean> {\n this.ensureConnected();\n\n const existing = this.cache.get(key);\n if (existing) {\n // Check if expired\n if (existing.expiresAt !== null && existing.expiresAt <= Date.now()) {\n this.cache.delete(key);\n } else {\n return false;\n }\n }\n\n this.cache.set(key, {\n value,\n expiresAt: ttlMs ? Date.now() + ttlMs : null,\n });\n return true;\n }\n\n async delete(key: string): Promise<void> {\n this.ensureConnected();\n this.cache.delete(key);\n }\n\n private ensureConnected(): void {\n if (!this.connected) {\n throw new Error(\n \"MemoryStateAdapter is not connected. Call connect() first.\"\n );\n }\n }\n\n private cleanExpiredLocks(): void {\n const now = Date.now();\n for (const [threadId, lock] of this.locks) {\n if (lock.expiresAt <= now) {\n this.locks.delete(threadId);\n }\n }\n }\n\n // For testing purposes\n _getSubscriptionCount(): number {\n return this.subscriptions.size;\n }\n\n _getLockCount(): number {\n this.cleanExpiredLocks();\n return this.locks.size;\n }\n}\n\nfunction generateToken(): string {\n return `mem_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;\n}\n\nexport function createMemoryState(): MemoryStateAdapter {\n return new MemoryStateAdapter();\n}\n"],"mappings":";AAmBO,IAAM,qBAAN,MAAiD;AAAA,EACrC,gBAAgB,oBAAI,IAAY;AAAA,EAChC,QAAQ,oBAAI,IAAwB;AAAA,EACpC,QAAQ,oBAAI,IAAyB;AAAA,EAC9C,YAAY;AAAA,EACZ,iBAAuC;AAAA,EAE/C,MAAM,UAAyB;AAC7B,QAAI,KAAK,WAAW;AAClB;AAAA,IACF;AAGA,QAAI,CAAC,KAAK,gBAAgB;AACxB,WAAK,iBAAiB,QAAQ,QAAQ,EAAE,KAAK,MAAM;AACjD,YAAI,QAAQ,IAAI,aAAa,cAAc;AACzC,kBAAQ;AAAA,YACN;AAAA,UAEF;AAAA,QACF;AACA,aAAK,YAAY;AAAA,MACnB,CAAC;AAAA,IACH;AAEA,UAAM,KAAK;AAAA,EACb;AAAA,EAEA,MAAM,aAA4B;AAChC,SAAK,YAAY;AACjB,SAAK,iBAAiB;AACtB,SAAK,cAAc,MAAM;AACzB,SAAK,MAAM,MAAM;AAAA,EACnB;AAAA,EAEA,MAAM,UAAU,UAAiC;AAC/C,SAAK,gBAAgB;AACrB,SAAK,cAAc,IAAI,QAAQ;AAAA,EACjC;AAAA,EAEA,MAAM,YAAY,UAAiC;AACjD,SAAK,gBAAgB;AACrB,SAAK,cAAc,OAAO,QAAQ;AAAA,EACpC;AAAA,EAEA,MAAM,aAAa,UAAoC;AACrD,SAAK,gBAAgB;AACrB,WAAO,KAAK,cAAc,IAAI,QAAQ;AAAA,EACxC;AAAA,EAEA,MAAM,YAAY,UAAkB,OAAqC;AACvE,SAAK,gBAAgB;AACrB,SAAK,kBAAkB;AAGvB,UAAM,eAAe,KAAK,MAAM,IAAI,QAAQ;AAC5C,QAAI,gBAAgB,aAAa,YAAY,KAAK,IAAI,GAAG;AACvD,aAAO;AAAA,IACT;AAGA,UAAM,OAAmB;AAAA,MACvB;AAAA,MACA,OAAO,cAAc;AAAA,MACrB,WAAW,KAAK,IAAI,IAAI;AAAA,IAC1B;AAEA,SAAK,MAAM,IAAI,UAAU,IAAI;AAC7B,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,YAAY,MAA2B;AAC3C,SAAK,gBAAgB;AAErB,UAAM,eAAe,KAAK,MAAM,IAAI,KAAK,QAAQ;AACjD,QAAI,gBAAgB,aAAa,UAAU,KAAK,OAAO;AACrD,WAAK,MAAM,OAAO,KAAK,QAAQ;AAAA,IACjC;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,MAAY,OAAiC;AAC5D,SAAK,gBAAgB;AAErB,UAAM,eAAe,KAAK,MAAM,IAAI,KAAK,QAAQ;AACjD,QAAI,CAAC,gBAAgB,aAAa,UAAU,KAAK,OAAO;AACtD,aAAO;AAAA,IACT;AAEA,QAAI,aAAa,YAAY,KAAK,IAAI,GAAG;AAEvC,WAAK,MAAM,OAAO,KAAK,QAAQ;AAC/B,aAAO;AAAA,IACT;AAGA,iBAAa,YAAY,KAAK,IAAI,IAAI;AACtC,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,IAAiB,KAAgC;AACrD,SAAK,gBAAgB;AAErB,UAAM,SAAS,KAAK,MAAM,IAAI,GAAG;AACjC,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,IACT;AAGA,QAAI,OAAO,cAAc,QAAQ,OAAO,aAAa,KAAK,IAAI,GAAG;AAC/D,WAAK,MAAM,OAAO,GAAG;AACrB,aAAO;AAAA,IACT;AAEA,WAAO,OAAO;AAAA,EAChB;AAAA,EAEA,MAAM,IAAiB,KAAa,OAAU,OAA+B;AAC3E,SAAK,gBAAgB;AAErB,SAAK,MAAM,IAAI,KAAK;AAAA,MAClB;AAAA,MACA,WAAW,QAAQ,KAAK,IAAI,IAAI,QAAQ;AAAA,IAC1C,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,eACJ,KACA,OACA,OACkB;AAClB,SAAK,gBAAgB;AAErB,UAAM,WAAW,KAAK,MAAM,IAAI,GAAG;AACnC,QAAI,UAAU;AAEZ,UAAI,SAAS,cAAc,QAAQ,SAAS,aAAa,KAAK,IAAI,GAAG;AACnE,aAAK,MAAM,OAAO,GAAG;AAAA,MACvB,OAAO;AACL,eAAO;AAAA,MACT;AAAA,IACF;AAEA,SAAK,MAAM,IAAI,KAAK;AAAA,MAClB;AAAA,MACA,WAAW,QAAQ,KAAK,IAAI,IAAI,QAAQ;AAAA,IAC1C,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,OAAO,KAA4B;AACvC,SAAK,gBAAgB;AACrB,SAAK,MAAM,OAAO,GAAG;AAAA,EACvB;AAAA,EAEQ,kBAAwB;AAC9B,QAAI,CAAC,KAAK,WAAW;AACnB,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,oBAA0B;AAChC,UAAM,MAAM,KAAK,IAAI;AACrB,eAAW,CAAC,UAAU,IAAI,KAAK,KAAK,OAAO;AACzC,UAAI,KAAK,aAAa,KAAK;AACzB,aAAK,MAAM,OAAO,QAAQ;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,wBAAgC;AAC9B,WAAO,KAAK,cAAc;AAAA,EAC5B;AAAA,EAEA,gBAAwB;AACtB,SAAK,kBAAkB;AACvB,WAAO,KAAK,MAAM;AAAA,EACpB;AACF;AAEA,SAAS,gBAAwB;AAC/B,SAAO,OAAO,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,EAAE,CAAC;AACzE;AAEO,SAAS,oBAAwC;AACtD,SAAO,IAAI,mBAAmB;AAChC;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { Lock, StateAdapter } from \"chat\";\n\ninterface MemoryLock extends Lock {\n expiresAt: number;\n threadId: string;\n token: string;\n}\n\ninterface CachedValue<T = unknown> {\n expiresAt: number | null; // null = no expiry\n value: T;\n}\n\n/**\n * In-memory state adapter for development and testing.\n *\n * WARNING: State is not persisted across restarts.\n * Use RedisStateAdapter for production.\n */\nexport class MemoryStateAdapter implements StateAdapter {\n private readonly subscriptions = new Set<string>();\n private readonly locks = new Map<string, MemoryLock>();\n private readonly cache = new Map<string, CachedValue>();\n private connected = false;\n private connectPromise: Promise<void> | null = null;\n\n async connect(): Promise<void> {\n if (this.connected) {\n return;\n }\n\n // Reuse existing connection attempt to avoid race conditions\n if (!this.connectPromise) {\n this.connectPromise = Promise.resolve().then(() => {\n if (process.env.NODE_ENV === \"production\") {\n console.warn(\n \"[chat] MemoryStateAdapter is not recommended for production. \" +\n \"Consider using @chat-adapter/state-redis instead.\"\n );\n }\n this.connected = true;\n });\n }\n\n await this.connectPromise;\n }\n\n async disconnect(): Promise<void> {\n this.connected = false;\n this.connectPromise = null;\n this.subscriptions.clear();\n this.locks.clear();\n }\n\n async subscribe(threadId: string): Promise<void> {\n this.ensureConnected();\n this.subscriptions.add(threadId);\n }\n\n async unsubscribe(threadId: string): Promise<void> {\n this.ensureConnected();\n this.subscriptions.delete(threadId);\n }\n\n async isSubscribed(threadId: string): Promise<boolean> {\n this.ensureConnected();\n return this.subscriptions.has(threadId);\n }\n\n async acquireLock(threadId: string, ttlMs: number): Promise<Lock | null> {\n this.ensureConnected();\n this.cleanExpiredLocks();\n\n // Check if already locked\n const existingLock = this.locks.get(threadId);\n if (existingLock && existingLock.expiresAt > Date.now()) {\n return null;\n }\n\n // Create new lock\n const lock: MemoryLock = {\n threadId,\n token: generateToken(),\n expiresAt: Date.now() + ttlMs,\n };\n\n this.locks.set(threadId, lock);\n return lock;\n }\n\n async forceReleaseLock(threadId: string): Promise<void> {\n this.ensureConnected();\n this.locks.delete(threadId);\n }\n\n async releaseLock(lock: Lock): Promise<void> {\n this.ensureConnected();\n\n const existingLock = this.locks.get(lock.threadId);\n if (existingLock && existingLock.token === lock.token) {\n this.locks.delete(lock.threadId);\n }\n }\n\n async extendLock(lock: Lock, ttlMs: number): Promise<boolean> {\n this.ensureConnected();\n\n const existingLock = this.locks.get(lock.threadId);\n if (!existingLock || existingLock.token !== lock.token) {\n return false;\n }\n\n if (existingLock.expiresAt < Date.now()) {\n // Lock has already expired\n this.locks.delete(lock.threadId);\n return false;\n }\n\n // Extend the lock\n existingLock.expiresAt = Date.now() + ttlMs;\n return true;\n }\n\n async get<T = unknown>(key: string): Promise<T | null> {\n this.ensureConnected();\n\n const cached = this.cache.get(key);\n if (!cached) {\n return null;\n }\n\n // Check if expired\n if (cached.expiresAt !== null && cached.expiresAt <= Date.now()) {\n this.cache.delete(key);\n return null;\n }\n\n return cached.value as T;\n }\n\n async set<T = unknown>(key: string, value: T, ttlMs?: number): Promise<void> {\n this.ensureConnected();\n\n this.cache.set(key, {\n value,\n expiresAt: ttlMs ? Date.now() + ttlMs : null,\n });\n }\n\n async setIfNotExists(\n key: string,\n value: unknown,\n ttlMs?: number\n ): Promise<boolean> {\n this.ensureConnected();\n\n const existing = this.cache.get(key);\n if (existing) {\n // Check if expired\n if (existing.expiresAt !== null && existing.expiresAt <= Date.now()) {\n this.cache.delete(key);\n } else {\n return false;\n }\n }\n\n this.cache.set(key, {\n value,\n expiresAt: ttlMs ? Date.now() + ttlMs : null,\n });\n return true;\n }\n\n async delete(key: string): Promise<void> {\n this.ensureConnected();\n this.cache.delete(key);\n }\n\n private ensureConnected(): void {\n if (!this.connected) {\n throw new Error(\n \"MemoryStateAdapter is not connected. Call connect() first.\"\n );\n }\n }\n\n private cleanExpiredLocks(): void {\n const now = Date.now();\n for (const [threadId, lock] of this.locks) {\n if (lock.expiresAt <= now) {\n this.locks.delete(threadId);\n }\n }\n }\n\n // For testing purposes\n _getSubscriptionCount(): number {\n return this.subscriptions.size;\n }\n\n _getLockCount(): number {\n this.cleanExpiredLocks();\n return this.locks.size;\n }\n}\n\nfunction generateToken(): string {\n return `mem_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;\n}\n\nexport function createMemoryState(): MemoryStateAdapter {\n return new MemoryStateAdapter();\n}\n"],"mappings":";AAmBO,IAAM,qBAAN,MAAiD;AAAA,EACrC,gBAAgB,oBAAI,IAAY;AAAA,EAChC,QAAQ,oBAAI,IAAwB;AAAA,EACpC,QAAQ,oBAAI,IAAyB;AAAA,EAC9C,YAAY;AAAA,EACZ,iBAAuC;AAAA,EAE/C,MAAM,UAAyB;AAC7B,QAAI,KAAK,WAAW;AAClB;AAAA,IACF;AAGA,QAAI,CAAC,KAAK,gBAAgB;AACxB,WAAK,iBAAiB,QAAQ,QAAQ,EAAE,KAAK,MAAM;AACjD,YAAI,QAAQ,IAAI,aAAa,cAAc;AACzC,kBAAQ;AAAA,YACN;AAAA,UAEF;AAAA,QACF;AACA,aAAK,YAAY;AAAA,MACnB,CAAC;AAAA,IACH;AAEA,UAAM,KAAK;AAAA,EACb;AAAA,EAEA,MAAM,aAA4B;AAChC,SAAK,YAAY;AACjB,SAAK,iBAAiB;AACtB,SAAK,cAAc,MAAM;AACzB,SAAK,MAAM,MAAM;AAAA,EACnB;AAAA,EAEA,MAAM,UAAU,UAAiC;AAC/C,SAAK,gBAAgB;AACrB,SAAK,cAAc,IAAI,QAAQ;AAAA,EACjC;AAAA,EAEA,MAAM,YAAY,UAAiC;AACjD,SAAK,gBAAgB;AACrB,SAAK,cAAc,OAAO,QAAQ;AAAA,EACpC;AAAA,EAEA,MAAM,aAAa,UAAoC;AACrD,SAAK,gBAAgB;AACrB,WAAO,KAAK,cAAc,IAAI,QAAQ;AAAA,EACxC;AAAA,EAEA,MAAM,YAAY,UAAkB,OAAqC;AACvE,SAAK,gBAAgB;AACrB,SAAK,kBAAkB;AAGvB,UAAM,eAAe,KAAK,MAAM,IAAI,QAAQ;AAC5C,QAAI,gBAAgB,aAAa,YAAY,KAAK,IAAI,GAAG;AACvD,aAAO;AAAA,IACT;AAGA,UAAM,OAAmB;AAAA,MACvB;AAAA,MACA,OAAO,cAAc;AAAA,MACrB,WAAW,KAAK,IAAI,IAAI;AAAA,IAC1B;AAEA,SAAK,MAAM,IAAI,UAAU,IAAI;AAC7B,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,iBAAiB,UAAiC;AACtD,SAAK,gBAAgB;AACrB,SAAK,MAAM,OAAO,QAAQ;AAAA,EAC5B;AAAA,EAEA,MAAM,YAAY,MAA2B;AAC3C,SAAK,gBAAgB;AAErB,UAAM,eAAe,KAAK,MAAM,IAAI,KAAK,QAAQ;AACjD,QAAI,gBAAgB,aAAa,UAAU,KAAK,OAAO;AACrD,WAAK,MAAM,OAAO,KAAK,QAAQ;AAAA,IACjC;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,MAAY,OAAiC;AAC5D,SAAK,gBAAgB;AAErB,UAAM,eAAe,KAAK,MAAM,IAAI,KAAK,QAAQ;AACjD,QAAI,CAAC,gBAAgB,aAAa,UAAU,KAAK,OAAO;AACtD,aAAO;AAAA,IACT;AAEA,QAAI,aAAa,YAAY,KAAK,IAAI,GAAG;AAEvC,WAAK,MAAM,OAAO,KAAK,QAAQ;AAC/B,aAAO;AAAA,IACT;AAGA,iBAAa,YAAY,KAAK,IAAI,IAAI;AACtC,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,IAAiB,KAAgC;AACrD,SAAK,gBAAgB;AAErB,UAAM,SAAS,KAAK,MAAM,IAAI,GAAG;AACjC,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,IACT;AAGA,QAAI,OAAO,cAAc,QAAQ,OAAO,aAAa,KAAK,IAAI,GAAG;AAC/D,WAAK,MAAM,OAAO,GAAG;AACrB,aAAO;AAAA,IACT;AAEA,WAAO,OAAO;AAAA,EAChB;AAAA,EAEA,MAAM,IAAiB,KAAa,OAAU,OAA+B;AAC3E,SAAK,gBAAgB;AAErB,SAAK,MAAM,IAAI,KAAK;AAAA,MAClB;AAAA,MACA,WAAW,QAAQ,KAAK,IAAI,IAAI,QAAQ;AAAA,IAC1C,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,eACJ,KACA,OACA,OACkB;AAClB,SAAK,gBAAgB;AAErB,UAAM,WAAW,KAAK,MAAM,IAAI,GAAG;AACnC,QAAI,UAAU;AAEZ,UAAI,SAAS,cAAc,QAAQ,SAAS,aAAa,KAAK,IAAI,GAAG;AACnE,aAAK,MAAM,OAAO,GAAG;AAAA,MACvB,OAAO;AACL,eAAO;AAAA,MACT;AAAA,IACF;AAEA,SAAK,MAAM,IAAI,KAAK;AAAA,MAClB;AAAA,MACA,WAAW,QAAQ,KAAK,IAAI,IAAI,QAAQ;AAAA,IAC1C,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,OAAO,KAA4B;AACvC,SAAK,gBAAgB;AACrB,SAAK,MAAM,OAAO,GAAG;AAAA,EACvB;AAAA,EAEQ,kBAAwB;AAC9B,QAAI,CAAC,KAAK,WAAW;AACnB,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,oBAA0B;AAChC,UAAM,MAAM,KAAK,IAAI;AACrB,eAAW,CAAC,UAAU,IAAI,KAAK,KAAK,OAAO;AACzC,UAAI,KAAK,aAAa,KAAK;AACzB,aAAK,MAAM,OAAO,QAAQ;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,wBAAgC;AAC9B,WAAO,KAAK,cAAc;AAAA,EAC5B;AAAA,EAEA,gBAAwB;AACtB,SAAK,kBAAkB;AACvB,WAAO,KAAK,MAAM;AAAA,EACpB;AACF;AAEA,SAAS,gBAAwB;AAC/B,SAAO,OAAO,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,EAAE,CAAC;AACzE;AAEO,SAAS,oBAAwC;AACtD,SAAO,IAAI,mBAAmB;AAChC;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chat-adapter/state-memory",
3
- "version": "4.17.0",
3
+ "version": "4.19.0",
4
4
  "description": "In-memory state adapter for chat (development/testing)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -16,7 +16,7 @@
16
16
  "dist"
17
17
  ],
18
18
  "dependencies": {
19
- "chat": "4.17.0"
19
+ "chat": "4.19.0"
20
20
  },
21
21
  "repository": {
22
22
  "type": "git",