@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,833 @@
1
+ /**
2
+ * Session - OOP wrapper for session management.
3
+ *
4
+ * Responsibilities:
5
+ * - Factory for agents
6
+ * - User output callback
7
+ * - Plugin method aggregation
8
+ */
9
+
10
+ import z4 from 'zod/v4'
11
+ import { COMMUNICATOR_ROLE, ORCHESTRATOR_ROLE } from '~/core/agents/agent-roles.js'
12
+ import { AgentId, generateAgentId } from '~/core/agents/schema.js'
13
+ import type { AgentState } from '~/core/agents/state.js'
14
+ import { agentEvents, getChildren } from '~/core/agents/state.js'
15
+ import { AgentErrors, type DomainError, SessionErrors, ValidationErrors } from '~/core/errors.js'
16
+ import { withSessionId } from '~/core/events/test-helpers.js'
17
+ import type { DomainEvent } from '~/core/events/types.js'
18
+ import type { LLMLogger } from '~/core/llm/logger.js'
19
+ import { applyMiddleware, type LLMMiddleware } from '~/core/llm/middleware.js'
20
+ import type { LLMProvider } from '~/core/llm/provider.js'
21
+ import type { AgentPluginConfig, BaseSessionHookContext, CallerContext, ConfiguredPlugin } from '~/core/plugins/plugin-builder.js'
22
+ import { AGENT_CALLER, DEFAULT_CALLER, buildPluginDeps, type PluginNotification } 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 type { SessionState } from '~/core/sessions/state.js'
26
+ import { getEntryAgentId, getNextAgentSeq, sessionEvents } from '~/core/sessions/state.js'
27
+ import type { Logger } from '~/lib/logger/logger.js'
28
+ import type { Platform } from '~/platform/index.js'
29
+ import type { Result } from '~/lib/utils/result.js'
30
+ import { Err, Ok } from '~/lib/utils/result.js'
31
+ import { getNextMessageSeq, selectMailboxState } from '~/plugins/mailbox/query.js'
32
+ import type { MessageId } from '~/plugins/mailbox/schema.js'
33
+ import { generateMessageId } from '~/plugins/mailbox/schema.js'
34
+ import { mailboxEvents } from '~/plugins/mailbox/state.js'
35
+ import { Agent, type AgentConfig } from '../agents/agent.js'
36
+ import type { EventStore } from '../events/event-store.js'
37
+ import type { BaseEvent } from '../events/types.js'
38
+ import { SessionFileStore } from '../file-store/file-store.js'
39
+ import type { SessionContext } from '../sessions/context.js'
40
+ import type { SessionEnvironment } from '../sessions/session-environment.js'
41
+ import type { ToolExecutor } from '../tools/executor.js'
42
+ import { SessionStore } from './session-store.js'
43
+
44
+ // ============================================================================
45
+ // Types
46
+ // ============================================================================
47
+
48
+ /**
49
+ * Callback for user-facing output.
50
+ * Receives plugin notifications that are broadcast to connected clients.
51
+ */
52
+ export type UserOutputCallback = (notification: PluginNotification) => void
53
+
54
+ /**
55
+ * Dependencies for creating a Session.
56
+ */
57
+ export interface SessionDependencies {
58
+ store: SessionStore
59
+ preset: Preset
60
+ llmProvider: LLMProvider
61
+ /** Named provider instances for middleware routing */
62
+ llmProviders?: ReadonlyMap<string, LLMProvider>
63
+ toolExecutor: ToolExecutor
64
+ logger: Logger
65
+ onUserOutput?: UserOutputCallback
66
+ /** Absolute path to session directory */
67
+ sessionDir: string
68
+ /** Configured plugins for this session */
69
+ plugins: ConfiguredPlugin[]
70
+ /** Event store for loading/querying events */
71
+ eventStore: EventStore
72
+ /** LLM call logger for debugging and audit */
73
+ llmLogger?: LLMLogger
74
+ /** Host-environment adapters (filesystem, process). */
75
+ platform: Platform
76
+ }
77
+
78
+ // ============================================================================
79
+ // Session
80
+ // ============================================================================
81
+
82
+ /**
83
+ * Session manages agents and delegates everything else to plugins.
84
+ */
85
+ export class Session {
86
+ readonly id: SessionId
87
+ readonly store: SessionStore
88
+ private readonly preset: Preset
89
+ private readonly llmProvider: LLMProvider
90
+ private readonly llmProviders: ReadonlyMap<string, LLMProvider>
91
+ private readonly toolExecutor: ToolExecutor
92
+ private readonly logger: Logger
93
+ private readonly onUserOutput?: UserOutputCallback
94
+ private readonly sessionDir: string
95
+ private readonly plugins: ConfiguredPlugin[]
96
+ private readonly eventStore: EventStore
97
+ private readonly llmLogger?: LLMLogger
98
+ private readonly platform: Platform
99
+
100
+ private readonly agents = new Map<AgentId, Agent>()
101
+ /** Cached plugin contexts created by plugin.createContext() */
102
+ private readonly pluginContexts = new Map<string, unknown>()
103
+
104
+ constructor(deps: SessionDependencies) {
105
+ this.id = deps.store.sessionId
106
+ this.store = deps.store
107
+ this.preset = deps.preset
108
+ this.llmProvider = deps.llmProvider
109
+ this.llmProviders = deps.llmProviders ?? new Map()
110
+ this.toolExecutor = deps.toolExecutor
111
+ this.logger = deps.logger
112
+ this.onUserOutput = deps.onUserOutput
113
+ this.sessionDir = deps.sessionDir
114
+ this.plugins = deps.plugins
115
+ this.eventStore = deps.eventStore
116
+ this.llmLogger = deps.llmLogger
117
+ this.platform = deps.platform
118
+ // Initialize agents from state
119
+ this.initializeAgents()
120
+
121
+ // React to events for agent scheduling
122
+ this.store.onEvent((event) => this.handleStoreEvent(event))
123
+ }
124
+
125
+ /**
126
+ * Get the current session state.
127
+ */
128
+ get state(): SessionState {
129
+ return this.store.getState()
130
+ }
131
+
132
+ /**
133
+ * Get the preset configuration for this session.
134
+ */
135
+ getPreset(): Preset {
136
+ return this.preset
137
+ }
138
+
139
+ /**
140
+ * Get the entry agent ID (communicator if present, otherwise orchestrator).
141
+ */
142
+ getEntryAgentId(): AgentId | null {
143
+ return getEntryAgentId(this.state)
144
+ }
145
+
146
+ /**
147
+ * Initialize plugin contexts.
148
+ * Must be called before session hooks or plugin methods that need pluginContext.
149
+ */
150
+ async initPluginContexts(): Promise<void> {
151
+ const sessionContext = this.buildSessionContext()
152
+ for (const plugin of this.plugins) {
153
+ if (plugin.createContext) {
154
+ const ctx = await plugin.createContext(sessionContext)
155
+ this.pluginContexts.set(plugin.name, ctx)
156
+ }
157
+ }
158
+ }
159
+
160
+ /**
161
+ * Call onSessionReady hooks for all plugins (with full context).
162
+ *
163
+ * Only errors are persisted as events — successful runs produce no event
164
+ * to keep the session log focused on state changes, not invocation noise.
165
+ */
166
+ async callSessionReadyHooks(): Promise<void> {
167
+ for (const plugin of this.plugins) {
168
+ if (plugin.sessionHooks?.onSessionReady) {
169
+ const startTime = Date.now()
170
+
171
+ try {
172
+ const ctx = this.buildSessionHookContext(plugin)
173
+ await plugin.sessionHooks.onSessionReady(ctx)
174
+ } catch (err) {
175
+ await this.store.emit(withSessionId(
176
+ this.id,
177
+ sessionEvents.create('session_handler_completed', {
178
+ handlerName: 'onSessionReady',
179
+ pluginName: plugin.name,
180
+ durationMs: Date.now() - startTime,
181
+ error: err instanceof Error ? err.message : String(err),
182
+ }),
183
+ ))
184
+ throw err
185
+ }
186
+ }
187
+ }
188
+ }
189
+
190
+ /**
191
+ * Close the session.
192
+ * Emits session_closed event — hooks and agent shutdown are handled reactively by handleSessionClosed().
193
+ */
194
+ async close(): Promise<Result<void, DomainError>> {
195
+ if (this.store.isClosed()) {
196
+ return Err(SessionErrors.closed(String(this.id)))
197
+ }
198
+
199
+ await this.store.emit(withSessionId(this.id, sessionEvents.create('session_closed', {})))
200
+
201
+ return Ok(undefined)
202
+ }
203
+
204
+ /**
205
+ * Reopen a closed session.
206
+ */
207
+ async reopen(): Promise<Result<void, DomainError>> {
208
+ if (!this.store.isClosed()) {
209
+ return Err(ValidationErrors.invalid('Session is not closed'))
210
+ }
211
+
212
+ await this.store.emit(withSessionId(this.id, sessionEvents.create('session_reopened', {})))
213
+
214
+ return Ok(undefined)
215
+ }
216
+
217
+ /**
218
+ * Get an agent by ID.
219
+ */
220
+ getAgent(agentId: AgentId): Agent | null {
221
+ return this.agents.get(agentId) ?? null
222
+ }
223
+
224
+ /**
225
+ * Get the entry agent (communicator or orchestrator).
226
+ */
227
+ getEntryAgent(): Agent | null {
228
+ const entryId = getEntryAgentId(this.state)
229
+ if (!entryId) return null
230
+ return this.agents.get(entryId) ?? null
231
+ }
232
+
233
+ /**
234
+ * Schedule agent processing (with debounce).
235
+ */
236
+ scheduleAgent(agentId: AgentId): void {
237
+ const agent = this.agents.get(agentId)
238
+ if (agent) {
239
+ agent.scheduleProcessing()
240
+ }
241
+ }
242
+
243
+ /**
244
+ * Force process an agent (bypass debounce).
245
+ */
246
+ async forceProcessAgent(agentId: AgentId): Promise<void> {
247
+ const agent = this.agents.get(agentId)
248
+ if (agent) {
249
+ await agent.continue()
250
+ }
251
+ }
252
+
253
+ /**
254
+ * Resume a paused agent so it can continue processing.
255
+ */
256
+ async resumeAgent(agentId: AgentId): Promise<Result<void, DomainError>> {
257
+ if (this.store.isClosed()) {
258
+ return Err(SessionErrors.closed(String(this.id)))
259
+ }
260
+
261
+ const agent = this.agents.get(agentId)
262
+ if (!agent) {
263
+ return Err(AgentErrors.notFound(String(agentId)))
264
+ }
265
+
266
+ const agentState = this.store.getAgentState(agentId)
267
+ if (!agentState || (agentState.status !== 'paused' && agentState.status !== 'errored')) {
268
+ return Err(ValidationErrors.invalid('Agent is not paused or errored'))
269
+ }
270
+
271
+ await this.store.emit(withSessionId(
272
+ this.id,
273
+ agentEvents.create('agent_resumed', {
274
+ agentId,
275
+ }),
276
+ ))
277
+
278
+ agent.continue().catch((err) => {
279
+ this.logger.error('Unhandled error in agent.continue()', err instanceof Error ? err : undefined, { sessionId: this.id, agentId })
280
+ })
281
+
282
+ this.logger.info('Agent resumed', { sessionId: this.id, agentId })
283
+ return Ok(undefined)
284
+ }
285
+
286
+ /**
287
+ * Pause an agent manually via API.
288
+ */
289
+ async pauseAgent(agentId: AgentId, message?: string): Promise<Result<void, DomainError>> {
290
+ if (this.store.isClosed()) {
291
+ return Err(SessionErrors.closed(String(this.id)))
292
+ }
293
+
294
+ const agent = this.agents.get(agentId)
295
+ if (!agent) {
296
+ return Err(AgentErrors.notFound(String(agentId)))
297
+ }
298
+
299
+ const agentState = this.store.getAgentState(agentId)
300
+ if (!agentState || agentState.status === 'paused') {
301
+ return Err(ValidationErrors.invalid('Agent is already paused'))
302
+ }
303
+
304
+ await this.store.emit(withSessionId(
305
+ this.id,
306
+ agentEvents.create('agent_paused', {
307
+ agentId,
308
+ reason: 'manual',
309
+ message,
310
+ }),
311
+ ))
312
+
313
+ this.logger.info('Agent paused', { sessionId: this.id, agentId })
314
+ return Ok(undefined)
315
+ }
316
+
317
+ /**
318
+ * Manually spawn an agent under a given parent.
319
+ */
320
+ async spawnAgentManually(
321
+ definitionName: string,
322
+ parentId: AgentId,
323
+ message?: string,
324
+ typedInput?: unknown,
325
+ ): Promise<Result<AgentId, DomainError>> {
326
+ if (this.store.isClosed()) {
327
+ return Err(SessionErrors.closed(String(this.id)))
328
+ }
329
+
330
+ // Validate parent exists
331
+ if (!this.agents.has(parentId)) {
332
+ return Err(AgentErrors.notFound(String(parentId)))
333
+ }
334
+
335
+ // Validate definition exists in preset
336
+ const isOrchestrator = definitionName === ORCHESTRATOR_ROLE
337
+ const isCommunicator = definitionName === COMMUNICATOR_ROLE && !!this.preset.communicator
338
+ const isAgent = this.preset.agents.some((a) => a.name === definitionName)
339
+ if (!isOrchestrator && !isCommunicator && !isAgent) {
340
+ return Err(ValidationErrors.invalid(`Agent definition not found: ${definitionName}`))
341
+ }
342
+
343
+ // Validate parent is authorized to spawn this definition
344
+ const parentState = this.store.getAgentState(parentId)
345
+ if (parentState) {
346
+ const parentConfig = this.getAgentConfig(parentState.definitionName)
347
+ if (parentConfig.spawnableAgents.length > 0 && !parentConfig.spawnableAgents.includes(definitionName)) {
348
+ return Err(ValidationErrors.invalid(`Agent '${parentState.definitionName}' is not authorized to spawn '${definitionName}'`))
349
+ }
350
+
351
+ // Enforce max child agents per parent (default: 20)
352
+ const children = getChildren(this.state, parentId)
353
+ const maxChildren = 20
354
+ if (children.length >= maxChildren) {
355
+ return Err(ValidationErrors.invalid(`Agent '${parentId}' has reached max child agent limit (${maxChildren})`))
356
+ }
357
+ }
358
+
359
+ const seq = getNextAgentSeq(this.state, definitionName)
360
+ const agentId = generateAgentId(definitionName, seq)
361
+ const now = Date.now()
362
+
363
+ const events: DomainEvent[] = [
364
+ withSessionId(
365
+ this.id,
366
+ agentEvents.create('agent_spawned', {
367
+ agentId,
368
+ definitionName,
369
+ parentId,
370
+ ...(typedInput !== undefined ? { typedInput } : {}),
371
+ }),
372
+ ),
373
+ ]
374
+
375
+ if (message) {
376
+ const messageId = generateMessageId(getNextMessageSeq(selectMailboxState(this.state)) + 1)
377
+ events.push(withSessionId(
378
+ this.id,
379
+ mailboxEvents.create('mailbox_message', {
380
+ toAgentId: agentId,
381
+ message: {
382
+ id: messageId,
383
+ from: parentId,
384
+ content: message,
385
+ timestamp: now,
386
+ consumed: false,
387
+ },
388
+ }),
389
+ ))
390
+ }
391
+
392
+ await this.store.emitBatch(events)
393
+
394
+ this.logger.debug('Agent spawned manually', {
395
+ sessionId: this.id,
396
+ agentId,
397
+ definitionName,
398
+ parentId,
399
+ })
400
+
401
+ return Ok(agentId)
402
+ }
403
+
404
+ /**
405
+ * Shutdown the session - stop all agent processing.
406
+ */
407
+ shutdown(): void {
408
+ for (const agent of this.agents.values()) {
409
+ try {
410
+ agent.shutdown()
411
+ } catch {
412
+ // Suppress errors during shutdown
413
+ }
414
+ }
415
+ }
416
+
417
+ /**
418
+ * Check if a session has any agents that need processing.
419
+ */
420
+ checkPendingAgents(): void {
421
+ for (const agent of this.agents.values()) {
422
+ agent.continue().catch((err) => {
423
+ this.logger.error('Unhandled error in agent.continue()', err instanceof Error ? err : undefined, { sessionId: this.id, agentId: agent.id })
424
+ })
425
+ }
426
+ }
427
+
428
+ /**
429
+ * Aggregate methods from all plugins.
430
+ * Returns a map of "pluginName.methodName" → { input, output, handler }.
431
+ */
432
+ getPluginMethods(): Map<string, ConfiguredPlugin['methods'][string]> {
433
+ const methods = new Map<string, ConfiguredPlugin['methods'][string]>()
434
+
435
+ for (const plugin of this.plugins) {
436
+ for (const [methodName, methodDef] of Object.entries(plugin.methods)) {
437
+ methods.set(`${plugin.name}.${methodName}`, methodDef)
438
+ }
439
+ }
440
+
441
+ return methods
442
+ }
443
+
444
+ /**
445
+ * Call a plugin method with properly constructed MethodHandlerContext.
446
+ * The context includes pluginState, pluginConfig (bound in closure),
447
+ * pluginContext, and scheduleAgent.
448
+ */
449
+ async callPluginMethod(
450
+ method: string,
451
+ input: unknown,
452
+ agentId?: AgentId,
453
+ caller?: CallerContext,
454
+ ): Promise<Result<unknown, DomainError>> {
455
+ // Find the plugin and method by parsing "pluginName.methodName"
456
+ const dotIndex = method.indexOf('.')
457
+ if (dotIndex === -1) {
458
+ return Err(ValidationErrors.invalid(`Invalid method format: ${method}`))
459
+ }
460
+ const pluginName = method.slice(0, dotIndex)
461
+ const methodName = method.slice(dotIndex + 1)
462
+
463
+ const plugin = this.plugins.find((p) => p.name === pluginName)
464
+ if (!plugin) {
465
+ return Err(ValidationErrors.invalid(`Unknown plugin: ${pluginName}`))
466
+ }
467
+
468
+ const methodDef = plugin.methods[methodName]
469
+ if (!methodDef) {
470
+ return Err(ValidationErrors.invalid(`Unknown method: ${method}`))
471
+ }
472
+
473
+ // Validate input
474
+ const parsed = methodDef.input.safeParse(input)
475
+ if (!parsed.success) {
476
+ return Err(ValidationErrors.invalid(`Invalid input for ${method}: ${parsed.error.message}`))
477
+ }
478
+
479
+ // Build MethodHandlerContext with plugin state, context, scheduleAgent, notify, and deps
480
+ const sessionContext = this.buildSessionContext()
481
+ const pluginState = plugin.slice ? plugin.slice.select(this.store.getState()) : undefined
482
+ const pluginContext = this.pluginContexts.get(pluginName)
483
+ const deps = this.buildPluginDeps(plugin)
484
+ const ctx = {
485
+ ...sessionContext,
486
+ caller: caller ?? DEFAULT_CALLER,
487
+ logger: this.logger.child({ method, agentId }),
488
+ pluginConfig: undefined,
489
+ pluginContext,
490
+ pluginState,
491
+ scheduleAgent: (targetAgentId: AgentId) => this.scheduleAgent(targetAgentId),
492
+ notify: this.createNotify(pluginName),
493
+ deps,
494
+ }
495
+
496
+ const result = await methodDef.handler(ctx, parsed.data)
497
+ return result
498
+ }
499
+
500
+ // ============================================================================
501
+ // Private methods
502
+ // ============================================================================
503
+
504
+ /**
505
+ * Initialize agents from session state.
506
+ */
507
+ private initializeAgents(): void {
508
+ for (const [agentId, agentState] of this.state.agents) {
509
+ const agent = this.createAgent(agentState)
510
+ this.agents.set(agentId, agent)
511
+ }
512
+ }
513
+
514
+ /**
515
+ * Create an Agent instance from state.
516
+ */
517
+ private createAgent(agentState: AgentState): Agent {
518
+ const config = this.getAgentConfig(agentState.definitionName)
519
+
520
+ // Filter plugins by isEnabled for this specific agent
521
+ const agentPlugins = this.plugins.filter((plugin) => {
522
+ if (!plugin.isEnabled) return true
523
+ return plugin.isEnabled({
524
+ pluginConfig: undefined, // injected by plugin builder wrapper
525
+ pluginAgentConfig: config.plugins?.find(c => c.pluginName === plugin.name)?.config,
526
+ agentConfig: config,
527
+ })
528
+ })
529
+
530
+ const env = this.getSessionEnvironment()
531
+ const fileStore = new SessionFileStore(env.sessionDir, env.workspaceDir, env.sandboxed, this.platform.fs)
532
+
533
+ // Apply LLM middleware chain: preset-level → agent-level → base provider
534
+ const agentMiddleware = this.getAgentMiddleware(agentState.definitionName)
535
+ const middleware = [
536
+ ...(this.preset.llmMiddleware ?? []),
537
+ ...agentMiddleware,
538
+ ]
539
+ const llmProvider = applyMiddleware(this.llmProvider, middleware)
540
+
541
+ return new Agent({
542
+ id: agentState.id,
543
+ sessionContext: {
544
+ sessionId: this.id,
545
+ sessionState: this.store.getState(),
546
+ sessionInput: undefined,
547
+ environment: env,
548
+ llm: this.llmProvider,
549
+ files: fileStore,
550
+ eventStore: this.eventStore,
551
+ llmLogger: this.llmLogger,
552
+ platform: this.platform,
553
+ logger: this.logger,
554
+ emitEvent: async (event) => {
555
+ await this.store.emit(withSessionId(this.id, event))
556
+ },
557
+ notify: (type, payload) => {
558
+ this.onUserOutput?.({ pluginName: '_agent', type, payload })
559
+ },
560
+ },
561
+ store: this.store,
562
+ llmProvider,
563
+ llmProviders: this.llmProviders,
564
+ toolExecutor: this.toolExecutor,
565
+ logger: this.logger.child({ agentId: agentState.id }),
566
+ config,
567
+ plugins: agentPlugins,
568
+ environment: env,
569
+ fileStore,
570
+ pluginContexts: this.pluginContexts,
571
+ sendNotification: (n) => this.onUserOutput?.(n),
572
+ pluginMethodCaller: async (depPluginName, methodName, input) => {
573
+ return await this.callPluginMethod(`${depPluginName}.${methodName}`, input, agentState.id, AGENT_CALLER)
574
+ },
575
+ schedule: () => this.scheduleAgent(agentState.id),
576
+ })
577
+ }
578
+
579
+ /**
580
+ * Handle events emitted to the store — reactive scheduling.
581
+ */
582
+ private handleStoreEvent(event: DomainEvent): void {
583
+ switch (event.type) {
584
+ case 'agent_spawned': {
585
+ const spawned = event as (typeof agentEvents)['Events']['agent_spawned']
586
+ this.handleAgentSpawned(spawned.agentId)
587
+ break
588
+ }
589
+ case 'session_closed': {
590
+ this.handleSessionClosed().catch((err) => {
591
+ this.logger.error('Unhandled error in handleSessionClosed()', err instanceof Error ? err : undefined, { sessionId: this.id })
592
+ })
593
+ break
594
+ }
595
+ }
596
+ }
597
+
598
+ /**
599
+ * Handle session_closed event — call close hooks and shutdown agents.
600
+ *
601
+ * Unlike onSessionReady (which re-throws), onSessionClose intentionally
602
+ * swallows per-plugin errors so that all plugins get a chance to clean up
603
+ * and agents are always shut down, even if one plugin's close hook fails.
604
+ */
605
+ private async handleSessionClosed(): Promise<void> {
606
+ // Call onSessionClose for all plugins in REVERSE order (per-plugin isolation)
607
+ const reversedPlugins = [...this.plugins].reverse()
608
+ for (const plugin of reversedPlugins) {
609
+ if (plugin.sessionHooks?.onSessionClose) {
610
+ try {
611
+ const ctx = this.buildSessionHookContext(plugin)
612
+ await plugin.sessionHooks.onSessionClose(ctx)
613
+ } catch (err) {
614
+ this.logger.error(`Session plugin '${plugin.name}' onSessionClose failed`, err instanceof Error ? err : new Error(String(err)), {
615
+ sessionId: this.id,
616
+ pluginName: plugin.name,
617
+ })
618
+ }
619
+ }
620
+ }
621
+
622
+ // Shutdown all agents
623
+ for (const agent of this.agents.values()) {
624
+ try {
625
+ agent.shutdown()
626
+ } catch {
627
+ // Suppress errors during shutdown (e.g. AbortError from abort signal listeners)
628
+ }
629
+ }
630
+
631
+ // Clean up references to prevent memory leaks
632
+ this.agents.clear()
633
+ this.pluginContexts.clear()
634
+ this.store.clearListeners()
635
+
636
+ this.logger.info('Session closed', { sessionId: this.id })
637
+ }
638
+
639
+ /**
640
+ * Handle newly spawned agent.
641
+ */
642
+ private handleAgentSpawned(agentId: AgentId): void {
643
+ // Guard: skip if agent already initialized (e.g., from initializeAgents)
644
+ if (this.agents.has(agentId)) return
645
+
646
+ const agentState = this.store.getAgentState(agentId)
647
+ if (!agentState) {
648
+ this.logger.error('Spawned agent not found in state', undefined, {
649
+ sessionId: this.id,
650
+ agentId,
651
+ })
652
+ return
653
+ }
654
+
655
+ // Create and register the new agent
656
+ const agent = this.createAgent(agentState)
657
+ this.agents.set(agentId, agent)
658
+
659
+ // Schedule processing (with debounce) for the new agent
660
+ agent.scheduleProcessing()
661
+ }
662
+
663
+ /**
664
+ * Handle user-facing output events.
665
+ */
666
+
667
+ /**
668
+ * Create a notify function bound to a specific plugin name.
669
+ */
670
+ private createNotify(pluginName: string): (type: string, payload: unknown) => void {
671
+ return (type, payload) => {
672
+ this.onUserOutput?.({ pluginName, type, payload })
673
+ }
674
+ }
675
+
676
+ /**
677
+ * Build deps object for a plugin — delegates method calls to callPluginMethod.
678
+ */
679
+ private buildPluginDeps(plugin: ConfiguredPlugin) {
680
+ return buildPluginDeps(
681
+ plugin.dependencyNames,
682
+ this.plugins,
683
+ async (depPluginName, methodName, input) => {
684
+ return await this.callPluginMethod(`${depPluginName}.${methodName}`, input)
685
+ },
686
+ )
687
+ }
688
+
689
+ /**
690
+ * Build a SessionContext from current session state.
691
+ */
692
+ private buildSessionContext(): SessionContext {
693
+ const env = this.getSessionEnvironment()
694
+ const fileStore = new SessionFileStore(env.sessionDir, env.workspaceDir, env.sandboxed, this.platform.fs)
695
+ return {
696
+ sessionId: this.id,
697
+ sessionState: this.store.getState(),
698
+ sessionInput: undefined,
699
+ environment: env,
700
+ llm: this.llmProvider,
701
+ files: fileStore,
702
+ eventStore: this.eventStore,
703
+ llmLogger: this.llmLogger,
704
+ platform: this.platform,
705
+ logger: this.logger,
706
+ emitEvent: async (event) => {
707
+ await this.store.emit(withSessionId(this.id, event))
708
+ },
709
+ notify: (type, payload) => {
710
+ this.onUserOutput?.({ pluginName: '_session', type, payload })
711
+ },
712
+ }
713
+ }
714
+
715
+ /**
716
+ * Build context for a session-level hook (onSessionReady / onSessionClose).
717
+ * Provides pluginConfig (via closure), pluginContext, pluginState, self, and session fields.
718
+ */
719
+ private buildSessionHookContext(plugin: ConfiguredPlugin): BaseSessionHookContext {
720
+ const sessionContext = this.buildSessionContext()
721
+ const pluginState = plugin.slice ? plugin.slice.select(this.store.getState()) : undefined
722
+ const pluginContext = this.pluginContexts.get(plugin.name)
723
+
724
+ // Build self — typed method callers (routed through callPluginMethod for proper context)
725
+ const self: Record<string, (input: unknown) => Promise<unknown>> = {}
726
+ for (const [methodName] of Object.entries(plugin.methods)) {
727
+ self[methodName] = async (input: unknown) => {
728
+ const result = await this.callPluginMethod(`${plugin.name}.${methodName}`, input, undefined, AGENT_CALLER)
729
+ if (!result.ok) {
730
+ throw new Error(`Plugin method failed: ${plugin.name}.${methodName}: ${result.error.type}`)
731
+ }
732
+ return result.value
733
+ }
734
+ }
735
+
736
+ const deps = this.buildPluginDeps(plugin)
737
+
738
+ return {
739
+ ...sessionContext,
740
+ caller: AGENT_CALLER,
741
+ pluginConfig: undefined, // injected by plugin builder wrapper
742
+ pluginContext,
743
+ pluginState,
744
+ self,
745
+ scheduleAgent: (agentId: AgentId) => this.scheduleAgent(agentId),
746
+ notify: this.createNotify(plugin.name),
747
+ deps,
748
+ }
749
+ }
750
+
751
+ /**
752
+ * Get session environment for tool context.
753
+ */
754
+ private getSessionEnvironment(): SessionEnvironment {
755
+ return {
756
+ sessionDir: this.sessionDir,
757
+ workspaceDir: this.state.workspaceDir,
758
+ sandboxed: this.preset.sandboxed ?? false,
759
+ }
760
+ }
761
+
762
+ /**
763
+ * Get LLM middleware from the agent/orchestrator/communicator definition.
764
+ */
765
+ private getAgentMiddleware(definitionName: string): LLMMiddleware[] {
766
+ if (definitionName === ORCHESTRATOR_ROLE) return this.preset.orchestrator.llmMiddleware ?? []
767
+ if (definitionName === COMMUNICATOR_ROLE) return this.preset.communicator?.llmMiddleware ?? []
768
+ return this.preset.agents.find(a => a.name === definitionName)?.llmMiddleware ?? []
769
+ }
770
+
771
+ /**
772
+ * Get agent config from preset definition.
773
+ * Tools are provided by plugins (Agent collects from plugins).
774
+ */
775
+ private getAgentConfig(definitionName: string): AgentConfig {
776
+ const withServicePluginConfig = (
777
+ config: { services?: { type: string }[]; plugins?: AgentPluginConfig[] },
778
+ ): AgentPluginConfig[] | undefined => {
779
+ const base = config.plugins ?? []
780
+ if (!config.services || config.services.length === 0) return base.length > 0 ? base : undefined
781
+ // Merge services config into plugins array (if not already present)
782
+ if (base.some(c => c.pluginName === 'services')) return base
783
+ return [...base, { pluginName: 'services', config: { services: config.services.map(s => s.type) } }]
784
+ }
785
+
786
+ if (definitionName === ORCHESTRATOR_ROLE) {
787
+ const orch = this.preset.orchestrator
788
+ return {
789
+ systemPrompt: orch.system,
790
+ model: orch.model,
791
+ spawnableAgents: orch.agents ?? [],
792
+ tools: orch.tools,
793
+ debounceMs: orch.debounceMs,
794
+ debounceCallback: orch.debounceCallback,
795
+ checkIntervalMs: orch.checkIntervalMs,
796
+ input: orch.input,
797
+ plugins: withServicePluginConfig(orch),
798
+ }
799
+ }
800
+
801
+ if (definitionName === COMMUNICATOR_ROLE && this.preset.communicator) {
802
+ const comm = this.preset.communicator
803
+ return {
804
+ systemPrompt: comm.system,
805
+ model: comm.model,
806
+ spawnableAgents: comm.agents ?? [],
807
+ tools: comm.tools,
808
+ debounceMs: comm.debounceMs,
809
+ debounceCallback: comm.debounceCallback,
810
+ checkIntervalMs: comm.checkIntervalMs,
811
+ input: comm.input,
812
+ plugins: withServicePluginConfig(comm),
813
+ }
814
+ }
815
+
816
+ const agentDef = this.preset.agents.find((a) => a.name === definitionName)
817
+ if (!agentDef) {
818
+ throw new Error(`Agent definition not found: ${definitionName}`)
819
+ }
820
+
821
+ return {
822
+ systemPrompt: agentDef.system,
823
+ model: agentDef.model,
824
+ spawnableAgents: agentDef.agents ?? [],
825
+ tools: agentDef.tools,
826
+ debounceMs: agentDef.debounceMs,
827
+ debounceCallback: agentDef.debounceCallback,
828
+ checkIntervalMs: agentDef.checkIntervalMs,
829
+ input: agentDef.input,
830
+ plugins: withServicePluginConfig(agentDef),
831
+ }
832
+ }
833
+ }