@roj-ai/sdk 0.1.36 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (925) hide show
  1. package/dist/bootstrap.d.ts +420 -26
  2. package/dist/bootstrap.d.ts.map +1 -1
  3. package/dist/bootstrap.js +55 -24
  4. package/dist/bootstrap.js.map +1 -1
  5. package/dist/bun-platform/fs.d.ts.map +1 -1
  6. package/dist/bun-platform/fs.js +1 -0
  7. package/dist/bun-platform/fs.js.map +1 -1
  8. package/dist/bun-platform/index.d.ts +4 -1
  9. package/dist/bun-platform/index.d.ts.map +1 -1
  10. package/dist/bun-platform/index.js +7 -1
  11. package/dist/bun-platform/index.js.map +1 -1
  12. package/dist/bun-platform/server-lifecycle.d.ts +30 -0
  13. package/dist/bun-platform/server-lifecycle.d.ts.map +1 -0
  14. package/dist/bun-platform/server-lifecycle.js +182 -0
  15. package/dist/bun-platform/server-lifecycle.js.map +1 -0
  16. package/dist/bun-platform/shell.d.ts +33 -0
  17. package/dist/bun-platform/shell.d.ts.map +1 -0
  18. package/dist/bun-platform/shell.js +322 -0
  19. package/dist/bun-platform/shell.js.map +1 -0
  20. package/dist/config.d.ts +34 -0
  21. package/dist/config.d.ts.map +1 -1
  22. package/dist/config.js +97 -0
  23. package/dist/config.js.map +1 -1
  24. package/dist/core/agents/agent.d.ts +42 -7
  25. package/dist/core/agents/agent.d.ts.map +1 -1
  26. package/dist/core/agents/agent.js +202 -87
  27. package/dist/core/agents/agent.js.map +1 -1
  28. package/dist/core/agents/config.d.ts +8 -1
  29. package/dist/core/agents/config.d.ts.map +1 -1
  30. package/dist/core/agents/config.js +5 -1
  31. package/dist/core/agents/config.js.map +1 -1
  32. package/dist/core/agents/retry.d.ts +1 -1
  33. package/dist/core/agents/retry.d.ts.map +1 -1
  34. package/dist/core/agents/retry.js +14 -16
  35. package/dist/core/agents/retry.js.map +1 -1
  36. package/dist/core/agents/state.d.ts +3 -1
  37. package/dist/core/agents/state.d.ts.map +1 -1
  38. package/dist/core/agents/state.js +1 -1
  39. package/dist/core/agents/state.js.map +1 -1
  40. package/dist/core/context/state.d.ts +3 -3
  41. package/dist/core/context/state.js +2 -2
  42. package/dist/core/events/base-event-store.d.ts.map +1 -1
  43. package/dist/core/events/base-event-store.js +22 -14
  44. package/dist/core/events/base-event-store.js.map +1 -1
  45. package/dist/core/events/file.d.ts +39 -1
  46. package/dist/core/events/file.d.ts.map +1 -1
  47. package/dist/core/events/file.js +159 -20
  48. package/dist/core/events/file.js.map +1 -1
  49. package/dist/core/events/types.d.ts +1 -1
  50. package/dist/core/file-store/containment.d.ts +19 -0
  51. package/dist/core/file-store/containment.d.ts.map +1 -0
  52. package/dist/core/file-store/containment.js +62 -0
  53. package/dist/core/file-store/containment.js.map +1 -0
  54. package/dist/core/file-store/file-store.d.ts +22 -2
  55. package/dist/core/file-store/file-store.d.ts.map +1 -1
  56. package/dist/core/file-store/file-store.js +88 -20
  57. package/dist/core/file-store/file-store.js.map +1 -1
  58. package/dist/core/file-store/types.d.ts +13 -1
  59. package/dist/core/file-store/types.d.ts.map +1 -1
  60. package/dist/core/image/image-processor.d.ts.map +1 -1
  61. package/dist/core/image/image-processor.js +3 -1
  62. package/dist/core/image/image-processor.js.map +1 -1
  63. package/dist/core/image/types.d.ts +2 -0
  64. package/dist/core/image/types.d.ts.map +1 -1
  65. package/dist/core/image/vips-resizer.d.ts.map +1 -1
  66. package/dist/core/image/vips-resizer.js +81 -33
  67. package/dist/core/image/vips-resizer.js.map +1 -1
  68. package/dist/core/llm/anthropic.d.ts +0 -1
  69. package/dist/core/llm/anthropic.d.ts.map +1 -1
  70. package/dist/core/llm/anthropic.js +58 -72
  71. package/dist/core/llm/anthropic.js.map +1 -1
  72. package/dist/core/llm/logger.d.ts +14 -2
  73. package/dist/core/llm/logger.d.ts.map +1 -1
  74. package/dist/core/llm/logger.js +161 -36
  75. package/dist/core/llm/logger.js.map +1 -1
  76. package/dist/core/llm/openrouter.d.ts +0 -1
  77. package/dist/core/llm/openrouter.d.ts.map +1 -1
  78. package/dist/core/llm/openrouter.js +53 -66
  79. package/dist/core/llm/openrouter.js.map +1 -1
  80. package/dist/core/llm/provider-request.d.ts +10 -0
  81. package/dist/core/llm/provider-request.d.ts.map +1 -0
  82. package/dist/core/llm/provider-request.js +41 -0
  83. package/dist/core/llm/provider-request.js.map +1 -0
  84. package/dist/core/llm/provider.d.ts +11 -0
  85. package/dist/core/llm/provider.d.ts.map +1 -1
  86. package/dist/core/llm/provider.js +26 -0
  87. package/dist/core/llm/provider.js.map +1 -1
  88. package/dist/core/llm/state.d.ts +2 -2
  89. package/dist/core/llm/state.js +4 -4
  90. package/dist/core/plugins/plugin-builder.d.ts +57 -3
  91. package/dist/core/plugins/plugin-builder.d.ts.map +1 -1
  92. package/dist/core/plugins/plugin-builder.js +68 -14
  93. package/dist/core/plugins/plugin-builder.js.map +1 -1
  94. package/dist/core/preset/preset-builder.d.ts +3 -2
  95. package/dist/core/preset/preset-builder.d.ts.map +1 -1
  96. package/dist/core/preset/preset-builder.js +7 -16
  97. package/dist/core/preset/preset-builder.js.map +1 -1
  98. package/dist/core/sessions/context.d.ts +23 -5
  99. package/dist/core/sessions/context.d.ts.map +1 -1
  100. package/dist/core/sessions/runtime-activity.d.ts +33 -0
  101. package/dist/core/sessions/runtime-activity.d.ts.map +1 -0
  102. package/dist/core/sessions/runtime-activity.js +55 -0
  103. package/dist/core/sessions/runtime-activity.js.map +1 -0
  104. package/dist/core/sessions/schema.d.ts +23 -2
  105. package/dist/core/sessions/schema.d.ts.map +1 -1
  106. package/dist/core/sessions/schema.js +24 -3
  107. package/dist/core/sessions/schema.js.map +1 -1
  108. package/dist/core/sessions/session-manager.d.ts +83 -6
  109. package/dist/core/sessions/session-manager.d.ts.map +1 -1
  110. package/dist/core/sessions/session-manager.js +517 -118
  111. package/dist/core/sessions/session-manager.js.map +1 -1
  112. package/dist/core/sessions/session-store.d.ts +18 -0
  113. package/dist/core/sessions/session-store.d.ts.map +1 -1
  114. package/dist/core/sessions/session-store.js +33 -0
  115. package/dist/core/sessions/session-store.js.map +1 -1
  116. package/dist/core/sessions/session.d.ts +42 -6
  117. package/dist/core/sessions/session.d.ts.map +1 -1
  118. package/dist/core/sessions/session.js +176 -44
  119. package/dist/core/sessions/session.js.map +1 -1
  120. package/dist/core/sessions/state.d.ts +10 -1
  121. package/dist/core/sessions/state.d.ts.map +1 -1
  122. package/dist/core/sessions/state.js +11 -1
  123. package/dist/core/sessions/state.js.map +1 -1
  124. package/dist/core/system.d.ts +9 -0
  125. package/dist/core/system.d.ts.map +1 -1
  126. package/dist/core/system.js +4 -1
  127. package/dist/core/system.js.map +1 -1
  128. package/dist/core/tools/executor.d.ts +1 -1
  129. package/dist/core/wake-key.d.ts +34 -0
  130. package/dist/core/wake-key.d.ts.map +1 -0
  131. package/dist/core/wake-key.js +51 -0
  132. package/dist/core/wake-key.js.map +1 -0
  133. package/dist/index.d.ts +25 -13
  134. package/dist/index.d.ts.map +1 -1
  135. package/dist/index.js +23 -8
  136. package/dist/index.js.map +1 -1
  137. package/dist/lib/archive/archive-inspection.d.ts +48 -0
  138. package/dist/lib/archive/archive-inspection.d.ts.map +1 -0
  139. package/dist/lib/archive/archive-inspection.fixtures.d.ts +7 -0
  140. package/dist/lib/archive/archive-inspection.fixtures.d.ts.map +1 -0
  141. package/dist/lib/archive/archive-inspection.fixtures.js +134 -0
  142. package/dist/lib/archive/archive-inspection.fixtures.js.map +1 -0
  143. package/dist/lib/archive/archive-inspection.js +253 -0
  144. package/dist/lib/archive/archive-inspection.js.map +1 -0
  145. package/dist/lib/archive/index.d.ts +3 -0
  146. package/dist/lib/archive/index.d.ts.map +1 -0
  147. package/dist/lib/archive/index.js +2 -0
  148. package/dist/lib/archive/index.js.map +1 -0
  149. package/dist/lib/logger/console.d.ts +5 -12
  150. package/dist/lib/logger/console.d.ts.map +1 -1
  151. package/dist/lib/logger/console.js +5 -47
  152. package/dist/lib/logger/console.js.map +1 -1
  153. package/dist/lib/logger/file.d.ts +8 -11
  154. package/dist/lib/logger/file.d.ts.map +1 -1
  155. package/dist/lib/logger/file.js +26 -37
  156. package/dist/lib/logger/file.js.map +1 -1
  157. package/dist/lib/logger/index.d.ts +3 -1
  158. package/dist/lib/logger/index.d.ts.map +1 -1
  159. package/dist/lib/logger/index.js +3 -1
  160. package/dist/lib/logger/index.js.map +1 -1
  161. package/dist/lib/logger/jsonl.d.ts +21 -0
  162. package/dist/lib/logger/jsonl.d.ts.map +1 -0
  163. package/dist/lib/logger/jsonl.js +29 -0
  164. package/dist/lib/logger/jsonl.js.map +1 -0
  165. package/dist/lib/logger/logger.d.ts +22 -0
  166. package/dist/lib/logger/logger.d.ts.map +1 -1
  167. package/dist/lib/logger/logger.js +37 -0
  168. package/dist/lib/logger/logger.js.map +1 -1
  169. package/dist/lib/logger/session-log.d.ts +21 -0
  170. package/dist/lib/logger/session-log.d.ts.map +1 -0
  171. package/dist/lib/logger/session-log.js +37 -0
  172. package/dist/lib/logger/session-log.js.map +1 -0
  173. package/dist/lib/utils/concurrency.d.ts +1 -1
  174. package/dist/lib/utils/concurrency.d.ts.map +1 -1
  175. package/dist/lib/utils/concurrency.js +30 -7
  176. package/dist/lib/utils/concurrency.js.map +1 -1
  177. package/dist/lib/utils/fs-batch.d.ts +17 -0
  178. package/dist/lib/utils/fs-batch.d.ts.map +1 -0
  179. package/dist/lib/utils/fs-batch.js +38 -0
  180. package/dist/lib/utils/fs-batch.js.map +1 -0
  181. package/dist/lib/utils/result.d.ts +7 -22
  182. package/dist/lib/utils/result.d.ts.map +1 -1
  183. package/dist/lib/utils/result.js +6 -17
  184. package/dist/lib/utils/result.js.map +1 -1
  185. package/dist/lib/utils/sleep.d.ts +10 -0
  186. package/dist/lib/utils/sleep.d.ts.map +1 -0
  187. package/dist/lib/utils/sleep.js +26 -0
  188. package/dist/lib/utils/sleep.js.map +1 -0
  189. package/dist/platform/fs-revision.d.ts +21 -0
  190. package/dist/platform/fs-revision.d.ts.map +1 -0
  191. package/dist/platform/fs-revision.js +9 -0
  192. package/dist/platform/fs-revision.js.map +1 -0
  193. package/dist/platform/fs.d.ts +104 -1
  194. package/dist/platform/fs.d.ts.map +1 -1
  195. package/dist/platform/git.d.ts +59 -0
  196. package/dist/platform/git.d.ts.map +1 -0
  197. package/dist/platform/git.js +8 -0
  198. package/dist/platform/git.js.map +1 -0
  199. package/dist/platform/index.d.ts +40 -1
  200. package/dist/platform/index.d.ts.map +1 -1
  201. package/dist/platform/index.js +1 -1
  202. package/dist/platform/index.js.map +1 -1
  203. package/dist/platform/llm-call-log.d.ts +80 -0
  204. package/dist/platform/llm-call-log.d.ts.map +1 -0
  205. package/dist/platform/llm-call-log.js +12 -0
  206. package/dist/platform/llm-call-log.js.map +1 -0
  207. package/dist/platform/scheduler.d.ts +32 -0
  208. package/dist/platform/scheduler.d.ts.map +1 -0
  209. package/dist/platform/scheduler.js +46 -0
  210. package/dist/platform/scheduler.js.map +1 -0
  211. package/dist/platform/session-log.d.ts +36 -0
  212. package/dist/platform/session-log.d.ts.map +1 -0
  213. package/dist/platform/session-log.js +12 -0
  214. package/dist/platform/session-log.js.map +1 -0
  215. package/dist/platform/shell.d.ts +83 -0
  216. package/dist/platform/shell.d.ts.map +1 -0
  217. package/dist/platform/shell.js +13 -0
  218. package/dist/platform/shell.js.map +1 -0
  219. package/dist/plugins/agent-status/plugin.d.ts.map +1 -1
  220. package/dist/plugins/agent-status/plugin.js +1 -0
  221. package/dist/plugins/agent-status/plugin.js.map +1 -1
  222. package/dist/plugins/agents/plugin.d.ts.map +1 -1
  223. package/dist/plugins/agents/plugin.js +129 -62
  224. package/dist/plugins/agents/plugin.js.map +1 -1
  225. package/dist/plugins/filesystem/listing.d.ts +3 -0
  226. package/dist/plugins/filesystem/listing.d.ts.map +1 -1
  227. package/dist/plugins/filesystem/listing.js +66 -10
  228. package/dist/plugins/filesystem/listing.js.map +1 -1
  229. package/dist/plugins/filesystem/plugin.d.ts.map +1 -1
  230. package/dist/plugins/filesystem/plugin.js +8 -6
  231. package/dist/plugins/filesystem/plugin.js.map +1 -1
  232. package/dist/plugins/git-status/index.d.ts +1 -0
  233. package/dist/plugins/git-status/index.d.ts.map +1 -1
  234. package/dist/plugins/git-status/plugin.d.ts +38 -7
  235. package/dist/plugins/git-status/plugin.d.ts.map +1 -1
  236. package/dist/plugins/git-status/plugin.js +169 -64
  237. package/dist/plugins/git-status/plugin.js.map +1 -1
  238. package/dist/plugins/llm-debug/plugin.d.ts.map +1 -1
  239. package/dist/plugins/llm-debug/plugin.js +1 -0
  240. package/dist/plugins/llm-debug/plugin.js.map +1 -1
  241. package/dist/plugins/logs/plugin.d.ts +1 -4
  242. package/dist/plugins/logs/plugin.d.ts.map +1 -1
  243. package/dist/plugins/logs/plugin.js +7 -0
  244. package/dist/plugins/logs/plugin.js.map +1 -1
  245. package/dist/plugins/mailbox/helpers.d.ts +2 -2
  246. package/dist/plugins/mailbox/helpers.js +1 -1
  247. package/dist/plugins/mailbox/plugin.d.ts.map +1 -1
  248. package/dist/plugins/mailbox/plugin.js +38 -43
  249. package/dist/plugins/mailbox/plugin.js.map +1 -1
  250. package/dist/plugins/mailbox/query.d.ts +7 -2
  251. package/dist/plugins/mailbox/query.d.ts.map +1 -1
  252. package/dist/plugins/mailbox/query.js +14 -7
  253. package/dist/plugins/mailbox/query.js.map +1 -1
  254. package/dist/plugins/mailbox/state.d.ts +5 -4
  255. package/dist/plugins/mailbox/state.d.ts.map +1 -1
  256. package/dist/plugins/mailbox/state.js +6 -5
  257. package/dist/plugins/mailbox/state.js.map +1 -1
  258. package/dist/plugins/resources/filename.d.ts +4 -0
  259. package/dist/plugins/resources/filename.d.ts.map +1 -0
  260. package/dist/plugins/resources/filename.js +18 -0
  261. package/dist/plugins/resources/filename.js.map +1 -0
  262. package/dist/plugins/resources/plugin.d.ts +3 -0
  263. package/dist/plugins/resources/plugin.d.ts.map +1 -1
  264. package/dist/plugins/resources/plugin.js +97 -60
  265. package/dist/plugins/resources/plugin.js.map +1 -1
  266. package/dist/plugins/resources/state.d.ts +1 -1
  267. package/dist/plugins/resources/state.js +1 -1
  268. package/dist/plugins/result-eviction/plugin.d.ts.map +1 -1
  269. package/dist/plugins/result-eviction/plugin.js +6 -1
  270. package/dist/plugins/result-eviction/plugin.js.map +1 -1
  271. package/dist/plugins/services/plugin.d.ts +4 -1
  272. package/dist/plugins/services/plugin.d.ts.map +1 -1
  273. package/dist/plugins/services/plugin.js +251 -100
  274. package/dist/plugins/services/plugin.js.map +1 -1
  275. package/dist/plugins/services/prompt.d.ts.map +1 -1
  276. package/dist/plugins/services/prompt.js +1 -4
  277. package/dist/plugins/services/prompt.js.map +1 -1
  278. package/dist/plugins/services/schema.d.ts +15 -5
  279. package/dist/plugins/services/schema.d.ts.map +1 -1
  280. package/dist/plugins/services/service.d.ts +100 -18
  281. package/dist/plugins/services/service.d.ts.map +1 -1
  282. package/dist/plugins/services/service.js +680 -230
  283. package/dist/plugins/services/service.js.map +1 -1
  284. package/dist/plugins/session-lifecycle/plugin.d.ts +21 -1
  285. package/dist/plugins/session-lifecycle/plugin.d.ts.map +1 -1
  286. package/dist/plugins/session-lifecycle/plugin.js +53 -40
  287. package/dist/plugins/session-lifecycle/plugin.js.map +1 -1
  288. package/dist/plugins/session-state/plugin.d.ts +21 -13
  289. package/dist/plugins/session-state/plugin.d.ts.map +1 -1
  290. package/dist/plugins/session-state/plugin.js +214 -79
  291. package/dist/plugins/session-state/plugin.js.map +1 -1
  292. package/dist/plugins/session-stats/plugin.d.ts.map +1 -1
  293. package/dist/plugins/session-stats/plugin.js +1 -0
  294. package/dist/plugins/session-stats/plugin.js.map +1 -1
  295. package/dist/plugins/shell/executor.d.ts +17 -15
  296. package/dist/plugins/shell/executor.d.ts.map +1 -1
  297. package/dist/plugins/shell/executor.js +130 -195
  298. package/dist/plugins/shell/executor.js.map +1 -1
  299. package/dist/plugins/shell/index.d.ts +2 -2
  300. package/dist/plugins/shell/index.d.ts.map +1 -1
  301. package/dist/plugins/shell/index.js +2 -2
  302. package/dist/plugins/shell/index.js.map +1 -1
  303. package/dist/plugins/shell/plugin.d.ts +5 -4
  304. package/dist/plugins/shell/plugin.d.ts.map +1 -1
  305. package/dist/plugins/shell/plugin.js +4 -8
  306. package/dist/plugins/shell/plugin.js.map +1 -1
  307. package/dist/plugins/skills/discovery.d.ts.map +1 -1
  308. package/dist/plugins/skills/discovery.js +10 -8
  309. package/dist/plugins/skills/discovery.js.map +1 -1
  310. package/dist/plugins/skills/index.d.ts +1 -1
  311. package/dist/plugins/skills/index.d.ts.map +1 -1
  312. package/dist/plugins/skills/plugin.d.ts +1 -1
  313. package/dist/plugins/skills/plugin.d.ts.map +1 -1
  314. package/dist/plugins/skills/plugin.js +23 -30
  315. package/dist/plugins/skills/plugin.js.map +1 -1
  316. package/dist/plugins/skills/prompts.d.ts +3 -3
  317. package/dist/plugins/skills/prompts.d.ts.map +1 -1
  318. package/dist/plugins/skills/prompts.js.map +1 -1
  319. package/dist/plugins/skills/schema.d.ts +4 -2
  320. package/dist/plugins/skills/schema.d.ts.map +1 -1
  321. package/dist/plugins/todo/schema.d.ts +1 -1
  322. package/dist/plugins/uploads/plugin.d.ts +11 -4
  323. package/dist/plugins/uploads/plugin.d.ts.map +1 -1
  324. package/dist/plugins/uploads/plugin.js +891 -225
  325. package/dist/plugins/uploads/plugin.js.map +1 -1
  326. package/dist/plugins/uploads/preprocessor.d.ts +14 -0
  327. package/dist/plugins/uploads/preprocessor.d.ts.map +1 -1
  328. package/dist/plugins/uploads/preprocessor.js +11 -0
  329. package/dist/plugins/uploads/preprocessor.js.map +1 -1
  330. package/dist/plugins/uploads/preprocessors/image-classifier.d.ts +1 -1
  331. package/dist/plugins/uploads/preprocessors/image-classifier.d.ts.map +1 -1
  332. package/dist/plugins/uploads/preprocessors/image-classifier.js +51 -26
  333. package/dist/plugins/uploads/preprocessors/image-classifier.js.map +1 -1
  334. package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.d.ts +2 -2
  335. package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.d.ts.map +1 -1
  336. package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.js +41 -16
  337. package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.js.map +1 -1
  338. package/dist/plugins/uploads/preprocessors/pdf-preprocessor.d.ts +1 -1
  339. package/dist/plugins/uploads/preprocessors/pdf-preprocessor.d.ts.map +1 -1
  340. package/dist/plugins/uploads/preprocessors/pdf-preprocessor.js +29 -14
  341. package/dist/plugins/uploads/preprocessors/pdf-preprocessor.js.map +1 -1
  342. package/dist/plugins/uploads/preprocessors/zip-preprocessor.d.ts +1 -1
  343. package/dist/plugins/uploads/preprocessors/zip-preprocessor.d.ts.map +1 -1
  344. package/dist/plugins/uploads/preprocessors/zip-preprocessor.js +62 -34
  345. package/dist/plugins/uploads/preprocessors/zip-preprocessor.js.map +1 -1
  346. package/dist/plugins/uploads/schema.d.ts +25 -2
  347. package/dist/plugins/uploads/schema.d.ts.map +1 -1
  348. package/dist/plugins/uploads/schema.js +24 -3
  349. package/dist/plugins/uploads/schema.js.map +1 -1
  350. package/dist/plugins/uploads/state.d.ts +13 -1
  351. package/dist/plugins/uploads/state.d.ts.map +1 -1
  352. package/dist/plugins/uploads/state.js +4 -1
  353. package/dist/plugins/uploads/state.js.map +1 -1
  354. package/dist/plugins/user-chat/plugin.d.ts +12 -5
  355. package/dist/plugins/user-chat/plugin.d.ts.map +1 -1
  356. package/dist/plugins/user-chat/plugin.js +141 -32
  357. package/dist/plugins/user-chat/plugin.js.map +1 -1
  358. package/dist/plugins/workers/context.d.ts +35 -13
  359. package/dist/plugins/workers/context.d.ts.map +1 -1
  360. package/dist/plugins/workers/context.js +82 -32
  361. package/dist/plugins/workers/context.js.map +1 -1
  362. package/dist/plugins/workers/definition.d.ts +7 -0
  363. package/dist/plugins/workers/definition.d.ts.map +1 -1
  364. package/dist/plugins/workers/definition.js.map +1 -1
  365. package/dist/plugins/workers/index.d.ts +4 -4
  366. package/dist/plugins/workers/index.d.ts.map +1 -1
  367. package/dist/plugins/workers/index.js +2 -2
  368. package/dist/plugins/workers/index.js.map +1 -1
  369. package/dist/plugins/workers/plugin.d.ts +10 -57
  370. package/dist/plugins/workers/plugin.d.ts.map +1 -1
  371. package/dist/plugins/workers/plugin.js +385 -123
  372. package/dist/plugins/workers/plugin.js.map +1 -1
  373. package/dist/plugins/workers/state.d.ts +69 -0
  374. package/dist/plugins/workers/state.d.ts.map +1 -0
  375. package/dist/plugins/workers/state.js +52 -0
  376. package/dist/plugins/workers/state.js.map +1 -0
  377. package/dist/plugins/workers/worker.d.ts +15 -4
  378. package/dist/plugins/workers/worker.d.ts.map +1 -1
  379. package/dist/testing/conformance.d.ts +106 -0
  380. package/dist/testing/conformance.d.ts.map +1 -0
  381. package/dist/testing/conformance.js +1463 -0
  382. package/dist/testing/conformance.js.map +1 -0
  383. package/dist/testing/node-platform.d.ts.map +1 -1
  384. package/dist/testing/node-platform.js +5 -0
  385. package/dist/testing/node-platform.js.map +1 -1
  386. package/dist/testing/test-harness.d.ts +11 -1
  387. package/dist/testing/test-harness.d.ts.map +1 -1
  388. package/dist/testing/test-harness.js +17 -37
  389. package/dist/testing/test-harness.js.map +1 -1
  390. package/dist/testing/wait-helpers.d.ts.map +1 -1
  391. package/dist/testing/wait-helpers.js +1 -3
  392. package/dist/testing/wait-helpers.js.map +1 -1
  393. package/dist/transport/adapter/client-adapter.d.ts +6 -0
  394. package/dist/transport/adapter/client-adapter.d.ts.map +1 -1
  395. package/dist/transport/adapter/client-adapter.js +50 -3
  396. package/dist/transport/adapter/client-adapter.js.map +1 -1
  397. package/dist/transport/adapter/heartbeat.d.ts +16 -0
  398. package/dist/transport/adapter/heartbeat.d.ts.map +1 -0
  399. package/dist/transport/adapter/heartbeat.js +41 -0
  400. package/dist/transport/adapter/heartbeat.js.map +1 -0
  401. package/dist/transport/adapter/server-adapter.d.ts.map +1 -1
  402. package/dist/transport/adapter/server-adapter.js +6 -0
  403. package/dist/transport/adapter/server-adapter.js.map +1 -1
  404. package/dist/transport/http/app.d.ts +3 -30
  405. package/dist/transport/http/app.d.ts.map +1 -1
  406. package/dist/transport/http/app.js +3 -7
  407. package/dist/transport/http/app.js.map +1 -1
  408. package/dist/transport/http/context.d.ts +40 -0
  409. package/dist/transport/http/context.d.ts.map +1 -0
  410. package/dist/transport/http/context.js +17 -0
  411. package/dist/transport/http/context.js.map +1 -0
  412. package/dist/transport/http/fetch-guard.d.ts +49 -0
  413. package/dist/transport/http/fetch-guard.d.ts.map +1 -0
  414. package/dist/transport/http/fetch-guard.js +312 -0
  415. package/dist/transport/http/fetch-guard.js.map +1 -0
  416. package/dist/transport/http/index.d.ts +1 -1
  417. package/dist/transport/http/index.d.ts.map +1 -1
  418. package/dist/transport/http/middleware/bearer-auth.d.ts +1 -1
  419. package/dist/transport/http/middleware/bearer-auth.d.ts.map +1 -1
  420. package/dist/transport/http/middleware/error-handler.d.ts +2 -2
  421. package/dist/transport/http/middleware/error-handler.d.ts.map +1 -1
  422. package/dist/transport/http/path-containment.d.ts +20 -0
  423. package/dist/transport/http/path-containment.d.ts.map +1 -0
  424. package/dist/transport/http/path-containment.js +31 -0
  425. package/dist/transport/http/path-containment.js.map +1 -0
  426. package/dist/transport/http/responses.d.ts +30 -0
  427. package/dist/transport/http/responses.d.ts.map +1 -0
  428. package/dist/transport/http/responses.js +5 -0
  429. package/dist/transport/http/responses.js.map +1 -0
  430. package/dist/transport/http/routes/files.d.ts +1 -1
  431. package/dist/transport/http/routes/files.d.ts.map +1 -1
  432. package/dist/transport/http/routes/files.js +54 -155
  433. package/dist/transport/http/routes/files.js.map +1 -1
  434. package/dist/transport/http/routes/resources.d.ts +1 -1
  435. package/dist/transport/http/routes/resources.d.ts.map +1 -1
  436. package/dist/transport/http/routes/resources.js +92 -57
  437. package/dist/transport/http/routes/resources.js.map +1 -1
  438. package/dist/transport/http/routes/rpc.d.ts +6 -1
  439. package/dist/transport/http/routes/rpc.d.ts.map +1 -1
  440. package/dist/transport/http/routes/rpc.js +51 -21
  441. package/dist/transport/http/routes/rpc.js.map +1 -1
  442. package/dist/transport/http/routes/upload.d.ts +1 -1
  443. package/dist/transport/http/routes/upload.d.ts.map +1 -1
  444. package/dist/transport/http/routes/upload.js +256 -169
  445. package/dist/transport/http/routes/upload.js.map +1 -1
  446. package/dist/user-config.d.ts +34 -7
  447. package/dist/user-config.d.ts.map +1 -1
  448. package/dist/user-config.js +71 -0
  449. package/dist/user-config.js.map +1 -1
  450. package/package.json +17 -7
  451. package/src/bootstrap.ts +119 -35
  452. package/src/bun-platform/fs.ts +1 -0
  453. package/src/bun-platform/index.ts +18 -1
  454. package/src/bun-platform/server-lifecycle.ts +218 -0
  455. package/src/bun-platform/shell.ts +362 -0
  456. package/src/config.ts +130 -0
  457. package/src/core/agents/agent.ts +210 -92
  458. package/src/core/agents/config.ts +8 -0
  459. package/src/core/agents/retry.ts +16 -17
  460. package/src/core/agents/state.ts +2 -0
  461. package/src/core/events/base-event-store.ts +24 -16
  462. package/src/core/events/file.ts +198 -22
  463. package/src/core/file-store/containment.ts +75 -0
  464. package/src/core/file-store/file-store.ts +106 -25
  465. package/src/core/file-store/types.ts +14 -1
  466. package/src/core/image/image-processor.ts +3 -1
  467. package/src/core/image/types.ts +2 -0
  468. package/src/core/image/vips-resizer.ts +102 -37
  469. package/src/core/llm/anthropic.ts +63 -79
  470. package/src/core/llm/logger.ts +175 -37
  471. package/src/core/llm/openrouter.ts +57 -72
  472. package/src/core/llm/provider-request.ts +40 -0
  473. package/src/core/llm/provider.ts +28 -0
  474. package/src/core/plugins/plugin-builder.ts +106 -14
  475. package/src/core/preset/preset-builder.ts +12 -22
  476. package/src/core/sessions/context.ts +18 -0
  477. package/src/core/sessions/runtime-activity.ts +78 -0
  478. package/src/core/sessions/schema.ts +29 -3
  479. package/src/core/sessions/session-manager.ts +560 -140
  480. package/src/core/sessions/session-store.ts +38 -0
  481. package/src/core/sessions/session.ts +187 -47
  482. package/src/core/sessions/state.ts +11 -0
  483. package/src/core/system.ts +15 -0
  484. package/src/core/wake-key.ts +65 -0
  485. package/src/index.ts +32 -12
  486. package/src/lib/archive/archive-inspection.fixtures.ts +138 -0
  487. package/src/lib/archive/archive-inspection.ts +359 -0
  488. package/src/lib/archive/index.ts +17 -0
  489. package/src/lib/logger/console.ts +7 -57
  490. package/src/lib/logger/file.ts +28 -50
  491. package/src/lib/logger/index.ts +3 -1
  492. package/src/lib/logger/jsonl.ts +36 -0
  493. package/src/lib/logger/logger.ts +48 -0
  494. package/src/lib/logger/session-log.ts +42 -0
  495. package/src/lib/utils/concurrency.ts +37 -8
  496. package/src/lib/utils/fs-batch.ts +49 -0
  497. package/src/lib/utils/result.ts +7 -31
  498. package/src/lib/utils/sleep.ts +23 -0
  499. package/src/platform/fs-revision.ts +21 -0
  500. package/src/platform/fs.ts +109 -1
  501. package/src/platform/git.ts +67 -0
  502. package/src/platform/index.ts +51 -1
  503. package/src/platform/llm-call-log.ts +86 -0
  504. package/src/platform/scheduler.ts +71 -0
  505. package/src/platform/session-log.ts +39 -0
  506. package/src/platform/shell.ts +89 -0
  507. package/src/plugins/agent-status/plugin.ts +1 -0
  508. package/src/plugins/agents/plugin.ts +134 -81
  509. package/src/plugins/filesystem/listing.ts +70 -12
  510. package/src/plugins/filesystem/plugin.ts +8 -6
  511. package/src/plugins/git-status/index.ts +1 -0
  512. package/src/plugins/git-status/plugin.ts +211 -77
  513. package/src/plugins/llm-debug/plugin.ts +1 -0
  514. package/src/plugins/logs/plugin.ts +9 -0
  515. package/src/plugins/mailbox/plugin.ts +46 -64
  516. package/src/plugins/mailbox/query.ts +15 -7
  517. package/src/plugins/mailbox/state.ts +1 -0
  518. package/src/plugins/resources/filename.ts +19 -0
  519. package/src/plugins/resources/plugin.ts +111 -59
  520. package/src/plugins/result-eviction/plugin.ts +6 -1
  521. package/src/plugins/services/plugin.ts +254 -98
  522. package/src/plugins/services/prompt.ts +1 -6
  523. package/src/plugins/services/schema.ts +17 -3
  524. package/src/plugins/services/service.ts +702 -252
  525. package/src/plugins/session-lifecycle/plugin.ts +56 -41
  526. package/src/plugins/session-state/plugin.ts +242 -88
  527. package/src/plugins/session-stats/plugin.ts +1 -0
  528. package/src/plugins/shell/executor.ts +144 -226
  529. package/src/plugins/shell/index.ts +1 -4
  530. package/src/plugins/shell/plugin.ts +7 -9
  531. package/src/plugins/skills/discovery.ts +10 -8
  532. package/src/plugins/skills/index.ts +1 -1
  533. package/src/plugins/skills/plugin.ts +19 -27
  534. package/src/plugins/skills/prompts.ts +3 -3
  535. package/src/plugins/skills/schema.ts +5 -2
  536. package/src/plugins/uploads/plugin.ts +991 -273
  537. package/src/plugins/uploads/preprocessor.ts +25 -0
  538. package/src/plugins/uploads/preprocessors/image-classifier.ts +56 -25
  539. package/src/plugins/uploads/preprocessors/markitdown-preprocessor.ts +41 -15
  540. package/src/plugins/uploads/preprocessors/pdf-preprocessor.ts +32 -16
  541. package/src/plugins/uploads/preprocessors/zip-preprocessor.ts +67 -38
  542. package/src/plugins/uploads/schema.ts +30 -3
  543. package/src/plugins/uploads/state.ts +12 -0
  544. package/src/plugins/user-chat/plugin.ts +196 -40
  545. package/src/plugins/workers/context.ts +102 -39
  546. package/src/plugins/workers/definition.ts +7 -0
  547. package/src/plugins/workers/index.ts +4 -4
  548. package/src/plugins/workers/plugin.ts +461 -151
  549. package/src/plugins/workers/state.ts +64 -0
  550. package/src/plugins/workers/worker.ts +15 -4
  551. package/src/testing/conformance.ts +1751 -0
  552. package/src/testing/node-platform.ts +5 -0
  553. package/src/testing/test-harness.ts +21 -38
  554. package/src/testing/wait-helpers.ts +1 -4
  555. package/src/transport/adapter/client-adapter.ts +60 -3
  556. package/src/transport/adapter/heartbeat.ts +50 -0
  557. package/src/transport/adapter/server-adapter.ts +6 -0
  558. package/src/transport/http/app.ts +7 -35
  559. package/src/transport/http/context.ts +46 -0
  560. package/src/transport/http/fetch-guard.ts +318 -0
  561. package/src/transport/http/index.ts +1 -1
  562. package/src/transport/http/middleware/bearer-auth.ts +1 -1
  563. package/src/transport/http/middleware/error-handler.ts +1 -1
  564. package/src/transport/http/path-containment.ts +44 -0
  565. package/src/transport/http/responses.ts +20 -0
  566. package/src/transport/http/routes/files.ts +69 -159
  567. package/src/transport/http/routes/resources.ts +124 -93
  568. package/src/transport/http/routes/rpc.ts +63 -26
  569. package/src/transport/http/routes/upload.ts +327 -258
  570. package/src/user-config.ts +93 -7
  571. package/dist/config.test.d.ts +0 -2
  572. package/dist/config.test.d.ts.map +0 -1
  573. package/dist/config.test.js +0 -155
  574. package/dist/config.test.js.map +0 -1
  575. package/dist/core/agent-loop.integration.test.d.ts +0 -2
  576. package/dist/core/agent-loop.integration.test.d.ts.map +0 -1
  577. package/dist/core/agent-loop.integration.test.js +0 -414
  578. package/dist/core/agent-loop.integration.test.js.map +0 -1
  579. package/dist/core/agents/agent-config.test.d.ts +0 -2
  580. package/dist/core/agents/agent-config.test.d.ts.map +0 -1
  581. package/dist/core/agents/agent-config.test.js +0 -194
  582. package/dist/core/agents/agent-config.test.js.map +0 -1
  583. package/dist/core/agents/agent-shutdown.test.d.ts +0 -6
  584. package/dist/core/agents/agent-shutdown.test.d.ts.map +0 -1
  585. package/dist/core/agents/agent-shutdown.test.js +0 -180
  586. package/dist/core/agents/agent-shutdown.test.js.map +0 -1
  587. package/dist/core/agents/agent.test.d.ts +0 -2
  588. package/dist/core/agents/agent.test.d.ts.map +0 -1
  589. package/dist/core/agents/agent.test.js +0 -313
  590. package/dist/core/agents/agent.test.js.map +0 -1
  591. package/dist/core/agents/communicator.d.ts +0 -3
  592. package/dist/core/agents/communicator.d.ts.map +0 -1
  593. package/dist/core/agents/communicator.js +0 -13
  594. package/dist/core/agents/communicator.js.map +0 -1
  595. package/dist/core/agents/handler-events.test.d.ts +0 -5
  596. package/dist/core/agents/handler-events.test.d.ts.map +0 -1
  597. package/dist/core/agents/handler-events.test.js +0 -115
  598. package/dist/core/agents/handler-events.test.js.map +0 -1
  599. package/dist/core/agents/response-sanitizer.test.d.ts +0 -2
  600. package/dist/core/agents/response-sanitizer.test.d.ts.map +0 -1
  601. package/dist/core/agents/response-sanitizer.test.js +0 -101
  602. package/dist/core/agents/response-sanitizer.test.js.map +0 -1
  603. package/dist/core/error-recovery.integration.test.d.ts +0 -2
  604. package/dist/core/error-recovery.integration.test.d.ts.map +0 -1
  605. package/dist/core/error-recovery.integration.test.js +0 -288
  606. package/dist/core/error-recovery.integration.test.js.map +0 -1
  607. package/dist/core/event-sourcing.integration.test.d.ts +0 -2
  608. package/dist/core/event-sourcing.integration.test.d.ts.map +0 -1
  609. package/dist/core/event-sourcing.integration.test.js +0 -154
  610. package/dist/core/event-sourcing.integration.test.js.map +0 -1
  611. package/dist/core/events/file.test.d.ts +0 -2
  612. package/dist/core/events/file.test.d.ts.map +0 -1
  613. package/dist/core/events/file.test.js +0 -284
  614. package/dist/core/events/file.test.js.map +0 -1
  615. package/dist/core/events/memory.test.d.ts +0 -2
  616. package/dist/core/events/memory.test.d.ts.map +0 -1
  617. package/dist/core/events/memory.test.js +0 -502
  618. package/dist/core/events/memory.test.js.map +0 -1
  619. package/dist/core/image/image-processor.test.d.ts +0 -2
  620. package/dist/core/image/image-processor.test.d.ts.map +0 -1
  621. package/dist/core/image/image-processor.test.js +0 -171
  622. package/dist/core/image/image-processor.test.js.map +0 -1
  623. package/dist/core/image/vips-resizer.test.d.ts +0 -2
  624. package/dist/core/image/vips-resizer.test.d.ts.map +0 -1
  625. package/dist/core/image/vips-resizer.test.js +0 -336
  626. package/dist/core/image/vips-resizer.test.js.map +0 -1
  627. package/dist/core/llm/anthropic.test.d.ts +0 -2
  628. package/dist/core/llm/anthropic.test.d.ts.map +0 -1
  629. package/dist/core/llm/anthropic.test.js +0 -464
  630. package/dist/core/llm/anthropic.test.js.map +0 -1
  631. package/dist/core/llm/cache-breakpoints.test.d.ts +0 -2
  632. package/dist/core/llm/cache-breakpoints.test.d.ts.map +0 -1
  633. package/dist/core/llm/cache-breakpoints.test.js +0 -69
  634. package/dist/core/llm/cache-breakpoints.test.js.map +0 -1
  635. package/dist/core/llm/cache-live.test.d.ts +0 -16
  636. package/dist/core/llm/cache-live.test.d.ts.map +0 -1
  637. package/dist/core/llm/cache-live.test.js +0 -137
  638. package/dist/core/llm/cache-live.test.js.map +0 -1
  639. package/dist/core/llm/logger.test.d.ts +0 -7
  640. package/dist/core/llm/logger.test.d.ts.map +0 -1
  641. package/dist/core/llm/logger.test.js +0 -228
  642. package/dist/core/llm/logger.test.js.map +0 -1
  643. package/dist/core/llm/message-sanitization.test.d.ts +0 -2
  644. package/dist/core/llm/message-sanitization.test.d.ts.map +0 -1
  645. package/dist/core/llm/message-sanitization.test.js +0 -181
  646. package/dist/core/llm/message-sanitization.test.js.map +0 -1
  647. package/dist/core/llm/mock.test.d.ts +0 -2
  648. package/dist/core/llm/mock.test.d.ts.map +0 -1
  649. package/dist/core/llm/mock.test.js +0 -318
  650. package/dist/core/llm/mock.test.js.map +0 -1
  651. package/dist/core/llm/model-shortlist-live.test.d.ts +0 -35
  652. package/dist/core/llm/model-shortlist-live.test.d.ts.map +0 -1
  653. package/dist/core/llm/model-shortlist-live.test.js +0 -452
  654. package/dist/core/llm/model-shortlist-live.test.js.map +0 -1
  655. package/dist/core/llm/openrouter-mapping.test.d.ts +0 -2
  656. package/dist/core/llm/openrouter-mapping.test.d.ts.map +0 -1
  657. package/dist/core/llm/openrouter-mapping.test.js +0 -190
  658. package/dist/core/llm/openrouter-mapping.test.js.map +0 -1
  659. package/dist/core/llm/openrouter.test.d.ts +0 -2
  660. package/dist/core/llm/openrouter.test.d.ts.map +0 -1
  661. package/dist/core/llm/openrouter.test.js +0 -377
  662. package/dist/core/llm/openrouter.test.js.map +0 -1
  663. package/dist/core/llm/provider-integration.test.d.ts +0 -12
  664. package/dist/core/llm/provider-integration.test.d.ts.map +0 -1
  665. package/dist/core/llm/provider-integration.test.js +0 -350
  666. package/dist/core/llm/provider-integration.test.js.map +0 -1
  667. package/dist/core/llm/reasoning-details.test.d.ts +0 -2
  668. package/dist/core/llm/reasoning-details.test.d.ts.map +0 -1
  669. package/dist/core/llm/reasoning-details.test.js +0 -144
  670. package/dist/core/llm/reasoning-details.test.js.map +0 -1
  671. package/dist/core/llm/routing-provider.test.d.ts +0 -2
  672. package/dist/core/llm/routing-provider.test.d.ts.map +0 -1
  673. package/dist/core/llm/routing-provider.test.js +0 -94
  674. package/dist/core/llm/routing-provider.test.js.map +0 -1
  675. package/dist/core/llm/snapshot-middleware.test.d.ts +0 -2
  676. package/dist/core/llm/snapshot-middleware.test.d.ts.map +0 -1
  677. package/dist/core/llm/snapshot-middleware.test.js +0 -144
  678. package/dist/core/llm/snapshot-middleware.test.js.map +0 -1
  679. package/dist/core/llm/thinking-blocks.test.d.ts +0 -2
  680. package/dist/core/llm/thinking-blocks.test.d.ts.map +0 -1
  681. package/dist/core/llm/thinking-blocks.test.js +0 -291
  682. package/dist/core/llm/thinking-blocks.test.js.map +0 -1
  683. package/dist/core/multi-agent.integration.test.d.ts +0 -2
  684. package/dist/core/multi-agent.integration.test.d.ts.map +0 -1
  685. package/dist/core/multi-agent.integration.test.js +0 -298
  686. package/dist/core/multi-agent.integration.test.js.map +0 -1
  687. package/dist/core/plugin-hooks.integration.test.d.ts +0 -2
  688. package/dist/core/plugin-hooks.integration.test.d.ts.map +0 -1
  689. package/dist/core/plugin-hooks.integration.test.js +0 -458
  690. package/dist/core/plugin-hooks.integration.test.js.map +0 -1
  691. package/dist/core/reasoning-round-trip.integration.test.d.ts +0 -2
  692. package/dist/core/reasoning-round-trip.integration.test.d.ts.map +0 -1
  693. package/dist/core/reasoning-round-trip.integration.test.js +0 -150
  694. package/dist/core/reasoning-round-trip.integration.test.js.map +0 -1
  695. package/dist/core/session-lifecycle.integration.test.d.ts +0 -2
  696. package/dist/core/session-lifecycle.integration.test.d.ts.map +0 -1
  697. package/dist/core/session-lifecycle.integration.test.js +0 -159
  698. package/dist/core/session-lifecycle.integration.test.js.map +0 -1
  699. package/dist/core/sessions/fork-utils.test.d.ts +0 -2
  700. package/dist/core/sessions/fork-utils.test.d.ts.map +0 -1
  701. package/dist/core/sessions/fork-utils.test.js +0 -129
  702. package/dist/core/sessions/fork-utils.test.js.map +0 -1
  703. package/dist/core/sessions/session-overrides.integration.test.d.ts +0 -2
  704. package/dist/core/sessions/session-overrides.integration.test.d.ts.map +0 -1
  705. package/dist/core/sessions/session-overrides.integration.test.js +0 -154
  706. package/dist/core/sessions/session-overrides.integration.test.js.map +0 -1
  707. package/dist/core/sessions/session.test.d.ts +0 -2
  708. package/dist/core/sessions/session.test.d.ts.map +0 -1
  709. package/dist/core/sessions/session.test.js +0 -1100
  710. package/dist/core/sessions/session.test.js.map +0 -1
  711. package/dist/core/tools/executor.test.d.ts +0 -2
  712. package/dist/core/tools/executor.test.d.ts.map +0 -1
  713. package/dist/core/tools/executor.test.js +0 -144
  714. package/dist/core/tools/executor.test.js.map +0 -1
  715. package/dist/lib/logger/console.test.d.ts +0 -2
  716. package/dist/lib/logger/console.test.d.ts.map +0 -1
  717. package/dist/lib/logger/console.test.js +0 -258
  718. package/dist/lib/logger/console.test.js.map +0 -1
  719. package/dist/lib/never.d.ts +0 -2
  720. package/dist/lib/never.d.ts.map +0 -1
  721. package/dist/lib/never.js +0 -4
  722. package/dist/lib/never.js.map +0 -1
  723. package/dist/lib/utils/concurrency.test.d.ts +0 -2
  724. package/dist/lib/utils/concurrency.test.d.ts.map +0 -1
  725. package/dist/lib/utils/concurrency.test.js +0 -135
  726. package/dist/lib/utils/concurrency.test.js.map +0 -1
  727. package/dist/plugins/agent-status/agent-status.test.d.ts +0 -2
  728. package/dist/plugins/agent-status/agent-status.test.d.ts.map +0 -1
  729. package/dist/plugins/agent-status/agent-status.test.js +0 -136
  730. package/dist/plugins/agent-status/agent-status.test.js.map +0 -1
  731. package/dist/plugins/agents/agents.integration.test.d.ts +0 -2
  732. package/dist/plugins/agents/agents.integration.test.d.ts.map +0 -1
  733. package/dist/plugins/agents/agents.integration.test.js +0 -830
  734. package/dist/plugins/agents/agents.integration.test.js.map +0 -1
  735. package/dist/plugins/agents/supervision.integration.test.d.ts +0 -2
  736. package/dist/plugins/agents/supervision.integration.test.d.ts.map +0 -1
  737. package/dist/plugins/agents/supervision.integration.test.js +0 -215
  738. package/dist/plugins/agents/supervision.integration.test.js.map +0 -1
  739. package/dist/plugins/context-compact/compaction-live.test.d.ts +0 -17
  740. package/dist/plugins/context-compact/compaction-live.test.d.ts.map +0 -1
  741. package/dist/plugins/context-compact/compaction-live.test.js +0 -177
  742. package/dist/plugins/context-compact/compaction-live.test.js.map +0 -1
  743. package/dist/plugins/context-compact/context-compact.integration.test.d.ts +0 -2
  744. package/dist/plugins/context-compact/context-compact.integration.test.d.ts.map +0 -1
  745. package/dist/plugins/context-compact/context-compact.integration.test.js +0 -364
  746. package/dist/plugins/context-compact/context-compact.integration.test.js.map +0 -1
  747. package/dist/plugins/context-compact/context-compactor.test.d.ts +0 -2
  748. package/dist/plugins/context-compact/context-compactor.test.d.ts.map +0 -1
  749. package/dist/plugins/context-compact/context-compactor.test.js +0 -858
  750. package/dist/plugins/context-compact/context-compactor.test.js.map +0 -1
  751. package/dist/plugins/context-compact/history-offloader.test.d.ts +0 -2
  752. package/dist/plugins/context-compact/history-offloader.test.d.ts.map +0 -1
  753. package/dist/plugins/context-compact/history-offloader.test.js +0 -77
  754. package/dist/plugins/context-compact/history-offloader.test.js.map +0 -1
  755. package/dist/plugins/filesystem/filesystem.integration.test.d.ts +0 -2
  756. package/dist/plugins/filesystem/filesystem.integration.test.d.ts.map +0 -1
  757. package/dist/plugins/filesystem/filesystem.integration.test.js +0 -447
  758. package/dist/plugins/filesystem/filesystem.integration.test.js.map +0 -1
  759. package/dist/plugins/filesystem/schema.d.ts +0 -7
  760. package/dist/plugins/filesystem/schema.d.ts.map +0 -1
  761. package/dist/plugins/filesystem/schema.js +0 -2
  762. package/dist/plugins/filesystem/schema.js.map +0 -1
  763. package/dist/plugins/limits-guard/limit-guard.test.d.ts +0 -2
  764. package/dist/plugins/limits-guard/limit-guard.test.d.ts.map +0 -1
  765. package/dist/plugins/limits-guard/limit-guard.test.js +0 -194
  766. package/dist/plugins/limits-guard/limit-guard.test.js.map +0 -1
  767. package/dist/plugins/limits-guard/limits-guard.integration.test.d.ts +0 -2
  768. package/dist/plugins/limits-guard/limits-guard.integration.test.d.ts.map +0 -1
  769. package/dist/plugins/limits-guard/limits-guard.integration.test.js +0 -887
  770. package/dist/plugins/limits-guard/limits-guard.integration.test.js.map +0 -1
  771. package/dist/plugins/llm-debug/llm-debug.integration.test.d.ts +0 -2
  772. package/dist/plugins/llm-debug/llm-debug.integration.test.d.ts.map +0 -1
  773. package/dist/plugins/llm-debug/llm-debug.integration.test.js +0 -157
  774. package/dist/plugins/llm-debug/llm-debug.integration.test.js.map +0 -1
  775. package/dist/plugins/mailbox/mailbox.integration.test.d.ts +0 -2
  776. package/dist/plugins/mailbox/mailbox.integration.test.d.ts.map +0 -1
  777. package/dist/plugins/mailbox/mailbox.integration.test.js +0 -678
  778. package/dist/plugins/mailbox/mailbox.integration.test.js.map +0 -1
  779. package/dist/plugins/resources/resources.integration.test.d.ts +0 -2
  780. package/dist/plugins/resources/resources.integration.test.d.ts.map +0 -1
  781. package/dist/plugins/resources/resources.integration.test.js +0 -62
  782. package/dist/plugins/resources/resources.integration.test.js.map +0 -1
  783. package/dist/plugins/result-eviction/result-eviction.integration.test.d.ts +0 -2
  784. package/dist/plugins/result-eviction/result-eviction.integration.test.d.ts.map +0 -1
  785. package/dist/plugins/result-eviction/result-eviction.integration.test.js +0 -294
  786. package/dist/plugins/result-eviction/result-eviction.integration.test.js.map +0 -1
  787. package/dist/plugins/services/pid-registry.test.d.ts +0 -2
  788. package/dist/plugins/services/pid-registry.test.d.ts.map +0 -1
  789. package/dist/plugins/services/pid-registry.test.js +0 -161
  790. package/dist/plugins/services/pid-registry.test.js.map +0 -1
  791. package/dist/plugins/services/services.integration.test.d.ts +0 -2
  792. package/dist/plugins/services/services.integration.test.d.ts.map +0 -1
  793. package/dist/plugins/services/services.integration.test.js +0 -1057
  794. package/dist/plugins/services/services.integration.test.js.map +0 -1
  795. package/dist/plugins/session-lifecycle/session-lifecycle.integration.test.d.ts +0 -2
  796. package/dist/plugins/session-lifecycle/session-lifecycle.integration.test.d.ts.map +0 -1
  797. package/dist/plugins/session-lifecycle/session-lifecycle.integration.test.js +0 -498
  798. package/dist/plugins/session-lifecycle/session-lifecycle.integration.test.js.map +0 -1
  799. package/dist/plugins/session-stats/plugin.test.d.ts +0 -2
  800. package/dist/plugins/session-stats/plugin.test.d.ts.map +0 -1
  801. package/dist/plugins/session-stats/plugin.test.js +0 -145
  802. package/dist/plugins/session-stats/plugin.test.js.map +0 -1
  803. package/dist/plugins/shell/shell.integration.test.d.ts +0 -2
  804. package/dist/plugins/shell/shell.integration.test.d.ts.map +0 -1
  805. package/dist/plugins/shell/shell.integration.test.js +0 -234
  806. package/dist/plugins/shell/shell.integration.test.js.map +0 -1
  807. package/dist/plugins/shell/shell.test.d.ts +0 -2
  808. package/dist/plugins/shell/shell.test.d.ts.map +0 -1
  809. package/dist/plugins/shell/shell.test.js +0 -236
  810. package/dist/plugins/shell/shell.test.js.map +0 -1
  811. package/dist/plugins/skills/discovery.test.d.ts +0 -2
  812. package/dist/plugins/skills/discovery.test.d.ts.map +0 -1
  813. package/dist/plugins/skills/discovery.test.js +0 -312
  814. package/dist/plugins/skills/discovery.test.js.map +0 -1
  815. package/dist/plugins/skills/skills.integration.test.d.ts +0 -2
  816. package/dist/plugins/skills/skills.integration.test.d.ts.map +0 -1
  817. package/dist/plugins/skills/skills.integration.test.js +0 -475
  818. package/dist/plugins/skills/skills.integration.test.js.map +0 -1
  819. package/dist/plugins/todo/todo.integration.test.d.ts +0 -2
  820. package/dist/plugins/todo/todo.integration.test.d.ts.map +0 -1
  821. package/dist/plugins/todo/todo.integration.test.js +0 -605
  822. package/dist/plugins/todo/todo.integration.test.js.map +0 -1
  823. package/dist/plugins/uploads/preprocessors/image-classifier.test.d.ts +0 -2
  824. package/dist/plugins/uploads/preprocessors/image-classifier.test.d.ts.map +0 -1
  825. package/dist/plugins/uploads/preprocessors/image-classifier.test.js +0 -113
  826. package/dist/plugins/uploads/preprocessors/image-classifier.test.js.map +0 -1
  827. package/dist/plugins/uploads/uploads.integration.test.d.ts +0 -2
  828. package/dist/plugins/uploads/uploads.integration.test.d.ts.map +0 -1
  829. package/dist/plugins/uploads/uploads.integration.test.js +0 -639
  830. package/dist/plugins/uploads/uploads.integration.test.js.map +0 -1
  831. package/dist/plugins/user-chat/user-chat.integration.test.d.ts +0 -2
  832. package/dist/plugins/user-chat/user-chat.integration.test.d.ts.map +0 -1
  833. package/dist/plugins/user-chat/user-chat.integration.test.js +0 -754
  834. package/dist/plugins/user-chat/user-chat.integration.test.js.map +0 -1
  835. package/dist/plugins/workers/workers.integration.test.d.ts +0 -2
  836. package/dist/plugins/workers/workers.integration.test.d.ts.map +0 -1
  837. package/dist/plugins/workers/workers.integration.test.js +0 -629
  838. package/dist/plugins/workers/workers.integration.test.js.map +0 -1
  839. package/dist/prompts/macros.test.d.ts +0 -2
  840. package/dist/prompts/macros.test.d.ts.map +0 -1
  841. package/dist/prompts/macros.test.js +0 -80
  842. package/dist/prompts/macros.test.js.map +0 -1
  843. package/dist/testing/test-harness.test.d.ts +0 -2
  844. package/dist/testing/test-harness.test.d.ts.map +0 -1
  845. package/dist/testing/test-harness.test.js +0 -92
  846. package/dist/testing/test-harness.test.js.map +0 -1
  847. package/dist/transport/http/routes/rpc.integration.test.d.ts +0 -2
  848. package/dist/transport/http/routes/rpc.integration.test.d.ts.map +0 -1
  849. package/dist/transport/http/routes/rpc.integration.test.js +0 -189
  850. package/dist/transport/http/routes/rpc.integration.test.js.map +0 -1
  851. package/dist/transport/http/routes/rpc.test.d.ts +0 -2
  852. package/dist/transport/http/routes/rpc.test.d.ts.map +0 -1
  853. package/dist/transport/http/routes/rpc.test.js +0 -316
  854. package/dist/transport/http/routes/rpc.test.js.map +0 -1
  855. package/src/config.test.ts +0 -174
  856. package/src/core/agent-loop.integration.test.ts +0 -503
  857. package/src/core/agents/agent-config.test.ts +0 -240
  858. package/src/core/agents/agent-shutdown.test.ts +0 -236
  859. package/src/core/agents/agent.test.ts +0 -387
  860. package/src/core/agents/communicator.ts +0 -16
  861. package/src/core/agents/handler-events.test.ts +0 -167
  862. package/src/core/agents/response-sanitizer.test.ts +0 -137
  863. package/src/core/error-recovery.integration.test.ts +0 -343
  864. package/src/core/event-sourcing.integration.test.ts +0 -191
  865. package/src/core/events/file.test.ts +0 -436
  866. package/src/core/events/memory.test.ts +0 -741
  867. package/src/core/image/image-processor.test.ts +0 -218
  868. package/src/core/image/vips-resizer.test.ts +0 -388
  869. package/src/core/llm/anthropic.test.ts +0 -546
  870. package/src/core/llm/cache-breakpoints.test.ts +0 -85
  871. package/src/core/llm/cache-live.test.ts +0 -155
  872. package/src/core/llm/logger.test.ts +0 -270
  873. package/src/core/llm/message-sanitization.test.ts +0 -217
  874. package/src/core/llm/mock.test.ts +0 -402
  875. package/src/core/llm/model-shortlist-live.test.ts +0 -577
  876. package/src/core/llm/openrouter-mapping.test.ts +0 -234
  877. package/src/core/llm/openrouter.test.ts +0 -499
  878. package/src/core/llm/provider-integration.test.ts +0 -408
  879. package/src/core/llm/reasoning-details.test.ts +0 -177
  880. package/src/core/llm/routing-provider.test.ts +0 -113
  881. package/src/core/llm/snapshot-middleware.test.ts +0 -168
  882. package/src/core/llm/thinking-blocks.test.ts +0 -345
  883. package/src/core/multi-agent.integration.test.ts +0 -340
  884. package/src/core/plugin-hooks.integration.test.ts +0 -568
  885. package/src/core/reasoning-round-trip.integration.test.ts +0 -188
  886. package/src/core/session-lifecycle.integration.test.ts +0 -202
  887. package/src/core/sessions/fork-utils.test.ts +0 -158
  888. package/src/core/sessions/session-overrides.integration.test.ts +0 -210
  889. package/src/core/sessions/session.test.ts +0 -1736
  890. package/src/core/tools/executor.test.ts +0 -161
  891. package/src/lib/logger/console.test.ts +0 -348
  892. package/src/lib/never.ts +0 -3
  893. package/src/lib/utils/concurrency.test.ts +0 -169
  894. package/src/plugins/agent-status/agent-status.test.ts +0 -164
  895. package/src/plugins/agents/agents.integration.test.ts +0 -976
  896. package/src/plugins/agents/supervision.integration.test.ts +0 -249
  897. package/src/plugins/context-compact/compaction-live.test.ts +0 -221
  898. package/src/plugins/context-compact/context-compact.integration.test.ts +0 -418
  899. package/src/plugins/context-compact/context-compactor.test.ts +0 -1036
  900. package/src/plugins/context-compact/history-offloader.test.ts +0 -100
  901. package/src/plugins/filesystem/filesystem.integration.test.ts +0 -529
  902. package/src/plugins/filesystem/schema.ts +0 -6
  903. package/src/plugins/limits-guard/limit-guard.test.ts +0 -253
  904. package/src/plugins/limits-guard/limits-guard.integration.test.ts +0 -1012
  905. package/src/plugins/llm-debug/llm-debug.integration.test.ts +0 -192
  906. package/src/plugins/mailbox/mailbox.integration.test.ts +0 -794
  907. package/src/plugins/resources/resources.integration.test.ts +0 -68
  908. package/src/plugins/result-eviction/result-eviction.integration.test.ts +0 -332
  909. package/src/plugins/services/pid-registry.test.ts +0 -180
  910. package/src/plugins/services/services.integration.test.ts +0 -1223
  911. package/src/plugins/session-lifecycle/session-lifecycle.integration.test.ts +0 -639
  912. package/src/plugins/session-stats/plugin.test.ts +0 -160
  913. package/src/plugins/shell/shell.integration.test.ts +0 -273
  914. package/src/plugins/shell/shell.test.ts +0 -314
  915. package/src/plugins/skills/discovery.test.ts +0 -395
  916. package/src/plugins/skills/skills.integration.test.ts +0 -580
  917. package/src/plugins/todo/todo.integration.test.ts +0 -687
  918. package/src/plugins/uploads/preprocessors/image-classifier.test.ts +0 -142
  919. package/src/plugins/uploads/uploads.integration.test.ts +0 -831
  920. package/src/plugins/user-chat/user-chat.integration.test.ts +0 -893
  921. package/src/plugins/workers/workers.integration.test.ts +0 -778
  922. package/src/prompts/macros.test.ts +0 -107
  923. package/src/testing/test-harness.test.ts +0 -114
  924. package/src/transport/http/routes/rpc.integration.test.ts +0 -243
  925. package/src/transport/http/routes/rpc.test.ts +0 -372
@@ -16,6 +16,7 @@ import { ValidationErrors } from "~/core/errors.js";
16
16
  import { createEventsFactory } from "~/core/events/types.js";
17
17
  import { estimateTokens, truncateByTokens } from "~/core/llm/tokens.js";
18
18
  import { definePlugin } from "~/core/plugins/plugin-builder.js";
19
+ import { selectPluginState } from "~/core/sessions/reducer.js";
19
20
  import { sessionIdSchema } from "~/core/sessions/schema.js";
20
21
  import { getEntryAgentId } from "~/core/sessions/state.js";
21
22
  import { createTool } from "~/core/tools/definition.js";
@@ -67,6 +68,7 @@ export const userChatEvents = createEventsFactory({
67
68
  user_chat_messages_consumed: z.object({
68
69
  agentId: agentIdSchema,
69
70
  messageIds: z.array(chatMessageIdSchema),
71
+ ordinals: z.array(z.number().int().positive()).optional(),
70
72
  }),
71
73
  },
72
74
  });
@@ -124,15 +126,18 @@ export type ChatMessage =
124
126
  // ============================================================================
125
127
 
126
128
  export interface PendingInboundMessage {
129
+ ordinal: number;
127
130
  messageId: ChatMessageId;
128
131
  agentId: AgentId;
129
- content: string;
130
- timestamp: number;
131
- consumed: boolean;
132
+ /** Stable index into visible message history for user messages. */
133
+ messageIndex?: number;
132
134
  /** For answers: the question's message ID */
133
135
  questionId?: ChatMessageId;
134
- /** The answer value, only present for answers */
135
- answerValue?: unknown;
136
+ }
137
+
138
+ export interface PendingAnswerRecord {
139
+ questionId: ChatMessageId;
140
+ answerValue: unknown;
136
141
  }
137
142
 
138
143
  // ============================================================================
@@ -143,6 +148,14 @@ export interface UserChatState {
143
148
  messages: ChatMessage[];
144
149
  counter: number;
145
150
  pendingInbound: PendingInboundMessage[];
151
+ /** Immutable answer payloads retained only until dequeue consumption. */
152
+ pendingAnswers?: Map<number, PendingAnswerRecord>;
153
+ /** Highest reducer-assigned inbound occurrence. */
154
+ nextInboundOrdinal?: number;
155
+ }
156
+
157
+ interface UserChatPluginContext {
158
+ nextMessageSequence: number;
146
159
  }
147
160
 
148
161
  // ============================================================================
@@ -293,18 +306,84 @@ const MESSAGE_TRUNCATION_TARGET = 5_000;
293
306
  // Helpers
294
307
  // ============================================================================
295
308
 
309
+ function findQuestion(
310
+ messages: ChatMessage[],
311
+ questionId: ChatMessageId,
312
+ ): AskUserChatMessage | undefined {
313
+ for (const message of messages) {
314
+ if (message.type === "ask_user" && message.questionId === questionId) {
315
+ return message;
316
+ }
317
+ }
318
+ return undefined;
319
+ }
320
+
321
+ function findUserMessage(
322
+ messages: ChatMessage[],
323
+ messageId: ChatMessageId,
324
+ ): UserChatMessage | undefined {
325
+ for (const message of messages) {
326
+ if (message.type === "user_message" && message.messageId === messageId) {
327
+ return message;
328
+ }
329
+ }
330
+ return undefined;
331
+ }
332
+
333
+ function messageSequence(messageId: ChatMessageId): number {
334
+ const match = /^m(\d+)$/.exec(messageId);
335
+ return match ? Number(match[1]) : 0;
336
+ }
337
+
338
+ function nextStateCounter(state: UserChatState, messageId: ChatMessageId): number {
339
+ return Math.max(state.counter + 1, messageSequence(messageId));
340
+ }
341
+
342
+ function nextMessageSequence(state: UserChatState | undefined): number {
343
+ if (!state) return 1;
344
+ let highest = state.counter;
345
+ for (const message of state.messages) {
346
+ const messageId = message.type === "ask_user" ? message.questionId : message.messageId;
347
+ highest = Math.max(highest, messageSequence(messageId));
348
+ }
349
+ for (const pending of state.pendingInbound) {
350
+ highest = Math.max(highest, messageSequence(pending.messageId));
351
+ }
352
+ return highest + 1;
353
+ }
354
+
355
+ function reserveMessageSequence(context: UserChatPluginContext): number {
356
+ const sequence = context.nextMessageSequence;
357
+ context.nextMessageSequence++;
358
+ return sequence;
359
+ }
360
+
296
361
  /**
297
362
  * Format pending inbound messages for the LLM.
298
363
  */
299
- function formatPendingForLLM(pending: PendingInboundMessage[]): string {
364
+ function formatPendingForLLM(
365
+ messages: ChatMessage[],
366
+ pending: PendingInboundMessage[],
367
+ pendingAnswers: ReadonlyMap<number, PendingAnswerRecord> | undefined,
368
+ ): string {
300
369
  const parts: string[] = [];
301
370
  for (const msg of pending) {
302
371
  if (msg.questionId !== undefined) {
372
+ const answer = pendingAnswers?.get(msg.ordinal);
373
+ const answerValue = answer
374
+ ? answer.answerValue
375
+ : findQuestion(messages, msg.questionId)?.answer;
303
376
  parts.push(
304
- `[User answered question ${msg.questionId}]: ${JSON.stringify(msg.answerValue)}`,
377
+ `[User answered question ${msg.questionId}]: ${JSON.stringify(answerValue)}`,
305
378
  );
306
379
  } else {
307
- parts.push(`[User]: ${msg.content}`);
380
+ const indexedMessage = msg.messageIndex === undefined
381
+ ? undefined
382
+ : messages[msg.messageIndex];
383
+ const userMessage = indexedMessage?.type === "user_message"
384
+ ? indexedMessage
385
+ : findUserMessage(messages, msg.messageId);
386
+ if (userMessage) parts.push(`[User]: ${userMessage.content}`);
308
387
  }
309
388
  }
310
389
  return parts.join("\n");
@@ -365,18 +444,27 @@ function decodeAskUserDisplayStrings(input: AskUserInputType): AskUserInputType
365
444
  // ============================================================================
366
445
 
367
446
  export const userChatPlugin = definePlugin("user-chat")
447
+ .order(60)
368
448
  .pluginConfig<UserChatPresetConfig>()
369
449
  .events([userChatEvents])
450
+ .context(async (ctx): Promise<UserChatPluginContext> => ({
451
+ nextMessageSequence: nextMessageSequence(
452
+ selectPluginState<UserChatState>(ctx.sessionState, "messages"),
453
+ ),
454
+ }))
370
455
  .state<UserChatState>({
371
456
  key: "messages",
372
457
  initial: (): UserChatState => ({
373
458
  messages: [],
374
459
  counter: 0,
375
460
  pendingInbound: [],
461
+ pendingAnswers: new Map(),
462
+ nextInboundOrdinal: 0,
376
463
  }),
377
464
  reduce: (state, event) => {
378
465
  switch (event.type) {
379
466
  case "user_chat_message_received": {
467
+ const ordinal = (state.nextInboundOrdinal ?? 0) + 1;
380
468
  const userMessage: UserChatMessage = {
381
469
  type: "user_message",
382
470
  messageId: event.messageId,
@@ -384,20 +472,22 @@ export const userChatPlugin = definePlugin("user-chat")
384
472
  timestamp: event.timestamp,
385
473
  };
386
474
  const pending: PendingInboundMessage = {
475
+ ordinal,
387
476
  messageId: event.messageId,
388
477
  agentId: event.agentId,
389
- content: event.content,
390
- timestamp: event.timestamp,
391
- consumed: false,
478
+ messageIndex: state.messages.length,
392
479
  };
393
480
  return {
394
481
  messages: [...state.messages, userMessage],
395
- counter: state.counter + 1,
482
+ counter: nextStateCounter(state, event.messageId),
396
483
  pendingInbound: [...state.pendingInbound, pending],
484
+ pendingAnswers: state.pendingAnswers,
485
+ nextInboundOrdinal: ordinal,
397
486
  };
398
487
  }
399
488
 
400
489
  case "user_chat_answer_received": {
490
+ const ordinal = (state.nextInboundOrdinal ?? 0) + 1;
401
491
  // Update the question in messages as answered
402
492
  const updatedMessages = state.messages.map((msg) =>
403
493
  msg.type === "ask_user" && msg.questionId === event.questionId
@@ -405,31 +495,61 @@ export const userChatPlugin = definePlugin("user-chat")
405
495
  : msg,
406
496
  );
407
497
  const pending: PendingInboundMessage = {
498
+ ordinal,
408
499
  messageId: event.messageId,
409
500
  agentId: event.agentId,
410
- content: JSON.stringify(event.answerValue),
411
- timestamp: event.timestamp,
412
- consumed: false,
413
501
  questionId: event.questionId,
414
- answerValue: event.answerValue,
415
502
  };
503
+ const pendingAnswers = new Map(state.pendingAnswers ?? []);
504
+ pendingAnswers.set(ordinal, {
505
+ questionId: event.questionId,
506
+ answerValue: event.answerValue,
507
+ });
416
508
  return {
417
509
  messages: updatedMessages,
418
- counter: state.counter + 1,
510
+ counter: nextStateCounter(state, event.messageId),
419
511
  pendingInbound: [...state.pendingInbound, pending],
512
+ pendingAnswers,
513
+ nextInboundOrdinal: ordinal,
420
514
  };
421
515
  }
422
516
 
423
517
  case "user_chat_messages_consumed": {
424
- const consumedSet = new Set(event.messageIds.map(String));
518
+ const consumedOrdinals = new Set<number>();
519
+ if (event.ordinals) {
520
+ for (const ordinal of event.ordinals) consumedOrdinals.add(ordinal);
521
+ } else {
522
+ const remainingById = new Map<string, number>();
523
+ for (const messageId of event.messageIds) {
524
+ const key = String(messageId);
525
+ remainingById.set(key, (remainingById.get(key) ?? 0) + 1);
526
+ }
527
+ for (const pending of state.pendingInbound) {
528
+ if (pending.agentId !== event.agentId) continue;
529
+ const key = String(pending.messageId);
530
+ const remaining = remainingById.get(key) ?? 0;
531
+ if (remaining === 0) continue;
532
+ consumedOrdinals.add(pending.ordinal);
533
+ remainingById.set(key, remaining - 1);
534
+ }
535
+ }
536
+ const pendingAnswers = new Map(state.pendingAnswers ?? []);
537
+ for (const pending of state.pendingInbound) {
538
+ if (
539
+ pending.agentId === event.agentId &&
540
+ consumedOrdinals.has(pending.ordinal)
541
+ ) {
542
+ pendingAnswers.delete(pending.ordinal);
543
+ }
544
+ }
425
545
  return {
426
546
  ...state,
427
- pendingInbound: state.pendingInbound.map((msg) =>
428
- consumedSet.has(String(msg.messageId)) &&
429
- msg.agentId === event.agentId
430
- ? { ...msg, consumed: true }
431
- : msg,
547
+ pendingInbound: state.pendingInbound.filter(
548
+ (msg) =>
549
+ msg.agentId !== event.agentId ||
550
+ !consumedOrdinals.has(msg.ordinal),
432
551
  ),
552
+ pendingAnswers,
433
553
  };
434
554
  }
435
555
 
@@ -445,7 +565,7 @@ export const userChatPlugin = definePlugin("user-chat")
445
565
  return {
446
566
  ...state,
447
567
  messages: [...state.messages, askMessage],
448
- counter: state.counter + 1,
568
+ counter: nextStateCounter(state, event.messageId),
449
569
  };
450
570
  }
451
571
 
@@ -460,7 +580,7 @@ export const userChatPlugin = definePlugin("user-chat")
460
580
  return {
461
581
  ...state,
462
582
  messages: [...state.messages, agentMessage],
463
- counter: state.counter + 1,
583
+ counter: nextStateCounter(state, event.messageId),
464
584
  };
465
585
  }
466
586
 
@@ -497,7 +617,9 @@ export const userChatPlugin = definePlugin("user-chat")
497
617
  messageId: z.string(),
498
618
  }),
499
619
  handler: async (ctx, input) => {
500
- const messageId = generateChatMessageId(ctx.pluginState.counter + 1);
620
+ const messageId = generateChatMessageId(
621
+ reserveMessageSequence(ctx.pluginContext),
622
+ );
501
623
  const timestamp = Date.now();
502
624
  await ctx.emitEvent(
503
625
  userChatEvents.create("user_question_asked", {
@@ -528,7 +650,9 @@ export const userChatPlugin = definePlugin("user-chat")
528
650
  messageId: z.string(),
529
651
  }),
530
652
  handler: async (ctx, input) => {
531
- const messageId = generateChatMessageId(ctx.pluginState.counter + 1);
653
+ const messageId = generateChatMessageId(
654
+ reserveMessageSequence(ctx.pluginContext),
655
+ );
532
656
  const timestamp = Date.now();
533
657
  await ctx.emitEvent(
534
658
  userChatEvents.create("user_message_sent", {
@@ -572,7 +696,9 @@ export const userChatPlugin = definePlugin("user-chat")
572
696
  );
573
697
  }
574
698
 
575
- const messageId = generateChatMessageId(ctx.pluginState.counter + 1);
699
+ const messageId = generateChatMessageId(
700
+ reserveMessageSequence(ctx.pluginContext),
701
+ );
576
702
 
577
703
  // Soft truncation — save full content to file, pass truncated + reference
578
704
  let content = input.content;
@@ -582,7 +708,18 @@ export const userChatPlugin = definePlugin("user-chat")
582
708
  : null;
583
709
  if (truncation) {
584
710
  const filePath = `.user-messages/${messageId}.md`;
585
- await ctx.files.session.write(filePath, input.content);
711
+ const writeResult = await ctx.files.session.write(
712
+ filePath,
713
+ input.content,
714
+ );
715
+ if (!writeResult.ok) {
716
+ // Without the full copy on disk the truncated message would silently lose content.
717
+ return Err(
718
+ ValidationErrors.invalid(
719
+ `Failed to store full message: ${writeResult.error}`,
720
+ ),
721
+ );
722
+ }
586
723
  content = `${truncation.content}\n\n[Full message saved to: ${filePath} — use read_file to access it]`;
587
724
  }
588
725
 
@@ -606,7 +743,15 @@ export const userChatPlugin = definePlugin("user-chat")
606
743
  }),
607
744
  output: z.object({}),
608
745
  handler: async (ctx, input) => {
609
- const messageId = generateChatMessageId(ctx.pluginState.counter + 1);
746
+ // A retried batch resubmits answers that already landed; the agent must see one.
747
+ const asked = ctx.pluginState.messages.find(
748
+ (msg) => msg.type === "ask_user" && msg.questionId === input.questionId,
749
+ );
750
+ if (asked?.type === "ask_user" && asked.answered) return Ok({});
751
+
752
+ const messageId = generateChatMessageId(
753
+ reserveMessageSequence(ctx.pluginContext),
754
+ );
610
755
  await ctx.emitEvent(
611
756
  userChatEvents.create("user_chat_answer_received", {
612
757
  agentId: input.agentId,
@@ -633,18 +778,28 @@ export const userChatPlugin = definePlugin("user-chat")
633
778
  })
634
779
  .dequeue({
635
780
  hasPendingMessages: (ctx) =>
636
- ctx.pluginState.pendingInbound.some(
637
- (m) => !m.consumed && m.agentId === ctx.agentId,
638
- ),
781
+ ctx.pluginState.pendingInbound.some((m) => m.agentId === ctx.agentId),
639
782
 
640
783
  getPendingMessages: (ctx) => {
641
784
  const pending = ctx.pluginState.pendingInbound.filter(
642
- (m) => !m.consumed && m.agentId === ctx.agentId,
785
+ (m) => m.agentId === ctx.agentId,
643
786
  );
644
787
  if (pending.length === 0) return null;
645
788
  return {
646
- messages: [{ role: "user", content: formatPendingForLLM(pending) }],
647
- token: pending.map((m) => m.messageId),
789
+ messages: [
790
+ {
791
+ role: "user",
792
+ content: formatPendingForLLM(
793
+ ctx.pluginState.messages,
794
+ pending,
795
+ ctx.pluginState.pendingAnswers,
796
+ ),
797
+ },
798
+ ],
799
+ token: pending.map((message) => ({
800
+ messageId: message.messageId,
801
+ ordinal: message.ordinal,
802
+ })),
648
803
  };
649
804
  },
650
805
 
@@ -652,7 +807,8 @@ export const userChatPlugin = definePlugin("user-chat")
652
807
  await ctx.emitEvent(
653
808
  userChatEvents.create("user_chat_messages_consumed", {
654
809
  agentId: ctx.agentId,
655
- messageIds: token,
810
+ messageIds: token.map((item) => item.messageId),
811
+ ordinals: token.map((item) => item.ordinal),
656
812
  }),
657
813
  );
658
814
  },
@@ -666,12 +822,12 @@ export const userChatPlugin = definePlugin("user-chat")
666
822
 
667
823
  const userTagRegex = /<user>([\s\S]*?)<\/user>/g;
668
824
  let match: RegExpExecArray | null;
669
- let localCounter = ctx.pluginState.counter;
670
825
  while ((match = userTagRegex.exec(responseContent)) !== null) {
671
826
  const content = match[1].trim();
672
827
  if (!content) continue;
673
- localCounter++;
674
- const chatMessageId = generateChatMessageId(localCounter);
828
+ const chatMessageId = generateChatMessageId(
829
+ reserveMessageSequence(ctx.pluginContext),
830
+ );
675
831
  await ctx.emitEvent(
676
832
  userChatEvents.create("user_message_sent", {
677
833
  agentId: ctx.agentId,
@@ -12,13 +12,12 @@ import type { AgentId } from '~/core/agents/schema.js'
12
12
  import type { FileStore } from '~/core/file-store/types.js'
13
13
  import type { SessionId } from '~/core/sessions/schema.js'
14
14
  import type { SessionState } from '~/core/sessions/state.js'
15
- import { getNextMessageSeq, selectMailboxState } from '~/plugins/mailbox/query.js'
16
15
  import { generateMessageId } from '~/plugins/mailbox/schema.js'
17
16
  import { mailboxEvents } from '~/plugins/mailbox/state.js'
18
17
  import type { Logger } from '../../lib/logger/logger.js'
19
18
  import type { WorkerSubEvent } from './definition.js'
20
- import type { EmitEvent } from './plugin.js'
21
- import { workerEvents } from './plugin.js'
19
+ import type { EmitEvent } from './state.js'
20
+ import { workerEvents } from './state.js'
22
21
  import { WorkerId } from './worker.js'
23
22
 
24
23
  // ============================================================================
@@ -47,6 +46,14 @@ export interface WorkerContext<TState, TSubEvent extends WorkerSubEvent> {
47
46
  /** File store for reading/writing files */
48
47
  readonly files: FileStore
49
48
 
49
+ /**
50
+ * True when `execute()` is re-entered for a worker that already ran — after a
51
+ * runtime rebuild or a `resume`. The state handed to this run is already
52
+ * reconstructed from the event log, so a resumed worker must continue from
53
+ * `getState()` rather than start over.
54
+ */
55
+ readonly resumed: boolean
56
+
50
57
  /**
51
58
  * Get current worker state (reconstructed from events).
52
59
  */
@@ -54,7 +61,10 @@ export interface WorkerContext<TState, TSubEvent extends WorkerSubEvent> {
54
61
 
55
62
  /**
56
63
  * Emit a worker-specific event.
57
- * The event is persisted and applied to state.
64
+ *
65
+ * Applies the event to local state and persists it — but only while this run is
66
+ * live: once the run has been stopped (pause, cancel, session close) the emit is
67
+ * skipped and nothing is persisted.
58
68
  */
59
69
  emit(event: TSubEvent): Promise<void>
60
70
 
@@ -65,8 +75,9 @@ export interface WorkerContext<TState, TSubEvent extends WorkerSubEvent> {
65
75
  shouldContinue(): boolean
66
76
 
67
77
  /**
68
- * Check if worker is paused.
69
- * Workers should pause their work when this returns true.
78
+ * Check if a pause was requested for this worker.
79
+ * A pause also stops execution — `shouldContinue()` goes false and `resume`
80
+ * re-enters `execute()` — so this only tells a pause from a cancellation.
70
81
  */
71
82
  isPaused(): boolean
72
83
 
@@ -102,11 +113,16 @@ export class WorkerContextImpl<TState, TSubEvent extends WorkerSubEvent> impleme
102
113
  readonly agentId: AgentId
103
114
  readonly logger: Logger
104
115
  readonly files: FileStore
116
+ readonly resumed: boolean
105
117
 
106
118
  private readonly workerType: string
107
119
  private readonly emitEvent: EmitEvent
108
120
  private readonly getSessionStateCallback: () => SessionState
109
121
  private readonly reducer: (state: TState, event: TSubEvent) => TState
122
+ private readonly reserveMailboxMessageSequence: () => number
123
+ private readonly acquireEffectLease: () => (() => void) | null
124
+ private readonly inFlightEffects = new Set<Promise<void>>()
125
+ private readonly effectLeases = new Set<() => void>()
110
126
  private localState: TState
111
127
 
112
128
  /**
@@ -115,10 +131,7 @@ export class WorkerContextImpl<TState, TSubEvent extends WorkerSubEvent> impleme
115
131
  */
116
132
  private _cancelled = false
117
133
 
118
- /**
119
- * Local pause flag - provides immediate signal before event is persisted.
120
- * This is set by pause() and checked by isPaused() for fast response.
121
- */
134
+ /** Set by pause() so a winding-down run can tell a pause from a cancellation. */
122
135
  private _paused = false
123
136
 
124
137
  /**
@@ -126,6 +139,7 @@ export class WorkerContextImpl<TState, TSubEvent extends WorkerSubEvent> impleme
126
139
  * Aborted when cancel() is called.
127
140
  */
128
141
  private readonly abortController = new AbortController()
142
+ private active = true
129
143
 
130
144
  private readonly scheduleCallback?: () => void
131
145
 
@@ -137,8 +151,11 @@ export class WorkerContextImpl<TState, TSubEvent extends WorkerSubEvent> impleme
137
151
  files: FileStore
138
152
  emitEvent: EmitEvent
139
153
  getSessionState: () => SessionState
154
+ reserveMailboxMessageSequence: () => number
155
+ acquireEffectLease: () => (() => void) | null
140
156
  reducer: (state: TState, event: TSubEvent) => TState
141
157
  initialState: TState
158
+ resumed: boolean
142
159
  logger: Logger
143
160
  schedule?: () => void
144
161
  }) {
@@ -149,8 +166,11 @@ export class WorkerContextImpl<TState, TSubEvent extends WorkerSubEvent> impleme
149
166
  this.files = params.files
150
167
  this.emitEvent = params.emitEvent
151
168
  this.getSessionStateCallback = params.getSessionState
169
+ this.reserveMailboxMessageSequence = params.reserveMailboxMessageSequence
170
+ this.acquireEffectLease = params.acquireEffectLease
152
171
  this.reducer = params.reducer
153
172
  this.localState = params.initialState
173
+ this.resumed = params.resumed
154
174
  this.logger = params.logger
155
175
  this.scheduleCallback = params.schedule
156
176
  }
@@ -167,12 +187,21 @@ export class WorkerContextImpl<TState, TSubEvent extends WorkerSubEvent> impleme
167
187
  * Applies the event to local state before persisting.
168
188
  */
169
189
  async emit(event: TSubEvent): Promise<void> {
170
- this.localState = this.reducer(this.localState, event)
171
- await this.emitEvent(workerEvents.create('worker_sub_event', {
172
- workerId: this.workerId,
173
- workerType: this.workerType,
174
- subEvent: event,
175
- }))
190
+ await this.runEffect(async () => {
191
+ this.localState = this.reducer(this.localState, event)
192
+ await this.emitEvent(workerEvents.create('worker_sub_event', {
193
+ workerId: this.workerId,
194
+ workerType: this.workerType,
195
+ subEvent: event,
196
+ }))
197
+ })
198
+ }
199
+
200
+ /** Persist a terminal worker event within the context effect lifecycle. */
201
+ async persistTerminal(event: Parameters<EmitEvent>[0]): Promise<boolean> {
202
+ return this.runEffect(async () => {
203
+ await this.emitEvent(event)
204
+ })
176
205
  }
177
206
 
178
207
  /**
@@ -180,7 +209,7 @@ export class WorkerContextImpl<TState, TSubEvent extends WorkerSubEvent> impleme
180
209
  * Returns false if cancelled.
181
210
  */
182
211
  shouldContinue(): boolean {
183
- return !this._cancelled
212
+ return this.active && !this._cancelled
184
213
  }
185
214
 
186
215
  /**
@@ -197,20 +226,24 @@ export class WorkerContextImpl<TState, TSubEvent extends WorkerSubEvent> impleme
197
226
  * as sender, but workers need to send as WorkerId. Migrate when mailbox.send supports WorkerId.
198
227
  */
199
228
  async notifyAgent(message: string): Promise<void> {
200
- const messageId = generateMessageId(getNextMessageSeq(selectMailboxState(this.getSessionStateCallback())))
201
-
202
- await this.emitEvent(mailboxEvents.create('mailbox_message', {
203
- toAgentId: this.agentId,
204
- message: {
205
- id: messageId,
206
- from: this.workerId,
207
- content: message,
208
- timestamp: Date.now(),
209
- consumed: false,
210
- },
211
- }))
212
-
213
- this.scheduleCallback?.()
229
+ await this.runEffect(async () => {
230
+ const sequence = this.reserveMailboxMessageSequence()
231
+ const messageId = generateMessageId(sequence)
232
+
233
+ await this.emitEvent(mailboxEvents.create('mailbox_message', {
234
+ toAgentId: this.agentId,
235
+ sequence,
236
+ message: {
237
+ id: messageId,
238
+ from: this.workerId,
239
+ content: message,
240
+ timestamp: Date.now(),
241
+ consumed: false,
242
+ },
243
+ }))
244
+
245
+ if (this.active) this.scheduleCallback?.()
246
+ })
214
247
  }
215
248
 
216
249
  /**
@@ -235,17 +268,47 @@ export class WorkerContextImpl<TState, TSubEvent extends WorkerSubEvent> impleme
235
268
  this.abortController.abort()
236
269
  }
237
270
 
238
- /**
239
- * Mark worker as paused.
240
- */
241
- pause(): void {
242
- this._paused = true
271
+ /** Permanently disable callbacks — the worker is stopping and will never resume this run. */
272
+ invalidate(): void {
273
+ this.active = false
274
+ this.cancel()
275
+ }
276
+
277
+ /** Wait for effects that started before invalidation. */
278
+ async waitForEffects(): Promise<void> {
279
+ await Promise.allSettled([...this.inFlightEffects])
280
+ }
281
+
282
+ /** Give back the leases of effects that outlived their drain deadline, so a stalled write cannot pin the runtime forever. */
283
+ releaseEffectLeases(): void {
284
+ for (const release of this.effectLeases) release()
285
+ this.effectLeases.clear()
286
+ }
287
+
288
+ private async runEffect(effect: () => Promise<void>): Promise<boolean> {
289
+ if (!this.active) return false
290
+ // The runtime can start unloading between the check above and here — skip the
291
+ // effect rather than throw a lease error into worker code.
292
+ const releaseLease = this.acquireEffectLease()
293
+ if (!releaseLease) return false
294
+ this.effectLeases.add(releaseLease)
295
+ let promise: Promise<void> | undefined
296
+ try {
297
+ promise = effect()
298
+ this.inFlightEffects.add(promise)
299
+ await promise
300
+ } finally {
301
+ if (promise) this.inFlightEffects.delete(promise)
302
+ this.effectLeases.delete(releaseLease)
303
+ releaseLease()
304
+ }
305
+ return true
243
306
  }
244
307
 
245
308
  /**
246
- * Resume worker.
309
+ * Record that this run is stopping because of a pause, not a cancellation.
247
310
  */
248
- resume(): void {
249
- this._paused = false
311
+ pause(): void {
312
+ this._paused = true
250
313
  }
251
314
  }
@@ -101,6 +101,13 @@ export interface WorkerDefinition<
101
101
  /**
102
102
  * Main execution logic.
103
103
  * The worker runs until completion, failure, or cancellation.
104
+ *
105
+ * Re-entrant, and must be idempotent: a rebuilt session runtime and
106
+ * `workers.resume` both call this again from the top, with `context.resumed`
107
+ * true and the state already replayed from the event log. Drive the loop from
108
+ * `context.getState()` and emit the event that records a side effect before
109
+ * performing it — never from local variables seeded at entry, which a re-entry
110
+ * resets while the persisted state moves on.
104
111
  */
105
112
  execute(
106
113
  config: TConfig,
@@ -1,10 +1,10 @@
1
1
  // Plugin
2
- export { workerPlugin } from './plugin.js'
2
+ export { MAX_CONCURRENT_WORKERS, WORKER_EFFECT_DRAIN_TIMEOUT_MS, WORKER_STOP_TIMEOUT_MS, workerPlugin } from './plugin.js'
3
3
  export type { WorkerAgentConfig, WorkerPresetConfig } from './plugin.js'
4
4
 
5
5
  // Events (now in plugin.ts)
6
- export { workerEvents } from './plugin.js'
7
- export type { WorkerCompletedEvent, WorkerFailedEvent, WorkerStartedEvent, WorkerStatusChangedEvent, WorkerSubEventEmittedEvent } from './plugin.js'
6
+ export { workerEvents } from './state.js'
7
+ export type { WorkerCompletedEvent, WorkerFailedEvent, WorkerStartedEvent, WorkerStatusChangedEvent, WorkerSubEventEmittedEvent } from './state.js'
8
8
 
9
9
  // Definition
10
10
  export type { WorkerDefinition, WorkerSubEvent } from './definition.js'
@@ -18,4 +18,4 @@ export { WorkerContextImpl } from './context.js'
18
18
  export type { WorkerError, WorkerResult } from './worker.js'
19
19
 
20
20
  // Types
21
- export type { EmitEvent } from './plugin.js'
21
+ export type { EmitEvent } from './state.js'