@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
@@ -9,8 +9,9 @@
9
9
 
10
10
  import z from 'zod/v4'
11
11
  import { DebounceCallback } from '~/core/agents/debounce.js'
12
- import type { AgentId } from '~/core/agents/schema.js'
13
- import type { AgentState, HandlerResult } from '~/core/agents/state.js'
12
+ import { AgentId } from '~/core/agents/schema.js'
13
+ import { agentWakeKey, type AgentWakeKind } from '~/core/wake-key.js'
14
+ import type { AgentState, HandlerResult, ReasoningDetails, ThinkingBlocks } from '~/core/agents/state.js'
14
15
  import { agentEvents } from '~/core/agents/state.js'
15
16
  import { withSessionId } from '~/core/events/test-helpers.js'
16
17
  import type { FileStore } from '~/core/file-store/types.js'
@@ -43,12 +44,14 @@ import type { ToolDefinition } from '~/core/tools/definition.js'
43
44
  import type { ToolCall } from '~/core/tools/schema.js'
44
45
  import { ToolCallId } from '~/core/tools/schema.js'
45
46
  import { toolEvents } from '~/core/tools/state.js'
47
+ import type { Scheduler } from '~/platform/scheduler.js'
46
48
  import { getAgentUnconsumedMailbox, selectMailboxState } from '~/plugins/mailbox/query.js'
47
49
  import { AGENT_BASE_BRIEFING } from '~/prompts/base.js'
48
50
  import { buildEnvironmentSection } from '~/prompts/builder.js'
49
51
  import { Err, Ok, type Result } from '~/lib/utils/result.js'
50
52
  import type { Logger } from '../../lib/logger/logger.js'
51
53
  import type { SessionContext } from '../sessions/context.js'
54
+ import { isValidSessionId, SessionId } from '../sessions/schema.js'
52
55
  import type { SessionStore } from '../sessions/session-store.js'
53
56
  import type { SessionState } from '../sessions/state.js'
54
57
  import { resolveAgentOverrides } from '../sessions/state.js'
@@ -102,7 +105,7 @@ export interface AgentConfig<TInput = unknown> {
102
105
  */
103
106
  export interface AgentDependencies {
104
107
  id: AgentId
105
- sessionContext: SessionContext
108
+ getSessionContext: () => SessionContext
106
109
  store: SessionStore
107
110
  llmProvider: LLMProvider
108
111
  /** Named provider instances, passed to InferenceContext for middleware routing */
@@ -141,7 +144,7 @@ export interface AgentDependencies {
141
144
  export class Agent {
142
145
  readonly id: AgentId
143
146
  private readonly config: AgentConfig
144
- private readonly sessionContext: SessionContext
147
+ private readonly getSessionContext: () => SessionContext
145
148
  private readonly store: SessionStore
146
149
  private readonly logger: Logger
147
150
  private readonly llmProvider: LLMProvider
@@ -159,20 +162,24 @@ export class Agent {
159
162
  private tools: Map<string, ToolDefinition>
160
163
 
161
164
  // Scheduler state (embedded)
162
- private debounceTimer?: ReturnType<typeof setTimeout>
163
- private errorRetryTimer?: ReturnType<typeof setTimeout>
165
+ /** Poll timer for the debounceCallback path only — see scheduleProcessing(). */
166
+ private debounceCheckTimer?: ReturnType<typeof setTimeout>
167
+ /** Whether a retry wake is armed. In-memory: a fresh process re-arms from replayed state. */
168
+ private errorRetryArmed = false
169
+ private releaseScheduledLease?: () => void
170
+ /** Host scheduler, resolved once — the platform never changes for a session. */
171
+ private scheduler?: Scheduler
164
172
  private processing = false
165
173
  private scheduled = false
166
174
  private pendingReschedule = false
175
+ /** In-flight continue() calls, so disposal can drain a turn instead of racing it. */
176
+ private readonly inFlightContinues = new Set<Promise<void>>()
167
177
  private readonly abortController = new AbortController()
168
178
 
169
- /** Track conversation turn number for handler context */
170
- private turnNumber = 0
171
-
172
179
  constructor(deps: AgentDependencies) {
173
180
  this.id = deps.id
174
181
  this.config = deps.config
175
- this.sessionContext = deps.sessionContext
182
+ this.getSessionContext = deps.getSessionContext
176
183
  this.store = deps.store
177
184
  this.logger = deps.logger
178
185
  this.llmProvider = deps.llmProvider
@@ -186,12 +193,14 @@ export class Agent {
186
193
  this.pluginMethodCaller = deps.pluginMethodCaller
187
194
  this.scheduleCallback = deps.schedule
188
195
  this.tools = this.buildToolsMap()
196
+ }
189
197
 
190
- // Initialize turn number from conversation history
191
- const state = this.state
192
- if (state) {
193
- this.turnNumber = state.conversationHistory.filter((m) => m.role === 'assistant').length
194
- }
198
+ /**
199
+ * Turn the agent is working on: committed turns plus the one in flight.
200
+ * Read from persisted state so a reload or a compaction can't reset it.
201
+ */
202
+ private get turnNumber(): number {
203
+ return (this.state?.turnNumber ?? 0) + 1
195
204
  }
196
205
 
197
206
  /**
@@ -221,13 +230,49 @@ export class Agent {
221
230
  // Public API
222
231
  // ============================================================================
223
232
 
233
+ /** Drop the scheduled lease. Idempotent — the release closure self-guards. */
234
+ private dropScheduledLease(): void {
235
+ this.releaseScheduledLease?.()
236
+ this.releaseScheduledLease = undefined
237
+ }
238
+
224
239
  /**
225
240
  * Unified processing entry point - decides what to do next.
226
241
  * Safe to call multiple times; skips if already processing.
227
242
  */
228
- async continue(): Promise<void> {
243
+ continue(): Promise<void> {
244
+ const pending = this.runContinue().finally(() => {
245
+ this.inFlightContinues.delete(pending)
246
+ })
247
+ this.inFlightContinues.add(pending)
248
+ return pending
249
+ }
250
+
251
+ /**
252
+ * Await the turn that is currently running, if any — including work it starts
253
+ * while draining. Never rejects: callers use it to drain before teardown, not
254
+ * to observe processing errors.
255
+ */
256
+ async waitForIdle(): Promise<void> {
257
+ while (this.inFlightContinues.size > 0) {
258
+ await Promise.allSettled([...this.inFlightContinues])
259
+ }
260
+ }
261
+
262
+ private async runContinue(): Promise<void> {
263
+ // Release before the guards: both early-return paths are reachable from a
264
+ // fired timer, and the lease would otherwise outlive the schedule forever.
265
+ // The retry lease is not touched here — it only ever exists inside the
266
+ // retry callback, which releases it itself.
267
+ this.dropScheduledLease()
229
268
  if (this.processing) return
230
269
  if (this.store.isClosed()) return
270
+ let releaseProcessingLease: (() => void) | undefined
271
+ try {
272
+ releaseProcessingLease = this.getSessionContext().runtimeActivity.acquire(`agent:${this.id}:processing`)
273
+ } catch {
274
+ return
275
+ }
231
276
  this.processing = true
232
277
  this.scheduled = false
233
278
 
@@ -317,6 +362,7 @@ export class Agent {
317
362
  this.pendingReschedule = false
318
363
  this.scheduleProcessing()
319
364
  }
365
+ releaseProcessingLease()
320
366
  }
321
367
  }
322
368
 
@@ -327,82 +373,119 @@ export class Agent {
327
373
  scheduleProcessing(): void {
328
374
  if (this.scheduled) return
329
375
  if (this.store.isClosed()) return
376
+ // After shutdown() a fresh schedule would outlive the drain and fire against
377
+ // a session that already cleared its agents and plugin contexts.
378
+ if (this.abortController.signal.aborted) return
330
379
  if (this.processing) {
331
380
  this.pendingReschedule = true
332
381
  return
333
382
  }
334
383
 
335
384
  this.cancelSchedule()
385
+ try {
386
+ this.releaseScheduledLease = this.getSessionContext().runtimeActivity.acquire(`agent:${this.id}:scheduled`)
387
+ } catch {
388
+ return
389
+ }
336
390
  this.scheduled = true
337
391
 
338
392
  const agentState = this.state
339
- if (!agentState) return
393
+ if (!agentState) {
394
+ this.cancelSchedule()
395
+ return
396
+ }
340
397
 
341
398
  if (this.config.debounceCallback) {
342
- // Callback-based debounce using recursive setTimeout
399
+ // Stays a plain timer: the poll re-enters with a closure and its own
400
+ // in-memory `scheduled` guard, neither of which a resumed wake can carry.
343
401
  const checkInterval = this.config.checkIntervalMs ?? 100
344
402
 
345
403
  const scheduleCheck = () => {
346
- this.debounceTimer = setTimeout(async () => {
347
- // Re-read state fresh each check — no stale data
348
- const currentState = this.state
349
- if (!currentState) {
350
- this.cancelSchedule()
351
- return
352
- }
404
+ this.debounceCheckTimer = setTimeout(() => {
405
+ // A throw here (hasPluginPendingMessages, or the preset-supplied
406
+ // debounceCallback — user code) must not strand the scheduled lease.
407
+ void this.runDebounceCheck(scheduleCheck)
408
+ }, checkInterval)
409
+ }
353
410
 
354
- // Guard: schedule could be cancelled between timer fire and here
355
- if (!this.scheduled) return
411
+ scheduleCheck()
412
+ } else {
413
+ // Debounce by wake (default: 500ms) — nothing but the key is needed to resume.
414
+ this.armWake('debounce', this.config.debounceMs ?? 500)
415
+ }
416
+ }
356
417
 
357
- const sessionState = this.store.getState()
358
- const unconsumed = getUnconsumedMessages(sessionState, this.id)
359
- const pendingToolResults = currentState.pendingToolResults
418
+ /**
419
+ * Run the continuation a due wake stands for — the one entry point for a host,
420
+ * whether this process armed the delay or an alarm held it across an eviction.
421
+ */
422
+ async deliverWake(kind: AgentWakeKind): Promise<void> {
423
+ if (this.abortController.signal.aborted) return
360
424
 
361
- // If no messages, no pending tool results, and no plugin pending, nothing to do
362
- if (unconsumed.length === 0 && pendingToolResults.length === 0 && !this.hasPluginPendingMessages()) {
363
- this.cancelSchedule()
364
- return
365
- }
425
+ switch (kind) {
426
+ case 'debounce':
427
+ // Not scheduleProcessing(): that arms a fresh delay and the turn never runs.
428
+ this.scheduled = false
429
+ await this.continue()
430
+ return
366
431
 
367
- const oldestTimestamp = unconsumed.length > 0
368
- ? Math.min(...unconsumed.map((m) => m.timestamp))
369
- : Date.now()
370
- const oldestWaitingMs = Date.now() - oldestTimestamp
432
+ case 'retry':
433
+ this.errorRetryArmed = false
434
+ this.scheduleProcessing()
435
+ return
436
+ }
437
+ }
371
438
 
372
- const decision = await this.config.debounceCallback!({
373
- messages: unconsumed,
374
- oldestWaitingMs,
375
- totalPending: unconsumed.length,
376
- pendingToolResults,
377
- })
439
+ /** One debounce-callback check. Never rejects: on error it cancels the schedule. */
440
+ private async runDebounceCheck(scheduleNext: () => void): Promise<void> {
441
+ try {
442
+ // Re-read state fresh each check — no stale data
443
+ const currentState = this.state
444
+ if (!currentState) {
445
+ this.cancelSchedule()
446
+ return
447
+ }
378
448
 
379
- // Re-check after async callback — schedule could be cancelled during await
380
- if (!this.scheduled) return
449
+ // Guard: schedule could be cancelled between timer fire and here
450
+ if (!this.scheduled) return
381
451
 
382
- if (decision === 'process_now') {
383
- this.cancelSchedule()
384
- this.continue().catch((err) => {
385
- this.logger.error('Unhandled error in continue()', err instanceof Error ? err : undefined, { agentId: this.id })
386
- })
387
- } else {
388
- // Callback said "wait" — schedule next check.
389
- // Fresh state will be read on next iteration.
390
- scheduleCheck()
391
- }
392
- }, checkInterval)
452
+ const sessionState = this.store.getState()
453
+ const unconsumed = getUnconsumedMessages(sessionState, this.id)
454
+ const pendingToolResults = currentState.pendingToolResults
455
+
456
+ // If no messages, no pending tool results, and no plugin pending, nothing to do
457
+ if (unconsumed.length === 0 && pendingToolResults.length === 0 && !this.hasPluginPendingMessages()) {
458
+ this.cancelSchedule()
459
+ return
393
460
  }
394
461
 
395
- scheduleCheck()
396
- } else {
397
- // Timer-based debounce (default: 500ms)
398
- const debounceMs = this.config.debounceMs ?? 500
399
- this.debounceTimer = setTimeout(() => {
400
- this.scheduled = false
401
- this.debounceTimer = undefined
462
+ const oldestTimestamp = unconsumed.length > 0
463
+ ? Math.min(...unconsumed.map((m) => m.timestamp))
464
+ : Date.now()
465
+ const oldestWaitingMs = Date.now() - oldestTimestamp
466
+
467
+ const decision = await this.config.debounceCallback!({
468
+ messages: unconsumed,
469
+ oldestWaitingMs,
470
+ totalPending: unconsumed.length,
471
+ pendingToolResults,
472
+ })
473
+
474
+ // Re-check after async callback — schedule could be cancelled during await
475
+ if (!this.scheduled) return
476
+
477
+ if (decision === 'process_now') {
478
+ this.cancelSchedule()
402
479
  this.continue().catch((err) => {
403
480
  this.logger.error('Unhandled error in continue()', err instanceof Error ? err : undefined, { agentId: this.id })
404
481
  })
405
- }, debounceMs)
482
+ } else {
483
+ // Callback said "wait" — schedule next check. Fresh state next iteration.
484
+ scheduleNext()
485
+ }
486
+ } catch (err) {
487
+ this.logger.error('Debounce check failed', err instanceof Error ? err : undefined, { agentId: this.id })
488
+ this.cancelSchedule()
406
489
  }
407
490
  }
408
491
 
@@ -416,10 +499,8 @@ export class Agent {
416
499
  // AbortError may be thrown synchronously by abort signal listeners
417
500
  }
418
501
  this.cancelSchedule()
419
- if (this.errorRetryTimer) {
420
- clearTimeout(this.errorRetryTimer)
421
- this.errorRetryTimer = undefined
422
- }
502
+ this.errorRetryArmed = false
503
+ this.cancelWake('retry')
423
504
  }
424
505
 
425
506
  /**
@@ -545,12 +626,16 @@ export class Agent {
545
626
  * remaining backoff and re-arms if it hasn't elapsed yet.
546
627
  */
547
628
  private scheduleErrorRetry(delayMs: number): void {
548
- if (this.errorRetryTimer) return
629
+ if (this.errorRetryArmed) return
549
630
  if (this.store.isClosed()) return
550
- this.errorRetryTimer = setTimeout(() => {
551
- this.errorRetryTimer = undefined
552
- this.scheduleProcessing()
553
- }, delayMs)
631
+ // Nothing cancels a wake armed after shutdown(), and delivering it would
632
+ // reload a session this host has already torn down.
633
+ if (this.abortController.signal.aborted) return
634
+ this.errorRetryArmed = true
635
+ // The backoff itself is unleased: a provider that keeps failing would
636
+ // otherwise pin the runtime resident forever, and the preserved dequeue
637
+ // token is in the event log, so a rebuilt runtime still has the work.
638
+ this.armWake('retry', delayMs)
554
639
  }
555
640
 
556
641
  private static readonly MAX_INFERENCE_RETRIES = 3
@@ -572,8 +657,6 @@ export class Agent {
572
657
  // Need either tool results or plugin messages to process
573
658
  if (!hasToolResults && pluginDequeued.length === 0) return
574
659
 
575
- this.turnNumber++
576
-
577
660
  // 0. beforeInference handler - can skip LLM entirely or pause
578
661
  const beforeResult = await this.executeBeforeInference(agentState)
579
662
  if (beforeResult !== null) {
@@ -810,7 +893,7 @@ export class Agent {
810
893
  if (afterResult !== null) {
811
894
  if (afterResult.action === 'pause') {
812
895
  // Commit the turn before pausing so pendingMessages move to conversationHistory.
813
- await this.emitInferenceCompleted(response, llmCallId, llmResponse.value.metrics)
896
+ await this.emitInferenceCompleted(response, llmCallId, llmResponse.value.metrics, llmResponse.value.reasoningDetails, llmResponse.value.thinkingBlocks)
814
897
  await this.consumeDequeuedTokens(pluginDequeued)
815
898
  await this.emitHandlerPause(afterResult.reason)
816
899
  return
@@ -830,8 +913,7 @@ export class Agent {
830
913
  this.store.sessionId,
831
914
  llmEvents.create('inference_retried', { agentId: this.id }),
832
915
  ))
833
- // Retry inference - decrement turn number and recursively call with fresh state
834
- this.turnNumber--
916
+ // Retry inference — the turn never committed, so it keeps its number.
835
917
  const freshState = this.state
836
918
  if (!freshState) return
837
919
  await this.runInference(freshState, retryCount + 1)
@@ -844,7 +926,9 @@ export class Agent {
844
926
 
845
927
  // 4d. Inference completed
846
928
  // Tool calls will be executed in the next continue() cycle
847
- await this.emitInferenceCompleted(response, llmCallId, llmResponse.value.metrics)
929
+ // Reasoning travels beside `response`, not inside it: an afterInference handler may
930
+ // rewrite the text, but the blocks stay the model's own and go back untouched.
931
+ await this.emitInferenceCompleted(response, llmCallId, llmResponse.value.metrics, llmResponse.value.reasoningDetails, llmResponse.value.thinkingBlocks)
848
932
 
849
933
  // Consume dequeue tokens after the commit: a crash in the gap re-delivers the
850
934
  // message on restart (at-least-once) instead of dropping it (consume-first
@@ -869,6 +953,8 @@ export class Agent {
869
953
  cachedTokens?: number
870
954
  cacheWriteTokens?: number
871
955
  },
956
+ reasoningDetails?: ReasoningDetails,
957
+ thinkingBlocks?: ThinkingBlocks,
872
958
  ): Promise<void> {
873
959
  await this.store.emit(withSessionId(
874
960
  this.store.sessionId,
@@ -882,6 +968,8 @@ export class Agent {
882
968
  name: tc.name,
883
969
  input: tc.input,
884
970
  })),
971
+ reasoningDetails,
972
+ thinkingBlocks,
885
973
  },
886
974
  metrics: metrics ?? {
887
975
  promptTokens: 0,
@@ -903,12 +991,42 @@ export class Agent {
903
991
  * Cancel any scheduled processing.
904
992
  */
905
993
  private cancelSchedule(): void {
906
- if (this.debounceTimer) {
907
- clearTimeout(this.debounceTimer)
908
- this.debounceTimer = undefined
994
+ if (this.debounceCheckTimer) {
995
+ clearTimeout(this.debounceCheckTimer)
996
+ this.debounceCheckTimer = undefined
909
997
  }
998
+ this.cancelWake('debounce')
910
999
  this.scheduled = false
911
1000
  this.pendingReschedule = false
1001
+ this.releaseScheduledLease?.()
1002
+ this.releaseScheduledLease = undefined
1003
+ }
1004
+
1005
+ /** The host scheduler, or null once the runtime is gone — a disposed session builds no context. */
1006
+ private tryGetScheduler(): Scheduler | null {
1007
+ if (this.scheduler) return this.scheduler
1008
+ try {
1009
+ this.scheduler = this.getSessionContext().platform.scheduler
1010
+ return this.scheduler
1011
+ } catch {
1012
+ return null
1013
+ }
1014
+ }
1015
+
1016
+ /**
1017
+ * Arm a wake without awaiting the host: scheduleProcessing() and shutdown() are
1018
+ * synchronous, while a host may persist the wake asynchronously.
1019
+ */
1020
+ private armWake(kind: AgentWakeKind, delayMs: number): void {
1021
+ this.tryGetScheduler()?.wake(agentWakeKey(this.store.sessionId, this.id, kind), delayMs).catch((err: unknown) => {
1022
+ this.logger.error('Failed to arm scheduler wake', err instanceof Error ? err : undefined, { agentId: this.id, kind })
1023
+ })
1024
+ }
1025
+
1026
+ private cancelWake(kind: AgentWakeKind): void {
1027
+ this.tryGetScheduler()?.cancel(agentWakeKey(this.store.sessionId, this.id, kind)).catch((err: unknown) => {
1028
+ this.logger.error('Failed to cancel scheduler wake', err instanceof Error ? err : undefined, { agentId: this.id, kind })
1029
+ })
912
1030
  }
913
1031
 
914
1032
  /**
@@ -1062,20 +1180,26 @@ export class Agent {
1062
1180
  * Build base AgentContext for handler/hook calls.
1063
1181
  */
1064
1182
  private buildAgentContext(agentState: AgentState): AgentContext {
1183
+ const sessionContext = this.getSessionContext()
1065
1184
  return {
1066
- // SessionContext fields (refreshed from store for up-to-date state)
1067
- sessionId: this.sessionContext.sessionId,
1185
+ // SessionContext fields are rebuilt for up-to-date state.
1186
+ sessionId: sessionContext.sessionId,
1068
1187
  sessionState: this.store.getState(),
1069
- sessionInput: this.sessionContext.sessionInput,
1070
- environment: this.sessionContext.environment,
1071
- llm: this.sessionContext.llm,
1072
- files: this.sessionContext.files,
1073
- eventStore: this.sessionContext.eventStore,
1074
- llmLogger: this.sessionContext.llmLogger,
1075
- platform: this.sessionContext.platform,
1188
+ getSessionState: sessionContext.getSessionState,
1189
+ sessionInput: sessionContext.sessionInput,
1190
+ environment: sessionContext.environment,
1191
+ llm: sessionContext.llm,
1192
+ files: sessionContext.files,
1193
+ eventStore: sessionContext.eventStore,
1194
+ llmLogger: sessionContext.llmLogger,
1195
+ platform: sessionContext.platform,
1076
1196
  logger: this.logger,
1077
- emitEvent: this.sessionContext.emitEvent,
1078
- notify: this.sessionContext.notify,
1197
+ runtimeActivity: sessionContext.runtimeActivity,
1198
+ reserveSequence: sessionContext.reserveSequence,
1199
+ reserveMailboxMessageSequence: sessionContext.reserveMailboxMessageSequence,
1200
+ emitEvent: sessionContext.emitEvent,
1201
+ emitEvents: sessionContext.emitEvents,
1202
+ notify: sessionContext.notify,
1079
1203
  // AgentContext fields
1080
1204
  agentId: this.id,
1081
1205
  agentState,
@@ -23,6 +23,12 @@ import type { ServiceConfig } from '~/plugins/services/schema.js'
23
23
  */
24
24
  export type UserCommunicationMode = 'tool' | 'xml' | 'both'
25
25
 
26
+ /**
27
+ * Key holding the object refs behind `agents: string[]`. A symbol so it rides
28
+ * along on a spread or a clone without ever showing up in JSON or Object.keys.
29
+ */
30
+ export const childAgentRefs = Symbol('roj.childAgentRefs')
31
+
26
32
  /**
27
33
  * Base configuration shared by all agent types.
28
34
  */
@@ -37,6 +43,8 @@ export interface BaseAgentConfig<TInput = unknown> {
37
43
  tools?: ToolDefinition<any>[]
38
44
  /** Names of agents this agent can spawn */
39
45
  agents?: string[]
46
+ /** Object refs behind `agents`, set by defineAgent/createOrchestrator. */
47
+ readonly [childAgentRefs]?: readonly AnyAgentDefinition[]
40
48
  /** Per-plugin agent-level configs */
41
49
  plugins?: AgentPluginConfig[]
42
50
  /** Debounce time in ms before processing mailbox. Default: 500ms */
@@ -2,6 +2,7 @@ import type { LLMError } from '~/core/llm/provider.js'
2
2
  import type { Result } from '~/lib/utils/result.js'
3
3
  import { Err } from '~/lib/utils/result.js'
4
4
  import type { Logger } from '../../lib/logger/logger.js'
5
+ import { sleep } from '~/lib/utils/sleep.js'
5
6
 
6
7
  // ============================================================================
7
8
  // Retry Options
@@ -26,7 +27,7 @@ export const DEFAULT_RETRY_OPTIONS: Required<RetryOptions> = {
26
27
  export interface WithRetryOptions<E> extends RetryOptions {
27
28
  isRetryable: (error: E) => boolean
28
29
  getRetryDelay?: (error: E) => number | undefined
29
- /** Error to return when aborted before first attempt */
30
+ /** Error to return when the caller's signal aborts, whichever attempt that happens on. */
30
31
  abortError?: E
31
32
  logger?: Logger
32
33
  context?: string
@@ -51,8 +52,13 @@ export async function withRetry<T, E>(
51
52
 
52
53
  while (attempt < opts.maxAttempts) {
53
54
  if (options.signal?.aborted) {
54
- const error = lastError ?? options.abortError
55
- if (error !== undefined) {
55
+ // abortError wins over lastError: the caller cancelled, and that is what
56
+ // the cancellation means regardless of how the previous attempt failed.
57
+ // Returning the previous failure instead makes a cancel indistinguishable
58
+ // from a genuine one — Agent.runInference then emits inference_failed and
59
+ // notifies the parent for what was really a shutdown.
60
+ const error = options.abortError ?? lastError
61
+ if (error !== null && error !== undefined) {
56
62
  return Err(error)
57
63
  }
58
64
  break
@@ -71,12 +77,16 @@ export async function withRetry<T, E>(
71
77
  }
72
78
 
73
79
  lastError = result.error
80
+ attempt++
81
+
82
+ if (options.signal?.aborted) {
83
+ return Err(options.abortError ?? lastError)
84
+ }
74
85
 
75
- if (!options.isRetryable(lastError)) {
86
+ if (attempt >= opts.maxAttempts || !options.isRetryable(lastError)) {
76
87
  return result
77
88
  }
78
89
 
79
- attempt++
80
90
  const delay = calculateDelay(attempt, lastError, opts, options.getRetryDelay)
81
91
 
82
92
  if (options.logger) {
@@ -114,17 +124,6 @@ function calculateDelay<E>(
114
124
  return Math.min(exponentialDelay + jitter, opts.maxDelayMs)
115
125
  }
116
126
 
117
- function sleep(ms: number, signal?: AbortSignal): Promise<void> {
118
- if (signal?.aborted) return Promise.resolve()
119
- return new Promise<void>((resolve) => {
120
- const timer = setTimeout(resolve, ms)
121
- signal?.addEventListener('abort', () => {
122
- clearTimeout(timer)
123
- resolve()
124
- }, { once: true })
125
- })
126
- }
127
-
128
127
  // ============================================================================
129
128
  // LLM-specific helpers
130
129
  // ============================================================================
@@ -158,7 +157,7 @@ export async function withLLMRetry<T>(
158
157
  ...options,
159
158
  isRetryable: isRetryableLLMError,
160
159
  getRetryDelay: getLLMRetryDelay,
161
- abortError: { type: 'aborted', message: 'Aborted before first attempt' },
160
+ abortError: { type: 'aborted', message: 'Request was aborted' },
162
161
  context: 'LLM inference',
163
162
  })
164
163
  }
@@ -136,6 +136,28 @@ export interface UserLLMMessage {
136
136
  cacheControl?: LLMMessageCacheControl
137
137
  }
138
138
 
139
+ /**
140
+ * Provider chain-of-thought blocks, kept opaque (OpenRouter `reasoning_details`).
141
+ *
142
+ * The provider requires the exact sequence it produced to come back verbatim, so
143
+ * these are never parsed, reordered or normalized — only stored and echoed. The
144
+ * shape is provider- and model-specific and changes without notice; nothing in
145
+ * the SDK may depend on it.
146
+ */
147
+ export type ReasoningDetails = unknown[]
148
+
149
+ /**
150
+ * Anthropic extended-thinking blocks (`thinking` and `redacted_thinking`), kept opaque
151
+ * for the same reason as {@link ReasoningDetails}: each carries a `signature` the API
152
+ * verifies, so an edited block is worse than a missing one.
153
+ *
154
+ * Deliberately a separate field rather than sharing `reasoningDetails`. A session can
155
+ * change model mid-conversation, so one field would eventually put Anthropic-shaped
156
+ * blocks in front of OpenRouter or the reverse. Two fields make that case degrade to
157
+ * "absent", which both providers accept, instead of "wrong shape", which neither does.
158
+ */
159
+ export type ThinkingBlocks = unknown[]
160
+
139
161
  /**
140
162
  * Assistant message - LLM response.
141
163
  */
@@ -143,6 +165,10 @@ export interface AssistantLLMMessage {
143
165
  role: 'assistant'
144
166
  content: string
145
167
  toolCalls?: ToolCall[]
168
+ /** Reasoning blocks to echo back on later requests, so the model keeps its chain of thought across tool calls. */
169
+ reasoningDetails?: ReasoningDetails
170
+ /** Anthropic thinking blocks to replay on later requests. Required by the API during tool use. */
171
+ thinkingBlocks?: ThinkingBlocks
146
172
  /** Marks this message as a prompt cache breakpoint. */
147
173
  cacheControl?: LLMMessageCacheControl
148
174
  }
@@ -210,6 +236,8 @@ export interface AgentState {
210
236
  typedInput?: unknown
211
237
  /** Whether onStart handler has been executed (for first-run initialization) */
212
238
  onStartCalled?: boolean
239
+ /** Inference turns committed so far — persisted, so compaction can't erase it. */
240
+ turnNumber?: number
213
241
  /** Reason for pause (set when status is 'paused') */
214
242
  pauseReason?: AgentPauseReason
215
243
  /** Human-readable pause message */
@@ -56,6 +56,10 @@ export const compactedConversationMessageSchema: z4.ZodType<LLMMessage> = z4.dis
56
56
  name: z4.string(),
57
57
  input: z4.unknown(),
58
58
  })).optional(),
59
+ /** Opaque provider reasoning blocks — retained turns keep them, see ReasoningDetails. */
60
+ reasoningDetails: z4.array(z4.unknown()).optional(),
61
+ /** Anthropic thinking blocks — same. */
62
+ thinkingBlocks: z4.array(z4.unknown()).optional(),
59
63
  cacheControl: cacheControlSchema.optional(),
60
64
  }),
61
65
  z4.object({