@anuma/sdk 3.6.3 → 3.8.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.
@@ -125,7 +125,7 @@ import {
125
125
  updateVaultMemoryOp,
126
126
  upsertMessageOp,
127
127
  vaultMemoryToStored
128
- } from "./chunk-66UWDXS3.mjs";
128
+ } from "./chunk-LSKFJNLF.mjs";
129
129
  import {
130
130
  createStreamingDeAnonymizer,
131
131
  resolvePiiRedactor
@@ -135,8 +135,9 @@ import {
135
135
  extractJsonCandidate,
136
136
  getLogger,
137
137
  resolvePortalAuthHeaders,
138
- supportsResponseFormat
139
- } from "./chunk-AHJT66EO.mjs";
138
+ supportsResponseFormat,
139
+ validateEndpointOverride
140
+ } from "./chunk-MIXEASUP.mjs";
140
141
  import {
141
142
  BASE_URL,
142
143
  __commonJS,
@@ -5094,10 +5095,10 @@ function injectionSignatureCatalog() {
5094
5095
  }
5095
5096
 
5096
5097
  // src/lib/memory/retain.ts
5097
- var DEFAULT_AUTO_MERGE_THRESHOLD = 0.85;
5098
+ var DEFAULT_AUTO_MERGE_THRESHOLD = 0.8;
5098
5099
  var DEFAULT_SCOPE = "private";
5099
- var DEFAULT_CONSOLIDATE_THRESHOLD = 0.65;
5100
- var DEFAULT_CONSOLIDATE_TOP_K = 5;
5100
+ var DEFAULT_CONSOLIDATE_THRESHOLD = 0.55;
5101
+ var DEFAULT_CONSOLIDATE_TOP_K = 20;
5101
5102
  async function retain(content, ctx, options = {}) {
5102
5103
  const trimmed = content.trim();
5103
5104
  if (trimmed.length === 0) {
@@ -5106,18 +5107,18 @@ async function retain(content, ctx, options = {}) {
5106
5107
  const enableAutoMerge = options.enableAutoMerge ?? true;
5107
5108
  const threshold = options.autoMergeThreshold ?? DEFAULT_AUTO_MERGE_THRESHOLD;
5108
5109
  const resolvedScope = options.scope ?? DEFAULT_SCOPE;
5109
- let supersedeTargetId;
5110
+ let supersedeTargetIds = [];
5110
5111
  let supersedeContent;
5111
5112
  if (enableAutoMerge) {
5112
5113
  if (options.consolidateOptions) {
5113
5114
  const outcome = await tryConsolidate(trimmed, ctx, options);
5114
5115
  if (outcome) {
5115
5116
  if ("done" in outcome) return outcome.done;
5116
- supersedeTargetId = outcome.supersede;
5117
+ supersedeTargetIds = outcome.supersede;
5117
5118
  supersedeContent = outcome.content;
5118
5119
  }
5119
5120
  }
5120
- if (!supersedeTargetId) {
5121
+ if (supersedeTargetIds.length === 0) {
5121
5122
  const matches = await searchVaultMemories(
5122
5123
  trimmed,
5123
5124
  ctx.vaultCtx,
@@ -5221,18 +5222,42 @@ async function retain(content, ctx, options = {}) {
5221
5222
  // memory's tier. The DB op re-validates against the known set.
5222
5223
  ...options.trustTier !== void 0 && { trustTier: options.trustTier }
5223
5224
  };
5224
- if (supersedeTargetId) {
5225
+ if (supersedeTargetIds.length > 0) {
5226
+ const [primaryTargetId, ...restTargetIds] = supersedeTargetIds;
5225
5227
  const { created: created2, retired } = await createSupersedingMemoryOp(
5226
5228
  ctx.vaultCtx,
5227
5229
  createOpts,
5228
- supersedeTargetId
5230
+ primaryTargetId
5229
5231
  );
5230
5232
  if (created2 && retired) {
5231
5233
  ctx.vaultCache.set(created2.uniqueId, Float32Array.from(embedding));
5234
+ const liveLeftovers = [];
5235
+ for (const staleId of restTargetIds) {
5236
+ let ok = false;
5237
+ try {
5238
+ ok = await supersedeVaultMemoryOp(ctx.vaultCtx, staleId, created2.uniqueId) === true;
5239
+ } catch {
5240
+ }
5241
+ if (ok) continue;
5242
+ const stillLive = await getVaultMemoryOp(ctx.vaultCtx, staleId).catch(() => null);
5243
+ if (stillLive && !stillLive.supersededBy) liveLeftovers.push(staleId);
5244
+ }
5245
+ if (liveLeftovers.length > 0) {
5246
+ getLogger().warn(
5247
+ "[memory/retain] supersede left duplicate row(s) live \u2014 will reconcile at next consolidation",
5248
+ {
5249
+ newMemoryId: created2.uniqueId,
5250
+ leftover: liveLeftovers.length,
5251
+ // Log the specific ids (opaque record ids, not content) so an
5252
+ // operator can identify exactly which rows are still active.
5253
+ leftoverIds: liveLeftovers
5254
+ }
5255
+ );
5256
+ }
5232
5257
  return {
5233
5258
  action: "supersede",
5234
5259
  memoryId: created2.uniqueId,
5235
- targetId: supersedeTargetId,
5260
+ targetId: primaryTargetId,
5236
5261
  proofCount: 1
5237
5262
  };
5238
5263
  }
@@ -5315,13 +5340,19 @@ async function tryConsolidate(trimmed, ctx, options) {
5315
5340
  content: m.content,
5316
5341
  similarity: m.similarity
5317
5342
  }));
5318
- const { consolidateMemory: doConsolidate } = await import("./consolidate-CN2GQV4D.mjs");
5343
+ const { consolidateMemory: doConsolidate } = await import("./consolidate-BKLNVH5Y.mjs");
5319
5344
  const decision = await doConsolidate(trimmed, candidates, consolidateOptions);
5320
5345
  if (decision.action === "create") return null;
5321
- if (decision.action === "supersede" && decision.targetId && decision.content) {
5322
- const existing = await getVaultMemoryOp(ctx.vaultCtx, decision.targetId);
5323
- if (!existing || existing.supersededBy) return null;
5324
- return { supersede: decision.targetId, content: decision.content };
5346
+ if (decision.action === "supersede" && decision.content) {
5347
+ const requestedIds = decision.targetIds?.length ? decision.targetIds : decision.targetId ? [decision.targetId] : [];
5348
+ if (requestedIds.length === 0) return null;
5349
+ const valid = [];
5350
+ for (const id of requestedIds) {
5351
+ const existing = await getVaultMemoryOp(ctx.vaultCtx, id);
5352
+ if (existing && !existing.supersededBy) valid.push(id);
5353
+ }
5354
+ if (valid.length === 0) return null;
5355
+ return { supersede: valid, content: decision.content };
5325
5356
  }
5326
5357
  if (decision.action === "noop" && decision.targetId) {
5327
5358
  const existing = await getVaultMemoryOp(ctx.vaultCtx, decision.targetId);
@@ -7058,6 +7089,9 @@ When a memory refers to one of these, reuse the EXACT existing name (same spelli
7058
7089
  ...options.apiKey !== void 0 && { apiKey: options.apiKey },
7059
7090
  ...options.getToken !== void 0 && { getToken: options.getToken },
7060
7091
  ...options.baseUrl !== void 0 && { baseUrl: options.baseUrl },
7092
+ ...options.endpointOverride !== void 0 && {
7093
+ endpointOverride: options.endpointOverride
7094
+ },
7061
7095
  model: options.model ?? DEFAULT_EXTRACTION_MODEL,
7062
7096
  systemPrompt: SYSTEM_PROMPT4,
7063
7097
  userMessage: `${vocabularyNote}Memories:
@@ -11326,22 +11360,6 @@ function linkAbortSignals(a, b) {
11326
11360
  }
11327
11361
  };
11328
11362
  }
11329
- function validateEndpointOverride(override) {
11330
- const trimmed = override.trim();
11331
- if (trimmed === "") {
11332
- return {
11333
- valid: false,
11334
- message: 'endpointOverride must be a non-empty, root-relative path (e.g. "/api/v1/utility/responses"); received an empty or whitespace-only string'
11335
- };
11336
- }
11337
- if (trimmed.startsWith("//") || trimmed.includes("://")) {
11338
- return {
11339
- valid: false,
11340
- message: `endpointOverride must be a root-relative path (e.g. "/api/v1/utility/responses"), not a protocol-relative or absolute URL; received "${trimmed}"`
11341
- };
11342
- }
11343
- return { valid: true, endpoint: trimmed.startsWith("/") ? trimmed : `/${trimmed}` };
11344
- }
11345
11363
  async function runToolLoop(options) {
11346
11364
  const {
11347
11365
  model,
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  recall
3
- } from "./chunk-66UWDXS3.mjs";
4
- import "./chunk-AHJT66EO.mjs";
3
+ } from "./chunk-LSKFJNLF.mjs";
4
+ import "./chunk-MIXEASUP.mjs";
5
5
  import "./chunk-3RPGXXPZ.mjs";
6
6
  export {
7
7
  recall
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anuma/sdk",
3
- "version": "3.6.3",
3
+ "version": "3.8.0",
4
4
  "description": "",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.mjs",
@@ -139,7 +139,8 @@
139
139
  "knip": "knip",
140
140
  "check-exports": "publint && attw --pack --ignore-rules no-resolution false-cjs && node scripts/assert-no-client-self-import.mjs",
141
141
  "check": "pnpm run lint && pnpm run knip && pnpm run format && pnpm run generate",
142
- "eval:extraction": "tsx test/memory/src/extraction/benchmark.test.ts"
142
+ "eval:extraction": "tsx test/memory/src/extraction/benchmark.test.ts",
143
+ "eval:consolidation": "tsx test/memory/src/consolidation/benchmark.test.ts"
143
144
  },
144
145
  "repository": {
145
146
  "type": "git",