@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,285 @@
1
+ import { lstat } from 'node:fs/promises'
2
+ import type { FileHandle } from 'node:fs/promises'
3
+ import { join } from 'node:path'
4
+ import { z } from 'zod'
5
+ import { evidenceRecordedAt } from '../../utils/evidence-time.js'
6
+ import { compactionArchiveSchema, compactionPartPath } from './compaction-archive.js'
7
+ import {
8
+ EVIDENCE_CHUNK_BYTES,
9
+ SEARCH_OVERLAP_BYTES,
10
+ digest,
11
+ mayContain,
12
+ mayContainToken,
13
+ } from './format.js'
14
+ import { type IndexEntry, entrySchema, eventTexts } from './index-page.js'
15
+ import {
16
+ type EvidenceBudget,
17
+ decode,
18
+ openEvidence,
19
+ readBytes,
20
+ readSmall,
21
+ stamp,
22
+ utf8Page,
23
+ } from './io.js'
24
+ import type { RunEvidenceScope, RunTextEvidenceReadResult } from './types.js'
25
+
26
+ const integer = z.number().int().nonnegative().safe()
27
+ export const textPointerSchema = entrySchema.pick({
28
+ offset: true,
29
+ length: true,
30
+ sha256: true,
31
+ seq: true,
32
+ part: true,
33
+ })
34
+ const manifestSchema = z.object({
35
+ version: z.literal(1),
36
+ bytes: integer,
37
+ chars: integer.optional(),
38
+ chunkBytes: z.literal(EVIDENCE_CHUNK_BYTES),
39
+ chunks: z
40
+ .array(
41
+ z.object({
42
+ sha256: z.string().regex(/^[a-f0-9]{64}$/),
43
+ filter: z.string().max(1400),
44
+ tokenFilter: z.string().max(1400).optional(),
45
+ characterOffset: integer.optional(),
46
+ }),
47
+ )
48
+ .max(4096),
49
+ })
50
+
51
+ export interface TextSource {
52
+ entry: IndexEntry
53
+ recordedAt?: number
54
+ bytes: number
55
+ chars?: number
56
+ retained: 'full' | 'preview'
57
+ chunks: number
58
+ mayMatch(
59
+ chunk: number,
60
+ query: string,
61
+ matchMode?: 'literal' | 'token',
62
+ caseSensitive?: boolean,
63
+ ): boolean
64
+ window(
65
+ chunk: number,
66
+ preceding?: boolean,
67
+ ): Promise<{ bytes: Buffer; offset: number; characterOffset?: number; searchFrom?: number }>
68
+ }
69
+
70
+ interface TextRecord {
71
+ offset: number
72
+ length: number
73
+ sha256: string
74
+ seq: number
75
+ event: Record<string, unknown>
76
+ parts: ReturnType<typeof eventTexts>
77
+ archive?: z.infer<typeof compactionArchiveSchema>
78
+ }
79
+
80
+ /** One authenticated record per operation, never shared between calls or sources. */
81
+ export function createTextSourceReader(
82
+ handle: FileHandle,
83
+ runDir: string,
84
+ runId: string,
85
+ budget: EvidenceBudget,
86
+ ): (pointer: z.infer<typeof textPointerSchema>, verifiedRecord?: Buffer) => Promise<TextSource> {
87
+ let saved: TextRecord | undefined
88
+ return async (pointer, verifiedRecord) => {
89
+ budget.signal?.throwIfAborted()
90
+ if (
91
+ !saved ||
92
+ saved.offset !== pointer.offset ||
93
+ saved.length !== pointer.length ||
94
+ saved.sha256 !== pointer.sha256 ||
95
+ saved.seq !== pointer.seq
96
+ ) {
97
+ const raw =
98
+ verifiedRecord ?? (await readBytes(handle, pointer.offset, pointer.length, budget))
99
+ if (raw.length !== pointer.length || digest(raw) !== pointer.sha256)
100
+ throw new Error('Recorded tool evidence changed.')
101
+ const event = JSON.parse(decode(raw)) as Record<string, unknown>
102
+ if (event.runId !== runId || event.seq !== pointer.seq)
103
+ throw new Error('Recorded text identity changed.')
104
+ saved = {
105
+ offset: pointer.offset,
106
+ length: pointer.length,
107
+ sha256: pointer.sha256,
108
+ seq: pointer.seq,
109
+ event,
110
+ parts: eventTexts(event),
111
+ archive:
112
+ event.type === 'compaction_archive' ? compactionArchiveSchema.parse(event) : undefined,
113
+ }
114
+ }
115
+ return sourceText(pointer, runDir, budget, saved)
116
+ }
117
+ }
118
+
119
+ async function sourceText(
120
+ pointer: z.infer<typeof textPointerSchema>,
121
+ runDir: string,
122
+ budget: EvidenceBudget,
123
+ { event, parts, archive }: TextRecord,
124
+ ): Promise<TextSource> {
125
+ const part = parts[pointer.part]
126
+ if (!part) throw new Error('Recorded text part is unavailable.')
127
+ const tool = event.type === 'tool_completed'
128
+ const archivedPart = archive?.archive.parts[pointer.part]
129
+ if (archive && !archivedPart) throw new Error('Missing archived text part.')
130
+ const entry = entrySchema.parse({
131
+ ...pointer,
132
+ source: part.source,
133
+ ...(tool
134
+ ? {
135
+ toolName: z.string().parse(event.toolName),
136
+ toolUseId: z.string().parse(event.toolUseId),
137
+ isError: z.boolean().parse(event.isError),
138
+ spill: event.outputSpillIntegrity,
139
+ }
140
+ : { toolName: part.toolName, isError: part.isError }),
141
+ truncated: tool && event.outputTruncated === true,
142
+ ...(archivedPart ? { spill: archivedPart.manifest } : {}),
143
+ filter: '',
144
+ })
145
+
146
+ if (!entry.spill) {
147
+ const bytes = Buffer.from(part.text, 'utf8')
148
+ return {
149
+ entry,
150
+ recordedAt: evidenceRecordedAt(event.timestamp),
151
+ bytes: bytes.length,
152
+ chars: part.text.length,
153
+ retained: entry.truncated ? 'preview' : 'full',
154
+ chunks: 1,
155
+ mayMatch: () => true,
156
+ window: async () => ({ bytes, offset: 0, characterOffset: 0 }),
157
+ }
158
+ }
159
+ // Never follow a model/provider-controlled spill path from the event.
160
+ let path: string
161
+ if (archive) path = compactionPartPath(runDir, archive.archive.id, pointer.part)
162
+ else {
163
+ if (!entry.toolUseId) throw new Error('Retained output has no tool identity.')
164
+ path = join(runDir, 'tool-output', `${digest(entry.toolUseId)}.txt`)
165
+ }
166
+ const rawManifest = await readSmall(`${path}.manifest.json`, budget)
167
+ if (digest(rawManifest) !== entry.spill) throw new Error('Retained output manifest changed.')
168
+ const manifest = manifestSchema.parse(JSON.parse(decode(rawManifest)))
169
+ if (manifest.chunks.length !== Math.ceil(manifest.bytes / EVIDENCE_CHUNK_BYTES))
170
+ throw new Error('Incomplete retained output manifest.')
171
+ return {
172
+ entry,
173
+ recordedAt: evidenceRecordedAt(event.timestamp),
174
+ bytes: manifest.bytes,
175
+ chars: manifest.chars,
176
+ retained: 'full',
177
+ chunks: Math.max(1, manifest.chunks.length),
178
+ mayMatch: (chunk, query, matchMode = 'literal', caseSensitive = true) => {
179
+ const part = manifest.chunks[chunk]
180
+ if (!part) return query === ''
181
+ if (matchMode === 'token')
182
+ return (
183
+ mayContainToken(part.tokenFilter, query) &&
184
+ (!caseSensitive || mayContain(part.filter, query))
185
+ )
186
+ return !caseSensitive || mayContain(part.filter, query)
187
+ },
188
+ async window(chunk, preceding = false) {
189
+ const file = await openEvidence(path)
190
+ try {
191
+ const before = await file.stat()
192
+ if (before.size !== manifest.bytes) throw new Error('Retained output size changed.')
193
+ const pieces: Buffer[] = []
194
+ // A token boundary needs the previous code point. Authenticate its
195
+ // entire chunk and charge that read; never trust an unverified byte.
196
+ const first = preceding && chunk > 0 ? chunk - 1 : chunk
197
+ for (let index = first; index < Math.min(chunk + 2, manifest.chunks.length); index++) {
198
+ const bytes = await readBytes(
199
+ file,
200
+ index * EVIDENCE_CHUNK_BYTES,
201
+ Math.min(EVIDENCE_CHUNK_BYTES, manifest.bytes - index * EVIDENCE_CHUNK_BYTES),
202
+ budget,
203
+ )
204
+ if (digest(bytes) !== manifest.chunks[index]?.sha256)
205
+ throw new Error('Retained output bytes changed.')
206
+ pieces.push(bytes)
207
+ }
208
+ if (
209
+ stamp(before) !== stamp(await file.stat()) ||
210
+ stamp(before) !== stamp(await lstat(path))
211
+ )
212
+ throw new Error('Retained output changed during read.')
213
+ const all = Buffer.concat(pieces)
214
+ const ownedStart = (chunk - first) * EVIDENCE_CHUNK_BYTES
215
+ let contentStart = ownedStart
216
+ while (contentStart < all.length && ((all[contentStart] ?? 0) & 0xc0) === 0x80)
217
+ contentStart++
218
+ let start = contentStart
219
+ if (preceding && chunk > 0) {
220
+ start--
221
+ while (start > 0 && ((all[start] ?? 0) & 0xc0) === 0x80) start--
222
+ }
223
+ const prefixChars = decode(all.subarray(start, contentStart)).length
224
+ const characterOffset =
225
+ manifest.chunks[chunk]?.characterOffset ?? (chunk === 0 ? 0 : undefined)
226
+ return {
227
+ bytes: utf8Page(
228
+ all.subarray(start),
229
+ ownedStart + EVIDENCE_CHUNK_BYTES + SEARCH_OVERLAP_BYTES - start,
230
+ ),
231
+ offset: first * EVIDENCE_CHUNK_BYTES + start,
232
+ characterOffset:
233
+ characterOffset === undefined ? undefined : characterOffset - prefixChars,
234
+ searchFrom: prefixChars,
235
+ }
236
+ } finally {
237
+ await file.close()
238
+ }
239
+ },
240
+ }
241
+ }
242
+
243
+ export async function readTextPage(
244
+ source: TextSource,
245
+ scope: RunEvidenceScope,
246
+ offset: number,
247
+ budget: EvidenceBudget,
248
+ ): Promise<RunTextEvidenceReadResult> {
249
+ const entry = source.entry
250
+ if (offset > source.bytes) throw new Error('Offset exceeds retained text.')
251
+ const chunk = entry.spill
252
+ ? Math.min(Math.floor(offset / EVIDENCE_CHUNK_BYTES), source.chunks - 1)
253
+ : 0
254
+ const window = await source.window(chunk)
255
+ if (offset < window.offset) throw new Error('Offset splits a UTF-8 character.')
256
+ const bytes = window.bytes.subarray(offset - window.offset)
257
+ let text = decode(utf8Page(bytes, 24_000))
258
+ if (text.length > 6000) {
259
+ let end = 6000
260
+ if (/[\uDC00-\uDFFF]/.test(text[end] ?? '')) end--
261
+ text = text.slice(0, end)
262
+ }
263
+ const next = offset + Buffer.byteLength(text)
264
+ if (next === offset && offset < source.bytes) throw new Error('Text page did not advance.')
265
+ return {
266
+ scope,
267
+ recordedAt: source.recordedAt,
268
+ seq: entry.seq,
269
+ source: entry.source,
270
+ part: entry.part,
271
+ characterOffset:
272
+ window.characterOffset === undefined
273
+ ? undefined
274
+ : window.characterOffset + decode(window.bytes.subarray(0, offset - window.offset)).length,
275
+ totalChars: source.chars,
276
+ toolName: entry.toolName,
277
+ isError: entry.isError,
278
+ retained: source.retained,
279
+ text,
280
+ byteOffset: offset,
281
+ nextByteOffset: next < source.bytes ? next : null,
282
+ totalBytes: source.bytes,
283
+ scannedBytes: budget.bytes,
284
+ }
285
+ }
@@ -0,0 +1,177 @@
1
+ /** @experimental An explicitly authorized invocation. No directory discovery. */
2
+ export interface RunEvidenceScope {
3
+ readonly tenantId: string
4
+ readonly projectId: string
5
+ readonly sessionId: string
6
+ readonly runId: string
7
+ }
8
+
9
+ /** @experimental Cache and run directories must be private and host-owned. */
10
+ export interface DiskRunEvidenceOptions {
11
+ readonly scope: RunEvidenceScope
12
+ readonly runDir: string
13
+ readonly indexDir: string
14
+ /** Optional smaller I/O ceiling per operation, in bytes (1–8 MiB). */
15
+ readonly maxReadBytes?: number
16
+ /**
17
+ * Disk readers default to closed runs. Snapshot mode also reads explicitly
18
+ * scoped nonterminal runs, checking file/metadata stamps before and after
19
+ * every operation. It neither claims a writer is dead nor resumes it.
20
+ * Appends or metadata changes invalidate continuations and addresses.
21
+ * Nonterminal search results remain incomplete even at the snapshot end.
22
+ * An incomplete final JSONL fragment is excluded without changing the file;
23
+ * the backward boundary scan is capped at one record (4 MiB) and billed.
24
+ */
25
+ readonly consistency?: 'closed' | 'snapshot'
26
+ }
27
+
28
+ /** @experimental Literal search; empty query browses tool records. */
29
+ export interface RunEvidenceSearchOptions {
30
+ /** Optional per-call ceiling, 1–8 MiB. Cannot raise the source's own ceiling.
31
+ * Not part of search identity; a continuation may use a different allowance.
32
+ */
33
+ readonly maxReadBytes?: number
34
+ readonly query?: string
35
+ /**
36
+ * Find passages matching any of 1–16 nonblank literal terms (up to 256 UTF-16
37
+ * units each) in the same bounded scan. Mutually exclusive with query, even
38
+ * an empty query. Exact duplicate terms and their order do not matter.
39
+ * This is candidate discovery, not relevance ranking or natural-language parsing.
40
+ */
41
+ readonly terms?: readonly string[]
42
+ /** With a cursor and its original token terms, continue at that position using
43
+ * a strict nonempty subset. Requires supportsTermRefinement. The returned
44
+ * cursor is bound to the subset; the original cursor remains usable.
45
+ */
46
+ readonly refineTerms?: readonly string[]
47
+ /**
48
+ * Defaults to literal substring matching. Token mode accepts only single
49
+ * Unicode letter/number/underscore tokens and matches complete tokens.
50
+ * Case-insensitive tokens use toLowerCase(), as bounded evidence ranking does.
51
+ * Empty-query browsing and phrases require literal mode. Bound into cursors.
52
+ */
53
+ readonly matchMode?: 'literal' | 'token'
54
+ /** Defaults to true. False uses the selected mode's case rules (see matchMode). */
55
+ readonly caseSensitive?: boolean
56
+ /**
57
+ * Omit successful results from these exact tool names during search. At most
58
+ * 16 names, each 1–256 UTF-16 units. Errors and unknown provenance remain.
59
+ * Bound into cursors; exact reads are unchanged. Default: exclude nothing.
60
+ */
61
+ readonly excludeSuccessfulTools?: readonly string[]
62
+ readonly cursor?: string
63
+ }
64
+
65
+ /** @experimental Opaque addresses remain usable after restart while the source is unchanged. */
66
+ export interface RunEvidenceMatch {
67
+ readonly address: string
68
+ readonly seq: number
69
+ /** Stored event wall-clock Unix milliseconds; absent/invalid/zero stamps remain unknown.
70
+ * This dates archive recording, not the facts in its text. Clocks can differ or move backwards.
71
+ */
72
+ readonly recordedAt?: number
73
+ readonly toolName: string
74
+ readonly isError: boolean
75
+ readonly retained: 'full' | 'preview'
76
+ readonly excerpt: string
77
+ /** True only when the excerpt contains the whole full-retained text part.
78
+ * False includes partial text and retained previews; absent is unknown.
79
+ * This says nothing about other parts, scan completeness or source truth.
80
+ */
81
+ readonly excerptComplete?: boolean
82
+ readonly byteOffset: number
83
+ }
84
+
85
+ /** @experimental An empty bounded page does not imply absence. Follow nextCursor. */
86
+ export interface RunEvidenceSearchResult {
87
+ readonly scope: RunEvidenceScope
88
+ readonly matches: readonly RunEvidenceMatch[]
89
+ readonly nextCursor: string | null
90
+ readonly scannedBytes: number
91
+ readonly indexedRecords: number
92
+ readonly cacheHit: boolean
93
+ readonly incomplete: boolean
94
+ readonly unavailable: readonly string[]
95
+ /** Successful tool-result visits omitted by this page's filter; not unique facts. */
96
+ readonly excludedToolResults?: number
97
+ }
98
+
99
+ /** @experimental Byte offsets refer to UTF-8 retained text, not the current workspace file. */
100
+ export interface RunEvidenceReadOptions {
101
+ readonly address: string
102
+ readonly byteOffset?: number
103
+ /** Optional per-call ceiling, 1–8 MiB, capped by the source's own ceiling. */
104
+ readonly maxReadBytes?: number
105
+ }
106
+
107
+ /** @experimental Full means retained text, not binary blocks or proof an action succeeded. */
108
+ export interface RunEvidenceReadResult {
109
+ readonly scope: RunEvidenceScope
110
+ readonly seq: number
111
+ /** Same stored-event wall-clock semantics as RunEvidenceMatch.recordedAt. */
112
+ readonly recordedAt?: number
113
+ readonly toolName: string
114
+ readonly isError: boolean
115
+ readonly retained: 'full' | 'preview'
116
+ readonly text: string
117
+ readonly byteOffset: number
118
+ readonly nextByteOffset: number | null
119
+ readonly totalBytes: number
120
+ readonly scannedBytes: number
121
+ }
122
+
123
+ /** @experimental Retrieval only: never re-executes a tool or resumes a run. */
124
+ export interface RunEvidenceSource {
125
+ readonly scope: RunEvidenceScope
126
+ readonly supportsTermRefinement?: boolean
127
+ search(options?: RunEvidenceSearchOptions, signal?: AbortSignal): Promise<RunEvidenceSearchResult>
128
+ read(options: RunEvidenceReadOptions, signal?: AbortSignal): Promise<RunEvidenceReadResult>
129
+ }
130
+
131
+ /** @experimental Textual event parts, including assistant output and shed conversation messages. */
132
+ export interface RunTextEvidenceSearchOptions extends RunEvidenceSearchOptions {
133
+ /** Omit explicitly marked derived summaries. Default false; bound into cursors. Exact reads remain available. */
134
+ readonly excludeDerivedSummaries?: boolean
135
+ readonly seq?: number
136
+ readonly part?: number
137
+ readonly limit?: number
138
+ }
139
+
140
+ /** @experimental Event identity is durable; byteOffset starts a bounded excerpt in the retained text. */
141
+ export interface RunTextEvidenceMatch extends Omit<RunEvidenceMatch, 'toolName' | 'isError'> {
142
+ readonly source: string
143
+ readonly part: number
144
+ readonly toolName?: string
145
+ readonly isError?: boolean
146
+ /** UTF-16 position, when the authenticated source includes a character index. */
147
+ readonly characterOffset?: number
148
+ }
149
+
150
+ /** @experimental Search includes messages and tool text, never binary or private reasoning blocks. */
151
+ export interface RunTextEvidenceSearchResult extends Omit<RunEvidenceSearchResult, 'matches'> {
152
+ readonly matches: readonly RunTextEvidenceMatch[]
153
+ /** Derived-summary part visits deliberately skipped, not unique facts or matched passages. */
154
+ readonly excludedSummaries?: number
155
+ }
156
+
157
+ /** @experimental Character counts are UTF-16 units; absent counts must not be inferred from bytes. */
158
+ export interface RunTextEvidenceReadResult
159
+ extends Omit<RunEvidenceReadResult, 'toolName' | 'isError'> {
160
+ readonly source: string
161
+ readonly part: number
162
+ readonly toolName?: string
163
+ readonly isError?: boolean
164
+ readonly characterOffset?: number
165
+ readonly totalChars?: number
166
+ }
167
+
168
+ /** @experimental Scope-bound, bounded text retrieval across an invocation's event stream. */
169
+ export interface RunTextEvidenceSource {
170
+ readonly scope: RunEvidenceScope
171
+ readonly supportsTermRefinement?: boolean
172
+ search(
173
+ options?: RunTextEvidenceSearchOptions,
174
+ signal?: AbortSignal,
175
+ ): Promise<RunTextEvidenceSearchResult>
176
+ read(options: RunEvidenceReadOptions, signal?: AbortSignal): Promise<RunTextEvidenceReadResult>
177
+ }
@@ -149,6 +149,8 @@ function assertMemoryContent(value: unknown, expectedId: MemoryId): asserts valu
149
149
 
150
150
  export interface DiskMemoryStoreConfig {
151
151
  baseDir: string
152
+ /** Exact memory directory; defaults to `baseDir/memory`. Hosts can partition by workspace. */
153
+ directory?: string
152
154
  logger?: Logger
153
155
  /** Maximum wait for another process's operation; default 10 seconds. Never breaks stale locks. */
154
156
  lockTimeoutMs?: number
@@ -168,7 +170,8 @@ export class DiskMemoryStore implements MemoryStore {
168
170
  private readonly indexRecords = new DiskRecordStore<unknown>(SCHEMA)
169
171
 
170
172
  constructor(config: DiskMemoryStoreConfig) {
171
- this.baseDir = join(config.baseDir, 'memory')
173
+ this.baseDir =
174
+ config.directory === undefined ? join(config.baseDir, 'memory') : resolve(config.directory)
172
175
  this.log = resolveLogger(config.logger).child({ [SCOPE_ATTRIBUTE]: 'store/memory/disk' })
173
176
  this.lockTimeoutMs = config.lockTimeoutMs ?? DEFAULT_MEMORY_LOCK_TIMEOUT_MS
174
177
  validateMemoryLockTimeout(this.lockTimeoutMs)
@@ -1,4 +1,5 @@
1
- import { appendFile, mkdir, readFile, readdir, unlink } from 'node:fs/promises'
1
+ import { randomUUID } from 'node:crypto'
2
+ import { appendFile, mkdir, readFile, readdir, stat, unlink } from 'node:fs/promises'
2
3
  import { join } from 'node:path'
3
4
  import type { CheckpointId, IterationCheckpoint } from '../../types/hitl/index.js'
4
5
  import type { Message } from '../../types/message/index.js'
@@ -16,10 +17,22 @@ import type {
16
17
  RunStore,
17
18
  } from '../../types/run/store.js'
18
19
  import { atomicWriteFile } from '../../utils/atomic-write.js'
20
+ import { awaitWithAbort } from '../../utils/await-with-abort.js'
19
21
  import { asCheckpointId, asRunId } from '../../utils/id.js'
20
22
  import { SCOPE_ATTRIBUTE } from '../../utils/log/types.js'
21
23
  import { type Logger, resolveLogger } from '../../utils/logger.js'
24
+ import { restoreCompactionRecord, retainCompactionRecord } from '../evidence/compaction-archive.js'
25
+ import { digest } from '../evidence/format.js'
26
+ import { createLinkedRunTextEvidenceSource } from '../evidence/linked.js'
27
+ import {
28
+ type RecordPointer,
29
+ hasEvidenceText,
30
+ recordPointerSchema,
31
+ transcriptTail,
32
+ } from '../evidence/record-chain.js'
33
+ import type { RunEvidenceScope, RunTextEvidenceSource } from '../evidence/types.js'
22
34
  import { defineSchema, migrate, stamp } from '../schema.js'
35
+ import { readToolExecutionsIn } from './tool-executions.js'
23
36
 
24
37
  /**
25
38
  * This store's on-disk format, versioned as a unit — which is how a
@@ -48,9 +61,22 @@ const CHECKPOINT_SCHEMA = defineSchema({
48
61
  export type { CompletedToolRecord }
49
62
 
50
63
  export class RunDiskStore implements RunStore {
64
+ async readToolExecutions(ids: readonly string[], signal?: AbortSignal) {
65
+ return readToolExecutionsIn(
66
+ join(this.requireInit(), 'transcript.jsonl'),
67
+ this.boundRunId!,
68
+ ids,
69
+ signal,
70
+ )
71
+ }
51
72
  private baseDir: string
52
73
  private runDir: string | null = null
53
74
  private log: Logger
75
+ private eventLock: Promise<void> = Promise.resolve()
76
+ private evidenceTip: RecordPointer | undefined
77
+ private evidenceTextTip: RecordPointer | null | undefined
78
+ private evidenceEpoch = randomUUID()
79
+ private boundRunId: string | undefined
54
80
  private indexLock: Promise<void> = Promise.resolve()
55
81
 
56
82
  constructor(config: RunStoreConfig) {
@@ -76,19 +102,94 @@ export class RunDiskStore implements RunStore {
76
102
  await mkdir(this.runDir, { recursive: true })
77
103
  await healTornTranscript(this.runDir)
78
104
  await healTornAuditTrail(this.runDir)
105
+ this.boundRunId = runId
106
+ this.evidenceEpoch = randomUUID()
107
+ const tail = await transcriptTail(join(this.runDir, 'transcript.jsonl'), runId)
108
+ this.evidenceTip = tail?.tip
109
+ this.evidenceTextTip = tail?.textTip
79
110
  this.log.info('Run directory created', { 'namzu.run.dir': this.runDir })
80
111
  return this.runDir
81
112
  }
82
113
 
83
- async appendEvent(event: RunEvent): Promise<void> {
84
- const dir = this.requireInit()
114
+ private withEventLock<T>(operation: () => Promise<T>): Promise<T> {
115
+ const next = this.eventLock.then(operation)
116
+ this.eventLock = next.then(
117
+ () => {},
118
+ () => {},
119
+ )
120
+ return next
121
+ }
85
122
 
86
- const line = `${JSON.stringify({
87
- ...event,
88
- timestamp: Date.now(),
89
- })}\n`
123
+ async appendEvent(event: RunEvent): Promise<void> {
124
+ return this.withEventLock(async () => {
125
+ const storedEvent = await retainCompactionRecord(event, this.requireInit())
126
+ const path = join(this.requireInit(), 'transcript.jsonl')
127
+ const before = await stat(path).catch((error: NodeJS.ErrnoException) => {
128
+ if (error.code === 'ENOENT') return { size: 0 }
129
+ throw error
130
+ })
131
+ const previous = this.evidenceTip
132
+ const linked =
133
+ event.runId === this.boundRunId &&
134
+ previous &&
135
+ previous.offset + previous.length === before.size &&
136
+ previous.seq + 1 === event.seq
137
+ const previousTextRecord = linked
138
+ ? this.evidenceTextTip
139
+ : before.size === 0 && event.seq === 1 && event.type === 'run_started'
140
+ ? null
141
+ : undefined
142
+ const line = Buffer.from(
143
+ `${JSON.stringify({
144
+ ...storedEvent,
145
+ timestamp: Date.now(),
146
+ previousRecord: linked ? previous : null,
147
+ previousTextRecord,
148
+ })}\n`,
149
+ )
150
+ await appendFile(path, line)
151
+ const pointer = recordPointerSchema.safeParse({
152
+ offset: before.size,
153
+ length: line.length,
154
+ sha256: digest(line),
155
+ seq: event.seq,
156
+ })
157
+ this.evidenceTip =
158
+ event.runId === this.boundRunId && pointer.success ? pointer.data : undefined
159
+ // Include chain boundaries as well as text. This prevents a later skip
160
+ // from hiding an incomplete history or a malformed content record.
161
+ this.evidenceTextTip = this.evidenceTip
162
+ ? !linked || hasEvidenceText(JSON.parse(line.toString('utf8')))
163
+ ? this.evidenceTip
164
+ : previousTextRecord
165
+ : undefined
166
+ })
167
+ }
90
168
 
91
- await appendFile(join(dir, 'transcript.jsonl'), line, 'utf-8')
169
+ /** Capture a writer-owned, immutable read boundary between complete appends. */
170
+ async captureTextEvidence(
171
+ scope: RunEvidenceScope,
172
+ maxReadBytes?: number,
173
+ signal?: AbortSignal,
174
+ ): Promise<RunTextEvidenceSource | undefined> {
175
+ signal?.throwIfAborted()
176
+ const capture = this.withEventLock(async () => {
177
+ signal?.throwIfAborted()
178
+ if (scope.runId !== this.boundRunId)
179
+ throw new Error('Evidence capture does not own this run.')
180
+ if (!this.evidenceTip) return undefined
181
+ const runDir = this.requireInit()
182
+ const before = await stat(join(runDir, 'transcript.jsonl'))
183
+ signal?.throwIfAborted()
184
+ const tip = { ...this.evidenceTip }
185
+ if (before.size < tip.offset + tip.length)
186
+ throw new Error('Evidence transcript was shortened.')
187
+ return createLinkedRunTextEvidenceSource(
188
+ { scope, runDir, indexDir: join(runDir, 'evidence-index'), maxReadBytes },
189
+ { tip, identity: `${before.dev}:${before.ino}`, epoch: this.evidenceEpoch },
190
+ )
191
+ })
192
+ return awaitWithAbort(capture, signal)
92
193
  }
93
194
 
94
195
  async readEvents(options?: ReadRunEventsOptions): Promise<readonly PersistedRunEvent[]> {
@@ -461,6 +562,7 @@ export async function readRunEventsIn(
461
562
  }
462
563
  previousSeq = seq
463
564
  if (seq <= sinceSeq) continue
565
+ parsed = await restoreCompactionRecord(parsed, runDir)
464
566
 
465
567
  events.push({
466
568
  ...parsed,
@@ -7,6 +7,7 @@ import type {
7
7
  RunMessageSnapshot,
8
8
  RunStore,
9
9
  } from '../../types/run/store.js'
10
+ import { ToolExecutionCollector } from './tool-executions.js'
10
11
 
11
12
  /**
12
13
  * Process-local {@link RunStore}: a run's evidence with no filesystem.
@@ -23,6 +24,15 @@ import type {
23
24
  * environments with no writable filesystem at all.
24
25
  */
25
26
  export class InMemoryRunStore implements RunStore {
27
+ async readToolExecutions(ids: readonly string[], signal?: AbortSignal) {
28
+ signal?.throwIfAborted()
29
+ const collector = new ToolExecutionCollector(this.requireInit(), ids)
30
+ for (const event of this.events) {
31
+ signal?.throwIfAborted()
32
+ collector.accept(event)
33
+ }
34
+ return collector.finish()
35
+ }
26
36
  private runId: string | null = null
27
37
  private parentRunId: string | undefined
28
38
  private meta: Run | null = null