@mastra/core 1.9.0 → 1.10.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 (438) hide show
  1. package/CHANGELOG.md +202 -0
  2. package/dist/agent/agent.d.ts +22 -3
  3. package/dist/agent/agent.d.ts.map +1 -1
  4. package/dist/agent/index.cjs +13 -13
  5. package/dist/agent/index.js +2 -2
  6. package/dist/agent/message-list/index.cjs +18 -18
  7. package/dist/agent/message-list/index.js +1 -1
  8. package/dist/agent/message-list/message-list.d.ts.map +1 -1
  9. package/dist/{chunk-IOY7Y5GV.js → chunk-3VVNJPTO.js} +602 -187
  10. package/dist/chunk-3VVNJPTO.js.map +1 -0
  11. package/dist/{chunk-VDKWYUGC.cjs → chunk-5WBEMKE2.cjs} +7 -3
  12. package/dist/chunk-5WBEMKE2.cjs.map +1 -0
  13. package/dist/{chunk-H5S4PS44.cjs → chunk-76Q75VI4.cjs} +602 -187
  14. package/dist/chunk-76Q75VI4.cjs.map +1 -0
  15. package/dist/{chunk-ZBESCKPX.cjs → chunk-7AHCLTZZ.cjs} +1572 -36
  16. package/dist/chunk-7AHCLTZZ.cjs.map +1 -0
  17. package/dist/{chunk-SEKQJ447.js → chunk-ACAILOJE.js} +166 -68
  18. package/dist/chunk-ACAILOJE.js.map +1 -0
  19. package/dist/{chunk-YIJZBU54.cjs → chunk-BCSVBOAN.cjs} +240 -463
  20. package/dist/chunk-BCSVBOAN.cjs.map +1 -0
  21. package/dist/{chunk-ZVWVQ6MG.js → chunk-CY4ZWL2X.js} +8 -3
  22. package/dist/chunk-CY4ZWL2X.js.map +1 -0
  23. package/dist/{chunk-ET7GXCHS.js → chunk-DIKRJVK6.js} +5 -5
  24. package/dist/{chunk-ET7GXCHS.js.map → chunk-DIKRJVK6.js.map} +1 -1
  25. package/dist/{chunk-P6ZX7OKT.cjs → chunk-E6I5LBDM.cjs} +7 -7
  26. package/dist/{chunk-P6ZX7OKT.cjs.map → chunk-E6I5LBDM.cjs.map} +1 -1
  27. package/dist/{chunk-BFV3GSGS.js → chunk-FT5Q6XTK.js} +1546 -22
  28. package/dist/chunk-FT5Q6XTK.js.map +1 -0
  29. package/dist/{chunk-K54LFB4P.js → chunk-FXOWXS4O.js} +3 -3
  30. package/dist/{chunk-K54LFB4P.js.map → chunk-FXOWXS4O.js.map} +1 -1
  31. package/dist/{chunk-QNXY3J6B.cjs → chunk-GCRPNAAR.cjs} +22 -19
  32. package/dist/chunk-GCRPNAAR.cjs.map +1 -0
  33. package/dist/{chunk-5M3RMO7U.js → chunk-GTA5BKXZ.js} +8 -8
  34. package/dist/{chunk-5M3RMO7U.js.map → chunk-GTA5BKXZ.js.map} +1 -1
  35. package/dist/{chunk-G5R2755Q.cjs → chunk-HAIQ57YB.cjs} +53 -20
  36. package/dist/chunk-HAIQ57YB.cjs.map +1 -0
  37. package/dist/{chunk-3ZBLD2Y4.cjs → chunk-HH76UOJL.cjs} +2 -2
  38. package/dist/{chunk-3ZBLD2Y4.cjs.map → chunk-HH76UOJL.cjs.map} +1 -1
  39. package/dist/{chunk-HAGCXIBX.cjs → chunk-HNYQITSV.cjs} +9 -9
  40. package/dist/{chunk-HAGCXIBX.cjs.map → chunk-HNYQITSV.cjs.map} +1 -1
  41. package/dist/{chunk-GJTLWOKJ.js → chunk-HQA3IBLZ.js} +51 -18
  42. package/dist/chunk-HQA3IBLZ.js.map +1 -0
  43. package/dist/{chunk-4BXXAZ75.js → chunk-HQTHWVAK.js} +15 -7
  44. package/dist/chunk-HQTHWVAK.js.map +1 -0
  45. package/dist/{chunk-CCLV5CAA.js → chunk-JGOH7RWL.js} +7 -3
  46. package/dist/chunk-JGOH7RWL.js.map +1 -0
  47. package/dist/{chunk-Y6TGIUGL.js → chunk-LSF5WJ6G.js} +2 -2
  48. package/dist/{chunk-Y6TGIUGL.js.map → chunk-LSF5WJ6G.js.map} +1 -1
  49. package/dist/{chunk-D6HO5QAM.cjs → chunk-M26GEN4C.cjs} +14 -9
  50. package/dist/chunk-M26GEN4C.cjs.map +1 -0
  51. package/dist/{chunk-4P35AVPE.cjs → chunk-MEMYFFOL.cjs} +256 -157
  52. package/dist/chunk-MEMYFFOL.cjs.map +1 -0
  53. package/dist/{chunk-BQ355Z3O.js → chunk-NUZWQA4J.js} +4 -4
  54. package/dist/{chunk-BQ355Z3O.js.map → chunk-NUZWQA4J.js.map} +1 -1
  55. package/dist/{chunk-JIRB5LX4.js → chunk-OHX36YXF.js} +5 -3
  56. package/dist/chunk-OHX36YXF.js.map +1 -0
  57. package/dist/{chunk-PKORY4ZZ.cjs → chunk-OOTLMVNN.cjs} +107 -7
  58. package/dist/chunk-OOTLMVNN.cjs.map +1 -0
  59. package/dist/{chunk-D4M6E4OQ.cjs → chunk-OWZ6QT24.cjs} +16 -8
  60. package/dist/chunk-OWZ6QT24.cjs.map +1 -0
  61. package/dist/{chunk-6OHS6ZQ3.js → chunk-PDJCIONR.js} +8 -8
  62. package/dist/{chunk-6OHS6ZQ3.js.map → chunk-PDJCIONR.js.map} +1 -1
  63. package/dist/{chunk-WU2P7XOU.cjs → chunk-PP4G2TZZ.cjs} +20 -20
  64. package/dist/{chunk-WU2P7XOU.cjs.map → chunk-PP4G2TZZ.cjs.map} +1 -1
  65. package/dist/{chunk-VWAK25TU.js → chunk-SBBWRNZA.js} +10 -7
  66. package/dist/chunk-SBBWRNZA.js.map +1 -0
  67. package/dist/{chunk-TU4YMXOQ.js → chunk-TJIFNVPX.js} +6 -6
  68. package/dist/{chunk-TU4YMXOQ.js.map → chunk-TJIFNVPX.js.map} +1 -1
  69. package/dist/{chunk-V5YNS2QO.cjs → chunk-XJNQHPBJ.cjs} +15 -15
  70. package/dist/{chunk-V5YNS2QO.cjs.map → chunk-XJNQHPBJ.cjs.map} +1 -1
  71. package/dist/{chunk-MVYP55NA.js → chunk-YC6Z75K2.js} +113 -336
  72. package/dist/chunk-YC6Z75K2.js.map +1 -0
  73. package/dist/{chunk-3ZF7IC6Q.cjs → chunk-YZMSJKAK.cjs} +5 -3
  74. package/dist/chunk-YZMSJKAK.cjs.map +1 -0
  75. package/dist/{chunk-L3WDI7HP.cjs → chunk-Z2X5VTYJ.cjs} +65 -65
  76. package/dist/{chunk-L3WDI7HP.cjs.map → chunk-Z2X5VTYJ.cjs.map} +1 -1
  77. package/dist/{chunk-BN5MV2QK.cjs → chunk-Z52OAJ73.cjs} +4 -4
  78. package/dist/{chunk-BN5MV2QK.cjs.map → chunk-Z52OAJ73.cjs.map} +1 -1
  79. package/dist/{chunk-WYPSC6CO.js → chunk-ZBU6P4JV.js} +104 -4
  80. package/dist/chunk-ZBU6P4JV.js.map +1 -0
  81. package/dist/datasets/experiment/index.d.ts.map +1 -1
  82. package/dist/datasets/experiment/scorer.d.ts.map +1 -1
  83. package/dist/datasets/index.cjs +17 -17
  84. package/dist/datasets/index.js +2 -2
  85. package/dist/di/index.cjs +4 -4
  86. package/dist/di/index.js +1 -1
  87. package/dist/docs/SKILL.md +1 -1
  88. package/dist/docs/assets/SOURCE_MAP.json +443 -384
  89. package/dist/docs/references/docs-agents-agent-approval.md +61 -31
  90. package/dist/docs/references/docs-agents-supervisor-agents.md +1 -1
  91. package/dist/docs/references/docs-memory-observational-memory.md +9 -0
  92. package/dist/docs/references/docs-memory-semantic-recall.md +17 -1
  93. package/dist/docs/references/docs-workspace-skills.md +7 -5
  94. package/dist/docs/references/reference-agents-agent.md +20 -20
  95. package/dist/docs/references/reference-agents-generate.md +200 -66
  96. package/dist/docs/references/reference-agents-generateLegacy.md +77 -35
  97. package/dist/docs/references/reference-agents-getDefaultGenerateOptions.md +4 -6
  98. package/dist/docs/references/reference-agents-getDefaultOptions.md +4 -6
  99. package/dist/docs/references/reference-agents-getDefaultStreamOptions.md +4 -6
  100. package/dist/docs/references/reference-agents-getDescription.md +1 -1
  101. package/dist/docs/references/reference-agents-getInstructions.md +4 -6
  102. package/dist/docs/references/reference-agents-getLLM.md +6 -8
  103. package/dist/docs/references/reference-agents-getMemory.md +4 -6
  104. package/dist/docs/references/reference-agents-getModel.md +4 -6
  105. package/dist/docs/references/reference-agents-getTools.md +5 -7
  106. package/dist/docs/references/reference-agents-getVoice.md +4 -6
  107. package/dist/docs/references/reference-agents-listAgents.md +4 -6
  108. package/dist/docs/references/reference-agents-listScorers.md +4 -6
  109. package/dist/docs/references/reference-agents-listTools.md +4 -6
  110. package/dist/docs/references/reference-agents-listWorkflows.md +4 -6
  111. package/dist/docs/references/reference-agents-network.md +69 -23
  112. package/dist/docs/references/reference-ai-sdk-chat-route.md +7 -7
  113. package/dist/docs/references/reference-ai-sdk-network-route.md +3 -3
  114. package/dist/docs/references/reference-ai-sdk-to-ai-sdk-stream.md +9 -9
  115. package/dist/docs/references/reference-ai-sdk-with-mastra.md +12 -12
  116. package/dist/docs/references/reference-ai-sdk-workflow-route.md +3 -3
  117. package/dist/docs/references/reference-auth-auth0.md +6 -6
  118. package/dist/docs/references/reference-auth-clerk.md +5 -5
  119. package/dist/docs/references/reference-auth-firebase.md +7 -7
  120. package/dist/docs/references/reference-auth-jwt.md +1 -1
  121. package/dist/docs/references/reference-auth-supabase.md +4 -4
  122. package/dist/docs/references/reference-auth-workos.md +6 -6
  123. package/dist/docs/references/reference-core-addGateway.md +2 -2
  124. package/dist/docs/references/reference-core-getAgent.md +2 -2
  125. package/dist/docs/references/reference-core-getAgentById.md +2 -2
  126. package/dist/docs/references/reference-core-getDeployer.md +1 -1
  127. package/dist/docs/references/reference-core-getGateway.md +2 -2
  128. package/dist/docs/references/reference-core-getGatewayById.md +2 -2
  129. package/dist/docs/references/reference-core-getLogger.md +1 -1
  130. package/dist/docs/references/reference-core-getMCPServer.md +2 -2
  131. package/dist/docs/references/reference-core-getMCPServerById.md +3 -3
  132. package/dist/docs/references/reference-core-getMemory.md +2 -2
  133. package/dist/docs/references/reference-core-getScorer.md +2 -2
  134. package/dist/docs/references/reference-core-getScorerById.md +2 -2
  135. package/dist/docs/references/reference-core-getServer.md +1 -1
  136. package/dist/docs/references/reference-core-getStorage.md +1 -1
  137. package/dist/docs/references/reference-core-getStoredAgentById.md +18 -20
  138. package/dist/docs/references/reference-core-getTelemetry.md +1 -1
  139. package/dist/docs/references/reference-core-getVector.md +2 -2
  140. package/dist/docs/references/reference-core-getWorkflow.md +3 -3
  141. package/dist/docs/references/reference-core-listAgents.md +1 -1
  142. package/dist/docs/references/reference-core-listGateways.md +1 -1
  143. package/dist/docs/references/reference-core-listLogs.md +9 -11
  144. package/dist/docs/references/reference-core-listLogsByRunId.md +9 -9
  145. package/dist/docs/references/reference-core-listMCPServers.md +1 -1
  146. package/dist/docs/references/reference-core-listMemory.md +1 -1
  147. package/dist/docs/references/reference-core-listScorers.md +1 -1
  148. package/dist/docs/references/reference-core-listStoredAgents.md +9 -11
  149. package/dist/docs/references/reference-core-listVectors.md +1 -1
  150. package/dist/docs/references/reference-core-listWorkflows.md +2 -2
  151. package/dist/docs/references/reference-core-mastra-class.md +17 -17
  152. package/dist/docs/references/reference-core-mastra-model-gateway.md +15 -15
  153. package/dist/docs/references/reference-core-setLogger.md +2 -4
  154. package/dist/docs/references/reference-core-setStorage.md +1 -1
  155. package/dist/docs/references/reference-datasets-addItem.md +20 -4
  156. package/dist/docs/references/reference-datasets-addItems.md +8 -2
  157. package/dist/docs/references/reference-datasets-compareExperiments.md +15 -3
  158. package/dist/docs/references/reference-datasets-create.md +6 -6
  159. package/dist/docs/references/reference-datasets-dataset.md +1 -1
  160. package/dist/docs/references/reference-datasets-delete.md +2 -2
  161. package/dist/docs/references/reference-datasets-deleteExperiment.md +2 -2
  162. package/dist/docs/references/reference-datasets-deleteItem.md +2 -2
  163. package/dist/docs/references/reference-datasets-deleteItems.md +2 -2
  164. package/dist/docs/references/reference-datasets-get.md +2 -2
  165. package/dist/docs/references/reference-datasets-getDetails.md +9 -9
  166. package/dist/docs/references/reference-datasets-getExperiment.md +2 -2
  167. package/dist/docs/references/reference-datasets-getItem.md +3 -3
  168. package/dist/docs/references/reference-datasets-getItemHistory.md +22 -2
  169. package/dist/docs/references/reference-datasets-list.md +7 -3
  170. package/dist/docs/references/reference-datasets-listExperimentResults.md +34 -4
  171. package/dist/docs/references/reference-datasets-listExperiments.md +41 -3
  172. package/dist/docs/references/reference-datasets-listItems.md +18 -6
  173. package/dist/docs/references/reference-datasets-listVersions.md +23 -3
  174. package/dist/docs/references/reference-datasets-startExperiment.md +62 -12
  175. package/dist/docs/references/reference-datasets-startExperimentAsync.md +5 -1
  176. package/dist/docs/references/reference-datasets-update.md +6 -6
  177. package/dist/docs/references/reference-datasets-updateItem.md +5 -5
  178. package/dist/docs/references/reference-evals-answer-relevancy.md +11 -11
  179. package/dist/docs/references/reference-evals-answer-similarity.md +17 -19
  180. package/dist/docs/references/reference-evals-bias.md +10 -10
  181. package/dist/docs/references/reference-evals-completeness.md +3 -3
  182. package/dist/docs/references/reference-evals-content-similarity.md +6 -6
  183. package/dist/docs/references/reference-evals-context-precision.md +4 -4
  184. package/dist/docs/references/reference-evals-create-scorer.md +47 -49
  185. package/dist/docs/references/reference-evals-faithfulness.md +11 -11
  186. package/dist/docs/references/reference-evals-hallucination.md +17 -21
  187. package/dist/docs/references/reference-evals-keyword-coverage.md +4 -4
  188. package/dist/docs/references/reference-evals-mastra-scorer.md +14 -14
  189. package/dist/docs/references/reference-evals-run-evals.md +16 -16
  190. package/dist/docs/references/reference-evals-scorer-utils.md +3 -3
  191. package/dist/docs/references/reference-evals-textual-difference.md +3 -3
  192. package/dist/docs/references/reference-evals-tone-consistency.md +3 -3
  193. package/dist/docs/references/reference-evals-toxicity.md +8 -8
  194. package/dist/docs/references/reference-harness-harness-class.md +34 -42
  195. package/dist/docs/references/reference-logging-pino-logger.md +5 -5
  196. package/dist/docs/references/reference-memory-deleteMessages.md +2 -2
  197. package/dist/docs/references/reference-memory-memory-class.md +12 -14
  198. package/dist/docs/references/reference-memory-observational-memory.md +102 -94
  199. package/dist/docs/references/reference-observability-tracing-configuration.md +27 -10
  200. package/dist/docs/references/reference-observability-tracing-exporters-console-exporter.md +4 -7
  201. package/dist/docs/references/reference-processors-batch-parts-processor.md +8 -10
  202. package/dist/docs/references/reference-processors-language-detector.md +14 -16
  203. package/dist/docs/references/reference-processors-message-history-processor.md +7 -9
  204. package/dist/docs/references/reference-processors-moderation-processor.md +13 -15
  205. package/dist/docs/references/reference-processors-pii-detector.md +14 -16
  206. package/dist/docs/references/reference-processors-processor-interface.md +62 -62
  207. package/dist/docs/references/reference-processors-prompt-injection-detector.md +11 -13
  208. package/dist/docs/references/reference-processors-semantic-recall-processor.md +14 -16
  209. package/dist/docs/references/reference-processors-system-prompt-scrubber.md +12 -14
  210. package/dist/docs/references/reference-processors-token-limiter-processor.md +11 -13
  211. package/dist/docs/references/reference-processors-tool-call-filter.md +5 -7
  212. package/dist/docs/references/reference-processors-tool-search-processor.md +9 -11
  213. package/dist/docs/references/reference-processors-unicode-normalizer.md +8 -10
  214. package/dist/docs/references/reference-processors-working-memory-processor.md +14 -18
  215. package/dist/docs/references/reference-rag-database-config.md +11 -7
  216. package/dist/docs/references/reference-rag-embeddings.md +12 -12
  217. package/dist/docs/references/reference-server-mastra-server.md +10 -10
  218. package/dist/docs/references/reference-server-register-api-route.md +13 -13
  219. package/dist/docs/references/reference-storage-cloudflare-d1.md +5 -5
  220. package/dist/docs/references/reference-storage-composite.md +9 -9
  221. package/dist/docs/references/reference-storage-lance.md +3 -3
  222. package/dist/docs/references/reference-storage-libsql.md +2 -2
  223. package/dist/docs/references/reference-storage-mongodb.md +5 -5
  224. package/dist/docs/references/reference-storage-mssql.md +2 -2
  225. package/dist/docs/references/reference-storage-postgresql.md +25 -25
  226. package/dist/docs/references/reference-storage-upstash.md +3 -3
  227. package/dist/docs/references/reference-streaming-ChunkType.md +251 -59
  228. package/dist/docs/references/reference-streaming-agents-MastraModelOutput.md +86 -16
  229. package/dist/docs/references/reference-streaming-agents-streamLegacy.md +79 -39
  230. package/dist/docs/references/reference-streaming-workflows-resumeStream.md +18 -8
  231. package/dist/docs/references/reference-streaming-workflows-stream.md +21 -9
  232. package/dist/docs/references/reference-streaming-workflows-timeTravelStream.md +4 -4
  233. package/dist/docs/references/reference-tools-create-tool.md +25 -21
  234. package/dist/docs/references/reference-tools-graph-rag-tool.md +16 -18
  235. package/dist/docs/references/reference-tools-mcp-client.md +38 -27
  236. package/dist/docs/references/reference-tools-mcp-server.md +45 -45
  237. package/dist/docs/references/reference-tools-vector-query-tool.md +34 -22
  238. package/dist/docs/references/reference-vectors-libsql.md +31 -31
  239. package/dist/docs/references/reference-vectors-mongodb.md +32 -32
  240. package/dist/docs/references/reference-vectors-pg.md +60 -44
  241. package/dist/docs/references/reference-vectors-upstash.md +25 -25
  242. package/dist/docs/references/reference-voice-composite-voice.md +10 -10
  243. package/dist/docs/references/reference-voice-mastra-voice.md +20 -20
  244. package/dist/docs/references/reference-voice-voice.addInstructions.md +1 -1
  245. package/dist/docs/references/reference-voice-voice.addTools.md +1 -1
  246. package/dist/docs/references/reference-voice-voice.connect.md +3 -3
  247. package/dist/docs/references/reference-voice-voice.events.md +11 -11
  248. package/dist/docs/references/reference-voice-voice.listen.md +9 -9
  249. package/dist/docs/references/reference-voice-voice.on.md +2 -2
  250. package/dist/docs/references/reference-voice-voice.speak.md +11 -11
  251. package/dist/docs/references/reference-workflows-run-methods-cancel.md +2 -2
  252. package/dist/docs/references/reference-workflows-run-methods-restart.md +17 -5
  253. package/dist/docs/references/reference-workflows-run-methods-resume.md +23 -9
  254. package/dist/docs/references/reference-workflows-run-methods-start.md +22 -8
  255. package/dist/docs/references/reference-workflows-run-methods-startAsync.md +12 -6
  256. package/dist/docs/references/reference-workflows-run-methods-timeTravel.md +29 -13
  257. package/dist/docs/references/reference-workflows-run.md +12 -12
  258. package/dist/docs/references/reference-workflows-step.md +24 -26
  259. package/dist/docs/references/reference-workflows-workflow-methods-branch.md +2 -2
  260. package/dist/docs/references/reference-workflows-workflow-methods-commit.md +1 -1
  261. package/dist/docs/references/reference-workflows-workflow-methods-create-run.md +4 -4
  262. package/dist/docs/references/reference-workflows-workflow-methods-dountil.md +3 -3
  263. package/dist/docs/references/reference-workflows-workflow-methods-dowhile.md +3 -3
  264. package/dist/docs/references/reference-workflows-workflow-methods-foreach.md +9 -9
  265. package/dist/docs/references/reference-workflows-workflow-methods-map.md +2 -2
  266. package/dist/docs/references/reference-workflows-workflow-methods-parallel.md +2 -2
  267. package/dist/docs/references/reference-workflows-workflow-methods-sleep.md +2 -2
  268. package/dist/docs/references/reference-workflows-workflow-methods-sleepUntil.md +2 -2
  269. package/dist/docs/references/reference-workflows-workflow-methods-then.md +2 -2
  270. package/dist/docs/references/reference-workflows-workflow.md +40 -50
  271. package/dist/docs/references/reference-workspace-filesystem.md +22 -22
  272. package/dist/docs/references/reference-workspace-local-filesystem.md +35 -35
  273. package/dist/docs/references/reference-workspace-local-sandbox.md +26 -26
  274. package/dist/docs/references/reference-workspace-sandbox.md +8 -8
  275. package/dist/docs/references/reference-workspace-workspace-class.md +30 -34
  276. package/dist/editor/types.d.ts +1 -0
  277. package/dist/editor/types.d.ts.map +1 -1
  278. package/dist/evals/index.cjs +20 -20
  279. package/dist/evals/index.js +3 -3
  280. package/dist/evals/scoreTraces/index.cjs +5 -5
  281. package/dist/evals/scoreTraces/index.js +2 -2
  282. package/dist/harness/harness.d.ts.map +1 -1
  283. package/dist/harness/index.cjs +25 -21
  284. package/dist/harness/index.cjs.map +1 -1
  285. package/dist/harness/index.js +15 -11
  286. package/dist/harness/index.js.map +1 -1
  287. package/dist/index.cjs +2 -2
  288. package/dist/index.js +1 -1
  289. package/dist/integration/index.cjs +2 -2
  290. package/dist/integration/index.js +1 -1
  291. package/dist/llm/index.cjs +12 -12
  292. package/dist/llm/index.js +3 -3
  293. package/dist/llm/model/model.d.ts.map +1 -1
  294. package/dist/llm/model/model.loop.d.ts.map +1 -1
  295. package/dist/llm/model/provider-types.generated.d.ts +5 -1
  296. package/dist/loop/index.cjs +14 -14
  297. package/dist/loop/index.js +1 -1
  298. package/dist/loop/workflows/agentic-loop/index.d.ts.map +1 -1
  299. package/dist/mastra/index.cjs +2 -2
  300. package/dist/mastra/index.js +1 -1
  301. package/dist/memory/index.cjs +14 -14
  302. package/dist/memory/index.js +1 -1
  303. package/dist/models-dev-2FJK72J2.cjs +12 -0
  304. package/dist/{models-dev-UVWCKPA2.cjs.map → models-dev-2FJK72J2.cjs.map} +1 -1
  305. package/dist/models-dev-CMQG6EMO.js +3 -0
  306. package/dist/{models-dev-W3LXZTEB.js.map → models-dev-CMQG6EMO.js.map} +1 -1
  307. package/dist/processor-provider/index.cjs +10 -10
  308. package/dist/processor-provider/index.js +1 -1
  309. package/dist/processors/index.cjs +42 -42
  310. package/dist/processors/index.js +1 -1
  311. package/dist/processors/processors/skills.d.ts +9 -42
  312. package/dist/processors/processors/skills.d.ts.map +1 -1
  313. package/dist/provider-registry-EHOAWHFE.cjs +40 -0
  314. package/dist/{provider-registry-4HLP2JRR.cjs.map → provider-registry-EHOAWHFE.cjs.map} +1 -1
  315. package/dist/provider-registry-LVP6T63V.js +3 -0
  316. package/dist/{provider-registry-K3DWQSMH.js.map → provider-registry-LVP6T63V.js.map} +1 -1
  317. package/dist/provider-registry.json +12 -4
  318. package/dist/relevance/index.cjs +3 -3
  319. package/dist/relevance/index.js +1 -1
  320. package/dist/request-context/index.cjs +4 -4
  321. package/dist/request-context/index.d.ts.map +1 -1
  322. package/dist/request-context/index.js +1 -1
  323. package/dist/storage/base.d.ts +34 -1
  324. package/dist/storage/base.d.ts.map +1 -1
  325. package/dist/storage/constants.cjs +56 -56
  326. package/dist/storage/constants.js +1 -1
  327. package/dist/storage/domains/agents/filesystem.d.ts +28 -0
  328. package/dist/storage/domains/agents/filesystem.d.ts.map +1 -0
  329. package/dist/storage/domains/agents/index.d.ts +1 -0
  330. package/dist/storage/domains/agents/index.d.ts.map +1 -1
  331. package/dist/storage/domains/experiments/inmemory.d.ts.map +1 -1
  332. package/dist/storage/domains/mcp-clients/filesystem.d.ts +28 -0
  333. package/dist/storage/domains/mcp-clients/filesystem.d.ts.map +1 -0
  334. package/dist/storage/domains/mcp-clients/index.d.ts +1 -0
  335. package/dist/storage/domains/mcp-clients/index.d.ts.map +1 -1
  336. package/dist/storage/domains/mcp-servers/filesystem.d.ts +28 -0
  337. package/dist/storage/domains/mcp-servers/filesystem.d.ts.map +1 -0
  338. package/dist/storage/domains/mcp-servers/index.d.ts +1 -0
  339. package/dist/storage/domains/mcp-servers/index.d.ts.map +1 -1
  340. package/dist/storage/domains/prompt-blocks/filesystem.d.ts +28 -0
  341. package/dist/storage/domains/prompt-blocks/filesystem.d.ts.map +1 -0
  342. package/dist/storage/domains/prompt-blocks/index.d.ts +1 -0
  343. package/dist/storage/domains/prompt-blocks/index.d.ts.map +1 -1
  344. package/dist/storage/domains/scorer-definitions/filesystem.d.ts +28 -0
  345. package/dist/storage/domains/scorer-definitions/filesystem.d.ts.map +1 -0
  346. package/dist/storage/domains/scorer-definitions/index.d.ts +1 -0
  347. package/dist/storage/domains/scorer-definitions/index.d.ts.map +1 -1
  348. package/dist/storage/domains/skills/filesystem.d.ts +28 -0
  349. package/dist/storage/domains/skills/filesystem.d.ts.map +1 -0
  350. package/dist/storage/domains/skills/index.d.ts +1 -0
  351. package/dist/storage/domains/skills/index.d.ts.map +1 -1
  352. package/dist/storage/domains/workspaces/filesystem.d.ts +28 -0
  353. package/dist/storage/domains/workspaces/filesystem.d.ts.map +1 -0
  354. package/dist/storage/domains/workspaces/index.d.ts +1 -0
  355. package/dist/storage/domains/workspaces/index.d.ts.map +1 -1
  356. package/dist/storage/filesystem-db.d.ts +82 -0
  357. package/dist/storage/filesystem-db.d.ts.map +1 -0
  358. package/dist/storage/filesystem-versioned.d.ts +148 -0
  359. package/dist/storage/filesystem-versioned.d.ts.map +1 -0
  360. package/dist/storage/filesystem.d.ts +39 -0
  361. package/dist/storage/filesystem.d.ts.map +1 -0
  362. package/dist/storage/git-history.d.ts +68 -0
  363. package/dist/storage/git-history.d.ts.map +1 -0
  364. package/dist/storage/index.cjs +208 -160
  365. package/dist/storage/index.d.ts +4 -0
  366. package/dist/storage/index.d.ts.map +1 -1
  367. package/dist/storage/index.js +2 -2
  368. package/dist/storage/types.d.ts +1 -0
  369. package/dist/storage/types.d.ts.map +1 -1
  370. package/dist/stream/RunOutput.d.ts +1 -1
  371. package/dist/stream/aisdk/v5/output-helpers.d.ts +6 -6
  372. package/dist/stream/base/output.d.ts +3 -3
  373. package/dist/stream/base/schema.d.ts +1 -1
  374. package/dist/stream/index.cjs +11 -11
  375. package/dist/stream/index.js +2 -2
  376. package/dist/test-utils/llm-mock.cjs +4 -4
  377. package/dist/test-utils/llm-mock.js +1 -1
  378. package/dist/tool-loop-agent/index.cjs +4 -4
  379. package/dist/tool-loop-agent/index.js +1 -1
  380. package/dist/tools/index.cjs +6 -6
  381. package/dist/tools/index.js +1 -1
  382. package/dist/tools/is-vercel-tool.cjs +2 -2
  383. package/dist/tools/is-vercel-tool.js +1 -1
  384. package/dist/tools/tool-builder/builder.d.ts.map +1 -1
  385. package/dist/tools/tool.d.ts +6 -0
  386. package/dist/tools/tool.d.ts.map +1 -1
  387. package/dist/tools/types.d.ts +27 -0
  388. package/dist/tools/types.d.ts.map +1 -1
  389. package/dist/utils.cjs +23 -23
  390. package/dist/utils.js +1 -1
  391. package/dist/vector/index.cjs +9 -9
  392. package/dist/vector/index.js +2 -2
  393. package/dist/workflows/evented/index.cjs +10 -10
  394. package/dist/workflows/evented/index.js +1 -1
  395. package/dist/workflows/index.cjs +25 -25
  396. package/dist/workflows/index.js +1 -1
  397. package/dist/workspace/index.cjs +70 -66
  398. package/dist/workspace/index.d.ts +1 -0
  399. package/dist/workspace/index.d.ts.map +1 -1
  400. package/dist/workspace/index.js +1 -1
  401. package/dist/workspace/sandbox/execa.d.ts +9 -0
  402. package/dist/workspace/sandbox/execa.d.ts.map +1 -0
  403. package/dist/workspace/sandbox/local-process-manager.d.ts.map +1 -1
  404. package/dist/workspace/skills/index.d.ts +1 -0
  405. package/dist/workspace/skills/index.d.ts.map +1 -1
  406. package/dist/workspace/skills/tools.d.ts +36 -0
  407. package/dist/workspace/skills/tools.d.ts.map +1 -0
  408. package/dist/workspace/tools/execute-command.d.ts.map +1 -1
  409. package/dist/workspace/tools/output-helpers.d.ts +4 -3
  410. package/dist/workspace/tools/output-helpers.d.ts.map +1 -1
  411. package/package.json +9 -9
  412. package/src/llm/model/provider-types.generated.d.ts +5 -1
  413. package/dist/chunk-3ZF7IC6Q.cjs.map +0 -1
  414. package/dist/chunk-4BXXAZ75.js.map +0 -1
  415. package/dist/chunk-4P35AVPE.cjs.map +0 -1
  416. package/dist/chunk-BFV3GSGS.js.map +0 -1
  417. package/dist/chunk-CCLV5CAA.js.map +0 -1
  418. package/dist/chunk-D4M6E4OQ.cjs.map +0 -1
  419. package/dist/chunk-D6HO5QAM.cjs.map +0 -1
  420. package/dist/chunk-G5R2755Q.cjs.map +0 -1
  421. package/dist/chunk-GJTLWOKJ.js.map +0 -1
  422. package/dist/chunk-H5S4PS44.cjs.map +0 -1
  423. package/dist/chunk-IOY7Y5GV.js.map +0 -1
  424. package/dist/chunk-JIRB5LX4.js.map +0 -1
  425. package/dist/chunk-MVYP55NA.js.map +0 -1
  426. package/dist/chunk-PKORY4ZZ.cjs.map +0 -1
  427. package/dist/chunk-QNXY3J6B.cjs.map +0 -1
  428. package/dist/chunk-SEKQJ447.js.map +0 -1
  429. package/dist/chunk-VDKWYUGC.cjs.map +0 -1
  430. package/dist/chunk-VWAK25TU.js.map +0 -1
  431. package/dist/chunk-WYPSC6CO.js.map +0 -1
  432. package/dist/chunk-YIJZBU54.cjs.map +0 -1
  433. package/dist/chunk-ZBESCKPX.cjs.map +0 -1
  434. package/dist/chunk-ZVWVQ6MG.js.map +0 -1
  435. package/dist/models-dev-UVWCKPA2.cjs +0 -12
  436. package/dist/models-dev-W3LXZTEB.js +0 -3
  437. package/dist/provider-registry-4HLP2JRR.cjs +0 -40
  438. package/dist/provider-registry-K3DWQSMH.js +0 -3
@@ -1,13 +1,25 @@
1
- import { MessageList } from './chunk-JIRB5LX4.js';
2
- import { TABLE_SCHEMAS, TABLE_SCORERS, listTracesArgsSchema, toTraceSpans, TABLE_WORKFLOW_SNAPSHOT } from './chunk-Y6TGIUGL.js';
3
- import { deepEqual } from './chunk-VWAK25TU.js';
1
+ import { MessageList } from './chunk-OHX36YXF.js';
2
+ import { TABLE_SCHEMAS, TABLE_SCORERS, listTracesArgsSchema, toTraceSpans, TABLE_WORKFLOW_SNAPSHOT } from './chunk-LSF5WJ6G.js';
3
+ import { deepEqual } from './chunk-SBBWRNZA.js';
4
4
  import { MastraError } from './chunk-FJEVLHJT.js';
5
5
  import { MastraBase } from './chunk-WCAFTXGK.js';
6
6
  import { jsonSchemaToZod } from '@mastra/schema-compat/json-to-zod';
7
7
  import { z } from 'zod';
8
8
  import { randomUUID } from 'crypto';
9
+ import { relative, join, dirname, resolve, sep } from 'path';
10
+ import { execFile } from 'child_process';
11
+ import { realpathSync, existsSync, mkdirSync, readFileSync, writeFileSync, renameSync, rmSync, readdirSync, statSync } from 'fs';
9
12
 
10
13
  // src/storage/base.ts
14
+ var EDITOR_DOMAINS = [
15
+ "agents",
16
+ "promptBlocks",
17
+ "scorerDefinitions",
18
+ "mcpClients",
19
+ "mcpServers",
20
+ "workspaces",
21
+ "skills"
22
+ ];
11
23
  function normalizePerPage(perPageInput, defaultValue) {
12
24
  if (perPageInput === false) {
13
25
  return Number.MAX_SAFE_INTEGER;
@@ -46,30 +58,39 @@ var MastraCompositeStore = class extends MastraBase {
46
58
  });
47
59
  this.id = config.id;
48
60
  this.disableInit = config.disableInit ?? false;
49
- if (config.default || config.domains) {
61
+ if (config.default || config.editor || config.domains) {
50
62
  const defaultStores = config.default?.stores;
63
+ const editorStores = config.editor?.stores;
51
64
  const domainOverrides = config.domains ?? {};
52
65
  const hasDefaultDomains = defaultStores && Object.values(defaultStores).some((v) => v !== void 0);
66
+ const hasEditorDomains = editorStores && Object.values(editorStores).some((v) => v !== void 0);
53
67
  const hasOverrideDomains = Object.values(domainOverrides).some((v) => v !== void 0);
54
- if (!hasDefaultDomains && !hasOverrideDomains) {
68
+ if (!hasDefaultDomains && !hasEditorDomains && !hasOverrideDomains) {
55
69
  throw new Error(
56
- "MastraCompositeStore requires at least one storage source. Provide either a default storage with domains or domain overrides."
70
+ "MastraCompositeStore requires at least one storage source. Provide a default storage, an editor storage, or domain overrides."
57
71
  );
58
72
  }
73
+ const editorDomainSet = new Set(EDITOR_DOMAINS);
74
+ const resolve3 = (key) => {
75
+ if (domainOverrides[key] !== void 0) return domainOverrides[key];
76
+ if (editorDomainSet.has(key) && editorStores?.[key] !== void 0) return editorStores[key];
77
+ return defaultStores?.[key];
78
+ };
59
79
  this.stores = {
60
- memory: domainOverrides.memory ?? defaultStores?.memory,
61
- workflows: domainOverrides.workflows ?? defaultStores?.workflows,
62
- scores: domainOverrides.scores ?? defaultStores?.scores,
63
- observability: domainOverrides.observability ?? defaultStores?.observability,
64
- agents: domainOverrides.agents ?? defaultStores?.agents,
65
- datasets: domainOverrides.datasets ?? defaultStores?.datasets,
66
- experiments: domainOverrides.experiments ?? defaultStores?.experiments,
67
- promptBlocks: domainOverrides.promptBlocks ?? defaultStores?.promptBlocks,
68
- scorerDefinitions: domainOverrides.scorerDefinitions ?? defaultStores?.scorerDefinitions,
69
- mcpClients: domainOverrides.mcpClients ?? defaultStores?.mcpClients,
70
- mcpServers: domainOverrides.mcpServers ?? defaultStores?.mcpServers,
71
- workspaces: domainOverrides.workspaces ?? defaultStores?.workspaces,
72
- skills: domainOverrides.skills ?? defaultStores?.skills
80
+ memory: resolve3("memory"),
81
+ workflows: resolve3("workflows"),
82
+ scores: resolve3("scores"),
83
+ observability: resolve3("observability"),
84
+ agents: resolve3("agents"),
85
+ datasets: resolve3("datasets"),
86
+ experiments: resolve3("experiments"),
87
+ promptBlocks: resolve3("promptBlocks"),
88
+ scorerDefinitions: resolve3("scorerDefinitions"),
89
+ mcpClients: resolve3("mcpClients"),
90
+ mcpServers: resolve3("mcpServers"),
91
+ workspaces: resolve3("workspaces"),
92
+ skills: resolve3("skills"),
93
+ blobs: resolve3("blobs")
73
94
  };
74
95
  }
75
96
  }
@@ -1238,6 +1259,7 @@ var ExperimentsInMemory = class extends ExperimentsStorage {
1238
1259
  const updated = {
1239
1260
  ...existing,
1240
1261
  status: input.status ?? existing.status,
1262
+ totalItems: input.totalItems ?? existing.totalItems,
1241
1263
  succeededCount: input.succeededCount ?? existing.succeededCount,
1242
1264
  failedCount: input.failedCount ?? existing.failedCount,
1243
1265
  skippedCount: input.skippedCount ?? existing.skippedCount,
@@ -5346,6 +5368,1508 @@ var InMemoryStore = class extends MastraCompositeStore {
5346
5368
  }
5347
5369
  };
5348
5370
  var MockStore = InMemoryStore;
5371
+ var GitHistory = class {
5372
+ /** Cache: dir → repo root (string) or `false` if not a repo. */
5373
+ repoRootCache = /* @__PURE__ */ new Map();
5374
+ /** Cache: `dir:filename:limit` → ordered commits (newest first). */
5375
+ commitCache = /* @__PURE__ */ new Map();
5376
+ /** Cache: `dir:commitHash:filename` → parsed JSON. */
5377
+ snapshotCache = /* @__PURE__ */ new Map();
5378
+ // ===========================================================================
5379
+ // Public API
5380
+ // ===========================================================================
5381
+ /**
5382
+ * Returns `true` if `dir` is inside a Git repository.
5383
+ * Result is cached after the first call per directory.
5384
+ */
5385
+ async isGitRepo(dir) {
5386
+ const cached = this.repoRootCache.get(dir);
5387
+ if (cached === false) return false;
5388
+ if (typeof cached === "string") return true;
5389
+ try {
5390
+ const root = (await this.exec(dir, ["rev-parse", "--show-toplevel"])).trim();
5391
+ this.repoRootCache.set(dir, root);
5392
+ return true;
5393
+ } catch {
5394
+ this.repoRootCache.set(dir, false);
5395
+ return false;
5396
+ }
5397
+ }
5398
+ /**
5399
+ * Get the list of commits that touched a specific file, newest first.
5400
+ * Returns an empty array if Git is unavailable or the file has no history.
5401
+ *
5402
+ * @param dir Absolute path to the storage directory
5403
+ * @param filename The JSON filename relative to `dir` (e.g., 'agents.json')
5404
+ * @param limit Maximum number of commits to retrieve
5405
+ */
5406
+ async getFileHistory(dir, filename, limit = 50) {
5407
+ const cacheKey = `${dir}:${filename}:${limit}`;
5408
+ if (this.commitCache.has(cacheKey)) {
5409
+ return this.commitCache.get(cacheKey);
5410
+ }
5411
+ if (!await this.isGitRepo(dir)) {
5412
+ this.commitCache.set(cacheKey, []);
5413
+ return [];
5414
+ }
5415
+ try {
5416
+ const raw = await this.exec(dir, [
5417
+ "log",
5418
+ `--max-count=${limit}`,
5419
+ "--format=%H|%aI|%aN|%s",
5420
+ "--follow",
5421
+ "--",
5422
+ filename
5423
+ ]);
5424
+ const commits = [];
5425
+ for (const line of raw.split("\n")) {
5426
+ const trimmed = line.trim();
5427
+ if (!trimmed) continue;
5428
+ const pipeIdx1 = trimmed.indexOf("|");
5429
+ const pipeIdx2 = trimmed.indexOf("|", pipeIdx1 + 1);
5430
+ const pipeIdx3 = trimmed.indexOf("|", pipeIdx2 + 1);
5431
+ if (pipeIdx1 === -1 || pipeIdx2 === -1 || pipeIdx3 === -1) continue;
5432
+ commits.push({
5433
+ hash: trimmed.slice(0, pipeIdx1),
5434
+ date: new Date(trimmed.slice(pipeIdx1 + 1, pipeIdx2)),
5435
+ author: trimmed.slice(pipeIdx2 + 1, pipeIdx3),
5436
+ message: trimmed.slice(pipeIdx3 + 1)
5437
+ });
5438
+ }
5439
+ this.commitCache.set(cacheKey, commits);
5440
+ return commits;
5441
+ } catch {
5442
+ this.commitCache.set(cacheKey, []);
5443
+ return [];
5444
+ }
5445
+ }
5446
+ /**
5447
+ * Read and parse a JSON file at a specific Git commit.
5448
+ * Returns the parsed entity map, or `null` if the file didn't exist at that commit.
5449
+ *
5450
+ * @param dir Absolute path to the storage directory
5451
+ * @param commitHash Full or abbreviated commit SHA
5452
+ * @param filename The JSON filename relative to `dir` (e.g., 'agents.json')
5453
+ */
5454
+ async getFileAtCommit(dir, commitHash, filename) {
5455
+ const cacheKey = `${dir}:${commitHash}:${filename}`;
5456
+ if (this.snapshotCache.has(cacheKey)) {
5457
+ return this.snapshotCache.get(cacheKey);
5458
+ }
5459
+ if (!await this.isGitRepo(dir)) return null;
5460
+ try {
5461
+ const relPath = this.relativeToRepo(dir, filename);
5462
+ const raw = await this.exec(dir, ["show", `${commitHash}:${relPath}`]);
5463
+ const parsed = JSON.parse(raw);
5464
+ this.snapshotCache.set(cacheKey, parsed);
5465
+ return parsed;
5466
+ } catch {
5467
+ return null;
5468
+ }
5469
+ }
5470
+ /**
5471
+ * Invalidate all caches. Call after external operations that change Git state
5472
+ * (e.g., the user commits or pulls).
5473
+ */
5474
+ invalidateCache() {
5475
+ this.repoRootCache.clear();
5476
+ this.commitCache.clear();
5477
+ this.snapshotCache.clear();
5478
+ }
5479
+ // ===========================================================================
5480
+ // Internals
5481
+ // ===========================================================================
5482
+ /**
5483
+ * Get the relative path from the Git repo root to a file in the storage directory.
5484
+ */
5485
+ relativeToRepo(dir, filename) {
5486
+ const root = this.repoRootCache.get(dir);
5487
+ if (!root) {
5488
+ throw new Error(`Not a git repository: ${dir}`);
5489
+ }
5490
+ const realRoot = realpathSync(root);
5491
+ const realDir = realpathSync(dir);
5492
+ const relDir = relative(realRoot, realDir);
5493
+ return relDir ? `${relDir}/${filename}` : filename;
5494
+ }
5495
+ /**
5496
+ * Execute a git command and return stdout.
5497
+ */
5498
+ exec(cwd, args) {
5499
+ return new Promise((resolve3, reject) => {
5500
+ execFile("git", args, { cwd, maxBuffer: 10 * 1024 * 1024 }, (error, stdout) => {
5501
+ if (error) reject(error);
5502
+ else resolve3(stdout);
5503
+ });
5504
+ });
5505
+ }
5506
+ };
5507
+
5508
+ // src/storage/filesystem-versioned.ts
5509
+ var GIT_VERSION_PREFIX = "git-";
5510
+ var FilesystemVersionedHelpers = class _FilesystemVersionedHelpers {
5511
+ db;
5512
+ entitiesFile;
5513
+ parentIdField;
5514
+ name;
5515
+ versionMetadataFields;
5516
+ gitHistoryLimit;
5517
+ /**
5518
+ * In-memory entity records (thin metadata), keyed by entity ID.
5519
+ */
5520
+ entities = /* @__PURE__ */ new Map();
5521
+ /**
5522
+ * In-memory version records, keyed by version ID.
5523
+ * Includes both in-memory/hydrated versions and git-based versions (metadata only).
5524
+ */
5525
+ versions = /* @__PURE__ */ new Map();
5526
+ /**
5527
+ * Whether we've loaded from disk yet.
5528
+ */
5529
+ hydrated = false;
5530
+ /**
5531
+ * Git history utility instance (shared across all helpers).
5532
+ */
5533
+ static gitHistory = new GitHistory();
5534
+ /**
5535
+ * Promise that resolves when git history has been loaded.
5536
+ * null means git history loading hasn't been triggered yet.
5537
+ */
5538
+ gitHistoryPromise = null;
5539
+ /**
5540
+ * The highest version number from git history, per entity ID.
5541
+ * Used to assign version numbers to new in-memory versions that continue
5542
+ * after the git history.
5543
+ */
5544
+ gitVersionCounts = /* @__PURE__ */ new Map();
5545
+ constructor(config) {
5546
+ this.db = config.db;
5547
+ this.entitiesFile = config.entitiesFile;
5548
+ this.parentIdField = config.parentIdField;
5549
+ this.name = config.name;
5550
+ this.versionMetadataFields = config.versionMetadataFields;
5551
+ this.gitHistoryLimit = config.gitHistoryLimit ?? 50;
5552
+ }
5553
+ /**
5554
+ * Check if a version ID represents a git-based version.
5555
+ */
5556
+ static isGitVersion(id) {
5557
+ return id.startsWith(GIT_VERSION_PREFIX);
5558
+ }
5559
+ /**
5560
+ * Hydrate in-memory state from the on-disk JSON file.
5561
+ * For each entry on disk, creates an in-memory entity (status: 'published')
5562
+ * and a synthetic version with the snapshot config.
5563
+ *
5564
+ * Also kicks off async git history loading in the background.
5565
+ * Version numbers for hydrated entities are assigned as 1 initially,
5566
+ * but will be reassigned after git history loads.
5567
+ */
5568
+ hydrate() {
5569
+ if (this.hydrated) return;
5570
+ this.hydrated = true;
5571
+ const diskData = this.db.readDomain(this.entitiesFile);
5572
+ for (const [entityId, snapshotConfig] of Object.entries(diskData)) {
5573
+ if (!snapshotConfig || typeof snapshotConfig !== "object") continue;
5574
+ const versionId = `hydrated-${entityId}-v1`;
5575
+ const now = /* @__PURE__ */ new Date();
5576
+ const entity = {
5577
+ id: entityId,
5578
+ status: "published",
5579
+ activeVersionId: versionId,
5580
+ createdAt: now,
5581
+ updatedAt: now
5582
+ };
5583
+ this.entities.set(entityId, entity);
5584
+ const version = {
5585
+ id: versionId,
5586
+ [this.parentIdField]: entityId,
5587
+ versionNumber: 1,
5588
+ ...snapshotConfig,
5589
+ createdAt: now
5590
+ };
5591
+ this.versions.set(versionId, version);
5592
+ }
5593
+ this.gitHistoryPromise = this.loadGitHistory();
5594
+ }
5595
+ /**
5596
+ * Ensure git history has been loaded before proceeding.
5597
+ * Call this in version-related methods to ensure git versions are available.
5598
+ */
5599
+ async ensureGitHistory() {
5600
+ this.hydrate();
5601
+ if (this.gitHistoryPromise) {
5602
+ await this.gitHistoryPromise;
5603
+ }
5604
+ }
5605
+ /**
5606
+ * Load git commit history for the domain's JSON file.
5607
+ * Creates read-only version records (metadata + snapshot config) for each
5608
+ * commit where an entity existed. Reassigns version numbers for
5609
+ * hydrated (current disk) versions to sit on top of git history.
5610
+ */
5611
+ async loadGitHistory() {
5612
+ const git = _FilesystemVersionedHelpers.gitHistory;
5613
+ const dir = this.db.dir;
5614
+ const isRepo = await git.isGitRepo(dir);
5615
+ if (!isRepo) return;
5616
+ const commits = await git.getFileHistory(dir, this.entitiesFile, this.gitHistoryLimit);
5617
+ if (commits.length === 0) return;
5618
+ const orderedCommits = [...commits].reverse();
5619
+ const entityVersionCount = /* @__PURE__ */ new Map();
5620
+ const previousSnapshots = /* @__PURE__ */ new Map();
5621
+ for (let i = 0; i < orderedCommits.length; i++) {
5622
+ const commit = orderedCommits[i];
5623
+ const fileContent = await git.getFileAtCommit(
5624
+ dir,
5625
+ commit.hash,
5626
+ this.entitiesFile
5627
+ );
5628
+ if (!fileContent) continue;
5629
+ for (const [entityId, snapshotConfig] of Object.entries(fileContent)) {
5630
+ if (!snapshotConfig || typeof snapshotConfig !== "object") continue;
5631
+ const serialized = JSON.stringify(snapshotConfig);
5632
+ if (previousSnapshots.get(entityId) === serialized) continue;
5633
+ previousSnapshots.set(entityId, serialized);
5634
+ const count = (entityVersionCount.get(entityId) ?? 0) + 1;
5635
+ entityVersionCount.set(entityId, count);
5636
+ const versionId = `${GIT_VERSION_PREFIX}${commit.hash}-${entityId}`;
5637
+ if (this.versions.has(versionId)) continue;
5638
+ const version = {
5639
+ id: versionId,
5640
+ [this.parentIdField]: entityId,
5641
+ versionNumber: count,
5642
+ changeMessage: commit.message,
5643
+ ...snapshotConfig,
5644
+ createdAt: commit.date
5645
+ };
5646
+ this.versions.set(versionId, version);
5647
+ }
5648
+ }
5649
+ this.gitVersionCounts = entityVersionCount;
5650
+ for (const [entityId, gitCount] of entityVersionCount) {
5651
+ const hydratedVersionId = `hydrated-${entityId}-v1`;
5652
+ const version = this.versions.get(hydratedVersionId);
5653
+ if (version) {
5654
+ version.versionNumber = gitCount + 1;
5655
+ }
5656
+ }
5657
+ }
5658
+ // ==========================================================================
5659
+ // Disk persistence — only published snapshot configs
5660
+ // ==========================================================================
5661
+ /**
5662
+ * Write the published snapshot config for an entity to disk.
5663
+ * Strips all entity metadata and version metadata fields, leaving only
5664
+ * the clean primitive configuration.
5665
+ */
5666
+ persistToDisk() {
5667
+ const diskData = {};
5668
+ for (const [entityId, entity] of this.entities) {
5669
+ if (entity.status !== "published" || !entity.activeVersionId) continue;
5670
+ const version = this.versions.get(entity.activeVersionId);
5671
+ if (!version) continue;
5672
+ const snapshotConfig = this.extractSnapshotConfig(version);
5673
+ diskData[entityId] = snapshotConfig;
5674
+ }
5675
+ this.db.writeDomain(this.entitiesFile, diskData);
5676
+ }
5677
+ /**
5678
+ * Extract the snapshot config from a version, stripping version metadata fields.
5679
+ */
5680
+ extractSnapshotConfig(version) {
5681
+ const metadataSet = new Set(this.versionMetadataFields);
5682
+ const result = {};
5683
+ for (const [key, value] of Object.entries(version)) {
5684
+ if (!metadataSet.has(key)) {
5685
+ result[key] = value;
5686
+ }
5687
+ }
5688
+ return result;
5689
+ }
5690
+ // ==========================================================================
5691
+ // Entity CRUD
5692
+ // ==========================================================================
5693
+ async getById(id) {
5694
+ this.hydrate();
5695
+ return this.entities.has(id) ? structuredClone(this.entities.get(id)) : null;
5696
+ }
5697
+ async createEntity(id, entity) {
5698
+ this.hydrate();
5699
+ if (this.entities.has(id)) {
5700
+ throw new Error(`${this.name}: entity with id ${id} already exists`);
5701
+ }
5702
+ this.entities.set(id, structuredClone(entity));
5703
+ return structuredClone(entity);
5704
+ }
5705
+ async updateEntity(id, updates) {
5706
+ this.hydrate();
5707
+ const existing = this.entities.get(id);
5708
+ if (!existing) {
5709
+ throw new Error(`${this.name}: entity with id ${id} not found`);
5710
+ }
5711
+ const updated = { ...existing };
5712
+ for (const [key, value] of Object.entries(updates)) {
5713
+ if (key === "id") continue;
5714
+ if (value === void 0) continue;
5715
+ if (key === "metadata" && typeof value === "object" && value !== null) {
5716
+ updated["metadata"] = {
5717
+ ...updated["metadata"] ?? {},
5718
+ ...value
5719
+ };
5720
+ } else {
5721
+ updated[key] = value;
5722
+ }
5723
+ }
5724
+ updated["updatedAt"] = /* @__PURE__ */ new Date();
5725
+ const updatedEntity = updated;
5726
+ this.entities.set(id, structuredClone(updatedEntity));
5727
+ const wasPublished = existing.status === "published";
5728
+ const isPublished = updatedEntity.status === "published" && updatedEntity.activeVersionId;
5729
+ if (isPublished || wasPublished && updates["status"] !== void 0) {
5730
+ this.persistToDisk();
5731
+ }
5732
+ return structuredClone(updatedEntity);
5733
+ }
5734
+ async deleteEntity(id) {
5735
+ this.hydrate();
5736
+ this.entities.delete(id);
5737
+ await this.deleteVersionsByParentId(id);
5738
+ this.persistToDisk();
5739
+ }
5740
+ async listEntities(args) {
5741
+ this.hydrate();
5742
+ const { page = 0, perPage: perPageInput, orderBy, filters, listKey } = args;
5743
+ const perPage = normalizePerPage(perPageInput, 100);
5744
+ if (page < 0) throw new Error("page must be >= 0");
5745
+ let entities = Array.from(this.entities.values());
5746
+ if (filters) {
5747
+ for (const [key, value] of Object.entries(filters)) {
5748
+ if (value === void 0) continue;
5749
+ if (key === "metadata" && typeof value === "object" && value !== null) {
5750
+ entities = entities.filter((e) => {
5751
+ const meta = e["metadata"];
5752
+ if (!meta) return false;
5753
+ return Object.entries(value).every(
5754
+ ([k, v]) => JSON.stringify(meta[k]) === JSON.stringify(v)
5755
+ );
5756
+ });
5757
+ } else {
5758
+ entities = entities.filter((e) => e[key] === value);
5759
+ }
5760
+ }
5761
+ }
5762
+ const field = orderBy?.field ?? "createdAt";
5763
+ const direction = orderBy?.direction ?? "DESC";
5764
+ entities.sort((a, b) => {
5765
+ const aVal = new Date(a[field]).getTime();
5766
+ const bVal = new Date(b[field]).getTime();
5767
+ return direction === "ASC" ? aVal - bVal : bVal - aVal;
5768
+ });
5769
+ const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);
5770
+ return {
5771
+ [listKey]: entities.slice(offset, offset + perPage),
5772
+ total: entities.length,
5773
+ page,
5774
+ perPage: perPageForResponse,
5775
+ hasMore: offset + perPage < entities.length
5776
+ };
5777
+ }
5778
+ // ==========================================================================
5779
+ // Version Methods (in-memory + git history)
5780
+ // ==========================================================================
5781
+ async createVersion(input) {
5782
+ await this.ensureGitHistory();
5783
+ if (this.versions.has(input.id)) {
5784
+ throw new Error(`${this.name}: version with id ${input.id} already exists`);
5785
+ }
5786
+ const parentId = input[this.parentIdField];
5787
+ for (const v of this.versions.values()) {
5788
+ if (v[this.parentIdField] === parentId && v.versionNumber === input.versionNumber) {
5789
+ throw new Error(`${this.name}: version number ${input.versionNumber} already exists for entity ${parentId}`);
5790
+ }
5791
+ }
5792
+ const version = {
5793
+ ...input,
5794
+ createdAt: /* @__PURE__ */ new Date()
5795
+ };
5796
+ this.versions.set(input.id, structuredClone(version));
5797
+ return structuredClone(version);
5798
+ }
5799
+ async getVersion(id) {
5800
+ await this.ensureGitHistory();
5801
+ return this.versions.has(id) ? structuredClone(this.versions.get(id)) : null;
5802
+ }
5803
+ async getVersionByNumber(entityId, versionNumber) {
5804
+ await this.ensureGitHistory();
5805
+ for (const v of this.versions.values()) {
5806
+ if (v[this.parentIdField] === entityId && v.versionNumber === versionNumber) {
5807
+ return structuredClone(v);
5808
+ }
5809
+ }
5810
+ return null;
5811
+ }
5812
+ async getLatestVersion(entityId) {
5813
+ await this.ensureGitHistory();
5814
+ let latest = null;
5815
+ for (const v of this.versions.values()) {
5816
+ if (v[this.parentIdField] === entityId) {
5817
+ if (!latest || v.versionNumber > latest.versionNumber) {
5818
+ latest = v;
5819
+ }
5820
+ }
5821
+ }
5822
+ return latest ? structuredClone(latest) : null;
5823
+ }
5824
+ async listVersions(input, parentIdField) {
5825
+ await this.ensureGitHistory();
5826
+ const { page = 0, perPage: perPageInput, orderBy } = input;
5827
+ const entityId = input[parentIdField];
5828
+ const perPage = normalizePerPage(perPageInput, 20);
5829
+ if (page < 0) throw new Error("page must be >= 0");
5830
+ let versions = Array.from(this.versions.values()).filter(
5831
+ (v) => v[this.parentIdField] === entityId
5832
+ );
5833
+ const field = orderBy?.field ?? "versionNumber";
5834
+ const direction = orderBy?.direction ?? "DESC";
5835
+ versions.sort((a, b) => {
5836
+ const aVal = field === "createdAt" ? new Date(a.createdAt).getTime() : a.versionNumber;
5837
+ const bVal = field === "createdAt" ? new Date(b.createdAt).getTime() : b.versionNumber;
5838
+ return direction === "ASC" ? aVal - bVal : bVal - aVal;
5839
+ });
5840
+ const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);
5841
+ return {
5842
+ versions: versions.slice(offset, offset + perPage),
5843
+ total: versions.length,
5844
+ page,
5845
+ perPage: perPageForResponse,
5846
+ hasMore: offset + perPage < versions.length
5847
+ };
5848
+ }
5849
+ async deleteVersion(id) {
5850
+ await this.ensureGitHistory();
5851
+ if (_FilesystemVersionedHelpers.isGitVersion(id)) return;
5852
+ this.versions.delete(id);
5853
+ }
5854
+ async deleteVersionsByParentId(entityId) {
5855
+ await this.ensureGitHistory();
5856
+ for (const [versionId, version] of this.versions) {
5857
+ if (version[this.parentIdField] === entityId) {
5858
+ if (_FilesystemVersionedHelpers.isGitVersion(versionId)) continue;
5859
+ this.versions.delete(versionId);
5860
+ }
5861
+ }
5862
+ }
5863
+ async countVersions(entityId) {
5864
+ await this.ensureGitHistory();
5865
+ let count = 0;
5866
+ for (const v of this.versions.values()) {
5867
+ if (v[this.parentIdField] === entityId) {
5868
+ count++;
5869
+ }
5870
+ }
5871
+ return count;
5872
+ }
5873
+ async getNextVersionNumber(entityId) {
5874
+ await this.ensureGitHistory();
5875
+ return this._getNextVersionNumber(entityId);
5876
+ }
5877
+ _getNextVersionNumber(entityId) {
5878
+ const gitCount = this.gitVersionCounts.get(entityId) ?? 0;
5879
+ let maxVersion = gitCount;
5880
+ for (const v of this.versions.values()) {
5881
+ if (v[this.parentIdField] === entityId) {
5882
+ maxVersion = Math.max(maxVersion, v.versionNumber);
5883
+ }
5884
+ }
5885
+ return maxVersion + 1;
5886
+ }
5887
+ async dangerouslyClearAll() {
5888
+ this.entities.clear();
5889
+ this.versions.clear();
5890
+ this.gitVersionCounts.clear();
5891
+ this.gitHistoryPromise = null;
5892
+ this.hydrated = false;
5893
+ this.db.clearDomain(this.entitiesFile);
5894
+ }
5895
+ };
5896
+
5897
+ // src/storage/domains/agents/filesystem.ts
5898
+ var PERSISTED_SNAPSHOT_FIELDS = /* @__PURE__ */ new Set([
5899
+ "name",
5900
+ "instructions",
5901
+ "model",
5902
+ "tools",
5903
+ "integrationTools",
5904
+ "mcpClients",
5905
+ "requestContextSchema"
5906
+ ]);
5907
+ function stripUnusedFields(obj) {
5908
+ const result = {};
5909
+ for (const [key, value] of Object.entries(obj)) {
5910
+ if (PERSISTED_SNAPSHOT_FIELDS.has(key)) {
5911
+ result[key] = value;
5912
+ }
5913
+ }
5914
+ return result;
5915
+ }
5916
+ var FilesystemAgentsStorage = class extends AgentsStorage {
5917
+ helpers;
5918
+ constructor({ db }) {
5919
+ super();
5920
+ this.helpers = new FilesystemVersionedHelpers({
5921
+ db,
5922
+ entitiesFile: "agents.json",
5923
+ parentIdField: "agentId",
5924
+ name: "FilesystemAgentsStorage",
5925
+ versionMetadataFields: ["id", "agentId", "versionNumber", "changedFields", "changeMessage", "createdAt"]
5926
+ });
5927
+ }
5928
+ async init() {
5929
+ await this.helpers.db.init();
5930
+ }
5931
+ async dangerouslyClearAll() {
5932
+ await this.helpers.dangerouslyClearAll();
5933
+ }
5934
+ async getById(id) {
5935
+ return this.helpers.getById(id);
5936
+ }
5937
+ async create(input) {
5938
+ const { agent } = input;
5939
+ const now = /* @__PURE__ */ new Date();
5940
+ const entity = {
5941
+ id: agent.id,
5942
+ status: "draft",
5943
+ activeVersionId: void 0,
5944
+ authorId: agent.authorId,
5945
+ metadata: agent.metadata,
5946
+ createdAt: now,
5947
+ updatedAt: now
5948
+ };
5949
+ await this.helpers.createEntity(agent.id, entity);
5950
+ const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshotConfig } = agent;
5951
+ const filtered = stripUnusedFields(snapshotConfig);
5952
+ const versionId = crypto.randomUUID();
5953
+ await this.createVersion({
5954
+ id: versionId,
5955
+ agentId: agent.id,
5956
+ versionNumber: 1,
5957
+ ...filtered,
5958
+ changedFields: Object.keys(filtered),
5959
+ changeMessage: "Initial version"
5960
+ });
5961
+ return structuredClone(entity);
5962
+ }
5963
+ async update(input) {
5964
+ const { id, ...updates } = input;
5965
+ const entityUpdates = {};
5966
+ const entityFields = /* @__PURE__ */ new Set(["authorId", "metadata", "activeVersionId", "status"]);
5967
+ for (const [key, value] of Object.entries(updates)) {
5968
+ if (entityFields.has(key)) {
5969
+ entityUpdates[key] = value;
5970
+ }
5971
+ }
5972
+ return this.helpers.updateEntity(id, entityUpdates);
5973
+ }
5974
+ async delete(id) {
5975
+ await this.helpers.deleteEntity(id);
5976
+ }
5977
+ async list(args) {
5978
+ const { page, perPage, orderBy, authorId, metadata, status } = args || {};
5979
+ const result = await this.helpers.listEntities({
5980
+ page,
5981
+ perPage,
5982
+ orderBy,
5983
+ listKey: "agents",
5984
+ filters: { authorId, metadata, status }
5985
+ });
5986
+ return result;
5987
+ }
5988
+ async createVersion(input) {
5989
+ const { id, agentId, versionNumber, changedFields, changeMessage, ...snapshotFields } = input;
5990
+ const filtered = stripUnusedFields(snapshotFields);
5991
+ return this.helpers.createVersion({
5992
+ id,
5993
+ agentId,
5994
+ versionNumber,
5995
+ changedFields,
5996
+ changeMessage,
5997
+ ...filtered
5998
+ });
5999
+ }
6000
+ async getVersion(id) {
6001
+ return this.helpers.getVersion(id);
6002
+ }
6003
+ async getVersionByNumber(agentId, versionNumber) {
6004
+ return this.helpers.getVersionByNumber(agentId, versionNumber);
6005
+ }
6006
+ async getLatestVersion(agentId) {
6007
+ return this.helpers.getLatestVersion(agentId);
6008
+ }
6009
+ async listVersions(input) {
6010
+ const result = await this.helpers.listVersions(input, "agentId");
6011
+ return result;
6012
+ }
6013
+ async deleteVersion(id) {
6014
+ await this.helpers.deleteVersion(id);
6015
+ }
6016
+ async deleteVersionsByParentId(entityId) {
6017
+ await this.helpers.deleteVersionsByParentId(entityId);
6018
+ }
6019
+ async countVersions(agentId) {
6020
+ return this.helpers.countVersions(agentId);
6021
+ }
6022
+ };
6023
+
6024
+ // src/storage/domains/mcp-clients/filesystem.ts
6025
+ var FilesystemMCPClientsStorage = class extends MCPClientsStorage {
6026
+ helpers;
6027
+ constructor({ db }) {
6028
+ super();
6029
+ this.helpers = new FilesystemVersionedHelpers({
6030
+ db,
6031
+ entitiesFile: "mcp-clients.json",
6032
+ parentIdField: "mcpClientId",
6033
+ name: "FilesystemMCPClientsStorage",
6034
+ versionMetadataFields: ["id", "mcpClientId", "versionNumber", "changedFields", "changeMessage", "createdAt"]
6035
+ });
6036
+ }
6037
+ async init() {
6038
+ await this.helpers.db.init();
6039
+ }
6040
+ async dangerouslyClearAll() {
6041
+ await this.helpers.dangerouslyClearAll();
6042
+ }
6043
+ async getById(id) {
6044
+ return this.helpers.getById(id);
6045
+ }
6046
+ async create(input) {
6047
+ const { mcpClient } = input;
6048
+ const now = /* @__PURE__ */ new Date();
6049
+ const entity = {
6050
+ id: mcpClient.id,
6051
+ status: "draft",
6052
+ activeVersionId: void 0,
6053
+ authorId: mcpClient.authorId,
6054
+ metadata: mcpClient.metadata,
6055
+ createdAt: now,
6056
+ updatedAt: now
6057
+ };
6058
+ await this.helpers.createEntity(mcpClient.id, entity);
6059
+ const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshotConfig } = mcpClient;
6060
+ const versionId = crypto.randomUUID();
6061
+ await this.createVersion({
6062
+ id: versionId,
6063
+ mcpClientId: mcpClient.id,
6064
+ versionNumber: 1,
6065
+ ...snapshotConfig,
6066
+ changedFields: Object.keys(snapshotConfig),
6067
+ changeMessage: "Initial version"
6068
+ });
6069
+ return structuredClone(entity);
6070
+ }
6071
+ async update(input) {
6072
+ const { id, ...updates } = input;
6073
+ return this.helpers.updateEntity(id, updates);
6074
+ }
6075
+ async delete(id) {
6076
+ await this.helpers.deleteEntity(id);
6077
+ }
6078
+ async list(args) {
6079
+ const { page, perPage, orderBy, authorId, metadata, status } = args || {};
6080
+ const result = await this.helpers.listEntities({
6081
+ page,
6082
+ perPage,
6083
+ orderBy,
6084
+ listKey: "mcpClients",
6085
+ filters: { authorId, metadata, status }
6086
+ });
6087
+ return result;
6088
+ }
6089
+ async createVersion(input) {
6090
+ return this.helpers.createVersion(input);
6091
+ }
6092
+ async getVersion(id) {
6093
+ return this.helpers.getVersion(id);
6094
+ }
6095
+ async getVersionByNumber(mcpClientId, versionNumber) {
6096
+ return this.helpers.getVersionByNumber(mcpClientId, versionNumber);
6097
+ }
6098
+ async getLatestVersion(mcpClientId) {
6099
+ return this.helpers.getLatestVersion(mcpClientId);
6100
+ }
6101
+ async listVersions(input) {
6102
+ const result = await this.helpers.listVersions(input, "mcpClientId");
6103
+ return result;
6104
+ }
6105
+ async deleteVersion(id) {
6106
+ await this.helpers.deleteVersion(id);
6107
+ }
6108
+ async deleteVersionsByParentId(entityId) {
6109
+ await this.helpers.deleteVersionsByParentId(entityId);
6110
+ }
6111
+ async countVersions(mcpClientId) {
6112
+ return this.helpers.countVersions(mcpClientId);
6113
+ }
6114
+ };
6115
+
6116
+ // src/storage/domains/mcp-servers/filesystem.ts
6117
+ var FilesystemMCPServersStorage = class extends MCPServersStorage {
6118
+ helpers;
6119
+ constructor({ db }) {
6120
+ super();
6121
+ this.helpers = new FilesystemVersionedHelpers({
6122
+ db,
6123
+ entitiesFile: "mcp-servers.json",
6124
+ parentIdField: "mcpServerId",
6125
+ name: "FilesystemMCPServersStorage",
6126
+ versionMetadataFields: ["id", "mcpServerId", "versionNumber", "changedFields", "changeMessage", "createdAt"]
6127
+ });
6128
+ }
6129
+ async init() {
6130
+ await this.helpers.db.init();
6131
+ }
6132
+ async dangerouslyClearAll() {
6133
+ await this.helpers.dangerouslyClearAll();
6134
+ }
6135
+ async getById(id) {
6136
+ return this.helpers.getById(id);
6137
+ }
6138
+ async create(input) {
6139
+ const { mcpServer } = input;
6140
+ const now = /* @__PURE__ */ new Date();
6141
+ const entity = {
6142
+ id: mcpServer.id,
6143
+ status: "draft",
6144
+ activeVersionId: void 0,
6145
+ authorId: mcpServer.authorId,
6146
+ metadata: mcpServer.metadata,
6147
+ createdAt: now,
6148
+ updatedAt: now
6149
+ };
6150
+ await this.helpers.createEntity(mcpServer.id, entity);
6151
+ const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshotConfig } = mcpServer;
6152
+ const versionId = crypto.randomUUID();
6153
+ await this.createVersion({
6154
+ id: versionId,
6155
+ mcpServerId: mcpServer.id,
6156
+ versionNumber: 1,
6157
+ ...snapshotConfig,
6158
+ changedFields: Object.keys(snapshotConfig),
6159
+ changeMessage: "Initial version"
6160
+ });
6161
+ return structuredClone(entity);
6162
+ }
6163
+ async update(input) {
6164
+ const { id, ...updates } = input;
6165
+ return this.helpers.updateEntity(id, updates);
6166
+ }
6167
+ async delete(id) {
6168
+ await this.helpers.deleteEntity(id);
6169
+ }
6170
+ async list(args) {
6171
+ const { page, perPage, orderBy, authorId, metadata, status } = args || {};
6172
+ const result = await this.helpers.listEntities({
6173
+ page,
6174
+ perPage,
6175
+ orderBy,
6176
+ listKey: "mcpServers",
6177
+ filters: { authorId, metadata, status }
6178
+ });
6179
+ return result;
6180
+ }
6181
+ async createVersion(input) {
6182
+ return this.helpers.createVersion(input);
6183
+ }
6184
+ async getVersion(id) {
6185
+ return this.helpers.getVersion(id);
6186
+ }
6187
+ async getVersionByNumber(mcpServerId, versionNumber) {
6188
+ return this.helpers.getVersionByNumber(mcpServerId, versionNumber);
6189
+ }
6190
+ async getLatestVersion(mcpServerId) {
6191
+ return this.helpers.getLatestVersion(mcpServerId);
6192
+ }
6193
+ async listVersions(input) {
6194
+ const result = await this.helpers.listVersions(input, "mcpServerId");
6195
+ return result;
6196
+ }
6197
+ async deleteVersion(id) {
6198
+ await this.helpers.deleteVersion(id);
6199
+ }
6200
+ async deleteVersionsByParentId(entityId) {
6201
+ await this.helpers.deleteVersionsByParentId(entityId);
6202
+ }
6203
+ async countVersions(mcpServerId) {
6204
+ return this.helpers.countVersions(mcpServerId);
6205
+ }
6206
+ };
6207
+
6208
+ // src/storage/domains/prompt-blocks/filesystem.ts
6209
+ var FilesystemPromptBlocksStorage = class extends PromptBlocksStorage {
6210
+ helpers;
6211
+ constructor({ db }) {
6212
+ super();
6213
+ this.helpers = new FilesystemVersionedHelpers({
6214
+ db,
6215
+ entitiesFile: "prompt-blocks.json",
6216
+ parentIdField: "blockId",
6217
+ name: "FilesystemPromptBlocksStorage",
6218
+ versionMetadataFields: ["id", "blockId", "versionNumber", "changedFields", "changeMessage", "createdAt"]
6219
+ });
6220
+ }
6221
+ async init() {
6222
+ await this.helpers.db.init();
6223
+ }
6224
+ async dangerouslyClearAll() {
6225
+ await this.helpers.dangerouslyClearAll();
6226
+ }
6227
+ async getById(id) {
6228
+ return this.helpers.getById(id);
6229
+ }
6230
+ async create(input) {
6231
+ const { promptBlock } = input;
6232
+ const now = /* @__PURE__ */ new Date();
6233
+ const entity = {
6234
+ id: promptBlock.id,
6235
+ status: "draft",
6236
+ activeVersionId: void 0,
6237
+ authorId: promptBlock.authorId,
6238
+ metadata: promptBlock.metadata,
6239
+ createdAt: now,
6240
+ updatedAt: now
6241
+ };
6242
+ await this.helpers.createEntity(promptBlock.id, entity);
6243
+ const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshotConfig } = promptBlock;
6244
+ const versionId = crypto.randomUUID();
6245
+ await this.createVersion({
6246
+ id: versionId,
6247
+ blockId: promptBlock.id,
6248
+ versionNumber: 1,
6249
+ ...snapshotConfig,
6250
+ changedFields: Object.keys(snapshotConfig),
6251
+ changeMessage: "Initial version"
6252
+ });
6253
+ return structuredClone(entity);
6254
+ }
6255
+ async update(input) {
6256
+ const { id, ...updates } = input;
6257
+ return this.helpers.updateEntity(id, updates);
6258
+ }
6259
+ async delete(id) {
6260
+ await this.helpers.deleteEntity(id);
6261
+ }
6262
+ async list(args) {
6263
+ const { page, perPage, orderBy, authorId, metadata, status } = args || {};
6264
+ const result = await this.helpers.listEntities({
6265
+ page,
6266
+ perPage,
6267
+ orderBy,
6268
+ listKey: "promptBlocks",
6269
+ filters: { authorId, metadata, status }
6270
+ });
6271
+ return result;
6272
+ }
6273
+ async createVersion(input) {
6274
+ return this.helpers.createVersion(input);
6275
+ }
6276
+ async getVersion(id) {
6277
+ return this.helpers.getVersion(id);
6278
+ }
6279
+ async getVersionByNumber(blockId, versionNumber) {
6280
+ return this.helpers.getVersionByNumber(blockId, versionNumber);
6281
+ }
6282
+ async getLatestVersion(blockId) {
6283
+ return this.helpers.getLatestVersion(blockId);
6284
+ }
6285
+ async listVersions(input) {
6286
+ const result = await this.helpers.listVersions(input, "blockId");
6287
+ return result;
6288
+ }
6289
+ async deleteVersion(id) {
6290
+ await this.helpers.deleteVersion(id);
6291
+ }
6292
+ async deleteVersionsByParentId(entityId) {
6293
+ await this.helpers.deleteVersionsByParentId(entityId);
6294
+ }
6295
+ async countVersions(blockId) {
6296
+ return this.helpers.countVersions(blockId);
6297
+ }
6298
+ };
6299
+
6300
+ // src/storage/domains/scorer-definitions/filesystem.ts
6301
+ var FilesystemScorerDefinitionsStorage = class extends ScorerDefinitionsStorage {
6302
+ helpers;
6303
+ constructor({ db }) {
6304
+ super();
6305
+ this.helpers = new FilesystemVersionedHelpers({
6306
+ db,
6307
+ entitiesFile: "scorer-definitions.json",
6308
+ parentIdField: "scorerDefinitionId",
6309
+ name: "FilesystemScorerDefinitionsStorage",
6310
+ versionMetadataFields: [
6311
+ "id",
6312
+ "scorerDefinitionId",
6313
+ "versionNumber",
6314
+ "changedFields",
6315
+ "changeMessage",
6316
+ "createdAt"
6317
+ ]
6318
+ });
6319
+ }
6320
+ async init() {
6321
+ await this.helpers.db.init();
6322
+ }
6323
+ async dangerouslyClearAll() {
6324
+ await this.helpers.dangerouslyClearAll();
6325
+ }
6326
+ async getById(id) {
6327
+ return this.helpers.getById(id);
6328
+ }
6329
+ async create(input) {
6330
+ const { scorerDefinition } = input;
6331
+ const now = /* @__PURE__ */ new Date();
6332
+ const entity = {
6333
+ id: scorerDefinition.id,
6334
+ status: "draft",
6335
+ activeVersionId: void 0,
6336
+ authorId: scorerDefinition.authorId,
6337
+ metadata: scorerDefinition.metadata,
6338
+ createdAt: now,
6339
+ updatedAt: now
6340
+ };
6341
+ await this.helpers.createEntity(scorerDefinition.id, entity);
6342
+ const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshotConfig } = scorerDefinition;
6343
+ const versionId = crypto.randomUUID();
6344
+ await this.createVersion({
6345
+ id: versionId,
6346
+ scorerDefinitionId: scorerDefinition.id,
6347
+ versionNumber: 1,
6348
+ ...snapshotConfig,
6349
+ changedFields: Object.keys(snapshotConfig),
6350
+ changeMessage: "Initial version"
6351
+ });
6352
+ return structuredClone(entity);
6353
+ }
6354
+ async update(input) {
6355
+ const { id, ...updates } = input;
6356
+ return this.helpers.updateEntity(id, updates);
6357
+ }
6358
+ async delete(id) {
6359
+ await this.helpers.deleteEntity(id);
6360
+ }
6361
+ async list(args) {
6362
+ const { page, perPage, orderBy, authorId, metadata, status } = args || {};
6363
+ const result = await this.helpers.listEntities({
6364
+ page,
6365
+ perPage,
6366
+ orderBy,
6367
+ listKey: "scorerDefinitions",
6368
+ filters: { authorId, metadata, status }
6369
+ });
6370
+ return result;
6371
+ }
6372
+ async createVersion(input) {
6373
+ return this.helpers.createVersion(input);
6374
+ }
6375
+ async getVersion(id) {
6376
+ return this.helpers.getVersion(id);
6377
+ }
6378
+ async getVersionByNumber(scorerDefinitionId, versionNumber) {
6379
+ return this.helpers.getVersionByNumber(scorerDefinitionId, versionNumber);
6380
+ }
6381
+ async getLatestVersion(scorerDefinitionId) {
6382
+ return this.helpers.getLatestVersion(scorerDefinitionId);
6383
+ }
6384
+ async listVersions(input) {
6385
+ const result = await this.helpers.listVersions(input, "scorerDefinitionId");
6386
+ return result;
6387
+ }
6388
+ async deleteVersion(id) {
6389
+ await this.helpers.deleteVersion(id);
6390
+ }
6391
+ async deleteVersionsByParentId(entityId) {
6392
+ await this.helpers.deleteVersionsByParentId(entityId);
6393
+ }
6394
+ async countVersions(scorerDefinitionId) {
6395
+ return this.helpers.countVersions(scorerDefinitionId);
6396
+ }
6397
+ };
6398
+
6399
+ // src/storage/domains/skills/filesystem.ts
6400
+ var FilesystemSkillsStorage = class extends SkillsStorage {
6401
+ helpers;
6402
+ constructor({ db }) {
6403
+ super();
6404
+ this.helpers = new FilesystemVersionedHelpers({
6405
+ db,
6406
+ entitiesFile: "skills.json",
6407
+ parentIdField: "skillId",
6408
+ name: "FilesystemSkillsStorage",
6409
+ versionMetadataFields: ["id", "skillId", "versionNumber", "changedFields", "changeMessage", "createdAt"]
6410
+ });
6411
+ }
6412
+ async init() {
6413
+ await this.helpers.db.init();
6414
+ }
6415
+ async dangerouslyClearAll() {
6416
+ await this.helpers.dangerouslyClearAll();
6417
+ }
6418
+ async getById(id) {
6419
+ return this.helpers.getById(id);
6420
+ }
6421
+ async create(input) {
6422
+ const { skill } = input;
6423
+ const now = /* @__PURE__ */ new Date();
6424
+ const entity = {
6425
+ id: skill.id,
6426
+ status: "draft",
6427
+ activeVersionId: void 0,
6428
+ authorId: skill.authorId,
6429
+ createdAt: now,
6430
+ updatedAt: now
6431
+ };
6432
+ await this.helpers.createEntity(skill.id, entity);
6433
+ const { id: _id, authorId: _authorId, ...snapshotConfig } = skill;
6434
+ const versionId = crypto.randomUUID();
6435
+ await this.createVersion({
6436
+ id: versionId,
6437
+ skillId: skill.id,
6438
+ versionNumber: 1,
6439
+ ...snapshotConfig,
6440
+ changedFields: Object.keys(snapshotConfig),
6441
+ changeMessage: "Initial version"
6442
+ });
6443
+ return structuredClone(entity);
6444
+ }
6445
+ async update(input) {
6446
+ const { id, ...updates } = input;
6447
+ const existing = await this.helpers.getById(id);
6448
+ if (!existing) {
6449
+ throw new Error(`FilesystemSkillsStorage: skill with id ${id} not found`);
6450
+ }
6451
+ const { authorId, activeVersionId, status, ...configFields } = updates;
6452
+ const configFieldNames = [
6453
+ "name",
6454
+ "description",
6455
+ "instructions",
6456
+ "license",
6457
+ "compatibility",
6458
+ "source",
6459
+ "references",
6460
+ "scripts",
6461
+ "assets",
6462
+ "metadata",
6463
+ "tree"
6464
+ ];
6465
+ const hasConfigUpdate = configFieldNames.some((field) => field in configFields);
6466
+ if (hasConfigUpdate) {
6467
+ const latestVersion = await this.getLatestVersion(id);
6468
+ if (!latestVersion) {
6469
+ throw new Error(`No versions found for skill ${id}`);
6470
+ }
6471
+ const {
6472
+ id: _versionId,
6473
+ skillId: _skillId,
6474
+ versionNumber: _versionNumber,
6475
+ changedFields: _changedFields,
6476
+ changeMessage: _changeMessage,
6477
+ createdAt: _createdAt,
6478
+ ...latestConfig
6479
+ } = latestVersion;
6480
+ const newConfig = {
6481
+ ...latestConfig,
6482
+ ...configFields
6483
+ };
6484
+ const changedFields = configFieldNames.filter(
6485
+ (field) => field in configFields && JSON.stringify(configFields[field]) !== JSON.stringify(latestConfig[field])
6486
+ );
6487
+ if (changedFields.length > 0) {
6488
+ const newVersionId = crypto.randomUUID();
6489
+ const newVersionNumber = latestVersion.versionNumber + 1;
6490
+ await this.createVersion({
6491
+ id: newVersionId,
6492
+ skillId: id,
6493
+ versionNumber: newVersionNumber,
6494
+ ...newConfig,
6495
+ changedFields,
6496
+ changeMessage: `Updated ${changedFields.join(", ")}`
6497
+ });
6498
+ }
6499
+ }
6500
+ const entityUpdates = {
6501
+ ...authorId !== void 0 && { authorId },
6502
+ ...activeVersionId !== void 0 && { activeVersionId },
6503
+ ...status !== void 0 && { status }
6504
+ };
6505
+ if (activeVersionId !== void 0 && status === void 0) {
6506
+ entityUpdates.status = "published";
6507
+ }
6508
+ return await this.helpers.updateEntity(id, entityUpdates);
6509
+ }
6510
+ async delete(id) {
6511
+ await this.helpers.deleteEntity(id);
6512
+ }
6513
+ async list(args) {
6514
+ const { page, perPage, orderBy, authorId, metadata } = args || {};
6515
+ const result = await this.helpers.listEntities({
6516
+ page,
6517
+ perPage,
6518
+ orderBy,
6519
+ listKey: "skills",
6520
+ filters: { authorId, metadata }
6521
+ });
6522
+ return result;
6523
+ }
6524
+ async createVersion(input) {
6525
+ return this.helpers.createVersion(input);
6526
+ }
6527
+ async getVersion(id) {
6528
+ return this.helpers.getVersion(id);
6529
+ }
6530
+ async getVersionByNumber(skillId, versionNumber) {
6531
+ return this.helpers.getVersionByNumber(skillId, versionNumber);
6532
+ }
6533
+ async getLatestVersion(skillId) {
6534
+ return this.helpers.getLatestVersion(skillId);
6535
+ }
6536
+ async listVersions(input) {
6537
+ const result = await this.helpers.listVersions(input, "skillId");
6538
+ return result;
6539
+ }
6540
+ async deleteVersion(id) {
6541
+ await this.helpers.deleteVersion(id);
6542
+ }
6543
+ async deleteVersionsByParentId(entityId) {
6544
+ await this.helpers.deleteVersionsByParentId(entityId);
6545
+ }
6546
+ async countVersions(skillId) {
6547
+ return this.helpers.countVersions(skillId);
6548
+ }
6549
+ };
6550
+
6551
+ // src/storage/domains/workspaces/filesystem.ts
6552
+ var FilesystemWorkspacesStorage = class extends WorkspacesStorage {
6553
+ helpers;
6554
+ constructor({ db }) {
6555
+ super();
6556
+ this.helpers = new FilesystemVersionedHelpers({
6557
+ db,
6558
+ entitiesFile: "workspaces.json",
6559
+ parentIdField: "workspaceId",
6560
+ name: "FilesystemWorkspacesStorage",
6561
+ versionMetadataFields: ["id", "workspaceId", "versionNumber", "changedFields", "changeMessage", "createdAt"]
6562
+ });
6563
+ }
6564
+ async init() {
6565
+ await this.helpers.db.init();
6566
+ }
6567
+ async dangerouslyClearAll() {
6568
+ await this.helpers.dangerouslyClearAll();
6569
+ }
6570
+ async getById(id) {
6571
+ return this.helpers.getById(id);
6572
+ }
6573
+ async create(input) {
6574
+ const { workspace } = input;
6575
+ const now = /* @__PURE__ */ new Date();
6576
+ const entity = {
6577
+ id: workspace.id,
6578
+ status: "draft",
6579
+ activeVersionId: void 0,
6580
+ authorId: workspace.authorId,
6581
+ metadata: workspace.metadata,
6582
+ createdAt: now,
6583
+ updatedAt: now
6584
+ };
6585
+ await this.helpers.createEntity(workspace.id, entity);
6586
+ const { id: _id, authorId: _authorId, metadata: _metadata, ...snapshotConfig } = workspace;
6587
+ const versionId = crypto.randomUUID();
6588
+ await this.createVersion({
6589
+ id: versionId,
6590
+ workspaceId: workspace.id,
6591
+ versionNumber: 1,
6592
+ ...snapshotConfig,
6593
+ changedFields: Object.keys(snapshotConfig),
6594
+ changeMessage: "Initial version"
6595
+ });
6596
+ return structuredClone(entity);
6597
+ }
6598
+ async update(input) {
6599
+ const { id, ...updates } = input;
6600
+ return this.helpers.updateEntity(id, updates);
6601
+ }
6602
+ async delete(id) {
6603
+ await this.helpers.deleteEntity(id);
6604
+ }
6605
+ async list(args) {
6606
+ const { page, perPage, orderBy, authorId, metadata } = args || {};
6607
+ const result = await this.helpers.listEntities({
6608
+ page,
6609
+ perPage,
6610
+ orderBy,
6611
+ listKey: "workspaces",
6612
+ filters: { authorId, metadata }
6613
+ });
6614
+ return result;
6615
+ }
6616
+ async createVersion(input) {
6617
+ return this.helpers.createVersion(input);
6618
+ }
6619
+ async getVersion(id) {
6620
+ return this.helpers.getVersion(id);
6621
+ }
6622
+ async getVersionByNumber(workspaceId, versionNumber) {
6623
+ return this.helpers.getVersionByNumber(workspaceId, versionNumber);
6624
+ }
6625
+ async getLatestVersion(workspaceId) {
6626
+ return this.helpers.getLatestVersion(workspaceId);
6627
+ }
6628
+ async listVersions(input) {
6629
+ const result = await this.helpers.listVersions(input, "workspaceId");
6630
+ return result;
6631
+ }
6632
+ async deleteVersion(id) {
6633
+ await this.helpers.deleteVersion(id);
6634
+ }
6635
+ async deleteVersionsByParentId(entityId) {
6636
+ await this.helpers.deleteVersionsByParentId(entityId);
6637
+ }
6638
+ async countVersions(workspaceId) {
6639
+ return this.helpers.countVersions(workspaceId);
6640
+ }
6641
+ };
6642
+ var FilesystemDB = class {
6643
+ dir;
6644
+ /** In-memory cache of parsed domain data, keyed by filename */
6645
+ cache = /* @__PURE__ */ new Map();
6646
+ initialized = false;
6647
+ constructor(dir) {
6648
+ this.dir = dir;
6649
+ }
6650
+ /**
6651
+ * Initialize the storage directory. Called once; subsequent calls are no-ops.
6652
+ */
6653
+ async init() {
6654
+ if (this.initialized) return;
6655
+ this.ensureDir();
6656
+ this.initialized = true;
6657
+ }
6658
+ /**
6659
+ * Ensure the storage directory and skills subdirectory exist.
6660
+ */
6661
+ ensureDir() {
6662
+ if (!existsSync(this.dir)) {
6663
+ mkdirSync(this.dir, { recursive: true });
6664
+ }
6665
+ const skillsDir = join(this.dir, "skills");
6666
+ if (!existsSync(skillsDir)) {
6667
+ mkdirSync(skillsDir, { recursive: true });
6668
+ }
6669
+ }
6670
+ // ==========================================================================
6671
+ // Domain-level JSON operations
6672
+ // ==========================================================================
6673
+ /**
6674
+ * Read a domain JSON file and return its entity map.
6675
+ * Uses in-memory cache; reads from disk on first access.
6676
+ */
6677
+ readDomain(filename) {
6678
+ if (this.cache.has(filename)) {
6679
+ return this.cache.get(filename);
6680
+ }
6681
+ const filePath = join(this.dir, filename);
6682
+ let data = {};
6683
+ if (existsSync(filePath)) {
6684
+ try {
6685
+ const raw = readFileSync(filePath, "utf-8");
6686
+ data = JSON.parse(raw, dateReviver);
6687
+ } catch {
6688
+ data = {};
6689
+ }
6690
+ }
6691
+ this.cache.set(filename, data);
6692
+ return data;
6693
+ }
6694
+ /**
6695
+ * Write a domain's full entity map to its JSON file.
6696
+ * Uses atomic write (write to .tmp, then rename) to prevent corruption.
6697
+ */
6698
+ writeDomain(filename, data) {
6699
+ this.cache.set(filename, data);
6700
+ const filePath = join(this.dir, filename);
6701
+ const tmpPath = filePath + ".tmp";
6702
+ const parentDir = dirname(filePath);
6703
+ if (!existsSync(parentDir)) {
6704
+ mkdirSync(parentDir, { recursive: true });
6705
+ }
6706
+ writeFileSync(tmpPath, JSON.stringify(data, null, 2), "utf-8");
6707
+ renameSync(tmpPath, filePath);
6708
+ }
6709
+ /**
6710
+ * Clear all data from a domain JSON file.
6711
+ */
6712
+ clearDomain(filename) {
6713
+ this.writeDomain(filename, {});
6714
+ }
6715
+ /**
6716
+ * Invalidate the in-memory cache for a domain, forcing a re-read from disk on next access.
6717
+ */
6718
+ invalidateCache(filename) {
6719
+ if (filename) {
6720
+ this.cache.delete(filename);
6721
+ } else {
6722
+ this.cache.clear();
6723
+ }
6724
+ }
6725
+ // ==========================================================================
6726
+ // Entity-level convenience methods (used by FilesystemVersionedHelpers)
6727
+ // ==========================================================================
6728
+ /**
6729
+ * Get a single entity by ID from a domain JSON file.
6730
+ */
6731
+ get(filename, id) {
6732
+ const data = this.readDomain(filename);
6733
+ return data[id] ?? null;
6734
+ }
6735
+ /**
6736
+ * Get all entities from a domain JSON file as an array.
6737
+ */
6738
+ getAll(filename) {
6739
+ const data = this.readDomain(filename);
6740
+ return Object.values(data);
6741
+ }
6742
+ /**
6743
+ * Set (create or update) an entity in a domain JSON file.
6744
+ */
6745
+ set(filename, id, entity) {
6746
+ const data = this.readDomain(filename);
6747
+ data[id] = entity;
6748
+ this.writeDomain(filename, data);
6749
+ }
6750
+ /**
6751
+ * Remove an entity by ID from a domain JSON file. No-op if not found.
6752
+ */
6753
+ remove(filename, id) {
6754
+ const data = this.readDomain(filename);
6755
+ if (id in data) {
6756
+ delete data[id];
6757
+ this.writeDomain(filename, data);
6758
+ }
6759
+ }
6760
+ // =========================================================================
6761
+ // Skills directory operations (real file tree, not JSON)
6762
+ // =========================================================================
6763
+ /**
6764
+ * Get the path to a skill's directory.
6765
+ */
6766
+ skillDir(skillName) {
6767
+ const skillsBase = join(this.dir, "skills");
6768
+ const dir = resolve(skillsBase, skillName);
6769
+ if (!dir.startsWith(skillsBase + sep) && dir !== skillsBase) {
6770
+ throw new Error(`Path traversal detected: skill name "${skillName}" escapes skills directory`);
6771
+ }
6772
+ return dir;
6773
+ }
6774
+ /**
6775
+ * Resolve a file path within a skill directory, throwing if it escapes.
6776
+ */
6777
+ safeSkillPath(skillName, relativePath) {
6778
+ const base = this.skillDir(skillName);
6779
+ const resolved = resolve(base, relativePath);
6780
+ if (!resolved.startsWith(base + sep) && resolved !== base) {
6781
+ throw new Error(`Path traversal detected: "${relativePath}" escapes skill directory`);
6782
+ }
6783
+ return resolved;
6784
+ }
6785
+ /**
6786
+ * List all files in a skill's directory, returning relative paths.
6787
+ */
6788
+ listSkillFiles(skillName) {
6789
+ const dir = this.skillDir(skillName);
6790
+ if (!existsSync(dir)) return [];
6791
+ return walkDir(dir).map((abs) => relative(dir, abs).split(sep).join("/"));
6792
+ }
6793
+ /**
6794
+ * Read a file from a skill's directory.
6795
+ */
6796
+ readSkillFile(skillName, relativePath) {
6797
+ const filePath = this.safeSkillPath(skillName, relativePath);
6798
+ if (!existsSync(filePath)) return null;
6799
+ try {
6800
+ return readFileSync(filePath);
6801
+ } catch {
6802
+ return null;
6803
+ }
6804
+ }
6805
+ /**
6806
+ * Write a file to a skill's directory.
6807
+ */
6808
+ writeSkillFile(skillName, relativePath, content) {
6809
+ const filePath = this.safeSkillPath(skillName, relativePath);
6810
+ const parentDir = dirname(filePath);
6811
+ if (!existsSync(parentDir)) {
6812
+ mkdirSync(parentDir, { recursive: true });
6813
+ }
6814
+ writeFileSync(filePath, content);
6815
+ }
6816
+ /**
6817
+ * Delete a skill's entire directory.
6818
+ */
6819
+ deleteSkillDir(skillName) {
6820
+ const dir = this.skillDir(skillName);
6821
+ if (existsSync(dir)) {
6822
+ rmSync(dir, { recursive: true, force: true });
6823
+ }
6824
+ }
6825
+ };
6826
+ function dateReviver(_key, value) {
6827
+ if (typeof value === "string" && /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/.test(value)) {
6828
+ const d = new Date(value);
6829
+ if (!isNaN(d.getTime())) return d;
6830
+ }
6831
+ return value;
6832
+ }
6833
+ function walkDir(dir) {
6834
+ const results = [];
6835
+ for (const entry of readdirSync(dir)) {
6836
+ const fullPath = join(dir, entry);
6837
+ const stat = statSync(fullPath);
6838
+ if (stat.isDirectory()) {
6839
+ results.push(...walkDir(fullPath));
6840
+ } else {
6841
+ results.push(fullPath);
6842
+ }
6843
+ }
6844
+ return results;
6845
+ }
6846
+
6847
+ // src/storage/filesystem.ts
6848
+ var FilesystemStore = class extends MastraCompositeStore {
6849
+ #db;
6850
+ #dir;
6851
+ constructor(config = {}) {
6852
+ const dir = resolve(config.dir ?? ".mastra-storage");
6853
+ super({ id: "filesystem", name: "FilesystemStore" });
6854
+ this.#dir = dir;
6855
+ this.#db = new FilesystemDB(dir);
6856
+ this.stores = {
6857
+ agents: new FilesystemAgentsStorage({ db: this.#db }),
6858
+ promptBlocks: new FilesystemPromptBlocksStorage({ db: this.#db }),
6859
+ scorerDefinitions: new FilesystemScorerDefinitionsStorage({ db: this.#db }),
6860
+ mcpClients: new FilesystemMCPClientsStorage({ db: this.#db }),
6861
+ mcpServers: new FilesystemMCPServersStorage({ db: this.#db }),
6862
+ workspaces: new FilesystemWorkspacesStorage({ db: this.#db }),
6863
+ skills: new FilesystemSkillsStorage({ db: this.#db })
6864
+ };
6865
+ }
6866
+ /**
6867
+ * The absolute path to the storage directory.
6868
+ */
6869
+ get dir() {
6870
+ return this.#dir;
6871
+ }
6872
+ };
5349
6873
 
5350
6874
  // src/storage/domains/operations/base.ts
5351
6875
  var StoreOperations = class extends MastraBase {
@@ -5551,6 +7075,6 @@ var StoreOperationsInMemory = class extends StoreOperations {
5551
7075
  }
5552
7076
  };
5553
7077
 
5554
- export { AgentsStorage, BlobStore, DatasetsInMemory, DatasetsStorage, ExperimentsInMemory, ExperimentsStorage, InMemoryAgentsStorage, InMemoryBlobStore, InMemoryDB, InMemoryMCPClientsStorage, InMemoryMCPServersStorage, InMemoryMemory, InMemoryPromptBlocksStorage, InMemoryScorerDefinitionsStorage, InMemorySkillsStorage, InMemoryStore, InMemoryWorkspacesStorage, MCPClientsStorage, MCPServersStorage, MastraCompositeStore, MastraStorage, MemoryStorage, MockStore, ObservabilityInMemory, ObservabilityStorage, PromptBlocksStorage, SchemaUpdateValidationError, SchemaValidationError, SchemaValidator, ScorerDefinitionsStorage, ScoresInMemory, ScoresStorage, SkillsStorage, StorageDomain, StoreOperations, StoreOperationsInMemory, VersionedStorageDomain, WorkflowsInMemory, WorkflowsStorage, WorkspacesStorage, calculatePagination, createPendingMarker, createStorageErrorId, createStoreErrorId, createValidator, createVectorErrorId, ensureDate, filterByDateRange, getDefaultValue, getSchemaValidator, getSqlType, jsonValueEquals, normalizePerPage, safelyParseJSON, serializeDate, transformRow, transformScoreRow };
5555
- //# sourceMappingURL=chunk-BFV3GSGS.js.map
5556
- //# sourceMappingURL=chunk-BFV3GSGS.js.map
7078
+ export { AgentsStorage, BlobStore, DatasetsInMemory, DatasetsStorage, EDITOR_DOMAINS, ExperimentsInMemory, ExperimentsStorage, FilesystemAgentsStorage, FilesystemDB, FilesystemMCPClientsStorage, FilesystemMCPServersStorage, FilesystemPromptBlocksStorage, FilesystemScorerDefinitionsStorage, FilesystemSkillsStorage, FilesystemStore, FilesystemVersionedHelpers, FilesystemWorkspacesStorage, GitHistory, InMemoryAgentsStorage, InMemoryBlobStore, InMemoryDB, InMemoryMCPClientsStorage, InMemoryMCPServersStorage, InMemoryMemory, InMemoryPromptBlocksStorage, InMemoryScorerDefinitionsStorage, InMemorySkillsStorage, InMemoryStore, InMemoryWorkspacesStorage, MCPClientsStorage, MCPServersStorage, MastraCompositeStore, MastraStorage, MemoryStorage, MockStore, ObservabilityInMemory, ObservabilityStorage, PromptBlocksStorage, SchemaUpdateValidationError, SchemaValidationError, SchemaValidator, ScorerDefinitionsStorage, ScoresInMemory, ScoresStorage, SkillsStorage, StorageDomain, StoreOperations, StoreOperationsInMemory, VersionedStorageDomain, WorkflowsInMemory, WorkflowsStorage, WorkspacesStorage, calculatePagination, createPendingMarker, createStorageErrorId, createStoreErrorId, createValidator, createVectorErrorId, ensureDate, filterByDateRange, getDefaultValue, getSchemaValidator, getSqlType, jsonValueEquals, normalizePerPage, safelyParseJSON, serializeDate, transformRow, transformScoreRow };
7079
+ //# sourceMappingURL=chunk-FT5Q6XTK.js.map
7080
+ //# sourceMappingURL=chunk-FT5Q6XTK.js.map