@namzu/sdk 35.0.0 → 37.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 (360) hide show
  1. package/CHANGELOG.md +218 -0
  2. package/README.md +68 -41
  3. package/dist/bridge/a2a/mapper.d.ts.map +1 -1
  4. package/dist/bridge/a2a/mapper.js +2 -0
  5. package/dist/bridge/a2a/mapper.js.map +1 -1
  6. package/dist/bridge/sse/mapper.d.ts.map +1 -1
  7. package/dist/bridge/sse/mapper.js +2 -0
  8. package/dist/bridge/sse/mapper.js.map +1 -1
  9. package/dist/compaction/extractor.d.ts +1 -1
  10. package/dist/compaction/extractor.d.ts.map +1 -1
  11. package/dist/compaction/extractor.js +15 -7
  12. package/dist/compaction/extractor.js.map +1 -1
  13. package/dist/compaction/manager.d.ts +2 -0
  14. package/dist/compaction/manager.d.ts.map +1 -1
  15. package/dist/compaction/manager.js +12 -1
  16. package/dist/compaction/manager.js.map +1 -1
  17. package/dist/compaction/verifier.d.ts.map +1 -1
  18. package/dist/compaction/verifier.js +82 -15
  19. package/dist/compaction/verifier.js.map +1 -1
  20. package/dist/contracts/schemas.d.ts +10 -10
  21. package/dist/eval/harness-verification.d.ts +63 -0
  22. package/dist/eval/harness-verification.d.ts.map +1 -0
  23. package/dist/eval/harness-verification.js +165 -0
  24. package/dist/eval/harness-verification.js.map +1 -0
  25. package/dist/eval/index.d.ts +2 -0
  26. package/dist/eval/index.d.ts.map +1 -1
  27. package/dist/eval/index.js +1 -0
  28. package/dist/eval/index.js.map +1 -1
  29. package/dist/execution/code-runtime/json-value.d.ts +10 -0
  30. package/dist/execution/code-runtime/json-value.d.ts.map +1 -0
  31. package/dist/execution/code-runtime/json-value.js +89 -0
  32. package/dist/execution/code-runtime/json-value.js.map +1 -0
  33. package/dist/execution/code-runtime/worker-program.d.ts +8 -0
  34. package/dist/execution/code-runtime/worker-program.d.ts.map +1 -0
  35. package/dist/execution/code-runtime/worker-program.js +240 -0
  36. package/dist/execution/code-runtime/worker-program.js.map +1 -0
  37. package/dist/execution/code-runtime/worker.d.ts +22 -0
  38. package/dist/execution/code-runtime/worker.d.ts.map +1 -1
  39. package/dist/execution/code-runtime/worker.js +148 -111
  40. package/dist/execution/code-runtime/worker.js.map +1 -1
  41. package/dist/manager/agent/lifecycle.d.ts +12 -0
  42. package/dist/manager/agent/lifecycle.d.ts.map +1 -1
  43. package/dist/manager/agent/lifecycle.js +306 -37
  44. package/dist/manager/agent/lifecycle.js.map +1 -1
  45. package/dist/manager/run/persistence.d.ts +2 -0
  46. package/dist/manager/run/persistence.d.ts.map +1 -1
  47. package/dist/manager/run/persistence.js +6 -0
  48. package/dist/manager/run/persistence.js.map +1 -1
  49. package/dist/provider/capabilities.d.ts +3 -1
  50. package/dist/provider/capabilities.d.ts.map +1 -1
  51. package/dist/provider/capabilities.js +13 -0
  52. package/dist/provider/capabilities.js.map +1 -1
  53. package/dist/provider/fallback.d.ts.map +1 -1
  54. package/dist/provider/fallback.js +2 -0
  55. package/dist/provider/fallback.js.map +1 -1
  56. package/dist/provider/token-budget.d.ts.map +1 -1
  57. package/dist/provider/token-budget.js +56 -8
  58. package/dist/provider/token-budget.js.map +1 -1
  59. package/dist/public-runtime.d.ts +5 -3
  60. package/dist/public-runtime.d.ts.map +1 -1
  61. package/dist/public-runtime.js +3 -2
  62. package/dist/public-runtime.js.map +1 -1
  63. package/dist/public-tools.d.ts +1 -1
  64. package/dist/public-tools.d.ts.map +1 -1
  65. package/dist/public-tools.js +1 -1
  66. package/dist/public-tools.js.map +1 -1
  67. package/dist/public-types.d.ts +1 -0
  68. package/dist/public-types.d.ts.map +1 -1
  69. package/dist/registry/tool/execute.d.ts +3 -0
  70. package/dist/registry/tool/execute.d.ts.map +1 -1
  71. package/dist/registry/tool/execute.js +11 -80
  72. package/dist/registry/tool/execute.js.map +1 -1
  73. package/dist/run/command-gate.d.ts.map +1 -1
  74. package/dist/run/command-gate.js +65 -12
  75. package/dist/run/command-gate.js.map +1 -1
  76. package/dist/run/index.d.ts +2 -0
  77. package/dist/run/index.d.ts.map +1 -1
  78. package/dist/run/index.js +1 -0
  79. package/dist/run/index.js.map +1 -1
  80. package/dist/run/memory-promoter.d.ts +3 -35
  81. package/dist/run/memory-promoter.d.ts.map +1 -1
  82. package/dist/run/memory-promoter.js +32 -40
  83. package/dist/run/memory-promoter.js.map +1 -1
  84. package/dist/run/memory-recall.d.ts +25 -0
  85. package/dist/run/memory-recall.d.ts.map +1 -0
  86. package/dist/run/memory-recall.js +228 -0
  87. package/dist/run/memory-recall.js.map +1 -0
  88. package/dist/run/reporter.d.ts.map +1 -1
  89. package/dist/run/reporter.js +1 -0
  90. package/dist/run/reporter.js.map +1 -1
  91. package/dist/run/token-budget.d.ts +2 -0
  92. package/dist/run/token-budget.d.ts.map +1 -1
  93. package/dist/run/token-budget.js +4 -0
  94. package/dist/run/token-budget.js.map +1 -1
  95. package/dist/run/workspace-fingerprint.d.ts +10 -3
  96. package/dist/run/workspace-fingerprint.d.ts.map +1 -1
  97. package/dist/run/workspace-fingerprint.js +17 -8
  98. package/dist/run/workspace-fingerprint.js.map +1 -1
  99. package/dist/runtime/query/checkpoint.d.ts +14 -0
  100. package/dist/runtime/query/checkpoint.d.ts.map +1 -1
  101. package/dist/runtime/query/checkpoint.js +82 -1
  102. package/dist/runtime/query/checkpoint.js.map +1 -1
  103. package/dist/runtime/query/executor.d.ts +6 -0
  104. package/dist/runtime/query/executor.d.ts.map +1 -1
  105. package/dist/runtime/query/executor.js +120 -24
  106. package/dist/runtime/query/executor.js.map +1 -1
  107. package/dist/runtime/query/index.d.ts +12 -8
  108. package/dist/runtime/query/index.d.ts.map +1 -1
  109. package/dist/runtime/query/index.js +55 -7
  110. package/dist/runtime/query/index.js.map +1 -1
  111. package/dist/runtime/query/iteration/index.d.ts +13 -3
  112. package/dist/runtime/query/iteration/index.d.ts.map +1 -1
  113. package/dist/runtime/query/iteration/index.js +356 -42
  114. package/dist/runtime/query/iteration/index.js.map +1 -1
  115. package/dist/runtime/query/iteration/native-output.d.ts +10 -0
  116. package/dist/runtime/query/iteration/native-output.d.ts.map +1 -0
  117. package/dist/runtime/query/iteration/native-output.js +32 -0
  118. package/dist/runtime/query/iteration/native-output.js.map +1 -0
  119. package/dist/runtime/query/iteration/phases/advisory.d.ts.map +1 -1
  120. package/dist/runtime/query/iteration/phases/advisory.js +18 -13
  121. package/dist/runtime/query/iteration/phases/advisory.js.map +1 -1
  122. package/dist/runtime/query/iteration/phases/compaction.d.ts +2 -0
  123. package/dist/runtime/query/iteration/phases/compaction.d.ts.map +1 -1
  124. package/dist/runtime/query/iteration/phases/compaction.js +32 -11
  125. package/dist/runtime/query/iteration/phases/compaction.js.map +1 -1
  126. package/dist/runtime/query/iteration/phases/context.d.ts +11 -0
  127. package/dist/runtime/query/iteration/phases/context.d.ts.map +1 -1
  128. package/dist/runtime/query/iteration/phases/context.js.map +1 -1
  129. package/dist/runtime/query/iteration/phases/tool-review.d.ts.map +1 -1
  130. package/dist/runtime/query/iteration/phases/tool-review.js +1 -1
  131. package/dist/runtime/query/iteration/phases/tool-review.js.map +1 -1
  132. package/dist/runtime/query/iteration/phases/working-memory.d.ts +1 -1
  133. package/dist/runtime/query/iteration/phases/working-memory.d.ts.map +1 -1
  134. package/dist/runtime/query/iteration/phases/working-memory.js +23 -6
  135. package/dist/runtime/query/iteration/phases/working-memory.js.map +1 -1
  136. package/dist/runtime/query/iteration/stream-turn.d.ts.map +1 -1
  137. package/dist/runtime/query/iteration/stream-turn.js +12 -5
  138. package/dist/runtime/query/iteration/stream-turn.js.map +1 -1
  139. package/dist/runtime/query/prompt.d.ts.map +1 -1
  140. package/dist/runtime/query/prompt.js +14 -4
  141. package/dist/runtime/query/prompt.js.map +1 -1
  142. package/dist/runtime/query/steering.d.ts +6 -2
  143. package/dist/runtime/query/steering.d.ts.map +1 -1
  144. package/dist/runtime/query/steering.js +17 -2
  145. package/dist/runtime/query/steering.js.map +1 -1
  146. package/dist/runtime/query/tool-call-budget.d.ts +19 -0
  147. package/dist/runtime/query/tool-call-budget.d.ts.map +1 -0
  148. package/dist/runtime/query/tool-call-budget.js +110 -0
  149. package/dist/runtime/query/tool-call-budget.js.map +1 -0
  150. package/dist/runtime/query/tooling.d.ts +2 -0
  151. package/dist/runtime/query/tooling.d.ts.map +1 -1
  152. package/dist/runtime/query/tooling.js +4 -0
  153. package/dist/runtime/query/tooling.js.map +1 -1
  154. package/dist/sandbox/file-walk-program.d.ts +3 -0
  155. package/dist/sandbox/file-walk-program.d.ts.map +1 -0
  156. package/dist/sandbox/file-walk-program.js +94 -0
  157. package/dist/sandbox/file-walk-program.js.map +1 -0
  158. package/dist/sandbox/file-walk.d.ts +12 -0
  159. package/dist/sandbox/file-walk.d.ts.map +1 -0
  160. package/dist/sandbox/file-walk.js +429 -0
  161. package/dist/sandbox/file-walk.js.map +1 -0
  162. package/dist/sandbox/index.d.ts +2 -0
  163. package/dist/sandbox/index.d.ts.map +1 -1
  164. package/dist/sandbox/index.js +1 -0
  165. package/dist/sandbox/index.js.map +1 -1
  166. package/dist/sandbox/provider/local.d.ts.map +1 -1
  167. package/dist/sandbox/provider/local.js +9 -0
  168. package/dist/sandbox/provider/local.js.map +1 -1
  169. package/dist/scheduler/completion-inbox.d.ts +3 -2
  170. package/dist/scheduler/completion-inbox.d.ts.map +1 -1
  171. package/dist/scheduler/completion-inbox.js +29 -15
  172. package/dist/scheduler/completion-inbox.js.map +1 -1
  173. package/dist/scheduler/local.d.ts.map +1 -1
  174. package/dist/scheduler/local.js +1 -0
  175. package/dist/scheduler/local.js.map +1 -1
  176. package/dist/session/handoff/capacity.d.ts +2 -2
  177. package/dist/session/handoff/capacity.d.ts.map +1 -1
  178. package/dist/session/handoff/capacity.js +3 -2
  179. package/dist/session/handoff/capacity.js.map +1 -1
  180. package/dist/store/memory/disk.d.ts +6 -2
  181. package/dist/store/memory/disk.d.ts.map +1 -1
  182. package/dist/store/memory/disk.js +42 -25
  183. package/dist/store/memory/disk.js.map +1 -1
  184. package/dist/store/memory/index.d.ts +4 -0
  185. package/dist/store/memory/index.d.ts.map +1 -1
  186. package/dist/store/memory/index.js +55 -19
  187. package/dist/store/memory/index.js.map +1 -1
  188. package/dist/store/memory/memory.d.ts +3 -2
  189. package/dist/store/memory/memory.d.ts.map +1 -1
  190. package/dist/store/memory/memory.js +11 -2
  191. package/dist/store/memory/memory.js.map +1 -1
  192. package/dist/store/memory/operation-lock.d.ts +11 -0
  193. package/dist/store/memory/operation-lock.d.ts.map +1 -0
  194. package/dist/store/memory/operation-lock.js +94 -0
  195. package/dist/store/memory/operation-lock.js.map +1 -0
  196. package/dist/tools/builtins/bash.d.ts.map +1 -1
  197. package/dist/tools/builtins/bash.js +215 -59
  198. package/dist/tools/builtins/bash.js.map +1 -1
  199. package/dist/tools/builtins/computer-use.d.ts.map +1 -1
  200. package/dist/tools/builtins/computer-use.js +60 -10
  201. package/dist/tools/builtins/computer-use.js.map +1 -1
  202. package/dist/tools/builtins/glob.d.ts +2 -1
  203. package/dist/tools/builtins/glob.d.ts.map +1 -1
  204. package/dist/tools/builtins/glob.js +95 -103
  205. package/dist/tools/builtins/glob.js.map +1 -1
  206. package/dist/tools/builtins/grep.d.ts.map +1 -1
  207. package/dist/tools/builtins/grep.js +155 -111
  208. package/dist/tools/builtins/grep.js.map +1 -1
  209. package/dist/tools/builtins/ls.js +2 -2
  210. package/dist/tools/builtins/ls.js.map +1 -1
  211. package/dist/tools/builtins/run-code.d.ts +6 -0
  212. package/dist/tools/builtins/run-code.d.ts.map +1 -1
  213. package/dist/tools/builtins/run-code.js +15 -4
  214. package/dist/tools/builtins/run-code.js.map +1 -1
  215. package/dist/tools/builtins/search-tools.d.ts.map +1 -1
  216. package/dist/tools/builtins/search-tools.js +14 -2
  217. package/dist/tools/builtins/search-tools.js.map +1 -1
  218. package/dist/tools/defineTool.d.ts +2 -0
  219. package/dist/tools/defineTool.d.ts.map +1 -1
  220. package/dist/tools/defineTool.js +3 -0
  221. package/dist/tools/defineTool.js.map +1 -1
  222. package/dist/tools/memory/delete.d.ts +4 -0
  223. package/dist/tools/memory/delete.d.ts.map +1 -0
  224. package/dist/tools/memory/delete.js +26 -0
  225. package/dist/tools/memory/delete.js.map +1 -0
  226. package/dist/tools/memory/index.d.ts +2 -0
  227. package/dist/tools/memory/index.d.ts.map +1 -1
  228. package/dist/tools/memory/index.js +6 -0
  229. package/dist/tools/memory/index.js.map +1 -1
  230. package/dist/tools/memory/save.d.ts.map +1 -1
  231. package/dist/tools/memory/save.js +3 -2
  232. package/dist/tools/memory/save.js.map +1 -1
  233. package/dist/tools/memory/search.d.ts.map +1 -1
  234. package/dist/tools/memory/search.js +12 -5
  235. package/dist/tools/memory/search.js.map +1 -1
  236. package/dist/tools/memory/update.d.ts +4 -0
  237. package/dist/tools/memory/update.d.ts.map +1 -0
  238. package/dist/tools/memory/update.js +47 -0
  239. package/dist/tools/memory/update.js.map +1 -0
  240. package/dist/types/agent/scheduler.d.ts +5 -0
  241. package/dist/types/agent/scheduler.d.ts.map +1 -1
  242. package/dist/types/agent/task.d.ts +10 -0
  243. package/dist/types/agent/task.d.ts.map +1 -1
  244. package/dist/types/computer-use/index.d.ts +6 -0
  245. package/dist/types/computer-use/index.d.ts.map +1 -1
  246. package/dist/types/computer-use/index.js.map +1 -1
  247. package/dist/types/errors/catalog.js +1 -1
  248. package/dist/types/errors/catalog.js.map +1 -1
  249. package/dist/types/hitl/index.d.ts +11 -1
  250. package/dist/types/hitl/index.d.ts.map +1 -1
  251. package/dist/types/hitl/index.js.map +1 -1
  252. package/dist/types/memory/index.d.ts +14 -1
  253. package/dist/types/memory/index.d.ts.map +1 -1
  254. package/dist/types/project/entity.d.ts +1 -0
  255. package/dist/types/project/entity.d.ts.map +1 -1
  256. package/dist/types/provider/config.d.ts +2 -0
  257. package/dist/types/provider/config.d.ts.map +1 -1
  258. package/dist/types/provider/model.d.ts +4 -0
  259. package/dist/types/provider/model.d.ts.map +1 -1
  260. package/dist/types/run/answer-review.d.ts +2 -0
  261. package/dist/types/run/answer-review.d.ts.map +1 -1
  262. package/dist/types/run/events.d.ts +9 -0
  263. package/dist/types/run/events.d.ts.map +1 -1
  264. package/dist/types/run/events.js.map +1 -1
  265. package/dist/types/run/prepare-step.d.ts +19 -1
  266. package/dist/types/run/prepare-step.d.ts.map +1 -1
  267. package/dist/types/sandbox/index.d.ts +20 -0
  268. package/dist/types/sandbox/index.d.ts.map +1 -1
  269. package/dist/types/sandbox/index.js.map +1 -1
  270. package/dist/types/structured-output/index.d.ts +8 -2
  271. package/dist/types/structured-output/index.d.ts.map +1 -1
  272. package/dist/types/tool/index.d.ts +15 -0
  273. package/dist/types/tool/index.d.ts.map +1 -1
  274. package/dist/types/tool/index.js.map +1 -1
  275. package/dist/utils/json-snapshot.d.ts +3 -0
  276. package/dist/utils/json-snapshot.d.ts.map +1 -0
  277. package/dist/utils/json-snapshot.js +79 -0
  278. package/dist/utils/json-snapshot.js.map +1 -0
  279. package/package.json +8 -1
  280. package/src/bridge/a2a/mapper.ts +2 -0
  281. package/src/bridge/sse/mapper.ts +2 -0
  282. package/src/compaction/extractor.ts +21 -8
  283. package/src/compaction/manager.ts +11 -1
  284. package/src/compaction/verifier.ts +80 -18
  285. package/src/eval/harness-verification.ts +270 -0
  286. package/src/eval/index.ts +10 -0
  287. package/src/execution/code-runtime/json-value.ts +82 -0
  288. package/src/execution/code-runtime/worker-program.ts +239 -0
  289. package/src/execution/code-runtime/worker.ts +164 -111
  290. package/src/manager/agent/lifecycle.ts +340 -45
  291. package/src/manager/run/persistence.ts +7 -0
  292. package/src/provider/capabilities.ts +25 -1
  293. package/src/provider/fallback.ts +2 -0
  294. package/src/provider/token-budget.ts +52 -8
  295. package/src/public-runtime.ts +6 -1
  296. package/src/public-tools.ts +5 -1
  297. package/src/public-types.ts +1 -0
  298. package/src/registry/tool/execute.ts +17 -79
  299. package/src/run/command-gate.ts +61 -13
  300. package/src/run/index.ts +2 -0
  301. package/src/run/memory-promoter.ts +32 -40
  302. package/src/run/memory-recall.ts +254 -0
  303. package/src/run/reporter.ts +1 -0
  304. package/src/run/token-budget.ts +4 -0
  305. package/src/run/workspace-fingerprint.ts +17 -8
  306. package/src/runtime/query/checkpoint.ts +96 -2
  307. package/src/runtime/query/executor.ts +131 -28
  308. package/src/runtime/query/index.ts +81 -16
  309. package/src/runtime/query/iteration/index.ts +406 -53
  310. package/src/runtime/query/iteration/native-output.ts +35 -0
  311. package/src/runtime/query/iteration/phases/advisory.ts +21 -11
  312. package/src/runtime/query/iteration/phases/compaction.ts +36 -14
  313. package/src/runtime/query/iteration/phases/context.ts +11 -0
  314. package/src/runtime/query/iteration/phases/tool-review.ts +5 -1
  315. package/src/runtime/query/iteration/phases/working-memory.ts +23 -5
  316. package/src/runtime/query/iteration/stream-turn.ts +11 -5
  317. package/src/runtime/query/prompt.ts +21 -4
  318. package/src/runtime/query/steering.ts +19 -2
  319. package/src/runtime/query/tool-call-budget.ts +115 -0
  320. package/src/runtime/query/tooling.ts +6 -0
  321. package/src/sandbox/file-walk-program.ts +93 -0
  322. package/src/sandbox/file-walk.ts +463 -0
  323. package/src/sandbox/index.ts +2 -0
  324. package/src/sandbox/provider/local.ts +13 -0
  325. package/src/scheduler/completion-inbox.ts +29 -19
  326. package/src/scheduler/local.ts +1 -0
  327. package/src/session/handoff/capacity.ts +7 -3
  328. package/src/store/memory/disk.ts +52 -30
  329. package/src/store/memory/index.ts +75 -27
  330. package/src/store/memory/memory.ts +18 -6
  331. package/src/store/memory/operation-lock.ts +99 -0
  332. package/src/tools/builtins/bash.ts +230 -58
  333. package/src/tools/builtins/computer-use.ts +61 -7
  334. package/src/tools/builtins/glob.ts +104 -122
  335. package/src/tools/builtins/grep.ts +166 -132
  336. package/src/tools/builtins/ls.ts +2 -2
  337. package/src/tools/builtins/run-code.ts +24 -5
  338. package/src/tools/builtins/search-tools.ts +18 -3
  339. package/src/tools/defineTool.ts +5 -0
  340. package/src/tools/memory/delete.ts +29 -0
  341. package/src/tools/memory/index.ts +6 -0
  342. package/src/tools/memory/save.ts +4 -2
  343. package/src/tools/memory/search.ts +12 -5
  344. package/src/tools/memory/update.ts +50 -0
  345. package/src/types/agent/scheduler.ts +6 -0
  346. package/src/types/agent/task.ts +13 -0
  347. package/src/types/computer-use/index.ts +6 -0
  348. package/src/types/errors/catalog.ts +1 -1
  349. package/src/types/hitl/index.ts +11 -1
  350. package/src/types/memory/index.ts +16 -1
  351. package/src/types/project/entity.ts +1 -0
  352. package/src/types/provider/config.ts +2 -0
  353. package/src/types/provider/model.ts +4 -0
  354. package/src/types/run/answer-review.ts +2 -0
  355. package/src/types/run/events.ts +10 -0
  356. package/src/types/run/prepare-step.ts +19 -1
  357. package/src/types/sandbox/index.ts +21 -0
  358. package/src/types/structured-output/index.ts +15 -2
  359. package/src/types/tool/index.ts +16 -0
  360. package/src/utils/json-snapshot.ts +76 -0
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/store/memory/index.ts"],"names":[],"mappings":"AAQA,MAAM,OAAO,mBAAmB;IACvB,OAAO,GAAG,IAAI,GAAG,EAA4B,CAAA;IAErD,MAAM,CAAC,MAA0B;QAChC,IAAI,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;QAE/C,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YAClB,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,CAAA;YACpC,OAAO,GAAG,OAAO,CAAC,MAAM,CACvB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAC/E,CAAA;QACF,CAAC;QAED,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3C,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAA;YAChC,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QACnF,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YACnB,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,CAAA;QAC5D,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAA;QAEjD,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAA;QACjC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,UAAU,CAAA;QAExC,OAAO;YACN,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;YAChC,UAAU;SACV,CAAA;IACF,CAAC;IAED,QAAQ,CAAC,EAAY;QACpB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IAC5B,CAAC;IAED,UAAU;QACT,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IACzC,CAAC;IAED,KAAK;QACJ,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAA;IACzB,CAAC;IAED,OAAO,CAAC,OAA2B;QAClC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAA;QACpB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;QAClC,CAAC;IACF,CAAC;IAED,GAAG,CAAC,KAAuB;QAC1B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;IAClC,CAAC;IAED,MAAM,CAAC,EAAY;QAClB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IAC/B,CAAC;CACD"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/store/memory/index.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import type { MemoryId } from '../../types/ids/index.js';
2
- import type { CreateMemoryParams, MemoryContent, MemoryIndexEntry, MemorySearchParams, MemorySearchResult, MemoryStore } from '../../types/memory/index.js';
2
+ import type { CreateMemoryParams, MemoryContent, MemoryIndexEntry, MemoryRecord, MemorySearchParams, MemorySearchResult, MemoryStore, UpdateMemoryParams } from '../../types/memory/index.js';
3
3
  import { InMemoryMemoryIndex } from './index.js';
4
4
  export declare class InMemoryMemoryStore implements MemoryStore {
5
5
  private content;
@@ -9,7 +9,8 @@ export declare class InMemoryMemoryStore implements MemoryStore {
9
9
  content: MemoryContent;
10
10
  }>;
11
11
  get(id: MemoryId): Promise<MemoryContent | undefined>;
12
- update(id: MemoryId, updates: Partial<CreateMemoryParams>): Promise<MemoryIndexEntry | undefined>;
12
+ getRecord(id: MemoryId): Promise<MemoryRecord | undefined>;
13
+ update(id: MemoryId, updates: UpdateMemoryParams): Promise<MemoryIndexEntry | undefined>;
13
14
  delete(id: MemoryId): Promise<boolean>;
14
15
  list(params?: MemorySearchParams): Promise<MemorySearchResult>;
15
16
  getIndex(): InMemoryMemoryIndex;
@@ -1 +1 @@
1
- {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../../src/store/memory/memory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACxD,OAAO,KAAK,EACX,kBAAkB,EAClB,aAAa,EACb,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,WAAW,EACX,MAAM,6BAA6B,CAAA;AAEpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAEhD,qBAAa,mBAAoB,YAAW,WAAW;IACtD,OAAO,CAAC,OAAO,CAAmC;IAClD,OAAO,CAAC,KAAK,CAA4B;IAEnC,MAAM,CACX,MAAM,EAAE,kBAAkB,GACxB,OAAO,CAAC;QAAE,KAAK,EAAE,gBAAgB,CAAC;QAAC,OAAO,EAAE,aAAa,CAAA;KAAE,CAAC;IA2BzD,GAAG,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;IAIrD,MAAM,CACX,EAAE,EAAE,QAAQ,EACZ,OAAO,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAClC,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAqClC,MAAM,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IAMtC,IAAI,CAAC,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAIpE,QAAQ,IAAI,mBAAmB;CAG/B"}
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../../src/store/memory/memory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACxD,OAAO,KAAK,EACX,kBAAkB,EAClB,aAAa,EACb,gBAAgB,EAChB,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,EAClB,WAAW,EACX,kBAAkB,EAClB,MAAM,6BAA6B,CAAA;AAGpC,OAAO,EAAE,mBAAmB,EAAuB,MAAM,YAAY,CAAA;AAErE,qBAAa,mBAAoB,YAAW,WAAW;IACtD,OAAO,CAAC,OAAO,CAAmC;IAClD,OAAO,CAAC,KAAK,CAA4B;IAEnC,MAAM,CACX,MAAM,EAAE,kBAAkB,GACxB,OAAO,CAAC;QAAE,KAAK,EAAE,gBAAgB,CAAC;QAAC,OAAO,EAAE,aAAa,CAAA;KAAE,CAAC;IA2BzD,GAAG,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;IAIrD,SAAS,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IAM1D,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAuCxF,MAAM,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IAMtC,IAAI,CAAC,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAQpE,QAAQ,IAAI,mBAAmB;CAG/B"}
@@ -1,5 +1,6 @@
1
+ import { assertMemoryStatus } from '../../types/memory/index.js';
1
2
  import { generateMemoryId } from '../../utils/id.js';
2
- import { InMemoryMemoryIndex } from './index.js';
3
+ import { InMemoryMemoryIndex, searchMemoryEntries } from './index.js';
3
4
  export class InMemoryMemoryStore {
4
5
  content = new Map();
5
6
  index = new InMemoryMemoryIndex();
@@ -28,7 +29,14 @@ export class InMemoryMemoryStore {
28
29
  async get(id) {
29
30
  return this.content.get(id);
30
31
  }
32
+ async getRecord(id) {
33
+ const entry = this.index.getEntry(id);
34
+ const content = this.content.get(id);
35
+ return entry && content ? structuredClone({ entry, content }) : undefined;
36
+ }
31
37
  async update(id, updates) {
38
+ if (updates.status !== undefined)
39
+ assertMemoryStatus(updates.status);
32
40
  const existing = this.index.getEntry(id);
33
41
  if (!existing)
34
42
  return undefined;
@@ -38,6 +46,7 @@ export class InMemoryMemoryStore {
38
46
  title: updates.title ?? existing.title,
39
47
  summary: updates.summary ?? existing.summary,
40
48
  tags: updates.tags ? [...updates.tags] : existing.tags,
49
+ status: updates.status ?? existing.status,
41
50
  updatedAt: now,
42
51
  };
43
52
  this.index.set(updated);
@@ -63,7 +72,7 @@ export class InMemoryMemoryStore {
63
72
  return existed;
64
73
  }
65
74
  async list(params) {
66
- return this.index.search(params ?? {});
75
+ return searchMemoryEntries(this.index.allEntries(), params ?? {}, (id) => this.content.get(id)?.content ?? '');
67
76
  }
68
77
  getIndex() {
69
78
  return this.index;
@@ -1 +1 @@
1
- {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../../src/store/memory/memory.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../../src/store/memory/memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /** Wait bound, not a lease: a slow or crashed owner is never silently replaced. */
2
+ export declare const DEFAULT_MEMORY_LOCK_TIMEOUT_MS = 10000;
3
+ export declare function validateMemoryLockTimeout(timeoutMs: number): void;
4
+ /**
5
+ * Local-filesystem exclusion for cooperating processes. Atomic rename of the
6
+ * index alone cannot serialize the index/content read-modify-write transaction.
7
+ * An abandoned lock fails closed; guessing a lease expired would permit two
8
+ * live writers to overwrite each other again.
9
+ */
10
+ export declare function acquireMemoryOperationLock(path: string, timeoutMs: number): Promise<() => Promise<void>>;
11
+ //# sourceMappingURL=operation-lock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operation-lock.d.ts","sourceRoot":"","sources":["../../../src/store/memory/operation-lock.ts"],"names":[],"mappings":"AAMA,mFAAmF;AACnF,eAAO,MAAM,8BAA8B,QAAS,CAAA;AAEpD,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAQjE;AAWD;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAC/C,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CA6D9B"}
@@ -0,0 +1,94 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { lstat, open, readFile, unlink } from 'node:fs/promises';
3
+ import { setTimeout as delay } from 'node:timers/promises';
4
+ import { NamzuError } from '../../types/errors/index.js';
5
+ /** Wait bound, not a lease: a slow or crashed owner is never silently replaced. */
6
+ export const DEFAULT_MEMORY_LOCK_TIMEOUT_MS = 10_000;
7
+ export function validateMemoryLockTimeout(timeoutMs) {
8
+ if (!Number.isSafeInteger(timeoutMs) || timeoutMs <= 0) {
9
+ throw new NamzuError({
10
+ code: 'invalid_config',
11
+ message: 'DiskMemoryStore lockTimeoutMs must be a positive safe integer.',
12
+ retryable: false,
13
+ });
14
+ }
15
+ }
16
+ function lockError(path, reason, timeoutMs) {
17
+ return new NamzuError({
18
+ code: 'storage_error',
19
+ message: `Memory operation lock ${path}: ${reason}. Stop all processes using this memory store and inspect the lock owner before removing a stale lock; it is never broken automatically.`,
20
+ details: { lockPath: path, timeoutMs },
21
+ retryable: false,
22
+ });
23
+ }
24
+ /**
25
+ * Local-filesystem exclusion for cooperating processes. Atomic rename of the
26
+ * index alone cannot serialize the index/content read-modify-write transaction.
27
+ * An abandoned lock fails closed; guessing a lease expired would permit two
28
+ * live writers to overwrite each other again.
29
+ */
30
+ export async function acquireMemoryOperationLock(path, timeoutMs) {
31
+ const deadline = performance.now() + timeoutMs;
32
+ let attempted = false;
33
+ for (;;) {
34
+ if (attempted && performance.now() >= deadline) {
35
+ throw lockError(path, `acquisition timed out after ${timeoutMs} ms`, timeoutMs);
36
+ }
37
+ attempted = true;
38
+ let handle;
39
+ try {
40
+ handle = await open(path, 'wx', 0o600);
41
+ }
42
+ catch (error) {
43
+ if (error.code !== 'EEXIST')
44
+ throw error;
45
+ const existing = await lstat(path).catch((statError) => {
46
+ if (statError.code === 'ENOENT')
47
+ return undefined;
48
+ throw statError;
49
+ });
50
+ if (!existing)
51
+ continue;
52
+ if (!existing.isFile() || existing.isSymbolicLink()) {
53
+ throw lockError(path, 'the occupied lock is not a regular file', timeoutMs);
54
+ }
55
+ if (performance.now() >= deadline) {
56
+ throw lockError(path, `acquisition timed out after ${timeoutMs} ms`, timeoutMs);
57
+ }
58
+ await delay(Math.min(25, Math.max(1, deadline - performance.now())));
59
+ continue;
60
+ }
61
+ const owner = `${JSON.stringify({ pid: process.pid, token: randomUUID(), acquiredAt: Date.now() })}\n`;
62
+ const identity = await handle.stat().catch(async (error) => {
63
+ await handle.close();
64
+ // Exclusive create happened, but ownership could not be established.
65
+ // Leave the path for explicit recovery rather than unlink an unknown inode.
66
+ throw error;
67
+ });
68
+ try {
69
+ await handle.writeFile(owner, 'utf8');
70
+ await handle.sync();
71
+ }
72
+ catch (error) {
73
+ await handle.close();
74
+ const current = await lstat(path).catch(() => undefined);
75
+ if (current?.dev === identity.dev && current.ino === identity.ino) {
76
+ await unlink(path).catch(() => undefined);
77
+ }
78
+ throw error;
79
+ }
80
+ await handle.close();
81
+ return async () => {
82
+ const current = await lstat(path);
83
+ if (!current.isFile() ||
84
+ current.isSymbolicLink() ||
85
+ current.dev !== identity.dev ||
86
+ current.ino !== identity.ino ||
87
+ (await readFile(path, 'utf8')) !== owner) {
88
+ throw lockError(path, 'the lock owner changed before release', timeoutMs);
89
+ }
90
+ await unlink(path);
91
+ };
92
+ }
93
+ }
94
+ //# sourceMappingURL=operation-lock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operation-lock.js","sourceRoot":"","sources":["../../../src/store/memory/operation-lock.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../../src/tools/builtins/bash.ts"],"names":[],"mappings":"AA8FA,6GAA6G;AAC7G,eAAO,MAAM,qBAAqB,4NACwL,CAAA;AAE1N,eAAO,MAAM,QAAQ;;;;EA+OnB,CAAA"}
1
+ {"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../../src/tools/builtins/bash.ts"],"names":[],"mappings":"AAoRA,6GAA6G;AAC7G,eAAO,MAAM,qBAAqB,4NACwL,CAAA;AAE1N,eAAO,MAAM,QAAQ;;;;EAqOnB,CAAA"}
@@ -1,10 +1,12 @@
1
- import { exec } from 'node:child_process';
2
- import { promisify } from 'node:util';
1
+ import { spawn } from 'node:child_process';
2
+ import { StringDecoder } from 'node:string_decoder';
3
3
  import { z } from 'zod';
4
+ import { SANDBOX_KILL_GRACE_MS } from '../../constants/sandbox/index.js';
4
5
  import { DANGEROUS_PATTERNS } from '../../constants/tools/index.js';
6
+ import { killTree } from '../../process/kill-tree.js';
7
+ import { subscribeToAbort } from '../../utils/abort.js';
5
8
  import { defineTool } from '../defineTool.js';
6
9
  import { scrubInheritedEnv } from '../env-scrub.js';
7
- const execAsync = promisify(exec);
8
10
  // Namzu owns its own bash timeout knob — `NAMZU_BASH_TIMEOUT_MS`.
9
11
  // The Vandal fallback (`VANDAL_NAMZU_TIMEOUT_MS`) lived here as a
10
12
  // historical bridge while Namzu was carved out of the Vandal repo,
@@ -49,26 +51,192 @@ const inputSchema = z.object({
49
51
  .optional()
50
52
  .describe('Start the command as a background job and return its id immediately, instead of waiting. The turn is not held open; read its output with the `job` tool. Use for watchers, dev servers and long builds. Do NOT write `cmd &` yourself — under the sandbox the shell that backgrounds it exits immediately and takes the job with it.'),
51
53
  });
54
+ const MAX_SHELL_PROGRESS_CHARS = 160;
55
+ /** Keep a bounded tail even when a process never writes a newline. */
56
+ function appendProgressTail(previous, chunk, start, end) {
57
+ return (previous + chunk.slice(Math.max(start, end - MAX_SHELL_PROGRESS_CHARS), end)).slice(-MAX_SHELL_PROGRESS_CHARS);
58
+ }
59
+ /** Clipping a UTF-16 string must not display half of a surrogate pair. */
60
+ function progressLine(value) {
61
+ let line = value.trim();
62
+ const first = line.charCodeAt(0);
63
+ if (first >= 0xdc00 && first <= 0xdfff)
64
+ line = line.slice(1);
65
+ const last = line.charCodeAt(line.length - 1);
66
+ if (last >= 0xd800 && last <= 0xdbff)
67
+ line = line.slice(0, -1);
68
+ return line;
69
+ }
52
70
  /**
53
- * The last line worth showing from one chunk of streamed output.
54
- *
55
- * A progress line is a status, not a log: the host renders one line and
56
- * replaces it as the next arrives, so sending a whole chunk sends a wall
57
- * of text into a slot that shows one line of it. A chunk usually ends
58
- * mid-line and usually ends with a newline, so the last NON-EMPTY line is
59
- * the most recent complete thing the command actually said.
60
- *
61
- * Progress is capped rather than truncated with an ellipsis: this is
62
- * glanced at, and a marker in a line nobody reads to the end is noise.
71
+ * One latest line per stream, independent of transport chunk boundaries.
72
+ * Reports stay synchronous: the executor owns coalescing and backpressure.
73
+ * This projection adds neither an output log nor a queue of pending reports.
63
74
  */
64
- function lastNonEmptyLine(chunk) {
65
- const lines = chunk.split('\n');
66
- for (let i = lines.length - 1; i >= 0; i--) {
67
- const line = lines[i]?.trim();
68
- if (line)
69
- return line.length > 160 ? line.slice(0, 160) : line;
70
- }
71
- return undefined;
75
+ function shellProgress(report) {
76
+ if (!report)
77
+ return undefined;
78
+ const partial = { stdout: '', stderr: '' };
79
+ let lastMessage = '';
80
+ return ({ stream, data }) => {
81
+ let line = partial[stream];
82
+ let latest = '';
83
+ let start = 0;
84
+ // Scan delimiters without allocating an array for arbitrarily chatty output.
85
+ for (const match of data.matchAll(/[\r\n]/g)) {
86
+ line = appendProgressTail(line, data, start, match.index);
87
+ latest = progressLine(line) || latest;
88
+ line = '';
89
+ start = match.index + 1;
90
+ }
91
+ line = appendProgressTail(line, data, start, data.length);
92
+ partial[stream] = line;
93
+ const message = progressLine(line) || latest;
94
+ if (!message || message === lastMessage)
95
+ return;
96
+ lastMessage = message;
97
+ try {
98
+ report(message);
99
+ }
100
+ catch {
101
+ // A diagnostic observer cannot break the process output reader.
102
+ }
103
+ };
104
+ }
105
+ /**
106
+ * Keep the shell's process group until inherited pipes close. Node's exec
107
+ * timeout/AbortSignal kills only the wrapper and closes its pipes immediately,
108
+ * leaving the command and its descendants running after the promise settles.
109
+ */
110
+ function execHostShell(command, options) {
111
+ options.signal?.throwIfAborted();
112
+ return new Promise((resolve, reject) => {
113
+ const child = spawn(command, {
114
+ cwd: options.cwd,
115
+ env: options.env,
116
+ shell: true,
117
+ // killTree's negative PID must never target the caller's own group.
118
+ detached: process.platform !== 'win32',
119
+ });
120
+ const captures = {
121
+ stdout: {
122
+ chunks: [],
123
+ bytes: 0,
124
+ truncated: false,
125
+ decoder: new StringDecoder('utf8'),
126
+ },
127
+ stderr: {
128
+ chunks: [],
129
+ bytes: 0,
130
+ truncated: false,
131
+ decoder: new StringDecoder('utf8'),
132
+ },
133
+ };
134
+ let cause;
135
+ let failure;
136
+ let escalation;
137
+ let disposeAbort;
138
+ let closed = false;
139
+ const cancel = (origin) => {
140
+ if (closed || cause !== undefined)
141
+ return;
142
+ cause = origin;
143
+ escalation = setTimeout(() => {
144
+ escalation = undefined;
145
+ killTree(child, 'SIGKILL');
146
+ // A descendant can deliberately start a separate session. It is
147
+ // outside this group, but its inherited pipes must not hold the
148
+ // cancelled call forever. Keep what was captured during grace.
149
+ child.stdin?.destroy();
150
+ child.stdout?.destroy();
151
+ child.stderr?.destroy();
152
+ }, SANDBOX_KILL_GRACE_MS);
153
+ escalation.unref?.();
154
+ killTree(child, 'SIGTERM');
155
+ };
156
+ const capture = (stream, chunk) => {
157
+ const state = captures[stream];
158
+ const kept = Math.min(chunk.length, options.maxBuffer - state.bytes);
159
+ if (kept > 0) {
160
+ state.chunks.push(Buffer.from(chunk.subarray(0, kept)));
161
+ state.bytes += kept;
162
+ }
163
+ if (kept < chunk.length) {
164
+ state.truncated = true;
165
+ if (cause === undefined) {
166
+ failure = Object.assign(new RangeError(`${stream} maxBuffer length exceeded`), {
167
+ code: 'ERR_CHILD_PROCESS_STDIO_MAXBUFFER',
168
+ });
169
+ cancel('maxBuffer');
170
+ }
171
+ }
172
+ if (options.onOutput) {
173
+ const data = state.decoder.write(chunk);
174
+ if (data)
175
+ options.onOutput({ stream, data });
176
+ }
177
+ };
178
+ const onStdout = (chunk) => capture('stdout', chunk);
179
+ const onStderr = (chunk) => capture('stderr', chunk);
180
+ child.stdout?.on('data', onStdout);
181
+ child.stderr?.on('data', onStderr);
182
+ child.once('error', (error) => {
183
+ failure ??= error;
184
+ });
185
+ child.once('close', (code, signal) => {
186
+ closed = true;
187
+ disposeAbort?.();
188
+ clearTimeout(deadline);
189
+ if (escalation !== undefined) {
190
+ clearTimeout(escalation);
191
+ // Pipes closing can precede a descendant which closed its copies.
192
+ // Force the owned group now instead of retaining its PID in a timer.
193
+ killTree(child, 'SIGKILL');
194
+ }
195
+ child.stdout?.off('data', onStdout);
196
+ child.stderr?.off('data', onStderr);
197
+ for (const stream of ['stdout', 'stderr']) {
198
+ const data = captures[stream].decoder.end();
199
+ if (data)
200
+ options.onOutput?.({ stream, data });
201
+ }
202
+ const decodeCapture = (stream) => {
203
+ const state = captures[stream];
204
+ const bytes = Buffer.concat(state.chunks, state.bytes);
205
+ // Do not flush an incomplete UTF-8 character cut by our byte cap.
206
+ return state.truncated ? new StringDecoder('utf8').write(bytes) : bytes.toString('utf8');
207
+ };
208
+ const stdout = decodeCapture('stdout');
209
+ const stderr = decodeCapture('stderr');
210
+ if (!failure && cause === undefined && code === 0 && signal === null) {
211
+ resolve({ stdout, stderr });
212
+ return;
213
+ }
214
+ const error = failure ??
215
+ (cause === 'caller'
216
+ ? Object.assign(new Error('The operation was aborted', { cause: options.signal?.reason }), {
217
+ name: 'AbortError',
218
+ code: 'ABORT_ERR',
219
+ })
220
+ : new Error(`Command failed: ${command}\n${stderr}`));
221
+ reject(Object.assign(error, {
222
+ stdout,
223
+ stderr,
224
+ stdoutTruncated: captures.stdout.truncated,
225
+ stderrTruncated: captures.stderr.truncated,
226
+ code: failure?.code ?? (cause === 'caller' ? 'ABORT_ERR' : code),
227
+ killed: cause !== undefined,
228
+ signal,
229
+ timedOut: cause === 'timeout',
230
+ }));
231
+ });
232
+ const deadline = setTimeout(() => cancel('timeout'), options.timeout);
233
+ deadline.unref?.();
234
+ if (options.signal) {
235
+ disposeAbort = subscribeToAbort(options.signal, () => cancel('caller'));
236
+ if (options.signal.aborted)
237
+ cancel('caller');
238
+ }
239
+ });
72
240
  }
73
241
  function isDangerousCommand(command) {
74
242
  return DANGEROUS_PATTERNS.some((pattern) => pattern.test(command));
@@ -167,6 +335,7 @@ export const BashTool = defineTool({
167
335
  // sandbox can be added later as an explicit
168
336
  // `SandboxExecOptions.workspaceRelativeCwd` field; the bash
169
337
  // builtin doesn't have that requirement today.
338
+ const onOutput = shellProgress(context.report);
170
339
  if (context.sandbox) {
171
340
  const result = await context.sandbox.exec('/bin/sh', ['-c', input.command], {
172
341
  timeout: input.timeout,
@@ -181,21 +350,8 @@ export const BashTool = defineTool({
181
350
  // durable transcript — so this is a progress signal, not a
182
351
  // second copy of the output. `result.stdout` remains the
183
352
  // answer the model is given.
184
- onOutput: context.report
185
- ? ({ data }) => {
186
- const line = lastNonEmptyLine(data);
187
- if (line)
188
- context.report?.(line);
189
- }
190
- : undefined,
353
+ onOutput,
191
354
  });
192
- if (result.timedOut) {
193
- return {
194
- success: false,
195
- output: '',
196
- error: `Command timed out after ${input.timeout}ms`,
197
- };
198
- }
199
355
  // The sandbox reports when IT clipped a stream. Dropping those
200
356
  // flags meant the model saw a complete-looking result that had
201
357
  // silently lost its tail — and the kernel's own convention is
@@ -208,39 +364,30 @@ export const BashTool = defineTool({
208
364
  result.stdout ? `STDOUT:\n${result.stdout}` : '',
209
365
  result.stderr ? `STDERR:\n${result.stderr}` : '',
210
366
  clipped.length > 0
211
- ? `[${clipped.join(' and ')} was truncated by the sandbox output cap — re-run with a filter (grep/head/tail) to see the rest]`
367
+ ? `[${clipped.join(' and ')} was truncated by the sandbox output cap. The omitted output is unavailable in this result. Use a saved artifact or a read-only observation; do not repeat a state-changing action to recover its output.]`
212
368
  : '',
213
369
  ]
214
370
  .filter(Boolean)
215
371
  .join('\n\n');
216
372
  return {
217
- success: result.exitCode === 0,
373
+ success: !result.timedOut && result.exitCode === 0,
218
374
  output: output || '(no output)',
219
375
  data: {
220
376
  exitCode: result.exitCode,
221
377
  sandboxed: true,
378
+ timedOut: result.timedOut,
222
379
  stdoutTruncated: result.stdoutTruncated ?? false,
223
380
  stderrTruncated: result.stderrTruncated ?? false,
224
381
  },
225
- error: result.exitCode !== 0 ? `Command exited with code ${result.exitCode}` : undefined,
382
+ error: result.timedOut
383
+ ? `Command timed out after ${input.timeout}ms. Any captured output before the deadline is above.`
384
+ : result.exitCode !== 0
385
+ ? `Command exited with code ${result.exitCode}`
386
+ : undefined,
226
387
  };
227
388
  }
228
- // Thread the run/deadline signal into the child process. Without it
229
- // a Stop tore down the model stream and left the command running,
230
- // and the executor's deadline could only ever DETACH from the tool
231
- // rather than end the work it started.
232
- // `exec` REJECTS on a non-zero exit, on its own timeout, and on a
233
- // kill — and the rejection carries `stdout`, `stderr`, `code` and
234
- // `killed`. Letting it propagate threw all of that away: the registry
235
- // turned the throw into a structured failure, so the model was told a
236
- // command failed and not one word about how.
237
- //
238
- // That is the common case, not an edge one. A failing test run and a
239
- // failing build are the two things an agent runs bash for most, and
240
- // both exit non-zero WITH the output that explains why. The sandbox
241
- // branch above already reports all of it; this branch did not, so the
242
- // same command told the model two different amounts depending on where
243
- // it happened to run.
389
+ // The owned runner retains stdout/stderr on non-zero exit and timeout,
390
+ // so a failed command still returns the evidence explaining its failure.
244
391
  // The inherited half is scrubbed; `context.env` is not. Inheritance is
245
392
  // implicit — nobody decided this command should see `process.env` — while
246
393
  // a `context.env` key is one a host wrote on purpose. See
@@ -248,12 +395,13 @@ export const BashTool = defineTool({
248
395
  // the sandbox, and for what it therefore does not catch.
249
396
  const inherited = scrubInheritedEnv();
250
397
  try {
251
- const { stdout, stderr } = await execAsync(input.command, {
398
+ const { stdout, stderr } = await execHostShell(input.command, {
252
399
  cwd: context.workingDirectory,
253
400
  timeout: input.timeout,
254
401
  env: { ...inherited.env, ...context.env },
255
402
  maxBuffer: DEFAULT_BASH_MAX_BUFFER_BYTES,
256
403
  signal: context.abortSignal,
404
+ onOutput,
257
405
  });
258
406
  return {
259
407
  success: true,
@@ -266,17 +414,23 @@ export const BashTool = defineTool({
266
414
  // A caller-owned Stop is the caller's, not a command failure.
267
415
  if (context.abortSignal?.aborted)
268
416
  throw err;
269
- // `exec` reports its own timeout as a kill, and the distinction
270
- // matters to the model: "ran out of time" is a different next move
271
- // from "exited 1".
272
- const timedOut = failure.killed === true && failure.signal === 'SIGTERM';
417
+ // A maxBuffer stop or an ordinary signal is not a deadline. The
418
+ // runner latches the first cancellation cause before signalling.
419
+ const timedOut = failure.timedOut === true;
273
420
  const exitCode = typeof failure.code === 'number' ? failure.code : undefined;
421
+ const clipped = [
422
+ failure.stdoutTruncated ? 'stdout' : '',
423
+ failure.stderrTruncated ? 'stderr' : '',
424
+ ].filter(Boolean);
274
425
  // Only on the failure path. A successful command did not need to know,
275
426
  // and appending this to every result would make the common case noisy
276
427
  // to buy nothing. A failing one is exactly where "authentication
277
428
  // failed" has to be distinguishable from "the variable was withheld".
278
429
  const output = [
279
430
  formatShellOutput(failure.stdout, failure.stderr),
431
+ clipped.length > 0
432
+ ? `[${clipped.join(' and ')} ${clipped.length === 1 ? 'was' : 'were'} truncated by the host output cap. The omitted output is unavailable in this result.]`
433
+ : '',
280
434
  describeWithheldEnv(inherited.dropped),
281
435
  ]
282
436
  .filter(Boolean)
@@ -287,6 +441,8 @@ export const BashTool = defineTool({
287
441
  data: {
288
442
  ...(exitCode !== undefined ? { exitCode } : {}),
289
443
  timedOut,
444
+ stdoutTruncated: failure.stdoutTruncated ?? false,
445
+ stderrTruncated: failure.stderrTruncated ?? false,
290
446
  ...(failure.signal ? { signal: failure.signal } : {}),
291
447
  },
292
448
  error: timedOut