@langchain/langgraph-checkpoint 1.0.0 → 1.0.2

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 (93) hide show
  1. package/dist/base.cjs +4 -5
  2. package/dist/base.cjs.map +1 -1
  3. package/dist/base.d.cts +0 -1
  4. package/dist/base.d.cts.map +1 -1
  5. package/dist/base.d.ts +0 -1
  6. package/dist/base.d.ts.map +1 -1
  7. package/dist/base.js +1 -2
  8. package/dist/base.js.map +1 -1
  9. package/dist/cache/base.cjs +2 -3
  10. package/dist/cache/base.cjs.map +1 -1
  11. package/dist/cache/base.d.cts.map +1 -1
  12. package/dist/cache/base.d.ts.map +1 -1
  13. package/dist/cache/base.js +1 -2
  14. package/dist/cache/base.js.map +1 -1
  15. package/dist/cache/index.cjs +2 -2
  16. package/dist/cache/index.js +3 -4
  17. package/dist/cache/memory.cjs +7 -10
  18. package/dist/cache/memory.cjs.map +1 -1
  19. package/dist/cache/memory.d.cts.map +1 -1
  20. package/dist/cache/memory.d.ts.map +1 -1
  21. package/dist/cache/memory.js +6 -9
  22. package/dist/cache/memory.js.map +1 -1
  23. package/dist/id.cjs +2 -4
  24. package/dist/id.cjs.map +1 -1
  25. package/dist/id.d.cts +0 -4
  26. package/dist/id.d.cts.map +1 -1
  27. package/dist/id.d.ts +0 -4
  28. package/dist/id.d.ts.map +1 -1
  29. package/dist/id.js +1 -2
  30. package/dist/id.js.map +1 -1
  31. package/dist/index.cjs +12 -12
  32. package/dist/index.js +1 -2
  33. package/dist/memory.cjs +7 -10
  34. package/dist/memory.cjs.map +1 -1
  35. package/dist/memory.d.cts +0 -1
  36. package/dist/memory.d.cts.map +1 -1
  37. package/dist/memory.d.ts +0 -1
  38. package/dist/memory.d.ts.map +1 -1
  39. package/dist/memory.js +5 -8
  40. package/dist/memory.js.map +1 -1
  41. package/dist/serde/base.d.cts +0 -2
  42. package/dist/serde/base.d.cts.map +1 -1
  43. package/dist/serde/base.d.ts +0 -2
  44. package/dist/serde/base.d.ts.map +1 -1
  45. package/dist/serde/jsonplus.cjs +14 -16
  46. package/dist/serde/jsonplus.cjs.map +1 -1
  47. package/dist/serde/jsonplus.js +11 -12
  48. package/dist/serde/jsonplus.js.map +1 -1
  49. package/dist/serde/types.cjs +1 -2
  50. package/dist/serde/types.cjs.map +1 -1
  51. package/dist/serde/types.d.cts +0 -3
  52. package/dist/serde/types.d.cts.map +1 -1
  53. package/dist/serde/types.d.ts +0 -3
  54. package/dist/serde/types.d.ts.map +1 -1
  55. package/dist/serde/types.js +1 -1
  56. package/dist/serde/types.js.map +1 -1
  57. package/dist/serde/utils/fast-safe-stringify/index.cjs +1 -2
  58. package/dist/serde/utils/fast-safe-stringify/index.cjs.map +1 -1
  59. package/dist/serde/utils/fast-safe-stringify/index.js +1 -1
  60. package/dist/serde/utils/fast-safe-stringify/index.js.map +1 -1
  61. package/dist/store/base.cjs +1 -2
  62. package/dist/store/base.cjs.map +1 -1
  63. package/dist/store/base.d.cts +0 -1
  64. package/dist/store/base.d.cts.map +1 -1
  65. package/dist/store/base.d.ts +0 -1
  66. package/dist/store/base.d.ts.map +1 -1
  67. package/dist/store/base.js +1 -1
  68. package/dist/store/base.js.map +1 -1
  69. package/dist/store/batch.cjs +3 -5
  70. package/dist/store/batch.cjs.map +1 -1
  71. package/dist/store/batch.d.cts +0 -3
  72. package/dist/store/batch.d.cts.map +1 -1
  73. package/dist/store/batch.d.ts +0 -3
  74. package/dist/store/batch.d.ts.map +1 -1
  75. package/dist/store/batch.js +2 -4
  76. package/dist/store/batch.js.map +1 -1
  77. package/dist/store/memory.cjs +8 -14
  78. package/dist/store/memory.cjs.map +1 -1
  79. package/dist/store/memory.d.cts +0 -2
  80. package/dist/store/memory.d.cts.map +1 -1
  81. package/dist/store/memory.d.ts +0 -2
  82. package/dist/store/memory.d.ts.map +1 -1
  83. package/dist/store/memory.js +6 -12
  84. package/dist/store/memory.js.map +1 -1
  85. package/dist/store/utils.cjs +31 -35
  86. package/dist/store/utils.cjs.map +1 -1
  87. package/dist/store/utils.js +31 -34
  88. package/dist/store/utils.js.map +1 -1
  89. package/dist/types.d.cts.map +1 -1
  90. package/dist/types.d.ts.map +1 -1
  91. package/package.json +17 -29
  92. package/CHANGELOG.md +0 -25
  93. package/dist/_virtual/rolldown_runtime.cjs +0 -25
@@ -1,4 +1,3 @@
1
-
2
1
  //#region src/store/utils.ts
3
2
  /**
4
3
  * Tokenize a JSON path into parts.
@@ -66,23 +65,20 @@ function isFilterOperators(obj) {
66
65
  * Compare values for filtering, supporting operator-based comparisons.
67
66
  */
68
67
  function compareValues(itemValue, filterValue) {
69
- if (isFilterOperators(filterValue)) {
70
- const operators = Object.keys(filterValue).filter((k) => k.startsWith("$"));
71
- return operators.every((op) => {
72
- const value = filterValue[op];
73
- switch (op) {
74
- case "$eq": return itemValue === value;
75
- case "$ne": return itemValue !== value;
76
- case "$gt": return Number(itemValue) > Number(value);
77
- case "$gte": return Number(itemValue) >= Number(value);
78
- case "$lt": return Number(itemValue) < Number(value);
79
- case "$lte": return Number(itemValue) <= Number(value);
80
- case "$in": return Array.isArray(value) ? value.includes(itemValue) : false;
81
- case "$nin": return Array.isArray(value) ? !value.includes(itemValue) : true;
82
- default: return false;
83
- }
84
- });
85
- }
68
+ if (isFilterOperators(filterValue)) return Object.keys(filterValue).filter((k) => k.startsWith("$")).every((op) => {
69
+ const value = filterValue[op];
70
+ switch (op) {
71
+ case "$eq": return itemValue === value;
72
+ case "$ne": return itemValue !== value;
73
+ case "$gt": return Number(itemValue) > Number(value);
74
+ case "$gte": return Number(itemValue) >= Number(value);
75
+ case "$lt": return Number(itemValue) < Number(value);
76
+ case "$lte": return Number(itemValue) <= Number(value);
77
+ case "$in": return Array.isArray(value) ? value.includes(itemValue) : false;
78
+ case "$nin": return Array.isArray(value) ? !value.includes(itemValue) : true;
79
+ default: return false;
80
+ }
81
+ });
86
82
  return itemValue === filterValue;
87
83
  }
88
84
  /**
@@ -98,34 +94,34 @@ function compareValues(itemValue, filterValue) {
98
94
  function getTextAtPath(obj, path) {
99
95
  if (!path || path === "$") return [JSON.stringify(obj, null, 2)];
100
96
  const tokens = Array.isArray(path) ? path : tokenizePath(path);
101
- function extractFromObj(obj$1, tokens$1, pos) {
102
- if (pos >= tokens$1.length) {
103
- if (typeof obj$1 === "string" || typeof obj$1 === "number" || typeof obj$1 === "boolean") return [String(obj$1)];
104
- if (obj$1 === null || obj$1 === void 0) return [];
105
- if (Array.isArray(obj$1) || typeof obj$1 === "object") return [JSON.stringify(obj$1, null, 2)];
97
+ function extractFromObj(obj, tokens, pos) {
98
+ if (pos >= tokens.length) {
99
+ if (typeof obj === "string" || typeof obj === "number" || typeof obj === "boolean") return [String(obj)];
100
+ if (obj === null || obj === void 0) return [];
101
+ if (Array.isArray(obj) || typeof obj === "object") return [JSON.stringify(obj, null, 2)];
106
102
  return [];
107
103
  }
108
- const token = tokens$1[pos];
104
+ const token = tokens[pos];
109
105
  const results = [];
110
- if (pos === 0 && token === "$") results.push(JSON.stringify(obj$1, null, 2));
106
+ if (pos === 0 && token === "$") results.push(JSON.stringify(obj, null, 2));
111
107
  if (token.startsWith("[") && token.endsWith("]")) {
112
- if (!Array.isArray(obj$1)) return [];
108
+ if (!Array.isArray(obj)) return [];
113
109
  const index = token.slice(1, -1);
114
- if (index === "*") for (const item of obj$1) results.push(...extractFromObj(item, tokens$1, pos + 1));
110
+ if (index === "*") for (const item of obj) results.push(...extractFromObj(item, tokens, pos + 1));
115
111
  else try {
116
112
  let idx = parseInt(index, 10);
117
- if (idx < 0) idx = obj$1.length + idx;
118
- if (idx >= 0 && idx < obj$1.length) results.push(...extractFromObj(obj$1[idx], tokens$1, pos + 1));
113
+ if (idx < 0) idx = obj.length + idx;
114
+ if (idx >= 0 && idx < obj.length) results.push(...extractFromObj(obj[idx], tokens, pos + 1));
119
115
  } catch {
120
116
  return [];
121
117
  }
122
118
  } else if (token.startsWith("{") && token.endsWith("}")) {
123
- if (typeof obj$1 !== "object" || obj$1 === null) return [];
119
+ if (typeof obj !== "object" || obj === null) return [];
124
120
  const fields = token.slice(1, -1).split(",").map((f) => f.trim());
125
121
  for (const field of fields) {
126
122
  const nestedTokens = tokenizePath(field);
127
123
  if (nestedTokens.length) {
128
- let currentObj = obj$1;
124
+ let currentObj = obj;
129
125
  for (const nestedToken of nestedTokens) if (currentObj && typeof currentObj === "object" && nestedToken in currentObj) currentObj = currentObj[nestedToken];
130
126
  else {
131
127
  currentObj = void 0;
@@ -138,16 +134,16 @@ function getTextAtPath(obj, path) {
138
134
  }
139
135
  }
140
136
  } else if (token === "*") {
141
- if (Array.isArray(obj$1)) for (const item of obj$1) results.push(...extractFromObj(item, tokens$1, pos + 1));
142
- else if (typeof obj$1 === "object" && obj$1 !== null) for (const value of Object.values(obj$1)) results.push(...extractFromObj(value, tokens$1, pos + 1));
143
- } else if (typeof obj$1 === "object" && obj$1 !== null && token in obj$1) results.push(...extractFromObj(obj$1[token], tokens$1, pos + 1));
137
+ if (Array.isArray(obj)) for (const item of obj) results.push(...extractFromObj(item, tokens, pos + 1));
138
+ else if (typeof obj === "object" && obj !== null) for (const value of Object.values(obj)) results.push(...extractFromObj(value, tokens, pos + 1));
139
+ } else if (typeof obj === "object" && obj !== null && token in obj) results.push(...extractFromObj(obj[token], tokens, pos + 1));
144
140
  return results;
145
141
  }
146
142
  return extractFromObj(obj, tokens, 0);
147
143
  }
148
-
149
144
  //#endregion
150
145
  exports.compareValues = compareValues;
151
146
  exports.getTextAtPath = getTextAtPath;
152
147
  exports.tokenizePath = tokenizePath;
148
+
153
149
  //# sourceMappingURL=utils.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.cjs","names":["tokens: string[]","current: string[]","tokens","obj","results: string[]"],"sources":["../../src/store/utils.ts"],"sourcesContent":["/**\n * Tokenize a JSON path into parts.\n * @example\n * tokenizePath(\"metadata.title\") // -> [\"metadata\", \"title\"]\n * tokenizePath(\"chapters[*].content\") // -> [\"chapters[*]\", \"content\"]\n */\nexport function tokenizePath(path: string): string[] {\n if (!path) {\n return [];\n }\n\n const tokens: string[] = [];\n let current: string[] = [];\n let i = 0;\n\n while (i < path.length) {\n const char = path[i];\n\n if (char === \"[\") {\n // Handle array index\n if (current.length) {\n tokens.push(current.join(\"\"));\n current = [];\n }\n let bracketCount = 1;\n const indexChars = [\"[\"];\n i += 1;\n while (i < path.length && bracketCount > 0) {\n if (path[i] === \"[\") {\n bracketCount += 1;\n } else if (path[i] === \"]\") {\n bracketCount -= 1;\n }\n indexChars.push(path[i]);\n i += 1;\n }\n tokens.push(indexChars.join(\"\"));\n continue;\n } else if (char === \"{\") {\n // Handle multi-field selection\n if (current.length) {\n tokens.push(current.join(\"\"));\n current = [];\n }\n let braceCount = 1;\n const fieldChars = [\"{\"];\n i += 1;\n while (i < path.length && braceCount > 0) {\n if (path[i] === \"{\") {\n braceCount += 1;\n } else if (path[i] === \"}\") {\n braceCount -= 1;\n }\n fieldChars.push(path[i]);\n i += 1;\n }\n tokens.push(fieldChars.join(\"\"));\n continue;\n } else if (char === \".\") {\n // Handle regular field\n if (current.length) {\n tokens.push(current.join(\"\"));\n current = [];\n }\n } else {\n current.push(char);\n }\n i += 1;\n }\n\n if (current.length) {\n tokens.push(current.join(\"\"));\n }\n\n return tokens;\n}\n\n/**\n * Represents the supported filter operators\n */\ntype FilterOperators = {\n $eq?: unknown;\n $ne?: unknown;\n $gt?: unknown;\n $gte?: unknown;\n $lt?: unknown;\n $lte?: unknown;\n $in?: unknown[];\n $nin?: unknown[];\n};\n\n/**\n * Type guard to check if an object is a FilterOperators\n */\nfunction isFilterOperators(obj: unknown): obj is FilterOperators {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n Object.keys(obj).every(\n (key) =>\n key === \"$eq\" ||\n key === \"$ne\" ||\n key === \"$gt\" ||\n key === \"$gte\" ||\n key === \"$lt\" ||\n key === \"$lte\" ||\n key === \"$in\" ||\n key === \"$nin\"\n )\n );\n}\n\n/**\n * Compare values for filtering, supporting operator-based comparisons.\n */\nexport function compareValues(\n itemValue: unknown,\n filterValue: unknown\n): boolean {\n if (isFilterOperators(filterValue)) {\n const operators = Object.keys(filterValue).filter((k) => k.startsWith(\"$\"));\n return operators.every((op) => {\n const value = filterValue[op as keyof FilterOperators];\n switch (op) {\n case \"$eq\":\n return itemValue === value;\n case \"$ne\":\n return itemValue !== value;\n case \"$gt\":\n return Number(itemValue) > Number(value);\n case \"$gte\":\n return Number(itemValue) >= Number(value);\n case \"$lt\":\n return Number(itemValue) < Number(value);\n case \"$lte\":\n return Number(itemValue) <= Number(value);\n case \"$in\":\n return Array.isArray(value) ? value.includes(itemValue) : false;\n case \"$nin\":\n return Array.isArray(value) ? !value.includes(itemValue) : true;\n default:\n return false;\n }\n });\n }\n\n // If no operators, do a direct comparison\n return itemValue === filterValue;\n}\n\n/**\n * Extract text from a value at a specific JSON path.\n *\n * Supports:\n * - Simple paths: \"field1.field2\"\n * - Array indexing: \"[0]\", \"[*]\", \"[-1]\"\n * - Wildcards: \"*\"\n * - Multi-field selection: \"{field1,field2}\"\n * - Nested paths in multi-field: \"{field1,nested.field2}\"\n */\nexport function getTextAtPath(obj: unknown, path: string[] | string): string[] {\n if (!path || path === \"$\") {\n return [JSON.stringify(obj, null, 2)];\n }\n const tokens = Array.isArray(path) ? path : tokenizePath(path);\n\n function extractFromObj(\n obj: unknown,\n tokens: string[],\n pos: number\n ): string[] {\n if (pos >= tokens.length) {\n if (\n typeof obj === \"string\" ||\n typeof obj === \"number\" ||\n typeof obj === \"boolean\"\n ) {\n return [String(obj)];\n }\n if (obj === null || obj === undefined) {\n return [];\n }\n if (Array.isArray(obj) || typeof obj === \"object\") {\n return [JSON.stringify(obj, null, 2)];\n }\n return [];\n }\n\n const token = tokens[pos];\n const results: string[] = [];\n if (pos === 0 && token === \"$\") {\n results.push(JSON.stringify(obj, null, 2));\n }\n\n if (token.startsWith(\"[\") && token.endsWith(\"]\")) {\n if (!Array.isArray(obj)) return [];\n\n const index = token.slice(1, -1);\n if (index === \"*\") {\n for (const item of obj) {\n results.push(...extractFromObj(item, tokens, pos + 1));\n }\n } else {\n try {\n let idx = parseInt(index, 10);\n if (idx < 0) {\n idx = obj.length + idx;\n }\n if (idx >= 0 && idx < obj.length) {\n results.push(...extractFromObj(obj[idx], tokens, pos + 1));\n }\n } catch {\n return [];\n }\n }\n } else if (token.startsWith(\"{\") && token.endsWith(\"}\")) {\n if (typeof obj !== \"object\" || obj === null) return [];\n\n const fields = token\n .slice(1, -1)\n .split(\",\")\n .map((f) => f.trim());\n for (const field of fields) {\n const nestedTokens = tokenizePath(field);\n if (nestedTokens.length) {\n let currentObj = obj as Record<string, unknown> | undefined;\n for (const nestedToken of nestedTokens) {\n if (\n currentObj &&\n typeof currentObj === \"object\" &&\n nestedToken in currentObj\n ) {\n currentObj = currentObj[nestedToken] as Record<string, unknown>;\n } else {\n currentObj = undefined;\n break;\n }\n }\n if (currentObj !== undefined) {\n if (\n typeof currentObj === \"string\" ||\n typeof currentObj === \"number\" ||\n typeof currentObj === \"boolean\"\n ) {\n results.push(String(currentObj));\n } else if (\n Array.isArray(currentObj) ||\n typeof currentObj === \"object\"\n ) {\n results.push(JSON.stringify(currentObj, null, 2));\n }\n }\n }\n }\n } else if (token === \"*\") {\n if (Array.isArray(obj)) {\n for (const item of obj) {\n results.push(...extractFromObj(item, tokens, pos + 1));\n }\n } else if (typeof obj === \"object\" && obj !== null) {\n for (const value of Object.values(obj)) {\n results.push(...extractFromObj(value, tokens, pos + 1));\n }\n }\n } else {\n if (typeof obj === \"object\" && obj !== null && token in obj) {\n results.push(\n ...extractFromObj(\n (obj as Record<string, unknown>)[token],\n tokens,\n pos + 1\n )\n );\n }\n }\n\n return results;\n }\n\n return extractFromObj(obj, tokens, 0);\n}\n\n/**\n * Calculate cosine similarity between two vectors.\n */\nexport function cosineSimilarity(vector1: number[], vector2: number[]): number {\n if (vector1.length !== vector2.length) {\n throw new Error(\"Vectors must have the same length\");\n }\n\n const dotProduct = vector1.reduce((acc, val, i) => acc + val * vector2[i], 0);\n const magnitude1 = Math.sqrt(\n vector1.reduce((acc, val) => acc + val * val, 0)\n );\n const magnitude2 = Math.sqrt(\n vector2.reduce((acc, val) => acc + val * val, 0)\n );\n\n if (magnitude1 === 0 || magnitude2 === 0) return 0;\n return dotProduct / (magnitude1 * magnitude2);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"utils.cjs","names":[],"sources":["../../src/store/utils.ts"],"sourcesContent":["/**\n * Tokenize a JSON path into parts.\n * @example\n * tokenizePath(\"metadata.title\") // -> [\"metadata\", \"title\"]\n * tokenizePath(\"chapters[*].content\") // -> [\"chapters[*]\", \"content\"]\n */\nexport function tokenizePath(path: string): string[] {\n if (!path) {\n return [];\n }\n\n const tokens: string[] = [];\n let current: string[] = [];\n let i = 0;\n\n while (i < path.length) {\n const char = path[i];\n\n if (char === \"[\") {\n // Handle array index\n if (current.length) {\n tokens.push(current.join(\"\"));\n current = [];\n }\n let bracketCount = 1;\n const indexChars = [\"[\"];\n i += 1;\n while (i < path.length && bracketCount > 0) {\n if (path[i] === \"[\") {\n bracketCount += 1;\n } else if (path[i] === \"]\") {\n bracketCount -= 1;\n }\n indexChars.push(path[i]);\n i += 1;\n }\n tokens.push(indexChars.join(\"\"));\n continue;\n } else if (char === \"{\") {\n // Handle multi-field selection\n if (current.length) {\n tokens.push(current.join(\"\"));\n current = [];\n }\n let braceCount = 1;\n const fieldChars = [\"{\"];\n i += 1;\n while (i < path.length && braceCount > 0) {\n if (path[i] === \"{\") {\n braceCount += 1;\n } else if (path[i] === \"}\") {\n braceCount -= 1;\n }\n fieldChars.push(path[i]);\n i += 1;\n }\n tokens.push(fieldChars.join(\"\"));\n continue;\n } else if (char === \".\") {\n // Handle regular field\n if (current.length) {\n tokens.push(current.join(\"\"));\n current = [];\n }\n } else {\n current.push(char);\n }\n i += 1;\n }\n\n if (current.length) {\n tokens.push(current.join(\"\"));\n }\n\n return tokens;\n}\n\n/**\n * Represents the supported filter operators\n */\ntype FilterOperators = {\n $eq?: unknown;\n $ne?: unknown;\n $gt?: unknown;\n $gte?: unknown;\n $lt?: unknown;\n $lte?: unknown;\n $in?: unknown[];\n $nin?: unknown[];\n};\n\n/**\n * Type guard to check if an object is a FilterOperators\n */\nfunction isFilterOperators(obj: unknown): obj is FilterOperators {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n Object.keys(obj).every(\n (key) =>\n key === \"$eq\" ||\n key === \"$ne\" ||\n key === \"$gt\" ||\n key === \"$gte\" ||\n key === \"$lt\" ||\n key === \"$lte\" ||\n key === \"$in\" ||\n key === \"$nin\"\n )\n );\n}\n\n/**\n * Compare values for filtering, supporting operator-based comparisons.\n */\nexport function compareValues(\n itemValue: unknown,\n filterValue: unknown\n): boolean {\n if (isFilterOperators(filterValue)) {\n const operators = Object.keys(filterValue).filter((k) => k.startsWith(\"$\"));\n return operators.every((op) => {\n const value = filterValue[op as keyof FilterOperators];\n switch (op) {\n case \"$eq\":\n return itemValue === value;\n case \"$ne\":\n return itemValue !== value;\n case \"$gt\":\n return Number(itemValue) > Number(value);\n case \"$gte\":\n return Number(itemValue) >= Number(value);\n case \"$lt\":\n return Number(itemValue) < Number(value);\n case \"$lte\":\n return Number(itemValue) <= Number(value);\n case \"$in\":\n return Array.isArray(value) ? value.includes(itemValue) : false;\n case \"$nin\":\n return Array.isArray(value) ? !value.includes(itemValue) : true;\n default:\n return false;\n }\n });\n }\n\n // If no operators, do a direct comparison\n return itemValue === filterValue;\n}\n\n/**\n * Extract text from a value at a specific JSON path.\n *\n * Supports:\n * - Simple paths: \"field1.field2\"\n * - Array indexing: \"[0]\", \"[*]\", \"[-1]\"\n * - Wildcards: \"*\"\n * - Multi-field selection: \"{field1,field2}\"\n * - Nested paths in multi-field: \"{field1,nested.field2}\"\n */\nexport function getTextAtPath(obj: unknown, path: string[] | string): string[] {\n if (!path || path === \"$\") {\n return [JSON.stringify(obj, null, 2)];\n }\n const tokens = Array.isArray(path) ? path : tokenizePath(path);\n\n function extractFromObj(\n obj: unknown,\n tokens: string[],\n pos: number\n ): string[] {\n if (pos >= tokens.length) {\n if (\n typeof obj === \"string\" ||\n typeof obj === \"number\" ||\n typeof obj === \"boolean\"\n ) {\n return [String(obj)];\n }\n if (obj === null || obj === undefined) {\n return [];\n }\n if (Array.isArray(obj) || typeof obj === \"object\") {\n return [JSON.stringify(obj, null, 2)];\n }\n return [];\n }\n\n const token = tokens[pos];\n const results: string[] = [];\n if (pos === 0 && token === \"$\") {\n results.push(JSON.stringify(obj, null, 2));\n }\n\n if (token.startsWith(\"[\") && token.endsWith(\"]\")) {\n if (!Array.isArray(obj)) return [];\n\n const index = token.slice(1, -1);\n if (index === \"*\") {\n for (const item of obj) {\n results.push(...extractFromObj(item, tokens, pos + 1));\n }\n } else {\n try {\n let idx = parseInt(index, 10);\n if (idx < 0) {\n idx = obj.length + idx;\n }\n if (idx >= 0 && idx < obj.length) {\n results.push(...extractFromObj(obj[idx], tokens, pos + 1));\n }\n } catch {\n return [];\n }\n }\n } else if (token.startsWith(\"{\") && token.endsWith(\"}\")) {\n if (typeof obj !== \"object\" || obj === null) return [];\n\n const fields = token\n .slice(1, -1)\n .split(\",\")\n .map((f) => f.trim());\n for (const field of fields) {\n const nestedTokens = tokenizePath(field);\n if (nestedTokens.length) {\n let currentObj = obj as Record<string, unknown> | undefined;\n for (const nestedToken of nestedTokens) {\n if (\n currentObj &&\n typeof currentObj === \"object\" &&\n nestedToken in currentObj\n ) {\n currentObj = currentObj[nestedToken] as Record<string, unknown>;\n } else {\n currentObj = undefined;\n break;\n }\n }\n if (currentObj !== undefined) {\n if (\n typeof currentObj === \"string\" ||\n typeof currentObj === \"number\" ||\n typeof currentObj === \"boolean\"\n ) {\n results.push(String(currentObj));\n } else if (\n Array.isArray(currentObj) ||\n typeof currentObj === \"object\"\n ) {\n results.push(JSON.stringify(currentObj, null, 2));\n }\n }\n }\n }\n } else if (token === \"*\") {\n if (Array.isArray(obj)) {\n for (const item of obj) {\n results.push(...extractFromObj(item, tokens, pos + 1));\n }\n } else if (typeof obj === \"object\" && obj !== null) {\n for (const value of Object.values(obj)) {\n results.push(...extractFromObj(value, tokens, pos + 1));\n }\n }\n } else {\n if (typeof obj === \"object\" && obj !== null && token in obj) {\n results.push(\n ...extractFromObj(\n (obj as Record<string, unknown>)[token],\n tokens,\n pos + 1\n )\n );\n }\n }\n\n return results;\n }\n\n return extractFromObj(obj, tokens, 0);\n}\n\n/**\n * Calculate cosine similarity between two vectors.\n */\nexport function cosineSimilarity(vector1: number[], vector2: number[]): number {\n if (vector1.length !== vector2.length) {\n throw new Error(\"Vectors must have the same length\");\n }\n\n const dotProduct = vector1.reduce((acc, val, i) => acc + val * vector2[i], 0);\n const magnitude1 = Math.sqrt(\n vector1.reduce((acc, val) => acc + val * val, 0)\n );\n const magnitude2 = Math.sqrt(\n vector2.reduce((acc, val) => acc + val * val, 0)\n );\n\n if (magnitude1 === 0 || magnitude2 === 0) return 0;\n return dotProduct / (magnitude1 * magnitude2);\n}\n"],"mappings":"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"}
@@ -65,23 +65,20 @@ function isFilterOperators(obj) {
65
65
  * Compare values for filtering, supporting operator-based comparisons.
66
66
  */
67
67
  function compareValues(itemValue, filterValue) {
68
- if (isFilterOperators(filterValue)) {
69
- const operators = Object.keys(filterValue).filter((k) => k.startsWith("$"));
70
- return operators.every((op) => {
71
- const value = filterValue[op];
72
- switch (op) {
73
- case "$eq": return itemValue === value;
74
- case "$ne": return itemValue !== value;
75
- case "$gt": return Number(itemValue) > Number(value);
76
- case "$gte": return Number(itemValue) >= Number(value);
77
- case "$lt": return Number(itemValue) < Number(value);
78
- case "$lte": return Number(itemValue) <= Number(value);
79
- case "$in": return Array.isArray(value) ? value.includes(itemValue) : false;
80
- case "$nin": return Array.isArray(value) ? !value.includes(itemValue) : true;
81
- default: return false;
82
- }
83
- });
84
- }
68
+ if (isFilterOperators(filterValue)) return Object.keys(filterValue).filter((k) => k.startsWith("$")).every((op) => {
69
+ const value = filterValue[op];
70
+ switch (op) {
71
+ case "$eq": return itemValue === value;
72
+ case "$ne": return itemValue !== value;
73
+ case "$gt": return Number(itemValue) > Number(value);
74
+ case "$gte": return Number(itemValue) >= Number(value);
75
+ case "$lt": return Number(itemValue) < Number(value);
76
+ case "$lte": return Number(itemValue) <= Number(value);
77
+ case "$in": return Array.isArray(value) ? value.includes(itemValue) : false;
78
+ case "$nin": return Array.isArray(value) ? !value.includes(itemValue) : true;
79
+ default: return false;
80
+ }
81
+ });
85
82
  return itemValue === filterValue;
86
83
  }
87
84
  /**
@@ -97,34 +94,34 @@ function compareValues(itemValue, filterValue) {
97
94
  function getTextAtPath(obj, path) {
98
95
  if (!path || path === "$") return [JSON.stringify(obj, null, 2)];
99
96
  const tokens = Array.isArray(path) ? path : tokenizePath(path);
100
- function extractFromObj(obj$1, tokens$1, pos) {
101
- if (pos >= tokens$1.length) {
102
- if (typeof obj$1 === "string" || typeof obj$1 === "number" || typeof obj$1 === "boolean") return [String(obj$1)];
103
- if (obj$1 === null || obj$1 === void 0) return [];
104
- if (Array.isArray(obj$1) || typeof obj$1 === "object") return [JSON.stringify(obj$1, null, 2)];
97
+ function extractFromObj(obj, tokens, pos) {
98
+ if (pos >= tokens.length) {
99
+ if (typeof obj === "string" || typeof obj === "number" || typeof obj === "boolean") return [String(obj)];
100
+ if (obj === null || obj === void 0) return [];
101
+ if (Array.isArray(obj) || typeof obj === "object") return [JSON.stringify(obj, null, 2)];
105
102
  return [];
106
103
  }
107
- const token = tokens$1[pos];
104
+ const token = tokens[pos];
108
105
  const results = [];
109
- if (pos === 0 && token === "$") results.push(JSON.stringify(obj$1, null, 2));
106
+ if (pos === 0 && token === "$") results.push(JSON.stringify(obj, null, 2));
110
107
  if (token.startsWith("[") && token.endsWith("]")) {
111
- if (!Array.isArray(obj$1)) return [];
108
+ if (!Array.isArray(obj)) return [];
112
109
  const index = token.slice(1, -1);
113
- if (index === "*") for (const item of obj$1) results.push(...extractFromObj(item, tokens$1, pos + 1));
110
+ if (index === "*") for (const item of obj) results.push(...extractFromObj(item, tokens, pos + 1));
114
111
  else try {
115
112
  let idx = parseInt(index, 10);
116
- if (idx < 0) idx = obj$1.length + idx;
117
- if (idx >= 0 && idx < obj$1.length) results.push(...extractFromObj(obj$1[idx], tokens$1, pos + 1));
113
+ if (idx < 0) idx = obj.length + idx;
114
+ if (idx >= 0 && idx < obj.length) results.push(...extractFromObj(obj[idx], tokens, pos + 1));
118
115
  } catch {
119
116
  return [];
120
117
  }
121
118
  } else if (token.startsWith("{") && token.endsWith("}")) {
122
- if (typeof obj$1 !== "object" || obj$1 === null) return [];
119
+ if (typeof obj !== "object" || obj === null) return [];
123
120
  const fields = token.slice(1, -1).split(",").map((f) => f.trim());
124
121
  for (const field of fields) {
125
122
  const nestedTokens = tokenizePath(field);
126
123
  if (nestedTokens.length) {
127
- let currentObj = obj$1;
124
+ let currentObj = obj;
128
125
  for (const nestedToken of nestedTokens) if (currentObj && typeof currentObj === "object" && nestedToken in currentObj) currentObj = currentObj[nestedToken];
129
126
  else {
130
127
  currentObj = void 0;
@@ -137,14 +134,14 @@ function getTextAtPath(obj, path) {
137
134
  }
138
135
  }
139
136
  } else if (token === "*") {
140
- if (Array.isArray(obj$1)) for (const item of obj$1) results.push(...extractFromObj(item, tokens$1, pos + 1));
141
- else if (typeof obj$1 === "object" && obj$1 !== null) for (const value of Object.values(obj$1)) results.push(...extractFromObj(value, tokens$1, pos + 1));
142
- } else if (typeof obj$1 === "object" && obj$1 !== null && token in obj$1) results.push(...extractFromObj(obj$1[token], tokens$1, pos + 1));
137
+ if (Array.isArray(obj)) for (const item of obj) results.push(...extractFromObj(item, tokens, pos + 1));
138
+ else if (typeof obj === "object" && obj !== null) for (const value of Object.values(obj)) results.push(...extractFromObj(value, tokens, pos + 1));
139
+ } else if (typeof obj === "object" && obj !== null && token in obj) results.push(...extractFromObj(obj[token], tokens, pos + 1));
143
140
  return results;
144
141
  }
145
142
  return extractFromObj(obj, tokens, 0);
146
143
  }
147
-
148
144
  //#endregion
149
145
  export { compareValues, getTextAtPath, tokenizePath };
146
+
150
147
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":["tokens: string[]","current: string[]","tokens","obj","results: string[]"],"sources":["../../src/store/utils.ts"],"sourcesContent":["/**\n * Tokenize a JSON path into parts.\n * @example\n * tokenizePath(\"metadata.title\") // -> [\"metadata\", \"title\"]\n * tokenizePath(\"chapters[*].content\") // -> [\"chapters[*]\", \"content\"]\n */\nexport function tokenizePath(path: string): string[] {\n if (!path) {\n return [];\n }\n\n const tokens: string[] = [];\n let current: string[] = [];\n let i = 0;\n\n while (i < path.length) {\n const char = path[i];\n\n if (char === \"[\") {\n // Handle array index\n if (current.length) {\n tokens.push(current.join(\"\"));\n current = [];\n }\n let bracketCount = 1;\n const indexChars = [\"[\"];\n i += 1;\n while (i < path.length && bracketCount > 0) {\n if (path[i] === \"[\") {\n bracketCount += 1;\n } else if (path[i] === \"]\") {\n bracketCount -= 1;\n }\n indexChars.push(path[i]);\n i += 1;\n }\n tokens.push(indexChars.join(\"\"));\n continue;\n } else if (char === \"{\") {\n // Handle multi-field selection\n if (current.length) {\n tokens.push(current.join(\"\"));\n current = [];\n }\n let braceCount = 1;\n const fieldChars = [\"{\"];\n i += 1;\n while (i < path.length && braceCount > 0) {\n if (path[i] === \"{\") {\n braceCount += 1;\n } else if (path[i] === \"}\") {\n braceCount -= 1;\n }\n fieldChars.push(path[i]);\n i += 1;\n }\n tokens.push(fieldChars.join(\"\"));\n continue;\n } else if (char === \".\") {\n // Handle regular field\n if (current.length) {\n tokens.push(current.join(\"\"));\n current = [];\n }\n } else {\n current.push(char);\n }\n i += 1;\n }\n\n if (current.length) {\n tokens.push(current.join(\"\"));\n }\n\n return tokens;\n}\n\n/**\n * Represents the supported filter operators\n */\ntype FilterOperators = {\n $eq?: unknown;\n $ne?: unknown;\n $gt?: unknown;\n $gte?: unknown;\n $lt?: unknown;\n $lte?: unknown;\n $in?: unknown[];\n $nin?: unknown[];\n};\n\n/**\n * Type guard to check if an object is a FilterOperators\n */\nfunction isFilterOperators(obj: unknown): obj is FilterOperators {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n Object.keys(obj).every(\n (key) =>\n key === \"$eq\" ||\n key === \"$ne\" ||\n key === \"$gt\" ||\n key === \"$gte\" ||\n key === \"$lt\" ||\n key === \"$lte\" ||\n key === \"$in\" ||\n key === \"$nin\"\n )\n );\n}\n\n/**\n * Compare values for filtering, supporting operator-based comparisons.\n */\nexport function compareValues(\n itemValue: unknown,\n filterValue: unknown\n): boolean {\n if (isFilterOperators(filterValue)) {\n const operators = Object.keys(filterValue).filter((k) => k.startsWith(\"$\"));\n return operators.every((op) => {\n const value = filterValue[op as keyof FilterOperators];\n switch (op) {\n case \"$eq\":\n return itemValue === value;\n case \"$ne\":\n return itemValue !== value;\n case \"$gt\":\n return Number(itemValue) > Number(value);\n case \"$gte\":\n return Number(itemValue) >= Number(value);\n case \"$lt\":\n return Number(itemValue) < Number(value);\n case \"$lte\":\n return Number(itemValue) <= Number(value);\n case \"$in\":\n return Array.isArray(value) ? value.includes(itemValue) : false;\n case \"$nin\":\n return Array.isArray(value) ? !value.includes(itemValue) : true;\n default:\n return false;\n }\n });\n }\n\n // If no operators, do a direct comparison\n return itemValue === filterValue;\n}\n\n/**\n * Extract text from a value at a specific JSON path.\n *\n * Supports:\n * - Simple paths: \"field1.field2\"\n * - Array indexing: \"[0]\", \"[*]\", \"[-1]\"\n * - Wildcards: \"*\"\n * - Multi-field selection: \"{field1,field2}\"\n * - Nested paths in multi-field: \"{field1,nested.field2}\"\n */\nexport function getTextAtPath(obj: unknown, path: string[] | string): string[] {\n if (!path || path === \"$\") {\n return [JSON.stringify(obj, null, 2)];\n }\n const tokens = Array.isArray(path) ? path : tokenizePath(path);\n\n function extractFromObj(\n obj: unknown,\n tokens: string[],\n pos: number\n ): string[] {\n if (pos >= tokens.length) {\n if (\n typeof obj === \"string\" ||\n typeof obj === \"number\" ||\n typeof obj === \"boolean\"\n ) {\n return [String(obj)];\n }\n if (obj === null || obj === undefined) {\n return [];\n }\n if (Array.isArray(obj) || typeof obj === \"object\") {\n return [JSON.stringify(obj, null, 2)];\n }\n return [];\n }\n\n const token = tokens[pos];\n const results: string[] = [];\n if (pos === 0 && token === \"$\") {\n results.push(JSON.stringify(obj, null, 2));\n }\n\n if (token.startsWith(\"[\") && token.endsWith(\"]\")) {\n if (!Array.isArray(obj)) return [];\n\n const index = token.slice(1, -1);\n if (index === \"*\") {\n for (const item of obj) {\n results.push(...extractFromObj(item, tokens, pos + 1));\n }\n } else {\n try {\n let idx = parseInt(index, 10);\n if (idx < 0) {\n idx = obj.length + idx;\n }\n if (idx >= 0 && idx < obj.length) {\n results.push(...extractFromObj(obj[idx], tokens, pos + 1));\n }\n } catch {\n return [];\n }\n }\n } else if (token.startsWith(\"{\") && token.endsWith(\"}\")) {\n if (typeof obj !== \"object\" || obj === null) return [];\n\n const fields = token\n .slice(1, -1)\n .split(\",\")\n .map((f) => f.trim());\n for (const field of fields) {\n const nestedTokens = tokenizePath(field);\n if (nestedTokens.length) {\n let currentObj = obj as Record<string, unknown> | undefined;\n for (const nestedToken of nestedTokens) {\n if (\n currentObj &&\n typeof currentObj === \"object\" &&\n nestedToken in currentObj\n ) {\n currentObj = currentObj[nestedToken] as Record<string, unknown>;\n } else {\n currentObj = undefined;\n break;\n }\n }\n if (currentObj !== undefined) {\n if (\n typeof currentObj === \"string\" ||\n typeof currentObj === \"number\" ||\n typeof currentObj === \"boolean\"\n ) {\n results.push(String(currentObj));\n } else if (\n Array.isArray(currentObj) ||\n typeof currentObj === \"object\"\n ) {\n results.push(JSON.stringify(currentObj, null, 2));\n }\n }\n }\n }\n } else if (token === \"*\") {\n if (Array.isArray(obj)) {\n for (const item of obj) {\n results.push(...extractFromObj(item, tokens, pos + 1));\n }\n } else if (typeof obj === \"object\" && obj !== null) {\n for (const value of Object.values(obj)) {\n results.push(...extractFromObj(value, tokens, pos + 1));\n }\n }\n } else {\n if (typeof obj === \"object\" && obj !== null && token in obj) {\n results.push(\n ...extractFromObj(\n (obj as Record<string, unknown>)[token],\n tokens,\n pos + 1\n )\n );\n }\n }\n\n return results;\n }\n\n return extractFromObj(obj, tokens, 0);\n}\n\n/**\n * Calculate cosine similarity between two vectors.\n */\nexport function cosineSimilarity(vector1: number[], vector2: number[]): number {\n if (vector1.length !== vector2.length) {\n throw new Error(\"Vectors must have the same length\");\n }\n\n const dotProduct = vector1.reduce((acc, val, i) => acc + val * vector2[i], 0);\n const magnitude1 = Math.sqrt(\n vector1.reduce((acc, val) => acc + val * val, 0)\n );\n const magnitude2 = Math.sqrt(\n vector2.reduce((acc, val) => acc + val * val, 0)\n );\n\n if (magnitude1 === 0 || magnitude2 === 0) return 0;\n return dotProduct / (magnitude1 * magnitude2);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","names":[],"sources":["../../src/store/utils.ts"],"sourcesContent":["/**\n * Tokenize a JSON path into parts.\n * @example\n * tokenizePath(\"metadata.title\") // -> [\"metadata\", \"title\"]\n * tokenizePath(\"chapters[*].content\") // -> [\"chapters[*]\", \"content\"]\n */\nexport function tokenizePath(path: string): string[] {\n if (!path) {\n return [];\n }\n\n const tokens: string[] = [];\n let current: string[] = [];\n let i = 0;\n\n while (i < path.length) {\n const char = path[i];\n\n if (char === \"[\") {\n // Handle array index\n if (current.length) {\n tokens.push(current.join(\"\"));\n current = [];\n }\n let bracketCount = 1;\n const indexChars = [\"[\"];\n i += 1;\n while (i < path.length && bracketCount > 0) {\n if (path[i] === \"[\") {\n bracketCount += 1;\n } else if (path[i] === \"]\") {\n bracketCount -= 1;\n }\n indexChars.push(path[i]);\n i += 1;\n }\n tokens.push(indexChars.join(\"\"));\n continue;\n } else if (char === \"{\") {\n // Handle multi-field selection\n if (current.length) {\n tokens.push(current.join(\"\"));\n current = [];\n }\n let braceCount = 1;\n const fieldChars = [\"{\"];\n i += 1;\n while (i < path.length && braceCount > 0) {\n if (path[i] === \"{\") {\n braceCount += 1;\n } else if (path[i] === \"}\") {\n braceCount -= 1;\n }\n fieldChars.push(path[i]);\n i += 1;\n }\n tokens.push(fieldChars.join(\"\"));\n continue;\n } else if (char === \".\") {\n // Handle regular field\n if (current.length) {\n tokens.push(current.join(\"\"));\n current = [];\n }\n } else {\n current.push(char);\n }\n i += 1;\n }\n\n if (current.length) {\n tokens.push(current.join(\"\"));\n }\n\n return tokens;\n}\n\n/**\n * Represents the supported filter operators\n */\ntype FilterOperators = {\n $eq?: unknown;\n $ne?: unknown;\n $gt?: unknown;\n $gte?: unknown;\n $lt?: unknown;\n $lte?: unknown;\n $in?: unknown[];\n $nin?: unknown[];\n};\n\n/**\n * Type guard to check if an object is a FilterOperators\n */\nfunction isFilterOperators(obj: unknown): obj is FilterOperators {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n Object.keys(obj).every(\n (key) =>\n key === \"$eq\" ||\n key === \"$ne\" ||\n key === \"$gt\" ||\n key === \"$gte\" ||\n key === \"$lt\" ||\n key === \"$lte\" ||\n key === \"$in\" ||\n key === \"$nin\"\n )\n );\n}\n\n/**\n * Compare values for filtering, supporting operator-based comparisons.\n */\nexport function compareValues(\n itemValue: unknown,\n filterValue: unknown\n): boolean {\n if (isFilterOperators(filterValue)) {\n const operators = Object.keys(filterValue).filter((k) => k.startsWith(\"$\"));\n return operators.every((op) => {\n const value = filterValue[op as keyof FilterOperators];\n switch (op) {\n case \"$eq\":\n return itemValue === value;\n case \"$ne\":\n return itemValue !== value;\n case \"$gt\":\n return Number(itemValue) > Number(value);\n case \"$gte\":\n return Number(itemValue) >= Number(value);\n case \"$lt\":\n return Number(itemValue) < Number(value);\n case \"$lte\":\n return Number(itemValue) <= Number(value);\n case \"$in\":\n return Array.isArray(value) ? value.includes(itemValue) : false;\n case \"$nin\":\n return Array.isArray(value) ? !value.includes(itemValue) : true;\n default:\n return false;\n }\n });\n }\n\n // If no operators, do a direct comparison\n return itemValue === filterValue;\n}\n\n/**\n * Extract text from a value at a specific JSON path.\n *\n * Supports:\n * - Simple paths: \"field1.field2\"\n * - Array indexing: \"[0]\", \"[*]\", \"[-1]\"\n * - Wildcards: \"*\"\n * - Multi-field selection: \"{field1,field2}\"\n * - Nested paths in multi-field: \"{field1,nested.field2}\"\n */\nexport function getTextAtPath(obj: unknown, path: string[] | string): string[] {\n if (!path || path === \"$\") {\n return [JSON.stringify(obj, null, 2)];\n }\n const tokens = Array.isArray(path) ? path : tokenizePath(path);\n\n function extractFromObj(\n obj: unknown,\n tokens: string[],\n pos: number\n ): string[] {\n if (pos >= tokens.length) {\n if (\n typeof obj === \"string\" ||\n typeof obj === \"number\" ||\n typeof obj === \"boolean\"\n ) {\n return [String(obj)];\n }\n if (obj === null || obj === undefined) {\n return [];\n }\n if (Array.isArray(obj) || typeof obj === \"object\") {\n return [JSON.stringify(obj, null, 2)];\n }\n return [];\n }\n\n const token = tokens[pos];\n const results: string[] = [];\n if (pos === 0 && token === \"$\") {\n results.push(JSON.stringify(obj, null, 2));\n }\n\n if (token.startsWith(\"[\") && token.endsWith(\"]\")) {\n if (!Array.isArray(obj)) return [];\n\n const index = token.slice(1, -1);\n if (index === \"*\") {\n for (const item of obj) {\n results.push(...extractFromObj(item, tokens, pos + 1));\n }\n } else {\n try {\n let idx = parseInt(index, 10);\n if (idx < 0) {\n idx = obj.length + idx;\n }\n if (idx >= 0 && idx < obj.length) {\n results.push(...extractFromObj(obj[idx], tokens, pos + 1));\n }\n } catch {\n return [];\n }\n }\n } else if (token.startsWith(\"{\") && token.endsWith(\"}\")) {\n if (typeof obj !== \"object\" || obj === null) return [];\n\n const fields = token\n .slice(1, -1)\n .split(\",\")\n .map((f) => f.trim());\n for (const field of fields) {\n const nestedTokens = tokenizePath(field);\n if (nestedTokens.length) {\n let currentObj = obj as Record<string, unknown> | undefined;\n for (const nestedToken of nestedTokens) {\n if (\n currentObj &&\n typeof currentObj === \"object\" &&\n nestedToken in currentObj\n ) {\n currentObj = currentObj[nestedToken] as Record<string, unknown>;\n } else {\n currentObj = undefined;\n break;\n }\n }\n if (currentObj !== undefined) {\n if (\n typeof currentObj === \"string\" ||\n typeof currentObj === \"number\" ||\n typeof currentObj === \"boolean\"\n ) {\n results.push(String(currentObj));\n } else if (\n Array.isArray(currentObj) ||\n typeof currentObj === \"object\"\n ) {\n results.push(JSON.stringify(currentObj, null, 2));\n }\n }\n }\n }\n } else if (token === \"*\") {\n if (Array.isArray(obj)) {\n for (const item of obj) {\n results.push(...extractFromObj(item, tokens, pos + 1));\n }\n } else if (typeof obj === \"object\" && obj !== null) {\n for (const value of Object.values(obj)) {\n results.push(...extractFromObj(value, tokens, pos + 1));\n }\n }\n } else {\n if (typeof obj === \"object\" && obj !== null && token in obj) {\n results.push(\n ...extractFromObj(\n (obj as Record<string, unknown>)[token],\n tokens,\n pos + 1\n )\n );\n }\n }\n\n return results;\n }\n\n return extractFromObj(obj, tokens, 0);\n}\n\n/**\n * Calculate cosine similarity between two vectors.\n */\nexport function cosineSimilarity(vector1: number[], vector2: number[]): number {\n if (vector1.length !== vector2.length) {\n throw new Error(\"Vectors must have the same length\");\n }\n\n const dotProduct = vector1.reduce((acc, val, i) => acc + val * vector2[i], 0);\n const magnitude1 = Math.sqrt(\n vector1.reduce((acc, val) => acc + val * val, 0)\n );\n const magnitude2 = Math.sqrt(\n vector2.reduce((acc, val) => acc + val * val, 0)\n );\n\n if (magnitude1 === 0 || magnitude2 === 0) return 0;\n return dotProduct / (magnitude1 * magnitude2);\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.cts","names":["All","PendingWriteValue","PendingWrite","Channel","CheckpointPendingWrite","TaskId","CheckpointMetadata","Record","ExtraProperties"],"sources":["../src/types.d.ts"],"sourcesContent":["export type All = \"*\";\nexport type PendingWriteValue = unknown;\nexport type PendingWrite<Channel = string> = [Channel, PendingWriteValue];\nexport type CheckpointPendingWrite<TaskId = string> = [\n TaskId,\n ...PendingWrite<string>\n];\n/**\n * Additional details about the checkpoint, including the source, step, writes, and parents.\n *\n * @typeParam ExtraProperties - Optional additional properties to include in the metadata.\n */\nexport type CheckpointMetadata<ExtraProperties extends object = object> = {\n /**\n * The source of the checkpoint.\n * - \"input\": The checkpoint was created from an input to invoke/stream/batch.\n * - \"loop\": The checkpoint was created from inside the pregel loop.\n * - \"update\": The checkpoint was created from a manual state update.\n * - \"fork\": The checkpoint was created as a copy of another checkpoint.\n */\n source: \"input\" | \"loop\" | \"update\" | \"fork\";\n /**\n * The step number of the checkpoint.\n * -1 for the first \"input\" checkpoint.\n * 0 for the first \"loop\" checkpoint.\n * ... for the nth checkpoint afterwards.\n */\n step: number;\n /**\n * The IDs of the parent checkpoints.\n * Mapping from checkpoint namespace to checkpoint ID.\n */\n parents: Record<string, string>;\n} & ExtraProperties;\n"],"mappings":";KAAYA,GAAAA;AAAAA,KACAC,iBAAAA,GADG,OAAA;AACHA,KACAC,YADiB,CAAA,UAAA,MAAA,CAAA,GAAA,CACiBC,OADjB,EAC0BF,iBAD1B,CAAA;AACjBC,KACAE,sBADY,CAAA,SAAA,MAAA,CAAA,GAAA,CAEpBC,MAFoB,KAGjBH,YAHuCC,CAAAA,MAAAA,CAAAA;;AAC9C;;;;KASYG;EAAAA;;;;;;;;;;;;;;;;;;;WAoBCC;IACTC"}
1
+ {"version":3,"file":"types.d.cts","names":[],"sources":["../src/types.ts"],"mappings":";KAAY,GAAA;AAAA,KAEA,iBAAA;AAAA,KAEA,YAAA,sBAAkC,OAAA,EAAS,iBAAA;AAAA,KAE3C,sBAAA,qBACV,MAAA,KACG,YAAA;;;;;AAJL;KAYY,kBAAA;EAZY;;;;;;;EAoBtB,MAAA;EAlBgC;;;;;;EA0BhC,IAAA;EAxBe;AAQjB;;;EAsBE,OAAA,EAAS,MAAA;AAAA,IACP,eAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","names":["All","PendingWriteValue","PendingWrite","Channel","CheckpointPendingWrite","TaskId","CheckpointMetadata","Record","ExtraProperties"],"sources":["../src/types.d.ts"],"sourcesContent":["export type All = \"*\";\nexport type PendingWriteValue = unknown;\nexport type PendingWrite<Channel = string> = [Channel, PendingWriteValue];\nexport type CheckpointPendingWrite<TaskId = string> = [\n TaskId,\n ...PendingWrite<string>\n];\n/**\n * Additional details about the checkpoint, including the source, step, writes, and parents.\n *\n * @typeParam ExtraProperties - Optional additional properties to include in the metadata.\n */\nexport type CheckpointMetadata<ExtraProperties extends object = object> = {\n /**\n * The source of the checkpoint.\n * - \"input\": The checkpoint was created from an input to invoke/stream/batch.\n * - \"loop\": The checkpoint was created from inside the pregel loop.\n * - \"update\": The checkpoint was created from a manual state update.\n * - \"fork\": The checkpoint was created as a copy of another checkpoint.\n */\n source: \"input\" | \"loop\" | \"update\" | \"fork\";\n /**\n * The step number of the checkpoint.\n * -1 for the first \"input\" checkpoint.\n * 0 for the first \"loop\" checkpoint.\n * ... for the nth checkpoint afterwards.\n */\n step: number;\n /**\n * The IDs of the parent checkpoints.\n * Mapping from checkpoint namespace to checkpoint ID.\n */\n parents: Record<string, string>;\n} & ExtraProperties;\n"],"mappings":";KAAYA,GAAAA;AAAAA,KACAC,iBAAAA,GADG,OAAA;AACHA,KACAC,YADiB,CAAA,UAAA,MAAA,CAAA,GAAA,CACiBC,OADjB,EAC0BF,iBAD1B,CAAA;AACjBC,KACAE,sBADY,CAAA,SAAA,MAAA,CAAA,GAAA,CAEpBC,MAFoB,KAGjBH,YAHuCC,CAAAA,MAAAA,CAAAA;;AAC9C;;;;KASYG;EAAAA;;;;;;;;;;;;;;;;;;;WAoBCC;IACTC"}
1
+ {"version":3,"file":"types.d.ts","names":[],"sources":["../src/types.ts"],"mappings":";KAAY,GAAA;AAAA,KAEA,iBAAA;AAAA,KAEA,YAAA,sBAAkC,OAAA,EAAS,iBAAA;AAAA,KAE3C,sBAAA,qBACV,MAAA,KACG,YAAA;;;;;AAJL;KAYY,kBAAA;EAZY;;;;;;;EAoBtB,MAAA;EAlBgC;;;;;;EA0BhC,IAAA;EAxBe;AAQjB;;;EAsBE,OAAA,EAAS,MAAA;AAAA,IACP,eAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@langchain/langgraph-checkpoint",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "Library with base interfaces for LangGraph checkpoint savers.",
5
5
  "type": "module",
6
6
  "engines": {
@@ -10,22 +10,8 @@
10
10
  "types": "./dist/index.d.ts",
11
11
  "repository": {
12
12
  "type": "git",
13
- "url": "git@github.com:langchain-ai/langgraphjs.git"
14
- },
15
- "scripts": {
16
- "build": "yarn turbo:command build:internal --filter=@langchain/langgraph-checkpoint",
17
- "build:internal": "yarn workspace @langchain/build compile @langchain/langgraph-checkpoint",
18
- "clean": "rm -rf dist/ dist-cjs/ .turbo/",
19
- "lint:eslint": "NODE_OPTIONS=--max-old-space-size=4096 eslint --cache --ext .ts,.js src/",
20
- "lint:dpdm": "dpdm --exit-code circular:1 --no-warning --no-tree src/*.ts src/**/*.ts",
21
- "lint": "yarn lint:eslint && yarn lint:dpdm",
22
- "lint:fix": "yarn lint:eslint --fix && yarn lint:dpdm",
23
- "prepublish": "yarn build",
24
- "test": "vitest run",
25
- "test:watch": "vitest watch",
26
- "test:int": "vitest run --mode int",
27
- "format": "prettier --config .prettierrc --write \"src\"",
28
- "format:check": "prettier --config .prettierrc --check \"src\""
13
+ "url": "git+ssh://git@github.com/langchain-ai/langgraphjs.git",
14
+ "directory": "libs/checkpoint"
29
15
  },
30
16
  "author": "LangChain",
31
17
  "license": "MIT",
@@ -33,27 +19,18 @@
33
19
  "uuid": "^10.0.0"
34
20
  },
35
21
  "peerDependencies": {
36
- "@langchain/core": "^1.0.1"
22
+ "@langchain/core": "^1.1.44"
37
23
  },
38
24
  "devDependencies": {
39
25
  "@langchain/scripts": ">=0.1.3 <0.2.0",
40
26
  "@tsconfig/recommended": "^1.0.3",
41
27
  "@types/uuid": "^10",
42
- "@typescript-eslint/eslint-plugin": "^6.12.0",
43
- "@typescript-eslint/parser": "^6.12.0",
44
28
  "dotenv": "^16.3.1",
45
29
  "dpdm": "^3.12.0",
46
- "eslint": "^8.33.0",
47
- "eslint-config-airbnb-base": "^15.0.0",
48
- "eslint-config-prettier": "^8.6.0",
49
- "eslint-plugin-import": "^2.29.1",
50
- "eslint-plugin-no-instanceof": "^1.0.1",
51
- "eslint-plugin-prettier": "^4.2.1",
52
- "prettier": "^2.8.3",
53
30
  "rollup": "^4.37.0",
54
31
  "tsx": "^4.19.3",
55
32
  "typescript": "^4.9.5 || ^5.4.5",
56
- "vitest": "^3.1.2"
33
+ "vitest": "^3.2.4"
57
34
  },
58
35
  "publishConfig": {
59
36
  "access": "public",
@@ -76,5 +53,16 @@
76
53
  },
77
54
  "files": [
78
55
  "dist/"
79
- ]
56
+ ],
57
+ "scripts": {
58
+ "build": "pnpm turbo build:internal --filter=@langchain/langgraph-checkpoint",
59
+ "build:internal": "pnpm --filter @langchain/build compile @langchain/langgraph-checkpoint",
60
+ "clean": "rm -rf dist/ dist-cjs/ .turbo/",
61
+ "lint:eslint": "NODE_OPTIONS=--max-old-space-size=4096 eslint --cache --ext .ts,.js src/",
62
+ "lint:dpdm": "dpdm --exit-code circular:1 --no-warning --no-tree src/*.ts src/**/*.ts",
63
+ "prepublish": "pnpm build",
64
+ "test": "vitest run",
65
+ "test:watch": "vitest watch",
66
+ "test:int": "vitest run --mode int"
67
+ }
80
68
  }
package/CHANGELOG.md DELETED
@@ -1,25 +0,0 @@
1
- # @langchain/langgraph-checkpoint
2
-
3
- ## 1.0.0
4
-
5
- ### Major Changes
6
-
7
- - 1e1ecbb: This release updates the package for compatibility with LangGraph v1.0. See the [v1.0 release notes](https://docs.langchain.com/oss/javascript/releases/langgraph-v1) for details on what's new.
8
-
9
- ## 0.1.1
10
-
11
- ### Patch Changes
12
-
13
- - 11c7807: Add support for @langchain/core 1.0.0-alpha
14
-
15
- ## 0.1.0
16
-
17
- ### Minor Changes
18
-
19
- - 10f292a: Remove pending_sends from parent checkpoints in favour of TASKS channel
20
- - 3fd7f73: Allow asynchronous serialization and deserialization
21
- - 773ec0d: Remove Checkpoint.writes
22
-
23
- ### Patch Changes
24
-
25
- - ccbcbc1: Add delete thread method to checkpointers
@@ -1,25 +0,0 @@
1
- //#region rolldown:runtime
2
- var __create = Object.create;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
- var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __copyProps = (to, from, except, desc) => {
9
- if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
10
- key = keys[i];
11
- if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
12
- get: ((k) => from[k]).bind(null, key),
13
- enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
14
- });
15
- }
16
- return to;
17
- };
18
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
19
- value: mod,
20
- enumerable: true
21
- }) : target, mod));
22
-
23
- //#endregion
24
-
25
- exports.__toESM = __toESM;