@roj-ai/sdk 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (763) hide show
  1. package/dist/bootstrap.d.ts +453 -0
  2. package/dist/bootstrap.d.ts.map +1 -0
  3. package/dist/builtin-events.d.ts +16 -0
  4. package/dist/builtin-events.d.ts.map +1 -0
  5. package/dist/bun-platform/fs.d.ts +9 -0
  6. package/dist/bun-platform/fs.d.ts.map +1 -0
  7. package/dist/bun-platform/index.d.ts +12 -0
  8. package/dist/bun-platform/index.d.ts.map +1 -0
  9. package/dist/bun-platform/process.d.ts +6 -0
  10. package/dist/bun-platform/process.d.ts.map +1 -0
  11. package/dist/config.d.ts +38 -0
  12. package/dist/config.d.ts.map +1 -0
  13. package/dist/config.test.d.ts +2 -0
  14. package/dist/config.test.d.ts.map +1 -0
  15. package/dist/core/agent-loop.integration.test.d.ts +2 -0
  16. package/dist/core/agent-loop.integration.test.d.ts.map +1 -0
  17. package/dist/core/agents/agent-config.test.d.ts +2 -0
  18. package/dist/core/agents/agent-config.test.d.ts.map +1 -0
  19. package/dist/core/agents/agent-roles.d.ts +33 -0
  20. package/dist/core/agents/agent-roles.d.ts.map +1 -0
  21. package/dist/core/agents/agent-shutdown.test.d.ts +6 -0
  22. package/dist/core/agents/agent-shutdown.test.d.ts.map +1 -0
  23. package/dist/core/agents/agent.d.ts +234 -0
  24. package/dist/core/agents/agent.d.ts.map +1 -0
  25. package/dist/core/agents/agent.test.d.ts +2 -0
  26. package/dist/core/agents/agent.test.d.ts.map +1 -0
  27. package/dist/core/agents/communicator.d.ts +3 -0
  28. package/dist/core/agents/communicator.d.ts.map +1 -0
  29. package/dist/core/agents/config.d.ts +84 -0
  30. package/dist/core/agents/config.d.ts.map +1 -0
  31. package/dist/core/agents/context.d.ts +16 -0
  32. package/dist/core/agents/context.d.ts.map +1 -0
  33. package/dist/core/agents/debounce.d.ts +52 -0
  34. package/dist/core/agents/debounce.d.ts.map +1 -0
  35. package/dist/core/agents/handler-events.test.d.ts +5 -0
  36. package/dist/core/agents/handler-events.test.d.ts.map +1 -0
  37. package/dist/core/agents/index.d.ts +2 -0
  38. package/dist/core/agents/index.d.ts.map +1 -0
  39. package/dist/core/agents/response-sanitizer.d.ts +25 -0
  40. package/dist/core/agents/response-sanitizer.d.ts.map +1 -0
  41. package/dist/core/agents/response-sanitizer.test.d.ts +2 -0
  42. package/dist/core/agents/response-sanitizer.test.d.ts.map +1 -0
  43. package/dist/core/agents/retry.d.ts +40 -0
  44. package/dist/core/agents/retry.d.ts.map +1 -0
  45. package/dist/core/agents/schema.d.ts +57 -0
  46. package/dist/core/agents/schema.d.ts.map +1 -0
  47. package/dist/core/agents/state.d.ts +255 -0
  48. package/dist/core/agents/state.d.ts.map +1 -0
  49. package/dist/core/context/state.d.ts +28 -0
  50. package/dist/core/context/state.d.ts.map +1 -0
  51. package/dist/core/errors.d.ts +29 -0
  52. package/dist/core/errors.d.ts.map +1 -0
  53. package/dist/core/event-sourcing.integration.test.d.ts +2 -0
  54. package/dist/core/event-sourcing.integration.test.d.ts.map +1 -0
  55. package/dist/core/events/base-event-store.d.ts +55 -0
  56. package/dist/core/events/base-event-store.d.ts.map +1 -0
  57. package/dist/core/events/event-store.d.ts +108 -0
  58. package/dist/core/events/event-store.d.ts.map +1 -0
  59. package/dist/core/events/file.d.ts +50 -0
  60. package/dist/core/events/file.d.ts.map +1 -0
  61. package/dist/core/events/file.test.d.ts +2 -0
  62. package/dist/core/events/file.test.d.ts.map +1 -0
  63. package/dist/core/events/index.d.ts +4 -0
  64. package/dist/core/events/index.d.ts.map +1 -0
  65. package/dist/core/events/memory.d.ts +43 -0
  66. package/dist/core/events/memory.d.ts.map +1 -0
  67. package/dist/core/events/memory.test.d.ts +2 -0
  68. package/dist/core/events/memory.test.d.ts.map +1 -0
  69. package/dist/core/events/metadata-utils.d.ts +27 -0
  70. package/dist/core/events/metadata-utils.d.ts.map +1 -0
  71. package/dist/core/events/test-helpers.d.ts +28 -0
  72. package/dist/core/events/test-helpers.d.ts.map +1 -0
  73. package/dist/core/events/types.d.ts +46 -0
  74. package/dist/core/events/types.d.ts.map +1 -0
  75. package/dist/core/file-store/file-store.d.ts +56 -0
  76. package/dist/core/file-store/file-store.d.ts.map +1 -0
  77. package/dist/core/file-store/types.d.ts +50 -0
  78. package/dist/core/file-store/types.d.ts.map +1 -0
  79. package/dist/core/image/image-processor.d.ts +15 -0
  80. package/dist/core/image/image-processor.d.ts.map +1 -0
  81. package/dist/core/image/image-processor.test.d.ts +2 -0
  82. package/dist/core/image/image-processor.test.d.ts.map +1 -0
  83. package/dist/core/image/index.d.ts +5 -0
  84. package/dist/core/image/index.d.ts.map +1 -0
  85. package/dist/core/image/noop-resizer.d.ts +5 -0
  86. package/dist/core/image/noop-resizer.d.ts.map +1 -0
  87. package/dist/core/image/types.d.ts +20 -0
  88. package/dist/core/image/types.d.ts.map +1 -0
  89. package/dist/core/image/vips-resizer.d.ts +21 -0
  90. package/dist/core/image/vips-resizer.d.ts.map +1 -0
  91. package/dist/core/image/vips-resizer.test.d.ts +2 -0
  92. package/dist/core/image/vips-resizer.test.d.ts.map +1 -0
  93. package/dist/core/llm/anthropic.d.ts +51 -0
  94. package/dist/core/llm/anthropic.d.ts.map +1 -0
  95. package/dist/core/llm/anthropic.test.d.ts +2 -0
  96. package/dist/core/llm/anthropic.test.d.ts.map +1 -0
  97. package/dist/core/llm/cache-breakpoints.d.ts +17 -0
  98. package/dist/core/llm/cache-breakpoints.d.ts.map +1 -0
  99. package/dist/core/llm/cache-live.test.d.ts +16 -0
  100. package/dist/core/llm/cache-live.test.d.ts.map +1 -0
  101. package/dist/core/llm/index.d.ts +16 -0
  102. package/dist/core/llm/index.d.ts.map +1 -0
  103. package/dist/core/llm/llm-log-types.d.ts +148 -0
  104. package/dist/core/llm/llm-log-types.d.ts.map +1 -0
  105. package/dist/core/llm/logger.d.ts +74 -0
  106. package/dist/core/llm/logger.d.ts.map +1 -0
  107. package/dist/core/llm/logger.test.d.ts +7 -0
  108. package/dist/core/llm/logger.test.d.ts.map +1 -0
  109. package/dist/core/llm/logging-provider.d.ts +20 -0
  110. package/dist/core/llm/logging-provider.d.ts.map +1 -0
  111. package/dist/core/llm/middleware.d.ts +79 -0
  112. package/dist/core/llm/middleware.d.ts.map +1 -0
  113. package/dist/core/llm/mock.d.ts +79 -0
  114. package/dist/core/llm/mock.d.ts.map +1 -0
  115. package/dist/core/llm/mock.test.d.ts +2 -0
  116. package/dist/core/llm/mock.test.d.ts.map +1 -0
  117. package/dist/core/llm/openrouter-mapping.test.d.ts +2 -0
  118. package/dist/core/llm/openrouter-mapping.test.d.ts.map +1 -0
  119. package/dist/core/llm/openrouter.d.ts +37 -0
  120. package/dist/core/llm/openrouter.d.ts.map +1 -0
  121. package/dist/core/llm/openrouter.test.d.ts +2 -0
  122. package/dist/core/llm/openrouter.test.d.ts.map +1 -0
  123. package/dist/core/llm/provider-integration.test.d.ts +12 -0
  124. package/dist/core/llm/provider-integration.test.d.ts.map +1 -0
  125. package/dist/core/llm/provider.d.ts +175 -0
  126. package/dist/core/llm/provider.d.ts.map +1 -0
  127. package/dist/core/llm/routing-provider.d.ts +31 -0
  128. package/dist/core/llm/routing-provider.d.ts.map +1 -0
  129. package/dist/core/llm/routing-provider.test.d.ts +2 -0
  130. package/dist/core/llm/routing-provider.test.d.ts.map +1 -0
  131. package/dist/core/llm/schema.d.ts +24 -0
  132. package/dist/core/llm/schema.d.ts.map +1 -0
  133. package/dist/core/llm/snapshot-fetch.d.ts +21 -0
  134. package/dist/core/llm/snapshot-fetch.d.ts.map +1 -0
  135. package/dist/core/llm/snapshot-middleware.d.ts +71 -0
  136. package/dist/core/llm/snapshot-middleware.d.ts.map +1 -0
  137. package/dist/core/llm/snapshot-middleware.test.d.ts +2 -0
  138. package/dist/core/llm/snapshot-middleware.test.d.ts.map +1 -0
  139. package/dist/core/llm/state.d.ts +73 -0
  140. package/dist/core/llm/state.d.ts.map +1 -0
  141. package/dist/core/llm/tokens.d.ts +36 -0
  142. package/dist/core/llm/tokens.d.ts.map +1 -0
  143. package/dist/core/multi-agent.integration.test.d.ts +2 -0
  144. package/dist/core/multi-agent.integration.test.d.ts.map +1 -0
  145. package/dist/core/plugin-hooks.integration.test.d.ts +2 -0
  146. package/dist/core/plugin-hooks.integration.test.d.ts.map +1 -0
  147. package/dist/core/plugins/hook-types.d.ts +55 -0
  148. package/dist/core/plugins/hook-types.d.ts.map +1 -0
  149. package/dist/core/plugins/index.d.ts +23 -0
  150. package/dist/core/plugins/index.d.ts.map +1 -0
  151. package/dist/core/plugins/plugin-builder.d.ts +474 -0
  152. package/dist/core/plugins/plugin-builder.d.ts.map +1 -0
  153. package/dist/core/preset/config.d.ts +55 -0
  154. package/dist/core/preset/config.d.ts.map +1 -0
  155. package/dist/core/preset/index.d.ts +8 -0
  156. package/dist/core/preset/index.d.ts.map +1 -0
  157. package/dist/core/preset/preset-builder.d.ts +44 -0
  158. package/dist/core/preset/preset-builder.d.ts.map +1 -0
  159. package/dist/core/session-lifecycle.integration.test.d.ts +2 -0
  160. package/dist/core/session-lifecycle.integration.test.d.ts.map +1 -0
  161. package/dist/core/sessions/apply-event.d.ts +19 -0
  162. package/dist/core/sessions/apply-event.d.ts.map +1 -0
  163. package/dist/core/sessions/context.d.ts +34 -0
  164. package/dist/core/sessions/context.d.ts.map +1 -0
  165. package/dist/core/sessions/fork-utils.d.ts +20 -0
  166. package/dist/core/sessions/fork-utils.d.ts.map +1 -0
  167. package/dist/core/sessions/fork-utils.test.d.ts +2 -0
  168. package/dist/core/sessions/fork-utils.test.d.ts.map +1 -0
  169. package/dist/core/sessions/reducer.d.ts +50 -0
  170. package/dist/core/sessions/reducer.d.ts.map +1 -0
  171. package/dist/core/sessions/schema.d.ts +82 -0
  172. package/dist/core/sessions/schema.d.ts.map +1 -0
  173. package/dist/core/sessions/session-environment.d.ts +13 -0
  174. package/dist/core/sessions/session-environment.d.ts.map +1 -0
  175. package/dist/core/sessions/session-manager.d.ts +183 -0
  176. package/dist/core/sessions/session-manager.d.ts.map +1 -0
  177. package/dist/core/sessions/session-store.d.ts +69 -0
  178. package/dist/core/sessions/session-store.d.ts.map +1 -0
  179. package/dist/core/sessions/session.d.ts +212 -0
  180. package/dist/core/sessions/session.d.ts.map +1 -0
  181. package/dist/core/sessions/session.test.d.ts +2 -0
  182. package/dist/core/sessions/session.test.d.ts.map +1 -0
  183. package/dist/core/sessions/state.d.ts +110 -0
  184. package/dist/core/sessions/state.d.ts.map +1 -0
  185. package/dist/core/system.d.ts +97 -0
  186. package/dist/core/system.d.ts.map +1 -0
  187. package/dist/core/tools/context.d.ts +3 -0
  188. package/dist/core/tools/context.d.ts.map +1 -0
  189. package/dist/core/tools/definition.d.ts +10 -0
  190. package/dist/core/tools/definition.d.ts.map +1 -0
  191. package/dist/core/tools/executor.d.ts +28 -0
  192. package/dist/core/tools/executor.d.ts.map +1 -0
  193. package/dist/core/tools/executor.test.d.ts +2 -0
  194. package/dist/core/tools/executor.test.d.ts.map +1 -0
  195. package/dist/core/tools/index.d.ts +4 -0
  196. package/dist/core/tools/index.d.ts.map +1 -0
  197. package/dist/core/tools/schema.d.ts +61 -0
  198. package/dist/core/tools/schema.d.ts.map +1 -0
  199. package/dist/core/tools/state.d.ts +28 -0
  200. package/dist/core/tools/state.d.ts.map +1 -0
  201. package/dist/index.d.ts +111 -0
  202. package/dist/index.d.ts.map +1 -0
  203. package/dist/lib/json/index.d.ts +17 -0
  204. package/dist/lib/json/index.d.ts.map +1 -0
  205. package/dist/lib/logger/console.d.ts +35 -0
  206. package/dist/lib/logger/console.d.ts.map +1 -0
  207. package/dist/lib/logger/console.test.d.ts +2 -0
  208. package/dist/lib/logger/console.test.d.ts.map +1 -0
  209. package/dist/lib/logger/file.d.ts +20 -0
  210. package/dist/lib/logger/file.d.ts.map +1 -0
  211. package/dist/lib/logger/index.d.ts +5 -0
  212. package/dist/lib/logger/index.d.ts.map +1 -0
  213. package/dist/lib/logger/logger.d.ts +87 -0
  214. package/dist/lib/logger/logger.d.ts.map +1 -0
  215. package/dist/lib/logger/ring-buffer.d.ts +33 -0
  216. package/dist/lib/logger/ring-buffer.d.ts.map +1 -0
  217. package/dist/lib/logger/tee.d.ts +15 -0
  218. package/dist/lib/logger/tee.d.ts.map +1 -0
  219. package/dist/lib/mime.d.ts +9 -0
  220. package/dist/lib/mime.d.ts.map +1 -0
  221. package/dist/lib/never.d.ts +2 -0
  222. package/dist/lib/never.d.ts.map +1 -0
  223. package/dist/lib/utils/hash.d.ts +19 -0
  224. package/dist/lib/utils/hash.d.ts.map +1 -0
  225. package/dist/lib/utils/result.d.ts +26 -0
  226. package/dist/lib/utils/result.d.ts.map +1 -0
  227. package/dist/platform/fs.d.ts +39 -0
  228. package/dist/platform/fs.d.ts.map +1 -0
  229. package/dist/platform/index.d.ts +21 -0
  230. package/dist/platform/index.d.ts.map +1 -0
  231. package/dist/platform/process.d.ts +24 -0
  232. package/dist/platform/process.d.ts.map +1 -0
  233. package/dist/plugins/agent-status/plugin.d.ts +8 -0
  234. package/dist/plugins/agent-status/plugin.d.ts.map +1 -0
  235. package/dist/plugins/agents/agents.integration.test.d.ts +2 -0
  236. package/dist/plugins/agents/agents.integration.test.d.ts.map +1 -0
  237. package/dist/plugins/agents/index.d.ts +3 -0
  238. package/dist/plugins/agents/index.d.ts.map +1 -0
  239. package/dist/plugins/agents/plugin.d.ts +57 -0
  240. package/dist/plugins/agents/plugin.d.ts.map +1 -0
  241. package/dist/plugins/context-compact/context-compact.integration.test.d.ts +2 -0
  242. package/dist/plugins/context-compact/context-compact.integration.test.d.ts.map +1 -0
  243. package/dist/plugins/context-compact/context-compactor.d.ts +88 -0
  244. package/dist/plugins/context-compact/context-compactor.d.ts.map +1 -0
  245. package/dist/plugins/context-compact/context-compactor.test.d.ts +2 -0
  246. package/dist/plugins/context-compact/context-compactor.test.d.ts.map +1 -0
  247. package/dist/plugins/context-compact/history-offloader.d.ts +17 -0
  248. package/dist/plugins/context-compact/history-offloader.d.ts.map +1 -0
  249. package/dist/plugins/context-compact/history-offloader.test.d.ts +2 -0
  250. package/dist/plugins/context-compact/history-offloader.test.d.ts.map +1 -0
  251. package/dist/plugins/context-compact/index.d.ts +4 -0
  252. package/dist/plugins/context-compact/index.d.ts.map +1 -0
  253. package/dist/plugins/context-compact/plugin.d.ts +15 -0
  254. package/dist/plugins/context-compact/plugin.d.ts.map +1 -0
  255. package/dist/plugins/filesystem/filesystem.integration.test.d.ts +2 -0
  256. package/dist/plugins/filesystem/filesystem.integration.test.d.ts.map +1 -0
  257. package/dist/plugins/filesystem/helpers.d.ts +34 -0
  258. package/dist/plugins/filesystem/helpers.d.ts.map +1 -0
  259. package/dist/plugins/filesystem/index.d.ts +5 -0
  260. package/dist/plugins/filesystem/index.d.ts.map +1 -0
  261. package/dist/plugins/filesystem/listing.d.ts +38 -0
  262. package/dist/plugins/filesystem/listing.d.ts.map +1 -0
  263. package/dist/plugins/filesystem/plugin.d.ts +53 -0
  264. package/dist/plugins/filesystem/plugin.d.ts.map +1 -0
  265. package/dist/plugins/filesystem/schema.d.ts +7 -0
  266. package/dist/plugins/filesystem/schema.d.ts.map +1 -0
  267. package/dist/plugins/git-status/index.d.ts +2 -0
  268. package/dist/plugins/git-status/index.d.ts.map +1 -0
  269. package/dist/plugins/git-status/plugin.d.ts +12 -0
  270. package/dist/plugins/git-status/plugin.d.ts.map +1 -0
  271. package/dist/plugins/limits-guard/config.d.ts +23 -0
  272. package/dist/plugins/limits-guard/config.d.ts.map +1 -0
  273. package/dist/plugins/limits-guard/index.d.ts +5 -0
  274. package/dist/plugins/limits-guard/index.d.ts.map +1 -0
  275. package/dist/plugins/limits-guard/limit-guard.d.ts +40 -0
  276. package/dist/plugins/limits-guard/limit-guard.d.ts.map +1 -0
  277. package/dist/plugins/limits-guard/limit-guard.test.d.ts +2 -0
  278. package/dist/plugins/limits-guard/limit-guard.test.d.ts.map +1 -0
  279. package/dist/plugins/limits-guard/limits-guard.integration.test.d.ts +2 -0
  280. package/dist/plugins/limits-guard/limits-guard.integration.test.d.ts.map +1 -0
  281. package/dist/plugins/limits-guard/plugin.d.ts +39 -0
  282. package/dist/plugins/limits-guard/plugin.d.ts.map +1 -0
  283. package/dist/plugins/llm-debug/index.d.ts +2 -0
  284. package/dist/plugins/llm-debug/index.d.ts.map +1 -0
  285. package/dist/plugins/llm-debug/llm-debug.integration.test.d.ts +2 -0
  286. package/dist/plugins/llm-debug/llm-debug.integration.test.d.ts.map +1 -0
  287. package/dist/plugins/llm-debug/plugin.d.ts +31 -0
  288. package/dist/plugins/llm-debug/plugin.d.ts.map +1 -0
  289. package/dist/plugins/logs/index.d.ts +2 -0
  290. package/dist/plugins/logs/index.d.ts.map +1 -0
  291. package/dist/plugins/logs/plugin.d.ts +10 -0
  292. package/dist/plugins/logs/plugin.d.ts.map +1 -0
  293. package/dist/plugins/mailbox/helpers.d.ts +20 -0
  294. package/dist/plugins/mailbox/helpers.d.ts.map +1 -0
  295. package/dist/plugins/mailbox/index.d.ts +9 -0
  296. package/dist/plugins/mailbox/index.d.ts.map +1 -0
  297. package/dist/plugins/mailbox/mailbox.integration.test.d.ts +2 -0
  298. package/dist/plugins/mailbox/mailbox.integration.test.d.ts.map +1 -0
  299. package/dist/plugins/mailbox/plugin.d.ts +31 -0
  300. package/dist/plugins/mailbox/plugin.d.ts.map +1 -0
  301. package/dist/plugins/mailbox/prompts.d.ts +21 -0
  302. package/dist/plugins/mailbox/prompts.d.ts.map +1 -0
  303. package/dist/plugins/mailbox/query.d.ts +33 -0
  304. package/dist/plugins/mailbox/query.d.ts.map +1 -0
  305. package/dist/plugins/mailbox/schema.d.ts +54 -0
  306. package/dist/plugins/mailbox/schema.d.ts.map +1 -0
  307. package/dist/plugins/mailbox/state.d.ts +40 -0
  308. package/dist/plugins/mailbox/state.d.ts.map +1 -0
  309. package/dist/plugins/resources/index.d.ts +7 -0
  310. package/dist/plugins/resources/index.d.ts.map +1 -0
  311. package/dist/plugins/resources/manifest.d.ts +23 -0
  312. package/dist/plugins/resources/manifest.d.ts.map +1 -0
  313. package/dist/plugins/resources/plugin.d.ts +28 -0
  314. package/dist/plugins/resources/plugin.d.ts.map +1 -0
  315. package/dist/plugins/resources/post-inject.d.ts +39 -0
  316. package/dist/plugins/resources/post-inject.d.ts.map +1 -0
  317. package/dist/plugins/resources/state.d.ts +25 -0
  318. package/dist/plugins/resources/state.d.ts.map +1 -0
  319. package/dist/plugins/result-eviction/index.d.ts +3 -0
  320. package/dist/plugins/result-eviction/index.d.ts.map +1 -0
  321. package/dist/plugins/result-eviction/plugin.d.ts +19 -0
  322. package/dist/plugins/result-eviction/plugin.d.ts.map +1 -0
  323. package/dist/plugins/result-eviction/result-eviction.integration.test.d.ts +2 -0
  324. package/dist/plugins/result-eviction/result-eviction.integration.test.d.ts.map +1 -0
  325. package/dist/plugins/services/plugin.d.ts +85 -0
  326. package/dist/plugins/services/plugin.d.ts.map +1 -0
  327. package/dist/plugins/services/port-pool.d.ts +32 -0
  328. package/dist/plugins/services/port-pool.d.ts.map +1 -0
  329. package/dist/plugins/services/prompt.d.ts +13 -0
  330. package/dist/plugins/services/prompt.d.ts.map +1 -0
  331. package/dist/plugins/services/schema.d.ts +70 -0
  332. package/dist/plugins/services/schema.d.ts.map +1 -0
  333. package/dist/plugins/services/service.d.ts +86 -0
  334. package/dist/plugins/services/service.d.ts.map +1 -0
  335. package/dist/plugins/services/services.integration.test.d.ts +2 -0
  336. package/dist/plugins/services/services.integration.test.d.ts.map +1 -0
  337. package/dist/plugins/session-lifecycle/index.d.ts +2 -0
  338. package/dist/plugins/session-lifecycle/index.d.ts.map +1 -0
  339. package/dist/plugins/session-lifecycle/plugin.d.ts +97 -0
  340. package/dist/plugins/session-lifecycle/plugin.d.ts.map +1 -0
  341. package/dist/plugins/session-lifecycle/session-lifecycle.integration.test.d.ts +2 -0
  342. package/dist/plugins/session-lifecycle/session-lifecycle.integration.test.d.ts.map +1 -0
  343. package/dist/plugins/session-state/plugin.d.ts +48 -0
  344. package/dist/plugins/session-state/plugin.d.ts.map +1 -0
  345. package/dist/plugins/session-stats/index.d.ts +4 -0
  346. package/dist/plugins/session-stats/index.d.ts.map +1 -0
  347. package/dist/plugins/session-stats/plugin.d.ts +29 -0
  348. package/dist/plugins/session-stats/plugin.d.ts.map +1 -0
  349. package/dist/plugins/shell/executor.d.ts +78 -0
  350. package/dist/plugins/shell/executor.d.ts.map +1 -0
  351. package/dist/plugins/shell/index.d.ts +6 -0
  352. package/dist/plugins/shell/index.d.ts.map +1 -0
  353. package/dist/plugins/shell/plugin.d.ts +51 -0
  354. package/dist/plugins/shell/plugin.d.ts.map +1 -0
  355. package/dist/plugins/shell/shell.integration.test.d.ts +2 -0
  356. package/dist/plugins/shell/shell.integration.test.d.ts.map +1 -0
  357. package/dist/plugins/shell/shell.test.d.ts +2 -0
  358. package/dist/plugins/shell/shell.test.d.ts.map +1 -0
  359. package/dist/plugins/skills/discovery.d.ts +69 -0
  360. package/dist/plugins/skills/discovery.d.ts.map +1 -0
  361. package/dist/plugins/skills/discovery.test.d.ts +2 -0
  362. package/dist/plugins/skills/discovery.test.d.ts.map +1 -0
  363. package/dist/plugins/skills/index.d.ts +11 -0
  364. package/dist/plugins/skills/index.d.ts.map +1 -0
  365. package/dist/plugins/skills/plugin.d.ts +94 -0
  366. package/dist/plugins/skills/plugin.d.ts.map +1 -0
  367. package/dist/plugins/skills/prompts.d.ts +29 -0
  368. package/dist/plugins/skills/prompts.d.ts.map +1 -0
  369. package/dist/plugins/skills/schema.d.ts +64 -0
  370. package/dist/plugins/skills/schema.d.ts.map +1 -0
  371. package/dist/plugins/skills/skills.integration.test.d.ts +2 -0
  372. package/dist/plugins/skills/skills.integration.test.d.ts.map +1 -0
  373. package/dist/plugins/snapshotting/index.d.ts +4 -0
  374. package/dist/plugins/snapshotting/index.d.ts.map +1 -0
  375. package/dist/plugins/snapshotting/jj-snapshotter.d.ts +27 -0
  376. package/dist/plugins/snapshotting/jj-snapshotter.d.ts.map +1 -0
  377. package/dist/plugins/snapshotting/plugin.d.ts +15 -0
  378. package/dist/plugins/snapshotting/plugin.d.ts.map +1 -0
  379. package/dist/plugins/snapshotting/snapshotter.d.ts +19 -0
  380. package/dist/plugins/snapshotting/snapshotter.d.ts.map +1 -0
  381. package/dist/plugins/todo/index.d.ts +7 -0
  382. package/dist/plugins/todo/index.d.ts.map +1 -0
  383. package/dist/plugins/todo/plugin.d.ts +95 -0
  384. package/dist/plugins/todo/plugin.d.ts.map +1 -0
  385. package/dist/plugins/todo/prompts.d.ts +13 -0
  386. package/dist/plugins/todo/prompts.d.ts.map +1 -0
  387. package/dist/plugins/todo/schema.d.ts +44 -0
  388. package/dist/plugins/todo/schema.d.ts.map +1 -0
  389. package/dist/plugins/todo/todo.integration.test.d.ts +2 -0
  390. package/dist/plugins/todo/todo.integration.test.d.ts.map +1 -0
  391. package/dist/plugins/uploads/index.d.ts +9 -0
  392. package/dist/plugins/uploads/index.d.ts.map +1 -0
  393. package/dist/plugins/uploads/plugin.d.ts +56 -0
  394. package/dist/plugins/uploads/plugin.d.ts.map +1 -0
  395. package/dist/plugins/uploads/preprocessor.d.ts +70 -0
  396. package/dist/plugins/uploads/preprocessor.d.ts.map +1 -0
  397. package/dist/plugins/uploads/preprocessors/image-classifier.d.ts +49 -0
  398. package/dist/plugins/uploads/preprocessors/image-classifier.d.ts.map +1 -0
  399. package/dist/plugins/uploads/preprocessors/index.d.ts +7 -0
  400. package/dist/plugins/uploads/preprocessors/index.d.ts.map +1 -0
  401. package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.d.ts +43 -0
  402. package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.d.ts.map +1 -0
  403. package/dist/plugins/uploads/preprocessors/zip-preprocessor.d.ts +30 -0
  404. package/dist/plugins/uploads/preprocessors/zip-preprocessor.d.ts.map +1 -0
  405. package/dist/plugins/uploads/schema.d.ts +72 -0
  406. package/dist/plugins/uploads/schema.d.ts.map +1 -0
  407. package/dist/plugins/uploads/state.d.ts +38 -0
  408. package/dist/plugins/uploads/state.d.ts.map +1 -0
  409. package/dist/plugins/uploads/uploads.integration.test.d.ts +2 -0
  410. package/dist/plugins/uploads/uploads.integration.test.d.ts.map +1 -0
  411. package/dist/plugins/user-chat/index.d.ts +7 -0
  412. package/dist/plugins/user-chat/index.d.ts.map +1 -0
  413. package/dist/plugins/user-chat/plugin.d.ts +221 -0
  414. package/dist/plugins/user-chat/plugin.d.ts.map +1 -0
  415. package/dist/plugins/user-chat/prompts.d.ts +13 -0
  416. package/dist/plugins/user-chat/prompts.d.ts.map +1 -0
  417. package/dist/plugins/user-chat/schema.d.ts +82 -0
  418. package/dist/plugins/user-chat/schema.d.ts.map +1 -0
  419. package/dist/plugins/user-chat/user-chat.integration.test.d.ts +2 -0
  420. package/dist/plugins/user-chat/user-chat.integration.test.d.ts.map +1 -0
  421. package/dist/plugins/workers/context.d.ts +159 -0
  422. package/dist/plugins/workers/context.d.ts.map +1 -0
  423. package/dist/plugins/workers/definition.d.ts +118 -0
  424. package/dist/plugins/workers/definition.d.ts.map +1 -0
  425. package/dist/plugins/workers/index.d.ts +11 -0
  426. package/dist/plugins/workers/index.d.ts.map +1 -0
  427. package/dist/plugins/workers/plugin.d.ts +125 -0
  428. package/dist/plugins/workers/plugin.d.ts.map +1 -0
  429. package/dist/plugins/workers/worker.d.ts +76 -0
  430. package/dist/plugins/workers/worker.d.ts.map +1 -0
  431. package/dist/plugins/workers/workers.integration.test.d.ts +2 -0
  432. package/dist/plugins/workers/workers.integration.test.d.ts.map +1 -0
  433. package/dist/prompts/base.d.ts +75 -0
  434. package/dist/prompts/base.d.ts.map +1 -0
  435. package/dist/prompts/builder.d.ts +73 -0
  436. package/dist/prompts/builder.d.ts.map +1 -0
  437. package/dist/prompts/index.d.ts +10 -0
  438. package/dist/prompts/index.d.ts.map +1 -0
  439. package/dist/prompts/macros.d.ts +15 -0
  440. package/dist/prompts/macros.d.ts.map +1 -0
  441. package/dist/prompts/macros.test.d.ts +2 -0
  442. package/dist/prompts/macros.test.d.ts.map +1 -0
  443. package/dist/testing/bootstrap-for-testing.d.ts +12 -0
  444. package/dist/testing/bootstrap-for-testing.d.ts.map +1 -0
  445. package/dist/testing/index.d.ts +8 -0
  446. package/dist/testing/index.d.ts.map +1 -0
  447. package/dist/testing/node-platform.d.ts +12 -0
  448. package/dist/testing/node-platform.d.ts.map +1 -0
  449. package/dist/testing/notification-collector.d.ts +46 -0
  450. package/dist/testing/notification-collector.d.ts.map +1 -0
  451. package/dist/testing/preset-helpers.d.ts +28 -0
  452. package/dist/testing/preset-helpers.d.ts.map +1 -0
  453. package/dist/testing/test-harness.d.ts +117 -0
  454. package/dist/testing/test-harness.d.ts.map +1 -0
  455. package/dist/testing/test-harness.test.d.ts +2 -0
  456. package/dist/testing/test-harness.test.d.ts.map +1 -0
  457. package/dist/testing/wait-helpers.d.ts +17 -0
  458. package/dist/testing/wait-helpers.d.ts.map +1 -0
  459. package/dist/transport/adapter/client-adapter.d.ts +32 -0
  460. package/dist/transport/adapter/client-adapter.d.ts.map +1 -0
  461. package/dist/transport/adapter/index.d.ts +23 -0
  462. package/dist/transport/adapter/index.d.ts.map +1 -0
  463. package/dist/transport/adapter/server-adapter.d.ts +29 -0
  464. package/dist/transport/adapter/server-adapter.d.ts.map +1 -0
  465. package/dist/transport/adapter/types.d.ts +14 -0
  466. package/dist/transport/adapter/types.d.ts.map +1 -0
  467. package/dist/transport/http/app.d.ts +41 -0
  468. package/dist/transport/http/app.d.ts.map +1 -0
  469. package/dist/transport/http/index.d.ts +7 -0
  470. package/dist/transport/http/index.d.ts.map +1 -0
  471. package/dist/transport/http/middleware/bearer-auth.d.ts +16 -0
  472. package/dist/transport/http/middleware/bearer-auth.d.ts.map +1 -0
  473. package/dist/transport/http/middleware/error-handler.d.ts +21 -0
  474. package/dist/transport/http/middleware/error-handler.d.ts.map +1 -0
  475. package/dist/transport/http/routes/files.d.ts +16 -0
  476. package/dist/transport/http/routes/files.d.ts.map +1 -0
  477. package/dist/transport/http/routes/resources.d.ts +12 -0
  478. package/dist/transport/http/routes/resources.d.ts.map +1 -0
  479. package/dist/transport/http/routes/rpc.d.ts +22 -0
  480. package/dist/transport/http/routes/rpc.d.ts.map +1 -0
  481. package/dist/transport/http/routes/rpc.integration.test.d.ts +2 -0
  482. package/dist/transport/http/routes/rpc.integration.test.d.ts.map +1 -0
  483. package/dist/transport/http/routes/rpc.test.d.ts +2 -0
  484. package/dist/transport/http/routes/rpc.test.d.ts.map +1 -0
  485. package/dist/transport/http/routes/upload.d.ts +14 -0
  486. package/dist/transport/http/routes/upload.d.ts.map +1 -0
  487. package/dist/transport/rpc/index.d.ts +8 -0
  488. package/dist/transport/rpc/index.d.ts.map +1 -0
  489. package/dist/transport/rpc/methods.d.ts +25 -0
  490. package/dist/transport/rpc/methods.d.ts.map +1 -0
  491. package/dist/user-config.d.ts +29 -0
  492. package/dist/user-config.d.ts.map +1 -0
  493. package/package.json +154 -0
  494. package/src/bootstrap.ts +268 -0
  495. package/src/builtin-events.ts +25 -0
  496. package/src/bun-platform/fs.ts +50 -0
  497. package/src/bun-platform/index.ts +21 -0
  498. package/src/bun-platform/process.ts +25 -0
  499. package/src/config.test.ts +174 -0
  500. package/src/config.ts +103 -0
  501. package/src/core/agent-loop.integration.test.ts +503 -0
  502. package/src/core/agents/agent-config.test.ts +240 -0
  503. package/src/core/agents/agent-roles.ts +41 -0
  504. package/src/core/agents/agent-shutdown.test.ts +236 -0
  505. package/src/core/agents/agent.test.ts +387 -0
  506. package/src/core/agents/agent.ts +1472 -0
  507. package/src/core/agents/communicator.ts +16 -0
  508. package/src/core/agents/config.ts +98 -0
  509. package/src/core/agents/context.ts +19 -0
  510. package/src/core/agents/debounce.ts +116 -0
  511. package/src/core/agents/handler-events.test.ts +167 -0
  512. package/src/core/agents/index.ts +1 -0
  513. package/src/core/agents/response-sanitizer.test.ts +137 -0
  514. package/src/core/agents/response-sanitizer.ts +67 -0
  515. package/src/core/agents/retry.ts +164 -0
  516. package/src/core/agents/schema.ts +75 -0
  517. package/src/core/agents/state.ts +272 -0
  518. package/src/core/context/state.ts +38 -0
  519. package/src/core/errors.ts +55 -0
  520. package/src/core/event-sourcing.integration.test.ts +191 -0
  521. package/src/core/events/base-event-store.ts +264 -0
  522. package/src/core/events/event-store.ts +143 -0
  523. package/src/core/events/file.test.ts +436 -0
  524. package/src/core/events/file.ts +372 -0
  525. package/src/core/events/index.ts +3 -0
  526. package/src/core/events/memory.test.ts +741 -0
  527. package/src/core/events/memory.ts +131 -0
  528. package/src/core/events/metadata-utils.ts +133 -0
  529. package/src/core/events/test-helpers.ts +31 -0
  530. package/src/core/events/types.ts +64 -0
  531. package/src/core/file-store/file-store.ts +275 -0
  532. package/src/core/file-store/types.ts +52 -0
  533. package/src/core/image/image-processor.test.ts +218 -0
  534. package/src/core/image/image-processor.ts +127 -0
  535. package/src/core/image/index.ts +4 -0
  536. package/src/core/image/noop-resizer.ts +7 -0
  537. package/src/core/image/types.ts +24 -0
  538. package/src/core/image/vips-resizer.test.ts +377 -0
  539. package/src/core/image/vips-resizer.ts +124 -0
  540. package/src/core/llm/__snapshots__/anthropic-assistant-text-with-tool-calls.json +156 -0
  541. package/src/core/llm/__snapshots__/anthropic-consecutive-tool-results.json +152 -0
  542. package/src/core/llm/__snapshots__/anthropic-image-data-url.json +105 -0
  543. package/src/core/llm/__snapshots__/anthropic-image-http-url.json +104 -0
  544. package/src/core/llm/__snapshots__/anthropic-multiple-images.json +113 -0
  545. package/src/core/llm/__snapshots__/anthropic-multiple-tool-calls-requested.json +151 -0
  546. package/src/core/llm/__snapshots__/anthropic-simple-user-message.json +97 -0
  547. package/src/core/llm/__snapshots__/anthropic-system-message-in-conversation.json +119 -0
  548. package/src/core/llm/__snapshots__/anthropic-tool-call.json +123 -0
  549. package/src/core/llm/__snapshots__/anthropic-tool-error-result.json +139 -0
  550. package/src/core/llm/__snapshots__/anthropic-tool-result-with-image.json +152 -0
  551. package/src/core/llm/__snapshots__/anthropic-tool-roundtrip.json +139 -0
  552. package/src/core/llm/__snapshots__/openrouter-assistant-text-with-tool-calls.json +150 -0
  553. package/src/core/llm/__snapshots__/openrouter-consecutive-tool-results.json +150 -0
  554. package/src/core/llm/__snapshots__/openrouter-image-data-url.json +107 -0
  555. package/src/core/llm/__snapshots__/openrouter-image-http-url.json +107 -0
  556. package/src/core/llm/__snapshots__/openrouter-multiple-images.json +113 -0
  557. package/src/core/llm/__snapshots__/openrouter-multiple-tool-calls-requested.json +158 -0
  558. package/src/core/llm/__snapshots__/openrouter-simple-user-message.json +96 -0
  559. package/src/core/llm/__snapshots__/openrouter-system-message-in-conversation.json +108 -0
  560. package/src/core/llm/__snapshots__/openrouter-tool-call.json +129 -0
  561. package/src/core/llm/__snapshots__/openrouter-tool-error-result.json +137 -0
  562. package/src/core/llm/__snapshots__/openrouter-tool-result-with-image.json +148 -0
  563. package/src/core/llm/__snapshots__/openrouter-tool-roundtrip.json +137 -0
  564. package/src/core/llm/anthropic.test.ts +509 -0
  565. package/src/core/llm/anthropic.ts +578 -0
  566. package/src/core/llm/cache-breakpoints.ts +38 -0
  567. package/src/core/llm/cache-live.test.ts +155 -0
  568. package/src/core/llm/index.ts +30 -0
  569. package/src/core/llm/llm-log-types.ts +167 -0
  570. package/src/core/llm/logger.test.ts +270 -0
  571. package/src/core/llm/logger.ts +306 -0
  572. package/src/core/llm/logging-provider.ts +73 -0
  573. package/src/core/llm/middleware.ts +172 -0
  574. package/src/core/llm/mock.test.ts +402 -0
  575. package/src/core/llm/mock.ts +234 -0
  576. package/src/core/llm/openrouter-mapping.test.ts +153 -0
  577. package/src/core/llm/openrouter.test.ts +499 -0
  578. package/src/core/llm/openrouter.ts +458 -0
  579. package/src/core/llm/provider-integration.test.ts +408 -0
  580. package/src/core/llm/provider.ts +238 -0
  581. package/src/core/llm/routing-provider.test.ts +113 -0
  582. package/src/core/llm/routing-provider.ts +86 -0
  583. package/src/core/llm/schema.ts +47 -0
  584. package/src/core/llm/snapshot-fetch.ts +158 -0
  585. package/src/core/llm/snapshot-middleware.test.ts +168 -0
  586. package/src/core/llm/snapshot-middleware.ts +185 -0
  587. package/src/core/llm/state.ts +92 -0
  588. package/src/core/llm/tokens.ts +61 -0
  589. package/src/core/multi-agent.integration.test.ts +340 -0
  590. package/src/core/plugin-hooks.integration.test.ts +428 -0
  591. package/src/core/plugins/hook-types.ts +49 -0
  592. package/src/core/plugins/index.ts +52 -0
  593. package/src/core/plugins/plugin-builder.ts +967 -0
  594. package/src/core/preset/config.ts +110 -0
  595. package/src/core/preset/index.ts +11 -0
  596. package/src/core/preset/preset-builder.ts +111 -0
  597. package/src/core/session-lifecycle.integration.test.ts +202 -0
  598. package/src/core/sessions/apply-event.ts +46 -0
  599. package/src/core/sessions/context.ts +36 -0
  600. package/src/core/sessions/fork-utils.test.ts +158 -0
  601. package/src/core/sessions/fork-utils.ts +71 -0
  602. package/src/core/sessions/reducer.ts +95 -0
  603. package/src/core/sessions/schema.ts +91 -0
  604. package/src/core/sessions/session-environment.ts +12 -0
  605. package/src/core/sessions/session-manager.ts +883 -0
  606. package/src/core/sessions/session-store.ts +141 -0
  607. package/src/core/sessions/session.test.ts +1730 -0
  608. package/src/core/sessions/session.ts +833 -0
  609. package/src/core/sessions/state.ts +520 -0
  610. package/src/core/system.ts +206 -0
  611. package/src/core/tools/context.ts +3 -0
  612. package/src/core/tools/definition.ts +15 -0
  613. package/src/core/tools/executor.test.ts +160 -0
  614. package/src/core/tools/executor.ts +117 -0
  615. package/src/core/tools/index.ts +3 -0
  616. package/src/core/tools/schema.ts +80 -0
  617. package/src/core/tools/state.ts +34 -0
  618. package/src/index.ts +165 -0
  619. package/src/lib/json/index.ts +20 -0
  620. package/src/lib/logger/console.test.ts +348 -0
  621. package/src/lib/logger/console.ts +185 -0
  622. package/src/lib/logger/file.ts +65 -0
  623. package/src/lib/logger/index.ts +4 -0
  624. package/src/lib/logger/logger.ts +114 -0
  625. package/src/lib/logger/ring-buffer.ts +65 -0
  626. package/src/lib/logger/tee.ts +51 -0
  627. package/src/lib/mime.ts +23 -0
  628. package/src/lib/never.ts +3 -0
  629. package/src/lib/utils/hash.ts +38 -0
  630. package/src/lib/utils/result.ts +35 -0
  631. package/src/platform/fs.ts +38 -0
  632. package/src/platform/index.ts +23 -0
  633. package/src/platform/process.ts +28 -0
  634. package/src/plugins/agent-status/plugin.ts +77 -0
  635. package/src/plugins/agents/agents.integration.test.ts +808 -0
  636. package/src/plugins/agents/index.ts +2 -0
  637. package/src/plugins/agents/plugin.ts +242 -0
  638. package/src/plugins/context-compact/context-compact.integration.test.ts +207 -0
  639. package/src/plugins/context-compact/context-compactor.test.ts +923 -0
  640. package/src/plugins/context-compact/context-compactor.ts +343 -0
  641. package/src/plugins/context-compact/history-offloader.test.ts +100 -0
  642. package/src/plugins/context-compact/history-offloader.ts +47 -0
  643. package/src/plugins/context-compact/index.ts +3 -0
  644. package/src/plugins/context-compact/plugin.ts +62 -0
  645. package/src/plugins/filesystem/filesystem.integration.test.ts +485 -0
  646. package/src/plugins/filesystem/helpers.ts +216 -0
  647. package/src/plugins/filesystem/index.ts +4 -0
  648. package/src/plugins/filesystem/listing.ts +276 -0
  649. package/src/plugins/filesystem/plugin.ts +468 -0
  650. package/src/plugins/filesystem/schema.ts +6 -0
  651. package/src/plugins/git-status/index.ts +1 -0
  652. package/src/plugins/git-status/plugin.ts +166 -0
  653. package/src/plugins/limits-guard/config.ts +26 -0
  654. package/src/plugins/limits-guard/index.ts +4 -0
  655. package/src/plugins/limits-guard/limit-guard.test.ts +161 -0
  656. package/src/plugins/limits-guard/limit-guard.ts +164 -0
  657. package/src/plugins/limits-guard/limits-guard.integration.test.ts +437 -0
  658. package/src/plugins/limits-guard/plugin.ts +306 -0
  659. package/src/plugins/llm-debug/index.ts +1 -0
  660. package/src/plugins/llm-debug/llm-debug.integration.test.ts +192 -0
  661. package/src/plugins/llm-debug/plugin.ts +172 -0
  662. package/src/plugins/logs/index.ts +1 -0
  663. package/src/plugins/logs/plugin.ts +39 -0
  664. package/src/plugins/mailbox/helpers.ts +83 -0
  665. package/src/plugins/mailbox/index.ts +13 -0
  666. package/src/plugins/mailbox/mailbox.integration.test.ts +705 -0
  667. package/src/plugins/mailbox/plugin.ts +270 -0
  668. package/src/plugins/mailbox/prompts.ts +104 -0
  669. package/src/plugins/mailbox/query.ts +53 -0
  670. package/src/plugins/mailbox/schema.ts +81 -0
  671. package/src/plugins/mailbox/state.ts +52 -0
  672. package/src/plugins/resources/index.ts +11 -0
  673. package/src/plugins/resources/manifest.ts +25 -0
  674. package/src/plugins/resources/plugin.ts +201 -0
  675. package/src/plugins/resources/post-inject.ts +74 -0
  676. package/src/plugins/resources/state.ts +30 -0
  677. package/src/plugins/result-eviction/index.ts +2 -0
  678. package/src/plugins/result-eviction/plugin.ts +65 -0
  679. package/src/plugins/result-eviction/result-eviction.integration.test.ts +244 -0
  680. package/src/plugins/services/plugin.ts +485 -0
  681. package/src/plugins/services/port-pool.ts +73 -0
  682. package/src/plugins/services/prompt.ts +53 -0
  683. package/src/plugins/services/schema.ts +83 -0
  684. package/src/plugins/services/service.ts +578 -0
  685. package/src/plugins/services/services.integration.test.ts +595 -0
  686. package/src/plugins/session-lifecycle/index.ts +1 -0
  687. package/src/plugins/session-lifecycle/plugin.ts +302 -0
  688. package/src/plugins/session-lifecycle/session-lifecycle.integration.test.ts +639 -0
  689. package/src/plugins/session-state/plugin.ts +179 -0
  690. package/src/plugins/session-stats/index.ts +3 -0
  691. package/src/plugins/session-stats/plugin.ts +120 -0
  692. package/src/plugins/shell/executor.ts +462 -0
  693. package/src/plugins/shell/index.ts +23 -0
  694. package/src/plugins/shell/plugin.ts +118 -0
  695. package/src/plugins/shell/shell.integration.test.ts +273 -0
  696. package/src/plugins/shell/shell.test.ts +314 -0
  697. package/src/plugins/skills/discovery.test.ts +395 -0
  698. package/src/plugins/skills/discovery.ts +276 -0
  699. package/src/plugins/skills/index.ts +32 -0
  700. package/src/plugins/skills/plugin.ts +381 -0
  701. package/src/plugins/skills/prompts.ts +84 -0
  702. package/src/plugins/skills/schema.ts +88 -0
  703. package/src/plugins/skills/skills.integration.test.ts +580 -0
  704. package/src/plugins/snapshotting/index.ts +3 -0
  705. package/src/plugins/snapshotting/jj-snapshotter.ts +122 -0
  706. package/src/plugins/snapshotting/plugin.ts +36 -0
  707. package/src/plugins/snapshotting/snapshotter.ts +20 -0
  708. package/src/plugins/todo/index.ts +11 -0
  709. package/src/plugins/todo/plugin.ts +363 -0
  710. package/src/plugins/todo/prompts.ts +63 -0
  711. package/src/plugins/todo/schema.ts +71 -0
  712. package/src/plugins/todo/todo.integration.test.ts +687 -0
  713. package/src/plugins/uploads/index.ts +13 -0
  714. package/src/plugins/uploads/plugin.ts +406 -0
  715. package/src/plugins/uploads/preprocessor.ts +111 -0
  716. package/src/plugins/uploads/preprocessors/image-classifier.ts +176 -0
  717. package/src/plugins/uploads/preprocessors/index.ts +7 -0
  718. package/src/plugins/uploads/preprocessors/markitdown-preprocessor.ts +262 -0
  719. package/src/plugins/uploads/preprocessors/zip-preprocessor.ts +210 -0
  720. package/src/plugins/uploads/schema.ts +92 -0
  721. package/src/plugins/uploads/state.ts +42 -0
  722. package/src/plugins/uploads/uploads.integration.test.ts +654 -0
  723. package/src/plugins/user-chat/index.ts +17 -0
  724. package/src/plugins/user-chat/plugin.ts +728 -0
  725. package/src/plugins/user-chat/prompts.ts +30 -0
  726. package/src/plugins/user-chat/schema.ts +80 -0
  727. package/src/plugins/user-chat/user-chat.integration.test.ts +794 -0
  728. package/src/plugins/workers/context.ts +251 -0
  729. package/src/plugins/workers/definition.ts +169 -0
  730. package/src/plugins/workers/index.ts +21 -0
  731. package/src/plugins/workers/plugin.ts +722 -0
  732. package/src/plugins/workers/worker.ts +115 -0
  733. package/src/plugins/workers/workers.integration.test.ts +778 -0
  734. package/src/prompts/base.ts +266 -0
  735. package/src/prompts/builder.ts +194 -0
  736. package/src/prompts/index.ts +36 -0
  737. package/src/prompts/macros.test.ts +107 -0
  738. package/src/prompts/macros.ts +27 -0
  739. package/src/testing/bootstrap-for-testing.ts +39 -0
  740. package/src/testing/index.ts +7 -0
  741. package/src/testing/node-platform.ts +80 -0
  742. package/src/testing/notification-collector.ts +100 -0
  743. package/src/testing/preset-helpers.ts +57 -0
  744. package/src/testing/test-harness.test.ts +63 -0
  745. package/src/testing/test-harness.ts +279 -0
  746. package/src/testing/wait-helpers.ts +84 -0
  747. package/src/transport/adapter/client-adapter.ts +81 -0
  748. package/src/transport/adapter/index.ts +42 -0
  749. package/src/transport/adapter/server-adapter.ts +93 -0
  750. package/src/transport/adapter/types.ts +20 -0
  751. package/src/transport/http/app.ts +129 -0
  752. package/src/transport/http/index.ts +7 -0
  753. package/src/transport/http/middleware/bearer-auth.ts +40 -0
  754. package/src/transport/http/middleware/error-handler.ts +76 -0
  755. package/src/transport/http/routes/files.ts +274 -0
  756. package/src/transport/http/routes/resources.ts +115 -0
  757. package/src/transport/http/routes/rpc.integration.test.ts +243 -0
  758. package/src/transport/http/routes/rpc.test.ts +372 -0
  759. package/src/transport/http/routes/rpc.ts +156 -0
  760. package/src/transport/http/routes/upload.ts +286 -0
  761. package/src/transport/rpc/index.ts +11 -0
  762. package/src/transport/rpc/methods.ts +38 -0
  763. package/src/user-config.ts +33 -0
@@ -0,0 +1,883 @@
1
+ /**
2
+ * SessionManager - Session lifecycle and cache management.
3
+ *
4
+ * Responsibilities:
5
+ * - Create and cache sessions
6
+ * - Load sessions from event store
7
+ * - Shutdown and cleanup
8
+ */
9
+
10
+ import { join } from 'node:path'
11
+ import z4 from 'zod/v4'
12
+ import { COMMUNICATOR_ROLE, ORCHESTRATOR_ROLE } from '~/core/agents/agent-roles.js'
13
+ import type { AgentId } from '~/core/agents/schema.js'
14
+ import { generateAgentId } from '~/core/agents/schema.js'
15
+ import { agentEvents } from '~/core/agents/state.js'
16
+ import { type DomainError, PresetErrors, SessionErrors, ValidationErrors } from '~/core/errors.js'
17
+ import { withSessionId } from '~/core/events/test-helpers.js'
18
+ import type { DomainEvent } from '~/core/events/types.js'
19
+ import type { FileStore } from '~/core/file-store/types.js'
20
+ import type { LLMLogger } from '~/core/llm/logger.js'
21
+ import type { LLMProvider } from '~/core/llm/provider.js'
22
+ import type { CallerContext, ConfiguredPlugin, ManagerMethodContext, PluginDefinition } from '~/core/plugins/plugin-builder.js'
23
+ import type { Preset } from '~/core/preset/index.js'
24
+ import type { SessionId } from '~/core/sessions/schema.js'
25
+ import { generateSessionId } from '~/core/sessions/schema.js'
26
+ import type { SessionCreatedEvent } from '~/core/sessions/state.js'
27
+ import { checkRecoveryNeeded, isSessionCreatedEvent, reconstructSessionState, sessionEvents } from '~/core/sessions/state.js'
28
+ import type { ToolExecutor } from '~/core/tools'
29
+ import { FileLogger } from '~/lib/logger/file.js'
30
+ import type { Logger } from '~/lib/logger/logger.js'
31
+ import { TeeLogger } from '~/lib/logger/tee.js'
32
+ import type { Platform } from '~/platform/index.js'
33
+ import type { Result } from '~/lib/utils/result.js'
34
+ import { Err, Ok } from '~/lib/utils/result.js'
35
+ import type { SpawnableAgentInfo } from '~/plugins/agents/index.js'
36
+ import { getAgentUnconsumedMailbox, selectMailboxState } from '~/plugins/mailbox/query.js'
37
+ import type { PortPool } from '~/plugins/services/port-pool.js'
38
+ import type { ServiceConfig } from '~/plugins/services/schema.js'
39
+ import { selectSessionStats, type SessionStatsState } from '~/plugins/session-stats/index.js'
40
+ import type { PreprocessorRegistry } from '~/plugins/uploads/preprocessor.js'
41
+ import { EventStore } from '../events/event-store.js'
42
+ import { createApplyEvent } from './apply-event.js'
43
+ import { rewriteEventsForFork } from './fork-utils.js'
44
+ import { SessionStore } from './session-store.js'
45
+ import { Session, type UserOutputCallback } from './session.js'
46
+
47
+ // ============================================================================
48
+ // Errors
49
+ // ============================================================================
50
+
51
+ /**
52
+ * Internal error for session loading failures.
53
+ * Wraps DomainError for proper error handling in async loading.
54
+ */
55
+ class SessionLoadError extends Error {
56
+ constructor(public readonly domainError: DomainError) {
57
+ super(`Session load error: ${domainError.type}`)
58
+ this.name = 'SessionLoadError'
59
+ }
60
+ }
61
+
62
+ // ============================================================================
63
+ // SessionManager
64
+ // ============================================================================
65
+
66
+ export interface SessionManagerOptions {
67
+ eventStore: EventStore
68
+ llmProvider: LLMProvider
69
+ /** Named provider instances for middleware routing */
70
+ llmProviders?: ReadonlyMap<string, LLMProvider>
71
+ toolExecutor: ToolExecutor
72
+ presets: Map<string, Preset>
73
+ logger: Logger
74
+ basePath: string
75
+ dataFileStore: FileStore
76
+ onUserOutput?: UserOutputCallback
77
+ preprocessorRegistry?: PreprocessorRegistry
78
+ llmLogger?: LLMLogger
79
+ portPool?: PortPool
80
+ /** Host-environment adapters (filesystem, process). */
81
+ platform: Platform
82
+ systemPlugins?: readonly PluginDefinition<string, any, any, any, any>[]
83
+ }
84
+
85
+ /**
86
+ * SessionManager manages session lifecycle and caching.
87
+ */
88
+ export class SessionManager {
89
+ private readonly sessions = new Map<SessionId, Promise<Session>>()
90
+ /** Unsubscribe functions for session event listeners, keyed by sessionId */
91
+ private readonly sessionListenerCleanup = new Map<SessionId, () => void>()
92
+ /** Manager-level methods collected from plugin definitions across all presets */
93
+ private readonly managerMethods: Map<string, {
94
+ input: z4.ZodType
95
+ output: z4.ZodType
96
+ handler: (ctx: ManagerMethodContext, input: unknown) => Promise<Result<unknown, DomainError>>
97
+ }>
98
+
99
+ private readonly eventStore: EventStore
100
+ private readonly llmProvider: LLMProvider
101
+ private readonly llmProviders: ReadonlyMap<string, LLMProvider>
102
+ private readonly toolExecutor: ToolExecutor
103
+ private readonly presets: Map<string, Preset>
104
+ private readonly logger: Logger
105
+ private readonly basePath: string
106
+ private readonly dataFileStore: FileStore
107
+ private readonly onUserOutput?: UserOutputCallback
108
+ private readonly preprocessorRegistry?: PreprocessorRegistry
109
+ private readonly llmLogger?: LLMLogger
110
+ private readonly portPool?: PortPool
111
+ private readonly platform: Platform
112
+ private readonly systemPlugins: readonly PluginDefinition<string, any, any, any, any>[]
113
+
114
+ constructor(options: SessionManagerOptions) {
115
+ this.eventStore = options.eventStore
116
+ this.llmProvider = options.llmProvider
117
+ this.llmProviders = options.llmProviders ?? new Map()
118
+ this.toolExecutor = options.toolExecutor
119
+ this.presets = options.presets
120
+ this.logger = options.logger
121
+ this.basePath = options.basePath
122
+ this.dataFileStore = options.dataFileStore
123
+ this.onUserOutput = options.onUserOutput
124
+ this.preprocessorRegistry = options.preprocessorRegistry
125
+ this.llmLogger = options.llmLogger
126
+ this.portPool = options.portPool
127
+ this.platform = options.platform
128
+ this.systemPlugins = options.systemPlugins ?? []
129
+ this.managerMethods = this.collectManagerMethods()
130
+ }
131
+
132
+ /** Expose platform adapters (used by Session for building contexts). */
133
+ getPlatform(): Platform {
134
+ return this.platform
135
+ }
136
+
137
+ /**
138
+ * Create a new session with the given preset.
139
+ */
140
+ async createSession(
141
+ presetId: string,
142
+ options?: { workspaceDir?: string; sessionId?: string },
143
+ ): Promise<Result<Session, DomainError>> {
144
+ const preset = this.presets.get(presetId)
145
+ if (!preset) {
146
+ return Err(PresetErrors.notFound(presetId))
147
+ }
148
+
149
+ const sessionId = options?.sessionId ? (options.sessionId as any) : generateSessionId()
150
+ // First orchestrator gets seq 1
151
+ const orchestratorId = generateAgentId(ORCHESTRATOR_ROLE, 1)
152
+
153
+ // Resolve workspaceDir: API input overrides preset default
154
+ // Interpolate {sessionId} placeholder if present
155
+ const rawWorkspaceDir = options?.workspaceDir ?? preset.workspaceDir
156
+ const workspaceDir = rawWorkspaceDir?.replace('{sessionId}', String(sessionId))
157
+
158
+ this.logger.info('Creating session', {
159
+ sessionId,
160
+ presetId,
161
+ optionsWorkspaceDir: options?.workspaceDir ?? null,
162
+ presetWorkspaceDir: preset.workspaceDir ?? null,
163
+ resolvedWorkspaceDir: workspaceDir ?? null,
164
+ })
165
+
166
+ const events: DomainEvent[] = [
167
+ withSessionId(
168
+ sessionId,
169
+ sessionEvents.create('session_created', {
170
+ presetId,
171
+ ...(workspaceDir ? { workspaceDir } : {}),
172
+ }),
173
+ ),
174
+ withSessionId(
175
+ sessionId,
176
+ agentEvents.create('agent_spawned', {
177
+ agentId: orchestratorId,
178
+ definitionName: ORCHESTRATOR_ROLE,
179
+ parentId: null,
180
+ }),
181
+ ),
182
+ ]
183
+
184
+ // Spawn communicator if configured
185
+ const hasCommunicator = !!preset.communicator
186
+
187
+ if (hasCommunicator) {
188
+ // First communicator gets seq 1
189
+ const communicatorId = generateAgentId(COMMUNICATOR_ROLE, 1)
190
+ events.push(withSessionId(
191
+ sessionId,
192
+ agentEvents.create('agent_spawned', {
193
+ agentId: communicatorId,
194
+ definitionName: COMMUNICATOR_ROLE,
195
+ parentId: null,
196
+ }),
197
+ ))
198
+
199
+ // Link communicator to orchestrator
200
+ events.push(withSessionId(
201
+ sessionId,
202
+ agentEvents.create('communicator_linked', {
203
+ communicatorId,
204
+ orchestratorId,
205
+ }),
206
+ ))
207
+ }
208
+
209
+ // Write events to event store
210
+ await this.eventStore.appendBatch(sessionId, events)
211
+
212
+ // Build plugins and composed reducer so plugin state slices are applied
213
+ const plugins = this.buildPlugins(preset)
214
+ const composedReducer = createApplyEvent(plugins)
215
+
216
+ // Reconstruct state with composed reducer (includes plugin state slices)
217
+ const state = reconstructSessionState(events, composedReducer)
218
+ if (!state) {
219
+ return Err(ValidationErrors.invalid('Failed to reconstruct session'))
220
+ }
221
+
222
+ // Create store and session (initPluginContexts + onSessionReady hooks run inside)
223
+ const store = new SessionStore(sessionId, this.eventStore, state, composedReducer)
224
+ const session = await this.createSessionInstance(store, preset, plugins)
225
+
226
+ // Cache session (wrap in resolved promise for consistency)
227
+ this.sessions.set(sessionId, Promise.resolve(session))
228
+
229
+ this.logger.info('Session created', {
230
+ sessionId,
231
+ presetId,
232
+ hasCommunicator,
233
+ })
234
+
235
+ return Ok(session)
236
+ }
237
+
238
+ /**
239
+ * Fork a session from a specific event index into a new independent session.
240
+ * The forked session gets a copy of all events up to the fork point.
241
+ */
242
+ async forkSession(
243
+ sourceSessionId: SessionId,
244
+ eventIndex: number,
245
+ ): Promise<Result<Session, DomainError>> {
246
+ // Load source events
247
+ const sourceEvents = await this.eventStore.load(sourceSessionId)
248
+ if (sourceEvents.length === 0) {
249
+ return Err(SessionErrors.notFound(String(sourceSessionId)))
250
+ }
251
+
252
+ // Validate eventIndex range
253
+ if (eventIndex < 0 || eventIndex >= sourceEvents.length) {
254
+ return Err(ValidationErrors.invalid(`eventIndex ${eventIndex} out of range [0, ${sourceEvents.length - 1}]`))
255
+ }
256
+
257
+ // Get source preset
258
+ const firstEvent = sourceEvents[0]
259
+ if (!isSessionCreatedEvent(firstEvent)) {
260
+ return Err(ValidationErrors.invalid('First event must be session_created'))
261
+ }
262
+ const preset = this.presets.get(firstEvent.presetId)
263
+ if (!preset) {
264
+ return Err(PresetErrors.notFound(firstEvent.presetId))
265
+ }
266
+
267
+ // Generate new session ID
268
+ const newSessionId = generateSessionId()
269
+
270
+ // Resolve workspace dir for the new session
271
+ const rawWorkspaceDir = preset.workspaceDir
272
+ const sourceWorkspaceDir = firstEvent.workspaceDir
273
+
274
+ if (sourceWorkspaceDir && rawWorkspaceDir && !rawWorkspaceDir.includes('{sessionId}')) {
275
+ return Err(
276
+ ValidationErrors.invalid(
277
+ 'Cannot fork: preset workspaceDir has no {sessionId} placeholder, forked session would share the same workspace directory',
278
+ ),
279
+ )
280
+ }
281
+
282
+ const newWorkspaceDir = rawWorkspaceDir?.replace('{sessionId}', String(newSessionId))
283
+
284
+ // Rewrite events for the fork
285
+ let forkedEvents = rewriteEventsForFork(sourceEvents, eventIndex, newSessionId, sourceSessionId)
286
+
287
+ // Update workspaceDir in session_created if it changed
288
+ if (newWorkspaceDir !== sourceWorkspaceDir) {
289
+ forkedEvents = forkedEvents.map((event) => {
290
+ if (event.type === 'session_created') {
291
+ return { ...event, workspaceDir: newWorkspaceDir }
292
+ }
293
+ return event
294
+ })
295
+ }
296
+
297
+ // Write forked events to event store
298
+ await this.eventStore.appendBatch(newSessionId, forkedEvents)
299
+
300
+ // Build plugins and composed reducer so plugin state slices are applied
301
+ const plugins = this.buildPlugins(preset)
302
+ const composedReducer = createApplyEvent(plugins)
303
+
304
+ // Reconstruct state with composed reducer (includes plugin state slices)
305
+ const state = reconstructSessionState(forkedEvents, composedReducer)
306
+ if (!state) {
307
+ return Err(ValidationErrors.invalid('Failed to reconstruct forked session'))
308
+ }
309
+
310
+ // Create store
311
+ const store = new SessionStore(newSessionId, this.eventStore, state, composedReducer)
312
+
313
+ // Normalize stuck agents via session_restarted event
314
+ const recoveryData = checkRecoveryNeeded(state)
315
+ if (recoveryData) {
316
+ await store.emit(withSessionId(
317
+ newSessionId,
318
+ sessionEvents.create('session_restarted', {
319
+ resetAgentIds: recoveryData.resetAgentIds,
320
+ clearedToolAgentIds: recoveryData.clearedToolAgentIds,
321
+ }),
322
+ ))
323
+ }
324
+
325
+ // Create session instance (auto-start services run via onSessionReady)
326
+ const session = await this.createSessionInstance(store, preset, plugins)
327
+
328
+ // Check for pending agents
329
+ session.checkPendingAgents()
330
+
331
+ // Cache session
332
+ this.sessions.set(newSessionId, Promise.resolve(session))
333
+
334
+ this.logger.info('Session forked', {
335
+ sourceSessionId,
336
+ newSessionId,
337
+ eventIndex,
338
+ })
339
+
340
+ return Ok(session)
341
+ }
342
+
343
+ /**
344
+ * Get a session by ID - from cache or load from event store.
345
+ */
346
+ async getSession(
347
+ sessionId: SessionId,
348
+ ): Promise<Result<Session, DomainError>> {
349
+ // Check cache first
350
+ const cached = this.sessions.get(sessionId)
351
+ if (cached) {
352
+ try {
353
+ return Ok(await cached)
354
+ } catch (error) {
355
+ // Previous load failed, remove from cache and try again
356
+ this.sessions.delete(sessionId)
357
+ if (error instanceof SessionLoadError) {
358
+ return Err(error.domainError)
359
+ }
360
+ throw error
361
+ }
362
+ }
363
+
364
+ // Store promise immediately to prevent concurrent loads
365
+ const loadPromise = this.loadSession(sessionId)
366
+ this.sessions.set(sessionId, loadPromise)
367
+
368
+ try {
369
+ return Ok(await loadPromise)
370
+ } catch (error) {
371
+ this.sessions.delete(sessionId)
372
+ if (error instanceof SessionLoadError) {
373
+ return Err(error.domainError)
374
+ }
375
+ throw error
376
+ }
377
+ }
378
+
379
+ /**
380
+ * Internal session loading - throws SessionLoadError on domain errors.
381
+ */
382
+ private async loadSession(sessionId: SessionId): Promise<Session> {
383
+ // We need to peek at events first to determine the preset, so we can build plugins
384
+ // and compose the reducer before loading the store
385
+ const events = await this.eventStore.load(sessionId)
386
+ if (events.length === 0) {
387
+ throw new SessionLoadError(SessionErrors.notFound(String(sessionId)))
388
+ }
389
+
390
+ const firstEvent = events[0]
391
+ if (!isSessionCreatedEvent(firstEvent)) {
392
+ throw new SessionLoadError(SessionErrors.notFound(String(sessionId)))
393
+ }
394
+
395
+ const preset = this.presets.get(firstEvent.presetId)
396
+ if (!preset) {
397
+ throw new SessionLoadError(PresetErrors.notFound(firstEvent.presetId))
398
+ }
399
+
400
+ // Build plugins and composed reducer so plugin state slices are applied
401
+ const plugins = this.buildPlugins(preset)
402
+ const composedReducer = createApplyEvent(plugins)
403
+
404
+ // Load store with composed reducer
405
+ const store = await SessionStore.load(sessionId, this.eventStore, composedReducer)
406
+ if (!store) {
407
+ throw new SessionLoadError(SessionErrors.notFound(String(sessionId)))
408
+ }
409
+
410
+ const state = store.getState()
411
+
412
+ // Don't cache closed sessions
413
+ if (state.status === 'closed') {
414
+ // Remove from cache since we don't cache closed sessions
415
+ this.sessions.delete(sessionId)
416
+ // Skip onSessionReady hooks — closed sessions are immutable, firing hooks
417
+ // would emit events to a sealed event log on every read / restart.
418
+ return await this.createSessionInstance(store, preset, plugins, { skipReadyHooks: true })
419
+ }
420
+
421
+ // Check if recovery is needed after restart
422
+ const recoveryData = checkRecoveryNeeded(state)
423
+ if (recoveryData) {
424
+ await store.emit(withSessionId(
425
+ sessionId,
426
+ sessionEvents.create('session_restarted', {
427
+ resetAgentIds: recoveryData.resetAgentIds,
428
+ clearedToolAgentIds: recoveryData.clearedToolAgentIds,
429
+ }),
430
+ ))
431
+
432
+ this.logger.info('Session recovered after restart', {
433
+ sessionId,
434
+ resetAgents: recoveryData.resetAgentIds.length,
435
+ clearedToolAgents: recoveryData.clearedToolAgentIds.length,
436
+ })
437
+ }
438
+
439
+ // Create session (auto-start services run via onSessionReady)
440
+ const session = await this.createSessionInstance(store, preset, plugins)
441
+
442
+ // Check for pending agents
443
+ session.checkPendingAgents()
444
+
445
+ return session
446
+ }
447
+
448
+ /**
449
+ * Call a plugin method on a session.
450
+ * @param sessionId - Session ID
451
+ * @param method - Full method name (e.g., "services.start")
452
+ * @param input - Method input (must include sessionId field)
453
+ * @param agentId - Agent ID (optional — some methods don't operate on a specific agent)
454
+ */
455
+ async callPluginMethod(
456
+ sessionId: SessionId,
457
+ method: string,
458
+ input: unknown,
459
+ agentId?: AgentId,
460
+ caller?: CallerContext,
461
+ ): Promise<Result<unknown, DomainError>> {
462
+ const sessionResult = await this.getSession(sessionId)
463
+ if (!sessionResult.ok) return sessionResult
464
+
465
+ return sessionResult.value.callPluginMethod(method, input, agentId, caller)
466
+ }
467
+
468
+ /**
469
+ * Call a manager-level plugin method.
470
+ * These methods operate outside session context (e.g., session creation, listing).
471
+ */
472
+ async callManagerMethod(
473
+ method: string,
474
+ input: unknown,
475
+ ): Promise<Result<unknown, DomainError>> {
476
+ const methodDef = this.managerMethods.get(method)
477
+ if (!methodDef) {
478
+ return Err(ValidationErrors.invalid(`Unknown manager method: ${method}`))
479
+ }
480
+
481
+ const parsed = methodDef.input.safeParse(input)
482
+ if (!parsed.success) {
483
+ return Err(ValidationErrors.invalid(`Invalid input for ${method}: ${parsed.error.message}`))
484
+ }
485
+
486
+ const ctx: ManagerMethodContext = {
487
+ sessionManager: this,
488
+ eventStore: this.eventStore,
489
+ presets: this.presets,
490
+ logger: this.logger.child({ method }),
491
+ llmLogger: this.llmLogger,
492
+ platform: this.platform,
493
+ }
494
+
495
+ return await methodDef.handler(ctx, parsed.data)
496
+ }
497
+
498
+ /**
499
+ * Get all registered manager methods.
500
+ */
501
+ getManagerMethods(): Map<string, { input: z4.ZodType; output: z4.ZodType }> {
502
+ const result = new Map<string, { input: z4.ZodType; output: z4.ZodType }>()
503
+ for (const [name, def] of this.managerMethods) {
504
+ result.set(name, { input: def.input, output: def.output })
505
+ }
506
+ return result
507
+ }
508
+
509
+ /**
510
+ * Load all active sessions from event store (for restart recovery).
511
+ *
512
+ * Closed sessions are skipped — they have no runtime to restore. Loading them
513
+ * would trigger callSessionReadyHooks and emit events to an immutable session log,
514
+ * causing write amplification on every agent startup.
515
+ */
516
+ async loadAllSessions(): Promise<void> {
517
+ const sessionIds = await this.eventStore.listSessions()
518
+
519
+ let loaded = 0
520
+ let skipped = 0
521
+ for (const sessionId of sessionIds) {
522
+ try {
523
+ const metadata = await this.eventStore.getMetadata(sessionId)
524
+ if (metadata?.status === 'closed') {
525
+ skipped++
526
+ continue
527
+ }
528
+ await this.getSession(sessionId)
529
+ loaded++
530
+ } catch (error) {
531
+ this.logger.error(
532
+ 'Failed to load session',
533
+ error instanceof Error ? error : new Error(String(error)),
534
+ { sessionId },
535
+ )
536
+ }
537
+ }
538
+
539
+ this.logger.info('Loaded sessions', { loaded, skipped, total: sessionIds.length })
540
+ }
541
+
542
+ /**
543
+ * Get runtime stats including last activity timestamp and per-session metrics.
544
+ *
545
+ * Only open (non-closed) sessions contribute to activity metrics. Closed sessions
546
+ * are immutable artifacts — their event log timestamps must not be interpreted as
547
+ * "the sandbox is doing work", otherwise the worker alarm sees stale activity and
548
+ * keeps the sandbox alive forever.
549
+ */
550
+ async getStats(): Promise<{
551
+ sessionCount: number
552
+ pendingAgents: number
553
+ processingAgents: number
554
+ lastActivityAt: number | null
555
+ sessions: Array<{
556
+ id: SessionId
557
+ presetId: string
558
+ status: string
559
+ metrics: SessionStatsState
560
+ }>
561
+ }> {
562
+ let pendingAgents = 0
563
+ let processingAgents = 0
564
+ let lastActivityAt: number | null = null
565
+
566
+ // Wait for all sessions, ignoring failures
567
+ const sessions = await Promise.all(
568
+ Array.from(this.sessions.values()).map((p) => p.catch(() => null)),
569
+ )
570
+
571
+ // Filter out closed sessions — they do not contribute to activity
572
+ const openSessions = sessions.filter(
573
+ (s): s is Session => s !== null && s.state.status !== 'closed',
574
+ )
575
+
576
+ // Fetch metadata only for open sessions
577
+ const metadataResults = await Promise.all(
578
+ openSessions.map((s) => this.eventStore.getMetadata(s.state.id).catch(() => null)),
579
+ )
580
+
581
+ for (const metadata of metadataResults) {
582
+ if (metadata?.lastActivityAt) {
583
+ if (
584
+ lastActivityAt === null
585
+ || metadata.lastActivityAt > lastActivityAt
586
+ ) {
587
+ lastActivityAt = metadata.lastActivityAt
588
+ }
589
+ }
590
+ }
591
+
592
+ const sessionStats: Array<{
593
+ id: SessionId
594
+ presetId: string
595
+ status: string
596
+ metrics: SessionStatsState
597
+ }> = []
598
+
599
+ for (const session of openSessions) {
600
+ for (const [agentId, agentState] of session.state.agents) {
601
+ if (agentState.status === 'pending') {
602
+ const hasUnconsumed = getAgentUnconsumedMailbox(selectMailboxState(session.state), agentId).length > 0
603
+ if (hasUnconsumed) {
604
+ pendingAgents++
605
+ }
606
+ }
607
+ if (
608
+ agentState.status === 'inferring'
609
+ || agentState.status === 'tool_exec'
610
+ ) {
611
+ processingAgents++
612
+ }
613
+ }
614
+
615
+ sessionStats.push({
616
+ id: session.state.id,
617
+ presetId: session.state.presetId,
618
+ status: session.state.status,
619
+ metrics: selectSessionStats(session.state),
620
+ })
621
+ }
622
+
623
+ return {
624
+ sessionCount: openSessions.length,
625
+ pendingAgents,
626
+ processingAgents,
627
+ lastActivityAt,
628
+ sessions: sessionStats,
629
+ }
630
+ }
631
+
632
+ /**
633
+ * Shutdown - clean up all sessions.
634
+ */
635
+ async shutdown(): Promise<void> {
636
+ // Wait for all sessions, ignoring failures
637
+ const sessions = await Promise.all(
638
+ Array.from(this.sessions.values()).map((p) => p.catch(() => null)),
639
+ )
640
+
641
+ for (const session of sessions) {
642
+ if (session) {
643
+ session.shutdown()
644
+ }
645
+ }
646
+ this.sessions.clear()
647
+ for (const cleanup of this.sessionListenerCleanup.values()) {
648
+ cleanup()
649
+ }
650
+ this.sessionListenerCleanup.clear()
651
+ this.logger.info('SessionManager shutdown complete')
652
+ }
653
+
654
+ // ============================================================================
655
+ // Private methods
656
+ // ============================================================================
657
+
658
+ /**
659
+ * Build ConfiguredPlugin[] for a session.
660
+ *
661
+ * Iterates all system-registered plugins. For each:
662
+ * 1. Check if preset has explicit SessionPluginConfig → use that config
663
+ * 2. If not, try auto-deriving infrastructure config (agents, uploads, services)
664
+ * 3. If no config at all → call .create() with no args (void config)
665
+ * 4. Check isSessionEnabled — skip plugin if not enabled
666
+ */
667
+ private buildPlugins(preset: Preset): ConfiguredPlugin[] {
668
+ // Build a lookup from preset Sessionplugins
669
+ const presetConfigs = new Map<string, unknown>()
670
+ for (const pluginConfig of preset.plugins ?? []) {
671
+ presetConfigs.set(pluginConfig.pluginName, pluginConfig.config)
672
+ }
673
+
674
+ // Build infra-derived configs
675
+ const infraConfigs = this.buildInfraConfigs(preset)
676
+
677
+ const plugins: ConfiguredPlugin[] = []
678
+
679
+ for (const pluginDef of this.systemPlugins) {
680
+ // Determine config: preset explicit > infra auto-derived > no config (void)
681
+ let config: unknown
682
+ let hasConfig = false
683
+
684
+ if (presetConfigs.has(pluginDef.name)) {
685
+ config = presetConfigs.get(pluginDef.name)
686
+ hasConfig = true
687
+ } else if (infraConfigs.has(pluginDef.name)) {
688
+ config = infraConfigs.get(pluginDef.name)
689
+ hasConfig = true
690
+ }
691
+
692
+ const configured = hasConfig
693
+ ? pluginDef.create(config)
694
+ : pluginDef.create()
695
+
696
+ // Check isSessionEnabled — skip plugin if not enabled
697
+ if (configured.isSessionEnabled && !configured.isSessionEnabled({ pluginConfig: config })) {
698
+ continue
699
+ }
700
+
701
+ plugins.push(configured)
702
+ }
703
+
704
+ // Process preset-only plugins (not registered as system plugins)
705
+ const registeredNames = new Set(plugins.map(p => p.name))
706
+ for (const pluginConfig of preset.plugins ?? []) {
707
+ if (registeredNames.has(pluginConfig.pluginName)) continue
708
+
709
+ const configured = pluginConfig.definition.create(pluginConfig.config)
710
+
711
+ if (configured.isSessionEnabled && !configured.isSessionEnabled({ pluginConfig: pluginConfig.config })) {
712
+ continue
713
+ }
714
+
715
+ plugins.push(configured)
716
+ registeredNames.add(configured.name)
717
+ }
718
+
719
+ // Validate that all declared dependencies are registered
720
+ for (const plugin of plugins) {
721
+ for (const depName of plugin.dependencyNames) {
722
+ if (!registeredNames.has(depName)) {
723
+ throw new Error(
724
+ `Plugin "${plugin.name}" declares dependency on "${depName}", but "${depName}" is not registered. Add it to systemPlugins.`,
725
+ )
726
+ }
727
+ }
728
+ }
729
+
730
+ return plugins
731
+ }
732
+
733
+ /**
734
+ * Build infrastructure-derived plugin configs from preset data.
735
+ * These are auto-derived for well-known plugins that need preset-level data.
736
+ */
737
+ private buildInfraConfigs(preset: Preset): Map<string, unknown> {
738
+ const configs = new Map<string, unknown>()
739
+
740
+ // agents plugin — derive agentDefinitions from preset.agents
741
+ const agentDefinitions = new Map<string, SpawnableAgentInfo>()
742
+ for (const agentDef of preset.agents) {
743
+ agentDefinitions.set(agentDef.name, {
744
+ name: agentDef.name,
745
+ inputSchema: agentDef.input,
746
+ })
747
+ }
748
+ configs.set('agents', { agentDefinitions })
749
+
750
+ // user-chat plugin — empty config
751
+ configs.set('user-chat', {})
752
+
753
+ // uploads plugin — needs dataFileStore and preprocessorRegistry from SessionManager
754
+ configs.set('uploads', {
755
+ dataFileStore: this.dataFileStore,
756
+ preprocessorRegistry: this.preprocessorRegistry,
757
+ })
758
+
759
+ // services plugin — collect services from all agent definitions
760
+ const allAgentConfigs = [preset.orchestrator, ...(preset.communicator ? [preset.communicator] : []), ...preset.agents]
761
+ const servicesByType = new Map<string, ServiceConfig>()
762
+ for (const agentConfig of allAgentConfigs) {
763
+ for (const svc of agentConfig.services ?? []) {
764
+ servicesByType.set(svc.type, svc)
765
+ }
766
+ }
767
+ if (servicesByType.size > 0 && this.portPool) {
768
+ configs.set('services', { services: [...servicesByType.values()], portPool: this.portPool })
769
+ }
770
+
771
+ return configs
772
+ }
773
+
774
+ /**
775
+ * Create a Session instance with all dependencies.
776
+ * Plugins must be pre-built via buildPlugins() so the composed reducer
777
+ * can be used for SessionStore before this method is called.
778
+ *
779
+ * @param opts.skipReadyHooks - Skip onSessionReady hooks. Used for closed sessions,
780
+ * which must remain immutable: running hooks would emit session_handler_* events
781
+ * to a sealed event log on every introspection / restart cycle.
782
+ */
783
+ private async createSessionInstance(
784
+ store: SessionStore,
785
+ preset: Preset,
786
+ plugins: ConfiguredPlugin[],
787
+ opts: { skipReadyHooks?: boolean } = {},
788
+ ): Promise<Session> {
789
+ // Only register cache eviction listener for active sessions (not closed)
790
+ if (store.getState().status !== 'closed') {
791
+ this.registerSessionEventListener(store.sessionId, store)
792
+ }
793
+
794
+ const sessionDir = this.getSessionDir(store.sessionId)
795
+ const sessionLogger = new TeeLogger([
796
+ this.logger.child({ sessionId: store.sessionId }),
797
+ new FileLogger(join(sessionDir, 'session.log'), this.platform.fs, { sessionId: String(store.sessionId) }),
798
+ ])
799
+
800
+ // Create session
801
+ const session = new Session({
802
+ store,
803
+ preset,
804
+ llmProvider: this.llmProvider,
805
+ llmProviders: this.llmProviders,
806
+ toolExecutor: this.toolExecutor,
807
+ logger: sessionLogger,
808
+ onUserOutput: this.onUserOutput,
809
+ sessionDir,
810
+ plugins,
811
+ eventStore: this.eventStore,
812
+ llmLogger: this.llmLogger,
813
+ platform: this.platform,
814
+ })
815
+
816
+ // Ensure session and workspace directories exist before plugins run
817
+ await this.platform.fs.mkdir(sessionDir, { recursive: true })
818
+ const workspaceDir = store.getState().workspaceDir
819
+ if (workspaceDir) {
820
+ await this.platform.fs.mkdir(workspaceDir, { recursive: true })
821
+ }
822
+
823
+ // Initialize plugin contexts (calls createContext for each plugin).
824
+ // Safe for closed sessions — createContext is pure local setup, no event emit.
825
+ await session.initPluginContexts()
826
+
827
+ // Call onSessionReady hooks with full context.
828
+ // Skipped for closed sessions to preserve event log immutability.
829
+ if (!opts.skipReadyHooks) {
830
+ await session.callSessionReadyHooks()
831
+ }
832
+
833
+ return session
834
+ }
835
+
836
+ /**
837
+ * Collect manager methods from all system plugin definitions.
838
+ */
839
+ private collectManagerMethods(): Map<string, {
840
+ input: z4.ZodType
841
+ output: z4.ZodType
842
+ handler: (ctx: ManagerMethodContext, input: unknown) => Promise<Result<unknown, DomainError>>
843
+ }> {
844
+ const methods = new Map<string, {
845
+ input: z4.ZodType
846
+ output: z4.ZodType
847
+ handler: (ctx: ManagerMethodContext, input: unknown) => Promise<Result<unknown, DomainError>>
848
+ }>()
849
+
850
+ for (const pluginDef of this.systemPlugins) {
851
+ for (const [methodName, methodDef] of Object.entries(pluginDef.managerMethods)) {
852
+ methods.set(`${pluginDef.name}.${methodName}`, methodDef)
853
+ }
854
+ }
855
+
856
+ return methods
857
+ }
858
+
859
+ /**
860
+ * Register event listener on a session's store for automatic cache eviction.
861
+ * When session_closed or session_reopened events fire, the session is evicted
862
+ * so next getSession() triggers a full load with recovery.
863
+ *
864
+ * Cleans up any previous listener for this sessionId (from a prior load)
865
+ * to prevent duplicate listeners firing on old stores.
866
+ */
867
+ private registerSessionEventListener(sessionId: SessionId, store: SessionStore): void {
868
+ const prevCleanup = this.sessionListenerCleanup.get(sessionId)
869
+ if (prevCleanup) prevCleanup()
870
+
871
+ const unsubscribe = store.onEvent((event) => {
872
+ if (event.type === 'session_closed' || event.type === 'session_reopened') {
873
+ this.sessions.delete(sessionId)
874
+ this.sessionListenerCleanup.delete(sessionId)
875
+ }
876
+ })
877
+ this.sessionListenerCleanup.set(sessionId, unsubscribe)
878
+ }
879
+
880
+ private getSessionDir(sessionId: SessionId): string {
881
+ return join(this.basePath, 'sessions', String(sessionId))
882
+ }
883
+ }