@roj-ai/sdk 0.1.36 → 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 (922) hide show
  1. package/dist/bootstrap.d.ts +420 -26
  2. package/dist/bootstrap.d.ts.map +1 -1
  3. package/dist/bootstrap.js +55 -24
  4. package/dist/bootstrap.js.map +1 -1
  5. package/dist/bun-platform/fs.d.ts.map +1 -1
  6. package/dist/bun-platform/fs.js +1 -0
  7. package/dist/bun-platform/fs.js.map +1 -1
  8. package/dist/bun-platform/index.d.ts +4 -1
  9. package/dist/bun-platform/index.d.ts.map +1 -1
  10. package/dist/bun-platform/index.js +7 -1
  11. package/dist/bun-platform/index.js.map +1 -1
  12. package/dist/bun-platform/server-lifecycle.d.ts +30 -0
  13. package/dist/bun-platform/server-lifecycle.d.ts.map +1 -0
  14. package/dist/bun-platform/server-lifecycle.js +182 -0
  15. package/dist/bun-platform/server-lifecycle.js.map +1 -0
  16. package/dist/bun-platform/shell.d.ts +33 -0
  17. package/dist/bun-platform/shell.d.ts.map +1 -0
  18. package/dist/bun-platform/shell.js +322 -0
  19. package/dist/bun-platform/shell.js.map +1 -0
  20. package/dist/config.d.ts +34 -0
  21. package/dist/config.d.ts.map +1 -1
  22. package/dist/config.js +97 -0
  23. package/dist/config.js.map +1 -1
  24. package/dist/core/agents/agent.d.ts +42 -7
  25. package/dist/core/agents/agent.d.ts.map +1 -1
  26. package/dist/core/agents/agent.js +202 -87
  27. package/dist/core/agents/agent.js.map +1 -1
  28. package/dist/core/agents/config.d.ts +8 -1
  29. package/dist/core/agents/config.d.ts.map +1 -1
  30. package/dist/core/agents/config.js +5 -1
  31. package/dist/core/agents/config.js.map +1 -1
  32. package/dist/core/agents/retry.d.ts +1 -1
  33. package/dist/core/agents/retry.d.ts.map +1 -1
  34. package/dist/core/agents/retry.js +14 -16
  35. package/dist/core/agents/retry.js.map +1 -1
  36. package/dist/core/agents/state.d.ts +3 -1
  37. package/dist/core/agents/state.d.ts.map +1 -1
  38. package/dist/core/agents/state.js +1 -1
  39. package/dist/core/agents/state.js.map +1 -1
  40. package/dist/core/context/state.d.ts +3 -3
  41. package/dist/core/context/state.js +2 -2
  42. package/dist/core/events/base-event-store.d.ts.map +1 -1
  43. package/dist/core/events/base-event-store.js +22 -14
  44. package/dist/core/events/base-event-store.js.map +1 -1
  45. package/dist/core/events/file.d.ts +39 -1
  46. package/dist/core/events/file.d.ts.map +1 -1
  47. package/dist/core/events/file.js +159 -20
  48. package/dist/core/events/file.js.map +1 -1
  49. package/dist/core/events/types.d.ts +1 -1
  50. package/dist/core/file-store/containment.d.ts +19 -0
  51. package/dist/core/file-store/containment.d.ts.map +1 -0
  52. package/dist/core/file-store/containment.js +62 -0
  53. package/dist/core/file-store/containment.js.map +1 -0
  54. package/dist/core/file-store/file-store.d.ts +22 -2
  55. package/dist/core/file-store/file-store.d.ts.map +1 -1
  56. package/dist/core/file-store/file-store.js +88 -20
  57. package/dist/core/file-store/file-store.js.map +1 -1
  58. package/dist/core/file-store/types.d.ts +13 -1
  59. package/dist/core/file-store/types.d.ts.map +1 -1
  60. package/dist/core/image/image-processor.d.ts.map +1 -1
  61. package/dist/core/image/image-processor.js +3 -1
  62. package/dist/core/image/image-processor.js.map +1 -1
  63. package/dist/core/image/types.d.ts +2 -0
  64. package/dist/core/image/types.d.ts.map +1 -1
  65. package/dist/core/image/vips-resizer.d.ts.map +1 -1
  66. package/dist/core/image/vips-resizer.js +81 -33
  67. package/dist/core/image/vips-resizer.js.map +1 -1
  68. package/dist/core/llm/anthropic.d.ts +0 -1
  69. package/dist/core/llm/anthropic.d.ts.map +1 -1
  70. package/dist/core/llm/anthropic.js +58 -72
  71. package/dist/core/llm/anthropic.js.map +1 -1
  72. package/dist/core/llm/logger.d.ts +14 -2
  73. package/dist/core/llm/logger.d.ts.map +1 -1
  74. package/dist/core/llm/logger.js +161 -36
  75. package/dist/core/llm/logger.js.map +1 -1
  76. package/dist/core/llm/openrouter.d.ts +0 -1
  77. package/dist/core/llm/openrouter.d.ts.map +1 -1
  78. package/dist/core/llm/openrouter.js +53 -66
  79. package/dist/core/llm/openrouter.js.map +1 -1
  80. package/dist/core/llm/provider-request.d.ts +10 -0
  81. package/dist/core/llm/provider-request.d.ts.map +1 -0
  82. package/dist/core/llm/provider-request.js +41 -0
  83. package/dist/core/llm/provider-request.js.map +1 -0
  84. package/dist/core/llm/provider.d.ts +11 -0
  85. package/dist/core/llm/provider.d.ts.map +1 -1
  86. package/dist/core/llm/provider.js +26 -0
  87. package/dist/core/llm/provider.js.map +1 -1
  88. package/dist/core/llm/state.d.ts +2 -2
  89. package/dist/core/llm/state.js +4 -4
  90. package/dist/core/plugins/plugin-builder.d.ts +57 -3
  91. package/dist/core/plugins/plugin-builder.d.ts.map +1 -1
  92. package/dist/core/plugins/plugin-builder.js +68 -14
  93. package/dist/core/plugins/plugin-builder.js.map +1 -1
  94. package/dist/core/preset/preset-builder.d.ts +3 -2
  95. package/dist/core/preset/preset-builder.d.ts.map +1 -1
  96. package/dist/core/preset/preset-builder.js +7 -16
  97. package/dist/core/preset/preset-builder.js.map +1 -1
  98. package/dist/core/sessions/context.d.ts +23 -5
  99. package/dist/core/sessions/context.d.ts.map +1 -1
  100. package/dist/core/sessions/runtime-activity.d.ts +33 -0
  101. package/dist/core/sessions/runtime-activity.d.ts.map +1 -0
  102. package/dist/core/sessions/runtime-activity.js +55 -0
  103. package/dist/core/sessions/runtime-activity.js.map +1 -0
  104. package/dist/core/sessions/schema.d.ts +23 -2
  105. package/dist/core/sessions/schema.d.ts.map +1 -1
  106. package/dist/core/sessions/schema.js +24 -3
  107. package/dist/core/sessions/schema.js.map +1 -1
  108. package/dist/core/sessions/session-manager.d.ts +83 -6
  109. package/dist/core/sessions/session-manager.d.ts.map +1 -1
  110. package/dist/core/sessions/session-manager.js +517 -118
  111. package/dist/core/sessions/session-manager.js.map +1 -1
  112. package/dist/core/sessions/session-store.d.ts +18 -0
  113. package/dist/core/sessions/session-store.d.ts.map +1 -1
  114. package/dist/core/sessions/session-store.js +33 -0
  115. package/dist/core/sessions/session-store.js.map +1 -1
  116. package/dist/core/sessions/session.d.ts +42 -6
  117. package/dist/core/sessions/session.d.ts.map +1 -1
  118. package/dist/core/sessions/session.js +176 -44
  119. package/dist/core/sessions/session.js.map +1 -1
  120. package/dist/core/sessions/state.d.ts +10 -1
  121. package/dist/core/sessions/state.d.ts.map +1 -1
  122. package/dist/core/sessions/state.js +11 -1
  123. package/dist/core/sessions/state.js.map +1 -1
  124. package/dist/core/system.d.ts +9 -0
  125. package/dist/core/system.d.ts.map +1 -1
  126. package/dist/core/system.js +4 -1
  127. package/dist/core/system.js.map +1 -1
  128. package/dist/core/tools/executor.d.ts +1 -1
  129. package/dist/core/wake-key.d.ts +34 -0
  130. package/dist/core/wake-key.d.ts.map +1 -0
  131. package/dist/core/wake-key.js +51 -0
  132. package/dist/core/wake-key.js.map +1 -0
  133. package/dist/index.d.ts +23 -13
  134. package/dist/index.d.ts.map +1 -1
  135. package/dist/index.js +22 -8
  136. package/dist/index.js.map +1 -1
  137. package/dist/lib/archive/archive-inspection.d.ts +48 -0
  138. package/dist/lib/archive/archive-inspection.d.ts.map +1 -0
  139. package/dist/lib/archive/archive-inspection.fixtures.d.ts +7 -0
  140. package/dist/lib/archive/archive-inspection.fixtures.d.ts.map +1 -0
  141. package/dist/lib/archive/archive-inspection.fixtures.js +134 -0
  142. package/dist/lib/archive/archive-inspection.fixtures.js.map +1 -0
  143. package/dist/lib/archive/archive-inspection.js +253 -0
  144. package/dist/lib/archive/archive-inspection.js.map +1 -0
  145. package/dist/lib/archive/index.d.ts +3 -0
  146. package/dist/lib/archive/index.d.ts.map +1 -0
  147. package/dist/lib/archive/index.js +2 -0
  148. package/dist/lib/archive/index.js.map +1 -0
  149. package/dist/lib/logger/console.d.ts +5 -12
  150. package/dist/lib/logger/console.d.ts.map +1 -1
  151. package/dist/lib/logger/console.js +5 -47
  152. package/dist/lib/logger/console.js.map +1 -1
  153. package/dist/lib/logger/file.d.ts +8 -11
  154. package/dist/lib/logger/file.d.ts.map +1 -1
  155. package/dist/lib/logger/file.js +26 -37
  156. package/dist/lib/logger/file.js.map +1 -1
  157. package/dist/lib/logger/index.d.ts +3 -1
  158. package/dist/lib/logger/index.d.ts.map +1 -1
  159. package/dist/lib/logger/index.js +3 -1
  160. package/dist/lib/logger/index.js.map +1 -1
  161. package/dist/lib/logger/jsonl.d.ts +21 -0
  162. package/dist/lib/logger/jsonl.d.ts.map +1 -0
  163. package/dist/lib/logger/jsonl.js +29 -0
  164. package/dist/lib/logger/jsonl.js.map +1 -0
  165. package/dist/lib/logger/logger.d.ts +22 -0
  166. package/dist/lib/logger/logger.d.ts.map +1 -1
  167. package/dist/lib/logger/logger.js +37 -0
  168. package/dist/lib/logger/logger.js.map +1 -1
  169. package/dist/lib/logger/session-log.d.ts +21 -0
  170. package/dist/lib/logger/session-log.d.ts.map +1 -0
  171. package/dist/lib/logger/session-log.js +37 -0
  172. package/dist/lib/logger/session-log.js.map +1 -0
  173. package/dist/lib/utils/concurrency.d.ts +1 -1
  174. package/dist/lib/utils/concurrency.d.ts.map +1 -1
  175. package/dist/lib/utils/concurrency.js +30 -7
  176. package/dist/lib/utils/concurrency.js.map +1 -1
  177. package/dist/lib/utils/fs-batch.d.ts +17 -0
  178. package/dist/lib/utils/fs-batch.d.ts.map +1 -0
  179. package/dist/lib/utils/fs-batch.js +38 -0
  180. package/dist/lib/utils/fs-batch.js.map +1 -0
  181. package/dist/lib/utils/result.d.ts +7 -22
  182. package/dist/lib/utils/result.d.ts.map +1 -1
  183. package/dist/lib/utils/result.js +6 -17
  184. package/dist/lib/utils/result.js.map +1 -1
  185. package/dist/lib/utils/sleep.d.ts +10 -0
  186. package/dist/lib/utils/sleep.d.ts.map +1 -0
  187. package/dist/lib/utils/sleep.js +26 -0
  188. package/dist/lib/utils/sleep.js.map +1 -0
  189. package/dist/platform/fs-revision.d.ts +21 -0
  190. package/dist/platform/fs-revision.d.ts.map +1 -0
  191. package/dist/platform/fs-revision.js +9 -0
  192. package/dist/platform/fs-revision.js.map +1 -0
  193. package/dist/platform/fs.d.ts +104 -1
  194. package/dist/platform/fs.d.ts.map +1 -1
  195. package/dist/platform/git.d.ts +59 -0
  196. package/dist/platform/git.d.ts.map +1 -0
  197. package/dist/platform/git.js +8 -0
  198. package/dist/platform/git.js.map +1 -0
  199. package/dist/platform/index.d.ts +40 -1
  200. package/dist/platform/index.d.ts.map +1 -1
  201. package/dist/platform/index.js +1 -1
  202. package/dist/platform/index.js.map +1 -1
  203. package/dist/platform/llm-call-log.d.ts +80 -0
  204. package/dist/platform/llm-call-log.d.ts.map +1 -0
  205. package/dist/platform/llm-call-log.js +12 -0
  206. package/dist/platform/llm-call-log.js.map +1 -0
  207. package/dist/platform/scheduler.d.ts +32 -0
  208. package/dist/platform/scheduler.d.ts.map +1 -0
  209. package/dist/platform/scheduler.js +46 -0
  210. package/dist/platform/scheduler.js.map +1 -0
  211. package/dist/platform/session-log.d.ts +36 -0
  212. package/dist/platform/session-log.d.ts.map +1 -0
  213. package/dist/platform/session-log.js +12 -0
  214. package/dist/platform/session-log.js.map +1 -0
  215. package/dist/platform/shell.d.ts +83 -0
  216. package/dist/platform/shell.d.ts.map +1 -0
  217. package/dist/platform/shell.js +13 -0
  218. package/dist/platform/shell.js.map +1 -0
  219. package/dist/plugins/agent-status/plugin.d.ts.map +1 -1
  220. package/dist/plugins/agent-status/plugin.js +1 -0
  221. package/dist/plugins/agent-status/plugin.js.map +1 -1
  222. package/dist/plugins/agents/plugin.d.ts.map +1 -1
  223. package/dist/plugins/agents/plugin.js +129 -62
  224. package/dist/plugins/agents/plugin.js.map +1 -1
  225. package/dist/plugins/filesystem/listing.d.ts +3 -0
  226. package/dist/plugins/filesystem/listing.d.ts.map +1 -1
  227. package/dist/plugins/filesystem/listing.js +66 -10
  228. package/dist/plugins/filesystem/listing.js.map +1 -1
  229. package/dist/plugins/filesystem/plugin.d.ts.map +1 -1
  230. package/dist/plugins/filesystem/plugin.js +8 -6
  231. package/dist/plugins/filesystem/plugin.js.map +1 -1
  232. package/dist/plugins/git-status/plugin.d.ts +34 -7
  233. package/dist/plugins/git-status/plugin.d.ts.map +1 -1
  234. package/dist/plugins/git-status/plugin.js +168 -64
  235. package/dist/plugins/git-status/plugin.js.map +1 -1
  236. package/dist/plugins/llm-debug/plugin.d.ts.map +1 -1
  237. package/dist/plugins/llm-debug/plugin.js +1 -0
  238. package/dist/plugins/llm-debug/plugin.js.map +1 -1
  239. package/dist/plugins/logs/plugin.d.ts +1 -4
  240. package/dist/plugins/logs/plugin.d.ts.map +1 -1
  241. package/dist/plugins/logs/plugin.js +7 -0
  242. package/dist/plugins/logs/plugin.js.map +1 -1
  243. package/dist/plugins/mailbox/helpers.d.ts +2 -2
  244. package/dist/plugins/mailbox/helpers.js +1 -1
  245. package/dist/plugins/mailbox/plugin.d.ts.map +1 -1
  246. package/dist/plugins/mailbox/plugin.js +38 -43
  247. package/dist/plugins/mailbox/plugin.js.map +1 -1
  248. package/dist/plugins/mailbox/query.d.ts +7 -2
  249. package/dist/plugins/mailbox/query.d.ts.map +1 -1
  250. package/dist/plugins/mailbox/query.js +14 -7
  251. package/dist/plugins/mailbox/query.js.map +1 -1
  252. package/dist/plugins/mailbox/state.d.ts +5 -4
  253. package/dist/plugins/mailbox/state.d.ts.map +1 -1
  254. package/dist/plugins/mailbox/state.js +6 -5
  255. package/dist/plugins/mailbox/state.js.map +1 -1
  256. package/dist/plugins/resources/filename.d.ts +4 -0
  257. package/dist/plugins/resources/filename.d.ts.map +1 -0
  258. package/dist/plugins/resources/filename.js +18 -0
  259. package/dist/plugins/resources/filename.js.map +1 -0
  260. package/dist/plugins/resources/plugin.d.ts +3 -0
  261. package/dist/plugins/resources/plugin.d.ts.map +1 -1
  262. package/dist/plugins/resources/plugin.js +97 -60
  263. package/dist/plugins/resources/plugin.js.map +1 -1
  264. package/dist/plugins/resources/state.d.ts +1 -1
  265. package/dist/plugins/resources/state.js +1 -1
  266. package/dist/plugins/result-eviction/plugin.d.ts.map +1 -1
  267. package/dist/plugins/result-eviction/plugin.js +6 -1
  268. package/dist/plugins/result-eviction/plugin.js.map +1 -1
  269. package/dist/plugins/services/plugin.d.ts +4 -1
  270. package/dist/plugins/services/plugin.d.ts.map +1 -1
  271. package/dist/plugins/services/plugin.js +251 -100
  272. package/dist/plugins/services/plugin.js.map +1 -1
  273. package/dist/plugins/services/prompt.d.ts.map +1 -1
  274. package/dist/plugins/services/prompt.js +1 -4
  275. package/dist/plugins/services/prompt.js.map +1 -1
  276. package/dist/plugins/services/schema.d.ts +15 -5
  277. package/dist/plugins/services/schema.d.ts.map +1 -1
  278. package/dist/plugins/services/service.d.ts +100 -18
  279. package/dist/plugins/services/service.d.ts.map +1 -1
  280. package/dist/plugins/services/service.js +680 -230
  281. package/dist/plugins/services/service.js.map +1 -1
  282. package/dist/plugins/session-lifecycle/plugin.d.ts +21 -1
  283. package/dist/plugins/session-lifecycle/plugin.d.ts.map +1 -1
  284. package/dist/plugins/session-lifecycle/plugin.js +53 -40
  285. package/dist/plugins/session-lifecycle/plugin.js.map +1 -1
  286. package/dist/plugins/session-state/plugin.d.ts +21 -13
  287. package/dist/plugins/session-state/plugin.d.ts.map +1 -1
  288. package/dist/plugins/session-state/plugin.js +214 -79
  289. package/dist/plugins/session-state/plugin.js.map +1 -1
  290. package/dist/plugins/session-stats/plugin.d.ts.map +1 -1
  291. package/dist/plugins/session-stats/plugin.js +1 -0
  292. package/dist/plugins/session-stats/plugin.js.map +1 -1
  293. package/dist/plugins/shell/executor.d.ts +17 -15
  294. package/dist/plugins/shell/executor.d.ts.map +1 -1
  295. package/dist/plugins/shell/executor.js +130 -195
  296. package/dist/plugins/shell/executor.js.map +1 -1
  297. package/dist/plugins/shell/index.d.ts +2 -2
  298. package/dist/plugins/shell/index.d.ts.map +1 -1
  299. package/dist/plugins/shell/index.js +2 -2
  300. package/dist/plugins/shell/index.js.map +1 -1
  301. package/dist/plugins/shell/plugin.d.ts +5 -4
  302. package/dist/plugins/shell/plugin.d.ts.map +1 -1
  303. package/dist/plugins/shell/plugin.js +4 -8
  304. package/dist/plugins/shell/plugin.js.map +1 -1
  305. package/dist/plugins/skills/discovery.d.ts.map +1 -1
  306. package/dist/plugins/skills/discovery.js +10 -8
  307. package/dist/plugins/skills/discovery.js.map +1 -1
  308. package/dist/plugins/skills/index.d.ts +1 -1
  309. package/dist/plugins/skills/index.d.ts.map +1 -1
  310. package/dist/plugins/skills/plugin.d.ts +1 -1
  311. package/dist/plugins/skills/plugin.d.ts.map +1 -1
  312. package/dist/plugins/skills/plugin.js +23 -30
  313. package/dist/plugins/skills/plugin.js.map +1 -1
  314. package/dist/plugins/skills/prompts.d.ts +3 -3
  315. package/dist/plugins/skills/prompts.d.ts.map +1 -1
  316. package/dist/plugins/skills/prompts.js.map +1 -1
  317. package/dist/plugins/skills/schema.d.ts +4 -2
  318. package/dist/plugins/skills/schema.d.ts.map +1 -1
  319. package/dist/plugins/todo/schema.d.ts +1 -1
  320. package/dist/plugins/uploads/plugin.d.ts +11 -4
  321. package/dist/plugins/uploads/plugin.d.ts.map +1 -1
  322. package/dist/plugins/uploads/plugin.js +891 -225
  323. package/dist/plugins/uploads/plugin.js.map +1 -1
  324. package/dist/plugins/uploads/preprocessor.d.ts +14 -0
  325. package/dist/plugins/uploads/preprocessor.d.ts.map +1 -1
  326. package/dist/plugins/uploads/preprocessor.js +11 -0
  327. package/dist/plugins/uploads/preprocessor.js.map +1 -1
  328. package/dist/plugins/uploads/preprocessors/image-classifier.d.ts +1 -1
  329. package/dist/plugins/uploads/preprocessors/image-classifier.d.ts.map +1 -1
  330. package/dist/plugins/uploads/preprocessors/image-classifier.js +51 -26
  331. package/dist/plugins/uploads/preprocessors/image-classifier.js.map +1 -1
  332. package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.d.ts +2 -2
  333. package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.d.ts.map +1 -1
  334. package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.js +41 -16
  335. package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.js.map +1 -1
  336. package/dist/plugins/uploads/preprocessors/pdf-preprocessor.d.ts +1 -1
  337. package/dist/plugins/uploads/preprocessors/pdf-preprocessor.d.ts.map +1 -1
  338. package/dist/plugins/uploads/preprocessors/pdf-preprocessor.js +29 -14
  339. package/dist/plugins/uploads/preprocessors/pdf-preprocessor.js.map +1 -1
  340. package/dist/plugins/uploads/preprocessors/zip-preprocessor.d.ts +1 -1
  341. package/dist/plugins/uploads/preprocessors/zip-preprocessor.d.ts.map +1 -1
  342. package/dist/plugins/uploads/preprocessors/zip-preprocessor.js +62 -34
  343. package/dist/plugins/uploads/preprocessors/zip-preprocessor.js.map +1 -1
  344. package/dist/plugins/uploads/schema.d.ts +25 -2
  345. package/dist/plugins/uploads/schema.d.ts.map +1 -1
  346. package/dist/plugins/uploads/schema.js +24 -3
  347. package/dist/plugins/uploads/schema.js.map +1 -1
  348. package/dist/plugins/uploads/state.d.ts +13 -1
  349. package/dist/plugins/uploads/state.d.ts.map +1 -1
  350. package/dist/plugins/uploads/state.js +4 -1
  351. package/dist/plugins/uploads/state.js.map +1 -1
  352. package/dist/plugins/user-chat/plugin.d.ts +12 -5
  353. package/dist/plugins/user-chat/plugin.d.ts.map +1 -1
  354. package/dist/plugins/user-chat/plugin.js +141 -32
  355. package/dist/plugins/user-chat/plugin.js.map +1 -1
  356. package/dist/plugins/workers/context.d.ts +35 -13
  357. package/dist/plugins/workers/context.d.ts.map +1 -1
  358. package/dist/plugins/workers/context.js +82 -32
  359. package/dist/plugins/workers/context.js.map +1 -1
  360. package/dist/plugins/workers/definition.d.ts +7 -0
  361. package/dist/plugins/workers/definition.d.ts.map +1 -1
  362. package/dist/plugins/workers/definition.js.map +1 -1
  363. package/dist/plugins/workers/index.d.ts +4 -4
  364. package/dist/plugins/workers/index.d.ts.map +1 -1
  365. package/dist/plugins/workers/index.js +2 -2
  366. package/dist/plugins/workers/index.js.map +1 -1
  367. package/dist/plugins/workers/plugin.d.ts +10 -57
  368. package/dist/plugins/workers/plugin.d.ts.map +1 -1
  369. package/dist/plugins/workers/plugin.js +385 -123
  370. package/dist/plugins/workers/plugin.js.map +1 -1
  371. package/dist/plugins/workers/state.d.ts +69 -0
  372. package/dist/plugins/workers/state.d.ts.map +1 -0
  373. package/dist/plugins/workers/state.js +52 -0
  374. package/dist/plugins/workers/state.js.map +1 -0
  375. package/dist/plugins/workers/worker.d.ts +15 -4
  376. package/dist/plugins/workers/worker.d.ts.map +1 -1
  377. package/dist/testing/conformance.d.ts +106 -0
  378. package/dist/testing/conformance.d.ts.map +1 -0
  379. package/dist/testing/conformance.js +1463 -0
  380. package/dist/testing/conformance.js.map +1 -0
  381. package/dist/testing/node-platform.d.ts.map +1 -1
  382. package/dist/testing/node-platform.js +5 -0
  383. package/dist/testing/node-platform.js.map +1 -1
  384. package/dist/testing/test-harness.d.ts +11 -1
  385. package/dist/testing/test-harness.d.ts.map +1 -1
  386. package/dist/testing/test-harness.js +17 -37
  387. package/dist/testing/test-harness.js.map +1 -1
  388. package/dist/testing/wait-helpers.d.ts.map +1 -1
  389. package/dist/testing/wait-helpers.js +1 -3
  390. package/dist/testing/wait-helpers.js.map +1 -1
  391. package/dist/transport/adapter/client-adapter.d.ts +6 -0
  392. package/dist/transport/adapter/client-adapter.d.ts.map +1 -1
  393. package/dist/transport/adapter/client-adapter.js +50 -3
  394. package/dist/transport/adapter/client-adapter.js.map +1 -1
  395. package/dist/transport/adapter/heartbeat.d.ts +16 -0
  396. package/dist/transport/adapter/heartbeat.d.ts.map +1 -0
  397. package/dist/transport/adapter/heartbeat.js +41 -0
  398. package/dist/transport/adapter/heartbeat.js.map +1 -0
  399. package/dist/transport/adapter/server-adapter.d.ts.map +1 -1
  400. package/dist/transport/adapter/server-adapter.js +6 -0
  401. package/dist/transport/adapter/server-adapter.js.map +1 -1
  402. package/dist/transport/http/app.d.ts +3 -30
  403. package/dist/transport/http/app.d.ts.map +1 -1
  404. package/dist/transport/http/app.js +3 -7
  405. package/dist/transport/http/app.js.map +1 -1
  406. package/dist/transport/http/context.d.ts +40 -0
  407. package/dist/transport/http/context.d.ts.map +1 -0
  408. package/dist/transport/http/context.js +17 -0
  409. package/dist/transport/http/context.js.map +1 -0
  410. package/dist/transport/http/fetch-guard.d.ts +49 -0
  411. package/dist/transport/http/fetch-guard.d.ts.map +1 -0
  412. package/dist/transport/http/fetch-guard.js +312 -0
  413. package/dist/transport/http/fetch-guard.js.map +1 -0
  414. package/dist/transport/http/index.d.ts +1 -1
  415. package/dist/transport/http/index.d.ts.map +1 -1
  416. package/dist/transport/http/middleware/bearer-auth.d.ts +1 -1
  417. package/dist/transport/http/middleware/bearer-auth.d.ts.map +1 -1
  418. package/dist/transport/http/middleware/error-handler.d.ts +2 -2
  419. package/dist/transport/http/middleware/error-handler.d.ts.map +1 -1
  420. package/dist/transport/http/path-containment.d.ts +20 -0
  421. package/dist/transport/http/path-containment.d.ts.map +1 -0
  422. package/dist/transport/http/path-containment.js +31 -0
  423. package/dist/transport/http/path-containment.js.map +1 -0
  424. package/dist/transport/http/responses.d.ts +30 -0
  425. package/dist/transport/http/responses.d.ts.map +1 -0
  426. package/dist/transport/http/responses.js +5 -0
  427. package/dist/transport/http/responses.js.map +1 -0
  428. package/dist/transport/http/routes/files.d.ts +1 -1
  429. package/dist/transport/http/routes/files.d.ts.map +1 -1
  430. package/dist/transport/http/routes/files.js +54 -155
  431. package/dist/transport/http/routes/files.js.map +1 -1
  432. package/dist/transport/http/routes/resources.d.ts +1 -1
  433. package/dist/transport/http/routes/resources.d.ts.map +1 -1
  434. package/dist/transport/http/routes/resources.js +92 -57
  435. package/dist/transport/http/routes/resources.js.map +1 -1
  436. package/dist/transport/http/routes/rpc.d.ts +6 -1
  437. package/dist/transport/http/routes/rpc.d.ts.map +1 -1
  438. package/dist/transport/http/routes/rpc.js +51 -21
  439. package/dist/transport/http/routes/rpc.js.map +1 -1
  440. package/dist/transport/http/routes/upload.d.ts +1 -1
  441. package/dist/transport/http/routes/upload.d.ts.map +1 -1
  442. package/dist/transport/http/routes/upload.js +256 -169
  443. package/dist/transport/http/routes/upload.js.map +1 -1
  444. package/dist/user-config.d.ts +34 -7
  445. package/dist/user-config.d.ts.map +1 -1
  446. package/dist/user-config.js +71 -0
  447. package/dist/user-config.js.map +1 -1
  448. package/package.json +17 -7
  449. package/src/bootstrap.ts +119 -35
  450. package/src/bun-platform/fs.ts +1 -0
  451. package/src/bun-platform/index.ts +18 -1
  452. package/src/bun-platform/server-lifecycle.ts +218 -0
  453. package/src/bun-platform/shell.ts +362 -0
  454. package/src/config.ts +130 -0
  455. package/src/core/agents/agent.ts +210 -92
  456. package/src/core/agents/config.ts +8 -0
  457. package/src/core/agents/retry.ts +16 -17
  458. package/src/core/agents/state.ts +2 -0
  459. package/src/core/events/base-event-store.ts +24 -16
  460. package/src/core/events/file.ts +198 -22
  461. package/src/core/file-store/containment.ts +75 -0
  462. package/src/core/file-store/file-store.ts +106 -25
  463. package/src/core/file-store/types.ts +14 -1
  464. package/src/core/image/image-processor.ts +3 -1
  465. package/src/core/image/types.ts +2 -0
  466. package/src/core/image/vips-resizer.ts +102 -37
  467. package/src/core/llm/anthropic.ts +63 -79
  468. package/src/core/llm/logger.ts +175 -37
  469. package/src/core/llm/openrouter.ts +57 -72
  470. package/src/core/llm/provider-request.ts +40 -0
  471. package/src/core/llm/provider.ts +28 -0
  472. package/src/core/plugins/plugin-builder.ts +106 -14
  473. package/src/core/preset/preset-builder.ts +12 -22
  474. package/src/core/sessions/context.ts +18 -0
  475. package/src/core/sessions/runtime-activity.ts +78 -0
  476. package/src/core/sessions/schema.ts +29 -3
  477. package/src/core/sessions/session-manager.ts +560 -140
  478. package/src/core/sessions/session-store.ts +38 -0
  479. package/src/core/sessions/session.ts +187 -47
  480. package/src/core/sessions/state.ts +11 -0
  481. package/src/core/system.ts +15 -0
  482. package/src/core/wake-key.ts +65 -0
  483. package/src/index.ts +30 -12
  484. package/src/lib/archive/archive-inspection.fixtures.ts +138 -0
  485. package/src/lib/archive/archive-inspection.ts +359 -0
  486. package/src/lib/archive/index.ts +17 -0
  487. package/src/lib/logger/console.ts +7 -57
  488. package/src/lib/logger/file.ts +28 -50
  489. package/src/lib/logger/index.ts +3 -1
  490. package/src/lib/logger/jsonl.ts +36 -0
  491. package/src/lib/logger/logger.ts +48 -0
  492. package/src/lib/logger/session-log.ts +42 -0
  493. package/src/lib/utils/concurrency.ts +37 -8
  494. package/src/lib/utils/fs-batch.ts +49 -0
  495. package/src/lib/utils/result.ts +7 -31
  496. package/src/lib/utils/sleep.ts +23 -0
  497. package/src/platform/fs-revision.ts +21 -0
  498. package/src/platform/fs.ts +109 -1
  499. package/src/platform/git.ts +67 -0
  500. package/src/platform/index.ts +51 -1
  501. package/src/platform/llm-call-log.ts +86 -0
  502. package/src/platform/scheduler.ts +71 -0
  503. package/src/platform/session-log.ts +39 -0
  504. package/src/platform/shell.ts +89 -0
  505. package/src/plugins/agent-status/plugin.ts +1 -0
  506. package/src/plugins/agents/plugin.ts +134 -81
  507. package/src/plugins/filesystem/listing.ts +70 -12
  508. package/src/plugins/filesystem/plugin.ts +8 -6
  509. package/src/plugins/git-status/plugin.ts +204 -77
  510. package/src/plugins/llm-debug/plugin.ts +1 -0
  511. package/src/plugins/logs/plugin.ts +9 -0
  512. package/src/plugins/mailbox/plugin.ts +46 -64
  513. package/src/plugins/mailbox/query.ts +15 -7
  514. package/src/plugins/mailbox/state.ts +1 -0
  515. package/src/plugins/resources/filename.ts +19 -0
  516. package/src/plugins/resources/plugin.ts +111 -59
  517. package/src/plugins/result-eviction/plugin.ts +6 -1
  518. package/src/plugins/services/plugin.ts +254 -98
  519. package/src/plugins/services/prompt.ts +1 -6
  520. package/src/plugins/services/schema.ts +17 -3
  521. package/src/plugins/services/service.ts +702 -252
  522. package/src/plugins/session-lifecycle/plugin.ts +56 -41
  523. package/src/plugins/session-state/plugin.ts +242 -88
  524. package/src/plugins/session-stats/plugin.ts +1 -0
  525. package/src/plugins/shell/executor.ts +144 -226
  526. package/src/plugins/shell/index.ts +1 -4
  527. package/src/plugins/shell/plugin.ts +7 -9
  528. package/src/plugins/skills/discovery.ts +10 -8
  529. package/src/plugins/skills/index.ts +1 -1
  530. package/src/plugins/skills/plugin.ts +19 -27
  531. package/src/plugins/skills/prompts.ts +3 -3
  532. package/src/plugins/skills/schema.ts +5 -2
  533. package/src/plugins/uploads/plugin.ts +991 -273
  534. package/src/plugins/uploads/preprocessor.ts +25 -0
  535. package/src/plugins/uploads/preprocessors/image-classifier.ts +56 -25
  536. package/src/plugins/uploads/preprocessors/markitdown-preprocessor.ts +41 -15
  537. package/src/plugins/uploads/preprocessors/pdf-preprocessor.ts +32 -16
  538. package/src/plugins/uploads/preprocessors/zip-preprocessor.ts +67 -38
  539. package/src/plugins/uploads/schema.ts +30 -3
  540. package/src/plugins/uploads/state.ts +12 -0
  541. package/src/plugins/user-chat/plugin.ts +196 -40
  542. package/src/plugins/workers/context.ts +102 -39
  543. package/src/plugins/workers/definition.ts +7 -0
  544. package/src/plugins/workers/index.ts +4 -4
  545. package/src/plugins/workers/plugin.ts +461 -151
  546. package/src/plugins/workers/state.ts +64 -0
  547. package/src/plugins/workers/worker.ts +15 -4
  548. package/src/testing/conformance.ts +1751 -0
  549. package/src/testing/node-platform.ts +5 -0
  550. package/src/testing/test-harness.ts +21 -38
  551. package/src/testing/wait-helpers.ts +1 -4
  552. package/src/transport/adapter/client-adapter.ts +60 -3
  553. package/src/transport/adapter/heartbeat.ts +50 -0
  554. package/src/transport/adapter/server-adapter.ts +6 -0
  555. package/src/transport/http/app.ts +7 -35
  556. package/src/transport/http/context.ts +46 -0
  557. package/src/transport/http/fetch-guard.ts +318 -0
  558. package/src/transport/http/index.ts +1 -1
  559. package/src/transport/http/middleware/bearer-auth.ts +1 -1
  560. package/src/transport/http/middleware/error-handler.ts +1 -1
  561. package/src/transport/http/path-containment.ts +44 -0
  562. package/src/transport/http/responses.ts +20 -0
  563. package/src/transport/http/routes/files.ts +69 -159
  564. package/src/transport/http/routes/resources.ts +124 -93
  565. package/src/transport/http/routes/rpc.ts +63 -26
  566. package/src/transport/http/routes/upload.ts +327 -258
  567. package/src/user-config.ts +93 -7
  568. package/dist/config.test.d.ts +0 -2
  569. package/dist/config.test.d.ts.map +0 -1
  570. package/dist/config.test.js +0 -155
  571. package/dist/config.test.js.map +0 -1
  572. package/dist/core/agent-loop.integration.test.d.ts +0 -2
  573. package/dist/core/agent-loop.integration.test.d.ts.map +0 -1
  574. package/dist/core/agent-loop.integration.test.js +0 -414
  575. package/dist/core/agent-loop.integration.test.js.map +0 -1
  576. package/dist/core/agents/agent-config.test.d.ts +0 -2
  577. package/dist/core/agents/agent-config.test.d.ts.map +0 -1
  578. package/dist/core/agents/agent-config.test.js +0 -194
  579. package/dist/core/agents/agent-config.test.js.map +0 -1
  580. package/dist/core/agents/agent-shutdown.test.d.ts +0 -6
  581. package/dist/core/agents/agent-shutdown.test.d.ts.map +0 -1
  582. package/dist/core/agents/agent-shutdown.test.js +0 -180
  583. package/dist/core/agents/agent-shutdown.test.js.map +0 -1
  584. package/dist/core/agents/agent.test.d.ts +0 -2
  585. package/dist/core/agents/agent.test.d.ts.map +0 -1
  586. package/dist/core/agents/agent.test.js +0 -313
  587. package/dist/core/agents/agent.test.js.map +0 -1
  588. package/dist/core/agents/communicator.d.ts +0 -3
  589. package/dist/core/agents/communicator.d.ts.map +0 -1
  590. package/dist/core/agents/communicator.js +0 -13
  591. package/dist/core/agents/communicator.js.map +0 -1
  592. package/dist/core/agents/handler-events.test.d.ts +0 -5
  593. package/dist/core/agents/handler-events.test.d.ts.map +0 -1
  594. package/dist/core/agents/handler-events.test.js +0 -115
  595. package/dist/core/agents/handler-events.test.js.map +0 -1
  596. package/dist/core/agents/response-sanitizer.test.d.ts +0 -2
  597. package/dist/core/agents/response-sanitizer.test.d.ts.map +0 -1
  598. package/dist/core/agents/response-sanitizer.test.js +0 -101
  599. package/dist/core/agents/response-sanitizer.test.js.map +0 -1
  600. package/dist/core/error-recovery.integration.test.d.ts +0 -2
  601. package/dist/core/error-recovery.integration.test.d.ts.map +0 -1
  602. package/dist/core/error-recovery.integration.test.js +0 -288
  603. package/dist/core/error-recovery.integration.test.js.map +0 -1
  604. package/dist/core/event-sourcing.integration.test.d.ts +0 -2
  605. package/dist/core/event-sourcing.integration.test.d.ts.map +0 -1
  606. package/dist/core/event-sourcing.integration.test.js +0 -154
  607. package/dist/core/event-sourcing.integration.test.js.map +0 -1
  608. package/dist/core/events/file.test.d.ts +0 -2
  609. package/dist/core/events/file.test.d.ts.map +0 -1
  610. package/dist/core/events/file.test.js +0 -284
  611. package/dist/core/events/file.test.js.map +0 -1
  612. package/dist/core/events/memory.test.d.ts +0 -2
  613. package/dist/core/events/memory.test.d.ts.map +0 -1
  614. package/dist/core/events/memory.test.js +0 -502
  615. package/dist/core/events/memory.test.js.map +0 -1
  616. package/dist/core/image/image-processor.test.d.ts +0 -2
  617. package/dist/core/image/image-processor.test.d.ts.map +0 -1
  618. package/dist/core/image/image-processor.test.js +0 -171
  619. package/dist/core/image/image-processor.test.js.map +0 -1
  620. package/dist/core/image/vips-resizer.test.d.ts +0 -2
  621. package/dist/core/image/vips-resizer.test.d.ts.map +0 -1
  622. package/dist/core/image/vips-resizer.test.js +0 -336
  623. package/dist/core/image/vips-resizer.test.js.map +0 -1
  624. package/dist/core/llm/anthropic.test.d.ts +0 -2
  625. package/dist/core/llm/anthropic.test.d.ts.map +0 -1
  626. package/dist/core/llm/anthropic.test.js +0 -464
  627. package/dist/core/llm/anthropic.test.js.map +0 -1
  628. package/dist/core/llm/cache-breakpoints.test.d.ts +0 -2
  629. package/dist/core/llm/cache-breakpoints.test.d.ts.map +0 -1
  630. package/dist/core/llm/cache-breakpoints.test.js +0 -69
  631. package/dist/core/llm/cache-breakpoints.test.js.map +0 -1
  632. package/dist/core/llm/cache-live.test.d.ts +0 -16
  633. package/dist/core/llm/cache-live.test.d.ts.map +0 -1
  634. package/dist/core/llm/cache-live.test.js +0 -137
  635. package/dist/core/llm/cache-live.test.js.map +0 -1
  636. package/dist/core/llm/logger.test.d.ts +0 -7
  637. package/dist/core/llm/logger.test.d.ts.map +0 -1
  638. package/dist/core/llm/logger.test.js +0 -228
  639. package/dist/core/llm/logger.test.js.map +0 -1
  640. package/dist/core/llm/message-sanitization.test.d.ts +0 -2
  641. package/dist/core/llm/message-sanitization.test.d.ts.map +0 -1
  642. package/dist/core/llm/message-sanitization.test.js +0 -181
  643. package/dist/core/llm/message-sanitization.test.js.map +0 -1
  644. package/dist/core/llm/mock.test.d.ts +0 -2
  645. package/dist/core/llm/mock.test.d.ts.map +0 -1
  646. package/dist/core/llm/mock.test.js +0 -318
  647. package/dist/core/llm/mock.test.js.map +0 -1
  648. package/dist/core/llm/model-shortlist-live.test.d.ts +0 -35
  649. package/dist/core/llm/model-shortlist-live.test.d.ts.map +0 -1
  650. package/dist/core/llm/model-shortlist-live.test.js +0 -452
  651. package/dist/core/llm/model-shortlist-live.test.js.map +0 -1
  652. package/dist/core/llm/openrouter-mapping.test.d.ts +0 -2
  653. package/dist/core/llm/openrouter-mapping.test.d.ts.map +0 -1
  654. package/dist/core/llm/openrouter-mapping.test.js +0 -190
  655. package/dist/core/llm/openrouter-mapping.test.js.map +0 -1
  656. package/dist/core/llm/openrouter.test.d.ts +0 -2
  657. package/dist/core/llm/openrouter.test.d.ts.map +0 -1
  658. package/dist/core/llm/openrouter.test.js +0 -377
  659. package/dist/core/llm/openrouter.test.js.map +0 -1
  660. package/dist/core/llm/provider-integration.test.d.ts +0 -12
  661. package/dist/core/llm/provider-integration.test.d.ts.map +0 -1
  662. package/dist/core/llm/provider-integration.test.js +0 -350
  663. package/dist/core/llm/provider-integration.test.js.map +0 -1
  664. package/dist/core/llm/reasoning-details.test.d.ts +0 -2
  665. package/dist/core/llm/reasoning-details.test.d.ts.map +0 -1
  666. package/dist/core/llm/reasoning-details.test.js +0 -144
  667. package/dist/core/llm/reasoning-details.test.js.map +0 -1
  668. package/dist/core/llm/routing-provider.test.d.ts +0 -2
  669. package/dist/core/llm/routing-provider.test.d.ts.map +0 -1
  670. package/dist/core/llm/routing-provider.test.js +0 -94
  671. package/dist/core/llm/routing-provider.test.js.map +0 -1
  672. package/dist/core/llm/snapshot-middleware.test.d.ts +0 -2
  673. package/dist/core/llm/snapshot-middleware.test.d.ts.map +0 -1
  674. package/dist/core/llm/snapshot-middleware.test.js +0 -144
  675. package/dist/core/llm/snapshot-middleware.test.js.map +0 -1
  676. package/dist/core/llm/thinking-blocks.test.d.ts +0 -2
  677. package/dist/core/llm/thinking-blocks.test.d.ts.map +0 -1
  678. package/dist/core/llm/thinking-blocks.test.js +0 -291
  679. package/dist/core/llm/thinking-blocks.test.js.map +0 -1
  680. package/dist/core/multi-agent.integration.test.d.ts +0 -2
  681. package/dist/core/multi-agent.integration.test.d.ts.map +0 -1
  682. package/dist/core/multi-agent.integration.test.js +0 -298
  683. package/dist/core/multi-agent.integration.test.js.map +0 -1
  684. package/dist/core/plugin-hooks.integration.test.d.ts +0 -2
  685. package/dist/core/plugin-hooks.integration.test.d.ts.map +0 -1
  686. package/dist/core/plugin-hooks.integration.test.js +0 -458
  687. package/dist/core/plugin-hooks.integration.test.js.map +0 -1
  688. package/dist/core/reasoning-round-trip.integration.test.d.ts +0 -2
  689. package/dist/core/reasoning-round-trip.integration.test.d.ts.map +0 -1
  690. package/dist/core/reasoning-round-trip.integration.test.js +0 -150
  691. package/dist/core/reasoning-round-trip.integration.test.js.map +0 -1
  692. package/dist/core/session-lifecycle.integration.test.d.ts +0 -2
  693. package/dist/core/session-lifecycle.integration.test.d.ts.map +0 -1
  694. package/dist/core/session-lifecycle.integration.test.js +0 -159
  695. package/dist/core/session-lifecycle.integration.test.js.map +0 -1
  696. package/dist/core/sessions/fork-utils.test.d.ts +0 -2
  697. package/dist/core/sessions/fork-utils.test.d.ts.map +0 -1
  698. package/dist/core/sessions/fork-utils.test.js +0 -129
  699. package/dist/core/sessions/fork-utils.test.js.map +0 -1
  700. package/dist/core/sessions/session-overrides.integration.test.d.ts +0 -2
  701. package/dist/core/sessions/session-overrides.integration.test.d.ts.map +0 -1
  702. package/dist/core/sessions/session-overrides.integration.test.js +0 -154
  703. package/dist/core/sessions/session-overrides.integration.test.js.map +0 -1
  704. package/dist/core/sessions/session.test.d.ts +0 -2
  705. package/dist/core/sessions/session.test.d.ts.map +0 -1
  706. package/dist/core/sessions/session.test.js +0 -1100
  707. package/dist/core/sessions/session.test.js.map +0 -1
  708. package/dist/core/tools/executor.test.d.ts +0 -2
  709. package/dist/core/tools/executor.test.d.ts.map +0 -1
  710. package/dist/core/tools/executor.test.js +0 -144
  711. package/dist/core/tools/executor.test.js.map +0 -1
  712. package/dist/lib/logger/console.test.d.ts +0 -2
  713. package/dist/lib/logger/console.test.d.ts.map +0 -1
  714. package/dist/lib/logger/console.test.js +0 -258
  715. package/dist/lib/logger/console.test.js.map +0 -1
  716. package/dist/lib/never.d.ts +0 -2
  717. package/dist/lib/never.d.ts.map +0 -1
  718. package/dist/lib/never.js +0 -4
  719. package/dist/lib/never.js.map +0 -1
  720. package/dist/lib/utils/concurrency.test.d.ts +0 -2
  721. package/dist/lib/utils/concurrency.test.d.ts.map +0 -1
  722. package/dist/lib/utils/concurrency.test.js +0 -135
  723. package/dist/lib/utils/concurrency.test.js.map +0 -1
  724. package/dist/plugins/agent-status/agent-status.test.d.ts +0 -2
  725. package/dist/plugins/agent-status/agent-status.test.d.ts.map +0 -1
  726. package/dist/plugins/agent-status/agent-status.test.js +0 -136
  727. package/dist/plugins/agent-status/agent-status.test.js.map +0 -1
  728. package/dist/plugins/agents/agents.integration.test.d.ts +0 -2
  729. package/dist/plugins/agents/agents.integration.test.d.ts.map +0 -1
  730. package/dist/plugins/agents/agents.integration.test.js +0 -830
  731. package/dist/plugins/agents/agents.integration.test.js.map +0 -1
  732. package/dist/plugins/agents/supervision.integration.test.d.ts +0 -2
  733. package/dist/plugins/agents/supervision.integration.test.d.ts.map +0 -1
  734. package/dist/plugins/agents/supervision.integration.test.js +0 -215
  735. package/dist/plugins/agents/supervision.integration.test.js.map +0 -1
  736. package/dist/plugins/context-compact/compaction-live.test.d.ts +0 -17
  737. package/dist/plugins/context-compact/compaction-live.test.d.ts.map +0 -1
  738. package/dist/plugins/context-compact/compaction-live.test.js +0 -177
  739. package/dist/plugins/context-compact/compaction-live.test.js.map +0 -1
  740. package/dist/plugins/context-compact/context-compact.integration.test.d.ts +0 -2
  741. package/dist/plugins/context-compact/context-compact.integration.test.d.ts.map +0 -1
  742. package/dist/plugins/context-compact/context-compact.integration.test.js +0 -364
  743. package/dist/plugins/context-compact/context-compact.integration.test.js.map +0 -1
  744. package/dist/plugins/context-compact/context-compactor.test.d.ts +0 -2
  745. package/dist/plugins/context-compact/context-compactor.test.d.ts.map +0 -1
  746. package/dist/plugins/context-compact/context-compactor.test.js +0 -858
  747. package/dist/plugins/context-compact/context-compactor.test.js.map +0 -1
  748. package/dist/plugins/context-compact/history-offloader.test.d.ts +0 -2
  749. package/dist/plugins/context-compact/history-offloader.test.d.ts.map +0 -1
  750. package/dist/plugins/context-compact/history-offloader.test.js +0 -77
  751. package/dist/plugins/context-compact/history-offloader.test.js.map +0 -1
  752. package/dist/plugins/filesystem/filesystem.integration.test.d.ts +0 -2
  753. package/dist/plugins/filesystem/filesystem.integration.test.d.ts.map +0 -1
  754. package/dist/plugins/filesystem/filesystem.integration.test.js +0 -447
  755. package/dist/plugins/filesystem/filesystem.integration.test.js.map +0 -1
  756. package/dist/plugins/filesystem/schema.d.ts +0 -7
  757. package/dist/plugins/filesystem/schema.d.ts.map +0 -1
  758. package/dist/plugins/filesystem/schema.js +0 -2
  759. package/dist/plugins/filesystem/schema.js.map +0 -1
  760. package/dist/plugins/limits-guard/limit-guard.test.d.ts +0 -2
  761. package/dist/plugins/limits-guard/limit-guard.test.d.ts.map +0 -1
  762. package/dist/plugins/limits-guard/limit-guard.test.js +0 -194
  763. package/dist/plugins/limits-guard/limit-guard.test.js.map +0 -1
  764. package/dist/plugins/limits-guard/limits-guard.integration.test.d.ts +0 -2
  765. package/dist/plugins/limits-guard/limits-guard.integration.test.d.ts.map +0 -1
  766. package/dist/plugins/limits-guard/limits-guard.integration.test.js +0 -887
  767. package/dist/plugins/limits-guard/limits-guard.integration.test.js.map +0 -1
  768. package/dist/plugins/llm-debug/llm-debug.integration.test.d.ts +0 -2
  769. package/dist/plugins/llm-debug/llm-debug.integration.test.d.ts.map +0 -1
  770. package/dist/plugins/llm-debug/llm-debug.integration.test.js +0 -157
  771. package/dist/plugins/llm-debug/llm-debug.integration.test.js.map +0 -1
  772. package/dist/plugins/mailbox/mailbox.integration.test.d.ts +0 -2
  773. package/dist/plugins/mailbox/mailbox.integration.test.d.ts.map +0 -1
  774. package/dist/plugins/mailbox/mailbox.integration.test.js +0 -678
  775. package/dist/plugins/mailbox/mailbox.integration.test.js.map +0 -1
  776. package/dist/plugins/resources/resources.integration.test.d.ts +0 -2
  777. package/dist/plugins/resources/resources.integration.test.d.ts.map +0 -1
  778. package/dist/plugins/resources/resources.integration.test.js +0 -62
  779. package/dist/plugins/resources/resources.integration.test.js.map +0 -1
  780. package/dist/plugins/result-eviction/result-eviction.integration.test.d.ts +0 -2
  781. package/dist/plugins/result-eviction/result-eviction.integration.test.d.ts.map +0 -1
  782. package/dist/plugins/result-eviction/result-eviction.integration.test.js +0 -294
  783. package/dist/plugins/result-eviction/result-eviction.integration.test.js.map +0 -1
  784. package/dist/plugins/services/pid-registry.test.d.ts +0 -2
  785. package/dist/plugins/services/pid-registry.test.d.ts.map +0 -1
  786. package/dist/plugins/services/pid-registry.test.js +0 -161
  787. package/dist/plugins/services/pid-registry.test.js.map +0 -1
  788. package/dist/plugins/services/services.integration.test.d.ts +0 -2
  789. package/dist/plugins/services/services.integration.test.d.ts.map +0 -1
  790. package/dist/plugins/services/services.integration.test.js +0 -1057
  791. package/dist/plugins/services/services.integration.test.js.map +0 -1
  792. package/dist/plugins/session-lifecycle/session-lifecycle.integration.test.d.ts +0 -2
  793. package/dist/plugins/session-lifecycle/session-lifecycle.integration.test.d.ts.map +0 -1
  794. package/dist/plugins/session-lifecycle/session-lifecycle.integration.test.js +0 -498
  795. package/dist/plugins/session-lifecycle/session-lifecycle.integration.test.js.map +0 -1
  796. package/dist/plugins/session-stats/plugin.test.d.ts +0 -2
  797. package/dist/plugins/session-stats/plugin.test.d.ts.map +0 -1
  798. package/dist/plugins/session-stats/plugin.test.js +0 -145
  799. package/dist/plugins/session-stats/plugin.test.js.map +0 -1
  800. package/dist/plugins/shell/shell.integration.test.d.ts +0 -2
  801. package/dist/plugins/shell/shell.integration.test.d.ts.map +0 -1
  802. package/dist/plugins/shell/shell.integration.test.js +0 -234
  803. package/dist/plugins/shell/shell.integration.test.js.map +0 -1
  804. package/dist/plugins/shell/shell.test.d.ts +0 -2
  805. package/dist/plugins/shell/shell.test.d.ts.map +0 -1
  806. package/dist/plugins/shell/shell.test.js +0 -236
  807. package/dist/plugins/shell/shell.test.js.map +0 -1
  808. package/dist/plugins/skills/discovery.test.d.ts +0 -2
  809. package/dist/plugins/skills/discovery.test.d.ts.map +0 -1
  810. package/dist/plugins/skills/discovery.test.js +0 -312
  811. package/dist/plugins/skills/discovery.test.js.map +0 -1
  812. package/dist/plugins/skills/skills.integration.test.d.ts +0 -2
  813. package/dist/plugins/skills/skills.integration.test.d.ts.map +0 -1
  814. package/dist/plugins/skills/skills.integration.test.js +0 -475
  815. package/dist/plugins/skills/skills.integration.test.js.map +0 -1
  816. package/dist/plugins/todo/todo.integration.test.d.ts +0 -2
  817. package/dist/plugins/todo/todo.integration.test.d.ts.map +0 -1
  818. package/dist/plugins/todo/todo.integration.test.js +0 -605
  819. package/dist/plugins/todo/todo.integration.test.js.map +0 -1
  820. package/dist/plugins/uploads/preprocessors/image-classifier.test.d.ts +0 -2
  821. package/dist/plugins/uploads/preprocessors/image-classifier.test.d.ts.map +0 -1
  822. package/dist/plugins/uploads/preprocessors/image-classifier.test.js +0 -113
  823. package/dist/plugins/uploads/preprocessors/image-classifier.test.js.map +0 -1
  824. package/dist/plugins/uploads/uploads.integration.test.d.ts +0 -2
  825. package/dist/plugins/uploads/uploads.integration.test.d.ts.map +0 -1
  826. package/dist/plugins/uploads/uploads.integration.test.js +0 -639
  827. package/dist/plugins/uploads/uploads.integration.test.js.map +0 -1
  828. package/dist/plugins/user-chat/user-chat.integration.test.d.ts +0 -2
  829. package/dist/plugins/user-chat/user-chat.integration.test.d.ts.map +0 -1
  830. package/dist/plugins/user-chat/user-chat.integration.test.js +0 -754
  831. package/dist/plugins/user-chat/user-chat.integration.test.js.map +0 -1
  832. package/dist/plugins/workers/workers.integration.test.d.ts +0 -2
  833. package/dist/plugins/workers/workers.integration.test.d.ts.map +0 -1
  834. package/dist/plugins/workers/workers.integration.test.js +0 -629
  835. package/dist/plugins/workers/workers.integration.test.js.map +0 -1
  836. package/dist/prompts/macros.test.d.ts +0 -2
  837. package/dist/prompts/macros.test.d.ts.map +0 -1
  838. package/dist/prompts/macros.test.js +0 -80
  839. package/dist/prompts/macros.test.js.map +0 -1
  840. package/dist/testing/test-harness.test.d.ts +0 -2
  841. package/dist/testing/test-harness.test.d.ts.map +0 -1
  842. package/dist/testing/test-harness.test.js +0 -92
  843. package/dist/testing/test-harness.test.js.map +0 -1
  844. package/dist/transport/http/routes/rpc.integration.test.d.ts +0 -2
  845. package/dist/transport/http/routes/rpc.integration.test.d.ts.map +0 -1
  846. package/dist/transport/http/routes/rpc.integration.test.js +0 -189
  847. package/dist/transport/http/routes/rpc.integration.test.js.map +0 -1
  848. package/dist/transport/http/routes/rpc.test.d.ts +0 -2
  849. package/dist/transport/http/routes/rpc.test.d.ts.map +0 -1
  850. package/dist/transport/http/routes/rpc.test.js +0 -316
  851. package/dist/transport/http/routes/rpc.test.js.map +0 -1
  852. package/src/config.test.ts +0 -174
  853. package/src/core/agent-loop.integration.test.ts +0 -503
  854. package/src/core/agents/agent-config.test.ts +0 -240
  855. package/src/core/agents/agent-shutdown.test.ts +0 -236
  856. package/src/core/agents/agent.test.ts +0 -387
  857. package/src/core/agents/communicator.ts +0 -16
  858. package/src/core/agents/handler-events.test.ts +0 -167
  859. package/src/core/agents/response-sanitizer.test.ts +0 -137
  860. package/src/core/error-recovery.integration.test.ts +0 -343
  861. package/src/core/event-sourcing.integration.test.ts +0 -191
  862. package/src/core/events/file.test.ts +0 -436
  863. package/src/core/events/memory.test.ts +0 -741
  864. package/src/core/image/image-processor.test.ts +0 -218
  865. package/src/core/image/vips-resizer.test.ts +0 -388
  866. package/src/core/llm/anthropic.test.ts +0 -546
  867. package/src/core/llm/cache-breakpoints.test.ts +0 -85
  868. package/src/core/llm/cache-live.test.ts +0 -155
  869. package/src/core/llm/logger.test.ts +0 -270
  870. package/src/core/llm/message-sanitization.test.ts +0 -217
  871. package/src/core/llm/mock.test.ts +0 -402
  872. package/src/core/llm/model-shortlist-live.test.ts +0 -577
  873. package/src/core/llm/openrouter-mapping.test.ts +0 -234
  874. package/src/core/llm/openrouter.test.ts +0 -499
  875. package/src/core/llm/provider-integration.test.ts +0 -408
  876. package/src/core/llm/reasoning-details.test.ts +0 -177
  877. package/src/core/llm/routing-provider.test.ts +0 -113
  878. package/src/core/llm/snapshot-middleware.test.ts +0 -168
  879. package/src/core/llm/thinking-blocks.test.ts +0 -345
  880. package/src/core/multi-agent.integration.test.ts +0 -340
  881. package/src/core/plugin-hooks.integration.test.ts +0 -568
  882. package/src/core/reasoning-round-trip.integration.test.ts +0 -188
  883. package/src/core/session-lifecycle.integration.test.ts +0 -202
  884. package/src/core/sessions/fork-utils.test.ts +0 -158
  885. package/src/core/sessions/session-overrides.integration.test.ts +0 -210
  886. package/src/core/sessions/session.test.ts +0 -1736
  887. package/src/core/tools/executor.test.ts +0 -161
  888. package/src/lib/logger/console.test.ts +0 -348
  889. package/src/lib/never.ts +0 -3
  890. package/src/lib/utils/concurrency.test.ts +0 -169
  891. package/src/plugins/agent-status/agent-status.test.ts +0 -164
  892. package/src/plugins/agents/agents.integration.test.ts +0 -976
  893. package/src/plugins/agents/supervision.integration.test.ts +0 -249
  894. package/src/plugins/context-compact/compaction-live.test.ts +0 -221
  895. package/src/plugins/context-compact/context-compact.integration.test.ts +0 -418
  896. package/src/plugins/context-compact/context-compactor.test.ts +0 -1036
  897. package/src/plugins/context-compact/history-offloader.test.ts +0 -100
  898. package/src/plugins/filesystem/filesystem.integration.test.ts +0 -529
  899. package/src/plugins/filesystem/schema.ts +0 -6
  900. package/src/plugins/limits-guard/limit-guard.test.ts +0 -253
  901. package/src/plugins/limits-guard/limits-guard.integration.test.ts +0 -1012
  902. package/src/plugins/llm-debug/llm-debug.integration.test.ts +0 -192
  903. package/src/plugins/mailbox/mailbox.integration.test.ts +0 -794
  904. package/src/plugins/resources/resources.integration.test.ts +0 -68
  905. package/src/plugins/result-eviction/result-eviction.integration.test.ts +0 -332
  906. package/src/plugins/services/pid-registry.test.ts +0 -180
  907. package/src/plugins/services/services.integration.test.ts +0 -1223
  908. package/src/plugins/session-lifecycle/session-lifecycle.integration.test.ts +0 -639
  909. package/src/plugins/session-stats/plugin.test.ts +0 -160
  910. package/src/plugins/shell/shell.integration.test.ts +0 -273
  911. package/src/plugins/shell/shell.test.ts +0 -314
  912. package/src/plugins/skills/discovery.test.ts +0 -395
  913. package/src/plugins/skills/skills.integration.test.ts +0 -580
  914. package/src/plugins/todo/todo.integration.test.ts +0 -687
  915. package/src/plugins/uploads/preprocessors/image-classifier.test.ts +0 -142
  916. package/src/plugins/uploads/uploads.integration.test.ts +0 -831
  917. package/src/plugins/user-chat/user-chat.integration.test.ts +0 -893
  918. package/src/plugins/workers/workers.integration.test.ts +0 -778
  919. package/src/prompts/macros.test.ts +0 -107
  920. package/src/testing/test-harness.test.ts +0 -114
  921. package/src/transport/http/routes/rpc.integration.test.ts +0 -243
  922. package/src/transport/http/routes/rpc.test.ts +0 -372
@@ -1,893 +0,0 @@
1
- import { describe, expect, it } from 'bun:test'
2
- import { MockLLMProvider } from '~/core/llm/mock.js'
3
- import { selectPluginState } from '~/core/sessions/reducer.js'
4
- import { ToolCallId } from '~/core/tools/schema.js'
5
- import { createTestPreset, TestHarness } from '~/testing/index.js'
6
- import { userChatEvents, userChatPlugin } from './index.js'
7
- import type { UserChatState } from './plugin.js'
8
-
9
- describe('user-chat plugin', () => {
10
- // =========================================================================
11
- // sendMessage flow
12
- // =========================================================================
13
-
14
- describe('sendMessage flow', () => {
15
- it('sendMessage → agent scheduled → LLM called with user message content', async () => {
16
- const harness = new TestHarness({
17
- presets: [createTestPreset()],
18
- llmProvider: MockLLMProvider.withFixedResponse({ content: 'Ok', toolCalls: [] }),
19
- })
20
-
21
- const session = await harness.createSession('test')
22
- await session.sendAndWaitForIdle('Hello world')
23
-
24
- const lastRequest = harness.llmProvider.getLastRequest()
25
- expect(lastRequest).toBeDefined()
26
- const lastMessage = lastRequest!.messages[lastRequest!.messages.length - 1]
27
- expect(lastMessage.content).toContain('Hello world')
28
-
29
- await harness.shutdown()
30
- })
31
-
32
- it('sendMessage → user_chat_message_received event emitted', async () => {
33
- const harness = new TestHarness({
34
- presets: [createTestPreset()],
35
- llmProvider: MockLLMProvider.withFixedResponse({ content: 'Ok', toolCalls: [] }),
36
- })
37
-
38
- const session = await harness.createSession('test')
39
- await session.sendAndWaitForIdle('Test message')
40
-
41
- const events = await session.getEventsByType('user_chat_message_received')
42
- expect(events).toHaveLength(1)
43
- expect(events[0]).toMatchObject({
44
- type: 'user_chat_message_received',
45
- content: 'Test message',
46
- })
47
-
48
- await harness.shutdown()
49
- })
50
-
51
- it('sendMessage to specific agent (non-entry) via sendMessageToAgent', async () => {
52
- const harness = new TestHarness({
53
- presets: [createTestPreset()],
54
- llmProvider: MockLLMProvider.withFixedResponse({ content: 'Ok', toolCalls: [] }),
55
- })
56
-
57
- const session = await harness.createSession('test')
58
- const entryAgentId = session.getEntryAgentId()!
59
- await session.sendMessageToAgent(entryAgentId, 'Direct message')
60
- await session.waitForIdle()
61
-
62
- const events = await session.getEventsByType('user_chat_message_received')
63
- expect(events).toHaveLength(1)
64
- expect(events[0]).toMatchObject({
65
- agentId: entryAgentId,
66
- content: 'Direct message',
67
- })
68
-
69
- await harness.shutdown()
70
- })
71
-
72
- it('multiple sendMessage calls → all messages appear in conversation history in order', async () => {
73
- const harness = new TestHarness({
74
- presets: [createTestPreset()],
75
- llmProvider: MockLLMProvider.withFixedResponse({ content: 'Ok', toolCalls: [] }),
76
- })
77
-
78
- const session = await harness.createSession('test')
79
- await session.sendAndWaitForIdle('First message')
80
- await session.sendAndWaitForIdle('Second message')
81
-
82
- const events = await session.getEventsByType('user_chat_message_received')
83
- expect(events).toHaveLength(2)
84
- expect(events[0]).toMatchObject({ content: 'First message' })
85
- expect(events[1]).toMatchObject({ content: 'Second message' })
86
-
87
- await harness.shutdown()
88
- })
89
-
90
- it('sendMessage → pending inbound message created and marked consumed after inference', async () => {
91
- const harness = new TestHarness({
92
- presets: [createTestPreset()],
93
- llmProvider: MockLLMProvider.withFixedResponse({ content: 'Ok', toolCalls: [] }),
94
- })
95
-
96
- const session = await harness.createSession('test')
97
- await session.sendAndWaitForIdle('Test')
98
-
99
- // Check consumed event was emitted
100
- const consumedEvents = await session.getEventsByType('user_chat_messages_consumed')
101
- expect(consumedEvents.length).toBeGreaterThanOrEqual(1)
102
-
103
- // After consumption, pending messages should be marked consumed in state
104
- const pendingInbound = selectPluginState<UserChatState>(session.state, 'messages')?.pendingInbound ?? []
105
- const unconsumed = pendingInbound.filter((m) => !m.consumed)
106
- expect(unconsumed).toHaveLength(0)
107
-
108
- await harness.shutdown()
109
- })
110
- })
111
-
112
- // =========================================================================
113
- // tell_user tool
114
- // =========================================================================
115
-
116
- describe('tell_user tool', () => {
117
- it('agent calls tell_user → agentMessage notification emitted', async () => {
118
- const harness = new TestHarness({
119
- presets: [createTestPreset()],
120
- llmProvider: MockLLMProvider.withSequence([
121
- {
122
- toolCalls: [{ id: ToolCallId('tc1'), name: 'tell_user', input: { message: 'Hello user!' } }],
123
- },
124
- { content: 'Done', toolCalls: [] },
125
- ]),
126
- })
127
-
128
- const session = await harness.createSession('test')
129
- await session.sendAndWaitForIdle('Hi')
130
-
131
- const messages = harness.notifications.getAgentMessages()
132
- expect(messages).toHaveLength(1)
133
- expect(messages[0].content).toBe('Hello user!')
134
-
135
- await harness.shutdown()
136
- })
137
-
138
- it('tell_user with format: text → notification has text format', async () => {
139
- const harness = new TestHarness({
140
- presets: [createTestPreset()],
141
- llmProvider: MockLLMProvider.withSequence([
142
- {
143
- toolCalls: [{ id: ToolCallId('tc1'), name: 'tell_user', input: { message: 'Plain text', format: 'text' } }],
144
- },
145
- { content: 'Done', toolCalls: [] },
146
- ]),
147
- })
148
-
149
- const session = await harness.createSession('test')
150
- await session.sendAndWaitForIdle('Hi')
151
-
152
- const messages = harness.notifications.getAgentMessages()
153
- expect(messages).toHaveLength(1)
154
- expect(messages[0].format).toBe('text')
155
-
156
- await harness.shutdown()
157
- })
158
-
159
- it('tell_user with format: markdown → notification has markdown format', async () => {
160
- const harness = new TestHarness({
161
- presets: [createTestPreset()],
162
- llmProvider: MockLLMProvider.withSequence([
163
- {
164
- toolCalls: [{ id: ToolCallId('tc1'), name: 'tell_user', input: { message: '**Bold**', format: 'markdown' } }],
165
- },
166
- { content: 'Done', toolCalls: [] },
167
- ]),
168
- })
169
-
170
- const session = await harness.createSession('test')
171
- await session.sendAndWaitForIdle('Hi')
172
-
173
- const messages = harness.notifications.getAgentMessages()
174
- expect(messages).toHaveLength(1)
175
- expect(messages[0].format).toBe('markdown')
176
-
177
- await harness.shutdown()
178
- })
179
-
180
- it('tell_user → user_message_sent event emitted with correct content', async () => {
181
- const harness = new TestHarness({
182
- presets: [createTestPreset()],
183
- llmProvider: MockLLMProvider.withSequence([
184
- {
185
- toolCalls: [{ id: ToolCallId('tc1'), name: 'tell_user', input: { message: 'Event test' } }],
186
- },
187
- { content: 'Done', toolCalls: [] },
188
- ]),
189
- })
190
-
191
- const session = await harness.createSession('test')
192
- await session.sendAndWaitForIdle('Hi')
193
-
194
- const events = await session.getEventsByType('user_message_sent')
195
- expect(events).toHaveLength(1)
196
- expect(events[0]).toMatchObject({
197
- type: 'user_message_sent',
198
- message: 'Event test',
199
- })
200
-
201
- await harness.shutdown()
202
- })
203
-
204
- it('tell_user → message appears in getMessages result', async () => {
205
- const harness = new TestHarness({
206
- presets: [createTestPreset()],
207
- llmProvider: MockLLMProvider.withSequence([
208
- {
209
- toolCalls: [{ id: ToolCallId('tc1'), name: 'tell_user', input: { message: 'Stored msg' } }],
210
- },
211
- { content: 'Done', toolCalls: [] },
212
- ]),
213
- })
214
-
215
- const session = await harness.createSession('test')
216
- await session.sendAndWaitForIdle('Hi')
217
-
218
- const chatMessages = selectPluginState<UserChatState>(session.state, 'messages')?.messages ?? []
219
- const agentMessages = chatMessages.filter((m) => m.type === 'agent_message')
220
- expect(agentMessages).toHaveLength(1)
221
- expect(agentMessages[0]).toMatchObject({
222
- type: 'agent_message',
223
- content: 'Stored msg',
224
- })
225
-
226
- await harness.shutdown()
227
- })
228
- })
229
-
230
- // =========================================================================
231
- // ask_user tool
232
- // =========================================================================
233
-
234
- describe('ask_user tool', () => {
235
- it('agent calls ask_user (text input) → askUser notification emitted with question', async () => {
236
- const harness = new TestHarness({
237
- presets: [createTestPreset()],
238
- llmProvider: MockLLMProvider.withSequence([
239
- {
240
- toolCalls: [{
241
- id: ToolCallId('tc1'),
242
- name: 'ask_user',
243
- input: { question: 'What is your name?', inputType: 'text' },
244
- }],
245
- },
246
- { content: 'Done', toolCalls: [] },
247
- ]),
248
- })
249
-
250
- const session = await harness.createSession('test')
251
- await session.sendAndWaitForIdle('Hi')
252
-
253
- const askNotifications = harness.notifications.getByType('user-chat', 'askUser')
254
- expect(askNotifications).toHaveLength(1)
255
- expect(askNotifications[0].payload).toMatchObject({
256
- question: 'What is your name?',
257
- inputType: { type: 'text' },
258
- })
259
-
260
- await harness.shutdown()
261
- })
262
-
263
- it('ask_user → user_question_asked event emitted', async () => {
264
- const harness = new TestHarness({
265
- presets: [createTestPreset()],
266
- llmProvider: MockLLMProvider.withSequence([
267
- {
268
- toolCalls: [{
269
- id: ToolCallId('tc1'),
270
- name: 'ask_user',
271
- input: { question: 'Confirm?', inputType: 'confirm' },
272
- }],
273
- },
274
- { content: 'Done', toolCalls: [] },
275
- ]),
276
- })
277
-
278
- const session = await harness.createSession('test')
279
- await session.sendAndWaitForIdle('Hi')
280
-
281
- const events = await session.getEventsByType('user_question_asked')
282
- expect(events).toHaveLength(1)
283
- expect(events[0]).toMatchObject({
284
- type: 'user_question_asked',
285
- question: 'Confirm?',
286
- })
287
-
288
- await harness.shutdown()
289
- })
290
-
291
- it('ask_user with single_choice → notification contains options', async () => {
292
- const harness = new TestHarness({
293
- presets: [createTestPreset()],
294
- llmProvider: MockLLMProvider.withSequence([
295
- {
296
- toolCalls: [{
297
- id: ToolCallId('tc1'),
298
- name: 'ask_user',
299
- input: {
300
- question: 'Pick one',
301
- inputType: 'single_choice',
302
- options: [
303
- { value: 'a', label: 'Option A' },
304
- { value: 'b', label: 'Option B' },
305
- ],
306
- },
307
- }],
308
- },
309
- { content: 'Done', toolCalls: [] },
310
- ]),
311
- })
312
-
313
- const session = await harness.createSession('test')
314
- await session.sendAndWaitForIdle('Hi')
315
-
316
- const askNotifications = harness.notifications.getByType('user-chat', 'askUser')
317
- expect(askNotifications).toHaveLength(1)
318
- expect(askNotifications[0].payload).toMatchObject({
319
- inputType: {
320
- type: 'single_choice',
321
- options: [
322
- { value: 'a', label: 'Option A' },
323
- { value: 'b', label: 'Option B' },
324
- ],
325
- },
326
- })
327
-
328
- await harness.shutdown()
329
- })
330
-
331
- it('ask_user with multi_choice → notification contains options', async () => {
332
- const harness = new TestHarness({
333
- presets: [createTestPreset()],
334
- llmProvider: MockLLMProvider.withSequence([
335
- {
336
- toolCalls: [{
337
- id: ToolCallId('tc1'),
338
- name: 'ask_user',
339
- input: {
340
- question: 'Pick multiple',
341
- inputType: 'multi_choice',
342
- options: [
343
- { value: 'x', label: 'X' },
344
- { value: 'y', label: 'Y' },
345
- ],
346
- },
347
- }],
348
- },
349
- { content: 'Done', toolCalls: [] },
350
- ]),
351
- })
352
-
353
- const session = await harness.createSession('test')
354
- await session.sendAndWaitForIdle('Hi')
355
-
356
- const askNotifications = harness.notifications.getByType('user-chat', 'askUser')
357
- expect(askNotifications).toHaveLength(1)
358
- expect(askNotifications[0].payload).toMatchObject({
359
- inputType: {
360
- type: 'multi_choice',
361
- options: [
362
- { value: 'x', label: 'X' },
363
- { value: 'y', label: 'Y' },
364
- ],
365
- },
366
- })
367
-
368
- await harness.shutdown()
369
- })
370
-
371
- it('ask_user with confirm → notification has confirm type', async () => {
372
- const harness = new TestHarness({
373
- presets: [createTestPreset()],
374
- llmProvider: MockLLMProvider.withSequence([
375
- {
376
- toolCalls: [{
377
- id: ToolCallId('tc1'),
378
- name: 'ask_user',
379
- input: { question: 'Are you sure?', inputType: 'confirm' },
380
- }],
381
- },
382
- { content: 'Done', toolCalls: [] },
383
- ]),
384
- })
385
-
386
- const session = await harness.createSession('test')
387
- await session.sendAndWaitForIdle('Hi')
388
-
389
- const askNotifications = harness.notifications.getByType('user-chat', 'askUser')
390
- expect(askNotifications).toHaveLength(1)
391
- expect(askNotifications[0].payload).toMatchObject({
392
- inputType: { type: 'confirm' },
393
- })
394
-
395
- await harness.shutdown()
396
- })
397
-
398
- it('ask_user with rating → notification has min/max', async () => {
399
- const harness = new TestHarness({
400
- presets: [createTestPreset()],
401
- llmProvider: MockLLMProvider.withSequence([
402
- {
403
- toolCalls: [{
404
- id: ToolCallId('tc1'),
405
- name: 'ask_user',
406
- input: { question: 'Rate this', inputType: 'rating', min: 1, max: 10 },
407
- }],
408
- },
409
- { content: 'Done', toolCalls: [] },
410
- ]),
411
- })
412
-
413
- const session = await harness.createSession('test')
414
- await session.sendAndWaitForIdle('Hi')
415
-
416
- const askNotifications = harness.notifications.getByType('user-chat', 'askUser')
417
- expect(askNotifications).toHaveLength(1)
418
- expect(askNotifications[0].payload).toMatchObject({
419
- inputType: { type: 'rating', min: 1, max: 10 },
420
- })
421
-
422
- await harness.shutdown()
423
- })
424
-
425
- it('answerQuestion → answer delivered → agent sees answer in next inference', async () => {
426
- let inferenceCount = 0
427
- const harness = new TestHarness({
428
- presets: [createTestPreset()],
429
- mockHandler: (request) => {
430
- inferenceCount++
431
- if (inferenceCount === 1) {
432
- return {
433
- content: null,
434
- toolCalls: [{
435
- id: ToolCallId('tc1'),
436
- name: 'ask_user',
437
- input: { question: 'Your name?', inputType: 'text' },
438
- }],
439
- finishReason: 'stop',
440
- metrics: MockLLMProvider.defaultMetrics(),
441
- }
442
- }
443
- if (inferenceCount === 2) {
444
- // After tool result — agent finishes this cycle
445
- return {
446
- content: 'Waiting for answer',
447
- toolCalls: [],
448
- finishReason: 'stop',
449
- metrics: MockLLMProvider.defaultMetrics(),
450
- }
451
- }
452
- // After answer arrives — check the LLM sees it
453
- const lastMessage = request.messages[request.messages.length - 1]
454
- const content = typeof lastMessage.content === 'string' ? lastMessage.content : ''
455
- return {
456
- content: `Got: ${content}`,
457
- toolCalls: [],
458
- finishReason: 'stop',
459
- metrics: MockLLMProvider.defaultMetrics(),
460
- }
461
- },
462
- })
463
-
464
- const session = await harness.createSession('test')
465
- await session.sendAndWaitForIdle('Hi')
466
-
467
- // Find the question event to get the questionId
468
- const questionEvents = await session.getEventsByType(userChatEvents, 'user_question_asked')
469
- expect(questionEvents).toHaveLength(1)
470
- const questionId = questionEvents[0].messageId
471
- const entryAgentId = session.getEntryAgentId()!
472
-
473
- // Answer the question via the new helper
474
- await session.answerQuestion(entryAgentId, questionId, 'John')
475
- await session.waitForIdle()
476
-
477
- // Verify the answer event was emitted
478
- const answerEvents = await session.getEventsByType('user_chat_answer_received')
479
- expect(answerEvents).toHaveLength(1)
480
- expect(answerEvents[0]).toMatchObject({
481
- answerValue: 'John',
482
- })
483
-
484
- // Verify LLM saw the answer (inference count should be > 2)
485
- expect(inferenceCount).toBeGreaterThan(2)
486
-
487
- await harness.shutdown()
488
- })
489
-
490
- it('answerQuestion → user_chat_answer_received event emitted', async () => {
491
- const harness = new TestHarness({
492
- presets: [createTestPreset()],
493
- llmProvider: MockLLMProvider.withSequence([
494
- {
495
- toolCalls: [{
496
- id: ToolCallId('tc1'),
497
- name: 'ask_user',
498
- input: { question: 'Color?', inputType: 'text' },
499
- }],
500
- },
501
- { content: 'Waiting', toolCalls: [] },
502
- { content: 'Got it', toolCalls: [] },
503
- ]),
504
- })
505
-
506
- const session = await harness.createSession('test')
507
- await session.sendAndWaitForIdle('Hi')
508
-
509
- const questionEvents = await session.getEventsByType(userChatEvents, 'user_question_asked')
510
- const questionId = questionEvents[0].messageId
511
- const entryAgentId = session.getEntryAgentId()!
512
-
513
- await session.answerQuestion(entryAgentId, questionId, 'Blue')
514
- await session.waitForIdle()
515
-
516
- const answerEvents = await session.getEventsByType('user_chat_answer_received')
517
- expect(answerEvents).toHaveLength(1)
518
- expect(answerEvents[0]).toMatchObject({
519
- type: 'user_chat_answer_received',
520
- answerValue: 'Blue',
521
- questionId,
522
- })
523
-
524
- await harness.shutdown()
525
- })
526
-
527
- it('answerQuestion → question marked as answered in getMessages', async () => {
528
- const harness = new TestHarness({
529
- presets: [createTestPreset()],
530
- llmProvider: MockLLMProvider.withSequence([
531
- {
532
- toolCalls: [{
533
- id: ToolCallId('tc1'),
534
- name: 'ask_user',
535
- input: { question: 'Ready?', inputType: 'confirm' },
536
- }],
537
- },
538
- { content: 'Waiting', toolCalls: [] },
539
- { content: 'Great', toolCalls: [] },
540
- ]),
541
- })
542
-
543
- const session = await harness.createSession('test')
544
- await session.sendAndWaitForIdle('Hi')
545
-
546
- const questionEvents = await session.getEventsByType(userChatEvents, 'user_question_asked')
547
- const questionId = questionEvents[0].messageId
548
- const entryAgentId = session.getEntryAgentId()!
549
-
550
- await session.answerQuestion(entryAgentId, questionId, true)
551
- await session.waitForIdle()
552
-
553
- // Check messages state
554
- const chatMessages = selectPluginState<UserChatState>(session.state, 'messages')?.messages ?? []
555
- const askMessages = chatMessages.filter((m) => m.type === 'ask_user')
556
- expect(askMessages).toHaveLength(1)
557
- expect(askMessages[0]).toMatchObject({
558
- type: 'ask_user',
559
- answered: true,
560
- answer: true,
561
- })
562
-
563
- await harness.shutdown()
564
- })
565
- })
566
-
567
- // =========================================================================
568
- // Unicode escape decoding (defensive fix for models that double-escape
569
- // non-ASCII in tool argument JSON — see plugin.ts decodeUnicodeEscapes).
570
- // =========================================================================
571
-
572
- describe('unicode escape decoding in user-facing fields', () => {
573
- it('ask_user (text) → literal \\uXXXX in question/placeholder is decoded', async () => {
574
- const harness = new TestHarness({
575
- presets: [createTestPreset()],
576
- llmProvider: MockLLMProvider.withSequence([
577
- {
578
- toolCalls: [{
579
- id: ToolCallId('tc1'),
580
- name: 'ask_user',
581
- input: {
582
- question: 'Pro\\u010d ne?',
583
- inputType: 'text',
584
- placeholder: 'Nap\\u0159. ano',
585
- },
586
- }],
587
- },
588
- { content: 'Done', toolCalls: [] },
589
- ]),
590
- })
591
-
592
- const session = await harness.createSession('test')
593
- await session.sendAndWaitForIdle('Hi')
594
-
595
- const askNotifications = harness.notifications.getByType('user-chat', 'askUser')
596
- expect(askNotifications[0].payload).toMatchObject({
597
- question: 'Proč ne?',
598
- inputType: { type: 'text', placeholder: 'Např. ano' },
599
- })
600
-
601
- await harness.shutdown()
602
- })
603
-
604
- it('ask_user (single_choice) → option labels decoded, values left intact', async () => {
605
- const harness = new TestHarness({
606
- presets: [createTestPreset()],
607
- llmProvider: MockLLMProvider.withSequence([
608
- {
609
- toolCalls: [{
610
- id: ToolCallId('tc1'),
611
- name: 'ask_user',
612
- input: {
613
- question: 'Pick',
614
- inputType: 'single_choice',
615
- options: [
616
- { value: 'kun_ze_\\u0159adu', label: 'K\\u016f\\u0148 ze \\u0159adu' },
617
- ],
618
- },
619
- }],
620
- },
621
- { content: 'Done', toolCalls: [] },
622
- ]),
623
- })
624
-
625
- const session = await harness.createSession('test')
626
- await session.sendAndWaitForIdle('Hi')
627
-
628
- const askNotifications = harness.notifications.getByType('user-chat', 'askUser')
629
- expect(askNotifications[0].payload).toMatchObject({
630
- inputType: {
631
- type: 'single_choice',
632
- // Value preserved verbatim so answer round-trip stays consistent
633
- // with what the LLM emitted.
634
- options: [{ value: 'kun_ze_\\u0159adu', label: 'Kůň ze řadu' }],
635
- },
636
- })
637
-
638
- await harness.shutdown()
639
- })
640
-
641
- it('tell_user → literal \\uXXXX in message is decoded', async () => {
642
- const harness = new TestHarness({
643
- presets: [createTestPreset()],
644
- llmProvider: MockLLMProvider.withSequence([
645
- {
646
- toolCalls: [{
647
- id: ToolCallId('tc1'),
648
- name: 'tell_user',
649
- input: { message: 'Ahoj sv\\u011bte' },
650
- }],
651
- },
652
- { content: 'Done', toolCalls: [] },
653
- ]),
654
- })
655
-
656
- const session = await harness.createSession('test')
657
- await session.sendAndWaitForIdle('Hi')
658
-
659
- const msgs = harness.notifications.getByType('user-chat', 'agentMessage')
660
- expect(msgs[0].payload).toMatchObject({ content: 'Ahoj světe' })
661
-
662
- await harness.shutdown()
663
- })
664
- })
665
-
666
- // =========================================================================
667
- // XML mode
668
- // =========================================================================
669
-
670
- describe('XML mode', () => {
671
- it('agent with userCommunication: xml → <user> tags parsed from response → notification emitted', async () => {
672
- const harness = new TestHarness({
673
- presets: [createTestPreset({
674
- orchestratorPlugins: [
675
- userChatPlugin.configureAgent({ enabled: true, userCommunication: 'xml' }),
676
- ],
677
- })],
678
- llmProvider: MockLLMProvider.withFixedResponse({
679
- content: 'Thinking... <user>Hello from XML!</user> Done.',
680
- toolCalls: [],
681
- }),
682
- })
683
-
684
- const session = await harness.createSession('test')
685
- await session.sendAndWaitForIdle('Hi')
686
-
687
- const messages = harness.notifications.getAgentMessages()
688
- expect(messages).toHaveLength(1)
689
- expect(messages[0].content).toBe('Hello from XML!')
690
-
691
- await harness.shutdown()
692
- })
693
-
694
- it('<user> tags stripped from response content after parsing', async () => {
695
- const harness = new TestHarness({
696
- presets: [createTestPreset({
697
- orchestratorPlugins: [
698
- userChatPlugin.configureAgent({ enabled: true, userCommunication: 'xml' }),
699
- ],
700
- })],
701
- llmProvider: MockLLMProvider.withFixedResponse({
702
- content: 'Before <user>Message</user> After',
703
- toolCalls: [],
704
- }),
705
- })
706
-
707
- const session = await harness.createSession('test')
708
- await session.sendAndWaitForIdle('Hi')
709
-
710
- // The user_message_sent event should have the extracted message
711
- const events = await session.getEventsByType('user_message_sent')
712
- expect(events).toHaveLength(1)
713
- expect(events[0]).toMatchObject({ message: 'Message' })
714
-
715
- await harness.shutdown()
716
- })
717
-
718
- it('agent with userCommunication: both → both tools and <user> tags work', async () => {
719
- const harness = new TestHarness({
720
- presets: [createTestPreset({
721
- orchestratorPlugins: [
722
- userChatPlugin.configureAgent({ enabled: true, userCommunication: 'both' }),
723
- ],
724
- })],
725
- llmProvider: MockLLMProvider.withSequence([
726
- {
727
- content: 'Thinking... <user>XML message!</user> Done.',
728
- toolCalls: [{ id: ToolCallId('tc1'), name: 'tell_user', input: { message: 'Tool message!' } }],
729
- },
730
- { content: 'Finished', toolCalls: [] },
731
- ]),
732
- })
733
-
734
- const session = await harness.createSession('test')
735
- await session.sendAndWaitForIdle('Hi')
736
-
737
- const messages = harness.notifications.getAgentMessages()
738
- expect(messages).toHaveLength(2)
739
- const contents = messages.map((m) => m.content)
740
- expect(contents).toContain('Tool message!')
741
- expect(contents).toContain('XML message!')
742
-
743
- await harness.shutdown()
744
- })
745
-
746
- it('agent with userCommunication: tool (default) → <user> tags ignored', async () => {
747
- const harness = new TestHarness({
748
- presets: [createTestPreset()],
749
- llmProvider: MockLLMProvider.withFixedResponse({
750
- content: 'Response with <user>Should not be parsed</user> content',
751
- toolCalls: [],
752
- }),
753
- })
754
-
755
- const session = await harness.createSession('test')
756
- await session.sendAndWaitForIdle('Hi')
757
-
758
- const messages = harness.notifications.getAgentMessages()
759
- expect(messages).toHaveLength(0)
760
-
761
- await harness.shutdown()
762
- })
763
- })
764
-
765
- // =========================================================================
766
- // getMessages
767
- // =========================================================================
768
-
769
- describe('getMessages', () => {
770
- it('getMessages returns all chat messages (user + agent + ask_user) in order', async () => {
771
- const harness = new TestHarness({
772
- presets: [createTestPreset()],
773
- llmProvider: MockLLMProvider.withSequence([
774
- {
775
- toolCalls: [
776
- { id: ToolCallId('tc1'), name: 'tell_user', input: { message: 'Hello!' } },
777
- { id: ToolCallId('tc2'), name: 'ask_user', input: { question: 'Name?', inputType: 'text' } },
778
- ],
779
- },
780
- { content: 'Done', toolCalls: [] },
781
- ]),
782
- })
783
-
784
- const session = await harness.createSession('test')
785
- await session.sendAndWaitForIdle('Hi')
786
-
787
- const chatMessages = selectPluginState<UserChatState>(session.state, 'messages')?.messages ?? []
788
- // Should have: user_message (from sendMessage), agent_message (from tell_user), ask_user (from ask_user)
789
- expect(chatMessages.length).toBeGreaterThanOrEqual(3)
790
-
791
- const types = chatMessages.map((m) => m.type)
792
- expect(types).toContain('user_message')
793
- expect(types).toContain('agent_message')
794
- expect(types).toContain('ask_user')
795
-
796
- await harness.shutdown()
797
- })
798
-
799
- it('getMessages reflects answered questions', async () => {
800
- const harness = new TestHarness({
801
- presets: [createTestPreset()],
802
- llmProvider: MockLLMProvider.withSequence([
803
- {
804
- toolCalls: [{
805
- id: ToolCallId('tc1'),
806
- name: 'ask_user',
807
- input: { question: 'Favorite color?', inputType: 'text' },
808
- }],
809
- },
810
- { content: 'Waiting', toolCalls: [] },
811
- { content: 'Got it', toolCalls: [] },
812
- ]),
813
- })
814
-
815
- const session = await harness.createSession('test')
816
- await session.sendAndWaitForIdle('Hi')
817
-
818
- // Before answering — question should be unanswered
819
- const beforeMessages = selectPluginState<UserChatState>(session.state, 'messages')?.messages ?? []
820
- const beforeAsk = beforeMessages.filter((m) => m.type === 'ask_user')
821
- expect(beforeAsk).toHaveLength(1)
822
- expect(beforeAsk[0]).toMatchObject({ answered: false })
823
- expect(beforeAsk[0]).not.toHaveProperty('answer')
824
-
825
- // Answer the question
826
- const questionEvents = await session.getEventsByType(userChatEvents, 'user_question_asked')
827
- const questionId = questionEvents[0].messageId
828
- const entryAgentId = session.getEntryAgentId()!
829
-
830
- await session.answerQuestion(entryAgentId, questionId, 'Blue')
831
- await session.waitForIdle()
832
-
833
- // After answering — question should be marked as answered with answer value
834
- const afterMessages = selectPluginState<UserChatState>(session.state, 'messages')?.messages ?? []
835
- const afterAsk = afterMessages.filter((m) => m.type === 'ask_user')
836
- expect(afterAsk).toHaveLength(1)
837
- expect(afterAsk[0]).toMatchObject({
838
- answered: true,
839
- answer: 'Blue',
840
- })
841
-
842
- await harness.shutdown()
843
- })
844
- })
845
-
846
- // =========================================================================
847
- // disabled
848
- // =========================================================================
849
-
850
- describe('disabled', () => {
851
- it('plugin enabled: false → no tools provided to agent', async () => {
852
- const harness = new TestHarness({
853
- presets: [createTestPreset({
854
- plugins: [
855
- userChatPlugin.configure({ enabled: false }),
856
- ],
857
- })],
858
- llmProvider: MockLLMProvider.withFixedResponse({ content: 'Ok', toolCalls: [] }),
859
- })
860
-
861
- const session = await harness.createSession('test')
862
- await session.sendAndWaitForIdle('Hi')
863
-
864
- const lastRequest = harness.llmProvider.getLastRequest()
865
- const toolNames = lastRequest?.tools?.map((t) => t.name) ?? []
866
- expect(toolNames).not.toContain('tell_user')
867
- expect(toolNames).not.toContain('ask_user')
868
-
869
- await harness.shutdown()
870
- })
871
-
872
- it('agent enabled: false → no user-chat tools provided to that agent', async () => {
873
- const harness = new TestHarness({
874
- presets: [createTestPreset({
875
- orchestratorPlugins: [
876
- userChatPlugin.configureAgent({ enabled: false }),
877
- ],
878
- })],
879
- llmProvider: MockLLMProvider.withFixedResponse({ content: 'Ok', toolCalls: [] }),
880
- })
881
-
882
- const session = await harness.createSession('test')
883
- await session.sendAndWaitForIdle('Hi')
884
-
885
- const lastRequest = harness.llmProvider.getLastRequest()
886
- const toolNames = lastRequest?.tools?.map((t) => t.name) ?? []
887
- expect(toolNames).not.toContain('tell_user')
888
- expect(toolNames).not.toContain('ask_user')
889
-
890
- await harness.shutdown()
891
- })
892
- })
893
- })