@namzu/sdk 38.2.1 → 40.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (602) hide show
  1. package/CHANGELOG.md +851 -0
  2. package/dist/advisory/executor.d.ts +10 -1
  3. package/dist/advisory/executor.d.ts.map +1 -1
  4. package/dist/advisory/executor.js +5 -26
  5. package/dist/advisory/executor.js.map +1 -1
  6. package/dist/advisory/history.d.ts +9 -0
  7. package/dist/advisory/history.d.ts.map +1 -0
  8. package/dist/advisory/history.js +120 -0
  9. package/dist/advisory/history.js.map +1 -0
  10. package/dist/advisory/index.d.ts +1 -1
  11. package/dist/advisory/index.d.ts.map +1 -1
  12. package/dist/advisory/index.js.map +1 -1
  13. package/dist/agents/ReactiveAgent.d.ts.map +1 -1
  14. package/dist/agents/ReactiveAgent.js +3 -0
  15. package/dist/agents/ReactiveAgent.js.map +1 -1
  16. package/dist/agents/runAgent.d.ts +10 -0
  17. package/dist/agents/runAgent.d.ts.map +1 -1
  18. package/dist/agents/runAgent.js +3 -0
  19. package/dist/agents/runAgent.js.map +1 -1
  20. package/dist/compaction/manual.d.ts +6 -0
  21. package/dist/compaction/manual.d.ts.map +1 -1
  22. package/dist/compaction/manual.js +21 -2
  23. package/dist/compaction/manual.js.map +1 -1
  24. package/dist/compaction/summary.d.ts.map +1 -1
  25. package/dist/compaction/summary.js +4 -1
  26. package/dist/compaction/summary.js.map +1 -1
  27. package/dist/config/runtime.js +2 -2
  28. package/dist/config/runtime.js.map +1 -1
  29. package/dist/connector/mcp/adapter.d.ts.map +1 -1
  30. package/dist/connector/mcp/adapter.js +20 -6
  31. package/dist/connector/mcp/adapter.js.map +1 -1
  32. package/dist/contracts/schemas.js +1 -1
  33. package/dist/contracts/schemas.js.map +1 -1
  34. package/dist/eval/harness-protection.d.ts +18 -0
  35. package/dist/eval/harness-protection.d.ts.map +1 -0
  36. package/dist/eval/harness-protection.js +58 -0
  37. package/dist/eval/harness-protection.js.map +1 -0
  38. package/dist/eval/harness-verification.d.ts +6 -1
  39. package/dist/eval/harness-verification.d.ts.map +1 -1
  40. package/dist/eval/harness-verification.js +19 -2
  41. package/dist/eval/harness-verification.js.map +1 -1
  42. package/dist/eval/index.d.ts +1 -0
  43. package/dist/eval/index.d.ts.map +1 -1
  44. package/dist/eval/index.js.map +1 -1
  45. package/dist/manager/resident/activity.d.ts +50 -0
  46. package/dist/manager/resident/activity.d.ts.map +1 -0
  47. package/dist/manager/resident/activity.js +125 -0
  48. package/dist/manager/resident/activity.js.map +1 -0
  49. package/dist/manager/resident/agenda.d.ts +13 -1
  50. package/dist/manager/resident/agenda.d.ts.map +1 -1
  51. package/dist/manager/resident/agenda.js +40 -5
  52. package/dist/manager/resident/agenda.js.map +1 -1
  53. package/dist/manager/resident/consumption.d.ts +104 -0
  54. package/dist/manager/resident/consumption.d.ts.map +1 -0
  55. package/dist/manager/resident/consumption.js +233 -0
  56. package/dist/manager/resident/consumption.js.map +1 -0
  57. package/dist/manager/resident/evidence-recall.d.ts +24 -0
  58. package/dist/manager/resident/evidence-recall.d.ts.map +1 -0
  59. package/dist/manager/resident/evidence-recall.js +295 -0
  60. package/dist/manager/resident/evidence-recall.js.map +1 -0
  61. package/dist/manager/resident/history-disk.d.ts +10 -0
  62. package/dist/manager/resident/history-disk.d.ts.map +1 -0
  63. package/dist/manager/resident/history-disk.js +50 -0
  64. package/dist/manager/resident/history-disk.js.map +1 -0
  65. package/dist/manager/resident/history.d.ts +79 -0
  66. package/dist/manager/resident/history.d.ts.map +1 -0
  67. package/dist/manager/resident/history.js +203 -0
  68. package/dist/manager/resident/history.js.map +1 -0
  69. package/dist/manager/resident/initiative.d.ts.map +1 -1
  70. package/dist/manager/resident/initiative.js +11 -3
  71. package/dist/manager/resident/initiative.js.map +1 -1
  72. package/dist/manager/resident/learning-cycle.d.ts +131 -0
  73. package/dist/manager/resident/learning-cycle.d.ts.map +1 -0
  74. package/dist/manager/resident/learning-cycle.js +306 -0
  75. package/dist/manager/resident/learning-cycle.js.map +1 -0
  76. package/dist/manager/resident/learning-observation.d.ts +80 -0
  77. package/dist/manager/resident/learning-observation.d.ts.map +1 -0
  78. package/dist/manager/resident/learning-observation.js +22 -0
  79. package/dist/manager/resident/learning-observation.js.map +1 -0
  80. package/dist/manager/resident/learning-store.d.ts +106 -0
  81. package/dist/manager/resident/learning-store.d.ts.map +1 -0
  82. package/dist/manager/resident/learning-store.js +598 -0
  83. package/dist/manager/resident/learning-store.js.map +1 -0
  84. package/dist/manager/resident/learning.d.ts +246 -3
  85. package/dist/manager/resident/learning.d.ts.map +1 -1
  86. package/dist/manager/resident/learning.js +96 -6
  87. package/dist/manager/resident/learning.js.map +1 -1
  88. package/dist/manager/resident/outbox.d.ts +4 -4
  89. package/dist/manager/resident/store.d.ts +37 -4
  90. package/dist/manager/resident/store.d.ts.map +1 -1
  91. package/dist/manager/resident/store.js +27 -3
  92. package/dist/manager/resident/store.js.map +1 -1
  93. package/dist/manager/resident/tool-evidence.d.ts +71 -0
  94. package/dist/manager/resident/tool-evidence.d.ts.map +1 -0
  95. package/dist/manager/resident/tool-evidence.js +285 -0
  96. package/dist/manager/resident/tool-evidence.js.map +1 -0
  97. package/dist/manager/run/persistence.d.ts +8 -0
  98. package/dist/manager/run/persistence.d.ts.map +1 -1
  99. package/dist/manager/run/persistence.js +18 -0
  100. package/dist/manager/run/persistence.js.map +1 -1
  101. package/dist/plugin/loader.d.ts.map +1 -1
  102. package/dist/plugin/loader.js +5 -3
  103. package/dist/plugin/loader.js.map +1 -1
  104. package/dist/prompt/coding-agent-doctrine.d.ts +1 -1
  105. package/dist/prompt/coding-agent-doctrine.d.ts.map +1 -1
  106. package/dist/prompt/coding-agent-doctrine.js +2 -0
  107. package/dist/prompt/coding-agent-doctrine.js.map +1 -1
  108. package/dist/prompt/index.d.ts +2 -0
  109. package/dist/prompt/index.d.ts.map +1 -1
  110. package/dist/prompt/index.js +1 -0
  111. package/dist/prompt/index.js.map +1 -1
  112. package/dist/prompt/resident-learning.d.ts +19 -0
  113. package/dist/prompt/resident-learning.d.ts.map +1 -0
  114. package/dist/prompt/resident-learning.js +125 -0
  115. package/dist/prompt/resident-learning.js.map +1 -0
  116. package/dist/prompt/resident-step.d.ts +8 -1
  117. package/dist/prompt/resident-step.d.ts.map +1 -1
  118. package/dist/prompt/resident-step.js +65 -4
  119. package/dist/prompt/resident-step.js.map +1 -1
  120. package/dist/provider/collect-chat-completion.d.ts +2 -1
  121. package/dist/provider/collect-chat-completion.d.ts.map +1 -1
  122. package/dist/provider/collect-chat-completion.js +7 -6
  123. package/dist/provider/collect-chat-completion.js.map +1 -1
  124. package/dist/provider/fallback.d.ts.map +1 -1
  125. package/dist/provider/fallback.js +2 -1
  126. package/dist/provider/fallback.js.map +1 -1
  127. package/dist/provider/stream-text.d.ts +16 -0
  128. package/dist/provider/stream-text.d.ts.map +1 -0
  129. package/dist/provider/stream-text.js +51 -0
  130. package/dist/provider/stream-text.js.map +1 -0
  131. package/dist/public-runtime.d.ts +16 -4
  132. package/dist/public-runtime.d.ts.map +1 -1
  133. package/dist/public-runtime.js +17 -4
  134. package/dist/public-runtime.js.map +1 -1
  135. package/dist/public-tools.d.ts +13 -0
  136. package/dist/public-tools.d.ts.map +1 -1
  137. package/dist/public-tools.js +16 -0
  138. package/dist/public-tools.js.map +1 -1
  139. package/dist/public-types.d.ts +15 -3
  140. package/dist/public-types.d.ts.map +1 -1
  141. package/dist/registry/tool/execute.d.ts.map +1 -1
  142. package/dist/registry/tool/execute.js +2 -3
  143. package/dist/registry/tool/execute.js.map +1 -1
  144. package/dist/registry/tool/portable.d.ts +65 -0
  145. package/dist/registry/tool/portable.d.ts.map +1 -0
  146. package/dist/registry/tool/portable.js +244 -0
  147. package/dist/registry/tool/portable.js.map +1 -0
  148. package/dist/registry/tool/schema.d.ts +32 -5
  149. package/dist/registry/tool/schema.d.ts.map +1 -1
  150. package/dist/registry/tool/schema.js +35 -9
  151. package/dist/registry/tool/schema.js.map +1 -1
  152. package/dist/registry/toolset/catalog.js +8 -8
  153. package/dist/registry/toolset/catalog.js.map +1 -1
  154. package/dist/run/LimitChecker.js +3 -3
  155. package/dist/run/LimitChecker.js.map +1 -1
  156. package/dist/run/evidence-query.d.ts +41 -0
  157. package/dist/run/evidence-query.d.ts.map +1 -0
  158. package/dist/run/evidence-query.js +270 -0
  159. package/dist/run/evidence-query.js.map +1 -0
  160. package/dist/run/evidence-recall.d.ts +99 -0
  161. package/dist/run/evidence-recall.d.ts.map +1 -0
  162. package/dist/run/evidence-recall.js +633 -0
  163. package/dist/run/evidence-recall.js.map +1 -0
  164. package/dist/run/index.d.ts +2 -0
  165. package/dist/run/index.d.ts.map +1 -1
  166. package/dist/run/index.js +1 -0
  167. package/dist/run/index.js.map +1 -1
  168. package/dist/run/json-claim-verifier.d.ts +83 -0
  169. package/dist/run/json-claim-verifier.d.ts.map +1 -0
  170. package/dist/run/json-claim-verifier.js +200 -0
  171. package/dist/run/json-claim-verifier.js.map +1 -0
  172. package/dist/run/preparation-context-error.d.ts +10 -0
  173. package/dist/run/preparation-context-error.d.ts.map +1 -0
  174. package/dist/run/preparation-context-error.js +15 -0
  175. package/dist/run/preparation-context-error.js.map +1 -0
  176. package/dist/run-query/index.d.ts +3 -1
  177. package/dist/run-query/index.d.ts.map +1 -1
  178. package/dist/runtime/jobs/awaited-jobs.d.ts +215 -0
  179. package/dist/runtime/jobs/awaited-jobs.d.ts.map +1 -0
  180. package/dist/runtime/jobs/awaited-jobs.js +259 -0
  181. package/dist/runtime/jobs/awaited-jobs.js.map +1 -0
  182. package/dist/runtime/jobs/registry.d.ts +33 -2
  183. package/dist/runtime/jobs/registry.d.ts.map +1 -1
  184. package/dist/runtime/jobs/registry.js +37 -0
  185. package/dist/runtime/jobs/registry.js.map +1 -1
  186. package/dist/runtime/query/callback-inference.d.ts +8 -0
  187. package/dist/runtime/query/callback-inference.d.ts.map +1 -0
  188. package/dist/runtime/query/callback-inference.js +89 -0
  189. package/dist/runtime/query/callback-inference.js.map +1 -0
  190. package/dist/runtime/query/checkpoint.d.ts +4 -0
  191. package/dist/runtime/query/checkpoint.d.ts.map +1 -1
  192. package/dist/runtime/query/checkpoint.js +13 -0
  193. package/dist/runtime/query/checkpoint.js.map +1 -1
  194. package/dist/runtime/query/events.d.ts +1 -0
  195. package/dist/runtime/query/events.d.ts.map +1 -1
  196. package/dist/runtime/query/events.js +18 -0
  197. package/dist/runtime/query/events.js.map +1 -1
  198. package/dist/runtime/query/executor.d.ts +35 -1
  199. package/dist/runtime/query/executor.d.ts.map +1 -1
  200. package/dist/runtime/query/executor.js +77 -8
  201. package/dist/runtime/query/executor.js.map +1 -1
  202. package/dist/runtime/query/file-evidence-context.d.ts +5 -0
  203. package/dist/runtime/query/file-evidence-context.d.ts.map +1 -0
  204. package/dist/runtime/query/file-evidence-context.js +180 -0
  205. package/dist/runtime/query/file-evidence-context.js.map +1 -0
  206. package/dist/runtime/query/file-evidence-replay.d.ts +260 -0
  207. package/dist/runtime/query/file-evidence-replay.d.ts.map +1 -0
  208. package/dist/runtime/query/file-evidence-replay.js +647 -0
  209. package/dist/runtime/query/file-evidence-replay.js.map +1 -0
  210. package/dist/runtime/query/file-evidence-seed.d.ts +50 -0
  211. package/dist/runtime/query/file-evidence-seed.d.ts.map +1 -0
  212. package/dist/runtime/query/file-evidence-seed.js +100 -0
  213. package/dist/runtime/query/file-evidence-seed.js.map +1 -0
  214. package/dist/runtime/query/guard.d.ts.map +1 -1
  215. package/dist/runtime/query/guard.js +4 -0
  216. package/dist/runtime/query/guard.js.map +1 -1
  217. package/dist/runtime/query/index.d.ts +10 -1
  218. package/dist/runtime/query/index.d.ts.map +1 -1
  219. package/dist/runtime/query/index.js +133 -26
  220. package/dist/runtime/query/index.js.map +1 -1
  221. package/dist/runtime/query/iteration/index.d.ts +92 -36
  222. package/dist/runtime/query/iteration/index.d.ts.map +1 -1
  223. package/dist/runtime/query/iteration/index.js +420 -117
  224. package/dist/runtime/query/iteration/index.js.map +1 -1
  225. package/dist/runtime/query/iteration/phases/advisory.d.ts +2 -1
  226. package/dist/runtime/query/iteration/phases/advisory.d.ts.map +1 -1
  227. package/dist/runtime/query/iteration/phases/advisory.js +2 -1
  228. package/dist/runtime/query/iteration/phases/advisory.js.map +1 -1
  229. package/dist/runtime/query/iteration/phases/context.d.ts +12 -1
  230. package/dist/runtime/query/iteration/phases/context.d.ts.map +1 -1
  231. package/dist/runtime/query/iteration/phases/context.js.map +1 -1
  232. package/dist/runtime/query/iteration/phases/tool-review.d.ts.map +1 -1
  233. package/dist/runtime/query/iteration/phases/tool-review.js +8 -1
  234. package/dist/runtime/query/iteration/phases/tool-review.js.map +1 -1
  235. package/dist/runtime/query/iteration/provider-rejected-image.d.ts +2 -1
  236. package/dist/runtime/query/iteration/provider-rejected-image.d.ts.map +1 -1
  237. package/dist/runtime/query/iteration/provider-rejected-image.js +5 -2
  238. package/dist/runtime/query/iteration/provider-rejected-image.js.map +1 -1
  239. package/dist/runtime/query/iteration/stream-turn.d.ts +4 -1
  240. package/dist/runtime/query/iteration/stream-turn.d.ts.map +1 -1
  241. package/dist/runtime/query/iteration/stream-turn.js +22 -8
  242. package/dist/runtime/query/iteration/stream-turn.js.map +1 -1
  243. package/dist/runtime/query/plugin-hooks.d.ts +14 -0
  244. package/dist/runtime/query/plugin-hooks.d.ts.map +1 -1
  245. package/dist/runtime/query/plugin-hooks.js +18 -0
  246. package/dist/runtime/query/plugin-hooks.js.map +1 -1
  247. package/dist/runtime/query/repeat-call.d.ts +17 -4
  248. package/dist/runtime/query/repeat-call.d.ts.map +1 -1
  249. package/dist/runtime/query/repeat-call.js +26 -19
  250. package/dist/runtime/query/repeat-call.js.map +1 -1
  251. package/dist/runtime/query/resume-pending.d.ts +18 -33
  252. package/dist/runtime/query/resume-pending.d.ts.map +1 -1
  253. package/dist/runtime/query/resume-pending.js +59 -42
  254. package/dist/runtime/query/resume-pending.js.map +1 -1
  255. package/dist/runtime/query/review-policy.d.ts +4 -4
  256. package/dist/runtime/query/review-policy.d.ts.map +1 -1
  257. package/dist/runtime/query/review-policy.js +10 -9
  258. package/dist/runtime/query/review-policy.js.map +1 -1
  259. package/dist/runtime/query/sandbox-lifecycle.d.ts.map +1 -1
  260. package/dist/runtime/query/sandbox-lifecycle.js +4 -0
  261. package/dist/runtime/query/sandbox-lifecycle.js.map +1 -1
  262. package/dist/runtime/query/steering.d.ts +11 -1
  263. package/dist/runtime/query/steering.d.ts.map +1 -1
  264. package/dist/runtime/query/steering.js +12 -1
  265. package/dist/runtime/query/steering.js.map +1 -1
  266. package/dist/runtime/query/tool-output-budget.d.ts +10 -6
  267. package/dist/runtime/query/tool-output-budget.d.ts.map +1 -1
  268. package/dist/runtime/query/tool-output-budget.js +54 -12
  269. package/dist/runtime/query/tool-output-budget.js.map +1 -1
  270. package/dist/runtime/query/tooling.d.ts +5 -1
  271. package/dist/runtime/query/tooling.d.ts.map +1 -1
  272. package/dist/runtime/query/tooling.js +5 -0
  273. package/dist/runtime/query/tooling.js.map +1 -1
  274. package/dist/scheduler/completion-inbox.d.ts +49 -0
  275. package/dist/scheduler/completion-inbox.d.ts.map +1 -1
  276. package/dist/scheduler/completion-inbox.js +122 -2
  277. package/dist/scheduler/completion-inbox.js.map +1 -1
  278. package/dist/store/evidence/compaction-archive.d.ts +109 -0
  279. package/dist/store/evidence/compaction-archive.d.ts.map +1 -0
  280. package/dist/store/evidence/compaction-archive.js +125 -0
  281. package/dist/store/evidence/compaction-archive.js.map +1 -0
  282. package/dist/store/evidence/compaction-provenance.d.ts +7 -0
  283. package/dist/store/evidence/compaction-provenance.d.ts.map +1 -0
  284. package/dist/store/evidence/compaction-provenance.js +49 -0
  285. package/dist/store/evidence/compaction-provenance.js.map +1 -0
  286. package/dist/store/evidence/compaction-text.d.ts +16 -0
  287. package/dist/store/evidence/compaction-text.d.ts.map +1 -0
  288. package/dist/store/evidence/compaction-text.js +51 -0
  289. package/dist/store/evidence/compaction-text.js.map +1 -0
  290. package/dist/store/evidence/disk.d.ts +11 -0
  291. package/dist/store/evidence/disk.d.ts.map +1 -0
  292. package/dist/store/evidence/disk.js +367 -0
  293. package/dist/store/evidence/disk.js.map +1 -0
  294. package/dist/store/evidence/format.d.ts +25 -0
  295. package/dist/store/evidence/format.d.ts.map +1 -0
  296. package/dist/store/evidence/format.js +115 -0
  297. package/dist/store/evidence/format.js.map +1 -0
  298. package/dist/store/evidence/index-page.d.ts +208 -0
  299. package/dist/store/evidence/index-page.d.ts.map +1 -0
  300. package/dist/store/evidence/index-page.js +262 -0
  301. package/dist/store/evidence/index-page.js.map +1 -0
  302. package/dist/store/evidence/io.d.ts +24 -0
  303. package/dist/store/evidence/io.d.ts.map +1 -0
  304. package/dist/store/evidence/io.js +69 -0
  305. package/dist/store/evidence/io.js.map +1 -0
  306. package/dist/store/evidence/linked.d.ts +9 -0
  307. package/dist/store/evidence/linked.d.ts.map +1 -0
  308. package/dist/store/evidence/linked.js +314 -0
  309. package/dist/store/evidence/linked.js.map +1 -0
  310. package/dist/store/evidence/passages.d.ts +15 -0
  311. package/dist/store/evidence/passages.d.ts.map +1 -0
  312. package/dist/store/evidence/passages.js +72 -0
  313. package/dist/store/evidence/passages.js.map +1 -0
  314. package/dist/store/evidence/record-chain.d.ts +42 -0
  315. package/dist/store/evidence/record-chain.d.ts.map +1 -0
  316. package/dist/store/evidence/record-chain.js +111 -0
  317. package/dist/store/evidence/record-chain.js.map +1 -0
  318. package/dist/store/evidence/search-input.d.ts +21 -0
  319. package/dist/store/evidence/search-input.d.ts.map +1 -0
  320. package/dist/store/evidence/search-input.js +44 -0
  321. package/dist/store/evidence/search-input.js.map +1 -0
  322. package/dist/store/evidence/selection.d.ts +9 -0
  323. package/dist/store/evidence/selection.d.ts.map +1 -0
  324. package/dist/store/evidence/selection.js +17 -0
  325. package/dist/store/evidence/selection.js.map +1 -0
  326. package/dist/store/evidence/source-kind.d.ts +11 -0
  327. package/dist/store/evidence/source-kind.d.ts.map +1 -0
  328. package/dist/store/evidence/source-kind.js +26 -0
  329. package/dist/store/evidence/source-kind.js.map +1 -0
  330. package/dist/store/evidence/source-text.d.ts +51 -0
  331. package/dist/store/evidence/source-text.d.ts.map +1 -0
  332. package/dist/store/evidence/source-text.js +213 -0
  333. package/dist/store/evidence/source-text.js.map +1 -0
  334. package/dist/store/evidence/types.d.ts +162 -0
  335. package/dist/store/evidence/types.d.ts.map +1 -0
  336. package/dist/store/evidence/types.js +2 -0
  337. package/dist/store/evidence/types.js.map +1 -0
  338. package/dist/store/memory/disk.d.ts +2 -0
  339. package/dist/store/memory/disk.d.ts.map +1 -1
  340. package/dist/store/memory/disk.js +2 -1
  341. package/dist/store/memory/disk.js.map +1 -1
  342. package/dist/store/run/disk.d.ts +10 -0
  343. package/dist/store/run/disk.d.ts.map +1 -1
  344. package/dist/store/run/disk.js +87 -7
  345. package/dist/store/run/disk.js.map +1 -1
  346. package/dist/store/run/memory.d.ts +1 -0
  347. package/dist/store/run/memory.d.ts.map +1 -1
  348. package/dist/store/run/memory.js +10 -0
  349. package/dist/store/run/memory.js.map +1 -1
  350. package/dist/store/run/tool-executions.d.ts +13 -0
  351. package/dist/store/run/tool-executions.d.ts.map +1 -0
  352. package/dist/store/run/tool-executions.js +99 -0
  353. package/dist/store/run/tool-executions.js.map +1 -0
  354. package/dist/store/session/index.d.ts +2 -0
  355. package/dist/store/session/index.d.ts.map +1 -1
  356. package/dist/store/session/index.js +1 -0
  357. package/dist/store/session/index.js.map +1 -1
  358. package/dist/store/session/sqlite.d.ts +57 -0
  359. package/dist/store/session/sqlite.d.ts.map +1 -0
  360. package/dist/store/session/sqlite.js +430 -0
  361. package/dist/store/session/sqlite.js.map +1 -0
  362. package/dist/tools/builtins/bash.d.ts.map +1 -1
  363. package/dist/tools/builtins/bash.js +4 -10
  364. package/dist/tools/builtins/bash.js.map +1 -1
  365. package/dist/tools/builtins/edit-apply.d.ts +126 -0
  366. package/dist/tools/builtins/edit-apply.d.ts.map +1 -0
  367. package/dist/tools/builtins/edit-apply.js +360 -0
  368. package/dist/tools/builtins/edit-apply.js.map +1 -0
  369. package/dist/tools/builtins/edit.d.ts +143 -1
  370. package/dist/tools/builtins/edit.d.ts.map +1 -1
  371. package/dist/tools/builtins/edit.js +37 -219
  372. package/dist/tools/builtins/edit.js.map +1 -1
  373. package/dist/tools/builtins/index.d.ts +1 -0
  374. package/dist/tools/builtins/index.d.ts.map +1 -1
  375. package/dist/tools/builtins/index.js +9 -3
  376. package/dist/tools/builtins/index.js.map +1 -1
  377. package/dist/tools/builtins/job.d.ts.map +1 -1
  378. package/dist/tools/builtins/job.js +5 -6
  379. package/dist/tools/builtins/job.js.map +1 -1
  380. package/dist/tools/builtins/read-file.d.ts +2 -2
  381. package/dist/tools/builtins/read-file.d.ts.map +1 -1
  382. package/dist/tools/builtins/read-file.js +50 -65
  383. package/dist/tools/builtins/read-file.js.map +1 -1
  384. package/dist/tools/builtins/read-render.d.ts +56 -0
  385. package/dist/tools/builtins/read-render.d.ts.map +1 -0
  386. package/dist/tools/builtins/read-render.js +73 -0
  387. package/dist/tools/builtins/read-render.js.map +1 -0
  388. package/dist/tools/builtins/wait-for-job-bounds.d.ts +67 -0
  389. package/dist/tools/builtins/wait-for-job-bounds.d.ts.map +1 -0
  390. package/dist/tools/builtins/wait-for-job-bounds.js +108 -0
  391. package/dist/tools/builtins/wait-for-job-bounds.js.map +1 -0
  392. package/dist/tools/builtins/wait-for-job.d.ts +6 -0
  393. package/dist/tools/builtins/wait-for-job.d.ts.map +1 -0
  394. package/dist/tools/builtins/wait-for-job.js +162 -0
  395. package/dist/tools/builtins/wait-for-job.js.map +1 -0
  396. package/dist/tools/builtins/write-file.js +7 -2
  397. package/dist/tools/builtins/write-file.js.map +1 -1
  398. package/dist/tools/coordinator/index.d.ts.map +1 -1
  399. package/dist/tools/coordinator/index.js +1 -7
  400. package/dist/tools/coordinator/index.js.map +1 -1
  401. package/dist/tools/defineTool.d.ts +2 -1
  402. package/dist/tools/defineTool.d.ts.map +1 -1
  403. package/dist/tools/defineTool.js +1 -1
  404. package/dist/tools/defineTool.js.map +1 -1
  405. package/dist/tools/file-read-tracker.d.ts.map +1 -1
  406. package/dist/tools/file-read-tracker.js +90 -3
  407. package/dist/tools/file-read-tracker.js.map +1 -1
  408. package/dist/tools/resident-history.d.ts +10 -0
  409. package/dist/tools/resident-history.d.ts.map +1 -0
  410. package/dist/tools/resident-history.js +80 -0
  411. package/dist/tools/resident-history.js.map +1 -0
  412. package/dist/tools/resident-tool-evidence.d.ts +5 -0
  413. package/dist/tools/resident-tool-evidence.d.ts.map +1 -0
  414. package/dist/tools/resident-tool-evidence.js +57 -0
  415. package/dist/tools/resident-tool-evidence.js.map +1 -0
  416. package/dist/types/advisory/config.d.ts +7 -0
  417. package/dist/types/advisory/config.d.ts.map +1 -1
  418. package/dist/types/agent/reactive.d.ts +1 -0
  419. package/dist/types/agent/reactive.d.ts.map +1 -1
  420. package/dist/types/authorization/index.d.ts +9 -9
  421. package/dist/types/authorization/index.d.ts.map +1 -1
  422. package/dist/types/authorization/index.js +1 -1
  423. package/dist/types/authorization/index.js.map +1 -1
  424. package/dist/types/hitl/index.d.ts +4 -0
  425. package/dist/types/hitl/index.d.ts.map +1 -1
  426. package/dist/types/hitl/index.js.map +1 -1
  427. package/dist/types/message/index.d.ts +16 -2
  428. package/dist/types/message/index.d.ts.map +1 -1
  429. package/dist/types/message/index.js +10 -1
  430. package/dist/types/message/index.js.map +1 -1
  431. package/dist/types/provider/chat.d.ts +2 -0
  432. package/dist/types/provider/chat.d.ts.map +1 -1
  433. package/dist/types/provider/stream.d.ts +4 -0
  434. package/dist/types/provider/stream.d.ts.map +1 -1
  435. package/dist/types/run/answer-review.d.ts +34 -3
  436. package/dist/types/run/answer-review.d.ts.map +1 -1
  437. package/dist/types/run/config.d.ts +3 -0
  438. package/dist/types/run/config.d.ts.map +1 -1
  439. package/dist/types/run/entity.d.ts +20 -0
  440. package/dist/types/run/entity.d.ts.map +1 -1
  441. package/dist/types/run/events.d.ts +31 -8
  442. package/dist/types/run/events.d.ts.map +1 -1
  443. package/dist/types/run/events.js.map +1 -1
  444. package/dist/types/run/prepare-step.d.ts +53 -8
  445. package/dist/types/run/prepare-step.d.ts.map +1 -1
  446. package/dist/types/run/store.d.ts +29 -4
  447. package/dist/types/run/store.d.ts.map +1 -1
  448. package/dist/types/run/store.js +0 -28
  449. package/dist/types/run/store.js.map +1 -1
  450. package/dist/types/sandbox/index.d.ts +15 -14
  451. package/dist/types/sandbox/index.d.ts.map +1 -1
  452. package/dist/types/sandbox/index.js.map +1 -1
  453. package/dist/types/tool/index.d.ts +124 -1
  454. package/dist/types/tool/index.d.ts.map +1 -1
  455. package/dist/types/tool/index.js.map +1 -1
  456. package/dist/utils/await-with-abort.d.ts +8 -0
  457. package/dist/utils/await-with-abort.d.ts.map +1 -0
  458. package/dist/utils/await-with-abort.js +28 -0
  459. package/dist/utils/await-with-abort.js.map +1 -0
  460. package/dist/utils/env.d.ts +19 -0
  461. package/dist/utils/env.d.ts.map +1 -0
  462. package/dist/utils/env.js +25 -0
  463. package/dist/utils/env.js.map +1 -0
  464. package/dist/utils/evidence-time.d.ts +3 -0
  465. package/dist/utils/evidence-time.d.ts.map +1 -0
  466. package/dist/utils/evidence-time.js +10 -0
  467. package/dist/utils/evidence-time.js.map +1 -0
  468. package/dist/utils/evidence-tokens.d.ts +13 -0
  469. package/dist/utils/evidence-tokens.d.ts.map +1 -0
  470. package/dist/utils/evidence-tokens.js +29 -0
  471. package/dist/utils/evidence-tokens.js.map +1 -0
  472. package/package.json +1 -1
  473. package/src/advisory/executor.ts +15 -30
  474. package/src/advisory/history.ts +126 -0
  475. package/src/advisory/index.ts +5 -1
  476. package/src/agents/ReactiveAgent.ts +3 -0
  477. package/src/agents/runAgent.ts +14 -1
  478. package/src/compaction/manual.ts +30 -2
  479. package/src/compaction/summary.ts +4 -1
  480. package/src/config/runtime.ts +2 -2
  481. package/src/connector/mcp/adapter.ts +20 -6
  482. package/src/contracts/schemas.ts +1 -1
  483. package/src/eval/harness-protection.ts +79 -0
  484. package/src/eval/harness-verification.ts +31 -1
  485. package/src/eval/index.ts +1 -0
  486. package/src/manager/resident/activity.ts +187 -0
  487. package/src/manager/resident/agenda.ts +59 -5
  488. package/src/manager/resident/consumption.ts +311 -0
  489. package/src/manager/resident/evidence-recall.ts +363 -0
  490. package/src/manager/resident/history-disk.ts +63 -0
  491. package/src/manager/resident/history.ts +312 -0
  492. package/src/manager/resident/initiative.ts +13 -3
  493. package/src/manager/resident/learning-cycle.ts +499 -0
  494. package/src/manager/resident/learning-observation.ts +39 -0
  495. package/src/manager/resident/learning-store.ts +813 -0
  496. package/src/manager/resident/learning.ts +132 -8
  497. package/src/manager/resident/store.ts +31 -3
  498. package/src/manager/resident/tool-evidence.ts +412 -0
  499. package/src/manager/run/persistence.ts +18 -0
  500. package/src/plugin/loader.ts +8 -3
  501. package/src/prompt/coding-agent-doctrine.ts +2 -0
  502. package/src/prompt/index.ts +2 -0
  503. package/src/prompt/resident-learning.ts +143 -0
  504. package/src/prompt/resident-step.ts +83 -3
  505. package/src/provider/collect-chat-completion.ts +7 -6
  506. package/src/provider/fallback.ts +2 -1
  507. package/src/provider/stream-text.ts +56 -0
  508. package/src/public-runtime.ts +39 -1
  509. package/src/public-tools.ts +21 -0
  510. package/src/public-types.ts +98 -0
  511. package/src/registry/tool/execute.ts +2 -4
  512. package/src/registry/tool/portable.ts +264 -0
  513. package/src/registry/tool/schema.ts +38 -8
  514. package/src/registry/toolset/catalog.ts +8 -9
  515. package/src/run/LimitChecker.ts +3 -3
  516. package/src/run/evidence-query.ts +333 -0
  517. package/src/run/evidence-recall.ts +854 -0
  518. package/src/run/index.ts +11 -0
  519. package/src/run/json-claim-verifier.ts +298 -0
  520. package/src/run/preparation-context-error.ts +16 -0
  521. package/src/run-query/index.ts +1 -1
  522. package/src/runtime/jobs/awaited-jobs.ts +271 -0
  523. package/src/runtime/jobs/registry.ts +50 -0
  524. package/src/runtime/query/callback-inference.ts +94 -0
  525. package/src/runtime/query/checkpoint.ts +14 -0
  526. package/src/runtime/query/events.ts +22 -0
  527. package/src/runtime/query/executor.ts +100 -10
  528. package/src/runtime/query/file-evidence-context.ts +209 -0
  529. package/src/runtime/query/file-evidence-replay.ts +776 -0
  530. package/src/runtime/query/file-evidence-seed.ts +126 -0
  531. package/src/runtime/query/guard.ts +2 -0
  532. package/src/runtime/query/index.ts +153 -27
  533. package/src/runtime/query/iteration/index.ts +467 -110
  534. package/src/runtime/query/iteration/phases/advisory.ts +3 -0
  535. package/src/runtime/query/iteration/phases/context.ts +12 -0
  536. package/src/runtime/query/iteration/phases/tool-review.ts +7 -0
  537. package/src/runtime/query/iteration/provider-rejected-image.ts +6 -1
  538. package/src/runtime/query/iteration/stream-turn.ts +35 -8
  539. package/src/runtime/query/plugin-hooks.ts +20 -0
  540. package/src/runtime/query/repeat-call.ts +28 -18
  541. package/src/runtime/query/resume-pending.ts +65 -40
  542. package/src/runtime/query/review-policy.ts +13 -9
  543. package/src/runtime/query/sandbox-lifecycle.ts +3 -0
  544. package/src/runtime/query/steering.ts +11 -0
  545. package/src/runtime/query/tool-output-budget.ts +65 -13
  546. package/src/runtime/query/tooling.ts +10 -1
  547. package/src/scheduler/completion-inbox.ts +124 -2
  548. package/src/store/evidence/compaction-archive.ts +139 -0
  549. package/src/store/evidence/compaction-provenance.ts +52 -0
  550. package/src/store/evidence/compaction-text.ts +61 -0
  551. package/src/store/evidence/disk.ts +461 -0
  552. package/src/store/evidence/format.ts +126 -0
  553. package/src/store/evidence/index-page.ts +292 -0
  554. package/src/store/evidence/io.ts +95 -0
  555. package/src/store/evidence/linked.ts +365 -0
  556. package/src/store/evidence/passages.ts +88 -0
  557. package/src/store/evidence/record-chain.ts +108 -0
  558. package/src/store/evidence/search-input.ts +62 -0
  559. package/src/store/evidence/selection.ts +25 -0
  560. package/src/store/evidence/source-kind.ts +36 -0
  561. package/src/store/evidence/source-text.ts +285 -0
  562. package/src/store/evidence/types.ts +177 -0
  563. package/src/store/memory/disk.ts +4 -1
  564. package/src/store/run/disk.ts +110 -8
  565. package/src/store/run/memory.ts +10 -0
  566. package/src/store/run/tool-executions.ts +112 -0
  567. package/src/store/session/index.ts +2 -0
  568. package/src/store/session/sqlite.ts +584 -0
  569. package/src/tools/builtins/bash.ts +4 -10
  570. package/src/tools/builtins/edit-apply.ts +456 -0
  571. package/src/tools/builtins/edit.ts +39 -270
  572. package/src/tools/builtins/index.ts +9 -3
  573. package/src/tools/builtins/job.ts +5 -6
  574. package/src/tools/builtins/read-file.ts +56 -77
  575. package/src/tools/builtins/read-render.ts +104 -0
  576. package/src/tools/builtins/wait-for-job-bounds.ts +179 -0
  577. package/src/tools/builtins/wait-for-job.ts +184 -0
  578. package/src/tools/builtins/write-file.ts +7 -2
  579. package/src/tools/coordinator/index.ts +1 -7
  580. package/src/tools/defineTool.ts +4 -2
  581. package/src/tools/file-read-tracker.ts +86 -2
  582. package/src/tools/resident-history.ts +86 -0
  583. package/src/tools/resident-tool-evidence.ts +68 -0
  584. package/src/types/advisory/config.ts +7 -0
  585. package/src/types/agent/reactive.ts +1 -0
  586. package/src/types/authorization/index.ts +2 -2
  587. package/src/types/hitl/index.ts +4 -0
  588. package/src/types/message/index.ts +22 -0
  589. package/src/types/provider/chat.ts +2 -0
  590. package/src/types/provider/stream.ts +4 -0
  591. package/src/types/run/answer-review.ts +34 -3
  592. package/src/types/run/config.ts +3 -0
  593. package/src/types/run/entity.ts +21 -0
  594. package/src/types/run/events.ts +31 -8
  595. package/src/types/run/prepare-step.ts +59 -8
  596. package/src/types/run/store.ts +35 -4
  597. package/src/types/sandbox/index.ts +15 -14
  598. package/src/types/tool/index.ts +123 -1
  599. package/src/utils/await-with-abort.ts +26 -0
  600. package/src/utils/env.ts +23 -0
  601. package/src/utils/evidence-time.ts +9 -0
  602. package/src/utils/evidence-tokens.ts +32 -0
@@ -0,0 +1,187 @@
1
+ import { z } from 'zod'
2
+ import type { ResidentAgendaState } from './agenda.js'
3
+ import { ResidentHistoryPageLimit, type ResidentHistoryReadBudget } from './history-disk.js'
4
+
5
+ /** @experimental An immutable upper boundary; new work requires a new source. */
6
+ export interface ResidentActivityScope {
7
+ readonly tenantId: string
8
+ readonly agentKey: string
9
+ readonly throughRevision: number
10
+ }
11
+
12
+ /** @experimental Admission is authority to inspect an attempt, not proof that it executed. */
13
+ export interface ResidentAdmission {
14
+ readonly revision: number
15
+ readonly pursuitRevision: number
16
+ readonly pursuitId: string
17
+ readonly claimId: string
18
+ readonly step: number
19
+ readonly objective: string
20
+ }
21
+
22
+ /** @experimental Settlement is an agenda decision, not proof of verification or delivery. */
23
+ export interface ResidentSettlement {
24
+ readonly revision: number
25
+ readonly pursuitId: string
26
+ readonly claimId: string
27
+ readonly outcome: 'wait' | 'complete' | 'blocked'
28
+ }
29
+
30
+ /** @experimental Forward pages; cursor is the next revision to inspect, initially 1. */
31
+ export interface ResidentActivityOptions {
32
+ readonly cursor?: number
33
+ readonly maxRevisions?: number
34
+ readonly maxReadBytes?: number
35
+ }
36
+
37
+ /** @experimental Gaps stay explicit; counts cover only the scanned revision range. */
38
+ export interface ResidentActivityPage {
39
+ readonly scope: ResidentActivityScope
40
+ readonly fromRevision: number
41
+ readonly throughRevision: number
42
+ readonly nextCursor: number | null
43
+ readonly scannedBytes: number
44
+ readonly unavailableRevisions: readonly number[]
45
+ readonly admissions: readonly ResidentAdmission[]
46
+ readonly settlements: readonly ResidentSettlement[]
47
+ readonly archivedPursuits: readonly string[]
48
+ }
49
+
50
+ /** @experimental A backend must enforce scope, cancellation and read bounds. */
51
+ export interface ResidentActivitySource {
52
+ readonly scope: ResidentActivityScope
53
+ read(options?: ResidentActivityOptions, signal?: AbortSignal): Promise<ResidentActivityPage>
54
+ }
55
+
56
+ /** Internal adapter for the immutable disk agenda. */
57
+ export function createResidentActivitySource(
58
+ scopeInput: ResidentActivityScope,
59
+ load: (revision: number, budget: ResidentHistoryReadBudget) => Promise<ResidentAgendaState>,
60
+ ): ResidentActivitySource {
61
+ const scope = Object.freeze(
62
+ z
63
+ .object({
64
+ tenantId: z.string().uuid(),
65
+ agentKey: z.string().min(1).max(200),
66
+ throughRevision: z.number().int().positive().safe(),
67
+ })
68
+ .parse(scopeInput),
69
+ )
70
+ return {
71
+ scope,
72
+ async read(options: ResidentActivityOptions = {}, signal?: AbortSignal) {
73
+ const from = z
74
+ .number()
75
+ .int()
76
+ .positive()
77
+ .max(scope.throughRevision)
78
+ .parse(options.cursor ?? 1)
79
+ const count = z
80
+ .number()
81
+ .int()
82
+ .positive()
83
+ .max(32)
84
+ .parse(options.maxRevisions ?? 32)
85
+ const budget: ResidentHistoryReadBudget = {
86
+ remaining: z
87
+ .number()
88
+ .int()
89
+ .positive()
90
+ .max(8 * 1024 * 1024)
91
+ .parse(options.maxReadBytes ?? 8 * 1024 * 1024),
92
+ bytesRead: 0,
93
+ signal,
94
+ }
95
+ const unavailable = new Set<number>()
96
+ const read = async (revision: number) => {
97
+ signal?.throwIfAborted()
98
+ try {
99
+ const state = await load(revision, budget)
100
+ if (
101
+ state.tenantId !== scope.tenantId ||
102
+ state.agentKey !== scope.agentKey ||
103
+ state.revision !== revision
104
+ )
105
+ throw new Error('Resident activity scope mismatch.')
106
+ return state
107
+ } catch (error) {
108
+ signal?.throwIfAborted()
109
+ if (error instanceof ResidentHistoryPageLimit) throw error
110
+ unavailable.add(revision)
111
+ return null
112
+ }
113
+ }
114
+ const admissions: ResidentAdmission[] = []
115
+ const settlements: ResidentSettlement[] = []
116
+ const archivedPursuits: string[] = []
117
+ let through = from - 1
118
+ try {
119
+ let before = from > 1 ? await read(from - 1) : null
120
+ for (
121
+ let revision = from;
122
+ revision <= Math.min(scope.throughRevision, from + count - 1);
123
+ revision++
124
+ ) {
125
+ const after = await read(revision)
126
+ if (before && after) {
127
+ for (const pursuit of after.pursuits) {
128
+ const previous = before.pursuits.find((p) => p.id === pursuit.id)?.state
129
+ const current = pursuit.state
130
+ if (!previous) continue
131
+ if (
132
+ current.revision === previous.revision + 1 &&
133
+ previous.phase !== 'running' &&
134
+ current.phase === 'running' &&
135
+ current.claimId &&
136
+ current.stepsAdmitted === previous.stepsAdmitted + 1
137
+ ) {
138
+ admissions.push({
139
+ revision,
140
+ pursuitRevision: current.revision,
141
+ pursuitId: pursuit.id,
142
+ claimId: current.claimId,
143
+ step: current.stepsAdmitted,
144
+ objective: current.objective,
145
+ })
146
+ }
147
+ if (
148
+ current.revision === previous.revision + 1 &&
149
+ previous.phase === 'running' &&
150
+ previous.claimId &&
151
+ current.phase !== 'running' &&
152
+ current.claimId === null &&
153
+ current.stepsAdmitted === previous.stepsAdmitted
154
+ ) {
155
+ settlements.push({
156
+ revision,
157
+ pursuitId: pursuit.id,
158
+ claimId: previous.claimId,
159
+ outcome: current.phase === 'waiting' ? 'wait' : current.phase,
160
+ })
161
+ }
162
+ }
163
+ if (after.archiveHead === revision)
164
+ for (const pursuit of before.pursuits)
165
+ if (!after.pursuits.some((p) => p.id === pursuit.id))
166
+ archivedPursuits.push(pursuit.id)
167
+ }
168
+ through = revision
169
+ before = after
170
+ }
171
+ } catch (error) {
172
+ if (!(error instanceof ResidentHistoryPageLimit)) throw error
173
+ }
174
+ return {
175
+ scope,
176
+ fromRevision: from,
177
+ throughRevision: through,
178
+ nextCursor: through < scope.throughRevision ? through + 1 : null,
179
+ scannedBytes: budget.bytesRead,
180
+ unavailableRevisions: [...unavailable],
181
+ admissions,
182
+ settlements,
183
+ archivedPursuits,
184
+ }
185
+ },
186
+ }
187
+ }
@@ -1,10 +1,10 @@
1
1
  import { randomUUID } from 'node:crypto'
2
- import { join } from 'node:path'
2
+ import { join, resolve } from 'node:path'
3
3
  import { isDeepStrictEqual } from 'node:util'
4
4
  import { z } from 'zod'
5
5
  import { DiskRecordStore } from '../../store/kv/record-store.js'
6
6
  import { DiskRevisionRecordStore } from '../../store/kv/revision-record-store.js'
7
- import { defineSchema } from '../../store/schema.js'
7
+ import { defineSchema, migrate } from '../../store/schema.js'
8
8
  import type { TenantId } from '../../types/ids/index.js'
9
9
  import { asTenantId } from '../../utils/id.js'
10
10
  import {
@@ -20,6 +20,9 @@ import {
20
20
  wakeResidentState,
21
21
  } from './store.js'
22
22
 
23
+ import { type ResidentActivitySource, createResidentActivitySource } from './activity.js'
24
+ import { readResidentHistoryRecord } from './history-disk.js'
25
+ import { type ResidentHistorySource, createResidentHistorySource } from './history.js'
23
26
  import {
24
27
  type ResidentFeedback,
25
28
  type ResidentObservation,
@@ -186,12 +189,13 @@ export interface ResidentArchiveListOptions {
186
189
 
187
190
  const agendaRecordSchema = defineSchema({
188
191
  kind: 'resident-agenda',
189
- current: 5,
192
+ current: 6,
190
193
  migrations: {
191
194
  1: (record) => record,
192
195
  2: (record) => record,
193
196
  3: (record) => record,
194
197
  4: (record) => record,
198
+ 5: (record) => record,
195
199
  },
196
200
  })
197
201
 
@@ -254,10 +258,12 @@ export class DiskResidentAgenda implements ResidentAgendaStore {
254
258
  'resident agenda',
255
259
  (record) => record.revision,
256
260
  )
257
- private readonly history = new DiskRecordStore<ResidentAgendaState>(agendaRecordSchema)
261
+ private readonly historyRecords = new DiskRecordStore<ResidentAgendaState>(agendaRecordSchema)
258
262
  private readonly location
259
263
  private readonly tenantId: TenantId
260
264
  private readonly agentKey: string
265
+ private readonly historyRoot: string
266
+ private readonly historyRevisions: string
261
267
 
262
268
  constructor(root: string, scope: { tenantId: TenantId; agentKey: string }) {
263
269
  this.tenantId = asTenantId(scope.tenantId)
@@ -268,6 +274,8 @@ export class DiskResidentAgenda implements ResidentAgendaStore {
268
274
  revisionsDir: join(directory, 'revisions'),
269
275
  publishLegacyProjection: false,
270
276
  }
277
+ this.historyRoot = resolve(root)
278
+ this.historyRevisions = resolve(this.location.revisionsDir)
271
279
  }
272
280
 
273
281
  private checked(record: ResidentAgendaState): ResidentAgendaState {
@@ -301,13 +309,59 @@ export class DiskResidentAgenda implements ResidentAgendaStore {
301
309
  /** Read one authoritative immutable commit, never the compatibility projection. */
302
310
  async readRevision(revision: number): Promise<ResidentAgendaState | null> {
303
311
  z.number().int().positive().safe().parse(revision)
304
- const record = await this.history.read(join(this.location.revisionsDir, `${revision}.json`))
312
+ const record = await this.historyRecords.read(
313
+ join(this.location.revisionsDir, `${revision}.json`),
314
+ )
305
315
  if (record === null) return null
306
316
  const state = this.checked(record)
307
317
  if (state.revision !== revision) throw new Error('Agenda revision filename and body disagree.')
308
318
  return state
309
319
  }
310
320
 
321
+ /**
322
+ * Bind bounded historical reads to this pursuit and a host-selected upper
323
+ * agenda revision (normally ResidentStepContext.agendaRevision). No I/O or
324
+ * inference occurs until search/read; the boundary never advances itself.
325
+ */
326
+ history(pursuit: ResidentState, throughRevision: number): ResidentHistorySource {
327
+ const state = residentStateSchema.parse(pursuit)
328
+ if (state.tenantId !== this.tenantId || state.agentKey !== this.agentKey || !state.pursuitId)
329
+ throw new Error('History requires a pursuit belonging to this resident agenda.')
330
+ z.number().int().positive().safe().parse(throughRevision)
331
+ return createResidentHistorySource(
332
+ {
333
+ tenantId: this.tenantId,
334
+ agentKey: this.agentKey,
335
+ pursuitId: state.pursuitId,
336
+ throughRevision,
337
+ },
338
+ state,
339
+ async (revision, budget) => {
340
+ const raw = await readResidentHistoryRecord(
341
+ this.historyRoot,
342
+ join(this.historyRevisions, `${revision}.json`),
343
+ budget,
344
+ )
345
+ return this.checked(migrate<ResidentAgendaState>(agendaRecordSchema, raw))
346
+ },
347
+ )
348
+ }
349
+
350
+ /** @experimental Bounded admission/settlement history, including archived pursuits. */
351
+ activity(throughRevision: number): ResidentActivitySource {
352
+ return createResidentActivitySource(
353
+ { tenantId: this.tenantId, agentKey: this.agentKey, throughRevision },
354
+ async (revision, budget) => {
355
+ const raw = await readResidentHistoryRecord(
356
+ this.historyRoot,
357
+ join(this.historyRevisions, `${revision}.json`),
358
+ budget,
359
+ )
360
+ return this.checked(migrate<ResidentAgendaState>(agendaRecordSchema, raw))
361
+ },
362
+ )
363
+ }
364
+
311
365
  private retire(state: ResidentAgendaState, input: ResidentArchiveRequest): ResidentAgendaState {
312
366
  const request = archiveRequestSchema.parse(input)
313
367
  const pursuits = new Set(request.pursuitIds)
@@ -0,0 +1,311 @@
1
+ import { z } from 'zod'
2
+ import type {
3
+ ResidentActivityScope,
4
+ ResidentActivitySource,
5
+ ResidentAdmission,
6
+ ResidentSettlement,
7
+ } from './activity.js'
8
+
9
+ const count = z.number().int().nonnegative().safe()
10
+ const uuidKey = (id: string) => id.toLowerCase()
11
+ const admissionSchema = z.object({
12
+ revision: count.positive(),
13
+ pursuitRevision: count.positive(),
14
+ pursuitId: z.string().uuid(),
15
+ claimId: z.string().uuid(),
16
+ step: count.positive(),
17
+ objective: z.string().min(1).max(8000),
18
+ })
19
+ const settlementSchema = z.object({
20
+ revision: count.positive(),
21
+ pursuitId: z.string().uuid(),
22
+ claimId: z.string().uuid(),
23
+ outcome: z.enum(['wait', 'complete', 'blocked']),
24
+ })
25
+ const receiptSchema = z
26
+ .object({
27
+ runId: z.string().uuid(),
28
+ /** Own usage includes retry and side-call spend; never add cache buckets again. */
29
+ ownTokens: count.nullable(),
30
+ treeTokens: count.nullable(),
31
+ ownCostUsd: z.number().nonnegative().finite().nullable(),
32
+ unpricedOwnTokens: count.nullable(),
33
+ usageFinal: z.boolean(),
34
+ cleanup: z.enum(['confirmed', 'unconfirmed', 'unknown']),
35
+ verification: z.enum(['recorded', 'unconfigured', 'unconfirmed']),
36
+ })
37
+ .superRefine((receipt, ctx) => {
38
+ if (
39
+ receipt.ownTokens !== null &&
40
+ receipt.treeTokens !== null &&
41
+ receipt.treeTokens < receipt.ownTokens
42
+ )
43
+ ctx.addIssue({ code: z.ZodIssueCode.custom, message: 'Tree usage is below own usage.' })
44
+ if (
45
+ receipt.ownTokens !== null &&
46
+ receipt.unpricedOwnTokens !== null &&
47
+ receipt.unpricedOwnTokens > receipt.ownTokens
48
+ )
49
+ ctx.addIssue({ code: z.ZodIssueCode.custom, message: 'Unpriced usage exceeds own usage.' })
50
+ })
51
+
52
+ /** @experimental Host-authenticated cumulative root receipt. Cost covers this root only. */
53
+ export type ResidentConsumptionReceipt = z.infer<typeof receiptSchema>
54
+
55
+ /** @experimental A host resolves only authoritative admitted claims and bounds each read. */
56
+ export interface ResidentConsumptionResolver {
57
+ /** Worst-case bytes read per resolution; reserved before calling the adapter. */
58
+ readonly maxReadBytes: number
59
+ resolve(
60
+ admission: ResidentAdmission,
61
+ signal?: AbortSignal,
62
+ ): Promise<ResidentConsumptionReceipt | null>
63
+ }
64
+
65
+ /** @experimental Bounds the entire inspection, not just each page. No inference or writes. */
66
+ export interface ResidentConsumptionOptions {
67
+ readonly cursor?: number
68
+ readonly maxRevisions?: number
69
+ readonly maxHistoryBytes?: number
70
+ readonly maxReceiptBytes?: number
71
+ }
72
+
73
+ /** @experimental Missing and deferred receipts never establish zero usage. */
74
+ export interface ResidentConsumptionAttempt extends ResidentAdmission {
75
+ readonly settlement: ResidentSettlement | null
76
+ readonly receipt: ResidentConsumptionReceipt | null
77
+ readonly receiptStatus: 'available' | 'missing' | 'invalid' | 'deferred' | 'duplicate-run'
78
+ }
79
+
80
+ /** @experimental An evidence projection, not a bill or an enforced spending cap. */
81
+ export interface ResidentConsumptionReport {
82
+ readonly scope: ResidentActivityScope
83
+ readonly fromRevision: number
84
+ readonly throughRevision: number
85
+ readonly nextCursor: number | null
86
+ readonly historyComplete: boolean
87
+ readonly unavailableRevisions: readonly number[]
88
+ readonly historyBytes: number
89
+ readonly receiptBytesReserved: number
90
+ readonly archivedPursuits: readonly string[]
91
+ readonly attempts: readonly ResidentConsumptionAttempt[]
92
+ readonly recorded: {
93
+ readonly ownTokens: number
94
+ readonly treeTokens: number
95
+ readonly ownCostUsd: number
96
+ readonly unpricedOwnTokens: number
97
+ }
98
+ readonly unknown: {
99
+ readonly ownUsageAttempts: number
100
+ readonly treeUsageAttempts: number
101
+ readonly ownPriceAttempts: number
102
+ }
103
+ /** Requires complete history and final receipts; says nothing about external billing. */
104
+ readonly usageComplete: boolean
105
+ }
106
+
107
+ /**
108
+ * @experimental Inspect cumulative root receipts once per admitted claim. Historical
109
+ * archive/reconcile events never erase consumption. Tree tokens are a separate total:
110
+ * adding them to own tokens would count the root twice. Descendant prices are unknown.
111
+ */
112
+ export async function inspectResidentConsumption(
113
+ source: ResidentActivitySource,
114
+ resolver: ResidentConsumptionResolver,
115
+ options: ResidentConsumptionOptions = {},
116
+ signal?: AbortSignal,
117
+ ): Promise<ResidentConsumptionReport> {
118
+ const scope = z
119
+ .object({
120
+ tenantId: z.string().uuid(),
121
+ agentKey: z.string().min(1).max(200),
122
+ throughRevision: count.positive(),
123
+ })
124
+ .parse(source.scope)
125
+ const from = z
126
+ .number()
127
+ .int()
128
+ .positive()
129
+ .max(scope.throughRevision)
130
+ .parse(options.cursor ?? 1)
131
+ const maxRevisions = z
132
+ .number()
133
+ .int()
134
+ .positive()
135
+ .max(4096)
136
+ .parse(options.maxRevisions ?? 256)
137
+ const maxHistoryBytes = z
138
+ .number()
139
+ .int()
140
+ .positive()
141
+ .max(8 * 1024 * 1024)
142
+ .parse(options.maxHistoryBytes ?? 8 * 1024 * 1024)
143
+ const maxReceiptBytes = z
144
+ .number()
145
+ .int()
146
+ .nonnegative()
147
+ .max(64 * 1024 * 1024)
148
+ .parse(options.maxReceiptBytes ?? 16 * 1024 * 1024)
149
+ const resolutionBytes = z
150
+ .number()
151
+ .int()
152
+ .positive()
153
+ .max(1024 * 1024)
154
+ .parse(resolver.maxReadBytes)
155
+ const admissions = new Map<string, ResidentAdmission>()
156
+ const settlements = new Map<string, ResidentSettlement>()
157
+ const unavailable = new Set<number>()
158
+ const archived = new Map<string, string>()
159
+ let cursor: number | null = from
160
+ let through = from - 1
161
+ let historyBytes = 0
162
+ while (cursor !== null && through - from + 1 < maxRevisions && historyBytes < maxHistoryBytes) {
163
+ signal?.throwIfAborted()
164
+ const page = await source.read(
165
+ {
166
+ cursor,
167
+ maxRevisions: Math.min(32, maxRevisions - (through - from + 1)),
168
+ maxReadBytes: maxHistoryBytes - historyBytes,
169
+ },
170
+ signal,
171
+ )
172
+ signal?.throwIfAborted()
173
+ if (
174
+ page.scope.tenantId !== scope.tenantId ||
175
+ page.scope.agentKey !== scope.agentKey ||
176
+ page.scope.throughRevision !== scope.throughRevision ||
177
+ page.fromRevision !== cursor ||
178
+ !Number.isSafeInteger(page.throughRevision) ||
179
+ page.throughRevision < cursor - 1 ||
180
+ page.throughRevision > Math.min(scope.throughRevision, from + maxRevisions - 1) ||
181
+ !Number.isSafeInteger(page.scannedBytes) ||
182
+ page.scannedBytes < 0 ||
183
+ page.scannedBytes > maxHistoryBytes - historyBytes ||
184
+ page.nextCursor !==
185
+ (page.throughRevision === scope.throughRevision ? null : page.throughRevision + 1)
186
+ )
187
+ throw new Error('Invalid resident activity page.')
188
+ if (
189
+ page.admissions.length > 32 ||
190
+ page.settlements.length > 32 ||
191
+ page.archivedPursuits.length > 1024
192
+ )
193
+ throw new Error('Resident activity page exceeds event bounds.')
194
+ if (page.unavailableRevisions.length > 33) throw new Error('Invalid unavailable revision list.')
195
+ for (const revision of page.unavailableRevisions) {
196
+ count.positive().parse(revision)
197
+ if (revision < Math.max(1, cursor - 1) || revision > page.throughRevision)
198
+ throw new Error('Unavailable revision is outside the page.')
199
+ unavailable.add(revision)
200
+ }
201
+ for (const raw of page.admissions) {
202
+ const admission = Object.freeze(admissionSchema.parse(raw))
203
+ if (admission.revision < cursor || admission.revision > page.throughRevision)
204
+ throw new Error('Resident admission is outside its history page.')
205
+ if (admissions.has(uuidKey(admission.claimId)))
206
+ throw new Error('Duplicate resident admission.')
207
+ admissions.set(uuidKey(admission.claimId), admission)
208
+ }
209
+ for (const raw of page.settlements) {
210
+ const settlement = Object.freeze(settlementSchema.parse(raw))
211
+ if (settlement.revision < cursor || settlement.revision > page.throughRevision)
212
+ throw new Error('Resident settlement is outside its history page.')
213
+ if (settlements.has(uuidKey(settlement.claimId)))
214
+ throw new Error('Duplicate resident settlement.')
215
+ settlements.set(uuidKey(settlement.claimId), settlement)
216
+ }
217
+ for (const id of page.archivedPursuits) archived.set(uuidKey(z.string().uuid().parse(id)), id)
218
+ historyBytes += page.scannedBytes
219
+ through = page.throughRevision
220
+ if (page.nextCursor === cursor) break
221
+ cursor = page.nextCursor
222
+ }
223
+ const attempts: ResidentConsumptionAttempt[] = []
224
+ let receiptBytesReserved = 0
225
+ for (const admission of admissions.values()) {
226
+ signal?.throwIfAborted()
227
+ const settlement = settlements.get(uuidKey(admission.claimId))
228
+ if (
229
+ settlement &&
230
+ (uuidKey(settlement.pursuitId) !== uuidKey(admission.pursuitId) ||
231
+ settlement.revision <= admission.revision)
232
+ )
233
+ throw new Error('Resident settlement does not follow its admitted claim.')
234
+ let receipt: ResidentConsumptionReceipt | null = null
235
+ let receiptStatus: ResidentConsumptionAttempt['receiptStatus'] = 'deferred'
236
+ if (receiptBytesReserved + resolutionBytes <= maxReceiptBytes) {
237
+ receiptBytesReserved += resolutionBytes
238
+ try {
239
+ const value = await resolver.resolve(admission, signal)
240
+ signal?.throwIfAborted()
241
+ receipt = value === null ? null : receiptSchema.parse(value)
242
+ receiptStatus = receipt ? 'available' : 'missing'
243
+ } catch {
244
+ signal?.throwIfAborted()
245
+ receiptStatus = 'invalid'
246
+ }
247
+ }
248
+ attempts.push({
249
+ ...admission,
250
+ settlement: settlements.get(uuidKey(admission.claimId)) ?? null,
251
+ receipt,
252
+ receiptStatus,
253
+ })
254
+ }
255
+ // A copied root receipt must not authenticate two claims. Exclude BOTH records.
256
+ const runCounts = new Map<string, number>()
257
+ for (const { receipt } of attempts)
258
+ if (receipt)
259
+ runCounts.set(uuidKey(receipt.runId), (runCounts.get(uuidKey(receipt.runId)) ?? 0) + 1)
260
+ const checked = attempts.map((attempt) =>
261
+ attempt.receipt && (runCounts.get(uuidKey(attempt.receipt.runId)) ?? 0) > 1
262
+ ? { ...attempt, receipt: null, receiptStatus: 'duplicate-run' as const }
263
+ : attempt,
264
+ )
265
+ const recorded = { ownTokens: 0, treeTokens: 0, ownCostUsd: 0, unpricedOwnTokens: 0 }
266
+ const unknown = { ownUsageAttempts: 0, treeUsageAttempts: 0, ownPriceAttempts: 0 }
267
+ const add = (a: number, b: number) => {
268
+ const result = a + b
269
+ if (!Number.isSafeInteger(result))
270
+ throw new Error('Resident consumption exceeds the safe integer range.')
271
+ return result
272
+ }
273
+ let priceCorrection = 0
274
+ for (const { receipt } of checked) {
275
+ if (!receipt?.usageFinal || receipt.ownTokens === null) unknown.ownUsageAttempts++
276
+ if (!receipt?.usageFinal || receipt.treeTokens === null) unknown.treeUsageAttempts++
277
+ if (
278
+ !receipt?.usageFinal ||
279
+ receipt.ownCostUsd === null ||
280
+ receipt.unpricedOwnTokens === null ||
281
+ receipt.unpricedOwnTokens > 0
282
+ )
283
+ unknown.ownPriceAttempts++
284
+ recorded.ownTokens = add(recorded.ownTokens, receipt?.ownTokens ?? 0)
285
+ recorded.treeTokens = add(recorded.treeTokens, receipt?.treeTokens ?? 0)
286
+ recorded.unpricedOwnTokens = add(recorded.unpricedOwnTokens, receipt?.unpricedOwnTokens ?? 0)
287
+ // Compensated addition limits drift; provider prices are still estimates, not a bill.
288
+ const y = (receipt?.ownCostUsd ?? 0) - priceCorrection
289
+ const next = recorded.ownCostUsd + y
290
+ priceCorrection = next - recorded.ownCostUsd - y
291
+ if (!Number.isFinite(next)) throw new Error('Resident cost exceeds the supported range.')
292
+ recorded.ownCostUsd = next
293
+ }
294
+ const historyComplete = from === 1 && cursor === null && unavailable.size === 0
295
+ return {
296
+ scope,
297
+ fromRevision: from,
298
+ throughRevision: through,
299
+ nextCursor: cursor,
300
+ historyComplete,
301
+ unavailableRevisions: [...unavailable],
302
+ historyBytes,
303
+ receiptBytesReserved,
304
+ archivedPursuits: [...archived.values()],
305
+ attempts: checked,
306
+ recorded,
307
+ unknown,
308
+ usageComplete:
309
+ historyComplete && unknown.ownUsageAttempts === 0 && unknown.treeUsageAttempts === 0,
310
+ }
311
+ }