@namzu/sdk 34.2.0 → 36.0.0

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 (669) hide show
  1. package/CHANGELOG.md +171 -0
  2. package/README.md +2 -6
  3. package/dist/agents/PipelineAgent.d.ts.map +1 -1
  4. package/dist/agents/PipelineAgent.js +118 -100
  5. package/dist/agents/PipelineAgent.js.map +1 -1
  6. package/dist/agents/ReactiveAgent.d.ts.map +1 -1
  7. package/dist/agents/ReactiveAgent.js +2 -0
  8. package/dist/agents/ReactiveAgent.js.map +1 -1
  9. package/dist/agents/RouterAgent.d.ts.map +1 -1
  10. package/dist/agents/RouterAgent.js +105 -61
  11. package/dist/agents/RouterAgent.js.map +1 -1
  12. package/dist/agents/SupervisorAgent.d.ts.map +1 -1
  13. package/dist/agents/SupervisorAgent.js +8 -4
  14. package/dist/agents/SupervisorAgent.js.map +1 -1
  15. package/dist/agents/budget.d.ts +6 -0
  16. package/dist/agents/budget.d.ts.map +1 -0
  17. package/dist/agents/budget.js +33 -0
  18. package/dist/agents/budget.js.map +1 -0
  19. package/dist/agents/explore.d.ts +20 -0
  20. package/dist/agents/explore.d.ts.map +1 -0
  21. package/dist/agents/explore.js +26 -0
  22. package/dist/agents/explore.js.map +1 -0
  23. package/dist/agents/file-definitions.d.ts +80 -0
  24. package/dist/agents/file-definitions.d.ts.map +1 -0
  25. package/dist/agents/file-definitions.js +179 -0
  26. package/dist/agents/file-definitions.js.map +1 -0
  27. package/dist/agents/index.d.ts +3 -0
  28. package/dist/agents/index.d.ts.map +1 -1
  29. package/dist/agents/index.js +2 -0
  30. package/dist/agents/index.js.map +1 -1
  31. package/dist/bridge/a2a/mapper.d.ts.map +1 -1
  32. package/dist/bridge/a2a/mapper.js +6 -0
  33. package/dist/bridge/a2a/mapper.js.map +1 -1
  34. package/dist/bridge/sse/mapper.d.ts.map +1 -1
  35. package/dist/bridge/sse/mapper.js +22 -0
  36. package/dist/bridge/sse/mapper.js.map +1 -1
  37. package/dist/bus/lock.d.ts.map +1 -1
  38. package/dist/bus/lock.js +1 -10
  39. package/dist/bus/lock.js.map +1 -1
  40. package/dist/compaction/consolidation.d.ts +31 -0
  41. package/dist/compaction/consolidation.d.ts.map +1 -0
  42. package/dist/compaction/consolidation.js +63 -0
  43. package/dist/compaction/consolidation.js.map +1 -0
  44. package/dist/compaction/factory.d.ts.map +1 -1
  45. package/dist/compaction/factory.js +3 -0
  46. package/dist/compaction/factory.js.map +1 -1
  47. package/dist/compaction/index.d.ts +6 -1
  48. package/dist/compaction/index.d.ts.map +1 -1
  49. package/dist/compaction/index.js +6 -0
  50. package/dist/compaction/index.js.map +1 -1
  51. package/dist/compaction/manager.d.ts +7 -0
  52. package/dist/compaction/manager.d.ts.map +1 -1
  53. package/dist/compaction/manager.js +31 -0
  54. package/dist/compaction/manager.js.map +1 -1
  55. package/dist/compaction/plan.d.ts +23 -0
  56. package/dist/compaction/plan.d.ts.map +1 -1
  57. package/dist/compaction/plan.js +41 -24
  58. package/dist/compaction/plan.js.map +1 -1
  59. package/dist/compaction/salience/bm25.d.ts +26 -0
  60. package/dist/compaction/salience/bm25.d.ts.map +1 -0
  61. package/dist/compaction/salience/bm25.js +56 -0
  62. package/dist/compaction/salience/bm25.js.map +1 -0
  63. package/dist/compaction/salience/goal.d.ts +21 -0
  64. package/dist/compaction/salience/goal.d.ts.map +1 -0
  65. package/dist/compaction/salience/goal.js +32 -0
  66. package/dist/compaction/salience/goal.js.map +1 -0
  67. package/dist/compaction/salience/index.d.ts +4 -0
  68. package/dist/compaction/salience/index.d.ts.map +1 -0
  69. package/dist/compaction/salience/index.js +4 -0
  70. package/dist/compaction/salience/index.js.map +1 -0
  71. package/dist/compaction/salience/minhash.d.ts +17 -0
  72. package/dist/compaction/salience/minhash.d.ts.map +1 -0
  73. package/dist/compaction/salience/minhash.js +54 -0
  74. package/dist/compaction/salience/minhash.js.map +1 -0
  75. package/dist/compaction/salience/score.d.ts +64 -0
  76. package/dist/compaction/salience/score.d.ts.map +1 -0
  77. package/dist/compaction/salience/score.js +256 -0
  78. package/dist/compaction/salience/score.js.map +1 -0
  79. package/dist/compaction/salience/tokenize.d.ts +20 -0
  80. package/dist/compaction/salience/tokenize.d.ts.map +1 -0
  81. package/dist/compaction/salience/tokenize.js +92 -0
  82. package/dist/compaction/salience/tokenize.js.map +1 -0
  83. package/dist/compaction/salience/working-set.d.ts +59 -0
  84. package/dist/compaction/salience/working-set.d.ts.map +1 -0
  85. package/dist/compaction/salience/working-set.js +137 -0
  86. package/dist/compaction/salience/working-set.js.map +1 -0
  87. package/dist/compaction/serializer.d.ts +2 -0
  88. package/dist/compaction/serializer.d.ts.map +1 -1
  89. package/dist/compaction/serializer.js +15 -0
  90. package/dist/compaction/serializer.js.map +1 -1
  91. package/dist/compaction/token-estimate.d.ts +13 -0
  92. package/dist/compaction/token-estimate.d.ts.map +1 -0
  93. package/dist/compaction/token-estimate.js +58 -0
  94. package/dist/compaction/token-estimate.js.map +1 -0
  95. package/dist/compaction/tool-result-editing.d.ts +10 -2
  96. package/dist/compaction/tool-result-editing.d.ts.map +1 -1
  97. package/dist/compaction/tool-result-editing.js +22 -24
  98. package/dist/compaction/tool-result-editing.js.map +1 -1
  99. package/dist/compaction/types.d.ts +22 -1
  100. package/dist/compaction/types.d.ts.map +1 -1
  101. package/dist/compaction/wire.d.ts +3 -1
  102. package/dist/compaction/wire.d.ts.map +1 -1
  103. package/dist/compaction/wire.js +2 -0
  104. package/dist/compaction/wire.js.map +1 -1
  105. package/dist/config/runtime.d.ts +58 -28
  106. package/dist/config/runtime.d.ts.map +1 -1
  107. package/dist/config/runtime.js +13 -1
  108. package/dist/config/runtime.js.map +1 -1
  109. package/dist/connector/builtins/http.d.ts.map +1 -1
  110. package/dist/connector/builtins/http.js +2 -8
  111. package/dist/connector/builtins/http.js.map +1 -1
  112. package/dist/connector/builtins/webhook.js +2 -2
  113. package/dist/connector/builtins/webhook.js.map +1 -1
  114. package/dist/connector/mcp/adapter.d.ts +2 -0
  115. package/dist/connector/mcp/adapter.d.ts.map +1 -1
  116. package/dist/connector/mcp/adapter.js +30 -0
  117. package/dist/connector/mcp/adapter.js.map +1 -1
  118. package/dist/connector/tools/adapter.js +2 -2
  119. package/dist/connector/tools/adapter.js.map +1 -1
  120. package/dist/connector/tools/definitions.js +2 -2
  121. package/dist/connector/tools/definitions.js.map +1 -1
  122. package/dist/constants/compaction/index.d.ts +1 -0
  123. package/dist/constants/compaction/index.d.ts.map +1 -1
  124. package/dist/constants/compaction/index.js +1 -0
  125. package/dist/constants/compaction/index.js.map +1 -1
  126. package/dist/constants/telemetry/index.d.ts +0 -1
  127. package/dist/constants/telemetry/index.d.ts.map +1 -1
  128. package/dist/constants/telemetry/index.js +0 -1
  129. package/dist/constants/telemetry/index.js.map +1 -1
  130. package/dist/contracts/a2a.d.ts +5 -5
  131. package/dist/contracts/api.d.ts +4 -2
  132. package/dist/contracts/api.d.ts.map +1 -1
  133. package/dist/contracts/schemas.d.ts +1 -15
  134. package/dist/contracts/schemas.d.ts.map +1 -1
  135. package/dist/contracts/schemas.js +5 -20
  136. package/dist/contracts/schemas.js.map +1 -1
  137. package/dist/invariants/index.d.ts +1 -1
  138. package/dist/manager/agent/lifecycle.d.ts +2 -18
  139. package/dist/manager/agent/lifecycle.d.ts.map +1 -1
  140. package/dist/manager/agent/lifecycle.js +373 -340
  141. package/dist/manager/agent/lifecycle.js.map +1 -1
  142. package/dist/manager/run/persistence.d.ts +3 -0
  143. package/dist/manager/run/persistence.d.ts.map +1 -1
  144. package/dist/manager/run/persistence.js +35 -5
  145. package/dist/manager/run/persistence.js.map +1 -1
  146. package/dist/plugin/index.d.ts +2 -0
  147. package/dist/plugin/index.d.ts.map +1 -1
  148. package/dist/plugin/index.js +1 -0
  149. package/dist/plugin/index.js.map +1 -1
  150. package/dist/plugin/shell-hook.d.ts +128 -0
  151. package/dist/plugin/shell-hook.d.ts.map +1 -0
  152. package/dist/plugin/shell-hook.js +299 -0
  153. package/dist/plugin/shell-hook.js.map +1 -0
  154. package/dist/prompt/coding-agent-doctrine.d.ts +63 -0
  155. package/dist/prompt/coding-agent-doctrine.d.ts.map +1 -0
  156. package/dist/prompt/coding-agent-doctrine.js +100 -0
  157. package/dist/prompt/coding-agent-doctrine.js.map +1 -0
  158. package/dist/prompt/index.d.ts +2 -0
  159. package/dist/prompt/index.d.ts.map +1 -1
  160. package/dist/prompt/index.js +1 -0
  161. package/dist/prompt/index.js.map +1 -1
  162. package/dist/provider/errors.d.ts +1 -1
  163. package/dist/provider/errors.js +1 -1
  164. package/dist/provider/fallback.d.ts +2 -0
  165. package/dist/provider/fallback.d.ts.map +1 -1
  166. package/dist/provider/fallback.js +3 -1
  167. package/dist/provider/fallback.js.map +1 -1
  168. package/dist/provider/retry.d.ts +2 -0
  169. package/dist/provider/retry.d.ts.map +1 -1
  170. package/dist/provider/retry.js +3 -1
  171. package/dist/provider/retry.js.map +1 -1
  172. package/dist/provider/token-budget.d.ts +13 -0
  173. package/dist/provider/token-budget.d.ts.map +1 -0
  174. package/dist/provider/token-budget.js +150 -0
  175. package/dist/provider/token-budget.js.map +1 -0
  176. package/dist/public-runtime.d.ts +14 -14
  177. package/dist/public-runtime.d.ts.map +1 -1
  178. package/dist/public-runtime.js +15 -10
  179. package/dist/public-runtime.js.map +1 -1
  180. package/dist/public-tools.d.ts +2 -0
  181. package/dist/public-tools.d.ts.map +1 -1
  182. package/dist/public-tools.js +2 -0
  183. package/dist/public-tools.js.map +1 -1
  184. package/dist/public-types.d.ts +12 -2
  185. package/dist/public-types.d.ts.map +1 -1
  186. package/dist/registry/command/kernel-commands.d.ts.map +1 -1
  187. package/dist/registry/command/kernel-commands.js +18 -6
  188. package/dist/registry/command/kernel-commands.js.map +1 -1
  189. package/dist/registry/tool/execute.d.ts.map +1 -1
  190. package/dist/registry/tool/execute.js +4 -1
  191. package/dist/registry/tool/execute.js.map +1 -1
  192. package/dist/run/LimitChecker.js +1 -1
  193. package/dist/run/LimitChecker.js.map +1 -1
  194. package/dist/run/drain.js +1 -1
  195. package/dist/run/reporter.d.ts.map +1 -1
  196. package/dist/run/reporter.js +15 -0
  197. package/dist/run/reporter.js.map +1 -1
  198. package/dist/run/token-budget.d.ts +108 -0
  199. package/dist/run/token-budget.d.ts.map +1 -0
  200. package/dist/run/token-budget.js +591 -0
  201. package/dist/run/token-budget.js.map +1 -0
  202. package/dist/runtime/jobs/registry.d.ts +29 -0
  203. package/dist/runtime/jobs/registry.d.ts.map +1 -1
  204. package/dist/runtime/jobs/registry.js +98 -18
  205. package/dist/runtime/jobs/registry.js.map +1 -1
  206. package/dist/runtime/query/checkpoint.d.ts.map +1 -1
  207. package/dist/runtime/query/checkpoint.js +10 -3
  208. package/dist/runtime/query/checkpoint.js.map +1 -1
  209. package/dist/runtime/query/context.d.ts +2 -26
  210. package/dist/runtime/query/context.d.ts.map +1 -1
  211. package/dist/runtime/query/context.js +1 -29
  212. package/dist/runtime/query/context.js.map +1 -1
  213. package/dist/runtime/query/executor.d.ts +13 -9
  214. package/dist/runtime/query/executor.d.ts.map +1 -1
  215. package/dist/runtime/query/executor.js +144 -55
  216. package/dist/runtime/query/executor.js.map +1 -1
  217. package/dist/runtime/query/guard.d.ts.map +1 -1
  218. package/dist/runtime/query/guard.js +8 -0
  219. package/dist/runtime/query/guard.js.map +1 -1
  220. package/dist/runtime/query/index.d.ts +42 -4
  221. package/dist/runtime/query/index.d.ts.map +1 -1
  222. package/dist/runtime/query/index.js +153 -52
  223. package/dist/runtime/query/index.js.map +1 -1
  224. package/dist/runtime/query/iteration/index.d.ts +3 -3
  225. package/dist/runtime/query/iteration/index.d.ts.map +1 -1
  226. package/dist/runtime/query/iteration/index.js +47 -11
  227. package/dist/runtime/query/iteration/index.js.map +1 -1
  228. package/dist/runtime/query/iteration/phases/compaction.d.ts.map +1 -1
  229. package/dist/runtime/query/iteration/phases/compaction.js +98 -30
  230. package/dist/runtime/query/iteration/phases/compaction.js.map +1 -1
  231. package/dist/runtime/query/iteration/phases/context.d.ts +4 -0
  232. package/dist/runtime/query/iteration/phases/context.d.ts.map +1 -1
  233. package/dist/runtime/query/iteration/phases/context.js.map +1 -1
  234. package/dist/runtime/query/iteration/phases/tool-review.d.ts.map +1 -1
  235. package/dist/runtime/query/iteration/phases/tool-review.js +29 -7
  236. package/dist/runtime/query/iteration/phases/tool-review.js.map +1 -1
  237. package/dist/runtime/query/iteration/phases/working-memory.d.ts.map +1 -1
  238. package/dist/runtime/query/iteration/phases/working-memory.js +25 -15
  239. package/dist/runtime/query/iteration/phases/working-memory.js.map +1 -1
  240. package/dist/runtime/query/iteration/stream-turn.d.ts.map +1 -1
  241. package/dist/runtime/query/iteration/stream-turn.js +10 -5
  242. package/dist/runtime/query/iteration/stream-turn.js.map +1 -1
  243. package/dist/runtime/query/plugin-hooks.d.ts +1 -1
  244. package/dist/runtime/query/plugin-hooks.d.ts.map +1 -1
  245. package/dist/runtime/query/plugin-hooks.js +20 -1
  246. package/dist/runtime/query/plugin-hooks.js.map +1 -1
  247. package/dist/runtime/query/prompt.d.ts.map +1 -1
  248. package/dist/runtime/query/prompt.js +14 -4
  249. package/dist/runtime/query/prompt.js.map +1 -1
  250. package/dist/runtime/query/repeat-call.d.ts +20 -2
  251. package/dist/runtime/query/repeat-call.d.ts.map +1 -1
  252. package/dist/runtime/query/repeat-call.js +35 -7
  253. package/dist/runtime/query/repeat-call.js.map +1 -1
  254. package/dist/runtime/query/result.d.ts.map +1 -1
  255. package/dist/runtime/query/result.js +9 -0
  256. package/dist/runtime/query/result.js.map +1 -1
  257. package/dist/runtime/query/review-policy.d.ts +142 -0
  258. package/dist/runtime/query/review-policy.d.ts.map +1 -0
  259. package/dist/runtime/query/review-policy.js +144 -0
  260. package/dist/runtime/query/review-policy.js.map +1 -0
  261. package/dist/runtime/query/run-state.d.ts.map +1 -1
  262. package/dist/runtime/query/run-state.js +4 -0
  263. package/dist/runtime/query/run-state.js.map +1 -1
  264. package/dist/runtime/query/steering.d.ts +4 -0
  265. package/dist/runtime/query/steering.d.ts.map +1 -1
  266. package/dist/runtime/query/steering.js +29 -0
  267. package/dist/runtime/query/steering.js.map +1 -1
  268. package/dist/runtime/query/token-budget.d.ts +7 -0
  269. package/dist/runtime/query/token-budget.d.ts.map +1 -0
  270. package/dist/runtime/query/token-budget.js +101 -0
  271. package/dist/runtime/query/token-budget.js.map +1 -0
  272. package/dist/runtime/query/tool-output-budget.d.ts +2 -0
  273. package/dist/runtime/query/tool-output-budget.d.ts.map +1 -1
  274. package/dist/runtime/query/tool-output-budget.js +29 -11
  275. package/dist/runtime/query/tool-output-budget.js.map +1 -1
  276. package/dist/runtime/query/tool-pause.d.ts.map +1 -1
  277. package/dist/runtime/query/tool-pause.js +4 -2
  278. package/dist/runtime/query/tool-pause.js.map +1 -1
  279. package/dist/runtime/query/tooling.d.ts +4 -0
  280. package/dist/runtime/query/tooling.d.ts.map +1 -1
  281. package/dist/runtime/query/tooling.js +4 -0
  282. package/dist/runtime/query/tooling.js.map +1 -1
  283. package/dist/sandbox/file-walk-program.d.ts +3 -0
  284. package/dist/sandbox/file-walk-program.d.ts.map +1 -0
  285. package/dist/sandbox/file-walk-program.js +94 -0
  286. package/dist/sandbox/file-walk-program.js.map +1 -0
  287. package/dist/sandbox/file-walk.d.ts +12 -0
  288. package/dist/sandbox/file-walk.d.ts.map +1 -0
  289. package/dist/sandbox/file-walk.js +429 -0
  290. package/dist/sandbox/file-walk.js.map +1 -0
  291. package/dist/sandbox/index.d.ts +2 -0
  292. package/dist/sandbox/index.d.ts.map +1 -1
  293. package/dist/sandbox/index.js +1 -0
  294. package/dist/sandbox/index.js.map +1 -1
  295. package/dist/sandbox/provider/local.d.ts +3 -1
  296. package/dist/sandbox/provider/local.d.ts.map +1 -1
  297. package/dist/sandbox/provider/local.js +121 -12
  298. package/dist/sandbox/provider/local.js.map +1 -1
  299. package/dist/scheduler/completion-inbox.d.ts +3 -2
  300. package/dist/scheduler/completion-inbox.d.ts.map +1 -1
  301. package/dist/scheduler/completion-inbox.js +29 -15
  302. package/dist/scheduler/completion-inbox.js.map +1 -1
  303. package/dist/scheduler/delegating.d.ts +1 -0
  304. package/dist/scheduler/delegating.d.ts.map +1 -1
  305. package/dist/scheduler/delegating.js +29 -12
  306. package/dist/scheduler/delegating.js.map +1 -1
  307. package/dist/scheduler/local.d.ts +1 -0
  308. package/dist/scheduler/local.d.ts.map +1 -1
  309. package/dist/scheduler/local.js +4 -7
  310. package/dist/scheduler/local.js.map +1 -1
  311. package/dist/session/index.d.ts +0 -1
  312. package/dist/session/index.d.ts.map +1 -1
  313. package/dist/session/index.js +0 -1
  314. package/dist/session/index.js.map +1 -1
  315. package/dist/session/workspace/path-builder.d.ts.map +1 -1
  316. package/dist/session/workspace/path-builder.js +5 -4
  317. package/dist/session/workspace/path-builder.js.map +1 -1
  318. package/dist/store/feedback/disk.d.ts.map +1 -1
  319. package/dist/store/feedback/disk.js +4 -6
  320. package/dist/store/feedback/disk.js.map +1 -1
  321. package/dist/store/index.d.ts +2 -0
  322. package/dist/store/index.d.ts.map +1 -1
  323. package/dist/store/index.js +1 -0
  324. package/dist/store/index.js.map +1 -1
  325. package/dist/store/memory/disk.d.ts.map +1 -1
  326. package/dist/store/memory/disk.js +3 -12
  327. package/dist/store/memory/disk.js.map +1 -1
  328. package/dist/store/run/checkpoint-disk.d.ts +3 -3
  329. package/dist/store/run/checkpoint-disk.d.ts.map +1 -1
  330. package/dist/store/run/checkpoint-disk.js +14 -26
  331. package/dist/store/run/checkpoint-disk.js.map +1 -1
  332. package/dist/store/run/claim-disk.js +1 -1
  333. package/dist/store/run/conformance.d.ts +1 -1
  334. package/dist/store/run/conformance.d.ts.map +1 -1
  335. package/dist/store/run/conformance.js +41 -33
  336. package/dist/store/run/conformance.js.map +1 -1
  337. package/dist/store/run/disk.d.ts.map +1 -1
  338. package/dist/store/run/disk.js +20 -4
  339. package/dist/store/run/disk.js.map +1 -1
  340. package/dist/store/run/token-budget-disk.d.ts +37 -0
  341. package/dist/store/run/token-budget-disk.d.ts.map +1 -0
  342. package/dist/store/run/token-budget-disk.js +208 -0
  343. package/dist/store/run/token-budget-disk.js.map +1 -0
  344. package/dist/store/session/disk.d.ts +4 -13
  345. package/dist/store/session/disk.d.ts.map +1 -1
  346. package/dist/store/session/disk.js +34 -31
  347. package/dist/store/session/disk.js.map +1 -1
  348. package/dist/store/session/memory.d.ts +2 -0
  349. package/dist/store/session/memory.d.ts.map +1 -1
  350. package/dist/store/session/memory.js +41 -2
  351. package/dist/store/session/memory.js.map +1 -1
  352. package/dist/store/task/disk.d.ts.map +1 -1
  353. package/dist/store/task/disk.js +7 -8
  354. package/dist/store/task/disk.js.map +1 -1
  355. package/dist/store/topic/memory.d.ts +2 -0
  356. package/dist/store/topic/memory.d.ts.map +1 -1
  357. package/dist/store/topic/memory.js +13 -1
  358. package/dist/store/topic/memory.js.map +1 -1
  359. package/dist/test-support/ids.d.ts +4 -19
  360. package/dist/test-support/ids.d.ts.map +1 -1
  361. package/dist/test-support/ids.js +51 -59
  362. package/dist/test-support/ids.js.map +1 -1
  363. package/dist/tools/advisory/index.d.ts.map +1 -1
  364. package/dist/tools/advisory/index.js +3 -1
  365. package/dist/tools/advisory/index.js.map +1 -1
  366. package/dist/tools/builtins/bash.d.ts +2 -0
  367. package/dist/tools/builtins/bash.d.ts.map +1 -1
  368. package/dist/tools/builtins/bash.js +224 -70
  369. package/dist/tools/builtins/bash.js.map +1 -1
  370. package/dist/tools/builtins/computer-use.d.ts +2 -2
  371. package/dist/tools/builtins/computer-use.d.ts.map +1 -1
  372. package/dist/tools/builtins/computer-use.js +4 -2
  373. package/dist/tools/builtins/computer-use.js.map +1 -1
  374. package/dist/tools/builtins/edit.js +2 -2
  375. package/dist/tools/builtins/edit.js.map +1 -1
  376. package/dist/tools/builtins/glob.d.ts +2 -1
  377. package/dist/tools/builtins/glob.d.ts.map +1 -1
  378. package/dist/tools/builtins/glob.js +95 -103
  379. package/dist/tools/builtins/glob.js.map +1 -1
  380. package/dist/tools/builtins/grep.d.ts.map +1 -1
  381. package/dist/tools/builtins/grep.js +155 -111
  382. package/dist/tools/builtins/grep.js.map +1 -1
  383. package/dist/tools/builtins/ls.js +4 -4
  384. package/dist/tools/builtins/ls.js.map +1 -1
  385. package/dist/tools/builtins/lsp.js +2 -2
  386. package/dist/tools/builtins/lsp.js.map +1 -1
  387. package/dist/tools/builtins/read-file.js +2 -2
  388. package/dist/tools/builtins/read-file.js.map +1 -1
  389. package/dist/tools/builtins/write-file.js +2 -2
  390. package/dist/tools/builtins/write-file.js.map +1 -1
  391. package/dist/tools/coordinator/ask-user-question.d.ts +33 -0
  392. package/dist/tools/coordinator/ask-user-question.d.ts.map +1 -0
  393. package/dist/tools/coordinator/ask-user-question.js +237 -0
  394. package/dist/tools/coordinator/ask-user-question.js.map +1 -0
  395. package/dist/tools/coordinator/index.d.ts +1 -2
  396. package/dist/tools/coordinator/index.d.ts.map +1 -1
  397. package/dist/tools/coordinator/index.js +4 -220
  398. package/dist/tools/coordinator/index.js.map +1 -1
  399. package/dist/tools/memory/read.d.ts.map +1 -1
  400. package/dist/tools/memory/read.js +2 -4
  401. package/dist/tools/memory/read.js.map +1 -1
  402. package/dist/tools/paths.d.ts +13 -0
  403. package/dist/tools/paths.d.ts.map +1 -1
  404. package/dist/tools/paths.js +53 -0
  405. package/dist/tools/paths.js.map +1 -1
  406. package/dist/tools/roster.d.ts +27 -0
  407. package/dist/tools/roster.d.ts.map +1 -0
  408. package/dist/tools/roster.js +42 -0
  409. package/dist/tools/roster.js.map +1 -0
  410. package/dist/types/agent/base.d.ts +5 -0
  411. package/dist/types/agent/base.d.ts.map +1 -1
  412. package/dist/types/agent/pipeline.d.ts +3 -0
  413. package/dist/types/agent/pipeline.d.ts.map +1 -1
  414. package/dist/types/agent/router.d.ts +2 -3
  415. package/dist/types/agent/router.d.ts.map +1 -1
  416. package/dist/types/agent/scheduler.d.ts +3 -0
  417. package/dist/types/agent/scheduler.d.ts.map +1 -1
  418. package/dist/types/agent/task.d.ts +5 -16
  419. package/dist/types/agent/task.d.ts.map +1 -1
  420. package/dist/types/agent/task.js.map +1 -1
  421. package/dist/types/common/index.d.ts.map +1 -1
  422. package/dist/types/common/index.js +3 -0
  423. package/dist/types/common/index.js.map +1 -1
  424. package/dist/types/computer-use/index.d.ts +8 -0
  425. package/dist/types/computer-use/index.d.ts.map +1 -1
  426. package/dist/types/computer-use/index.js.map +1 -1
  427. package/dist/types/hitl/index.d.ts +5 -0
  428. package/dist/types/hitl/index.d.ts.map +1 -1
  429. package/dist/types/hitl/index.js.map +1 -1
  430. package/dist/types/ids/brand.d.ts +5 -47
  431. package/dist/types/ids/brand.d.ts.map +1 -1
  432. package/dist/types/ids/brand.js +2 -39
  433. package/dist/types/ids/brand.js.map +1 -1
  434. package/dist/types/ids/index.d.ts +59 -69
  435. package/dist/types/ids/index.d.ts.map +1 -1
  436. package/dist/types/ids/index.js +12 -10
  437. package/dist/types/ids/index.js.map +1 -1
  438. package/dist/types/permission/index.d.ts +9 -0
  439. package/dist/types/permission/index.d.ts.map +1 -1
  440. package/dist/types/permission/index.js +9 -1
  441. package/dist/types/permission/index.js.map +1 -1
  442. package/dist/types/plugin/index.d.ts +45 -4
  443. package/dist/types/plugin/index.d.ts.map +1 -1
  444. package/dist/types/plugin/index.js +7 -0
  445. package/dist/types/plugin/index.js.map +1 -1
  446. package/dist/types/run/config.d.ts +3 -0
  447. package/dist/types/run/config.d.ts.map +1 -1
  448. package/dist/types/run/emergency.d.ts +5 -0
  449. package/dist/types/run/emergency.d.ts.map +1 -1
  450. package/dist/types/run/emergency.js.map +1 -1
  451. package/dist/types/run/entity.d.ts +6 -2
  452. package/dist/types/run/entity.d.ts.map +1 -1
  453. package/dist/types/run/events.d.ts +35 -0
  454. package/dist/types/run/events.d.ts.map +1 -1
  455. package/dist/types/run/events.js.map +1 -1
  456. package/dist/types/run/index.d.ts +1 -0
  457. package/dist/types/run/index.d.ts.map +1 -1
  458. package/dist/types/run/index.js +1 -0
  459. package/dist/types/run/index.js.map +1 -1
  460. package/dist/types/run/state.d.ts +16 -15
  461. package/dist/types/run/state.d.ts.map +1 -1
  462. package/dist/types/run/state.js +41 -22
  463. package/dist/types/run/state.js.map +1 -1
  464. package/dist/types/run/stop-reason.d.ts +3 -14
  465. package/dist/types/run/stop-reason.d.ts.map +1 -1
  466. package/dist/types/run/token-budget-store.d.ts +29 -0
  467. package/dist/types/run/token-budget-store.d.ts.map +1 -0
  468. package/dist/types/run/token-budget-store.js +25 -0
  469. package/dist/types/run/token-budget-store.js.map +1 -0
  470. package/dist/types/sandbox/index.d.ts +47 -2
  471. package/dist/types/sandbox/index.d.ts.map +1 -1
  472. package/dist/types/sandbox/index.js.map +1 -1
  473. package/dist/types/session/store.d.ts +8 -0
  474. package/dist/types/session/store.d.ts.map +1 -1
  475. package/dist/types/tool/index.d.ts +15 -0
  476. package/dist/types/tool/index.d.ts.map +1 -1
  477. package/dist/types/tool/index.js.map +1 -1
  478. package/dist/utils/frontmatter.d.ts +1 -1
  479. package/dist/utils/frontmatter.js +1 -1
  480. package/dist/utils/id-format.d.ts +3 -0
  481. package/dist/utils/id-format.d.ts.map +1 -0
  482. package/dist/utils/id-format.js +9 -0
  483. package/dist/utils/id-format.js.map +1 -0
  484. package/dist/utils/id.d.ts +65 -32
  485. package/dist/utils/id.d.ts.map +1 -1
  486. package/dist/utils/id.js +168 -148
  487. package/dist/utils/id.js.map +1 -1
  488. package/dist/utils/log/exception.js +1 -1
  489. package/dist/utils/log/exception.js.map +1 -1
  490. package/dist/utils/log/index.d.ts.map +1 -1
  491. package/dist/utils/log/index.js +1 -2
  492. package/dist/utils/log/index.js.map +1 -1
  493. package/dist/utils/log/templates.d.ts.map +1 -1
  494. package/dist/utils/log/templates.js +0 -1
  495. package/dist/utils/log/templates.js.map +1 -1
  496. package/package.json +6 -1
  497. package/src/agents/AGENTS.md +1 -1
  498. package/src/agents/PipelineAgent.ts +129 -109
  499. package/src/agents/ReactiveAgent.ts +2 -0
  500. package/src/agents/RouterAgent.ts +120 -73
  501. package/src/agents/SupervisorAgent.ts +12 -4
  502. package/src/agents/budget.ts +42 -0
  503. package/src/agents/explore.ts +29 -0
  504. package/src/agents/file-definitions.ts +237 -0
  505. package/src/agents/index.ts +15 -0
  506. package/src/bridge/a2a/mapper.ts +6 -0
  507. package/src/bridge/sse/mapper.ts +22 -0
  508. package/src/bus/lock.ts +1 -10
  509. package/src/compaction/consolidation.ts +79 -0
  510. package/src/compaction/factory.ts +3 -0
  511. package/src/compaction/index.ts +34 -4
  512. package/src/compaction/manager.ts +39 -1
  513. package/src/compaction/plan.ts +52 -21
  514. package/src/compaction/salience/bm25.ts +72 -0
  515. package/src/compaction/salience/goal.ts +44 -0
  516. package/src/compaction/salience/index.ts +19 -0
  517. package/src/compaction/salience/minhash.ts +53 -0
  518. package/src/compaction/salience/score.ts +305 -0
  519. package/src/compaction/salience/tokenize.ts +89 -0
  520. package/src/compaction/salience/working-set.ts +187 -0
  521. package/src/compaction/serializer.ts +16 -0
  522. package/src/compaction/token-estimate.ts +57 -0
  523. package/src/compaction/tool-result-editing.ts +28 -26
  524. package/src/compaction/types.ts +24 -1
  525. package/src/compaction/wire.ts +5 -1
  526. package/src/config/runtime.ts +13 -1
  527. package/src/connector/builtins/http.ts +2 -8
  528. package/src/connector/builtins/webhook.ts +2 -2
  529. package/src/connector/mcp/adapter.ts +32 -0
  530. package/src/connector/tools/adapter.ts +2 -2
  531. package/src/connector/tools/definitions.ts +2 -2
  532. package/src/constants/compaction/index.ts +1 -0
  533. package/src/constants/telemetry/index.ts +0 -1
  534. package/src/contracts/api.ts +5 -1
  535. package/src/contracts/schemas.ts +6 -20
  536. package/src/invariants/index.ts +1 -1
  537. package/src/manager/agent/lifecycle.ts +380 -352
  538. package/src/manager/run/persistence.ts +35 -5
  539. package/src/plugin/index.ts +19 -0
  540. package/src/plugin/shell-hook.ts +403 -0
  541. package/src/prompt/coding-agent-doctrine.ts +118 -0
  542. package/src/prompt/index.ts +8 -0
  543. package/src/provider/errors.ts +1 -1
  544. package/src/provider/fallback.ts +4 -1
  545. package/src/provider/retry.ts +4 -1
  546. package/src/provider/token-budget.ts +158 -0
  547. package/src/public-runtime.ts +56 -28
  548. package/src/public-tools.ts +5 -0
  549. package/src/public-types.ts +65 -0
  550. package/src/registry/command/kernel-commands.ts +16 -6
  551. package/src/registry/tool/execute.ts +4 -1
  552. package/src/run/LimitChecker.ts +1 -1
  553. package/src/run/drain.ts +1 -1
  554. package/src/run/reporter.ts +15 -0
  555. package/src/run/token-budget.ts +692 -0
  556. package/src/runtime/jobs/registry.ts +123 -17
  557. package/src/runtime/query/checkpoint.ts +10 -3
  558. package/src/runtime/query/context.ts +3 -57
  559. package/src/runtime/query/executor.ts +181 -71
  560. package/src/runtime/query/guard.ts +8 -0
  561. package/src/runtime/query/index.ts +209 -62
  562. package/src/runtime/query/iteration/index.ts +53 -15
  563. package/src/runtime/query/iteration/phases/compaction.ts +130 -31
  564. package/src/runtime/query/iteration/phases/context.ts +4 -0
  565. package/src/runtime/query/iteration/phases/tool-review.ts +39 -7
  566. package/src/runtime/query/iteration/phases/working-memory.ts +23 -14
  567. package/src/runtime/query/iteration/stream-turn.ts +9 -5
  568. package/src/runtime/query/plugin-hooks.ts +24 -2
  569. package/src/runtime/query/prompt.ts +21 -4
  570. package/src/runtime/query/repeat-call.ts +42 -7
  571. package/src/runtime/query/result.ts +9 -0
  572. package/src/runtime/query/review-policy.ts +231 -0
  573. package/src/runtime/query/run-state.ts +4 -0
  574. package/src/runtime/query/steering.ts +32 -0
  575. package/src/runtime/query/token-budget.ts +127 -0
  576. package/src/runtime/query/tool-output-budget.ts +33 -10
  577. package/src/runtime/query/tool-pause.ts +4 -2
  578. package/src/runtime/query/tooling.ts +8 -0
  579. package/src/sandbox/file-walk-program.ts +93 -0
  580. package/src/sandbox/file-walk.ts +463 -0
  581. package/src/sandbox/index.ts +2 -0
  582. package/src/sandbox/provider/local.ts +136 -13
  583. package/src/scheduler/completion-inbox.ts +29 -19
  584. package/src/scheduler/delegating.ts +35 -13
  585. package/src/scheduler/local.ts +5 -7
  586. package/src/session/index.ts +0 -1
  587. package/src/session/workspace/path-builder.ts +5 -4
  588. package/src/store/feedback/disk.ts +4 -6
  589. package/src/store/index.ts +2 -0
  590. package/src/store/memory/disk.ts +3 -11
  591. package/src/store/run/checkpoint-disk.ts +14 -27
  592. package/src/store/run/claim-disk.ts +1 -1
  593. package/src/store/run/conformance.ts +55 -39
  594. package/src/store/run/disk.ts +19 -4
  595. package/src/store/run/token-budget-disk.ts +247 -0
  596. package/src/store/session/disk.ts +36 -29
  597. package/src/store/session/memory.ts +38 -1
  598. package/src/store/task/disk.ts +7 -8
  599. package/src/store/topic/memory.ts +13 -1
  600. package/src/test-support/ids.ts +62 -59
  601. package/src/tools/advisory/index.ts +3 -1
  602. package/src/tools/builtins/bash.ts +241 -70
  603. package/src/tools/builtins/computer-use.ts +6 -2
  604. package/src/tools/builtins/edit.ts +2 -2
  605. package/src/tools/builtins/glob.ts +104 -122
  606. package/src/tools/builtins/grep.ts +166 -132
  607. package/src/tools/builtins/ls.ts +4 -4
  608. package/src/tools/builtins/lsp.ts +2 -2
  609. package/src/tools/builtins/read-file.ts +2 -2
  610. package/src/tools/builtins/write-file.ts +2 -2
  611. package/src/tools/coordinator/ask-user-question.ts +284 -0
  612. package/src/tools/coordinator/index.ts +5 -248
  613. package/src/tools/memory/read.ts +2 -4
  614. package/src/tools/paths.ts +64 -0
  615. package/src/tools/roster.ts +46 -0
  616. package/src/types/agent/base.ts +6 -0
  617. package/src/types/agent/pipeline.ts +3 -0
  618. package/src/types/agent/router.ts +2 -3
  619. package/src/types/agent/scheduler.ts +4 -0
  620. package/src/types/agent/task.ts +5 -18
  621. package/src/types/common/index.ts +3 -0
  622. package/src/types/computer-use/index.ts +8 -0
  623. package/src/types/hitl/index.ts +5 -0
  624. package/src/types/ids/brand.ts +5 -48
  625. package/src/types/ids/index.ts +66 -75
  626. package/src/types/permission/index.ts +11 -0
  627. package/src/types/plugin/index.ts +49 -1
  628. package/src/types/run/config.ts +3 -0
  629. package/src/types/run/emergency.ts +5 -0
  630. package/src/types/run/entity.ts +6 -2
  631. package/src/types/run/events.ts +37 -0
  632. package/src/types/run/index.ts +1 -0
  633. package/src/types/run/state.ts +58 -30
  634. package/src/types/run/stop-reason.ts +3 -14
  635. package/src/types/run/token-budget-store.ts +54 -0
  636. package/src/types/sandbox/index.ts +53 -0
  637. package/src/types/session/store.ts +8 -0
  638. package/src/types/tool/index.ts +15 -0
  639. package/src/utils/frontmatter.ts +1 -1
  640. package/src/utils/id-format.ts +9 -0
  641. package/src/utils/id.ts +222 -181
  642. package/src/utils/log/exception.ts +1 -1
  643. package/src/utils/log/index.ts +1 -2
  644. package/src/utils/log/templates.ts +0 -1
  645. package/dist/session/migration/errors.d.ts +0 -26
  646. package/dist/session/migration/errors.d.ts.map +0 -1
  647. package/dist/session/migration/errors.js +0 -22
  648. package/dist/session/migration/errors.js.map +0 -1
  649. package/dist/session/migration/filesystem.d.ts +0 -122
  650. package/dist/session/migration/filesystem.d.ts.map +0 -1
  651. package/dist/session/migration/filesystem.js +0 -379
  652. package/dist/session/migration/filesystem.js.map +0 -1
  653. package/dist/session/migration/id-prefix.d.ts +0 -113
  654. package/dist/session/migration/id-prefix.d.ts.map +0 -1
  655. package/dist/session/migration/id-prefix.js +0 -132
  656. package/dist/session/migration/id-prefix.js.map +0 -1
  657. package/dist/session/migration/index.d.ts +0 -12
  658. package/dist/session/migration/index.d.ts.map +0 -1
  659. package/dist/session/migration/index.js +0 -12
  660. package/dist/session/migration/index.js.map +0 -1
  661. package/dist/session/migration/marker.d.ts +0 -57
  662. package/dist/session/migration/marker.d.ts.map +0 -1
  663. package/dist/session/migration/marker.js +0 -123
  664. package/dist/session/migration/marker.js.map +0 -1
  665. package/src/session/migration/errors.ts +0 -23
  666. package/src/session/migration/filesystem.ts +0 -468
  667. package/src/session/migration/id-prefix.ts +0 -166
  668. package/src/session/migration/index.ts +0 -41
  669. package/src/session/migration/marker.ts +0 -142
@@ -1,157 +1,139 @@
1
- import { glob } from 'node:fs/promises'
2
- import { basename, dirname, relative, resolve, sep } from 'node:path'
1
+ import { isAbsolute, join, relative, sep } from 'node:path'
3
2
  import { z } from 'zod'
4
- import type { Sandbox } from '../../types/sandbox/index.js'
5
- import type { ToolResult } from '../../types/tool/index.js'
3
+ import { walkFilesLocally } from '../../sandbox/file-walk.js'
4
+ import type { SandboxWalkFilesOptions } from '../../types/sandbox/index.js'
6
5
  import { defineTool } from '../defineTool.js'
7
- import { matchesGlob } from '../glob-match.js'
8
- import { resolveWithin } from '../paths.js'
9
- import { joinPosix, relativePosix, resolveWithinPosix } from '../posix-path.js'
6
+ import { resolveWithin, resolveWithinAny, resolveWithinAnyReal, toolRoots } from '../paths.js'
7
+ import { relativePosix, resolveWithinPosix } from '../posix-path.js'
10
8
 
11
- /**
12
- * Cap on results, shared by both paths so a sandboxed search and a host
13
- * search truncate at the same point.
14
- */
15
9
  const MAX_GLOB_RESULTS = 500
16
-
17
- /**
18
- * Enumerate inside the sandbox and match there.
19
- *
20
- * This tool read the HOST filesystem through `node:fs` and referenced
21
- * `context.sandbox` nowhere, so with a container backend wired in the
22
- * sandbox was not a read boundary at all. The paths it returned were
23
- * host-relative too, while `read` resolves what it is given INSIDE the
24
- * sandbox — so every glob-to-read handoff either failed or opened a
25
- * different file. Every sibling builtin already remembers this branch.
26
- *
27
- * `listFiles` returns sandbox-relative paths, which is the coordinate
28
- * system `read` and `grep` already speak, so a path from here can be
29
- * handed straight to them.
30
- */
31
- async function globInSandbox(
32
- input: { pattern: string; path?: string },
33
- sandbox: Sandbox,
34
- ): Promise<ToolResult> {
35
- // The sandbox's own coordinate system — see `posix-path`.
36
- const root = resolveWithinPosix(sandbox.rootDir, input.path)
37
- const entries = await sandbox.listFiles(root)
38
-
39
- let pattern = input.pattern
40
- if (!pattern.includes('/') && !pattern.startsWith('**/')) pattern = `**/${pattern}`
41
-
42
- const matches: string[] = []
43
- for (const entry of entries) {
44
- const relPath = relativePosix(sandbox.rootDir, joinPosix(root, entry.path))
45
- if (!matchesGlob(relPath, pattern)) continue
46
- matches.push(`./${relPath}`)
47
- if (matches.length >= MAX_GLOB_RESULTS) break
48
- }
49
-
50
- if (matches.length === 0) {
51
- return {
52
- success: true,
53
- output: `No files found matching pattern "${input.pattern}" in ${root}`,
54
- data: { count: 0, files: [], sandboxed: true },
55
- }
56
- }
57
- return {
58
- success: true,
59
- output: matches.join('\n'),
60
- data: { count: matches.length, files: matches, sandboxed: true },
61
- }
62
- }
10
+ const MAX_VISITED_ENTRIES = 20_000
63
11
 
64
12
  const inputSchema = z.object({
65
- pattern: z.string().describe('Glob pattern (e.g. "**/*.ts", "src/**/*.js")'),
13
+ pattern: z
14
+ .string()
15
+ .min(1)
16
+ .max(4096)
17
+ .describe(
18
+ 'File glob relative to path. "*" lists immediate files; "**/*.ts" explicitly searches subdirectories. Supports braces and character classes. Known file paths can be read directly without discovery.',
19
+ ),
66
20
  path: z
67
21
  .string()
68
22
  .optional()
69
- .describe('Directory to search in. Defaults to the working directory if not specified.'),
23
+ .describe(
24
+ 'Directory to search in. Defaults to the working directory. Choose the narrowest relevant directory.',
25
+ ),
26
+ include_hidden: z
27
+ .boolean()
28
+ .optional()
29
+ .describe(
30
+ 'Include hidden files and directories in wildcard matches. Default: false. Explicit dotfile patterns still match.',
31
+ ),
70
32
  })
71
33
 
72
- function extractGlobBaseDirectory(pattern: string): {
73
- baseDir: string
74
- relativePattern: string
75
- } {
76
- const globChars = /[*?[{]/
77
- const match = pattern.match(globChars)
78
-
79
- if (!match || match.index === undefined) {
80
- return { baseDir: dirname(pattern), relativePattern: basename(pattern) }
34
+ /** Keep the pattern in the selected directory's coordinate system. */
35
+ function relativePattern(pattern: string, root: string, sandboxed: boolean): string {
36
+ let result = sandboxed ? pattern : pattern.split(sep).join('/')
37
+ if (result.split('/').includes('..')) {
38
+ throw new Error(
39
+ 'Glob pattern escapes the search directory through "..". Choose a contained path and a relative pattern.',
40
+ )
81
41
  }
82
-
83
- const staticPrefix = pattern.slice(0, match.index)
84
- const lastSepIndex = Math.max(staticPrefix.lastIndexOf('/'), staticPrefix.lastIndexOf(sep))
85
-
86
- if (lastSepIndex === -1) {
87
- return { baseDir: '', relativePattern: pattern }
42
+ if (sandboxed ? result.startsWith('/') : isAbsolute(pattern)) {
43
+ const contained = sandboxed ? resolveWithinPosix(root, result) : resolveWithin(root, pattern)
44
+ result = sandboxed
45
+ ? relativePosix(root, contained)
46
+ : relative(root, contained).split(sep).join('/')
88
47
  }
48
+ while (result.startsWith('./')) result = result.slice(2)
49
+ return result || '.'
50
+ }
89
51
 
90
- const baseDir = staticPrefix.slice(0, lastSepIndex)
91
- const relativePattern = pattern.slice(lastSepIndex + 1)
92
-
93
- return { baseDir, relativePattern }
52
+ /** Keep unusual filenames unambiguous without changing the returned path data. */
53
+ function displayPath(path: string): string {
54
+ // biome-ignore lint/suspicious/noControlCharactersInRegex: quote filenames containing control bytes instead of creating fake result lines.
55
+ return /[\x00-\x1f\x7f]/.test(path) ? JSON.stringify(path) : path
94
56
  }
95
57
 
96
58
  export const GlobTool = defineTool({
97
59
  name: 'glob',
98
- description: 'Searches for files using a glob pattern. Returns matching file paths.',
60
+ description:
61
+ 'Finds regular files by glob pattern in a bounded search. "*" searches one directory; use "**" explicitly for recursive discovery. Returns at most 500 paths and identifies incomplete searches. Does not follow symlinks.',
99
62
  inputSchema,
100
63
  category: 'filesystem',
101
64
  permissions: ['file_read'],
102
65
  readOnly: true,
103
66
  destructive: false,
104
67
  concurrencySafe: true,
68
+ timeoutMs: 15_000,
105
69
 
106
- async execute(input, context) {
107
- if (context.sandbox) {
108
- return await globInSandbox(input, context.sandbox)
109
- }
110
-
111
- // Contained, not merely resolved. This was a bare `resolve`, so
112
- // `path: "../../.."` reached whatever sits above the working
113
- // directory — with no sandbox needed to make it work.
114
- const basePath = resolveWithin(context.workingDirectory, input.path)
115
-
116
- let searchPath = basePath
117
- let pattern = input.pattern
70
+ presentCall(input) {
71
+ return { kind: 'generic', label: `${input.pattern} in ${input.path ?? '.'}` }
72
+ },
118
73
 
119
- const { baseDir, relativePattern } = extractGlobBaseDirectory(pattern)
120
- if (baseDir) {
121
- // A base directory lifted out of the PATTERN is caller-supplied
122
- // too: `pattern: "../../**/*.pem"` is the same escape wearing a
123
- // different argument.
124
- const resolvedPatternBase = resolveWithin(context.workingDirectory, baseDir)
125
- if (resolvedPatternBase === basePath || resolvedPatternBase.startsWith(`${basePath}/`)) {
126
- searchPath = resolvedPatternBase
127
- pattern = relativePattern
74
+ async execute(input, context) {
75
+ context.abortSignal?.throwIfAborted()
76
+ const sandbox = context.sandbox
77
+ const lexicalRoot = sandbox
78
+ ? resolveWithinPosix(sandbox.rootDir, input.path)
79
+ : resolveWithinAny(toolRoots(context), input.path)
80
+ const root = sandbox ? lexicalRoot : await resolveWithinAnyReal(toolRoots(context), input.path)
81
+ const pattern = relativePattern(input.pattern, lexicalRoot, sandbox !== undefined)
82
+ const walkSandbox = sandbox?.walkFiles?.bind(sandbox)
83
+ if (sandbox && !walkSandbox) {
84
+ return {
85
+ success: false,
86
+ output: '',
87
+ error:
88
+ 'This sandbox does not support bounded file discovery (Sandbox.walkFiles). Update its adapter or use an available directory-listing command inside the sandbox.',
128
89
  }
129
90
  }
130
-
131
- if (!pattern.includes('/') && !pattern.startsWith('**/')) {
132
- pattern = `**/${pattern}`
133
- }
134
-
135
- const matches: string[] = []
136
-
137
- for await (const entry of glob(pattern, { cwd: searchPath })) {
138
- const absolutePath = resolve(searchPath, entry)
139
- matches.push(`./${relative(context.workingDirectory, absolutePath)}`)
140
- if (matches.length >= MAX_GLOB_RESULTS) break
91
+ const options: SandboxWalkFilesOptions = {
92
+ pattern,
93
+ signal: context.abortSignal,
94
+ maxEntries: MAX_GLOB_RESULTS + 1,
95
+ maxVisitedEntries: MAX_VISITED_ENTRIES,
96
+ includeHidden: input.include_hidden ?? false,
141
97
  }
142
-
143
- if (matches.length === 0) {
144
- return {
145
- success: true,
146
- output: `No files found matching pattern "${input.pattern}" in ${searchPath}`,
147
- data: { count: 0, files: [] },
98
+ const entries = walkSandbox ? walkSandbox(root, options) : walkFilesLocally(root, options)
99
+ const files: string[] = []
100
+ let truncated = false
101
+ let failure: string | undefined
102
+ try {
103
+ for await (const entry of entries) {
104
+ context.abortSignal?.throwIfAborted()
105
+ const absolute = sandbox
106
+ ? resolveWithinPosix(root, entry.path)
107
+ : resolveWithin(root, entry.path)
108
+ if (files.length === MAX_GLOB_RESULTS) {
109
+ truncated = true
110
+ break
111
+ }
112
+ // Readers resolve relative input against the original working path,
113
+ // which may be a symlink. Project back through the selected alias
114
+ // before relativizing so added directories remain reachable.
115
+ const file = sandbox
116
+ ? relativePosix(sandbox.rootDir, absolute)
117
+ : relative(context.workingDirectory, join(lexicalRoot, relative(root, absolute)))
118
+ files.push(`./${sandbox ? file : file.split(sep).join('/')}`)
148
119
  }
120
+ } catch (error) {
121
+ if (context.abortSignal?.aborted) throw error
122
+ truncated = true
123
+ failure = error instanceof Error ? error.message : String(error)
149
124
  }
150
-
125
+ const notice = failure
126
+ ? `[Search incomplete: ${failure}]`
127
+ : truncated
128
+ ? `[Showing the first ${MAX_GLOB_RESULTS} matching files. Narrow the directory or pattern for the remaining results.]`
129
+ : undefined
151
130
  return {
152
- success: true,
153
- output: matches.join('\n'),
154
- data: { count: matches.length, files: matches },
131
+ success: failure === undefined,
132
+ output:
133
+ [...files.map(displayPath), ...(notice ? [notice] : [])].join('\n') ||
134
+ `No files found matching pattern "${input.pattern}" in ${root}`,
135
+ data: { count: files.length, files, truncated, ...(sandbox ? { sandboxed: true } : {}) },
136
+ ...(failure ? { error: failure } : {}),
155
137
  }
156
138
  },
157
139
  })
@@ -1,60 +1,54 @@
1
- import { glob, readFile } from 'node:fs/promises'
2
- import { relative, resolve, sep } from 'node:path'
1
+ import { readFile } from 'node:fs/promises'
2
+ import { isAbsolute, join, relative, sep } from 'node:path'
3
3
  import { z } from 'zod'
4
- import type { Sandbox } from '../../types/sandbox/index.js'
4
+ import { walkFilesLocally } from '../../sandbox/file-walk.js'
5
+ import type { SandboxWalkFilesOptions } from '../../types/sandbox/index.js'
6
+ import { subscribeToAbort } from '../../utils/abort.js'
5
7
  import { defineTool } from '../defineTool.js'
6
- import { matchesGlob } from '../glob-match.js'
7
- import { resolveWithin } from '../paths.js'
8
- import { joinPosix, relativePosix, resolveWithinPosix } from '../posix-path.js'
9
-
10
- /**
11
- * Where the files come from.
12
- *
13
- * The host and the sandbox differ in exactly two operations — enumerate
14
- * and read — so that is all this abstracts. Matching, context lines and
15
- * the caps stay in one implementation; duplicating them per source is how
16
- * the two would drift apart, and the sandbox path is the one nobody runs
17
- * by accident.
18
- */
19
- interface FileSource {
20
- /** The root every reported path is relative to. */
21
- readonly root: string
22
- /** True when paths are the sandbox's, not the host's. */
23
- readonly posix?: boolean
24
- list(searchRoot: string, pattern: string): AsyncIterable<string>
25
- read(path: string): Promise<Buffer>
26
- }
8
+ import {
9
+ resolveWithin,
10
+ resolveWithinAny,
11
+ resolveWithinAnyReal,
12
+ resolveWithinReal,
13
+ toolRoots,
14
+ } from '../paths.js'
15
+ import { relativePosix, resolveWithinPosix } from '../posix-path.js'
27
16
 
28
- function hostSource(workingDirectory: string): FileSource {
29
- return {
30
- root: workingDirectory,
31
- async *list(searchRoot, pattern) {
32
- for await (const entry of glob(pattern, { cwd: searchRoot })) {
33
- yield resolve(searchRoot, entry)
34
- }
35
- },
36
- read: (path) => readFile(path),
17
+ /** A remote read has no signal parameter; stop consuming it when the turn ends. */
18
+ async function readWithSignal(read: () => Promise<Buffer>, signal?: AbortSignal): Promise<Buffer> {
19
+ signal?.throwIfAborted()
20
+ if (!signal) return await read()
21
+ let dispose: (() => void) | undefined
22
+ try {
23
+ const cancelled = new Promise<never>((_, reject) => {
24
+ dispose = subscribeToAbort(signal, () => reject(signal.reason))
25
+ })
26
+ // Promise.race observes any late rejection. A late buffer is never searched.
27
+ return await Promise.race([
28
+ Promise.resolve().then(() => {
29
+ signal.throwIfAborted()
30
+ return read()
31
+ }),
32
+ cancelled,
33
+ ])
34
+ } finally {
35
+ dispose?.()
37
36
  }
38
37
  }
39
38
 
40
- function sandboxSource(sandbox: Sandbox): FileSource {
41
- return {
42
- root: sandbox.rootDir,
43
- posix: true,
44
- async *list(searchRoot, pattern) {
45
- for (const entry of await sandbox.listFiles(searchRoot)) {
46
- // Sandbox paths stay in the sandbox's own coordinate system.
47
- // Running them through the host's path module would rewrite a
48
- // POSIX container path into a host-shaped one whenever the
49
- // two disagree, and then hand the model a path its own
50
- // sandbox cannot open.
51
- const absolute = joinPosix(searchRoot, entry.path)
52
- const relPath = relativePosix(sandbox.rootDir, absolute)
53
- if (matchesGlob(relPath, pattern)) yield absolute
54
- }
55
- },
56
- read: (path) => sandbox.readFile(path),
39
+ function relativeInclude(include: string, root: string, sandboxed: boolean): string {
40
+ let pattern = sandboxed ? include : include.split(sep).join('/')
41
+ if (pattern.split('/').includes('..'))
42
+ throw new Error('Include pattern escapes the search directory')
43
+ if (sandboxed ? pattern.startsWith('/') : isAbsolute(include)) {
44
+ const absolute = sandboxed ? resolveWithinPosix(root, pattern) : resolveWithin(root, include)
45
+ pattern = sandboxed
46
+ ? relativePosix(root, absolute)
47
+ : relative(root, absolute).split(sep).join('/')
57
48
  }
49
+ while (pattern.startsWith('./')) pattern = pattern.slice(2)
50
+ // Grep's existing unqualified include is recursive: *.ts means **/*.ts.
51
+ return pattern.includes('/') ? pattern : `**/${pattern}`
58
52
  }
59
53
 
60
54
  const inputSchema = z.object({
@@ -84,6 +78,7 @@ const inputSchema = z.object({
84
78
 
85
79
  const MAX_FILE_SIZE = 5 * 1024 * 1024 // 5 MB — skip binaries/large files
86
80
  const BINARY_CHECK_BYTES = 512
81
+ const MAX_VISITED_ENTRIES = 20_000
87
82
 
88
83
  function isBinaryContent(buffer: Buffer): boolean {
89
84
  const check = buffer.subarray(0, BINARY_CHECK_BYTES)
@@ -96,15 +91,17 @@ function isBinaryContent(buffer: Buffer): boolean {
96
91
  export const GrepTool = defineTool({
97
92
  name: 'grep',
98
93
  description:
99
- 'Searches file contents using a regular expression. Returns matching lines with file paths, line numbers, and optional context lines. Skips binary files.',
94
+ 'Searches file contents using a regular expression. Returns matching lines with file paths, line numbers, and optional context lines. Searches incrementally with a bounded traversal; identifies incomplete searches. Skips binary files, files over 5 MB, and symlinks. Choose the narrowest relevant directory.',
100
95
  inputSchema,
101
96
  category: 'analysis',
102
97
  permissions: ['file_read'],
103
98
  readOnly: true,
104
99
  destructive: false,
105
100
  concurrencySafe: true,
101
+ timeoutMs: 15_000,
106
102
 
107
103
  async execute(input, context) {
104
+ context.abortSignal?.throwIfAborted()
108
105
  const flags = input.case_sensitive ? 'g' : 'gi'
109
106
  let regex: RegExp
110
107
  try {
@@ -117,108 +114,145 @@ export const GrepTool = defineTool({
117
114
  }
118
115
  }
119
116
 
120
- // Inside the sandbox when there is one, on the host otherwise. Only
121
- // the file SOURCE differs — matching, context lines and the caps are
122
- // one implementation, because duplicating the substantive half is
123
- // how the two paths would drift.
124
- //
125
- // This tool read the host filesystem through `node:fs` and
126
- // referenced `context.sandbox` nowhere, so with a container backend
127
- // wired in the sandbox was not a read boundary at all — and grep
128
- // returns file CONTENT, so what leaked was not a listing.
129
- const source: FileSource = context.sandbox
130
- ? sandboxSource(context.sandbox)
131
- : hostSource(context.workingDirectory)
132
-
133
- // Contained, not merely resolved — see `resolveWithin`. Bare
134
- // resolution let `path: "../../.."` read whatever sits above the
135
- // working directory, with no sandbox needed to make it work.
136
- const searchRoot = source.posix
137
- ? resolveWithinPosix(source.root, input.path)
138
- : resolveWithin(source.root, input.path)
139
-
140
- // Auto-prepend **/ for simple patterns (e.g. "*.ts" → "**/*.ts")
141
- let filePattern = input.include ?? '**/*'
142
- if (filePattern !== '**/*' && !filePattern.includes('/') && !filePattern.startsWith('**/')) {
143
- filePattern = `**/${filePattern}`
117
+ const sandbox = context.sandbox
118
+ const lexicalRoot = sandbox
119
+ ? resolveWithinPosix(sandbox.rootDir, input.path)
120
+ : resolveWithinAny(toolRoots(context), input.path)
121
+ const root = sandbox ? lexicalRoot : await resolveWithinAnyReal(toolRoots(context), input.path)
122
+ const filePattern = relativeInclude(input.include ?? '**/*', lexicalRoot, sandbox !== undefined)
123
+ const walkSandbox = sandbox?.walkFiles?.bind(sandbox)
124
+ if (sandbox && !walkSandbox) {
125
+ return {
126
+ success: false,
127
+ output: '',
128
+ error:
129
+ 'This sandbox does not support bounded file discovery (Sandbox.walkFiles). Update its adapter before searching file contents.',
130
+ }
131
+ }
132
+ const options: SandboxWalkFilesOptions = {
133
+ pattern: filePattern,
134
+ signal: context.abortSignal,
135
+ maxEntries: MAX_VISITED_ENTRIES + 1,
136
+ maxVisitedEntries: MAX_VISITED_ENTRIES,
137
+ // Preserve existing source behavior: sandbox grep included dotfiles;
138
+ // node's host glob excluded wildcard dotfiles.
139
+ includeHidden: sandbox !== undefined,
144
140
  }
141
+ const entries = walkSandbox ? walkSandbox(root, options) : walkFilesLocally(root, options)
145
142
 
146
143
  const results: string[] = []
147
144
  let totalMatches = 0
148
145
  let filesSearched = 0
149
146
  let filesMatched = 0
150
147
 
151
- for await (const filePath of source.list(searchRoot, filePattern)) {
152
- filesSearched++
153
-
154
- let content: string
155
- try {
156
- const buffer = await source.read(filePath)
157
- if (buffer.length > MAX_FILE_SIZE) continue
158
- if (isBinaryContent(buffer)) continue
159
- content = buffer.toString('utf-8')
160
- } catch {
161
- continue // Skip unreadable files (directories, permissions, etc.)
162
- }
163
-
164
- const lines = content.split('\n')
165
- let fileHasMatch = false
166
-
167
- for (let i = 0; i < lines.length; i++) {
168
- const line = lines[i] ?? ''
169
- regex.lastIndex = 0
170
- if (!regex.test(line)) continue
148
+ let truncated = false
149
+ let failure: string | undefined
150
+ let unreadableFiles = 0
151
+ try {
152
+ for await (const entry of entries) {
153
+ context.abortSignal?.throwIfAborted()
154
+ const filePath = sandbox
155
+ ? resolveWithinPosix(root, entry.path)
156
+ : resolveWithin(root, entry.path)
157
+ if (filesSearched >= MAX_VISITED_ENTRIES) {
158
+ throw new Error(
159
+ `File search stopped after examining ${MAX_VISITED_ENTRIES} files; narrow its root or include pattern.`,
160
+ )
161
+ }
162
+ filesSearched++
163
+ if (entry.size > MAX_FILE_SIZE) continue
171
164
 
172
- if (!fileHasMatch) {
173
- fileHasMatch = true
174
- filesMatched++
165
+ let content: string
166
+ try {
167
+ const buffer = await readWithSignal(
168
+ () =>
169
+ sandbox
170
+ ? sandbox.readFile(filePath)
171
+ : resolveWithinReal(root, filePath).then((contained) =>
172
+ readFile(contained, { signal: context.abortSignal }),
173
+ ),
174
+ context.abortSignal,
175
+ )
176
+ context.abortSignal?.throwIfAborted()
177
+ if (buffer.length > MAX_FILE_SIZE || isBinaryContent(buffer)) continue
178
+ content = buffer.toString('utf-8')
179
+ } catch (error) {
180
+ if (context.abortSignal?.aborted) throw error
181
+ unreadableFiles++
182
+ continue
175
183
  }
176
184
 
177
- // Relative to the root the file came FROM. Reporting a
178
- // host-relative path for a file read inside the sandbox would
179
- // hand the model a string `read` then resolves somewhere else.
180
- const relPath = source.posix
181
- ? `./${relativePosix(source.root, filePath)}`
182
- : `./${relative(source.root, filePath).split(sep).join('/')}`
185
+ const lines = content.split('\n')
186
+ let fileHasMatch = false
183
187
 
184
- if (input.context_lines > 0) {
185
- const start = Math.max(0, i - input.context_lines)
186
- const end = Math.min(lines.length - 1, i + input.context_lines)
188
+ for (let i = 0; i < lines.length; i++) {
189
+ context.abortSignal?.throwIfAborted()
190
+ const line = lines[i] ?? ''
191
+ regex.lastIndex = 0
192
+ if (!regex.test(line)) continue
187
193
 
188
- if (results.length > 0) {
189
- results.push('--')
194
+ if (!fileHasMatch) {
195
+ fileHasMatch = true
196
+ filesMatched++
190
197
  }
191
198
 
192
- for (let j = start; j <= end; j++) {
193
- const prefix = j === i ? ':' : '-'
194
- results.push(`${relPath}${prefix}${j + 1}${prefix}${lines[j]}`)
199
+ const relPath = sandbox
200
+ ? `./${relativePosix(sandbox.rootDir, filePath)}`
201
+ : `./${relative(context.workingDirectory, join(lexicalRoot, relative(root, filePath)))
202
+ .split(sep)
203
+ .join('/')}`
204
+
205
+ if (input.context_lines > 0) {
206
+ const start = Math.max(0, i - input.context_lines)
207
+ const end = Math.min(lines.length - 1, i + input.context_lines)
208
+
209
+ if (results.length > 0) {
210
+ results.push('--')
211
+ }
212
+
213
+ for (let j = start; j <= end; j++) {
214
+ const prefix = j === i ? ':' : '-'
215
+ results.push(`${relPath}${prefix}${j + 1}${prefix}${lines[j]}`)
216
+ }
217
+ } else {
218
+ results.push(`${relPath}:${i + 1}:${line}`)
195
219
  }
196
- } else {
197
- results.push(`${relPath}:${i + 1}:${line}`)
220
+
221
+ totalMatches++
222
+ if (totalMatches >= input.max_results) break
198
223
  }
199
224
 
200
- totalMatches++
201
- if (totalMatches >= input.max_results) break
225
+ if (totalMatches >= input.max_results) {
226
+ // Do not read another file just to prove there are more hits. Reaching
227
+ // the requested cap means completeness was not established.
228
+ truncated = true
229
+ break
230
+ }
202
231
  }
203
-
204
- if (totalMatches >= input.max_results) break
232
+ } catch (error) {
233
+ truncated = true
234
+ failure = (error instanceof Error ? error.message : String(error)) || 'File search failed.'
205
235
  }
206
-
207
- if (totalMatches === 0) {
208
- return {
209
- success: true,
210
- output: `No matches found for pattern "${input.pattern}"`,
211
- data: { totalMatches: 0, filesSearched, filesMatched: 0 },
212
- }
236
+ if (unreadableFiles > 0) {
237
+ truncated = true
238
+ failure ??= `${unreadableFiles} file(s) could not be read.`
213
239
  }
214
-
215
- const summary = `Found ${totalMatches} match(es) in ${filesMatched} file(s) (${filesSearched} files searched)`
216
- const output = `${results.join('\n')}\n\n${summary}`
217
-
240
+ const summary =
241
+ totalMatches > 0
242
+ ? `Found ${totalMatches} match(es) in ${filesMatched} file(s) (${filesSearched} files searched)`
243
+ : truncated
244
+ ? `No matches found in the files searched for pattern "${input.pattern}"`
245
+ : `No matches found for pattern "${input.pattern}"`
246
+ const notice = failure
247
+ ? `[Search incomplete: ${failure}]`
248
+ : truncated
249
+ ? `[Search incomplete: reached max_results (${input.max_results}). Narrow the directory or include pattern for a complete search.]`
250
+ : undefined
218
251
  return {
219
- success: true,
220
- output,
221
- data: { totalMatches, filesSearched, filesMatched },
252
+ success: failure === undefined,
253
+ output: [results.join('\n'), summary, notice].filter(Boolean).join('\n\n'),
254
+ data: { totalMatches, filesSearched, filesMatched, truncated },
255
+ ...(failure ? { error: failure } : {}),
222
256
  }
223
257
  },
224
258
  })
@@ -4,8 +4,8 @@ import { z } from 'zod'
4
4
  import type { Sandbox } from '../../types/sandbox/index.js'
5
5
  import type { ToolResult } from '../../types/tool/index.js'
6
6
  import { defineTool } from '../defineTool.js'
7
- import { resolveWithin } from '../paths.js'
8
- import { joinPosix, relativePosix, resolveWithinPosix } from '../posix-path.js'
7
+ import { resolveWithinAny, toolRoots } from '../paths.js'
8
+ import { relativePosix, resolveWithinPosix } from '../posix-path.js'
9
9
 
10
10
  const inputSchema = z.object({
11
11
  path: z.string().default('.').describe('Directory path to list. Defaults to working directory.'),
@@ -140,7 +140,7 @@ async function listInSandbox(
140
140
  // Relative to the LISTED directory, in the sandbox's own coordinates.
141
141
  const relativePaths: { segments: string[]; size: number }[] = []
142
142
  for (const entry of entries) {
143
- const rel = relativePosix(root, joinPosix(root, entry.path))
143
+ const rel = relativePosix(root, resolveWithinPosix(root, entry.path))
144
144
  if (!rel || rel.startsWith('..')) continue
145
145
  const segments = rel.split('/').filter(Boolean)
146
146
  if (segments.length === 0) continue
@@ -220,7 +220,7 @@ export const LsTool = defineTool({
220
220
  }
221
221
 
222
222
  // Contained, not merely resolved — see `resolveWithin`.
223
- const targetPath = resolveWithin(context.workingDirectory, input.path)
223
+ const targetPath = resolveWithinAny(toolRoots(context), input.path)
224
224
 
225
225
  if (input.recursive) {
226
226
  const output: string[] = []