niceeval 0.17.1 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (692) hide show
  1. package/INDEX.md +5 -2
  2. package/dist/adapter-usage.cjs.map +1 -1
  3. package/dist/adapter-usage.d.cts +1 -1
  4. package/dist/adapter-usage.d.mts +1 -1
  5. package/dist/adapter-usage.d.ts +1 -1
  6. package/dist/adapter.cjs +8 -3
  7. package/dist/adapter.cjs.map +1 -1
  8. package/dist/adapter.d.cts +26 -15
  9. package/dist/adapter.d.mts +26 -15
  10. package/dist/adapter.d.ts +26 -15
  11. package/dist/agents/{effect-runtime.cjs → agent-effects.cjs} +12 -18
  12. package/dist/agents/agent-effects.cjs.map +1 -0
  13. package/dist/agents/agent-effects.d.cts +23 -0
  14. package/dist/agents/agent-effects.d.mts +23 -0
  15. package/dist/agents/agent-effects.d.ts +23 -0
  16. package/dist/agents/agent-effects.js +16 -0
  17. package/dist/agents/agent-effects.js.map +1 -0
  18. package/dist/agents/ai-sdk.cjs +1 -1
  19. package/dist/agents/ai-sdk.cjs.map +1 -1
  20. package/dist/agents/bub.cjs +31 -18
  21. package/dist/agents/bub.cjs.map +1 -1
  22. package/dist/agents/bub.d.cts +9 -12
  23. package/dist/agents/bub.d.mts +9 -12
  24. package/dist/agents/bub.d.ts +9 -12
  25. package/dist/agents/claude-code-native.cjs +2 -2
  26. package/dist/agents/claude-code-native.cjs.map +1 -1
  27. package/dist/agents/claude-code.cjs +17 -11
  28. package/dist/agents/claude-code.cjs.map +1 -1
  29. package/dist/agents/claude-code.d.cts +11 -11
  30. package/dist/agents/claude-code.d.mts +11 -11
  31. package/dist/agents/claude-code.d.ts +11 -11
  32. package/dist/agents/codex-app-server.cjs +2 -2
  33. package/dist/agents/codex-app-server.cjs.map +1 -1
  34. package/dist/agents/codex.cjs +18 -12
  35. package/dist/agents/codex.cjs.map +1 -1
  36. package/dist/agents/codex.d.cts +12 -12
  37. package/dist/agents/codex.d.mts +12 -12
  38. package/dist/agents/codex.d.ts +12 -12
  39. package/dist/agents/deepseek-harness.cjs +2 -2
  40. package/dist/agents/deepseek-harness.cjs.map +1 -1
  41. package/dist/agents/hermes.cjs +3 -3
  42. package/dist/agents/hermes.cjs.map +1 -1
  43. package/dist/agents/index.cjs +3 -3
  44. package/dist/agents/index.cjs.map +1 -1
  45. package/dist/agents/index.d.cts +3 -3
  46. package/dist/agents/index.d.mts +3 -3
  47. package/dist/agents/index.d.ts +3 -3
  48. package/dist/agents/index.js +2 -2
  49. package/dist/agents/index.mjs +2 -2
  50. package/dist/agents/mcp.cjs.map +1 -1
  51. package/dist/agents/mcp.d.cts +2 -2
  52. package/dist/agents/mcp.d.mts +2 -2
  53. package/dist/agents/mcp.d.ts +2 -2
  54. package/dist/agents/omp.cjs +2 -2
  55. package/dist/agents/omp.cjs.map +1 -1
  56. package/dist/agents/openai-compat.cjs +2 -2
  57. package/dist/agents/openai-compat.cjs.map +1 -1
  58. package/dist/agents/openclaw.cjs +3 -3
  59. package/dist/agents/openclaw.cjs.map +1 -1
  60. package/dist/agents/opencode.cjs +16 -4
  61. package/dist/agents/opencode.cjs.map +1 -1
  62. package/dist/agents/plugin-extensions.cjs +71 -0
  63. package/dist/agents/plugin-extensions.cjs.map +1 -0
  64. package/dist/agents/plugin-extensions.d.cts +26 -0
  65. package/dist/agents/plugin-extensions.d.mts +26 -0
  66. package/dist/agents/plugin-extensions.d.ts +26 -0
  67. package/dist/agents/plugin-extensions.js +8 -0
  68. package/dist/agents/plugin-extensions.js.map +1 -0
  69. package/dist/agents/post-setup.cjs +14 -3
  70. package/dist/agents/post-setup.cjs.map +1 -1
  71. package/dist/agents/post-setup.d.cts +4 -2
  72. package/dist/agents/post-setup.d.mts +4 -2
  73. package/dist/agents/post-setup.d.ts +4 -2
  74. package/dist/agents/post-setup.js +8 -6
  75. package/dist/agents/sdk-streams.cjs +3 -3
  76. package/dist/agents/sdk-streams.cjs.map +1 -1
  77. package/dist/agents/{session-slot.cjs → session-key.cjs} +4 -4
  78. package/dist/agents/session-key.cjs.map +1 -0
  79. package/dist/agents/session-key.d.cts +12 -0
  80. package/dist/agents/session-key.d.mts +12 -0
  81. package/dist/agents/session-key.d.ts +12 -0
  82. package/dist/agents/session-key.js +6 -0
  83. package/dist/agents/session-key.js.map +1 -0
  84. package/dist/agents/shared.cjs +2 -2
  85. package/dist/agents/shared.cjs.map +1 -1
  86. package/dist/agents/shared.d.cts +4 -4
  87. package/dist/agents/shared.d.mts +4 -4
  88. package/dist/agents/shared.d.ts +4 -4
  89. package/dist/agents/skills.cjs.map +1 -1
  90. package/dist/agents/skills.d.cts +3 -3
  91. package/dist/agents/skills.d.mts +3 -3
  92. package/dist/agents/skills.d.ts +3 -3
  93. package/dist/agents/types.cjs.map +1 -1
  94. package/dist/agents/types.d.cts +55 -54
  95. package/dist/agents/types.d.mts +55 -54
  96. package/dist/agents/types.d.ts +55 -54
  97. package/dist/agents/ui-message-stream.cjs +4 -4
  98. package/dist/agents/ui-message-stream.cjs.map +1 -1
  99. package/dist/agents/unrecognized-events.cjs +32 -0
  100. package/dist/agents/unrecognized-events.cjs.map +1 -0
  101. package/dist/agents/unrecognized-events.d.cts +8 -0
  102. package/dist/agents/unrecognized-events.d.mts +8 -0
  103. package/dist/agents/unrecognized-events.d.ts +8 -0
  104. package/dist/agents/unrecognized-events.js +6 -0
  105. package/dist/agents/unrecognized-events.js.map +1 -0
  106. package/dist/assertions/api.cjs.map +1 -1
  107. package/dist/assertions/api.d.cts +3 -0
  108. package/dist/assertions/api.d.mts +3 -0
  109. package/dist/assertions/api.d.ts +3 -0
  110. package/dist/assertions/collection.cjs +1 -1
  111. package/dist/assertions/collection.cjs.map +1 -1
  112. package/dist/assertions/judge.cjs +1 -1
  113. package/dist/assertions/judge.cjs.map +1 -1
  114. package/dist/assertions/match.cjs +52 -21
  115. package/dist/assertions/match.cjs.map +1 -1
  116. package/dist/assertions/match.d.cts +16 -5
  117. package/dist/assertions/match.d.mts +16 -5
  118. package/dist/assertions/match.d.ts +16 -5
  119. package/dist/assertions/match.js +96 -94
  120. package/dist/assertions/measurements.cjs +61 -0
  121. package/dist/assertions/measurements.cjs.map +1 -0
  122. package/dist/assertions/measurements.d.cts +24 -0
  123. package/dist/assertions/measurements.d.mts +24 -0
  124. package/dist/assertions/measurements.d.ts +24 -0
  125. package/dist/assertions/measurements.js +8 -0
  126. package/dist/assertions/measurements.js.map +1 -0
  127. package/dist/assertions/numeric.cjs +2 -0
  128. package/dist/assertions/numeric.cjs.map +1 -1
  129. package/dist/assertions/numeric.d.cts +1 -1
  130. package/dist/assertions/numeric.d.mts +1 -1
  131. package/dist/assertions/numeric.d.ts +1 -1
  132. package/dist/assertions/quantity.cjs +42 -0
  133. package/dist/assertions/quantity.cjs.map +1 -0
  134. package/dist/assertions/quantity.d.cts +18 -0
  135. package/dist/assertions/quantity.d.mts +18 -0
  136. package/dist/assertions/quantity.d.ts +18 -0
  137. package/dist/assertions/quantity.js +22 -0
  138. package/dist/assertions/quantity.js.map +1 -0
  139. package/dist/assertions/record/attachment.cjs +2 -0
  140. package/dist/assertions/record/attachment.cjs.map +1 -1
  141. package/dist/assertions/record/codec.cjs +5 -1
  142. package/dist/assertions/record/codec.cjs.map +1 -1
  143. package/dist/assertions/record/model.cjs.map +1 -1
  144. package/dist/assertions/record/model.d.cts +3 -1
  145. package/dist/assertions/record/model.d.mts +3 -1
  146. package/dist/assertions/record/model.d.ts +3 -1
  147. package/dist/assertions/runtime.cjs +11 -6
  148. package/dist/assertions/runtime.cjs.map +1 -1
  149. package/dist/cli/program.cjs +3 -0
  150. package/dist/cli/program.cjs.map +1 -1
  151. package/dist/context/assert-first.cjs +6 -4
  152. package/dist/context/assert-first.cjs.map +1 -1
  153. package/dist/context/assert-first.d.cts +9 -3
  154. package/dist/context/assert-first.d.mts +9 -3
  155. package/dist/context/assert-first.d.ts +9 -3
  156. package/dist/context/notes.cjs +47 -0
  157. package/dist/context/notes.cjs.map +1 -0
  158. package/dist/context/notes.d.cts +10 -0
  159. package/dist/context/notes.d.mts +10 -0
  160. package/dist/context/notes.d.ts +10 -0
  161. package/dist/context/notes.js +6 -0
  162. package/dist/context/notes.js.map +1 -0
  163. package/dist/context/send-failures.cjs +1 -7
  164. package/dist/context/send-failures.cjs.map +1 -1
  165. package/dist/context/send-failures.d.cts +2 -3
  166. package/dist/context/send-failures.d.mts +2 -3
  167. package/dist/context/send-failures.d.ts +2 -3
  168. package/dist/context/send-retry.cjs +0 -1
  169. package/dist/context/send-retry.cjs.map +1 -1
  170. package/dist/context/send-retry.d.cts +1 -2
  171. package/dist/context/send-retry.d.mts +1 -2
  172. package/dist/context/send-retry.d.ts +1 -2
  173. package/dist/context/session.cjs +10 -17
  174. package/dist/context/session.cjs.map +1 -1
  175. package/dist/context/session.d.cts +4 -10
  176. package/dist/context/session.d.mts +4 -10
  177. package/dist/context/session.d.ts +4 -10
  178. package/dist/define.cjs +89 -64
  179. package/dist/define.cjs.map +1 -1
  180. package/dist/define.d.cts +3 -3
  181. package/dist/define.d.mts +3 -3
  182. package/dist/define.d.ts +3 -3
  183. package/dist/eval/cli/contribution.cjs +1 -1
  184. package/dist/eval/cli/contribution.cjs.map +1 -1
  185. package/dist/eval/host/index.cjs +1 -1
  186. package/dist/eval/host/index.cjs.map +1 -1
  187. package/dist/eval/record/evaluation.cjs +1 -1
  188. package/dist/eval/record/evaluation.cjs.map +1 -1
  189. package/dist/eval/record/membership-provenance.d.cts +3 -3
  190. package/dist/eval/record/membership-provenance.d.mts +3 -3
  191. package/dist/eval/record/membership-provenance.d.ts +3 -3
  192. package/dist/eval/record/score.cjs +2 -2
  193. package/dist/eval/record/score.cjs.map +1 -1
  194. package/dist/eval/record/sealed-assertion.cjs +1 -1
  195. package/dist/eval/record/sealed-assertion.cjs.map +1 -1
  196. package/dist/eval/record/verdict.cjs +2 -2
  197. package/dist/eval/record/verdict.cjs.map +1 -1
  198. package/dist/expect/index.cjs +13 -1
  199. package/dist/expect/index.cjs.map +1 -1
  200. package/dist/expect/index.d.cts +5 -1
  201. package/dist/expect/index.d.mts +5 -1
  202. package/dist/expect/index.d.ts +5 -1
  203. package/dist/expect/index.js +92 -72
  204. package/dist/expect/index.mjs +92 -72
  205. package/dist/experiment/host/cli/contribution.cjs +52 -39
  206. package/dist/experiment/host/cli/contribution.cjs.map +1 -1
  207. package/dist/experiment/host/cli/contribution.d.cts +18 -4
  208. package/dist/experiment/host/cli/contribution.d.mts +18 -4
  209. package/dist/experiment/host/cli/contribution.d.ts +18 -4
  210. package/dist/experiment/host/cli/contribution.js +2 -2
  211. package/dist/experiment/host/cli/debug-protocol.cjs +2 -2
  212. package/dist/experiment/host/cli/debug-protocol.cjs.map +1 -1
  213. package/dist/experiment/host/cli/debug-protocol.d.cts +2 -2
  214. package/dist/experiment/host/cli/debug-protocol.d.mts +2 -2
  215. package/dist/experiment/host/cli/debug-protocol.d.ts +2 -2
  216. package/dist/experiment/host/cli/output-protocol.cjs +1 -1
  217. package/dist/experiment/host/cli/output-protocol.cjs.map +1 -1
  218. package/dist/experiment/host/cli/output-protocol.d.cts +2 -2
  219. package/dist/experiment/host/cli/output-protocol.d.mts +2 -2
  220. package/dist/experiment/host/cli/output-protocol.d.ts +2 -2
  221. package/dist/experiment/host/current.cjs +2 -2
  222. package/dist/experiment/host/current.cjs.map +1 -1
  223. package/dist/experiment/host/index.cjs +1 -1
  224. package/dist/experiment/host/index.cjs.map +1 -1
  225. package/dist/experiment/host/operations.cjs +24 -23
  226. package/dist/experiment/host/operations.cjs.map +1 -1
  227. package/dist/experiment/host/runtime.cjs +11 -10
  228. package/dist/experiment/host/runtime.cjs.map +1 -1
  229. package/dist/experiment/host/runtime.d.cts +3 -3
  230. package/dist/experiment/host/runtime.d.mts +3 -3
  231. package/dist/experiment/host/runtime.d.ts +3 -3
  232. package/dist/experiment/host/teardown.cjs +4 -3
  233. package/dist/experiment/host/teardown.cjs.map +1 -1
  234. package/dist/experiment/host/teardown.d.cts +3 -3
  235. package/dist/experiment/host/teardown.d.mts +3 -3
  236. package/dist/experiment/host/teardown.d.ts +3 -3
  237. package/dist/experiment/host/types.cjs.map +1 -1
  238. package/dist/experiment/host/types.d.cts +19 -19
  239. package/dist/experiment/host/types.d.mts +19 -19
  240. package/dist/experiment/host/types.d.ts +19 -19
  241. package/dist/index.cjs +3 -19
  242. package/dist/index.cjs.map +1 -1
  243. package/dist/index.d.cts +4 -8
  244. package/dist/index.d.mts +4 -8
  245. package/dist/index.d.ts +4 -8
  246. package/dist/index.js +12 -34
  247. package/dist/index.mjs +12 -34
  248. package/dist/inspection/assertions.cjs +1 -1
  249. package/dist/inspection/assertions.cjs.map +1 -1
  250. package/dist/inspection/cli/contribution.cjs +8 -7
  251. package/dist/inspection/cli/contribution.cjs.map +1 -1
  252. package/dist/inspection/facts.cjs +4 -4
  253. package/dist/inspection/facts.cjs.map +1 -1
  254. package/dist/inspection/index.cjs +1 -5
  255. package/dist/inspection/index.cjs.map +1 -1
  256. package/dist/inspection/index.d.cts +1 -2
  257. package/dist/inspection/index.d.mts +1 -2
  258. package/dist/inspection/index.d.ts +1 -2
  259. package/dist/inspection/index.js +20 -26
  260. package/dist/inspection/lifecycle.cjs +7 -0
  261. package/dist/inspection/lifecycle.cjs.map +1 -0
  262. package/dist/inspection/lifecycle.d.cts +4 -0
  263. package/dist/inspection/lifecycle.d.mts +4 -0
  264. package/dist/inspection/lifecycle.d.ts +4 -0
  265. package/dist/inspection/lifecycle.js +6 -0
  266. package/dist/inspection/lifecycle.js.map +1 -0
  267. package/dist/inspection/notes.cjs +40 -0
  268. package/dist/inspection/notes.cjs.map +1 -0
  269. package/dist/inspection/notes.d.cts +12 -0
  270. package/dist/inspection/notes.d.mts +12 -0
  271. package/dist/inspection/notes.d.ts +12 -0
  272. package/dist/inspection/notes.js +8 -0
  273. package/dist/inspection/notes.js.map +1 -0
  274. package/dist/inspection/overview.cjs +12 -15
  275. package/dist/inspection/overview.cjs.map +1 -1
  276. package/dist/inspection/overview.d.cts +8 -6
  277. package/dist/inspection/overview.d.mts +8 -6
  278. package/dist/inspection/overview.d.ts +8 -6
  279. package/dist/inspection/planned-attempt.cjs +45 -0
  280. package/dist/inspection/planned-attempt.cjs.map +1 -0
  281. package/dist/inspection/planned-attempt.d.cts +109 -0
  282. package/dist/inspection/planned-attempt.d.mts +109 -0
  283. package/dist/inspection/planned-attempt.d.ts +109 -0
  284. package/dist/inspection/planned-attempt.js +24 -0
  285. package/dist/inspection/planned-attempt.js.map +1 -0
  286. package/dist/inspection/project-result.cjs +5 -5
  287. package/dist/inspection/project-result.cjs.map +1 -1
  288. package/dist/inspection/project-result.d.cts +58 -57
  289. package/dist/inspection/project-result.d.mts +58 -57
  290. package/dist/inspection/project-result.d.ts +58 -57
  291. package/dist/inspection/project-result.js +4 -4
  292. package/dist/inspection/project.cjs +3 -3
  293. package/dist/inspection/project.cjs.map +1 -1
  294. package/dist/inspection/protocol-values.cjs +1 -1
  295. package/dist/inspection/protocol-values.cjs.map +1 -1
  296. package/dist/inspection/protocol-values.d.cts +1 -1
  297. package/dist/inspection/protocol-values.d.mts +1 -1
  298. package/dist/inspection/protocol-values.d.ts +1 -1
  299. package/dist/inspection/protocol.cjs +8 -8
  300. package/dist/inspection/protocol.cjs.map +1 -1
  301. package/dist/inspection/protocol.d.cts +237 -219
  302. package/dist/inspection/protocol.d.mts +237 -219
  303. package/dist/inspection/protocol.d.ts +237 -219
  304. package/dist/inspection/public.cjs +1 -5
  305. package/dist/inspection/public.cjs.map +1 -1
  306. package/dist/inspection/public.d.cts +1 -2
  307. package/dist/inspection/public.d.mts +1 -2
  308. package/dist/inspection/public.d.ts +1 -2
  309. package/dist/inspection/public.js +14 -20
  310. package/dist/inspection/public.mjs +166 -129
  311. package/dist/inspection/query.cjs +1 -1
  312. package/dist/inspection/query.cjs.map +1 -1
  313. package/dist/inspection/results.cjs +61 -52
  314. package/dist/inspection/results.cjs.map +1 -1
  315. package/dist/inspection/results.d.cts +157 -140
  316. package/dist/inspection/results.d.mts +157 -140
  317. package/dist/inspection/results.d.ts +157 -140
  318. package/dist/inspection/select.cjs +33 -28
  319. package/dist/inspection/select.cjs.map +1 -1
  320. package/dist/inspection/source.cjs +1 -1
  321. package/dist/inspection/source.cjs.map +1 -1
  322. package/dist/inspection/sources.cjs +2 -2
  323. package/dist/inspection/sources.cjs.map +1 -1
  324. package/dist/inspection/trace.cjs +9 -8
  325. package/dist/inspection/trace.cjs.map +1 -1
  326. package/dist/inspection/trace.d.cts +4 -4
  327. package/dist/inspection/trace.d.mts +4 -4
  328. package/dist/inspection/trace.d.ts +4 -4
  329. package/dist/loaders/index.cjs +7 -279
  330. package/dist/loaders/index.cjs.map +1 -1
  331. package/dist/loaders/index.d.cts +2 -95
  332. package/dist/loaders/index.d.mts +2 -95
  333. package/dist/loaders/index.d.ts +2 -95
  334. package/dist/loaders/index.js +10 -12
  335. package/dist/loaders/index.mjs +10 -12
  336. package/dist/loaders/runtime.cjs +283 -0
  337. package/dist/loaders/runtime.cjs.map +1 -0
  338. package/dist/loaders/runtime.d.cts +95 -0
  339. package/dist/loaders/runtime.d.mts +95 -0
  340. package/dist/loaders/runtime.d.ts +95 -0
  341. package/dist/loaders/runtime.js +16 -0
  342. package/dist/loaders/runtime.js.map +1 -0
  343. package/dist/migrations/judge-provider.md +6 -6
  344. package/dist/{model-slots.cjs → model-roles.cjs} +26 -7
  345. package/dist/model-roles.cjs.map +1 -0
  346. package/dist/model-roles.d.cts +26 -0
  347. package/dist/model-roles.d.mts +26 -0
  348. package/dist/model-roles.d.ts +26 -0
  349. package/dist/model-roles.js +14 -0
  350. package/dist/model-roles.js.map +1 -0
  351. package/dist/o11y/adapter-usage-projection.cjs +9 -8
  352. package/dist/o11y/adapter-usage-projection.cjs.map +1 -1
  353. package/dist/o11y/adapter-usage-projection.d.cts +23 -15
  354. package/dist/o11y/adapter-usage-projection.d.mts +23 -15
  355. package/dist/o11y/adapter-usage-projection.d.ts +23 -15
  356. package/dist/o11y/cache-read.cjs +14 -14
  357. package/dist/o11y/cache-read.cjs.map +1 -1
  358. package/dist/o11y/cache-read.d.cts +5 -5
  359. package/dist/o11y/cache-read.d.mts +5 -5
  360. package/dist/o11y/cache-read.d.ts +5 -5
  361. package/dist/o11y/derive.cjs.map +1 -1
  362. package/dist/o11y/derive.d.cts +2 -2
  363. package/dist/o11y/derive.d.mts +2 -2
  364. package/dist/o11y/derive.d.ts +2 -2
  365. package/dist/o11y/eval-usage.cjs +9 -9
  366. package/dist/o11y/eval-usage.cjs.map +1 -1
  367. package/dist/o11y/eval-usage.d.cts +7 -7
  368. package/dist/o11y/eval-usage.d.mts +7 -7
  369. package/dist/o11y/eval-usage.d.ts +7 -7
  370. package/dist/o11y/parsers/bub.cjs +57 -81
  371. package/dist/o11y/parsers/bub.cjs.map +1 -1
  372. package/dist/o11y/parsers/index.cjs.map +1 -1
  373. package/dist/o11y/parsers/index.d.cts +2 -0
  374. package/dist/o11y/parsers/index.d.mts +2 -0
  375. package/dist/o11y/parsers/index.d.ts +2 -0
  376. package/dist/o11y/parsers/opencode.cjs +129 -217
  377. package/dist/o11y/parsers/opencode.cjs.map +1 -1
  378. package/dist/o11y/parsers/opencode.d.cts +2 -5
  379. package/dist/o11y/parsers/opencode.d.mts +2 -5
  380. package/dist/o11y/parsers/opencode.d.ts +2 -5
  381. package/dist/o11y/types.cjs.map +1 -1
  382. package/dist/o11y/types.d.cts +1 -1
  383. package/dist/o11y/types.d.mts +1 -1
  384. package/dist/o11y/types.d.ts +1 -1
  385. package/dist/plugin/contracts.cjs +170 -120
  386. package/dist/plugin/contracts.cjs.map +1 -1
  387. package/dist/plugin/contracts.d.cts +102 -90
  388. package/dist/plugin/contracts.d.mts +102 -90
  389. package/dist/plugin/contracts.d.ts +102 -90
  390. package/dist/plugin/contracts.js +16 -12
  391. package/dist/plugin/index.cjs.map +1 -1
  392. package/dist/plugin/index.d.cts +1 -1
  393. package/dist/plugin/index.d.mts +1 -1
  394. package/dist/plugin/index.d.ts +1 -1
  395. package/dist/plugin/link.cjs +69 -64
  396. package/dist/plugin/link.cjs.map +1 -1
  397. package/dist/plugin/link.d.cts +5 -3
  398. package/dist/plugin/link.d.mts +5 -3
  399. package/dist/plugin/link.d.ts +5 -3
  400. package/dist/plugin/link.js +12 -8
  401. package/dist/record/codec/seal-manifest.d.cts +3 -3
  402. package/dist/record/codec/seal-manifest.d.mts +3 -3
  403. package/dist/record/codec/seal-manifest.d.ts +3 -3
  404. package/dist/record/family/attempt-note/definition.cjs +12 -0
  405. package/dist/record/family/attempt-note/definition.cjs.map +1 -0
  406. package/dist/record/family/attempt-note/definition.d.cts +6 -0
  407. package/dist/record/family/attempt-note/definition.d.mts +6 -0
  408. package/dist/record/family/attempt-note/definition.d.ts +6 -0
  409. package/dist/record/family/attempt-note/definition.js +6 -0
  410. package/dist/record/family/attempt-note/definition.js.map +1 -0
  411. package/dist/record/family/attempt-note/persistence.cjs +10 -0
  412. package/dist/record/family/attempt-note/persistence.cjs.map +1 -0
  413. package/dist/record/family/attempt-note/persistence.d.cts +6 -0
  414. package/dist/record/family/attempt-note/persistence.d.mts +6 -0
  415. package/dist/record/family/attempt-note/persistence.d.ts +6 -0
  416. package/dist/record/family/attempt-note/persistence.js +6 -0
  417. package/dist/record/family/attempt-note/persistence.js.map +1 -0
  418. package/dist/record/family/attempt-note/schema.cjs +20 -0
  419. package/dist/record/family/attempt-note/schema.cjs.map +1 -0
  420. package/dist/record/family/attempt-note/schema.d.cts +21 -0
  421. package/dist/record/family/attempt-note/schema.d.mts +21 -0
  422. package/dist/record/family/attempt-note/schema.d.ts +21 -0
  423. package/dist/record/family/attempt-note/schema.js +10 -0
  424. package/dist/record/family/attempt-note/schema.js.map +1 -0
  425. package/dist/record/family/catalog.cjs +32 -29
  426. package/dist/record/family/catalog.cjs.map +1 -1
  427. package/dist/record/family/catalog.d.cts +7 -2
  428. package/dist/record/family/catalog.d.mts +7 -2
  429. package/dist/record/family/catalog.d.ts +7 -2
  430. package/dist/record/family/current.cjs +48 -45
  431. package/dist/record/family/current.cjs.map +1 -1
  432. package/dist/record/family/current.d.cts +15 -0
  433. package/dist/record/family/current.d.mts +15 -0
  434. package/dist/record/family/current.d.ts +15 -0
  435. package/dist/record/model/index.js +66 -64
  436. package/dist/record/model/run-context.cjs +9 -3
  437. package/dist/record/model/run-context.cjs.map +1 -1
  438. package/dist/record/model/run-context.d.cts +9 -2
  439. package/dist/record/model/run-context.d.mts +9 -2
  440. package/dist/record/model/run-context.d.ts +9 -2
  441. package/dist/record/model/run-context.js +8 -6
  442. package/dist/record/model/seal-manifest.d.cts +1 -1
  443. package/dist/record/model/seal-manifest.d.mts +1 -1
  444. package/dist/record/model/seal-manifest.d.ts +1 -1
  445. package/dist/run/cli/contribution.cjs +6 -32
  446. package/dist/run/cli/contribution.cjs.map +1 -1
  447. package/dist/run/host/runtime.cjs +1 -1
  448. package/dist/run/host/runtime.cjs.map +1 -1
  449. package/dist/run/storage/sqlite.cjs +7 -7
  450. package/dist/run/storage/sqlite.cjs.map +1 -1
  451. package/dist/runner/adapter-usage.cjs +5 -3
  452. package/dist/runner/adapter-usage.cjs.map +1 -1
  453. package/dist/runner/adapter-usage.d.cts +2 -2
  454. package/dist/runner/adapter-usage.d.mts +2 -2
  455. package/dist/runner/adapter-usage.d.ts +2 -2
  456. package/dist/runner/adoption.cjs +10 -12
  457. package/dist/runner/adoption.cjs.map +1 -1
  458. package/dist/runner/attempt-notes.cjs +8 -0
  459. package/dist/runner/attempt-notes.cjs.map +1 -0
  460. package/dist/runner/attempt-notes.d.cts +4 -0
  461. package/dist/runner/attempt-notes.d.mts +4 -0
  462. package/dist/runner/attempt-notes.d.ts +4 -0
  463. package/dist/runner/attempt-notes.js +8 -0
  464. package/dist/runner/attempt-notes.js.map +1 -0
  465. package/dist/runner/attempt.cjs +61 -73
  466. package/dist/runner/attempt.cjs.map +1 -1
  467. package/dist/runner/attempt.d.cts +3 -3
  468. package/dist/runner/attempt.d.mts +3 -3
  469. package/dist/runner/attempt.d.ts +3 -3
  470. package/dist/runner/command-plan.cjs +21 -26
  471. package/dist/runner/command-plan.cjs.map +1 -1
  472. package/dist/runner/command-plan.d.cts +4 -4
  473. package/dist/runner/command-plan.d.mts +4 -4
  474. package/dist/runner/command-plan.d.ts +4 -4
  475. package/dist/runner/command-plan.js +4 -4
  476. package/dist/runner/config-identity.cjs.map +1 -1
  477. package/dist/runner/config-identity.d.cts +2 -2
  478. package/dist/runner/config-identity.d.mts +2 -2
  479. package/dist/runner/config-identity.d.ts +2 -2
  480. package/dist/runner/discover.cjs +6 -6
  481. package/dist/runner/discover.cjs.map +1 -1
  482. package/dist/runner/eval-selection.cjs +15 -1
  483. package/dist/runner/eval-selection.cjs.map +1 -1
  484. package/dist/runner/eval-selection.d.cts +4 -0
  485. package/dist/runner/eval-selection.d.mts +4 -0
  486. package/dist/runner/eval-selection.d.ts +4 -0
  487. package/dist/runner/feedback/human.cjs +1 -1
  488. package/dist/runner/feedback/human.cjs.map +1 -1
  489. package/dist/runner/feedback/json.cjs +4 -2
  490. package/dist/runner/feedback/json.cjs.map +1 -1
  491. package/dist/runner/feedback/json.d.cts +1 -1
  492. package/dist/runner/feedback/json.d.mts +1 -1
  493. package/dist/runner/feedback/json.d.ts +1 -1
  494. package/dist/runner/feedback/sink.cjs +1 -1
  495. package/dist/runner/feedback/sink.cjs.map +1 -1
  496. package/dist/runner/feedback/sink.d.cts +1 -1
  497. package/dist/runner/feedback/sink.d.mts +1 -1
  498. package/dist/runner/feedback/sink.d.ts +1 -1
  499. package/dist/runner/fingerprint.cjs +1 -1
  500. package/dist/runner/fingerprint.cjs.map +1 -1
  501. package/dist/runner/lock.cjs +1 -3
  502. package/dist/runner/lock.cjs.map +1 -1
  503. package/dist/runner/lock.d.cts +0 -2
  504. package/dist/runner/lock.d.mts +0 -2
  505. package/dist/runner/lock.d.ts +0 -2
  506. package/dist/runner/lock.js +14 -16
  507. package/dist/runner/project-target.cjs.map +1 -1
  508. package/dist/runner/project-target.d.cts +2 -2
  509. package/dist/runner/project-target.d.mts +2 -2
  510. package/dist/runner/project-target.d.ts +2 -2
  511. package/dist/runner/record/attachments.cjs +2 -2
  512. package/dist/runner/record/attachments.cjs.map +1 -1
  513. package/dist/runner/record/planning.cjs +8 -2
  514. package/dist/runner/record/planning.cjs.map +1 -1
  515. package/dist/runner/record.cjs +2 -0
  516. package/dist/runner/record.cjs.map +1 -1
  517. package/dist/runner/report.cjs +3 -3
  518. package/dist/runner/report.cjs.map +1 -1
  519. package/dist/runner/report.d.cts +1 -1
  520. package/dist/runner/report.d.mts +1 -1
  521. package/dist/runner/report.d.ts +1 -1
  522. package/dist/runner/reuse-plan.cjs +2 -2
  523. package/dist/runner/reuse-plan.cjs.map +1 -1
  524. package/dist/runner/run.cjs +10 -45
  525. package/dist/runner/run.cjs.map +1 -1
  526. package/dist/runner/sandbox-pool.cjs +1 -2
  527. package/dist/runner/sandbox-pool.cjs.map +1 -1
  528. package/dist/runner/setup-prefix-preparation.cjs +1 -1
  529. package/dist/runner/setup-prefix-preparation.cjs.map +1 -1
  530. package/dist/runner/teardown-registry.cjs +2 -2
  531. package/dist/runner/teardown-registry.cjs.map +1 -1
  532. package/dist/runner/teardown-registry.d.cts +1 -1
  533. package/dist/runner/teardown-registry.d.mts +1 -1
  534. package/dist/runner/teardown-registry.d.ts +1 -1
  535. package/dist/runner/types.cjs +4 -4
  536. package/dist/runner/types.cjs.map +1 -1
  537. package/dist/runner/types.d.cts +64 -92
  538. package/dist/runner/types.d.mts +64 -92
  539. package/dist/runner/types.d.ts +64 -92
  540. package/dist/runner/types.js +2 -2
  541. package/dist/sandbox/action.cjs +1 -1
  542. package/dist/sandbox/action.cjs.map +1 -1
  543. package/dist/sandbox/cli/contribution.cjs +17 -14
  544. package/dist/sandbox/cli/contribution.cjs.map +1 -1
  545. package/dist/sandbox/cli/contribution.d.cts +1 -1
  546. package/dist/sandbox/cli/contribution.d.mts +1 -1
  547. package/dist/sandbox/cli/contribution.d.ts +1 -1
  548. package/dist/sandbox/commands.cjs +1 -1
  549. package/dist/sandbox/commands.cjs.map +1 -1
  550. package/dist/sandbox/commands.d.cts +1 -1
  551. package/dist/sandbox/commands.d.mts +1 -1
  552. package/dist/sandbox/commands.d.ts +1 -1
  553. package/dist/sandbox/compose.cjs +2 -2
  554. package/dist/sandbox/compose.cjs.map +1 -1
  555. package/dist/sandbox/docker-profile/registry.cjs +5 -10
  556. package/dist/sandbox/docker-profile/registry.cjs.map +1 -1
  557. package/dist/sandbox/docker-profile/registry.d.cts +0 -4
  558. package/dist/sandbox/docker-profile/registry.d.mts +0 -4
  559. package/dist/sandbox/docker-profile/registry.d.ts +0 -4
  560. package/dist/sandbox/docker-profile/registry.js +6 -14
  561. package/dist/sandbox/docker-profile/runtime.cjs +1 -1
  562. package/dist/sandbox/docker-profile/runtime.cjs.map +1 -1
  563. package/dist/sandbox/docker-profile/schema.cjs +12 -16
  564. package/dist/sandbox/docker-profile/schema.cjs.map +1 -1
  565. package/dist/sandbox/docker-profile/schema.d.cts +2 -6
  566. package/dist/sandbox/docker-profile/schema.d.mts +2 -6
  567. package/dist/sandbox/docker-profile/schema.d.ts +2 -6
  568. package/dist/sandbox/docker-profile/schema.js +24 -32
  569. package/dist/sandbox/incus.cjs +2 -2
  570. package/dist/sandbox/incus.cjs.map +1 -1
  571. package/dist/sandbox/index.cjs +4 -36
  572. package/dist/sandbox/index.cjs.map +1 -1
  573. package/dist/sandbox/index.d.cts +4 -8
  574. package/dist/sandbox/index.d.mts +4 -8
  575. package/dist/sandbox/index.d.ts +4 -8
  576. package/dist/sandbox/index.js +116 -174
  577. package/dist/sandbox/index.mjs +116 -174
  578. package/dist/sandbox/layer.cjs +3 -3
  579. package/dist/sandbox/layer.cjs.map +1 -1
  580. package/dist/sandbox/link.cjs +5 -0
  581. package/dist/sandbox/link.cjs.map +1 -1
  582. package/dist/sandbox/link.d.cts +3 -0
  583. package/dist/sandbox/link.d.mts +3 -0
  584. package/dist/sandbox/link.d.ts +3 -0
  585. package/dist/sandbox/runtime.cjs +9 -4
  586. package/dist/sandbox/runtime.cjs.map +1 -1
  587. package/dist/shared/failure-class.cjs +5 -5
  588. package/dist/shared/failure-class.cjs.map +1 -1
  589. package/dist/shared/failure-class.d.cts +4 -10
  590. package/dist/shared/failure-class.d.mts +4 -10
  591. package/dist/shared/failure-class.d.ts +4 -10
  592. package/dist/shared/types.cjs.map +1 -1
  593. package/dist/shared/types.d.cts +1 -1
  594. package/dist/shared/types.d.mts +1 -1
  595. package/dist/shared/types.d.ts +1 -1
  596. package/dist/show/contribution.cjs +17 -2
  597. package/dist/show/contribution.cjs.map +1 -1
  598. package/dist/show/contribution.d.cts +14 -0
  599. package/dist/show/contribution.d.mts +14 -0
  600. package/dist/show/contribution.d.ts +14 -0
  601. package/dist/show/model.cjs +8 -5
  602. package/dist/show/model.cjs.map +1 -1
  603. package/dist/show/model.d.cts +11 -8
  604. package/dist/show/model.d.mts +11 -8
  605. package/dist/show/model.d.ts +11 -8
  606. package/dist/show/render.cjs +34 -22
  607. package/dist/show/render.cjs.map +1 -1
  608. package/dist/sources/projector.cjs +1 -1
  609. package/dist/sources/projector.cjs.map +1 -1
  610. package/dist/types.cjs +1 -1
  611. package/dist/types.cjs.map +1 -1
  612. package/dist/types.d.cts +1 -1
  613. package/dist/types.d.mts +1 -1
  614. package/dist/types.d.ts +1 -1
  615. package/dist/types.js +2 -2
  616. package/dist/view/app-dist/.vite/manifest.json +2 -2
  617. package/dist/view/app-dist/assets/{index-B3ijZRph.js → index-CxrOUvHC.js} +17 -17
  618. package/dist/view/app-dist/assets/{quality-cost-scatter-B--DfJ9s.js → quality-cost-scatter-B6Aiss7x.js} +1 -1
  619. package/dist/view/app-dist/index.html +1 -1
  620. package/dist/view/cli/contribution.cjs +1 -1
  621. package/dist/view/cli/contribution.cjs.map +1 -1
  622. package/dist/view/function-runtime.mjs +318 -121
  623. package/dist/view/http-protocol.d.cts +1 -1
  624. package/dist/view/http-protocol.d.mts +1 -1
  625. package/dist/view/http-protocol.d.ts +1 -1
  626. package/dist/view/inspection-host.cjs +2 -2
  627. package/dist/view/inspection-host.cjs.map +1 -1
  628. package/dist/view/inspection-host.d.cts +349 -331
  629. package/dist/view/inspection-host.d.mts +349 -331
  630. package/dist/view/inspection-host.d.ts +349 -331
  631. package/docs-site/zh/examples/integrations/ai-sdk-v7.mdx +9 -9
  632. package/docs-site/zh/examples/integrations/claude-sdk.mdx +8 -8
  633. package/docs-site/zh/examples/integrations/codex-sdk.mdx +4 -4
  634. package/docs-site/zh/examples/integrations/langgraph.mdx +6 -6
  635. package/docs-site/zh/examples/integrations/pi-sdk.mdx +8 -8
  636. package/docs-site/zh/explanation/adapter.mdx +6 -6
  637. package/docs-site/zh/explanation/assert.mdx +7 -7
  638. package/docs-site/zh/explanation/drive.mdx +4 -4
  639. package/docs-site/zh/explanation/hitl.mdx +2 -2
  640. package/docs-site/zh/explanation/judge.mdx +3 -3
  641. package/docs-site/zh/index.mdx +18 -0
  642. package/docs-site/zh/introduction.mdx +4 -3
  643. package/docs-site/zh/reference/builtin-agents.mdx +46 -49
  644. package/docs-site/zh/reference/cli.mdx +16 -14
  645. package/docs-site/zh/reference/define-agent.mdx +19 -19
  646. package/docs-site/zh/reference/define-config.mdx +7 -15
  647. package/docs-site/zh/reference/define-eval.mdx +20 -14
  648. package/docs-site/zh/reference/define-experiment.mdx +18 -39
  649. package/docs-site/zh/reference/events.mdx +1 -1
  650. package/docs-site/zh/reference/expect.mdx +21 -0
  651. package/docs-site/zh/reference/official-adapters.mdx +12 -5
  652. package/docs-site/zh/troubleshooting/debugging.mdx +2 -2
  653. package/docs-site/zh/troubleshooting/recover-after-kill.mdx +1 -1
  654. package/docs-site/zh/tutorials/agent-onboarding.mdx +2 -2
  655. package/docs-site/zh/tutorials/authoring.mdx +4 -3
  656. package/docs-site/zh/tutorials/compare-runs.mdx +1 -1
  657. package/docs-site/zh/tutorials/concurrency.mdx +8 -8
  658. package/docs-site/zh/tutorials/configuration.mdx +5 -5
  659. package/docs-site/zh/tutorials/control-run-cost.mdx +49 -9
  660. package/docs-site/zh/tutorials/eval-groups.mdx +1 -1
  661. package/docs-site/zh/tutorials/evaluation-kinds.mdx +5 -5
  662. package/docs-site/zh/tutorials/experiment-services.mdx +32 -32
  663. package/docs-site/zh/tutorials/handle-execution-failures.mdx +2 -28
  664. package/docs-site/zh/tutorials/plugins.mdx +49 -143
  665. package/docs-site/zh/tutorials/sandbox-agent.mdx +1 -1
  666. package/docs-site/zh/tutorials/sandbox-reuse.mdx +7 -7
  667. package/docs-site/zh/tutorials/upgrade-0-18.mdx +64 -0
  668. package/docs-site/zh/tutorials/upgrade-0-19.mdx +121 -0
  669. package/docs-site/zh/tutorials/upgrade-0-20.mdx +12 -0
  670. package/docs-site/zh/tutorials/verify-judge.mdx +4 -3
  671. package/docs-site/zh/tutorials/viewing-results.mdx +2 -2
  672. package/docs-site/zh/tutorials/write-experiment.mdx +1 -1
  673. package/docs-site/zh/tutorials/write-send.mdx +13 -13
  674. package/package.json +1 -1
  675. package/dist/agents/effect-runtime.cjs.map +0 -1
  676. package/dist/agents/effect-runtime.d.cts +0 -29
  677. package/dist/agents/effect-runtime.d.mts +0 -29
  678. package/dist/agents/effect-runtime.d.ts +0 -29
  679. package/dist/agents/effect-runtime.js +0 -16
  680. package/dist/agents/effect-runtime.js.map +0 -1
  681. package/dist/agents/session-slot.cjs.map +0 -1
  682. package/dist/agents/session-slot.d.cts +0 -12
  683. package/dist/agents/session-slot.d.mts +0 -12
  684. package/dist/agents/session-slot.d.ts +0 -12
  685. package/dist/agents/session-slot.js +0 -6
  686. package/dist/agents/session-slot.js.map +0 -1
  687. package/dist/model-slots.cjs.map +0 -1
  688. package/dist/model-slots.d.cts +0 -19
  689. package/dist/model-slots.d.mts +0 -19
  690. package/dist/model-slots.d.ts +0 -19
  691. package/dist/model-slots.js +0 -8
  692. package/dist/model-slots.js.map +0 -1
@@ -1,3 +1,4 @@
1
+ import { AttemptNotesCollector } from "./notes.cjs";
1
2
  import { type MaterialMatch } from "../assertions/context-match.cjs";
2
3
  import { type EvalUsage } from "../o11y/eval-usage.cjs";
3
4
  import type { ExperimentFlags } from "../shared/types.cjs";
@@ -15,11 +16,13 @@ export interface AssertFirstLateResult {
15
16
  scripts: globalThis.Record<string, import("../types.cjs").ScriptResult>;
16
17
  }
17
18
  export interface AssertFirstContextState {
19
+ readonly notes: AttemptNotesCollector;
18
20
  readonly assertions: AssertionsRuntime<"pass" | "score">;
19
21
  readonly manager: SessionManager;
20
22
  readonly late: AssertFirstLateResult;
21
23
  }
22
24
  export interface AssertFirstCoreContextState {
25
+ readonly notes: AttemptNotesCollector;
23
26
  readonly assertions: AssertionsRuntime<"pass" | "score">;
24
27
  skipReason?: string;
25
28
  }
@@ -38,6 +41,8 @@ export interface AssertFirstCoreContextDeps {
38
41
  readonly evaluationKind: RuntimeKind;
39
42
  }
40
43
  export type AssertFirstCoreTestContext<Kind extends RuntimeKind = RuntimeKind> = JudgePresetMethods<Kind> & {
44
+ /** Record display data without affecting Assertions, Verdict or score. */
45
+ note(label: string, value: import("../shared/types.cjs").JsonValue | import("../assertions/quantity.cjs").Quantity): void;
41
46
  readonly usage: EvalUsage;
42
47
  readonly elapsedMs: import("../assertions/match.cjs").NumericMaterial;
43
48
  maxTokens(max: number): BooleanAssertionHandle<Kind, number>;
@@ -82,7 +87,6 @@ export interface AssertFirstContextDeps {
82
87
  readonly timingNow?: import("./session.cjs").SessionDeps["timingNow"];
83
88
  readonly onTurn?: import("./session.cjs").SessionDeps["onTurn"];
84
89
  readonly concurrencySlot?: ConcurrencySlot;
85
- readonly experimentClassifier?: import("./session.cjs").SessionDeps["experimentClassifier"];
86
90
  /** Attempt-owned source snapshot registry; never inferred from an Effect fiber. */
87
91
  readonly sourceRegistry?: SourceRegistry;
88
92
  readonly resources: import("../types.cjs").AttemptResourceRegistry;
@@ -131,7 +135,7 @@ export interface AssertFirstTurnHandle<Kind extends RuntimeKind> extends AgentJu
131
135
  readonly toolCalls: ManagedToolCalls<"turn">;
132
136
  readonly eventOccurrences: ManagedEventOccurrences<"turn">;
133
137
  readonly status: "completed" | "failed" | "waiting";
134
- readonly message: string;
138
+ readonly reply: string;
135
139
  readonly data?: JsonValue;
136
140
  readonly usage: EvalUsage;
137
141
  check: import("../assertions/api.cjs").AssertionCheck<Kind, AgentMatchContext<"turn">>;
@@ -187,6 +191,8 @@ export interface AssertFirstSessionHandle<Kind extends RuntimeKind> extends Agen
187
191
  }
188
192
  type JudgeFunction<Kind extends RuntimeKind> = <Value>(value: AssertionSubject<Value>, definition: ScoreMatch<NoInfer<Value>>) => MeasurementAssertionHandle<Kind>;
189
193
  export type AssertFirstTestContext<Kind extends RuntimeKind> = AgentJudgePresetMethods<Kind, AgentMatchContext<"attempt">> & {
194
+ /** 保存 JSON 值或 Quantity 供结果展示,不登记 Assertion,也不影响 Verdict、score 或 coverage。 */
195
+ note: AssertFirstCoreTestContext<Kind>["note"];
190
196
  readonly evaluationKind: Kind;
191
197
  send(input: string | {
192
198
  readonly text: string;
@@ -214,7 +220,7 @@ export type AssertFirstTestContext<Kind extends RuntimeKind> = AgentJudgePresetM
214
220
  judge: JudgeFunction<Kind>;
215
221
  readonly toolCalls: ManagedToolCalls<"attempt">;
216
222
  readonly sandbox: AssertFirstSandbox<Kind>;
217
- readonly o11y: import("../o11y/types.cjs").O11ySummary;
223
+ readonly observability: import("../o11y/types.cjs").ObservabilitySummary;
218
224
  readonly usage: EvalUsage;
219
225
  succeeded(): BooleanAssertionHandle<Kind, void>;
220
226
  calledTool(match: ToolMatch | ToolOccurrenceMatch): BooleanAssertionHandle<Kind, void>;
@@ -1,3 +1,4 @@
1
+ import { AttemptNotesCollector } from "./notes.mjs";
1
2
  import { type MaterialMatch } from "../assertions/context-match.mjs";
2
3
  import { type EvalUsage } from "../o11y/eval-usage.mjs";
3
4
  import type { ExperimentFlags } from "../shared/types.mjs";
@@ -15,11 +16,13 @@ export interface AssertFirstLateResult {
15
16
  scripts: globalThis.Record<string, import("../types.mjs").ScriptResult>;
16
17
  }
17
18
  export interface AssertFirstContextState {
19
+ readonly notes: AttemptNotesCollector;
18
20
  readonly assertions: AssertionsRuntime<"pass" | "score">;
19
21
  readonly manager: SessionManager;
20
22
  readonly late: AssertFirstLateResult;
21
23
  }
22
24
  export interface AssertFirstCoreContextState {
25
+ readonly notes: AttemptNotesCollector;
23
26
  readonly assertions: AssertionsRuntime<"pass" | "score">;
24
27
  skipReason?: string;
25
28
  }
@@ -38,6 +41,8 @@ export interface AssertFirstCoreContextDeps {
38
41
  readonly evaluationKind: RuntimeKind;
39
42
  }
40
43
  export type AssertFirstCoreTestContext<Kind extends RuntimeKind = RuntimeKind> = JudgePresetMethods<Kind> & {
44
+ /** Record display data without affecting Assertions, Verdict or score. */
45
+ note(label: string, value: import("../shared/types.mjs").JsonValue | import("../assertions/quantity.mjs").Quantity): void;
41
46
  readonly usage: EvalUsage;
42
47
  readonly elapsedMs: import("../assertions/match.mjs").NumericMaterial;
43
48
  maxTokens(max: number): BooleanAssertionHandle<Kind, number>;
@@ -82,7 +87,6 @@ export interface AssertFirstContextDeps {
82
87
  readonly timingNow?: import("./session.mjs").SessionDeps["timingNow"];
83
88
  readonly onTurn?: import("./session.mjs").SessionDeps["onTurn"];
84
89
  readonly concurrencySlot?: ConcurrencySlot;
85
- readonly experimentClassifier?: import("./session.mjs").SessionDeps["experimentClassifier"];
86
90
  /** Attempt-owned source snapshot registry; never inferred from an Effect fiber. */
87
91
  readonly sourceRegistry?: SourceRegistry;
88
92
  readonly resources: import("../types.mjs").AttemptResourceRegistry;
@@ -131,7 +135,7 @@ export interface AssertFirstTurnHandle<Kind extends RuntimeKind> extends AgentJu
131
135
  readonly toolCalls: ManagedToolCalls<"turn">;
132
136
  readonly eventOccurrences: ManagedEventOccurrences<"turn">;
133
137
  readonly status: "completed" | "failed" | "waiting";
134
- readonly message: string;
138
+ readonly reply: string;
135
139
  readonly data?: JsonValue;
136
140
  readonly usage: EvalUsage;
137
141
  check: import("../assertions/api.mjs").AssertionCheck<Kind, AgentMatchContext<"turn">>;
@@ -187,6 +191,8 @@ export interface AssertFirstSessionHandle<Kind extends RuntimeKind> extends Agen
187
191
  }
188
192
  type JudgeFunction<Kind extends RuntimeKind> = <Value>(value: AssertionSubject<Value>, definition: ScoreMatch<NoInfer<Value>>) => MeasurementAssertionHandle<Kind>;
189
193
  export type AssertFirstTestContext<Kind extends RuntimeKind> = AgentJudgePresetMethods<Kind, AgentMatchContext<"attempt">> & {
194
+ /** 保存 JSON 值或 Quantity 供结果展示,不登记 Assertion,也不影响 Verdict、score 或 coverage。 */
195
+ note: AssertFirstCoreTestContext<Kind>["note"];
190
196
  readonly evaluationKind: Kind;
191
197
  send(input: string | {
192
198
  readonly text: string;
@@ -214,7 +220,7 @@ export type AssertFirstTestContext<Kind extends RuntimeKind> = AgentJudgePresetM
214
220
  judge: JudgeFunction<Kind>;
215
221
  readonly toolCalls: ManagedToolCalls<"attempt">;
216
222
  readonly sandbox: AssertFirstSandbox<Kind>;
217
- readonly o11y: import("../o11y/types.mjs").O11ySummary;
223
+ readonly observability: import("../o11y/types.mjs").ObservabilitySummary;
218
224
  readonly usage: EvalUsage;
219
225
  succeeded(): BooleanAssertionHandle<Kind, void>;
220
226
  calledTool(match: ToolMatch | ToolOccurrenceMatch): BooleanAssertionHandle<Kind, void>;
@@ -1,3 +1,4 @@
1
+ import { AttemptNotesCollector } from "./notes.js";
1
2
  import { type MaterialMatch } from "../assertions/context-match.js";
2
3
  import { type EvalUsage } from "../o11y/eval-usage.js";
3
4
  import type { ExperimentFlags } from "../shared/types.js";
@@ -15,11 +16,13 @@ export interface AssertFirstLateResult {
15
16
  scripts: globalThis.Record<string, import("../types.js").ScriptResult>;
16
17
  }
17
18
  export interface AssertFirstContextState {
19
+ readonly notes: AttemptNotesCollector;
18
20
  readonly assertions: AssertionsRuntime<"pass" | "score">;
19
21
  readonly manager: SessionManager;
20
22
  readonly late: AssertFirstLateResult;
21
23
  }
22
24
  export interface AssertFirstCoreContextState {
25
+ readonly notes: AttemptNotesCollector;
23
26
  readonly assertions: AssertionsRuntime<"pass" | "score">;
24
27
  skipReason?: string;
25
28
  }
@@ -38,6 +41,8 @@ export interface AssertFirstCoreContextDeps {
38
41
  readonly evaluationKind: RuntimeKind;
39
42
  }
40
43
  export type AssertFirstCoreTestContext<Kind extends RuntimeKind = RuntimeKind> = JudgePresetMethods<Kind> & {
44
+ /** Record display data without affecting Assertions, Verdict or score. */
45
+ note(label: string, value: import("../shared/types.js").JsonValue | import("../assertions/quantity.js").Quantity): void;
41
46
  readonly usage: EvalUsage;
42
47
  readonly elapsedMs: import("../assertions/match.js").NumericMaterial;
43
48
  maxTokens(max: number): BooleanAssertionHandle<Kind, number>;
@@ -82,7 +87,6 @@ export interface AssertFirstContextDeps {
82
87
  readonly timingNow?: import("./session.js").SessionDeps["timingNow"];
83
88
  readonly onTurn?: import("./session.js").SessionDeps["onTurn"];
84
89
  readonly concurrencySlot?: ConcurrencySlot;
85
- readonly experimentClassifier?: import("./session.js").SessionDeps["experimentClassifier"];
86
90
  /** Attempt-owned source snapshot registry; never inferred from an Effect fiber. */
87
91
  readonly sourceRegistry?: SourceRegistry;
88
92
  readonly resources: import("../types.js").AttemptResourceRegistry;
@@ -131,7 +135,7 @@ export interface AssertFirstTurnHandle<Kind extends RuntimeKind> extends AgentJu
131
135
  readonly toolCalls: ManagedToolCalls<"turn">;
132
136
  readonly eventOccurrences: ManagedEventOccurrences<"turn">;
133
137
  readonly status: "completed" | "failed" | "waiting";
134
- readonly message: string;
138
+ readonly reply: string;
135
139
  readonly data?: JsonValue;
136
140
  readonly usage: EvalUsage;
137
141
  check: import("../assertions/api.js").AssertionCheck<Kind, AgentMatchContext<"turn">>;
@@ -187,6 +191,8 @@ export interface AssertFirstSessionHandle<Kind extends RuntimeKind> extends Agen
187
191
  }
188
192
  type JudgeFunction<Kind extends RuntimeKind> = <Value>(value: AssertionSubject<Value>, definition: ScoreMatch<NoInfer<Value>>) => MeasurementAssertionHandle<Kind>;
189
193
  export type AssertFirstTestContext<Kind extends RuntimeKind> = AgentJudgePresetMethods<Kind, AgentMatchContext<"attempt">> & {
194
+ /** 保存 JSON 值或 Quantity 供结果展示,不登记 Assertion,也不影响 Verdict、score 或 coverage。 */
195
+ note: AssertFirstCoreTestContext<Kind>["note"];
190
196
  readonly evaluationKind: Kind;
191
197
  send(input: string | {
192
198
  readonly text: string;
@@ -214,7 +220,7 @@ export type AssertFirstTestContext<Kind extends RuntimeKind> = AgentJudgePresetM
214
220
  judge: JudgeFunction<Kind>;
215
221
  readonly toolCalls: ManagedToolCalls<"attempt">;
216
222
  readonly sandbox: AssertFirstSandbox<Kind>;
217
- readonly o11y: import("../o11y/types.js").O11ySummary;
223
+ readonly observability: import("../o11y/types.js").ObservabilitySummary;
218
224
  readonly usage: EvalUsage;
219
225
  succeeded(): BooleanAssertionHandle<Kind, void>;
220
226
  calledTool(match: ToolMatch | ToolOccurrenceMatch): BooleanAssertionHandle<Kind, void>;
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AttemptNotesCollector = void 0;
4
+ const quantity_ts_1 = require("../assertions/quantity.cjs");
5
+ const json_value_ts_1 = require("../shared/json-value.cjs");
6
+ const schema_ts_1 = require("../record/family/attempt-note/schema.cjs");
7
+ /** Attempt-owned display data; this collector never registers an Assertion. */
8
+ class AttemptNotesCollector {
9
+ entries = [];
10
+ labels = new Set();
11
+ add(label, value) {
12
+ if (typeof label !== "string")
13
+ throw new TypeError("note() label must be a string.");
14
+ if (this.labels.has(label))
15
+ throw new TypeError(`note() label ${JSON.stringify(label)} is already recorded in this Attempt.`);
16
+ if (this.entries.length >= schema_ts_1.AttemptNoteLimits.maximumEntries)
17
+ throw new TypeError("note() accepts at most 64 entries per Attempt.");
18
+ const entry = (0, quantity_ts_1.isQuantity)(value)
19
+ ? { label, sequence: this.entries.length, value: value.value, unit: value.unit }
20
+ : { label, sequence: this.entries.length, value };
21
+ if (!(0, json_value_ts_1.isJsonValue)(entry))
22
+ throw new TypeError("note() value must be JSON or a Quantity.");
23
+ let serialized;
24
+ try {
25
+ serialized = JSON.stringify(entry);
26
+ }
27
+ catch {
28
+ throw new TypeError("note() value must be serializable JSON.");
29
+ }
30
+ if (new TextEncoder().encode(serialized).byteLength > schema_ts_1.AttemptNoteLimits.maximumJsonBytes)
31
+ throw new TypeError("note() entry exceeds 64 KiB of JSON.");
32
+ const snapshot = JSON.parse(serialized);
33
+ this.entries.push(deepFreeze(snapshot));
34
+ this.labels.add(label);
35
+ }
36
+ snapshot() { return Object.freeze([...this.entries]); }
37
+ }
38
+ exports.AttemptNotesCollector = AttemptNotesCollector;
39
+ function deepFreeze(value) {
40
+ if (value !== null && typeof value === "object") {
41
+ for (const child of Object.values(value))
42
+ deepFreeze(child);
43
+ Object.freeze(value);
44
+ }
45
+ return value;
46
+ }
47
+ //# sourceMappingURL=notes.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notes.js","sourceRoot":"","sources":["notes.ts"],"names":[],"mappings":";;;AAAA,2DAAsE;AACtE,2DAAsD;AAEtD,uEAA8F;AAC9F,+EAA+E;AAC/E,MAAa,qBAAqB;IACb,OAAO,GAAkB,EAAE,CAAC;IAC5B,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IAC5C,GAAG,CAAC,KAAa,EAAE,KAA2B;QAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ;YACzB,MAAM,IAAI,SAAS,CAAC,gCAAgC,CAAC,CAAC;QAC1D,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;YACtB,MAAM,IAAI,SAAS,CAAC,gBAAgB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;QACtG,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,6BAAiB,CAAC,cAAc;YACvD,MAAM,IAAI,SAAS,CAAC,gDAAgD,CAAC,CAAC;QAC1E,MAAM,KAAK,GAAG,IAAA,wBAAU,EAAC,KAAK,CAAC;YAC3B,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE;YAChF,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;QACtD,IAAI,CAAC,IAAA,2BAAW,EAAC,KAAK,CAAC;YACnB,MAAM,IAAI,SAAS,CAAC,0CAA0C,CAAC,CAAC;QACpE,IAAI,UAAkB,CAAC;QACvB,IAAI,CAAC;YACD,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACvC,CAAC;QACD,MAAM,CAAC;YACH,MAAM,IAAI,SAAS,CAAC,yCAAyC,CAAC,CAAC;QACnE,CAAC;QACD,IAAI,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,UAAU,GAAG,6BAAiB,CAAC,gBAAgB;YACpF,MAAM,IAAI,SAAS,CAAC,sCAAsC,CAAC,CAAC;QAChE,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAgB,CAAC;QACvD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IACD,QAAQ,KAA6B,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;CAClF;AA7BD,sDA6BC;AACD,SAAS,UAAU,CAAI,KAAQ;IAC3B,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9C,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;YACpC,UAAU,CAAC,KAAK,CAAC,CAAC;QACtB,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC","sourcesContent":["import { isQuantity, type Quantity } from \"../assertions/quantity.ts\";\nimport { isJsonValue } from \"../shared/json-value.ts\";\nimport type { JsonValue } from \"../shared/types.ts\";\nimport { AttemptNoteLimits, type AttemptNote } from \"../record/family/attempt-note/schema.ts\";\n/** Attempt-owned display data; this collector never registers an Assertion. */\nexport class AttemptNotesCollector {\n private readonly entries: AttemptNote[] = [];\n private readonly labels = new Set<string>();\n add(label: string, value: JsonValue | Quantity): void {\n if (typeof label !== \"string\")\n throw new TypeError(\"note() label must be a string.\");\n if (this.labels.has(label))\n throw new TypeError(`note() label ${JSON.stringify(label)} is already recorded in this Attempt.`);\n if (this.entries.length >= AttemptNoteLimits.maximumEntries)\n throw new TypeError(\"note() accepts at most 64 entries per Attempt.\");\n const entry = isQuantity(value)\n ? { label, sequence: this.entries.length, value: value.value, unit: value.unit }\n : { label, sequence: this.entries.length, value };\n if (!isJsonValue(entry))\n throw new TypeError(\"note() value must be JSON or a Quantity.\");\n let serialized: string;\n try {\n serialized = JSON.stringify(entry);\n }\n catch {\n throw new TypeError(\"note() value must be serializable JSON.\");\n }\n if (new TextEncoder().encode(serialized).byteLength > AttemptNoteLimits.maximumJsonBytes)\n throw new TypeError(\"note() entry exceeds 64 KiB of JSON.\");\n const snapshot = JSON.parse(serialized) as AttemptNote;\n this.entries.push(deepFreeze(snapshot));\n this.labels.add(label);\n }\n snapshot(): readonly AttemptNote[] { return Object.freeze([...this.entries]); }\n}\nfunction deepFreeze<T>(value: T): T {\n if (value !== null && typeof value === \"object\") {\n for (const child of Object.values(value))\n deepFreeze(child);\n Object.freeze(value);\n }\n return value;\n}\n"]}
@@ -0,0 +1,10 @@
1
+ import { type Quantity } from "../assertions/quantity.cjs";
2
+ import type { JsonValue } from "../shared/types.cjs";
3
+ import { type AttemptNote } from "../record/family/attempt-note/schema.cjs";
4
+ /** Attempt-owned display data; this collector never registers an Assertion. */
5
+ export declare class AttemptNotesCollector {
6
+ private readonly entries;
7
+ private readonly labels;
8
+ add(label: string, value: JsonValue | Quantity): void;
9
+ snapshot(): readonly AttemptNote[];
10
+ }
@@ -0,0 +1,10 @@
1
+ import { type Quantity } from "../assertions/quantity.mjs";
2
+ import type { JsonValue } from "../shared/types.mjs";
3
+ import { type AttemptNote } from "../record/family/attempt-note/schema.mjs";
4
+ /** Attempt-owned display data; this collector never registers an Assertion. */
5
+ export declare class AttemptNotesCollector {
6
+ private readonly entries;
7
+ private readonly labels;
8
+ add(label: string, value: JsonValue | Quantity): void;
9
+ snapshot(): readonly AttemptNote[];
10
+ }
@@ -0,0 +1,10 @@
1
+ import { type Quantity } from "../assertions/quantity.js";
2
+ import type { JsonValue } from "../shared/types.js";
3
+ import { type AttemptNote } from "../record/family/attempt-note/schema.js";
4
+ /** Attempt-owned display data; this collector never registers an Assertion. */
5
+ export declare class AttemptNotesCollector {
6
+ private readonly entries;
7
+ private readonly labels;
8
+ add(label: string, value: JsonValue | Quantity): void;
9
+ snapshot(): readonly AttemptNote[];
10
+ }
@@ -0,0 +1,6 @@
1
+ import { createRequire as __niceevalCreateRequire } from "node:module";
2
+ const __niceevalRequire = __niceevalCreateRequire(import.meta.url);
3
+ const __niceevalCanonical = __niceevalRequire("./notes.cjs");
4
+ const __niceevalExport0 = __niceevalCanonical["AttemptNotesCollector"];
5
+ export { __niceevalExport0 as AttemptNotesCollector };
6
+ //# sourceMappingURL=notes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notes.js","sources":[],"names":[],"mappings":""}
@@ -81,16 +81,10 @@ function classifySendFailure(failure) {
81
81
  }
82
82
  return { retryable: false };
83
83
  }
84
- /** 完整五道链:声明 → 实验 → adapter → 保守回退 → acceptance 门。 */
84
+ /** 分类链:声明 → Adapter → 保守回退 → acceptance 门。 */
85
85
  function resolveSendFailureClass(failure, classifiers = {}) {
86
86
  const declared = (0, failure_class_ts_1.failureClassOf)(failure);
87
- const info = {
88
- phase: "agent.run",
89
- text: sendFailureText(failure),
90
- cause: (0, external_cause_ts_1.normalizeExternalCause)(failure),
91
- };
92
87
  const resolved = declared ??
93
- (0, failure_class_ts_1.callClassifier)(classifiers.experiment, info) ??
94
88
  (0, failure_class_ts_1.callClassifier)(classifiers.adapter, failure) ??
95
89
  classifySendFailure(failure);
96
90
  const hasStartedEvidence = failure.events !== undefined && sendAcceptanceFromEvents(failure.events) === "started";
@@ -1 +1 @@
1
- {"version":3,"file":"send-failures.js","sourceRoot":"","sources":["send-failures.ts"],"names":[],"mappings":"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","sourcesContent":["// Agent send 执行失败的结构化 envelope 与分类链。Turn.status === \"failed\" 是已经取得\n// 可信协议终态的领域结果,不经过这里;只有 send() 无法返回可信 Turn 时才 reject\n// SendFailure(契约见 docs/feature/error-classification/architecture.md)。\nimport type { StreamEvent, Usage } from \"../types.ts\";\nimport { callClassifier, failureClassOf, type AttemptFailureClassifier, type FailureClass, } from \"../shared/failure-class.ts\";\nimport { externalCauseMessageChain, isExternalCause, normalizeExternalCause, type ExternalCause, } from \"../shared/external-cause.ts\";\nexport type SendAcceptance = \"rejected\" | \"started\" | \"unknown\";\n/** send() 无法返回可信 Turn 时 reject 的结构化 envelope。 */\nexport interface SendFailure {\n readonly type: \"agent-send-failed\";\n /** 只有协议能证明输入未被受理时才可写 rejected。 */\n readonly acceptance: SendAcceptance;\n readonly message: string;\n readonly cause?: ExternalCause;\n readonly events?: readonly StreamEvent[];\n readonly usage?: Usage;\n readonly process?: {\n readonly exitCode?: number;\n readonly signal?: string;\n readonly stdout?: string;\n readonly stderr?: string;\n };\n}\nexport type SendFailureClassifier = (failure: SendFailure) => FailureClass | undefined;\n/** 构造可跨 package 副本识别的纯数据 envelope;识别不依赖 instanceof。 */\nexport function makeSendFailure(input: Omit<SendFailure, \"type\">): SendFailure {\n if (input.acceptance !== \"rejected\" && input.acceptance !== \"started\" && input.acceptance !== \"unknown\") {\n throw new TypeError(`invalid SendFailure acceptance: ${String(input.acceptance)}`);\n }\n if (typeof input.message !== \"string\" || input.message.trim() === \"\") {\n throw new TypeError(\"SendFailure message must be a non-empty string\");\n }\n return { type: \"agent-send-failed\", ...input };\n}\n/** 结构守卫;自定义 adapter 即使来自第二份 niceeval,也能被 core 识别。 */\nexport function isSendFailure(value: unknown): value is SendFailure {\n if (typeof value !== \"object\" || value === null)\n return false;\n const v = value as Partial<SendFailure>;\n return (v.type === \"agent-send-failed\" &&\n (v.acceptance === \"rejected\" || v.acceptance === \"started\" || v.acceptance === \"unknown\") &&\n typeof v.message === \"string\" &&\n v.message.trim() !== \"\");\n}\nconst MAX_FAILURE_TEXT = 4096;\n// C0/C1 控制字符不进入终端/JSON 摘要;保留换行和 tab 便于 diagnoseFailure 的多行证据阅读。\nconst CONTROL_CHARACTERS = /[\\u0000-\\u0008\\u000b\\u000c\\u000e-\\u001f\\u007f-\\u009f]/g;\nconst ANSI_ESCAPE = /\\u001b(?:\\[[0-?]*[ -/]*[@-~]|\\][^\\u0007]*(?:\\u0007|\\u001b\\\\))/g;\n/** 与最终 AttemptError 和分类器同源的有界、安全失败摘要。 */\nexport function sendFailureText(failure: SendFailure): string {\n const clean = failure.message.replace(ANSI_ESCAPE, \"\").replace(CONTROL_CHARACTERS, \"\").trim();\n if (clean.length <= MAX_FAILURE_TEXT)\n return clean;\n return `${clean.slice(0, MAX_FAILURE_TEXT - 1)}…`;\n}\n/**\n * 未遵守契约而直接抛出的任意值不会漏成 unexpected-error:运行时在唯一 send choke point\n * 把它保守归一为 acceptance=unknown,并保留 cause 供诊断和 fatal 分类穿透。\n */\nexport function normalizeSendFailure(error: unknown): SendFailure {\n if (isSendFailure(error)) {\n const rawCause = (error as {\n cause?: unknown;\n }).cause;\n if (rawCause === undefined || isExternalCause(rawCause))\n return error;\n return makeSendFailure({\n ...error,\n cause: normalizeExternalCause(rawCause),\n });\n }\n const cause = normalizeExternalCause(error);\n return makeSendFailure({\n acceptance: \"unknown\",\n message: externalCauseMessageChain(cause),\n cause,\n });\n}\nconst RATE_LIMIT_CODES = new Set([\"429\", \"RATE_LIMIT\", \"RATE_LIMITED\", \"TOO_MANY_REQUESTS\"]);\nconst NETWORK_CODES = /^(ECONNREFUSED|ENOTFOUND|EAI_AGAIN|ENETUNREACH|EHOSTUNREACH|CERT_|ERR_TLS)/i;\n/**\n * 保守回退只读结构化 code/status;自然语言、空 events 与非零退出码都不能证明未受理。\n * scope 永远留在默认 attempt 档。\n */\nexport function classifySendFailure(failure: SendFailure): FailureClass {\n for (const candidate of structuredFacts(failure.cause)) {\n const status = candidate.status._tag === \"Present\" ? candidate.status.value : undefined;\n const code = candidate.code._tag === \"Present\" ? String(candidate.code.value) : undefined;\n const normalizedCode = code?.toUpperCase().replace(/[ -]+/g, \"_\");\n if (status === 429 || (normalizedCode !== undefined && RATE_LIMIT_CODES.has(normalizedCode))) {\n return { retryable: true, reason: \"rate_limit\" };\n }\n if (normalizedCode !== undefined && NETWORK_CODES.test(normalizedCode)) {\n return { retryable: true, reason: \"network\" };\n }\n }\n return { retryable: false };\n}\nexport interface SendFailureClassifiers {\n experiment?: AttemptFailureClassifier;\n adapter?: SendFailureClassifier;\n}\n/** 完整五道链:声明 → 实验 → adapter → 保守回退 → acceptance 门。 */\nexport function resolveSendFailureClass(failure: SendFailure, classifiers: SendFailureClassifiers = {}): FailureClass {\n const declared = failureClassOf(failure);\n const info = {\n phase: \"agent.run\" as const,\n text: sendFailureText(failure),\n cause: normalizeExternalCause(failure),\n };\n const resolved = declared ??\n callClassifier(classifiers.experiment, info) ??\n callClassifier(classifiers.adapter, failure) ??\n classifySendFailure(failure);\n const hasStartedEvidence = failure.events !== undefined && sendAcceptanceFromEvents(failure.events) === \"started\";\n if (resolved.retryable && (failure.acceptance !== \"rejected\" || hasStartedEvidence)) {\n return { ...resolved, retryable: false };\n }\n return resolved;\n}\n/** 内置 adapter 用:一旦已有 agent 产出,受理事实至少是 started。 */\nexport function sendAcceptanceFromEvents(events: readonly StreamEvent[]): \"started\" | \"unknown\" {\n return events.some((event) => (event.type === \"message\" && event.role === \"assistant\") ||\n event.type === \"thinking\" ||\n event.type === \"operation.started\" ||\n event.type === \"operation.finished\")\n ? \"started\"\n : \"unknown\";\n}\nfunction* structuredFacts(cause: ExternalCause | undefined): Generator<Extract<ExternalCause, {\n _tag: \"Error\" | \"Object\";\n}>> {\n let current = cause;\n while (current) {\n if (current._tag !== \"ThrownValue\")\n yield current;\n current = current.cause._tag === \"Cause\" ? current.cause.value : undefined;\n }\n}\n"]}
1
+ {"version":3,"file":"send-failures.js","sourceRoot":"","sources":["send-failures.ts"],"names":[],"mappings":"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","sourcesContent":["// Agent send 执行失败的结构化 envelope 与分类链。Turn.status === \"failed\" 是已经取得\n// 可信协议终态的领域结果,不经过这里;只有 send() 无法返回可信 Turn 时才 reject\n// SendFailure(契约见 docs/feature/error-classification/architecture.md)。\nimport type { StreamEvent, Usage } from \"../types.ts\";\nimport { callClassifier, failureClassOf, type FailureClass, } from \"../shared/failure-class.ts\";\nimport { externalCauseMessageChain, isExternalCause, normalizeExternalCause, type ExternalCause, } from \"../shared/external-cause.ts\";\nexport type SendAcceptance = \"rejected\" | \"started\" | \"unknown\";\n/** send() 无法返回可信 Turn 时 reject 的结构化 envelope。 */\nexport interface SendFailure {\n readonly type: \"agent-send-failed\";\n /** 只有协议能证明输入未被受理时才可写 rejected。 */\n readonly acceptance: SendAcceptance;\n readonly message: string;\n readonly cause?: ExternalCause;\n readonly events?: readonly StreamEvent[];\n readonly usage?: Usage;\n readonly process?: {\n readonly exitCode?: number;\n readonly signal?: string;\n readonly stdout?: string;\n readonly stderr?: string;\n };\n}\nexport type SendFailureClassifier = (failure: SendFailure) => FailureClass | undefined;\n/** 构造可跨 package 副本识别的纯数据 envelope;识别不依赖 instanceof。 */\nexport function makeSendFailure(input: Omit<SendFailure, \"type\">): SendFailure {\n if (input.acceptance !== \"rejected\" && input.acceptance !== \"started\" && input.acceptance !== \"unknown\") {\n throw new TypeError(`invalid SendFailure acceptance: ${String(input.acceptance)}`);\n }\n if (typeof input.message !== \"string\" || input.message.trim() === \"\") {\n throw new TypeError(\"SendFailure message must be a non-empty string\");\n }\n return { type: \"agent-send-failed\", ...input };\n}\n/** 结构守卫;自定义 adapter 即使来自第二份 niceeval,也能被 core 识别。 */\nexport function isSendFailure(value: unknown): value is SendFailure {\n if (typeof value !== \"object\" || value === null)\n return false;\n const v = value as Partial<SendFailure>;\n return (v.type === \"agent-send-failed\" &&\n (v.acceptance === \"rejected\" || v.acceptance === \"started\" || v.acceptance === \"unknown\") &&\n typeof v.message === \"string\" &&\n v.message.trim() !== \"\");\n}\nconst MAX_FAILURE_TEXT = 4096;\n// C0/C1 控制字符不进入终端/JSON 摘要;保留换行和 tab 便于 diagnoseFailure 的多行证据阅读。\nconst CONTROL_CHARACTERS = /[\\u0000-\\u0008\\u000b\\u000c\\u000e-\\u001f\\u007f-\\u009f]/g;\nconst ANSI_ESCAPE = /\\u001b(?:\\[[0-?]*[ -/]*[@-~]|\\][^\\u0007]*(?:\\u0007|\\u001b\\\\))/g;\n/** 与最终 AttemptError 和分类器同源的有界、安全失败摘要。 */\nexport function sendFailureText(failure: SendFailure): string {\n const clean = failure.message.replace(ANSI_ESCAPE, \"\").replace(CONTROL_CHARACTERS, \"\").trim();\n if (clean.length <= MAX_FAILURE_TEXT)\n return clean;\n return `${clean.slice(0, MAX_FAILURE_TEXT - 1)}…`;\n}\n/**\n * 未遵守契约而直接抛出的任意值不会漏成 unexpected-error:运行时在唯一 send choke point\n * 把它保守归一为 acceptance=unknown,并保留 cause 供诊断和 fatal 分类穿透。\n */\nexport function normalizeSendFailure(error: unknown): SendFailure {\n if (isSendFailure(error)) {\n const rawCause = (error as {\n cause?: unknown;\n }).cause;\n if (rawCause === undefined || isExternalCause(rawCause))\n return error;\n return makeSendFailure({\n ...error,\n cause: normalizeExternalCause(rawCause),\n });\n }\n const cause = normalizeExternalCause(error);\n return makeSendFailure({\n acceptance: \"unknown\",\n message: externalCauseMessageChain(cause),\n cause,\n });\n}\nconst RATE_LIMIT_CODES = new Set([\"429\", \"RATE_LIMIT\", \"RATE_LIMITED\", \"TOO_MANY_REQUESTS\"]);\nconst NETWORK_CODES = /^(ECONNREFUSED|ENOTFOUND|EAI_AGAIN|ENETUNREACH|EHOSTUNREACH|CERT_|ERR_TLS)/i;\n/**\n * 保守回退只读结构化 code/status;自然语言、空 events 与非零退出码都不能证明未受理。\n * scope 永远留在默认 attempt 档。\n */\nexport function classifySendFailure(failure: SendFailure): FailureClass {\n for (const candidate of structuredFacts(failure.cause)) {\n const status = candidate.status._tag === \"Present\" ? candidate.status.value : undefined;\n const code = candidate.code._tag === \"Present\" ? String(candidate.code.value) : undefined;\n const normalizedCode = code?.toUpperCase().replace(/[ -]+/g, \"_\");\n if (status === 429 || (normalizedCode !== undefined && RATE_LIMIT_CODES.has(normalizedCode))) {\n return { retryable: true, reason: \"rate_limit\" };\n }\n if (normalizedCode !== undefined && NETWORK_CODES.test(normalizedCode)) {\n return { retryable: true, reason: \"network\" };\n }\n }\n return { retryable: false };\n}\nexport interface SendFailureClassifiers {\n adapter?: SendFailureClassifier;\n}\n/** 分类链:声明 → Adapter → 保守回退 → acceptance 门。 */\nexport function resolveSendFailureClass(failure: SendFailure, classifiers: SendFailureClassifiers = {}): FailureClass {\n const declared = failureClassOf(failure);\n const resolved = declared ??\n callClassifier(classifiers.adapter, failure) ??\n classifySendFailure(failure);\n const hasStartedEvidence = failure.events !== undefined && sendAcceptanceFromEvents(failure.events) === \"started\";\n if (resolved.retryable && (failure.acceptance !== \"rejected\" || hasStartedEvidence)) {\n return { ...resolved, retryable: false };\n }\n return resolved;\n}\n/** 内置 adapter 用:一旦已有 agent 产出,受理事实至少是 started。 */\nexport function sendAcceptanceFromEvents(events: readonly StreamEvent[]): \"started\" | \"unknown\" {\n return events.some((event) => (event.type === \"message\" && event.role === \"assistant\") ||\n event.type === \"thinking\" ||\n event.type === \"operation.started\" ||\n event.type === \"operation.finished\")\n ? \"started\"\n : \"unknown\";\n}\nfunction* structuredFacts(cause: ExternalCause | undefined): Generator<Extract<ExternalCause, {\n _tag: \"Error\" | \"Object\";\n}>> {\n let current = cause;\n while (current) {\n if (current._tag !== \"ThrownValue\")\n yield current;\n current = current.cause._tag === \"Cause\" ? current.cause.value : undefined;\n }\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import type { StreamEvent, Usage } from "../types.cjs";
2
- import { type AttemptFailureClassifier, type FailureClass } from "../shared/failure-class.cjs";
2
+ import { type FailureClass } from "../shared/failure-class.cjs";
3
3
  import { type ExternalCause } from "../shared/external-cause.cjs";
4
4
  export type SendAcceptance = "rejected" | "started" | "unknown";
5
5
  /** send() 无法返回可信 Turn 时 reject 的结构化 envelope。 */
@@ -36,10 +36,9 @@ export declare function normalizeSendFailure(error: unknown): SendFailure;
36
36
  */
37
37
  export declare function classifySendFailure(failure: SendFailure): FailureClass;
38
38
  export interface SendFailureClassifiers {
39
- experiment?: AttemptFailureClassifier;
40
39
  adapter?: SendFailureClassifier;
41
40
  }
42
- /** 完整五道链:声明 → 实验 → adapter → 保守回退 → acceptance 门。 */
41
+ /** 分类链:声明 → Adapter → 保守回退 → acceptance 门。 */
43
42
  export declare function resolveSendFailureClass(failure: SendFailure, classifiers?: SendFailureClassifiers): FailureClass;
44
43
  /** 内置 adapter 用:一旦已有 agent 产出,受理事实至少是 started。 */
45
44
  export declare function sendAcceptanceFromEvents(events: readonly StreamEvent[]): "started" | "unknown";
@@ -1,5 +1,5 @@
1
1
  import type { StreamEvent, Usage } from "../types.mjs";
2
- import { type AttemptFailureClassifier, type FailureClass } from "../shared/failure-class.mjs";
2
+ import { type FailureClass } from "../shared/failure-class.mjs";
3
3
  import { type ExternalCause } from "../shared/external-cause.mjs";
4
4
  export type SendAcceptance = "rejected" | "started" | "unknown";
5
5
  /** send() 无法返回可信 Turn 时 reject 的结构化 envelope。 */
@@ -36,10 +36,9 @@ export declare function normalizeSendFailure(error: unknown): SendFailure;
36
36
  */
37
37
  export declare function classifySendFailure(failure: SendFailure): FailureClass;
38
38
  export interface SendFailureClassifiers {
39
- experiment?: AttemptFailureClassifier;
40
39
  adapter?: SendFailureClassifier;
41
40
  }
42
- /** 完整五道链:声明 → 实验 → adapter → 保守回退 → acceptance 门。 */
41
+ /** 分类链:声明 → Adapter → 保守回退 → acceptance 门。 */
43
42
  export declare function resolveSendFailureClass(failure: SendFailure, classifiers?: SendFailureClassifiers): FailureClass;
44
43
  /** 内置 adapter 用:一旦已有 agent 产出,受理事实至少是 started。 */
45
44
  export declare function sendAcceptanceFromEvents(events: readonly StreamEvent[]): "started" | "unknown";
@@ -1,5 +1,5 @@
1
1
  import type { StreamEvent, Usage } from "../types.js";
2
- import { type AttemptFailureClassifier, type FailureClass } from "../shared/failure-class.js";
2
+ import { type FailureClass } from "../shared/failure-class.js";
3
3
  import { type ExternalCause } from "../shared/external-cause.js";
4
4
  export type SendAcceptance = "rejected" | "started" | "unknown";
5
5
  /** send() 无法返回可信 Turn 时 reject 的结构化 envelope。 */
@@ -36,10 +36,9 @@ export declare function normalizeSendFailure(error: unknown): SendFailure;
36
36
  */
37
37
  export declare function classifySendFailure(failure: SendFailure): FailureClass;
38
38
  export interface SendFailureClassifiers {
39
- experiment?: AttemptFailureClassifier;
40
39
  adapter?: SendFailureClassifier;
41
40
  }
42
- /** 完整五道链:声明 → 实验 → adapter → 保守回退 → acceptance 门。 */
41
+ /** 分类链:声明 → Adapter → 保守回退 → acceptance 门。 */
43
42
  export declare function resolveSendFailureClass(failure: SendFailure, classifiers?: SendFailureClassifiers): FailureClass;
44
43
  /** 内置 adapter 用:一旦已有 agent 产出,受理事实至少是 started。 */
45
44
  export declare function sendAcceptanceFromEvents(events: readonly StreamEvent[]): "started" | "unknown";
@@ -52,7 +52,6 @@ function sendWithTurnRetry(callOnce, deps) {
52
52
  const monotonicEndedAt = yield* effect_1.Clock.currentTimeNanos;
53
53
  const durationMs = Math.max(0, Number(monotonicEndedAt - monotonicStartedAt) / 1000000);
54
54
  const cls = (0, send_failures_ts_1.resolveSendFailureClass)(failure, {
55
- experiment: deps.experimentClassifier,
56
55
  adapter: deps.classifier,
57
56
  });
58
57
  if (!cls.retryable)
@@ -1 +1 @@
1
- {"version":3,"file":"send-retry.js","sourceRoot":"","sources":["send-retry.ts"],"names":[],"mappings":"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","sourcesContent":["// Agent send 的唯一重试执行体。正常返回的三种 Turn status 都原样交回;只有 reject 的\n// SendFailure 进入分类和重试(docs/feature/error-classification/architecture.md)。\nimport { Clock, Effect, Random } from \"effect\";\nimport { attachFailureClass, type AttemptFailureClassifier, type FailureClass } from \"../shared/failure-class.ts\";\nimport { makeSendFailure, normalizeSendFailure, resolveSendFailureClass, sendFailureText, type SendFailure, type SendFailureClassifier, } from \"./send-failures.ts\";\nimport { normalizeExternalCause } from \"../shared/external-cause.ts\";\nexport const SEND_MAX_ATTEMPTS = 4;\nexport const ATTEMPT_MAX_RETRIES = 8;\nconst BASE_DELAY_MS = 5000;\nexport interface AttemptRetryBudget {\n remaining: number;\n}\nexport function createAttemptRetryBudget(): AttemptRetryBudget {\n return { remaining: ATTEMPT_MAX_RETRIES };\n}\nexport interface ConcurrencySlot {\n readonly release: Effect.Effect<void>;\n readonly reacquire: Effect.Effect<void>;\n}\nexport interface RetriedSendFailure {\n /** 同一逻辑 send 内从 0 开始的物理尝试序号。 */\n sendAttempt: number;\n startedAt: string;\n durationMs: number;\n failure: SendFailure;\n classification: Extract<FailureClass, {\n retryable: true;\n }>;\n}\nexport interface SendRetryDeps {\n classifier?: SendFailureClassifier;\n experimentClassifier?: AttemptFailureClassifier;\n /** 只回报被自动重试吸收的物理失败;终局失败由抛出值承载。 */\n onRetryAttempt?: (attempt: RetriedSendFailure) => void;\n budget: AttemptRetryBudget;\n slot?: ConcurrencySlot;\n reportRetry?: (message: string) => void;\n signal: AbortSignal;\n}\n/** Adapt the Attempt-owned AbortSignal into interruption, without turning it into a send failure. */\nfunction awaitAbort(signal: AbortSignal): Effect.Effect<void> {\n return Effect.callback<void>((resume) => {\n if (signal.aborted) {\n resume(Effect.void);\n return;\n }\n const onAbort = () => resume(Effect.void);\n signal.addEventListener(\"abort\", onAbort, { once: true });\n return Effect.sync(() => signal.removeEventListener(\"abort\", onAbort));\n });\n}\nfunction retrySleep(signal: AbortSignal, delayMs: number): Effect.Effect<void> {\n return Effect.raceFirst(Effect.sleep(delayMs).pipe(Effect.as(\"delay\" as const)), awaitAbort(signal).pipe(Effect.as(\"aborted\" as const))).pipe(Effect.flatMap((winner) => winner === \"aborted\" ? Effect.interrupt : Effect.void));\n}\n/**\n * A retried Attempt gives its global slot back while waiting. acquireUseRelease\n * registers reacquire before entering the interruptible sleep, so interruption\n * cannot permanently shrink available capacity.\n */\nfunction sleepWithReleasedSlot(slot: ConcurrencySlot | undefined, sleep: Effect.Effect<void, unknown>): Effect.Effect<void, unknown> {\n if (slot === undefined)\n return sleep;\n return Effect.acquireUseRelease(Effect.suspend(() => slot.release), () => sleep, () => Effect.suspend(() => slot.reacquire));\n}\n/**\n * 对同一个物理输入至多调用四次。adapter 未使用 makeSendFailure 而直接抛出的值在这里\n * 保守归一为 acceptance=unknown,因此会得到稳定 agent-send-failed,而不会被误重发。\n */\nexport function sendWithTurnRetry<T>(callOnce: Effect.Effect<T, unknown>, deps: SendRetryDeps): Effect.Effect<T, unknown> {\n const retry = (sendAttempt: number): Effect.Effect<T, unknown> => Effect.gen(function* () {\n const startedAtMs = yield* Clock.currentTimeMillis;\n const monotonicStartedAt = yield* Clock.currentTimeNanos;\n return yield* callOnce.pipe(Effect.mapError(normalizeSendFailure), Effect.catch((failure) => Effect.gen(function* () {\n const monotonicEndedAt = yield* Clock.currentTimeNanos;\n const durationMs = Math.max(0, Number(monotonicEndedAt - monotonicStartedAt) / 1000000);\n const cls = resolveSendFailureClass(failure, {\n experiment: deps.experimentClassifier,\n adapter: deps.classifier,\n });\n if (!cls.retryable)\n return yield* Effect.fail(attachFailureClass(failure, cls));\n if (sendAttempt + 1 >= SEND_MAX_ATTEMPTS) {\n return yield* Effect.fail(finalizeExhausted(failure, cls, \"send\"));\n }\n if (deps.budget.remaining <= 0) {\n return yield* Effect.fail(finalizeExhausted(failure, cls, \"attempt\"));\n }\n const jitter = yield* Random.next;\n const delayMs = BASE_DELAY_MS * 2 ** sendAttempt * jitter;\n yield* Effect.sync(() => {\n deps.onRetryAttempt?.({\n sendAttempt,\n startedAt: new Date(startedAtMs).toISOString(),\n durationMs,\n failure,\n classification: cls,\n });\n deps.budget.remaining -= 1;\n deps.reportRetry?.(`turn retry ${sendAttempt + 2}/${SEND_MAX_ATTEMPTS} (${cls.reason}) — waiting ${Math.round(delayMs / 1000)}s`);\n });\n yield* sleepWithReleasedSlot(deps.slot, retrySleep(deps.signal, delayMs));\n return yield* retry(sendAttempt + 1);\n })));\n });\n return retry(0);\n}\nfunction finalizeExhausted(failure: SendFailure, cls: Extract<FailureClass, {\n retryable: true;\n}>, layer: \"send\" | \"attempt\"): SendFailure {\n const suffix = layer === \"send\"\n ? ` · retries exhausted (${SEND_MAX_ATTEMPTS} attempts, ${cls.reason})`\n : ` · attempt retry budget exhausted (${ATTEMPT_MAX_RETRIES} retries, ${cls.reason})`;\n const wrapped = makeSendFailure({\n ...failure,\n message: sendFailureText(failure) + suffix,\n cause: normalizeExternalCause(failure),\n });\n return attachFailureClass(wrapped, cls);\n}\n"]}
1
+ {"version":3,"file":"send-retry.js","sourceRoot":"","sources":["send-retry.ts"],"names":[],"mappings":"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","sourcesContent":["// Agent send 的唯一重试执行体。正常返回的三种 Turn status 都原样交回;只有 reject 的\n// SendFailure 进入分类和重试(docs/feature/error-classification/architecture.md)。\nimport { Clock, Effect, Random } from \"effect\";\nimport { attachFailureClass, type FailureClass } from \"../shared/failure-class.ts\";\nimport { makeSendFailure, normalizeSendFailure, resolveSendFailureClass, sendFailureText, type SendFailure, type SendFailureClassifier, } from \"./send-failures.ts\";\nimport { normalizeExternalCause } from \"../shared/external-cause.ts\";\nexport const SEND_MAX_ATTEMPTS = 4;\nexport const ATTEMPT_MAX_RETRIES = 8;\nconst BASE_DELAY_MS = 5000;\nexport interface AttemptRetryBudget {\n remaining: number;\n}\nexport function createAttemptRetryBudget(): AttemptRetryBudget {\n return { remaining: ATTEMPT_MAX_RETRIES };\n}\nexport interface ConcurrencySlot {\n readonly release: Effect.Effect<void>;\n readonly reacquire: Effect.Effect<void>;\n}\nexport interface RetriedSendFailure {\n /** 同一逻辑 send 内从 0 开始的物理尝试序号。 */\n sendAttempt: number;\n startedAt: string;\n durationMs: number;\n failure: SendFailure;\n classification: Extract<FailureClass, {\n retryable: true;\n }>;\n}\nexport interface SendRetryDeps {\n classifier?: SendFailureClassifier;\n /** 只回报被自动重试吸收的物理失败;终局失败由抛出值承载。 */\n onRetryAttempt?: (attempt: RetriedSendFailure) => void;\n budget: AttemptRetryBudget;\n slot?: ConcurrencySlot;\n reportRetry?: (message: string) => void;\n signal: AbortSignal;\n}\n/** Adapt the Attempt-owned AbortSignal into interruption, without turning it into a send failure. */\nfunction awaitAbort(signal: AbortSignal): Effect.Effect<void> {\n return Effect.callback<void>((resume) => {\n if (signal.aborted) {\n resume(Effect.void);\n return;\n }\n const onAbort = () => resume(Effect.void);\n signal.addEventListener(\"abort\", onAbort, { once: true });\n return Effect.sync(() => signal.removeEventListener(\"abort\", onAbort));\n });\n}\nfunction retrySleep(signal: AbortSignal, delayMs: number): Effect.Effect<void> {\n return Effect.raceFirst(Effect.sleep(delayMs).pipe(Effect.as(\"delay\" as const)), awaitAbort(signal).pipe(Effect.as(\"aborted\" as const))).pipe(Effect.flatMap((winner) => winner === \"aborted\" ? Effect.interrupt : Effect.void));\n}\n/**\n * A retried Attempt gives its global slot back while waiting. acquireUseRelease\n * registers reacquire before entering the interruptible sleep, so interruption\n * cannot permanently shrink available capacity.\n */\nfunction sleepWithReleasedSlot(slot: ConcurrencySlot | undefined, sleep: Effect.Effect<void, unknown>): Effect.Effect<void, unknown> {\n if (slot === undefined)\n return sleep;\n return Effect.acquireUseRelease(Effect.suspend(() => slot.release), () => sleep, () => Effect.suspend(() => slot.reacquire));\n}\n/**\n * 对同一个物理输入至多调用四次。adapter 未使用 makeSendFailure 而直接抛出的值在这里\n * 保守归一为 acceptance=unknown,因此会得到稳定 agent-send-failed,而不会被误重发。\n */\nexport function sendWithTurnRetry<T>(callOnce: Effect.Effect<T, unknown>, deps: SendRetryDeps): Effect.Effect<T, unknown> {\n const retry = (sendAttempt: number): Effect.Effect<T, unknown> => Effect.gen(function* () {\n const startedAtMs = yield* Clock.currentTimeMillis;\n const monotonicStartedAt = yield* Clock.currentTimeNanos;\n return yield* callOnce.pipe(Effect.mapError(normalizeSendFailure), Effect.catch((failure) => Effect.gen(function* () {\n const monotonicEndedAt = yield* Clock.currentTimeNanos;\n const durationMs = Math.max(0, Number(monotonicEndedAt - monotonicStartedAt) / 1000000);\n const cls = resolveSendFailureClass(failure, {\n adapter: deps.classifier,\n });\n if (!cls.retryable)\n return yield* Effect.fail(attachFailureClass(failure, cls));\n if (sendAttempt + 1 >= SEND_MAX_ATTEMPTS) {\n return yield* Effect.fail(finalizeExhausted(failure, cls, \"send\"));\n }\n if (deps.budget.remaining <= 0) {\n return yield* Effect.fail(finalizeExhausted(failure, cls, \"attempt\"));\n }\n const jitter = yield* Random.next;\n const delayMs = BASE_DELAY_MS * 2 ** sendAttempt * jitter;\n yield* Effect.sync(() => {\n deps.onRetryAttempt?.({\n sendAttempt,\n startedAt: new Date(startedAtMs).toISOString(),\n durationMs,\n failure,\n classification: cls,\n });\n deps.budget.remaining -= 1;\n deps.reportRetry?.(`turn retry ${sendAttempt + 2}/${SEND_MAX_ATTEMPTS} (${cls.reason}) — waiting ${Math.round(delayMs / 1000)}s`);\n });\n yield* sleepWithReleasedSlot(deps.slot, retrySleep(deps.signal, delayMs));\n return yield* retry(sendAttempt + 1);\n })));\n });\n return retry(0);\n}\nfunction finalizeExhausted(failure: SendFailure, cls: Extract<FailureClass, {\n retryable: true;\n}>, layer: \"send\" | \"attempt\"): SendFailure {\n const suffix = layer === \"send\"\n ? ` · retries exhausted (${SEND_MAX_ATTEMPTS} attempts, ${cls.reason})`\n : ` · attempt retry budget exhausted (${ATTEMPT_MAX_RETRIES} retries, ${cls.reason})`;\n const wrapped = makeSendFailure({\n ...failure,\n message: sendFailureText(failure) + suffix,\n cause: normalizeExternalCause(failure),\n });\n return attachFailureClass(wrapped, cls);\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import { Effect } from "effect";
2
- import { type AttemptFailureClassifier, type FailureClass } from "../shared/failure-class.cjs";
2
+ import { type FailureClass } from "../shared/failure-class.cjs";
3
3
  import { type SendFailure, type SendFailureClassifier } from "./send-failures.cjs";
4
4
  export declare const SEND_MAX_ATTEMPTS = 4;
5
5
  export declare const ATTEMPT_MAX_RETRIES = 8;
@@ -23,7 +23,6 @@ export interface RetriedSendFailure {
23
23
  }
24
24
  export interface SendRetryDeps {
25
25
  classifier?: SendFailureClassifier;
26
- experimentClassifier?: AttemptFailureClassifier;
27
26
  /** 只回报被自动重试吸收的物理失败;终局失败由抛出值承载。 */
28
27
  onRetryAttempt?: (attempt: RetriedSendFailure) => void;
29
28
  budget: AttemptRetryBudget;
@@ -1,5 +1,5 @@
1
1
  import { Effect } from "effect";
2
- import { type AttemptFailureClassifier, type FailureClass } from "../shared/failure-class.mjs";
2
+ import { type FailureClass } from "../shared/failure-class.mjs";
3
3
  import { type SendFailure, type SendFailureClassifier } from "./send-failures.mjs";
4
4
  export declare const SEND_MAX_ATTEMPTS = 4;
5
5
  export declare const ATTEMPT_MAX_RETRIES = 8;
@@ -23,7 +23,6 @@ export interface RetriedSendFailure {
23
23
  }
24
24
  export interface SendRetryDeps {
25
25
  classifier?: SendFailureClassifier;
26
- experimentClassifier?: AttemptFailureClassifier;
27
26
  /** 只回报被自动重试吸收的物理失败;终局失败由抛出值承载。 */
28
27
  onRetryAttempt?: (attempt: RetriedSendFailure) => void;
29
28
  budget: AttemptRetryBudget;
@@ -1,5 +1,5 @@
1
1
  import { Effect } from "effect";
2
- import { type AttemptFailureClassifier, type FailureClass } from "../shared/failure-class.js";
2
+ import { type FailureClass } from "../shared/failure-class.js";
3
3
  import { type SendFailure, type SendFailureClassifier } from "./send-failures.js";
4
4
  export declare const SEND_MAX_ATTEMPTS = 4;
5
5
  export declare const ATTEMPT_MAX_RETRIES = 8;
@@ -23,7 +23,6 @@ export interface RetriedSendFailure {
23
23
  }
24
24
  export interface SendRetryDeps {
25
25
  classifier?: SendFailureClassifier;
26
- experimentClassifier?: AttemptFailureClassifier;
27
26
  /** 只回报被自动重试吸收的物理失败;终局失败由抛出值承载。 */
28
27
  onRetryAttempt?: (attempt: RetriedSendFailure) => void;
29
28
  budget: AttemptRetryBudget;
@@ -16,14 +16,14 @@ const send_failures_ts_1 = require("./send-failures.cjs");
16
16
  const turn_label_ts_1 = require("../shared/turn-label.cjs");
17
17
  const attempt_resources_ts_1 = require("./attempt-resources.cjs");
18
18
  const callback_context_ts_1 = require("../agents/callback-context.cjs");
19
- const effect_runtime_ts_1 = require("../agents/effect-runtime.cjs");
19
+ const agent_effects_ts_1 = require("../agents/agent-effects.cjs");
20
20
  /**
21
21
  * 一条会话线的存取器实现。slot 值只按 factory 创建的 symbol 身份存取;
22
22
  * 从异构 Map 取出后立即依 typed slot 恢复 `T`,不让擦除后的值流入领域逻辑。
23
23
  */
24
- class StoredSessionSlotValue {
24
+ class StoredSessionKeyValue {
25
25
  }
26
- class StoredSessionSlotValueOf extends StoredSessionSlotValue {
26
+ class StoredSessionKeyValueOf extends StoredSessionKeyValue {
27
27
  value;
28
28
  constructor(value) {
29
29
  super();
@@ -50,7 +50,7 @@ function createAgentSession() {
50
50
  return stored === undefined ? undefined : valueFromStoredSlot(stored);
51
51
  },
52
52
  set(slot, value) {
53
- slots.set(slot.key, new StoredSessionSlotValueOf(value));
53
+ slots.set(slot.key, new StoredSessionKeyValueOf(value));
54
54
  },
55
55
  take(slot) {
56
56
  const stored = slots.get(slot.key);
@@ -295,6 +295,7 @@ class SessionManager {
295
295
  ...(sourceOrder === undefined ? {} : { sourceOrder }),
296
296
  });
297
297
  const ctx = (0, attempt_resources_ts_1.bindAttemptResources)({
298
+ sandbox: this.deps.sandbox,
298
299
  turnId,
299
300
  signal: this.deps.signal,
300
301
  evalId: this.deps.evalId,
@@ -349,7 +350,6 @@ class SessionManager {
349
350
  : this.sendAgentEffect({ text, files, responses }, ctx, observeUsage).pipe(effect_1.Effect.map((turn) => ({ turn })));
350
351
  const retryDeps = {
351
352
  classifier: this.deps.agent.classifySendFailure,
352
- experimentClassifier: this.deps.experimentClassifier,
353
353
  onRetryAttempt: ({ sendAttempt, startedAt, durationMs, failure, classification }) => {
354
354
  const process = failure.process;
355
355
  this.retryAttempts.push({
@@ -498,14 +498,12 @@ class SessionManager {
498
498
  });
499
499
  }
500
500
  sendAgentEffect(input, ctx, observeUsage) {
501
- const nativeContext = this.deps.agent.kind === "sandbox"
502
- ? (0, attempt_resources_ts_1.bindAttemptResources)({ ...ctx, sandbox: this.deps.sandbox }, this.deps.resources)
503
- : ctx;
504
- const native = (0, effect_runtime_ts_1.agentSendEffect)(this.deps.agent, input, nativeContext);
501
+ const nativeContext = ctx;
502
+ const native = (0, agent_effects_ts_1.agentSendEffect)(this.deps.agent, input, nativeContext);
505
503
  if (native !== undefined) {
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))));
504
+ return (0, callback_context_ts_1.withAgentCallbackContext)(nativeContext, (callbackContext) => observeUsage(effect_1.Effect.suspend(() => (0, agent_effects_ts_1.agentSendEffect)(this.deps.agent, input, callbackContext)).pipe(effect_1.Effect.mapError(send_failures_ts_1.normalizeSendFailure))));
507
505
  }
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))));
506
+ return (0, callback_context_ts_1.withAgentCallbackContext)(ctx, (callbackContext) => observeUsage((0, agent_effects_ts_1.authorCallbackEffect)(() => this.sendAgent(input, callbackContext)).pipe(effect_1.Effect.mapError(send_failures_ts_1.normalizeSendFailure))));
509
507
  }
510
508
  /** Runs at the Agent invoke boundary, after ledger and OTLP preparation, once per retry. */
511
509
  recordSendUsageEffect(callOnce, identity) {
@@ -617,12 +615,7 @@ class SessionManager {
617
615
  return attributed;
618
616
  }
619
617
  sendAgent(input, ctx) {
620
- const agent = this.deps.agent;
621
- if (agent.kind === "sandbox") {
622
- const sandboxCtx = (0, attempt_resources_ts_1.bindAttemptResources)({ ...ctx, sandbox: this.deps.sandbox }, this.deps.resources);
623
- return agent.send(input, sandboxCtx);
624
- }
625
- return agent.send(input, ctx);
618
+ return this.deps.agent.send(input, ctx);
626
619
  }
627
620
  }
628
621
  exports.SessionManager = SessionManager;