@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,412 @@
1
+ import { z } from 'zod'
2
+ import {
3
+ evidenceSearchInput,
4
+ evidenceTermRefinement,
5
+ evidenceTermsSchema,
6
+ } from '../../store/evidence/search-input.js'
7
+ import { evidenceExclusionsSchema } from '../../store/evidence/selection.js'
8
+ import type {
9
+ RunEvidenceReadOptions,
10
+ RunEvidenceReadResult,
11
+ RunEvidenceSearchResult,
12
+ RunEvidenceSource,
13
+ } from '../../store/evidence/types.js'
14
+ import type {
15
+ ResidentHistoryMatch,
16
+ ResidentHistoryScope,
17
+ ResidentHistorySource,
18
+ } from './history.js'
19
+
20
+ /** @experimental Host authority for one pursuit, project and admission boundary. */
21
+ export interface ResidentToolEvidenceScope extends ResidentHistoryScope {
22
+ readonly projectId: string
23
+ }
24
+ /** @experimental Identity of an agenda-verified settlement, not a fabricated transcript. */
25
+ export type ResidentSettledInvocation = Pick<
26
+ ResidentHistoryMatch,
27
+ 'revision' | 'claimId' | 'step' | 'kind'
28
+ >
29
+ /** @experimental Settlement is checked before the host resolves the attempt's invocation. */
30
+ export interface ResidentToolEvidenceOptions {
31
+ readonly history: ResidentHistorySource
32
+ readonly projectId: string
33
+ /** Host-enforced upper bound for resolveRun's document reads, charged in full.
34
+ * Required only when an operation supplies maxReadBytes. Zero asserts no
35
+ * document reads. This is a declared bound, not a measured receipt.
36
+ */
37
+ readonly resolutionReadBytes?: number
38
+ readonly resolveRun: (
39
+ settled: ResidentSettledInvocation,
40
+ signal?: AbortSignal,
41
+ ) => Promise<RunEvidenceSource>
42
+ }
43
+ /** @experimental An optional shared ceiling covers history, resolution and run evidence. */
44
+ export interface ResidentToolEvidenceSearchOptions {
45
+ readonly query?: string
46
+ /** Token discovery: 1–16 terms, matched case-insensitively. Combined query/filter JSON ≤512 UTF-8 bytes. */
47
+ readonly terms?: readonly string[]
48
+ /** Omit successful retrieval copies before they consume candidate slots. */
49
+ readonly excludeSuccessfulTools?: readonly string[]
50
+ /** Omit query/terms/filter to continue the exact captured search. */
51
+ readonly cursor?: string
52
+ /** With a token cursor, continue using a strict subset of its terms. Requires
53
+ * supportsTermRefinement. Scope, exclusions and the original cursor stay intact.
54
+ */
55
+ readonly refineTerms?: readonly string[]
56
+ readonly maxReadBytes?: number
57
+ }
58
+ /** @experimental Tool records from at most one settled invocation per bounded search page. */
59
+ export interface ResidentToolEvidenceSearchResult {
60
+ readonly scope: ResidentToolEvidenceScope
61
+ readonly revision: number | null
62
+ readonly claimId: string | null
63
+ readonly evidence: RunEvidenceSearchResult | null
64
+ readonly nextCursor: string | null
65
+ readonly incomplete: boolean
66
+ readonly unavailableRevisions: readonly number[]
67
+ readonly historyBytes: number
68
+ /** Present for bounded calls: history + declared resolution + run reads.
69
+ * Failed source reads without a receipt conservatively consume the remainder.
70
+ */
71
+ readonly chargedBytes?: number
72
+ }
73
+ /** @experimental The revision is authorized anew on every read, including after restart. */
74
+ export interface ResidentToolEvidenceReadOptions
75
+ extends Omit<RunEvidenceReadOptions, 'maxReadBytes'> {
76
+ readonly revision: number
77
+ /** Shared operation ceiling, at most 8 MiB; reserves at least 1 MiB for run reads. */
78
+ readonly maxReadBytes?: number
79
+ }
80
+ /** @experimental Exact invocation text plus the settled claim that authorized access. */
81
+ export interface ResidentToolEvidenceReadResult extends RunEvidenceReadResult {
82
+ readonly revision: number
83
+ readonly claimId: string
84
+ readonly chargedBytes?: number
85
+ }
86
+ /** @experimental A host must bind tool access to the executing run, not just this source. */
87
+ export interface ResidentToolEvidenceSource {
88
+ readonly scope: ResidentToolEvidenceScope
89
+ readonly supportsTermRefinement?: boolean
90
+ search(
91
+ options?: ResidentToolEvidenceSearchOptions,
92
+ signal?: AbortSignal,
93
+ ): Promise<ResidentToolEvidenceSearchResult>
94
+ read(
95
+ options: ResidentToolEvidenceReadOptions,
96
+ signal?: AbortSignal,
97
+ ): Promise<ResidentToolEvidenceReadResult>
98
+ }
99
+
100
+ /** @experimental Reuses the immutable agenda boundary; it never enumerates arbitrary sessions. */
101
+ export function createResidentToolEvidenceSource(
102
+ options: ResidentToolEvidenceOptions,
103
+ ): ResidentToolEvidenceSource {
104
+ const { history, resolveRun } = options
105
+ const resolutionReadBytes = z
106
+ .number()
107
+ .int()
108
+ .min(0)
109
+ .max(8 * 1024 * 1024)
110
+ .optional()
111
+ .parse(options.resolutionReadBytes)
112
+ function operationBudget(maxReadBytes: number | undefined) {
113
+ if (maxReadBytes === undefined) return undefined
114
+ if (resolutionReadBytes === undefined)
115
+ throw new Error('Bounded resident retrieval requires a declared resolution read bound.')
116
+ const limit = z
117
+ .number()
118
+ .int()
119
+ .positive()
120
+ .max(8 * 1024 * 1024)
121
+ .parse(maxReadBytes)
122
+ const historyLimit = limit - resolutionReadBytes - 1024 * 1024
123
+ if (historyLimit < 1)
124
+ throw new Error('Resident read budget cannot fit history, resolution and run reads.')
125
+ let charged = 0
126
+ return {
127
+ historyLimit,
128
+ get remaining() {
129
+ return limit - charged
130
+ },
131
+ get chargedBytes() {
132
+ return charged
133
+ },
134
+ charge(bytes: number, allowance: number) {
135
+ if (
136
+ !Number.isSafeInteger(bytes) ||
137
+ bytes < 0 ||
138
+ bytes > allowance ||
139
+ charged + bytes > limit
140
+ )
141
+ throw new Error('Resident evidence returned an invalid read budget receipt.')
142
+ charged += bytes
143
+ },
144
+ resolve() {
145
+ charged += resolutionReadBytes
146
+ },
147
+ exhaust() {
148
+ charged = limit
149
+ },
150
+ }
151
+ }
152
+ const scope = Object.freeze({
153
+ ...history.scope,
154
+ projectId: z.string().uuid().parse(options.projectId),
155
+ })
156
+ const revision = z.number().int().min(1).max(scope.throughRevision).safe()
157
+ const searchSchema = z
158
+ .object({
159
+ query: z.string().max(256).optional(),
160
+ terms: evidenceTermsSchema,
161
+ excludeSuccessfulTools: evidenceExclusionsSchema.optional(),
162
+ })
163
+ .strict()
164
+ function searchInput(value: unknown) {
165
+ const parsed = searchSchema.parse(value)
166
+ const search = evidenceSearchInput({
167
+ ...parsed,
168
+ ...(parsed.terms ? { matchMode: 'token' as const } : {}),
169
+ })
170
+ const result: z.infer<typeof searchSchema> = {
171
+ ...(search.terms ? { terms: search.terms } : { query: search.query }),
172
+ ...(parsed.excludeSuccessfulTools?.length
173
+ ? { excludeSuccessfulTools: [...new Set(parsed.excludeSuccessfulTools)].sort() }
174
+ : {}),
175
+ }
176
+ if (
177
+ (search.terms || result.excludeSuccessfulTools) &&
178
+ Buffer.byteLength(JSON.stringify(result)) > 512
179
+ )
180
+ throw new Error('Resident search terms and filters exceed 512 UTF-8 bytes.')
181
+ return result
182
+ }
183
+ const cursorBase = {
184
+ scope: z.literal(JSON.stringify(scope)),
185
+ revision,
186
+ runCursor: z.string().max(4096).optional(),
187
+ }
188
+ const cursorSchema = z.discriminatedUnion('version', [
189
+ z.object({ ...cursorBase, version: z.literal(1), query: z.string().max(256) }).strict(),
190
+ z.object({ ...cursorBase, version: z.literal(2), search: searchSchema }).strict(),
191
+ ])
192
+ const encode = (value: z.infer<typeof cursorSchema>) => {
193
+ const encoded = Buffer.from(JSON.stringify(cursorSchema.parse(value))).toString('base64url')
194
+ if (encoded.length > 8192) throw new Error('Resident continuation exceeds its encoded bound.')
195
+ return encoded
196
+ }
197
+ async function run(entry: ResidentSettledInvocation, signal?: AbortSignal) {
198
+ signal?.throwIfAborted()
199
+ const source = await resolveRun(entry, signal)
200
+ signal?.throwIfAborted()
201
+ if (source.scope.tenantId !== scope.tenantId || source.scope.projectId !== scope.projectId)
202
+ throw new Error('Historical invocation belongs to a different owner.')
203
+ const owner = z
204
+ .object({
205
+ tenantId: z.string().uuid(),
206
+ projectId: z.string().uuid(),
207
+ sessionId: z.string().uuid(),
208
+ runId: z.string().uuid(),
209
+ })
210
+ .parse(source.scope)
211
+ return { source, owner }
212
+ }
213
+ function assertOwner(
214
+ page: { scope: RunEvidenceSource['scope'] },
215
+ owner: RunEvidenceSource['scope'],
216
+ signal?: AbortSignal,
217
+ ) {
218
+ signal?.throwIfAborted()
219
+ if (
220
+ !page?.scope ||
221
+ Object.entries(owner).some(([key, value]) => page.scope[key as keyof typeof owner] !== value)
222
+ )
223
+ throw new Error('Historical evidence result belongs to a different owner.')
224
+ }
225
+ return Object.freeze({
226
+ scope,
227
+ supportsTermRefinement: true,
228
+ async search(input: ResidentToolEvidenceSearchOptions = {}, signal?: AbortSignal) {
229
+ signal?.throwIfAborted()
230
+ const budget = operationBudget(input.maxReadBytes)
231
+ const prior = input.cursor
232
+ ? cursorSchema.parse(
233
+ JSON.parse(
234
+ Buffer.from(z.string().max(8192).parse(input.cursor), 'base64url').toString('utf8'),
235
+ ),
236
+ )
237
+ : undefined
238
+ const supplied =
239
+ input.query !== undefined ||
240
+ input.terms !== undefined ||
241
+ input.excludeSuccessfulTools !== undefined
242
+ const previous = prior
243
+ ? searchInput(prior.version === 1 ? { query: prior.query } : prior.search)
244
+ : undefined
245
+ const search =
246
+ supplied || !previous
247
+ ? searchInput({
248
+ ...(input.query !== undefined ? { query: input.query } : {}),
249
+ ...(input.terms !== undefined ? { terms: input.terms } : {}),
250
+ ...(input.excludeSuccessfulTools !== undefined
251
+ ? { excludeSuccessfulTools: input.excludeSuccessfulTools }
252
+ : {}),
253
+ })
254
+ : previous
255
+ if (previous && JSON.stringify(previous) !== JSON.stringify(search))
256
+ throw new Error('Resident tool search query changed.')
257
+ const refined =
258
+ input.refineTerms !== undefined
259
+ ? searchInput({
260
+ terms: evidenceTermRefinement(
261
+ {
262
+ terms: search.terms,
263
+ cursor: input.cursor,
264
+ matchMode: 'token',
265
+ caseSensitive: false,
266
+ },
267
+ input.refineTerms,
268
+ ),
269
+ excludeSuccessfulTools: search.excludeSuccessfulTools,
270
+ })
271
+ : undefined
272
+ const cursor: z.infer<typeof cursorSchema> =
273
+ prior ??
274
+ (search.terms || search.excludeSuccessfulTools
275
+ ? {
276
+ version: 2 as const,
277
+ scope: JSON.stringify(scope),
278
+ search,
279
+ revision: scope.throughRevision,
280
+ }
281
+ : {
282
+ version: 1 as const,
283
+ scope: JSON.stringify(scope),
284
+ query: search.query ?? '',
285
+ revision: scope.throughRevision,
286
+ })
287
+ let selected: ResidentSettledInvocation | null = null
288
+ const advancedCursor = refined ? { ...cursor, version: 2 as const, search: refined } : cursor
289
+ let nextRevision: number | null = null
290
+ let historyBytes = 0
291
+ const unavailable = new Set<number>()
292
+ if (cursor.runCursor) {
293
+ const page = await history.read(
294
+ {
295
+ revision: cursor.revision,
296
+ part: 0,
297
+ ...(budget ? { maxReadBytes: budget.historyLimit } : {}),
298
+ },
299
+ signal,
300
+ )
301
+ signal?.throwIfAborted()
302
+ budget?.charge(page.scannedBytes, budget.historyLimit)
303
+ selected = page.entry
304
+ historyBytes += page.scannedBytes
305
+ for (const missing of page.unavailableRevisions) unavailable.add(missing)
306
+ nextRevision = cursor.revision > 2 ? cursor.revision - 1 : null
307
+ } else {
308
+ const page = await history.search(
309
+ {
310
+ cursor: cursor.revision,
311
+ limit: 1,
312
+ ...(budget ? { maxReadBytes: budget.historyLimit } : {}),
313
+ },
314
+ signal,
315
+ )
316
+ signal?.throwIfAborted()
317
+ budget?.charge(page.scannedBytes, budget.historyLimit)
318
+ historyBytes += page.scannedBytes
319
+ for (const missing of page.unavailableRevisions) unavailable.add(missing)
320
+ nextRevision = page.nextCursor
321
+ const match = page.matches[0]
322
+ // Browse always selects the settled summary (part 0). The bounded history
323
+ // source has already verified both sides of this settlement transition.
324
+ if (match) selected = match
325
+ }
326
+ let evidence: RunEvidenceSearchResult | null = null
327
+ if (selected) {
328
+ try {
329
+ budget?.resolve()
330
+ const { source, owner } = await run(selected, signal)
331
+ const narrowAtCursor =
332
+ !!refined && !!cursor.runCursor && source.supportsTermRefinement === true
333
+ const page = await source.search(
334
+ {
335
+ ...(refined && !narrowAtCursor ? refined : search),
336
+ ...(search.terms ? { matchMode: 'token' as const, caseSensitive: false } : {}),
337
+ ...(cursor.runCursor && (!refined || narrowAtCursor)
338
+ ? { cursor: cursor.runCursor }
339
+ : {}),
340
+ ...(narrowAtCursor ? { refineTerms: refined?.terms } : {}),
341
+ ...(budget ? { maxReadBytes: budget.remaining } : {}),
342
+ },
343
+ signal,
344
+ )
345
+ assertOwner(page, owner, signal)
346
+ budget?.charge(page.scannedBytes, budget.remaining)
347
+ evidence = page
348
+ } catch {
349
+ signal?.throwIfAborted()
350
+ // A throwing host/source returned no reliable byte receipt. The
351
+ // caller must not reuse that allowance for another automatic page.
352
+ budget?.exhaust()
353
+ unavailable.add(selected.revision)
354
+ }
355
+ }
356
+ const nextCursor =
357
+ evidence?.nextCursor && selected
358
+ ? encode({
359
+ ...advancedCursor,
360
+ revision: selected.revision,
361
+ runCursor: evidence.nextCursor,
362
+ })
363
+ : nextRevision
364
+ ? encode({ ...advancedCursor, revision: nextRevision, runCursor: undefined })
365
+ : null
366
+ return {
367
+ scope,
368
+ revision: selected?.revision ?? null,
369
+ claimId: selected?.claimId ?? null,
370
+ evidence,
371
+ nextCursor,
372
+ incomplete: unavailable.size > 0 || !!evidence?.incomplete || nextCursor !== null,
373
+ unavailableRevisions: [...unavailable],
374
+ historyBytes,
375
+ ...(budget ? { chargedBytes: budget.chargedBytes } : {}),
376
+ }
377
+ },
378
+ async read(input: ResidentToolEvidenceReadOptions, signal?: AbortSignal) {
379
+ signal?.throwIfAborted()
380
+ const budget = operationBudget(input.maxReadBytes)
381
+ const page = await history.read(
382
+ {
383
+ revision: revision.parse(input.revision),
384
+ part: 0,
385
+ ...(budget ? { maxReadBytes: budget.historyLimit } : {}),
386
+ },
387
+ signal,
388
+ )
389
+ signal?.throwIfAborted()
390
+ budget?.charge(page.scannedBytes, budget.historyLimit)
391
+ if (!page.entry) throw new Error('The requested settled claim is unavailable.')
392
+ budget?.resolve()
393
+ const { source, owner } = await run(page.entry, signal)
394
+ const result = await source.read(
395
+ {
396
+ address: input.address,
397
+ ...(input.byteOffset !== undefined ? { byteOffset: input.byteOffset } : {}),
398
+ ...(budget ? { maxReadBytes: budget.remaining } : {}),
399
+ },
400
+ signal,
401
+ )
402
+ assertOwner(result, owner, signal)
403
+ budget?.charge(result.scannedBytes, budget.remaining)
404
+ return {
405
+ ...result,
406
+ revision: page.entry.revision,
407
+ claimId: page.entry.claimId,
408
+ ...(budget ? { chargedBytes: budget.chargedBytes } : {}),
409
+ }
410
+ },
411
+ })
412
+ }
@@ -104,6 +104,12 @@ export class RunPersistence {
104
104
  id: config.runId,
105
105
  status: 'idle',
106
106
  metadata: {
107
+ scope: {
108
+ tenantId: config.tenantId,
109
+ projectId: config.projectId,
110
+ sessionId: config.sessionId,
111
+ runId: config.runId,
112
+ },
107
113
  agentId: config.agentId,
108
114
  agentName: config.agentName,
109
115
  config: config.runConfig,
@@ -483,6 +489,18 @@ export class RunPersistence {
483
489
  this.run.abandonedTaskIds = [...taskIds]
484
490
  }
485
491
 
492
+ /**
493
+ * Name the awaited background jobs this run ended without waiting for.
494
+ *
495
+ * See {@link Run.abandonedJobIds}. The same rule as the task list above:
496
+ * recording, never stopping — what happens to a job is decided by whoever
497
+ * owns it, not by the run that gave up waiting.
498
+ */
499
+ setAbandonedJobIds(jobIds: readonly string[]): void {
500
+ if (jobIds.length === 0) return
501
+ this.run.abandonedJobIds = [...jobIds]
502
+ }
503
+
486
504
  setSteps(steps: readonly StepResult[]): void {
487
505
  this.run.steps = steps
488
506
  }
@@ -268,7 +268,10 @@ export async function discoverAllPluginDirs(
268
268
  const projectRoot = workingDirectory ?? process.cwd()
269
269
  const userRoot = options?.userRoot ?? homedir()
270
270
  const userPluginDir = options?.userRoot ? 'plugins' : USER_PLUGIN_DIR
271
- const sharedRoot = await samePhysicalDirectory(projectRoot, userRoot)
271
+ const sharedRoot = await samePhysicalDirectory(
272
+ join(projectRoot, PROJECT_PLUGIN_DIR),
273
+ join(userRoot, userPluginDir),
274
+ )
272
275
 
273
276
  const [project, user] = await Promise.all([
274
277
  mayScan('project') && !sharedRoot
@@ -290,11 +293,13 @@ export async function discoverAllPluginDirs(
290
293
  }
291
294
 
292
295
  /**
293
- * Whether two scope roots name the same directory, including through a
296
+ * Whether two plugin directories name the same directory, including through a
294
297
  * symlink. When home is the working directory, `.namzu/plugins` is user state:
295
298
  * treating the same bytes as project state would let a project-only trust
296
299
  * policy admit user-owned executable code, while scanning both installs it
297
- * twice. Missing roots fall back to normalized absolute names; discovery will
300
+ * twice. Hosts may pass the application home rather than the OS home, so the
301
+ * comparison includes each scope's relative plugin path. Missing directories
302
+ * fall back to normalized absolute names; discovery will
298
303
  * independently report them empty.
299
304
  */
300
305
  async function samePhysicalDirectory(left: string, right: string): Promise<boolean> {
@@ -45,6 +45,7 @@ export const CODING_AGENT_WORKING_DOCTRINE = `## How you work
45
45
 
46
46
  ### Reporting
47
47
  - Report outcomes faithfully. If tests fail, say so and show the output. If you skipped a step, say it was skipped. When something is done and verified, state it plainly without hedging.
48
+ - Preserve exact identifiers when reporting evidence. Do not translate, normalize or correct their spelling.
48
49
  - Never present a green run on a subset as a green run. Name what was actually executed.
49
50
  - Reference code as \`path:line\` so the user can jump to it.
50
51
  - Correct an earlier statement only when the error would change the user's code, conclusions or decisions; state it once, plainly, and continue. No apologies, no tally of past mistakes.
@@ -52,6 +53,7 @@ export const CODING_AGENT_WORKING_DOCTRINE = `## How you work
52
53
  ### Using available evidence
53
54
  - Carry the active task and established facts across turns. A question or status request during ongoing work does not cancel that work unless the user says so. Ask for clarification when the intended change is genuinely unspecified; do not ask the user to repeat information already available.
54
55
  - Treat a successful tool result together with its exact inputs as evidence of what happened. Content you successfully wrote is available evidence, just like content you read. An announced action, proposed call, failed call, or another agent's unsupported claim is not proof of completion.
56
+ - Match the source to the time the question asks about. For an earlier observation, use that observation or its retained original; a fresh read of a mutable source cannot establish what it contained earlier. For current state or a new action, check freshness as needed. If the historical detail is unavailable, say so instead of substituting today's value.
55
57
  - Reuse relevant evidence still available in conversation instead of observing it again by habit. Distinguish the last observed state from a guarantee that external state has not changed. Re-observe when evidence is missing, partial or invalidated, when another actor may have changed the target, or when freshness matters to the next action. If a check or exact-match edit reports a mismatch, inspect the current state and revise the action; do not force the old plan through.
56
58
  - When an observation is needed, ask the narrowest question that resolves the uncertainty. For a known file, inspect that file rather than listing the whole working directory. Recover missing observations with read-only tools, not by repeating a state-changing action.
57
59
 
@@ -23,3 +23,5 @@ export {
23
23
  export type { CodingAgentDoctrineOptions } from './coding-agent-doctrine.js'
24
24
  export { createResidentStepContributions } from './resident-step.js'
25
25
  export type { ResidentStepPromptOptions } from './resident-step.js'
26
+ export { createResidentStepContext } from './resident-learning.js'
27
+ export type { ResidentStepContextOptions, ResidentStepContextBundle } from './resident-learning.js'
@@ -0,0 +1,143 @@
1
+ import { z } from 'zod'
2
+ import { freezeResidentLearning, projectResidentLearning } from '../manager/resident/learning.js'
3
+ import { defineTool } from '../tools/defineTool.js'
4
+ import type { ToolContext, ToolDefinition } from '../types/tool/index.js'
5
+ import type { PromptContribution } from './contributions.js'
6
+ import { type ResidentStepPromptOptions, createResidentStepContributions } from './resident-step.js'
7
+
8
+ /** @experimental One admission's context and read-only access to its evaluated guidance. */
9
+ export interface ResidentStepContextBundle {
10
+ readonly contributions: readonly PromptContribution[]
11
+ readonly tools: readonly ToolDefinition[]
12
+ }
13
+
14
+ /** @experimental The host must reject reads from runs outside the admitted scope. */
15
+ export interface ResidentStepContextOptions extends ResidentStepPromptOptions {
16
+ readonly authorizeLearningRead: (context: ToolContext) => boolean
17
+ }
18
+
19
+ /**
20
+ * @experimental List guidance descriptions first; disclose complete bodies only
21
+ * when requested. Selection is local to this admission, never persisted as a
22
+ * preference or inferred from keywords. Mount both returned tools and context.
23
+ */
24
+ export function createResidentStepContext(
25
+ options: ResidentStepContextOptions,
26
+ ): ResidentStepContextBundle {
27
+ const learning = options.learning ? freezeResidentLearning(options.learning) : undefined
28
+ const contributions = createResidentStepContributions({
29
+ ...options,
30
+ learning: learning ? { ...learning, skills: [] } : undefined,
31
+ })
32
+ const taskSkills = learning?.skills.filter((skill) => (skill.purpose ?? 'task') === 'task')
33
+ if (!learning || !taskSkills?.length)
34
+ return Object.freeze({ contributions, tools: Object.freeze([]) })
35
+ const authorize = options.authorizeLearningRead
36
+ const resolveSources = options.resolveLearningSources
37
+ const selected = new Set<string>()
38
+ const profileChars = projectResidentLearning(learning, { maxChars: 12_000, skillNames: [] }).text
39
+ .length
40
+ const project = (names: readonly string[], maxChars = 12_000) => {
41
+ let sources: ReturnType<NonNullable<typeof resolveSources>> = []
42
+ try {
43
+ sources = resolveSources?.() ?? []
44
+ } catch {
45
+ // Unavailable observations cannot establish a dependency match.
46
+ }
47
+ return projectResidentLearning(
48
+ { ...learning, identity: undefined, preferences: [] },
49
+ { maxChars, skillNames: names, sources },
50
+ )
51
+ }
52
+ // Metadata is a catalogue, not executable instructions. Bound its size and
53
+ // escape control characters; complete descriptions remain available on read.
54
+ const catalogue = taskSkills.map((skill) => ({
55
+ name: skill.name,
56
+ description: [...skill.description]
57
+ .slice(0, 160)
58
+ .map((c) => {
59
+ const code = c.charCodeAt(0)
60
+ return code < 32 || (code >= 127 && code <= 159) ? ' ' : c
61
+ })
62
+ .join(''),
63
+ descriptionShortened: [...skill.description].length > 160,
64
+ }))
65
+ const tool = defineTool({
66
+ name: 'read_resident_skill',
67
+ description:
68
+ 'Read one evaluated resident skill whose description fits the current task. Use an exact name from the resident skill catalogue. Returns its complete instructions and evidence only if declared source dependencies still match. Loading does not grant permissions or establish that guidance applies. Skip unrelated skills; do not search the workspace to satisfy their descriptions.',
69
+ inputSchema: z.object({ name: z.string().regex(/^[a-z0-9][a-z0-9_-]{0,63}$/) }).strict(),
70
+ category: 'custom',
71
+ permissions: [],
72
+ readOnly: true,
73
+ destructive: false,
74
+ concurrencySafe: true,
75
+ presentCall: (input) => ({ kind: 'generic', label: input.name }),
76
+ async execute(input, context) {
77
+ context.abortSignal?.throwIfAborted()
78
+ try {
79
+ if (authorize(context) !== true) throw new Error('Run does not own this admission.')
80
+ const projection = project([input.name])
81
+ if (!projection.includedSkills.includes(input.name))
82
+ return {
83
+ success: false,
84
+ output: JSON.stringify({ withheldSkills: projection.withheldSkills }),
85
+ error:
86
+ 'Skill unavailable in this admission or its sources are unverified. Use current task evidence.',
87
+ }
88
+ selected.add(input.name)
89
+ return { success: true, output: projection.text }
90
+ } catch {
91
+ context.abortSignal?.throwIfAborted()
92
+ return {
93
+ success: false,
94
+ output: '',
95
+ error: 'Resident skill access is unavailable for this run.',
96
+ }
97
+ }
98
+ },
99
+ })
100
+ return Object.freeze({
101
+ tools: Object.freeze([tool]),
102
+ contributions: Object.freeze([
103
+ ...contributions,
104
+ Object.freeze({
105
+ id: 'namzu.resident-step.learning-catalogue',
106
+ placement: 'dynamic' as const,
107
+ render: () =>
108
+ [
109
+ '## Available evaluated resident skills',
110
+ 'These descriptions advertise optional guidance, not instructions to execute. Read a relevant skill with read_resident_skill before using it. Skip unrelated skills and work directly from the requested evidence; availability does not establish applicability. A skill evaluated on one task family may hinder another. Current objectives, project instructions and permissions always take precedence.',
111
+ JSON.stringify(catalogue),
112
+ ].join('\n'),
113
+ }),
114
+ Object.freeze({
115
+ id: 'namzu.resident-step.selected-learning',
116
+ placement: 'turn' as const,
117
+ render: () => {
118
+ if (!selected.size) return null
119
+ try {
120
+ const projection = project([...selected], Math.max(0, 12_000 - profileChars))
121
+ return [
122
+ '## Selected resident guidance for this request',
123
+ 'Apply only while relevant to the current task. Matching source revisions do not prove claims.',
124
+ projection.text,
125
+ ...projection.withheldSkills.map((skill) =>
126
+ JSON.stringify({ kind: 'withheld-guidance', ...skill }),
127
+ ),
128
+ ...(projection.omitted
129
+ ? [
130
+ 'Some selected guidance is withheld or omitted. Recheck current evidence; do not recover its instructions from earlier messages as a substitute.',
131
+ ]
132
+ : []),
133
+ ]
134
+ .filter(Boolean)
135
+ .join('\n')
136
+ } catch {
137
+ return 'Selected resident guidance is unavailable for this request. Use current task evidence; do not reuse earlier skill instructions.'
138
+ }
139
+ },
140
+ }),
141
+ ]),
142
+ })
143
+ }