@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,4 +1,4 @@
1
- import type { ToolCall } from '~/core/agents/state.js'
1
+ import type { ReasoningDetails, ToolCall } from '~/core/agents/state.js'
2
2
  import type { ImageProcessor } from '~/core/image/types.js'
3
3
  import type { ChatMessageContentItem } from '~/core/llm/llm-log-types.js'
4
4
  import { ToolCallId } from '~/core/tools/schema.js'
@@ -14,10 +14,13 @@ import type {
14
14
  LLMMetrics,
15
15
  LLMProvider,
16
16
  OpenRouterProviderRouting,
17
+ OpenRouterReasoningOptions,
17
18
  ProviderHttpRequest,
18
19
  RawInferenceRequest,
19
20
  } from './provider.js'
20
- import { ProviderMessageValidationError, sanitizeProviderMessages } from './message-sanitization.js'
21
+ import { mapProviderError } from './provider.js'
22
+ import { ProviderRequestAbortError, runProviderRequest } from './provider-request.js'
23
+ import { sanitizeProviderMessages } from './message-sanitization.js'
21
24
 
22
25
  // ============================================================================
23
26
  // Configuration
@@ -52,6 +55,9 @@ interface OpenRouterChoice {
52
55
  message: {
53
56
  content: string | null | Array<{ type: string; text?: string }>
54
57
  tool_calls?: OpenRouterToolCall[]
58
+ /** Plaintext chain of thought, when the model exposes one. Display only — the round trip goes through reasoning_details. */
59
+ reasoning?: string
60
+ reasoning_details?: ReasoningDetails
55
61
  }
56
62
  finish_reason: string | null
57
63
  }
@@ -107,6 +113,7 @@ interface OpenRouterMessage {
107
113
  content: string | OpenRouterContentItem[]
108
114
  tool_calls?: OpenRouterToolCall[]
109
115
  tool_call_id?: string
116
+ reasoning_details?: ReasoningDetails
110
117
  }
111
118
 
112
119
  /**
@@ -160,6 +167,8 @@ interface OpenRouterRequestBody {
160
167
  stream_options: { include_usage: true }
161
168
  /** Provider routing preferences */
162
169
  provider?: OpenRouterProviderRouting
170
+ /** Reasoning budget */
171
+ reasoning?: OpenRouterReasoningOptions
163
172
  /** Routing strategy */
164
173
  route?: 'fallback'
165
174
  /** Model transforms */
@@ -206,76 +215,74 @@ export class OpenRouterProvider implements LLMProvider {
206
215
  }
207
216
 
208
217
  const httpRequest = await this.buildHttpRequest(rawRequest, context)
209
-
210
- const controller = new AbortController()
211
- const timeoutId = setTimeout(() => controller.abort(), this.timeout)
212
-
213
- if (context?.signal) {
214
- context.signal.addEventListener('abort', () => controller.abort(), { once: true })
215
- }
216
-
217
- let response: Response
218
- try {
219
- response = await this.fetchFn(httpRequest.url, {
218
+ return await runProviderRequest({ callerSignal: context?.signal, timeoutMs: this.timeout }, async (signal) => {
219
+ const response = await this.fetchFn(httpRequest.url, {
220
220
  method: httpRequest.method,
221
221
  headers: {
222
222
  ...httpRequest.headers,
223
223
  'Authorization': `Bearer ${this.apiKey}`,
224
224
  },
225
225
  body: JSON.stringify(httpRequest.body),
226
- signal: controller.signal,
226
+ signal,
227
227
  })
228
- } finally {
229
- clearTimeout(timeoutId)
230
- }
231
228
 
232
- if (!response.ok) {
233
- const body = await response.text()
234
- return Err(this.mapHttpError(response.status, body))
235
- }
229
+ if (!response.ok) {
230
+ const body = await response.text()
231
+ return Err(this.mapHttpError(response.status, body))
232
+ }
236
233
 
237
- const data = await response.json() as OpenRouterResponse
238
- const latencyMs = Date.now() - startTime
234
+ const data = await response.json() as OpenRouterResponse
235
+ const latencyMs = Date.now() - startTime
239
236
 
240
- const choice = data.choices[0]
241
- if (!choice) {
242
- return Err({ type: 'server_error', message: 'No choices returned from LLM' })
243
- }
237
+ const choice = data.choices[0]
238
+ if (!choice) {
239
+ return Err({ type: 'server_error', message: 'No choices returned from LLM' })
240
+ }
244
241
 
245
- const toolCalls: ToolCall[] = (choice.message.tool_calls ?? []).map(
246
- (tc) => ({
247
- id: ToolCallId(tc.id),
248
- name: tc.function.name,
249
- input: this.parseToolArguments(tc.function.arguments),
250
- }),
251
- )
252
-
253
- const promptTokens = data.usage?.prompt_tokens ?? 0
254
- const completionTokens = data.usage?.completion_tokens ?? 0
255
- const cost = data.usage?.cost
256
-
257
- const metrics: LLMMetrics = {
258
- promptTokens,
259
- completionTokens,
260
- totalTokens: data.usage?.total_tokens ?? 0,
261
- latencyMs,
262
- model: data.model,
263
- provider: this.name,
264
- cost,
265
- cachedTokens: data.usage?.prompt_tokens_details?.cached_tokens || undefined,
266
- cacheWriteTokens: data.usage?.prompt_tokens_details?.cache_write_tokens || undefined,
267
- reasoningTokens: data.usage?.completion_tokens_details?.reasoning_tokens || undefined,
268
- }
242
+ const toolCalls: ToolCall[] = (choice.message.tool_calls ?? []).map(
243
+ (tc) => ({
244
+ id: ToolCallId(tc.id),
245
+ name: tc.function.name,
246
+ input: this.parseToolArguments(tc.function.arguments),
247
+ }),
248
+ )
249
+
250
+ const promptTokens = data.usage?.prompt_tokens ?? 0
251
+ const completionTokens = data.usage?.completion_tokens ?? 0
252
+ const cost = data.usage?.cost
253
+
254
+ const metrics: LLMMetrics = {
255
+ promptTokens,
256
+ completionTokens,
257
+ totalTokens: data.usage?.total_tokens ?? 0,
258
+ latencyMs,
259
+ model: data.model,
260
+ provider: this.name,
261
+ cost,
262
+ cachedTokens: data.usage?.prompt_tokens_details?.cached_tokens || undefined,
263
+ cacheWriteTokens: data.usage?.prompt_tokens_details?.cache_write_tokens || undefined,
264
+ reasoningTokens: data.usage?.completion_tokens_details?.reasoning_tokens || undefined,
265
+ }
269
266
 
270
- return Ok({
271
- content: this.extractContent(choice.message.content),
272
- toolCalls,
273
- finishReason: this.mapFinishReason(choice.finish_reason),
274
- metrics,
275
- providerRequestId: data.id,
267
+ return Ok({
268
+ content: this.extractContent(choice.message.content),
269
+ toolCalls,
270
+ finishReason: this.mapFinishReason(choice.finish_reason),
271
+ metrics,
272
+ providerRequestId: data.id,
273
+ reasoning: choice.message.reasoning || undefined,
274
+ // Normalized to undefined here so an empty array never reaches the wire on the way back.
275
+ reasoningDetails: choice.message.reasoning_details?.length ? choice.message.reasoning_details : undefined,
276
+ })
276
277
  })
277
278
  } catch (error) {
278
- return Err(this.mapError(error))
279
+ if (error instanceof ProviderRequestAbortError) {
280
+ return Err({
281
+ type: error.abortCause === 'caller' ? 'aborted' : 'timeout',
282
+ message: error.message,
283
+ })
284
+ }
285
+ return Err(mapProviderError(error))
279
286
  }
280
287
  }
281
288
 
@@ -317,6 +324,9 @@ export class OpenRouterProvider implements LLMProvider {
317
324
  if (orOpts.providers) {
318
325
  body.provider = orOpts.providers
319
326
  }
327
+ if (orOpts.reasoning) {
328
+ body.reasoning = orOpts.reasoning
329
+ }
320
330
  if (orOpts.route) {
321
331
  body.route = orOpts.route
322
332
  }
@@ -366,19 +376,22 @@ export class OpenRouterProvider implements LLMProvider {
366
376
  tool_call_id: msg.toolCallId,
367
377
  }
368
378
  }
369
- case 'assistant':
379
+ case 'assistant': {
380
+ const mapped: OpenRouterMessage = { role: 'assistant', content: msg.content }
370
381
  if (msg.toolCalls?.length) {
371
- return {
372
- role: 'assistant',
373
- content: msg.content,
374
- tool_calls: msg.toolCalls.map((tc): OpenRouterToolCall => ({
375
- id: tc.id,
376
- type: 'function',
377
- function: { name: tc.name, arguments: JSON.stringify(tc.input) },
378
- })),
379
- }
382
+ mapped.tool_calls = msg.toolCalls.map((tc): OpenRouterToolCall => ({
383
+ id: tc.id,
384
+ type: 'function',
385
+ function: { name: tc.name, arguments: JSON.stringify(tc.input) },
386
+ }))
387
+ }
388
+ // Echoed verbatim and only when present: the provider rejects an edited or reordered
389
+ // sequence, and adding the key for a non-reasoning model would rewrite the cached prefix.
390
+ if (msg.reasoningDetails?.length) {
391
+ mapped.reasoning_details = msg.reasoningDetails
380
392
  }
381
- return { role: 'assistant', content: msg.content }
393
+ return mapped
394
+ }
382
395
  case 'system':
383
396
  return { role: 'system', content: msg.content }
384
397
  case 'user':
@@ -468,16 +481,4 @@ export class OpenRouterProvider implements LLMProvider {
468
481
  return { type: 'server_error', message, statusCode: status, responseBody: body }
469
482
  }
470
483
 
471
- private mapError(err: unknown): LLMError {
472
- if (err instanceof ProviderMessageValidationError) {
473
- return { type: 'invalid_request', message: err.message }
474
- }
475
- if (err instanceof Error && err.name === 'AbortError') {
476
- return { type: 'aborted', message: 'Request was aborted' }
477
- }
478
- if (err instanceof TypeError && (err.message.includes('fetch') || err.message.includes('network'))) {
479
- return { type: 'network_error', message: err.message, cause: err }
480
- }
481
- return { type: 'network_error', message: err instanceof Error ? err.message : String(err), cause: err }
482
- }
483
484
  }
@@ -0,0 +1,40 @@
1
+ export type ProviderRequestAbortCause = 'caller' | 'timeout'
2
+
3
+ export class ProviderRequestAbortError extends Error {
4
+ constructor(readonly abortCause: ProviderRequestAbortCause) {
5
+ super(abortCause === 'caller' ? 'Request was aborted' : 'Request timed out')
6
+ this.name = 'ProviderRequestAbortError'
7
+ }
8
+ }
9
+
10
+ export async function runProviderRequest<T>(
11
+ options: { callerSignal?: AbortSignal; timeoutMs: number },
12
+ run: (signal: AbortSignal) => Promise<T>,
13
+ ): Promise<T> {
14
+ if (options.callerSignal?.aborted) throw new ProviderRequestAbortError('caller')
15
+
16
+ const controller = new AbortController()
17
+ let abortCause: ProviderRequestAbortCause | undefined
18
+ const abort = (cause: ProviderRequestAbortCause) => {
19
+ if (abortCause) return
20
+ abortCause = cause
21
+ controller.abort()
22
+ }
23
+ const abortFromCaller = () => abort('caller')
24
+ const timeoutId = setTimeout(() => abort('timeout'), options.timeoutMs)
25
+ options.callerSignal?.addEventListener('abort', abortFromCaller, {
26
+ once: true,
27
+ })
28
+
29
+ try {
30
+ const response = await run(controller.signal)
31
+ if (abortCause) throw new ProviderRequestAbortError(abortCause)
32
+ return response
33
+ } catch (error) {
34
+ if (abortCause) throw new ProviderRequestAbortError(abortCause)
35
+ throw error
36
+ } finally {
37
+ clearTimeout(timeoutId)
38
+ options.callerSignal?.removeEventListener('abort', abortFromCaller)
39
+ }
40
+ }
@@ -1,13 +1,23 @@
1
- import type { AssistantLLMMessage, LLMMessage, SystemLLMMessage, ToolCall, ToolLLMMessage, UserLLMMessage } from '~/core/agents/state.js'
1
+ import type {
2
+ AssistantLLMMessage,
3
+ LLMMessage,
4
+ ReasoningDetails,
5
+ SystemLLMMessage,
6
+ ThinkingBlocks,
7
+ ToolCall,
8
+ ToolLLMMessage,
9
+ UserLLMMessage,
10
+ } from '~/core/agents/state.js'
2
11
  import type { FileStore } from '~/core/file-store/types.js'
3
12
  import type { ToolResultContent } from '~/core/llm/llm-log-types.js'
4
13
  import type { ToolDefinition } from '~/core/tools/definition.js'
5
14
  import type { ToolCallId } from '~/core/tools/schema.js'
6
15
  import type { Result } from '~/lib/utils/result.js'
16
+ import { ProviderMessageValidationError } from './message-sanitization.js'
7
17
  import { ModelId } from './schema.js'
8
18
 
9
19
  // Re-export LLMMessage types from agents/state for backwards compatibility
10
- export type { AssistantLLMMessage, LLMMessage, SystemLLMMessage, ToolCall, ToolLLMMessage, UserLLMMessage }
20
+ export type { AssistantLLMMessage, LLMMessage, ReasoningDetails, SystemLLMMessage, ThinkingBlocks, ToolCall, ToolLLMMessage, UserLLMMessage }
11
21
 
12
22
  // ============================================================================
13
23
  // Request types
@@ -41,9 +51,37 @@ export interface OpenRouterProviderRouting {
41
51
  quantizations?: string[]
42
52
  }
43
53
 
54
+ /**
55
+ * Reasoning controls.
56
+ *
57
+ * Without these the model's own default applies, and several of the defaults are expensive:
58
+ * `high` on Claude Sonnet 5, Opus 5 and Grok 4.5, `max` on Kimi K3. Reasoning is also
59
+ * `mandatory` on Gemini 3.6 Flash, Grok 4.5 and Kimi K2.7 Code — those cannot be turned off,
60
+ * only turned down.
61
+ *
62
+ * **Which efforts a model accepts differs per model.** The catalog's
63
+ * `reasoning.supported_efforts` is the authority: Kimi K3 has no `medium`, `minimal` exists
64
+ * only on Gemini, `xhigh`/`none` only on the OpenAI and newer Anthropic models. The union here
65
+ * is every value seen across them, not a set any single model takes.
66
+ *
67
+ * @see https://openrouter.ai/docs/use-cases/reasoning-tokens
68
+ */
69
+ export interface OpenRouterReasoningOptions {
70
+ /** Relative budget. Mutually exclusive with `max_tokens` — set one. */
71
+ effort?: 'none' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | 'max'
72
+ /** Absolute token budget, for models that take one instead of an effort. */
73
+ max_tokens?: number
74
+ /** Explicitly enable reasoning at the model's default effort. */
75
+ enabled?: boolean
76
+ /** Reason, but omit the blocks from the response. Note this breaks the round trip. */
77
+ exclude?: boolean
78
+ }
79
+
44
80
  export interface OpenRouterRequestOptions {
45
81
  /** Provider routing preferences */
46
82
  providers?: OpenRouterProviderRouting
83
+ /** Reasoning budget. Omitted: the model's own default, which is often `high`. */
84
+ reasoning?: OpenRouterReasoningOptions
47
85
  /** Routing strategy */
48
86
  route?: 'fallback'
49
87
  /** Model transforms */
@@ -141,8 +179,12 @@ export interface InferenceResponse {
141
179
  metrics: LLMMetrics
142
180
  /** Provider-specific request ID (e.g., OpenRouter generation ID for fetching stats) */
143
181
  providerRequestId?: string
144
- /** Extended thinking / reasoning content (for models that support it) */
182
+ /** Extended thinking / reasoning content (for models that support it) — human-readable, for logs and the debug UI. */
145
183
  reasoning?: string
184
+ /** Opaque reasoning blocks to echo back on the next request. Absent for models that do not reason. */
185
+ reasoningDetails?: ReasoningDetails
186
+ /** Anthropic thinking blocks to replay on the next request. Absent unless extended thinking is enabled. */
187
+ thinkingBlocks?: ThinkingBlocks
146
188
  }
147
189
 
148
190
  /**
@@ -240,3 +282,30 @@ export const LLMMessageFactory = {
240
282
 
241
283
  system: (content: string): SystemLLMMessage => ({ role: 'system', content }),
242
284
  }
285
+
286
+ // ============================================================================
287
+ // Error mapping
288
+ // ============================================================================
289
+
290
+ /**
291
+ * Maps a thrown provider error onto an LLMError.
292
+ *
293
+ * `timedOut` distinguishes our own request timeout from a caller-initiated
294
+ * cancel: both abort the same controller and surface as an indistinguishable
295
+ * AbortError, but only the timeout is retryable. Mapping a timeout to 'aborted'
296
+ * makes Agent.runInference bail silently and leave the agent stuck 'inferring'.
297
+ */
298
+ export function mapProviderError(err: unknown, opts?: { timedOut?: boolean }): LLMError {
299
+ if (err instanceof ProviderMessageValidationError) {
300
+ return { type: 'invalid_request', message: err.message }
301
+ }
302
+ if (err instanceof Error && err.name === 'AbortError') {
303
+ return opts?.timedOut
304
+ ? { type: 'timeout', message: 'Request timed out', cause: err }
305
+ : { type: 'aborted', message: 'Request was aborted' }
306
+ }
307
+ if (err instanceof TypeError && (err.message.includes('fetch') || err.message.includes('network'))) {
308
+ return { type: 'network_error', message: err.message, cause: err }
309
+ }
310
+ return { type: 'network_error', message: err instanceof Error ? err.message : String(err), cause: err }
311
+ }
@@ -48,6 +48,9 @@ export type LLMMetrics = {
48
48
  // LLM events
49
49
  // ============================================================================
50
50
 
51
+ /** Opaque by design — provider chain-of-thought blocks are stored and echoed verbatim, never inspected. */
52
+ const opaqueBlocksSchema = z4.array(z4.unknown())
53
+
51
54
  const llmMetricsSchema = z4.object({
52
55
  promptTokens: z4.number(),
53
56
  completionTokens: z4.number(),
@@ -77,6 +80,15 @@ export const llmEvents = createEventsFactory({
77
80
  name: z4.string(),
78
81
  input: z4.unknown(),
79
82
  })),
83
+ /**
84
+ * Opaque provider reasoning blocks (see ReasoningDetails). Carried by the
85
+ * event, not just by the live response, because a session rebuilt from the
86
+ * log would otherwise resume without the chain of thought the provider
87
+ * expects to get back.
88
+ */
89
+ reasoningDetails: opaqueBlocksSchema.optional(),
90
+ /** Anthropic thinking blocks (see ThinkingBlocks). Carried for the same reason. */
91
+ thinkingBlocks: opaqueBlocksSchema.optional(),
80
92
  }),
81
93
  metrics: llmMetricsSchema,
82
94
  llmCallId: llmCallIdSchema.optional(),
@@ -60,7 +60,7 @@ type ManagerMethodEntry = { input: unknown; output: unknown }
60
60
 
61
61
  /**
62
62
  * Notification entry — registered via .notification() on PluginBuilder.
63
- * Schema is stored for documentation/validation but not enforced at runtime.
63
+ * The schema is enforced at runtime: see `guardNotify`.
64
64
  */
65
65
  type NotificationEntry = { schema: z4.ZodType }
66
66
 
@@ -129,6 +129,10 @@ export type DepsFromPlugins<TPlugins extends readonly PluginDefinition<string, a
129
129
  * - 'agent': called via agent tool (ctx.self)
130
130
  * - 'client': called via SPA RPC (user-initiated)
131
131
  * - 'system': called via backend/webhook (trusted)
132
+ *
133
+ * `beforeMethod` gates branch on this, so it is an authority claim, not an input:
134
+ * a host must stamp it from what it authenticated and must never take it from a
135
+ * request body an untrusted caller can write.
132
136
  */
133
137
  export type CallerContext = {
134
138
  source: 'agent' | 'client' | 'system'
@@ -238,9 +242,27 @@ type HookMap<TCtx> = {
238
242
  onPause: (ctx: TCtx & { reason?: string }) => Promise<OnPauseResult>
239
243
  }
240
244
 
245
+ /**
246
+ * Why a resident session runtime is being closed.
247
+ *
248
+ * `evicted` parks an idle runtime that will be rebuilt on the next access, so
249
+ * close hooks must keep anything the session still needs; `closed` and
250
+ * `shutdown` end it for good.
251
+ */
252
+ export type SessionCloseReason = 'closed' | 'evicted' | 'shutdown'
253
+
241
254
  type SessionHookMap<TCtx> = {
255
+ /**
256
+ * Runs once per resident runtime lifetime, not once per session — an evicted
257
+ * runtime is rebuilt from its event log and runs this hook again.
258
+ */
242
259
  onSessionReady: (ctx: TCtx) => Promise<void>
243
- onSessionClose: (ctx: TCtx) => Promise<void>
260
+ /**
261
+ * Runs once per resident runtime lifetime, not once per session — an idle
262
+ * eviction runs it too, and the next access runs `onSessionReady` again.
263
+ * Check `reason` before destroying anything the session still needs.
264
+ */
265
+ onSessionClose: (ctx: TCtx & { reason: SessionCloseReason }) => Promise<void>
244
266
  beforeMethod: (ctx: TCtx & { method: string; input: unknown; agentId?: AgentId }) => Promise<BeforeMethodResult>
245
267
  }
246
268
 
@@ -316,8 +338,10 @@ type ErasedAgentHookMap = {
316
338
  * Session-level hook map with proper return types but erased context.
317
339
  */
318
340
  type ErasedSessionHookMap = {
341
+ /** Fires once per resident runtime lifetime — a rebuilt runtime runs it again. */
319
342
  onSessionReady: (ctx: BaseSessionHookContext) => Promise<void>
320
- onSessionClose: (ctx: BaseSessionHookContext) => Promise<void>
343
+ /** Fires once per resident runtime lifetime — `reason` says whether the session ends or is only parked. */
344
+ onSessionClose: (ctx: BaseSessionHookContext & { reason: SessionCloseReason }) => Promise<void>
321
345
  beforeMethod: (ctx: BaseSessionHookContext & { method: string; input: unknown; agentId?: AgentId }) => Promise<BeforeMethodResult>
322
346
  }
323
347
 
@@ -329,8 +353,16 @@ type ErasedSessionHookMap = {
329
353
  * ConfiguredPlugin — runtime-ready plugin instance with config bound.
330
354
  * This is the shape that session/runtime code consumes.
331
355
  */
356
+ /**
357
+ * Hook precedence for a plugin that declares none. Sorts after every built-in,
358
+ * so preset and third-party plugins keep running in registration order.
359
+ */
360
+ export const DEFAULT_PLUGIN_ORDER = 1000
361
+
332
362
  export interface ConfiguredPlugin {
333
363
  name: string
364
+ /** Hook precedence — see PluginBuilder.order(). Absent means DEFAULT_PLUGIN_ORDER. */
365
+ order?: number
334
366
  methods: Record<string, {
335
367
  input: z4.ZodType
336
368
  output: z4.ZodType
@@ -391,6 +423,8 @@ export interface PluginDefinition<
391
423
  TMethods extends Record<string, MethodEntry> = {},
392
424
  > {
393
425
  name: TName
426
+ /** Hook precedence — see PluginBuilder.order(). Absent means DEFAULT_PLUGIN_ORDER. */
427
+ order?: number
394
428
  create(...args: TConfig extends void ? [] : [config: TConfig]): ConfiguredPlugin
395
429
  configure(...args: TConfig extends void ? [] : [config: TConfig]): SessionPluginConfig<TName, TConfig>
396
430
  configureAgent(...args: TAgentConfig extends void ? [] : [config: TAgentConfig]): AgentPluginConfig<TName, TAgentConfig>
@@ -420,6 +454,8 @@ interface StaticToolSpec {
420
454
 
421
455
  interface BuilderConfig {
422
456
  name: string
457
+ /** Hook precedence — see PluginBuilder.order(). */
458
+ order: number | undefined
423
459
  events: readonly EventSourceRef[]
424
460
  /** Names of dependency plugins — stored for runtime wiring */
425
461
  dependencyNames: string[]
@@ -481,6 +517,7 @@ export class PluginBuilder<
481
517
  this._name = name
482
518
  this._cfg = cfg ?? {
483
519
  name,
520
+ order: undefined,
484
521
  events: [],
485
522
  dependencyNames: [],
486
523
  stateConfig: undefined,
@@ -503,6 +540,16 @@ export class PluginBuilder<
503
540
 
504
541
  // --- Setup ---
505
542
 
543
+ /**
544
+ * Declare where this plugin sits in hook order. Lower runs first, which for the
545
+ * agent hooks — first non-null result wins — decides who gets to act. Built-ins
546
+ * occupy 10…150; anything without an order runs after them, in registration order.
547
+ */
548
+ order(value: number): this {
549
+ this._cfg.order = value
550
+ return this
551
+ }
552
+
506
553
  pluginConfig<T>(): PluginBuilder<TName, T, TContext, TState, TMethods, TManagerMethods, TAgentConfig, TFactories, TNotifications, TDeps> {
507
554
  return this as unknown as PluginBuilder<TName, T, TContext, TState, TMethods, TManagerMethods, TAgentConfig, TFactories, TNotifications, TDeps>
508
555
  }
@@ -713,6 +760,16 @@ export class PluginBuilder<
713
760
  return this
714
761
  }
715
762
 
763
+ /**
764
+ * Register a session-level hook.
765
+ *
766
+ * `onSessionReady` and `onSessionClose` bracket one *resident runtime*, not
767
+ * one session: an idle runtime is evicted (close hook runs with
768
+ * `reason: 'evicted'`) and rebuilt from the event log on the next access,
769
+ * which runs `onSessionReady` again. Only `reason: 'closed'` / `'shutdown'`
770
+ * mean the session is really over — anything destructive belongs behind that
771
+ * check.
772
+ */
716
773
  sessionHook<TName extends keyof SessionHookMap<PluginSessionHookContext<TConfig, TMethods, TContext, TState, TNotifications, TDeps>>>(
717
774
  name: TName,
718
775
  fn: SessionHookMap<PluginSessionHookContext<TConfig, TMethods, TContext, TState, TNotifications, TDeps>>[TName],
@@ -789,6 +846,7 @@ export class PluginBuilder<
789
846
 
790
847
  const def: PluginDefinition<TName, TConfig, TAgentConfig, TManagerMethods, TMethods> = {
791
848
  name,
849
+ order: cfg.order,
792
850
  create: ((...args: unknown[]) => {
793
851
  const pluginConfig = args[0]
794
852
  return buildConfiguredPlugin(cfg, pluginConfig)
@@ -813,7 +871,40 @@ export class PluginBuilder<
813
871
  // Build configured plugin — binds config into all closures
814
872
  // ============================================================================
815
873
 
874
+ type NotifyFn = (type: string, payload: unknown) => void
875
+
876
+ /**
877
+ * Hold `ctx.notify` to the contract the plugin declared with `.notification()`:
878
+ * an undeclared type or a payload that fails its schema is logged and dropped
879
+ * rather than broadcast, so clients never see a shape nothing promised.
880
+ */
881
+ function guardNotify(
882
+ pluginName: string,
883
+ notifications: Record<string, { schema: z4.ZodType }>,
884
+ ctx: { notify: NotifyFn; logger: Logger },
885
+ ): NotifyFn {
886
+ return (type, payload) => {
887
+ const declared = notifications[type]
888
+ if (!declared) {
889
+ ctx.logger.error(`Plugin "${pluginName}" emitted undeclared notification "${type}"`)
890
+ return
891
+ }
892
+
893
+ const parsed = declared.schema.safeParse(payload)
894
+ if (!parsed.success) {
895
+ ctx.logger.error(`Plugin "${pluginName}" notification "${type}" does not match its declared schema`, undefined, {
896
+ issues: parsed.error.message,
897
+ })
898
+ return
899
+ }
900
+
901
+ ctx.notify(type, payload)
902
+ }
903
+ }
904
+
816
905
  function buildConfiguredPlugin(cfg: BuilderConfig, pluginConfig: unknown): ConfiguredPlugin {
906
+ const notifyFor = (ctx: { notify: NotifyFn; logger: Logger }): NotifyFn => guardNotify(cfg.name, cfg.notifications, ctx)
907
+
817
908
  let slice: StateSlice | undefined
818
909
  if (cfg.stateConfig) {
819
910
  const stateReduce = cfg.stateConfig.reduce
@@ -832,7 +923,7 @@ function buildConfiguredPlugin(cfg: BuilderConfig, pluginConfig: unknown): Confi
832
923
  name,
833
924
  // Agent.ts provides the full context with extra fields (pendingMessages, turnNumber, etc.)
834
925
  // — this wrapper just injects pluginConfig at the boundary
835
- (ctx: BasePluginHookContext) => fn({ ...ctx, pluginConfig }),
926
+ (ctx: BasePluginHookContext) => fn({ ...ctx, pluginConfig, notify: notifyFor(ctx) }),
836
927
  ]),
837
928
  ) as Partial<ErasedAgentHookMap>
838
929
  : undefined
@@ -844,7 +935,7 @@ function buildConfiguredPlugin(cfg: BuilderConfig, pluginConfig: unknown): Confi
844
935
  name,
845
936
  // Session.ts provides the full context with extra fields (method, input,
846
937
  // agentId for beforeMethod) — this wrapper just injects pluginConfig.
847
- (ctx: BaseSessionHookContext) => fn({ ...ctx, pluginConfig }),
938
+ (ctx: BaseSessionHookContext) => fn({ ...ctx, pluginConfig, notify: notifyFor(ctx) }),
848
939
  ]),
849
940
  ) as Partial<ErasedSessionHookMap>
850
941
  : undefined
@@ -855,7 +946,7 @@ function buildConfiguredPlugin(cfg: BuilderConfig, pluginConfig: unknown): Confi
855
946
  let getTools: ((ctx: BasePluginHookContext) => ToolDefinition<any>[]) | undefined
856
947
  if (staticToolSpecs.length > 0 || dynamicToolsFn) {
857
948
  getTools = (ctx: BasePluginHookContext) => {
858
- const enrichedCtx: BasePluginHookContext = { ...ctx, pluginConfig }
949
+ const enrichedCtx: BasePluginHookContext = { ...ctx, pluginConfig, notify: notifyFor(ctx) }
859
950
  const tools: ToolDefinition<any>[] = []
860
951
  // Static tools — create ToolDefinition from StaticToolSpec using closure
861
952
  for (const spec of staticToolSpecs) {
@@ -877,32 +968,32 @@ function buildConfiguredPlugin(cfg: BuilderConfig, pluginConfig: unknown): Confi
877
968
  // Wrap createContext to pass pluginConfig
878
969
  const contextFactory = cfg.contextFactory
879
970
  const wrappedContextFactory = contextFactory
880
- ? (ctx: SessionContext) => contextFactory(ctx, pluginConfig)
971
+ ? (ctx: SessionContext) => contextFactory({ ...ctx, notify: notifyFor(ctx) }, pluginConfig)
881
972
  : undefined
882
973
 
883
974
  // Wrap status/systemPrompt/dequeue to inject pluginConfig
884
975
  const statusFn = cfg.statusFn
885
976
  const wrappedStatus = statusFn
886
- ? (ctx: BasePluginHookContext) => statusFn({ ...ctx, pluginConfig })
977
+ ? (ctx: BasePluginHookContext) => statusFn({ ...ctx, pluginConfig, notify: notifyFor(ctx) })
887
978
  : undefined
888
979
 
889
980
  const systemPromptFn = cfg.systemPromptFn
890
981
  const wrappedSystemPrompt = systemPromptFn
891
- ? (ctx: BasePluginHookContext) => systemPromptFn({ ...ctx, pluginConfig })
982
+ ? (ctx: BasePluginHookContext) => systemPromptFn({ ...ctx, pluginConfig, notify: notifyFor(ctx) })
892
983
  : undefined
893
984
 
894
985
  const dequeueHook = cfg.dequeueHook
895
986
  const wrappedDequeue = dequeueHook
896
987
  ? {
897
- hasPendingMessages: (ctx: BasePluginHookContext) => dequeueHook.hasPendingMessages({ ...ctx, pluginConfig }),
898
- getPendingMessages: (ctx: BasePluginHookContext) => dequeueHook.getPendingMessages({ ...ctx, pluginConfig }),
899
- markConsumed: (ctx: BasePluginHookContext, token: unknown) => dequeueHook.markConsumed({ ...ctx, pluginConfig }, token),
988
+ hasPendingMessages: (ctx: BasePluginHookContext) => dequeueHook.hasPendingMessages({ ...ctx, pluginConfig, notify: notifyFor(ctx) }),
989
+ getPendingMessages: (ctx: BasePluginHookContext) => dequeueHook.getPendingMessages({ ...ctx, pluginConfig, notify: notifyFor(ctx) }),
990
+ markConsumed: (ctx: BasePluginHookContext, token: unknown) => dequeueHook.markConsumed({ ...ctx, pluginConfig, notify: notifyFor(ctx) }, token),
900
991
  }
901
992
  : undefined
902
993
 
903
994
  const beforeDequeueFn = cfg.beforeDequeueFn
904
995
  const wrappedBeforeDequeue = beforeDequeueFn
905
- ? (ctx: BasePluginHookContext & { sourcePlugin: string }) => beforeDequeueFn({ ...ctx, pluginConfig })
996
+ ? (ctx: BasePluginHookContext & { sourcePlugin: string }) => beforeDequeueFn({ ...ctx, pluginConfig, notify: notifyFor(ctx) })
906
997
  : undefined
907
998
 
908
999
  // Wrap isEnabled to pass pluginConfig
@@ -925,12 +1016,13 @@ function buildConfiguredPlugin(cfg: BuilderConfig, pluginConfig: unknown): Confi
925
1016
  wrappedMethods[name] = {
926
1017
  input: method.input,
927
1018
  output: method.output,
928
- handler: (ctx, input) => method.handler({ ...ctx, pluginConfig }, input),
1019
+ handler: (ctx, input) => method.handler({ ...ctx, pluginConfig, notify: notifyFor(ctx) }, input),
929
1020
  }
930
1021
  }
931
1022
 
932
1023
  return {
933
1024
  name: cfg.name,
1025
+ order: cfg.order,
934
1026
  methods: wrappedMethods,
935
1027
  notifications: cfg.notifications,
936
1028
  dependencyNames: cfg.dependencyNames,