@namzu/sdk 48.3.1 → 50.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 (838) hide show
  1. package/CHANGELOG.md +542 -0
  2. package/README.md +137 -125
  3. package/dist/agents/QueryAgent.d.ts.map +1 -1
  4. package/dist/agents/QueryAgent.js +1 -0
  5. package/dist/agents/QueryAgent.js.map +1 -1
  6. package/dist/agents/examples/SupervisorAgent.d.ts.map +1 -1
  7. package/dist/agents/examples/SupervisorAgent.js +1 -0
  8. package/dist/agents/examples/SupervisorAgent.js.map +1 -1
  9. package/dist/agents/runAgent.d.ts +2 -0
  10. package/dist/agents/runAgent.d.ts.map +1 -1
  11. package/dist/agents/runAgent.js +1 -0
  12. package/dist/agents/runAgent.js.map +1 -1
  13. package/dist/authorization/shell-lexer.d.ts.map +1 -1
  14. package/dist/authorization/shell-lexer.js +16 -1
  15. package/dist/authorization/shell-lexer.js.map +1 -1
  16. package/dist/bridge/acp/permission.d.ts +8 -2
  17. package/dist/bridge/acp/permission.d.ts.map +1 -1
  18. package/dist/bridge/acp/permission.js +1 -0
  19. package/dist/bridge/acp/permission.js.map +1 -1
  20. package/dist/bridge/acp/server.d.ts +25 -1
  21. package/dist/bridge/acp/server.d.ts.map +1 -1
  22. package/dist/bridge/acp/server.js +205 -21
  23. package/dist/bridge/acp/server.js.map +1 -1
  24. package/dist/bridge/acp/tasks.d.ts +5 -0
  25. package/dist/bridge/acp/tasks.d.ts.map +1 -0
  26. package/dist/bridge/acp/tasks.js +19 -0
  27. package/dist/bridge/acp/tasks.js.map +1 -0
  28. package/dist/bridge/acp/update.d.ts.map +1 -1
  29. package/dist/bridge/acp/update.js +148 -13
  30. package/dist/bridge/acp/update.js.map +1 -1
  31. package/dist/config/registry.d.ts +2 -0
  32. package/dist/config/registry.d.ts.map +1 -1
  33. package/dist/config/registry.js +23 -3
  34. package/dist/config/registry.js.map +1 -1
  35. package/dist/config/runtime.d.ts +31 -31
  36. package/dist/connector/mcp/adapter.d.ts.map +1 -1
  37. package/dist/connector/mcp/adapter.js +11 -4
  38. package/dist/connector/mcp/adapter.js.map +1 -1
  39. package/dist/connector/mcp/client.d.ts.map +1 -1
  40. package/dist/connector/mcp/client.js +6 -3
  41. package/dist/connector/mcp/client.js.map +1 -1
  42. package/dist/connector/mcp/discovery.d.ts +9 -5
  43. package/dist/connector/mcp/discovery.d.ts.map +1 -1
  44. package/dist/connector/mcp/discovery.js +16 -8
  45. package/dist/connector/mcp/discovery.js.map +1 -1
  46. package/dist/connector/mcp/mcp-toolset.d.ts +3 -0
  47. package/dist/connector/mcp/mcp-toolset.d.ts.map +1 -1
  48. package/dist/connector/mcp/mcp-toolset.js +20 -2
  49. package/dist/connector/mcp/mcp-toolset.js.map +1 -1
  50. package/dist/connector/mcp/reconnect.d.ts +2 -0
  51. package/dist/connector/mcp/reconnect.d.ts.map +1 -1
  52. package/dist/connector/mcp/reconnect.js +36 -5
  53. package/dist/connector/mcp/reconnect.js.map +1 -1
  54. package/dist/constants/acp/index.d.ts +3 -0
  55. package/dist/constants/acp/index.d.ts.map +1 -1
  56. package/dist/constants/acp/index.js +3 -0
  57. package/dist/constants/acp/index.js.map +1 -1
  58. package/dist/contracts/a2a.d.ts +80 -80
  59. package/dist/contracts/schemas.d.ts +2 -2
  60. package/dist/contracts/session/schemas.d.ts +10 -10
  61. package/dist/manager/agent/lifecycle.d.ts +11 -0
  62. package/dist/manager/agent/lifecycle.d.ts.map +1 -1
  63. package/dist/manager/agent/lifecycle.js +178 -3
  64. package/dist/manager/agent/lifecycle.js.map +1 -1
  65. package/dist/manager/plan/lifecycle.d.ts +7 -8
  66. package/dist/manager/plan/lifecycle.d.ts.map +1 -1
  67. package/dist/manager/plan/lifecycle.js +7 -8
  68. package/dist/manager/plan/lifecycle.js.map +1 -1
  69. package/dist/manager/resident/consumption.d.ts +8 -8
  70. package/dist/manager/resident/learning-cycle.d.ts +2 -2
  71. package/dist/manager/resident/learning-observation.d.ts +12 -12
  72. package/dist/manager/resident/learning.d.ts +82 -82
  73. package/dist/manager/resident/outbox.d.ts +8 -8
  74. package/dist/manager/resident/proposal.d.ts +2 -2
  75. package/dist/manager/resident/store.d.ts +10 -10
  76. package/dist/manager/session/attribution.d.ts +1 -0
  77. package/dist/manager/session/attribution.d.ts.map +1 -1
  78. package/dist/manager/session/attribution.js +9 -1
  79. package/dist/manager/session/attribution.js.map +1 -1
  80. package/dist/manager/session/streamed-message-identity.d.ts +6 -0
  81. package/dist/manager/session/streamed-message-identity.d.ts.map +1 -0
  82. package/dist/manager/session/streamed-message-identity.js +14 -0
  83. package/dist/manager/session/streamed-message-identity.js.map +1 -0
  84. package/dist/manager/session/turn-recorder.d.ts.map +1 -1
  85. package/dist/manager/session/turn-recorder.js +4 -3
  86. package/dist/manager/session/turn-recorder.js.map +1 -1
  87. package/dist/pals/activity/causality.d.ts +23 -0
  88. package/dist/pals/activity/causality.d.ts.map +1 -0
  89. package/dist/pals/activity/causality.js +205 -0
  90. package/dist/pals/activity/causality.js.map +1 -0
  91. package/dist/pals/activity/projection.d.ts +5 -0
  92. package/dist/pals/activity/projection.d.ts.map +1 -0
  93. package/dist/pals/activity/projection.js +79 -0
  94. package/dist/pals/activity/projection.js.map +1 -0
  95. package/dist/pals/activity/source.d.ts +16 -0
  96. package/dist/pals/activity/source.d.ts.map +1 -0
  97. package/dist/pals/activity/source.js +235 -0
  98. package/dist/pals/activity/source.js.map +1 -0
  99. package/dist/pals/activity/subscription-policy.d.ts +38 -0
  100. package/dist/pals/activity/subscription-policy.d.ts.map +1 -0
  101. package/dist/pals/activity/subscription-policy.js +183 -0
  102. package/dist/pals/activity/subscription-policy.js.map +1 -0
  103. package/dist/pals/activity/subscription-schema.d.ts +353 -0
  104. package/dist/pals/activity/subscription-schema.d.ts.map +1 -0
  105. package/dist/pals/activity/subscription-schema.js +24 -0
  106. package/dist/pals/activity/subscription-schema.js.map +1 -0
  107. package/dist/pals/activity/subscription-store.d.ts +25 -0
  108. package/dist/pals/activity/subscription-store.d.ts.map +1 -0
  109. package/dist/pals/activity/subscription-store.js +152 -0
  110. package/dist/pals/activity/subscription-store.js.map +1 -0
  111. package/dist/pals/activity/subscription-types.d.ts +42 -0
  112. package/dist/pals/activity/subscription-types.d.ts.map +1 -0
  113. package/dist/pals/activity/subscription-types.js +2 -0
  114. package/dist/pals/activity/subscription-types.js.map +1 -0
  115. package/dist/pals/activity/subscriptions.d.ts +32 -0
  116. package/dist/pals/activity/subscriptions.d.ts.map +1 -0
  117. package/dist/pals/activity/subscriptions.js +151 -0
  118. package/dist/pals/activity/subscriptions.js.map +1 -0
  119. package/dist/pals/activity/types.d.ts +77 -0
  120. package/dist/pals/activity/types.d.ts.map +1 -0
  121. package/dist/pals/activity/types.js +2 -0
  122. package/dist/pals/activity/types.js.map +1 -0
  123. package/dist/pals/channels/ingress.d.ts +9 -0
  124. package/dist/pals/channels/ingress.d.ts.map +1 -0
  125. package/dist/pals/channels/ingress.js +131 -0
  126. package/dist/pals/channels/ingress.js.map +1 -0
  127. package/dist/pals/channels/routes.d.ts +20 -0
  128. package/dist/pals/channels/routes.d.ts.map +1 -0
  129. package/dist/pals/channels/routes.js +111 -0
  130. package/dist/pals/channels/routes.js.map +1 -0
  131. package/dist/pals/channels/routing.d.ts +37 -0
  132. package/dist/pals/channels/routing.d.ts.map +1 -0
  133. package/dist/pals/channels/routing.js +150 -0
  134. package/dist/pals/channels/routing.js.map +1 -0
  135. package/dist/pals/channels/schema.d.ts +234 -0
  136. package/dist/pals/channels/schema.d.ts.map +1 -0
  137. package/dist/pals/channels/schema.js +94 -0
  138. package/dist/pals/channels/schema.js.map +1 -0
  139. package/dist/pals/channels/types.d.ts +115 -0
  140. package/dist/pals/channels/types.d.ts.map +1 -0
  141. package/dist/pals/channels/types.js +2 -0
  142. package/dist/pals/channels/types.js.map +1 -0
  143. package/dist/pals/communication/broker.d.ts +8 -0
  144. package/dist/pals/communication/broker.d.ts.map +1 -0
  145. package/dist/pals/communication/broker.js +121 -0
  146. package/dist/pals/communication/broker.js.map +1 -0
  147. package/dist/pals/communication/dispatch.d.ts +4 -0
  148. package/dist/pals/communication/dispatch.d.ts.map +1 -0
  149. package/dist/pals/communication/dispatch.js +57 -0
  150. package/dist/pals/communication/dispatch.js.map +1 -0
  151. package/dist/pals/communication/inbound.d.ts +9 -0
  152. package/dist/pals/communication/inbound.d.ts.map +1 -0
  153. package/dist/pals/communication/inbound.js +155 -0
  154. package/dist/pals/communication/inbound.js.map +1 -0
  155. package/dist/pals/communication/ingress-dispatch.d.ts +5 -0
  156. package/dist/pals/communication/ingress-dispatch.d.ts.map +1 -0
  157. package/dist/pals/communication/ingress-dispatch.js +51 -0
  158. package/dist/pals/communication/ingress-dispatch.js.map +1 -0
  159. package/dist/pals/communication/ingress-inbound.d.ts +9 -0
  160. package/dist/pals/communication/ingress-inbound.d.ts.map +1 -0
  161. package/dist/pals/communication/ingress-inbound.js +222 -0
  162. package/dist/pals/communication/ingress-inbound.js.map +1 -0
  163. package/dist/pals/communication/ingress-schema.d.ts +7829 -0
  164. package/dist/pals/communication/ingress-schema.d.ts.map +1 -0
  165. package/dist/pals/communication/ingress-schema.js +479 -0
  166. package/dist/pals/communication/ingress-schema.js.map +1 -0
  167. package/dist/pals/communication/ingress-types.d.ts +187 -0
  168. package/dist/pals/communication/ingress-types.d.ts.map +1 -0
  169. package/dist/pals/communication/ingress-types.js +73 -0
  170. package/dist/pals/communication/ingress-types.js.map +1 -0
  171. package/dist/pals/communication/operator.d.ts +75 -0
  172. package/dist/pals/communication/operator.d.ts.map +1 -0
  173. package/dist/pals/communication/operator.js +217 -0
  174. package/dist/pals/communication/operator.js.map +1 -0
  175. package/dist/pals/communication/policy.d.ts +41 -0
  176. package/dist/pals/communication/policy.d.ts.map +1 -0
  177. package/dist/pals/communication/policy.js +138 -0
  178. package/dist/pals/communication/policy.js.map +1 -0
  179. package/dist/pals/communication/schema.d.ts +2000 -0
  180. package/dist/pals/communication/schema.d.ts.map +1 -0
  181. package/dist/pals/communication/schema.js +170 -0
  182. package/dist/pals/communication/schema.js.map +1 -0
  183. package/dist/pals/communication/store.d.ts +61 -0
  184. package/dist/pals/communication/store.d.ts.map +1 -0
  185. package/dist/pals/communication/store.js +450 -0
  186. package/dist/pals/communication/store.js.map +1 -0
  187. package/dist/pals/communication/tools.d.ts +23 -0
  188. package/dist/pals/communication/tools.d.ts.map +1 -0
  189. package/dist/pals/communication/tools.js +107 -0
  190. package/dist/pals/communication/tools.js.map +1 -0
  191. package/dist/pals/communication/types.d.ts +168 -0
  192. package/dist/pals/communication/types.d.ts.map +1 -0
  193. package/dist/pals/communication/types.js +24 -0
  194. package/dist/pals/communication/types.js.map +1 -0
  195. package/dist/pals/communication/verify.d.ts +22 -0
  196. package/dist/pals/communication/verify.d.ts.map +1 -0
  197. package/dist/pals/communication/verify.js +142 -0
  198. package/dist/pals/communication/verify.js.map +1 -0
  199. package/dist/pals/lifecycle.d.ts +37 -0
  200. package/dist/pals/lifecycle.d.ts.map +1 -0
  201. package/dist/pals/lifecycle.js +22 -0
  202. package/dist/pals/lifecycle.js.map +1 -0
  203. package/dist/pals/prompt.d.ts +30 -0
  204. package/dist/pals/prompt.d.ts.map +1 -0
  205. package/dist/pals/prompt.js +65 -0
  206. package/dist/pals/prompt.js.map +1 -0
  207. package/dist/pals/reference-images.d.ts +44 -0
  208. package/dist/pals/reference-images.d.ts.map +1 -0
  209. package/dist/pals/reference-images.js +248 -0
  210. package/dist/pals/reference-images.js.map +1 -0
  211. package/dist/pals/runtime.d.ts +46 -0
  212. package/dist/pals/runtime.d.ts.map +1 -0
  213. package/dist/pals/runtime.js +624 -0
  214. package/dist/pals/runtime.js.map +1 -0
  215. package/dist/pals/store.d.ts +26 -0
  216. package/dist/pals/store.d.ts.map +1 -0
  217. package/dist/pals/store.js +334 -0
  218. package/dist/pals/store.js.map +1 -0
  219. package/dist/pals/types.d.ts +145 -0
  220. package/dist/pals/types.d.ts.map +1 -0
  221. package/dist/pals/types.js +2 -0
  222. package/dist/pals/types.js.map +1 -0
  223. package/dist/peers/envelope.js +1 -1
  224. package/dist/peers/envelope.js.map +1 -1
  225. package/dist/peers/protocol.d.ts +83 -83
  226. package/dist/peers/record.d.ts +10 -10
  227. package/dist/plugin/lifecycle.d.ts +14 -10
  228. package/dist/plugin/lifecycle.d.ts.map +1 -1
  229. package/dist/plugin/lifecycle.js +178 -41
  230. package/dist/plugin/lifecycle.js.map +1 -1
  231. package/dist/plugin/shell-hook.d.ts.map +1 -1
  232. package/dist/plugin/shell-hook.js +7 -2
  233. package/dist/plugin/shell-hook.js.map +1 -1
  234. package/dist/process/kill-tree.d.ts.map +1 -1
  235. package/dist/process/kill-tree.js +9 -1
  236. package/dist/process/kill-tree.js.map +1 -1
  237. package/dist/prompt/resident-learning.js +2 -2
  238. package/dist/prompt/resident-learning.js.map +1 -1
  239. package/dist/prompt/resident-step.d.ts +2 -2
  240. package/dist/prompt/resident-step.js +4 -4
  241. package/dist/prompt/resident-step.js.map +1 -1
  242. package/dist/provider/errors.d.ts +19 -0
  243. package/dist/provider/errors.d.ts.map +1 -1
  244. package/dist/provider/errors.js +123 -2
  245. package/dist/provider/errors.js.map +1 -1
  246. package/dist/public-runtime.d.ts +43 -15
  247. package/dist/public-runtime.d.ts.map +1 -1
  248. package/dist/public-runtime.js +37 -9
  249. package/dist/public-runtime.js.map +1 -1
  250. package/dist/public-tools.d.ts +8 -3
  251. package/dist/public-tools.d.ts.map +1 -1
  252. package/dist/public-tools.js +8 -3
  253. package/dist/public-tools.js.map +1 -1
  254. package/dist/public-types.d.ts +27 -7
  255. package/dist/public-types.d.ts.map +1 -1
  256. package/dist/registry/tool/presentation.d.ts +1 -0
  257. package/dist/registry/tool/presentation.d.ts.map +1 -1
  258. package/dist/registry/tool/presentation.js +9 -7
  259. package/dist/registry/tool/presentation.js.map +1 -1
  260. package/dist/registry/tool/screen.d.ts.map +1 -1
  261. package/dist/registry/tool/screen.js +33 -2
  262. package/dist/registry/tool/screen.js.map +1 -1
  263. package/dist/runtime/harness-session/index.d.ts +5 -0
  264. package/dist/runtime/harness-session/index.d.ts.map +1 -0
  265. package/dist/runtime/harness-session/index.js +928 -0
  266. package/dist/runtime/harness-session/index.js.map +1 -0
  267. package/dist/runtime/harness-session/journal.d.ts +37 -0
  268. package/dist/runtime/harness-session/journal.d.ts.map +1 -0
  269. package/dist/runtime/harness-session/journal.js +177 -0
  270. package/dist/runtime/harness-session/journal.js.map +1 -0
  271. package/dist/runtime/harness-session/saved-view.d.ts +8 -0
  272. package/dist/runtime/harness-session/saved-view.d.ts.map +1 -0
  273. package/dist/runtime/harness-session/saved-view.js +112 -0
  274. package/dist/runtime/harness-session/saved-view.js.map +1 -0
  275. package/dist/runtime/jobs/awaited-jobs.d.ts +2 -1
  276. package/dist/runtime/jobs/awaited-jobs.d.ts.map +1 -1
  277. package/dist/runtime/jobs/awaited-jobs.js +2 -1
  278. package/dist/runtime/jobs/awaited-jobs.js.map +1 -1
  279. package/dist/runtime/jobs/registry.d.ts +56 -1
  280. package/dist/runtime/jobs/registry.d.ts.map +1 -1
  281. package/dist/runtime/jobs/registry.js +377 -39
  282. package/dist/runtime/jobs/registry.js.map +1 -1
  283. package/dist/runtime/query/abandon-turn.d.ts +12 -1
  284. package/dist/runtime/query/abandon-turn.d.ts.map +1 -1
  285. package/dist/runtime/query/abandon-turn.js +3 -1
  286. package/dist/runtime/query/abandon-turn.js.map +1 -1
  287. package/dist/runtime/query/checkpoint.d.ts +4 -0
  288. package/dist/runtime/query/checkpoint.d.ts.map +1 -1
  289. package/dist/runtime/query/checkpoint.js +10 -0
  290. package/dist/runtime/query/checkpoint.js.map +1 -1
  291. package/dist/runtime/query/durable-inbound.d.ts +5 -0
  292. package/dist/runtime/query/durable-inbound.d.ts.map +1 -0
  293. package/dist/runtime/query/durable-inbound.js +89 -0
  294. package/dist/runtime/query/durable-inbound.js.map +1 -0
  295. package/dist/runtime/query/events.d.ts +4 -0
  296. package/dist/runtime/query/events.d.ts.map +1 -1
  297. package/dist/runtime/query/events.js +22 -5
  298. package/dist/runtime/query/events.js.map +1 -1
  299. package/dist/runtime/query/executor/tool-call-admission.d.ts +5 -1
  300. package/dist/runtime/query/executor/tool-call-admission.d.ts.map +1 -1
  301. package/dist/runtime/query/executor/tool-call-admission.js +85 -13
  302. package/dist/runtime/query/executor/tool-call-admission.js.map +1 -1
  303. package/dist/runtime/query/executor.d.ts +41 -18
  304. package/dist/runtime/query/executor.d.ts.map +1 -1
  305. package/dist/runtime/query/executor.js +227 -114
  306. package/dist/runtime/query/executor.js.map +1 -1
  307. package/dist/runtime/query/index.d.ts +9 -0
  308. package/dist/runtime/query/index.d.ts.map +1 -1
  309. package/dist/runtime/query/index.js +41 -5
  310. package/dist/runtime/query/index.js.map +1 -1
  311. package/dist/runtime/query/iteration/index.d.ts +18 -6
  312. package/dist/runtime/query/iteration/index.d.ts.map +1 -1
  313. package/dist/runtime/query/iteration/index.js +176 -75
  314. package/dist/runtime/query/iteration/index.js.map +1 -1
  315. package/dist/runtime/query/iteration/outstanding-work.d.ts +9 -5
  316. package/dist/runtime/query/iteration/outstanding-work.d.ts.map +1 -1
  317. package/dist/runtime/query/iteration/outstanding-work.js +63 -6
  318. package/dist/runtime/query/iteration/outstanding-work.js.map +1 -1
  319. package/dist/runtime/query/iteration/phases/context.d.ts +8 -0
  320. package/dist/runtime/query/iteration/phases/context.d.ts.map +1 -1
  321. package/dist/runtime/query/iteration/phases/context.js.map +1 -1
  322. package/dist/runtime/query/iteration/phases/tool-review.d.ts.map +1 -1
  323. package/dist/runtime/query/iteration/phases/tool-review.js +106 -17
  324. package/dist/runtime/query/iteration/phases/tool-review.js.map +1 -1
  325. package/dist/runtime/query/iteration/step-shaping.d.ts +2 -0
  326. package/dist/runtime/query/iteration/step-shaping.d.ts.map +1 -1
  327. package/dist/runtime/query/iteration/step-shaping.js +5 -1
  328. package/dist/runtime/query/iteration/step-shaping.js.map +1 -1
  329. package/dist/runtime/query/observation-context.d.ts +2 -2
  330. package/dist/runtime/query/observation-context.d.ts.map +1 -1
  331. package/dist/runtime/query/observation-context.js +20 -13
  332. package/dist/runtime/query/observation-context.js.map +1 -1
  333. package/dist/runtime/query/prepare-turn.js +2 -2
  334. package/dist/runtime/query/prepare-turn.js.map +1 -1
  335. package/dist/runtime/query/prompt-cache.d.ts +1 -0
  336. package/dist/runtime/query/prompt-cache.d.ts.map +1 -1
  337. package/dist/runtime/query/prompt-cache.js +2 -0
  338. package/dist/runtime/query/prompt-cache.js.map +1 -1
  339. package/dist/runtime/query/prompt.d.ts +2 -0
  340. package/dist/runtime/query/prompt.d.ts.map +1 -1
  341. package/dist/runtime/query/prompt.js +23 -1
  342. package/dist/runtime/query/prompt.js.map +1 -1
  343. package/dist/runtime/query/repeat-call.d.ts +12 -3
  344. package/dist/runtime/query/repeat-call.d.ts.map +1 -1
  345. package/dist/runtime/query/repeat-call.js +33 -10
  346. package/dist/runtime/query/repeat-call.js.map +1 -1
  347. package/dist/runtime/query/resume-pending.d.ts +5 -6
  348. package/dist/runtime/query/resume-pending.d.ts.map +1 -1
  349. package/dist/runtime/query/resume-pending.js +30 -3
  350. package/dist/runtime/query/resume-pending.js.map +1 -1
  351. package/dist/runtime/query/resume-session.js +1 -1
  352. package/dist/runtime/query/resume-session.js.map +1 -1
  353. package/dist/runtime/query/review-policy.d.ts +8 -1
  354. package/dist/runtime/query/review-policy.d.ts.map +1 -1
  355. package/dist/runtime/query/review-policy.js +6 -0
  356. package/dist/runtime/query/review-policy.js.map +1 -1
  357. package/dist/runtime/query/saved-presentation.d.ts +13 -0
  358. package/dist/runtime/query/saved-presentation.d.ts.map +1 -0
  359. package/dist/runtime/query/saved-presentation.js +63 -0
  360. package/dist/runtime/query/saved-presentation.js.map +1 -0
  361. package/dist/runtime/query/steering.d.ts +6 -9
  362. package/dist/runtime/query/steering.d.ts.map +1 -1
  363. package/dist/runtime/query/steering.js.map +1 -1
  364. package/dist/runtime/query/tool-executions.d.ts +7 -3
  365. package/dist/runtime/query/tool-executions.d.ts.map +1 -1
  366. package/dist/runtime/query/tool-executions.js +89 -9
  367. package/dist/runtime/query/tool-executions.js.map +1 -1
  368. package/dist/runtime/query/tooling.d.ts +3 -1
  369. package/dist/runtime/query/tooling.d.ts.map +1 -1
  370. package/dist/runtime/query/tooling.js +3 -0
  371. package/dist/runtime/query/tooling.js.map +1 -1
  372. package/dist/scheduler/completion-inbox.d.ts +25 -1
  373. package/dist/scheduler/completion-inbox.d.ts.map +1 -1
  374. package/dist/scheduler/completion-inbox.js +102 -8
  375. package/dist/scheduler/completion-inbox.js.map +1 -1
  376. package/dist/scheduler/delegating.d.ts.map +1 -1
  377. package/dist/scheduler/delegating.js +5 -0
  378. package/dist/scheduler/delegating.js.map +1 -1
  379. package/dist/scheduler/local.d.ts.map +1 -1
  380. package/dist/scheduler/local.js +2 -0
  381. package/dist/scheduler/local.js.map +1 -1
  382. package/dist/session/summary/materialize.d.ts +10 -6
  383. package/dist/session/summary/materialize.d.ts.map +1 -1
  384. package/dist/session/summary/materialize.js +41 -8
  385. package/dist/session/summary/materialize.js.map +1 -1
  386. package/dist/store/budget/ledger.d.ts +9 -0
  387. package/dist/store/budget/ledger.d.ts.map +1 -1
  388. package/dist/store/budget/ledger.js +58 -6
  389. package/dist/store/budget/ledger.js.map +1 -1
  390. package/dist/store/evidence/index-page.d.ts +12 -12
  391. package/dist/store/evidence/source-text.d.ts +4 -4
  392. package/dist/store/index.d.ts +1 -0
  393. package/dist/store/index.d.ts.map +1 -1
  394. package/dist/store/index.js +1 -0
  395. package/dist/store/index.js.map +1 -1
  396. package/dist/store/memory/disk.d.ts +7 -2
  397. package/dist/store/memory/disk.d.ts.map +1 -1
  398. package/dist/store/memory/disk.js +58 -5
  399. package/dist/store/memory/disk.js.map +1 -1
  400. package/dist/store/memory/index.d.ts +9 -0
  401. package/dist/store/memory/index.d.ts.map +1 -1
  402. package/dist/store/memory/index.js +43 -5
  403. package/dist/store/memory/index.js.map +1 -1
  404. package/dist/store/memory/markdown.d.ts +7 -2
  405. package/dist/store/memory/markdown.d.ts.map +1 -1
  406. package/dist/store/memory/markdown.js +33 -0
  407. package/dist/store/memory/markdown.js.map +1 -1
  408. package/dist/store/memory/memory.d.ts +7 -2
  409. package/dist/store/memory/memory.d.ts.map +1 -1
  410. package/dist/store/memory/memory.js +34 -0
  411. package/dist/store/memory/memory.js.map +1 -1
  412. package/dist/store/memory/revision.d.ts +16 -0
  413. package/dist/store/memory/revision.d.ts.map +1 -0
  414. package/dist/store/memory/revision.js +144 -0
  415. package/dist/store/memory/revision.js.map +1 -0
  416. package/dist/store/session/disk.d.ts +9 -4
  417. package/dist/store/session/disk.d.ts.map +1 -1
  418. package/dist/store/session/disk.js +57 -11
  419. package/dist/store/session/disk.js.map +1 -1
  420. package/dist/store/session/memory.d.ts +5 -3
  421. package/dist/store/session/memory.d.ts.map +1 -1
  422. package/dist/store/session/memory.js +24 -7
  423. package/dist/store/session/memory.js.map +1 -1
  424. package/dist/store/session-log/core.d.ts +26 -6
  425. package/dist/store/session-log/core.d.ts.map +1 -1
  426. package/dist/store/session-log/core.js +61 -8
  427. package/dist/store/session-log/core.js.map +1 -1
  428. package/dist/store/session-log/disk.d.ts +2 -2
  429. package/dist/store/session-log/disk.d.ts.map +1 -1
  430. package/dist/store/session-log/disk.js +1 -0
  431. package/dist/store/session-log/disk.js.map +1 -1
  432. package/dist/store/session-log/fold.d.ts +7 -0
  433. package/dist/store/session-log/fold.d.ts.map +1 -1
  434. package/dist/store/session-log/fold.js +21 -0
  435. package/dist/store/session-log/fold.js.map +1 -1
  436. package/dist/store/session-log/index.d.ts +5 -3
  437. package/dist/store/session-log/index.d.ts.map +1 -1
  438. package/dist/store/session-log/index.js +3 -1
  439. package/dist/store/session-log/index.js.map +1 -1
  440. package/dist/store/session-log/memory.d.ts +1 -1
  441. package/dist/store/session-log/memory.d.ts.map +1 -1
  442. package/dist/store/session-log/memory.js +1 -0
  443. package/dist/store/session-log/memory.js.map +1 -1
  444. package/dist/store/session-log/spill.d.ts +10 -3
  445. package/dist/store/session-log/spill.d.ts.map +1 -1
  446. package/dist/store/session-log/spill.js +70 -5
  447. package/dist/store/session-log/spill.js.map +1 -1
  448. package/dist/store/session-log/structured-result.d.ts +21 -0
  449. package/dist/store/session-log/structured-result.d.ts.map +1 -0
  450. package/dist/store/session-log/structured-result.js +67 -0
  451. package/dist/store/session-log/structured-result.js.map +1 -0
  452. package/dist/store/task/disk.d.ts +11 -0
  453. package/dist/store/task/disk.d.ts.map +1 -1
  454. package/dist/store/task/disk.js +41 -2
  455. package/dist/store/task/disk.js.map +1 -1
  456. package/dist/store/task/memory.d.ts.map +1 -1
  457. package/dist/store/task/memory.js +15 -3
  458. package/dist/store/task/memory.js.map +1 -1
  459. package/dist/tools/admit-facts.d.ts +13 -0
  460. package/dist/tools/admit-facts.d.ts.map +1 -0
  461. package/dist/tools/admit-facts.js +142 -0
  462. package/dist/tools/admit-facts.js.map +1 -0
  463. package/dist/tools/builtins/bash.d.ts +4 -1
  464. package/dist/tools/builtins/bash.d.ts.map +1 -1
  465. package/dist/tools/builtins/bash.js +108 -22
  466. package/dist/tools/builtins/bash.js.map +1 -1
  467. package/dist/tools/builtins/browser.d.ts +10 -10
  468. package/dist/tools/builtins/computer-use.d.ts +90 -90
  469. package/dist/tools/builtins/edit.d.ts +17 -0
  470. package/dist/tools/builtins/edit.d.ts.map +1 -1
  471. package/dist/tools/builtins/edit.js +34 -0
  472. package/dist/tools/builtins/edit.js.map +1 -1
  473. package/dist/tools/builtins/file-write-result.d.ts.map +1 -1
  474. package/dist/tools/builtins/file-write-result.js +13 -0
  475. package/dist/tools/builtins/file-write-result.js.map +1 -1
  476. package/dist/tools/builtins/glob.d.ts.map +1 -1
  477. package/dist/tools/builtins/glob.js +12 -0
  478. package/dist/tools/builtins/glob.js.map +1 -1
  479. package/dist/tools/builtins/grep.d.ts.map +1 -1
  480. package/dist/tools/builtins/grep.js +14 -0
  481. package/dist/tools/builtins/grep.js.map +1 -1
  482. package/dist/tools/builtins/index.d.ts +2 -0
  483. package/dist/tools/builtins/index.d.ts.map +1 -1
  484. package/dist/tools/builtins/index.js +1 -0
  485. package/dist/tools/builtins/index.js.map +1 -1
  486. package/dist/tools/builtins/job.d.ts.map +1 -1
  487. package/dist/tools/builtins/job.js +4 -1
  488. package/dist/tools/builtins/job.js.map +1 -1
  489. package/dist/tools/builtins/lsp.d.ts +2 -2
  490. package/dist/tools/builtins/read-file.d.ts.map +1 -1
  491. package/dist/tools/builtins/read-file.js +49 -0
  492. package/dist/tools/builtins/read-file.js.map +1 -1
  493. package/dist/tools/builtins/view-image.d.ts +24 -0
  494. package/dist/tools/builtins/view-image.d.ts.map +1 -0
  495. package/dist/tools/builtins/view-image.js +385 -0
  496. package/dist/tools/builtins/view-image.js.map +1 -0
  497. package/dist/tools/builtins/wait-for-job-bounds.d.ts +8 -4
  498. package/dist/tools/builtins/wait-for-job-bounds.d.ts.map +1 -1
  499. package/dist/tools/builtins/wait-for-job-bounds.js +43 -8
  500. package/dist/tools/builtins/wait-for-job-bounds.js.map +1 -1
  501. package/dist/tools/builtins/wait-for-job.d.ts +3 -0
  502. package/dist/tools/builtins/wait-for-job.d.ts.map +1 -1
  503. package/dist/tools/builtins/wait-for-job.js +127 -15
  504. package/dist/tools/builtins/wait-for-job.js.map +1 -1
  505. package/dist/tools/builtins/write-file.d.ts.map +1 -1
  506. package/dist/tools/builtins/write-file.js +1 -0
  507. package/dist/tools/builtins/write-file.js.map +1 -1
  508. package/dist/tools/command-shell.d.ts +37 -2
  509. package/dist/tools/command-shell.d.ts.map +1 -1
  510. package/dist/tools/command-shell.js +100 -3
  511. package/dist/tools/command-shell.js.map +1 -1
  512. package/dist/tools/coordinator/agent.d.ts +9 -19
  513. package/dist/tools/coordinator/agent.d.ts.map +1 -1
  514. package/dist/tools/coordinator/agent.js.map +1 -1
  515. package/dist/tools/coordinator/index.d.ts.map +1 -1
  516. package/dist/tools/coordinator/index.js +127 -67
  517. package/dist/tools/coordinator/index.js.map +1 -1
  518. package/dist/tools/coordinator/wait-with-idle-bound.d.ts +2 -0
  519. package/dist/tools/coordinator/wait-with-idle-bound.d.ts.map +1 -1
  520. package/dist/tools/coordinator/wait-with-idle-bound.js +1 -1
  521. package/dist/tools/coordinator/wait-with-idle-bound.js.map +1 -1
  522. package/dist/tools/defineTool.d.ts.map +1 -1
  523. package/dist/tools/defineTool.js +4 -0
  524. package/dist/tools/defineTool.js.map +1 -1
  525. package/dist/tools/failure-facts.d.ts +8 -0
  526. package/dist/tools/failure-facts.d.ts.map +1 -0
  527. package/dist/tools/failure-facts.js +24 -0
  528. package/dist/tools/failure-facts.js.map +1 -0
  529. package/dist/tools/host-output.d.ts +24 -0
  530. package/dist/tools/host-output.d.ts.map +1 -0
  531. package/dist/tools/host-output.js +117 -0
  532. package/dist/tools/host-output.js.map +1 -0
  533. package/dist/tools/memory/delete.d.ts.map +1 -1
  534. package/dist/tools/memory/delete.js +38 -3
  535. package/dist/tools/memory/delete.js.map +1 -1
  536. package/dist/tools/memory/read.d.ts.map +1 -1
  537. package/dist/tools/memory/read.js +38 -2
  538. package/dist/tools/memory/read.js.map +1 -1
  539. package/dist/tools/memory/search.d.ts.map +1 -1
  540. package/dist/tools/memory/search.js +38 -7
  541. package/dist/tools/memory/search.js.map +1 -1
  542. package/dist/tools/memory/update.d.ts.map +1 -1
  543. package/dist/tools/memory/update.js +30 -3
  544. package/dist/tools/memory/update.js.map +1 -1
  545. package/dist/tools/oem-code-pages.d.ts +8 -0
  546. package/dist/tools/oem-code-pages.d.ts.map +1 -0
  547. package/dist/tools/oem-code-pages.js +23 -0
  548. package/dist/tools/oem-code-pages.js.map +1 -0
  549. package/dist/tools/schedules/schedule-tool.d.ts.map +1 -1
  550. package/dist/tools/schedules/schedule-tool.js +35 -6
  551. package/dist/tools/schedules/schedule-tool.js.map +1 -1
  552. package/dist/tools/schedules/types.d.ts +23 -3
  553. package/dist/tools/schedules/types.d.ts.map +1 -1
  554. package/dist/tools/task/list.d.ts.map +1 -1
  555. package/dist/tools/task/list.js +14 -6
  556. package/dist/tools/task/list.js.map +1 -1
  557. package/dist/tools/task/present.d.ts.map +1 -1
  558. package/dist/tools/task/present.js +26 -6
  559. package/dist/tools/task/present.js.map +1 -1
  560. package/dist/tools/task/update.d.ts.map +1 -1
  561. package/dist/tools/task/update.js +12 -5
  562. package/dist/tools/task/update.js.map +1 -1
  563. package/dist/tools/text-window.d.ts +19 -0
  564. package/dist/tools/text-window.d.ts.map +1 -0
  565. package/dist/tools/text-window.js +83 -0
  566. package/dist/tools/text-window.js.map +1 -0
  567. package/dist/toolsets/manager.d.ts +24 -0
  568. package/dist/toolsets/manager.d.ts.map +1 -1
  569. package/dist/toolsets/manager.js +105 -2
  570. package/dist/toolsets/manager.js.map +1 -1
  571. package/dist/turn/memory-recall.d.ts +2 -0
  572. package/dist/turn/memory-recall.d.ts.map +1 -1
  573. package/dist/turn/memory-recall.js +3 -1
  574. package/dist/turn/memory-recall.js.map +1 -1
  575. package/dist/types/acp/index.d.ts +137 -1
  576. package/dist/types/acp/index.d.ts.map +1 -1
  577. package/dist/types/agent/base.d.ts +3 -0
  578. package/dist/types/agent/base.d.ts.map +1 -1
  579. package/dist/types/agent/manager.d.ts +8 -23
  580. package/dist/types/agent/manager.d.ts.map +1 -1
  581. package/dist/types/agent/scheduler.d.ts +10 -1
  582. package/dist/types/agent/scheduler.d.ts.map +1 -1
  583. package/dist/types/agent/task.d.ts +4 -0
  584. package/dist/types/agent/task.d.ts.map +1 -1
  585. package/dist/types/authorization/index.d.ts +30 -30
  586. package/dist/types/connector/mcp.d.ts +7 -0
  587. package/dist/types/connector/mcp.d.ts.map +1 -1
  588. package/dist/types/errors/catalog.d.ts.map +1 -1
  589. package/dist/types/errors/catalog.js +4 -2
  590. package/dist/types/errors/catalog.js.map +1 -1
  591. package/dist/types/harness/schema.d.ts +354 -0
  592. package/dist/types/harness/schema.d.ts.map +1 -0
  593. package/dist/types/harness/schema.js +203 -0
  594. package/dist/types/harness/schema.js.map +1 -0
  595. package/dist/types/harness/session.d.ts +278 -0
  596. package/dist/types/harness/session.d.ts.map +1 -0
  597. package/dist/types/harness/session.js +2 -0
  598. package/dist/types/harness/session.js.map +1 -0
  599. package/dist/types/hitl/index.d.ts +12 -0
  600. package/dist/types/hitl/index.d.ts.map +1 -1
  601. package/dist/types/hitl/index.js.map +1 -1
  602. package/dist/types/job/index.d.ts +47 -0
  603. package/dist/types/job/index.d.ts.map +1 -0
  604. package/dist/types/job/index.js +2 -0
  605. package/dist/types/job/index.js.map +1 -0
  606. package/dist/types/memory/index.d.ts +29 -0
  607. package/dist/types/memory/index.d.ts.map +1 -1
  608. package/dist/types/memory/index.js +6 -0
  609. package/dist/types/memory/index.js.map +1 -1
  610. package/dist/types/message/inbound-delivery.d.ts +44 -0
  611. package/dist/types/message/inbound-delivery.d.ts.map +1 -0
  612. package/dist/types/message/inbound-delivery.js +14 -0
  613. package/dist/types/message/inbound-delivery.js.map +1 -0
  614. package/dist/types/message/index.d.ts +4 -1
  615. package/dist/types/message/index.d.ts.map +1 -1
  616. package/dist/types/message/index.js +5 -1
  617. package/dist/types/message/index.js.map +1 -1
  618. package/dist/types/plugin/index.d.ts +18 -8
  619. package/dist/types/plugin/index.d.ts.map +1 -1
  620. package/dist/types/plugin/index.js +5 -2
  621. package/dist/types/plugin/index.js.map +1 -1
  622. package/dist/types/sandbox/index.d.ts +39 -2
  623. package/dist/types/sandbox/index.d.ts.map +1 -1
  624. package/dist/types/sandbox/index.js.map +1 -1
  625. package/dist/types/session/checkpoint.d.ts +24 -17
  626. package/dist/types/session/checkpoint.d.ts.map +1 -1
  627. package/dist/types/session/checkpoint.js +1 -0
  628. package/dist/types/session/checkpoint.js.map +1 -1
  629. package/dist/types/session/events.d.ts +23 -1
  630. package/dist/types/session/events.d.ts.map +1 -1
  631. package/dist/types/session/events.js.map +1 -1
  632. package/dist/types/session/records.d.ts +1514 -565
  633. package/dist/types/session/records.d.ts.map +1 -1
  634. package/dist/types/session/records.js +89 -1
  635. package/dist/types/session/records.js.map +1 -1
  636. package/dist/types/session/step.d.ts +2 -0
  637. package/dist/types/session/step.d.ts.map +1 -1
  638. package/dist/types/session/step.js.map +1 -1
  639. package/dist/types/session/store.d.ts +19 -10
  640. package/dist/types/session/store.d.ts.map +1 -1
  641. package/dist/types/session/tool-execution.d.ts +6 -0
  642. package/dist/types/session/tool-execution.d.ts.map +1 -1
  643. package/dist/types/structured-output/index.d.ts +12 -2
  644. package/dist/types/structured-output/index.d.ts.map +1 -1
  645. package/dist/types/summary/ref.d.ts +3 -1
  646. package/dist/types/summary/ref.d.ts.map +1 -1
  647. package/dist/types/tool/index.d.ts +32 -4
  648. package/dist/types/tool/index.d.ts.map +1 -1
  649. package/dist/types/tool/index.js.map +1 -1
  650. package/dist/types/tool/presentation.d.ts +106 -0
  651. package/dist/types/tool/presentation.d.ts.map +1 -1
  652. package/dist/utils/json-snapshot.d.ts +6 -2
  653. package/dist/utils/json-snapshot.d.ts.map +1 -1
  654. package/dist/utils/json-snapshot.js +19 -9
  655. package/dist/utils/json-snapshot.js.map +1 -1
  656. package/dist/utils/structured-result-json.d.ts +5 -0
  657. package/dist/utils/structured-result-json.d.ts.map +1 -0
  658. package/dist/utils/structured-result-json.js +10 -0
  659. package/dist/utils/structured-result-json.js.map +1 -0
  660. package/package.json +1 -1
  661. package/src/agents/QueryAgent.ts +1 -0
  662. package/src/agents/examples/SupervisorAgent.ts +1 -0
  663. package/src/agents/runAgent.ts +3 -0
  664. package/src/authorization/shell-lexer.ts +16 -1
  665. package/src/bridge/acp/permission.ts +17 -3
  666. package/src/bridge/acp/server.ts +271 -25
  667. package/src/bridge/acp/tasks.ts +23 -0
  668. package/src/bridge/acp/update.ts +167 -13
  669. package/src/config/registry.ts +24 -3
  670. package/src/connector/mcp/adapter.ts +16 -4
  671. package/src/connector/mcp/client.ts +6 -2
  672. package/src/connector/mcp/discovery.ts +29 -8
  673. package/src/connector/mcp/mcp-toolset.ts +25 -4
  674. package/src/connector/mcp/reconnect.ts +34 -4
  675. package/src/constants/acp/index.ts +4 -0
  676. package/src/manager/agent/lifecycle.ts +230 -3
  677. package/src/manager/plan/lifecycle.ts +11 -9
  678. package/src/manager/session/attribution.ts +12 -2
  679. package/src/manager/session/streamed-message-identity.ts +21 -0
  680. package/src/manager/session/turn-recorder.ts +4 -3
  681. package/src/pals/activity/causality.ts +261 -0
  682. package/src/pals/activity/projection.ts +89 -0
  683. package/src/pals/activity/source.ts +240 -0
  684. package/src/pals/activity/subscription-policy.ts +230 -0
  685. package/src/pals/activity/subscription-schema.ts +27 -0
  686. package/src/pals/activity/subscription-store.ts +172 -0
  687. package/src/pals/activity/subscription-types.ts +48 -0
  688. package/src/pals/activity/subscriptions.ts +209 -0
  689. package/src/pals/activity/types.ts +108 -0
  690. package/src/pals/channels/ingress.ts +153 -0
  691. package/src/pals/channels/routes.ts +118 -0
  692. package/src/pals/channels/routing.ts +197 -0
  693. package/src/pals/channels/schema.ts +108 -0
  694. package/src/pals/channels/types.ts +156 -0
  695. package/src/pals/communication/broker.ts +131 -0
  696. package/src/pals/communication/dispatch.ts +66 -0
  697. package/src/pals/communication/inbound.ts +193 -0
  698. package/src/pals/communication/ingress-dispatch.ts +63 -0
  699. package/src/pals/communication/ingress-inbound.ts +269 -0
  700. package/src/pals/communication/ingress-schema.ts +526 -0
  701. package/src/pals/communication/ingress-types.ts +336 -0
  702. package/src/pals/communication/operator.ts +315 -0
  703. package/src/pals/communication/policy.ts +174 -0
  704. package/src/pals/communication/schema.ts +173 -0
  705. package/src/pals/communication/store.ts +577 -0
  706. package/src/pals/communication/tools.ts +139 -0
  707. package/src/pals/communication/types.ts +227 -0
  708. package/src/pals/communication/verify.ts +220 -0
  709. package/src/pals/lifecycle.ts +54 -0
  710. package/src/pals/prompt.ts +101 -0
  711. package/src/pals/reference-images.ts +322 -0
  712. package/src/pals/runtime.ts +670 -0
  713. package/src/pals/store.ts +369 -0
  714. package/src/pals/types.ts +157 -0
  715. package/src/peers/envelope.ts +1 -1
  716. package/src/plugin/lifecycle.ts +217 -46
  717. package/src/plugin/shell-hook.ts +8 -2
  718. package/src/process/kill-tree.ts +10 -1
  719. package/src/prompt/resident-learning.ts +2 -2
  720. package/src/prompt/resident-step.ts +4 -4
  721. package/src/provider/errors.ts +135 -2
  722. package/src/public-runtime.ts +119 -12
  723. package/src/public-tools.ts +13 -1
  724. package/src/public-types.ts +69 -7
  725. package/src/registry/tool/presentation.ts +9 -4
  726. package/src/registry/tool/screen.ts +34 -2
  727. package/src/runtime/harness-session/index.ts +1125 -0
  728. package/src/runtime/harness-session/journal.ts +209 -0
  729. package/src/runtime/harness-session/saved-view.ts +122 -0
  730. package/src/runtime/jobs/awaited-jobs.ts +2 -1
  731. package/src/runtime/jobs/registry.ts +423 -50
  732. package/src/runtime/query/abandon-turn.ts +18 -2
  733. package/src/runtime/query/checkpoint.ts +11 -0
  734. package/src/runtime/query/durable-inbound.ts +101 -0
  735. package/src/runtime/query/events.ts +22 -5
  736. package/src/runtime/query/executor/tool-call-admission.ts +125 -32
  737. package/src/runtime/query/executor.ts +316 -130
  738. package/src/runtime/query/index.ts +48 -5
  739. package/src/runtime/query/iteration/index.ts +253 -114
  740. package/src/runtime/query/iteration/outstanding-work.ts +57 -7
  741. package/src/runtime/query/iteration/phases/context.ts +8 -0
  742. package/src/runtime/query/iteration/phases/tool-review.ts +124 -22
  743. package/src/runtime/query/iteration/step-shaping.ts +9 -1
  744. package/src/runtime/query/observation-context.ts +22 -16
  745. package/src/runtime/query/prepare-turn.ts +2 -2
  746. package/src/runtime/query/prompt-cache.ts +3 -0
  747. package/src/runtime/query/prompt.ts +32 -1
  748. package/src/runtime/query/repeat-call.ts +40 -10
  749. package/src/runtime/query/resume-pending.ts +60 -7
  750. package/src/runtime/query/resume-session.ts +1 -1
  751. package/src/runtime/query/review-policy.ts +23 -2
  752. package/src/runtime/query/saved-presentation.ts +70 -0
  753. package/src/runtime/query/steering.ts +6 -9
  754. package/src/runtime/query/tool-executions.ts +108 -9
  755. package/src/runtime/query/tooling.ts +6 -1
  756. package/src/scheduler/completion-inbox.ts +108 -7
  757. package/src/scheduler/delegating.ts +5 -0
  758. package/src/scheduler/local.ts +2 -0
  759. package/src/session/summary/materialize.ts +51 -9
  760. package/src/store/budget/ledger.ts +60 -5
  761. package/src/store/index.ts +1 -0
  762. package/src/store/memory/disk.ts +82 -7
  763. package/src/store/memory/index.ts +66 -7
  764. package/src/store/memory/markdown.ts +54 -2
  765. package/src/store/memory/memory.ts +52 -2
  766. package/src/store/memory/revision.ts +158 -0
  767. package/src/store/session/disk.ts +77 -10
  768. package/src/store/session/memory.ts +32 -7
  769. package/src/store/session-log/core.ts +118 -11
  770. package/src/store/session-log/disk.ts +9 -2
  771. package/src/store/session-log/fold.ts +22 -0
  772. package/src/store/session-log/index.ts +5 -0
  773. package/src/store/session-log/memory.ts +2 -1
  774. package/src/store/session-log/spill.ts +89 -6
  775. package/src/store/session-log/structured-result.ts +96 -0
  776. package/src/store/task/disk.ts +46 -2
  777. package/src/store/task/memory.ts +13 -3
  778. package/src/tools/admit-facts.ts +145 -0
  779. package/src/tools/builtins/bash.ts +132 -24
  780. package/src/tools/builtins/edit.ts +42 -0
  781. package/src/tools/builtins/file-write-result.ts +14 -0
  782. package/src/tools/builtins/glob.ts +12 -0
  783. package/src/tools/builtins/grep.ts +14 -0
  784. package/src/tools/builtins/index.ts +2 -0
  785. package/src/tools/builtins/job.ts +4 -1
  786. package/src/tools/builtins/read-file.ts +57 -0
  787. package/src/tools/builtins/view-image.ts +409 -0
  788. package/src/tools/builtins/wait-for-job-bounds.ts +45 -7
  789. package/src/tools/builtins/wait-for-job.ts +159 -36
  790. package/src/tools/builtins/write-file.ts +4 -2
  791. package/src/tools/command-shell.ts +132 -5
  792. package/src/tools/coordinator/agent.ts +9 -19
  793. package/src/tools/coordinator/index.ts +150 -75
  794. package/src/tools/coordinator/wait-with-idle-bound.ts +3 -1
  795. package/src/tools/defineTool.ts +4 -0
  796. package/src/tools/failure-facts.ts +24 -0
  797. package/src/tools/host-output.ts +136 -0
  798. package/src/tools/memory/delete.ts +33 -3
  799. package/src/tools/memory/read.ts +35 -2
  800. package/src/tools/memory/search.ts +38 -7
  801. package/src/tools/memory/update.ts +28 -3
  802. package/src/tools/oem-code-pages.ts +22 -0
  803. package/src/tools/schedules/schedule-tool.ts +38 -5
  804. package/src/tools/schedules/types.ts +23 -3
  805. package/src/tools/task/list.ts +15 -7
  806. package/src/tools/task/present.ts +37 -7
  807. package/src/tools/task/update.ts +12 -5
  808. package/src/tools/text-window.ts +87 -0
  809. package/src/toolsets/manager.ts +132 -2
  810. package/src/turn/memory-recall.ts +5 -1
  811. package/src/types/acp/index.ts +150 -4
  812. package/src/types/agent/base.ts +3 -0
  813. package/src/types/agent/manager.ts +8 -23
  814. package/src/types/agent/scheduler.ts +10 -1
  815. package/src/types/agent/task.ts +4 -0
  816. package/src/types/connector/mcp.ts +7 -0
  817. package/src/types/errors/catalog.ts +4 -2
  818. package/src/types/harness/schema.ts +203 -0
  819. package/src/types/harness/session.ts +306 -0
  820. package/src/types/hitl/index.ts +17 -1
  821. package/src/types/job/index.ts +42 -0
  822. package/src/types/memory/index.ts +43 -0
  823. package/src/types/message/inbound-delivery.ts +63 -0
  824. package/src/types/message/index.ts +8 -1
  825. package/src/types/plugin/index.ts +11 -6
  826. package/src/types/sandbox/index.ts +46 -0
  827. package/src/types/session/checkpoint.ts +4 -1
  828. package/src/types/session/events.ts +23 -1
  829. package/src/types/session/records.ts +114 -2
  830. package/src/types/session/step.ts +2 -0
  831. package/src/types/session/store.ts +23 -9
  832. package/src/types/session/tool-execution.ts +6 -0
  833. package/src/types/structured-output/index.ts +13 -2
  834. package/src/types/summary/ref.ts +3 -1
  835. package/src/types/tool/index.ts +39 -5
  836. package/src/types/tool/presentation.ts +121 -0
  837. package/src/utils/json-snapshot.ts +26 -9
  838. package/src/utils/structured-result-json.ts +10 -0
@@ -77,6 +77,11 @@ const OWNED_WORK_DISPLAY_LIMIT = 16
77
77
  export class CompletionInbox {
78
78
  private readonly unheard = new Map<TaskId, TaskHandle>()
79
79
  private readonly claimed = new Set<TaskId>()
80
+ /** Persistence that must settle before an owned result may be delivered. */
81
+ private readonly deliveryGates = new Map<
82
+ TaskId,
83
+ { settled: Promise<void>; state: 'pending' | 'ready' | 'failed'; error?: unknown }
84
+ >()
80
85
  /** Launched with nothing waiting on it, and not settled yet. */
81
86
  private readonly outstanding = new Set<TaskId>()
82
87
  /**
@@ -136,6 +141,8 @@ export class CompletionInbox {
136
141
  */
137
142
  private readonly unowned = new Map<TaskId, TaskHandle>()
138
143
  private readonly arrivals = new Set<() => void>()
144
+ private readonly drains = new Set<() => void>()
145
+ private lifecycle = 0
139
146
  private detach?: () => void
140
147
  /** Kept for {@link launched}: the source of truth about a task's state. */
141
148
  private gateway?: TaskScheduler
@@ -173,7 +180,10 @@ export class CompletionInbox {
173
180
  this.markSettled(handle.taskId)
174
181
  if (this.claimed.has(handle.taskId)) return
175
182
  this.unheard.set(handle.taskId, handle)
176
- for (const wake of this.arrivals) wake()
183
+ if (this.hasUnheard) for (const wake of this.arrivals) wake()
184
+ if (this.deliveryGates.get(handle.taskId)?.state === 'failed') {
185
+ for (const finish of [...this.drains]) finish()
186
+ }
177
187
  })
178
188
  return this.detach
179
189
  }
@@ -261,6 +271,47 @@ export class CompletionInbox {
261
271
  for (const wake of [...this.arrivals]) wake()
262
272
  }
263
273
 
274
+ /**
275
+ * Hold delivery until this owned task's tracking writes have settled.
276
+ *
277
+ * Register synchronously after `launched`, before handing control back to
278
+ * a consumer. The promise receives no worker output from this inbox.
279
+ * Rejections are retained and reported by either drain; the result stays
280
+ * queued rather than being announced with stale tracking state.
281
+ */
282
+ deferDelivery(taskId: TaskId, settlement: Promise<void>): void {
283
+ if (!this.ours.has(taskId) || this.claimed.has(taskId)) {
284
+ throw new Error('Delivery may only be deferred for an owned, undelivered task')
285
+ }
286
+ if (this.deliveryGates.has(taskId)) {
287
+ throw new Error('This task already has a delivery settlement')
288
+ }
289
+ const gate: {
290
+ settled: Promise<void>
291
+ state: 'pending' | 'ready' | 'failed'
292
+ error?: unknown
293
+ } = { settled: Promise.resolve(), state: 'pending' }
294
+ gate.settled = settlement
295
+ .then(
296
+ () => {
297
+ gate.state = 'ready'
298
+ },
299
+ (error: unknown) => {
300
+ gate.state = 'failed'
301
+ gate.error = error
302
+ },
303
+ )
304
+ .then(() => {
305
+ if (this.deliveryGates.get(taskId) === gate && this.unheard.has(taskId)) {
306
+ for (const wake of [...this.arrivals]) wake()
307
+ // A known tracking failure must not wait behind another row's
308
+ // stalled write. Drains report it without consuming any result.
309
+ if (gate.state === 'failed') for (const finish of [...this.drains]) finish()
310
+ }
311
+ })
312
+ this.deliveryGates.set(taskId, gate)
313
+ }
314
+
264
315
  /**
265
316
  * Move an owned task from {@link runningOwned} to {@link settledOwned}.
266
317
  *
@@ -308,8 +359,8 @@ export class CompletionInbox {
308
359
  */
309
360
  waitForArrival(timeoutMs: number, signal?: AbortSignal): Promise<void> {
310
361
  if (signal?.aborted) return Promise.resolve()
311
- if (this.unheard.size > 0) return Promise.resolve()
312
- if (this.outstanding.size === 0) return Promise.resolve()
362
+ if (this.hasUnheard) return Promise.resolve()
363
+ if (!this.hasPendingWork) return Promise.resolve()
313
364
 
314
365
  return new Promise((resolve) => {
315
366
  const finish = (): void => {
@@ -338,6 +389,7 @@ export class CompletionInbox {
338
389
  claim(taskId: TaskId): void {
339
390
  this.claimed.add(taskId)
340
391
  this.unheard.delete(taskId)
392
+ this.deliveryGates.delete(taskId)
341
393
  this.outstanding.delete(taskId)
342
394
  // A tool only claims a result it is already holding, so a claim is
343
395
  // itself proof of settlement — independent of whether the gateway's
@@ -350,7 +402,9 @@ export class CompletionInbox {
350
402
 
351
403
  /** Whether anything is waiting to be told. */
352
404
  get hasUnheard(): boolean {
353
- return this.unheard.size > 0
405
+ return [...this.unheard.keys()].some(
406
+ (taskId) => this.deliveryGates.get(taskId)?.state !== 'pending',
407
+ )
354
408
  }
355
409
 
356
410
  /**
@@ -410,16 +464,22 @@ export class CompletionInbox {
410
464
  }
411
465
 
412
466
  /**
413
- * Take every unheard completion, leaving the inbox empty.
467
+ * Take unheard completions whose tracking settlement has succeeded.
468
+ * Pending gates stay queued; a rejected gate throws without consuming any
469
+ * result. Use `drainAsync` to await tracking for results already in hand.
414
470
  *
415
471
  * Draining rather than peeking: a notification that stays queued after
416
472
  * being delivered is the duplicate-delivery bug in a different costume.
417
473
  */
418
474
  drain(): TaskHandle[] {
419
475
  if (this.unheard.size === 0) return []
420
- const handles = [...this.unheard.values()]
421
- this.unheard.clear()
476
+ this.checkDeliveryFailures()
477
+ const handles = [...this.unheard.values()].filter(
478
+ (handle) => this.deliveryGates.get(handle.taskId)?.state !== 'pending',
479
+ )
422
480
  for (const handle of handles) {
481
+ this.unheard.delete(handle.taskId)
482
+ this.deliveryGates.delete(handle.taskId)
423
483
  this.claimed.add(handle.taskId)
424
484
  // A delivered result is not pending WORK, and `outstanding` can
425
485
  // still be holding this id — the listener clears it, but only if
@@ -438,6 +498,43 @@ export class CompletionInbox {
438
498
  return handles
439
499
  }
440
500
 
501
+ private checkDeliveryFailures(): void {
502
+ for (const taskId of this.unheard.keys()) {
503
+ const gate = this.deliveryGates.get(taskId)
504
+ if (gate?.state === 'failed') throw gate.error
505
+ }
506
+ }
507
+
508
+ /**
509
+ * Await tracking for completions already queued, then deliver once.
510
+ * Running workers are never awaited here. Concurrent drains share gates
511
+ * and the existing claim set, so only one consumer receives each result.
512
+ * Aborting releases only this wait and returns no results; tracking and
513
+ * queued completions remain available for a later drain.
514
+ */
515
+ async drainAsync(signal?: AbortSignal): Promise<TaskHandle[]> {
516
+ const lifecycle = this.lifecycle
517
+ if (signal?.aborted) return []
518
+ this.checkDeliveryFailures()
519
+ const settlements = [...this.unheard.keys()].flatMap((taskId) => {
520
+ const gate = this.deliveryGates.get(taskId)
521
+ return gate ? [gate.settled] : []
522
+ })
523
+ if (settlements.length === 0) return this.drain()
524
+ await new Promise<void>((resolve) => {
525
+ const finish = (): void => {
526
+ signal?.removeEventListener('abort', finish)
527
+ this.drains.delete(finish)
528
+ resolve()
529
+ }
530
+ this.drains.add(finish)
531
+ signal?.addEventListener('abort', finish, { once: true })
532
+ void Promise.all(settlements).then(finish)
533
+ if (signal?.aborted) finish()
534
+ })
535
+ return signal?.aborted || lifecycle !== this.lifecycle ? [] : this.drain()
536
+ }
537
+
441
538
  /**
442
539
  * Stop expecting a task that is never going to arrive.
443
540
  *
@@ -480,10 +577,12 @@ export class CompletionInbox {
480
577
  * stops it existing.
481
578
  */
482
579
  close(): void {
580
+ this.lifecycle++
483
581
  this.detach?.()
484
582
  this.detach = undefined
485
583
  this.gateway = undefined
486
584
  this.unheard.clear()
585
+ this.deliveryGates.clear()
487
586
  this.outstanding.clear()
488
587
  this.ours.clear()
489
588
  this.runningOwned.clear()
@@ -494,6 +593,8 @@ export class CompletionInbox {
494
593
  // them to their own deadline for a completion that can no longer come.
495
594
  for (const wake of [...this.arrivals]) wake()
496
595
  this.arrivals.clear()
596
+ for (const finish of [...this.drains]) finish()
597
+ this.drains.clear()
497
598
  }
498
599
  }
499
600
 
@@ -171,6 +171,11 @@ export class DelegatingTaskScheduler implements TaskScheduler {
171
171
  if (!this.config.local) throw new NoDelegateError({ agentId: options.agentId })
172
172
  return await this.config.local.createTask(options)
173
173
  }
174
+ if (options.resumeSessionId)
175
+ throw new DelegateCapabilityError({
176
+ id: delegate.id,
177
+ capability: 'child conversation continuation',
178
+ })
174
179
 
175
180
  if (this.budget) {
176
181
  throw new Error(
@@ -112,6 +112,7 @@ export class LocalTaskScheduler implements TaskScheduler {
112
112
  const task = await this.agentManager.sendMessage(
113
113
  {
114
114
  agentId: options.agentId,
115
+ ...(options.resumeSessionId ? { resumeSessionId: options.resumeSessionId } : {}),
115
116
  beforeStart: options.beforeStart,
116
117
  ...(options.workspace ? { workspace: options.workspace } : {}),
117
118
  ...(options.planId ? { planId: options.planId } : {}),
@@ -469,6 +470,7 @@ function toHandle(task: import('../types/agent/task.js').AgentTask): TaskHandle
469
470
  result: task.result,
470
471
  createdAt: task.createdAt,
471
472
  completedAt: task.completedAt,
473
+ ...(task.childSessionId ? { childSessionId: task.childSessionId } : {}),
472
474
  ...(task.workspace ? { workspace: task.workspace } : {}),
473
475
  }
474
476
  }
@@ -18,7 +18,7 @@
18
18
  * `generateSummaryId` from `utils/id.ts`.
19
19
  */
20
20
 
21
- import type { SessionId, TenantId } from '../../types/ids/index.js'
21
+ import type { SessionId, TenantId, TurnId } from '../../types/ids/index.js'
22
22
  import type { Session } from '../../types/session/entity.js'
23
23
  import type { SummaryId } from '../../types/session/ids.js'
24
24
  import type { SessionStore } from '../../types/session/store.js'
@@ -29,6 +29,7 @@ import {
29
29
  type SessionSummaryOutcome,
30
30
  type SessionSummaryRef,
31
31
  } from '../../types/summary/ref.js'
32
+ import { StaleSessionError } from '../errors.js'
32
33
  import { AgentSummaryTooLongError, SessionAlreadySummarizedError } from './errors.js'
33
34
 
34
35
  /**
@@ -50,6 +51,10 @@ export interface SessionSummaryMaterializerDeps {
50
51
  */
51
52
  export interface MaterializeInput {
52
53
  readonly sessionId: SessionId
54
+ /** Seal this invocation independently of the legacy conversation summary. */
55
+ readonly turnId?: TurnId
56
+ /** Keep this terminalization attributed to the admitted owner, if supplied. */
57
+ readonly expectedOwnerVersion?: number
53
58
  readonly tenantId: TenantId
54
59
  readonly finalOutcome: SessionSummaryOutcome
55
60
  readonly agentSummary: string
@@ -84,19 +89,31 @@ export class SessionSummaryMaterializer {
84
89
  * - {@link AgentSummaryTooLongError} — `agentSummary` exceeds the max char
85
90
  * cap ({@link AGENT_SUMMARY_MAX_CHARS}).
86
91
  * - `TenantIsolationError` — session is owned by a different tenant.
87
- * - {@link SessionAlreadySummarizedError} — the session already has a
88
- * persisted summary. Re-materialization would duplicate history; the
89
- * caller should instead open an intervention sub-session (§4.5).
92
+ * - {@link SessionAlreadySummarizedError} — this conversation-summary key
93
+ * or explicit invocation key already has a sealed summary. A new child
94
+ * invocation uses its fresh `turnId`; it never replaces the old summary.
90
95
  */
91
96
  async materialize(input: MaterializeInput): Promise<SessionSummaryRef> {
92
97
  this.assertSummaryLength(input.agentSummary)
98
+ if (input.turnId && this.deps.store.supportsInvocationSummaries !== true)
99
+ throw new Error('Session store does not support invocation summaries')
93
100
 
94
101
  const session = await this.deps.store.getSession(input.sessionId, input.tenantId)
95
102
  if (!session) {
96
103
  throw new Error(`Session ${input.sessionId} not found`)
97
104
  }
105
+ if (input.expectedOwnerVersion !== undefined) {
106
+ if (this.deps.store.supportsOwnerVersionCas !== true)
107
+ throw new Error('Session store does not support owner-version CAS')
108
+ if (session.ownerVersion !== input.expectedOwnerVersion)
109
+ throw new StaleSessionError({
110
+ sessionId: input.sessionId,
111
+ expectedVersion: input.expectedOwnerVersion,
112
+ actualVersion: session.ownerVersion,
113
+ })
114
+ }
98
115
 
99
- const existing = await this.deps.store.getSummary(input.sessionId, input.tenantId)
116
+ const existing = await this.deps.store.getSummary(input.sessionId, input.tenantId, input.turnId)
100
117
  if (existing) {
101
118
  throw new SessionAlreadySummarizedError({
102
119
  sessionId: input.sessionId,
@@ -107,6 +124,7 @@ export class SessionSummaryMaterializer {
107
124
  const summary: SessionSummaryRef = {
108
125
  id: this.deps.generateSummaryId(),
109
126
  sessionRef: input.sessionId,
127
+ ...(input.turnId ? { turnRef: input.turnId } : {}),
110
128
  tenantId: input.tenantId,
111
129
  outcome: input.finalOutcome,
112
130
  deliverables: input.declaredDeliverables,
@@ -116,13 +134,29 @@ export class SessionSummaryMaterializer {
116
134
  materializedBy: 'kernel',
117
135
  }
118
136
 
119
- await this.deps.store.recordSummary(summary, input.tenantId)
137
+ const legacy = input.turnId
138
+ ? await this.deps.store.getSummary(input.sessionId, input.tenantId)
139
+ : undefined
140
+ if (input.expectedOwnerVersion === undefined)
141
+ await this.deps.store.recordSummary(summary, input.tenantId)
142
+ else await this.deps.store.recordSummary(summary, input.tenantId, input.expectedOwnerVersion)
143
+ if (input.turnId) {
144
+ const stored = await this.deps.store.getSummary(input.sessionId, input.tenantId, input.turnId)
145
+ const afterLegacy = await this.deps.store.getSummary(input.sessionId, input.tenantId)
146
+ if (
147
+ stored?.id !== summary.id ||
148
+ stored.sessionRef !== input.sessionId ||
149
+ stored.turnRef !== input.turnId ||
150
+ afterLegacy?.id !== legacy?.id
151
+ )
152
+ throw new Error('Session store did not preserve the invocation summary contract')
153
+ }
120
154
  return summary
121
155
  }
122
156
 
123
157
  /**
124
158
  * Recovery path. Called at boot (or explicitly by the lifecycle manager)
125
- * for sessions whose `summary.json` is persisted but whose `session.json`
159
+ * for sessions whose selected summary is persisted but whose `session.json`
126
160
  * still reports a non-terminal status — the crash window between the two
127
161
  * atomic writes on disk.
128
162
  *
@@ -133,9 +167,17 @@ export class SessionSummaryMaterializer {
133
167
  * mint a new ID, only re-triggers the store's status flip via
134
168
  * `recordSummary` when it detects the dangling session.
135
169
  */
136
- async recover(sessionId: SessionId, tenantId: TenantId): Promise<SessionSummaryRef | null> {
137
- const summary = await this.deps.store.getSummary(sessionId, tenantId)
170
+ async recover(
171
+ sessionId: SessionId,
172
+ tenantId: TenantId,
173
+ turnId?: TurnId,
174
+ ): Promise<SessionSummaryRef | null> {
175
+ if (turnId && this.deps.store.supportsInvocationSummaries !== true)
176
+ throw new Error('Session store does not support invocation summaries')
177
+ const summary = await this.deps.store.getSummary(sessionId, tenantId, turnId)
138
178
  if (!summary) return null
179
+ if (turnId && (summary.turnRef !== turnId || summary.sessionRef !== sessionId))
180
+ throw new Error('Session store returned a different invocation summary')
139
181
 
140
182
  const session = await this.deps.store.getSession(sessionId, tenantId)
141
183
  if (!session) return summary
@@ -434,7 +434,7 @@ export class SessionTokenBudget {
434
434
  persistence?: SessionTokenBudgetPersistence,
435
435
  ): SessionTokenBudget {
436
436
  const state = validateSessionTokenBudgetSnapshot(snapshot)
437
- return new SessionTokenBudget(
437
+ const restored = new SessionTokenBudget(
438
438
  {
439
439
  rootAccountId: state.rootAccountId,
440
440
  scope: { rootSessionId: state.rootSessionId, rootTurnId: state.rootTurnId },
@@ -449,6 +449,27 @@ export class SessionTokenBudget {
449
449
  },
450
450
  state.rootAccountId,
451
451
  )
452
+ // A request that was in flight when a process stopped has no receipt. On an
453
+ // unbounded account it stays recorded as unknown spend, but it no longer
454
+ // counts as work in progress, so the turn can ask again.
455
+ for (const request of [...restored.ledger.requests.values()]) {
456
+ if (!restored.account(request.accountId).bounded) restored.retainUnresolved(request)
457
+ }
458
+ return restored
459
+ }
460
+
461
+ /**
462
+ * Whether this account, or any account above it, carries a finite limit. A bounded
463
+ * account cannot be admitted past unknown spend, because the unknown amount may
464
+ * already exceed the limit. An unbounded one has no limit to exceed: its unknown
465
+ * spend stays recorded (never as zero) and does not stop the next request.
466
+ */
467
+ get bounded(): boolean {
468
+ for (let cursor: SessionTokenBudgetAccountSnapshot | undefined = this.node; cursor; ) {
469
+ if (cursor.limit > 0) return true
470
+ cursor = cursor.parentId === undefined ? undefined : this.requireAccount(cursor.parentId)
471
+ }
472
+ return false
452
473
  }
453
474
 
454
475
  get limit(): number {
@@ -590,7 +611,16 @@ export class SessionTokenBudget {
590
611
  }
591
612
 
592
613
  async finishRequest(requestId: string, usage: TokenUsage): Promise<void> {
593
- if (this.hasReceipt(requestId)) return this.flush()
614
+ if (this.hasReceipt(requestId)) {
615
+ // A request retained as unknown spend can still be answered late. The
616
+ // measured usage is evidence and is kept; the unknown marker stays until
617
+ // an explicit reconciliation clears it.
618
+ const receipt = this.ledger.finishedRequests.get(
619
+ requestId,
620
+ ) as SessionTokenBudgetRequestSnapshot
621
+ if (receipt.unresolved === true) return this.failRequest(requestId, usage)
622
+ return this.flush()
623
+ }
594
624
  const request = this.requireRequest(requestId)
595
625
  try {
596
626
  this.recordRequestUsage(request, usage)
@@ -608,7 +638,25 @@ export class SessionTokenBudget {
608
638
 
609
639
  /** Unknown spend cannot be converted into a refund, even after cancellation. */
610
640
  async failRequest(requestId: string, usage?: TokenUsage): Promise<void> {
611
- if (this.hasReceipt(requestId)) return this.flush()
641
+ if (this.hasReceipt(requestId)) {
642
+ // An unbounded account retains a failed request as a receipt; usage that
643
+ // arrives late is still evidence of spend and is kept.
644
+ const receipt = this.ledger.finishedRequests.get(
645
+ requestId,
646
+ ) as SessionTokenBudgetRequestSnapshot
647
+ if (usage !== undefined && receipt.unresolved === true) {
648
+ try {
649
+ this.recordRequestUsage(receipt, usage)
650
+ } catch (error) {
651
+ this.ledger.poisoned = true
652
+ this.persist()
653
+ await this.flush()
654
+ throw error
655
+ }
656
+ this.persist()
657
+ }
658
+ return this.flush()
659
+ }
612
660
  const request = this.requireRequest(requestId)
613
661
  request.unresolved = true
614
662
  try {
@@ -619,6 +667,7 @@ export class SessionTokenBudget {
619
667
  await this.flush()
620
668
  throw error
621
669
  }
670
+ if (!this.bounded) this.retainUnresolved(request)
622
671
  this.persist()
623
672
  await this.flush()
624
673
  }
@@ -713,6 +762,12 @@ export class SessionTokenBudget {
713
762
  if (this.ledger.persistenceError !== undefined) throw this.ledger.persistenceError
714
763
  }
715
764
 
765
+ /** Move a request with no receipt out of flight, keeping its unknown-spend marker. */
766
+ private retainUnresolved(request: SessionTokenBudgetRequestSnapshot): void {
767
+ request.unresolved = true
768
+ this.ledger.requests.delete(request.id)
769
+ this.ledger.finishedRequests.set(request.id, request)
770
+ }
716
771
  private uncertainRequests(): SessionTokenBudgetRequestSnapshot[] {
717
772
  return [...this.ledger.requests.values(), ...this.ledger.finishedRequests.values()].filter(
718
773
  (request) => request.unresolved === true,
@@ -722,8 +777,8 @@ export class SessionTokenBudget {
722
777
  if (this.ledger.poisoned || this.ledger.persistenceError !== undefined) return true
723
778
  const uncertain = this.uncertainRequests()
724
779
  if (uncertain.length === 0) return false
725
- // An account cannot resume its own uncertain request, even without a cap.
726
- if (uncertain.some((request) => request.accountId === this.accountId)) return true
780
+ // Unknown spend blocks only through a finite limit at or above this account,
781
+ // where it could already have been exceeded; see `bounded`.
727
782
  let cursor = this.node
728
783
  for (;;) {
729
784
  if (cursor.limit > 0) {
@@ -36,6 +36,7 @@ export {
36
36
  slugifyMemoryName,
37
37
  } from './memory/naming.js'
38
38
  export type { MemoryContentRejection } from './memory/naming.js'
39
+ export { MemoryRevisionConflictError } from './memory/revision.js'
39
40
 
40
41
  // Was that answer any good — recorded per message, durably, with
41
42
  // compare-and-set. Every consumer used to invent its own side table for the
@@ -3,14 +3,15 @@ import { dirname, join, resolve } from 'node:path'
3
3
  import { NamzuError } from '../../types/errors/index.js'
4
4
  import type { MemoryId } from '../../types/ids/index.js'
5
5
  import type {
6
+ ConditionalMemoryStore,
6
7
  CreateMemoryParams,
7
8
  MemoryContent,
8
9
  MemoryIndexEntry,
9
10
  MemoryRecord,
10
11
  MemorySearchParams,
11
12
  MemorySearchResult,
12
- MemoryStore,
13
13
  UpdateMemoryParams,
14
+ VersionedMemoryRecord,
14
15
  } from '../../types/memory/index.js'
15
16
  import { assertMemoryStatus, isMemoryType } from '../../types/memory/index.js'
16
17
  import { generateMemoryId, isEntityId } from '../../utils/id.js'
@@ -18,7 +19,7 @@ import { SCOPE_ATTRIBUTE } from '../../utils/log/types.js'
18
19
  import { type Logger, resolveLogger } from '../../utils/logger.js'
19
20
  import { DiskRecordStore } from '../kv/record-store.js'
20
21
  import { SCHEMA_VERSION_KEY, defineSchema } from '../schema.js'
21
- import { InMemoryMemoryIndex, searchMemoryEntries } from './index.js'
22
+ import { InMemoryMemoryIndex, searchMemoryEntries, selectMemorySearchCandidates } from './index.js'
22
23
  import {
23
24
  MemoryNameConflictError,
24
25
  assertOptionalMemoryFields,
@@ -31,6 +32,7 @@ import {
31
32
  acquireMemoryOperationLock,
32
33
  validateMemoryLockTimeout,
33
34
  } from './operation-lock.js'
35
+ import { MemoryRevisionConflictError, assertMemoryRevision, memoryRevision } from './revision.js'
34
36
 
35
37
  /**
36
38
  * This store's on-disk format, versioned as a unit — which is how a
@@ -181,7 +183,7 @@ export interface DiskMemoryStoreConfig {
181
183
  lockTimeoutMs?: number
182
184
  }
183
185
 
184
- export class DiskMemoryStore implements MemoryStore {
186
+ export class DiskMemoryStore implements ConditionalMemoryStore {
185
187
  private readonly baseDir: string
186
188
  private readonly log: Logger
187
189
  private readonly lockTimeoutMs: number
@@ -355,18 +357,54 @@ export class DiskMemoryStore implements MemoryStore {
355
357
  })
356
358
  }
357
359
 
360
+ async getVersionedRecord(id: MemoryId): Promise<VersionedMemoryRecord | undefined> {
361
+ return this.withAuthoritativeIndex(async (location) => {
362
+ assertStorageMemoryId(id, (reason) => invalidContent(id, reason, { field: 'id' }))
363
+ const entry = this.index.getEntry(id)
364
+ if (!entry) return undefined
365
+ const record = structuredClone({ entry, content: await this.readContent(location, id) })
366
+ return { ...record, revision: memoryRevision(record) }
367
+ })
368
+ }
369
+
358
370
  async update(id: MemoryId, updates: UpdateMemoryParams): Promise<MemoryIndexEntry | undefined> {
371
+ return this.updateInternal(id, updates)
372
+ }
373
+
374
+ async updateIfRevision(
375
+ id: MemoryId,
376
+ updates: UpdateMemoryParams,
377
+ expectedRevision: string,
378
+ ): Promise<MemoryIndexEntry> {
379
+ const updated = await this.updateInternal(id, updates, expectedRevision)
380
+ if (!updated) throw new MemoryRevisionConflictError(id)
381
+ return updated
382
+ }
383
+
384
+ private async updateInternal(
385
+ id: MemoryId,
386
+ updates: UpdateMemoryParams,
387
+ expectedRevision?: string,
388
+ ): Promise<MemoryIndexEntry | undefined> {
359
389
  if (updates.status !== undefined) assertMemoryStatus(updates.status)
360
390
  assertOptionalMemoryFields(updates)
361
391
  return this.withAuthoritativeIndex(async (location) => {
362
392
  assertStorageMemoryId(id, (reason) => invalidContent(id, reason, { field: 'id' }))
363
393
  const existing = this.index.getEntry(id)
394
+ const existingContent = existing ? await this.readContent(location, id) : undefined
395
+ if (expectedRevision !== undefined) {
396
+ assertMemoryRevision(
397
+ id,
398
+ existing && existingContent ? { entry: existing, content: existingContent } : undefined,
399
+ expectedRevision,
400
+ )
401
+ }
364
402
  if (!existing) return undefined
365
403
  if (updates.name !== undefined) {
366
404
  const holder = nameHolder(this.index.allEntries(), updates.name, id)
367
405
  if (holder) throw new MemoryNameConflictError(updates.name, holder.id)
368
406
  }
369
- const existingContent = await this.readContent(location, id)
407
+ if (!existingContent) invalidContent(id, 'the indexed content record is missing')
370
408
  const updated: MemoryIndexEntry = withOptionalFields(
371
409
  {
372
410
  ...existing,
@@ -403,9 +441,27 @@ export class DiskMemoryStore implements MemoryStore {
403
441
  }
404
442
 
405
443
  async delete(id: MemoryId): Promise<boolean> {
444
+ return this.deleteInternal(id)
445
+ }
446
+
447
+ async deleteIfRevision(id: MemoryId, expectedRevision: string): Promise<void> {
448
+ const deleted = await this.deleteInternal(id, expectedRevision)
449
+ if (!deleted) throw new MemoryRevisionConflictError(id)
450
+ }
451
+
452
+ private async deleteInternal(id: MemoryId, expectedRevision?: string): Promise<boolean> {
406
453
  return this.withAuthoritativeIndex(async (location) => {
407
454
  assertStorageMemoryId(id, (reason) => invalidContent(id, reason, { field: 'id' }))
408
- if (!this.index.getEntry(id)) return false
455
+ const entry = this.index.getEntry(id)
456
+ if (expectedRevision !== undefined) {
457
+ const content = entry ? await this.readContent(location, id) : undefined
458
+ assertMemoryRevision(
459
+ id,
460
+ entry && content ? { entry, content } : undefined,
461
+ expectedRevision,
462
+ )
463
+ }
464
+ if (!entry) return false
409
465
 
410
466
  try {
411
467
  await unlink(this.contentPath(location, id))
@@ -432,12 +488,31 @@ export class DiskMemoryStore implements MemoryStore {
432
488
  query: undefined,
433
489
  limit: undefined,
434
490
  requiredIdentifiers: undefined,
491
+ maxScanned: undefined,
492
+ scanOffset: undefined,
435
493
  })
494
+ const selection = selectMemorySearchCandidates(candidates.entries, params)
436
495
  const contents = new Map<MemoryId, string>()
437
- for (const entry of candidates.entries) {
496
+ for (const entry of selection.entries) {
438
497
  contents.set(entry.id, (await this.readContent(location, entry.id)).content)
439
498
  }
440
- return searchMemoryEntries(candidates.entries, params, (id) => contents.get(id) ?? '')
499
+ const matched = searchMemoryEntries(
500
+ selection.entries,
501
+ { ...params, maxScanned: undefined, scanOffset: undefined },
502
+ (id) => contents.get(id) ?? '',
503
+ )
504
+ return {
505
+ ...matched,
506
+ ...(params.maxScanned !== undefined || params.scanOffset !== undefined
507
+ ? {
508
+ truncated: selection.truncated,
509
+ scannedCount: selection.scannedCount,
510
+ ...(selection.nextScanOffset !== undefined
511
+ ? { nextScanOffset: selection.nextScanOffset }
512
+ : {}),
513
+ }
514
+ : {}),
515
+ }
441
516
  })
442
517
  }
443
518