@mastra/server 1.76.0-alpha.0 → 1.76.0-alpha.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 (93) hide show
  1. package/dist/_types/@internal_voice/dist/routes/index.d.ts +15 -0
  2. package/dist/{agents-Dyp7MBAb.cjs → agents-CKSEPpk1.cjs} +2 -2
  3. package/dist/{agents-Dyp7MBAb.cjs.map → agents-CKSEPpk1.cjs.map} +1 -1
  4. package/dist/{agents-cT-_8JA0.js → agents-CW_JJZOf.js} +2 -2
  5. package/dist/{agents-cT-_8JA0.js.map → agents-CW_JJZOf.js.map} +1 -1
  6. package/dist/{api-schema-manifest-CmJODtyM.cjs → api-schema-manifest-BzyUr2nd.cjs} +2 -2
  7. package/dist/{api-schema-manifest-CmJODtyM.cjs.map → api-schema-manifest-BzyUr2nd.cjs.map} +1 -1
  8. package/dist/{api-schema-manifest-CxCucIU6.js → api-schema-manifest-DktVob9z.js} +2 -2
  9. package/dist/{api-schema-manifest-CxCucIU6.js.map → api-schema-manifest-DktVob9z.js.map} +1 -1
  10. package/dist/{conversations-DGpzLcpr.cjs → conversations-Bj5TLNqF.cjs} +2 -2
  11. package/dist/{conversations-DGpzLcpr.cjs.map → conversations-Bj5TLNqF.cjs.map} +1 -1
  12. package/dist/{conversations-BJ6_O8Vk.js → conversations-BzBHVFYe.js} +2 -2
  13. package/dist/{conversations-BJ6_O8Vk.js.map → conversations-BzBHVFYe.js.map} +1 -1
  14. package/dist/{dist-DpUNsgQx.cjs → dist-Ce_1oIl2.cjs} +105 -15
  15. package/dist/{dist-DpUNsgQx.cjs.map → dist-Ce_1oIl2.cjs.map} +1 -1
  16. package/dist/{dist-DMtuYRLk.js → dist-CtNeEn6M.js} +105 -15
  17. package/dist/{dist-DMtuYRLk.js.map → dist-CtNeEn6M.js.map} +1 -1
  18. package/dist/docs/SKILL.md +1 -1
  19. package/dist/docs/assets/SOURCE_MAP.json +1 -1
  20. package/dist/{editor-builder-SxOfWcbc.cjs → editor-builder-BtcTQbAC.cjs} +2 -2
  21. package/dist/{editor-builder-SxOfWcbc.cjs.map → editor-builder-BtcTQbAC.cjs.map} +1 -1
  22. package/dist/{editor-builder-BMN2fl8p.js → editor-builder-CYkaYf6-.js} +2 -2
  23. package/dist/{editor-builder-BMN2fl8p.js.map → editor-builder-CYkaYf6-.js.map} +1 -1
  24. package/dist/{editor-builder-BII35DcS.cjs → editor-builder-CmUsqdZq.cjs} +2 -2
  25. package/dist/{editor-builder-BII35DcS.cjs.map → editor-builder-CmUsqdZq.cjs.map} +1 -1
  26. package/dist/{editor-builder-mxsAeRze.js → editor-builder-DHXbVwxu.js} +2 -2
  27. package/dist/{editor-builder-mxsAeRze.js.map → editor-builder-DHXbVwxu.js.map} +1 -1
  28. package/dist/{memory-B4u-ESJ-.js → memory-B58Q2LgU.js} +19 -2
  29. package/dist/{memory-B4u-ESJ-.js.map → memory-B58Q2LgU.js.map} +1 -1
  30. package/dist/{memory-B9GGX7Iu.cjs → memory-CizEIbl1.cjs} +19 -2
  31. package/dist/memory-CizEIbl1.cjs.map +1 -0
  32. package/dist/{routes-CjNEpcic.cjs → routes-BHFCAczU.cjs} +3 -3
  33. package/dist/{routes-CjNEpcic.cjs.map → routes-BHFCAczU.cjs.map} +1 -1
  34. package/dist/{routes-BKUF5ZHA.cjs → routes-BULZI-PU.cjs} +8 -4
  35. package/dist/routes-BULZI-PU.cjs.map +1 -0
  36. package/dist/{routes-lJ3C4qRm.js → routes-DVec5dwl.js} +3 -3
  37. package/dist/{routes-lJ3C4qRm.js.map → routes-DVec5dwl.js.map} +1 -1
  38. package/dist/{routes-zHhMx-9S.js → routes-Dl6_kWm7.js} +8 -4
  39. package/dist/routes-Dl6_kWm7.js.map +1 -0
  40. package/dist/server/handlers/agent-builder.cjs +2 -2
  41. package/dist/server/handlers/agent-builder.js +2 -2
  42. package/dist/server/handlers/agent-controller.cjs +1 -1
  43. package/dist/server/handlers/agent-controller.js +1 -1
  44. package/dist/server/handlers/agents.cjs +1 -1
  45. package/dist/server/handlers/agents.js +1 -1
  46. package/dist/server/handlers/conversations.cjs +1 -1
  47. package/dist/server/handlers/conversations.js +1 -1
  48. package/dist/server/handlers/editor-builder.cjs +1 -1
  49. package/dist/server/handlers/editor-builder.js +1 -1
  50. package/dist/server/handlers/favorites-enrichment.cjs +1 -1
  51. package/dist/server/handlers/favorites-enrichment.js +1 -1
  52. package/dist/server/handlers/memory.cjs +18 -2
  53. package/dist/server/handlers/memory.cjs.map +1 -1
  54. package/dist/server/handlers/memory.d.ts +5 -0
  55. package/dist/server/handlers/memory.d.ts.map +1 -1
  56. package/dist/server/handlers/memory.js +18 -2
  57. package/dist/server/handlers/memory.js.map +1 -1
  58. package/dist/server/handlers/plans.cjs +1 -1
  59. package/dist/server/handlers/plans.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-skill-favorites.cjs +1 -1
  65. package/dist/server/handlers/stored-skill-favorites.js +1 -1
  66. package/dist/server/handlers/stored-skills.cjs +1 -1
  67. package/dist/server/handlers/stored-skills.js +1 -1
  68. package/dist/server/handlers/system.cjs +1 -1
  69. package/dist/server/handlers/system.js +1 -1
  70. package/dist/server/handlers/tools.cjs +1 -1
  71. package/dist/server/handlers/tools.js +1 -1
  72. package/dist/server/handlers/voice.cjs +1 -1
  73. package/dist/server/handlers/voice.js +1 -1
  74. package/dist/server/handlers/workflow-builder.cjs +1 -1
  75. package/dist/server/handlers/workflow-builder.js +1 -1
  76. package/dist/server/handlers/workflows.cjs +1 -1
  77. package/dist/server/handlers/workflows.js +1 -1
  78. package/dist/server/schemas/index.cjs +5 -5
  79. package/dist/server/schemas/index.js +5 -5
  80. package/dist/server/schemas/memory.d.ts +4 -3
  81. package/dist/server/schemas/memory.d.ts.map +1 -1
  82. package/dist/server/server-adapter/index.cjs +1 -1
  83. package/dist/server/server-adapter/index.js +1 -1
  84. package/dist/server/server-adapter/routes/memory.d.ts +5 -0
  85. package/dist/server/server-adapter/routes/memory.d.ts.map +1 -1
  86. package/dist/{workflow-builder-b1kbkuG9.js → workflow-builder-D2DgSt6L.js} +3 -3
  87. package/dist/{workflow-builder-b1kbkuG9.js.map → workflow-builder-D2DgSt6L.js.map} +1 -1
  88. package/dist/{workflow-builder-BVPR7r4o.cjs → workflow-builder-pBSrWWIp.cjs} +3 -3
  89. package/dist/{workflow-builder-BVPR7r4o.cjs.map → workflow-builder-pBSrWWIp.cjs.map} +1 -1
  90. package/package.json +5 -5
  91. package/dist/memory-B9GGX7Iu.cjs.map +0 -1
  92. package/dist/routes-BKUF5ZHA.cjs.map +0 -1
  93. package/dist/routes-zHhMx-9S.js.map +0 -1
@@ -4637,7 +4637,7 @@ function splitLines(text) {
4637
4637
  return result;
4638
4638
  }
4639
4639
  //#endregion
4640
- //#region ../memory/dist/src-yhShj4JX.js
4640
+ //#region ../memory/dist/src-C_ZgETf8.js
4641
4641
  var __defProp$3 = Object.defineProperty;
4642
4642
  var __exportAll = (all, no_symbols) => {
4643
4643
  let target = {};
@@ -28088,6 +28088,18 @@ const SET_WORKING_MEMORY_TOOL_NAME = "setWorkingMemory";
28088
28088
  * - Primitive values are overwritten
28089
28089
  * - The returned object is always newly constructed and never aliases `update`
28090
28090
  */
28091
+ /**
28092
+ * Parses stored JSON working memory. Invalid or empty data yields `null` (start fresh).
28093
+ */
28094
+ function parseWorkingMemoryJson(raw) {
28095
+ if (!raw) return null;
28096
+ if (typeof raw !== "string") return raw;
28097
+ try {
28098
+ return JSON.parse(raw);
28099
+ } catch {
28100
+ return null;
28101
+ }
28102
+ }
28091
28103
  function deepMergeWorkingMemory(existing, update) {
28092
28104
  if (!update || typeof update !== "object" || Object.keys(update).length === 0) return existing && typeof existing === "object" ? { ...existing } : {};
28093
28105
  const result = { ...existing && typeof existing === "object" && !Array.isArray(existing) ? existing : {} };
@@ -28194,17 +28206,6 @@ const updateWorkingMemoryTool = (memoryConfig) => {
28194
28206
  }
28195
28207
  let workingMemory;
28196
28208
  if (usesMergeSemantics) {
28197
- const existingRaw = await memory.getWorkingMemory({
28198
- threadId,
28199
- resourceId,
28200
- memoryConfig
28201
- });
28202
- let existingData = null;
28203
- if (existingRaw) try {
28204
- existingData = typeof existingRaw === "string" ? JSON.parse(existingRaw) : existingRaw;
28205
- } catch {
28206
- existingData = null;
28207
- }
28208
28209
  const memoryInput = workingMemoryInput.memory;
28209
28210
  if (memoryInput === void 0 || memoryInput === null) return {
28210
28211
  success: true,
@@ -28218,7 +28219,20 @@ const updateWorkingMemoryTool = (memoryConfig) => {
28218
28219
  throw new Error(`Failed to parse working memory input as JSON: ${errorMessage}. Raw input: ${memoryInput.length > 500 ? memoryInput.slice(0, 500) + "..." : memoryInput}`);
28219
28220
  }
28220
28221
  else newData = memoryInput;
28221
- const mergedData = deepMergeWorkingMemory(existingData, newData);
28222
+ if (scope === "resource" && typeof memory.supportsAtomicWorkingMemoryMerge === "function" && await memory.supportsAtomicWorkingMemoryMerge()) {
28223
+ await memory.mergeWorkingMemory({
28224
+ threadId,
28225
+ resourceId,
28226
+ workingMemory: newData,
28227
+ memoryConfig
28228
+ });
28229
+ return { success: true };
28230
+ }
28231
+ const mergedData = deepMergeWorkingMemory(parseWorkingMemoryJson(await memory.getWorkingMemory({
28232
+ threadId,
28233
+ resourceId,
28234
+ memoryConfig
28235
+ })), newData);
28222
28236
  workingMemory = JSON.stringify(mergedData);
28223
28237
  } else {
28224
28238
  const memoryInput = workingMemoryInput.memory;
@@ -32537,8 +32551,14 @@ var ObservationStep = class {
32537
32551
  const newOutput = messageList.clear.response.db();
32538
32552
  const messagesToSave = [...newInput, ...newOutput];
32539
32553
  if (messagesToSave.length > 0) {
32540
- await om.persistMessages(messagesToSave, threadId, resourceId);
32541
32554
  for (const msg of messagesToSave) messageList.add(msg, "memory");
32555
+ try {
32556
+ await om.persistMessages(messagesToSave, threadId, resourceId);
32557
+ } catch (error) {
32558
+ restoreDrainedMessages(messageList, newInput, "input");
32559
+ restoreDrainedMessages(messageList, newOutput, "response");
32560
+ throw error;
32561
+ }
32542
32562
  }
32543
32563
  } else {
32544
32564
  const pending = [...messageList.get.input.db(), ...messageList.get.response.db()];
@@ -32766,6 +32786,18 @@ var ObservationStep = class {
32766
32786
  }
32767
32787
  };
32768
32788
  /**
32789
+ * Move messages drained into the memory bucket back to `source` after a failed save. Messages that
32790
+ * have already left the memory bucket (a background tool result moves its message to `response`)
32791
+ * are left where they are. The list's current copy is re-added so changes made during the save
32792
+ * are kept.
32793
+ */
32794
+ function restoreDrainedMessages(messageList, drained, source) {
32795
+ if (drained.length === 0) return;
32796
+ const stillQueued = new Set([...messageList.get.input.db(), ...messageList.get.response.db()].map((msg) => msg.id));
32797
+ const ids = drained.map((msg) => msg.id).filter((id) => !stillQueued.has(id));
32798
+ for (const msg of messageList.removeByIds(ids)) messageList.add(msg, source, { merge: false });
32799
+ }
32800
+ /**
32769
32801
  * Represents a single turn in the agent conversation — one user message → agent response cycle.
32770
32802
  *
32771
32803
  * The turn manages record caching, context loading, and step lifecycle.
@@ -37255,6 +37287,10 @@ var ObservationalMemoryProcessor = class {
37255
37287
  } catch (error) {
37256
37288
  const err = error instanceof Error ? error : new Error(String(error));
37257
37289
  const abortMessage = abortSignal?.aborted ? "Agent execution was aborted" : `Encountered error during memory observation: ${err.message}`;
37290
+ const failedTurn = this.turn;
37291
+ await failedTurn.end().catch(() => {});
37292
+ if (this.turn === failedTurn) this.turn = void 0;
37293
+ state.__omTurn = void 0;
37258
37294
  if (typeof abort === "function") abort(abortMessage);
37259
37295
  throw err;
37260
37296
  }
@@ -37565,6 +37601,12 @@ const DEFAULT_EMBEDDING_CACHE_MAX_SIZE = 1e3;
37565
37601
  * @see [Memory documentation](https://mastra.ai/docs/memory/overview)
37566
37602
  * if packaged docs are unavailable.
37567
37603
  */
37604
+ const invalidMerge = (text) => new MastraError({
37605
+ id: "MEMORY_WORKING_MEMORY_MERGE_INVALID",
37606
+ domain: ErrorDomain.MASTRA_MEMORY,
37607
+ category: ErrorCategory.USER,
37608
+ text
37609
+ });
37568
37610
  var Memory = class Memory extends MastraMemory {
37569
37611
  createMemoryTokenCounter() {
37570
37612
  return new TokenCounter();
@@ -38094,6 +38136,54 @@ var Memory = class Memory extends MastraMemory {
38094
38136
  throw error;
38095
38137
  }
38096
38138
  }
38139
+ /**
38140
+ * Whether the configured storage can merge resource working memory atomically across processes.
38141
+ */
38142
+ async supportsAtomicWorkingMemoryMerge() {
38143
+ return (await this.getMemoryStore()).supportsAtomicWorkingMemoryMerge === true;
38144
+ }
38145
+ /**
38146
+ * Deep-merges a partial JSON update into resource-scoped working memory as one
38147
+ * atomic storage operation, so concurrent writers (even in other processes) never
38148
+ * lose each other's fields. `null` values delete fields; arrays are replaced.
38149
+ * Requires schema-based working memory, resource scope, and a storage adapter
38150
+ * that supports atomic merges (e.g. PostgreSQL); otherwise throws.
38151
+ */
38152
+ async mergeWorkingMemory({ threadId, resourceId, workingMemory, memoryConfig, observabilityContext }) {
38153
+ const config = this.getMergedThreadConfig(memoryConfig || {});
38154
+ if (!config.workingMemory?.enabled) throw invalidMerge("Working memory is not enabled for this memory instance");
38155
+ if (!config.workingMemory.schema) throw invalidMerge("Working memory merge requires schema-based (JSON) working memory");
38156
+ if ((config.workingMemory.scope || "resource") !== "resource" || !resourceId) throw invalidMerge("Working memory merge requires resource-scoped working memory and a resourceId");
38157
+ let patch = workingMemory;
38158
+ if (typeof workingMemory === "string") try {
38159
+ patch = JSON.parse(workingMemory);
38160
+ } catch {
38161
+ throw invalidMerge("Working memory merge requires a JSON object");
38162
+ }
38163
+ if (!patch || typeof patch !== "object" || Array.isArray(patch)) throw invalidMerge("Working memory merge requires a JSON object");
38164
+ const memoryStore = await this.getMemoryStore();
38165
+ if (!memoryStore.supportsAtomicWorkingMemoryMerge) throw invalidMerge(`Atomic working memory merge is not supported by this storage adapter (${memoryStore.constructor.name}).`);
38166
+ const span = this.createMemorySpan("update", observabilityContext, {
38167
+ threadId,
38168
+ resourceId
38169
+ }, { workingMemoryEnabled: true });
38170
+ try {
38171
+ await memoryStore.mergeResourceWorkingMemory({
38172
+ resourceId,
38173
+ merge: (existing) => {
38174
+ const parsed = parseWorkingMemoryJson(existing);
38175
+ return JSON.stringify(deepMergeWorkingMemory(parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : null, patch));
38176
+ }
38177
+ });
38178
+ span?.end({ output: { success: true } });
38179
+ } catch (error) {
38180
+ span?.error({
38181
+ error,
38182
+ endSpan: true
38183
+ });
38184
+ throw error;
38185
+ }
38186
+ }
38097
38187
  updateWorkingMemoryMutexes = /* @__PURE__ */ new Map();
38098
38188
  /**
38099
38189
  * @warning experimental! can be removed or changed at any time
@@ -50573,4 +50663,4 @@ const agentBuilderWorkflows = {
50573
50663
  //#endregion
50574
50664
  export { agentBuilderWorkflows };
50575
50665
 
50576
- //# sourceMappingURL=dist-DMtuYRLk.js.map
50666
+ //# sourceMappingURL=dist-CtNeEn6M.js.map