@snoglobe/helios 0.3.5 → 0.4.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 (331) hide show
  1. package/dist/__tests__/db-helper.d.ts +8 -0
  2. package/dist/__tests__/db-helper.d.ts.map +1 -0
  3. package/dist/__tests__/db-helper.js +15 -0
  4. package/dist/__tests__/db-helper.js.map +1 -0
  5. package/dist/config/project.test.d.ts +2 -0
  6. package/dist/config/project.test.d.ts.map +1 -0
  7. package/dist/config/project.test.js +219 -0
  8. package/dist/config/project.test.js.map +1 -0
  9. package/dist/core/orchestrator-integration.test.d.ts +2 -0
  10. package/dist/core/orchestrator-integration.test.d.ts.map +1 -0
  11. package/dist/core/orchestrator-integration.test.js +674 -0
  12. package/dist/core/orchestrator-integration.test.js.map +1 -0
  13. package/dist/core/orchestrator.d.ts +3 -1
  14. package/dist/core/orchestrator.d.ts.map +1 -1
  15. package/dist/core/orchestrator.js +98 -53
  16. package/dist/core/orchestrator.js.map +1 -1
  17. package/dist/core/orchestrator.test.d.ts +2 -0
  18. package/dist/core/orchestrator.test.d.ts.map +1 -0
  19. package/dist/core/orchestrator.test.js +982 -0
  20. package/dist/core/orchestrator.test.js.map +1 -0
  21. package/dist/core/state-machine.d.ts.map +1 -1
  22. package/dist/core/state-machine.js +3 -0
  23. package/dist/core/state-machine.js.map +1 -1
  24. package/dist/core/state-machine.test.d.ts +2 -0
  25. package/dist/core/state-machine.test.d.ts.map +1 -0
  26. package/dist/core/state-machine.test.js +95 -0
  27. package/dist/core/state-machine.test.js.map +1 -0
  28. package/dist/core/stickies.d.ts.map +1 -1
  29. package/dist/core/stickies.js +3 -0
  30. package/dist/core/stickies.js.map +1 -1
  31. package/dist/core/stickies.test.d.ts +2 -0
  32. package/dist/core/stickies.test.d.ts.map +1 -0
  33. package/dist/core/stickies.test.js +63 -0
  34. package/dist/core/stickies.test.js.map +1 -0
  35. package/dist/core/task-poller.d.ts.map +1 -1
  36. package/dist/core/task-poller.js +2 -1
  37. package/dist/core/task-poller.js.map +1 -1
  38. package/dist/init.d.ts +2 -0
  39. package/dist/init.d.ts.map +1 -1
  40. package/dist/init.js +19 -0
  41. package/dist/init.js.map +1 -1
  42. package/dist/memory/context-gate.test.d.ts +2 -0
  43. package/dist/memory/context-gate.test.d.ts.map +1 -0
  44. package/dist/memory/context-gate.test.js +318 -0
  45. package/dist/memory/context-gate.test.js.map +1 -0
  46. package/dist/memory/experiment-tracker.test.d.ts +2 -0
  47. package/dist/memory/experiment-tracker.test.d.ts.map +1 -0
  48. package/dist/memory/experiment-tracker.test.js +325 -0
  49. package/dist/memory/experiment-tracker.test.js.map +1 -0
  50. package/dist/memory/memory-store.d.ts +2 -0
  51. package/dist/memory/memory-store.d.ts.map +1 -1
  52. package/dist/memory/memory-store.js +35 -28
  53. package/dist/memory/memory-store.js.map +1 -1
  54. package/dist/memory/memory-store.test.d.ts +2 -0
  55. package/dist/memory/memory-store.test.d.ts.map +1 -0
  56. package/dist/memory/memory-store.test.js +144 -0
  57. package/dist/memory/memory-store.test.js.map +1 -0
  58. package/dist/memory/token-estimator.test.d.ts +2 -0
  59. package/dist/memory/token-estimator.test.d.ts.map +1 -0
  60. package/dist/memory/token-estimator.test.js +42 -0
  61. package/dist/memory/token-estimator.test.js.map +1 -0
  62. package/dist/metrics/analyzer.test.d.ts +2 -0
  63. package/dist/metrics/analyzer.test.d.ts.map +1 -0
  64. package/dist/metrics/analyzer.test.js +65 -0
  65. package/dist/metrics/analyzer.test.js.map +1 -0
  66. package/dist/metrics/parser.test.d.ts +2 -0
  67. package/dist/metrics/parser.test.d.ts.map +1 -0
  68. package/dist/metrics/parser.test.js +106 -0
  69. package/dist/metrics/parser.test.js.map +1 -0
  70. package/dist/metrics/store.d.ts +2 -0
  71. package/dist/metrics/store.d.ts.map +1 -1
  72. package/dist/metrics/store.js +26 -50
  73. package/dist/metrics/store.js.map +1 -1
  74. package/dist/metrics/store.test.d.ts +2 -0
  75. package/dist/metrics/store.test.d.ts.map +1 -0
  76. package/dist/metrics/store.test.js +148 -0
  77. package/dist/metrics/store.test.js.map +1 -0
  78. package/dist/paths.js +5 -5
  79. package/dist/paths.js.map +1 -1
  80. package/dist/providers/auth/auth-manager.d.ts +1 -0
  81. package/dist/providers/auth/auth-manager.d.ts.map +1 -1
  82. package/dist/providers/auth/auth-manager.js +8 -1
  83. package/dist/providers/auth/auth-manager.js.map +1 -1
  84. package/dist/providers/auth/auth-manager.test.d.ts +2 -0
  85. package/dist/providers/auth/auth-manager.test.d.ts.map +1 -0
  86. package/dist/providers/auth/auth-manager.test.js +364 -0
  87. package/dist/providers/auth/auth-manager.test.js.map +1 -0
  88. package/dist/providers/auth/token-store.js +2 -2
  89. package/dist/providers/auth/token-store.js.map +1 -1
  90. package/dist/providers/claude/history.test.d.ts +2 -0
  91. package/dist/providers/claude/history.test.d.ts.map +1 -0
  92. package/dist/providers/claude/history.test.js +755 -0
  93. package/dist/providers/claude/history.test.js.map +1 -0
  94. package/dist/providers/claude/provider.d.ts +4 -2
  95. package/dist/providers/claude/provider.d.ts.map +1 -1
  96. package/dist/providers/claude/provider.js +44 -22
  97. package/dist/providers/claude/provider.js.map +1 -1
  98. package/dist/providers/claude/provider.test.d.ts +2 -0
  99. package/dist/providers/claude/provider.test.d.ts.map +1 -0
  100. package/dist/providers/claude/provider.test.js +1167 -0
  101. package/dist/providers/claude/provider.test.js.map +1 -0
  102. package/dist/providers/openai/history.test.d.ts +2 -0
  103. package/dist/providers/openai/history.test.d.ts.map +1 -0
  104. package/dist/providers/openai/history.test.js +655 -0
  105. package/dist/providers/openai/history.test.js.map +1 -0
  106. package/dist/providers/openai/provider.d.ts +3 -2
  107. package/dist/providers/openai/provider.d.ts.map +1 -1
  108. package/dist/providers/openai/provider.js +18 -11
  109. package/dist/providers/openai/provider.js.map +1 -1
  110. package/dist/providers/openai/provider.test.d.ts +2 -0
  111. package/dist/providers/openai/provider.test.d.ts.map +1 -0
  112. package/dist/providers/openai/provider.test.js +1089 -0
  113. package/dist/providers/openai/provider.test.js.map +1 -0
  114. package/dist/providers/retry.test.d.ts +2 -0
  115. package/dist/providers/retry.test.d.ts.map +1 -0
  116. package/dist/providers/retry.test.js +194 -0
  117. package/dist/providers/retry.test.js.map +1 -0
  118. package/dist/providers/sse.d.ts +1 -0
  119. package/dist/providers/sse.d.ts.map +1 -1
  120. package/dist/providers/sse.js +29 -20
  121. package/dist/providers/sse.js.map +1 -1
  122. package/dist/providers/sse.test.d.ts +2 -0
  123. package/dist/providers/sse.test.d.ts.map +1 -0
  124. package/dist/providers/sse.test.js +79 -0
  125. package/dist/providers/sse.test.js.map +1 -0
  126. package/dist/providers/types.d.ts +1 -1
  127. package/dist/providers/types.d.ts.map +1 -1
  128. package/dist/providers/types.test.d.ts +2 -0
  129. package/dist/providers/types.test.d.ts.map +1 -0
  130. package/dist/providers/types.test.js +112 -0
  131. package/dist/providers/types.test.js.map +1 -0
  132. package/dist/remote/connection-pool.d.ts.map +1 -1
  133. package/dist/remote/connection-pool.js +24 -3
  134. package/dist/remote/connection-pool.js.map +1 -1
  135. package/dist/remote/file-sync.d.ts.map +1 -1
  136. package/dist/remote/file-sync.js +4 -3
  137. package/dist/remote/file-sync.js.map +1 -1
  138. package/dist/scheduler/sleep-manager.d.ts.map +1 -1
  139. package/dist/scheduler/sleep-manager.js +8 -1
  140. package/dist/scheduler/sleep-manager.js.map +1 -1
  141. package/dist/scheduler/sleep-manager.test.d.ts +2 -0
  142. package/dist/scheduler/sleep-manager.test.d.ts.map +1 -0
  143. package/dist/scheduler/sleep-manager.test.js +491 -0
  144. package/dist/scheduler/sleep-manager.test.js.map +1 -0
  145. package/dist/scheduler/ssh-batcher.d.ts.map +1 -1
  146. package/dist/scheduler/ssh-batcher.js +6 -4
  147. package/dist/scheduler/ssh-batcher.js.map +1 -1
  148. package/dist/scheduler/ssh-batcher.test.d.ts +2 -0
  149. package/dist/scheduler/ssh-batcher.test.d.ts.map +1 -0
  150. package/dist/scheduler/ssh-batcher.test.js +76 -0
  151. package/dist/scheduler/ssh-batcher.test.js.map +1 -0
  152. package/dist/scheduler/state-store.d.ts.map +1 -1
  153. package/dist/scheduler/state-store.js +1 -2
  154. package/dist/scheduler/state-store.js.map +1 -1
  155. package/dist/scheduler/trigger-scheduler.d.ts.map +1 -1
  156. package/dist/scheduler/trigger-scheduler.js +59 -36
  157. package/dist/scheduler/trigger-scheduler.js.map +1 -1
  158. package/dist/scheduler/trigger-scheduler.test.d.ts +2 -0
  159. package/dist/scheduler/trigger-scheduler.test.d.ts.map +1 -0
  160. package/dist/scheduler/trigger-scheduler.test.js +483 -0
  161. package/dist/scheduler/trigger-scheduler.test.js.map +1 -0
  162. package/dist/scheduler/triggers/file.d.ts.map +1 -1
  163. package/dist/scheduler/triggers/file.js +12 -3
  164. package/dist/scheduler/triggers/file.js.map +1 -1
  165. package/dist/scheduler/triggers/file.test.d.ts +2 -0
  166. package/dist/scheduler/triggers/file.test.d.ts.map +1 -0
  167. package/dist/scheduler/triggers/file.test.js +294 -0
  168. package/dist/scheduler/triggers/file.test.js.map +1 -0
  169. package/dist/scheduler/triggers/metric.d.ts +3 -1
  170. package/dist/scheduler/triggers/metric.d.ts.map +1 -1
  171. package/dist/scheduler/triggers/metric.js +12 -8
  172. package/dist/scheduler/triggers/metric.js.map +1 -1
  173. package/dist/scheduler/triggers/metric.test.d.ts +2 -0
  174. package/dist/scheduler/triggers/metric.test.d.ts.map +1 -0
  175. package/dist/scheduler/triggers/metric.test.js +533 -0
  176. package/dist/scheduler/triggers/metric.test.js.map +1 -0
  177. package/dist/scheduler/triggers/process-exit.d.ts.map +1 -1
  178. package/dist/scheduler/triggers/process-exit.js +2 -1
  179. package/dist/scheduler/triggers/process-exit.js.map +1 -1
  180. package/dist/scheduler/triggers/process-exit.test.d.ts +2 -0
  181. package/dist/scheduler/triggers/process-exit.test.d.ts.map +1 -0
  182. package/dist/scheduler/triggers/process-exit.test.js +118 -0
  183. package/dist/scheduler/triggers/process-exit.test.js.map +1 -0
  184. package/dist/scheduler/triggers/resource.d.ts.map +1 -1
  185. package/dist/scheduler/triggers/resource.js +2 -10
  186. package/dist/scheduler/triggers/resource.js.map +1 -1
  187. package/dist/scheduler/triggers/resource.test.d.ts +2 -0
  188. package/dist/scheduler/triggers/resource.test.d.ts.map +1 -0
  189. package/dist/scheduler/triggers/resource.test.js +225 -0
  190. package/dist/scheduler/triggers/resource.test.js.map +1 -0
  191. package/dist/scheduler/triggers/timer.test.d.ts +2 -0
  192. package/dist/scheduler/triggers/timer.test.d.ts.map +1 -0
  193. package/dist/scheduler/triggers/timer.test.js +56 -0
  194. package/dist/scheduler/triggers/timer.test.js.map +1 -0
  195. package/dist/scheduler/triggers/types.d.ts +4 -2
  196. package/dist/scheduler/triggers/types.d.ts.map +1 -1
  197. package/dist/scheduler/triggers/types.js +0 -1
  198. package/dist/scheduler/triggers/types.js.map +1 -1
  199. package/dist/skills/executor.d.ts.map +1 -1
  200. package/dist/skills/executor.js +13 -15
  201. package/dist/skills/executor.js.map +1 -1
  202. package/dist/store/database.d.ts +5 -0
  203. package/dist/store/database.d.ts.map +1 -1
  204. package/dist/store/database.js +17 -1
  205. package/dist/store/database.js.map +1 -1
  206. package/dist/store/migrations.test.d.ts +2 -0
  207. package/dist/store/migrations.test.d.ts.map +1 -0
  208. package/dist/store/migrations.test.js +278 -0
  209. package/dist/store/migrations.test.js.map +1 -0
  210. package/dist/store/session-store-edge.test.d.ts +2 -0
  211. package/dist/store/session-store-edge.test.d.ts.map +1 -0
  212. package/dist/store/session-store-edge.test.js +522 -0
  213. package/dist/store/session-store-edge.test.js.map +1 -0
  214. package/dist/store/session-store.d.ts +7 -0
  215. package/dist/store/session-store.d.ts.map +1 -1
  216. package/dist/store/session-store.js +27 -22
  217. package/dist/store/session-store.js.map +1 -1
  218. package/dist/store/session-store.test.d.ts +2 -0
  219. package/dist/store/session-store.test.d.ts.map +1 -0
  220. package/dist/store/session-store.test.js +125 -0
  221. package/dist/store/session-store.test.js.map +1 -0
  222. package/dist/subagent/executor.d.ts +21 -0
  223. package/dist/subagent/executor.d.ts.map +1 -0
  224. package/dist/subagent/executor.js +136 -0
  225. package/dist/subagent/executor.js.map +1 -0
  226. package/dist/subagent/manager.d.ts +20 -0
  227. package/dist/subagent/manager.d.ts.map +1 -0
  228. package/dist/subagent/manager.js +98 -0
  229. package/dist/subagent/manager.js.map +1 -0
  230. package/dist/subagent/scoped-memory.d.ts +28 -0
  231. package/dist/subagent/scoped-memory.d.ts.map +1 -0
  232. package/dist/subagent/scoped-memory.js +122 -0
  233. package/dist/subagent/scoped-memory.js.map +1 -0
  234. package/dist/subagent/types.d.ts +27 -0
  235. package/dist/subagent/types.d.ts.map +1 -0
  236. package/dist/subagent/types.js +2 -0
  237. package/dist/subagent/types.js.map +1 -0
  238. package/dist/tools/file-ops.d.ts.map +1 -1
  239. package/dist/tools/file-ops.js +23 -13
  240. package/dist/tools/file-ops.js.map +1 -1
  241. package/dist/tools/file-ops.test.d.ts +2 -0
  242. package/dist/tools/file-ops.test.d.ts.map +1 -0
  243. package/dist/tools/file-ops.test.js +656 -0
  244. package/dist/tools/file-ops.test.js.map +1 -0
  245. package/dist/tools/memory-tools.test.d.ts +2 -0
  246. package/dist/tools/memory-tools.test.d.ts.map +1 -0
  247. package/dist/tools/memory-tools.test.js +273 -0
  248. package/dist/tools/memory-tools.test.js.map +1 -0
  249. package/dist/tools/subagent.d.ts +10 -0
  250. package/dist/tools/subagent.d.ts.map +1 -0
  251. package/dist/tools/subagent.js +164 -0
  252. package/dist/tools/subagent.js.map +1 -0
  253. package/dist/tools/task-output.d.ts.map +1 -1
  254. package/dist/tools/task-output.js +13 -2
  255. package/dist/tools/task-output.js.map +1 -1
  256. package/dist/ui/components/input-bar.d.ts +1 -1
  257. package/dist/ui/components/input-bar.d.ts.map +1 -1
  258. package/dist/ui/components/input-bar.js +3 -3
  259. package/dist/ui/components/input-bar.js.map +1 -1
  260. package/dist/ui/components/input-bar.test.d.ts +2 -0
  261. package/dist/ui/components/input-bar.test.d.ts.map +1 -0
  262. package/dist/ui/components/input-bar.test.js +380 -0
  263. package/dist/ui/components/input-bar.test.js.map +1 -0
  264. package/dist/ui/components/key-hint-rule.d.ts +2 -1
  265. package/dist/ui/components/key-hint-rule.d.ts.map +1 -1
  266. package/dist/ui/components/key-hint-rule.js +3 -3
  267. package/dist/ui/components/key-hint-rule.js.map +1 -1
  268. package/dist/ui/components/status-bar.d.ts +1 -1
  269. package/dist/ui/components/status-bar.d.ts.map +1 -1
  270. package/dist/ui/components/status-bar.js +11 -10
  271. package/dist/ui/components/status-bar.js.map +1 -1
  272. package/dist/ui/components/status-bar.test.d.ts +2 -0
  273. package/dist/ui/components/status-bar.test.d.ts.map +1 -0
  274. package/dist/ui/components/status-bar.test.js +206 -0
  275. package/dist/ui/components/status-bar.test.js.map +1 -0
  276. package/dist/ui/format.d.ts +9 -0
  277. package/dist/ui/format.d.ts.map +1 -1
  278. package/dist/ui/format.js +21 -0
  279. package/dist/ui/format.js.map +1 -1
  280. package/dist/ui/format.test.d.ts +2 -0
  281. package/dist/ui/format.test.d.ts.map +1 -0
  282. package/dist/ui/format.test.js +122 -0
  283. package/dist/ui/format.test.js.map +1 -0
  284. package/dist/ui/layout.d.ts.map +1 -1
  285. package/dist/ui/layout.js +74 -12
  286. package/dist/ui/layout.js.map +1 -1
  287. package/dist/ui/markdown.test.d.ts +2 -0
  288. package/dist/ui/markdown.test.d.ts.map +1 -0
  289. package/dist/ui/markdown.test.js +133 -0
  290. package/dist/ui/markdown.test.js.map +1 -0
  291. package/dist/ui/mouse-filter.test.d.ts +2 -0
  292. package/dist/ui/mouse-filter.test.d.ts.map +1 -0
  293. package/dist/ui/mouse-filter.test.js +231 -0
  294. package/dist/ui/mouse-filter.test.js.map +1 -0
  295. package/dist/ui/overlays/metrics-overlay.test.d.ts +2 -0
  296. package/dist/ui/overlays/metrics-overlay.test.d.ts.map +1 -0
  297. package/dist/ui/overlays/metrics-overlay.test.js +248 -0
  298. package/dist/ui/overlays/metrics-overlay.test.js.map +1 -0
  299. package/dist/ui/overlays/task-overlay.test.d.ts +2 -0
  300. package/dist/ui/overlays/task-overlay.test.d.ts.map +1 -0
  301. package/dist/ui/overlays/task-overlay.test.js +238 -0
  302. package/dist/ui/overlays/task-overlay.test.js.map +1 -0
  303. package/dist/ui/panels/conversation.d.ts.map +1 -1
  304. package/dist/ui/panels/conversation.js +60 -5
  305. package/dist/ui/panels/conversation.js.map +1 -1
  306. package/dist/ui/panels/conversation.test.d.ts +2 -0
  307. package/dist/ui/panels/conversation.test.d.ts.map +1 -0
  308. package/dist/ui/panels/conversation.test.js +381 -0
  309. package/dist/ui/panels/conversation.test.js.map +1 -0
  310. package/dist/ui/panels/metrics-dashboard.test.d.ts +2 -0
  311. package/dist/ui/panels/metrics-dashboard.test.d.ts.map +1 -0
  312. package/dist/ui/panels/metrics-dashboard.test.js +191 -0
  313. package/dist/ui/panels/metrics-dashboard.test.js.map +1 -0
  314. package/dist/ui/panels/sleep-panel.test.d.ts +2 -0
  315. package/dist/ui/panels/sleep-panel.test.d.ts.map +1 -0
  316. package/dist/ui/panels/sleep-panel.test.js +376 -0
  317. package/dist/ui/panels/sleep-panel.test.js.map +1 -0
  318. package/dist/ui/panels/task-list.d.ts.map +1 -1
  319. package/dist/ui/panels/task-list.js +3 -2
  320. package/dist/ui/panels/task-list.js.map +1 -1
  321. package/dist/ui/panels/task-list.test.d.ts +2 -0
  322. package/dist/ui/panels/task-list.test.d.ts.map +1 -0
  323. package/dist/ui/panels/task-list.test.js +210 -0
  324. package/dist/ui/panels/task-list.test.js.map +1 -0
  325. package/dist/ui/theme.test.d.ts +2 -0
  326. package/dist/ui/theme.test.d.ts.map +1 -0
  327. package/dist/ui/theme.test.js +159 -0
  328. package/dist/ui/theme.test.js.map +1 -0
  329. package/dist/ui/types.d.ts +3 -0
  330. package/dist/ui/types.d.ts.map +1 -1
  331. package/package.json +6 -2
@@ -0,0 +1,522 @@
1
+ import { describe, it, expect, beforeEach, vi } from "vitest";
2
+ import { createTestDb } from "../__tests__/db-helper.js";
3
+ const mockDb = { current: createTestDb() };
4
+ vi.mock("./database.js", () => {
5
+ const getDb = () => mockDb.current;
6
+ class StmtCache {
7
+ cache = new Map();
8
+ stmt(sql) {
9
+ let s = this.cache.get(sql);
10
+ if (!s) {
11
+ s = getDb().prepare(sql);
12
+ this.cache.set(sql, s);
13
+ }
14
+ return s;
15
+ }
16
+ }
17
+ return { getDb, StmtCache, getHeliosDir: () => "/tmp/helios-test" };
18
+ });
19
+ const { SessionStore, createEphemeralSession } = await import("./session-store.js");
20
+ describe("SessionStore — Edge Cases", () => {
21
+ beforeEach(() => {
22
+ mockDb.current = createTestDb();
23
+ });
24
+ // =======================================================================
25
+ // Large / Complex Message Content
26
+ // =======================================================================
27
+ describe("Large / Complex Message Content", () => {
28
+ it("large message content (10KB+) stores and retrieves correctly", () => {
29
+ const store = new SessionStore("agent1");
30
+ const session = store.createSession("claude", "opus");
31
+ const largeContent = "x".repeat(10_240);
32
+ store.addMessage(session.id, "user", largeContent);
33
+ const messages = store.getMessages(session.id);
34
+ expect(messages).toHaveLength(1);
35
+ expect(messages[0].content).toBe(largeContent);
36
+ expect(messages[0].content.length).toBe(10_240);
37
+ });
38
+ it("very large message content (100KB+) stores and retrieves correctly", () => {
39
+ const store = new SessionStore("agent1");
40
+ const session = store.createSession("claude", "opus");
41
+ const hugeContent = "y".repeat(102_400);
42
+ store.addMessage(session.id, "user", hugeContent);
43
+ const messages = store.getMessages(session.id);
44
+ expect(messages[0].content.length).toBe(102_400);
45
+ });
46
+ it("message with tool_calls JSON stores/retrieves", () => {
47
+ const store = new SessionStore("agent1");
48
+ const session = store.createSession("claude", "opus");
49
+ const toolCalls = JSON.stringify([
50
+ { id: "tc-1", name: "remote_exec", args: { command: "ls" } },
51
+ { id: "tc-2", name: "file_read", args: { path: "/tmp/data.csv" } },
52
+ ]);
53
+ store.addMessage(session.id, "assistant", "Let me check", toolCalls);
54
+ const messages = store.getMessages(session.id);
55
+ expect(messages[0].toolCalls).toBe(toolCalls);
56
+ const parsed = JSON.parse(messages[0].toolCalls);
57
+ expect(parsed).toHaveLength(2);
58
+ expect(parsed[0].name).toBe("remote_exec");
59
+ });
60
+ it("message with token_count stores/retrieves", () => {
61
+ const store = new SessionStore("agent1");
62
+ const session = store.createSession("claude", "opus");
63
+ store.addMessage(session.id, "user", "Hello", undefined, 42);
64
+ const messages = store.getMessages(session.id);
65
+ expect(messages[0].tokenCount).toBe(42);
66
+ });
67
+ it("message with unicode content stores/retrieves", () => {
68
+ const store = new SessionStore("agent1");
69
+ const session = store.createSession("claude", "opus");
70
+ const unicode = "Hello \u{1F600} \u{1F680} \u{4E16}\u{754C}";
71
+ store.addMessage(session.id, "user", unicode);
72
+ const messages = store.getMessages(session.id);
73
+ expect(messages[0].content).toBe(unicode);
74
+ });
75
+ it("message with newlines and special chars stores correctly", () => {
76
+ const store = new SessionStore("agent1");
77
+ const session = store.createSession("claude", "opus");
78
+ const content = "Line 1\nLine 2\tTabbed\r\nWindows line\0Null char";
79
+ store.addMessage(session.id, "user", content);
80
+ const messages = store.getMessages(session.id);
81
+ expect(messages[0].content).toBe(content);
82
+ });
83
+ });
84
+ // =======================================================================
85
+ // Many Messages
86
+ // =======================================================================
87
+ describe("Many Messages", () => {
88
+ it("500+ messages for single session stores and retrieves", () => {
89
+ const store = new SessionStore("agent1");
90
+ const session = store.createSession("claude", "opus");
91
+ for (let i = 0; i < 500; i++) {
92
+ store.addMessage(session.id, i % 2 === 0 ? "user" : "assistant", `Message ${i}`);
93
+ }
94
+ // Default limit is 100
95
+ const defaultMessages = store.getMessages(session.id);
96
+ expect(defaultMessages).toHaveLength(100);
97
+ // With higher limit
98
+ const allMessages = store.getMessages(session.id, 600);
99
+ expect(allMessages).toHaveLength(500);
100
+ });
101
+ it("getMessages with limit returns most recent (ORDER BY ASC LIMIT)", () => {
102
+ const store = new SessionStore("agent1");
103
+ const session = store.createSession("claude", "opus");
104
+ for (let i = 0; i < 20; i++) {
105
+ store.addMessage(session.id, "user", `msg-${i}`);
106
+ }
107
+ const limited = store.getMessages(session.id, 5);
108
+ expect(limited).toHaveLength(5);
109
+ // ORDER BY timestamp ASC LIMIT 5 means we get the FIRST 5
110
+ expect(limited[0].content).toBe("msg-0");
111
+ expect(limited[4].content).toBe("msg-4");
112
+ });
113
+ it("getMessages without explicit limit returns up to 100", () => {
114
+ const store = new SessionStore("agent1");
115
+ const session = store.createSession("claude", "opus");
116
+ for (let i = 0; i < 150; i++) {
117
+ store.addMessage(session.id, "user", `msg-${i}`);
118
+ }
119
+ const messages = store.getMessages(session.id);
120
+ expect(messages).toHaveLength(100);
121
+ });
122
+ it("multiple sessions: messages are isolated", () => {
123
+ const store = new SessionStore("agent1");
124
+ const s1 = store.createSession("claude");
125
+ const s2 = store.createSession("openai");
126
+ store.addMessage(s1.id, "user", "S1 msg");
127
+ store.addMessage(s2.id, "user", "S2 msg");
128
+ const m1 = store.getMessages(s1.id);
129
+ const m2 = store.getMessages(s2.id);
130
+ expect(m1).toHaveLength(1);
131
+ expect(m1[0].content).toBe("S1 msg");
132
+ expect(m2).toHaveLength(1);
133
+ expect(m2[0].content).toBe("S2 msg");
134
+ });
135
+ });
136
+ // =======================================================================
137
+ // Cost Edge Cases
138
+ // =======================================================================
139
+ describe("Cost Edge Cases", () => {
140
+ it("addCost with zero values", () => {
141
+ const store = new SessionStore("agent1");
142
+ const session = store.createSession("claude", "opus");
143
+ store.addMessage(session.id, "user", "test");
144
+ store.addCost(session.id, 0, 0, 0);
145
+ const summaries = store.listSessionSummaries();
146
+ expect(summaries[0].costUsd).toBe(0);
147
+ expect(summaries[0].inputTokens).toBe(0);
148
+ expect(summaries[0].outputTokens).toBe(0);
149
+ });
150
+ it("addCost with very small values (floating point)", () => {
151
+ const store = new SessionStore("agent1");
152
+ const session = store.createSession("claude", "opus");
153
+ store.addMessage(session.id, "user", "test");
154
+ store.addCost(session.id, 0.000001, 1, 1);
155
+ store.addCost(session.id, 0.000002, 1, 1);
156
+ const summaries = store.listSessionSummaries();
157
+ expect(summaries[0].costUsd).toBeCloseTo(0.000003, 6);
158
+ });
159
+ it("addCost with very large values", () => {
160
+ const store = new SessionStore("agent1");
161
+ const session = store.createSession("claude", "opus");
162
+ store.addMessage(session.id, "user", "test");
163
+ store.addCost(session.id, 99.99, 1_000_000, 500_000);
164
+ const summaries = store.listSessionSummaries();
165
+ expect(summaries[0].costUsd).toBeCloseTo(99.99, 2);
166
+ expect(summaries[0].inputTokens).toBe(1_000_000);
167
+ expect(summaries[0].outputTokens).toBe(500_000);
168
+ });
169
+ it("cost aggregation across multiple addCost calls", () => {
170
+ const store = new SessionStore("agent1");
171
+ const session = store.createSession("claude", "opus");
172
+ store.addMessage(session.id, "user", "test");
173
+ for (let i = 0; i < 100; i++) {
174
+ store.addCost(session.id, 0.01, 100, 50);
175
+ }
176
+ const summaries = store.listSessionSummaries();
177
+ expect(summaries[0].costUsd).toBeCloseTo(1.0, 1);
178
+ expect(summaries[0].inputTokens).toBe(10_000);
179
+ expect(summaries[0].outputTokens).toBe(5_000);
180
+ });
181
+ });
182
+ // =======================================================================
183
+ // listSessions
184
+ // =======================================================================
185
+ describe("listSessions", () => {
186
+ it("ordering: most recent first", () => {
187
+ const store = new SessionStore("agent1");
188
+ const s1 = store.createSession("claude");
189
+ store.addMessage(s1.id, "user", "first");
190
+ store.updateLastActive(s1.id);
191
+ const s2 = store.createSession("openai");
192
+ store.addMessage(s2.id, "user", "second");
193
+ store.updateLastActive(s2.id);
194
+ const sessions = store.listSessions();
195
+ expect(sessions).toHaveLength(2);
196
+ // Most recent first
197
+ expect(sessions[0].id).toBe(s2.id);
198
+ expect(sessions[1].id).toBe(s1.id);
199
+ });
200
+ it("listSessions with limit", () => {
201
+ const store = new SessionStore("agent1");
202
+ for (let i = 0; i < 10; i++) {
203
+ const s = store.createSession("claude");
204
+ store.addMessage(s.id, "user", `msg ${i}`);
205
+ }
206
+ const limited = store.listSessions(3);
207
+ expect(limited).toHaveLength(3);
208
+ });
209
+ it("listSessions returns empty for agent with no sessions", () => {
210
+ const store = new SessionStore("nonexistent-agent");
211
+ expect(store.listSessions()).toHaveLength(0);
212
+ });
213
+ it("session without messages excluded from listSessions", () => {
214
+ const store = new SessionStore("agent1");
215
+ store.createSession("claude"); // no messages
216
+ expect(store.listSessions()).toHaveLength(0);
217
+ });
218
+ });
219
+ // =======================================================================
220
+ // listSessionSummaries
221
+ // =======================================================================
222
+ describe("listSessionSummaries", () => {
223
+ it("multiple sessions in summaries", () => {
224
+ const store = new SessionStore("agent1");
225
+ const s1 = store.createSession("claude", "opus");
226
+ store.addMessage(s1.id, "user", "Hello Claude");
227
+ store.addCost(s1.id, 0.05, 500, 200);
228
+ const s2 = store.createSession("openai", "gpt-5.4");
229
+ store.addMessage(s2.id, "user", "Hello OpenAI");
230
+ store.addCost(s2.id, 0.03, 300, 100);
231
+ const summaries = store.listSessionSummaries();
232
+ expect(summaries).toHaveLength(2);
233
+ });
234
+ it("firstUserMessage in summary", () => {
235
+ const store = new SessionStore("agent1");
236
+ const session = store.createSession("claude", "opus");
237
+ store.addMessage(session.id, "user", "Train a model to classify cats");
238
+ store.addMessage(session.id, "assistant", "Sure!");
239
+ const summaries = store.listSessionSummaries();
240
+ expect(summaries[0].firstUserMessage).toContain("Train a model");
241
+ });
242
+ it("firstUserMessage with long content is truncated", () => {
243
+ const store = new SessionStore("agent1");
244
+ const session = store.createSession("claude", "opus");
245
+ const longMsg = "A".repeat(200);
246
+ store.addMessage(session.id, "user", longMsg);
247
+ const summaries = store.listSessionSummaries();
248
+ // truncate(msg, 80, true) — should be truncated to <= ~80 chars + ellipsis
249
+ expect(summaries[0].firstUserMessage.length).toBeLessThanOrEqual(85);
250
+ });
251
+ it("summaries cost aggregation across multiple addCost calls", () => {
252
+ const store = new SessionStore("agent1");
253
+ const session = store.createSession("claude", "opus");
254
+ store.addMessage(session.id, "user", "test");
255
+ store.addCost(session.id, 0.01, 100, 50);
256
+ store.addCost(session.id, 0.02, 200, 100);
257
+ store.addCost(session.id, 0.03, 300, 150);
258
+ const summaries = store.listSessionSummaries();
259
+ expect(summaries[0].costUsd).toBeCloseTo(0.06, 2);
260
+ expect(summaries[0].inputTokens).toBe(600);
261
+ expect(summaries[0].outputTokens).toBe(300);
262
+ });
263
+ it("returns empty for no sessions", () => {
264
+ const store = new SessionStore("empty-agent");
265
+ expect(store.listSessionSummaries()).toHaveLength(0);
266
+ });
267
+ it("with limit", () => {
268
+ const store = new SessionStore("agent1");
269
+ for (let i = 0; i < 10; i++) {
270
+ const s = store.createSession("claude");
271
+ store.addMessage(s.id, "user", `msg ${i}`);
272
+ }
273
+ const limited = store.listSessionSummaries(3);
274
+ expect(limited).toHaveLength(3);
275
+ });
276
+ it("session with only assistant messages excluded from summaries (no user msg)", () => {
277
+ const store = new SessionStore("agent1");
278
+ const session = store.createSession("claude");
279
+ store.addMessage(session.id, "assistant", "Bot speaking");
280
+ const summaries = store.listSessionSummaries();
281
+ // Session has a message so it should appear, but firstUserMessage should be null
282
+ expect(summaries).toHaveLength(1);
283
+ expect(summaries[0].firstUserMessage).toBeNull();
284
+ });
285
+ });
286
+ // =======================================================================
287
+ // Session Fields
288
+ // =======================================================================
289
+ describe("Session Fields", () => {
290
+ it("session with model name stores/retrieves", () => {
291
+ const store = new SessionStore("agent1");
292
+ const session = store.createSession("claude", "claude-sonnet-4-6");
293
+ const retrieved = store.getSession(session.id);
294
+ expect(retrieved).not.toBeNull();
295
+ // model isn't exposed on Session interface directly, but let's verify via summaries
296
+ store.addMessage(session.id, "user", "test");
297
+ const summaries = store.listSessionSummaries();
298
+ expect(summaries[0].model).toBe("claude-sonnet-4-6");
299
+ });
300
+ it("session model can be null", () => {
301
+ const store = new SessionStore("agent1");
302
+ const session = store.createSession("claude"); // no model
303
+ store.addMessage(session.id, "user", "test");
304
+ const summaries = store.listSessionSummaries();
305
+ expect(summaries[0].model).toBeNull();
306
+ });
307
+ it("session with providerSessionId stores/retrieves", () => {
308
+ const store = new SessionStore("agent1");
309
+ const session = store.createSession("claude", "opus", "sdk-session-123");
310
+ const retrieved = store.getSession(session.id);
311
+ expect(retrieved.providerSessionId).toBe("sdk-session-123");
312
+ });
313
+ it("updateProviderSessionId changes the stored value", () => {
314
+ const store = new SessionStore("agent1");
315
+ const session = store.createSession("claude");
316
+ // When no providerSessionId is set, it comes back as null from SQLite
317
+ const initial = store.getSession(session.id).providerSessionId;
318
+ expect(initial == null).toBe(true);
319
+ store.updateProviderSessionId(session.id, "new-sdk-id");
320
+ expect(store.getSession(session.id).providerSessionId).toBe("new-sdk-id");
321
+ });
322
+ it("getSession returns correct types for all fields", () => {
323
+ const store = new SessionStore("agent1");
324
+ const before = Date.now();
325
+ const session = store.createSession("claude", "opus", "sdk-1");
326
+ const after = Date.now();
327
+ const retrieved = store.getSession(session.id);
328
+ expect(typeof retrieved.id).toBe("string");
329
+ expect(typeof retrieved.providerId).toBe("string");
330
+ expect(typeof retrieved.createdAt).toBe("number");
331
+ expect(typeof retrieved.lastActiveAt).toBe("number");
332
+ expect(retrieved.createdAt).toBeGreaterThanOrEqual(before);
333
+ expect(retrieved.createdAt).toBeLessThanOrEqual(after);
334
+ expect(retrieved.providerId).toBe("claude");
335
+ });
336
+ });
337
+ // =======================================================================
338
+ // updateLastActive
339
+ // =======================================================================
340
+ describe("updateLastActive", () => {
341
+ it("changes timestamp", () => {
342
+ const store = new SessionStore("agent1");
343
+ const session = store.createSession("claude");
344
+ const original = session.lastActiveAt;
345
+ // Brief delay to ensure different timestamp
346
+ store.updateLastActive(session.id);
347
+ const updated = store.getSession(session.id);
348
+ expect(updated.lastActiveAt).toBeGreaterThanOrEqual(original);
349
+ });
350
+ it("does not affect other sessions", () => {
351
+ const store = new SessionStore("agent1");
352
+ const s1 = store.createSession("claude");
353
+ const s2 = store.createSession("openai");
354
+ const s2Original = s2.lastActiveAt;
355
+ store.updateLastActive(s1.id);
356
+ const s2After = store.getSession(s2.id);
357
+ expect(s2After.lastActiveAt).toBe(s2Original);
358
+ });
359
+ });
360
+ // =======================================================================
361
+ // Agent ID Isolation
362
+ // =======================================================================
363
+ describe("Agent ID Isolation", () => {
364
+ it("different agent IDs see different sessions", () => {
365
+ const store1 = new SessionStore("agent-A");
366
+ const store2 = new SessionStore("agent-B");
367
+ const s1 = store1.createSession("claude");
368
+ store1.addMessage(s1.id, "user", "Agent A msg");
369
+ const s2 = store2.createSession("claude");
370
+ store2.addMessage(s2.id, "user", "Agent B msg");
371
+ expect(store1.listSessions()).toHaveLength(1);
372
+ expect(store1.listSessions()[0].id).toBe(s1.id);
373
+ expect(store2.listSessions()).toHaveLength(1);
374
+ expect(store2.listSessions()[0].id).toBe(s2.id);
375
+ });
376
+ it("empty agent ID: sessions with empty agent_id", () => {
377
+ const store = new SessionStore("");
378
+ const session = store.createSession("claude");
379
+ store.addMessage(session.id, "user", "msg");
380
+ expect(store.listSessions()).toHaveLength(1);
381
+ });
382
+ it("different stores see different summaries", () => {
383
+ const storeA = new SessionStore("A");
384
+ const storeB = new SessionStore("B");
385
+ const sA = storeA.createSession("claude");
386
+ storeA.addMessage(sA.id, "user", "A msg");
387
+ storeA.addCost(sA.id, 0.05, 500, 200);
388
+ const sB = storeB.createSession("openai");
389
+ storeB.addMessage(sB.id, "user", "B msg");
390
+ storeB.addCost(sB.id, 0.03, 300, 100);
391
+ const summariesA = storeA.listSessionSummaries();
392
+ const summariesB = storeB.listSessionSummaries();
393
+ expect(summariesA).toHaveLength(1);
394
+ expect(summariesA[0].provider).toBe("claude");
395
+ expect(summariesB).toHaveLength(1);
396
+ expect(summariesB[0].provider).toBe("openai");
397
+ });
398
+ it("getSession works across agent IDs (not filtered by agent)", () => {
399
+ const store1 = new SessionStore("agent-A");
400
+ const store2 = new SessionStore("agent-B");
401
+ const session = store1.createSession("claude");
402
+ // getSession should work from any store since it queries by ID
403
+ const retrieved = store2.getSession(session.id);
404
+ expect(retrieved).not.toBeNull();
405
+ expect(retrieved.id).toBe(session.id);
406
+ });
407
+ });
408
+ // =======================================================================
409
+ // createEphemeralSession
410
+ // =======================================================================
411
+ describe("createEphemeralSession", () => {
412
+ it("ID starts with eph-", () => {
413
+ const session = createEphemeralSession("claude");
414
+ expect(session.id).toMatch(/^eph-/);
415
+ });
416
+ it("timestamps are current", () => {
417
+ const before = Date.now();
418
+ const session = createEphemeralSession("openai");
419
+ const after = Date.now();
420
+ expect(session.createdAt).toBeGreaterThanOrEqual(before);
421
+ expect(session.createdAt).toBeLessThanOrEqual(after);
422
+ expect(session.lastActiveAt).toBeGreaterThanOrEqual(before);
423
+ expect(session.lastActiveAt).toBeLessThanOrEqual(after);
424
+ });
425
+ it("multiple ephemeral sessions get unique IDs", () => {
426
+ const ids = new Set();
427
+ for (let i = 0; i < 50; i++) {
428
+ ids.add(createEphemeralSession("claude").id);
429
+ }
430
+ expect(ids.size).toBe(50);
431
+ });
432
+ it("ephemeral session never touches DB", () => {
433
+ const store = new SessionStore("agent1");
434
+ const ephSession = createEphemeralSession("claude");
435
+ // It shouldn't be findable in the DB
436
+ const retrieved = store.getSession(ephSession.id);
437
+ expect(retrieved).toBeNull();
438
+ expect(store.listSessions()).toHaveLength(0);
439
+ });
440
+ it("ephemeral session has correct providerId", () => {
441
+ expect(createEphemeralSession("claude").providerId).toBe("claude");
442
+ expect(createEphemeralSession("openai").providerId).toBe("openai");
443
+ });
444
+ });
445
+ // =======================================================================
446
+ // Message Roles
447
+ // =======================================================================
448
+ describe("Message Roles", () => {
449
+ it("addMessage with 'user' role", () => {
450
+ const store = new SessionStore("agent1");
451
+ const session = store.createSession("claude");
452
+ store.addMessage(session.id, "user", "User message");
453
+ const messages = store.getMessages(session.id);
454
+ expect(messages[0].role).toBe("user");
455
+ });
456
+ it("addMessage with 'assistant' role", () => {
457
+ const store = new SessionStore("agent1");
458
+ const session = store.createSession("claude");
459
+ store.addMessage(session.id, "assistant", "Assistant message");
460
+ const messages = store.getMessages(session.id);
461
+ expect(messages[0].role).toBe("assistant");
462
+ });
463
+ it("addMessage with 'system' role", () => {
464
+ const store = new SessionStore("agent1");
465
+ const session = store.createSession("claude");
466
+ store.addMessage(session.id, "system", "System message");
467
+ const messages = store.getMessages(session.id);
468
+ expect(messages[0].role).toBe("system");
469
+ });
470
+ it("addMessage with 'tool' role", () => {
471
+ const store = new SessionStore("agent1");
472
+ const session = store.createSession("claude");
473
+ store.addMessage(session.id, "tool", "Tool output");
474
+ const messages = store.getMessages(session.id);
475
+ expect(messages[0].role).toBe("tool");
476
+ });
477
+ it("message ordering: timestamps are sequential", () => {
478
+ const store = new SessionStore("agent1");
479
+ const session = store.createSession("claude");
480
+ for (let i = 0; i < 10; i++) {
481
+ store.addMessage(session.id, "user", `msg-${i}`);
482
+ }
483
+ const messages = store.getMessages(session.id);
484
+ for (let i = 1; i < messages.length; i++) {
485
+ expect(messages[i].timestamp).toBeGreaterThanOrEqual(messages[i - 1].timestamp);
486
+ }
487
+ });
488
+ });
489
+ // =======================================================================
490
+ // Concurrent Access
491
+ // =======================================================================
492
+ describe("Concurrent Access", () => {
493
+ it("concurrent reads/writes to same session", () => {
494
+ const store = new SessionStore("agent1");
495
+ const session = store.createSession("claude");
496
+ // Synchronous in SQLite, but verify no corruption
497
+ for (let i = 0; i < 50; i++) {
498
+ store.addMessage(session.id, "user", `write-${i}`);
499
+ const msgs = store.getMessages(session.id);
500
+ expect(msgs.length).toBe(i + 1);
501
+ }
502
+ const final = store.getMessages(session.id);
503
+ expect(final).toHaveLength(50);
504
+ });
505
+ it("interleaved writes to different sessions", () => {
506
+ const store = new SessionStore("agent1");
507
+ const s1 = store.createSession("claude");
508
+ const s2 = store.createSession("openai");
509
+ for (let i = 0; i < 20; i++) {
510
+ store.addMessage(s1.id, "user", `s1-${i}`);
511
+ store.addMessage(s2.id, "user", `s2-${i}`);
512
+ }
513
+ const m1 = store.getMessages(s1.id, 100);
514
+ const m2 = store.getMessages(s2.id, 100);
515
+ expect(m1).toHaveLength(20);
516
+ expect(m2).toHaveLength(20);
517
+ expect(m1[0].content).toBe("s1-0");
518
+ expect(m2[0].content).toBe("s2-0");
519
+ });
520
+ });
521
+ });
522
+ //# sourceMappingURL=session-store-edge.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-store-edge.test.js","sourceRoot":"","sources":["../../src/store/session-store-edge.test.ts"],"names":[],"mappings":"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"}
@@ -22,14 +22,21 @@ export interface SessionSummary {
22
22
  }
23
23
  /** Create an in-memory session that is NOT persisted to the database. */
24
24
  export declare function createEphemeralSession(providerId: string): Session;
25
+ /** Check if a session is ephemeral (not persisted). */
26
+ export declare function isEphemeralSession(session: Session): boolean;
25
27
  export declare class SessionStore {
26
28
  private agentId;
29
+ private stmts;
30
+ private stmt;
27
31
  constructor(agentId?: string);
28
32
  createSession(provider: string, model?: string, providerSessionId?: string): Session;
29
33
  getSession(id: string): Session | null;
34
+ updateProviderSessionId(sessionId: string, providerSessionId: string): void;
35
+ updateProvider(sessionId: string, provider: string): void;
30
36
  updateLastActive(sessionId: string): void;
31
37
  addCost(sessionId: string, costUsd: number, inputTokens: number, outputTokens: number): void;
32
38
  addMessage(sessionId: string, role: StoredMessage["role"], content: string, toolCalls?: string, tokenCount?: number): void;
39
+ hasMessages(sessionId: string): boolean;
33
40
  getMessages(sessionId: string, limit?: number): StoredMessage[];
34
41
  listSessions(limit?: number): Session[];
35
42
  listSessionSummaries(limit?: number): SessionSummary[];
@@ -1 +1 @@
1
- {"version":3,"file":"session-store.d.ts","sourceRoot":"","sources":["../../src/store/session-store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAGrD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,yEAAyE;AACzE,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAGlE;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,SAAK;IAIxB,aAAa,CACX,QAAQ,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,MAAM,EACd,iBAAiB,CAAC,EAAE,MAAM,GACzB,OAAO;IAmBV,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;IAiBtC,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAQzC,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAO5F,UAAU,CACR,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,EAC3B,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,MAAM,EAClB,UAAU,CAAC,EAAE,MAAM,GAClB,IAAI;IAeP,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,SAAM,GAAG,aAAa,EAAE;IAmB5D,YAAY,CAAC,KAAK,SAAK,GAAG,OAAO,EAAE;IAoBnC,oBAAoB,CAAC,KAAK,SAAK,GAAG,cAAc,EAAE;CA0CnD"}
1
+ {"version":3,"file":"session-store.d.ts","sourceRoot":"","sources":["../../src/store/session-store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAGrD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAID,yEAAyE;AACzE,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAGlE;AAED,uDAAuD;AACvD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAE5D;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,IAAI;gBAEA,OAAO,SAAK;IAIxB,aAAa,CACX,QAAQ,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,MAAM,EACd,iBAAiB,CAAC,EAAE,MAAM,GACzB,OAAO;IAkBV,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;IAetC,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG,IAAI;IAO3E,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAOzD,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAOzC,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAM5F,UAAU,CACR,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,EAC3B,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,MAAM,EAClB,UAAU,CAAC,EAAE,MAAM,GAClB,IAAI;IAcP,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAKvC,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,SAAM,GAAG,aAAa,EAAE;IAiB5D,YAAY,CAAC,KAAK,SAAK,GAAG,OAAO,EAAE;IAkBnC,oBAAoB,CAAC,KAAK,SAAK,GAAG,cAAc,EAAE;CAwCnD"}