niceeval 0.15.1-canary.76 → 0.16.1

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 (714) hide show
  1. package/INDEX.md +45 -40
  2. package/dist/adapter-execution-trace.cjs.map +1 -1
  3. package/dist/adapter-execution-trace.d.cts +26 -0
  4. package/dist/adapter-execution-trace.d.mts +26 -0
  5. package/dist/adapter-execution-trace.d.ts +26 -0
  6. package/dist/adapter-usage.cjs.map +1 -1
  7. package/dist/adapter-usage.d.cts +9 -0
  8. package/dist/adapter-usage.d.mts +9 -0
  9. package/dist/adapter-usage.d.ts +9 -0
  10. package/dist/adapter.cjs +19 -4
  11. package/dist/adapter.cjs.map +1 -1
  12. package/dist/adapter.d.cts +37 -12
  13. package/dist/adapter.d.mts +37 -12
  14. package/dist/adapter.d.ts +37 -12
  15. package/dist/agents/ai-sdk.cjs +3 -0
  16. package/dist/agents/ai-sdk.cjs.map +1 -1
  17. package/dist/agents/bub.cjs +3 -0
  18. package/dist/agents/bub.cjs.map +1 -1
  19. package/dist/agents/claude-code-native.cjs +28 -2
  20. package/dist/agents/claude-code-native.cjs.map +1 -1
  21. package/dist/agents/claude-code.cjs +3 -0
  22. package/dist/agents/claude-code.cjs.map +1 -1
  23. package/dist/agents/codex.cjs +3 -0
  24. package/dist/agents/codex.cjs.map +1 -1
  25. package/dist/agents/coding-cli-versions.cjs +9 -10
  26. package/dist/agents/coding-cli-versions.cjs.map +1 -1
  27. package/dist/agents/coding-cli-versions.d.cts +1 -1
  28. package/dist/agents/coding-cli-versions.d.mts +1 -1
  29. package/dist/agents/coding-cli-versions.d.ts +1 -1
  30. package/dist/agents/deepseek-harness.cjs +3 -0
  31. package/dist/agents/deepseek-harness.cjs.map +1 -1
  32. package/dist/agents/hermes.cjs +3 -0
  33. package/dist/agents/hermes.cjs.map +1 -1
  34. package/dist/agents/index.cjs.map +1 -1
  35. package/dist/agents/index.d.cts +3 -2
  36. package/dist/agents/index.d.mts +3 -2
  37. package/dist/agents/index.d.ts +3 -2
  38. package/dist/agents/omp.cjs +3 -0
  39. package/dist/agents/omp.cjs.map +1 -1
  40. package/dist/agents/openai-compat.cjs +6 -0
  41. package/dist/agents/openai-compat.cjs.map +1 -1
  42. package/dist/agents/openclaw.cjs +3 -0
  43. package/dist/agents/openclaw.cjs.map +1 -1
  44. package/dist/agents/opencode.cjs +3 -0
  45. package/dist/agents/opencode.cjs.map +1 -1
  46. package/dist/agents/sdk-streams.cjs +9 -0
  47. package/dist/agents/sdk-streams.cjs.map +1 -1
  48. package/dist/agents/ui-message-stream.cjs +3 -0
  49. package/dist/agents/ui-message-stream.cjs.map +1 -1
  50. package/dist/assertions/api.cjs.map +1 -1
  51. package/dist/assertions/api.d.cts +27 -5
  52. package/dist/assertions/api.d.mts +27 -5
  53. package/dist/assertions/api.d.ts +27 -5
  54. package/dist/assertions/collection.cjs +6 -0
  55. package/dist/assertions/collection.cjs.map +1 -1
  56. package/dist/assertions/collection.d.cts +4 -2
  57. package/dist/assertions/collection.d.mts +4 -2
  58. package/dist/assertions/collection.d.ts +4 -2
  59. package/dist/assertions/collection.js +12 -8
  60. package/dist/assertions/context-match.cjs +70 -0
  61. package/dist/assertions/context-match.cjs.map +1 -0
  62. package/dist/assertions/context-match.d.cts +107 -0
  63. package/dist/assertions/context-match.d.mts +107 -0
  64. package/dist/assertions/context-match.d.ts +107 -0
  65. package/dist/assertions/context-match.js +12 -0
  66. package/dist/assertions/context-match.js.map +1 -0
  67. package/dist/assertions/full-content.cjs +109 -0
  68. package/dist/assertions/full-content.cjs.map +1 -0
  69. package/dist/assertions/full-content.d.cts +6 -0
  70. package/dist/assertions/full-content.d.mts +6 -0
  71. package/dist/assertions/full-content.d.ts +6 -0
  72. package/dist/assertions/full-content.js +12 -0
  73. package/dist/assertions/full-content.js.map +1 -0
  74. package/dist/assertions/judge-presets.cjs +2 -34
  75. package/dist/assertions/judge-presets.cjs.map +1 -1
  76. package/dist/assertions/judge-presets.d.cts +6 -9
  77. package/dist/assertions/judge-presets.d.mts +6 -9
  78. package/dist/assertions/judge-presets.d.ts +6 -9
  79. package/dist/assertions/judge-presets.js +8 -8
  80. package/dist/assertions/judge.cjs +107 -29
  81. package/dist/assertions/judge.cjs.map +1 -1
  82. package/dist/assertions/judge.d.cts +2 -0
  83. package/dist/assertions/judge.d.mts +2 -0
  84. package/dist/assertions/judge.d.ts +2 -0
  85. package/dist/assertions/match.cjs +244 -5
  86. package/dist/assertions/match.cjs.map +1 -1
  87. package/dist/assertions/match.d.cts +43 -3
  88. package/dist/assertions/match.d.mts +43 -3
  89. package/dist/assertions/match.d.ts +43 -3
  90. package/dist/assertions/match.js +88 -78
  91. package/dist/assertions/material.cjs +520 -0
  92. package/dist/assertions/material.cjs.map +1 -0
  93. package/dist/assertions/material.d.cts +56 -0
  94. package/dist/assertions/material.d.mts +56 -0
  95. package/dist/assertions/material.d.ts +56 -0
  96. package/dist/assertions/material.js +20 -0
  97. package/dist/assertions/material.js.map +1 -0
  98. package/dist/assertions/record/attachment.cjs +5 -2
  99. package/dist/assertions/record/attachment.cjs.map +1 -1
  100. package/dist/assertions/record/codec.cjs +2 -1
  101. package/dist/assertions/record/codec.cjs.map +1 -1
  102. package/dist/assertions/record/model.cjs.map +1 -1
  103. package/dist/assertions/record/model.d.cts +6 -1
  104. package/dist/assertions/record/model.d.mts +6 -1
  105. package/dist/assertions/record/model.d.ts +6 -1
  106. package/dist/assertions/runtime.cjs +207 -14
  107. package/dist/assertions/runtime.cjs.map +1 -1
  108. package/dist/assertions/runtime.d.cts +9 -0
  109. package/dist/assertions/runtime.d.mts +9 -0
  110. package/dist/assertions/runtime.d.ts +9 -0
  111. package/dist/assertions/runtime.js +14 -8
  112. package/dist/assertions/score-match-audit.cjs +18 -8
  113. package/dist/assertions/score-match-audit.cjs.map +1 -1
  114. package/dist/assertions/score-match-gateway.cjs +83 -25
  115. package/dist/assertions/score-match-gateway.cjs.map +1 -1
  116. package/dist/assertions/score-match-gateway.d.cts +2 -0
  117. package/dist/assertions/score-match-gateway.d.mts +2 -0
  118. package/dist/assertions/score-match-gateway.d.ts +2 -0
  119. package/dist/assertions/value-composition.test-d.cjs +77 -0
  120. package/dist/assertions/value-composition.test-d.cjs.map +1 -0
  121. package/dist/assertions/value-composition.test-d.d.cts +1 -0
  122. package/dist/assertions/value-composition.test-d.d.mts +1 -0
  123. package/dist/assertions/value-composition.test-d.d.ts +1 -0
  124. package/dist/assertions/value-composition.test-d.js +4 -0
  125. package/dist/assertions/value-composition.test-d.js.map +1 -0
  126. package/dist/context/assert-first.cjs +207 -213
  127. package/dist/context/assert-first.cjs.map +1 -1
  128. package/dist/context/assert-first.d.cts +49 -23
  129. package/dist/context/assert-first.d.mts +49 -23
  130. package/dist/context/assert-first.d.ts +49 -23
  131. package/dist/context/session.cjs +111 -9
  132. package/dist/context/session.cjs.map +1 -1
  133. package/dist/context/session.d.cts +18 -0
  134. package/dist/context/session.d.mts +18 -0
  135. package/dist/context/session.d.ts +18 -0
  136. package/dist/define.cjs +17 -1
  137. package/dist/define.cjs.map +1 -1
  138. package/dist/eval/cli/contribution.cjs +2 -0
  139. package/dist/eval/cli/contribution.cjs.map +1 -1
  140. package/dist/eval/host/index.cjs +2 -0
  141. package/dist/eval/host/index.cjs.map +1 -1
  142. package/dist/eval/record/evaluation.cjs +3 -0
  143. package/dist/eval/record/evaluation.cjs.map +1 -1
  144. package/dist/eval/record/membership-provenance.d.cts +15 -15
  145. package/dist/eval/record/membership-provenance.d.mts +15 -15
  146. package/dist/eval/record/membership-provenance.d.ts +15 -15
  147. package/dist/eval/record/score.cjs +7 -0
  148. package/dist/eval/record/score.cjs.map +1 -1
  149. package/dist/eval/record/sealed-assertion.cjs +3 -0
  150. package/dist/eval/record/sealed-assertion.cjs.map +1 -1
  151. package/dist/eval/record/verdict.cjs +7 -0
  152. package/dist/eval/record/verdict.cjs.map +1 -1
  153. package/dist/expect/index.cjs +8 -2
  154. package/dist/expect/index.cjs.map +1 -1
  155. package/dist/expect/index.d.cts +9 -4
  156. package/dist/expect/index.d.mts +9 -4
  157. package/dist/expect/index.d.ts +9 -4
  158. package/dist/expect/index.js +72 -62
  159. package/dist/expect/index.mjs +72 -62
  160. package/dist/experiment/host/cli/contribution.cjs +37 -23
  161. package/dist/experiment/host/cli/contribution.cjs.map +1 -1
  162. package/dist/experiment/host/cli/contribution.d.cts +9 -1
  163. package/dist/experiment/host/cli/contribution.d.mts +9 -1
  164. package/dist/experiment/host/cli/contribution.d.ts +9 -1
  165. package/dist/experiment/host/current.cjs +74 -0
  166. package/dist/experiment/host/current.cjs.map +1 -0
  167. package/dist/experiment/host/current.d.cts +33 -0
  168. package/dist/experiment/host/current.d.mts +33 -0
  169. package/dist/experiment/host/current.d.ts +33 -0
  170. package/dist/experiment/host/current.js +10 -0
  171. package/dist/experiment/host/current.js.map +1 -0
  172. package/dist/experiment/host/index.cjs +17 -174
  173. package/dist/experiment/host/index.cjs.map +1 -1
  174. package/dist/experiment/host/index.d.cts +8 -54
  175. package/dist/experiment/host/index.d.mts +8 -54
  176. package/dist/experiment/host/index.d.ts +8 -54
  177. package/dist/experiment/host/operations.cjs +33 -10
  178. package/dist/experiment/host/operations.cjs.map +1 -1
  179. package/dist/experiment/host/operations.d.cts +29 -1
  180. package/dist/experiment/host/operations.d.mts +29 -1
  181. package/dist/experiment/host/operations.d.ts +29 -1
  182. package/dist/experiment/host/operations.js +6 -4
  183. package/dist/experiment/host/requirements.cjs +3 -0
  184. package/dist/experiment/host/requirements.cjs.map +1 -0
  185. package/dist/experiment/host/requirements.d.cts +3 -0
  186. package/dist/experiment/host/requirements.d.mts +3 -0
  187. package/dist/experiment/host/requirements.d.ts +3 -0
  188. package/dist/experiment/host/requirements.js +4 -0
  189. package/dist/experiment/host/requirements.js.map +1 -0
  190. package/dist/experiment/host/runtime.cjs +179 -0
  191. package/dist/experiment/host/runtime.cjs.map +1 -0
  192. package/dist/experiment/host/runtime.d.cts +79 -0
  193. package/dist/experiment/host/runtime.d.mts +79 -0
  194. package/dist/experiment/host/runtime.d.ts +79 -0
  195. package/dist/experiment/host/runtime.js +6 -0
  196. package/dist/experiment/host/runtime.js.map +1 -0
  197. package/dist/experiment/host/types.cjs.map +1 -1
  198. package/dist/experiment/host/types.d.cts +17 -16
  199. package/dist/experiment/host/types.d.mts +17 -16
  200. package/dist/experiment/host/types.d.ts +17 -16
  201. package/dist/fresh-import.cjs +2 -1
  202. package/dist/fresh-import.cjs.map +1 -1
  203. package/dist/index.cjs +4 -2
  204. package/dist/index.cjs.map +1 -1
  205. package/dist/index.d.cts +12 -6
  206. package/dist/index.d.mts +12 -6
  207. package/dist/index.d.ts +12 -6
  208. package/dist/index.js +32 -30
  209. package/dist/index.mjs +32 -30
  210. package/dist/inspection/artifacts.cjs +83 -54
  211. package/dist/inspection/artifacts.cjs.map +1 -1
  212. package/dist/inspection/artifacts.d.cts +8 -0
  213. package/dist/inspection/artifacts.d.mts +8 -0
  214. package/dist/inspection/artifacts.d.ts +8 -0
  215. package/dist/inspection/artifacts.js +2 -0
  216. package/dist/inspection/assertions.cjs +4 -1
  217. package/dist/inspection/assertions.cjs.map +1 -1
  218. package/dist/inspection/cli/contribution.cjs +27 -4
  219. package/dist/inspection/cli/contribution.cjs.map +1 -1
  220. package/dist/inspection/cli/contribution.d.cts +2 -1
  221. package/dist/inspection/cli/contribution.d.mts +2 -1
  222. package/dist/inspection/cli/contribution.d.ts +2 -1
  223. package/dist/inspection/execution-traces.cjs +114 -8
  224. package/dist/inspection/execution-traces.cjs.map +1 -1
  225. package/dist/inspection/execution-traces.d.cts +38 -0
  226. package/dist/inspection/execution-traces.d.mts +38 -0
  227. package/dist/inspection/execution-traces.d.ts +38 -0
  228. package/dist/inspection/facts.cjs +12 -0
  229. package/dist/inspection/facts.cjs.map +1 -1
  230. package/dist/inspection/limits.cjs +5 -1
  231. package/dist/inspection/limits.cjs.map +1 -1
  232. package/dist/inspection/limits.d.cts +4 -0
  233. package/dist/inspection/limits.d.mts +4 -0
  234. package/dist/inspection/limits.d.ts +4 -0
  235. package/dist/inspection/limits.js +6 -2
  236. package/dist/inspection/overview.cjs +74 -33
  237. package/dist/inspection/overview.cjs.map +1 -1
  238. package/dist/inspection/overview.d.cts +19 -1
  239. package/dist/inspection/overview.d.mts +19 -1
  240. package/dist/inspection/overview.d.ts +19 -1
  241. package/dist/inspection/overview.js +4 -2
  242. package/dist/inspection/project-input.cjs +9 -0
  243. package/dist/inspection/project-input.cjs.map +1 -0
  244. package/dist/inspection/project-input.d.cts +20 -0
  245. package/dist/inspection/project-input.d.mts +20 -0
  246. package/dist/inspection/project-input.d.ts +20 -0
  247. package/dist/inspection/project-input.js +8 -0
  248. package/dist/inspection/project-input.js.map +1 -0
  249. package/dist/inspection/project-result.cjs +60 -0
  250. package/dist/inspection/project-result.cjs.map +1 -0
  251. package/dist/inspection/project-result.d.cts +1264 -0
  252. package/dist/inspection/project-result.d.mts +1264 -0
  253. package/dist/inspection/project-result.d.ts +1264 -0
  254. package/dist/inspection/project-result.js +10 -0
  255. package/dist/inspection/project-result.js.map +1 -0
  256. package/dist/inspection/project-source.cjs +109 -0
  257. package/dist/inspection/project-source.cjs.map +1 -0
  258. package/dist/inspection/project-source.d.cts +10 -0
  259. package/dist/inspection/project-source.d.mts +10 -0
  260. package/dist/inspection/project-source.d.ts +10 -0
  261. package/dist/inspection/project-source.js +6 -0
  262. package/dist/inspection/project-source.js.map +1 -0
  263. package/dist/inspection/project.cjs +100 -0
  264. package/dist/inspection/project.cjs.map +1 -0
  265. package/dist/inspection/project.d.cts +3 -0
  266. package/dist/inspection/project.d.mts +3 -0
  267. package/dist/inspection/project.d.ts +3 -0
  268. package/dist/inspection/project.js +6 -0
  269. package/dist/inspection/project.js.map +1 -0
  270. package/dist/inspection/protocol.cjs +19 -9
  271. package/dist/inspection/protocol.cjs.map +1 -1
  272. package/dist/inspection/protocol.d.cts +5506 -38189
  273. package/dist/inspection/protocol.d.mts +5506 -38189
  274. package/dist/inspection/protocol.d.ts +5506 -38189
  275. package/dist/inspection/public.mjs +896 -84
  276. package/dist/inspection/query.cjs +2 -0
  277. package/dist/inspection/query.cjs.map +1 -1
  278. package/dist/inspection/results.cjs +234 -29
  279. package/dist/inspection/results.cjs.map +1 -1
  280. package/dist/inspection/results.d.cts +870 -13
  281. package/dist/inspection/results.d.mts +870 -13
  282. package/dist/inspection/results.d.ts +870 -13
  283. package/dist/inspection/results.js +36 -34
  284. package/dist/inspection/select.cjs +126 -14
  285. package/dist/inspection/select.cjs.map +1 -1
  286. package/dist/inspection/select.d.cts +1 -1
  287. package/dist/inspection/select.d.mts +1 -1
  288. package/dist/inspection/select.d.ts +1 -1
  289. package/dist/inspection/source.cjs +4 -0
  290. package/dist/inspection/source.cjs.map +1 -1
  291. package/dist/inspection/sources.cjs +5 -0
  292. package/dist/inspection/sources.cjs.map +1 -1
  293. package/dist/inspection/trace.cjs +82 -84
  294. package/dist/inspection/trace.cjs.map +1 -1
  295. package/dist/inspection/trace.d.cts +7 -2
  296. package/dist/inspection/trace.d.mts +7 -2
  297. package/dist/inspection/trace.d.ts +7 -2
  298. package/dist/model-slots.cjs +35 -0
  299. package/dist/model-slots.cjs.map +1 -0
  300. package/dist/model-slots.d.cts +19 -0
  301. package/dist/model-slots.d.mts +19 -0
  302. package/dist/model-slots.d.ts +19 -0
  303. package/dist/model-slots.js +8 -0
  304. package/dist/model-slots.js.map +1 -0
  305. package/dist/o11y/adapter-call-price.cjs +4 -0
  306. package/dist/o11y/adapter-call-price.cjs.map +1 -1
  307. package/dist/o11y/adapter-call-price.d.cts +24 -0
  308. package/dist/o11y/adapter-call-price.d.mts +24 -0
  309. package/dist/o11y/adapter-call-price.d.ts +24 -0
  310. package/dist/o11y/adapter-call-price.js +6 -2
  311. package/dist/o11y/adapter-usage-projection.cjs +158 -0
  312. package/dist/o11y/adapter-usage-projection.cjs.map +1 -0
  313. package/dist/o11y/adapter-usage-projection.d.cts +141 -0
  314. package/dist/o11y/adapter-usage-projection.d.mts +141 -0
  315. package/dist/o11y/adapter-usage-projection.d.ts +141 -0
  316. package/dist/o11y/adapter-usage-projection.js +20 -0
  317. package/dist/o11y/adapter-usage-projection.js.map +1 -0
  318. package/dist/o11y/eval-usage.cjs +149 -0
  319. package/dist/o11y/eval-usage.cjs.map +1 -0
  320. package/dist/o11y/eval-usage.d.cts +46 -0
  321. package/dist/o11y/eval-usage.d.mts +46 -0
  322. package/dist/o11y/eval-usage.d.ts +46 -0
  323. package/dist/o11y/eval-usage.js +8 -0
  324. package/dist/o11y/eval-usage.js.map +1 -0
  325. package/dist/o11y/judge-call-price.cjs +62 -0
  326. package/dist/o11y/judge-call-price.cjs.map +1 -0
  327. package/dist/o11y/judge-call-price.d.cts +3 -0
  328. package/dist/o11y/judge-call-price.d.mts +3 -0
  329. package/dist/o11y/judge-call-price.d.ts +3 -0
  330. package/dist/o11y/judge-call-price.js +6 -0
  331. package/dist/o11y/judge-call-price.js.map +1 -0
  332. package/dist/o11y/judge-usage-projection.cjs +134 -0
  333. package/dist/o11y/judge-usage-projection.cjs.map +1 -0
  334. package/dist/o11y/judge-usage-projection.d.cts +18 -0
  335. package/dist/o11y/judge-usage-projection.d.mts +18 -0
  336. package/dist/o11y/judge-usage-projection.d.ts +18 -0
  337. package/dist/o11y/judge-usage-projection.js +20 -0
  338. package/dist/o11y/judge-usage-projection.js.map +1 -0
  339. package/dist/o11y/judge-usage-receipt.cjs +135 -0
  340. package/dist/o11y/judge-usage-receipt.cjs.map +1 -0
  341. package/dist/o11y/judge-usage-receipt.d.cts +5 -0
  342. package/dist/o11y/judge-usage-receipt.d.mts +5 -0
  343. package/dist/o11y/judge-usage-receipt.d.ts +5 -0
  344. package/dist/o11y/judge-usage-receipt.js +6 -0
  345. package/dist/o11y/judge-usage-receipt.js.map +1 -0
  346. package/dist/o11y/judge-usage.cjs +171 -0
  347. package/dist/o11y/judge-usage.cjs.map +1 -0
  348. package/dist/o11y/judge-usage.d.cts +35 -0
  349. package/dist/o11y/judge-usage.d.mts +35 -0
  350. package/dist/o11y/judge-usage.d.ts +35 -0
  351. package/dist/o11y/judge-usage.js +6 -0
  352. package/dist/o11y/judge-usage.js.map +1 -0
  353. package/dist/plugin/contracts.cjs +2 -0
  354. package/dist/plugin/contracts.cjs.map +1 -1
  355. package/dist/plugin/link.cjs +7 -0
  356. package/dist/plugin/link.cjs.map +1 -1
  357. package/dist/record/attachment/protocol.cjs +8 -6
  358. package/dist/record/attachment/protocol.cjs.map +1 -1
  359. package/dist/record/attachment/protocol.d.cts +10 -0
  360. package/dist/record/attachment/protocol.d.mts +10 -0
  361. package/dist/record/attachment/protocol.d.ts +10 -0
  362. package/dist/record/attachment/protocol.js +38 -36
  363. package/dist/record/codec/seal-manifest.d.cts +3 -3
  364. package/dist/record/codec/seal-manifest.d.mts +3 -3
  365. package/dist/record/codec/seal-manifest.d.ts +3 -3
  366. package/dist/record/family/adapter-usage/definition.d.cts +1 -0
  367. package/dist/record/family/adapter-usage/definition.d.mts +1 -0
  368. package/dist/record/family/adapter-usage/definition.d.ts +1 -0
  369. package/dist/record/family/adapter-usage/persistence.cjs +1 -1
  370. package/dist/record/family/adapter-usage/persistence.cjs.map +1 -1
  371. package/dist/record/family/adapter-usage/persistence.d.cts +2 -1
  372. package/dist/record/family/adapter-usage/persistence.d.mts +2 -1
  373. package/dist/record/family/adapter-usage/persistence.d.ts +2 -1
  374. package/dist/record/family/adapter-usage/schema.cjs +21 -2
  375. package/dist/record/family/adapter-usage/schema.cjs.map +1 -1
  376. package/dist/record/family/adapter-usage/schema.d.cts +85 -0
  377. package/dist/record/family/adapter-usage/schema.d.mts +85 -0
  378. package/dist/record/family/adapter-usage/schema.d.ts +85 -0
  379. package/dist/record/family/adapter-usage/schema.js +18 -12
  380. package/dist/record/family/catalog.cjs +31 -27
  381. package/dist/record/family/catalog.cjs.map +1 -1
  382. package/dist/record/family/catalog.d.cts +94 -3
  383. package/dist/record/family/catalog.d.mts +94 -3
  384. package/dist/record/family/catalog.d.ts +94 -3
  385. package/dist/record/family/current.cjs +45 -42
  386. package/dist/record/family/current.cjs.map +1 -1
  387. package/dist/record/family/current.d.cts +240 -1
  388. package/dist/record/family/current.d.mts +240 -1
  389. package/dist/record/family/current.d.ts +240 -1
  390. package/dist/record/family/execution-traces/definition.d.cts +26 -0
  391. package/dist/record/family/execution-traces/definition.d.mts +26 -0
  392. package/dist/record/family/execution-traces/definition.d.ts +26 -0
  393. package/dist/record/family/execution-traces/definition.js +20 -14
  394. package/dist/record/family/execution-traces/schema.cjs +57 -1
  395. package/dist/record/family/execution-traces/schema.cjs.map +1 -1
  396. package/dist/record/family/execution-traces/schema.d.cts +114 -0
  397. package/dist/record/family/execution-traces/schema.d.mts +114 -0
  398. package/dist/record/family/execution-traces/schema.d.ts +114 -0
  399. package/dist/record/family/execution-traces/schema.js +18 -12
  400. package/dist/record/family/judge-usage/definition.cjs +12 -0
  401. package/dist/record/family/judge-usage/definition.cjs.map +1 -0
  402. package/dist/record/family/judge-usage/definition.d.cts +91 -0
  403. package/dist/record/family/judge-usage/definition.d.mts +91 -0
  404. package/dist/record/family/judge-usage/definition.d.ts +91 -0
  405. package/dist/record/family/judge-usage/definition.js +6 -0
  406. package/dist/record/family/judge-usage/definition.js.map +1 -0
  407. package/dist/record/family/judge-usage/persistence.cjs +10 -0
  408. package/dist/record/family/judge-usage/persistence.cjs.map +1 -0
  409. package/dist/record/family/judge-usage/persistence.d.cts +91 -0
  410. package/dist/record/family/judge-usage/persistence.d.mts +91 -0
  411. package/dist/record/family/judge-usage/persistence.d.ts +91 -0
  412. package/dist/record/family/judge-usage/persistence.js +6 -0
  413. package/dist/record/family/judge-usage/persistence.js.map +1 -0
  414. package/dist/record/family/judge-usage/schema.cjs +307 -0
  415. package/dist/record/family/judge-usage/schema.cjs.map +1 -0
  416. package/dist/record/family/judge-usage/schema.d.cts +351 -0
  417. package/dist/record/family/judge-usage/schema.d.mts +351 -0
  418. package/dist/record/family/judge-usage/schema.d.ts +351 -0
  419. package/dist/record/family/judge-usage/schema.js +18 -0
  420. package/dist/record/family/judge-usage/schema.js.map +1 -0
  421. package/dist/record/host/sqlite-host.cjs +55 -9
  422. package/dist/record/host/sqlite-host.cjs.map +1 -1
  423. package/dist/record/host/types.cjs.map +1 -1
  424. package/dist/record/host/types.d.cts +7 -0
  425. package/dist/record/host/types.d.mts +7 -0
  426. package/dist/record/host/types.d.ts +7 -0
  427. package/dist/record/model/run-context.cjs +7 -1
  428. package/dist/record/model/run-context.cjs.map +1 -1
  429. package/dist/record/model/run-context.d.cts +4 -0
  430. package/dist/record/model/run-context.d.mts +4 -0
  431. package/dist/record/model/run-context.d.ts +4 -0
  432. package/dist/record/model/seal-manifest.d.cts +1 -1
  433. package/dist/record/model/seal-manifest.d.mts +1 -1
  434. package/dist/record/model/seal-manifest.d.ts +1 -1
  435. package/dist/record/sqlite/client.cjs +18 -5
  436. package/dist/record/sqlite/client.cjs.map +1 -1
  437. package/dist/record/sqlite/client.d.cts +1 -1
  438. package/dist/record/sqlite/client.d.mts +1 -1
  439. package/dist/record/sqlite/client.d.ts +1 -1
  440. package/dist/record/sqlite/project-state-database.cjs +29 -8
  441. package/dist/record/sqlite/project-state-database.cjs.map +1 -1
  442. package/dist/run/host/runtime.cjs +4 -0
  443. package/dist/run/host/runtime.cjs.map +1 -1
  444. package/dist/run/storage/sqlite.cjs +20 -0
  445. package/dist/run/storage/sqlite.cjs.map +1 -1
  446. package/dist/runner/adapter-execution-trace.cjs +125 -2
  447. package/dist/runner/adapter-execution-trace.cjs.map +1 -1
  448. package/dist/runner/adapter-execution-trace.d.cts +1 -1
  449. package/dist/runner/adapter-execution-trace.d.mts +1 -1
  450. package/dist/runner/adapter-execution-trace.d.ts +1 -1
  451. package/dist/runner/adapter-usage.cjs +55 -7
  452. package/dist/runner/adapter-usage.cjs.map +1 -1
  453. package/dist/runner/adapter-usage.d.cts +9 -2
  454. package/dist/runner/adapter-usage.d.mts +9 -2
  455. package/dist/runner/adapter-usage.d.ts +9 -2
  456. package/dist/runner/adoption.cjs +9 -0
  457. package/dist/runner/adoption.cjs.map +1 -1
  458. package/dist/runner/attempt-cancellation.cjs +12 -0
  459. package/dist/runner/attempt-cancellation.cjs.map +1 -0
  460. package/dist/runner/attempt-cancellation.d.cts +6 -0
  461. package/dist/runner/attempt-cancellation.d.mts +6 -0
  462. package/dist/runner/attempt-cancellation.d.ts +6 -0
  463. package/dist/runner/attempt-cancellation.js +6 -0
  464. package/dist/runner/attempt-cancellation.js.map +1 -0
  465. package/dist/runner/attempt-resources.cjs +10 -4
  466. package/dist/runner/attempt-resources.cjs.map +1 -1
  467. package/dist/runner/attempt-resources.d.cts +2 -1
  468. package/dist/runner/attempt-resources.d.mts +2 -1
  469. package/dist/runner/attempt-resources.d.ts +2 -1
  470. package/dist/runner/attempt.cjs +1177 -1139
  471. package/dist/runner/attempt.cjs.map +1 -1
  472. package/dist/runner/config-identity.cjs +20 -1
  473. package/dist/runner/config-identity.cjs.map +1 -1
  474. package/dist/runner/config-identity.d.cts +5 -0
  475. package/dist/runner/config-identity.d.mts +5 -0
  476. package/dist/runner/config-identity.d.ts +5 -0
  477. package/dist/runner/discover.cjs +14 -0
  478. package/dist/runner/discover.cjs.map +1 -1
  479. package/dist/runner/discover.d.cts +3 -0
  480. package/dist/runner/discover.d.mts +3 -0
  481. package/dist/runner/discover.d.ts +3 -0
  482. package/dist/runner/feedback/human.cjs +9 -4
  483. package/dist/runner/feedback/human.cjs.map +1 -1
  484. package/dist/runner/fingerprint.cjs +1 -0
  485. package/dist/runner/fingerprint.cjs.map +1 -1
  486. package/dist/runner/judge-usage.cjs +18 -0
  487. package/dist/runner/judge-usage.cjs.map +1 -0
  488. package/dist/runner/judge-usage.d.cts +5 -0
  489. package/dist/runner/judge-usage.d.mts +5 -0
  490. package/dist/runner/judge-usage.d.ts +5 -0
  491. package/dist/runner/judge-usage.js +8 -0
  492. package/dist/runner/judge-usage.js.map +1 -0
  493. package/dist/runner/project-target.cjs.map +1 -1
  494. package/dist/runner/project-target.d.cts +2 -0
  495. package/dist/runner/project-target.d.mts +2 -0
  496. package/dist/runner/project-target.d.ts +2 -0
  497. package/dist/runner/record/planning.cjs +1 -0
  498. package/dist/runner/record/planning.cjs.map +1 -1
  499. package/dist/runner/record.cjs +4 -0
  500. package/dist/runner/record.cjs.map +1 -1
  501. package/dist/runner/reporters/braintrust.cjs +2 -0
  502. package/dist/runner/reporters/braintrust.cjs.map +1 -1
  503. package/dist/runner/reuse-diagnostics.cjs +9 -10
  504. package/dist/runner/reuse-diagnostics.cjs.map +1 -1
  505. package/dist/runner/reuse-diagnostics.d.cts +5 -6
  506. package/dist/runner/reuse-diagnostics.d.mts +5 -6
  507. package/dist/runner/reuse-diagnostics.d.ts +5 -6
  508. package/dist/runner/reuse-diagnostics.js +4 -4
  509. package/dist/runner/reuse-plan.cjs +100 -48
  510. package/dist/runner/reuse-plan.cjs.map +1 -1
  511. package/dist/runner/reuse-plan.d.cts +60 -3
  512. package/dist/runner/reuse-plan.d.mts +60 -3
  513. package/dist/runner/reuse-plan.d.ts +60 -3
  514. package/dist/runner/reuse-plan.js +14 -10
  515. package/dist/runner/run.cjs +8 -6
  516. package/dist/runner/run.cjs.map +1 -1
  517. package/dist/runner/session.cjs +1 -1
  518. package/dist/runner/session.cjs.map +1 -1
  519. package/dist/runner/session.d.cts +1 -1
  520. package/dist/runner/session.d.mts +1 -1
  521. package/dist/runner/session.d.ts +1 -1
  522. package/dist/runner/source-producer.cjs +3 -1
  523. package/dist/runner/source-producer.cjs.map +1 -1
  524. package/dist/runner/types.cjs.map +1 -1
  525. package/dist/runner/types.d.cts +26 -5
  526. package/dist/runner/types.d.mts +26 -5
  527. package/dist/runner/types.d.ts +26 -5
  528. package/dist/sandbox/action.cjs +3 -0
  529. package/dist/sandbox/action.cjs.map +1 -1
  530. package/dist/sandbox/commands.cjs +3 -0
  531. package/dist/sandbox/commands.cjs.map +1 -1
  532. package/dist/sandbox/compose.cjs +6 -0
  533. package/dist/sandbox/compose.cjs.map +1 -1
  534. package/dist/sandbox/docker-profile/registry.cjs +7 -0
  535. package/dist/sandbox/docker-profile/registry.cjs.map +1 -1
  536. package/dist/sandbox/docker-profile/runtime.cjs +3 -0
  537. package/dist/sandbox/docker-profile/runtime.cjs.map +1 -1
  538. package/dist/sandbox/docker-profile/schema.cjs +7 -0
  539. package/dist/sandbox/docker-profile/schema.cjs.map +1 -1
  540. package/dist/sandbox/incus.cjs +7 -0
  541. package/dist/sandbox/incus.cjs.map +1 -1
  542. package/dist/sandbox/layer.cjs +12 -0
  543. package/dist/sandbox/layer.cjs.map +1 -1
  544. package/dist/shared/adapter-cleanup.cjs +18 -0
  545. package/dist/shared/adapter-cleanup.cjs.map +1 -0
  546. package/dist/shared/adapter-cleanup.d.cts +4 -0
  547. package/dist/shared/adapter-cleanup.d.mts +4 -0
  548. package/dist/shared/adapter-cleanup.d.ts +4 -0
  549. package/dist/shared/adapter-cleanup.js +10 -0
  550. package/dist/shared/adapter-cleanup.js.map +1 -0
  551. package/dist/shared/attempt-lifecycle.cjs +3 -0
  552. package/dist/shared/attempt-lifecycle.cjs.map +1 -0
  553. package/dist/shared/attempt-lifecycle.d.cts +13 -0
  554. package/dist/shared/attempt-lifecycle.d.mts +13 -0
  555. package/dist/shared/attempt-lifecycle.d.ts +13 -0
  556. package/dist/shared/attempt-lifecycle.js +4 -0
  557. package/dist/shared/attempt-lifecycle.js.map +1 -0
  558. package/dist/show/contribution.cjs +52 -14
  559. package/dist/show/contribution.cjs.map +1 -1
  560. package/dist/show/contribution.d.cts +23 -1
  561. package/dist/show/contribution.d.mts +23 -1
  562. package/dist/show/contribution.d.ts +23 -1
  563. package/dist/show/model.cjs +8 -1
  564. package/dist/show/model.cjs.map +1 -1
  565. package/dist/show/model.d.cts +10 -1
  566. package/dist/show/model.d.mts +10 -1
  567. package/dist/show/model.d.ts +10 -1
  568. package/dist/show/render.cjs +287 -49
  569. package/dist/show/render.cjs.map +1 -1
  570. package/dist/show/render.d.cts +3 -0
  571. package/dist/show/render.d.mts +3 -0
  572. package/dist/show/render.d.ts +3 -0
  573. package/dist/sources/projector.cjs +3 -0
  574. package/dist/sources/projector.cjs.map +1 -1
  575. package/dist/types.cjs.map +1 -1
  576. package/dist/types.d.cts +1 -1
  577. package/dist/types.d.mts +1 -1
  578. package/dist/types.d.ts +1 -1
  579. package/dist/view/app-dist/.vite/manifest.json +2 -2
  580. package/dist/view/app-dist/assets/index-CmVoXbwG.js +63 -0
  581. package/dist/view/app-dist/assets/{quality-cost-scatter-CFB3wnkN.js → quality-cost-scatter-BuLISaH4.js} +1 -1
  582. package/dist/view/app-dist/index.html +1 -1
  583. package/dist/view/cli/contribution.cjs +54 -21
  584. package/dist/view/cli/contribution.cjs.map +1 -1
  585. package/dist/view/cli/contribution.d.cts +2 -1
  586. package/dist/view/cli/contribution.d.mts +2 -1
  587. package/dist/view/cli/contribution.d.ts +2 -1
  588. package/dist/view/function-runtime.mjs +13231 -11647
  589. package/dist/view/http-protocol.cjs +3 -0
  590. package/dist/view/http-protocol.cjs.map +1 -1
  591. package/dist/view/http-protocol.d.cts +8 -0
  592. package/dist/view/http-protocol.d.mts +8 -0
  593. package/dist/view/http-protocol.d.ts +8 -0
  594. package/dist/view/inspection-host.cjs +17 -1
  595. package/dist/view/inspection-host.cjs.map +1 -1
  596. package/dist/view/render.cjs +1 -0
  597. package/dist/view/render.cjs.map +1 -1
  598. package/dist/view/render.d.cts +2 -1
  599. package/dist/view/render.d.mts +2 -1
  600. package/dist/view/render.d.ts +2 -1
  601. package/dist/view/revision.cjs.map +1 -1
  602. package/dist/view/revision.d.cts +12 -0
  603. package/dist/view/revision.d.mts +12 -0
  604. package/dist/view/revision.d.ts +12 -0
  605. package/dist/view/server.cjs +10 -9
  606. package/dist/view/server.cjs.map +1 -1
  607. package/docs-site/zh/examples/ai-agent-application.mdx +1 -1
  608. package/docs-site/zh/explanation/adapter.mdx +2 -2
  609. package/docs-site/zh/explanation/assert.mdx +60 -24
  610. package/docs-site/zh/explanation/drive.mdx +1 -1
  611. package/docs-site/zh/explanation/evals.mdx +31 -29
  612. package/docs-site/zh/explanation/experiment.mdx +15 -15
  613. package/docs-site/zh/explanation/judge.mdx +23 -15
  614. package/docs-site/zh/explanation/overview.mdx +44 -21
  615. package/docs-site/zh/explanation/record.mdx +28 -13
  616. package/docs-site/zh/explanation/results-flow.mdx +37 -0
  617. package/docs-site/zh/explanation/runner.mdx +27 -6
  618. package/docs-site/zh/index.mdx +22 -115
  619. package/docs-site/zh/introduction.mdx +89 -61
  620. package/docs-site/zh/reference/cli.mdx +50 -26
  621. package/docs-site/zh/reference/define-agent.mdx +37 -5
  622. package/docs-site/zh/reference/define-eval.mdx +130 -29
  623. package/docs-site/zh/reference/define-experiment.mdx +251 -0
  624. package/docs-site/zh/reference/events.mdx +34 -30
  625. package/docs-site/zh/reference/expect.mdx +77 -2
  626. package/docs-site/zh/reference/official-adapters.mdx +2 -2
  627. package/docs-site/zh/troubleshooting/debug-sandbox.mdx +43 -24
  628. package/docs-site/zh/troubleshooting/debugging.mdx +65 -42
  629. package/docs-site/zh/troubleshooting/recover-after-kill.mdx +35 -28
  630. package/docs-site/zh/tutorials/accept-results.mdx +34 -24
  631. package/docs-site/zh/tutorials/agent-feedback-loop.mdx +74 -43
  632. package/docs-site/zh/tutorials/agent-onboarding.mdx +27 -20
  633. package/docs-site/zh/tutorials/authoring.mdx +138 -121
  634. package/docs-site/zh/tutorials/ci-integration.mdx +46 -22
  635. package/docs-site/zh/tutorials/compare-runs.mdx +40 -13
  636. package/docs-site/zh/tutorials/concurrency.mdx +66 -62
  637. package/docs-site/zh/tutorials/configuration.mdx +17 -17
  638. package/docs-site/zh/tutorials/connect-otel.mdx +48 -37
  639. package/docs-site/zh/tutorials/connect-your-agent.mdx +80 -173
  640. package/docs-site/zh/tutorials/control-run-cost.mdx +63 -12
  641. package/docs-site/zh/tutorials/criteria-files.mdx +28 -21
  642. package/docs-site/zh/tutorials/custom-application.mdx +75 -55
  643. package/docs-site/zh/tutorials/dataset-fanout.mdx +32 -22
  644. package/docs-site/zh/tutorials/debug-lifecycle-plan.mdx +38 -31
  645. package/docs-site/zh/tutorials/docker-in-docker.mdx +83 -89
  646. package/docs-site/zh/tutorials/eval-groups.mdx +70 -89
  647. package/docs-site/zh/tutorials/evaluation-kinds.mdx +12 -5
  648. package/docs-site/zh/tutorials/experiment-services.mdx +243 -0
  649. package/docs-site/zh/tutorials/fixtures.mdx +42 -26
  650. package/docs-site/zh/tutorials/handle-execution-failures.mdx +41 -19
  651. package/docs-site/zh/tutorials/install-custom-sandbox-agent.mdx +21 -16
  652. package/docs-site/zh/tutorials/niceeval-taste-application.mdx +394 -0
  653. package/docs-site/zh/tutorials/niceeval-taste.mdx +190 -0
  654. package/docs-site/zh/tutorials/nixos-managed-dind.mdx +51 -39
  655. package/docs-site/zh/tutorials/plugins.mdx +55 -31
  656. package/docs-site/zh/tutorials/prebuilt-sandbox.mdx +204 -0
  657. package/docs-site/zh/tutorials/quickstart.mdx +91 -47
  658. package/docs-site/zh/tutorials/reporters.mdx +45 -30
  659. package/docs-site/zh/tutorials/rerun-and-cache.mdx +39 -40
  660. package/docs-site/zh/tutorials/sandbox-agent.mdx +65 -40
  661. package/docs-site/zh/tutorials/sandbox-providers.mdx +104 -282
  662. package/docs-site/zh/tutorials/sandbox-reuse.mdx +65 -97
  663. package/docs-site/zh/tutorials/select-and-preview.mdx +25 -20
  664. package/docs-site/zh/tutorials/verify-judge.mdx +49 -26
  665. package/docs-site/zh/tutorials/viewing-results.mdx +130 -80
  666. package/docs-site/zh/tutorials/write-experiment.mdx +116 -298
  667. package/docs-site/zh/tutorials/write-send.mdx +53 -52
  668. package/node_modules/undici/docs/docs/api/Agent.md +8 -8
  669. package/node_modules/undici/docs/docs/api/DiagnosticsChannel.md +9 -6
  670. package/node_modules/undici/docs/docs/api/Errors.md +25 -0
  671. package/node_modules/undici/docs/docs/api/Interceptors.md +4 -3
  672. package/node_modules/undici/docs/docs/api/Pool.md +5 -6
  673. package/node_modules/undici/lib/api/readable.js +1 -2
  674. package/node_modules/undici/lib/core/request.js +23 -2
  675. package/node_modules/undici/lib/core/util.js +0 -39
  676. package/node_modules/undici/lib/dispatcher/client-h1.js +11 -4
  677. package/node_modules/undici/lib/dispatcher/client-h2.js +52 -8
  678. package/node_modules/undici/lib/dispatcher/client.js +1 -1
  679. package/node_modules/undici/lib/dispatcher/dispatcher1-wrapper.js +3 -2
  680. package/node_modules/undici/lib/dispatcher/env-http-proxy-agent.js +21 -6
  681. package/node_modules/undici/lib/dispatcher/pool-base.js +63 -2
  682. package/node_modules/undici/lib/dispatcher/pool.js +90 -7
  683. package/node_modules/undici/lib/dispatcher/proxy-agent.js +16 -3
  684. package/node_modules/undici/lib/handler/deduplication-handler.js +24 -11
  685. package/node_modules/undici/lib/handler/redirect-handler.js +5 -0
  686. package/node_modules/undici/lib/handler/retry-handler.js +72 -13
  687. package/node_modules/undici/lib/interceptor/cache.js +4 -1
  688. package/node_modules/undici/lib/interceptor/decompress.js +236 -69
  689. package/node_modules/undici/lib/web/cache/cache.js +17 -8
  690. package/node_modules/undici/lib/web/cache/cachestorage.js +11 -5
  691. package/node_modules/undici/lib/web/cookies/index.js +19 -7
  692. package/node_modules/undici/lib/web/cookies/util.js +3 -1
  693. package/node_modules/undici/lib/web/eventsource/eventsource.js +25 -1
  694. package/node_modules/undici/lib/web/fetch/body.js +22 -15
  695. package/node_modules/undici/lib/web/fetch/data-url.js +6 -6
  696. package/node_modules/undici/lib/web/fetch/formdata.js +30 -36
  697. package/node_modules/undici/lib/web/fetch/headers.js +34 -31
  698. package/node_modules/undici/lib/web/fetch/index.js +38 -14
  699. package/node_modules/undici/lib/web/fetch/request.js +74 -79
  700. package/node_modules/undici/lib/web/fetch/response.js +43 -44
  701. package/node_modules/undici/lib/web/fetch/util.js +7 -7
  702. package/node_modules/undici/lib/web/infra/index.js +16 -1
  703. package/node_modules/undici/lib/web/webidl/index.js +2 -14
  704. package/node_modules/undici/lib/web/websocket/events.js +43 -26
  705. package/node_modules/undici/lib/web/websocket/receiver.js +5 -0
  706. package/node_modules/undici/lib/web/websocket/stream/websocketerror.js +13 -10
  707. package/node_modules/undici/lib/web/websocket/websocket.js +44 -41
  708. package/node_modules/undici/package.json +1 -1
  709. package/node_modules/undici/types/diagnostics-channel.d.ts +2 -1
  710. package/node_modules/undici/types/interceptors.d.ts +1 -1
  711. package/node_modules/undici/types/webidl.d.ts +13 -7
  712. package/package.json +4 -4
  713. package/dist/view/app-dist/assets/index-DFzw1L97.js +0 -63
  714. package/docs-site/zh/tutorials/experiments.mdx +0 -101
@@ -127,6 +127,15 @@ class SessionManager {
127
127
  evidenceCoverage;
128
128
  /** 自动重试吸收的物理 send 失败;不混进 allEvents。 */
129
129
  retryAttempts = [];
130
+ usageContributions = [];
131
+ /** A frozen call-time copy; terminal replacement never changes an earlier pending cut. */
132
+ usageContributionsSnapshot() {
133
+ return Object.freeze(this.usageContributions.map((contribution) => Object.freeze({
134
+ ...contribution,
135
+ usage: contribution.usage === null ? null : Object.freeze({ ...contribution.usage }),
136
+ coverage: Object.freeze({ ...contribution.coverage }),
137
+ })));
138
+ }
130
139
  /** 归属到本 attempt 的 span(逐轮攒;attempt 末尾连同 sweep 的迟到 span 一起挂 trace)。 */
131
140
  otelSpans = [];
132
141
  /** 本 attempt 各轮的 traceId(attempt 末尾按它 sweep 迟到 span)。 */
@@ -151,6 +160,7 @@ class SessionManager {
151
160
  localSourceOrder = 0;
152
161
  nextSourceOrder;
153
162
  observedIngestion;
163
+ observedTurnStates = new WeakMap();
154
164
  constructor(deps) {
155
165
  this.deps = deps;
156
166
  this.nextSourceOrder = deps.nextSourceOrder ?? (() => ++this.localSourceOrder);
@@ -167,11 +177,38 @@ class SessionManager {
167
177
  observedAttemptCut() {
168
178
  return this.observedIngestion.attemptCut();
169
179
  }
180
+ /** A frozen call-time cut of all sealed sends, including failed sends without a Turn. */
181
+ observedSessionSnapshots() {
182
+ return Object.freeze(this.sessions.map((session) => session.observedSnapshot()));
183
+ }
184
+ observedTurnState(snapshot) {
185
+ return this.observedTurnStates.get(snapshot);
186
+ }
187
+ /** Absorbed retry events have no sealed observed identities to include in default history. */
188
+ observedHistoryIncompleteReason() {
189
+ return this.retryAttempts.some((attempt) => attempt.events.length > 0)
190
+ ? "agent-retry-history-unsealed"
191
+ : undefined;
192
+ }
170
193
  observedEvaluationSegment(snapshot) {
171
194
  return this.observedIngestion.evaluationSegment(snapshot);
172
195
  }
173
196
  releaseObservedEvaluationSegments() {
174
197
  this.observedIngestion.releaseEvaluationSegments();
198
+ this.observedTurnStates = new WeakMap();
199
+ }
200
+ recordObservedTurnState(snapshot, outcome, coverage) {
201
+ this.observedTurnStates.set(snapshot, Object.freeze({
202
+ outcome,
203
+ coverage: Object.freeze({
204
+ events: Object.freeze({ ...coverage.events }),
205
+ messages: Object.freeze({ ...coverage.messages }),
206
+ actions: Object.freeze({ ...coverage.actions }),
207
+ status: Object.freeze({ ...coverage.status }),
208
+ usage: Object.freeze({ ...coverage.usage }),
209
+ data: Object.freeze({ ...coverage.data }),
210
+ }),
211
+ }));
175
212
  }
176
213
  mintPhysicalTurnId() {
177
214
  const turnId = (0, model_ts_1.entityIdFromEntropy)("turn", (0, node_crypto_1.randomBytes)(16));
@@ -301,9 +338,15 @@ class SessionManager {
301
338
  })));
302
339
  // turn 级重试只包这一次物理 agent send。SDK Promise 在这两个
303
340
  // Effect.tryPromise 边界适配;retry 本身不再包含手写 Promise / timeout。
341
+ let sendAttempt = 0;
342
+ const observeUsage = (callOnce) => this.recordSendUsageEffect(callOnce, () => ({
343
+ sessionScopeId: session.sessionScopeId,
344
+ turnId,
345
+ sendAttempt: sendAttempt++,
346
+ }));
304
347
  const sendOnce = this.deps.otel
305
- ? this.sendWithOtelEffect(this.deps.otel, { text, files, responses }, ctx)
306
- : this.sendAgentEffect({ text, files, responses }, ctx).pipe(effect_1.Effect.map((turn) => ({ turn })));
348
+ ? this.sendWithOtelEffect(this.deps.otel, { text, files, responses }, ctx, observeUsage)
349
+ : this.sendAgentEffect({ text, files, responses }, ctx, observeUsage).pipe(effect_1.Effect.map((turn) => ({ turn })));
307
350
  const retryDeps = {
308
351
  classifier: this.deps.agent.classifySendFailure,
309
352
  experimentClassifier: this.deps.experimentClassifier,
@@ -347,9 +390,10 @@ class SessionManager {
347
390
  const { turn, traceId, attribution, window } = exit.value;
348
391
  const observed = this.observedIngestion.finishTurn(observedDraft, turn.events);
349
392
  session.appendObservedTurn(observed);
393
+ const turnEvidenceCoverage = this.resolveTurnEvidenceCoverage(turn);
394
+ this.recordObservedTurnState(observed, turn.status, turnEvidenceCoverage);
350
395
  (0, observed_ts_1.bindObservedSnapshotToTurn)(turn, observed);
351
396
  const traceAttribution = attribution ?? "none";
352
- const turnEvidenceCoverage = this.resolveTurnEvidenceCoverage(turn);
353
397
  const timingActivity = this.deps.onTurn?.({
354
398
  turnId,
355
399
  sessionIndex: session.index,
@@ -381,8 +425,26 @@ class SessionManager {
381
425
  }
382
426
  const failure = exit.cause.reasons.find(effect_1.Cause.isFailReason)?.error;
383
427
  const sendFailure = failure !== undefined && (0, send_failures_ts_1.isSendFailure)(failure) ? failure : undefined;
428
+ const interrupted = effect_1.Cause.hasInterruptsOnly(exit.cause);
429
+ const incomplete = {
430
+ status: "partial",
431
+ reason: interrupted ? "agent-send-interrupted" : "agent-send-failed",
432
+ };
433
+ const turnEvidenceCoverage = (0, coverage_ts_1.downgradeEvidenceCoverage)(this.agentEvidenceCoverage, {
434
+ events: incomplete,
435
+ messages: incomplete,
436
+ actions: incomplete,
437
+ status: incomplete,
438
+ });
384
439
  const observed = this.observedIngestion.finishTurn(observedDraft, sendFailure?.events ?? []);
385
440
  session.appendObservedTurn(observed);
441
+ this.recordObservedTurnState(observed, "failed", turnEvidenceCoverage);
442
+ this.evidenceCoverage = (0, coverage_ts_1.worstEvidenceCoverage)([this.evidenceCoverage, turnEvidenceCoverage]);
443
+ session.evidenceCoverage = (0, coverage_ts_1.worstEvidenceCoverage)([session.evidenceCoverage, turnEvidenceCoverage]);
444
+ this.allEvents.push(...(sendFailure?.events ?? []));
445
+ session.events.push(...(sendFailure?.events ?? []));
446
+ session.lastStatus = "failed";
447
+ this.lastStatus = "failed";
386
448
  if (sendFailure?.usage !== undefined) {
387
449
  accumulateUsage(this.usage, sendFailure.usage);
388
450
  accumulateUsage(session.usage, sendFailure.usage);
@@ -392,9 +454,10 @@ class SessionManager {
392
454
  sessionIndex: session.index,
393
455
  turnIndex,
394
456
  label: windowLabel,
395
- outcome: effect_1.Cause.hasInterruptsOnly(exit.cause) ? "interrupted" : "failed",
457
+ outcome: interrupted ? "interrupted" : "failed",
396
458
  events: Object.freeze([userEvent, ...(sendFailure?.events ?? [])]),
397
459
  observed,
460
+ evidenceCoverage: turnEvidenceCoverage,
398
461
  startOffsetMs,
399
462
  durationMs,
400
463
  failed: true,
@@ -434,27 +497,66 @@ class SessionManager {
434
497
  effect_1.Effect.ensuring(afterSend))));
435
498
  });
436
499
  }
437
- sendAgentEffect(input, ctx) {
500
+ sendAgentEffect(input, ctx, observeUsage) {
438
501
  const nativeContext = this.deps.agent.kind === "sandbox"
439
502
  ? (0, attempt_resources_ts_1.bindAttemptResources)({ ...ctx, sandbox: this.deps.sandbox }, this.deps.resources)
440
503
  : ctx;
441
504
  const native = (0, effect_runtime_ts_1.agentSendEffect)(this.deps.agent, input, nativeContext);
442
505
  if (native !== undefined) {
443
- return (0, callback_context_ts_1.withAgentCallbackContext)(nativeContext, (callbackContext) => (0, effect_runtime_ts_1.agentSendEffect)(this.deps.agent, input, callbackContext)).pipe(effect_1.Effect.mapError(send_failures_ts_1.normalizeSendFailure));
506
+ return (0, callback_context_ts_1.withAgentCallbackContext)(nativeContext, (callbackContext) => observeUsage(effect_1.Effect.suspend(() => (0, effect_runtime_ts_1.agentSendEffect)(this.deps.agent, input, callbackContext)).pipe(effect_1.Effect.mapError(send_failures_ts_1.normalizeSendFailure))));
444
507
  }
445
- return (0, callback_context_ts_1.withAgentCallbackContext)(ctx, (callbackContext) => (0, effect_runtime_ts_1.authorCallbackEffect)(() => this.sendAgent(input, callbackContext))).pipe(effect_1.Effect.mapError(send_failures_ts_1.normalizeSendFailure));
508
+ return (0, callback_context_ts_1.withAgentCallbackContext)(ctx, (callbackContext) => observeUsage((0, effect_runtime_ts_1.authorCallbackEffect)(() => this.sendAgent(input, callbackContext)).pipe(effect_1.Effect.mapError(send_failures_ts_1.normalizeSendFailure))));
509
+ }
510
+ /** Runs at the Agent invoke boundary, after ledger and OTLP preparation, once per retry. */
511
+ recordSendUsageEffect(callOnce, identity) {
512
+ return effect_1.Effect.uninterruptibleMask((restore) => effect_1.Effect.suspend(() => {
513
+ const index = this.usageContributions.length;
514
+ const pending = Object.freeze({
515
+ ...identity(),
516
+ state: "pending",
517
+ outcome: null,
518
+ model: this.deps.model ?? null,
519
+ usage: null,
520
+ coverage: Object.freeze({ status: "unavailable", reason: "agent-send-pending" }),
521
+ });
522
+ this.usageContributions.push(pending);
523
+ return restore(callOnce).pipe(effect_1.Effect.onExit((exit) => effect_1.Effect.sync(() => {
524
+ const failure = effect_1.Exit.isFailure(exit) ? exit.cause.reasons.find(effect_1.Cause.isFailReason)?.error : undefined;
525
+ const usage = effect_1.Exit.isSuccess(exit) ? exit.value.usage
526
+ : failure !== undefined && (0, send_failures_ts_1.isSendFailure)(failure) ? failure.usage : undefined;
527
+ let coverage = usage === undefined
528
+ ? { status: "unavailable", reason: "agent-send-usage-not-reported" }
529
+ : this.agentEvidenceCoverage.usage;
530
+ try {
531
+ if (effect_1.Exit.isSuccess(exit)) {
532
+ coverage = { status: "unavailable", reason: "agent-send-invalid-coverage" };
533
+ coverage = this.resolveTurnEvidenceCoverage(exit.value).usage;
534
+ }
535
+ }
536
+ finally {
537
+ this.usageContributions[index] = Object.freeze({
538
+ ...pending,
539
+ state: "terminal",
540
+ outcome: effect_1.Exit.isSuccess(exit) ? exit.value.status === "failed" ? "failed" : "completed"
541
+ : effect_1.Cause.hasInterruptsOnly(exit.cause) ? "interrupted" : "failed",
542
+ usage: usage === undefined ? null : Object.freeze({ ...usage }),
543
+ coverage: Object.freeze({ ...coverage }),
544
+ });
545
+ }
546
+ })));
547
+ }));
446
548
  }
447
549
  /**
448
550
  * 经共享 OTLP 通道跑一轮:本轮的 traceparent 经 ctx.telemetry.headers 交给 adapter,
449
551
  * 返回后按 traceId / 时间窗口把本轮 span 归属进瀑布图。span 只进瀑布图,不进事件流、
450
552
  * 不喂断言——断言依据全部来自 send 返回的 Turn。
451
553
  */
452
- sendWithOtelEffect(otel, input, ctx) {
554
+ sendWithOtelEffect(otel, input, ctx, observeUsage) {
453
555
  return otel.runTurnEffect((headers) => {
454
556
  const turnCtx = ctx.telemetry
455
557
  ? { ...ctx, telemetry: { ...ctx.telemetry, headers } }
456
558
  : ctx;
457
- return this.sendAgentEffect(input, turnCtx);
559
+ return this.sendAgentEffect(input, turnCtx, observeUsage);
458
560
  }).pipe(effect_1.Effect.map((result) => {
459
561
  this.otelSpans.push(...result.spans);
460
562
  if (result.spans.length > 0)
@@ -1 +1 @@
1
- {"version":3,"file":"session.js","sourceRoot":"","sources":["session.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ExperimentFlags } from \"../shared/types.ts\";\n// 会话驱动:把 t.send(text) 翻成 agent.send(input, ctx),在同一沙箱里多轮 resume /\n// newSession,并把每轮的标准事件流与用量累加进整次运行(供作用域断言 / o11y)。\nimport { randomBytes } from \"node:crypto\";\nimport { Cause, Effect, Exit, Option, Semaphore } from \"effect\";\nimport type { Agent, AgentContext, AgentSendContext, AgentSession, InputFile, InputRequest, InputResponse, JsonValue, Sandbox, SandboxAgentSendContext, SessionSlot, StreamEvent, Telemetry, TraceSpan, Turn, TurnInput, Usage } from \"../types.ts\";\nimport { entityIdFromEntropy, type TurnId } from \"../record/family/source-receipt/model.ts\";\nimport { ObservedEventIngestionCorrelator, bindObservedSnapshotToTurn, mintSessionScopeId, type ObservedAttemptCut, type ObservedEvaluationSegment, type ObservedSessionSnapshot, type ObservedTurnSnapshot, } from \"../o11y/observed.ts\";\nimport type { AgentOtelChannel, TurnSpans } from \"../o11y/otlp/turn-otel.ts\";\nimport { downgradeEvidenceCoverage, worstEvidenceCoverage, type ResolvedEvidenceCoverage, } from \"../assertions/coverage.ts\";\nimport { captureLoc, type SourceRegistry } from \"../source-loc.ts\";\nimport { createAttemptRetryBudget, sendWithTurnRetry, type AttemptRetryBudget, type ConcurrencySlot, type SendRetryDeps, } from \"./send-retry.ts\";\nimport type { AttemptFailureClassifier } from \"../shared/failure-class.ts\";\nimport { isSendFailure, normalizeSendFailure, sendFailureText } from \"./send-failures.ts\";\nimport type { RetryAttemptRecord, TimingActivity } from \"../runner/types.ts\";\nimport { formatTurnLabel } from \"../shared/turn-label.ts\";\nimport { bindAttemptResources } from \"./attempt-resources.ts\";\nimport { withAgentCallbackContext } from \"../agents/callback-context.ts\";\nimport { agentSendEffect, authorCallbackEffect } from \"../agents/effect-runtime.ts\";\ninterface PhysicalSendResult {\n readonly turn: Turn;\n readonly traceId?: string;\n readonly attribution?: \"traceparent\" | \"window\" | \"none\";\n readonly window?: TurnSpans[\"window\"];\n}\n/**\n * 一条会话线的存取器实现。slot 值只按 factory 创建的 symbol 身份存取;\n * 从异构 Map 取出后立即依 typed slot 恢复 `T`,不让擦除后的值流入领域逻辑。\n */\nabstract class StoredSessionSlotValue {\n declare private readonly storedSessionSlotValue: void;\n}\nclass StoredSessionSlotValueOf<T> extends StoredSessionSlotValue {\n constructor(readonly value: T) {\n super();\n }\n}\nfunction valueFromStoredSlot<T>(stored: StoredSessionSlotValue): T {\n return (stored as StoredSessionSlotValueOf<T>).value;\n}\nexport function createAgentSession(): AgentSession {\n let capturedId: string | undefined;\n const slots = new Map<symbol, StoredSessionSlotValue>();\n return {\n get id() {\n return capturedId;\n },\n capture(id) {\n if (!id || capturedId !== undefined)\n return; // 空值忽略;first-writer-wins\n capturedId = id;\n },\n get<T>(slot: SessionSlot<T>): T | undefined {\n const stored = slots.get(slot.key);\n return stored === undefined ? undefined : valueFromStoredSlot<T>(stored);\n },\n set<T>(slot: SessionSlot<T>, value: T): void {\n slots.set(slot.key, new StoredSessionSlotValueOf(value));\n },\n take<T>(slot: SessionSlot<T>): T | undefined {\n const stored = slots.get(slot.key);\n if (stored === undefined)\n return undefined;\n slots.delete(slot.key);\n return valueFromStoredSlot<T>(stored);\n },\n };\n}\n/**\n * 一条会话线的可变状态。存取器(id/capture/get/set/take)委托给\n * `createAgentSession()`;index/lastMessage/… 是运行器自己的会话簿记,不属于公开契约。\n */\nexport class RunSession implements AgentSession {\n private readonly session = createAgentSession();\n readonly sessionScopeId = mintSessionScopeId();\n private readonly observedTurnsValue: ObservedTurnSnapshot[] = [];\n /** Inclusive per-Session cut in observed ingestion order. */\n get throughSequence(): number {\n return this.observedTurnsValue.at(-1)?.throughSessionSequence ?? 0;\n }\n /** Immutable snapshots sealed for this Session so far. */\n observedSnapshot(): ObservedSessionSnapshot {\n return Object.freeze({\n sessionId: this.sessionScopeId,\n throughSessionSequence: this.throughSequence,\n turns: Object.freeze([...this.observedTurnsValue]),\n });\n }\n /** @internal Only SessionManager may append a sealed physical-send cut. */\n appendObservedTurn(snapshot: ObservedTurnSnapshot): void {\n if (snapshot.sessionId !== this.sessionScopeId) {\n throw new Error(\"Observed Turn belongs to a different Session scope\");\n }\n this.observedTurnsValue.push(snapshot);\n }\n get id(): string | undefined {\n return this.session.id;\n }\n capture(id: string | undefined): void {\n this.session.capture(id);\n }\n get<T>(slot: SessionSlot<T>): T | undefined {\n return this.session.get(slot);\n }\n set<T>(slot: SessionSlot<T>, value: T): void {\n this.session.set(slot, value);\n }\n take<T>(slot: SessionSlot<T>): T | undefined {\n return this.session.take(slot);\n }\n index = 1;\n lastMessage = \"\";\n lastStatus: \"completed\" | \"failed\" | \"waiting\" = \"completed\";\n readonly events: StreamEvent[] = [];\n readonly pendingInputRequests: InputRequest[] = [];\n readonly usage: Usage = {};\n /** 本会话累计的证据覆盖(初值 = Agent 级默认,逐轮按 Turn.evidenceCoverage 降级折叠)。 */\n evidenceCoverage!: ResolvedEvidenceCoverage;\n /** 本会话内的轮次计数(turn 时间树 / 展示标签 turn<N> 用)。 */\n turnCount = 0;\n}\nexport interface SessionDeps {\n agent: Agent;\n sandbox: Sandbox;\n /** 当前 Attempt 的 Eval 身份;Runner 路径必填,测试/第三方直构可省略。 */\n evalId?: string;\n /** 当前 Attempt 引用;与 setup/teardown 拿到的 AgentContext 保持同一身份。 */\n attempt?: AgentContext[\"attempt\"];\n /** 当前 Eval Group 身份;未分组 Eval 省略。 */\n evalGroup?: AgentContext[\"evalGroup\"];\n model?: string;\n reasoningEffort?: string;\n flags: ExperimentFlags;\n signal: AbortSignal;\n /**\n * The only Promise facade for the active Assert-first author surface. It\n * executes this SessionManager's Effect graph in the owning Attempt Scope.\n */\n requestEffect?: <Value, Error>(effect: Effect.Effect<Value, Error, never>) => Promise<Value>;\n log(msg: string): void;\n /** runner 绑定的作用域反馈(adapter ctx.progress/diagnostic);省略时 progress 退回 log。 */\n feedback?: import(\"../types.ts\").ScopedFeedback;\n /** adapter send 在飞时通知 runner(errored 归因到嵌套的 `agent.run` 阶段用)。 */\n onSendActive?: (active: boolean) => void;\n /**\n * 变更分类账的 send 窗口钩子(仅沙箱型 agent):`beforeSend` 在 adapter send 前落 eval 归因\n * commit,`afterSend` 在返回后落 agent 归因 commit;label 是 `turn<N>` 或\n * `session<K>/turn<N>` 窗口标签。\n * 提供钩子时 send 自动串行(同一 workdir 上重叠的 send 是写入竞争,窗口不重叠)。\n */\n ledgerHooks?: {\n beforeSend(label: string): Promise<void>;\n afterSend(label: string): Promise<void>;\n };\n /** attempt 单调时钟域的当前 offset;runner 注入,测试直调缺省使用 performance.now()。 */\n timingNow?: () => number;\n /**\n * 每轮 send 结束后回报单调时钟包络(runner 挂成 eval.run 下的 turn 时间树节点)。`usage` 是该轮\n * `Turn.usage` 落盘原样(有记录才传;`--execution`/`--timing` 的 turn 头行读 TimingNode.usage)。\n */\n onTurn?: ((info: {\n turnId: TurnId;\n sessionIndex: number;\n turnIndex: number;\n /** Exact terminal label allocated by this SessionManager. */\n label: string;\n /** One physical public send is sealed with this exact terminal outcome. */\n outcome: \"completed\" | \"failed\" | \"interrupted\";\n /** The interpreted terminal Adapter events for this physical send only. */\n events: readonly StreamEvent[];\n /** Exact source-owner snapshot consumed by Assertions and persistence. */\n observed: ObservedTurnSnapshot;\n /** Present only when the Adapter returned a terminal Turn. */\n adapterStatus?: Turn[\"status\"];\n /** Resolved Adapter-default plus Turn-local evidence coverage. */\n evidenceCoverage?: ResolvedEvidenceCoverage;\n startOffsetMs: number;\n durationMs: number;\n failed?: boolean;\n /** The real user-event source location, when stack capture succeeded. */\n loc?: ReturnType<typeof captureLoc>;\n /** Shared author-fact order; absent when there is no durable source site. */\n sourceOrder?: number;\n traceId?: string;\n traceAttribution?: \"traceparent\" | \"window\" | \"none\";\n otelWindow?: TurnSpans[\"window\"];\n usage?: Usage;\n }) => TimingActivity | undefined) & {\n /** Runs synchronously before ledger hooks or Adapter invocation. */\n readonly onStart?: (info: {\n readonly turnId: TurnId;\n readonly sessionScopeId: RunSession[\"sessionScopeId\"];\n readonly sessionIndex: number;\n readonly turnIndex: number;\n readonly loc?: ReturnType<typeof captureLoc>;\n readonly sourceOrder?: number;\n }) => void;\n /** Attempt-local secret replacement used before observed rows are sealed. */\n readonly normalizeObservedText?: (value: string) => string;\n };\n /** 路径推导出的实验 id(经 send ctx 透给 adapter,见 AgentContext.experimentId)。 */\n experimentId?: string;\n /** tracing agent 的 OTLP 端点(经 send ctx 透给 adapter,用于注入导出 env)。 */\n telemetry?: Telemetry;\n /** 非沙箱 tracing agent 的共享 OTLP 通道(runner 从 run 级池取,经它做逐轮 span 归属)。 */\n otel?: AgentOtelChannel;\n /**\n * turn 级重试退避期间释放/收回的全局并发槽位(见 docs/feature/error-classification/\n * architecture.md「退避与槽位」)。省略时退避不释放槽位(测试 / 无并发闸场景)。\n */\n concurrencySlot?: ConcurrencySlot;\n /**\n * 实验声明的失败分类器(`ExperimentDef.classifyFailure`):turn 链上排在 adapter 分类器\n * 之前询问(决议序见 docs/feature/error-classification/architecture.md「分类链」)。\n */\n experimentClassifier?: AttemptFailureClassifier;\n /** 与 Fact collector 共用的 attempt 级源码事实序号分配器。 */\n nextSourceOrder?: () => number;\n /** Attempt-owned source snapshot registry; Runner injects it explicitly. */\n sourceRegistry?: SourceRegistry;\n resources: import(\"../types.ts\").AttemptResourceRegistry;\n}\n/** A successful agent send whose post-send ledger checkpoint could not be recorded. */\nexport interface LedgerCaptureFailure {\n readonly state: \"capture-failed\";\n readonly label: string;\n readonly error: unknown;\n}\nexport class SessionManager {\n /** 整次运行(所有会话、所有轮)累计的标准事件流。 */\n readonly allEvents: StreamEvent[] = [];\n readonly usage: Usage = {};\n lastStatus: \"completed\" | \"failed\" | \"waiting\" = \"completed\";\n /** Agent 级默认覆盖(六通道在 factory 构造期已验证)。 */\n readonly agentEvidenceCoverage: ResolvedEvidenceCoverage;\n /** attempt 级累计覆盖:各轮解析后覆盖的最差值,随每次 send 折叠。 */\n evidenceCoverage: ResolvedEvidenceCoverage;\n /** 自动重试吸收的物理 send 失败;不混进 allEvents。 */\n readonly retryAttempts: RetryAttemptRecord[] = [];\n /** 归属到本 attempt 的 span(逐轮攒;attempt 末尾连同 sweep 的迟到 span 一起挂 trace)。 */\n readonly otelSpans: TraceSpan[] = [];\n /** 本 attempt 各轮的 traceId(attempt 末尾按它 sweep 迟到 span)。 */\n readonly otelTraceIds = new Set<string>();\n private readonly otelTurnRecords: Array<{\n window: TurnSpans[\"window\"];\n activity?: TimingActivity;\n hasSpans: boolean;\n }> = [];\n /** 已完成轮次的离散宿主时间窗口;共享 receiver sweep 只用这些窗口补迟到 span。 */\n get otelTurnWindows(): readonly TurnSpans[\"window\"][] {\n return this.otelTurnRecords.map((record) => record.window);\n }\n private warnedWindowAttribution = false;\n private warnedNoSpans = false;\n readonly primary: RunSession;\n private readonly sessions: RunSession[] = [];\n private turnCount = 0;\n private sessionCount = 0;\n /** 沙箱型 send 的 Effect 串行闸(见 SessionDeps.ledgerHooks):窗口不重叠。 */\n private readonly sendSemaphore = Semaphore.makeUnsafe(1);\n /** First failed post-send checkpoint makes the entire later diff producer unavailable. */\n private ledgerCaptureFailureValue: LedgerCaptureFailure | undefined;\n /** attempt 级 turn 重试预算,跨该 attempt 全部 send(全部 session)持续扣减,不随单次 send 重置。 */\n private readonly retryBudget: AttemptRetryBudget = createAttemptRetryBudget();\n private localSourceOrder = 0;\n private readonly nextSourceOrder: () => number;\n private readonly observedIngestion: ObservedEventIngestionCorrelator;\n constructor(private readonly deps: SessionDeps) {\n this.nextSourceOrder = deps.nextSourceOrder ?? (() => ++this.localSourceOrder);\n this.agentEvidenceCoverage = deps.agent.evidenceCoverage;\n this.evidenceCoverage = this.agentEvidenceCoverage;\n this.observedIngestion = new ObservedEventIngestionCorrelator({\n ...(deps.onTurn?.normalizeObservedText === undefined\n ? {}\n : { normalizeText: deps.onTurn.normalizeObservedText }),\n });\n this.primary = this.newSession();\n }\n /** Stable vector cut for every Session that has begun observation. */\n observedAttemptCut(): ObservedAttemptCut {\n return this.observedIngestion.attemptCut();\n }\n observedEvaluationSegment(snapshot: ObservedTurnSnapshot): ObservedEvaluationSegment | undefined {\n return this.observedIngestion.evaluationSegment(snapshot);\n }\n releaseObservedEvaluationSegments(): void {\n this.observedIngestion.releaseEvaluationSegments();\n }\n private mintPhysicalTurnId(): TurnId {\n const turnId = entityIdFromEntropy(\"turn\", randomBytes(16));\n if (turnId === undefined)\n throw new Error(\"SessionManager failed to mint a TurnId\");\n return turnId;\n }\n /** A ledger checkpoint failure is attempt state, not a synthetic empty diff. */\n get ledgerCaptureFailure(): LedgerCaptureFailure | undefined {\n return this.ledgerCaptureFailureValue;\n }\n newSession(): RunSession {\n const s = new RunSession();\n s.index = ++this.sessionCount;\n s.evidenceCoverage = this.agentEvidenceCoverage;\n this.observedIngestion.registerSession(s.sessionScopeId);\n this.sessions.push(s);\n return s;\n }\n /** 一轮的解析后覆盖:Agent 默认按 Turn.evidenceCoverage 降级(只降不升)。 */\n resolveTurnEvidenceCoverage(turn: Turn): ResolvedEvidenceCoverage {\n return downgradeEvidenceCoverage(this.agentEvidenceCoverage, turn.evidenceCoverage);\n }\n send(session: RunSession, text: string, files?: readonly InputFile[], responses?: readonly InputResponse[]): Promise<Turn> {\n const requestEffect = this.deps.requestEffect;\n if (requestEffect === undefined) {\n throw new Error(\"SessionManager requires the Attempt Effect bridge\");\n }\n return requestEffect(this.sendEffect(session, text, files, responses));\n }\n /**\n * The entire logical send is one Effect. The public Promise facade above is\n * deliberately only available through AssertFirstAttemptBridge.requestEffect.\n */\n sendEffect(session: RunSession, text: string, files?: readonly InputFile[], responses?: readonly InputResponse[], loc?: ReturnType<typeof captureLoc>): Effect.Effect<Turn, unknown> {\n const send = this.sendSerializedEffect(session, text, loc ?? captureLoc({ registry: this.deps.sourceRegistry }), files, responses);\n // Sandbox sends share one workdir, so their attribution windows cannot\n // overlap. Direct Agent sends retain their existing unconstrained behavior.\n return this.deps.ledgerHooks === undefined\n ? send\n : this.sendSemaphore.withPermits(1)(send);\n }\n private sendSerializedEffect(session: RunSession, text: string, loc: ReturnType<typeof captureLoc>, files?: readonly InputFile[], responses?: readonly InputResponse[]): Effect.Effect<Turn, unknown> {\n return Effect.suspend(() => {\n const n = ++this.turnCount;\n const turnLabel = session.index === 1\n ? `turn ${n}`\n : `session ${session.index} · turn ${n}`;\n const attach = files?.length ? ` 📎${files.length}` : \"\";\n const userDetail = text.trim().length > 0\n ? text\n : files?.[0]?.filename ?? `[file]`;\n this.deps.feedback?.progress({ message: `user: ${userDetail}${attach}` });\n const timingNow = this.deps.timingNow ?? (() => performance.now());\n const startOffsetMs = timingNow();\n // A source order belongs only to a user event that can become an\n // Attempt source-site. Do not consume the shared sequence for a failed\n // stack capture.\n const sourceOrder = loc === undefined ? undefined : this.nextSourceOrder();\n const userEvent: StreamEvent = {\n type: \"message\",\n role: \"user\",\n text,\n loc,\n ...(sourceOrder === undefined ? {} : { sourceOrder }),\n };\n this.allEvents.push(userEvent);\n session.events.push(userEvent);\n session.pendingInputRequests.length = 0;\n const turnIndex = ++session.turnCount;\n const windowLabel = formatTurnLabel(session.index, turnIndex);\n const turnId = this.mintPhysicalTurnId();\n const observedDraft = this.observedIngestion.beginTurn({\n sessionId: session.sessionScopeId,\n turnId,\n userEvent,\n });\n this.deps.onTurn?.onStart?.({\n turnId,\n sessionScopeId: session.sessionScopeId,\n sessionIndex: session.index,\n turnIndex,\n ...(loc === undefined ? {} : { loc }),\n ...(sourceOrder === undefined ? {} : { sourceOrder }),\n });\n const ctx: AgentSendContext = bindAttemptResources({\n turnId,\n signal: this.deps.signal,\n evalId: this.deps.evalId,\n attempt: this.deps.attempt,\n evalGroup: this.deps.evalGroup,\n model: this.deps.model,\n reasoningEffort: this.deps.reasoningEffort,\n flags: this.deps.flags,\n experimentId: this.deps.experimentId,\n session,\n telemetry: this.deps.telemetry,\n // Progress is intentionally transient. A direct SessionManager without\n // an ACTIVE feedback sink drops it instead of turning it into a durable\n // timeout breadcrumb through `log`.\n progress: (u) => this.deps.feedback?.progress(u),\n diagnostic: (d) => this.deps.feedback?.diagnostic(d),\n log: this.deps.log,\n }, this.deps.resources);\n const beforeSend = this.deps.ledgerHooks === undefined\n ? Effect.void\n : Effect.tryPromise({\n try: () => this.deps.ledgerHooks!.beforeSend(windowLabel),\n catch: (error) => error,\n });\n const afterSend = this.deps.ledgerHooks === undefined\n ? Effect.void\n : Effect.tryPromise({\n try: () => this.deps.ledgerHooks!.afterSend(windowLabel),\n catch: (error) => error,\n }).pipe(Effect.catch((error) => Effect.sync(() => {\n // The agent turn itself did complete. Preserve that success for\n // the author, but retain the failed checkpoint so freeze cannot\n // turn an incomplete capture into a convincing empty document.\n if (this.ledgerCaptureFailureValue === undefined) {\n this.ledgerCaptureFailureValue = Object.freeze({\n state: \"capture-failed\" as const,\n label: windowLabel,\n error,\n });\n }\n })));\n // turn 级重试只包这一次物理 agent send。SDK Promise 在这两个\n // Effect.tryPromise 边界适配;retry 本身不再包含手写 Promise / timeout。\n const sendOnce: Effect.Effect<PhysicalSendResult, unknown> = this.deps.otel\n ? this.sendWithOtelEffect(this.deps.otel, { text, files, responses }, ctx)\n : this.sendAgentEffect({ text, files, responses }, ctx).pipe(Effect.map((turn) => ({ turn })));\n const retryDeps: SendRetryDeps = {\n classifier: this.deps.agent.classifySendFailure,\n experimentClassifier: this.deps.experimentClassifier,\n onRetryAttempt: ({ sendAttempt, startedAt, durationMs, failure, classification }) => {\n const process = failure.process;\n this.retryAttempts.push({\n sessionIndex: session.index,\n turnIndex,\n sendAttempt,\n startedAt,\n durationMs,\n failure: {\n type: \"agent-send-failed\",\n acceptance: \"rejected\",\n message: sendFailureText(failure),\n ...(process?.exitCode !== undefined || process?.signal !== undefined\n ? { process: { ...(process.exitCode !== undefined ? { exitCode: process.exitCode } : {}), ...(process.signal !== undefined ? { signal: process.signal } : {}) } }\n : {}),\n },\n classification: {\n retryable: true,\n scope: classification.scope ?? \"attempt\",\n reason: classification.reason,\n },\n events: failure.events ? [...failure.events] : [],\n ...(failure.usage !== undefined ? { usage: { ...failure.usage } } : {}),\n });\n if (failure.usage) {\n accumulateUsage(this.usage, failure.usage);\n accumulateUsage(session.usage, failure.usage);\n }\n },\n budget: this.retryBudget,\n slot: this.deps.concurrencySlot,\n reportRetry: (message: string) => ctx.progress({ message }),\n signal: ctx.signal,\n };\n const send = Effect.uninterruptibleMask((restore) => Effect.flatMap(Effect.exit(restore(sendWithTurnRetry(sendOnce, retryDeps))), (exit) => Effect.flatMap(Effect.sync(() => {\n const durationMs = Math.max(0, timingNow() - startOffsetMs);\n if (Exit.isSuccess(exit)) {\n const { turn, traceId, attribution, window } = exit.value;\n const observed = this.observedIngestion.finishTurn(observedDraft, turn.events);\n session.appendObservedTurn(observed);\n bindObservedSnapshotToTurn(turn, observed);\n const traceAttribution = attribution ?? \"none\";\n const turnEvidenceCoverage = this.resolveTurnEvidenceCoverage(turn);\n const timingActivity = this.deps.onTurn?.({\n turnId,\n sessionIndex: session.index,\n turnIndex,\n label: windowLabel,\n outcome: turn.status === \"failed\" ? \"failed\" : \"completed\",\n events: Object.freeze([...turn.events]),\n observed,\n adapterStatus: turn.status,\n evidenceCoverage: turnEvidenceCoverage,\n startOffsetMs,\n durationMs,\n failed: turn.status === \"failed\" ? true : undefined,\n ...(loc === undefined ? {} : { loc }),\n ...(sourceOrder === undefined ? {} : { sourceOrder }),\n ...(traceAttribution !== \"none\" && traceId !== undefined ? { traceId } : {}),\n traceAttribution,\n otelWindow: window,\n usage: turn.usage,\n });\n if (window !== undefined) {\n this.otelTurnRecords.push({\n window,\n activity: timingActivity,\n hasSpans: traceAttribution !== \"none\",\n });\n }\n return;\n }\n const failure = exit.cause.reasons.find(Cause.isFailReason)?.error;\n const sendFailure = failure !== undefined && isSendFailure(failure) ? failure : undefined;\n const observed = this.observedIngestion.finishTurn(observedDraft, sendFailure?.events ?? []);\n session.appendObservedTurn(observed);\n if (sendFailure?.usage !== undefined) {\n accumulateUsage(this.usage, sendFailure.usage);\n accumulateUsage(session.usage, sendFailure.usage);\n }\n this.deps.onTurn?.({\n turnId,\n sessionIndex: session.index,\n turnIndex,\n label: windowLabel,\n outcome: Cause.hasInterruptsOnly(exit.cause) ? \"interrupted\" : \"failed\",\n events: Object.freeze([userEvent, ...(sendFailure?.events ?? [])]),\n observed,\n startOffsetMs,\n durationMs,\n failed: true,\n ...(loc === undefined ? {} : { loc }),\n ...(sourceOrder === undefined ? {} : { sourceOrder }),\n ...(sendFailure?.usage !== undefined ? { usage: sendFailure.usage } : {}),\n });\n }), () => Exit.isSuccess(exit)\n ? Effect.succeed(exit.value)\n : Effect.failCause(exit.cause)))).pipe(Effect.flatMap(({ turn }) => Effect.sync(() => {\n this.allEvents.push(...turn.events);\n session.events.push(...turn.events);\n session.pendingInputRequests.push(...turn.events\n .filter((e): e is Extract<StreamEvent, {\n type: \"input.requested\";\n }> => e.type === \"input.requested\")\n .map((e) => e.request));\n if (turn.usage) {\n accumulateUsage(this.usage, turn.usage);\n accumulateUsage(session.usage, turn.usage);\n }\n // 证据覆盖:attempt / session 级聚合取各轮最差值(见 assertions/coverage.ts)。\n const turnEvidenceCoverage = this.resolveTurnEvidenceCoverage(turn);\n this.evidenceCoverage = worstEvidenceCoverage([this.evidenceCoverage, turnEvidenceCoverage]);\n session.evidenceCoverage = worstEvidenceCoverage([session.evidenceCoverage, turnEvidenceCoverage]);\n session.lastStatus = turn.status;\n this.lastStatus = turn.status;\n const reply = lastAssistantText(turn.events);\n if (reply !== undefined)\n session.lastMessage = reply;\n const tok = (turn.usage?.inputTokens ?? 0) + (turn.usage?.outputTokens ?? 0);\n const tools = turn.events.filter((event) => event.type === \"operation.started\" && event.operation.kind === \"tool\").length;\n const reason = turn.status === \"failed\" ? failureReason(turn.events) : undefined;\n this.deps.log(`${turnLabel} ← ${turn.status} · ${`${tools} tools`} · ${tok} tok · ${Math.round(Math.max(0, timingNow() - startOffsetMs) / 1000)}s${reason ? ` · ${reason}` : \"\"}`);\n return turn;\n })));\n return beforeSend.pipe(Effect.andThen(Effect.sync(() => this.deps.onSendActive?.(true)).pipe(Effect.andThen(send), Effect.ensuring(Effect.sync(() => this.deps.onSendActive?.(false))), \n // send 返回后:这个 send 窗口内的全部 workspace 变化落 agent 归因。\n Effect.ensuring(afterSend))));\n });\n }\n private sendAgentEffect(input: TurnInput, ctx: AgentSendContext): Effect.Effect<Turn, ReturnType<typeof normalizeSendFailure>> {\n const nativeContext: AgentSendContext = this.deps.agent.kind === \"sandbox\"\n ? bindAttemptResources({ ...ctx, sandbox: this.deps.sandbox }, this.deps.resources)\n : ctx;\n const native = agentSendEffect(this.deps.agent, input, nativeContext);\n if (native !== undefined) {\n return withAgentCallbackContext(nativeContext, (callbackContext) => agentSendEffect(this.deps.agent, input, callbackContext)!).pipe(Effect.mapError(normalizeSendFailure));\n }\n return withAgentCallbackContext(ctx, (callbackContext) => authorCallbackEffect(() => this.sendAgent(input, callbackContext))).pipe(Effect.mapError(normalizeSendFailure));\n }\n /**\n * 经共享 OTLP 通道跑一轮:本轮的 traceparent 经 ctx.telemetry.headers 交给 adapter,\n * 返回后按 traceId / 时间窗口把本轮 span 归属进瀑布图。span 只进瀑布图,不进事件流、\n * 不喂断言——断言依据全部来自 send 返回的 Turn。\n */\n private sendWithOtelEffect(otel: AgentOtelChannel, input: {\n text: string;\n files?: readonly InputFile[];\n responses?: readonly InputResponse[];\n }, ctx: AgentSendContext): Effect.Effect<PhysicalSendResult, ReturnType<typeof normalizeSendFailure>> {\n return otel.runTurnEffect((headers) => {\n const turnCtx: AgentSendContext = ctx.telemetry\n ? { ...ctx, telemetry: { ...ctx.telemetry, headers } }\n : ctx;\n return this.sendAgentEffect(input, turnCtx);\n }).pipe(Effect.map((result) => {\n this.otelSpans.push(...result.spans);\n if (result.spans.length > 0)\n this.otelTraceIds.add(result.traceId);\n if (result.attribution === \"window\" && result.spans.length > 0 && !this.warnedWindowAttribution) {\n this.warnedWindowAttribution = true;\n this.deps.log(`otel: spans missing our traceparent, attributing by time window (turns for this agent serialized; concurrency resumes once W3C propagation is confirmed)`);\n }\n if (result.spans.length === 0 && !this.warnedNoSpans) {\n this.warnedNoSpans = true;\n this.deps.log(`otel: 0 spans this turn — endpoint not wired? (env not injected / service not restarted / no flush)`);\n }\n return {\n turn: result.result,\n traceId: result.traceId,\n attribution: result.spans.length === 0 ? \"none\" : result.attribution,\n window: result.window,\n };\n }));\n }\n /** telemetry.collect 收到 BatchSpanProcessor 迟到导出后,回写尚无 span 的 turn。 */\n attributeDeferredOtel(spans: readonly TraceSpan[]): TraceSpan[] {\n const attributed: TraceSpan[] = [];\n const remaining = new Set(spans);\n for (const record of this.otelTurnRecords) {\n if (record.hasSpans || record.activity === undefined)\n continue;\n const candidates = [...remaining].filter((span) => span.endMs >= record.window.startMs && span.startMs <= record.window.endMs);\n const byTrace = new Map<string, TraceSpan[]>();\n for (const span of candidates) {\n const group = byTrace.get(span.traceId);\n if (group === undefined)\n byTrace.set(span.traceId, [span]);\n else\n group.push(span);\n }\n const selected = [...byTrace.entries()]\n .map(([traceId, traceSpans]) => {\n const latestEndMs = Math.max(...traceSpans.map((span) => span.endMs));\n const coversEnd = traceSpans.some((span) => span.startMs <= record.window.endMs && span.endMs >= record.window.endMs);\n return { traceId, traceSpans, latestEndMs, coversEnd };\n })\n .sort((a, b) => Number(b.coversEnd) - Number(a.coversEnd) ||\n Math.abs(record.window.endMs - a.latestEndMs) - Math.abs(record.window.endMs - b.latestEndMs) ||\n b.latestEndMs - a.latestEndMs ||\n a.traceId.localeCompare(b.traceId))[0];\n if (selected === undefined)\n continue;\n record.activity.traceId = selected.traceId;\n record.activity.traceAttribution = \"window\";\n record.hasSpans = true;\n this.otelTraceIds.add(selected.traceId);\n for (const span of selected.traceSpans) {\n remaining.delete(span);\n attributed.push(span);\n }\n }\n return attributed;\n }\n private sendAgent(input: TurnInput, ctx: AgentSendContext): Promise<Turn> {\n const agent = this.deps.agent;\n if (agent.kind === \"sandbox\") {\n const sandboxCtx: SandboxAgentSendContext = bindAttemptResources({ ...ctx, sandbox: this.deps.sandbox }, this.deps.resources);\n return agent.send(input, sandboxCtx);\n }\n return agent.send(input, ctx);\n }\n}\n/**\n * 失败轮的进度行原因摘要:取本轮事件流里最后一个 `type: \"error\"` 事件的 message\n * (与 src/agents/shared.ts 的 diagnoseFailure 同一口径——\n * 都认「最后一条 error 事件」为本轮失败的权威原因),压成单行并截断,避免 402/超时\n * 这类关键信息只能事后翻落盘的 result.json 才看得到。提不到时返回 undefined,调用方不补空后缀。\n */\nfunction failureReason(events: readonly StreamEvent[]): string | undefined {\n for (let i = events.length - 1; i >= 0; i--) {\n const e = events[i];\n if (e.type === \"error\")\n return truncateOneLine(e.message, 120);\n }\n return undefined;\n}\n/** 单行截断:折叠空白 + 120 字符上限。 */\nfunction truncateOneLine(s: string, width: number): string {\n const clean = s.replace(/\\s+/g, \" \").trim();\n if (clean.length <= width)\n return clean;\n return `${clean.slice(0, width - 1)}…`;\n}\nexport function lastAssistantText(events: readonly StreamEvent[]): string | undefined {\n for (let i = events.length - 1; i >= 0; i--) {\n const e = events[i];\n if (e.type === \"message\" && e.role === \"assistant\" && e.text.trim())\n return e.text;\n }\n return undefined;\n}\n/**\n * 每个字段只在某一轮真的带回该值时才累加,协议不提供就保持省略(见\n * docs/feature/record/architecture.md「Usage」:「每个字段只在协议真实提供该值时存在……\n * 不存在『默认 0』或『默认 1』的字段」)。此前 `requests` 用 `add.requests ?? 1` 累加,会让\n * 转录解析型 adapter(整个 attempt 只在末尾解析一次 transcript、天然不报每轮请求数)的一轮\n * send 被硬算成 1 个请求,一个内部发起了 21 次工具调用的 codex session 因此落盘\n * `requests: 1`——不是真值,是轮数的误代理(见 memory 的 show-scope-slice-json-ruling 条目)。\n * `inputTokens`/`outputTokens` 此前是 Usage 的必填字段、始终累加(缺省视同 0);现在两者也\n * 可选化,同一条纪律统一适用:任何字段缺席就保持缺席,不拿「大概率是 0」去凑。\n */\nfunction accumulateUsage(acc: Usage, add: Usage): void {\n if (add.inputTokens !== undefined)\n acc.inputTokens = (acc.inputTokens ?? 0) + add.inputTokens;\n if (add.outputTokens !== undefined)\n acc.outputTokens = (acc.outputTokens ?? 0) + add.outputTokens;\n if (add.cacheReadTokens !== undefined)\n acc.cacheReadTokens = (acc.cacheReadTokens ?? 0) + add.cacheReadTokens;\n if (add.cacheCreationTokens !== undefined)\n acc.cacheCreationTokens = (acc.cacheCreationTokens ?? 0) + add.cacheCreationTokens;\n if (add.reasoningTokens !== undefined)\n acc.reasoningTokens = (acc.reasoningTokens ?? 0) + add.reasoningTokens;\n if (add.requests !== undefined)\n acc.requests = (acc.requests ?? 0) + add.requests;\n if (add.costUSD !== undefined) {\n acc.costUSD = acc.costUSD === undefined ? add.costUSD : acc.costUSD + add.costUSD;\n }\n}\n"]}
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["session.ts"],"names":[],"mappings":";;;AA8CA,gDA2BC;AA4rBD,8CAOC;AA3wBD,kEAAkE;AAClE,kDAAkD;AAClD,6CAA0C;AAC1C,mCAAgE;AAEhE,uEAA4F;AAC5F,qDAA0O;AAG1O,2DAA6H;AAC7H,oDAAmE;AACnE,mDAAkJ;AAElJ,yDAA0F;AAE1F,2DAA0D;AAC1D,iEAA8D;AAC9D,uEAAyE;AACzE,mEAAoF;AAYpF;;;GAGG;AACH,MAAe,sBAAsB;CAEpC;AACD,MAAM,wBAA4B,SAAQ,sBAAsB;IACvC;IAArB,YAAqB,KAAQ;QACzB,KAAK,EAAE,CAAC;QADS,UAAK,GAAL,KAAK,CAAG;IAE7B,CAAC;CACJ;AACD,SAAS,mBAAmB,CAAI,MAA8B;IAC1D,OAAQ,MAAsC,CAAC,KAAK,CAAC;AACzD,CAAC;AACD,SAAgB,kBAAkB;IAC9B,IAAI,UAA8B,CAAC;IACnC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkC,CAAC;IACxD,OAAO;QACH,IAAI,EAAE;YACF,OAAO,UAAU,CAAC;QACtB,CAAC;QACD,OAAO,CAAC,EAAE;YACN,IAAI,CAAC,EAAE,IAAI,UAAU,KAAK,SAAS;gBAC/B,OAAO,CAAC,yBAAyB;YACrC,UAAU,GAAG,EAAE,CAAC;QACpB,CAAC;QACD,GAAG,CAAI,IAAoB;YACvB,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACnC,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAI,MAAM,CAAC,CAAC;QAC7E,CAAC;QACD,GAAG,CAAI,IAAoB,EAAE,KAAQ;YACjC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,wBAAwB,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7D,CAAC;QACD,IAAI,CAAI,IAAoB;YACxB,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACnC,IAAI,MAAM,KAAK,SAAS;gBACpB,OAAO,SAAS,CAAC;YACrB,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACvB,OAAO,mBAAmB,CAAI,MAAM,CAAC,CAAC;QAC1C,CAAC;KACJ,CAAC;AACN,CAAC;AACD;;;GAGG;AACH,MAAa,UAAU;IACF,OAAO,GAAG,kBAAkB,EAAE,CAAC;IACvC,cAAc,GAAG,IAAA,gCAAkB,GAAE,CAAC;IAC9B,kBAAkB,GAA2B,EAAE,CAAC;IACjE,6DAA6D;IAC7D,IAAI,eAAe;QACf,OAAO,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,sBAAsB,IAAI,CAAC,CAAC;IACvE,CAAC;IACD,0DAA0D;IAC1D,gBAAgB;QACZ,OAAO,MAAM,CAAC,MAAM,CAAC;YACjB,SAAS,EAAE,IAAI,CAAC,cAAc;YAC9B,sBAAsB,EAAE,IAAI,CAAC,eAAe;YAC5C,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC;SACrD,CAAC,CAAC;IACP,CAAC;IACD,2EAA2E;IAC3E,kBAAkB,CAAC,QAA8B;QAC7C,IAAI,QAAQ,CAAC,SAAS,KAAK,IAAI,CAAC,cAAc,EAAE,CAAC;YAC7C,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;QAC1E,CAAC;QACD,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC;IACD,IAAI,EAAE;QACF,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;IAC3B,CAAC;IACD,OAAO,CAAC,EAAsB;QAC1B,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC;IACD,GAAG,CAAI,IAAoB;QACvB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IACD,GAAG,CAAI,IAAoB,EAAE,KAAQ;QACjC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAClC,CAAC;IACD,IAAI,CAAI,IAAoB;QACxB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IACD,KAAK,GAAG,CAAC,CAAC;IACV,WAAW,GAAG,EAAE,CAAC;IACjB,UAAU,GAAuC,WAAW,CAAC;IACpD,MAAM,GAAkB,EAAE,CAAC;IAC3B,oBAAoB,GAAmB,EAAE,CAAC;IAC1C,KAAK,GAAU,EAAE,CAAC;IAC3B,iEAAiE;IACjE,gBAAgB,CAA4B;IAC5C,4CAA4C;IAC5C,SAAS,GAAG,CAAC,CAAC;CACjB;AAhDD,gCAgDC;AA4GD,MAAa,cAAc;IAiDM;IAhD7B,8BAA8B;IACrB,SAAS,GAAkB,EAAE,CAAC;IAC9B,KAAK,GAAU,EAAE,CAAC;IAC3B,UAAU,GAAuC,WAAW,CAAC;IAC7D,wCAAwC;IAC/B,qBAAqB,CAA2B;IACzD,6CAA6C;IAC7C,gBAAgB,CAA2B;IAC3C,uCAAuC;IAC9B,aAAa,GAAyB,EAAE,CAAC;IACjC,kBAAkB,GAA6B,EAAE,CAAC;IACnE,0FAA0F;IAC1F,0BAA0B;QACtB,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC;YAC7E,GAAG,YAAY;YACf,KAAK,EAAE,YAAY,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC;YACpF,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,YAAY,CAAC,QAAQ,EAAE,CAAC;SACxD,CAAC,CAAC,CAAC,CAAC;IACT,CAAC;IACD,sEAAsE;IAC7D,SAAS,GAAgB,EAAE,CAAC;IACrC,yDAAyD;IAChD,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IACzB,eAAe,GAI3B,EAAE,CAAC;IACR,uDAAuD;IACvD,IAAI,eAAe;QACf,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/D,CAAC;IACO,uBAAuB,GAAG,KAAK,CAAC;IAChC,aAAa,GAAG,KAAK,CAAC;IACrB,OAAO,CAAa;IACZ,QAAQ,GAAiB,EAAE,CAAC;IACrC,SAAS,GAAG,CAAC,CAAC;IACd,YAAY,GAAG,CAAC,CAAC;IACzB,8DAA8D;IAC7C,aAAa,GAAG,kBAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACzD,0FAA0F;IAClF,yBAAyB,CAAmC;IACpE,2EAA2E;IAC1D,WAAW,GAAuB,IAAA,wCAAwB,GAAE,CAAC;IACtE,gBAAgB,GAAG,CAAC,CAAC;IACZ,eAAe,CAAe;IAC9B,iBAAiB,CAAmC;IAC7D,kBAAkB,GAAG,IAAI,OAAO,EAA2C,CAAC;IACpF,YAA6B,IAAiB;QAAjB,SAAI,GAAJ,IAAI,CAAa;QAC1C,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC/E,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC;QACzD,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,qBAAqB,CAAC;QACnD,IAAI,CAAC,iBAAiB,GAAG,IAAI,8CAAgC,CAAC;YAC1D,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,qBAAqB,KAAK,SAAS;gBAChD,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,qBAAqB,EAAE,CAAC;SAC9D,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;IACrC,CAAC;IACD,sEAAsE;IACtE,kBAAkB;QACd,OAAO,IAAI,CAAC,iBAAiB,CAAC,UAAU,EAAE,CAAC;IAC/C,CAAC;IACD,yFAAyF;IACzF,wBAAwB;QACpB,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC;IACrF,CAAC;IACD,iBAAiB,CAAC,QAA8B;QAC5C,OAAO,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACjD,CAAC;IACD,8FAA8F;IAC9F,+BAA+B;QAC3B,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;YAClE,CAAC,CAAC,8BAA8B;YAChC,CAAC,CAAC,SAAS,CAAC;IACpB,CAAC;IACD,yBAAyB,CAAC,QAA8B;QACpD,OAAO,IAAI,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC9D,CAAC;IACD,iCAAiC;QAC7B,IAAI,CAAC,iBAAiB,CAAC,yBAAyB,EAAE,CAAC;QACnD,IAAI,CAAC,kBAAkB,GAAG,IAAI,OAAO,EAAE,CAAC;IAC5C,CAAC;IACO,uBAAuB,CAAC,QAA8B,EAAE,OAAqC,EAAE,QAAkC;QACrI,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC;YAChD,OAAO;YACP,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC;gBACpB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;gBAC7C,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC;gBACjD,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;gBAC/C,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;gBAC7C,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;gBAC3C,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;aAC5C,CAAC;SACL,CAAC,CAAC,CAAC;IACR,CAAC;IACO,kBAAkB;QACtB,MAAM,MAAM,GAAG,IAAA,8BAAmB,EAAC,MAAM,EAAE,IAAA,yBAAW,EAAC,EAAE,CAAC,CAAC,CAAC;QAC5D,IAAI,MAAM,KAAK,SAAS;YACpB,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAC9D,OAAO,MAAM,CAAC;IAClB,CAAC;IACD,gFAAgF;IAChF,IAAI,oBAAoB;QACpB,OAAO,IAAI,CAAC,yBAAyB,CAAC;IAC1C,CAAC;IACD,UAAU;QACN,MAAM,CAAC,GAAG,IAAI,UAAU,EAAE,CAAC;QAC3B,CAAC,CAAC,KAAK,GAAG,EAAE,IAAI,CAAC,YAAY,CAAC;QAC9B,CAAC,CAAC,gBAAgB,GAAG,IAAI,CAAC,qBAAqB,CAAC;QAChD,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;QACzD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtB,OAAO,CAAC,CAAC;IACb,CAAC;IACD,yDAAyD;IACzD,2BAA2B,CAAC,IAAU;QAClC,OAAO,IAAA,uCAAyB,EAAC,IAAI,CAAC,qBAAqB,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACxF,CAAC;IACD,IAAI,CAAC,OAAmB,EAAE,IAAY,EAAE,KAA4B,EAAE,SAAoC;QACtG,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;QAC9C,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACzE,CAAC;QACD,OAAO,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;IAC3E,CAAC;IACD;;;OAGG;IACH,UAAU,CAAC,OAAmB,EAAE,IAAY,EAAE,KAA4B,EAAE,SAAoC,EAAE,GAAmC;QACjJ,MAAM,IAAI,GAAG,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,IAAA,0BAAU,EAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;QACnI,uEAAuE;QACvE,4EAA4E;QAC5E,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,KAAK,SAAS;YACtC,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAClD,CAAC;IACO,oBAAoB,CAAC,OAAmB,EAAE,IAAY,EAAE,GAAkC,EAAE,KAA4B,EAAE,SAAoC;QAClK,OAAO,eAAM,CAAC,OAAO,CAAC,GAAG,EAAE;YACvB,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC;YAC3B,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,KAAK,CAAC;gBACjC,CAAC,CAAC,QAAQ,CAAC,EAAE;gBACb,CAAC,CAAC,WAAW,OAAO,CAAC,KAAK,WAAW,CAAC,EAAE,CAAC;YAC7C,MAAM,MAAM,GAAG,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;gBACrC,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,IAAI,QAAQ,CAAC;YACvC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,SAAS,UAAU,GAAG,MAAM,EAAE,EAAE,CAAC,CAAC;YAC1E,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC;YACnE,MAAM,aAAa,GAAG,SAAS,EAAE,CAAC;YAClC,iEAAiE;YACjE,uEAAuE;YACvE,iBAAiB;YACjB,MAAM,WAAW,GAAG,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAC3E,MAAM,SAAS,GAAgB;gBAC3B,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,MAAM;gBACZ,IAAI;gBACJ,GAAG;gBACH,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;aACxD,CAAC;YACF,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC/B,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC/B,OAAO,CAAC,oBAAoB,CAAC,MAAM,GAAG,CAAC,CAAC;YACxC,MAAM,SAAS,GAAG,EAAE,OAAO,CAAC,SAAS,CAAC;YACtC,MAAM,WAAW,GAAG,IAAA,+BAAe,EAAC,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACzC,MAAM,aAAa,GAAG,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC;gBACnD,SAAS,EAAE,OAAO,CAAC,cAAc;gBACjC,MAAM;gBACN,SAAS;aACZ,CAAC,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;gBACxB,MAAM;gBACN,cAAc,EAAE,OAAO,CAAC,cAAc;gBACtC,YAAY,EAAE,OAAO,CAAC,KAAK;gBAC3B,SAAS;gBACT,GAAG,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC;gBACrC,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;aACxD,CAAC,CAAC;YACH,MAAM,GAAG,GAAqB,IAAA,2CAAoB,EAAC;gBAC/C,MAAM;gBACN,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM;gBACxB,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM;gBACxB,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO;gBAC1B,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS;gBAC9B,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK;gBACtB,eAAe,EAAE,IAAI,CAAC,IAAI,CAAC,eAAe;gBAC1C,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK;gBACtB,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY;gBACpC,OAAO;gBACP,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS;gBAC9B,uEAAuE;gBACvE,wEAAwE;gBACxE,oCAAoC;gBACpC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;gBAChD,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;gBACpD,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG;aACrB,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACxB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,KAAK,SAAS;gBAClD,CAAC,CAAC,eAAM,CAAC,IAAI;gBACb,CAAC,CAAC,eAAM,CAAC,UAAU,CAAC;oBAChB,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,WAAY,CAAC,UAAU,CAAC,WAAW,CAAC;oBACzD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK;iBAC1B,CAAC,CAAC;YACP,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,KAAK,SAAS;gBACjD,CAAC,CAAC,eAAM,CAAC,IAAI;gBACb,CAAC,CAAC,eAAM,CAAC,UAAU,CAAC;oBAChB,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,WAAY,CAAC,SAAS,CAAC,WAAW,CAAC;oBACxD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK;iBAC1B,CAAC,CAAC,IAAI,CAAC,eAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,eAAM,CAAC,IAAI,CAAC,GAAG,EAAE;oBAC7C,gEAAgE;oBAChE,gEAAgE;oBAChE,+DAA+D;oBAC/D,IAAI,IAAI,CAAC,yBAAyB,KAAK,SAAS,EAAE,CAAC;wBAC/C,IAAI,CAAC,yBAAyB,GAAG,MAAM,CAAC,MAAM,CAAC;4BAC3C,KAAK,EAAE,gBAAyB;4BAChC,KAAK,EAAE,WAAW;4BAClB,KAAK;yBACR,CAAC,CAAC;oBACP,CAAC;gBACL,CAAC,CAAC,CAAC,CAAC,CAAC;YACT,8CAA8C;YAC9C,2DAA2D;YAC3D,IAAI,WAAW,GAAG,CAAC,CAAC;YACpB,MAAM,YAAY,GAAqB,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;gBAC7F,cAAc,EAAE,OAAO,CAAC,cAAc;gBACtC,MAAM;gBACN,WAAW,EAAE,WAAW,EAAE;aAC7B,CAAC,CAAC,CAAC;YACJ,MAAM,QAAQ,GAA+C,IAAI,CAAC,IAAI,CAAC,IAAI;gBACvE,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,YAAY,CAAC;gBACxF,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC,IAAI,CAAC,eAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACjH,MAAM,SAAS,GAAkB;gBAC7B,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,mBAAmB;gBAC/C,oBAAoB,EAAE,IAAI,CAAC,IAAI,CAAC,oBAAoB;gBACpD,cAAc,EAAE,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,EAAE;oBAChF,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;oBAChC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;wBACpB,YAAY,EAAE,OAAO,CAAC,KAAK;wBAC3B,SAAS;wBACT,WAAW;wBACX,SAAS;wBACT,UAAU;wBACV,OAAO,EAAE;4BACL,IAAI,EAAE,mBAAmB;4BACzB,UAAU,EAAE,UAAU;4BACtB,OAAO,EAAE,IAAA,kCAAe,EAAC,OAAO,CAAC;4BACjC,GAAG,CAAC,OAAO,EAAE,QAAQ,KAAK,SAAS,IAAI,OAAO,EAAE,MAAM,KAAK,SAAS;gCAChE,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gCACjK,CAAC,CAAC,EAAE,CAAC;yBACZ;wBACD,cAAc,EAAE;4BACZ,SAAS,EAAE,IAAI;4BACf,KAAK,EAAE,cAAc,CAAC,KAAK,IAAI,SAAS;4BACxC,MAAM,EAAE,cAAc,CAAC,MAAM;yBAChC;wBACD,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;wBACjD,GAAG,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBAC1E,CAAC,CAAC;oBACH,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;wBAChB,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;wBAC3C,eAAe,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;oBAClD,CAAC;gBACL,CAAC;gBACD,MAAM,EAAE,IAAI,CAAC,WAAW;gBACxB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,eAAe;gBAC/B,WAAW,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;gBAC3D,MAAM,EAAE,GAAG,CAAC,MAAM;aACrB,CAAC;YACF,MAAM,IAAI,GAAG,eAAM,CAAC,mBAAmB,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,eAAM,CAAC,OAAO,CAAC,eAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAA,iCAAiB,EAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,eAAM,CAAC,OAAO,CAAC,eAAM,CAAC,IAAI,CAAC,GAAG,EAAE;gBACxK,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,aAAa,CAAC,CAAC;gBAC5D,IAAI,aAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;oBACvB,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;oBAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;oBAC/E,OAAO,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;oBACrC,MAAM,oBAAoB,GAAG,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,CAAC;oBACpE,IAAI,CAAC,uBAAuB,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;oBAC1E,IAAA,wCAA0B,EAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;oBAC3C,MAAM,gBAAgB,GAAG,WAAW,IAAI,MAAM,CAAC;oBAC/C,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;wBACtC,MAAM;wBACN,YAAY,EAAE,OAAO,CAAC,KAAK;wBAC3B,SAAS;wBACT,KAAK,EAAE,WAAW;wBAClB,OAAO,EAAE,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW;wBAC1D,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;wBACvC,QAAQ;wBACR,aAAa,EAAE,IAAI,CAAC,MAAM;wBAC1B,gBAAgB,EAAE,oBAAoB;wBACtC,aAAa;wBACb,UAAU;wBACV,MAAM,EAAE,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;wBACnD,GAAG,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC;wBACrC,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;wBACrD,GAAG,CAAC,gBAAgB,KAAK,MAAM,IAAI,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBAC5E,gBAAgB;wBAChB,UAAU,EAAE,MAAM;wBAClB,KAAK,EAAE,IAAI,CAAC,KAAK;qBACpB,CAAC,CAAC;oBACH,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;wBACvB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;4BACtB,MAAM;4BACN,QAAQ,EAAE,cAAc;4BACxB,QAAQ,EAAE,gBAAgB,KAAK,MAAM;yBACxC,CAAC,CAAC;oBACP,CAAC;oBACD,OAAO;gBACX,CAAC;gBACD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,cAAK,CAAC,YAAY,CAAC,EAAE,KAAK,CAAC;gBACnE,MAAM,WAAW,GAAG,OAAO,KAAK,SAAS,IAAI,IAAA,gCAAa,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC1F,MAAM,WAAW,GAAG,cAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACxD,MAAM,UAAU,GAAG;oBACf,MAAM,EAAE,SAAkB;oBAC1B,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,mBAAmB;iBACvE,CAAC;gBACF,MAAM,oBAAoB,GAAG,IAAA,uCAAyB,EAAC,IAAI,CAAC,qBAAqB,EAAE;oBAC/E,MAAM,EAAE,UAAU;oBAClB,QAAQ,EAAE,UAAU;oBACpB,OAAO,EAAE,UAAU;oBACnB,MAAM,EAAE,UAAU;iBACrB,CAAC,CAAC;gBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,aAAa,EAAE,WAAW,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC;gBAC7F,OAAO,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;gBACrC,IAAI,CAAC,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,EAAE,oBAAoB,CAAC,CAAC;gBACvE,IAAI,CAAC,gBAAgB,GAAG,IAAA,mCAAqB,EAAC,CAAC,IAAI,CAAC,gBAAgB,EAAE,oBAAoB,CAAC,CAAC,CAAC;gBAC7F,OAAO,CAAC,gBAAgB,GAAG,IAAA,mCAAqB,EAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,oBAAoB,CAAC,CAAC,CAAC;gBACnG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC;gBACpD,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC;gBACpD,OAAO,CAAC,UAAU,GAAG,QAAQ,CAAC;gBAC9B,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC;gBAC3B,IAAI,WAAW,EAAE,KAAK,KAAK,SAAS,EAAE,CAAC;oBACnC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC;oBAC/C,eAAe,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC;gBACtD,CAAC;gBACD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;oBACf,MAAM;oBACN,YAAY,EAAE,OAAO,CAAC,KAAK;oBAC3B,SAAS;oBACT,KAAK,EAAE,WAAW;oBAClB,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ;oBAC/C,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,GAAG,CAAC,WAAW,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC;oBAClE,QAAQ;oBACR,gBAAgB,EAAE,oBAAoB;oBACtC,aAAa;oBACb,UAAU;oBACV,MAAM,EAAE,IAAI;oBACZ,GAAG,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC;oBACrC,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;oBACrD,GAAG,CAAC,WAAW,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC5E,CAAC,CAAC;YACP,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,aAAI,CAAC,SAAS,CAAC,IAAI,CAAC;gBAC1B,CAAC,CAAC,eAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;gBAC5B,CAAC,CAAC,eAAM,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,eAAM,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,eAAM,CAAC,IAAI,CAAC,GAAG,EAAE;gBACrF,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;gBACpC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;gBACpC,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM;qBAC3C,MAAM,CAAC,CAAC,CAAC,EAEX,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,iBAAiB,CAAC;qBAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;gBAC5B,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;oBACb,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;oBACxC,eAAe,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC/C,CAAC;gBACD,8DAA8D;gBAC9D,MAAM,oBAAoB,GAAG,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,CAAC;gBACpE,IAAI,CAAC,gBAAgB,GAAG,IAAA,mCAAqB,EAAC,CAAC,IAAI,CAAC,gBAAgB,EAAE,oBAAoB,CAAC,CAAC,CAAC;gBAC7F,OAAO,CAAC,gBAAgB,GAAG,IAAA,mCAAqB,EAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,oBAAoB,CAAC,CAAC,CAAC;gBACnG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC;gBACjC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC;gBAC9B,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC7C,IAAI,KAAK,KAAK,SAAS;oBACnB,OAAO,CAAC,WAAW,GAAG,KAAK,CAAC;gBAChC,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,YAAY,IAAI,CAAC,CAAC,CAAC;gBAC7E,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,mBAAmB,IAAI,KAAK,CAAC,SAAS,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;gBAC1H,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBACjF,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,SAAS,MAAM,IAAI,CAAC,MAAM,MAAM,GAAG,KAAK,QAAQ,MAAM,GAAG,UAAU,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,aAAa,CAAC,GAAG,IAAI,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACnL,OAAO,IAAI,CAAC;YAChB,CAAC,CAAC,CAAC,CAAC,CAAC;YACL,OAAO,UAAU,CAAC,IAAI,CAAC,eAAM,CAAC,OAAO,CAAC,eAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,eAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,eAAM,CAAC,QAAQ,CAAC,eAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;YACtL,kDAAkD;YAClD,eAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;IACP,CAAC;IACO,eAAe,CAAC,KAAgB,EAAE,GAAqB,EAAE,YAA8B;QAC3F,MAAM,aAAa,GAAqB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS;YACtE,CAAC,CAAC,IAAA,2CAAoB,EAAC,EAAE,GAAG,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;YACnF,CAAC,CAAC,GAAG,CAAC;QACV,MAAM,MAAM,GAAG,IAAA,mCAAe,EAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC;QACtE,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACvB,OAAO,IAAA,8CAAwB,EAAC,aAAa,EAAE,CAAC,eAAe,EAAE,EAAE,CAAC,YAAY,CAAC,eAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAA,mCAAe,EAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,eAAe,CAAE,CAAC,CAAC,IAAI,CAAC,eAAM,CAAC,QAAQ,CAAC,uCAAoB,CAAC,CAAC,CAAC,CAAC,CAAC;QACnN,CAAC;QACD,OAAO,IAAA,8CAAwB,EAAC,GAAG,EAAE,CAAC,eAAe,EAAE,EAAE,CAAC,YAAY,CAAC,IAAA,wCAAoB,EAAC,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,eAAM,CAAC,QAAQ,CAAC,uCAAoB,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5L,CAAC;IACD,4FAA4F;IACpF,qBAAqB,CAAC,QAAsE,EAAE,QAAyF;QAC3L,OAAO,eAAM,CAAC,mBAAmB,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,eAAM,CAAC,OAAO,CAAC,GAAG,EAAE;YAC/D,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC;YAC7C,MAAM,OAAO,GAA2B,MAAM,CAAC,MAAM,CAAC;gBAClD,GAAG,QAAQ,EAAE;gBACb,KAAK,EAAE,SAAS;gBAChB,OAAO,EAAE,IAAI;gBACb,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI;gBAC9B,KAAK,EAAE,IAAI;gBACX,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC;aACnF,CAAC,CAAC;YACH,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACtC,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,eAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,eAAM,CAAC,IAAI,CAAC,GAAG,EAAE;gBACnE,MAAM,OAAO,GAAG,aAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,cAAK,CAAC,YAAY,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;gBACtG,MAAM,KAAK,GAAG,aAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK;oBACjD,CAAC,CAAC,OAAO,KAAK,SAAS,IAAI,IAAA,gCAAa,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;gBAClF,IAAI,QAAQ,GAAuC,KAAK,KAAK,SAAS;oBAClE,CAAC,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,+BAA+B,EAAE;oBACpE,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC;gBACvC,IAAI,CAAC;oBACD,IAAI,aAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;wBACvB,QAAQ,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,6BAA6B,EAAE,CAAC;wBAC5E,QAAQ,GAAG,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC;oBAClE,CAAC;gBACL,CAAC;wBACO,CAAC;oBACL,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;wBAC3C,GAAG,OAAO;wBACV,KAAK,EAAE,UAAU;wBACjB,OAAO,EAAE,aAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW;4BACnF,CAAC,CAAC,cAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ;wBACpE,KAAK,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC;wBAC/D,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,QAAQ,EAAE,CAAC;qBAC3C,CAAC,CAAC;gBACP,CAAC;YACL,CAAC,CAAC,CAAC,CAAC,CAAC;QACT,CAAC,CAAC,CAAC,CAAC;IACR,CAAC;IACD;;;;OAIG;IACK,kBAAkB,CAAC,IAAsB,EAAE,KAIlD,EAAE,GAAqB,EAAE,YAA8B;QACpD,OAAO,IAAI,CAAC,aAAa,CAAC,CAAC,OAAO,EAAE,EAAE;YAClC,MAAM,OAAO,GAAqB,GAAG,CAAC,SAAS;gBAC3C,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,SAAS,EAAE,EAAE,GAAG,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,EAAE;gBACtD,CAAC,CAAC,GAAG,CAAC;YACV,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC,IAAI,CAAC,eAAM,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;YAC1B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YACrC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;gBACvB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC1C,IAAI,MAAM,CAAC,WAAW,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAAE,CAAC;gBAC9F,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC;gBACpC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,0JAA0J,CAAC,CAAC;YAC9K,CAAC;YACD,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;gBAC1B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,qGAAqG,CAAC,CAAC;YACzH,CAAC;YACD,OAAO;gBACH,IAAI,EAAE,MAAM,CAAC,MAAM;gBACnB,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW;gBACpE,MAAM,EAAE,MAAM,CAAC,MAAM;aACxB,CAAC;QACN,CAAC,CAAC,CAAC,CAAC;IACR,CAAC;IACD,sEAAsE;IACtE,qBAAqB,CAAC,KAA2B;QAC7C,MAAM,UAAU,GAAgB,EAAE,CAAC;QACnC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;QACjC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACxC,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS;gBAChD,SAAS;YACb,MAAM,UAAU,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC/H,MAAM,OAAO,GAAG,IAAI,GAAG,EAAuB,CAAC;YAC/C,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;gBAC5B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACxC,IAAI,KAAK,KAAK,SAAS;oBACnB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;;oBAElC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzB,CAAC;YACD,MAAM,QAAQ,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;iBAClC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,EAAE;gBAC/B,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;gBACtE,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACtH,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC;YAC3D,CAAC,CAAC;iBACG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;gBACzD,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,WAAW,CAAC;gBAC7F,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW;gBAC7B,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3C,IAAI,QAAQ,KAAK,SAAS;gBACtB,SAAS;YACb,MAAM,CAAC,QAAQ,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;YAC3C,MAAM,CAAC,QAAQ,CAAC,gBAAgB,GAAG,QAAQ,CAAC;YAC5C,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC;YACvB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YACxC,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;gBACrC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBACvB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1B,CAAC;QACL,CAAC;QACD,OAAO,UAAU,CAAC;IACtB,CAAC;IACO,SAAS,CAAC,KAAgB,EAAE,GAAqB;QACrD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;QAC9B,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,UAAU,GAA4B,IAAA,2CAAoB,EAAC,EAAE,GAAG,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC9H,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QACzC,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAClC,CAAC;CACJ;AArgBD,wCAqgBC;AACD;;;;;GAKG;AACH,SAAS,aAAa,CAAC,MAA8B;IACjD,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO;YAClB,OAAO,eAAe,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,SAAS,CAAC;AACrB,CAAC;AACD,4BAA4B;AAC5B,SAAS,eAAe,CAAC,CAAS,EAAE,KAAa;IAC7C,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5C,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK;QACrB,OAAO,KAAK,CAAC;IACjB,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC;AAC3C,CAAC;AACD,SAAgB,iBAAiB,CAAC,MAA8B;IAC5D,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE;YAC/D,OAAO,CAAC,CAAC,IAAI,CAAC;IACtB,CAAC;IACD,OAAO,SAAS,CAAC;AACrB,CAAC;AACD;;;;;;;;;GASG;AACH,SAAS,eAAe,CAAC,GAAU,EAAE,GAAU;IAC3C,IAAI,GAAG,CAAC,WAAW,KAAK,SAAS;QAC7B,GAAG,CAAC,WAAW,GAAG,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,WAAW,CAAC;IAC/D,IAAI,GAAG,CAAC,YAAY,KAAK,SAAS;QAC9B,GAAG,CAAC,YAAY,GAAG,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,YAAY,CAAC;IAClE,IAAI,GAAG,CAAC,eAAe,KAAK,SAAS;QACjC,GAAG,CAAC,eAAe,GAAG,CAAC,GAAG,CAAC,eAAe,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,eAAe,CAAC;IAC3E,IAAI,GAAG,CAAC,mBAAmB,KAAK,SAAS;QACrC,GAAG,CAAC,mBAAmB,GAAG,CAAC,GAAG,CAAC,mBAAmB,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,mBAAmB,CAAC;IACvF,IAAI,GAAG,CAAC,eAAe,KAAK,SAAS;QACjC,GAAG,CAAC,eAAe,GAAG,CAAC,GAAG,CAAC,eAAe,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,eAAe,CAAC;IAC3E,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS;QAC1B,GAAG,CAAC,QAAQ,GAAG,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC;IACtD,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAC5B,GAAG,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;IACtF,CAAC;AACL,CAAC","sourcesContent":["import type { ExperimentFlags } from \"../shared/types.ts\";\n// 会话驱动:把 t.send(text) 翻成 agent.send(input, ctx),在同一沙箱里多轮 resume /\n// newSession,并把每轮的标准事件流与用量累加进整次运行(供作用域断言 / o11y)。\nimport { randomBytes } from \"node:crypto\";\nimport { Cause, Effect, Exit, Option, Semaphore } from \"effect\";\nimport type { Agent, AgentContext, AgentSendContext, AgentSession, InputFile, InputRequest, InputResponse, JsonValue, Sandbox, SandboxAgentSendContext, SessionSlot, StreamEvent, Telemetry, TraceSpan, Turn, TurnInput, Usage } from \"../types.ts\";\nimport { entityIdFromEntropy, type TurnId } from \"../record/family/source-receipt/model.ts\";\nimport { ObservedEventIngestionCorrelator, bindObservedSnapshotToTurn, mintSessionScopeId, type ObservedAttemptCut, type ObservedEvaluationSegment, type ObservedSessionSnapshot, type ObservedTurnSnapshot, } from \"../o11y/observed.ts\";\nimport type { AgentOtelChannel, TurnSpans } from \"../o11y/otlp/turn-otel.ts\";\nimport type { AgentUsageContribution } from \"../o11y/eval-usage.ts\";\nimport { downgradeEvidenceCoverage, worstEvidenceCoverage, type ResolvedEvidenceCoverage, } from \"../assertions/coverage.ts\";\nimport { captureLoc, type SourceRegistry } from \"../source-loc.ts\";\nimport { createAttemptRetryBudget, sendWithTurnRetry, type AttemptRetryBudget, type ConcurrencySlot, type SendRetryDeps, } from \"./send-retry.ts\";\nimport type { AttemptFailureClassifier } from \"../shared/failure-class.ts\";\nimport { isSendFailure, normalizeSendFailure, sendFailureText } from \"./send-failures.ts\";\nimport type { RetryAttemptRecord, TimingActivity } from \"../runner/types.ts\";\nimport { formatTurnLabel } from \"../shared/turn-label.ts\";\nimport { bindAttemptResources } from \"./attempt-resources.ts\";\nimport { withAgentCallbackContext } from \"../agents/callback-context.ts\";\nimport { agentSendEffect, authorCallbackEffect } from \"../agents/effect-runtime.ts\";\ninterface PhysicalSendResult {\n readonly turn: Turn;\n readonly traceId?: string;\n readonly attribution?: \"traceparent\" | \"window\" | \"none\";\n readonly window?: TurnSpans[\"window\"];\n}\ninterface ObservedTurnState {\n readonly outcome: \"completed\" | \"failed\" | \"waiting\";\n readonly coverage: ResolvedEvidenceCoverage;\n}\ntype ObserveSendUsage = (callOnce: Effect.Effect<Turn, ReturnType<typeof normalizeSendFailure>>) => Effect.Effect<Turn, ReturnType<typeof normalizeSendFailure>>;\n/**\n * 一条会话线的存取器实现。slot 值只按 factory 创建的 symbol 身份存取;\n * 从异构 Map 取出后立即依 typed slot 恢复 `T`,不让擦除后的值流入领域逻辑。\n */\nabstract class StoredSessionSlotValue {\n declare private readonly storedSessionSlotValue: void;\n}\nclass StoredSessionSlotValueOf<T> extends StoredSessionSlotValue {\n constructor(readonly value: T) {\n super();\n }\n}\nfunction valueFromStoredSlot<T>(stored: StoredSessionSlotValue): T {\n return (stored as StoredSessionSlotValueOf<T>).value;\n}\nexport function createAgentSession(): AgentSession {\n let capturedId: string | undefined;\n const slots = new Map<symbol, StoredSessionSlotValue>();\n return {\n get id() {\n return capturedId;\n },\n capture(id) {\n if (!id || capturedId !== undefined)\n return; // 空值忽略;first-writer-wins\n capturedId = id;\n },\n get<T>(slot: SessionSlot<T>): T | undefined {\n const stored = slots.get(slot.key);\n return stored === undefined ? undefined : valueFromStoredSlot<T>(stored);\n },\n set<T>(slot: SessionSlot<T>, value: T): void {\n slots.set(slot.key, new StoredSessionSlotValueOf(value));\n },\n take<T>(slot: SessionSlot<T>): T | undefined {\n const stored = slots.get(slot.key);\n if (stored === undefined)\n return undefined;\n slots.delete(slot.key);\n return valueFromStoredSlot<T>(stored);\n },\n };\n}\n/**\n * 一条会话线的可变状态。存取器(id/capture/get/set/take)委托给\n * `createAgentSession()`;index/lastMessage/… 是运行器自己的会话簿记,不属于公开契约。\n */\nexport class RunSession implements AgentSession {\n private readonly session = createAgentSession();\n readonly sessionScopeId = mintSessionScopeId();\n private readonly observedTurnsValue: ObservedTurnSnapshot[] = [];\n /** Inclusive per-Session cut in observed ingestion order. */\n get throughSequence(): number {\n return this.observedTurnsValue.at(-1)?.throughSessionSequence ?? 0;\n }\n /** Immutable snapshots sealed for this Session so far. */\n observedSnapshot(): ObservedSessionSnapshot {\n return Object.freeze({\n sessionId: this.sessionScopeId,\n throughSessionSequence: this.throughSequence,\n turns: Object.freeze([...this.observedTurnsValue]),\n });\n }\n /** @internal Only SessionManager may append a sealed physical-send cut. */\n appendObservedTurn(snapshot: ObservedTurnSnapshot): void {\n if (snapshot.sessionId !== this.sessionScopeId) {\n throw new Error(\"Observed Turn belongs to a different Session scope\");\n }\n this.observedTurnsValue.push(snapshot);\n }\n get id(): string | undefined {\n return this.session.id;\n }\n capture(id: string | undefined): void {\n this.session.capture(id);\n }\n get<T>(slot: SessionSlot<T>): T | undefined {\n return this.session.get(slot);\n }\n set<T>(slot: SessionSlot<T>, value: T): void {\n this.session.set(slot, value);\n }\n take<T>(slot: SessionSlot<T>): T | undefined {\n return this.session.take(slot);\n }\n index = 1;\n lastMessage = \"\";\n lastStatus: \"completed\" | \"failed\" | \"waiting\" = \"completed\";\n readonly events: StreamEvent[] = [];\n readonly pendingInputRequests: InputRequest[] = [];\n readonly usage: Usage = {};\n /** 本会话累计的证据覆盖(初值 = Agent 级默认,逐轮按 Turn.evidenceCoverage 降级折叠)。 */\n evidenceCoverage!: ResolvedEvidenceCoverage;\n /** 本会话内的轮次计数(turn 时间树 / 展示标签 turn<N> 用)。 */\n turnCount = 0;\n}\nexport interface SessionDeps {\n agent: Agent;\n sandbox: Sandbox;\n /** 当前 Attempt 的 Eval 身份;Runner 路径必填,测试/第三方直构可省略。 */\n evalId?: string;\n /** 当前 Attempt 引用;与 setup/teardown 拿到的 AgentContext 保持同一身份。 */\n attempt?: AgentContext[\"attempt\"];\n /** 当前 Eval Group 身份;未分组 Eval 省略。 */\n evalGroup?: AgentContext[\"evalGroup\"];\n model?: string;\n reasoningEffort?: string;\n flags: ExperimentFlags;\n signal: AbortSignal;\n /**\n * The only Promise facade for the active Assert-first author surface. It\n * executes this SessionManager's Effect graph in the owning Attempt Scope.\n */\n requestEffect?: <Value, Error>(effect: Effect.Effect<Value, Error, never>) => Promise<Value>;\n log(msg: string): void;\n /** runner 绑定的作用域反馈(adapter ctx.progress/diagnostic);省略时 progress 退回 log。 */\n feedback?: import(\"../types.ts\").ScopedFeedback;\n /** adapter send 在飞时通知 runner(errored 归因到嵌套的 `agent.run` 阶段用)。 */\n onSendActive?: (active: boolean) => void;\n /**\n * 变更分类账的 send 窗口钩子(仅沙箱型 agent):`beforeSend` 在 adapter send 前落 eval 归因\n * commit,`afterSend` 在返回后落 agent 归因 commit;label 是 `turn<N>` 或\n * `session<K>/turn<N>` 窗口标签。\n * 提供钩子时 send 自动串行(同一 workdir 上重叠的 send 是写入竞争,窗口不重叠)。\n */\n ledgerHooks?: {\n beforeSend(label: string): Promise<void>;\n afterSend(label: string): Promise<void>;\n };\n /** attempt 单调时钟域的当前 offset;runner 注入,测试直调缺省使用 performance.now()。 */\n timingNow?: () => number;\n /**\n * 每轮 send 结束后回报单调时钟包络(runner 挂成 eval.run 下的 turn 时间树节点)。`usage` 是该轮\n * `Turn.usage` 落盘原样(有记录才传;`--execution`/`--timing` 的 turn 头行读 TimingNode.usage)。\n */\n onTurn?: ((info: {\n turnId: TurnId;\n sessionIndex: number;\n turnIndex: number;\n /** Exact terminal label allocated by this SessionManager. */\n label: string;\n /** One physical public send is sealed with this exact terminal outcome. */\n outcome: \"completed\" | \"failed\" | \"interrupted\";\n /** The interpreted terminal Adapter events for this physical send only. */\n events: readonly StreamEvent[];\n /** Exact source-owner snapshot consumed by Assertions and persistence. */\n observed: ObservedTurnSnapshot;\n /** Present only when the Adapter returned a terminal Turn. */\n adapterStatus?: Turn[\"status\"];\n /** Resolved Adapter-default plus Turn-local evidence coverage. */\n evidenceCoverage?: ResolvedEvidenceCoverage;\n startOffsetMs: number;\n durationMs: number;\n failed?: boolean;\n /** The real user-event source location, when stack capture succeeded. */\n loc?: ReturnType<typeof captureLoc>;\n /** Shared author-fact order; absent when there is no durable source site. */\n sourceOrder?: number;\n traceId?: string;\n traceAttribution?: \"traceparent\" | \"window\" | \"none\";\n otelWindow?: TurnSpans[\"window\"];\n usage?: Usage;\n }) => TimingActivity | undefined) & {\n /** Runs synchronously before ledger hooks or Adapter invocation. */\n readonly onStart?: (info: {\n readonly turnId: TurnId;\n readonly sessionScopeId: RunSession[\"sessionScopeId\"];\n readonly sessionIndex: number;\n readonly turnIndex: number;\n readonly loc?: ReturnType<typeof captureLoc>;\n readonly sourceOrder?: number;\n }) => void;\n /** Attempt-local secret replacement used before observed rows are sealed. */\n readonly normalizeObservedText?: (value: string) => string;\n };\n /** 路径推导出的实验 id(经 send ctx 透给 adapter,见 AgentContext.experimentId)。 */\n experimentId?: string;\n /** tracing agent 的 OTLP 端点(经 send ctx 透给 adapter,用于注入导出 env)。 */\n telemetry?: Telemetry;\n /** 非沙箱 tracing agent 的共享 OTLP 通道(runner 从 run 级池取,经它做逐轮 span 归属)。 */\n otel?: AgentOtelChannel;\n /**\n * turn 级重试退避期间释放/收回的全局并发槽位(见 docs/feature/error-classification/\n * architecture.md「退避与槽位」)。省略时退避不释放槽位(测试 / 无并发闸场景)。\n */\n concurrencySlot?: ConcurrencySlot;\n /**\n * 实验声明的失败分类器(`ExperimentDef.classifyFailure`):turn 链上排在 adapter 分类器\n * 之前询问(决议序见 docs/feature/error-classification/architecture.md「分类链」)。\n */\n experimentClassifier?: AttemptFailureClassifier;\n /** 与 Fact collector 共用的 attempt 级源码事实序号分配器。 */\n nextSourceOrder?: () => number;\n /** Attempt-owned source snapshot registry; Runner injects it explicitly. */\n sourceRegistry?: SourceRegistry;\n resources: import(\"../types.ts\").AttemptResourceRegistry;\n}\n/** A successful agent send whose post-send ledger checkpoint could not be recorded. */\nexport interface LedgerCaptureFailure {\n readonly state: \"capture-failed\";\n readonly label: string;\n readonly error: unknown;\n}\nexport class SessionManager {\n /** 整次运行(所有会话、所有轮)累计的标准事件流。 */\n readonly allEvents: StreamEvent[] = [];\n readonly usage: Usage = {};\n lastStatus: \"completed\" | \"failed\" | \"waiting\" = \"completed\";\n /** Agent 级默认覆盖(六通道在 factory 构造期已验证)。 */\n readonly agentEvidenceCoverage: ResolvedEvidenceCoverage;\n /** attempt 级累计覆盖:各轮解析后覆盖的最差值,随每次 send 折叠。 */\n evidenceCoverage: ResolvedEvidenceCoverage;\n /** 自动重试吸收的物理 send 失败;不混进 allEvents。 */\n readonly retryAttempts: RetryAttemptRecord[] = [];\n private readonly usageContributions: AgentUsageContribution[] = [];\n /** A frozen call-time copy; terminal replacement never changes an earlier pending cut. */\n usageContributionsSnapshot(): readonly AgentUsageContribution[] {\n return Object.freeze(this.usageContributions.map((contribution) => Object.freeze({\n ...contribution,\n usage: contribution.usage === null ? null : Object.freeze({ ...contribution.usage }),\n coverage: Object.freeze({ ...contribution.coverage }),\n })));\n }\n /** 归属到本 attempt 的 span(逐轮攒;attempt 末尾连同 sweep 的迟到 span 一起挂 trace)。 */\n readonly otelSpans: TraceSpan[] = [];\n /** 本 attempt 各轮的 traceId(attempt 末尾按它 sweep 迟到 span)。 */\n readonly otelTraceIds = new Set<string>();\n private readonly otelTurnRecords: Array<{\n window: TurnSpans[\"window\"];\n activity?: TimingActivity;\n hasSpans: boolean;\n }> = [];\n /** 已完成轮次的离散宿主时间窗口;共享 receiver sweep 只用这些窗口补迟到 span。 */\n get otelTurnWindows(): readonly TurnSpans[\"window\"][] {\n return this.otelTurnRecords.map((record) => record.window);\n }\n private warnedWindowAttribution = false;\n private warnedNoSpans = false;\n readonly primary: RunSession;\n private readonly sessions: RunSession[] = [];\n private turnCount = 0;\n private sessionCount = 0;\n /** 沙箱型 send 的 Effect 串行闸(见 SessionDeps.ledgerHooks):窗口不重叠。 */\n private readonly sendSemaphore = Semaphore.makeUnsafe(1);\n /** First failed post-send checkpoint makes the entire later diff producer unavailable. */\n private ledgerCaptureFailureValue: LedgerCaptureFailure | undefined;\n /** attempt 级 turn 重试预算,跨该 attempt 全部 send(全部 session)持续扣减,不随单次 send 重置。 */\n private readonly retryBudget: AttemptRetryBudget = createAttemptRetryBudget();\n private localSourceOrder = 0;\n private readonly nextSourceOrder: () => number;\n private readonly observedIngestion: ObservedEventIngestionCorrelator;\n private observedTurnStates = new WeakMap<ObservedTurnSnapshot, ObservedTurnState>();\n constructor(private readonly deps: SessionDeps) {\n this.nextSourceOrder = deps.nextSourceOrder ?? (() => ++this.localSourceOrder);\n this.agentEvidenceCoverage = deps.agent.evidenceCoverage;\n this.evidenceCoverage = this.agentEvidenceCoverage;\n this.observedIngestion = new ObservedEventIngestionCorrelator({\n ...(deps.onTurn?.normalizeObservedText === undefined\n ? {}\n : { normalizeText: deps.onTurn.normalizeObservedText }),\n });\n this.primary = this.newSession();\n }\n /** Stable vector cut for every Session that has begun observation. */\n observedAttemptCut(): ObservedAttemptCut {\n return this.observedIngestion.attemptCut();\n }\n /** A frozen call-time cut of all sealed sends, including failed sends without a Turn. */\n observedSessionSnapshots(): readonly ObservedSessionSnapshot[] {\n return Object.freeze(this.sessions.map((session) => session.observedSnapshot()));\n }\n observedTurnState(snapshot: ObservedTurnSnapshot): ObservedTurnState | undefined {\n return this.observedTurnStates.get(snapshot);\n }\n /** Absorbed retry events have no sealed observed identities to include in default history. */\n observedHistoryIncompleteReason(): string | undefined {\n return this.retryAttempts.some((attempt) => attempt.events.length > 0)\n ? \"agent-retry-history-unsealed\"\n : undefined;\n }\n observedEvaluationSegment(snapshot: ObservedTurnSnapshot): ObservedEvaluationSegment | undefined {\n return this.observedIngestion.evaluationSegment(snapshot);\n }\n releaseObservedEvaluationSegments(): void {\n this.observedIngestion.releaseEvaluationSegments();\n this.observedTurnStates = new WeakMap();\n }\n private recordObservedTurnState(snapshot: ObservedTurnSnapshot, outcome: ObservedTurnState[\"outcome\"], coverage: ResolvedEvidenceCoverage): void {\n this.observedTurnStates.set(snapshot, Object.freeze({\n outcome,\n coverage: Object.freeze({\n events: Object.freeze({ ...coverage.events }),\n messages: Object.freeze({ ...coverage.messages }),\n actions: Object.freeze({ ...coverage.actions }),\n status: Object.freeze({ ...coverage.status }),\n usage: Object.freeze({ ...coverage.usage }),\n data: Object.freeze({ ...coverage.data }),\n }),\n }));\n }\n private mintPhysicalTurnId(): TurnId {\n const turnId = entityIdFromEntropy(\"turn\", randomBytes(16));\n if (turnId === undefined)\n throw new Error(\"SessionManager failed to mint a TurnId\");\n return turnId;\n }\n /** A ledger checkpoint failure is attempt state, not a synthetic empty diff. */\n get ledgerCaptureFailure(): LedgerCaptureFailure | undefined {\n return this.ledgerCaptureFailureValue;\n }\n newSession(): RunSession {\n const s = new RunSession();\n s.index = ++this.sessionCount;\n s.evidenceCoverage = this.agentEvidenceCoverage;\n this.observedIngestion.registerSession(s.sessionScopeId);\n this.sessions.push(s);\n return s;\n }\n /** 一轮的解析后覆盖:Agent 默认按 Turn.evidenceCoverage 降级(只降不升)。 */\n resolveTurnEvidenceCoverage(turn: Turn): ResolvedEvidenceCoverage {\n return downgradeEvidenceCoverage(this.agentEvidenceCoverage, turn.evidenceCoverage);\n }\n send(session: RunSession, text: string, files?: readonly InputFile[], responses?: readonly InputResponse[]): Promise<Turn> {\n const requestEffect = this.deps.requestEffect;\n if (requestEffect === undefined) {\n throw new Error(\"SessionManager requires the Attempt Effect bridge\");\n }\n return requestEffect(this.sendEffect(session, text, files, responses));\n }\n /**\n * The entire logical send is one Effect. The public Promise facade above is\n * deliberately only available through AssertFirstAttemptBridge.requestEffect.\n */\n sendEffect(session: RunSession, text: string, files?: readonly InputFile[], responses?: readonly InputResponse[], loc?: ReturnType<typeof captureLoc>): Effect.Effect<Turn, unknown> {\n const send = this.sendSerializedEffect(session, text, loc ?? captureLoc({ registry: this.deps.sourceRegistry }), files, responses);\n // Sandbox sends share one workdir, so their attribution windows cannot\n // overlap. Direct Agent sends retain their existing unconstrained behavior.\n return this.deps.ledgerHooks === undefined\n ? send\n : this.sendSemaphore.withPermits(1)(send);\n }\n private sendSerializedEffect(session: RunSession, text: string, loc: ReturnType<typeof captureLoc>, files?: readonly InputFile[], responses?: readonly InputResponse[]): Effect.Effect<Turn, unknown> {\n return Effect.suspend(() => {\n const n = ++this.turnCount;\n const turnLabel = session.index === 1\n ? `turn ${n}`\n : `session ${session.index} · turn ${n}`;\n const attach = files?.length ? ` 📎${files.length}` : \"\";\n const userDetail = text.trim().length > 0\n ? text\n : files?.[0]?.filename ?? `[file]`;\n this.deps.feedback?.progress({ message: `user: ${userDetail}${attach}` });\n const timingNow = this.deps.timingNow ?? (() => performance.now());\n const startOffsetMs = timingNow();\n // A source order belongs only to a user event that can become an\n // Attempt source-site. Do not consume the shared sequence for a failed\n // stack capture.\n const sourceOrder = loc === undefined ? undefined : this.nextSourceOrder();\n const userEvent: StreamEvent = {\n type: \"message\",\n role: \"user\",\n text,\n loc,\n ...(sourceOrder === undefined ? {} : { sourceOrder }),\n };\n this.allEvents.push(userEvent);\n session.events.push(userEvent);\n session.pendingInputRequests.length = 0;\n const turnIndex = ++session.turnCount;\n const windowLabel = formatTurnLabel(session.index, turnIndex);\n const turnId = this.mintPhysicalTurnId();\n const observedDraft = this.observedIngestion.beginTurn({\n sessionId: session.sessionScopeId,\n turnId,\n userEvent,\n });\n this.deps.onTurn?.onStart?.({\n turnId,\n sessionScopeId: session.sessionScopeId,\n sessionIndex: session.index,\n turnIndex,\n ...(loc === undefined ? {} : { loc }),\n ...(sourceOrder === undefined ? {} : { sourceOrder }),\n });\n const ctx: AgentSendContext = bindAttemptResources({\n turnId,\n signal: this.deps.signal,\n evalId: this.deps.evalId,\n attempt: this.deps.attempt,\n evalGroup: this.deps.evalGroup,\n model: this.deps.model,\n reasoningEffort: this.deps.reasoningEffort,\n flags: this.deps.flags,\n experimentId: this.deps.experimentId,\n session,\n telemetry: this.deps.telemetry,\n // Progress is intentionally transient. A direct SessionManager without\n // an ACTIVE feedback sink drops it instead of turning it into a durable\n // timeout breadcrumb through `log`.\n progress: (u) => this.deps.feedback?.progress(u),\n diagnostic: (d) => this.deps.feedback?.diagnostic(d),\n log: this.deps.log,\n }, this.deps.resources);\n const beforeSend = this.deps.ledgerHooks === undefined\n ? Effect.void\n : Effect.tryPromise({\n try: () => this.deps.ledgerHooks!.beforeSend(windowLabel),\n catch: (error) => error,\n });\n const afterSend = this.deps.ledgerHooks === undefined\n ? Effect.void\n : Effect.tryPromise({\n try: () => this.deps.ledgerHooks!.afterSend(windowLabel),\n catch: (error) => error,\n }).pipe(Effect.catch((error) => Effect.sync(() => {\n // The agent turn itself did complete. Preserve that success for\n // the author, but retain the failed checkpoint so freeze cannot\n // turn an incomplete capture into a convincing empty document.\n if (this.ledgerCaptureFailureValue === undefined) {\n this.ledgerCaptureFailureValue = Object.freeze({\n state: \"capture-failed\" as const,\n label: windowLabel,\n error,\n });\n }\n })));\n // turn 级重试只包这一次物理 agent send。SDK Promise 在这两个\n // Effect.tryPromise 边界适配;retry 本身不再包含手写 Promise / timeout。\n let sendAttempt = 0;\n const observeUsage: ObserveSendUsage = (callOnce) => this.recordSendUsageEffect(callOnce, () => ({\n sessionScopeId: session.sessionScopeId,\n turnId,\n sendAttempt: sendAttempt++,\n }));\n const sendOnce: Effect.Effect<PhysicalSendResult, unknown> = this.deps.otel\n ? this.sendWithOtelEffect(this.deps.otel, { text, files, responses }, ctx, observeUsage)\n : this.sendAgentEffect({ text, files, responses }, ctx, observeUsage).pipe(Effect.map((turn) => ({ turn })));\n const retryDeps: SendRetryDeps = {\n classifier: this.deps.agent.classifySendFailure,\n experimentClassifier: this.deps.experimentClassifier,\n onRetryAttempt: ({ sendAttempt, startedAt, durationMs, failure, classification }) => {\n const process = failure.process;\n this.retryAttempts.push({\n sessionIndex: session.index,\n turnIndex,\n sendAttempt,\n startedAt,\n durationMs,\n failure: {\n type: \"agent-send-failed\",\n acceptance: \"rejected\",\n message: sendFailureText(failure),\n ...(process?.exitCode !== undefined || process?.signal !== undefined\n ? { process: { ...(process.exitCode !== undefined ? { exitCode: process.exitCode } : {}), ...(process.signal !== undefined ? { signal: process.signal } : {}) } }\n : {}),\n },\n classification: {\n retryable: true,\n scope: classification.scope ?? \"attempt\",\n reason: classification.reason,\n },\n events: failure.events ? [...failure.events] : [],\n ...(failure.usage !== undefined ? { usage: { ...failure.usage } } : {}),\n });\n if (failure.usage) {\n accumulateUsage(this.usage, failure.usage);\n accumulateUsage(session.usage, failure.usage);\n }\n },\n budget: this.retryBudget,\n slot: this.deps.concurrencySlot,\n reportRetry: (message: string) => ctx.progress({ message }),\n signal: ctx.signal,\n };\n const send = Effect.uninterruptibleMask((restore) => Effect.flatMap(Effect.exit(restore(sendWithTurnRetry(sendOnce, retryDeps))), (exit) => Effect.flatMap(Effect.sync(() => {\n const durationMs = Math.max(0, timingNow() - startOffsetMs);\n if (Exit.isSuccess(exit)) {\n const { turn, traceId, attribution, window } = exit.value;\n const observed = this.observedIngestion.finishTurn(observedDraft, turn.events);\n session.appendObservedTurn(observed);\n const turnEvidenceCoverage = this.resolveTurnEvidenceCoverage(turn);\n this.recordObservedTurnState(observed, turn.status, turnEvidenceCoverage);\n bindObservedSnapshotToTurn(turn, observed);\n const traceAttribution = attribution ?? \"none\";\n const timingActivity = this.deps.onTurn?.({\n turnId,\n sessionIndex: session.index,\n turnIndex,\n label: windowLabel,\n outcome: turn.status === \"failed\" ? \"failed\" : \"completed\",\n events: Object.freeze([...turn.events]),\n observed,\n adapterStatus: turn.status,\n evidenceCoverage: turnEvidenceCoverage,\n startOffsetMs,\n durationMs,\n failed: turn.status === \"failed\" ? true : undefined,\n ...(loc === undefined ? {} : { loc }),\n ...(sourceOrder === undefined ? {} : { sourceOrder }),\n ...(traceAttribution !== \"none\" && traceId !== undefined ? { traceId } : {}),\n traceAttribution,\n otelWindow: window,\n usage: turn.usage,\n });\n if (window !== undefined) {\n this.otelTurnRecords.push({\n window,\n activity: timingActivity,\n hasSpans: traceAttribution !== \"none\",\n });\n }\n return;\n }\n const failure = exit.cause.reasons.find(Cause.isFailReason)?.error;\n const sendFailure = failure !== undefined && isSendFailure(failure) ? failure : undefined;\n const interrupted = Cause.hasInterruptsOnly(exit.cause);\n const incomplete = {\n status: \"partial\" as const,\n reason: interrupted ? \"agent-send-interrupted\" : \"agent-send-failed\",\n };\n const turnEvidenceCoverage = downgradeEvidenceCoverage(this.agentEvidenceCoverage, {\n events: incomplete,\n messages: incomplete,\n actions: incomplete,\n status: incomplete,\n });\n const observed = this.observedIngestion.finishTurn(observedDraft, sendFailure?.events ?? []);\n session.appendObservedTurn(observed);\n this.recordObservedTurnState(observed, \"failed\", turnEvidenceCoverage);\n this.evidenceCoverage = worstEvidenceCoverage([this.evidenceCoverage, turnEvidenceCoverage]);\n session.evidenceCoverage = worstEvidenceCoverage([session.evidenceCoverage, turnEvidenceCoverage]);\n this.allEvents.push(...(sendFailure?.events ?? []));\n session.events.push(...(sendFailure?.events ?? []));\n session.lastStatus = \"failed\";\n this.lastStatus = \"failed\";\n if (sendFailure?.usage !== undefined) {\n accumulateUsage(this.usage, sendFailure.usage);\n accumulateUsage(session.usage, sendFailure.usage);\n }\n this.deps.onTurn?.({\n turnId,\n sessionIndex: session.index,\n turnIndex,\n label: windowLabel,\n outcome: interrupted ? \"interrupted\" : \"failed\",\n events: Object.freeze([userEvent, ...(sendFailure?.events ?? [])]),\n observed,\n evidenceCoverage: turnEvidenceCoverage,\n startOffsetMs,\n durationMs,\n failed: true,\n ...(loc === undefined ? {} : { loc }),\n ...(sourceOrder === undefined ? {} : { sourceOrder }),\n ...(sendFailure?.usage !== undefined ? { usage: sendFailure.usage } : {}),\n });\n }), () => Exit.isSuccess(exit)\n ? Effect.succeed(exit.value)\n : Effect.failCause(exit.cause)))).pipe(Effect.flatMap(({ turn }) => Effect.sync(() => {\n this.allEvents.push(...turn.events);\n session.events.push(...turn.events);\n session.pendingInputRequests.push(...turn.events\n .filter((e): e is Extract<StreamEvent, {\n type: \"input.requested\";\n }> => e.type === \"input.requested\")\n .map((e) => e.request));\n if (turn.usage) {\n accumulateUsage(this.usage, turn.usage);\n accumulateUsage(session.usage, turn.usage);\n }\n // 证据覆盖:attempt / session 级聚合取各轮最差值(见 assertions/coverage.ts)。\n const turnEvidenceCoverage = this.resolveTurnEvidenceCoverage(turn);\n this.evidenceCoverage = worstEvidenceCoverage([this.evidenceCoverage, turnEvidenceCoverage]);\n session.evidenceCoverage = worstEvidenceCoverage([session.evidenceCoverage, turnEvidenceCoverage]);\n session.lastStatus = turn.status;\n this.lastStatus = turn.status;\n const reply = lastAssistantText(turn.events);\n if (reply !== undefined)\n session.lastMessage = reply;\n const tok = (turn.usage?.inputTokens ?? 0) + (turn.usage?.outputTokens ?? 0);\n const tools = turn.events.filter((event) => event.type === \"operation.started\" && event.operation.kind === \"tool\").length;\n const reason = turn.status === \"failed\" ? failureReason(turn.events) : undefined;\n this.deps.log(`${turnLabel} ← ${turn.status} · ${`${tools} tools`} · ${tok} tok · ${Math.round(Math.max(0, timingNow() - startOffsetMs) / 1000)}s${reason ? ` · ${reason}` : \"\"}`);\n return turn;\n })));\n return beforeSend.pipe(Effect.andThen(Effect.sync(() => this.deps.onSendActive?.(true)).pipe(Effect.andThen(send), Effect.ensuring(Effect.sync(() => this.deps.onSendActive?.(false))), \n // send 返回后:这个 send 窗口内的全部 workspace 变化落 agent 归因。\n Effect.ensuring(afterSend))));\n });\n }\n private sendAgentEffect(input: TurnInput, ctx: AgentSendContext, observeUsage: ObserveSendUsage): Effect.Effect<Turn, ReturnType<typeof normalizeSendFailure>> {\n const nativeContext: AgentSendContext = this.deps.agent.kind === \"sandbox\"\n ? bindAttemptResources({ ...ctx, sandbox: this.deps.sandbox }, this.deps.resources)\n : ctx;\n const native = agentSendEffect(this.deps.agent, input, nativeContext);\n if (native !== undefined) {\n return withAgentCallbackContext(nativeContext, (callbackContext) => observeUsage(Effect.suspend(() => agentSendEffect(this.deps.agent, input, callbackContext)!).pipe(Effect.mapError(normalizeSendFailure))));\n }\n return withAgentCallbackContext(ctx, (callbackContext) => observeUsage(authorCallbackEffect(() => this.sendAgent(input, callbackContext)).pipe(Effect.mapError(normalizeSendFailure))));\n }\n /** Runs at the Agent invoke boundary, after ledger and OTLP preparation, once per retry. */\n private recordSendUsageEffect(callOnce: Effect.Effect<Turn, ReturnType<typeof normalizeSendFailure>>, identity: () => Pick<AgentUsageContribution, \"sessionScopeId\" | \"turnId\" | \"sendAttempt\">): Effect.Effect<Turn, ReturnType<typeof normalizeSendFailure>> {\n return Effect.uninterruptibleMask((restore) => Effect.suspend(() => {\n const index = this.usageContributions.length;\n const pending: AgentUsageContribution = Object.freeze({\n ...identity(),\n state: \"pending\",\n outcome: null,\n model: this.deps.model ?? null,\n usage: null,\n coverage: Object.freeze({ status: \"unavailable\", reason: \"agent-send-pending\" }),\n });\n this.usageContributions.push(pending);\n return restore(callOnce).pipe(Effect.onExit((exit) => Effect.sync(() => {\n const failure = Exit.isFailure(exit) ? exit.cause.reasons.find(Cause.isFailReason)?.error : undefined;\n const usage = Exit.isSuccess(exit) ? exit.value.usage\n : failure !== undefined && isSendFailure(failure) ? failure.usage : undefined;\n let coverage: AgentUsageContribution[\"coverage\"] = usage === undefined\n ? { status: \"unavailable\", reason: \"agent-send-usage-not-reported\" }\n : this.agentEvidenceCoverage.usage;\n try {\n if (Exit.isSuccess(exit)) {\n coverage = { status: \"unavailable\", reason: \"agent-send-invalid-coverage\" };\n coverage = this.resolveTurnEvidenceCoverage(exit.value).usage;\n }\n }\n finally {\n this.usageContributions[index] = Object.freeze({\n ...pending,\n state: \"terminal\",\n outcome: Exit.isSuccess(exit) ? exit.value.status === \"failed\" ? \"failed\" : \"completed\"\n : Cause.hasInterruptsOnly(exit.cause) ? \"interrupted\" : \"failed\",\n usage: usage === undefined ? null : Object.freeze({ ...usage }),\n coverage: Object.freeze({ ...coverage }),\n });\n }\n })));\n }));\n }\n /**\n * 经共享 OTLP 通道跑一轮:本轮的 traceparent 经 ctx.telemetry.headers 交给 adapter,\n * 返回后按 traceId / 时间窗口把本轮 span 归属进瀑布图。span 只进瀑布图,不进事件流、\n * 不喂断言——断言依据全部来自 send 返回的 Turn。\n */\n private sendWithOtelEffect(otel: AgentOtelChannel, input: {\n text: string;\n files?: readonly InputFile[];\n responses?: readonly InputResponse[];\n }, ctx: AgentSendContext, observeUsage: ObserveSendUsage): Effect.Effect<PhysicalSendResult, ReturnType<typeof normalizeSendFailure>> {\n return otel.runTurnEffect((headers) => {\n const turnCtx: AgentSendContext = ctx.telemetry\n ? { ...ctx, telemetry: { ...ctx.telemetry, headers } }\n : ctx;\n return this.sendAgentEffect(input, turnCtx, observeUsage);\n }).pipe(Effect.map((result) => {\n this.otelSpans.push(...result.spans);\n if (result.spans.length > 0)\n this.otelTraceIds.add(result.traceId);\n if (result.attribution === \"window\" && result.spans.length > 0 && !this.warnedWindowAttribution) {\n this.warnedWindowAttribution = true;\n this.deps.log(`otel: spans missing our traceparent, attributing by time window (turns for this agent serialized; concurrency resumes once W3C propagation is confirmed)`);\n }\n if (result.spans.length === 0 && !this.warnedNoSpans) {\n this.warnedNoSpans = true;\n this.deps.log(`otel: 0 spans this turn — endpoint not wired? (env not injected / service not restarted / no flush)`);\n }\n return {\n turn: result.result,\n traceId: result.traceId,\n attribution: result.spans.length === 0 ? \"none\" : result.attribution,\n window: result.window,\n };\n }));\n }\n /** telemetry.collect 收到 BatchSpanProcessor 迟到导出后,回写尚无 span 的 turn。 */\n attributeDeferredOtel(spans: readonly TraceSpan[]): TraceSpan[] {\n const attributed: TraceSpan[] = [];\n const remaining = new Set(spans);\n for (const record of this.otelTurnRecords) {\n if (record.hasSpans || record.activity === undefined)\n continue;\n const candidates = [...remaining].filter((span) => span.endMs >= record.window.startMs && span.startMs <= record.window.endMs);\n const byTrace = new Map<string, TraceSpan[]>();\n for (const span of candidates) {\n const group = byTrace.get(span.traceId);\n if (group === undefined)\n byTrace.set(span.traceId, [span]);\n else\n group.push(span);\n }\n const selected = [...byTrace.entries()]\n .map(([traceId, traceSpans]) => {\n const latestEndMs = Math.max(...traceSpans.map((span) => span.endMs));\n const coversEnd = traceSpans.some((span) => span.startMs <= record.window.endMs && span.endMs >= record.window.endMs);\n return { traceId, traceSpans, latestEndMs, coversEnd };\n })\n .sort((a, b) => Number(b.coversEnd) - Number(a.coversEnd) ||\n Math.abs(record.window.endMs - a.latestEndMs) - Math.abs(record.window.endMs - b.latestEndMs) ||\n b.latestEndMs - a.latestEndMs ||\n a.traceId.localeCompare(b.traceId))[0];\n if (selected === undefined)\n continue;\n record.activity.traceId = selected.traceId;\n record.activity.traceAttribution = \"window\";\n record.hasSpans = true;\n this.otelTraceIds.add(selected.traceId);\n for (const span of selected.traceSpans) {\n remaining.delete(span);\n attributed.push(span);\n }\n }\n return attributed;\n }\n private sendAgent(input: TurnInput, ctx: AgentSendContext): Promise<Turn> {\n const agent = this.deps.agent;\n if (agent.kind === \"sandbox\") {\n const sandboxCtx: SandboxAgentSendContext = bindAttemptResources({ ...ctx, sandbox: this.deps.sandbox }, this.deps.resources);\n return agent.send(input, sandboxCtx);\n }\n return agent.send(input, ctx);\n }\n}\n/**\n * 失败轮的进度行原因摘要:取本轮事件流里最后一个 `type: \"error\"` 事件的 message\n * (与 src/agents/shared.ts 的 diagnoseFailure 同一口径——\n * 都认「最后一条 error 事件」为本轮失败的权威原因),压成单行并截断,避免 402/超时\n * 这类关键信息只能事后翻落盘的 result.json 才看得到。提不到时返回 undefined,调用方不补空后缀。\n */\nfunction failureReason(events: readonly StreamEvent[]): string | undefined {\n for (let i = events.length - 1; i >= 0; i--) {\n const e = events[i];\n if (e.type === \"error\")\n return truncateOneLine(e.message, 120);\n }\n return undefined;\n}\n/** 单行截断:折叠空白 + 120 字符上限。 */\nfunction truncateOneLine(s: string, width: number): string {\n const clean = s.replace(/\\s+/g, \" \").trim();\n if (clean.length <= width)\n return clean;\n return `${clean.slice(0, width - 1)}…`;\n}\nexport function lastAssistantText(events: readonly StreamEvent[]): string | undefined {\n for (let i = events.length - 1; i >= 0; i--) {\n const e = events[i];\n if (e.type === \"message\" && e.role === \"assistant\" && e.text.trim())\n return e.text;\n }\n return undefined;\n}\n/**\n * 每个字段只在某一轮真的带回该值时才累加,协议不提供就保持省略(见\n * docs/feature/record/architecture.md「Usage」:「每个字段只在协议真实提供该值时存在……\n * 不存在『默认 0』或『默认 1』的字段」)。此前 `requests` 用 `add.requests ?? 1` 累加,会让\n * 转录解析型 adapter(整个 attempt 只在末尾解析一次 transcript、天然不报每轮请求数)的一轮\n * send 被硬算成 1 个请求,一个内部发起了 21 次工具调用的 codex session 因此落盘\n * `requests: 1`——不是真值,是轮数的误代理(见 memory 的 show-scope-slice-json-ruling 条目)。\n * `inputTokens`/`outputTokens` 此前是 Usage 的必填字段、始终累加(缺省视同 0);现在两者也\n * 可选化,同一条纪律统一适用:任何字段缺席就保持缺席,不拿「大概率是 0」去凑。\n */\nfunction accumulateUsage(acc: Usage, add: Usage): void {\n if (add.inputTokens !== undefined)\n acc.inputTokens = (acc.inputTokens ?? 0) + add.inputTokens;\n if (add.outputTokens !== undefined)\n acc.outputTokens = (acc.outputTokens ?? 0) + add.outputTokens;\n if (add.cacheReadTokens !== undefined)\n acc.cacheReadTokens = (acc.cacheReadTokens ?? 0) + add.cacheReadTokens;\n if (add.cacheCreationTokens !== undefined)\n acc.cacheCreationTokens = (acc.cacheCreationTokens ?? 0) + add.cacheCreationTokens;\n if (add.reasoningTokens !== undefined)\n acc.reasoningTokens = (acc.reasoningTokens ?? 0) + add.reasoningTokens;\n if (add.requests !== undefined)\n acc.requests = (acc.requests ?? 0) + add.requests;\n if (add.costUSD !== undefined) {\n acc.costUSD = acc.costUSD === undefined ? add.costUSD : acc.costUSD + add.costUSD;\n }\n}\n"]}
@@ -4,11 +4,16 @@ import type { Agent, AgentContext, AgentSession, InputFile, InputRequest, InputR
4
4
  import { type TurnId } from "../record/family/source-receipt/model.cjs";
5
5
  import { type ObservedAttemptCut, type ObservedEvaluationSegment, type ObservedSessionSnapshot, type ObservedTurnSnapshot } from "../o11y/observed.cjs";
6
6
  import type { AgentOtelChannel, TurnSpans } from "../o11y/otlp/turn-otel.cjs";
7
+ import type { AgentUsageContribution } from "../o11y/eval-usage.cjs";
7
8
  import { type ResolvedEvidenceCoverage } from "../assertions/coverage.cjs";
8
9
  import { captureLoc, type SourceRegistry } from "../source-loc.cjs";
9
10
  import { type ConcurrencySlot } from "./send-retry.cjs";
10
11
  import type { AttemptFailureClassifier } from "../shared/failure-class.cjs";
11
12
  import type { RetryAttemptRecord, TimingActivity } from "../runner/types.cjs";
13
+ interface ObservedTurnState {
14
+ readonly outcome: "completed" | "failed" | "waiting";
15
+ readonly coverage: ResolvedEvidenceCoverage;
16
+ }
12
17
  export declare function createAgentSession(): AgentSession;
13
18
  /**
14
19
  * 一条会话线的可变状态。存取器(id/capture/get/set/take)委托给
@@ -159,6 +164,9 @@ export declare class SessionManager {
159
164
  evidenceCoverage: ResolvedEvidenceCoverage;
160
165
  /** 自动重试吸收的物理 send 失败;不混进 allEvents。 */
161
166
  readonly retryAttempts: RetryAttemptRecord[];
167
+ private readonly usageContributions;
168
+ /** A frozen call-time copy; terminal replacement never changes an earlier pending cut. */
169
+ usageContributionsSnapshot(): readonly AgentUsageContribution[];
162
170
  /** 归属到本 attempt 的 span(逐轮攒;attempt 末尾连同 sweep 的迟到 span 一起挂 trace)。 */
163
171
  readonly otelSpans: TraceSpan[];
164
172
  /** 本 attempt 各轮的 traceId(attempt 末尾按它 sweep 迟到 span)。 */
@@ -181,11 +189,18 @@ export declare class SessionManager {
181
189
  private localSourceOrder;
182
190
  private readonly nextSourceOrder;
183
191
  private readonly observedIngestion;
192
+ private observedTurnStates;
184
193
  constructor(deps: SessionDeps);
185
194
  /** Stable vector cut for every Session that has begun observation. */
186
195
  observedAttemptCut(): ObservedAttemptCut;
196
+ /** A frozen call-time cut of all sealed sends, including failed sends without a Turn. */
197
+ observedSessionSnapshots(): readonly ObservedSessionSnapshot[];
198
+ observedTurnState(snapshot: ObservedTurnSnapshot): ObservedTurnState | undefined;
199
+ /** Absorbed retry events have no sealed observed identities to include in default history. */
200
+ observedHistoryIncompleteReason(): string | undefined;
187
201
  observedEvaluationSegment(snapshot: ObservedTurnSnapshot): ObservedEvaluationSegment | undefined;
188
202
  releaseObservedEvaluationSegments(): void;
203
+ private recordObservedTurnState;
189
204
  private mintPhysicalTurnId;
190
205
  /** A ledger checkpoint failure is attempt state, not a synthetic empty diff. */
191
206
  get ledgerCaptureFailure(): LedgerCaptureFailure | undefined;
@@ -200,6 +215,8 @@ export declare class SessionManager {
200
215
  sendEffect(session: RunSession, text: string, files?: readonly InputFile[], responses?: readonly InputResponse[], loc?: ReturnType<typeof captureLoc>): Effect.Effect<Turn, unknown>;
201
216
  private sendSerializedEffect;
202
217
  private sendAgentEffect;
218
+ /** Runs at the Agent invoke boundary, after ledger and OTLP preparation, once per retry. */
219
+ private recordSendUsageEffect;
203
220
  /**
204
221
  * 经共享 OTLP 通道跑一轮:本轮的 traceparent 经 ctx.telemetry.headers 交给 adapter,
205
222
  * 返回后按 traceId / 时间窗口把本轮 span 归属进瀑布图。span 只进瀑布图,不进事件流、
@@ -211,3 +228,4 @@ export declare class SessionManager {
211
228
  private sendAgent;
212
229
  }
213
230
  export declare function lastAssistantText(events: readonly StreamEvent[]): string | undefined;
231
+ export {};