@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
@@ -26,6 +26,56 @@ export function matchesMemoryIdentifier(text: string, identifiers: ReadonlySet<s
26
26
  return false
27
27
  }
28
28
 
29
+ interface MemoryScanSelection {
30
+ readonly entries: readonly MemoryIndexEntry[]
31
+ readonly truncated: boolean
32
+ readonly scannedCount: number
33
+ readonly nextScanOffset?: number
34
+ }
35
+
36
+ /** Select a bounded, resumable snapshot of indexed candidates before reading any bodies. */
37
+ export function selectMemorySearchCandidates(
38
+ entries: readonly MemoryIndexEntry[],
39
+ params: MemorySearchParams,
40
+ ): MemoryScanSelection {
41
+ if (
42
+ params.maxScanned !== undefined &&
43
+ (!Number.isSafeInteger(params.maxScanned) || params.maxScanned < 1)
44
+ ) {
45
+ throw new RangeError('maxScanned must be a positive safe integer')
46
+ }
47
+ if (
48
+ params.scanOffset !== undefined &&
49
+ (!Number.isSafeInteger(params.scanOffset) || params.scanOffset < 0)
50
+ ) {
51
+ throw new RangeError('scanOffset must be a nonnegative safe integer')
52
+ }
53
+ const query = terms(params.query ?? '')
54
+ if (params.query?.trim() && query.size === 0)
55
+ return { entries: [], truncated: false, scannedCount: 0 }
56
+ const bodySearch =
57
+ query.size > 0 ||
58
+ Boolean(params.requiredIdentifiers?.length) ||
59
+ params.maxScanned !== undefined ||
60
+ params.scanOffset !== undefined
61
+ if (!bodySearch) return { entries, truncated: false, scannedCount: 0 }
62
+ const ordered = [...entries].sort(
63
+ (a, b) => b.updatedAt - a.updatedAt || (a.id < b.id ? -1 : a.id > b.id ? 1 : 0),
64
+ )
65
+ const start = params.scanOffset ?? 0
66
+ const selected = ordered.slice(
67
+ start,
68
+ params.maxScanned === undefined ? undefined : start + params.maxScanned,
69
+ )
70
+ const next = start + selected.length
71
+ return {
72
+ entries: selected,
73
+ truncated: next < ordered.length,
74
+ scannedCount: selected.length,
75
+ ...(next < ordered.length ? { nextScanOffset: next } : {}),
76
+ }
77
+ }
78
+
29
79
  /** Shared lexical ranking; a caller-owned index can omit body content. */
30
80
  export function searchMemoryEntries(
31
81
  entries: readonly MemoryIndexEntry[],
@@ -36,13 +86,13 @@ export function searchMemoryEntries(
36
86
  const identifiers = new Set(
37
87
  params.requiredIdentifiers?.map((id) => id.normalize('NFKC').toLowerCase()),
38
88
  )
39
- if (params.query?.trim() && query.size === 0) return { entries: [], totalCount: 0 }
40
- const ranked = entries
41
- .filter(
42
- (entry) =>
43
- (!params.status || entry.status === params.status) &&
44
- (!params.tags?.length || params.tags.every((tag) => entry.tags.includes(tag))),
45
- )
89
+ const candidates = entries.filter(
90
+ (entry) =>
91
+ (!params.status || entry.status === params.status) &&
92
+ (!params.tags?.length || params.tags.every((tag) => entry.tags.includes(tag))),
93
+ )
94
+ const selection = selectMemorySearchCandidates(candidates, params)
95
+ const ranked = selection.entries
46
96
  .filter(
47
97
  (entry) =>
48
98
  !identifiers.size ||
@@ -79,6 +129,15 @@ export function searchMemoryEntries(
79
129
  return {
80
130
  entries: ranked.slice(0, params.limit ?? ranked.length).map(({ entry }) => entry),
81
131
  totalCount: ranked.length,
132
+ ...(params.maxScanned !== undefined || params.scanOffset !== undefined
133
+ ? {
134
+ truncated: selection.truncated,
135
+ scannedCount: selection.scannedCount,
136
+ ...(selection.nextScanOffset !== undefined
137
+ ? { nextScanOffset: selection.nextScanOffset }
138
+ : {}),
139
+ }
140
+ : {}),
82
141
  }
83
142
  }
84
143
 
@@ -5,15 +5,16 @@ import { dirname, join, resolve } from 'node:path'
5
5
  import { NamzuError } from '../../types/errors/index.js'
6
6
  import type { MemoryId } from '../../types/ids/index.js'
7
7
  import type {
8
+ ConditionalMemoryStore,
8
9
  CreateMemoryParams,
9
10
  MemoryContent,
10
11
  MemoryIndexEntry,
11
12
  MemoryRecord,
12
13
  MemorySearchParams,
13
14
  MemorySearchResult,
14
- MemoryStore,
15
15
  MemoryType,
16
16
  UpdateMemoryParams,
17
+ VersionedMemoryRecord,
17
18
  } from '../../types/memory/index.js'
18
19
  import { assertMemoryStatus, isMemoryType } from '../../types/memory/index.js'
19
20
  import { atomicWriteFile } from '../../utils/atomic-write.js'
@@ -47,6 +48,7 @@ import {
47
48
  acquireMemoryOperationLock,
48
49
  validateMemoryLockTimeout,
49
50
  } from './operation-lock.js'
51
+ import { MemoryRevisionConflictError, assertMemoryRevision, memoryRevision } from './revision.js'
50
52
 
51
53
  /**
52
54
  * Versioned like every other record this SDK persists. A memory file carries
@@ -296,7 +298,7 @@ function decodeMemoryFile(
296
298
  * holds with {@link MemoryNameConflictError}, and derives a free one from the
297
299
  * title when none is given.
298
300
  */
299
- export class MarkdownMemoryStore implements MemoryStore {
301
+ export class MarkdownMemoryStore implements ConditionalMemoryStore {
300
302
  private readonly directory: string
301
303
  private readonly log: Logger
302
304
  private readonly lockTimeoutMs: number
@@ -587,6 +589,15 @@ export class MarkdownMemoryStore implements MemoryStore {
587
589
  })
588
590
  }
589
591
 
592
+ async getVersionedRecord(id: MemoryId): Promise<VersionedMemoryRecord | undefined> {
593
+ return this.withLoaded(async (_dir, loaded) => {
594
+ const memory = loaded.get(id)
595
+ if (!memory) return undefined
596
+ const record = structuredClone({ entry: memory.entry, content: memory.content })
597
+ return { ...record, revision: memoryRevision(record) }
598
+ })
599
+ }
600
+
590
601
  /** The current record held under `name`, archived included, or `undefined`. */
591
602
  async getByName(name: string): Promise<MemoryRecord | undefined> {
592
603
  return this.withLoaded(async (_dir, loaded) => {
@@ -603,10 +614,35 @@ export class MarkdownMemoryStore implements MemoryStore {
603
614
  }
604
615
 
605
616
  async update(id: MemoryId, updates: UpdateMemoryParams): Promise<MemoryIndexEntry | undefined> {
617
+ return this.updateInternal(id, updates)
618
+ }
619
+
620
+ async updateIfRevision(
621
+ id: MemoryId,
622
+ updates: UpdateMemoryParams,
623
+ expectedRevision: string,
624
+ ): Promise<MemoryIndexEntry> {
625
+ const updated = await this.updateInternal(id, updates, expectedRevision)
626
+ if (!updated) throw new MemoryRevisionConflictError(id)
627
+ return updated
628
+ }
629
+
630
+ private async updateInternal(
631
+ id: MemoryId,
632
+ updates: UpdateMemoryParams,
633
+ expectedRevision?: string,
634
+ ): Promise<MemoryIndexEntry | undefined> {
606
635
  if (updates.status !== undefined) assertMemoryStatus(updates.status)
607
636
  assertOptionalMemoryFields(updates)
608
637
  return this.mutate(async (dir, loaded) => {
609
638
  const existing = loaded.get(id)
639
+ if (expectedRevision !== undefined) {
640
+ assertMemoryRevision(
641
+ id,
642
+ existing ? { entry: existing.entry, content: existing.content } : undefined,
643
+ expectedRevision,
644
+ )
645
+ }
610
646
  if (!existing) return undefined
611
647
  const entries = this.entries(loaded)
612
648
  if (updates.name !== undefined) {
@@ -645,8 +681,24 @@ export class MarkdownMemoryStore implements MemoryStore {
645
681
  }
646
682
 
647
683
  async delete(id: MemoryId): Promise<boolean> {
684
+ return this.deleteInternal(id)
685
+ }
686
+
687
+ async deleteIfRevision(id: MemoryId, expectedRevision: string): Promise<void> {
688
+ const deleted = await this.deleteInternal(id, expectedRevision)
689
+ if (!deleted) throw new MemoryRevisionConflictError(id)
690
+ }
691
+
692
+ private async deleteInternal(id: MemoryId, expectedRevision?: string): Promise<boolean> {
648
693
  return this.mutate(async (dir, loaded) => {
649
694
  const existing = loaded.get(id)
695
+ if (expectedRevision !== undefined) {
696
+ assertMemoryRevision(
697
+ id,
698
+ existing ? { entry: existing.entry, content: existing.content } : undefined,
699
+ expectedRevision,
700
+ )
701
+ }
650
702
  if (!existing) return false
651
703
  try {
652
704
  await unlink(existing.path)
@@ -1,13 +1,14 @@
1
1
  import type { MemoryId } from '../../types/ids/index.js'
2
2
  import type {
3
+ ConditionalMemoryStore,
3
4
  CreateMemoryParams,
4
5
  MemoryContent,
5
6
  MemoryIndexEntry,
6
7
  MemoryRecord,
7
8
  MemorySearchParams,
8
9
  MemorySearchResult,
9
- MemoryStore,
10
10
  UpdateMemoryParams,
11
+ VersionedMemoryRecord,
11
12
  } from '../../types/memory/index.js'
12
13
  import { assertMemoryStatus } from '../../types/memory/index.js'
13
14
  import { generateMemoryId } from '../../utils/id.js'
@@ -18,8 +19,9 @@ import {
18
19
  nameHolder,
19
20
  withOptionalFields,
20
21
  } from './naming.js'
22
+ import { assertMemoryRevision, memoryRevision } from './revision.js'
21
23
 
22
- export class InMemoryMemoryStore implements MemoryStore {
24
+ export class InMemoryMemoryStore implements ConditionalMemoryStore {
23
25
  private content = new Map<string, MemoryContent>()
24
26
  private index = new InMemoryMemoryIndex()
25
27
 
@@ -70,10 +72,45 @@ export class InMemoryMemoryStore implements MemoryStore {
70
72
  return entry && content ? structuredClone({ entry, content }) : undefined
71
73
  }
72
74
 
75
+ async getVersionedRecord(id: MemoryId): Promise<VersionedMemoryRecord | undefined> {
76
+ const entry = this.index.getEntry(id)
77
+ const content = this.content.get(id)
78
+ if (!entry || !content) return undefined
79
+ const record = structuredClone({ entry, content })
80
+ return { ...record, revision: memoryRevision(record) }
81
+ }
82
+
73
83
  async update(id: MemoryId, updates: UpdateMemoryParams): Promise<MemoryIndexEntry | undefined> {
84
+ return this.updateNow(id, updates)
85
+ }
86
+
87
+ async updateIfRevision(
88
+ id: MemoryId,
89
+ updates: UpdateMemoryParams,
90
+ expectedRevision: string,
91
+ ): Promise<MemoryIndexEntry> {
92
+ // No await between the check and mutation: one in-memory operation turn.
93
+ const entry = this.updateNow(id, updates, expectedRevision)
94
+ if (!entry) throw new Error('A conditional memory update unexpectedly found no record.')
95
+ return entry
96
+ }
97
+
98
+ private updateNow(
99
+ id: MemoryId,
100
+ updates: UpdateMemoryParams,
101
+ expectedRevision?: string,
102
+ ): MemoryIndexEntry | undefined {
74
103
  if (updates.status !== undefined) assertMemoryStatus(updates.status)
75
104
  assertOptionalMemoryFields(updates)
76
105
  const existing = this.index.getEntry(id)
106
+ if (expectedRevision !== undefined) {
107
+ const content = this.content.get(id)
108
+ assertMemoryRevision(
109
+ id,
110
+ existing && content ? { entry: existing, content } : undefined,
111
+ expectedRevision,
112
+ )
113
+ }
77
114
  if (!existing) return undefined
78
115
  if (updates.name !== undefined) {
79
116
  const holder = nameHolder(this.index.allEntries(), updates.name, id)
@@ -118,6 +155,19 @@ export class InMemoryMemoryStore implements MemoryStore {
118
155
  }
119
156
 
120
157
  async delete(id: MemoryId): Promise<boolean> {
158
+ return this.deleteNow(id)
159
+ }
160
+
161
+ async deleteIfRevision(id: MemoryId, expectedRevision: string): Promise<void> {
162
+ this.deleteNow(id, expectedRevision)
163
+ }
164
+
165
+ private deleteNow(id: MemoryId, expectedRevision?: string): boolean {
166
+ if (expectedRevision !== undefined) {
167
+ const entry = this.index.getEntry(id)
168
+ const content = this.content.get(id)
169
+ assertMemoryRevision(id, entry && content ? { entry, content } : undefined, expectedRevision)
170
+ }
121
171
  const existed = this.index.remove(id)
122
172
  this.content.delete(id)
123
173
  return existed
@@ -0,0 +1,158 @@
1
+ import { createHash } from 'node:crypto'
2
+ import { NamzuError } from '../../types/errors/index.js'
3
+ import type { MemoryId } from '../../types/ids/index.js'
4
+ import type { MemoryRecord } from '../../types/memory/index.js'
5
+
6
+ /** A record can be read, but its metadata cannot be fingerprinted synchronously. */
7
+ export class MemoryRevisionUnavailableError extends Error {
8
+ constructor() {
9
+ super('This memory contains metadata that cannot be revision-checked.')
10
+ this.name = 'MemoryRevisionUnavailableError'
11
+ }
12
+ }
13
+
14
+ /**
15
+ * Encode the same structured-clone snapshot `getRecord` returns. Type tags,
16
+ * object references and sorted plain-object keys preserve values JSON loses:
17
+ * BigInt, undefined, Map/Set contents, Date, typed arrays and cycles. Map and
18
+ * Set order is kept because it is observable. Unknown host objects (notably
19
+ * Blob, whose bytes need asynchronous reading) fail closed rather than hash as
20
+ * `{}` and allow a stale conditional write.
21
+ */
22
+ function canonicalRecord(record: MemoryRecord): string {
23
+ let snapshot: MemoryRecord
24
+ try {
25
+ snapshot = structuredClone(record)
26
+ } catch {
27
+ throw new MemoryRevisionUnavailableError()
28
+ }
29
+ const seen = new WeakMap<object, number>()
30
+ let nextId = 0
31
+
32
+ function encode(value: unknown): unknown {
33
+ if (value === null) return ['null']
34
+ switch (typeof value) {
35
+ case 'undefined':
36
+ return ['undefined']
37
+ case 'string':
38
+ return ['string', value]
39
+ case 'boolean':
40
+ return ['boolean', value]
41
+ case 'bigint':
42
+ return ['bigint', value.toString()]
43
+ case 'number':
44
+ return ['number', Object.is(value, -0) ? '-0' : String(value)]
45
+ case 'function':
46
+ case 'symbol':
47
+ throw new MemoryRevisionUnavailableError()
48
+ case 'object':
49
+ break
50
+ }
51
+
52
+ const object = value as object
53
+ const previous = seen.get(object)
54
+ if (previous !== undefined) return ['ref', previous]
55
+ const id = nextId++
56
+ seen.set(object, id)
57
+ if (Array.isArray(object)) {
58
+ return [
59
+ 'array',
60
+ id,
61
+ object.length,
62
+ Object.keys(object)
63
+ .sort()
64
+ .map((key) => [key, encode((object as unknown as Record<string, unknown>)[key])]),
65
+ ]
66
+ }
67
+ if (object instanceof Map) {
68
+ return ['map', id, [...object].map(([key, item]) => [encode(key), encode(item)])]
69
+ }
70
+ if (object instanceof Set) return ['set', id, [...object].map(encode)]
71
+ if (object instanceof Date) return ['date', id, encode(object.getTime())]
72
+ if (object instanceof RegExp)
73
+ return ['regexp', id, object.source, object.flags, object.lastIndex]
74
+ if (object instanceof ArrayBuffer) {
75
+ const buffer = object as ArrayBuffer & {
76
+ readonly maxByteLength?: number
77
+ readonly resizable?: boolean
78
+ }
79
+ return [
80
+ 'array-buffer',
81
+ id,
82
+ buffer.byteLength,
83
+ buffer.maxByteLength,
84
+ buffer.resizable,
85
+ Buffer.from(buffer).toString('hex'),
86
+ ]
87
+ }
88
+ if (ArrayBuffer.isView(object)) {
89
+ // A view exposes its entire backing buffer through `.buffer`, even
90
+ // when its visible slice is one byte. Structured cloning keeps that
91
+ // backing and preserves aliases between multiple views.
92
+ if (
93
+ (typeof SharedArrayBuffer !== 'undefined' && object.buffer instanceof SharedArrayBuffer) ||
94
+ (object.buffer instanceof ArrayBuffer &&
95
+ (object.buffer as ArrayBuffer & { readonly resizable?: boolean }).resizable === true)
96
+ )
97
+ throw new MemoryRevisionUnavailableError()
98
+ return [
99
+ 'array-buffer-view',
100
+ id,
101
+ object.constructor.name,
102
+ object.byteOffset,
103
+ object.byteLength,
104
+ encode(object.buffer),
105
+ ]
106
+ }
107
+ if (object instanceof Error) {
108
+ return ['error', id, object.name, object.message, object.stack, encode(object.cause)]
109
+ }
110
+ if (object instanceof Number || object instanceof String || object instanceof Boolean)
111
+ return ['boxed', id, object.constructor.name, encode(object.valueOf())]
112
+ if (typeof SharedArrayBuffer !== 'undefined' && object instanceof SharedArrayBuffer)
113
+ throw new MemoryRevisionUnavailableError()
114
+ const prototype = Object.getPrototypeOf(object)
115
+ if (prototype !== Object.prototype && prototype !== null)
116
+ throw new MemoryRevisionUnavailableError()
117
+ return [
118
+ 'object',
119
+ id,
120
+ Object.keys(object as Record<string, unknown>)
121
+ .sort()
122
+ .map((key) => [key, encode((object as Record<string, unknown>)[key])]),
123
+ ]
124
+ }
125
+
126
+ return JSON.stringify(encode(snapshot))
127
+ }
128
+
129
+ /** A content-derived token; it includes metadata as well as the body. */
130
+ export function memoryRevision(record: MemoryRecord): string {
131
+ return `m2:${createHash('sha256').update(canonicalRecord(record)).digest('hex')}`
132
+ }
133
+
134
+ /** The record changed or disappeared after its revision was read. */
135
+ export class MemoryRevisionConflictError extends NamzuError {
136
+ readonly memoryId: MemoryId
137
+
138
+ constructor(memoryId: MemoryId) {
139
+ super({
140
+ code: 'storage_error',
141
+ message: `Memory ${memoryId} changed since it was read. Read it again before changing it.`,
142
+ details: { memoryId, reason: 'revision_conflict' },
143
+ retryable: false,
144
+ })
145
+ this.name = 'MemoryRevisionConflictError'
146
+ this.memoryId = memoryId
147
+ }
148
+ }
149
+
150
+ export function assertMemoryRevision(
151
+ id: MemoryId,
152
+ record: MemoryRecord | undefined,
153
+ expectedRevision: string,
154
+ ): asserts record is MemoryRecord {
155
+ if (!record || memoryRevision(record) !== expectedRevision) {
156
+ throw new MemoryRevisionConflictError(id)
157
+ }
158
+ }
@@ -36,7 +36,7 @@
36
36
 
37
37
  import { createHash } from 'node:crypto'
38
38
  import { mkdir, rm } from 'node:fs/promises'
39
- import { join } from 'node:path'
39
+ import { join, resolve } from 'node:path'
40
40
  import {
41
41
  ProjectRootPathTakenError,
42
42
  StaleProjectError,
@@ -44,7 +44,7 @@ import {
44
44
  TenantIsolationError,
45
45
  } from '../../session/errors.js'
46
46
  import { SessionAlreadySummarizedError } from '../../session/summary/errors.js'
47
- import type { SessionId, TenantId } from '../../types/ids/index.js'
47
+ import type { SessionId, TenantId, TurnId } from '../../types/ids/index.js'
48
48
  import type { Project, ProjectStatus } from '../../types/project/entity.js'
49
49
  import type { Session } from '../../types/session/entity.js'
50
50
  import type { ProjectId, SubSessionId, SummaryId, TopicId } from '../../types/session/ids.js'
@@ -68,6 +68,7 @@ import {
68
68
  asSessionId,
69
69
  asSubSessionId,
70
70
  asTopicId,
71
+ asTurnId,
71
72
  generateProjectId,
72
73
  generateSessionId,
73
74
  generateSubSessionId,
@@ -237,6 +238,7 @@ interface PersistedSubSession {
237
238
  interface PersistedSummary {
238
239
  id: SummaryId
239
240
  sessionRef: SessionId
241
+ turnRef?: TurnId
240
242
  tenantId: TenantId
241
243
  outcome: SessionSummaryOutcome
242
244
  deliverables: readonly DeliverableRef[]
@@ -257,6 +259,10 @@ const SUMMARY_TERMINAL_FLIP_STATUSES: ReadonlySet<Session['status']> = new Set([
257
259
  'awaiting_merge',
258
260
  ])
259
261
 
262
+ // Share the in-process writer guard across store instances addressing the same
263
+ // root. This is not a cross-process lease; external writers remain a host concern.
264
+ const sessionWriters = new Map<string, Promise<void>>()
265
+
260
266
  /**
261
267
  * Index of projectId → its directory path. Built lazily on lookup via
262
268
  * {@link DiskSessionStore.resolveProjectDir}; populated by create / getProject.
@@ -276,6 +282,8 @@ interface SessionIndexEntry {
276
282
  }
277
283
 
278
284
  export class DiskSessionStore implements SessionStore {
285
+ readonly supportsInvocationSummaries: boolean = true
286
+ readonly supportsOwnerVersionCas: boolean = true
279
287
  private readonly rootDir: string
280
288
  private readonly projectIndex = new Map<ProjectId, ProjectIndexEntry>()
281
289
  private readonly sessionIndex = new Map<SessionId, SessionIndexEntry>()
@@ -288,6 +296,24 @@ export class DiskSessionStore implements SessionStore {
288
296
  this.rootDir = config.rootDir
289
297
  }
290
298
 
299
+ private async withSessionWrite<T>(sessionId: SessionId, operation: () => Promise<T>): Promise<T> {
300
+ const key = resolve(this.rootDir, sessionId)
301
+ const previous = sessionWriters.get(key) ?? Promise.resolve()
302
+ let release = () => {}
303
+ const held = new Promise<void>((resolveWrite) => {
304
+ release = resolveWrite
305
+ })
306
+ const tail = previous.then(() => held)
307
+ sessionWriters.set(key, tail)
308
+ await previous
309
+ try {
310
+ return await operation()
311
+ } finally {
312
+ release()
313
+ if (sessionWriters.get(key) === tail) sessionWriters.delete(key)
314
+ }
315
+ }
316
+
291
317
  // Project CRUD ------------------------------------------------------------
292
318
 
293
319
  async createProject(params: CreateProjectParams, tenantId: TenantId): Promise<Project> {
@@ -654,6 +680,16 @@ export class DiskSessionStore implements SessionStore {
654
680
  session: Session,
655
681
  tenantId: TenantId,
656
682
  expectedOwnerVersion?: number,
683
+ ): Promise<void> {
684
+ await this.withSessionWrite(session.id, () =>
685
+ this.updateSessionUnlocked(session, tenantId, expectedOwnerVersion),
686
+ )
687
+ }
688
+
689
+ private async updateSessionUnlocked(
690
+ session: Session,
691
+ tenantId: TenantId,
692
+ expectedOwnerVersion?: number,
657
693
  ): Promise<void> {
658
694
  const located = await this.locateSession(session.id)
659
695
  if (!located) {
@@ -669,10 +705,8 @@ export class DiskSessionStore implements SessionStore {
669
705
  if (existing) {
670
706
  this.assertTenant(existing.tenantId, tenantId, `session(${session.id})`)
671
707
  }
672
- // Against what is on disk, not against the payload. The write itself is
673
- // atomic; this read-compare-write is NOT a critical section, so two
674
- // processes can still both pass — see the contract note on
675
- // `SessionStore.updateSession`. In one process it is the real lock.
708
+ // Against the stored version, under the shared in-process writer guard.
709
+ // Other processes can still both pass; see SessionStore.updateSession.
676
710
  if (
677
711
  expectedOwnerVersion !== undefined &&
678
712
  existing !== null &&
@@ -862,11 +896,22 @@ export class DiskSessionStore implements SessionStore {
862
896
  * leaves summary present + session still non-terminal — recovery replays
863
897
  * the flip via {@link SessionSummaryMaterializer.recover}. Idempotent when
864
898
  * the same summary is re-presented (recovery path); rejects a *different*
865
- * summary for the same session as {@link SessionAlreadySummarizedError}.
899
+ * summary at the same conversation or invocation key as {@link SessionAlreadySummarizedError}.
866
900
  */
867
901
  async recordSummary(
868
902
  summary: SessionSummaryRef & { materializedBy: 'kernel' },
869
903
  tenantId: TenantId,
904
+ expectedOwnerVersion?: number,
905
+ ): Promise<void> {
906
+ await this.withSessionWrite(summary.sessionRef, () =>
907
+ this.recordSummaryUnlocked(summary, tenantId, expectedOwnerVersion),
908
+ )
909
+ }
910
+
911
+ private async recordSummaryUnlocked(
912
+ summary: SessionSummaryRef & { materializedBy: 'kernel' },
913
+ tenantId: TenantId,
914
+ expectedOwnerVersion?: number,
870
915
  ): Promise<void> {
871
916
  if (summary.tenantId !== tenantId) {
872
917
  throw new TenantIsolationError({
@@ -884,8 +929,15 @@ export class DiskSessionStore implements SessionStore {
884
929
  throw new Error(`Session ${summary.sessionRef} not found on disk`)
885
930
  }
886
931
  this.assertTenant(sessionRaw.tenantId, tenantId, `session(${summary.sessionRef})`)
932
+ if (expectedOwnerVersion !== undefined && sessionRaw.ownerVersion !== expectedOwnerVersion) {
933
+ throw new StaleSessionError({
934
+ sessionId: summary.sessionRef,
935
+ expectedVersion: expectedOwnerVersion,
936
+ actualVersion: sessionRaw.ownerVersion,
937
+ })
938
+ }
887
939
 
888
- const summaryPath = join(located.path, 'summary.json')
940
+ const summaryPath = summaryFile(located.path, summary.turnRef)
889
941
  const existingRaw = await records.read<PersistedSummary>(summaryPath)
890
942
  if (existingRaw) {
891
943
  this.assertTenant(existingRaw.tenantId, tenantId, `summary(${existingRaw.id})`)
@@ -899,6 +951,8 @@ export class DiskSessionStore implements SessionStore {
899
951
  // to the status flip so crash-between-writes is recovered.
900
952
  } else {
901
953
  // Step 1: persist summary.
954
+ if (summary.turnRef)
955
+ await mkdir(join(located.path, 'turn-summaries'), { recursive: true, mode: 0o700 })
902
956
  await records.write(summaryPath, serializeSummary(summary))
903
957
  }
904
958
 
@@ -913,10 +967,15 @@ export class DiskSessionStore implements SessionStore {
913
967
  }
914
968
  }
915
969
 
916
- async getSummary(sessionId: SessionId, tenantId: TenantId): Promise<SessionSummaryRef | null> {
970
+ async getSummary(
971
+ sessionId: SessionId,
972
+ tenantId: TenantId,
973
+ turnId?: TurnId,
974
+ ): Promise<SessionSummaryRef | null> {
975
+ if (turnId !== undefined) asTurnId(turnId)
917
976
  const located = await this.locateSession(sessionId)
918
977
  if (!located) return null
919
- const raw = await records.read<PersistedSummary>(join(located.path, 'summary.json'))
978
+ const raw = await records.read<PersistedSummary>(summaryFile(located.path, turnId))
920
979
  if (!raw) return null
921
980
  this.assertTenant(raw.tenantId, tenantId, `summary(${raw.id})`)
922
981
  return deserializeSummary(raw)
@@ -1161,6 +1220,7 @@ function serializeSummary(s: SessionSummaryRef): PersistedSummary {
1161
1220
  return {
1162
1221
  id: s.id,
1163
1222
  sessionRef: s.sessionRef,
1223
+ ...(s.turnRef ? { turnRef: s.turnRef } : {}),
1164
1224
  tenantId: s.tenantId,
1165
1225
  outcome: s.outcome,
1166
1226
  deliverables: s.deliverables,
@@ -1182,6 +1242,7 @@ function deserializeSummary(s: PersistedSummary): SessionSummaryRef {
1182
1242
  return {
1183
1243
  id: s.id,
1184
1244
  sessionRef: s.sessionRef,
1245
+ ...(s.turnRef ? { turnRef: asTurnId(s.turnRef) } : {}),
1185
1246
  tenantId: s.tenantId,
1186
1247
  outcome: s.outcome,
1187
1248
  deliverables: s.deliverables,
@@ -1191,3 +1252,9 @@ function deserializeSummary(s: PersistedSummary): SessionSummaryRef {
1191
1252
  materializedBy: 'kernel',
1192
1253
  }
1193
1254
  }
1255
+
1256
+ function summaryFile(directory: string, turnId?: TurnId): string {
1257
+ return turnId === undefined
1258
+ ? join(directory, 'summary.json')
1259
+ : join(directory, 'turn-summaries', `${asTurnId(turnId)}.json`)
1260
+ }