@roj-ai/sdk 0.1.35 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (908) hide show
  1. package/dist/bootstrap.d.ts +420 -26
  2. package/dist/bootstrap.d.ts.map +1 -1
  3. package/dist/bootstrap.js +55 -24
  4. package/dist/bootstrap.js.map +1 -1
  5. package/dist/bun-platform/fs.d.ts.map +1 -1
  6. package/dist/bun-platform/fs.js +1 -0
  7. package/dist/bun-platform/fs.js.map +1 -1
  8. package/dist/bun-platform/index.d.ts +4 -1
  9. package/dist/bun-platform/index.d.ts.map +1 -1
  10. package/dist/bun-platform/index.js +7 -1
  11. package/dist/bun-platform/index.js.map +1 -1
  12. package/dist/bun-platform/server-lifecycle.d.ts +30 -0
  13. package/dist/bun-platform/server-lifecycle.d.ts.map +1 -0
  14. package/dist/bun-platform/server-lifecycle.js +182 -0
  15. package/dist/bun-platform/server-lifecycle.js.map +1 -0
  16. package/dist/bun-platform/shell.d.ts +33 -0
  17. package/dist/bun-platform/shell.d.ts.map +1 -0
  18. package/dist/bun-platform/shell.js +322 -0
  19. package/dist/bun-platform/shell.js.map +1 -0
  20. package/dist/config.d.ts +34 -0
  21. package/dist/config.d.ts.map +1 -1
  22. package/dist/config.js +97 -0
  23. package/dist/config.js.map +1 -1
  24. package/dist/core/agents/agent.d.ts +42 -7
  25. package/dist/core/agents/agent.d.ts.map +1 -1
  26. package/dist/core/agents/agent.js +209 -90
  27. package/dist/core/agents/agent.js.map +1 -1
  28. package/dist/core/agents/config.d.ts +8 -1
  29. package/dist/core/agents/config.d.ts.map +1 -1
  30. package/dist/core/agents/config.js +5 -1
  31. package/dist/core/agents/config.js.map +1 -1
  32. package/dist/core/agents/retry.d.ts +1 -1
  33. package/dist/core/agents/retry.d.ts.map +1 -1
  34. package/dist/core/agents/retry.js +14 -16
  35. package/dist/core/agents/retry.js.map +1 -1
  36. package/dist/core/agents/state.d.ts +27 -1
  37. package/dist/core/agents/state.d.ts.map +1 -1
  38. package/dist/core/agents/state.js +1 -1
  39. package/dist/core/agents/state.js.map +1 -1
  40. package/dist/core/context/state.d.ts +3 -3
  41. package/dist/core/context/state.d.ts.map +1 -1
  42. package/dist/core/context/state.js +6 -2
  43. package/dist/core/context/state.js.map +1 -1
  44. package/dist/core/events/base-event-store.d.ts.map +1 -1
  45. package/dist/core/events/base-event-store.js +22 -14
  46. package/dist/core/events/base-event-store.js.map +1 -1
  47. package/dist/core/events/file.d.ts +39 -1
  48. package/dist/core/events/file.d.ts.map +1 -1
  49. package/dist/core/events/file.js +159 -20
  50. package/dist/core/events/file.js.map +1 -1
  51. package/dist/core/events/types.d.ts +1 -1
  52. package/dist/core/file-store/containment.d.ts +19 -0
  53. package/dist/core/file-store/containment.d.ts.map +1 -0
  54. package/dist/core/file-store/containment.js +62 -0
  55. package/dist/core/file-store/containment.js.map +1 -0
  56. package/dist/core/file-store/file-store.d.ts +22 -2
  57. package/dist/core/file-store/file-store.d.ts.map +1 -1
  58. package/dist/core/file-store/file-store.js +88 -20
  59. package/dist/core/file-store/file-store.js.map +1 -1
  60. package/dist/core/file-store/types.d.ts +13 -1
  61. package/dist/core/file-store/types.d.ts.map +1 -1
  62. package/dist/core/image/image-processor.d.ts.map +1 -1
  63. package/dist/core/image/image-processor.js +3 -1
  64. package/dist/core/image/image-processor.js.map +1 -1
  65. package/dist/core/image/types.d.ts +2 -0
  66. package/dist/core/image/types.d.ts.map +1 -1
  67. package/dist/core/image/vips-resizer.d.ts.map +1 -1
  68. package/dist/core/image/vips-resizer.js +81 -33
  69. package/dist/core/image/vips-resizer.js.map +1 -1
  70. package/dist/core/llm/anthropic.d.ts +0 -1
  71. package/dist/core/llm/anthropic.d.ts.map +1 -1
  72. package/dist/core/llm/anthropic.js +101 -74
  73. package/dist/core/llm/anthropic.js.map +1 -1
  74. package/dist/core/llm/logger.d.ts +14 -2
  75. package/dist/core/llm/logger.d.ts.map +1 -1
  76. package/dist/core/llm/logger.js +161 -36
  77. package/dist/core/llm/logger.js.map +1 -1
  78. package/dist/core/llm/openrouter.d.ts +0 -1
  79. package/dist/core/llm/openrouter.d.ts.map +1 -1
  80. package/dist/core/llm/openrouter.js +70 -74
  81. package/dist/core/llm/openrouter.js.map +1 -1
  82. package/dist/core/llm/provider-request.d.ts +10 -0
  83. package/dist/core/llm/provider-request.d.ts.map +1 -0
  84. package/dist/core/llm/provider-request.js +41 -0
  85. package/dist/core/llm/provider-request.js.map +1 -0
  86. package/dist/core/llm/provider.d.ts +45 -3
  87. package/dist/core/llm/provider.d.ts.map +1 -1
  88. package/dist/core/llm/provider.js +26 -0
  89. package/dist/core/llm/provider.js.map +1 -1
  90. package/dist/core/llm/state.d.ts +4 -2
  91. package/dist/core/llm/state.d.ts.map +1 -1
  92. package/dist/core/llm/state.js +15 -4
  93. package/dist/core/llm/state.js.map +1 -1
  94. package/dist/core/plugins/plugin-builder.d.ts +57 -3
  95. package/dist/core/plugins/plugin-builder.d.ts.map +1 -1
  96. package/dist/core/plugins/plugin-builder.js +68 -14
  97. package/dist/core/plugins/plugin-builder.js.map +1 -1
  98. package/dist/core/preset/preset-builder.d.ts +3 -2
  99. package/dist/core/preset/preset-builder.d.ts.map +1 -1
  100. package/dist/core/preset/preset-builder.js +7 -16
  101. package/dist/core/preset/preset-builder.js.map +1 -1
  102. package/dist/core/sessions/context.d.ts +23 -5
  103. package/dist/core/sessions/context.d.ts.map +1 -1
  104. package/dist/core/sessions/runtime-activity.d.ts +33 -0
  105. package/dist/core/sessions/runtime-activity.d.ts.map +1 -0
  106. package/dist/core/sessions/runtime-activity.js +55 -0
  107. package/dist/core/sessions/runtime-activity.js.map +1 -0
  108. package/dist/core/sessions/schema.d.ts +23 -2
  109. package/dist/core/sessions/schema.d.ts.map +1 -1
  110. package/dist/core/sessions/schema.js +24 -3
  111. package/dist/core/sessions/schema.js.map +1 -1
  112. package/dist/core/sessions/session-manager.d.ts +83 -6
  113. package/dist/core/sessions/session-manager.d.ts.map +1 -1
  114. package/dist/core/sessions/session-manager.js +517 -118
  115. package/dist/core/sessions/session-manager.js.map +1 -1
  116. package/dist/core/sessions/session-store.d.ts +18 -0
  117. package/dist/core/sessions/session-store.d.ts.map +1 -1
  118. package/dist/core/sessions/session-store.js +33 -0
  119. package/dist/core/sessions/session-store.js.map +1 -1
  120. package/dist/core/sessions/session.d.ts +42 -6
  121. package/dist/core/sessions/session.d.ts.map +1 -1
  122. package/dist/core/sessions/session.js +176 -44
  123. package/dist/core/sessions/session.js.map +1 -1
  124. package/dist/core/sessions/state.d.ts +10 -1
  125. package/dist/core/sessions/state.d.ts.map +1 -1
  126. package/dist/core/sessions/state.js +16 -1
  127. package/dist/core/sessions/state.js.map +1 -1
  128. package/dist/core/system.d.ts +9 -0
  129. package/dist/core/system.d.ts.map +1 -1
  130. package/dist/core/system.js +4 -1
  131. package/dist/core/system.js.map +1 -1
  132. package/dist/core/tools/executor.d.ts +1 -1
  133. package/dist/core/wake-key.d.ts +34 -0
  134. package/dist/core/wake-key.d.ts.map +1 -0
  135. package/dist/core/wake-key.js +51 -0
  136. package/dist/core/wake-key.js.map +1 -0
  137. package/dist/index.d.ts +24 -13
  138. package/dist/index.d.ts.map +1 -1
  139. package/dist/index.js +22 -8
  140. package/dist/index.js.map +1 -1
  141. package/dist/lib/archive/archive-inspection.d.ts +48 -0
  142. package/dist/lib/archive/archive-inspection.d.ts.map +1 -0
  143. package/dist/lib/archive/archive-inspection.fixtures.d.ts +7 -0
  144. package/dist/lib/archive/archive-inspection.fixtures.d.ts.map +1 -0
  145. package/dist/lib/archive/archive-inspection.fixtures.js +134 -0
  146. package/dist/lib/archive/archive-inspection.fixtures.js.map +1 -0
  147. package/dist/lib/archive/archive-inspection.js +253 -0
  148. package/dist/lib/archive/archive-inspection.js.map +1 -0
  149. package/dist/lib/archive/index.d.ts +3 -0
  150. package/dist/lib/archive/index.d.ts.map +1 -0
  151. package/dist/lib/archive/index.js +2 -0
  152. package/dist/lib/archive/index.js.map +1 -0
  153. package/dist/lib/logger/console.d.ts +5 -12
  154. package/dist/lib/logger/console.d.ts.map +1 -1
  155. package/dist/lib/logger/console.js +5 -47
  156. package/dist/lib/logger/console.js.map +1 -1
  157. package/dist/lib/logger/file.d.ts +8 -11
  158. package/dist/lib/logger/file.d.ts.map +1 -1
  159. package/dist/lib/logger/file.js +26 -37
  160. package/dist/lib/logger/file.js.map +1 -1
  161. package/dist/lib/logger/index.d.ts +3 -1
  162. package/dist/lib/logger/index.d.ts.map +1 -1
  163. package/dist/lib/logger/index.js +3 -1
  164. package/dist/lib/logger/index.js.map +1 -1
  165. package/dist/lib/logger/jsonl.d.ts +21 -0
  166. package/dist/lib/logger/jsonl.d.ts.map +1 -0
  167. package/dist/lib/logger/jsonl.js +29 -0
  168. package/dist/lib/logger/jsonl.js.map +1 -0
  169. package/dist/lib/logger/logger.d.ts +22 -0
  170. package/dist/lib/logger/logger.d.ts.map +1 -1
  171. package/dist/lib/logger/logger.js +37 -0
  172. package/dist/lib/logger/logger.js.map +1 -1
  173. package/dist/lib/logger/session-log.d.ts +21 -0
  174. package/dist/lib/logger/session-log.d.ts.map +1 -0
  175. package/dist/lib/logger/session-log.js +37 -0
  176. package/dist/lib/logger/session-log.js.map +1 -0
  177. package/dist/lib/utils/concurrency.d.ts +1 -1
  178. package/dist/lib/utils/concurrency.d.ts.map +1 -1
  179. package/dist/lib/utils/concurrency.js +30 -7
  180. package/dist/lib/utils/concurrency.js.map +1 -1
  181. package/dist/lib/utils/fs-batch.d.ts +17 -0
  182. package/dist/lib/utils/fs-batch.d.ts.map +1 -0
  183. package/dist/lib/utils/fs-batch.js +38 -0
  184. package/dist/lib/utils/fs-batch.js.map +1 -0
  185. package/dist/lib/utils/result.d.ts +7 -22
  186. package/dist/lib/utils/result.d.ts.map +1 -1
  187. package/dist/lib/utils/result.js +6 -17
  188. package/dist/lib/utils/result.js.map +1 -1
  189. package/dist/lib/utils/sleep.d.ts +10 -0
  190. package/dist/lib/utils/sleep.d.ts.map +1 -0
  191. package/dist/lib/utils/sleep.js +26 -0
  192. package/dist/lib/utils/sleep.js.map +1 -0
  193. package/dist/platform/fs-revision.d.ts +21 -0
  194. package/dist/platform/fs-revision.d.ts.map +1 -0
  195. package/dist/platform/fs-revision.js +9 -0
  196. package/dist/platform/fs-revision.js.map +1 -0
  197. package/dist/platform/fs.d.ts +104 -1
  198. package/dist/platform/fs.d.ts.map +1 -1
  199. package/dist/platform/git.d.ts +59 -0
  200. package/dist/platform/git.d.ts.map +1 -0
  201. package/dist/platform/git.js +8 -0
  202. package/dist/platform/git.js.map +1 -0
  203. package/dist/platform/index.d.ts +40 -1
  204. package/dist/platform/index.d.ts.map +1 -1
  205. package/dist/platform/index.js +1 -1
  206. package/dist/platform/index.js.map +1 -1
  207. package/dist/platform/llm-call-log.d.ts +80 -0
  208. package/dist/platform/llm-call-log.d.ts.map +1 -0
  209. package/dist/platform/llm-call-log.js +12 -0
  210. package/dist/platform/llm-call-log.js.map +1 -0
  211. package/dist/platform/scheduler.d.ts +32 -0
  212. package/dist/platform/scheduler.d.ts.map +1 -0
  213. package/dist/platform/scheduler.js +46 -0
  214. package/dist/platform/scheduler.js.map +1 -0
  215. package/dist/platform/session-log.d.ts +36 -0
  216. package/dist/platform/session-log.d.ts.map +1 -0
  217. package/dist/platform/session-log.js +12 -0
  218. package/dist/platform/session-log.js.map +1 -0
  219. package/dist/platform/shell.d.ts +83 -0
  220. package/dist/platform/shell.d.ts.map +1 -0
  221. package/dist/platform/shell.js +13 -0
  222. package/dist/platform/shell.js.map +1 -0
  223. package/dist/plugins/agent-status/plugin.d.ts.map +1 -1
  224. package/dist/plugins/agent-status/plugin.js +1 -0
  225. package/dist/plugins/agent-status/plugin.js.map +1 -1
  226. package/dist/plugins/agents/plugin.d.ts.map +1 -1
  227. package/dist/plugins/agents/plugin.js +129 -62
  228. package/dist/plugins/agents/plugin.js.map +1 -1
  229. package/dist/plugins/filesystem/listing.d.ts +3 -0
  230. package/dist/plugins/filesystem/listing.d.ts.map +1 -1
  231. package/dist/plugins/filesystem/listing.js +66 -10
  232. package/dist/plugins/filesystem/listing.js.map +1 -1
  233. package/dist/plugins/filesystem/plugin.d.ts.map +1 -1
  234. package/dist/plugins/filesystem/plugin.js +8 -6
  235. package/dist/plugins/filesystem/plugin.js.map +1 -1
  236. package/dist/plugins/git-status/plugin.d.ts +34 -7
  237. package/dist/plugins/git-status/plugin.d.ts.map +1 -1
  238. package/dist/plugins/git-status/plugin.js +168 -64
  239. package/dist/plugins/git-status/plugin.js.map +1 -1
  240. package/dist/plugins/llm-debug/plugin.d.ts.map +1 -1
  241. package/dist/plugins/llm-debug/plugin.js +1 -0
  242. package/dist/plugins/llm-debug/plugin.js.map +1 -1
  243. package/dist/plugins/logs/plugin.d.ts +1 -4
  244. package/dist/plugins/logs/plugin.d.ts.map +1 -1
  245. package/dist/plugins/logs/plugin.js +7 -0
  246. package/dist/plugins/logs/plugin.js.map +1 -1
  247. package/dist/plugins/mailbox/helpers.d.ts +2 -2
  248. package/dist/plugins/mailbox/helpers.js +1 -1
  249. package/dist/plugins/mailbox/plugin.d.ts.map +1 -1
  250. package/dist/plugins/mailbox/plugin.js +38 -43
  251. package/dist/plugins/mailbox/plugin.js.map +1 -1
  252. package/dist/plugins/mailbox/query.d.ts +7 -2
  253. package/dist/plugins/mailbox/query.d.ts.map +1 -1
  254. package/dist/plugins/mailbox/query.js +14 -7
  255. package/dist/plugins/mailbox/query.js.map +1 -1
  256. package/dist/plugins/mailbox/state.d.ts +5 -4
  257. package/dist/plugins/mailbox/state.d.ts.map +1 -1
  258. package/dist/plugins/mailbox/state.js +6 -5
  259. package/dist/plugins/mailbox/state.js.map +1 -1
  260. package/dist/plugins/resources/filename.d.ts +4 -0
  261. package/dist/plugins/resources/filename.d.ts.map +1 -0
  262. package/dist/plugins/resources/filename.js +18 -0
  263. package/dist/plugins/resources/filename.js.map +1 -0
  264. package/dist/plugins/resources/plugin.d.ts +3 -0
  265. package/dist/plugins/resources/plugin.d.ts.map +1 -1
  266. package/dist/plugins/resources/plugin.js +97 -60
  267. package/dist/plugins/resources/plugin.js.map +1 -1
  268. package/dist/plugins/resources/state.d.ts +1 -1
  269. package/dist/plugins/resources/state.js +1 -1
  270. package/dist/plugins/result-eviction/plugin.d.ts.map +1 -1
  271. package/dist/plugins/result-eviction/plugin.js +6 -1
  272. package/dist/plugins/result-eviction/plugin.js.map +1 -1
  273. package/dist/plugins/services/plugin.d.ts +4 -1
  274. package/dist/plugins/services/plugin.d.ts.map +1 -1
  275. package/dist/plugins/services/plugin.js +251 -100
  276. package/dist/plugins/services/plugin.js.map +1 -1
  277. package/dist/plugins/services/prompt.d.ts.map +1 -1
  278. package/dist/plugins/services/prompt.js +1 -4
  279. package/dist/plugins/services/prompt.js.map +1 -1
  280. package/dist/plugins/services/schema.d.ts +15 -5
  281. package/dist/plugins/services/schema.d.ts.map +1 -1
  282. package/dist/plugins/services/service.d.ts +100 -18
  283. package/dist/plugins/services/service.d.ts.map +1 -1
  284. package/dist/plugins/services/service.js +680 -230
  285. package/dist/plugins/services/service.js.map +1 -1
  286. package/dist/plugins/session-lifecycle/plugin.d.ts +21 -1
  287. package/dist/plugins/session-lifecycle/plugin.d.ts.map +1 -1
  288. package/dist/plugins/session-lifecycle/plugin.js +53 -40
  289. package/dist/plugins/session-lifecycle/plugin.js.map +1 -1
  290. package/dist/plugins/session-state/plugin.d.ts +21 -13
  291. package/dist/plugins/session-state/plugin.d.ts.map +1 -1
  292. package/dist/plugins/session-state/plugin.js +214 -79
  293. package/dist/plugins/session-state/plugin.js.map +1 -1
  294. package/dist/plugins/session-stats/plugin.d.ts.map +1 -1
  295. package/dist/plugins/session-stats/plugin.js +1 -0
  296. package/dist/plugins/session-stats/plugin.js.map +1 -1
  297. package/dist/plugins/shell/executor.d.ts +17 -15
  298. package/dist/plugins/shell/executor.d.ts.map +1 -1
  299. package/dist/plugins/shell/executor.js +130 -195
  300. package/dist/plugins/shell/executor.js.map +1 -1
  301. package/dist/plugins/shell/index.d.ts +2 -2
  302. package/dist/plugins/shell/index.d.ts.map +1 -1
  303. package/dist/plugins/shell/index.js +2 -2
  304. package/dist/plugins/shell/index.js.map +1 -1
  305. package/dist/plugins/shell/plugin.d.ts +5 -4
  306. package/dist/plugins/shell/plugin.d.ts.map +1 -1
  307. package/dist/plugins/shell/plugin.js +4 -8
  308. package/dist/plugins/shell/plugin.js.map +1 -1
  309. package/dist/plugins/skills/discovery.d.ts.map +1 -1
  310. package/dist/plugins/skills/discovery.js +10 -8
  311. package/dist/plugins/skills/discovery.js.map +1 -1
  312. package/dist/plugins/skills/index.d.ts +1 -1
  313. package/dist/plugins/skills/index.d.ts.map +1 -1
  314. package/dist/plugins/skills/plugin.d.ts +1 -1
  315. package/dist/plugins/skills/plugin.d.ts.map +1 -1
  316. package/dist/plugins/skills/plugin.js +23 -30
  317. package/dist/plugins/skills/plugin.js.map +1 -1
  318. package/dist/plugins/skills/prompts.d.ts +3 -3
  319. package/dist/plugins/skills/prompts.d.ts.map +1 -1
  320. package/dist/plugins/skills/prompts.js.map +1 -1
  321. package/dist/plugins/skills/schema.d.ts +4 -2
  322. package/dist/plugins/skills/schema.d.ts.map +1 -1
  323. package/dist/plugins/todo/schema.d.ts +1 -1
  324. package/dist/plugins/uploads/plugin.d.ts +11 -4
  325. package/dist/plugins/uploads/plugin.d.ts.map +1 -1
  326. package/dist/plugins/uploads/plugin.js +891 -225
  327. package/dist/plugins/uploads/plugin.js.map +1 -1
  328. package/dist/plugins/uploads/preprocessor.d.ts +14 -0
  329. package/dist/plugins/uploads/preprocessor.d.ts.map +1 -1
  330. package/dist/plugins/uploads/preprocessor.js +11 -0
  331. package/dist/plugins/uploads/preprocessor.js.map +1 -1
  332. package/dist/plugins/uploads/preprocessors/image-classifier.d.ts +1 -1
  333. package/dist/plugins/uploads/preprocessors/image-classifier.d.ts.map +1 -1
  334. package/dist/plugins/uploads/preprocessors/image-classifier.js +51 -26
  335. package/dist/plugins/uploads/preprocessors/image-classifier.js.map +1 -1
  336. package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.d.ts +2 -2
  337. package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.d.ts.map +1 -1
  338. package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.js +41 -16
  339. package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.js.map +1 -1
  340. package/dist/plugins/uploads/preprocessors/pdf-preprocessor.d.ts +1 -1
  341. package/dist/plugins/uploads/preprocessors/pdf-preprocessor.d.ts.map +1 -1
  342. package/dist/plugins/uploads/preprocessors/pdf-preprocessor.js +29 -14
  343. package/dist/plugins/uploads/preprocessors/pdf-preprocessor.js.map +1 -1
  344. package/dist/plugins/uploads/preprocessors/zip-preprocessor.d.ts +1 -1
  345. package/dist/plugins/uploads/preprocessors/zip-preprocessor.d.ts.map +1 -1
  346. package/dist/plugins/uploads/preprocessors/zip-preprocessor.js +62 -34
  347. package/dist/plugins/uploads/preprocessors/zip-preprocessor.js.map +1 -1
  348. package/dist/plugins/uploads/schema.d.ts +25 -2
  349. package/dist/plugins/uploads/schema.d.ts.map +1 -1
  350. package/dist/plugins/uploads/schema.js +24 -3
  351. package/dist/plugins/uploads/schema.js.map +1 -1
  352. package/dist/plugins/uploads/state.d.ts +13 -1
  353. package/dist/plugins/uploads/state.d.ts.map +1 -1
  354. package/dist/plugins/uploads/state.js +4 -1
  355. package/dist/plugins/uploads/state.js.map +1 -1
  356. package/dist/plugins/user-chat/plugin.d.ts +12 -5
  357. package/dist/plugins/user-chat/plugin.d.ts.map +1 -1
  358. package/dist/plugins/user-chat/plugin.js +141 -32
  359. package/dist/plugins/user-chat/plugin.js.map +1 -1
  360. package/dist/plugins/workers/context.d.ts +35 -13
  361. package/dist/plugins/workers/context.d.ts.map +1 -1
  362. package/dist/plugins/workers/context.js +82 -32
  363. package/dist/plugins/workers/context.js.map +1 -1
  364. package/dist/plugins/workers/definition.d.ts +7 -0
  365. package/dist/plugins/workers/definition.d.ts.map +1 -1
  366. package/dist/plugins/workers/definition.js.map +1 -1
  367. package/dist/plugins/workers/index.d.ts +4 -4
  368. package/dist/plugins/workers/index.d.ts.map +1 -1
  369. package/dist/plugins/workers/index.js +2 -2
  370. package/dist/plugins/workers/index.js.map +1 -1
  371. package/dist/plugins/workers/plugin.d.ts +10 -57
  372. package/dist/plugins/workers/plugin.d.ts.map +1 -1
  373. package/dist/plugins/workers/plugin.js +385 -123
  374. package/dist/plugins/workers/plugin.js.map +1 -1
  375. package/dist/plugins/workers/state.d.ts +69 -0
  376. package/dist/plugins/workers/state.d.ts.map +1 -0
  377. package/dist/plugins/workers/state.js +52 -0
  378. package/dist/plugins/workers/state.js.map +1 -0
  379. package/dist/plugins/workers/worker.d.ts +15 -4
  380. package/dist/plugins/workers/worker.d.ts.map +1 -1
  381. package/dist/testing/conformance.d.ts +106 -0
  382. package/dist/testing/conformance.d.ts.map +1 -0
  383. package/dist/testing/conformance.js +1463 -0
  384. package/dist/testing/conformance.js.map +1 -0
  385. package/dist/testing/node-platform.d.ts.map +1 -1
  386. package/dist/testing/node-platform.js +5 -0
  387. package/dist/testing/node-platform.js.map +1 -1
  388. package/dist/testing/test-harness.d.ts +11 -1
  389. package/dist/testing/test-harness.d.ts.map +1 -1
  390. package/dist/testing/test-harness.js +17 -37
  391. package/dist/testing/test-harness.js.map +1 -1
  392. package/dist/testing/wait-helpers.d.ts.map +1 -1
  393. package/dist/testing/wait-helpers.js +1 -3
  394. package/dist/testing/wait-helpers.js.map +1 -1
  395. package/dist/transport/adapter/client-adapter.d.ts +6 -0
  396. package/dist/transport/adapter/client-adapter.d.ts.map +1 -1
  397. package/dist/transport/adapter/client-adapter.js +50 -3
  398. package/dist/transport/adapter/client-adapter.js.map +1 -1
  399. package/dist/transport/adapter/heartbeat.d.ts +16 -0
  400. package/dist/transport/adapter/heartbeat.d.ts.map +1 -0
  401. package/dist/transport/adapter/heartbeat.js +41 -0
  402. package/dist/transport/adapter/heartbeat.js.map +1 -0
  403. package/dist/transport/adapter/server-adapter.d.ts.map +1 -1
  404. package/dist/transport/adapter/server-adapter.js +6 -0
  405. package/dist/transport/adapter/server-adapter.js.map +1 -1
  406. package/dist/transport/http/app.d.ts +3 -30
  407. package/dist/transport/http/app.d.ts.map +1 -1
  408. package/dist/transport/http/app.js +3 -7
  409. package/dist/transport/http/app.js.map +1 -1
  410. package/dist/transport/http/context.d.ts +40 -0
  411. package/dist/transport/http/context.d.ts.map +1 -0
  412. package/dist/transport/http/context.js +17 -0
  413. package/dist/transport/http/context.js.map +1 -0
  414. package/dist/transport/http/fetch-guard.d.ts +49 -0
  415. package/dist/transport/http/fetch-guard.d.ts.map +1 -0
  416. package/dist/transport/http/fetch-guard.js +312 -0
  417. package/dist/transport/http/fetch-guard.js.map +1 -0
  418. package/dist/transport/http/index.d.ts +1 -1
  419. package/dist/transport/http/index.d.ts.map +1 -1
  420. package/dist/transport/http/middleware/bearer-auth.d.ts +1 -1
  421. package/dist/transport/http/middleware/bearer-auth.d.ts.map +1 -1
  422. package/dist/transport/http/middleware/error-handler.d.ts +2 -2
  423. package/dist/transport/http/middleware/error-handler.d.ts.map +1 -1
  424. package/dist/transport/http/path-containment.d.ts +20 -0
  425. package/dist/transport/http/path-containment.d.ts.map +1 -0
  426. package/dist/transport/http/path-containment.js +31 -0
  427. package/dist/transport/http/path-containment.js.map +1 -0
  428. package/dist/transport/http/responses.d.ts +30 -0
  429. package/dist/transport/http/responses.d.ts.map +1 -0
  430. package/dist/transport/http/responses.js +5 -0
  431. package/dist/transport/http/responses.js.map +1 -0
  432. package/dist/transport/http/routes/files.d.ts +1 -1
  433. package/dist/transport/http/routes/files.d.ts.map +1 -1
  434. package/dist/transport/http/routes/files.js +54 -155
  435. package/dist/transport/http/routes/files.js.map +1 -1
  436. package/dist/transport/http/routes/resources.d.ts +1 -1
  437. package/dist/transport/http/routes/resources.d.ts.map +1 -1
  438. package/dist/transport/http/routes/resources.js +92 -57
  439. package/dist/transport/http/routes/resources.js.map +1 -1
  440. package/dist/transport/http/routes/rpc.d.ts +6 -1
  441. package/dist/transport/http/routes/rpc.d.ts.map +1 -1
  442. package/dist/transport/http/routes/rpc.js +51 -21
  443. package/dist/transport/http/routes/rpc.js.map +1 -1
  444. package/dist/transport/http/routes/upload.d.ts +1 -1
  445. package/dist/transport/http/routes/upload.d.ts.map +1 -1
  446. package/dist/transport/http/routes/upload.js +256 -169
  447. package/dist/transport/http/routes/upload.js.map +1 -1
  448. package/dist/user-config.d.ts +34 -7
  449. package/dist/user-config.d.ts.map +1 -1
  450. package/dist/user-config.js +71 -0
  451. package/dist/user-config.js.map +1 -1
  452. package/package.json +18 -8
  453. package/src/bootstrap.ts +119 -35
  454. package/src/bun-platform/fs.ts +1 -0
  455. package/src/bun-platform/index.ts +18 -1
  456. package/src/bun-platform/server-lifecycle.ts +218 -0
  457. package/src/bun-platform/shell.ts +362 -0
  458. package/src/config.ts +130 -0
  459. package/src/core/agents/agent.ts +219 -95
  460. package/src/core/agents/config.ts +8 -0
  461. package/src/core/agents/retry.ts +16 -17
  462. package/src/core/agents/state.ts +28 -0
  463. package/src/core/context/state.ts +4 -0
  464. package/src/core/events/base-event-store.ts +24 -16
  465. package/src/core/events/file.ts +198 -22
  466. package/src/core/file-store/containment.ts +75 -0
  467. package/src/core/file-store/file-store.ts +106 -25
  468. package/src/core/file-store/types.ts +14 -1
  469. package/src/core/image/image-processor.ts +3 -1
  470. package/src/core/image/types.ts +2 -0
  471. package/src/core/image/vips-resizer.ts +102 -37
  472. package/src/core/llm/anthropic.ts +127 -82
  473. package/src/core/llm/logger.ts +175 -37
  474. package/src/core/llm/openrouter.ts +82 -81
  475. package/src/core/llm/provider-request.ts +40 -0
  476. package/src/core/llm/provider.ts +72 -3
  477. package/src/core/llm/state.ts +12 -0
  478. package/src/core/plugins/plugin-builder.ts +106 -14
  479. package/src/core/preset/preset-builder.ts +12 -22
  480. package/src/core/sessions/context.ts +18 -0
  481. package/src/core/sessions/runtime-activity.ts +78 -0
  482. package/src/core/sessions/schema.ts +29 -3
  483. package/src/core/sessions/session-manager.ts +560 -140
  484. package/src/core/sessions/session-store.ts +38 -0
  485. package/src/core/sessions/session.ts +187 -47
  486. package/src/core/sessions/state.ts +16 -0
  487. package/src/core/system.ts +15 -0
  488. package/src/core/wake-key.ts +65 -0
  489. package/src/index.ts +31 -12
  490. package/src/lib/archive/archive-inspection.fixtures.ts +138 -0
  491. package/src/lib/archive/archive-inspection.ts +359 -0
  492. package/src/lib/archive/index.ts +17 -0
  493. package/src/lib/logger/console.ts +7 -57
  494. package/src/lib/logger/file.ts +28 -50
  495. package/src/lib/logger/index.ts +3 -1
  496. package/src/lib/logger/jsonl.ts +36 -0
  497. package/src/lib/logger/logger.ts +48 -0
  498. package/src/lib/logger/session-log.ts +42 -0
  499. package/src/lib/utils/concurrency.ts +37 -8
  500. package/src/lib/utils/fs-batch.ts +49 -0
  501. package/src/lib/utils/result.ts +7 -31
  502. package/src/lib/utils/sleep.ts +23 -0
  503. package/src/platform/fs-revision.ts +21 -0
  504. package/src/platform/fs.ts +109 -1
  505. package/src/platform/git.ts +67 -0
  506. package/src/platform/index.ts +51 -1
  507. package/src/platform/llm-call-log.ts +86 -0
  508. package/src/platform/scheduler.ts +71 -0
  509. package/src/platform/session-log.ts +39 -0
  510. package/src/platform/shell.ts +89 -0
  511. package/src/plugins/agent-status/plugin.ts +1 -0
  512. package/src/plugins/agents/plugin.ts +134 -81
  513. package/src/plugins/filesystem/listing.ts +70 -12
  514. package/src/plugins/filesystem/plugin.ts +8 -6
  515. package/src/plugins/git-status/plugin.ts +204 -77
  516. package/src/plugins/llm-debug/plugin.ts +1 -0
  517. package/src/plugins/logs/plugin.ts +9 -0
  518. package/src/plugins/mailbox/plugin.ts +46 -64
  519. package/src/plugins/mailbox/query.ts +15 -7
  520. package/src/plugins/mailbox/state.ts +1 -0
  521. package/src/plugins/resources/filename.ts +19 -0
  522. package/src/plugins/resources/plugin.ts +111 -59
  523. package/src/plugins/result-eviction/plugin.ts +6 -1
  524. package/src/plugins/services/plugin.ts +254 -98
  525. package/src/plugins/services/prompt.ts +1 -6
  526. package/src/plugins/services/schema.ts +17 -3
  527. package/src/plugins/services/service.ts +702 -252
  528. package/src/plugins/session-lifecycle/plugin.ts +56 -41
  529. package/src/plugins/session-state/plugin.ts +242 -88
  530. package/src/plugins/session-stats/plugin.ts +1 -0
  531. package/src/plugins/shell/executor.ts +144 -226
  532. package/src/plugins/shell/index.ts +1 -4
  533. package/src/plugins/shell/plugin.ts +7 -9
  534. package/src/plugins/skills/discovery.ts +10 -8
  535. package/src/plugins/skills/index.ts +1 -1
  536. package/src/plugins/skills/plugin.ts +19 -27
  537. package/src/plugins/skills/prompts.ts +3 -3
  538. package/src/plugins/skills/schema.ts +5 -2
  539. package/src/plugins/uploads/plugin.ts +991 -273
  540. package/src/plugins/uploads/preprocessor.ts +25 -0
  541. package/src/plugins/uploads/preprocessors/image-classifier.ts +56 -25
  542. package/src/plugins/uploads/preprocessors/markitdown-preprocessor.ts +41 -15
  543. package/src/plugins/uploads/preprocessors/pdf-preprocessor.ts +32 -16
  544. package/src/plugins/uploads/preprocessors/zip-preprocessor.ts +67 -38
  545. package/src/plugins/uploads/schema.ts +30 -3
  546. package/src/plugins/uploads/state.ts +12 -0
  547. package/src/plugins/user-chat/plugin.ts +196 -40
  548. package/src/plugins/workers/context.ts +102 -39
  549. package/src/plugins/workers/definition.ts +7 -0
  550. package/src/plugins/workers/index.ts +4 -4
  551. package/src/plugins/workers/plugin.ts +461 -151
  552. package/src/plugins/workers/state.ts +64 -0
  553. package/src/plugins/workers/worker.ts +15 -4
  554. package/src/testing/conformance.ts +1751 -0
  555. package/src/testing/node-platform.ts +5 -0
  556. package/src/testing/test-harness.ts +21 -38
  557. package/src/testing/wait-helpers.ts +1 -4
  558. package/src/transport/adapter/client-adapter.ts +60 -3
  559. package/src/transport/adapter/heartbeat.ts +50 -0
  560. package/src/transport/adapter/server-adapter.ts +6 -0
  561. package/src/transport/http/app.ts +7 -35
  562. package/src/transport/http/context.ts +46 -0
  563. package/src/transport/http/fetch-guard.ts +318 -0
  564. package/src/transport/http/index.ts +1 -1
  565. package/src/transport/http/middleware/bearer-auth.ts +1 -1
  566. package/src/transport/http/middleware/error-handler.ts +1 -1
  567. package/src/transport/http/path-containment.ts +44 -0
  568. package/src/transport/http/responses.ts +20 -0
  569. package/src/transport/http/routes/files.ts +69 -159
  570. package/src/transport/http/routes/resources.ts +124 -93
  571. package/src/transport/http/routes/rpc.ts +63 -26
  572. package/src/transport/http/routes/upload.ts +327 -258
  573. package/src/user-config.ts +93 -7
  574. package/dist/config.test.d.ts +0 -2
  575. package/dist/config.test.d.ts.map +0 -1
  576. package/dist/config.test.js +0 -155
  577. package/dist/config.test.js.map +0 -1
  578. package/dist/core/agent-loop.integration.test.d.ts +0 -2
  579. package/dist/core/agent-loop.integration.test.d.ts.map +0 -1
  580. package/dist/core/agent-loop.integration.test.js +0 -414
  581. package/dist/core/agent-loop.integration.test.js.map +0 -1
  582. package/dist/core/agents/agent-config.test.d.ts +0 -2
  583. package/dist/core/agents/agent-config.test.d.ts.map +0 -1
  584. package/dist/core/agents/agent-config.test.js +0 -194
  585. package/dist/core/agents/agent-config.test.js.map +0 -1
  586. package/dist/core/agents/agent-shutdown.test.d.ts +0 -6
  587. package/dist/core/agents/agent-shutdown.test.d.ts.map +0 -1
  588. package/dist/core/agents/agent-shutdown.test.js +0 -180
  589. package/dist/core/agents/agent-shutdown.test.js.map +0 -1
  590. package/dist/core/agents/agent.test.d.ts +0 -2
  591. package/dist/core/agents/agent.test.d.ts.map +0 -1
  592. package/dist/core/agents/agent.test.js +0 -313
  593. package/dist/core/agents/agent.test.js.map +0 -1
  594. package/dist/core/agents/communicator.d.ts +0 -3
  595. package/dist/core/agents/communicator.d.ts.map +0 -1
  596. package/dist/core/agents/communicator.js +0 -13
  597. package/dist/core/agents/communicator.js.map +0 -1
  598. package/dist/core/agents/handler-events.test.d.ts +0 -5
  599. package/dist/core/agents/handler-events.test.d.ts.map +0 -1
  600. package/dist/core/agents/handler-events.test.js +0 -115
  601. package/dist/core/agents/handler-events.test.js.map +0 -1
  602. package/dist/core/agents/response-sanitizer.test.d.ts +0 -2
  603. package/dist/core/agents/response-sanitizer.test.d.ts.map +0 -1
  604. package/dist/core/agents/response-sanitizer.test.js +0 -101
  605. package/dist/core/agents/response-sanitizer.test.js.map +0 -1
  606. package/dist/core/error-recovery.integration.test.d.ts +0 -2
  607. package/dist/core/error-recovery.integration.test.d.ts.map +0 -1
  608. package/dist/core/error-recovery.integration.test.js +0 -288
  609. package/dist/core/error-recovery.integration.test.js.map +0 -1
  610. package/dist/core/event-sourcing.integration.test.d.ts +0 -2
  611. package/dist/core/event-sourcing.integration.test.d.ts.map +0 -1
  612. package/dist/core/event-sourcing.integration.test.js +0 -154
  613. package/dist/core/event-sourcing.integration.test.js.map +0 -1
  614. package/dist/core/events/file.test.d.ts +0 -2
  615. package/dist/core/events/file.test.d.ts.map +0 -1
  616. package/dist/core/events/file.test.js +0 -284
  617. package/dist/core/events/file.test.js.map +0 -1
  618. package/dist/core/events/memory.test.d.ts +0 -2
  619. package/dist/core/events/memory.test.d.ts.map +0 -1
  620. package/dist/core/events/memory.test.js +0 -502
  621. package/dist/core/events/memory.test.js.map +0 -1
  622. package/dist/core/image/image-processor.test.d.ts +0 -2
  623. package/dist/core/image/image-processor.test.d.ts.map +0 -1
  624. package/dist/core/image/image-processor.test.js +0 -171
  625. package/dist/core/image/image-processor.test.js.map +0 -1
  626. package/dist/core/image/vips-resizer.test.d.ts +0 -2
  627. package/dist/core/image/vips-resizer.test.d.ts.map +0 -1
  628. package/dist/core/image/vips-resizer.test.js +0 -336
  629. package/dist/core/image/vips-resizer.test.js.map +0 -1
  630. package/dist/core/llm/anthropic.test.d.ts +0 -2
  631. package/dist/core/llm/anthropic.test.d.ts.map +0 -1
  632. package/dist/core/llm/anthropic.test.js +0 -464
  633. package/dist/core/llm/anthropic.test.js.map +0 -1
  634. package/dist/core/llm/cache-breakpoints.test.d.ts +0 -2
  635. package/dist/core/llm/cache-breakpoints.test.d.ts.map +0 -1
  636. package/dist/core/llm/cache-breakpoints.test.js +0 -69
  637. package/dist/core/llm/cache-breakpoints.test.js.map +0 -1
  638. package/dist/core/llm/cache-live.test.d.ts +0 -16
  639. package/dist/core/llm/cache-live.test.d.ts.map +0 -1
  640. package/dist/core/llm/cache-live.test.js +0 -137
  641. package/dist/core/llm/cache-live.test.js.map +0 -1
  642. package/dist/core/llm/logger.test.d.ts +0 -7
  643. package/dist/core/llm/logger.test.d.ts.map +0 -1
  644. package/dist/core/llm/logger.test.js +0 -228
  645. package/dist/core/llm/logger.test.js.map +0 -1
  646. package/dist/core/llm/message-sanitization.test.d.ts +0 -2
  647. package/dist/core/llm/message-sanitization.test.d.ts.map +0 -1
  648. package/dist/core/llm/message-sanitization.test.js +0 -181
  649. package/dist/core/llm/message-sanitization.test.js.map +0 -1
  650. package/dist/core/llm/mock.test.d.ts +0 -2
  651. package/dist/core/llm/mock.test.d.ts.map +0 -1
  652. package/dist/core/llm/mock.test.js +0 -318
  653. package/dist/core/llm/mock.test.js.map +0 -1
  654. package/dist/core/llm/openrouter-mapping.test.d.ts +0 -2
  655. package/dist/core/llm/openrouter-mapping.test.d.ts.map +0 -1
  656. package/dist/core/llm/openrouter-mapping.test.js +0 -172
  657. package/dist/core/llm/openrouter-mapping.test.js.map +0 -1
  658. package/dist/core/llm/openrouter.test.d.ts +0 -2
  659. package/dist/core/llm/openrouter.test.d.ts.map +0 -1
  660. package/dist/core/llm/openrouter.test.js +0 -377
  661. package/dist/core/llm/openrouter.test.js.map +0 -1
  662. package/dist/core/llm/provider-integration.test.d.ts +0 -12
  663. package/dist/core/llm/provider-integration.test.d.ts.map +0 -1
  664. package/dist/core/llm/provider-integration.test.js +0 -350
  665. package/dist/core/llm/provider-integration.test.js.map +0 -1
  666. package/dist/core/llm/routing-provider.test.d.ts +0 -2
  667. package/dist/core/llm/routing-provider.test.d.ts.map +0 -1
  668. package/dist/core/llm/routing-provider.test.js +0 -94
  669. package/dist/core/llm/routing-provider.test.js.map +0 -1
  670. package/dist/core/llm/snapshot-middleware.test.d.ts +0 -2
  671. package/dist/core/llm/snapshot-middleware.test.d.ts.map +0 -1
  672. package/dist/core/llm/snapshot-middleware.test.js +0 -144
  673. package/dist/core/llm/snapshot-middleware.test.js.map +0 -1
  674. package/dist/core/multi-agent.integration.test.d.ts +0 -2
  675. package/dist/core/multi-agent.integration.test.d.ts.map +0 -1
  676. package/dist/core/multi-agent.integration.test.js +0 -298
  677. package/dist/core/multi-agent.integration.test.js.map +0 -1
  678. package/dist/core/plugin-hooks.integration.test.d.ts +0 -2
  679. package/dist/core/plugin-hooks.integration.test.d.ts.map +0 -1
  680. package/dist/core/plugin-hooks.integration.test.js +0 -458
  681. package/dist/core/plugin-hooks.integration.test.js.map +0 -1
  682. package/dist/core/session-lifecycle.integration.test.d.ts +0 -2
  683. package/dist/core/session-lifecycle.integration.test.d.ts.map +0 -1
  684. package/dist/core/session-lifecycle.integration.test.js +0 -159
  685. package/dist/core/session-lifecycle.integration.test.js.map +0 -1
  686. package/dist/core/sessions/fork-utils.test.d.ts +0 -2
  687. package/dist/core/sessions/fork-utils.test.d.ts.map +0 -1
  688. package/dist/core/sessions/fork-utils.test.js +0 -129
  689. package/dist/core/sessions/fork-utils.test.js.map +0 -1
  690. package/dist/core/sessions/session-overrides.integration.test.d.ts +0 -2
  691. package/dist/core/sessions/session-overrides.integration.test.d.ts.map +0 -1
  692. package/dist/core/sessions/session-overrides.integration.test.js +0 -154
  693. package/dist/core/sessions/session-overrides.integration.test.js.map +0 -1
  694. package/dist/core/sessions/session.test.d.ts +0 -2
  695. package/dist/core/sessions/session.test.d.ts.map +0 -1
  696. package/dist/core/sessions/session.test.js +0 -1100
  697. package/dist/core/sessions/session.test.js.map +0 -1
  698. package/dist/core/tools/executor.test.d.ts +0 -2
  699. package/dist/core/tools/executor.test.d.ts.map +0 -1
  700. package/dist/core/tools/executor.test.js +0 -144
  701. package/dist/core/tools/executor.test.js.map +0 -1
  702. package/dist/lib/logger/console.test.d.ts +0 -2
  703. package/dist/lib/logger/console.test.d.ts.map +0 -1
  704. package/dist/lib/logger/console.test.js +0 -258
  705. package/dist/lib/logger/console.test.js.map +0 -1
  706. package/dist/lib/never.d.ts +0 -2
  707. package/dist/lib/never.d.ts.map +0 -1
  708. package/dist/lib/never.js +0 -4
  709. package/dist/lib/never.js.map +0 -1
  710. package/dist/lib/utils/concurrency.test.d.ts +0 -2
  711. package/dist/lib/utils/concurrency.test.d.ts.map +0 -1
  712. package/dist/lib/utils/concurrency.test.js +0 -135
  713. package/dist/lib/utils/concurrency.test.js.map +0 -1
  714. package/dist/plugins/agent-status/agent-status.test.d.ts +0 -2
  715. package/dist/plugins/agent-status/agent-status.test.d.ts.map +0 -1
  716. package/dist/plugins/agent-status/agent-status.test.js +0 -136
  717. package/dist/plugins/agent-status/agent-status.test.js.map +0 -1
  718. package/dist/plugins/agents/agents.integration.test.d.ts +0 -2
  719. package/dist/plugins/agents/agents.integration.test.d.ts.map +0 -1
  720. package/dist/plugins/agents/agents.integration.test.js +0 -830
  721. package/dist/plugins/agents/agents.integration.test.js.map +0 -1
  722. package/dist/plugins/agents/supervision.integration.test.d.ts +0 -2
  723. package/dist/plugins/agents/supervision.integration.test.d.ts.map +0 -1
  724. package/dist/plugins/agents/supervision.integration.test.js +0 -215
  725. package/dist/plugins/agents/supervision.integration.test.js.map +0 -1
  726. package/dist/plugins/context-compact/compaction-live.test.d.ts +0 -17
  727. package/dist/plugins/context-compact/compaction-live.test.d.ts.map +0 -1
  728. package/dist/plugins/context-compact/compaction-live.test.js +0 -177
  729. package/dist/plugins/context-compact/compaction-live.test.js.map +0 -1
  730. package/dist/plugins/context-compact/context-compact.integration.test.d.ts +0 -2
  731. package/dist/plugins/context-compact/context-compact.integration.test.d.ts.map +0 -1
  732. package/dist/plugins/context-compact/context-compact.integration.test.js +0 -364
  733. package/dist/plugins/context-compact/context-compact.integration.test.js.map +0 -1
  734. package/dist/plugins/context-compact/context-compactor.test.d.ts +0 -2
  735. package/dist/plugins/context-compact/context-compactor.test.d.ts.map +0 -1
  736. package/dist/plugins/context-compact/context-compactor.test.js +0 -858
  737. package/dist/plugins/context-compact/context-compactor.test.js.map +0 -1
  738. package/dist/plugins/context-compact/history-offloader.test.d.ts +0 -2
  739. package/dist/plugins/context-compact/history-offloader.test.d.ts.map +0 -1
  740. package/dist/plugins/context-compact/history-offloader.test.js +0 -77
  741. package/dist/plugins/context-compact/history-offloader.test.js.map +0 -1
  742. package/dist/plugins/filesystem/filesystem.integration.test.d.ts +0 -2
  743. package/dist/plugins/filesystem/filesystem.integration.test.d.ts.map +0 -1
  744. package/dist/plugins/filesystem/filesystem.integration.test.js +0 -447
  745. package/dist/plugins/filesystem/filesystem.integration.test.js.map +0 -1
  746. package/dist/plugins/filesystem/schema.d.ts +0 -7
  747. package/dist/plugins/filesystem/schema.d.ts.map +0 -1
  748. package/dist/plugins/filesystem/schema.js +0 -2
  749. package/dist/plugins/filesystem/schema.js.map +0 -1
  750. package/dist/plugins/limits-guard/limit-guard.test.d.ts +0 -2
  751. package/dist/plugins/limits-guard/limit-guard.test.d.ts.map +0 -1
  752. package/dist/plugins/limits-guard/limit-guard.test.js +0 -194
  753. package/dist/plugins/limits-guard/limit-guard.test.js.map +0 -1
  754. package/dist/plugins/limits-guard/limits-guard.integration.test.d.ts +0 -2
  755. package/dist/plugins/limits-guard/limits-guard.integration.test.d.ts.map +0 -1
  756. package/dist/plugins/limits-guard/limits-guard.integration.test.js +0 -887
  757. package/dist/plugins/limits-guard/limits-guard.integration.test.js.map +0 -1
  758. package/dist/plugins/llm-debug/llm-debug.integration.test.d.ts +0 -2
  759. package/dist/plugins/llm-debug/llm-debug.integration.test.d.ts.map +0 -1
  760. package/dist/plugins/llm-debug/llm-debug.integration.test.js +0 -157
  761. package/dist/plugins/llm-debug/llm-debug.integration.test.js.map +0 -1
  762. package/dist/plugins/mailbox/mailbox.integration.test.d.ts +0 -2
  763. package/dist/plugins/mailbox/mailbox.integration.test.d.ts.map +0 -1
  764. package/dist/plugins/mailbox/mailbox.integration.test.js +0 -678
  765. package/dist/plugins/mailbox/mailbox.integration.test.js.map +0 -1
  766. package/dist/plugins/resources/resources.integration.test.d.ts +0 -2
  767. package/dist/plugins/resources/resources.integration.test.d.ts.map +0 -1
  768. package/dist/plugins/resources/resources.integration.test.js +0 -62
  769. package/dist/plugins/resources/resources.integration.test.js.map +0 -1
  770. package/dist/plugins/result-eviction/result-eviction.integration.test.d.ts +0 -2
  771. package/dist/plugins/result-eviction/result-eviction.integration.test.d.ts.map +0 -1
  772. package/dist/plugins/result-eviction/result-eviction.integration.test.js +0 -294
  773. package/dist/plugins/result-eviction/result-eviction.integration.test.js.map +0 -1
  774. package/dist/plugins/services/pid-registry.test.d.ts +0 -2
  775. package/dist/plugins/services/pid-registry.test.d.ts.map +0 -1
  776. package/dist/plugins/services/pid-registry.test.js +0 -161
  777. package/dist/plugins/services/pid-registry.test.js.map +0 -1
  778. package/dist/plugins/services/services.integration.test.d.ts +0 -2
  779. package/dist/plugins/services/services.integration.test.d.ts.map +0 -1
  780. package/dist/plugins/services/services.integration.test.js +0 -1057
  781. package/dist/plugins/services/services.integration.test.js.map +0 -1
  782. package/dist/plugins/session-lifecycle/session-lifecycle.integration.test.d.ts +0 -2
  783. package/dist/plugins/session-lifecycle/session-lifecycle.integration.test.d.ts.map +0 -1
  784. package/dist/plugins/session-lifecycle/session-lifecycle.integration.test.js +0 -498
  785. package/dist/plugins/session-lifecycle/session-lifecycle.integration.test.js.map +0 -1
  786. package/dist/plugins/session-stats/plugin.test.d.ts +0 -2
  787. package/dist/plugins/session-stats/plugin.test.d.ts.map +0 -1
  788. package/dist/plugins/session-stats/plugin.test.js +0 -145
  789. package/dist/plugins/session-stats/plugin.test.js.map +0 -1
  790. package/dist/plugins/shell/shell.integration.test.d.ts +0 -2
  791. package/dist/plugins/shell/shell.integration.test.d.ts.map +0 -1
  792. package/dist/plugins/shell/shell.integration.test.js +0 -234
  793. package/dist/plugins/shell/shell.integration.test.js.map +0 -1
  794. package/dist/plugins/shell/shell.test.d.ts +0 -2
  795. package/dist/plugins/shell/shell.test.d.ts.map +0 -1
  796. package/dist/plugins/shell/shell.test.js +0 -236
  797. package/dist/plugins/shell/shell.test.js.map +0 -1
  798. package/dist/plugins/skills/discovery.test.d.ts +0 -2
  799. package/dist/plugins/skills/discovery.test.d.ts.map +0 -1
  800. package/dist/plugins/skills/discovery.test.js +0 -312
  801. package/dist/plugins/skills/discovery.test.js.map +0 -1
  802. package/dist/plugins/skills/skills.integration.test.d.ts +0 -2
  803. package/dist/plugins/skills/skills.integration.test.d.ts.map +0 -1
  804. package/dist/plugins/skills/skills.integration.test.js +0 -475
  805. package/dist/plugins/skills/skills.integration.test.js.map +0 -1
  806. package/dist/plugins/todo/todo.integration.test.d.ts +0 -2
  807. package/dist/plugins/todo/todo.integration.test.d.ts.map +0 -1
  808. package/dist/plugins/todo/todo.integration.test.js +0 -605
  809. package/dist/plugins/todo/todo.integration.test.js.map +0 -1
  810. package/dist/plugins/uploads/preprocessors/image-classifier.test.d.ts +0 -2
  811. package/dist/plugins/uploads/preprocessors/image-classifier.test.d.ts.map +0 -1
  812. package/dist/plugins/uploads/preprocessors/image-classifier.test.js +0 -113
  813. package/dist/plugins/uploads/preprocessors/image-classifier.test.js.map +0 -1
  814. package/dist/plugins/uploads/uploads.integration.test.d.ts +0 -2
  815. package/dist/plugins/uploads/uploads.integration.test.d.ts.map +0 -1
  816. package/dist/plugins/uploads/uploads.integration.test.js +0 -639
  817. package/dist/plugins/uploads/uploads.integration.test.js.map +0 -1
  818. package/dist/plugins/user-chat/user-chat.integration.test.d.ts +0 -2
  819. package/dist/plugins/user-chat/user-chat.integration.test.d.ts.map +0 -1
  820. package/dist/plugins/user-chat/user-chat.integration.test.js +0 -754
  821. package/dist/plugins/user-chat/user-chat.integration.test.js.map +0 -1
  822. package/dist/plugins/workers/workers.integration.test.d.ts +0 -2
  823. package/dist/plugins/workers/workers.integration.test.d.ts.map +0 -1
  824. package/dist/plugins/workers/workers.integration.test.js +0 -629
  825. package/dist/plugins/workers/workers.integration.test.js.map +0 -1
  826. package/dist/prompts/macros.test.d.ts +0 -2
  827. package/dist/prompts/macros.test.d.ts.map +0 -1
  828. package/dist/prompts/macros.test.js +0 -80
  829. package/dist/prompts/macros.test.js.map +0 -1
  830. package/dist/testing/test-harness.test.d.ts +0 -2
  831. package/dist/testing/test-harness.test.d.ts.map +0 -1
  832. package/dist/testing/test-harness.test.js +0 -92
  833. package/dist/testing/test-harness.test.js.map +0 -1
  834. package/dist/transport/http/routes/rpc.integration.test.d.ts +0 -2
  835. package/dist/transport/http/routes/rpc.integration.test.d.ts.map +0 -1
  836. package/dist/transport/http/routes/rpc.integration.test.js +0 -189
  837. package/dist/transport/http/routes/rpc.integration.test.js.map +0 -1
  838. package/dist/transport/http/routes/rpc.test.d.ts +0 -2
  839. package/dist/transport/http/routes/rpc.test.d.ts.map +0 -1
  840. package/dist/transport/http/routes/rpc.test.js +0 -316
  841. package/dist/transport/http/routes/rpc.test.js.map +0 -1
  842. package/src/config.test.ts +0 -174
  843. package/src/core/agent-loop.integration.test.ts +0 -503
  844. package/src/core/agents/agent-config.test.ts +0 -240
  845. package/src/core/agents/agent-shutdown.test.ts +0 -236
  846. package/src/core/agents/agent.test.ts +0 -387
  847. package/src/core/agents/communicator.ts +0 -16
  848. package/src/core/agents/handler-events.test.ts +0 -167
  849. package/src/core/agents/response-sanitizer.test.ts +0 -137
  850. package/src/core/error-recovery.integration.test.ts +0 -343
  851. package/src/core/event-sourcing.integration.test.ts +0 -191
  852. package/src/core/events/file.test.ts +0 -436
  853. package/src/core/events/memory.test.ts +0 -741
  854. package/src/core/image/image-processor.test.ts +0 -218
  855. package/src/core/image/vips-resizer.test.ts +0 -388
  856. package/src/core/llm/anthropic.test.ts +0 -546
  857. package/src/core/llm/cache-breakpoints.test.ts +0 -85
  858. package/src/core/llm/cache-live.test.ts +0 -155
  859. package/src/core/llm/logger.test.ts +0 -270
  860. package/src/core/llm/message-sanitization.test.ts +0 -217
  861. package/src/core/llm/mock.test.ts +0 -402
  862. package/src/core/llm/openrouter-mapping.test.ts +0 -210
  863. package/src/core/llm/openrouter.test.ts +0 -499
  864. package/src/core/llm/provider-integration.test.ts +0 -408
  865. package/src/core/llm/routing-provider.test.ts +0 -113
  866. package/src/core/llm/snapshot-middleware.test.ts +0 -168
  867. package/src/core/multi-agent.integration.test.ts +0 -340
  868. package/src/core/plugin-hooks.integration.test.ts +0 -568
  869. package/src/core/session-lifecycle.integration.test.ts +0 -202
  870. package/src/core/sessions/fork-utils.test.ts +0 -158
  871. package/src/core/sessions/session-overrides.integration.test.ts +0 -210
  872. package/src/core/sessions/session.test.ts +0 -1736
  873. package/src/core/tools/executor.test.ts +0 -161
  874. package/src/lib/logger/console.test.ts +0 -348
  875. package/src/lib/never.ts +0 -3
  876. package/src/lib/utils/concurrency.test.ts +0 -169
  877. package/src/plugins/agent-status/agent-status.test.ts +0 -164
  878. package/src/plugins/agents/agents.integration.test.ts +0 -976
  879. package/src/plugins/agents/supervision.integration.test.ts +0 -249
  880. package/src/plugins/context-compact/compaction-live.test.ts +0 -221
  881. package/src/plugins/context-compact/context-compact.integration.test.ts +0 -418
  882. package/src/plugins/context-compact/context-compactor.test.ts +0 -1036
  883. package/src/plugins/context-compact/history-offloader.test.ts +0 -100
  884. package/src/plugins/filesystem/filesystem.integration.test.ts +0 -529
  885. package/src/plugins/filesystem/schema.ts +0 -6
  886. package/src/plugins/limits-guard/limit-guard.test.ts +0 -253
  887. package/src/plugins/limits-guard/limits-guard.integration.test.ts +0 -1012
  888. package/src/plugins/llm-debug/llm-debug.integration.test.ts +0 -192
  889. package/src/plugins/mailbox/mailbox.integration.test.ts +0 -794
  890. package/src/plugins/resources/resources.integration.test.ts +0 -68
  891. package/src/plugins/result-eviction/result-eviction.integration.test.ts +0 -332
  892. package/src/plugins/services/pid-registry.test.ts +0 -180
  893. package/src/plugins/services/services.integration.test.ts +0 -1223
  894. package/src/plugins/session-lifecycle/session-lifecycle.integration.test.ts +0 -639
  895. package/src/plugins/session-stats/plugin.test.ts +0 -160
  896. package/src/plugins/shell/shell.integration.test.ts +0 -273
  897. package/src/plugins/shell/shell.test.ts +0 -314
  898. package/src/plugins/skills/discovery.test.ts +0 -395
  899. package/src/plugins/skills/skills.integration.test.ts +0 -580
  900. package/src/plugins/todo/todo.integration.test.ts +0 -687
  901. package/src/plugins/uploads/preprocessors/image-classifier.test.ts +0 -142
  902. package/src/plugins/uploads/uploads.integration.test.ts +0 -831
  903. package/src/plugins/user-chat/user-chat.integration.test.ts +0 -893
  904. package/src/plugins/workers/workers.integration.test.ts +0 -778
  905. package/src/prompts/macros.test.ts +0 -107
  906. package/src/testing/test-harness.test.ts +0 -114
  907. package/src/transport/http/routes/rpc.integration.test.ts +0 -243
  908. package/src/transport/http/routes/rpc.test.ts +0 -372
@@ -1,546 +0,0 @@
1
- import { describe, expect, test } from 'bun:test'
2
- import type { LLMMessage } from '~/core/agents/state.js'
3
- import { ModelId } from '~/core/llm/schema.js'
4
- import { ToolCallId } from '~/core/tools/schema.js'
5
- import { AnthropicProvider } from './anthropic.js'
6
- import { applyCacheBreakpoint } from './cache-breakpoints.js'
7
- import type { RawInferenceRequest } from './provider.js'
8
-
9
- // ============================================================================
10
- // Helpers — access private methods via prototype for testing
11
- // ============================================================================
12
-
13
- const createProvider = () =>
14
- new AnthropicProvider({
15
- apiKey: 'test-key',
16
- imageProcessor: {
17
- resolveContent: async (content) => content,
18
- },
19
- })
20
-
21
- // Access private methods for unit testing the mapping logic
22
- const provider = createProvider()
23
- const mapMessage = (provider as any).mapMessage.bind(provider) as (msg: LLMMessage) => Promise<{ role: string; content: unknown }>
24
- const mergeConsecutiveMessages = (provider as any).mergeConsecutiveMessages.bind(provider) as (
25
- msgs: { role: string; content: unknown }[],
26
- ) => { role: string; content: unknown }[]
27
- const mapStopReason = (provider as any).mapStopReason.bind(provider) as (reason: string | null) => string
28
- const mapError = (provider as any).mapError.bind(provider) as (err: unknown) => unknown
29
-
30
- // ============================================================================
31
- // Message Mapping
32
- // ============================================================================
33
-
34
- describe('AnthropicProvider message mapping', () => {
35
- test('maps user message with string content', async () => {
36
- const result = await mapMessage({ role: 'user', content: 'Hello' })
37
- expect(result).toEqual({ role: 'user', content: 'Hello' })
38
- })
39
-
40
- test('maps user message with multimodal content', async () => {
41
- const result = await mapMessage({
42
- role: 'user',
43
- content: [
44
- { type: 'text', text: 'Look at this image' },
45
- { type: 'image_url', imageUrl: { url: 'data:image/png;base64,abc123' } },
46
- ],
47
- })
48
- expect(result).toEqual({
49
- role: 'user',
50
- content: [
51
- { type: 'text', text: 'Look at this image' },
52
- { type: 'image', source: { type: 'base64', media_type: 'image/png', data: 'abc123' } },
53
- ],
54
- })
55
- })
56
-
57
- test('maps user message with HTTP image URL', async () => {
58
- const result = await mapMessage({
59
- role: 'user',
60
- content: [
61
- { type: 'image_url', imageUrl: { url: 'https://example.com/img.jpg' } },
62
- ],
63
- })
64
- expect(result).toEqual({
65
- role: 'user',
66
- content: [
67
- { type: 'image', source: { type: 'url', url: 'https://example.com/img.jpg' } },
68
- ],
69
- })
70
- })
71
-
72
- test('maps assistant message with content only', async () => {
73
- const result = await mapMessage({ role: 'assistant', content: 'Hello back' })
74
- expect(result).toEqual({
75
- role: 'assistant',
76
- content: [{ type: 'text', text: 'Hello back' }],
77
- })
78
- })
79
-
80
- test('maps assistant message with tool calls', async () => {
81
- const result = await mapMessage({
82
- role: 'assistant',
83
- content: 'Let me help',
84
- toolCalls: [{ id: ToolCallId('tc_1'), name: 'search', input: { query: 'test' } }],
85
- })
86
- expect(result).toEqual({
87
- role: 'assistant',
88
- content: [
89
- { type: 'text', text: 'Let me help' },
90
- { type: 'tool_use', id: 'tc_1', name: 'search', input: { query: 'test' } },
91
- ],
92
- })
93
- })
94
-
95
- test('maps assistant message with empty content and tool calls', async () => {
96
- const result = await mapMessage({
97
- role: 'assistant',
98
- content: '',
99
- toolCalls: [{ id: ToolCallId('tc_1'), name: 'search', input: { query: 'test' } }],
100
- })
101
- expect(result).toEqual({
102
- role: 'assistant',
103
- content: [
104
- { type: 'tool_use', id: 'tc_1', name: 'search', input: { query: 'test' } },
105
- ],
106
- })
107
- })
108
-
109
- test('maps tool result to user role with tool_result block', async () => {
110
- const result = await mapMessage({
111
- role: 'tool',
112
- content: 'result data',
113
- toolCallId: ToolCallId('tc_1'),
114
- })
115
- expect(result).toEqual({
116
- role: 'user',
117
- content: [{ type: 'tool_result', tool_use_id: 'tc_1', content: 'result data' }],
118
- })
119
- })
120
-
121
- test('maps tool error result with ERROR prefix', async () => {
122
- const result = await mapMessage({
123
- role: 'tool',
124
- content: 'something failed',
125
- toolCallId: ToolCallId('tc_1'),
126
- isError: true,
127
- })
128
- expect(result).toEqual({
129
- role: 'user',
130
- content: [{ type: 'tool_result', tool_use_id: 'tc_1', content: '[ERROR] something failed' }],
131
- })
132
- })
133
-
134
- test('maps system message to user with [System] prefix', async () => {
135
- const result = await mapMessage({ role: 'system', content: 'Context information' })
136
- expect(result).toEqual({
137
- role: 'user',
138
- content: [{ type: 'text', text: '[System] Context information' }],
139
- })
140
- })
141
- })
142
-
143
- // ============================================================================
144
- // Message Alternation
145
- // ============================================================================
146
-
147
- describe('AnthropicProvider message alternation', () => {
148
- test('merges consecutive user messages', () => {
149
- const messages = [
150
- { role: 'user' as const, content: 'Hello' },
151
- { role: 'user' as const, content: 'How are you?' },
152
- ]
153
- const result = mergeConsecutiveMessages(messages)
154
- expect(result).toEqual([{
155
- role: 'user',
156
- content: [
157
- { type: 'text', text: 'Hello' },
158
- { type: 'text', text: 'How are you?' },
159
- ],
160
- }])
161
- })
162
-
163
- test('merges consecutive user messages with mixed content types', () => {
164
- const messages = [
165
- { role: 'user' as const, content: [{ type: 'tool_result' as const, tool_use_id: 'tc_1', content: 'result1' }] },
166
- { role: 'user' as const, content: [{ type: 'tool_result' as const, tool_use_id: 'tc_2', content: 'result2' }] },
167
- ]
168
- const result = mergeConsecutiveMessages(messages)
169
- expect(result).toHaveLength(1)
170
- expect(result[0].role).toBe('user')
171
- expect(Array.isArray(result[0].content)).toBe(true)
172
- expect((result[0].content as any[]).length).toBe(2)
173
- })
174
-
175
- test('does not merge messages with different roles', () => {
176
- const messages = [
177
- { role: 'user' as const, content: 'Hello' },
178
- { role: 'assistant' as const, content: 'Hi' },
179
- { role: 'user' as const, content: 'How are you?' },
180
- ]
181
- const result = mergeConsecutiveMessages(messages)
182
- expect(result).toHaveLength(3)
183
- })
184
-
185
- test('handles empty input', () => {
186
- expect(mergeConsecutiveMessages([])).toEqual([])
187
- })
188
- })
189
-
190
- // ============================================================================
191
- // Cache Breakpoints
192
- // ============================================================================
193
-
194
- describe('applyCacheBreakpoint (shared helper)', () => {
195
- test('marks the last message when uncachedSuffixCount is 0', () => {
196
- const messages: LLMMessage[] = [
197
- { role: 'user', content: 'Hello' },
198
- { role: 'assistant', content: 'Hi' },
199
- { role: 'user', content: 'Question' },
200
- ]
201
- const result = applyCacheBreakpoint(messages, 0)
202
- expect(result[2].cacheControl).toEqual({ type: 'ephemeral' })
203
- expect(result[0].cacheControl).toBeUndefined()
204
- expect(result[1].cacheControl).toBeUndefined()
205
- })
206
-
207
- test('marks second-to-last when uncachedSuffixCount is 1', () => {
208
- const messages: LLMMessage[] = [
209
- { role: 'user', content: 'Hello' },
210
- { role: 'assistant', content: 'Hi' },
211
- { role: 'user', content: 'Question' },
212
- ]
213
- const result = applyCacheBreakpoint(messages, 1)
214
- expect(result[1].cacheControl).toEqual({ type: 'ephemeral' })
215
- expect(result[2].cacheControl).toBeUndefined()
216
- })
217
-
218
- test('no-op when suffix exceeds message count', () => {
219
- const messages: LLMMessage[] = [{ role: 'user', content: 'Hello' }]
220
- const result = applyCacheBreakpoint(messages, 5)
221
- expect(result[0].cacheControl).toBeUndefined()
222
- })
223
- })
224
-
225
- describe('AnthropicProvider cache breakpoint placement', () => {
226
- test('adds cache_control to last block of flagged user string message', async () => {
227
- const result = await mapMessage({
228
- role: 'user',
229
- content: 'Hello',
230
- cacheControl: { type: 'ephemeral' },
231
- })
232
- expect(Array.isArray(result.content)).toBe(true)
233
- const content = result.content as Array<{ type: string; cache_control?: unknown }>
234
- expect(content[content.length - 1].cache_control).toEqual({ type: 'ephemeral' })
235
- })
236
-
237
- test('adds cache_control to outer tool_result block (not inner content)', async () => {
238
- const result = await mapMessage({
239
- role: 'tool',
240
- content: 'result data',
241
- toolCallId: ToolCallId('tc_1'),
242
- cacheControl: { type: 'ephemeral' },
243
- })
244
- const content = result.content as Array<{ type: string; cache_control?: unknown }>
245
- expect(content).toHaveLength(1)
246
- expect(content[0].type).toBe('tool_result')
247
- expect(content[0].cache_control).toEqual({ type: 'ephemeral' })
248
- })
249
-
250
- test('adds cache_control to last block of assistant with text + tool_use', async () => {
251
- const result = await mapMessage({
252
- role: 'assistant',
253
- content: 'Let me help',
254
- toolCalls: [{ id: ToolCallId('tc_1'), name: 'search', input: { query: 'test' } }],
255
- cacheControl: { type: 'ephemeral' },
256
- })
257
- const content = result.content as Array<{ type: string; cache_control?: unknown }>
258
- // Last block is the tool_use — that's where cache_control must land
259
- expect(content[content.length - 1].type).toBe('tool_use')
260
- expect(content[content.length - 1].cache_control).toEqual({ type: 'ephemeral' })
261
- })
262
-
263
- test('no cache_control on messages without flag', async () => {
264
- const result = await mapMessage({ role: 'user', content: 'Hello' })
265
- expect(result).toEqual({ role: 'user', content: 'Hello' })
266
- })
267
- })
268
-
269
- // ============================================================================
270
- // End-to-end buildHttpRequest with cache breakpoints
271
- // ============================================================================
272
- //
273
- // Covers the bug scenarios that the old provider-level `applyCacheBreakpoints`
274
- // silently no-op'd on: pure tool_result target, assistant with tool_use last,
275
- // and the agent-side pipeline (applyCacheBreakpoint + mergeConsecutiveMessages).
276
-
277
- type AnyBlock = { type: string; cache_control?: { type: 'ephemeral' }; [key: string]: unknown }
278
- type AnthropicMessage = { role: string; content: AnyBlock[] }
279
-
280
- const testModel = ModelId('claude-haiku-4-5-20251001')
281
-
282
- const buildRequest = (messages: LLMMessage[]): RawInferenceRequest => ({
283
- model: testModel,
284
- systemPrompt: 'You are helpful.',
285
- messages,
286
- })
287
-
288
- const getBodyMessages = (body: unknown): AnthropicMessage[] => {
289
- const b = body as { messages: AnthropicMessage[] }
290
- return b.messages
291
- }
292
-
293
- describe('AnthropicProvider buildHttpRequest cache placement', () => {
294
- test('pure tool_result target: cache_control lands on outer tool_result block', async () => {
295
- const messages = applyCacheBreakpoint([
296
- { role: 'user', content: 'What is the weather?' },
297
- {
298
- role: 'assistant',
299
- content: '',
300
- toolCalls: [{ id: ToolCallId('call_1'), name: 'get_weather', input: { city: 'Prague' } }],
301
- },
302
- { role: 'tool', toolCallId: ToolCallId('call_1'), content: 'Sunny, 22°C' },
303
- ], 0)
304
-
305
- const http = await createProvider().buildHttpRequest(buildRequest(messages))
306
- const msgs = getBodyMessages(http.body)
307
-
308
- // Last message is the merged user containing the tool_result
309
- const last = msgs[msgs.length - 1]
310
- expect(last.role).toBe('user')
311
- expect(Array.isArray(last.content)).toBe(true)
312
- const lastBlock = last.content[last.content.length - 1]
313
- expect(lastBlock.type).toBe('tool_result')
314
- expect(lastBlock.cache_control).toEqual({ type: 'ephemeral' })
315
- })
316
-
317
- test('consecutive tool_results merged: cache_control lands on LAST merged tool_result', async () => {
318
- const messages = applyCacheBreakpoint([
319
- { role: 'user', content: 'Check two cities' },
320
- {
321
- role: 'assistant',
322
- content: '',
323
- toolCalls: [
324
- { id: ToolCallId('call_1'), name: 'get_weather', input: { city: 'Prague' } },
325
- { id: ToolCallId('call_2'), name: 'get_weather', input: { city: 'London' } },
326
- ],
327
- },
328
- { role: 'tool', toolCallId: ToolCallId('call_1'), content: 'Sunny' },
329
- { role: 'tool', toolCallId: ToolCallId('call_2'), content: 'Rainy' },
330
- ], 0)
331
-
332
- const http = await createProvider().buildHttpRequest(buildRequest(messages))
333
- const msgs = getBodyMessages(http.body)
334
-
335
- const last = msgs[msgs.length - 1]
336
- expect(last.role).toBe('user')
337
- // Two tool_results merged into one user message
338
- expect(last.content.length).toBe(2)
339
- expect(last.content[0].type).toBe('tool_result')
340
- expect(last.content[1].type).toBe('tool_result')
341
- expect(last.content[0].cache_control).toBeUndefined()
342
- // cache_control is on the LAST tool_result (the target message's block after merge)
343
- expect(last.content[1].cache_control).toEqual({ type: 'ephemeral' })
344
- })
345
-
346
- test('assistant [text, tool_use, tool_use] target: cache_control lands on LAST tool_use', async () => {
347
- const messages = applyCacheBreakpoint([
348
- { role: 'user', content: 'Check weather and search' },
349
- {
350
- role: 'assistant',
351
- content: 'Let me check both',
352
- toolCalls: [
353
- { id: ToolCallId('call_1'), name: 'get_weather', input: { city: 'Prague' } },
354
- { id: ToolCallId('call_2'), name: 'search', input: { query: 'weather' } },
355
- ],
356
- },
357
- { role: 'tool', toolCallId: ToolCallId('call_1'), content: 'Sunny' },
358
- { role: 'tool', toolCallId: ToolCallId('call_2'), content: 'Found results' },
359
- ], 2)
360
-
361
- const http = await createProvider().buildHttpRequest(buildRequest(messages))
362
- const msgs = getBodyMessages(http.body)
363
-
364
- const assistant = msgs[msgs.length - 2]
365
- expect(assistant.role).toBe('assistant')
366
- expect(assistant.content.length).toBe(3) // text + 2 tool_use
367
- expect(assistant.content[0].type).toBe('text')
368
- expect(assistant.content[0].cache_control).toBeUndefined()
369
- expect(assistant.content[1].type).toBe('tool_use')
370
- expect(assistant.content[1].cache_control).toBeUndefined()
371
- // cache_control lands on the LAST block (last tool_use), not the first text block
372
- expect(assistant.content[2].type).toBe('tool_use')
373
- expect(assistant.content[2].cache_control).toEqual({ type: 'ephemeral' })
374
- })
375
-
376
- test('ephemeral suffix: breakpoint at idx-1, ephemeral user merges after as uncached suffix', async () => {
377
- const history: LLMMessage[] = [
378
- { role: 'user', content: 'Initial question' },
379
- {
380
- role: 'assistant',
381
- content: '',
382
- toolCalls: [{ id: ToolCallId('call_1'), name: 'get_weather', input: { city: 'Prague' } }],
383
- },
384
- { role: 'tool', toolCallId: ToolCallId('call_1'), content: 'Sunny' },
385
- // simulate agent.ts pushing ephemeral session context last
386
- { role: 'user', content: '<session-context>plugin status</session-context>' },
387
- ]
388
- const messages = applyCacheBreakpoint(history, 1) // uncachedSuffixCount = 1 (ephemeral tail)
389
-
390
- const http = await createProvider().buildHttpRequest(buildRequest(messages))
391
- const msgs = getBodyMessages(http.body)
392
-
393
- // mergeConsecutiveMessages folds the tool_result and ephemeral into one user message
394
- const last = msgs[msgs.length - 1]
395
- expect(last.role).toBe('user')
396
- // Content: [tool_result (cached), text (ephemeral, uncached)]
397
- expect(last.content.length).toBe(2)
398
- expect(last.content[0].type).toBe('tool_result')
399
- expect(last.content[0].cache_control).toEqual({ type: 'ephemeral' })
400
- expect(last.content[1].type).toBe('text')
401
- // Ephemeral comes AFTER the cache checkpoint, so it's fresh each call
402
- expect(last.content[1].cache_control).toBeUndefined()
403
- })
404
-
405
- test('stable prefix + tail: TWO cache_control blocks survive into the HTTP body', async () => {
406
- // Mirrors the agent flow: an immutable preamble followed by a churning
407
- // conversation tail. applyCacheBreakpoint with cachedPrefixCount marks
408
- // BOTH the last preamble message and the tail — both must reach the wire.
409
- // Roles alternate so mergeConsecutiveMessages doesn't fold them together.
410
- const messages = applyCacheBreakpoint(
411
- [
412
- { role: 'user', content: 'preamble part A' },
413
- { role: 'assistant', content: 'preamble part B' }, // last preamble msg → prefix breakpoint
414
- { role: 'user', content: 'conversation turn' },
415
- { role: 'assistant', content: 'tail reply' }, // tail breakpoint
416
- { role: 'user', content: 'tail continuation' },
417
- ],
418
- 1, // one uncached user suffix → tailIdx = 3
419
- undefined,
420
- 2, // cachedPrefixCount → prefixIdx = 1
421
- )
422
-
423
- const http = await createProvider().buildHttpRequest(buildRequest(messages))
424
- const msgs = getBodyMessages(http.body)
425
-
426
- expect(msgs.length).toBe(5)
427
- // Prefix breakpoint on the last preamble message
428
- const prefix = msgs[1]
429
- expect(prefix.role).toBe('assistant')
430
- expect(prefix.content[prefix.content.length - 1].cache_control).toEqual({ type: 'ephemeral' })
431
- // Tail breakpoint on the final message
432
- const tail = msgs[3]
433
- expect(tail.role).toBe('assistant')
434
- expect(tail.content[tail.content.length - 1].cache_control).toEqual({ type: 'ephemeral' })
435
- // Messages between the two breakpoints stay uncached
436
- expect(msgs[0].content[msgs[0].content.length - 1].cache_control).toBeUndefined()
437
- expect(msgs[2].content[msgs[2].content.length - 1].cache_control).toBeUndefined()
438
- })
439
-
440
- test('no flag on any message: only system prompt has cache_control', async () => {
441
- const http = await createProvider().buildHttpRequest(buildRequest([
442
- { role: 'user', content: 'What is 2+2?' },
443
- { role: 'assistant', content: '4' },
444
- { role: 'user', content: 'And 3+3?' },
445
- ]))
446
- const msgs = getBodyMessages(http.body)
447
-
448
- for (const msg of msgs) {
449
- for (const block of msg.content) {
450
- expect(block.cache_control).toBeUndefined()
451
- }
452
- }
453
- // System still has cache_control (hardcoded in provider)
454
- const system = (http.body as { system: AnyBlock[] }).system
455
- expect(system[0].cache_control).toEqual({ type: 'ephemeral' })
456
- })
457
- })
458
-
459
- // ============================================================================
460
- // Stop Reason Mapping
461
- // ============================================================================
462
-
463
- describe('AnthropicProvider stop reason mapping', () => {
464
- test('maps end_turn to stop', () => {
465
- expect(mapStopReason('end_turn')).toBe('stop')
466
- })
467
-
468
- test('maps tool_use to tool_calls', () => {
469
- expect(mapStopReason('tool_use')).toBe('tool_calls')
470
- })
471
-
472
- test('maps max_tokens to length', () => {
473
- expect(mapStopReason('max_tokens')).toBe('length')
474
- })
475
-
476
- test('maps null to stop', () => {
477
- expect(mapStopReason(null)).toBe('stop')
478
- })
479
-
480
- test('maps unknown reason to stop', () => {
481
- expect(mapStopReason('something_new')).toBe('stop')
482
- })
483
- })
484
-
485
- // ============================================================================
486
- // Error Mapping
487
- // ============================================================================
488
-
489
- describe('AnthropicProvider error mapping', () => {
490
- test('maps AbortError', () => {
491
- const err = new Error('aborted')
492
- err.name = 'AbortError'
493
- const result = mapError(err) as any
494
- expect(result.type).toBe('aborted')
495
- })
496
-
497
- test('maps unknown error to network_error', () => {
498
- const result = mapError(new Error('something')) as any
499
- expect(result.type).toBe('network_error')
500
- expect(result.message).toBe('something')
501
- })
502
-
503
- test('maps string error', () => {
504
- const result = mapError('boom') as any
505
- expect(result.type).toBe('network_error')
506
- expect(result.message).toBe('boom')
507
- })
508
- })
509
-
510
- // ============================================================================
511
- // Model Routing (canHandle / normalizeModel)
512
- // ============================================================================
513
-
514
- describe('AnthropicProvider model routing', () => {
515
- test('handles anthropic/ prefixed models', () => {
516
- expect(provider.canHandle('anthropic/claude-sonnet-4.5')).toBe(true)
517
- expect(provider.canHandle('anthropic/claude-haiku-4.5')).toBe(true)
518
- expect(provider.canHandle('anthropic/claude-3.5-haiku')).toBe(true)
519
- })
520
-
521
- test('handles claude- prefixed models without vendor prefix', () => {
522
- expect(provider.canHandle('claude-sonnet-4-5-20250514')).toBe(true)
523
- expect(provider.canHandle('claude-3-5-haiku-20241022')).toBe(true)
524
- })
525
-
526
- test('does not handle non-Anthropic models', () => {
527
- expect(provider.canHandle('openai/gpt-4o')).toBe(false)
528
- expect(provider.canHandle('google/gemini-pro')).toBe(false)
529
- expect(provider.canHandle('meta-llama/llama-3')).toBe(false)
530
- })
531
-
532
- test('strips anthropic/ prefix and converts dots to dashes', () => {
533
- expect(provider.normalizeModel('anthropic/claude-opus-4.6')).toBe('claude-opus-4-6')
534
- expect(provider.normalizeModel('anthropic/claude-sonnet-4.5')).toBe('claude-sonnet-4-5')
535
- expect(provider.normalizeModel('anthropic/claude-haiku-4.5')).toBe('claude-haiku-4-5')
536
- })
537
-
538
- test('converts dots to dashes without prefix', () => {
539
- expect(provider.normalizeModel('claude-opus-4.6')).toBe('claude-opus-4-6')
540
- })
541
-
542
- test('keeps model ID as-is when already in Anthropic format', () => {
543
- expect(provider.normalizeModel('claude-sonnet-4-5-20250514')).toBe('claude-sonnet-4-5-20250514')
544
- expect(provider.normalizeModel('claude-opus-4-6')).toBe('claude-opus-4-6')
545
- })
546
- })
@@ -1,85 +0,0 @@
1
- import { describe, expect, test } from 'bun:test'
2
- import type { LLMMessage } from '~/core/agents/state.js'
3
- import { applyCacheBreakpoint } from './cache-breakpoints.js'
4
-
5
- const userMessages = (count: number): LLMMessage[] =>
6
- Array.from({ length: count }, (_, i) => ({ role: 'user', content: `m${i}` }))
7
-
8
- const cachedIndices = (messages: LLMMessage[]): number[] =>
9
- messages.flatMap((m, i) => ('cacheControl' in m && m.cacheControl ? [i] : []))
10
-
11
- describe('applyCacheBreakpoint', () => {
12
- test('cachedPrefixCount = 0 → single tail breakpoint only (unchanged behaviour)', () => {
13
- const messages = userMessages(5)
14
- const result = applyCacheBreakpoint(messages, 1)
15
- // tail = length - 1 - suffix = 5 - 1 - 1 = 3
16
- expect(cachedIndices(result)).toEqual([3])
17
- })
18
-
19
- test('cachedPrefixCount > 0 → two breakpoints: prefix end and tail', () => {
20
- const messages = userMessages(10)
21
- const result = applyCacheBreakpoint(messages, 1, undefined, 3)
22
- // prefix = 3 - 1 = 2, tail = 10 - 1 - 1 = 8
23
- expect(cachedIndices(result)).toEqual([2, 8])
24
- })
25
-
26
- test('prefixIdx === tailIdx → only one breakpoint, no duplicate', () => {
27
- // preamble is the whole list, no suffix: tail = 3 - 1 - 0 = 2, prefix = 3 - 1 = 2
28
- const messages = userMessages(3)
29
- const result = applyCacheBreakpoint(messages, 0, undefined, 3)
30
- expect(cachedIndices(result)).toEqual([2])
31
- })
32
-
33
- test('cachedPrefixCount larger than messages.length → out-of-range prefix ignored, tail still applied', () => {
34
- const messages = userMessages(4)
35
- const result = applyCacheBreakpoint(messages, 0, undefined, 99)
36
- // prefix = 98 (out of range, ignored), tail = 4 - 1 - 0 = 3
37
- expect(cachedIndices(result)).toEqual([3])
38
- })
39
-
40
- // prefix = 1, tail = 5 for userMessages(6) with suffix 0 and cachedPrefixCount 2
41
- const ttlsOf = (messages: LLMMessage[]) => [1, 5].map((idx) => {
42
- const m = messages[idx]
43
- return 'cacheControl' in m && m.cacheControl ? m.cacheControl.ttl : undefined
44
- })
45
-
46
- test('a bare tier applies to both breakpoints', () => {
47
- const result = applyCacheBreakpoint(userMessages(6), 0, '1h', 2)
48
- expect(ttlsOf(result)).toEqual(['1h', '1h'])
49
- })
50
-
51
- test('{ prefix } leaves the tail on the default tier', () => {
52
- // Usually the paying configuration for an interactive agent: the immutable
53
- // preamble survives human pauses, the churning tail stays cheap to write.
54
- const result = applyCacheBreakpoint(userMessages(6), 0, { prefix: '1h' }, 2)
55
- expect(ttlsOf(result)).toEqual(['1h', undefined])
56
- })
57
-
58
- test('{ prefix, tail } sets each breakpoint independently', () => {
59
- const result = applyCacheBreakpoint(userMessages(6), 0, { prefix: '1h', tail: '5m' }, 2)
60
- expect(ttlsOf(result)).toEqual(['1h', '5m'])
61
- })
62
-
63
- test('{ tail } alone is honoured — the SDK does not second-guess the caller', () => {
64
- const result = applyCacheBreakpoint(userMessages(6), 0, { tail: '1h' }, 2)
65
- expect(ttlsOf(result)).toEqual([undefined, '1h'])
66
- })
67
-
68
- test('prefixIdx === tailIdx → the single mark covers the preamble, so it takes the prefix ttl', () => {
69
- const result = applyCacheBreakpoint(userMessages(3), 0, { prefix: '1h' }, 3)
70
- expect(cachedIndices(result)).toEqual([2])
71
- const only = result[2]
72
- expect('cacheControl' in only && only.cacheControl).toEqual({ type: 'ephemeral', ttl: '1h' })
73
- })
74
-
75
- test('no ttl → neither breakpoint carries one', () => {
76
- const result = applyCacheBreakpoint(userMessages(6), 0, undefined, 2)
77
- expect(ttlsOf(result)).toEqual([undefined, undefined])
78
- })
79
-
80
- test('does not mutate the input array', () => {
81
- const messages = userMessages(5)
82
- applyCacheBreakpoint(messages, 0, undefined, 2)
83
- expect(cachedIndices(messages)).toEqual([])
84
- })
85
- })