{"version":3,"file":"get_tuple.cjs","names":["TASKS","parentAndChildCheckpointTuplesWithWrites","putTuples"],"sources":["../../src/spec/get_tuple.ts"],"sourcesContent":["import {\n  type BaseCheckpointSaver,\n  type CheckpointTuple,\n  type PendingWrite,\n  type Checkpoint,\n  TASKS,\n  uuid6,\n} from \"@langchain/langgraph-checkpoint\";\nimport type { RunnableConfig } from \"@langchain/core/runnables\";\nimport { CheckpointerTestInitializer } from \"../types.js\";\nimport {\n  it_skipForSomeModules,\n  parentAndChildCheckpointTuplesWithWrites,\n  putTuples,\n} from \"../test_utils.js\";\n\nexport function getTupleTests<T extends BaseCheckpointSaver>(\n  initializer: CheckpointerTestInitializer<T>\n) {\n  describe(`${initializer.checkpointerName}#getTuple`, () => {\n    let checkpointer: T;\n    beforeAll(async () => {\n      checkpointer = await initializer.createCheckpointer();\n    });\n\n    afterAll(async () => {\n      await initializer.destroyCheckpointer?.(checkpointer);\n    });\n\n    describe.each([\"root\", \"child\"])(\"namespace: %s\", (namespace) => {\n      let thread_id: string;\n      const checkpoint_ns = namespace === \"root\" ? \"\" : namespace;\n\n      let parentCheckpointId: string;\n      let childCheckpointId: string;\n\n      let generatedParentTuple: CheckpointTuple;\n      let generatedChildTuple: CheckpointTuple;\n\n      let parentTuple: CheckpointTuple | undefined;\n      let childTuple: CheckpointTuple | undefined;\n      let latestTuple: CheckpointTuple | undefined;\n\n      beforeAll(async () => {\n        thread_id = uuid6(3);\n        parentCheckpointId = uuid6(3);\n        childCheckpointId = uuid6(3);\n\n        const writesToParent = [\n          {\n            taskId: \"pending_sends_task\",\n            writes: [[TASKS, [\"add_fish\"]]] as PendingWrite[],\n          },\n        ];\n\n        const writesToChild = [\n          {\n            taskId: \"add_fish\",\n            writes: [[\"animals\", [\"dog\", \"fish\"]]] as PendingWrite[],\n          },\n        ];\n\n        ({ parent: generatedParentTuple, child: generatedChildTuple } =\n          parentAndChildCheckpointTuplesWithWrites({\n            thread_id,\n            parentCheckpointId,\n            childCheckpointId,\n            checkpoint_ns,\n            initialChannelValues: {\n              animals: [\"dog\"],\n            },\n            writesToParent,\n            writesToChild,\n          }));\n\n        const storedTuples = putTuples(checkpointer, [\n          {\n            tuple: generatedParentTuple,\n            writes: writesToParent,\n            newVersions: { animals: 1 },\n          },\n          {\n            tuple: generatedChildTuple,\n            writes: writesToChild,\n            newVersions: { animals: 2 },\n          },\n        ]);\n\n        parentTuple = (await storedTuples.next()).value;\n        childTuple = (await storedTuples.next()).value;\n\n        latestTuple = await checkpointer.getTuple({\n          configurable: { thread_id, checkpoint_ns },\n        });\n      });\n\n      describe(\"success cases\", () => {\n        describe(\"when checkpoint_id is provided\", () => {\n          describe(\"first checkpoint\", () => {\n            it(\"should return a tuple containing the checkpoint without modification\", () => {\n              expect(parentTuple).not.toBeUndefined();\n              expect(parentTuple?.checkpoint).toEqual(\n                generatedParentTuple.checkpoint\n              );\n            });\n\n            it(\"should return a tuple containing the checkpoint's metadata without modification\", () => {\n              expect(parentTuple?.metadata).not.toBeUndefined();\n              expect(parentTuple?.metadata).toEqual(\n                generatedParentTuple.metadata\n              );\n            });\n\n            it(\"should return a tuple containing a config object that has the correct thread_id, checkpoint_ns, and checkpoint_id\", () => {\n              expect(parentTuple?.config).not.toBeUndefined();\n\n              expect(parentTuple?.config).toEqual({\n                configurable: {\n                  thread_id,\n                  checkpoint_ns,\n                  checkpoint_id: parentCheckpointId,\n                },\n              });\n            });\n\n            it(\"should return a tuple containing an undefined parentConfig\", () => {\n              expect(parentTuple?.parentConfig).toBeUndefined();\n            });\n\n            it(\"should return a tuple containing the writes against the checkpoint\", () => {\n              expect(parentTuple?.pendingWrites).toEqual([\n                [\"pending_sends_task\", TASKS, [\"add_fish\"]],\n              ]);\n            });\n          });\n\n          describe(\"subsequent checkpoints\", () => {\n            it(`should return a tuple containing the checkpoint`, async () => {\n              expect(childTuple).not.toBeUndefined();\n              expect(childTuple?.checkpoint).toEqual(\n                generatedChildTuple.checkpoint\n              );\n            });\n\n            it(\"should return a tuple containing the checkpoint's metadata without modification\", () => {\n              expect(childTuple?.metadata).not.toBeUndefined();\n              expect(childTuple?.metadata).toEqual(\n                generatedChildTuple.metadata\n              );\n            });\n\n            it(\"should return a tuple containing a config object that has the correct thread_id, checkpoint_ns, and checkpoint_id\", () => {\n              expect(childTuple?.config).not.toBeUndefined();\n              expect(childTuple?.config).toEqual({\n                configurable: {\n                  thread_id,\n                  checkpoint_ns,\n                  checkpoint_id: childCheckpointId,\n                },\n              });\n            });\n\n            it(\"should return a tuple containing a parentConfig with the correct thread_id, checkpoint_ns, and checkpoint_id\", () => {\n              expect(childTuple?.parentConfig).toEqual({\n                configurable: {\n                  thread_id,\n                  checkpoint_ns,\n                  checkpoint_id: parentCheckpointId,\n                },\n              });\n            });\n\n            it(\"should return a tuple containing the writes against the checkpoint\", () => {\n              expect(childTuple?.pendingWrites).toEqual([\n                [\"add_fish\", \"animals\", [\"dog\", \"fish\"]],\n              ]);\n            });\n          });\n        });\n\n        describe(\"when checkpoint_id is not provided\", () => {\n          it(`should return a tuple containing the latest checkpoint`, async () => {\n            expect(latestTuple).not.toBeUndefined();\n            expect(latestTuple?.checkpoint).toEqual(\n              generatedChildTuple.checkpoint\n            );\n          });\n\n          it(\"should return a tuple containing the latest checkpoint's metadata without modification\", () => {\n            expect(latestTuple?.metadata).not.toBeUndefined();\n            expect(latestTuple?.metadata).toEqual(generatedChildTuple.metadata);\n          });\n\n          it(\"should return a tuple containing a config object that has the correct thread_id, checkpoint_ns, and checkpoint_id for the latest checkpoint\", () => {\n            expect(latestTuple?.config).not.toBeUndefined();\n            expect(latestTuple?.config).toEqual({\n              configurable: {\n                thread_id,\n                checkpoint_ns,\n                checkpoint_id: childCheckpointId,\n              },\n            });\n          });\n\n          it(\"should return a tuple containing a parentConfig with the correct thread_id, checkpoint_ns, and checkpoint_id for the latest checkpoint's parent\", () => {\n            expect(latestTuple?.parentConfig).toEqual({\n              configurable: {\n                thread_id,\n                checkpoint_ns,\n                checkpoint_id: parentCheckpointId,\n              },\n            });\n          });\n\n          it(\"should return a tuple containing the writes against the latest checkpoint\", () => {\n            expect(latestTuple?.pendingWrites).toEqual([\n              [\"add_fish\", \"animals\", [\"dog\", \"fish\"]],\n            ]);\n          });\n        });\n      });\n\n      describe(\"failure cases\", () => {\n        it(\"should return undefined if the checkpoint_id is not found\", async () => {\n          const configWithInvalidCheckpointId = {\n            configurable: {\n              thread_id: uuid6(3),\n              checkpoint_ns,\n              checkpoint_id: uuid6(3),\n            },\n          };\n          const checkpointTuple = await checkpointer.getTuple(\n            configWithInvalidCheckpointId\n          );\n          expect(checkpointTuple).toBeUndefined();\n        });\n\n        it(\"should return undefined if the thread_id is undefined\", async () => {\n          const missingThreadIdConfig = {\n            configurable: {\n              checkpoint_ns,\n            },\n          };\n\n          expect(\n            await checkpointer.getTuple(missingThreadIdConfig)\n          ).toBeUndefined();\n        });\n      });\n\n      describe(\"channels carried over from an ancestor checkpoint\", () => {\n        let carryOverThreadId: string;\n        let childReconstructed: CheckpointTuple | undefined;\n        let latestReconstructed: CheckpointTuple | undefined;\n\n        beforeAll(async () => {\n          carryOverThreadId = uuid6(3);\n          const parentId = uuid6(3);\n          const childId = uuid6(3);\n\n          // Parent writes both `messages` (v1) and `stepCount` (v1).\n          const parent: CheckpointTuple = {\n            config: {\n              configurable: {\n                thread_id: carryOverThreadId,\n                checkpoint_ns,\n                checkpoint_id: parentId,\n              },\n            },\n            checkpoint: {\n              v: 4,\n              id: parentId,\n              ts: new Date().toISOString(),\n              channel_values: { messages: [\"hi\"], stepCount: 1 },\n              channel_versions: { messages: 1, stepCount: 1 },\n              versions_seen: { \"\": { someChannel: 1 } },\n            },\n            metadata: { source: \"loop\", step: 0, parents: {} },\n          };\n\n          // Child writes ONLY `stepCount` (bumped to v2). `messages` carries\n          // over from the parent at v1 and is intentionally absent from the\n          // child's `newVersions` — exactly the shape produced by a node that\n          // doesn't touch the `messages` channel.\n          const child: CheckpointTuple = {\n            config: {\n              configurable: {\n                thread_id: carryOverThreadId,\n                checkpoint_ns,\n                checkpoint_id: childId,\n              },\n            },\n            checkpoint: {\n              v: 4,\n              id: childId,\n              ts: new Date().toISOString(),\n              channel_values: { messages: [\"hi\"], stepCount: 3 },\n              channel_versions: { messages: 1, stepCount: 2 },\n              versions_seen: { \"\": { someChannel: 1 } },\n            },\n            metadata: { source: \"loop\", step: 1, parents: {} },\n            parentConfig: {\n              configurable: {\n                thread_id: carryOverThreadId,\n                checkpoint_ns,\n                checkpoint_id: parentId,\n              },\n            },\n          };\n\n          const stored = putTuples(checkpointer, [\n            {\n              tuple: parent,\n              writes: [],\n              newVersions: { messages: 1, stepCount: 1 },\n            },\n            { tuple: child, writes: [], newVersions: { stepCount: 2 } },\n          ]);\n\n          await stored.next(); // parent\n          childReconstructed = (await stored.next()).value;\n\n          latestReconstructed = await checkpointer.getTuple({\n            configurable: { thread_id: carryOverThreadId, checkpoint_ns },\n          });\n        });\n\n        it(\"reconstructs channels written by an ancestor but not the latest node\", () => {\n          expect(childReconstructed?.checkpoint.channel_values).toEqual({\n            messages: [\"hi\"],\n            stepCount: 3,\n          });\n        });\n\n        it(\"reconstructs carried-over channels when loading the latest checkpoint\", () => {\n          expect(latestReconstructed?.checkpoint.channel_values).toEqual({\n            messages: [\"hi\"],\n            stepCount: 3,\n          });\n        });\n      });\n\n      it_skipForSomeModules(initializer.checkpointerName, {\n        \"@langchain/langgraph-checkpoint-mongodb\":\n          \"MongoDBSaver never stored pending sends\",\n      })(\"should migrate pending sends\", async () => {\n        let config: RunnableConfig = {\n          configurable: { thread_id: \"thread-1\", checkpoint_ns: \"\" },\n        };\n\n        const checkpoint0: Checkpoint = {\n          v: 1,\n          id: uuid6(0),\n          ts: \"2024-04-19T17:19:07.952Z\",\n          channel_values: {},\n          channel_versions: {},\n          versions_seen: {},\n        };\n\n        config = await checkpointer.put(\n          config,\n          checkpoint0,\n          { source: \"loop\", parents: {}, step: 0 },\n          {}\n        );\n\n        await checkpointer.putWrites(\n          config,\n          [\n            [TASKS, \"send-1\"],\n            [TASKS, \"send-2\"],\n          ],\n          \"task-1\"\n        );\n        await checkpointer.putWrites(config, [[TASKS, \"send-3\"]], \"task-2\");\n\n        // check that fetching checkpount 0 doesn't attach pending sends\n        // (they should be attached to the next checkpoint)\n        const tuple0 = await checkpointer.getTuple(config);\n        expect(tuple0?.checkpoint.channel_values).toEqual({});\n        expect(tuple0?.checkpoint.channel_versions).toEqual({});\n\n        // create second checkpoint\n        const checkpoint1: Checkpoint = {\n          v: 1,\n          id: uuid6(1),\n          ts: \"2024-04-20T17:19:07.952Z\",\n          channel_values: {},\n          channel_versions: checkpoint0.channel_versions,\n          versions_seen: checkpoint0.versions_seen,\n        };\n        config = await checkpointer.put(\n          config,\n          checkpoint1,\n          { source: \"loop\", parents: {}, step: 1 },\n          {}\n        );\n\n        // check that pending sends are attached to checkpoint1\n        const checkpoint1Tuple = await checkpointer.getTuple(config);\n        expect(checkpoint1Tuple?.checkpoint.channel_values).toEqual({\n          [TASKS]: [\"send-1\", \"send-2\", \"send-3\"],\n        });\n        expect(\n          checkpoint1Tuple?.checkpoint.channel_versions[TASKS]\n        ).toBeDefined();\n      });\n    });\n  });\n}\n"],"mappings":"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"}