@namzu/sdk 38.2.1 → 40.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 (602) hide show
  1. package/CHANGELOG.md +851 -0
  2. package/dist/advisory/executor.d.ts +10 -1
  3. package/dist/advisory/executor.d.ts.map +1 -1
  4. package/dist/advisory/executor.js +5 -26
  5. package/dist/advisory/executor.js.map +1 -1
  6. package/dist/advisory/history.d.ts +9 -0
  7. package/dist/advisory/history.d.ts.map +1 -0
  8. package/dist/advisory/history.js +120 -0
  9. package/dist/advisory/history.js.map +1 -0
  10. package/dist/advisory/index.d.ts +1 -1
  11. package/dist/advisory/index.d.ts.map +1 -1
  12. package/dist/advisory/index.js.map +1 -1
  13. package/dist/agents/ReactiveAgent.d.ts.map +1 -1
  14. package/dist/agents/ReactiveAgent.js +3 -0
  15. package/dist/agents/ReactiveAgent.js.map +1 -1
  16. package/dist/agents/runAgent.d.ts +10 -0
  17. package/dist/agents/runAgent.d.ts.map +1 -1
  18. package/dist/agents/runAgent.js +3 -0
  19. package/dist/agents/runAgent.js.map +1 -1
  20. package/dist/compaction/manual.d.ts +6 -0
  21. package/dist/compaction/manual.d.ts.map +1 -1
  22. package/dist/compaction/manual.js +21 -2
  23. package/dist/compaction/manual.js.map +1 -1
  24. package/dist/compaction/summary.d.ts.map +1 -1
  25. package/dist/compaction/summary.js +4 -1
  26. package/dist/compaction/summary.js.map +1 -1
  27. package/dist/config/runtime.js +2 -2
  28. package/dist/config/runtime.js.map +1 -1
  29. package/dist/connector/mcp/adapter.d.ts.map +1 -1
  30. package/dist/connector/mcp/adapter.js +20 -6
  31. package/dist/connector/mcp/adapter.js.map +1 -1
  32. package/dist/contracts/schemas.js +1 -1
  33. package/dist/contracts/schemas.js.map +1 -1
  34. package/dist/eval/harness-protection.d.ts +18 -0
  35. package/dist/eval/harness-protection.d.ts.map +1 -0
  36. package/dist/eval/harness-protection.js +58 -0
  37. package/dist/eval/harness-protection.js.map +1 -0
  38. package/dist/eval/harness-verification.d.ts +6 -1
  39. package/dist/eval/harness-verification.d.ts.map +1 -1
  40. package/dist/eval/harness-verification.js +19 -2
  41. package/dist/eval/harness-verification.js.map +1 -1
  42. package/dist/eval/index.d.ts +1 -0
  43. package/dist/eval/index.d.ts.map +1 -1
  44. package/dist/eval/index.js.map +1 -1
  45. package/dist/manager/resident/activity.d.ts +50 -0
  46. package/dist/manager/resident/activity.d.ts.map +1 -0
  47. package/dist/manager/resident/activity.js +125 -0
  48. package/dist/manager/resident/activity.js.map +1 -0
  49. package/dist/manager/resident/agenda.d.ts +13 -1
  50. package/dist/manager/resident/agenda.d.ts.map +1 -1
  51. package/dist/manager/resident/agenda.js +40 -5
  52. package/dist/manager/resident/agenda.js.map +1 -1
  53. package/dist/manager/resident/consumption.d.ts +104 -0
  54. package/dist/manager/resident/consumption.d.ts.map +1 -0
  55. package/dist/manager/resident/consumption.js +233 -0
  56. package/dist/manager/resident/consumption.js.map +1 -0
  57. package/dist/manager/resident/evidence-recall.d.ts +24 -0
  58. package/dist/manager/resident/evidence-recall.d.ts.map +1 -0
  59. package/dist/manager/resident/evidence-recall.js +295 -0
  60. package/dist/manager/resident/evidence-recall.js.map +1 -0
  61. package/dist/manager/resident/history-disk.d.ts +10 -0
  62. package/dist/manager/resident/history-disk.d.ts.map +1 -0
  63. package/dist/manager/resident/history-disk.js +50 -0
  64. package/dist/manager/resident/history-disk.js.map +1 -0
  65. package/dist/manager/resident/history.d.ts +79 -0
  66. package/dist/manager/resident/history.d.ts.map +1 -0
  67. package/dist/manager/resident/history.js +203 -0
  68. package/dist/manager/resident/history.js.map +1 -0
  69. package/dist/manager/resident/initiative.d.ts.map +1 -1
  70. package/dist/manager/resident/initiative.js +11 -3
  71. package/dist/manager/resident/initiative.js.map +1 -1
  72. package/dist/manager/resident/learning-cycle.d.ts +131 -0
  73. package/dist/manager/resident/learning-cycle.d.ts.map +1 -0
  74. package/dist/manager/resident/learning-cycle.js +306 -0
  75. package/dist/manager/resident/learning-cycle.js.map +1 -0
  76. package/dist/manager/resident/learning-observation.d.ts +80 -0
  77. package/dist/manager/resident/learning-observation.d.ts.map +1 -0
  78. package/dist/manager/resident/learning-observation.js +22 -0
  79. package/dist/manager/resident/learning-observation.js.map +1 -0
  80. package/dist/manager/resident/learning-store.d.ts +106 -0
  81. package/dist/manager/resident/learning-store.d.ts.map +1 -0
  82. package/dist/manager/resident/learning-store.js +598 -0
  83. package/dist/manager/resident/learning-store.js.map +1 -0
  84. package/dist/manager/resident/learning.d.ts +246 -3
  85. package/dist/manager/resident/learning.d.ts.map +1 -1
  86. package/dist/manager/resident/learning.js +96 -6
  87. package/dist/manager/resident/learning.js.map +1 -1
  88. package/dist/manager/resident/outbox.d.ts +4 -4
  89. package/dist/manager/resident/store.d.ts +37 -4
  90. package/dist/manager/resident/store.d.ts.map +1 -1
  91. package/dist/manager/resident/store.js +27 -3
  92. package/dist/manager/resident/store.js.map +1 -1
  93. package/dist/manager/resident/tool-evidence.d.ts +71 -0
  94. package/dist/manager/resident/tool-evidence.d.ts.map +1 -0
  95. package/dist/manager/resident/tool-evidence.js +285 -0
  96. package/dist/manager/resident/tool-evidence.js.map +1 -0
  97. package/dist/manager/run/persistence.d.ts +8 -0
  98. package/dist/manager/run/persistence.d.ts.map +1 -1
  99. package/dist/manager/run/persistence.js +18 -0
  100. package/dist/manager/run/persistence.js.map +1 -1
  101. package/dist/plugin/loader.d.ts.map +1 -1
  102. package/dist/plugin/loader.js +5 -3
  103. package/dist/plugin/loader.js.map +1 -1
  104. package/dist/prompt/coding-agent-doctrine.d.ts +1 -1
  105. package/dist/prompt/coding-agent-doctrine.d.ts.map +1 -1
  106. package/dist/prompt/coding-agent-doctrine.js +2 -0
  107. package/dist/prompt/coding-agent-doctrine.js.map +1 -1
  108. package/dist/prompt/index.d.ts +2 -0
  109. package/dist/prompt/index.d.ts.map +1 -1
  110. package/dist/prompt/index.js +1 -0
  111. package/dist/prompt/index.js.map +1 -1
  112. package/dist/prompt/resident-learning.d.ts +19 -0
  113. package/dist/prompt/resident-learning.d.ts.map +1 -0
  114. package/dist/prompt/resident-learning.js +125 -0
  115. package/dist/prompt/resident-learning.js.map +1 -0
  116. package/dist/prompt/resident-step.d.ts +8 -1
  117. package/dist/prompt/resident-step.d.ts.map +1 -1
  118. package/dist/prompt/resident-step.js +65 -4
  119. package/dist/prompt/resident-step.js.map +1 -1
  120. package/dist/provider/collect-chat-completion.d.ts +2 -1
  121. package/dist/provider/collect-chat-completion.d.ts.map +1 -1
  122. package/dist/provider/collect-chat-completion.js +7 -6
  123. package/dist/provider/collect-chat-completion.js.map +1 -1
  124. package/dist/provider/fallback.d.ts.map +1 -1
  125. package/dist/provider/fallback.js +2 -1
  126. package/dist/provider/fallback.js.map +1 -1
  127. package/dist/provider/stream-text.d.ts +16 -0
  128. package/dist/provider/stream-text.d.ts.map +1 -0
  129. package/dist/provider/stream-text.js +51 -0
  130. package/dist/provider/stream-text.js.map +1 -0
  131. package/dist/public-runtime.d.ts +16 -4
  132. package/dist/public-runtime.d.ts.map +1 -1
  133. package/dist/public-runtime.js +17 -4
  134. package/dist/public-runtime.js.map +1 -1
  135. package/dist/public-tools.d.ts +13 -0
  136. package/dist/public-tools.d.ts.map +1 -1
  137. package/dist/public-tools.js +16 -0
  138. package/dist/public-tools.js.map +1 -1
  139. package/dist/public-types.d.ts +15 -3
  140. package/dist/public-types.d.ts.map +1 -1
  141. package/dist/registry/tool/execute.d.ts.map +1 -1
  142. package/dist/registry/tool/execute.js +2 -3
  143. package/dist/registry/tool/execute.js.map +1 -1
  144. package/dist/registry/tool/portable.d.ts +65 -0
  145. package/dist/registry/tool/portable.d.ts.map +1 -0
  146. package/dist/registry/tool/portable.js +244 -0
  147. package/dist/registry/tool/portable.js.map +1 -0
  148. package/dist/registry/tool/schema.d.ts +32 -5
  149. package/dist/registry/tool/schema.d.ts.map +1 -1
  150. package/dist/registry/tool/schema.js +35 -9
  151. package/dist/registry/tool/schema.js.map +1 -1
  152. package/dist/registry/toolset/catalog.js +8 -8
  153. package/dist/registry/toolset/catalog.js.map +1 -1
  154. package/dist/run/LimitChecker.js +3 -3
  155. package/dist/run/LimitChecker.js.map +1 -1
  156. package/dist/run/evidence-query.d.ts +41 -0
  157. package/dist/run/evidence-query.d.ts.map +1 -0
  158. package/dist/run/evidence-query.js +270 -0
  159. package/dist/run/evidence-query.js.map +1 -0
  160. package/dist/run/evidence-recall.d.ts +99 -0
  161. package/dist/run/evidence-recall.d.ts.map +1 -0
  162. package/dist/run/evidence-recall.js +633 -0
  163. package/dist/run/evidence-recall.js.map +1 -0
  164. package/dist/run/index.d.ts +2 -0
  165. package/dist/run/index.d.ts.map +1 -1
  166. package/dist/run/index.js +1 -0
  167. package/dist/run/index.js.map +1 -1
  168. package/dist/run/json-claim-verifier.d.ts +83 -0
  169. package/dist/run/json-claim-verifier.d.ts.map +1 -0
  170. package/dist/run/json-claim-verifier.js +200 -0
  171. package/dist/run/json-claim-verifier.js.map +1 -0
  172. package/dist/run/preparation-context-error.d.ts +10 -0
  173. package/dist/run/preparation-context-error.d.ts.map +1 -0
  174. package/dist/run/preparation-context-error.js +15 -0
  175. package/dist/run/preparation-context-error.js.map +1 -0
  176. package/dist/run-query/index.d.ts +3 -1
  177. package/dist/run-query/index.d.ts.map +1 -1
  178. package/dist/runtime/jobs/awaited-jobs.d.ts +215 -0
  179. package/dist/runtime/jobs/awaited-jobs.d.ts.map +1 -0
  180. package/dist/runtime/jobs/awaited-jobs.js +259 -0
  181. package/dist/runtime/jobs/awaited-jobs.js.map +1 -0
  182. package/dist/runtime/jobs/registry.d.ts +33 -2
  183. package/dist/runtime/jobs/registry.d.ts.map +1 -1
  184. package/dist/runtime/jobs/registry.js +37 -0
  185. package/dist/runtime/jobs/registry.js.map +1 -1
  186. package/dist/runtime/query/callback-inference.d.ts +8 -0
  187. package/dist/runtime/query/callback-inference.d.ts.map +1 -0
  188. package/dist/runtime/query/callback-inference.js +89 -0
  189. package/dist/runtime/query/callback-inference.js.map +1 -0
  190. package/dist/runtime/query/checkpoint.d.ts +4 -0
  191. package/dist/runtime/query/checkpoint.d.ts.map +1 -1
  192. package/dist/runtime/query/checkpoint.js +13 -0
  193. package/dist/runtime/query/checkpoint.js.map +1 -1
  194. package/dist/runtime/query/events.d.ts +1 -0
  195. package/dist/runtime/query/events.d.ts.map +1 -1
  196. package/dist/runtime/query/events.js +18 -0
  197. package/dist/runtime/query/events.js.map +1 -1
  198. package/dist/runtime/query/executor.d.ts +35 -1
  199. package/dist/runtime/query/executor.d.ts.map +1 -1
  200. package/dist/runtime/query/executor.js +77 -8
  201. package/dist/runtime/query/executor.js.map +1 -1
  202. package/dist/runtime/query/file-evidence-context.d.ts +5 -0
  203. package/dist/runtime/query/file-evidence-context.d.ts.map +1 -0
  204. package/dist/runtime/query/file-evidence-context.js +180 -0
  205. package/dist/runtime/query/file-evidence-context.js.map +1 -0
  206. package/dist/runtime/query/file-evidence-replay.d.ts +260 -0
  207. package/dist/runtime/query/file-evidence-replay.d.ts.map +1 -0
  208. package/dist/runtime/query/file-evidence-replay.js +647 -0
  209. package/dist/runtime/query/file-evidence-replay.js.map +1 -0
  210. package/dist/runtime/query/file-evidence-seed.d.ts +50 -0
  211. package/dist/runtime/query/file-evidence-seed.d.ts.map +1 -0
  212. package/dist/runtime/query/file-evidence-seed.js +100 -0
  213. package/dist/runtime/query/file-evidence-seed.js.map +1 -0
  214. package/dist/runtime/query/guard.d.ts.map +1 -1
  215. package/dist/runtime/query/guard.js +4 -0
  216. package/dist/runtime/query/guard.js.map +1 -1
  217. package/dist/runtime/query/index.d.ts +10 -1
  218. package/dist/runtime/query/index.d.ts.map +1 -1
  219. package/dist/runtime/query/index.js +133 -26
  220. package/dist/runtime/query/index.js.map +1 -1
  221. package/dist/runtime/query/iteration/index.d.ts +92 -36
  222. package/dist/runtime/query/iteration/index.d.ts.map +1 -1
  223. package/dist/runtime/query/iteration/index.js +420 -117
  224. package/dist/runtime/query/iteration/index.js.map +1 -1
  225. package/dist/runtime/query/iteration/phases/advisory.d.ts +2 -1
  226. package/dist/runtime/query/iteration/phases/advisory.d.ts.map +1 -1
  227. package/dist/runtime/query/iteration/phases/advisory.js +2 -1
  228. package/dist/runtime/query/iteration/phases/advisory.js.map +1 -1
  229. package/dist/runtime/query/iteration/phases/context.d.ts +12 -1
  230. package/dist/runtime/query/iteration/phases/context.d.ts.map +1 -1
  231. package/dist/runtime/query/iteration/phases/context.js.map +1 -1
  232. package/dist/runtime/query/iteration/phases/tool-review.d.ts.map +1 -1
  233. package/dist/runtime/query/iteration/phases/tool-review.js +8 -1
  234. package/dist/runtime/query/iteration/phases/tool-review.js.map +1 -1
  235. package/dist/runtime/query/iteration/provider-rejected-image.d.ts +2 -1
  236. package/dist/runtime/query/iteration/provider-rejected-image.d.ts.map +1 -1
  237. package/dist/runtime/query/iteration/provider-rejected-image.js +5 -2
  238. package/dist/runtime/query/iteration/provider-rejected-image.js.map +1 -1
  239. package/dist/runtime/query/iteration/stream-turn.d.ts +4 -1
  240. package/dist/runtime/query/iteration/stream-turn.d.ts.map +1 -1
  241. package/dist/runtime/query/iteration/stream-turn.js +22 -8
  242. package/dist/runtime/query/iteration/stream-turn.js.map +1 -1
  243. package/dist/runtime/query/plugin-hooks.d.ts +14 -0
  244. package/dist/runtime/query/plugin-hooks.d.ts.map +1 -1
  245. package/dist/runtime/query/plugin-hooks.js +18 -0
  246. package/dist/runtime/query/plugin-hooks.js.map +1 -1
  247. package/dist/runtime/query/repeat-call.d.ts +17 -4
  248. package/dist/runtime/query/repeat-call.d.ts.map +1 -1
  249. package/dist/runtime/query/repeat-call.js +26 -19
  250. package/dist/runtime/query/repeat-call.js.map +1 -1
  251. package/dist/runtime/query/resume-pending.d.ts +18 -33
  252. package/dist/runtime/query/resume-pending.d.ts.map +1 -1
  253. package/dist/runtime/query/resume-pending.js +59 -42
  254. package/dist/runtime/query/resume-pending.js.map +1 -1
  255. package/dist/runtime/query/review-policy.d.ts +4 -4
  256. package/dist/runtime/query/review-policy.d.ts.map +1 -1
  257. package/dist/runtime/query/review-policy.js +10 -9
  258. package/dist/runtime/query/review-policy.js.map +1 -1
  259. package/dist/runtime/query/sandbox-lifecycle.d.ts.map +1 -1
  260. package/dist/runtime/query/sandbox-lifecycle.js +4 -0
  261. package/dist/runtime/query/sandbox-lifecycle.js.map +1 -1
  262. package/dist/runtime/query/steering.d.ts +11 -1
  263. package/dist/runtime/query/steering.d.ts.map +1 -1
  264. package/dist/runtime/query/steering.js +12 -1
  265. package/dist/runtime/query/steering.js.map +1 -1
  266. package/dist/runtime/query/tool-output-budget.d.ts +10 -6
  267. package/dist/runtime/query/tool-output-budget.d.ts.map +1 -1
  268. package/dist/runtime/query/tool-output-budget.js +54 -12
  269. package/dist/runtime/query/tool-output-budget.js.map +1 -1
  270. package/dist/runtime/query/tooling.d.ts +5 -1
  271. package/dist/runtime/query/tooling.d.ts.map +1 -1
  272. package/dist/runtime/query/tooling.js +5 -0
  273. package/dist/runtime/query/tooling.js.map +1 -1
  274. package/dist/scheduler/completion-inbox.d.ts +49 -0
  275. package/dist/scheduler/completion-inbox.d.ts.map +1 -1
  276. package/dist/scheduler/completion-inbox.js +122 -2
  277. package/dist/scheduler/completion-inbox.js.map +1 -1
  278. package/dist/store/evidence/compaction-archive.d.ts +109 -0
  279. package/dist/store/evidence/compaction-archive.d.ts.map +1 -0
  280. package/dist/store/evidence/compaction-archive.js +125 -0
  281. package/dist/store/evidence/compaction-archive.js.map +1 -0
  282. package/dist/store/evidence/compaction-provenance.d.ts +7 -0
  283. package/dist/store/evidence/compaction-provenance.d.ts.map +1 -0
  284. package/dist/store/evidence/compaction-provenance.js +49 -0
  285. package/dist/store/evidence/compaction-provenance.js.map +1 -0
  286. package/dist/store/evidence/compaction-text.d.ts +16 -0
  287. package/dist/store/evidence/compaction-text.d.ts.map +1 -0
  288. package/dist/store/evidence/compaction-text.js +51 -0
  289. package/dist/store/evidence/compaction-text.js.map +1 -0
  290. package/dist/store/evidence/disk.d.ts +11 -0
  291. package/dist/store/evidence/disk.d.ts.map +1 -0
  292. package/dist/store/evidence/disk.js +367 -0
  293. package/dist/store/evidence/disk.js.map +1 -0
  294. package/dist/store/evidence/format.d.ts +25 -0
  295. package/dist/store/evidence/format.d.ts.map +1 -0
  296. package/dist/store/evidence/format.js +115 -0
  297. package/dist/store/evidence/format.js.map +1 -0
  298. package/dist/store/evidence/index-page.d.ts +208 -0
  299. package/dist/store/evidence/index-page.d.ts.map +1 -0
  300. package/dist/store/evidence/index-page.js +262 -0
  301. package/dist/store/evidence/index-page.js.map +1 -0
  302. package/dist/store/evidence/io.d.ts +24 -0
  303. package/dist/store/evidence/io.d.ts.map +1 -0
  304. package/dist/store/evidence/io.js +69 -0
  305. package/dist/store/evidence/io.js.map +1 -0
  306. package/dist/store/evidence/linked.d.ts +9 -0
  307. package/dist/store/evidence/linked.d.ts.map +1 -0
  308. package/dist/store/evidence/linked.js +314 -0
  309. package/dist/store/evidence/linked.js.map +1 -0
  310. package/dist/store/evidence/passages.d.ts +15 -0
  311. package/dist/store/evidence/passages.d.ts.map +1 -0
  312. package/dist/store/evidence/passages.js +72 -0
  313. package/dist/store/evidence/passages.js.map +1 -0
  314. package/dist/store/evidence/record-chain.d.ts +42 -0
  315. package/dist/store/evidence/record-chain.d.ts.map +1 -0
  316. package/dist/store/evidence/record-chain.js +111 -0
  317. package/dist/store/evidence/record-chain.js.map +1 -0
  318. package/dist/store/evidence/search-input.d.ts +21 -0
  319. package/dist/store/evidence/search-input.d.ts.map +1 -0
  320. package/dist/store/evidence/search-input.js +44 -0
  321. package/dist/store/evidence/search-input.js.map +1 -0
  322. package/dist/store/evidence/selection.d.ts +9 -0
  323. package/dist/store/evidence/selection.d.ts.map +1 -0
  324. package/dist/store/evidence/selection.js +17 -0
  325. package/dist/store/evidence/selection.js.map +1 -0
  326. package/dist/store/evidence/source-kind.d.ts +11 -0
  327. package/dist/store/evidence/source-kind.d.ts.map +1 -0
  328. package/dist/store/evidence/source-kind.js +26 -0
  329. package/dist/store/evidence/source-kind.js.map +1 -0
  330. package/dist/store/evidence/source-text.d.ts +51 -0
  331. package/dist/store/evidence/source-text.d.ts.map +1 -0
  332. package/dist/store/evidence/source-text.js +213 -0
  333. package/dist/store/evidence/source-text.js.map +1 -0
  334. package/dist/store/evidence/types.d.ts +162 -0
  335. package/dist/store/evidence/types.d.ts.map +1 -0
  336. package/dist/store/evidence/types.js +2 -0
  337. package/dist/store/evidence/types.js.map +1 -0
  338. package/dist/store/memory/disk.d.ts +2 -0
  339. package/dist/store/memory/disk.d.ts.map +1 -1
  340. package/dist/store/memory/disk.js +2 -1
  341. package/dist/store/memory/disk.js.map +1 -1
  342. package/dist/store/run/disk.d.ts +10 -0
  343. package/dist/store/run/disk.d.ts.map +1 -1
  344. package/dist/store/run/disk.js +87 -7
  345. package/dist/store/run/disk.js.map +1 -1
  346. package/dist/store/run/memory.d.ts +1 -0
  347. package/dist/store/run/memory.d.ts.map +1 -1
  348. package/dist/store/run/memory.js +10 -0
  349. package/dist/store/run/memory.js.map +1 -1
  350. package/dist/store/run/tool-executions.d.ts +13 -0
  351. package/dist/store/run/tool-executions.d.ts.map +1 -0
  352. package/dist/store/run/tool-executions.js +99 -0
  353. package/dist/store/run/tool-executions.js.map +1 -0
  354. package/dist/store/session/index.d.ts +2 -0
  355. package/dist/store/session/index.d.ts.map +1 -1
  356. package/dist/store/session/index.js +1 -0
  357. package/dist/store/session/index.js.map +1 -1
  358. package/dist/store/session/sqlite.d.ts +57 -0
  359. package/dist/store/session/sqlite.d.ts.map +1 -0
  360. package/dist/store/session/sqlite.js +430 -0
  361. package/dist/store/session/sqlite.js.map +1 -0
  362. package/dist/tools/builtins/bash.d.ts.map +1 -1
  363. package/dist/tools/builtins/bash.js +4 -10
  364. package/dist/tools/builtins/bash.js.map +1 -1
  365. package/dist/tools/builtins/edit-apply.d.ts +126 -0
  366. package/dist/tools/builtins/edit-apply.d.ts.map +1 -0
  367. package/dist/tools/builtins/edit-apply.js +360 -0
  368. package/dist/tools/builtins/edit-apply.js.map +1 -0
  369. package/dist/tools/builtins/edit.d.ts +143 -1
  370. package/dist/tools/builtins/edit.d.ts.map +1 -1
  371. package/dist/tools/builtins/edit.js +37 -219
  372. package/dist/tools/builtins/edit.js.map +1 -1
  373. package/dist/tools/builtins/index.d.ts +1 -0
  374. package/dist/tools/builtins/index.d.ts.map +1 -1
  375. package/dist/tools/builtins/index.js +9 -3
  376. package/dist/tools/builtins/index.js.map +1 -1
  377. package/dist/tools/builtins/job.d.ts.map +1 -1
  378. package/dist/tools/builtins/job.js +5 -6
  379. package/dist/tools/builtins/job.js.map +1 -1
  380. package/dist/tools/builtins/read-file.d.ts +2 -2
  381. package/dist/tools/builtins/read-file.d.ts.map +1 -1
  382. package/dist/tools/builtins/read-file.js +50 -65
  383. package/dist/tools/builtins/read-file.js.map +1 -1
  384. package/dist/tools/builtins/read-render.d.ts +56 -0
  385. package/dist/tools/builtins/read-render.d.ts.map +1 -0
  386. package/dist/tools/builtins/read-render.js +73 -0
  387. package/dist/tools/builtins/read-render.js.map +1 -0
  388. package/dist/tools/builtins/wait-for-job-bounds.d.ts +67 -0
  389. package/dist/tools/builtins/wait-for-job-bounds.d.ts.map +1 -0
  390. package/dist/tools/builtins/wait-for-job-bounds.js +108 -0
  391. package/dist/tools/builtins/wait-for-job-bounds.js.map +1 -0
  392. package/dist/tools/builtins/wait-for-job.d.ts +6 -0
  393. package/dist/tools/builtins/wait-for-job.d.ts.map +1 -0
  394. package/dist/tools/builtins/wait-for-job.js +162 -0
  395. package/dist/tools/builtins/wait-for-job.js.map +1 -0
  396. package/dist/tools/builtins/write-file.js +7 -2
  397. package/dist/tools/builtins/write-file.js.map +1 -1
  398. package/dist/tools/coordinator/index.d.ts.map +1 -1
  399. package/dist/tools/coordinator/index.js +1 -7
  400. package/dist/tools/coordinator/index.js.map +1 -1
  401. package/dist/tools/defineTool.d.ts +2 -1
  402. package/dist/tools/defineTool.d.ts.map +1 -1
  403. package/dist/tools/defineTool.js +1 -1
  404. package/dist/tools/defineTool.js.map +1 -1
  405. package/dist/tools/file-read-tracker.d.ts.map +1 -1
  406. package/dist/tools/file-read-tracker.js +90 -3
  407. package/dist/tools/file-read-tracker.js.map +1 -1
  408. package/dist/tools/resident-history.d.ts +10 -0
  409. package/dist/tools/resident-history.d.ts.map +1 -0
  410. package/dist/tools/resident-history.js +80 -0
  411. package/dist/tools/resident-history.js.map +1 -0
  412. package/dist/tools/resident-tool-evidence.d.ts +5 -0
  413. package/dist/tools/resident-tool-evidence.d.ts.map +1 -0
  414. package/dist/tools/resident-tool-evidence.js +57 -0
  415. package/dist/tools/resident-tool-evidence.js.map +1 -0
  416. package/dist/types/advisory/config.d.ts +7 -0
  417. package/dist/types/advisory/config.d.ts.map +1 -1
  418. package/dist/types/agent/reactive.d.ts +1 -0
  419. package/dist/types/agent/reactive.d.ts.map +1 -1
  420. package/dist/types/authorization/index.d.ts +9 -9
  421. package/dist/types/authorization/index.d.ts.map +1 -1
  422. package/dist/types/authorization/index.js +1 -1
  423. package/dist/types/authorization/index.js.map +1 -1
  424. package/dist/types/hitl/index.d.ts +4 -0
  425. package/dist/types/hitl/index.d.ts.map +1 -1
  426. package/dist/types/hitl/index.js.map +1 -1
  427. package/dist/types/message/index.d.ts +16 -2
  428. package/dist/types/message/index.d.ts.map +1 -1
  429. package/dist/types/message/index.js +10 -1
  430. package/dist/types/message/index.js.map +1 -1
  431. package/dist/types/provider/chat.d.ts +2 -0
  432. package/dist/types/provider/chat.d.ts.map +1 -1
  433. package/dist/types/provider/stream.d.ts +4 -0
  434. package/dist/types/provider/stream.d.ts.map +1 -1
  435. package/dist/types/run/answer-review.d.ts +34 -3
  436. package/dist/types/run/answer-review.d.ts.map +1 -1
  437. package/dist/types/run/config.d.ts +3 -0
  438. package/dist/types/run/config.d.ts.map +1 -1
  439. package/dist/types/run/entity.d.ts +20 -0
  440. package/dist/types/run/entity.d.ts.map +1 -1
  441. package/dist/types/run/events.d.ts +31 -8
  442. package/dist/types/run/events.d.ts.map +1 -1
  443. package/dist/types/run/events.js.map +1 -1
  444. package/dist/types/run/prepare-step.d.ts +53 -8
  445. package/dist/types/run/prepare-step.d.ts.map +1 -1
  446. package/dist/types/run/store.d.ts +29 -4
  447. package/dist/types/run/store.d.ts.map +1 -1
  448. package/dist/types/run/store.js +0 -28
  449. package/dist/types/run/store.js.map +1 -1
  450. package/dist/types/sandbox/index.d.ts +15 -14
  451. package/dist/types/sandbox/index.d.ts.map +1 -1
  452. package/dist/types/sandbox/index.js.map +1 -1
  453. package/dist/types/tool/index.d.ts +124 -1
  454. package/dist/types/tool/index.d.ts.map +1 -1
  455. package/dist/types/tool/index.js.map +1 -1
  456. package/dist/utils/await-with-abort.d.ts +8 -0
  457. package/dist/utils/await-with-abort.d.ts.map +1 -0
  458. package/dist/utils/await-with-abort.js +28 -0
  459. package/dist/utils/await-with-abort.js.map +1 -0
  460. package/dist/utils/env.d.ts +19 -0
  461. package/dist/utils/env.d.ts.map +1 -0
  462. package/dist/utils/env.js +25 -0
  463. package/dist/utils/env.js.map +1 -0
  464. package/dist/utils/evidence-time.d.ts +3 -0
  465. package/dist/utils/evidence-time.d.ts.map +1 -0
  466. package/dist/utils/evidence-time.js +10 -0
  467. package/dist/utils/evidence-time.js.map +1 -0
  468. package/dist/utils/evidence-tokens.d.ts +13 -0
  469. package/dist/utils/evidence-tokens.d.ts.map +1 -0
  470. package/dist/utils/evidence-tokens.js +29 -0
  471. package/dist/utils/evidence-tokens.js.map +1 -0
  472. package/package.json +1 -1
  473. package/src/advisory/executor.ts +15 -30
  474. package/src/advisory/history.ts +126 -0
  475. package/src/advisory/index.ts +5 -1
  476. package/src/agents/ReactiveAgent.ts +3 -0
  477. package/src/agents/runAgent.ts +14 -1
  478. package/src/compaction/manual.ts +30 -2
  479. package/src/compaction/summary.ts +4 -1
  480. package/src/config/runtime.ts +2 -2
  481. package/src/connector/mcp/adapter.ts +20 -6
  482. package/src/contracts/schemas.ts +1 -1
  483. package/src/eval/harness-protection.ts +79 -0
  484. package/src/eval/harness-verification.ts +31 -1
  485. package/src/eval/index.ts +1 -0
  486. package/src/manager/resident/activity.ts +187 -0
  487. package/src/manager/resident/agenda.ts +59 -5
  488. package/src/manager/resident/consumption.ts +311 -0
  489. package/src/manager/resident/evidence-recall.ts +363 -0
  490. package/src/manager/resident/history-disk.ts +63 -0
  491. package/src/manager/resident/history.ts +312 -0
  492. package/src/manager/resident/initiative.ts +13 -3
  493. package/src/manager/resident/learning-cycle.ts +499 -0
  494. package/src/manager/resident/learning-observation.ts +39 -0
  495. package/src/manager/resident/learning-store.ts +813 -0
  496. package/src/manager/resident/learning.ts +132 -8
  497. package/src/manager/resident/store.ts +31 -3
  498. package/src/manager/resident/tool-evidence.ts +412 -0
  499. package/src/manager/run/persistence.ts +18 -0
  500. package/src/plugin/loader.ts +8 -3
  501. package/src/prompt/coding-agent-doctrine.ts +2 -0
  502. package/src/prompt/index.ts +2 -0
  503. package/src/prompt/resident-learning.ts +143 -0
  504. package/src/prompt/resident-step.ts +83 -3
  505. package/src/provider/collect-chat-completion.ts +7 -6
  506. package/src/provider/fallback.ts +2 -1
  507. package/src/provider/stream-text.ts +56 -0
  508. package/src/public-runtime.ts +39 -1
  509. package/src/public-tools.ts +21 -0
  510. package/src/public-types.ts +98 -0
  511. package/src/registry/tool/execute.ts +2 -4
  512. package/src/registry/tool/portable.ts +264 -0
  513. package/src/registry/tool/schema.ts +38 -8
  514. package/src/registry/toolset/catalog.ts +8 -9
  515. package/src/run/LimitChecker.ts +3 -3
  516. package/src/run/evidence-query.ts +333 -0
  517. package/src/run/evidence-recall.ts +854 -0
  518. package/src/run/index.ts +11 -0
  519. package/src/run/json-claim-verifier.ts +298 -0
  520. package/src/run/preparation-context-error.ts +16 -0
  521. package/src/run-query/index.ts +1 -1
  522. package/src/runtime/jobs/awaited-jobs.ts +271 -0
  523. package/src/runtime/jobs/registry.ts +50 -0
  524. package/src/runtime/query/callback-inference.ts +94 -0
  525. package/src/runtime/query/checkpoint.ts +14 -0
  526. package/src/runtime/query/events.ts +22 -0
  527. package/src/runtime/query/executor.ts +100 -10
  528. package/src/runtime/query/file-evidence-context.ts +209 -0
  529. package/src/runtime/query/file-evidence-replay.ts +776 -0
  530. package/src/runtime/query/file-evidence-seed.ts +126 -0
  531. package/src/runtime/query/guard.ts +2 -0
  532. package/src/runtime/query/index.ts +153 -27
  533. package/src/runtime/query/iteration/index.ts +467 -110
  534. package/src/runtime/query/iteration/phases/advisory.ts +3 -0
  535. package/src/runtime/query/iteration/phases/context.ts +12 -0
  536. package/src/runtime/query/iteration/phases/tool-review.ts +7 -0
  537. package/src/runtime/query/iteration/provider-rejected-image.ts +6 -1
  538. package/src/runtime/query/iteration/stream-turn.ts +35 -8
  539. package/src/runtime/query/plugin-hooks.ts +20 -0
  540. package/src/runtime/query/repeat-call.ts +28 -18
  541. package/src/runtime/query/resume-pending.ts +65 -40
  542. package/src/runtime/query/review-policy.ts +13 -9
  543. package/src/runtime/query/sandbox-lifecycle.ts +3 -0
  544. package/src/runtime/query/steering.ts +11 -0
  545. package/src/runtime/query/tool-output-budget.ts +65 -13
  546. package/src/runtime/query/tooling.ts +10 -1
  547. package/src/scheduler/completion-inbox.ts +124 -2
  548. package/src/store/evidence/compaction-archive.ts +139 -0
  549. package/src/store/evidence/compaction-provenance.ts +52 -0
  550. package/src/store/evidence/compaction-text.ts +61 -0
  551. package/src/store/evidence/disk.ts +461 -0
  552. package/src/store/evidence/format.ts +126 -0
  553. package/src/store/evidence/index-page.ts +292 -0
  554. package/src/store/evidence/io.ts +95 -0
  555. package/src/store/evidence/linked.ts +365 -0
  556. package/src/store/evidence/passages.ts +88 -0
  557. package/src/store/evidence/record-chain.ts +108 -0
  558. package/src/store/evidence/search-input.ts +62 -0
  559. package/src/store/evidence/selection.ts +25 -0
  560. package/src/store/evidence/source-kind.ts +36 -0
  561. package/src/store/evidence/source-text.ts +285 -0
  562. package/src/store/evidence/types.ts +177 -0
  563. package/src/store/memory/disk.ts +4 -1
  564. package/src/store/run/disk.ts +110 -8
  565. package/src/store/run/memory.ts +10 -0
  566. package/src/store/run/tool-executions.ts +112 -0
  567. package/src/store/session/index.ts +2 -0
  568. package/src/store/session/sqlite.ts +584 -0
  569. package/src/tools/builtins/bash.ts +4 -10
  570. package/src/tools/builtins/edit-apply.ts +456 -0
  571. package/src/tools/builtins/edit.ts +39 -270
  572. package/src/tools/builtins/index.ts +9 -3
  573. package/src/tools/builtins/job.ts +5 -6
  574. package/src/tools/builtins/read-file.ts +56 -77
  575. package/src/tools/builtins/read-render.ts +104 -0
  576. package/src/tools/builtins/wait-for-job-bounds.ts +179 -0
  577. package/src/tools/builtins/wait-for-job.ts +184 -0
  578. package/src/tools/builtins/write-file.ts +7 -2
  579. package/src/tools/coordinator/index.ts +1 -7
  580. package/src/tools/defineTool.ts +4 -2
  581. package/src/tools/file-read-tracker.ts +86 -2
  582. package/src/tools/resident-history.ts +86 -0
  583. package/src/tools/resident-tool-evidence.ts +68 -0
  584. package/src/types/advisory/config.ts +7 -0
  585. package/src/types/agent/reactive.ts +1 -0
  586. package/src/types/authorization/index.ts +2 -2
  587. package/src/types/hitl/index.ts +4 -0
  588. package/src/types/message/index.ts +22 -0
  589. package/src/types/provider/chat.ts +2 -0
  590. package/src/types/provider/stream.ts +4 -0
  591. package/src/types/run/answer-review.ts +34 -3
  592. package/src/types/run/config.ts +3 -0
  593. package/src/types/run/entity.ts +21 -0
  594. package/src/types/run/events.ts +31 -8
  595. package/src/types/run/prepare-step.ts +59 -8
  596. package/src/types/run/store.ts +35 -4
  597. package/src/types/sandbox/index.ts +15 -14
  598. package/src/types/tool/index.ts +123 -1
  599. package/src/utils/await-with-abort.ts +26 -0
  600. package/src/utils/env.ts +23 -0
  601. package/src/utils/evidence-time.ts +9 -0
  602. package/src/utils/evidence-tokens.ts +32 -0
@@ -0,0 +1,126 @@
1
+ import { resolveWithinAnyReal, toolRoots } from '../../tools/paths.js'
2
+ import type { Message } from '../../types/message/index.js'
3
+ import type { FileReadTracker } from '../../types/tool/index.js'
4
+ import {
5
+ type FileKeyResolver,
6
+ type LedgerReplayReport,
7
+ type PathAttributions,
8
+ collectObservedPaths,
9
+ createPathAttributions,
10
+ replayObservationLedger,
11
+ } from './file-evidence-replay.js'
12
+
13
+ /**
14
+ * Seeding an observation ledger from history, in the key space the tools use.
15
+ *
16
+ * The replay itself is pure and stays that way. What lives here is the one
17
+ * thing it cannot do for itself: work out which ledger key each path in the
18
+ * history belongs to. On a host that is not `resolve(cwd, path)` — `write`,
19
+ * `edit` and `read` all key on `resolveWithinAnyReal`, which canonicalizes
20
+ * every symlink on the way, because a ledger entry has to identify a FILE and
21
+ * two spellings of one file must not become two entries.
22
+ *
23
+ * Seeding lexically instead is worse than useless. The projection looks up
24
+ * lexically too, so it would match a fingerprint the seed had just written into
25
+ * a key space nothing else touches — while every drift refusal, made by a tool,
26
+ * lands on the canonical key and never withdraws it. The runtime would go on
27
+ * telling the model a body it can no longer vouch for, with no mechanism left
28
+ * to take it back. So the resolution happens here, with the tools' own
29
+ * function, and a path that will not resolve gets no key at all.
30
+ */
31
+ const NOTHING: LedgerReplayReport = { pathsWitnessed: 0, pathsSeen: 0, unitsReplayed: 0 }
32
+
33
+ /**
34
+ * Distinct paths one seeding will canonicalize before it replays anything.
35
+ *
36
+ * A ceiling rather than a budget because the work is uniform: each path is a
37
+ * handful of `realpath` calls, once per conversation. Counted on distinct
38
+ * SPELLINGS, the ones only `read` names included — a read has to be keyed too
39
+ * or it cannot contradict a claim — so two spellings of one file count twice.
40
+ * A history naming more paths than this is not a conversation whose ledger is
41
+ * worth guessing at, and it seeds nothing rather than resolving a prefix and
42
+ * abandoning the rest — a partially keyed walk is a walk that cannot say what
43
+ * a mutation replaced. That is a total loss for the conversation, not a partial
44
+ * one: it starts from the empty ledger a resume has always started from, and
45
+ * its first mutation of each path re-establishes it.
46
+ */
47
+ export const MAX_RESOLVED_PATHS = 1024
48
+
49
+ /** What a caller needs to key a path the way its tools will. */
50
+ export interface ObservationSeedContext {
51
+ readonly workingDirectory: string
52
+ /** See `ToolContext.additionalDirectories`; part of the tools' resolution. */
53
+ readonly additionalDirectories?: readonly string[]
54
+ /** True when this run's tools address a sandbox, whose keys are paths as written. */
55
+ readonly sandboxed?: boolean
56
+ }
57
+
58
+ /**
59
+ * Rebuild `tracker` from a conversation's own `messages`.
60
+ *
61
+ * For a host that keeps one tracker per conversation and has just restored one:
62
+ * the ledger is process memory, so a resumed conversation starts with nothing
63
+ * in it and re-reads files whose whole body is already in the transcript. Call
64
+ * it once, before the conversation's first request. Reading files is confined
65
+ * to canonicalizing the paths in the history; no file's CONTENT is read, and
66
+ * every body restored is one the visible calls reconstruct exactly.
67
+ *
68
+ * Content-backed observations, and only those. A path the walk cannot rebuild
69
+ * is left out of the ledger rather than entered without a fingerprint, so
70
+ * `write`'s read-before-overwrite refusal stands over it exactly as it does
71
+ * against the empty ledger a resume gets today. Three things seed nothing at
72
+ * all, and the report says so: a history naming more than
73
+ * {@link MAX_RESOLVED_PATHS} distinct path spellings, one whose ids are
74
+ * ambiguous, and one holding a mutation no path can be recovered from —
75
+ * whatever the transcript says came back to that mutation, since a key is what
76
+ * withdrawing one path rather than the whole pass takes. A call whose arguments
77
+ * are too long to read as JSON at all is one of that last kind; the replay
78
+ * states the ceiling.
79
+ */
80
+ export async function seedObservationLedger(
81
+ messages: readonly Message[],
82
+ tracker: FileReadTracker,
83
+ context: ObservationSeedContext,
84
+ ): Promise<LedgerReplayReport> {
85
+ // One attribution cache across both halves. The path collection and the
86
+ // walk ask the same question of the same calls — which file did this touch
87
+ // — and answering it means reading a string that, for a `write`, is a whole
88
+ // file body. Asking once per seeding rather than once per half is why the
89
+ // replay's own ceiling on that read can be as generous as it is.
90
+ const attributions = createPathAttributions()
91
+ const keyOf = await resolveObservedFileKeys(messages, context, attributions)
92
+ return keyOf ? replayObservationLedger(messages, tracker, keyOf, attributions) : NOTHING
93
+ }
94
+
95
+ /**
96
+ * The tools' key for every path this history names, or `undefined` when the
97
+ * pass should not run at all.
98
+ *
99
+ * `undefined` for a history with nothing to reconstruct and for one past the
100
+ * ceiling. A path the resolver refuses — it escapes the roots this run may
101
+ * reach, or the working directory itself is gone — is simply left unkeyed;
102
+ * the replay then treats the mutation that named it as unattributable, which
103
+ * is the fail-closed answer and the same one it gives a call it cannot parse.
104
+ */
105
+ async function resolveObservedFileKeys(
106
+ messages: readonly Message[],
107
+ context: ObservationSeedContext,
108
+ attributions: PathAttributions,
109
+ ): Promise<FileKeyResolver | undefined> {
110
+ const paths = collectObservedPaths(messages, attributions)
111
+ if (paths.length === 0 || paths.length > MAX_RESOLVED_PATHS) return undefined
112
+ // A sandbox has its own root and its own resolver, and the tools key on the
113
+ // path as written there. Canonicalizing it against the host filesystem would
114
+ // ask about the wrong machine.
115
+ if (context.sandboxed) return (path: string) => path
116
+ const roots = toolRoots(context)
117
+ const keys = new Map<string, string>()
118
+ for (const path of paths) {
119
+ try {
120
+ keys.set(path, await resolveWithinAnyReal(roots, path))
121
+ } catch {
122
+ // Left unkeyed on purpose; see above.
123
+ }
124
+ }
125
+ return (path: string) => keys.get(path)
126
+ }
@@ -83,6 +83,7 @@ export class GuardCoordinator {
83
83
  * on the RUN rather than on the process now hosting it.
84
84
  */
85
85
  remainingBeforeFinalizeMs(): number {
86
+ if (this.limitConfig.timeoutMs === 0) return Number.POSITIVE_INFINITY
86
87
  const finalizeAt = this.limitConfig.timeoutMs * this.limitConfig.budgetWarningThreshold
87
88
  return Math.max(0, finalizeAt - (Date.now() - this.startTime))
88
89
  }
@@ -96,6 +97,7 @@ export class GuardCoordinator {
96
97
  * deadline around such work instead of inventing a second clock.
97
98
  */
98
99
  remainingUntilTimeoutMs(): number {
100
+ if (this.limitConfig.timeoutMs === 0) return Number.POSITIVE_INFINITY
99
101
  return Math.max(0, this.limitConfig.timeoutMs - (Date.now() - this.startTime))
100
102
  }
101
103
 
@@ -112,6 +112,7 @@ import { toErrorMessage } from '../../utils/error.js'
112
112
  import { generateCheckpointId, generateRunId } from '../../utils/id.js'
113
113
  import { errorAttributes } from '../../utils/log/exception.js'
114
114
  import type { Logger } from '../../utils/logger.js'
115
+ import { AwaitedJobs } from '../jobs/awaited-jobs.js'
115
116
  import type { BackgroundJobRegistry } from '../jobs/registry.js'
116
117
  import { AUTO_APPROVE_POLICY_NAME, createRunApprovalPolicy } from './approval-policy.js'
117
118
  import { CheckpointManager } from './checkpoint.js'
@@ -139,10 +140,10 @@ import { ResultAssembler } from './result.js'
139
140
  import {
140
141
  type PendingResumePlan,
141
142
  applyPendingResume,
143
+ interruptedToolCalls,
142
144
  planCrashResume,
143
145
  planPendingResume,
144
146
  recoverCompletedCalls,
145
- unansweredToolCalls,
146
147
  } from './resume-pending.js'
147
148
  import {
148
149
  acquireSandbox,
@@ -362,6 +363,14 @@ export interface QueryParams {
362
363
  * agent decides the rest is worth re-reading. Set `0` to disable.
363
364
  */
364
365
  maxToolOutputChars?: number
366
+ /**
367
+ * Smaller preview for text that exceeded maxToolOutputChars, after its full
368
+ * host output and integrity manifest have been saved. Unset/0 keeps the old
369
+ * preview size. Does not change the spill threshold, rich blocks or ordinary
370
+ * results. A failed spill/manifest or a cap too small for its recovery path
371
+ * retains the ordinary output budget. Re-supply on resume.
372
+ */
373
+ retainedToolPreviewChars?: number
365
374
 
366
375
  /**
367
376
  * Cap on the RICH channel of a single tool result, in base64 characters.
@@ -411,6 +420,7 @@ export interface QueryParams {
411
420
  *
412
421
  * Bounded by {@link maxAnswerReviews}. Never called on the forced-final
413
422
  * turn, which exists to extract a closing summary under pressure.
423
+ * Exceptions or malformed verdicts fail the run; cancellation stops waiting.
414
424
  */
415
425
  reviewAnswer?: ReviewAnswer
416
426
 
@@ -422,7 +432,7 @@ export interface QueryParams {
422
432
  */
423
433
  promoteMemory?: PromoteMemory
424
434
 
425
- /** Rejections allowed before the run stops. Default 3. */
435
+ /** Corrections allowed before the run stops. Nonnegative safe integer; default 3. Consumed rejections survive checkpoints. */
426
436
  maxAnswerReviews?: number
427
437
 
428
438
  /** Called with each completed step, as it completes. */
@@ -931,11 +941,10 @@ async function resolveProviderContextWindow(
931
941
  onAbort = () => resolve(interrupted)
932
942
  resolverSignal.addEventListener('abort', onAbort, { once: true })
933
943
  })
934
- // Wire and directory config validation already limit this field to one
935
- // hour. The clamp also keeps a direct QueryParams caller from triggering
936
- // Node's >2^31-1 one-millisecond timer coercion and turning a huge run
937
- // budget into an immediate metadata fallback.
938
- const deadlineMs = Math.min(Math.max(0, timeoutMs), 2_147_483_647)
944
+ // Direct QueryParams callers can supply a large run deadline. The clamp
945
+ // avoids Node's >2^31-1 one-millisecond timer coercion during metadata lookup.
946
+ // Metadata discovery remains optional and bounded even without a run deadline.
947
+ const deadlineMs = timeoutMs === 0 ? 5_000 : Math.min(Math.max(0, timeoutMs), 2_147_483_647)
939
948
  const timer = setTimeout(() => {
940
949
  deadline.abort(new Error(`Provider context-window lookup exceeded ${deadlineMs}ms`))
941
950
  }, deadlineMs)
@@ -1026,6 +1035,56 @@ function withoutOwnedResumeTurn(
1026
1035
  )
1027
1036
  }
1028
1037
 
1038
+ /**
1039
+ * The history plus the part of the owned resume turn that already RAN, for the
1040
+ * observation ledger to be seeded from.
1041
+ *
1042
+ * `withoutOwnedResumeTurn` takes that turn out so generic repair cannot answer
1043
+ * it, and the plan re-appends it much later — after the sandbox exists, after
1044
+ * the input guardrails, immediately before the loop. Seeding from the list the
1045
+ * model finally sees would therefore have to happen after `applyPendingResume`,
1046
+ * and that is the wrong seam for a reason that is not about ordering: the plan
1047
+ * does not merely re-append the turn, it EXECUTES the calls in it that never
1048
+ * started. Those tools read the ledger this seeding builds, so a seed placed
1049
+ * after them would refuse the very write the resume exists to carry out — no
1050
+ * `hasRead` for a file the conversation had read three turns earlier.
1051
+ *
1052
+ * So the turn is folded in here instead, and only as far as it actually got.
1053
+ * A call `recoverCompletedCalls` found an outcome for is one that ran: its
1054
+ * receipt goes in beside it, and the walk reads it exactly as it reads any
1055
+ * other — a completed `write` restores the body it put there, and the
1056
+ * unknown-outcome result the recovery writes for an interrupted one withdraws
1057
+ * the path instead. A call ABSENT from that map is absent because a complete
1058
+ * scan proved it has no recorded start, so the file it names is untouched and
1059
+ * the claim history established for it still stands; leaving it out is what
1060
+ * lets it execute in a moment. Without any of this the seed never saw the
1061
+ * turn at all, and an executed write inside it left the pre-write body standing
1062
+ * as a claim until the next mutation's drift check happened to catch it.
1063
+ */
1064
+ function withOwnedResumeOutcomes(
1065
+ messages: readonly Message[],
1066
+ assistant: AssistantMessage,
1067
+ recovered: ReadonlyMap<string, { result: string; isError: boolean }>,
1068
+ ): Message[] {
1069
+ const ran = (assistant.toolCalls ?? []).flatMap((call) => {
1070
+ const outcome = recovered.get(call.id)
1071
+ return outcome ? [{ call, outcome }] : []
1072
+ })
1073
+ if (ran.length === 0) return [...messages]
1074
+ return [
1075
+ ...messages,
1076
+ { ...assistant, toolCalls: ran.map(({ call }) => call) },
1077
+ ...ran.map(
1078
+ ({ call, outcome }): Message => ({
1079
+ role: 'tool',
1080
+ toolCallId: call.id,
1081
+ content: outcome.result,
1082
+ isError: outcome.isError,
1083
+ }),
1084
+ ),
1085
+ ]
1086
+ }
1087
+
1029
1088
  export async function* query(params: QueryParams): AsyncGenerator<RunEvent, Run> {
1030
1089
  assertMaxToolCalls(params.maxToolCalls)
1031
1090
  // Required types do not protect JavaScript callers. Reject missing scope
@@ -1707,10 +1766,41 @@ export async function* query(params: QueryParams): AsyncGenerator<RunEvent, Run>
1707
1766
  ? new AuthorizationGate(gateConfig, ctx.log)
1708
1767
  : undefined
1709
1768
 
1710
- // is null only when the run has no disk layout (tests,
1711
- // in-memory hosts); the budget then degrades to middle-elision.
1712
- const runDirForTools = ctx.runMgr.getRunDir()
1713
- const toolOutputDir = runDirForTools ? join(runDirForTools, TOOL_OUTPUT_DIR_NAME) : undefined
1769
+ // The store is initialized when the async query starts, after tooling is
1770
+ // composed. Resolve lazily at execution time: capturing getRunDir() here
1771
+ // permanently disabled retention for fresh disk-backed invocations.
1772
+ const toolOutputDir = () => {
1773
+ const runDir = ctx.runMgr.getRunDir()
1774
+ return runDir ? join(runDir, TOOL_OUTPUT_DIR_NAME) : undefined
1775
+ }
1776
+ // The same invocation-owned capability serves tools and optional preparation.
1777
+ // Local cancellation cannot override the run's cancellation or settled state.
1778
+ const captureRunEvidence = async (maxReadBytes?: number, signal?: AbortSignal) => {
1779
+ const combined = signal
1780
+ ? AbortSignal.any([ctx.abortController.signal, signal])
1781
+ : ctx.abortController.signal
1782
+ combined.throwIfAborted()
1783
+ const source = await eventTranslator.captureRunEvidence(maxReadBytes, combined)
1784
+ combined.throwIfAborted()
1785
+ return source
1786
+ }
1787
+
1788
+ // Whose jobs this run speaks for: its own by default, the session's when
1789
+ // the host said so. Resolved before the tools are built, because the
1790
+ // wait-intent recorder below is bound into them.
1791
+ const jobOwner = params.backgroundJobOwner ?? ctx.runId
1792
+ // What the model reads when a job ends. Built up here, ahead of the
1793
+ // subscription that fills it below, because the wait-intent recorder needs
1794
+ // to ask whether its text has been read yet.
1795
+ const jobNotices = params.backgroundJobs ? new SteeringBinding() : undefined
1796
+ // Jobs the model told `wait_for_job` it is waiting on, which is the only
1797
+ // thing that can hold this run open for a job. Built only where there is a
1798
+ // registry, so a host with no background mode carries no recorder and the
1799
+ // bound ref has no `markAwaited` to offer.
1800
+ const awaitedJobs = params.backgroundJobs
1801
+ ? new AwaitedJobs(params.backgroundJobs, jobOwner, () => jobNotices?.pending ?? false)
1802
+ : undefined
1803
+ awaitedJobs?.attach()
1714
1804
 
1715
1805
  const toolExecutor = ToolingBootstrap.init(
1716
1806
  {
@@ -1728,6 +1818,7 @@ export async function* query(params: QueryParams): AsyncGenerator<RunEvent, Run>
1728
1818
  pluginManager: params.pluginManager,
1729
1819
  ...(params.backgroundJobs ? { backgroundJobs: params.backgroundJobs } : {}),
1730
1820
  ...(params.backgroundJobOwner ? { backgroundJobOwner: params.backgroundJobOwner } : {}),
1821
+ ...(awaitedJobs ? { onJobAwaited: (id: string) => awaitedJobs.expect(id) } : {}),
1731
1822
  // The `skill` tool's registry. Threaded from the run rather than
1732
1823
  // held by the tool, because a tool that reached for a module-level
1733
1824
  // registry would answer about whatever the last run configured.
@@ -1750,13 +1841,17 @@ export async function* query(params: QueryParams): AsyncGenerator<RunEvent, Run>
1750
1841
  ...(params.maxToolOutputChars !== undefined
1751
1842
  ? { maxToolOutputChars: params.maxToolOutputChars }
1752
1843
  : {}),
1844
+ ...(params.retainedToolPreviewChars !== undefined
1845
+ ? { retainedToolPreviewChars: params.retainedToolPreviewChars }
1846
+ : {}),
1753
1847
  ...(params.maxToolContentBytes !== undefined
1754
1848
  ? { maxToolContentBytes: params.maxToolContentBytes }
1755
1849
  : {}),
1756
1850
  // Overflow lands beside the run's other artifacts, so it is
1757
1851
  // cleaned up with the run and reachable by the model's own
1758
1852
  // `read`/`grep` without a new affordance.
1759
- ...(toolOutputDir ? { toolOutputDir } : {}),
1853
+ toolOutputDir,
1854
+ captureRunEvidence,
1760
1855
  ...(params.repairToolCall ? { repairToolCall: params.repairToolCall } : {}),
1761
1856
  ...(verificationGate ? { authorizationGate: verificationGate } : {}),
1762
1857
  recordAudit: (input) => ctx.runMgr.recordAudit(input),
@@ -1783,8 +1878,6 @@ export async function* query(params: QueryParams): AsyncGenerator<RunEvent, Run>
1783
1878
  // result, and the host as an event — without either polling. Subscribed
1784
1879
  // for the owner the run's jobs are bound to, so a session-owned job that
1785
1880
  // ends during this run is reported here too.
1786
- const jobOwner = params.backgroundJobOwner ?? ctx.runId
1787
- const jobNotices = params.backgroundJobs ? new SteeringBinding() : undefined
1788
1881
  const unsubscribeJobExits = params.backgroundJobs?.onExit((job) => {
1789
1882
  if (job.owner !== jobOwner) return
1790
1883
  const outcome =
@@ -1930,6 +2023,7 @@ export async function* query(params: QueryParams): AsyncGenerator<RunEvent, Run>
1930
2023
  : undefined
1931
2024
  return {
1932
2025
  messages: ctx.runMgr.messages,
2026
+ turn: iterationOrchestrator.getAdvisoryTurnContext(),
1933
2027
  ...(summary !== undefined ? { workingStateSummary: summary } : {}),
1934
2028
  ...(advisoryConfig.includeToolCatalog
1935
2029
  ? { toolCatalog: params.tools.toLLMTools(effectiveAllowedTools) }
@@ -1950,6 +2044,7 @@ export async function* query(params: QueryParams): AsyncGenerator<RunEvent, Run>
1950
2044
  }
1951
2045
 
1952
2046
  const iterationOrchestrator = new IterationOrchestrator({
2047
+ captureRunEvidence,
1953
2048
  provider: resilientProvider,
1954
2049
  providerCapabilities: capabilities,
1955
2050
  strictCapabilities: params.strictCapabilities === true,
@@ -1982,6 +2077,7 @@ export async function* query(params: QueryParams): AsyncGenerator<RunEvent, Run>
1982
2077
  promptContributions,
1983
2078
  ...(params.steering ? { steering: params.steering } : {}),
1984
2079
  ...(jobNotices ? { jobNotices } : {}),
2080
+ ...(awaitedJobs ? { awaitedJobs } : {}),
1985
2081
  checkpointMgr,
1986
2082
  planManager: ctx.planManager,
1987
2083
  taskGateway: taskScheduler,
@@ -2294,23 +2390,19 @@ export async function* query(params: QueryParams): AsyncGenerator<RunEvent, Run>
2294
2390
  ? planPendingResume(projectedCheckpoint, params.pendingDecision, ctx.log)
2295
2391
  : null
2296
2392
 
2297
- // Results of tools that finished before the process died. The
2298
- // executor already emits one `tool_completed` per tool inline
2299
- // and the transcript already persists it, so the record was
2300
- // durable all along — it was simply never read back, and the
2301
- // resumed run re-ran calls that had already charged a card or
2302
- // sent an email.
2303
- const unanswered = unansweredToolCalls(projectedCheckpoint.messages)
2393
+ // Recover completed observations and explicitly unknown outcomes.
2394
+ // A recorded start is not proof that its external effect failed.
2395
+ const unanswered = interruptedToolCalls(projectedCheckpoint.messages)
2304
2396
  recoveredResults =
2305
2397
  unanswered.length > 0
2306
- ? await recoverCompletedCalls(ctx.runMgr, unanswered, ctx.log)
2398
+ ? await recoverCompletedCalls(ctx.runMgr, unanswered, ctx.log, {
2399
+ answers: pendingResume?.answers,
2400
+ signal: ctx.abortController.signal,
2401
+ })
2307
2402
  : new Map()
2308
2403
 
2309
- // A batch caught MID-execution is a resume, not a fresh
2310
- // decision: stripping the turn and letting the model re-decide
2311
- // would re-run everything that already ran. Only taken when
2312
- // the transcript proves execution had begun — a tool-review
2313
- // park has no completions and keeps the cheap repair below.
2404
+ // Preserve both known and unknown outcomes before continuing calls
2405
+ // whose absence of a start was established by a complete scan.
2314
2406
  if (!pendingResume && recoveredResults.size > 0) {
2315
2407
  pendingResume = planCrashResume(projectedCheckpoint, recoveredResults, ctx.log)
2316
2408
  }
@@ -2344,6 +2436,37 @@ export async function* query(params: QueryParams): AsyncGenerator<RunEvent, Run>
2344
2436
  })
2345
2437
  }
2346
2438
 
2439
+ // The ledger is process state and a resumed run starts with an empty
2440
+ // one, so until something reads a file again this run knows nothing
2441
+ // about files the conversation already wrote in full — and re-reads
2442
+ // them. Rebuilt from the REPAIRED history, which is what the model
2443
+ // is about to be shown, rather than from the checkpoint's own
2444
+ // messages — plus whatever of the owned resume turn actually ran,
2445
+ // which the repaired list does not carry; see
2446
+ // `withOwnedResumeOutcomes`. Reads no file's content: every
2447
+ // fingerprint recovered here is still checked against the real one
2448
+ // at mutation time.
2449
+ try {
2450
+ await toolExecutor.seedFileObservations(
2451
+ pendingResume
2452
+ ? withOwnedResumeOutcomes(restoredMessages, pendingResume.assistant, recoveredResults)
2453
+ : restoredMessages,
2454
+ params.sandboxProvider !== undefined,
2455
+ )
2456
+ } catch (err: unknown) {
2457
+ // A ledger that could not be rebuilt is the empty one every resume
2458
+ // used to get, so the run continues without its witnesses and the
2459
+ // model reads what it needs. Failing the resume over it would trade
2460
+ // a conversation that works for one that does not, to protect an
2461
+ // optimisation. Said out loud all the same, because a seeding that
2462
+ // failed and one that found nothing are otherwise the same silence.
2463
+ ctx.log.debug('Could not rebuild the file observation ledger on resume', {
2464
+ [NAMZU.RUN_ID]: ctx.runMgr.id,
2465
+ 'namzu.checkpoint.id': checkpoint.id,
2466
+ 'exception.message': err instanceof Error ? err.message : String(err),
2467
+ })
2468
+ }
2469
+
2347
2470
  for (const msg of restoredMessages) {
2348
2471
  if (msg.role === 'system') {
2349
2472
  // Re-push the FRESH static/dynamic floor (done above) but PRESERVE
@@ -2854,6 +2977,9 @@ export async function* query(params: QueryParams): AsyncGenerator<RunEvent, Run>
2854
2977
  // Awaited, and its failure swallowed. A job that would not die is
2855
2978
  // worth a log line, and is not worth retracting a run's answer.
2856
2979
  unsubscribeJobExits?.()
2980
+ // The wait-intent recorder listens on the same shared registry and
2981
+ // leaks the same way if it is left attached.
2982
+ awaitedJobs?.close()
2857
2983
  // Only jobs bound to this run. Jobs a host bound to its session are
2858
2984
  // the host's to stop, when the session ends.
2859
2985
  if (params.backgroundJobs && (params.backgroundJobOwner ?? ctx.runId) === ctx.runId) {