@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,499 @@
1
+ import { createHash, randomUUID } from 'node:crypto'
2
+ import { z } from 'zod'
3
+ import {
4
+ type HarnessProtectionPlan,
5
+ normalizeHarnessProtection,
6
+ } from '../../eval/harness-protection.js'
7
+ import {
8
+ type HarnessReview,
9
+ type HarnessVerificationBatch,
10
+ reviewHarnessCandidate,
11
+ } from '../../eval/harness-verification.js'
12
+ import type { DiskResidentAgenda } from './agenda.js'
13
+ import {
14
+ type ResidentLearningEvidence,
15
+ type ResidentSkillCandidate,
16
+ hashResidentSkill,
17
+ normalizeResidentSkill,
18
+ promoteResidentSkill,
19
+ residentLearningEvidenceSchema,
20
+ } from './learning.js'
21
+ import { ResidentConflictError } from './store.js'
22
+
23
+ /** @experimental One explicitly requested experiment; callbacks own inference and evaluation. */
24
+ export type ResidentLearningStage = 'explore' | 'generate' | 'verification' | 'confirmation'
25
+
26
+ const receiptSchema = z.object({
27
+ runId: z.string().uuid(),
28
+ tokens: z.number().int().nonnegative().safe().nullable(),
29
+ costUsd: z.number().nonnegative().finite().nullable(),
30
+ })
31
+
32
+ /** @experimental One non-overlapping execution's usage, including its retries. Null is unknown. */
33
+ export type ResidentLearningReceipt = Readonly<z.infer<typeof receiptSchema>>
34
+
35
+ /** @experimental Recorded values are lower bounds when a receipt or stage is incomplete. */
36
+ export interface ResidentLearningConsumption {
37
+ readonly tokens: number
38
+ readonly costUsd: number
39
+ readonly receipts: number
40
+ readonly unknownTokens: number
41
+ readonly unknownCosts: number
42
+ readonly unfinishedStages: number
43
+ }
44
+
45
+ /** @experimental Append in sequence to host-owned durable storage before acknowledging. */
46
+ export interface ResidentLearningCycleEvent {
47
+ readonly cycleId: string
48
+ readonly sequence: number
49
+ readonly kind:
50
+ | 'started'
51
+ | 'stage-started'
52
+ | 'stage-finished'
53
+ | 'usage'
54
+ | 'exploration'
55
+ | 'candidate'
56
+ | 'evaluation'
57
+ | 'activation-requested'
58
+ | 'finished'
59
+ readonly stage?: ResidentLearningStage
60
+ readonly data: Readonly<Record<string, unknown>>
61
+ }
62
+
63
+ /** @experimental Use this stage's signal for every owned run; await every usage append. */
64
+ export interface ResidentLearningCycleContext {
65
+ readonly cycleId: string
66
+ readonly stage: ResidentLearningStage
67
+ readonly signal: AbortSignal
68
+ /** Planning allowance, not a reservation or a cap on a callback's in-flight work. */
69
+ readonly remainingUnits: number
70
+ recordUsage(receipt: ResidentLearningReceipt): Promise<void>
71
+ }
72
+
73
+ /** @experimental Original failure and active baseline; never contains confirmation tasks. */
74
+ export interface ResidentLearningExplorationContext extends ResidentLearningCycleContext {
75
+ readonly skillName: string
76
+ /** Admitted by the host before generation; cannot be changed by a candidate. */
77
+ readonly purpose?: 'task' | 'exploration'
78
+ readonly failure: Readonly<{ evidence: ResidentLearningEvidence; trace: string }>
79
+ readonly baseline: ResidentSkillCandidate | null
80
+ }
81
+
82
+ /** @experimental Host-retained environment observations, not a model's claim of success. */
83
+ export interface ResidentLearningExploration {
84
+ readonly evidence: ResidentLearningEvidence
85
+ readonly trace: string
86
+ }
87
+
88
+ /** @experimental Generation sees completed exploration, never held-out evaluation cases. */
89
+ export interface ResidentLearningGenerationContext extends ResidentLearningExplorationContext {
90
+ readonly exploration?: Readonly<ResidentLearningExploration>
91
+ }
92
+
93
+ /** @experimental The host supplies independently scored, retained traces for these exact revisions. */
94
+ export interface ResidentLearningEvaluationContext extends ResidentLearningCycleContext {
95
+ readonly baseline: ResidentSkillCandidate | null
96
+ readonly candidate: ResidentSkillCandidate
97
+ readonly baselineRevision: string
98
+ readonly candidateRevision: string
99
+ }
100
+
101
+ /** @experimental No provider, default background loop or executable-code activation is installed. */
102
+ export interface ResidentLearningCycleOptions {
103
+ /** Omitted means task guidance. Explicitly select exploration to improve an explorer policy. */
104
+ readonly purpose?: 'task' | 'exploration'
105
+ /** Fixed before generation; both rounds must preserve every named task. */
106
+ readonly protection: HarnessProtectionPlan
107
+ readonly agenda: Pick<DiskResidentAgenda, 'read' | 'promoteSkill'>
108
+ readonly skillName: string
109
+ readonly failure: { readonly evidence: ResidentLearningEvidence; readonly trace: string }
110
+ readonly parentCycleId?: string
111
+ readonly signal: AbortSignal
112
+ /** Stops subsequent stages/activation after observed excess; callbacks enforce in-flight limits. */
113
+ readonly resources: { readonly unit: 'tokens' | 'usd'; readonly maxUnits: number }
114
+ readonly record: (event: ResidentLearningCycleEvent) => Promise<void>
115
+ /** Optional active tool exploration before synthesis; the host retains actual observations. */
116
+ readonly explore?: (context: ResidentLearningExplorationContext) => Promise<{
117
+ readonly observations: ResidentLearningExploration
118
+ readonly usageComplete: boolean
119
+ }>
120
+ readonly generate: (context: ResidentLearningGenerationContext) => Promise<{
121
+ readonly candidate: ResidentSkillCandidate
122
+ /** All executions, including failures and side calls, have supplied receipts. */
123
+ readonly usageComplete: boolean
124
+ }>
125
+ readonly evaluate: (context: ResidentLearningEvaluationContext) => Promise<{
126
+ readonly batch: HarnessVerificationBatch
127
+ readonly usageComplete: boolean
128
+ }>
129
+ }
130
+
131
+ /** @experimental An ambiguous activation must be inspected, never automatically replayed. */
132
+ export interface ResidentLearningCycleResult {
133
+ readonly cycleId: string
134
+ readonly status:
135
+ | 'activated'
136
+ | 'rejected'
137
+ | 'inconclusive'
138
+ | 'conflict'
139
+ | 'cancelled'
140
+ | 'failed'
141
+ | 'activation-unknown'
142
+ readonly reason: string
143
+ readonly candidate?: ResidentSkillCandidate
144
+ readonly candidateRevision?: string
145
+ readonly baselineRevision?: string
146
+ readonly agendaRevision?: number
147
+ readonly review?: HarnessReview
148
+ readonly consumption: ResidentLearningConsumption
149
+ readonly auditComplete: boolean
150
+ }
151
+
152
+ /**
153
+ * @experimental Generate one candidate, independently verify and confirm it, then
154
+ * activate through the existing exact-revision transaction. No internal inference
155
+ * loop, retry or model-generated success claim replaces the host's evaluator.
156
+ */
157
+ export async function runResidentLearningCycle(
158
+ options: ResidentLearningCycleOptions,
159
+ ): Promise<ResidentLearningCycleResult> {
160
+ const protection = normalizeHarnessProtection(options.protection)
161
+ const purpose = z.enum(['task', 'exploration']).parse(options.purpose ?? 'task')
162
+ const purposeContext = options.purpose === undefined ? {} : { purpose }
163
+ const skillName = z
164
+ .string()
165
+ .regex(/^[a-z0-9][a-z0-9_-]{0,63}$/)
166
+ .parse(options.skillName)
167
+ const failure = Object.freeze({
168
+ evidence: Object.freeze(residentLearningEvidenceSchema.parse(options.failure.evidence)),
169
+ trace: z.string().trim().min(1).max(32_000).parse(options.failure.trace),
170
+ })
171
+ const resources = z
172
+ .object({ unit: z.enum(['tokens', 'usd']), maxUnits: z.number().positive().finite() })
173
+ .parse(options.resources)
174
+ const parentCycleId =
175
+ options.parentCycleId === undefined ? undefined : z.string().uuid().parse(options.parentCycleId)
176
+ const cycleId = randomUUID()
177
+ const receipts = new Map<string, ResidentLearningReceipt>()
178
+ let sequence = 0
179
+ let pending = Promise.resolve()
180
+ let auditComplete = true
181
+ let unfinishedStages = 0
182
+ let candidate: ResidentSkillCandidate | undefined
183
+ let candidateRevision: string | undefined
184
+ let baselineRevision: string | undefined
185
+ let review: HarnessReview | undefined
186
+ let activatedRevision: number | undefined
187
+ let activationRequested = false
188
+ const usage = (): ResidentLearningConsumption => ({
189
+ tokens: [...receipts.values()].reduce((n, r) => n + (r.tokens ?? 0), 0),
190
+ costUsd: [...receipts.values()].reduce((n, r) => n + (r.costUsd ?? 0), 0),
191
+ receipts: receipts.size,
192
+ unknownTokens: [...receipts.values()].filter((r) => r.tokens === null).length,
193
+ unknownCosts: [...receipts.values()].filter((r) => r.costUsd === null).length,
194
+ unfinishedStages,
195
+ })
196
+ const append = (
197
+ kind: ResidentLearningCycleEvent['kind'],
198
+ data: Record<string, unknown>,
199
+ stage?: ResidentLearningStage,
200
+ ) => {
201
+ const event = Object.freeze({
202
+ cycleId,
203
+ sequence: ++sequence,
204
+ kind,
205
+ ...(stage ? { stage } : {}),
206
+ data: structuredClone(data),
207
+ })
208
+ pending = pending
209
+ .then(() => options.record(event))
210
+ .catch((error) => {
211
+ auditComplete = false
212
+ throw error
213
+ })
214
+ return pending
215
+ }
216
+ const result = (
217
+ status: ResidentLearningCycleResult['status'],
218
+ reason: string,
219
+ ): ResidentLearningCycleResult => ({
220
+ cycleId,
221
+ status,
222
+ reason,
223
+ ...(candidate ? { candidate, candidateRevision } : {}),
224
+ ...(baselineRevision ? { baselineRevision } : {}),
225
+ ...(review ? { review } : {}),
226
+ ...(activatedRevision !== undefined ? { agendaRevision: activatedRevision } : {}),
227
+ consumption: usage(),
228
+ auditComplete,
229
+ })
230
+ const resourceProblem = (needsWork = false): string | null => {
231
+ const measured = usage()
232
+ if (
233
+ unfinishedStages ||
234
+ (resources.unit === 'tokens' ? measured.unknownTokens : measured.unknownCosts)
235
+ )
236
+ return `Incomplete ${resources.unit} evidence prevents further learning stages or activation.`
237
+ if ((resources.unit === 'tokens' ? measured.tokens : measured.costUsd) > resources.maxUnits)
238
+ return 'Recorded experiment consumption exceeds the declared resource allowance.'
239
+ if (
240
+ needsWork &&
241
+ (resources.unit === 'tokens' ? measured.tokens : measured.costUsd) === resources.maxUnits
242
+ )
243
+ return 'The recorded resource allowance is exhausted before the next stage.'
244
+ return null
245
+ }
246
+ const execute = async (): Promise<ResidentLearningCycleResult> => {
247
+ options.signal.throwIfAborted()
248
+ const snapshot = structuredClone(await options.agenda.read())
249
+ if (!snapshot) throw new Error('No resident agenda exists for this learning cycle.')
250
+ if (snapshot.paused || snapshot.pursuits.some((p) => p.state.phase === 'running'))
251
+ throw new Error('Resident learning requires an unpaused agenda without running pursuits.')
252
+ const current = snapshot.learning?.skills.find((s) => s.name === skillName)
253
+ if (current && (current.purpose ?? 'task') !== purpose)
254
+ throw new Error(
255
+ 'The active skill has a different learning purpose; use a distinct skill name.',
256
+ )
257
+ const baseline = current ? normalizeResidentSkill(current) : null
258
+ baselineRevision = baseline ? hashResidentSkill(baseline) : 'none'
259
+ await append('started', {
260
+ tenantId: snapshot.tenantId,
261
+ agentKey: snapshot.agentKey,
262
+ agendaRevision: snapshot.revision,
263
+ baselineRevision,
264
+ skillName,
265
+ ...purposeContext,
266
+ failure,
267
+ resources,
268
+ protection,
269
+ ...(options.explore ? { explorationEnabled: true } : {}),
270
+ ...(parentCycleId ? { parentCycleId } : {}),
271
+ })
272
+ const check = async () => {
273
+ options.signal.throwIfAborted()
274
+ const latest = await options.agenda.read()
275
+ options.signal.throwIfAborted()
276
+ if (
277
+ !latest ||
278
+ latest.tenantId !== snapshot.tenantId ||
279
+ latest.agentKey !== snapshot.agentKey ||
280
+ latest.revision !== snapshot.revision
281
+ )
282
+ throw new ResidentConflictError()
283
+ }
284
+ const stage = async <T extends { usageComplete: boolean }>(
285
+ name: ResidentLearningStage,
286
+ callback: (context: ResidentLearningCycleContext) => Promise<T>,
287
+ ): Promise<T> => {
288
+ await check()
289
+ await append('stage-started', {}, name)
290
+ await check()
291
+ unfinishedStages++
292
+ let open = true
293
+ let receiptFailure: unknown
294
+ const before = receipts.size
295
+ try {
296
+ const measured = usage()
297
+ const context: ResidentLearningCycleContext = Object.freeze({
298
+ cycleId,
299
+ stage: name,
300
+ signal: options.signal,
301
+ remainingUnits: Math.max(
302
+ 0,
303
+ resources.maxUnits - (resources.unit === 'tokens' ? measured.tokens : measured.costUsd),
304
+ ),
305
+ recordUsage: async (input: ResidentLearningReceipt) => {
306
+ try {
307
+ if (!open) throw new Error('A closed learning stage cannot record new usage.')
308
+ const receipt = Object.freeze(receiptSchema.parse(input))
309
+ const id = receipt.runId.toLowerCase()
310
+ if (receipts.has(id)) throw new Error('Duplicate learning execution receipt.')
311
+ if (receipts.size >= 1024) throw new Error('Learning cycle receipt bound exceeded.')
312
+ const totals = usage()
313
+ if (
314
+ !Number.isSafeInteger(totals.tokens + (receipt.tokens ?? 0)) ||
315
+ !Number.isFinite(totals.costUsd + (receipt.costUsd ?? 0))
316
+ )
317
+ throw new Error('Learning cycle consumption overflow.')
318
+ receipts.set(id, receipt)
319
+ await append('usage', { receipt }, name)
320
+ } catch (error) {
321
+ receiptFailure = error
322
+ throw error
323
+ }
324
+ },
325
+ })
326
+ const value = await callback(context)
327
+ open = false
328
+ await pending
329
+ if (receiptFailure) throw receiptFailure
330
+ options.signal.throwIfAborted()
331
+ if (value.usageComplete === true && receipts.size > before) unfinishedStages--
332
+ await append(
333
+ 'stage-finished',
334
+ {
335
+ usageComplete: value.usageComplete === true && receipts.size > before,
336
+ consumption: usage(),
337
+ },
338
+ name,
339
+ )
340
+ return value
341
+ } finally {
342
+ open = false
343
+ }
344
+ }
345
+ let exploration: Readonly<ResidentLearningExploration> | undefined
346
+ if (options.explore) {
347
+ const explore = options.explore
348
+ const observed = await stage('explore', (context) =>
349
+ explore(Object.freeze({ ...context, skillName, ...purposeContext, failure, baseline })),
350
+ )
351
+ exploration = Object.freeze({
352
+ evidence: Object.freeze(
353
+ residentLearningEvidenceSchema.parse(observed.observations.evidence),
354
+ ),
355
+ trace: z.string().trim().min(1).max(32_000).parse(observed.observations.trace),
356
+ })
357
+ await append(
358
+ 'exploration',
359
+ {
360
+ observations: exploration,
361
+ digest: createHash('sha256').update(JSON.stringify(exploration)).digest('hex'),
362
+ },
363
+ 'explore',
364
+ )
365
+ const problem = resourceProblem(true)
366
+ if (problem) return result('inconclusive', problem)
367
+ }
368
+ const generated = await stage('generate', (context) =>
369
+ options.generate(
370
+ Object.freeze({
371
+ ...context,
372
+ skillName,
373
+ ...purposeContext,
374
+ failure,
375
+ baseline,
376
+ ...(exploration ? { exploration } : {}),
377
+ }),
378
+ ),
379
+ )
380
+ candidateRevision = hashResidentSkill(generated.candidate)
381
+ candidate = normalizeResidentSkill(generated.candidate)
382
+ if ((candidate.purpose ?? 'task') !== purpose)
383
+ throw new Error('Generated skill purpose does not match the host-admitted learning purpose.')
384
+ if (candidate.name !== skillName)
385
+ throw new Error('Generated guidance must retain the requested skill name.')
386
+ await append('candidate', { candidate, candidateRevision, baselineRevision })
387
+ if (candidateRevision === baselineRevision)
388
+ return result('rejected', 'Generated guidance is identical to the active baseline.')
389
+ let problem = resourceProblem(true)
390
+ if (problem) return result('inconclusive', problem)
391
+ const evaluate = async (name: 'verification' | 'confirmation') => {
392
+ const measured = await stage(name, (context) =>
393
+ options.evaluate(
394
+ Object.freeze({
395
+ ...context,
396
+ baseline,
397
+ candidate: candidate as ResidentSkillCandidate,
398
+ baselineRevision: baselineRevision as string,
399
+ candidateRevision: candidateRevision as string,
400
+ }),
401
+ ),
402
+ )
403
+ const batch = structuredClone(measured.batch)
404
+ if (
405
+ batch.baselineRevision !== baselineRevision ||
406
+ batch.candidateRevision !== candidateRevision
407
+ )
408
+ throw new Error('Evaluation does not identify the admitted baseline and candidate.')
409
+ if (
410
+ batch.baseline.length > 128 ||
411
+ batch.candidate.length > 128 ||
412
+ batch.attributions.length > 128
413
+ )
414
+ throw new Error('A learning evaluation is bounded to 64 paired tasks.')
415
+ await append(
416
+ 'evaluation',
417
+ {
418
+ baselineRevision,
419
+ candidateRevision,
420
+ digest: createHash('sha256').update(JSON.stringify(batch)).digest('hex'),
421
+ baselineTrajectories: batch.baseline.map((t) => t.trajectoryId),
422
+ candidateTrajectories: batch.candidate.map((t) => t.trajectoryId),
423
+ },
424
+ name,
425
+ )
426
+ return batch
427
+ }
428
+ const verification = await evaluate('verification')
429
+ review = reviewHarnessCandidate(verification, undefined, protection)
430
+ problem = resourceProblem(true)
431
+ if (problem) return result('inconclusive', problem)
432
+ if (review.decision === 'reject') return result('rejected', review.reason)
433
+ if (
434
+ review.protection?.verification.status !== 'passed' ||
435
+ review.verification.unresolved.length ||
436
+ review.verification.tasks.length < 5 ||
437
+ review.verification.tasks.some((t) => t.trials !== 2)
438
+ )
439
+ return result('inconclusive', review.reason)
440
+ const confirmation = await evaluate('confirmation')
441
+ review = reviewHarnessCandidate(verification, confirmation, protection)
442
+ problem = resourceProblem()
443
+ if (problem) return result('inconclusive', problem)
444
+ if (review.decision !== 'accept')
445
+ return result(review.decision === 'reject' ? 'rejected' : 'inconclusive', review.reason)
446
+ await check()
447
+ const evidence: ResidentLearningEvidence = {
448
+ key: cycleId,
449
+ source: `resident-learning-cycle:${cycleId}`,
450
+ reason: `Paired verification and fresh confirmation of guidance derived from evidence ${failure.evidence.key}.`,
451
+ }
452
+ // Validate all existing activation contracts before entering the ambiguous
453
+ // commit interval. The store repeats this against its atomic snapshot.
454
+ promoteResidentSkill(
455
+ snapshot.learning,
456
+ candidate,
457
+ { verification, confirmation, protection },
458
+ evidence,
459
+ )
460
+ await append('activation-requested', {
461
+ baselineRevision,
462
+ candidateRevision,
463
+ agendaRevision: snapshot.revision,
464
+ })
465
+ options.signal.throwIfAborted()
466
+ activationRequested = true
467
+ const updated = await options.agenda.promoteSkill(
468
+ snapshot,
469
+ candidate,
470
+ { verification, confirmation, protection },
471
+ evidence,
472
+ )
473
+ activatedRevision = updated.revision
474
+ return result('activated', 'Evaluated guidance was committed for subsequent admissions.')
475
+ }
476
+ let outcome: ResidentLearningCycleResult
477
+ try {
478
+ outcome = await execute()
479
+ } catch (error) {
480
+ outcome = result(
481
+ error instanceof ResidentConflictError
482
+ ? 'conflict'
483
+ : activationRequested
484
+ ? 'activation-unknown'
485
+ : options.signal.aborted
486
+ ? 'cancelled'
487
+ : 'failed',
488
+ error instanceof Error ? error.message : String(error),
489
+ )
490
+ }
491
+ if (auditComplete) {
492
+ try {
493
+ await append('finished', { result: outcome })
494
+ } catch {
495
+ /* A committed activation is not undone by a journal failure. */
496
+ }
497
+ }
498
+ return { ...outcome, auditComplete }
499
+ }
@@ -0,0 +1,39 @@
1
+ import { z } from 'zod'
2
+ import { residentLearningEvidenceSchema } from './learning.js'
3
+
4
+ const label = z.string().trim().min(1).max(256)
5
+ export const learningTargetSchema = z.object({
6
+ skillName: z.string().regex(/^[a-z0-9][a-z0-9_-]{0,63}$/),
7
+ evaluatorRevision: label,
8
+ baselineRevision: z.union([z.literal('none'), z.string().regex(/^[a-f0-9]{64}$/)]),
9
+ })
10
+
11
+ export const learningObservationSchema = learningTargetSchema.extend({
12
+ runId: z
13
+ .string()
14
+ .uuid()
15
+ .transform((id) => id.toLowerCase()),
16
+ /** Stable task identity, including input/source revision; retries keep the same key. */
17
+ taskKey: label,
18
+ outcome: z.enum(['passed', 'failed', 'execution-error', 'unresolved']),
19
+ /** Host verified all execution receipts have settled. This is not a model assertion. */
20
+ usageComplete: z.boolean(),
21
+ evidence: residentLearningEvidenceSchema,
22
+ trace: z.string().trim().min(1).max(32_000),
23
+ })
24
+
25
+ /** @experimental Host-scored observation; failures need retained traces and a versioned evaluator. */
26
+ export type ResidentLearningObservation = Readonly<
27
+ Omit<z.infer<typeof learningObservationSchema>, 'evidence'>
28
+ > & {
29
+ readonly evidence: Readonly<z.infer<typeof learningObservationSchema>['evidence']>
30
+ }
31
+
32
+ /** @experimental Current evaluator and installed skill revision authorized for one experiment. */
33
+ export type ResidentLearningTarget = Readonly<z.infer<typeof learningTargetSchema>>
34
+
35
+ /** @experimental Stable insertion order; a claimed cycle may have no live executor. */
36
+ export interface ResidentLearningObservationRecord extends ResidentLearningObservation {
37
+ readonly ordinal: number
38
+ readonly attemptedCycleId: string | null
39
+ }