@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,185 @@
1
+ /**
2
+ * Snapshot-caching LLM middleware for e2e tests.
3
+ *
4
+ * Works at the InferenceRequest/InferenceResponse boundary (not HTTP). On a
5
+ * request hit, returns the cached response without calling the downstream
6
+ * provider. On a miss, forwards the request, records the response, writes
7
+ * one snapshot file per request hash.
8
+ *
9
+ * Unlike the lower-level `snapshot-fetch` (which writes one file per testName
10
+ * and overwrites on each call), this middleware keys by request hash — so a
11
+ * single multi-turn test records N independent snapshots.
12
+ *
13
+ * Usage:
14
+ * startStandaloneServer({
15
+ * presets: [myPreset],
16
+ * llmMiddleware: [createSnapshotLLMMiddleware({ snapshotsDir: '...' })],
17
+ * })
18
+ */
19
+
20
+ import { createHash } from 'node:crypto'
21
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'
22
+ import { join } from 'node:path'
23
+ import { Err, Ok } from '~/lib/utils/result.js'
24
+ import type { LLMMiddleware } from './middleware.js'
25
+ import type { InferenceRequest, InferenceResponse } from './provider.js'
26
+
27
+ export interface SnapshotLLMMiddlewareOptions {
28
+ /** Directory where per-request snapshot files are stored. */
29
+ snapshotsDir: string
30
+ /**
31
+ * - `auto` (default) — replay if snapshot exists, otherwise record.
32
+ * - `replay` — fail on miss. Use in CI to catch accidental live calls.
33
+ * - `record` — always call next and (over)write the snapshot.
34
+ */
35
+ mode?: 'auto' | 'replay' | 'record'
36
+ /**
37
+ * Transform the request before hashing. Returns a request used only for
38
+ * key computation — the original is still sent downstream on cache miss.
39
+ *
40
+ * Use this to strip run-local data (session IDs, timestamps, random
41
+ * workspace paths) that would otherwise prevent snapshots from matching
42
+ * across runs. See `stripUuids` for a common default.
43
+ */
44
+ normalize?: (request: InferenceRequest) => InferenceRequest
45
+ }
46
+
47
+ /**
48
+ * Replace all UUIDs in a string with a `__UUID__` placeholder.
49
+ */
50
+ export function stripUuids(text: string): string {
51
+ return text.replace(/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/g, '__UUID__')
52
+ }
53
+
54
+ /**
55
+ * Replace dynamically assigned TCP ports (e.g. `port 46140`, `:46140`) with
56
+ * a `__PORT__` placeholder. Dev services in roj pick free ports at runtime,
57
+ * which otherwise bust the snapshot key on every run.
58
+ */
59
+ export function stripEphemeralPorts(text: string): string {
60
+ return text
61
+ .replace(/port\s+(\d{4,5})\b/gi, 'port __PORT__')
62
+ .replace(/:(1[0-9]{4}|[2-6][0-9]{4})\b/g, ':__PORT__')
63
+ }
64
+
65
+ /**
66
+ * Compose multiple text stripping functions.
67
+ */
68
+ export function composeStrippers(...fns: Array<(text: string) => string>): (text: string) => string {
69
+ return (text) => fns.reduce((acc, fn) => fn(acc), text)
70
+ }
71
+
72
+ /**
73
+ * Build a `normalize` hook that applies a text-level stripper to the system
74
+ * prompt and all string-form message content / text parts.
75
+ */
76
+ export function normalizeWith(stripper: (text: string) => string): (request: InferenceRequest) => InferenceRequest {
77
+ return (request) => ({
78
+ ...request,
79
+ systemPrompt: stripper(request.systemPrompt),
80
+ messages: request.messages.map((m) => {
81
+ if (typeof m.content === 'string') {
82
+ return { ...m, content: stripper(m.content) }
83
+ }
84
+ if (Array.isArray(m.content)) {
85
+ return {
86
+ ...m,
87
+ content: m.content.map((part) =>
88
+ part.type === 'text' ? { ...part, text: stripper(part.text) } : part,
89
+ ),
90
+ }
91
+ }
92
+ return m
93
+ }) as InferenceRequest['messages'],
94
+ })
95
+ }
96
+
97
+ /**
98
+ * A `normalize` implementation that strips UUIDs from the request text.
99
+ * Use `normalizeStripRuntime` if dev service ports also leak into prompts.
100
+ */
101
+ export const normalizeStripUuids = normalizeWith(stripUuids)
102
+
103
+ /**
104
+ * `normalize` implementation for typical e2e runs: strips UUIDs and
105
+ * dynamically-assigned ports. Covers the usual suspects; add your own with
106
+ * `normalizeWith(composeStrippers(...))` for more.
107
+ */
108
+ export const normalizeStripRuntime = normalizeWith(composeStrippers(stripUuids, stripEphemeralPorts))
109
+
110
+ interface SnapshotEntry {
111
+ request: unknown
112
+ response: InferenceResponse
113
+ }
114
+
115
+ function stableStringify(value: unknown): string {
116
+ return JSON.stringify(value, (_key, val) => {
117
+ if (val && typeof val === 'object' && !Array.isArray(val)) {
118
+ return Object.fromEntries(Object.entries(val as Record<string, unknown>).sort(([a], [b]) => a.localeCompare(b)))
119
+ }
120
+ return val
121
+ })
122
+ }
123
+
124
+ /**
125
+ * Build a stable digest of the request. Strips:
126
+ * - tool `input`/`execute` functions + Zod schemas (reduced to name/description)
127
+ * - conversation-metadata fields on messages (`timestamp`, `isError`,
128
+ * `toolName`, `sourceMessageIds`) — not forwarded to the LLM, so they
129
+ * shouldn't bust the snapshot key either.
130
+ */
131
+ function stripMessageMetadata(message: unknown): unknown {
132
+ if (!message || typeof message !== 'object') return message
133
+ const { timestamp: _t, isError: _e, toolName: _n, sourceMessageIds: _s, ...rest } = message as Record<string, unknown>
134
+ return rest
135
+ }
136
+
137
+ function buildDigest(request: InferenceRequest): Record<string, unknown> {
138
+ return {
139
+ model: String(request.model),
140
+ systemPrompt: request.systemPrompt,
141
+ messages: request.messages.map(stripMessageMetadata),
142
+ tools: request.tools?.map((t) => ({ name: t.name, description: t.description })),
143
+ maxTokens: request.maxTokens,
144
+ temperature: request.temperature,
145
+ stopSequences: request.stopSequences,
146
+ openrouter: request.openrouter,
147
+ anthropic: request.anthropic,
148
+ }
149
+ }
150
+
151
+ function hashDigest(digest: unknown): string {
152
+ return createHash('sha256').update(stableStringify(digest)).digest('hex').slice(0, 16)
153
+ }
154
+
155
+ export function createSnapshotLLMMiddleware(options: SnapshotLLMMiddlewareOptions): LLMMiddleware {
156
+ const mode = options.mode ?? 'auto'
157
+ mkdirSync(options.snapshotsDir, { recursive: true })
158
+
159
+ return async (request, context, next) => {
160
+ const forHashing = options.normalize ? options.normalize(request) : request
161
+ const digest = buildDigest(forHashing)
162
+ const hash = hashDigest(digest)
163
+ const filePath = join(options.snapshotsDir, `${hash}.json`)
164
+ const hasSnapshot = existsSync(filePath)
165
+
166
+ if (mode !== 'record' && hasSnapshot) {
167
+ const entry = JSON.parse(readFileSync(filePath, 'utf-8')) as SnapshotEntry
168
+ return Ok(entry.response)
169
+ }
170
+
171
+ if (mode === 'replay') {
172
+ return Err({
173
+ type: 'invalid_request',
174
+ message: `Snapshot not found (replay mode): ${hash}. Set mode to 'auto' or 'record' and provide API keys to record.`,
175
+ })
176
+ }
177
+
178
+ const result = await next(request, context)
179
+ if (result.ok) {
180
+ const entry: SnapshotEntry = { request: digest, response: result.value }
181
+ writeFileSync(filePath, JSON.stringify(entry, null, '\t'))
182
+ }
183
+ return result
184
+ }
185
+ }
@@ -0,0 +1,92 @@
1
+ import z4 from 'zod/v4'
2
+ import { agentIdSchema } from '~/core/agents'
3
+ import type { LLMMessage } from '~/core/agents/state'
4
+ import { createEventsFactory } from '~/core/events/types'
5
+ import { toolCallIdSchema } from '~/core/tools/schema'
6
+ import { messageIdSchema } from '~/plugins/mailbox/schema'
7
+ import { llmCallIdSchema } from './schema'
8
+
9
+ // ============================================================================
10
+ // Supporting types for LLM events
11
+ // ============================================================================
12
+
13
+ /**
14
+ * LLM response content - can be text and/or tool calls.
15
+ */
16
+ export type LLMResponse = {
17
+ content: string | null
18
+ toolCalls: LLMToolCall[]
19
+ }
20
+
21
+ /**
22
+ * A single tool call from the LLM.
23
+ */
24
+ export type LLMToolCall = {
25
+ id: string // ToolCallId
26
+ name: string
27
+ input: unknown
28
+ }
29
+
30
+ /**
31
+ * Metrics from an LLM inference call.
32
+ */
33
+ export type LLMMetrics = {
34
+ promptTokens: number
35
+ completionTokens: number
36
+ totalTokens: number
37
+ latencyMs: number
38
+ model: string
39
+ provider?: string
40
+ cost?: number
41
+ /** Tokens served from prompt cache (cache read) */
42
+ cachedTokens?: number
43
+ /** Tokens written to prompt cache */
44
+ cacheWriteTokens?: number
45
+ }
46
+
47
+ // ============================================================================
48
+ // LLM events
49
+ // ============================================================================
50
+
51
+ export const llmEvents = createEventsFactory({
52
+ events: {
53
+ inference_started: z4.object({
54
+ agentId: agentIdSchema,
55
+ messages: z4.array(z4.custom<LLMMessage>()),
56
+ consumedMessageIds: z4.array(messageIdSchema),
57
+ }),
58
+ inference_completed: z4.object({
59
+ agentId: agentIdSchema,
60
+ consumedMessageIds: z4.array(messageIdSchema),
61
+ response: z4.object({
62
+ content: z4.string().nullable(),
63
+ toolCalls: z4.array(z4.object({
64
+ id: toolCallIdSchema,
65
+ name: z4.string(),
66
+ input: z4.unknown(),
67
+ })),
68
+ }),
69
+ metrics: z4.object({
70
+ promptTokens: z4.number(),
71
+ completionTokens: z4.number(),
72
+ totalTokens: z4.number(),
73
+ latencyMs: z4.number(),
74
+ model: z4.string(),
75
+ provider: z4.string().optional(),
76
+ cost: z4.number().optional(),
77
+ cachedTokens: z4.number().optional(),
78
+ cacheWriteTokens: z4.number().optional(),
79
+ }),
80
+ llmCallId: llmCallIdSchema.optional(),
81
+ }),
82
+ inference_failed: z4.object({
83
+ agentId: agentIdSchema,
84
+ error: z4.string(),
85
+ llmCallId: llmCallIdSchema.optional(),
86
+ }),
87
+ },
88
+ })
89
+
90
+ export type InferenceStartedEvent = (typeof llmEvents)['Events']['inference_started']
91
+ export type InferenceCompletedEvent = (typeof llmEvents)['Events']['inference_completed']
92
+ export type InferenceFailedEvent = (typeof llmEvents)['Events']['inference_failed']
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Token estimation utilities using tokenx library.
3
+ * Provides ~95-98% accuracy compared to full tokenizers.
4
+ */
5
+
6
+ import { estimateTokenCount, sliceByTokens } from 'tokenx'
7
+
8
+ /**
9
+ * Estimate token count for a text string.
10
+ * Uses tokenx library for better accuracy than simple char/4 heuristic.
11
+ */
12
+ export function estimateTokens(text: string): number {
13
+ return estimateTokenCount(text)
14
+ }
15
+
16
+ /**
17
+ * Message structure for token estimation.
18
+ */
19
+ export interface TokenEstimationMessage {
20
+ role: string
21
+ content: string | unknown
22
+ }
23
+
24
+ /**
25
+ * Estimate total tokens for an array of messages.
26
+ * Includes ~4 tokens overhead per message for role/formatting.
27
+ */
28
+ export interface TruncationResult {
29
+ content: string
30
+ originalTokens: number
31
+ }
32
+
33
+ /**
34
+ * Truncate text to fit within a token budget.
35
+ * Returns null if text is already within budget.
36
+ * Uses 80/20 head/tail split via sliceByTokens.
37
+ */
38
+ export function truncateByTokens(text: string, maxTokens: number): TruncationResult | null {
39
+ const originalTokens = estimateTokenCount(text)
40
+ // 5% tolerance to avoid truncating near the boundary
41
+ if (originalTokens <= maxTokens * 1.05) return null
42
+
43
+ const headBudget = Math.floor(maxTokens * 0.8)
44
+ const tailBudget = maxTokens - headBudget
45
+ const head = sliceByTokens(text, 0, headBudget)
46
+ const tail = sliceByTokens(text, -tailBudget)
47
+
48
+ const content = `${head}\n\n[... truncated — ~${originalTokens} tokens total ...]\n\n${tail}`
49
+ return { content, originalTokens }
50
+ }
51
+
52
+ /**
53
+ * Estimate total tokens for an array of messages.
54
+ * Includes ~4 tokens overhead per message for role/formatting.
55
+ */
56
+ export function estimateMessagesTokens(messages: TokenEstimationMessage[]): number {
57
+ return messages.reduce((sum, msg) => {
58
+ const content = typeof msg.content === 'string' ? msg.content : JSON.stringify(msg.content)
59
+ return sum + estimateTokens(content) + 4 // 4 tokens overhead per message
60
+ }, 0)
61
+ }
@@ -0,0 +1,340 @@
1
+ import { describe, expect, it } from 'bun:test'
2
+ import { AgentId } from '~/core/agents/schema.js'
3
+ import { agentEvents } from '~/core/agents/state.js'
4
+ import { MockLLMProvider } from '~/core/llm/mock.js'
5
+ import { ToolCallId } from '~/core/tools/schema.js'
6
+ import { createMultiAgentPreset, TestHarness } from '~/testing/index.js'
7
+
8
+ describe('core: multi-agent flows', () => {
9
+ it('orchestrator spawns worker → worker processes → sends result to orchestrator → orchestrator continues', async () => {
10
+ let orchestratorCalls = 0
11
+ let orchestratorSawResult = false
12
+
13
+ let workerCalls = 0
14
+
15
+ const harness = new TestHarness({
16
+ presets: [createMultiAgentPreset([
17
+ { name: 'worker', system: 'Worker agent.', tools: [], agents: [] },
18
+ ], { orchestratorSystem: 'Orchestrator agent.' })],
19
+ mockHandler: (request) => {
20
+ if (request.systemPrompt.includes('Orchestrator')) {
21
+ orchestratorCalls++
22
+ if (orchestratorCalls === 1) {
23
+ return {
24
+ content: null,
25
+ toolCalls: [{ id: ToolCallId('tc1'), name: 'start_worker', input: { message: 'Do work' } }],
26
+ finishReason: 'stop',
27
+ metrics: MockLLMProvider.defaultMetrics(),
28
+ }
29
+ }
30
+ // Check if orchestrator received the worker's report
31
+ const userMessages = request.messages.filter(m => m.role === 'user')
32
+ if (userMessages.some(m => typeof m.content === 'string' && m.content.includes('Work result: done'))) {
33
+ orchestratorSawResult = true
34
+ }
35
+ return { content: 'All done', toolCalls: [], finishReason: 'stop', metrics: MockLLMProvider.defaultMetrics() }
36
+ }
37
+ // Worker: send result to parent on first call, finish on second
38
+ workerCalls++
39
+ if (workerCalls === 1) {
40
+ return {
41
+ content: null,
42
+ toolCalls: [{ id: ToolCallId('tc2'), name: 'send_message', input: { to: 'parent', message: 'Work result: done' } }],
43
+ finishReason: 'stop',
44
+ metrics: MockLLMProvider.defaultMetrics(),
45
+ }
46
+ }
47
+ return { content: 'Worker done', toolCalls: [], finishReason: 'stop', metrics: MockLLMProvider.defaultMetrics() }
48
+ },
49
+ })
50
+
51
+ const session = await harness.createSession('test')
52
+ await session.sendAndWaitForIdle('Start', { timeoutMs: 10000 })
53
+
54
+ expect(orchestratorSawResult).toBe(true)
55
+
56
+ // Both agents should be idle
57
+ const orchState = session.state.agents.get(session.getEntryAgentId()!)!
58
+ expect(orchState.status).toBe('pending')
59
+ const workerState = session.state.agents.get(AgentId('worker_1'))!
60
+ expect(workerState.status).toBe('pending')
61
+
62
+ await harness.shutdown()
63
+ })
64
+
65
+ it('orchestrator spawns multiple workers → all process concurrently', async () => {
66
+ let orchestratorCalls = 0
67
+ const workerCallCounts = new Map<string, number>()
68
+
69
+ const harness = new TestHarness({
70
+ presets: [createMultiAgentPreset([
71
+ { name: 'worker', system: 'Worker agent.', tools: [], agents: [] },
72
+ ], { orchestratorSystem: 'Orchestrator agent.' })],
73
+ mockHandler: (request) => {
74
+ if (request.systemPrompt.includes('Orchestrator')) {
75
+ orchestratorCalls++
76
+ if (orchestratorCalls === 1) {
77
+ return {
78
+ content: null,
79
+ toolCalls: [
80
+ { id: ToolCallId('tc1'), name: 'start_worker', input: { message: 'Task A' } },
81
+ { id: ToolCallId('tc2'), name: 'start_worker', input: { message: 'Task B' } },
82
+ { id: ToolCallId('tc3'), name: 'start_worker', input: { message: 'Task C' } },
83
+ ],
84
+ finishReason: 'stop',
85
+ metrics: MockLLMProvider.defaultMetrics(),
86
+ }
87
+ }
88
+ return { content: 'Done', toolCalls: [], finishReason: 'stop', metrics: MockLLMProvider.defaultMetrics() }
89
+ }
90
+ // Workers
91
+ const agentId = request.systemPrompt.includes('Worker') ? 'worker' : 'unknown'
92
+ workerCallCounts.set(agentId, (workerCallCounts.get(agentId) ?? 0) + 1)
93
+ return { content: 'Worker done', toolCalls: [], finishReason: 'stop', metrics: MockLLMProvider.defaultMetrics() }
94
+ },
95
+ })
96
+
97
+ const session = await harness.createSession('test')
98
+ await session.sendAndWaitForIdle('Start', { timeoutMs: 10000 })
99
+
100
+ // All three workers should exist
101
+ expect(session.state.agents.has(AgentId('worker_1'))).toBe(true)
102
+ expect(session.state.agents.has(AgentId('worker_2'))).toBe(true)
103
+ expect(session.state.agents.has(AgentId('worker_3'))).toBe(true)
104
+
105
+ // All workers should have been called
106
+ expect(workerCallCounts.get('worker')).toBeGreaterThanOrEqual(3)
107
+
108
+ // All workers should be idle
109
+ for (const id of [AgentId('worker_1'), AgentId('worker_2'), AgentId('worker_3')]) {
110
+ expect(session.state.agents.get(id)!.status).toBe('pending')
111
+ }
112
+
113
+ await harness.shutdown()
114
+ })
115
+
116
+ it('parent pauses child → child stops, parent notified', async () => {
117
+ let orchestratorCalls = 0
118
+
119
+ const harness = new TestHarness({
120
+ presets: [createMultiAgentPreset([
121
+ { name: 'worker', system: 'Worker agent.', tools: [], agents: [] },
122
+ ], { orchestratorSystem: 'Orchestrator agent.' })],
123
+ mockHandler: (request) => {
124
+ if (request.systemPrompt.includes('Orchestrator')) {
125
+ orchestratorCalls++
126
+ if (orchestratorCalls === 1) {
127
+ return {
128
+ content: null,
129
+ toolCalls: [{ id: ToolCallId('tc1'), name: 'start_worker', input: { message: 'Work' } }],
130
+ finishReason: 'stop',
131
+ metrics: MockLLMProvider.defaultMetrics(),
132
+ }
133
+ }
134
+ return { content: 'Done', toolCalls: [], finishReason: 'stop', metrics: MockLLMProvider.defaultMetrics() }
135
+ }
136
+ return { content: 'Worker done', toolCalls: [], finishReason: 'stop', metrics: MockLLMProvider.defaultMetrics() }
137
+ },
138
+ })
139
+
140
+ const session = await harness.createSession('test')
141
+ await session.sendAndWaitForIdle('Start')
142
+
143
+ // Pause the child
144
+ const pauseResult = await session.callPluginMethod('agents.pause', { agentId: 'worker_1' })
145
+ expect(pauseResult.ok).toBe(true)
146
+
147
+ // Child should be paused
148
+ expect(session.state.agents.get(AgentId('worker_1'))!.status).toBe('paused')
149
+
150
+ // agent_paused event emitted
151
+ const pausedEvents = await session.getEventsByType(agentEvents, 'agent_paused')
152
+ expect(pausedEvents.some(e => e.agentId === AgentId('worker_1'))).toBe(true)
153
+
154
+ await harness.shutdown()
155
+ })
156
+
157
+ it('parent resumes child → child continues', async () => {
158
+ let orchestratorCalls = 0
159
+ let workerCalls = 0
160
+
161
+ const harness = new TestHarness({
162
+ presets: [createMultiAgentPreset([
163
+ { name: 'worker', system: 'Worker agent.', tools: [], agents: [] },
164
+ ], { orchestratorSystem: 'Orchestrator agent.' })],
165
+ mockHandler: (request) => {
166
+ if (request.systemPrompt.includes('Orchestrator')) {
167
+ orchestratorCalls++
168
+ if (orchestratorCalls === 1) {
169
+ return {
170
+ content: null,
171
+ toolCalls: [{ id: ToolCallId('tc1'), name: 'start_worker', input: { message: 'Work' } }],
172
+ finishReason: 'stop',
173
+ metrics: MockLLMProvider.defaultMetrics(),
174
+ }
175
+ }
176
+ return { content: 'Done', toolCalls: [], finishReason: 'stop', metrics: MockLLMProvider.defaultMetrics() }
177
+ }
178
+ workerCalls++
179
+ return { content: 'Worker done', toolCalls: [], finishReason: 'stop', metrics: MockLLMProvider.defaultMetrics() }
180
+ },
181
+ })
182
+
183
+ const session = await harness.createSession('test')
184
+ await session.sendAndWaitForIdle('Start')
185
+
186
+ // Pause
187
+ const pauseResult = await session.callPluginMethod('agents.pause', { agentId: 'worker_1' })
188
+ expect(pauseResult.ok).toBe(true)
189
+ expect(session.state.agents.get(AgentId('worker_1'))!.status).toBe('paused')
190
+
191
+ // Resume
192
+ const resumeResult = await session.callPluginMethod('agents.resume', { agentId: 'worker_1' })
193
+ expect(resumeResult.ok).toBe(true)
194
+
195
+ await session.waitForIdle()
196
+
197
+ // Worker should have processed again after resume
198
+ expect(session.state.agents.get(AgentId('worker_1'))!.status).toBe('pending')
199
+
200
+ // agent_resumed event should exist
201
+ const resumedEvents = await session.getEventsByType(agentEvents, 'agent_resumed')
202
+ expect(resumedEvents.some(e => e.agentId === AgentId('worker_1'))).toBe(true)
203
+
204
+ await harness.shutdown()
205
+ })
206
+
207
+ it('child agent completes → parent receives completion message (if configured)', async () => {
208
+ let orchestratorCalls = 0
209
+ let orchestratorSawCompletion = false
210
+
211
+ const harness = new TestHarness({
212
+ presets: [createMultiAgentPreset([
213
+ {
214
+ name: 'worker',
215
+ system: 'Worker agent.',
216
+ tools: [],
217
+ agents: [],
218
+ plugins: [{ pluginName: 'mailbox', config: { sendCompletionMessage: true } }],
219
+ },
220
+ ], { orchestratorSystem: 'Orchestrator agent.' })],
221
+ mockHandler: (request) => {
222
+ if (request.systemPrompt.includes('Orchestrator')) {
223
+ orchestratorCalls++
224
+ if (orchestratorCalls === 1) {
225
+ return {
226
+ content: null,
227
+ toolCalls: [{ id: ToolCallId('tc1'), name: 'start_worker', input: { message: 'Work' } }],
228
+ finishReason: 'stop',
229
+ metrics: MockLLMProvider.defaultMetrics(),
230
+ }
231
+ }
232
+ // Check if completion message arrived
233
+ const userMessages = request.messages.filter(m => m.role === 'user')
234
+ if (userMessages.some(m => typeof m.content === 'string' && m.content.includes('Task completed.'))) {
235
+ orchestratorSawCompletion = true
236
+ }
237
+ return { content: 'Done', toolCalls: [], finishReason: 'stop', metrics: MockLLMProvider.defaultMetrics() }
238
+ }
239
+ // Worker completes immediately
240
+ return { content: 'Worker done', toolCalls: [], finishReason: 'stop', metrics: MockLLMProvider.defaultMetrics() }
241
+ },
242
+ })
243
+
244
+ const session = await harness.createSession('test')
245
+ await session.sendAndWaitForIdle('Start', { timeoutMs: 10000 })
246
+
247
+ expect(orchestratorSawCompletion).toBe(true)
248
+
249
+ await harness.shutdown()
250
+ })
251
+
252
+ it('deeply nested agents: orch → A → B → B reports to A → A reports to orch', async () => {
253
+ let orchestratorCalls = 0
254
+ let workerACalls = 0
255
+ let workerBCalls = 0
256
+ let orchestratorSawFinalReport = false
257
+
258
+ const harness = new TestHarness({
259
+ presets: [createMultiAgentPreset([
260
+ { name: 'worker_a', system: 'Worker A agent.', tools: [], agents: ['worker_b'] },
261
+ { name: 'worker_b', system: 'Worker B agent.', tools: [], agents: [] },
262
+ ], { orchestratorSystem: 'Orchestrator agent.' })],
263
+ mockHandler: (request) => {
264
+ if (request.systemPrompt.includes('Orchestrator')) {
265
+ orchestratorCalls++
266
+ if (orchestratorCalls === 1) {
267
+ return {
268
+ content: null,
269
+ toolCalls: [{ id: ToolCallId('tc1'), name: 'start_worker_a', input: { message: 'Coordinate' } }],
270
+ finishReason: 'stop',
271
+ metrics: MockLLMProvider.defaultMetrics(),
272
+ }
273
+ }
274
+ // Check for final report from A
275
+ const userMessages = request.messages.filter(m => m.role === 'user')
276
+ if (userMessages.some(m => typeof m.content === 'string' && m.content.includes('Final report from A'))) {
277
+ orchestratorSawFinalReport = true
278
+ }
279
+ return { content: 'All done', toolCalls: [], finishReason: 'stop', metrics: MockLLMProvider.defaultMetrics() }
280
+ }
281
+
282
+ if (request.systemPrompt.includes('Worker A')) {
283
+ workerACalls++
284
+ if (workerACalls === 1) {
285
+ // A spawns B
286
+ return {
287
+ content: null,
288
+ toolCalls: [{ id: ToolCallId('tc2'), name: 'start_worker_b', input: { message: 'Sub-task for B' } }],
289
+ finishReason: 'stop',
290
+ metrics: MockLLMProvider.defaultMetrics(),
291
+ }
292
+ }
293
+ // A received report from B, now report to orchestrator
294
+ const userMessages = request.messages.filter(m => m.role === 'user')
295
+ if (userMessages.some(m => typeof m.content === 'string' && m.content.includes('B result: success'))) {
296
+ // Check if we already sent the report (tool result in messages means we did)
297
+ const toolMessages = request.messages.filter(m => m.role === 'tool')
298
+ if (toolMessages.length > 0 && workerACalls > 3) {
299
+ return { content: 'A done', toolCalls: [], finishReason: 'stop', metrics: MockLLMProvider.defaultMetrics() }
300
+ }
301
+ return {
302
+ content: null,
303
+ toolCalls: [{ id: ToolCallId('tc4'), name: 'send_message', input: { to: 'parent', message: 'Final report from A' } }],
304
+ finishReason: 'stop',
305
+ metrics: MockLLMProvider.defaultMetrics(),
306
+ }
307
+ }
308
+ return { content: 'A waiting', toolCalls: [], finishReason: 'stop', metrics: MockLLMProvider.defaultMetrics() }
309
+ }
310
+
311
+ // Worker B
312
+ workerBCalls++
313
+ if (workerBCalls === 1) {
314
+ // B reports to A
315
+ return {
316
+ content: null,
317
+ toolCalls: [{ id: ToolCallId('tc3'), name: 'send_message', input: { to: 'parent', message: 'B result: success' } }],
318
+ finishReason: 'stop',
319
+ metrics: MockLLMProvider.defaultMetrics(),
320
+ }
321
+ }
322
+ return { content: 'B done', toolCalls: [], finishReason: 'stop', metrics: MockLLMProvider.defaultMetrics() }
323
+ },
324
+ })
325
+
326
+ const session = await harness.createSession('test')
327
+ await session.sendAndWaitForIdle('Start', { timeoutMs: 10000 })
328
+
329
+ // Verify hierarchy
330
+ expect(session.state.agents.has(AgentId('worker_a_1'))).toBe(true)
331
+ expect(session.state.agents.has(AgentId('worker_b_1'))).toBe(true)
332
+ expect(session.state.agents.get(AgentId('worker_a_1'))!.parentId).toBe(session.getEntryAgentId()!)
333
+ expect(session.state.agents.get(AgentId('worker_b_1'))!.parentId).toBe(AgentId('worker_a_1'))
334
+
335
+ // Orchestrator received final report from A
336
+ expect(orchestratorSawFinalReport).toBe(true)
337
+
338
+ await harness.shutdown()
339
+ })
340
+ })