@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,468 @@
1
+ import { join, relative, resolve } from 'node:path'
2
+ import z from 'zod/v4'
3
+ import { agentEvents } from '~/core/agents/state.js'
4
+ import { ValidationErrors } from '~/core/errors.js'
5
+ import type { FileEntry } from '~/core/file-store/types.js'
6
+ import type { ToolResultContent } from '~/core/llm/llm-log-types.js'
7
+ import { truncateByTokens } from '~/core/llm/tokens.js'
8
+ import { definePlugin } from '~/core/plugins/plugin-builder.js'
9
+ import { createTool, type ToolDefinition } from '~/core/tools/definition.js'
10
+ import { getImageMimeType } from '~/lib/mime.js'
11
+ import { Err, Ok } from '~/lib/utils/result.js'
12
+ import type { Result } from '~/lib/utils/result.js'
13
+ import type { ToolError } from '../../core/tools/executor.js'
14
+ import {
15
+ buildDirectoryListingPreamble,
16
+ CALLS_DIR,
17
+ checkDeniedPaths,
18
+ EVENTS_DIR,
19
+ fileEntryToTreeEntry,
20
+ formatFlatListing,
21
+ formatTreeRecursive,
22
+ loadGitignoreViaStore,
23
+ type TreeEntry,
24
+ } from './helpers.js'
25
+ import { listDirectory, listDirectoryRecursive, ListingError, preventTraversal } from './listing.js'
26
+
27
+ // ============================================================================
28
+ // Configuration
29
+ // ============================================================================
30
+
31
+ /**
32
+ * Session-wide filesystem configuration.
33
+ */
34
+ export interface FilesystemPresetConfig {
35
+ /** Maximum file size to read (bytes) - files larger than this are rejected (default: 10MB) */
36
+ maxReadSize?: number
37
+ /** Allowed file extensions (empty = all allowed) */
38
+ allowedExtensions?: string[]
39
+ /** Denied path segments (e.g. [".events"]) */
40
+ deniedPaths?: string[]
41
+ /** Approximate max tokens before auto-truncating (default: 20000) */
42
+ maxTokens?: number
43
+ /** Respect .gitignore files when listing directories (default: true) */
44
+ respectGitignore?: boolean
45
+ /** Default enabled state for agents (default: true). Agents can override via FilesystemAgentConfig.enabled. */
46
+ defaultEnabled?: boolean
47
+ /** Whether write tools (write_file, replace_in_file) are available by default (default: true). Agents can override via FilesystemAgentConfig.writable. */
48
+ writable?: boolean
49
+ }
50
+
51
+ /**
52
+ * Agent-specific filesystem configuration.
53
+ */
54
+ export interface FilesystemAgentConfig {
55
+ /** Whether filesystem is enabled for this agent (default: true) */
56
+ enabled?: boolean
57
+ /** Whether write tools (write_file, replace_in_file) are available for this agent. Overrides preset-level writable when set. */
58
+ writable?: boolean
59
+ /** Emit a directory listing preamble when the agent starts. true uses default depth (1), or pass { maxDepth } to override. */
60
+ directoryListing?: boolean | { maxDepth?: number }
61
+ }
62
+
63
+ // ============================================================================
64
+ // Zod Schemas
65
+ // ============================================================================
66
+
67
+ const directoryEntrySchema = z.object({
68
+ name: z.string(),
69
+ path: z.string().optional(),
70
+ type: z.enum(['file', 'directory']),
71
+ size: z.number(),
72
+ mimeType: z.string().optional(),
73
+ })
74
+
75
+ const readFileInputSchema = z.object({
76
+ path: z.string().describe('Absolute path to the file within session or workspace directory.'),
77
+ offset: z.number().int().min(0).optional()
78
+ .describe('Line offset to start reading from (0-based). Defaults to 0.'),
79
+ maxLines: z.number().int().min(1).optional()
80
+ .describe('Maximum number of lines to return. If omitted, returns the entire file.'),
81
+ })
82
+
83
+ const writeFileInputSchema = z.object({
84
+ path: z.string().describe('Absolute path to the file within session or workspace directory.'),
85
+ content: z.string().describe('Content to write'),
86
+ encoding: z.enum(['utf-8', 'base64']).optional()
87
+ .describe('Content encoding (utf-8 for text, base64 for binary). Defaults to utf-8.'),
88
+ createDirs: z.boolean().optional()
89
+ .describe("Create parent directories if they don't exist. Defaults to true."),
90
+ })
91
+
92
+ const listDirectoryInputSchema = z.object({
93
+ path: z.string().describe('Absolute path to the directory within session or workspace directory.'),
94
+ recursive: z.boolean().optional()
95
+ .describe('List contents recursively. Defaults to false.'),
96
+ includeHidden: z.boolean().optional()
97
+ .describe('Include hidden files (starting with .). Defaults to false.'),
98
+ })
99
+
100
+ const replaceInFileInputSchema = z.object({
101
+ path: z.string().describe('Absolute path to the file.'),
102
+ searchValue: z.string().describe('Exact text to find.'),
103
+ replaceValue: z.string().describe('Text to replace with.'),
104
+ expectedOccurrences: z.number().int().min(1).optional().describe('Expected number of occurrences. Aborts if actual count differs.'),
105
+ })
106
+
107
+ // ============================================================================
108
+ // Filesystem Plugin
109
+ // ============================================================================
110
+
111
+ export const filesystemPlugin = definePlugin('filesystem')
112
+ .pluginConfig<FilesystemPresetConfig>()
113
+ .context(async () => {
114
+ return {} // No plugin-specific context needed
115
+ })
116
+ .agentConfig<FilesystemAgentConfig>()
117
+ .tools((ctx) => {
118
+ const pluginConfig = ctx.pluginConfig ?? {}
119
+ const defaultEnabled = pluginConfig.defaultEnabled ?? true
120
+ const agentEnabled = ctx.pluginAgentConfig?.enabled ?? defaultEnabled
121
+ if (!agentEnabled) return []
122
+
123
+ const deniedPaths = pluginConfig.deniedPaths ?? [EVENTS_DIR, CALLS_DIR]
124
+ const maxReadSize = pluginConfig.maxReadSize ?? 10 * 1024 * 1024 // 10MB default
125
+ const maxTokens = pluginConfig.maxTokens ?? 20_000
126
+ // Reserve 10% for JSON envelope/metadata so result-eviction plugin doesn't double-truncate
127
+ const contentTokenBudget = Math.floor(maxTokens * 0.9)
128
+ const respectGitignore = pluginConfig.respectGitignore ?? true
129
+ const writable = ctx.pluginAgentConfig?.writable ?? pluginConfig.writable ?? true
130
+
131
+ const tools: ToolDefinition<any>[] = [
132
+ // read_file tool
133
+ createTool({
134
+ name: 'read_file',
135
+ description: 'Read the contents of a file. For image files, the image is returned visually. For other binary files, only metadata is returned.',
136
+ input: readFileInputSchema,
137
+ execute: async (input, context): Promise<Result<ToolResultContent, ToolError>> => {
138
+ const denied = checkDeniedPaths(input.path, deniedPaths)
139
+ if (!denied.ok) return denied
140
+
141
+ const fileStore = context.files
142
+
143
+ const statResult = await fileStore.stat(input.path)
144
+ if (!statResult.ok) {
145
+ return Err({
146
+ message: statResult.error,
147
+ recoverable: false,
148
+ })
149
+ }
150
+
151
+ const stats = statResult.value
152
+
153
+ if (stats.type !== 'file') {
154
+ return Err({
155
+ message: `'${input.path}' is not a file`,
156
+ recoverable: false,
157
+ })
158
+ }
159
+
160
+ // Image files → return as multimodal image content
161
+ const mimeType = getImageMimeType(input.path)
162
+ if (mimeType) {
163
+ const realPathResult = fileStore.realPath(input.path)
164
+ if (!realPathResult.ok) {
165
+ return Err({ message: realPathResult.error, recoverable: false })
166
+ }
167
+ return Ok([
168
+ { type: 'text', text: `Image: ${input.path} (${mimeType}, ${stats.size} bytes)` },
169
+ { type: 'image_url', imageUrl: { url: `file://${realPathResult.value}` } },
170
+ ])
171
+ }
172
+
173
+ // Reject files that are too large to read into memory
174
+ if ((stats.size ?? 0) > maxReadSize) {
175
+ return Err({
176
+ message: `File is too large (${stats.size} bytes, max ${maxReadSize}). Use offset and maxLines to read specific sections.`,
177
+ recoverable: true,
178
+ })
179
+ }
180
+
181
+ // Read as text
182
+ const readResult = await fileStore.read(input.path)
183
+ if (!readResult.ok) {
184
+ return Err({ message: readResult.error, recoverable: false })
185
+ }
186
+
187
+ const rawContent = readResult.value as string
188
+
189
+ // Detect binary content (null bytes in first 8KB)
190
+ if (rawContent.slice(0, 8192).includes('\0')) {
191
+ return Ok(JSON.stringify({ path: input.path, type: 'binary', size: stats.size }, null, 2))
192
+ }
193
+
194
+ let content = rawContent
195
+ const hasExplicitRange = input.offset !== undefined || input.maxLines !== undefined
196
+ const lines = content.split('\n')
197
+ const totalLines = lines.length
198
+
199
+ // Auto-truncate files exceeding maxTokens when no explicit range is specified
200
+ const truncation = !hasExplicitRange ? truncateByTokens(content, contentTokenBudget) : null
201
+ if (truncation) {
202
+ return Ok(JSON.stringify(
203
+ {
204
+ content: truncation.content,
205
+ size: stats.size,
206
+ truncated: true,
207
+ totalLines,
208
+ instructions:
209
+ `File is large (${totalLines} lines, ~${truncation.originalTokens} tokens). Use offset and maxLines parameters to read specific sections.`,
210
+ },
211
+ null,
212
+ 2,
213
+ ))
214
+ }
215
+
216
+ let truncated = false
217
+ if (hasExplicitRange) {
218
+ const start = input.offset ?? 0
219
+ const end = input.maxLines !== undefined ? start + input.maxLines : totalLines
220
+ const sliced = lines.slice(start, end)
221
+ truncated = end < totalLines
222
+ content = sliced.join('\n')
223
+ }
224
+
225
+ // Cap explicit range results to maxTokens as well
226
+ const rangeTruncation = truncateByTokens(content, contentTokenBudget)
227
+ if (rangeTruncation) {
228
+ content = rangeTruncation.content
229
+ truncated = true
230
+ }
231
+
232
+ return Ok(JSON.stringify(
233
+ {
234
+ content,
235
+ size: stats.size,
236
+ ...(truncated ? { truncated: true } : {}),
237
+ ...(hasExplicitRange || truncated ? { totalLines } : {}),
238
+ },
239
+ null,
240
+ 2,
241
+ ))
242
+ },
243
+ }),
244
+
245
+ // list_directory tool
246
+ createTool({
247
+ name: 'list_directory',
248
+ description: 'List the contents of a directory. Returns a compact tree view.',
249
+ input: listDirectoryInputSchema,
250
+ execute: async (input, context): Promise<Result<ToolResultContent, ToolError>> => {
251
+ const denied = checkDeniedPaths(input.path, deniedPaths)
252
+ if (!denied.ok) return denied
253
+
254
+ const fileStore = context.files
255
+ const recursive = input.recursive ?? false
256
+ const includeHidden = input.includeHidden ?? false
257
+
258
+ const statResult = await fileStore.stat(input.path)
259
+ if (!statResult.ok) {
260
+ return Err({
261
+ message: statResult.error,
262
+ recoverable: false,
263
+ })
264
+ }
265
+
266
+ if (statResult.value.type !== 'directory') {
267
+ return Err({
268
+ message: `'${input.path}' is not a directory`,
269
+ recoverable: false,
270
+ })
271
+ }
272
+
273
+ const ig = respectGitignore ? await loadGitignoreViaStore(input.path, input.path, fileStore) : null
274
+
275
+ async function collectEntries(dirPath: string): Promise<TreeEntry[]> {
276
+ const listResult = await fileStore.list(dirPath)
277
+ if (!listResult.ok) return []
278
+
279
+ const entries: TreeEntry[] = []
280
+ for (const item of listResult.value as FileEntry[]) {
281
+ if (!includeHidden && item.name.startsWith('.')) continue
282
+ if (deniedPaths.includes(item.name)) continue
283
+
284
+ const itemRelative = relative(input.path, join(dirPath, item.name))
285
+
286
+ if (ig) {
287
+ const testPath = item.type === 'directory' ? `${itemRelative}/` : itemRelative
288
+ if (ig.ignores(testPath)) continue
289
+ }
290
+
291
+ const treeEntry = fileEntryToTreeEntry(item)
292
+ if (item.type === 'directory' && recursive) {
293
+ treeEntry.children = await collectEntries(join(dirPath, item.name))
294
+ }
295
+ entries.push(treeEntry)
296
+ }
297
+
298
+ return entries
299
+ }
300
+
301
+ const entries = await collectEntries(input.path)
302
+
303
+ let output: string
304
+ if (recursive) {
305
+ output = `${input.path}/\n${formatTreeRecursive(entries, '')}`
306
+ } else {
307
+ output = `${input.path}/\n${formatFlatListing(entries)}`
308
+ }
309
+
310
+ return Ok(output)
311
+ },
312
+ }),
313
+ ]
314
+
315
+ if (writable) {
316
+ tools.push(
317
+ // write_file tool
318
+ createTool({
319
+ name: 'write_file',
320
+ description:
321
+ "Write content to a file. Automatically creates parent directories — no need to mkdir first. Creates the file if it doesn't exist, overwrites if it does.",
322
+ input: writeFileInputSchema,
323
+ execute: async (input, context): Promise<Result<ToolResultContent, ToolError>> => {
324
+ const denied = checkDeniedPaths(input.path, deniedPaths)
325
+ if (!denied.ok) return denied
326
+
327
+ const fileStore = context.files
328
+ const encoding = input.encoding ?? 'utf-8'
329
+
330
+ const buffer = encoding === 'base64'
331
+ ? Buffer.from(input.content, 'base64')
332
+ : input.content
333
+
334
+ const writeResult = await fileStore.write(input.path, buffer)
335
+ if (!writeResult.ok) {
336
+ return Err({
337
+ message: `Failed to write file: ${writeResult.error}`,
338
+ recoverable: false,
339
+ })
340
+ }
341
+
342
+ // Get size after write
343
+ const statResult = await fileStore.stat(input.path)
344
+ const size = statResult.ok ? statResult.value.size : Buffer.byteLength(typeof buffer === 'string' ? buffer : buffer)
345
+
346
+ return Ok(JSON.stringify({ path: input.path, size }, null, 2))
347
+ },
348
+ }),
349
+ // replace_in_file tool
350
+ createTool({
351
+ name: 'replace_in_file',
352
+ description:
353
+ 'Replace text in a file. More efficient and safer than write_file for targeted changes. Use write_file only for new files or complete rewrites.',
354
+ input: replaceInFileInputSchema,
355
+ execute: async (input, context): Promise<Result<ToolResultContent, ToolError>> => {
356
+ const denied = checkDeniedPaths(input.path, deniedPaths)
357
+ if (!denied.ok) return denied
358
+
359
+ const fileStore = context.files
360
+
361
+ const readResult = await fileStore.read(input.path)
362
+ if (!readResult.ok) {
363
+ return Err({ message: readResult.error, recoverable: false })
364
+ }
365
+
366
+ const content = readResult.value as string
367
+ const parts = content.split(input.searchValue)
368
+ const occurrences = parts.length - 1
369
+
370
+ if (occurrences === 0) {
371
+ return Err({ message: 'No occurrences found', recoverable: true })
372
+ }
373
+
374
+ if (input.expectedOccurrences !== undefined && occurrences !== input.expectedOccurrences) {
375
+ return Err({
376
+ message: `Expected ${input.expectedOccurrences} occurrences, but found ${occurrences}`,
377
+ recoverable: true,
378
+ })
379
+ }
380
+
381
+ const newContent = parts.join(input.replaceValue)
382
+ const writeResult = await fileStore.write(input.path, newContent)
383
+ if (!writeResult.ok) {
384
+ return Err({ message: `Failed to write file: ${writeResult.error}`, recoverable: false })
385
+ }
386
+
387
+ return Ok(`Replaced ${occurrences} occurrence${occurrences === 1 ? '' : 's'}`)
388
+ },
389
+ }),
390
+ )
391
+ }
392
+
393
+ return tools
394
+ })
395
+ .method('listSession', {
396
+ input: z.object({ path: z.string().optional() }),
397
+ output: z.object({
398
+ entries: z.array(directoryEntrySchema),
399
+ path: z.string(),
400
+ root: z.literal('session'),
401
+ }),
402
+ handler: async (ctx, input) => {
403
+ const baseDir = ctx.environment.sessionDir
404
+ try {
405
+ const entries = await listDirectory(ctx.platform.fs, baseDir, input.path ?? '')
406
+ return Ok({ entries, path: input.path ?? '', root: 'session' })
407
+ } catch (e) {
408
+ if (e instanceof ListingError) {
409
+ return Err(ValidationErrors.invalid(e.message))
410
+ }
411
+ throw e
412
+ }
413
+ },
414
+ })
415
+ .method('listWorkspace', {
416
+ input: z.object({ path: z.string().optional(), recursive: z.boolean().optional() }),
417
+ output: z.object({
418
+ entries: z.array(directoryEntrySchema),
419
+ path: z.string(),
420
+ root: z.literal('workspace'),
421
+ }),
422
+ handler: async (ctx, input) => {
423
+ const workspaceDir = ctx.environment.workspaceDir
424
+ if (!workspaceDir) {
425
+ return Err(ValidationErrors.invalid('No workspace configured for this session'))
426
+ }
427
+ const resolvedWorkspace = resolve(workspaceDir)
428
+ const subPath = input.path ?? ''
429
+
430
+ try {
431
+ if (input.recursive) {
432
+ const targetDir = subPath ? preventTraversal(resolvedWorkspace, subPath) : resolvedWorkspace
433
+ if (!targetDir) {
434
+ return Err(ValidationErrors.invalid('Path traversal not allowed'))
435
+ }
436
+ const entries = await listDirectoryRecursive(ctx.platform.fs, targetDir)
437
+ return Ok({ entries, path: subPath, root: 'workspace' })
438
+ }
439
+ const entries = await listDirectory(ctx.platform.fs, resolvedWorkspace, subPath)
440
+ return Ok({ entries, path: subPath, root: 'workspace' })
441
+ } catch (e) {
442
+ if (e instanceof ListingError) {
443
+ return Err(ValidationErrors.invalid(e.message))
444
+ }
445
+ throw e
446
+ }
447
+ },
448
+ })
449
+ .hook('onStart', async (ctx) => {
450
+ const pluginConfig = ctx.pluginConfig ?? {}
451
+ const defaultEnabled = pluginConfig.defaultEnabled ?? true
452
+ if (!(ctx.pluginAgentConfig?.enabled ?? defaultEnabled)) return null
453
+
454
+ const dirListingConfig = ctx.pluginAgentConfig?.directoryListing
455
+ if (!dirListingConfig) return null
456
+
457
+ const maxDepth = typeof dirListingConfig === 'object' ? dirListingConfig.maxDepth : undefined
458
+ const deniedPaths = pluginConfig.deniedPaths ?? [EVENTS_DIR, CALLS_DIR]
459
+ const content = await buildDirectoryListingPreamble(ctx.files, { maxDepth, deniedPaths })
460
+
461
+ await ctx.emitEvent(agentEvents.create('preamble_added', {
462
+ agentId: ctx.agentId,
463
+ messages: [{ role: 'user', content }],
464
+ }))
465
+
466
+ return null
467
+ })
468
+ .build()
@@ -0,0 +1,6 @@
1
+ export interface DirectoryEntry {
2
+ name: string
3
+ path: string
4
+ type: 'file' | 'directory' | 'symlink' | 'other'
5
+ size?: number
6
+ }
@@ -0,0 +1 @@
1
+ export { gitStatusPlugin } from './plugin.js'
@@ -0,0 +1,166 @@
1
+ /**
2
+ * Git Status Plugin
3
+ *
4
+ * Polls git state (commits ahead of the default branch, uncommitted files,
5
+ * last commit metadata) inside the session's workspace directory every few
6
+ * seconds and emits a `git_status_changed` notification when the snapshot
7
+ * changes. The worker DO persists the last snapshot into its session table so
8
+ * versions sidebar and publish bars can render without reaching into the
9
+ * sandbox on every page view.
10
+ */
11
+
12
+ import z from 'zod/v4'
13
+ import { definePlugin } from '~/core/plugins/index.js'
14
+ import { sessionIdSchema } from '~/core/sessions/schema.js'
15
+ import type { ProcessRunner } from '~/platform/process.js'
16
+
17
+ const POLL_INTERVAL_MS = 2000
18
+ const GIT_TIMEOUT_MS = 5000
19
+ const DEFAULT_BRANCH_FALLBACK = 'main'
20
+
21
+ interface GitStatusSnapshot {
22
+ committedAhead: number
23
+ uncommittedFiles: number
24
+ lastCommitAt: number | null
25
+ lastCommitMessage: string | null
26
+ }
27
+
28
+ interface GitStatusPluginContext {
29
+ intervals: Map<string, NodeJS.Timeout>
30
+ lastSnapshots: Map<string, GitStatusSnapshot>
31
+ defaultBranches: Map<string, string>
32
+ }
33
+
34
+ export const gitStatusPlugin = definePlugin('git-status')
35
+ .notification('git_status_changed', {
36
+ schema: z.object({
37
+ sessionId: sessionIdSchema,
38
+ committedAhead: z.number(),
39
+ uncommittedFiles: z.number(),
40
+ lastCommitAt: z.number().nullable(),
41
+ lastCommitMessage: z.string().nullable(),
42
+ updatedAt: z.number(),
43
+ }),
44
+ })
45
+ .context(async (): Promise<GitStatusPluginContext> => ({
46
+ intervals: new Map(),
47
+ lastSnapshots: new Map(),
48
+ defaultBranches: new Map(),
49
+ }))
50
+ .sessionHook('onSessionReady', async (ctx) => {
51
+ const workdir = ctx.sessionState.workspaceDir
52
+ if (!workdir) return
53
+
54
+ const sessionId = ctx.sessionId
55
+ const pluginCtx = ctx.pluginContext
56
+ const processRunner = ctx.platform.process
57
+
58
+ const tick = async () => {
59
+ let baseBranch = pluginCtx.defaultBranches.get(sessionId)
60
+ if (!baseBranch) {
61
+ baseBranch = await detectDefaultBranch(processRunner, workdir) ?? DEFAULT_BRANCH_FALLBACK
62
+ pluginCtx.defaultBranches.set(sessionId, baseBranch)
63
+ }
64
+
65
+ const snapshot = await computeGitStatus(processRunner, workdir, baseBranch)
66
+ if (!snapshot) {
67
+ ctx.logger.warn('git-status: snapshot failed', { sessionId, workdir, baseBranch })
68
+ return
69
+ }
70
+
71
+ const last = pluginCtx.lastSnapshots.get(sessionId)
72
+ if (last && snapshotsEqual(last, snapshot)) return
73
+
74
+ pluginCtx.lastSnapshots.set(sessionId, snapshot)
75
+ ctx.notify('git_status_changed', {
76
+ sessionId,
77
+ committedAhead: snapshot.committedAhead,
78
+ uncommittedFiles: snapshot.uncommittedFiles,
79
+ lastCommitAt: snapshot.lastCommitAt,
80
+ lastCommitMessage: snapshot.lastCommitMessage,
81
+ updatedAt: Date.now(),
82
+ })
83
+ }
84
+
85
+ const runTick = () => {
86
+ tick().catch((err) => {
87
+ ctx.logger.warn('git-status tick failed', { sessionId, err: err instanceof Error ? err.message : String(err) })
88
+ })
89
+ }
90
+
91
+ runTick()
92
+ const interval = setInterval(runTick, POLL_INTERVAL_MS)
93
+
94
+ pluginCtx.intervals.set(sessionId, interval)
95
+ })
96
+ .sessionHook('onSessionClose', async (ctx) => {
97
+ const sessionId = ctx.sessionId
98
+ const pluginCtx = ctx.pluginContext
99
+ const interval = pluginCtx.intervals.get(sessionId)
100
+ if (interval) {
101
+ clearInterval(interval)
102
+ pluginCtx.intervals.delete(sessionId)
103
+ }
104
+ pluginCtx.lastSnapshots.delete(sessionId)
105
+ pluginCtx.defaultBranches.delete(sessionId)
106
+ })
107
+ .build()
108
+
109
+ function snapshotsEqual(a: GitStatusSnapshot, b: GitStatusSnapshot): boolean {
110
+ return a.committedAhead === b.committedAhead
111
+ && a.uncommittedFiles === b.uncommittedFiles
112
+ && a.lastCommitAt === b.lastCommitAt
113
+ && a.lastCommitMessage === b.lastCommitMessage
114
+ }
115
+
116
+ async function computeGitStatus(process: ProcessRunner, workdir: string, baseBranch: string): Promise<GitStatusSnapshot | null> {
117
+ const countOutput = await runGit(process, workdir, ['rev-list', '--count', `${baseBranch}..HEAD`])
118
+ if (countOutput === null) return null
119
+ const committedAhead = Number.parseInt(countOutput.trim(), 10)
120
+ if (!Number.isFinite(committedAhead)) return null
121
+
122
+ const statusOutput = await runGit(process, workdir, ['status', '--porcelain'])
123
+ if (statusOutput === null) return null
124
+ const uncommittedFiles = countNonEmptyLines(statusOutput)
125
+
126
+ const logOutput = await runGit(process, workdir, ['log', '-1', '--format=%ct|%s', 'HEAD'])
127
+ if (logOutput === null) return null
128
+
129
+ let lastCommitAt: number | null = null
130
+ let lastCommitMessage: string | null = null
131
+ const trimmed = logOutput.trim()
132
+ if (trimmed.length > 0) {
133
+ const [tsRaw, ...rest] = trimmed.split('|')
134
+ const ts = Number.parseInt(tsRaw ?? '', 10)
135
+ if (Number.isFinite(ts)) lastCommitAt = ts * 1000
136
+ lastCommitMessage = rest.join('|').trim() || null
137
+ }
138
+
139
+ return { committedAhead, uncommittedFiles, lastCommitAt, lastCommitMessage }
140
+ }
141
+
142
+ async function detectDefaultBranch(process: ProcessRunner, workdir: string): Promise<string | null> {
143
+ const output = await runGit(process, workdir, ['symbolic-ref', '--short', 'refs/remotes/origin/HEAD'])
144
+ if (output === null) return null
145
+ const trimmed = output.trim()
146
+ if (!trimmed.startsWith('origin/')) return null
147
+ const branch = trimmed.slice('origin/'.length)
148
+ return branch.length > 0 ? branch : null
149
+ }
150
+
151
+ async function runGit(process: ProcessRunner, workdir: string, args: string[]): Promise<string | null> {
152
+ try {
153
+ const { stdout } = await process.execFile('git', args, { cwd: workdir, timeout: GIT_TIMEOUT_MS, maxBuffer: 1024 * 1024 })
154
+ return stdout
155
+ } catch {
156
+ return null
157
+ }
158
+ }
159
+
160
+ function countNonEmptyLines(output: string): number {
161
+ let count = 0
162
+ for (const line of output.split('\n')) {
163
+ if (line.length > 0) count += 1
164
+ }
165
+ return count
166
+ }
@@ -0,0 +1,26 @@
1
+ // ============================================================================
2
+ // Agent Limits
3
+ // ============================================================================
4
+
5
+ /**
6
+ * Anti-looping limits for agents.
7
+ * All fields are optional - defaults applied via resolveAgentLimits().
8
+ */
9
+ export interface AgentLimits {
10
+ /** Maximum number of inference turns. Default: 100 */
11
+ maxTurns?: number
12
+ /** Maximum total tool calls. Default: 200 */
13
+ maxToolCalls?: number
14
+ /** Maximum consecutive failures for the same tool before blocking. Default: 3 */
15
+ maxConsecutiveToolFailures?: number
16
+ /** Maximum child agents this agent can spawn. Default: 10 */
17
+ maxSpawnedAgents?: number
18
+ /** Maximum messages sent to other agents. Default: 100 */
19
+ maxMessagesSent?: number
20
+ /** Ratio of hard limit at which soft warning is emitted. Default: 0.8 */
21
+ softLimitRatio?: number
22
+ /** Maximum consecutive identical tool calls (same name+input hash). Default: 3 */
23
+ maxRepeatedToolCalls?: number
24
+ /** Maximum consecutive identical text-only responses. Default: 3 */
25
+ maxRepeatedResponses?: number
26
+ }
@@ -0,0 +1,4 @@
1
+ export type { AgentLimits } from './config.js'
2
+ export { limitsGuardPlugin } from './plugin.js'
3
+ export type { AgentCounters, LimitsAgentConfig, LimitWarningEvent } from './plugin.js'
4
+ export { createAgentCounters, limitsEvents } from './plugin.js'