@roj-ai/sdk 0.1.3 → 0.1.5

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 (493) hide show
  1. package/dist/bootstrap.js +191 -0
  2. package/dist/bootstrap.js.map +1 -0
  3. package/dist/builtin-events.js +8 -0
  4. package/dist/builtin-events.js.map +1 -0
  5. package/dist/bun-platform/fs.js +39 -0
  6. package/dist/bun-platform/fs.js.map +1 -0
  7. package/dist/bun-platform/index.js +18 -0
  8. package/dist/bun-platform/index.js.map +1 -0
  9. package/dist/bun-platform/process.js +21 -0
  10. package/dist/bun-platform/process.js.map +1 -0
  11. package/dist/config.js +54 -0
  12. package/dist/config.js.map +1 -0
  13. package/dist/config.test.js +155 -0
  14. package/dist/config.test.js.map +1 -0
  15. package/dist/core/agent-loop.integration.test.js +414 -0
  16. package/dist/core/agent-loop.integration.test.js.map +1 -0
  17. package/dist/core/agents/agent-config.test.js +194 -0
  18. package/dist/core/agents/agent-config.test.js.map +1 -0
  19. package/dist/core/agents/agent-roles.js +25 -0
  20. package/dist/core/agents/agent-roles.js.map +1 -0
  21. package/dist/core/agents/agent-shutdown.test.js +180 -0
  22. package/dist/core/agents/agent-shutdown.test.js.map +1 -0
  23. package/dist/core/agents/agent.js +1205 -0
  24. package/dist/core/agents/agent.js.map +1 -0
  25. package/dist/core/agents/agent.test.js +313 -0
  26. package/dist/core/agents/agent.test.js.map +1 -0
  27. package/dist/core/agents/communicator.js +13 -0
  28. package/dist/core/agents/communicator.js.map +1 -0
  29. package/dist/core/agents/config.js +5 -0
  30. package/dist/core/agents/config.js.map +1 -0
  31. package/dist/core/agents/context.js +2 -0
  32. package/dist/core/agents/context.js.map +1 -0
  33. package/dist/core/agents/debounce.js +74 -0
  34. package/dist/core/agents/debounce.js.map +1 -0
  35. package/dist/core/agents/handler-events.test.js +115 -0
  36. package/dist/core/agents/handler-events.test.js.map +1 -0
  37. package/dist/core/agents/index.js +2 -0
  38. package/dist/core/agents/index.js.map +1 -0
  39. package/dist/core/agents/response-sanitizer.js +46 -0
  40. package/dist/core/agents/response-sanitizer.js.map +1 -0
  41. package/dist/core/agents/response-sanitizer.test.js +101 -0
  42. package/dist/core/agents/response-sanitizer.test.js.map +1 -0
  43. package/dist/core/agents/retry.js +105 -0
  44. package/dist/core/agents/retry.js.map +1 -0
  45. package/dist/core/agents/schema.js +39 -0
  46. package/dist/core/agents/schema.js.map +1 -0
  47. package/dist/core/agents/state.js +90 -0
  48. package/dist/core/agents/state.js.map +1 -0
  49. package/dist/core/context/state.js +23 -0
  50. package/dist/core/context/state.js.map +1 -0
  51. package/dist/core/errors.js +38 -0
  52. package/dist/core/errors.js.map +1 -0
  53. package/dist/core/event-sourcing.integration.test.js +154 -0
  54. package/dist/core/event-sourcing.integration.test.js.map +1 -0
  55. package/dist/core/events/base-event-store.js +201 -0
  56. package/dist/core/events/base-event-store.js.map +1 -0
  57. package/dist/core/events/event-store.js +26 -0
  58. package/dist/core/events/event-store.js.map +1 -0
  59. package/dist/core/events/file.js +320 -0
  60. package/dist/core/events/file.js.map +1 -0
  61. package/dist/core/events/file.test.js +284 -0
  62. package/dist/core/events/file.test.js.map +1 -0
  63. package/dist/core/events/index.js +3 -0
  64. package/dist/core/events/index.js.map +1 -0
  65. package/dist/core/events/memory.js +101 -0
  66. package/dist/core/events/memory.js.map +1 -0
  67. package/dist/core/events/memory.test.js +502 -0
  68. package/dist/core/events/memory.test.js.map +1 -0
  69. package/dist/core/events/metadata-utils.js +107 -0
  70. package/dist/core/events/metadata-utils.js.map +1 -0
  71. package/dist/core/events/test-helpers.js +15 -0
  72. package/dist/core/events/test-helpers.js.map +1 -0
  73. package/dist/core/events/types.js +21 -0
  74. package/dist/core/events/types.js.map +1 -0
  75. package/dist/core/file-store/file-store.js +250 -0
  76. package/dist/core/file-store/file-store.js.map +1 -0
  77. package/dist/core/file-store/types.js +7 -0
  78. package/dist/core/file-store/types.js.map +1 -0
  79. package/dist/core/image/image-processor.js +106 -0
  80. package/dist/core/image/image-processor.js.map +1 -0
  81. package/dist/core/image/image-processor.test.js +171 -0
  82. package/dist/core/image/image-processor.test.js.map +1 -0
  83. package/dist/core/image/index.js +4 -0
  84. package/dist/core/image/index.js.map +1 -0
  85. package/dist/core/image/noop-resizer.js +6 -0
  86. package/dist/core/image/noop-resizer.js.map +1 -0
  87. package/dist/core/image/types.js +2 -0
  88. package/dist/core/image/types.js.map +1 -0
  89. package/dist/core/image/vips-resizer.js +100 -0
  90. package/dist/core/image/vips-resizer.js.map +1 -0
  91. package/dist/core/image/vips-resizer.test.js +324 -0
  92. package/dist/core/image/vips-resizer.test.js.map +1 -0
  93. package/dist/core/llm/anthropic.js +396 -0
  94. package/dist/core/llm/anthropic.js.map +1 -0
  95. package/dist/core/llm/anthropic.test.js +434 -0
  96. package/dist/core/llm/anthropic.test.js.map +1 -0
  97. package/dist/core/llm/cache-breakpoints.js +37 -0
  98. package/dist/core/llm/cache-breakpoints.js.map +1 -0
  99. package/dist/core/llm/cache-live.test.js +137 -0
  100. package/dist/core/llm/cache-live.test.js.map +1 -0
  101. package/dist/core/llm/index.js +9 -0
  102. package/dist/core/llm/index.js.map +1 -0
  103. package/dist/core/llm/llm-log-types.js +12 -0
  104. package/dist/core/llm/llm-log-types.js.map +1 -0
  105. package/dist/core/llm/logger.js +241 -0
  106. package/dist/core/llm/logger.js.map +1 -0
  107. package/dist/core/llm/logger.test.js +228 -0
  108. package/dist/core/llm/logger.test.js.map +1 -0
  109. package/dist/core/llm/logging-provider.js +49 -0
  110. package/dist/core/llm/logging-provider.js.map +1 -0
  111. package/dist/core/llm/middleware.js +114 -0
  112. package/dist/core/llm/middleware.js.map +1 -0
  113. package/dist/core/llm/mock.js +186 -0
  114. package/dist/core/llm/mock.js.map +1 -0
  115. package/dist/core/llm/mock.test.js +318 -0
  116. package/dist/core/llm/mock.test.js.map +1 -0
  117. package/dist/core/llm/openrouter-mapping.test.js +125 -0
  118. package/dist/core/llm/openrouter-mapping.test.js.map +1 -0
  119. package/dist/core/llm/openrouter.js +298 -0
  120. package/dist/core/llm/openrouter.js.map +1 -0
  121. package/dist/core/llm/openrouter.test.js +377 -0
  122. package/dist/core/llm/openrouter.test.js.map +1 -0
  123. package/dist/core/llm/provider-integration.test.js +350 -0
  124. package/dist/core/llm/provider-integration.test.js.map +1 -0
  125. package/dist/core/llm/provider.js +18 -0
  126. package/dist/core/llm/provider.js.map +1 -0
  127. package/dist/core/llm/routing-provider.js +52 -0
  128. package/dist/core/llm/routing-provider.js.map +1 -0
  129. package/dist/core/llm/routing-provider.test.js +94 -0
  130. package/dist/core/llm/routing-provider.test.js.map +1 -0
  131. package/dist/core/llm/schema.js +31 -0
  132. package/dist/core/llm/schema.js.map +1 -0
  133. package/dist/core/llm/snapshot-fetch.js +122 -0
  134. package/dist/core/llm/snapshot-fetch.js.map +1 -0
  135. package/dist/core/llm/snapshot-middleware.js +142 -0
  136. package/dist/core/llm/snapshot-middleware.js.map +1 -0
  137. package/dist/core/llm/snapshot-middleware.test.js +144 -0
  138. package/dist/core/llm/snapshot-middleware.test.js.map +1 -0
  139. package/dist/core/llm/state.js +48 -0
  140. package/dist/core/llm/state.js.map +1 -0
  141. package/dist/core/llm/tokens.js +40 -0
  142. package/dist/core/llm/tokens.js.map +1 -0
  143. package/dist/core/multi-agent.integration.test.js +298 -0
  144. package/dist/core/multi-agent.integration.test.js.map +1 -0
  145. package/dist/core/plugin-hooks.integration.test.js +344 -0
  146. package/dist/core/plugin-hooks.integration.test.js.map +1 -0
  147. package/dist/core/plugins/hook-types.js +5 -0
  148. package/dist/core/plugins/hook-types.js.map +1 -0
  149. package/dist/core/plugins/index.js +5 -0
  150. package/dist/core/plugins/index.js.map +1 -0
  151. package/dist/core/plugins/plugin-builder.js +321 -0
  152. package/dist/core/plugins/plugin-builder.js.map +1 -0
  153. package/dist/core/preset/config.js +54 -0
  154. package/dist/core/preset/config.js.map +1 -0
  155. package/dist/core/preset/index.js +6 -0
  156. package/dist/core/preset/index.js.map +1 -0
  157. package/dist/core/preset/preset-builder.js +63 -0
  158. package/dist/core/preset/preset-builder.js.map +1 -0
  159. package/dist/core/session-lifecycle.integration.test.js +159 -0
  160. package/dist/core/session-lifecycle.integration.test.js.map +1 -0
  161. package/dist/core/sessions/apply-event.js +41 -0
  162. package/dist/core/sessions/apply-event.js.map +1 -0
  163. package/dist/core/sessions/context.js +2 -0
  164. package/dist/core/sessions/context.js.map +1 -0
  165. package/dist/core/sessions/fork-utils.js +42 -0
  166. package/dist/core/sessions/fork-utils.js.map +1 -0
  167. package/dist/core/sessions/fork-utils.test.js +129 -0
  168. package/dist/core/sessions/fork-utils.test.js.map +1 -0
  169. package/dist/core/sessions/reducer.js +55 -0
  170. package/dist/core/sessions/reducer.js.map +1 -0
  171. package/dist/core/sessions/schema.js +66 -0
  172. package/dist/core/sessions/schema.js.map +1 -0
  173. package/dist/core/sessions/session-environment.js +2 -0
  174. package/dist/core/sessions/session-environment.js.map +1 -0
  175. package/dist/core/sessions/session-manager.js +650 -0
  176. package/dist/core/sessions/session-manager.js.map +1 -0
  177. package/dist/core/sessions/session-store.js +118 -0
  178. package/dist/core/sessions/session-store.js.map +1 -0
  179. package/dist/core/sessions/session.js +675 -0
  180. package/dist/core/sessions/session.js.map +1 -0
  181. package/dist/core/sessions/session.test.js +1095 -0
  182. package/dist/core/sessions/session.test.js.map +1 -0
  183. package/dist/core/sessions/state.js +377 -0
  184. package/dist/core/sessions/state.js.map +1 -0
  185. package/dist/core/system.js +66 -0
  186. package/dist/core/system.js.map +1 -0
  187. package/dist/core/tools/context.js +2 -0
  188. package/dist/core/tools/context.js.map +1 -0
  189. package/dist/core/tools/definition.js +4 -0
  190. package/dist/core/tools/definition.js.map +1 -0
  191. package/dist/core/tools/executor.js +82 -0
  192. package/dist/core/tools/executor.js.map +1 -0
  193. package/dist/core/tools/executor.test.js +143 -0
  194. package/dist/core/tools/executor.test.js.map +1 -0
  195. package/dist/core/tools/index.js +4 -0
  196. package/dist/core/tools/index.js.map +1 -0
  197. package/dist/core/tools/schema.js +20 -0
  198. package/dist/core/tools/schema.js.map +1 -0
  199. package/dist/core/tools/state.js +29 -0
  200. package/dist/core/tools/state.js.map +1 -0
  201. package/dist/index.js +70 -0
  202. package/dist/index.js.map +1 -0
  203. package/dist/lib/json/index.js +5 -0
  204. package/dist/lib/json/index.js.map +1 -0
  205. package/dist/lib/logger/console.js +147 -0
  206. package/dist/lib/logger/console.js.map +1 -0
  207. package/dist/lib/logger/console.test.js +258 -0
  208. package/dist/lib/logger/console.test.js.map +1 -0
  209. package/dist/lib/logger/file.js +54 -0
  210. package/dist/lib/logger/file.js.map +1 -0
  211. package/dist/lib/logger/index.js +4 -0
  212. package/dist/lib/logger/index.js.map +1 -0
  213. package/dist/lib/logger/logger.js +28 -0
  214. package/dist/lib/logger/logger.js.map +1 -0
  215. package/dist/lib/logger/ring-buffer.js +61 -0
  216. package/dist/lib/logger/ring-buffer.js.map +1 -0
  217. package/dist/lib/logger/tee.js +43 -0
  218. package/dist/lib/logger/tee.js.map +1 -0
  219. package/dist/lib/mime.js +22 -0
  220. package/dist/lib/mime.js.map +1 -0
  221. package/dist/lib/never.js +4 -0
  222. package/dist/lib/never.js.map +1 -0
  223. package/dist/lib/utils/hash.js +35 -0
  224. package/dist/lib/utils/hash.js.map +1 -0
  225. package/dist/lib/utils/result.js +21 -0
  226. package/dist/lib/utils/result.js.map +1 -0
  227. package/dist/platform/fs.js +8 -0
  228. package/dist/platform/fs.js.map +1 -0
  229. package/dist/platform/index.js +9 -0
  230. package/dist/platform/index.js.map +1 -0
  231. package/dist/platform/process.js +8 -0
  232. package/dist/platform/process.js.map +1 -0
  233. package/dist/plugins/agent-status/plugin.js +77 -0
  234. package/dist/plugins/agent-status/plugin.js.map +1 -0
  235. package/dist/plugins/agents/agents.integration.test.js +683 -0
  236. package/dist/plugins/agents/agents.integration.test.js.map +1 -0
  237. package/dist/plugins/agents/index.js +2 -0
  238. package/dist/plugins/agents/index.js.map +1 -0
  239. package/dist/plugins/agents/plugin.js +199 -0
  240. package/dist/plugins/agents/plugin.js.map +1 -0
  241. package/dist/plugins/context-compact/context-compact.integration.test.js +174 -0
  242. package/dist/plugins/context-compact/context-compact.integration.test.js.map +1 -0
  243. package/dist/plugins/context-compact/context-compactor.js +238 -0
  244. package/dist/plugins/context-compact/context-compactor.js.map +1 -0
  245. package/dist/plugins/context-compact/context-compactor.test.js +763 -0
  246. package/dist/plugins/context-compact/context-compactor.test.js.map +1 -0
  247. package/dist/plugins/context-compact/history-offloader.js +42 -0
  248. package/dist/plugins/context-compact/history-offloader.js.map +1 -0
  249. package/dist/plugins/context-compact/history-offloader.test.js +77 -0
  250. package/dist/plugins/context-compact/history-offloader.test.js.map +1 -0
  251. package/dist/plugins/context-compact/index.js +4 -0
  252. package/dist/plugins/context-compact/index.js.map +1 -0
  253. package/dist/plugins/context-compact/plugin.js +37 -0
  254. package/dist/plugins/context-compact/plugin.js.map +1 -0
  255. package/dist/plugins/filesystem/filesystem.integration.test.js +411 -0
  256. package/dist/plugins/filesystem/filesystem.integration.test.js.map +1 -0
  257. package/dist/plugins/filesystem/helpers.js +170 -0
  258. package/dist/plugins/filesystem/helpers.js.map +1 -0
  259. package/dist/plugins/filesystem/index.js +3 -0
  260. package/dist/plugins/filesystem/index.js.map +1 -0
  261. package/dist/plugins/filesystem/listing.js +247 -0
  262. package/dist/plugins/filesystem/listing.js.map +1 -0
  263. package/dist/plugins/filesystem/plugin.js +364 -0
  264. package/dist/plugins/filesystem/plugin.js.map +1 -0
  265. package/dist/plugins/filesystem/schema.js +2 -0
  266. package/dist/plugins/filesystem/schema.js.map +1 -0
  267. package/dist/plugins/git-status/index.js +2 -0
  268. package/dist/plugins/git-status/index.js.map +1 -0
  269. package/dist/plugins/git-status/plugin.js +144 -0
  270. package/dist/plugins/git-status/plugin.js.map +1 -0
  271. package/dist/plugins/limits-guard/config.js +5 -0
  272. package/dist/plugins/limits-guard/config.js.map +1 -0
  273. package/dist/plugins/limits-guard/index.js +3 -0
  274. package/dist/plugins/limits-guard/index.js.map +1 -0
  275. package/dist/plugins/limits-guard/limit-guard.js +125 -0
  276. package/dist/plugins/limits-guard/limit-guard.js.map +1 -0
  277. package/dist/plugins/limits-guard/limit-guard.test.js +121 -0
  278. package/dist/plugins/limits-guard/limit-guard.test.js.map +1 -0
  279. package/dist/plugins/limits-guard/limits-guard.integration.test.js +378 -0
  280. package/dist/plugins/limits-guard/limits-guard.integration.test.js.map +1 -0
  281. package/dist/plugins/limits-guard/plugin.js +240 -0
  282. package/dist/plugins/limits-guard/plugin.js.map +1 -0
  283. package/dist/plugins/llm-debug/index.js +2 -0
  284. package/dist/plugins/llm-debug/index.js.map +1 -0
  285. package/dist/plugins/llm-debug/llm-debug.integration.test.js +157 -0
  286. package/dist/plugins/llm-debug/llm-debug.integration.test.js.map +1 -0
  287. package/dist/plugins/llm-debug/plugin.js +148 -0
  288. package/dist/plugins/llm-debug/plugin.js.map +1 -0
  289. package/dist/plugins/logs/index.js +2 -0
  290. package/dist/plugins/logs/index.js.map +1 -0
  291. package/dist/plugins/logs/plugin.js +38 -0
  292. package/dist/plugins/logs/plugin.js.map +1 -0
  293. package/dist/plugins/mailbox/helpers.js +66 -0
  294. package/dist/plugins/mailbox/helpers.js.map +1 -0
  295. package/dist/plugins/mailbox/index.js +9 -0
  296. package/dist/plugins/mailbox/index.js.map +1 -0
  297. package/dist/plugins/mailbox/mailbox.integration.test.js +605 -0
  298. package/dist/plugins/mailbox/mailbox.integration.test.js.map +1 -0
  299. package/dist/plugins/mailbox/plugin.js +204 -0
  300. package/dist/plugins/mailbox/plugin.js.map +1 -0
  301. package/dist/plugins/mailbox/prompts.js +93 -0
  302. package/dist/plugins/mailbox/prompts.js.map +1 -0
  303. package/dist/plugins/mailbox/query.js +38 -0
  304. package/dist/plugins/mailbox/query.js.map +1 -0
  305. package/dist/plugins/mailbox/schema.js +32 -0
  306. package/dist/plugins/mailbox/schema.js.map +1 -0
  307. package/dist/plugins/mailbox/state.js +41 -0
  308. package/dist/plugins/mailbox/state.js.map +1 -0
  309. package/dist/plugins/resources/index.js +4 -0
  310. package/dist/plugins/resources/index.js.map +1 -0
  311. package/dist/plugins/resources/manifest.js +20 -0
  312. package/dist/plugins/resources/manifest.js.map +1 -0
  313. package/dist/plugins/resources/plugin.js +171 -0
  314. package/dist/plugins/resources/plugin.js.map +1 -0
  315. package/dist/plugins/resources/post-inject.js +32 -0
  316. package/dist/plugins/resources/post-inject.js.map +1 -0
  317. package/dist/plugins/resources/state.js +16 -0
  318. package/dist/plugins/resources/state.js.map +1 -0
  319. package/dist/plugins/result-eviction/index.js +2 -0
  320. package/dist/plugins/result-eviction/index.js.map +1 -0
  321. package/dist/plugins/result-eviction/plugin.js +43 -0
  322. package/dist/plugins/result-eviction/plugin.js.map +1 -0
  323. package/dist/plugins/result-eviction/result-eviction.integration.test.js +217 -0
  324. package/dist/plugins/result-eviction/result-eviction.integration.test.js.map +1 -0
  325. package/dist/plugins/services/plugin.js +453 -0
  326. package/dist/plugins/services/plugin.js.map +1 -0
  327. package/dist/plugins/services/port-pool.js +70 -0
  328. package/dist/plugins/services/port-pool.js.map +1 -0
  329. package/dist/plugins/services/prompt.js +40 -0
  330. package/dist/plugins/services/prompt.js.map +1 -0
  331. package/dist/plugins/services/schema.js +9 -0
  332. package/dist/plugins/services/schema.js.map +1 -0
  333. package/dist/plugins/services/service.js +470 -0
  334. package/dist/plugins/services/service.js.map +1 -0
  335. package/dist/plugins/services/services.integration.test.js +485 -0
  336. package/dist/plugins/services/services.integration.test.js.map +1 -0
  337. package/dist/plugins/session-lifecycle/index.js +2 -0
  338. package/dist/plugins/session-lifecycle/index.js.map +1 -0
  339. package/dist/plugins/session-lifecycle/plugin.js +273 -0
  340. package/dist/plugins/session-lifecycle/plugin.js.map +1 -0
  341. package/dist/plugins/session-lifecycle/session-lifecycle.integration.test.js +498 -0
  342. package/dist/plugins/session-lifecycle/session-lifecycle.integration.test.js.map +1 -0
  343. package/dist/plugins/session-state/plugin.js +159 -0
  344. package/dist/plugins/session-state/plugin.js.map +1 -0
  345. package/dist/plugins/session-stats/index.js +3 -0
  346. package/dist/plugins/session-stats/index.js.map +1 -0
  347. package/dist/plugins/session-stats/plugin.js +81 -0
  348. package/dist/plugins/session-stats/plugin.js.map +1 -0
  349. package/dist/plugins/shell/executor.js +339 -0
  350. package/dist/plugins/shell/executor.js.map +1 -0
  351. package/dist/plugins/shell/index.js +6 -0
  352. package/dist/plugins/shell/index.js.map +1 -0
  353. package/dist/plugins/shell/plugin.js +66 -0
  354. package/dist/plugins/shell/plugin.js.map +1 -0
  355. package/dist/plugins/shell/shell.integration.test.js +234 -0
  356. package/dist/plugins/shell/shell.integration.test.js.map +1 -0
  357. package/dist/plugins/shell/shell.test.js +236 -0
  358. package/dist/plugins/shell/shell.test.js.map +1 -0
  359. package/dist/plugins/skills/discovery.js +205 -0
  360. package/dist/plugins/skills/discovery.js.map +1 -0
  361. package/dist/plugins/skills/discovery.test.js +312 -0
  362. package/dist/plugins/skills/discovery.test.js.map +1 -0
  363. package/dist/plugins/skills/index.js +12 -0
  364. package/dist/plugins/skills/index.js.map +1 -0
  365. package/dist/plugins/skills/plugin.js +293 -0
  366. package/dist/plugins/skills/plugin.js.map +1 -0
  367. package/dist/plugins/skills/prompts.js +70 -0
  368. package/dist/plugins/skills/prompts.js.map +1 -0
  369. package/dist/plugins/skills/schema.js +18 -0
  370. package/dist/plugins/skills/schema.js.map +1 -0
  371. package/dist/plugins/skills/skills.integration.test.js +475 -0
  372. package/dist/plugins/skills/skills.integration.test.js.map +1 -0
  373. package/dist/plugins/snapshotting/index.js +3 -0
  374. package/dist/plugins/snapshotting/index.js.map +1 -0
  375. package/dist/plugins/snapshotting/jj-snapshotter.js +106 -0
  376. package/dist/plugins/snapshotting/jj-snapshotter.js.map +1 -0
  377. package/dist/plugins/snapshotting/plugin.js +28 -0
  378. package/dist/plugins/snapshotting/plugin.js.map +1 -0
  379. package/dist/plugins/snapshotting/snapshotter.js +2 -0
  380. package/dist/plugins/snapshotting/snapshotter.js.map +1 -0
  381. package/dist/plugins/todo/index.js +7 -0
  382. package/dist/plugins/todo/index.js.map +1 -0
  383. package/dist/plugins/todo/plugin.js +319 -0
  384. package/dist/plugins/todo/plugin.js.map +1 -0
  385. package/dist/plugins/todo/prompts.js +54 -0
  386. package/dist/plugins/todo/prompts.js.map +1 -0
  387. package/dist/plugins/todo/schema.js +18 -0
  388. package/dist/plugins/todo/schema.js.map +1 -0
  389. package/dist/plugins/todo/todo.integration.test.js +605 -0
  390. package/dist/plugins/todo/todo.integration.test.js.map +1 -0
  391. package/dist/plugins/uploads/index.js +8 -0
  392. package/dist/plugins/uploads/index.js.map +1 -0
  393. package/dist/plugins/uploads/plugin.js +346 -0
  394. package/dist/plugins/uploads/plugin.js.map +1 -0
  395. package/dist/plugins/uploads/preprocessor.js +44 -0
  396. package/dist/plugins/uploads/preprocessor.js.map +1 -0
  397. package/dist/plugins/uploads/preprocessors/image-classifier.js +127 -0
  398. package/dist/plugins/uploads/preprocessors/image-classifier.js.map +1 -0
  399. package/dist/plugins/uploads/preprocessors/index.js +7 -0
  400. package/dist/plugins/uploads/preprocessors/index.js.map +1 -0
  401. package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.js +204 -0
  402. package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.js.map +1 -0
  403. package/dist/plugins/uploads/preprocessors/zip-preprocessor.js +172 -0
  404. package/dist/plugins/uploads/preprocessors/zip-preprocessor.js.map +1 -0
  405. package/dist/plugins/uploads/schema.js +20 -0
  406. package/dist/plugins/uploads/schema.js.map +1 -0
  407. package/dist/plugins/uploads/state.js +22 -0
  408. package/dist/plugins/uploads/state.js.map +1 -0
  409. package/dist/plugins/uploads/uploads.integration.test.js +496 -0
  410. package/dist/plugins/uploads/uploads.integration.test.js.map +1 -0
  411. package/dist/plugins/user-chat/index.js +5 -0
  412. package/dist/plugins/user-chat/index.js.map +1 -0
  413. package/dist/plugins/user-chat/plugin.js +544 -0
  414. package/dist/plugins/user-chat/plugin.js.map +1 -0
  415. package/dist/plugins/user-chat/prompts.js +29 -0
  416. package/dist/plugins/user-chat/prompts.js.map +1 -0
  417. package/dist/plugins/user-chat/schema.js +46 -0
  418. package/dist/plugins/user-chat/schema.js.map +1 -0
  419. package/dist/plugins/user-chat/user-chat.integration.test.js +668 -0
  420. package/dist/plugins/user-chat/user-chat.integration.test.js.map +1 -0
  421. package/dist/plugins/workers/context.js +143 -0
  422. package/dist/plugins/workers/context.js.map +1 -0
  423. package/dist/plugins/workers/definition.js +30 -0
  424. package/dist/plugins/workers/definition.js.map +1 -0
  425. package/dist/plugins/workers/index.js +7 -0
  426. package/dist/plugins/workers/index.js.map +1 -0
  427. package/dist/plugins/workers/plugin.js +578 -0
  428. package/dist/plugins/workers/plugin.js.map +1 -0
  429. package/dist/plugins/workers/worker.js +18 -0
  430. package/dist/plugins/workers/worker.js.map +1 -0
  431. package/dist/plugins/workers/workers.integration.test.js +629 -0
  432. package/dist/plugins/workers/workers.integration.test.js.map +1 -0
  433. package/dist/prompts/base.js +239 -0
  434. package/dist/prompts/base.js.map +1 -0
  435. package/dist/prompts/builder.js +131 -0
  436. package/dist/prompts/builder.js.map +1 -0
  437. package/dist/prompts/index.js +20 -0
  438. package/dist/prompts/index.js.map +1 -0
  439. package/dist/prompts/macros.js +26 -0
  440. package/dist/prompts/macros.js.map +1 -0
  441. package/dist/prompts/macros.test.js +80 -0
  442. package/dist/prompts/macros.test.js.map +1 -0
  443. package/dist/testing/bootstrap-for-testing.js +28 -0
  444. package/dist/testing/bootstrap-for-testing.js.map +1 -0
  445. package/dist/testing/index.js +7 -0
  446. package/dist/testing/index.js.map +1 -0
  447. package/dist/testing/node-platform.js +65 -0
  448. package/dist/testing/node-platform.js.map +1 -0
  449. package/dist/testing/notification-collector.js +82 -0
  450. package/dist/testing/notification-collector.js.map +1 -0
  451. package/dist/testing/preset-helpers.js +37 -0
  452. package/dist/testing/preset-helpers.js.map +1 -0
  453. package/dist/testing/test-harness.js +226 -0
  454. package/dist/testing/test-harness.js.map +1 -0
  455. package/dist/testing/test-harness.test.js +51 -0
  456. package/dist/testing/test-harness.test.js.map +1 -0
  457. package/dist/testing/wait-helpers.js +64 -0
  458. package/dist/testing/wait-helpers.js.map +1 -0
  459. package/dist/transport/adapter/client-adapter.js +64 -0
  460. package/dist/transport/adapter/client-adapter.js.map +1 -0
  461. package/dist/transport/adapter/index.js +24 -0
  462. package/dist/transport/adapter/index.js.map +1 -0
  463. package/dist/transport/adapter/server-adapter.js +73 -0
  464. package/dist/transport/adapter/server-adapter.js.map +1 -0
  465. package/dist/transport/adapter/types.js +8 -0
  466. package/dist/transport/adapter/types.js.map +1 -0
  467. package/dist/transport/http/app.js +86 -0
  468. package/dist/transport/http/app.js.map +1 -0
  469. package/dist/transport/http/index.js +6 -0
  470. package/dist/transport/http/index.js.map +1 -0
  471. package/dist/transport/http/middleware/bearer-auth.js +33 -0
  472. package/dist/transport/http/middleware/bearer-auth.js.map +1 -0
  473. package/dist/transport/http/middleware/error-handler.js +56 -0
  474. package/dist/transport/http/middleware/error-handler.js.map +1 -0
  475. package/dist/transport/http/routes/files.js +237 -0
  476. package/dist/transport/http/routes/files.js.map +1 -0
  477. package/dist/transport/http/routes/resources.js +77 -0
  478. package/dist/transport/http/routes/resources.js.map +1 -0
  479. package/dist/transport/http/routes/rpc.integration.test.js +189 -0
  480. package/dist/transport/http/routes/rpc.integration.test.js.map +1 -0
  481. package/dist/transport/http/routes/rpc.js +110 -0
  482. package/dist/transport/http/routes/rpc.js.map +1 -0
  483. package/dist/transport/http/routes/rpc.test.js +316 -0
  484. package/dist/transport/http/routes/rpc.test.js.map +1 -0
  485. package/dist/transport/http/routes/upload.js +205 -0
  486. package/dist/transport/http/routes/upload.js.map +1 -0
  487. package/dist/transport/rpc/index.js +7 -0
  488. package/dist/transport/rpc/index.js.map +1 -0
  489. package/dist/transport/rpc/methods.js +8 -0
  490. package/dist/transport/rpc/methods.js.map +1 -0
  491. package/dist/user-config.js +14 -0
  492. package/dist/user-config.js.map +1 -0
  493. package/package.json +47 -57
@@ -0,0 +1,101 @@
1
+ import { BaseEventStore } from './base-event-store.js';
2
+ /**
3
+ * MemoryEventStore - In-memory event store for testing.
4
+ *
5
+ * Provides simple in-memory storage with test helpers for inspecting events.
6
+ */
7
+ export class MemoryEventStore extends BaseEventStore {
8
+ events = new Map();
9
+ metadata = new Map();
10
+ async doAppend(sessionId, event) {
11
+ const existing = this.events.get(sessionId) ?? [];
12
+ this.events.set(sessionId, [...existing, event]);
13
+ await this.updateMetadataFromEvents(sessionId, [event]);
14
+ }
15
+ async doAppendBatch(sessionId, events) {
16
+ if (events.length === 0)
17
+ return;
18
+ const existing = this.events.get(sessionId) ?? [];
19
+ this.events.set(sessionId, [...existing, ...events]);
20
+ await this.updateMetadataFromEvents(sessionId, events);
21
+ }
22
+ async load(sessionId) {
23
+ return this.events.get(sessionId) ?? [];
24
+ }
25
+ async exists(sessionId) {
26
+ return this.events.has(sessionId);
27
+ }
28
+ async listSessions() {
29
+ return Array.from(this.events.keys());
30
+ }
31
+ async loadRange(sessionId, options) {
32
+ const allEvents = this.events.get(sessionId) ?? [];
33
+ const since = options?.since ?? -1;
34
+ const limit = options?.limit;
35
+ // toIndex always reflects the actual last event in the store (for polling cursor)
36
+ const storeLastIndex = allEvents.length - 1;
37
+ const fromIndex = since + 1;
38
+ if (fromIndex >= allEvents.length) {
39
+ // No new events, but return the actual last index so client can continue polling
40
+ return { events: [], fromIndex: -1, toIndex: storeLastIndex };
41
+ }
42
+ const endIndex = limit !== undefined
43
+ ? Math.min(fromIndex + limit, allEvents.length)
44
+ : allEvents.length;
45
+ const events = allEvents.slice(fromIndex, endIndex);
46
+ return {
47
+ events,
48
+ fromIndex: events.length > 0 ? fromIndex : -1,
49
+ toIndex: endIndex - 1,
50
+ };
51
+ }
52
+ // =========================================================================
53
+ // Metadata storage primitives
54
+ // =========================================================================
55
+ async readMetadata(sessionId) {
56
+ return this.metadata.get(sessionId) ?? null;
57
+ }
58
+ async writeMetadata(sessionId, metadata) {
59
+ this.metadata.set(sessionId, metadata);
60
+ }
61
+ async getAllSessionMetadata() {
62
+ return Array.from(this.metadata.values());
63
+ }
64
+ // =========================================================================
65
+ // Test helpers
66
+ // =========================================================================
67
+ /**
68
+ * Clears all events and metadata.
69
+ */
70
+ clear() {
71
+ this.events.clear();
72
+ this.metadata.clear();
73
+ }
74
+ /**
75
+ * Returns all events for inspection in tests.
76
+ */
77
+ getAll() {
78
+ return new Map(this.events);
79
+ }
80
+ /**
81
+ * Returns event count for a session.
82
+ */
83
+ getEventCount(sessionId) {
84
+ return this.events.get(sessionId)?.length ?? 0;
85
+ }
86
+ /**
87
+ * Returns the last event for a session.
88
+ */
89
+ getLastEvent(sessionId) {
90
+ const events = this.events.get(sessionId);
91
+ return events?.[events.length - 1];
92
+ }
93
+ /**
94
+ * Returns events of a given type.
95
+ */
96
+ getEventsByType(sessionId, type) {
97
+ const events = this.events.get(sessionId) ?? [];
98
+ return events.filter((e) => e.type === type);
99
+ }
100
+ }
101
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../../src/core/events/memory.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAGtD;;;;GAIG;AACH,MAAM,OAAO,gBAAiB,SAAQ,cAAc;IAC3C,MAAM,GAAG,IAAI,GAAG,EAA4B,CAAA;IAC5C,QAAQ,GAAG,IAAI,GAAG,EAA8B,CAAA;IAE9C,KAAK,CAAC,QAAQ,CAAC,SAAoB,EAAE,KAAkB;QAChE,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAA;QACjD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAA;QAChD,MAAM,IAAI,CAAC,wBAAwB,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,CAAC,CAAA;IACxD,CAAC;IAES,KAAK,CAAC,aAAa,CAAC,SAAoB,EAAE,MAAqB;QACxE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAM;QAE/B,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAA;QACjD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,GAAG,QAAQ,EAAE,GAAG,MAAM,CAAC,CAAC,CAAA;QACpD,MAAM,IAAI,CAAC,wBAAwB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;IACvD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAAoB;QAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAA;IACxC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,SAAoB;QAChC,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IAClC,CAAC;IAED,KAAK,CAAC,YAAY;QACjB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;IACtC,CAAC;IAED,KAAK,CAAC,SAAS,CACd,SAAoB,EACpB,OAA0B;QAE1B,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAA;QAClD,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,CAAC,CAAC,CAAA;QAClC,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,CAAA;QAE5B,kFAAkF;QAClF,MAAM,cAAc,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAA;QAE3C,MAAM,SAAS,GAAG,KAAK,GAAG,CAAC,CAAA;QAC3B,IAAI,SAAS,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;YACnC,iFAAiF;YACjF,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,CAAA;QAC9D,CAAC;QAED,MAAM,QAAQ,GAAG,KAAK,KAAK,SAAS;YACnC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC;YAC/C,CAAC,CAAC,SAAS,CAAC,MAAM,CAAA;QAEnB,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;QAEnD,OAAO;YACN,MAAM;YACN,SAAS,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7C,OAAO,EAAE,QAAQ,GAAG,CAAC;SACrB,CAAA;IACF,CAAC;IAED,4EAA4E;IAC5E,8BAA8B;IAC9B,4EAA4E;IAElE,KAAK,CAAC,YAAY,CAAC,SAAoB;QAChD,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,CAAA;IAC5C,CAAC;IAES,KAAK,CAAC,aAAa,CAAC,SAAoB,EAAE,QAAyB;QAC5E,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;IACvC,CAAC;IAES,KAAK,CAAC,qBAAqB;QACpC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;IAC1C,CAAC;IAED,4EAA4E;IAC5E,eAAe;IACf,4EAA4E;IAE5E;;OAEG;IACH,KAAK;QACJ,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;QACnB,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAA;IACtB,CAAC;IAED;;OAEG;IACH,MAAM;QACL,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAC5B,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,SAAoB;QACjC,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC,CAAA;IAC/C,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,SAAoB;QAChC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QACzC,OAAO,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IACnC,CAAC;IAED;;OAEG;IACH,eAAe,CACd,SAAoB,EACpB,IAAY;QAEZ,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAA;QAC/C,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAA;IAC7C,CAAC;CACD"}
@@ -0,0 +1,502 @@
1
+ import { beforeEach, describe, expect, test } from 'bun:test';
2
+ import { generateTestAgentId } from '../../core/agents/schema.js';
3
+ import { agentEvents } from '../../core/agents/state.js';
4
+ import { withSessionId } from '../../core/events/test-helpers.js';
5
+ import { llmEvents } from '../../core/llm/state.js';
6
+ import { generateSessionId } from '../../core/sessions/schema.js';
7
+ import { sessionEvents } from '../../core/sessions/state.js';
8
+ import { MemoryEventStore } from './memory.js';
9
+ describe('MemoryEventStore', () => {
10
+ let store;
11
+ let testSessionId;
12
+ beforeEach(() => {
13
+ store = new MemoryEventStore();
14
+ testSessionId = generateSessionId();
15
+ });
16
+ describe('append', () => {
17
+ test('appends single event', async () => {
18
+ const event = withSessionId(testSessionId, sessionEvents.create('session_created', {
19
+ presetId: 'test-preset',
20
+ }));
21
+ await store.append(testSessionId, event);
22
+ const loaded = await store.load(testSessionId);
23
+ expect(loaded).toHaveLength(1);
24
+ expect(loaded[0]).toMatchObject({
25
+ type: 'session_created',
26
+ sessionId: testSessionId,
27
+ presetId: 'test-preset',
28
+ });
29
+ });
30
+ test('appends multiple events sequentially', async () => {
31
+ const event1 = withSessionId(testSessionId, sessionEvents.create('session_created', {
32
+ presetId: 'test-preset',
33
+ }));
34
+ const agentId = generateTestAgentId();
35
+ const event2 = withSessionId(testSessionId, agentEvents.create('agent_spawned', {
36
+ agentId,
37
+ definitionName: 'test-agent',
38
+ parentId: null,
39
+ }));
40
+ await store.append(testSessionId, event1);
41
+ await store.append(testSessionId, event2);
42
+ const loaded = await store.load(testSessionId);
43
+ expect(loaded).toHaveLength(2);
44
+ expect(loaded[0]?.type).toBe('session_created');
45
+ expect(loaded[1]?.type).toBe('agent_spawned');
46
+ });
47
+ });
48
+ describe('appendBatch', () => {
49
+ test('appends multiple events in a batch', async () => {
50
+ const agentId = generateTestAgentId();
51
+ const events = [
52
+ withSessionId(testSessionId, sessionEvents.create('session_created', {
53
+ presetId: 'test-preset',
54
+ })),
55
+ withSessionId(testSessionId, agentEvents.create('agent_spawned', {
56
+ agentId,
57
+ definitionName: 'test-agent',
58
+ parentId: null,
59
+ })),
60
+ ];
61
+ await store.appendBatch(testSessionId, events);
62
+ const loaded = await store.load(testSessionId);
63
+ expect(loaded).toHaveLength(2);
64
+ });
65
+ test('handles empty batch', async () => {
66
+ await store.appendBatch(testSessionId, []);
67
+ const loaded = await store.load(testSessionId);
68
+ expect(loaded).toHaveLength(0);
69
+ });
70
+ });
71
+ describe('load', () => {
72
+ test('returns empty array for non-existent session', async () => {
73
+ const nonExistentId = generateSessionId();
74
+ const loaded = await store.load(nonExistentId);
75
+ expect(loaded).toEqual([]);
76
+ });
77
+ test('loads events in correct order', async () => {
78
+ const events = [];
79
+ for (let i = 0; i < 5; i++) {
80
+ events.push({ ...withSessionId(testSessionId, sessionEvents.create('session_created', { presetId: `preset-${i}` })), timestamp: Date.now() + i });
81
+ }
82
+ await store.appendBatch(testSessionId, events);
83
+ const loaded = await store.load(testSessionId);
84
+ expect(loaded).toHaveLength(5);
85
+ for (let i = 0; i < 5; i++) {
86
+ expect(loaded[i]).toMatchObject({ type: 'session_created', presetId: `preset-${i}` });
87
+ }
88
+ });
89
+ });
90
+ describe('loadRange', () => {
91
+ test('returns empty result for non-existent session', async () => {
92
+ const nonExistentId = generateSessionId();
93
+ const result = await store.loadRange(nonExistentId);
94
+ expect(result.events).toEqual([]);
95
+ expect(result.fromIndex).toBe(-1);
96
+ expect(result.toIndex).toBe(-1);
97
+ });
98
+ test('returns all events when no options provided', async () => {
99
+ const event1 = withSessionId(testSessionId, sessionEvents.create('session_created', {
100
+ presetId: 'test-preset',
101
+ }));
102
+ const agentId = generateTestAgentId();
103
+ const event2 = withSessionId(testSessionId, agentEvents.create('agent_spawned', {
104
+ agentId,
105
+ definitionName: 'test-agent',
106
+ parentId: null,
107
+ }));
108
+ await store.append(testSessionId, event1);
109
+ await store.append(testSessionId, event2);
110
+ const result = await store.loadRange(testSessionId);
111
+ expect(result.events).toHaveLength(2);
112
+ expect(result.fromIndex).toBe(0);
113
+ expect(result.toIndex).toBe(1);
114
+ });
115
+ test('returns events after since index', async () => {
116
+ // Create 10 events
117
+ const events = [];
118
+ for (let i = 0; i < 10; i++) {
119
+ events.push({ ...withSessionId(testSessionId, sessionEvents.create('session_created', { presetId: `preset-${i}` })), timestamp: Date.now() + i });
120
+ }
121
+ await store.appendBatch(testSessionId, events);
122
+ // Load events after index 7 (should get events 8 and 9)
123
+ const result = await store.loadRange(testSessionId, { since: 7 });
124
+ expect(result.events).toHaveLength(2);
125
+ expect(result.fromIndex).toBe(8);
126
+ expect(result.toIndex).toBe(9);
127
+ expect(result.events[0]).toMatchObject({ type: 'session_created', presetId: 'preset-8' });
128
+ expect(result.events[1]).toMatchObject({ type: 'session_created', presetId: 'preset-9' });
129
+ });
130
+ test('returns empty when since equals last index', async () => {
131
+ const event = withSessionId(testSessionId, sessionEvents.create('session_created', {
132
+ presetId: 'test-preset',
133
+ }));
134
+ await store.append(testSessionId, event);
135
+ const result = await store.loadRange(testSessionId, { since: 0 });
136
+ expect(result.events).toEqual([]);
137
+ expect(result.fromIndex).toBe(-1);
138
+ // toIndex still returns the actual last index for polling cursor
139
+ expect(result.toIndex).toBe(0);
140
+ });
141
+ test('returns empty when since exceeds total events', async () => {
142
+ const event = withSessionId(testSessionId, sessionEvents.create('session_created', {
143
+ presetId: 'test-preset',
144
+ }));
145
+ await store.append(testSessionId, event);
146
+ const result = await store.loadRange(testSessionId, { since: 10 });
147
+ expect(result.events).toEqual([]);
148
+ expect(result.fromIndex).toBe(-1);
149
+ // toIndex still returns the actual last index for polling cursor
150
+ expect(result.toIndex).toBe(0);
151
+ });
152
+ test('respects limit parameter', async () => {
153
+ // Create 10 events
154
+ const events = [];
155
+ for (let i = 0; i < 10; i++) {
156
+ events.push({ ...withSessionId(testSessionId, sessionEvents.create('session_created', { presetId: `preset-${i}` })), timestamp: Date.now() + i });
157
+ }
158
+ await store.appendBatch(testSessionId, events);
159
+ // Load max 3 events after index 5
160
+ const result = await store.loadRange(testSessionId, { since: 5, limit: 3 });
161
+ expect(result.events).toHaveLength(3);
162
+ expect(result.fromIndex).toBe(6);
163
+ expect(result.toIndex).toBe(8);
164
+ expect(result.events[0]).toMatchObject({ type: 'session_created', presetId: 'preset-6' });
165
+ expect(result.events[1]).toMatchObject({ type: 'session_created', presetId: 'preset-7' });
166
+ expect(result.events[2]).toMatchObject({ type: 'session_created', presetId: 'preset-8' });
167
+ });
168
+ });
169
+ describe('exists', () => {
170
+ test('returns false for non-existent session', async () => {
171
+ const nonExistentId = generateSessionId();
172
+ const exists = await store.exists(nonExistentId);
173
+ expect(exists).toBe(false);
174
+ });
175
+ test('returns true for existing session', async () => {
176
+ const event = withSessionId(testSessionId, sessionEvents.create('session_created', {
177
+ presetId: 'test-preset',
178
+ }));
179
+ await store.append(testSessionId, event);
180
+ const exists = await store.exists(testSessionId);
181
+ expect(exists).toBe(true);
182
+ });
183
+ });
184
+ describe('listSessions', () => {
185
+ test('returns empty array when no sessions exist', async () => {
186
+ const sessions = await store.listSessions();
187
+ expect(sessions).toEqual([]);
188
+ });
189
+ test('returns all session IDs', async () => {
190
+ const session1 = generateSessionId();
191
+ const session2 = generateSessionId();
192
+ const session3 = generateSessionId();
193
+ await store.append(session1, withSessionId(session1, sessionEvents.create('session_created', {
194
+ presetId: 'test',
195
+ })));
196
+ await store.append(session2, withSessionId(session2, sessionEvents.create('session_created', {
197
+ presetId: 'test',
198
+ })));
199
+ await store.append(session3, withSessionId(session3, sessionEvents.create('session_created', {
200
+ presetId: 'test',
201
+ })));
202
+ const sessions = await store.listSessions();
203
+ expect(sessions).toHaveLength(3);
204
+ expect(sessions).toContain(session1);
205
+ expect(sessions).toContain(session2);
206
+ expect(sessions).toContain(session3);
207
+ });
208
+ });
209
+ describe('test helpers', () => {
210
+ test('clear removes all events', async () => {
211
+ const session1 = generateSessionId();
212
+ const session2 = generateSessionId();
213
+ await store.append(session1, withSessionId(session1, sessionEvents.create('session_created', {
214
+ presetId: 'test',
215
+ })));
216
+ await store.append(session2, withSessionId(session2, sessionEvents.create('session_created', {
217
+ presetId: 'test',
218
+ })));
219
+ store.clear();
220
+ const sessions = await store.listSessions();
221
+ expect(sessions).toEqual([]);
222
+ });
223
+ test('getAll returns a copy of all events', async () => {
224
+ const session1 = generateSessionId();
225
+ await store.append(session1, withSessionId(session1, sessionEvents.create('session_created', {
226
+ presetId: 'test',
227
+ })));
228
+ const all = store.getAll();
229
+ expect(all.size).toBe(1);
230
+ expect(all.get(session1)).toHaveLength(1);
231
+ // Verify it's a copy
232
+ all.clear();
233
+ const sessions = await store.listSessions();
234
+ expect(sessions).toHaveLength(1);
235
+ });
236
+ test('getEventCount returns correct count', async () => {
237
+ await store.append(testSessionId, withSessionId(testSessionId, sessionEvents.create('session_created', {
238
+ presetId: 'test',
239
+ })));
240
+ await store.append(testSessionId, withSessionId(testSessionId, agentEvents.create('agent_spawned', {
241
+ agentId: generateTestAgentId(),
242
+ definitionName: 'test-agent',
243
+ parentId: null,
244
+ })));
245
+ expect(store.getEventCount(testSessionId)).toBe(2);
246
+ expect(store.getEventCount(generateSessionId())).toBe(0);
247
+ });
248
+ test('getLastEvent returns the last event', async () => {
249
+ const agentId = generateTestAgentId();
250
+ await store.append(testSessionId, withSessionId(testSessionId, sessionEvents.create('session_created', {
251
+ presetId: 'test',
252
+ })));
253
+ await store.append(testSessionId, withSessionId(testSessionId, agentEvents.create('agent_spawned', {
254
+ agentId,
255
+ definitionName: 'test-agent',
256
+ parentId: null,
257
+ })));
258
+ const lastEvent = store.getLastEvent(testSessionId);
259
+ expect(lastEvent?.type).toBe('agent_spawned');
260
+ // Non-existent session returns undefined
261
+ expect(store.getLastEvent(generateSessionId())).toBeUndefined();
262
+ });
263
+ test('getEventsByType filters events by type', async () => {
264
+ const agentId = generateTestAgentId();
265
+ await store.append(testSessionId, withSessionId(testSessionId, sessionEvents.create('session_created', {
266
+ presetId: 'test',
267
+ })));
268
+ await store.append(testSessionId, withSessionId(testSessionId, agentEvents.create('agent_spawned', {
269
+ agentId,
270
+ definitionName: 'agent-1',
271
+ parentId: null,
272
+ })));
273
+ await store.append(testSessionId, withSessionId(testSessionId, agentEvents.create('agent_spawned', {
274
+ agentId: generateTestAgentId(),
275
+ definitionName: 'agent-2',
276
+ parentId: null,
277
+ })));
278
+ const sessionCreatedEvents = store.getEventsByType(testSessionId, 'session_created');
279
+ expect(sessionCreatedEvents).toHaveLength(1);
280
+ expect(sessionCreatedEvents[0]?.type).toBe('session_created');
281
+ const agentSpawnedEvents = store.getEventsByType(testSessionId, 'agent_spawned');
282
+ expect(agentSpawnedEvents).toHaveLength(2);
283
+ expect(agentSpawnedEvents[0].definitionName).toBe('agent-1');
284
+ expect(agentSpawnedEvents[1].definitionName).toBe('agent-2');
285
+ // Non-existent type returns empty array
286
+ const closedEvents = store.getEventsByType(testSessionId, 'session_closed');
287
+ expect(closedEvents).toEqual([]);
288
+ });
289
+ });
290
+ describe('metadata', () => {
291
+ test('getMetadata returns null for non-existent session', async () => {
292
+ const nonExistentId = generateSessionId();
293
+ const metadata = await store.getMetadata(nonExistentId);
294
+ expect(metadata).toBeNull();
295
+ });
296
+ test('auto-creates metadata on session_created event', async () => {
297
+ const event = { ...withSessionId(testSessionId, sessionEvents.create('session_created', { presetId: 'test-preset' })), timestamp: 1000 };
298
+ await store.append(testSessionId, event);
299
+ const metadata = await store.getMetadata(testSessionId);
300
+ expect(metadata).not.toBeNull();
301
+ expect(metadata?.sessionId).toBe(testSessionId);
302
+ expect(metadata?.presetId).toBe('test-preset');
303
+ expect(metadata?.createdAt).toBe(1000);
304
+ expect(metadata?.status).toBe('active');
305
+ expect(metadata?.metrics?.totalEvents).toBe(1);
306
+ expect(metadata?.metrics?.totalAgents).toBe(0);
307
+ expect(metadata?.metrics?.totalTokens).toBe(0);
308
+ expect(metadata?.metrics?.totalLLMCalls).toBe(0);
309
+ });
310
+ test('updates metrics on agent_spawned event', async () => {
311
+ await store.append(testSessionId, {
312
+ ...withSessionId(testSessionId, sessionEvents.create('session_created', { presetId: 'test-preset' })),
313
+ timestamp: 1000,
314
+ });
315
+ await store.append(testSessionId, {
316
+ ...withSessionId(testSessionId, agentEvents.create('agent_spawned', {
317
+ agentId: generateTestAgentId(),
318
+ definitionName: 'test-agent',
319
+ parentId: null,
320
+ })),
321
+ timestamp: 2000,
322
+ });
323
+ const metadata = await store.getMetadata(testSessionId);
324
+ expect(metadata?.metrics?.totalEvents).toBe(2);
325
+ expect(metadata?.metrics?.totalAgents).toBe(1);
326
+ expect(metadata?.lastActivityAt).toBe(2000);
327
+ });
328
+ test('updates metrics on inference_completed event', async () => {
329
+ const agentId = generateTestAgentId();
330
+ await store.append(testSessionId, {
331
+ ...withSessionId(testSessionId, sessionEvents.create('session_created', { presetId: 'test-preset' })),
332
+ timestamp: 1000,
333
+ });
334
+ const inferenceEvent = {
335
+ ...withSessionId(testSessionId, llmEvents.create('inference_completed', {
336
+ agentId,
337
+ consumedMessageIds: [],
338
+ response: {
339
+ content: 'test',
340
+ toolCalls: [],
341
+ },
342
+ metrics: {
343
+ promptTokens: 100,
344
+ completionTokens: 50,
345
+ totalTokens: 150,
346
+ latencyMs: 500,
347
+ model: 'test-model',
348
+ },
349
+ })),
350
+ timestamp: 2000,
351
+ };
352
+ await store.append(testSessionId, inferenceEvent);
353
+ const metadata = await store.getMetadata(testSessionId);
354
+ expect(metadata?.metrics?.totalEvents).toBe(2);
355
+ expect(metadata?.metrics?.totalTokens).toBe(150);
356
+ expect(metadata?.metrics?.totalLLMCalls).toBe(1);
357
+ });
358
+ test('updates status on session_closed event', async () => {
359
+ await store.append(testSessionId, {
360
+ ...withSessionId(testSessionId, sessionEvents.create('session_created', { presetId: 'test-preset' })),
361
+ timestamp: 1000,
362
+ });
363
+ const beforeClose = Date.now();
364
+ await store.append(testSessionId, withSessionId(testSessionId, sessionEvents.create('session_closed', {})));
365
+ const metadata = await store.getMetadata(testSessionId);
366
+ expect(metadata?.status).toBe('closed');
367
+ expect(metadata?.lastActivityAt).toBeGreaterThanOrEqual(beforeClose);
368
+ });
369
+ test('updateMetadata updates fields', async () => {
370
+ await store.append(testSessionId, {
371
+ ...withSessionId(testSessionId, sessionEvents.create('session_created', { presetId: 'test-preset' })),
372
+ timestamp: 1000,
373
+ });
374
+ await store.updateMetadata(testSessionId, {
375
+ name: 'My Session',
376
+ tags: ['tag1', 'tag2'],
377
+ });
378
+ const metadata = await store.getMetadata(testSessionId);
379
+ expect(metadata?.name).toBe('My Session');
380
+ expect(metadata?.tags).toEqual(['tag1', 'tag2']);
381
+ });
382
+ });
383
+ describe('listSessionsWithMetadata', () => {
384
+ test('returns empty list when no sessions exist', async () => {
385
+ const result = await store.listSessionsWithMetadata();
386
+ expect(result.sessions).toEqual([]);
387
+ expect(result.total).toBe(0);
388
+ });
389
+ test('returns all sessions with metadata', async () => {
390
+ const session1 = generateSessionId();
391
+ const session2 = generateSessionId();
392
+ await store.append(session1, { ...withSessionId(session1, sessionEvents.create('session_created', { presetId: 'preset-1' })), timestamp: 1000 });
393
+ await store.append(session2, { ...withSessionId(session2, sessionEvents.create('session_created', { presetId: 'preset-2' })), timestamp: 2000 });
394
+ const result = await store.listSessionsWithMetadata();
395
+ expect(result.sessions).toHaveLength(2);
396
+ expect(result.total).toBe(2);
397
+ });
398
+ test('filters by status', async () => {
399
+ const session1 = generateSessionId();
400
+ const session2 = generateSessionId();
401
+ await store.append(session1, { ...withSessionId(session1, sessionEvents.create('session_created', { presetId: 'preset-1' })), timestamp: 1000 });
402
+ await store.append(session2, { ...withSessionId(session2, sessionEvents.create('session_created', { presetId: 'preset-2' })), timestamp: 2000 });
403
+ await store.append(session2, withSessionId(session2, sessionEvents.create('session_closed', {})));
404
+ const activeResult = await store.listSessionsWithMetadata({
405
+ status: 'active',
406
+ });
407
+ expect(activeResult.sessions).toHaveLength(1);
408
+ expect(activeResult.sessions[0]?.sessionId).toBe(session1);
409
+ const closedResult = await store.listSessionsWithMetadata({
410
+ status: 'closed',
411
+ });
412
+ expect(closedResult.sessions).toHaveLength(1);
413
+ expect(closedResult.sessions[0]?.sessionId).toBe(session2);
414
+ });
415
+ test('filters by tags', async () => {
416
+ const session1 = generateSessionId();
417
+ const session2 = generateSessionId();
418
+ await store.append(session1, { ...withSessionId(session1, sessionEvents.create('session_created', { presetId: 'preset-1' })), timestamp: 1000 });
419
+ await store.append(session2, { ...withSessionId(session2, sessionEvents.create('session_created', { presetId: 'preset-2' })), timestamp: 2000 });
420
+ await store.updateMetadata(session1, { tags: ['important', 'project-a'] });
421
+ await store.updateMetadata(session2, { tags: ['project-b'] });
422
+ const result = await store.listSessionsWithMetadata({
423
+ tags: ['important'],
424
+ });
425
+ expect(result.sessions).toHaveLength(1);
426
+ expect(result.sessions[0]?.sessionId).toBe(session1);
427
+ });
428
+ test('sorts by createdAt descending by default', async () => {
429
+ const session1 = generateSessionId();
430
+ const session2 = generateSessionId();
431
+ const session3 = generateSessionId();
432
+ await store.append(session1, { ...withSessionId(session1, sessionEvents.create('session_created', { presetId: 'preset-1' })), timestamp: 1000 });
433
+ await store.append(session2, { ...withSessionId(session2, sessionEvents.create('session_created', { presetId: 'preset-2' })), timestamp: 3000 });
434
+ await store.append(session3, { ...withSessionId(session3, sessionEvents.create('session_created', { presetId: 'preset-3' })), timestamp: 2000 });
435
+ const result = await store.listSessionsWithMetadata();
436
+ expect(result.sessions[0]?.sessionId).toBe(session2);
437
+ expect(result.sessions[1]?.sessionId).toBe(session3);
438
+ expect(result.sessions[2]?.sessionId).toBe(session1);
439
+ });
440
+ test('sorts by lastActivityAt ascending', async () => {
441
+ const session1 = generateSessionId();
442
+ const session2 = generateSessionId();
443
+ await store.append(session1, { ...withSessionId(session1, sessionEvents.create('session_created', { presetId: 'preset-1' })), timestamp: 1000 });
444
+ await store.append(session2, { ...withSessionId(session2, sessionEvents.create('session_created', { presetId: 'preset-2' })), timestamp: 2000 });
445
+ // Add activity to session1 later
446
+ await store.append(session1, {
447
+ ...withSessionId(session1, agentEvents.create('agent_spawned', {
448
+ agentId: generateTestAgentId(),
449
+ definitionName: 'test-agent',
450
+ parentId: null,
451
+ })),
452
+ timestamp: 5000,
453
+ });
454
+ const result = await store.listSessionsWithMetadata({
455
+ orderBy: 'lastActivityAt',
456
+ order: 'asc',
457
+ });
458
+ expect(result.sessions[0]?.sessionId).toBe(session2);
459
+ expect(result.sessions[1]?.sessionId).toBe(session1);
460
+ });
461
+ test('paginates results', async () => {
462
+ const sessions = [];
463
+ for (let i = 0; i < 5; i++) {
464
+ const sessionId = generateSessionId();
465
+ sessions.push(sessionId);
466
+ await store.append(sessionId, {
467
+ ...withSessionId(sessionId, sessionEvents.create('session_created', { presetId: `preset-${i}` })),
468
+ timestamp: i * 1000,
469
+ });
470
+ }
471
+ const page1 = await store.listSessionsWithMetadata({
472
+ limit: 2,
473
+ offset: 0,
474
+ orderBy: 'createdAt',
475
+ order: 'asc',
476
+ });
477
+ expect(page1.sessions).toHaveLength(2);
478
+ expect(page1.total).toBe(5);
479
+ expect(page1.sessions[0]?.presetId).toBe('preset-0');
480
+ expect(page1.sessions[1]?.presetId).toBe('preset-1');
481
+ const page2 = await store.listSessionsWithMetadata({
482
+ limit: 2,
483
+ offset: 2,
484
+ orderBy: 'createdAt',
485
+ order: 'asc',
486
+ });
487
+ expect(page2.sessions).toHaveLength(2);
488
+ expect(page2.sessions[0]?.presetId).toBe('preset-2');
489
+ expect(page2.sessions[1]?.presetId).toBe('preset-3');
490
+ });
491
+ test('clear removes metadata too', async () => {
492
+ const session1 = generateSessionId();
493
+ await store.append(session1, { ...withSessionId(session1, sessionEvents.create('session_created', { presetId: 'test' })), timestamp: 1000 });
494
+ store.clear();
495
+ const metadata = await store.getMetadata(session1);
496
+ expect(metadata).toBeNull();
497
+ const result = await store.listSessionsWithMetadata();
498
+ expect(result.sessions).toEqual([]);
499
+ });
500
+ });
501
+ });
502
+ //# sourceMappingURL=memory.test.js.map