@anuma/sdk 7.0.4 → 7.0.5

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.
@@ -18478,6 +18478,22 @@ var postApiV1Embeddings = (options) => (options.client ?? client).post({
18478
18478
  }
18479
18479
  });
18480
18480
 
18481
+ // src/lib/memoryEngine/embeddingCacheState.ts
18482
+ var EMBEDDING_CACHE_STATE_KEY = /* @__PURE__ */ Symbol.for("@anuma/sdk/embedding-cache/v1");
18483
+ var cacheGlobal = globalThis;
18484
+ var fallbackState = {
18485
+ scopedViews: /* @__PURE__ */ new WeakMap(),
18486
+ inFlightByCache: /* @__PURE__ */ new WeakMap(),
18487
+ cachedEmbeddingModels: /* @__PURE__ */ new WeakMap()
18488
+ };
18489
+ function getEmbeddingCacheState() {
18490
+ try {
18491
+ return cacheGlobal[EMBEDDING_CACHE_STATE_KEY] ?? (cacheGlobal[EMBEDDING_CACHE_STATE_KEY] = fallbackState);
18492
+ } catch {
18493
+ return fallbackState;
18494
+ }
18495
+ }
18496
+
18481
18497
  // src/lib/memoryEngine/generate.ts
18482
18498
  var EMBED_MAX_ATTEMPTS = 4;
18483
18499
  var DEFAULT_EMBEDDING_REQUEST_TIMEOUT_MS = 15e3;
@@ -18569,15 +18585,18 @@ async function generateEmbedding(text12, options) {
18569
18585
  if (total === void 0) return embedOne(text12, options, void 0);
18570
18586
  return withDeadline((signal) => embedOne(text12, options, signal), total, "embedding");
18571
18587
  }
18572
- var inFlightByCache = /* @__PURE__ */ new WeakMap();
18588
+ var { inFlightByCache, cachedEmbeddingModels } = getEmbeddingCacheState();
18573
18589
  async function embedOne(text12, options, outer) {
18574
18590
  const { cache } = options;
18575
18591
  if (!cache) return Array.from(await requestEmbedding(text12, options, outer));
18592
+ const model = options.model ?? DEFAULT_API_EMBEDDING_MODEL;
18576
18593
  const cached = cache.get(text12);
18577
- if (cached) return Array.from(cached);
18594
+ const cachedModel = cached && cachedEmbeddingModels.get(cached);
18595
+ if (cached && (cachedModel === void 0 || cachedModel === model)) return Array.from(cached);
18578
18596
  const inFlight = inFlightByCache.get(cache) ?? /* @__PURE__ */ new Map();
18579
18597
  inFlightByCache.set(cache, inFlight);
18580
- const pending = inFlight.get(text12);
18598
+ const requestKey = JSON.stringify([model, text12]);
18599
+ const pending = inFlight.get(requestKey);
18581
18600
  if (pending) {
18582
18601
  try {
18583
18602
  return Array.from(await pending);
@@ -18586,13 +18605,14 @@ async function embedOne(text12, options, outer) {
18586
18605
  }
18587
18606
  }
18588
18607
  const request = requestEmbedding(text12, options, outer);
18589
- inFlight.set(text12, request);
18608
+ inFlight.set(requestKey, request);
18590
18609
  try {
18591
18610
  const embedding = await request;
18611
+ cachedEmbeddingModels.set(embedding, model);
18592
18612
  cache.set(text12, embedding);
18593
18613
  return Array.from(embedding);
18594
18614
  } finally {
18595
- if (inFlight.get(text12) === request) inFlight.delete(text12);
18615
+ if (inFlight.get(requestKey) === request) inFlight.delete(requestKey);
18596
18616
  }
18597
18617
  }
18598
18618
  async function requestEmbedding(text12, options, outer) {
@@ -18675,13 +18695,15 @@ async function embedMany(texts, options, outer) {
18675
18695
  const { baseUrl = BASE_URL, model, batchSize, cache } = options;
18676
18696
  const timeoutMs = options.timeoutMs ?? DEFAULT_EMBEDDING_REQUEST_TIMEOUT_MS;
18677
18697
  const chunkSize = batchSize ?? DEFAULT_EMBEDDING_BATCH_SIZE;
18698
+ const embeddingModel = model ?? DEFAULT_API_EMBEDDING_MODEL;
18678
18699
  const results = new Array(texts.length).fill(null);
18679
18700
  const uncachedIndices = [];
18680
18701
  const uncachedTexts = [];
18681
18702
  for (let i = 0; i < texts.length; i++) {
18682
18703
  if (cache) {
18683
18704
  const cached = cache.get(texts[i]);
18684
- if (cached) {
18705
+ const cachedModel = cached && cachedEmbeddingModels.get(cached);
18706
+ if (cached && (cachedModel === void 0 || cachedModel === embeddingModel)) {
18685
18707
  results[i] = Array.from(cached);
18686
18708
  continue;
18687
18709
  }
@@ -18697,7 +18719,6 @@ async function embedMany(texts, options, outer) {
18697
18719
  ...taskTypeHeader(options.taskType)
18698
18720
  };
18699
18721
  if (outer?.aborted) throw outer.reason;
18700
- const embeddingModel = model ?? DEFAULT_API_EMBEDDING_MODEL;
18701
18722
  let newEmbeddings;
18702
18723
  if (uncachedTexts.length <= chunkSize) {
18703
18724
  newEmbeddings = await generateEmbeddingsBatch(
@@ -18745,6 +18766,7 @@ async function embedMany(texts, options, outer) {
18745
18766
  const f32Embedding = Float32Array.from(newEmbeddings[i]);
18746
18767
  results[uncachedIndices[i]] = Array.from(f32Embedding);
18747
18768
  if (cache) {
18769
+ cachedEmbeddingModels.set(f32Embedding, embeddingModel);
18748
18770
  cache.set(uncachedTexts[i], f32Embedding);
18749
18771
  }
18750
18772
  }
@@ -32532,7 +32554,7 @@ var MaskScopedEmbeddingCache = class extends Map {
32532
32554
  return this;
32533
32555
  }
32534
32556
  };
32535
- var scopedViews = /* @__PURE__ */ new WeakMap();
32557
+ var { scopedViews } = getEmbeddingCacheState();
32536
32558
  function maskScopedEmbeddingCache(cache, masked) {
32537
32559
  const views = scopedViews.get(cache) ?? {};
32538
32560
  scopedViews.set(cache, views);
@@ -32954,44 +32976,48 @@ async function recall(query, ctx, options = {}) {
32954
32976
  embeddingOptions,
32955
32977
  ctx.vaultCache,
32956
32978
  searchOptions
32957
- )))(query, {
32958
- limit: types.includes("chunk") ? Math.max(limit * 2, 16) : limit,
32959
- minSimilarity: vaultMinScore,
32960
- useFusion: true,
32961
- rerank: flags.rerank,
32962
- ...options.rerankTopN !== void 0 && { rerankTopN: options.rerankTopN },
32963
- ...options.ceWeight !== void 0 && { ceWeight: options.ceWeight },
32964
- ...options.rerankLoadTimeoutMs !== void 0 && {
32965
- rerankLoadTimeoutMs: options.rerankLoadTimeoutMs
32966
- },
32967
- ...options.recencyAlpha !== void 0 && { recencyAlpha: options.recencyAlpha },
32968
- ...options.recency && { recency: options.recency },
32969
- ...options.mmr !== void 0 && { mmr: options.mmr },
32970
- ...options.supersessionBoost !== void 0 && {
32971
- supersessionBoost: options.supersessionBoost
32972
- },
32973
- ...options.supersessionWindow !== void 0 && {
32974
- supersessionWindow: options.supersessionWindow
32975
- },
32976
- ...options.proofCountAlpha !== void 0 && {
32977
- proofCountAlpha: options.proofCountAlpha
32978
- },
32979
- ...options.bm25AdmissionDivisor !== void 0 && {
32980
- bm25AdmissionDivisor: options.bm25AdmissionDivisor
32979
+ )))(
32980
+ query,
32981
+ {
32982
+ limit: types.includes("chunk") ? Math.max(limit * 2, 16) : limit,
32983
+ minSimilarity: vaultMinScore,
32984
+ useFusion: true,
32985
+ rerank: flags.rerank,
32986
+ ...options.rerankTopN !== void 0 && { rerankTopN: options.rerankTopN },
32987
+ ...options.ceWeight !== void 0 && { ceWeight: options.ceWeight },
32988
+ ...options.rerankLoadTimeoutMs !== void 0 && {
32989
+ rerankLoadTimeoutMs: options.rerankLoadTimeoutMs
32990
+ },
32991
+ ...options.recencyAlpha !== void 0 && { recencyAlpha: options.recencyAlpha },
32992
+ ...options.recency && { recency: options.recency },
32993
+ ...options.mmr !== void 0 && { mmr: options.mmr },
32994
+ ...options.supersessionBoost !== void 0 && {
32995
+ supersessionBoost: options.supersessionBoost
32996
+ },
32997
+ ...options.supersessionWindow !== void 0 && {
32998
+ supersessionWindow: options.supersessionWindow
32999
+ },
33000
+ ...options.proofCountAlpha !== void 0 && {
33001
+ proofCountAlpha: options.proofCountAlpha
33002
+ },
33003
+ ...options.bm25AdmissionDivisor !== void 0 && {
33004
+ bm25AdmissionDivisor: options.bm25AdmissionDivisor
33005
+ },
33006
+ ...options.rrfK !== void 0 && { rrfK: options.rrfK },
33007
+ ...options.decryptLast !== void 0 && { decryptLast: options.decryptLast },
33008
+ ...subQueries && { subQueries },
33009
+ ...options.scopes && { scopes: options.scopes },
33010
+ ...options.folderId !== void 0 && { folderId: options.folderId },
33011
+ ...options.factTypes?.length && { factTypes: options.factTypes },
33012
+ ...options.memoryIds !== void 0 && { memoryIds: options.memoryIds },
33013
+ ...options.factTypeWeights && { factTypeWeights: options.factTypeWeights },
33014
+ ...entityRanking.length > 0 && { entityRanking },
33015
+ ...temporalRanking.length > 0 && { temporalRanking },
33016
+ ...needsChunkEmbedding && { queryEmbedding: queryEmbedding ?? [] },
33017
+ queryEmbedTotalTimeoutMs
32981
33018
  },
32982
- ...options.rrfK !== void 0 && { rrfK: options.rrfK },
32983
- ...options.decryptLast !== void 0 && { decryptLast: options.decryptLast },
32984
- ...subQueries && { subQueries },
32985
- ...options.scopes && { scopes: options.scopes },
32986
- ...options.folderId !== void 0 && { folderId: options.folderId },
32987
- ...options.factTypes?.length && { factTypes: options.factTypes },
32988
- ...options.memoryIds !== void 0 && { memoryIds: options.memoryIds },
32989
- ...options.factTypeWeights && { factTypeWeights: options.factTypeWeights },
32990
- ...entityRanking.length > 0 && { entityRanking },
32991
- ...temporalRanking.length > 0 && { temporalRanking },
32992
- ...needsChunkEmbedding && { queryEmbedding: queryEmbedding ?? [] },
32993
- queryEmbedTotalTimeoutMs
32994
- });
33019
+ options.embeddingCache
33020
+ );
32995
33021
  factResults.push(
32996
33022
  ...dedupeBy(
32997
33023
  results,
@@ -34130,10 +34156,19 @@ function createLocalMemoryStore(options) {
34130
34156
  retainOptions
34131
34157
  ),
34132
34158
  factSource: {
34133
- search: (query, searchOptions) => searchVaultMemoriesWithSize(
34159
+ search: (query, searchOptions, embeddingCache) => searchVaultMemoriesWithSize(
34134
34160
  query,
34135
34161
  vaultCtx,
34136
- { ...options.embeddingOptions, taskType: "memory_recall_embed" },
34162
+ {
34163
+ ...options.embeddingOptions,
34164
+ taskType: "memory_recall_embed",
34165
+ ...embeddingCache && !options.embeddingOptions.cache && {
34166
+ cache: maskScopedEmbeddingCache(
34167
+ embeddingCache,
34168
+ Boolean(options.embeddingOptions.maskInput)
34169
+ )
34170
+ }
34171
+ },
34137
34172
  vaultCache,
34138
34173
  searchOptions
34139
34174
  ),
@@ -930,6 +930,22 @@ function taskTypeHeader(taskType) {
930
930
  // src/lib/memoryEngine/constants.ts
931
931
  var DEFAULT_API_EMBEDDING_MODEL = "qwen/qwen3-embedding-8b";
932
932
 
933
+ // src/lib/memoryEngine/embeddingCacheState.ts
934
+ var EMBEDDING_CACHE_STATE_KEY = /* @__PURE__ */ Symbol.for("@anuma/sdk/embedding-cache/v1");
935
+ var cacheGlobal = globalThis;
936
+ var fallbackState = {
937
+ scopedViews: /* @__PURE__ */ new WeakMap(),
938
+ inFlightByCache: /* @__PURE__ */ new WeakMap(),
939
+ cachedEmbeddingModels: /* @__PURE__ */ new WeakMap()
940
+ };
941
+ function getEmbeddingCacheState() {
942
+ try {
943
+ return cacheGlobal[EMBEDDING_CACHE_STATE_KEY] ?? (cacheGlobal[EMBEDDING_CACHE_STATE_KEY] = fallbackState);
944
+ } catch {
945
+ return fallbackState;
946
+ }
947
+ }
948
+
933
949
  // src/lib/memoryEngine/generate.ts
934
950
  var EMBED_MAX_ATTEMPTS = 4;
935
951
  var DEFAULT_EMBEDDING_REQUEST_TIMEOUT_MS = 15e3;
@@ -1018,15 +1034,18 @@ async function generateEmbedding(text, options) {
1018
1034
  if (total === void 0) return embedOne(text, options, void 0);
1019
1035
  return withDeadline((signal) => embedOne(text, options, signal), total, "embedding");
1020
1036
  }
1021
- var inFlightByCache = /* @__PURE__ */ new WeakMap();
1037
+ var { inFlightByCache, cachedEmbeddingModels } = getEmbeddingCacheState();
1022
1038
  async function embedOne(text, options, outer) {
1023
1039
  const { cache } = options;
1024
1040
  if (!cache) return Array.from(await requestEmbedding(text, options, outer));
1041
+ const model = options.model ?? DEFAULT_API_EMBEDDING_MODEL;
1025
1042
  const cached = cache.get(text);
1026
- if (cached) return Array.from(cached);
1043
+ const cachedModel = cached && cachedEmbeddingModels.get(cached);
1044
+ if (cached && (cachedModel === void 0 || cachedModel === model)) return Array.from(cached);
1027
1045
  const inFlight = inFlightByCache.get(cache) ?? /* @__PURE__ */ new Map();
1028
1046
  inFlightByCache.set(cache, inFlight);
1029
- const pending = inFlight.get(text);
1047
+ const requestKey = JSON.stringify([model, text]);
1048
+ const pending = inFlight.get(requestKey);
1030
1049
  if (pending) {
1031
1050
  try {
1032
1051
  return Array.from(await pending);
@@ -1035,13 +1054,14 @@ async function embedOne(text, options, outer) {
1035
1054
  }
1036
1055
  }
1037
1056
  const request = requestEmbedding(text, options, outer);
1038
- inFlight.set(text, request);
1057
+ inFlight.set(requestKey, request);
1039
1058
  try {
1040
1059
  const embedding = await request;
1060
+ cachedEmbeddingModels.set(embedding, model);
1041
1061
  cache.set(text, embedding);
1042
1062
  return Array.from(embedding);
1043
1063
  } finally {
1044
- if (inFlight.get(text) === request) inFlight.delete(text);
1064
+ if (inFlight.get(requestKey) === request) inFlight.delete(requestKey);
1045
1065
  }
1046
1066
  }
1047
1067
  async function requestEmbedding(text, options, outer) {
@@ -1124,13 +1144,15 @@ async function embedMany(texts, options, outer) {
1124
1144
  const { baseUrl = BASE_URL, model, batchSize, cache } = options;
1125
1145
  const timeoutMs = options.timeoutMs ?? DEFAULT_EMBEDDING_REQUEST_TIMEOUT_MS;
1126
1146
  const chunkSize = batchSize ?? DEFAULT_EMBEDDING_BATCH_SIZE;
1147
+ const embeddingModel = model ?? DEFAULT_API_EMBEDDING_MODEL;
1127
1148
  const results = new Array(texts.length).fill(null);
1128
1149
  const uncachedIndices = [];
1129
1150
  const uncachedTexts = [];
1130
1151
  for (let i = 0; i < texts.length; i++) {
1131
1152
  if (cache) {
1132
1153
  const cached = cache.get(texts[i]);
1133
- if (cached) {
1154
+ const cachedModel = cached && cachedEmbeddingModels.get(cached);
1155
+ if (cached && (cachedModel === void 0 || cachedModel === embeddingModel)) {
1134
1156
  results[i] = Array.from(cached);
1135
1157
  continue;
1136
1158
  }
@@ -1146,7 +1168,6 @@ async function embedMany(texts, options, outer) {
1146
1168
  ...taskTypeHeader(options.taskType)
1147
1169
  };
1148
1170
  if (outer?.aborted) throw outer.reason;
1149
- const embeddingModel = model ?? DEFAULT_API_EMBEDDING_MODEL;
1150
1171
  let newEmbeddings;
1151
1172
  if (uncachedTexts.length <= chunkSize) {
1152
1173
  newEmbeddings = await generateEmbeddingsBatch(
@@ -1194,6 +1215,7 @@ async function embedMany(texts, options, outer) {
1194
1215
  const f32Embedding = Float32Array.from(newEmbeddings[i]);
1195
1216
  results[uncachedIndices[i]] = Array.from(f32Embedding);
1196
1217
  if (cache) {
1218
+ cachedEmbeddingModels.set(f32Embedding, embeddingModel);
1197
1219
  cache.set(uncachedTexts[i], f32Embedding);
1198
1220
  }
1199
1221
  }
@@ -808,6 +808,22 @@ function taskTypeHeader(taskType) {
808
808
  // src/lib/memoryEngine/constants.ts
809
809
  var DEFAULT_API_EMBEDDING_MODEL = "qwen/qwen3-embedding-8b";
810
810
 
811
+ // src/lib/memoryEngine/embeddingCacheState.ts
812
+ var EMBEDDING_CACHE_STATE_KEY = /* @__PURE__ */ Symbol.for("@anuma/sdk/embedding-cache/v1");
813
+ var cacheGlobal = globalThis;
814
+ var fallbackState = {
815
+ scopedViews: /* @__PURE__ */ new WeakMap(),
816
+ inFlightByCache: /* @__PURE__ */ new WeakMap(),
817
+ cachedEmbeddingModels: /* @__PURE__ */ new WeakMap()
818
+ };
819
+ function getEmbeddingCacheState() {
820
+ try {
821
+ return cacheGlobal[EMBEDDING_CACHE_STATE_KEY] ?? (cacheGlobal[EMBEDDING_CACHE_STATE_KEY] = fallbackState);
822
+ } catch {
823
+ return fallbackState;
824
+ }
825
+ }
826
+
811
827
  // src/lib/memoryEngine/generate.ts
812
828
  var EMBED_MAX_ATTEMPTS = 4;
813
829
  var DEFAULT_EMBEDDING_REQUEST_TIMEOUT_MS = 15e3;
@@ -896,15 +912,18 @@ async function generateEmbedding(text, options) {
896
912
  if (total === void 0) return embedOne(text, options, void 0);
897
913
  return withDeadline((signal) => embedOne(text, options, signal), total, "embedding");
898
914
  }
899
- var inFlightByCache = /* @__PURE__ */ new WeakMap();
915
+ var { inFlightByCache, cachedEmbeddingModels } = getEmbeddingCacheState();
900
916
  async function embedOne(text, options, outer) {
901
917
  const { cache } = options;
902
918
  if (!cache) return Array.from(await requestEmbedding(text, options, outer));
919
+ const model = options.model ?? DEFAULT_API_EMBEDDING_MODEL;
903
920
  const cached = cache.get(text);
904
- if (cached) return Array.from(cached);
921
+ const cachedModel = cached && cachedEmbeddingModels.get(cached);
922
+ if (cached && (cachedModel === void 0 || cachedModel === model)) return Array.from(cached);
905
923
  const inFlight = inFlightByCache.get(cache) ?? /* @__PURE__ */ new Map();
906
924
  inFlightByCache.set(cache, inFlight);
907
- const pending = inFlight.get(text);
925
+ const requestKey = JSON.stringify([model, text]);
926
+ const pending = inFlight.get(requestKey);
908
927
  if (pending) {
909
928
  try {
910
929
  return Array.from(await pending);
@@ -913,13 +932,14 @@ async function embedOne(text, options, outer) {
913
932
  }
914
933
  }
915
934
  const request = requestEmbedding(text, options, outer);
916
- inFlight.set(text, request);
935
+ inFlight.set(requestKey, request);
917
936
  try {
918
937
  const embedding = await request;
938
+ cachedEmbeddingModels.set(embedding, model);
919
939
  cache.set(text, embedding);
920
940
  return Array.from(embedding);
921
941
  } finally {
922
- if (inFlight.get(text) === request) inFlight.delete(text);
942
+ if (inFlight.get(requestKey) === request) inFlight.delete(requestKey);
923
943
  }
924
944
  }
925
945
  async function requestEmbedding(text, options, outer) {
@@ -1002,13 +1022,15 @@ async function embedMany(texts, options, outer) {
1002
1022
  const { baseUrl = BASE_URL, model, batchSize, cache } = options;
1003
1023
  const timeoutMs = options.timeoutMs ?? DEFAULT_EMBEDDING_REQUEST_TIMEOUT_MS;
1004
1024
  const chunkSize = batchSize ?? DEFAULT_EMBEDDING_BATCH_SIZE;
1025
+ const embeddingModel = model ?? DEFAULT_API_EMBEDDING_MODEL;
1005
1026
  const results = new Array(texts.length).fill(null);
1006
1027
  const uncachedIndices = [];
1007
1028
  const uncachedTexts = [];
1008
1029
  for (let i = 0; i < texts.length; i++) {
1009
1030
  if (cache) {
1010
1031
  const cached = cache.get(texts[i]);
1011
- if (cached) {
1032
+ const cachedModel = cached && cachedEmbeddingModels.get(cached);
1033
+ if (cached && (cachedModel === void 0 || cachedModel === embeddingModel)) {
1012
1034
  results[i] = Array.from(cached);
1013
1035
  continue;
1014
1036
  }
@@ -1024,7 +1046,6 @@ async function embedMany(texts, options, outer) {
1024
1046
  ...taskTypeHeader(options.taskType)
1025
1047
  };
1026
1048
  if (outer?.aborted) throw outer.reason;
1027
- const embeddingModel = model ?? DEFAULT_API_EMBEDDING_MODEL;
1028
1049
  let newEmbeddings;
1029
1050
  if (uncachedTexts.length <= chunkSize) {
1030
1051
  newEmbeddings = await generateEmbeddingsBatch(
@@ -1072,6 +1093,7 @@ async function embedMany(texts, options, outer) {
1072
1093
  const f32Embedding = Float32Array.from(newEmbeddings[i]);
1073
1094
  results[uncachedIndices[i]] = Array.from(f32Embedding);
1074
1095
  if (cache) {
1096
+ cachedEmbeddingModels.set(f32Embedding, embeddingModel);
1075
1097
  cache.set(uncachedTexts[i], f32Embedding);
1076
1098
  }
1077
1099
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anuma/sdk",
3
- "version": "7.0.4",
3
+ "version": "7.0.5",
4
4
  "description": "",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.mjs",
@@ -154,7 +154,7 @@
154
154
  "check:excluded-suites": "node scripts/assert-excluded-suites-still-fail.mjs",
155
155
  "knip": "knip",
156
156
  "check:export-consumers": "node scripts/assert-export-consumers.mjs",
157
- "check-exports": "publint && attw --pack --ignore-rules no-resolution false-cjs && node scripts/assert-no-client-self-import.mjs && node scripts/assert-shared-logger.mjs",
157
+ "check-exports": "publint && attw --pack --ignore-rules no-resolution false-cjs && node scripts/assert-no-client-self-import.mjs && node scripts/assert-shared-logger.mjs && node scripts/assert-embedding-cross-entrypoints.mjs",
158
158
  "check": "pnpm run lint && pnpm run knip && pnpm run check:export-consumers && pnpm run format && pnpm run generate",
159
159
  "eval:extraction": "tsx test/memory/src/extraction/benchmark.test.ts",
160
160
  "eval:topic": "tsx test/memory/src/topic/benchmark.ts",