@namzu/sdk 38.1.0 → 39.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 (534) hide show
  1. package/CHANGELOG.md +758 -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/contracts/schemas.js +1 -1
  30. package/dist/contracts/schemas.js.map +1 -1
  31. package/dist/eval/harness-protection.d.ts +18 -0
  32. package/dist/eval/harness-protection.d.ts.map +1 -0
  33. package/dist/eval/harness-protection.js +58 -0
  34. package/dist/eval/harness-protection.js.map +1 -0
  35. package/dist/eval/harness-verification.d.ts +6 -1
  36. package/dist/eval/harness-verification.d.ts.map +1 -1
  37. package/dist/eval/harness-verification.js +19 -2
  38. package/dist/eval/harness-verification.js.map +1 -1
  39. package/dist/eval/index.d.ts +1 -0
  40. package/dist/eval/index.d.ts.map +1 -1
  41. package/dist/eval/index.js.map +1 -1
  42. package/dist/manager/resident/activity.d.ts +50 -0
  43. package/dist/manager/resident/activity.d.ts.map +1 -0
  44. package/dist/manager/resident/activity.js +125 -0
  45. package/dist/manager/resident/activity.js.map +1 -0
  46. package/dist/manager/resident/agenda.d.ts +137 -0
  47. package/dist/manager/resident/agenda.d.ts.map +1 -0
  48. package/dist/manager/resident/agenda.js +586 -0
  49. package/dist/manager/resident/agenda.js.map +1 -0
  50. package/dist/manager/resident/consumption.d.ts +104 -0
  51. package/dist/manager/resident/consumption.d.ts.map +1 -0
  52. package/dist/manager/resident/consumption.js +233 -0
  53. package/dist/manager/resident/consumption.js.map +1 -0
  54. package/dist/manager/resident/delivery-window.d.ts +22 -0
  55. package/dist/manager/resident/delivery-window.d.ts.map +1 -0
  56. package/dist/manager/resident/delivery-window.js +78 -0
  57. package/dist/manager/resident/delivery-window.js.map +1 -0
  58. package/dist/manager/resident/evidence-recall.d.ts +24 -0
  59. package/dist/manager/resident/evidence-recall.d.ts.map +1 -0
  60. package/dist/manager/resident/evidence-recall.js +295 -0
  61. package/dist/manager/resident/evidence-recall.js.map +1 -0
  62. package/dist/manager/resident/history-disk.d.ts +10 -0
  63. package/dist/manager/resident/history-disk.d.ts.map +1 -0
  64. package/dist/manager/resident/history-disk.js +50 -0
  65. package/dist/manager/resident/history-disk.js.map +1 -0
  66. package/dist/manager/resident/history.d.ts +79 -0
  67. package/dist/manager/resident/history.d.ts.map +1 -0
  68. package/dist/manager/resident/history.js +203 -0
  69. package/dist/manager/resident/history.js.map +1 -0
  70. package/dist/manager/resident/host.d.ts +78 -0
  71. package/dist/manager/resident/host.d.ts.map +1 -0
  72. package/dist/manager/resident/host.js +252 -0
  73. package/dist/manager/resident/host.js.map +1 -0
  74. package/dist/manager/resident/initiative.d.ts +111 -0
  75. package/dist/manager/resident/initiative.d.ts.map +1 -0
  76. package/dist/manager/resident/initiative.js +129 -0
  77. package/dist/manager/resident/initiative.js.map +1 -0
  78. package/dist/manager/resident/learning-cycle.d.ts +131 -0
  79. package/dist/manager/resident/learning-cycle.d.ts.map +1 -0
  80. package/dist/manager/resident/learning-cycle.js +306 -0
  81. package/dist/manager/resident/learning-cycle.js.map +1 -0
  82. package/dist/manager/resident/learning-observation.d.ts +80 -0
  83. package/dist/manager/resident/learning-observation.d.ts.map +1 -0
  84. package/dist/manager/resident/learning-observation.js +22 -0
  85. package/dist/manager/resident/learning-observation.js.map +1 -0
  86. package/dist/manager/resident/learning-store.d.ts +106 -0
  87. package/dist/manager/resident/learning-store.d.ts.map +1 -0
  88. package/dist/manager/resident/learning-store.js +598 -0
  89. package/dist/manager/resident/learning-store.js.map +1 -0
  90. package/dist/manager/resident/learning.d.ts +726 -0
  91. package/dist/manager/resident/learning.d.ts.map +1 -0
  92. package/dist/manager/resident/learning.js +353 -0
  93. package/dist/manager/resident/learning.js.map +1 -0
  94. package/dist/manager/resident/loop.d.ts +31 -0
  95. package/dist/manager/resident/loop.d.ts.map +1 -0
  96. package/dist/manager/resident/loop.js +69 -0
  97. package/dist/manager/resident/loop.js.map +1 -0
  98. package/dist/manager/resident/outbox.d.ts +180 -0
  99. package/dist/manager/resident/outbox.d.ts.map +1 -0
  100. package/dist/manager/resident/outbox.js +214 -0
  101. package/dist/manager/resident/outbox.js.map +1 -0
  102. package/dist/manager/resident/proposal.d.ts +91 -0
  103. package/dist/manager/resident/proposal.d.ts.map +1 -0
  104. package/dist/manager/resident/proposal.js +75 -0
  105. package/dist/manager/resident/proposal.js.map +1 -0
  106. package/dist/manager/resident/store.d.ts +182 -0
  107. package/dist/manager/resident/store.d.ts.map +1 -0
  108. package/dist/manager/resident/store.js +199 -0
  109. package/dist/manager/resident/store.js.map +1 -0
  110. package/dist/manager/resident/tool-evidence.d.ts +71 -0
  111. package/dist/manager/resident/tool-evidence.d.ts.map +1 -0
  112. package/dist/manager/resident/tool-evidence.js +285 -0
  113. package/dist/manager/resident/tool-evidence.js.map +1 -0
  114. package/dist/manager/run/persistence.d.ts.map +1 -1
  115. package/dist/manager/run/persistence.js +6 -0
  116. package/dist/manager/run/persistence.js.map +1 -1
  117. package/dist/plugin/loader.d.ts.map +1 -1
  118. package/dist/plugin/loader.js +5 -3
  119. package/dist/plugin/loader.js.map +1 -1
  120. package/dist/prompt/coding-agent-doctrine.d.ts +1 -1
  121. package/dist/prompt/coding-agent-doctrine.d.ts.map +1 -1
  122. package/dist/prompt/coding-agent-doctrine.js +2 -0
  123. package/dist/prompt/coding-agent-doctrine.js.map +1 -1
  124. package/dist/prompt/contributions.d.ts +5 -2
  125. package/dist/prompt/contributions.d.ts.map +1 -1
  126. package/dist/prompt/contributions.js.map +1 -1
  127. package/dist/prompt/index.d.ts +4 -0
  128. package/dist/prompt/index.d.ts.map +1 -1
  129. package/dist/prompt/index.js +2 -0
  130. package/dist/prompt/index.js.map +1 -1
  131. package/dist/prompt/resident-learning.d.ts +19 -0
  132. package/dist/prompt/resident-learning.d.ts.map +1 -0
  133. package/dist/prompt/resident-learning.js +125 -0
  134. package/dist/prompt/resident-learning.js.map +1 -0
  135. package/dist/prompt/resident-step.d.ts +36 -0
  136. package/dist/prompt/resident-step.d.ts.map +1 -0
  137. package/dist/prompt/resident-step.js +135 -0
  138. package/dist/prompt/resident-step.js.map +1 -0
  139. package/dist/provider/collect-chat-completion.d.ts +2 -1
  140. package/dist/provider/collect-chat-completion.d.ts.map +1 -1
  141. package/dist/provider/collect-chat-completion.js +7 -6
  142. package/dist/provider/collect-chat-completion.js.map +1 -1
  143. package/dist/provider/fallback.d.ts.map +1 -1
  144. package/dist/provider/fallback.js +2 -1
  145. package/dist/provider/fallback.js.map +1 -1
  146. package/dist/provider/stream-text.d.ts +16 -0
  147. package/dist/provider/stream-text.d.ts.map +1 -0
  148. package/dist/provider/stream-text.js +51 -0
  149. package/dist/provider/stream-text.js.map +1 -0
  150. package/dist/public-runtime.d.ts +22 -3
  151. package/dist/public-runtime.d.ts.map +1 -1
  152. package/dist/public-runtime.js +21 -3
  153. package/dist/public-runtime.js.map +1 -1
  154. package/dist/public-tools.d.ts +2 -0
  155. package/dist/public-tools.d.ts.map +1 -1
  156. package/dist/public-tools.js +2 -0
  157. package/dist/public-tools.js.map +1 -1
  158. package/dist/public-types.d.ts +29 -3
  159. package/dist/public-types.d.ts.map +1 -1
  160. package/dist/registry/index.d.ts +1 -1
  161. package/dist/registry/index.d.ts.map +1 -1
  162. package/dist/registry/tool/execute.d.ts +18 -0
  163. package/dist/registry/tool/execute.d.ts.map +1 -1
  164. package/dist/registry/tool/execute.js +43 -6
  165. package/dist/registry/tool/execute.js.map +1 -1
  166. package/dist/run/LimitChecker.js +3 -3
  167. package/dist/run/LimitChecker.js.map +1 -1
  168. package/dist/run/evidence-query.d.ts +41 -0
  169. package/dist/run/evidence-query.d.ts.map +1 -0
  170. package/dist/run/evidence-query.js +270 -0
  171. package/dist/run/evidence-query.js.map +1 -0
  172. package/dist/run/evidence-recall.d.ts +99 -0
  173. package/dist/run/evidence-recall.d.ts.map +1 -0
  174. package/dist/run/evidence-recall.js +633 -0
  175. package/dist/run/evidence-recall.js.map +1 -0
  176. package/dist/run/index.d.ts +2 -0
  177. package/dist/run/index.d.ts.map +1 -1
  178. package/dist/run/index.js +1 -0
  179. package/dist/run/index.js.map +1 -1
  180. package/dist/run/json-claim-verifier.d.ts +83 -0
  181. package/dist/run/json-claim-verifier.d.ts.map +1 -0
  182. package/dist/run/json-claim-verifier.js +200 -0
  183. package/dist/run/json-claim-verifier.js.map +1 -0
  184. package/dist/run/preparation-context-error.d.ts +10 -0
  185. package/dist/run/preparation-context-error.d.ts.map +1 -0
  186. package/dist/run/preparation-context-error.js +15 -0
  187. package/dist/run/preparation-context-error.js.map +1 -0
  188. package/dist/run-query/index.d.ts +3 -1
  189. package/dist/run-query/index.d.ts.map +1 -1
  190. package/dist/runtime/query/callback-inference.d.ts +8 -0
  191. package/dist/runtime/query/callback-inference.d.ts.map +1 -0
  192. package/dist/runtime/query/callback-inference.js +89 -0
  193. package/dist/runtime/query/callback-inference.js.map +1 -0
  194. package/dist/runtime/query/checkpoint.d.ts +4 -0
  195. package/dist/runtime/query/checkpoint.d.ts.map +1 -1
  196. package/dist/runtime/query/checkpoint.js +13 -0
  197. package/dist/runtime/query/checkpoint.js.map +1 -1
  198. package/dist/runtime/query/events.d.ts +7 -1
  199. package/dist/runtime/query/events.d.ts.map +1 -1
  200. package/dist/runtime/query/events.js +39 -12
  201. package/dist/runtime/query/events.js.map +1 -1
  202. package/dist/runtime/query/executor.d.ts +7 -1
  203. package/dist/runtime/query/executor.d.ts.map +1 -1
  204. package/dist/runtime/query/executor.js +38 -7
  205. package/dist/runtime/query/executor.js.map +1 -1
  206. package/dist/runtime/query/file-evidence-context.d.ts +5 -0
  207. package/dist/runtime/query/file-evidence-context.d.ts.map +1 -0
  208. package/dist/runtime/query/file-evidence-context.js +64 -0
  209. package/dist/runtime/query/file-evidence-context.js.map +1 -0
  210. package/dist/runtime/query/guard.d.ts.map +1 -1
  211. package/dist/runtime/query/guard.js +4 -0
  212. package/dist/runtime/query/guard.js.map +1 -1
  213. package/dist/runtime/query/index.d.ts +10 -1
  214. package/dist/runtime/query/index.d.ts.map +1 -1
  215. package/dist/runtime/query/index.js +40 -25
  216. package/dist/runtime/query/index.js.map +1 -1
  217. package/dist/runtime/query/iteration/index.d.ts +9 -31
  218. package/dist/runtime/query/iteration/index.d.ts.map +1 -1
  219. package/dist/runtime/query/iteration/index.js +231 -93
  220. package/dist/runtime/query/iteration/index.js.map +1 -1
  221. package/dist/runtime/query/iteration/phases/advisory.d.ts +2 -1
  222. package/dist/runtime/query/iteration/phases/advisory.d.ts.map +1 -1
  223. package/dist/runtime/query/iteration/phases/advisory.js +2 -1
  224. package/dist/runtime/query/iteration/phases/advisory.js.map +1 -1
  225. package/dist/runtime/query/iteration/phases/context.d.ts +2 -1
  226. package/dist/runtime/query/iteration/phases/context.d.ts.map +1 -1
  227. package/dist/runtime/query/iteration/phases/context.js.map +1 -1
  228. package/dist/runtime/query/iteration/phases/tool-review.d.ts.map +1 -1
  229. package/dist/runtime/query/iteration/phases/tool-review.js +3 -0
  230. package/dist/runtime/query/iteration/phases/tool-review.js.map +1 -1
  231. package/dist/runtime/query/iteration/provider-rejected-image.d.ts +2 -1
  232. package/dist/runtime/query/iteration/provider-rejected-image.d.ts.map +1 -1
  233. package/dist/runtime/query/iteration/provider-rejected-image.js +5 -2
  234. package/dist/runtime/query/iteration/provider-rejected-image.js.map +1 -1
  235. package/dist/runtime/query/iteration/stream-turn.d.ts +4 -1
  236. package/dist/runtime/query/iteration/stream-turn.d.ts.map +1 -1
  237. package/dist/runtime/query/iteration/stream-turn.js +22 -8
  238. package/dist/runtime/query/iteration/stream-turn.js.map +1 -1
  239. package/dist/runtime/query/prompt-cache.d.ts.map +1 -1
  240. package/dist/runtime/query/prompt-cache.js +21 -42
  241. package/dist/runtime/query/prompt-cache.js.map +1 -1
  242. package/dist/runtime/query/resume-pending.d.ts +18 -33
  243. package/dist/runtime/query/resume-pending.d.ts.map +1 -1
  244. package/dist/runtime/query/resume-pending.js +59 -42
  245. package/dist/runtime/query/resume-pending.js.map +1 -1
  246. package/dist/runtime/query/review-policy.d.ts +4 -4
  247. package/dist/runtime/query/review-policy.d.ts.map +1 -1
  248. package/dist/runtime/query/review-policy.js +10 -9
  249. package/dist/runtime/query/review-policy.js.map +1 -1
  250. package/dist/runtime/query/sandbox-lifecycle.d.ts.map +1 -1
  251. package/dist/runtime/query/sandbox-lifecycle.js +4 -0
  252. package/dist/runtime/query/sandbox-lifecycle.js.map +1 -1
  253. package/dist/runtime/query/tool-output-budget.d.ts +10 -6
  254. package/dist/runtime/query/tool-output-budget.d.ts.map +1 -1
  255. package/dist/runtime/query/tool-output-budget.js +54 -12
  256. package/dist/runtime/query/tool-output-budget.js.map +1 -1
  257. package/dist/runtime/query/tooling.d.ts +3 -1
  258. package/dist/runtime/query/tooling.d.ts.map +1 -1
  259. package/dist/runtime/query/tooling.js +4 -0
  260. package/dist/runtime/query/tooling.js.map +1 -1
  261. package/dist/scheduler/completion-inbox.d.ts +3 -0
  262. package/dist/scheduler/completion-inbox.d.ts.map +1 -1
  263. package/dist/scheduler/completion-inbox.js +28 -0
  264. package/dist/scheduler/completion-inbox.js.map +1 -1
  265. package/dist/store/evidence/compaction-archive.d.ts +109 -0
  266. package/dist/store/evidence/compaction-archive.d.ts.map +1 -0
  267. package/dist/store/evidence/compaction-archive.js +125 -0
  268. package/dist/store/evidence/compaction-archive.js.map +1 -0
  269. package/dist/store/evidence/compaction-provenance.d.ts +7 -0
  270. package/dist/store/evidence/compaction-provenance.d.ts.map +1 -0
  271. package/dist/store/evidence/compaction-provenance.js +49 -0
  272. package/dist/store/evidence/compaction-provenance.js.map +1 -0
  273. package/dist/store/evidence/compaction-text.d.ts +16 -0
  274. package/dist/store/evidence/compaction-text.d.ts.map +1 -0
  275. package/dist/store/evidence/compaction-text.js +51 -0
  276. package/dist/store/evidence/compaction-text.js.map +1 -0
  277. package/dist/store/evidence/disk.d.ts +11 -0
  278. package/dist/store/evidence/disk.d.ts.map +1 -0
  279. package/dist/store/evidence/disk.js +367 -0
  280. package/dist/store/evidence/disk.js.map +1 -0
  281. package/dist/store/evidence/format.d.ts +25 -0
  282. package/dist/store/evidence/format.d.ts.map +1 -0
  283. package/dist/store/evidence/format.js +115 -0
  284. package/dist/store/evidence/format.js.map +1 -0
  285. package/dist/store/evidence/index-page.d.ts +208 -0
  286. package/dist/store/evidence/index-page.d.ts.map +1 -0
  287. package/dist/store/evidence/index-page.js +262 -0
  288. package/dist/store/evidence/index-page.js.map +1 -0
  289. package/dist/store/evidence/io.d.ts +24 -0
  290. package/dist/store/evidence/io.d.ts.map +1 -0
  291. package/dist/store/evidence/io.js +69 -0
  292. package/dist/store/evidence/io.js.map +1 -0
  293. package/dist/store/evidence/linked.d.ts +9 -0
  294. package/dist/store/evidence/linked.d.ts.map +1 -0
  295. package/dist/store/evidence/linked.js +314 -0
  296. package/dist/store/evidence/linked.js.map +1 -0
  297. package/dist/store/evidence/passages.d.ts +15 -0
  298. package/dist/store/evidence/passages.d.ts.map +1 -0
  299. package/dist/store/evidence/passages.js +72 -0
  300. package/dist/store/evidence/passages.js.map +1 -0
  301. package/dist/store/evidence/record-chain.d.ts +42 -0
  302. package/dist/store/evidence/record-chain.d.ts.map +1 -0
  303. package/dist/store/evidence/record-chain.js +111 -0
  304. package/dist/store/evidence/record-chain.js.map +1 -0
  305. package/dist/store/evidence/search-input.d.ts +21 -0
  306. package/dist/store/evidence/search-input.d.ts.map +1 -0
  307. package/dist/store/evidence/search-input.js +44 -0
  308. package/dist/store/evidence/search-input.js.map +1 -0
  309. package/dist/store/evidence/selection.d.ts +9 -0
  310. package/dist/store/evidence/selection.d.ts.map +1 -0
  311. package/dist/store/evidence/selection.js +17 -0
  312. package/dist/store/evidence/selection.js.map +1 -0
  313. package/dist/store/evidence/source-kind.d.ts +11 -0
  314. package/dist/store/evidence/source-kind.d.ts.map +1 -0
  315. package/dist/store/evidence/source-kind.js +26 -0
  316. package/dist/store/evidence/source-kind.js.map +1 -0
  317. package/dist/store/evidence/source-text.d.ts +51 -0
  318. package/dist/store/evidence/source-text.d.ts.map +1 -0
  319. package/dist/store/evidence/source-text.js +213 -0
  320. package/dist/store/evidence/source-text.js.map +1 -0
  321. package/dist/store/evidence/types.d.ts +162 -0
  322. package/dist/store/evidence/types.d.ts.map +1 -0
  323. package/dist/store/evidence/types.js +2 -0
  324. package/dist/store/evidence/types.js.map +1 -0
  325. package/dist/store/memory/disk.d.ts +2 -0
  326. package/dist/store/memory/disk.d.ts.map +1 -1
  327. package/dist/store/memory/disk.js +2 -1
  328. package/dist/store/memory/disk.js.map +1 -1
  329. package/dist/store/run/disk.d.ts +10 -0
  330. package/dist/store/run/disk.d.ts.map +1 -1
  331. package/dist/store/run/disk.js +87 -7
  332. package/dist/store/run/disk.js.map +1 -1
  333. package/dist/store/run/memory.d.ts +1 -0
  334. package/dist/store/run/memory.d.ts.map +1 -1
  335. package/dist/store/run/memory.js +10 -0
  336. package/dist/store/run/memory.js.map +1 -1
  337. package/dist/store/run/tool-executions.d.ts +13 -0
  338. package/dist/store/run/tool-executions.d.ts.map +1 -0
  339. package/dist/store/run/tool-executions.js +99 -0
  340. package/dist/store/run/tool-executions.js.map +1 -0
  341. package/dist/store/session/index.d.ts +2 -0
  342. package/dist/store/session/index.d.ts.map +1 -1
  343. package/dist/store/session/index.js +1 -0
  344. package/dist/store/session/index.js.map +1 -1
  345. package/dist/store/session/sqlite.d.ts +57 -0
  346. package/dist/store/session/sqlite.d.ts.map +1 -0
  347. package/dist/store/session/sqlite.js +430 -0
  348. package/dist/store/session/sqlite.js.map +1 -0
  349. package/dist/tools/builtins/job.d.ts.map +1 -1
  350. package/dist/tools/builtins/job.js +4 -5
  351. package/dist/tools/builtins/job.js.map +1 -1
  352. package/dist/tools/builtins/write-file.js +2 -2
  353. package/dist/tools/builtins/write-file.js.map +1 -1
  354. package/dist/tools/defineTool.d.ts +2 -1
  355. package/dist/tools/defineTool.d.ts.map +1 -1
  356. package/dist/tools/defineTool.js +1 -1
  357. package/dist/tools/defineTool.js.map +1 -1
  358. package/dist/tools/file-read-tracker.d.ts.map +1 -1
  359. package/dist/tools/file-read-tracker.js +12 -3
  360. package/dist/tools/file-read-tracker.js.map +1 -1
  361. package/dist/tools/resident-history.d.ts +10 -0
  362. package/dist/tools/resident-history.d.ts.map +1 -0
  363. package/dist/tools/resident-history.js +80 -0
  364. package/dist/tools/resident-history.js.map +1 -0
  365. package/dist/tools/resident-tool-evidence.d.ts +5 -0
  366. package/dist/tools/resident-tool-evidence.d.ts.map +1 -0
  367. package/dist/tools/resident-tool-evidence.js +57 -0
  368. package/dist/tools/resident-tool-evidence.js.map +1 -0
  369. package/dist/types/advisory/config.d.ts +7 -0
  370. package/dist/types/advisory/config.d.ts.map +1 -1
  371. package/dist/types/agent/reactive.d.ts +1 -0
  372. package/dist/types/agent/reactive.d.ts.map +1 -1
  373. package/dist/types/authorization/index.d.ts +9 -9
  374. package/dist/types/authorization/index.d.ts.map +1 -1
  375. package/dist/types/authorization/index.js +1 -1
  376. package/dist/types/authorization/index.js.map +1 -1
  377. package/dist/types/hitl/index.d.ts +4 -0
  378. package/dist/types/hitl/index.d.ts.map +1 -1
  379. package/dist/types/hitl/index.js.map +1 -1
  380. package/dist/types/message/index.d.ts +16 -2
  381. package/dist/types/message/index.d.ts.map +1 -1
  382. package/dist/types/message/index.js +8 -1
  383. package/dist/types/message/index.js.map +1 -1
  384. package/dist/types/provider/chat.d.ts +2 -0
  385. package/dist/types/provider/chat.d.ts.map +1 -1
  386. package/dist/types/provider/stream.d.ts +4 -0
  387. package/dist/types/provider/stream.d.ts.map +1 -1
  388. package/dist/types/run/answer-review.d.ts +34 -3
  389. package/dist/types/run/answer-review.d.ts.map +1 -1
  390. package/dist/types/run/config.d.ts +3 -0
  391. package/dist/types/run/config.d.ts.map +1 -1
  392. package/dist/types/run/entity.d.ts +7 -0
  393. package/dist/types/run/entity.d.ts.map +1 -1
  394. package/dist/types/run/events.d.ts +31 -8
  395. package/dist/types/run/events.d.ts.map +1 -1
  396. package/dist/types/run/events.js.map +1 -1
  397. package/dist/types/run/prepare-step.d.ts +53 -8
  398. package/dist/types/run/prepare-step.d.ts.map +1 -1
  399. package/dist/types/run/store.d.ts +29 -4
  400. package/dist/types/run/store.d.ts.map +1 -1
  401. package/dist/types/run/store.js +0 -28
  402. package/dist/types/run/store.js.map +1 -1
  403. package/dist/types/tool/index.d.ts +15 -1
  404. package/dist/types/tool/index.d.ts.map +1 -1
  405. package/dist/types/tool/index.js.map +1 -1
  406. package/dist/utils/await-with-abort.d.ts +8 -0
  407. package/dist/utils/await-with-abort.d.ts.map +1 -0
  408. package/dist/utils/await-with-abort.js +28 -0
  409. package/dist/utils/await-with-abort.js.map +1 -0
  410. package/dist/utils/evidence-time.d.ts +3 -0
  411. package/dist/utils/evidence-time.d.ts.map +1 -0
  412. package/dist/utils/evidence-time.js +10 -0
  413. package/dist/utils/evidence-time.js.map +1 -0
  414. package/dist/utils/evidence-tokens.d.ts +13 -0
  415. package/dist/utils/evidence-tokens.d.ts.map +1 -0
  416. package/dist/utils/evidence-tokens.js +29 -0
  417. package/dist/utils/evidence-tokens.js.map +1 -0
  418. package/package.json +1 -1
  419. package/src/advisory/executor.ts +15 -30
  420. package/src/advisory/history.ts +126 -0
  421. package/src/advisory/index.ts +5 -1
  422. package/src/agents/ReactiveAgent.ts +3 -0
  423. package/src/agents/runAgent.ts +14 -1
  424. package/src/compaction/manual.ts +30 -2
  425. package/src/compaction/summary.ts +4 -1
  426. package/src/config/runtime.ts +2 -2
  427. package/src/contracts/schemas.ts +1 -1
  428. package/src/eval/harness-protection.ts +79 -0
  429. package/src/eval/harness-verification.ts +31 -1
  430. package/src/eval/index.ts +1 -0
  431. package/src/manager/resident/activity.ts +187 -0
  432. package/src/manager/resident/agenda.ts +907 -0
  433. package/src/manager/resident/consumption.ts +311 -0
  434. package/src/manager/resident/delivery-window.ts +93 -0
  435. package/src/manager/resident/evidence-recall.ts +363 -0
  436. package/src/manager/resident/history-disk.ts +63 -0
  437. package/src/manager/resident/history.ts +312 -0
  438. package/src/manager/resident/host.ts +356 -0
  439. package/src/manager/resident/initiative.ts +205 -0
  440. package/src/manager/resident/learning-cycle.ts +499 -0
  441. package/src/manager/resident/learning-observation.ts +39 -0
  442. package/src/manager/resident/learning-store.ts +813 -0
  443. package/src/manager/resident/learning.ts +493 -0
  444. package/src/manager/resident/loop.ts +101 -0
  445. package/src/manager/resident/outbox.ts +307 -0
  446. package/src/manager/resident/proposal.ts +105 -0
  447. package/src/manager/resident/store.ts +257 -0
  448. package/src/manager/resident/tool-evidence.ts +412 -0
  449. package/src/manager/run/persistence.ts +6 -0
  450. package/src/plugin/loader.ts +8 -3
  451. package/src/prompt/coding-agent-doctrine.ts +2 -0
  452. package/src/prompt/contributions.ts +5 -2
  453. package/src/prompt/index.ts +4 -0
  454. package/src/prompt/resident-learning.ts +143 -0
  455. package/src/prompt/resident-step.ts +176 -0
  456. package/src/provider/collect-chat-completion.ts +7 -6
  457. package/src/provider/fallback.ts +2 -1
  458. package/src/provider/stream-text.ts +56 -0
  459. package/src/public-runtime.ts +44 -0
  460. package/src/public-tools.ts +3 -0
  461. package/src/public-types.ts +165 -0
  462. package/src/registry/index.ts +1 -1
  463. package/src/registry/tool/execute.ts +56 -9
  464. package/src/run/LimitChecker.ts +3 -3
  465. package/src/run/evidence-query.ts +333 -0
  466. package/src/run/evidence-recall.ts +854 -0
  467. package/src/run/index.ts +11 -0
  468. package/src/run/json-claim-verifier.ts +298 -0
  469. package/src/run/preparation-context-error.ts +16 -0
  470. package/src/run-query/index.ts +1 -1
  471. package/src/runtime/query/callback-inference.ts +94 -0
  472. package/src/runtime/query/checkpoint.ts +14 -0
  473. package/src/runtime/query/events.ts +46 -14
  474. package/src/runtime/query/executor.ts +51 -9
  475. package/src/runtime/query/file-evidence-context.ts +65 -0
  476. package/src/runtime/query/guard.ts +2 -0
  477. package/src/runtime/query/index.ts +50 -27
  478. package/src/runtime/query/iteration/index.ts +269 -86
  479. package/src/runtime/query/iteration/phases/advisory.ts +3 -0
  480. package/src/runtime/query/iteration/phases/context.ts +2 -0
  481. package/src/runtime/query/iteration/phases/tool-review.ts +3 -0
  482. package/src/runtime/query/iteration/provider-rejected-image.ts +6 -1
  483. package/src/runtime/query/iteration/stream-turn.ts +35 -8
  484. package/src/runtime/query/prompt-cache.ts +24 -47
  485. package/src/runtime/query/resume-pending.ts +65 -40
  486. package/src/runtime/query/review-policy.ts +13 -9
  487. package/src/runtime/query/sandbox-lifecycle.ts +3 -0
  488. package/src/runtime/query/tool-output-budget.ts +65 -13
  489. package/src/runtime/query/tooling.ts +7 -1
  490. package/src/scheduler/completion-inbox.ts +26 -0
  491. package/src/store/evidence/compaction-archive.ts +139 -0
  492. package/src/store/evidence/compaction-provenance.ts +52 -0
  493. package/src/store/evidence/compaction-text.ts +61 -0
  494. package/src/store/evidence/disk.ts +461 -0
  495. package/src/store/evidence/format.ts +126 -0
  496. package/src/store/evidence/index-page.ts +292 -0
  497. package/src/store/evidence/io.ts +95 -0
  498. package/src/store/evidence/linked.ts +365 -0
  499. package/src/store/evidence/passages.ts +88 -0
  500. package/src/store/evidence/record-chain.ts +108 -0
  501. package/src/store/evidence/search-input.ts +62 -0
  502. package/src/store/evidence/selection.ts +25 -0
  503. package/src/store/evidence/source-kind.ts +36 -0
  504. package/src/store/evidence/source-text.ts +285 -0
  505. package/src/store/evidence/types.ts +177 -0
  506. package/src/store/memory/disk.ts +4 -1
  507. package/src/store/run/disk.ts +110 -8
  508. package/src/store/run/memory.ts +10 -0
  509. package/src/store/run/tool-executions.ts +112 -0
  510. package/src/store/session/index.ts +2 -0
  511. package/src/store/session/sqlite.ts +584 -0
  512. package/src/tools/builtins/job.ts +4 -5
  513. package/src/tools/builtins/write-file.ts +2 -2
  514. package/src/tools/defineTool.ts +4 -2
  515. package/src/tools/file-read-tracker.ts +8 -2
  516. package/src/tools/resident-history.ts +86 -0
  517. package/src/tools/resident-tool-evidence.ts +68 -0
  518. package/src/types/advisory/config.ts +7 -0
  519. package/src/types/agent/reactive.ts +1 -0
  520. package/src/types/authorization/index.ts +2 -2
  521. package/src/types/hitl/index.ts +4 -0
  522. package/src/types/message/index.ts +20 -0
  523. package/src/types/provider/chat.ts +2 -0
  524. package/src/types/provider/stream.ts +4 -0
  525. package/src/types/run/answer-review.ts +34 -3
  526. package/src/types/run/config.ts +3 -0
  527. package/src/types/run/entity.ts +7 -0
  528. package/src/types/run/events.ts +31 -8
  529. package/src/types/run/prepare-step.ts +59 -8
  530. package/src/types/run/store.ts +35 -4
  531. package/src/types/tool/index.ts +19 -1
  532. package/src/utils/await-with-abort.ts +26 -0
  533. package/src/utils/evidence-time.ts +9 -0
  534. package/src/utils/evidence-tokens.ts +32 -0
package/src/run/index.ts CHANGED
@@ -29,3 +29,14 @@ export { RUN_MEMORY_TAG, createMemoryPromoter } from './memory-promoter.js'
29
29
  export type { MemoryPromoterOptions } from './memory-promoter.js'
30
30
  export { createMemoryRecallStep } from './memory-recall.js'
31
31
  export type { MemoryRecallOptions } from './memory-recall.js'
32
+ export { createJsonClaimVerifier } from './json-claim-verifier.js'
33
+ export type {
34
+ JsonClaimValue,
35
+ JsonClaimRequirement,
36
+ JsonClaimReadRequest,
37
+ JsonClaimObservation,
38
+ JsonClaimReceipt,
39
+ JsonClaimVerdict,
40
+ JsonClaimVerifierOptions,
41
+ JsonClaimVerifier,
42
+ } from './json-claim-verifier.js'
@@ -0,0 +1,298 @@
1
+ import { createHash, randomUUID } from 'node:crypto'
2
+ import { performance } from 'node:perf_hooks'
3
+ import type { RunId } from '../types/ids/index.js'
4
+ import type { AnswerReviewContext } from '../types/run/answer-review.js'
5
+
6
+ /** Numbers are restricted to safe integers; use strings for exact decimal values. */
7
+ export type JsonClaimValue = string | number | boolean | null
8
+
9
+ export interface JsonClaimRequirement {
10
+ readonly id: string
11
+ /** Host-selected source identifier, never an address supplied by the candidate. */
12
+ readonly source: string
13
+ /** RFC 6901 pointer to a scalar in the complete JSON document. */
14
+ readonly pointer: string
15
+ /** Optional postcondition in addition to candidate/source equality. */
16
+ readonly expected?: JsonClaimValue
17
+ }
18
+
19
+ export interface JsonClaimReadRequest {
20
+ readonly scope: string
21
+ readonly runId: RunId
22
+ readonly iteration: number
23
+ readonly requestId: string
24
+ readonly startedAt: number
25
+ /** Remaining total allowance. The host must bound capture, not only the returned buffer. */
26
+ readonly maxBytes: number
27
+ readonly signal: AbortSignal
28
+ }
29
+
30
+ export interface JsonClaimObservation {
31
+ readonly scope: string
32
+ readonly runId: RunId
33
+ readonly iteration: number
34
+ readonly requestId: string
35
+ readonly source: string
36
+ readonly observedAt: number
37
+ readonly complete: boolean
38
+ readonly kind: 'current' | 'historical'
39
+ readonly bytes: Uint8Array
40
+ }
41
+
42
+ export interface JsonClaimReceipt {
43
+ readonly scope: string
44
+ readonly runId: RunId
45
+ readonly iteration: number
46
+ readonly claims: Readonly<Record<string, JsonClaimValue>>
47
+ readonly observations: readonly {
48
+ readonly source: string
49
+ readonly requestId: string
50
+ readonly observedAt: number
51
+ readonly bytes: number
52
+ readonly sha256: string
53
+ }[]
54
+ }
55
+
56
+ export type JsonClaimVerdict =
57
+ | { readonly accept: true; readonly receipt: JsonClaimReceipt }
58
+ | { readonly accept: false; readonly feedback: string }
59
+
60
+ export interface JsonClaimVerifierOptions {
61
+ /** Host-owned authorization scope, including the admitted revision/claim where applicable. */
62
+ readonly scope: string
63
+ readonly runId: RunId
64
+ readonly requirements: readonly JsonClaimRequirement[]
65
+ /**
66
+ * Trusted, read-only adapter. Enforce access, capture bounds and cancellation;
67
+ * observe during this call. A matching envelope is not authentication against
68
+ * a dishonest adapter. Do not replay an action or relabel an archive as current.
69
+ */
70
+ readonly observe: (source: string, request: JsonClaimReadRequest) => Promise<JsonClaimObservation>
71
+ /** Total captured source bytes per verification; default 1 MiB, at most 8 MiB. */
72
+ readonly maxBytes?: number
73
+ /** Whole verification deadline; default 2 seconds, at most 30 seconds. */
74
+ readonly timeoutMs?: number
75
+ }
76
+
77
+ export interface JsonClaimVerifier {
78
+ /** False while an observer is outstanding, including after timeout/cancellation. */
79
+ isDrained(): boolean
80
+ /** No success cache. Every call observes the configured sources again. */
81
+ verify(
82
+ claims: unknown,
83
+ context: Pick<AnswerReviewContext, 'runId' | 'iteration' | 'signal'>,
84
+ ): Promise<JsonClaimVerdict>
85
+ }
86
+
87
+ function scalar(value: unknown): value is JsonClaimValue {
88
+ return (
89
+ value === null ||
90
+ typeof value === 'boolean' ||
91
+ (typeof value === 'string' && value.length <= 2_000) ||
92
+ (typeof value === 'number' && Number.isSafeInteger(value))
93
+ )
94
+ }
95
+
96
+ function reject(reason: string): JsonClaimVerdict {
97
+ return {
98
+ accept: false,
99
+ feedback: `Claim verification failed: ${reason} Do not claim verified completion. Correct the claims using a permitted observation, or report that completion is unavailable.`,
100
+ }
101
+ }
102
+
103
+ function pointerParts(pointer: string): string[] {
104
+ if (pointer === '') return []
105
+ if (!pointer.startsWith('/') || pointer.length > 512 || /~(?:[^01]|$)/u.test(pointer))
106
+ throw new Error('Invalid JSON claim pointer.')
107
+ return pointer
108
+ .slice(1)
109
+ .split('/')
110
+ .map((part) => part.replaceAll('~1', '/').replaceAll('~0', '~'))
111
+ }
112
+
113
+ function select(document: unknown, parts: readonly string[]): unknown {
114
+ let value = document
115
+ for (const part of parts) {
116
+ if (value === null || typeof value !== 'object' || !Object.hasOwn(value, part)) return undefined
117
+ if (Array.isArray(value) && !/^(0|[1-9]\d*)$/u.test(part)) return undefined
118
+ value = (value as Record<string, unknown>)[part]
119
+ }
120
+ return value
121
+ }
122
+
123
+ /**
124
+ * Compare explicit candidate fields with fresh, host-authorized JSON observations.
125
+ * This does not judge prose or prove the broader task complete. A receipt describes
126
+ * observation time, not an atomic snapshot or continuing truth after the read.
127
+ */
128
+ export function createJsonClaimVerifier(options: JsonClaimVerifierOptions): JsonClaimVerifier {
129
+ const { scope, runId, observe } = options
130
+ const maxBytes = options.maxBytes ?? 1_048_576
131
+ const timeoutMs = options.timeoutMs ?? 2_000
132
+ if (
133
+ typeof scope !== 'string' ||
134
+ !scope ||
135
+ scope.length > 2_000 ||
136
+ typeof runId !== 'string' ||
137
+ !runId ||
138
+ typeof observe !== 'function'
139
+ )
140
+ throw new Error('JSON claim verification requires a scope, run ID and observer.')
141
+ if (
142
+ !Number.isSafeInteger(maxBytes) ||
143
+ maxBytes < 1 ||
144
+ maxBytes > 8_388_608 ||
145
+ !Number.isSafeInteger(timeoutMs) ||
146
+ timeoutMs < 1 ||
147
+ timeoutMs > 30_000
148
+ )
149
+ throw new Error('Invalid JSON claim verification bounds.')
150
+ if (!options.requirements.length || options.requirements.length > 32)
151
+ throw new Error('JSON claim verification requires 1–32 requirements.')
152
+ const ids = new Set<string>()
153
+ const requirements = options.requirements.map((item) => {
154
+ if (
155
+ !/^[a-zA-Z][a-zA-Z0-9_-]{0,99}$/u.test(item.id) ||
156
+ ids.has(item.id) ||
157
+ typeof item.source !== 'string' ||
158
+ !item.source ||
159
+ item.source.length > 512 ||
160
+ typeof item.pointer !== 'string' ||
161
+ (Object.hasOwn(item, 'expected') && !scalar(item.expected))
162
+ )
163
+ throw new Error('Invalid or duplicate JSON claim requirement.')
164
+ ids.add(item.id)
165
+ return { ...item, parts: pointerParts(item.pointer) }
166
+ })
167
+ let active = false
168
+ let pending = 0
169
+ return {
170
+ isDrained: () => !active && pending === 0,
171
+ async verify(claims, context) {
172
+ context.signal?.throwIfAborted()
173
+ if (
174
+ context.runId !== runId ||
175
+ !Number.isSafeInteger(context.iteration) ||
176
+ context.iteration < 0
177
+ )
178
+ return reject('The review belongs to a different run or invalid iteration.')
179
+ if (active || pending) return reject('A previous observation has not drained.')
180
+ if (
181
+ !claims ||
182
+ typeof claims !== 'object' ||
183
+ Array.isArray(claims) ||
184
+ Object.keys(claims).length !== requirements.length ||
185
+ Object.keys(claims).some((id) => !ids.has(id))
186
+ )
187
+ return reject('Supply exactly the configured claim IDs and scalar values.')
188
+ const values: Record<string, JsonClaimValue> = Object.create(null)
189
+ for (const item of requirements) {
190
+ if (!Object.hasOwn(claims, item.id)) return reject('A required claim is missing.')
191
+ const value = (claims as Record<string, unknown>)[item.id]
192
+ if (!scalar(value)) return reject(`Claim ${item.id} is not a supported scalar.`)
193
+ values[item.id] = value
194
+ }
195
+ active = true
196
+ const controller = new AbortController()
197
+ const expiresAt = performance.now() + timeoutMs
198
+ const ensureActive = () => {
199
+ // A synchronous adapter can delay timers; late bytes still cannot pass.
200
+ if (performance.now() >= expiresAt) controller.abort(new Error('Verification timed out.'))
201
+ controller.signal.throwIfAborted()
202
+ }
203
+ const onAbort = () => controller.abort(context.signal?.reason)
204
+ context.signal?.addEventListener('abort', onAbort, { once: true })
205
+ const timer = setTimeout(
206
+ () => controller.abort(new Error('Verification timed out.')),
207
+ timeoutMs,
208
+ )
209
+ const observations: JsonClaimReceipt['observations'][number][] = []
210
+ let remaining = maxBytes
211
+ let removeAbort: (() => void) | undefined
212
+ try {
213
+ for (const source of new Set(requirements.map((item) => item.source))) {
214
+ ensureActive()
215
+ if (remaining < 1) return reject('The source byte allowance is exhausted.')
216
+ const request = Object.freeze({
217
+ scope,
218
+ runId,
219
+ iteration: context.iteration,
220
+ requestId: randomUUID(),
221
+ startedAt: Date.now(),
222
+ maxBytes: remaining,
223
+ signal: controller.signal,
224
+ })
225
+ pending++
226
+ const work = Promise.resolve()
227
+ .then(() => {
228
+ ensureActive()
229
+ return observe(source, request)
230
+ })
231
+ .finally(() => {
232
+ pending--
233
+ })
234
+ const aborted = new Promise<never>((_, fail) => {
235
+ const listener = () => fail(controller.signal.reason)
236
+ controller.signal.addEventListener('abort', listener, { once: true })
237
+ removeAbort = () => controller.signal.removeEventListener('abort', listener)
238
+ })
239
+ const observation = await Promise.race([work, aborted])
240
+ removeAbort?.()
241
+ ensureActive()
242
+ if (
243
+ !observation ||
244
+ observation.scope !== scope ||
245
+ observation.runId !== runId ||
246
+ observation.iteration !== context.iteration ||
247
+ observation.requestId !== request.requestId ||
248
+ observation.source !== source ||
249
+ observation.complete !== true ||
250
+ observation.kind !== 'current' ||
251
+ !Number.isSafeInteger(observation.observedAt) ||
252
+ observation.observedAt < request.startedAt ||
253
+ observation.observedAt > Date.now() ||
254
+ !(observation.bytes instanceof Uint8Array)
255
+ )
256
+ return reject('The observation is incomplete, historical or outside this review scope.')
257
+ if (observation.bytes.byteLength > remaining)
258
+ return reject('A source exceeded the byte allowance.')
259
+ const bytes = Buffer.from(observation.bytes)
260
+ remaining -= bytes.byteLength
261
+ const document: unknown = JSON.parse(
262
+ new TextDecoder('utf-8', { fatal: true }).decode(bytes),
263
+ )
264
+ for (const item of requirements.filter((item) => item.source === source)) {
265
+ const actual = select(document, item.parts)
266
+ if (!scalar(actual) || actual !== values[item.id])
267
+ return reject(`Claim ${item.id} does not match the selected source field.`)
268
+ if (Object.hasOwn(item, 'expected') && actual !== item.expected)
269
+ return reject(`Claim ${item.id} does not satisfy the configured postcondition.`)
270
+ }
271
+ observations.push({
272
+ source,
273
+ requestId: request.requestId,
274
+ observedAt: observation.observedAt,
275
+ bytes: bytes.byteLength,
276
+ sha256: createHash('sha256').update(bytes).digest('hex'),
277
+ })
278
+ }
279
+ ensureActive()
280
+ return {
281
+ accept: true,
282
+ receipt: { scope, runId, iteration: context.iteration, claims: values, observations },
283
+ }
284
+ } catch {
285
+ context.signal?.throwIfAborted()
286
+ return reject(
287
+ 'A current source could not be fully observed and parsed within the deadline.',
288
+ )
289
+ } finally {
290
+ clearTimeout(timer)
291
+ removeAbort?.()
292
+ context.signal?.removeEventListener('abort', onAbort)
293
+ controller.abort()
294
+ active = false
295
+ }
296
+ },
297
+ }
298
+ }
@@ -0,0 +1,16 @@
1
+ import { toErrorMessage } from '../utils/error.js'
2
+
3
+ /**
4
+ * Internal bridge for SDK preparation failures with a safe availability note
5
+ * and, when available, fully validated fallback evidence within the same budget.
6
+ * The cause remains diagnostic-only. Ordinary thrown errors never become context.
7
+ */
8
+ export class PreparationContextError extends Error {
9
+ constructor(
10
+ cause: unknown,
11
+ readonly context: string,
12
+ ) {
13
+ super(toErrorMessage(cause), { cause })
14
+ this.name = 'PreparationContextError'
15
+ }
16
+ }
@@ -62,7 +62,7 @@ export class RunTranscriptUnavailableError extends Error {
62
62
  /** What one compaction pass removed. */
63
63
  export interface ShedPass {
64
64
  readonly iteration: number
65
- readonly reason: 'threshold' | 'overflow'
65
+ readonly reason: Extract<PersistedRunEvent, { type: 'compaction_shed' }>['reason']
66
66
  readonly messages: readonly Message[]
67
67
  /** Where in the log the pass sits, for a caller correlating with events. */
68
68
  readonly seq: number
@@ -0,0 +1,94 @@
1
+ import { z } from 'zod'
2
+ import { StreamTextAccumulator } from '../../provider/stream-text.js'
3
+ import { type TokenUsage, mergeTokenUsage } from '../../types/common/index.js'
4
+ import { createSystemMessage, createUserMessage } from '../../types/message/index.js'
5
+ import type { PreparationTextRequest, PreparationTextResult } from '../../types/run/prepare-step.js'
6
+ import type { IterationContext } from './iteration/phases/context.js'
7
+
8
+ const requestSchema = z
9
+ .object({
10
+ system: z.string().min(1).max(12_000),
11
+ prompt: z.string().min(1).max(12_000),
12
+ maxTokens: z.number().int().min(1).max(1024).default(256),
13
+ timeoutMs: z.number().int().min(1).max(10_000).default(10_000),
14
+ })
15
+ .strict()
16
+
17
+ /** The provider already owns retry, fallback, cancellation and budget admission. */
18
+ export function createCallbackInference(
19
+ ctx: IterationContext,
20
+ model: string,
21
+ phase: 'preparation' | 'review',
22
+ ) {
23
+ const label = phase === 'preparation' ? 'Preparation' : 'Review'
24
+ const owner = phase === 'preparation' ? 'preparation stage' : 'answer reviewer'
25
+ const lifetime = new AbortController()
26
+ let used = false
27
+ return {
28
+ close: () => lifetime.abort(new Error(`The ${owner} has ended.`)),
29
+ async generateText(request: PreparationTextRequest): Promise<PreparationTextResult> {
30
+ lifetime.signal.throwIfAborted()
31
+ ctx.abortController.signal.throwIfAborted()
32
+ request.signal?.throwIfAborted()
33
+ const { signal: requestedSignal, ...fields } = request
34
+ const input = requestSchema.parse(fields)
35
+ if (input.system.length + input.prompt.length > 12_000)
36
+ throw new Error(`${label} inference input exceeds 12,000 characters.`)
37
+ if (used)
38
+ throw new Error(
39
+ `${phase === 'preparation' ? 'A' : 'An'} ${owner} may make only one inference call.`,
40
+ )
41
+ used = true
42
+ const deadline = new AbortController()
43
+ const timer = setTimeout(
44
+ () => deadline.abort(new Error(`${label} inference timed out.`)),
45
+ input.timeoutMs,
46
+ )
47
+ const signal = AbortSignal.any([
48
+ ctx.abortController.signal,
49
+ lifetime.signal,
50
+ deadline.signal,
51
+ ...(requestedSignal ? [requestedSignal] : []),
52
+ ])
53
+ const requested = ctx.servingMember?.() ?? { index: 0, providerId: ctx.provider.id }
54
+ const route = () => {
55
+ const member = ctx.servingMember?.() ?? requested
56
+ return {
57
+ providerId: member.providerId,
58
+ model: member.model ?? model,
59
+ chainIndex: member.index,
60
+ }
61
+ }
62
+ const text = new StreamTextAccumulator()
63
+ let invalidOutput: string | undefined
64
+ let usage: TokenUsage | undefined
65
+ try {
66
+ for await (const chunk of ctx.provider.chatStream({
67
+ model,
68
+ providerRoute: route(),
69
+ messages: [createSystemMessage(input.system), createUserMessage(input.prompt)],
70
+ maxTokens: input.maxTokens,
71
+ ...(ctx.runConfig.effort ? { effort: ctx.runConfig.effort } : {}),
72
+ signal,
73
+ })) {
74
+ if (chunk.usage) usage = usage ? mergeTokenUsage(usage, chunk.usage) : { ...chunk.usage }
75
+ if (chunk.error) throw new Error(chunk.error)
76
+ signal.throwIfAborted()
77
+ if (chunk.delta.toolCalls?.length) invalidOutput = `${label} inference cannot call tools.`
78
+ if (!invalidOutput) {
79
+ text.push(chunk)
80
+ if (text.characters > 8192)
81
+ invalidOutput = `${label} inference output exceeds 8,192 characters.`
82
+ }
83
+ }
84
+ signal.throwIfAborted()
85
+ if (!usage) throw new Error(`${label} inference ended without usage.`)
86
+ if (invalidOutput) throw new Error(invalidOutput)
87
+ return { text: text.text, usage, servedBy: route() }
88
+ } finally {
89
+ clearTimeout(timer)
90
+ if (usage) ctx.runMgr.accumulateUsage(usage, route())
91
+ }
92
+ },
93
+ }
94
+ }
@@ -214,6 +214,8 @@ export class CheckpointManager {
214
214
  private workingStateSource?: () => WorkingStateSnapshot | undefined
215
215
  private latestUserMessageSource?: () => UserMessage | undefined
216
216
  private restoredUserMessage?: UserMessage
217
+ private answerReviewAttemptsSource?: () => number
218
+ private restoredAnswerAttempts = 0
217
219
  private structuredReviewAttemptsSource?: () => number
218
220
  private restoredReviewAttempts = 0
219
221
  private nativeStructuredAttemptsSource?: () => number
@@ -298,6 +300,13 @@ export class CheckpointManager {
298
300
  return this.restoredUserMessage
299
301
  }
300
302
 
303
+ setAnswerReviewAttemptsSource(source: () => number): void {
304
+ this.answerReviewAttemptsSource = source
305
+ }
306
+ get restoredAnswerReviewAttempts(): number {
307
+ return this.restoredAnswerAttempts
308
+ }
309
+
301
310
  setNativeStructuredAttemptsSource(source: () => number): void {
302
311
  this.nativeStructuredAttemptsSource = source
303
312
  }
@@ -344,6 +353,7 @@ export class CheckpointManager {
344
353
  runCreatedAt: this.runCreatedAt,
345
354
  iteration,
346
355
  messages: [...runMgr.messages],
356
+ answerReviewAttempts: this.answerReviewAttemptsSource?.() ?? this.restoredAnswerAttempts,
347
357
  nativeStructuredAttempts:
348
358
  this.nativeStructuredAttemptsSource?.() ?? this.restoredNativeAttempts,
349
359
  structuredReviewAttempts:
@@ -539,6 +549,10 @@ export class CheckpointManager {
539
549
  // its origin's age. A guard that no input can trip would have read as
540
550
  // protection and been none.
541
551
  this.runCreatedAt ??= checkpoint.runCreatedAt
552
+ const answerAttempts = checkpoint.answerReviewAttempts ?? 0
553
+ if (!Number.isSafeInteger(answerAttempts) || answerAttempts < 0)
554
+ throw new Error('Checkpoint answerReviewAttempts must be a nonnegative safe integer')
555
+ this.restoredAnswerAttempts = answerAttempts
542
556
  const nativeAttempts = checkpoint.nativeStructuredAttempts ?? 0
543
557
  if (!Number.isSafeInteger(nativeAttempts) || nativeAttempts < 0)
544
558
  throw new Error('Invalid nativeStructuredAttempts in checkpoint')
@@ -7,9 +7,11 @@ import type { ProbeObservation } from '../../probe/registry.js'
7
7
  import type { ActivityEvent, ActivityStore } from '../../store/activity/memory.js'
8
8
  import type { RunId } from '../../types/ids/index.js'
9
9
  import type { FencingToken } from '../../types/run/checkpoint-store.js'
10
- import { isEphemeralEvent } from '../../types/run/events.js'
10
+ import { type PersistedRunEvent, isEphemeralEvent } from '../../types/run/events.js'
11
11
  import type { RunEvent } from '../../types/run/index.js'
12
+ import type { ReadRunEventsOptions } from '../../types/run/store.js'
12
13
  import type { TaskEvent, TaskStore } from '../../types/task/index.js'
14
+ import { awaitWithAbort } from '../../utils/await-with-abort.js'
13
15
  import { SCOPE_ATTRIBUTE } from '../../utils/log/types.js'
14
16
  import { type Logger, resolveLogger } from '../../utils/logger.js'
15
17
 
@@ -55,9 +57,49 @@ export class EventTranslator {
55
57
  */
56
58
  private generation: FencingToken | undefined
57
59
 
58
- /** Serializes sequence assignment against the append. See {@link emitEvent}. */
60
+ /** Serializes sequence assignment, appends, and transcript snapshots. */
59
61
  private appendChain: Promise<void> = Promise.resolve()
60
62
 
63
+ private async withTranscriptLock<T>(operation: () => Promise<T>): Promise<T> {
64
+ const previous = this.appendChain
65
+ let release!: () => void
66
+ this.appendChain = new Promise<void>((resolve) => {
67
+ release = resolve
68
+ })
69
+ try {
70
+ await previous
71
+ return await operation()
72
+ } finally {
73
+ release()
74
+ }
75
+ }
76
+
77
+ /** Keep a live transcript read between whole appends, including later queued writes. */
78
+ readEvents(options?: ReadRunEventsOptions): Promise<readonly PersistedRunEvent[]> {
79
+ return this.withTranscriptLock(() => this.runMgr.getRunStore().readEvents(options))
80
+ }
81
+
82
+ captureRunEvidence(
83
+ maxReadBytes?: number,
84
+ signal?: AbortSignal,
85
+ ): Promise<import('../../store/evidence/types.js').RunTextEvidenceSource | undefined> {
86
+ const capture = this.withTranscriptLock(async () => {
87
+ signal?.throwIfAborted()
88
+ const run = this.runMgr.getRun()
89
+ if (run.status !== 'running')
90
+ throw new Error('Evidence capture requires the active invocation.')
91
+ const { tenantId, projectId, sessionId, runId } = this.runMgr.getRunScope()
92
+ const source = await this.runMgr
93
+ .getRunStore()
94
+ .captureTextEvidence?.({ tenantId, projectId, sessionId, runId }, maxReadBytes, signal)
95
+ signal?.throwIfAborted()
96
+ if (this.runMgr.getRun().status !== 'running')
97
+ throw new Error('Evidence capture requires the active invocation.')
98
+ return source
99
+ })
100
+ return awaitWithAbort(capture, signal)
101
+ }
102
+
61
103
  setGeneration(fence: FencingToken | undefined): void {
62
104
  this.generation = fence
63
105
  }
@@ -109,15 +151,7 @@ export class EventTranslator {
109
151
  // took the number 15 and two took 12. A duplicated sequence is worse
110
152
  // than a missing one — a consumer asking for everything above 15 is
111
153
  // handed part of the run it already had, spliced in as if it were new.
112
- const previous = this.appendChain
113
- let release!: () => void
114
- this.appendChain = new Promise<void>((resolve) => {
115
- release = resolve
116
- })
117
-
118
- try {
119
- await previous
120
-
154
+ await this.withTranscriptLock(async () => {
121
155
  // The number is a claim that the event is IN the log, so it is taken
122
156
  // against the append and not before it. The candidate goes to the
123
157
  // store first; only a write that landed advances the counter and
@@ -143,9 +177,7 @@ export class EventTranslator {
143
177
 
144
178
  this.runMgr.commitEventSeq(seq)
145
179
  this.pendingEvents.push(stamped)
146
- } finally {
147
- release()
148
- }
180
+ })
149
181
  };
150
182
 
151
183
  *drainPending(): Generator<RunEvent> {