@mastra/memory 1.17.0 → 1.17.1

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 (72) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/{chunk-MPBMHIAQ.js → chunk-7742VTN5.js} +100 -44
  3. package/dist/chunk-7742VTN5.js.map +1 -0
  4. package/dist/{chunk-5MTY2UYL.cjs → chunk-J2XQSPAB.cjs} +100 -44
  5. package/dist/chunk-J2XQSPAB.cjs.map +1 -0
  6. package/dist/{constants-HXOCZPB7.cjs → constants-PJXB7ZIS.cjs} +2 -2
  7. package/dist/{constants-HXOCZPB7.cjs.map → constants-PJXB7ZIS.cjs.map} +1 -1
  8. package/dist/{constants-BDOITAO3.js → constants-XEHPYRDJ.js} +2 -2
  9. package/dist/{constants-BDOITAO3.js.map → constants-XEHPYRDJ.js.map} +1 -1
  10. package/dist/docs/SKILL.md +1 -1
  11. package/dist/docs/assets/SOURCE_MAP.json +39 -39
  12. package/dist/docs/references/docs-memory-working-memory.md +1 -1
  13. package/dist/index.cjs +785 -384
  14. package/dist/index.cjs.map +1 -1
  15. package/dist/index.js +776 -375
  16. package/dist/index.js.map +1 -1
  17. package/dist/{observational-memory-UCFGVLVW.cjs → observational-memory-ISRI7QGE.cjs} +26 -26
  18. package/dist/{observational-memory-UCFGVLVW.cjs.map → observational-memory-ISRI7QGE.cjs.map} +1 -1
  19. package/dist/{observational-memory-7YYZIIX4.js → observational-memory-YYO73QMY.js} +3 -3
  20. package/dist/{observational-memory-7YYZIIX4.js.map → observational-memory-YYO73QMY.js.map} +1 -1
  21. package/dist/processors/index.cjs +24 -24
  22. package/dist/processors/index.js +1 -1
  23. package/dist/processors/observational-memory/observation-strategies/async-buffer.d.ts.map +1 -1
  24. package/dist/processors/observational-memory/observation-strategies/base.d.ts.map +1 -1
  25. package/dist/processors/observational-memory/observation-turn/step.d.ts.map +1 -1
  26. package/dist/processors/observational-memory/observation-turn/turn.d.ts +3 -2
  27. package/dist/processors/observational-memory/observation-turn/turn.d.ts.map +1 -1
  28. package/dist/processors/observational-memory/observation-turn/types.d.ts +1 -0
  29. package/dist/processors/observational-memory/observation-turn/types.d.ts.map +1 -1
  30. package/dist/processors/observational-memory/observational-memory.d.ts.map +1 -1
  31. package/dist/processors/observational-memory/processor.d.ts.map +1 -1
  32. package/dist/processors/observational-memory/reflector-runner.d.ts +1 -0
  33. package/dist/processors/observational-memory/reflector-runner.d.ts.map +1 -1
  34. package/package.json +10 -10
  35. package/dist/chunk-3PUO6DLX.js +0 -439
  36. package/dist/chunk-3PUO6DLX.js.map +0 -1
  37. package/dist/chunk-5MTY2UYL.cjs.map +0 -1
  38. package/dist/chunk-CK4U3AYR.cjs +0 -84
  39. package/dist/chunk-CK4U3AYR.cjs.map +0 -1
  40. package/dist/chunk-DAJJSFVA.cjs +0 -441
  41. package/dist/chunk-DAJJSFVA.cjs.map +0 -1
  42. package/dist/chunk-DGUM43GV.js +0 -10
  43. package/dist/chunk-DGUM43GV.js.map +0 -1
  44. package/dist/chunk-EQ4M72KU.js +0 -439
  45. package/dist/chunk-EQ4M72KU.js.map +0 -1
  46. package/dist/chunk-IDRQZVB4.cjs +0 -84
  47. package/dist/chunk-IDRQZVB4.cjs.map +0 -1
  48. package/dist/chunk-JEQ2X3Z6.cjs +0 -12
  49. package/dist/chunk-JEQ2X3Z6.cjs.map +0 -1
  50. package/dist/chunk-MPBMHIAQ.js.map +0 -1
  51. package/dist/chunk-RC6RZVYE.js +0 -79
  52. package/dist/chunk-RC6RZVYE.js.map +0 -1
  53. package/dist/chunk-SVPZMV27.js +0 -79
  54. package/dist/chunk-SVPZMV27.js.map +0 -1
  55. package/dist/chunk-ZD3BKU5O.cjs +0 -441
  56. package/dist/chunk-ZD3BKU5O.cjs.map +0 -1
  57. package/dist/token-APYSY3BW-2DN6RAUY.js +0 -61
  58. package/dist/token-APYSY3BW-2DN6RAUY.js.map +0 -1
  59. package/dist/token-APYSY3BW-POD4OUWN.cjs +0 -63
  60. package/dist/token-APYSY3BW-POD4OUWN.cjs.map +0 -1
  61. package/dist/token-APYSY3BW-YTVQELJT.js +0 -61
  62. package/dist/token-APYSY3BW-YTVQELJT.js.map +0 -1
  63. package/dist/token-APYSY3BW-ZQ7TMBY7.cjs +0 -63
  64. package/dist/token-APYSY3BW-ZQ7TMBY7.cjs.map +0 -1
  65. package/dist/token-util-RMHT2CPJ-6TGPE335.cjs +0 -10
  66. package/dist/token-util-RMHT2CPJ-6TGPE335.cjs.map +0 -1
  67. package/dist/token-util-RMHT2CPJ-77HHGIQN.cjs +0 -10
  68. package/dist/token-util-RMHT2CPJ-77HHGIQN.cjs.map +0 -1
  69. package/dist/token-util-RMHT2CPJ-RJEA3FAN.js +0 -8
  70. package/dist/token-util-RMHT2CPJ-RJEA3FAN.js.map +0 -1
  71. package/dist/token-util-RMHT2CPJ-WJZ2SYAR.js +0 -8
  72. package/dist/token-util-RMHT2CPJ-WJZ2SYAR.js.map +0 -1
@@ -1095,9 +1095,11 @@ var ObservationStrategy = class _ObservationStrategy {
1095
1095
  }
1096
1096
  async streamMarker(marker) {
1097
1097
  if (this.opts.writer) {
1098
- await this.opts.writer.custom(marker).catch(() => {
1098
+ await this.opts.writer.custom({ ...marker, transient: true }).catch(() => {
1099
1099
  });
1100
1100
  }
1101
+ const markerThreadId = marker.data?.threadId ?? this.opts.threadId;
1102
+ await this.persistMarkerToStorage(marker, markerThreadId, this.opts.resourceId);
1101
1103
  }
1102
1104
  getObservationMarkerConfig() {
1103
1105
  return {
@@ -1603,7 +1605,7 @@ var AsyncBufferObservationStrategy = class extends ObservationStrategy {
1603
1605
  }
1604
1606
  }
1605
1607
  async emitEndMarkers(_cycleId, processed) {
1606
- if (!processed.observations || !this.opts.writer) return;
1608
+ if (!processed.observations) return;
1607
1609
  const { record, threadId, messages } = this.opts;
1608
1610
  const tokensBuffered = await this.tokenCounter.countMessagesAsync(messages);
1609
1611
  const updatedRecord = await this.storage.getObservationalMemory(record.threadId, record.resourceId);
@@ -1619,12 +1621,13 @@ var AsyncBufferObservationStrategy = class extends ObservationStrategy {
1619
1621
  threadId,
1620
1622
  observations: processed.observations
1621
1623
  });
1622
- void this.opts.writer.custom(endMarker).catch(() => {
1623
- });
1624
+ if (this.opts.writer) {
1625
+ void this.opts.writer.custom({ ...endMarker, transient: true }).catch(() => {
1626
+ });
1627
+ }
1624
1628
  await this.persistMarkerToStorage(endMarker, threadId, record.resourceId ?? void 0);
1625
1629
  }
1626
1630
  async emitFailedMarkers(_cycleId, error) {
1627
- if (!this.opts.writer) return;
1628
1631
  const { record, threadId, messages } = this.opts;
1629
1632
  const tokensAttempted = await this.tokenCounter.countMessagesAsync(messages);
1630
1633
  const failedMarker = createBufferingFailedMarker({
@@ -1636,8 +1639,10 @@ var AsyncBufferObservationStrategy = class extends ObservationStrategy {
1636
1639
  recordId: record.id,
1637
1640
  threadId
1638
1641
  });
1639
- void this.opts.writer.custom(failedMarker).catch(() => {
1640
- });
1642
+ if (this.opts.writer) {
1643
+ void this.opts.writer.custom({ ...failedMarker, transient: true }).catch(() => {
1644
+ });
1645
+ }
1641
1646
  await this.persistMarkerToStorage(failedMarker, threadId, record.resourceId ?? void 0);
1642
1647
  }
1643
1648
  };
@@ -2102,7 +2107,11 @@ var ObservationStep = class {
2102
2107
  }
2103
2108
  const allMsgsForToolCheck = messageList.get.all.db();
2104
2109
  const lastMessage = allMsgsForToolCheck[allMsgsForToolCheck.length - 1];
2105
- const latestStepParts = getLatestStepParts(lastMessage?.content?.parts ?? []);
2110
+ const pendingStepMessages = [...messageList.get.input.db(), ...messageList.get.response.db()];
2111
+ const latestStepParts = [
2112
+ ...getLatestStepParts(lastMessage?.content?.parts ?? []),
2113
+ ...pendingStepMessages.flatMap((msg) => getLatestStepParts(msg.content?.parts ?? []))
2114
+ ];
2106
2115
  const hasIncompleteToolCalls = latestStepParts.some(
2107
2116
  (part) => part?.type === "tool-invocation" && part.toolInvocation?.state === "call"
2108
2117
  );
@@ -2289,6 +2298,31 @@ var ObservationStep = class {
2289
2298
  writer: this.turn.writer,
2290
2299
  observabilityContext: this.turn.observabilityContext
2291
2300
  });
2301
+ if (obsResult.observed) {
2302
+ const observedMessageIds = new Set(obsResult.record.observedMessageIds ?? []);
2303
+ const liveMessages = messageList.get.all.db();
2304
+ let latestObservedIndex = -1;
2305
+ for (let i = liveMessages.length - 1; i >= 0; i--) {
2306
+ const message = liveMessages[i];
2307
+ if (message && observedMessageIds.has(message.id)) {
2308
+ latestObservedIndex = i;
2309
+ break;
2310
+ }
2311
+ }
2312
+ const messageToSeal = latestObservedIndex >= 0 ? liveMessages[latestObservedIndex] : void 0;
2313
+ const messagesToSeal = messageToSeal ? [messageToSeal] : [];
2314
+ om.sealMessagesForBuffering(messagesToSeal);
2315
+ try {
2316
+ await this.turn.hooks?.onSyncObservationComplete?.();
2317
+ } catch (error) {
2318
+ omDebug(
2319
+ `[OM:observe] onSyncObservationComplete hook failed: ${error instanceof Error ? error.message : String(error)}`
2320
+ );
2321
+ }
2322
+ if (messagesToSeal.length > 0) {
2323
+ await om.persistMessages(messagesToSeal, threadId, resourceId);
2324
+ }
2325
+ }
2292
2326
  return {
2293
2327
  succeeded: obsResult.observed,
2294
2328
  record: obsResult.record,
@@ -2316,7 +2350,7 @@ var ObservationTurn = class {
2316
2350
  observabilityContext;
2317
2351
  /** Current actor model for this step. Updated by the processor before prepare(). */
2318
2352
  actorModelContext;
2319
- /** Optional processor-provided hooks for turn/step lifecycle integration. */
2353
+ /** Processor-provided hooks for turn/step lifecycle integration. */
2320
2354
  hooks;
2321
2355
  constructor(opts) {
2322
2356
  this.om = opts.om;
@@ -2324,7 +2358,7 @@ var ObservationTurn = class {
2324
2358
  this.resourceId = opts.resourceId;
2325
2359
  this.messageList = opts.messageList;
2326
2360
  this.observabilityContext = opts.observabilityContext;
2327
- this.hooks = opts.hooks;
2361
+ this.hooks = opts.hooks ?? {};
2328
2362
  }
2329
2363
  om;
2330
2364
  threadId;
@@ -2344,6 +2378,10 @@ var ObservationTurn = class {
2344
2378
  get currentStep() {
2345
2379
  return this._currentStep;
2346
2380
  }
2381
+ addHooks(hooks) {
2382
+ if (!hooks) return;
2383
+ Object.assign(this.hooks, hooks);
2384
+ }
2347
2385
  /**
2348
2386
  * Load context and cache the record. Call once at the start of the turn.
2349
2387
  *
@@ -4413,8 +4451,9 @@ var ReflectorRunner = class {
4413
4451
  recordId: streamContext.recordId,
4414
4452
  threadId: streamContext.threadId
4415
4453
  });
4416
- await streamContext.writer.custom(failedMarker).catch(() => {
4454
+ await streamContext.writer.custom({ ...failedMarker, transient: true }).catch(() => {
4417
4455
  });
4456
+ await this.persistMarkerToStorage(failedMarker, streamContext.threadId, streamContext.resourceId);
4418
4457
  const retryCycleId = crypto.randomUUID();
4419
4458
  streamContext.cycleId = retryCycleId;
4420
4459
  const startMarker = createObservationStartMarker({
@@ -4427,8 +4466,9 @@ var ReflectorRunner = class {
4427
4466
  config: this.getObservationMarkerConfig()
4428
4467
  });
4429
4468
  streamContext.startedAt = startMarker.data.startedAt;
4430
- await streamContext.writer.custom(startMarker).catch(() => {
4469
+ await streamContext.writer.custom({ ...startMarker, transient: true }).catch(() => {
4431
4470
  });
4471
+ await this.persistMarkerToStorage(startMarker, streamContext.threadId, streamContext.resourceId);
4432
4472
  }
4433
4473
  currentLevel = Math.min(currentLevel + 1, maxLevel);
4434
4474
  }
@@ -4465,7 +4505,7 @@ var ReflectorRunner = class {
4465
4505
  recordId: record.id,
4466
4506
  threadId: record.threadId ?? ""
4467
4507
  });
4468
- void writer.custom(failedMarker).catch(() => {
4508
+ void writer.custom({ ...failedMarker, transient: true }).catch(() => {
4469
4509
  });
4470
4510
  await this.persistMarkerToStorage(failedMarker, record.threadId ?? "", record.resourceId ?? void 0);
4471
4511
  }
@@ -4523,8 +4563,13 @@ var ReflectorRunner = class {
4523
4563
  threadIds: record.threadId ? [record.threadId] : [],
4524
4564
  config: this.getObservationMarkerConfig(currentRecord)
4525
4565
  });
4526
- void writer.custom(startMarker).catch(() => {
4566
+ void writer.custom({ ...startMarker, transient: true }).catch(() => {
4527
4567
  });
4568
+ await this.persistMarkerToStorage(
4569
+ startMarker,
4570
+ currentRecord.threadId ?? "",
4571
+ currentRecord.resourceId ?? void 0
4572
+ );
4528
4573
  }
4529
4574
  const compressionStartLevel = await this.getCompressionStartLevel(requestContext);
4530
4575
  const reflectResult = await this.call(
@@ -4563,7 +4608,7 @@ var ReflectorRunner = class {
4563
4608
  threadId: currentRecord.threadId ?? "",
4564
4609
  observations: reflectResult.observations
4565
4610
  });
4566
- void writer.custom(endMarker).catch(() => {
4611
+ void writer.custom({ ...endMarker, transient: true }).catch(() => {
4567
4612
  });
4568
4613
  await this.persistMarkerToStorage(endMarker, currentRecord.threadId ?? "", currentRecord.resourceId ?? void 0);
4569
4614
  }
@@ -4662,7 +4707,7 @@ ${unreflectedContent}` : freshRecord.bufferedReflection;
4662
4707
  currentModel: activationMetadata?.currentModel,
4663
4708
  config: this.getObservationMarkerConfig(freshRecord)
4664
4709
  });
4665
- void writer.custom(activationMarker).catch(() => {
4710
+ void writer.custom({ ...activationMarker, transient: true }).catch(() => {
4666
4711
  });
4667
4712
  await this.persistMarkerToMessage(
4668
4713
  activationMarker,
@@ -4801,8 +4846,9 @@ ${unreflectedContent}` : freshRecord.bufferedReflection;
4801
4846
  threadIds: [threadId],
4802
4847
  config: this.getObservationMarkerConfig(record)
4803
4848
  });
4804
- await writer.custom(startMarker).catch(() => {
4849
+ await writer.custom({ ...startMarker, transient: true }).catch(() => {
4805
4850
  });
4851
+ await this.persistMarkerToStorage(startMarker, threadId, record.resourceId ?? void 0);
4806
4852
  }
4807
4853
  this.emitDebugEvent({
4808
4854
  type: "reflection_triggered",
@@ -4817,7 +4863,8 @@ ${unreflectedContent}` : freshRecord.bufferedReflection;
4817
4863
  cycleId,
4818
4864
  startedAt,
4819
4865
  recordId: record.id,
4820
- threadId
4866
+ threadId,
4867
+ resourceId: record.resourceId ?? void 0
4821
4868
  } : void 0;
4822
4869
  let reflectionUsage;
4823
4870
  let reflectionError;
@@ -4852,8 +4899,9 @@ ${unreflectedContent}` : freshRecord.bufferedReflection;
4852
4899
  recordId: record.id,
4853
4900
  threadId
4854
4901
  });
4855
- await writer.custom(endMarker).catch(() => {
4902
+ await writer.custom({ ...endMarker, transient: true }).catch(() => {
4856
4903
  });
4904
+ await this.persistMarkerToStorage(endMarker, threadId, record.resourceId ?? void 0);
4857
4905
  }
4858
4906
  this.emitDebugEvent({
4859
4907
  type: "reflection_complete",
@@ -4876,8 +4924,9 @@ ${unreflectedContent}` : freshRecord.bufferedReflection;
4876
4924
  recordId: record.id,
4877
4925
  threadId
4878
4926
  });
4879
- await writer.custom(failedMarker).catch(() => {
4927
+ await writer.custom({ ...failedMarker, transient: true }).catch(() => {
4880
4928
  });
4929
+ await this.persistMarkerToStorage(failedMarker, threadId, record.resourceId ?? void 0);
4881
4930
  }
4882
4931
  reflectionError = error instanceof Error ? error : new Error(String(error));
4883
4932
  if (abortSignal?.aborted) {
@@ -7806,17 +7855,18 @@ ${grouped}` : grouped;
7806
7855
  const cycleId = `buffer-obs-${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;
7807
7856
  const startedAt = (/* @__PURE__ */ new Date()).toISOString();
7808
7857
  const tokensToBuffer = await this.tokenCounter.countMessagesAsync(messagesToBuffer);
7858
+ const startMarker = createBufferingStartMarker({
7859
+ cycleId,
7860
+ operationType: "observation",
7861
+ tokensToBuffer,
7862
+ recordId: freshRecord.id,
7863
+ threadId,
7864
+ threadIds: [threadId],
7865
+ config: this.getObservationMarkerConfig()
7866
+ });
7867
+ await this.persistMarkerToStorage(startMarker, threadId, freshRecord.resourceId ?? void 0);
7809
7868
  if (writer) {
7810
- const startMarker = createBufferingStartMarker({
7811
- cycleId,
7812
- operationType: "observation",
7813
- tokensToBuffer,
7814
- recordId: freshRecord.id,
7815
- threadId,
7816
- threadIds: [threadId],
7817
- config: this.getObservationMarkerConfig()
7818
- });
7819
- void writer.custom(startMarker).catch(() => {
7869
+ void writer.custom({ ...startMarker, transient: true }).catch(() => {
7820
7870
  });
7821
7871
  }
7822
7872
  omDebug(
@@ -8476,18 +8526,19 @@ ${grouped}` : grouped;
8476
8526
  }
8477
8527
  const cycleId = `buffer-obs-${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;
8478
8528
  const startedAt = (/* @__PURE__ */ new Date()).toISOString();
8529
+ const startMarker = createBufferingStartMarker({
8530
+ cycleId,
8531
+ operationType: "observation",
8532
+ tokensToBuffer: newTokens,
8533
+ recordId: record.id,
8534
+ threadId,
8535
+ threadIds: [threadId],
8536
+ config: this.getObservationMarkerConfig()
8537
+ });
8538
+ await this.persistMarkerToStorage(startMarker, threadId, record.resourceId ?? void 0);
8479
8539
  const writer = opts.writer;
8480
8540
  if (writer) {
8481
- const startMarker = createBufferingStartMarker({
8482
- cycleId,
8483
- operationType: "observation",
8484
- tokensToBuffer: newTokens,
8485
- recordId: record.id,
8486
- threadId,
8487
- threadIds: [threadId],
8488
- config: this.getObservationMarkerConfig()
8489
- });
8490
- void writer.custom(startMarker).catch(() => {
8541
+ void writer.custom({ ...startMarker, transient: true }).catch(() => {
8491
8542
  });
8492
8543
  }
8493
8544
  await ObservationStrategy.create(this, {
@@ -8680,7 +8731,7 @@ ${grouped}` : grouped;
8680
8731
  currentModel,
8681
8732
  config: this.getObservationMarkerConfig()
8682
8733
  });
8683
- void opts.writer.custom(activationMarker).catch(() => {
8734
+ void opts.writer.custom({ ...activationMarker, transient: true }).catch(() => {
8684
8735
  });
8685
8736
  await this.persistMarkerToMessage(
8686
8737
  activationMarker,
@@ -9131,7 +9182,8 @@ var ObservationalMemoryProcessor = class {
9131
9182
  messageList,
9132
9183
  observabilityContext: getOmObservabilityContext(args),
9133
9184
  hooks: {
9134
- onBufferChunkSealed: rotateResponseMessageId
9185
+ onBufferChunkSealed: rotateResponseMessageId,
9186
+ onSyncObservationComplete: rotateResponseMessageId
9135
9187
  }
9136
9188
  });
9137
9189
  this.turn.writer = writer;
@@ -9142,6 +9194,10 @@ var ObservationalMemoryProcessor = class {
9142
9194
  }
9143
9195
  state.__omTurn = this.turn;
9144
9196
  }
9197
+ this.turn.addHooks({
9198
+ onBufferChunkSealed: rotateResponseMessageId,
9199
+ onSyncObservationComplete: rotateResponseMessageId
9200
+ });
9145
9201
  const observabilityContext = getOmObservabilityContext(args);
9146
9202
  state.__omObservabilityContext = observabilityContext;
9147
9203
  this.turn.observabilityContext = observabilityContext;
@@ -9304,5 +9360,5 @@ exports.stripEphemeralAnchorIds = stripEphemeralAnchorIds;
9304
9360
  exports.stripObservationGroups = stripObservationGroups;
9305
9361
  exports.truncateStringByTokens = truncateStringByTokens;
9306
9362
  exports.wrapInObservationGroup = wrapInObservationGroup;
9307
- //# sourceMappingURL=chunk-5MTY2UYL.cjs.map
9308
- //# sourceMappingURL=chunk-5MTY2UYL.cjs.map
9363
+ //# sourceMappingURL=chunk-J2XQSPAB.cjs.map
9364
+ //# sourceMappingURL=chunk-J2XQSPAB.cjs.map