@roj-ai/sdk 0.1.36 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (922) hide show
  1. package/dist/bootstrap.d.ts +420 -26
  2. package/dist/bootstrap.d.ts.map +1 -1
  3. package/dist/bootstrap.js +55 -24
  4. package/dist/bootstrap.js.map +1 -1
  5. package/dist/bun-platform/fs.d.ts.map +1 -1
  6. package/dist/bun-platform/fs.js +1 -0
  7. package/dist/bun-platform/fs.js.map +1 -1
  8. package/dist/bun-platform/index.d.ts +4 -1
  9. package/dist/bun-platform/index.d.ts.map +1 -1
  10. package/dist/bun-platform/index.js +7 -1
  11. package/dist/bun-platform/index.js.map +1 -1
  12. package/dist/bun-platform/server-lifecycle.d.ts +30 -0
  13. package/dist/bun-platform/server-lifecycle.d.ts.map +1 -0
  14. package/dist/bun-platform/server-lifecycle.js +182 -0
  15. package/dist/bun-platform/server-lifecycle.js.map +1 -0
  16. package/dist/bun-platform/shell.d.ts +33 -0
  17. package/dist/bun-platform/shell.d.ts.map +1 -0
  18. package/dist/bun-platform/shell.js +322 -0
  19. package/dist/bun-platform/shell.js.map +1 -0
  20. package/dist/config.d.ts +34 -0
  21. package/dist/config.d.ts.map +1 -1
  22. package/dist/config.js +97 -0
  23. package/dist/config.js.map +1 -1
  24. package/dist/core/agents/agent.d.ts +42 -7
  25. package/dist/core/agents/agent.d.ts.map +1 -1
  26. package/dist/core/agents/agent.js +202 -87
  27. package/dist/core/agents/agent.js.map +1 -1
  28. package/dist/core/agents/config.d.ts +8 -1
  29. package/dist/core/agents/config.d.ts.map +1 -1
  30. package/dist/core/agents/config.js +5 -1
  31. package/dist/core/agents/config.js.map +1 -1
  32. package/dist/core/agents/retry.d.ts +1 -1
  33. package/dist/core/agents/retry.d.ts.map +1 -1
  34. package/dist/core/agents/retry.js +14 -16
  35. package/dist/core/agents/retry.js.map +1 -1
  36. package/dist/core/agents/state.d.ts +3 -1
  37. package/dist/core/agents/state.d.ts.map +1 -1
  38. package/dist/core/agents/state.js +1 -1
  39. package/dist/core/agents/state.js.map +1 -1
  40. package/dist/core/context/state.d.ts +3 -3
  41. package/dist/core/context/state.js +2 -2
  42. package/dist/core/events/base-event-store.d.ts.map +1 -1
  43. package/dist/core/events/base-event-store.js +22 -14
  44. package/dist/core/events/base-event-store.js.map +1 -1
  45. package/dist/core/events/file.d.ts +39 -1
  46. package/dist/core/events/file.d.ts.map +1 -1
  47. package/dist/core/events/file.js +159 -20
  48. package/dist/core/events/file.js.map +1 -1
  49. package/dist/core/events/types.d.ts +1 -1
  50. package/dist/core/file-store/containment.d.ts +19 -0
  51. package/dist/core/file-store/containment.d.ts.map +1 -0
  52. package/dist/core/file-store/containment.js +62 -0
  53. package/dist/core/file-store/containment.js.map +1 -0
  54. package/dist/core/file-store/file-store.d.ts +22 -2
  55. package/dist/core/file-store/file-store.d.ts.map +1 -1
  56. package/dist/core/file-store/file-store.js +88 -20
  57. package/dist/core/file-store/file-store.js.map +1 -1
  58. package/dist/core/file-store/types.d.ts +13 -1
  59. package/dist/core/file-store/types.d.ts.map +1 -1
  60. package/dist/core/image/image-processor.d.ts.map +1 -1
  61. package/dist/core/image/image-processor.js +3 -1
  62. package/dist/core/image/image-processor.js.map +1 -1
  63. package/dist/core/image/types.d.ts +2 -0
  64. package/dist/core/image/types.d.ts.map +1 -1
  65. package/dist/core/image/vips-resizer.d.ts.map +1 -1
  66. package/dist/core/image/vips-resizer.js +81 -33
  67. package/dist/core/image/vips-resizer.js.map +1 -1
  68. package/dist/core/llm/anthropic.d.ts +0 -1
  69. package/dist/core/llm/anthropic.d.ts.map +1 -1
  70. package/dist/core/llm/anthropic.js +58 -72
  71. package/dist/core/llm/anthropic.js.map +1 -1
  72. package/dist/core/llm/logger.d.ts +14 -2
  73. package/dist/core/llm/logger.d.ts.map +1 -1
  74. package/dist/core/llm/logger.js +161 -36
  75. package/dist/core/llm/logger.js.map +1 -1
  76. package/dist/core/llm/openrouter.d.ts +0 -1
  77. package/dist/core/llm/openrouter.d.ts.map +1 -1
  78. package/dist/core/llm/openrouter.js +53 -66
  79. package/dist/core/llm/openrouter.js.map +1 -1
  80. package/dist/core/llm/provider-request.d.ts +10 -0
  81. package/dist/core/llm/provider-request.d.ts.map +1 -0
  82. package/dist/core/llm/provider-request.js +41 -0
  83. package/dist/core/llm/provider-request.js.map +1 -0
  84. package/dist/core/llm/provider.d.ts +11 -0
  85. package/dist/core/llm/provider.d.ts.map +1 -1
  86. package/dist/core/llm/provider.js +26 -0
  87. package/dist/core/llm/provider.js.map +1 -1
  88. package/dist/core/llm/state.d.ts +2 -2
  89. package/dist/core/llm/state.js +4 -4
  90. package/dist/core/plugins/plugin-builder.d.ts +57 -3
  91. package/dist/core/plugins/plugin-builder.d.ts.map +1 -1
  92. package/dist/core/plugins/plugin-builder.js +68 -14
  93. package/dist/core/plugins/plugin-builder.js.map +1 -1
  94. package/dist/core/preset/preset-builder.d.ts +3 -2
  95. package/dist/core/preset/preset-builder.d.ts.map +1 -1
  96. package/dist/core/preset/preset-builder.js +7 -16
  97. package/dist/core/preset/preset-builder.js.map +1 -1
  98. package/dist/core/sessions/context.d.ts +23 -5
  99. package/dist/core/sessions/context.d.ts.map +1 -1
  100. package/dist/core/sessions/runtime-activity.d.ts +33 -0
  101. package/dist/core/sessions/runtime-activity.d.ts.map +1 -0
  102. package/dist/core/sessions/runtime-activity.js +55 -0
  103. package/dist/core/sessions/runtime-activity.js.map +1 -0
  104. package/dist/core/sessions/schema.d.ts +23 -2
  105. package/dist/core/sessions/schema.d.ts.map +1 -1
  106. package/dist/core/sessions/schema.js +24 -3
  107. package/dist/core/sessions/schema.js.map +1 -1
  108. package/dist/core/sessions/session-manager.d.ts +83 -6
  109. package/dist/core/sessions/session-manager.d.ts.map +1 -1
  110. package/dist/core/sessions/session-manager.js +517 -118
  111. package/dist/core/sessions/session-manager.js.map +1 -1
  112. package/dist/core/sessions/session-store.d.ts +18 -0
  113. package/dist/core/sessions/session-store.d.ts.map +1 -1
  114. package/dist/core/sessions/session-store.js +33 -0
  115. package/dist/core/sessions/session-store.js.map +1 -1
  116. package/dist/core/sessions/session.d.ts +42 -6
  117. package/dist/core/sessions/session.d.ts.map +1 -1
  118. package/dist/core/sessions/session.js +176 -44
  119. package/dist/core/sessions/session.js.map +1 -1
  120. package/dist/core/sessions/state.d.ts +10 -1
  121. package/dist/core/sessions/state.d.ts.map +1 -1
  122. package/dist/core/sessions/state.js +11 -1
  123. package/dist/core/sessions/state.js.map +1 -1
  124. package/dist/core/system.d.ts +9 -0
  125. package/dist/core/system.d.ts.map +1 -1
  126. package/dist/core/system.js +4 -1
  127. package/dist/core/system.js.map +1 -1
  128. package/dist/core/tools/executor.d.ts +1 -1
  129. package/dist/core/wake-key.d.ts +34 -0
  130. package/dist/core/wake-key.d.ts.map +1 -0
  131. package/dist/core/wake-key.js +51 -0
  132. package/dist/core/wake-key.js.map +1 -0
  133. package/dist/index.d.ts +23 -13
  134. package/dist/index.d.ts.map +1 -1
  135. package/dist/index.js +22 -8
  136. package/dist/index.js.map +1 -1
  137. package/dist/lib/archive/archive-inspection.d.ts +48 -0
  138. package/dist/lib/archive/archive-inspection.d.ts.map +1 -0
  139. package/dist/lib/archive/archive-inspection.fixtures.d.ts +7 -0
  140. package/dist/lib/archive/archive-inspection.fixtures.d.ts.map +1 -0
  141. package/dist/lib/archive/archive-inspection.fixtures.js +134 -0
  142. package/dist/lib/archive/archive-inspection.fixtures.js.map +1 -0
  143. package/dist/lib/archive/archive-inspection.js +253 -0
  144. package/dist/lib/archive/archive-inspection.js.map +1 -0
  145. package/dist/lib/archive/index.d.ts +3 -0
  146. package/dist/lib/archive/index.d.ts.map +1 -0
  147. package/dist/lib/archive/index.js +2 -0
  148. package/dist/lib/archive/index.js.map +1 -0
  149. package/dist/lib/logger/console.d.ts +5 -12
  150. package/dist/lib/logger/console.d.ts.map +1 -1
  151. package/dist/lib/logger/console.js +5 -47
  152. package/dist/lib/logger/console.js.map +1 -1
  153. package/dist/lib/logger/file.d.ts +8 -11
  154. package/dist/lib/logger/file.d.ts.map +1 -1
  155. package/dist/lib/logger/file.js +26 -37
  156. package/dist/lib/logger/file.js.map +1 -1
  157. package/dist/lib/logger/index.d.ts +3 -1
  158. package/dist/lib/logger/index.d.ts.map +1 -1
  159. package/dist/lib/logger/index.js +3 -1
  160. package/dist/lib/logger/index.js.map +1 -1
  161. package/dist/lib/logger/jsonl.d.ts +21 -0
  162. package/dist/lib/logger/jsonl.d.ts.map +1 -0
  163. package/dist/lib/logger/jsonl.js +29 -0
  164. package/dist/lib/logger/jsonl.js.map +1 -0
  165. package/dist/lib/logger/logger.d.ts +22 -0
  166. package/dist/lib/logger/logger.d.ts.map +1 -1
  167. package/dist/lib/logger/logger.js +37 -0
  168. package/dist/lib/logger/logger.js.map +1 -1
  169. package/dist/lib/logger/session-log.d.ts +21 -0
  170. package/dist/lib/logger/session-log.d.ts.map +1 -0
  171. package/dist/lib/logger/session-log.js +37 -0
  172. package/dist/lib/logger/session-log.js.map +1 -0
  173. package/dist/lib/utils/concurrency.d.ts +1 -1
  174. package/dist/lib/utils/concurrency.d.ts.map +1 -1
  175. package/dist/lib/utils/concurrency.js +30 -7
  176. package/dist/lib/utils/concurrency.js.map +1 -1
  177. package/dist/lib/utils/fs-batch.d.ts +17 -0
  178. package/dist/lib/utils/fs-batch.d.ts.map +1 -0
  179. package/dist/lib/utils/fs-batch.js +38 -0
  180. package/dist/lib/utils/fs-batch.js.map +1 -0
  181. package/dist/lib/utils/result.d.ts +7 -22
  182. package/dist/lib/utils/result.d.ts.map +1 -1
  183. package/dist/lib/utils/result.js +6 -17
  184. package/dist/lib/utils/result.js.map +1 -1
  185. package/dist/lib/utils/sleep.d.ts +10 -0
  186. package/dist/lib/utils/sleep.d.ts.map +1 -0
  187. package/dist/lib/utils/sleep.js +26 -0
  188. package/dist/lib/utils/sleep.js.map +1 -0
  189. package/dist/platform/fs-revision.d.ts +21 -0
  190. package/dist/platform/fs-revision.d.ts.map +1 -0
  191. package/dist/platform/fs-revision.js +9 -0
  192. package/dist/platform/fs-revision.js.map +1 -0
  193. package/dist/platform/fs.d.ts +104 -1
  194. package/dist/platform/fs.d.ts.map +1 -1
  195. package/dist/platform/git.d.ts +59 -0
  196. package/dist/platform/git.d.ts.map +1 -0
  197. package/dist/platform/git.js +8 -0
  198. package/dist/platform/git.js.map +1 -0
  199. package/dist/platform/index.d.ts +40 -1
  200. package/dist/platform/index.d.ts.map +1 -1
  201. package/dist/platform/index.js +1 -1
  202. package/dist/platform/index.js.map +1 -1
  203. package/dist/platform/llm-call-log.d.ts +80 -0
  204. package/dist/platform/llm-call-log.d.ts.map +1 -0
  205. package/dist/platform/llm-call-log.js +12 -0
  206. package/dist/platform/llm-call-log.js.map +1 -0
  207. package/dist/platform/scheduler.d.ts +32 -0
  208. package/dist/platform/scheduler.d.ts.map +1 -0
  209. package/dist/platform/scheduler.js +46 -0
  210. package/dist/platform/scheduler.js.map +1 -0
  211. package/dist/platform/session-log.d.ts +36 -0
  212. package/dist/platform/session-log.d.ts.map +1 -0
  213. package/dist/platform/session-log.js +12 -0
  214. package/dist/platform/session-log.js.map +1 -0
  215. package/dist/platform/shell.d.ts +83 -0
  216. package/dist/platform/shell.d.ts.map +1 -0
  217. package/dist/platform/shell.js +13 -0
  218. package/dist/platform/shell.js.map +1 -0
  219. package/dist/plugins/agent-status/plugin.d.ts.map +1 -1
  220. package/dist/plugins/agent-status/plugin.js +1 -0
  221. package/dist/plugins/agent-status/plugin.js.map +1 -1
  222. package/dist/plugins/agents/plugin.d.ts.map +1 -1
  223. package/dist/plugins/agents/plugin.js +129 -62
  224. package/dist/plugins/agents/plugin.js.map +1 -1
  225. package/dist/plugins/filesystem/listing.d.ts +3 -0
  226. package/dist/plugins/filesystem/listing.d.ts.map +1 -1
  227. package/dist/plugins/filesystem/listing.js +66 -10
  228. package/dist/plugins/filesystem/listing.js.map +1 -1
  229. package/dist/plugins/filesystem/plugin.d.ts.map +1 -1
  230. package/dist/plugins/filesystem/plugin.js +8 -6
  231. package/dist/plugins/filesystem/plugin.js.map +1 -1
  232. package/dist/plugins/git-status/plugin.d.ts +34 -7
  233. package/dist/plugins/git-status/plugin.d.ts.map +1 -1
  234. package/dist/plugins/git-status/plugin.js +168 -64
  235. package/dist/plugins/git-status/plugin.js.map +1 -1
  236. package/dist/plugins/llm-debug/plugin.d.ts.map +1 -1
  237. package/dist/plugins/llm-debug/plugin.js +1 -0
  238. package/dist/plugins/llm-debug/plugin.js.map +1 -1
  239. package/dist/plugins/logs/plugin.d.ts +1 -4
  240. package/dist/plugins/logs/plugin.d.ts.map +1 -1
  241. package/dist/plugins/logs/plugin.js +7 -0
  242. package/dist/plugins/logs/plugin.js.map +1 -1
  243. package/dist/plugins/mailbox/helpers.d.ts +2 -2
  244. package/dist/plugins/mailbox/helpers.js +1 -1
  245. package/dist/plugins/mailbox/plugin.d.ts.map +1 -1
  246. package/dist/plugins/mailbox/plugin.js +38 -43
  247. package/dist/plugins/mailbox/plugin.js.map +1 -1
  248. package/dist/plugins/mailbox/query.d.ts +7 -2
  249. package/dist/plugins/mailbox/query.d.ts.map +1 -1
  250. package/dist/plugins/mailbox/query.js +14 -7
  251. package/dist/plugins/mailbox/query.js.map +1 -1
  252. package/dist/plugins/mailbox/state.d.ts +5 -4
  253. package/dist/plugins/mailbox/state.d.ts.map +1 -1
  254. package/dist/plugins/mailbox/state.js +6 -5
  255. package/dist/plugins/mailbox/state.js.map +1 -1
  256. package/dist/plugins/resources/filename.d.ts +4 -0
  257. package/dist/plugins/resources/filename.d.ts.map +1 -0
  258. package/dist/plugins/resources/filename.js +18 -0
  259. package/dist/plugins/resources/filename.js.map +1 -0
  260. package/dist/plugins/resources/plugin.d.ts +3 -0
  261. package/dist/plugins/resources/plugin.d.ts.map +1 -1
  262. package/dist/plugins/resources/plugin.js +97 -60
  263. package/dist/plugins/resources/plugin.js.map +1 -1
  264. package/dist/plugins/resources/state.d.ts +1 -1
  265. package/dist/plugins/resources/state.js +1 -1
  266. package/dist/plugins/result-eviction/plugin.d.ts.map +1 -1
  267. package/dist/plugins/result-eviction/plugin.js +6 -1
  268. package/dist/plugins/result-eviction/plugin.js.map +1 -1
  269. package/dist/plugins/services/plugin.d.ts +4 -1
  270. package/dist/plugins/services/plugin.d.ts.map +1 -1
  271. package/dist/plugins/services/plugin.js +251 -100
  272. package/dist/plugins/services/plugin.js.map +1 -1
  273. package/dist/plugins/services/prompt.d.ts.map +1 -1
  274. package/dist/plugins/services/prompt.js +1 -4
  275. package/dist/plugins/services/prompt.js.map +1 -1
  276. package/dist/plugins/services/schema.d.ts +15 -5
  277. package/dist/plugins/services/schema.d.ts.map +1 -1
  278. package/dist/plugins/services/service.d.ts +100 -18
  279. package/dist/plugins/services/service.d.ts.map +1 -1
  280. package/dist/plugins/services/service.js +680 -230
  281. package/dist/plugins/services/service.js.map +1 -1
  282. package/dist/plugins/session-lifecycle/plugin.d.ts +21 -1
  283. package/dist/plugins/session-lifecycle/plugin.d.ts.map +1 -1
  284. package/dist/plugins/session-lifecycle/plugin.js +53 -40
  285. package/dist/plugins/session-lifecycle/plugin.js.map +1 -1
  286. package/dist/plugins/session-state/plugin.d.ts +21 -13
  287. package/dist/plugins/session-state/plugin.d.ts.map +1 -1
  288. package/dist/plugins/session-state/plugin.js +214 -79
  289. package/dist/plugins/session-state/plugin.js.map +1 -1
  290. package/dist/plugins/session-stats/plugin.d.ts.map +1 -1
  291. package/dist/plugins/session-stats/plugin.js +1 -0
  292. package/dist/plugins/session-stats/plugin.js.map +1 -1
  293. package/dist/plugins/shell/executor.d.ts +17 -15
  294. package/dist/plugins/shell/executor.d.ts.map +1 -1
  295. package/dist/plugins/shell/executor.js +130 -195
  296. package/dist/plugins/shell/executor.js.map +1 -1
  297. package/dist/plugins/shell/index.d.ts +2 -2
  298. package/dist/plugins/shell/index.d.ts.map +1 -1
  299. package/dist/plugins/shell/index.js +2 -2
  300. package/dist/plugins/shell/index.js.map +1 -1
  301. package/dist/plugins/shell/plugin.d.ts +5 -4
  302. package/dist/plugins/shell/plugin.d.ts.map +1 -1
  303. package/dist/plugins/shell/plugin.js +4 -8
  304. package/dist/plugins/shell/plugin.js.map +1 -1
  305. package/dist/plugins/skills/discovery.d.ts.map +1 -1
  306. package/dist/plugins/skills/discovery.js +10 -8
  307. package/dist/plugins/skills/discovery.js.map +1 -1
  308. package/dist/plugins/skills/index.d.ts +1 -1
  309. package/dist/plugins/skills/index.d.ts.map +1 -1
  310. package/dist/plugins/skills/plugin.d.ts +1 -1
  311. package/dist/plugins/skills/plugin.d.ts.map +1 -1
  312. package/dist/plugins/skills/plugin.js +23 -30
  313. package/dist/plugins/skills/plugin.js.map +1 -1
  314. package/dist/plugins/skills/prompts.d.ts +3 -3
  315. package/dist/plugins/skills/prompts.d.ts.map +1 -1
  316. package/dist/plugins/skills/prompts.js.map +1 -1
  317. package/dist/plugins/skills/schema.d.ts +4 -2
  318. package/dist/plugins/skills/schema.d.ts.map +1 -1
  319. package/dist/plugins/todo/schema.d.ts +1 -1
  320. package/dist/plugins/uploads/plugin.d.ts +11 -4
  321. package/dist/plugins/uploads/plugin.d.ts.map +1 -1
  322. package/dist/plugins/uploads/plugin.js +891 -225
  323. package/dist/plugins/uploads/plugin.js.map +1 -1
  324. package/dist/plugins/uploads/preprocessor.d.ts +14 -0
  325. package/dist/plugins/uploads/preprocessor.d.ts.map +1 -1
  326. package/dist/plugins/uploads/preprocessor.js +11 -0
  327. package/dist/plugins/uploads/preprocessor.js.map +1 -1
  328. package/dist/plugins/uploads/preprocessors/image-classifier.d.ts +1 -1
  329. package/dist/plugins/uploads/preprocessors/image-classifier.d.ts.map +1 -1
  330. package/dist/plugins/uploads/preprocessors/image-classifier.js +51 -26
  331. package/dist/plugins/uploads/preprocessors/image-classifier.js.map +1 -1
  332. package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.d.ts +2 -2
  333. package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.d.ts.map +1 -1
  334. package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.js +41 -16
  335. package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.js.map +1 -1
  336. package/dist/plugins/uploads/preprocessors/pdf-preprocessor.d.ts +1 -1
  337. package/dist/plugins/uploads/preprocessors/pdf-preprocessor.d.ts.map +1 -1
  338. package/dist/plugins/uploads/preprocessors/pdf-preprocessor.js +29 -14
  339. package/dist/plugins/uploads/preprocessors/pdf-preprocessor.js.map +1 -1
  340. package/dist/plugins/uploads/preprocessors/zip-preprocessor.d.ts +1 -1
  341. package/dist/plugins/uploads/preprocessors/zip-preprocessor.d.ts.map +1 -1
  342. package/dist/plugins/uploads/preprocessors/zip-preprocessor.js +62 -34
  343. package/dist/plugins/uploads/preprocessors/zip-preprocessor.js.map +1 -1
  344. package/dist/plugins/uploads/schema.d.ts +25 -2
  345. package/dist/plugins/uploads/schema.d.ts.map +1 -1
  346. package/dist/plugins/uploads/schema.js +24 -3
  347. package/dist/plugins/uploads/schema.js.map +1 -1
  348. package/dist/plugins/uploads/state.d.ts +13 -1
  349. package/dist/plugins/uploads/state.d.ts.map +1 -1
  350. package/dist/plugins/uploads/state.js +4 -1
  351. package/dist/plugins/uploads/state.js.map +1 -1
  352. package/dist/plugins/user-chat/plugin.d.ts +12 -5
  353. package/dist/plugins/user-chat/plugin.d.ts.map +1 -1
  354. package/dist/plugins/user-chat/plugin.js +141 -32
  355. package/dist/plugins/user-chat/plugin.js.map +1 -1
  356. package/dist/plugins/workers/context.d.ts +35 -13
  357. package/dist/plugins/workers/context.d.ts.map +1 -1
  358. package/dist/plugins/workers/context.js +82 -32
  359. package/dist/plugins/workers/context.js.map +1 -1
  360. package/dist/plugins/workers/definition.d.ts +7 -0
  361. package/dist/plugins/workers/definition.d.ts.map +1 -1
  362. package/dist/plugins/workers/definition.js.map +1 -1
  363. package/dist/plugins/workers/index.d.ts +4 -4
  364. package/dist/plugins/workers/index.d.ts.map +1 -1
  365. package/dist/plugins/workers/index.js +2 -2
  366. package/dist/plugins/workers/index.js.map +1 -1
  367. package/dist/plugins/workers/plugin.d.ts +10 -57
  368. package/dist/plugins/workers/plugin.d.ts.map +1 -1
  369. package/dist/plugins/workers/plugin.js +385 -123
  370. package/dist/plugins/workers/plugin.js.map +1 -1
  371. package/dist/plugins/workers/state.d.ts +69 -0
  372. package/dist/plugins/workers/state.d.ts.map +1 -0
  373. package/dist/plugins/workers/state.js +52 -0
  374. package/dist/plugins/workers/state.js.map +1 -0
  375. package/dist/plugins/workers/worker.d.ts +15 -4
  376. package/dist/plugins/workers/worker.d.ts.map +1 -1
  377. package/dist/testing/conformance.d.ts +106 -0
  378. package/dist/testing/conformance.d.ts.map +1 -0
  379. package/dist/testing/conformance.js +1463 -0
  380. package/dist/testing/conformance.js.map +1 -0
  381. package/dist/testing/node-platform.d.ts.map +1 -1
  382. package/dist/testing/node-platform.js +5 -0
  383. package/dist/testing/node-platform.js.map +1 -1
  384. package/dist/testing/test-harness.d.ts +11 -1
  385. package/dist/testing/test-harness.d.ts.map +1 -1
  386. package/dist/testing/test-harness.js +17 -37
  387. package/dist/testing/test-harness.js.map +1 -1
  388. package/dist/testing/wait-helpers.d.ts.map +1 -1
  389. package/dist/testing/wait-helpers.js +1 -3
  390. package/dist/testing/wait-helpers.js.map +1 -1
  391. package/dist/transport/adapter/client-adapter.d.ts +6 -0
  392. package/dist/transport/adapter/client-adapter.d.ts.map +1 -1
  393. package/dist/transport/adapter/client-adapter.js +50 -3
  394. package/dist/transport/adapter/client-adapter.js.map +1 -1
  395. package/dist/transport/adapter/heartbeat.d.ts +16 -0
  396. package/dist/transport/adapter/heartbeat.d.ts.map +1 -0
  397. package/dist/transport/adapter/heartbeat.js +41 -0
  398. package/dist/transport/adapter/heartbeat.js.map +1 -0
  399. package/dist/transport/adapter/server-adapter.d.ts.map +1 -1
  400. package/dist/transport/adapter/server-adapter.js +6 -0
  401. package/dist/transport/adapter/server-adapter.js.map +1 -1
  402. package/dist/transport/http/app.d.ts +3 -30
  403. package/dist/transport/http/app.d.ts.map +1 -1
  404. package/dist/transport/http/app.js +3 -7
  405. package/dist/transport/http/app.js.map +1 -1
  406. package/dist/transport/http/context.d.ts +40 -0
  407. package/dist/transport/http/context.d.ts.map +1 -0
  408. package/dist/transport/http/context.js +17 -0
  409. package/dist/transport/http/context.js.map +1 -0
  410. package/dist/transport/http/fetch-guard.d.ts +49 -0
  411. package/dist/transport/http/fetch-guard.d.ts.map +1 -0
  412. package/dist/transport/http/fetch-guard.js +312 -0
  413. package/dist/transport/http/fetch-guard.js.map +1 -0
  414. package/dist/transport/http/index.d.ts +1 -1
  415. package/dist/transport/http/index.d.ts.map +1 -1
  416. package/dist/transport/http/middleware/bearer-auth.d.ts +1 -1
  417. package/dist/transport/http/middleware/bearer-auth.d.ts.map +1 -1
  418. package/dist/transport/http/middleware/error-handler.d.ts +2 -2
  419. package/dist/transport/http/middleware/error-handler.d.ts.map +1 -1
  420. package/dist/transport/http/path-containment.d.ts +20 -0
  421. package/dist/transport/http/path-containment.d.ts.map +1 -0
  422. package/dist/transport/http/path-containment.js +31 -0
  423. package/dist/transport/http/path-containment.js.map +1 -0
  424. package/dist/transport/http/responses.d.ts +30 -0
  425. package/dist/transport/http/responses.d.ts.map +1 -0
  426. package/dist/transport/http/responses.js +5 -0
  427. package/dist/transport/http/responses.js.map +1 -0
  428. package/dist/transport/http/routes/files.d.ts +1 -1
  429. package/dist/transport/http/routes/files.d.ts.map +1 -1
  430. package/dist/transport/http/routes/files.js +54 -155
  431. package/dist/transport/http/routes/files.js.map +1 -1
  432. package/dist/transport/http/routes/resources.d.ts +1 -1
  433. package/dist/transport/http/routes/resources.d.ts.map +1 -1
  434. package/dist/transport/http/routes/resources.js +92 -57
  435. package/dist/transport/http/routes/resources.js.map +1 -1
  436. package/dist/transport/http/routes/rpc.d.ts +6 -1
  437. package/dist/transport/http/routes/rpc.d.ts.map +1 -1
  438. package/dist/transport/http/routes/rpc.js +51 -21
  439. package/dist/transport/http/routes/rpc.js.map +1 -1
  440. package/dist/transport/http/routes/upload.d.ts +1 -1
  441. package/dist/transport/http/routes/upload.d.ts.map +1 -1
  442. package/dist/transport/http/routes/upload.js +256 -169
  443. package/dist/transport/http/routes/upload.js.map +1 -1
  444. package/dist/user-config.d.ts +34 -7
  445. package/dist/user-config.d.ts.map +1 -1
  446. package/dist/user-config.js +71 -0
  447. package/dist/user-config.js.map +1 -1
  448. package/package.json +17 -7
  449. package/src/bootstrap.ts +119 -35
  450. package/src/bun-platform/fs.ts +1 -0
  451. package/src/bun-platform/index.ts +18 -1
  452. package/src/bun-platform/server-lifecycle.ts +218 -0
  453. package/src/bun-platform/shell.ts +362 -0
  454. package/src/config.ts +130 -0
  455. package/src/core/agents/agent.ts +210 -92
  456. package/src/core/agents/config.ts +8 -0
  457. package/src/core/agents/retry.ts +16 -17
  458. package/src/core/agents/state.ts +2 -0
  459. package/src/core/events/base-event-store.ts +24 -16
  460. package/src/core/events/file.ts +198 -22
  461. package/src/core/file-store/containment.ts +75 -0
  462. package/src/core/file-store/file-store.ts +106 -25
  463. package/src/core/file-store/types.ts +14 -1
  464. package/src/core/image/image-processor.ts +3 -1
  465. package/src/core/image/types.ts +2 -0
  466. package/src/core/image/vips-resizer.ts +102 -37
  467. package/src/core/llm/anthropic.ts +63 -79
  468. package/src/core/llm/logger.ts +175 -37
  469. package/src/core/llm/openrouter.ts +57 -72
  470. package/src/core/llm/provider-request.ts +40 -0
  471. package/src/core/llm/provider.ts +28 -0
  472. package/src/core/plugins/plugin-builder.ts +106 -14
  473. package/src/core/preset/preset-builder.ts +12 -22
  474. package/src/core/sessions/context.ts +18 -0
  475. package/src/core/sessions/runtime-activity.ts +78 -0
  476. package/src/core/sessions/schema.ts +29 -3
  477. package/src/core/sessions/session-manager.ts +560 -140
  478. package/src/core/sessions/session-store.ts +38 -0
  479. package/src/core/sessions/session.ts +187 -47
  480. package/src/core/sessions/state.ts +11 -0
  481. package/src/core/system.ts +15 -0
  482. package/src/core/wake-key.ts +65 -0
  483. package/src/index.ts +30 -12
  484. package/src/lib/archive/archive-inspection.fixtures.ts +138 -0
  485. package/src/lib/archive/archive-inspection.ts +359 -0
  486. package/src/lib/archive/index.ts +17 -0
  487. package/src/lib/logger/console.ts +7 -57
  488. package/src/lib/logger/file.ts +28 -50
  489. package/src/lib/logger/index.ts +3 -1
  490. package/src/lib/logger/jsonl.ts +36 -0
  491. package/src/lib/logger/logger.ts +48 -0
  492. package/src/lib/logger/session-log.ts +42 -0
  493. package/src/lib/utils/concurrency.ts +37 -8
  494. package/src/lib/utils/fs-batch.ts +49 -0
  495. package/src/lib/utils/result.ts +7 -31
  496. package/src/lib/utils/sleep.ts +23 -0
  497. package/src/platform/fs-revision.ts +21 -0
  498. package/src/platform/fs.ts +109 -1
  499. package/src/platform/git.ts +67 -0
  500. package/src/platform/index.ts +51 -1
  501. package/src/platform/llm-call-log.ts +86 -0
  502. package/src/platform/scheduler.ts +71 -0
  503. package/src/platform/session-log.ts +39 -0
  504. package/src/platform/shell.ts +89 -0
  505. package/src/plugins/agent-status/plugin.ts +1 -0
  506. package/src/plugins/agents/plugin.ts +134 -81
  507. package/src/plugins/filesystem/listing.ts +70 -12
  508. package/src/plugins/filesystem/plugin.ts +8 -6
  509. package/src/plugins/git-status/plugin.ts +204 -77
  510. package/src/plugins/llm-debug/plugin.ts +1 -0
  511. package/src/plugins/logs/plugin.ts +9 -0
  512. package/src/plugins/mailbox/plugin.ts +46 -64
  513. package/src/plugins/mailbox/query.ts +15 -7
  514. package/src/plugins/mailbox/state.ts +1 -0
  515. package/src/plugins/resources/filename.ts +19 -0
  516. package/src/plugins/resources/plugin.ts +111 -59
  517. package/src/plugins/result-eviction/plugin.ts +6 -1
  518. package/src/plugins/services/plugin.ts +254 -98
  519. package/src/plugins/services/prompt.ts +1 -6
  520. package/src/plugins/services/schema.ts +17 -3
  521. package/src/plugins/services/service.ts +702 -252
  522. package/src/plugins/session-lifecycle/plugin.ts +56 -41
  523. package/src/plugins/session-state/plugin.ts +242 -88
  524. package/src/plugins/session-stats/plugin.ts +1 -0
  525. package/src/plugins/shell/executor.ts +144 -226
  526. package/src/plugins/shell/index.ts +1 -4
  527. package/src/plugins/shell/plugin.ts +7 -9
  528. package/src/plugins/skills/discovery.ts +10 -8
  529. package/src/plugins/skills/index.ts +1 -1
  530. package/src/plugins/skills/plugin.ts +19 -27
  531. package/src/plugins/skills/prompts.ts +3 -3
  532. package/src/plugins/skills/schema.ts +5 -2
  533. package/src/plugins/uploads/plugin.ts +991 -273
  534. package/src/plugins/uploads/preprocessor.ts +25 -0
  535. package/src/plugins/uploads/preprocessors/image-classifier.ts +56 -25
  536. package/src/plugins/uploads/preprocessors/markitdown-preprocessor.ts +41 -15
  537. package/src/plugins/uploads/preprocessors/pdf-preprocessor.ts +32 -16
  538. package/src/plugins/uploads/preprocessors/zip-preprocessor.ts +67 -38
  539. package/src/plugins/uploads/schema.ts +30 -3
  540. package/src/plugins/uploads/state.ts +12 -0
  541. package/src/plugins/user-chat/plugin.ts +196 -40
  542. package/src/plugins/workers/context.ts +102 -39
  543. package/src/plugins/workers/definition.ts +7 -0
  544. package/src/plugins/workers/index.ts +4 -4
  545. package/src/plugins/workers/plugin.ts +461 -151
  546. package/src/plugins/workers/state.ts +64 -0
  547. package/src/plugins/workers/worker.ts +15 -4
  548. package/src/testing/conformance.ts +1751 -0
  549. package/src/testing/node-platform.ts +5 -0
  550. package/src/testing/test-harness.ts +21 -38
  551. package/src/testing/wait-helpers.ts +1 -4
  552. package/src/transport/adapter/client-adapter.ts +60 -3
  553. package/src/transport/adapter/heartbeat.ts +50 -0
  554. package/src/transport/adapter/server-adapter.ts +6 -0
  555. package/src/transport/http/app.ts +7 -35
  556. package/src/transport/http/context.ts +46 -0
  557. package/src/transport/http/fetch-guard.ts +318 -0
  558. package/src/transport/http/index.ts +1 -1
  559. package/src/transport/http/middleware/bearer-auth.ts +1 -1
  560. package/src/transport/http/middleware/error-handler.ts +1 -1
  561. package/src/transport/http/path-containment.ts +44 -0
  562. package/src/transport/http/responses.ts +20 -0
  563. package/src/transport/http/routes/files.ts +69 -159
  564. package/src/transport/http/routes/resources.ts +124 -93
  565. package/src/transport/http/routes/rpc.ts +63 -26
  566. package/src/transport/http/routes/upload.ts +327 -258
  567. package/src/user-config.ts +93 -7
  568. package/dist/config.test.d.ts +0 -2
  569. package/dist/config.test.d.ts.map +0 -1
  570. package/dist/config.test.js +0 -155
  571. package/dist/config.test.js.map +0 -1
  572. package/dist/core/agent-loop.integration.test.d.ts +0 -2
  573. package/dist/core/agent-loop.integration.test.d.ts.map +0 -1
  574. package/dist/core/agent-loop.integration.test.js +0 -414
  575. package/dist/core/agent-loop.integration.test.js.map +0 -1
  576. package/dist/core/agents/agent-config.test.d.ts +0 -2
  577. package/dist/core/agents/agent-config.test.d.ts.map +0 -1
  578. package/dist/core/agents/agent-config.test.js +0 -194
  579. package/dist/core/agents/agent-config.test.js.map +0 -1
  580. package/dist/core/agents/agent-shutdown.test.d.ts +0 -6
  581. package/dist/core/agents/agent-shutdown.test.d.ts.map +0 -1
  582. package/dist/core/agents/agent-shutdown.test.js +0 -180
  583. package/dist/core/agents/agent-shutdown.test.js.map +0 -1
  584. package/dist/core/agents/agent.test.d.ts +0 -2
  585. package/dist/core/agents/agent.test.d.ts.map +0 -1
  586. package/dist/core/agents/agent.test.js +0 -313
  587. package/dist/core/agents/agent.test.js.map +0 -1
  588. package/dist/core/agents/communicator.d.ts +0 -3
  589. package/dist/core/agents/communicator.d.ts.map +0 -1
  590. package/dist/core/agents/communicator.js +0 -13
  591. package/dist/core/agents/communicator.js.map +0 -1
  592. package/dist/core/agents/handler-events.test.d.ts +0 -5
  593. package/dist/core/agents/handler-events.test.d.ts.map +0 -1
  594. package/dist/core/agents/handler-events.test.js +0 -115
  595. package/dist/core/agents/handler-events.test.js.map +0 -1
  596. package/dist/core/agents/response-sanitizer.test.d.ts +0 -2
  597. package/dist/core/agents/response-sanitizer.test.d.ts.map +0 -1
  598. package/dist/core/agents/response-sanitizer.test.js +0 -101
  599. package/dist/core/agents/response-sanitizer.test.js.map +0 -1
  600. package/dist/core/error-recovery.integration.test.d.ts +0 -2
  601. package/dist/core/error-recovery.integration.test.d.ts.map +0 -1
  602. package/dist/core/error-recovery.integration.test.js +0 -288
  603. package/dist/core/error-recovery.integration.test.js.map +0 -1
  604. package/dist/core/event-sourcing.integration.test.d.ts +0 -2
  605. package/dist/core/event-sourcing.integration.test.d.ts.map +0 -1
  606. package/dist/core/event-sourcing.integration.test.js +0 -154
  607. package/dist/core/event-sourcing.integration.test.js.map +0 -1
  608. package/dist/core/events/file.test.d.ts +0 -2
  609. package/dist/core/events/file.test.d.ts.map +0 -1
  610. package/dist/core/events/file.test.js +0 -284
  611. package/dist/core/events/file.test.js.map +0 -1
  612. package/dist/core/events/memory.test.d.ts +0 -2
  613. package/dist/core/events/memory.test.d.ts.map +0 -1
  614. package/dist/core/events/memory.test.js +0 -502
  615. package/dist/core/events/memory.test.js.map +0 -1
  616. package/dist/core/image/image-processor.test.d.ts +0 -2
  617. package/dist/core/image/image-processor.test.d.ts.map +0 -1
  618. package/dist/core/image/image-processor.test.js +0 -171
  619. package/dist/core/image/image-processor.test.js.map +0 -1
  620. package/dist/core/image/vips-resizer.test.d.ts +0 -2
  621. package/dist/core/image/vips-resizer.test.d.ts.map +0 -1
  622. package/dist/core/image/vips-resizer.test.js +0 -336
  623. package/dist/core/image/vips-resizer.test.js.map +0 -1
  624. package/dist/core/llm/anthropic.test.d.ts +0 -2
  625. package/dist/core/llm/anthropic.test.d.ts.map +0 -1
  626. package/dist/core/llm/anthropic.test.js +0 -464
  627. package/dist/core/llm/anthropic.test.js.map +0 -1
  628. package/dist/core/llm/cache-breakpoints.test.d.ts +0 -2
  629. package/dist/core/llm/cache-breakpoints.test.d.ts.map +0 -1
  630. package/dist/core/llm/cache-breakpoints.test.js +0 -69
  631. package/dist/core/llm/cache-breakpoints.test.js.map +0 -1
  632. package/dist/core/llm/cache-live.test.d.ts +0 -16
  633. package/dist/core/llm/cache-live.test.d.ts.map +0 -1
  634. package/dist/core/llm/cache-live.test.js +0 -137
  635. package/dist/core/llm/cache-live.test.js.map +0 -1
  636. package/dist/core/llm/logger.test.d.ts +0 -7
  637. package/dist/core/llm/logger.test.d.ts.map +0 -1
  638. package/dist/core/llm/logger.test.js +0 -228
  639. package/dist/core/llm/logger.test.js.map +0 -1
  640. package/dist/core/llm/message-sanitization.test.d.ts +0 -2
  641. package/dist/core/llm/message-sanitization.test.d.ts.map +0 -1
  642. package/dist/core/llm/message-sanitization.test.js +0 -181
  643. package/dist/core/llm/message-sanitization.test.js.map +0 -1
  644. package/dist/core/llm/mock.test.d.ts +0 -2
  645. package/dist/core/llm/mock.test.d.ts.map +0 -1
  646. package/dist/core/llm/mock.test.js +0 -318
  647. package/dist/core/llm/mock.test.js.map +0 -1
  648. package/dist/core/llm/model-shortlist-live.test.d.ts +0 -35
  649. package/dist/core/llm/model-shortlist-live.test.d.ts.map +0 -1
  650. package/dist/core/llm/model-shortlist-live.test.js +0 -452
  651. package/dist/core/llm/model-shortlist-live.test.js.map +0 -1
  652. package/dist/core/llm/openrouter-mapping.test.d.ts +0 -2
  653. package/dist/core/llm/openrouter-mapping.test.d.ts.map +0 -1
  654. package/dist/core/llm/openrouter-mapping.test.js +0 -190
  655. package/dist/core/llm/openrouter-mapping.test.js.map +0 -1
  656. package/dist/core/llm/openrouter.test.d.ts +0 -2
  657. package/dist/core/llm/openrouter.test.d.ts.map +0 -1
  658. package/dist/core/llm/openrouter.test.js +0 -377
  659. package/dist/core/llm/openrouter.test.js.map +0 -1
  660. package/dist/core/llm/provider-integration.test.d.ts +0 -12
  661. package/dist/core/llm/provider-integration.test.d.ts.map +0 -1
  662. package/dist/core/llm/provider-integration.test.js +0 -350
  663. package/dist/core/llm/provider-integration.test.js.map +0 -1
  664. package/dist/core/llm/reasoning-details.test.d.ts +0 -2
  665. package/dist/core/llm/reasoning-details.test.d.ts.map +0 -1
  666. package/dist/core/llm/reasoning-details.test.js +0 -144
  667. package/dist/core/llm/reasoning-details.test.js.map +0 -1
  668. package/dist/core/llm/routing-provider.test.d.ts +0 -2
  669. package/dist/core/llm/routing-provider.test.d.ts.map +0 -1
  670. package/dist/core/llm/routing-provider.test.js +0 -94
  671. package/dist/core/llm/routing-provider.test.js.map +0 -1
  672. package/dist/core/llm/snapshot-middleware.test.d.ts +0 -2
  673. package/dist/core/llm/snapshot-middleware.test.d.ts.map +0 -1
  674. package/dist/core/llm/snapshot-middleware.test.js +0 -144
  675. package/dist/core/llm/snapshot-middleware.test.js.map +0 -1
  676. package/dist/core/llm/thinking-blocks.test.d.ts +0 -2
  677. package/dist/core/llm/thinking-blocks.test.d.ts.map +0 -1
  678. package/dist/core/llm/thinking-blocks.test.js +0 -291
  679. package/dist/core/llm/thinking-blocks.test.js.map +0 -1
  680. package/dist/core/multi-agent.integration.test.d.ts +0 -2
  681. package/dist/core/multi-agent.integration.test.d.ts.map +0 -1
  682. package/dist/core/multi-agent.integration.test.js +0 -298
  683. package/dist/core/multi-agent.integration.test.js.map +0 -1
  684. package/dist/core/plugin-hooks.integration.test.d.ts +0 -2
  685. package/dist/core/plugin-hooks.integration.test.d.ts.map +0 -1
  686. package/dist/core/plugin-hooks.integration.test.js +0 -458
  687. package/dist/core/plugin-hooks.integration.test.js.map +0 -1
  688. package/dist/core/reasoning-round-trip.integration.test.d.ts +0 -2
  689. package/dist/core/reasoning-round-trip.integration.test.d.ts.map +0 -1
  690. package/dist/core/reasoning-round-trip.integration.test.js +0 -150
  691. package/dist/core/reasoning-round-trip.integration.test.js.map +0 -1
  692. package/dist/core/session-lifecycle.integration.test.d.ts +0 -2
  693. package/dist/core/session-lifecycle.integration.test.d.ts.map +0 -1
  694. package/dist/core/session-lifecycle.integration.test.js +0 -159
  695. package/dist/core/session-lifecycle.integration.test.js.map +0 -1
  696. package/dist/core/sessions/fork-utils.test.d.ts +0 -2
  697. package/dist/core/sessions/fork-utils.test.d.ts.map +0 -1
  698. package/dist/core/sessions/fork-utils.test.js +0 -129
  699. package/dist/core/sessions/fork-utils.test.js.map +0 -1
  700. package/dist/core/sessions/session-overrides.integration.test.d.ts +0 -2
  701. package/dist/core/sessions/session-overrides.integration.test.d.ts.map +0 -1
  702. package/dist/core/sessions/session-overrides.integration.test.js +0 -154
  703. package/dist/core/sessions/session-overrides.integration.test.js.map +0 -1
  704. package/dist/core/sessions/session.test.d.ts +0 -2
  705. package/dist/core/sessions/session.test.d.ts.map +0 -1
  706. package/dist/core/sessions/session.test.js +0 -1100
  707. package/dist/core/sessions/session.test.js.map +0 -1
  708. package/dist/core/tools/executor.test.d.ts +0 -2
  709. package/dist/core/tools/executor.test.d.ts.map +0 -1
  710. package/dist/core/tools/executor.test.js +0 -144
  711. package/dist/core/tools/executor.test.js.map +0 -1
  712. package/dist/lib/logger/console.test.d.ts +0 -2
  713. package/dist/lib/logger/console.test.d.ts.map +0 -1
  714. package/dist/lib/logger/console.test.js +0 -258
  715. package/dist/lib/logger/console.test.js.map +0 -1
  716. package/dist/lib/never.d.ts +0 -2
  717. package/dist/lib/never.d.ts.map +0 -1
  718. package/dist/lib/never.js +0 -4
  719. package/dist/lib/never.js.map +0 -1
  720. package/dist/lib/utils/concurrency.test.d.ts +0 -2
  721. package/dist/lib/utils/concurrency.test.d.ts.map +0 -1
  722. package/dist/lib/utils/concurrency.test.js +0 -135
  723. package/dist/lib/utils/concurrency.test.js.map +0 -1
  724. package/dist/plugins/agent-status/agent-status.test.d.ts +0 -2
  725. package/dist/plugins/agent-status/agent-status.test.d.ts.map +0 -1
  726. package/dist/plugins/agent-status/agent-status.test.js +0 -136
  727. package/dist/plugins/agent-status/agent-status.test.js.map +0 -1
  728. package/dist/plugins/agents/agents.integration.test.d.ts +0 -2
  729. package/dist/plugins/agents/agents.integration.test.d.ts.map +0 -1
  730. package/dist/plugins/agents/agents.integration.test.js +0 -830
  731. package/dist/plugins/agents/agents.integration.test.js.map +0 -1
  732. package/dist/plugins/agents/supervision.integration.test.d.ts +0 -2
  733. package/dist/plugins/agents/supervision.integration.test.d.ts.map +0 -1
  734. package/dist/plugins/agents/supervision.integration.test.js +0 -215
  735. package/dist/plugins/agents/supervision.integration.test.js.map +0 -1
  736. package/dist/plugins/context-compact/compaction-live.test.d.ts +0 -17
  737. package/dist/plugins/context-compact/compaction-live.test.d.ts.map +0 -1
  738. package/dist/plugins/context-compact/compaction-live.test.js +0 -177
  739. package/dist/plugins/context-compact/compaction-live.test.js.map +0 -1
  740. package/dist/plugins/context-compact/context-compact.integration.test.d.ts +0 -2
  741. package/dist/plugins/context-compact/context-compact.integration.test.d.ts.map +0 -1
  742. package/dist/plugins/context-compact/context-compact.integration.test.js +0 -364
  743. package/dist/plugins/context-compact/context-compact.integration.test.js.map +0 -1
  744. package/dist/plugins/context-compact/context-compactor.test.d.ts +0 -2
  745. package/dist/plugins/context-compact/context-compactor.test.d.ts.map +0 -1
  746. package/dist/plugins/context-compact/context-compactor.test.js +0 -858
  747. package/dist/plugins/context-compact/context-compactor.test.js.map +0 -1
  748. package/dist/plugins/context-compact/history-offloader.test.d.ts +0 -2
  749. package/dist/plugins/context-compact/history-offloader.test.d.ts.map +0 -1
  750. package/dist/plugins/context-compact/history-offloader.test.js +0 -77
  751. package/dist/plugins/context-compact/history-offloader.test.js.map +0 -1
  752. package/dist/plugins/filesystem/filesystem.integration.test.d.ts +0 -2
  753. package/dist/plugins/filesystem/filesystem.integration.test.d.ts.map +0 -1
  754. package/dist/plugins/filesystem/filesystem.integration.test.js +0 -447
  755. package/dist/plugins/filesystem/filesystem.integration.test.js.map +0 -1
  756. package/dist/plugins/filesystem/schema.d.ts +0 -7
  757. package/dist/plugins/filesystem/schema.d.ts.map +0 -1
  758. package/dist/plugins/filesystem/schema.js +0 -2
  759. package/dist/plugins/filesystem/schema.js.map +0 -1
  760. package/dist/plugins/limits-guard/limit-guard.test.d.ts +0 -2
  761. package/dist/plugins/limits-guard/limit-guard.test.d.ts.map +0 -1
  762. package/dist/plugins/limits-guard/limit-guard.test.js +0 -194
  763. package/dist/plugins/limits-guard/limit-guard.test.js.map +0 -1
  764. package/dist/plugins/limits-guard/limits-guard.integration.test.d.ts +0 -2
  765. package/dist/plugins/limits-guard/limits-guard.integration.test.d.ts.map +0 -1
  766. package/dist/plugins/limits-guard/limits-guard.integration.test.js +0 -887
  767. package/dist/plugins/limits-guard/limits-guard.integration.test.js.map +0 -1
  768. package/dist/plugins/llm-debug/llm-debug.integration.test.d.ts +0 -2
  769. package/dist/plugins/llm-debug/llm-debug.integration.test.d.ts.map +0 -1
  770. package/dist/plugins/llm-debug/llm-debug.integration.test.js +0 -157
  771. package/dist/plugins/llm-debug/llm-debug.integration.test.js.map +0 -1
  772. package/dist/plugins/mailbox/mailbox.integration.test.d.ts +0 -2
  773. package/dist/plugins/mailbox/mailbox.integration.test.d.ts.map +0 -1
  774. package/dist/plugins/mailbox/mailbox.integration.test.js +0 -678
  775. package/dist/plugins/mailbox/mailbox.integration.test.js.map +0 -1
  776. package/dist/plugins/resources/resources.integration.test.d.ts +0 -2
  777. package/dist/plugins/resources/resources.integration.test.d.ts.map +0 -1
  778. package/dist/plugins/resources/resources.integration.test.js +0 -62
  779. package/dist/plugins/resources/resources.integration.test.js.map +0 -1
  780. package/dist/plugins/result-eviction/result-eviction.integration.test.d.ts +0 -2
  781. package/dist/plugins/result-eviction/result-eviction.integration.test.d.ts.map +0 -1
  782. package/dist/plugins/result-eviction/result-eviction.integration.test.js +0 -294
  783. package/dist/plugins/result-eviction/result-eviction.integration.test.js.map +0 -1
  784. package/dist/plugins/services/pid-registry.test.d.ts +0 -2
  785. package/dist/plugins/services/pid-registry.test.d.ts.map +0 -1
  786. package/dist/plugins/services/pid-registry.test.js +0 -161
  787. package/dist/plugins/services/pid-registry.test.js.map +0 -1
  788. package/dist/plugins/services/services.integration.test.d.ts +0 -2
  789. package/dist/plugins/services/services.integration.test.d.ts.map +0 -1
  790. package/dist/plugins/services/services.integration.test.js +0 -1057
  791. package/dist/plugins/services/services.integration.test.js.map +0 -1
  792. package/dist/plugins/session-lifecycle/session-lifecycle.integration.test.d.ts +0 -2
  793. package/dist/plugins/session-lifecycle/session-lifecycle.integration.test.d.ts.map +0 -1
  794. package/dist/plugins/session-lifecycle/session-lifecycle.integration.test.js +0 -498
  795. package/dist/plugins/session-lifecycle/session-lifecycle.integration.test.js.map +0 -1
  796. package/dist/plugins/session-stats/plugin.test.d.ts +0 -2
  797. package/dist/plugins/session-stats/plugin.test.d.ts.map +0 -1
  798. package/dist/plugins/session-stats/plugin.test.js +0 -145
  799. package/dist/plugins/session-stats/plugin.test.js.map +0 -1
  800. package/dist/plugins/shell/shell.integration.test.d.ts +0 -2
  801. package/dist/plugins/shell/shell.integration.test.d.ts.map +0 -1
  802. package/dist/plugins/shell/shell.integration.test.js +0 -234
  803. package/dist/plugins/shell/shell.integration.test.js.map +0 -1
  804. package/dist/plugins/shell/shell.test.d.ts +0 -2
  805. package/dist/plugins/shell/shell.test.d.ts.map +0 -1
  806. package/dist/plugins/shell/shell.test.js +0 -236
  807. package/dist/plugins/shell/shell.test.js.map +0 -1
  808. package/dist/plugins/skills/discovery.test.d.ts +0 -2
  809. package/dist/plugins/skills/discovery.test.d.ts.map +0 -1
  810. package/dist/plugins/skills/discovery.test.js +0 -312
  811. package/dist/plugins/skills/discovery.test.js.map +0 -1
  812. package/dist/plugins/skills/skills.integration.test.d.ts +0 -2
  813. package/dist/plugins/skills/skills.integration.test.d.ts.map +0 -1
  814. package/dist/plugins/skills/skills.integration.test.js +0 -475
  815. package/dist/plugins/skills/skills.integration.test.js.map +0 -1
  816. package/dist/plugins/todo/todo.integration.test.d.ts +0 -2
  817. package/dist/plugins/todo/todo.integration.test.d.ts.map +0 -1
  818. package/dist/plugins/todo/todo.integration.test.js +0 -605
  819. package/dist/plugins/todo/todo.integration.test.js.map +0 -1
  820. package/dist/plugins/uploads/preprocessors/image-classifier.test.d.ts +0 -2
  821. package/dist/plugins/uploads/preprocessors/image-classifier.test.d.ts.map +0 -1
  822. package/dist/plugins/uploads/preprocessors/image-classifier.test.js +0 -113
  823. package/dist/plugins/uploads/preprocessors/image-classifier.test.js.map +0 -1
  824. package/dist/plugins/uploads/uploads.integration.test.d.ts +0 -2
  825. package/dist/plugins/uploads/uploads.integration.test.d.ts.map +0 -1
  826. package/dist/plugins/uploads/uploads.integration.test.js +0 -639
  827. package/dist/plugins/uploads/uploads.integration.test.js.map +0 -1
  828. package/dist/plugins/user-chat/user-chat.integration.test.d.ts +0 -2
  829. package/dist/plugins/user-chat/user-chat.integration.test.d.ts.map +0 -1
  830. package/dist/plugins/user-chat/user-chat.integration.test.js +0 -754
  831. package/dist/plugins/user-chat/user-chat.integration.test.js.map +0 -1
  832. package/dist/plugins/workers/workers.integration.test.d.ts +0 -2
  833. package/dist/plugins/workers/workers.integration.test.d.ts.map +0 -1
  834. package/dist/plugins/workers/workers.integration.test.js +0 -629
  835. package/dist/plugins/workers/workers.integration.test.js.map +0 -1
  836. package/dist/prompts/macros.test.d.ts +0 -2
  837. package/dist/prompts/macros.test.d.ts.map +0 -1
  838. package/dist/prompts/macros.test.js +0 -80
  839. package/dist/prompts/macros.test.js.map +0 -1
  840. package/dist/testing/test-harness.test.d.ts +0 -2
  841. package/dist/testing/test-harness.test.d.ts.map +0 -1
  842. package/dist/testing/test-harness.test.js +0 -92
  843. package/dist/testing/test-harness.test.js.map +0 -1
  844. package/dist/transport/http/routes/rpc.integration.test.d.ts +0 -2
  845. package/dist/transport/http/routes/rpc.integration.test.d.ts.map +0 -1
  846. package/dist/transport/http/routes/rpc.integration.test.js +0 -189
  847. package/dist/transport/http/routes/rpc.integration.test.js.map +0 -1
  848. package/dist/transport/http/routes/rpc.test.d.ts +0 -2
  849. package/dist/transport/http/routes/rpc.test.d.ts.map +0 -1
  850. package/dist/transport/http/routes/rpc.test.js +0 -316
  851. package/dist/transport/http/routes/rpc.test.js.map +0 -1
  852. package/src/config.test.ts +0 -174
  853. package/src/core/agent-loop.integration.test.ts +0 -503
  854. package/src/core/agents/agent-config.test.ts +0 -240
  855. package/src/core/agents/agent-shutdown.test.ts +0 -236
  856. package/src/core/agents/agent.test.ts +0 -387
  857. package/src/core/agents/communicator.ts +0 -16
  858. package/src/core/agents/handler-events.test.ts +0 -167
  859. package/src/core/agents/response-sanitizer.test.ts +0 -137
  860. package/src/core/error-recovery.integration.test.ts +0 -343
  861. package/src/core/event-sourcing.integration.test.ts +0 -191
  862. package/src/core/events/file.test.ts +0 -436
  863. package/src/core/events/memory.test.ts +0 -741
  864. package/src/core/image/image-processor.test.ts +0 -218
  865. package/src/core/image/vips-resizer.test.ts +0 -388
  866. package/src/core/llm/anthropic.test.ts +0 -546
  867. package/src/core/llm/cache-breakpoints.test.ts +0 -85
  868. package/src/core/llm/cache-live.test.ts +0 -155
  869. package/src/core/llm/logger.test.ts +0 -270
  870. package/src/core/llm/message-sanitization.test.ts +0 -217
  871. package/src/core/llm/mock.test.ts +0 -402
  872. package/src/core/llm/model-shortlist-live.test.ts +0 -577
  873. package/src/core/llm/openrouter-mapping.test.ts +0 -234
  874. package/src/core/llm/openrouter.test.ts +0 -499
  875. package/src/core/llm/provider-integration.test.ts +0 -408
  876. package/src/core/llm/reasoning-details.test.ts +0 -177
  877. package/src/core/llm/routing-provider.test.ts +0 -113
  878. package/src/core/llm/snapshot-middleware.test.ts +0 -168
  879. package/src/core/llm/thinking-blocks.test.ts +0 -345
  880. package/src/core/multi-agent.integration.test.ts +0 -340
  881. package/src/core/plugin-hooks.integration.test.ts +0 -568
  882. package/src/core/reasoning-round-trip.integration.test.ts +0 -188
  883. package/src/core/session-lifecycle.integration.test.ts +0 -202
  884. package/src/core/sessions/fork-utils.test.ts +0 -158
  885. package/src/core/sessions/session-overrides.integration.test.ts +0 -210
  886. package/src/core/sessions/session.test.ts +0 -1736
  887. package/src/core/tools/executor.test.ts +0 -161
  888. package/src/lib/logger/console.test.ts +0 -348
  889. package/src/lib/never.ts +0 -3
  890. package/src/lib/utils/concurrency.test.ts +0 -169
  891. package/src/plugins/agent-status/agent-status.test.ts +0 -164
  892. package/src/plugins/agents/agents.integration.test.ts +0 -976
  893. package/src/plugins/agents/supervision.integration.test.ts +0 -249
  894. package/src/plugins/context-compact/compaction-live.test.ts +0 -221
  895. package/src/plugins/context-compact/context-compact.integration.test.ts +0 -418
  896. package/src/plugins/context-compact/context-compactor.test.ts +0 -1036
  897. package/src/plugins/context-compact/history-offloader.test.ts +0 -100
  898. package/src/plugins/filesystem/filesystem.integration.test.ts +0 -529
  899. package/src/plugins/filesystem/schema.ts +0 -6
  900. package/src/plugins/limits-guard/limit-guard.test.ts +0 -253
  901. package/src/plugins/limits-guard/limits-guard.integration.test.ts +0 -1012
  902. package/src/plugins/llm-debug/llm-debug.integration.test.ts +0 -192
  903. package/src/plugins/mailbox/mailbox.integration.test.ts +0 -794
  904. package/src/plugins/resources/resources.integration.test.ts +0 -68
  905. package/src/plugins/result-eviction/result-eviction.integration.test.ts +0 -332
  906. package/src/plugins/services/pid-registry.test.ts +0 -180
  907. package/src/plugins/services/services.integration.test.ts +0 -1223
  908. package/src/plugins/session-lifecycle/session-lifecycle.integration.test.ts +0 -639
  909. package/src/plugins/session-stats/plugin.test.ts +0 -160
  910. package/src/plugins/shell/shell.integration.test.ts +0 -273
  911. package/src/plugins/shell/shell.test.ts +0 -314
  912. package/src/plugins/skills/discovery.test.ts +0 -395
  913. package/src/plugins/skills/skills.integration.test.ts +0 -580
  914. package/src/plugins/todo/todo.integration.test.ts +0 -687
  915. package/src/plugins/uploads/preprocessors/image-classifier.test.ts +0 -142
  916. package/src/plugins/uploads/uploads.integration.test.ts +0 -831
  917. package/src/plugins/user-chat/user-chat.integration.test.ts +0 -893
  918. package/src/plugins/workers/workers.integration.test.ts +0 -778
  919. package/src/prompts/macros.test.ts +0 -107
  920. package/src/testing/test-harness.test.ts +0 -114
  921. package/src/transport/http/routes/rpc.integration.test.ts +0 -243
  922. package/src/transport/http/routes/rpc.test.ts +0 -372
@@ -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'