@roj-ai/sdk 0.1.35 → 0.2.1

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 (908) hide show
  1. package/dist/bootstrap.d.ts +420 -26
  2. package/dist/bootstrap.d.ts.map +1 -1
  3. package/dist/bootstrap.js +55 -24
  4. package/dist/bootstrap.js.map +1 -1
  5. package/dist/bun-platform/fs.d.ts.map +1 -1
  6. package/dist/bun-platform/fs.js +1 -0
  7. package/dist/bun-platform/fs.js.map +1 -1
  8. package/dist/bun-platform/index.d.ts +4 -1
  9. package/dist/bun-platform/index.d.ts.map +1 -1
  10. package/dist/bun-platform/index.js +7 -1
  11. package/dist/bun-platform/index.js.map +1 -1
  12. package/dist/bun-platform/server-lifecycle.d.ts +30 -0
  13. package/dist/bun-platform/server-lifecycle.d.ts.map +1 -0
  14. package/dist/bun-platform/server-lifecycle.js +182 -0
  15. package/dist/bun-platform/server-lifecycle.js.map +1 -0
  16. package/dist/bun-platform/shell.d.ts +33 -0
  17. package/dist/bun-platform/shell.d.ts.map +1 -0
  18. package/dist/bun-platform/shell.js +322 -0
  19. package/dist/bun-platform/shell.js.map +1 -0
  20. package/dist/config.d.ts +34 -0
  21. package/dist/config.d.ts.map +1 -1
  22. package/dist/config.js +97 -0
  23. package/dist/config.js.map +1 -1
  24. package/dist/core/agents/agent.d.ts +42 -7
  25. package/dist/core/agents/agent.d.ts.map +1 -1
  26. package/dist/core/agents/agent.js +209 -90
  27. package/dist/core/agents/agent.js.map +1 -1
  28. package/dist/core/agents/config.d.ts +8 -1
  29. package/dist/core/agents/config.d.ts.map +1 -1
  30. package/dist/core/agents/config.js +5 -1
  31. package/dist/core/agents/config.js.map +1 -1
  32. package/dist/core/agents/retry.d.ts +1 -1
  33. package/dist/core/agents/retry.d.ts.map +1 -1
  34. package/dist/core/agents/retry.js +14 -16
  35. package/dist/core/agents/retry.js.map +1 -1
  36. package/dist/core/agents/state.d.ts +27 -1
  37. package/dist/core/agents/state.d.ts.map +1 -1
  38. package/dist/core/agents/state.js +1 -1
  39. package/dist/core/agents/state.js.map +1 -1
  40. package/dist/core/context/state.d.ts +3 -3
  41. package/dist/core/context/state.d.ts.map +1 -1
  42. package/dist/core/context/state.js +6 -2
  43. package/dist/core/context/state.js.map +1 -1
  44. package/dist/core/events/base-event-store.d.ts.map +1 -1
  45. package/dist/core/events/base-event-store.js +22 -14
  46. package/dist/core/events/base-event-store.js.map +1 -1
  47. package/dist/core/events/file.d.ts +39 -1
  48. package/dist/core/events/file.d.ts.map +1 -1
  49. package/dist/core/events/file.js +159 -20
  50. package/dist/core/events/file.js.map +1 -1
  51. package/dist/core/events/types.d.ts +1 -1
  52. package/dist/core/file-store/containment.d.ts +19 -0
  53. package/dist/core/file-store/containment.d.ts.map +1 -0
  54. package/dist/core/file-store/containment.js +62 -0
  55. package/dist/core/file-store/containment.js.map +1 -0
  56. package/dist/core/file-store/file-store.d.ts +22 -2
  57. package/dist/core/file-store/file-store.d.ts.map +1 -1
  58. package/dist/core/file-store/file-store.js +88 -20
  59. package/dist/core/file-store/file-store.js.map +1 -1
  60. package/dist/core/file-store/types.d.ts +13 -1
  61. package/dist/core/file-store/types.d.ts.map +1 -1
  62. package/dist/core/image/image-processor.d.ts.map +1 -1
  63. package/dist/core/image/image-processor.js +3 -1
  64. package/dist/core/image/image-processor.js.map +1 -1
  65. package/dist/core/image/types.d.ts +2 -0
  66. package/dist/core/image/types.d.ts.map +1 -1
  67. package/dist/core/image/vips-resizer.d.ts.map +1 -1
  68. package/dist/core/image/vips-resizer.js +81 -33
  69. package/dist/core/image/vips-resizer.js.map +1 -1
  70. package/dist/core/llm/anthropic.d.ts +0 -1
  71. package/dist/core/llm/anthropic.d.ts.map +1 -1
  72. package/dist/core/llm/anthropic.js +101 -74
  73. package/dist/core/llm/anthropic.js.map +1 -1
  74. package/dist/core/llm/logger.d.ts +14 -2
  75. package/dist/core/llm/logger.d.ts.map +1 -1
  76. package/dist/core/llm/logger.js +161 -36
  77. package/dist/core/llm/logger.js.map +1 -1
  78. package/dist/core/llm/openrouter.d.ts +0 -1
  79. package/dist/core/llm/openrouter.d.ts.map +1 -1
  80. package/dist/core/llm/openrouter.js +70 -74
  81. package/dist/core/llm/openrouter.js.map +1 -1
  82. package/dist/core/llm/provider-request.d.ts +10 -0
  83. package/dist/core/llm/provider-request.d.ts.map +1 -0
  84. package/dist/core/llm/provider-request.js +41 -0
  85. package/dist/core/llm/provider-request.js.map +1 -0
  86. package/dist/core/llm/provider.d.ts +45 -3
  87. package/dist/core/llm/provider.d.ts.map +1 -1
  88. package/dist/core/llm/provider.js +26 -0
  89. package/dist/core/llm/provider.js.map +1 -1
  90. package/dist/core/llm/state.d.ts +4 -2
  91. package/dist/core/llm/state.d.ts.map +1 -1
  92. package/dist/core/llm/state.js +15 -4
  93. package/dist/core/llm/state.js.map +1 -1
  94. package/dist/core/plugins/plugin-builder.d.ts +57 -3
  95. package/dist/core/plugins/plugin-builder.d.ts.map +1 -1
  96. package/dist/core/plugins/plugin-builder.js +68 -14
  97. package/dist/core/plugins/plugin-builder.js.map +1 -1
  98. package/dist/core/preset/preset-builder.d.ts +3 -2
  99. package/dist/core/preset/preset-builder.d.ts.map +1 -1
  100. package/dist/core/preset/preset-builder.js +7 -16
  101. package/dist/core/preset/preset-builder.js.map +1 -1
  102. package/dist/core/sessions/context.d.ts +23 -5
  103. package/dist/core/sessions/context.d.ts.map +1 -1
  104. package/dist/core/sessions/runtime-activity.d.ts +33 -0
  105. package/dist/core/sessions/runtime-activity.d.ts.map +1 -0
  106. package/dist/core/sessions/runtime-activity.js +55 -0
  107. package/dist/core/sessions/runtime-activity.js.map +1 -0
  108. package/dist/core/sessions/schema.d.ts +23 -2
  109. package/dist/core/sessions/schema.d.ts.map +1 -1
  110. package/dist/core/sessions/schema.js +24 -3
  111. package/dist/core/sessions/schema.js.map +1 -1
  112. package/dist/core/sessions/session-manager.d.ts +83 -6
  113. package/dist/core/sessions/session-manager.d.ts.map +1 -1
  114. package/dist/core/sessions/session-manager.js +517 -118
  115. package/dist/core/sessions/session-manager.js.map +1 -1
  116. package/dist/core/sessions/session-store.d.ts +18 -0
  117. package/dist/core/sessions/session-store.d.ts.map +1 -1
  118. package/dist/core/sessions/session-store.js +33 -0
  119. package/dist/core/sessions/session-store.js.map +1 -1
  120. package/dist/core/sessions/session.d.ts +42 -6
  121. package/dist/core/sessions/session.d.ts.map +1 -1
  122. package/dist/core/sessions/session.js +176 -44
  123. package/dist/core/sessions/session.js.map +1 -1
  124. package/dist/core/sessions/state.d.ts +10 -1
  125. package/dist/core/sessions/state.d.ts.map +1 -1
  126. package/dist/core/sessions/state.js +16 -1
  127. package/dist/core/sessions/state.js.map +1 -1
  128. package/dist/core/system.d.ts +9 -0
  129. package/dist/core/system.d.ts.map +1 -1
  130. package/dist/core/system.js +4 -1
  131. package/dist/core/system.js.map +1 -1
  132. package/dist/core/tools/executor.d.ts +1 -1
  133. package/dist/core/wake-key.d.ts +34 -0
  134. package/dist/core/wake-key.d.ts.map +1 -0
  135. package/dist/core/wake-key.js +51 -0
  136. package/dist/core/wake-key.js.map +1 -0
  137. package/dist/index.d.ts +24 -13
  138. package/dist/index.d.ts.map +1 -1
  139. package/dist/index.js +22 -8
  140. package/dist/index.js.map +1 -1
  141. package/dist/lib/archive/archive-inspection.d.ts +48 -0
  142. package/dist/lib/archive/archive-inspection.d.ts.map +1 -0
  143. package/dist/lib/archive/archive-inspection.fixtures.d.ts +7 -0
  144. package/dist/lib/archive/archive-inspection.fixtures.d.ts.map +1 -0
  145. package/dist/lib/archive/archive-inspection.fixtures.js +134 -0
  146. package/dist/lib/archive/archive-inspection.fixtures.js.map +1 -0
  147. package/dist/lib/archive/archive-inspection.js +253 -0
  148. package/dist/lib/archive/archive-inspection.js.map +1 -0
  149. package/dist/lib/archive/index.d.ts +3 -0
  150. package/dist/lib/archive/index.d.ts.map +1 -0
  151. package/dist/lib/archive/index.js +2 -0
  152. package/dist/lib/archive/index.js.map +1 -0
  153. package/dist/lib/logger/console.d.ts +5 -12
  154. package/dist/lib/logger/console.d.ts.map +1 -1
  155. package/dist/lib/logger/console.js +5 -47
  156. package/dist/lib/logger/console.js.map +1 -1
  157. package/dist/lib/logger/file.d.ts +8 -11
  158. package/dist/lib/logger/file.d.ts.map +1 -1
  159. package/dist/lib/logger/file.js +26 -37
  160. package/dist/lib/logger/file.js.map +1 -1
  161. package/dist/lib/logger/index.d.ts +3 -1
  162. package/dist/lib/logger/index.d.ts.map +1 -1
  163. package/dist/lib/logger/index.js +3 -1
  164. package/dist/lib/logger/index.js.map +1 -1
  165. package/dist/lib/logger/jsonl.d.ts +21 -0
  166. package/dist/lib/logger/jsonl.d.ts.map +1 -0
  167. package/dist/lib/logger/jsonl.js +29 -0
  168. package/dist/lib/logger/jsonl.js.map +1 -0
  169. package/dist/lib/logger/logger.d.ts +22 -0
  170. package/dist/lib/logger/logger.d.ts.map +1 -1
  171. package/dist/lib/logger/logger.js +37 -0
  172. package/dist/lib/logger/logger.js.map +1 -1
  173. package/dist/lib/logger/session-log.d.ts +21 -0
  174. package/dist/lib/logger/session-log.d.ts.map +1 -0
  175. package/dist/lib/logger/session-log.js +37 -0
  176. package/dist/lib/logger/session-log.js.map +1 -0
  177. package/dist/lib/utils/concurrency.d.ts +1 -1
  178. package/dist/lib/utils/concurrency.d.ts.map +1 -1
  179. package/dist/lib/utils/concurrency.js +30 -7
  180. package/dist/lib/utils/concurrency.js.map +1 -1
  181. package/dist/lib/utils/fs-batch.d.ts +17 -0
  182. package/dist/lib/utils/fs-batch.d.ts.map +1 -0
  183. package/dist/lib/utils/fs-batch.js +38 -0
  184. package/dist/lib/utils/fs-batch.js.map +1 -0
  185. package/dist/lib/utils/result.d.ts +7 -22
  186. package/dist/lib/utils/result.d.ts.map +1 -1
  187. package/dist/lib/utils/result.js +6 -17
  188. package/dist/lib/utils/result.js.map +1 -1
  189. package/dist/lib/utils/sleep.d.ts +10 -0
  190. package/dist/lib/utils/sleep.d.ts.map +1 -0
  191. package/dist/lib/utils/sleep.js +26 -0
  192. package/dist/lib/utils/sleep.js.map +1 -0
  193. package/dist/platform/fs-revision.d.ts +21 -0
  194. package/dist/platform/fs-revision.d.ts.map +1 -0
  195. package/dist/platform/fs-revision.js +9 -0
  196. package/dist/platform/fs-revision.js.map +1 -0
  197. package/dist/platform/fs.d.ts +104 -1
  198. package/dist/platform/fs.d.ts.map +1 -1
  199. package/dist/platform/git.d.ts +59 -0
  200. package/dist/platform/git.d.ts.map +1 -0
  201. package/dist/platform/git.js +8 -0
  202. package/dist/platform/git.js.map +1 -0
  203. package/dist/platform/index.d.ts +40 -1
  204. package/dist/platform/index.d.ts.map +1 -1
  205. package/dist/platform/index.js +1 -1
  206. package/dist/platform/index.js.map +1 -1
  207. package/dist/platform/llm-call-log.d.ts +80 -0
  208. package/dist/platform/llm-call-log.d.ts.map +1 -0
  209. package/dist/platform/llm-call-log.js +12 -0
  210. package/dist/platform/llm-call-log.js.map +1 -0
  211. package/dist/platform/scheduler.d.ts +32 -0
  212. package/dist/platform/scheduler.d.ts.map +1 -0
  213. package/dist/platform/scheduler.js +46 -0
  214. package/dist/platform/scheduler.js.map +1 -0
  215. package/dist/platform/session-log.d.ts +36 -0
  216. package/dist/platform/session-log.d.ts.map +1 -0
  217. package/dist/platform/session-log.js +12 -0
  218. package/dist/platform/session-log.js.map +1 -0
  219. package/dist/platform/shell.d.ts +83 -0
  220. package/dist/platform/shell.d.ts.map +1 -0
  221. package/dist/platform/shell.js +13 -0
  222. package/dist/platform/shell.js.map +1 -0
  223. package/dist/plugins/agent-status/plugin.d.ts.map +1 -1
  224. package/dist/plugins/agent-status/plugin.js +1 -0
  225. package/dist/plugins/agent-status/plugin.js.map +1 -1
  226. package/dist/plugins/agents/plugin.d.ts.map +1 -1
  227. package/dist/plugins/agents/plugin.js +129 -62
  228. package/dist/plugins/agents/plugin.js.map +1 -1
  229. package/dist/plugins/filesystem/listing.d.ts +3 -0
  230. package/dist/plugins/filesystem/listing.d.ts.map +1 -1
  231. package/dist/plugins/filesystem/listing.js +66 -10
  232. package/dist/plugins/filesystem/listing.js.map +1 -1
  233. package/dist/plugins/filesystem/plugin.d.ts.map +1 -1
  234. package/dist/plugins/filesystem/plugin.js +8 -6
  235. package/dist/plugins/filesystem/plugin.js.map +1 -1
  236. package/dist/plugins/git-status/plugin.d.ts +34 -7
  237. package/dist/plugins/git-status/plugin.d.ts.map +1 -1
  238. package/dist/plugins/git-status/plugin.js +168 -64
  239. package/dist/plugins/git-status/plugin.js.map +1 -1
  240. package/dist/plugins/llm-debug/plugin.d.ts.map +1 -1
  241. package/dist/plugins/llm-debug/plugin.js +1 -0
  242. package/dist/plugins/llm-debug/plugin.js.map +1 -1
  243. package/dist/plugins/logs/plugin.d.ts +1 -4
  244. package/dist/plugins/logs/plugin.d.ts.map +1 -1
  245. package/dist/plugins/logs/plugin.js +7 -0
  246. package/dist/plugins/logs/plugin.js.map +1 -1
  247. package/dist/plugins/mailbox/helpers.d.ts +2 -2
  248. package/dist/plugins/mailbox/helpers.js +1 -1
  249. package/dist/plugins/mailbox/plugin.d.ts.map +1 -1
  250. package/dist/plugins/mailbox/plugin.js +38 -43
  251. package/dist/plugins/mailbox/plugin.js.map +1 -1
  252. package/dist/plugins/mailbox/query.d.ts +7 -2
  253. package/dist/plugins/mailbox/query.d.ts.map +1 -1
  254. package/dist/plugins/mailbox/query.js +14 -7
  255. package/dist/plugins/mailbox/query.js.map +1 -1
  256. package/dist/plugins/mailbox/state.d.ts +5 -4
  257. package/dist/plugins/mailbox/state.d.ts.map +1 -1
  258. package/dist/plugins/mailbox/state.js +6 -5
  259. package/dist/plugins/mailbox/state.js.map +1 -1
  260. package/dist/plugins/resources/filename.d.ts +4 -0
  261. package/dist/plugins/resources/filename.d.ts.map +1 -0
  262. package/dist/plugins/resources/filename.js +18 -0
  263. package/dist/plugins/resources/filename.js.map +1 -0
  264. package/dist/plugins/resources/plugin.d.ts +3 -0
  265. package/dist/plugins/resources/plugin.d.ts.map +1 -1
  266. package/dist/plugins/resources/plugin.js +97 -60
  267. package/dist/plugins/resources/plugin.js.map +1 -1
  268. package/dist/plugins/resources/state.d.ts +1 -1
  269. package/dist/plugins/resources/state.js +1 -1
  270. package/dist/plugins/result-eviction/plugin.d.ts.map +1 -1
  271. package/dist/plugins/result-eviction/plugin.js +6 -1
  272. package/dist/plugins/result-eviction/plugin.js.map +1 -1
  273. package/dist/plugins/services/plugin.d.ts +4 -1
  274. package/dist/plugins/services/plugin.d.ts.map +1 -1
  275. package/dist/plugins/services/plugin.js +251 -100
  276. package/dist/plugins/services/plugin.js.map +1 -1
  277. package/dist/plugins/services/prompt.d.ts.map +1 -1
  278. package/dist/plugins/services/prompt.js +1 -4
  279. package/dist/plugins/services/prompt.js.map +1 -1
  280. package/dist/plugins/services/schema.d.ts +15 -5
  281. package/dist/plugins/services/schema.d.ts.map +1 -1
  282. package/dist/plugins/services/service.d.ts +100 -18
  283. package/dist/plugins/services/service.d.ts.map +1 -1
  284. package/dist/plugins/services/service.js +680 -230
  285. package/dist/plugins/services/service.js.map +1 -1
  286. package/dist/plugins/session-lifecycle/plugin.d.ts +21 -1
  287. package/dist/plugins/session-lifecycle/plugin.d.ts.map +1 -1
  288. package/dist/plugins/session-lifecycle/plugin.js +53 -40
  289. package/dist/plugins/session-lifecycle/plugin.js.map +1 -1
  290. package/dist/plugins/session-state/plugin.d.ts +21 -13
  291. package/dist/plugins/session-state/plugin.d.ts.map +1 -1
  292. package/dist/plugins/session-state/plugin.js +214 -79
  293. package/dist/plugins/session-state/plugin.js.map +1 -1
  294. package/dist/plugins/session-stats/plugin.d.ts.map +1 -1
  295. package/dist/plugins/session-stats/plugin.js +1 -0
  296. package/dist/plugins/session-stats/plugin.js.map +1 -1
  297. package/dist/plugins/shell/executor.d.ts +17 -15
  298. package/dist/plugins/shell/executor.d.ts.map +1 -1
  299. package/dist/plugins/shell/executor.js +130 -195
  300. package/dist/plugins/shell/executor.js.map +1 -1
  301. package/dist/plugins/shell/index.d.ts +2 -2
  302. package/dist/plugins/shell/index.d.ts.map +1 -1
  303. package/dist/plugins/shell/index.js +2 -2
  304. package/dist/plugins/shell/index.js.map +1 -1
  305. package/dist/plugins/shell/plugin.d.ts +5 -4
  306. package/dist/plugins/shell/plugin.d.ts.map +1 -1
  307. package/dist/plugins/shell/plugin.js +4 -8
  308. package/dist/plugins/shell/plugin.js.map +1 -1
  309. package/dist/plugins/skills/discovery.d.ts.map +1 -1
  310. package/dist/plugins/skills/discovery.js +10 -8
  311. package/dist/plugins/skills/discovery.js.map +1 -1
  312. package/dist/plugins/skills/index.d.ts +1 -1
  313. package/dist/plugins/skills/index.d.ts.map +1 -1
  314. package/dist/plugins/skills/plugin.d.ts +1 -1
  315. package/dist/plugins/skills/plugin.d.ts.map +1 -1
  316. package/dist/plugins/skills/plugin.js +23 -30
  317. package/dist/plugins/skills/plugin.js.map +1 -1
  318. package/dist/plugins/skills/prompts.d.ts +3 -3
  319. package/dist/plugins/skills/prompts.d.ts.map +1 -1
  320. package/dist/plugins/skills/prompts.js.map +1 -1
  321. package/dist/plugins/skills/schema.d.ts +4 -2
  322. package/dist/plugins/skills/schema.d.ts.map +1 -1
  323. package/dist/plugins/todo/schema.d.ts +1 -1
  324. package/dist/plugins/uploads/plugin.d.ts +11 -4
  325. package/dist/plugins/uploads/plugin.d.ts.map +1 -1
  326. package/dist/plugins/uploads/plugin.js +891 -225
  327. package/dist/plugins/uploads/plugin.js.map +1 -1
  328. package/dist/plugins/uploads/preprocessor.d.ts +14 -0
  329. package/dist/plugins/uploads/preprocessor.d.ts.map +1 -1
  330. package/dist/plugins/uploads/preprocessor.js +11 -0
  331. package/dist/plugins/uploads/preprocessor.js.map +1 -1
  332. package/dist/plugins/uploads/preprocessors/image-classifier.d.ts +1 -1
  333. package/dist/plugins/uploads/preprocessors/image-classifier.d.ts.map +1 -1
  334. package/dist/plugins/uploads/preprocessors/image-classifier.js +51 -26
  335. package/dist/plugins/uploads/preprocessors/image-classifier.js.map +1 -1
  336. package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.d.ts +2 -2
  337. package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.d.ts.map +1 -1
  338. package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.js +41 -16
  339. package/dist/plugins/uploads/preprocessors/markitdown-preprocessor.js.map +1 -1
  340. package/dist/plugins/uploads/preprocessors/pdf-preprocessor.d.ts +1 -1
  341. package/dist/plugins/uploads/preprocessors/pdf-preprocessor.d.ts.map +1 -1
  342. package/dist/plugins/uploads/preprocessors/pdf-preprocessor.js +29 -14
  343. package/dist/plugins/uploads/preprocessors/pdf-preprocessor.js.map +1 -1
  344. package/dist/plugins/uploads/preprocessors/zip-preprocessor.d.ts +1 -1
  345. package/dist/plugins/uploads/preprocessors/zip-preprocessor.d.ts.map +1 -1
  346. package/dist/plugins/uploads/preprocessors/zip-preprocessor.js +62 -34
  347. package/dist/plugins/uploads/preprocessors/zip-preprocessor.js.map +1 -1
  348. package/dist/plugins/uploads/schema.d.ts +25 -2
  349. package/dist/plugins/uploads/schema.d.ts.map +1 -1
  350. package/dist/plugins/uploads/schema.js +24 -3
  351. package/dist/plugins/uploads/schema.js.map +1 -1
  352. package/dist/plugins/uploads/state.d.ts +13 -1
  353. package/dist/plugins/uploads/state.d.ts.map +1 -1
  354. package/dist/plugins/uploads/state.js +4 -1
  355. package/dist/plugins/uploads/state.js.map +1 -1
  356. package/dist/plugins/user-chat/plugin.d.ts +12 -5
  357. package/dist/plugins/user-chat/plugin.d.ts.map +1 -1
  358. package/dist/plugins/user-chat/plugin.js +141 -32
  359. package/dist/plugins/user-chat/plugin.js.map +1 -1
  360. package/dist/plugins/workers/context.d.ts +35 -13
  361. package/dist/plugins/workers/context.d.ts.map +1 -1
  362. package/dist/plugins/workers/context.js +82 -32
  363. package/dist/plugins/workers/context.js.map +1 -1
  364. package/dist/plugins/workers/definition.d.ts +7 -0
  365. package/dist/plugins/workers/definition.d.ts.map +1 -1
  366. package/dist/plugins/workers/definition.js.map +1 -1
  367. package/dist/plugins/workers/index.d.ts +4 -4
  368. package/dist/plugins/workers/index.d.ts.map +1 -1
  369. package/dist/plugins/workers/index.js +2 -2
  370. package/dist/plugins/workers/index.js.map +1 -1
  371. package/dist/plugins/workers/plugin.d.ts +10 -57
  372. package/dist/plugins/workers/plugin.d.ts.map +1 -1
  373. package/dist/plugins/workers/plugin.js +385 -123
  374. package/dist/plugins/workers/plugin.js.map +1 -1
  375. package/dist/plugins/workers/state.d.ts +69 -0
  376. package/dist/plugins/workers/state.d.ts.map +1 -0
  377. package/dist/plugins/workers/state.js +52 -0
  378. package/dist/plugins/workers/state.js.map +1 -0
  379. package/dist/plugins/workers/worker.d.ts +15 -4
  380. package/dist/plugins/workers/worker.d.ts.map +1 -1
  381. package/dist/testing/conformance.d.ts +106 -0
  382. package/dist/testing/conformance.d.ts.map +1 -0
  383. package/dist/testing/conformance.js +1463 -0
  384. package/dist/testing/conformance.js.map +1 -0
  385. package/dist/testing/node-platform.d.ts.map +1 -1
  386. package/dist/testing/node-platform.js +5 -0
  387. package/dist/testing/node-platform.js.map +1 -1
  388. package/dist/testing/test-harness.d.ts +11 -1
  389. package/dist/testing/test-harness.d.ts.map +1 -1
  390. package/dist/testing/test-harness.js +17 -37
  391. package/dist/testing/test-harness.js.map +1 -1
  392. package/dist/testing/wait-helpers.d.ts.map +1 -1
  393. package/dist/testing/wait-helpers.js +1 -3
  394. package/dist/testing/wait-helpers.js.map +1 -1
  395. package/dist/transport/adapter/client-adapter.d.ts +6 -0
  396. package/dist/transport/adapter/client-adapter.d.ts.map +1 -1
  397. package/dist/transport/adapter/client-adapter.js +50 -3
  398. package/dist/transport/adapter/client-adapter.js.map +1 -1
  399. package/dist/transport/adapter/heartbeat.d.ts +16 -0
  400. package/dist/transport/adapter/heartbeat.d.ts.map +1 -0
  401. package/dist/transport/adapter/heartbeat.js +41 -0
  402. package/dist/transport/adapter/heartbeat.js.map +1 -0
  403. package/dist/transport/adapter/server-adapter.d.ts.map +1 -1
  404. package/dist/transport/adapter/server-adapter.js +6 -0
  405. package/dist/transport/adapter/server-adapter.js.map +1 -1
  406. package/dist/transport/http/app.d.ts +3 -30
  407. package/dist/transport/http/app.d.ts.map +1 -1
  408. package/dist/transport/http/app.js +3 -7
  409. package/dist/transport/http/app.js.map +1 -1
  410. package/dist/transport/http/context.d.ts +40 -0
  411. package/dist/transport/http/context.d.ts.map +1 -0
  412. package/dist/transport/http/context.js +17 -0
  413. package/dist/transport/http/context.js.map +1 -0
  414. package/dist/transport/http/fetch-guard.d.ts +49 -0
  415. package/dist/transport/http/fetch-guard.d.ts.map +1 -0
  416. package/dist/transport/http/fetch-guard.js +312 -0
  417. package/dist/transport/http/fetch-guard.js.map +1 -0
  418. package/dist/transport/http/index.d.ts +1 -1
  419. package/dist/transport/http/index.d.ts.map +1 -1
  420. package/dist/transport/http/middleware/bearer-auth.d.ts +1 -1
  421. package/dist/transport/http/middleware/bearer-auth.d.ts.map +1 -1
  422. package/dist/transport/http/middleware/error-handler.d.ts +2 -2
  423. package/dist/transport/http/middleware/error-handler.d.ts.map +1 -1
  424. package/dist/transport/http/path-containment.d.ts +20 -0
  425. package/dist/transport/http/path-containment.d.ts.map +1 -0
  426. package/dist/transport/http/path-containment.js +31 -0
  427. package/dist/transport/http/path-containment.js.map +1 -0
  428. package/dist/transport/http/responses.d.ts +30 -0
  429. package/dist/transport/http/responses.d.ts.map +1 -0
  430. package/dist/transport/http/responses.js +5 -0
  431. package/dist/transport/http/responses.js.map +1 -0
  432. package/dist/transport/http/routes/files.d.ts +1 -1
  433. package/dist/transport/http/routes/files.d.ts.map +1 -1
  434. package/dist/transport/http/routes/files.js +54 -155
  435. package/dist/transport/http/routes/files.js.map +1 -1
  436. package/dist/transport/http/routes/resources.d.ts +1 -1
  437. package/dist/transport/http/routes/resources.d.ts.map +1 -1
  438. package/dist/transport/http/routes/resources.js +92 -57
  439. package/dist/transport/http/routes/resources.js.map +1 -1
  440. package/dist/transport/http/routes/rpc.d.ts +6 -1
  441. package/dist/transport/http/routes/rpc.d.ts.map +1 -1
  442. package/dist/transport/http/routes/rpc.js +51 -21
  443. package/dist/transport/http/routes/rpc.js.map +1 -1
  444. package/dist/transport/http/routes/upload.d.ts +1 -1
  445. package/dist/transport/http/routes/upload.d.ts.map +1 -1
  446. package/dist/transport/http/routes/upload.js +256 -169
  447. package/dist/transport/http/routes/upload.js.map +1 -1
  448. package/dist/user-config.d.ts +34 -7
  449. package/dist/user-config.d.ts.map +1 -1
  450. package/dist/user-config.js +71 -0
  451. package/dist/user-config.js.map +1 -1
  452. package/package.json +18 -8
  453. package/src/bootstrap.ts +119 -35
  454. package/src/bun-platform/fs.ts +1 -0
  455. package/src/bun-platform/index.ts +18 -1
  456. package/src/bun-platform/server-lifecycle.ts +218 -0
  457. package/src/bun-platform/shell.ts +362 -0
  458. package/src/config.ts +130 -0
  459. package/src/core/agents/agent.ts +219 -95
  460. package/src/core/agents/config.ts +8 -0
  461. package/src/core/agents/retry.ts +16 -17
  462. package/src/core/agents/state.ts +28 -0
  463. package/src/core/context/state.ts +4 -0
  464. package/src/core/events/base-event-store.ts +24 -16
  465. package/src/core/events/file.ts +198 -22
  466. package/src/core/file-store/containment.ts +75 -0
  467. package/src/core/file-store/file-store.ts +106 -25
  468. package/src/core/file-store/types.ts +14 -1
  469. package/src/core/image/image-processor.ts +3 -1
  470. package/src/core/image/types.ts +2 -0
  471. package/src/core/image/vips-resizer.ts +102 -37
  472. package/src/core/llm/anthropic.ts +127 -82
  473. package/src/core/llm/logger.ts +175 -37
  474. package/src/core/llm/openrouter.ts +82 -81
  475. package/src/core/llm/provider-request.ts +40 -0
  476. package/src/core/llm/provider.ts +72 -3
  477. package/src/core/llm/state.ts +12 -0
  478. package/src/core/plugins/plugin-builder.ts +106 -14
  479. package/src/core/preset/preset-builder.ts +12 -22
  480. package/src/core/sessions/context.ts +18 -0
  481. package/src/core/sessions/runtime-activity.ts +78 -0
  482. package/src/core/sessions/schema.ts +29 -3
  483. package/src/core/sessions/session-manager.ts +560 -140
  484. package/src/core/sessions/session-store.ts +38 -0
  485. package/src/core/sessions/session.ts +187 -47
  486. package/src/core/sessions/state.ts +16 -0
  487. package/src/core/system.ts +15 -0
  488. package/src/core/wake-key.ts +65 -0
  489. package/src/index.ts +31 -12
  490. package/src/lib/archive/archive-inspection.fixtures.ts +138 -0
  491. package/src/lib/archive/archive-inspection.ts +359 -0
  492. package/src/lib/archive/index.ts +17 -0
  493. package/src/lib/logger/console.ts +7 -57
  494. package/src/lib/logger/file.ts +28 -50
  495. package/src/lib/logger/index.ts +3 -1
  496. package/src/lib/logger/jsonl.ts +36 -0
  497. package/src/lib/logger/logger.ts +48 -0
  498. package/src/lib/logger/session-log.ts +42 -0
  499. package/src/lib/utils/concurrency.ts +37 -8
  500. package/src/lib/utils/fs-batch.ts +49 -0
  501. package/src/lib/utils/result.ts +7 -31
  502. package/src/lib/utils/sleep.ts +23 -0
  503. package/src/platform/fs-revision.ts +21 -0
  504. package/src/platform/fs.ts +109 -1
  505. package/src/platform/git.ts +67 -0
  506. package/src/platform/index.ts +51 -1
  507. package/src/platform/llm-call-log.ts +86 -0
  508. package/src/platform/scheduler.ts +71 -0
  509. package/src/platform/session-log.ts +39 -0
  510. package/src/platform/shell.ts +89 -0
  511. package/src/plugins/agent-status/plugin.ts +1 -0
  512. package/src/plugins/agents/plugin.ts +134 -81
  513. package/src/plugins/filesystem/listing.ts +70 -12
  514. package/src/plugins/filesystem/plugin.ts +8 -6
  515. package/src/plugins/git-status/plugin.ts +204 -77
  516. package/src/plugins/llm-debug/plugin.ts +1 -0
  517. package/src/plugins/logs/plugin.ts +9 -0
  518. package/src/plugins/mailbox/plugin.ts +46 -64
  519. package/src/plugins/mailbox/query.ts +15 -7
  520. package/src/plugins/mailbox/state.ts +1 -0
  521. package/src/plugins/resources/filename.ts +19 -0
  522. package/src/plugins/resources/plugin.ts +111 -59
  523. package/src/plugins/result-eviction/plugin.ts +6 -1
  524. package/src/plugins/services/plugin.ts +254 -98
  525. package/src/plugins/services/prompt.ts +1 -6
  526. package/src/plugins/services/schema.ts +17 -3
  527. package/src/plugins/services/service.ts +702 -252
  528. package/src/plugins/session-lifecycle/plugin.ts +56 -41
  529. package/src/plugins/session-state/plugin.ts +242 -88
  530. package/src/plugins/session-stats/plugin.ts +1 -0
  531. package/src/plugins/shell/executor.ts +144 -226
  532. package/src/plugins/shell/index.ts +1 -4
  533. package/src/plugins/shell/plugin.ts +7 -9
  534. package/src/plugins/skills/discovery.ts +10 -8
  535. package/src/plugins/skills/index.ts +1 -1
  536. package/src/plugins/skills/plugin.ts +19 -27
  537. package/src/plugins/skills/prompts.ts +3 -3
  538. package/src/plugins/skills/schema.ts +5 -2
  539. package/src/plugins/uploads/plugin.ts +991 -273
  540. package/src/plugins/uploads/preprocessor.ts +25 -0
  541. package/src/plugins/uploads/preprocessors/image-classifier.ts +56 -25
  542. package/src/plugins/uploads/preprocessors/markitdown-preprocessor.ts +41 -15
  543. package/src/plugins/uploads/preprocessors/pdf-preprocessor.ts +32 -16
  544. package/src/plugins/uploads/preprocessors/zip-preprocessor.ts +67 -38
  545. package/src/plugins/uploads/schema.ts +30 -3
  546. package/src/plugins/uploads/state.ts +12 -0
  547. package/src/plugins/user-chat/plugin.ts +196 -40
  548. package/src/plugins/workers/context.ts +102 -39
  549. package/src/plugins/workers/definition.ts +7 -0
  550. package/src/plugins/workers/index.ts +4 -4
  551. package/src/plugins/workers/plugin.ts +461 -151
  552. package/src/plugins/workers/state.ts +64 -0
  553. package/src/plugins/workers/worker.ts +15 -4
  554. package/src/testing/conformance.ts +1751 -0
  555. package/src/testing/node-platform.ts +5 -0
  556. package/src/testing/test-harness.ts +21 -38
  557. package/src/testing/wait-helpers.ts +1 -4
  558. package/src/transport/adapter/client-adapter.ts +60 -3
  559. package/src/transport/adapter/heartbeat.ts +50 -0
  560. package/src/transport/adapter/server-adapter.ts +6 -0
  561. package/src/transport/http/app.ts +7 -35
  562. package/src/transport/http/context.ts +46 -0
  563. package/src/transport/http/fetch-guard.ts +318 -0
  564. package/src/transport/http/index.ts +1 -1
  565. package/src/transport/http/middleware/bearer-auth.ts +1 -1
  566. package/src/transport/http/middleware/error-handler.ts +1 -1
  567. package/src/transport/http/path-containment.ts +44 -0
  568. package/src/transport/http/responses.ts +20 -0
  569. package/src/transport/http/routes/files.ts +69 -159
  570. package/src/transport/http/routes/resources.ts +124 -93
  571. package/src/transport/http/routes/rpc.ts +63 -26
  572. package/src/transport/http/routes/upload.ts +327 -258
  573. package/src/user-config.ts +93 -7
  574. package/dist/config.test.d.ts +0 -2
  575. package/dist/config.test.d.ts.map +0 -1
  576. package/dist/config.test.js +0 -155
  577. package/dist/config.test.js.map +0 -1
  578. package/dist/core/agent-loop.integration.test.d.ts +0 -2
  579. package/dist/core/agent-loop.integration.test.d.ts.map +0 -1
  580. package/dist/core/agent-loop.integration.test.js +0 -414
  581. package/dist/core/agent-loop.integration.test.js.map +0 -1
  582. package/dist/core/agents/agent-config.test.d.ts +0 -2
  583. package/dist/core/agents/agent-config.test.d.ts.map +0 -1
  584. package/dist/core/agents/agent-config.test.js +0 -194
  585. package/dist/core/agents/agent-config.test.js.map +0 -1
  586. package/dist/core/agents/agent-shutdown.test.d.ts +0 -6
  587. package/dist/core/agents/agent-shutdown.test.d.ts.map +0 -1
  588. package/dist/core/agents/agent-shutdown.test.js +0 -180
  589. package/dist/core/agents/agent-shutdown.test.js.map +0 -1
  590. package/dist/core/agents/agent.test.d.ts +0 -2
  591. package/dist/core/agents/agent.test.d.ts.map +0 -1
  592. package/dist/core/agents/agent.test.js +0 -313
  593. package/dist/core/agents/agent.test.js.map +0 -1
  594. package/dist/core/agents/communicator.d.ts +0 -3
  595. package/dist/core/agents/communicator.d.ts.map +0 -1
  596. package/dist/core/agents/communicator.js +0 -13
  597. package/dist/core/agents/communicator.js.map +0 -1
  598. package/dist/core/agents/handler-events.test.d.ts +0 -5
  599. package/dist/core/agents/handler-events.test.d.ts.map +0 -1
  600. package/dist/core/agents/handler-events.test.js +0 -115
  601. package/dist/core/agents/handler-events.test.js.map +0 -1
  602. package/dist/core/agents/response-sanitizer.test.d.ts +0 -2
  603. package/dist/core/agents/response-sanitizer.test.d.ts.map +0 -1
  604. package/dist/core/agents/response-sanitizer.test.js +0 -101
  605. package/dist/core/agents/response-sanitizer.test.js.map +0 -1
  606. package/dist/core/error-recovery.integration.test.d.ts +0 -2
  607. package/dist/core/error-recovery.integration.test.d.ts.map +0 -1
  608. package/dist/core/error-recovery.integration.test.js +0 -288
  609. package/dist/core/error-recovery.integration.test.js.map +0 -1
  610. package/dist/core/event-sourcing.integration.test.d.ts +0 -2
  611. package/dist/core/event-sourcing.integration.test.d.ts.map +0 -1
  612. package/dist/core/event-sourcing.integration.test.js +0 -154
  613. package/dist/core/event-sourcing.integration.test.js.map +0 -1
  614. package/dist/core/events/file.test.d.ts +0 -2
  615. package/dist/core/events/file.test.d.ts.map +0 -1
  616. package/dist/core/events/file.test.js +0 -284
  617. package/dist/core/events/file.test.js.map +0 -1
  618. package/dist/core/events/memory.test.d.ts +0 -2
  619. package/dist/core/events/memory.test.d.ts.map +0 -1
  620. package/dist/core/events/memory.test.js +0 -502
  621. package/dist/core/events/memory.test.js.map +0 -1
  622. package/dist/core/image/image-processor.test.d.ts +0 -2
  623. package/dist/core/image/image-processor.test.d.ts.map +0 -1
  624. package/dist/core/image/image-processor.test.js +0 -171
  625. package/dist/core/image/image-processor.test.js.map +0 -1
  626. package/dist/core/image/vips-resizer.test.d.ts +0 -2
  627. package/dist/core/image/vips-resizer.test.d.ts.map +0 -1
  628. package/dist/core/image/vips-resizer.test.js +0 -336
  629. package/dist/core/image/vips-resizer.test.js.map +0 -1
  630. package/dist/core/llm/anthropic.test.d.ts +0 -2
  631. package/dist/core/llm/anthropic.test.d.ts.map +0 -1
  632. package/dist/core/llm/anthropic.test.js +0 -464
  633. package/dist/core/llm/anthropic.test.js.map +0 -1
  634. package/dist/core/llm/cache-breakpoints.test.d.ts +0 -2
  635. package/dist/core/llm/cache-breakpoints.test.d.ts.map +0 -1
  636. package/dist/core/llm/cache-breakpoints.test.js +0 -69
  637. package/dist/core/llm/cache-breakpoints.test.js.map +0 -1
  638. package/dist/core/llm/cache-live.test.d.ts +0 -16
  639. package/dist/core/llm/cache-live.test.d.ts.map +0 -1
  640. package/dist/core/llm/cache-live.test.js +0 -137
  641. package/dist/core/llm/cache-live.test.js.map +0 -1
  642. package/dist/core/llm/logger.test.d.ts +0 -7
  643. package/dist/core/llm/logger.test.d.ts.map +0 -1
  644. package/dist/core/llm/logger.test.js +0 -228
  645. package/dist/core/llm/logger.test.js.map +0 -1
  646. package/dist/core/llm/message-sanitization.test.d.ts +0 -2
  647. package/dist/core/llm/message-sanitization.test.d.ts.map +0 -1
  648. package/dist/core/llm/message-sanitization.test.js +0 -181
  649. package/dist/core/llm/message-sanitization.test.js.map +0 -1
  650. package/dist/core/llm/mock.test.d.ts +0 -2
  651. package/dist/core/llm/mock.test.d.ts.map +0 -1
  652. package/dist/core/llm/mock.test.js +0 -318
  653. package/dist/core/llm/mock.test.js.map +0 -1
  654. package/dist/core/llm/openrouter-mapping.test.d.ts +0 -2
  655. package/dist/core/llm/openrouter-mapping.test.d.ts.map +0 -1
  656. package/dist/core/llm/openrouter-mapping.test.js +0 -172
  657. package/dist/core/llm/openrouter-mapping.test.js.map +0 -1
  658. package/dist/core/llm/openrouter.test.d.ts +0 -2
  659. package/dist/core/llm/openrouter.test.d.ts.map +0 -1
  660. package/dist/core/llm/openrouter.test.js +0 -377
  661. package/dist/core/llm/openrouter.test.js.map +0 -1
  662. package/dist/core/llm/provider-integration.test.d.ts +0 -12
  663. package/dist/core/llm/provider-integration.test.d.ts.map +0 -1
  664. package/dist/core/llm/provider-integration.test.js +0 -350
  665. package/dist/core/llm/provider-integration.test.js.map +0 -1
  666. package/dist/core/llm/routing-provider.test.d.ts +0 -2
  667. package/dist/core/llm/routing-provider.test.d.ts.map +0 -1
  668. package/dist/core/llm/routing-provider.test.js +0 -94
  669. package/dist/core/llm/routing-provider.test.js.map +0 -1
  670. package/dist/core/llm/snapshot-middleware.test.d.ts +0 -2
  671. package/dist/core/llm/snapshot-middleware.test.d.ts.map +0 -1
  672. package/dist/core/llm/snapshot-middleware.test.js +0 -144
  673. package/dist/core/llm/snapshot-middleware.test.js.map +0 -1
  674. package/dist/core/multi-agent.integration.test.d.ts +0 -2
  675. package/dist/core/multi-agent.integration.test.d.ts.map +0 -1
  676. package/dist/core/multi-agent.integration.test.js +0 -298
  677. package/dist/core/multi-agent.integration.test.js.map +0 -1
  678. package/dist/core/plugin-hooks.integration.test.d.ts +0 -2
  679. package/dist/core/plugin-hooks.integration.test.d.ts.map +0 -1
  680. package/dist/core/plugin-hooks.integration.test.js +0 -458
  681. package/dist/core/plugin-hooks.integration.test.js.map +0 -1
  682. package/dist/core/session-lifecycle.integration.test.d.ts +0 -2
  683. package/dist/core/session-lifecycle.integration.test.d.ts.map +0 -1
  684. package/dist/core/session-lifecycle.integration.test.js +0 -159
  685. package/dist/core/session-lifecycle.integration.test.js.map +0 -1
  686. package/dist/core/sessions/fork-utils.test.d.ts +0 -2
  687. package/dist/core/sessions/fork-utils.test.d.ts.map +0 -1
  688. package/dist/core/sessions/fork-utils.test.js +0 -129
  689. package/dist/core/sessions/fork-utils.test.js.map +0 -1
  690. package/dist/core/sessions/session-overrides.integration.test.d.ts +0 -2
  691. package/dist/core/sessions/session-overrides.integration.test.d.ts.map +0 -1
  692. package/dist/core/sessions/session-overrides.integration.test.js +0 -154
  693. package/dist/core/sessions/session-overrides.integration.test.js.map +0 -1
  694. package/dist/core/sessions/session.test.d.ts +0 -2
  695. package/dist/core/sessions/session.test.d.ts.map +0 -1
  696. package/dist/core/sessions/session.test.js +0 -1100
  697. package/dist/core/sessions/session.test.js.map +0 -1
  698. package/dist/core/tools/executor.test.d.ts +0 -2
  699. package/dist/core/tools/executor.test.d.ts.map +0 -1
  700. package/dist/core/tools/executor.test.js +0 -144
  701. package/dist/core/tools/executor.test.js.map +0 -1
  702. package/dist/lib/logger/console.test.d.ts +0 -2
  703. package/dist/lib/logger/console.test.d.ts.map +0 -1
  704. package/dist/lib/logger/console.test.js +0 -258
  705. package/dist/lib/logger/console.test.js.map +0 -1
  706. package/dist/lib/never.d.ts +0 -2
  707. package/dist/lib/never.d.ts.map +0 -1
  708. package/dist/lib/never.js +0 -4
  709. package/dist/lib/never.js.map +0 -1
  710. package/dist/lib/utils/concurrency.test.d.ts +0 -2
  711. package/dist/lib/utils/concurrency.test.d.ts.map +0 -1
  712. package/dist/lib/utils/concurrency.test.js +0 -135
  713. package/dist/lib/utils/concurrency.test.js.map +0 -1
  714. package/dist/plugins/agent-status/agent-status.test.d.ts +0 -2
  715. package/dist/plugins/agent-status/agent-status.test.d.ts.map +0 -1
  716. package/dist/plugins/agent-status/agent-status.test.js +0 -136
  717. package/dist/plugins/agent-status/agent-status.test.js.map +0 -1
  718. package/dist/plugins/agents/agents.integration.test.d.ts +0 -2
  719. package/dist/plugins/agents/agents.integration.test.d.ts.map +0 -1
  720. package/dist/plugins/agents/agents.integration.test.js +0 -830
  721. package/dist/plugins/agents/agents.integration.test.js.map +0 -1
  722. package/dist/plugins/agents/supervision.integration.test.d.ts +0 -2
  723. package/dist/plugins/agents/supervision.integration.test.d.ts.map +0 -1
  724. package/dist/plugins/agents/supervision.integration.test.js +0 -215
  725. package/dist/plugins/agents/supervision.integration.test.js.map +0 -1
  726. package/dist/plugins/context-compact/compaction-live.test.d.ts +0 -17
  727. package/dist/plugins/context-compact/compaction-live.test.d.ts.map +0 -1
  728. package/dist/plugins/context-compact/compaction-live.test.js +0 -177
  729. package/dist/plugins/context-compact/compaction-live.test.js.map +0 -1
  730. package/dist/plugins/context-compact/context-compact.integration.test.d.ts +0 -2
  731. package/dist/plugins/context-compact/context-compact.integration.test.d.ts.map +0 -1
  732. package/dist/plugins/context-compact/context-compact.integration.test.js +0 -364
  733. package/dist/plugins/context-compact/context-compact.integration.test.js.map +0 -1
  734. package/dist/plugins/context-compact/context-compactor.test.d.ts +0 -2
  735. package/dist/plugins/context-compact/context-compactor.test.d.ts.map +0 -1
  736. package/dist/plugins/context-compact/context-compactor.test.js +0 -858
  737. package/dist/plugins/context-compact/context-compactor.test.js.map +0 -1
  738. package/dist/plugins/context-compact/history-offloader.test.d.ts +0 -2
  739. package/dist/plugins/context-compact/history-offloader.test.d.ts.map +0 -1
  740. package/dist/plugins/context-compact/history-offloader.test.js +0 -77
  741. package/dist/plugins/context-compact/history-offloader.test.js.map +0 -1
  742. package/dist/plugins/filesystem/filesystem.integration.test.d.ts +0 -2
  743. package/dist/plugins/filesystem/filesystem.integration.test.d.ts.map +0 -1
  744. package/dist/plugins/filesystem/filesystem.integration.test.js +0 -447
  745. package/dist/plugins/filesystem/filesystem.integration.test.js.map +0 -1
  746. package/dist/plugins/filesystem/schema.d.ts +0 -7
  747. package/dist/plugins/filesystem/schema.d.ts.map +0 -1
  748. package/dist/plugins/filesystem/schema.js +0 -2
  749. package/dist/plugins/filesystem/schema.js.map +0 -1
  750. package/dist/plugins/limits-guard/limit-guard.test.d.ts +0 -2
  751. package/dist/plugins/limits-guard/limit-guard.test.d.ts.map +0 -1
  752. package/dist/plugins/limits-guard/limit-guard.test.js +0 -194
  753. package/dist/plugins/limits-guard/limit-guard.test.js.map +0 -1
  754. package/dist/plugins/limits-guard/limits-guard.integration.test.d.ts +0 -2
  755. package/dist/plugins/limits-guard/limits-guard.integration.test.d.ts.map +0 -1
  756. package/dist/plugins/limits-guard/limits-guard.integration.test.js +0 -887
  757. package/dist/plugins/limits-guard/limits-guard.integration.test.js.map +0 -1
  758. package/dist/plugins/llm-debug/llm-debug.integration.test.d.ts +0 -2
  759. package/dist/plugins/llm-debug/llm-debug.integration.test.d.ts.map +0 -1
  760. package/dist/plugins/llm-debug/llm-debug.integration.test.js +0 -157
  761. package/dist/plugins/llm-debug/llm-debug.integration.test.js.map +0 -1
  762. package/dist/plugins/mailbox/mailbox.integration.test.d.ts +0 -2
  763. package/dist/plugins/mailbox/mailbox.integration.test.d.ts.map +0 -1
  764. package/dist/plugins/mailbox/mailbox.integration.test.js +0 -678
  765. package/dist/plugins/mailbox/mailbox.integration.test.js.map +0 -1
  766. package/dist/plugins/resources/resources.integration.test.d.ts +0 -2
  767. package/dist/plugins/resources/resources.integration.test.d.ts.map +0 -1
  768. package/dist/plugins/resources/resources.integration.test.js +0 -62
  769. package/dist/plugins/resources/resources.integration.test.js.map +0 -1
  770. package/dist/plugins/result-eviction/result-eviction.integration.test.d.ts +0 -2
  771. package/dist/plugins/result-eviction/result-eviction.integration.test.d.ts.map +0 -1
  772. package/dist/plugins/result-eviction/result-eviction.integration.test.js +0 -294
  773. package/dist/plugins/result-eviction/result-eviction.integration.test.js.map +0 -1
  774. package/dist/plugins/services/pid-registry.test.d.ts +0 -2
  775. package/dist/plugins/services/pid-registry.test.d.ts.map +0 -1
  776. package/dist/plugins/services/pid-registry.test.js +0 -161
  777. package/dist/plugins/services/pid-registry.test.js.map +0 -1
  778. package/dist/plugins/services/services.integration.test.d.ts +0 -2
  779. package/dist/plugins/services/services.integration.test.d.ts.map +0 -1
  780. package/dist/plugins/services/services.integration.test.js +0 -1057
  781. package/dist/plugins/services/services.integration.test.js.map +0 -1
  782. package/dist/plugins/session-lifecycle/session-lifecycle.integration.test.d.ts +0 -2
  783. package/dist/plugins/session-lifecycle/session-lifecycle.integration.test.d.ts.map +0 -1
  784. package/dist/plugins/session-lifecycle/session-lifecycle.integration.test.js +0 -498
  785. package/dist/plugins/session-lifecycle/session-lifecycle.integration.test.js.map +0 -1
  786. package/dist/plugins/session-stats/plugin.test.d.ts +0 -2
  787. package/dist/plugins/session-stats/plugin.test.d.ts.map +0 -1
  788. package/dist/plugins/session-stats/plugin.test.js +0 -145
  789. package/dist/plugins/session-stats/plugin.test.js.map +0 -1
  790. package/dist/plugins/shell/shell.integration.test.d.ts +0 -2
  791. package/dist/plugins/shell/shell.integration.test.d.ts.map +0 -1
  792. package/dist/plugins/shell/shell.integration.test.js +0 -234
  793. package/dist/plugins/shell/shell.integration.test.js.map +0 -1
  794. package/dist/plugins/shell/shell.test.d.ts +0 -2
  795. package/dist/plugins/shell/shell.test.d.ts.map +0 -1
  796. package/dist/plugins/shell/shell.test.js +0 -236
  797. package/dist/plugins/shell/shell.test.js.map +0 -1
  798. package/dist/plugins/skills/discovery.test.d.ts +0 -2
  799. package/dist/plugins/skills/discovery.test.d.ts.map +0 -1
  800. package/dist/plugins/skills/discovery.test.js +0 -312
  801. package/dist/plugins/skills/discovery.test.js.map +0 -1
  802. package/dist/plugins/skills/skills.integration.test.d.ts +0 -2
  803. package/dist/plugins/skills/skills.integration.test.d.ts.map +0 -1
  804. package/dist/plugins/skills/skills.integration.test.js +0 -475
  805. package/dist/plugins/skills/skills.integration.test.js.map +0 -1
  806. package/dist/plugins/todo/todo.integration.test.d.ts +0 -2
  807. package/dist/plugins/todo/todo.integration.test.d.ts.map +0 -1
  808. package/dist/plugins/todo/todo.integration.test.js +0 -605
  809. package/dist/plugins/todo/todo.integration.test.js.map +0 -1
  810. package/dist/plugins/uploads/preprocessors/image-classifier.test.d.ts +0 -2
  811. package/dist/plugins/uploads/preprocessors/image-classifier.test.d.ts.map +0 -1
  812. package/dist/plugins/uploads/preprocessors/image-classifier.test.js +0 -113
  813. package/dist/plugins/uploads/preprocessors/image-classifier.test.js.map +0 -1
  814. package/dist/plugins/uploads/uploads.integration.test.d.ts +0 -2
  815. package/dist/plugins/uploads/uploads.integration.test.d.ts.map +0 -1
  816. package/dist/plugins/uploads/uploads.integration.test.js +0 -639
  817. package/dist/plugins/uploads/uploads.integration.test.js.map +0 -1
  818. package/dist/plugins/user-chat/user-chat.integration.test.d.ts +0 -2
  819. package/dist/plugins/user-chat/user-chat.integration.test.d.ts.map +0 -1
  820. package/dist/plugins/user-chat/user-chat.integration.test.js +0 -754
  821. package/dist/plugins/user-chat/user-chat.integration.test.js.map +0 -1
  822. package/dist/plugins/workers/workers.integration.test.d.ts +0 -2
  823. package/dist/plugins/workers/workers.integration.test.d.ts.map +0 -1
  824. package/dist/plugins/workers/workers.integration.test.js +0 -629
  825. package/dist/plugins/workers/workers.integration.test.js.map +0 -1
  826. package/dist/prompts/macros.test.d.ts +0 -2
  827. package/dist/prompts/macros.test.d.ts.map +0 -1
  828. package/dist/prompts/macros.test.js +0 -80
  829. package/dist/prompts/macros.test.js.map +0 -1
  830. package/dist/testing/test-harness.test.d.ts +0 -2
  831. package/dist/testing/test-harness.test.d.ts.map +0 -1
  832. package/dist/testing/test-harness.test.js +0 -92
  833. package/dist/testing/test-harness.test.js.map +0 -1
  834. package/dist/transport/http/routes/rpc.integration.test.d.ts +0 -2
  835. package/dist/transport/http/routes/rpc.integration.test.d.ts.map +0 -1
  836. package/dist/transport/http/routes/rpc.integration.test.js +0 -189
  837. package/dist/transport/http/routes/rpc.integration.test.js.map +0 -1
  838. package/dist/transport/http/routes/rpc.test.d.ts +0 -2
  839. package/dist/transport/http/routes/rpc.test.d.ts.map +0 -1
  840. package/dist/transport/http/routes/rpc.test.js +0 -316
  841. package/dist/transport/http/routes/rpc.test.js.map +0 -1
  842. package/src/config.test.ts +0 -174
  843. package/src/core/agent-loop.integration.test.ts +0 -503
  844. package/src/core/agents/agent-config.test.ts +0 -240
  845. package/src/core/agents/agent-shutdown.test.ts +0 -236
  846. package/src/core/agents/agent.test.ts +0 -387
  847. package/src/core/agents/communicator.ts +0 -16
  848. package/src/core/agents/handler-events.test.ts +0 -167
  849. package/src/core/agents/response-sanitizer.test.ts +0 -137
  850. package/src/core/error-recovery.integration.test.ts +0 -343
  851. package/src/core/event-sourcing.integration.test.ts +0 -191
  852. package/src/core/events/file.test.ts +0 -436
  853. package/src/core/events/memory.test.ts +0 -741
  854. package/src/core/image/image-processor.test.ts +0 -218
  855. package/src/core/image/vips-resizer.test.ts +0 -388
  856. package/src/core/llm/anthropic.test.ts +0 -546
  857. package/src/core/llm/cache-breakpoints.test.ts +0 -85
  858. package/src/core/llm/cache-live.test.ts +0 -155
  859. package/src/core/llm/logger.test.ts +0 -270
  860. package/src/core/llm/message-sanitization.test.ts +0 -217
  861. package/src/core/llm/mock.test.ts +0 -402
  862. package/src/core/llm/openrouter-mapping.test.ts +0 -210
  863. package/src/core/llm/openrouter.test.ts +0 -499
  864. package/src/core/llm/provider-integration.test.ts +0 -408
  865. package/src/core/llm/routing-provider.test.ts +0 -113
  866. package/src/core/llm/snapshot-middleware.test.ts +0 -168
  867. package/src/core/multi-agent.integration.test.ts +0 -340
  868. package/src/core/plugin-hooks.integration.test.ts +0 -568
  869. package/src/core/session-lifecycle.integration.test.ts +0 -202
  870. package/src/core/sessions/fork-utils.test.ts +0 -158
  871. package/src/core/sessions/session-overrides.integration.test.ts +0 -210
  872. package/src/core/sessions/session.test.ts +0 -1736
  873. package/src/core/tools/executor.test.ts +0 -161
  874. package/src/lib/logger/console.test.ts +0 -348
  875. package/src/lib/never.ts +0 -3
  876. package/src/lib/utils/concurrency.test.ts +0 -169
  877. package/src/plugins/agent-status/agent-status.test.ts +0 -164
  878. package/src/plugins/agents/agents.integration.test.ts +0 -976
  879. package/src/plugins/agents/supervision.integration.test.ts +0 -249
  880. package/src/plugins/context-compact/compaction-live.test.ts +0 -221
  881. package/src/plugins/context-compact/context-compact.integration.test.ts +0 -418
  882. package/src/plugins/context-compact/context-compactor.test.ts +0 -1036
  883. package/src/plugins/context-compact/history-offloader.test.ts +0 -100
  884. package/src/plugins/filesystem/filesystem.integration.test.ts +0 -529
  885. package/src/plugins/filesystem/schema.ts +0 -6
  886. package/src/plugins/limits-guard/limit-guard.test.ts +0 -253
  887. package/src/plugins/limits-guard/limits-guard.integration.test.ts +0 -1012
  888. package/src/plugins/llm-debug/llm-debug.integration.test.ts +0 -192
  889. package/src/plugins/mailbox/mailbox.integration.test.ts +0 -794
  890. package/src/plugins/resources/resources.integration.test.ts +0 -68
  891. package/src/plugins/result-eviction/result-eviction.integration.test.ts +0 -332
  892. package/src/plugins/services/pid-registry.test.ts +0 -180
  893. package/src/plugins/services/services.integration.test.ts +0 -1223
  894. package/src/plugins/session-lifecycle/session-lifecycle.integration.test.ts +0 -639
  895. package/src/plugins/session-stats/plugin.test.ts +0 -160
  896. package/src/plugins/shell/shell.integration.test.ts +0 -273
  897. package/src/plugins/shell/shell.test.ts +0 -314
  898. package/src/plugins/skills/discovery.test.ts +0 -395
  899. package/src/plugins/skills/skills.integration.test.ts +0 -580
  900. package/src/plugins/todo/todo.integration.test.ts +0 -687
  901. package/src/plugins/uploads/preprocessors/image-classifier.test.ts +0 -142
  902. package/src/plugins/uploads/uploads.integration.test.ts +0 -831
  903. package/src/plugins/user-chat/user-chat.integration.test.ts +0 -893
  904. package/src/plugins/workers/workers.integration.test.ts +0 -778
  905. package/src/prompts/macros.test.ts +0 -107
  906. package/src/testing/test-harness.test.ts +0 -114
  907. package/src/transport/http/routes/rpc.integration.test.ts +0 -243
  908. package/src/transport/http/routes/rpc.test.ts +0 -372
@@ -1,9 +1,9 @@
1
- import { resolve } from 'node:path'
1
+ import { isAbsolute, resolve } from 'node:path'
2
2
  import type { SessionEnvironment } from '~/core/sessions/session-environment.js'
3
3
  import type { ToolError } from '~/core/tools/executor.js'
4
4
  import { Err, Ok, type Result } from '~/lib/utils/result.js'
5
5
  import type { FileSystem } from '~/platform/fs.js'
6
- import type { ChildProcess, ProcessRunner } from '~/platform/process.js'
6
+ import type { ShellGrant, ShellLimits, ShellRunner, ShellRunOptions } from '~/platform/shell.js'
7
7
 
8
8
  // ============================================================================
9
9
  // Constants
@@ -12,11 +12,12 @@ import type { ChildProcess, ProcessRunner } from '~/platform/process.js'
12
12
  const VIRTUAL_SESSION = '/home/user/session'
13
13
  const VIRTUAL_WORKSPACE = '/home/user/workspace'
14
14
 
15
- /** Maximum output size per stream in bytes (1 MB) */
16
- const MAX_OUTPUT_BYTES = 1_048_576
15
+ /** The sandbox covers these with a tmpfs, so only what a grant mounts back exists under them. */
16
+ const HIDDEN_ROOTS = ['/home', '/root']
17
17
 
18
- /** Grace period before SIGKILL after SIGTERM (ms) */
19
- const GRACEFUL_KILL_DELAY_MS = 5000
18
+ function isWithin(path: string, root: string): boolean {
19
+ return path === root || path.startsWith(root + '/')
20
+ }
20
21
 
21
22
  // ============================================================================
22
23
  // Shell escaping
@@ -134,6 +135,8 @@ export interface SandboxConfig {
134
135
  network?: boolean
135
136
  /** Paths with read-write access (default: [cwd]) */
136
137
  writablePaths?: string[]
138
+ /** Resource caps for the confined command; a `null` field asks for no cap. */
139
+ limits?: ShellLimits
137
140
  }
138
141
 
139
142
  export interface ShellConfig {
@@ -153,100 +156,6 @@ export interface ShellConfig {
153
156
  sandbox?: SandboxConfig
154
157
  }
155
158
 
156
- // ============================================================================
157
- // Environment
158
- // ============================================================================
159
-
160
- /** Safe environment variables that can be passed to child processes */
161
- const SAFE_ENV_VARS = ['PATH', 'HOME', 'USER', 'SHELL', 'TERM', 'LANG', 'LC_ALL', 'TZ']
162
-
163
- function getSafeEnv(): Record<string, string> {
164
- return Object.fromEntries(
165
- SAFE_ENV_VARS
166
- .filter(key => process.env[key])
167
- .map(key => [key, process.env[key]!]),
168
- )
169
- }
170
-
171
- // ============================================================================
172
- // Sandbox
173
- // ============================================================================
174
-
175
- export interface BwrapOptions {
176
- command: string
177
- cwd: string
178
- sandbox: SandboxConfig
179
- /** Real session directory to map into sandbox */
180
- sessionDir?: string
181
- /** Real workspace directory to map into sandbox */
182
- workspaceDir?: string
183
- /** Extra paths to bind-mount inside sandbox */
184
- extraBinds?: ExtraBind[]
185
- }
186
-
187
- export function buildBwrapArgs(opts: BwrapOptions): string[] {
188
- const { command, cwd, sandbox, extraBinds } = opts
189
- const sessionDir = opts.sessionDir ? resolve(opts.sessionDir) : undefined
190
- const workspaceDir = opts.workspaceDir ? resolve(opts.workspaceDir) : undefined
191
-
192
- const args: string[] = [
193
- '--ro-bind',
194
- '/',
195
- '/',
196
- '--dev',
197
- '/dev',
198
- '--proc',
199
- '/proc',
200
- '--tmpfs',
201
- '/tmp',
202
- ]
203
-
204
- // Hide sensitive directories with tmpfs overlays
205
- // (overrides --ro-bind / / for these paths, preventing access to user home dirs and root)
206
- args.push('--tmpfs', '/home')
207
- args.push('--tmpfs', '/root')
208
-
209
- if (sessionDir) {
210
- // Map real session dir to /home/user/session (read-write)
211
- args.push('--bind', sessionDir, VIRTUAL_SESSION)
212
- }
213
-
214
- if (workspaceDir) {
215
- // Map real workspace dir to /home/user/workspace (read-write)
216
- args.push('--bind', workspaceDir, VIRTUAL_WORKSPACE)
217
- }
218
-
219
- // Extra bind mounts (e.g. git project dir for worktree support, .gitconfig)
220
- for (const bind of extraBinds ?? []) {
221
- args.push(bind.mode === 'ro' ? '--ro-bind' : '--bind', bind.path, bind.destPath ?? bind.path)
222
- }
223
-
224
- // Additional writable paths (legacy support)
225
- for (const p of sandbox.writablePaths ?? []) {
226
- args.push('--bind', p, p)
227
- }
228
-
229
- // If no sessionDir/workspaceDir mapping, fall back to making cwd writable
230
- if (!sessionDir && !workspaceDir) {
231
- args.push('--bind', cwd, cwd)
232
- }
233
-
234
- args.push('--unshare-all')
235
-
236
- if (sandbox.network) {
237
- args.push('--share-net')
238
- }
239
-
240
- args.push('--die-with-parent')
241
-
242
- // Set working directory inside the namespace
243
- args.push('--chdir', cwd)
244
-
245
- args.push('/bin/sh', '-c', command)
246
-
247
- return args
248
- }
249
-
250
159
  // ============================================================================
251
160
  // Shell Executor
252
161
  // ============================================================================
@@ -270,16 +179,17 @@ export interface ShellResult {
270
179
 
271
180
  export interface ShellExecutorDeps {
272
181
  fs: FileSystem
273
- process: ProcessRunner
182
+ /** Absent on a host with no shell at all — every command then fails with a clear error. */
183
+ shell?: ShellRunner
274
184
  }
275
185
 
276
186
  export class ShellExecutor {
277
187
  private readonly fs: FileSystem
278
- private readonly process: ProcessRunner
188
+ private readonly shell?: ShellRunner
279
189
 
280
190
  constructor(private config: ShellConfig, deps: ShellExecutorDeps) {
281
191
  this.fs = deps.fs
282
- this.process = deps.process
192
+ this.shell = deps.shell
283
193
  }
284
194
 
285
195
  async execute(
@@ -301,15 +211,29 @@ export class ShellExecutor {
301
211
  // Determine sandbox mode from config
302
212
  const sandboxEnabled = this.config.sandboxed && this.config.sandbox?.enabled !== false
303
213
 
304
- // Resolve cwd based on sandbox mode:
305
- // - bwrap enabled: use virtual path (bwrap handles mapping)
306
- // - sandboxed but no bwrap: agent sends virtual paths, resolve to real paths
307
- // - not sandboxed: agent sends real paths, use as-is
214
+ const shell = this.shell
215
+ if (!shell) {
216
+ return Err({
217
+ message: 'This host cannot run shell commands: it has no shell.',
218
+ recoverable: false,
219
+ })
220
+ }
221
+ if (sandboxEnabled && shell.confinement === 'none') {
222
+ return Err({
223
+ message: 'This session runs commands sandboxed, but the host shell cannot confine them.',
224
+ recoverable: false,
225
+ })
226
+ }
227
+ // A `host` shell needs no grants: its filesystem holds nothing but this session.
228
+ const confineByPaths = sandboxEnabled && shell.confinement === 'paths'
229
+
230
+ // A sandboxed agent sends virtual paths: the shell presents them, or we resolve them here.
308
231
  let cwd: string
309
232
  if (sandboxEnabled) {
310
- cwd = input.cwd ?? VIRTUAL_SESSION
233
+ const cwdResult = await this.resolveSandboxCwd(input.cwd ?? VIRTUAL_SESSION, sessionDir, workspaceDir)
234
+ if (!cwdResult.ok) return cwdResult
235
+ cwd = cwdResult.value
311
236
  } else if (this.config.sandboxed && input.cwd) {
312
- // Sandboxed env but bwrap disabled — resolve virtual paths to real paths
313
237
  const cwdResult = await resolveAgentPath(this.fs, input.cwd, sessionDir, workspaceDir, this.config.sandboxed)
314
238
  if (!cwdResult.ok) return cwdResult
315
239
  cwd = cwdResult.value
@@ -333,130 +257,124 @@ export class ShellExecutor {
333
257
  }
334
258
  }
335
259
 
336
- return new Promise<Result<ShellResult, ToolError>>((resolve) => {
337
- let stdout = ''
338
- let stderr = ''
339
- let timedOut = false
340
-
341
- let child: ChildProcess
342
- if (sandboxEnabled) {
343
- // Apply resource limits inside the sandbox
344
- const timeoutSeconds = Math.ceil(timeout / 1000)
345
- const sandboxCommand = `ulimit -v 524288 -f 204800 -u 64 -t ${timeoutSeconds} 2>/dev/null; ${fullCommand}`
346
- const bwrapArgs = buildBwrapArgs({
347
- command: sandboxCommand,
348
- cwd,
349
- sandbox: this.config.sandbox ?? { enabled: true },
350
- sessionDir,
351
- workspaceDir,
352
- extraBinds: this.config.extraBinds,
353
- })
354
- child = this.process.spawn('bwrap', bwrapArgs, {
355
- cwd: sessionDir ?? this.config.cwd,
356
- env: { ...getSafeEnv(), ...this.config.env },
357
- detached: true,
358
- })
359
- } else {
360
- const shell = this.config.shell ?? (process.platform === 'win32' ? 'cmd.exe' : '/bin/sh')
361
- const shellFlag = process.platform === 'win32' ? '/c' : '-c'
362
-
363
- child = this.process.spawn(shell, [shellFlag, fullCommand], {
364
- cwd,
365
- env: { ...getSafeEnv(), ...this.config.env },
366
- detached: true,
367
- })
368
- }
260
+ const runOptions: ShellRunOptions = {
261
+ command: fullCommand,
262
+ cwd,
263
+ env: this.config.env,
264
+ stdin: input.stdin,
265
+ timeoutMs: timeout,
266
+ shell: this.config.shell,
267
+ }
268
+ if (confineByPaths) {
269
+ runOptions.grants = this.grants(cwd, sessionDir, workspaceDir)
270
+ runOptions.network = this.config.sandbox?.network
271
+ runOptions.limits = this.config.sandbox?.limits
272
+ }
369
273
 
370
- // Handle stdin
371
- if (input.stdin) {
372
- child.stdin?.write(input.stdin)
373
- child.stdin?.end()
374
- } else {
375
- child.stdin?.end()
274
+ try {
275
+ const result = await shell.run(runOptions)
276
+ return Ok({
277
+ stdout: result.stdout,
278
+ stderr: result.stderr,
279
+ exitCode: result.exitCode,
280
+ signal: result.signal,
281
+ timedOut: result.timedOut,
282
+ durationMs: Date.now() - startTime,
283
+ })
284
+ } catch (error) {
285
+ const durationMs = Date.now() - startTime
286
+ const message = error instanceof Error ? error.message : String(error)
287
+ return Err({
288
+ message,
289
+ recoverable: false,
290
+ details: error instanceof Error && 'details' in error ? error.details : { durationMs },
291
+ })
292
+ }
293
+ }
294
+
295
+ /**
296
+ * Keep the working directory inside what the sandbox mounts, before the host chdirs into it.
297
+ * Paths under the hidden home roots exist only where a grant mounts them back; the rest of
298
+ * the tree the sandbox binds read-only, so a directory there grants nothing.
299
+ */
300
+ private async resolveSandboxCwd(
301
+ agentCwd: string,
302
+ sessionDir: string,
303
+ workspaceDir: string | undefined,
304
+ ): Promise<Result<string, ToolError>> {
305
+ if (!isAbsolute(agentCwd)) {
306
+ return Err({ message: `Working directory '${agentCwd}' must be an absolute path`, recoverable: false })
307
+ }
308
+ const normalized = resolve(agentCwd)
309
+
310
+ if (isWithin(normalized, VIRTUAL_SESSION) || isWithin(normalized, VIRTUAL_WORKSPACE)) {
311
+ const contained = await resolveAgentPath(this.fs, normalized, sessionDir, workspaceDir, true)
312
+ if (!contained.ok) return contained
313
+ return this.requireExists(contained.value, agentCwd, normalized)
314
+ }
315
+
316
+ for (const root of this.boundRoots()) {
317
+ if (!isWithin(normalized, root.seen)) continue
318
+ const hostPath = resolve(root.host + normalized.slice(root.seen.length))
319
+ if (await checkSymlinkEscape(this.fs, hostPath, root.host)) {
320
+ return Err({ message: `Path '${agentCwd}' resolves outside its bind mount via symlink`, recoverable: false })
376
321
  }
322
+ return this.requireExists(hostPath, agentCwd, normalized)
323
+ }
377
324
 
378
- // Collect stdout with size cap
379
- let stdoutBytes = 0
380
- let stdoutTruncated = false
381
- child.stdout?.on('data', (data: Buffer) => {
382
- if (stdoutTruncated) return
383
- const remaining = MAX_OUTPUT_BYTES - stdoutBytes
384
- if (data.length > remaining) {
385
- stdout += data.toString('utf-8', 0, remaining)
386
- stdoutBytes = MAX_OUTPUT_BYTES
387
- stdoutTruncated = true
388
- stdout += '\n[stdout truncated at 1 MB]'
389
- } else {
390
- stdout += data.toString()
391
- stdoutBytes += data.length
392
- }
325
+ if (HIDDEN_ROOTS.some((root) => isWithin(normalized, root))) {
326
+ const mounted = [
327
+ VIRTUAL_SESSION,
328
+ ...(workspaceDir ? [VIRTUAL_WORKSPACE] : []),
329
+ ...this.boundRoots().map((root) => root.seen),
330
+ ]
331
+ return Err({
332
+ message: `Path '${agentCwd}' is not mounted in this sandbox. Mounted roots: ${mounted.join(', ')}`,
333
+ recoverable: false,
393
334
  })
335
+ }
394
336
 
395
- // Collect stderr with size cap
396
- let stderrBytes = 0
397
- let stderrTruncated = false
398
- child.stderr?.on('data', (data: Buffer) => {
399
- if (stderrTruncated) return
400
- const remaining = MAX_OUTPUT_BYTES - stderrBytes
401
- if (data.length > remaining) {
402
- stderr += data.toString('utf-8', 0, remaining)
403
- stderrBytes = MAX_OUTPUT_BYTES
404
- stderrTruncated = true
405
- stderr += '\n[stderr truncated at 1 MB]'
406
- } else {
407
- stderr += data.toString()
408
- stderrBytes += data.length
409
- }
410
- })
337
+ return Ok(normalized)
338
+ }
411
339
 
412
- // Timeout handler — SIGTERM first, then SIGKILL after grace period
413
- let killTimeoutId: ReturnType<typeof setTimeout> | undefined
414
- const timeoutId = setTimeout(() => {
415
- timedOut = true
416
- try {
417
- process.kill(-child.pid!, 'SIGTERM')
418
- } catch {
419
- child.kill('SIGTERM')
420
- }
421
- killTimeoutId = setTimeout(() => {
422
- try {
423
- process.kill(-child.pid!, 'SIGKILL')
424
- } catch {
425
- try {
426
- child.kill('SIGKILL')
427
- } catch { /* already dead */ }
428
- }
429
- }, GRACEFUL_KILL_DELAY_MS)
430
- }, timeout)
431
-
432
- // Process exit
433
- child.on('close', (code, signal) => {
434
- clearTimeout(timeoutId)
435
- if (killTimeoutId) clearTimeout(killTimeoutId)
436
- const durationMs = Date.now() - startTime
437
-
438
- resolve(Ok({
439
- stdout: stdout.trim(),
440
- stderr: stderr.trim(),
441
- exitCode: code ?? -1,
442
- signal: signal ?? undefined,
443
- timedOut,
444
- durationMs,
445
- }))
446
- })
340
+ private async requireExists(hostPath: string, agentCwd: string, seen: string): Promise<Result<string, ToolError>> {
341
+ if (await this.fs.exists(hostPath)) return Ok(seen)
342
+ return Err({ message: `Working directory '${agentCwd}' does not exist`, recoverable: false })
343
+ }
447
344
 
448
- // Process error
449
- child.on('error', (error) => {
450
- clearTimeout(timeoutId)
451
- if (killTimeoutId) clearTimeout(killTimeoutId)
452
- const durationMs = Date.now() - startTime
345
+ /** Granted roots beyond the session and workspace, as the command sees them and where the host keeps them. */
346
+ private boundRoots(): { seen: string; host: string }[] {
347
+ return [
348
+ ...(this.config.extraBinds ?? []).map((bind) => ({ seen: resolve(bind.destPath ?? bind.path), host: resolve(bind.path) })),
349
+ ...(this.config.sandbox?.writablePaths ?? []).map((path) => ({ seen: resolve(path), host: resolve(path) })),
350
+ ]
351
+ }
453
352
 
454
- resolve(Err({
455
- message: `Failed to execute command: ${error.message}`,
456
- recoverable: false,
457
- details: { durationMs },
458
- }))
459
- })
460
- })
353
+ /** Session and workspace keep their agent-visible names; everything else stays where it is. */
354
+ private grants(cwd: string, sessionDir: string, workspaceDir: string | undefined): ShellGrant[] {
355
+ const grants: ShellGrant[] = []
356
+
357
+ if (sessionDir) {
358
+ grants.push({ path: VIRTUAL_SESSION, source: sessionDir, mode: 'rw' })
359
+ }
360
+ if (workspaceDir) {
361
+ grants.push({ path: VIRTUAL_WORKSPACE, source: workspaceDir, mode: 'rw' })
362
+ }
363
+
364
+ // Extra binds (e.g. git project dir for worktree support, .gitconfig)
365
+ for (const bind of this.config.extraBinds ?? []) {
366
+ grants.push({ path: bind.destPath ?? bind.path, source: bind.path, mode: bind.mode })
367
+ }
368
+
369
+ // Additional writable paths (legacy support)
370
+ for (const path of this.config.sandbox?.writablePaths ?? []) {
371
+ grants.push({ path, mode: 'rw' })
372
+ }
373
+
374
+ if (!sessionDir && !workspaceDir) {
375
+ grants.push({ path: cwd, mode: 'rw' })
376
+ }
377
+
378
+ return grants
461
379
  }
462
380
  }
@@ -3,8 +3,7 @@
3
3
  */
4
4
 
5
5
  export {
6
- createRestrictedShellConfig,
7
- createSafeShellConfig,
6
+ createSandboxedShellConfig,
8
7
  type ExtraBind as ShellExtraBind,
9
8
  type ShellAgentConfig,
10
9
  shellPlugin,
@@ -12,8 +11,6 @@ export {
12
11
  } from './plugin.js'
13
12
 
14
13
  export {
15
- buildBwrapArgs,
16
- type BwrapOptions,
17
14
  type ExtraBind,
18
15
  type RunCommandInput,
19
16
  type SandboxConfig,
@@ -2,6 +2,7 @@ import z from 'zod/v4'
2
2
  import { definePlugin } from '~/core/plugins/plugin-builder.js'
3
3
  import { createTool } from '~/core/tools/definition.js'
4
4
  import { Err, Ok } from '~/lib/utils/result.js'
5
+ import type { ShellLimits } from '~/platform/shell.js'
5
6
  import { type RunCommandInput, type ShellConfig, ShellExecutor } from './executor.js'
6
7
 
7
8
  /**
@@ -39,6 +40,8 @@ export interface ShellPresetConfig {
39
40
  network?: boolean
40
41
  /** Paths with read-write access (default: [cwd]) */
41
42
  writablePaths?: string[]
43
+ /** Resource caps for the confined command; a `null` field asks for no cap. */
44
+ limits?: ShellLimits
42
45
  }
43
46
  /** Default enabled state for agents (default: true). Agents can override via ShellAgentConfig.enabled. */
44
47
  defaultEnabled?: boolean
@@ -76,7 +79,7 @@ export const shellPlugin = definePlugin('shell')
76
79
  extraBinds: pluginConfig.extraBinds,
77
80
  sandbox: pluginConfig.sandbox,
78
81
  }
79
- const executor = new ShellExecutor(shellConfig, { fs: ctx.platform.fs, process: ctx.platform.process })
82
+ const executor = new ShellExecutor(shellConfig, { fs: ctx.platform.fs, shell: ctx.platform.shell })
80
83
  return { executor }
81
84
  })
82
85
  .agentConfig<ShellAgentConfig>()
@@ -107,12 +110,7 @@ export const shellPlugin = definePlugin('shell')
107
110
  })
108
111
  .build()
109
112
 
110
- /** Safe shell config for typical development tasks */
111
- export function createSafeShellConfig(cwd: string): ShellPresetConfig {
112
- return { cwd, timeout: 60000, sandbox: { enabled: true } }
113
- }
114
-
115
- /** Restrictive shell config for untrusted agents */
116
- export function createRestrictedShellConfig(cwd: string): ShellPresetConfig {
117
- return { cwd, timeout: 30000, sandbox: { enabled: true } }
113
+ /** Sandboxed shell config; the command timeout is the only knob it sets. */
114
+ export function createSandboxedShellConfig(cwd: string, timeout = 60000): ShellPresetConfig {
115
+ return { cwd, timeout, sandbox: { enabled: true } }
118
116
  }
@@ -21,6 +21,7 @@
21
21
  */
22
22
 
23
23
  import * as path from 'node:path'
24
+ import { readTextFilesOrUndefined } from '~/lib/utils/fs-batch.js'
24
25
  import type { Result } from '~/lib/utils/result.js'
25
26
  import { Err, Ok } from '~/lib/utils/result.js'
26
27
  import type { FileSystem } from '~/platform/fs.js'
@@ -200,16 +201,17 @@ export async function discoverSkills(
200
201
  // Scan for subdirectories containing SKILL.md
201
202
  const entries = await fs.readdir(sourcePath, { withFileTypes: true })
202
203
 
203
- for (const entry of entries) {
204
- if (!entry.isDirectory()) continue
204
+ // One read for every candidate, and no separate probe: a directory with no
205
+ // SKILL.md comes back with nothing rather than being asked about twice.
206
+ const candidates = entries
207
+ .filter((entry) => entry.isDirectory())
208
+ .map((entry) => path.join(sourcePath, entry.name, 'SKILL.md'))
209
+ const contents = await readTextFilesOrUndefined(fs, candidates)
205
210
 
206
- const skillDir = path.join(sourcePath, entry.name)
207
- const skillFile = path.join(skillDir, 'SKILL.md')
211
+ for (const [index, skillFile] of candidates.entries()) {
212
+ const content = contents[index]
213
+ if (content === undefined) continue
208
214
 
209
- if (!(await fs.exists(skillFile))) continue
210
-
211
- // Read and parse the skill file
212
- const content = await fs.readFile(skillFile, 'utf-8')
213
215
  const parseResult = parseSkillFrontmatter(content)
214
216
 
215
217
  if (!parseResult.ok) {
@@ -13,7 +13,7 @@ export type {
13
13
 
14
14
  // Schema
15
15
  export { SkillId, skillIdSchema } from './schema.js'
16
- export type { LoadedSkill, SkillMetadata } from './schema.js'
16
+ export type { LoadedSkill, LoadedSkillContent, SkillMetadata } from './schema.js'
17
17
 
18
18
  // Events & state slice (now in plugin.ts)
19
19
  export { skillEvents } from './plugin.js'
@@ -18,7 +18,7 @@ import { createTool } from '~/core/tools/definition.js'
18
18
  import { Err, Ok, type Result } from '~/lib/utils/result.js'
19
19
  import { discoverSkills, loadSkillContent } from './discovery.js'
20
20
  import { buildLoadedSkillsMessage, formatLoadedSkills } from './prompts.js'
21
- import { type LoadedSkill, SkillId, skillIdSchema, type SkillMetadata } from './schema.js'
21
+ import { type LoadedSkill, type LoadedSkillContent, SkillId, skillIdSchema, type SkillMetadata } from './schema.js'
22
22
 
23
23
  /**
24
24
  * A preset-contributed skill. Skills are matched by name; file-discovered
@@ -96,7 +96,7 @@ export const skillEvents = createEvents({
96
96
  agentId: agentIdSchema,
97
97
  skillId: skillIdSchema,
98
98
  skillName: z.string(),
99
- content: z.string(),
99
+ content: z.string().optional(),
100
100
  }),
101
101
  },
102
102
  })
@@ -116,7 +116,6 @@ export const skillsPlugin = definePlugin('skills')
116
116
  const loadedSkill: LoadedSkill = {
117
117
  id: event.skillId,
118
118
  name: event.skillName,
119
- content: event.content,
120
119
  loadedAt: event.timestamp,
121
120
  }
122
121
  const agentSkills = skills.get(event.agentId) ?? []
@@ -218,25 +217,22 @@ export const skillsPlugin = definePlugin('skills')
218
217
  return Err(ValidationErrors.invalid(`Failed to load skill: ${contentResult.error.message}`))
219
218
  }
220
219
 
221
- // Emit skill_loaded event
222
- await ctx.emitEvent(skillEvents.create('skill_loaded', {
223
- agentId: input.agentId,
224
- skillId: skillMeta.id,
225
- skillName: skillMeta.name,
226
- content: contentResult.value,
227
- }))
228
-
229
- // Emit preamble with the newly loaded skill
230
- const skillContent = formatLoadedSkills([{
220
+ const loadedSkill: LoadedSkillContent = {
231
221
  id: skillMeta.id,
232
222
  name: skillMeta.name,
233
223
  content: contentResult.value,
234
224
  loadedAt: Date.now(),
235
- }])
236
- await ctx.emitEvent(agentEvents.create('preamble_added', {
225
+ }
226
+ const skillContent = formatLoadedSkills([loadedSkill])
227
+
228
+ await ctx.emitEvents([skillEvents.create('skill_loaded', {
229
+ agentId: input.agentId,
230
+ skillId: skillMeta.id,
231
+ skillName: skillMeta.name,
232
+ }), agentEvents.create('preamble_added', {
237
233
  agentId: input.agentId,
238
234
  messages: [{ role: 'system', content: skillContent }],
239
- }))
235
+ })])
240
236
 
241
237
  return Ok({
242
238
  skillId: skillMeta.id,
@@ -286,7 +282,7 @@ export const skillsPlugin = definePlugin('skills')
286
282
  // Load preload skills
287
283
  const availableSkills = ctx.pluginContext.availableSkills
288
284
  const skillByName = new Map(availableSkills.map((s) => [s.name, s]))
289
- const newlyLoaded: LoadedSkill[] = []
285
+ const newlyLoaded: LoadedSkillContent[] = []
290
286
 
291
287
  for (const skillName of preloadSkills) {
292
288
  const skillMeta = skillByName.get(skillName)
@@ -308,14 +304,6 @@ export const skillsPlugin = definePlugin('skills')
308
304
  continue
309
305
  }
310
306
 
311
- // Emit skill_loaded event
312
- await ctx.emitEvent(skillEvents.create('skill_loaded', {
313
- agentId: ctx.agentId,
314
- skillId: skillMeta.id,
315
- skillName: skillMeta.name,
316
- content: contentResult.value,
317
- }))
318
-
319
307
  newlyLoaded.push({
320
308
  id: skillMeta.id,
321
309
  name: skillMeta.name,
@@ -328,10 +316,14 @@ export const skillsPlugin = definePlugin('skills')
328
316
  if (newlyLoaded.length > 0) {
329
317
  const skillsMessage = buildLoadedSkillsMessage(newlyLoaded)
330
318
  if (skillsMessage) {
331
- await ctx.emitEvent(agentEvents.create('preamble_added', {
319
+ await ctx.emitEvents([...newlyLoaded.map((skill) => skillEvents.create('skill_loaded', {
320
+ agentId: ctx.agentId,
321
+ skillId: skill.id,
322
+ skillName: skill.name,
323
+ })), agentEvents.create('preamble_added', {
332
324
  agentId: ctx.agentId,
333
325
  messages: [{ role: 'system', content: skillsMessage }],
334
- }))
326
+ })])
335
327
  }
336
328
  }
337
329
 
@@ -2,7 +2,7 @@
2
2
  * Skills Prompt Sections - Build prompt sections for skill metadata and loaded skills.
3
3
  */
4
4
 
5
- import type { LoadedSkill, SkillMetadata } from './schema.js'
5
+ import type { LoadedSkillContent, SkillMetadata } from './schema.js'
6
6
 
7
7
  // ============================================================================
8
8
  // Available Skills Section
@@ -46,7 +46,7 @@ export function buildSkillsSection(skills: SkillMetadata[]): string {
46
46
  * @param loadedSkills - Array of skills loaded into agent context
47
47
  * @returns Formatted string with all loaded skill content
48
48
  */
49
- export function formatLoadedSkills(loadedSkills: LoadedSkill[]): string {
49
+ export function formatLoadedSkills(loadedSkills: LoadedSkillContent[]): string {
50
50
  if (loadedSkills.length === 0) {
51
51
  return ''
52
52
  }
@@ -69,7 +69,7 @@ ${skill.content}
69
69
  * @param loadedSkills - Array of skills loaded into agent context
70
70
  * @returns System message content or null
71
71
  */
72
- export function buildLoadedSkillsMessage(loadedSkills: LoadedSkill[]): string | null {
72
+ export function buildLoadedSkillsMessage(loadedSkills: LoadedSkillContent[]): string | null {
73
73
  if (loadedSkills.length === 0) {
74
74
  return null
75
75
  }