@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.
- package/CHANGELOG.md +13 -0
- package/dist/base.cjs +9 -11
- package/dist/base.d.ts +7 -8
- package/dist/base.js +3 -5
- package/dist/base.js.map +1 -1
- package/dist/cache/base.cjs +22 -0
- package/dist/cache/base.d.ts +38 -0
- package/dist/cache/base.js +18 -0
- package/dist/cache/base.js.map +1 -0
- package/dist/cache/index.cjs +19 -0
- package/dist/cache/index.d.ts +2 -0
- package/dist/cache/index.js +3 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/memory.cjs +59 -0
- package/dist/cache/memory.d.ts +14 -0
- package/dist/cache/memory.js +55 -0
- package/dist/cache/memory.js.map +1 -0
- package/dist/id.cjs +2 -3
- package/dist/index.cjs +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/memory.cjs +44 -34
- package/dist/memory.d.ts +2 -2
- package/dist/memory.js +45 -35
- package/dist/memory.js.map +1 -1
- package/dist/serde/base.d.ts +2 -2
- package/dist/serde/jsonplus.cjs +1 -1
- package/dist/serde/jsonplus.d.ts +1 -1
- package/dist/serde/jsonplus.js +1 -1
- package/dist/serde/jsonplus.js.map +1 -1
- package/dist/serde/utils/fast-safe-stringify/index.cjs +1 -2
- package/dist/serde/utils/fast-safe-stringify/index.js.map +1 -1
- package/dist/store/base.cjs +3 -3
- package/dist/store/base.d.ts +2 -2
- package/dist/store/base.js.map +1 -1
- package/dist/store/batch.js.map +1 -1
- package/dist/store/memory.js.map +1 -1
- package/dist/store/utils.cjs +4 -5
- package/dist/store/utils.js.map +1 -1
- package/dist/types.d.ts +0 -5
- 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.
|
|
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:
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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:
|
|
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
|
|
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":"AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAMhC,OAAO,
|
|
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 @@
|
|
|
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.
|
|
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
package/dist/index.js
CHANGED
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
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
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
|
-
|
|
176
|
-
|
|
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] =
|
|
219
|
-
|
|
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.
|
|
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;
|