@mastra/memory 1.27.0-alpha.3 → 1.27.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.
@@ -18945,6 +18945,52 @@ function detectDegenerateRepetition(text) {
18945
18945
  return false;
18946
18946
  }
18947
18947
  /**
18948
+ * Build a single-line diagnostic description of output flagged by
18949
+ * {@link detectDegenerateRepetition}. Used when logging or surfacing a
18950
+ * degenerate-output failure so the discarded model output can be inspected —
18951
+ * without it there is no way to tell a real repetition loop apart from a
18952
+ * detector false-positive on legitimately repetitive content.
18953
+ *
18954
+ * Reuses the detector's sampling parameters (200-char windows, ~50 samples)
18955
+ * so the reported duplicate ratio and most-repeated window match what
18956
+ * triggered the detection. Snippets are JSON-escaped so the result stays on
18957
+ * one line.
18958
+ */
18959
+ function describeDegenerateOutput(text, snippetChars = 400) {
18960
+ const windowSize = 200;
18961
+ const step = Math.max(1, Math.floor(text.length / 50));
18962
+ const seen = /* @__PURE__ */ new Map();
18963
+ let duplicateWindows = 0;
18964
+ let totalWindows = 0;
18965
+ for (let i = 0; i + windowSize <= text.length; i += step) {
18966
+ const window = text.slice(i, i + windowSize);
18967
+ totalWindows++;
18968
+ const count = (seen.get(window) ?? 0) + 1;
18969
+ seen.set(window, count);
18970
+ if (count > 1) duplicateWindows++;
18971
+ }
18972
+ let topWindow = "";
18973
+ let topCount = 0;
18974
+ for (const [window, count] of seen) if (count > topCount) {
18975
+ topCount = count;
18976
+ topWindow = window;
18977
+ }
18978
+ let longestLine = 0;
18979
+ for (const line of text.split("\n")) if (line.length > longestLine) longestLine = line.length;
18980
+ const duplicateRatio = totalWindows > 0 ? (duplicateWindows / totalWindows).toFixed(2) : "n/a";
18981
+ const parts = [
18982
+ `length=${text.length}`,
18983
+ `sampledWindows=${totalWindows}`,
18984
+ `duplicateRatio=${duplicateRatio}`,
18985
+ `longestLine=${longestLine}`,
18986
+ `topWindowCount=${topCount}`
18987
+ ];
18988
+ if (topCount > 1) parts.push(`topWindow=${JSON.stringify(topWindow)}`);
18989
+ parts.push(`head=${JSON.stringify(text.slice(0, snippetChars))}`);
18990
+ if (text.length > snippetChars * 2) parts.push(`tail=${JSON.stringify(text.slice(-snippetChars))}`);
18991
+ return parts.join(" ");
18992
+ }
18993
+ /**
18948
18994
  * Check if observations contain a Current Task section.
18949
18995
  * Supports both XML format and legacy markdown format.
18950
18996
  */
@@ -19347,13 +19393,13 @@ var ObserverRunner = class {
19347
19393
  let parsed = parseObserverOutput(result.text, activeExtractors);
19348
19394
  let retriedDueToDegenerate = false;
19349
19395
  if (parsed.degenerate) {
19350
- omDebug(`[OM:callObserver] degenerate repetition detected, retrying once`);
19396
+ omDebug(`[OM:callObserver] degenerate repetition detected, retrying once. ${describeDegenerateOutput(result.text, 2e3)}`);
19351
19397
  result = await doGenerate();
19352
19398
  parsed = parseObserverOutput(result.text, activeExtractors);
19353
19399
  retriedDueToDegenerate = true;
19354
19400
  if (parsed.degenerate) {
19355
- omDebug(`[OM:callObserver] degenerate repetition on retry, failing`);
19356
- throw new Error("Observer produced degenerate output after retry");
19401
+ omDebug(`[OM:callObserver] degenerate repetition on retry, failing. ${describeDegenerateOutput(result.text, 2e3)}`);
19402
+ throw new Error(`Observer produced degenerate output after retry. ${describeDegenerateOutput(result.text)}`);
19357
19403
  }
19358
19404
  }
19359
19405
  const structuredExtraction = await extractStructuredValues({
@@ -19497,13 +19543,13 @@ var ObserverRunner = class {
19497
19543
  let parsed = parseMultiThreadObserverOutput(result.text, activeExtractors);
19498
19544
  let retriedDueToDegenerate = false;
19499
19545
  if (parsed.degenerate) {
19500
- omDebug(`[OM:callMultiThreadObserver] degenerate repetition detected, retrying once`);
19546
+ omDebug(`[OM:callMultiThreadObserver] degenerate repetition detected, retrying once. ${describeDegenerateOutput(result.text, 2e3)}`);
19501
19547
  result = await doGenerate();
19502
19548
  parsed = parseMultiThreadObserverOutput(result.text, activeExtractors);
19503
19549
  retriedDueToDegenerate = true;
19504
19550
  if (parsed.degenerate) {
19505
- omDebug(`[OM:callMultiThreadObserver] degenerate repetition on retry, failing`);
19506
- throw new Error("Multi-thread observer produced degenerate output after retry");
19551
+ omDebug(`[OM:callMultiThreadObserver] degenerate repetition on retry, failing. ${describeDegenerateOutput(result.text, 2e3)}`);
19552
+ throw new Error(`Multi-thread observer produced degenerate output after retry. ${describeDegenerateOutput(result.text)}`);
19507
19553
  }
19508
19554
  }
19509
19555
  const structuredExtractionByThread = /* @__PURE__ */ new Map();
@@ -25446,7 +25492,7 @@ var ReflectorRunner = class {
25446
25492
  finalProviderMetadata = result.providerMetadata ?? finalProviderMetadata;
25447
25493
  parsed = parseReflectorOutput(result.text, observations, activeExtractors);
25448
25494
  if (parsed.degenerate) {
25449
- omDebug(`[OM:callReflector] attempt #${attemptNumber}: degenerate repetition detected, treating as compression failure`);
25495
+ omDebug(`[OM:callReflector] attempt #${attemptNumber}: degenerate repetition detected, treating as compression failure. ${describeDegenerateOutput(result.text, 2e3)}`);
25450
25496
  reflectedTokens = originalTokens;
25451
25497
  } else reflectedTokens = this.tokenCounter.countObservations(parsed.observations);
25452
25498
  omDebug(`[OM:callReflector] attempt #${attemptNumber} parsed: reflectedTokens=${reflectedTokens}, targetThreshold=${targetThreshold}, compressionValid=${validateCompression(reflectedTokens, targetThreshold)}, parsedObsLen=${parsed.observations?.length}, degenerate=${parsed.degenerate ?? false}`);
@@ -31285,4 +31331,4 @@ Notes:
31285
31331
  //#endregion
31286
31332
  export { formatMessagesForObserver as A, OBSERVATION_CONTINUATION_HINT as B, SUMMARIZE_THREAD_DEFAULTS as C, buildObserverPrompt as D, OBSERVER_SYSTEM_PROMPT as E, parseAnchorId as F, ModelByInputTokens as G, KnowledgeSemanticIndexCoordinator as H, stripEphemeralAnchorIds as I, SUBCONSCIOUS_ACTIVITY_STATE_ID as J, SubconsciousCaptureExtractor as K, OBSERVATIONAL_MEMORY_DEFAULTS as L, optimizeObservationsForContext as M, parseObserverOutput as N, buildObserverSystemPrompt as O, injectAnchorIds as P, Extractor as Q, OBSERVATION_CONTEXT_INSTRUCTIONS as R, WorkingMemoryExtractor as S, TokenCounter as T, StaleKnowledgeSemanticIndexError as U, Subconscious as V, SubconsciousRemindExtractor as W, publishSubconsciousActivity as X, buildSubconsciousActivitySnapshot as Y, renderSubconsciousActivity as Z, reconcileObservationGroupsFromReflection as _, extractWorkingMemoryContent as a, wrapInObservationGroup as b, WORKING_MEMORY_STATE_ID as c, getObservationsAsOf as d, ObservationalMemoryProcessor as f, parseObservationGroups as g, deriveObservationGroupProvenance as h, WorkingMemory as i, hasCurrentTaskSection as j, extractCurrentTask as k, WORKING_MEMORY_STATE_PROCESSOR_ID as l, combineObservationGroupRanges as m, MessageHistory$1 as n, extractWorkingMemoryTags as o, ObservationalMemory as p, subconsciousCaptureSchema as q, SemanticRecall as r, removeWorkingMemoryTags as s, Memory as t, WorkingMemoryStateProcessor as u, renderObservationGroupsForReflection as v, summarizeConversation as w, deepMergeWorkingMemory as x, stripObservationGroups as y, OBSERVATION_CONTEXT_PROMPT as z };
31287
31333
 
31288
- //# sourceMappingURL=src-t_4yoTX9.js.map
31334
+ //# sourceMappingURL=src-aTfbkxBl.js.map