@roj-ai/sdk 0.1.35 → 0.2.1

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