@strands-agents/sdk 0.4.0 → 0.6.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 (306) hide show
  1. package/dist/src/__fixtures__/agent-helpers.d.ts +10 -1
  2. package/dist/src/__fixtures__/agent-helpers.d.ts.map +1 -1
  3. package/dist/src/__fixtures__/agent-helpers.js +13 -2
  4. package/dist/src/__fixtures__/agent-helpers.js.map +1 -1
  5. package/dist/src/__fixtures__/metrics-helpers.d.ts +25 -0
  6. package/dist/src/__fixtures__/metrics-helpers.d.ts.map +1 -0
  7. package/dist/src/__fixtures__/metrics-helpers.js +34 -0
  8. package/dist/src/__fixtures__/metrics-helpers.js.map +1 -0
  9. package/dist/src/__fixtures__/mock-message-model.d.ts.map +1 -1
  10. package/dist/src/__fixtures__/mock-message-model.js +12 -0
  11. package/dist/src/__fixtures__/mock-message-model.js.map +1 -1
  12. package/dist/src/__fixtures__/mock-span.d.ts +78 -0
  13. package/dist/src/__fixtures__/mock-span.d.ts.map +1 -0
  14. package/dist/src/__fixtures__/mock-span.js +93 -0
  15. package/dist/src/__fixtures__/mock-span.js.map +1 -0
  16. package/dist/src/__fixtures__/mock-storage-provider.d.ts +5 -0
  17. package/dist/src/__fixtures__/mock-storage-provider.d.ts.map +1 -1
  18. package/dist/src/__fixtures__/mock-storage-provider.js +23 -6
  19. package/dist/src/__fixtures__/mock-storage-provider.js.map +1 -1
  20. package/dist/src/__fixtures__/slim-types.d.ts +2 -1
  21. package/dist/src/__fixtures__/slim-types.d.ts.map +1 -1
  22. package/dist/src/__fixtures__/tool-helpers.d.ts +2 -2
  23. package/dist/src/__fixtures__/tool-helpers.d.ts.map +1 -1
  24. package/dist/src/__fixtures__/tool-helpers.js +4 -4
  25. package/dist/src/__fixtures__/tool-helpers.js.map +1 -1
  26. package/dist/src/__tests__/app-state.test.d.ts +2 -0
  27. package/dist/src/__tests__/app-state.test.d.ts.map +1 -0
  28. package/dist/src/{agent/__tests__/state.test.js → __tests__/app-state.test.js} +46 -46
  29. package/dist/src/__tests__/app-state.test.js.map +1 -0
  30. package/dist/src/__tests__/mcp.test.js +129 -18
  31. package/dist/src/__tests__/mcp.test.js.map +1 -1
  32. package/dist/src/agent/__tests__/agent.test.js +119 -11
  33. package/dist/src/agent/__tests__/agent.test.js.map +1 -1
  34. package/dist/src/agent/__tests__/agent.tracer.test.d.ts +2 -0
  35. package/dist/src/agent/__tests__/agent.tracer.test.d.ts.map +1 -0
  36. package/dist/src/agent/__tests__/agent.tracer.test.js +470 -0
  37. package/dist/src/agent/__tests__/agent.tracer.test.js.map +1 -0
  38. package/dist/src/agent/agent.d.ts +79 -9
  39. package/dist/src/agent/agent.d.ts.map +1 -1
  40. package/dist/src/agent/agent.js +253 -68
  41. package/dist/src/agent/agent.js.map +1 -1
  42. package/dist/src/{agent/state.d.ts → app-state.d.ts} +7 -7
  43. package/dist/src/app-state.d.ts.map +1 -0
  44. package/dist/src/{agent/state.js → app-state.js} +6 -6
  45. package/dist/src/app-state.js.map +1 -0
  46. package/dist/src/conversation-manager/sliding-window-conversation-manager.d.ts +1 -1
  47. package/dist/src/conversation-manager/sliding-window-conversation-manager.js +1 -1
  48. package/dist/src/errors.d.ts +6 -0
  49. package/dist/src/errors.d.ts.map +1 -1
  50. package/dist/src/errors.js +9 -0
  51. package/dist/src/errors.js.map +1 -1
  52. package/dist/src/hooks/__tests__/events.test.js +2 -0
  53. package/dist/src/hooks/__tests__/events.test.js.map +1 -1
  54. package/dist/src/hooks/events.d.ts +16 -0
  55. package/dist/src/hooks/events.d.ts.map +1 -1
  56. package/dist/src/hooks/events.js.map +1 -1
  57. package/dist/src/hooks/index.d.ts +1 -1
  58. package/dist/src/hooks/index.d.ts.map +1 -1
  59. package/dist/src/index.d.ts +23 -7
  60. package/dist/src/index.d.ts.map +1 -1
  61. package/dist/src/index.js +19 -2
  62. package/dist/src/index.js.map +1 -1
  63. package/dist/src/mcp.d.ts +41 -0
  64. package/dist/src/mcp.d.ts.map +1 -1
  65. package/dist/src/mcp.js +60 -6
  66. package/dist/src/mcp.js.map +1 -1
  67. package/dist/src/models/__tests__/bedrock.test.js +688 -0
  68. package/dist/src/models/__tests__/bedrock.test.js.map +1 -1
  69. package/dist/src/models/__tests__/model.test.js +113 -0
  70. package/dist/src/models/__tests__/model.test.js.map +1 -1
  71. package/dist/src/models/__tests__/streaming.test.d.ts +2 -0
  72. package/dist/src/models/__tests__/streaming.test.d.ts.map +1 -0
  73. package/dist/src/models/__tests__/streaming.test.js +50 -0
  74. package/dist/src/models/__tests__/streaming.test.js.map +1 -0
  75. package/dist/src/models/bedrock.d.ts +80 -1
  76. package/dist/src/models/bedrock.d.ts.map +1 -1
  77. package/dist/src/models/bedrock.js +214 -5
  78. package/dist/src/models/bedrock.js.map +1 -1
  79. package/dist/src/models/model.d.ts +10 -0
  80. package/dist/src/models/model.d.ts.map +1 -1
  81. package/dist/src/models/model.js +58 -2
  82. package/dist/src/models/model.js.map +1 -1
  83. package/dist/src/models/streaming.d.ts +84 -3
  84. package/dist/src/models/streaming.d.ts.map +1 -1
  85. package/dist/src/models/streaming.js +26 -0
  86. package/dist/src/models/streaming.js.map +1 -1
  87. package/dist/src/multiagent/__tests__/events.test.d.ts +2 -0
  88. package/dist/src/multiagent/__tests__/events.test.d.ts.map +1 -0
  89. package/dist/src/multiagent/__tests__/events.test.js +205 -0
  90. package/dist/src/multiagent/__tests__/events.test.js.map +1 -0
  91. package/dist/src/multiagent/__tests__/graph.test.d.ts +2 -0
  92. package/dist/src/multiagent/__tests__/graph.test.d.ts.map +1 -0
  93. package/dist/src/multiagent/__tests__/graph.test.js +438 -0
  94. package/dist/src/multiagent/__tests__/graph.test.js.map +1 -0
  95. package/dist/src/multiagent/__tests__/nodes.test.js +105 -9
  96. package/dist/src/multiagent/__tests__/nodes.test.js.map +1 -1
  97. package/dist/src/multiagent/__tests__/queue.test.d.ts +2 -0
  98. package/dist/src/multiagent/__tests__/queue.test.d.ts.map +1 -0
  99. package/dist/src/multiagent/__tests__/queue.test.js +118 -0
  100. package/dist/src/multiagent/__tests__/queue.test.js.map +1 -0
  101. package/dist/src/multiagent/__tests__/swarm.test.d.ts +2 -0
  102. package/dist/src/multiagent/__tests__/swarm.test.d.ts.map +1 -0
  103. package/dist/src/multiagent/__tests__/swarm.test.js +241 -0
  104. package/dist/src/multiagent/__tests__/swarm.test.js.map +1 -0
  105. package/dist/src/multiagent/base.d.ts +25 -0
  106. package/dist/src/multiagent/base.d.ts.map +1 -0
  107. package/dist/src/multiagent/base.js +2 -0
  108. package/dist/src/multiagent/base.js.map +1 -0
  109. package/dist/src/multiagent/edge.d.ts +36 -0
  110. package/dist/src/multiagent/edge.d.ts.map +1 -0
  111. package/dist/src/multiagent/edge.js +15 -0
  112. package/dist/src/multiagent/edge.js.map +1 -0
  113. package/dist/src/multiagent/events.d.ts +129 -4
  114. package/dist/src/multiagent/events.d.ts.map +1 -1
  115. package/dist/src/multiagent/events.js +140 -2
  116. package/dist/src/multiagent/events.js.map +1 -1
  117. package/dist/src/multiagent/graph.d.ts +125 -0
  118. package/dist/src/multiagent/graph.d.ts.map +1 -0
  119. package/dist/src/multiagent/graph.js +394 -0
  120. package/dist/src/multiagent/graph.js.map +1 -0
  121. package/dist/src/multiagent/index.d.ts +12 -6
  122. package/dist/src/multiagent/index.d.ts.map +1 -1
  123. package/dist/src/multiagent/index.js +6 -3
  124. package/dist/src/multiagent/index.js.map +1 -1
  125. package/dist/src/multiagent/nodes.d.ts +66 -16
  126. package/dist/src/multiagent/nodes.d.ts.map +1 -1
  127. package/dist/src/multiagent/nodes.js +82 -24
  128. package/dist/src/multiagent/nodes.js.map +1 -1
  129. package/dist/src/multiagent/queue.d.ts +73 -0
  130. package/dist/src/multiagent/queue.d.ts.map +1 -0
  131. package/dist/src/multiagent/queue.js +72 -0
  132. package/dist/src/multiagent/queue.js.map +1 -0
  133. package/dist/src/multiagent/state.d.ts +79 -10
  134. package/dist/src/multiagent/state.d.ts.map +1 -1
  135. package/dist/src/multiagent/state.js +101 -9
  136. package/dist/src/multiagent/state.js.map +1 -1
  137. package/dist/src/multiagent/swarm.d.ts +102 -0
  138. package/dist/src/multiagent/swarm.d.ts.map +1 -0
  139. package/dist/src/multiagent/swarm.js +238 -0
  140. package/dist/src/multiagent/swarm.js.map +1 -0
  141. package/dist/src/registry/__tests__/tool-registry.test.d.ts +2 -0
  142. package/dist/src/registry/__tests__/tool-registry.test.d.ts.map +1 -0
  143. package/dist/src/registry/__tests__/tool-registry.test.js +124 -0
  144. package/dist/src/registry/__tests__/tool-registry.test.js.map +1 -0
  145. package/dist/src/registry/tool-registry.d.ts +32 -20
  146. package/dist/src/registry/tool-registry.d.ts.map +1 -1
  147. package/dist/src/registry/tool-registry.js +60 -158
  148. package/dist/src/registry/tool-registry.js.map +1 -1
  149. package/dist/src/session/__tests__/file-storage.test.node.js +75 -15
  150. package/dist/src/session/__tests__/file-storage.test.node.js.map +1 -1
  151. package/dist/src/session/__tests__/s3-storage.test.d.ts +2 -0
  152. package/dist/src/session/__tests__/s3-storage.test.d.ts.map +1 -0
  153. package/dist/src/session/__tests__/{s3-storage.test.node.js → s3-storage.test.js} +161 -75
  154. package/dist/src/session/__tests__/s3-storage.test.js.map +1 -0
  155. package/dist/src/session/__tests__/session-manager.test.d.ts +2 -0
  156. package/dist/src/session/__tests__/session-manager.test.d.ts.map +1 -0
  157. package/dist/src/session/__tests__/session-manager.test.js +461 -0
  158. package/dist/src/session/__tests__/session-manager.test.js.map +1 -0
  159. package/dist/src/session/__tests__/validation.test.js +28 -1
  160. package/dist/src/session/__tests__/validation.test.js.map +1 -1
  161. package/dist/src/session/file-storage.d.ts +53 -27
  162. package/dist/src/session/file-storage.d.ts.map +1 -1
  163. package/dist/src/session/file-storage.js +103 -52
  164. package/dist/src/session/file-storage.js.map +1 -1
  165. package/dist/src/session/index.d.ts +6 -13
  166. package/dist/src/session/index.d.ts.map +1 -1
  167. package/dist/src/session/index.js +4 -12
  168. package/dist/src/session/index.js.map +1 -1
  169. package/dist/src/session/s3-storage.d.ts +49 -20
  170. package/dist/src/session/s3-storage.d.ts.map +1 -1
  171. package/dist/src/session/s3-storage.js +120 -35
  172. package/dist/src/session/s3-storage.js.map +1 -1
  173. package/dist/src/session/session-manager.d.ts +83 -0
  174. package/dist/src/session/session-manager.d.ts.map +1 -0
  175. package/dist/src/session/session-manager.js +122 -0
  176. package/dist/src/session/session-manager.js.map +1 -0
  177. package/dist/src/session/storage.d.ts +19 -11
  178. package/dist/src/session/storage.d.ts.map +1 -1
  179. package/dist/src/session/types.d.ts +6 -18
  180. package/dist/src/session/types.d.ts.map +1 -1
  181. package/dist/src/session/validation.d.ts +7 -0
  182. package/dist/src/session/validation.d.ts.map +1 -1
  183. package/dist/src/session/validation.js +12 -0
  184. package/dist/src/session/validation.js.map +1 -1
  185. package/dist/src/structured-output/__tests__/context.test.js +13 -13
  186. package/dist/src/structured-output/__tests__/context.test.js.map +1 -1
  187. package/dist/src/structured-output/context.js +1 -1
  188. package/dist/src/structured-output/context.js.map +1 -1
  189. package/dist/src/telemetry/__tests__/config.test.d.ts +2 -0
  190. package/dist/src/telemetry/__tests__/config.test.d.ts.map +1 -0
  191. package/dist/src/telemetry/__tests__/config.test.js +40 -0
  192. package/dist/src/telemetry/__tests__/config.test.js.map +1 -0
  193. package/dist/src/telemetry/__tests__/config.test.node.d.ts +2 -0
  194. package/dist/src/telemetry/__tests__/config.test.node.d.ts.map +1 -0
  195. package/dist/src/telemetry/__tests__/config.test.node.js +103 -0
  196. package/dist/src/telemetry/__tests__/config.test.node.js.map +1 -0
  197. package/dist/src/telemetry/__tests__/json.test.d.ts +2 -0
  198. package/dist/src/telemetry/__tests__/json.test.d.ts.map +1 -0
  199. package/dist/src/telemetry/__tests__/json.test.js +89 -0
  200. package/dist/src/telemetry/__tests__/json.test.js.map +1 -0
  201. package/dist/src/telemetry/__tests__/meter.test.d.ts +2 -0
  202. package/dist/src/telemetry/__tests__/meter.test.d.ts.map +1 -0
  203. package/dist/src/telemetry/__tests__/meter.test.js +457 -0
  204. package/dist/src/telemetry/__tests__/meter.test.js.map +1 -0
  205. package/dist/src/telemetry/__tests__/tracer.test.node.d.ts +2 -0
  206. package/dist/src/telemetry/__tests__/tracer.test.node.d.ts.map +1 -0
  207. package/dist/src/telemetry/__tests__/tracer.test.node.js +611 -0
  208. package/dist/src/telemetry/__tests__/tracer.test.node.js.map +1 -0
  209. package/dist/src/telemetry/config.d.ts +82 -0
  210. package/dist/src/telemetry/config.d.ts.map +1 -0
  211. package/dist/src/telemetry/config.js +133 -0
  212. package/dist/src/telemetry/config.js.map +1 -0
  213. package/dist/src/telemetry/index.d.ts +34 -0
  214. package/dist/src/telemetry/index.d.ts.map +1 -0
  215. package/dist/src/telemetry/index.js +33 -0
  216. package/dist/src/telemetry/index.js.map +1 -0
  217. package/dist/src/telemetry/json.d.ts +11 -0
  218. package/dist/src/telemetry/json.d.ts.map +1 -0
  219. package/dist/src/telemetry/json.js +25 -0
  220. package/dist/src/telemetry/json.js.map +1 -0
  221. package/dist/src/telemetry/meter.d.ts +277 -0
  222. package/dist/src/telemetry/meter.d.ts.map +1 -0
  223. package/dist/src/telemetry/meter.js +292 -0
  224. package/dist/src/telemetry/meter.js.map +1 -0
  225. package/dist/src/telemetry/tracer.d.ts +219 -0
  226. package/dist/src/telemetry/tracer.d.ts.map +1 -0
  227. package/dist/src/telemetry/tracer.js +610 -0
  228. package/dist/src/telemetry/tracer.js.map +1 -0
  229. package/dist/src/telemetry/types.d.ts +101 -0
  230. package/dist/src/telemetry/types.d.ts.map +1 -0
  231. package/dist/src/telemetry/types.js +5 -0
  232. package/dist/src/{multiagent → telemetry}/types.js.map +1 -1
  233. package/dist/src/tools/__tests__/tool-factory.test.d.ts +2 -0
  234. package/dist/src/tools/__tests__/tool-factory.test.d.ts.map +1 -0
  235. package/dist/src/tools/__tests__/tool-factory.test.js +98 -0
  236. package/dist/src/tools/__tests__/tool-factory.test.js.map +1 -0
  237. package/dist/src/tools/__tests__/zod-tool.test-d.js +1 -1
  238. package/dist/src/tools/__tests__/zod-tool.test-d.js.map +1 -1
  239. package/dist/src/tools/__tests__/zod-tool.test.js +3 -4
  240. package/dist/src/tools/__tests__/zod-tool.test.js.map +1 -1
  241. package/dist/src/tools/function-tool.d.ts +15 -2
  242. package/dist/src/tools/function-tool.d.ts.map +1 -1
  243. package/dist/src/tools/function-tool.js +24 -0
  244. package/dist/src/tools/function-tool.js.map +1 -1
  245. package/dist/src/tools/tool-factory.d.ts +22 -0
  246. package/dist/src/tools/tool-factory.d.ts.map +1 -0
  247. package/dist/src/tools/tool-factory.js +55 -0
  248. package/dist/src/tools/tool-factory.js.map +1 -0
  249. package/dist/src/tools/tool.d.ts +1 -1
  250. package/dist/src/tools/tool.js +1 -1
  251. package/dist/src/tools/zod-tool.d.ts +55 -52
  252. package/dist/src/tools/zod-tool.d.ts.map +1 -1
  253. package/dist/src/tools/zod-tool.js +7 -61
  254. package/dist/src/tools/zod-tool.js.map +1 -1
  255. package/dist/src/tsconfig.tsbuildinfo +1 -1
  256. package/dist/src/types/__tests__/agent.test.js +11 -0
  257. package/dist/src/types/__tests__/agent.test.js.map +1 -1
  258. package/dist/src/types/__tests__/citations.test.d.ts +2 -0
  259. package/dist/src/types/__tests__/citations.test.d.ts.map +1 -0
  260. package/dist/src/types/__tests__/citations.test.js +104 -0
  261. package/dist/src/types/__tests__/citations.test.js.map +1 -0
  262. package/dist/src/types/__tests__/messages.test.js +26 -0
  263. package/dist/src/types/__tests__/messages.test.js.map +1 -1
  264. package/dist/src/types/agent.d.ts +10 -3
  265. package/dist/src/types/agent.d.ts.map +1 -1
  266. package/dist/src/types/agent.js +9 -0
  267. package/dist/src/types/agent.js.map +1 -1
  268. package/dist/src/types/citations.d.ts +180 -0
  269. package/dist/src/types/citations.d.ts.map +1 -0
  270. package/dist/src/types/citations.js +45 -0
  271. package/dist/src/types/citations.js.map +1 -0
  272. package/dist/src/types/messages.d.ts +9 -5
  273. package/dist/src/types/messages.d.ts.map +1 -1
  274. package/dist/src/types/messages.js +5 -1
  275. package/dist/src/types/messages.js.map +1 -1
  276. package/dist/src/vended-tools/bash/__tests__/bash.test.node.js +2 -2
  277. package/dist/src/vended-tools/bash/__tests__/bash.test.node.js.map +1 -1
  278. package/dist/src/vended-tools/bash/bash.d.ts.map +1 -1
  279. package/dist/src/vended-tools/bash/bash.js +1 -2
  280. package/dist/src/vended-tools/bash/bash.js.map +1 -1
  281. package/dist/src/vended-tools/file_editor/__tests__/file-editor.test.node.js +4 -4
  282. package/dist/src/vended-tools/file_editor/__tests__/file-editor.test.node.js.map +1 -1
  283. package/dist/src/vended-tools/file_editor/file-editor.js +1 -1
  284. package/dist/src/vended-tools/file_editor/file-editor.js.map +1 -1
  285. package/dist/src/vended-tools/http_request/http-request.d.ts.map +1 -1
  286. package/dist/src/vended-tools/http_request/http-request.js +1 -2
  287. package/dist/src/vended-tools/http_request/http-request.js.map +1 -1
  288. package/dist/src/vended-tools/notebook/__tests__/notebook.test.js +2 -2
  289. package/dist/src/vended-tools/notebook/__tests__/notebook.test.js.map +1 -1
  290. package/dist/src/vended-tools/notebook/notebook.d.ts +1 -1
  291. package/package.json +25 -4
  292. package/dist/src/agent/__tests__/state.test.d.ts +0 -2
  293. package/dist/src/agent/__tests__/state.test.d.ts.map +0 -1
  294. package/dist/src/agent/__tests__/state.test.js.map +0 -1
  295. package/dist/src/agent/state.d.ts.map +0 -1
  296. package/dist/src/agent/state.js.map +0 -1
  297. package/dist/src/multiagent/types.d.ts +0 -5
  298. package/dist/src/multiagent/types.d.ts.map +0 -1
  299. package/dist/src/multiagent/types.js +0 -2
  300. package/dist/src/registry/registry.d.ts +0 -117
  301. package/dist/src/registry/registry.d.ts.map +0 -1
  302. package/dist/src/registry/registry.js +0 -298
  303. package/dist/src/registry/registry.js.map +0 -1
  304. package/dist/src/session/__tests__/s3-storage.test.node.d.ts +0 -2
  305. package/dist/src/session/__tests__/s3-storage.test.node.d.ts.map +0 -1
  306. package/dist/src/session/__tests__/s3-storage.test.node.js.map +0 -1
@@ -0,0 +1,461 @@
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 { HookRegistry, InitializedEvent, MessageAddedEvent, AfterModelCallEvent, AfterInvocationEvent, } from '../../hooks/index.js';
5
+ import { Agent } from '../../agent/agent.js';
6
+ import { Message, TextBlock } from '../../types/messages.js';
7
+ // Test fixtures
8
+ function createMockAgent(agentId = 'default') {
9
+ const agent = {
10
+ agentId,
11
+ messages: [],
12
+ state: {
13
+ _m: new Map(),
14
+ get(k) {
15
+ return this._m.get(k);
16
+ },
17
+ set(k, v) {
18
+ this._m.set(k, v);
19
+ },
20
+ toJSON() {
21
+ return Object.fromEntries(this._m);
22
+ },
23
+ loadStateFromJson(json) {
24
+ Object.entries(json).forEach(([k, v]) => this._m.set(k, v));
25
+ },
26
+ },
27
+ systemPrompt: 'Test prompt',
28
+ };
29
+ return agent;
30
+ }
31
+ const MOCK_MESSAGE = new Message({ role: 'user', content: [new TextBlock('test')] });
32
+ function createMockEvent(agent) {
33
+ return { agent };
34
+ }
35
+ function createMockMessageEvent(agent) {
36
+ return { agent, message: MOCK_MESSAGE };
37
+ }
38
+ describe('SessionManager', () => {
39
+ let storage;
40
+ let sessionManager;
41
+ let registry;
42
+ let mockAgent;
43
+ beforeEach(() => {
44
+ storage = new MockSnapshotStorage();
45
+ mockAgent = createMockAgent();
46
+ registry = new HookRegistry();
47
+ });
48
+ describe('constructor', () => {
49
+ it('defaults saveLatestOn to invocation', async () => {
50
+ sessionManager = new SessionManager({ sessionId: 'test-default', storage: { snapshot: storage } });
51
+ sessionManager.registerCallbacks(registry);
52
+ await registry.invokeCallbacks(new AfterInvocationEvent(createMockEvent(mockAgent)));
53
+ const snapshot = await storage.loadSnapshot({
54
+ location: { sessionId: 'test-default', scope: 'agent', scopeId: 'default' },
55
+ });
56
+ expect(snapshot).not.toBeNull();
57
+ });
58
+ });
59
+ describe('saveSnapshot', () => {
60
+ beforeEach(() => {
61
+ mockAgent = createMockAgent('test-agent');
62
+ sessionManager = new SessionManager({
63
+ sessionId: 'test-session',
64
+ storage: { snapshot: storage },
65
+ });
66
+ });
67
+ it('saves snapshot_latest when isLatest is true', async () => {
68
+ await sessionManager.saveSnapshot({ target: mockAgent, isLatest: true });
69
+ const snapshot = await storage.loadSnapshot({
70
+ location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
71
+ });
72
+ expect(snapshot).not.toBeNull();
73
+ expect(snapshot?.scope).toBe('agent');
74
+ });
75
+ it('saves immutable snapshot when isLatest is false', async () => {
76
+ await sessionManager.saveSnapshot({ target: mockAgent, isLatest: false });
77
+ const ids = await storage.listSnapshotIds({
78
+ location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
79
+ });
80
+ expect(ids.length).toBeGreaterThan(0);
81
+ });
82
+ it('allocates unique snapshot IDs', async () => {
83
+ await sessionManager.saveSnapshot({ target: mockAgent, isLatest: false });
84
+ await sessionManager.saveSnapshot({ target: mockAgent, isLatest: false });
85
+ await sessionManager.saveSnapshot({ target: mockAgent, isLatest: false });
86
+ const ids = await storage.listSnapshotIds({
87
+ location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
88
+ });
89
+ expect(ids.length).toBe(3);
90
+ });
91
+ });
92
+ describe('restoreSnapshot', () => {
93
+ beforeEach(() => {
94
+ mockAgent = createMockAgent('test-agent');
95
+ sessionManager = new SessionManager({
96
+ sessionId: 'test-session',
97
+ storage: { snapshot: storage },
98
+ });
99
+ });
100
+ it('restores snapshot_latest when no snapshotId provided', async () => {
101
+ const snapshot = createTestSnapshot();
102
+ await storage.saveSnapshot({
103
+ location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
104
+ snapshotId: 'latest',
105
+ isLatest: true,
106
+ snapshot,
107
+ });
108
+ const result = await sessionManager.restoreSnapshot({ target: mockAgent });
109
+ expect(result).toBe(true);
110
+ });
111
+ it('restores specific snapshot by ID', async () => {
112
+ const snapshot = createTestSnapshot();
113
+ await storage.saveSnapshot({
114
+ location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
115
+ snapshotId: '5',
116
+ isLatest: false,
117
+ snapshot,
118
+ });
119
+ const result = await sessionManager.restoreSnapshot({ target: mockAgent, snapshotId: '5' });
120
+ expect(result).toBe(true);
121
+ });
122
+ it('returns false when snapshot not found', async () => {
123
+ const result = await sessionManager.restoreSnapshot({ target: mockAgent, snapshotId: '999' });
124
+ expect(result).toBe(false);
125
+ });
126
+ });
127
+ describe('InitializedEvent handling', () => {
128
+ beforeEach(() => {
129
+ mockAgent = createMockAgent('test-agent');
130
+ });
131
+ it('loads snapshot_latest on initialization', async () => {
132
+ const snapshot = createTestSnapshot();
133
+ await storage.saveSnapshot({
134
+ location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
135
+ snapshotId: 'latest',
136
+ isLatest: true,
137
+ snapshot,
138
+ });
139
+ sessionManager = new SessionManager({
140
+ sessionId: 'test-session',
141
+ storage: { snapshot: storage },
142
+ });
143
+ sessionManager.registerCallbacks(registry);
144
+ await registry.invokeCallbacks(new InitializedEvent(createMockEvent(mockAgent)));
145
+ expect(mockAgent.messages).toEqual(snapshot.data.messages);
146
+ });
147
+ it('handles missing snapshot gracefully', async () => {
148
+ sessionManager = new SessionManager({
149
+ sessionId: 'new-session',
150
+ storage: { snapshot: storage },
151
+ });
152
+ sessionManager.registerCallbacks(registry);
153
+ await expect(registry.invokeCallbacks(new InitializedEvent(createMockEvent(mockAgent)))).resolves.not.toThrow();
154
+ });
155
+ });
156
+ describe('MessageAddedEvent handling', () => {
157
+ beforeEach(() => {
158
+ mockAgent = createMockAgent('test-agent');
159
+ });
160
+ it('saves snapshot_latest when saveLatestOn is message', async () => {
161
+ sessionManager = new SessionManager({
162
+ sessionId: 'test-session',
163
+ storage: { snapshot: storage },
164
+ saveLatestOn: 'message',
165
+ });
166
+ sessionManager.registerCallbacks(registry);
167
+ await registry.invokeCallbacks(new MessageAddedEvent(createMockMessageEvent(mockAgent)));
168
+ const snapshot = await storage.loadSnapshot({
169
+ location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
170
+ });
171
+ expect(snapshot).not.toBeNull();
172
+ });
173
+ it('does not save when saveLatestOn is invocation', async () => {
174
+ sessionManager = new SessionManager({
175
+ sessionId: 'test-session',
176
+ storage: { snapshot: storage },
177
+ saveLatestOn: 'invocation',
178
+ });
179
+ sessionManager.registerCallbacks(registry);
180
+ await registry.invokeCallbacks(new MessageAddedEvent(createMockMessageEvent(mockAgent)));
181
+ const snapshot = await storage.loadSnapshot({
182
+ location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
183
+ });
184
+ expect(snapshot).toBeNull();
185
+ });
186
+ });
187
+ describe('AfterInvocationEvent handling', () => {
188
+ beforeEach(() => {
189
+ mockAgent = createMockAgent('test-agent');
190
+ });
191
+ it('saves snapshot_latest when saveLatestOn is invocation', async () => {
192
+ sessionManager = new SessionManager({
193
+ sessionId: 'test-session',
194
+ storage: { snapshot: storage },
195
+ saveLatestOn: 'invocation',
196
+ });
197
+ sessionManager.registerCallbacks(registry);
198
+ await registry.invokeCallbacks(new InitializedEvent(createMockEvent(mockAgent)));
199
+ await registry.invokeCallbacks(new AfterInvocationEvent(createMockEvent(mockAgent)));
200
+ const snapshot = await storage.loadSnapshot({
201
+ location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
202
+ });
203
+ expect(snapshot).not.toBeNull();
204
+ });
205
+ it('does not save snapshot_latest when saveLatestOn is trigger', async () => {
206
+ sessionManager = new SessionManager({
207
+ sessionId: 'test-session',
208
+ storage: { snapshot: storage },
209
+ saveLatestOn: 'trigger',
210
+ });
211
+ sessionManager.registerCallbacks(registry);
212
+ await registry.invokeCallbacks(new InitializedEvent(createMockEvent(mockAgent)));
213
+ await registry.invokeCallbacks(new AfterInvocationEvent(createMockEvent(mockAgent)));
214
+ const snapshot = await storage.loadSnapshot({
215
+ location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
216
+ });
217
+ expect(snapshot).toBeNull();
218
+ });
219
+ });
220
+ describe('snapshotTrigger', () => {
221
+ beforeEach(() => {
222
+ mockAgent = createMockAgent('test-agent');
223
+ });
224
+ it('creates immutable snapshot when trigger returns true', async () => {
225
+ sessionManager = new SessionManager({
226
+ sessionId: 'test-session',
227
+ storage: { snapshot: storage },
228
+ saveLatestOn: 'trigger',
229
+ snapshotTrigger: () => true,
230
+ });
231
+ sessionManager.registerCallbacks(registry);
232
+ await registry.invokeCallbacks(new InitializedEvent(createMockEvent(mockAgent)));
233
+ await registry.invokeCallbacks(new AfterInvocationEvent(createMockEvent(mockAgent)));
234
+ const ids = await storage.listSnapshotIds({
235
+ location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
236
+ });
237
+ expect(ids.length).toBe(1);
238
+ });
239
+ it('does not create immutable snapshot when trigger returns false', async () => {
240
+ sessionManager = new SessionManager({
241
+ sessionId: 'test-session',
242
+ storage: { snapshot: storage },
243
+ saveLatestOn: 'trigger',
244
+ snapshotTrigger: () => false,
245
+ });
246
+ sessionManager.registerCallbacks(registry);
247
+ await registry.invokeCallbacks(new InitializedEvent(createMockEvent(mockAgent)));
248
+ await registry.invokeCallbacks(new AfterInvocationEvent(createMockEvent(mockAgent)));
249
+ const ids = await storage.listSnapshotIds({
250
+ location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
251
+ });
252
+ expect(ids.length).toBe(0);
253
+ });
254
+ it('provides agentData to trigger', async () => {
255
+ const triggerSpy = vi.fn(() => false);
256
+ sessionManager = new SessionManager({
257
+ sessionId: 'test-session',
258
+ storage: { snapshot: storage },
259
+ saveLatestOn: 'trigger',
260
+ snapshotTrigger: triggerSpy,
261
+ });
262
+ sessionManager.registerCallbacks(registry);
263
+ await registry.invokeCallbacks(new InitializedEvent(createMockEvent(mockAgent)));
264
+ await registry.invokeCallbacks(new AfterInvocationEvent(createMockEvent(mockAgent)));
265
+ expect(triggerSpy).toHaveBeenCalledWith(expect.objectContaining({
266
+ agentData: {
267
+ state: mockAgent.state,
268
+ messages: mockAgent.messages,
269
+ },
270
+ }));
271
+ });
272
+ it('saves both immutable and latest when trigger fires', async () => {
273
+ sessionManager = new SessionManager({
274
+ sessionId: 'test-session',
275
+ storage: { snapshot: storage },
276
+ saveLatestOn: 'trigger',
277
+ snapshotTrigger: () => true,
278
+ });
279
+ sessionManager.registerCallbacks(registry);
280
+ await registry.invokeCallbacks(new InitializedEvent(createMockEvent(mockAgent)));
281
+ await registry.invokeCallbacks(new AfterInvocationEvent(createMockEvent(mockAgent)));
282
+ const immutableIds = await storage.listSnapshotIds({
283
+ location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
284
+ });
285
+ const latest = await storage.loadSnapshot({
286
+ location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
287
+ });
288
+ expect(immutableIds.length).toBe(1);
289
+ expect(latest).not.toBeNull();
290
+ });
291
+ it('trigger based on message count via agentData', async () => {
292
+ sessionManager = new SessionManager({
293
+ sessionId: 'test-session',
294
+ storage: { snapshot: storage },
295
+ saveLatestOn: 'trigger',
296
+ snapshotTrigger: ({ agentData }) => agentData.messages.length >= 2,
297
+ });
298
+ sessionManager.registerCallbacks(registry);
299
+ await registry.invokeCallbacks(new InitializedEvent(createMockEvent(mockAgent)));
300
+ await registry.invokeCallbacks(new AfterInvocationEvent(createMockEvent(mockAgent)));
301
+ let ids = await storage.listSnapshotIds({
302
+ location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
303
+ });
304
+ expect(ids.length).toBe(0); // 0 messages — no snapshot
305
+ mockAgent.messages.push(MOCK_MESSAGE, MOCK_MESSAGE);
306
+ await registry.invokeCallbacks(new AfterInvocationEvent(createMockEvent(mockAgent)));
307
+ ids = await storage.listSnapshotIds({
308
+ location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
309
+ });
310
+ expect(ids.length).toBe(1); // 2 messages — snapshot taken
311
+ });
312
+ it('trigger based on agent state via agentData', async () => {
313
+ sessionManager = new SessionManager({
314
+ sessionId: 'test-session',
315
+ storage: { snapshot: storage },
316
+ saveLatestOn: 'trigger',
317
+ snapshotTrigger: ({ agentData }) => agentData.state.get('checkpoint') === true,
318
+ });
319
+ sessionManager.registerCallbacks(registry);
320
+ await registry.invokeCallbacks(new InitializedEvent(createMockEvent(mockAgent)));
321
+ await registry.invokeCallbacks(new AfterInvocationEvent(createMockEvent(mockAgent)));
322
+ let ids = await storage.listSnapshotIds({
323
+ location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
324
+ });
325
+ expect(ids.length).toBe(0); // state not set — no snapshot
326
+ mockAgent.state.set('checkpoint', true);
327
+ await registry.invokeCallbacks(new AfterInvocationEvent(createMockEvent(mockAgent)));
328
+ ids = await storage.listSnapshotIds({
329
+ location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
330
+ });
331
+ expect(ids.length).toBe(1); // state set — snapshot taken
332
+ });
333
+ });
334
+ describe('integration scenarios', () => {
335
+ it('handles complete session lifecycle', async () => {
336
+ sessionManager = new SessionManager({
337
+ sessionId: 'lifecycle-test',
338
+ storage: { snapshot: storage },
339
+ saveLatestOn: 'invocation',
340
+ snapshotTrigger: () => true,
341
+ });
342
+ sessionManager.registerCallbacks(registry);
343
+ await registry.invokeCallbacks(new InitializedEvent(createMockEvent(mockAgent)));
344
+ await registry.invokeCallbacks(new AfterInvocationEvent(createMockEvent(mockAgent)));
345
+ await registry.invokeCallbacks(new AfterInvocationEvent(createMockEvent(mockAgent)));
346
+ await registry.invokeCallbacks(new AfterInvocationEvent(createMockEvent(mockAgent)));
347
+ const latest = await storage.loadSnapshot({
348
+ location: { sessionId: 'lifecycle-test', scope: 'agent', scopeId: 'default' },
349
+ });
350
+ const immutableIds = await storage.listSnapshotIds({
351
+ location: { sessionId: 'lifecycle-test', scope: 'agent', scopeId: 'default' },
352
+ });
353
+ expect(latest).not.toBeNull();
354
+ expect(immutableIds.length).toBe(3);
355
+ });
356
+ it('supports resuming from immutable snapshot', async () => {
357
+ // First session - snapshot fires when messages.length === 2 (after turn 1)
358
+ sessionManager = new SessionManager({
359
+ sessionId: 'resume-test',
360
+ storage: { snapshot: storage },
361
+ saveLatestOn: 'trigger',
362
+ snapshotTrigger: ({ agentData }) => agentData.messages.length === 2,
363
+ });
364
+ sessionManager.registerCallbacks(registry);
365
+ await registry.invokeCallbacks(new InitializedEvent(createMockEvent(mockAgent)));
366
+ mockAgent.messages.push(MOCK_MESSAGE, MOCK_MESSAGE);
367
+ await registry.invokeCallbacks(new AfterInvocationEvent(createMockEvent(mockAgent)));
368
+ const ids = await storage.listSnapshotIds({
369
+ location: { sessionId: 'resume-test', scope: 'agent', scopeId: 'default' },
370
+ });
371
+ expect(ids.length).toBe(1);
372
+ // Second session - resume from that snapshot
373
+ const newAgent = createMockAgent();
374
+ const newSessionManager = new SessionManager({
375
+ sessionId: 'resume-test',
376
+ storage: { snapshot: storage },
377
+ saveLatestOn: 'invocation',
378
+ });
379
+ const newRegistry = new HookRegistry();
380
+ newSessionManager.registerCallbacks(newRegistry);
381
+ await newRegistry.invokeCallbacks(new InitializedEvent(createMockEvent(newAgent)));
382
+ await newSessionManager.restoreSnapshot({ target: newAgent, snapshotId: ids[0] });
383
+ expect(newAgent.messages).toEqual(mockAgent.messages);
384
+ });
385
+ });
386
+ describe('AfterModelCallEvent with redaction handling', () => {
387
+ beforeEach(() => {
388
+ mockAgent = createMockAgent('test-agent');
389
+ });
390
+ it('saves snapshot_latest when saveLatestOn is message and redaction occurred', async () => {
391
+ sessionManager = new SessionManager({
392
+ sessionId: 'test-session',
393
+ storage: { snapshot: storage },
394
+ saveLatestOn: 'message',
395
+ });
396
+ sessionManager.registerCallbacks(registry);
397
+ const assistantMessage = new Message({ role: 'assistant', content: [new TextBlock('Response')] });
398
+ const event = {
399
+ agent: mockAgent,
400
+ stopData: {
401
+ message: assistantMessage,
402
+ stopReason: 'endTurn',
403
+ redaction: {
404
+ userMessage: '[User input redacted.]',
405
+ },
406
+ },
407
+ };
408
+ await registry.invokeCallbacks(new AfterModelCallEvent(event));
409
+ const snapshot = await storage.loadSnapshot({
410
+ location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
411
+ });
412
+ expect(snapshot).not.toBeNull();
413
+ });
414
+ it('does not save when saveLatestOn is message but no redaction occurred', async () => {
415
+ sessionManager = new SessionManager({
416
+ sessionId: 'test-session',
417
+ storage: { snapshot: storage },
418
+ saveLatestOn: 'message',
419
+ });
420
+ sessionManager.registerCallbacks(registry);
421
+ const assistantMessage = new Message({ role: 'assistant', content: [new TextBlock('Response')] });
422
+ const event = {
423
+ agent: mockAgent,
424
+ stopData: {
425
+ message: assistantMessage,
426
+ stopReason: 'endTurn',
427
+ },
428
+ };
429
+ await registry.invokeCallbacks(new AfterModelCallEvent(event));
430
+ const snapshot = await storage.loadSnapshot({
431
+ location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
432
+ });
433
+ expect(snapshot).toBeNull();
434
+ });
435
+ it('does not save when saveLatestOn is invocation', async () => {
436
+ sessionManager = new SessionManager({
437
+ sessionId: 'test-session',
438
+ storage: { snapshot: storage },
439
+ saveLatestOn: 'invocation',
440
+ });
441
+ sessionManager.registerCallbacks(registry);
442
+ const assistantMessage = new Message({ role: 'assistant', content: [new TextBlock('Response')] });
443
+ const event = {
444
+ agent: mockAgent,
445
+ stopData: {
446
+ message: assistantMessage,
447
+ stopReason: 'endTurn',
448
+ redaction: {
449
+ userMessage: '[User input redacted.]',
450
+ },
451
+ },
452
+ };
453
+ await registry.invokeCallbacks(new AfterModelCallEvent(event));
454
+ const snapshot = await storage.loadSnapshot({
455
+ location: { sessionId: 'test-session', scope: 'agent', scopeId: 'test-agent' },
456
+ });
457
+ expect(snapshot).toBeNull();
458
+ });
459
+ });
460
+ });
461
+ //# 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":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,6CAA6C,CAAA;AACrG,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAC5C,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAE5D,gBAAgB;AAChB,SAAS,eAAe,CAAC,OAAO,GAAG,SAAS;IAC1C,MAAM,KAAK,GAAG;QACZ,OAAO;QACP,QAAQ,EAAE,EAAE;QACZ,KAAK,EAAE;YACL,EAAE,EAAE,IAAI,GAAG,EAAE;YACb,GAAG,CAAC,CAAS;gBACX,OAAO,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;YACvB,CAAC;YACD,GAAG,CAAC,CAAS,EAAE,CAAU;gBACvB,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;YACnB,CAAC;YACD,MAAM;gBACJ,OAAO,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YACpC,CAAC;YACD,iBAAiB,CAAC,IAA6B;gBAC7C,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YAC7D,CAAC;SACK;QACR,YAAY,EAAE,aAAa;KACR,CAAA;IACrB,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAA;AAEpF,SAAS,eAAe,CAAC,KAAY;IACnC,OAAO,EAAE,KAAK,EAAE,CAAA;AAClB,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAY;IAC1C,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,CAAA;AACzC,CAAC;AAED,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,IAAI,OAA4B,CAAA;IAChC,IAAI,cAA8B,CAAA;IAClC,IAAI,QAAsB,CAAA;IAC1B,IAAI,SAAgB,CAAA;IAEpB,UAAU,CAAC,GAAG,EAAE;QACd,OAAO,GAAG,IAAI,mBAAmB,EAAE,CAAA;QACnC,SAAS,GAAG,eAAe,EAAE,CAAA;QAC7B,QAAQ,GAAG,IAAI,YAAY,EAAE,CAAA;IAC/B,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;YACnD,cAAc,GAAG,IAAI,cAAc,CAAC,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC,CAAA;YAClG,cAAc,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAA;YAE1C,MAAM,QAAQ,CAAC,eAAe,CAAC,IAAI,oBAAoB,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;YAEpF,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC;gBAC1C,QAAQ,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE;aAC5E,CAAC,CAAA;YACF,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAA;QACjC,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC5B,UAAU,CAAC,GAAG,EAAE;YACd,SAAS,GAAG,eAAe,CAAC,YAAY,CAAC,CAAA;YACzC,cAAc,GAAG,IAAI,cAAc,CAAC;gBAClC,SAAS,EAAE,cAAc;gBACzB,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE;aAC/B,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;YAC3D,MAAM,cAAc,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;YAExE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC;gBAC1C,QAAQ,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE;aAC/E,CAAC,CAAA;YACF,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAA;YAC/B,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACvC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YAC/D,MAAM,cAAc,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAA;YAEzE,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC;gBACxC,QAAQ,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE;aAC/E,CAAC,CAAA;YACF,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;QACvC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;YAC7C,MAAM,cAAc,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAA;YACzE,MAAM,cAAc,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAA;YACzE,MAAM,cAAc,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAA;YAEzE,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC;gBACxC,QAAQ,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE;aAC/E,CAAC,CAAA;YACF,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC5B,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,UAAU,CAAC,GAAG,EAAE;YACd,SAAS,GAAG,eAAe,CAAC,YAAY,CAAC,CAAA;YACzC,cAAc,GAAG,IAAI,cAAc,CAAC;gBAClC,SAAS,EAAE,cAAc;gBACzB,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE;aAC/B,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;YACpE,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAA;YACrC,MAAM,OAAO,CAAC,YAAY,CAAC;gBACzB,QAAQ,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE;gBAC9E,UAAU,EAAE,QAAQ;gBACpB,QAAQ,EAAE,IAAI;gBACd,QAAQ;aACT,CAAC,CAAA;YAEF,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAA;YAE1E,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC3B,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;YAChD,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAA;YACrC,MAAM,OAAO,CAAC,YAAY,CAAC;gBACzB,QAAQ,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE;gBAC9E,UAAU,EAAE,GAAG;gBACf,QAAQ,EAAE,KAAK;gBACf,QAAQ;aACT,CAAC,CAAA;YAEF,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAA;YAE3F,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC3B,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;YACrD,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAA;YAE7F,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC5B,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACzC,UAAU,CAAC,GAAG,EAAE;YACd,SAAS,GAAG,eAAe,CAAC,YAAY,CAAC,CAAA;QAC3C,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;YACvD,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAA;YACrC,MAAM,OAAO,CAAC,YAAY,CAAC;gBACzB,QAAQ,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE;gBAC9E,UAAU,EAAE,QAAQ;gBACpB,QAAQ,EAAE,IAAI;gBACd,QAAQ;aACT,CAAC,CAAA;YAEF,cAAc,GAAG,IAAI,cAAc,CAAC;gBAClC,SAAS,EAAE,cAAc;gBACzB,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE;aAC/B,CAAC,CAAA;YACF,cAAc,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAA;YAE1C,MAAM,QAAQ,CAAC,eAAe,CAAC,IAAI,gBAAgB,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;YAEhF,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC5D,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;YACnD,cAAc,GAAG,IAAI,cAAc,CAAC;gBAClC,SAAS,EAAE,aAAa;gBACxB,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE;aAC/B,CAAC,CAAA;YACF,cAAc,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAA;YAE1C,MAAM,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,gBAAgB,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,CAAA;QACjH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;QAC1C,UAAU,CAAC,GAAG,EAAE;YACd,SAAS,GAAG,eAAe,CAAC,YAAY,CAAC,CAAA;QAC3C,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;YAClE,cAAc,GAAG,IAAI,cAAc,CAAC;gBAClC,SAAS,EAAE,cAAc;gBACzB,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE;gBAC9B,YAAY,EAAE,SAAS;aACxB,CAAC,CAAA;YACF,cAAc,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAA;YAE1C,MAAM,QAAQ,CAAC,eAAe,CAAC,IAAI,iBAAiB,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;YAExF,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC;gBAC1C,QAAQ,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE;aAC/E,CAAC,CAAA;YACF,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAA;QACjC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;YAC7D,cAAc,GAAG,IAAI,cAAc,CAAC;gBAClC,SAAS,EAAE,cAAc;gBACzB,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE;gBAC9B,YAAY,EAAE,YAAY;aAC3B,CAAC,CAAA;YACF,cAAc,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAA;YAE1C,MAAM,QAAQ,CAAC,eAAe,CAAC,IAAI,iBAAiB,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;YAExF,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC;gBAC1C,QAAQ,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE;aAC/E,CAAC,CAAA;YACF,MAAM,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAA;QAC7B,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;QAC7C,UAAU,CAAC,GAAG,EAAE;YACd,SAAS,GAAG,eAAe,CAAC,YAAY,CAAC,CAAA;QAC3C,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;YACrE,cAAc,GAAG,IAAI,cAAc,CAAC;gBAClC,SAAS,EAAE,cAAc;gBACzB,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE;gBAC9B,YAAY,EAAE,YAAY;aAC3B,CAAC,CAAA;YACF,cAAc,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAA;YAC1C,MAAM,QAAQ,CAAC,eAAe,CAAC,IAAI,gBAAgB,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;YAEhF,MAAM,QAAQ,CAAC,eAAe,CAAC,IAAI,oBAAoB,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;YAEpF,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC;gBAC1C,QAAQ,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE;aAC/E,CAAC,CAAA;YACF,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAA;QACjC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;YAC1E,cAAc,GAAG,IAAI,cAAc,CAAC;gBAClC,SAAS,EAAE,cAAc;gBACzB,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE;gBAC9B,YAAY,EAAE,SAAS;aACxB,CAAC,CAAA;YACF,cAAc,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAA;YAC1C,MAAM,QAAQ,CAAC,eAAe,CAAC,IAAI,gBAAgB,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;YAEhF,MAAM,QAAQ,CAAC,eAAe,CAAC,IAAI,oBAAoB,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;YAEpF,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC;gBAC1C,QAAQ,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE;aAC/E,CAAC,CAAA;YACF,MAAM,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAA;QAC7B,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,UAAU,CAAC,GAAG,EAAE;YACd,SAAS,GAAG,eAAe,CAAC,YAAY,CAAC,CAAA;QAC3C,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;YACpE,cAAc,GAAG,IAAI,cAAc,CAAC;gBAClC,SAAS,EAAE,cAAc;gBACzB,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE;gBAC9B,YAAY,EAAE,SAAS;gBACvB,eAAe,EAAE,GAAG,EAAE,CAAC,IAAI;aAC5B,CAAC,CAAA;YACF,cAAc,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAA;YAC1C,MAAM,QAAQ,CAAC,eAAe,CAAC,IAAI,gBAAgB,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;YAEhF,MAAM,QAAQ,CAAC,eAAe,CAAC,IAAI,oBAAoB,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;YAEpF,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC;gBACxC,QAAQ,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE;aAC/E,CAAC,CAAA;YACF,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC5B,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;YAC7E,cAAc,GAAG,IAAI,cAAc,CAAC;gBAClC,SAAS,EAAE,cAAc;gBACzB,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE;gBAC9B,YAAY,EAAE,SAAS;gBACvB,eAAe,EAAE,GAAG,EAAE,CAAC,KAAK;aAC7B,CAAC,CAAA;YACF,cAAc,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAA;YAC1C,MAAM,QAAQ,CAAC,eAAe,CAAC,IAAI,gBAAgB,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;YAEhF,MAAM,QAAQ,CAAC,eAAe,CAAC,IAAI,oBAAoB,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;YAEpF,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC;gBACxC,QAAQ,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE;aAC/E,CAAC,CAAA;YACF,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC5B,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;YAC7C,MAAM,UAAU,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAA;YACrC,cAAc,GAAG,IAAI,cAAc,CAAC;gBAClC,SAAS,EAAE,cAAc;gBACzB,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE;gBAC9B,YAAY,EAAE,SAAS;gBACvB,eAAe,EAAE,UAAU;aAC5B,CAAC,CAAA;YACF,cAAc,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAA;YAC1C,MAAM,QAAQ,CAAC,eAAe,CAAC,IAAI,gBAAgB,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;YAEhF,MAAM,QAAQ,CAAC,eAAe,CAAC,IAAI,oBAAoB,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;YAEpF,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CACrC,MAAM,CAAC,gBAAgB,CAAC;gBACtB,SAAS,EAAE;oBACT,KAAK,EAAE,SAAS,CAAC,KAAK;oBACtB,QAAQ,EAAE,SAAS,CAAC,QAAQ;iBAC7B;aACF,CAAC,CACH,CAAA;QACH,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;YAClE,cAAc,GAAG,IAAI,cAAc,CAAC;gBAClC,SAAS,EAAE,cAAc;gBACzB,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE;gBAC9B,YAAY,EAAE,SAAS;gBACvB,eAAe,EAAE,GAAG,EAAE,CAAC,IAAI;aAC5B,CAAC,CAAA;YACF,cAAc,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAA;YAC1C,MAAM,QAAQ,CAAC,eAAe,CAAC,IAAI,gBAAgB,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;YAEhF,MAAM,QAAQ,CAAC,eAAe,CAAC,IAAI,oBAAoB,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;YAEpF,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC;gBACjD,QAAQ,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE;aAC/E,CAAC,CAAA;YACF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC;gBACxC,QAAQ,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE;aAC/E,CAAC,CAAA;YAEF,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACnC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAA;QAC/B,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;YAC5D,cAAc,GAAG,IAAI,cAAc,CAAC;gBAClC,SAAS,EAAE,cAAc;gBACzB,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE;gBAC9B,YAAY,EAAE,SAAS;gBACvB,eAAe,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC;aACnE,CAAC,CAAA;YACF,cAAc,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAA;YAC1C,MAAM,QAAQ,CAAC,eAAe,CAAC,IAAI,gBAAgB,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;YAEhF,MAAM,QAAQ,CAAC,eAAe,CAAC,IAAI,oBAAoB,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;YACpF,IAAI,GAAG,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC;gBACtC,QAAQ,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE;aAC/E,CAAC,CAAA;YACF,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA,CAAC,2BAA2B;YAEtD,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,CAAA;YACnD,MAAM,QAAQ,CAAC,eAAe,CAAC,IAAI,oBAAoB,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;YACpF,GAAG,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC;gBAClC,QAAQ,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE;aAC/E,CAAC,CAAA;YACF,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA,CAAC,8BAA8B;QAC3D,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;YAC1D,cAAc,GAAG,IAAI,cAAc,CAAC;gBAClC,SAAS,EAAE,cAAc;gBACzB,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE;gBAC9B,YAAY,EAAE,SAAS;gBACvB,eAAe,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAE,SAAS,CAAC,KAAa,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,IAAI;aACxF,CAAC,CAAA;YACF,cAAc,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAA;YAC1C,MAAM,QAAQ,CAAC,eAAe,CAAC,IAAI,gBAAgB,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;YAEhF,MAAM,QAAQ,CAAC,eAAe,CAAC,IAAI,oBAAoB,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;YACpF,IAAI,GAAG,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC;gBACtC,QAAQ,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE;aAC/E,CAAC,CAAA;YACF,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA,CAAC,8BAA8B;YAEzD,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,CAAA;YACvC,MAAM,QAAQ,CAAC,eAAe,CAAC,IAAI,oBAAoB,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;YACpF,GAAG,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC;gBAClC,QAAQ,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE;aAC/E,CAAC,CAAA;YACF,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA,CAAC,6BAA6B;QAC1D,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;YAClD,cAAc,GAAG,IAAI,cAAc,CAAC;gBAClC,SAAS,EAAE,gBAAgB;gBAC3B,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE;gBAC9B,YAAY,EAAE,YAAY;gBAC1B,eAAe,EAAE,GAAG,EAAE,CAAC,IAAI;aAC5B,CAAC,CAAA;YACF,cAAc,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAA;YAE1C,MAAM,QAAQ,CAAC,eAAe,CAAC,IAAI,gBAAgB,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;YAChF,MAAM,QAAQ,CAAC,eAAe,CAAC,IAAI,oBAAoB,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;YACpF,MAAM,QAAQ,CAAC,eAAe,CAAC,IAAI,oBAAoB,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;YACpF,MAAM,QAAQ,CAAC,eAAe,CAAC,IAAI,oBAAoB,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;YAEpF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC;gBACxC,QAAQ,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE;aAC9E,CAAC,CAAA;YACF,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC;gBACjD,QAAQ,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE;aAC9E,CAAC,CAAA;YAEF,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAA;YAC7B,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACrC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YACzD,2EAA2E;YAC3E,cAAc,GAAG,IAAI,cAAc,CAAC;gBAClC,SAAS,EAAE,aAAa;gBACxB,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE;gBAC9B,YAAY,EAAE,SAAS;gBACvB,eAAe,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;aACpE,CAAC,CAAA;YACF,cAAc,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAA;YAC1C,MAAM,QAAQ,CAAC,eAAe,CAAC,IAAI,gBAAgB,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;YAChF,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,CAAA;YACnD,MAAM,QAAQ,CAAC,eAAe,CAAC,IAAI,oBAAoB,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;YAEpF,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC;gBACxC,QAAQ,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE;aAC3E,CAAC,CAAA;YACF,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAE1B,6CAA6C;YAC7C,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAA;YAClC,MAAM,iBAAiB,GAAG,IAAI,cAAc,CAAC;gBAC3C,SAAS,EAAE,aAAa;gBACxB,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE;gBAC9B,YAAY,EAAE,YAAY;aAC3B,CAAC,CAAA;YACF,MAAM,WAAW,GAAG,IAAI,YAAY,EAAE,CAAA;YACtC,iBAAiB,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAA;YAChD,MAAM,WAAW,CAAC,eAAe,CAAC,IAAI,gBAAgB,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YAClF,MAAM,iBAAiB,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC,CAAE,EAAE,CAAC,CAAA;YAElF,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;QACvD,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,6CAA6C,EAAE,GAAG,EAAE;QAC3D,UAAU,CAAC,GAAG,EAAE;YACd,SAAS,GAAG,eAAe,CAAC,YAAY,CAAC,CAAA;QAC3C,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;YACzF,cAAc,GAAG,IAAI,cAAc,CAAC;gBAClC,SAAS,EAAE,cAAc;gBACzB,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE;gBAC9B,YAAY,EAAE,SAAS;aACxB,CAAC,CAAA;YACF,cAAc,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAA;YAE1C,MAAM,gBAAgB,GAAG,IAAI,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,IAAI,SAAS,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAA;YACjG,MAAM,KAAK,GAAG;gBACZ,KAAK,EAAE,SAAS;gBAChB,QAAQ,EAAE;oBACR,OAAO,EAAE,gBAAgB;oBACzB,UAAU,EAAE,SAAkB;oBAC9B,SAAS,EAAE;wBACT,WAAW,EAAE,wBAAwB;qBACtC;iBACF;aACK,CAAA;YAER,MAAM,QAAQ,CAAC,eAAe,CAAC,IAAI,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAA;YAE9D,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC;gBAC1C,QAAQ,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE;aAC/E,CAAC,CAAA;YACF,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAA;QACjC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;YACpF,cAAc,GAAG,IAAI,cAAc,CAAC;gBAClC,SAAS,EAAE,cAAc;gBACzB,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE;gBAC9B,YAAY,EAAE,SAAS;aACxB,CAAC,CAAA;YACF,cAAc,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAA;YAE1C,MAAM,gBAAgB,GAAG,IAAI,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,IAAI,SAAS,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAA;YACjG,MAAM,KAAK,GAAG;gBACZ,KAAK,EAAE,SAAS;gBAChB,QAAQ,EAAE;oBACR,OAAO,EAAE,gBAAgB;oBACzB,UAAU,EAAE,SAAkB;iBAC/B;aACK,CAAA;YAER,MAAM,QAAQ,CAAC,eAAe,CAAC,IAAI,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAA;YAE9D,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC;gBAC1C,QAAQ,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE;aAC/E,CAAC,CAAA;YACF,MAAM,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAA;QAC7B,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;YAC7D,cAAc,GAAG,IAAI,cAAc,CAAC;gBAClC,SAAS,EAAE,cAAc;gBACzB,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE;gBAC9B,YAAY,EAAE,YAAY;aAC3B,CAAC,CAAA;YACF,cAAc,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAA;YAE1C,MAAM,gBAAgB,GAAG,IAAI,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,IAAI,SAAS,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAA;YACjG,MAAM,KAAK,GAAG;gBACZ,KAAK,EAAE,SAAS;gBAChB,QAAQ,EAAE;oBACR,OAAO,EAAE,gBAAgB;oBACzB,UAAU,EAAE,SAAkB;oBAC9B,SAAS,EAAE;wBACT,WAAW,EAAE,wBAAwB;qBACtC;iBACF;aACK,CAAA;YAER,MAAM,QAAQ,CAAC,eAAe,CAAC,IAAI,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAA;YAE9D,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC;gBAC1C,QAAQ,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE;aAC/E,CAAC,CAAA;YACF,MAAM,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAA;QAC7B,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -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"}