@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
@@ -47,11 +47,10 @@ export const JobTool = defineTool({
47
47
  inputSchema,
48
48
  category: 'shell',
49
49
  permissions: ['shell_execute'],
50
- // `read` and `list` observe; `kill` stops work. The tool as a whole is not
51
- // read-only, and claiming otherwise would let a read-only permission
52
- // preset hand the model a way to terminate a running process.
53
- readOnly: false,
54
- destructive: (input: JobInput) => input.action === 'kill',
50
+ // The static permission describes the full capability. The prepared action
51
+ // determines whether this call only observes its owner-bound registry.
52
+ readOnly: (input: JobInput) => input?.action === 'read' || input?.action === 'list',
53
+ destructive: (input: JobInput) => input?.action === 'kill',
55
54
  concurrencySafe: true,
56
55
 
57
56
  presentCall(input) {
@@ -150,7 +150,7 @@ export const WriteFileTool = defineTool({
150
150
  // This write is now the runtime's newest observation. Recording only
151
151
  // the boolean would leave an older content fingerprint in place and
152
152
  // make the next same-run write refuse its own predecessor as drift.
153
- context.fileReadTracker?.recordRead(valid.path, content)
153
+ context.fileReadTracker?.recordRead(valid.path, content, context.toolUseId)
154
154
  return fileWriteResult(
155
155
  valid.path,
156
156
  current === null ? null : current?.toString('utf-8'),
@@ -171,7 +171,7 @@ export const WriteFileTool = defineTool({
171
171
  // leaves the destination truncated — and this tool overwrites a
172
172
  // whole file, so the truncation is the user's previous work.
173
173
  await atomicWriteFile(hostPath, content)
174
- context.fileReadTracker?.recordRead(hostPath, content)
174
+ context.fileReadTracker?.recordRead(hostPath, content, context.toolUseId)
175
175
 
176
176
  return fileWriteResult(hostPath, current, content)
177
177
  })
@@ -17,7 +17,8 @@ export interface DefineToolOptions<S extends z.ZodType> {
17
17
  validationErrorHint?: string
18
18
  category: ToolDefinition['category']
19
19
  permissions: ToolPermission[]
20
- readOnly: boolean
20
+ /** Whether this exact call only observes state; conservative for unknown inputs. */
21
+ readOnly: boolean | ((input: z.infer<S>) => boolean)
21
22
  destructive: boolean | ((input: z.infer<S>) => boolean)
22
23
  concurrencySafe: boolean
23
24
  /** Batch ordering boundary; see {@link ToolDefinition.executionBarrier}. */
@@ -88,7 +89,8 @@ export function defineTool<S extends z.ZodType>(
88
89
  : {}),
89
90
  category: options.category,
90
91
  permissions: options.permissions,
91
- isReadOnly: () => options.readOnly,
92
+ isReadOnly:
93
+ typeof options.readOnly === 'function' ? options.readOnly : () => options.readOnly as boolean,
92
94
  isDestructive:
93
95
  typeof options.destructive === 'function'
94
96
  ? options.destructive
@@ -5,12 +5,18 @@ import { fingerprintContent } from './builtins/content-fingerprint.js'
5
5
  export function createFileReadTracker(): FileReadTracker {
6
6
  const paths = new Set<string>()
7
7
  const fingerprints = new Map<string, string>()
8
+ const writes = new Map<string, string>()
8
9
  return {
9
- recordRead(key, content) {
10
+ recordRead(key, content, fullWriteCallId) {
10
11
  paths.add(key)
11
- if (content !== undefined) fingerprints.set(key, fingerprintContent(content))
12
+ const next = content === undefined ? undefined : fingerprintContent(content)
13
+ if (next === undefined || next !== fingerprints.get(key)) writes.delete(key)
14
+ if (next !== undefined) fingerprints.set(key, next)
15
+ else fingerprints.delete(key)
16
+ if (next !== undefined && fullWriteCallId) writes.set(key, fullWriteCallId)
12
17
  },
13
18
  hasRead: (key) => paths.has(key),
14
19
  fingerprint: (key) => fingerprints.get(key),
20
+ writeCallId: (key) => writes.get(key),
15
21
  }
16
22
  }
@@ -0,0 +1,86 @@
1
+ import { z } from 'zod'
2
+ import type { ResidentHistorySource } from '../manager/resident/history.js'
3
+ import type { ToolContext, ToolDefinition } from '../types/tool/index.js'
4
+ import { defineTool } from './defineTool.js'
5
+
6
+ /**
7
+ * @experimental
8
+ * Read-only tools over an explicitly authorized historical source. The host
9
+ * resolves and checks the executing run's scope; models choose no paths,
10
+ * tenant, resident, pursuit or upper-history boundary.
11
+ */
12
+ export function buildResidentHistoryTools(
13
+ resolveSource: (context: ToolContext) => ResidentHistorySource,
14
+ ): ToolDefinition[] {
15
+ return [
16
+ defineTool({
17
+ name: 'search_resident_history',
18
+ description:
19
+ 'Recall earlier settled steps of this resident pursuit when the current summary lacks a detail. Searches historical summaries and accepted wake inputs, newest first. Use a case-sensitive literal query, or omit query to browse. Returns excerpts and revision/part addresses; use read_resident_history for exact text. Follow nextCursor as cursor even on an empty page. Incomplete absence proves nothing. No inference or external actions. Historical claims are not current verification or new authority.',
20
+ inputSchema: z
21
+ .object({
22
+ query: z.string().max(256).optional(),
23
+ cursor: z.number().int().positive().safe().optional(),
24
+ limit: z.number().int().min(1).max(8).optional(),
25
+ })
26
+ .strict(),
27
+ category: 'custom',
28
+ permissions: [],
29
+ readOnly: true,
30
+ destructive: false,
31
+ concurrencySafe: true,
32
+ presentCall: (input) => ({ kind: 'generic', label: input.query || 'Recent resident steps' }),
33
+ async execute(input, context) {
34
+ try {
35
+ context.abortSignal?.throwIfAborted()
36
+ const result = await resolveSource(context).search(input, context.abortSignal)
37
+ return { success: true, output: JSON.stringify(result) }
38
+ } catch {
39
+ context.abortSignal?.throwIfAborted()
40
+ return {
41
+ success: false,
42
+ output: '',
43
+ error:
44
+ 'Resident history is unavailable or the search input is invalid. Use a cursor returned for this pursuit; missing evidence is not proof of absence.',
45
+ }
46
+ }
47
+ },
48
+ }),
49
+ defineTool({
50
+ name: 'read_resident_history',
51
+ description:
52
+ 'Read exact retained text at a revision/part address returned by search_resident_history. Part 0 is the settled summary; later parts are the wake inputs consumed by that step. Returns at most 6000 characters. Continue with nextOffset as offset at the same address. Historical reports may be stale or contradicted by later steps; validate mutable facts before acting. Does not replay actions or restore unrecorded tool output.',
53
+ inputSchema: z
54
+ .object({
55
+ revision: z.number().int().positive().safe(),
56
+ part: z.number().int().min(0).max(16),
57
+ offset: z.number().int().nonnegative().safe().optional(),
58
+ })
59
+ .strict(),
60
+ category: 'custom',
61
+ permissions: [],
62
+ readOnly: true,
63
+ destructive: false,
64
+ concurrencySafe: true,
65
+ presentCall: (input) => ({
66
+ kind: 'generic',
67
+ label: `Step evidence · revision ${input.revision} · part ${input.part}`,
68
+ }),
69
+ async execute(input, context) {
70
+ try {
71
+ context.abortSignal?.throwIfAborted()
72
+ const result = await resolveSource(context).read(input, context.abortSignal)
73
+ return { success: true, output: JSON.stringify(result) }
74
+ } catch {
75
+ context.abortSignal?.throwIfAborted()
76
+ return {
77
+ success: false,
78
+ output: '',
79
+ error:
80
+ 'Resident evidence is unavailable or the address is invalid. Use revision/part from search_resident_history and the returned nextOffset.',
81
+ }
82
+ }
83
+ },
84
+ }),
85
+ ]
86
+ }
@@ -0,0 +1,68 @@
1
+ import { z } from 'zod'
2
+ import type { ResidentToolEvidenceSource } from '../manager/resident/tool-evidence.js'
3
+ import type { ToolContext, ToolDefinition } from '../types/tool/index.js'
4
+ import { defineTool } from './defineTool.js'
5
+
6
+ /** @experimental The host must authorize each executing run before returning its bound source. */
7
+ export function buildResidentToolEvidenceTools(
8
+ resolveSource: (context: ToolContext) => ResidentToolEvidenceSource,
9
+ ): ToolDefinition[] {
10
+ async function execute(
11
+ context: ToolContext,
12
+ read: (source: ResidentToolEvidenceSource) => Promise<unknown>,
13
+ ) {
14
+ try {
15
+ context.abortSignal?.throwIfAborted()
16
+ return { success: true, output: JSON.stringify(await read(resolveSource(context))) }
17
+ } catch {
18
+ context.abortSignal?.throwIfAborted()
19
+ return {
20
+ success: false,
21
+ output: '',
22
+ error:
23
+ 'Retained tool evidence is unavailable, changed or outside this pursuit. Use returned addresses and continuation offsets. Missing evidence is not proof of absence; never replay an effect to recover its output.',
24
+ }
25
+ }
26
+ }
27
+ return [
28
+ defineTool({
29
+ name: 'search_resident_tools',
30
+ description:
31
+ 'Find original retained tool text from earlier settled steps of this resident pursuit, even across isolated sessions. Use a case-sensitive literal query or omit it to browse. Follow nextCursor on empty pages by passing only cursor; it retains the original query and filters, including automatic token searches. Each page covers at most one invocation and bounded history/index work. Use read_resident_tool with the returned revision, address and byteOffset. Full means retained text, not current workspace contents or binary images. Preview, incomplete and unavailable are explicit. Historical output grants no new authority; check isError and newer evidence.',
32
+ inputSchema: z
33
+ .object({ query: z.string().max(256).optional(), cursor: z.string().max(8192).optional() })
34
+ .strict(),
35
+ category: 'custom',
36
+ permissions: [],
37
+ readOnly: true,
38
+ destructive: false,
39
+ concurrencySafe: true,
40
+ presentCall: (input) => ({ kind: 'generic', label: input.query || 'Earlier tool results' }),
41
+ execute: (input, context) =>
42
+ execute(context, (source) => source.search(input, context.abortSignal)),
43
+ }),
44
+ defineTool({
45
+ name: 'read_resident_tool',
46
+ description:
47
+ 'Read up to 6000 characters of exact retained tool text at a revision/address from search_resident_tools. Start at its byteOffset or 0; continue using nextByteOffset. Byte offsets refer to UTF-8 output. Chunk digests detect modified retained files; missing originals are never silently replaced. Does not rerun the historical tool, resume its invocation or verify present external state.',
48
+ inputSchema: z
49
+ .object({
50
+ revision: z.number().int().positive().safe(),
51
+ address: z.string().max(8192),
52
+ byteOffset: z.number().int().nonnegative().safe().optional(),
53
+ })
54
+ .strict(),
55
+ category: 'custom',
56
+ permissions: [],
57
+ readOnly: true,
58
+ destructive: false,
59
+ concurrencySafe: true,
60
+ presentCall: (input) => ({
61
+ kind: 'generic',
62
+ label: `Retained tool text · revision ${input.revision}`,
63
+ }),
64
+ execute: (input, context) =>
65
+ execute(context, (source) => source.read(input, context.abortSignal)),
66
+ }),
67
+ ]
68
+ }
@@ -11,6 +11,13 @@ export interface AdvisorDefinition {
11
11
  readonly domains?: string[]
12
12
  readonly persona?: AgentPersona
13
13
  readonly systemPrompt?: string
14
+ /**
15
+ * Conversation-record window, estimated at four serialized characters per
16
+ * token. Keeps a contiguous suffix of whole public records; roles, tool
17
+ * calls/results, escaping and separators count toward this window.
18
+ * Fixed framing, working state, tool catalogue, system prompt and question
19
+ * are separate. Omitted or zero leaves the record window unbounded.
20
+ */
14
21
  readonly maxContextTokens?: number
15
22
  readonly useCompactedContext?: boolean
16
23
  readonly maxResponseTokens?: number
@@ -106,6 +106,7 @@ export interface ReactiveAgentConfig extends BaseAgentConfig {
106
106
  toolRetryBackoff?: QueryParams['toolRetryBackoff']
107
107
  maxToolConcurrency?: number
108
108
  maxToolOutputChars?: number
109
+ retainedToolPreviewChars?: QueryParams['retainedToolPreviewChars']
109
110
  /**
110
111
  * Cap on the RICH channel of a single tool result, in base64 characters.
111
112
  * `0` or absent disables it. Separate from {@link maxToolOutputChars}:
@@ -50,7 +50,7 @@ export type AuthorizationRule =
50
50
  type: 'custom_pattern'
51
51
  pattern: string
52
52
  target: 'name' | 'args' | 'both'
53
- decision: 'allow' | 'deny'
53
+ decision: 'allow' | 'deny' | 'review'
54
54
  }
55
55
  | {
56
56
  /**
@@ -112,7 +112,7 @@ const CustomPatternSchema = z.object({
112
112
  type: z.literal('custom_pattern'),
113
113
  pattern: z.string().max(MAX_CUSTOM_PATTERN_LENGTH),
114
114
  target: z.enum(['name', 'args', 'both']),
115
- decision: z.enum(['allow', 'deny']),
115
+ decision: z.enum(['allow', 'deny', 'review']),
116
116
  })
117
117
  const ArgumentPatternSchema = z.object({
118
118
  type: z.literal('argument_pattern'),
@@ -82,6 +82,8 @@ export interface ToolCallSummary {
82
82
  authorization?: {
83
83
  decision: 'allow' | 'deny' | 'review'
84
84
  reason?: string
85
+ /** A matching rule requested review; read-only exemptions must not bypass it. */
86
+ explicitReview?: true
85
87
  }
86
88
  }
87
89
 
@@ -220,6 +222,8 @@ export interface IterationCheckpoint {
220
222
  latestUserMessage?: UserMessage
221
223
  /** Structured host-review rejections consumed at this checkpoint, independent of compacted messages. */
222
224
  structuredReviewAttempts?: number
225
+ /** Consumed prose-answer rejections, independent of compactable feedback messages. */
226
+ answerReviewAttempts?: number
223
227
  /** Native structured-output corrections consumed independently of message history. */
224
228
  nativeStructuredAttempts?: number
225
229
  tokenUsage: TokenUsage
@@ -195,6 +195,8 @@ export interface BaseMessage {
195
195
  export interface SystemMessage extends BaseMessage {
196
196
  role: 'system'
197
197
  content: string
198
+ /** Host provenance for a derived summary, independent of its textual heading. */
199
+ source?: { readonly type: 'compaction-summary' }
198
200
  }
199
201
 
200
202
  export interface UserMessage extends BaseMessage {
@@ -246,6 +248,7 @@ export const RUNTIME_CONTEXT_MESSAGE_KINDS = [
246
248
  'auto-continuation',
247
249
  'limit-finalization',
248
250
  'steering',
251
+ 'step-context',
249
252
  'structured-output',
250
253
  'task-completion',
251
254
  ] as const
@@ -374,9 +377,24 @@ export interface ReasoningBlock {
374
377
  readonly encrypted?: string
375
378
  }
376
379
 
380
+ /** Ordered public assistant text items; these are not private reasoning blocks. */
381
+ export interface AssistantTextPart {
382
+ readonly id: string
383
+ readonly text: string
384
+ readonly phase?: 'commentary' | 'final_answer'
385
+ }
386
+
387
+ /** Select explicit final answers, retaining unphased behavior when none is identified. */
388
+ export function selectAssistantText(parts: readonly AssistantTextPart[]): string {
389
+ const final = parts.filter((part) => part.phase === 'final_answer')
390
+ return (final.length ? final : parts).map((part) => part.text).join('\n\n')
391
+ }
392
+
377
393
  export interface AssistantMessage extends BaseMessage {
378
394
  role: 'assistant'
379
395
  content: string | null
396
+ /** Original ordered text items, including commentary excluded from the selected answer. */
397
+ textParts?: readonly AssistantTextPart[]
380
398
  toolCalls?: ToolCall[]
381
399
  /** Which configured model route produced this turn. */
382
400
  source?: AssistantMessageSource
@@ -501,6 +519,7 @@ export function createAssistantMessage(
501
519
  reasoning?: readonly ReasoningBlock[],
502
520
  citations?: readonly Citation[],
503
521
  source?: AssistantMessageSource,
522
+ textParts?: readonly AssistantTextPart[],
504
523
  ): AssistantMessage {
505
524
  return {
506
525
  role: 'assistant',
@@ -509,6 +528,7 @@ export function createAssistantMessage(
509
528
  ...(reasoning && reasoning.length > 0 ? { reasoning } : {}),
510
529
  ...(citations && citations.length > 0 ? { citations } : {}),
511
530
  ...(source ? { source } : {}),
531
+ ...(textParts ? { textParts } : {}),
512
532
  timestamp: Date.now(),
513
533
  }
514
534
  }
@@ -182,6 +182,8 @@ export interface ChatCompletionResponse {
182
182
  message: {
183
183
  role: 'assistant'
184
184
  content: string | null
185
+ /** Ordered public text items; content selects explicit final answers when present. */
186
+ textParts?: readonly import('../message/index.js').AssistantTextPart[]
185
187
  toolCalls?: ToolCall[]
186
188
  /** Reasoning blocks the model emitted, in original block order. */
187
189
  reasoning?: readonly ReasoningBlock[]
@@ -8,6 +8,8 @@ export interface StreamChunk {
8
8
  * retain the last defined value and the query stores it in message source.
9
9
  */
10
10
  replayState?: unknown
11
+ /** Complete ordered text snapshot, emitted at settlement; replaces accumulated text items. */
12
+ textParts?: readonly import('../message/index.js').AssistantTextPart[]
11
13
  delta: {
12
14
  /** Activity executed by the provider, never a local function-call request. */
13
15
  hostedTool?: {
@@ -17,6 +19,8 @@ export interface StreamChunk {
17
19
  }
18
20
 
19
21
  content?: string
22
+ /** Identity and phase of this content fragment, when the provider supplies them. */
23
+ textPart?: Omit<import('../message/index.js').AssistantTextPart, 'text'>
20
24
  toolCalls?: Array<{
21
25
  index: number
22
26
  id?: string
@@ -1,5 +1,6 @@
1
1
  import type { RunId } from '../ids/index.js'
2
- import type { Message } from '../message/index.js'
2
+ import type { Message, UserMessage } from '../message/index.js'
3
+ import type { PreparationTextRequest, PreparationTextResult } from './prepare-step.js'
3
4
 
4
5
  /**
5
6
  * A host's verdict on the answer a run is about to settle with.
@@ -15,7 +16,7 @@ export type AnswerReview =
15
16
  | {
16
17
  readonly accept: false
17
18
  /**
18
- * What to send back, as the user turn the model will read next.
19
+ * Feedback supplied as runtime context on the next model request.
19
20
  *
20
21
  * Prose rather than a code, because the model is the audience
21
22
  * and a code would have to be explained to it anyway. Say what
@@ -31,8 +32,36 @@ export interface AnswerReviewContext {
31
32
  readonly iteration: number
32
33
  /** Run cancellation; reviewers should forward it to verification operations. */
33
34
  readonly signal?: AbortSignal
34
- /** The full history, so a reviewer can see how the answer was reached. */
35
+ /** Canonical history currently retained by the run; compaction may remove messages. */
35
36
  readonly messages: readonly Message[]
37
+ /**
38
+ * Isolated copy of the SDK messages dispatched for this candidate's model
39
+ * request, after context projection and any image-recovery retry. Includes
40
+ * request-only evidence absent from durable history; excludes this candidate
41
+ * and subsequently delivered messages/results. This is the provider-chain
42
+ * input, not a vendor-wire capture or proof of truth/freshness. Optional for
43
+ * hosts constructing their own review context. Not checkpointed or retained
44
+ * as conversation history; modifying the copy cannot edit the run/request.
45
+ */
46
+ readonly requestMessages?: readonly Message[]
47
+ /**
48
+ * Isolated copy of the latest operator, goal-round or steering input accepted
49
+ * before this candidate's dispatch. Retained even when compaction removes
50
+ * that input from history. Excludes arrivals delivered after dispatch and
51
+ * runtime reports. This is one input, not the complete task specification
52
+ * or a guarantee that the original message was sent verbatim to the model.
53
+ */
54
+ readonly latestUserMessage?: UserMessage
55
+ /**
56
+ * Optional run-owned, tool-free inference: at most one call per review
57
+ * invocation, revoked when the callback ends. Uses the same bounded text
58
+ * request/result shapes as prepareStep and the run's metered provider chain,
59
+ * selected step model and effort. No history, candidate or tools are attached
60
+ * implicitly. Await its result before returning a verdict; generated text
61
+ * is a model judgment, not authenticated evidence. Missing in custom hosts
62
+ * which do not supply this capability.
63
+ */
64
+ readonly generateText?: (request: PreparationTextRequest) => Promise<PreparationTextResult>
36
65
  }
37
66
 
38
67
  /**
@@ -43,6 +72,8 @@ export interface AnswerReviewContext {
43
72
  * a closing summary under pressure, and rejecting it would spend budget
44
73
  * the run has already run out of.
45
74
  *
75
+ * Exceptions and malformed verdicts fail the run. Cancellation stops waiting;
76
+ * work started by a reviewer must still honor the supplied signal.
46
77
  * Bounded: see the run's answer-review limit. A reviewer that never
47
78
  * accepts stops the run with a stop reason that names it, rather than
48
79
  * looping until the token budget ends the run for an unrelated reason.
@@ -8,6 +8,7 @@ import type { CheckpointStore } from './checkpoint-store.js'
8
8
 
9
9
  export interface AgentRunConfig {
10
10
  model: string
11
+ /** Total run duration in milliseconds; 0 disables the run deadline. */
11
12
  timeoutMs: number
12
13
  /**
13
14
  * Maximum silence between provider stream chunks, in milliseconds.
@@ -67,8 +68,10 @@ export interface AgentRunConfig {
67
68
  effort?: import('../provider/index.js').ReasoningEffort
68
69
  /** Provider-hosted search for this run. Explicit opt-in; no local network permission. */
69
70
  webSearch?: import('../provider/index.js').ChatCompletionParams['webSearch']
71
+ /** Cumulative parent-and-descendant tokens; 0 is unlimited with usage accounting. */
70
72
  tokenBudget: number
71
73
  costLimitUsd?: number
74
+ /** Main-loop iterations; 0 disables this guard. Omitted defaults depend on the entry point. */
72
75
  maxIterations?: number
73
76
  temperature?: number
74
77
  env?: Record<string, string>
@@ -10,6 +10,13 @@ import type { StopReason } from './stop-reason.js'
10
10
  import type { TokenBudgetBinding } from './token-budget-store.js'
11
11
 
12
12
  export interface RunStateMetadata {
13
+ /** This invocation's owner, independent of a shared ancestor token account. */
14
+ readonly scope?: {
15
+ readonly tenantId: string
16
+ readonly projectId: string
17
+ readonly sessionId: string
18
+ readonly runId: string
19
+ }
13
20
  agentId: string
14
21
  agentName: string
15
22
  config: AgentRunConfig
@@ -209,8 +209,8 @@ type CoreRunEvent =
209
209
  iteration: number
210
210
  /** Exactly the messages the pass removed, in their original order. */
211
211
  messages: Message[]
212
- /** Whether the pass ran on the threshold or on a provider rejection. */
213
- reason: 'threshold' | 'overflow'
212
+ /** Automatic threshold, provider rejection, or a host-requested pass. */
213
+ reason: 'threshold' | 'overflow' | 'manual'
214
214
  }
215
215
  | {
216
216
  type: 'compaction_completed'
@@ -464,6 +464,8 @@ type CoreRunEvent =
464
464
  outputTruncated?: boolean
465
465
  /** Where the full output was written, when it was spilled. */
466
466
  outputSpillPath?: string
467
+ /** SHA-256 of the chunk manifest captured with the retained text. */
468
+ outputSpillIntegrity?: string
467
469
  }
468
470
  /**
469
471
  * A tool asked the user a question and the run is parked on it.
@@ -947,6 +949,7 @@ type CoreRunEvent =
947
949
  iteration: number
948
950
  messageId: MessageId
949
951
  text: string
952
+ textPart?: Omit<import('../message/index.js').AssistantTextPart, 'text'>
950
953
  }
951
954
  | {
952
955
  type: 'message_completed'
@@ -956,14 +959,16 @@ type CoreRunEvent =
956
959
  stopReason: MessageStopReason
957
960
  usage?: TokenUsage
958
961
  /**
959
- * Aggregated assistant text accumulated from `text_delta`
960
- * events for this message. Optional so consumers that
961
- * already concatenate deltas themselves don't have to pay
962
- * the duplication; consumers that only care about the
963
- * completed message (telemetry, A2A bridge, postmortem
964
- * tooling) can read this field directly.
962
+ * Settled assistant text. When the provider supplies public text
963
+ * phases, this selects explicit final-answer items; concatenating
964
+ * raw deltas would also include intermediate commentary. All items
965
+ * remain available in textParts. Without phases, ordinary delta
966
+ * concatenation is unchanged. Stop reason still determines whether
967
+ * this message finished, was cancelled or hit an output limit.
965
968
  */
966
969
  content?: string
970
+ /** Ordered original items; content selects explicit final answers if supplied. */
971
+ textParts?: readonly import('../message/index.js').AssistantTextPart[]
967
972
  }
968
973
  | {
969
974
  type: 'tool_input_started'
@@ -1032,6 +1037,24 @@ export type PersistedRunEvent = RunEvent & {
1032
1037
  readonly seq: number
1033
1038
  /** Epoch ms at which the store recorded the event. */
1034
1039
  readonly timestamp: number
1040
+ /** Optional disk integrity link to the preceding complete JSONL record. Null marks a chain boundary. */
1041
+ readonly previousRecord?: {
1042
+ readonly offset: number
1043
+ readonly length: number
1044
+ readonly sha256: string
1045
+ readonly seq: number
1046
+ } | null
1047
+ /**
1048
+ * Optional writer-owned link to the preceding text record or integrity boundary.
1049
+ * Text retrieval may skip nontext records; operational replay still uses every event.
1050
+ * Absence requires adjacent traversal. Null is only valid at a chain boundary.
1051
+ */
1052
+ readonly previousTextRecord?: {
1053
+ readonly offset: number
1054
+ readonly length: number
1055
+ readonly sha256: string
1056
+ readonly seq: number
1057
+ } | null
1035
1058
  }
1036
1059
 
1037
1060
  /**