@roj-ai/sdk 0.1.36 → 0.2.2

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 (925) hide show
  1. package/dist/bootstrap.d.ts +420 -26
  2. package/dist/bootstrap.d.ts.map +1 -1
  3. package/dist/bootstrap.js +55 -24
  4. package/dist/bootstrap.js.map +1 -1
  5. package/dist/bun-platform/fs.d.ts.map +1 -1
  6. package/dist/bun-platform/fs.js +1 -0
  7. package/dist/bun-platform/fs.js.map +1 -1
  8. package/dist/bun-platform/index.d.ts +4 -1
  9. package/dist/bun-platform/index.d.ts.map +1 -1
  10. package/dist/bun-platform/index.js +7 -1
  11. package/dist/bun-platform/index.js.map +1 -1
  12. package/dist/bun-platform/server-lifecycle.d.ts +30 -0
  13. package/dist/bun-platform/server-lifecycle.d.ts.map +1 -0
  14. package/dist/bun-platform/server-lifecycle.js +182 -0
  15. package/dist/bun-platform/server-lifecycle.js.map +1 -0
  16. package/dist/bun-platform/shell.d.ts +33 -0
  17. package/dist/bun-platform/shell.d.ts.map +1 -0
  18. package/dist/bun-platform/shell.js +322 -0
  19. package/dist/bun-platform/shell.js.map +1 -0
  20. package/dist/config.d.ts +34 -0
  21. package/dist/config.d.ts.map +1 -1
  22. package/dist/config.js +97 -0
  23. package/dist/config.js.map +1 -1
  24. package/dist/core/agents/agent.d.ts +42 -7
  25. package/dist/core/agents/agent.d.ts.map +1 -1
  26. package/dist/core/agents/agent.js +202 -87
  27. package/dist/core/agents/agent.js.map +1 -1
  28. package/dist/core/agents/config.d.ts +8 -1
  29. package/dist/core/agents/config.d.ts.map +1 -1
  30. package/dist/core/agents/config.js +5 -1
  31. package/dist/core/agents/config.js.map +1 -1
  32. package/dist/core/agents/retry.d.ts +1 -1
  33. package/dist/core/agents/retry.d.ts.map +1 -1
  34. package/dist/core/agents/retry.js +14 -16
  35. package/dist/core/agents/retry.js.map +1 -1
  36. package/dist/core/agents/state.d.ts +3 -1
  37. package/dist/core/agents/state.d.ts.map +1 -1
  38. package/dist/core/agents/state.js +1 -1
  39. package/dist/core/agents/state.js.map +1 -1
  40. package/dist/core/context/state.d.ts +3 -3
  41. package/dist/core/context/state.js +2 -2
  42. package/dist/core/events/base-event-store.d.ts.map +1 -1
  43. package/dist/core/events/base-event-store.js +22 -14
  44. package/dist/core/events/base-event-store.js.map +1 -1
  45. package/dist/core/events/file.d.ts +39 -1
  46. package/dist/core/events/file.d.ts.map +1 -1
  47. package/dist/core/events/file.js +159 -20
  48. package/dist/core/events/file.js.map +1 -1
  49. package/dist/core/events/types.d.ts +1 -1
  50. package/dist/core/file-store/containment.d.ts +19 -0
  51. package/dist/core/file-store/containment.d.ts.map +1 -0
  52. package/dist/core/file-store/containment.js +62 -0
  53. package/dist/core/file-store/containment.js.map +1 -0
  54. package/dist/core/file-store/file-store.d.ts +22 -2
  55. package/dist/core/file-store/file-store.d.ts.map +1 -1
  56. package/dist/core/file-store/file-store.js +88 -20
  57. package/dist/core/file-store/file-store.js.map +1 -1
  58. package/dist/core/file-store/types.d.ts +13 -1
  59. package/dist/core/file-store/types.d.ts.map +1 -1
  60. package/dist/core/image/image-processor.d.ts.map +1 -1
  61. package/dist/core/image/image-processor.js +3 -1
  62. package/dist/core/image/image-processor.js.map +1 -1
  63. package/dist/core/image/types.d.ts +2 -0
  64. package/dist/core/image/types.d.ts.map +1 -1
  65. package/dist/core/image/vips-resizer.d.ts.map +1 -1
  66. package/dist/core/image/vips-resizer.js +81 -33
  67. package/dist/core/image/vips-resizer.js.map +1 -1
  68. package/dist/core/llm/anthropic.d.ts +0 -1
  69. package/dist/core/llm/anthropic.d.ts.map +1 -1
  70. package/dist/core/llm/anthropic.js +58 -72
  71. package/dist/core/llm/anthropic.js.map +1 -1
  72. package/dist/core/llm/logger.d.ts +14 -2
  73. package/dist/core/llm/logger.d.ts.map +1 -1
  74. package/dist/core/llm/logger.js +161 -36
  75. package/dist/core/llm/logger.js.map +1 -1
  76. package/dist/core/llm/openrouter.d.ts +0 -1
  77. package/dist/core/llm/openrouter.d.ts.map +1 -1
  78. package/dist/core/llm/openrouter.js +53 -66
  79. package/dist/core/llm/openrouter.js.map +1 -1
  80. package/dist/core/llm/provider-request.d.ts +10 -0
  81. package/dist/core/llm/provider-request.d.ts.map +1 -0
  82. package/dist/core/llm/provider-request.js +41 -0
  83. package/dist/core/llm/provider-request.js.map +1 -0
  84. package/dist/core/llm/provider.d.ts +11 -0
  85. package/dist/core/llm/provider.d.ts.map +1 -1
  86. package/dist/core/llm/provider.js +26 -0
  87. package/dist/core/llm/provider.js.map +1 -1
  88. package/dist/core/llm/state.d.ts +2 -2
  89. package/dist/core/llm/state.js +4 -4
  90. package/dist/core/plugins/plugin-builder.d.ts +57 -3
  91. package/dist/core/plugins/plugin-builder.d.ts.map +1 -1
  92. package/dist/core/plugins/plugin-builder.js +68 -14
  93. package/dist/core/plugins/plugin-builder.js.map +1 -1
  94. package/dist/core/preset/preset-builder.d.ts +3 -2
  95. package/dist/core/preset/preset-builder.d.ts.map +1 -1
  96. package/dist/core/preset/preset-builder.js +7 -16
  97. package/dist/core/preset/preset-builder.js.map +1 -1
  98. package/dist/core/sessions/context.d.ts +23 -5
  99. package/dist/core/sessions/context.d.ts.map +1 -1
  100. package/dist/core/sessions/runtime-activity.d.ts +33 -0
  101. package/dist/core/sessions/runtime-activity.d.ts.map +1 -0
  102. package/dist/core/sessions/runtime-activity.js +55 -0
  103. package/dist/core/sessions/runtime-activity.js.map +1 -0
  104. package/dist/core/sessions/schema.d.ts +23 -2
  105. package/dist/core/sessions/schema.d.ts.map +1 -1
  106. package/dist/core/sessions/schema.js +24 -3
  107. package/dist/core/sessions/schema.js.map +1 -1
  108. package/dist/core/sessions/session-manager.d.ts +83 -6
  109. package/dist/core/sessions/session-manager.d.ts.map +1 -1
  110. package/dist/core/sessions/session-manager.js +517 -118
  111. package/dist/core/sessions/session-manager.js.map +1 -1
  112. package/dist/core/sessions/session-store.d.ts +18 -0
  113. package/dist/core/sessions/session-store.d.ts.map +1 -1
  114. package/dist/core/sessions/session-store.js +33 -0
  115. package/dist/core/sessions/session-store.js.map +1 -1
  116. package/dist/core/sessions/session.d.ts +42 -6
  117. package/dist/core/sessions/session.d.ts.map +1 -1
  118. package/dist/core/sessions/session.js +176 -44
  119. package/dist/core/sessions/session.js.map +1 -1
  120. package/dist/core/sessions/state.d.ts +10 -1
  121. package/dist/core/sessions/state.d.ts.map +1 -1
  122. package/dist/core/sessions/state.js +11 -1
  123. package/dist/core/sessions/state.js.map +1 -1
  124. package/dist/core/system.d.ts +9 -0
  125. package/dist/core/system.d.ts.map +1 -1
  126. package/dist/core/system.js +4 -1
  127. package/dist/core/system.js.map +1 -1
  128. package/dist/core/tools/executor.d.ts +1 -1
  129. package/dist/core/wake-key.d.ts +34 -0
  130. package/dist/core/wake-key.d.ts.map +1 -0
  131. package/dist/core/wake-key.js +51 -0
  132. package/dist/core/wake-key.js.map +1 -0
  133. package/dist/index.d.ts +25 -13
  134. package/dist/index.d.ts.map +1 -1
  135. package/dist/index.js +23 -8
  136. package/dist/index.js.map +1 -1
  137. package/dist/lib/archive/archive-inspection.d.ts +48 -0
  138. package/dist/lib/archive/archive-inspection.d.ts.map +1 -0
  139. package/dist/lib/archive/archive-inspection.fixtures.d.ts +7 -0
  140. package/dist/lib/archive/archive-inspection.fixtures.d.ts.map +1 -0
  141. package/dist/lib/archive/archive-inspection.fixtures.js +134 -0
  142. package/dist/lib/archive/archive-inspection.fixtures.js.map +1 -0
  143. package/dist/lib/archive/archive-inspection.js +253 -0
  144. package/dist/lib/archive/archive-inspection.js.map +1 -0
  145. package/dist/lib/archive/index.d.ts +3 -0
  146. package/dist/lib/archive/index.d.ts.map +1 -0
  147. package/dist/lib/archive/index.js +2 -0
  148. package/dist/lib/archive/index.js.map +1 -0
  149. package/dist/lib/logger/console.d.ts +5 -12
  150. package/dist/lib/logger/console.d.ts.map +1 -1
  151. package/dist/lib/logger/console.js +5 -47
  152. package/dist/lib/logger/console.js.map +1 -1
  153. package/dist/lib/logger/file.d.ts +8 -11
  154. package/dist/lib/logger/file.d.ts.map +1 -1
  155. package/dist/lib/logger/file.js +26 -37
  156. package/dist/lib/logger/file.js.map +1 -1
  157. package/dist/lib/logger/index.d.ts +3 -1
  158. package/dist/lib/logger/index.d.ts.map +1 -1
  159. package/dist/lib/logger/index.js +3 -1
  160. package/dist/lib/logger/index.js.map +1 -1
  161. package/dist/lib/logger/jsonl.d.ts +21 -0
  162. package/dist/lib/logger/jsonl.d.ts.map +1 -0
  163. package/dist/lib/logger/jsonl.js +29 -0
  164. package/dist/lib/logger/jsonl.js.map +1 -0
  165. package/dist/lib/logger/logger.d.ts +22 -0
  166. package/dist/lib/logger/logger.d.ts.map +1 -1
  167. package/dist/lib/logger/logger.js +37 -0
  168. package/dist/lib/logger/logger.js.map +1 -1
  169. package/dist/lib/logger/session-log.d.ts +21 -0
  170. package/dist/lib/logger/session-log.d.ts.map +1 -0
  171. package/dist/lib/logger/session-log.js +37 -0
  172. package/dist/lib/logger/session-log.js.map +1 -0
  173. package/dist/lib/utils/concurrency.d.ts +1 -1
  174. package/dist/lib/utils/concurrency.d.ts.map +1 -1
  175. package/dist/lib/utils/concurrency.js +30 -7
  176. package/dist/lib/utils/concurrency.js.map +1 -1
  177. package/dist/lib/utils/fs-batch.d.ts +17 -0
  178. package/dist/lib/utils/fs-batch.d.ts.map +1 -0
  179. package/dist/lib/utils/fs-batch.js +38 -0
  180. package/dist/lib/utils/fs-batch.js.map +1 -0
  181. package/dist/lib/utils/result.d.ts +7 -22
  182. package/dist/lib/utils/result.d.ts.map +1 -1
  183. package/dist/lib/utils/result.js +6 -17
  184. package/dist/lib/utils/result.js.map +1 -1
  185. package/dist/lib/utils/sleep.d.ts +10 -0
  186. package/dist/lib/utils/sleep.d.ts.map +1 -0
  187. package/dist/lib/utils/sleep.js +26 -0
  188. package/dist/lib/utils/sleep.js.map +1 -0
  189. package/dist/platform/fs-revision.d.ts +21 -0
  190. package/dist/platform/fs-revision.d.ts.map +1 -0
  191. package/dist/platform/fs-revision.js +9 -0
  192. package/dist/platform/fs-revision.js.map +1 -0
  193. package/dist/platform/fs.d.ts +104 -1
  194. package/dist/platform/fs.d.ts.map +1 -1
  195. package/dist/platform/git.d.ts +59 -0
  196. package/dist/platform/git.d.ts.map +1 -0
  197. package/dist/platform/git.js +8 -0
  198. package/dist/platform/git.js.map +1 -0
  199. package/dist/platform/index.d.ts +40 -1
  200. package/dist/platform/index.d.ts.map +1 -1
  201. package/dist/platform/index.js +1 -1
  202. package/dist/platform/index.js.map +1 -1
  203. package/dist/platform/llm-call-log.d.ts +80 -0
  204. package/dist/platform/llm-call-log.d.ts.map +1 -0
  205. package/dist/platform/llm-call-log.js +12 -0
  206. package/dist/platform/llm-call-log.js.map +1 -0
  207. package/dist/platform/scheduler.d.ts +32 -0
  208. package/dist/platform/scheduler.d.ts.map +1 -0
  209. package/dist/platform/scheduler.js +46 -0
  210. package/dist/platform/scheduler.js.map +1 -0
  211. package/dist/platform/session-log.d.ts +36 -0
  212. package/dist/platform/session-log.d.ts.map +1 -0
  213. package/dist/platform/session-log.js +12 -0
  214. package/dist/platform/session-log.js.map +1 -0
  215. package/dist/platform/shell.d.ts +83 -0
  216. package/dist/platform/shell.d.ts.map +1 -0
  217. package/dist/platform/shell.js +13 -0
  218. package/dist/platform/shell.js.map +1 -0
  219. package/dist/plugins/agent-status/plugin.d.ts.map +1 -1
  220. package/dist/plugins/agent-status/plugin.js +1 -0
  221. package/dist/plugins/agent-status/plugin.js.map +1 -1
  222. package/dist/plugins/agents/plugin.d.ts.map +1 -1
  223. package/dist/plugins/agents/plugin.js +129 -62
  224. package/dist/plugins/agents/plugin.js.map +1 -1
  225. package/dist/plugins/filesystem/listing.d.ts +3 -0
  226. package/dist/plugins/filesystem/listing.d.ts.map +1 -1
  227. package/dist/plugins/filesystem/listing.js +66 -10
  228. package/dist/plugins/filesystem/listing.js.map +1 -1
  229. package/dist/plugins/filesystem/plugin.d.ts.map +1 -1
  230. package/dist/plugins/filesystem/plugin.js +8 -6
  231. package/dist/plugins/filesystem/plugin.js.map +1 -1
  232. package/dist/plugins/git-status/index.d.ts +1 -0
  233. package/dist/plugins/git-status/index.d.ts.map +1 -1
  234. package/dist/plugins/git-status/plugin.d.ts +38 -7
  235. package/dist/plugins/git-status/plugin.d.ts.map +1 -1
  236. package/dist/plugins/git-status/plugin.js +169 -64
  237. package/dist/plugins/git-status/plugin.js.map +1 -1
  238. package/dist/plugins/llm-debug/plugin.d.ts.map +1 -1
  239. package/dist/plugins/llm-debug/plugin.js +1 -0
  240. package/dist/plugins/llm-debug/plugin.js.map +1 -1
  241. package/dist/plugins/logs/plugin.d.ts +1 -4
  242. package/dist/plugins/logs/plugin.d.ts.map +1 -1
  243. package/dist/plugins/logs/plugin.js +7 -0
  244. package/dist/plugins/logs/plugin.js.map +1 -1
  245. package/dist/plugins/mailbox/helpers.d.ts +2 -2
  246. package/dist/plugins/mailbox/helpers.js +1 -1
  247. package/dist/plugins/mailbox/plugin.d.ts.map +1 -1
  248. package/dist/plugins/mailbox/plugin.js +38 -43
  249. package/dist/plugins/mailbox/plugin.js.map +1 -1
  250. package/dist/plugins/mailbox/query.d.ts +7 -2
  251. package/dist/plugins/mailbox/query.d.ts.map +1 -1
  252. package/dist/plugins/mailbox/query.js +14 -7
  253. package/dist/plugins/mailbox/query.js.map +1 -1
  254. package/dist/plugins/mailbox/state.d.ts +5 -4
  255. package/dist/plugins/mailbox/state.d.ts.map +1 -1
  256. package/dist/plugins/mailbox/state.js +6 -5
  257. package/dist/plugins/mailbox/state.js.map +1 -1
  258. package/dist/plugins/resources/filename.d.ts +4 -0
  259. package/dist/plugins/resources/filename.d.ts.map +1 -0
  260. package/dist/plugins/resources/filename.js +18 -0
  261. package/dist/plugins/resources/filename.js.map +1 -0
  262. package/dist/plugins/resources/plugin.d.ts +3 -0
  263. package/dist/plugins/resources/plugin.d.ts.map +1 -1
  264. package/dist/plugins/resources/plugin.js +97 -60
  265. package/dist/plugins/resources/plugin.js.map +1 -1
  266. package/dist/plugins/resources/state.d.ts +1 -1
  267. package/dist/plugins/resources/state.js +1 -1
  268. package/dist/plugins/result-eviction/plugin.d.ts.map +1 -1
  269. package/dist/plugins/result-eviction/plugin.js +6 -1
  270. package/dist/plugins/result-eviction/plugin.js.map +1 -1
  271. package/dist/plugins/services/plugin.d.ts +4 -1
  272. package/dist/plugins/services/plugin.d.ts.map +1 -1
  273. package/dist/plugins/services/plugin.js +251 -100
  274. package/dist/plugins/services/plugin.js.map +1 -1
  275. package/dist/plugins/services/prompt.d.ts.map +1 -1
  276. package/dist/plugins/services/prompt.js +1 -4
  277. package/dist/plugins/services/prompt.js.map +1 -1
  278. package/dist/plugins/services/schema.d.ts +15 -5
  279. package/dist/plugins/services/schema.d.ts.map +1 -1
  280. package/dist/plugins/services/service.d.ts +100 -18
  281. package/dist/plugins/services/service.d.ts.map +1 -1
  282. package/dist/plugins/services/service.js +680 -230
  283. package/dist/plugins/services/service.js.map +1 -1
  284. package/dist/plugins/session-lifecycle/plugin.d.ts +21 -1
  285. package/dist/plugins/session-lifecycle/plugin.d.ts.map +1 -1
  286. package/dist/plugins/session-lifecycle/plugin.js +53 -40
  287. package/dist/plugins/session-lifecycle/plugin.js.map +1 -1
  288. package/dist/plugins/session-state/plugin.d.ts +21 -13
  289. package/dist/plugins/session-state/plugin.d.ts.map +1 -1
  290. package/dist/plugins/session-state/plugin.js +214 -79
  291. package/dist/plugins/session-state/plugin.js.map +1 -1
  292. package/dist/plugins/session-stats/plugin.d.ts.map +1 -1
  293. package/dist/plugins/session-stats/plugin.js +1 -0
  294. package/dist/plugins/session-stats/plugin.js.map +1 -1
  295. package/dist/plugins/shell/executor.d.ts +17 -15
  296. package/dist/plugins/shell/executor.d.ts.map +1 -1
  297. package/dist/plugins/shell/executor.js +130 -195
  298. package/dist/plugins/shell/executor.js.map +1 -1
  299. package/dist/plugins/shell/index.d.ts +2 -2
  300. package/dist/plugins/shell/index.d.ts.map +1 -1
  301. package/dist/plugins/shell/index.js +2 -2
  302. package/dist/plugins/shell/index.js.map +1 -1
  303. package/dist/plugins/shell/plugin.d.ts +5 -4
  304. package/dist/plugins/shell/plugin.d.ts.map +1 -1
  305. package/dist/plugins/shell/plugin.js +4 -8
  306. package/dist/plugins/shell/plugin.js.map +1 -1
  307. package/dist/plugins/skills/discovery.d.ts.map +1 -1
  308. package/dist/plugins/skills/discovery.js +10 -8
  309. package/dist/plugins/skills/discovery.js.map +1 -1
  310. package/dist/plugins/skills/index.d.ts +1 -1
  311. package/dist/plugins/skills/index.d.ts.map +1 -1
  312. package/dist/plugins/skills/plugin.d.ts +1 -1
  313. package/dist/plugins/skills/plugin.d.ts.map +1 -1
  314. package/dist/plugins/skills/plugin.js +23 -30
  315. package/dist/plugins/skills/plugin.js.map +1 -1
  316. package/dist/plugins/skills/prompts.d.ts +3 -3
  317. package/dist/plugins/skills/prompts.d.ts.map +1 -1
  318. package/dist/plugins/skills/prompts.js.map +1 -1
  319. package/dist/plugins/skills/schema.d.ts +4 -2
  320. package/dist/plugins/skills/schema.d.ts.map +1 -1
  321. package/dist/plugins/todo/schema.d.ts +1 -1
  322. package/dist/plugins/uploads/plugin.d.ts +11 -4
  323. package/dist/plugins/uploads/plugin.d.ts.map +1 -1
  324. package/dist/plugins/uploads/plugin.js +891 -225
  325. package/dist/plugins/uploads/plugin.js.map +1 -1
  326. package/dist/plugins/uploads/preprocessor.d.ts +14 -0
  327. package/dist/plugins/uploads/preprocessor.d.ts.map +1 -1
  328. package/dist/plugins/uploads/preprocessor.js +11 -0
  329. package/dist/plugins/uploads/preprocessor.js.map +1 -1
  330. package/dist/plugins/uploads/preprocessors/image-classifier.d.ts +1 -1
  331. package/dist/plugins/uploads/preprocessors/image-classifier.d.ts.map +1 -1
  332. package/dist/plugins/uploads/preprocessors/image-classifier.js +51 -26
  333. package/dist/plugins/uploads/preprocessors/image-classifier.js.map +1 -1
  334. package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.d.ts +2 -2
  335. package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.d.ts.map +1 -1
  336. package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.js +41 -16
  337. package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.js.map +1 -1
  338. package/dist/plugins/uploads/preprocessors/pdf-preprocessor.d.ts +1 -1
  339. package/dist/plugins/uploads/preprocessors/pdf-preprocessor.d.ts.map +1 -1
  340. package/dist/plugins/uploads/preprocessors/pdf-preprocessor.js +29 -14
  341. package/dist/plugins/uploads/preprocessors/pdf-preprocessor.js.map +1 -1
  342. package/dist/plugins/uploads/preprocessors/zip-preprocessor.d.ts +1 -1
  343. package/dist/plugins/uploads/preprocessors/zip-preprocessor.d.ts.map +1 -1
  344. package/dist/plugins/uploads/preprocessors/zip-preprocessor.js +62 -34
  345. package/dist/plugins/uploads/preprocessors/zip-preprocessor.js.map +1 -1
  346. package/dist/plugins/uploads/schema.d.ts +25 -2
  347. package/dist/plugins/uploads/schema.d.ts.map +1 -1
  348. package/dist/plugins/uploads/schema.js +24 -3
  349. package/dist/plugins/uploads/schema.js.map +1 -1
  350. package/dist/plugins/uploads/state.d.ts +13 -1
  351. package/dist/plugins/uploads/state.d.ts.map +1 -1
  352. package/dist/plugins/uploads/state.js +4 -1
  353. package/dist/plugins/uploads/state.js.map +1 -1
  354. package/dist/plugins/user-chat/plugin.d.ts +12 -5
  355. package/dist/plugins/user-chat/plugin.d.ts.map +1 -1
  356. package/dist/plugins/user-chat/plugin.js +141 -32
  357. package/dist/plugins/user-chat/plugin.js.map +1 -1
  358. package/dist/plugins/workers/context.d.ts +35 -13
  359. package/dist/plugins/workers/context.d.ts.map +1 -1
  360. package/dist/plugins/workers/context.js +82 -32
  361. package/dist/plugins/workers/context.js.map +1 -1
  362. package/dist/plugins/workers/definition.d.ts +7 -0
  363. package/dist/plugins/workers/definition.d.ts.map +1 -1
  364. package/dist/plugins/workers/definition.js.map +1 -1
  365. package/dist/plugins/workers/index.d.ts +4 -4
  366. package/dist/plugins/workers/index.d.ts.map +1 -1
  367. package/dist/plugins/workers/index.js +2 -2
  368. package/dist/plugins/workers/index.js.map +1 -1
  369. package/dist/plugins/workers/plugin.d.ts +10 -57
  370. package/dist/plugins/workers/plugin.d.ts.map +1 -1
  371. package/dist/plugins/workers/plugin.js +385 -123
  372. package/dist/plugins/workers/plugin.js.map +1 -1
  373. package/dist/plugins/workers/state.d.ts +69 -0
  374. package/dist/plugins/workers/state.d.ts.map +1 -0
  375. package/dist/plugins/workers/state.js +52 -0
  376. package/dist/plugins/workers/state.js.map +1 -0
  377. package/dist/plugins/workers/worker.d.ts +15 -4
  378. package/dist/plugins/workers/worker.d.ts.map +1 -1
  379. package/dist/testing/conformance.d.ts +106 -0
  380. package/dist/testing/conformance.d.ts.map +1 -0
  381. package/dist/testing/conformance.js +1463 -0
  382. package/dist/testing/conformance.js.map +1 -0
  383. package/dist/testing/node-platform.d.ts.map +1 -1
  384. package/dist/testing/node-platform.js +5 -0
  385. package/dist/testing/node-platform.js.map +1 -1
  386. package/dist/testing/test-harness.d.ts +11 -1
  387. package/dist/testing/test-harness.d.ts.map +1 -1
  388. package/dist/testing/test-harness.js +17 -37
  389. package/dist/testing/test-harness.js.map +1 -1
  390. package/dist/testing/wait-helpers.d.ts.map +1 -1
  391. package/dist/testing/wait-helpers.js +1 -3
  392. package/dist/testing/wait-helpers.js.map +1 -1
  393. package/dist/transport/adapter/client-adapter.d.ts +6 -0
  394. package/dist/transport/adapter/client-adapter.d.ts.map +1 -1
  395. package/dist/transport/adapter/client-adapter.js +50 -3
  396. package/dist/transport/adapter/client-adapter.js.map +1 -1
  397. package/dist/transport/adapter/heartbeat.d.ts +16 -0
  398. package/dist/transport/adapter/heartbeat.d.ts.map +1 -0
  399. package/dist/transport/adapter/heartbeat.js +41 -0
  400. package/dist/transport/adapter/heartbeat.js.map +1 -0
  401. package/dist/transport/adapter/server-adapter.d.ts.map +1 -1
  402. package/dist/transport/adapter/server-adapter.js +6 -0
  403. package/dist/transport/adapter/server-adapter.js.map +1 -1
  404. package/dist/transport/http/app.d.ts +3 -30
  405. package/dist/transport/http/app.d.ts.map +1 -1
  406. package/dist/transport/http/app.js +3 -7
  407. package/dist/transport/http/app.js.map +1 -1
  408. package/dist/transport/http/context.d.ts +40 -0
  409. package/dist/transport/http/context.d.ts.map +1 -0
  410. package/dist/transport/http/context.js +17 -0
  411. package/dist/transport/http/context.js.map +1 -0
  412. package/dist/transport/http/fetch-guard.d.ts +49 -0
  413. package/dist/transport/http/fetch-guard.d.ts.map +1 -0
  414. package/dist/transport/http/fetch-guard.js +312 -0
  415. package/dist/transport/http/fetch-guard.js.map +1 -0
  416. package/dist/transport/http/index.d.ts +1 -1
  417. package/dist/transport/http/index.d.ts.map +1 -1
  418. package/dist/transport/http/middleware/bearer-auth.d.ts +1 -1
  419. package/dist/transport/http/middleware/bearer-auth.d.ts.map +1 -1
  420. package/dist/transport/http/middleware/error-handler.d.ts +2 -2
  421. package/dist/transport/http/middleware/error-handler.d.ts.map +1 -1
  422. package/dist/transport/http/path-containment.d.ts +20 -0
  423. package/dist/transport/http/path-containment.d.ts.map +1 -0
  424. package/dist/transport/http/path-containment.js +31 -0
  425. package/dist/transport/http/path-containment.js.map +1 -0
  426. package/dist/transport/http/responses.d.ts +30 -0
  427. package/dist/transport/http/responses.d.ts.map +1 -0
  428. package/dist/transport/http/responses.js +5 -0
  429. package/dist/transport/http/responses.js.map +1 -0
  430. package/dist/transport/http/routes/files.d.ts +1 -1
  431. package/dist/transport/http/routes/files.d.ts.map +1 -1
  432. package/dist/transport/http/routes/files.js +54 -155
  433. package/dist/transport/http/routes/files.js.map +1 -1
  434. package/dist/transport/http/routes/resources.d.ts +1 -1
  435. package/dist/transport/http/routes/resources.d.ts.map +1 -1
  436. package/dist/transport/http/routes/resources.js +92 -57
  437. package/dist/transport/http/routes/resources.js.map +1 -1
  438. package/dist/transport/http/routes/rpc.d.ts +6 -1
  439. package/dist/transport/http/routes/rpc.d.ts.map +1 -1
  440. package/dist/transport/http/routes/rpc.js +51 -21
  441. package/dist/transport/http/routes/rpc.js.map +1 -1
  442. package/dist/transport/http/routes/upload.d.ts +1 -1
  443. package/dist/transport/http/routes/upload.d.ts.map +1 -1
  444. package/dist/transport/http/routes/upload.js +256 -169
  445. package/dist/transport/http/routes/upload.js.map +1 -1
  446. package/dist/user-config.d.ts +34 -7
  447. package/dist/user-config.d.ts.map +1 -1
  448. package/dist/user-config.js +71 -0
  449. package/dist/user-config.js.map +1 -1
  450. package/package.json +17 -7
  451. package/src/bootstrap.ts +119 -35
  452. package/src/bun-platform/fs.ts +1 -0
  453. package/src/bun-platform/index.ts +18 -1
  454. package/src/bun-platform/server-lifecycle.ts +218 -0
  455. package/src/bun-platform/shell.ts +362 -0
  456. package/src/config.ts +130 -0
  457. package/src/core/agents/agent.ts +210 -92
  458. package/src/core/agents/config.ts +8 -0
  459. package/src/core/agents/retry.ts +16 -17
  460. package/src/core/agents/state.ts +2 -0
  461. package/src/core/events/base-event-store.ts +24 -16
  462. package/src/core/events/file.ts +198 -22
  463. package/src/core/file-store/containment.ts +75 -0
  464. package/src/core/file-store/file-store.ts +106 -25
  465. package/src/core/file-store/types.ts +14 -1
  466. package/src/core/image/image-processor.ts +3 -1
  467. package/src/core/image/types.ts +2 -0
  468. package/src/core/image/vips-resizer.ts +102 -37
  469. package/src/core/llm/anthropic.ts +63 -79
  470. package/src/core/llm/logger.ts +175 -37
  471. package/src/core/llm/openrouter.ts +57 -72
  472. package/src/core/llm/provider-request.ts +40 -0
  473. package/src/core/llm/provider.ts +28 -0
  474. package/src/core/plugins/plugin-builder.ts +106 -14
  475. package/src/core/preset/preset-builder.ts +12 -22
  476. package/src/core/sessions/context.ts +18 -0
  477. package/src/core/sessions/runtime-activity.ts +78 -0
  478. package/src/core/sessions/schema.ts +29 -3
  479. package/src/core/sessions/session-manager.ts +560 -140
  480. package/src/core/sessions/session-store.ts +38 -0
  481. package/src/core/sessions/session.ts +187 -47
  482. package/src/core/sessions/state.ts +11 -0
  483. package/src/core/system.ts +15 -0
  484. package/src/core/wake-key.ts +65 -0
  485. package/src/index.ts +32 -12
  486. package/src/lib/archive/archive-inspection.fixtures.ts +138 -0
  487. package/src/lib/archive/archive-inspection.ts +359 -0
  488. package/src/lib/archive/index.ts +17 -0
  489. package/src/lib/logger/console.ts +7 -57
  490. package/src/lib/logger/file.ts +28 -50
  491. package/src/lib/logger/index.ts +3 -1
  492. package/src/lib/logger/jsonl.ts +36 -0
  493. package/src/lib/logger/logger.ts +48 -0
  494. package/src/lib/logger/session-log.ts +42 -0
  495. package/src/lib/utils/concurrency.ts +37 -8
  496. package/src/lib/utils/fs-batch.ts +49 -0
  497. package/src/lib/utils/result.ts +7 -31
  498. package/src/lib/utils/sleep.ts +23 -0
  499. package/src/platform/fs-revision.ts +21 -0
  500. package/src/platform/fs.ts +109 -1
  501. package/src/platform/git.ts +67 -0
  502. package/src/platform/index.ts +51 -1
  503. package/src/platform/llm-call-log.ts +86 -0
  504. package/src/platform/scheduler.ts +71 -0
  505. package/src/platform/session-log.ts +39 -0
  506. package/src/platform/shell.ts +89 -0
  507. package/src/plugins/agent-status/plugin.ts +1 -0
  508. package/src/plugins/agents/plugin.ts +134 -81
  509. package/src/plugins/filesystem/listing.ts +70 -12
  510. package/src/plugins/filesystem/plugin.ts +8 -6
  511. package/src/plugins/git-status/index.ts +1 -0
  512. package/src/plugins/git-status/plugin.ts +211 -77
  513. package/src/plugins/llm-debug/plugin.ts +1 -0
  514. package/src/plugins/logs/plugin.ts +9 -0
  515. package/src/plugins/mailbox/plugin.ts +46 -64
  516. package/src/plugins/mailbox/query.ts +15 -7
  517. package/src/plugins/mailbox/state.ts +1 -0
  518. package/src/plugins/resources/filename.ts +19 -0
  519. package/src/plugins/resources/plugin.ts +111 -59
  520. package/src/plugins/result-eviction/plugin.ts +6 -1
  521. package/src/plugins/services/plugin.ts +254 -98
  522. package/src/plugins/services/prompt.ts +1 -6
  523. package/src/plugins/services/schema.ts +17 -3
  524. package/src/plugins/services/service.ts +702 -252
  525. package/src/plugins/session-lifecycle/plugin.ts +56 -41
  526. package/src/plugins/session-state/plugin.ts +242 -88
  527. package/src/plugins/session-stats/plugin.ts +1 -0
  528. package/src/plugins/shell/executor.ts +144 -226
  529. package/src/plugins/shell/index.ts +1 -4
  530. package/src/plugins/shell/plugin.ts +7 -9
  531. package/src/plugins/skills/discovery.ts +10 -8
  532. package/src/plugins/skills/index.ts +1 -1
  533. package/src/plugins/skills/plugin.ts +19 -27
  534. package/src/plugins/skills/prompts.ts +3 -3
  535. package/src/plugins/skills/schema.ts +5 -2
  536. package/src/plugins/uploads/plugin.ts +991 -273
  537. package/src/plugins/uploads/preprocessor.ts +25 -0
  538. package/src/plugins/uploads/preprocessors/image-classifier.ts +56 -25
  539. package/src/plugins/uploads/preprocessors/markitdown-preprocessor.ts +41 -15
  540. package/src/plugins/uploads/preprocessors/pdf-preprocessor.ts +32 -16
  541. package/src/plugins/uploads/preprocessors/zip-preprocessor.ts +67 -38
  542. package/src/plugins/uploads/schema.ts +30 -3
  543. package/src/plugins/uploads/state.ts +12 -0
  544. package/src/plugins/user-chat/plugin.ts +196 -40
  545. package/src/plugins/workers/context.ts +102 -39
  546. package/src/plugins/workers/definition.ts +7 -0
  547. package/src/plugins/workers/index.ts +4 -4
  548. package/src/plugins/workers/plugin.ts +461 -151
  549. package/src/plugins/workers/state.ts +64 -0
  550. package/src/plugins/workers/worker.ts +15 -4
  551. package/src/testing/conformance.ts +1751 -0
  552. package/src/testing/node-platform.ts +5 -0
  553. package/src/testing/test-harness.ts +21 -38
  554. package/src/testing/wait-helpers.ts +1 -4
  555. package/src/transport/adapter/client-adapter.ts +60 -3
  556. package/src/transport/adapter/heartbeat.ts +50 -0
  557. package/src/transport/adapter/server-adapter.ts +6 -0
  558. package/src/transport/http/app.ts +7 -35
  559. package/src/transport/http/context.ts +46 -0
  560. package/src/transport/http/fetch-guard.ts +318 -0
  561. package/src/transport/http/index.ts +1 -1
  562. package/src/transport/http/middleware/bearer-auth.ts +1 -1
  563. package/src/transport/http/middleware/error-handler.ts +1 -1
  564. package/src/transport/http/path-containment.ts +44 -0
  565. package/src/transport/http/responses.ts +20 -0
  566. package/src/transport/http/routes/files.ts +69 -159
  567. package/src/transport/http/routes/resources.ts +124 -93
  568. package/src/transport/http/routes/rpc.ts +63 -26
  569. package/src/transport/http/routes/upload.ts +327 -258
  570. package/src/user-config.ts +93 -7
  571. package/dist/config.test.d.ts +0 -2
  572. package/dist/config.test.d.ts.map +0 -1
  573. package/dist/config.test.js +0 -155
  574. package/dist/config.test.js.map +0 -1
  575. package/dist/core/agent-loop.integration.test.d.ts +0 -2
  576. package/dist/core/agent-loop.integration.test.d.ts.map +0 -1
  577. package/dist/core/agent-loop.integration.test.js +0 -414
  578. package/dist/core/agent-loop.integration.test.js.map +0 -1
  579. package/dist/core/agents/agent-config.test.d.ts +0 -2
  580. package/dist/core/agents/agent-config.test.d.ts.map +0 -1
  581. package/dist/core/agents/agent-config.test.js +0 -194
  582. package/dist/core/agents/agent-config.test.js.map +0 -1
  583. package/dist/core/agents/agent-shutdown.test.d.ts +0 -6
  584. package/dist/core/agents/agent-shutdown.test.d.ts.map +0 -1
  585. package/dist/core/agents/agent-shutdown.test.js +0 -180
  586. package/dist/core/agents/agent-shutdown.test.js.map +0 -1
  587. package/dist/core/agents/agent.test.d.ts +0 -2
  588. package/dist/core/agents/agent.test.d.ts.map +0 -1
  589. package/dist/core/agents/agent.test.js +0 -313
  590. package/dist/core/agents/agent.test.js.map +0 -1
  591. package/dist/core/agents/communicator.d.ts +0 -3
  592. package/dist/core/agents/communicator.d.ts.map +0 -1
  593. package/dist/core/agents/communicator.js +0 -13
  594. package/dist/core/agents/communicator.js.map +0 -1
  595. package/dist/core/agents/handler-events.test.d.ts +0 -5
  596. package/dist/core/agents/handler-events.test.d.ts.map +0 -1
  597. package/dist/core/agents/handler-events.test.js +0 -115
  598. package/dist/core/agents/handler-events.test.js.map +0 -1
  599. package/dist/core/agents/response-sanitizer.test.d.ts +0 -2
  600. package/dist/core/agents/response-sanitizer.test.d.ts.map +0 -1
  601. package/dist/core/agents/response-sanitizer.test.js +0 -101
  602. package/dist/core/agents/response-sanitizer.test.js.map +0 -1
  603. package/dist/core/error-recovery.integration.test.d.ts +0 -2
  604. package/dist/core/error-recovery.integration.test.d.ts.map +0 -1
  605. package/dist/core/error-recovery.integration.test.js +0 -288
  606. package/dist/core/error-recovery.integration.test.js.map +0 -1
  607. package/dist/core/event-sourcing.integration.test.d.ts +0 -2
  608. package/dist/core/event-sourcing.integration.test.d.ts.map +0 -1
  609. package/dist/core/event-sourcing.integration.test.js +0 -154
  610. package/dist/core/event-sourcing.integration.test.js.map +0 -1
  611. package/dist/core/events/file.test.d.ts +0 -2
  612. package/dist/core/events/file.test.d.ts.map +0 -1
  613. package/dist/core/events/file.test.js +0 -284
  614. package/dist/core/events/file.test.js.map +0 -1
  615. package/dist/core/events/memory.test.d.ts +0 -2
  616. package/dist/core/events/memory.test.d.ts.map +0 -1
  617. package/dist/core/events/memory.test.js +0 -502
  618. package/dist/core/events/memory.test.js.map +0 -1
  619. package/dist/core/image/image-processor.test.d.ts +0 -2
  620. package/dist/core/image/image-processor.test.d.ts.map +0 -1
  621. package/dist/core/image/image-processor.test.js +0 -171
  622. package/dist/core/image/image-processor.test.js.map +0 -1
  623. package/dist/core/image/vips-resizer.test.d.ts +0 -2
  624. package/dist/core/image/vips-resizer.test.d.ts.map +0 -1
  625. package/dist/core/image/vips-resizer.test.js +0 -336
  626. package/dist/core/image/vips-resizer.test.js.map +0 -1
  627. package/dist/core/llm/anthropic.test.d.ts +0 -2
  628. package/dist/core/llm/anthropic.test.d.ts.map +0 -1
  629. package/dist/core/llm/anthropic.test.js +0 -464
  630. package/dist/core/llm/anthropic.test.js.map +0 -1
  631. package/dist/core/llm/cache-breakpoints.test.d.ts +0 -2
  632. package/dist/core/llm/cache-breakpoints.test.d.ts.map +0 -1
  633. package/dist/core/llm/cache-breakpoints.test.js +0 -69
  634. package/dist/core/llm/cache-breakpoints.test.js.map +0 -1
  635. package/dist/core/llm/cache-live.test.d.ts +0 -16
  636. package/dist/core/llm/cache-live.test.d.ts.map +0 -1
  637. package/dist/core/llm/cache-live.test.js +0 -137
  638. package/dist/core/llm/cache-live.test.js.map +0 -1
  639. package/dist/core/llm/logger.test.d.ts +0 -7
  640. package/dist/core/llm/logger.test.d.ts.map +0 -1
  641. package/dist/core/llm/logger.test.js +0 -228
  642. package/dist/core/llm/logger.test.js.map +0 -1
  643. package/dist/core/llm/message-sanitization.test.d.ts +0 -2
  644. package/dist/core/llm/message-sanitization.test.d.ts.map +0 -1
  645. package/dist/core/llm/message-sanitization.test.js +0 -181
  646. package/dist/core/llm/message-sanitization.test.js.map +0 -1
  647. package/dist/core/llm/mock.test.d.ts +0 -2
  648. package/dist/core/llm/mock.test.d.ts.map +0 -1
  649. package/dist/core/llm/mock.test.js +0 -318
  650. package/dist/core/llm/mock.test.js.map +0 -1
  651. package/dist/core/llm/model-shortlist-live.test.d.ts +0 -35
  652. package/dist/core/llm/model-shortlist-live.test.d.ts.map +0 -1
  653. package/dist/core/llm/model-shortlist-live.test.js +0 -452
  654. package/dist/core/llm/model-shortlist-live.test.js.map +0 -1
  655. package/dist/core/llm/openrouter-mapping.test.d.ts +0 -2
  656. package/dist/core/llm/openrouter-mapping.test.d.ts.map +0 -1
  657. package/dist/core/llm/openrouter-mapping.test.js +0 -190
  658. package/dist/core/llm/openrouter-mapping.test.js.map +0 -1
  659. package/dist/core/llm/openrouter.test.d.ts +0 -2
  660. package/dist/core/llm/openrouter.test.d.ts.map +0 -1
  661. package/dist/core/llm/openrouter.test.js +0 -377
  662. package/dist/core/llm/openrouter.test.js.map +0 -1
  663. package/dist/core/llm/provider-integration.test.d.ts +0 -12
  664. package/dist/core/llm/provider-integration.test.d.ts.map +0 -1
  665. package/dist/core/llm/provider-integration.test.js +0 -350
  666. package/dist/core/llm/provider-integration.test.js.map +0 -1
  667. package/dist/core/llm/reasoning-details.test.d.ts +0 -2
  668. package/dist/core/llm/reasoning-details.test.d.ts.map +0 -1
  669. package/dist/core/llm/reasoning-details.test.js +0 -144
  670. package/dist/core/llm/reasoning-details.test.js.map +0 -1
  671. package/dist/core/llm/routing-provider.test.d.ts +0 -2
  672. package/dist/core/llm/routing-provider.test.d.ts.map +0 -1
  673. package/dist/core/llm/routing-provider.test.js +0 -94
  674. package/dist/core/llm/routing-provider.test.js.map +0 -1
  675. package/dist/core/llm/snapshot-middleware.test.d.ts +0 -2
  676. package/dist/core/llm/snapshot-middleware.test.d.ts.map +0 -1
  677. package/dist/core/llm/snapshot-middleware.test.js +0 -144
  678. package/dist/core/llm/snapshot-middleware.test.js.map +0 -1
  679. package/dist/core/llm/thinking-blocks.test.d.ts +0 -2
  680. package/dist/core/llm/thinking-blocks.test.d.ts.map +0 -1
  681. package/dist/core/llm/thinking-blocks.test.js +0 -291
  682. package/dist/core/llm/thinking-blocks.test.js.map +0 -1
  683. package/dist/core/multi-agent.integration.test.d.ts +0 -2
  684. package/dist/core/multi-agent.integration.test.d.ts.map +0 -1
  685. package/dist/core/multi-agent.integration.test.js +0 -298
  686. package/dist/core/multi-agent.integration.test.js.map +0 -1
  687. package/dist/core/plugin-hooks.integration.test.d.ts +0 -2
  688. package/dist/core/plugin-hooks.integration.test.d.ts.map +0 -1
  689. package/dist/core/plugin-hooks.integration.test.js +0 -458
  690. package/dist/core/plugin-hooks.integration.test.js.map +0 -1
  691. package/dist/core/reasoning-round-trip.integration.test.d.ts +0 -2
  692. package/dist/core/reasoning-round-trip.integration.test.d.ts.map +0 -1
  693. package/dist/core/reasoning-round-trip.integration.test.js +0 -150
  694. package/dist/core/reasoning-round-trip.integration.test.js.map +0 -1
  695. package/dist/core/session-lifecycle.integration.test.d.ts +0 -2
  696. package/dist/core/session-lifecycle.integration.test.d.ts.map +0 -1
  697. package/dist/core/session-lifecycle.integration.test.js +0 -159
  698. package/dist/core/session-lifecycle.integration.test.js.map +0 -1
  699. package/dist/core/sessions/fork-utils.test.d.ts +0 -2
  700. package/dist/core/sessions/fork-utils.test.d.ts.map +0 -1
  701. package/dist/core/sessions/fork-utils.test.js +0 -129
  702. package/dist/core/sessions/fork-utils.test.js.map +0 -1
  703. package/dist/core/sessions/session-overrides.integration.test.d.ts +0 -2
  704. package/dist/core/sessions/session-overrides.integration.test.d.ts.map +0 -1
  705. package/dist/core/sessions/session-overrides.integration.test.js +0 -154
  706. package/dist/core/sessions/session-overrides.integration.test.js.map +0 -1
  707. package/dist/core/sessions/session.test.d.ts +0 -2
  708. package/dist/core/sessions/session.test.d.ts.map +0 -1
  709. package/dist/core/sessions/session.test.js +0 -1100
  710. package/dist/core/sessions/session.test.js.map +0 -1
  711. package/dist/core/tools/executor.test.d.ts +0 -2
  712. package/dist/core/tools/executor.test.d.ts.map +0 -1
  713. package/dist/core/tools/executor.test.js +0 -144
  714. package/dist/core/tools/executor.test.js.map +0 -1
  715. package/dist/lib/logger/console.test.d.ts +0 -2
  716. package/dist/lib/logger/console.test.d.ts.map +0 -1
  717. package/dist/lib/logger/console.test.js +0 -258
  718. package/dist/lib/logger/console.test.js.map +0 -1
  719. package/dist/lib/never.d.ts +0 -2
  720. package/dist/lib/never.d.ts.map +0 -1
  721. package/dist/lib/never.js +0 -4
  722. package/dist/lib/never.js.map +0 -1
  723. package/dist/lib/utils/concurrency.test.d.ts +0 -2
  724. package/dist/lib/utils/concurrency.test.d.ts.map +0 -1
  725. package/dist/lib/utils/concurrency.test.js +0 -135
  726. package/dist/lib/utils/concurrency.test.js.map +0 -1
  727. package/dist/plugins/agent-status/agent-status.test.d.ts +0 -2
  728. package/dist/plugins/agent-status/agent-status.test.d.ts.map +0 -1
  729. package/dist/plugins/agent-status/agent-status.test.js +0 -136
  730. package/dist/plugins/agent-status/agent-status.test.js.map +0 -1
  731. package/dist/plugins/agents/agents.integration.test.d.ts +0 -2
  732. package/dist/plugins/agents/agents.integration.test.d.ts.map +0 -1
  733. package/dist/plugins/agents/agents.integration.test.js +0 -830
  734. package/dist/plugins/agents/agents.integration.test.js.map +0 -1
  735. package/dist/plugins/agents/supervision.integration.test.d.ts +0 -2
  736. package/dist/plugins/agents/supervision.integration.test.d.ts.map +0 -1
  737. package/dist/plugins/agents/supervision.integration.test.js +0 -215
  738. package/dist/plugins/agents/supervision.integration.test.js.map +0 -1
  739. package/dist/plugins/context-compact/compaction-live.test.d.ts +0 -17
  740. package/dist/plugins/context-compact/compaction-live.test.d.ts.map +0 -1
  741. package/dist/plugins/context-compact/compaction-live.test.js +0 -177
  742. package/dist/plugins/context-compact/compaction-live.test.js.map +0 -1
  743. package/dist/plugins/context-compact/context-compact.integration.test.d.ts +0 -2
  744. package/dist/plugins/context-compact/context-compact.integration.test.d.ts.map +0 -1
  745. package/dist/plugins/context-compact/context-compact.integration.test.js +0 -364
  746. package/dist/plugins/context-compact/context-compact.integration.test.js.map +0 -1
  747. package/dist/plugins/context-compact/context-compactor.test.d.ts +0 -2
  748. package/dist/plugins/context-compact/context-compactor.test.d.ts.map +0 -1
  749. package/dist/plugins/context-compact/context-compactor.test.js +0 -858
  750. package/dist/plugins/context-compact/context-compactor.test.js.map +0 -1
  751. package/dist/plugins/context-compact/history-offloader.test.d.ts +0 -2
  752. package/dist/plugins/context-compact/history-offloader.test.d.ts.map +0 -1
  753. package/dist/plugins/context-compact/history-offloader.test.js +0 -77
  754. package/dist/plugins/context-compact/history-offloader.test.js.map +0 -1
  755. package/dist/plugins/filesystem/filesystem.integration.test.d.ts +0 -2
  756. package/dist/plugins/filesystem/filesystem.integration.test.d.ts.map +0 -1
  757. package/dist/plugins/filesystem/filesystem.integration.test.js +0 -447
  758. package/dist/plugins/filesystem/filesystem.integration.test.js.map +0 -1
  759. package/dist/plugins/filesystem/schema.d.ts +0 -7
  760. package/dist/plugins/filesystem/schema.d.ts.map +0 -1
  761. package/dist/plugins/filesystem/schema.js +0 -2
  762. package/dist/plugins/filesystem/schema.js.map +0 -1
  763. package/dist/plugins/limits-guard/limit-guard.test.d.ts +0 -2
  764. package/dist/plugins/limits-guard/limit-guard.test.d.ts.map +0 -1
  765. package/dist/plugins/limits-guard/limit-guard.test.js +0 -194
  766. package/dist/plugins/limits-guard/limit-guard.test.js.map +0 -1
  767. package/dist/plugins/limits-guard/limits-guard.integration.test.d.ts +0 -2
  768. package/dist/plugins/limits-guard/limits-guard.integration.test.d.ts.map +0 -1
  769. package/dist/plugins/limits-guard/limits-guard.integration.test.js +0 -887
  770. package/dist/plugins/limits-guard/limits-guard.integration.test.js.map +0 -1
  771. package/dist/plugins/llm-debug/llm-debug.integration.test.d.ts +0 -2
  772. package/dist/plugins/llm-debug/llm-debug.integration.test.d.ts.map +0 -1
  773. package/dist/plugins/llm-debug/llm-debug.integration.test.js +0 -157
  774. package/dist/plugins/llm-debug/llm-debug.integration.test.js.map +0 -1
  775. package/dist/plugins/mailbox/mailbox.integration.test.d.ts +0 -2
  776. package/dist/plugins/mailbox/mailbox.integration.test.d.ts.map +0 -1
  777. package/dist/plugins/mailbox/mailbox.integration.test.js +0 -678
  778. package/dist/plugins/mailbox/mailbox.integration.test.js.map +0 -1
  779. package/dist/plugins/resources/resources.integration.test.d.ts +0 -2
  780. package/dist/plugins/resources/resources.integration.test.d.ts.map +0 -1
  781. package/dist/plugins/resources/resources.integration.test.js +0 -62
  782. package/dist/plugins/resources/resources.integration.test.js.map +0 -1
  783. package/dist/plugins/result-eviction/result-eviction.integration.test.d.ts +0 -2
  784. package/dist/plugins/result-eviction/result-eviction.integration.test.d.ts.map +0 -1
  785. package/dist/plugins/result-eviction/result-eviction.integration.test.js +0 -294
  786. package/dist/plugins/result-eviction/result-eviction.integration.test.js.map +0 -1
  787. package/dist/plugins/services/pid-registry.test.d.ts +0 -2
  788. package/dist/plugins/services/pid-registry.test.d.ts.map +0 -1
  789. package/dist/plugins/services/pid-registry.test.js +0 -161
  790. package/dist/plugins/services/pid-registry.test.js.map +0 -1
  791. package/dist/plugins/services/services.integration.test.d.ts +0 -2
  792. package/dist/plugins/services/services.integration.test.d.ts.map +0 -1
  793. package/dist/plugins/services/services.integration.test.js +0 -1057
  794. package/dist/plugins/services/services.integration.test.js.map +0 -1
  795. package/dist/plugins/session-lifecycle/session-lifecycle.integration.test.d.ts +0 -2
  796. package/dist/plugins/session-lifecycle/session-lifecycle.integration.test.d.ts.map +0 -1
  797. package/dist/plugins/session-lifecycle/session-lifecycle.integration.test.js +0 -498
  798. package/dist/plugins/session-lifecycle/session-lifecycle.integration.test.js.map +0 -1
  799. package/dist/plugins/session-stats/plugin.test.d.ts +0 -2
  800. package/dist/plugins/session-stats/plugin.test.d.ts.map +0 -1
  801. package/dist/plugins/session-stats/plugin.test.js +0 -145
  802. package/dist/plugins/session-stats/plugin.test.js.map +0 -1
  803. package/dist/plugins/shell/shell.integration.test.d.ts +0 -2
  804. package/dist/plugins/shell/shell.integration.test.d.ts.map +0 -1
  805. package/dist/plugins/shell/shell.integration.test.js +0 -234
  806. package/dist/plugins/shell/shell.integration.test.js.map +0 -1
  807. package/dist/plugins/shell/shell.test.d.ts +0 -2
  808. package/dist/plugins/shell/shell.test.d.ts.map +0 -1
  809. package/dist/plugins/shell/shell.test.js +0 -236
  810. package/dist/plugins/shell/shell.test.js.map +0 -1
  811. package/dist/plugins/skills/discovery.test.d.ts +0 -2
  812. package/dist/plugins/skills/discovery.test.d.ts.map +0 -1
  813. package/dist/plugins/skills/discovery.test.js +0 -312
  814. package/dist/plugins/skills/discovery.test.js.map +0 -1
  815. package/dist/plugins/skills/skills.integration.test.d.ts +0 -2
  816. package/dist/plugins/skills/skills.integration.test.d.ts.map +0 -1
  817. package/dist/plugins/skills/skills.integration.test.js +0 -475
  818. package/dist/plugins/skills/skills.integration.test.js.map +0 -1
  819. package/dist/plugins/todo/todo.integration.test.d.ts +0 -2
  820. package/dist/plugins/todo/todo.integration.test.d.ts.map +0 -1
  821. package/dist/plugins/todo/todo.integration.test.js +0 -605
  822. package/dist/plugins/todo/todo.integration.test.js.map +0 -1
  823. package/dist/plugins/uploads/preprocessors/image-classifier.test.d.ts +0 -2
  824. package/dist/plugins/uploads/preprocessors/image-classifier.test.d.ts.map +0 -1
  825. package/dist/plugins/uploads/preprocessors/image-classifier.test.js +0 -113
  826. package/dist/plugins/uploads/preprocessors/image-classifier.test.js.map +0 -1
  827. package/dist/plugins/uploads/uploads.integration.test.d.ts +0 -2
  828. package/dist/plugins/uploads/uploads.integration.test.d.ts.map +0 -1
  829. package/dist/plugins/uploads/uploads.integration.test.js +0 -639
  830. package/dist/plugins/uploads/uploads.integration.test.js.map +0 -1
  831. package/dist/plugins/user-chat/user-chat.integration.test.d.ts +0 -2
  832. package/dist/plugins/user-chat/user-chat.integration.test.d.ts.map +0 -1
  833. package/dist/plugins/user-chat/user-chat.integration.test.js +0 -754
  834. package/dist/plugins/user-chat/user-chat.integration.test.js.map +0 -1
  835. package/dist/plugins/workers/workers.integration.test.d.ts +0 -2
  836. package/dist/plugins/workers/workers.integration.test.d.ts.map +0 -1
  837. package/dist/plugins/workers/workers.integration.test.js +0 -629
  838. package/dist/plugins/workers/workers.integration.test.js.map +0 -1
  839. package/dist/prompts/macros.test.d.ts +0 -2
  840. package/dist/prompts/macros.test.d.ts.map +0 -1
  841. package/dist/prompts/macros.test.js +0 -80
  842. package/dist/prompts/macros.test.js.map +0 -1
  843. package/dist/testing/test-harness.test.d.ts +0 -2
  844. package/dist/testing/test-harness.test.d.ts.map +0 -1
  845. package/dist/testing/test-harness.test.js +0 -92
  846. package/dist/testing/test-harness.test.js.map +0 -1
  847. package/dist/transport/http/routes/rpc.integration.test.d.ts +0 -2
  848. package/dist/transport/http/routes/rpc.integration.test.d.ts.map +0 -1
  849. package/dist/transport/http/routes/rpc.integration.test.js +0 -189
  850. package/dist/transport/http/routes/rpc.integration.test.js.map +0 -1
  851. package/dist/transport/http/routes/rpc.test.d.ts +0 -2
  852. package/dist/transport/http/routes/rpc.test.d.ts.map +0 -1
  853. package/dist/transport/http/routes/rpc.test.js +0 -316
  854. package/dist/transport/http/routes/rpc.test.js.map +0 -1
  855. package/src/config.test.ts +0 -174
  856. package/src/core/agent-loop.integration.test.ts +0 -503
  857. package/src/core/agents/agent-config.test.ts +0 -240
  858. package/src/core/agents/agent-shutdown.test.ts +0 -236
  859. package/src/core/agents/agent.test.ts +0 -387
  860. package/src/core/agents/communicator.ts +0 -16
  861. package/src/core/agents/handler-events.test.ts +0 -167
  862. package/src/core/agents/response-sanitizer.test.ts +0 -137
  863. package/src/core/error-recovery.integration.test.ts +0 -343
  864. package/src/core/event-sourcing.integration.test.ts +0 -191
  865. package/src/core/events/file.test.ts +0 -436
  866. package/src/core/events/memory.test.ts +0 -741
  867. package/src/core/image/image-processor.test.ts +0 -218
  868. package/src/core/image/vips-resizer.test.ts +0 -388
  869. package/src/core/llm/anthropic.test.ts +0 -546
  870. package/src/core/llm/cache-breakpoints.test.ts +0 -85
  871. package/src/core/llm/cache-live.test.ts +0 -155
  872. package/src/core/llm/logger.test.ts +0 -270
  873. package/src/core/llm/message-sanitization.test.ts +0 -217
  874. package/src/core/llm/mock.test.ts +0 -402
  875. package/src/core/llm/model-shortlist-live.test.ts +0 -577
  876. package/src/core/llm/openrouter-mapping.test.ts +0 -234
  877. package/src/core/llm/openrouter.test.ts +0 -499
  878. package/src/core/llm/provider-integration.test.ts +0 -408
  879. package/src/core/llm/reasoning-details.test.ts +0 -177
  880. package/src/core/llm/routing-provider.test.ts +0 -113
  881. package/src/core/llm/snapshot-middleware.test.ts +0 -168
  882. package/src/core/llm/thinking-blocks.test.ts +0 -345
  883. package/src/core/multi-agent.integration.test.ts +0 -340
  884. package/src/core/plugin-hooks.integration.test.ts +0 -568
  885. package/src/core/reasoning-round-trip.integration.test.ts +0 -188
  886. package/src/core/session-lifecycle.integration.test.ts +0 -202
  887. package/src/core/sessions/fork-utils.test.ts +0 -158
  888. package/src/core/sessions/session-overrides.integration.test.ts +0 -210
  889. package/src/core/sessions/session.test.ts +0 -1736
  890. package/src/core/tools/executor.test.ts +0 -161
  891. package/src/lib/logger/console.test.ts +0 -348
  892. package/src/lib/never.ts +0 -3
  893. package/src/lib/utils/concurrency.test.ts +0 -169
  894. package/src/plugins/agent-status/agent-status.test.ts +0 -164
  895. package/src/plugins/agents/agents.integration.test.ts +0 -976
  896. package/src/plugins/agents/supervision.integration.test.ts +0 -249
  897. package/src/plugins/context-compact/compaction-live.test.ts +0 -221
  898. package/src/plugins/context-compact/context-compact.integration.test.ts +0 -418
  899. package/src/plugins/context-compact/context-compactor.test.ts +0 -1036
  900. package/src/plugins/context-compact/history-offloader.test.ts +0 -100
  901. package/src/plugins/filesystem/filesystem.integration.test.ts +0 -529
  902. package/src/plugins/filesystem/schema.ts +0 -6
  903. package/src/plugins/limits-guard/limit-guard.test.ts +0 -253
  904. package/src/plugins/limits-guard/limits-guard.integration.test.ts +0 -1012
  905. package/src/plugins/llm-debug/llm-debug.integration.test.ts +0 -192
  906. package/src/plugins/mailbox/mailbox.integration.test.ts +0 -794
  907. package/src/plugins/resources/resources.integration.test.ts +0 -68
  908. package/src/plugins/result-eviction/result-eviction.integration.test.ts +0 -332
  909. package/src/plugins/services/pid-registry.test.ts +0 -180
  910. package/src/plugins/services/services.integration.test.ts +0 -1223
  911. package/src/plugins/session-lifecycle/session-lifecycle.integration.test.ts +0 -639
  912. package/src/plugins/session-stats/plugin.test.ts +0 -160
  913. package/src/plugins/shell/shell.integration.test.ts +0 -273
  914. package/src/plugins/shell/shell.test.ts +0 -314
  915. package/src/plugins/skills/discovery.test.ts +0 -395
  916. package/src/plugins/skills/skills.integration.test.ts +0 -580
  917. package/src/plugins/todo/todo.integration.test.ts +0 -687
  918. package/src/plugins/uploads/preprocessors/image-classifier.test.ts +0 -142
  919. package/src/plugins/uploads/uploads.integration.test.ts +0 -831
  920. package/src/plugins/user-chat/user-chat.integration.test.ts +0 -893
  921. package/src/plugins/workers/workers.integration.test.ts +0 -778
  922. package/src/prompts/macros.test.ts +0 -107
  923. package/src/testing/test-harness.test.ts +0 -114
  924. package/src/transport/http/routes/rpc.integration.test.ts +0 -243
  925. package/src/transport/http/routes/rpc.test.ts +0 -372
@@ -1,1100 +0,0 @@
1
- import { describe, expect, it } from 'bun:test';
2
- import { COMMUNICATOR_ROLE, ORCHESTRATOR_ROLE } from '../../core/agents/agent-roles.js';
3
- import { generateTestAgentId } from '../../core/agents/schema.js';
4
- import { agentEvents } from '../../core/agents/state.js';
5
- import { withSessionId } from '../../core/events/test-helpers.js';
6
- import { llmEvents } from '../../core/llm/state.js';
7
- import { generateSessionId } from '../../core/sessions/schema.js';
8
- import { sessionEvents } from '../../core/sessions/state.js';
9
- import { generateToolCallId } from '../../core/tools/schema.js';
10
- import { toolEvents } from '../../core/tools/state.js';
11
- import { mailboxPlugin } from '../../plugins/mailbox/plugin.js';
12
- import { getAgentMailbox, selectMailboxState } from '../../plugins/mailbox/query.js';
13
- import { generateTestMessageId } from '../../plugins/mailbox/schema.js';
14
- import { mailboxEvents } from '../../plugins/mailbox/state.js';
15
- import { createApplyEvent } from './apply-event.js';
16
- import { createSessionState, getAgentState, getCommunicatorId, getEntryAgentId, getOrchestratorId, reconstructSessionState } from './state.js';
17
- const applyEvent = createApplyEvent([mailboxPlugin.create({})]);
18
- const SESSION_ID = generateSessionId();
19
- const TIMESTAMP = Date.now();
20
- describe('createSessionState', () => {
21
- it('creates an empty session with correct properties', () => {
22
- const session = createSessionState(SESSION_ID, 'test-preset', TIMESTAMP);
23
- expect(session.id).toBe(SESSION_ID);
24
- expect(session.presetId).toBe('test-preset');
25
- expect(session.status).toBe('active');
26
- expect(session.agents.size).toBe(0);
27
- expect(session.createdAt).toBe(TIMESTAMP);
28
- expect(session.closedAt).toBeUndefined();
29
- });
30
- });
31
- describe('applyEvent', () => {
32
- const baseSession = createSessionState(SESSION_ID, 'test-preset', TIMESTAMP);
33
- describe('session_closed', () => {
34
- it('closes the session', () => {
35
- const event = withSessionId(SESSION_ID, sessionEvents.create('session_closed', {}));
36
- const result = applyEvent(baseSession, event);
37
- expect(result.status).toBe('closed');
38
- expect(result.closedAt).toBe(event.timestamp);
39
- });
40
- });
41
- describe('agent_spawned', () => {
42
- it('adds a new agent to the session', () => {
43
- const agentId = generateTestAgentId();
44
- const event = withSessionId(SESSION_ID, agentEvents.create('agent_spawned', {
45
- agentId,
46
- definitionName: ORCHESTRATOR_ROLE,
47
- parentId: null,
48
- }));
49
- const result = applyEvent(baseSession, event);
50
- expect(result.agents.size).toBe(1);
51
- const agent = result.agents.get(agentId);
52
- expect(agent).toBeDefined();
53
- expect(agent.id).toBe(agentId);
54
- expect(agent.definitionName).toBe(ORCHESTRATOR_ROLE);
55
- expect(agent.parentId).toBeNull();
56
- expect(agent.status).toBe('pending');
57
- expect(getAgentMailbox(selectMailboxState(result), agentId)).toHaveLength(0);
58
- });
59
- it('adds child agent with parent reference', () => {
60
- const parentId = generateTestAgentId();
61
- const childId = generateTestAgentId();
62
- let session = applyEvent(baseSession, withSessionId(SESSION_ID, agentEvents.create('agent_spawned', {
63
- agentId: parentId,
64
- definitionName: ORCHESTRATOR_ROLE,
65
- parentId: null,
66
- })));
67
- session = applyEvent(session, withSessionId(SESSION_ID, agentEvents.create('agent_spawned', {
68
- agentId: childId,
69
- definitionName: 'worker',
70
- parentId: parentId,
71
- })));
72
- const child = session.agents.get(childId);
73
- expect(child.parentId).toBe(parentId);
74
- });
75
- });
76
- describe('agent_state_changed', () => {
77
- it('updates agent status', () => {
78
- const agentId = generateTestAgentId();
79
- let session = applyEvent(baseSession, withSessionId(SESSION_ID, agentEvents.create('agent_spawned', {
80
- agentId,
81
- definitionName: 'test',
82
- parentId: null,
83
- })));
84
- const event = withSessionId(SESSION_ID, agentEvents.create('agent_state_changed', {
85
- agentId,
86
- fromState: 'pending',
87
- toState: 'inferring',
88
- }));
89
- session = applyEvent(session, event);
90
- expect(session.agents.get(agentId).status).toBe('inferring');
91
- });
92
- it('throws for unknown agent', () => {
93
- const unknownAgentId = generateTestAgentId();
94
- const event = withSessionId(SESSION_ID, agentEvents.create('agent_state_changed', {
95
- agentId: unknownAgentId,
96
- fromState: 'pending',
97
- toState: 'inferring',
98
- }));
99
- expect(() => applyEvent(baseSession, event)).toThrow(`Agent not found: ${unknownAgentId}`);
100
- });
101
- });
102
- describe('mailbox_message', () => {
103
- it('adds message to agent mailbox', () => {
104
- const agentId = generateTestAgentId();
105
- let session = applyEvent(baseSession, withSessionId(SESSION_ID, agentEvents.create('agent_spawned', {
106
- agentId,
107
- definitionName: 'test',
108
- parentId: null,
109
- })));
110
- const messageId = generateTestMessageId();
111
- const event = withSessionId(SESSION_ID, mailboxEvents.create('mailbox_message', {
112
- toAgentId: agentId,
113
- message: {
114
- id: messageId,
115
- from: 'user',
116
- content: 'Hello',
117
- timestamp: TIMESTAMP,
118
- consumed: false,
119
- },
120
- }));
121
- session = applyEvent(session, event);
122
- const mailbox = getAgentMailbox(selectMailboxState(session), agentId);
123
- expect(mailbox).toHaveLength(1);
124
- expect(mailbox[0].id).toBe(messageId);
125
- expect(mailbox[0].content).toBe('Hello');
126
- });
127
- });
128
- describe('mailbox_consumed', () => {
129
- it('marks messages as consumed', () => {
130
- const agentId = generateTestAgentId();
131
- const messageId = generateTestMessageId();
132
- let session = applyEvent(baseSession, withSessionId(SESSION_ID, agentEvents.create('agent_spawned', {
133
- agentId,
134
- definitionName: 'test',
135
- parentId: null,
136
- })));
137
- session = applyEvent(session, withSessionId(SESSION_ID, mailboxEvents.create('mailbox_message', {
138
- toAgentId: agentId,
139
- message: {
140
- id: messageId,
141
- from: 'user',
142
- content: 'Hello',
143
- timestamp: TIMESTAMP,
144
- consumed: false,
145
- },
146
- })));
147
- const event = withSessionId(SESSION_ID, mailboxEvents.create('mailbox_consumed', {
148
- agentId,
149
- messageIds: [messageId],
150
- }));
151
- session = applyEvent(session, event);
152
- expect(getAgentMailbox(selectMailboxState(session), agentId)[0].consumed).toBe(true);
153
- });
154
- });
155
- describe('inference_started', () => {
156
- it('sets agent status to inferring', () => {
157
- const agentId = generateTestAgentId();
158
- let session = applyEvent(baseSession, withSessionId(SESSION_ID, agentEvents.create('agent_spawned', {
159
- agentId,
160
- definitionName: 'test',
161
- parentId: null,
162
- })));
163
- const event = withSessionId(SESSION_ID, llmEvents.create('inference_started', {
164
- agentId,
165
- messages: [],
166
- consumedMessageIds: [],
167
- }));
168
- session = applyEvent(session, event);
169
- expect(session.agents.get(agentId).status).toBe('inferring');
170
- });
171
- it('appends to pendingMessages (defense-in-depth against uncommitted messages)', () => {
172
- // If for any reason pendingMessages are not empty when inference_started fires,
173
- // they must not be overwritten — append instead.
174
- const agentId = generateTestAgentId();
175
- let session = applyEvent(baseSession, withSessionId(SESSION_ID, agentEvents.create('agent_spawned', {
176
- agentId,
177
- definitionName: 'test',
178
- parentId: null,
179
- })));
180
- const msg1 = { role: 'user', content: 'First message' };
181
- const msg2 = { role: 'user', content: 'Second message' };
182
- // First inference_started sets pendingMessages
183
- session = applyEvent(session, withSessionId(SESSION_ID, llmEvents.create('inference_started', {
184
- agentId,
185
- messages: [msg1],
186
- consumedMessageIds: [],
187
- })));
188
- expect(session.agents.get(agentId).pendingMessages).toHaveLength(1);
189
- // Second inference_started without inference_completed in between —
190
- // must append, not overwrite
191
- session = applyEvent(session, withSessionId(SESSION_ID, llmEvents.create('inference_started', {
192
- agentId,
193
- messages: [msg2],
194
- consumedMessageIds: [],
195
- })));
196
- const agent = session.agents.get(agentId);
197
- expect(agent.pendingMessages).toHaveLength(2);
198
- expect(agent.pendingMessages[0].content).toBe(msg1.content);
199
- expect(agent.pendingMessages[1].content).toBe(msg2.content);
200
- });
201
- it('afterInference pause: inference_completed commits turn, then agent_paused preserves pause', () => {
202
- // Real scenario: planner receives subagent response, LLM says "WAITING",
203
- // limits-guard pauses. The correct event sequence is:
204
- // inference_started → inference_completed → agent_paused
205
- // This ensures conversationHistory includes the turn and pendingMessages are cleared.
206
- const agentId = generateTestAgentId();
207
- let session = applyEvent(baseSession, withSessionId(SESSION_ID, agentEvents.create('agent_spawned', {
208
- agentId,
209
- definitionName: 'test',
210
- parentId: null,
211
- })));
212
- const userMsg = { role: 'user', content: 'Response from collection-analyzer_1 (locations)' };
213
- // 1. inference_started — message goes to pendingMessages
214
- session = applyEvent(session, withSessionId(SESSION_ID, llmEvents.create('inference_started', {
215
- agentId,
216
- messages: [userMsg],
217
- consumedMessageIds: [],
218
- })));
219
- expect(session.agents.get(agentId).pendingMessages).toHaveLength(1);
220
- expect(session.agents.get(agentId).status).toBe('inferring');
221
- // 2. inference_completed — pendingMessages + response committed to conversationHistory
222
- session = applyEvent(session, withSessionId(SESSION_ID, llmEvents.create('inference_completed', {
223
- agentId,
224
- consumedMessageIds: [],
225
- response: { content: 'WAITING', toolCalls: [] },
226
- metrics: { promptTokens: 200, completionTokens: 1, totalTokens: 201, latencyMs: 500, model: 'test' },
227
- })));
228
- expect(session.agents.get(agentId).pendingMessages).toHaveLength(0);
229
- expect(session.agents.get(agentId).conversationHistory).toHaveLength(2); // user + assistant
230
- expect(session.agents.get(agentId).status).toBe('pending');
231
- // 3. agent_paused — status set to paused, conversationHistory preserved
232
- session = applyEvent(session, withSessionId(SESSION_ID, agentEvents.create('agent_paused', {
233
- agentId,
234
- reason: 'handler',
235
- message: 'No progress for 5 turns',
236
- })));
237
- const agent = session.agents.get(agentId);
238
- expect(agent.status).toBe('paused');
239
- expect(agent.pendingMessages).toHaveLength(0);
240
- expect(agent.conversationHistory).toHaveLength(2);
241
- expect(agent.conversationHistory[0].content).toBe(userMsg.content);
242
- expect(agent.conversationHistory[1].content).toBe('WAITING');
243
- // 4. Resume + next message — starts fresh with empty pendingMessages
244
- session = applyEvent(session, withSessionId(SESSION_ID, agentEvents.create('agent_resumed', { agentId })));
245
- const nextMsg = { role: 'user', content: 'Response from collection-analyzer_2 (team)' };
246
- session = applyEvent(session, withSessionId(SESSION_ID, llmEvents.create('inference_started', {
247
- agentId,
248
- messages: [nextMsg],
249
- consumedMessageIds: [],
250
- })));
251
- // Only the new message in pendingMessages (previous turn was committed)
252
- expect(session.agents.get(agentId).pendingMessages).toHaveLength(1);
253
- expect(session.agents.get(agentId).pendingMessages[0].content).toBe(nextMsg.content);
254
- // Previous turn preserved in conversationHistory
255
- expect(session.agents.get(agentId).conversationHistory).toHaveLength(2);
256
- });
257
- });
258
- describe('inference_completed', () => {
259
- it('updates conversation history and status when no tool calls', () => {
260
- const agentId = generateTestAgentId();
261
- let session = applyEvent(baseSession, withSessionId(SESSION_ID, agentEvents.create('agent_spawned', {
262
- agentId,
263
- definitionName: 'test',
264
- parentId: null,
265
- })));
266
- const event = withSessionId(SESSION_ID, llmEvents.create('inference_completed', {
267
- agentId,
268
- consumedMessageIds: [],
269
- response: {
270
- content: 'Hello there!',
271
- toolCalls: [],
272
- },
273
- metrics: {
274
- promptTokens: 100,
275
- completionTokens: 10,
276
- totalTokens: 110,
277
- latencyMs: 500,
278
- model: 'test-model',
279
- },
280
- }));
281
- session = applyEvent(session, event);
282
- const agent = session.agents.get(agentId);
283
- expect(agent.status).toBe('pending');
284
- expect(agent.conversationHistory).toHaveLength(1);
285
- expect(agent.conversationHistory[0].role).toBe('assistant');
286
- expect(agent.conversationHistory[0].content).toBe('Hello there!');
287
- expect(agent.pendingToolCalls).toHaveLength(0);
288
- });
289
- it('marks consumed messages via mailbox_consumed event', () => {
290
- const agentId = generateTestAgentId();
291
- const messageId = generateTestMessageId();
292
- let session = applyEvent(baseSession, withSessionId(SESSION_ID, agentEvents.create('agent_spawned', {
293
- agentId,
294
- definitionName: 'test',
295
- parentId: null,
296
- })));
297
- session = applyEvent(session, withSessionId(SESSION_ID, mailboxEvents.create('mailbox_message', {
298
- toAgentId: agentId,
299
- message: {
300
- id: messageId,
301
- from: 'user',
302
- content: 'Hello',
303
- timestamp: TIMESTAMP,
304
- consumed: false,
305
- },
306
- })));
307
- // Before consumption, message should be unconsumed
308
- expect(getAgentMailbox(selectMailboxState(session), agentId)[0].consumed).toBe(false);
309
- // Consume via mailbox_consumed (the dequeue mechanism)
310
- session = applyEvent(session, withSessionId(SESSION_ID, mailboxEvents.create('mailbox_consumed', {
311
- agentId,
312
- messageIds: [messageId],
313
- })));
314
- // After mailbox_consumed, message should be consumed
315
- expect(getAgentMailbox(selectMailboxState(session), agentId)[0].consumed).toBe(true);
316
- // Inference still works after consumption
317
- session = applyEvent(session, withSessionId(SESSION_ID, llmEvents.create('inference_completed', {
318
- agentId,
319
- consumedMessageIds: [],
320
- response: {
321
- content: 'Hi!',
322
- toolCalls: [],
323
- },
324
- metrics: {
325
- promptTokens: 100,
326
- completionTokens: 10,
327
- totalTokens: 110,
328
- latencyMs: 500,
329
- model: 'test-model',
330
- },
331
- })));
332
- expect(session.agents.get(agentId).conversationHistory).toHaveLength(1);
333
- });
334
- it('sets tool_exec status when there are tool calls', () => {
335
- const agentId = generateTestAgentId();
336
- const toolCallId = generateToolCallId();
337
- let session = applyEvent(baseSession, withSessionId(SESSION_ID, agentEvents.create('agent_spawned', {
338
- agentId,
339
- definitionName: 'test',
340
- parentId: null,
341
- })));
342
- const event = withSessionId(SESSION_ID, llmEvents.create('inference_completed', {
343
- agentId,
344
- consumedMessageIds: [],
345
- response: {
346
- content: null,
347
- toolCalls: [
348
- {
349
- id: toolCallId,
350
- name: 'send_message',
351
- input: { to: 'other', content: 'hi' },
352
- },
353
- ],
354
- },
355
- metrics: {
356
- promptTokens: 100,
357
- completionTokens: 20,
358
- totalTokens: 120,
359
- latencyMs: 600,
360
- model: 'test-model',
361
- },
362
- }));
363
- session = applyEvent(session, event);
364
- const agent = session.agents.get(agentId);
365
- expect(agent.status).toBe('tool_exec');
366
- expect(agent.pendingToolCalls).toHaveLength(1);
367
- expect(agent.pendingToolCalls[0].name).toBe('send_message');
368
- });
369
- });
370
- describe('inference_failed', () => {
371
- it('sets agent status to errored', () => {
372
- const agentId = generateTestAgentId();
373
- let session = applyEvent(baseSession, withSessionId(SESSION_ID, agentEvents.create('agent_spawned', {
374
- agentId,
375
- definitionName: 'test',
376
- parentId: null,
377
- })));
378
- const event = withSessionId(SESSION_ID, llmEvents.create('inference_failed', {
379
- agentId,
380
- error: 'API error',
381
- }));
382
- session = applyEvent(session, event);
383
- expect(session.agents.get(agentId).status).toBe('errored');
384
- });
385
- it('clears pendingMessages but preserves pendingToolResults and mailbox for retry', () => {
386
- const agentId = generateTestAgentId();
387
- const messageId = generateTestMessageId();
388
- const toolCallId = generateToolCallId();
389
- // 1. Spawn agent
390
- let session = applyEvent(baseSession, withSessionId(SESSION_ID, agentEvents.create('agent_spawned', {
391
- agentId,
392
- definitionName: 'test',
393
- parentId: null,
394
- })));
395
- // 2. Add mailbox message
396
- session = applyEvent(session, withSessionId(SESSION_ID, mailboxEvents.create('mailbox_message', {
397
- toAgentId: agentId,
398
- message: {
399
- id: messageId,
400
- from: 'user',
401
- content: 'Hello',
402
- timestamp: TIMESTAMP,
403
- consumed: false,
404
- },
405
- })));
406
- // 3. First inference with tool call
407
- session = applyEvent(session, withSessionId(SESSION_ID, llmEvents.create('inference_completed', {
408
- agentId,
409
- consumedMessageIds: [],
410
- response: {
411
- content: null,
412
- toolCalls: [{ id: toolCallId, name: 'test_tool', input: {} }],
413
- },
414
- metrics: { promptTokens: 100, completionTokens: 10, totalTokens: 110, latencyMs: 500, model: 'test' },
415
- })));
416
- // 4. Tool completes - creates pendingToolResult
417
- session = applyEvent(session, withSessionId(SESSION_ID, toolEvents.create('tool_completed', {
418
- agentId,
419
- toolCallId,
420
- result: 'tool output',
421
- })));
422
- // 5. Start inference with pending messages
423
- session = applyEvent(session, withSessionId(SESSION_ID, llmEvents.create('inference_started', {
424
- agentId,
425
- messages: [
426
- { role: 'tool', toolCallId, toolName: 'test_tool', content: 'tool output', isError: false, timestamp: TIMESTAMP },
427
- { role: 'user', content: 'formatted mailbox', sourceMessageIds: [messageId] },
428
- ],
429
- consumedMessageIds: [messageId],
430
- })));
431
- // Verify pendingMessages are set
432
- expect(session.agents.get(agentId).pendingMessages).toHaveLength(2);
433
- expect(session.agents.get(agentId).status).toBe('inferring');
434
- const historyLenBeforeFailure = session.agents.get(agentId).conversationHistory.length;
435
- // 6. Inference fails
436
- session = applyEvent(session, withSessionId(SESSION_ID, llmEvents.create('inference_failed', {
437
- agentId,
438
- error: 'API timeout',
439
- })));
440
- const agent = session.agents.get(agentId);
441
- // pendingMessages cleared
442
- expect(agent.pendingMessages).toHaveLength(0);
443
- // pendingToolResults preserved for rebuild
444
- expect(agent.pendingToolResults).toHaveLength(1);
445
- expect(agent.pendingToolResults[0].toolCallId).toBe(toolCallId);
446
- // mailbox NOT consumed (can rebuild user message)
447
- expect(getAgentMailbox(selectMailboxState(session), agentId)[0].consumed).toBe(false);
448
- // status is errored
449
- expect(agent.status).toBe('errored');
450
- // conversationHistory NOT extended — pendingMessages are dropped, not promoted.
451
- // Otherwise tool results would appear both in history and in pendingToolResults,
452
- // duplicating them on the next inference (Bedrock-style provider rejects 400).
453
- expect(agent.conversationHistory).toHaveLength(historyLenBeforeFailure);
454
- });
455
- });
456
- describe('session_restarted', () => {
457
- it('clears pendingMessages for inferring agents, preserves pendingToolResults and mailbox', () => {
458
- const agentId = generateTestAgentId();
459
- const messageId = generateTestMessageId();
460
- const toolCallId = generateToolCallId();
461
- // 1. Spawn agent
462
- let session = applyEvent(baseSession, withSessionId(SESSION_ID, agentEvents.create('agent_spawned', {
463
- agentId,
464
- definitionName: 'test',
465
- parentId: null,
466
- })));
467
- // 2. Add mailbox message
468
- session = applyEvent(session, withSessionId(SESSION_ID, mailboxEvents.create('mailbox_message', {
469
- toAgentId: agentId,
470
- message: {
471
- id: messageId,
472
- from: 'user',
473
- content: 'Hello',
474
- timestamp: TIMESTAMP,
475
- consumed: false,
476
- },
477
- })));
478
- // 3. First inference with tool call
479
- session = applyEvent(session, withSessionId(SESSION_ID, llmEvents.create('inference_completed', {
480
- agentId,
481
- consumedMessageIds: [],
482
- response: {
483
- content: null,
484
- toolCalls: [{ id: toolCallId, name: 'test_tool', input: {} }],
485
- },
486
- metrics: { promptTokens: 100, completionTokens: 10, totalTokens: 110, latencyMs: 500, model: 'test' },
487
- })));
488
- // 4. Tool completes
489
- session = applyEvent(session, withSessionId(SESSION_ID, toolEvents.create('tool_completed', {
490
- agentId,
491
- toolCallId,
492
- result: 'tool output',
493
- })));
494
- // 5. Start inference
495
- session = applyEvent(session, withSessionId(SESSION_ID, llmEvents.create('inference_started', {
496
- agentId,
497
- messages: [
498
- { role: 'tool', toolCallId, toolName: 'test_tool', content: 'tool output', isError: false, timestamp: TIMESTAMP },
499
- { role: 'user', content: 'formatted mailbox', sourceMessageIds: [messageId] },
500
- ],
501
- consumedMessageIds: [messageId],
502
- })));
503
- // Verify state before restart
504
- expect(session.agents.get(agentId).pendingMessages).toHaveLength(2);
505
- expect(session.agents.get(agentId).status).toBe('inferring');
506
- // 6. Server restarts
507
- session = applyEvent(session, {
508
- ...withSessionId(SESSION_ID, sessionEvents.create('session_restarted', {
509
- resetAgentIds: [agentId],
510
- clearedToolAgentIds: [],
511
- })),
512
- timestamp: TIMESTAMP + 1000,
513
- });
514
- const agent = session.agents.get(agentId);
515
- // pendingMessages cleared
516
- expect(agent.pendingMessages).toHaveLength(0);
517
- // pendingToolResults preserved - can rebuild tool messages
518
- expect(agent.pendingToolResults).toHaveLength(1);
519
- expect(agent.pendingToolResults[0].toolCallId).toBe(toolCallId);
520
- // mailbox NOT consumed - can rebuild user message
521
- expect(getAgentMailbox(selectMailboxState(session), agentId)[0].consumed).toBe(false);
522
- // status reset to pending
523
- expect(agent.status).toBe('pending');
524
- });
525
- it('allows successful retry after restart - full cycle', () => {
526
- const agentId = generateTestAgentId();
527
- const messageId = generateTestMessageId();
528
- const toolCallId = generateToolCallId();
529
- // 1. Setup: spawn, message, tool call, tool complete
530
- let session = applyEvent(baseSession, withSessionId(SESSION_ID, agentEvents.create('agent_spawned', {
531
- agentId,
532
- definitionName: 'test',
533
- parentId: null,
534
- })));
535
- session = applyEvent(session, withSessionId(SESSION_ID, mailboxEvents.create('mailbox_message', {
536
- toAgentId: agentId,
537
- message: { id: messageId, from: 'user', content: 'Hello', timestamp: TIMESTAMP, consumed: false },
538
- })));
539
- session = applyEvent(session, withSessionId(SESSION_ID, llmEvents.create('inference_completed', {
540
- agentId,
541
- consumedMessageIds: [],
542
- response: { content: null, toolCalls: [{ id: toolCallId, name: 'test_tool', input: {} }] },
543
- metrics: { promptTokens: 100, completionTokens: 10, totalTokens: 110, latencyMs: 500, model: 'test' },
544
- })));
545
- session = applyEvent(session, withSessionId(SESSION_ID, toolEvents.create('tool_completed', {
546
- agentId,
547
- toolCallId,
548
- result: 'tool output',
549
- })));
550
- // 2. First inference attempt - interrupted by restart
551
- session = applyEvent(session, withSessionId(SESSION_ID, llmEvents.create('inference_started', {
552
- agentId,
553
- messages: [
554
- { role: 'tool', toolCallId, toolName: 'test_tool', content: 'tool output', isError: false, timestamp: TIMESTAMP },
555
- { role: 'user', content: 'formatted mailbox v1', sourceMessageIds: [messageId] },
556
- ],
557
- consumedMessageIds: [messageId],
558
- })));
559
- session = applyEvent(session, {
560
- ...withSessionId(SESSION_ID, sessionEvents.create('session_restarted', {
561
- resetAgentIds: [agentId],
562
- clearedToolAgentIds: [],
563
- })),
564
- timestamp: TIMESTAMP + 1000,
565
- });
566
- // 3. Retry inference - rebuild messages from preserved state
567
- const agentAfterRestart = session.agents.get(agentId);
568
- expect(agentAfterRestart.status).toBe('pending');
569
- expect(agentAfterRestart.pendingToolResults).toHaveLength(1);
570
- expect(getAgentMailbox(selectMailboxState(session), agentId)[0].consumed).toBe(false);
571
- // Runtime would rebuild: tool message from pendingToolResults + user message from unconsumed mailbox
572
- session = applyEvent(session, {
573
- ...withSessionId(SESSION_ID, llmEvents.create('inference_started', {
574
- agentId,
575
- messages: [
576
- { role: 'tool', toolCallId, toolName: 'test_tool', content: 'tool output', isError: false, timestamp: TIMESTAMP },
577
- { role: 'user', content: 'formatted mailbox v2', sourceMessageIds: [messageId] },
578
- ],
579
- consumedMessageIds: [messageId],
580
- })),
581
- timestamp: TIMESTAMP + 2000,
582
- });
583
- // 4. Dequeue mechanism marks messages consumed
584
- session = applyEvent(session, withSessionId(SESSION_ID, mailboxEvents.create('mailbox_consumed', {
585
- agentId,
586
- messageIds: [messageId],
587
- })));
588
- // 5. This time inference completes successfully
589
- session = applyEvent(session, {
590
- ...withSessionId(SESSION_ID, llmEvents.create('inference_completed', {
591
- agentId,
592
- consumedMessageIds: [],
593
- response: { content: 'Done!', toolCalls: [] },
594
- metrics: { promptTokens: 100, completionTokens: 10, totalTokens: 110, latencyMs: 500, model: 'test' },
595
- })),
596
- timestamp: TIMESTAMP + 3000,
597
- });
598
- const finalAgent = session.agents.get(agentId);
599
- // Everything committed
600
- expect(finalAgent.status).toBe('pending');
601
- expect(finalAgent.pendingMessages).toHaveLength(0);
602
- expect(finalAgent.pendingToolResults).toHaveLength(0);
603
- expect(getAgentMailbox(selectMailboxState(session), agentId)[0].consumed).toBe(true);
604
- // History contains: assistant (tool call) + tool + user + assistant (final)
605
- expect(finalAgent.conversationHistory).toHaveLength(4);
606
- expect(finalAgent.conversationHistory[0].role).toBe('assistant');
607
- expect(finalAgent.conversationHistory[1].role).toBe('tool');
608
- expect(finalAgent.conversationHistory[2].role).toBe('user');
609
- expect(finalAgent.conversationHistory[3].role).toBe('assistant');
610
- expect(finalAgent.conversationHistory[3].content).toBe('Done!');
611
- });
612
- });
613
- describe('tool_completed', () => {
614
- it('removes tool call from pending and updates status', () => {
615
- const agentId = generateTestAgentId();
616
- const toolCallId = generateToolCallId();
617
- let session = applyEvent(baseSession, withSessionId(SESSION_ID, agentEvents.create('agent_spawned', {
618
- agentId,
619
- definitionName: 'test',
620
- parentId: null,
621
- })));
622
- session = applyEvent(session, withSessionId(SESSION_ID, llmEvents.create('inference_completed', {
623
- agentId,
624
- consumedMessageIds: [],
625
- response: {
626
- content: null,
627
- toolCalls: [{ id: toolCallId, name: 'test', input: {} }],
628
- },
629
- metrics: {
630
- promptTokens: 100,
631
- completionTokens: 10,
632
- totalTokens: 110,
633
- latencyMs: 500,
634
- model: 'test-model',
635
- },
636
- })));
637
- const event = withSessionId(SESSION_ID, toolEvents.create('tool_completed', {
638
- agentId,
639
- toolCallId,
640
- result: 'success',
641
- }));
642
- session = applyEvent(session, event);
643
- const agent = session.agents.get(agentId);
644
- expect(agent.pendingToolCalls).toHaveLength(0);
645
- expect(agent.status).toBe('pending');
646
- });
647
- it('keeps tool_exec status when there are remaining tool calls', () => {
648
- const agentId = generateTestAgentId();
649
- const toolCallId1 = generateToolCallId();
650
- const toolCallId2 = generateToolCallId();
651
- let session = applyEvent(baseSession, withSessionId(SESSION_ID, agentEvents.create('agent_spawned', {
652
- agentId,
653
- definitionName: 'test',
654
- parentId: null,
655
- })));
656
- session = applyEvent(session, withSessionId(SESSION_ID, llmEvents.create('inference_completed', {
657
- agentId,
658
- consumedMessageIds: [],
659
- response: {
660
- content: null,
661
- toolCalls: [
662
- { id: toolCallId1, name: 'test1', input: {} },
663
- { id: toolCallId2, name: 'test2', input: {} },
664
- ],
665
- },
666
- metrics: {
667
- promptTokens: 100,
668
- completionTokens: 10,
669
- totalTokens: 110,
670
- latencyMs: 500,
671
- model: 'test-model',
672
- },
673
- })));
674
- session = applyEvent(session, withSessionId(SESSION_ID, toolEvents.create('tool_completed', {
675
- agentId,
676
- toolCallId: toolCallId1,
677
- result: 'success',
678
- })));
679
- const agent = session.agents.get(agentId);
680
- expect(agent.pendingToolCalls).toHaveLength(1);
681
- expect(agent.status).toBe('tool_exec');
682
- });
683
- it('stores content in pendingToolResults (deferred to history by inference_completed)', () => {
684
- const agentId = generateTestAgentId();
685
- const toolCallId = generateToolCallId();
686
- const toolTimestamp = Date.now();
687
- let session = applyEvent(baseSession, withSessionId(SESSION_ID, agentEvents.create('agent_spawned', {
688
- agentId,
689
- definitionName: 'test',
690
- parentId: null,
691
- })));
692
- session = applyEvent(session, withSessionId(SESSION_ID, llmEvents.create('inference_completed', {
693
- agentId,
694
- consumedMessageIds: [],
695
- response: {
696
- content: null,
697
- toolCalls: [{ id: toolCallId, name: 'send_message', input: { to: 'agent-1', message: 'hello' } }],
698
- },
699
- metrics: {
700
- promptTokens: 100,
701
- completionTokens: 10,
702
- totalTokens: 110,
703
- latencyMs: 500,
704
- model: 'test-model',
705
- },
706
- })));
707
- session = applyEvent(session, {
708
- ...withSessionId(SESSION_ID, toolEvents.create('tool_completed', {
709
- agentId,
710
- toolCallId,
711
- result: 'success message',
712
- })),
713
- timestamp: toolTimestamp,
714
- });
715
- const agent = session.agents.get(agentId);
716
- // Tool result should NOT be in conversationHistory yet (deferred pattern)
717
- const toolMessage = agent.conversationHistory.find(m => m.role === 'tool');
718
- expect(toolMessage).toBeUndefined();
719
- // Check pendingToolResults has full content
720
- expect(agent.pendingToolResults).toHaveLength(1);
721
- expect(agent.pendingToolResults[0].toolCallId).toBe(toolCallId);
722
- expect(agent.pendingToolResults[0].toolName).toBe('send_message');
723
- expect(agent.pendingToolResults[0].timestamp).toBe(toolTimestamp);
724
- expect(agent.pendingToolResults[0].isError).toBe(false);
725
- expect(agent.pendingToolResults[0].content).toBe('success message');
726
- });
727
- it('preserves rich content (array) in pendingToolResults', () => {
728
- const agentId = generateTestAgentId();
729
- const toolCallId = generateToolCallId();
730
- let session = applyEvent(baseSession, withSessionId(SESSION_ID, agentEvents.create('agent_spawned', {
731
- agentId,
732
- definitionName: 'test',
733
- parentId: null,
734
- })));
735
- session = applyEvent(session, withSessionId(SESSION_ID, llmEvents.create('inference_completed', {
736
- agentId,
737
- consumedMessageIds: [],
738
- response: {
739
- content: null,
740
- toolCalls: [{ id: toolCallId, name: 'read_file', input: { path: '/test' } }],
741
- },
742
- metrics: {
743
- promptTokens: 100,
744
- completionTokens: 10,
745
- totalTokens: 110,
746
- latencyMs: 500,
747
- model: 'test-model',
748
- },
749
- })));
750
- // Rich content array (like image + text)
751
- const richContent = [
752
- { type: 'text', text: 'File contents:' },
753
- { type: 'image_url', imageUrl: { url: 'data:image/png;base64,abc123' } },
754
- ];
755
- session = applyEvent(session, withSessionId(SESSION_ID, toolEvents.create('tool_completed', {
756
- agentId,
757
- toolCallId,
758
- result: richContent,
759
- })));
760
- const agent = session.agents.get(agentId);
761
- // Rich content should be preserved (not stringified)
762
- expect(agent.pendingToolResults[0].content).toEqual(richContent);
763
- });
764
- it('inference_started does NOT clear pendingToolResults (deferred to inference_completed)', () => {
765
- const agentId = generateTestAgentId();
766
- const toolCallId = generateToolCallId();
767
- let session = applyEvent(baseSession, withSessionId(SESSION_ID, agentEvents.create('agent_spawned', {
768
- agentId,
769
- definitionName: 'test',
770
- parentId: null,
771
- })));
772
- session = applyEvent(session, withSessionId(SESSION_ID, llmEvents.create('inference_completed', {
773
- agentId,
774
- consumedMessageIds: [],
775
- response: {
776
- content: null,
777
- toolCalls: [{ id: toolCallId, name: 'send_message', input: {} }],
778
- },
779
- metrics: {
780
- promptTokens: 100,
781
- completionTokens: 10,
782
- totalTokens: 110,
783
- latencyMs: 500,
784
- model: 'test-model',
785
- },
786
- })));
787
- session = applyEvent(session, withSessionId(SESSION_ID, toolEvents.create('tool_completed', {
788
- agentId,
789
- toolCallId,
790
- result: 'success',
791
- })));
792
- // Verify pendingToolResults has entry
793
- expect(session.agents.get(agentId).pendingToolResults).toHaveLength(1);
794
- // Start new inference - should NOT clear pendingToolResults
795
- session = applyEvent(session, withSessionId(SESSION_ID, llmEvents.create('inference_started', {
796
- agentId,
797
- messages: [
798
- { role: 'tool', toolCallId, toolName: 'send_message', content: 'success', isError: false, timestamp: TIMESTAMP },
799
- ],
800
- consumedMessageIds: [],
801
- })));
802
- // pendingToolResults preserved until inference_completed
803
- expect(session.agents.get(agentId).pendingToolResults).toHaveLength(1);
804
- });
805
- it('inference_completed moves pendingToolResults to conversationHistory', () => {
806
- const agentId = generateTestAgentId();
807
- const toolCallId = generateToolCallId();
808
- const toolTimestamp = TIMESTAMP + 1000;
809
- let session = applyEvent(baseSession, withSessionId(SESSION_ID, agentEvents.create('agent_spawned', {
810
- agentId,
811
- definitionName: 'test',
812
- parentId: null,
813
- })));
814
- // First inference with tool call
815
- session = applyEvent(session, withSessionId(SESSION_ID, llmEvents.create('inference_completed', {
816
- agentId,
817
- consumedMessageIds: [],
818
- response: {
819
- content: null,
820
- toolCalls: [{ id: toolCallId, name: 'send_message', input: {} }],
821
- },
822
- metrics: {
823
- promptTokens: 100,
824
- completionTokens: 10,
825
- totalTokens: 110,
826
- latencyMs: 500,
827
- model: 'test-model',
828
- },
829
- })));
830
- // Tool completes
831
- session = applyEvent(session, {
832
- ...withSessionId(SESSION_ID, toolEvents.create('tool_completed', {
833
- agentId,
834
- toolCallId,
835
- result: 'tool result content',
836
- })),
837
- timestamp: toolTimestamp,
838
- });
839
- // Verify: not in history yet, in pendingToolResults
840
- let agent = session.agents.get(agentId);
841
- expect(agent.conversationHistory.filter(m => m.role === 'tool')).toHaveLength(0);
842
- expect(agent.pendingToolResults).toHaveLength(1);
843
- // Start and complete new inference
844
- session = applyEvent(session, {
845
- ...withSessionId(SESSION_ID, llmEvents.create('inference_started', {
846
- agentId,
847
- messages: [
848
- { role: 'tool', toolCallId, toolName: 'send_message', content: 'tool result content', isError: false, timestamp: toolTimestamp },
849
- ],
850
- consumedMessageIds: [],
851
- })),
852
- timestamp: TIMESTAMP + 2000,
853
- });
854
- session = applyEvent(session, {
855
- ...withSessionId(SESSION_ID, llmEvents.create('inference_completed', {
856
- agentId,
857
- consumedMessageIds: [],
858
- response: {
859
- content: 'Response after tool',
860
- toolCalls: [],
861
- },
862
- metrics: {
863
- promptTokens: 100,
864
- completionTokens: 10,
865
- totalTokens: 110,
866
- latencyMs: 500,
867
- model: 'test-model',
868
- },
869
- })),
870
- timestamp: TIMESTAMP + 3000,
871
- });
872
- // Verify: pendingToolResults moved to history, then cleared
873
- agent = session.agents.get(agentId);
874
- expect(agent.pendingToolResults).toHaveLength(0);
875
- const toolMessages = agent.conversationHistory.filter(m => m.role === 'tool');
876
- expect(toolMessages).toHaveLength(1);
877
- const toolMessage = toolMessages[0];
878
- if (toolMessage.role === 'tool') {
879
- expect(toolMessage.toolCallId).toBe(toolCallId);
880
- expect(toolMessage.toolName).toBe('send_message');
881
- expect(toolMessage.content).toBe('tool result content');
882
- expect(toolMessage.timestamp).toBe(toolTimestamp);
883
- expect(toolMessage.isError).toBe(false);
884
- }
885
- });
886
- });
887
- describe('tool_failed', () => {
888
- it('removes tool call from pending', () => {
889
- const agentId = generateTestAgentId();
890
- const toolCallId = generateToolCallId();
891
- let session = applyEvent(baseSession, withSessionId(SESSION_ID, agentEvents.create('agent_spawned', {
892
- agentId,
893
- definitionName: 'test',
894
- parentId: null,
895
- })));
896
- session = applyEvent(session, withSessionId(SESSION_ID, llmEvents.create('inference_completed', {
897
- agentId,
898
- consumedMessageIds: [],
899
- response: {
900
- content: null,
901
- toolCalls: [{ id: toolCallId, name: 'test', input: {} }],
902
- },
903
- metrics: {
904
- promptTokens: 100,
905
- completionTokens: 10,
906
- totalTokens: 110,
907
- latencyMs: 500,
908
- model: 'test-model',
909
- },
910
- })));
911
- const event = withSessionId(SESSION_ID, toolEvents.create('tool_failed', {
912
- agentId,
913
- toolCallId,
914
- error: 'Tool error',
915
- }));
916
- session = applyEvent(session, event);
917
- const agent = session.agents.get(agentId);
918
- expect(agent.pendingToolCalls).toHaveLength(0);
919
- expect(agent.status).toBe('pending');
920
- });
921
- it('stores error in pendingToolResults with isError=true (deferred to history by inference_completed)', () => {
922
- const agentId = generateTestAgentId();
923
- const toolCallId = generateToolCallId();
924
- const toolTimestamp = Date.now();
925
- let session = applyEvent(baseSession, withSessionId(SESSION_ID, agentEvents.create('agent_spawned', {
926
- agentId,
927
- definitionName: 'test',
928
- parentId: null,
929
- })));
930
- session = applyEvent(session, withSessionId(SESSION_ID, llmEvents.create('inference_completed', {
931
- agentId,
932
- consumedMessageIds: [],
933
- response: {
934
- content: null,
935
- toolCalls: [{ id: toolCallId, name: 'reveal_secret', input: { password: 'test' } }],
936
- },
937
- metrics: {
938
- promptTokens: 100,
939
- completionTokens: 10,
940
- totalTokens: 110,
941
- latencyMs: 500,
942
- model: 'test-model',
943
- },
944
- })));
945
- session = applyEvent(session, {
946
- ...withSessionId(SESSION_ID, toolEvents.create('tool_failed', {
947
- agentId,
948
- toolCallId,
949
- error: 'Invalid password',
950
- })),
951
- timestamp: toolTimestamp,
952
- });
953
- const agent = session.agents.get(agentId);
954
- // Tool result should NOT be in conversationHistory yet (deferred pattern)
955
- const toolMessage = agent.conversationHistory.find(m => m.role === 'tool');
956
- expect(toolMessage).toBeUndefined();
957
- // Check pendingToolResults has error content with isError=true
958
- expect(agent.pendingToolResults).toHaveLength(1);
959
- expect(agent.pendingToolResults[0].toolCallId).toBe(toolCallId);
960
- expect(agent.pendingToolResults[0].toolName).toBe('reveal_secret');
961
- expect(agent.pendingToolResults[0].timestamp).toBe(toolTimestamp);
962
- expect(agent.pendingToolResults[0].isError).toBe(true);
963
- expect(agent.pendingToolResults[0].content).toBe('Invalid password');
964
- });
965
- });
966
- });
967
- describe('reconstructSessionState', () => {
968
- it('returns null for empty events array', () => {
969
- expect(reconstructSessionState([], applyEvent)).toBeNull();
970
- });
971
- it('throws error when first event is not session_created', () => {
972
- const events = [
973
- withSessionId(SESSION_ID, sessionEvents.create('session_closed', {})),
974
- ];
975
- expect(() => reconstructSessionState(events, applyEvent)).toThrow('First event must be session_created');
976
- });
977
- it('reconstructs session from events', () => {
978
- const agentId = generateTestAgentId();
979
- const events = [
980
- withSessionId(SESSION_ID, sessionEvents.create('session_created', { presetId: 'test-preset' })),
981
- withSessionId(SESSION_ID, agentEvents.create('agent_spawned', {
982
- agentId,
983
- definitionName: ORCHESTRATOR_ROLE,
984
- parentId: null,
985
- })),
986
- ];
987
- const session = reconstructSessionState(events, applyEvent);
988
- expect(session).not.toBeNull();
989
- expect(session.id).toBe(SESSION_ID);
990
- expect(session.agents.size).toBe(1);
991
- expect(session.agents.get(agentId).definitionName).toBe(ORCHESTRATOR_ROLE);
992
- });
993
- });
994
- describe('Query helpers', () => {
995
- describe('getOrchestratorId', () => {
996
- it('returns orchestrator agent id', () => {
997
- const orchestratorId = generateTestAgentId();
998
- const events = [
999
- withSessionId(SESSION_ID, sessionEvents.create('session_created', { presetId: 'test' })),
1000
- withSessionId(SESSION_ID, agentEvents.create('agent_spawned', {
1001
- agentId: orchestratorId,
1002
- definitionName: ORCHESTRATOR_ROLE,
1003
- parentId: null,
1004
- })),
1005
- ];
1006
- const session = reconstructSessionState(events, applyEvent);
1007
- expect(getOrchestratorId(session)).toBe(orchestratorId);
1008
- });
1009
- it('returns null when no orchestrator', () => {
1010
- const session = createSessionState(SESSION_ID, 'test', TIMESTAMP);
1011
- expect(getOrchestratorId(session)).toBeNull();
1012
- });
1013
- });
1014
- describe('getCommunicatorId', () => {
1015
- it('returns communicator agent id', () => {
1016
- const communicatorId = generateTestAgentId();
1017
- const events = [
1018
- withSessionId(SESSION_ID, sessionEvents.create('session_created', { presetId: 'test' })),
1019
- withSessionId(SESSION_ID, agentEvents.create('agent_spawned', {
1020
- agentId: communicatorId,
1021
- definitionName: COMMUNICATOR_ROLE,
1022
- parentId: null,
1023
- })),
1024
- ];
1025
- const session = reconstructSessionState(events, applyEvent);
1026
- expect(getCommunicatorId(session)).toBe(communicatorId);
1027
- });
1028
- });
1029
- describe('getEntryAgentId', () => {
1030
- it('returns communicator when both exist', () => {
1031
- const orchestratorId = generateTestAgentId();
1032
- const communicatorId = generateTestAgentId();
1033
- const events = [
1034
- withSessionId(SESSION_ID, sessionEvents.create('session_created', { presetId: 'test' })),
1035
- withSessionId(SESSION_ID, agentEvents.create('agent_spawned', {
1036
- agentId: orchestratorId,
1037
- definitionName: ORCHESTRATOR_ROLE,
1038
- parentId: null,
1039
- })),
1040
- withSessionId(SESSION_ID, agentEvents.create('agent_spawned', {
1041
- agentId: communicatorId,
1042
- definitionName: COMMUNICATOR_ROLE,
1043
- parentId: orchestratorId,
1044
- })),
1045
- ];
1046
- const session = reconstructSessionState(events, applyEvent);
1047
- expect(getEntryAgentId(session)).toBe(communicatorId);
1048
- });
1049
- it('returns orchestrator when no communicator', () => {
1050
- const orchestratorId = generateTestAgentId();
1051
- const events = [
1052
- withSessionId(SESSION_ID, sessionEvents.create('session_created', { presetId: 'test' })),
1053
- withSessionId(SESSION_ID, agentEvents.create('agent_spawned', {
1054
- agentId: orchestratorId,
1055
- definitionName: ORCHESTRATOR_ROLE,
1056
- parentId: null,
1057
- })),
1058
- ];
1059
- const session = reconstructSessionState(events, applyEvent);
1060
- expect(getEntryAgentId(session)).toBe(orchestratorId);
1061
- });
1062
- });
1063
- describe('getAgentState', () => {
1064
- it('returns agent by id', () => {
1065
- const agentId = generateTestAgentId();
1066
- const events = [
1067
- withSessionId(SESSION_ID, sessionEvents.create('session_created', { presetId: 'test' })),
1068
- withSessionId(SESSION_ID, agentEvents.create('agent_spawned', {
1069
- agentId,
1070
- definitionName: 'test',
1071
- parentId: null,
1072
- })),
1073
- ];
1074
- const session = reconstructSessionState(events, applyEvent);
1075
- const agent = getAgentState(session, agentId);
1076
- expect(agent).not.toBeNull();
1077
- expect(agent.id).toBe(agentId);
1078
- });
1079
- it('returns null for unknown agent', () => {
1080
- const session = createSessionState(SESSION_ID, 'test', TIMESTAMP);
1081
- expect(getAgentState(session, generateTestAgentId())).toBeNull();
1082
- });
1083
- });
1084
- });
1085
- describe('Immutability', () => {
1086
- it('applyEvent does not mutate original session', () => {
1087
- const session = createSessionState(SESSION_ID, 'test', TIMESTAMP);
1088
- const agentId = generateTestAgentId();
1089
- const event = withSessionId(SESSION_ID, agentEvents.create('agent_spawned', {
1090
- agentId,
1091
- definitionName: 'test',
1092
- parentId: null,
1093
- }));
1094
- const newSession = applyEvent(session, event);
1095
- expect(session.agents.size).toBe(0);
1096
- expect(newSession.agents.size).toBe(1);
1097
- expect(session).not.toBe(newSession);
1098
- });
1099
- });
1100
- //# sourceMappingURL=session.test.js.map