@roj-ai/sdk 0.1.36 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (922) hide show
  1. package/dist/bootstrap.d.ts +420 -26
  2. package/dist/bootstrap.d.ts.map +1 -1
  3. package/dist/bootstrap.js +55 -24
  4. package/dist/bootstrap.js.map +1 -1
  5. package/dist/bun-platform/fs.d.ts.map +1 -1
  6. package/dist/bun-platform/fs.js +1 -0
  7. package/dist/bun-platform/fs.js.map +1 -1
  8. package/dist/bun-platform/index.d.ts +4 -1
  9. package/dist/bun-platform/index.d.ts.map +1 -1
  10. package/dist/bun-platform/index.js +7 -1
  11. package/dist/bun-platform/index.js.map +1 -1
  12. package/dist/bun-platform/server-lifecycle.d.ts +30 -0
  13. package/dist/bun-platform/server-lifecycle.d.ts.map +1 -0
  14. package/dist/bun-platform/server-lifecycle.js +182 -0
  15. package/dist/bun-platform/server-lifecycle.js.map +1 -0
  16. package/dist/bun-platform/shell.d.ts +33 -0
  17. package/dist/bun-platform/shell.d.ts.map +1 -0
  18. package/dist/bun-platform/shell.js +322 -0
  19. package/dist/bun-platform/shell.js.map +1 -0
  20. package/dist/config.d.ts +34 -0
  21. package/dist/config.d.ts.map +1 -1
  22. package/dist/config.js +97 -0
  23. package/dist/config.js.map +1 -1
  24. package/dist/core/agents/agent.d.ts +42 -7
  25. package/dist/core/agents/agent.d.ts.map +1 -1
  26. package/dist/core/agents/agent.js +202 -87
  27. package/dist/core/agents/agent.js.map +1 -1
  28. package/dist/core/agents/config.d.ts +8 -1
  29. package/dist/core/agents/config.d.ts.map +1 -1
  30. package/dist/core/agents/config.js +5 -1
  31. package/dist/core/agents/config.js.map +1 -1
  32. package/dist/core/agents/retry.d.ts +1 -1
  33. package/dist/core/agents/retry.d.ts.map +1 -1
  34. package/dist/core/agents/retry.js +14 -16
  35. package/dist/core/agents/retry.js.map +1 -1
  36. package/dist/core/agents/state.d.ts +3 -1
  37. package/dist/core/agents/state.d.ts.map +1 -1
  38. package/dist/core/agents/state.js +1 -1
  39. package/dist/core/agents/state.js.map +1 -1
  40. package/dist/core/context/state.d.ts +3 -3
  41. package/dist/core/context/state.js +2 -2
  42. package/dist/core/events/base-event-store.d.ts.map +1 -1
  43. package/dist/core/events/base-event-store.js +22 -14
  44. package/dist/core/events/base-event-store.js.map +1 -1
  45. package/dist/core/events/file.d.ts +39 -1
  46. package/dist/core/events/file.d.ts.map +1 -1
  47. package/dist/core/events/file.js +159 -20
  48. package/dist/core/events/file.js.map +1 -1
  49. package/dist/core/events/types.d.ts +1 -1
  50. package/dist/core/file-store/containment.d.ts +19 -0
  51. package/dist/core/file-store/containment.d.ts.map +1 -0
  52. package/dist/core/file-store/containment.js +62 -0
  53. package/dist/core/file-store/containment.js.map +1 -0
  54. package/dist/core/file-store/file-store.d.ts +22 -2
  55. package/dist/core/file-store/file-store.d.ts.map +1 -1
  56. package/dist/core/file-store/file-store.js +88 -20
  57. package/dist/core/file-store/file-store.js.map +1 -1
  58. package/dist/core/file-store/types.d.ts +13 -1
  59. package/dist/core/file-store/types.d.ts.map +1 -1
  60. package/dist/core/image/image-processor.d.ts.map +1 -1
  61. package/dist/core/image/image-processor.js +3 -1
  62. package/dist/core/image/image-processor.js.map +1 -1
  63. package/dist/core/image/types.d.ts +2 -0
  64. package/dist/core/image/types.d.ts.map +1 -1
  65. package/dist/core/image/vips-resizer.d.ts.map +1 -1
  66. package/dist/core/image/vips-resizer.js +81 -33
  67. package/dist/core/image/vips-resizer.js.map +1 -1
  68. package/dist/core/llm/anthropic.d.ts +0 -1
  69. package/dist/core/llm/anthropic.d.ts.map +1 -1
  70. package/dist/core/llm/anthropic.js +58 -72
  71. package/dist/core/llm/anthropic.js.map +1 -1
  72. package/dist/core/llm/logger.d.ts +14 -2
  73. package/dist/core/llm/logger.d.ts.map +1 -1
  74. package/dist/core/llm/logger.js +161 -36
  75. package/dist/core/llm/logger.js.map +1 -1
  76. package/dist/core/llm/openrouter.d.ts +0 -1
  77. package/dist/core/llm/openrouter.d.ts.map +1 -1
  78. package/dist/core/llm/openrouter.js +53 -66
  79. package/dist/core/llm/openrouter.js.map +1 -1
  80. package/dist/core/llm/provider-request.d.ts +10 -0
  81. package/dist/core/llm/provider-request.d.ts.map +1 -0
  82. package/dist/core/llm/provider-request.js +41 -0
  83. package/dist/core/llm/provider-request.js.map +1 -0
  84. package/dist/core/llm/provider.d.ts +11 -0
  85. package/dist/core/llm/provider.d.ts.map +1 -1
  86. package/dist/core/llm/provider.js +26 -0
  87. package/dist/core/llm/provider.js.map +1 -1
  88. package/dist/core/llm/state.d.ts +2 -2
  89. package/dist/core/llm/state.js +4 -4
  90. package/dist/core/plugins/plugin-builder.d.ts +57 -3
  91. package/dist/core/plugins/plugin-builder.d.ts.map +1 -1
  92. package/dist/core/plugins/plugin-builder.js +68 -14
  93. package/dist/core/plugins/plugin-builder.js.map +1 -1
  94. package/dist/core/preset/preset-builder.d.ts +3 -2
  95. package/dist/core/preset/preset-builder.d.ts.map +1 -1
  96. package/dist/core/preset/preset-builder.js +7 -16
  97. package/dist/core/preset/preset-builder.js.map +1 -1
  98. package/dist/core/sessions/context.d.ts +23 -5
  99. package/dist/core/sessions/context.d.ts.map +1 -1
  100. package/dist/core/sessions/runtime-activity.d.ts +33 -0
  101. package/dist/core/sessions/runtime-activity.d.ts.map +1 -0
  102. package/dist/core/sessions/runtime-activity.js +55 -0
  103. package/dist/core/sessions/runtime-activity.js.map +1 -0
  104. package/dist/core/sessions/schema.d.ts +23 -2
  105. package/dist/core/sessions/schema.d.ts.map +1 -1
  106. package/dist/core/sessions/schema.js +24 -3
  107. package/dist/core/sessions/schema.js.map +1 -1
  108. package/dist/core/sessions/session-manager.d.ts +83 -6
  109. package/dist/core/sessions/session-manager.d.ts.map +1 -1
  110. package/dist/core/sessions/session-manager.js +517 -118
  111. package/dist/core/sessions/session-manager.js.map +1 -1
  112. package/dist/core/sessions/session-store.d.ts +18 -0
  113. package/dist/core/sessions/session-store.d.ts.map +1 -1
  114. package/dist/core/sessions/session-store.js +33 -0
  115. package/dist/core/sessions/session-store.js.map +1 -1
  116. package/dist/core/sessions/session.d.ts +42 -6
  117. package/dist/core/sessions/session.d.ts.map +1 -1
  118. package/dist/core/sessions/session.js +176 -44
  119. package/dist/core/sessions/session.js.map +1 -1
  120. package/dist/core/sessions/state.d.ts +10 -1
  121. package/dist/core/sessions/state.d.ts.map +1 -1
  122. package/dist/core/sessions/state.js +11 -1
  123. package/dist/core/sessions/state.js.map +1 -1
  124. package/dist/core/system.d.ts +9 -0
  125. package/dist/core/system.d.ts.map +1 -1
  126. package/dist/core/system.js +4 -1
  127. package/dist/core/system.js.map +1 -1
  128. package/dist/core/tools/executor.d.ts +1 -1
  129. package/dist/core/wake-key.d.ts +34 -0
  130. package/dist/core/wake-key.d.ts.map +1 -0
  131. package/dist/core/wake-key.js +51 -0
  132. package/dist/core/wake-key.js.map +1 -0
  133. package/dist/index.d.ts +23 -13
  134. package/dist/index.d.ts.map +1 -1
  135. package/dist/index.js +22 -8
  136. package/dist/index.js.map +1 -1
  137. package/dist/lib/archive/archive-inspection.d.ts +48 -0
  138. package/dist/lib/archive/archive-inspection.d.ts.map +1 -0
  139. package/dist/lib/archive/archive-inspection.fixtures.d.ts +7 -0
  140. package/dist/lib/archive/archive-inspection.fixtures.d.ts.map +1 -0
  141. package/dist/lib/archive/archive-inspection.fixtures.js +134 -0
  142. package/dist/lib/archive/archive-inspection.fixtures.js.map +1 -0
  143. package/dist/lib/archive/archive-inspection.js +253 -0
  144. package/dist/lib/archive/archive-inspection.js.map +1 -0
  145. package/dist/lib/archive/index.d.ts +3 -0
  146. package/dist/lib/archive/index.d.ts.map +1 -0
  147. package/dist/lib/archive/index.js +2 -0
  148. package/dist/lib/archive/index.js.map +1 -0
  149. package/dist/lib/logger/console.d.ts +5 -12
  150. package/dist/lib/logger/console.d.ts.map +1 -1
  151. package/dist/lib/logger/console.js +5 -47
  152. package/dist/lib/logger/console.js.map +1 -1
  153. package/dist/lib/logger/file.d.ts +8 -11
  154. package/dist/lib/logger/file.d.ts.map +1 -1
  155. package/dist/lib/logger/file.js +26 -37
  156. package/dist/lib/logger/file.js.map +1 -1
  157. package/dist/lib/logger/index.d.ts +3 -1
  158. package/dist/lib/logger/index.d.ts.map +1 -1
  159. package/dist/lib/logger/index.js +3 -1
  160. package/dist/lib/logger/index.js.map +1 -1
  161. package/dist/lib/logger/jsonl.d.ts +21 -0
  162. package/dist/lib/logger/jsonl.d.ts.map +1 -0
  163. package/dist/lib/logger/jsonl.js +29 -0
  164. package/dist/lib/logger/jsonl.js.map +1 -0
  165. package/dist/lib/logger/logger.d.ts +22 -0
  166. package/dist/lib/logger/logger.d.ts.map +1 -1
  167. package/dist/lib/logger/logger.js +37 -0
  168. package/dist/lib/logger/logger.js.map +1 -1
  169. package/dist/lib/logger/session-log.d.ts +21 -0
  170. package/dist/lib/logger/session-log.d.ts.map +1 -0
  171. package/dist/lib/logger/session-log.js +37 -0
  172. package/dist/lib/logger/session-log.js.map +1 -0
  173. package/dist/lib/utils/concurrency.d.ts +1 -1
  174. package/dist/lib/utils/concurrency.d.ts.map +1 -1
  175. package/dist/lib/utils/concurrency.js +30 -7
  176. package/dist/lib/utils/concurrency.js.map +1 -1
  177. package/dist/lib/utils/fs-batch.d.ts +17 -0
  178. package/dist/lib/utils/fs-batch.d.ts.map +1 -0
  179. package/dist/lib/utils/fs-batch.js +38 -0
  180. package/dist/lib/utils/fs-batch.js.map +1 -0
  181. package/dist/lib/utils/result.d.ts +7 -22
  182. package/dist/lib/utils/result.d.ts.map +1 -1
  183. package/dist/lib/utils/result.js +6 -17
  184. package/dist/lib/utils/result.js.map +1 -1
  185. package/dist/lib/utils/sleep.d.ts +10 -0
  186. package/dist/lib/utils/sleep.d.ts.map +1 -0
  187. package/dist/lib/utils/sleep.js +26 -0
  188. package/dist/lib/utils/sleep.js.map +1 -0
  189. package/dist/platform/fs-revision.d.ts +21 -0
  190. package/dist/platform/fs-revision.d.ts.map +1 -0
  191. package/dist/platform/fs-revision.js +9 -0
  192. package/dist/platform/fs-revision.js.map +1 -0
  193. package/dist/platform/fs.d.ts +104 -1
  194. package/dist/platform/fs.d.ts.map +1 -1
  195. package/dist/platform/git.d.ts +59 -0
  196. package/dist/platform/git.d.ts.map +1 -0
  197. package/dist/platform/git.js +8 -0
  198. package/dist/platform/git.js.map +1 -0
  199. package/dist/platform/index.d.ts +40 -1
  200. package/dist/platform/index.d.ts.map +1 -1
  201. package/dist/platform/index.js +1 -1
  202. package/dist/platform/index.js.map +1 -1
  203. package/dist/platform/llm-call-log.d.ts +80 -0
  204. package/dist/platform/llm-call-log.d.ts.map +1 -0
  205. package/dist/platform/llm-call-log.js +12 -0
  206. package/dist/platform/llm-call-log.js.map +1 -0
  207. package/dist/platform/scheduler.d.ts +32 -0
  208. package/dist/platform/scheduler.d.ts.map +1 -0
  209. package/dist/platform/scheduler.js +46 -0
  210. package/dist/platform/scheduler.js.map +1 -0
  211. package/dist/platform/session-log.d.ts +36 -0
  212. package/dist/platform/session-log.d.ts.map +1 -0
  213. package/dist/platform/session-log.js +12 -0
  214. package/dist/platform/session-log.js.map +1 -0
  215. package/dist/platform/shell.d.ts +83 -0
  216. package/dist/platform/shell.d.ts.map +1 -0
  217. package/dist/platform/shell.js +13 -0
  218. package/dist/platform/shell.js.map +1 -0
  219. package/dist/plugins/agent-status/plugin.d.ts.map +1 -1
  220. package/dist/plugins/agent-status/plugin.js +1 -0
  221. package/dist/plugins/agent-status/plugin.js.map +1 -1
  222. package/dist/plugins/agents/plugin.d.ts.map +1 -1
  223. package/dist/plugins/agents/plugin.js +129 -62
  224. package/dist/plugins/agents/plugin.js.map +1 -1
  225. package/dist/plugins/filesystem/listing.d.ts +3 -0
  226. package/dist/plugins/filesystem/listing.d.ts.map +1 -1
  227. package/dist/plugins/filesystem/listing.js +66 -10
  228. package/dist/plugins/filesystem/listing.js.map +1 -1
  229. package/dist/plugins/filesystem/plugin.d.ts.map +1 -1
  230. package/dist/plugins/filesystem/plugin.js +8 -6
  231. package/dist/plugins/filesystem/plugin.js.map +1 -1
  232. package/dist/plugins/git-status/plugin.d.ts +34 -7
  233. package/dist/plugins/git-status/plugin.d.ts.map +1 -1
  234. package/dist/plugins/git-status/plugin.js +168 -64
  235. package/dist/plugins/git-status/plugin.js.map +1 -1
  236. package/dist/plugins/llm-debug/plugin.d.ts.map +1 -1
  237. package/dist/plugins/llm-debug/plugin.js +1 -0
  238. package/dist/plugins/llm-debug/plugin.js.map +1 -1
  239. package/dist/plugins/logs/plugin.d.ts +1 -4
  240. package/dist/plugins/logs/plugin.d.ts.map +1 -1
  241. package/dist/plugins/logs/plugin.js +7 -0
  242. package/dist/plugins/logs/plugin.js.map +1 -1
  243. package/dist/plugins/mailbox/helpers.d.ts +2 -2
  244. package/dist/plugins/mailbox/helpers.js +1 -1
  245. package/dist/plugins/mailbox/plugin.d.ts.map +1 -1
  246. package/dist/plugins/mailbox/plugin.js +38 -43
  247. package/dist/plugins/mailbox/plugin.js.map +1 -1
  248. package/dist/plugins/mailbox/query.d.ts +7 -2
  249. package/dist/plugins/mailbox/query.d.ts.map +1 -1
  250. package/dist/plugins/mailbox/query.js +14 -7
  251. package/dist/plugins/mailbox/query.js.map +1 -1
  252. package/dist/plugins/mailbox/state.d.ts +5 -4
  253. package/dist/plugins/mailbox/state.d.ts.map +1 -1
  254. package/dist/plugins/mailbox/state.js +6 -5
  255. package/dist/plugins/mailbox/state.js.map +1 -1
  256. package/dist/plugins/resources/filename.d.ts +4 -0
  257. package/dist/plugins/resources/filename.d.ts.map +1 -0
  258. package/dist/plugins/resources/filename.js +18 -0
  259. package/dist/plugins/resources/filename.js.map +1 -0
  260. package/dist/plugins/resources/plugin.d.ts +3 -0
  261. package/dist/plugins/resources/plugin.d.ts.map +1 -1
  262. package/dist/plugins/resources/plugin.js +97 -60
  263. package/dist/plugins/resources/plugin.js.map +1 -1
  264. package/dist/plugins/resources/state.d.ts +1 -1
  265. package/dist/plugins/resources/state.js +1 -1
  266. package/dist/plugins/result-eviction/plugin.d.ts.map +1 -1
  267. package/dist/plugins/result-eviction/plugin.js +6 -1
  268. package/dist/plugins/result-eviction/plugin.js.map +1 -1
  269. package/dist/plugins/services/plugin.d.ts +4 -1
  270. package/dist/plugins/services/plugin.d.ts.map +1 -1
  271. package/dist/plugins/services/plugin.js +251 -100
  272. package/dist/plugins/services/plugin.js.map +1 -1
  273. package/dist/plugins/services/prompt.d.ts.map +1 -1
  274. package/dist/plugins/services/prompt.js +1 -4
  275. package/dist/plugins/services/prompt.js.map +1 -1
  276. package/dist/plugins/services/schema.d.ts +15 -5
  277. package/dist/plugins/services/schema.d.ts.map +1 -1
  278. package/dist/plugins/services/service.d.ts +100 -18
  279. package/dist/plugins/services/service.d.ts.map +1 -1
  280. package/dist/plugins/services/service.js +680 -230
  281. package/dist/plugins/services/service.js.map +1 -1
  282. package/dist/plugins/session-lifecycle/plugin.d.ts +21 -1
  283. package/dist/plugins/session-lifecycle/plugin.d.ts.map +1 -1
  284. package/dist/plugins/session-lifecycle/plugin.js +53 -40
  285. package/dist/plugins/session-lifecycle/plugin.js.map +1 -1
  286. package/dist/plugins/session-state/plugin.d.ts +21 -13
  287. package/dist/plugins/session-state/plugin.d.ts.map +1 -1
  288. package/dist/plugins/session-state/plugin.js +214 -79
  289. package/dist/plugins/session-state/plugin.js.map +1 -1
  290. package/dist/plugins/session-stats/plugin.d.ts.map +1 -1
  291. package/dist/plugins/session-stats/plugin.js +1 -0
  292. package/dist/plugins/session-stats/plugin.js.map +1 -1
  293. package/dist/plugins/shell/executor.d.ts +17 -15
  294. package/dist/plugins/shell/executor.d.ts.map +1 -1
  295. package/dist/plugins/shell/executor.js +130 -195
  296. package/dist/plugins/shell/executor.js.map +1 -1
  297. package/dist/plugins/shell/index.d.ts +2 -2
  298. package/dist/plugins/shell/index.d.ts.map +1 -1
  299. package/dist/plugins/shell/index.js +2 -2
  300. package/dist/plugins/shell/index.js.map +1 -1
  301. package/dist/plugins/shell/plugin.d.ts +5 -4
  302. package/dist/plugins/shell/plugin.d.ts.map +1 -1
  303. package/dist/plugins/shell/plugin.js +4 -8
  304. package/dist/plugins/shell/plugin.js.map +1 -1
  305. package/dist/plugins/skills/discovery.d.ts.map +1 -1
  306. package/dist/plugins/skills/discovery.js +10 -8
  307. package/dist/plugins/skills/discovery.js.map +1 -1
  308. package/dist/plugins/skills/index.d.ts +1 -1
  309. package/dist/plugins/skills/index.d.ts.map +1 -1
  310. package/dist/plugins/skills/plugin.d.ts +1 -1
  311. package/dist/plugins/skills/plugin.d.ts.map +1 -1
  312. package/dist/plugins/skills/plugin.js +23 -30
  313. package/dist/plugins/skills/plugin.js.map +1 -1
  314. package/dist/plugins/skills/prompts.d.ts +3 -3
  315. package/dist/plugins/skills/prompts.d.ts.map +1 -1
  316. package/dist/plugins/skills/prompts.js.map +1 -1
  317. package/dist/plugins/skills/schema.d.ts +4 -2
  318. package/dist/plugins/skills/schema.d.ts.map +1 -1
  319. package/dist/plugins/todo/schema.d.ts +1 -1
  320. package/dist/plugins/uploads/plugin.d.ts +11 -4
  321. package/dist/plugins/uploads/plugin.d.ts.map +1 -1
  322. package/dist/plugins/uploads/plugin.js +891 -225
  323. package/dist/plugins/uploads/plugin.js.map +1 -1
  324. package/dist/plugins/uploads/preprocessor.d.ts +14 -0
  325. package/dist/plugins/uploads/preprocessor.d.ts.map +1 -1
  326. package/dist/plugins/uploads/preprocessor.js +11 -0
  327. package/dist/plugins/uploads/preprocessor.js.map +1 -1
  328. package/dist/plugins/uploads/preprocessors/image-classifier.d.ts +1 -1
  329. package/dist/plugins/uploads/preprocessors/image-classifier.d.ts.map +1 -1
  330. package/dist/plugins/uploads/preprocessors/image-classifier.js +51 -26
  331. package/dist/plugins/uploads/preprocessors/image-classifier.js.map +1 -1
  332. package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.d.ts +2 -2
  333. package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.d.ts.map +1 -1
  334. package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.js +41 -16
  335. package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.js.map +1 -1
  336. package/dist/plugins/uploads/preprocessors/pdf-preprocessor.d.ts +1 -1
  337. package/dist/plugins/uploads/preprocessors/pdf-preprocessor.d.ts.map +1 -1
  338. package/dist/plugins/uploads/preprocessors/pdf-preprocessor.js +29 -14
  339. package/dist/plugins/uploads/preprocessors/pdf-preprocessor.js.map +1 -1
  340. package/dist/plugins/uploads/preprocessors/zip-preprocessor.d.ts +1 -1
  341. package/dist/plugins/uploads/preprocessors/zip-preprocessor.d.ts.map +1 -1
  342. package/dist/plugins/uploads/preprocessors/zip-preprocessor.js +62 -34
  343. package/dist/plugins/uploads/preprocessors/zip-preprocessor.js.map +1 -1
  344. package/dist/plugins/uploads/schema.d.ts +25 -2
  345. package/dist/plugins/uploads/schema.d.ts.map +1 -1
  346. package/dist/plugins/uploads/schema.js +24 -3
  347. package/dist/plugins/uploads/schema.js.map +1 -1
  348. package/dist/plugins/uploads/state.d.ts +13 -1
  349. package/dist/plugins/uploads/state.d.ts.map +1 -1
  350. package/dist/plugins/uploads/state.js +4 -1
  351. package/dist/plugins/uploads/state.js.map +1 -1
  352. package/dist/plugins/user-chat/plugin.d.ts +12 -5
  353. package/dist/plugins/user-chat/plugin.d.ts.map +1 -1
  354. package/dist/plugins/user-chat/plugin.js +141 -32
  355. package/dist/plugins/user-chat/plugin.js.map +1 -1
  356. package/dist/plugins/workers/context.d.ts +35 -13
  357. package/dist/plugins/workers/context.d.ts.map +1 -1
  358. package/dist/plugins/workers/context.js +82 -32
  359. package/dist/plugins/workers/context.js.map +1 -1
  360. package/dist/plugins/workers/definition.d.ts +7 -0
  361. package/dist/plugins/workers/definition.d.ts.map +1 -1
  362. package/dist/plugins/workers/definition.js.map +1 -1
  363. package/dist/plugins/workers/index.d.ts +4 -4
  364. package/dist/plugins/workers/index.d.ts.map +1 -1
  365. package/dist/plugins/workers/index.js +2 -2
  366. package/dist/plugins/workers/index.js.map +1 -1
  367. package/dist/plugins/workers/plugin.d.ts +10 -57
  368. package/dist/plugins/workers/plugin.d.ts.map +1 -1
  369. package/dist/plugins/workers/plugin.js +385 -123
  370. package/dist/plugins/workers/plugin.js.map +1 -1
  371. package/dist/plugins/workers/state.d.ts +69 -0
  372. package/dist/plugins/workers/state.d.ts.map +1 -0
  373. package/dist/plugins/workers/state.js +52 -0
  374. package/dist/plugins/workers/state.js.map +1 -0
  375. package/dist/plugins/workers/worker.d.ts +15 -4
  376. package/dist/plugins/workers/worker.d.ts.map +1 -1
  377. package/dist/testing/conformance.d.ts +106 -0
  378. package/dist/testing/conformance.d.ts.map +1 -0
  379. package/dist/testing/conformance.js +1463 -0
  380. package/dist/testing/conformance.js.map +1 -0
  381. package/dist/testing/node-platform.d.ts.map +1 -1
  382. package/dist/testing/node-platform.js +5 -0
  383. package/dist/testing/node-platform.js.map +1 -1
  384. package/dist/testing/test-harness.d.ts +11 -1
  385. package/dist/testing/test-harness.d.ts.map +1 -1
  386. package/dist/testing/test-harness.js +17 -37
  387. package/dist/testing/test-harness.js.map +1 -1
  388. package/dist/testing/wait-helpers.d.ts.map +1 -1
  389. package/dist/testing/wait-helpers.js +1 -3
  390. package/dist/testing/wait-helpers.js.map +1 -1
  391. package/dist/transport/adapter/client-adapter.d.ts +6 -0
  392. package/dist/transport/adapter/client-adapter.d.ts.map +1 -1
  393. package/dist/transport/adapter/client-adapter.js +50 -3
  394. package/dist/transport/adapter/client-adapter.js.map +1 -1
  395. package/dist/transport/adapter/heartbeat.d.ts +16 -0
  396. package/dist/transport/adapter/heartbeat.d.ts.map +1 -0
  397. package/dist/transport/adapter/heartbeat.js +41 -0
  398. package/dist/transport/adapter/heartbeat.js.map +1 -0
  399. package/dist/transport/adapter/server-adapter.d.ts.map +1 -1
  400. package/dist/transport/adapter/server-adapter.js +6 -0
  401. package/dist/transport/adapter/server-adapter.js.map +1 -1
  402. package/dist/transport/http/app.d.ts +3 -30
  403. package/dist/transport/http/app.d.ts.map +1 -1
  404. package/dist/transport/http/app.js +3 -7
  405. package/dist/transport/http/app.js.map +1 -1
  406. package/dist/transport/http/context.d.ts +40 -0
  407. package/dist/transport/http/context.d.ts.map +1 -0
  408. package/dist/transport/http/context.js +17 -0
  409. package/dist/transport/http/context.js.map +1 -0
  410. package/dist/transport/http/fetch-guard.d.ts +49 -0
  411. package/dist/transport/http/fetch-guard.d.ts.map +1 -0
  412. package/dist/transport/http/fetch-guard.js +312 -0
  413. package/dist/transport/http/fetch-guard.js.map +1 -0
  414. package/dist/transport/http/index.d.ts +1 -1
  415. package/dist/transport/http/index.d.ts.map +1 -1
  416. package/dist/transport/http/middleware/bearer-auth.d.ts +1 -1
  417. package/dist/transport/http/middleware/bearer-auth.d.ts.map +1 -1
  418. package/dist/transport/http/middleware/error-handler.d.ts +2 -2
  419. package/dist/transport/http/middleware/error-handler.d.ts.map +1 -1
  420. package/dist/transport/http/path-containment.d.ts +20 -0
  421. package/dist/transport/http/path-containment.d.ts.map +1 -0
  422. package/dist/transport/http/path-containment.js +31 -0
  423. package/dist/transport/http/path-containment.js.map +1 -0
  424. package/dist/transport/http/responses.d.ts +30 -0
  425. package/dist/transport/http/responses.d.ts.map +1 -0
  426. package/dist/transport/http/responses.js +5 -0
  427. package/dist/transport/http/responses.js.map +1 -0
  428. package/dist/transport/http/routes/files.d.ts +1 -1
  429. package/dist/transport/http/routes/files.d.ts.map +1 -1
  430. package/dist/transport/http/routes/files.js +54 -155
  431. package/dist/transport/http/routes/files.js.map +1 -1
  432. package/dist/transport/http/routes/resources.d.ts +1 -1
  433. package/dist/transport/http/routes/resources.d.ts.map +1 -1
  434. package/dist/transport/http/routes/resources.js +92 -57
  435. package/dist/transport/http/routes/resources.js.map +1 -1
  436. package/dist/transport/http/routes/rpc.d.ts +6 -1
  437. package/dist/transport/http/routes/rpc.d.ts.map +1 -1
  438. package/dist/transport/http/routes/rpc.js +51 -21
  439. package/dist/transport/http/routes/rpc.js.map +1 -1
  440. package/dist/transport/http/routes/upload.d.ts +1 -1
  441. package/dist/transport/http/routes/upload.d.ts.map +1 -1
  442. package/dist/transport/http/routes/upload.js +256 -169
  443. package/dist/transport/http/routes/upload.js.map +1 -1
  444. package/dist/user-config.d.ts +34 -7
  445. package/dist/user-config.d.ts.map +1 -1
  446. package/dist/user-config.js +71 -0
  447. package/dist/user-config.js.map +1 -1
  448. package/package.json +17 -7
  449. package/src/bootstrap.ts +119 -35
  450. package/src/bun-platform/fs.ts +1 -0
  451. package/src/bun-platform/index.ts +18 -1
  452. package/src/bun-platform/server-lifecycle.ts +218 -0
  453. package/src/bun-platform/shell.ts +362 -0
  454. package/src/config.ts +130 -0
  455. package/src/core/agents/agent.ts +210 -92
  456. package/src/core/agents/config.ts +8 -0
  457. package/src/core/agents/retry.ts +16 -17
  458. package/src/core/agents/state.ts +2 -0
  459. package/src/core/events/base-event-store.ts +24 -16
  460. package/src/core/events/file.ts +198 -22
  461. package/src/core/file-store/containment.ts +75 -0
  462. package/src/core/file-store/file-store.ts +106 -25
  463. package/src/core/file-store/types.ts +14 -1
  464. package/src/core/image/image-processor.ts +3 -1
  465. package/src/core/image/types.ts +2 -0
  466. package/src/core/image/vips-resizer.ts +102 -37
  467. package/src/core/llm/anthropic.ts +63 -79
  468. package/src/core/llm/logger.ts +175 -37
  469. package/src/core/llm/openrouter.ts +57 -72
  470. package/src/core/llm/provider-request.ts +40 -0
  471. package/src/core/llm/provider.ts +28 -0
  472. package/src/core/plugins/plugin-builder.ts +106 -14
  473. package/src/core/preset/preset-builder.ts +12 -22
  474. package/src/core/sessions/context.ts +18 -0
  475. package/src/core/sessions/runtime-activity.ts +78 -0
  476. package/src/core/sessions/schema.ts +29 -3
  477. package/src/core/sessions/session-manager.ts +560 -140
  478. package/src/core/sessions/session-store.ts +38 -0
  479. package/src/core/sessions/session.ts +187 -47
  480. package/src/core/sessions/state.ts +11 -0
  481. package/src/core/system.ts +15 -0
  482. package/src/core/wake-key.ts +65 -0
  483. package/src/index.ts +30 -12
  484. package/src/lib/archive/archive-inspection.fixtures.ts +138 -0
  485. package/src/lib/archive/archive-inspection.ts +359 -0
  486. package/src/lib/archive/index.ts +17 -0
  487. package/src/lib/logger/console.ts +7 -57
  488. package/src/lib/logger/file.ts +28 -50
  489. package/src/lib/logger/index.ts +3 -1
  490. package/src/lib/logger/jsonl.ts +36 -0
  491. package/src/lib/logger/logger.ts +48 -0
  492. package/src/lib/logger/session-log.ts +42 -0
  493. package/src/lib/utils/concurrency.ts +37 -8
  494. package/src/lib/utils/fs-batch.ts +49 -0
  495. package/src/lib/utils/result.ts +7 -31
  496. package/src/lib/utils/sleep.ts +23 -0
  497. package/src/platform/fs-revision.ts +21 -0
  498. package/src/platform/fs.ts +109 -1
  499. package/src/platform/git.ts +67 -0
  500. package/src/platform/index.ts +51 -1
  501. package/src/platform/llm-call-log.ts +86 -0
  502. package/src/platform/scheduler.ts +71 -0
  503. package/src/platform/session-log.ts +39 -0
  504. package/src/platform/shell.ts +89 -0
  505. package/src/plugins/agent-status/plugin.ts +1 -0
  506. package/src/plugins/agents/plugin.ts +134 -81
  507. package/src/plugins/filesystem/listing.ts +70 -12
  508. package/src/plugins/filesystem/plugin.ts +8 -6
  509. package/src/plugins/git-status/plugin.ts +204 -77
  510. package/src/plugins/llm-debug/plugin.ts +1 -0
  511. package/src/plugins/logs/plugin.ts +9 -0
  512. package/src/plugins/mailbox/plugin.ts +46 -64
  513. package/src/plugins/mailbox/query.ts +15 -7
  514. package/src/plugins/mailbox/state.ts +1 -0
  515. package/src/plugins/resources/filename.ts +19 -0
  516. package/src/plugins/resources/plugin.ts +111 -59
  517. package/src/plugins/result-eviction/plugin.ts +6 -1
  518. package/src/plugins/services/plugin.ts +254 -98
  519. package/src/plugins/services/prompt.ts +1 -6
  520. package/src/plugins/services/schema.ts +17 -3
  521. package/src/plugins/services/service.ts +702 -252
  522. package/src/plugins/session-lifecycle/plugin.ts +56 -41
  523. package/src/plugins/session-state/plugin.ts +242 -88
  524. package/src/plugins/session-stats/plugin.ts +1 -0
  525. package/src/plugins/shell/executor.ts +144 -226
  526. package/src/plugins/shell/index.ts +1 -4
  527. package/src/plugins/shell/plugin.ts +7 -9
  528. package/src/plugins/skills/discovery.ts +10 -8
  529. package/src/plugins/skills/index.ts +1 -1
  530. package/src/plugins/skills/plugin.ts +19 -27
  531. package/src/plugins/skills/prompts.ts +3 -3
  532. package/src/plugins/skills/schema.ts +5 -2
  533. package/src/plugins/uploads/plugin.ts +991 -273
  534. package/src/plugins/uploads/preprocessor.ts +25 -0
  535. package/src/plugins/uploads/preprocessors/image-classifier.ts +56 -25
  536. package/src/plugins/uploads/preprocessors/markitdown-preprocessor.ts +41 -15
  537. package/src/plugins/uploads/preprocessors/pdf-preprocessor.ts +32 -16
  538. package/src/plugins/uploads/preprocessors/zip-preprocessor.ts +67 -38
  539. package/src/plugins/uploads/schema.ts +30 -3
  540. package/src/plugins/uploads/state.ts +12 -0
  541. package/src/plugins/user-chat/plugin.ts +196 -40
  542. package/src/plugins/workers/context.ts +102 -39
  543. package/src/plugins/workers/definition.ts +7 -0
  544. package/src/plugins/workers/index.ts +4 -4
  545. package/src/plugins/workers/plugin.ts +461 -151
  546. package/src/plugins/workers/state.ts +64 -0
  547. package/src/plugins/workers/worker.ts +15 -4
  548. package/src/testing/conformance.ts +1751 -0
  549. package/src/testing/node-platform.ts +5 -0
  550. package/src/testing/test-harness.ts +21 -38
  551. package/src/testing/wait-helpers.ts +1 -4
  552. package/src/transport/adapter/client-adapter.ts +60 -3
  553. package/src/transport/adapter/heartbeat.ts +50 -0
  554. package/src/transport/adapter/server-adapter.ts +6 -0
  555. package/src/transport/http/app.ts +7 -35
  556. package/src/transport/http/context.ts +46 -0
  557. package/src/transport/http/fetch-guard.ts +318 -0
  558. package/src/transport/http/index.ts +1 -1
  559. package/src/transport/http/middleware/bearer-auth.ts +1 -1
  560. package/src/transport/http/middleware/error-handler.ts +1 -1
  561. package/src/transport/http/path-containment.ts +44 -0
  562. package/src/transport/http/responses.ts +20 -0
  563. package/src/transport/http/routes/files.ts +69 -159
  564. package/src/transport/http/routes/resources.ts +124 -93
  565. package/src/transport/http/routes/rpc.ts +63 -26
  566. package/src/transport/http/routes/upload.ts +327 -258
  567. package/src/user-config.ts +93 -7
  568. package/dist/config.test.d.ts +0 -2
  569. package/dist/config.test.d.ts.map +0 -1
  570. package/dist/config.test.js +0 -155
  571. package/dist/config.test.js.map +0 -1
  572. package/dist/core/agent-loop.integration.test.d.ts +0 -2
  573. package/dist/core/agent-loop.integration.test.d.ts.map +0 -1
  574. package/dist/core/agent-loop.integration.test.js +0 -414
  575. package/dist/core/agent-loop.integration.test.js.map +0 -1
  576. package/dist/core/agents/agent-config.test.d.ts +0 -2
  577. package/dist/core/agents/agent-config.test.d.ts.map +0 -1
  578. package/dist/core/agents/agent-config.test.js +0 -194
  579. package/dist/core/agents/agent-config.test.js.map +0 -1
  580. package/dist/core/agents/agent-shutdown.test.d.ts +0 -6
  581. package/dist/core/agents/agent-shutdown.test.d.ts.map +0 -1
  582. package/dist/core/agents/agent-shutdown.test.js +0 -180
  583. package/dist/core/agents/agent-shutdown.test.js.map +0 -1
  584. package/dist/core/agents/agent.test.d.ts +0 -2
  585. package/dist/core/agents/agent.test.d.ts.map +0 -1
  586. package/dist/core/agents/agent.test.js +0 -313
  587. package/dist/core/agents/agent.test.js.map +0 -1
  588. package/dist/core/agents/communicator.d.ts +0 -3
  589. package/dist/core/agents/communicator.d.ts.map +0 -1
  590. package/dist/core/agents/communicator.js +0 -13
  591. package/dist/core/agents/communicator.js.map +0 -1
  592. package/dist/core/agents/handler-events.test.d.ts +0 -5
  593. package/dist/core/agents/handler-events.test.d.ts.map +0 -1
  594. package/dist/core/agents/handler-events.test.js +0 -115
  595. package/dist/core/agents/handler-events.test.js.map +0 -1
  596. package/dist/core/agents/response-sanitizer.test.d.ts +0 -2
  597. package/dist/core/agents/response-sanitizer.test.d.ts.map +0 -1
  598. package/dist/core/agents/response-sanitizer.test.js +0 -101
  599. package/dist/core/agents/response-sanitizer.test.js.map +0 -1
  600. package/dist/core/error-recovery.integration.test.d.ts +0 -2
  601. package/dist/core/error-recovery.integration.test.d.ts.map +0 -1
  602. package/dist/core/error-recovery.integration.test.js +0 -288
  603. package/dist/core/error-recovery.integration.test.js.map +0 -1
  604. package/dist/core/event-sourcing.integration.test.d.ts +0 -2
  605. package/dist/core/event-sourcing.integration.test.d.ts.map +0 -1
  606. package/dist/core/event-sourcing.integration.test.js +0 -154
  607. package/dist/core/event-sourcing.integration.test.js.map +0 -1
  608. package/dist/core/events/file.test.d.ts +0 -2
  609. package/dist/core/events/file.test.d.ts.map +0 -1
  610. package/dist/core/events/file.test.js +0 -284
  611. package/dist/core/events/file.test.js.map +0 -1
  612. package/dist/core/events/memory.test.d.ts +0 -2
  613. package/dist/core/events/memory.test.d.ts.map +0 -1
  614. package/dist/core/events/memory.test.js +0 -502
  615. package/dist/core/events/memory.test.js.map +0 -1
  616. package/dist/core/image/image-processor.test.d.ts +0 -2
  617. package/dist/core/image/image-processor.test.d.ts.map +0 -1
  618. package/dist/core/image/image-processor.test.js +0 -171
  619. package/dist/core/image/image-processor.test.js.map +0 -1
  620. package/dist/core/image/vips-resizer.test.d.ts +0 -2
  621. package/dist/core/image/vips-resizer.test.d.ts.map +0 -1
  622. package/dist/core/image/vips-resizer.test.js +0 -336
  623. package/dist/core/image/vips-resizer.test.js.map +0 -1
  624. package/dist/core/llm/anthropic.test.d.ts +0 -2
  625. package/dist/core/llm/anthropic.test.d.ts.map +0 -1
  626. package/dist/core/llm/anthropic.test.js +0 -464
  627. package/dist/core/llm/anthropic.test.js.map +0 -1
  628. package/dist/core/llm/cache-breakpoints.test.d.ts +0 -2
  629. package/dist/core/llm/cache-breakpoints.test.d.ts.map +0 -1
  630. package/dist/core/llm/cache-breakpoints.test.js +0 -69
  631. package/dist/core/llm/cache-breakpoints.test.js.map +0 -1
  632. package/dist/core/llm/cache-live.test.d.ts +0 -16
  633. package/dist/core/llm/cache-live.test.d.ts.map +0 -1
  634. package/dist/core/llm/cache-live.test.js +0 -137
  635. package/dist/core/llm/cache-live.test.js.map +0 -1
  636. package/dist/core/llm/logger.test.d.ts +0 -7
  637. package/dist/core/llm/logger.test.d.ts.map +0 -1
  638. package/dist/core/llm/logger.test.js +0 -228
  639. package/dist/core/llm/logger.test.js.map +0 -1
  640. package/dist/core/llm/message-sanitization.test.d.ts +0 -2
  641. package/dist/core/llm/message-sanitization.test.d.ts.map +0 -1
  642. package/dist/core/llm/message-sanitization.test.js +0 -181
  643. package/dist/core/llm/message-sanitization.test.js.map +0 -1
  644. package/dist/core/llm/mock.test.d.ts +0 -2
  645. package/dist/core/llm/mock.test.d.ts.map +0 -1
  646. package/dist/core/llm/mock.test.js +0 -318
  647. package/dist/core/llm/mock.test.js.map +0 -1
  648. package/dist/core/llm/model-shortlist-live.test.d.ts +0 -35
  649. package/dist/core/llm/model-shortlist-live.test.d.ts.map +0 -1
  650. package/dist/core/llm/model-shortlist-live.test.js +0 -452
  651. package/dist/core/llm/model-shortlist-live.test.js.map +0 -1
  652. package/dist/core/llm/openrouter-mapping.test.d.ts +0 -2
  653. package/dist/core/llm/openrouter-mapping.test.d.ts.map +0 -1
  654. package/dist/core/llm/openrouter-mapping.test.js +0 -190
  655. package/dist/core/llm/openrouter-mapping.test.js.map +0 -1
  656. package/dist/core/llm/openrouter.test.d.ts +0 -2
  657. package/dist/core/llm/openrouter.test.d.ts.map +0 -1
  658. package/dist/core/llm/openrouter.test.js +0 -377
  659. package/dist/core/llm/openrouter.test.js.map +0 -1
  660. package/dist/core/llm/provider-integration.test.d.ts +0 -12
  661. package/dist/core/llm/provider-integration.test.d.ts.map +0 -1
  662. package/dist/core/llm/provider-integration.test.js +0 -350
  663. package/dist/core/llm/provider-integration.test.js.map +0 -1
  664. package/dist/core/llm/reasoning-details.test.d.ts +0 -2
  665. package/dist/core/llm/reasoning-details.test.d.ts.map +0 -1
  666. package/dist/core/llm/reasoning-details.test.js +0 -144
  667. package/dist/core/llm/reasoning-details.test.js.map +0 -1
  668. package/dist/core/llm/routing-provider.test.d.ts +0 -2
  669. package/dist/core/llm/routing-provider.test.d.ts.map +0 -1
  670. package/dist/core/llm/routing-provider.test.js +0 -94
  671. package/dist/core/llm/routing-provider.test.js.map +0 -1
  672. package/dist/core/llm/snapshot-middleware.test.d.ts +0 -2
  673. package/dist/core/llm/snapshot-middleware.test.d.ts.map +0 -1
  674. package/dist/core/llm/snapshot-middleware.test.js +0 -144
  675. package/dist/core/llm/snapshot-middleware.test.js.map +0 -1
  676. package/dist/core/llm/thinking-blocks.test.d.ts +0 -2
  677. package/dist/core/llm/thinking-blocks.test.d.ts.map +0 -1
  678. package/dist/core/llm/thinking-blocks.test.js +0 -291
  679. package/dist/core/llm/thinking-blocks.test.js.map +0 -1
  680. package/dist/core/multi-agent.integration.test.d.ts +0 -2
  681. package/dist/core/multi-agent.integration.test.d.ts.map +0 -1
  682. package/dist/core/multi-agent.integration.test.js +0 -298
  683. package/dist/core/multi-agent.integration.test.js.map +0 -1
  684. package/dist/core/plugin-hooks.integration.test.d.ts +0 -2
  685. package/dist/core/plugin-hooks.integration.test.d.ts.map +0 -1
  686. package/dist/core/plugin-hooks.integration.test.js +0 -458
  687. package/dist/core/plugin-hooks.integration.test.js.map +0 -1
  688. package/dist/core/reasoning-round-trip.integration.test.d.ts +0 -2
  689. package/dist/core/reasoning-round-trip.integration.test.d.ts.map +0 -1
  690. package/dist/core/reasoning-round-trip.integration.test.js +0 -150
  691. package/dist/core/reasoning-round-trip.integration.test.js.map +0 -1
  692. package/dist/core/session-lifecycle.integration.test.d.ts +0 -2
  693. package/dist/core/session-lifecycle.integration.test.d.ts.map +0 -1
  694. package/dist/core/session-lifecycle.integration.test.js +0 -159
  695. package/dist/core/session-lifecycle.integration.test.js.map +0 -1
  696. package/dist/core/sessions/fork-utils.test.d.ts +0 -2
  697. package/dist/core/sessions/fork-utils.test.d.ts.map +0 -1
  698. package/dist/core/sessions/fork-utils.test.js +0 -129
  699. package/dist/core/sessions/fork-utils.test.js.map +0 -1
  700. package/dist/core/sessions/session-overrides.integration.test.d.ts +0 -2
  701. package/dist/core/sessions/session-overrides.integration.test.d.ts.map +0 -1
  702. package/dist/core/sessions/session-overrides.integration.test.js +0 -154
  703. package/dist/core/sessions/session-overrides.integration.test.js.map +0 -1
  704. package/dist/core/sessions/session.test.d.ts +0 -2
  705. package/dist/core/sessions/session.test.d.ts.map +0 -1
  706. package/dist/core/sessions/session.test.js +0 -1100
  707. package/dist/core/sessions/session.test.js.map +0 -1
  708. package/dist/core/tools/executor.test.d.ts +0 -2
  709. package/dist/core/tools/executor.test.d.ts.map +0 -1
  710. package/dist/core/tools/executor.test.js +0 -144
  711. package/dist/core/tools/executor.test.js.map +0 -1
  712. package/dist/lib/logger/console.test.d.ts +0 -2
  713. package/dist/lib/logger/console.test.d.ts.map +0 -1
  714. package/dist/lib/logger/console.test.js +0 -258
  715. package/dist/lib/logger/console.test.js.map +0 -1
  716. package/dist/lib/never.d.ts +0 -2
  717. package/dist/lib/never.d.ts.map +0 -1
  718. package/dist/lib/never.js +0 -4
  719. package/dist/lib/never.js.map +0 -1
  720. package/dist/lib/utils/concurrency.test.d.ts +0 -2
  721. package/dist/lib/utils/concurrency.test.d.ts.map +0 -1
  722. package/dist/lib/utils/concurrency.test.js +0 -135
  723. package/dist/lib/utils/concurrency.test.js.map +0 -1
  724. package/dist/plugins/agent-status/agent-status.test.d.ts +0 -2
  725. package/dist/plugins/agent-status/agent-status.test.d.ts.map +0 -1
  726. package/dist/plugins/agent-status/agent-status.test.js +0 -136
  727. package/dist/plugins/agent-status/agent-status.test.js.map +0 -1
  728. package/dist/plugins/agents/agents.integration.test.d.ts +0 -2
  729. package/dist/plugins/agents/agents.integration.test.d.ts.map +0 -1
  730. package/dist/plugins/agents/agents.integration.test.js +0 -830
  731. package/dist/plugins/agents/agents.integration.test.js.map +0 -1
  732. package/dist/plugins/agents/supervision.integration.test.d.ts +0 -2
  733. package/dist/plugins/agents/supervision.integration.test.d.ts.map +0 -1
  734. package/dist/plugins/agents/supervision.integration.test.js +0 -215
  735. package/dist/plugins/agents/supervision.integration.test.js.map +0 -1
  736. package/dist/plugins/context-compact/compaction-live.test.d.ts +0 -17
  737. package/dist/plugins/context-compact/compaction-live.test.d.ts.map +0 -1
  738. package/dist/plugins/context-compact/compaction-live.test.js +0 -177
  739. package/dist/plugins/context-compact/compaction-live.test.js.map +0 -1
  740. package/dist/plugins/context-compact/context-compact.integration.test.d.ts +0 -2
  741. package/dist/plugins/context-compact/context-compact.integration.test.d.ts.map +0 -1
  742. package/dist/plugins/context-compact/context-compact.integration.test.js +0 -364
  743. package/dist/plugins/context-compact/context-compact.integration.test.js.map +0 -1
  744. package/dist/plugins/context-compact/context-compactor.test.d.ts +0 -2
  745. package/dist/plugins/context-compact/context-compactor.test.d.ts.map +0 -1
  746. package/dist/plugins/context-compact/context-compactor.test.js +0 -858
  747. package/dist/plugins/context-compact/context-compactor.test.js.map +0 -1
  748. package/dist/plugins/context-compact/history-offloader.test.d.ts +0 -2
  749. package/dist/plugins/context-compact/history-offloader.test.d.ts.map +0 -1
  750. package/dist/plugins/context-compact/history-offloader.test.js +0 -77
  751. package/dist/plugins/context-compact/history-offloader.test.js.map +0 -1
  752. package/dist/plugins/filesystem/filesystem.integration.test.d.ts +0 -2
  753. package/dist/plugins/filesystem/filesystem.integration.test.d.ts.map +0 -1
  754. package/dist/plugins/filesystem/filesystem.integration.test.js +0 -447
  755. package/dist/plugins/filesystem/filesystem.integration.test.js.map +0 -1
  756. package/dist/plugins/filesystem/schema.d.ts +0 -7
  757. package/dist/plugins/filesystem/schema.d.ts.map +0 -1
  758. package/dist/plugins/filesystem/schema.js +0 -2
  759. package/dist/plugins/filesystem/schema.js.map +0 -1
  760. package/dist/plugins/limits-guard/limit-guard.test.d.ts +0 -2
  761. package/dist/plugins/limits-guard/limit-guard.test.d.ts.map +0 -1
  762. package/dist/plugins/limits-guard/limit-guard.test.js +0 -194
  763. package/dist/plugins/limits-guard/limit-guard.test.js.map +0 -1
  764. package/dist/plugins/limits-guard/limits-guard.integration.test.d.ts +0 -2
  765. package/dist/plugins/limits-guard/limits-guard.integration.test.d.ts.map +0 -1
  766. package/dist/plugins/limits-guard/limits-guard.integration.test.js +0 -887
  767. package/dist/plugins/limits-guard/limits-guard.integration.test.js.map +0 -1
  768. package/dist/plugins/llm-debug/llm-debug.integration.test.d.ts +0 -2
  769. package/dist/plugins/llm-debug/llm-debug.integration.test.d.ts.map +0 -1
  770. package/dist/plugins/llm-debug/llm-debug.integration.test.js +0 -157
  771. package/dist/plugins/llm-debug/llm-debug.integration.test.js.map +0 -1
  772. package/dist/plugins/mailbox/mailbox.integration.test.d.ts +0 -2
  773. package/dist/plugins/mailbox/mailbox.integration.test.d.ts.map +0 -1
  774. package/dist/plugins/mailbox/mailbox.integration.test.js +0 -678
  775. package/dist/plugins/mailbox/mailbox.integration.test.js.map +0 -1
  776. package/dist/plugins/resources/resources.integration.test.d.ts +0 -2
  777. package/dist/plugins/resources/resources.integration.test.d.ts.map +0 -1
  778. package/dist/plugins/resources/resources.integration.test.js +0 -62
  779. package/dist/plugins/resources/resources.integration.test.js.map +0 -1
  780. package/dist/plugins/result-eviction/result-eviction.integration.test.d.ts +0 -2
  781. package/dist/plugins/result-eviction/result-eviction.integration.test.d.ts.map +0 -1
  782. package/dist/plugins/result-eviction/result-eviction.integration.test.js +0 -294
  783. package/dist/plugins/result-eviction/result-eviction.integration.test.js.map +0 -1
  784. package/dist/plugins/services/pid-registry.test.d.ts +0 -2
  785. package/dist/plugins/services/pid-registry.test.d.ts.map +0 -1
  786. package/dist/plugins/services/pid-registry.test.js +0 -161
  787. package/dist/plugins/services/pid-registry.test.js.map +0 -1
  788. package/dist/plugins/services/services.integration.test.d.ts +0 -2
  789. package/dist/plugins/services/services.integration.test.d.ts.map +0 -1
  790. package/dist/plugins/services/services.integration.test.js +0 -1057
  791. package/dist/plugins/services/services.integration.test.js.map +0 -1
  792. package/dist/plugins/session-lifecycle/session-lifecycle.integration.test.d.ts +0 -2
  793. package/dist/plugins/session-lifecycle/session-lifecycle.integration.test.d.ts.map +0 -1
  794. package/dist/plugins/session-lifecycle/session-lifecycle.integration.test.js +0 -498
  795. package/dist/plugins/session-lifecycle/session-lifecycle.integration.test.js.map +0 -1
  796. package/dist/plugins/session-stats/plugin.test.d.ts +0 -2
  797. package/dist/plugins/session-stats/plugin.test.d.ts.map +0 -1
  798. package/dist/plugins/session-stats/plugin.test.js +0 -145
  799. package/dist/plugins/session-stats/plugin.test.js.map +0 -1
  800. package/dist/plugins/shell/shell.integration.test.d.ts +0 -2
  801. package/dist/plugins/shell/shell.integration.test.d.ts.map +0 -1
  802. package/dist/plugins/shell/shell.integration.test.js +0 -234
  803. package/dist/plugins/shell/shell.integration.test.js.map +0 -1
  804. package/dist/plugins/shell/shell.test.d.ts +0 -2
  805. package/dist/plugins/shell/shell.test.d.ts.map +0 -1
  806. package/dist/plugins/shell/shell.test.js +0 -236
  807. package/dist/plugins/shell/shell.test.js.map +0 -1
  808. package/dist/plugins/skills/discovery.test.d.ts +0 -2
  809. package/dist/plugins/skills/discovery.test.d.ts.map +0 -1
  810. package/dist/plugins/skills/discovery.test.js +0 -312
  811. package/dist/plugins/skills/discovery.test.js.map +0 -1
  812. package/dist/plugins/skills/skills.integration.test.d.ts +0 -2
  813. package/dist/plugins/skills/skills.integration.test.d.ts.map +0 -1
  814. package/dist/plugins/skills/skills.integration.test.js +0 -475
  815. package/dist/plugins/skills/skills.integration.test.js.map +0 -1
  816. package/dist/plugins/todo/todo.integration.test.d.ts +0 -2
  817. package/dist/plugins/todo/todo.integration.test.d.ts.map +0 -1
  818. package/dist/plugins/todo/todo.integration.test.js +0 -605
  819. package/dist/plugins/todo/todo.integration.test.js.map +0 -1
  820. package/dist/plugins/uploads/preprocessors/image-classifier.test.d.ts +0 -2
  821. package/dist/plugins/uploads/preprocessors/image-classifier.test.d.ts.map +0 -1
  822. package/dist/plugins/uploads/preprocessors/image-classifier.test.js +0 -113
  823. package/dist/plugins/uploads/preprocessors/image-classifier.test.js.map +0 -1
  824. package/dist/plugins/uploads/uploads.integration.test.d.ts +0 -2
  825. package/dist/plugins/uploads/uploads.integration.test.d.ts.map +0 -1
  826. package/dist/plugins/uploads/uploads.integration.test.js +0 -639
  827. package/dist/plugins/uploads/uploads.integration.test.js.map +0 -1
  828. package/dist/plugins/user-chat/user-chat.integration.test.d.ts +0 -2
  829. package/dist/plugins/user-chat/user-chat.integration.test.d.ts.map +0 -1
  830. package/dist/plugins/user-chat/user-chat.integration.test.js +0 -754
  831. package/dist/plugins/user-chat/user-chat.integration.test.js.map +0 -1
  832. package/dist/plugins/workers/workers.integration.test.d.ts +0 -2
  833. package/dist/plugins/workers/workers.integration.test.d.ts.map +0 -1
  834. package/dist/plugins/workers/workers.integration.test.js +0 -629
  835. package/dist/plugins/workers/workers.integration.test.js.map +0 -1
  836. package/dist/prompts/macros.test.d.ts +0 -2
  837. package/dist/prompts/macros.test.d.ts.map +0 -1
  838. package/dist/prompts/macros.test.js +0 -80
  839. package/dist/prompts/macros.test.js.map +0 -1
  840. package/dist/testing/test-harness.test.d.ts +0 -2
  841. package/dist/testing/test-harness.test.d.ts.map +0 -1
  842. package/dist/testing/test-harness.test.js +0 -92
  843. package/dist/testing/test-harness.test.js.map +0 -1
  844. package/dist/transport/http/routes/rpc.integration.test.d.ts +0 -2
  845. package/dist/transport/http/routes/rpc.integration.test.d.ts.map +0 -1
  846. package/dist/transport/http/routes/rpc.integration.test.js +0 -189
  847. package/dist/transport/http/routes/rpc.integration.test.js.map +0 -1
  848. package/dist/transport/http/routes/rpc.test.d.ts +0 -2
  849. package/dist/transport/http/routes/rpc.test.d.ts.map +0 -1
  850. package/dist/transport/http/routes/rpc.test.js +0 -316
  851. package/dist/transport/http/routes/rpc.test.js.map +0 -1
  852. package/src/config.test.ts +0 -174
  853. package/src/core/agent-loop.integration.test.ts +0 -503
  854. package/src/core/agents/agent-config.test.ts +0 -240
  855. package/src/core/agents/agent-shutdown.test.ts +0 -236
  856. package/src/core/agents/agent.test.ts +0 -387
  857. package/src/core/agents/communicator.ts +0 -16
  858. package/src/core/agents/handler-events.test.ts +0 -167
  859. package/src/core/agents/response-sanitizer.test.ts +0 -137
  860. package/src/core/error-recovery.integration.test.ts +0 -343
  861. package/src/core/event-sourcing.integration.test.ts +0 -191
  862. package/src/core/events/file.test.ts +0 -436
  863. package/src/core/events/memory.test.ts +0 -741
  864. package/src/core/image/image-processor.test.ts +0 -218
  865. package/src/core/image/vips-resizer.test.ts +0 -388
  866. package/src/core/llm/anthropic.test.ts +0 -546
  867. package/src/core/llm/cache-breakpoints.test.ts +0 -85
  868. package/src/core/llm/cache-live.test.ts +0 -155
  869. package/src/core/llm/logger.test.ts +0 -270
  870. package/src/core/llm/message-sanitization.test.ts +0 -217
  871. package/src/core/llm/mock.test.ts +0 -402
  872. package/src/core/llm/model-shortlist-live.test.ts +0 -577
  873. package/src/core/llm/openrouter-mapping.test.ts +0 -234
  874. package/src/core/llm/openrouter.test.ts +0 -499
  875. package/src/core/llm/provider-integration.test.ts +0 -408
  876. package/src/core/llm/reasoning-details.test.ts +0 -177
  877. package/src/core/llm/routing-provider.test.ts +0 -113
  878. package/src/core/llm/snapshot-middleware.test.ts +0 -168
  879. package/src/core/llm/thinking-blocks.test.ts +0 -345
  880. package/src/core/multi-agent.integration.test.ts +0 -340
  881. package/src/core/plugin-hooks.integration.test.ts +0 -568
  882. package/src/core/reasoning-round-trip.integration.test.ts +0 -188
  883. package/src/core/session-lifecycle.integration.test.ts +0 -202
  884. package/src/core/sessions/fork-utils.test.ts +0 -158
  885. package/src/core/sessions/session-overrides.integration.test.ts +0 -210
  886. package/src/core/sessions/session.test.ts +0 -1736
  887. package/src/core/tools/executor.test.ts +0 -161
  888. package/src/lib/logger/console.test.ts +0 -348
  889. package/src/lib/never.ts +0 -3
  890. package/src/lib/utils/concurrency.test.ts +0 -169
  891. package/src/plugins/agent-status/agent-status.test.ts +0 -164
  892. package/src/plugins/agents/agents.integration.test.ts +0 -976
  893. package/src/plugins/agents/supervision.integration.test.ts +0 -249
  894. package/src/plugins/context-compact/compaction-live.test.ts +0 -221
  895. package/src/plugins/context-compact/context-compact.integration.test.ts +0 -418
  896. package/src/plugins/context-compact/context-compactor.test.ts +0 -1036
  897. package/src/plugins/context-compact/history-offloader.test.ts +0 -100
  898. package/src/plugins/filesystem/filesystem.integration.test.ts +0 -529
  899. package/src/plugins/filesystem/schema.ts +0 -6
  900. package/src/plugins/limits-guard/limit-guard.test.ts +0 -253
  901. package/src/plugins/limits-guard/limits-guard.integration.test.ts +0 -1012
  902. package/src/plugins/llm-debug/llm-debug.integration.test.ts +0 -192
  903. package/src/plugins/mailbox/mailbox.integration.test.ts +0 -794
  904. package/src/plugins/resources/resources.integration.test.ts +0 -68
  905. package/src/plugins/result-eviction/result-eviction.integration.test.ts +0 -332
  906. package/src/plugins/services/pid-registry.test.ts +0 -180
  907. package/src/plugins/services/services.integration.test.ts +0 -1223
  908. package/src/plugins/session-lifecycle/session-lifecycle.integration.test.ts +0 -639
  909. package/src/plugins/session-stats/plugin.test.ts +0 -160
  910. package/src/plugins/shell/shell.integration.test.ts +0 -273
  911. package/src/plugins/shell/shell.test.ts +0 -314
  912. package/src/plugins/skills/discovery.test.ts +0 -395
  913. package/src/plugins/skills/skills.integration.test.ts +0 -580
  914. package/src/plugins/todo/todo.integration.test.ts +0 -687
  915. package/src/plugins/uploads/preprocessors/image-classifier.test.ts +0 -142
  916. package/src/plugins/uploads/uploads.integration.test.ts +0 -831
  917. package/src/plugins/user-chat/user-chat.integration.test.ts +0 -893
  918. package/src/plugins/workers/workers.integration.test.ts +0 -778
  919. package/src/prompts/macros.test.ts +0 -107
  920. package/src/testing/test-harness.test.ts +0 -114
  921. package/src/transport/http/routes/rpc.integration.test.ts +0 -243
  922. package/src/transport/http/routes/rpc.test.ts +0 -372
@@ -5,6 +5,8 @@ export interface ImageResizeOptions {
5
5
  maxFileSizeBytes?: number
6
6
  /** Override the resizer's default max dimension (long side, px). */
7
7
  maxDimension?: number
8
+ /** Cancels external image-processing commands. */
9
+ signal?: AbortSignal
8
10
  }
9
11
 
10
12
  export interface ImageResizer {
@@ -25,31 +25,59 @@ export class VipsImageResizer implements ImageResizer {
25
25
 
26
26
  async resize(filePath: string, mimeType: string, options?: ImageResizeOptions): Promise<ImageResizeResult> {
27
27
  const effectiveMaxDimension = options?.maxDimension ?? this.maxDimension
28
+ const signal = options?.signal
29
+ let ownedTempFile: string | undefined
28
30
  try {
31
+ signal?.throwIfAborted()
29
32
  // Step 1: Dimension resize if needed
30
- const result = await this.dimensionResize(filePath, mimeType, effectiveMaxDimension)
33
+ const result = await this.dimensionResize(filePath, mimeType, effectiveMaxDimension, signal)
34
+ ownedTempFile = result.tempFile
35
+ signal?.throwIfAborted()
31
36
 
32
37
  // Step 2: If no size constraint, done
33
- if (!options?.maxFileSizeBytes) return result
38
+ if (!options?.maxFileSizeBytes) {
39
+ signal?.throwIfAborted()
40
+ return result
41
+ }
34
42
 
35
43
  // Step 3: Check if result fits
36
44
  const fileSize = (await this.fs.stat(result.path)).size
37
- if (fileSize <= options.maxFileSizeBytes) return result
45
+ signal?.throwIfAborted()
46
+ if (fileSize <= options.maxFileSizeBytes) {
47
+ signal?.throwIfAborted()
48
+ return result
49
+ }
38
50
 
39
51
  // Step 4: Compress to fit — clean up dimension resize temp first
40
52
  if (result.tempFile) {
41
53
  await this.fs.unlink(result.tempFile).catch(() => {})
54
+ ownedTempFile = undefined
42
55
  }
43
56
 
44
- return await this.compressToFit(filePath, options.maxFileSizeBytes, effectiveMaxDimension)
57
+ signal?.throwIfAborted()
58
+ const compressed = await this.compressToFit(filePath, options.maxFileSizeBytes, effectiveMaxDimension, signal)
59
+ ownedTempFile = compressed.tempFile
60
+ signal?.throwIfAborted()
61
+ return compressed
45
62
  } catch (e) {
63
+ if (ownedTempFile) {
64
+ await this.fs.unlink(ownedTempFile).catch(() => {})
65
+ }
66
+ if (signal?.aborted) signal.throwIfAborted()
46
67
  console.warn('[image-resize] failed, using original image:', e instanceof Error ? e.message : e)
47
68
  return { path: filePath, mimeType }
48
69
  }
49
70
  }
50
71
 
51
- private async getImageDimensions(filePath: string): Promise<{ width: number; height: number } | null> {
52
- const { stdout } = await this.process.execFile('vipsheader', ['-f', 'width', '-f', 'height', filePath], { timeout: 30_000 })
72
+ private async getImageDimensions(
73
+ filePath: string,
74
+ signal?: AbortSignal,
75
+ ): Promise<{ width: number; height: number } | null> {
76
+ const { stdout } = await this.process.execFile('vipsheader', ['-f', 'width', '-f', 'height', filePath], {
77
+ timeout: 30_000,
78
+ signal,
79
+ })
80
+ signal?.throwIfAborted()
53
81
  const lines = stdout.trim().split('\n')
54
82
  if (lines.length < 2) return null
55
83
  const width = parseInt(lines[0], 10)
@@ -58,12 +86,19 @@ export class VipsImageResizer implements ImageResizer {
58
86
  return { width, height }
59
87
  }
60
88
 
61
- private async dimensionResize(filePath: string, mimeType: string, maxDimension: number): Promise<ImageResizeResult> {
62
- const dims = await this.getImageDimensions(filePath)
89
+ private async dimensionResize(
90
+ filePath: string,
91
+ mimeType: string,
92
+ maxDimension: number,
93
+ signal?: AbortSignal,
94
+ ): Promise<ImageResizeResult> {
95
+ const dims = await this.getImageDimensions(filePath, signal)
96
+ signal?.throwIfAborted()
63
97
  const needsResize = dims !== null && (dims.width > maxDimension || dims.height > maxDimension)
64
98
 
65
99
  // JPEGs within dimension limits pass through unchanged
66
100
  if (mimeType === 'image/jpeg' && !needsResize) {
101
+ signal?.throwIfAborted()
67
102
  return { path: filePath, mimeType }
68
103
  }
69
104
 
@@ -71,17 +106,27 @@ export class VipsImageResizer implements ImageResizer {
71
106
  const id = `${Date.now()}-${Math.random().toString(36).slice(2)}`
72
107
  const outputPath = join(this.tmpDir, `roj-resize-${id}.jpg`)
73
108
 
74
- await this.process.execFile('vipsthumbnail', [
75
- filePath,
76
- '--size',
77
- `${maxDimension}x${maxDimension}`,
78
- '-o',
79
- outputPath,
80
- ], { timeout: 30_000 })
109
+ try {
110
+ await this.process.execFile(
111
+ 'vipsthumbnail',
112
+ [filePath, '--size', `${maxDimension}x${maxDimension}`, '-o', outputPath],
113
+ { timeout: 30_000, signal },
114
+ )
115
+ signal?.throwIfAborted()
116
+ } catch (error) {
117
+ await this.fs.unlink(outputPath).catch(() => {})
118
+ throw error
119
+ }
120
+ signal?.throwIfAborted()
81
121
  return { path: outputPath, mimeType: 'image/jpeg', tempFile: outputPath }
82
122
  }
83
123
 
84
- private async compressToFit(filePath: string, maxFileSizeBytes: number, maxDimension: number): Promise<ImageResizeResult> {
124
+ private async compressToFit(
125
+ filePath: string,
126
+ maxFileSizeBytes: number,
127
+ maxDimension: number,
128
+ signal?: AbortSignal,
129
+ ): Promise<ImageResizeResult> {
85
130
  const halfDim = Math.floor(maxDimension / 2)
86
131
  const attempts = [
87
132
  { dimension: maxDimension, quality: 85 },
@@ -95,31 +140,51 @@ export class VipsImageResizer implements ImageResizer {
95
140
 
96
141
  let lastResult: ImageResizeResult | undefined
97
142
 
98
- for (const { dimension, quality } of attempts) {
99
- const id = `${Date.now()}-${Math.random().toString(36).slice(2)}`
100
- const outputPath = join(this.tmpDir, `roj-compress-${id}.jpg`)
101
-
102
- await this.process.execFile('vipsthumbnail', [
103
- filePath,
104
- '--size',
105
- `${dimension}x${dimension}`,
106
- '-o',
107
- `${outputPath}[Q=${quality}]`,
108
- ], { timeout: 30_000 })
143
+ try {
144
+ for (const { dimension, quality } of attempts) {
145
+ signal?.throwIfAborted()
146
+ const id = `${Date.now()}-${Math.random().toString(36).slice(2)}`
147
+ const outputPath = join(this.tmpDir, `roj-compress-${id}.jpg`)
148
+
149
+ try {
150
+ await this.process.execFile(
151
+ 'vipsthumbnail',
152
+ [filePath, '--size', `${dimension}x${dimension}`, '-o', `${outputPath}[Q=${quality}]`],
153
+ { timeout: 30_000, signal },
154
+ )
155
+ signal?.throwIfAborted()
156
+
157
+ const outputSize = (await this.fs.stat(outputPath)).size
158
+ signal?.throwIfAborted()
159
+ if (lastResult?.tempFile) {
160
+ await this.fs.unlink(lastResult.tempFile).catch(() => {})
161
+ }
162
+ signal?.throwIfAborted()
163
+
164
+ lastResult = {
165
+ path: outputPath,
166
+ mimeType: 'image/jpeg',
167
+ tempFile: outputPath,
168
+ }
169
+ if (outputSize <= maxFileSizeBytes) {
170
+ signal?.throwIfAborted()
171
+ return lastResult
172
+ }
173
+ } catch (error) {
174
+ await this.fs.unlink(outputPath).catch(() => {})
175
+ throw error
176
+ }
177
+ }
109
178
 
110
- // Clean up previous attempt
179
+ // Return best effort (most compressed) — caller decides what to do
180
+ if (!lastResult) throw new Error('Image compression produced no result')
181
+ signal?.throwIfAborted()
182
+ return lastResult
183
+ } catch (error) {
111
184
  if (lastResult?.tempFile) {
112
185
  await this.fs.unlink(lastResult.tempFile).catch(() => {})
113
186
  }
114
-
115
- lastResult = { path: outputPath, mimeType: 'image/jpeg', tempFile: outputPath }
116
-
117
- if ((await this.fs.stat(outputPath)).size <= maxFileSizeBytes) {
118
- return lastResult
119
- }
187
+ throw error
120
188
  }
121
-
122
- // Return best effort (most compressed) — caller decides what to do
123
- return lastResult!
124
189
  }
125
190
  }
@@ -17,7 +17,9 @@ import type {
17
17
  RawInferenceRequest,
18
18
  RawToolSpec,
19
19
  } from './provider.js'
20
- import { ProviderMessageValidationError, sanitizeProviderMessages } from './message-sanitization.js'
20
+ import { mapProviderError } from './provider.js'
21
+ import { ProviderRequestAbortError, runProviderRequest } from './provider-request.js'
22
+ import { sanitizeProviderMessages } from './message-sanitization.js'
21
23
  import type { RoutableLLMProvider } from './routing-provider.js'
22
24
 
23
25
  // ============================================================================
@@ -290,18 +292,8 @@ export class AnthropicProvider implements RoutableLLMProvider {
290
292
  }
291
293
 
292
294
  const httpRequest = await this.buildHttpRequest(rawRequest, context)
293
-
294
- const controller = new AbortController()
295
- const timeoutId = setTimeout(() => controller.abort(), this.timeout)
296
-
297
- // Combine with external signal if provided
298
- if (context?.signal) {
299
- context.signal.addEventListener('abort', () => controller.abort(), { once: true })
300
- }
301
-
302
- let response: Response
303
- try {
304
- response = await this.fetchFn(httpRequest.url, {
295
+ return await runProviderRequest({ callerSignal: context?.signal, timeoutMs: this.timeout }, async (signal) => {
296
+ const response = await this.fetchFn(httpRequest.url, {
305
297
  method: httpRequest.method,
306
298
  headers: {
307
299
  ...httpRequest.headers,
@@ -309,66 +301,70 @@ export class AnthropicProvider implements RoutableLLMProvider {
309
301
  'anthropic-dangerous-direct-browser-access': 'true',
310
302
  },
311
303
  body: JSON.stringify(httpRequest.body),
312
- signal: controller.signal,
304
+ signal,
313
305
  })
314
- } finally {
315
- clearTimeout(timeoutId)
316
- }
317
306
 
318
- if (!response.ok) {
319
- const body = await response.text()
320
- return Err(this.mapHttpError(response.status, body))
321
- }
307
+ if (!response.ok) {
308
+ const body = await response.text()
309
+ return Err(this.mapHttpError(response.status, body))
310
+ }
322
311
 
323
- const data = await response.json() as AnthropicMessageResponse
324
- const latencyMs = Date.now() - startTime
325
-
326
- const textContent = data.content
327
- .filter((block): block is AnthropicTextBlock => block.type === 'text')
328
- .map((block) => block.text)
329
- .join('')
330
-
331
- // Kept whole, in order, signatures included: the API verifies them on replay.
332
- // `redacted_thinking` has no readable text but still has to travel.
333
- const thinkingBlocks = data.content.filter(isThinkingBlock)
334
-
335
- const reasoning = thinkingBlocks
336
- .filter((block): block is AnthropicThinkingBlock => block.type === 'thinking')
337
- .map((block) => block.thinking)
338
- .join('')
339
-
340
- const toolCalls: ToolCall[] = data.content
341
- .filter((block): block is AnthropicToolUseBlock => block.type === 'tool_use')
342
- .map((block) => ({
343
- id: ToolCallId(block.id),
344
- name: block.name,
345
- input: block.input,
346
- }))
347
-
348
- const metrics: LLMMetrics = {
349
- promptTokens: data.usage.input_tokens,
350
- completionTokens: data.usage.output_tokens,
351
- totalTokens: data.usage.input_tokens + data.usage.output_tokens,
352
- latencyMs,
353
- model: data.model,
354
- provider: this.name,
355
- cost: this.calculateCost(data.model, data.usage),
356
- cachedTokens: data.usage.cache_read_input_tokens || undefined,
357
- cacheWriteTokens: data.usage.cache_creation_input_tokens || undefined,
358
- }
312
+ const data = await response.json() as AnthropicMessageResponse
313
+ const latencyMs = Date.now() - startTime
314
+
315
+ const textContent = data.content
316
+ .filter((block): block is AnthropicTextBlock => block.type === 'text')
317
+ .map((block) => block.text)
318
+ .join('')
319
+
320
+ // Kept whole, in order, signatures included: the API verifies them on replay.
321
+ // `redacted_thinking` has no readable text but still has to travel.
322
+ const thinkingBlocks = data.content.filter(isThinkingBlock)
323
+
324
+ const reasoning = thinkingBlocks
325
+ .filter((block): block is AnthropicThinkingBlock => block.type === 'thinking')
326
+ .map((block) => block.thinking)
327
+ .join('')
328
+
329
+ const toolCalls: ToolCall[] = data.content
330
+ .filter((block): block is AnthropicToolUseBlock => block.type === 'tool_use')
331
+ .map((block) => ({
332
+ id: ToolCallId(block.id),
333
+ name: block.name,
334
+ input: block.input,
335
+ }))
336
+
337
+ const metrics: LLMMetrics = {
338
+ promptTokens: data.usage.input_tokens,
339
+ completionTokens: data.usage.output_tokens,
340
+ totalTokens: data.usage.input_tokens + data.usage.output_tokens,
341
+ latencyMs,
342
+ model: data.model,
343
+ provider: this.name,
344
+ cost: this.calculateCost(data.model, data.usage),
345
+ cachedTokens: data.usage.cache_read_input_tokens || undefined,
346
+ cacheWriteTokens: data.usage.cache_creation_input_tokens || undefined,
347
+ }
359
348
 
360
- return Ok({
361
- content: textContent || null,
362
- toolCalls,
363
- finishReason: this.mapStopReason(data.stop_reason),
364
- metrics,
365
- providerRequestId: data.id,
366
- reasoning: reasoning || undefined,
367
- // Normalized to undefined so an empty array never reaches the wire on the way back.
368
- thinkingBlocks: thinkingBlocks.length > 0 ? thinkingBlocks : undefined,
349
+ return Ok({
350
+ content: textContent || null,
351
+ toolCalls,
352
+ finishReason: this.mapStopReason(data.stop_reason),
353
+ metrics,
354
+ providerRequestId: data.id,
355
+ reasoning: reasoning || undefined,
356
+ // Normalized to undefined so an empty array never reaches the wire on the way back.
357
+ thinkingBlocks: thinkingBlocks.length > 0 ? thinkingBlocks : undefined,
358
+ })
369
359
  })
370
360
  } catch (error) {
371
- return Err(this.mapError(error))
361
+ if (error instanceof ProviderRequestAbortError) {
362
+ return Err({
363
+ type: error.abortCause === 'caller' ? 'aborted' : 'timeout',
364
+ message: error.message,
365
+ })
366
+ }
367
+ return Err(mapProviderError(error))
372
368
  }
373
369
  }
374
370
 
@@ -642,16 +638,4 @@ export class AnthropicProvider implements RoutableLLMProvider {
642
638
  return { type: 'server_error', message, statusCode: status, responseBody: body }
643
639
  }
644
640
 
645
- private mapError(err: unknown): LLMError {
646
- if (err instanceof ProviderMessageValidationError) {
647
- return { type: 'invalid_request', message: err.message }
648
- }
649
- if (err instanceof Error && err.name === 'AbortError') {
650
- return { type: 'aborted', message: 'Request was aborted' }
651
- }
652
- if (err instanceof TypeError && (err.message.includes('fetch') || err.message.includes('network'))) {
653
- return { type: 'network_error', message: err.message, cause: err }
654
- }
655
- return { type: 'network_error', message: err instanceof Error ? err.message : String(err), cause: err }
656
- }
657
641
  }
@@ -5,13 +5,20 @@
5
5
  * Per spec.md 9.1: "Pro debugging a audit se bude logovat kompletní LLM komunikace"
6
6
  *
7
7
  * Calls are stored in the session folder: {dataPath}/sessions/{sessionId}/calls/
8
+ *
9
+ * A host that has a table for them ({@link LLMCallStore}) gets rows instead: the
10
+ * same entries, but `completeCall` stops reading the whole entry back to rewrite
11
+ * it and `listCalls` stops being a `readdir` plus one read per row of the page.
12
+ * Without a store nothing changes — same directory, same files, same content.
8
13
  */
9
14
 
10
15
  import { join } from 'node:path'
11
- import type { AgentId } from '~/core/agents/schema.js'
16
+ import { AgentId } from '~/core/agents/schema.js'
12
17
  import { generateLLMCallId, LLMCallId } from '~/core/llm/schema.js'
13
18
  import type { SessionId } from '~/core/sessions/schema.js'
19
+ import { readTextFilesOrUndefined } from '~/lib/utils/fs-batch.js'
14
20
  import type { FileSystem } from '~/platform/fs.js'
21
+ import type { LLMCallRow, LLMCallStore } from '~/platform/llm-call-log.js'
15
22
  import type { LLMCallError, LLMCallLogEntry, LLMCallMessage, LLMCallMetrics, LLMCallRequest, LLMCallResponse } from './llm-log-types.js'
16
23
  import type { InferenceRequest, InferenceResponse, LLMError } from './provider.js'
17
24
 
@@ -27,6 +34,70 @@ export interface LLMLoggerConfig {
27
34
  basePath: string
28
35
  enabled: boolean
29
36
  fs: FileSystem
37
+ /** Rows instead of files, where the host has a table for them. */
38
+ store?: LLMCallStore
39
+ }
40
+
41
+ const ENCODER = new TextEncoder()
42
+
43
+ /** UTF-8 length; the SDK cannot assume `Buffer`. */
44
+ function byteLength(text: string): number {
45
+ return ENCODER.encode(text).byteLength
46
+ }
47
+
48
+ /**
49
+ * Fit a request inside the host's column ceiling.
50
+ *
51
+ * Everything in a request is bounded by the agent definition except the message
52
+ * history, which grows with the session and carries whole tool results. Over the
53
+ * ceiling the store would reject the row and, because `createCall` is awaited on
54
+ * the inference path, turn a logged call into a failed one.
55
+ */
56
+ function clampRequest(request: LLMCallRequest, maxBytes: number | undefined): string {
57
+ const json = JSON.stringify(request)
58
+ // UTF-8 is at most 3 bytes per UTF-16 unit, so the common case never encodes.
59
+ if (maxBytes === undefined || json.length * 3 <= maxBytes) return json
60
+
61
+ const bytes = byteLength(json)
62
+ if (bytes <= maxBytes) return json
63
+
64
+ const dropped: LLMCallRequest = {
65
+ ...request,
66
+ messages: [{
67
+ role: 'system',
68
+ content: `[${request.messages.length} messages, ${bytes} B, dropped: over the host's ${maxBytes} B column limit]`,
69
+ }],
70
+ tools: undefined,
71
+ }
72
+ const withoutMessages = JSON.stringify(dropped)
73
+ if (byteLength(withoutMessages) <= maxBytes) return withoutMessages
74
+
75
+ // A system prompt alone past the ceiling is pathological; keep only what a listing shows.
76
+ const minimal: LLMCallRequest = {
77
+ model: request.model,
78
+ systemPrompt: `[${byteLength(request.systemPrompt)} B, dropped]`,
79
+ messages: [],
80
+ toolsCount: request.tools?.length ?? 0,
81
+ }
82
+ return JSON.stringify(minimal)
83
+ }
84
+
85
+ /** JSON this logger wrote itself; annotated rather than cast, and never validated on read. */
86
+ function parseJson<T>(json: string): T {
87
+ return JSON.parse(json)
88
+ }
89
+
90
+ function parseOptionalJson<T>(json: string | undefined): T | undefined {
91
+ return json === undefined ? undefined : parseJson<T>(json)
92
+ }
93
+
94
+ /** One stored entry, or null when the file stopped being JSON. */
95
+ function parseEntry(content: string): LLMCallLogEntry | null {
96
+ try {
97
+ return parseJson<LLMCallLogEntry>(content)
98
+ } catch {
99
+ return null
100
+ }
30
101
  }
31
102
 
32
103
  // ============================================================================
@@ -35,14 +106,17 @@ export interface LLMLoggerConfig {
35
106
 
36
107
  /**
37
108
  * Logger for LLM requests and responses.
38
- * Stores individual JSON files per LLM call in the session folder.
109
+ * One JSON file per call in the session folder, or one row per call in a
110
+ * {@link LLMCallStore} where the host has one.
39
111
  */
40
112
  export class LLMLogger {
41
113
  private dirCache = new Set<string>()
42
114
  private readonly fs: FileSystem
115
+ private readonly store?: LLMCallStore
43
116
 
44
117
  constructor(private config: LLMLoggerConfig) {
45
118
  this.fs = config.fs
119
+ this.store = config.store
46
120
  }
47
121
 
48
122
  /**
@@ -138,6 +212,18 @@ export class LLMLogger {
138
212
  providerOptions,
139
213
  }
140
214
 
215
+ if (this.store !== undefined) {
216
+ await this.store.create(sessionId, {
217
+ callId,
218
+ agentId,
219
+ createdAt: now,
220
+ status: 'running',
221
+ model: request.model,
222
+ request: clampRequest(callRequest, this.store.maxBlobBytes),
223
+ })
224
+ return callId
225
+ }
226
+
141
227
  const entry: LLMCallLogEntry = {
142
228
  id: callId,
143
229
  sessionId,
@@ -163,17 +249,6 @@ export class LLMLogger {
163
249
  response: InferenceResponse,
164
250
  durationMs: number,
165
251
  ): Promise<void> {
166
- const filePath = this.getCallFilePath(sessionId, callId)
167
-
168
- let entry: LLMCallLogEntry
169
- try {
170
- const content = await this.fs.readFile(filePath, 'utf-8')
171
- entry = JSON.parse(content) as LLMCallLogEntry
172
- } catch {
173
- // File doesn't exist or is invalid - skip update
174
- return
175
- }
176
-
177
252
  const callResponse: LLMCallResponse = {
178
253
  content: response.content,
179
254
  toolCalls: response.toolCalls.map((tc) => ({
@@ -199,6 +274,25 @@ export class LLMLogger {
199
274
  reasoningTokens: response.metrics.reasoningTokens,
200
275
  }
201
276
 
277
+ if (this.store !== undefined) {
278
+ // The whole reason for splitting the row: no read-back, and the request
279
+ // column is not in the SET list.
280
+ await this.store.complete(sessionId, callId, {
281
+ status: 'success',
282
+ completedAt: Date.now(),
283
+ durationMs,
284
+ providerRequestId: response.providerRequestId,
285
+ response: JSON.stringify(callResponse),
286
+ metrics: JSON.stringify(callMetrics),
287
+ })
288
+ return
289
+ }
290
+
291
+ const filePath = this.getCallFilePath(sessionId, callId)
292
+ const entry = await this.readEntry(filePath)
293
+ // File doesn't exist or is invalid - skip update
294
+ if (entry === null) return
295
+
202
296
  entry.status = 'success'
203
297
  entry.completedAt = Date.now()
204
298
  entry.durationMs = durationMs
@@ -218,17 +312,6 @@ export class LLMLogger {
218
312
  error: LLMError,
219
313
  durationMs: number,
220
314
  ): Promise<void> {
221
- const filePath = this.getCallFilePath(sessionId, callId)
222
-
223
- let entry: LLMCallLogEntry
224
- try {
225
- const content = await this.fs.readFile(filePath, 'utf-8')
226
- entry = JSON.parse(content) as LLMCallLogEntry
227
- } catch {
228
- // File doesn't exist or is invalid - skip update
229
- return
230
- }
231
-
232
315
  const callError: LLMCallError = {
233
316
  type: error.type,
234
317
  message: error.message,
@@ -237,6 +320,21 @@ export class LLMLogger {
237
320
  responseBody: error.responseBody,
238
321
  }
239
322
 
323
+ if (this.store !== undefined) {
324
+ await this.store.complete(sessionId, callId, {
325
+ status: 'error',
326
+ completedAt: Date.now(),
327
+ durationMs,
328
+ error: JSON.stringify(callError),
329
+ })
330
+ return
331
+ }
332
+
333
+ const filePath = this.getCallFilePath(sessionId, callId)
334
+ const entry = await this.readEntry(filePath)
335
+ // File doesn't exist or is invalid - skip update
336
+ if (entry === null) return
337
+
240
338
  entry.status = 'error'
241
339
  entry.completedAt = Date.now()
242
340
  entry.durationMs = durationMs
@@ -252,11 +350,18 @@ export class LLMLogger {
252
350
  sessionId: SessionId,
253
351
  callId: LLMCallId,
254
352
  ): Promise<LLMCallLogEntry | null> {
255
- const filePath = this.getCallFilePath(sessionId, callId)
353
+ if (this.store !== undefined) {
354
+ const row = await this.store.get(sessionId, callId)
355
+ return row === null ? null : toEntry(sessionId, row)
356
+ }
357
+
358
+ return this.readEntry(this.getCallFilePath(sessionId, callId))
359
+ }
256
360
 
361
+ /** One stored entry, or null when the file has gone or stopped being JSON. */
362
+ private async readEntry(filePath: string): Promise<LLMCallLogEntry | null> {
257
363
  try {
258
- const content = await this.fs.readFile(filePath, 'utf-8')
259
- return JSON.parse(content) as LLMCallLogEntry
364
+ return parseEntry(await this.fs.readFile(filePath, 'utf-8'))
260
365
  } catch {
261
366
  return null
262
367
  }
@@ -269,6 +374,17 @@ export class LLMLogger {
269
374
  sessionId: SessionId,
270
375
  options?: { limit?: number; offset?: number },
271
376
  ): Promise<{ calls: LLMCallLogEntry[]; total: number }> {
377
+ const offset = options?.offset ?? 0
378
+ const limit = options?.limit ?? 100
379
+
380
+ if (this.store !== undefined) {
381
+ // One indexed query where the file path listed a directory, sorted the
382
+ // names and read the page's files one at a time. Same order, same page
383
+ // boundaries — see LLMCallStore.list.
384
+ const page = await this.store.list(sessionId, { limit, offset })
385
+ return { calls: page.calls.map((row) => toEntry(sessionId, row)), total: page.total }
386
+ }
387
+
272
388
  const callsDir = join(this.config.basePath, 'sessions', sessionId, 'calls')
273
389
 
274
390
  let files: string[]
@@ -286,21 +402,43 @@ export class LLMLogger {
286
402
  .reverse() // Most recent first
287
403
 
288
404
  const total = jsonFiles.length
289
- const offset = options?.offset ?? 0
290
- const limit = options?.limit ?? 100
291
405
  const paginated = jsonFiles.slice(offset, offset + limit)
292
406
 
407
+ // The page is a known set of paths, so it is asked for as one where the
408
+ // platform takes one — the same read the store branch above replaces with
409
+ // a single query.
410
+ const contents = await readTextFilesOrUndefined(this.fs, paginated.map((file) => join(callsDir, file)))
411
+
293
412
  const calls: LLMCallLogEntry[] = []
294
- for (const file of paginated) {
295
- try {
296
- const filePath = join(callsDir, file)
297
- const content = await this.fs.readFile(filePath, 'utf-8')
298
- calls.push(JSON.parse(content) as LLMCallLogEntry)
299
- } catch {
300
- // Skip invalid files
301
- }
413
+ for (const content of contents) {
414
+ // Skip invalid files
415
+ const entry = content === undefined ? null : parseEntry(content)
416
+ if (entry !== null) calls.push(entry)
302
417
  }
303
418
 
304
419
  return { calls, total }
305
420
  }
306
421
  }
422
+
423
+ /**
424
+ * Reassemble a stored row into the entry every reader is typed against.
425
+ *
426
+ * `sessionId` comes from the key rather than the row: it is what the caller
427
+ * looked the row up by, so storing it again would only be a second copy.
428
+ */
429
+ function toEntry(sessionId: SessionId, row: LLMCallRow): LLMCallLogEntry {
430
+ return {
431
+ id: LLMCallId(row.callId),
432
+ sessionId,
433
+ agentId: AgentId(row.agentId),
434
+ createdAt: row.createdAt,
435
+ completedAt: row.completedAt,
436
+ durationMs: row.durationMs,
437
+ status: row.status,
438
+ request: parseJson<LLMCallRequest>(row.request),
439
+ response: parseOptionalJson<LLMCallResponse>(row.response),
440
+ metrics: parseOptionalJson<LLMCallMetrics>(row.metrics),
441
+ error: parseOptionalJson<LLMCallError>(row.error),
442
+ providerRequestId: row.providerRequestId,
443
+ }
444
+ }