@roj-ai/sdk 0.1.1 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (493) hide show
  1. package/dist/bootstrap.js +191 -0
  2. package/dist/bootstrap.js.map +1 -0
  3. package/dist/builtin-events.js +8 -0
  4. package/dist/builtin-events.js.map +1 -0
  5. package/dist/bun-platform/fs.js +39 -0
  6. package/dist/bun-platform/fs.js.map +1 -0
  7. package/dist/bun-platform/index.js +18 -0
  8. package/dist/bun-platform/index.js.map +1 -0
  9. package/dist/bun-platform/process.js +21 -0
  10. package/dist/bun-platform/process.js.map +1 -0
  11. package/dist/config.js +54 -0
  12. package/dist/config.js.map +1 -0
  13. package/dist/config.test.js +155 -0
  14. package/dist/config.test.js.map +1 -0
  15. package/dist/core/agent-loop.integration.test.js +414 -0
  16. package/dist/core/agent-loop.integration.test.js.map +1 -0
  17. package/dist/core/agents/agent-config.test.js +194 -0
  18. package/dist/core/agents/agent-config.test.js.map +1 -0
  19. package/dist/core/agents/agent-roles.js +25 -0
  20. package/dist/core/agents/agent-roles.js.map +1 -0
  21. package/dist/core/agents/agent-shutdown.test.js +180 -0
  22. package/dist/core/agents/agent-shutdown.test.js.map +1 -0
  23. package/dist/core/agents/agent.js +1205 -0
  24. package/dist/core/agents/agent.js.map +1 -0
  25. package/dist/core/agents/agent.test.js +313 -0
  26. package/dist/core/agents/agent.test.js.map +1 -0
  27. package/dist/core/agents/communicator.js +13 -0
  28. package/dist/core/agents/communicator.js.map +1 -0
  29. package/dist/core/agents/config.js +5 -0
  30. package/dist/core/agents/config.js.map +1 -0
  31. package/dist/core/agents/context.js +2 -0
  32. package/dist/core/agents/context.js.map +1 -0
  33. package/dist/core/agents/debounce.js +74 -0
  34. package/dist/core/agents/debounce.js.map +1 -0
  35. package/dist/core/agents/handler-events.test.js +115 -0
  36. package/dist/core/agents/handler-events.test.js.map +1 -0
  37. package/dist/core/agents/index.js +2 -0
  38. package/dist/core/agents/index.js.map +1 -0
  39. package/dist/core/agents/response-sanitizer.js +46 -0
  40. package/dist/core/agents/response-sanitizer.js.map +1 -0
  41. package/dist/core/agents/response-sanitizer.test.js +101 -0
  42. package/dist/core/agents/response-sanitizer.test.js.map +1 -0
  43. package/dist/core/agents/retry.js +105 -0
  44. package/dist/core/agents/retry.js.map +1 -0
  45. package/dist/core/agents/schema.js +39 -0
  46. package/dist/core/agents/schema.js.map +1 -0
  47. package/dist/core/agents/state.js +90 -0
  48. package/dist/core/agents/state.js.map +1 -0
  49. package/dist/core/context/state.js +23 -0
  50. package/dist/core/context/state.js.map +1 -0
  51. package/dist/core/errors.js +38 -0
  52. package/dist/core/errors.js.map +1 -0
  53. package/dist/core/event-sourcing.integration.test.js +154 -0
  54. package/dist/core/event-sourcing.integration.test.js.map +1 -0
  55. package/dist/core/events/base-event-store.js +201 -0
  56. package/dist/core/events/base-event-store.js.map +1 -0
  57. package/dist/core/events/event-store.js +26 -0
  58. package/dist/core/events/event-store.js.map +1 -0
  59. package/dist/core/events/file.js +320 -0
  60. package/dist/core/events/file.js.map +1 -0
  61. package/dist/core/events/file.test.js +284 -0
  62. package/dist/core/events/file.test.js.map +1 -0
  63. package/dist/core/events/index.js +3 -0
  64. package/dist/core/events/index.js.map +1 -0
  65. package/dist/core/events/memory.js +101 -0
  66. package/dist/core/events/memory.js.map +1 -0
  67. package/dist/core/events/memory.test.js +502 -0
  68. package/dist/core/events/memory.test.js.map +1 -0
  69. package/dist/core/events/metadata-utils.js +107 -0
  70. package/dist/core/events/metadata-utils.js.map +1 -0
  71. package/dist/core/events/test-helpers.js +15 -0
  72. package/dist/core/events/test-helpers.js.map +1 -0
  73. package/dist/core/events/types.js +21 -0
  74. package/dist/core/events/types.js.map +1 -0
  75. package/dist/core/file-store/file-store.js +250 -0
  76. package/dist/core/file-store/file-store.js.map +1 -0
  77. package/dist/core/file-store/types.js +7 -0
  78. package/dist/core/file-store/types.js.map +1 -0
  79. package/dist/core/image/image-processor.js +106 -0
  80. package/dist/core/image/image-processor.js.map +1 -0
  81. package/dist/core/image/image-processor.test.js +171 -0
  82. package/dist/core/image/image-processor.test.js.map +1 -0
  83. package/dist/core/image/index.js +4 -0
  84. package/dist/core/image/index.js.map +1 -0
  85. package/dist/core/image/noop-resizer.js +6 -0
  86. package/dist/core/image/noop-resizer.js.map +1 -0
  87. package/dist/core/image/types.js +2 -0
  88. package/dist/core/image/types.js.map +1 -0
  89. package/dist/core/image/vips-resizer.js +100 -0
  90. package/dist/core/image/vips-resizer.js.map +1 -0
  91. package/dist/core/image/vips-resizer.test.js +324 -0
  92. package/dist/core/image/vips-resizer.test.js.map +1 -0
  93. package/dist/core/llm/anthropic.js +396 -0
  94. package/dist/core/llm/anthropic.js.map +1 -0
  95. package/dist/core/llm/anthropic.test.js +434 -0
  96. package/dist/core/llm/anthropic.test.js.map +1 -0
  97. package/dist/core/llm/cache-breakpoints.js +37 -0
  98. package/dist/core/llm/cache-breakpoints.js.map +1 -0
  99. package/dist/core/llm/cache-live.test.js +137 -0
  100. package/dist/core/llm/cache-live.test.js.map +1 -0
  101. package/dist/core/llm/index.js +9 -0
  102. package/dist/core/llm/index.js.map +1 -0
  103. package/dist/core/llm/llm-log-types.js +12 -0
  104. package/dist/core/llm/llm-log-types.js.map +1 -0
  105. package/dist/core/llm/logger.js +241 -0
  106. package/dist/core/llm/logger.js.map +1 -0
  107. package/dist/core/llm/logger.test.js +228 -0
  108. package/dist/core/llm/logger.test.js.map +1 -0
  109. package/dist/core/llm/logging-provider.js +49 -0
  110. package/dist/core/llm/logging-provider.js.map +1 -0
  111. package/dist/core/llm/middleware.js +114 -0
  112. package/dist/core/llm/middleware.js.map +1 -0
  113. package/dist/core/llm/mock.js +186 -0
  114. package/dist/core/llm/mock.js.map +1 -0
  115. package/dist/core/llm/mock.test.js +318 -0
  116. package/dist/core/llm/mock.test.js.map +1 -0
  117. package/dist/core/llm/openrouter-mapping.test.js +125 -0
  118. package/dist/core/llm/openrouter-mapping.test.js.map +1 -0
  119. package/dist/core/llm/openrouter.js +298 -0
  120. package/dist/core/llm/openrouter.js.map +1 -0
  121. package/dist/core/llm/openrouter.test.js +377 -0
  122. package/dist/core/llm/openrouter.test.js.map +1 -0
  123. package/dist/core/llm/provider-integration.test.js +350 -0
  124. package/dist/core/llm/provider-integration.test.js.map +1 -0
  125. package/dist/core/llm/provider.js +18 -0
  126. package/dist/core/llm/provider.js.map +1 -0
  127. package/dist/core/llm/routing-provider.js +52 -0
  128. package/dist/core/llm/routing-provider.js.map +1 -0
  129. package/dist/core/llm/routing-provider.test.js +94 -0
  130. package/dist/core/llm/routing-provider.test.js.map +1 -0
  131. package/dist/core/llm/schema.js +31 -0
  132. package/dist/core/llm/schema.js.map +1 -0
  133. package/dist/core/llm/snapshot-fetch.js +122 -0
  134. package/dist/core/llm/snapshot-fetch.js.map +1 -0
  135. package/dist/core/llm/snapshot-middleware.js +142 -0
  136. package/dist/core/llm/snapshot-middleware.js.map +1 -0
  137. package/dist/core/llm/snapshot-middleware.test.js +144 -0
  138. package/dist/core/llm/snapshot-middleware.test.js.map +1 -0
  139. package/dist/core/llm/state.js +48 -0
  140. package/dist/core/llm/state.js.map +1 -0
  141. package/dist/core/llm/tokens.js +40 -0
  142. package/dist/core/llm/tokens.js.map +1 -0
  143. package/dist/core/multi-agent.integration.test.js +298 -0
  144. package/dist/core/multi-agent.integration.test.js.map +1 -0
  145. package/dist/core/plugin-hooks.integration.test.js +344 -0
  146. package/dist/core/plugin-hooks.integration.test.js.map +1 -0
  147. package/dist/core/plugins/hook-types.js +5 -0
  148. package/dist/core/plugins/hook-types.js.map +1 -0
  149. package/dist/core/plugins/index.js +5 -0
  150. package/dist/core/plugins/index.js.map +1 -0
  151. package/dist/core/plugins/plugin-builder.js +321 -0
  152. package/dist/core/plugins/plugin-builder.js.map +1 -0
  153. package/dist/core/preset/config.js +54 -0
  154. package/dist/core/preset/config.js.map +1 -0
  155. package/dist/core/preset/index.js +6 -0
  156. package/dist/core/preset/index.js.map +1 -0
  157. package/dist/core/preset/preset-builder.js +63 -0
  158. package/dist/core/preset/preset-builder.js.map +1 -0
  159. package/dist/core/session-lifecycle.integration.test.js +159 -0
  160. package/dist/core/session-lifecycle.integration.test.js.map +1 -0
  161. package/dist/core/sessions/apply-event.js +41 -0
  162. package/dist/core/sessions/apply-event.js.map +1 -0
  163. package/dist/core/sessions/context.js +2 -0
  164. package/dist/core/sessions/context.js.map +1 -0
  165. package/dist/core/sessions/fork-utils.js +42 -0
  166. package/dist/core/sessions/fork-utils.js.map +1 -0
  167. package/dist/core/sessions/fork-utils.test.js +129 -0
  168. package/dist/core/sessions/fork-utils.test.js.map +1 -0
  169. package/dist/core/sessions/reducer.js +55 -0
  170. package/dist/core/sessions/reducer.js.map +1 -0
  171. package/dist/core/sessions/schema.js +66 -0
  172. package/dist/core/sessions/schema.js.map +1 -0
  173. package/dist/core/sessions/session-environment.js +2 -0
  174. package/dist/core/sessions/session-environment.js.map +1 -0
  175. package/dist/core/sessions/session-manager.js +650 -0
  176. package/dist/core/sessions/session-manager.js.map +1 -0
  177. package/dist/core/sessions/session-store.js +118 -0
  178. package/dist/core/sessions/session-store.js.map +1 -0
  179. package/dist/core/sessions/session.js +675 -0
  180. package/dist/core/sessions/session.js.map +1 -0
  181. package/dist/core/sessions/session.test.js +1095 -0
  182. package/dist/core/sessions/session.test.js.map +1 -0
  183. package/dist/core/sessions/state.js +377 -0
  184. package/dist/core/sessions/state.js.map +1 -0
  185. package/dist/core/system.js +66 -0
  186. package/dist/core/system.js.map +1 -0
  187. package/dist/core/tools/context.js +2 -0
  188. package/dist/core/tools/context.js.map +1 -0
  189. package/dist/core/tools/definition.js +4 -0
  190. package/dist/core/tools/definition.js.map +1 -0
  191. package/dist/core/tools/executor.js +82 -0
  192. package/dist/core/tools/executor.js.map +1 -0
  193. package/dist/core/tools/executor.test.js +143 -0
  194. package/dist/core/tools/executor.test.js.map +1 -0
  195. package/dist/core/tools/index.js +4 -0
  196. package/dist/core/tools/index.js.map +1 -0
  197. package/dist/core/tools/schema.js +20 -0
  198. package/dist/core/tools/schema.js.map +1 -0
  199. package/dist/core/tools/state.js +29 -0
  200. package/dist/core/tools/state.js.map +1 -0
  201. package/dist/index.js +70 -0
  202. package/dist/index.js.map +1 -0
  203. package/dist/lib/json/index.js +5 -0
  204. package/dist/lib/json/index.js.map +1 -0
  205. package/dist/lib/logger/console.js +147 -0
  206. package/dist/lib/logger/console.js.map +1 -0
  207. package/dist/lib/logger/console.test.js +258 -0
  208. package/dist/lib/logger/console.test.js.map +1 -0
  209. package/dist/lib/logger/file.js +54 -0
  210. package/dist/lib/logger/file.js.map +1 -0
  211. package/dist/lib/logger/index.js +4 -0
  212. package/dist/lib/logger/index.js.map +1 -0
  213. package/dist/lib/logger/logger.js +28 -0
  214. package/dist/lib/logger/logger.js.map +1 -0
  215. package/dist/lib/logger/ring-buffer.js +61 -0
  216. package/dist/lib/logger/ring-buffer.js.map +1 -0
  217. package/dist/lib/logger/tee.js +43 -0
  218. package/dist/lib/logger/tee.js.map +1 -0
  219. package/dist/lib/mime.js +22 -0
  220. package/dist/lib/mime.js.map +1 -0
  221. package/dist/lib/never.js +4 -0
  222. package/dist/lib/never.js.map +1 -0
  223. package/dist/lib/utils/hash.js +35 -0
  224. package/dist/lib/utils/hash.js.map +1 -0
  225. package/dist/lib/utils/result.js +21 -0
  226. package/dist/lib/utils/result.js.map +1 -0
  227. package/dist/platform/fs.js +8 -0
  228. package/dist/platform/fs.js.map +1 -0
  229. package/dist/platform/index.js +9 -0
  230. package/dist/platform/index.js.map +1 -0
  231. package/dist/platform/process.js +8 -0
  232. package/dist/platform/process.js.map +1 -0
  233. package/dist/plugins/agent-status/plugin.js +77 -0
  234. package/dist/plugins/agent-status/plugin.js.map +1 -0
  235. package/dist/plugins/agents/agents.integration.test.js +683 -0
  236. package/dist/plugins/agents/agents.integration.test.js.map +1 -0
  237. package/dist/plugins/agents/index.js +2 -0
  238. package/dist/plugins/agents/index.js.map +1 -0
  239. package/dist/plugins/agents/plugin.js +199 -0
  240. package/dist/plugins/agents/plugin.js.map +1 -0
  241. package/dist/plugins/context-compact/context-compact.integration.test.js +174 -0
  242. package/dist/plugins/context-compact/context-compact.integration.test.js.map +1 -0
  243. package/dist/plugins/context-compact/context-compactor.js +238 -0
  244. package/dist/plugins/context-compact/context-compactor.js.map +1 -0
  245. package/dist/plugins/context-compact/context-compactor.test.js +763 -0
  246. package/dist/plugins/context-compact/context-compactor.test.js.map +1 -0
  247. package/dist/plugins/context-compact/history-offloader.js +42 -0
  248. package/dist/plugins/context-compact/history-offloader.js.map +1 -0
  249. package/dist/plugins/context-compact/history-offloader.test.js +77 -0
  250. package/dist/plugins/context-compact/history-offloader.test.js.map +1 -0
  251. package/dist/plugins/context-compact/index.js +4 -0
  252. package/dist/plugins/context-compact/index.js.map +1 -0
  253. package/dist/plugins/context-compact/plugin.js +37 -0
  254. package/dist/plugins/context-compact/plugin.js.map +1 -0
  255. package/dist/plugins/filesystem/filesystem.integration.test.js +411 -0
  256. package/dist/plugins/filesystem/filesystem.integration.test.js.map +1 -0
  257. package/dist/plugins/filesystem/helpers.js +170 -0
  258. package/dist/plugins/filesystem/helpers.js.map +1 -0
  259. package/dist/plugins/filesystem/index.js +3 -0
  260. package/dist/plugins/filesystem/index.js.map +1 -0
  261. package/dist/plugins/filesystem/listing.js +247 -0
  262. package/dist/plugins/filesystem/listing.js.map +1 -0
  263. package/dist/plugins/filesystem/plugin.js +364 -0
  264. package/dist/plugins/filesystem/plugin.js.map +1 -0
  265. package/dist/plugins/filesystem/schema.js +2 -0
  266. package/dist/plugins/filesystem/schema.js.map +1 -0
  267. package/dist/plugins/git-status/index.js +2 -0
  268. package/dist/plugins/git-status/index.js.map +1 -0
  269. package/dist/plugins/git-status/plugin.js +144 -0
  270. package/dist/plugins/git-status/plugin.js.map +1 -0
  271. package/dist/plugins/limits-guard/config.js +5 -0
  272. package/dist/plugins/limits-guard/config.js.map +1 -0
  273. package/dist/plugins/limits-guard/index.js +3 -0
  274. package/dist/plugins/limits-guard/index.js.map +1 -0
  275. package/dist/plugins/limits-guard/limit-guard.js +125 -0
  276. package/dist/plugins/limits-guard/limit-guard.js.map +1 -0
  277. package/dist/plugins/limits-guard/limit-guard.test.js +121 -0
  278. package/dist/plugins/limits-guard/limit-guard.test.js.map +1 -0
  279. package/dist/plugins/limits-guard/limits-guard.integration.test.js +378 -0
  280. package/dist/plugins/limits-guard/limits-guard.integration.test.js.map +1 -0
  281. package/dist/plugins/limits-guard/plugin.js +240 -0
  282. package/dist/plugins/limits-guard/plugin.js.map +1 -0
  283. package/dist/plugins/llm-debug/index.js +2 -0
  284. package/dist/plugins/llm-debug/index.js.map +1 -0
  285. package/dist/plugins/llm-debug/llm-debug.integration.test.js +157 -0
  286. package/dist/plugins/llm-debug/llm-debug.integration.test.js.map +1 -0
  287. package/dist/plugins/llm-debug/plugin.js +148 -0
  288. package/dist/plugins/llm-debug/plugin.js.map +1 -0
  289. package/dist/plugins/logs/index.js +2 -0
  290. package/dist/plugins/logs/index.js.map +1 -0
  291. package/dist/plugins/logs/plugin.js +38 -0
  292. package/dist/plugins/logs/plugin.js.map +1 -0
  293. package/dist/plugins/mailbox/helpers.js +66 -0
  294. package/dist/plugins/mailbox/helpers.js.map +1 -0
  295. package/dist/plugins/mailbox/index.js +9 -0
  296. package/dist/plugins/mailbox/index.js.map +1 -0
  297. package/dist/plugins/mailbox/mailbox.integration.test.js +605 -0
  298. package/dist/plugins/mailbox/mailbox.integration.test.js.map +1 -0
  299. package/dist/plugins/mailbox/plugin.js +204 -0
  300. package/dist/plugins/mailbox/plugin.js.map +1 -0
  301. package/dist/plugins/mailbox/prompts.js +93 -0
  302. package/dist/plugins/mailbox/prompts.js.map +1 -0
  303. package/dist/plugins/mailbox/query.js +38 -0
  304. package/dist/plugins/mailbox/query.js.map +1 -0
  305. package/dist/plugins/mailbox/schema.js +32 -0
  306. package/dist/plugins/mailbox/schema.js.map +1 -0
  307. package/dist/plugins/mailbox/state.js +41 -0
  308. package/dist/plugins/mailbox/state.js.map +1 -0
  309. package/dist/plugins/resources/index.js +4 -0
  310. package/dist/plugins/resources/index.js.map +1 -0
  311. package/dist/plugins/resources/manifest.js +20 -0
  312. package/dist/plugins/resources/manifest.js.map +1 -0
  313. package/dist/plugins/resources/plugin.js +171 -0
  314. package/dist/plugins/resources/plugin.js.map +1 -0
  315. package/dist/plugins/resources/post-inject.js +32 -0
  316. package/dist/plugins/resources/post-inject.js.map +1 -0
  317. package/dist/plugins/resources/state.js +16 -0
  318. package/dist/plugins/resources/state.js.map +1 -0
  319. package/dist/plugins/result-eviction/index.js +2 -0
  320. package/dist/plugins/result-eviction/index.js.map +1 -0
  321. package/dist/plugins/result-eviction/plugin.js +43 -0
  322. package/dist/plugins/result-eviction/plugin.js.map +1 -0
  323. package/dist/plugins/result-eviction/result-eviction.integration.test.js +217 -0
  324. package/dist/plugins/result-eviction/result-eviction.integration.test.js.map +1 -0
  325. package/dist/plugins/services/plugin.js +453 -0
  326. package/dist/plugins/services/plugin.js.map +1 -0
  327. package/dist/plugins/services/port-pool.js +70 -0
  328. package/dist/plugins/services/port-pool.js.map +1 -0
  329. package/dist/plugins/services/prompt.js +40 -0
  330. package/dist/plugins/services/prompt.js.map +1 -0
  331. package/dist/plugins/services/schema.js +9 -0
  332. package/dist/plugins/services/schema.js.map +1 -0
  333. package/dist/plugins/services/service.js +470 -0
  334. package/dist/plugins/services/service.js.map +1 -0
  335. package/dist/plugins/services/services.integration.test.js +485 -0
  336. package/dist/plugins/services/services.integration.test.js.map +1 -0
  337. package/dist/plugins/session-lifecycle/index.js +2 -0
  338. package/dist/plugins/session-lifecycle/index.js.map +1 -0
  339. package/dist/plugins/session-lifecycle/plugin.js +273 -0
  340. package/dist/plugins/session-lifecycle/plugin.js.map +1 -0
  341. package/dist/plugins/session-lifecycle/session-lifecycle.integration.test.js +498 -0
  342. package/dist/plugins/session-lifecycle/session-lifecycle.integration.test.js.map +1 -0
  343. package/dist/plugins/session-state/plugin.js +159 -0
  344. package/dist/plugins/session-state/plugin.js.map +1 -0
  345. package/dist/plugins/session-stats/index.js +3 -0
  346. package/dist/plugins/session-stats/index.js.map +1 -0
  347. package/dist/plugins/session-stats/plugin.js +81 -0
  348. package/dist/plugins/session-stats/plugin.js.map +1 -0
  349. package/dist/plugins/shell/executor.js +339 -0
  350. package/dist/plugins/shell/executor.js.map +1 -0
  351. package/dist/plugins/shell/index.js +6 -0
  352. package/dist/plugins/shell/index.js.map +1 -0
  353. package/dist/plugins/shell/plugin.js +66 -0
  354. package/dist/plugins/shell/plugin.js.map +1 -0
  355. package/dist/plugins/shell/shell.integration.test.js +234 -0
  356. package/dist/plugins/shell/shell.integration.test.js.map +1 -0
  357. package/dist/plugins/shell/shell.test.js +236 -0
  358. package/dist/plugins/shell/shell.test.js.map +1 -0
  359. package/dist/plugins/skills/discovery.js +205 -0
  360. package/dist/plugins/skills/discovery.js.map +1 -0
  361. package/dist/plugins/skills/discovery.test.js +312 -0
  362. package/dist/plugins/skills/discovery.test.js.map +1 -0
  363. package/dist/plugins/skills/index.js +12 -0
  364. package/dist/plugins/skills/index.js.map +1 -0
  365. package/dist/plugins/skills/plugin.js +293 -0
  366. package/dist/plugins/skills/plugin.js.map +1 -0
  367. package/dist/plugins/skills/prompts.js +70 -0
  368. package/dist/plugins/skills/prompts.js.map +1 -0
  369. package/dist/plugins/skills/schema.js +18 -0
  370. package/dist/plugins/skills/schema.js.map +1 -0
  371. package/dist/plugins/skills/skills.integration.test.js +475 -0
  372. package/dist/plugins/skills/skills.integration.test.js.map +1 -0
  373. package/dist/plugins/snapshotting/index.js +3 -0
  374. package/dist/plugins/snapshotting/index.js.map +1 -0
  375. package/dist/plugins/snapshotting/jj-snapshotter.js +106 -0
  376. package/dist/plugins/snapshotting/jj-snapshotter.js.map +1 -0
  377. package/dist/plugins/snapshotting/plugin.js +28 -0
  378. package/dist/plugins/snapshotting/plugin.js.map +1 -0
  379. package/dist/plugins/snapshotting/snapshotter.js +2 -0
  380. package/dist/plugins/snapshotting/snapshotter.js.map +1 -0
  381. package/dist/plugins/todo/index.js +7 -0
  382. package/dist/plugins/todo/index.js.map +1 -0
  383. package/dist/plugins/todo/plugin.js +319 -0
  384. package/dist/plugins/todo/plugin.js.map +1 -0
  385. package/dist/plugins/todo/prompts.js +54 -0
  386. package/dist/plugins/todo/prompts.js.map +1 -0
  387. package/dist/plugins/todo/schema.js +18 -0
  388. package/dist/plugins/todo/schema.js.map +1 -0
  389. package/dist/plugins/todo/todo.integration.test.js +605 -0
  390. package/dist/plugins/todo/todo.integration.test.js.map +1 -0
  391. package/dist/plugins/uploads/index.js +8 -0
  392. package/dist/plugins/uploads/index.js.map +1 -0
  393. package/dist/plugins/uploads/plugin.js +346 -0
  394. package/dist/plugins/uploads/plugin.js.map +1 -0
  395. package/dist/plugins/uploads/preprocessor.js +44 -0
  396. package/dist/plugins/uploads/preprocessor.js.map +1 -0
  397. package/dist/plugins/uploads/preprocessors/image-classifier.js +127 -0
  398. package/dist/plugins/uploads/preprocessors/image-classifier.js.map +1 -0
  399. package/dist/plugins/uploads/preprocessors/index.js +7 -0
  400. package/dist/plugins/uploads/preprocessors/index.js.map +1 -0
  401. package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.js +204 -0
  402. package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.js.map +1 -0
  403. package/dist/plugins/uploads/preprocessors/zip-preprocessor.js +172 -0
  404. package/dist/plugins/uploads/preprocessors/zip-preprocessor.js.map +1 -0
  405. package/dist/plugins/uploads/schema.js +20 -0
  406. package/dist/plugins/uploads/schema.js.map +1 -0
  407. package/dist/plugins/uploads/state.js +22 -0
  408. package/dist/plugins/uploads/state.js.map +1 -0
  409. package/dist/plugins/uploads/uploads.integration.test.js +496 -0
  410. package/dist/plugins/uploads/uploads.integration.test.js.map +1 -0
  411. package/dist/plugins/user-chat/index.js +5 -0
  412. package/dist/plugins/user-chat/index.js.map +1 -0
  413. package/dist/plugins/user-chat/plugin.js +544 -0
  414. package/dist/plugins/user-chat/plugin.js.map +1 -0
  415. package/dist/plugins/user-chat/prompts.js +29 -0
  416. package/dist/plugins/user-chat/prompts.js.map +1 -0
  417. package/dist/plugins/user-chat/schema.js +46 -0
  418. package/dist/plugins/user-chat/schema.js.map +1 -0
  419. package/dist/plugins/user-chat/user-chat.integration.test.js +668 -0
  420. package/dist/plugins/user-chat/user-chat.integration.test.js.map +1 -0
  421. package/dist/plugins/workers/context.js +143 -0
  422. package/dist/plugins/workers/context.js.map +1 -0
  423. package/dist/plugins/workers/definition.js +30 -0
  424. package/dist/plugins/workers/definition.js.map +1 -0
  425. package/dist/plugins/workers/index.js +7 -0
  426. package/dist/plugins/workers/index.js.map +1 -0
  427. package/dist/plugins/workers/plugin.js +578 -0
  428. package/dist/plugins/workers/plugin.js.map +1 -0
  429. package/dist/plugins/workers/worker.js +18 -0
  430. package/dist/plugins/workers/worker.js.map +1 -0
  431. package/dist/plugins/workers/workers.integration.test.js +629 -0
  432. package/dist/plugins/workers/workers.integration.test.js.map +1 -0
  433. package/dist/prompts/base.js +239 -0
  434. package/dist/prompts/base.js.map +1 -0
  435. package/dist/prompts/builder.js +131 -0
  436. package/dist/prompts/builder.js.map +1 -0
  437. package/dist/prompts/index.js +20 -0
  438. package/dist/prompts/index.js.map +1 -0
  439. package/dist/prompts/macros.js +26 -0
  440. package/dist/prompts/macros.js.map +1 -0
  441. package/dist/prompts/macros.test.js +80 -0
  442. package/dist/prompts/macros.test.js.map +1 -0
  443. package/dist/testing/bootstrap-for-testing.js +28 -0
  444. package/dist/testing/bootstrap-for-testing.js.map +1 -0
  445. package/dist/testing/index.js +7 -0
  446. package/dist/testing/index.js.map +1 -0
  447. package/dist/testing/node-platform.js +65 -0
  448. package/dist/testing/node-platform.js.map +1 -0
  449. package/dist/testing/notification-collector.js +82 -0
  450. package/dist/testing/notification-collector.js.map +1 -0
  451. package/dist/testing/preset-helpers.js +37 -0
  452. package/dist/testing/preset-helpers.js.map +1 -0
  453. package/dist/testing/test-harness.js +226 -0
  454. package/dist/testing/test-harness.js.map +1 -0
  455. package/dist/testing/test-harness.test.js +51 -0
  456. package/dist/testing/test-harness.test.js.map +1 -0
  457. package/dist/testing/wait-helpers.js +64 -0
  458. package/dist/testing/wait-helpers.js.map +1 -0
  459. package/dist/transport/adapter/client-adapter.js +64 -0
  460. package/dist/transport/adapter/client-adapter.js.map +1 -0
  461. package/dist/transport/adapter/index.js +24 -0
  462. package/dist/transport/adapter/index.js.map +1 -0
  463. package/dist/transport/adapter/server-adapter.js +73 -0
  464. package/dist/transport/adapter/server-adapter.js.map +1 -0
  465. package/dist/transport/adapter/types.js +8 -0
  466. package/dist/transport/adapter/types.js.map +1 -0
  467. package/dist/transport/http/app.js +86 -0
  468. package/dist/transport/http/app.js.map +1 -0
  469. package/dist/transport/http/index.js +6 -0
  470. package/dist/transport/http/index.js.map +1 -0
  471. package/dist/transport/http/middleware/bearer-auth.js +33 -0
  472. package/dist/transport/http/middleware/bearer-auth.js.map +1 -0
  473. package/dist/transport/http/middleware/error-handler.js +56 -0
  474. package/dist/transport/http/middleware/error-handler.js.map +1 -0
  475. package/dist/transport/http/routes/files.js +237 -0
  476. package/dist/transport/http/routes/files.js.map +1 -0
  477. package/dist/transport/http/routes/resources.js +77 -0
  478. package/dist/transport/http/routes/resources.js.map +1 -0
  479. package/dist/transport/http/routes/rpc.integration.test.js +189 -0
  480. package/dist/transport/http/routes/rpc.integration.test.js.map +1 -0
  481. package/dist/transport/http/routes/rpc.js +110 -0
  482. package/dist/transport/http/routes/rpc.js.map +1 -0
  483. package/dist/transport/http/routes/rpc.test.js +316 -0
  484. package/dist/transport/http/routes/rpc.test.js.map +1 -0
  485. package/dist/transport/http/routes/upload.js +205 -0
  486. package/dist/transport/http/routes/upload.js.map +1 -0
  487. package/dist/transport/rpc/index.js +7 -0
  488. package/dist/transport/rpc/index.js.map +1 -0
  489. package/dist/transport/rpc/methods.js +8 -0
  490. package/dist/transport/rpc/methods.js.map +1 -0
  491. package/dist/user-config.js +14 -0
  492. package/dist/user-config.js.map +1 -0
  493. package/package.json +47 -57
@@ -0,0 +1,171 @@
1
+ import { join, relative } from 'node:path';
2
+ import z from 'zod/v4';
3
+ import { definePlugin } from '../../core/plugins/plugin-builder.js';
4
+ import { Ok } from '../../lib/utils/result.js';
5
+ import { RESOURCE_MANIFEST_FILENAME, ResourceManifestSchema } from './manifest.js';
6
+ import { postInjectRules, } from './post-inject.js';
7
+ import { resourceEvents } from './state.js';
8
+ const MAX_LISTED_PATHS = 100;
9
+ function makeExec(processRunner) {
10
+ return async function exec(cmd, args, options) {
11
+ return processRunner.execFile(cmd, args, {
12
+ timeout: options?.timeout ?? 120_000,
13
+ maxBuffer: 50 * 1024 * 1024,
14
+ cwd: options?.cwd,
15
+ env: options?.env ? { ...process.env, ...options.env } : undefined,
16
+ });
17
+ };
18
+ }
19
+ async function listFiles(fs, dir, maxEntries) {
20
+ const results = [];
21
+ async function walk(current) {
22
+ if (results.length >= maxEntries)
23
+ return;
24
+ const entries = await fs.readdir(current, { withFileTypes: true });
25
+ for (const entry of entries) {
26
+ if (results.length >= maxEntries)
27
+ break;
28
+ const fullPath = join(current, entry.name);
29
+ if (entry.isDirectory()) {
30
+ await walk(fullPath);
31
+ }
32
+ else {
33
+ results.push(relative(dir, fullPath));
34
+ }
35
+ }
36
+ }
37
+ await walk(dir);
38
+ return results;
39
+ }
40
+ export const resourcesPlugin = definePlugin('resources')
41
+ .pluginConfig()
42
+ .events([resourceEvents])
43
+ .state({
44
+ key: 'resources',
45
+ initial: () => ({ resources: [] }),
46
+ reduce: (state, event) => {
47
+ if (event.type === 'resource_injected') {
48
+ const resource = {
49
+ resourceId: event.resourceId,
50
+ slug: event.slug,
51
+ name: event.name,
52
+ filename: event.filename,
53
+ mimeType: event.mimeType,
54
+ paths: event.paths,
55
+ injectedAt: event.injectedAt,
56
+ };
57
+ return { resources: [...state.resources, resource] };
58
+ }
59
+ return state;
60
+ },
61
+ })
62
+ .method('inject', {
63
+ input: z.object({
64
+ sessionId: z.string(),
65
+ filename: z.string(),
66
+ mimeType: z.string(),
67
+ size: z.number(),
68
+ fileBuffer: z.custom(),
69
+ metadata: z.object({
70
+ slug: z.string().optional(),
71
+ name: z.string().optional(),
72
+ }).optional(),
73
+ }),
74
+ output: z.object({
75
+ resourceId: z.string(),
76
+ paths: z.array(z.string()),
77
+ }),
78
+ handler: async (ctx, input) => {
79
+ const fs = ctx.platform.fs;
80
+ const exec = makeExec(ctx.platform.process);
81
+ const targetDir = ctx.pluginConfig?.targetDir ?? ctx.environment.workspaceDir ?? ctx.environment.sessionDir;
82
+ const resourceId = crypto.randomUUID();
83
+ let paths;
84
+ if (input.mimeType === 'application/zip') {
85
+ // Write to temp file, extract, clean up
86
+ const tempPath = join(ctx.environment.sessionDir, `_tmp_resource_${resourceId}.zip`);
87
+ await fs.writeFile(tempPath, input.fileBuffer);
88
+ try {
89
+ await exec('unzip', ['-o', '-q', tempPath, '-d', targetDir]);
90
+ }
91
+ catch (error) {
92
+ const message = error instanceof Error ? error.message : String(error);
93
+ // unzip returns exit code 1 for warnings — still usable
94
+ if (!message.includes('exit code 1')) {
95
+ await fs.unlink(tempPath).catch(() => { });
96
+ throw new Error(`unzip failed: ${message}`);
97
+ }
98
+ }
99
+ await fs.unlink(tempPath).catch(() => { });
100
+ paths = await listFiles(fs, targetDir, MAX_LISTED_PATHS);
101
+ }
102
+ else {
103
+ // Copy file directly to target dir
104
+ const filePath = join(targetDir, input.filename);
105
+ await fs.writeFile(filePath, input.fileBuffer);
106
+ paths = [input.filename];
107
+ }
108
+ let manifest = null;
109
+ if (input.mimeType === 'application/zip') {
110
+ const manifestPath = join(targetDir, RESOURCE_MANIFEST_FILENAME);
111
+ try {
112
+ const raw = await fs.readFile(manifestPath, 'utf-8');
113
+ manifest = ResourceManifestSchema.parse(JSON.parse(raw));
114
+ await fs.unlink(manifestPath).catch(() => { });
115
+ paths = paths.filter((p) => p !== RESOURCE_MANIFEST_FILENAME);
116
+ ctx.logger.info('resources.inject: loaded resource manifest', {
117
+ filename: RESOURCE_MANIFEST_FILENAME,
118
+ postInjectRules: manifest.postInject?.length ?? 0,
119
+ });
120
+ }
121
+ catch (err) {
122
+ const code = err?.code;
123
+ if (code !== 'ENOENT') {
124
+ ctx.logger.warn('resources.inject: invalid resource manifest, skipping', {
125
+ filename: RESOURCE_MANIFEST_FILENAME,
126
+ error: err instanceof Error ? err.message : String(err),
127
+ });
128
+ }
129
+ }
130
+ }
131
+ const postInjectCtx = {
132
+ targetDir,
133
+ sessionDir: ctx.environment.sessionDir,
134
+ paths,
135
+ filename: input.filename,
136
+ mimeType: input.mimeType,
137
+ logger: ctx.logger,
138
+ exec,
139
+ fs,
140
+ };
141
+ if (ctx.pluginConfig?.postInject) {
142
+ await ctx.pluginConfig.postInject(postInjectCtx);
143
+ }
144
+ if (manifest?.postInject && manifest.postInject.length > 0) {
145
+ await postInjectRules(manifest.postInject)(postInjectCtx);
146
+ }
147
+ await ctx.emitEvent(resourceEvents.create('resource_injected', {
148
+ resourceId,
149
+ slug: input.metadata?.slug,
150
+ name: input.metadata?.name,
151
+ filename: input.filename,
152
+ mimeType: input.mimeType,
153
+ paths,
154
+ injectedAt: Date.now(),
155
+ }));
156
+ return Ok({ resourceId, paths });
157
+ },
158
+ })
159
+ .systemPrompt((ctx) => {
160
+ const { resources } = ctx.pluginState;
161
+ if (resources.length === 0)
162
+ return null;
163
+ const targetDir = ctx.pluginConfig?.targetDir ?? ctx.environment.workspaceDir ?? ctx.environment.sessionDir;
164
+ const lines = resources.map(r => {
165
+ const label = r.name ?? r.slug ?? r.filename;
166
+ return `- **${label}** (${r.filename}): ${r.paths.length} files`;
167
+ });
168
+ return `## Injected Resources\n\nThe following resources have been extracted into your workspace (\`${targetDir}\`):\n${lines.join('\n')}\n\nThese files are ready to use. Explore them with the filesystem tools.`;
169
+ })
170
+ .build();
171
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../../src/plugins/resources/plugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { join } from 'node:path';
2
+ export function postInjectRules(rules) {
3
+ return async (ctx) => {
4
+ for (const rule of rules) {
5
+ const cwd = rule.cwd === 'session' ? ctx.sessionDir : ctx.targetDir;
6
+ if (rule.when) {
7
+ const probe = join(cwd, rule.when);
8
+ const exists = await ctx.fs.exists(probe);
9
+ if (!exists)
10
+ continue;
11
+ }
12
+ const label = rule.name ?? rule.run.join(' ');
13
+ ctx.logger.info(`resources.postInject: running "${label}"`, { cwd });
14
+ const [cmd, ...args] = rule.run;
15
+ try {
16
+ await ctx.exec(cmd, args, {
17
+ cwd,
18
+ timeout: rule.timeoutMs ?? 300_000,
19
+ env: rule.env,
20
+ });
21
+ ctx.logger.info(`resources.postInject: "${label}" completed`, { cwd });
22
+ }
23
+ catch (err) {
24
+ const error = err instanceof Error ? err.message : String(err);
25
+ if (rule.continueOnError === false)
26
+ throw err;
27
+ ctx.logger.warn(`resources.postInject: "${label}" failed`, { cwd, error });
28
+ }
29
+ }
30
+ };
31
+ }
32
+ //# sourceMappingURL=post-inject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post-inject.js","sourceRoot":"","sources":["../../../src/plugins/resources/post-inject.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AA4ChC,MAAM,UAAU,eAAe,CAAC,KAAuB;IACtD,OAAO,KAAK,EAAE,GAAG,EAAE,EAAE;QACpB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAA;YAEnE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACf,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;gBAClC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;gBACzC,IAAI,CAAC,MAAM;oBAAE,SAAQ;YACtB,CAAC;YAED,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAC7C,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,kCAAkC,KAAK,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC,CAAA;YAEpE,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAA;YAC/B,IAAI,CAAC;gBACJ,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE;oBACzB,GAAG;oBACH,OAAO,EAAE,IAAI,CAAC,SAAS,IAAI,OAAO;oBAClC,GAAG,EAAE,IAAI,CAAC,GAAG;iBACb,CAAC,CAAA;gBACF,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,0BAA0B,KAAK,aAAa,EAAE,EAAE,GAAG,EAAE,CAAC,CAAA;YACvE,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACd,MAAM,KAAK,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;gBAC9D,IAAI,IAAI,CAAC,eAAe,KAAK,KAAK;oBAAE,MAAM,GAAG,CAAA;gBAC7C,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,0BAA0B,KAAK,UAAU,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAA;YAC3E,CAAC;QACF,CAAC;IACF,CAAC,CAAA;AACF,CAAC"}
@@ -0,0 +1,16 @@
1
+ import z4 from 'zod/v4';
2
+ import { createEventsFactory } from '../../core/events/types';
3
+ export const resourceEvents = createEventsFactory({
4
+ events: {
5
+ resource_injected: z4.object({
6
+ resourceId: z4.string(),
7
+ slug: z4.string().optional(),
8
+ name: z4.string().optional(),
9
+ filename: z4.string(),
10
+ mimeType: z4.string(),
11
+ paths: z4.array(z4.string()),
12
+ injectedAt: z4.number(),
13
+ }),
14
+ },
15
+ });
16
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/plugins/resources/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,QAAQ,CAAA;AACvB,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AAEzD,MAAM,CAAC,MAAM,cAAc,GAAG,mBAAmB,CAAC;IACjD,MAAM,EAAE;QACP,iBAAiB,EAAE,EAAE,CAAC,MAAM,CAAC;YAC5B,UAAU,EAAE,EAAE,CAAC,MAAM,EAAE;YACvB,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAC5B,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAC5B,QAAQ,EAAE,EAAE,CAAC,MAAM,EAAE;YACrB,QAAQ,EAAE,EAAE,CAAC,MAAM,EAAE;YACrB,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;YAC5B,UAAU,EAAE,EAAE,CAAC,MAAM,EAAE;SACvB,CAAC;KACF;CACD,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { resultEvictionPlugin } from './plugin.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/result-eviction/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Result Eviction Plugin - saves large tool outputs to disk
3
+ *
4
+ * When a tool produces output exceeding the token threshold, the full output is saved
5
+ * to a file in the session's .results directory, and a truncated preview with
6
+ * head + tail + file path is returned instead.
7
+ */
8
+ import { truncateByTokens } from '../../core/llm/tokens.js';
9
+ import { definePlugin } from '../../core/plugins/plugin-builder.js';
10
+ const DEFAULT_MAX_TOKENS = 20_000;
11
+ export const resultEvictionPlugin = definePlugin('result-eviction')
12
+ .agentConfig()
13
+ .hook('afterToolCall', async (ctx) => {
14
+ const agentConfig = ctx.pluginAgentConfig;
15
+ const enabled = agentConfig?.enabled !== false;
16
+ if (!enabled || ctx.result.isError) {
17
+ return null;
18
+ }
19
+ const { content } = ctx.result;
20
+ // Only evict string content
21
+ if (typeof content !== 'string') {
22
+ return null;
23
+ }
24
+ const maxTokens = agentConfig?.config?.maxTokens ?? DEFAULT_MAX_TOKENS;
25
+ const truncation = truncateByTokens(content, maxTokens);
26
+ if (!truncation) {
27
+ return null;
28
+ }
29
+ // Write full content to file via FileStore
30
+ const fileName = `${ctx.toolCall.id}.txt`;
31
+ const filePath = `.results/${fileName}`;
32
+ await ctx.files.session.write(filePath, content);
33
+ const truncatedContent = `${truncation.content}\n\n[Full output saved to: ${filePath}]`;
34
+ return {
35
+ action: 'modify',
36
+ result: {
37
+ isError: false,
38
+ content: truncatedContent,
39
+ },
40
+ };
41
+ })
42
+ .build();
43
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../../src/plugins/result-eviction/plugin.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAA;AAc/D,MAAM,kBAAkB,GAAG,MAAM,CAAA;AAEjC,MAAM,CAAC,MAAM,oBAAoB,GAAG,YAAY,CAAC,iBAAiB,CAAC;KACjE,WAAW,EAAuB;KAClC,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;IACpC,MAAM,WAAW,GAAG,GAAG,CAAC,iBAAiB,CAAA;IACzC,MAAM,OAAO,GAAG,WAAW,EAAE,OAAO,KAAK,KAAK,CAAA;IAE9C,IAAI,CAAC,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpC,OAAO,IAAI,CAAA;IACZ,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,MAAM,CAAA;IAE9B,4BAA4B;IAC5B,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QACjC,OAAO,IAAI,CAAA;IACZ,CAAC;IAED,MAAM,SAAS,GAAG,WAAW,EAAE,MAAM,EAAE,SAAS,IAAI,kBAAkB,CAAA;IAEtE,MAAM,UAAU,GAAG,gBAAgB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;IACvD,IAAI,CAAC,UAAU,EAAE,CAAC;QACjB,OAAO,IAAI,CAAA;IACZ,CAAC;IAED,2CAA2C;IAC3C,MAAM,QAAQ,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACzC,MAAM,QAAQ,GAAG,YAAY,QAAQ,EAAE,CAAA;IACvC,MAAM,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IAEhD,MAAM,gBAAgB,GAAG,GAAG,UAAU,CAAC,OAAO,8BAA8B,QAAQ,GAAG,CAAA;IAEvF,OAAO;QACN,MAAM,EAAE,QAAQ;QAChB,MAAM,EAAE;YACP,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,gBAAgB;SACzB;KACD,CAAA;AACF,CAAC,CAAC;KACD,KAAK,EAAE,CAAA"}
@@ -0,0 +1,217 @@
1
+ import { describe, expect, it } from 'bun:test';
2
+ import z from 'zod/v4';
3
+ import { MockLLMProvider } from '../../core/llm/mock.js';
4
+ import { definePlugin } from '../../core/plugins/plugin-builder.js';
5
+ import { createTool } from '../../core/tools/definition.js';
6
+ import { ToolCallId } from '../../core/tools/schema.js';
7
+ import { Ok } from '../../lib/utils/result.js';
8
+ import { createTestPreset, TestHarness } from '../../testing/index.js';
9
+ import { resultEvictionPlugin } from './index.js';
10
+ /**
11
+ * Helper plugin that provides a `generate_output` tool returning a string of given size.
12
+ */
13
+ const bigOutputPlugin = definePlugin('big-output')
14
+ .tools(() => [
15
+ createTool({
16
+ name: 'generate_output',
17
+ description: 'Generate output of a given size',
18
+ input: z.object({ size: z.number() }),
19
+ execute: async (input) => Ok('x'.repeat(input.size)),
20
+ }),
21
+ ])
22
+ .build();
23
+ function createEvictionHarness(options) {
24
+ return new TestHarness({ ...options, systemPlugins: [resultEvictionPlugin, bigOutputPlugin] });
25
+ }
26
+ function createEvictionPreset(overrides) {
27
+ return createTestPreset(overrides);
28
+ }
29
+ describe('result-eviction plugin', () => {
30
+ it('small tool output → returned unchanged', async () => {
31
+ let toolResultContent = null;
32
+ const harness = createEvictionHarness({
33
+ presets: [createEvictionPreset()],
34
+ mockHandler: (request) => {
35
+ const callCount = harness.llmProvider.getCallCount();
36
+ if (callCount === 1) {
37
+ return {
38
+ content: null,
39
+ toolCalls: [{ id: ToolCallId('tc1'), name: 'generate_output', input: { size: 100 } }],
40
+ finishReason: 'stop',
41
+ metrics: MockLLMProvider.defaultMetrics(),
42
+ };
43
+ }
44
+ // Capture the tool result
45
+ for (const msg of request.messages) {
46
+ if (msg.role === 'tool' && typeof msg.content === 'string') {
47
+ toolResultContent = msg.content;
48
+ }
49
+ }
50
+ return { content: 'Done', toolCalls: [], finishReason: 'stop', metrics: MockLLMProvider.defaultMetrics() };
51
+ },
52
+ });
53
+ const session = await harness.createSession('test');
54
+ await session.sendAndWaitForIdle('Generate small output');
55
+ expect(toolResultContent).not.toBeNull();
56
+ // Should be the full output (100 x's), not truncated
57
+ expect(toolResultContent).toBe('x'.repeat(100));
58
+ await harness.shutdown();
59
+ });
60
+ it('large tool output → truncated with file path', async () => {
61
+ let toolResultContent = null;
62
+ const harness = createEvictionHarness({
63
+ presets: [createEvictionPreset()],
64
+ mockHandler: (request) => {
65
+ const callCount = harness.llmProvider.getCallCount();
66
+ if (callCount === 1) {
67
+ return {
68
+ content: null,
69
+ toolCalls: [{ id: ToolCallId('tc1'), name: 'generate_output', input: { size: 250_000 } }],
70
+ finishReason: 'stop',
71
+ metrics: MockLLMProvider.defaultMetrics(),
72
+ };
73
+ }
74
+ for (const msg of request.messages) {
75
+ if (msg.role === 'tool' && typeof msg.content === 'string') {
76
+ toolResultContent = msg.content;
77
+ }
78
+ }
79
+ return { content: 'Done', toolCalls: [], finishReason: 'stop', metrics: MockLLMProvider.defaultMetrics() };
80
+ },
81
+ });
82
+ const session = await harness.createSession('test');
83
+ await session.sendAndWaitForIdle('Generate large output');
84
+ expect(toolResultContent).not.toBeNull();
85
+ expect(toolResultContent).toContain('truncated');
86
+ expect(toolResultContent).toContain('.results/');
87
+ expect(toolResultContent).toContain('Full output saved to:');
88
+ expect(toolResultContent.length).toBeLessThan(250_000);
89
+ await harness.shutdown();
90
+ });
91
+ it('full output saved to .results/<toolCallId>.txt', async () => {
92
+ const harness = createEvictionHarness({
93
+ presets: [createEvictionPreset()],
94
+ llmProvider: MockLLMProvider.withSequence([
95
+ {
96
+ toolCalls: [{ id: ToolCallId('tc1'), name: 'generate_output', input: { size: 250_000 } }],
97
+ },
98
+ { content: 'Done', toolCalls: [] },
99
+ ]),
100
+ });
101
+ const session = await harness.createSession('test');
102
+ await session.sendAndWaitForIdle('Generate large output');
103
+ // Verify the tool_completed event has evicted (truncated) content
104
+ const toolCompletedEvents = await session.getEventsByType('tool_completed');
105
+ expect(toolCompletedEvents.length).toBeGreaterThanOrEqual(1);
106
+ await harness.shutdown();
107
+ });
108
+ it('enabled: false → no eviction even for large output', async () => {
109
+ let toolResultContent = null;
110
+ const harness = createEvictionHarness({
111
+ presets: [createEvictionPreset({
112
+ orchestratorPlugins: [
113
+ resultEvictionPlugin.configureAgent({ enabled: false }),
114
+ ],
115
+ })],
116
+ mockHandler: (request) => {
117
+ const callCount = harness.llmProvider.getCallCount();
118
+ if (callCount === 1) {
119
+ return {
120
+ content: null,
121
+ toolCalls: [{ id: ToolCallId('tc1'), name: 'generate_output', input: { size: 250_000 } }],
122
+ finishReason: 'stop',
123
+ metrics: MockLLMProvider.defaultMetrics(),
124
+ };
125
+ }
126
+ for (const msg of request.messages) {
127
+ if (msg.role === 'tool' && typeof msg.content === 'string') {
128
+ toolResultContent = msg.content;
129
+ }
130
+ }
131
+ return { content: 'Done', toolCalls: [], finishReason: 'stop', metrics: MockLLMProvider.defaultMetrics() };
132
+ },
133
+ });
134
+ const session = await harness.createSession('test');
135
+ await session.sendAndWaitForIdle('Generate large output');
136
+ expect(toolResultContent).not.toBeNull();
137
+ // With eviction disabled, the full output should be returned
138
+ expect(toolResultContent).toBe('x'.repeat(250_000));
139
+ await harness.shutdown();
140
+ });
141
+ it('custom maxTokens respected', async () => {
142
+ let toolResultContent = null;
143
+ const harness = createEvictionHarness({
144
+ presets: [createEvictionPreset({
145
+ orchestratorPlugins: [
146
+ resultEvictionPlugin.configureAgent({ config: { maxTokens: 10 } }),
147
+ ],
148
+ })],
149
+ mockHandler: (request) => {
150
+ const callCount = harness.llmProvider.getCallCount();
151
+ if (callCount === 1) {
152
+ return {
153
+ content: null,
154
+ toolCalls: [{ id: ToolCallId('tc1'), name: 'generate_output', input: { size: 200 } }],
155
+ finishReason: 'stop',
156
+ metrics: MockLLMProvider.defaultMetrics(),
157
+ };
158
+ }
159
+ for (const msg of request.messages) {
160
+ if (msg.role === 'tool' && typeof msg.content === 'string') {
161
+ toolResultContent = msg.content;
162
+ }
163
+ }
164
+ return { content: 'Done', toolCalls: [], finishReason: 'stop', metrics: MockLLMProvider.defaultMetrics() };
165
+ },
166
+ });
167
+ const session = await harness.createSession('test');
168
+ await session.sendAndWaitForIdle('Generate output');
169
+ expect(toolResultContent).not.toBeNull();
170
+ // With maxTokens=10, 200 chars should be evicted
171
+ expect(toolResultContent).toContain('truncated');
172
+ expect(toolResultContent).toContain('.results/');
173
+ await harness.shutdown();
174
+ });
175
+ it('error tool results → not evicted even if large', async () => {
176
+ // Create a plugin with a tool that always errors with large content
177
+ const errorToolPlugin = definePlugin('error-tool')
178
+ .tools(() => [
179
+ createTool({
180
+ name: 'always_error',
181
+ description: 'Always errors with large output',
182
+ input: z.object({}),
183
+ execute: async () => ({ ok: false, error: { message: 'ERROR_CONTENT_' + 'x'.repeat(250_000), recoverable: true } }),
184
+ }),
185
+ ])
186
+ .build();
187
+ let toolResultContent = null;
188
+ const harness = new TestHarness({
189
+ presets: [createEvictionPreset()],
190
+ systemPlugins: [resultEvictionPlugin, errorToolPlugin],
191
+ mockHandler: (request) => {
192
+ const callCount = harness.llmProvider.getCallCount();
193
+ if (callCount === 1) {
194
+ return {
195
+ content: null,
196
+ toolCalls: [{ id: ToolCallId('tc1'), name: 'always_error', input: {} }],
197
+ finishReason: 'stop',
198
+ metrics: MockLLMProvider.defaultMetrics(),
199
+ };
200
+ }
201
+ for (const msg of request.messages) {
202
+ if (msg.role === 'tool' && typeof msg.content === 'string' && msg.content.includes('ERROR_CONTENT_')) {
203
+ toolResultContent = msg.content;
204
+ }
205
+ }
206
+ return { content: 'Done', toolCalls: [], finishReason: 'stop', metrics: MockLLMProvider.defaultMetrics() };
207
+ },
208
+ });
209
+ const session = await harness.createSession('test');
210
+ await session.sendAndWaitForIdle('Try error');
211
+ // Error results should NOT be evicted — so no truncation markers
212
+ expect(toolResultContent).not.toBeNull();
213
+ expect(toolResultContent).not.toContain('Full output saved to:');
214
+ await harness.shutdown();
215
+ });
216
+ });
217
+ //# sourceMappingURL=result-eviction.integration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result-eviction.integration.test.js","sourceRoot":"","sources":["../../../src/plugins/result-eviction/result-eviction.integration.test.ts"],"names":[],"mappings":"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"}