@mastra/server 1.56.0-alpha.2 → 1.56.0-alpha.4

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 (139) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/dist/_types/@internal_voice/dist/_types/@internal_core/dist/request-context/index.d.ts +6 -0
  3. package/dist/{a2a-DaFY01Nq.js → a2a-BHqh8DdO.js} +2 -2
  4. package/dist/{a2a-DaFY01Nq.js.map → a2a-BHqh8DdO.js.map} +1 -1
  5. package/dist/{a2a-_ekkh9Eo.cjs → a2a-Dmw3AD3r.cjs} +2 -2
  6. package/dist/{a2a-_ekkh9Eo.cjs.map → a2a-Dmw3AD3r.cjs.map} +1 -1
  7. package/dist/{agent-builder-CaeaWZFr.cjs → agent-builder-BDYN3r89.cjs} +2 -2
  8. package/dist/{agent-builder-CaeaWZFr.cjs.map → agent-builder-BDYN3r89.cjs.map} +1 -1
  9. package/dist/{agent-builder-B077LU0q.js → agent-builder-Dqy_qumV.js} +2 -2
  10. package/dist/{agent-builder-B077LU0q.js.map → agent-builder-Dqy_qumV.js.map} +1 -1
  11. package/dist/{api-schema-manifest-TXvvzJiU.cjs → api-schema-manifest-BD9sVZgj.cjs} +2 -2
  12. package/dist/{api-schema-manifest-TXvvzJiU.cjs.map → api-schema-manifest-BD9sVZgj.cjs.map} +1 -1
  13. package/dist/{api-schema-manifest-BT6M02Lr.js → api-schema-manifest-DOHg_30B.js} +2 -2
  14. package/dist/{api-schema-manifest-BT6M02Lr.js.map → api-schema-manifest-DOHg_30B.js.map} +1 -1
  15. package/dist/{builder-registry-DLAloBZv.cjs → builder-registry-NmiGAW1q.cjs} +2 -2
  16. package/dist/{builder-registry-DLAloBZv.cjs.map → builder-registry-NmiGAW1q.cjs.map} +1 -1
  17. package/dist/{builder-registry-D-6UWXLu.js → builder-registry-dh22nXUR.js} +2 -2
  18. package/dist/{builder-registry-D-6UWXLu.js.map → builder-registry-dh22nXUR.js.map} +1 -1
  19. package/dist/{dist-CgHgmUmP.js → dist-BlHxui7N.js} +183 -33
  20. package/dist/dist-BlHxui7N.js.map +1 -0
  21. package/dist/{dist-3OAfymQm.cjs → dist-D9hQEsv9.cjs} +183 -33
  22. package/dist/dist-D9hQEsv9.cjs.map +1 -0
  23. package/dist/docs/SKILL.md +1 -1
  24. package/dist/docs/assets/SOURCE_MAP.json +1 -1
  25. package/dist/{routes-5DQoCzuO.cjs → routes-Bmt4vUom.cjs} +19 -3
  26. package/dist/routes-Bmt4vUom.cjs.map +1 -0
  27. package/dist/{routes-C_zs_0NM.js → routes-YeBVxmmg.js} +19 -3
  28. package/dist/routes-YeBVxmmg.js.map +1 -0
  29. package/dist/server/fga-permissions.d.ts.map +1 -1
  30. package/dist/server/handlers/a2a.cjs +1 -1
  31. package/dist/server/handlers/a2a.d.ts +4 -4
  32. package/dist/server/handlers/a2a.js +1 -1
  33. package/dist/server/handlers/agent-builder.cjs +4 -4
  34. package/dist/server/handlers/agent-builder.d.ts +35 -5
  35. package/dist/server/handlers/agent-builder.d.ts.map +1 -1
  36. package/dist/server/handlers/agent-builder.js +4 -4
  37. package/dist/server/handlers/agent-versions.cjs +1 -1
  38. package/dist/server/handlers/agent-versions.js +1 -1
  39. package/dist/server/handlers/agents.cjs +2 -2
  40. package/dist/server/handlers/agents.js +2 -2
  41. package/dist/server/handlers/builder-registry.cjs +1 -1
  42. package/dist/server/handlers/builder-registry.js +1 -1
  43. package/dist/server/handlers/conversations.cjs +1 -1
  44. package/dist/server/handlers/conversations.js +1 -1
  45. package/dist/server/handlers/datasets.d.ts +11 -11
  46. package/dist/server/handlers/logs.cjs +1 -1
  47. package/dist/server/handlers/logs.js +1 -1
  48. package/dist/server/handlers/mcp-client-versions.cjs +1 -1
  49. package/dist/server/handlers/mcp-client-versions.js +1 -1
  50. package/dist/server/handlers/memory.cjs +1 -1
  51. package/dist/server/handlers/memory.js +1 -1
  52. package/dist/server/handlers/prompt-block-versions.cjs +1 -1
  53. package/dist/server/handlers/prompt-block-versions.js +1 -1
  54. package/dist/server/handlers/responses.cjs +1 -1
  55. package/dist/server/handlers/responses.js +1 -1
  56. package/dist/server/handlers/responses.storage.cjs +1 -1
  57. package/dist/server/handlers/responses.storage.js +1 -1
  58. package/dist/server/handlers/scorer-versions.cjs +1 -1
  59. package/dist/server/handlers/scorer-versions.js +1 -1
  60. package/dist/server/handlers/stored-agent-favorites.cjs +1 -1
  61. package/dist/server/handlers/stored-agent-favorites.js +1 -1
  62. package/dist/server/handlers/stored-agents.cjs +1 -1
  63. package/dist/server/handlers/stored-agents.js +1 -1
  64. package/dist/server/handlers/stored-mcp-clients.cjs +1 -1
  65. package/dist/server/handlers/stored-mcp-clients.js +1 -1
  66. package/dist/server/handlers/stored-prompt-blocks.cjs +1 -1
  67. package/dist/server/handlers/stored-prompt-blocks.js +1 -1
  68. package/dist/server/handlers/stored-scorers.cjs +1 -1
  69. package/dist/server/handlers/stored-scorers.js +1 -1
  70. package/dist/server/handlers/stored-skill-favorites.cjs +1 -1
  71. package/dist/server/handlers/stored-skill-favorites.js +1 -1
  72. package/dist/server/handlers/stored-skills.cjs +1 -1
  73. package/dist/server/handlers/stored-skills.js +1 -1
  74. package/dist/server/handlers/stored-workflows.cjs +6 -0
  75. package/dist/server/handlers/stored-workflows.d.ts +820 -0
  76. package/dist/server/handlers/stored-workflows.d.ts.map +1 -0
  77. package/dist/server/handlers/stored-workflows.js +2 -0
  78. package/dist/server/handlers/stored-workspaces.cjs +1 -1
  79. package/dist/server/handlers/stored-workspaces.js +1 -1
  80. package/dist/server/handlers/system.cjs +1 -1
  81. package/dist/server/handlers/system.js +1 -1
  82. package/dist/server/handlers/tools.cjs +2 -2
  83. package/dist/server/handlers/tools.js +2 -2
  84. package/dist/server/handlers/utils.cjs +1 -1
  85. package/dist/server/handlers/utils.js +1 -1
  86. package/dist/server/handlers/workflows.cjs +4 -4
  87. package/dist/server/handlers/workflows.cjs.map +1 -1
  88. package/dist/server/handlers/workflows.d.ts +45 -7
  89. package/dist/server/handlers/workflows.d.ts.map +1 -1
  90. package/dist/server/handlers/workflows.js +4 -4
  91. package/dist/server/handlers/workflows.js.map +1 -1
  92. package/dist/server/handlers.cjs +8 -1
  93. package/dist/server/handlers.d.ts +1 -0
  94. package/dist/server/handlers.d.ts.map +1 -1
  95. package/dist/server/handlers.js +3 -2
  96. package/dist/server/schemas/a2a.d.ts +3 -3
  97. package/dist/server/schemas/datasets.d.ts +5 -5
  98. package/dist/server/schemas/index.cjs +2 -2
  99. package/dist/server/schemas/index.js +2 -2
  100. package/dist/server/schemas/stored-workflows.d.ts +614 -0
  101. package/dist/server/schemas/stored-workflows.d.ts.map +1 -0
  102. package/dist/server/schemas/workflows.d.ts +24 -0
  103. package/dist/server/schemas/workflows.d.ts.map +1 -1
  104. package/dist/server/server-adapter/index.cjs +2 -2
  105. package/dist/server/server-adapter/index.js +2 -2
  106. package/dist/server/server-adapter/routes/a2a.d.ts +4 -4
  107. package/dist/server/server-adapter/routes/agent-builder.d.ts +35 -5
  108. package/dist/server/server-adapter/routes/agent-builder.d.ts.map +1 -1
  109. package/dist/server/server-adapter/routes/datasets.d.ts +11 -11
  110. package/dist/server/server-adapter/routes/index.d.ts.map +1 -1
  111. package/dist/server/server-adapter/routes/stored-workflows.d.ts +16 -0
  112. package/dist/server/server-adapter/routes/stored-workflows.d.ts.map +1 -0
  113. package/dist/server/server-adapter/routes/workflows.d.ts +45 -7
  114. package/dist/server/server-adapter/routes/workflows.d.ts.map +1 -1
  115. package/dist/server/utils.d.ts.map +1 -1
  116. package/dist/stored-workflows-B3zZJg8e.js +338 -0
  117. package/dist/stored-workflows-B3zZJg8e.js.map +1 -0
  118. package/dist/stored-workflows-RgQKpn7N.cjs +367 -0
  119. package/dist/stored-workflows-RgQKpn7N.cjs.map +1 -0
  120. package/dist/{utils-BNoVHi8G.cjs → utils-5wLvbOLW.cjs} +4 -2
  121. package/dist/{utils-BNoVHi8G.cjs.map → utils-5wLvbOLW.cjs.map} +1 -1
  122. package/dist/{utils-Bfyc8rsg.js → utils-CmHd1Sgh.js} +3 -1
  123. package/dist/{utils-C1_mI2Ws.cjs.map → utils-CmHd1Sgh.js.map} +1 -1
  124. package/dist/{utils-EZi2K0ph.js → utils-DVelcVp5.js} +4 -2
  125. package/dist/{utils-EZi2K0ph.js.map → utils-DVelcVp5.js.map} +1 -1
  126. package/dist/{utils-C1_mI2Ws.cjs → utils-wTwyTjg3.cjs} +3 -1
  127. package/dist/utils-wTwyTjg3.cjs.map +1 -0
  128. package/dist/{workflows-CiUa_yVU.js → workflows-DPW6FrY0.js} +8 -3
  129. package/dist/workflows-DPW6FrY0.js.map +1 -0
  130. package/dist/{workflows-Bxy77CRQ.cjs → workflows-XfiENvkF.cjs} +8 -3
  131. package/dist/workflows-XfiENvkF.cjs.map +1 -0
  132. package/package.json +7 -7
  133. package/dist/dist-3OAfymQm.cjs.map +0 -1
  134. package/dist/dist-CgHgmUmP.js.map +0 -1
  135. package/dist/routes-5DQoCzuO.cjs.map +0 -1
  136. package/dist/routes-C_zs_0NM.js.map +0 -1
  137. package/dist/utils-Bfyc8rsg.js.map +0 -1
  138. package/dist/workflows-Bxy77CRQ.cjs.map +0 -1
  139. package/dist/workflows-CiUa_yVU.js.map +0 -1
@@ -5961,7 +5961,7 @@ function splitLines(text) {
5961
5961
  return result;
5962
5962
  }
5963
5963
  //#endregion
5964
- //#region ../memory/dist/src-Ci_GvBVm.js
5964
+ //#region ../memory/dist/src-DoNjfXNm.js
5965
5965
  var __defProp$4 = Object.defineProperty;
5966
5966
  var __exportAll = (all, no_symbols) => {
5967
5967
  let target = {};
@@ -21098,13 +21098,19 @@ ${extractorInstructions}${priorLines.length > 0 ? `\n\n## Prior Extracted Values
21098
21098
  * auth, versions, routing hints, and resource id, but they must not present as
21099
21099
  * another run on the parent thread or core's cross-agent thread wait can block
21100
21100
  * on the parent run that is waiting for OM to complete.
21101
+ *
21102
+ * A fresh RequestContext clone is always returned so that memory-scoped writes
21103
+ * made by the internal agent run (e.g. the `MastraMemory` entry that agent.generate
21104
+ * sets from the observer's temporary `structured-observer` memory) cannot leak back
21105
+ * into the parent's RequestContext. Without this isolation the parent's OM turn later
21106
+ * reads the temporary observer's resourceId and injects a continuation message that
21107
+ * fails MessageList's resourceId validation.
21101
21108
  */
21102
21109
  function withOmInternalThreadId(requestContext, omAgentId) {
21103
21110
  if (!requestContext) return void 0;
21104
- const parentThreadId = requestContext.get(_mastra_core_request_context.MASTRA_THREAD_ID_KEY);
21105
- if (typeof parentThreadId !== "string" || !parentThreadId) return requestContext;
21106
21111
  const internalRequestContext = new _mastra_core_request_context.RequestContext(requestContext.entries());
21107
- internalRequestContext.set(_mastra_core_request_context.MASTRA_THREAD_ID_KEY, `${parentThreadId}-${omAgentId}`);
21112
+ const parentThreadId = requestContext.get(_mastra_core_request_context.MASTRA_THREAD_ID_KEY);
21113
+ if (typeof parentThreadId === "string" && parentThreadId) internalRequestContext.set(_mastra_core_request_context.MASTRA_THREAD_ID_KEY, `${parentThreadId}-${omAgentId}`);
21108
21114
  return internalRequestContext;
21109
21115
  }
21110
21116
  const ANCHOR_ID_PATTERN = /^\[(O\d+(?:-N\d+)?)\]\s*/;
@@ -22920,7 +22926,7 @@ var ObserverRunner = class {
22920
22926
  extractors: activeExtractors,
22921
22927
  memory: temporaryMemory?.options,
22922
22928
  priorExtractedValues: options?.priorExtractedValues,
22923
- requestContext: options?.requestContext,
22929
+ requestContext: internalRequestContext,
22924
22930
  observabilityContext: options?.observabilityContext,
22925
22931
  abortSignal
22926
22932
  });
@@ -26652,7 +26658,10 @@ var ObservationStrategy = class ObservationStrategy {
26652
26658
  await this.persistMarkerToStorage(failedMarkerForStorage, threadId, this.opts.resourceId).catch(() => {});
26653
26659
  if (abortSignal?.aborted) throw error;
26654
26660
  omError("[OM] Observation failed", error);
26655
- return { observed: false };
26661
+ return {
26662
+ observed: false,
26663
+ error: error instanceof Error ? error : new Error(String(error))
26664
+ };
26656
26665
  }
26657
26666
  omError("[OM] Observation failed", error);
26658
26667
  throw error;
@@ -27690,7 +27699,12 @@ var ObservationStep = class {
27690
27699
  currentModel: this.turn.actorModelContext,
27691
27700
  requestContext: this.turn.requestContext,
27692
27701
  observabilityContext: this.turn.observabilityContext,
27693
- lastActivityAt: getLastActivityFromMessages(messageList.get.all.db())
27702
+ lastActivityAt: getLastActivityFromMessages(messageList.get.all.db()),
27703
+ reflectionHooks: om.composeHooks(void 0, {
27704
+ threadId,
27705
+ resourceId,
27706
+ trigger: "turn-sync"
27707
+ })
27694
27708
  });
27695
27709
  await this.turn.refreshRecord();
27696
27710
  if (this.turn.record.generationCount > preReflectGeneration) reflected = true;
@@ -27850,7 +27864,12 @@ var ObservationStep = class {
27850
27864
  currentModel: this.turn.actorModelContext,
27851
27865
  requestContext: this.turn.requestContext,
27852
27866
  observabilityContext: this.turn.observabilityContext,
27853
- lastActivityAt: getLastActivityFromMessages(messageList.get.all.db())
27867
+ lastActivityAt: getLastActivityFromMessages(messageList.get.all.db()),
27868
+ reflectionHooks: om.composeHooks(void 0, {
27869
+ threadId,
27870
+ resourceId,
27871
+ trigger: "turn-sync"
27872
+ })
27854
27873
  });
27855
27874
  return {
27856
27875
  succeeded: true,
@@ -27863,6 +27882,7 @@ var ObservationStep = class {
27863
27882
  threadId,
27864
27883
  resourceId,
27865
27884
  messages: messageList.get.all.db(),
27885
+ trigger: "turn-sync",
27866
27886
  requestContext: this.turn.requestContext,
27867
27887
  writer: this.turn.writer,
27868
27888
  observabilityContext: this.turn.observabilityContext
@@ -28646,7 +28666,7 @@ var ReflectorRunner = class {
28646
28666
  extractors: activeExtractors,
28647
28667
  memory: temporaryMemory?.options,
28648
28668
  priorExtractedValues,
28649
- requestContext,
28669
+ requestContext: internalRequestContext,
28650
28670
  observabilityContext,
28651
28671
  abortSignal
28652
28672
  });
@@ -28688,12 +28708,16 @@ var ReflectorRunner = class {
28688
28708
  });
28689
28709
  reflectionHooks?.onReflectionStart?.();
28690
28710
  const asyncOp = this.doAsyncBufferedReflection(record, bufferKey, writer, requestContext, observabilityContext, priorExtractedValues, mainAgent, sendSignal).then((outcome) => {
28691
- reflectionHooks?.onReflectionEnd?.({
28692
- usage: outcome?.usage,
28693
- ...outcome?.providerMetadata ? { providerMetadata: outcome.providerMetadata } : {}
28694
- });
28695
- }).catch(async (error) => {
28696
- if (writer) {
28711
+ try {
28712
+ reflectionHooks?.onReflectionEnd?.({
28713
+ usage: outcome?.usage,
28714
+ ...outcome?.providerMetadata ? { providerMetadata: outcome.providerMetadata } : {}
28715
+ });
28716
+ } catch (hookError) {
28717
+ omError("[OM] onReflectionEnd hook failed after async buffered reflection", hookError);
28718
+ }
28719
+ }, async (error) => {
28720
+ if (writer) try {
28697
28721
  const failedMarker = createBufferingFailedMarker({
28698
28722
  cycleId: `reflect-buf-${Date.now()}-${Math.random().toString(36).slice(2, 11)}`,
28699
28723
  operationType: "reflection",
@@ -28708,12 +28732,18 @@ var ReflectorRunner = class {
28708
28732
  transient: true
28709
28733
  }).catch(() => {});
28710
28734
  await this.persistMarkerToStorage(failedMarker, record.threadId ?? "", record.resourceId ?? void 0);
28735
+ } catch (markerError) {
28736
+ omError("[OM] Failed to persist buffering-failed marker after async buffered reflection failure", markerError);
28711
28737
  }
28712
28738
  omError("[OM] Async buffered reflection failed", error);
28713
- reflectionHooks?.onReflectionEnd?.({
28714
- usage: void 0,
28715
- error: error instanceof Error ? error : new Error(String(error))
28716
- });
28739
+ try {
28740
+ reflectionHooks?.onReflectionEnd?.({
28741
+ usage: void 0,
28742
+ error: error instanceof Error ? error : new Error(String(error))
28743
+ });
28744
+ } catch (hookError) {
28745
+ omError("[OM] onReflectionEnd hook failed after async buffered reflection failure", hookError);
28746
+ }
28717
28747
  BufferingCoordinator.lastBufferedBoundary.delete(bufferKey);
28718
28748
  }).finally(() => {
28719
28749
  BufferingCoordinator.asyncBufferingOps.delete(bufferKey);
@@ -28960,7 +28990,6 @@ var ReflectorRunner = class {
28960
28990
  return;
28961
28991
  }
28962
28992
  }
28963
- reflectionHooks?.onReflectionStart?.();
28964
28993
  await this.storage.setReflectingFlag(record.id, true);
28965
28994
  registerOp(record.id, "reflecting");
28966
28995
  const cycleId = crypto.randomUUID();
@@ -29001,6 +29030,7 @@ var ReflectorRunner = class {
29001
29030
  let reflectionUsage;
29002
29031
  let reflectionProviderMetadata;
29003
29032
  let reflectionError;
29033
+ reflectionHooks?.onReflectionStart?.();
29004
29034
  try {
29005
29035
  const compressionStartLevel = await this.getCompressionStartLevel(requestContext);
29006
29036
  const reflectResult = await this.call(record.activeObservations, void 0, streamContext, reflectThreshold, abortSignal, void 0, compressionStartLevel, requestContext, priorExtractedValues, observabilityContext, void 0, mainAgent, sendSignal);
@@ -29064,12 +29094,15 @@ var ReflectorRunner = class {
29064
29094
  omError("[OM] Reflection failed", error);
29065
29095
  } finally {
29066
29096
  await this.storage.setReflectingFlag(record.id, false);
29067
- reflectionHooks?.onReflectionEnd?.({
29068
- usage: reflectionUsage,
29069
- error: reflectionError,
29070
- ...reflectionProviderMetadata ? { providerMetadata: reflectionProviderMetadata } : {}
29071
- });
29072
- unregisterOp(record.id, "reflecting");
29097
+ try {
29098
+ reflectionHooks?.onReflectionEnd?.({
29099
+ usage: reflectionUsage,
29100
+ error: reflectionError,
29101
+ ...reflectionProviderMetadata ? { providerMetadata: reflectionProviderMetadata } : {}
29102
+ });
29103
+ } finally {
29104
+ unregisterOp(record.id, "reflecting");
29105
+ }
29073
29106
  }
29074
29107
  }
29075
29108
  };
@@ -29518,6 +29551,8 @@ var ObservationalMemory = class ObservationalMemory {
29518
29551
  reflectionConfig;
29519
29552
  onDebugEvent;
29520
29553
  onIndexObservations;
29554
+ /** Config-level lifecycle hooks fired for every observation/reflection cycle. */
29555
+ hooks;
29521
29556
  /** Observer agent runner — handles LLM calls for extracting observations. */
29522
29557
  observer;
29523
29558
  /** Reflector agent runner — handles LLM calls for compressing observations. */
@@ -29578,6 +29613,7 @@ var ObservationalMemory = class ObservationalMemory {
29578
29613
  this.scope = config.scope ?? "thread";
29579
29614
  this.retrieval = Boolean(config.retrieval);
29580
29615
  this.onIndexObservations = config.onIndexObservations;
29616
+ this.hooks = config.hooks;
29581
29617
  this.mastra = config.mastra;
29582
29618
  this.memory = config.memory;
29583
29619
  const resolveModel = (model, defaultModel) => model === "default" ? defaultModel : model;
@@ -30499,7 +30535,11 @@ ${formattedMessages}
30499
30535
  transient: true
30500
30536
  }).catch(() => {});
30501
30537
  omDebug(`[OM:bufferInput] cycleId=${cycleId}, msgCount=${messagesToBuffer.length}, msgTokens=${tokensToBuffer}, ids=${messagesToBuffer.map((m) => `${m.id?.slice(0, 8)}@${m.createdAt ? new Date(m.createdAt).toISOString() : "none"}`).join(",")}`);
30502
- await ObservationStrategy.create(this, {
30538
+ await this.runBufferedObservationCycle({
30539
+ threadId,
30540
+ resourceId: freshRecord.resourceId ?? void 0,
30541
+ trigger: "async-buffer"
30542
+ }, () => ObservationStrategy.create(this, {
30503
30543
  record: freshRecord,
30504
30544
  threadId,
30505
30545
  resourceId: freshRecord.resourceId ?? void 0,
@@ -30509,7 +30549,7 @@ ${formattedMessages}
30509
30549
  writer,
30510
30550
  requestContext,
30511
30551
  observabilityContext
30512
- }).run();
30552
+ }).run());
30513
30553
  const maxTs = this.getMaxMessageTimestamp(messagesToBuffer);
30514
30554
  const cursor = new Date(maxTs.getTime() + 1);
30515
30555
  BufferingCoordinator.lastBufferedAtTime.set(bufferKey, cursor);
@@ -31082,7 +31122,11 @@ ${formattedMessages}
31082
31122
  ...startMarker,
31083
31123
  transient: true
31084
31124
  }).catch(() => {});
31085
- await ObservationStrategy.create(this, {
31125
+ await this.runBufferedObservationCycle({
31126
+ threadId,
31127
+ resourceId: record.resourceId ?? resourceId,
31128
+ trigger: "async-buffer"
31129
+ }, () => ObservationStrategy.create(this, {
31086
31130
  record,
31087
31131
  threadId,
31088
31132
  resourceId: record.resourceId ?? void 0,
@@ -31095,7 +31139,7 @@ ${formattedMessages}
31095
31139
  requestContext,
31096
31140
  currentModel: opts.currentModel,
31097
31141
  observabilityContext
31098
- }).run();
31142
+ }).run());
31099
31143
  if (isOmReproCaptureEnabled()) writeObserverExchangeReproCapture({
31100
31144
  threadId,
31101
31145
  resourceId: record.resourceId ?? void 0,
@@ -31305,6 +31349,88 @@ ${formattedMessages}
31305
31349
  };
31306
31350
  }
31307
31351
  /**
31352
+ * Compose the config-level hooks with optional per-call hooks into a single
31353
+ * `ObserveHooks` object, binding call context onto the config-level
31354
+ * callbacks. Config-level hooks are guarded so a throwing consumer hook can
31355
+ * never fail an observation/reflection cycle; per-call hooks keep their
31356
+ * existing payloads and propagation semantics. Returns undefined when
31357
+ * neither is configured, so call sites stay zero-cost.
31358
+ *
31359
+ * Used internally by every pipeline path (manual observe/reflect,
31360
+ * turn-engine sync observation, async buffering); public only so the
31361
+ * observation turn engine can thread config-level reflection hooks into
31362
+ * reflector calls.
31363
+ *
31364
+ * @internal
31365
+ */
31366
+ composeHooks(callHooks, context) {
31367
+ const configHooks = this.hooks;
31368
+ if (!configHooks) return callHooks;
31369
+ if (!callHooks && !Object.keys(configHooks).length) return void 0;
31370
+ const fireConfigHook = (name, arg) => {
31371
+ const hook = configHooks[name];
31372
+ if (!hook) return;
31373
+ const logHookFailure = (error) => omDebug(`[OM:hooks] config-level ${name} hook failed: ${error instanceof Error ? error.message : String(error)}`);
31374
+ try {
31375
+ const out = hook(arg);
31376
+ if (out && typeof out.then === "function") out.then(void 0, logHookFailure);
31377
+ } catch (error) {
31378
+ logHookFailure(error);
31379
+ }
31380
+ };
31381
+ return {
31382
+ onObservationStart: () => {
31383
+ fireConfigHook("onObservationStart", context);
31384
+ callHooks?.onObservationStart?.();
31385
+ },
31386
+ onObservationEnd: (result) => {
31387
+ fireConfigHook("onObservationEnd", {
31388
+ ...context,
31389
+ ...result
31390
+ });
31391
+ callHooks?.onObservationEnd?.(result);
31392
+ },
31393
+ onReflectionStart: () => {
31394
+ fireConfigHook("onReflectionStart", context);
31395
+ callHooks?.onReflectionStart?.();
31396
+ },
31397
+ onReflectionEnd: (result) => {
31398
+ fireConfigHook("onReflectionEnd", {
31399
+ ...context,
31400
+ ...result
31401
+ });
31402
+ callHooks?.onReflectionEnd?.(result);
31403
+ }
31404
+ };
31405
+ }
31406
+ /**
31407
+ * Run one buffered observation cycle, firing config-level hooks around it.
31408
+ * Shared by both async-buffer lanes — buffer() and
31409
+ * runAsyncBufferedObservation() — whose fire-and-forget callers never see
31410
+ * the strategy result. The async-buffer strategy swallows failures
31411
+ * (rethrowOnFailure=false) and surfaces them on the result instead, so the
31412
+ * end hook reports `error` for failed cycles even though nothing throws.
31413
+ */
31414
+ async runBufferedObservationCycle(context, run) {
31415
+ const hooks = this.composeHooks(void 0, context);
31416
+ hooks?.onObservationStart?.();
31417
+ let runResult;
31418
+ let runError;
31419
+ try {
31420
+ runResult = await run();
31421
+ return runResult;
31422
+ } catch (error) {
31423
+ runError = error instanceof Error ? error : new Error(String(error));
31424
+ throw error;
31425
+ } finally {
31426
+ hooks?.onObservationEnd?.({
31427
+ usage: runResult?.usage,
31428
+ error: runError ?? runResult?.error,
31429
+ ...runResult?.providerMetadata ? { providerMetadata: runResult.providerMetadata } : {}
31430
+ });
31431
+ }
31432
+ }
31433
+ /**
31308
31434
  * Manually trigger observation.
31309
31435
  *
31310
31436
  * When `messages` is provided, those are used directly (filtered for unobserved)
@@ -31315,8 +31441,13 @@ ${formattedMessages}
31315
31441
  * along with the updated record.
31316
31442
  */
31317
31443
  async observe(opts) {
31318
- const { threadId, resourceId, messages, hooks, requestContext } = opts;
31444
+ const { threadId, resourceId, messages, requestContext } = opts;
31319
31445
  const lockKey = this.buffering.getLockKey(threadId, resourceId);
31446
+ const hooks = this.composeHooks(opts.hooks, {
31447
+ threadId,
31448
+ resourceId,
31449
+ trigger: opts.trigger ?? "manual"
31450
+ });
31320
31451
  const reflectionHooks = hooks ? {
31321
31452
  onReflectionStart: hooks.onReflectionStart,
31322
31453
  onReflectionEnd: hooks.onReflectionEnd
@@ -31389,6 +31520,15 @@ ${formattedMessages}
31389
31520
  };
31390
31521
  await this.storage.setReflectingFlag(record.id, true);
31391
31522
  registerOp(record.id, "reflecting");
31523
+ const hooks = this.composeHooks(void 0, {
31524
+ threadId,
31525
+ resourceId,
31526
+ trigger: "manual"
31527
+ });
31528
+ hooks?.onReflectionStart?.();
31529
+ let reflectionUsage;
31530
+ let reflectionProviderMetadata;
31531
+ let reflectionError;
31392
31532
  try {
31393
31533
  const thread = await this.storage.getThreadById({ threadId });
31394
31534
  const previousOmMetadata = (0, _mastra_core_memory.getThreadOMMetadata)(thread?.metadata);
@@ -31418,12 +31558,16 @@ ${formattedMessages}
31418
31558
  metadata: newMetadata
31419
31559
  });
31420
31560
  }
31561
+ const updatedRecord = await this.getOrCreateRecord(threadId, resourceId);
31562
+ reflectionUsage = reflectResult.usage;
31563
+ reflectionProviderMetadata = reflectResult.providerMetadata;
31421
31564
  return {
31422
31565
  reflected: true,
31423
- record: await this.getOrCreateRecord(threadId, resourceId),
31566
+ record: updatedRecord,
31424
31567
  usage: reflectResult.usage
31425
31568
  };
31426
31569
  } catch (error) {
31570
+ reflectionError = error instanceof Error ? error : new Error(String(error));
31427
31571
  omError("[OM] reflect() failed", error);
31428
31572
  return {
31429
31573
  reflected: false,
@@ -31431,6 +31575,11 @@ ${formattedMessages}
31431
31575
  usage: void 0
31432
31576
  };
31433
31577
  } finally {
31578
+ hooks?.onReflectionEnd?.({
31579
+ usage: reflectionUsage,
31580
+ error: reflectionError,
31581
+ ...reflectionProviderMetadata ? { providerMetadata: reflectionProviderMetadata } : {}
31582
+ });
31434
31583
  await this.storage.setReflectingFlag(record.id, false);
31435
31584
  unregisterOp(record.id, "reflecting");
31436
31585
  }
@@ -32997,6 +33146,7 @@ ${workingMemory}`;
32997
33146
  model: omConfig.model,
32998
33147
  mastra: this._mastraInstance,
32999
33148
  onIndexObservations,
33149
+ hooks: omConfig.hooks,
33000
33150
  observation: omConfig.observation ? {
33001
33151
  model: omConfig.observation.model,
33002
33152
  messageTokens: omConfig.observation.messageTokens,
@@ -44288,4 +44438,4 @@ const agentBuilderWorkflows = {
44288
44438
  //#endregion
44289
44439
  exports.agentBuilderWorkflows = agentBuilderWorkflows;
44290
44440
 
44291
- //# sourceMappingURL=dist-3OAfymQm.cjs.map
44441
+ //# sourceMappingURL=dist-D9hQEsv9.cjs.map