@namzu/sdk 46.0.0 → 48.1.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 (768) hide show
  1. package/CHANGELOG.md +351 -8
  2. package/README.md +7 -8
  3. package/dist/advisory/history.d.ts.map +1 -1
  4. package/dist/advisory/history.js +21 -1
  5. package/dist/advisory/history.js.map +1 -1
  6. package/dist/advisory/index.d.ts +1 -1
  7. package/dist/advisory/index.d.ts.map +1 -1
  8. package/dist/advisory/index.js +1 -1
  9. package/dist/advisory/index.js.map +1 -1
  10. package/dist/advisory/registry.d.ts +17 -0
  11. package/dist/advisory/registry.d.ts.map +1 -1
  12. package/dist/advisory/registry.js +26 -0
  13. package/dist/advisory/registry.js.map +1 -1
  14. package/dist/agents/PipelineAgent.d.ts +2 -46
  15. package/dist/agents/PipelineAgent.d.ts.map +1 -1
  16. package/dist/agents/PipelineAgent.js +2 -242
  17. package/dist/agents/PipelineAgent.js.map +1 -1
  18. package/dist/agents/QueryAgent.d.ts +21 -0
  19. package/dist/agents/QueryAgent.d.ts.map +1 -0
  20. package/dist/agents/QueryAgent.js +214 -0
  21. package/dist/agents/QueryAgent.js.map +1 -0
  22. package/dist/agents/ReactiveAgent.d.ts +4 -16
  23. package/dist/agents/ReactiveAgent.d.ts.map +1 -1
  24. package/dist/agents/ReactiveAgent.js +4 -183
  25. package/dist/agents/ReactiveAgent.js.map +1 -1
  26. package/dist/agents/RouterAgent.d.ts +2 -20
  27. package/dist/agents/RouterAgent.d.ts.map +1 -1
  28. package/dist/agents/RouterAgent.js +2 -266
  29. package/dist/agents/RouterAgent.js.map +1 -1
  30. package/dist/agents/SupervisorAgent.d.ts +3 -43
  31. package/dist/agents/SupervisorAgent.d.ts.map +1 -1
  32. package/dist/agents/SupervisorAgent.js +3 -418
  33. package/dist/agents/SupervisorAgent.js.map +1 -1
  34. package/dist/agents/defineAgent.d.ts +2 -1
  35. package/dist/agents/defineAgent.d.ts.map +1 -1
  36. package/dist/agents/defineAgent.js +6 -1
  37. package/dist/agents/defineAgent.js.map +1 -1
  38. package/dist/agents/examples/PipelineAgent.d.ts +46 -0
  39. package/dist/agents/examples/PipelineAgent.d.ts.map +1 -0
  40. package/dist/agents/examples/PipelineAgent.js +242 -0
  41. package/dist/agents/examples/PipelineAgent.js.map +1 -0
  42. package/dist/agents/examples/RouterAgent.d.ts +22 -0
  43. package/dist/agents/examples/RouterAgent.d.ts.map +1 -0
  44. package/dist/agents/examples/RouterAgent.js +268 -0
  45. package/dist/agents/examples/RouterAgent.js.map +1 -0
  46. package/dist/agents/examples/SupervisorAgent.d.ts +45 -0
  47. package/dist/agents/examples/SupervisorAgent.d.ts.map +1 -0
  48. package/dist/agents/examples/SupervisorAgent.js +406 -0
  49. package/dist/agents/examples/SupervisorAgent.js.map +1 -0
  50. package/dist/agents/explore.d.ts +6 -3
  51. package/dist/agents/explore.d.ts.map +1 -1
  52. package/dist/agents/explore.js +6 -3
  53. package/dist/agents/explore.js.map +1 -1
  54. package/dist/agents/forward-options.d.ts +11 -0
  55. package/dist/agents/forward-options.d.ts.map +1 -0
  56. package/dist/agents/forward-options.js +15 -0
  57. package/dist/agents/forward-options.js.map +1 -0
  58. package/dist/agents/index.d.ts +1 -0
  59. package/dist/agents/index.d.ts.map +1 -1
  60. package/dist/agents/index.js +2 -0
  61. package/dist/agents/index.js.map +1 -1
  62. package/dist/agents/runAgent.d.ts +19 -8
  63. package/dist/agents/runAgent.d.ts.map +1 -1
  64. package/dist/agents/runAgent.js +99 -29
  65. package/dist/agents/runAgent.js.map +1 -1
  66. package/dist/authorization/command-line.d.ts +2 -0
  67. package/dist/authorization/command-line.d.ts.map +1 -1
  68. package/dist/authorization/command-line.js +2 -2
  69. package/dist/authorization/command-line.js.map +1 -1
  70. package/dist/authorization/gate.d.ts +8 -0
  71. package/dist/authorization/gate.d.ts.map +1 -1
  72. package/dist/authorization/gate.js +12 -1
  73. package/dist/authorization/gate.js.map +1 -1
  74. package/dist/authorization/program.d.ts +151 -0
  75. package/dist/authorization/program.d.ts.map +1 -0
  76. package/dist/authorization/program.js +713 -0
  77. package/dist/authorization/program.js.map +1 -0
  78. package/dist/authorization/reexec-wrapper.d.ts +106 -0
  79. package/dist/authorization/reexec-wrapper.d.ts.map +1 -0
  80. package/dist/authorization/reexec-wrapper.js +532 -0
  81. package/dist/authorization/reexec-wrapper.js.map +1 -0
  82. package/dist/authorization/rules.d.ts +9 -0
  83. package/dist/authorization/rules.d.ts.map +1 -1
  84. package/dist/authorization/rules.js +8 -1
  85. package/dist/authorization/rules.js.map +1 -1
  86. package/dist/authorization/shell-lexer.d.ts +19 -4
  87. package/dist/authorization/shell-lexer.d.ts.map +1 -1
  88. package/dist/authorization/shell-lexer.js +91 -65
  89. package/dist/authorization/shell-lexer.js.map +1 -1
  90. package/dist/bridge/sse/mapper.d.ts.map +1 -1
  91. package/dist/bridge/sse/mapper.js +6 -0
  92. package/dist/bridge/sse/mapper.js.map +1 -1
  93. package/dist/capabilities/index.d.ts +54 -0
  94. package/dist/capabilities/index.d.ts.map +1 -0
  95. package/dist/capabilities/index.js +92 -0
  96. package/dist/capabilities/index.js.map +1 -0
  97. package/dist/config/registry.d.ts +2 -1
  98. package/dist/config/registry.d.ts.map +1 -1
  99. package/dist/config/registry.js +3 -2
  100. package/dist/config/registry.js.map +1 -1
  101. package/dist/connector/index.d.ts +4 -4
  102. package/dist/connector/index.d.ts.map +1 -1
  103. package/dist/connector/index.js +3 -3
  104. package/dist/connector/index.js.map +1 -1
  105. package/dist/connector/mcp/adapter.d.ts +16 -1
  106. package/dist/connector/mcp/adapter.d.ts.map +1 -1
  107. package/dist/connector/mcp/adapter.js +71 -4
  108. package/dist/connector/mcp/adapter.js.map +1 -1
  109. package/dist/connector/mcp/client.d.ts +32 -4
  110. package/dist/connector/mcp/client.d.ts.map +1 -1
  111. package/dist/connector/mcp/client.js +383 -5
  112. package/dist/connector/mcp/client.js.map +1 -1
  113. package/dist/connector/mcp/discovery.d.ts +24 -1
  114. package/dist/connector/mcp/discovery.d.ts.map +1 -1
  115. package/dist/connector/mcp/discovery.js +44 -0
  116. package/dist/connector/mcp/discovery.js.map +1 -1
  117. package/dist/connector/mcp/era.d.ts.map +1 -1
  118. package/dist/connector/mcp/era.js +7 -0
  119. package/dist/connector/mcp/era.js.map +1 -1
  120. package/dist/connector/mcp/index.d.ts +2 -0
  121. package/dist/connector/mcp/index.d.ts.map +1 -1
  122. package/dist/connector/mcp/index.js +11 -0
  123. package/dist/connector/mcp/index.js.map +1 -1
  124. package/dist/connector/mcp/mcp-toolset.d.ts +133 -0
  125. package/dist/connector/mcp/mcp-toolset.d.ts.map +1 -0
  126. package/dist/connector/mcp/mcp-toolset.js +399 -0
  127. package/dist/connector/mcp/mcp-toolset.js.map +1 -0
  128. package/dist/connector/mcp/streamable-http.d.ts +15 -0
  129. package/dist/connector/mcp/streamable-http.d.ts.map +1 -1
  130. package/dist/connector/mcp/streamable-http.js +281 -6
  131. package/dist/connector/mcp/streamable-http.js.map +1 -1
  132. package/dist/connector/tools/index.d.ts +2 -2
  133. package/dist/connector/tools/index.d.ts.map +1 -1
  134. package/dist/connector/tools/index.js +1 -1
  135. package/dist/connector/tools/index.js.map +1 -1
  136. package/dist/connector/tools/router.d.ts +15 -13
  137. package/dist/connector/tools/router.d.ts.map +1 -1
  138. package/dist/connector/tools/router.js +30 -51
  139. package/dist/connector/tools/router.js.map +1 -1
  140. package/dist/contracts/a2a.d.ts +2 -2
  141. package/dist/directory/derive-supervisor.d.ts +2 -2
  142. package/dist/directory/derive-supervisor.d.ts.map +1 -1
  143. package/dist/directory/derive-supervisor.js +6 -7
  144. package/dist/directory/derive-supervisor.js.map +1 -1
  145. package/dist/directory/derive.d.ts.map +1 -1
  146. package/dist/directory/derive.js +5 -5
  147. package/dist/directory/derive.js.map +1 -1
  148. package/dist/execution/code-runtime/types.d.ts +2 -2
  149. package/dist/execution/code-runtime/types.js +1 -1
  150. package/dist/invariants/index.d.ts +2 -1
  151. package/dist/invariants/index.d.ts.map +1 -1
  152. package/dist/invariants/index.js +3 -2
  153. package/dist/invariants/index.js.map +1 -1
  154. package/dist/manager/agent/lifecycle.d.ts +1 -0
  155. package/dist/manager/agent/lifecycle.d.ts.map +1 -1
  156. package/dist/manager/agent/lifecycle.js +146 -18
  157. package/dist/manager/agent/lifecycle.js.map +1 -1
  158. package/dist/manager/connector/environment.d.ts +6 -0
  159. package/dist/manager/connector/environment.d.ts.map +1 -1
  160. package/dist/manager/connector/environment.js +11 -4
  161. package/dist/manager/connector/environment.js.map +1 -1
  162. package/dist/manager/connector/index.d.ts +2 -2
  163. package/dist/manager/connector/index.d.ts.map +1 -1
  164. package/dist/manager/connector/index.js +2 -2
  165. package/dist/manager/connector/index.js.map +1 -1
  166. package/dist/manager/connector/tenant.d.ts +6 -0
  167. package/dist/manager/connector/tenant.d.ts.map +1 -1
  168. package/dist/manager/connector/tenant.js +11 -4
  169. package/dist/manager/connector/tenant.js.map +1 -1
  170. package/dist/manager/index.d.ts +2 -2
  171. package/dist/manager/index.d.ts.map +1 -1
  172. package/dist/manager/index.js +2 -2
  173. package/dist/manager/index.js.map +1 -1
  174. package/dist/manager/resident/initiative.d.ts +6 -6
  175. package/dist/manager/resident/learning-observation.d.ts +4 -4
  176. package/dist/manager/resident/learning.d.ts +36 -36
  177. package/dist/manager/resident/outbox.d.ts +4 -4
  178. package/dist/manager/session/attribution.d.ts +22 -0
  179. package/dist/manager/session/attribution.d.ts.map +1 -0
  180. package/dist/manager/session/attribution.js +64 -0
  181. package/dist/manager/session/attribution.js.map +1 -0
  182. package/dist/manager/session/turn-recorder.d.ts +14 -0
  183. package/dist/manager/session/turn-recorder.d.ts.map +1 -1
  184. package/dist/manager/session/turn-recorder.js +208 -55
  185. package/dist/manager/session/turn-recorder.js.map +1 -1
  186. package/dist/peers/address.d.ts +36 -0
  187. package/dist/peers/address.d.ts.map +1 -0
  188. package/dist/peers/address.js +52 -0
  189. package/dist/peers/address.js.map +1 -0
  190. package/dist/peers/client.d.ts +47 -0
  191. package/dist/peers/client.d.ts.map +1 -0
  192. package/dist/peers/client.js +132 -0
  193. package/dist/peers/client.js.map +1 -0
  194. package/dist/peers/dir.d.ts +88 -0
  195. package/dist/peers/dir.d.ts.map +1 -0
  196. package/dist/peers/dir.js +139 -0
  197. package/dist/peers/dir.js.map +1 -0
  198. package/dist/peers/endpoint.d.ts +144 -0
  199. package/dist/peers/endpoint.d.ts.map +1 -0
  200. package/dist/peers/endpoint.js +420 -0
  201. package/dist/peers/endpoint.js.map +1 -0
  202. package/dist/peers/envelope.d.ts +42 -0
  203. package/dist/peers/envelope.d.ts.map +1 -0
  204. package/dist/peers/envelope.js +110 -0
  205. package/dist/peers/envelope.js.map +1 -0
  206. package/dist/peers/index.d.ts +30 -0
  207. package/dist/peers/index.d.ts.map +1 -0
  208. package/dist/peers/index.js +22 -0
  209. package/dist/peers/index.js.map +1 -0
  210. package/dist/peers/protocol.d.ts +645 -0
  211. package/dist/peers/protocol.d.ts.map +1 -0
  212. package/dist/peers/protocol.js +151 -0
  213. package/dist/peers/protocol.js.map +1 -0
  214. package/dist/peers/record.d.ts +71 -0
  215. package/dist/peers/record.d.ts.map +1 -0
  216. package/dist/peers/record.js +45 -0
  217. package/dist/peers/record.js.map +1 -0
  218. package/dist/peers/registry.d.ts +54 -0
  219. package/dist/peers/registry.d.ts.map +1 -0
  220. package/dist/peers/registry.js +213 -0
  221. package/dist/peers/registry.js.map +1 -0
  222. package/dist/plugin/define.d.ts +24 -0
  223. package/dist/plugin/define.d.ts.map +1 -0
  224. package/dist/plugin/define.js +42 -0
  225. package/dist/plugin/define.js.map +1 -0
  226. package/dist/plugin/index.d.ts +2 -0
  227. package/dist/plugin/index.d.ts.map +1 -1
  228. package/dist/plugin/index.js +1 -0
  229. package/dist/plugin/index.js.map +1 -1
  230. package/dist/plugin/lifecycle.d.ts +27 -3
  231. package/dist/plugin/lifecycle.d.ts.map +1 -1
  232. package/dist/plugin/lifecycle.js +242 -92
  233. package/dist/plugin/lifecycle.js.map +1 -1
  234. package/dist/plugin/resolver.d.ts +2 -2
  235. package/dist/plugin/resolver.d.ts.map +1 -1
  236. package/dist/plugin/resolver.js.map +1 -1
  237. package/dist/plugin/shell-hook.d.ts.map +1 -1
  238. package/dist/plugin/shell-hook.js +17 -3
  239. package/dist/plugin/shell-hook.js.map +1 -1
  240. package/dist/probe/errors.d.ts +2 -1
  241. package/dist/probe/errors.d.ts.map +1 -1
  242. package/dist/probe/errors.js +3 -2
  243. package/dist/probe/errors.js.map +1 -1
  244. package/dist/prompt/coding-agent-doctrine.d.ts +18 -7
  245. package/dist/prompt/coding-agent-doctrine.d.ts.map +1 -1
  246. package/dist/prompt/coding-agent-doctrine.js +11 -6
  247. package/dist/prompt/coding-agent-doctrine.js.map +1 -1
  248. package/dist/prompt/contributions.d.ts +4 -1
  249. package/dist/prompt/contributions.d.ts.map +1 -1
  250. package/dist/prompt/contributions.js +7 -2
  251. package/dist/prompt/contributions.js.map +1 -1
  252. package/dist/prompt/index.d.ts +1 -1
  253. package/dist/prompt/index.d.ts.map +1 -1
  254. package/dist/prompt/index.js +1 -1
  255. package/dist/prompt/index.js.map +1 -1
  256. package/dist/provider/collect-chat-completion.d.ts +6 -1
  257. package/dist/provider/collect-chat-completion.d.ts.map +1 -1
  258. package/dist/provider/collect-chat-completion.js +88 -10
  259. package/dist/provider/collect-chat-completion.js.map +1 -1
  260. package/dist/provider/mock.d.ts.map +1 -1
  261. package/dist/provider/mock.js +23 -6
  262. package/dist/provider/mock.js.map +1 -1
  263. package/dist/provider/registry.d.ts +2 -1
  264. package/dist/provider/registry.d.ts.map +1 -1
  265. package/dist/provider/registry.js +3 -2
  266. package/dist/provider/registry.js.map +1 -1
  267. package/dist/provider/tool-call-framing.d.ts +164 -0
  268. package/dist/provider/tool-call-framing.d.ts.map +1 -0
  269. package/dist/provider/tool-call-framing.js +163 -0
  270. package/dist/provider/tool-call-framing.js.map +1 -0
  271. package/dist/public-runtime.d.ts +24 -11
  272. package/dist/public-runtime.d.ts.map +1 -1
  273. package/dist/public-runtime.js +45 -9
  274. package/dist/public-runtime.js.map +1 -1
  275. package/dist/public-tools.d.ts +6 -4
  276. package/dist/public-tools.d.ts.map +1 -1
  277. package/dist/public-tools.js +8 -3
  278. package/dist/public-tools.js.map +1 -1
  279. package/dist/public-types.d.ts +13 -2
  280. package/dist/public-types.d.ts.map +1 -1
  281. package/dist/read-model/registry.d.ts +2 -1
  282. package/dist/read-model/registry.d.ts.map +1 -1
  283. package/dist/read-model/registry.js +3 -2
  284. package/dist/read-model/registry.js.map +1 -1
  285. package/dist/registry/ManagedRegistry.d.ts +30 -0
  286. package/dist/registry/ManagedRegistry.d.ts.map +1 -1
  287. package/dist/registry/ManagedRegistry.js +45 -6
  288. package/dist/registry/ManagedRegistry.js.map +1 -1
  289. package/dist/registry/collision.d.ts +57 -0
  290. package/dist/registry/collision.d.ts.map +1 -0
  291. package/dist/registry/collision.js +41 -0
  292. package/dist/registry/collision.js.map +1 -0
  293. package/dist/registry/command/index.d.ts +5 -3
  294. package/dist/registry/command/index.d.ts.map +1 -1
  295. package/dist/registry/command/index.js +6 -4
  296. package/dist/registry/command/index.js.map +1 -1
  297. package/dist/registry/index.d.ts +3 -4
  298. package/dist/registry/index.d.ts.map +1 -1
  299. package/dist/registry/index.js +2 -2
  300. package/dist/registry/index.js.map +1 -1
  301. package/dist/registry/plugin/index.d.ts.map +1 -1
  302. package/dist/registry/plugin/index.js +14 -1
  303. package/dist/registry/plugin/index.js.map +1 -1
  304. package/dist/registry/tool/callable.d.ts +7 -7
  305. package/dist/registry/tool/callable.d.ts.map +1 -1
  306. package/dist/registry/tool/callable.js +6 -7
  307. package/dist/registry/tool/callable.js.map +1 -1
  308. package/dist/registry/tool/execute.d.ts +14 -77
  309. package/dist/registry/tool/execute.d.ts.map +1 -1
  310. package/dist/registry/tool/execute.js +15 -727
  311. package/dist/registry/tool/execute.js.map +1 -1
  312. package/dist/registry/tool/portable.d.ts +25 -0
  313. package/dist/registry/tool/portable.d.ts.map +1 -1
  314. package/dist/registry/tool/portable.js +50 -0
  315. package/dist/registry/tool/portable.js.map +1 -1
  316. package/dist/registry/tool/presentation.d.ts +6 -5
  317. package/dist/registry/tool/presentation.d.ts.map +1 -1
  318. package/dist/registry/tool/presentation.js +3 -3
  319. package/dist/registry/tool/presentation.js.map +1 -1
  320. package/dist/runtime/bidi/session.d.ts +5 -4
  321. package/dist/runtime/bidi/session.d.ts.map +1 -1
  322. package/dist/runtime/bidi/session.js +18 -1
  323. package/dist/runtime/bidi/session.js.map +1 -1
  324. package/dist/runtime/query/executor/tool-call-admission.d.ts +45 -2
  325. package/dist/runtime/query/executor/tool-call-admission.d.ts.map +1 -1
  326. package/dist/runtime/query/executor/tool-call-admission.js +189 -5
  327. package/dist/runtime/query/executor/tool-call-admission.js.map +1 -1
  328. package/dist/runtime/query/executor.d.ts +33 -3
  329. package/dist/runtime/query/executor.d.ts.map +1 -1
  330. package/dist/runtime/query/executor.js +86 -10
  331. package/dist/runtime/query/executor.js.map +1 -1
  332. package/dist/runtime/query/file-evidence-replay.d.ts +1 -1
  333. package/dist/runtime/query/file-evidence-replay.d.ts.map +1 -1
  334. package/dist/runtime/query/file-evidence-replay.js +8 -7
  335. package/dist/runtime/query/file-evidence-replay.js.map +1 -1
  336. package/dist/runtime/query/fork/prepare.d.ts +4 -1
  337. package/dist/runtime/query/fork/prepare.d.ts.map +1 -1
  338. package/dist/runtime/query/fork/prepare.js +4 -0
  339. package/dist/runtime/query/fork/prepare.js.map +1 -1
  340. package/dist/runtime/query/guardrail-presets.d.ts +4 -3
  341. package/dist/runtime/query/guardrail-presets.d.ts.map +1 -1
  342. package/dist/runtime/query/guardrail-presets.js +4 -3
  343. package/dist/runtime/query/guardrail-presets.js.map +1 -1
  344. package/dist/runtime/query/index.d.ts +23 -10
  345. package/dist/runtime/query/index.d.ts.map +1 -1
  346. package/dist/runtime/query/index.js +149 -70
  347. package/dist/runtime/query/index.js.map +1 -1
  348. package/dist/runtime/query/iteration/index.d.ts.map +1 -1
  349. package/dist/runtime/query/iteration/index.js +8 -1
  350. package/dist/runtime/query/iteration/index.js.map +1 -1
  351. package/dist/runtime/query/iteration/phases/compaction.js +1 -1
  352. package/dist/runtime/query/iteration/phases/compaction.js.map +1 -1
  353. package/dist/runtime/query/iteration/phases/context.d.ts +2 -2
  354. package/dist/runtime/query/iteration/phases/context.d.ts.map +1 -1
  355. package/dist/runtime/query/iteration/phases/tool-review.d.ts.map +1 -1
  356. package/dist/runtime/query/iteration/phases/tool-review.js +55 -2
  357. package/dist/runtime/query/iteration/phases/tool-review.js.map +1 -1
  358. package/dist/runtime/query/iteration/stream-turn.d.ts.map +1 -1
  359. package/dist/runtime/query/iteration/stream-turn.js +342 -116
  360. package/dist/runtime/query/iteration/stream-turn.js.map +1 -1
  361. package/dist/runtime/query/iteration/tool-input.d.ts +79 -0
  362. package/dist/runtime/query/iteration/tool-input.d.ts.map +1 -0
  363. package/dist/runtime/query/iteration/tool-input.js +291 -0
  364. package/dist/runtime/query/iteration/tool-input.js.map +1 -0
  365. package/dist/runtime/query/observation-context.d.ts +2 -2
  366. package/dist/runtime/query/observation-context.d.ts.map +1 -1
  367. package/dist/runtime/query/observation-context.js.map +1 -1
  368. package/dist/runtime/query/prelude-lease.d.ts +18 -0
  369. package/dist/runtime/query/prelude-lease.d.ts.map +1 -0
  370. package/dist/runtime/query/prelude-lease.js +121 -0
  371. package/dist/runtime/query/prelude-lease.js.map +1 -0
  372. package/dist/runtime/query/prepare-turn.d.ts.map +1 -1
  373. package/dist/runtime/query/prepare-turn.js +386 -187
  374. package/dist/runtime/query/prepare-turn.js.map +1 -1
  375. package/dist/runtime/query/prompt-cache.d.ts +2 -2
  376. package/dist/runtime/query/prompt-cache.d.ts.map +1 -1
  377. package/dist/runtime/query/prompt.d.ts +2 -2
  378. package/dist/runtime/query/prompt.d.ts.map +1 -1
  379. package/dist/runtime/query/prompt.js +1 -1
  380. package/dist/runtime/query/prompt.js.map +1 -1
  381. package/dist/runtime/query/resume-session.d.ts.map +1 -1
  382. package/dist/runtime/query/resume-session.js +37 -2
  383. package/dist/runtime/query/resume-session.js.map +1 -1
  384. package/dist/runtime/query/review-policy.d.ts +22 -3
  385. package/dist/runtime/query/review-policy.d.ts.map +1 -1
  386. package/dist/runtime/query/review-policy.js +84 -6
  387. package/dist/runtime/query/review-policy.js.map +1 -1
  388. package/dist/runtime/query/tooling.d.ts +3 -2
  389. package/dist/runtime/query/tooling.d.ts.map +1 -1
  390. package/dist/runtime/query/tooling.js.map +1 -1
  391. package/dist/runtime/query/turn-state.d.ts.map +1 -1
  392. package/dist/runtime/query/turn-state.js +5 -0
  393. package/dist/runtime/query/turn-state.js.map +1 -1
  394. package/dist/runtime/system-events.d.ts +112 -0
  395. package/dist/runtime/system-events.d.ts.map +1 -0
  396. package/dist/runtime/system-events.js +183 -0
  397. package/dist/runtime/system-events.js.map +1 -0
  398. package/dist/scheduler/delegating.d.ts +2 -1
  399. package/dist/scheduler/delegating.d.ts.map +1 -1
  400. package/dist/scheduler/delegating.js +3 -2
  401. package/dist/scheduler/delegating.js.map +1 -1
  402. package/dist/scheduler/local.d.ts.map +1 -1
  403. package/dist/scheduler/local.js +2 -0
  404. package/dist/scheduler/local.js.map +1 -1
  405. package/dist/session/retention/archive.js +1 -1
  406. package/dist/session/retention/archive.js.map +1 -1
  407. package/dist/skills/index.d.ts +1 -1
  408. package/dist/skills/index.d.ts.map +1 -1
  409. package/dist/skills/index.js +1 -1
  410. package/dist/skills/index.js.map +1 -1
  411. package/dist/skills/registry.d.ts +12 -0
  412. package/dist/skills/registry.d.ts.map +1 -1
  413. package/dist/skills/registry.js +19 -0
  414. package/dist/skills/registry.js.map +1 -1
  415. package/dist/store/evidence/index-page.d.ts +2 -2
  416. package/dist/store/session/disk.d.ts.map +1 -1
  417. package/dist/store/session/disk.js +2 -0
  418. package/dist/store/session/disk.js.map +1 -1
  419. package/dist/store/session-log/conformance.d.ts +1 -1
  420. package/dist/store/session-log/conformance.d.ts.map +1 -1
  421. package/dist/store/session-log/conformance.js +49 -8
  422. package/dist/store/session-log/conformance.js.map +1 -1
  423. package/dist/store/session-log/core.d.ts +8 -3
  424. package/dist/store/session-log/core.d.ts.map +1 -1
  425. package/dist/store/session-log/core.js +2 -1
  426. package/dist/store/session-log/core.js.map +1 -1
  427. package/dist/store/session-log/fold.d.ts +12 -0
  428. package/dist/store/session-log/fold.d.ts.map +1 -1
  429. package/dist/store/session-log/fold.js +57 -7
  430. package/dist/store/session-log/fold.js.map +1 -1
  431. package/dist/store/session-log/index.d.ts +2 -2
  432. package/dist/store/session-log/index.d.ts.map +1 -1
  433. package/dist/store/session-log/index.js +1 -1
  434. package/dist/store/session-log/index.js.map +1 -1
  435. package/dist/test-support/toolset.d.ts +19 -0
  436. package/dist/test-support/toolset.d.ts.map +1 -0
  437. package/dist/test-support/toolset.js +20 -0
  438. package/dist/test-support/toolset.js.map +1 -0
  439. package/dist/tools/builtins/bash.d.ts +29 -0
  440. package/dist/tools/builtins/bash.d.ts.map +1 -1
  441. package/dist/tools/builtins/bash.js +19 -9
  442. package/dist/tools/builtins/bash.js.map +1 -1
  443. package/dist/tools/builtins/browser-url.d.ts +1 -1
  444. package/dist/tools/builtins/browser-url.js +1 -1
  445. package/dist/tools/builtins/browser.d.ts +6 -6
  446. package/dist/tools/builtins/browser.js +2 -2
  447. package/dist/tools/builtins/browser.js.map +1 -1
  448. package/dist/tools/builtins/computer-use.d.ts.map +1 -1
  449. package/dist/tools/builtins/computer-use.js +19 -11
  450. package/dist/tools/builtins/computer-use.js.map +1 -1
  451. package/dist/tools/builtins/edit.d.ts.map +1 -1
  452. package/dist/tools/builtins/edit.js +9 -1
  453. package/dist/tools/builtins/edit.js.map +1 -1
  454. package/dist/tools/builtins/json-string-hint.d.ts +15 -0
  455. package/dist/tools/builtins/json-string-hint.d.ts.map +1 -0
  456. package/dist/tools/builtins/json-string-hint.js +17 -0
  457. package/dist/tools/builtins/json-string-hint.js.map +1 -0
  458. package/dist/tools/builtins/search-tools.d.ts.map +1 -1
  459. package/dist/tools/builtins/search-tools.js +7 -15
  460. package/dist/tools/builtins/search-tools.js.map +1 -1
  461. package/dist/tools/builtins/write-file.d.ts.map +1 -1
  462. package/dist/tools/builtins/write-file.js +11 -0
  463. package/dist/tools/builtins/write-file.js.map +1 -1
  464. package/dist/tools/command-shell.d.ts +10 -0
  465. package/dist/tools/command-shell.d.ts.map +1 -1
  466. package/dist/tools/command-shell.js +45 -1
  467. package/dist/tools/command-shell.js.map +1 -1
  468. package/dist/tools/coordinator/agent.d.ts.map +1 -1
  469. package/dist/tools/coordinator/agent.js +5 -0
  470. package/dist/tools/coordinator/agent.js.map +1 -1
  471. package/dist/tools/coordinator/ask-user-question.d.ts.map +1 -1
  472. package/dist/tools/coordinator/ask-user-question.js +26 -13
  473. package/dist/tools/coordinator/ask-user-question.js.map +1 -1
  474. package/dist/tools/coordinator/index.d.ts.map +1 -1
  475. package/dist/tools/coordinator/index.js +5 -0
  476. package/dist/tools/coordinator/index.js.map +1 -1
  477. package/dist/tools/coordinator/question-options.d.ts +78 -0
  478. package/dist/tools/coordinator/question-options.d.ts.map +1 -0
  479. package/dist/tools/coordinator/question-options.js +153 -0
  480. package/dist/tools/coordinator/question-options.js.map +1 -0
  481. package/dist/tools/defineTool.d.ts +10 -0
  482. package/dist/tools/defineTool.d.ts.map +1 -1
  483. package/dist/tools/defineTool.js +17 -0
  484. package/dist/tools/defineTool.js.map +1 -1
  485. package/dist/tools/memory/search.d.ts.map +1 -1
  486. package/dist/tools/memory/search.js +4 -1
  487. package/dist/tools/memory/search.js.map +1 -1
  488. package/dist/tools/memory/update.d.ts.map +1 -1
  489. package/dist/tools/memory/update.js +8 -5
  490. package/dist/tools/memory/update.js.map +1 -1
  491. package/dist/tools/render-nonce.d.ts +47 -0
  492. package/dist/tools/render-nonce.d.ts.map +1 -0
  493. package/dist/tools/render-nonce.js +63 -0
  494. package/dist/tools/render-nonce.js.map +1 -0
  495. package/dist/tools/roster.d.ts +46 -19
  496. package/dist/tools/roster.d.ts.map +1 -1
  497. package/dist/tools/roster.js +63 -33
  498. package/dist/tools/roster.js.map +1 -1
  499. package/dist/tools/schedules/schedule-tool.d.ts.map +1 -1
  500. package/dist/tools/schedules/schedule-tool.js +94 -14
  501. package/dist/tools/schedules/schedule-tool.js.map +1 -1
  502. package/dist/tools/schedules/types.d.ts +52 -6
  503. package/dist/tools/schedules/types.d.ts.map +1 -1
  504. package/dist/tools/trusted-read-only.d.ts +9 -5
  505. package/dist/tools/trusted-read-only.d.ts.map +1 -1
  506. package/dist/tools/trusted-read-only.js +14 -10
  507. package/dist/tools/trusted-read-only.js.map +1 -1
  508. package/dist/tools/untrusted-envelope.d.ts +67 -28
  509. package/dist/tools/untrusted-envelope.d.ts.map +1 -1
  510. package/dist/tools/untrusted-envelope.js +108 -59
  511. package/dist/tools/untrusted-envelope.js.map +1 -1
  512. package/dist/toolsets/combine.d.ts +44 -0
  513. package/dist/toolsets/combine.d.ts.map +1 -0
  514. package/dist/toolsets/combine.js +153 -0
  515. package/dist/toolsets/combine.js.map +1 -0
  516. package/dist/toolsets/manager.d.ts +201 -0
  517. package/dist/toolsets/manager.d.ts.map +1 -0
  518. package/dist/toolsets/manager.js +837 -0
  519. package/dist/toolsets/manager.js.map +1 -0
  520. package/dist/toolsets/source-glob.d.ts +15 -0
  521. package/dist/toolsets/source-glob.d.ts.map +1 -0
  522. package/dist/toolsets/source-glob.js +23 -0
  523. package/dist/toolsets/source-glob.js.map +1 -0
  524. package/dist/toolsets/toolset.d.ts +20 -0
  525. package/dist/toolsets/toolset.d.ts.map +1 -0
  526. package/dist/toolsets/toolset.js +28 -0
  527. package/dist/toolsets/toolset.js.map +1 -0
  528. package/dist/toolsets/types.d.ts +128 -0
  529. package/dist/toolsets/types.d.ts.map +1 -0
  530. package/dist/toolsets/types.js +33 -0
  531. package/dist/toolsets/types.js.map +1 -0
  532. package/dist/toolsets/wrappers.d.ts +59 -0
  533. package/dist/toolsets/wrappers.d.ts.map +1 -0
  534. package/dist/toolsets/wrappers.js +165 -0
  535. package/dist/toolsets/wrappers.js.map +1 -0
  536. package/dist/types/agent/base.d.ts +27 -16
  537. package/dist/types/agent/base.d.ts.map +1 -1
  538. package/dist/types/agent/index.d.ts +1 -0
  539. package/dist/types/agent/index.d.ts.map +1 -1
  540. package/dist/types/agent/index.js +1 -0
  541. package/dist/types/agent/index.js.map +1 -1
  542. package/dist/types/agent/pipeline.d.ts +2 -0
  543. package/dist/types/agent/pipeline.d.ts.map +1 -1
  544. package/dist/types/agent/query.d.ts +117 -0
  545. package/dist/types/agent/query.d.ts.map +1 -0
  546. package/dist/types/agent/query.js +2 -0
  547. package/dist/types/agent/query.js.map +1 -0
  548. package/dist/types/agent/reactive.d.ts +2 -129
  549. package/dist/types/agent/reactive.d.ts.map +1 -1
  550. package/dist/types/agent/router.d.ts +2 -0
  551. package/dist/types/agent/router.d.ts.map +1 -1
  552. package/dist/types/agent/scheduler.d.ts +6 -1
  553. package/dist/types/agent/scheduler.d.ts.map +1 -1
  554. package/dist/types/agent/supervisor.d.ts +5 -2
  555. package/dist/types/agent/supervisor.d.ts.map +1 -1
  556. package/dist/types/agent/task.d.ts +19 -1
  557. package/dist/types/agent/task.d.ts.map +1 -1
  558. package/dist/types/agent/task.js.map +1 -1
  559. package/dist/types/authorization/index.d.ts +49 -12
  560. package/dist/types/authorization/index.d.ts.map +1 -1
  561. package/dist/types/authorization/index.js +6 -0
  562. package/dist/types/authorization/index.js.map +1 -1
  563. package/dist/types/connector/mcp.d.ts +45 -0
  564. package/dist/types/connector/mcp.d.ts.map +1 -1
  565. package/dist/types/errors/index.d.ts +15 -0
  566. package/dist/types/errors/index.d.ts.map +1 -1
  567. package/dist/types/errors/index.js.map +1 -1
  568. package/dist/types/hitl/index.d.ts +57 -0
  569. package/dist/types/hitl/index.d.ts.map +1 -1
  570. package/dist/types/hitl/index.js.map +1 -1
  571. package/dist/types/message/index.d.ts +130 -9
  572. package/dist/types/message/index.d.ts.map +1 -1
  573. package/dist/types/message/index.js +4 -1
  574. package/dist/types/message/index.js.map +1 -1
  575. package/dist/types/plugin/index.d.ts +22 -4
  576. package/dist/types/plugin/index.d.ts.map +1 -1
  577. package/dist/types/plugin/index.js +1 -0
  578. package/dist/types/plugin/index.js.map +1 -1
  579. package/dist/types/provider/chat.d.ts +5 -0
  580. package/dist/types/provider/chat.d.ts.map +1 -1
  581. package/dist/types/provider/config.d.ts +8 -3
  582. package/dist/types/provider/config.d.ts.map +1 -1
  583. package/dist/types/provider/stream.d.ts +39 -0
  584. package/dist/types/provider/stream.d.ts.map +1 -1
  585. package/dist/types/sandbox/index.d.ts +1 -1
  586. package/dist/types/session/events.d.ts +14 -3
  587. package/dist/types/session/events.d.ts.map +1 -1
  588. package/dist/types/session/events.js.map +1 -1
  589. package/dist/types/session/sub-session.d.ts +2 -0
  590. package/dist/types/session/sub-session.d.ts.map +1 -1
  591. package/dist/types/tool/index.d.ts +152 -91
  592. package/dist/types/tool/index.d.ts.map +1 -1
  593. package/dist/types/tool/index.js.map +1 -1
  594. package/dist/types/toolset/index.d.ts +10 -40
  595. package/dist/types/toolset/index.d.ts.map +1 -1
  596. package/package.json +1 -1
  597. package/src/advisory/history.ts +27 -2
  598. package/src/advisory/index.ts +1 -1
  599. package/src/advisory/registry.ts +33 -0
  600. package/src/agents/AGENTS.md +14 -7
  601. package/src/agents/PipelineAgent.ts +2 -303
  602. package/src/agents/QueryAgent.ts +269 -0
  603. package/src/agents/ReactiveAgent.ts +6 -216
  604. package/src/agents/RouterAgent.ts +2 -337
  605. package/src/agents/SupervisorAgent.ts +3 -476
  606. package/src/agents/defineAgent.ts +13 -2
  607. package/src/agents/examples/PipelineAgent.ts +302 -0
  608. package/src/agents/examples/RouterAgent.ts +338 -0
  609. package/src/agents/examples/SupervisorAgent.ts +472 -0
  610. package/src/agents/explore.ts +6 -3
  611. package/src/agents/forward-options.ts +37 -0
  612. package/src/agents/index.ts +2 -0
  613. package/src/agents/runAgent.ts +144 -37
  614. package/src/authorization/command-line.ts +2 -2
  615. package/src/authorization/gate.ts +21 -1
  616. package/src/authorization/program.ts +773 -0
  617. package/src/authorization/reexec-wrapper.ts +589 -0
  618. package/src/authorization/rules.ts +18 -1
  619. package/src/authorization/shell-lexer.ts +104 -59
  620. package/src/bridge/sse/mapper.ts +6 -0
  621. package/src/capabilities/index.ts +157 -0
  622. package/src/config/registry.ts +4 -1
  623. package/src/connector/index.ts +9 -2
  624. package/src/connector/mcp/adapter.ts +73 -3
  625. package/src/connector/mcp/client.ts +425 -6
  626. package/src/connector/mcp/discovery.ts +60 -0
  627. package/src/connector/mcp/era.ts +7 -0
  628. package/src/connector/mcp/index.ts +13 -0
  629. package/src/connector/mcp/mcp-toolset.ts +515 -0
  630. package/src/connector/mcp/streamable-http.ts +302 -5
  631. package/src/connector/tools/index.ts +2 -2
  632. package/src/connector/tools/router.ts +35 -58
  633. package/src/directory/derive-supervisor.ts +12 -8
  634. package/src/directory/derive.ts +8 -5
  635. package/src/execution/code-runtime/types.ts +2 -2
  636. package/src/invariants/index.ts +4 -1
  637. package/src/manager/agent/lifecycle.ts +167 -19
  638. package/src/manager/connector/environment.ts +17 -4
  639. package/src/manager/connector/index.ts +2 -2
  640. package/src/manager/connector/tenant.ts +17 -4
  641. package/src/manager/index.ts +2 -2
  642. package/src/manager/session/attribution.ts +79 -0
  643. package/src/manager/session/turn-recorder.ts +211 -55
  644. package/src/peers/address.ts +58 -0
  645. package/src/peers/client.ts +202 -0
  646. package/src/peers/dir.ts +176 -0
  647. package/src/peers/endpoint.ts +564 -0
  648. package/src/peers/envelope.ts +121 -0
  649. package/src/peers/index.ts +96 -0
  650. package/src/peers/protocol.ts +196 -0
  651. package/src/peers/record.ts +56 -0
  652. package/src/peers/registry.ts +241 -0
  653. package/src/plugin/define.ts +68 -0
  654. package/src/plugin/index.ts +2 -0
  655. package/src/plugin/lifecycle.ts +286 -106
  656. package/src/plugin/resolver.ts +6 -3
  657. package/src/plugin/shell-hook.ts +21 -5
  658. package/src/probe/errors.ts +4 -1
  659. package/src/prompt/coding-agent-doctrine.ts +22 -10
  660. package/src/prompt/contributions.ts +12 -2
  661. package/src/prompt/index.ts +1 -0
  662. package/src/provider/collect-chat-completion.ts +96 -11
  663. package/src/provider/mock.ts +24 -6
  664. package/src/provider/registry.ts +4 -1
  665. package/src/provider/tool-call-framing.ts +226 -0
  666. package/src/public-runtime.ts +136 -7
  667. package/src/public-tools.ts +24 -4
  668. package/src/public-types.ts +60 -6
  669. package/src/read-model/registry.ts +7 -2
  670. package/src/registry/ManagedRegistry.ts +57 -6
  671. package/src/registry/collision.ts +64 -0
  672. package/src/registry/command/index.ts +7 -3
  673. package/src/registry/index.ts +3 -9
  674. package/src/registry/plugin/index.ts +14 -1
  675. package/src/registry/tool/callable.ts +8 -9
  676. package/src/registry/tool/execute.ts +16 -846
  677. package/src/registry/tool/portable.ts +59 -0
  678. package/src/registry/tool/presentation.ts +6 -5
  679. package/src/runtime/bidi/session.ts +24 -5
  680. package/src/runtime/query/executor/tool-call-admission.ts +228 -6
  681. package/src/runtime/query/executor.ts +110 -12
  682. package/src/runtime/query/file-evidence-replay.ts +8 -7
  683. package/src/runtime/query/fork/prepare.ts +6 -1
  684. package/src/runtime/query/guardrail-presets.ts +4 -3
  685. package/src/runtime/query/index.ts +199 -101
  686. package/src/runtime/query/iteration/index.ts +13 -3
  687. package/src/runtime/query/iteration/phases/compaction.ts +1 -1
  688. package/src/runtime/query/iteration/phases/context.ts +2 -2
  689. package/src/runtime/query/iteration/phases/tool-review.ts +59 -2
  690. package/src/runtime/query/iteration/stream-turn.ts +390 -136
  691. package/src/runtime/query/iteration/tool-input.ts +284 -0
  692. package/src/runtime/query/observation-context.ts +2 -2
  693. package/src/runtime/query/prelude-lease.ts +132 -0
  694. package/src/runtime/query/prepare-turn.ts +477 -198
  695. package/src/runtime/query/prompt-cache.ts +2 -2
  696. package/src/runtime/query/prompt.ts +4 -4
  697. package/src/runtime/query/resume-session.ts +42 -3
  698. package/src/runtime/query/review-policy.ts +87 -9
  699. package/src/runtime/query/tooling.ts +3 -6
  700. package/src/runtime/query/turn-state.ts +4 -0
  701. package/src/runtime/system-events.ts +246 -0
  702. package/src/scheduler/delegating.ts +7 -2
  703. package/src/scheduler/local.ts +2 -0
  704. package/src/session/retention/archive.ts +1 -1
  705. package/src/skills/index.ts +1 -1
  706. package/src/skills/registry.ts +25 -0
  707. package/src/store/session/disk.ts +3 -0
  708. package/src/store/session-log/conformance.ts +51 -8
  709. package/src/store/session-log/core.ts +10 -4
  710. package/src/store/session-log/fold.ts +33 -7
  711. package/src/store/session-log/index.ts +2 -0
  712. package/src/test-support/toolset.ts +23 -0
  713. package/src/tools/builtins/bash.ts +27 -10
  714. package/src/tools/builtins/browser-url.ts +1 -1
  715. package/src/tools/builtins/browser.ts +2 -2
  716. package/src/tools/builtins/computer-use.ts +21 -11
  717. package/src/tools/builtins/edit.ts +12 -2
  718. package/src/tools/builtins/json-string-hint.ts +16 -0
  719. package/src/tools/builtins/search-tools.ts +7 -20
  720. package/src/tools/builtins/write-file.ts +12 -0
  721. package/src/tools/command-shell.ts +46 -1
  722. package/src/tools/coordinator/agent.ts +6 -0
  723. package/src/tools/coordinator/ask-user-question.ts +29 -15
  724. package/src/tools/coordinator/index.ts +6 -0
  725. package/src/tools/coordinator/question-options.ts +195 -0
  726. package/src/tools/defineTool.ts +28 -0
  727. package/src/tools/memory/search.ts +4 -1
  728. package/src/tools/memory/update.ts +8 -5
  729. package/src/tools/render-nonce.ts +69 -0
  730. package/src/tools/roster.ts +84 -33
  731. package/src/tools/schedules/schedule-tool.ts +107 -14
  732. package/src/tools/schedules/types.ts +52 -6
  733. package/src/tools/trusted-read-only.ts +19 -10
  734. package/src/tools/untrusted-envelope.ts +121 -57
  735. package/src/toolsets/combine.ts +181 -0
  736. package/src/toolsets/manager.ts +996 -0
  737. package/src/toolsets/source-glob.ts +22 -0
  738. package/src/toolsets/toolset.ts +31 -0
  739. package/src/toolsets/types.ts +154 -0
  740. package/src/toolsets/wrappers.ts +191 -0
  741. package/src/types/agent/base.ts +29 -16
  742. package/src/types/agent/index.ts +1 -0
  743. package/src/types/agent/pipeline.ts +2 -0
  744. package/src/types/agent/query.ts +129 -0
  745. package/src/types/agent/reactive.ts +5 -142
  746. package/src/types/agent/router.ts +2 -0
  747. package/src/types/agent/scheduler.ts +6 -1
  748. package/src/types/agent/supervisor.ts +5 -2
  749. package/src/types/agent/task.ts +21 -1
  750. package/src/types/authorization/index.ts +12 -0
  751. package/src/types/connector/mcp.ts +46 -0
  752. package/src/types/errors/index.ts +15 -0
  753. package/src/types/hitl/index.ts +57 -0
  754. package/src/types/message/index.ts +135 -7
  755. package/src/types/plugin/index.ts +44 -21
  756. package/src/types/provider/chat.ts +5 -0
  757. package/src/types/provider/config.ts +8 -3
  758. package/src/types/provider/stream.ts +39 -0
  759. package/src/types/sandbox/index.ts +1 -1
  760. package/src/types/session/events.ts +14 -3
  761. package/src/types/session/sub-session.ts +2 -0
  762. package/src/types/tool/index.ts +154 -105
  763. package/src/types/toolset/index.ts +10 -47
  764. package/dist/registry/toolset/catalog.d.ts +0 -42
  765. package/dist/registry/toolset/catalog.d.ts.map +0 -1
  766. package/dist/registry/toolset/catalog.js +0 -234
  767. package/dist/registry/toolset/catalog.js.map +0 -1
  768. package/src/registry/toolset/catalog.ts +0 -308
@@ -1,6 +1,8 @@
1
+ import { isDeepStrictEqual } from 'node:util';
1
2
  import { drainQueuedMessages } from '../../agents/handle.js';
2
3
  import { repairToolMessageHistory, toolHistoryRepairChanged, } from '../../compaction/dangling.js';
3
- import { readFoldedHistory } from '../../manager/session/turn-recorder.js';
4
+ import { assertSessionLogAttribution } from '../../manager/session/attribution.js';
5
+ import { readEverRecordedMessages, readFoldedHistory, } from '../../manager/session/turn-recorder.js';
4
6
  import { resolveModelPricing } from '../../pricing/index.js';
5
7
  import { isCallerAbortError } from '../../provider/errors.js';
6
8
  import { withProviderFallback, } from '../../provider/fallback.js';
@@ -21,7 +23,8 @@ import { TurnContextFactory } from './context.js';
21
23
  import { EventTranslator } from './events.js';
22
24
  import { isCompactionMessage } from './iteration/phases/compaction.js';
23
25
  import { isWorkingMemoryMessage } from './iteration/phases/working-memory.js';
24
- import { awaitProjectInstructionCallback, collapseProjectInstructionSnapshots, replaceProjectInstructionSnapshot, } from './project-instructions.js';
26
+ import { PreludeSessionLease } from './prelude-lease.js';
27
+ import { awaitProjectInstructionCallback, collapseProjectInstructionSnapshots, isProjectInstructionMessage, replaceProjectInstructionSnapshot, } from './project-instructions.js';
25
28
  import { resolveMaxRequestRichContentBytes } from './request-rich-content.js';
26
29
  import { resolveSandboxTeardownTimeoutMs } from './sandbox-lifecycle.js';
27
30
  import { resolveSessionStorage } from './session-storage.js';
@@ -255,171 +258,186 @@ export async function prepareTurn(params) {
255
258
  ...(params.tokenBudgetStore ? { tokenBudgetStore: params.tokenBudgetStore } : {}),
256
259
  ...(params.workingDirectory ? { workingDirectory: params.workingDirectory } : {}),
257
260
  });
258
- const savedBudget = await savedBudgetReference(params, turnId, storage, selectedResumeState);
259
- const budget = await resolveQueryBudget(params, turnId, storage.tokenBudget, savedBudget);
260
- const log = TurnContextFactory.buildLogger({
261
- agentName: params.agentName,
262
- turnConfig,
263
- turnId,
264
- ...(params.parentSessionId ? { parentSessionId: params.parentSessionId } : {}),
265
- sessionId: params.sessionId,
266
- topicId: params.topicId,
267
- projectId: params.projectId,
268
- tenantId: params.tenantId,
269
- });
270
- // Every model call in the turn — the loop's turns, the forced-final
271
- // summary, advisory and compaction side calls — goes through this one
272
- // wrapped provider, so the retry policy cannot be bypassed by a code
273
- // path that happens to hold the raw driver.
274
- // The logger is passed on purpose: `withProviderRetry` guards every one
275
- // of its warns behind `options.log`, and this is its only production
276
- // call site — so without it the "failed, retrying" and "failed, giving
277
- // up" lines were dead code and a backoff left no trace anywhere.
278
- //
279
- // With a chain declared, the same sentence holds two levels out. The idle
280
- // watchdog is applied to each raw member, retry wraps that, and fallback
281
- // wraps the members: `fallback(retry(idle(m0)), retry(idle(m1)), …)`. The
282
- // idle layer cannot sit outside retry, because its timer would then count a
283
- // legitimate backoff as provider silence. This order is not a
284
- // preference. Assembled the other way round — which is what a host gets if
285
- // it wraps its own chain and hands the result in, because this function
286
- // would then wrap THAT in retry — an exhausted chain gets restarted from
287
- // the head by the outer loop and a throttle on the last member is counted
288
- // by two budgets. Building it here is what makes the order unspellable
289
- // wrong.
290
- const chain = [
291
- { provider: params.provider },
292
- ...(params.fallbackProviders ?? []),
293
- ];
294
- assertCostIsAttributable(chain, params.pricing);
295
- assertBudgetIsMeasurable(params);
296
- const withRecovery = (provider) => {
297
- const withIdleBound = withStreamIdleTimeout(provider, {
298
- idleTimeoutMs: streamIdleTimeoutMs,
299
- log,
261
+ // The preflight refuses an already foreign log before opening a budget or
262
+ // draining queued topic messages. Repeat after claiming the writer lease:
263
+ // another process may have opened a log that was empty at preflight time.
264
+ await assertSessionLogAttribution(storage.log, params);
265
+ const preludeLease = await PreludeSessionLease.acquire(storage.log, params.sessionId, turnId, params.lease);
266
+ let releaseOwnedLease = () => preludeLease.release();
267
+ try {
268
+ await preludeLease.assertCurrent();
269
+ await assertSessionLogAttribution(storage.log, params);
270
+ const savedBudget = await savedBudgetReference(params, turnId, storage, selectedResumeState);
271
+ const budget = await resolveQueryBudget(params, turnId, storage.tokenBudget, savedBudget);
272
+ const log = TurnContextFactory.buildLogger({
273
+ agentName: params.agentName,
274
+ turnConfig,
275
+ turnId,
276
+ ...(params.parentSessionId ? { parentSessionId: params.parentSessionId } : {}),
277
+ sessionId: params.sessionId,
278
+ topicId: params.topicId,
279
+ projectId: params.projectId,
280
+ tenantId: params.tenantId,
300
281
  });
301
- const metered = withTokenBudget(withIdleBound, budget);
302
- return params.retry === false
303
- ? metered
304
- : withProviderRetry(metered, {
305
- config: params.retry,
282
+ // Every model call in the turn — the loop's turns, the forced-final
283
+ // summary, advisory and compaction side calls — goes through this one
284
+ // wrapped provider, so the retry policy cannot be bypassed by a code
285
+ // path that happens to hold the raw driver.
286
+ // The logger is passed on purpose: `withProviderRetry` guards every one
287
+ // of its warns behind `options.log`, and this is its only production
288
+ // call site — so without it the "failed, retrying" and "failed, giving
289
+ // up" lines were dead code and a backoff left no trace anywhere.
290
+ //
291
+ // With a chain declared, the same sentence holds two levels out. The idle
292
+ // watchdog is applied to each raw member, retry wraps that, and fallback
293
+ // wraps the members: `fallback(retry(idle(m0)), retry(idle(m1)), …)`. The
294
+ // idle layer cannot sit outside retry, because its timer would then count a
295
+ // legitimate backoff as provider silence. This order is not a
296
+ // preference. Assembled the other way round — which is what a host gets if
297
+ // it wraps its own chain and hands the result in, because this function
298
+ // would then wrap THAT in retry — an exhausted chain gets restarted from
299
+ // the head by the outer loop and a throttle on the last member is counted
300
+ // by two budgets. Building it here is what makes the order unspellable
301
+ // wrong.
302
+ const chain = [
303
+ { provider: params.provider },
304
+ ...(params.fallbackProviders ?? []),
305
+ ];
306
+ assertCostIsAttributable(chain, params.pricing);
307
+ assertBudgetIsMeasurable(params);
308
+ const withRecovery = (provider) => {
309
+ const withIdleBound = withStreamIdleTimeout(provider, {
310
+ idleTimeoutMs: streamIdleTimeoutMs,
306
311
  log,
307
- canRetry: () => budget.remaining > 0,
308
312
  });
309
- };
310
- // Who is serving right now, for the turn RECORD rather than for the request.
311
- //
312
- // It starts at the head and moves only when the chain does, which is the
313
- // whole of the truth because the cursor never rewinds. The turn cannot read
314
- // this off `resilientProvider`: that wrapper reports the head's `id` on
315
- // purpose, so asking it produces the declaration back — the defect this
316
- // record exists to fix.
317
- const serving = {
318
- current: { index: 0, providerId: params.provider.id },
319
- };
320
- const resilientProvider = withProviderFallback(chain.map((member) => ({
321
- ...member,
322
- provider: withRecovery(member.provider),
323
- })), {
324
- log,
325
- canFallback: () => budget.remaining > 0,
326
- onSwap: (to) => {
327
- serving.current = to;
328
- // `ctx` is declared below and is initialized before anything can
329
- // call the provider: this fires from inside a `chatStream`, and
330
- // the first one is issued by the loop that `ctx` is built for.
331
- ctx.recorder.setServingProvider(to.providerId);
332
- },
333
- });
334
- // Asked ONCE, here, before the loop exists. Both readers are synchronous
335
- // and hot, so this can never move inside the iteration — and a driver
336
- // that rejects, or one that hangs until the turn is cancelled, must not
337
- // take down a run the table could have served perfectly well. That is
338
- // why the failure path is a swallow with a log rather than a throw: the
339
- // window is an optimisation over a working default, not a prerequisite.
340
- const providerContextWindow = await resolveProviderContextWindow(resilientProvider, turnConfig.model, params.signal, turnConfig.timeoutMs, log);
341
- const modelContextWindows = new Map();
342
- if (turnConfig.model)
343
- modelContextWindows.set(turnConfig.model, providerContextWindow);
344
- // The mode this conversation was left in, when the turn config names none.
345
- // Read once, before the loop exists, for the same reason the context
346
- // window is: the executor's resolver is synchronous and hot.
347
- //
348
- // A store that throws is not a turn failure — the turn falls back to the
349
- // config's answer, which is exactly what it did before this existed.
350
- const topicState = params.topicStateStore
351
- ? await params.topicStateStore
352
- .getState(params.topicId, params.tenantId)
353
- .catch((err) => {
354
- log.debug('Could not read the topic state; using the turn config', {
355
- 'namzu.topic.id': params.topicId,
356
- 'namzu.error.message': toErrorMessage(err),
357
- });
358
- return null;
359
- })
360
- : null;
361
- // Whatever a host left for "the next turn", taken and cleared in one
362
- // compare-and-set write. Prepended to the messages this turn starts from,
363
- // so it is in the FIRST request rather than arriving a turn late.
364
- //
365
- // Cleared as it is read: a queue read and cleared separately re-delivers
366
- // on a crash between the two, and "start with this" arriving twice is a
367
- // different instruction from the one that was left.
368
- const queuedForThisRun = params.topicStateStore
369
- ? await drainQueuedMessages(params.topicStateStore, params.topicId, params.tenantId).catch((err) => {
370
- log.debug('Could not drain the topic queue; starting without it', {
371
- 'namzu.topic.id': params.topicId,
372
- 'namzu.error.message': toErrorMessage(err),
373
- });
374
- return [];
375
- })
376
- : [];
377
- // One effective list, used everywhere the turn is seeded from. Three
378
- // branches below push from it, and computing it at each would be three
379
- // places to forget the queue.
380
- //
381
- // Stored attachments are resolved HERE, once, before the messages reach
382
- // the turn record. Resolving later — at the provider boundary — would put
383
- // refs in the durable transcript and in every checkpoint, and a turn
384
- // resumed against a store that had since forgotten a ref would fail
385
- // replaying its own history rather than at the moment somebody asked for
386
- // the bytes. Every failure refuses: a message that silently lost its
387
- // image is a model answering about a picture it never saw.
388
- const ctx = TurnContextFactory.build({
389
- budget,
390
- ...(topicState ? { topicPermissionMode: topicState.permissionMode } : {}),
391
- ...(params.permissionModeRef ? { permissionModeRef: params.permissionModeRef } : {}),
392
- agentId: params.agentId,
393
- agentName: params.agentName,
394
- turnConfig,
395
- provider: resilientProvider,
396
- workingDirectory: params.workingDirectory,
397
- pricing: params.pricing,
398
- enableActivityTracking: params.enableActivityTracking,
399
- signal: params.signal,
400
- sessionId: params.sessionId,
401
- topicId: params.topicId,
402
- projectId: params.projectId,
403
- tenantId: params.tenantId,
404
- storage,
405
- turnId,
406
- ...(params.parentSessionId ? { parentSessionId: params.parentSessionId } : {}),
407
- ...(params.parentTurnId ? { parentTurnId: params.parentTurnId } : {}),
408
- ...(params.depth !== undefined ? { depth: params.depth } : {}),
409
- log,
410
- });
411
- // The writer lease, and `session_started` on an empty log. Everything
412
- // from here to the end of the turn holds the lease, so a failure before
413
- // the turn body owns it releases it.
414
- await ctx.recorder.open({
415
- ...(params.lease ? { lease: params.lease } : {}),
416
- session: {
417
- cwd: ctx.cwd,
418
- ...(params.origin ? { origin: params.origin } : {}),
419
- ...(params.forkedFrom ? { forkedFrom: params.forkedFrom } : {}),
420
- },
421
- });
422
- try {
313
+ const metered = withTokenBudget(withIdleBound, budget);
314
+ return params.retry === false
315
+ ? metered
316
+ : withProviderRetry(metered, {
317
+ config: params.retry,
318
+ log,
319
+ canRetry: () => budget.remaining > 0,
320
+ });
321
+ };
322
+ // Who is serving right now, for the turn RECORD rather than for the request.
323
+ //
324
+ // It starts at the head and moves only when the chain does, which is the
325
+ // whole of the truth because the cursor never rewinds. The turn cannot read
326
+ // this off `resilientProvider`: that wrapper reports the head's `id` on
327
+ // purpose, so asking it produces the declaration back — the defect this
328
+ // record exists to fix.
329
+ const serving = {
330
+ current: { index: 0, providerId: params.provider.id },
331
+ };
332
+ const resilientProvider = withProviderFallback(chain.map((member) => ({
333
+ ...member,
334
+ provider: withRecovery(member.provider),
335
+ })), {
336
+ log,
337
+ canFallback: () => budget.remaining > 0,
338
+ onSwap: (to) => {
339
+ serving.current = to;
340
+ // `ctx` is declared below and is initialized before anything can
341
+ // call the provider: this fires from inside a `chatStream`, and
342
+ // the first one is issued by the loop that `ctx` is built for.
343
+ ctx.recorder.setServingProvider(to.providerId);
344
+ },
345
+ });
346
+ // Asked ONCE, here, before the loop exists. Both readers are synchronous
347
+ // and hot, so this can never move inside the iteration — and a driver
348
+ // that rejects, or one that hangs until the turn is cancelled, must not
349
+ // take down a run the table could have served perfectly well. That is
350
+ // why the failure path is a swallow with a log rather than a throw: the
351
+ // window is an optimisation over a working default, not a prerequisite.
352
+ const providerContextWindow = await resolveProviderContextWindow(resilientProvider, turnConfig.model, params.signal, turnConfig.timeoutMs, log);
353
+ const modelContextWindows = new Map();
354
+ if (turnConfig.model)
355
+ modelContextWindows.set(turnConfig.model, providerContextWindow);
356
+ // The mode this conversation was left in, when the turn config names none.
357
+ // Read once, before the loop exists, for the same reason the context
358
+ // window is: the executor's resolver is synchronous and hot.
359
+ //
360
+ // A store that throws is not a turn failure — the turn falls back to the
361
+ // config's answer, which is exactly what it did before this existed.
362
+ const topicState = params.topicStateStore
363
+ ? await params.topicStateStore
364
+ .getState(params.topicId, params.tenantId)
365
+ .catch((err) => {
366
+ log.debug('Could not read the topic state; using the turn config', {
367
+ 'namzu.topic.id': params.topicId,
368
+ 'namzu.error.message': toErrorMessage(err),
369
+ });
370
+ return null;
371
+ })
372
+ : null;
373
+ // Whatever a host left for "the next turn", taken and cleared in one
374
+ // compare-and-set write. Prepended to the messages this turn starts from,
375
+ // so it is in the FIRST request rather than arriving a turn late.
376
+ //
377
+ // Cleared as it is read: a queue read and cleared separately re-delivers
378
+ // on a crash between the two, and "start with this" arriving twice is a
379
+ // different instruction from the one that was left.
380
+ await preludeLease.assertCurrent();
381
+ const queuedForThisRun = params.topicStateStore
382
+ ? await drainQueuedMessages(params.topicStateStore, params.topicId, params.tenantId).catch((err) => {
383
+ log.debug('Could not drain the topic queue; starting without it', {
384
+ 'namzu.topic.id': params.topicId,
385
+ 'namzu.error.message': toErrorMessage(err),
386
+ });
387
+ return [];
388
+ })
389
+ : [];
390
+ // One effective list, used everywhere the turn is seeded from. Three
391
+ // branches below push from it, and computing it at each would be three
392
+ // places to forget the queue.
393
+ //
394
+ // Stored attachments are resolved HERE, once, before the messages reach
395
+ // the turn record. Resolving later — at the provider boundary — would put
396
+ // refs in the durable transcript and in every checkpoint, and a turn
397
+ // resumed against a store that had since forgotten a ref would fail
398
+ // replaying its own history rather than at the moment somebody asked for
399
+ // the bytes. Every failure refuses: a message that silently lost its
400
+ // image is a model answering about a picture it never saw.
401
+ const ctx = TurnContextFactory.build({
402
+ budget,
403
+ ...(topicState ? { topicPermissionMode: topicState.permissionMode } : {}),
404
+ ...(params.permissionModeRef ? { permissionModeRef: params.permissionModeRef } : {}),
405
+ agentId: params.agentId,
406
+ agentName: params.agentName,
407
+ turnConfig,
408
+ provider: resilientProvider,
409
+ workingDirectory: params.workingDirectory,
410
+ pricing: params.pricing,
411
+ enableActivityTracking: params.enableActivityTracking,
412
+ signal: params.signal,
413
+ sessionId: params.sessionId,
414
+ topicId: params.topicId,
415
+ projectId: params.projectId,
416
+ tenantId: params.tenantId,
417
+ storage,
418
+ turnId,
419
+ ...(params.parentSessionId ? { parentSessionId: params.parentSessionId } : {}),
420
+ ...(params.parentTurnId ? { parentTurnId: params.parentTurnId } : {}),
421
+ ...(params.depth !== undefined ? { depth: params.depth } : {}),
422
+ log,
423
+ });
424
+ // The writer lease, and `session_started` on an empty log. Everything
425
+ // from here to the end of the turn holds the lease, so a failure before
426
+ // the turn body owns it releases it.
427
+ await ctx.recorder.open({
428
+ lease: await preludeLease.transfer(),
429
+ ownLease: preludeLease.ownsLease,
430
+ session: {
431
+ cwd: ctx.cwd,
432
+ ...(params.origin ? { origin: params.origin } : {}),
433
+ ...(params.forkedFrom ? { forkedFrom: params.forkedFrom } : {}),
434
+ },
435
+ });
436
+ releaseOwnedLease = async () => {
437
+ await preludeLease.stop();
438
+ await ctx.recorder.release();
439
+ };
440
+ await preludeLease.stop();
423
441
  await assertTurnMayStart(params, turnId, storage, ctx);
424
442
  // The session log is the conversation's source of truth. A new turn starts
425
443
  // from its folded history, and `params.messages` is what this turn adds.
@@ -428,7 +446,9 @@ export async function prepareTurn(params) {
428
446
  const history = params.resumeFromCheckpoint
429
447
  ? []
430
448
  : await readFoldedHistory(storage.log);
431
- const input = withoutRecordedPrefix(params.messages, history);
449
+ const input = params.resumeFromCheckpoint
450
+ ? []
451
+ : await reconcileCallerMessages(params.messages, history, storage.log, params.continuationMode === true);
432
452
  const seeded = queuedForThisRun.length > 0 ? [...queuedForThisRun, ...input] : input;
433
453
  let resolvedInitialMessages;
434
454
  let attachmentResolutionCancelled = false;
@@ -457,8 +477,16 @@ export async function prepareTurn(params) {
457
477
  const preparationSignal = params.signal ?? new AbortController().signal;
458
478
  let snapshot;
459
479
  try {
480
+ // `ProjectInstructionCallbackContext.messages` promises "the
481
+ // messages accepted before this callback starts" — the durable
482
+ // history this turn folds from the log, not only what THIS turn
483
+ // itself is contributing. Without the fold's own project-instruction
484
+ // snapshot (from an earlier turn of the SAME session) in view, a
485
+ // host that discovers a nested scope from a tool call could never
486
+ // re-derive which files to re-read on the next turn, once the
487
+ // message that named them was reconciled away as already durable.
460
488
  const prepared = await awaitProjectInstructionCallback(preparationSignal, () => params.projectInstructionContext?.prepareInitialSnapshot?.({
461
- messages: [...resolvedInitialMessages],
489
+ messages: [...history.map((entry) => entry.message), ...resolvedInitialMessages],
462
490
  signal: preparationSignal,
463
491
  }));
464
492
  // The callback promise can settle, remove its listener, and queue this
@@ -640,7 +668,11 @@ export async function prepareTurn(params) {
640
668
  };
641
669
  }
642
670
  catch (error) {
643
- await ctx.recorder.release();
671
+ // Once open succeeds, the recorder normally releases this lease at the
672
+ // end of the turn. Preparation failures, including an open refusal,
673
+ // still belong to this prelude. A caller-supplied lease stays theirs.
674
+ if (preludeLease.ownsLease)
675
+ await releaseOwnedLease().catch(() => undefined);
644
676
  throw error;
645
677
  }
646
678
  }
@@ -650,7 +682,10 @@ export async function prepareTurn(params) {
650
682
  */
651
683
  async function savedBudgetReference(params, turnId, storage, selected) {
652
684
  if (selected?.budgetBinding) {
653
- return { binding: selected.budgetBinding, accountId: selected.budgetBinding.accountId };
685
+ return {
686
+ binding: selected.budgetBinding,
687
+ accountId: selected.budgetBinding.accountId,
688
+ };
654
689
  }
655
690
  // A selected state carries only a durable binding. An account held in
656
691
  // memory is named by the checkpoint document alone, and a resume must
@@ -699,28 +734,192 @@ function projectRecordedHistory(history, ids) {
699
734
  return projected;
700
735
  }
701
736
  /**
702
- * `messages` without the leading run of messages the session log already
703
- * holds, compared by value. A host that passes only the new input is
704
- * unaffected; one that passes the whole conversation adds only its tail.
737
+ * Deep-equal ignoring `id` and `timestamp`: two copies of one message may
738
+ * disagree only on which record named it, and `timestamp` is bookkeeping
739
+ * about when it was authored, not part of what it says — `createUserMessage`
740
+ * and its siblings always stamp `Date.now()`, but the field is optional on
741
+ * `BaseMessage`, and a host that reconstructs history itself (the
742
+ * documented stateless `exec --json` stdin contract never requires it) has
743
+ * no way to recover the original value and must not be read as having
744
+ * edited a message merely for omitting one. Each side is round-tripped
745
+ * through JSON first — "canonical" — so an `undefined`-valued own property
746
+ * (a field a driver or the recorder set explicitly, as opposed to one never
747
+ * mentioned) does not read as a difference: `isDeepStrictEqual` alone treats
748
+ * `{ x: undefined }` and `{}` as unequal, and the durable record went
749
+ * through the same round trip when it was written.
705
750
  */
706
- function withoutRecordedPrefix(messages, history) {
707
- const recorded = history.filter((entry) => entry.message.role !== 'system');
708
- let matched = 0;
709
- let r = 0;
710
- for (const message of messages) {
711
- if (message.role === 'system') {
712
- matched++;
713
- continue;
751
+ function sameMessageContent(a, b) {
752
+ const { id: _a, timestamp: _ta, ...restA } = a;
753
+ const { id: _b, timestamp: _tb, ...restB } = b;
754
+ return isDeepStrictEqual(JSON.parse(JSON.stringify(restA)), JSON.parse(JSON.stringify(restB)));
755
+ }
756
+ /** A `stale_cached_history` refusal: which way "the log disagrees" this is. */
757
+ function staleCachedHistoryError(kind, message) {
758
+ const id = message.id;
759
+ const guidance = 'pass only new messages (with no id), or re-read history from the session instead of reusing a cached copy.';
760
+ const text = kind === 'edited'
761
+ ? `A cached message carries id ${id}, but its content no longer matches what this session's log recorded under that id. A message read from history must not be edited before it is sent back: ${guidance}`
762
+ : kind === 'foreign'
763
+ ? `A cached message carries id ${id}, which this session's log never recorded. A host must not mint its own id for a message: pass only messages this session's log gave an id (unedited), or new messages with no id.`
764
+ : `A cached message with no id starts the same as this session's log, but the two diverge further in — this looks like an attempted full resend of the conversation, of a fold this log does not actually hold (edited, reordered, or from elsewhere). Nothing here can tell which of the cache's later messages, if any, are genuinely new: ${guidance}`;
765
+ return new NamzuError({
766
+ code: 'stale_cached_history',
767
+ message: text,
768
+ details: {
769
+ kind,
770
+ role: message.role,
771
+ ...(id === undefined ? {} : { messageId: id }),
772
+ },
773
+ });
774
+ }
775
+ /**
776
+ * A kind `query()` reconstructs itself every turn rather than trusting a
777
+ * caller's cached copy of it: the per-turn static/dynamic system prompt
778
+ * (`pushSystemMessages`, pushed `transient: true` and so never durably
779
+ * recorded at all — see `manager/session/turn-recorder.ts`), and a
780
+ * project-instruction snapshot (durably recorded, but `Turn.messages` keeps
781
+ * only the LATEST one per `collapseProjectInstructionSnapshots`, while the
782
+ * log keeps every turn's own). A compaction summary and a working-memory
783
+ * note are deliberately NOT here: those two are conversation STATE the
784
+ * kernel cannot re-derive, not prompt scaffolding it rebuilds.
785
+ *
786
+ * Comparing either kind positionally is meaningless — the caller's copy and
787
+ * the log's own history disagree on how many of them exist by construction,
788
+ * never because anything is stale — so both are dropped before the no-id
789
+ * alignment below ever sees them, on both the caller's side and the fold's.
790
+ */
791
+ function isKernelDerivedMessage(message) {
792
+ if (isProjectInstructionMessage(message))
793
+ return true;
794
+ if (message.role !== 'system')
795
+ return false;
796
+ const content = typeof message.content === 'string' ? message.content : null;
797
+ return !isCompactionMessage(content) && !isWorkingMemoryMessage(content);
798
+ }
799
+ function reconcileNoIdAgainstFold(caller, pool,
800
+ // A wholly no-id caller (this call's `messages` carries no id anywhere)
801
+ // gets the strict `>`: its no-id segment IS its entire request, so a
802
+ // length exactly matching the pool is indistinguishable from "one
803
+ // message that happens to repeat the fold's own last value" (an
804
+ // interrupted turn's own trailing prompt, resent as a caller's ONLY
805
+ // next message — round-3's own probe1/probe3) — favoring "new" there
806
+ // is the whole point of this rule. A caller that ALSO sent at least one
807
+ // id-carrying message this same call is not that: its no-id segment is
808
+ // part of a larger, structured resend the id path already anchors, so
809
+ // an EXACT length match is trusted as "everything, nothing new" (`>=`)
810
+ // — the shape a wholesale history replacement (a compaction, or the
811
+ // provider-rejected-image repair, which records this way for the same
812
+ // reason: `TurnRecorder.replaceMessages`) produces on its very next
813
+ // turn, before any new message has been added at all.
814
+ hasId) {
815
+ if (hasId ? caller.length >= pool.length : caller.length > pool.length) {
816
+ let fullPrefix = true;
817
+ for (let i = 0; i < pool.length; i++) {
818
+ if (!sameMessageContent(caller[i], pool[i])) {
819
+ fullPrefix = false;
820
+ break;
821
+ }
822
+ }
823
+ if (fullPrefix)
824
+ return 'trimmed';
825
+ if (pool.length > 0 && sameMessageContent(caller[0], pool[0])) {
826
+ return 'unaligned';
827
+ }
828
+ }
829
+ return 'new';
830
+ }
831
+ /**
832
+ * `messages` reconciled against this session's log, by id where a message
833
+ * carries one, and otherwise by the anchored, whole-cache rule
834
+ * {@link reconcileNoIdAgainstFold} implements — never by walking the two
835
+ * positionally message by message, and never by searching for some aligned
836
+ * position, either of which reads a genuine echo of old content and a
837
+ * coincidentally-identical new message as the same shape.
838
+ *
839
+ * A message carrying an id already durable under it (matching content) is
840
+ * dropped — the fold supplies it, from wherever compaction has since put
841
+ * it, even from before a compaction summarized it away, since the log
842
+ * remembers every id it ever gave out. One whose id the log never recorded,
843
+ * or whose content no longer matches what the log recorded under it, is
844
+ * refused outright (`stale_cached_history`, `'foreign'` / `'edited'`).
845
+ *
846
+ * A message with no id, once the kernel-derived kinds above are set aside
847
+ * from both sides, joins its OWN sequence of no-id messages (in their
848
+ * original relative order), reconciled against the fold's own remaining
849
+ * pool: every fold entry EXCEPT one whose id an id-carrying caller message
850
+ * already claimed above (so nothing is offered to both mechanisms) and a
851
+ * no-id one (a compaction summary, or a record predating per-message ids).
852
+ * A caller using no ids at all thus reconciles exactly as
853
+ * {@link reconcileNoIdAgainstFold} describes, against the whole fold,
854
+ * nothing claimed. A caller that CAN only ever id some roles — a protocol
855
+ * adapter (AG-UI) that mints an id for an assistant/tool message it
856
+ * produced but never for one its own client authored — still reconciles
857
+ * its no-id messages correctly, against whatever the id path left
858
+ * unclaimed, rather than an empty pool that would read every one of them
859
+ * as new (which is harmless here — "new" is always a safe answer — but
860
+ * would duplicate needlessly).
861
+ *
862
+ * See {@link reconcileNoIdAgainstFold} for exactly which shape is recognized
863
+ * as "my cache, trimmed to a prefix of the fold" (dropped), which is
864
+ * refused as `stale_cached_history` (`'unaligned'`) as an attempted resend
865
+ * of a fold this log does not hold, and — deliberately, the rest — which is
866
+ * never matched by value at all and so always kept as new.
867
+ */
868
+ async function reconcileCallerMessages(messages, history, log, continuationMode) {
869
+ const hasId = messages.some((message) => message.id !== undefined);
870
+ const recordedById = hasId ? await readEverRecordedMessages(log) : undefined;
871
+ // Ids a caller message already claimed by direct lookup above: a fold
872
+ // entry that gave one of THESE out must not also be offered to the no-id
873
+ // alignment below, or a message that already reconciled by id could be
874
+ // matched a second time by value. A caller need not be all-or-nothing
875
+ // about ids for this to matter — a protocol adapter (AG-UI) that can
876
+ // only ever attach an id to an assistant/tool message it itself minted,
877
+ // never to a message its OWN client authored, sends exactly this mix.
878
+ const claimedIds = new Set();
879
+ const noIdIndices = [];
880
+ const noIdMessages = [];
881
+ for (let index = 0; index < messages.length; index++) {
882
+ const message = messages[index];
883
+ const id = message.id;
884
+ if (id !== undefined) {
885
+ const recorded = recordedById?.get(id);
886
+ if (recorded === undefined)
887
+ throw staleCachedHistoryError('foreign', message);
888
+ if (!sameMessageContent(recorded, message))
889
+ throw staleCachedHistoryError('edited', message);
890
+ claimedIds.add(id);
891
+ continue; // already durable: the fold supplies it
714
892
  }
715
- const next = recorded[r];
716
- if (!next || JSON.stringify(next.message) !== JSON.stringify(message))
717
- break;
718
- r++;
719
- matched++;
893
+ // Outside `continuationMode`, the kernel rebuilds the system floor and
894
+ // collapses every project-instruction snapshot but the latest
895
+ // (`pushSystemMessages`, `collapseProjectInstructionSnapshots`
896
+ // downstream of this function) regardless of what a caller sent, so a
897
+ // no-id message of either kind is dropped here rather than offered to
898
+ // the alignment below, where the fold's OWN asymmetric copies of them
899
+ // (one durable record per turn that had one, never collapsed) would
900
+ // corrupt it. `continuationMode` turns that rebuilding OFF — the
901
+ // caller's array IS the request, verbatim — so there is no "the
902
+ // kernel discards this anyway" to lean on; a message of either kind
903
+ // is ordinary content there; unforced-through, it would just report
904
+ // a passthrough-only conversation as no-id forever - a genuinely new
905
+ // no-id system message (a `continuationMode` caller's own) has to
906
+ // reconcile like anything else, not vanish.
907
+ if (!continuationMode && isKernelDerivedMessage(message))
908
+ continue;
909
+ noIdIndices.push(index);
910
+ noIdMessages.push(message);
911
+ }
912
+ const pool = history
913
+ .filter((entry) => entry.messageId === undefined || !claimedIds.has(entry.messageId))
914
+ .map((entry) => entry.message)
915
+ .filter((message) => continuationMode || !isKernelDerivedMessage(message));
916
+ const reconciliation = reconcileNoIdAgainstFold(noIdMessages, pool, hasId);
917
+ if (reconciliation === 'unaligned') {
918
+ throw staleCachedHistoryError('unaligned', noIdMessages[0]);
720
919
  }
721
- if (r === 0)
722
- return [...messages];
723
- return messages.slice(matched);
920
+ const keptNoIdIndices = reconciliation === 'trimmed' ? noIdIndices.slice(pool.length) : noIdIndices;
921
+ const newIndices = new Set(keptNoIdIndices);
922
+ return messages.filter((_message, index) => newIndices.has(index));
724
923
  }
725
924
  /**
726
925
  * A new turn named by the host must not reuse the id of a turn the session