@namzu/sdk 49.0.0 → 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 (737) hide show
  1. package/CHANGELOG.md +507 -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/runtime.d.ts +31 -31
  32. package/dist/connector/mcp/adapter.d.ts.map +1 -1
  33. package/dist/connector/mcp/adapter.js +11 -4
  34. package/dist/connector/mcp/adapter.js.map +1 -1
  35. package/dist/connector/mcp/client.d.ts.map +1 -1
  36. package/dist/connector/mcp/client.js +6 -3
  37. package/dist/connector/mcp/client.js.map +1 -1
  38. package/dist/constants/acp/index.d.ts +3 -0
  39. package/dist/constants/acp/index.d.ts.map +1 -1
  40. package/dist/constants/acp/index.js +3 -0
  41. package/dist/constants/acp/index.js.map +1 -1
  42. package/dist/contracts/a2a.d.ts +80 -80
  43. package/dist/contracts/schemas.d.ts +2 -2
  44. package/dist/contracts/session/schemas.d.ts +10 -10
  45. package/dist/manager/agent/lifecycle.d.ts +11 -0
  46. package/dist/manager/agent/lifecycle.d.ts.map +1 -1
  47. package/dist/manager/agent/lifecycle.js +178 -3
  48. package/dist/manager/agent/lifecycle.js.map +1 -1
  49. package/dist/manager/plan/lifecycle.d.ts +7 -8
  50. package/dist/manager/plan/lifecycle.d.ts.map +1 -1
  51. package/dist/manager/plan/lifecycle.js +7 -8
  52. package/dist/manager/plan/lifecycle.js.map +1 -1
  53. package/dist/manager/resident/consumption.d.ts +8 -8
  54. package/dist/manager/resident/learning-cycle.d.ts +2 -2
  55. package/dist/manager/resident/learning-observation.d.ts +12 -12
  56. package/dist/manager/resident/learning.d.ts +82 -82
  57. package/dist/manager/resident/outbox.d.ts +8 -8
  58. package/dist/manager/resident/proposal.d.ts +2 -2
  59. package/dist/manager/resident/store.d.ts +10 -10
  60. package/dist/manager/session/attribution.d.ts +1 -0
  61. package/dist/manager/session/attribution.d.ts.map +1 -1
  62. package/dist/manager/session/attribution.js +9 -1
  63. package/dist/manager/session/attribution.js.map +1 -1
  64. package/dist/manager/session/streamed-message-identity.d.ts +6 -0
  65. package/dist/manager/session/streamed-message-identity.d.ts.map +1 -0
  66. package/dist/manager/session/streamed-message-identity.js +14 -0
  67. package/dist/manager/session/streamed-message-identity.js.map +1 -0
  68. package/dist/manager/session/turn-recorder.d.ts.map +1 -1
  69. package/dist/manager/session/turn-recorder.js +4 -3
  70. package/dist/manager/session/turn-recorder.js.map +1 -1
  71. package/dist/pals/activity/causality.d.ts +23 -0
  72. package/dist/pals/activity/causality.d.ts.map +1 -0
  73. package/dist/pals/activity/causality.js +205 -0
  74. package/dist/pals/activity/causality.js.map +1 -0
  75. package/dist/pals/activity/projection.d.ts +5 -0
  76. package/dist/pals/activity/projection.d.ts.map +1 -0
  77. package/dist/pals/activity/projection.js +79 -0
  78. package/dist/pals/activity/projection.js.map +1 -0
  79. package/dist/pals/activity/source.d.ts +16 -0
  80. package/dist/pals/activity/source.d.ts.map +1 -0
  81. package/dist/pals/activity/source.js +235 -0
  82. package/dist/pals/activity/source.js.map +1 -0
  83. package/dist/pals/activity/subscription-policy.d.ts +38 -0
  84. package/dist/pals/activity/subscription-policy.d.ts.map +1 -0
  85. package/dist/pals/activity/subscription-policy.js +183 -0
  86. package/dist/pals/activity/subscription-policy.js.map +1 -0
  87. package/dist/pals/activity/subscription-schema.d.ts +353 -0
  88. package/dist/pals/activity/subscription-schema.d.ts.map +1 -0
  89. package/dist/pals/activity/subscription-schema.js +24 -0
  90. package/dist/pals/activity/subscription-schema.js.map +1 -0
  91. package/dist/pals/activity/subscription-store.d.ts +25 -0
  92. package/dist/pals/activity/subscription-store.d.ts.map +1 -0
  93. package/dist/pals/activity/subscription-store.js +152 -0
  94. package/dist/pals/activity/subscription-store.js.map +1 -0
  95. package/dist/pals/activity/subscription-types.d.ts +42 -0
  96. package/dist/pals/activity/subscription-types.d.ts.map +1 -0
  97. package/dist/pals/activity/subscription-types.js +2 -0
  98. package/dist/pals/activity/subscription-types.js.map +1 -0
  99. package/dist/pals/activity/subscriptions.d.ts +32 -0
  100. package/dist/pals/activity/subscriptions.d.ts.map +1 -0
  101. package/dist/pals/activity/subscriptions.js +151 -0
  102. package/dist/pals/activity/subscriptions.js.map +1 -0
  103. package/dist/pals/activity/types.d.ts +77 -0
  104. package/dist/pals/activity/types.d.ts.map +1 -0
  105. package/dist/pals/activity/types.js +2 -0
  106. package/dist/pals/activity/types.js.map +1 -0
  107. package/dist/pals/channels/ingress.d.ts +9 -0
  108. package/dist/pals/channels/ingress.d.ts.map +1 -0
  109. package/dist/pals/channels/ingress.js +131 -0
  110. package/dist/pals/channels/ingress.js.map +1 -0
  111. package/dist/pals/channels/routes.d.ts +20 -0
  112. package/dist/pals/channels/routes.d.ts.map +1 -0
  113. package/dist/pals/channels/routes.js +111 -0
  114. package/dist/pals/channels/routes.js.map +1 -0
  115. package/dist/pals/channels/routing.d.ts +37 -0
  116. package/dist/pals/channels/routing.d.ts.map +1 -0
  117. package/dist/pals/channels/routing.js +150 -0
  118. package/dist/pals/channels/routing.js.map +1 -0
  119. package/dist/pals/channels/schema.d.ts +234 -0
  120. package/dist/pals/channels/schema.d.ts.map +1 -0
  121. package/dist/pals/channels/schema.js +94 -0
  122. package/dist/pals/channels/schema.js.map +1 -0
  123. package/dist/pals/channels/types.d.ts +115 -0
  124. package/dist/pals/channels/types.d.ts.map +1 -0
  125. package/dist/pals/channels/types.js +2 -0
  126. package/dist/pals/channels/types.js.map +1 -0
  127. package/dist/pals/communication/broker.d.ts +8 -0
  128. package/dist/pals/communication/broker.d.ts.map +1 -0
  129. package/dist/pals/communication/broker.js +121 -0
  130. package/dist/pals/communication/broker.js.map +1 -0
  131. package/dist/pals/communication/dispatch.d.ts +4 -0
  132. package/dist/pals/communication/dispatch.d.ts.map +1 -0
  133. package/dist/pals/communication/dispatch.js +57 -0
  134. package/dist/pals/communication/dispatch.js.map +1 -0
  135. package/dist/pals/communication/inbound.d.ts +9 -0
  136. package/dist/pals/communication/inbound.d.ts.map +1 -0
  137. package/dist/pals/communication/inbound.js +155 -0
  138. package/dist/pals/communication/inbound.js.map +1 -0
  139. package/dist/pals/communication/ingress-dispatch.d.ts +5 -0
  140. package/dist/pals/communication/ingress-dispatch.d.ts.map +1 -0
  141. package/dist/pals/communication/ingress-dispatch.js +51 -0
  142. package/dist/pals/communication/ingress-dispatch.js.map +1 -0
  143. package/dist/pals/communication/ingress-inbound.d.ts +9 -0
  144. package/dist/pals/communication/ingress-inbound.d.ts.map +1 -0
  145. package/dist/pals/communication/ingress-inbound.js +222 -0
  146. package/dist/pals/communication/ingress-inbound.js.map +1 -0
  147. package/dist/pals/communication/ingress-schema.d.ts +7829 -0
  148. package/dist/pals/communication/ingress-schema.d.ts.map +1 -0
  149. package/dist/pals/communication/ingress-schema.js +479 -0
  150. package/dist/pals/communication/ingress-schema.js.map +1 -0
  151. package/dist/pals/communication/ingress-types.d.ts +187 -0
  152. package/dist/pals/communication/ingress-types.d.ts.map +1 -0
  153. package/dist/pals/communication/ingress-types.js +73 -0
  154. package/dist/pals/communication/ingress-types.js.map +1 -0
  155. package/dist/pals/communication/operator.d.ts +75 -0
  156. package/dist/pals/communication/operator.d.ts.map +1 -0
  157. package/dist/pals/communication/operator.js +217 -0
  158. package/dist/pals/communication/operator.js.map +1 -0
  159. package/dist/pals/communication/policy.d.ts +41 -0
  160. package/dist/pals/communication/policy.d.ts.map +1 -0
  161. package/dist/pals/communication/policy.js +138 -0
  162. package/dist/pals/communication/policy.js.map +1 -0
  163. package/dist/pals/communication/schema.d.ts +2000 -0
  164. package/dist/pals/communication/schema.d.ts.map +1 -0
  165. package/dist/pals/communication/schema.js +170 -0
  166. package/dist/pals/communication/schema.js.map +1 -0
  167. package/dist/pals/communication/store.d.ts +61 -0
  168. package/dist/pals/communication/store.d.ts.map +1 -0
  169. package/dist/pals/communication/store.js +450 -0
  170. package/dist/pals/communication/store.js.map +1 -0
  171. package/dist/pals/communication/tools.d.ts +23 -0
  172. package/dist/pals/communication/tools.d.ts.map +1 -0
  173. package/dist/pals/communication/tools.js +107 -0
  174. package/dist/pals/communication/tools.js.map +1 -0
  175. package/dist/pals/communication/types.d.ts +168 -0
  176. package/dist/pals/communication/types.d.ts.map +1 -0
  177. package/dist/pals/communication/types.js +24 -0
  178. package/dist/pals/communication/types.js.map +1 -0
  179. package/dist/pals/communication/verify.d.ts +22 -0
  180. package/dist/pals/communication/verify.d.ts.map +1 -0
  181. package/dist/pals/communication/verify.js +142 -0
  182. package/dist/pals/communication/verify.js.map +1 -0
  183. package/dist/pals/lifecycle.d.ts +37 -0
  184. package/dist/pals/lifecycle.d.ts.map +1 -0
  185. package/dist/pals/lifecycle.js +22 -0
  186. package/dist/pals/lifecycle.js.map +1 -0
  187. package/dist/pals/prompt.d.ts +30 -0
  188. package/dist/pals/prompt.d.ts.map +1 -0
  189. package/dist/pals/prompt.js +65 -0
  190. package/dist/pals/prompt.js.map +1 -0
  191. package/dist/pals/reference-images.d.ts +44 -0
  192. package/dist/pals/reference-images.d.ts.map +1 -0
  193. package/dist/pals/reference-images.js +248 -0
  194. package/dist/pals/reference-images.js.map +1 -0
  195. package/dist/pals/runtime.d.ts +46 -0
  196. package/dist/pals/runtime.d.ts.map +1 -0
  197. package/dist/pals/runtime.js +624 -0
  198. package/dist/pals/runtime.js.map +1 -0
  199. package/dist/pals/store.d.ts +26 -0
  200. package/dist/pals/store.d.ts.map +1 -0
  201. package/dist/pals/store.js +334 -0
  202. package/dist/pals/store.js.map +1 -0
  203. package/dist/pals/types.d.ts +145 -0
  204. package/dist/pals/types.d.ts.map +1 -0
  205. package/dist/pals/types.js +2 -0
  206. package/dist/pals/types.js.map +1 -0
  207. package/dist/peers/envelope.js +1 -1
  208. package/dist/peers/envelope.js.map +1 -1
  209. package/dist/peers/protocol.d.ts +83 -83
  210. package/dist/peers/record.d.ts +10 -10
  211. package/dist/plugin/shell-hook.d.ts.map +1 -1
  212. package/dist/plugin/shell-hook.js +7 -2
  213. package/dist/plugin/shell-hook.js.map +1 -1
  214. package/dist/process/kill-tree.d.ts.map +1 -1
  215. package/dist/process/kill-tree.js +9 -1
  216. package/dist/process/kill-tree.js.map +1 -1
  217. package/dist/provider/errors.d.ts +19 -0
  218. package/dist/provider/errors.d.ts.map +1 -1
  219. package/dist/provider/errors.js +123 -2
  220. package/dist/provider/errors.js.map +1 -1
  221. package/dist/public-runtime.d.ts +41 -13
  222. package/dist/public-runtime.d.ts.map +1 -1
  223. package/dist/public-runtime.js +35 -7
  224. package/dist/public-runtime.js.map +1 -1
  225. package/dist/public-tools.d.ts +8 -3
  226. package/dist/public-tools.d.ts.map +1 -1
  227. package/dist/public-tools.js +8 -3
  228. package/dist/public-tools.js.map +1 -1
  229. package/dist/public-types.d.ts +27 -7
  230. package/dist/public-types.d.ts.map +1 -1
  231. package/dist/registry/tool/presentation.d.ts +1 -0
  232. package/dist/registry/tool/presentation.d.ts.map +1 -1
  233. package/dist/registry/tool/presentation.js +9 -7
  234. package/dist/registry/tool/presentation.js.map +1 -1
  235. package/dist/runtime/harness-session/index.d.ts +5 -0
  236. package/dist/runtime/harness-session/index.d.ts.map +1 -0
  237. package/dist/runtime/harness-session/index.js +928 -0
  238. package/dist/runtime/harness-session/index.js.map +1 -0
  239. package/dist/runtime/harness-session/journal.d.ts +37 -0
  240. package/dist/runtime/harness-session/journal.d.ts.map +1 -0
  241. package/dist/runtime/harness-session/journal.js +177 -0
  242. package/dist/runtime/harness-session/journal.js.map +1 -0
  243. package/dist/runtime/harness-session/saved-view.d.ts +8 -0
  244. package/dist/runtime/harness-session/saved-view.d.ts.map +1 -0
  245. package/dist/runtime/harness-session/saved-view.js +112 -0
  246. package/dist/runtime/harness-session/saved-view.js.map +1 -0
  247. package/dist/runtime/jobs/awaited-jobs.d.ts +2 -1
  248. package/dist/runtime/jobs/awaited-jobs.d.ts.map +1 -1
  249. package/dist/runtime/jobs/awaited-jobs.js +2 -1
  250. package/dist/runtime/jobs/awaited-jobs.js.map +1 -1
  251. package/dist/runtime/jobs/registry.d.ts +56 -1
  252. package/dist/runtime/jobs/registry.d.ts.map +1 -1
  253. package/dist/runtime/jobs/registry.js +351 -34
  254. package/dist/runtime/jobs/registry.js.map +1 -1
  255. package/dist/runtime/query/abandon-turn.d.ts +12 -1
  256. package/dist/runtime/query/abandon-turn.d.ts.map +1 -1
  257. package/dist/runtime/query/abandon-turn.js +3 -1
  258. package/dist/runtime/query/abandon-turn.js.map +1 -1
  259. package/dist/runtime/query/checkpoint.d.ts +4 -0
  260. package/dist/runtime/query/checkpoint.d.ts.map +1 -1
  261. package/dist/runtime/query/checkpoint.js +10 -0
  262. package/dist/runtime/query/checkpoint.js.map +1 -1
  263. package/dist/runtime/query/durable-inbound.d.ts +5 -0
  264. package/dist/runtime/query/durable-inbound.d.ts.map +1 -0
  265. package/dist/runtime/query/durable-inbound.js +89 -0
  266. package/dist/runtime/query/durable-inbound.js.map +1 -0
  267. package/dist/runtime/query/events.d.ts +4 -0
  268. package/dist/runtime/query/events.d.ts.map +1 -1
  269. package/dist/runtime/query/events.js +22 -5
  270. package/dist/runtime/query/events.js.map +1 -1
  271. package/dist/runtime/query/executor/tool-call-admission.d.ts +5 -1
  272. package/dist/runtime/query/executor/tool-call-admission.d.ts.map +1 -1
  273. package/dist/runtime/query/executor/tool-call-admission.js +85 -13
  274. package/dist/runtime/query/executor/tool-call-admission.js.map +1 -1
  275. package/dist/runtime/query/executor.d.ts +41 -18
  276. package/dist/runtime/query/executor.d.ts.map +1 -1
  277. package/dist/runtime/query/executor.js +227 -114
  278. package/dist/runtime/query/executor.js.map +1 -1
  279. package/dist/runtime/query/index.d.ts +3 -0
  280. package/dist/runtime/query/index.d.ts.map +1 -1
  281. package/dist/runtime/query/index.js +21 -4
  282. package/dist/runtime/query/index.js.map +1 -1
  283. package/dist/runtime/query/iteration/index.d.ts +18 -6
  284. package/dist/runtime/query/iteration/index.d.ts.map +1 -1
  285. package/dist/runtime/query/iteration/index.js +144 -67
  286. package/dist/runtime/query/iteration/index.js.map +1 -1
  287. package/dist/runtime/query/iteration/outstanding-work.d.ts +9 -5
  288. package/dist/runtime/query/iteration/outstanding-work.d.ts.map +1 -1
  289. package/dist/runtime/query/iteration/outstanding-work.js +61 -6
  290. package/dist/runtime/query/iteration/outstanding-work.js.map +1 -1
  291. package/dist/runtime/query/iteration/phases/context.d.ts +4 -0
  292. package/dist/runtime/query/iteration/phases/context.d.ts.map +1 -1
  293. package/dist/runtime/query/iteration/phases/context.js.map +1 -1
  294. package/dist/runtime/query/iteration/phases/tool-review.d.ts.map +1 -1
  295. package/dist/runtime/query/iteration/phases/tool-review.js +99 -16
  296. package/dist/runtime/query/iteration/phases/tool-review.js.map +1 -1
  297. package/dist/runtime/query/observation-context.d.ts +2 -2
  298. package/dist/runtime/query/observation-context.d.ts.map +1 -1
  299. package/dist/runtime/query/observation-context.js +20 -13
  300. package/dist/runtime/query/observation-context.js.map +1 -1
  301. package/dist/runtime/query/prepare-turn.js +2 -2
  302. package/dist/runtime/query/prepare-turn.js.map +1 -1
  303. package/dist/runtime/query/prompt-cache.d.ts +1 -0
  304. package/dist/runtime/query/prompt-cache.d.ts.map +1 -1
  305. package/dist/runtime/query/prompt-cache.js +2 -0
  306. package/dist/runtime/query/prompt-cache.js.map +1 -1
  307. package/dist/runtime/query/prompt.d.ts +2 -0
  308. package/dist/runtime/query/prompt.d.ts.map +1 -1
  309. package/dist/runtime/query/prompt.js +23 -1
  310. package/dist/runtime/query/prompt.js.map +1 -1
  311. package/dist/runtime/query/repeat-call.d.ts +12 -3
  312. package/dist/runtime/query/repeat-call.d.ts.map +1 -1
  313. package/dist/runtime/query/repeat-call.js +33 -10
  314. package/dist/runtime/query/repeat-call.js.map +1 -1
  315. package/dist/runtime/query/resume-pending.d.ts +5 -6
  316. package/dist/runtime/query/resume-pending.d.ts.map +1 -1
  317. package/dist/runtime/query/resume-pending.js +30 -3
  318. package/dist/runtime/query/resume-pending.js.map +1 -1
  319. package/dist/runtime/query/resume-session.js +1 -1
  320. package/dist/runtime/query/resume-session.js.map +1 -1
  321. package/dist/runtime/query/review-policy.d.ts +8 -1
  322. package/dist/runtime/query/review-policy.d.ts.map +1 -1
  323. package/dist/runtime/query/review-policy.js +6 -0
  324. package/dist/runtime/query/review-policy.js.map +1 -1
  325. package/dist/runtime/query/saved-presentation.d.ts +13 -0
  326. package/dist/runtime/query/saved-presentation.d.ts.map +1 -0
  327. package/dist/runtime/query/saved-presentation.js +63 -0
  328. package/dist/runtime/query/saved-presentation.js.map +1 -0
  329. package/dist/runtime/query/steering.d.ts +6 -9
  330. package/dist/runtime/query/steering.d.ts.map +1 -1
  331. package/dist/runtime/query/steering.js.map +1 -1
  332. package/dist/runtime/query/tool-executions.d.ts +7 -3
  333. package/dist/runtime/query/tool-executions.d.ts.map +1 -1
  334. package/dist/runtime/query/tool-executions.js +89 -9
  335. package/dist/runtime/query/tool-executions.js.map +1 -1
  336. package/dist/runtime/query/tooling.d.ts +3 -1
  337. package/dist/runtime/query/tooling.d.ts.map +1 -1
  338. package/dist/runtime/query/tooling.js +3 -0
  339. package/dist/runtime/query/tooling.js.map +1 -1
  340. package/dist/scheduler/completion-inbox.d.ts +25 -1
  341. package/dist/scheduler/completion-inbox.d.ts.map +1 -1
  342. package/dist/scheduler/completion-inbox.js +102 -8
  343. package/dist/scheduler/completion-inbox.js.map +1 -1
  344. package/dist/scheduler/delegating.d.ts.map +1 -1
  345. package/dist/scheduler/delegating.js +5 -0
  346. package/dist/scheduler/delegating.js.map +1 -1
  347. package/dist/scheduler/local.d.ts.map +1 -1
  348. package/dist/scheduler/local.js +2 -0
  349. package/dist/scheduler/local.js.map +1 -1
  350. package/dist/session/summary/materialize.d.ts +10 -6
  351. package/dist/session/summary/materialize.d.ts.map +1 -1
  352. package/dist/session/summary/materialize.js +41 -8
  353. package/dist/session/summary/materialize.js.map +1 -1
  354. package/dist/store/budget/ledger.d.ts +9 -0
  355. package/dist/store/budget/ledger.d.ts.map +1 -1
  356. package/dist/store/budget/ledger.js +58 -6
  357. package/dist/store/budget/ledger.js.map +1 -1
  358. package/dist/store/evidence/index-page.d.ts +12 -12
  359. package/dist/store/evidence/source-text.d.ts +4 -4
  360. package/dist/store/session/disk.d.ts +9 -4
  361. package/dist/store/session/disk.d.ts.map +1 -1
  362. package/dist/store/session/disk.js +57 -11
  363. package/dist/store/session/disk.js.map +1 -1
  364. package/dist/store/session/memory.d.ts +5 -3
  365. package/dist/store/session/memory.d.ts.map +1 -1
  366. package/dist/store/session/memory.js +24 -7
  367. package/dist/store/session/memory.js.map +1 -1
  368. package/dist/store/session-log/core.d.ts +26 -6
  369. package/dist/store/session-log/core.d.ts.map +1 -1
  370. package/dist/store/session-log/core.js +61 -8
  371. package/dist/store/session-log/core.js.map +1 -1
  372. package/dist/store/session-log/disk.d.ts +2 -2
  373. package/dist/store/session-log/disk.d.ts.map +1 -1
  374. package/dist/store/session-log/disk.js +1 -0
  375. package/dist/store/session-log/disk.js.map +1 -1
  376. package/dist/store/session-log/fold.d.ts +7 -0
  377. package/dist/store/session-log/fold.d.ts.map +1 -1
  378. package/dist/store/session-log/fold.js +21 -0
  379. package/dist/store/session-log/fold.js.map +1 -1
  380. package/dist/store/session-log/index.d.ts +5 -3
  381. package/dist/store/session-log/index.d.ts.map +1 -1
  382. package/dist/store/session-log/index.js +3 -1
  383. package/dist/store/session-log/index.js.map +1 -1
  384. package/dist/store/session-log/memory.d.ts +1 -1
  385. package/dist/store/session-log/memory.d.ts.map +1 -1
  386. package/dist/store/session-log/memory.js +1 -0
  387. package/dist/store/session-log/memory.js.map +1 -1
  388. package/dist/store/session-log/spill.d.ts +10 -3
  389. package/dist/store/session-log/spill.d.ts.map +1 -1
  390. package/dist/store/session-log/spill.js +70 -5
  391. package/dist/store/session-log/spill.js.map +1 -1
  392. package/dist/store/session-log/structured-result.d.ts +21 -0
  393. package/dist/store/session-log/structured-result.d.ts.map +1 -0
  394. package/dist/store/session-log/structured-result.js +67 -0
  395. package/dist/store/session-log/structured-result.js.map +1 -0
  396. package/dist/store/task/disk.d.ts +11 -0
  397. package/dist/store/task/disk.d.ts.map +1 -1
  398. package/dist/store/task/disk.js +41 -2
  399. package/dist/store/task/disk.js.map +1 -1
  400. package/dist/store/task/memory.d.ts.map +1 -1
  401. package/dist/store/task/memory.js +15 -3
  402. package/dist/store/task/memory.js.map +1 -1
  403. package/dist/tools/admit-facts.d.ts +13 -0
  404. package/dist/tools/admit-facts.d.ts.map +1 -0
  405. package/dist/tools/admit-facts.js +142 -0
  406. package/dist/tools/admit-facts.js.map +1 -0
  407. package/dist/tools/builtins/bash.d.ts +4 -1
  408. package/dist/tools/builtins/bash.d.ts.map +1 -1
  409. package/dist/tools/builtins/bash.js +108 -22
  410. package/dist/tools/builtins/bash.js.map +1 -1
  411. package/dist/tools/builtins/browser.d.ts +10 -10
  412. package/dist/tools/builtins/computer-use.d.ts +90 -90
  413. package/dist/tools/builtins/edit.d.ts +17 -0
  414. package/dist/tools/builtins/edit.d.ts.map +1 -1
  415. package/dist/tools/builtins/edit.js +34 -0
  416. package/dist/tools/builtins/edit.js.map +1 -1
  417. package/dist/tools/builtins/file-write-result.d.ts.map +1 -1
  418. package/dist/tools/builtins/file-write-result.js +13 -0
  419. package/dist/tools/builtins/file-write-result.js.map +1 -1
  420. package/dist/tools/builtins/glob.d.ts.map +1 -1
  421. package/dist/tools/builtins/glob.js +12 -0
  422. package/dist/tools/builtins/glob.js.map +1 -1
  423. package/dist/tools/builtins/grep.d.ts.map +1 -1
  424. package/dist/tools/builtins/grep.js +14 -0
  425. package/dist/tools/builtins/grep.js.map +1 -1
  426. package/dist/tools/builtins/index.d.ts +2 -0
  427. package/dist/tools/builtins/index.d.ts.map +1 -1
  428. package/dist/tools/builtins/index.js +1 -0
  429. package/dist/tools/builtins/index.js.map +1 -1
  430. package/dist/tools/builtins/job.d.ts.map +1 -1
  431. package/dist/tools/builtins/job.js +4 -1
  432. package/dist/tools/builtins/job.js.map +1 -1
  433. package/dist/tools/builtins/lsp.d.ts +2 -2
  434. package/dist/tools/builtins/read-file.d.ts.map +1 -1
  435. package/dist/tools/builtins/read-file.js +49 -0
  436. package/dist/tools/builtins/read-file.js.map +1 -1
  437. package/dist/tools/builtins/view-image.d.ts +24 -0
  438. package/dist/tools/builtins/view-image.d.ts.map +1 -0
  439. package/dist/tools/builtins/view-image.js +385 -0
  440. package/dist/tools/builtins/view-image.js.map +1 -0
  441. package/dist/tools/builtins/wait-for-job-bounds.d.ts +2 -0
  442. package/dist/tools/builtins/wait-for-job-bounds.d.ts.map +1 -1
  443. package/dist/tools/builtins/wait-for-job-bounds.js +1 -0
  444. package/dist/tools/builtins/wait-for-job-bounds.js.map +1 -1
  445. package/dist/tools/builtins/wait-for-job.d.ts +2 -0
  446. package/dist/tools/builtins/wait-for-job.d.ts.map +1 -1
  447. package/dist/tools/builtins/wait-for-job.js +104 -6
  448. package/dist/tools/builtins/wait-for-job.js.map +1 -1
  449. package/dist/tools/builtins/write-file.d.ts.map +1 -1
  450. package/dist/tools/builtins/write-file.js +1 -0
  451. package/dist/tools/builtins/write-file.js.map +1 -1
  452. package/dist/tools/command-shell.d.ts +37 -2
  453. package/dist/tools/command-shell.d.ts.map +1 -1
  454. package/dist/tools/command-shell.js +100 -3
  455. package/dist/tools/command-shell.js.map +1 -1
  456. package/dist/tools/coordinator/agent.d.ts +9 -19
  457. package/dist/tools/coordinator/agent.d.ts.map +1 -1
  458. package/dist/tools/coordinator/agent.js.map +1 -1
  459. package/dist/tools/coordinator/index.d.ts.map +1 -1
  460. package/dist/tools/coordinator/index.js +127 -67
  461. package/dist/tools/coordinator/index.js.map +1 -1
  462. package/dist/tools/coordinator/wait-with-idle-bound.d.ts +2 -0
  463. package/dist/tools/coordinator/wait-with-idle-bound.d.ts.map +1 -1
  464. package/dist/tools/coordinator/wait-with-idle-bound.js +1 -1
  465. package/dist/tools/coordinator/wait-with-idle-bound.js.map +1 -1
  466. package/dist/tools/defineTool.d.ts.map +1 -1
  467. package/dist/tools/defineTool.js +4 -0
  468. package/dist/tools/defineTool.js.map +1 -1
  469. package/dist/tools/failure-facts.d.ts +8 -0
  470. package/dist/tools/failure-facts.d.ts.map +1 -0
  471. package/dist/tools/failure-facts.js +24 -0
  472. package/dist/tools/failure-facts.js.map +1 -0
  473. package/dist/tools/host-output.d.ts +24 -0
  474. package/dist/tools/host-output.d.ts.map +1 -0
  475. package/dist/tools/host-output.js +117 -0
  476. package/dist/tools/host-output.js.map +1 -0
  477. package/dist/tools/oem-code-pages.d.ts +8 -0
  478. package/dist/tools/oem-code-pages.d.ts.map +1 -0
  479. package/dist/tools/oem-code-pages.js +23 -0
  480. package/dist/tools/oem-code-pages.js.map +1 -0
  481. package/dist/tools/schedules/schedule-tool.d.ts.map +1 -1
  482. package/dist/tools/schedules/schedule-tool.js +35 -6
  483. package/dist/tools/schedules/schedule-tool.js.map +1 -1
  484. package/dist/tools/schedules/types.d.ts +23 -3
  485. package/dist/tools/schedules/types.d.ts.map +1 -1
  486. package/dist/tools/task/list.d.ts.map +1 -1
  487. package/dist/tools/task/list.js +14 -6
  488. package/dist/tools/task/list.js.map +1 -1
  489. package/dist/tools/task/present.d.ts.map +1 -1
  490. package/dist/tools/task/present.js +26 -6
  491. package/dist/tools/task/present.js.map +1 -1
  492. package/dist/tools/task/update.d.ts.map +1 -1
  493. package/dist/tools/task/update.js +12 -5
  494. package/dist/tools/task/update.js.map +1 -1
  495. package/dist/tools/text-window.d.ts +19 -0
  496. package/dist/tools/text-window.d.ts.map +1 -0
  497. package/dist/tools/text-window.js +83 -0
  498. package/dist/tools/text-window.js.map +1 -0
  499. package/dist/toolsets/manager.d.ts +11 -0
  500. package/dist/toolsets/manager.d.ts.map +1 -1
  501. package/dist/toolsets/manager.js +45 -1
  502. package/dist/toolsets/manager.js.map +1 -1
  503. package/dist/types/acp/index.d.ts +137 -1
  504. package/dist/types/acp/index.d.ts.map +1 -1
  505. package/dist/types/agent/base.d.ts +3 -0
  506. package/dist/types/agent/base.d.ts.map +1 -1
  507. package/dist/types/agent/manager.d.ts +8 -23
  508. package/dist/types/agent/manager.d.ts.map +1 -1
  509. package/dist/types/agent/scheduler.d.ts +10 -1
  510. package/dist/types/agent/scheduler.d.ts.map +1 -1
  511. package/dist/types/agent/task.d.ts +4 -0
  512. package/dist/types/agent/task.d.ts.map +1 -1
  513. package/dist/types/authorization/index.d.ts +30 -30
  514. package/dist/types/connector/mcp.d.ts +7 -0
  515. package/dist/types/connector/mcp.d.ts.map +1 -1
  516. package/dist/types/errors/catalog.d.ts.map +1 -1
  517. package/dist/types/errors/catalog.js +4 -2
  518. package/dist/types/errors/catalog.js.map +1 -1
  519. package/dist/types/harness/schema.d.ts +354 -0
  520. package/dist/types/harness/schema.d.ts.map +1 -0
  521. package/dist/types/harness/schema.js +203 -0
  522. package/dist/types/harness/schema.js.map +1 -0
  523. package/dist/types/harness/session.d.ts +278 -0
  524. package/dist/types/harness/session.d.ts.map +1 -0
  525. package/dist/types/harness/session.js +2 -0
  526. package/dist/types/harness/session.js.map +1 -0
  527. package/dist/types/hitl/index.d.ts +12 -0
  528. package/dist/types/hitl/index.d.ts.map +1 -1
  529. package/dist/types/hitl/index.js.map +1 -1
  530. package/dist/types/job/index.d.ts +47 -0
  531. package/dist/types/job/index.d.ts.map +1 -0
  532. package/dist/types/job/index.js +2 -0
  533. package/dist/types/job/index.js.map +1 -0
  534. package/dist/types/message/inbound-delivery.d.ts +44 -0
  535. package/dist/types/message/inbound-delivery.d.ts.map +1 -0
  536. package/dist/types/message/inbound-delivery.js +14 -0
  537. package/dist/types/message/inbound-delivery.js.map +1 -0
  538. package/dist/types/message/index.d.ts +4 -1
  539. package/dist/types/message/index.d.ts.map +1 -1
  540. package/dist/types/message/index.js +5 -1
  541. package/dist/types/message/index.js.map +1 -1
  542. package/dist/types/plugin/index.d.ts +6 -6
  543. package/dist/types/sandbox/index.d.ts +39 -2
  544. package/dist/types/sandbox/index.d.ts.map +1 -1
  545. package/dist/types/sandbox/index.js.map +1 -1
  546. package/dist/types/session/checkpoint.d.ts +24 -17
  547. package/dist/types/session/checkpoint.d.ts.map +1 -1
  548. package/dist/types/session/checkpoint.js +1 -0
  549. package/dist/types/session/checkpoint.js.map +1 -1
  550. package/dist/types/session/events.d.ts +23 -1
  551. package/dist/types/session/events.d.ts.map +1 -1
  552. package/dist/types/session/events.js.map +1 -1
  553. package/dist/types/session/records.d.ts +1514 -565
  554. package/dist/types/session/records.d.ts.map +1 -1
  555. package/dist/types/session/records.js +89 -1
  556. package/dist/types/session/records.js.map +1 -1
  557. package/dist/types/session/step.d.ts +2 -0
  558. package/dist/types/session/step.d.ts.map +1 -1
  559. package/dist/types/session/step.js.map +1 -1
  560. package/dist/types/session/store.d.ts +19 -10
  561. package/dist/types/session/store.d.ts.map +1 -1
  562. package/dist/types/session/tool-execution.d.ts +6 -0
  563. package/dist/types/session/tool-execution.d.ts.map +1 -1
  564. package/dist/types/structured-output/index.d.ts +12 -2
  565. package/dist/types/structured-output/index.d.ts.map +1 -1
  566. package/dist/types/summary/ref.d.ts +3 -1
  567. package/dist/types/summary/ref.d.ts.map +1 -1
  568. package/dist/types/tool/index.d.ts +32 -4
  569. package/dist/types/tool/index.d.ts.map +1 -1
  570. package/dist/types/tool/index.js.map +1 -1
  571. package/dist/types/tool/presentation.d.ts +106 -0
  572. package/dist/types/tool/presentation.d.ts.map +1 -1
  573. package/dist/utils/json-snapshot.d.ts +6 -2
  574. package/dist/utils/json-snapshot.d.ts.map +1 -1
  575. package/dist/utils/json-snapshot.js +19 -9
  576. package/dist/utils/json-snapshot.js.map +1 -1
  577. package/dist/utils/structured-result-json.d.ts +5 -0
  578. package/dist/utils/structured-result-json.d.ts.map +1 -0
  579. package/dist/utils/structured-result-json.js +10 -0
  580. package/dist/utils/structured-result-json.js.map +1 -0
  581. package/package.json +1 -1
  582. package/src/agents/QueryAgent.ts +1 -0
  583. package/src/agents/examples/SupervisorAgent.ts +1 -0
  584. package/src/agents/runAgent.ts +3 -0
  585. package/src/authorization/shell-lexer.ts +16 -1
  586. package/src/bridge/acp/permission.ts +17 -3
  587. package/src/bridge/acp/server.ts +271 -25
  588. package/src/bridge/acp/tasks.ts +23 -0
  589. package/src/bridge/acp/update.ts +167 -13
  590. package/src/connector/mcp/adapter.ts +16 -4
  591. package/src/connector/mcp/client.ts +6 -2
  592. package/src/constants/acp/index.ts +4 -0
  593. package/src/manager/agent/lifecycle.ts +230 -3
  594. package/src/manager/plan/lifecycle.ts +11 -9
  595. package/src/manager/session/attribution.ts +12 -2
  596. package/src/manager/session/streamed-message-identity.ts +21 -0
  597. package/src/manager/session/turn-recorder.ts +4 -3
  598. package/src/pals/activity/causality.ts +261 -0
  599. package/src/pals/activity/projection.ts +89 -0
  600. package/src/pals/activity/source.ts +240 -0
  601. package/src/pals/activity/subscription-policy.ts +230 -0
  602. package/src/pals/activity/subscription-schema.ts +27 -0
  603. package/src/pals/activity/subscription-store.ts +172 -0
  604. package/src/pals/activity/subscription-types.ts +48 -0
  605. package/src/pals/activity/subscriptions.ts +209 -0
  606. package/src/pals/activity/types.ts +108 -0
  607. package/src/pals/channels/ingress.ts +153 -0
  608. package/src/pals/channels/routes.ts +118 -0
  609. package/src/pals/channels/routing.ts +197 -0
  610. package/src/pals/channels/schema.ts +108 -0
  611. package/src/pals/channels/types.ts +156 -0
  612. package/src/pals/communication/broker.ts +131 -0
  613. package/src/pals/communication/dispatch.ts +66 -0
  614. package/src/pals/communication/inbound.ts +193 -0
  615. package/src/pals/communication/ingress-dispatch.ts +63 -0
  616. package/src/pals/communication/ingress-inbound.ts +269 -0
  617. package/src/pals/communication/ingress-schema.ts +526 -0
  618. package/src/pals/communication/ingress-types.ts +336 -0
  619. package/src/pals/communication/operator.ts +315 -0
  620. package/src/pals/communication/policy.ts +174 -0
  621. package/src/pals/communication/schema.ts +173 -0
  622. package/src/pals/communication/store.ts +577 -0
  623. package/src/pals/communication/tools.ts +139 -0
  624. package/src/pals/communication/types.ts +227 -0
  625. package/src/pals/communication/verify.ts +220 -0
  626. package/src/pals/lifecycle.ts +54 -0
  627. package/src/pals/prompt.ts +101 -0
  628. package/src/pals/reference-images.ts +322 -0
  629. package/src/pals/runtime.ts +670 -0
  630. package/src/pals/store.ts +369 -0
  631. package/src/pals/types.ts +157 -0
  632. package/src/peers/envelope.ts +1 -1
  633. package/src/plugin/shell-hook.ts +8 -2
  634. package/src/process/kill-tree.ts +10 -1
  635. package/src/provider/errors.ts +135 -2
  636. package/src/public-runtime.ts +117 -12
  637. package/src/public-tools.ts +13 -1
  638. package/src/public-types.ts +69 -7
  639. package/src/registry/tool/presentation.ts +9 -4
  640. package/src/runtime/harness-session/index.ts +1125 -0
  641. package/src/runtime/harness-session/journal.ts +209 -0
  642. package/src/runtime/harness-session/saved-view.ts +122 -0
  643. package/src/runtime/jobs/awaited-jobs.ts +2 -1
  644. package/src/runtime/jobs/registry.ts +397 -41
  645. package/src/runtime/query/abandon-turn.ts +18 -2
  646. package/src/runtime/query/checkpoint.ts +11 -0
  647. package/src/runtime/query/durable-inbound.ts +101 -0
  648. package/src/runtime/query/events.ts +22 -5
  649. package/src/runtime/query/executor/tool-call-admission.ts +125 -32
  650. package/src/runtime/query/executor.ts +316 -130
  651. package/src/runtime/query/index.ts +24 -4
  652. package/src/runtime/query/iteration/index.ts +218 -104
  653. package/src/runtime/query/iteration/outstanding-work.ts +55 -7
  654. package/src/runtime/query/iteration/phases/context.ts +4 -0
  655. package/src/runtime/query/iteration/phases/tool-review.ts +118 -21
  656. package/src/runtime/query/observation-context.ts +22 -16
  657. package/src/runtime/query/prepare-turn.ts +2 -2
  658. package/src/runtime/query/prompt-cache.ts +3 -0
  659. package/src/runtime/query/prompt.ts +32 -1
  660. package/src/runtime/query/repeat-call.ts +40 -10
  661. package/src/runtime/query/resume-pending.ts +60 -7
  662. package/src/runtime/query/resume-session.ts +1 -1
  663. package/src/runtime/query/review-policy.ts +23 -2
  664. package/src/runtime/query/saved-presentation.ts +70 -0
  665. package/src/runtime/query/steering.ts +6 -9
  666. package/src/runtime/query/tool-executions.ts +108 -9
  667. package/src/runtime/query/tooling.ts +6 -1
  668. package/src/scheduler/completion-inbox.ts +108 -7
  669. package/src/scheduler/delegating.ts +5 -0
  670. package/src/scheduler/local.ts +2 -0
  671. package/src/session/summary/materialize.ts +51 -9
  672. package/src/store/budget/ledger.ts +60 -5
  673. package/src/store/session/disk.ts +77 -10
  674. package/src/store/session/memory.ts +32 -7
  675. package/src/store/session-log/core.ts +118 -11
  676. package/src/store/session-log/disk.ts +9 -2
  677. package/src/store/session-log/fold.ts +22 -0
  678. package/src/store/session-log/index.ts +5 -0
  679. package/src/store/session-log/memory.ts +2 -1
  680. package/src/store/session-log/spill.ts +89 -6
  681. package/src/store/session-log/structured-result.ts +96 -0
  682. package/src/store/task/disk.ts +46 -2
  683. package/src/store/task/memory.ts +13 -3
  684. package/src/tools/admit-facts.ts +145 -0
  685. package/src/tools/builtins/bash.ts +132 -24
  686. package/src/tools/builtins/edit.ts +42 -0
  687. package/src/tools/builtins/file-write-result.ts +14 -0
  688. package/src/tools/builtins/glob.ts +12 -0
  689. package/src/tools/builtins/grep.ts +14 -0
  690. package/src/tools/builtins/index.ts +2 -0
  691. package/src/tools/builtins/job.ts +4 -1
  692. package/src/tools/builtins/read-file.ts +57 -0
  693. package/src/tools/builtins/view-image.ts +409 -0
  694. package/src/tools/builtins/wait-for-job-bounds.ts +3 -0
  695. package/src/tools/builtins/wait-for-job.ts +141 -32
  696. package/src/tools/builtins/write-file.ts +4 -2
  697. package/src/tools/command-shell.ts +132 -5
  698. package/src/tools/coordinator/agent.ts +9 -19
  699. package/src/tools/coordinator/index.ts +150 -75
  700. package/src/tools/coordinator/wait-with-idle-bound.ts +3 -1
  701. package/src/tools/defineTool.ts +4 -0
  702. package/src/tools/failure-facts.ts +24 -0
  703. package/src/tools/host-output.ts +136 -0
  704. package/src/tools/oem-code-pages.ts +22 -0
  705. package/src/tools/schedules/schedule-tool.ts +38 -5
  706. package/src/tools/schedules/types.ts +23 -3
  707. package/src/tools/task/list.ts +15 -7
  708. package/src/tools/task/present.ts +37 -7
  709. package/src/tools/task/update.ts +12 -5
  710. package/src/tools/text-window.ts +87 -0
  711. package/src/toolsets/manager.ts +58 -1
  712. package/src/types/acp/index.ts +150 -4
  713. package/src/types/agent/base.ts +3 -0
  714. package/src/types/agent/manager.ts +8 -23
  715. package/src/types/agent/scheduler.ts +10 -1
  716. package/src/types/agent/task.ts +4 -0
  717. package/src/types/connector/mcp.ts +7 -0
  718. package/src/types/errors/catalog.ts +4 -2
  719. package/src/types/harness/schema.ts +203 -0
  720. package/src/types/harness/session.ts +306 -0
  721. package/src/types/hitl/index.ts +17 -1
  722. package/src/types/job/index.ts +42 -0
  723. package/src/types/message/inbound-delivery.ts +63 -0
  724. package/src/types/message/index.ts +8 -1
  725. package/src/types/sandbox/index.ts +46 -0
  726. package/src/types/session/checkpoint.ts +4 -1
  727. package/src/types/session/events.ts +23 -1
  728. package/src/types/session/records.ts +114 -2
  729. package/src/types/session/step.ts +2 -0
  730. package/src/types/session/store.ts +23 -9
  731. package/src/types/session/tool-execution.ts +6 -0
  732. package/src/types/structured-output/index.ts +13 -2
  733. package/src/types/summary/ref.ts +3 -1
  734. package/src/types/tool/index.ts +39 -5
  735. package/src/types/tool/presentation.ts +121 -0
  736. package/src/utils/json-snapshot.ts +26 -9
  737. package/src/utils/structured-result-json.ts +10 -0
@@ -1,5 +1,10 @@
1
1
  import { z } from 'zod'
2
2
  import { type EntityIdKind, isEntityId } from '../../utils/id.js'
3
+ import {
4
+ STRUCTURED_RESULT_MAX_BYTES,
5
+ parseStructuredResultJson,
6
+ } from '../../utils/structured-result-json.js'
7
+ import { HarnessBindingSchema, HarnessJournalTransitionSchema } from '../harness/schema.js'
3
8
  import type { HITLDecisionRequest, HITLResumeDecision } from '../hitl/index.js'
4
9
  import type {
5
10
  CheckpointId,
@@ -11,7 +16,7 @@ import type {
11
16
  TopicId,
12
17
  TurnId,
13
18
  } from '../ids/index.js'
14
- import type { Message } from '../message/index.js'
19
+ import { type Message, isRuntimeContextMessageSource } from '../message/index.js'
15
20
  import type { ActorRef } from './actor.js'
16
21
  import { CostInfoSchema, TokenUsageSchema, TurnBudgetBindingSchema } from './checkpoint.js'
17
22
  import {
@@ -70,7 +75,15 @@ const MESSAGE_ROLES = new Set(['system', 'user', 'assistant', 'tool'])
70
75
  * schema checks the discriminant and leaves the content to the message types.
71
76
  */
72
77
  const messageBody = z.custom<Message>(
73
- (value) => isPlainObject(value) && MESSAGE_ROLES.has(value.role as string),
78
+ (value) => {
79
+ if (!isPlainObject(value) || !MESSAGE_ROLES.has(value.role as string)) return false
80
+ const source = value.source
81
+ return (
82
+ !isPlainObject(source) ||
83
+ source.type !== 'runtime-context' ||
84
+ isRuntimeContextMessageSource(source)
85
+ )
86
+ },
74
87
  { message: 'expected a message with a system, user, assistant or tool role' },
75
88
  )
76
89
 
@@ -276,6 +289,16 @@ const spill = z
276
289
  })
277
290
  .strict()
278
291
 
292
+ const structuredResultSpill = spill
293
+ .extend({
294
+ path: text.regex(/^tool-results\/[a-f0-9]{64}\.txt$/),
295
+ manifest: text.regex(/^tool-results\/[a-f0-9]{64}\.txt\.manifest\.json$/),
296
+ bytes: positive.max(STRUCTURED_RESULT_MAX_BYTES),
297
+ })
298
+ .refine((ref) => ref.manifest === `${ref.path}.manifest.json`, {
299
+ message: 'a structured spill manifest must name its body',
300
+ })
301
+
279
302
  const subSessionKind = z.enum(['agent_spawn', 'user_handoff', 'intervention'])
280
303
 
281
304
  const actorRef = z.custom<ActorRef>(
@@ -319,6 +342,7 @@ function inTurn<T extends string, S extends z.ZodRawShape>(type: T, shape: S) {
319
342
  // Session
320
343
 
321
344
  export const SessionStartedRecordSchema = recordSchema('session_started', {
345
+ harness: HarnessBindingSchema.optional(),
322
346
  projectId,
323
347
  tenantId: tenantId.optional(),
324
348
  topicId: topicId.optional(),
@@ -340,6 +364,7 @@ export const SessionStartedRecordSchema = recordSchema('session_started', {
340
364
  })
341
365
 
342
366
  export const SessionUpdatedRecordSchema = recordSchema('session_updated', {
367
+ harness: HarnessJournalTransitionSchema.optional(),
343
368
  title: text.optional(),
344
369
  titleSource: z.enum(['derived', 'named']).optional(),
345
370
  archived: z.boolean().optional(),
@@ -382,6 +407,8 @@ export const TurnCompletedRecordSchema = inTurn('turn_completed', {
382
407
  /** The settled answer, or a preview of it when `resultSpill` holds the whole text. */
383
408
  result: text,
384
409
  resultSpill: spill.optional(),
410
+ /** Accepted JSON stored separately; settlement.structuredOutput is then absent. */
411
+ structuredOutputSpill: structuredResultSpill.optional(),
385
412
  stopReason: stopReason.optional(),
386
413
  cancelCause: cancelCause.optional(),
387
414
  budget: tokenBudgetSummary.optional(),
@@ -787,6 +814,83 @@ export const SessionRecordSchema = z
787
814
  message: `${r.type} happens only inside a turn and must carry turnId`,
788
815
  })
789
816
  }
817
+ if (
818
+ r.type === 'tool_completed' &&
819
+ r.inputFailure !== undefined &&
820
+ (!['invalid_json', 'schema_validation', 'input_truncated'].includes(
821
+ r.inputFailure as string,
822
+ ) ||
823
+ r.isError !== true)
824
+ ) {
825
+ context.addIssue({
826
+ code: z.ZodIssueCode.custom,
827
+ path: ['inputFailure'],
828
+ message: 'inputFailure must classify a failed tool admission',
829
+ })
830
+ }
831
+ if (
832
+ r.type === 'tool_completed' &&
833
+ r.skipped !== undefined &&
834
+ (r.skipped !== true || r.isError !== false || r.inputFailure !== undefined)
835
+ ) {
836
+ context.addIssue({
837
+ code: z.ZodIssueCode.custom,
838
+ path: ['skipped'],
839
+ message: 'skipped must classify a non-error pre-tool hook skip without an input failure',
840
+ })
841
+ }
842
+ if (
843
+ r.type === 'tool_completed' &&
844
+ (r.structuredResultJson !== undefined || r.structuredResultSpill !== undefined)
845
+ ) {
846
+ let validJson = false
847
+ try {
848
+ if (r.structuredResultSpill !== undefined) {
849
+ validJson =
850
+ r.structuredResultJson === undefined &&
851
+ structuredResultSpill.safeParse(r.structuredResultSpill).success
852
+ } else {
853
+ parseStructuredResultJson(r.structuredResultJson)
854
+ validJson = true
855
+ }
856
+ } catch {
857
+ // Retained evidence is never repaired or downgraded to a preview.
858
+ }
859
+ if (
860
+ !validJson ||
861
+ r.toolName !== 'structured_output' ||
862
+ r.isError !== false ||
863
+ r.skipped !== undefined ||
864
+ r.inputFailure !== undefined ||
865
+ r.via !== undefined
866
+ ) {
867
+ context.addIssue({
868
+ code: z.ZodIssueCode.custom,
869
+ path: [
870
+ r.structuredResultSpill !== undefined
871
+ ? 'structuredResultSpill'
872
+ : 'structuredResultJson',
873
+ ],
874
+ message:
875
+ 'structured result evidence must hold JSON or a spill from a successful direct structured_output execution, never both',
876
+ })
877
+ }
878
+ }
879
+ if (r.type === 'turn_completed' && r.structuredOutputSpill !== undefined) {
880
+ const settlement = r.settlement as Record<string, unknown>
881
+ if (
882
+ settlement.status !== 'completed' ||
883
+ settlement.resultSource !== 'structured_output' ||
884
+ settlement.structuredOutput !== undefined
885
+ ) {
886
+ context.addIssue({
887
+ code: z.ZodIssueCode.custom,
888
+ path: ['structuredOutputSpill'],
889
+ message:
890
+ 'a structured output spill requires a completed structured_output settlement without inline structuredOutput',
891
+ })
892
+ }
893
+ }
790
894
  if (r.type === 'message') {
791
895
  const content = r.content as { role: unknown }
792
896
  if (r.role !== content.role) {
@@ -851,6 +955,14 @@ export type SessionEventRecord<T extends PersistedSessionEventType = PersistedSe
851
955
  T extends PersistedSessionEventType
852
956
  ? Omit<EventOf<T>, 'sessionId' | 'turnId' | 'lineage' | 'v' | 'seq' | 'generation'> &
853
957
  RecordEnvelope &
958
+ (T extends 'tool_completed'
959
+ ? { readonly structuredResultSpill?: z.infer<typeof structuredResultSpill> }
960
+ : T extends 'turn_completed'
961
+ ? {
962
+ readonly resultSpill?: z.infer<typeof spill>
963
+ readonly structuredOutputSpill?: z.infer<typeof structuredResultSpill>
964
+ }
965
+ : unknown) &
854
966
  (T extends TurnBoundSessionEventType ? { readonly turnId: TurnId } : unknown)
855
967
  : never
856
968
 
@@ -159,6 +159,8 @@ export interface StepToolResult {
159
159
  /** Text form, after the model-visible output budget was applied. */
160
160
  output: string
161
161
  isError: boolean
162
+ /** The pre-tool hook skipped this call; its receipt is not an executed answer. */
163
+ skipped?: true
162
164
  durationMs: number
163
165
  }
164
166
 
@@ -16,7 +16,7 @@ import type {
16
16
  SubSessionKind,
17
17
  } from '../../types/session/sub-session.js'
18
18
  import type { SessionSummaryRef } from '../../types/summary/ref.js'
19
- import type { SessionId, TenantId } from '../ids/index.js'
19
+ import type { SessionId, TenantId, TurnId } from '../ids/index.js'
20
20
  import type { ProjectId, SubSessionId, SummaryId, TopicId } from '../session/ids.js'
21
21
 
22
22
  /**
@@ -145,6 +145,10 @@ export interface SessionView {
145
145
  * callers never get a fallback and must branch on missing explicitly.
146
146
  */
147
147
  export interface SessionStore {
148
+ /** Explicit opt-in to immutable turn-keyed summaries. Omission does not support child continuation. */
149
+ readonly supportsInvocationSummaries?: boolean
150
+ /** Opt in only when updateSession and recordSummary enforce owner-version CAS. */
151
+ readonly supportsOwnerVersionCas?: boolean
148
152
  // Project CRUD ------------------------------------------------------------
149
153
 
150
154
  createProject(params: CreateProjectParams, tenantId: TenantId): Promise<Project>
@@ -241,7 +245,8 @@ export interface SessionStore {
241
245
  * into.
242
246
  *
243
247
  * **In-process only, stated rather than implied.** `DiskSessionStore`
244
- * writes atomically, but its read-compare-write is not a critical section,
248
+ * serializes session writes across instances using the same root within a
249
+ * process. Its read-compare-write is not a cross-process critical section,
245
250
  * so two PROCESSES can still both pass the check. Closing that needs a
246
251
  * lease with an expiry — not a PID registry, because a Session is durable
247
252
  * and written from hosts where a PID is not a checkable fact. The same
@@ -359,21 +364,30 @@ export interface SessionStore {
359
364
  * writes commit as one logical unit; mid-crash recovery is replay via
360
365
  * `SessionSummaryMaterializer.recover()`.
361
366
  *
362
- * Rejects with {@link SessionAlreadySummarizedError} if a summary already
363
- * exists for the session (re-materialization forbidden; see
364
- * session-hierarchy.md §4.7 immutability invariant).
367
+ * Summaries are immutable per `(sessionRef, turnRef)`. An absent `turnRef`
368
+ * preserves the original single conversation-summary contract. A supplied
369
+ * `turnRef` seals one invocation without replacing any previous summary.
370
+ * Rejects a different summary at an already sealed key.
371
+ * With expectedOwnerVersion, refuse before persisting or flipping status if
372
+ * the current session owner changed. Omission preserves the legacy behavior.
365
373
  */
366
374
  recordSummary(
367
375
  summary: SessionSummaryRef & { materializedBy: 'kernel' },
368
376
  tenantId: TenantId,
377
+ expectedOwnerVersion?: number,
369
378
  ): Promise<void>
370
379
 
371
380
  /**
372
- * Loads the persisted summary for a session. Returns `null` when none has
373
- * been materialized. Cross-tenant reads reject with `TenantIsolationError`
374
- * (Convention #17).
381
+ * Loads the original conversation summary, or the exact invocation summary
382
+ * when `turnId` is supplied. Returns `null` when that key is unsealed; it
383
+ * never substitutes the original or newest summary for a missing invocation.
384
+ * Cross-tenant reads reject with `TenantIsolationError` (Convention #17).
375
385
  */
376
- getSummary(sessionId: SessionId, tenantId: TenantId): Promise<SessionSummaryRef | null>
386
+ getSummary(
387
+ sessionId: SessionId,
388
+ tenantId: TenantId,
389
+ turnId?: TurnId,
390
+ ): Promise<SessionSummaryRef | null>
377
391
  }
378
392
 
379
393
  /**
@@ -14,6 +14,12 @@ export interface CompletedToolRecord {
14
14
  readonly toolName: string
15
15
  readonly result: string
16
16
  readonly isError: boolean
17
+ /** Trusted admission classification retained with the completion, absent in legacy records. */
18
+ readonly inputFailure?: 'invalid_json' | 'schema_validation' | 'input_truncated'
19
+ /** Trusted pre-tool hook skip, absent in legacy records; the tool produced no output. */
20
+ readonly skipped?: true
21
+ /** Opt-in screened, post-hook JSON from a successful structured_output; independent of the bounded receipt. */
22
+ readonly structuredResultJson?: string
17
23
  }
18
24
 
19
25
  /** The latest recorded execution boundary of a tool call, not its inferred external effect. */
@@ -17,8 +17,19 @@ export interface StructuredOutputConfig<TSchema extends z.ZodType = z.ZodType> {
17
17
  mode?: 'tool' | 'native'
18
18
 
19
19
  /**
20
- * Turns spent re-prompting when the model answers in prose or fails
21
- * validation. Defaults to {@link DEFAULT_STRUCTURED_OUTPUT_RETRIES}.
20
+ * Tool mode only. Default `receipt` settles from the bounded tool message.
21
+ * `durable` also records the screened, post-hook JSON before preview capping,
22
+ * so a truncated preview does not destroy the candidate. The session log's
23
+ * record size limit still applies. This is execution evidence, not acceptance;
24
+ * recovered batches retain the existing fresh-inference settlement policy.
25
+ */
26
+ toolResultRetention?: 'receipt' | 'durable'
27
+
28
+ /**
29
+ * Correction opportunities after missing output or model-argument validation
30
+ * failure. Default 2; zero stops after the first invalid response. Tool-mode
31
+ * prose and invalid output calls share a checkpointed counter, once per response.
32
+ * Host review rejections use the separate maxReviews allowance.
22
33
  *
23
34
  * Bounded so a model that cannot satisfy the schema fails loudly rather
24
35
  * than iterating against `maxIterations`.
@@ -20,7 +20,7 @@
20
20
  * `session/summary/errors.ts` — they are NOT pure shapes.
21
21
  */
22
22
 
23
- import type { SessionId, TenantId } from '../ids/index.js'
23
+ import type { SessionId, TenantId, TurnId } from '../ids/index.js'
24
24
  import type { SummaryId } from '../session/ids.js'
25
25
  import type { DeliverableRef } from './deliverable.js'
26
26
 
@@ -53,6 +53,8 @@ export interface SessionSummaryKeyDecision {
53
53
  export interface SessionSummaryRef {
54
54
  readonly id: SummaryId
55
55
  readonly sessionRef: SessionId
56
+ /** Immutable completion of one invocation; omission is the legacy conversation summary. */
57
+ readonly turnRef?: TurnId
56
58
  readonly tenantId: TenantId
57
59
  readonly outcome: SessionSummaryOutcome
58
60
  readonly deliverables: readonly DeliverableRef[]
@@ -7,6 +7,7 @@ import type { CodeNavigationProvider } from '../code-navigation/index.js'
7
7
  import type { ToolResultGuardrailSpec } from '../guardrail/index.js'
8
8
  import type { SessionId, TurnId } from '../ids/index.js'
9
9
  import type { InvocationState } from '../invocation/index.js'
10
+ import type { BackgroundJobOutputWaitOptions, BackgroundJobOutputWaitResult } from '../job/index.js'
10
11
  import type { PermissionMode } from '../permission/index.js'
11
12
  import type { Sandbox } from '../sandbox/index.js'
12
13
  import type { ToolPresentation } from './presentation.js'
@@ -117,7 +118,13 @@ export interface BackgroundJobRegistryRef {
117
118
  id: string
118
119
  status: string
119
120
  }
120
- get(id: string): { id: string; status: string; exitCode?: number }
121
+ get(id: string): { id: string; status: string; exitCode?: number; error?: string }
122
+ /**
123
+ * Resolves once the process exists or failed to start (`error` says why).
124
+ * Optional: a host that cannot tell may omit it, and `bash` then replies
125
+ * without waiting.
126
+ */
127
+ awaitStarted?(id: string): Promise<{ readonly error?: string }>
121
128
  read(
122
129
  id: string,
123
130
  opts?: { fromOffset?: number },
@@ -127,6 +134,7 @@ export interface BackgroundJobRegistryRef {
127
134
  droppedBytes: number
128
135
  status: string
129
136
  exitCode?: number
137
+ error?: string
130
138
  }
131
139
  kill(id: string): Promise<{ id: string; status: string }>
132
140
  list(): readonly { id: string; command: string; status: string }[]
@@ -144,12 +152,19 @@ export interface BackgroundJobRegistryRef {
144
152
  id: string
145
153
  status: string
146
154
  exitCode?: number
155
+ error?: string
147
156
  }>
157
+ /** Observe a bounded literal output condition. Does not express exit-wait intent. */
158
+ waitForOutput?(
159
+ id: string,
160
+ opts: BackgroundJobOutputWaitOptions,
161
+ ): Promise<BackgroundJobOutputWaitResult>
148
162
  /**
149
163
  * Say that the model is waiting on this job, so the turn stays open for it
150
164
  * when the model stops calling tools.
151
165
  *
152
- * Called by `wait_for_job` and nothing else. The kernel holds a finishing
166
+ * Called only by the exit mode of `wait_for_job`. Output readiness does not
167
+ * mark a job here. The kernel holds a finishing
153
168
  * run open — bounded, and for no model tokens — only for a job marked
154
169
  * here; a job nobody marked never delays a turn, which is what a dev server
155
170
  * or a watcher needs. Optional for the reason `waitForExit` is: a host
@@ -758,6 +773,14 @@ export interface ToolResult {
758
773
  * the child's turn fails with {@link ToolHandoff.reason} instead.
759
774
  */
760
775
  handoff?: ToolHandoff
776
+ /**
777
+ * What this call did, as typed fields for the PERSON's view: the exit code
778
+ * and the two streams of a command, the path and size of a read, whether a
779
+ * write created the file. `output` stays the model's text and is not
780
+ * derived from these; a host that headlines a row reads these and never
781
+ * the prose. A host-side override of the output (a redaction) drops them.
782
+ */
783
+ facts?: import('./presentation.js').ToolFacts
761
784
  }
762
785
 
763
786
  /**
@@ -776,8 +799,10 @@ export interface ToolHandoff {
776
799
  * `bash` reads it as bash does. `sh` reads it for a shell that may be bash or
777
800
  * a POSIX shell such as `dash`: every construct the two read differently
778
801
  * makes the line opaque, so a line that is not opaque means the same in both.
802
+ * `cmd` identifies native Windows CMD; its commands are conservatively opaque
803
+ * until a matching parser is available. It is never read as POSIX shell text.
779
804
  */
780
- export type ShellDialect = 'bash' | 'sh'
805
+ export type ShellDialect = 'bash' | 'sh' | 'cmd'
781
806
 
782
807
  export interface ToolDefinition<TInput = unknown> extends ToolPresentation<TInput> {
783
808
  name: string
@@ -901,7 +926,8 @@ export interface ToolDefinition<TInput = unknown> extends ToolPresentation<TInpu
901
926
  * may be bash or a POSIX shell, and every construct the two read
902
927
  * differently makes the line opaque, so no allow rule approves it. The
903
928
  * shipped `bash` tool answers `bash` when it will spawn bash on the host
904
- * and `sh` inside a sandbox, whose guest may not have bash.
929
+ * and `sh` inside a sandbox, whose guest may not have bash. Native Windows
930
+ * CMD reports `cmd`, whose command-specific permission reading is opaque.
905
931
  */
906
932
  commandDialect?: (context: { readonly sandboxed: boolean }) => ShellDialect
907
933
  /**
@@ -1167,12 +1193,20 @@ export interface PreparedToolExecution {
1167
1193
  /** Result of decoding a tool input at the execution boundary. */
1168
1194
  export type ToolPreparationResult =
1169
1195
  | { readonly success: true; readonly prepared: PreparedToolExecution }
1170
- | { readonly success: false; readonly result: ToolExecutionResult }
1196
+ | {
1197
+ readonly success: false
1198
+ readonly result: ToolExecutionResult
1199
+ /** Zod rejected the input; other preparation failures leave this absent. */
1200
+ readonly inputFailure?: 'schema_validation'
1201
+ }
1171
1202
 
1172
1203
  export * from './repair.js'
1173
1204
 
1174
1205
  export type {
1175
1206
  ToolCallView,
1207
+ ToolFacts,
1208
+ ToolFailureReason,
1176
1209
  ToolPresentation,
1177
1210
  ToolResultView,
1211
+ ToolTextWindow,
1178
1212
  } from './presentation.js'
@@ -33,6 +33,20 @@ export type ToolCallView =
33
33
  * what did not happen ("Cancelled — nothing was saved").
34
34
  */
35
35
  readonly outcome?: 'cancelled'
36
+ /**
37
+ * For a result: a person answered No to this call at review, so it
38
+ * never ran. `label` names what it was about (the file, the command)
39
+ * and `note` is what the person said, in their own words and capped
40
+ * at 4,000 characters. Set only from the review answer, never read
41
+ * out of text; a refusal by policy does not carry it.
42
+ */
43
+ readonly declined?: { readonly note?: string }
44
+ /**
45
+ * For a call: what the call is about, as fields. A host headlines the
46
+ * row ("Read a.ts", "Searched for export") from these and never from
47
+ * the text of `label`.
48
+ */
49
+ readonly facts?: ToolFacts
36
50
  }
37
51
  /**
38
52
  * A change to a document. `path` is optional because not every diff is
@@ -50,6 +64,113 @@ export type ToolCallView =
50
64
  /** A command and what it printed. */
51
65
  | { readonly kind: 'terminal'; readonly command?: string; readonly output: string }
52
66
 
67
+ /**
68
+ * A bounded window onto a block of text: the first lines, the last lines, and
69
+ * how much lay between. Small enough to travel in an event, and enough for a
70
+ * host to show "head, tail, Show more" without holding the whole output.
71
+ */
72
+ export interface ToolTextWindow {
73
+ /** The first lines, or the whole text when it fit. */
74
+ readonly head: string
75
+ /** The last lines, present only when lines were left out between `head` and it. */
76
+ readonly tail?: string
77
+ /** Lines left out between `head` and `tail`. */
78
+ readonly omittedLines?: number
79
+ /** Lines in the whole text. */
80
+ readonly totalLines: number
81
+ /** Bytes in the whole text. */
82
+ readonly totalBytes: number
83
+ }
84
+
85
+ /** Why a call did not do what it was asked, as a kind a host can phrase for a person. */
86
+ export type ToolFailureReason =
87
+ | 'not_found'
88
+ | 'permission_denied'
89
+ | 'not_a_file'
90
+ | 'already_exists'
91
+ | 'blocked'
92
+ | 'needs_administrator'
93
+ | 'unknown_tool'
94
+ | 'timed_out'
95
+ | 'invalid_input'
96
+
97
+ /**
98
+ * What a call was about and what came of it, as typed fields.
99
+ *
100
+ * `output` is written for the model and its wording is the model's interface.
101
+ * A person is shown a different thing, and reading their screen out of the
102
+ * model's prose is how "STDOUT:" and "1 replacement(s)" reached it. These are
103
+ * the same facts the tool already knew, stated once, so a host never has to
104
+ * read text to learn an exit code, a file name or whether a file was created.
105
+ *
106
+ * Every field but `kind` is optional: the same shape describes a call that is
107
+ * still running (what it was asked) and one that finished (what it did).
108
+ * Paths are as the tool resolved them; a host shortens them for display.
109
+ */
110
+ export type ToolFacts =
111
+ | {
112
+ readonly kind: 'command'
113
+ /** The command line, on the call. */
114
+ readonly command?: string
115
+ readonly exitCode?: number
116
+ readonly timedOut?: boolean
117
+ /** The signal that ended it, when one did. */
118
+ readonly signal?: string
119
+ readonly stdout?: ToolTextWindow
120
+ readonly stderr?: ToolTextWindow
121
+ /** The output was not text; nothing of it is in `stdout`/`stderr`. */
122
+ readonly binary?: { readonly bytes: number }
123
+ /** The command was handed to a background job instead of being waited on. */
124
+ readonly background?: true
125
+ }
126
+ | {
127
+ readonly kind: 'read'
128
+ readonly path: string
129
+ /** The file is not text; the person is told so instead of being shown its bytes. */
130
+ readonly binary?: boolean
131
+ readonly bytes?: number
132
+ readonly totalLines?: number
133
+ readonly returnedLines?: number
134
+ /** Only a window of the file was returned. */
135
+ readonly partial?: boolean
136
+ }
137
+ | {
138
+ readonly kind: 'search'
139
+ readonly pattern: string
140
+ readonly path?: string
141
+ readonly matches?: number
142
+ readonly filesMatched?: number
143
+ readonly filesSearched?: number
144
+ readonly truncated?: boolean
145
+ }
146
+ | {
147
+ readonly kind: 'list'
148
+ readonly pattern: string
149
+ readonly path?: string
150
+ readonly count?: number
151
+ readonly truncated?: boolean
152
+ }
153
+ | {
154
+ readonly kind: 'edit'
155
+ readonly path?: string
156
+ readonly replacements?: number
157
+ }
158
+ | {
159
+ readonly kind: 'write'
160
+ readonly path: string
161
+ /** `wrote` when the file's earlier state could not be established. */
162
+ readonly operation: 'created' | 'updated' | 'unchanged' | 'wrote'
163
+ readonly bytes?: number
164
+ readonly added?: number
165
+ readonly removed?: number
166
+ }
167
+ | {
168
+ readonly kind: 'failure'
169
+ readonly reason: ToolFailureReason
170
+ /** What it was about: a path, or the tool's name for `unknown_tool`. */
171
+ readonly subject?: string
172
+ }
173
+
53
174
  /** The same shapes, for what a call produced. */
54
175
  export type ToolResultView = ToolCallView
55
176
 
@@ -1,5 +1,14 @@
1
- /** Clone JSON data without invoking getters or silently dropping values. */
2
- export function cloneJsonValue(value: unknown, freeze: boolean, path = '$'): unknown {
1
+ /**
2
+ * Clone JSON data without invoking getters or silently dropping values.
3
+ * Raw schema input may preserve its plain-object prototypes; prepared outputs
4
+ * keep the default canonical shape used by durable JSON round-trips.
5
+ */
6
+ export function cloneJsonValue(
7
+ value: unknown,
8
+ freeze: boolean,
9
+ path = '$',
10
+ preserveObjectPrototype = false,
11
+ ): unknown {
3
12
  const active = new WeakSet<object>()
4
13
  const copies = new WeakMap<object, object>()
5
14
 
@@ -23,8 +32,16 @@ export function cloneJsonValue(value: unknown, freeze: boolean, path = '$'): unk
23
32
  active.add(candidate)
24
33
  try {
25
34
  if (Array.isArray(candidate)) {
35
+ if (preserveObjectPrototype && Object.getPrototypeOf(candidate) !== Array.prototype) {
36
+ throw new TypeError(`${at} must be an ordinary array for raw preparation`)
37
+ }
26
38
  const extra = Reflect.ownKeys(candidate).filter(
27
- (key) => key !== 'length' && (typeof key !== 'string' || !/^(0|[1-9]\d*)$/.test(key)),
39
+ (key) =>
40
+ key !== 'length' &&
41
+ (typeof key !== 'string' ||
42
+ !/^(0|[1-9]\d*)$/.test(key) ||
43
+ (preserveObjectPrototype &&
44
+ (Number(key) >= candidate.length || Number(key) > 0xffff_fffe))),
28
45
  )
29
46
  if (extra.length > 0) throw new TypeError(`${at} has non-JSON array properties`)
30
47
  const result: unknown[] = new Array(candidate.length)
@@ -45,12 +62,12 @@ export function cloneJsonValue(value: unknown, freeze: boolean, path = '$'): unk
45
62
  if (prototype !== Object.prototype && prototype !== null) {
46
63
  throw new TypeError(`${at} must be a plain JSON object`)
47
64
  }
48
- // JSON does not preserve prototypes. Canonicalize both admitted plain
49
- // shapes to an ordinary object so a disk checkpoint round-trip compares
50
- // equal to a fresh preparation of the same semantic value. Properties
51
- // are still defined explicitly, so a literal "__proto__" key remains
52
- // data rather than changing this object's prototype.
53
- const result: Record<string, unknown> = {}
65
+ // Raw schema input can depend on its prototype. Prepared output instead
66
+ // canonicalizes both admitted shapes so a disk checkpoint round-trip
67
+ // compares equal to a fresh preparation of the same JSON value. Explicit
68
+ // data properties keep a literal "__proto__" key from changing either.
69
+ const result: Record<string, unknown> =
70
+ preserveObjectPrototype && prototype === null ? Object.create(null) : {}
54
71
  copies.set(candidate, result)
55
72
  for (const key of Reflect.ownKeys(candidate)) {
56
73
  if (typeof key !== 'string') throw new TypeError(`${at} has a symbol property`)
@@ -0,0 +1,10 @@
1
+ import { cloneJsonValue } from './json-snapshot.js'
2
+
3
+ /** Maximum UTF-8 JSON body retained by opt-in structured result spills. */
4
+ export const STRUCTURED_RESULT_MAX_BYTES = 16 * 1024 * 1024
5
+
6
+ /** Decode retained result evidence without coercing non-JSON values or rerunning a schema. */
7
+ export function parseStructuredResultJson(text: unknown): unknown {
8
+ if (typeof text !== 'string') throw new TypeError('Structured result evidence must be JSON text')
9
+ return cloneJsonValue(JSON.parse(text), false)
10
+ }