@roj-ai/sdk 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (763) hide show
  1. package/dist/bootstrap.d.ts +453 -0
  2. package/dist/bootstrap.d.ts.map +1 -0
  3. package/dist/builtin-events.d.ts +16 -0
  4. package/dist/builtin-events.d.ts.map +1 -0
  5. package/dist/bun-platform/fs.d.ts +9 -0
  6. package/dist/bun-platform/fs.d.ts.map +1 -0
  7. package/dist/bun-platform/index.d.ts +12 -0
  8. package/dist/bun-platform/index.d.ts.map +1 -0
  9. package/dist/bun-platform/process.d.ts +6 -0
  10. package/dist/bun-platform/process.d.ts.map +1 -0
  11. package/dist/config.d.ts +38 -0
  12. package/dist/config.d.ts.map +1 -0
  13. package/dist/config.test.d.ts +2 -0
  14. package/dist/config.test.d.ts.map +1 -0
  15. package/dist/core/agent-loop.integration.test.d.ts +2 -0
  16. package/dist/core/agent-loop.integration.test.d.ts.map +1 -0
  17. package/dist/core/agents/agent-config.test.d.ts +2 -0
  18. package/dist/core/agents/agent-config.test.d.ts.map +1 -0
  19. package/dist/core/agents/agent-roles.d.ts +33 -0
  20. package/dist/core/agents/agent-roles.d.ts.map +1 -0
  21. package/dist/core/agents/agent-shutdown.test.d.ts +6 -0
  22. package/dist/core/agents/agent-shutdown.test.d.ts.map +1 -0
  23. package/dist/core/agents/agent.d.ts +234 -0
  24. package/dist/core/agents/agent.d.ts.map +1 -0
  25. package/dist/core/agents/agent.test.d.ts +2 -0
  26. package/dist/core/agents/agent.test.d.ts.map +1 -0
  27. package/dist/core/agents/communicator.d.ts +3 -0
  28. package/dist/core/agents/communicator.d.ts.map +1 -0
  29. package/dist/core/agents/config.d.ts +84 -0
  30. package/dist/core/agents/config.d.ts.map +1 -0
  31. package/dist/core/agents/context.d.ts +16 -0
  32. package/dist/core/agents/context.d.ts.map +1 -0
  33. package/dist/core/agents/debounce.d.ts +52 -0
  34. package/dist/core/agents/debounce.d.ts.map +1 -0
  35. package/dist/core/agents/handler-events.test.d.ts +5 -0
  36. package/dist/core/agents/handler-events.test.d.ts.map +1 -0
  37. package/dist/core/agents/index.d.ts +2 -0
  38. package/dist/core/agents/index.d.ts.map +1 -0
  39. package/dist/core/agents/response-sanitizer.d.ts +25 -0
  40. package/dist/core/agents/response-sanitizer.d.ts.map +1 -0
  41. package/dist/core/agents/response-sanitizer.test.d.ts +2 -0
  42. package/dist/core/agents/response-sanitizer.test.d.ts.map +1 -0
  43. package/dist/core/agents/retry.d.ts +40 -0
  44. package/dist/core/agents/retry.d.ts.map +1 -0
  45. package/dist/core/agents/schema.d.ts +57 -0
  46. package/dist/core/agents/schema.d.ts.map +1 -0
  47. package/dist/core/agents/state.d.ts +255 -0
  48. package/dist/core/agents/state.d.ts.map +1 -0
  49. package/dist/core/context/state.d.ts +28 -0
  50. package/dist/core/context/state.d.ts.map +1 -0
  51. package/dist/core/errors.d.ts +29 -0
  52. package/dist/core/errors.d.ts.map +1 -0
  53. package/dist/core/event-sourcing.integration.test.d.ts +2 -0
  54. package/dist/core/event-sourcing.integration.test.d.ts.map +1 -0
  55. package/dist/core/events/base-event-store.d.ts +55 -0
  56. package/dist/core/events/base-event-store.d.ts.map +1 -0
  57. package/dist/core/events/event-store.d.ts +108 -0
  58. package/dist/core/events/event-store.d.ts.map +1 -0
  59. package/dist/core/events/file.d.ts +50 -0
  60. package/dist/core/events/file.d.ts.map +1 -0
  61. package/dist/core/events/file.test.d.ts +2 -0
  62. package/dist/core/events/file.test.d.ts.map +1 -0
  63. package/dist/core/events/index.d.ts +4 -0
  64. package/dist/core/events/index.d.ts.map +1 -0
  65. package/dist/core/events/memory.d.ts +43 -0
  66. package/dist/core/events/memory.d.ts.map +1 -0
  67. package/dist/core/events/memory.test.d.ts +2 -0
  68. package/dist/core/events/memory.test.d.ts.map +1 -0
  69. package/dist/core/events/metadata-utils.d.ts +27 -0
  70. package/dist/core/events/metadata-utils.d.ts.map +1 -0
  71. package/dist/core/events/test-helpers.d.ts +28 -0
  72. package/dist/core/events/test-helpers.d.ts.map +1 -0
  73. package/dist/core/events/types.d.ts +46 -0
  74. package/dist/core/events/types.d.ts.map +1 -0
  75. package/dist/core/file-store/file-store.d.ts +56 -0
  76. package/dist/core/file-store/file-store.d.ts.map +1 -0
  77. package/dist/core/file-store/types.d.ts +50 -0
  78. package/dist/core/file-store/types.d.ts.map +1 -0
  79. package/dist/core/image/image-processor.d.ts +15 -0
  80. package/dist/core/image/image-processor.d.ts.map +1 -0
  81. package/dist/core/image/image-processor.test.d.ts +2 -0
  82. package/dist/core/image/image-processor.test.d.ts.map +1 -0
  83. package/dist/core/image/index.d.ts +5 -0
  84. package/dist/core/image/index.d.ts.map +1 -0
  85. package/dist/core/image/noop-resizer.d.ts +5 -0
  86. package/dist/core/image/noop-resizer.d.ts.map +1 -0
  87. package/dist/core/image/types.d.ts +20 -0
  88. package/dist/core/image/types.d.ts.map +1 -0
  89. package/dist/core/image/vips-resizer.d.ts +21 -0
  90. package/dist/core/image/vips-resizer.d.ts.map +1 -0
  91. package/dist/core/image/vips-resizer.test.d.ts +2 -0
  92. package/dist/core/image/vips-resizer.test.d.ts.map +1 -0
  93. package/dist/core/llm/anthropic.d.ts +51 -0
  94. package/dist/core/llm/anthropic.d.ts.map +1 -0
  95. package/dist/core/llm/anthropic.test.d.ts +2 -0
  96. package/dist/core/llm/anthropic.test.d.ts.map +1 -0
  97. package/dist/core/llm/cache-breakpoints.d.ts +17 -0
  98. package/dist/core/llm/cache-breakpoints.d.ts.map +1 -0
  99. package/dist/core/llm/cache-live.test.d.ts +16 -0
  100. package/dist/core/llm/cache-live.test.d.ts.map +1 -0
  101. package/dist/core/llm/index.d.ts +16 -0
  102. package/dist/core/llm/index.d.ts.map +1 -0
  103. package/dist/core/llm/llm-log-types.d.ts +148 -0
  104. package/dist/core/llm/llm-log-types.d.ts.map +1 -0
  105. package/dist/core/llm/logger.d.ts +74 -0
  106. package/dist/core/llm/logger.d.ts.map +1 -0
  107. package/dist/core/llm/logger.test.d.ts +7 -0
  108. package/dist/core/llm/logger.test.d.ts.map +1 -0
  109. package/dist/core/llm/logging-provider.d.ts +20 -0
  110. package/dist/core/llm/logging-provider.d.ts.map +1 -0
  111. package/dist/core/llm/middleware.d.ts +79 -0
  112. package/dist/core/llm/middleware.d.ts.map +1 -0
  113. package/dist/core/llm/mock.d.ts +79 -0
  114. package/dist/core/llm/mock.d.ts.map +1 -0
  115. package/dist/core/llm/mock.test.d.ts +2 -0
  116. package/dist/core/llm/mock.test.d.ts.map +1 -0
  117. package/dist/core/llm/openrouter-mapping.test.d.ts +2 -0
  118. package/dist/core/llm/openrouter-mapping.test.d.ts.map +1 -0
  119. package/dist/core/llm/openrouter.d.ts +37 -0
  120. package/dist/core/llm/openrouter.d.ts.map +1 -0
  121. package/dist/core/llm/openrouter.test.d.ts +2 -0
  122. package/dist/core/llm/openrouter.test.d.ts.map +1 -0
  123. package/dist/core/llm/provider-integration.test.d.ts +12 -0
  124. package/dist/core/llm/provider-integration.test.d.ts.map +1 -0
  125. package/dist/core/llm/provider.d.ts +175 -0
  126. package/dist/core/llm/provider.d.ts.map +1 -0
  127. package/dist/core/llm/routing-provider.d.ts +31 -0
  128. package/dist/core/llm/routing-provider.d.ts.map +1 -0
  129. package/dist/core/llm/routing-provider.test.d.ts +2 -0
  130. package/dist/core/llm/routing-provider.test.d.ts.map +1 -0
  131. package/dist/core/llm/schema.d.ts +24 -0
  132. package/dist/core/llm/schema.d.ts.map +1 -0
  133. package/dist/core/llm/snapshot-fetch.d.ts +21 -0
  134. package/dist/core/llm/snapshot-fetch.d.ts.map +1 -0
  135. package/dist/core/llm/snapshot-middleware.d.ts +71 -0
  136. package/dist/core/llm/snapshot-middleware.d.ts.map +1 -0
  137. package/dist/core/llm/snapshot-middleware.test.d.ts +2 -0
  138. package/dist/core/llm/snapshot-middleware.test.d.ts.map +1 -0
  139. package/dist/core/llm/state.d.ts +73 -0
  140. package/dist/core/llm/state.d.ts.map +1 -0
  141. package/dist/core/llm/tokens.d.ts +36 -0
  142. package/dist/core/llm/tokens.d.ts.map +1 -0
  143. package/dist/core/multi-agent.integration.test.d.ts +2 -0
  144. package/dist/core/multi-agent.integration.test.d.ts.map +1 -0
  145. package/dist/core/plugin-hooks.integration.test.d.ts +2 -0
  146. package/dist/core/plugin-hooks.integration.test.d.ts.map +1 -0
  147. package/dist/core/plugins/hook-types.d.ts +55 -0
  148. package/dist/core/plugins/hook-types.d.ts.map +1 -0
  149. package/dist/core/plugins/index.d.ts +23 -0
  150. package/dist/core/plugins/index.d.ts.map +1 -0
  151. package/dist/core/plugins/plugin-builder.d.ts +474 -0
  152. package/dist/core/plugins/plugin-builder.d.ts.map +1 -0
  153. package/dist/core/preset/config.d.ts +55 -0
  154. package/dist/core/preset/config.d.ts.map +1 -0
  155. package/dist/core/preset/index.d.ts +8 -0
  156. package/dist/core/preset/index.d.ts.map +1 -0
  157. package/dist/core/preset/preset-builder.d.ts +44 -0
  158. package/dist/core/preset/preset-builder.d.ts.map +1 -0
  159. package/dist/core/session-lifecycle.integration.test.d.ts +2 -0
  160. package/dist/core/session-lifecycle.integration.test.d.ts.map +1 -0
  161. package/dist/core/sessions/apply-event.d.ts +19 -0
  162. package/dist/core/sessions/apply-event.d.ts.map +1 -0
  163. package/dist/core/sessions/context.d.ts +34 -0
  164. package/dist/core/sessions/context.d.ts.map +1 -0
  165. package/dist/core/sessions/fork-utils.d.ts +20 -0
  166. package/dist/core/sessions/fork-utils.d.ts.map +1 -0
  167. package/dist/core/sessions/fork-utils.test.d.ts +2 -0
  168. package/dist/core/sessions/fork-utils.test.d.ts.map +1 -0
  169. package/dist/core/sessions/reducer.d.ts +50 -0
  170. package/dist/core/sessions/reducer.d.ts.map +1 -0
  171. package/dist/core/sessions/schema.d.ts +82 -0
  172. package/dist/core/sessions/schema.d.ts.map +1 -0
  173. package/dist/core/sessions/session-environment.d.ts +13 -0
  174. package/dist/core/sessions/session-environment.d.ts.map +1 -0
  175. package/dist/core/sessions/session-manager.d.ts +183 -0
  176. package/dist/core/sessions/session-manager.d.ts.map +1 -0
  177. package/dist/core/sessions/session-store.d.ts +69 -0
  178. package/dist/core/sessions/session-store.d.ts.map +1 -0
  179. package/dist/core/sessions/session.d.ts +212 -0
  180. package/dist/core/sessions/session.d.ts.map +1 -0
  181. package/dist/core/sessions/session.test.d.ts +2 -0
  182. package/dist/core/sessions/session.test.d.ts.map +1 -0
  183. package/dist/core/sessions/state.d.ts +110 -0
  184. package/dist/core/sessions/state.d.ts.map +1 -0
  185. package/dist/core/system.d.ts +97 -0
  186. package/dist/core/system.d.ts.map +1 -0
  187. package/dist/core/tools/context.d.ts +3 -0
  188. package/dist/core/tools/context.d.ts.map +1 -0
  189. package/dist/core/tools/definition.d.ts +10 -0
  190. package/dist/core/tools/definition.d.ts.map +1 -0
  191. package/dist/core/tools/executor.d.ts +28 -0
  192. package/dist/core/tools/executor.d.ts.map +1 -0
  193. package/dist/core/tools/executor.test.d.ts +2 -0
  194. package/dist/core/tools/executor.test.d.ts.map +1 -0
  195. package/dist/core/tools/index.d.ts +4 -0
  196. package/dist/core/tools/index.d.ts.map +1 -0
  197. package/dist/core/tools/schema.d.ts +61 -0
  198. package/dist/core/tools/schema.d.ts.map +1 -0
  199. package/dist/core/tools/state.d.ts +28 -0
  200. package/dist/core/tools/state.d.ts.map +1 -0
  201. package/dist/index.d.ts +111 -0
  202. package/dist/index.d.ts.map +1 -0
  203. package/dist/lib/json/index.d.ts +17 -0
  204. package/dist/lib/json/index.d.ts.map +1 -0
  205. package/dist/lib/logger/console.d.ts +35 -0
  206. package/dist/lib/logger/console.d.ts.map +1 -0
  207. package/dist/lib/logger/console.test.d.ts +2 -0
  208. package/dist/lib/logger/console.test.d.ts.map +1 -0
  209. package/dist/lib/logger/file.d.ts +20 -0
  210. package/dist/lib/logger/file.d.ts.map +1 -0
  211. package/dist/lib/logger/index.d.ts +5 -0
  212. package/dist/lib/logger/index.d.ts.map +1 -0
  213. package/dist/lib/logger/logger.d.ts +87 -0
  214. package/dist/lib/logger/logger.d.ts.map +1 -0
  215. package/dist/lib/logger/ring-buffer.d.ts +33 -0
  216. package/dist/lib/logger/ring-buffer.d.ts.map +1 -0
  217. package/dist/lib/logger/tee.d.ts +15 -0
  218. package/dist/lib/logger/tee.d.ts.map +1 -0
  219. package/dist/lib/mime.d.ts +9 -0
  220. package/dist/lib/mime.d.ts.map +1 -0
  221. package/dist/lib/never.d.ts +2 -0
  222. package/dist/lib/never.d.ts.map +1 -0
  223. package/dist/lib/utils/hash.d.ts +19 -0
  224. package/dist/lib/utils/hash.d.ts.map +1 -0
  225. package/dist/lib/utils/result.d.ts +26 -0
  226. package/dist/lib/utils/result.d.ts.map +1 -0
  227. package/dist/platform/fs.d.ts +39 -0
  228. package/dist/platform/fs.d.ts.map +1 -0
  229. package/dist/platform/index.d.ts +21 -0
  230. package/dist/platform/index.d.ts.map +1 -0
  231. package/dist/platform/process.d.ts +24 -0
  232. package/dist/platform/process.d.ts.map +1 -0
  233. package/dist/plugins/agent-status/plugin.d.ts +8 -0
  234. package/dist/plugins/agent-status/plugin.d.ts.map +1 -0
  235. package/dist/plugins/agents/agents.integration.test.d.ts +2 -0
  236. package/dist/plugins/agents/agents.integration.test.d.ts.map +1 -0
  237. package/dist/plugins/agents/index.d.ts +3 -0
  238. package/dist/plugins/agents/index.d.ts.map +1 -0
  239. package/dist/plugins/agents/plugin.d.ts +57 -0
  240. package/dist/plugins/agents/plugin.d.ts.map +1 -0
  241. package/dist/plugins/context-compact/context-compact.integration.test.d.ts +2 -0
  242. package/dist/plugins/context-compact/context-compact.integration.test.d.ts.map +1 -0
  243. package/dist/plugins/context-compact/context-compactor.d.ts +88 -0
  244. package/dist/plugins/context-compact/context-compactor.d.ts.map +1 -0
  245. package/dist/plugins/context-compact/context-compactor.test.d.ts +2 -0
  246. package/dist/plugins/context-compact/context-compactor.test.d.ts.map +1 -0
  247. package/dist/plugins/context-compact/history-offloader.d.ts +17 -0
  248. package/dist/plugins/context-compact/history-offloader.d.ts.map +1 -0
  249. package/dist/plugins/context-compact/history-offloader.test.d.ts +2 -0
  250. package/dist/plugins/context-compact/history-offloader.test.d.ts.map +1 -0
  251. package/dist/plugins/context-compact/index.d.ts +4 -0
  252. package/dist/plugins/context-compact/index.d.ts.map +1 -0
  253. package/dist/plugins/context-compact/plugin.d.ts +15 -0
  254. package/dist/plugins/context-compact/plugin.d.ts.map +1 -0
  255. package/dist/plugins/filesystem/filesystem.integration.test.d.ts +2 -0
  256. package/dist/plugins/filesystem/filesystem.integration.test.d.ts.map +1 -0
  257. package/dist/plugins/filesystem/helpers.d.ts +34 -0
  258. package/dist/plugins/filesystem/helpers.d.ts.map +1 -0
  259. package/dist/plugins/filesystem/index.d.ts +5 -0
  260. package/dist/plugins/filesystem/index.d.ts.map +1 -0
  261. package/dist/plugins/filesystem/listing.d.ts +38 -0
  262. package/dist/plugins/filesystem/listing.d.ts.map +1 -0
  263. package/dist/plugins/filesystem/plugin.d.ts +53 -0
  264. package/dist/plugins/filesystem/plugin.d.ts.map +1 -0
  265. package/dist/plugins/filesystem/schema.d.ts +7 -0
  266. package/dist/plugins/filesystem/schema.d.ts.map +1 -0
  267. package/dist/plugins/git-status/index.d.ts +2 -0
  268. package/dist/plugins/git-status/index.d.ts.map +1 -0
  269. package/dist/plugins/git-status/plugin.d.ts +12 -0
  270. package/dist/plugins/git-status/plugin.d.ts.map +1 -0
  271. package/dist/plugins/limits-guard/config.d.ts +23 -0
  272. package/dist/plugins/limits-guard/config.d.ts.map +1 -0
  273. package/dist/plugins/limits-guard/index.d.ts +5 -0
  274. package/dist/plugins/limits-guard/index.d.ts.map +1 -0
  275. package/dist/plugins/limits-guard/limit-guard.d.ts +40 -0
  276. package/dist/plugins/limits-guard/limit-guard.d.ts.map +1 -0
  277. package/dist/plugins/limits-guard/limit-guard.test.d.ts +2 -0
  278. package/dist/plugins/limits-guard/limit-guard.test.d.ts.map +1 -0
  279. package/dist/plugins/limits-guard/limits-guard.integration.test.d.ts +2 -0
  280. package/dist/plugins/limits-guard/limits-guard.integration.test.d.ts.map +1 -0
  281. package/dist/plugins/limits-guard/plugin.d.ts +39 -0
  282. package/dist/plugins/limits-guard/plugin.d.ts.map +1 -0
  283. package/dist/plugins/llm-debug/index.d.ts +2 -0
  284. package/dist/plugins/llm-debug/index.d.ts.map +1 -0
  285. package/dist/plugins/llm-debug/llm-debug.integration.test.d.ts +2 -0
  286. package/dist/plugins/llm-debug/llm-debug.integration.test.d.ts.map +1 -0
  287. package/dist/plugins/llm-debug/plugin.d.ts +31 -0
  288. package/dist/plugins/llm-debug/plugin.d.ts.map +1 -0
  289. package/dist/plugins/logs/index.d.ts +2 -0
  290. package/dist/plugins/logs/index.d.ts.map +1 -0
  291. package/dist/plugins/logs/plugin.d.ts +10 -0
  292. package/dist/plugins/logs/plugin.d.ts.map +1 -0
  293. package/dist/plugins/mailbox/helpers.d.ts +20 -0
  294. package/dist/plugins/mailbox/helpers.d.ts.map +1 -0
  295. package/dist/plugins/mailbox/index.d.ts +9 -0
  296. package/dist/plugins/mailbox/index.d.ts.map +1 -0
  297. package/dist/plugins/mailbox/mailbox.integration.test.d.ts +2 -0
  298. package/dist/plugins/mailbox/mailbox.integration.test.d.ts.map +1 -0
  299. package/dist/plugins/mailbox/plugin.d.ts +31 -0
  300. package/dist/plugins/mailbox/plugin.d.ts.map +1 -0
  301. package/dist/plugins/mailbox/prompts.d.ts +21 -0
  302. package/dist/plugins/mailbox/prompts.d.ts.map +1 -0
  303. package/dist/plugins/mailbox/query.d.ts +33 -0
  304. package/dist/plugins/mailbox/query.d.ts.map +1 -0
  305. package/dist/plugins/mailbox/schema.d.ts +54 -0
  306. package/dist/plugins/mailbox/schema.d.ts.map +1 -0
  307. package/dist/plugins/mailbox/state.d.ts +40 -0
  308. package/dist/plugins/mailbox/state.d.ts.map +1 -0
  309. package/dist/plugins/resources/index.d.ts +7 -0
  310. package/dist/plugins/resources/index.d.ts.map +1 -0
  311. package/dist/plugins/resources/manifest.d.ts +23 -0
  312. package/dist/plugins/resources/manifest.d.ts.map +1 -0
  313. package/dist/plugins/resources/plugin.d.ts +28 -0
  314. package/dist/plugins/resources/plugin.d.ts.map +1 -0
  315. package/dist/plugins/resources/post-inject.d.ts +39 -0
  316. package/dist/plugins/resources/post-inject.d.ts.map +1 -0
  317. package/dist/plugins/resources/state.d.ts +25 -0
  318. package/dist/plugins/resources/state.d.ts.map +1 -0
  319. package/dist/plugins/result-eviction/index.d.ts +3 -0
  320. package/dist/plugins/result-eviction/index.d.ts.map +1 -0
  321. package/dist/plugins/result-eviction/plugin.d.ts +19 -0
  322. package/dist/plugins/result-eviction/plugin.d.ts.map +1 -0
  323. package/dist/plugins/result-eviction/result-eviction.integration.test.d.ts +2 -0
  324. package/dist/plugins/result-eviction/result-eviction.integration.test.d.ts.map +1 -0
  325. package/dist/plugins/services/plugin.d.ts +85 -0
  326. package/dist/plugins/services/plugin.d.ts.map +1 -0
  327. package/dist/plugins/services/port-pool.d.ts +32 -0
  328. package/dist/plugins/services/port-pool.d.ts.map +1 -0
  329. package/dist/plugins/services/prompt.d.ts +13 -0
  330. package/dist/plugins/services/prompt.d.ts.map +1 -0
  331. package/dist/plugins/services/schema.d.ts +70 -0
  332. package/dist/plugins/services/schema.d.ts.map +1 -0
  333. package/dist/plugins/services/service.d.ts +86 -0
  334. package/dist/plugins/services/service.d.ts.map +1 -0
  335. package/dist/plugins/services/services.integration.test.d.ts +2 -0
  336. package/dist/plugins/services/services.integration.test.d.ts.map +1 -0
  337. package/dist/plugins/session-lifecycle/index.d.ts +2 -0
  338. package/dist/plugins/session-lifecycle/index.d.ts.map +1 -0
  339. package/dist/plugins/session-lifecycle/plugin.d.ts +97 -0
  340. package/dist/plugins/session-lifecycle/plugin.d.ts.map +1 -0
  341. package/dist/plugins/session-lifecycle/session-lifecycle.integration.test.d.ts +2 -0
  342. package/dist/plugins/session-lifecycle/session-lifecycle.integration.test.d.ts.map +1 -0
  343. package/dist/plugins/session-state/plugin.d.ts +48 -0
  344. package/dist/plugins/session-state/plugin.d.ts.map +1 -0
  345. package/dist/plugins/session-stats/index.d.ts +4 -0
  346. package/dist/plugins/session-stats/index.d.ts.map +1 -0
  347. package/dist/plugins/session-stats/plugin.d.ts +29 -0
  348. package/dist/plugins/session-stats/plugin.d.ts.map +1 -0
  349. package/dist/plugins/shell/executor.d.ts +78 -0
  350. package/dist/plugins/shell/executor.d.ts.map +1 -0
  351. package/dist/plugins/shell/index.d.ts +6 -0
  352. package/dist/plugins/shell/index.d.ts.map +1 -0
  353. package/dist/plugins/shell/plugin.d.ts +51 -0
  354. package/dist/plugins/shell/plugin.d.ts.map +1 -0
  355. package/dist/plugins/shell/shell.integration.test.d.ts +2 -0
  356. package/dist/plugins/shell/shell.integration.test.d.ts.map +1 -0
  357. package/dist/plugins/shell/shell.test.d.ts +2 -0
  358. package/dist/plugins/shell/shell.test.d.ts.map +1 -0
  359. package/dist/plugins/skills/discovery.d.ts +69 -0
  360. package/dist/plugins/skills/discovery.d.ts.map +1 -0
  361. package/dist/plugins/skills/discovery.test.d.ts +2 -0
  362. package/dist/plugins/skills/discovery.test.d.ts.map +1 -0
  363. package/dist/plugins/skills/index.d.ts +11 -0
  364. package/dist/plugins/skills/index.d.ts.map +1 -0
  365. package/dist/plugins/skills/plugin.d.ts +94 -0
  366. package/dist/plugins/skills/plugin.d.ts.map +1 -0
  367. package/dist/plugins/skills/prompts.d.ts +29 -0
  368. package/dist/plugins/skills/prompts.d.ts.map +1 -0
  369. package/dist/plugins/skills/schema.d.ts +64 -0
  370. package/dist/plugins/skills/schema.d.ts.map +1 -0
  371. package/dist/plugins/skills/skills.integration.test.d.ts +2 -0
  372. package/dist/plugins/skills/skills.integration.test.d.ts.map +1 -0
  373. package/dist/plugins/snapshotting/index.d.ts +4 -0
  374. package/dist/plugins/snapshotting/index.d.ts.map +1 -0
  375. package/dist/plugins/snapshotting/jj-snapshotter.d.ts +27 -0
  376. package/dist/plugins/snapshotting/jj-snapshotter.d.ts.map +1 -0
  377. package/dist/plugins/snapshotting/plugin.d.ts +15 -0
  378. package/dist/plugins/snapshotting/plugin.d.ts.map +1 -0
  379. package/dist/plugins/snapshotting/snapshotter.d.ts +19 -0
  380. package/dist/plugins/snapshotting/snapshotter.d.ts.map +1 -0
  381. package/dist/plugins/todo/index.d.ts +7 -0
  382. package/dist/plugins/todo/index.d.ts.map +1 -0
  383. package/dist/plugins/todo/plugin.d.ts +95 -0
  384. package/dist/plugins/todo/plugin.d.ts.map +1 -0
  385. package/dist/plugins/todo/prompts.d.ts +13 -0
  386. package/dist/plugins/todo/prompts.d.ts.map +1 -0
  387. package/dist/plugins/todo/schema.d.ts +44 -0
  388. package/dist/plugins/todo/schema.d.ts.map +1 -0
  389. package/dist/plugins/todo/todo.integration.test.d.ts +2 -0
  390. package/dist/plugins/todo/todo.integration.test.d.ts.map +1 -0
  391. package/dist/plugins/uploads/index.d.ts +9 -0
  392. package/dist/plugins/uploads/index.d.ts.map +1 -0
  393. package/dist/plugins/uploads/plugin.d.ts +56 -0
  394. package/dist/plugins/uploads/plugin.d.ts.map +1 -0
  395. package/dist/plugins/uploads/preprocessor.d.ts +70 -0
  396. package/dist/plugins/uploads/preprocessor.d.ts.map +1 -0
  397. package/dist/plugins/uploads/preprocessors/image-classifier.d.ts +49 -0
  398. package/dist/plugins/uploads/preprocessors/image-classifier.d.ts.map +1 -0
  399. package/dist/plugins/uploads/preprocessors/index.d.ts +7 -0
  400. package/dist/plugins/uploads/preprocessors/index.d.ts.map +1 -0
  401. package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.d.ts +43 -0
  402. package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.d.ts.map +1 -0
  403. package/dist/plugins/uploads/preprocessors/zip-preprocessor.d.ts +30 -0
  404. package/dist/plugins/uploads/preprocessors/zip-preprocessor.d.ts.map +1 -0
  405. package/dist/plugins/uploads/schema.d.ts +72 -0
  406. package/dist/plugins/uploads/schema.d.ts.map +1 -0
  407. package/dist/plugins/uploads/state.d.ts +38 -0
  408. package/dist/plugins/uploads/state.d.ts.map +1 -0
  409. package/dist/plugins/uploads/uploads.integration.test.d.ts +2 -0
  410. package/dist/plugins/uploads/uploads.integration.test.d.ts.map +1 -0
  411. package/dist/plugins/user-chat/index.d.ts +7 -0
  412. package/dist/plugins/user-chat/index.d.ts.map +1 -0
  413. package/dist/plugins/user-chat/plugin.d.ts +221 -0
  414. package/dist/plugins/user-chat/plugin.d.ts.map +1 -0
  415. package/dist/plugins/user-chat/prompts.d.ts +13 -0
  416. package/dist/plugins/user-chat/prompts.d.ts.map +1 -0
  417. package/dist/plugins/user-chat/schema.d.ts +82 -0
  418. package/dist/plugins/user-chat/schema.d.ts.map +1 -0
  419. package/dist/plugins/user-chat/user-chat.integration.test.d.ts +2 -0
  420. package/dist/plugins/user-chat/user-chat.integration.test.d.ts.map +1 -0
  421. package/dist/plugins/workers/context.d.ts +159 -0
  422. package/dist/plugins/workers/context.d.ts.map +1 -0
  423. package/dist/plugins/workers/definition.d.ts +118 -0
  424. package/dist/plugins/workers/definition.d.ts.map +1 -0
  425. package/dist/plugins/workers/index.d.ts +11 -0
  426. package/dist/plugins/workers/index.d.ts.map +1 -0
  427. package/dist/plugins/workers/plugin.d.ts +125 -0
  428. package/dist/plugins/workers/plugin.d.ts.map +1 -0
  429. package/dist/plugins/workers/worker.d.ts +76 -0
  430. package/dist/plugins/workers/worker.d.ts.map +1 -0
  431. package/dist/plugins/workers/workers.integration.test.d.ts +2 -0
  432. package/dist/plugins/workers/workers.integration.test.d.ts.map +1 -0
  433. package/dist/prompts/base.d.ts +75 -0
  434. package/dist/prompts/base.d.ts.map +1 -0
  435. package/dist/prompts/builder.d.ts +73 -0
  436. package/dist/prompts/builder.d.ts.map +1 -0
  437. package/dist/prompts/index.d.ts +10 -0
  438. package/dist/prompts/index.d.ts.map +1 -0
  439. package/dist/prompts/macros.d.ts +15 -0
  440. package/dist/prompts/macros.d.ts.map +1 -0
  441. package/dist/prompts/macros.test.d.ts +2 -0
  442. package/dist/prompts/macros.test.d.ts.map +1 -0
  443. package/dist/testing/bootstrap-for-testing.d.ts +12 -0
  444. package/dist/testing/bootstrap-for-testing.d.ts.map +1 -0
  445. package/dist/testing/index.d.ts +8 -0
  446. package/dist/testing/index.d.ts.map +1 -0
  447. package/dist/testing/node-platform.d.ts +12 -0
  448. package/dist/testing/node-platform.d.ts.map +1 -0
  449. package/dist/testing/notification-collector.d.ts +46 -0
  450. package/dist/testing/notification-collector.d.ts.map +1 -0
  451. package/dist/testing/preset-helpers.d.ts +28 -0
  452. package/dist/testing/preset-helpers.d.ts.map +1 -0
  453. package/dist/testing/test-harness.d.ts +117 -0
  454. package/dist/testing/test-harness.d.ts.map +1 -0
  455. package/dist/testing/test-harness.test.d.ts +2 -0
  456. package/dist/testing/test-harness.test.d.ts.map +1 -0
  457. package/dist/testing/wait-helpers.d.ts +17 -0
  458. package/dist/testing/wait-helpers.d.ts.map +1 -0
  459. package/dist/transport/adapter/client-adapter.d.ts +32 -0
  460. package/dist/transport/adapter/client-adapter.d.ts.map +1 -0
  461. package/dist/transport/adapter/index.d.ts +23 -0
  462. package/dist/transport/adapter/index.d.ts.map +1 -0
  463. package/dist/transport/adapter/server-adapter.d.ts +29 -0
  464. package/dist/transport/adapter/server-adapter.d.ts.map +1 -0
  465. package/dist/transport/adapter/types.d.ts +14 -0
  466. package/dist/transport/adapter/types.d.ts.map +1 -0
  467. package/dist/transport/http/app.d.ts +41 -0
  468. package/dist/transport/http/app.d.ts.map +1 -0
  469. package/dist/transport/http/index.d.ts +7 -0
  470. package/dist/transport/http/index.d.ts.map +1 -0
  471. package/dist/transport/http/middleware/bearer-auth.d.ts +16 -0
  472. package/dist/transport/http/middleware/bearer-auth.d.ts.map +1 -0
  473. package/dist/transport/http/middleware/error-handler.d.ts +21 -0
  474. package/dist/transport/http/middleware/error-handler.d.ts.map +1 -0
  475. package/dist/transport/http/routes/files.d.ts +16 -0
  476. package/dist/transport/http/routes/files.d.ts.map +1 -0
  477. package/dist/transport/http/routes/resources.d.ts +12 -0
  478. package/dist/transport/http/routes/resources.d.ts.map +1 -0
  479. package/dist/transport/http/routes/rpc.d.ts +22 -0
  480. package/dist/transport/http/routes/rpc.d.ts.map +1 -0
  481. package/dist/transport/http/routes/rpc.integration.test.d.ts +2 -0
  482. package/dist/transport/http/routes/rpc.integration.test.d.ts.map +1 -0
  483. package/dist/transport/http/routes/rpc.test.d.ts +2 -0
  484. package/dist/transport/http/routes/rpc.test.d.ts.map +1 -0
  485. package/dist/transport/http/routes/upload.d.ts +14 -0
  486. package/dist/transport/http/routes/upload.d.ts.map +1 -0
  487. package/dist/transport/rpc/index.d.ts +8 -0
  488. package/dist/transport/rpc/index.d.ts.map +1 -0
  489. package/dist/transport/rpc/methods.d.ts +25 -0
  490. package/dist/transport/rpc/methods.d.ts.map +1 -0
  491. package/dist/user-config.d.ts +29 -0
  492. package/dist/user-config.d.ts.map +1 -0
  493. package/package.json +154 -0
  494. package/src/bootstrap.ts +268 -0
  495. package/src/builtin-events.ts +25 -0
  496. package/src/bun-platform/fs.ts +50 -0
  497. package/src/bun-platform/index.ts +21 -0
  498. package/src/bun-platform/process.ts +25 -0
  499. package/src/config.test.ts +174 -0
  500. package/src/config.ts +103 -0
  501. package/src/core/agent-loop.integration.test.ts +503 -0
  502. package/src/core/agents/agent-config.test.ts +240 -0
  503. package/src/core/agents/agent-roles.ts +41 -0
  504. package/src/core/agents/agent-shutdown.test.ts +236 -0
  505. package/src/core/agents/agent.test.ts +387 -0
  506. package/src/core/agents/agent.ts +1472 -0
  507. package/src/core/agents/communicator.ts +16 -0
  508. package/src/core/agents/config.ts +98 -0
  509. package/src/core/agents/context.ts +19 -0
  510. package/src/core/agents/debounce.ts +116 -0
  511. package/src/core/agents/handler-events.test.ts +167 -0
  512. package/src/core/agents/index.ts +1 -0
  513. package/src/core/agents/response-sanitizer.test.ts +137 -0
  514. package/src/core/agents/response-sanitizer.ts +67 -0
  515. package/src/core/agents/retry.ts +164 -0
  516. package/src/core/agents/schema.ts +75 -0
  517. package/src/core/agents/state.ts +272 -0
  518. package/src/core/context/state.ts +38 -0
  519. package/src/core/errors.ts +55 -0
  520. package/src/core/event-sourcing.integration.test.ts +191 -0
  521. package/src/core/events/base-event-store.ts +264 -0
  522. package/src/core/events/event-store.ts +143 -0
  523. package/src/core/events/file.test.ts +436 -0
  524. package/src/core/events/file.ts +372 -0
  525. package/src/core/events/index.ts +3 -0
  526. package/src/core/events/memory.test.ts +741 -0
  527. package/src/core/events/memory.ts +131 -0
  528. package/src/core/events/metadata-utils.ts +133 -0
  529. package/src/core/events/test-helpers.ts +31 -0
  530. package/src/core/events/types.ts +64 -0
  531. package/src/core/file-store/file-store.ts +275 -0
  532. package/src/core/file-store/types.ts +52 -0
  533. package/src/core/image/image-processor.test.ts +218 -0
  534. package/src/core/image/image-processor.ts +127 -0
  535. package/src/core/image/index.ts +4 -0
  536. package/src/core/image/noop-resizer.ts +7 -0
  537. package/src/core/image/types.ts +24 -0
  538. package/src/core/image/vips-resizer.test.ts +377 -0
  539. package/src/core/image/vips-resizer.ts +124 -0
  540. package/src/core/llm/__snapshots__/anthropic-assistant-text-with-tool-calls.json +156 -0
  541. package/src/core/llm/__snapshots__/anthropic-consecutive-tool-results.json +152 -0
  542. package/src/core/llm/__snapshots__/anthropic-image-data-url.json +105 -0
  543. package/src/core/llm/__snapshots__/anthropic-image-http-url.json +104 -0
  544. package/src/core/llm/__snapshots__/anthropic-multiple-images.json +113 -0
  545. package/src/core/llm/__snapshots__/anthropic-multiple-tool-calls-requested.json +151 -0
  546. package/src/core/llm/__snapshots__/anthropic-simple-user-message.json +97 -0
  547. package/src/core/llm/__snapshots__/anthropic-system-message-in-conversation.json +119 -0
  548. package/src/core/llm/__snapshots__/anthropic-tool-call.json +123 -0
  549. package/src/core/llm/__snapshots__/anthropic-tool-error-result.json +139 -0
  550. package/src/core/llm/__snapshots__/anthropic-tool-result-with-image.json +152 -0
  551. package/src/core/llm/__snapshots__/anthropic-tool-roundtrip.json +139 -0
  552. package/src/core/llm/__snapshots__/openrouter-assistant-text-with-tool-calls.json +150 -0
  553. package/src/core/llm/__snapshots__/openrouter-consecutive-tool-results.json +150 -0
  554. package/src/core/llm/__snapshots__/openrouter-image-data-url.json +107 -0
  555. package/src/core/llm/__snapshots__/openrouter-image-http-url.json +107 -0
  556. package/src/core/llm/__snapshots__/openrouter-multiple-images.json +113 -0
  557. package/src/core/llm/__snapshots__/openrouter-multiple-tool-calls-requested.json +158 -0
  558. package/src/core/llm/__snapshots__/openrouter-simple-user-message.json +96 -0
  559. package/src/core/llm/__snapshots__/openrouter-system-message-in-conversation.json +108 -0
  560. package/src/core/llm/__snapshots__/openrouter-tool-call.json +129 -0
  561. package/src/core/llm/__snapshots__/openrouter-tool-error-result.json +137 -0
  562. package/src/core/llm/__snapshots__/openrouter-tool-result-with-image.json +148 -0
  563. package/src/core/llm/__snapshots__/openrouter-tool-roundtrip.json +137 -0
  564. package/src/core/llm/anthropic.test.ts +509 -0
  565. package/src/core/llm/anthropic.ts +578 -0
  566. package/src/core/llm/cache-breakpoints.ts +38 -0
  567. package/src/core/llm/cache-live.test.ts +155 -0
  568. package/src/core/llm/index.ts +30 -0
  569. package/src/core/llm/llm-log-types.ts +167 -0
  570. package/src/core/llm/logger.test.ts +270 -0
  571. package/src/core/llm/logger.ts +306 -0
  572. package/src/core/llm/logging-provider.ts +73 -0
  573. package/src/core/llm/middleware.ts +172 -0
  574. package/src/core/llm/mock.test.ts +402 -0
  575. package/src/core/llm/mock.ts +234 -0
  576. package/src/core/llm/openrouter-mapping.test.ts +153 -0
  577. package/src/core/llm/openrouter.test.ts +499 -0
  578. package/src/core/llm/openrouter.ts +458 -0
  579. package/src/core/llm/provider-integration.test.ts +408 -0
  580. package/src/core/llm/provider.ts +238 -0
  581. package/src/core/llm/routing-provider.test.ts +113 -0
  582. package/src/core/llm/routing-provider.ts +86 -0
  583. package/src/core/llm/schema.ts +47 -0
  584. package/src/core/llm/snapshot-fetch.ts +158 -0
  585. package/src/core/llm/snapshot-middleware.test.ts +168 -0
  586. package/src/core/llm/snapshot-middleware.ts +185 -0
  587. package/src/core/llm/state.ts +92 -0
  588. package/src/core/llm/tokens.ts +61 -0
  589. package/src/core/multi-agent.integration.test.ts +340 -0
  590. package/src/core/plugin-hooks.integration.test.ts +428 -0
  591. package/src/core/plugins/hook-types.ts +49 -0
  592. package/src/core/plugins/index.ts +52 -0
  593. package/src/core/plugins/plugin-builder.ts +967 -0
  594. package/src/core/preset/config.ts +110 -0
  595. package/src/core/preset/index.ts +11 -0
  596. package/src/core/preset/preset-builder.ts +111 -0
  597. package/src/core/session-lifecycle.integration.test.ts +202 -0
  598. package/src/core/sessions/apply-event.ts +46 -0
  599. package/src/core/sessions/context.ts +36 -0
  600. package/src/core/sessions/fork-utils.test.ts +158 -0
  601. package/src/core/sessions/fork-utils.ts +71 -0
  602. package/src/core/sessions/reducer.ts +95 -0
  603. package/src/core/sessions/schema.ts +91 -0
  604. package/src/core/sessions/session-environment.ts +12 -0
  605. package/src/core/sessions/session-manager.ts +883 -0
  606. package/src/core/sessions/session-store.ts +141 -0
  607. package/src/core/sessions/session.test.ts +1730 -0
  608. package/src/core/sessions/session.ts +833 -0
  609. package/src/core/sessions/state.ts +520 -0
  610. package/src/core/system.ts +206 -0
  611. package/src/core/tools/context.ts +3 -0
  612. package/src/core/tools/definition.ts +15 -0
  613. package/src/core/tools/executor.test.ts +160 -0
  614. package/src/core/tools/executor.ts +117 -0
  615. package/src/core/tools/index.ts +3 -0
  616. package/src/core/tools/schema.ts +80 -0
  617. package/src/core/tools/state.ts +34 -0
  618. package/src/index.ts +165 -0
  619. package/src/lib/json/index.ts +20 -0
  620. package/src/lib/logger/console.test.ts +348 -0
  621. package/src/lib/logger/console.ts +185 -0
  622. package/src/lib/logger/file.ts +65 -0
  623. package/src/lib/logger/index.ts +4 -0
  624. package/src/lib/logger/logger.ts +114 -0
  625. package/src/lib/logger/ring-buffer.ts +65 -0
  626. package/src/lib/logger/tee.ts +51 -0
  627. package/src/lib/mime.ts +23 -0
  628. package/src/lib/never.ts +3 -0
  629. package/src/lib/utils/hash.ts +38 -0
  630. package/src/lib/utils/result.ts +35 -0
  631. package/src/platform/fs.ts +38 -0
  632. package/src/platform/index.ts +23 -0
  633. package/src/platform/process.ts +28 -0
  634. package/src/plugins/agent-status/plugin.ts +77 -0
  635. package/src/plugins/agents/agents.integration.test.ts +808 -0
  636. package/src/plugins/agents/index.ts +2 -0
  637. package/src/plugins/agents/plugin.ts +242 -0
  638. package/src/plugins/context-compact/context-compact.integration.test.ts +207 -0
  639. package/src/plugins/context-compact/context-compactor.test.ts +923 -0
  640. package/src/plugins/context-compact/context-compactor.ts +343 -0
  641. package/src/plugins/context-compact/history-offloader.test.ts +100 -0
  642. package/src/plugins/context-compact/history-offloader.ts +47 -0
  643. package/src/plugins/context-compact/index.ts +3 -0
  644. package/src/plugins/context-compact/plugin.ts +62 -0
  645. package/src/plugins/filesystem/filesystem.integration.test.ts +485 -0
  646. package/src/plugins/filesystem/helpers.ts +216 -0
  647. package/src/plugins/filesystem/index.ts +4 -0
  648. package/src/plugins/filesystem/listing.ts +276 -0
  649. package/src/plugins/filesystem/plugin.ts +468 -0
  650. package/src/plugins/filesystem/schema.ts +6 -0
  651. package/src/plugins/git-status/index.ts +1 -0
  652. package/src/plugins/git-status/plugin.ts +166 -0
  653. package/src/plugins/limits-guard/config.ts +26 -0
  654. package/src/plugins/limits-guard/index.ts +4 -0
  655. package/src/plugins/limits-guard/limit-guard.test.ts +161 -0
  656. package/src/plugins/limits-guard/limit-guard.ts +164 -0
  657. package/src/plugins/limits-guard/limits-guard.integration.test.ts +437 -0
  658. package/src/plugins/limits-guard/plugin.ts +306 -0
  659. package/src/plugins/llm-debug/index.ts +1 -0
  660. package/src/plugins/llm-debug/llm-debug.integration.test.ts +192 -0
  661. package/src/plugins/llm-debug/plugin.ts +172 -0
  662. package/src/plugins/logs/index.ts +1 -0
  663. package/src/plugins/logs/plugin.ts +39 -0
  664. package/src/plugins/mailbox/helpers.ts +83 -0
  665. package/src/plugins/mailbox/index.ts +13 -0
  666. package/src/plugins/mailbox/mailbox.integration.test.ts +705 -0
  667. package/src/plugins/mailbox/plugin.ts +270 -0
  668. package/src/plugins/mailbox/prompts.ts +104 -0
  669. package/src/plugins/mailbox/query.ts +53 -0
  670. package/src/plugins/mailbox/schema.ts +81 -0
  671. package/src/plugins/mailbox/state.ts +52 -0
  672. package/src/plugins/resources/index.ts +11 -0
  673. package/src/plugins/resources/manifest.ts +25 -0
  674. package/src/plugins/resources/plugin.ts +201 -0
  675. package/src/plugins/resources/post-inject.ts +74 -0
  676. package/src/plugins/resources/state.ts +30 -0
  677. package/src/plugins/result-eviction/index.ts +2 -0
  678. package/src/plugins/result-eviction/plugin.ts +65 -0
  679. package/src/plugins/result-eviction/result-eviction.integration.test.ts +244 -0
  680. package/src/plugins/services/plugin.ts +485 -0
  681. package/src/plugins/services/port-pool.ts +73 -0
  682. package/src/plugins/services/prompt.ts +53 -0
  683. package/src/plugins/services/schema.ts +83 -0
  684. package/src/plugins/services/service.ts +578 -0
  685. package/src/plugins/services/services.integration.test.ts +595 -0
  686. package/src/plugins/session-lifecycle/index.ts +1 -0
  687. package/src/plugins/session-lifecycle/plugin.ts +302 -0
  688. package/src/plugins/session-lifecycle/session-lifecycle.integration.test.ts +639 -0
  689. package/src/plugins/session-state/plugin.ts +179 -0
  690. package/src/plugins/session-stats/index.ts +3 -0
  691. package/src/plugins/session-stats/plugin.ts +120 -0
  692. package/src/plugins/shell/executor.ts +462 -0
  693. package/src/plugins/shell/index.ts +23 -0
  694. package/src/plugins/shell/plugin.ts +118 -0
  695. package/src/plugins/shell/shell.integration.test.ts +273 -0
  696. package/src/plugins/shell/shell.test.ts +314 -0
  697. package/src/plugins/skills/discovery.test.ts +395 -0
  698. package/src/plugins/skills/discovery.ts +276 -0
  699. package/src/plugins/skills/index.ts +32 -0
  700. package/src/plugins/skills/plugin.ts +381 -0
  701. package/src/plugins/skills/prompts.ts +84 -0
  702. package/src/plugins/skills/schema.ts +88 -0
  703. package/src/plugins/skills/skills.integration.test.ts +580 -0
  704. package/src/plugins/snapshotting/index.ts +3 -0
  705. package/src/plugins/snapshotting/jj-snapshotter.ts +122 -0
  706. package/src/plugins/snapshotting/plugin.ts +36 -0
  707. package/src/plugins/snapshotting/snapshotter.ts +20 -0
  708. package/src/plugins/todo/index.ts +11 -0
  709. package/src/plugins/todo/plugin.ts +363 -0
  710. package/src/plugins/todo/prompts.ts +63 -0
  711. package/src/plugins/todo/schema.ts +71 -0
  712. package/src/plugins/todo/todo.integration.test.ts +687 -0
  713. package/src/plugins/uploads/index.ts +13 -0
  714. package/src/plugins/uploads/plugin.ts +406 -0
  715. package/src/plugins/uploads/preprocessor.ts +111 -0
  716. package/src/plugins/uploads/preprocessors/image-classifier.ts +176 -0
  717. package/src/plugins/uploads/preprocessors/index.ts +7 -0
  718. package/src/plugins/uploads/preprocessors/markitdown-preprocessor.ts +262 -0
  719. package/src/plugins/uploads/preprocessors/zip-preprocessor.ts +210 -0
  720. package/src/plugins/uploads/schema.ts +92 -0
  721. package/src/plugins/uploads/state.ts +42 -0
  722. package/src/plugins/uploads/uploads.integration.test.ts +654 -0
  723. package/src/plugins/user-chat/index.ts +17 -0
  724. package/src/plugins/user-chat/plugin.ts +728 -0
  725. package/src/plugins/user-chat/prompts.ts +30 -0
  726. package/src/plugins/user-chat/schema.ts +80 -0
  727. package/src/plugins/user-chat/user-chat.integration.test.ts +794 -0
  728. package/src/plugins/workers/context.ts +251 -0
  729. package/src/plugins/workers/definition.ts +169 -0
  730. package/src/plugins/workers/index.ts +21 -0
  731. package/src/plugins/workers/plugin.ts +722 -0
  732. package/src/plugins/workers/worker.ts +115 -0
  733. package/src/plugins/workers/workers.integration.test.ts +778 -0
  734. package/src/prompts/base.ts +266 -0
  735. package/src/prompts/builder.ts +194 -0
  736. package/src/prompts/index.ts +36 -0
  737. package/src/prompts/macros.test.ts +107 -0
  738. package/src/prompts/macros.ts +27 -0
  739. package/src/testing/bootstrap-for-testing.ts +39 -0
  740. package/src/testing/index.ts +7 -0
  741. package/src/testing/node-platform.ts +80 -0
  742. package/src/testing/notification-collector.ts +100 -0
  743. package/src/testing/preset-helpers.ts +57 -0
  744. package/src/testing/test-harness.test.ts +63 -0
  745. package/src/testing/test-harness.ts +279 -0
  746. package/src/testing/wait-helpers.ts +84 -0
  747. package/src/transport/adapter/client-adapter.ts +81 -0
  748. package/src/transport/adapter/index.ts +42 -0
  749. package/src/transport/adapter/server-adapter.ts +93 -0
  750. package/src/transport/adapter/types.ts +20 -0
  751. package/src/transport/http/app.ts +129 -0
  752. package/src/transport/http/index.ts +7 -0
  753. package/src/transport/http/middleware/bearer-auth.ts +40 -0
  754. package/src/transport/http/middleware/error-handler.ts +76 -0
  755. package/src/transport/http/routes/files.ts +274 -0
  756. package/src/transport/http/routes/resources.ts +115 -0
  757. package/src/transport/http/routes/rpc.integration.test.ts +243 -0
  758. package/src/transport/http/routes/rpc.test.ts +372 -0
  759. package/src/transport/http/routes/rpc.ts +156 -0
  760. package/src/transport/http/routes/upload.ts +286 -0
  761. package/src/transport/rpc/index.ts +11 -0
  762. package/src/transport/rpc/methods.ts +38 -0
  763. package/src/user-config.ts +33 -0
@@ -0,0 +1,923 @@
1
+ import { beforeEach, describe, expect, it } from 'bun:test'
2
+ import type { AgentId } from '~/core/agents/schema.js'
3
+ import { generateTestAgentId } from '~/core/agents/schema.js'
4
+ import type { InferenceRequest, InferenceResponse, LLMError, LLMMessage, LLMProvider } from '~/core/llm/provider.js'
5
+ import { ModelId } from '~/core/llm/schema.js'
6
+ import type { SessionId } from '~/core/sessions/schema.js'
7
+ import { generateSessionId } from '~/core/sessions/schema.js'
8
+ import { generateToolCallId } from '~/core/tools/schema.js'
9
+ import { Err, Ok } from '~/lib/utils/result.js'
10
+ import type { Result } from '~/lib/utils/result.js'
11
+ import { silentLogger } from '../../lib/logger/logger.js'
12
+ import { ContextCompactor, createContextCompactedEvent, formatMessageForSummary } from './context-compactor.js'
13
+ import type { CompactionConfig, CompactionResult } from './context-compactor.js'
14
+
15
+ // ============================================================================
16
+ // Test Constants
17
+ // ============================================================================
18
+
19
+ const TEST_MODEL_ID: ModelId = ModelId('test/model')
20
+
21
+ // ============================================================================
22
+ // Mock LLM Provider
23
+ // ============================================================================
24
+
25
+ class MockLLMProvider implements LLMProvider {
26
+ readonly name = 'mock'
27
+ private responses: InferenceResponse[] = []
28
+ private responseIndex = 0
29
+ calls: InferenceRequest[] = []
30
+
31
+ setResponses(responses: InferenceResponse[]): void {
32
+ this.responses = responses
33
+ this.responseIndex = 0
34
+ }
35
+
36
+ async inference(
37
+ request: InferenceRequest,
38
+ ): Promise<Result<InferenceResponse, LLMError>> {
39
+ this.calls.push(request)
40
+ if (this.responseIndex >= this.responses.length) {
41
+ return Err({ type: 'server_error', message: 'No more mock responses' })
42
+ }
43
+ return Ok(this.responses[this.responseIndex++])
44
+ }
45
+ }
46
+
47
+ // ============================================================================
48
+ // Tests: ContextCompactor.needsCompaction
49
+ // ============================================================================
50
+
51
+ describe('ContextCompactor.needsCompaction', () => {
52
+ let mockLLM: MockLLMProvider
53
+ let compactor: ContextCompactor
54
+
55
+ beforeEach(() => {
56
+ mockLLM = new MockLLMProvider()
57
+ compactor = new ContextCompactor(mockLLM, silentLogger, {
58
+ model: TEST_MODEL_ID,
59
+ maxTokens: 100,
60
+ keepRecentMessages: 2,
61
+ })
62
+ })
63
+
64
+ it('returns false when below threshold', () => {
65
+ const messages: LLMMessage[] = [{ role: 'user', content: 'short' }]
66
+ expect(compactor.needsCompaction(messages)).toBe(false)
67
+ })
68
+
69
+ it('returns true when above threshold', () => {
70
+ // Create messages with > 100 tokens
71
+ const messages: LLMMessage[] = [
72
+ { role: 'user', content: 'a'.repeat(200) }, // ~50 tokens + overhead
73
+ { role: 'assistant', content: 'b'.repeat(200) }, // ~50 tokens + overhead
74
+ { role: 'user', content: 'c'.repeat(200) }, // ~50 tokens + overhead
75
+ ]
76
+ expect(compactor.needsCompaction(messages)).toBe(true)
77
+ })
78
+ })
79
+
80
+ // ============================================================================
81
+ // Tests: ContextCompactor.compact
82
+ // ============================================================================
83
+
84
+ describe('ContextCompactor.compact', () => {
85
+ let mockLLM: MockLLMProvider
86
+ let compactor: ContextCompactor
87
+ let sessionId: SessionId
88
+ let agentId: AgentId
89
+
90
+ beforeEach(() => {
91
+ mockLLM = new MockLLMProvider()
92
+ compactor = new ContextCompactor(mockLLM, silentLogger, {
93
+ model: TEST_MODEL_ID,
94
+ maxTokens: 100,
95
+ keepRecentMessages: 2,
96
+ })
97
+ sessionId = generateSessionId()
98
+ agentId = generateTestAgentId()
99
+ })
100
+
101
+ it('returns empty summary when no messages to compact', async () => {
102
+ // Only 2 messages, keepRecentMessages = 2
103
+ const messages: LLMMessage[] = [
104
+ { role: 'user', content: 'message 1' },
105
+ { role: 'assistant', content: 'message 2' },
106
+ ]
107
+
108
+ const result = await compactor.compact(sessionId, agentId, messages)
109
+ expect(result.ok).toBe(true)
110
+ if (!result.ok) return
111
+
112
+ expect(result.value.summary).toBe('')
113
+ expect(result.value.messagesRemoved).toBe(0)
114
+ expect(result.value.compactedMessages).toEqual(messages)
115
+ })
116
+
117
+ it('compacts old messages and keeps recent ones', async () => {
118
+ mockLLM.setResponses([
119
+ {
120
+ content: 'Summary of the conversation',
121
+ toolCalls: [],
122
+ finishReason: 'stop',
123
+ metrics: {
124
+ promptTokens: 50,
125
+ completionTokens: 20,
126
+ totalTokens: 70,
127
+ latencyMs: 100,
128
+ model: 'mock',
129
+ },
130
+ },
131
+ ])
132
+
133
+ const messages: LLMMessage[] = [
134
+ { role: 'user', content: 'old message 1' },
135
+ { role: 'assistant', content: 'old message 2' },
136
+ { role: 'user', content: 'old message 3' },
137
+ { role: 'user', content: 'recent message 1' },
138
+ { role: 'assistant', content: 'recent message 2' },
139
+ ]
140
+
141
+ const result = await compactor.compact(sessionId, agentId, messages)
142
+ expect(result.ok).toBe(true)
143
+ if (!result.ok) return
144
+
145
+ expect(result.value.summary).toBe('Summary of the conversation')
146
+ expect(result.value.messagesRemoved).toBe(3)
147
+ expect(result.value.compactedMessages.length).toBe(3) // summary + 2 recent
148
+
149
+ // First message is summary
150
+ expect(result.value.compactedMessages[0].role).toBe('system')
151
+ expect(result.value.compactedMessages[0].content).toContain(
152
+ '[CONVERSATION SUMMARY]',
153
+ )
154
+ expect(result.value.compactedMessages[0].content).toContain(
155
+ 'Summary of the conversation',
156
+ )
157
+
158
+ // Recent messages preserved
159
+ expect(result.value.compactedMessages[1].content).toBe('recent message 1')
160
+ expect(result.value.compactedMessages[2].content).toBe('recent message 2')
161
+ })
162
+
163
+ it('calls LLM with formatted conversation and configured model', async () => {
164
+ mockLLM.setResponses([
165
+ {
166
+ content: 'Summary',
167
+ toolCalls: [],
168
+ finishReason: 'stop',
169
+ metrics: {
170
+ promptTokens: 50,
171
+ completionTokens: 20,
172
+ totalTokens: 70,
173
+ latencyMs: 100,
174
+ model: 'mock',
175
+ },
176
+ },
177
+ ])
178
+
179
+ const messages: LLMMessage[] = [
180
+ { role: 'user', content: 'user message' },
181
+ { role: 'assistant', content: 'assistant message' },
182
+ { role: 'user', content: 'recent' },
183
+ { role: 'assistant', content: 'recent too' },
184
+ ]
185
+
186
+ await compactor.compact(sessionId, agentId, messages)
187
+
188
+ expect(mockLLM.calls.length).toBe(1)
189
+ const request = mockLLM.calls[0]
190
+ // Verify model from config is used
191
+ expect(request.model).toBe(TEST_MODEL_ID)
192
+ expect(request.messages[0].role).toBe('user')
193
+ expect(request.messages[0].content).toContain('User: user message')
194
+ expect(request.messages[0].content).toContain('Agent: assistant message')
195
+ // Recent messages should not be in the summarization request
196
+ expect(request.messages[0].content).not.toContain('recent')
197
+ })
198
+
199
+ it('returns error when LLM fails', async () => {
200
+ // No responses set, so LLM will fail
201
+
202
+ const messages: LLMMessage[] = [
203
+ { role: 'user', content: 'old 1' },
204
+ { role: 'assistant', content: 'old 2' },
205
+ { role: 'user', content: 'old 3' },
206
+ { role: 'user', content: 'recent 1' },
207
+ { role: 'assistant', content: 'recent 2' },
208
+ ]
209
+
210
+ const result = await compactor.compact(sessionId, agentId, messages)
211
+ expect(result.ok).toBe(false)
212
+ if (result.ok) return
213
+
214
+ expect(result.error.message).toContain('Compaction failed')
215
+ })
216
+ })
217
+
218
+ // ============================================================================
219
+ // Tests: ContextCompactor.compactIfNeeded
220
+ // ============================================================================
221
+
222
+ describe('ContextCompactor.compactIfNeeded', () => {
223
+ let mockLLM: MockLLMProvider
224
+ let compactor: ContextCompactor
225
+ let sessionId: SessionId
226
+ let agentId: AgentId
227
+
228
+ beforeEach(() => {
229
+ mockLLM = new MockLLMProvider()
230
+ compactor = new ContextCompactor(mockLLM, silentLogger, {
231
+ model: TEST_MODEL_ID,
232
+ maxTokens: 50,
233
+ keepRecentMessages: 1,
234
+ })
235
+ sessionId = generateSessionId()
236
+ agentId = generateTestAgentId()
237
+ })
238
+
239
+ it('returns null when compaction not needed', async () => {
240
+ const messages: LLMMessage[] = [{ role: 'user', content: 'short' }]
241
+
242
+ const result = await compactor.compactIfNeeded(sessionId, agentId, messages)
243
+ expect(result.ok).toBe(true)
244
+ if (!result.ok) return
245
+
246
+ expect(result.value).toBeNull()
247
+ expect(mockLLM.calls.length).toBe(0)
248
+ })
249
+
250
+ it('compacts when needed', async () => {
251
+ mockLLM.setResponses([
252
+ {
253
+ content: 'Summary',
254
+ toolCalls: [],
255
+ finishReason: 'stop',
256
+ metrics: {
257
+ promptTokens: 50,
258
+ completionTokens: 20,
259
+ totalTokens: 70,
260
+ latencyMs: 100,
261
+ model: 'mock',
262
+ },
263
+ },
264
+ ])
265
+
266
+ // Create messages exceeding threshold
267
+ const messages: LLMMessage[] = [
268
+ { role: 'user', content: 'a'.repeat(100) },
269
+ { role: 'assistant', content: 'b'.repeat(100) },
270
+ { role: 'user', content: 'c'.repeat(100) },
271
+ ]
272
+
273
+ const result = await compactor.compactIfNeeded(sessionId, agentId, messages)
274
+ expect(result.ok).toBe(true)
275
+ if (!result.ok) return
276
+
277
+ expect(result.value).not.toBeNull()
278
+ expect(result.value!.summary).toBe('Summary')
279
+ })
280
+ })
281
+
282
+ // ============================================================================
283
+ // Tests: createContextCompactedEvent
284
+ // ============================================================================
285
+
286
+ describe('createContextCompactedEvent', () => {
287
+ it('creates event with correct fields', () => {
288
+ const sessionId = generateSessionId()
289
+ const agentId = generateTestAgentId()
290
+ const result: CompactionResult = {
291
+ compactedMessages: [
292
+ { role: 'system', content: 'summary' },
293
+ { role: 'user', content: 'recent' },
294
+ ],
295
+ summary: 'The summary',
296
+ originalTokens: 1000,
297
+ compactedTokens: 200,
298
+ messagesRemoved: 5,
299
+ }
300
+
301
+ const event = createContextCompactedEvent(sessionId, agentId, result)
302
+
303
+ expect(event.type).toBe('context_compacted')
304
+ expect(event.sessionId).toBe(sessionId)
305
+ expect(event.agentId).toBe(agentId)
306
+ expect(event.compactedContent).toBe('The summary')
307
+ expect(event.originalTokens).toBe(1000)
308
+ expect(event.compactedTokens).toBe(200)
309
+ expect(event.messagesRemoved).toBe(5)
310
+ expect(event.newConversationHistory.length).toBe(2)
311
+ expect(event.newConversationHistory[0].role).toBe('system')
312
+ expect(event.newConversationHistory[0].content).toBe('summary')
313
+ expect(event.timestamp).toBeDefined()
314
+ })
315
+
316
+ it('converts tool role to system in history', () => {
317
+ const sessionId = generateSessionId()
318
+ const agentId = generateTestAgentId()
319
+ const toolCallId = generateToolCallId()
320
+ const result: CompactionResult = {
321
+ compactedMessages: [{ role: 'tool', content: 'tool result', toolCallId }],
322
+ summary: '',
323
+ originalTokens: 100,
324
+ compactedTokens: 50,
325
+ messagesRemoved: 0,
326
+ }
327
+
328
+ const event = createContextCompactedEvent(sessionId, agentId, result)
329
+
330
+ // tool role should be converted to system
331
+ expect(event.newConversationHistory[0].role).toBe('system')
332
+ })
333
+ })
334
+
335
+ // ============================================================================
336
+ // Tests: Default config
337
+ // ============================================================================
338
+
339
+ describe('ContextCompactor with custom config', () => {
340
+ it('respects custom maxTokens', () => {
341
+ const mockLLM = new MockLLMProvider()
342
+ const config: CompactionConfig = {
343
+ model: TEST_MODEL_ID,
344
+ maxTokens: 20,
345
+ keepRecentMessages: 1,
346
+ }
347
+ const compactor = new ContextCompactor(mockLLM, silentLogger, config)
348
+
349
+ const smallMessages: LLMMessage[] = [{ role: 'user', content: 'hi' }]
350
+ expect(compactor.needsCompaction(smallMessages)).toBe(false)
351
+
352
+ const largeMessages: LLMMessage[] = [
353
+ { role: 'user', content: 'a'.repeat(100) },
354
+ ]
355
+ expect(compactor.needsCompaction(largeMessages)).toBe(true)
356
+ })
357
+
358
+ it('respects custom keepRecentMessages', async () => {
359
+ const mockLLM = new MockLLMProvider()
360
+ mockLLM.setResponses([
361
+ {
362
+ content: 'Summary',
363
+ toolCalls: [],
364
+ finishReason: 'stop',
365
+ metrics: {
366
+ promptTokens: 50,
367
+ completionTokens: 20,
368
+ totalTokens: 70,
369
+ latencyMs: 100,
370
+ model: 'mock',
371
+ },
372
+ },
373
+ ])
374
+
375
+ const config: CompactionConfig = {
376
+ model: TEST_MODEL_ID,
377
+ maxTokens: 10,
378
+ keepRecentMessages: 3,
379
+ }
380
+ const compactor = new ContextCompactor(mockLLM, silentLogger, config)
381
+
382
+ const messages: LLMMessage[] = [
383
+ { role: 'user', content: 'old 1' },
384
+ { role: 'assistant', content: 'old 2' },
385
+ { role: 'user', content: 'recent 1' },
386
+ { role: 'assistant', content: 'recent 2' },
387
+ { role: 'user', content: 'recent 3' },
388
+ ]
389
+
390
+ const result = await compactor.compact(
391
+ generateSessionId(),
392
+ generateTestAgentId(),
393
+ messages,
394
+ )
395
+
396
+ expect(result.ok).toBe(true)
397
+ if (!result.ok) return
398
+
399
+ // 2 old messages removed, 3 kept + 1 summary = 4 total
400
+ expect(result.value.messagesRemoved).toBe(2)
401
+ expect(result.value.compactedMessages.length).toBe(4)
402
+ })
403
+
404
+ it('uses custom summaryPrompt', async () => {
405
+ const mockLLM = new MockLLMProvider()
406
+ mockLLM.setResponses([
407
+ {
408
+ content: 'Summary',
409
+ toolCalls: [],
410
+ finishReason: 'stop',
411
+ metrics: {
412
+ promptTokens: 50,
413
+ completionTokens: 20,
414
+ totalTokens: 70,
415
+ latencyMs: 100,
416
+ model: 'mock',
417
+ },
418
+ },
419
+ ])
420
+
421
+ const customPrompt = 'Custom summary instructions'
422
+ const config: CompactionConfig = {
423
+ model: TEST_MODEL_ID,
424
+ maxTokens: 10,
425
+ keepRecentMessages: 1,
426
+ summaryPrompt: customPrompt,
427
+ }
428
+ const compactor = new ContextCompactor(mockLLM, silentLogger, config)
429
+
430
+ const messages: LLMMessage[] = [
431
+ { role: 'user', content: 'old' },
432
+ { role: 'user', content: 'recent' },
433
+ ]
434
+
435
+ await compactor.compact(generateSessionId(), generateTestAgentId(), messages)
436
+
437
+ expect(mockLLM.calls.length).toBe(1)
438
+ expect(mockLLM.calls[0].systemPrompt).toBe(customPrompt)
439
+ })
440
+ })
441
+
442
+ // ============================================================================
443
+ // Tests: formatMessageForSummary
444
+ // ============================================================================
445
+
446
+ describe('formatMessageForSummary', () => {
447
+ it('formats user message', () => {
448
+ const msg: LLMMessage = { role: 'user', content: 'Hello world' }
449
+ expect(formatMessageForSummary(msg)).toBe('User: Hello world')
450
+ })
451
+
452
+ it('formats user message with multimodal content', () => {
453
+ const msg: LLMMessage = {
454
+ role: 'user',
455
+ content: [{ type: 'text', text: 'Check this image' }],
456
+ }
457
+ const result = formatMessageForSummary(msg)
458
+ expect(result).toContain('User:')
459
+ expect(result).toContain('Check this image')
460
+ })
461
+
462
+ it('formats assistant message with text only', () => {
463
+ const msg: LLMMessage = { role: 'assistant', content: 'Sure, I can help' }
464
+ expect(formatMessageForSummary(msg)).toBe('Agent: Sure, I can help')
465
+ })
466
+
467
+ it('formats assistant message with tool calls', () => {
468
+ const msg: LLMMessage = {
469
+ role: 'assistant',
470
+ content: '',
471
+ toolCalls: [{ id: generateToolCallId(), name: 'read', input: { path: '/src/index.ts' } }],
472
+ }
473
+ const result = formatMessageForSummary(msg)
474
+ expect(result).toBe('Agent: [Called tools: read(path)]')
475
+ })
476
+
477
+ it('formats assistant message with text and tool calls', () => {
478
+ const msg: LLMMessage = {
479
+ role: 'assistant',
480
+ content: 'Let me read that file.',
481
+ toolCalls: [{ id: generateToolCallId(), name: 'read', input: { path: '/src/index.ts' } }],
482
+ }
483
+ const result = formatMessageForSummary(msg)
484
+ expect(result).toContain('Agent: Let me read that file.')
485
+ expect(result).toContain('[Called tools: read(path)]')
486
+ })
487
+
488
+ it('formats assistant message with multiple tool calls', () => {
489
+ const msg: LLMMessage = {
490
+ role: 'assistant',
491
+ content: '',
492
+ toolCalls: [
493
+ { id: generateToolCallId(), name: 'read', input: { path: '/a.ts' } },
494
+ { id: generateToolCallId(), name: 'edit', input: { path: '/b.ts', old_string: 'x', new_string: 'y' } },
495
+ ],
496
+ }
497
+ const result = formatMessageForSummary(msg)
498
+ expect(result).toBe('Agent: [Called tools: read(path), edit(path, old_string, new_string)]')
499
+ })
500
+
501
+ it('formats tool result with tool name', () => {
502
+ const msg: LLMMessage = {
503
+ role: 'tool',
504
+ content: 'export function main() {}',
505
+ toolCallId: generateToolCallId(),
506
+ toolName: 'read',
507
+ }
508
+ const result = formatMessageForSummary(msg)
509
+ expect(result).toBe('Tool(read): export function main() {}')
510
+ })
511
+
512
+ it('formats tool result without tool name as unknown', () => {
513
+ const msg: LLMMessage = {
514
+ role: 'tool',
515
+ content: 'some result',
516
+ toolCallId: generateToolCallId(),
517
+ }
518
+ const result = formatMessageForSummary(msg)
519
+ expect(result).toBe('Tool(unknown): some result')
520
+ })
521
+
522
+ it('truncates large tool results', () => {
523
+ const largeContent = 'x'.repeat(1000)
524
+ const msg: LLMMessage = {
525
+ role: 'tool',
526
+ content: largeContent,
527
+ toolCallId: generateToolCallId(),
528
+ toolName: 'read',
529
+ }
530
+ const result = formatMessageForSummary(msg)
531
+ expect(result).toContain('Tool(read):')
532
+ expect(result).toContain('...(truncated)...')
533
+ expect(result.length).toBeLessThan(largeContent.length)
534
+ })
535
+
536
+ it('does not truncate small tool results', () => {
537
+ const smallContent = 'small result'
538
+ const msg: LLMMessage = {
539
+ role: 'tool',
540
+ content: smallContent,
541
+ toolCallId: generateToolCallId(),
542
+ toolName: 'read',
543
+ }
544
+ const result = formatMessageForSummary(msg)
545
+ expect(result).toBe('Tool(read): small result')
546
+ expect(result).not.toContain('truncated')
547
+ })
548
+
549
+ it('formats system message', () => {
550
+ const msg: LLMMessage = { role: 'system', content: 'You are an assistant.' }
551
+ expect(formatMessageForSummary(msg)).toBe('System: You are an assistant.')
552
+ })
553
+ })
554
+
555
+ // ============================================================================
556
+ // Tests: Tool calls in compaction
557
+ // ============================================================================
558
+
559
+ describe('ContextCompactor with tool calls', () => {
560
+ let mockLLM: MockLLMProvider
561
+ let compactor: ContextCompactor
562
+ let sessionId: SessionId
563
+ let agentId: AgentId
564
+
565
+ beforeEach(() => {
566
+ mockLLM = new MockLLMProvider()
567
+ compactor = new ContextCompactor(mockLLM, silentLogger, {
568
+ model: TEST_MODEL_ID,
569
+ maxTokens: 100,
570
+ keepRecentMessages: 1,
571
+ })
572
+ sessionId = generateSessionId()
573
+ agentId = generateTestAgentId()
574
+ })
575
+
576
+ it('does not leave orphaned tool results at the start of kept messages', async () => {
577
+ mockLLM.setResponses([
578
+ {
579
+ content: 'Summary',
580
+ toolCalls: [],
581
+ finishReason: 'stop',
582
+ metrics: { promptTokens: 50, completionTokens: 20, totalTokens: 70, latencyMs: 100, model: 'mock' },
583
+ },
584
+ ])
585
+
586
+ const toolCallId = generateToolCallId()
587
+ // keepRecentMessages=1 would split between the assistant (tool call) and tool result
588
+ const messages: LLMMessage[] = [
589
+ { role: 'user', content: 'old message' },
590
+ { role: 'assistant', content: 'old response' },
591
+ { role: 'user', content: 'Read the file' },
592
+ {
593
+ role: 'assistant',
594
+ content: '',
595
+ toolCalls: [{ id: toolCallId, name: 'read', input: { path: '/src/index.ts' } }],
596
+ },
597
+ { role: 'tool', content: 'export const foo = 1', toolCallId, toolName: 'read' },
598
+ ]
599
+
600
+ const result = await compactor.compact(sessionId, agentId, messages)
601
+ expect(result.ok).toBe(true)
602
+ if (!result.ok) return
603
+
604
+ // The tool result must NOT be the first kept message — it should be compacted along with its tool call
605
+ const keptMessages = result.value.compactedMessages.filter(m => m.role !== 'system')
606
+ for (const msg of keptMessages) {
607
+ expect(msg.role).not.toBe('tool')
608
+ }
609
+ // All 5 original messages should be compacted (none kept except summary)
610
+ expect(result.value.messagesRemoved).toBe(5)
611
+ })
612
+
613
+ it('includes tool calls in summarization request', async () => {
614
+ mockLLM.setResponses([
615
+ {
616
+ content: 'Summary',
617
+ toolCalls: [],
618
+ finishReason: 'stop',
619
+ metrics: { promptTokens: 50, completionTokens: 20, totalTokens: 70, latencyMs: 100, model: 'mock' },
620
+ },
621
+ ])
622
+
623
+ const toolCallId = generateToolCallId()
624
+ const messages: LLMMessage[] = [
625
+ { role: 'user', content: 'Read the file' },
626
+ {
627
+ role: 'assistant',
628
+ content: '',
629
+ toolCalls: [{ id: toolCallId, name: 'read', input: { path: '/src/index.ts' } }],
630
+ },
631
+ { role: 'tool', content: 'export const foo = 1', toolCallId, toolName: 'read' },
632
+ { role: 'user', content: 'recent message' },
633
+ ]
634
+
635
+ await compactor.compact(sessionId, agentId, messages)
636
+
637
+ expect(mockLLM.calls.length).toBe(1)
638
+ const request = mockLLM.calls[0]
639
+ const summaryContent = request.messages[0].content as string
640
+
641
+ // Verify tool call is included
642
+ expect(summaryContent).toContain('[Called tools: read(path)]')
643
+ // Verify tool result includes tool name
644
+ expect(summaryContent).toContain('Tool(read):')
645
+ expect(summaryContent).toContain('export const foo = 1')
646
+ })
647
+ })
648
+
649
+ // ============================================================================
650
+ // Tests: History offloading
651
+ // ============================================================================
652
+
653
+ describe('ContextCompactor with history offloading', () => {
654
+ let mockLLM: MockLLMProvider
655
+ let sessionId: SessionId
656
+ let agentId: AgentId
657
+
658
+ beforeEach(() => {
659
+ mockLLM = new MockLLMProvider()
660
+ sessionId = generateSessionId()
661
+ agentId = generateTestAgentId()
662
+ })
663
+
664
+ it('offloads history when enabled and offloader is provided', async () => {
665
+ const offloadedPaths: { agentId: AgentId; content: string; pathPrefix: string }[] = []
666
+ const mockOffloader = {
667
+ async offload(agentId: AgentId, content: string, pathPrefix: string): Promise<string> {
668
+ offloadedPaths.push({ agentId, content, pathPrefix })
669
+ return `${pathPrefix}${agentId}/history.md`
670
+ },
671
+ }
672
+
673
+ mockLLM.setResponses([
674
+ {
675
+ content: 'Summary',
676
+ toolCalls: [],
677
+ finishReason: 'stop',
678
+ metrics: { promptTokens: 50, completionTokens: 20, totalTokens: 70, latencyMs: 100, model: 'mock' },
679
+ },
680
+ ])
681
+
682
+ const compactor = new ContextCompactor(
683
+ mockLLM,
684
+ silentLogger,
685
+ {
686
+ model: TEST_MODEL_ID,
687
+ maxTokens: 100,
688
+ keepRecentMessages: 1,
689
+ offloadHistory: true,
690
+ },
691
+ mockOffloader,
692
+ )
693
+
694
+ const messages: LLMMessage[] = [
695
+ { role: 'user', content: 'old message 1' },
696
+ { role: 'assistant', content: 'old message 2' },
697
+ { role: 'user', content: 'recent message' },
698
+ ]
699
+
700
+ const result = await compactor.compact(sessionId, agentId, messages)
701
+
702
+ expect(result.ok).toBe(true)
703
+ if (!result.ok) return
704
+
705
+ // Verify offloader was called
706
+ expect(offloadedPaths.length).toBe(1)
707
+ expect(offloadedPaths[0].agentId).toBe(agentId)
708
+ expect(offloadedPaths[0].content).toContain('User: old message 1')
709
+ expect(offloadedPaths[0].pathPrefix).toBe('/session/.history/')
710
+
711
+ // Verify result contains historyPath
712
+ expect(result.value.historyPath).toBe(`/session/.history/${agentId}/history.md`)
713
+
714
+ // Verify summary message contains history reference
715
+ expect(result.value.compactedMessages[0].content).toContain('has been saved to')
716
+ expect(result.value.compactedMessages[0].content).toContain(`/session/.history/${agentId}/history.md`)
717
+ })
718
+
719
+ it('does not offload history when disabled', async () => {
720
+ const mockOffloader = {
721
+ async offload(): Promise<string> {
722
+ throw new Error('Should not be called')
723
+ },
724
+ }
725
+
726
+ mockLLM.setResponses([
727
+ {
728
+ content: 'Summary',
729
+ toolCalls: [],
730
+ finishReason: 'stop',
731
+ metrics: { promptTokens: 50, completionTokens: 20, totalTokens: 70, latencyMs: 100, model: 'mock' },
732
+ },
733
+ ])
734
+
735
+ const compactor = new ContextCompactor(
736
+ mockLLM,
737
+ silentLogger,
738
+ {
739
+ model: TEST_MODEL_ID,
740
+ maxTokens: 100,
741
+ keepRecentMessages: 1,
742
+ offloadHistory: false, // explicitly disabled
743
+ },
744
+ mockOffloader,
745
+ )
746
+
747
+ const messages: LLMMessage[] = [
748
+ { role: 'user', content: 'old' },
749
+ { role: 'user', content: 'recent' },
750
+ ]
751
+
752
+ const result = await compactor.compact(sessionId, agentId, messages)
753
+
754
+ expect(result.ok).toBe(true)
755
+ if (!result.ok) return
756
+
757
+ expect(result.value.historyPath).toBeUndefined()
758
+ expect(result.value.compactedMessages[0].content).not.toContain('has been saved to')
759
+ })
760
+
761
+ it('does not offload history when offloader is not provided', async () => {
762
+ mockLLM.setResponses([
763
+ {
764
+ content: 'Summary',
765
+ toolCalls: [],
766
+ finishReason: 'stop',
767
+ metrics: { promptTokens: 50, completionTokens: 20, totalTokens: 70, latencyMs: 100, model: 'mock' },
768
+ },
769
+ ])
770
+
771
+ const compactor = new ContextCompactor(
772
+ mockLLM,
773
+ silentLogger,
774
+ {
775
+ model: TEST_MODEL_ID,
776
+ maxTokens: 100,
777
+ keepRecentMessages: 1,
778
+ offloadHistory: true, // enabled but no offloader
779
+ },
780
+ // no offloader provided
781
+ )
782
+
783
+ const messages: LLMMessage[] = [
784
+ { role: 'user', content: 'old' },
785
+ { role: 'user', content: 'recent' },
786
+ ]
787
+
788
+ const result = await compactor.compact(sessionId, agentId, messages)
789
+
790
+ expect(result.ok).toBe(true)
791
+ if (!result.ok) return
792
+
793
+ expect(result.value.historyPath).toBeUndefined()
794
+ })
795
+
796
+ it('uses custom historyPathPrefix', async () => {
797
+ const offloadedPaths: { pathPrefix: string }[] = []
798
+ const mockOffloader = {
799
+ async offload(_agentId: AgentId, _content: string, pathPrefix: string): Promise<string> {
800
+ offloadedPaths.push({ pathPrefix })
801
+ return `/custom/path/history.md`
802
+ },
803
+ }
804
+
805
+ mockLLM.setResponses([
806
+ {
807
+ content: 'Summary',
808
+ toolCalls: [],
809
+ finishReason: 'stop',
810
+ metrics: { promptTokens: 50, completionTokens: 20, totalTokens: 70, latencyMs: 100, model: 'mock' },
811
+ },
812
+ ])
813
+
814
+ const compactor = new ContextCompactor(
815
+ mockLLM,
816
+ silentLogger,
817
+ {
818
+ model: TEST_MODEL_ID,
819
+ maxTokens: 100,
820
+ keepRecentMessages: 1,
821
+ offloadHistory: true,
822
+ historyPathPrefix: '/session/.custom-history/',
823
+ },
824
+ mockOffloader,
825
+ )
826
+
827
+ const messages: LLMMessage[] = [
828
+ { role: 'user', content: 'old' },
829
+ { role: 'user', content: 'recent' },
830
+ ]
831
+
832
+ await compactor.compact(sessionId, agentId, messages)
833
+
834
+ expect(offloadedPaths.length).toBe(1)
835
+ expect(offloadedPaths[0].pathPrefix).toBe('/session/.custom-history/')
836
+ })
837
+
838
+ it('continues compaction even if offloading fails', async () => {
839
+ const mockOffloader = {
840
+ async offload(): Promise<string> {
841
+ throw new Error('Disk full')
842
+ },
843
+ }
844
+
845
+ mockLLM.setResponses([
846
+ {
847
+ content: 'Summary despite offload failure',
848
+ toolCalls: [],
849
+ finishReason: 'stop',
850
+ metrics: { promptTokens: 50, completionTokens: 20, totalTokens: 70, latencyMs: 100, model: 'mock' },
851
+ },
852
+ ])
853
+
854
+ const compactor = new ContextCompactor(
855
+ mockLLM,
856
+ silentLogger,
857
+ {
858
+ model: TEST_MODEL_ID,
859
+ maxTokens: 100,
860
+ keepRecentMessages: 1,
861
+ offloadHistory: true,
862
+ },
863
+ mockOffloader,
864
+ )
865
+
866
+ const messages: LLMMessage[] = [
867
+ { role: 'user', content: 'old' },
868
+ { role: 'user', content: 'recent' },
869
+ ]
870
+
871
+ const result = await compactor.compact(sessionId, agentId, messages)
872
+
873
+ // Compaction should succeed despite offload failure
874
+ expect(result.ok).toBe(true)
875
+ if (!result.ok) return
876
+
877
+ expect(result.value.summary).toBe('Summary despite offload failure')
878
+ expect(result.value.historyPath).toBeUndefined()
879
+ })
880
+ })
881
+
882
+ // ============================================================================
883
+ // Tests: createContextCompactedEvent with historyPath
884
+ // ============================================================================
885
+
886
+ describe('createContextCompactedEvent with historyPath', () => {
887
+ it('includes historyPath in event when provided', () => {
888
+ const sessionId = generateSessionId()
889
+ const agentId = generateTestAgentId()
890
+ const result: CompactionResult = {
891
+ compactedMessages: [
892
+ { role: 'system', content: 'summary' },
893
+ ],
894
+ summary: 'The summary',
895
+ originalTokens: 1000,
896
+ compactedTokens: 200,
897
+ messagesRemoved: 5,
898
+ historyPath: '/session/.history/agent-1/history.md',
899
+ }
900
+
901
+ const event = createContextCompactedEvent(sessionId, agentId, result)
902
+
903
+ expect(event.historyPath).toBe('/session/.history/agent-1/history.md')
904
+ })
905
+
906
+ it('does not include historyPath when not provided', () => {
907
+ const sessionId = generateSessionId()
908
+ const agentId = generateTestAgentId()
909
+ const result: CompactionResult = {
910
+ compactedMessages: [
911
+ { role: 'system', content: 'summary' },
912
+ ],
913
+ summary: 'The summary',
914
+ originalTokens: 1000,
915
+ compactedTokens: 200,
916
+ messagesRemoved: 5,
917
+ }
918
+
919
+ const event = createContextCompactedEvent(sessionId, agentId, result)
920
+
921
+ expect(event.historyPath).toBeUndefined()
922
+ })
923
+ })