@strands-agents/sdk 0.5.0 → 0.7.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 (486) hide show
  1. package/README.md +64 -0
  2. package/dist/src/__fixtures__/agent-helpers.d.ts +37 -4
  3. package/dist/src/__fixtures__/agent-helpers.d.ts.map +1 -1
  4. package/dist/src/__fixtures__/agent-helpers.js +31 -4
  5. package/dist/src/__fixtures__/agent-helpers.js.map +1 -1
  6. package/dist/src/__fixtures__/metrics-helpers.d.ts +55 -0
  7. package/dist/src/__fixtures__/metrics-helpers.d.ts.map +1 -0
  8. package/dist/src/__fixtures__/metrics-helpers.js +57 -0
  9. package/dist/src/__fixtures__/metrics-helpers.js.map +1 -0
  10. package/dist/src/__fixtures__/mock-message-model.d.ts +8 -4
  11. package/dist/src/__fixtures__/mock-message-model.d.ts.map +1 -1
  12. package/dist/src/__fixtures__/mock-message-model.js +25 -7
  13. package/dist/src/__fixtures__/mock-message-model.js.map +1 -1
  14. package/dist/src/__fixtures__/mock-meter.d.ts +32 -0
  15. package/dist/src/__fixtures__/mock-meter.d.ts.map +1 -0
  16. package/dist/src/__fixtures__/mock-meter.js +47 -0
  17. package/dist/src/__fixtures__/mock-meter.js.map +1 -0
  18. package/dist/src/__fixtures__/mock-plugin.d.ts +13 -0
  19. package/dist/src/__fixtures__/mock-plugin.d.ts.map +1 -0
  20. package/dist/src/__fixtures__/{mock-hook-provider.js → mock-plugin.js} +8 -5
  21. package/dist/src/__fixtures__/mock-plugin.js.map +1 -0
  22. package/dist/src/__fixtures__/mock-storage-provider.d.ts +5 -0
  23. package/dist/src/__fixtures__/mock-storage-provider.d.ts.map +1 -1
  24. package/dist/src/__fixtures__/mock-storage-provider.js +23 -6
  25. package/dist/src/__fixtures__/mock-storage-provider.js.map +1 -1
  26. package/dist/src/__fixtures__/slim-types.d.ts +2 -1
  27. package/dist/src/__fixtures__/slim-types.d.ts.map +1 -1
  28. package/dist/src/__fixtures__/tool-helpers.d.ts.map +1 -1
  29. package/dist/src/__fixtures__/tool-helpers.js +5 -2
  30. package/dist/src/__fixtures__/tool-helpers.js.map +1 -1
  31. package/dist/src/__tests__/index.test.js +21 -0
  32. package/dist/src/__tests__/index.test.js.map +1 -1
  33. package/dist/src/__tests__/mcp.test.js +45 -15
  34. package/dist/src/__tests__/mcp.test.js.map +1 -1
  35. package/dist/src/__tests__/mime.test.d.ts +2 -0
  36. package/dist/src/__tests__/mime.test.d.ts.map +1 -0
  37. package/dist/src/__tests__/mime.test.js +83 -0
  38. package/dist/src/__tests__/mime.test.js.map +1 -0
  39. package/dist/src/__tests__/state-store.test.d.ts +2 -0
  40. package/dist/src/__tests__/state-store.test.d.ts.map +1 -0
  41. package/dist/src/__tests__/{app-state.test.js → state-store.test.js} +86 -51
  42. package/dist/src/__tests__/state-store.test.js.map +1 -0
  43. package/dist/src/a2a/__tests__/a2a-agent.test.d.ts +2 -0
  44. package/dist/src/a2a/__tests__/a2a-agent.test.d.ts.map +1 -0
  45. package/dist/src/a2a/__tests__/a2a-agent.test.js +364 -0
  46. package/dist/src/a2a/__tests__/a2a-agent.test.js.map +1 -0
  47. package/dist/src/a2a/__tests__/adapters.test.d.ts +2 -0
  48. package/dist/src/a2a/__tests__/adapters.test.d.ts.map +1 -0
  49. package/dist/src/a2a/__tests__/adapters.test.js +151 -0
  50. package/dist/src/a2a/__tests__/adapters.test.js.map +1 -0
  51. package/dist/src/a2a/__tests__/executor.test.d.ts +2 -0
  52. package/dist/src/a2a/__tests__/executor.test.d.ts.map +1 -0
  53. package/dist/src/a2a/__tests__/executor.test.js +196 -0
  54. package/dist/src/a2a/__tests__/executor.test.js.map +1 -0
  55. package/dist/src/a2a/__tests__/server.test.d.ts +2 -0
  56. package/dist/src/a2a/__tests__/server.test.d.ts.map +1 -0
  57. package/dist/src/a2a/__tests__/server.test.js +51 -0
  58. package/dist/src/a2a/__tests__/server.test.js.map +1 -0
  59. package/dist/src/a2a/__tests__/server.test.node.d.ts +2 -0
  60. package/dist/src/a2a/__tests__/server.test.node.d.ts.map +1 -0
  61. package/dist/src/a2a/__tests__/server.test.node.js +110 -0
  62. package/dist/src/a2a/__tests__/server.test.node.js.map +1 -0
  63. package/dist/src/a2a/a2a-agent.d.ts +132 -0
  64. package/dist/src/a2a/a2a-agent.d.ts.map +1 -0
  65. package/dist/src/a2a/a2a-agent.js +255 -0
  66. package/dist/src/a2a/a2a-agent.js.map +1 -0
  67. package/dist/src/a2a/adapters.d.ts +27 -0
  68. package/dist/src/a2a/adapters.d.ts.map +1 -0
  69. package/dist/src/a2a/adapters.js +175 -0
  70. package/dist/src/a2a/adapters.js.map +1 -0
  71. package/dist/src/a2a/events.d.ts +42 -0
  72. package/dist/src/a2a/events.d.ts.map +1 -0
  73. package/dist/src/a2a/events.js +35 -0
  74. package/dist/src/a2a/events.js.map +1 -0
  75. package/dist/src/a2a/executor.d.ts +57 -0
  76. package/dist/src/a2a/executor.d.ts.map +1 -0
  77. package/dist/src/a2a/executor.js +130 -0
  78. package/dist/src/a2a/executor.js.map +1 -0
  79. package/dist/src/a2a/express-server.d.ts +67 -0
  80. package/dist/src/a2a/express-server.d.ts.map +1 -0
  81. package/dist/src/a2a/express-server.js +95 -0
  82. package/dist/src/a2a/express-server.js.map +1 -0
  83. package/dist/src/a2a/index.d.ts +16 -0
  84. package/dist/src/a2a/index.d.ts.map +1 -0
  85. package/dist/src/a2a/index.js +16 -0
  86. package/dist/src/a2a/index.js.map +1 -0
  87. package/dist/src/a2a/logging.d.ts +8 -0
  88. package/dist/src/a2a/logging.d.ts.map +1 -0
  89. package/dist/src/a2a/logging.js +15 -0
  90. package/dist/src/a2a/logging.js.map +1 -0
  91. package/dist/src/a2a/server.d.ts +67 -0
  92. package/dist/src/a2a/server.d.ts.map +1 -0
  93. package/dist/src/a2a/server.js +67 -0
  94. package/dist/src/a2a/server.js.map +1 -0
  95. package/dist/src/agent/__tests__/agent.hook.test.js +87 -51
  96. package/dist/src/agent/__tests__/agent.hook.test.js.map +1 -1
  97. package/dist/src/agent/__tests__/agent.test.js +176 -101
  98. package/dist/src/agent/__tests__/agent.test.js.map +1 -1
  99. package/dist/src/agent/__tests__/agent.tracer.test.js +10 -10
  100. package/dist/src/agent/__tests__/agent.tracer.test.js.map +1 -1
  101. package/dist/src/agent/__tests__/snapshot.test.js +11 -11
  102. package/dist/src/agent/__tests__/snapshot.test.js.map +1 -1
  103. package/dist/src/agent/agent.d.ts +71 -58
  104. package/dist/src/agent/agent.d.ts.map +1 -1
  105. package/dist/src/agent/agent.js +177 -93
  106. package/dist/src/agent/agent.js.map +1 -1
  107. package/dist/src/agent/snapshot.d.ts.map +1 -1
  108. package/dist/src/agent/snapshot.js +3 -2
  109. package/dist/src/agent/snapshot.js.map +1 -1
  110. package/dist/src/conversation-manager/__tests__/conversation-manager.test.d.ts +2 -0
  111. package/dist/src/conversation-manager/__tests__/conversation-manager.test.d.ts.map +1 -0
  112. package/dist/src/conversation-manager/__tests__/conversation-manager.test.js +100 -0
  113. package/dist/src/conversation-manager/__tests__/conversation-manager.test.js.map +1 -0
  114. package/dist/src/conversation-manager/__tests__/null-conversation-manager.test.js +26 -10
  115. package/dist/src/conversation-manager/__tests__/null-conversation-manager.test.js.map +1 -1
  116. package/dist/src/conversation-manager/__tests__/sliding-window-conversation-manager.test.js +84 -21
  117. package/dist/src/conversation-manager/__tests__/sliding-window-conversation-manager.test.js.map +1 -1
  118. package/dist/src/conversation-manager/conversation-manager.d.ts +87 -0
  119. package/dist/src/conversation-manager/conversation-manager.d.ts.map +1 -0
  120. package/dist/src/conversation-manager/conversation-manager.js +59 -0
  121. package/dist/src/conversation-manager/conversation-manager.js.map +1 -0
  122. package/dist/src/conversation-manager/index.d.ts +1 -0
  123. package/dist/src/conversation-manager/index.d.ts.map +1 -1
  124. package/dist/src/conversation-manager/index.js +1 -0
  125. package/dist/src/conversation-manager/index.js.map +1 -1
  126. package/dist/src/conversation-manager/null-conversation-manager.d.ts +12 -8
  127. package/dist/src/conversation-manager/null-conversation-manager.d.ts.map +1 -1
  128. package/dist/src/conversation-manager/null-conversation-manager.js +13 -7
  129. package/dist/src/conversation-manager/null-conversation-manager.js.map +1 -1
  130. package/dist/src/conversation-manager/sliding-window-conversation-manager.d.ts +28 -19
  131. package/dist/src/conversation-manager/sliding-window-conversation-manager.d.ts.map +1 -1
  132. package/dist/src/conversation-manager/sliding-window-conversation-manager.js +44 -36
  133. package/dist/src/conversation-manager/sliding-window-conversation-manager.js.map +1 -1
  134. package/dist/src/errors.d.ts +6 -0
  135. package/dist/src/errors.d.ts.map +1 -1
  136. package/dist/src/errors.js +9 -0
  137. package/dist/src/errors.js.map +1 -1
  138. package/dist/src/hooks/__tests__/events.test.js +2 -0
  139. package/dist/src/hooks/__tests__/events.test.js.map +1 -1
  140. package/dist/src/hooks/__tests__/registry.test.js +10 -154
  141. package/dist/src/hooks/__tests__/registry.test.js.map +1 -1
  142. package/dist/src/hooks/events.d.ts +60 -44
  143. package/dist/src/hooks/events.d.ts.map +1 -1
  144. package/dist/src/hooks/events.js +11 -11
  145. package/dist/src/hooks/events.js.map +1 -1
  146. package/dist/src/hooks/index.d.ts +4 -4
  147. package/dist/src/hooks/index.d.ts.map +1 -1
  148. package/dist/src/hooks/index.js +2 -2
  149. package/dist/src/hooks/registry.d.ts +1 -32
  150. package/dist/src/hooks/registry.d.ts.map +1 -1
  151. package/dist/src/hooks/registry.js +1 -47
  152. package/dist/src/hooks/registry.js.map +1 -1
  153. package/dist/src/hooks/types.d.ts +0 -31
  154. package/dist/src/hooks/types.d.ts.map +1 -1
  155. package/dist/src/index.d.ts +30 -15
  156. package/dist/src/index.d.ts.map +1 -1
  157. package/dist/src/index.js +21 -8
  158. package/dist/src/index.js.map +1 -1
  159. package/dist/src/mcp.d.ts +38 -0
  160. package/dist/src/mcp.d.ts.map +1 -1
  161. package/dist/src/mcp.js +23 -6
  162. package/dist/src/mcp.js.map +1 -1
  163. package/dist/src/mime.d.ts +24 -0
  164. package/dist/src/mime.d.ts.map +1 -0
  165. package/dist/src/mime.js +82 -0
  166. package/dist/src/mime.js.map +1 -0
  167. package/dist/src/models/__tests__/anthropic.test.js +78 -1
  168. package/dist/src/models/__tests__/anthropic.test.js.map +1 -1
  169. package/dist/src/models/__tests__/bedrock.test.js +2050 -131
  170. package/dist/src/models/__tests__/bedrock.test.js.map +1 -1
  171. package/dist/src/models/__tests__/gemini.test.js +100 -1
  172. package/dist/src/models/__tests__/gemini.test.js.map +1 -1
  173. package/dist/src/models/__tests__/model.test.js +131 -0
  174. package/dist/src/models/__tests__/model.test.js.map +1 -1
  175. package/dist/src/models/__tests__/openai.test.js +184 -32
  176. package/dist/src/models/__tests__/openai.test.js.map +1 -1
  177. package/dist/src/models/__tests__/streaming.test.d.ts +2 -0
  178. package/dist/src/models/__tests__/streaming.test.d.ts.map +1 -0
  179. package/dist/src/models/__tests__/streaming.test.js +50 -0
  180. package/dist/src/models/__tests__/streaming.test.js.map +1 -0
  181. package/dist/src/models/anthropic.d.ts.map +1 -1
  182. package/dist/src/models/anthropic.js +6 -7
  183. package/dist/src/models/anthropic.js.map +1 -1
  184. package/dist/src/models/bedrock.d.ts +144 -11
  185. package/dist/src/models/bedrock.d.ts.map +1 -1
  186. package/dist/src/models/bedrock.js +416 -28
  187. package/dist/src/models/bedrock.js.map +1 -1
  188. package/dist/src/models/gemini/adapters.d.ts.map +1 -1
  189. package/dist/src/models/gemini/adapters.js +65 -14
  190. package/dist/src/models/gemini/adapters.js.map +1 -1
  191. package/dist/src/models/model.d.ts +18 -0
  192. package/dist/src/models/model.d.ts.map +1 -1
  193. package/dist/src/models/model.js +57 -11
  194. package/dist/src/models/model.js.map +1 -1
  195. package/dist/src/models/openai.d.ts +15 -0
  196. package/dist/src/models/openai.d.ts.map +1 -1
  197. package/dist/src/models/openai.js +108 -64
  198. package/dist/src/models/openai.js.map +1 -1
  199. package/dist/src/models/streaming.d.ts +88 -2
  200. package/dist/src/models/streaming.d.ts.map +1 -1
  201. package/dist/src/models/streaming.js +26 -0
  202. package/dist/src/models/streaming.js.map +1 -1
  203. package/dist/src/multiagent/__tests__/events.test.js +41 -8
  204. package/dist/src/multiagent/__tests__/events.test.js.map +1 -1
  205. package/dist/src/multiagent/__tests__/graph.test.d.ts +2 -0
  206. package/dist/src/multiagent/__tests__/graph.test.d.ts.map +1 -0
  207. package/dist/src/multiagent/__tests__/graph.test.js +453 -0
  208. package/dist/src/multiagent/__tests__/graph.test.js.map +1 -0
  209. package/dist/src/multiagent/__tests__/nodes.test.js +34 -16
  210. package/dist/src/multiagent/__tests__/nodes.test.js.map +1 -1
  211. package/dist/src/multiagent/__tests__/queue.test.js +22 -0
  212. package/dist/src/multiagent/__tests__/queue.test.js.map +1 -1
  213. package/dist/src/multiagent/__tests__/swarm.test.d.ts +2 -0
  214. package/dist/src/multiagent/__tests__/swarm.test.d.ts.map +1 -0
  215. package/dist/src/multiagent/__tests__/swarm.test.js +264 -0
  216. package/dist/src/multiagent/__tests__/swarm.test.js.map +1 -0
  217. package/dist/src/multiagent/edge.d.ts +9 -2
  218. package/dist/src/multiagent/edge.d.ts.map +1 -1
  219. package/dist/src/multiagent/events.d.ts +63 -15
  220. package/dist/src/multiagent/events.d.ts.map +1 -1
  221. package/dist/src/multiagent/events.js +28 -3
  222. package/dist/src/multiagent/events.js.map +1 -1
  223. package/dist/src/multiagent/graph.d.ts +135 -0
  224. package/dist/src/multiagent/graph.d.ts.map +1 -0
  225. package/dist/src/multiagent/graph.js +400 -0
  226. package/dist/src/multiagent/graph.js.map +1 -0
  227. package/dist/src/multiagent/index.d.ts +8 -3
  228. package/dist/src/multiagent/index.d.ts.map +1 -1
  229. package/dist/src/multiagent/index.js +3 -1
  230. package/dist/src/multiagent/index.js.map +1 -1
  231. package/dist/src/multiagent/multiagent.d.ts +41 -0
  232. package/dist/src/multiagent/multiagent.d.ts.map +1 -0
  233. package/dist/src/multiagent/multiagent.js +2 -0
  234. package/dist/src/multiagent/multiagent.js.map +1 -0
  235. package/dist/src/multiagent/nodes.d.ts +24 -25
  236. package/dist/src/multiagent/nodes.d.ts.map +1 -1
  237. package/dist/src/multiagent/nodes.js +42 -15
  238. package/dist/src/multiagent/nodes.js.map +1 -1
  239. package/dist/src/multiagent/plugins.d.ts +70 -0
  240. package/dist/src/multiagent/plugins.d.ts.map +1 -0
  241. package/dist/src/multiagent/plugins.js +70 -0
  242. package/dist/src/multiagent/plugins.js.map +1 -0
  243. package/dist/src/multiagent/queue.d.ts +6 -0
  244. package/dist/src/multiagent/queue.d.ts.map +1 -1
  245. package/dist/src/multiagent/queue.js +13 -0
  246. package/dist/src/multiagent/queue.js.map +1 -1
  247. package/dist/src/multiagent/state.d.ts +4 -2
  248. package/dist/src/multiagent/state.d.ts.map +1 -1
  249. package/dist/src/multiagent/state.js +5 -2
  250. package/dist/src/multiagent/state.js.map +1 -1
  251. package/dist/src/multiagent/swarm.d.ts +112 -0
  252. package/dist/src/multiagent/swarm.d.ts.map +1 -0
  253. package/dist/src/multiagent/swarm.js +256 -0
  254. package/dist/src/multiagent/swarm.js.map +1 -0
  255. package/dist/src/plugins/__tests__/plugin.test.d.ts +2 -0
  256. package/dist/src/plugins/__tests__/plugin.test.d.ts.map +1 -0
  257. package/dist/src/plugins/__tests__/plugin.test.js +114 -0
  258. package/dist/src/plugins/__tests__/plugin.test.js.map +1 -0
  259. package/dist/src/plugins/__tests__/registry.test.d.ts +2 -0
  260. package/dist/src/plugins/__tests__/registry.test.d.ts.map +1 -0
  261. package/dist/src/plugins/__tests__/registry.test.js +147 -0
  262. package/dist/src/plugins/__tests__/registry.test.js.map +1 -0
  263. package/dist/src/plugins/index.d.ts +30 -0
  264. package/dist/src/plugins/index.d.ts.map +1 -0
  265. package/dist/src/plugins/index.js +30 -0
  266. package/dist/src/plugins/index.js.map +1 -0
  267. package/dist/src/plugins/plugin.d.ts +74 -0
  268. package/dist/src/plugins/plugin.d.ts.map +1 -0
  269. package/dist/src/plugins/plugin.js +8 -0
  270. package/dist/src/plugins/plugin.js.map +1 -0
  271. package/dist/src/plugins/registry.d.ts +25 -0
  272. package/dist/src/plugins/registry.d.ts.map +1 -0
  273. package/dist/src/plugins/registry.js +41 -0
  274. package/dist/src/plugins/registry.js.map +1 -0
  275. package/dist/src/registry/__tests__/tool-registry.test.d.ts +2 -0
  276. package/dist/src/registry/__tests__/tool-registry.test.d.ts.map +1 -0
  277. package/dist/src/registry/__tests__/tool-registry.test.js +124 -0
  278. package/dist/src/registry/__tests__/tool-registry.test.js.map +1 -0
  279. package/dist/src/registry/tool-registry.d.ts +32 -20
  280. package/dist/src/registry/tool-registry.d.ts.map +1 -1
  281. package/dist/src/registry/tool-registry.js +60 -158
  282. package/dist/src/registry/tool-registry.js.map +1 -1
  283. package/dist/src/session/__tests__/file-storage.test.node.js +75 -15
  284. package/dist/src/session/__tests__/file-storage.test.node.js.map +1 -1
  285. package/dist/src/session/__tests__/s3-storage.test.d.ts +2 -0
  286. package/dist/src/session/__tests__/s3-storage.test.d.ts.map +1 -0
  287. package/dist/src/session/__tests__/{s3-storage.test.node.js → s3-storage.test.js} +161 -75
  288. package/dist/src/session/__tests__/s3-storage.test.js.map +1 -0
  289. package/dist/src/session/__tests__/session-manager.test.d.ts +2 -0
  290. package/dist/src/session/__tests__/session-manager.test.d.ts.map +1 -0
  291. package/dist/src/session/__tests__/session-manager.test.js +443 -0
  292. package/dist/src/session/__tests__/session-manager.test.js.map +1 -0
  293. package/dist/src/session/__tests__/validation.test.js +28 -1
  294. package/dist/src/session/__tests__/validation.test.js.map +1 -1
  295. package/dist/src/session/file-storage.d.ts +53 -27
  296. package/dist/src/session/file-storage.d.ts.map +1 -1
  297. package/dist/src/session/file-storage.js +103 -52
  298. package/dist/src/session/file-storage.js.map +1 -1
  299. package/dist/src/session/index.d.ts +6 -14
  300. package/dist/src/session/index.d.ts.map +1 -1
  301. package/dist/src/session/index.js +4 -13
  302. package/dist/src/session/index.js.map +1 -1
  303. package/dist/src/session/s3-storage.d.ts +49 -20
  304. package/dist/src/session/s3-storage.d.ts.map +1 -1
  305. package/dist/src/session/s3-storage.js +120 -35
  306. package/dist/src/session/s3-storage.js.map +1 -1
  307. package/dist/src/session/session-manager.d.ts +87 -0
  308. package/dist/src/session/session-manager.d.ts.map +1 -0
  309. package/dist/src/session/session-manager.js +128 -0
  310. package/dist/src/session/session-manager.js.map +1 -0
  311. package/dist/src/session/storage.d.ts +20 -12
  312. package/dist/src/session/storage.d.ts.map +1 -1
  313. package/dist/src/session/types.d.ts +8 -20
  314. package/dist/src/session/types.d.ts.map +1 -1
  315. package/dist/src/session/validation.d.ts +7 -0
  316. package/dist/src/session/validation.d.ts.map +1 -1
  317. package/dist/src/session/validation.js +12 -0
  318. package/dist/src/session/validation.js.map +1 -1
  319. package/dist/src/{app-state.d.ts → state-store.d.ts} +11 -11
  320. package/dist/src/state-store.d.ts.map +1 -0
  321. package/dist/src/{app-state.js → state-store.js} +8 -7
  322. package/dist/src/state-store.js.map +1 -0
  323. package/dist/src/structured-output/__tests__/context.test.js +13 -13
  324. package/dist/src/structured-output/__tests__/context.test.js.map +1 -1
  325. package/dist/src/structured-output/context.js +1 -1
  326. package/dist/src/structured-output/context.js.map +1 -1
  327. package/dist/src/telemetry/__tests__/config.test.d.ts +2 -0
  328. package/dist/src/telemetry/__tests__/config.test.d.ts.map +1 -0
  329. package/dist/src/telemetry/__tests__/config.test.js +64 -0
  330. package/dist/src/telemetry/__tests__/config.test.js.map +1 -0
  331. package/dist/src/telemetry/__tests__/config.test.node.js +66 -36
  332. package/dist/src/telemetry/__tests__/config.test.node.js.map +1 -1
  333. package/dist/src/telemetry/__tests__/meter.test.d.ts +2 -0
  334. package/dist/src/telemetry/__tests__/meter.test.d.ts.map +1 -0
  335. package/dist/src/telemetry/__tests__/meter.test.js +624 -0
  336. package/dist/src/telemetry/__tests__/meter.test.js.map +1 -0
  337. package/dist/src/telemetry/__tests__/tracer.test.node.js +123 -2
  338. package/dist/src/telemetry/__tests__/tracer.test.node.js.map +1 -1
  339. package/dist/src/telemetry/config.d.ts +104 -23
  340. package/dist/src/telemetry/config.d.ts.map +1 -1
  341. package/dist/src/telemetry/config.js +152 -43
  342. package/dist/src/telemetry/config.js.map +1 -1
  343. package/dist/src/telemetry/index.d.ts +10 -7
  344. package/dist/src/telemetry/index.d.ts.map +1 -1
  345. package/dist/src/telemetry/index.js +9 -6
  346. package/dist/src/telemetry/index.js.map +1 -1
  347. package/dist/src/telemetry/meter.d.ts +296 -0
  348. package/dist/src/telemetry/meter.d.ts.map +1 -0
  349. package/dist/src/telemetry/meter.js +365 -0
  350. package/dist/src/telemetry/meter.js.map +1 -0
  351. package/dist/src/telemetry/tracer.d.ts +27 -0
  352. package/dist/src/telemetry/tracer.d.ts.map +1 -1
  353. package/dist/src/telemetry/tracer.js +79 -4
  354. package/dist/src/telemetry/tracer.js.map +1 -1
  355. package/dist/src/telemetry/types.d.ts +2 -0
  356. package/dist/src/telemetry/types.d.ts.map +1 -1
  357. package/dist/src/telemetry/utils.d.ts +10 -0
  358. package/dist/src/telemetry/utils.d.ts.map +1 -0
  359. package/dist/src/telemetry/utils.js +13 -0
  360. package/dist/src/telemetry/utils.js.map +1 -0
  361. package/dist/src/tools/__tests__/tool-factory.test.d.ts +2 -0
  362. package/dist/src/tools/__tests__/tool-factory.test.d.ts.map +1 -0
  363. package/dist/src/tools/__tests__/tool-factory.test.js +98 -0
  364. package/dist/src/tools/__tests__/tool-factory.test.js.map +1 -0
  365. package/dist/src/tools/__tests__/tool.test.js +22 -1
  366. package/dist/src/tools/__tests__/tool.test.js.map +1 -1
  367. package/dist/src/tools/__tests__/zod-tool.test-d.js +1 -1
  368. package/dist/src/tools/__tests__/zod-tool.test-d.js.map +1 -1
  369. package/dist/src/tools/__tests__/zod-tool.test.js +3 -4
  370. package/dist/src/tools/__tests__/zod-tool.test.js.map +1 -1
  371. package/dist/src/tools/function-tool.d.ts +26 -3
  372. package/dist/src/tools/function-tool.d.ts.map +1 -1
  373. package/dist/src/tools/function-tool.js +88 -3
  374. package/dist/src/tools/function-tool.js.map +1 -1
  375. package/dist/src/tools/tool-factory.d.ts +22 -0
  376. package/dist/src/tools/tool-factory.d.ts.map +1 -0
  377. package/dist/src/tools/tool-factory.js +55 -0
  378. package/dist/src/tools/tool-factory.js.map +1 -0
  379. package/dist/src/tools/tool.d.ts +2 -2
  380. package/dist/src/tools/tool.d.ts.map +1 -1
  381. package/dist/src/tools/zod-tool.d.ts +55 -52
  382. package/dist/src/tools/zod-tool.d.ts.map +1 -1
  383. package/dist/src/tools/zod-tool.js +7 -61
  384. package/dist/src/tools/zod-tool.js.map +1 -1
  385. package/dist/src/tsconfig.tsbuildinfo +1 -1
  386. package/dist/src/types/__tests__/agent.test.js +11 -0
  387. package/dist/src/types/__tests__/agent.test.js.map +1 -1
  388. package/dist/src/types/__tests__/citations.test.d.ts +2 -0
  389. package/dist/src/types/__tests__/citations.test.d.ts.map +1 -0
  390. package/dist/src/types/__tests__/citations.test.js +104 -0
  391. package/dist/src/types/__tests__/citations.test.js.map +1 -0
  392. package/dist/src/types/__tests__/media.test.js +22 -16
  393. package/dist/src/types/__tests__/media.test.js.map +1 -1
  394. package/dist/src/types/__tests__/messages.test.js +26 -0
  395. package/dist/src/types/__tests__/messages.test.js.map +1 -1
  396. package/dist/src/types/agent.d.ts +82 -7
  397. package/dist/src/types/agent.d.ts.map +1 -1
  398. package/dist/src/types/agent.js +9 -0
  399. package/dist/src/types/agent.js.map +1 -1
  400. package/dist/src/types/citations.d.ts +180 -0
  401. package/dist/src/types/citations.d.ts.map +1 -0
  402. package/dist/src/types/citations.js +45 -0
  403. package/dist/src/types/citations.js.map +1 -0
  404. package/dist/src/types/media.d.ts +27 -30
  405. package/dist/src/types/media.d.ts.map +1 -1
  406. package/dist/src/types/media.js +15 -56
  407. package/dist/src/types/media.js.map +1 -1
  408. package/dist/src/types/messages.d.ts +23 -5
  409. package/dist/src/types/messages.d.ts.map +1 -1
  410. package/dist/src/types/messages.js +26 -26
  411. package/dist/src/types/messages.js.map +1 -1
  412. package/dist/src/types/serializable.d.ts +34 -4
  413. package/dist/src/types/serializable.d.ts.map +1 -1
  414. package/dist/src/types/serializable.js +31 -2
  415. package/dist/src/types/serializable.js.map +1 -1
  416. package/dist/src/vended-tools/bash/__tests__/bash.test.node.js +5 -4
  417. package/dist/src/vended-tools/bash/__tests__/bash.test.node.js.map +1 -1
  418. package/dist/src/vended-tools/bash/bash.d.ts.map +1 -1
  419. package/dist/src/vended-tools/bash/bash.js +1 -2
  420. package/dist/src/vended-tools/bash/bash.js.map +1 -1
  421. package/dist/src/vended-tools/file-editor/__tests__/file-editor.test.node.d.ts.map +1 -0
  422. package/dist/src/vended-tools/{file_editor → file-editor}/__tests__/file-editor.test.node.js +11 -4
  423. package/dist/src/vended-tools/file-editor/__tests__/file-editor.test.node.js.map +1 -0
  424. package/dist/src/vended-tools/{file_editor → file-editor}/file-editor.d.ts +1 -1
  425. package/dist/src/vended-tools/{file_editor → file-editor}/file-editor.d.ts.map +1 -1
  426. package/dist/src/vended-tools/{file_editor → file-editor}/file-editor.js +3 -3
  427. package/dist/src/vended-tools/{file_editor → file-editor}/file-editor.js.map +1 -1
  428. package/dist/src/vended-tools/{file_editor → file-editor}/index.d.ts.map +1 -1
  429. package/dist/src/vended-tools/file-editor/index.js.map +1 -0
  430. package/dist/src/vended-tools/{file_editor → file-editor}/types.d.ts.map +1 -1
  431. package/dist/src/vended-tools/file-editor/types.js.map +1 -0
  432. package/dist/src/vended-tools/http-request/__tests__/http-request.test.d.ts.map +1 -0
  433. package/dist/src/vended-tools/{http_request → http-request}/__tests__/http-request.test.js.map +1 -1
  434. package/dist/src/vended-tools/http-request/http-request.d.ts.map +1 -0
  435. package/dist/src/vended-tools/{http_request → http-request}/http-request.js +1 -2
  436. package/dist/src/vended-tools/http-request/http-request.js.map +1 -0
  437. package/dist/src/vended-tools/{http_request → http-request}/index.d.ts.map +1 -1
  438. package/dist/src/vended-tools/http-request/index.js.map +1 -0
  439. package/dist/src/vended-tools/{http_request → http-request}/types.d.ts.map +1 -1
  440. package/dist/src/vended-tools/http-request/types.js.map +1 -0
  441. package/dist/src/vended-tools/notebook/__tests__/notebook.test.js +5 -4
  442. package/dist/src/vended-tools/notebook/__tests__/notebook.test.js.map +1 -1
  443. package/dist/src/vended-tools/notebook/notebook.d.ts +1 -1
  444. package/dist/src/vended-tools/notebook/notebook.js +2 -2
  445. package/dist/src/vended-tools/notebook/notebook.js.map +1 -1
  446. package/package.json +66 -12
  447. package/dist/src/__fixtures__/mock-hook-provider.d.ts +0 -10
  448. package/dist/src/__fixtures__/mock-hook-provider.d.ts.map +0 -1
  449. package/dist/src/__fixtures__/mock-hook-provider.js.map +0 -1
  450. package/dist/src/__tests__/app-state.test.d.ts +0 -2
  451. package/dist/src/__tests__/app-state.test.d.ts.map +0 -1
  452. package/dist/src/__tests__/app-state.test.js.map +0 -1
  453. package/dist/src/app-state.d.ts.map +0 -1
  454. package/dist/src/app-state.js.map +0 -1
  455. package/dist/src/multiagent/base.d.ts +0 -25
  456. package/dist/src/multiagent/base.d.ts.map +0 -1
  457. package/dist/src/multiagent/base.js +0 -2
  458. package/dist/src/multiagent/base.js.map +0 -1
  459. package/dist/src/registry/registry.d.ts +0 -117
  460. package/dist/src/registry/registry.d.ts.map +0 -1
  461. package/dist/src/registry/registry.js +0 -298
  462. package/dist/src/registry/registry.js.map +0 -1
  463. package/dist/src/session/__tests__/s3-storage.test.node.d.ts +0 -2
  464. package/dist/src/session/__tests__/s3-storage.test.node.d.ts.map +0 -1
  465. package/dist/src/session/__tests__/s3-storage.test.node.js.map +0 -1
  466. package/dist/src/vended-tools/file_editor/__tests__/file-editor.test.node.d.ts.map +0 -1
  467. package/dist/src/vended-tools/file_editor/__tests__/file-editor.test.node.js.map +0 -1
  468. package/dist/src/vended-tools/file_editor/index.js.map +0 -1
  469. package/dist/src/vended-tools/file_editor/types.js.map +0 -1
  470. package/dist/src/vended-tools/http_request/__tests__/http-request.test.d.ts.map +0 -1
  471. package/dist/src/vended-tools/http_request/http-request.d.ts.map +0 -1
  472. package/dist/src/vended-tools/http_request/http-request.js.map +0 -1
  473. package/dist/src/vended-tools/http_request/index.js.map +0 -1
  474. package/dist/src/vended-tools/http_request/types.js.map +0 -1
  475. /package/dist/src/vended-tools/{file_editor → file-editor}/__tests__/file-editor.test.node.d.ts +0 -0
  476. /package/dist/src/vended-tools/{file_editor → file-editor}/index.d.ts +0 -0
  477. /package/dist/src/vended-tools/{file_editor → file-editor}/index.js +0 -0
  478. /package/dist/src/vended-tools/{file_editor → file-editor}/types.d.ts +0 -0
  479. /package/dist/src/vended-tools/{file_editor → file-editor}/types.js +0 -0
  480. /package/dist/src/vended-tools/{http_request → http-request}/__tests__/http-request.test.d.ts +0 -0
  481. /package/dist/src/vended-tools/{http_request → http-request}/__tests__/http-request.test.js +0 -0
  482. /package/dist/src/vended-tools/{http_request → http-request}/http-request.d.ts +0 -0
  483. /package/dist/src/vended-tools/{http_request → http-request}/index.d.ts +0 -0
  484. /package/dist/src/vended-tools/{http_request → http-request}/index.js +0 -0
  485. /package/dist/src/vended-tools/{http_request → http-request}/types.d.ts +0 -0
  486. /package/dist/src/vended-tools/{http_request → http-request}/types.js +0 -0
@@ -0,0 +1,443 @@
1
+ import { describe, expect, it, beforeEach, vi } from 'vitest';
2
+ import { SessionManager } from '../session-manager.js';
3
+ import { MockSnapshotStorage, createTestSnapshot } from '../../__fixtures__/mock-storage-provider.js';
4
+ import { InitializedEvent, MessageAddedEvent, AfterInvocationEvent, AfterModelCallEvent, HookableEvent, } from '../../hooks/index.js';
5
+ import { Agent } from '../../agent/agent.js';
6
+ import { Message, TextBlock } from '../../types/messages.js';
7
+ import { createMockAgent as createMockAgentWithHooks, invokeTrackedHook } from '../../__fixtures__/agent-helpers.js';
8
+ import { loadStateFromJSONSymbol, stateToJSONSymbol } from '../../types/serializable.js';
9
+ // Test fixtures
10
+ function createMockAgent(id = 'agent') {
11
+ const agent = {
12
+ id,
13
+ messages: [],
14
+ appState: {
15
+ _m: new Map(),
16
+ get(k) {
17
+ return this._m.get(k);
18
+ },
19
+ set(k, v) {
20
+ this._m.set(k, v);
21
+ },
22
+ [stateToJSONSymbol]() {
23
+ return Object.fromEntries(this._m);
24
+ },
25
+ [loadStateFromJSONSymbol](json) {
26
+ Object.entries(json).forEach(([k, v]) => this._m.set(k, v));
27
+ },
28
+ },
29
+ systemPrompt: 'Test prompt',
30
+ };
31
+ return agent;
32
+ }
33
+ const MOCK_MESSAGE = new Message({ role: 'user', content: [new TextBlock('test')] });
34
+ function createMockEvent(agent) {
35
+ return { agent };
36
+ }
37
+ function createMockMessageEvent(agent) {
38
+ return { agent, message: MOCK_MESSAGE };
39
+ }
40
+ async function initPluginAndInvokeHook(sessionManager, event) {
41
+ const pluginAgent = createMockAgentWithHooks();
42
+ sessionManager.initAgent(pluginAgent);
43
+ await invokeTrackedHook(pluginAgent, event);
44
+ }
45
+ describe('SessionManager', () => {
46
+ let storage;
47
+ let sessionManager;
48
+ let mockAgent;
49
+ beforeEach(() => {
50
+ storage = new MockSnapshotStorage();
51
+ mockAgent = createMockAgent();
52
+ });
53
+ describe('constructor', () => {
54
+ it('defaults saveLatestOn to invocation', async () => {
55
+ sessionManager = new SessionManager({ sessionId: 'test-default', storage: { snapshot: storage } });
56
+ await initPluginAndInvokeHook(sessionManager, new AfterInvocationEvent(createMockEvent(mockAgent)));
57
+ const snapshot = await storage.loadSnapshot({
58
+ location: { sessionId: 'test-default', scope: 'agent', scopeId: 'agent' },
59
+ });
60
+ expect(snapshot).not.toBeNull();
61
+ });
62
+ });
63
+ describe('saveSnapshot', () => {
64
+ beforeEach(() => {
65
+ mockAgent = createMockAgent('test-agent');
66
+ sessionManager = new SessionManager({
67
+ sessionId: 'test-session',
68
+ storage: { snapshot: storage },
69
+ });
70
+ });
71
+ it('saves snapshot_latest when isLatest is true', async () => {
72
+ await sessionManager.saveSnapshot({ target: mockAgent, isLatest: true });
73
+ const snapshot = await storage.loadSnapshot({
74
+ location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
75
+ });
76
+ expect(snapshot).not.toBeNull();
77
+ expect(snapshot?.scope).toBe('agent');
78
+ });
79
+ it('saves immutable snapshot when isLatest is false', async () => {
80
+ await sessionManager.saveSnapshot({ target: mockAgent, isLatest: false });
81
+ const ids = await storage.listSnapshotIds({
82
+ location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
83
+ });
84
+ expect(ids.length).toBeGreaterThan(0);
85
+ });
86
+ it('allocates unique snapshot IDs', async () => {
87
+ await sessionManager.saveSnapshot({ target: mockAgent, isLatest: false });
88
+ await sessionManager.saveSnapshot({ target: mockAgent, isLatest: false });
89
+ await sessionManager.saveSnapshot({ target: mockAgent, isLatest: false });
90
+ const ids = await storage.listSnapshotIds({
91
+ location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
92
+ });
93
+ expect(ids.length).toBe(3);
94
+ });
95
+ });
96
+ describe('restoreSnapshot', () => {
97
+ beforeEach(() => {
98
+ mockAgent = createMockAgent('test-agent');
99
+ sessionManager = new SessionManager({
100
+ sessionId: 'test-session',
101
+ storage: { snapshot: storage },
102
+ });
103
+ });
104
+ it('restores snapshot_latest when no snapshotId provided', async () => {
105
+ const snapshot = createTestSnapshot();
106
+ await storage.saveSnapshot({
107
+ location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
108
+ snapshotId: 'latest',
109
+ isLatest: true,
110
+ snapshot,
111
+ });
112
+ const result = await sessionManager.restoreSnapshot({ target: mockAgent });
113
+ expect(result).toBe(true);
114
+ });
115
+ it('restores specific snapshot by ID', async () => {
116
+ const snapshot = createTestSnapshot();
117
+ await storage.saveSnapshot({
118
+ location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
119
+ snapshotId: '5',
120
+ isLatest: false,
121
+ snapshot,
122
+ });
123
+ const result = await sessionManager.restoreSnapshot({ target: mockAgent, snapshotId: '5' });
124
+ expect(result).toBe(true);
125
+ });
126
+ it('returns false when snapshot not found', async () => {
127
+ const result = await sessionManager.restoreSnapshot({ target: mockAgent, snapshotId: '999' });
128
+ expect(result).toBe(false);
129
+ });
130
+ });
131
+ describe('InitializedEvent handling', () => {
132
+ beforeEach(() => {
133
+ mockAgent = createMockAgent('test-agent');
134
+ });
135
+ it('loads snapshot_latest on initialization', async () => {
136
+ const snapshot = createTestSnapshot();
137
+ await storage.saveSnapshot({
138
+ location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
139
+ snapshotId: 'latest',
140
+ isLatest: true,
141
+ snapshot,
142
+ });
143
+ sessionManager = new SessionManager({
144
+ sessionId: 'test-session',
145
+ storage: { snapshot: storage },
146
+ });
147
+ await initPluginAndInvokeHook(sessionManager, new InitializedEvent(createMockEvent(mockAgent)));
148
+ expect(mockAgent.messages).toEqual(snapshot.data.messages);
149
+ });
150
+ it('handles missing snapshot gracefully', async () => {
151
+ sessionManager = new SessionManager({
152
+ sessionId: 'new-session',
153
+ storage: { snapshot: storage },
154
+ });
155
+ await expect(initPluginAndInvokeHook(sessionManager, new InitializedEvent(createMockEvent(mockAgent)))).resolves.not.toThrow();
156
+ });
157
+ });
158
+ describe('MessageAddedEvent handling', () => {
159
+ beforeEach(() => {
160
+ mockAgent = createMockAgent('test-agent');
161
+ });
162
+ it('saves snapshot_latest when saveLatestOn is message', async () => {
163
+ sessionManager = new SessionManager({
164
+ sessionId: 'test-session',
165
+ storage: { snapshot: storage },
166
+ saveLatestOn: 'message',
167
+ });
168
+ await initPluginAndInvokeHook(sessionManager, new MessageAddedEvent(createMockMessageEvent(mockAgent)));
169
+ const snapshot = await storage.loadSnapshot({
170
+ location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
171
+ });
172
+ expect(snapshot).not.toBeNull();
173
+ });
174
+ it('does not save when saveLatestOn is invocation', async () => {
175
+ sessionManager = new SessionManager({
176
+ sessionId: 'test-session',
177
+ storage: { snapshot: storage },
178
+ saveLatestOn: 'invocation',
179
+ });
180
+ // MessageAddedEvent is not registered when saveLatestOn is 'invocation'
181
+ // So we need to call initAgent and check that no hook is registered for MessageAddedEvent
182
+ const pluginAgent = createMockAgentWithHooks();
183
+ sessionManager.initAgent(pluginAgent);
184
+ // Verify MessageAddedEvent hook is not registered
185
+ const messageHook = pluginAgent.trackedHooks.find((h) => h.eventType === MessageAddedEvent);
186
+ expect(messageHook).toBeUndefined();
187
+ // Even if we try to invoke (nothing should happen)
188
+ const snapshot = await storage.loadSnapshot({
189
+ location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
190
+ });
191
+ expect(snapshot).toBeNull();
192
+ });
193
+ });
194
+ describe('AfterInvocationEvent handling', () => {
195
+ beforeEach(() => {
196
+ mockAgent = createMockAgent('test-agent');
197
+ });
198
+ it('saves snapshot_latest when saveLatestOn is invocation', async () => {
199
+ sessionManager = new SessionManager({
200
+ sessionId: 'test-session',
201
+ storage: { snapshot: storage },
202
+ saveLatestOn: 'invocation',
203
+ });
204
+ await initPluginAndInvokeHook(sessionManager, new AfterInvocationEvent(createMockEvent(mockAgent)));
205
+ const snapshot = await storage.loadSnapshot({
206
+ location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
207
+ });
208
+ expect(snapshot).not.toBeNull();
209
+ });
210
+ it('does not save snapshot_latest when saveLatestOn is trigger', async () => {
211
+ sessionManager = new SessionManager({
212
+ sessionId: 'test-session',
213
+ storage: { snapshot: storage },
214
+ saveLatestOn: 'trigger',
215
+ });
216
+ await initPluginAndInvokeHook(sessionManager, new AfterInvocationEvent(createMockEvent(mockAgent)));
217
+ const snapshot = await storage.loadSnapshot({
218
+ location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
219
+ });
220
+ expect(snapshot).toBeNull();
221
+ });
222
+ });
223
+ describe('snapshotTrigger', () => {
224
+ beforeEach(() => {
225
+ mockAgent = createMockAgent('test-agent');
226
+ });
227
+ it('creates immutable snapshot when trigger returns true', async () => {
228
+ sessionManager = new SessionManager({
229
+ sessionId: 'test-session',
230
+ storage: { snapshot: storage },
231
+ saveLatestOn: 'trigger',
232
+ snapshotTrigger: () => true,
233
+ });
234
+ await initPluginAndInvokeHook(sessionManager, new AfterInvocationEvent(createMockEvent(mockAgent)));
235
+ const ids = await storage.listSnapshotIds({
236
+ location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
237
+ });
238
+ expect(ids.length).toBe(1);
239
+ });
240
+ it('does not create immutable snapshot when trigger returns false', async () => {
241
+ sessionManager = new SessionManager({
242
+ sessionId: 'test-session',
243
+ storage: { snapshot: storage },
244
+ saveLatestOn: 'trigger',
245
+ snapshotTrigger: () => false,
246
+ });
247
+ await initPluginAndInvokeHook(sessionManager, new AfterInvocationEvent(createMockEvent(mockAgent)));
248
+ const ids = await storage.listSnapshotIds({
249
+ location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
250
+ });
251
+ expect(ids.length).toBe(0);
252
+ });
253
+ it('provides agentData to trigger', async () => {
254
+ const triggerSpy = vi.fn(() => false);
255
+ sessionManager = new SessionManager({
256
+ sessionId: 'test-session',
257
+ storage: { snapshot: storage },
258
+ saveLatestOn: 'trigger',
259
+ snapshotTrigger: triggerSpy,
260
+ });
261
+ await initPluginAndInvokeHook(sessionManager, new AfterInvocationEvent(createMockEvent(mockAgent)));
262
+ expect(triggerSpy).toHaveBeenCalledWith(expect.objectContaining({
263
+ agentData: expect.objectContaining({
264
+ appState: mockAgent.appState,
265
+ messages: mockAgent.messages,
266
+ }),
267
+ }));
268
+ });
269
+ it('saves both immutable and latest when trigger fires', async () => {
270
+ sessionManager = new SessionManager({
271
+ sessionId: 'test-session',
272
+ storage: { snapshot: storage },
273
+ saveLatestOn: 'trigger',
274
+ snapshotTrigger: () => true,
275
+ });
276
+ await initPluginAndInvokeHook(sessionManager, new AfterInvocationEvent(createMockEvent(mockAgent)));
277
+ const immutableIds = await storage.listSnapshotIds({
278
+ location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
279
+ });
280
+ const latest = await storage.loadSnapshot({
281
+ location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
282
+ });
283
+ expect(immutableIds.length).toBe(1);
284
+ expect(latest).not.toBeNull();
285
+ });
286
+ it('trigger based on message count via agentData', async () => {
287
+ sessionManager = new SessionManager({
288
+ sessionId: 'test-session',
289
+ storage: { snapshot: storage },
290
+ saveLatestOn: 'trigger',
291
+ snapshotTrigger: ({ agentData }) => agentData.messages.length >= 2,
292
+ });
293
+ const pluginAgent = createMockAgentWithHooks();
294
+ sessionManager.initAgent(pluginAgent);
295
+ await invokeTrackedHook(pluginAgent, new AfterInvocationEvent(createMockEvent(mockAgent)));
296
+ let ids = await storage.listSnapshotIds({
297
+ location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
298
+ });
299
+ expect(ids.length).toBe(0); // 0 messages — no snapshot
300
+ mockAgent.messages.push(MOCK_MESSAGE, MOCK_MESSAGE);
301
+ await invokeTrackedHook(pluginAgent, new AfterInvocationEvent(createMockEvent(mockAgent)));
302
+ ids = await storage.listSnapshotIds({
303
+ location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
304
+ });
305
+ expect(ids.length).toBe(1); // 2 messages — snapshot taken
306
+ });
307
+ it('trigger based on agent state via agentData', async () => {
308
+ sessionManager = new SessionManager({
309
+ sessionId: 'test-session',
310
+ storage: { snapshot: storage },
311
+ saveLatestOn: 'trigger',
312
+ snapshotTrigger: ({ agentData }) => agentData.appState.get('checkpoint') === true,
313
+ });
314
+ const pluginAgent = createMockAgentWithHooks();
315
+ sessionManager.initAgent(pluginAgent);
316
+ await invokeTrackedHook(pluginAgent, new AfterInvocationEvent(createMockEvent(mockAgent)));
317
+ let ids = await storage.listSnapshotIds({
318
+ location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
319
+ });
320
+ expect(ids.length).toBe(0); // state not set — no snapshot
321
+ mockAgent.appState.set('checkpoint', true);
322
+ await invokeTrackedHook(pluginAgent, new AfterInvocationEvent(createMockEvent(mockAgent)));
323
+ ids = await storage.listSnapshotIds({
324
+ location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
325
+ });
326
+ expect(ids.length).toBe(1); // state set — snapshot taken
327
+ });
328
+ });
329
+ describe('integration scenarios', () => {
330
+ it('handles complete session lifecycle', async () => {
331
+ sessionManager = new SessionManager({
332
+ sessionId: 'lifecycle-test',
333
+ storage: { snapshot: storage },
334
+ saveLatestOn: 'invocation',
335
+ snapshotTrigger: () => true,
336
+ });
337
+ const pluginAgent = createMockAgentWithHooks();
338
+ sessionManager.initAgent(pluginAgent);
339
+ await invokeTrackedHook(pluginAgent, new InitializedEvent(createMockEvent(mockAgent)));
340
+ await invokeTrackedHook(pluginAgent, new AfterInvocationEvent(createMockEvent(mockAgent)));
341
+ await invokeTrackedHook(pluginAgent, new AfterInvocationEvent(createMockEvent(mockAgent)));
342
+ await invokeTrackedHook(pluginAgent, new AfterInvocationEvent(createMockEvent(mockAgent)));
343
+ const latest = await storage.loadSnapshot({
344
+ location: { sessionId: 'lifecycle-test', scope: 'agent', scopeId: 'agent' },
345
+ });
346
+ const immutableIds = await storage.listSnapshotIds({
347
+ location: { sessionId: 'lifecycle-test', scope: 'agent', scopeId: 'agent' },
348
+ });
349
+ expect(latest).not.toBeNull();
350
+ expect(immutableIds.length).toBe(3);
351
+ });
352
+ it('supports resuming from immutable snapshot', async () => {
353
+ // First session - snapshot fires when messages.length === 2 (after turn 1)
354
+ sessionManager = new SessionManager({
355
+ sessionId: 'resume-test',
356
+ storage: { snapshot: storage },
357
+ saveLatestOn: 'trigger',
358
+ snapshotTrigger: ({ agentData }) => agentData.messages.length === 2,
359
+ });
360
+ const pluginAgent = createMockAgentWithHooks();
361
+ sessionManager.initAgent(pluginAgent);
362
+ await invokeTrackedHook(pluginAgent, new InitializedEvent(createMockEvent(mockAgent)));
363
+ mockAgent.messages.push(MOCK_MESSAGE, MOCK_MESSAGE);
364
+ await invokeTrackedHook(pluginAgent, new AfterInvocationEvent(createMockEvent(mockAgent)));
365
+ const ids = await storage.listSnapshotIds({
366
+ location: { sessionId: 'resume-test', scope: 'agent', scopeId: 'agent' },
367
+ });
368
+ expect(ids.length).toBe(1);
369
+ // Second session - resume from that snapshot
370
+ const newAgent = createMockAgent();
371
+ const newSessionManager = new SessionManager({
372
+ sessionId: 'resume-test',
373
+ storage: { snapshot: storage },
374
+ saveLatestOn: 'invocation',
375
+ });
376
+ const newAgentData = createMockAgentWithHooks();
377
+ newSessionManager.initAgent(newAgentData);
378
+ await invokeTrackedHook(newAgentData, new InitializedEvent(createMockEvent(newAgent)));
379
+ await newSessionManager.restoreSnapshot({ target: newAgent, snapshotId: ids[0] });
380
+ expect(newAgent.messages).toEqual(mockAgent.messages);
381
+ });
382
+ });
383
+ describe('AfterModelCallEvent with redaction handling', () => {
384
+ beforeEach(() => {
385
+ mockAgent = createMockAgent('test-agent');
386
+ });
387
+ it('saves snapshot_latest when saveLatestOn is message and redaction occurred', async () => {
388
+ sessionManager = new SessionManager({
389
+ sessionId: 'test-session',
390
+ storage: { snapshot: storage },
391
+ saveLatestOn: 'message',
392
+ });
393
+ const assistantMessage = new Message({ role: 'assistant', content: [new TextBlock('Response')] });
394
+ const event = new AfterModelCallEvent({
395
+ agent: mockAgent,
396
+ stopData: {
397
+ message: assistantMessage,
398
+ stopReason: 'endTurn',
399
+ redaction: { userMessage: '[User input redacted.]' },
400
+ },
401
+ });
402
+ await initPluginAndInvokeHook(sessionManager, event);
403
+ const snapshot = await storage.loadSnapshot({
404
+ location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
405
+ });
406
+ expect(snapshot).not.toBeNull();
407
+ });
408
+ it('does not save when saveLatestOn is message but no redaction occurred', async () => {
409
+ sessionManager = new SessionManager({
410
+ sessionId: 'test-session',
411
+ storage: { snapshot: storage },
412
+ saveLatestOn: 'message',
413
+ });
414
+ const assistantMessage = new Message({ role: 'assistant', content: [new TextBlock('Response')] });
415
+ const event = new AfterModelCallEvent({
416
+ agent: mockAgent,
417
+ stopData: { message: assistantMessage, stopReason: 'endTurn' },
418
+ });
419
+ await initPluginAndInvokeHook(sessionManager, event);
420
+ const snapshot = await storage.loadSnapshot({
421
+ location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
422
+ });
423
+ expect(snapshot).toBeNull();
424
+ });
425
+ it('does not save when saveLatestOn is invocation', async () => {
426
+ sessionManager = new SessionManager({
427
+ sessionId: 'test-session',
428
+ storage: { snapshot: storage },
429
+ saveLatestOn: 'invocation',
430
+ });
431
+ // AfterModelCallEvent hook is not registered when saveLatestOn is 'invocation'
432
+ const pluginAgent = createMockAgentWithHooks();
433
+ sessionManager.initAgent(pluginAgent);
434
+ const afterModelHook = pluginAgent.trackedHooks.find((h) => h.eventType === AfterModelCallEvent);
435
+ expect(afterModelHook).toBeUndefined();
436
+ const snapshot = await storage.loadSnapshot({
437
+ location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
438
+ });
439
+ expect(snapshot).toBeNull();
440
+ });
441
+ });
442
+ });
443
+ //# sourceMappingURL=session-manager.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.test.js","sourceRoot":"","sources":["../../../../src/session/__tests__/session-manager.test.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { describe, expect, it } from 'vitest';
2
- import { validateIdentifier } from '../validation.js';
2
+ import { validateIdentifier, validateUuidV7 } from '../validation.js';
3
3
  describe('validateIdentifier', () => {
4
4
  describe('when identifier is valid', () => {
5
5
  it('returns the identifier', () => {
@@ -17,4 +17,31 @@ describe('validateIdentifier', () => {
17
17
  });
18
18
  });
19
19
  });
20
+ describe('validateUuidV7', () => {
21
+ describe('when id is a valid UUID v7', () => {
22
+ it('does not throw', () => {
23
+ expect(() => validateUuidV7('01956891-2b4c-7000-8abc-123456789abc')).not.toThrow();
24
+ });
25
+ });
26
+ describe('when id is a UUID v4 (wrong version)', () => {
27
+ it('throws error', () => {
28
+ expect(() => validateUuidV7('550e8400-e29b-41d4-a716-446655440000')).toThrow("'550e8400-e29b-41d4-a716-446655440000' is not a valid UUID v7 snapshot ID");
29
+ });
30
+ });
31
+ describe('when id is a timestamp string', () => {
32
+ it('throws error', () => {
33
+ expect(() => validateUuidV7('2025-01-15T10:30:00Z')).toThrow("'2025-01-15T10:30:00Z' is not a valid UUID v7 snapshot ID");
34
+ });
35
+ });
36
+ describe('when id contains path traversal', () => {
37
+ it('throws error', () => {
38
+ expect(() => validateUuidV7('../evil')).toThrow("'../evil' is not a valid UUID v7 snapshot ID");
39
+ });
40
+ });
41
+ describe('when id is empty string', () => {
42
+ it('throws error', () => {
43
+ expect(() => validateUuidV7('')).toThrow("'' is not a valid UUID v7 snapshot ID");
44
+ });
45
+ });
46
+ });
20
47
  //# sourceMappingURL=validation.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"validation.test.js","sourceRoot":"","sources":["../../../../src/session/__tests__/validation.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAErD,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;QACxC,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;YAChC,MAAM,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QACzD,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,wCAAwC,EAAE,GAAG,EAAE;QACtD,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE;YACtB,MAAM,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CACpD,+FAA+F,CAChG,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAClD,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE;YACtB,MAAM,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CACrD,gGAAgG,CACjG,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"validation.test.js","sourceRoot":"","sources":["../../../../src/session/__tests__/validation.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAErE,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;QACxC,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;YAChC,MAAM,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QACzD,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,wCAAwC,EAAE,GAAG,EAAE;QACtD,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE;YACtB,MAAM,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CACpD,+FAA+F,CAChG,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAClD,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE;YACtB,MAAM,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CACrD,gGAAgG,CACjG,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;QAC1C,EAAE,CAAC,gBAAgB,EAAE,GAAG,EAAE;YACxB,MAAM,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,sCAAsC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAA;QACpF,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,sCAAsC,EAAE,GAAG,EAAE;QACpD,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE;YACtB,MAAM,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,sCAAsC,CAAC,CAAC,CAAC,OAAO,CAC1E,2EAA2E,CAC5E,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;QAC7C,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE;YACtB,MAAM,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,sBAAsB,CAAC,CAAC,CAAC,OAAO,CAC1D,2DAA2D,CAC5D,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;QAC/C,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE;YACtB,MAAM,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,8CAA8C,CAAC,CAAA;QACjG,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACvC,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE;YACtB,MAAM,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,uCAAuC,CAAC,CAAA;QACnF,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -1,22 +1,38 @@
1
1
  import type { SnapshotStorage, SnapshotLocation } from './storage.js';
2
2
  import type { Snapshot, SnapshotManifest } from './types.js';
3
3
  /**
4
- * File-based implementation of SnapshotStorage for persisting session snapshots
4
+ * File-based implementation of SnapshotStorage.
5
+ * Persists session snapshots to the local filesystem under a configurable base directory.
6
+ *
7
+ * Directory layout:
8
+ * ```
9
+ * <baseDir>/<sessionId>/scopes/<scope>/<scopeId>/snapshots/
10
+ * snapshot_latest.json
11
+ * immutable_history/
12
+ * snapshot_<uuid7>.json
13
+ * ```
5
14
  */
6
15
  export declare class FileStorage implements SnapshotStorage {
7
- /** Base directory path */
16
+ /** Absolute path to the root directory where all session data is stored. */
8
17
  private readonly _baseDir;
9
18
  /**
10
- * Creates new FileStorage instance
11
- * @param baseDir - Base directory path for storing snapshots
19
+ * @param baseDir - Absolute path to the root directory for storing session snapshots.
12
20
  */
13
21
  constructor(baseDir: string);
14
22
  /**
15
- * Generates file path for session scope snapshots
23
+ * Resolves the absolute file path for a given scope location and filename.
24
+ * Validates sessionId and scopeId before constructing the path.
16
25
  */
17
26
  private _getPath;
18
27
  /**
19
- * Saves snapshot to file, optionally marking as latest
28
+ * Resolves the absolute path to the root directory for a session.
29
+ * Used by deleteSession to remove all data under `<baseDir>/<sessionId>/`.
30
+ */
31
+ private _getSessionDir;
32
+ /**
33
+ * Persists a snapshot to disk.
34
+ * If `isLatest` is true, writes to `snapshot_latest.json` (overwriting any previous).
35
+ * Otherwise, writes to `immutable_history/snapshot_<snapshotId>.json`.
20
36
  */
21
37
  saveSnapshot(params: {
22
38
  location: SnapshotLocation;
@@ -25,55 +41,65 @@ export declare class FileStorage implements SnapshotStorage {
25
41
  snapshot: Snapshot;
26
42
  }): Promise<void>;
27
43
  /**
28
- * Loads snapshot by ID or latest if null
44
+ * Loads a snapshot from disk.
45
+ * If `snapshotId` is omitted, loads `snapshot_latest.json`.
46
+ * Returns null if the file does not exist.
29
47
  */
30
48
  loadSnapshot(params: {
31
49
  location: SnapshotLocation;
32
50
  snapshotId?: string;
33
51
  }): Promise<Snapshot | null>;
34
52
  /**
35
- * Checks if an error is a file not found error (ENOENT)
36
- */
37
- private _isFileNotFoundError;
38
- /**
39
- * Lists all snapshot IDs for a session scope.
40
- *
41
- * TODO: Add pagination support for long-running agents with many snapshots.
42
- * Future signature could be:
43
- * ```typescript
44
- * listSnapshots(params: {
45
- * sessionId: string
46
- * scope: Scope
47
- * limit?: number // Max results to return (e.g., 100)
48
- * startAfter?: string // Snapshot ID to start after (for cursor-based pagination)
49
- * }): Promise<{ snapshotIds: string[]; nextToken?: string }>
50
- * ```
53
+ * Lists immutable snapshot IDs for a scope, sorted chronologically.
54
+ * Since IDs are UUID v7, lexicographic sort equals chronological order.
55
+ * `startAfter` filters to IDs after the given UUID v7 (exclusive cursor).
56
+ * `limit` caps the number of returned IDs.
57
+ * Returns an empty array if no snapshots exist yet.
51
58
  */
52
59
  listSnapshotIds(params: {
53
60
  location: SnapshotLocation;
61
+ limit?: number;
62
+ startAfter?: string;
54
63
  }): Promise<string[]>;
55
64
  /**
56
- * Loads manifest or returns default if not found
65
+ * Deletes all data for a session by removing its root directory (`<baseDir>/<sessionId>/`) recursively.
66
+ * No-ops if the session directory does not exist.
67
+ */
68
+ deleteSession(params: {
69
+ sessionId: string;
70
+ }): Promise<void>;
71
+ /**
72
+ * Loads the snapshot manifest for a scope.
73
+ * Returns a default manifest with the current timestamp if none exists yet.
57
74
  */
58
75
  loadManifest(params: {
59
76
  location: SnapshotLocation;
60
77
  }): Promise<SnapshotManifest>;
61
78
  /**
62
- * Saves manifest to file
79
+ * Persists the snapshot manifest for a scope to disk.
63
80
  */
64
81
  saveManifest(params: {
65
82
  location: SnapshotLocation;
66
83
  manifest: SnapshotManifest;
67
84
  }): Promise<void>;
68
85
  /**
69
- * Writes JSON data to file atomically
86
+ * Atomically writes JSON to a file using a `.tmp` intermediary to prevent partial writes.
87
+ * Creates parent directories if they do not exist.
70
88
  */
71
89
  private _writeJSON;
72
90
  /**
73
- * Reads and parses JSON from file
91
+ * Reads and parses a JSON file. Returns null if the file does not exist.
92
+ * Throws SessionError on parse failure or unexpected filesystem errors.
74
93
  */
75
94
  private _readJSON;
95
+ /** Returns true if the error represents a missing file or directory (ENOENT). */
96
+ private _isFileNotFoundError;
97
+ /** Returns the file path for `snapshot_latest.json` within the given scope. */
76
98
  private _getLatestSnapshotPath;
99
+ /**
100
+ * Returns the file path for an immutable snapshot in `immutable_history/`.
101
+ * Validates the snapshotId and guards against path traversal outside `_baseDir`.
102
+ */
77
103
  private _getHistorySnapshotPath;
78
104
  }
79
105
  //# sourceMappingURL=file-storage.d.ts.map