@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,131 @@
1
+ import type { DomainEvent } from '~/core/events/types.js'
2
+ import type { SessionId, SessionMetadata } from '~/core/sessions/schema.js'
3
+ import { BaseEventStore } from './base-event-store.js'
4
+ import type { LoadRangeOptions, LoadRangeResult } from './event-store.js'
5
+
6
+ /**
7
+ * MemoryEventStore - In-memory event store for testing.
8
+ *
9
+ * Provides simple in-memory storage with test helpers for inspecting events.
10
+ */
11
+ export class MemoryEventStore extends BaseEventStore {
12
+ private events = new Map<SessionId, DomainEvent[]>()
13
+ private metadata = new Map<SessionId, SessionMetadata>()
14
+
15
+ protected async doAppend(sessionId: SessionId, event: DomainEvent): Promise<void> {
16
+ const existing = this.events.get(sessionId) ?? []
17
+ this.events.set(sessionId, [...existing, event])
18
+ await this.updateMetadataFromEvents(sessionId, [event])
19
+ }
20
+
21
+ protected async doAppendBatch(sessionId: SessionId, events: DomainEvent[]): Promise<void> {
22
+ if (events.length === 0) return
23
+
24
+ const existing = this.events.get(sessionId) ?? []
25
+ this.events.set(sessionId, [...existing, ...events])
26
+ await this.updateMetadataFromEvents(sessionId, events)
27
+ }
28
+
29
+ async load(sessionId: SessionId): Promise<DomainEvent[]> {
30
+ return this.events.get(sessionId) ?? []
31
+ }
32
+
33
+ async exists(sessionId: SessionId): Promise<boolean> {
34
+ return this.events.has(sessionId)
35
+ }
36
+
37
+ async listSessions(): Promise<SessionId[]> {
38
+ return Array.from(this.events.keys())
39
+ }
40
+
41
+ async loadRange(
42
+ sessionId: SessionId,
43
+ options?: LoadRangeOptions,
44
+ ): Promise<LoadRangeResult> {
45
+ const allEvents = this.events.get(sessionId) ?? []
46
+ const since = options?.since ?? -1
47
+ const limit = options?.limit
48
+
49
+ // toIndex always reflects the actual last event in the store (for polling cursor)
50
+ const storeLastIndex = allEvents.length - 1
51
+
52
+ const fromIndex = since + 1
53
+ if (fromIndex >= allEvents.length) {
54
+ // No new events, but return the actual last index so client can continue polling
55
+ return { events: [], fromIndex: -1, toIndex: storeLastIndex }
56
+ }
57
+
58
+ const endIndex = limit !== undefined
59
+ ? Math.min(fromIndex + limit, allEvents.length)
60
+ : allEvents.length
61
+
62
+ const events = allEvents.slice(fromIndex, endIndex)
63
+
64
+ return {
65
+ events,
66
+ fromIndex: events.length > 0 ? fromIndex : -1,
67
+ toIndex: endIndex - 1,
68
+ }
69
+ }
70
+
71
+ // =========================================================================
72
+ // Metadata storage primitives
73
+ // =========================================================================
74
+
75
+ protected async readMetadata(sessionId: SessionId): Promise<SessionMetadata | null> {
76
+ return this.metadata.get(sessionId) ?? null
77
+ }
78
+
79
+ protected async writeMetadata(sessionId: SessionId, metadata: SessionMetadata): Promise<void> {
80
+ this.metadata.set(sessionId, metadata)
81
+ }
82
+
83
+ protected async getAllSessionMetadata(): Promise<SessionMetadata[]> {
84
+ return Array.from(this.metadata.values())
85
+ }
86
+
87
+ // =========================================================================
88
+ // Test helpers
89
+ // =========================================================================
90
+
91
+ /**
92
+ * Clears all events and metadata.
93
+ */
94
+ clear(): void {
95
+ this.events.clear()
96
+ this.metadata.clear()
97
+ }
98
+
99
+ /**
100
+ * Returns all events for inspection in tests.
101
+ */
102
+ getAll(): Map<SessionId, DomainEvent[]> {
103
+ return new Map(this.events)
104
+ }
105
+
106
+ /**
107
+ * Returns event count for a session.
108
+ */
109
+ getEventCount(sessionId: SessionId): number {
110
+ return this.events.get(sessionId)?.length ?? 0
111
+ }
112
+
113
+ /**
114
+ * Returns the last event for a session.
115
+ */
116
+ getLastEvent(sessionId: SessionId): DomainEvent | undefined {
117
+ const events = this.events.get(sessionId)
118
+ return events?.[events.length - 1]
119
+ }
120
+
121
+ /**
122
+ * Returns events of a given type.
123
+ */
124
+ getEventsByType(
125
+ sessionId: SessionId,
126
+ type: string,
127
+ ): DomainEvent[] {
128
+ const events = this.events.get(sessionId) ?? []
129
+ return events.filter((e) => e.type === type)
130
+ }
131
+ }
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Utility functions for computing session metadata from events.
3
+ * Used for metadata reconciliation after crashes.
4
+ */
5
+
6
+ import type { agentEvents } from '~/core/agents/state.js'
7
+ import type { DomainEvent, FactoryEventType } from '~/core/events/types.js'
8
+ import type { llmEvents } from '~/core/llm/state.js'
9
+ import type { SessionId, SessionMetadata, SessionMetadataMetrics } from '~/core/sessions/schema.js'
10
+ import type { sessionEvents } from '~/core/sessions/state.js'
11
+ import type { toolEvents } from '~/core/tools/state.js'
12
+ import type { mailboxEvents } from '~/plugins/mailbox/state.js'
13
+
14
+ export type MetadataEvent = FactoryEventType<typeof sessionEvents | typeof agentEvents | typeof llmEvents | typeof mailboxEvents | typeof toolEvents>
15
+
16
+ /**
17
+ * Compute metrics from a list of events.
18
+ * This is the source of truth for what metrics should be.
19
+ */
20
+ export function computeMetricsFromEvents(events: DomainEvent[]): SessionMetadataMetrics {
21
+ const metrics: SessionMetadataMetrics = {
22
+ totalEvents: events.length,
23
+ totalAgents: 0,
24
+ totalTokens: 0,
25
+ totalLLMCalls: 0,
26
+ inputTokens: 0,
27
+ outputTokens: 0,
28
+ totalCost: 0,
29
+ totalMessages: 0,
30
+ totalToolCalls: 0,
31
+ }
32
+
33
+ for (const event of events as MetadataEvent[]) {
34
+ switch (event.type) {
35
+ case 'agent_spawned':
36
+ metrics.totalAgents++
37
+ break
38
+
39
+ case 'inference_completed':
40
+ if (event.metrics) {
41
+ metrics.totalLLMCalls++
42
+ metrics.totalTokens += event.metrics.totalTokens ?? 0
43
+ metrics.inputTokens! += event.metrics.promptTokens ?? 0
44
+ metrics.outputTokens! += event.metrics.completionTokens ?? 0
45
+ if (event.metrics.cost !== undefined) {
46
+ metrics.totalCost! += event.metrics.cost
47
+ }
48
+ }
49
+ break
50
+
51
+ case 'mailbox_message':
52
+ metrics.totalMessages!++
53
+ break
54
+
55
+ case 'tool_started':
56
+ metrics.totalToolCalls!++
57
+ break
58
+ }
59
+ }
60
+
61
+ return metrics
62
+ }
63
+
64
+ /**
65
+ * Compute full metadata from events (for initial creation or full reconciliation).
66
+ */
67
+ export function computeMetadataFromEvents(
68
+ sessionId: SessionId,
69
+ events: DomainEvent[],
70
+ ): SessionMetadata | null {
71
+ if (events.length === 0) return null
72
+
73
+ const firstEvent = events[0] as MetadataEvent
74
+ if (firstEvent.type !== 'session_created') {
75
+ return null
76
+ }
77
+
78
+ const lastEvent = events[events.length - 1]
79
+ const metrics = computeMetricsFromEvents(events)
80
+
81
+ // Determine status from events
82
+ let status: SessionMetadata['status'] = 'active'
83
+ for (const event of events as MetadataEvent[]) {
84
+ if (event.type === 'session_closed') {
85
+ status = 'closed'
86
+ } else if (event.type === 'session_reopened') {
87
+ status = 'active'
88
+ }
89
+ // Check for errored state - if last event is inference_failed, session might be errored
90
+ if (event.type === 'inference_failed') {
91
+ // Only mark as errored if it's the most recent significant event
92
+ // This is a heuristic - actual status should come from session state
93
+ }
94
+ }
95
+
96
+ return {
97
+ sessionId,
98
+ presetId: firstEvent.presetId,
99
+ createdAt: firstEvent.timestamp,
100
+ lastActivityAt: lastEvent.timestamp,
101
+ status,
102
+ metrics,
103
+ }
104
+ }
105
+
106
+ /**
107
+ * Check if stored metadata needs reconciliation by comparing key metrics.
108
+ * Returns true if reconciliation is needed.
109
+ */
110
+ export function needsReconciliation(
111
+ stored: SessionMetadata | null,
112
+ computed: SessionMetadata,
113
+ ): boolean {
114
+ if (!stored) return true
115
+ if (!stored.metrics) return true
116
+ if (!computed.metrics) return false
117
+
118
+ // Check totalEvents as the primary consistency indicator
119
+ if (stored.metrics.totalEvents !== computed.metrics.totalEvents) {
120
+ return true
121
+ }
122
+
123
+ // Check other metrics for consistency
124
+ if (stored.metrics.totalAgents !== computed.metrics.totalAgents) {
125
+ return true
126
+ }
127
+
128
+ if (stored.metrics.totalLLMCalls !== computed.metrics.totalLLMCalls) {
129
+ return true
130
+ }
131
+
132
+ return false
133
+ }
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Helpers for creating branded DomainEvent objects.
3
+ *
4
+ * Event factories (sessionEvents, agentEvents, etc.) produce events
5
+ * without `sessionId` (it's added by `emitEvent()` at runtime).
6
+ * `withSessionId` adds the missing field and returns a full DomainEvent.
7
+ *
8
+ * Usage:
9
+ * const event = withSessionId(sessionId, sessionEvents.create('session_created', { presetId: 'test' }))
10
+ */
11
+ import type { BaseEvent } from '~/core/events/types.js'
12
+ import type { DomainEvent } from '~/core/events/types.js'
13
+ import type { SessionId } from '~/core/sessions/schema.js'
14
+
15
+ /**
16
+ * Add `sessionId` to a factory-created event, producing a full DomainEvent.
17
+ *
18
+ * The factory `.create()` returns `Omit<BaseEvent<K>, 'sessionId'> & payload`
19
+ * (branded but missing sessionId). This function adds the missing field.
20
+ *
21
+ * TypeScript cannot prove `Omit<Union, 'key'> & { key }` reconstructs the
22
+ * original union (Omit destroys discriminants). The return type uses the same
23
+ * brand-bridging pattern as `createEventsFactory` — safe because all factory
24
+ * events with sessionId are structurally valid DomainEvent members.
25
+ */
26
+ export function withSessionId<T extends Omit<BaseEvent<string>, 'sessionId'>>(
27
+ sessionId: SessionId,
28
+ event: T,
29
+ ): T & { sessionId: SessionId } & DomainEvent {
30
+ return Object.assign(event, { sessionId }) as T & { sessionId: SessionId } & DomainEvent
31
+ }
@@ -0,0 +1,64 @@
1
+ import z4 from 'zod/v4'
2
+ import { SessionId } from '~/core/sessions/schema'
3
+
4
+ declare const __brand: unique symbol
5
+ type TheBrand<B> = { [__brand]: B }
6
+ type Brand<T, B> = T & TheBrand<B>
7
+
8
+ export type BaseEvent<T extends string> = Brand<{
9
+ sessionId: SessionId
10
+ timestamp: number
11
+ type: T
12
+ }, 'Event'>
13
+
14
+ export type EventsMap = Record<string, z4.ZodObject<z4.ZodRawShape>>
15
+
16
+ export type EventUnion<TEvents extends EventsMap> = {
17
+ [K in keyof TEvents & string]: BaseEvent<K> & z4.infer<TEvents[K]>
18
+ }[keyof TEvents & string]
19
+
20
+ type EventsOf<TEvents extends EventsMap> = {
21
+ [K in keyof TEvents & string]: BaseEvent<K> & z4.infer<TEvents[K]>
22
+ }
23
+
24
+ export interface EventsFactory<TEvents extends EventsMap> {
25
+ create<K extends keyof TEvents & string>(type: K, input: z4.infer<TEvents[K]>): Omit<BaseEvent<K>, 'sessionId'> & z4.infer<TEvents[K]>
26
+ EventType: EventUnion<TEvents>
27
+ Events: EventsOf<TEvents>
28
+ }
29
+
30
+ /**
31
+ * Extract the event union type from an EventsFactory instance.
32
+ * Usage: FactoryEventType<typeof sessionEvents | typeof agentEvents>
33
+ */
34
+ export type FactoryEventType<F extends { EventType: unknown }> = F['EventType'] & BaseEvent<string>
35
+
36
+ /**
37
+ * Generic domain event type — any event with sessionId, timestamp, and type.
38
+ * Replaces the monolithic DomainEvent union from events.ts.
39
+ * Individual reducers use their own narrower event types via EventsFactory.
40
+ */
41
+ export type DomainEvent = BaseEvent<string>
42
+
43
+ /**
44
+ * Type guard to check if an unknown value is a DomainEvent.
45
+ */
46
+ export const isDomainEvent = (event: unknown): event is DomainEvent =>
47
+ typeof event === 'object'
48
+ && event !== null
49
+ && 'type' in event
50
+ && 'sessionId' in event
51
+ && 'timestamp' in event
52
+
53
+ export const createEventsFactory = <TEvents extends EventsMap>(_args: { events: TEvents }): EventsFactory<TEvents> => {
54
+ return {
55
+ create: (type, input) => ({
56
+ type,
57
+ ...input,
58
+ ...({} as TheBrand<'Event'>),
59
+ timestamp: Date.now(),
60
+ }),
61
+ EventType: undefined!,
62
+ Events: undefined!,
63
+ }
64
+ }
@@ -0,0 +1,275 @@
1
+ /**
2
+ * SessionFileStore - single FileStore implementation with path resolution.
3
+ *
4
+ * Encapsulates all path resolution logic (sandboxed virtual paths, traversal
5
+ * validation, agent-visible path mapping). Replaces the separate path-resolver
6
+ * functions for FileStore consumers.
7
+ *
8
+ * Three scopes:
9
+ * - 'full': accepts agent-visible paths (/home/user/session/... or real paths)
10
+ * - 'session': paths relative to sessionDir
11
+ * - 'workspace': paths relative to workspaceDir
12
+ */
13
+
14
+ import { dirname, join, normalize, resolve } from 'node:path'
15
+ import type { FileEntry, FileStore } from '~/core/file-store/types.js'
16
+ import type { FileSystem } from '~/platform/fs.js'
17
+ import { Err, Ok } from '~/lib/utils/result.js'
18
+ import type { Result } from '~/lib/utils/result.js'
19
+
20
+ // Virtual roots for sandboxed mode
21
+ const VIRTUAL_SESSION = '/home/user/session'
22
+ const VIRTUAL_WORKSPACE = '/home/user/workspace'
23
+
24
+ type FileStoreScope = 'full' | 'session' | 'workspace'
25
+
26
+ export class SessionFileStore implements FileStore {
27
+ constructor(
28
+ private readonly sessionDir: string,
29
+ private readonly workspaceDir: string | undefined,
30
+ private readonly sandboxed: boolean,
31
+ private readonly fs: FileSystem,
32
+ private readonly scope: FileStoreScope = 'full',
33
+ ) {}
34
+
35
+ /** Create a session-scoped FileStore (relative paths → sessionDir) */
36
+ get session(): SessionFileStore {
37
+ return new SessionFileStore(this.sessionDir, this.workspaceDir, this.sandboxed, this.fs, 'session')
38
+ }
39
+
40
+ /** Create a workspace-scoped FileStore (relative paths → workspaceDir), or undefined if no workspace */
41
+ get workspace(): SessionFileStore | undefined {
42
+ if (!this.workspaceDir) return undefined
43
+ return new SessionFileStore(this.sessionDir, this.workspaceDir, this.sandboxed, this.fs, 'workspace')
44
+ }
45
+
46
+ async write(path: string, content: string | Buffer): Promise<Result<{ path: string }, string>> {
47
+ const resolved = this.resolvePath(path)
48
+ if (!resolved.ok) return resolved
49
+
50
+ await this.fs.mkdir(dirname(resolved.value), { recursive: true })
51
+ await this.fs.writeFile(resolved.value, content)
52
+
53
+ return Ok({ path: this.toAgentPath(resolved.value) })
54
+ }
55
+
56
+ async read(path: string): Promise<Result<string, string>>
57
+ async read(path: string, opts: { type: 'buffer' }): Promise<Result<Buffer, string>>
58
+ async read(path: string, opts?: { type: 'buffer' }): Promise<Result<string | Buffer, string>> {
59
+ const resolved = this.resolvePath(path)
60
+ if (!resolved.ok) return resolved
61
+
62
+ try {
63
+ if (opts?.type === 'buffer') {
64
+ return Ok(await this.fs.readFile(resolved.value))
65
+ }
66
+ return Ok(await this.fs.readFile(resolved.value, 'utf-8'))
67
+ } catch {
68
+ return Err(`File not found: ${path}`)
69
+ }
70
+ }
71
+
72
+ async exists(path: string): Promise<Result<boolean, string>> {
73
+ const resolved = this.resolvePath(path)
74
+ if (!resolved.ok) return resolved
75
+
76
+ return Ok(await this.fs.exists(resolved.value))
77
+ }
78
+
79
+ async stat(path: string): Promise<Result<FileEntry, string>> {
80
+ const resolved = this.resolvePath(path)
81
+ if (!resolved.ok) return resolved
82
+
83
+ try {
84
+ const s = await this.fs.stat(resolved.value)
85
+ return Ok({
86
+ size: s.size,
87
+ type: s.isFile() ? 'file' : s.isDirectory() ? 'directory' : s.isSymbolicLink() ? 'symlink' : 'other',
88
+ name: resolved.value.split('/').pop() || '',
89
+ })
90
+ } catch {
91
+ return Err(`Not found: ${path}`)
92
+ }
93
+ }
94
+
95
+ async list(path: string): Promise<Result<FileEntry[], string>> {
96
+ const resolved = this.resolvePath(path)
97
+ if (!resolved.ok) return resolved
98
+
99
+ try {
100
+ const items = await this.fs.readdir(resolved.value, { withFileTypes: true })
101
+ const entries: FileEntry[] = []
102
+ for (const item of items) {
103
+ let type: FileEntry['type']
104
+ let size: number | undefined
105
+ if (item.isFile()) {
106
+ type = 'file'
107
+ const s = await this.fs.stat(join(resolved.value, item.name))
108
+ size = s.size
109
+ } else if (item.isDirectory()) {
110
+ type = 'directory'
111
+ } else if (item.isSymbolicLink()) {
112
+ type = 'symlink'
113
+ } else {
114
+ type = 'other'
115
+ }
116
+ entries.push({ name: item.name, type, size })
117
+ }
118
+ return Ok(entries)
119
+ } catch {
120
+ return Err(`Directory not found: ${path}`)
121
+ }
122
+ }
123
+
124
+ async remove(path: string): Promise<Result<void, string>> {
125
+ const resolved = this.resolvePath(path)
126
+ if (!resolved.ok) return resolved
127
+
128
+ try {
129
+ await this.fs.unlink(resolved.value)
130
+ return Ok(undefined)
131
+ } catch {
132
+ return Err(`Failed to remove: ${path}`)
133
+ }
134
+ }
135
+
136
+ getRoots(): { session: string; workspace?: string } {
137
+ if (this.sandboxed) {
138
+ return {
139
+ session: VIRTUAL_SESSION,
140
+ workspace: this.workspaceDir ? VIRTUAL_WORKSPACE : undefined,
141
+ }
142
+ }
143
+ return {
144
+ session: this.sessionDir,
145
+ workspace: this.workspaceDir,
146
+ }
147
+ }
148
+
149
+ realPath(path: string): Result<string, string> {
150
+ return this.resolvePath(path)
151
+ }
152
+
153
+ scoped(basePath: string): SessionFileStore {
154
+ // Resolve basePath relative to current scope
155
+ const resolved = this.resolvePath(basePath)
156
+ if (!resolved.ok) {
157
+ throw new Error(`Cannot scope to invalid path: ${basePath}`)
158
+ }
159
+ return new SessionFileStore(resolved.value, undefined, false, this.fs, 'session')
160
+ }
161
+
162
+ // ============================================================================
163
+ // Path resolution
164
+ // ============================================================================
165
+
166
+ private resolvePath(path: string): Result<string, string> {
167
+ switch (this.scope) {
168
+ case 'full':
169
+ return this.resolveAgentPath(path)
170
+ case 'session':
171
+ return this.resolveRelativePath(path, this.sessionDir)
172
+ case 'workspace':
173
+ if (!this.workspaceDir) return Err('No workspace directory configured')
174
+ return this.resolveRelativePath(path, this.workspaceDir)
175
+ }
176
+ }
177
+
178
+ /** Resolve a relative path within a root directory */
179
+ private resolveRelativePath(path: string, rootDir: string): Result<string, string> {
180
+ const normalized = normalize(path)
181
+ if (normalized.startsWith('..') || normalized.startsWith('/')) {
182
+ return Err(`Path traversal not allowed: ${path}`)
183
+ }
184
+ const absolute = resolve(join(rootDir, normalized))
185
+ if (!absolute.startsWith(rootDir)) {
186
+ return Err(`Path traversal not allowed: ${path}`)
187
+ }
188
+ return Ok(absolute)
189
+ }
190
+
191
+ /** Resolve an agent-visible path to real filesystem path (handles sandboxed virtual paths) */
192
+ private resolveAgentPath(agentPath: string): Result<string, string> {
193
+ if (this.sandboxed) {
194
+ return this.resolveSandboxedPath(agentPath)
195
+ }
196
+ return this.resolveNonSandboxedPath(agentPath)
197
+ }
198
+
199
+ private resolveSandboxedPath(agentPath: string): Result<string, string> {
200
+ if (agentPath.startsWith(VIRTUAL_SESSION + '/') || agentPath === VIRTUAL_SESSION) {
201
+ const relative = agentPath.slice(VIRTUAL_SESSION.length)
202
+ const absolutePath = resolve(this.sessionDir, relative.slice(1) || '.')
203
+ return this.validateWithinRoot(absolutePath, this.sessionDir, agentPath)
204
+ }
205
+
206
+ if (agentPath.startsWith(VIRTUAL_WORKSPACE + '/') || agentPath === VIRTUAL_WORKSPACE) {
207
+ if (!this.workspaceDir) {
208
+ return Err('No workspace directory is configured for this session. Only session paths are available.')
209
+ }
210
+ const relative = agentPath.slice(VIRTUAL_WORKSPACE.length)
211
+ const absolutePath = resolve(this.workspaceDir, relative.slice(1) || '.')
212
+ return this.validateWithinRoot(absolutePath, this.workspaceDir, agentPath)
213
+ }
214
+
215
+ const validPrefixes = this.workspaceDir
216
+ ? `${VIRTUAL_SESSION}/ or ${VIRTUAL_WORKSPACE}/`
217
+ : `${VIRTUAL_SESSION}/`
218
+
219
+ return Err(`Path must start with ${validPrefixes}. Got: '${agentPath}'`)
220
+ }
221
+
222
+ private resolveNonSandboxedPath(agentPath: string): Result<string, string> {
223
+ const absolutePath = resolve(agentPath)
224
+ const normalizedSession = resolve(this.sessionDir)
225
+ const normalizedWorkspace = this.workspaceDir ? resolve(this.workspaceDir) : null
226
+
227
+ const isInSession = absolutePath === normalizedSession || absolutePath.startsWith(normalizedSession + '/')
228
+ const isInWorkspace = normalizedWorkspace
229
+ && (absolutePath === normalizedWorkspace || absolutePath.startsWith(normalizedWorkspace + '/'))
230
+
231
+ if (!isInSession && !isInWorkspace) {
232
+ return Err(`Path '${agentPath}' is outside allowed directories`)
233
+ }
234
+
235
+ return Ok(absolutePath)
236
+ }
237
+
238
+ private validateWithinRoot(absolutePath: string, rootDir: string, originalPath: string): Result<string, string> {
239
+ const normalizedRoot = resolve(rootDir)
240
+ const isWithin = absolutePath === normalizedRoot || absolutePath.startsWith(normalizedRoot + '/')
241
+
242
+ if (!isWithin) {
243
+ return Err(`Path '${originalPath}' resolves outside allowed directories`)
244
+ }
245
+
246
+ return Ok(absolutePath)
247
+ }
248
+
249
+ // ============================================================================
250
+ // Agent-visible path conversion
251
+ // ============================================================================
252
+
253
+ private toAgentPath(realPath: string): string {
254
+ if (!this.sandboxed) return realPath
255
+
256
+ const normalizedSession = resolve(this.sessionDir)
257
+ const normalizedWorkspace = this.workspaceDir ? resolve(this.workspaceDir) : null
258
+
259
+ // Try workspace first (more specific match if workspace is inside session)
260
+ if (normalizedWorkspace) {
261
+ if (realPath === normalizedWorkspace) return VIRTUAL_WORKSPACE
262
+ if (realPath.startsWith(normalizedWorkspace + '/')) {
263
+ return VIRTUAL_WORKSPACE + realPath.slice(normalizedWorkspace.length)
264
+ }
265
+ }
266
+
267
+ if (realPath === normalizedSession) return VIRTUAL_SESSION
268
+ if (realPath.startsWith(normalizedSession + '/')) {
269
+ return VIRTUAL_SESSION + realPath.slice(normalizedSession.length)
270
+ }
271
+
272
+ // Path is outside known roots - return as-is
273
+ return realPath
274
+ }
275
+ }
@@ -0,0 +1,52 @@
1
+ /**
2
+ * FileStore interface for centralized file operations.
3
+ * All paths are relative to the store's root directory.
4
+ * Used by tools, lib functions, and the LLM provider.
5
+ */
6
+
7
+ import type { Result } from '~/lib/utils/result.js'
8
+
9
+ export interface FileStat {
10
+ size: number
11
+ isFile: boolean
12
+ isDirectory: boolean
13
+ }
14
+
15
+ export interface FileEntry {
16
+ name: string
17
+ type: 'file' | 'directory' | 'symlink' | 'other'
18
+ size?: number
19
+ }
20
+
21
+ export interface FileStore {
22
+ /** Write text or binary content. Auto-creates parent dirs. Returns the agent-visible path. */
23
+ write(path: string, content: string | Buffer): Promise<Result<{ path: string }, string>>
24
+
25
+ /** Read file as UTF-8 text. */
26
+ read(path: string): Promise<Result<string, string>>
27
+ /** Read file as Buffer. */
28
+ read(path: string, opts: { type: 'buffer' }): Promise<Result<Buffer, string>>
29
+
30
+ /** Check if a file exists. */
31
+ exists(path: string): Promise<Result<boolean, string>>
32
+
33
+ /** Get file/directory stats. */
34
+ stat(path: string): Promise<Result<FileEntry, string>>
35
+
36
+ /** List entries in a directory with type and size info. */
37
+ list(path: string, options?: { maxDepth?: number; gitIgnore?: boolean }): Promise<Result<FileEntry[], string>>
38
+
39
+ /** Remove a file. */
40
+ remove(path: string): Promise<Result<void, string>>
41
+
42
+ /** Resolve an agent-visible path to real filesystem path. */
43
+ realPath(path: string): Result<string, string>
44
+
45
+ /** Get the agent-visible root paths (virtual when sandboxed, real otherwise) */
46
+ getRoots(): { session: string; workspace?: string }
47
+
48
+ scoped(subPath: string): FileStore
49
+
50
+ session: FileStore
51
+ workspace?: FileStore
52
+ }