@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
@@ -5958,7 +5958,7 @@ function splitLines(text) {
5958
5958
  return result;
5959
5959
  }
5960
5960
  //#endregion
5961
- //#region ../memory/dist/src-Ci_GvBVm.js
5961
+ //#region ../memory/dist/src-DoNjfXNm.js
5962
5962
  var __defProp$4 = Object.defineProperty;
5963
5963
  var __exportAll = (all, no_symbols) => {
5964
5964
  let target = {};
@@ -21095,13 +21095,19 @@ ${extractorInstructions}${priorLines.length > 0 ? `\n\n## Prior Extracted Values
21095
21095
  * auth, versions, routing hints, and resource id, but they must not present as
21096
21096
  * another run on the parent thread or core's cross-agent thread wait can block
21097
21097
  * on the parent run that is waiting for OM to complete.
21098
+ *
21099
+ * A fresh RequestContext clone is always returned so that memory-scoped writes
21100
+ * made by the internal agent run (e.g. the `MastraMemory` entry that agent.generate
21101
+ * sets from the observer's temporary `structured-observer` memory) cannot leak back
21102
+ * into the parent's RequestContext. Without this isolation the parent's OM turn later
21103
+ * reads the temporary observer's resourceId and injects a continuation message that
21104
+ * fails MessageList's resourceId validation.
21098
21105
  */
21099
21106
  function withOmInternalThreadId(requestContext, omAgentId) {
21100
21107
  if (!requestContext) return void 0;
21101
- const parentThreadId = requestContext.get(MASTRA_THREAD_ID_KEY);
21102
- if (typeof parentThreadId !== "string" || !parentThreadId) return requestContext;
21103
21108
  const internalRequestContext = new RequestContext(requestContext.entries());
21104
- internalRequestContext.set(MASTRA_THREAD_ID_KEY, `${parentThreadId}-${omAgentId}`);
21109
+ const parentThreadId = requestContext.get(MASTRA_THREAD_ID_KEY);
21110
+ if (typeof parentThreadId === "string" && parentThreadId) internalRequestContext.set(MASTRA_THREAD_ID_KEY, `${parentThreadId}-${omAgentId}`);
21105
21111
  return internalRequestContext;
21106
21112
  }
21107
21113
  const ANCHOR_ID_PATTERN = /^\[(O\d+(?:-N\d+)?)\]\s*/;
@@ -22917,7 +22923,7 @@ var ObserverRunner = class {
22917
22923
  extractors: activeExtractors,
22918
22924
  memory: temporaryMemory?.options,
22919
22925
  priorExtractedValues: options?.priorExtractedValues,
22920
- requestContext: options?.requestContext,
22926
+ requestContext: internalRequestContext,
22921
22927
  observabilityContext: options?.observabilityContext,
22922
22928
  abortSignal
22923
22929
  });
@@ -26649,7 +26655,10 @@ var ObservationStrategy = class ObservationStrategy {
26649
26655
  await this.persistMarkerToStorage(failedMarkerForStorage, threadId, this.opts.resourceId).catch(() => {});
26650
26656
  if (abortSignal?.aborted) throw error;
26651
26657
  omError("[OM] Observation failed", error);
26652
- return { observed: false };
26658
+ return {
26659
+ observed: false,
26660
+ error: error instanceof Error ? error : new Error(String(error))
26661
+ };
26653
26662
  }
26654
26663
  omError("[OM] Observation failed", error);
26655
26664
  throw error;
@@ -27687,7 +27696,12 @@ var ObservationStep = class {
27687
27696
  currentModel: this.turn.actorModelContext,
27688
27697
  requestContext: this.turn.requestContext,
27689
27698
  observabilityContext: this.turn.observabilityContext,
27690
- lastActivityAt: getLastActivityFromMessages(messageList.get.all.db())
27699
+ lastActivityAt: getLastActivityFromMessages(messageList.get.all.db()),
27700
+ reflectionHooks: om.composeHooks(void 0, {
27701
+ threadId,
27702
+ resourceId,
27703
+ trigger: "turn-sync"
27704
+ })
27691
27705
  });
27692
27706
  await this.turn.refreshRecord();
27693
27707
  if (this.turn.record.generationCount > preReflectGeneration) reflected = true;
@@ -27847,7 +27861,12 @@ var ObservationStep = class {
27847
27861
  currentModel: this.turn.actorModelContext,
27848
27862
  requestContext: this.turn.requestContext,
27849
27863
  observabilityContext: this.turn.observabilityContext,
27850
- lastActivityAt: getLastActivityFromMessages(messageList.get.all.db())
27864
+ lastActivityAt: getLastActivityFromMessages(messageList.get.all.db()),
27865
+ reflectionHooks: om.composeHooks(void 0, {
27866
+ threadId,
27867
+ resourceId,
27868
+ trigger: "turn-sync"
27869
+ })
27851
27870
  });
27852
27871
  return {
27853
27872
  succeeded: true,
@@ -27860,6 +27879,7 @@ var ObservationStep = class {
27860
27879
  threadId,
27861
27880
  resourceId,
27862
27881
  messages: messageList.get.all.db(),
27882
+ trigger: "turn-sync",
27863
27883
  requestContext: this.turn.requestContext,
27864
27884
  writer: this.turn.writer,
27865
27885
  observabilityContext: this.turn.observabilityContext
@@ -28643,7 +28663,7 @@ var ReflectorRunner = class {
28643
28663
  extractors: activeExtractors,
28644
28664
  memory: temporaryMemory?.options,
28645
28665
  priorExtractedValues,
28646
- requestContext,
28666
+ requestContext: internalRequestContext,
28647
28667
  observabilityContext,
28648
28668
  abortSignal
28649
28669
  });
@@ -28685,12 +28705,16 @@ var ReflectorRunner = class {
28685
28705
  });
28686
28706
  reflectionHooks?.onReflectionStart?.();
28687
28707
  const asyncOp = this.doAsyncBufferedReflection(record, bufferKey, writer, requestContext, observabilityContext, priorExtractedValues, mainAgent, sendSignal).then((outcome) => {
28688
- reflectionHooks?.onReflectionEnd?.({
28689
- usage: outcome?.usage,
28690
- ...outcome?.providerMetadata ? { providerMetadata: outcome.providerMetadata } : {}
28691
- });
28692
- }).catch(async (error) => {
28693
- if (writer) {
28708
+ try {
28709
+ reflectionHooks?.onReflectionEnd?.({
28710
+ usage: outcome?.usage,
28711
+ ...outcome?.providerMetadata ? { providerMetadata: outcome.providerMetadata } : {}
28712
+ });
28713
+ } catch (hookError) {
28714
+ omError("[OM] onReflectionEnd hook failed after async buffered reflection", hookError);
28715
+ }
28716
+ }, async (error) => {
28717
+ if (writer) try {
28694
28718
  const failedMarker = createBufferingFailedMarker({
28695
28719
  cycleId: `reflect-buf-${Date.now()}-${Math.random().toString(36).slice(2, 11)}`,
28696
28720
  operationType: "reflection",
@@ -28705,12 +28729,18 @@ var ReflectorRunner = class {
28705
28729
  transient: true
28706
28730
  }).catch(() => {});
28707
28731
  await this.persistMarkerToStorage(failedMarker, record.threadId ?? "", record.resourceId ?? void 0);
28732
+ } catch (markerError) {
28733
+ omError("[OM] Failed to persist buffering-failed marker after async buffered reflection failure", markerError);
28708
28734
  }
28709
28735
  omError("[OM] Async buffered reflection failed", error);
28710
- reflectionHooks?.onReflectionEnd?.({
28711
- usage: void 0,
28712
- error: error instanceof Error ? error : new Error(String(error))
28713
- });
28736
+ try {
28737
+ reflectionHooks?.onReflectionEnd?.({
28738
+ usage: void 0,
28739
+ error: error instanceof Error ? error : new Error(String(error))
28740
+ });
28741
+ } catch (hookError) {
28742
+ omError("[OM] onReflectionEnd hook failed after async buffered reflection failure", hookError);
28743
+ }
28714
28744
  BufferingCoordinator.lastBufferedBoundary.delete(bufferKey);
28715
28745
  }).finally(() => {
28716
28746
  BufferingCoordinator.asyncBufferingOps.delete(bufferKey);
@@ -28957,7 +28987,6 @@ var ReflectorRunner = class {
28957
28987
  return;
28958
28988
  }
28959
28989
  }
28960
- reflectionHooks?.onReflectionStart?.();
28961
28990
  await this.storage.setReflectingFlag(record.id, true);
28962
28991
  registerOp(record.id, "reflecting");
28963
28992
  const cycleId = crypto.randomUUID();
@@ -28998,6 +29027,7 @@ var ReflectorRunner = class {
28998
29027
  let reflectionUsage;
28999
29028
  let reflectionProviderMetadata;
29000
29029
  let reflectionError;
29030
+ reflectionHooks?.onReflectionStart?.();
29001
29031
  try {
29002
29032
  const compressionStartLevel = await this.getCompressionStartLevel(requestContext);
29003
29033
  const reflectResult = await this.call(record.activeObservations, void 0, streamContext, reflectThreshold, abortSignal, void 0, compressionStartLevel, requestContext, priorExtractedValues, observabilityContext, void 0, mainAgent, sendSignal);
@@ -29061,12 +29091,15 @@ var ReflectorRunner = class {
29061
29091
  omError("[OM] Reflection failed", error);
29062
29092
  } finally {
29063
29093
  await this.storage.setReflectingFlag(record.id, false);
29064
- reflectionHooks?.onReflectionEnd?.({
29065
- usage: reflectionUsage,
29066
- error: reflectionError,
29067
- ...reflectionProviderMetadata ? { providerMetadata: reflectionProviderMetadata } : {}
29068
- });
29069
- unregisterOp(record.id, "reflecting");
29094
+ try {
29095
+ reflectionHooks?.onReflectionEnd?.({
29096
+ usage: reflectionUsage,
29097
+ error: reflectionError,
29098
+ ...reflectionProviderMetadata ? { providerMetadata: reflectionProviderMetadata } : {}
29099
+ });
29100
+ } finally {
29101
+ unregisterOp(record.id, "reflecting");
29102
+ }
29070
29103
  }
29071
29104
  }
29072
29105
  };
@@ -29515,6 +29548,8 @@ var ObservationalMemory = class ObservationalMemory {
29515
29548
  reflectionConfig;
29516
29549
  onDebugEvent;
29517
29550
  onIndexObservations;
29551
+ /** Config-level lifecycle hooks fired for every observation/reflection cycle. */
29552
+ hooks;
29518
29553
  /** Observer agent runner — handles LLM calls for extracting observations. */
29519
29554
  observer;
29520
29555
  /** Reflector agent runner — handles LLM calls for compressing observations. */
@@ -29575,6 +29610,7 @@ var ObservationalMemory = class ObservationalMemory {
29575
29610
  this.scope = config.scope ?? "thread";
29576
29611
  this.retrieval = Boolean(config.retrieval);
29577
29612
  this.onIndexObservations = config.onIndexObservations;
29613
+ this.hooks = config.hooks;
29578
29614
  this.mastra = config.mastra;
29579
29615
  this.memory = config.memory;
29580
29616
  const resolveModel = (model, defaultModel) => model === "default" ? defaultModel : model;
@@ -30496,7 +30532,11 @@ ${formattedMessages}
30496
30532
  transient: true
30497
30533
  }).catch(() => {});
30498
30534
  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(",")}`);
30499
- await ObservationStrategy.create(this, {
30535
+ await this.runBufferedObservationCycle({
30536
+ threadId,
30537
+ resourceId: freshRecord.resourceId ?? void 0,
30538
+ trigger: "async-buffer"
30539
+ }, () => ObservationStrategy.create(this, {
30500
30540
  record: freshRecord,
30501
30541
  threadId,
30502
30542
  resourceId: freshRecord.resourceId ?? void 0,
@@ -30506,7 +30546,7 @@ ${formattedMessages}
30506
30546
  writer,
30507
30547
  requestContext,
30508
30548
  observabilityContext
30509
- }).run();
30549
+ }).run());
30510
30550
  const maxTs = this.getMaxMessageTimestamp(messagesToBuffer);
30511
30551
  const cursor = new Date(maxTs.getTime() + 1);
30512
30552
  BufferingCoordinator.lastBufferedAtTime.set(bufferKey, cursor);
@@ -31079,7 +31119,11 @@ ${formattedMessages}
31079
31119
  ...startMarker,
31080
31120
  transient: true
31081
31121
  }).catch(() => {});
31082
- await ObservationStrategy.create(this, {
31122
+ await this.runBufferedObservationCycle({
31123
+ threadId,
31124
+ resourceId: record.resourceId ?? resourceId,
31125
+ trigger: "async-buffer"
31126
+ }, () => ObservationStrategy.create(this, {
31083
31127
  record,
31084
31128
  threadId,
31085
31129
  resourceId: record.resourceId ?? void 0,
@@ -31092,7 +31136,7 @@ ${formattedMessages}
31092
31136
  requestContext,
31093
31137
  currentModel: opts.currentModel,
31094
31138
  observabilityContext
31095
- }).run();
31139
+ }).run());
31096
31140
  if (isOmReproCaptureEnabled()) writeObserverExchangeReproCapture({
31097
31141
  threadId,
31098
31142
  resourceId: record.resourceId ?? void 0,
@@ -31302,6 +31346,88 @@ ${formattedMessages}
31302
31346
  };
31303
31347
  }
31304
31348
  /**
31349
+ * Compose the config-level hooks with optional per-call hooks into a single
31350
+ * `ObserveHooks` object, binding call context onto the config-level
31351
+ * callbacks. Config-level hooks are guarded so a throwing consumer hook can
31352
+ * never fail an observation/reflection cycle; per-call hooks keep their
31353
+ * existing payloads and propagation semantics. Returns undefined when
31354
+ * neither is configured, so call sites stay zero-cost.
31355
+ *
31356
+ * Used internally by every pipeline path (manual observe/reflect,
31357
+ * turn-engine sync observation, async buffering); public only so the
31358
+ * observation turn engine can thread config-level reflection hooks into
31359
+ * reflector calls.
31360
+ *
31361
+ * @internal
31362
+ */
31363
+ composeHooks(callHooks, context) {
31364
+ const configHooks = this.hooks;
31365
+ if (!configHooks) return callHooks;
31366
+ if (!callHooks && !Object.keys(configHooks).length) return void 0;
31367
+ const fireConfigHook = (name, arg) => {
31368
+ const hook = configHooks[name];
31369
+ if (!hook) return;
31370
+ const logHookFailure = (error) => omDebug(`[OM:hooks] config-level ${name} hook failed: ${error instanceof Error ? error.message : String(error)}`);
31371
+ try {
31372
+ const out = hook(arg);
31373
+ if (out && typeof out.then === "function") out.then(void 0, logHookFailure);
31374
+ } catch (error) {
31375
+ logHookFailure(error);
31376
+ }
31377
+ };
31378
+ return {
31379
+ onObservationStart: () => {
31380
+ fireConfigHook("onObservationStart", context);
31381
+ callHooks?.onObservationStart?.();
31382
+ },
31383
+ onObservationEnd: (result) => {
31384
+ fireConfigHook("onObservationEnd", {
31385
+ ...context,
31386
+ ...result
31387
+ });
31388
+ callHooks?.onObservationEnd?.(result);
31389
+ },
31390
+ onReflectionStart: () => {
31391
+ fireConfigHook("onReflectionStart", context);
31392
+ callHooks?.onReflectionStart?.();
31393
+ },
31394
+ onReflectionEnd: (result) => {
31395
+ fireConfigHook("onReflectionEnd", {
31396
+ ...context,
31397
+ ...result
31398
+ });
31399
+ callHooks?.onReflectionEnd?.(result);
31400
+ }
31401
+ };
31402
+ }
31403
+ /**
31404
+ * Run one buffered observation cycle, firing config-level hooks around it.
31405
+ * Shared by both async-buffer lanes — buffer() and
31406
+ * runAsyncBufferedObservation() — whose fire-and-forget callers never see
31407
+ * the strategy result. The async-buffer strategy swallows failures
31408
+ * (rethrowOnFailure=false) and surfaces them on the result instead, so the
31409
+ * end hook reports `error` for failed cycles even though nothing throws.
31410
+ */
31411
+ async runBufferedObservationCycle(context, run) {
31412
+ const hooks = this.composeHooks(void 0, context);
31413
+ hooks?.onObservationStart?.();
31414
+ let runResult;
31415
+ let runError;
31416
+ try {
31417
+ runResult = await run();
31418
+ return runResult;
31419
+ } catch (error) {
31420
+ runError = error instanceof Error ? error : new Error(String(error));
31421
+ throw error;
31422
+ } finally {
31423
+ hooks?.onObservationEnd?.({
31424
+ usage: runResult?.usage,
31425
+ error: runError ?? runResult?.error,
31426
+ ...runResult?.providerMetadata ? { providerMetadata: runResult.providerMetadata } : {}
31427
+ });
31428
+ }
31429
+ }
31430
+ /**
31305
31431
  * Manually trigger observation.
31306
31432
  *
31307
31433
  * When `messages` is provided, those are used directly (filtered for unobserved)
@@ -31312,8 +31438,13 @@ ${formattedMessages}
31312
31438
  * along with the updated record.
31313
31439
  */
31314
31440
  async observe(opts) {
31315
- const { threadId, resourceId, messages, hooks, requestContext } = opts;
31441
+ const { threadId, resourceId, messages, requestContext } = opts;
31316
31442
  const lockKey = this.buffering.getLockKey(threadId, resourceId);
31443
+ const hooks = this.composeHooks(opts.hooks, {
31444
+ threadId,
31445
+ resourceId,
31446
+ trigger: opts.trigger ?? "manual"
31447
+ });
31317
31448
  const reflectionHooks = hooks ? {
31318
31449
  onReflectionStart: hooks.onReflectionStart,
31319
31450
  onReflectionEnd: hooks.onReflectionEnd
@@ -31386,6 +31517,15 @@ ${formattedMessages}
31386
31517
  };
31387
31518
  await this.storage.setReflectingFlag(record.id, true);
31388
31519
  registerOp(record.id, "reflecting");
31520
+ const hooks = this.composeHooks(void 0, {
31521
+ threadId,
31522
+ resourceId,
31523
+ trigger: "manual"
31524
+ });
31525
+ hooks?.onReflectionStart?.();
31526
+ let reflectionUsage;
31527
+ let reflectionProviderMetadata;
31528
+ let reflectionError;
31389
31529
  try {
31390
31530
  const thread = await this.storage.getThreadById({ threadId });
31391
31531
  const previousOmMetadata = getThreadOMMetadata(thread?.metadata);
@@ -31415,12 +31555,16 @@ ${formattedMessages}
31415
31555
  metadata: newMetadata
31416
31556
  });
31417
31557
  }
31558
+ const updatedRecord = await this.getOrCreateRecord(threadId, resourceId);
31559
+ reflectionUsage = reflectResult.usage;
31560
+ reflectionProviderMetadata = reflectResult.providerMetadata;
31418
31561
  return {
31419
31562
  reflected: true,
31420
- record: await this.getOrCreateRecord(threadId, resourceId),
31563
+ record: updatedRecord,
31421
31564
  usage: reflectResult.usage
31422
31565
  };
31423
31566
  } catch (error) {
31567
+ reflectionError = error instanceof Error ? error : new Error(String(error));
31424
31568
  omError("[OM] reflect() failed", error);
31425
31569
  return {
31426
31570
  reflected: false,
@@ -31428,6 +31572,11 @@ ${formattedMessages}
31428
31572
  usage: void 0
31429
31573
  };
31430
31574
  } finally {
31575
+ hooks?.onReflectionEnd?.({
31576
+ usage: reflectionUsage,
31577
+ error: reflectionError,
31578
+ ...reflectionProviderMetadata ? { providerMetadata: reflectionProviderMetadata } : {}
31579
+ });
31431
31580
  await this.storage.setReflectingFlag(record.id, false);
31432
31581
  unregisterOp(record.id, "reflecting");
31433
31582
  }
@@ -32994,6 +33143,7 @@ ${workingMemory}`;
32994
33143
  model: omConfig.model,
32995
33144
  mastra: this._mastraInstance,
32996
33145
  onIndexObservations,
33146
+ hooks: omConfig.hooks,
32997
33147
  observation: omConfig.observation ? {
32998
33148
  model: omConfig.observation.model,
32999
33149
  messageTokens: omConfig.observation.messageTokens,
@@ -44282,4 +44432,4 @@ const agentBuilderWorkflows = {
44282
44432
  //#endregion
44283
44433
  export { agentBuilderWorkflows };
44284
44434
 
44285
- //# sourceMappingURL=dist-CgHgmUmP.js.map
44435
+ //# sourceMappingURL=dist-BlHxui7N.js.map