@mastra/memory 1.13.0 → 1.13.1-alpha.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.
Files changed (29) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/dist/{chunk-O3KNDDJV.cjs → chunk-HNVSYZRA.cjs} +103 -8
  3. package/dist/chunk-HNVSYZRA.cjs.map +1 -0
  4. package/dist/{chunk-ZVRY34YB.js → chunk-SWCWXIDJ.js} +103 -8
  5. package/dist/chunk-SWCWXIDJ.js.map +1 -0
  6. package/dist/docs/SKILL.md +1 -1
  7. package/dist/docs/assets/SOURCE_MAP.json +39 -39
  8. package/dist/index.cjs +12 -12
  9. package/dist/index.js +4 -4
  10. package/dist/{observational-memory-HBQCXPBU.cjs → observational-memory-4VT6QEB7.cjs} +26 -26
  11. package/dist/{observational-memory-HBQCXPBU.cjs.map → observational-memory-4VT6QEB7.cjs.map} +1 -1
  12. package/dist/{observational-memory-WOEVNCG4.js → observational-memory-74TRS2R6.js} +3 -3
  13. package/dist/{observational-memory-WOEVNCG4.js.map → observational-memory-74TRS2R6.js.map} +1 -1
  14. package/dist/processors/index.cjs +24 -24
  15. package/dist/processors/index.js +1 -1
  16. package/dist/processors/observational-memory/observation-strategies/async-buffer.d.ts.map +1 -1
  17. package/dist/processors/observational-memory/observation-strategies/sync.d.ts.map +1 -1
  18. package/dist/processors/observational-memory/observation-turn/step.d.ts.map +1 -1
  19. package/dist/processors/observational-memory/observation-turn/types.d.ts +3 -0
  20. package/dist/processors/observational-memory/observation-turn/types.d.ts.map +1 -1
  21. package/dist/processors/observational-memory/observational-memory.d.ts.map +1 -1
  22. package/dist/processors/observational-memory/observer-runner.d.ts +21 -0
  23. package/dist/processors/observational-memory/observer-runner.d.ts.map +1 -1
  24. package/dist/processors/observational-memory/processor.d.ts.map +1 -1
  25. package/dist/processors/observational-memory/repro-capture.d.ts +2 -0
  26. package/dist/processors/observational-memory/repro-capture.d.ts.map +1 -1
  27. package/package.json +5 -5
  28. package/dist/chunk-O3KNDDJV.cjs.map +0 -1
  29. package/dist/chunk-ZVRY34YB.js.map +0 -1
@@ -1399,8 +1399,6 @@ var SyncObservationStrategy = class extends ObservationStrategy {
1399
1399
  }
1400
1400
  }
1401
1401
  };
1402
-
1403
- // src/processors/observational-memory/observation-strategies/async-buffer.ts
1404
1402
  var AsyncBufferObservationStrategy = class extends ObservationStrategy {
1405
1403
  startedAt;
1406
1404
  cycleId;
@@ -1491,6 +1489,30 @@ var AsyncBufferObservationStrategy = class extends ObservationStrategy {
1491
1489
  lastBufferedAtTime: processed.lastObservedAt
1492
1490
  });
1493
1491
  await this.indexObservationGroups(processed.observations, threadId, resourceId, processed.lastObservedAt);
1492
+ const newTitle = processed.threadTitle?.trim();
1493
+ if (newTitle && newTitle.length >= 3) {
1494
+ const thread = await this.storage.getThreadById({ threadId });
1495
+ if (thread) {
1496
+ const oldTitle = thread.title?.trim();
1497
+ if (newTitle !== oldTitle) {
1498
+ const newMetadata = setThreadOMMetadata(thread.metadata, {
1499
+ threadTitle: processed.threadTitle
1500
+ });
1501
+ await this.storage.updateThread({
1502
+ id: threadId,
1503
+ title: newTitle,
1504
+ metadata: newMetadata
1505
+ });
1506
+ const marker = createThreadUpdateMarker({
1507
+ cycleId: this.cycleId,
1508
+ threadId,
1509
+ oldTitle,
1510
+ newTitle
1511
+ });
1512
+ await this.streamMarker(marker);
1513
+ }
1514
+ }
1515
+ }
1494
1516
  }
1495
1517
  async emitEndMarkers(_cycleId, processed) {
1496
1518
  if (!processed.observations || !this.opts.writer) return;
@@ -1945,6 +1967,7 @@ var ObservationStep = class {
1945
1967
  let buffered = false;
1946
1968
  let reflected = false;
1947
1969
  let didThresholdCleanup = false;
1970
+ let observerExchange;
1948
1971
  if (this.stepNumber === 0) {
1949
1972
  const step0Messages = messageList.get.all.db();
1950
1973
  const activation = await om.activate({
@@ -2043,6 +2066,7 @@ var ObservationStep = class {
2043
2066
  if (statusSnapshot.shouldObserve && !hasIncompleteToolCalls) {
2044
2067
  const preObsGeneration = this.turn.record.generationCount;
2045
2068
  const obsResult = await this.runThresholdObservation();
2069
+ observerExchange = obsResult.observerExchange;
2046
2070
  if (obsResult.succeeded) {
2047
2071
  observed = true;
2048
2072
  didThresholdCleanup = true;
@@ -2096,6 +2120,7 @@ var ObservationStep = class {
2096
2120
  }
2097
2121
  this._context = {
2098
2122
  systemMessage,
2123
+ observerExchange,
2099
2124
  activated,
2100
2125
  observed,
2101
2126
  buffered,
@@ -2163,7 +2188,11 @@ var ObservationStep = class {
2163
2188
  writer: this.turn.writer,
2164
2189
  observabilityContext: this.turn.observabilityContext
2165
2190
  });
2166
- return { succeeded: obsResult.observed, record: obsResult.record };
2191
+ return {
2192
+ succeeded: obsResult.observed,
2193
+ record: obsResult.record,
2194
+ observerExchange: om.observer.lastExchange
2195
+ };
2167
2196
  }
2168
2197
  };
2169
2198
 
@@ -3489,6 +3518,8 @@ var ObserverRunner = class {
3489
3518
  observedMessageIds;
3490
3519
  resolveModel;
3491
3520
  tokenCounter;
3521
+ /** Captured prompt/response from the last observer call (for repro capture). */
3522
+ lastExchange;
3492
3523
  constructor(opts) {
3493
3524
  this.observationConfig = opts.observationConfig;
3494
3525
  this.observedMessageIds = opts.observedMessageIds;
@@ -3564,15 +3595,38 @@ var ObserverRunner = class {
3564
3595
  };
3565
3596
  let result = await doGenerate();
3566
3597
  let parsed = parseObserverOutput(result.text);
3598
+ let retriedDueToDegenerate = false;
3567
3599
  if (parsed.degenerate) {
3568
3600
  omDebug(`[OM:callObserver] degenerate repetition detected, retrying once`);
3569
3601
  result = await doGenerate();
3570
3602
  parsed = parseObserverOutput(result.text);
3603
+ retriedDueToDegenerate = true;
3571
3604
  if (parsed.degenerate) {
3572
3605
  omDebug(`[OM:callObserver] degenerate repetition on retry, failing`);
3573
3606
  throw new Error("Observer produced degenerate output after retry");
3574
3607
  }
3575
3608
  }
3609
+ const systemPrompt = buildObserverSystemPrompt(
3610
+ false,
3611
+ this.observationConfig.instruction,
3612
+ this.observationConfig.threadTitle
3613
+ );
3614
+ this.lastExchange = {
3615
+ systemPrompt,
3616
+ observerMessages,
3617
+ rawOutput: result.text,
3618
+ parsedResult: {
3619
+ observations: parsed.observations,
3620
+ currentTask: parsed.currentTask,
3621
+ suggestedContinuation: parsed.suggestedContinuation,
3622
+ threadTitle: parsed.threadTitle,
3623
+ degenerate: parsed.degenerate
3624
+ },
3625
+ model: String(resolvedModel.model),
3626
+ inputTokens,
3627
+ isMultiThread: false,
3628
+ retriedDueToDegenerate
3629
+ };
3576
3630
  const usage = result.totalUsage ?? result.usage;
3577
3631
  return {
3578
3632
  observations: parsed.observations,
@@ -3639,15 +3693,36 @@ var ObserverRunner = class {
3639
3693
  };
3640
3694
  let result = await doGenerate();
3641
3695
  let parsed = parseMultiThreadObserverOutput(result.text);
3696
+ let retriedDueToDegenerate = false;
3642
3697
  if (parsed.degenerate) {
3643
3698
  omDebug(`[OM:callMultiThreadObserver] degenerate repetition detected, retrying once`);
3644
3699
  result = await doGenerate();
3645
3700
  parsed = parseMultiThreadObserverOutput(result.text);
3701
+ retriedDueToDegenerate = true;
3646
3702
  if (parsed.degenerate) {
3647
3703
  omDebug(`[OM:callMultiThreadObserver] degenerate repetition on retry, failing`);
3648
3704
  throw new Error("Multi-thread observer produced degenerate output after retry");
3649
3705
  }
3650
3706
  }
3707
+ const systemPrompt = buildObserverSystemPrompt(
3708
+ true,
3709
+ this.observationConfig.instruction,
3710
+ this.observationConfig.threadTitle
3711
+ );
3712
+ this.lastExchange = {
3713
+ systemPrompt,
3714
+ observerMessages,
3715
+ rawOutput: result.text,
3716
+ parsedResult: {
3717
+ observations: Array.from(parsed.threads.values()).map((t) => t.observations).join("\n"),
3718
+ threadTitle: Array.from(parsed.threads.values()).map((t) => t.threadTitle).filter(Boolean).join(", "),
3719
+ degenerate: parsed.degenerate
3720
+ },
3721
+ model: String(resolvedModel.model),
3722
+ inputTokens,
3723
+ isMultiThread: true,
3724
+ retriedDueToDegenerate
3725
+ };
3651
3726
  const results = /* @__PURE__ */ new Map();
3652
3727
  for (const [threadId, threadResult] of parsed.threads) {
3653
3728
  results.set(threadId, {
@@ -7796,13 +7871,18 @@ ${grouped}` : grouped;
7796
7871
  const activatedChunks = freshChunks.filter((c) => activationResult.activatedCycleIds.includes(c.cycleId));
7797
7872
  const lastActivated = activatedChunks[activatedChunks.length - 1];
7798
7873
  if (lastActivated) {
7874
+ const chunkThreadTitle = lastActivated.threadTitle;
7799
7875
  const newMetadata = setThreadOMMetadata(thread.metadata, {
7800
7876
  suggestedResponse: lastActivated.suggestedContinuation,
7801
- currentTask: lastActivated.currentTask
7877
+ currentTask: lastActivated.currentTask,
7878
+ threadTitle: chunkThreadTitle
7802
7879
  });
7880
+ const oldTitle = thread.title?.trim();
7881
+ const newTitle = chunkThreadTitle?.trim();
7882
+ const shouldUpdateThreadTitle = !!newTitle && newTitle.length >= 3 && newTitle !== oldTitle;
7803
7883
  await this.storage.updateThread({
7804
7884
  id: threadId,
7805
- title: thread.title ?? "",
7885
+ title: shouldUpdateThreadTitle ? newTitle : thread.title ?? "",
7806
7886
  metadata: newMetadata
7807
7887
  });
7808
7888
  }
@@ -8237,6 +8317,20 @@ function writeProcessInputStepReproCapture(params) {
8237
8317
  `
8238
8318
  );
8239
8319
  }
8320
+ if (params.observerExchange) {
8321
+ const serialized = safeCaptureJsonOrError(params.observerExchange);
8322
+ if (serialized.ok) {
8323
+ writeFileSync(join(captureDir, "observer-exchange.json"), `${JSON.stringify(serialized.value, null, 2)}
8324
+ `);
8325
+ } else {
8326
+ captureErrors.push({ fileName: "observer-exchange.json", error: serialized.error });
8327
+ writeFileSync(
8328
+ join(captureDir, "observer-exchange.json"),
8329
+ `${JSON.stringify({ __captureError: serialized.error }, null, 2)}
8330
+ `
8331
+ );
8332
+ }
8333
+ }
8240
8334
  if (captureErrors.length > 0) {
8241
8335
  writeFileSync(join(captureDir, "capture-error.json"), `${JSON.stringify(captureErrors, null, 2)}
8242
8336
  `);
@@ -8401,7 +8495,8 @@ var ObservationalMemoryProcessor = class {
8401
8495
  postBufferedChunks: [],
8402
8496
  postContextTokenCount: finalTotalPending,
8403
8497
  messageList,
8404
- details: {}
8498
+ details: {},
8499
+ observerExchange: ctx.observerExchange
8405
8500
  });
8406
8501
  }
8407
8502
  }
@@ -8464,5 +8559,5 @@ function getObservationsAsOf(activeObservations, asOf) {
8464
8559
  }
8465
8560
 
8466
8561
  export { ModelByInputTokens, OBSERVER_SYSTEM_PROMPT, ObservationalMemory, ObservationalMemoryProcessor, TokenCounter, buildObserverPrompt, buildObserverSystemPrompt, combineObservationGroupRanges, deriveObservationGroupProvenance, extractCurrentTask, formatMessagesForObserver, formatToolResultForObserver, getObservationsAsOf, hasCurrentTaskSection, injectAnchorIds, optimizeObservationsForContext, parseAnchorId, parseObservationGroups, parseObserverOutput, reconcileObservationGroupsFromReflection, renderObservationGroupsForReflection, resolveToolResultValue, stripEphemeralAnchorIds, stripObservationGroups, truncateStringByTokens, wrapInObservationGroup };
8467
- //# sourceMappingURL=chunk-ZVRY34YB.js.map
8468
- //# sourceMappingURL=chunk-ZVRY34YB.js.map
8562
+ //# sourceMappingURL=chunk-SWCWXIDJ.js.map
8563
+ //# sourceMappingURL=chunk-SWCWXIDJ.js.map