@langchain/langgraph-checkpoint 0.0.17 → 0.1.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.
Files changed (42) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/base.cjs +9 -11
  3. package/dist/base.d.ts +7 -8
  4. package/dist/base.js +3 -5
  5. package/dist/base.js.map +1 -1
  6. package/dist/cache/base.cjs +22 -0
  7. package/dist/cache/base.d.ts +38 -0
  8. package/dist/cache/base.js +18 -0
  9. package/dist/cache/base.js.map +1 -0
  10. package/dist/cache/index.cjs +19 -0
  11. package/dist/cache/index.d.ts +2 -0
  12. package/dist/cache/index.js +3 -0
  13. package/dist/cache/index.js.map +1 -0
  14. package/dist/cache/memory.cjs +59 -0
  15. package/dist/cache/memory.d.ts +14 -0
  16. package/dist/cache/memory.js +55 -0
  17. package/dist/cache/memory.js.map +1 -0
  18. package/dist/id.cjs +2 -3
  19. package/dist/index.cjs +1 -0
  20. package/dist/index.d.ts +1 -0
  21. package/dist/index.js +1 -0
  22. package/dist/index.js.map +1 -1
  23. package/dist/memory.cjs +44 -34
  24. package/dist/memory.d.ts +2 -2
  25. package/dist/memory.js +45 -35
  26. package/dist/memory.js.map +1 -1
  27. package/dist/serde/base.d.ts +2 -2
  28. package/dist/serde/jsonplus.cjs +1 -1
  29. package/dist/serde/jsonplus.d.ts +1 -1
  30. package/dist/serde/jsonplus.js +1 -1
  31. package/dist/serde/jsonplus.js.map +1 -1
  32. package/dist/serde/utils/fast-safe-stringify/index.cjs +1 -2
  33. package/dist/serde/utils/fast-safe-stringify/index.js.map +1 -1
  34. package/dist/store/base.cjs +3 -3
  35. package/dist/store/base.d.ts +2 -2
  36. package/dist/store/base.js.map +1 -1
  37. package/dist/store/batch.js.map +1 -1
  38. package/dist/store/memory.js.map +1 -1
  39. package/dist/store/utils.cjs +4 -5
  40. package/dist/store/utils.js.map +1 -1
  41. package/dist/types.d.ts +0 -5
  42. package/package.json +10 -17
package/CHANGELOG.md ADDED
@@ -0,0 +1,13 @@
1
+ # @langchain/langgraph-checkpoint
2
+
3
+ ## 0.1.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 10f292a: Remove pending_sends from parent checkpoints in favour of TASKS channel
8
+ - 3fd7f73: Allow asynchronous serialization and deserialization
9
+ - 773ec0d: Remove Checkpoint.writes
10
+
11
+ ### Patch Changes
12
+
13
+ - ccbcbc1: Add delete thread method to checkpointers
package/dist/base.cjs CHANGED
@@ -1,6 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getCheckpointId = exports.WRITES_IDX_MAP = exports.maxChannelVersion = exports.compareChannelVersions = exports.BaseCheckpointSaver = exports.copyCheckpoint = exports.emptyCheckpoint = exports.deepCopy = void 0;
3
+ exports.WRITES_IDX_MAP = exports.BaseCheckpointSaver = void 0;
4
+ exports.deepCopy = deepCopy;
5
+ exports.emptyCheckpoint = emptyCheckpoint;
6
+ exports.copyCheckpoint = copyCheckpoint;
7
+ exports.compareChannelVersions = compareChannelVersions;
8
+ exports.maxChannelVersion = maxChannelVersion;
9
+ exports.getCheckpointId = getCheckpointId;
4
10
  const id_js_1 = require("./id.cjs");
5
11
  const types_js_1 = require("./serde/types.cjs");
6
12
  const jsonplus_js_1 = require("./serde/jsonplus.cjs");
@@ -16,20 +22,17 @@ function deepCopy(obj) {
16
22
  }
17
23
  return newObj;
18
24
  }
19
- exports.deepCopy = deepCopy;
20
25
  /** @hidden */
21
26
  function emptyCheckpoint() {
22
27
  return {
23
- v: 1,
28
+ v: 4,
24
29
  id: (0, id_js_1.uuid6)(-2),
25
30
  ts: new Date().toISOString(),
26
31
  channel_values: {},
27
32
  channel_versions: {},
28
33
  versions_seen: {},
29
- pending_sends: [],
30
34
  };
31
35
  }
32
- exports.emptyCheckpoint = emptyCheckpoint;
33
36
  /** @hidden */
34
37
  function copyCheckpoint(checkpoint) {
35
38
  return {
@@ -39,10 +42,8 @@ function copyCheckpoint(checkpoint) {
39
42
  channel_values: { ...checkpoint.channel_values },
40
43
  channel_versions: { ...checkpoint.channel_versions },
41
44
  versions_seen: deepCopy(checkpoint.versions_seen),
42
- pending_sends: [...checkpoint.pending_sends],
43
45
  };
44
46
  }
45
- exports.copyCheckpoint = copyCheckpoint;
46
47
  class BaseCheckpointSaver {
47
48
  constructor(serde) {
48
49
  Object.defineProperty(this, "serde", {
@@ -63,7 +64,7 @@ class BaseCheckpointSaver {
63
64
  * Default is to use integer versions, incrementing by 1. If you override, you can use str/int/float versions,
64
65
  * as long as they are monotonically increasing.
65
66
  */
66
- getNextVersion(current, _channel) {
67
+ getNextVersion(current) {
67
68
  if (typeof current === "string") {
68
69
  throw new Error("Please override this method to use string versions.");
69
70
  }
@@ -77,7 +78,6 @@ function compareChannelVersions(a, b) {
77
78
  }
78
79
  return String(a).localeCompare(String(b));
79
80
  }
80
- exports.compareChannelVersions = compareChannelVersions;
81
81
  function maxChannelVersion(...versions) {
82
82
  return versions.reduce((max, version, idx) => {
83
83
  if (idx === 0)
@@ -85,7 +85,6 @@ function maxChannelVersion(...versions) {
85
85
  return compareChannelVersions(max, version) >= 0 ? max : version;
86
86
  });
87
87
  }
88
- exports.maxChannelVersion = maxChannelVersion;
89
88
  /**
90
89
  * Mapping from error type to error index.
91
90
  * Regular writes just map to their index in the list of writes being saved.
@@ -102,5 +101,4 @@ exports.WRITES_IDX_MAP = {
102
101
  function getCheckpointId(config) {
103
102
  return (config.configurable?.checkpoint_id || config.configurable?.thread_ts || "");
104
103
  }
105
- exports.getCheckpointId = getCheckpointId;
106
104
  //# sourceMappingURL=base.js.map
package/dist/base.d.ts CHANGED
@@ -1,12 +1,11 @@
1
1
  import type { RunnableConfig } from "@langchain/core/runnables";
2
2
  import { SerializerProtocol } from "./serde/base.js";
3
3
  import type { PendingWrite, CheckpointPendingWrite, CheckpointMetadata } from "./types.js";
4
- import { type ChannelProtocol, type SendProtocol } from "./serde/types.js";
5
4
  type ChannelVersion = number | string;
6
5
  export type ChannelVersions = Record<string, ChannelVersion>;
7
6
  export interface Checkpoint<N extends string = string, C extends string = string> {
8
7
  /**
9
- * The version of the checkpoint format. Currently 1
8
+ * The version of the checkpoint format. Currently 4
10
9
  */
11
10
  v: number;
12
11
  /**
@@ -29,11 +28,6 @@ export interface Checkpoint<N extends string = string, C extends string = string
29
28
  * @default {}
30
29
  */
31
30
  versions_seen: Record<N, Record<C, ChannelVersion>>;
32
- /**
33
- * List of packets sent to nodes but not yet processed.
34
- * Cleared by the next checkpoint.
35
- */
36
- pending_sends: SendProtocol[];
37
31
  }
38
32
  export interface ReadonlyCheckpoint extends Readonly<Checkpoint> {
39
33
  readonly channel_values: Readonly<Record<string, unknown>>;
@@ -68,13 +62,18 @@ export declare abstract class BaseCheckpointSaver<V extends string | number = nu
68
62
  * Store intermediate writes linked to a checkpoint.
69
63
  */
70
64
  abstract putWrites(config: RunnableConfig, writes: PendingWrite[], taskId: string): Promise<void>;
65
+ /**
66
+ * Delete all checkpoints and writes associated with a specific thread ID.
67
+ * @param threadId The thread ID whose checkpoints should be deleted.
68
+ */
69
+ abstract deleteThread(threadId: string): Promise<void>;
71
70
  /**
72
71
  * Generate the next version ID for a channel.
73
72
  *
74
73
  * Default is to use integer versions, incrementing by 1. If you override, you can use str/int/float versions,
75
74
  * as long as they are monotonically increasing.
76
75
  */
77
- getNextVersion(current: V | undefined, _channel: ChannelProtocol): V;
76
+ getNextVersion(current: V | undefined): V;
78
77
  }
79
78
  export declare function compareChannelVersions(a: ChannelVersion, b: ChannelVersion): number;
80
79
  export declare function maxChannelVersion(...versions: ChannelVersion[]): ChannelVersion;
package/dist/base.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { uuid6 } from "./id.js";
2
- import { ERROR, INTERRUPT, RESUME, SCHEDULED, } from "./serde/types.js";
2
+ import { ERROR, INTERRUPT, RESUME, SCHEDULED } from "./serde/types.js";
3
3
  import { JsonPlusSerializer } from "./serde/jsonplus.js";
4
4
  export function deepCopy(obj) {
5
5
  if (typeof obj !== "object" || obj === null) {
@@ -16,13 +16,12 @@ export function deepCopy(obj) {
16
16
  /** @hidden */
17
17
  export function emptyCheckpoint() {
18
18
  return {
19
- v: 1,
19
+ v: 4,
20
20
  id: uuid6(-2),
21
21
  ts: new Date().toISOString(),
22
22
  channel_values: {},
23
23
  channel_versions: {},
24
24
  versions_seen: {},
25
- pending_sends: [],
26
25
  };
27
26
  }
28
27
  /** @hidden */
@@ -34,7 +33,6 @@ export function copyCheckpoint(checkpoint) {
34
33
  channel_values: { ...checkpoint.channel_values },
35
34
  channel_versions: { ...checkpoint.channel_versions },
36
35
  versions_seen: deepCopy(checkpoint.versions_seen),
37
- pending_sends: [...checkpoint.pending_sends],
38
36
  };
39
37
  }
40
38
  export class BaseCheckpointSaver {
@@ -57,7 +55,7 @@ export class BaseCheckpointSaver {
57
55
  * Default is to use integer versions, incrementing by 1. If you override, you can use str/int/float versions,
58
56
  * as long as they are monotonically increasing.
59
57
  */
60
- getNextVersion(current, _channel) {
58
+ getNextVersion(current) {
61
59
  if (typeof current === "string") {
62
60
  throw new Error("Please override this method to use string versions.");
63
61
  }
package/dist/base.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"base.js","sourceRoot":"","sources":["../src/base.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../src/base.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BaseCache = void 0;
4
+ const jsonplus_js_1 = require("../serde/jsonplus.cjs");
5
+ class BaseCache {
6
+ /**
7
+ * Initialize the cache with a serializer.
8
+ *
9
+ * @param serde - The serializer to use.
10
+ */
11
+ constructor(serde) {
12
+ Object.defineProperty(this, "serde", {
13
+ enumerable: true,
14
+ configurable: true,
15
+ writable: true,
16
+ value: new jsonplus_js_1.JsonPlusSerializer()
17
+ });
18
+ this.serde = serde || this.serde;
19
+ }
20
+ }
21
+ exports.BaseCache = BaseCache;
22
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1,38 @@
1
+ import { SerializerProtocol } from "../serde/base.js";
2
+ export type CacheNamespace = string[];
3
+ export type CacheFullKey = [namespace: CacheNamespace, key: string];
4
+ export declare abstract class BaseCache<V = unknown> {
5
+ serde: SerializerProtocol;
6
+ /**
7
+ * Initialize the cache with a serializer.
8
+ *
9
+ * @param serde - The serializer to use.
10
+ */
11
+ constructor(serde?: SerializerProtocol);
12
+ /**
13
+ * Get the cached values for the given keys.
14
+ *
15
+ * @param keys - The keys to get.
16
+ */
17
+ abstract get(keys: CacheFullKey[]): Promise<{
18
+ key: CacheFullKey;
19
+ value: V;
20
+ }[]>;
21
+ /**
22
+ * Set the cached values for the given keys and TTLs.
23
+ *
24
+ * @param pairs - The pairs to set.
25
+ */
26
+ abstract set(pairs: {
27
+ key: CacheFullKey;
28
+ value: V;
29
+ ttl?: number;
30
+ }[]): Promise<void>;
31
+ /**
32
+ * Delete the cached values for the given namespaces.
33
+ * If no namespaces are provided, clear all cached values.
34
+ *
35
+ * @param namespaces - The namespaces to clear.
36
+ */
37
+ abstract clear(namespaces: CacheNamespace[]): Promise<void>;
38
+ }
@@ -0,0 +1,18 @@
1
+ import { JsonPlusSerializer } from "../serde/jsonplus.js";
2
+ export class BaseCache {
3
+ /**
4
+ * Initialize the cache with a serializer.
5
+ *
6
+ * @param serde - The serializer to use.
7
+ */
8
+ constructor(serde) {
9
+ Object.defineProperty(this, "serde", {
10
+ enumerable: true,
11
+ configurable: true,
12
+ writable: true,
13
+ value: new JsonPlusSerializer()
14
+ });
15
+ this.serde = serde || this.serde;
16
+ }
17
+ }
18
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/cache/base.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAK1D,MAAM,OAAgB,SAAS;IAG7B;;;;OAIG;IACH,YAAY,KAA0B;QAPtC;;;;mBAA4B,IAAI,kBAAkB,EAAE;WAAC;QAQnD,IAAI,CAAC,KAAK,GAAG,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC;IACnC,CAAC;CA2BF"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./base.cjs"), exports);
18
+ __exportStar(require("./memory.cjs"), exports);
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,2 @@
1
+ export * from "./base.js";
2
+ export * from "./memory.js";
@@ -0,0 +1,3 @@
1
+ export * from "./base.js";
2
+ export * from "./memory.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC"}
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InMemoryCache = void 0;
4
+ const base_js_1 = require("./base.cjs");
5
+ class InMemoryCache extends base_js_1.BaseCache {
6
+ constructor() {
7
+ super(...arguments);
8
+ Object.defineProperty(this, "cache", {
9
+ enumerable: true,
10
+ configurable: true,
11
+ writable: true,
12
+ value: {}
13
+ });
14
+ }
15
+ async get(keys) {
16
+ if (!keys.length)
17
+ return [];
18
+ const now = Date.now();
19
+ return (await Promise.all(keys.map(async (fullKey) => {
20
+ const [namespace, key] = fullKey;
21
+ const strNamespace = namespace.join(",");
22
+ if (strNamespace in this.cache && key in this.cache[strNamespace]) {
23
+ const cached = this.cache[strNamespace][key];
24
+ if (cached.exp == null || now < cached.exp) {
25
+ const value = await this.serde.loadsTyped(cached.enc, cached.val);
26
+ return [{ key: fullKey, value }];
27
+ }
28
+ else {
29
+ delete this.cache[strNamespace][key];
30
+ }
31
+ }
32
+ return [];
33
+ }))).flat();
34
+ }
35
+ async set(pairs) {
36
+ const now = Date.now();
37
+ for (const { key: fullKey, value, ttl } of pairs) {
38
+ const [namespace, key] = fullKey;
39
+ const strNamespace = namespace.join(",");
40
+ const [enc, val] = await this.serde.dumpsTyped(value);
41
+ const exp = ttl != null ? ttl * 1000 + now : null;
42
+ this.cache[strNamespace] ??= {};
43
+ this.cache[strNamespace][key] = { enc, val, exp };
44
+ }
45
+ }
46
+ async clear(namespaces) {
47
+ if (!namespaces.length) {
48
+ this.cache = {};
49
+ return;
50
+ }
51
+ for (const namespace of namespaces) {
52
+ const strNamespace = namespace.join(",");
53
+ if (strNamespace in this.cache)
54
+ delete this.cache[strNamespace];
55
+ }
56
+ }
57
+ }
58
+ exports.InMemoryCache = InMemoryCache;
59
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1,14 @@
1
+ import { BaseCache, type CacheFullKey, type CacheNamespace } from "./base.js";
2
+ export declare class InMemoryCache<V = unknown> extends BaseCache<V> {
3
+ private cache;
4
+ get(keys: CacheFullKey[]): Promise<{
5
+ key: CacheFullKey;
6
+ value: V;
7
+ }[]>;
8
+ set(pairs: {
9
+ key: CacheFullKey;
10
+ value: V;
11
+ ttl?: number;
12
+ }[]): Promise<void>;
13
+ clear(namespaces: CacheNamespace[]): Promise<void>;
14
+ }
@@ -0,0 +1,55 @@
1
+ import { BaseCache } from "./base.js";
2
+ export class InMemoryCache extends BaseCache {
3
+ constructor() {
4
+ super(...arguments);
5
+ Object.defineProperty(this, "cache", {
6
+ enumerable: true,
7
+ configurable: true,
8
+ writable: true,
9
+ value: {}
10
+ });
11
+ }
12
+ async get(keys) {
13
+ if (!keys.length)
14
+ return [];
15
+ const now = Date.now();
16
+ return (await Promise.all(keys.map(async (fullKey) => {
17
+ const [namespace, key] = fullKey;
18
+ const strNamespace = namespace.join(",");
19
+ if (strNamespace in this.cache && key in this.cache[strNamespace]) {
20
+ const cached = this.cache[strNamespace][key];
21
+ if (cached.exp == null || now < cached.exp) {
22
+ const value = await this.serde.loadsTyped(cached.enc, cached.val);
23
+ return [{ key: fullKey, value }];
24
+ }
25
+ else {
26
+ delete this.cache[strNamespace][key];
27
+ }
28
+ }
29
+ return [];
30
+ }))).flat();
31
+ }
32
+ async set(pairs) {
33
+ const now = Date.now();
34
+ for (const { key: fullKey, value, ttl } of pairs) {
35
+ const [namespace, key] = fullKey;
36
+ const strNamespace = namespace.join(",");
37
+ const [enc, val] = await this.serde.dumpsTyped(value);
38
+ const exp = ttl != null ? ttl * 1000 + now : null;
39
+ this.cache[strNamespace] ??= {};
40
+ this.cache[strNamespace][key] = { enc, val, exp };
41
+ }
42
+ }
43
+ async clear(namespaces) {
44
+ if (!namespaces.length) {
45
+ this.cache = {};
46
+ return;
47
+ }
48
+ for (const namespace of namespaces) {
49
+ const strNamespace = namespace.join(",");
50
+ if (strNamespace in this.cache)
51
+ delete this.cache[strNamespace];
52
+ }
53
+ }
54
+ }
55
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/cache/memory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA0C,MAAM,WAAW,CAAC;AAE9E,MAAM,OAAO,aAA2B,SAAQ,SAAY;IAA5D;;QACU;;;;mBAQJ,EAAE;WAAC;IA0DT,CAAC;IAxDC,KAAK,CAAC,GAAG,CAAC,IAAoB;QAC5B,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,OAAO,CACL,MAAM,OAAO,CAAC,GAAG,CACf,IAAI,CAAC,GAAG,CACN,KAAK,EAAE,OAAO,EAA8C,EAAE;YAC5D,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC;YACjC,MAAM,YAAY,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAEzC,IAAI,YAAY,IAAI,IAAI,CAAC,KAAK,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;gBAClE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC;gBAC7C,IAAI,MAAM,CAAC,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC;oBAC3C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CACvC,MAAM,CAAC,GAAG,EACV,MAAM,CAAC,GAAG,CACX,CAAC;oBACF,OAAO,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;gBACnC,CAAC;qBAAM,CAAC;oBACN,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC;gBACvC,CAAC;YACH,CAAC;YAED,OAAO,EAAE,CAAC;QACZ,CAAC,CACF,CACF,CACF,CAAC,IAAI,EAAE,CAAC;IACX,CAAC;IAED,KAAK,CAAC,GAAG,CACP,KAAsD;QAEtD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,KAAK,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,KAAK,EAAE,CAAC;YACjD,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC;YACjC,MAAM,YAAY,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACzC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACtD,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;YAElD,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;YAChC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;QACpD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,UAA4B;QACtC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;YACvB,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;YAChB,OAAO;QACT,CAAC;QAED,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,MAAM,YAAY,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACzC,IAAI,YAAY,IAAI,IAAI,CAAC,KAAK;gBAAE,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;CACF"}
package/dist/id.cjs CHANGED
@@ -1,11 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.uuid5 = exports.uuid6 = void 0;
3
+ exports.uuid6 = uuid6;
4
+ exports.uuid5 = uuid5;
4
5
  const uuid_1 = require("uuid");
5
6
  function uuid6(clockseq) {
6
7
  return (0, uuid_1.v6)({ clockseq });
7
8
  }
8
- exports.uuid6 = uuid6;
9
9
  // Skip UUID validation check, since UUID6s
10
10
  // generated with negative clockseq are not
11
11
  // technically compliant, but still work.
@@ -17,5 +17,4 @@ function uuid5(name, namespace) {
17
17
  .map((byte) => parseInt(byte, 16));
18
18
  return (0, uuid_1.v5)(name, new Uint8Array(namespaceBytes));
19
19
  }
20
- exports.uuid5 = uuid5;
21
20
  //# sourceMappingURL=id.js.map
package/dist/index.cjs CHANGED
@@ -23,4 +23,5 @@ __exportStar(require("./types.cjs"), exports);
23
23
  __exportStar(require("./serde/base.cjs"), exports);
24
24
  __exportStar(require("./serde/types.cjs"), exports);
25
25
  __exportStar(require("./store/index.cjs"), exports);
26
+ __exportStar(require("./cache/index.cjs"), exports);
26
27
  //# sourceMappingURL=index.js.map
package/dist/index.d.ts CHANGED
@@ -5,3 +5,4 @@ export * from "./types.js";
5
5
  export * from "./serde/base.js";
6
6
  export * from "./serde/types.js";
7
7
  export * from "./store/index.js";
8
+ export * from "./cache/index.js";
package/dist/index.js CHANGED
@@ -5,4 +5,5 @@ export * from "./types.js";
5
5
  export * from "./serde/base.js";
6
6
  export * from "./serde/types.js";
7
7
  export * from "./store/index.js";
8
+ export * from "./cache/index.js";
8
9
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC"}
package/dist/memory.cjs CHANGED
@@ -6,6 +6,10 @@ const types_js_1 = require("./serde/types.cjs");
6
6
  function _generateKey(threadId, checkpointNamespace, checkpointId) {
7
7
  return JSON.stringify([threadId, checkpointNamespace, checkpointId]);
8
8
  }
9
+ function _parseKey(key) {
10
+ const [threadId, checkpointNamespace, checkpointId] = JSON.parse(key);
11
+ return { threadId, checkpointNamespace, checkpointId };
12
+ }
9
13
  class MemorySaver extends base_js_1.BaseCheckpointSaver {
10
14
  constructor(serde) {
11
15
  super(serde);
@@ -23,19 +27,19 @@ class MemorySaver extends base_js_1.BaseCheckpointSaver {
23
27
  value: {}
24
28
  });
25
29
  }
26
- async _getPendingSends(threadId, checkpointNs, parentCheckpointId) {
27
- let pendingSends = [];
28
- if (parentCheckpointId !== undefined) {
29
- const key = _generateKey(threadId, checkpointNs, parentCheckpointId);
30
- pendingSends = await Promise.all(Object.values(this.writes[key] || {})
31
- ?.filter(([_taskId, channel]) => {
32
- return channel === types_js_1.TASKS;
33
- })
34
- .map(([_taskId, _channel, writes]) => {
35
- return this.serde.loadsTyped("json", writes);
36
- }) ?? []);
37
- }
38
- return pendingSends;
30
+ async _migratePendingSends(mutableCheckpoint, threadId, checkpointNs, parentCheckpointId) {
31
+ const deseriablizableCheckpoint = mutableCheckpoint;
32
+ const parentKey = _generateKey(threadId, checkpointNs, parentCheckpointId);
33
+ const pendingSends = await Promise.all(Object.values(this.writes[parentKey] ?? {})
34
+ .filter(([_taskId, channel]) => channel === types_js_1.TASKS)
35
+ .map(async ([_taskId, _channel, writes]) => await this.serde.loadsTyped("json", writes)));
36
+ deseriablizableCheckpoint.channel_values ??= {};
37
+ deseriablizableCheckpoint.channel_values[types_js_1.TASKS] = pendingSends;
38
+ deseriablizableCheckpoint.channel_versions ??= {};
39
+ deseriablizableCheckpoint.channel_versions[types_js_1.TASKS] =
40
+ Object.keys(deseriablizableCheckpoint.channel_versions).length > 0
41
+ ? (0, base_js_1.maxChannelVersion)(...Object.values(deseriablizableCheckpoint.channel_versions))
42
+ : this.getNextVersion(undefined);
39
43
  }
40
44
  async getTuple(config) {
41
45
  const thread_id = config.configurable?.thread_id;
@@ -46,11 +50,10 @@ class MemorySaver extends base_js_1.BaseCheckpointSaver {
46
50
  if (saved !== undefined) {
47
51
  const [checkpoint, metadata, parentCheckpointId] = saved;
48
52
  const key = _generateKey(thread_id, checkpoint_ns, checkpoint_id);
49
- const pending_sends = await this._getPendingSends(thread_id, checkpoint_ns, parentCheckpointId);
50
- const deserializedCheckpoint = {
51
- ...(await this.serde.loadsTyped("json", checkpoint)),
52
- pending_sends,
53
- };
53
+ const deserializedCheckpoint = await this.serde.loadsTyped("json", checkpoint);
54
+ if (deserializedCheckpoint.v < 4 && parentCheckpointId !== undefined) {
55
+ await this._migratePendingSends(deserializedCheckpoint, thread_id, checkpoint_ns, parentCheckpointId);
56
+ }
54
57
  const pendingWrites = await Promise.all(Object.values(this.writes[key] || {}).map(async ([taskId, channel, value]) => {
55
58
  return [
56
59
  taskId,
@@ -84,11 +87,10 @@ class MemorySaver extends base_js_1.BaseCheckpointSaver {
84
87
  const saved = checkpoints[checkpoint_id];
85
88
  const [checkpoint, metadata, parentCheckpointId] = saved;
86
89
  const key = _generateKey(thread_id, checkpoint_ns, checkpoint_id);
87
- const pending_sends = await this._getPendingSends(thread_id, checkpoint_ns, parentCheckpointId);
88
- const deserializedCheckpoint = {
89
- ...(await this.serde.loadsTyped("json", checkpoint)),
90
- pending_sends,
91
- };
90
+ const deserializedCheckpoint = await this.serde.loadsTyped("json", checkpoint);
91
+ if (deserializedCheckpoint.v < 4 && parentCheckpointId !== undefined) {
92
+ await this._migratePendingSends(deserializedCheckpoint, thread_id, checkpoint_ns, parentCheckpointId);
93
+ }
92
94
  const pendingWrites = await Promise.all(Object.values(this.writes[key] || {}).map(async ([taskId, channel, value]) => {
93
95
  return [
94
96
  taskId,
@@ -163,7 +165,6 @@ class MemorySaver extends base_js_1.BaseCheckpointSaver {
163
165
  }
164
166
  const key = _generateKey(threadId, checkpointNamespace, checkpointId);
165
167
  const writes = Object.values(this.writes[key] || {});
166
- const pending_sends = await this._getPendingSends(threadId, checkpointNamespace, parentCheckpointId);
167
168
  const pendingWrites = await Promise.all(writes.map(async ([taskId, channel, value]) => {
168
169
  return [
169
170
  taskId,
@@ -171,10 +172,11 @@ class MemorySaver extends base_js_1.BaseCheckpointSaver {
171
172
  await this.serde.loadsTyped("json", value),
172
173
  ];
173
174
  }));
174
- const deserializedCheckpoint = {
175
- ...(await this.serde.loadsTyped("json", checkpoint)),
176
- pending_sends,
177
- };
175
+ const deserializedCheckpoint = await this.serde.loadsTyped("json", checkpoint);
176
+ if (deserializedCheckpoint.v < 4 &&
177
+ parentCheckpointId !== undefined) {
178
+ await this._migratePendingSends(deserializedCheckpoint, threadId, checkpointNamespace, parentCheckpointId);
179
+ }
178
180
  const checkpointTuple = {
179
181
  config: {
180
182
  configurable: {
@@ -203,7 +205,6 @@ class MemorySaver extends base_js_1.BaseCheckpointSaver {
203
205
  }
204
206
  async put(config, checkpoint, metadata) {
205
207
  const preparedCheckpoint = (0, base_js_1.copyCheckpoint)(checkpoint);
206
- delete preparedCheckpoint.pending_sends;
207
208
  const threadId = config.configurable?.thread_id;
208
209
  const checkpointNamespace = config.configurable?.checkpoint_ns ?? "";
209
210
  if (threadId === undefined) {
@@ -215,8 +216,10 @@ class MemorySaver extends base_js_1.BaseCheckpointSaver {
215
216
  if (!this.storage[threadId][checkpointNamespace]) {
216
217
  this.storage[threadId][checkpointNamespace] = {};
217
218
  }
218
- const [, serializedCheckpoint] = this.serde.dumpsTyped(preparedCheckpoint);
219
- const [, serializedMetadata] = this.serde.dumpsTyped(metadata);
219
+ const [[, serializedCheckpoint], [, serializedMetadata]] = await Promise.all([
220
+ this.serde.dumpsTyped(preparedCheckpoint),
221
+ this.serde.dumpsTyped(metadata),
222
+ ]);
220
223
  this.storage[threadId][checkpointNamespace][checkpoint.id] = [
221
224
  serializedCheckpoint,
222
225
  serializedMetadata,
@@ -245,8 +248,8 @@ class MemorySaver extends base_js_1.BaseCheckpointSaver {
245
248
  if (this.writes[outerKey] === undefined) {
246
249
  this.writes[outerKey] = {};
247
250
  }
248
- writes.forEach(([channel, value], idx) => {
249
- const [, serializedValue] = this.serde.dumpsTyped(value);
251
+ await Promise.all(writes.map(async ([channel, value], idx) => {
252
+ const [, serializedValue] = await this.serde.dumpsTyped(value);
250
253
  const innerKey = [
251
254
  taskId,
252
255
  base_js_1.WRITES_IDX_MAP[channel] || idx,
@@ -256,7 +259,14 @@ class MemorySaver extends base_js_1.BaseCheckpointSaver {
256
259
  return;
257
260
  }
258
261
  this.writes[outerKey][innerKeyStr] = [taskId, channel, serializedValue];
259
- });
262
+ }));
263
+ }
264
+ async deleteThread(threadId) {
265
+ delete this.storage[threadId];
266
+ for (const key of Object.keys(this.writes)) {
267
+ if (_parseKey(key).threadId === threadId)
268
+ delete this.writes[key];
269
+ }
260
270
  }
261
271
  }
262
272
  exports.MemorySaver = MemorySaver;