@namzu/sdk 38.1.0 → 39.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (534) hide show
  1. package/CHANGELOG.md +758 -0
  2. package/dist/advisory/executor.d.ts +10 -1
  3. package/dist/advisory/executor.d.ts.map +1 -1
  4. package/dist/advisory/executor.js +5 -26
  5. package/dist/advisory/executor.js.map +1 -1
  6. package/dist/advisory/history.d.ts +9 -0
  7. package/dist/advisory/history.d.ts.map +1 -0
  8. package/dist/advisory/history.js +120 -0
  9. package/dist/advisory/history.js.map +1 -0
  10. package/dist/advisory/index.d.ts +1 -1
  11. package/dist/advisory/index.d.ts.map +1 -1
  12. package/dist/advisory/index.js.map +1 -1
  13. package/dist/agents/ReactiveAgent.d.ts.map +1 -1
  14. package/dist/agents/ReactiveAgent.js +3 -0
  15. package/dist/agents/ReactiveAgent.js.map +1 -1
  16. package/dist/agents/runAgent.d.ts +10 -0
  17. package/dist/agents/runAgent.d.ts.map +1 -1
  18. package/dist/agents/runAgent.js +3 -0
  19. package/dist/agents/runAgent.js.map +1 -1
  20. package/dist/compaction/manual.d.ts +6 -0
  21. package/dist/compaction/manual.d.ts.map +1 -1
  22. package/dist/compaction/manual.js +21 -2
  23. package/dist/compaction/manual.js.map +1 -1
  24. package/dist/compaction/summary.d.ts.map +1 -1
  25. package/dist/compaction/summary.js +4 -1
  26. package/dist/compaction/summary.js.map +1 -1
  27. package/dist/config/runtime.js +2 -2
  28. package/dist/config/runtime.js.map +1 -1
  29. package/dist/contracts/schemas.js +1 -1
  30. package/dist/contracts/schemas.js.map +1 -1
  31. package/dist/eval/harness-protection.d.ts +18 -0
  32. package/dist/eval/harness-protection.d.ts.map +1 -0
  33. package/dist/eval/harness-protection.js +58 -0
  34. package/dist/eval/harness-protection.js.map +1 -0
  35. package/dist/eval/harness-verification.d.ts +6 -1
  36. package/dist/eval/harness-verification.d.ts.map +1 -1
  37. package/dist/eval/harness-verification.js +19 -2
  38. package/dist/eval/harness-verification.js.map +1 -1
  39. package/dist/eval/index.d.ts +1 -0
  40. package/dist/eval/index.d.ts.map +1 -1
  41. package/dist/eval/index.js.map +1 -1
  42. package/dist/manager/resident/activity.d.ts +50 -0
  43. package/dist/manager/resident/activity.d.ts.map +1 -0
  44. package/dist/manager/resident/activity.js +125 -0
  45. package/dist/manager/resident/activity.js.map +1 -0
  46. package/dist/manager/resident/agenda.d.ts +137 -0
  47. package/dist/manager/resident/agenda.d.ts.map +1 -0
  48. package/dist/manager/resident/agenda.js +586 -0
  49. package/dist/manager/resident/agenda.js.map +1 -0
  50. package/dist/manager/resident/consumption.d.ts +104 -0
  51. package/dist/manager/resident/consumption.d.ts.map +1 -0
  52. package/dist/manager/resident/consumption.js +233 -0
  53. package/dist/manager/resident/consumption.js.map +1 -0
  54. package/dist/manager/resident/delivery-window.d.ts +22 -0
  55. package/dist/manager/resident/delivery-window.d.ts.map +1 -0
  56. package/dist/manager/resident/delivery-window.js +78 -0
  57. package/dist/manager/resident/delivery-window.js.map +1 -0
  58. package/dist/manager/resident/evidence-recall.d.ts +24 -0
  59. package/dist/manager/resident/evidence-recall.d.ts.map +1 -0
  60. package/dist/manager/resident/evidence-recall.js +295 -0
  61. package/dist/manager/resident/evidence-recall.js.map +1 -0
  62. package/dist/manager/resident/history-disk.d.ts +10 -0
  63. package/dist/manager/resident/history-disk.d.ts.map +1 -0
  64. package/dist/manager/resident/history-disk.js +50 -0
  65. package/dist/manager/resident/history-disk.js.map +1 -0
  66. package/dist/manager/resident/history.d.ts +79 -0
  67. package/dist/manager/resident/history.d.ts.map +1 -0
  68. package/dist/manager/resident/history.js +203 -0
  69. package/dist/manager/resident/history.js.map +1 -0
  70. package/dist/manager/resident/host.d.ts +78 -0
  71. package/dist/manager/resident/host.d.ts.map +1 -0
  72. package/dist/manager/resident/host.js +252 -0
  73. package/dist/manager/resident/host.js.map +1 -0
  74. package/dist/manager/resident/initiative.d.ts +111 -0
  75. package/dist/manager/resident/initiative.d.ts.map +1 -0
  76. package/dist/manager/resident/initiative.js +129 -0
  77. package/dist/manager/resident/initiative.js.map +1 -0
  78. package/dist/manager/resident/learning-cycle.d.ts +131 -0
  79. package/dist/manager/resident/learning-cycle.d.ts.map +1 -0
  80. package/dist/manager/resident/learning-cycle.js +306 -0
  81. package/dist/manager/resident/learning-cycle.js.map +1 -0
  82. package/dist/manager/resident/learning-observation.d.ts +80 -0
  83. package/dist/manager/resident/learning-observation.d.ts.map +1 -0
  84. package/dist/manager/resident/learning-observation.js +22 -0
  85. package/dist/manager/resident/learning-observation.js.map +1 -0
  86. package/dist/manager/resident/learning-store.d.ts +106 -0
  87. package/dist/manager/resident/learning-store.d.ts.map +1 -0
  88. package/dist/manager/resident/learning-store.js +598 -0
  89. package/dist/manager/resident/learning-store.js.map +1 -0
  90. package/dist/manager/resident/learning.d.ts +726 -0
  91. package/dist/manager/resident/learning.d.ts.map +1 -0
  92. package/dist/manager/resident/learning.js +353 -0
  93. package/dist/manager/resident/learning.js.map +1 -0
  94. package/dist/manager/resident/loop.d.ts +31 -0
  95. package/dist/manager/resident/loop.d.ts.map +1 -0
  96. package/dist/manager/resident/loop.js +69 -0
  97. package/dist/manager/resident/loop.js.map +1 -0
  98. package/dist/manager/resident/outbox.d.ts +180 -0
  99. package/dist/manager/resident/outbox.d.ts.map +1 -0
  100. package/dist/manager/resident/outbox.js +214 -0
  101. package/dist/manager/resident/outbox.js.map +1 -0
  102. package/dist/manager/resident/proposal.d.ts +91 -0
  103. package/dist/manager/resident/proposal.d.ts.map +1 -0
  104. package/dist/manager/resident/proposal.js +75 -0
  105. package/dist/manager/resident/proposal.js.map +1 -0
  106. package/dist/manager/resident/store.d.ts +182 -0
  107. package/dist/manager/resident/store.d.ts.map +1 -0
  108. package/dist/manager/resident/store.js +199 -0
  109. package/dist/manager/resident/store.js.map +1 -0
  110. package/dist/manager/resident/tool-evidence.d.ts +71 -0
  111. package/dist/manager/resident/tool-evidence.d.ts.map +1 -0
  112. package/dist/manager/resident/tool-evidence.js +285 -0
  113. package/dist/manager/resident/tool-evidence.js.map +1 -0
  114. package/dist/manager/run/persistence.d.ts.map +1 -1
  115. package/dist/manager/run/persistence.js +6 -0
  116. package/dist/manager/run/persistence.js.map +1 -1
  117. package/dist/plugin/loader.d.ts.map +1 -1
  118. package/dist/plugin/loader.js +5 -3
  119. package/dist/plugin/loader.js.map +1 -1
  120. package/dist/prompt/coding-agent-doctrine.d.ts +1 -1
  121. package/dist/prompt/coding-agent-doctrine.d.ts.map +1 -1
  122. package/dist/prompt/coding-agent-doctrine.js +2 -0
  123. package/dist/prompt/coding-agent-doctrine.js.map +1 -1
  124. package/dist/prompt/contributions.d.ts +5 -2
  125. package/dist/prompt/contributions.d.ts.map +1 -1
  126. package/dist/prompt/contributions.js.map +1 -1
  127. package/dist/prompt/index.d.ts +4 -0
  128. package/dist/prompt/index.d.ts.map +1 -1
  129. package/dist/prompt/index.js +2 -0
  130. package/dist/prompt/index.js.map +1 -1
  131. package/dist/prompt/resident-learning.d.ts +19 -0
  132. package/dist/prompt/resident-learning.d.ts.map +1 -0
  133. package/dist/prompt/resident-learning.js +125 -0
  134. package/dist/prompt/resident-learning.js.map +1 -0
  135. package/dist/prompt/resident-step.d.ts +36 -0
  136. package/dist/prompt/resident-step.d.ts.map +1 -0
  137. package/dist/prompt/resident-step.js +135 -0
  138. package/dist/prompt/resident-step.js.map +1 -0
  139. package/dist/provider/collect-chat-completion.d.ts +2 -1
  140. package/dist/provider/collect-chat-completion.d.ts.map +1 -1
  141. package/dist/provider/collect-chat-completion.js +7 -6
  142. package/dist/provider/collect-chat-completion.js.map +1 -1
  143. package/dist/provider/fallback.d.ts.map +1 -1
  144. package/dist/provider/fallback.js +2 -1
  145. package/dist/provider/fallback.js.map +1 -1
  146. package/dist/provider/stream-text.d.ts +16 -0
  147. package/dist/provider/stream-text.d.ts.map +1 -0
  148. package/dist/provider/stream-text.js +51 -0
  149. package/dist/provider/stream-text.js.map +1 -0
  150. package/dist/public-runtime.d.ts +22 -3
  151. package/dist/public-runtime.d.ts.map +1 -1
  152. package/dist/public-runtime.js +21 -3
  153. package/dist/public-runtime.js.map +1 -1
  154. package/dist/public-tools.d.ts +2 -0
  155. package/dist/public-tools.d.ts.map +1 -1
  156. package/dist/public-tools.js +2 -0
  157. package/dist/public-tools.js.map +1 -1
  158. package/dist/public-types.d.ts +29 -3
  159. package/dist/public-types.d.ts.map +1 -1
  160. package/dist/registry/index.d.ts +1 -1
  161. package/dist/registry/index.d.ts.map +1 -1
  162. package/dist/registry/tool/execute.d.ts +18 -0
  163. package/dist/registry/tool/execute.d.ts.map +1 -1
  164. package/dist/registry/tool/execute.js +43 -6
  165. package/dist/registry/tool/execute.js.map +1 -1
  166. package/dist/run/LimitChecker.js +3 -3
  167. package/dist/run/LimitChecker.js.map +1 -1
  168. package/dist/run/evidence-query.d.ts +41 -0
  169. package/dist/run/evidence-query.d.ts.map +1 -0
  170. package/dist/run/evidence-query.js +270 -0
  171. package/dist/run/evidence-query.js.map +1 -0
  172. package/dist/run/evidence-recall.d.ts +99 -0
  173. package/dist/run/evidence-recall.d.ts.map +1 -0
  174. package/dist/run/evidence-recall.js +633 -0
  175. package/dist/run/evidence-recall.js.map +1 -0
  176. package/dist/run/index.d.ts +2 -0
  177. package/dist/run/index.d.ts.map +1 -1
  178. package/dist/run/index.js +1 -0
  179. package/dist/run/index.js.map +1 -1
  180. package/dist/run/json-claim-verifier.d.ts +83 -0
  181. package/dist/run/json-claim-verifier.d.ts.map +1 -0
  182. package/dist/run/json-claim-verifier.js +200 -0
  183. package/dist/run/json-claim-verifier.js.map +1 -0
  184. package/dist/run/preparation-context-error.d.ts +10 -0
  185. package/dist/run/preparation-context-error.d.ts.map +1 -0
  186. package/dist/run/preparation-context-error.js +15 -0
  187. package/dist/run/preparation-context-error.js.map +1 -0
  188. package/dist/run-query/index.d.ts +3 -1
  189. package/dist/run-query/index.d.ts.map +1 -1
  190. package/dist/runtime/query/callback-inference.d.ts +8 -0
  191. package/dist/runtime/query/callback-inference.d.ts.map +1 -0
  192. package/dist/runtime/query/callback-inference.js +89 -0
  193. package/dist/runtime/query/callback-inference.js.map +1 -0
  194. package/dist/runtime/query/checkpoint.d.ts +4 -0
  195. package/dist/runtime/query/checkpoint.d.ts.map +1 -1
  196. package/dist/runtime/query/checkpoint.js +13 -0
  197. package/dist/runtime/query/checkpoint.js.map +1 -1
  198. package/dist/runtime/query/events.d.ts +7 -1
  199. package/dist/runtime/query/events.d.ts.map +1 -1
  200. package/dist/runtime/query/events.js +39 -12
  201. package/dist/runtime/query/events.js.map +1 -1
  202. package/dist/runtime/query/executor.d.ts +7 -1
  203. package/dist/runtime/query/executor.d.ts.map +1 -1
  204. package/dist/runtime/query/executor.js +38 -7
  205. package/dist/runtime/query/executor.js.map +1 -1
  206. package/dist/runtime/query/file-evidence-context.d.ts +5 -0
  207. package/dist/runtime/query/file-evidence-context.d.ts.map +1 -0
  208. package/dist/runtime/query/file-evidence-context.js +64 -0
  209. package/dist/runtime/query/file-evidence-context.js.map +1 -0
  210. package/dist/runtime/query/guard.d.ts.map +1 -1
  211. package/dist/runtime/query/guard.js +4 -0
  212. package/dist/runtime/query/guard.js.map +1 -1
  213. package/dist/runtime/query/index.d.ts +10 -1
  214. package/dist/runtime/query/index.d.ts.map +1 -1
  215. package/dist/runtime/query/index.js +40 -25
  216. package/dist/runtime/query/index.js.map +1 -1
  217. package/dist/runtime/query/iteration/index.d.ts +9 -31
  218. package/dist/runtime/query/iteration/index.d.ts.map +1 -1
  219. package/dist/runtime/query/iteration/index.js +231 -93
  220. package/dist/runtime/query/iteration/index.js.map +1 -1
  221. package/dist/runtime/query/iteration/phases/advisory.d.ts +2 -1
  222. package/dist/runtime/query/iteration/phases/advisory.d.ts.map +1 -1
  223. package/dist/runtime/query/iteration/phases/advisory.js +2 -1
  224. package/dist/runtime/query/iteration/phases/advisory.js.map +1 -1
  225. package/dist/runtime/query/iteration/phases/context.d.ts +2 -1
  226. package/dist/runtime/query/iteration/phases/context.d.ts.map +1 -1
  227. package/dist/runtime/query/iteration/phases/context.js.map +1 -1
  228. package/dist/runtime/query/iteration/phases/tool-review.d.ts.map +1 -1
  229. package/dist/runtime/query/iteration/phases/tool-review.js +3 -0
  230. package/dist/runtime/query/iteration/phases/tool-review.js.map +1 -1
  231. package/dist/runtime/query/iteration/provider-rejected-image.d.ts +2 -1
  232. package/dist/runtime/query/iteration/provider-rejected-image.d.ts.map +1 -1
  233. package/dist/runtime/query/iteration/provider-rejected-image.js +5 -2
  234. package/dist/runtime/query/iteration/provider-rejected-image.js.map +1 -1
  235. package/dist/runtime/query/iteration/stream-turn.d.ts +4 -1
  236. package/dist/runtime/query/iteration/stream-turn.d.ts.map +1 -1
  237. package/dist/runtime/query/iteration/stream-turn.js +22 -8
  238. package/dist/runtime/query/iteration/stream-turn.js.map +1 -1
  239. package/dist/runtime/query/prompt-cache.d.ts.map +1 -1
  240. package/dist/runtime/query/prompt-cache.js +21 -42
  241. package/dist/runtime/query/prompt-cache.js.map +1 -1
  242. package/dist/runtime/query/resume-pending.d.ts +18 -33
  243. package/dist/runtime/query/resume-pending.d.ts.map +1 -1
  244. package/dist/runtime/query/resume-pending.js +59 -42
  245. package/dist/runtime/query/resume-pending.js.map +1 -1
  246. package/dist/runtime/query/review-policy.d.ts +4 -4
  247. package/dist/runtime/query/review-policy.d.ts.map +1 -1
  248. package/dist/runtime/query/review-policy.js +10 -9
  249. package/dist/runtime/query/review-policy.js.map +1 -1
  250. package/dist/runtime/query/sandbox-lifecycle.d.ts.map +1 -1
  251. package/dist/runtime/query/sandbox-lifecycle.js +4 -0
  252. package/dist/runtime/query/sandbox-lifecycle.js.map +1 -1
  253. package/dist/runtime/query/tool-output-budget.d.ts +10 -6
  254. package/dist/runtime/query/tool-output-budget.d.ts.map +1 -1
  255. package/dist/runtime/query/tool-output-budget.js +54 -12
  256. package/dist/runtime/query/tool-output-budget.js.map +1 -1
  257. package/dist/runtime/query/tooling.d.ts +3 -1
  258. package/dist/runtime/query/tooling.d.ts.map +1 -1
  259. package/dist/runtime/query/tooling.js +4 -0
  260. package/dist/runtime/query/tooling.js.map +1 -1
  261. package/dist/scheduler/completion-inbox.d.ts +3 -0
  262. package/dist/scheduler/completion-inbox.d.ts.map +1 -1
  263. package/dist/scheduler/completion-inbox.js +28 -0
  264. package/dist/scheduler/completion-inbox.js.map +1 -1
  265. package/dist/store/evidence/compaction-archive.d.ts +109 -0
  266. package/dist/store/evidence/compaction-archive.d.ts.map +1 -0
  267. package/dist/store/evidence/compaction-archive.js +125 -0
  268. package/dist/store/evidence/compaction-archive.js.map +1 -0
  269. package/dist/store/evidence/compaction-provenance.d.ts +7 -0
  270. package/dist/store/evidence/compaction-provenance.d.ts.map +1 -0
  271. package/dist/store/evidence/compaction-provenance.js +49 -0
  272. package/dist/store/evidence/compaction-provenance.js.map +1 -0
  273. package/dist/store/evidence/compaction-text.d.ts +16 -0
  274. package/dist/store/evidence/compaction-text.d.ts.map +1 -0
  275. package/dist/store/evidence/compaction-text.js +51 -0
  276. package/dist/store/evidence/compaction-text.js.map +1 -0
  277. package/dist/store/evidence/disk.d.ts +11 -0
  278. package/dist/store/evidence/disk.d.ts.map +1 -0
  279. package/dist/store/evidence/disk.js +367 -0
  280. package/dist/store/evidence/disk.js.map +1 -0
  281. package/dist/store/evidence/format.d.ts +25 -0
  282. package/dist/store/evidence/format.d.ts.map +1 -0
  283. package/dist/store/evidence/format.js +115 -0
  284. package/dist/store/evidence/format.js.map +1 -0
  285. package/dist/store/evidence/index-page.d.ts +208 -0
  286. package/dist/store/evidence/index-page.d.ts.map +1 -0
  287. package/dist/store/evidence/index-page.js +262 -0
  288. package/dist/store/evidence/index-page.js.map +1 -0
  289. package/dist/store/evidence/io.d.ts +24 -0
  290. package/dist/store/evidence/io.d.ts.map +1 -0
  291. package/dist/store/evidence/io.js +69 -0
  292. package/dist/store/evidence/io.js.map +1 -0
  293. package/dist/store/evidence/linked.d.ts +9 -0
  294. package/dist/store/evidence/linked.d.ts.map +1 -0
  295. package/dist/store/evidence/linked.js +314 -0
  296. package/dist/store/evidence/linked.js.map +1 -0
  297. package/dist/store/evidence/passages.d.ts +15 -0
  298. package/dist/store/evidence/passages.d.ts.map +1 -0
  299. package/dist/store/evidence/passages.js +72 -0
  300. package/dist/store/evidence/passages.js.map +1 -0
  301. package/dist/store/evidence/record-chain.d.ts +42 -0
  302. package/dist/store/evidence/record-chain.d.ts.map +1 -0
  303. package/dist/store/evidence/record-chain.js +111 -0
  304. package/dist/store/evidence/record-chain.js.map +1 -0
  305. package/dist/store/evidence/search-input.d.ts +21 -0
  306. package/dist/store/evidence/search-input.d.ts.map +1 -0
  307. package/dist/store/evidence/search-input.js +44 -0
  308. package/dist/store/evidence/search-input.js.map +1 -0
  309. package/dist/store/evidence/selection.d.ts +9 -0
  310. package/dist/store/evidence/selection.d.ts.map +1 -0
  311. package/dist/store/evidence/selection.js +17 -0
  312. package/dist/store/evidence/selection.js.map +1 -0
  313. package/dist/store/evidence/source-kind.d.ts +11 -0
  314. package/dist/store/evidence/source-kind.d.ts.map +1 -0
  315. package/dist/store/evidence/source-kind.js +26 -0
  316. package/dist/store/evidence/source-kind.js.map +1 -0
  317. package/dist/store/evidence/source-text.d.ts +51 -0
  318. package/dist/store/evidence/source-text.d.ts.map +1 -0
  319. package/dist/store/evidence/source-text.js +213 -0
  320. package/dist/store/evidence/source-text.js.map +1 -0
  321. package/dist/store/evidence/types.d.ts +162 -0
  322. package/dist/store/evidence/types.d.ts.map +1 -0
  323. package/dist/store/evidence/types.js +2 -0
  324. package/dist/store/evidence/types.js.map +1 -0
  325. package/dist/store/memory/disk.d.ts +2 -0
  326. package/dist/store/memory/disk.d.ts.map +1 -1
  327. package/dist/store/memory/disk.js +2 -1
  328. package/dist/store/memory/disk.js.map +1 -1
  329. package/dist/store/run/disk.d.ts +10 -0
  330. package/dist/store/run/disk.d.ts.map +1 -1
  331. package/dist/store/run/disk.js +87 -7
  332. package/dist/store/run/disk.js.map +1 -1
  333. package/dist/store/run/memory.d.ts +1 -0
  334. package/dist/store/run/memory.d.ts.map +1 -1
  335. package/dist/store/run/memory.js +10 -0
  336. package/dist/store/run/memory.js.map +1 -1
  337. package/dist/store/run/tool-executions.d.ts +13 -0
  338. package/dist/store/run/tool-executions.d.ts.map +1 -0
  339. package/dist/store/run/tool-executions.js +99 -0
  340. package/dist/store/run/tool-executions.js.map +1 -0
  341. package/dist/store/session/index.d.ts +2 -0
  342. package/dist/store/session/index.d.ts.map +1 -1
  343. package/dist/store/session/index.js +1 -0
  344. package/dist/store/session/index.js.map +1 -1
  345. package/dist/store/session/sqlite.d.ts +57 -0
  346. package/dist/store/session/sqlite.d.ts.map +1 -0
  347. package/dist/store/session/sqlite.js +430 -0
  348. package/dist/store/session/sqlite.js.map +1 -0
  349. package/dist/tools/builtins/job.d.ts.map +1 -1
  350. package/dist/tools/builtins/job.js +4 -5
  351. package/dist/tools/builtins/job.js.map +1 -1
  352. package/dist/tools/builtins/write-file.js +2 -2
  353. package/dist/tools/builtins/write-file.js.map +1 -1
  354. package/dist/tools/defineTool.d.ts +2 -1
  355. package/dist/tools/defineTool.d.ts.map +1 -1
  356. package/dist/tools/defineTool.js +1 -1
  357. package/dist/tools/defineTool.js.map +1 -1
  358. package/dist/tools/file-read-tracker.d.ts.map +1 -1
  359. package/dist/tools/file-read-tracker.js +12 -3
  360. package/dist/tools/file-read-tracker.js.map +1 -1
  361. package/dist/tools/resident-history.d.ts +10 -0
  362. package/dist/tools/resident-history.d.ts.map +1 -0
  363. package/dist/tools/resident-history.js +80 -0
  364. package/dist/tools/resident-history.js.map +1 -0
  365. package/dist/tools/resident-tool-evidence.d.ts +5 -0
  366. package/dist/tools/resident-tool-evidence.d.ts.map +1 -0
  367. package/dist/tools/resident-tool-evidence.js +57 -0
  368. package/dist/tools/resident-tool-evidence.js.map +1 -0
  369. package/dist/types/advisory/config.d.ts +7 -0
  370. package/dist/types/advisory/config.d.ts.map +1 -1
  371. package/dist/types/agent/reactive.d.ts +1 -0
  372. package/dist/types/agent/reactive.d.ts.map +1 -1
  373. package/dist/types/authorization/index.d.ts +9 -9
  374. package/dist/types/authorization/index.d.ts.map +1 -1
  375. package/dist/types/authorization/index.js +1 -1
  376. package/dist/types/authorization/index.js.map +1 -1
  377. package/dist/types/hitl/index.d.ts +4 -0
  378. package/dist/types/hitl/index.d.ts.map +1 -1
  379. package/dist/types/hitl/index.js.map +1 -1
  380. package/dist/types/message/index.d.ts +16 -2
  381. package/dist/types/message/index.d.ts.map +1 -1
  382. package/dist/types/message/index.js +8 -1
  383. package/dist/types/message/index.js.map +1 -1
  384. package/dist/types/provider/chat.d.ts +2 -0
  385. package/dist/types/provider/chat.d.ts.map +1 -1
  386. package/dist/types/provider/stream.d.ts +4 -0
  387. package/dist/types/provider/stream.d.ts.map +1 -1
  388. package/dist/types/run/answer-review.d.ts +34 -3
  389. package/dist/types/run/answer-review.d.ts.map +1 -1
  390. package/dist/types/run/config.d.ts +3 -0
  391. package/dist/types/run/config.d.ts.map +1 -1
  392. package/dist/types/run/entity.d.ts +7 -0
  393. package/dist/types/run/entity.d.ts.map +1 -1
  394. package/dist/types/run/events.d.ts +31 -8
  395. package/dist/types/run/events.d.ts.map +1 -1
  396. package/dist/types/run/events.js.map +1 -1
  397. package/dist/types/run/prepare-step.d.ts +53 -8
  398. package/dist/types/run/prepare-step.d.ts.map +1 -1
  399. package/dist/types/run/store.d.ts +29 -4
  400. package/dist/types/run/store.d.ts.map +1 -1
  401. package/dist/types/run/store.js +0 -28
  402. package/dist/types/run/store.js.map +1 -1
  403. package/dist/types/tool/index.d.ts +15 -1
  404. package/dist/types/tool/index.d.ts.map +1 -1
  405. package/dist/types/tool/index.js.map +1 -1
  406. package/dist/utils/await-with-abort.d.ts +8 -0
  407. package/dist/utils/await-with-abort.d.ts.map +1 -0
  408. package/dist/utils/await-with-abort.js +28 -0
  409. package/dist/utils/await-with-abort.js.map +1 -0
  410. package/dist/utils/evidence-time.d.ts +3 -0
  411. package/dist/utils/evidence-time.d.ts.map +1 -0
  412. package/dist/utils/evidence-time.js +10 -0
  413. package/dist/utils/evidence-time.js.map +1 -0
  414. package/dist/utils/evidence-tokens.d.ts +13 -0
  415. package/dist/utils/evidence-tokens.d.ts.map +1 -0
  416. package/dist/utils/evidence-tokens.js +29 -0
  417. package/dist/utils/evidence-tokens.js.map +1 -0
  418. package/package.json +1 -1
  419. package/src/advisory/executor.ts +15 -30
  420. package/src/advisory/history.ts +126 -0
  421. package/src/advisory/index.ts +5 -1
  422. package/src/agents/ReactiveAgent.ts +3 -0
  423. package/src/agents/runAgent.ts +14 -1
  424. package/src/compaction/manual.ts +30 -2
  425. package/src/compaction/summary.ts +4 -1
  426. package/src/config/runtime.ts +2 -2
  427. package/src/contracts/schemas.ts +1 -1
  428. package/src/eval/harness-protection.ts +79 -0
  429. package/src/eval/harness-verification.ts +31 -1
  430. package/src/eval/index.ts +1 -0
  431. package/src/manager/resident/activity.ts +187 -0
  432. package/src/manager/resident/agenda.ts +907 -0
  433. package/src/manager/resident/consumption.ts +311 -0
  434. package/src/manager/resident/delivery-window.ts +93 -0
  435. package/src/manager/resident/evidence-recall.ts +363 -0
  436. package/src/manager/resident/history-disk.ts +63 -0
  437. package/src/manager/resident/history.ts +312 -0
  438. package/src/manager/resident/host.ts +356 -0
  439. package/src/manager/resident/initiative.ts +205 -0
  440. package/src/manager/resident/learning-cycle.ts +499 -0
  441. package/src/manager/resident/learning-observation.ts +39 -0
  442. package/src/manager/resident/learning-store.ts +813 -0
  443. package/src/manager/resident/learning.ts +493 -0
  444. package/src/manager/resident/loop.ts +101 -0
  445. package/src/manager/resident/outbox.ts +307 -0
  446. package/src/manager/resident/proposal.ts +105 -0
  447. package/src/manager/resident/store.ts +257 -0
  448. package/src/manager/resident/tool-evidence.ts +412 -0
  449. package/src/manager/run/persistence.ts +6 -0
  450. package/src/plugin/loader.ts +8 -3
  451. package/src/prompt/coding-agent-doctrine.ts +2 -0
  452. package/src/prompt/contributions.ts +5 -2
  453. package/src/prompt/index.ts +4 -0
  454. package/src/prompt/resident-learning.ts +143 -0
  455. package/src/prompt/resident-step.ts +176 -0
  456. package/src/provider/collect-chat-completion.ts +7 -6
  457. package/src/provider/fallback.ts +2 -1
  458. package/src/provider/stream-text.ts +56 -0
  459. package/src/public-runtime.ts +44 -0
  460. package/src/public-tools.ts +3 -0
  461. package/src/public-types.ts +165 -0
  462. package/src/registry/index.ts +1 -1
  463. package/src/registry/tool/execute.ts +56 -9
  464. package/src/run/LimitChecker.ts +3 -3
  465. package/src/run/evidence-query.ts +333 -0
  466. package/src/run/evidence-recall.ts +854 -0
  467. package/src/run/index.ts +11 -0
  468. package/src/run/json-claim-verifier.ts +298 -0
  469. package/src/run/preparation-context-error.ts +16 -0
  470. package/src/run-query/index.ts +1 -1
  471. package/src/runtime/query/callback-inference.ts +94 -0
  472. package/src/runtime/query/checkpoint.ts +14 -0
  473. package/src/runtime/query/events.ts +46 -14
  474. package/src/runtime/query/executor.ts +51 -9
  475. package/src/runtime/query/file-evidence-context.ts +65 -0
  476. package/src/runtime/query/guard.ts +2 -0
  477. package/src/runtime/query/index.ts +50 -27
  478. package/src/runtime/query/iteration/index.ts +269 -86
  479. package/src/runtime/query/iteration/phases/advisory.ts +3 -0
  480. package/src/runtime/query/iteration/phases/context.ts +2 -0
  481. package/src/runtime/query/iteration/phases/tool-review.ts +3 -0
  482. package/src/runtime/query/iteration/provider-rejected-image.ts +6 -1
  483. package/src/runtime/query/iteration/stream-turn.ts +35 -8
  484. package/src/runtime/query/prompt-cache.ts +24 -47
  485. package/src/runtime/query/resume-pending.ts +65 -40
  486. package/src/runtime/query/review-policy.ts +13 -9
  487. package/src/runtime/query/sandbox-lifecycle.ts +3 -0
  488. package/src/runtime/query/tool-output-budget.ts +65 -13
  489. package/src/runtime/query/tooling.ts +7 -1
  490. package/src/scheduler/completion-inbox.ts +26 -0
  491. package/src/store/evidence/compaction-archive.ts +139 -0
  492. package/src/store/evidence/compaction-provenance.ts +52 -0
  493. package/src/store/evidence/compaction-text.ts +61 -0
  494. package/src/store/evidence/disk.ts +461 -0
  495. package/src/store/evidence/format.ts +126 -0
  496. package/src/store/evidence/index-page.ts +292 -0
  497. package/src/store/evidence/io.ts +95 -0
  498. package/src/store/evidence/linked.ts +365 -0
  499. package/src/store/evidence/passages.ts +88 -0
  500. package/src/store/evidence/record-chain.ts +108 -0
  501. package/src/store/evidence/search-input.ts +62 -0
  502. package/src/store/evidence/selection.ts +25 -0
  503. package/src/store/evidence/source-kind.ts +36 -0
  504. package/src/store/evidence/source-text.ts +285 -0
  505. package/src/store/evidence/types.ts +177 -0
  506. package/src/store/memory/disk.ts +4 -1
  507. package/src/store/run/disk.ts +110 -8
  508. package/src/store/run/memory.ts +10 -0
  509. package/src/store/run/tool-executions.ts +112 -0
  510. package/src/store/session/index.ts +2 -0
  511. package/src/store/session/sqlite.ts +584 -0
  512. package/src/tools/builtins/job.ts +4 -5
  513. package/src/tools/builtins/write-file.ts +2 -2
  514. package/src/tools/defineTool.ts +4 -2
  515. package/src/tools/file-read-tracker.ts +8 -2
  516. package/src/tools/resident-history.ts +86 -0
  517. package/src/tools/resident-tool-evidence.ts +68 -0
  518. package/src/types/advisory/config.ts +7 -0
  519. package/src/types/agent/reactive.ts +1 -0
  520. package/src/types/authorization/index.ts +2 -2
  521. package/src/types/hitl/index.ts +4 -0
  522. package/src/types/message/index.ts +20 -0
  523. package/src/types/provider/chat.ts +2 -0
  524. package/src/types/provider/stream.ts +4 -0
  525. package/src/types/run/answer-review.ts +34 -3
  526. package/src/types/run/config.ts +3 -0
  527. package/src/types/run/entity.ts +7 -0
  528. package/src/types/run/events.ts +31 -8
  529. package/src/types/run/prepare-step.ts +59 -8
  530. package/src/types/run/store.ts +35 -4
  531. package/src/types/tool/index.ts +19 -1
  532. package/src/utils/await-with-abort.ts +26 -0
  533. package/src/utils/evidence-time.ts +9 -0
  534. package/src/utils/evidence-tokens.ts +32 -0
@@ -0,0 +1,493 @@
1
+ import { createHash } 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 HarnessVerificationBatch,
9
+ reviewHarnessCandidate,
10
+ } from '../../eval/harness-verification.js'
11
+
12
+ const label = z.string().trim().min(1).max(256)
13
+ const name = z.string().regex(/^[a-z0-9][a-z0-9_-]{0,63}$/)
14
+ const digest = z.string().regex(/^[a-f0-9]{64}$/)
15
+ export const residentLearningEvidenceSchema = z.object({
16
+ key: label,
17
+ source: label,
18
+ reason: z.string().trim().min(1).max(1_000),
19
+ })
20
+
21
+ /** @experimental Host provenance for a correction, evaluated activation or rollback. */
22
+ export type ResidentLearningEvidence = Readonly<z.infer<typeof residentLearningEvidenceSchema>>
23
+
24
+ const sourceSchema = z.object({ key: label, revision: label })
25
+ /** @experimental Host-owned source identity and revision; neither is a model assertion. */
26
+ export type ResidentLearningSource = Readonly<z.infer<typeof sourceSchema>>
27
+
28
+ const sourcesSchema = z
29
+ .array(sourceSchema)
30
+ .min(1)
31
+ .max(8)
32
+ .superRefine((sources, context) => {
33
+ if (new Set(sources.map((source) => source.key)).size !== sources.length)
34
+ context.addIssue({ code: z.ZodIssueCode.custom, message: 'Duplicate learning source keys.' })
35
+ })
36
+ .transform((sources) => sources.sort((a, b) => (a.key < b.key ? -1 : a.key > b.key ? 1 : 0)))
37
+
38
+ const candidateSchema = z.object({
39
+ name,
40
+ /** Omitted means ordinary task guidance; exploration policies require explicit projection. */
41
+ purpose: z.enum(['task', 'exploration']).optional(),
42
+ description: z.string().trim().min(1).max(1_000),
43
+ body: z.string().trim().min(1).max(4_000),
44
+ /** Optional dependencies whose revisions must still match before projection. */
45
+ sources: sourcesSchema.optional(),
46
+ })
47
+
48
+ /** @experimental Instructional guidance only; never executable assets or tool permissions. */
49
+ export type ResidentSkillCandidate = Readonly<Omit<z.infer<typeof candidateSchema>, 'sources'>> & {
50
+ readonly sources?: readonly ResidentLearningSource[]
51
+ }
52
+
53
+ /** Internal canonical snapshot, including immutable source bindings. */
54
+ export function normalizeResidentSkill(input: ResidentSkillCandidate): ResidentSkillCandidate {
55
+ const candidate = candidateSchema.parse(input)
56
+ return Object.freeze({
57
+ ...candidate,
58
+ ...(candidate.sources
59
+ ? { sources: Object.freeze(candidate.sources.map((source) => Object.freeze(source))) }
60
+ : {}),
61
+ })
62
+ }
63
+
64
+ const learnedSkillSchema = candidateSchema.extend({
65
+ hash: digest,
66
+ evidence: residentLearningEvidenceSchema,
67
+ verification: z.object({
68
+ baselineHash: z.union([digest, z.literal('none')]),
69
+ candidateHash: digest,
70
+ evidenceDigest: digest,
71
+ verificationTasks: z.number().int().min(5).max(64),
72
+ confirmationTasks: z.number().int().min(5).max(64),
73
+ /** Absent only on historical activations made before protection was required. */
74
+ protection: z
75
+ .object({
76
+ verificationTasks: z.number().int().min(1).max(63),
77
+ confirmationTasks: z.number().int().min(1).max(63),
78
+ planDigest: digest,
79
+ })
80
+ .optional(),
81
+ }),
82
+ })
83
+
84
+ /** @experimental Immutable evaluated content and evidence identity. */
85
+ export type ResidentLearnedSkill = Readonly<Omit<z.infer<typeof learnedSkillSchema>, 'sources'>> & {
86
+ readonly sources?: readonly ResidentLearningSource[]
87
+ }
88
+
89
+ export const residentLearningSchema = z
90
+ .object({
91
+ revision: z.number().int().positive().safe(),
92
+ identity: z
93
+ .object({
94
+ text: z.string().trim().min(1).max(4_000),
95
+ evidence: residentLearningEvidenceSchema,
96
+ })
97
+ .optional(),
98
+ preferences: z
99
+ .array(
100
+ z.object({
101
+ key: name,
102
+ value: z.string().trim().min(1).max(1_000),
103
+ evidence: residentLearningEvidenceSchema,
104
+ }),
105
+ )
106
+ .max(32),
107
+ skills: z.array(learnedSkillSchema).max(16),
108
+ lastChange: residentLearningEvidenceSchema,
109
+ })
110
+ .superRefine((state, context) => {
111
+ if (
112
+ new Set(state.preferences.map((p) => p.key)).size !== state.preferences.length ||
113
+ new Set(state.skills.map((s) => s.name)).size !== state.skills.length ||
114
+ state.skills.some(
115
+ (skill) =>
116
+ skill.hash !== hashResidentSkill(skill) ||
117
+ skill.verification.candidateHash !== skill.hash,
118
+ )
119
+ )
120
+ context.addIssue({
121
+ code: z.ZodIssueCode.custom,
122
+ message: 'Invalid resident learning identity or content digest.',
123
+ })
124
+ })
125
+
126
+ /** @experimental Versioned behavioral overlay; the original resident mandate remains unchanged. */
127
+ export interface ResidentLearningState {
128
+ readonly revision: number
129
+ readonly identity?: { readonly text: string; readonly evidence: ResidentLearningEvidence }
130
+ readonly preferences: readonly {
131
+ readonly key: string
132
+ readonly value: string
133
+ readonly evidence: ResidentLearningEvidence
134
+ }[]
135
+ readonly skills: readonly ResidentLearnedSkill[]
136
+ readonly lastChange: ResidentLearningEvidence
137
+ }
138
+
139
+ /** @experimental Corrections name the current preference evidence they supersede. */
140
+ export interface ResidentProfileUpdate {
141
+ readonly identity?: string
142
+ readonly preferences?: readonly {
143
+ readonly key: string
144
+ readonly value: string
145
+ readonly supersedes: string | null
146
+ }[]
147
+ readonly evidence: ResidentLearningEvidence
148
+ }
149
+
150
+ /** @experimental Recorded paired runs; hosts own execution, scoring and independent attribution. */
151
+ export interface ResidentSkillEvaluation {
152
+ /** Host-owned task selection fixed before generating the candidate. */
153
+ readonly protection: HarnessProtectionPlan
154
+ readonly verification: HarnessVerificationBatch
155
+ readonly confirmation?: HarnessVerificationBatch
156
+ }
157
+
158
+ /** Internal immutable snapshot used by storage and admitted context. */
159
+ export function freezeResidentLearning(input: ResidentLearningState): ResidentLearningState {
160
+ const state = residentLearningSchema.parse(input)
161
+ return Object.freeze({
162
+ ...state,
163
+ ...(state.identity
164
+ ? {
165
+ identity: Object.freeze({
166
+ ...state.identity,
167
+ evidence: Object.freeze(state.identity.evidence),
168
+ }),
169
+ }
170
+ : {}),
171
+ preferences: Object.freeze(
172
+ state.preferences.map((p) => Object.freeze({ ...p, evidence: Object.freeze(p.evidence) })),
173
+ ),
174
+ skills: Object.freeze(
175
+ state.skills.map((skill) =>
176
+ Object.freeze({
177
+ ...skill,
178
+ ...(skill.sources
179
+ ? { sources: Object.freeze(skill.sources.map((source) => Object.freeze(source))) }
180
+ : {}),
181
+ evidence: Object.freeze(skill.evidence),
182
+ verification: Object.freeze({
183
+ ...skill.verification,
184
+ ...(skill.verification.protection
185
+ ? { protection: Object.freeze(skill.verification.protection) }
186
+ : {}),
187
+ }),
188
+ }),
189
+ ),
190
+ ),
191
+ lastChange: Object.freeze(state.lastChange),
192
+ })
193
+ }
194
+
195
+ function evidenceFor(
196
+ current: ResidentLearningState | undefined,
197
+ input: ResidentLearningEvidence,
198
+ ): ResidentLearningEvidence {
199
+ const evidence = residentLearningEvidenceSchema.parse(input)
200
+ const used = [
201
+ current?.lastChange,
202
+ current?.identity?.evidence,
203
+ ...(current?.preferences.map((p) => p.evidence) ?? []),
204
+ ...(current?.skills.map((s) => s.evidence) ?? []),
205
+ ]
206
+ if (used.some((old) => old?.key === evidence.key))
207
+ throw new Error('A learning change requires a fresh evidence key.')
208
+ return evidence
209
+ }
210
+
211
+ function base(
212
+ current: ResidentLearningState | undefined,
213
+ evidence: ResidentLearningEvidence,
214
+ ): ResidentLearningState {
215
+ const checked = current ? freezeResidentLearning(current) : undefined
216
+ return {
217
+ ...checked,
218
+ revision: (checked?.revision ?? 0) + 1,
219
+ preferences: checked?.preferences ?? [],
220
+ skills: checked?.skills ?? [],
221
+ lastChange: evidence,
222
+ }
223
+ }
224
+
225
+ /** Internal pure profile transition; storage owns exact agenda CAS and idle admission. */
226
+ export function reviseResidentProfile(
227
+ current: ResidentLearningState | undefined,
228
+ input: ResidentProfileUpdate,
229
+ ): ResidentLearningState {
230
+ const checked = z
231
+ .object({
232
+ identity: z.string().trim().min(1).max(4_000).optional(),
233
+ preferences: z
234
+ .array(
235
+ z.object({
236
+ key: name,
237
+ value: z.string().trim().min(1).max(1_000),
238
+ supersedes: label.nullable(),
239
+ }),
240
+ )
241
+ .max(32)
242
+ .optional(),
243
+ evidence: residentLearningEvidenceSchema,
244
+ })
245
+ .parse(input)
246
+ if (checked.identity === undefined && !checked.preferences?.length)
247
+ throw new Error('A profile change must change identity or preferences.')
248
+ if (
249
+ new Set(checked.preferences?.map((p) => p.key)).size !== checked.preferences?.length &&
250
+ checked.preferences !== undefined
251
+ )
252
+ throw new Error('Duplicate preference corrections are not allowed.')
253
+ const evidence = evidenceFor(current, checked.evidence)
254
+ const next = base(current, evidence)
255
+ const preferences = [...next.preferences]
256
+ for (const change of checked.preferences ?? []) {
257
+ const index = preferences.findIndex((p) => p.key === change.key)
258
+ const previous = index >= 0 ? preferences[index] : undefined
259
+ if (change.supersedes !== (previous?.evidence.key ?? null))
260
+ throw new Error('Preference correction does not supersede its current evidence.')
261
+ const updated = { key: change.key, value: change.value, evidence }
262
+ if (index < 0) preferences.push(updated)
263
+ else preferences[index] = updated
264
+ }
265
+ return freezeResidentLearning({
266
+ ...next,
267
+ preferences,
268
+ ...(checked.identity !== undefined ? { identity: { text: checked.identity, evidence } } : {}),
269
+ })
270
+ }
271
+
272
+ /** @experimental Bind evaluation to normalized content and any declared source dependencies. */
273
+ export function hashResidentSkill(input: ResidentSkillCandidate): string {
274
+ const candidate = candidateSchema.parse(input)
275
+ return createHash('sha256')
276
+ .update(
277
+ JSON.stringify([
278
+ candidate.name,
279
+ candidate.description,
280
+ candidate.body,
281
+ ...(candidate.sources ? [candidate.sources] : []),
282
+ ...(candidate.purpose === 'exploration' ? [{ purpose: candidate.purpose }] : []),
283
+ ]),
284
+ )
285
+ .digest('hex')
286
+ }
287
+
288
+ /** Internal pure activation; reuse the kernel's conservative two-round verification gate. */
289
+ export function promoteResidentSkill(
290
+ current: ResidentLearningState | undefined,
291
+ input: ResidentSkillCandidate,
292
+ evaluation: ResidentSkillEvaluation,
293
+ inputEvidence: ResidentLearningEvidence,
294
+ ): ResidentLearningState {
295
+ const protection = normalizeHarnessProtection(evaluation.protection)
296
+ const candidate = candidateSchema.parse(input)
297
+ const hash = hashResidentSkill(candidate)
298
+ const baseline = current?.skills.find((s) => s.name === candidate.name)
299
+ if (baseline && (baseline.purpose ?? 'task') !== (candidate.purpose ?? 'task'))
300
+ throw new Error('A skill cannot change learning purpose; use a distinct skill name.')
301
+ const baselineHash = baseline?.hash ?? 'none'
302
+ const evidence = evidenceFor(current, inputEvidence)
303
+ for (const batch of [evaluation.verification, evaluation.confirmation]) {
304
+ if (!batch) continue
305
+ if (batch.baselineRevision !== baselineHash || batch.candidateRevision !== hash)
306
+ throw new Error('Skill evaluation does not match the active baseline and candidate digests.')
307
+ if (
308
+ batch.baseline.length > 128 ||
309
+ batch.candidate.length > 128 ||
310
+ batch.attributions.length > 128
311
+ )
312
+ throw new Error('Resident skill evaluation is bounded to 64 tasks per round.')
313
+ // Recorded evidence must consistently identify success and complete measurements.
314
+ for (const trial of [...batch.baseline, ...batch.candidate]) {
315
+ if (
316
+ trial.result.passed !== (trial.result.status === 'passed') ||
317
+ (trial.result.status === 'passed' && trial.result.failedGates?.length)
318
+ )
319
+ throw new Error('Inconsistent recorded skill evaluation outcome.')
320
+ }
321
+ }
322
+ const review = reviewHarnessCandidate(
323
+ evaluation.verification,
324
+ evaluation.confirmation,
325
+ protection,
326
+ )
327
+ if (review.decision !== 'accept')
328
+ throw new Error(`Resident skill promotion ${review.decision}: ${review.reason}`)
329
+ const skill: ResidentLearnedSkill = {
330
+ ...candidate,
331
+ hash,
332
+ evidence,
333
+ verification: {
334
+ baselineHash,
335
+ candidateHash: hash,
336
+ evidenceDigest: createHash('sha256')
337
+ .update(JSON.stringify({ ...evaluation, protection }))
338
+ .digest('hex'),
339
+ verificationTasks: review.verification.tasks.length,
340
+ confirmationTasks: review.confirmation?.tasks.length ?? 0,
341
+ protection: {
342
+ verificationTasks: protection.verification.length,
343
+ confirmationTasks: protection.confirmation.length,
344
+ planDigest: createHash('sha256').update(JSON.stringify(protection)).digest('hex'),
345
+ },
346
+ },
347
+ }
348
+ const next = base(current, evidence)
349
+ return freezeResidentLearning({
350
+ ...next,
351
+ skills: [...next.skills.filter((s) => s.name !== candidate.name), skill],
352
+ })
353
+ }
354
+
355
+ /** Internal rollback appends a new learning version while preserving current profile values. */
356
+ export function restoreResidentSkill(
357
+ current: ResidentLearningState | undefined,
358
+ historical: ResidentLearningState | undefined,
359
+ skillName: string,
360
+ inputEvidence: ResidentLearningEvidence,
361
+ ): ResidentLearningState {
362
+ name.parse(skillName)
363
+ if (!current?.skills.some((s) => s.name === skillName))
364
+ throw new Error('No active resident skill to roll back.')
365
+ const next = base(current, evidenceFor(current, inputEvidence))
366
+ const previous = historical
367
+ ? freezeResidentLearning(historical).skills.find((s) => s.name === skillName)
368
+ : undefined
369
+ return freezeResidentLearning({
370
+ ...next,
371
+ skills: [...next.skills.filter((s) => s.name !== skillName), ...(previous ? [previous] : [])],
372
+ })
373
+ }
374
+
375
+ /** @experimental Exact skill selection and a character cap, independent of provider token budgets. */
376
+ export interface ResidentLearningProjectionOptions {
377
+ readonly maxChars: number
378
+ readonly skillNames: readonly string[]
379
+ /** Defaults to task guidance. Exploration policies never enter ordinary task context. */
380
+ readonly purpose?: 'task' | 'exploration'
381
+ /** Fresh host observations for this projection; absent/mismatched dependencies withhold guidance. */
382
+ readonly sources?: readonly ResidentLearningSource[]
383
+ }
384
+
385
+ /** @experimental Omitted entries are counted; no partial skill instruction is emitted. */
386
+ export interface ResidentLearningProjection {
387
+ readonly text: string
388
+ readonly revision: number | null
389
+ readonly includedSkills: readonly string[]
390
+ readonly omitted: number
391
+ readonly withheldSkills: readonly {
392
+ readonly name: string
393
+ readonly reason: 'changed-source' | 'unverified-source' | 'different-purpose'
394
+ readonly sourceKeys: readonly string[]
395
+ }[]
396
+ }
397
+
398
+ /** @experimental Bounded context data; never registers tools, loads files or executes a skill. */
399
+ export function projectResidentLearning(
400
+ current: ResidentLearningState | undefined,
401
+ options: ResidentLearningProjectionOptions,
402
+ ): ResidentLearningProjection {
403
+ if (!Number.isSafeInteger(options.maxChars) || options.maxChars < 0 || options.maxChars > 64_000)
404
+ throw new TypeError('Resident learning context requires maxChars between 0 and 64000.')
405
+ const selected = z.array(name).max(16).parse(options.skillNames)
406
+ const purpose = z.enum(['task', 'exploration']).parse(options.purpose ?? 'task')
407
+ if (new Set(selected).size !== selected.length) throw new Error('Duplicate selected skill names.')
408
+ const sources = z
409
+ .array(sourceSchema)
410
+ .max(128)
411
+ .parse(options.sources ?? [])
412
+ if (new Set(sources.map((source) => source.key)).size !== sources.length)
413
+ throw new Error('Duplicate observed learning source keys.')
414
+ const observed = new Map(sources.map((source) => [source.key, source.revision]))
415
+ if (!current)
416
+ return Object.freeze({
417
+ text: '',
418
+ revision: null,
419
+ includedSkills: Object.freeze([]),
420
+ omitted: selected.length,
421
+ withheldSkills: Object.freeze([]),
422
+ })
423
+ const state = freezeResidentLearning(current)
424
+ const pieces: string[] = []
425
+ const includedSkills: string[] = []
426
+ const withheldSkills: ResidentLearningProjection['withheldSkills'][number][] = []
427
+ let omitted = 0
428
+ let length = 0
429
+ const add = (value: unknown): boolean => {
430
+ const part = JSON.stringify(value)
431
+ const size = part.length + (pieces.length ? 1 : 0)
432
+ if (length + size > options.maxChars) {
433
+ omitted++
434
+ return false
435
+ }
436
+ pieces.push(part)
437
+ length += size
438
+ return true
439
+ }
440
+ if (state.identity) add({ kind: 'self-description', ...state.identity })
441
+ for (const preference of state.preferences) add({ kind: 'preference', ...preference })
442
+ for (const skillName of selected) {
443
+ const skill = state.skills.find((s) => s.name === skillName)
444
+ if (!skill) {
445
+ omitted++
446
+ continue
447
+ }
448
+ if ((skill.purpose ?? 'task') !== purpose) {
449
+ omitted++
450
+ withheldSkills.push(
451
+ Object.freeze({
452
+ name: skill.name,
453
+ reason: 'different-purpose',
454
+ sourceKeys: Object.freeze([]),
455
+ }),
456
+ )
457
+ continue
458
+ }
459
+ const mismatched =
460
+ skill.sources?.filter((source) => observed.get(source.key) !== source.revision) ?? []
461
+ if (mismatched.length) {
462
+ omitted++
463
+ withheldSkills.push(
464
+ Object.freeze({
465
+ name: skill.name,
466
+ reason: mismatched.some((source) => observed.has(source.key))
467
+ ? 'changed-source'
468
+ : 'unverified-source',
469
+ sourceKeys: Object.freeze(mismatched.map((source) => source.key)),
470
+ }),
471
+ )
472
+ continue
473
+ }
474
+ if (
475
+ add({
476
+ kind: 'evaluated-guidance',
477
+ name: skill.name,
478
+ description: skill.description,
479
+ body: skill.body,
480
+ hash: skill.hash,
481
+ evidence: skill.evidence,
482
+ })
483
+ )
484
+ includedSkills.push(skill.name)
485
+ }
486
+ return Object.freeze({
487
+ text: pieces.join('\n'),
488
+ revision: state.revision,
489
+ includedSkills: Object.freeze(includedSkills),
490
+ omitted,
491
+ withheldSkills: Object.freeze(withheldSkills),
492
+ })
493
+ }
@@ -0,0 +1,101 @@
1
+ import { setTimeout as sleep } from 'node:timers/promises'
2
+ import {
3
+ ResidentConflictError,
4
+ type ResidentDecision,
5
+ type ResidentExecutionStore,
6
+ type ResidentState,
7
+ } from './store.js'
8
+
9
+ /** @experimental Developer-owned step; bind providers, tools and budgets in the host. */
10
+ export type ResidentStep = (state: ResidentState, signal: AbortSignal) => Promise<ResidentDecision>
11
+
12
+ /** @experimental No model is invoked for an idle, terminal or unresolved resident. */
13
+ export type ResidentStepResult =
14
+ | { status: 'settled'; state: ResidentState }
15
+ | {
16
+ status: 'idle'
17
+ reason: 'not-due' | 'terminal' | 'unresolved' | 'contended'
18
+ state: ResidentState
19
+ }
20
+
21
+ /** @experimental A failed/aborted callback leaves its durable claim unresolved. */
22
+ export async function stepResident(
23
+ store: ResidentExecutionStore,
24
+ step: ResidentStep,
25
+ signal: AbortSignal,
26
+ now: () => number = Date.now,
27
+ ): Promise<ResidentStepResult> {
28
+ signal.throwIfAborted()
29
+ const state = await store.read()
30
+ signal.throwIfAborted()
31
+ if (!state) throw new Error('Create the resident before running it.')
32
+ if (state.phase === 'running') return { status: 'idle', reason: 'unresolved', state }
33
+ if (state.phase !== 'waiting') return { status: 'idle', reason: 'terminal', state }
34
+ if (state.wakeAt === null || state.wakeAt > now())
35
+ return { status: 'idle', reason: 'not-due', state }
36
+ let claim: ResidentState
37
+ try {
38
+ claim = await store.claim(state, now())
39
+ } catch (error) {
40
+ if (!(error instanceof ResidentConflictError)) throw error
41
+ return {
42
+ status: 'idle',
43
+ reason: 'contended',
44
+ state: (await store.read()) ?? state,
45
+ }
46
+ }
47
+ signal.throwIfAborted()
48
+ const decision = await step(claim, signal)
49
+ signal.throwIfAborted()
50
+ return {
51
+ status: 'settled',
52
+ state: await store.settle(claim, decision, now()),
53
+ }
54
+ }
55
+
56
+ /** @experimental Bounded local driver; not a daemon, process recovery service or notification transport. */
57
+ export interface ResidentLoopOptions {
58
+ readonly store: ResidentExecutionStore
59
+ readonly step: ResidentStep
60
+ readonly signal: AbortSignal
61
+ /** Required finite admission cap for this invocation, independent of provider token limits. */
62
+ readonly maxSteps: number
63
+ /** Maximum single idle wait, default 60 seconds. Longer waits return control to the host. */
64
+ readonly maxIdleMs?: number
65
+ }
66
+
67
+ /**
68
+ * @experimental Continue a pursuit without a new user message. Null wake times
69
+ * and terminal states stop immediately; cancellation also interrupts idle waits.
70
+ * An abort cannot undo callback effects or forcibly stop a callback ignoring its signal.
71
+ */
72
+ export async function runResident(options: ResidentLoopOptions): Promise<ResidentStepResult> {
73
+ const maxIdleMs = options.maxIdleMs ?? 60_000
74
+ if (
75
+ !Number.isSafeInteger(options.maxSteps) ||
76
+ options.maxSteps < 1 ||
77
+ !Number.isSafeInteger(maxIdleMs) ||
78
+ maxIdleMs < 0 ||
79
+ maxIdleMs > 2_147_483_647
80
+ ) {
81
+ throw new TypeError(
82
+ 'Resident loop requires positive finite maxSteps and bounded nonnegative maxIdleMs.',
83
+ )
84
+ }
85
+ let admitted = 0
86
+ while (true) {
87
+ const result = await stepResident(options.store, options.step, options.signal)
88
+ if (result.status === 'settled') admitted++
89
+ if (admitted >= options.maxSteps) return result
90
+ const { state } = result
91
+ if (
92
+ state.phase !== 'waiting' ||
93
+ state.wakeAt === null ||
94
+ (result.status === 'idle' && result.reason !== 'not-due')
95
+ )
96
+ return result
97
+ const delay = Math.max(0, state.wakeAt - Date.now())
98
+ if (delay > maxIdleMs) return result
99
+ await sleep(Math.max(1, delay), undefined, { signal: options.signal })
100
+ }
101
+ }