@roj-ai/sdk 0.1.35 → 0.2.1

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 (908) 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 +209 -90
  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 +27 -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.d.ts.map +1 -1
  42. package/dist/core/context/state.js +6 -2
  43. package/dist/core/context/state.js.map +1 -1
  44. package/dist/core/events/base-event-store.d.ts.map +1 -1
  45. package/dist/core/events/base-event-store.js +22 -14
  46. package/dist/core/events/base-event-store.js.map +1 -1
  47. package/dist/core/events/file.d.ts +39 -1
  48. package/dist/core/events/file.d.ts.map +1 -1
  49. package/dist/core/events/file.js +159 -20
  50. package/dist/core/events/file.js.map +1 -1
  51. package/dist/core/events/types.d.ts +1 -1
  52. package/dist/core/file-store/containment.d.ts +19 -0
  53. package/dist/core/file-store/containment.d.ts.map +1 -0
  54. package/dist/core/file-store/containment.js +62 -0
  55. package/dist/core/file-store/containment.js.map +1 -0
  56. package/dist/core/file-store/file-store.d.ts +22 -2
  57. package/dist/core/file-store/file-store.d.ts.map +1 -1
  58. package/dist/core/file-store/file-store.js +88 -20
  59. package/dist/core/file-store/file-store.js.map +1 -1
  60. package/dist/core/file-store/types.d.ts +13 -1
  61. package/dist/core/file-store/types.d.ts.map +1 -1
  62. package/dist/core/image/image-processor.d.ts.map +1 -1
  63. package/dist/core/image/image-processor.js +3 -1
  64. package/dist/core/image/image-processor.js.map +1 -1
  65. package/dist/core/image/types.d.ts +2 -0
  66. package/dist/core/image/types.d.ts.map +1 -1
  67. package/dist/core/image/vips-resizer.d.ts.map +1 -1
  68. package/dist/core/image/vips-resizer.js +81 -33
  69. package/dist/core/image/vips-resizer.js.map +1 -1
  70. package/dist/core/llm/anthropic.d.ts +0 -1
  71. package/dist/core/llm/anthropic.d.ts.map +1 -1
  72. package/dist/core/llm/anthropic.js +101 -74
  73. package/dist/core/llm/anthropic.js.map +1 -1
  74. package/dist/core/llm/logger.d.ts +14 -2
  75. package/dist/core/llm/logger.d.ts.map +1 -1
  76. package/dist/core/llm/logger.js +161 -36
  77. package/dist/core/llm/logger.js.map +1 -1
  78. package/dist/core/llm/openrouter.d.ts +0 -1
  79. package/dist/core/llm/openrouter.d.ts.map +1 -1
  80. package/dist/core/llm/openrouter.js +70 -74
  81. package/dist/core/llm/openrouter.js.map +1 -1
  82. package/dist/core/llm/provider-request.d.ts +10 -0
  83. package/dist/core/llm/provider-request.d.ts.map +1 -0
  84. package/dist/core/llm/provider-request.js +41 -0
  85. package/dist/core/llm/provider-request.js.map +1 -0
  86. package/dist/core/llm/provider.d.ts +45 -3
  87. package/dist/core/llm/provider.d.ts.map +1 -1
  88. package/dist/core/llm/provider.js +26 -0
  89. package/dist/core/llm/provider.js.map +1 -1
  90. package/dist/core/llm/state.d.ts +4 -2
  91. package/dist/core/llm/state.d.ts.map +1 -1
  92. package/dist/core/llm/state.js +15 -4
  93. package/dist/core/llm/state.js.map +1 -1
  94. package/dist/core/plugins/plugin-builder.d.ts +57 -3
  95. package/dist/core/plugins/plugin-builder.d.ts.map +1 -1
  96. package/dist/core/plugins/plugin-builder.js +68 -14
  97. package/dist/core/plugins/plugin-builder.js.map +1 -1
  98. package/dist/core/preset/preset-builder.d.ts +3 -2
  99. package/dist/core/preset/preset-builder.d.ts.map +1 -1
  100. package/dist/core/preset/preset-builder.js +7 -16
  101. package/dist/core/preset/preset-builder.js.map +1 -1
  102. package/dist/core/sessions/context.d.ts +23 -5
  103. package/dist/core/sessions/context.d.ts.map +1 -1
  104. package/dist/core/sessions/runtime-activity.d.ts +33 -0
  105. package/dist/core/sessions/runtime-activity.d.ts.map +1 -0
  106. package/dist/core/sessions/runtime-activity.js +55 -0
  107. package/dist/core/sessions/runtime-activity.js.map +1 -0
  108. package/dist/core/sessions/schema.d.ts +23 -2
  109. package/dist/core/sessions/schema.d.ts.map +1 -1
  110. package/dist/core/sessions/schema.js +24 -3
  111. package/dist/core/sessions/schema.js.map +1 -1
  112. package/dist/core/sessions/session-manager.d.ts +83 -6
  113. package/dist/core/sessions/session-manager.d.ts.map +1 -1
  114. package/dist/core/sessions/session-manager.js +517 -118
  115. package/dist/core/sessions/session-manager.js.map +1 -1
  116. package/dist/core/sessions/session-store.d.ts +18 -0
  117. package/dist/core/sessions/session-store.d.ts.map +1 -1
  118. package/dist/core/sessions/session-store.js +33 -0
  119. package/dist/core/sessions/session-store.js.map +1 -1
  120. package/dist/core/sessions/session.d.ts +42 -6
  121. package/dist/core/sessions/session.d.ts.map +1 -1
  122. package/dist/core/sessions/session.js +176 -44
  123. package/dist/core/sessions/session.js.map +1 -1
  124. package/dist/core/sessions/state.d.ts +10 -1
  125. package/dist/core/sessions/state.d.ts.map +1 -1
  126. package/dist/core/sessions/state.js +16 -1
  127. package/dist/core/sessions/state.js.map +1 -1
  128. package/dist/core/system.d.ts +9 -0
  129. package/dist/core/system.d.ts.map +1 -1
  130. package/dist/core/system.js +4 -1
  131. package/dist/core/system.js.map +1 -1
  132. package/dist/core/tools/executor.d.ts +1 -1
  133. package/dist/core/wake-key.d.ts +34 -0
  134. package/dist/core/wake-key.d.ts.map +1 -0
  135. package/dist/core/wake-key.js +51 -0
  136. package/dist/core/wake-key.js.map +1 -0
  137. package/dist/index.d.ts +24 -13
  138. package/dist/index.d.ts.map +1 -1
  139. package/dist/index.js +22 -8
  140. package/dist/index.js.map +1 -1
  141. package/dist/lib/archive/archive-inspection.d.ts +48 -0
  142. package/dist/lib/archive/archive-inspection.d.ts.map +1 -0
  143. package/dist/lib/archive/archive-inspection.fixtures.d.ts +7 -0
  144. package/dist/lib/archive/archive-inspection.fixtures.d.ts.map +1 -0
  145. package/dist/lib/archive/archive-inspection.fixtures.js +134 -0
  146. package/dist/lib/archive/archive-inspection.fixtures.js.map +1 -0
  147. package/dist/lib/archive/archive-inspection.js +253 -0
  148. package/dist/lib/archive/archive-inspection.js.map +1 -0
  149. package/dist/lib/archive/index.d.ts +3 -0
  150. package/dist/lib/archive/index.d.ts.map +1 -0
  151. package/dist/lib/archive/index.js +2 -0
  152. package/dist/lib/archive/index.js.map +1 -0
  153. package/dist/lib/logger/console.d.ts +5 -12
  154. package/dist/lib/logger/console.d.ts.map +1 -1
  155. package/dist/lib/logger/console.js +5 -47
  156. package/dist/lib/logger/console.js.map +1 -1
  157. package/dist/lib/logger/file.d.ts +8 -11
  158. package/dist/lib/logger/file.d.ts.map +1 -1
  159. package/dist/lib/logger/file.js +26 -37
  160. package/dist/lib/logger/file.js.map +1 -1
  161. package/dist/lib/logger/index.d.ts +3 -1
  162. package/dist/lib/logger/index.d.ts.map +1 -1
  163. package/dist/lib/logger/index.js +3 -1
  164. package/dist/lib/logger/index.js.map +1 -1
  165. package/dist/lib/logger/jsonl.d.ts +21 -0
  166. package/dist/lib/logger/jsonl.d.ts.map +1 -0
  167. package/dist/lib/logger/jsonl.js +29 -0
  168. package/dist/lib/logger/jsonl.js.map +1 -0
  169. package/dist/lib/logger/logger.d.ts +22 -0
  170. package/dist/lib/logger/logger.d.ts.map +1 -1
  171. package/dist/lib/logger/logger.js +37 -0
  172. package/dist/lib/logger/logger.js.map +1 -1
  173. package/dist/lib/logger/session-log.d.ts +21 -0
  174. package/dist/lib/logger/session-log.d.ts.map +1 -0
  175. package/dist/lib/logger/session-log.js +37 -0
  176. package/dist/lib/logger/session-log.js.map +1 -0
  177. package/dist/lib/utils/concurrency.d.ts +1 -1
  178. package/dist/lib/utils/concurrency.d.ts.map +1 -1
  179. package/dist/lib/utils/concurrency.js +30 -7
  180. package/dist/lib/utils/concurrency.js.map +1 -1
  181. package/dist/lib/utils/fs-batch.d.ts +17 -0
  182. package/dist/lib/utils/fs-batch.d.ts.map +1 -0
  183. package/dist/lib/utils/fs-batch.js +38 -0
  184. package/dist/lib/utils/fs-batch.js.map +1 -0
  185. package/dist/lib/utils/result.d.ts +7 -22
  186. package/dist/lib/utils/result.d.ts.map +1 -1
  187. package/dist/lib/utils/result.js +6 -17
  188. package/dist/lib/utils/result.js.map +1 -1
  189. package/dist/lib/utils/sleep.d.ts +10 -0
  190. package/dist/lib/utils/sleep.d.ts.map +1 -0
  191. package/dist/lib/utils/sleep.js +26 -0
  192. package/dist/lib/utils/sleep.js.map +1 -0
  193. package/dist/platform/fs-revision.d.ts +21 -0
  194. package/dist/platform/fs-revision.d.ts.map +1 -0
  195. package/dist/platform/fs-revision.js +9 -0
  196. package/dist/platform/fs-revision.js.map +1 -0
  197. package/dist/platform/fs.d.ts +104 -1
  198. package/dist/platform/fs.d.ts.map +1 -1
  199. package/dist/platform/git.d.ts +59 -0
  200. package/dist/platform/git.d.ts.map +1 -0
  201. package/dist/platform/git.js +8 -0
  202. package/dist/platform/git.js.map +1 -0
  203. package/dist/platform/index.d.ts +40 -1
  204. package/dist/platform/index.d.ts.map +1 -1
  205. package/dist/platform/index.js +1 -1
  206. package/dist/platform/index.js.map +1 -1
  207. package/dist/platform/llm-call-log.d.ts +80 -0
  208. package/dist/platform/llm-call-log.d.ts.map +1 -0
  209. package/dist/platform/llm-call-log.js +12 -0
  210. package/dist/platform/llm-call-log.js.map +1 -0
  211. package/dist/platform/scheduler.d.ts +32 -0
  212. package/dist/platform/scheduler.d.ts.map +1 -0
  213. package/dist/platform/scheduler.js +46 -0
  214. package/dist/platform/scheduler.js.map +1 -0
  215. package/dist/platform/session-log.d.ts +36 -0
  216. package/dist/platform/session-log.d.ts.map +1 -0
  217. package/dist/platform/session-log.js +12 -0
  218. package/dist/platform/session-log.js.map +1 -0
  219. package/dist/platform/shell.d.ts +83 -0
  220. package/dist/platform/shell.d.ts.map +1 -0
  221. package/dist/platform/shell.js +13 -0
  222. package/dist/platform/shell.js.map +1 -0
  223. package/dist/plugins/agent-status/plugin.d.ts.map +1 -1
  224. package/dist/plugins/agent-status/plugin.js +1 -0
  225. package/dist/plugins/agent-status/plugin.js.map +1 -1
  226. package/dist/plugins/agents/plugin.d.ts.map +1 -1
  227. package/dist/plugins/agents/plugin.js +129 -62
  228. package/dist/plugins/agents/plugin.js.map +1 -1
  229. package/dist/plugins/filesystem/listing.d.ts +3 -0
  230. package/dist/plugins/filesystem/listing.d.ts.map +1 -1
  231. package/dist/plugins/filesystem/listing.js +66 -10
  232. package/dist/plugins/filesystem/listing.js.map +1 -1
  233. package/dist/plugins/filesystem/plugin.d.ts.map +1 -1
  234. package/dist/plugins/filesystem/plugin.js +8 -6
  235. package/dist/plugins/filesystem/plugin.js.map +1 -1
  236. package/dist/plugins/git-status/plugin.d.ts +34 -7
  237. package/dist/plugins/git-status/plugin.d.ts.map +1 -1
  238. package/dist/plugins/git-status/plugin.js +168 -64
  239. package/dist/plugins/git-status/plugin.js.map +1 -1
  240. package/dist/plugins/llm-debug/plugin.d.ts.map +1 -1
  241. package/dist/plugins/llm-debug/plugin.js +1 -0
  242. package/dist/plugins/llm-debug/plugin.js.map +1 -1
  243. package/dist/plugins/logs/plugin.d.ts +1 -4
  244. package/dist/plugins/logs/plugin.d.ts.map +1 -1
  245. package/dist/plugins/logs/plugin.js +7 -0
  246. package/dist/plugins/logs/plugin.js.map +1 -1
  247. package/dist/plugins/mailbox/helpers.d.ts +2 -2
  248. package/dist/plugins/mailbox/helpers.js +1 -1
  249. package/dist/plugins/mailbox/plugin.d.ts.map +1 -1
  250. package/dist/plugins/mailbox/plugin.js +38 -43
  251. package/dist/plugins/mailbox/plugin.js.map +1 -1
  252. package/dist/plugins/mailbox/query.d.ts +7 -2
  253. package/dist/plugins/mailbox/query.d.ts.map +1 -1
  254. package/dist/plugins/mailbox/query.js +14 -7
  255. package/dist/plugins/mailbox/query.js.map +1 -1
  256. package/dist/plugins/mailbox/state.d.ts +5 -4
  257. package/dist/plugins/mailbox/state.d.ts.map +1 -1
  258. package/dist/plugins/mailbox/state.js +6 -5
  259. package/dist/plugins/mailbox/state.js.map +1 -1
  260. package/dist/plugins/resources/filename.d.ts +4 -0
  261. package/dist/plugins/resources/filename.d.ts.map +1 -0
  262. package/dist/plugins/resources/filename.js +18 -0
  263. package/dist/plugins/resources/filename.js.map +1 -0
  264. package/dist/plugins/resources/plugin.d.ts +3 -0
  265. package/dist/plugins/resources/plugin.d.ts.map +1 -1
  266. package/dist/plugins/resources/plugin.js +97 -60
  267. package/dist/plugins/resources/plugin.js.map +1 -1
  268. package/dist/plugins/resources/state.d.ts +1 -1
  269. package/dist/plugins/resources/state.js +1 -1
  270. package/dist/plugins/result-eviction/plugin.d.ts.map +1 -1
  271. package/dist/plugins/result-eviction/plugin.js +6 -1
  272. package/dist/plugins/result-eviction/plugin.js.map +1 -1
  273. package/dist/plugins/services/plugin.d.ts +4 -1
  274. package/dist/plugins/services/plugin.d.ts.map +1 -1
  275. package/dist/plugins/services/plugin.js +251 -100
  276. package/dist/plugins/services/plugin.js.map +1 -1
  277. package/dist/plugins/services/prompt.d.ts.map +1 -1
  278. package/dist/plugins/services/prompt.js +1 -4
  279. package/dist/plugins/services/prompt.js.map +1 -1
  280. package/dist/plugins/services/schema.d.ts +15 -5
  281. package/dist/plugins/services/schema.d.ts.map +1 -1
  282. package/dist/plugins/services/service.d.ts +100 -18
  283. package/dist/plugins/services/service.d.ts.map +1 -1
  284. package/dist/plugins/services/service.js +680 -230
  285. package/dist/plugins/services/service.js.map +1 -1
  286. package/dist/plugins/session-lifecycle/plugin.d.ts +21 -1
  287. package/dist/plugins/session-lifecycle/plugin.d.ts.map +1 -1
  288. package/dist/plugins/session-lifecycle/plugin.js +53 -40
  289. package/dist/plugins/session-lifecycle/plugin.js.map +1 -1
  290. package/dist/plugins/session-state/plugin.d.ts +21 -13
  291. package/dist/plugins/session-state/plugin.d.ts.map +1 -1
  292. package/dist/plugins/session-state/plugin.js +214 -79
  293. package/dist/plugins/session-state/plugin.js.map +1 -1
  294. package/dist/plugins/session-stats/plugin.d.ts.map +1 -1
  295. package/dist/plugins/session-stats/plugin.js +1 -0
  296. package/dist/plugins/session-stats/plugin.js.map +1 -1
  297. package/dist/plugins/shell/executor.d.ts +17 -15
  298. package/dist/plugins/shell/executor.d.ts.map +1 -1
  299. package/dist/plugins/shell/executor.js +130 -195
  300. package/dist/plugins/shell/executor.js.map +1 -1
  301. package/dist/plugins/shell/index.d.ts +2 -2
  302. package/dist/plugins/shell/index.d.ts.map +1 -1
  303. package/dist/plugins/shell/index.js +2 -2
  304. package/dist/plugins/shell/index.js.map +1 -1
  305. package/dist/plugins/shell/plugin.d.ts +5 -4
  306. package/dist/plugins/shell/plugin.d.ts.map +1 -1
  307. package/dist/plugins/shell/plugin.js +4 -8
  308. package/dist/plugins/shell/plugin.js.map +1 -1
  309. package/dist/plugins/skills/discovery.d.ts.map +1 -1
  310. package/dist/plugins/skills/discovery.js +10 -8
  311. package/dist/plugins/skills/discovery.js.map +1 -1
  312. package/dist/plugins/skills/index.d.ts +1 -1
  313. package/dist/plugins/skills/index.d.ts.map +1 -1
  314. package/dist/plugins/skills/plugin.d.ts +1 -1
  315. package/dist/plugins/skills/plugin.d.ts.map +1 -1
  316. package/dist/plugins/skills/plugin.js +23 -30
  317. package/dist/plugins/skills/plugin.js.map +1 -1
  318. package/dist/plugins/skills/prompts.d.ts +3 -3
  319. package/dist/plugins/skills/prompts.d.ts.map +1 -1
  320. package/dist/plugins/skills/prompts.js.map +1 -1
  321. package/dist/plugins/skills/schema.d.ts +4 -2
  322. package/dist/plugins/skills/schema.d.ts.map +1 -1
  323. package/dist/plugins/todo/schema.d.ts +1 -1
  324. package/dist/plugins/uploads/plugin.d.ts +11 -4
  325. package/dist/plugins/uploads/plugin.d.ts.map +1 -1
  326. package/dist/plugins/uploads/plugin.js +891 -225
  327. package/dist/plugins/uploads/plugin.js.map +1 -1
  328. package/dist/plugins/uploads/preprocessor.d.ts +14 -0
  329. package/dist/plugins/uploads/preprocessor.d.ts.map +1 -1
  330. package/dist/plugins/uploads/preprocessor.js +11 -0
  331. package/dist/plugins/uploads/preprocessor.js.map +1 -1
  332. package/dist/plugins/uploads/preprocessors/image-classifier.d.ts +1 -1
  333. package/dist/plugins/uploads/preprocessors/image-classifier.d.ts.map +1 -1
  334. package/dist/plugins/uploads/preprocessors/image-classifier.js +51 -26
  335. package/dist/plugins/uploads/preprocessors/image-classifier.js.map +1 -1
  336. package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.d.ts +2 -2
  337. package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.d.ts.map +1 -1
  338. package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.js +41 -16
  339. package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.js.map +1 -1
  340. package/dist/plugins/uploads/preprocessors/pdf-preprocessor.d.ts +1 -1
  341. package/dist/plugins/uploads/preprocessors/pdf-preprocessor.d.ts.map +1 -1
  342. package/dist/plugins/uploads/preprocessors/pdf-preprocessor.js +29 -14
  343. package/dist/plugins/uploads/preprocessors/pdf-preprocessor.js.map +1 -1
  344. package/dist/plugins/uploads/preprocessors/zip-preprocessor.d.ts +1 -1
  345. package/dist/plugins/uploads/preprocessors/zip-preprocessor.d.ts.map +1 -1
  346. package/dist/plugins/uploads/preprocessors/zip-preprocessor.js +62 -34
  347. package/dist/plugins/uploads/preprocessors/zip-preprocessor.js.map +1 -1
  348. package/dist/plugins/uploads/schema.d.ts +25 -2
  349. package/dist/plugins/uploads/schema.d.ts.map +1 -1
  350. package/dist/plugins/uploads/schema.js +24 -3
  351. package/dist/plugins/uploads/schema.js.map +1 -1
  352. package/dist/plugins/uploads/state.d.ts +13 -1
  353. package/dist/plugins/uploads/state.d.ts.map +1 -1
  354. package/dist/plugins/uploads/state.js +4 -1
  355. package/dist/plugins/uploads/state.js.map +1 -1
  356. package/dist/plugins/user-chat/plugin.d.ts +12 -5
  357. package/dist/plugins/user-chat/plugin.d.ts.map +1 -1
  358. package/dist/plugins/user-chat/plugin.js +141 -32
  359. package/dist/plugins/user-chat/plugin.js.map +1 -1
  360. package/dist/plugins/workers/context.d.ts +35 -13
  361. package/dist/plugins/workers/context.d.ts.map +1 -1
  362. package/dist/plugins/workers/context.js +82 -32
  363. package/dist/plugins/workers/context.js.map +1 -1
  364. package/dist/plugins/workers/definition.d.ts +7 -0
  365. package/dist/plugins/workers/definition.d.ts.map +1 -1
  366. package/dist/plugins/workers/definition.js.map +1 -1
  367. package/dist/plugins/workers/index.d.ts +4 -4
  368. package/dist/plugins/workers/index.d.ts.map +1 -1
  369. package/dist/plugins/workers/index.js +2 -2
  370. package/dist/plugins/workers/index.js.map +1 -1
  371. package/dist/plugins/workers/plugin.d.ts +10 -57
  372. package/dist/plugins/workers/plugin.d.ts.map +1 -1
  373. package/dist/plugins/workers/plugin.js +385 -123
  374. package/dist/plugins/workers/plugin.js.map +1 -1
  375. package/dist/plugins/workers/state.d.ts +69 -0
  376. package/dist/plugins/workers/state.d.ts.map +1 -0
  377. package/dist/plugins/workers/state.js +52 -0
  378. package/dist/plugins/workers/state.js.map +1 -0
  379. package/dist/plugins/workers/worker.d.ts +15 -4
  380. package/dist/plugins/workers/worker.d.ts.map +1 -1
  381. package/dist/testing/conformance.d.ts +106 -0
  382. package/dist/testing/conformance.d.ts.map +1 -0
  383. package/dist/testing/conformance.js +1463 -0
  384. package/dist/testing/conformance.js.map +1 -0
  385. package/dist/testing/node-platform.d.ts.map +1 -1
  386. package/dist/testing/node-platform.js +5 -0
  387. package/dist/testing/node-platform.js.map +1 -1
  388. package/dist/testing/test-harness.d.ts +11 -1
  389. package/dist/testing/test-harness.d.ts.map +1 -1
  390. package/dist/testing/test-harness.js +17 -37
  391. package/dist/testing/test-harness.js.map +1 -1
  392. package/dist/testing/wait-helpers.d.ts.map +1 -1
  393. package/dist/testing/wait-helpers.js +1 -3
  394. package/dist/testing/wait-helpers.js.map +1 -1
  395. package/dist/transport/adapter/client-adapter.d.ts +6 -0
  396. package/dist/transport/adapter/client-adapter.d.ts.map +1 -1
  397. package/dist/transport/adapter/client-adapter.js +50 -3
  398. package/dist/transport/adapter/client-adapter.js.map +1 -1
  399. package/dist/transport/adapter/heartbeat.d.ts +16 -0
  400. package/dist/transport/adapter/heartbeat.d.ts.map +1 -0
  401. package/dist/transport/adapter/heartbeat.js +41 -0
  402. package/dist/transport/adapter/heartbeat.js.map +1 -0
  403. package/dist/transport/adapter/server-adapter.d.ts.map +1 -1
  404. package/dist/transport/adapter/server-adapter.js +6 -0
  405. package/dist/transport/adapter/server-adapter.js.map +1 -1
  406. package/dist/transport/http/app.d.ts +3 -30
  407. package/dist/transport/http/app.d.ts.map +1 -1
  408. package/dist/transport/http/app.js +3 -7
  409. package/dist/transport/http/app.js.map +1 -1
  410. package/dist/transport/http/context.d.ts +40 -0
  411. package/dist/transport/http/context.d.ts.map +1 -0
  412. package/dist/transport/http/context.js +17 -0
  413. package/dist/transport/http/context.js.map +1 -0
  414. package/dist/transport/http/fetch-guard.d.ts +49 -0
  415. package/dist/transport/http/fetch-guard.d.ts.map +1 -0
  416. package/dist/transport/http/fetch-guard.js +312 -0
  417. package/dist/transport/http/fetch-guard.js.map +1 -0
  418. package/dist/transport/http/index.d.ts +1 -1
  419. package/dist/transport/http/index.d.ts.map +1 -1
  420. package/dist/transport/http/middleware/bearer-auth.d.ts +1 -1
  421. package/dist/transport/http/middleware/bearer-auth.d.ts.map +1 -1
  422. package/dist/transport/http/middleware/error-handler.d.ts +2 -2
  423. package/dist/transport/http/middleware/error-handler.d.ts.map +1 -1
  424. package/dist/transport/http/path-containment.d.ts +20 -0
  425. package/dist/transport/http/path-containment.d.ts.map +1 -0
  426. package/dist/transport/http/path-containment.js +31 -0
  427. package/dist/transport/http/path-containment.js.map +1 -0
  428. package/dist/transport/http/responses.d.ts +30 -0
  429. package/dist/transport/http/responses.d.ts.map +1 -0
  430. package/dist/transport/http/responses.js +5 -0
  431. package/dist/transport/http/responses.js.map +1 -0
  432. package/dist/transport/http/routes/files.d.ts +1 -1
  433. package/dist/transport/http/routes/files.d.ts.map +1 -1
  434. package/dist/transport/http/routes/files.js +54 -155
  435. package/dist/transport/http/routes/files.js.map +1 -1
  436. package/dist/transport/http/routes/resources.d.ts +1 -1
  437. package/dist/transport/http/routes/resources.d.ts.map +1 -1
  438. package/dist/transport/http/routes/resources.js +92 -57
  439. package/dist/transport/http/routes/resources.js.map +1 -1
  440. package/dist/transport/http/routes/rpc.d.ts +6 -1
  441. package/dist/transport/http/routes/rpc.d.ts.map +1 -1
  442. package/dist/transport/http/routes/rpc.js +51 -21
  443. package/dist/transport/http/routes/rpc.js.map +1 -1
  444. package/dist/transport/http/routes/upload.d.ts +1 -1
  445. package/dist/transport/http/routes/upload.d.ts.map +1 -1
  446. package/dist/transport/http/routes/upload.js +256 -169
  447. package/dist/transport/http/routes/upload.js.map +1 -1
  448. package/dist/user-config.d.ts +34 -7
  449. package/dist/user-config.d.ts.map +1 -1
  450. package/dist/user-config.js +71 -0
  451. package/dist/user-config.js.map +1 -1
  452. package/package.json +18 -8
  453. package/src/bootstrap.ts +119 -35
  454. package/src/bun-platform/fs.ts +1 -0
  455. package/src/bun-platform/index.ts +18 -1
  456. package/src/bun-platform/server-lifecycle.ts +218 -0
  457. package/src/bun-platform/shell.ts +362 -0
  458. package/src/config.ts +130 -0
  459. package/src/core/agents/agent.ts +219 -95
  460. package/src/core/agents/config.ts +8 -0
  461. package/src/core/agents/retry.ts +16 -17
  462. package/src/core/agents/state.ts +28 -0
  463. package/src/core/context/state.ts +4 -0
  464. package/src/core/events/base-event-store.ts +24 -16
  465. package/src/core/events/file.ts +198 -22
  466. package/src/core/file-store/containment.ts +75 -0
  467. package/src/core/file-store/file-store.ts +106 -25
  468. package/src/core/file-store/types.ts +14 -1
  469. package/src/core/image/image-processor.ts +3 -1
  470. package/src/core/image/types.ts +2 -0
  471. package/src/core/image/vips-resizer.ts +102 -37
  472. package/src/core/llm/anthropic.ts +127 -82
  473. package/src/core/llm/logger.ts +175 -37
  474. package/src/core/llm/openrouter.ts +82 -81
  475. package/src/core/llm/provider-request.ts +40 -0
  476. package/src/core/llm/provider.ts +72 -3
  477. package/src/core/llm/state.ts +12 -0
  478. package/src/core/plugins/plugin-builder.ts +106 -14
  479. package/src/core/preset/preset-builder.ts +12 -22
  480. package/src/core/sessions/context.ts +18 -0
  481. package/src/core/sessions/runtime-activity.ts +78 -0
  482. package/src/core/sessions/schema.ts +29 -3
  483. package/src/core/sessions/session-manager.ts +560 -140
  484. package/src/core/sessions/session-store.ts +38 -0
  485. package/src/core/sessions/session.ts +187 -47
  486. package/src/core/sessions/state.ts +16 -0
  487. package/src/core/system.ts +15 -0
  488. package/src/core/wake-key.ts +65 -0
  489. package/src/index.ts +31 -12
  490. package/src/lib/archive/archive-inspection.fixtures.ts +138 -0
  491. package/src/lib/archive/archive-inspection.ts +359 -0
  492. package/src/lib/archive/index.ts +17 -0
  493. package/src/lib/logger/console.ts +7 -57
  494. package/src/lib/logger/file.ts +28 -50
  495. package/src/lib/logger/index.ts +3 -1
  496. package/src/lib/logger/jsonl.ts +36 -0
  497. package/src/lib/logger/logger.ts +48 -0
  498. package/src/lib/logger/session-log.ts +42 -0
  499. package/src/lib/utils/concurrency.ts +37 -8
  500. package/src/lib/utils/fs-batch.ts +49 -0
  501. package/src/lib/utils/result.ts +7 -31
  502. package/src/lib/utils/sleep.ts +23 -0
  503. package/src/platform/fs-revision.ts +21 -0
  504. package/src/platform/fs.ts +109 -1
  505. package/src/platform/git.ts +67 -0
  506. package/src/platform/index.ts +51 -1
  507. package/src/platform/llm-call-log.ts +86 -0
  508. package/src/platform/scheduler.ts +71 -0
  509. package/src/platform/session-log.ts +39 -0
  510. package/src/platform/shell.ts +89 -0
  511. package/src/plugins/agent-status/plugin.ts +1 -0
  512. package/src/plugins/agents/plugin.ts +134 -81
  513. package/src/plugins/filesystem/listing.ts +70 -12
  514. package/src/plugins/filesystem/plugin.ts +8 -6
  515. package/src/plugins/git-status/plugin.ts +204 -77
  516. package/src/plugins/llm-debug/plugin.ts +1 -0
  517. package/src/plugins/logs/plugin.ts +9 -0
  518. package/src/plugins/mailbox/plugin.ts +46 -64
  519. package/src/plugins/mailbox/query.ts +15 -7
  520. package/src/plugins/mailbox/state.ts +1 -0
  521. package/src/plugins/resources/filename.ts +19 -0
  522. package/src/plugins/resources/plugin.ts +111 -59
  523. package/src/plugins/result-eviction/plugin.ts +6 -1
  524. package/src/plugins/services/plugin.ts +254 -98
  525. package/src/plugins/services/prompt.ts +1 -6
  526. package/src/plugins/services/schema.ts +17 -3
  527. package/src/plugins/services/service.ts +702 -252
  528. package/src/plugins/session-lifecycle/plugin.ts +56 -41
  529. package/src/plugins/session-state/plugin.ts +242 -88
  530. package/src/plugins/session-stats/plugin.ts +1 -0
  531. package/src/plugins/shell/executor.ts +144 -226
  532. package/src/plugins/shell/index.ts +1 -4
  533. package/src/plugins/shell/plugin.ts +7 -9
  534. package/src/plugins/skills/discovery.ts +10 -8
  535. package/src/plugins/skills/index.ts +1 -1
  536. package/src/plugins/skills/plugin.ts +19 -27
  537. package/src/plugins/skills/prompts.ts +3 -3
  538. package/src/plugins/skills/schema.ts +5 -2
  539. package/src/plugins/uploads/plugin.ts +991 -273
  540. package/src/plugins/uploads/preprocessor.ts +25 -0
  541. package/src/plugins/uploads/preprocessors/image-classifier.ts +56 -25
  542. package/src/plugins/uploads/preprocessors/markitdown-preprocessor.ts +41 -15
  543. package/src/plugins/uploads/preprocessors/pdf-preprocessor.ts +32 -16
  544. package/src/plugins/uploads/preprocessors/zip-preprocessor.ts +67 -38
  545. package/src/plugins/uploads/schema.ts +30 -3
  546. package/src/plugins/uploads/state.ts +12 -0
  547. package/src/plugins/user-chat/plugin.ts +196 -40
  548. package/src/plugins/workers/context.ts +102 -39
  549. package/src/plugins/workers/definition.ts +7 -0
  550. package/src/plugins/workers/index.ts +4 -4
  551. package/src/plugins/workers/plugin.ts +461 -151
  552. package/src/plugins/workers/state.ts +64 -0
  553. package/src/plugins/workers/worker.ts +15 -4
  554. package/src/testing/conformance.ts +1751 -0
  555. package/src/testing/node-platform.ts +5 -0
  556. package/src/testing/test-harness.ts +21 -38
  557. package/src/testing/wait-helpers.ts +1 -4
  558. package/src/transport/adapter/client-adapter.ts +60 -3
  559. package/src/transport/adapter/heartbeat.ts +50 -0
  560. package/src/transport/adapter/server-adapter.ts +6 -0
  561. package/src/transport/http/app.ts +7 -35
  562. package/src/transport/http/context.ts +46 -0
  563. package/src/transport/http/fetch-guard.ts +318 -0
  564. package/src/transport/http/index.ts +1 -1
  565. package/src/transport/http/middleware/bearer-auth.ts +1 -1
  566. package/src/transport/http/middleware/error-handler.ts +1 -1
  567. package/src/transport/http/path-containment.ts +44 -0
  568. package/src/transport/http/responses.ts +20 -0
  569. package/src/transport/http/routes/files.ts +69 -159
  570. package/src/transport/http/routes/resources.ts +124 -93
  571. package/src/transport/http/routes/rpc.ts +63 -26
  572. package/src/transport/http/routes/upload.ts +327 -258
  573. package/src/user-config.ts +93 -7
  574. package/dist/config.test.d.ts +0 -2
  575. package/dist/config.test.d.ts.map +0 -1
  576. package/dist/config.test.js +0 -155
  577. package/dist/config.test.js.map +0 -1
  578. package/dist/core/agent-loop.integration.test.d.ts +0 -2
  579. package/dist/core/agent-loop.integration.test.d.ts.map +0 -1
  580. package/dist/core/agent-loop.integration.test.js +0 -414
  581. package/dist/core/agent-loop.integration.test.js.map +0 -1
  582. package/dist/core/agents/agent-config.test.d.ts +0 -2
  583. package/dist/core/agents/agent-config.test.d.ts.map +0 -1
  584. package/dist/core/agents/agent-config.test.js +0 -194
  585. package/dist/core/agents/agent-config.test.js.map +0 -1
  586. package/dist/core/agents/agent-shutdown.test.d.ts +0 -6
  587. package/dist/core/agents/agent-shutdown.test.d.ts.map +0 -1
  588. package/dist/core/agents/agent-shutdown.test.js +0 -180
  589. package/dist/core/agents/agent-shutdown.test.js.map +0 -1
  590. package/dist/core/agents/agent.test.d.ts +0 -2
  591. package/dist/core/agents/agent.test.d.ts.map +0 -1
  592. package/dist/core/agents/agent.test.js +0 -313
  593. package/dist/core/agents/agent.test.js.map +0 -1
  594. package/dist/core/agents/communicator.d.ts +0 -3
  595. package/dist/core/agents/communicator.d.ts.map +0 -1
  596. package/dist/core/agents/communicator.js +0 -13
  597. package/dist/core/agents/communicator.js.map +0 -1
  598. package/dist/core/agents/handler-events.test.d.ts +0 -5
  599. package/dist/core/agents/handler-events.test.d.ts.map +0 -1
  600. package/dist/core/agents/handler-events.test.js +0 -115
  601. package/dist/core/agents/handler-events.test.js.map +0 -1
  602. package/dist/core/agents/response-sanitizer.test.d.ts +0 -2
  603. package/dist/core/agents/response-sanitizer.test.d.ts.map +0 -1
  604. package/dist/core/agents/response-sanitizer.test.js +0 -101
  605. package/dist/core/agents/response-sanitizer.test.js.map +0 -1
  606. package/dist/core/error-recovery.integration.test.d.ts +0 -2
  607. package/dist/core/error-recovery.integration.test.d.ts.map +0 -1
  608. package/dist/core/error-recovery.integration.test.js +0 -288
  609. package/dist/core/error-recovery.integration.test.js.map +0 -1
  610. package/dist/core/event-sourcing.integration.test.d.ts +0 -2
  611. package/dist/core/event-sourcing.integration.test.d.ts.map +0 -1
  612. package/dist/core/event-sourcing.integration.test.js +0 -154
  613. package/dist/core/event-sourcing.integration.test.js.map +0 -1
  614. package/dist/core/events/file.test.d.ts +0 -2
  615. package/dist/core/events/file.test.d.ts.map +0 -1
  616. package/dist/core/events/file.test.js +0 -284
  617. package/dist/core/events/file.test.js.map +0 -1
  618. package/dist/core/events/memory.test.d.ts +0 -2
  619. package/dist/core/events/memory.test.d.ts.map +0 -1
  620. package/dist/core/events/memory.test.js +0 -502
  621. package/dist/core/events/memory.test.js.map +0 -1
  622. package/dist/core/image/image-processor.test.d.ts +0 -2
  623. package/dist/core/image/image-processor.test.d.ts.map +0 -1
  624. package/dist/core/image/image-processor.test.js +0 -171
  625. package/dist/core/image/image-processor.test.js.map +0 -1
  626. package/dist/core/image/vips-resizer.test.d.ts +0 -2
  627. package/dist/core/image/vips-resizer.test.d.ts.map +0 -1
  628. package/dist/core/image/vips-resizer.test.js +0 -336
  629. package/dist/core/image/vips-resizer.test.js.map +0 -1
  630. package/dist/core/llm/anthropic.test.d.ts +0 -2
  631. package/dist/core/llm/anthropic.test.d.ts.map +0 -1
  632. package/dist/core/llm/anthropic.test.js +0 -464
  633. package/dist/core/llm/anthropic.test.js.map +0 -1
  634. package/dist/core/llm/cache-breakpoints.test.d.ts +0 -2
  635. package/dist/core/llm/cache-breakpoints.test.d.ts.map +0 -1
  636. package/dist/core/llm/cache-breakpoints.test.js +0 -69
  637. package/dist/core/llm/cache-breakpoints.test.js.map +0 -1
  638. package/dist/core/llm/cache-live.test.d.ts +0 -16
  639. package/dist/core/llm/cache-live.test.d.ts.map +0 -1
  640. package/dist/core/llm/cache-live.test.js +0 -137
  641. package/dist/core/llm/cache-live.test.js.map +0 -1
  642. package/dist/core/llm/logger.test.d.ts +0 -7
  643. package/dist/core/llm/logger.test.d.ts.map +0 -1
  644. package/dist/core/llm/logger.test.js +0 -228
  645. package/dist/core/llm/logger.test.js.map +0 -1
  646. package/dist/core/llm/message-sanitization.test.d.ts +0 -2
  647. package/dist/core/llm/message-sanitization.test.d.ts.map +0 -1
  648. package/dist/core/llm/message-sanitization.test.js +0 -181
  649. package/dist/core/llm/message-sanitization.test.js.map +0 -1
  650. package/dist/core/llm/mock.test.d.ts +0 -2
  651. package/dist/core/llm/mock.test.d.ts.map +0 -1
  652. package/dist/core/llm/mock.test.js +0 -318
  653. package/dist/core/llm/mock.test.js.map +0 -1
  654. package/dist/core/llm/openrouter-mapping.test.d.ts +0 -2
  655. package/dist/core/llm/openrouter-mapping.test.d.ts.map +0 -1
  656. package/dist/core/llm/openrouter-mapping.test.js +0 -172
  657. package/dist/core/llm/openrouter-mapping.test.js.map +0 -1
  658. package/dist/core/llm/openrouter.test.d.ts +0 -2
  659. package/dist/core/llm/openrouter.test.d.ts.map +0 -1
  660. package/dist/core/llm/openrouter.test.js +0 -377
  661. package/dist/core/llm/openrouter.test.js.map +0 -1
  662. package/dist/core/llm/provider-integration.test.d.ts +0 -12
  663. package/dist/core/llm/provider-integration.test.d.ts.map +0 -1
  664. package/dist/core/llm/provider-integration.test.js +0 -350
  665. package/dist/core/llm/provider-integration.test.js.map +0 -1
  666. package/dist/core/llm/routing-provider.test.d.ts +0 -2
  667. package/dist/core/llm/routing-provider.test.d.ts.map +0 -1
  668. package/dist/core/llm/routing-provider.test.js +0 -94
  669. package/dist/core/llm/routing-provider.test.js.map +0 -1
  670. package/dist/core/llm/snapshot-middleware.test.d.ts +0 -2
  671. package/dist/core/llm/snapshot-middleware.test.d.ts.map +0 -1
  672. package/dist/core/llm/snapshot-middleware.test.js +0 -144
  673. package/dist/core/llm/snapshot-middleware.test.js.map +0 -1
  674. package/dist/core/multi-agent.integration.test.d.ts +0 -2
  675. package/dist/core/multi-agent.integration.test.d.ts.map +0 -1
  676. package/dist/core/multi-agent.integration.test.js +0 -298
  677. package/dist/core/multi-agent.integration.test.js.map +0 -1
  678. package/dist/core/plugin-hooks.integration.test.d.ts +0 -2
  679. package/dist/core/plugin-hooks.integration.test.d.ts.map +0 -1
  680. package/dist/core/plugin-hooks.integration.test.js +0 -458
  681. package/dist/core/plugin-hooks.integration.test.js.map +0 -1
  682. package/dist/core/session-lifecycle.integration.test.d.ts +0 -2
  683. package/dist/core/session-lifecycle.integration.test.d.ts.map +0 -1
  684. package/dist/core/session-lifecycle.integration.test.js +0 -159
  685. package/dist/core/session-lifecycle.integration.test.js.map +0 -1
  686. package/dist/core/sessions/fork-utils.test.d.ts +0 -2
  687. package/dist/core/sessions/fork-utils.test.d.ts.map +0 -1
  688. package/dist/core/sessions/fork-utils.test.js +0 -129
  689. package/dist/core/sessions/fork-utils.test.js.map +0 -1
  690. package/dist/core/sessions/session-overrides.integration.test.d.ts +0 -2
  691. package/dist/core/sessions/session-overrides.integration.test.d.ts.map +0 -1
  692. package/dist/core/sessions/session-overrides.integration.test.js +0 -154
  693. package/dist/core/sessions/session-overrides.integration.test.js.map +0 -1
  694. package/dist/core/sessions/session.test.d.ts +0 -2
  695. package/dist/core/sessions/session.test.d.ts.map +0 -1
  696. package/dist/core/sessions/session.test.js +0 -1100
  697. package/dist/core/sessions/session.test.js.map +0 -1
  698. package/dist/core/tools/executor.test.d.ts +0 -2
  699. package/dist/core/tools/executor.test.d.ts.map +0 -1
  700. package/dist/core/tools/executor.test.js +0 -144
  701. package/dist/core/tools/executor.test.js.map +0 -1
  702. package/dist/lib/logger/console.test.d.ts +0 -2
  703. package/dist/lib/logger/console.test.d.ts.map +0 -1
  704. package/dist/lib/logger/console.test.js +0 -258
  705. package/dist/lib/logger/console.test.js.map +0 -1
  706. package/dist/lib/never.d.ts +0 -2
  707. package/dist/lib/never.d.ts.map +0 -1
  708. package/dist/lib/never.js +0 -4
  709. package/dist/lib/never.js.map +0 -1
  710. package/dist/lib/utils/concurrency.test.d.ts +0 -2
  711. package/dist/lib/utils/concurrency.test.d.ts.map +0 -1
  712. package/dist/lib/utils/concurrency.test.js +0 -135
  713. package/dist/lib/utils/concurrency.test.js.map +0 -1
  714. package/dist/plugins/agent-status/agent-status.test.d.ts +0 -2
  715. package/dist/plugins/agent-status/agent-status.test.d.ts.map +0 -1
  716. package/dist/plugins/agent-status/agent-status.test.js +0 -136
  717. package/dist/plugins/agent-status/agent-status.test.js.map +0 -1
  718. package/dist/plugins/agents/agents.integration.test.d.ts +0 -2
  719. package/dist/plugins/agents/agents.integration.test.d.ts.map +0 -1
  720. package/dist/plugins/agents/agents.integration.test.js +0 -830
  721. package/dist/plugins/agents/agents.integration.test.js.map +0 -1
  722. package/dist/plugins/agents/supervision.integration.test.d.ts +0 -2
  723. package/dist/plugins/agents/supervision.integration.test.d.ts.map +0 -1
  724. package/dist/plugins/agents/supervision.integration.test.js +0 -215
  725. package/dist/plugins/agents/supervision.integration.test.js.map +0 -1
  726. package/dist/plugins/context-compact/compaction-live.test.d.ts +0 -17
  727. package/dist/plugins/context-compact/compaction-live.test.d.ts.map +0 -1
  728. package/dist/plugins/context-compact/compaction-live.test.js +0 -177
  729. package/dist/plugins/context-compact/compaction-live.test.js.map +0 -1
  730. package/dist/plugins/context-compact/context-compact.integration.test.d.ts +0 -2
  731. package/dist/plugins/context-compact/context-compact.integration.test.d.ts.map +0 -1
  732. package/dist/plugins/context-compact/context-compact.integration.test.js +0 -364
  733. package/dist/plugins/context-compact/context-compact.integration.test.js.map +0 -1
  734. package/dist/plugins/context-compact/context-compactor.test.d.ts +0 -2
  735. package/dist/plugins/context-compact/context-compactor.test.d.ts.map +0 -1
  736. package/dist/plugins/context-compact/context-compactor.test.js +0 -858
  737. package/dist/plugins/context-compact/context-compactor.test.js.map +0 -1
  738. package/dist/plugins/context-compact/history-offloader.test.d.ts +0 -2
  739. package/dist/plugins/context-compact/history-offloader.test.d.ts.map +0 -1
  740. package/dist/plugins/context-compact/history-offloader.test.js +0 -77
  741. package/dist/plugins/context-compact/history-offloader.test.js.map +0 -1
  742. package/dist/plugins/filesystem/filesystem.integration.test.d.ts +0 -2
  743. package/dist/plugins/filesystem/filesystem.integration.test.d.ts.map +0 -1
  744. package/dist/plugins/filesystem/filesystem.integration.test.js +0 -447
  745. package/dist/plugins/filesystem/filesystem.integration.test.js.map +0 -1
  746. package/dist/plugins/filesystem/schema.d.ts +0 -7
  747. package/dist/plugins/filesystem/schema.d.ts.map +0 -1
  748. package/dist/plugins/filesystem/schema.js +0 -2
  749. package/dist/plugins/filesystem/schema.js.map +0 -1
  750. package/dist/plugins/limits-guard/limit-guard.test.d.ts +0 -2
  751. package/dist/plugins/limits-guard/limit-guard.test.d.ts.map +0 -1
  752. package/dist/plugins/limits-guard/limit-guard.test.js +0 -194
  753. package/dist/plugins/limits-guard/limit-guard.test.js.map +0 -1
  754. package/dist/plugins/limits-guard/limits-guard.integration.test.d.ts +0 -2
  755. package/dist/plugins/limits-guard/limits-guard.integration.test.d.ts.map +0 -1
  756. package/dist/plugins/limits-guard/limits-guard.integration.test.js +0 -887
  757. package/dist/plugins/limits-guard/limits-guard.integration.test.js.map +0 -1
  758. package/dist/plugins/llm-debug/llm-debug.integration.test.d.ts +0 -2
  759. package/dist/plugins/llm-debug/llm-debug.integration.test.d.ts.map +0 -1
  760. package/dist/plugins/llm-debug/llm-debug.integration.test.js +0 -157
  761. package/dist/plugins/llm-debug/llm-debug.integration.test.js.map +0 -1
  762. package/dist/plugins/mailbox/mailbox.integration.test.d.ts +0 -2
  763. package/dist/plugins/mailbox/mailbox.integration.test.d.ts.map +0 -1
  764. package/dist/plugins/mailbox/mailbox.integration.test.js +0 -678
  765. package/dist/plugins/mailbox/mailbox.integration.test.js.map +0 -1
  766. package/dist/plugins/resources/resources.integration.test.d.ts +0 -2
  767. package/dist/plugins/resources/resources.integration.test.d.ts.map +0 -1
  768. package/dist/plugins/resources/resources.integration.test.js +0 -62
  769. package/dist/plugins/resources/resources.integration.test.js.map +0 -1
  770. package/dist/plugins/result-eviction/result-eviction.integration.test.d.ts +0 -2
  771. package/dist/plugins/result-eviction/result-eviction.integration.test.d.ts.map +0 -1
  772. package/dist/plugins/result-eviction/result-eviction.integration.test.js +0 -294
  773. package/dist/plugins/result-eviction/result-eviction.integration.test.js.map +0 -1
  774. package/dist/plugins/services/pid-registry.test.d.ts +0 -2
  775. package/dist/plugins/services/pid-registry.test.d.ts.map +0 -1
  776. package/dist/plugins/services/pid-registry.test.js +0 -161
  777. package/dist/plugins/services/pid-registry.test.js.map +0 -1
  778. package/dist/plugins/services/services.integration.test.d.ts +0 -2
  779. package/dist/plugins/services/services.integration.test.d.ts.map +0 -1
  780. package/dist/plugins/services/services.integration.test.js +0 -1057
  781. package/dist/plugins/services/services.integration.test.js.map +0 -1
  782. package/dist/plugins/session-lifecycle/session-lifecycle.integration.test.d.ts +0 -2
  783. package/dist/plugins/session-lifecycle/session-lifecycle.integration.test.d.ts.map +0 -1
  784. package/dist/plugins/session-lifecycle/session-lifecycle.integration.test.js +0 -498
  785. package/dist/plugins/session-lifecycle/session-lifecycle.integration.test.js.map +0 -1
  786. package/dist/plugins/session-stats/plugin.test.d.ts +0 -2
  787. package/dist/plugins/session-stats/plugin.test.d.ts.map +0 -1
  788. package/dist/plugins/session-stats/plugin.test.js +0 -145
  789. package/dist/plugins/session-stats/plugin.test.js.map +0 -1
  790. package/dist/plugins/shell/shell.integration.test.d.ts +0 -2
  791. package/dist/plugins/shell/shell.integration.test.d.ts.map +0 -1
  792. package/dist/plugins/shell/shell.integration.test.js +0 -234
  793. package/dist/plugins/shell/shell.integration.test.js.map +0 -1
  794. package/dist/plugins/shell/shell.test.d.ts +0 -2
  795. package/dist/plugins/shell/shell.test.d.ts.map +0 -1
  796. package/dist/plugins/shell/shell.test.js +0 -236
  797. package/dist/plugins/shell/shell.test.js.map +0 -1
  798. package/dist/plugins/skills/discovery.test.d.ts +0 -2
  799. package/dist/plugins/skills/discovery.test.d.ts.map +0 -1
  800. package/dist/plugins/skills/discovery.test.js +0 -312
  801. package/dist/plugins/skills/discovery.test.js.map +0 -1
  802. package/dist/plugins/skills/skills.integration.test.d.ts +0 -2
  803. package/dist/plugins/skills/skills.integration.test.d.ts.map +0 -1
  804. package/dist/plugins/skills/skills.integration.test.js +0 -475
  805. package/dist/plugins/skills/skills.integration.test.js.map +0 -1
  806. package/dist/plugins/todo/todo.integration.test.d.ts +0 -2
  807. package/dist/plugins/todo/todo.integration.test.d.ts.map +0 -1
  808. package/dist/plugins/todo/todo.integration.test.js +0 -605
  809. package/dist/plugins/todo/todo.integration.test.js.map +0 -1
  810. package/dist/plugins/uploads/preprocessors/image-classifier.test.d.ts +0 -2
  811. package/dist/plugins/uploads/preprocessors/image-classifier.test.d.ts.map +0 -1
  812. package/dist/plugins/uploads/preprocessors/image-classifier.test.js +0 -113
  813. package/dist/plugins/uploads/preprocessors/image-classifier.test.js.map +0 -1
  814. package/dist/plugins/uploads/uploads.integration.test.d.ts +0 -2
  815. package/dist/plugins/uploads/uploads.integration.test.d.ts.map +0 -1
  816. package/dist/plugins/uploads/uploads.integration.test.js +0 -639
  817. package/dist/plugins/uploads/uploads.integration.test.js.map +0 -1
  818. package/dist/plugins/user-chat/user-chat.integration.test.d.ts +0 -2
  819. package/dist/plugins/user-chat/user-chat.integration.test.d.ts.map +0 -1
  820. package/dist/plugins/user-chat/user-chat.integration.test.js +0 -754
  821. package/dist/plugins/user-chat/user-chat.integration.test.js.map +0 -1
  822. package/dist/plugins/workers/workers.integration.test.d.ts +0 -2
  823. package/dist/plugins/workers/workers.integration.test.d.ts.map +0 -1
  824. package/dist/plugins/workers/workers.integration.test.js +0 -629
  825. package/dist/plugins/workers/workers.integration.test.js.map +0 -1
  826. package/dist/prompts/macros.test.d.ts +0 -2
  827. package/dist/prompts/macros.test.d.ts.map +0 -1
  828. package/dist/prompts/macros.test.js +0 -80
  829. package/dist/prompts/macros.test.js.map +0 -1
  830. package/dist/testing/test-harness.test.d.ts +0 -2
  831. package/dist/testing/test-harness.test.d.ts.map +0 -1
  832. package/dist/testing/test-harness.test.js +0 -92
  833. package/dist/testing/test-harness.test.js.map +0 -1
  834. package/dist/transport/http/routes/rpc.integration.test.d.ts +0 -2
  835. package/dist/transport/http/routes/rpc.integration.test.d.ts.map +0 -1
  836. package/dist/transport/http/routes/rpc.integration.test.js +0 -189
  837. package/dist/transport/http/routes/rpc.integration.test.js.map +0 -1
  838. package/dist/transport/http/routes/rpc.test.d.ts +0 -2
  839. package/dist/transport/http/routes/rpc.test.d.ts.map +0 -1
  840. package/dist/transport/http/routes/rpc.test.js +0 -316
  841. package/dist/transport/http/routes/rpc.test.js.map +0 -1
  842. package/src/config.test.ts +0 -174
  843. package/src/core/agent-loop.integration.test.ts +0 -503
  844. package/src/core/agents/agent-config.test.ts +0 -240
  845. package/src/core/agents/agent-shutdown.test.ts +0 -236
  846. package/src/core/agents/agent.test.ts +0 -387
  847. package/src/core/agents/communicator.ts +0 -16
  848. package/src/core/agents/handler-events.test.ts +0 -167
  849. package/src/core/agents/response-sanitizer.test.ts +0 -137
  850. package/src/core/error-recovery.integration.test.ts +0 -343
  851. package/src/core/event-sourcing.integration.test.ts +0 -191
  852. package/src/core/events/file.test.ts +0 -436
  853. package/src/core/events/memory.test.ts +0 -741
  854. package/src/core/image/image-processor.test.ts +0 -218
  855. package/src/core/image/vips-resizer.test.ts +0 -388
  856. package/src/core/llm/anthropic.test.ts +0 -546
  857. package/src/core/llm/cache-breakpoints.test.ts +0 -85
  858. package/src/core/llm/cache-live.test.ts +0 -155
  859. package/src/core/llm/logger.test.ts +0 -270
  860. package/src/core/llm/message-sanitization.test.ts +0 -217
  861. package/src/core/llm/mock.test.ts +0 -402
  862. package/src/core/llm/openrouter-mapping.test.ts +0 -210
  863. package/src/core/llm/openrouter.test.ts +0 -499
  864. package/src/core/llm/provider-integration.test.ts +0 -408
  865. package/src/core/llm/routing-provider.test.ts +0 -113
  866. package/src/core/llm/snapshot-middleware.test.ts +0 -168
  867. package/src/core/multi-agent.integration.test.ts +0 -340
  868. package/src/core/plugin-hooks.integration.test.ts +0 -568
  869. package/src/core/session-lifecycle.integration.test.ts +0 -202
  870. package/src/core/sessions/fork-utils.test.ts +0 -158
  871. package/src/core/sessions/session-overrides.integration.test.ts +0 -210
  872. package/src/core/sessions/session.test.ts +0 -1736
  873. package/src/core/tools/executor.test.ts +0 -161
  874. package/src/lib/logger/console.test.ts +0 -348
  875. package/src/lib/never.ts +0 -3
  876. package/src/lib/utils/concurrency.test.ts +0 -169
  877. package/src/plugins/agent-status/agent-status.test.ts +0 -164
  878. package/src/plugins/agents/agents.integration.test.ts +0 -976
  879. package/src/plugins/agents/supervision.integration.test.ts +0 -249
  880. package/src/plugins/context-compact/compaction-live.test.ts +0 -221
  881. package/src/plugins/context-compact/context-compact.integration.test.ts +0 -418
  882. package/src/plugins/context-compact/context-compactor.test.ts +0 -1036
  883. package/src/plugins/context-compact/history-offloader.test.ts +0 -100
  884. package/src/plugins/filesystem/filesystem.integration.test.ts +0 -529
  885. package/src/plugins/filesystem/schema.ts +0 -6
  886. package/src/plugins/limits-guard/limit-guard.test.ts +0 -253
  887. package/src/plugins/limits-guard/limits-guard.integration.test.ts +0 -1012
  888. package/src/plugins/llm-debug/llm-debug.integration.test.ts +0 -192
  889. package/src/plugins/mailbox/mailbox.integration.test.ts +0 -794
  890. package/src/plugins/resources/resources.integration.test.ts +0 -68
  891. package/src/plugins/result-eviction/result-eviction.integration.test.ts +0 -332
  892. package/src/plugins/services/pid-registry.test.ts +0 -180
  893. package/src/plugins/services/services.integration.test.ts +0 -1223
  894. package/src/plugins/session-lifecycle/session-lifecycle.integration.test.ts +0 -639
  895. package/src/plugins/session-stats/plugin.test.ts +0 -160
  896. package/src/plugins/shell/shell.integration.test.ts +0 -273
  897. package/src/plugins/shell/shell.test.ts +0 -314
  898. package/src/plugins/skills/discovery.test.ts +0 -395
  899. package/src/plugins/skills/skills.integration.test.ts +0 -580
  900. package/src/plugins/todo/todo.integration.test.ts +0 -687
  901. package/src/plugins/uploads/preprocessors/image-classifier.test.ts +0 -142
  902. package/src/plugins/uploads/uploads.integration.test.ts +0 -831
  903. package/src/plugins/user-chat/user-chat.integration.test.ts +0 -893
  904. package/src/plugins/workers/workers.integration.test.ts +0 -778
  905. package/src/prompts/macros.test.ts +0 -107
  906. package/src/testing/test-harness.test.ts +0 -114
  907. package/src/transport/http/routes/rpc.integration.test.ts +0 -243
  908. package/src/transport/http/routes/rpc.test.ts +0 -372
@@ -1,1736 +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 type { DomainEvent } from '~/core/events/types.js'
7
- import { llmEvents } from '~/core/llm/state.js'
8
- import { generateSessionId } from '~/core/sessions/schema.js'
9
- import { sessionEvents } from '~/core/sessions/state.js'
10
- import { generateToolCallId } from '~/core/tools/schema.js'
11
- import { toolEvents } from '~/core/tools/state.js'
12
- import { mailboxPlugin } from '~/plugins/mailbox/plugin.js'
13
- import { getAgentMailbox, selectMailboxState } from '~/plugins/mailbox/query.js'
14
- import { generateTestMessageId } from '~/plugins/mailbox/schema.js'
15
- import { mailboxEvents } from '~/plugins/mailbox/state.js'
16
- import { createApplyEvent } from './apply-event.js'
17
- import { createSessionState, getAgentState, getCommunicatorId, getEntryAgentId, getOrchestratorId, reconstructSessionState } from './state.js'
18
-
19
- const applyEvent = createApplyEvent([mailboxPlugin.create({})])
20
-
21
- const SESSION_ID = generateSessionId()
22
- const TIMESTAMP = Date.now()
23
-
24
- describe('createSessionState', () => {
25
- it('creates an empty session with correct properties', () => {
26
- const session = createSessionState(SESSION_ID, 'test-preset', TIMESTAMP)
27
-
28
- expect(session.id).toBe(SESSION_ID)
29
- expect(session.presetId).toBe('test-preset')
30
- expect(session.status).toBe('active')
31
- expect(session.agents.size).toBe(0)
32
- expect(session.createdAt).toBe(TIMESTAMP)
33
- expect(session.closedAt).toBeUndefined()
34
- })
35
- })
36
-
37
- describe('applyEvent', () => {
38
- const baseSession = createSessionState(SESSION_ID, 'test-preset', TIMESTAMP)
39
-
40
- describe('session_closed', () => {
41
- it('closes the session', () => {
42
- const event = withSessionId(SESSION_ID, sessionEvents.create('session_closed', {}))
43
-
44
- const result = applyEvent(baseSession, event)
45
-
46
- expect(result.status).toBe('closed')
47
- expect(result.closedAt).toBe(event.timestamp)
48
- })
49
- })
50
-
51
- describe('agent_spawned', () => {
52
- it('adds a new agent to the session', () => {
53
- const agentId = generateTestAgentId()
54
- const event = withSessionId(
55
- SESSION_ID,
56
- agentEvents.create('agent_spawned', {
57
- agentId,
58
- definitionName: ORCHESTRATOR_ROLE,
59
- parentId: null,
60
- }),
61
- )
62
-
63
- const result = applyEvent(baseSession, event)
64
-
65
- expect(result.agents.size).toBe(1)
66
- const agent = result.agents.get(agentId)
67
- expect(agent).toBeDefined()
68
- expect(agent!.id).toBe(agentId)
69
- expect(agent!.definitionName).toBe(ORCHESTRATOR_ROLE)
70
- expect(agent!.parentId).toBeNull()
71
- expect(agent!.status).toBe('pending')
72
- expect(getAgentMailbox(selectMailboxState(result), agentId)).toHaveLength(0)
73
- })
74
-
75
- it('adds child agent with parent reference', () => {
76
- const parentId = generateTestAgentId()
77
- const childId = generateTestAgentId()
78
-
79
- let session = applyEvent(
80
- baseSession,
81
- withSessionId(
82
- SESSION_ID,
83
- agentEvents.create('agent_spawned', {
84
- agentId: parentId,
85
- definitionName: ORCHESTRATOR_ROLE,
86
- parentId: null,
87
- }),
88
- ),
89
- )
90
-
91
- session = applyEvent(
92
- session,
93
- withSessionId(
94
- SESSION_ID,
95
- agentEvents.create('agent_spawned', {
96
- agentId: childId,
97
- definitionName: 'worker',
98
- parentId: parentId,
99
- }),
100
- ),
101
- )
102
-
103
- const child = session.agents.get(childId)
104
- expect(child!.parentId).toBe(parentId)
105
- })
106
- })
107
-
108
- describe('agent_state_changed', () => {
109
- it('updates agent status', () => {
110
- const agentId = generateTestAgentId()
111
- let session = applyEvent(
112
- baseSession,
113
- withSessionId(
114
- SESSION_ID,
115
- agentEvents.create('agent_spawned', {
116
- agentId,
117
- definitionName: 'test',
118
- parentId: null,
119
- }),
120
- ),
121
- )
122
-
123
- const event = withSessionId(
124
- SESSION_ID,
125
- agentEvents.create('agent_state_changed', {
126
- agentId,
127
- fromState: 'pending',
128
- toState: 'inferring',
129
- }),
130
- )
131
-
132
- session = applyEvent(session, event)
133
-
134
- expect(session.agents.get(agentId)!.status).toBe('inferring')
135
- })
136
-
137
- it('throws for unknown agent', () => {
138
- const unknownAgentId = generateTestAgentId()
139
- const event = withSessionId(
140
- SESSION_ID,
141
- agentEvents.create('agent_state_changed', {
142
- agentId: unknownAgentId,
143
- fromState: 'pending',
144
- toState: 'inferring',
145
- }),
146
- )
147
-
148
- expect(() => applyEvent(baseSession, event)).toThrow(
149
- `Agent not found: ${unknownAgentId}`,
150
- )
151
- })
152
- })
153
-
154
- describe('mailbox_message', () => {
155
- it('adds message to agent mailbox', () => {
156
- const agentId = generateTestAgentId()
157
- let session = applyEvent(
158
- baseSession,
159
- withSessionId(
160
- SESSION_ID,
161
- agentEvents.create('agent_spawned', {
162
- agentId,
163
- definitionName: 'test',
164
- parentId: null,
165
- }),
166
- ),
167
- )
168
-
169
- const messageId = generateTestMessageId()
170
- const event = withSessionId(
171
- SESSION_ID,
172
- mailboxEvents.create('mailbox_message', {
173
- toAgentId: agentId,
174
- message: {
175
- id: messageId,
176
- from: 'user',
177
- content: 'Hello',
178
- timestamp: TIMESTAMP,
179
- consumed: false,
180
- },
181
- }),
182
- )
183
-
184
- session = applyEvent(session, event)
185
-
186
- const mailbox = getAgentMailbox(selectMailboxState(session), agentId)
187
- expect(mailbox).toHaveLength(1)
188
- expect(mailbox[0].id).toBe(messageId)
189
- expect(mailbox[0].content).toBe('Hello')
190
- })
191
- })
192
-
193
- describe('mailbox_consumed', () => {
194
- it('marks messages as consumed', () => {
195
- const agentId = generateTestAgentId()
196
- const messageId = generateTestMessageId()
197
-
198
- let session = applyEvent(
199
- baseSession,
200
- withSessionId(
201
- SESSION_ID,
202
- agentEvents.create('agent_spawned', {
203
- agentId,
204
- definitionName: 'test',
205
- parentId: null,
206
- }),
207
- ),
208
- )
209
-
210
- session = applyEvent(
211
- session,
212
- withSessionId(
213
- SESSION_ID,
214
- mailboxEvents.create('mailbox_message', {
215
- toAgentId: agentId,
216
- message: {
217
- id: messageId,
218
- from: 'user',
219
- content: 'Hello',
220
- timestamp: TIMESTAMP,
221
- consumed: false,
222
- },
223
- }),
224
- ),
225
- )
226
-
227
- const event = withSessionId(
228
- SESSION_ID,
229
- mailboxEvents.create('mailbox_consumed', {
230
- agentId,
231
- messageIds: [messageId],
232
- }),
233
- )
234
-
235
- session = applyEvent(session, event)
236
-
237
- expect(getAgentMailbox(selectMailboxState(session), agentId)[0].consumed).toBe(true)
238
- })
239
- })
240
-
241
- describe('inference_started', () => {
242
- it('sets agent status to inferring', () => {
243
- const agentId = generateTestAgentId()
244
- let session = applyEvent(
245
- baseSession,
246
- withSessionId(
247
- SESSION_ID,
248
- agentEvents.create('agent_spawned', {
249
- agentId,
250
- definitionName: 'test',
251
- parentId: null,
252
- }),
253
- ),
254
- )
255
-
256
- const event = withSessionId(
257
- SESSION_ID,
258
- llmEvents.create('inference_started', {
259
- agentId,
260
- messages: [],
261
- consumedMessageIds: [],
262
- }),
263
- )
264
-
265
- session = applyEvent(session, event)
266
-
267
- expect(session.agents.get(agentId)!.status).toBe('inferring')
268
- })
269
-
270
- it('appends to pendingMessages (defense-in-depth against uncommitted messages)', () => {
271
- // If for any reason pendingMessages are not empty when inference_started fires,
272
- // they must not be overwritten — append instead.
273
- const agentId = generateTestAgentId()
274
-
275
- let session = applyEvent(
276
- baseSession,
277
- withSessionId(
278
- SESSION_ID,
279
- agentEvents.create('agent_spawned', {
280
- agentId,
281
- definitionName: 'test',
282
- parentId: null,
283
- }),
284
- ),
285
- )
286
-
287
- const msg1 = { role: 'user' as const, content: 'First message' }
288
- const msg2 = { role: 'user' as const, content: 'Second message' }
289
-
290
- // First inference_started sets pendingMessages
291
- session = applyEvent(
292
- session,
293
- withSessionId(
294
- SESSION_ID,
295
- llmEvents.create('inference_started', {
296
- agentId,
297
- messages: [msg1],
298
- consumedMessageIds: [],
299
- }),
300
- ),
301
- )
302
-
303
- expect(session.agents.get(agentId)!.pendingMessages).toHaveLength(1)
304
-
305
- // Second inference_started without inference_completed in between —
306
- // must append, not overwrite
307
- session = applyEvent(
308
- session,
309
- withSessionId(
310
- SESSION_ID,
311
- llmEvents.create('inference_started', {
312
- agentId,
313
- messages: [msg2],
314
- consumedMessageIds: [],
315
- }),
316
- ),
317
- )
318
-
319
- const agent = session.agents.get(agentId)!
320
- expect(agent.pendingMessages).toHaveLength(2)
321
- expect(agent.pendingMessages[0].content).toBe(msg1.content)
322
- expect(agent.pendingMessages[1].content).toBe(msg2.content)
323
- })
324
-
325
- it('afterInference pause: inference_completed commits turn, then agent_paused preserves pause', () => {
326
- // Real scenario: planner receives subagent response, LLM says "WAITING",
327
- // limits-guard pauses. The correct event sequence is:
328
- // inference_started → inference_completed → agent_paused
329
- // This ensures conversationHistory includes the turn and pendingMessages are cleared.
330
- const agentId = generateTestAgentId()
331
-
332
- let session = applyEvent(
333
- baseSession,
334
- withSessionId(
335
- SESSION_ID,
336
- agentEvents.create('agent_spawned', {
337
- agentId,
338
- definitionName: 'test',
339
- parentId: null,
340
- }),
341
- ),
342
- )
343
-
344
- const userMsg = { role: 'user' as const, content: 'Response from collection-analyzer_1 (locations)' }
345
-
346
- // 1. inference_started — message goes to pendingMessages
347
- session = applyEvent(
348
- session,
349
- withSessionId(
350
- SESSION_ID,
351
- llmEvents.create('inference_started', {
352
- agentId,
353
- messages: [userMsg],
354
- consumedMessageIds: [],
355
- }),
356
- ),
357
- )
358
-
359
- expect(session.agents.get(agentId)!.pendingMessages).toHaveLength(1)
360
- expect(session.agents.get(agentId)!.status).toBe('inferring')
361
-
362
- // 2. inference_completed — pendingMessages + response committed to conversationHistory
363
- session = applyEvent(
364
- session,
365
- withSessionId(
366
- SESSION_ID,
367
- llmEvents.create('inference_completed', {
368
- agentId,
369
- consumedMessageIds: [],
370
- response: { content: 'WAITING', toolCalls: [] },
371
- metrics: { promptTokens: 200, completionTokens: 1, totalTokens: 201, latencyMs: 500, model: 'test' },
372
- }),
373
- ),
374
- )
375
-
376
- expect(session.agents.get(agentId)!.pendingMessages).toHaveLength(0)
377
- expect(session.agents.get(agentId)!.conversationHistory).toHaveLength(2) // user + assistant
378
- expect(session.agents.get(agentId)!.status).toBe('pending')
379
-
380
- // 3. agent_paused — status set to paused, conversationHistory preserved
381
- session = applyEvent(
382
- session,
383
- withSessionId(
384
- SESSION_ID,
385
- agentEvents.create('agent_paused', {
386
- agentId,
387
- reason: 'handler',
388
- message: 'No progress for 5 turns',
389
- }),
390
- ),
391
- )
392
-
393
- const agent = session.agents.get(agentId)!
394
- expect(agent.status).toBe('paused')
395
- expect(agent.pendingMessages).toHaveLength(0)
396
- expect(agent.conversationHistory).toHaveLength(2)
397
- expect(agent.conversationHistory[0].content).toBe(userMsg.content)
398
- expect(agent.conversationHistory[1].content).toBe('WAITING')
399
-
400
- // 4. Resume + next message — starts fresh with empty pendingMessages
401
- session = applyEvent(
402
- session,
403
- withSessionId(
404
- SESSION_ID,
405
- agentEvents.create('agent_resumed', { agentId }),
406
- ),
407
- )
408
-
409
- const nextMsg = { role: 'user' as const, content: 'Response from collection-analyzer_2 (team)' }
410
-
411
- session = applyEvent(
412
- session,
413
- withSessionId(
414
- SESSION_ID,
415
- llmEvents.create('inference_started', {
416
- agentId,
417
- messages: [nextMsg],
418
- consumedMessageIds: [],
419
- }),
420
- ),
421
- )
422
-
423
- // Only the new message in pendingMessages (previous turn was committed)
424
- expect(session.agents.get(agentId)!.pendingMessages).toHaveLength(1)
425
- expect(session.agents.get(agentId)!.pendingMessages[0].content).toBe(nextMsg.content)
426
- // Previous turn preserved in conversationHistory
427
- expect(session.agents.get(agentId)!.conversationHistory).toHaveLength(2)
428
- })
429
- })
430
-
431
- describe('inference_completed', () => {
432
- it('updates conversation history and status when no tool calls', () => {
433
- const agentId = generateTestAgentId()
434
- let session = applyEvent(
435
- baseSession,
436
- withSessionId(
437
- SESSION_ID,
438
- agentEvents.create('agent_spawned', {
439
- agentId,
440
- definitionName: 'test',
441
- parentId: null,
442
- }),
443
- ),
444
- )
445
-
446
- const event = withSessionId(
447
- SESSION_ID,
448
- llmEvents.create('inference_completed', {
449
- agentId,
450
- consumedMessageIds: [],
451
- response: {
452
- content: 'Hello there!',
453
- toolCalls: [],
454
- },
455
- metrics: {
456
- promptTokens: 100,
457
- completionTokens: 10,
458
- totalTokens: 110,
459
- latencyMs: 500,
460
- model: 'test-model',
461
- },
462
- }),
463
- )
464
-
465
- session = applyEvent(session, event)
466
-
467
- const agent = session.agents.get(agentId)!
468
- expect(agent.status).toBe('pending')
469
- expect(agent.conversationHistory).toHaveLength(1)
470
- expect(agent.conversationHistory[0].role).toBe('assistant')
471
- expect(agent.conversationHistory[0].content).toBe('Hello there!')
472
- expect(agent.pendingToolCalls).toHaveLength(0)
473
- })
474
-
475
- it('marks consumed messages via mailbox_consumed event', () => {
476
- const agentId = generateTestAgentId()
477
- const messageId = generateTestMessageId()
478
-
479
- let session = applyEvent(
480
- baseSession,
481
- withSessionId(
482
- SESSION_ID,
483
- agentEvents.create('agent_spawned', {
484
- agentId,
485
- definitionName: 'test',
486
- parentId: null,
487
- }),
488
- ),
489
- )
490
-
491
- session = applyEvent(
492
- session,
493
- withSessionId(
494
- SESSION_ID,
495
- mailboxEvents.create('mailbox_message', {
496
- toAgentId: agentId,
497
- message: {
498
- id: messageId,
499
- from: 'user',
500
- content: 'Hello',
501
- timestamp: TIMESTAMP,
502
- consumed: false,
503
- },
504
- }),
505
- ),
506
- )
507
-
508
- // Before consumption, message should be unconsumed
509
- expect(getAgentMailbox(selectMailboxState(session), agentId)[0].consumed).toBe(false)
510
-
511
- // Consume via mailbox_consumed (the dequeue mechanism)
512
- session = applyEvent(
513
- session,
514
- withSessionId(
515
- SESSION_ID,
516
- mailboxEvents.create('mailbox_consumed', {
517
- agentId,
518
- messageIds: [messageId],
519
- }),
520
- ),
521
- )
522
-
523
- // After mailbox_consumed, message should be consumed
524
- expect(getAgentMailbox(selectMailboxState(session), agentId)[0].consumed).toBe(true)
525
-
526
- // Inference still works after consumption
527
- session = applyEvent(
528
- session,
529
- withSessionId(
530
- SESSION_ID,
531
- llmEvents.create('inference_completed', {
532
- agentId,
533
- consumedMessageIds: [],
534
- response: {
535
- content: 'Hi!',
536
- toolCalls: [],
537
- },
538
- metrics: {
539
- promptTokens: 100,
540
- completionTokens: 10,
541
- totalTokens: 110,
542
- latencyMs: 500,
543
- model: 'test-model',
544
- },
545
- }),
546
- ),
547
- )
548
-
549
- expect(session.agents.get(agentId)!.conversationHistory).toHaveLength(1)
550
- })
551
-
552
- it('sets tool_exec status when there are tool calls', () => {
553
- const agentId = generateTestAgentId()
554
- const toolCallId = generateToolCallId()
555
- let session = applyEvent(
556
- baseSession,
557
- withSessionId(
558
- SESSION_ID,
559
- agentEvents.create('agent_spawned', {
560
- agentId,
561
- definitionName: 'test',
562
- parentId: null,
563
- }),
564
- ),
565
- )
566
-
567
- const event = withSessionId(
568
- SESSION_ID,
569
- llmEvents.create('inference_completed', {
570
- agentId,
571
- consumedMessageIds: [],
572
- response: {
573
- content: null,
574
- toolCalls: [
575
- {
576
- id: toolCallId,
577
- name: 'send_message',
578
- input: { to: 'other', content: 'hi' },
579
- },
580
- ],
581
- },
582
- metrics: {
583
- promptTokens: 100,
584
- completionTokens: 20,
585
- totalTokens: 120,
586
- latencyMs: 600,
587
- model: 'test-model',
588
- },
589
- }),
590
- )
591
-
592
- session = applyEvent(session, event)
593
-
594
- const agent = session.agents.get(agentId)!
595
- expect(agent.status).toBe('tool_exec')
596
- expect(agent.pendingToolCalls).toHaveLength(1)
597
- expect(agent.pendingToolCalls[0].name).toBe('send_message')
598
- })
599
- })
600
-
601
- describe('inference_failed', () => {
602
- it('sets agent status to errored', () => {
603
- const agentId = generateTestAgentId()
604
- let session = applyEvent(
605
- baseSession,
606
- withSessionId(
607
- SESSION_ID,
608
- agentEvents.create('agent_spawned', {
609
- agentId,
610
- definitionName: 'test',
611
- parentId: null,
612
- }),
613
- ),
614
- )
615
-
616
- const event = withSessionId(
617
- SESSION_ID,
618
- llmEvents.create('inference_failed', {
619
- agentId,
620
- error: 'API error',
621
- }),
622
- )
623
-
624
- session = applyEvent(session, event)
625
-
626
- expect(session.agents.get(agentId)!.status).toBe('errored')
627
- })
628
-
629
- it('clears pendingMessages but preserves pendingToolResults and mailbox for retry', () => {
630
- const agentId = generateTestAgentId()
631
- const messageId = generateTestMessageId()
632
- const toolCallId = generateToolCallId()
633
-
634
- // 1. Spawn agent
635
- let session = applyEvent(
636
- baseSession,
637
- withSessionId(
638
- SESSION_ID,
639
- agentEvents.create('agent_spawned', {
640
- agentId,
641
- definitionName: 'test',
642
- parentId: null,
643
- }),
644
- ),
645
- )
646
-
647
- // 2. Add mailbox message
648
- session = applyEvent(
649
- session,
650
- withSessionId(
651
- SESSION_ID,
652
- mailboxEvents.create('mailbox_message', {
653
- toAgentId: agentId,
654
- message: {
655
- id: messageId,
656
- from: 'user',
657
- content: 'Hello',
658
- timestamp: TIMESTAMP,
659
- consumed: false,
660
- },
661
- }),
662
- ),
663
- )
664
-
665
- // 3. First inference with tool call
666
- session = applyEvent(
667
- session,
668
- withSessionId(
669
- SESSION_ID,
670
- llmEvents.create('inference_completed', {
671
- agentId,
672
- consumedMessageIds: [],
673
- response: {
674
- content: null,
675
- toolCalls: [{ id: toolCallId, name: 'test_tool', input: {} }],
676
- },
677
- metrics: { promptTokens: 100, completionTokens: 10, totalTokens: 110, latencyMs: 500, model: 'test' },
678
- }),
679
- ),
680
- )
681
-
682
- // 4. Tool completes - creates pendingToolResult
683
- session = applyEvent(
684
- session,
685
- withSessionId(
686
- SESSION_ID,
687
- toolEvents.create('tool_completed', {
688
- agentId,
689
- toolCallId,
690
- result: 'tool output',
691
- }),
692
- ),
693
- )
694
-
695
- // 5. Start inference with pending messages
696
- session = applyEvent(
697
- session,
698
- withSessionId(
699
- SESSION_ID,
700
- llmEvents.create('inference_started', {
701
- agentId,
702
- messages: [
703
- { role: 'tool' as const, toolCallId, toolName: 'test_tool', content: 'tool output', isError: false, timestamp: TIMESTAMP },
704
- { role: 'user' as const, content: 'formatted mailbox', sourceMessageIds: [messageId] },
705
- ],
706
- consumedMessageIds: [messageId],
707
- }),
708
- ),
709
- )
710
-
711
- // Verify pendingMessages are set
712
- expect(session.agents.get(agentId)!.pendingMessages).toHaveLength(2)
713
- expect(session.agents.get(agentId)!.status).toBe('inferring')
714
-
715
- const historyLenBeforeFailure = session.agents.get(agentId)!.conversationHistory.length
716
-
717
- // 6. Inference fails
718
- session = applyEvent(
719
- session,
720
- withSessionId(
721
- SESSION_ID,
722
- llmEvents.create('inference_failed', {
723
- agentId,
724
- error: 'API timeout',
725
- }),
726
- ),
727
- )
728
-
729
- const agent = session.agents.get(agentId)!
730
-
731
- // pendingMessages cleared
732
- expect(agent.pendingMessages).toHaveLength(0)
733
- // pendingToolResults preserved for rebuild
734
- expect(agent.pendingToolResults).toHaveLength(1)
735
- expect(agent.pendingToolResults[0].toolCallId).toBe(toolCallId)
736
- // mailbox NOT consumed (can rebuild user message)
737
- expect(getAgentMailbox(selectMailboxState(session), agentId)[0].consumed).toBe(false)
738
- // status is errored
739
- expect(agent.status).toBe('errored')
740
- // conversationHistory NOT extended — pendingMessages are dropped, not promoted.
741
- // Otherwise tool results would appear both in history and in pendingToolResults,
742
- // duplicating them on the next inference (Bedrock-style provider rejects 400).
743
- expect(agent.conversationHistory).toHaveLength(historyLenBeforeFailure)
744
- })
745
- })
746
-
747
- describe('session_restarted', () => {
748
- it('clears pendingMessages for inferring agents, preserves pendingToolResults and mailbox', () => {
749
- const agentId = generateTestAgentId()
750
- const messageId = generateTestMessageId()
751
- const toolCallId = generateToolCallId()
752
-
753
- // 1. Spawn agent
754
- let session = applyEvent(
755
- baseSession,
756
- withSessionId(
757
- SESSION_ID,
758
- agentEvents.create('agent_spawned', {
759
- agentId,
760
- definitionName: 'test',
761
- parentId: null,
762
- }),
763
- ),
764
- )
765
-
766
- // 2. Add mailbox message
767
- session = applyEvent(
768
- session,
769
- withSessionId(
770
- SESSION_ID,
771
- mailboxEvents.create('mailbox_message', {
772
- toAgentId: agentId,
773
- message: {
774
- id: messageId,
775
- from: 'user',
776
- content: 'Hello',
777
- timestamp: TIMESTAMP,
778
- consumed: false,
779
- },
780
- }),
781
- ),
782
- )
783
-
784
- // 3. First inference with tool call
785
- session = applyEvent(
786
- session,
787
- withSessionId(
788
- SESSION_ID,
789
- llmEvents.create('inference_completed', {
790
- agentId,
791
- consumedMessageIds: [],
792
- response: {
793
- content: null,
794
- toolCalls: [{ id: toolCallId, name: 'test_tool', input: {} }],
795
- },
796
- metrics: { promptTokens: 100, completionTokens: 10, totalTokens: 110, latencyMs: 500, model: 'test' },
797
- }),
798
- ),
799
- )
800
-
801
- // 4. Tool completes
802
- session = applyEvent(
803
- session,
804
- withSessionId(
805
- SESSION_ID,
806
- toolEvents.create('tool_completed', {
807
- agentId,
808
- toolCallId,
809
- result: 'tool output',
810
- }),
811
- ),
812
- )
813
-
814
- // 5. Start inference
815
- session = applyEvent(
816
- session,
817
- withSessionId(
818
- SESSION_ID,
819
- llmEvents.create('inference_started', {
820
- agentId,
821
- messages: [
822
- { role: 'tool' as const, toolCallId, toolName: 'test_tool', content: 'tool output', isError: false, timestamp: TIMESTAMP },
823
- { role: 'user' as const, content: 'formatted mailbox', sourceMessageIds: [messageId] },
824
- ],
825
- consumedMessageIds: [messageId],
826
- }),
827
- ),
828
- )
829
-
830
- // Verify state before restart
831
- expect(session.agents.get(agentId)!.pendingMessages).toHaveLength(2)
832
- expect(session.agents.get(agentId)!.status).toBe('inferring')
833
-
834
- // 6. Server restarts
835
- session = applyEvent(session, {
836
- ...withSessionId(
837
- SESSION_ID,
838
- sessionEvents.create('session_restarted', {
839
- resetAgentIds: [agentId],
840
- clearedToolAgentIds: [],
841
- }),
842
- ),
843
- timestamp: TIMESTAMP + 1000,
844
- })
845
-
846
- const agent = session.agents.get(agentId)!
847
-
848
- // pendingMessages cleared
849
- expect(agent.pendingMessages).toHaveLength(0)
850
- // pendingToolResults preserved - can rebuild tool messages
851
- expect(agent.pendingToolResults).toHaveLength(1)
852
- expect(agent.pendingToolResults[0].toolCallId).toBe(toolCallId)
853
- // mailbox NOT consumed - can rebuild user message
854
- expect(getAgentMailbox(selectMailboxState(session), agentId)[0].consumed).toBe(false)
855
- // status reset to pending
856
- expect(agent.status).toBe('pending')
857
- })
858
-
859
- it('allows successful retry after restart - full cycle', () => {
860
- const agentId = generateTestAgentId()
861
- const messageId = generateTestMessageId()
862
- const toolCallId = generateToolCallId()
863
-
864
- // 1. Setup: spawn, message, tool call, tool complete
865
- let session = applyEvent(
866
- baseSession,
867
- withSessionId(
868
- SESSION_ID,
869
- agentEvents.create('agent_spawned', {
870
- agentId,
871
- definitionName: 'test',
872
- parentId: null,
873
- }),
874
- ),
875
- )
876
-
877
- session = applyEvent(
878
- session,
879
- withSessionId(
880
- SESSION_ID,
881
- mailboxEvents.create('mailbox_message', {
882
- toAgentId: agentId,
883
- message: { id: messageId, from: 'user', content: 'Hello', timestamp: TIMESTAMP, consumed: false },
884
- }),
885
- ),
886
- )
887
-
888
- session = applyEvent(
889
- session,
890
- withSessionId(
891
- SESSION_ID,
892
- llmEvents.create('inference_completed', {
893
- agentId,
894
- consumedMessageIds: [],
895
- response: { content: null, toolCalls: [{ id: toolCallId, name: 'test_tool', input: {} }] },
896
- metrics: { promptTokens: 100, completionTokens: 10, totalTokens: 110, latencyMs: 500, model: 'test' },
897
- }),
898
- ),
899
- )
900
-
901
- session = applyEvent(
902
- session,
903
- withSessionId(
904
- SESSION_ID,
905
- toolEvents.create('tool_completed', {
906
- agentId,
907
- toolCallId,
908
- result: 'tool output',
909
- }),
910
- ),
911
- )
912
-
913
- // 2. First inference attempt - interrupted by restart
914
- session = applyEvent(
915
- session,
916
- withSessionId(
917
- SESSION_ID,
918
- llmEvents.create('inference_started', {
919
- agentId,
920
- messages: [
921
- { role: 'tool' as const, toolCallId, toolName: 'test_tool', content: 'tool output', isError: false, timestamp: TIMESTAMP },
922
- { role: 'user' as const, content: 'formatted mailbox v1', sourceMessageIds: [messageId] },
923
- ],
924
- consumedMessageIds: [messageId],
925
- }),
926
- ),
927
- )
928
-
929
- session = applyEvent(session, {
930
- ...withSessionId(
931
- SESSION_ID,
932
- sessionEvents.create('session_restarted', {
933
- resetAgentIds: [agentId],
934
- clearedToolAgentIds: [],
935
- }),
936
- ),
937
- timestamp: TIMESTAMP + 1000,
938
- })
939
-
940
- // 3. Retry inference - rebuild messages from preserved state
941
- const agentAfterRestart = session.agents.get(agentId)!
942
- expect(agentAfterRestart.status).toBe('pending')
943
- expect(agentAfterRestart.pendingToolResults).toHaveLength(1)
944
- expect(getAgentMailbox(selectMailboxState(session), agentId)[0].consumed).toBe(false)
945
-
946
- // Runtime would rebuild: tool message from pendingToolResults + user message from unconsumed mailbox
947
- session = applyEvent(session, {
948
- ...withSessionId(
949
- SESSION_ID,
950
- llmEvents.create('inference_started', {
951
- agentId,
952
- messages: [
953
- { role: 'tool' as const, toolCallId, toolName: 'test_tool', content: 'tool output', isError: false, timestamp: TIMESTAMP },
954
- { role: 'user' as const, content: 'formatted mailbox v2', sourceMessageIds: [messageId] },
955
- ],
956
- consumedMessageIds: [messageId],
957
- }),
958
- ),
959
- timestamp: TIMESTAMP + 2000,
960
- })
961
-
962
- // 4. Dequeue mechanism marks messages consumed
963
- session = applyEvent(
964
- session,
965
- withSessionId(
966
- SESSION_ID,
967
- mailboxEvents.create('mailbox_consumed', {
968
- agentId,
969
- messageIds: [messageId],
970
- }),
971
- ),
972
- )
973
-
974
- // 5. This time inference completes successfully
975
- session = applyEvent(session, {
976
- ...withSessionId(
977
- SESSION_ID,
978
- llmEvents.create('inference_completed', {
979
- agentId,
980
- consumedMessageIds: [],
981
- response: { content: 'Done!', toolCalls: [] },
982
- metrics: { promptTokens: 100, completionTokens: 10, totalTokens: 110, latencyMs: 500, model: 'test' },
983
- }),
984
- ),
985
- timestamp: TIMESTAMP + 3000,
986
- })
987
-
988
- const finalAgent = session.agents.get(agentId)!
989
-
990
- // Everything committed
991
- expect(finalAgent.status).toBe('pending')
992
- expect(finalAgent.pendingMessages).toHaveLength(0)
993
- expect(finalAgent.pendingToolResults).toHaveLength(0)
994
- expect(getAgentMailbox(selectMailboxState(session), agentId)[0].consumed).toBe(true)
995
-
996
- // History contains: assistant (tool call) + tool + user + assistant (final)
997
- expect(finalAgent.conversationHistory).toHaveLength(4)
998
- expect(finalAgent.conversationHistory[0].role).toBe('assistant')
999
- expect(finalAgent.conversationHistory[1].role).toBe('tool')
1000
- expect(finalAgent.conversationHistory[2].role).toBe('user')
1001
- expect(finalAgent.conversationHistory[3].role).toBe('assistant')
1002
- expect(finalAgent.conversationHistory[3].content).toBe('Done!')
1003
- })
1004
- })
1005
-
1006
- describe('tool_completed', () => {
1007
- it('removes tool call from pending and updates status', () => {
1008
- const agentId = generateTestAgentId()
1009
- const toolCallId = generateToolCallId()
1010
-
1011
- let session = applyEvent(
1012
- baseSession,
1013
- withSessionId(
1014
- SESSION_ID,
1015
- agentEvents.create('agent_spawned', {
1016
- agentId,
1017
- definitionName: 'test',
1018
- parentId: null,
1019
- }),
1020
- ),
1021
- )
1022
-
1023
- session = applyEvent(
1024
- session,
1025
- withSessionId(
1026
- SESSION_ID,
1027
- llmEvents.create('inference_completed', {
1028
- agentId,
1029
- consumedMessageIds: [],
1030
- response: {
1031
- content: null,
1032
- toolCalls: [{ id: toolCallId, name: 'test', input: {} }],
1033
- },
1034
- metrics: {
1035
- promptTokens: 100,
1036
- completionTokens: 10,
1037
- totalTokens: 110,
1038
- latencyMs: 500,
1039
- model: 'test-model',
1040
- },
1041
- }),
1042
- ),
1043
- )
1044
-
1045
- const event = withSessionId(
1046
- SESSION_ID,
1047
- toolEvents.create('tool_completed', {
1048
- agentId,
1049
- toolCallId,
1050
- result: 'success',
1051
- }),
1052
- )
1053
-
1054
- session = applyEvent(session, event)
1055
-
1056
- const agent = session.agents.get(agentId)!
1057
- expect(agent.pendingToolCalls).toHaveLength(0)
1058
- expect(agent.status).toBe('pending')
1059
- })
1060
-
1061
- it('keeps tool_exec status when there are remaining tool calls', () => {
1062
- const agentId = generateTestAgentId()
1063
- const toolCallId1 = generateToolCallId()
1064
- const toolCallId2 = generateToolCallId()
1065
-
1066
- let session = applyEvent(
1067
- baseSession,
1068
- withSessionId(
1069
- SESSION_ID,
1070
- agentEvents.create('agent_spawned', {
1071
- agentId,
1072
- definitionName: 'test',
1073
- parentId: null,
1074
- }),
1075
- ),
1076
- )
1077
-
1078
- session = applyEvent(
1079
- session,
1080
- withSessionId(
1081
- SESSION_ID,
1082
- llmEvents.create('inference_completed', {
1083
- agentId,
1084
- consumedMessageIds: [],
1085
- response: {
1086
- content: null,
1087
- toolCalls: [
1088
- { id: toolCallId1, name: 'test1', input: {} },
1089
- { id: toolCallId2, name: 'test2', input: {} },
1090
- ],
1091
- },
1092
- metrics: {
1093
- promptTokens: 100,
1094
- completionTokens: 10,
1095
- totalTokens: 110,
1096
- latencyMs: 500,
1097
- model: 'test-model',
1098
- },
1099
- }),
1100
- ),
1101
- )
1102
-
1103
- session = applyEvent(
1104
- session,
1105
- withSessionId(
1106
- SESSION_ID,
1107
- toolEvents.create('tool_completed', {
1108
- agentId,
1109
- toolCallId: toolCallId1,
1110
- result: 'success',
1111
- }),
1112
- ),
1113
- )
1114
-
1115
- const agent = session.agents.get(agentId)!
1116
- expect(agent.pendingToolCalls).toHaveLength(1)
1117
- expect(agent.status).toBe('tool_exec')
1118
- })
1119
-
1120
- it('stores content in pendingToolResults (deferred to history by inference_completed)', () => {
1121
- const agentId = generateTestAgentId()
1122
- const toolCallId = generateToolCallId()
1123
- const toolTimestamp = Date.now()
1124
-
1125
- let session = applyEvent(
1126
- baseSession,
1127
- withSessionId(
1128
- SESSION_ID,
1129
- agentEvents.create('agent_spawned', {
1130
- agentId,
1131
- definitionName: 'test',
1132
- parentId: null,
1133
- }),
1134
- ),
1135
- )
1136
-
1137
- session = applyEvent(
1138
- session,
1139
- withSessionId(
1140
- SESSION_ID,
1141
- llmEvents.create('inference_completed', {
1142
- agentId,
1143
- consumedMessageIds: [],
1144
- response: {
1145
- content: null,
1146
- toolCalls: [{ id: toolCallId, name: 'send_message', input: { to: 'agent-1', message: 'hello' } }],
1147
- },
1148
- metrics: {
1149
- promptTokens: 100,
1150
- completionTokens: 10,
1151
- totalTokens: 110,
1152
- latencyMs: 500,
1153
- model: 'test-model',
1154
- },
1155
- }),
1156
- ),
1157
- )
1158
-
1159
- session = applyEvent(session, {
1160
- ...withSessionId(
1161
- SESSION_ID,
1162
- toolEvents.create('tool_completed', {
1163
- agentId,
1164
- toolCallId,
1165
- result: 'success message',
1166
- }),
1167
- ),
1168
- timestamp: toolTimestamp,
1169
- })
1170
-
1171
- const agent = session.agents.get(agentId)!
1172
-
1173
- // Tool result should NOT be in conversationHistory yet (deferred pattern)
1174
- const toolMessage = agent.conversationHistory.find(m => m.role === 'tool')
1175
- expect(toolMessage).toBeUndefined()
1176
-
1177
- // Check pendingToolResults has full content
1178
- expect(agent.pendingToolResults).toHaveLength(1)
1179
- expect(agent.pendingToolResults[0].toolCallId).toBe(toolCallId)
1180
- expect(agent.pendingToolResults[0].toolName).toBe('send_message')
1181
- expect(agent.pendingToolResults[0].timestamp).toBe(toolTimestamp)
1182
- expect(agent.pendingToolResults[0].isError).toBe(false)
1183
- expect(agent.pendingToolResults[0].content).toBe('success message')
1184
- })
1185
-
1186
- it('preserves rich content (array) in pendingToolResults', () => {
1187
- const agentId = generateTestAgentId()
1188
- const toolCallId = generateToolCallId()
1189
-
1190
- let session = applyEvent(
1191
- baseSession,
1192
- withSessionId(
1193
- SESSION_ID,
1194
- agentEvents.create('agent_spawned', {
1195
- agentId,
1196
- definitionName: 'test',
1197
- parentId: null,
1198
- }),
1199
- ),
1200
- )
1201
-
1202
- session = applyEvent(
1203
- session,
1204
- withSessionId(
1205
- SESSION_ID,
1206
- llmEvents.create('inference_completed', {
1207
- agentId,
1208
- consumedMessageIds: [],
1209
- response: {
1210
- content: null,
1211
- toolCalls: [{ id: toolCallId, name: 'read_file', input: { path: '/test' } }],
1212
- },
1213
- metrics: {
1214
- promptTokens: 100,
1215
- completionTokens: 10,
1216
- totalTokens: 110,
1217
- latencyMs: 500,
1218
- model: 'test-model',
1219
- },
1220
- }),
1221
- ),
1222
- )
1223
-
1224
- // Rich content array (like image + text)
1225
- const richContent = [
1226
- { type: 'text' as const, text: 'File contents:' },
1227
- { type: 'image_url' as const, imageUrl: { url: 'data:image/png;base64,abc123' } },
1228
- ]
1229
-
1230
- session = applyEvent(
1231
- session,
1232
- withSessionId(
1233
- SESSION_ID,
1234
- toolEvents.create('tool_completed', {
1235
- agentId,
1236
- toolCallId,
1237
- result: richContent,
1238
- }),
1239
- ),
1240
- )
1241
-
1242
- const agent = session.agents.get(agentId)!
1243
-
1244
- // Rich content should be preserved (not stringified)
1245
- expect(agent.pendingToolResults[0].content).toEqual(richContent)
1246
- })
1247
-
1248
- it('inference_started does NOT clear pendingToolResults (deferred to inference_completed)', () => {
1249
- const agentId = generateTestAgentId()
1250
- const toolCallId = generateToolCallId()
1251
-
1252
- let session = applyEvent(
1253
- baseSession,
1254
- withSessionId(
1255
- SESSION_ID,
1256
- agentEvents.create('agent_spawned', {
1257
- agentId,
1258
- definitionName: 'test',
1259
- parentId: null,
1260
- }),
1261
- ),
1262
- )
1263
-
1264
- session = applyEvent(
1265
- session,
1266
- withSessionId(
1267
- SESSION_ID,
1268
- llmEvents.create('inference_completed', {
1269
- agentId,
1270
- consumedMessageIds: [],
1271
- response: {
1272
- content: null,
1273
- toolCalls: [{ id: toolCallId, name: 'send_message', input: {} }],
1274
- },
1275
- metrics: {
1276
- promptTokens: 100,
1277
- completionTokens: 10,
1278
- totalTokens: 110,
1279
- latencyMs: 500,
1280
- model: 'test-model',
1281
- },
1282
- }),
1283
- ),
1284
- )
1285
-
1286
- session = applyEvent(
1287
- session,
1288
- withSessionId(
1289
- SESSION_ID,
1290
- toolEvents.create('tool_completed', {
1291
- agentId,
1292
- toolCallId,
1293
- result: 'success',
1294
- }),
1295
- ),
1296
- )
1297
-
1298
- // Verify pendingToolResults has entry
1299
- expect(session.agents.get(agentId)!.pendingToolResults).toHaveLength(1)
1300
-
1301
- // Start new inference - should NOT clear pendingToolResults
1302
- session = applyEvent(
1303
- session,
1304
- withSessionId(
1305
- SESSION_ID,
1306
- llmEvents.create('inference_started', {
1307
- agentId,
1308
- messages: [
1309
- { role: 'tool' as const, toolCallId, toolName: 'send_message', content: 'success', isError: false, timestamp: TIMESTAMP },
1310
- ],
1311
- consumedMessageIds: [],
1312
- }),
1313
- ),
1314
- )
1315
-
1316
- // pendingToolResults preserved until inference_completed
1317
- expect(session.agents.get(agentId)!.pendingToolResults).toHaveLength(1)
1318
- })
1319
-
1320
- it('inference_completed moves pendingToolResults to conversationHistory', () => {
1321
- const agentId = generateTestAgentId()
1322
- const toolCallId = generateToolCallId()
1323
- const toolTimestamp = TIMESTAMP + 1000
1324
-
1325
- let session = applyEvent(
1326
- baseSession,
1327
- withSessionId(
1328
- SESSION_ID,
1329
- agentEvents.create('agent_spawned', {
1330
- agentId,
1331
- definitionName: 'test',
1332
- parentId: null,
1333
- }),
1334
- ),
1335
- )
1336
-
1337
- // First inference with tool call
1338
- session = applyEvent(
1339
- session,
1340
- withSessionId(
1341
- SESSION_ID,
1342
- llmEvents.create('inference_completed', {
1343
- agentId,
1344
- consumedMessageIds: [],
1345
- response: {
1346
- content: null,
1347
- toolCalls: [{ id: toolCallId, name: 'send_message', input: {} }],
1348
- },
1349
- metrics: {
1350
- promptTokens: 100,
1351
- completionTokens: 10,
1352
- totalTokens: 110,
1353
- latencyMs: 500,
1354
- model: 'test-model',
1355
- },
1356
- }),
1357
- ),
1358
- )
1359
-
1360
- // Tool completes
1361
- session = applyEvent(session, {
1362
- ...withSessionId(
1363
- SESSION_ID,
1364
- toolEvents.create('tool_completed', {
1365
- agentId,
1366
- toolCallId,
1367
- result: 'tool result content',
1368
- }),
1369
- ),
1370
- timestamp: toolTimestamp,
1371
- })
1372
-
1373
- // Verify: not in history yet, in pendingToolResults
1374
- let agent = session.agents.get(agentId)!
1375
- expect(agent.conversationHistory.filter(m => m.role === 'tool')).toHaveLength(0)
1376
- expect(agent.pendingToolResults).toHaveLength(1)
1377
-
1378
- // Start and complete new inference
1379
- session = applyEvent(session, {
1380
- ...withSessionId(
1381
- SESSION_ID,
1382
- llmEvents.create('inference_started', {
1383
- agentId,
1384
- messages: [
1385
- { role: 'tool' as const, toolCallId, toolName: 'send_message', content: 'tool result content', isError: false, timestamp: toolTimestamp },
1386
- ],
1387
- consumedMessageIds: [],
1388
- }),
1389
- ),
1390
- timestamp: TIMESTAMP + 2000,
1391
- })
1392
-
1393
- session = applyEvent(session, {
1394
- ...withSessionId(
1395
- SESSION_ID,
1396
- llmEvents.create('inference_completed', {
1397
- agentId,
1398
- consumedMessageIds: [],
1399
- response: {
1400
- content: 'Response after tool',
1401
- toolCalls: [],
1402
- },
1403
- metrics: {
1404
- promptTokens: 100,
1405
- completionTokens: 10,
1406
- totalTokens: 110,
1407
- latencyMs: 500,
1408
- model: 'test-model',
1409
- },
1410
- }),
1411
- ),
1412
- timestamp: TIMESTAMP + 3000,
1413
- })
1414
-
1415
- // Verify: pendingToolResults moved to history, then cleared
1416
- agent = session.agents.get(agentId)!
1417
- expect(agent.pendingToolResults).toHaveLength(0)
1418
-
1419
- const toolMessages = agent.conversationHistory.filter(m => m.role === 'tool')
1420
- expect(toolMessages).toHaveLength(1)
1421
-
1422
- const toolMessage = toolMessages[0]
1423
- if (toolMessage.role === 'tool') {
1424
- expect(toolMessage.toolCallId).toBe(toolCallId)
1425
- expect(toolMessage.toolName).toBe('send_message')
1426
- expect(toolMessage.content).toBe('tool result content')
1427
- expect(toolMessage.timestamp).toBe(toolTimestamp)
1428
- expect(toolMessage.isError).toBe(false)
1429
- }
1430
- })
1431
- })
1432
-
1433
- describe('tool_failed', () => {
1434
- it('removes tool call from pending', () => {
1435
- const agentId = generateTestAgentId()
1436
- const toolCallId = generateToolCallId()
1437
-
1438
- let session = applyEvent(
1439
- baseSession,
1440
- withSessionId(
1441
- SESSION_ID,
1442
- agentEvents.create('agent_spawned', {
1443
- agentId,
1444
- definitionName: 'test',
1445
- parentId: null,
1446
- }),
1447
- ),
1448
- )
1449
-
1450
- session = applyEvent(
1451
- session,
1452
- withSessionId(
1453
- SESSION_ID,
1454
- llmEvents.create('inference_completed', {
1455
- agentId,
1456
- consumedMessageIds: [],
1457
- response: {
1458
- content: null,
1459
- toolCalls: [{ id: toolCallId, name: 'test', input: {} }],
1460
- },
1461
- metrics: {
1462
- promptTokens: 100,
1463
- completionTokens: 10,
1464
- totalTokens: 110,
1465
- latencyMs: 500,
1466
- model: 'test-model',
1467
- },
1468
- }),
1469
- ),
1470
- )
1471
-
1472
- const event = withSessionId(
1473
- SESSION_ID,
1474
- toolEvents.create('tool_failed', {
1475
- agentId,
1476
- toolCallId,
1477
- error: 'Tool error',
1478
- }),
1479
- )
1480
-
1481
- session = applyEvent(session, event)
1482
-
1483
- const agent = session.agents.get(agentId)!
1484
- expect(agent.pendingToolCalls).toHaveLength(0)
1485
- expect(agent.status).toBe('pending')
1486
- })
1487
-
1488
- it('stores error in pendingToolResults with isError=true (deferred to history by inference_completed)', () => {
1489
- const agentId = generateTestAgentId()
1490
- const toolCallId = generateToolCallId()
1491
- const toolTimestamp = Date.now()
1492
-
1493
- let session = applyEvent(
1494
- baseSession,
1495
- withSessionId(
1496
- SESSION_ID,
1497
- agentEvents.create('agent_spawned', {
1498
- agentId,
1499
- definitionName: 'test',
1500
- parentId: null,
1501
- }),
1502
- ),
1503
- )
1504
-
1505
- session = applyEvent(
1506
- session,
1507
- withSessionId(
1508
- SESSION_ID,
1509
- llmEvents.create('inference_completed', {
1510
- agentId,
1511
- consumedMessageIds: [],
1512
- response: {
1513
- content: null,
1514
- toolCalls: [{ id: toolCallId, name: 'reveal_secret', input: { password: 'test' } }],
1515
- },
1516
- metrics: {
1517
- promptTokens: 100,
1518
- completionTokens: 10,
1519
- totalTokens: 110,
1520
- latencyMs: 500,
1521
- model: 'test-model',
1522
- },
1523
- }),
1524
- ),
1525
- )
1526
-
1527
- session = applyEvent(session, {
1528
- ...withSessionId(
1529
- SESSION_ID,
1530
- toolEvents.create('tool_failed', {
1531
- agentId,
1532
- toolCallId,
1533
- error: 'Invalid password',
1534
- }),
1535
- ),
1536
- timestamp: toolTimestamp,
1537
- })
1538
-
1539
- const agent = session.agents.get(agentId)!
1540
-
1541
- // Tool result should NOT be in conversationHistory yet (deferred pattern)
1542
- const toolMessage = agent.conversationHistory.find(m => m.role === 'tool')
1543
- expect(toolMessage).toBeUndefined()
1544
-
1545
- // Check pendingToolResults has error content with isError=true
1546
- expect(agent.pendingToolResults).toHaveLength(1)
1547
- expect(agent.pendingToolResults[0].toolCallId).toBe(toolCallId)
1548
- expect(agent.pendingToolResults[0].toolName).toBe('reveal_secret')
1549
- expect(agent.pendingToolResults[0].timestamp).toBe(toolTimestamp)
1550
- expect(agent.pendingToolResults[0].isError).toBe(true)
1551
- expect(agent.pendingToolResults[0].content).toBe('Invalid password')
1552
- })
1553
- })
1554
- })
1555
-
1556
- describe('reconstructSessionState', () => {
1557
- it('returns null for empty events array', () => {
1558
- expect(reconstructSessionState([], applyEvent)).toBeNull()
1559
- })
1560
-
1561
- it('throws error when first event is not session_created', () => {
1562
- const events: DomainEvent[] = [
1563
- withSessionId(SESSION_ID, sessionEvents.create('session_closed', {})),
1564
- ]
1565
-
1566
- expect(() => reconstructSessionState(events, applyEvent)).toThrow(
1567
- 'First event must be session_created',
1568
- )
1569
- })
1570
-
1571
- it('reconstructs session from events', () => {
1572
- const agentId = generateTestAgentId()
1573
- const events: DomainEvent[] = [
1574
- withSessionId(SESSION_ID, sessionEvents.create('session_created', { presetId: 'test-preset' })),
1575
- withSessionId(
1576
- SESSION_ID,
1577
- agentEvents.create('agent_spawned', {
1578
- agentId,
1579
- definitionName: ORCHESTRATOR_ROLE,
1580
- parentId: null,
1581
- }),
1582
- ),
1583
- ]
1584
-
1585
- const session = reconstructSessionState(events, applyEvent)
1586
-
1587
- expect(session).not.toBeNull()
1588
- expect(session!.id).toBe(SESSION_ID)
1589
- expect(session!.agents.size).toBe(1)
1590
- expect(session!.agents.get(agentId)!.definitionName).toBe(ORCHESTRATOR_ROLE)
1591
- })
1592
- })
1593
-
1594
- describe('Query helpers', () => {
1595
- describe('getOrchestratorId', () => {
1596
- it('returns orchestrator agent id', () => {
1597
- const orchestratorId = generateTestAgentId()
1598
- const events: DomainEvent[] = [
1599
- withSessionId(SESSION_ID, sessionEvents.create('session_created', { presetId: 'test' })),
1600
- withSessionId(
1601
- SESSION_ID,
1602
- agentEvents.create('agent_spawned', {
1603
- agentId: orchestratorId,
1604
- definitionName: ORCHESTRATOR_ROLE,
1605
- parentId: null,
1606
- }),
1607
- ),
1608
- ]
1609
-
1610
- const session = reconstructSessionState(events, applyEvent)!
1611
- expect(getOrchestratorId(session)).toBe(orchestratorId)
1612
- })
1613
-
1614
- it('returns null when no orchestrator', () => {
1615
- const session = createSessionState(SESSION_ID, 'test', TIMESTAMP)
1616
- expect(getOrchestratorId(session)).toBeNull()
1617
- })
1618
- })
1619
-
1620
- describe('getCommunicatorId', () => {
1621
- it('returns communicator agent id', () => {
1622
- const communicatorId = generateTestAgentId()
1623
- const events: DomainEvent[] = [
1624
- withSessionId(SESSION_ID, sessionEvents.create('session_created', { presetId: 'test' })),
1625
- withSessionId(
1626
- SESSION_ID,
1627
- agentEvents.create('agent_spawned', {
1628
- agentId: communicatorId,
1629
- definitionName: COMMUNICATOR_ROLE,
1630
- parentId: null,
1631
- }),
1632
- ),
1633
- ]
1634
-
1635
- const session = reconstructSessionState(events, applyEvent)!
1636
- expect(getCommunicatorId(session)).toBe(communicatorId)
1637
- })
1638
- })
1639
-
1640
- describe('getEntryAgentId', () => {
1641
- it('returns communicator when both exist', () => {
1642
- const orchestratorId = generateTestAgentId()
1643
- const communicatorId = generateTestAgentId()
1644
- const events: DomainEvent[] = [
1645
- withSessionId(SESSION_ID, sessionEvents.create('session_created', { presetId: 'test' })),
1646
- withSessionId(
1647
- SESSION_ID,
1648
- agentEvents.create('agent_spawned', {
1649
- agentId: orchestratorId,
1650
- definitionName: ORCHESTRATOR_ROLE,
1651
- parentId: null,
1652
- }),
1653
- ),
1654
- withSessionId(
1655
- SESSION_ID,
1656
- agentEvents.create('agent_spawned', {
1657
- agentId: communicatorId,
1658
- definitionName: COMMUNICATOR_ROLE,
1659
- parentId: orchestratorId,
1660
- }),
1661
- ),
1662
- ]
1663
-
1664
- const session = reconstructSessionState(events, applyEvent)!
1665
- expect(getEntryAgentId(session)).toBe(communicatorId)
1666
- })
1667
-
1668
- it('returns orchestrator when no communicator', () => {
1669
- const orchestratorId = generateTestAgentId()
1670
- const events: DomainEvent[] = [
1671
- withSessionId(SESSION_ID, sessionEvents.create('session_created', { presetId: 'test' })),
1672
- withSessionId(
1673
- SESSION_ID,
1674
- agentEvents.create('agent_spawned', {
1675
- agentId: orchestratorId,
1676
- definitionName: ORCHESTRATOR_ROLE,
1677
- parentId: null,
1678
- }),
1679
- ),
1680
- ]
1681
-
1682
- const session = reconstructSessionState(events, applyEvent)!
1683
- expect(getEntryAgentId(session)).toBe(orchestratorId)
1684
- })
1685
- })
1686
-
1687
- describe('getAgentState', () => {
1688
- it('returns agent by id', () => {
1689
- const agentId = generateTestAgentId()
1690
- const events: DomainEvent[] = [
1691
- withSessionId(SESSION_ID, sessionEvents.create('session_created', { presetId: 'test' })),
1692
- withSessionId(
1693
- SESSION_ID,
1694
- agentEvents.create('agent_spawned', {
1695
- agentId,
1696
- definitionName: 'test',
1697
- parentId: null,
1698
- }),
1699
- ),
1700
- ]
1701
-
1702
- const session = reconstructSessionState(events, applyEvent)!
1703
- const agent = getAgentState(session, agentId)
1704
-
1705
- expect(agent).not.toBeNull()
1706
- expect(agent!.id).toBe(agentId)
1707
- })
1708
-
1709
- it('returns null for unknown agent', () => {
1710
- const session = createSessionState(SESSION_ID, 'test', TIMESTAMP)
1711
- expect(getAgentState(session, generateTestAgentId())).toBeNull()
1712
- })
1713
- })
1714
- })
1715
-
1716
- describe('Immutability', () => {
1717
- it('applyEvent does not mutate original session', () => {
1718
- const session = createSessionState(SESSION_ID, 'test', TIMESTAMP)
1719
- const agentId = generateTestAgentId()
1720
-
1721
- const event = withSessionId(
1722
- SESSION_ID,
1723
- agentEvents.create('agent_spawned', {
1724
- agentId,
1725
- definitionName: 'test',
1726
- parentId: null,
1727
- }),
1728
- )
1729
-
1730
- const newSession = applyEvent(session, event)
1731
-
1732
- expect(session.agents.size).toBe(0)
1733
- expect(newSession.agents.size).toBe(1)
1734
- expect(session).not.toBe(newSession)
1735
- })
1736
- })