niceeval 0.18.0 → 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 (679) hide show
  1. package/INDEX.md +4 -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 -7
  7. package/dist/adapter.cjs.map +1 -1
  8. package/dist/adapter.d.cts +21 -21
  9. package/dist/adapter.d.mts +21 -21
  10. package/dist/adapter.d.ts +21 -21
  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 +22 -6
  121. package/dist/assertions/measurements.cjs.map +1 -1
  122. package/dist/assertions/measurements.d.cts +8 -1
  123. package/dist/assertions/measurements.d.mts +8 -1
  124. package/dist/assertions/measurements.d.ts +8 -1
  125. package/dist/assertions/numeric.cjs +2 -0
  126. package/dist/assertions/numeric.cjs.map +1 -1
  127. package/dist/assertions/numeric.d.cts +1 -1
  128. package/dist/assertions/numeric.d.mts +1 -1
  129. package/dist/assertions/numeric.d.ts +1 -1
  130. package/dist/assertions/quantity.cjs +42 -0
  131. package/dist/assertions/quantity.cjs.map +1 -0
  132. package/dist/assertions/quantity.d.cts +18 -0
  133. package/dist/assertions/quantity.d.mts +18 -0
  134. package/dist/assertions/quantity.d.ts +18 -0
  135. package/dist/assertions/quantity.js +22 -0
  136. package/dist/assertions/quantity.js.map +1 -0
  137. package/dist/assertions/record/attachment.cjs +2 -0
  138. package/dist/assertions/record/attachment.cjs.map +1 -1
  139. package/dist/assertions/record/codec.cjs +5 -1
  140. package/dist/assertions/record/codec.cjs.map +1 -1
  141. package/dist/assertions/record/model.cjs.map +1 -1
  142. package/dist/assertions/record/model.d.cts +3 -1
  143. package/dist/assertions/record/model.d.mts +3 -1
  144. package/dist/assertions/record/model.d.ts +3 -1
  145. package/dist/assertions/runtime.cjs +11 -6
  146. package/dist/assertions/runtime.cjs.map +1 -1
  147. package/dist/cli/program.cjs +3 -0
  148. package/dist/cli/program.cjs.map +1 -1
  149. package/dist/context/assert-first.cjs +6 -4
  150. package/dist/context/assert-first.cjs.map +1 -1
  151. package/dist/context/assert-first.d.cts +9 -3
  152. package/dist/context/assert-first.d.mts +9 -3
  153. package/dist/context/assert-first.d.ts +9 -3
  154. package/dist/context/notes.cjs +47 -0
  155. package/dist/context/notes.cjs.map +1 -0
  156. package/dist/context/notes.d.cts +10 -0
  157. package/dist/context/notes.d.mts +10 -0
  158. package/dist/context/notes.d.ts +10 -0
  159. package/dist/context/notes.js +6 -0
  160. package/dist/context/notes.js.map +1 -0
  161. package/dist/context/send-failures.cjs +1 -7
  162. package/dist/context/send-failures.cjs.map +1 -1
  163. package/dist/context/send-failures.d.cts +2 -3
  164. package/dist/context/send-failures.d.mts +2 -3
  165. package/dist/context/send-failures.d.ts +2 -3
  166. package/dist/context/send-retry.cjs +0 -1
  167. package/dist/context/send-retry.cjs.map +1 -1
  168. package/dist/context/send-retry.d.cts +1 -2
  169. package/dist/context/send-retry.d.mts +1 -2
  170. package/dist/context/send-retry.d.ts +1 -2
  171. package/dist/context/session.cjs +10 -17
  172. package/dist/context/session.cjs.map +1 -1
  173. package/dist/context/session.d.cts +4 -10
  174. package/dist/context/session.d.mts +4 -10
  175. package/dist/context/session.d.ts +4 -10
  176. package/dist/define.cjs +88 -65
  177. package/dist/define.cjs.map +1 -1
  178. package/dist/define.d.cts +3 -3
  179. package/dist/define.d.mts +3 -3
  180. package/dist/define.d.ts +3 -3
  181. package/dist/eval/cli/contribution.cjs +1 -1
  182. package/dist/eval/cli/contribution.cjs.map +1 -1
  183. package/dist/eval/host/index.cjs +1 -1
  184. package/dist/eval/host/index.cjs.map +1 -1
  185. package/dist/eval/record/evaluation.cjs +1 -1
  186. package/dist/eval/record/evaluation.cjs.map +1 -1
  187. package/dist/eval/record/membership-provenance.d.cts +3 -3
  188. package/dist/eval/record/membership-provenance.d.mts +3 -3
  189. package/dist/eval/record/membership-provenance.d.ts +3 -3
  190. package/dist/eval/record/score.cjs +2 -2
  191. package/dist/eval/record/score.cjs.map +1 -1
  192. package/dist/eval/record/sealed-assertion.cjs +1 -1
  193. package/dist/eval/record/sealed-assertion.cjs.map +1 -1
  194. package/dist/eval/record/verdict.cjs +2 -2
  195. package/dist/eval/record/verdict.cjs.map +1 -1
  196. package/dist/expect/index.cjs +10 -1
  197. package/dist/expect/index.cjs.map +1 -1
  198. package/dist/expect/index.d.cts +3 -1
  199. package/dist/expect/index.d.mts +3 -1
  200. package/dist/expect/index.d.ts +3 -1
  201. package/dist/expect/index.js +92 -76
  202. package/dist/expect/index.mjs +92 -76
  203. package/dist/experiment/host/cli/contribution.cjs +52 -39
  204. package/dist/experiment/host/cli/contribution.cjs.map +1 -1
  205. package/dist/experiment/host/cli/contribution.d.cts +18 -4
  206. package/dist/experiment/host/cli/contribution.d.mts +18 -4
  207. package/dist/experiment/host/cli/contribution.d.ts +18 -4
  208. package/dist/experiment/host/cli/contribution.js +2 -2
  209. package/dist/experiment/host/cli/debug-protocol.cjs +2 -2
  210. package/dist/experiment/host/cli/debug-protocol.cjs.map +1 -1
  211. package/dist/experiment/host/cli/debug-protocol.d.cts +2 -2
  212. package/dist/experiment/host/cli/debug-protocol.d.mts +2 -2
  213. package/dist/experiment/host/cli/debug-protocol.d.ts +2 -2
  214. package/dist/experiment/host/cli/output-protocol.cjs +1 -1
  215. package/dist/experiment/host/cli/output-protocol.cjs.map +1 -1
  216. package/dist/experiment/host/cli/output-protocol.d.cts +2 -2
  217. package/dist/experiment/host/cli/output-protocol.d.mts +2 -2
  218. package/dist/experiment/host/cli/output-protocol.d.ts +2 -2
  219. package/dist/experiment/host/current.cjs +2 -2
  220. package/dist/experiment/host/current.cjs.map +1 -1
  221. package/dist/experiment/host/index.cjs +1 -1
  222. package/dist/experiment/host/index.cjs.map +1 -1
  223. package/dist/experiment/host/operations.cjs +21 -22
  224. package/dist/experiment/host/operations.cjs.map +1 -1
  225. package/dist/experiment/host/runtime.cjs +8 -9
  226. package/dist/experiment/host/runtime.cjs.map +1 -1
  227. package/dist/experiment/host/runtime.d.cts +3 -3
  228. package/dist/experiment/host/runtime.d.mts +3 -3
  229. package/dist/experiment/host/runtime.d.ts +3 -3
  230. package/dist/experiment/host/teardown.cjs +3 -3
  231. package/dist/experiment/host/teardown.cjs.map +1 -1
  232. package/dist/experiment/host/teardown.d.cts +3 -3
  233. package/dist/experiment/host/teardown.d.mts +3 -3
  234. package/dist/experiment/host/teardown.d.ts +3 -3
  235. package/dist/experiment/host/types.cjs.map +1 -1
  236. package/dist/experiment/host/types.d.cts +19 -19
  237. package/dist/experiment/host/types.d.mts +19 -19
  238. package/dist/experiment/host/types.d.ts +19 -19
  239. package/dist/index.cjs +3 -3
  240. package/dist/index.cjs.map +1 -1
  241. package/dist/index.d.cts +3 -3
  242. package/dist/index.d.mts +3 -3
  243. package/dist/index.d.ts +3 -3
  244. package/dist/index.js +2 -2
  245. package/dist/index.mjs +2 -2
  246. package/dist/inspection/assertions.cjs +1 -1
  247. package/dist/inspection/assertions.cjs.map +1 -1
  248. package/dist/inspection/cli/contribution.cjs +8 -7
  249. package/dist/inspection/cli/contribution.cjs.map +1 -1
  250. package/dist/inspection/facts.cjs +4 -4
  251. package/dist/inspection/facts.cjs.map +1 -1
  252. package/dist/inspection/index.cjs +1 -5
  253. package/dist/inspection/index.cjs.map +1 -1
  254. package/dist/inspection/index.d.cts +1 -2
  255. package/dist/inspection/index.d.mts +1 -2
  256. package/dist/inspection/index.d.ts +1 -2
  257. package/dist/inspection/index.js +20 -26
  258. package/dist/inspection/lifecycle.cjs +7 -0
  259. package/dist/inspection/lifecycle.cjs.map +1 -0
  260. package/dist/inspection/lifecycle.d.cts +4 -0
  261. package/dist/inspection/lifecycle.d.mts +4 -0
  262. package/dist/inspection/lifecycle.d.ts +4 -0
  263. package/dist/inspection/lifecycle.js +6 -0
  264. package/dist/inspection/lifecycle.js.map +1 -0
  265. package/dist/inspection/notes.cjs +40 -0
  266. package/dist/inspection/notes.cjs.map +1 -0
  267. package/dist/inspection/notes.d.cts +12 -0
  268. package/dist/inspection/notes.d.mts +12 -0
  269. package/dist/inspection/notes.d.ts +12 -0
  270. package/dist/inspection/notes.js +8 -0
  271. package/dist/inspection/notes.js.map +1 -0
  272. package/dist/inspection/overview.cjs +12 -15
  273. package/dist/inspection/overview.cjs.map +1 -1
  274. package/dist/inspection/overview.d.cts +8 -6
  275. package/dist/inspection/overview.d.mts +8 -6
  276. package/dist/inspection/overview.d.ts +8 -6
  277. package/dist/inspection/planned-attempt.cjs +45 -0
  278. package/dist/inspection/planned-attempt.cjs.map +1 -0
  279. package/dist/inspection/planned-attempt.d.cts +109 -0
  280. package/dist/inspection/planned-attempt.d.mts +109 -0
  281. package/dist/inspection/planned-attempt.d.ts +109 -0
  282. package/dist/inspection/planned-attempt.js +24 -0
  283. package/dist/inspection/planned-attempt.js.map +1 -0
  284. package/dist/inspection/project-result.cjs +5 -5
  285. package/dist/inspection/project-result.cjs.map +1 -1
  286. package/dist/inspection/project-result.d.cts +58 -57
  287. package/dist/inspection/project-result.d.mts +58 -57
  288. package/dist/inspection/project-result.d.ts +58 -57
  289. package/dist/inspection/project-result.js +4 -4
  290. package/dist/inspection/project.cjs +3 -3
  291. package/dist/inspection/project.cjs.map +1 -1
  292. package/dist/inspection/protocol-values.cjs +1 -1
  293. package/dist/inspection/protocol-values.cjs.map +1 -1
  294. package/dist/inspection/protocol-values.d.cts +1 -1
  295. package/dist/inspection/protocol-values.d.mts +1 -1
  296. package/dist/inspection/protocol-values.d.ts +1 -1
  297. package/dist/inspection/protocol.cjs +8 -8
  298. package/dist/inspection/protocol.cjs.map +1 -1
  299. package/dist/inspection/protocol.d.cts +237 -219
  300. package/dist/inspection/protocol.d.mts +237 -219
  301. package/dist/inspection/protocol.d.ts +237 -219
  302. package/dist/inspection/public.cjs +1 -5
  303. package/dist/inspection/public.cjs.map +1 -1
  304. package/dist/inspection/public.d.cts +1 -2
  305. package/dist/inspection/public.d.mts +1 -2
  306. package/dist/inspection/public.d.ts +1 -2
  307. package/dist/inspection/public.js +14 -20
  308. package/dist/inspection/public.mjs +166 -129
  309. package/dist/inspection/query.cjs +1 -1
  310. package/dist/inspection/query.cjs.map +1 -1
  311. package/dist/inspection/results.cjs +61 -52
  312. package/dist/inspection/results.cjs.map +1 -1
  313. package/dist/inspection/results.d.cts +157 -140
  314. package/dist/inspection/results.d.mts +157 -140
  315. package/dist/inspection/results.d.ts +157 -140
  316. package/dist/inspection/select.cjs +33 -28
  317. package/dist/inspection/select.cjs.map +1 -1
  318. package/dist/inspection/source.cjs +1 -1
  319. package/dist/inspection/source.cjs.map +1 -1
  320. package/dist/inspection/sources.cjs +2 -2
  321. package/dist/inspection/sources.cjs.map +1 -1
  322. package/dist/inspection/trace.cjs +9 -8
  323. package/dist/inspection/trace.cjs.map +1 -1
  324. package/dist/inspection/trace.d.cts +4 -4
  325. package/dist/inspection/trace.d.mts +4 -4
  326. package/dist/inspection/trace.d.ts +4 -4
  327. package/dist/loaders/index.cjs +7 -279
  328. package/dist/loaders/index.cjs.map +1 -1
  329. package/dist/loaders/index.d.cts +2 -95
  330. package/dist/loaders/index.d.mts +2 -95
  331. package/dist/loaders/index.d.ts +2 -95
  332. package/dist/loaders/index.js +10 -12
  333. package/dist/loaders/index.mjs +10 -12
  334. package/dist/loaders/runtime.cjs +283 -0
  335. package/dist/loaders/runtime.cjs.map +1 -0
  336. package/dist/loaders/runtime.d.cts +95 -0
  337. package/dist/loaders/runtime.d.mts +95 -0
  338. package/dist/loaders/runtime.d.ts +95 -0
  339. package/dist/loaders/runtime.js +16 -0
  340. package/dist/loaders/runtime.js.map +1 -0
  341. package/dist/migrations/judge-provider.md +6 -6
  342. package/dist/{model-slots.cjs → model-roles.cjs} +12 -12
  343. package/dist/{model-slots.cjs.map → model-roles.cjs.map} +1 -1
  344. package/dist/{model-slots.d.cts → model-roles.d.cts} +10 -10
  345. package/dist/{model-slots.d.mts → model-roles.d.mts} +10 -10
  346. package/dist/{model-slots.d.ts → model-roles.d.ts} +10 -10
  347. package/dist/model-roles.js +14 -0
  348. package/dist/model-roles.js.map +1 -0
  349. package/dist/o11y/adapter-usage-projection.cjs +9 -8
  350. package/dist/o11y/adapter-usage-projection.cjs.map +1 -1
  351. package/dist/o11y/adapter-usage-projection.d.cts +23 -15
  352. package/dist/o11y/adapter-usage-projection.d.mts +23 -15
  353. package/dist/o11y/adapter-usage-projection.d.ts +23 -15
  354. package/dist/o11y/cache-read.cjs +14 -14
  355. package/dist/o11y/cache-read.cjs.map +1 -1
  356. package/dist/o11y/cache-read.d.cts +5 -5
  357. package/dist/o11y/cache-read.d.mts +5 -5
  358. package/dist/o11y/cache-read.d.ts +5 -5
  359. package/dist/o11y/derive.cjs.map +1 -1
  360. package/dist/o11y/derive.d.cts +2 -2
  361. package/dist/o11y/derive.d.mts +2 -2
  362. package/dist/o11y/derive.d.ts +2 -2
  363. package/dist/o11y/eval-usage.cjs +9 -9
  364. package/dist/o11y/eval-usage.cjs.map +1 -1
  365. package/dist/o11y/eval-usage.d.cts +7 -7
  366. package/dist/o11y/eval-usage.d.mts +7 -7
  367. package/dist/o11y/eval-usage.d.ts +7 -7
  368. package/dist/o11y/parsers/bub.cjs +57 -81
  369. package/dist/o11y/parsers/bub.cjs.map +1 -1
  370. package/dist/o11y/parsers/index.cjs.map +1 -1
  371. package/dist/o11y/parsers/index.d.cts +2 -0
  372. package/dist/o11y/parsers/index.d.mts +2 -0
  373. package/dist/o11y/parsers/index.d.ts +2 -0
  374. package/dist/o11y/parsers/opencode.cjs +129 -217
  375. package/dist/o11y/parsers/opencode.cjs.map +1 -1
  376. package/dist/o11y/parsers/opencode.d.cts +2 -5
  377. package/dist/o11y/parsers/opencode.d.mts +2 -5
  378. package/dist/o11y/parsers/opencode.d.ts +2 -5
  379. package/dist/o11y/types.cjs.map +1 -1
  380. package/dist/o11y/types.d.cts +1 -1
  381. package/dist/o11y/types.d.mts +1 -1
  382. package/dist/o11y/types.d.ts +1 -1
  383. package/dist/plugin/contracts.cjs +170 -120
  384. package/dist/plugin/contracts.cjs.map +1 -1
  385. package/dist/plugin/contracts.d.cts +102 -90
  386. package/dist/plugin/contracts.d.mts +102 -90
  387. package/dist/plugin/contracts.d.ts +102 -90
  388. package/dist/plugin/contracts.js +16 -12
  389. package/dist/plugin/index.cjs.map +1 -1
  390. package/dist/plugin/index.d.cts +1 -1
  391. package/dist/plugin/index.d.mts +1 -1
  392. package/dist/plugin/index.d.ts +1 -1
  393. package/dist/plugin/link.cjs +69 -64
  394. package/dist/plugin/link.cjs.map +1 -1
  395. package/dist/plugin/link.d.cts +5 -3
  396. package/dist/plugin/link.d.mts +5 -3
  397. package/dist/plugin/link.d.ts +5 -3
  398. package/dist/plugin/link.js +12 -8
  399. package/dist/record/codec/seal-manifest.d.cts +3 -3
  400. package/dist/record/codec/seal-manifest.d.mts +3 -3
  401. package/dist/record/codec/seal-manifest.d.ts +3 -3
  402. package/dist/record/family/attempt-note/definition.cjs +12 -0
  403. package/dist/record/family/attempt-note/definition.cjs.map +1 -0
  404. package/dist/record/family/attempt-note/definition.d.cts +6 -0
  405. package/dist/record/family/attempt-note/definition.d.mts +6 -0
  406. package/dist/record/family/attempt-note/definition.d.ts +6 -0
  407. package/dist/record/family/attempt-note/definition.js +6 -0
  408. package/dist/record/family/attempt-note/definition.js.map +1 -0
  409. package/dist/record/family/attempt-note/persistence.cjs +10 -0
  410. package/dist/record/family/attempt-note/persistence.cjs.map +1 -0
  411. package/dist/record/family/attempt-note/persistence.d.cts +6 -0
  412. package/dist/record/family/attempt-note/persistence.d.mts +6 -0
  413. package/dist/record/family/attempt-note/persistence.d.ts +6 -0
  414. package/dist/record/family/attempt-note/persistence.js +6 -0
  415. package/dist/record/family/attempt-note/persistence.js.map +1 -0
  416. package/dist/record/family/attempt-note/schema.cjs +20 -0
  417. package/dist/record/family/attempt-note/schema.cjs.map +1 -0
  418. package/dist/record/family/attempt-note/schema.d.cts +21 -0
  419. package/dist/record/family/attempt-note/schema.d.mts +21 -0
  420. package/dist/record/family/attempt-note/schema.d.ts +21 -0
  421. package/dist/record/family/attempt-note/schema.js +10 -0
  422. package/dist/record/family/attempt-note/schema.js.map +1 -0
  423. package/dist/record/family/catalog.cjs +32 -29
  424. package/dist/record/family/catalog.cjs.map +1 -1
  425. package/dist/record/family/catalog.d.cts +7 -2
  426. package/dist/record/family/catalog.d.mts +7 -2
  427. package/dist/record/family/catalog.d.ts +7 -2
  428. package/dist/record/family/current.cjs +48 -45
  429. package/dist/record/family/current.cjs.map +1 -1
  430. package/dist/record/family/current.d.cts +15 -0
  431. package/dist/record/family/current.d.mts +15 -0
  432. package/dist/record/family/current.d.ts +15 -0
  433. package/dist/record/model/index.js +66 -64
  434. package/dist/record/model/run-context.cjs +9 -3
  435. package/dist/record/model/run-context.cjs.map +1 -1
  436. package/dist/record/model/run-context.d.cts +9 -2
  437. package/dist/record/model/run-context.d.mts +9 -2
  438. package/dist/record/model/run-context.d.ts +9 -2
  439. package/dist/record/model/run-context.js +8 -6
  440. package/dist/record/model/seal-manifest.d.cts +1 -1
  441. package/dist/record/model/seal-manifest.d.mts +1 -1
  442. package/dist/record/model/seal-manifest.d.ts +1 -1
  443. package/dist/run/cli/contribution.cjs +6 -32
  444. package/dist/run/cli/contribution.cjs.map +1 -1
  445. package/dist/run/host/runtime.cjs +1 -1
  446. package/dist/run/host/runtime.cjs.map +1 -1
  447. package/dist/run/storage/sqlite.cjs +7 -7
  448. package/dist/run/storage/sqlite.cjs.map +1 -1
  449. package/dist/runner/adapter-usage.cjs +5 -3
  450. package/dist/runner/adapter-usage.cjs.map +1 -1
  451. package/dist/runner/adapter-usage.d.cts +2 -2
  452. package/dist/runner/adapter-usage.d.mts +2 -2
  453. package/dist/runner/adapter-usage.d.ts +2 -2
  454. package/dist/runner/adoption.cjs +9 -12
  455. package/dist/runner/adoption.cjs.map +1 -1
  456. package/dist/runner/attempt-notes.cjs +8 -0
  457. package/dist/runner/attempt-notes.cjs.map +1 -0
  458. package/dist/runner/attempt-notes.d.cts +4 -0
  459. package/dist/runner/attempt-notes.d.mts +4 -0
  460. package/dist/runner/attempt-notes.d.ts +4 -0
  461. package/dist/runner/attempt-notes.js +8 -0
  462. package/dist/runner/attempt-notes.js.map +1 -0
  463. package/dist/runner/attempt.cjs +61 -73
  464. package/dist/runner/attempt.cjs.map +1 -1
  465. package/dist/runner/attempt.d.cts +3 -3
  466. package/dist/runner/attempt.d.mts +3 -3
  467. package/dist/runner/attempt.d.ts +3 -3
  468. package/dist/runner/command-plan.cjs +21 -26
  469. package/dist/runner/command-plan.cjs.map +1 -1
  470. package/dist/runner/command-plan.d.cts +4 -4
  471. package/dist/runner/command-plan.d.mts +4 -4
  472. package/dist/runner/command-plan.d.ts +4 -4
  473. package/dist/runner/command-plan.js +4 -4
  474. package/dist/runner/config-identity.cjs.map +1 -1
  475. package/dist/runner/config-identity.d.cts +2 -2
  476. package/dist/runner/config-identity.d.mts +2 -2
  477. package/dist/runner/config-identity.d.ts +2 -2
  478. package/dist/runner/discover.cjs +6 -6
  479. package/dist/runner/discover.cjs.map +1 -1
  480. package/dist/runner/eval-selection.cjs +2 -2
  481. package/dist/runner/eval-selection.cjs.map +1 -1
  482. package/dist/runner/eval-selection.d.cts +2 -2
  483. package/dist/runner/eval-selection.d.mts +2 -2
  484. package/dist/runner/eval-selection.d.ts +2 -2
  485. package/dist/runner/feedback/human.cjs +1 -1
  486. package/dist/runner/feedback/human.cjs.map +1 -1
  487. package/dist/runner/feedback/json.cjs +4 -2
  488. package/dist/runner/feedback/json.cjs.map +1 -1
  489. package/dist/runner/feedback/json.d.cts +1 -1
  490. package/dist/runner/feedback/json.d.mts +1 -1
  491. package/dist/runner/feedback/json.d.ts +1 -1
  492. package/dist/runner/feedback/sink.cjs +1 -1
  493. package/dist/runner/feedback/sink.cjs.map +1 -1
  494. package/dist/runner/feedback/sink.d.cts +1 -1
  495. package/dist/runner/feedback/sink.d.mts +1 -1
  496. package/dist/runner/feedback/sink.d.ts +1 -1
  497. package/dist/runner/fingerprint.cjs +1 -1
  498. package/dist/runner/fingerprint.cjs.map +1 -1
  499. package/dist/runner/project-target.cjs.map +1 -1
  500. package/dist/runner/project-target.d.cts +2 -2
  501. package/dist/runner/project-target.d.mts +2 -2
  502. package/dist/runner/project-target.d.ts +2 -2
  503. package/dist/runner/record/attachments.cjs +2 -2
  504. package/dist/runner/record/attachments.cjs.map +1 -1
  505. package/dist/runner/record/planning.cjs +8 -2
  506. package/dist/runner/record/planning.cjs.map +1 -1
  507. package/dist/runner/record.cjs +2 -0
  508. package/dist/runner/record.cjs.map +1 -1
  509. package/dist/runner/report.cjs +3 -3
  510. package/dist/runner/report.cjs.map +1 -1
  511. package/dist/runner/report.d.cts +1 -1
  512. package/dist/runner/report.d.mts +1 -1
  513. package/dist/runner/report.d.ts +1 -1
  514. package/dist/runner/reuse-plan.cjs +2 -2
  515. package/dist/runner/reuse-plan.cjs.map +1 -1
  516. package/dist/runner/run.cjs +10 -45
  517. package/dist/runner/run.cjs.map +1 -1
  518. package/dist/runner/sandbox-pool.cjs +1 -2
  519. package/dist/runner/sandbox-pool.cjs.map +1 -1
  520. package/dist/runner/setup-prefix-preparation.cjs +1 -1
  521. package/dist/runner/setup-prefix-preparation.cjs.map +1 -1
  522. package/dist/runner/teardown-registry.cjs +2 -2
  523. package/dist/runner/teardown-registry.cjs.map +1 -1
  524. package/dist/runner/teardown-registry.d.cts +1 -1
  525. package/dist/runner/teardown-registry.d.mts +1 -1
  526. package/dist/runner/teardown-registry.d.ts +1 -1
  527. package/dist/runner/types.cjs +4 -4
  528. package/dist/runner/types.cjs.map +1 -1
  529. package/dist/runner/types.d.cts +64 -93
  530. package/dist/runner/types.d.mts +64 -93
  531. package/dist/runner/types.d.ts +64 -93
  532. package/dist/runner/types.js +2 -2
  533. package/dist/sandbox/action.cjs +1 -1
  534. package/dist/sandbox/action.cjs.map +1 -1
  535. package/dist/sandbox/cli/contribution.cjs +17 -14
  536. package/dist/sandbox/cli/contribution.cjs.map +1 -1
  537. package/dist/sandbox/cli/contribution.d.cts +1 -1
  538. package/dist/sandbox/cli/contribution.d.mts +1 -1
  539. package/dist/sandbox/cli/contribution.d.ts +1 -1
  540. package/dist/sandbox/commands.cjs +1 -1
  541. package/dist/sandbox/commands.cjs.map +1 -1
  542. package/dist/sandbox/commands.d.cts +1 -1
  543. package/dist/sandbox/commands.d.mts +1 -1
  544. package/dist/sandbox/commands.d.ts +1 -1
  545. package/dist/sandbox/compose.cjs +2 -2
  546. package/dist/sandbox/compose.cjs.map +1 -1
  547. package/dist/sandbox/docker-profile/registry.cjs +5 -9
  548. package/dist/sandbox/docker-profile/registry.cjs.map +1 -1
  549. package/dist/sandbox/docker-profile/registry.d.cts +0 -3
  550. package/dist/sandbox/docker-profile/registry.d.mts +0 -3
  551. package/dist/sandbox/docker-profile/registry.d.ts +0 -3
  552. package/dist/sandbox/docker-profile/registry.js +6 -12
  553. package/dist/sandbox/docker-profile/runtime.cjs +1 -1
  554. package/dist/sandbox/docker-profile/runtime.cjs.map +1 -1
  555. package/dist/sandbox/docker-profile/schema.cjs +12 -16
  556. package/dist/sandbox/docker-profile/schema.cjs.map +1 -1
  557. package/dist/sandbox/docker-profile/schema.d.cts +2 -6
  558. package/dist/sandbox/docker-profile/schema.d.mts +2 -6
  559. package/dist/sandbox/docker-profile/schema.d.ts +2 -6
  560. package/dist/sandbox/docker-profile/schema.js +24 -32
  561. package/dist/sandbox/incus.cjs +2 -2
  562. package/dist/sandbox/incus.cjs.map +1 -1
  563. package/dist/sandbox/index.cjs +4 -35
  564. package/dist/sandbox/index.cjs.map +1 -1
  565. package/dist/sandbox/index.d.cts +4 -8
  566. package/dist/sandbox/index.d.mts +4 -8
  567. package/dist/sandbox/index.d.ts +4 -8
  568. package/dist/sandbox/index.js +116 -172
  569. package/dist/sandbox/index.mjs +116 -172
  570. package/dist/sandbox/layer.cjs +3 -3
  571. package/dist/sandbox/layer.cjs.map +1 -1
  572. package/dist/sandbox/link.cjs +5 -0
  573. package/dist/sandbox/link.cjs.map +1 -1
  574. package/dist/sandbox/link.d.cts +3 -0
  575. package/dist/sandbox/link.d.mts +3 -0
  576. package/dist/sandbox/link.d.ts +3 -0
  577. package/dist/sandbox/runtime.cjs +9 -4
  578. package/dist/sandbox/runtime.cjs.map +1 -1
  579. package/dist/shared/failure-class.cjs +5 -5
  580. package/dist/shared/failure-class.cjs.map +1 -1
  581. package/dist/shared/failure-class.d.cts +4 -10
  582. package/dist/shared/failure-class.d.mts +4 -10
  583. package/dist/shared/failure-class.d.ts +4 -10
  584. package/dist/shared/types.cjs.map +1 -1
  585. package/dist/shared/types.d.cts +1 -1
  586. package/dist/shared/types.d.mts +1 -1
  587. package/dist/shared/types.d.ts +1 -1
  588. package/dist/show/contribution.cjs +17 -2
  589. package/dist/show/contribution.cjs.map +1 -1
  590. package/dist/show/contribution.d.cts +14 -0
  591. package/dist/show/contribution.d.mts +14 -0
  592. package/dist/show/contribution.d.ts +14 -0
  593. package/dist/show/model.cjs +8 -5
  594. package/dist/show/model.cjs.map +1 -1
  595. package/dist/show/model.d.cts +11 -8
  596. package/dist/show/model.d.mts +11 -8
  597. package/dist/show/model.d.ts +11 -8
  598. package/dist/show/render.cjs +34 -22
  599. package/dist/show/render.cjs.map +1 -1
  600. package/dist/sources/projector.cjs +1 -1
  601. package/dist/sources/projector.cjs.map +1 -1
  602. package/dist/types.cjs +1 -1
  603. package/dist/types.cjs.map +1 -1
  604. package/dist/types.d.cts +1 -1
  605. package/dist/types.d.mts +1 -1
  606. package/dist/types.d.ts +1 -1
  607. package/dist/types.js +2 -2
  608. package/dist/view/app-dist/.vite/manifest.json +2 -2
  609. package/dist/view/app-dist/assets/{index-B3ijZRph.js → index-CxrOUvHC.js} +17 -17
  610. package/dist/view/app-dist/assets/{quality-cost-scatter-B--DfJ9s.js → quality-cost-scatter-B6Aiss7x.js} +1 -1
  611. package/dist/view/app-dist/index.html +1 -1
  612. package/dist/view/cli/contribution.cjs +1 -1
  613. package/dist/view/cli/contribution.cjs.map +1 -1
  614. package/dist/view/function-runtime.mjs +318 -121
  615. package/dist/view/http-protocol.d.cts +1 -1
  616. package/dist/view/http-protocol.d.mts +1 -1
  617. package/dist/view/http-protocol.d.ts +1 -1
  618. package/dist/view/inspection-host.cjs +2 -2
  619. package/dist/view/inspection-host.cjs.map +1 -1
  620. package/dist/view/inspection-host.d.cts +349 -331
  621. package/dist/view/inspection-host.d.mts +349 -331
  622. package/dist/view/inspection-host.d.ts +349 -331
  623. package/docs-site/zh/examples/integrations/ai-sdk-v7.mdx +6 -6
  624. package/docs-site/zh/examples/integrations/claude-sdk.mdx +5 -5
  625. package/docs-site/zh/examples/integrations/codex-sdk.mdx +4 -4
  626. package/docs-site/zh/examples/integrations/langgraph.mdx +4 -4
  627. package/docs-site/zh/examples/integrations/pi-sdk.mdx +5 -5
  628. package/docs-site/zh/explanation/adapter.mdx +6 -6
  629. package/docs-site/zh/explanation/assert.mdx +7 -7
  630. package/docs-site/zh/explanation/drive.mdx +4 -4
  631. package/docs-site/zh/explanation/hitl.mdx +2 -2
  632. package/docs-site/zh/explanation/judge.mdx +2 -2
  633. package/docs-site/zh/introduction.mdx +2 -2
  634. package/docs-site/zh/reference/builtin-agents.mdx +46 -49
  635. package/docs-site/zh/reference/cli.mdx +16 -14
  636. package/docs-site/zh/reference/define-agent.mdx +19 -19
  637. package/docs-site/zh/reference/define-config.mdx +7 -15
  638. package/docs-site/zh/reference/define-eval.mdx +20 -14
  639. package/docs-site/zh/reference/define-experiment.mdx +18 -39
  640. package/docs-site/zh/reference/events.mdx +1 -1
  641. package/docs-site/zh/reference/expect.mdx +21 -0
  642. package/docs-site/zh/reference/official-adapters.mdx +12 -5
  643. package/docs-site/zh/troubleshooting/debugging.mdx +2 -2
  644. package/docs-site/zh/troubleshooting/recover-after-kill.mdx +1 -1
  645. package/docs-site/zh/tutorials/agent-onboarding.mdx +2 -2
  646. package/docs-site/zh/tutorials/authoring.mdx +2 -2
  647. package/docs-site/zh/tutorials/compare-runs.mdx +1 -1
  648. package/docs-site/zh/tutorials/concurrency.mdx +8 -8
  649. package/docs-site/zh/tutorials/configuration.mdx +5 -5
  650. package/docs-site/zh/tutorials/control-run-cost.mdx +19 -19
  651. package/docs-site/zh/tutorials/eval-groups.mdx +1 -1
  652. package/docs-site/zh/tutorials/evaluation-kinds.mdx +5 -5
  653. package/docs-site/zh/tutorials/experiment-services.mdx +32 -32
  654. package/docs-site/zh/tutorials/handle-execution-failures.mdx +2 -28
  655. package/docs-site/zh/tutorials/plugins.mdx +49 -143
  656. package/docs-site/zh/tutorials/sandbox-agent.mdx +1 -1
  657. package/docs-site/zh/tutorials/sandbox-reuse.mdx +7 -7
  658. package/docs-site/zh/tutorials/upgrade-0-18.mdx +1 -1
  659. package/docs-site/zh/tutorials/upgrade-0-19.mdx +121 -0
  660. package/docs-site/zh/tutorials/upgrade-0-20.mdx +12 -0
  661. package/docs-site/zh/tutorials/verify-judge.mdx +2 -2
  662. package/docs-site/zh/tutorials/viewing-results.mdx +2 -2
  663. package/docs-site/zh/tutorials/write-experiment.mdx +1 -1
  664. package/docs-site/zh/tutorials/write-send.mdx +13 -13
  665. package/package.json +1 -1
  666. package/dist/agents/effect-runtime.cjs.map +0 -1
  667. package/dist/agents/effect-runtime.d.cts +0 -29
  668. package/dist/agents/effect-runtime.d.mts +0 -29
  669. package/dist/agents/effect-runtime.d.ts +0 -29
  670. package/dist/agents/effect-runtime.js +0 -16
  671. package/dist/agents/effect-runtime.js.map +0 -1
  672. package/dist/agents/session-slot.cjs.map +0 -1
  673. package/dist/agents/session-slot.d.cts +0 -12
  674. package/dist/agents/session-slot.d.mts +0 -12
  675. package/dist/agents/session-slot.d.ts +0 -12
  676. package/dist/agents/session-slot.js +0 -6
  677. package/dist/agents/session-slot.js.map +0 -1
  678. package/dist/model-slots.js +0 -14
  679. package/dist/model-slots.js.map +0 -1
@@ -1,21 +1,21 @@
1
1
  import { type CacheReadReport } from "./cache-read.cjs";
2
- import type { ResolvedModelSlots } from "../model-slots.cjs";
2
+ import type { ResolvedModelRoles } from "../model-roles.cjs";
3
3
  import type { NumericMaterial } from "../assertions/match.cjs";
4
4
  import type { ResolvedEvidenceCoverage } from "../assertions/coverage.cjs";
5
5
  import type { PriceOverride, Usage } from "../types.cjs";
6
6
  import type { ReadableAdapterUsageAttachment } from "../record/family/adapter-usage/schema.cjs";
7
7
  /** Frozen cache report with author-facing selection by Experiment model purpose. */
8
- export interface EvalCacheRead<ModelSlot extends string = string> extends CacheReadReport {
9
- /** Omit the slot for the total. An undeclared slot throws; missing observations remain unavailable. */
10
- rate(modelSlot?: ModelSlot): NumericMaterial;
8
+ export interface EvalCacheRead<ModelRole extends string = string> extends CacheReadReport {
9
+ /** Omit the role for the total. An undeclared role throws; missing observations remain unavailable. */
10
+ rate(role?: ModelRole): NumericMaterial<"ratio">;
11
11
  }
12
12
  /** Internal source-owned shape; package-root exposure belongs to the author facade. */
13
- export interface EvalUsage<ModelSlot extends string = string> {
13
+ export interface EvalUsage<ModelRole extends string = string> {
14
14
  readonly source: "agent" | "adapter" | "unavailable";
15
15
  readonly scope: "turn" | "session" | "attempt";
16
16
  readonly basis: "reported-sends" | "recorded-calls" | "unbound";
17
17
  readonly cut: "call-time";
18
- readonly cacheRead: EvalCacheRead<ModelSlot>;
18
+ readonly cacheRead: EvalCacheRead<ModelRole>;
19
19
  readonly inputTokens: NumericMaterial;
20
20
  readonly inputTotalTokens: NumericMaterial;
21
21
  readonly outputTokens: NumericMaterial;
@@ -45,7 +45,7 @@ export interface AgentUsageContribution {
45
45
  readonly usage: Readonly<Usage> | null;
46
46
  readonly coverage: ResolvedEvidenceCoverage["usage"];
47
47
  }
48
- export declare function projectAdapterEvalUsage(usage: ReadableAdapterUsageAttachment, models?: ResolvedModelSlots): EvalUsage;
48
+ export declare function projectAdapterEvalUsage(usage: ReadableAdapterUsageAttachment, models?: ResolvedModelRoles): EvalUsage;
49
49
  /** The receiver selects scope membership before calling this pure projection. */
50
50
  export declare function projectAgentEvalUsage(input: {
51
51
  contributions: readonly AgentUsageContribution[];
@@ -1,21 +1,21 @@
1
1
  import { type CacheReadReport } from "./cache-read.mjs";
2
- import type { ResolvedModelSlots } from "../model-slots.mjs";
2
+ import type { ResolvedModelRoles } from "../model-roles.mjs";
3
3
  import type { NumericMaterial } from "../assertions/match.mjs";
4
4
  import type { ResolvedEvidenceCoverage } from "../assertions/coverage.mjs";
5
5
  import type { PriceOverride, Usage } from "../types.mjs";
6
6
  import type { ReadableAdapterUsageAttachment } from "../record/family/adapter-usage/schema.mjs";
7
7
  /** Frozen cache report with author-facing selection by Experiment model purpose. */
8
- export interface EvalCacheRead<ModelSlot extends string = string> extends CacheReadReport {
9
- /** Omit the slot for the total. An undeclared slot throws; missing observations remain unavailable. */
10
- rate(modelSlot?: ModelSlot): NumericMaterial;
8
+ export interface EvalCacheRead<ModelRole extends string = string> extends CacheReadReport {
9
+ /** Omit the role for the total. An undeclared role throws; missing observations remain unavailable. */
10
+ rate(role?: ModelRole): NumericMaterial<"ratio">;
11
11
  }
12
12
  /** Internal source-owned shape; package-root exposure belongs to the author facade. */
13
- export interface EvalUsage<ModelSlot extends string = string> {
13
+ export interface EvalUsage<ModelRole extends string = string> {
14
14
  readonly source: "agent" | "adapter" | "unavailable";
15
15
  readonly scope: "turn" | "session" | "attempt";
16
16
  readonly basis: "reported-sends" | "recorded-calls" | "unbound";
17
17
  readonly cut: "call-time";
18
- readonly cacheRead: EvalCacheRead<ModelSlot>;
18
+ readonly cacheRead: EvalCacheRead<ModelRole>;
19
19
  readonly inputTokens: NumericMaterial;
20
20
  readonly inputTotalTokens: NumericMaterial;
21
21
  readonly outputTokens: NumericMaterial;
@@ -45,7 +45,7 @@ export interface AgentUsageContribution {
45
45
  readonly usage: Readonly<Usage> | null;
46
46
  readonly coverage: ResolvedEvidenceCoverage["usage"];
47
47
  }
48
- export declare function projectAdapterEvalUsage(usage: ReadableAdapterUsageAttachment, models?: ResolvedModelSlots): EvalUsage;
48
+ export declare function projectAdapterEvalUsage(usage: ReadableAdapterUsageAttachment, models?: ResolvedModelRoles): EvalUsage;
49
49
  /** The receiver selects scope membership before calling this pure projection. */
50
50
  export declare function projectAgentEvalUsage(input: {
51
51
  contributions: readonly AgentUsageContribution[];
@@ -1,21 +1,21 @@
1
1
  import { type CacheReadReport } from "./cache-read.js";
2
- import type { ResolvedModelSlots } from "../model-slots.js";
2
+ import type { ResolvedModelRoles } from "../model-roles.js";
3
3
  import type { NumericMaterial } from "../assertions/match.js";
4
4
  import type { ResolvedEvidenceCoverage } from "../assertions/coverage.js";
5
5
  import type { PriceOverride, Usage } from "../types.js";
6
6
  import type { ReadableAdapterUsageAttachment } from "../record/family/adapter-usage/schema.js";
7
7
  /** Frozen cache report with author-facing selection by Experiment model purpose. */
8
- export interface EvalCacheRead<ModelSlot extends string = string> extends CacheReadReport {
9
- /** Omit the slot for the total. An undeclared slot throws; missing observations remain unavailable. */
10
- rate(modelSlot?: ModelSlot): NumericMaterial;
8
+ export interface EvalCacheRead<ModelRole extends string = string> extends CacheReadReport {
9
+ /** Omit the role for the total. An undeclared role throws; missing observations remain unavailable. */
10
+ rate(role?: ModelRole): NumericMaterial<"ratio">;
11
11
  }
12
12
  /** Internal source-owned shape; package-root exposure belongs to the author facade. */
13
- export interface EvalUsage<ModelSlot extends string = string> {
13
+ export interface EvalUsage<ModelRole extends string = string> {
14
14
  readonly source: "agent" | "adapter" | "unavailable";
15
15
  readonly scope: "turn" | "session" | "attempt";
16
16
  readonly basis: "reported-sends" | "recorded-calls" | "unbound";
17
17
  readonly cut: "call-time";
18
- readonly cacheRead: EvalCacheRead<ModelSlot>;
18
+ readonly cacheRead: EvalCacheRead<ModelRole>;
19
19
  readonly inputTokens: NumericMaterial;
20
20
  readonly inputTotalTokens: NumericMaterial;
21
21
  readonly outputTokens: NumericMaterial;
@@ -45,7 +45,7 @@ export interface AgentUsageContribution {
45
45
  readonly usage: Readonly<Usage> | null;
46
46
  readonly coverage: ResolvedEvidenceCoverage["usage"];
47
47
  }
48
- export declare function projectAdapterEvalUsage(usage: ReadableAdapterUsageAttachment, models?: ResolvedModelSlots): EvalUsage;
48
+ export declare function projectAdapterEvalUsage(usage: ReadableAdapterUsageAttachment, models?: ResolvedModelRoles): EvalUsage;
49
49
  /** The receiver selects scope membership before calling this pure projection. */
50
50
  export declare function projectAgentEvalUsage(input: {
51
51
  contributions: readonly AgentUsageContribution[];
@@ -62,10 +62,8 @@ function extractText(content) {
62
62
  if (Array.isArray(content)) {
63
63
  const parts = [];
64
64
  for (const b of content) {
65
- if (typeof b === "string")
66
- parts.push(b);
67
- else {
68
- const t = get(b, "text") ?? get(b, "content");
65
+ if (get(b, "type") === "text") {
66
+ const t = get(b, "text");
69
67
  if (typeof t === "string")
70
68
  parts.push(t);
71
69
  }
@@ -84,24 +82,22 @@ function parseBubTranscript(raw) {
84
82
  let requests = 0;
85
83
  let compactions = 0;
86
84
  let parseSuccess = true;
85
+ const unrecognizedEvents = Object.create(null);
86
+ const unrecognized = (type) => {
87
+ unrecognizedEvents[type] = (unrecognizedEvents[type] ?? 0) + 1;
88
+ };
87
89
  if (!raw || !raw.trim()) {
88
90
  return { events, usage: {}, compactions: 0, parseSuccess: true };
89
91
  }
90
92
  // tape 的 tool_result 与上一条 tool_call 按位对齐;记下上一批 callId。
91
93
  let lastCallIds = [];
92
- // 无显式 id 的兜底配对。
93
- const pendingCallIds = [];
94
- let synth = 0;
95
- const nextSynthId = () => `bub_${++synth}`;
96
- // 从 event/run 的 data.usage(或 legacy 顶层 usage)累加用量。
94
+ // 从 event/run 的 data.usage 累加用量。
97
95
  const addUsage = (usage) => {
98
96
  if (!usage || typeof usage !== "object")
99
97
  return;
100
- const rawInput = num(usage, "input_tokens", "prompt_tokens", "inputTokens");
101
- const output = num(usage, "output_tokens", "completion_tokens", "outputTokens");
102
- let cache = num(usage, "cached_input_tokens", "cache_read_input_tokens", "cacheReadTokens");
103
- if (cache === 0)
104
- cache = num(get(usage, "prompt_tokens_details"), "cached_tokens");
98
+ const rawInput = num(usage, "prompt_tokens");
99
+ const output = num(usage, "completion_tokens");
100
+ const cache = num(get(usage, "prompt_tokens_details"), "cached_tokens");
105
101
  const cost = optionalNum(usage, "cost");
106
102
  if (rawInput === 0 && output === 0 && cache === 0 && cost === undefined)
107
103
  return;
@@ -117,10 +113,7 @@ function parseBubTranscript(raw) {
117
113
  }
118
114
  requests += 1;
119
115
  };
120
- const emitCall = (originalName, input, explicitId) => {
121
- const callId = explicitId != null ? String(explicitId) : nextSynthId();
122
- if (explicitId == null)
123
- pendingCallIds.push(callId);
116
+ const emitCall = (originalName, input, callId) => {
124
117
  events.push({
125
118
  type: "operation.started",
126
119
  operationId: callId,
@@ -134,8 +127,7 @@ function parseBubTranscript(raw) {
134
127
  });
135
128
  return callId;
136
129
  };
137
- const emitResult = (output, success, explicitId) => {
138
- const callId = explicitId != null ? String(explicitId) : pendingCallIds.shift() ?? nextSynthId();
130
+ const emitResult = (output, success, callId) => {
139
131
  events.push({
140
132
  type: "operation.finished",
141
133
  operationId: callId,
@@ -159,38 +151,16 @@ function parseBubTranscript(raw) {
159
151
  try {
160
152
  const type = get(entry, "type");
161
153
  const kind = get(entry, "kind");
162
- // ── legacy: 顶层 type ──
163
- if (typeof type === "string") {
164
- addUsage(get(entry, "usage"));
165
- if (type === "message") {
166
- const role = get(entry, "role") === "user" ? "user" : "assistant";
167
- const text = extractText(get(entry, "content") ?? get(entry, "text"));
168
- if (text)
169
- events.push({ type: "message", role, text });
170
- }
171
- else if (type === "tool_call") {
172
- const name = String(get(entry, "tool_name") ?? get(entry, "name") ?? get(entry, "tool") ?? "unknown");
173
- emitCall(name, coerceArgs(get(entry, "args") ?? get(entry, "input")), get(entry, "call_id") ?? get(entry, "id"));
174
- }
175
- else if (type === "tool_result") {
176
- emitResult(get(entry, "result") ?? get(entry, "output") ?? get(entry, "content"), get(entry, "success") !== false && !get(entry, "error"), get(entry, "call_id") ?? get(entry, "tool_call_id") ?? get(entry, "id"));
177
- }
178
- else if (type === "thinking" || type === "reasoning") {
179
- const text = extractText(get(entry, "content") ?? get(entry, "text"));
180
- if (text)
181
- events.push({ type: "thinking", text });
182
- }
183
- else if (type === "error") {
184
- events.push({ type: "error", message: String(get(entry, "message") ?? get(entry, "error") ?? "error") });
185
- }
186
- continue;
187
- }
188
154
  // ── republic tape: kind + payload ──
189
155
  if (typeof kind === "string") {
190
156
  const payload = get(entry, "payload");
191
157
  if (kind === "message") {
192
- const role = get(payload, "role") === "user" ? "user" : "assistant";
193
- const text = extractText(get(payload, "content") ?? get(payload, "text"));
158
+ const role = get(payload, "role");
159
+ if (role !== "user" && role !== "assistant") {
160
+ parseSuccess = false;
161
+ continue;
162
+ }
163
+ const text = extractText(get(payload, "content"));
194
164
  if (text)
195
165
  events.push({ type: "message", role, text });
196
166
  }
@@ -202,30 +172,45 @@ function parseBubTranscript(raw) {
202
172
  if (accompanying)
203
173
  events.push({ type: "message", role: "assistant", text: accompanying });
204
174
  const calls = get(payload, "calls");
205
- const list = Array.isArray(calls) ? calls : [payload];
206
- lastCallIds = [];
207
- for (const call of list) {
208
- const fn = get(call, "function") ?? call;
209
- const name = String(get(fn, "name") ?? get(call, "name") ?? "unknown");
210
- const id = emitCall(name, coerceArgs(get(fn, "arguments") ?? get(call, "args") ?? get(call, "input")), get(call, "id") ?? get(call, "call_id"));
211
- lastCallIds.push(id);
212
- }
175
+ const list = Array.isArray(calls) ? calls : [];
176
+ if (!Array.isArray(calls))
177
+ parseSuccess = false;
178
+ lastCallIds = list.map((call) => {
179
+ const fn = get(call, "function");
180
+ const name = get(fn, "name");
181
+ const id = get(call, "id");
182
+ if (typeof name !== "string" || typeof id !== "string") {
183
+ parseSuccess = false;
184
+ return undefined;
185
+ }
186
+ return emitCall(name, coerceArgs(get(fn, "arguments")), id);
187
+ });
213
188
  }
214
189
  else if (kind === "tool_result") {
215
190
  const results = get(payload, "results");
216
- const list = Array.isArray(results) ? results : [get(payload, "result") ?? payload];
191
+ const list = Array.isArray(results) ? results : [];
192
+ if (!Array.isArray(results))
193
+ parseSuccess = false;
217
194
  // republic:results 与上一条 tool_call.calls 按位对齐。
218
195
  list.forEach((r, i) => {
219
196
  const isError = typeof r === "object" && r !== null && "error" in r;
220
- const explicitId = get(r, "tool_call_id") ?? get(r, "id") ?? lastCallIds[i];
221
- emitResult(get(r, "output") ?? get(r, "result") ?? get(r, "content") ?? r, !isError, explicitId);
197
+ const explicitId = lastCallIds[i];
198
+ if (explicitId === undefined) {
199
+ parseSuccess = false;
200
+ return;
201
+ }
202
+ emitResult(r, !isError, explicitId);
222
203
  });
223
204
  }
224
205
  else if (kind === "event") {
206
+ const name = get(payload, "name");
207
+ if (typeof name !== "string" || !["run", "handoff", "loop.start", "loop.step.start", "loop.step"].includes(name)) {
208
+ unrecognized(`event:${String(name ?? "<missing-name>")}`);
209
+ continue;
210
+ }
225
211
  const data = get(payload, "data");
226
- // 用量:run 事件首选 data.usage;但新版 bub.tape 不一定每轮都发 run/usage,
227
- // 所以任何 event 上挂的 usage 也兜底累加(addUsage 自带去重式全零跳过)。
228
- addUsage(get(data, "usage"));
212
+ if (name === "run")
213
+ addUsage(get(data, "usage"));
229
214
  // 仅在「真失败」时记 error:有 error 字段,或 status 命中失败词。
230
215
  // loop.step 这类控制事件 status=="continue"/"running" 不是错误 —— 别再当 error 刷屏。
231
216
  const status = get(data, "status");
@@ -245,27 +230,18 @@ function parseBubTranscript(raw) {
245
230
  }
246
231
  }
247
232
  else if (kind === "error") {
248
- events.push({ type: "error", message: String(get(payload, "message") ?? get(payload, "kind") ?? "error") });
233
+ const message = get(payload, "message");
234
+ if (typeof message === "string")
235
+ events.push({ type: "error", message });
236
+ else
237
+ parseSuccess = false;
249
238
  }
250
- continue;
251
- }
252
- // ── 通用兜底:既无 type 也无 kind ──
253
- addUsage(get(entry, "usage"));
254
- const role = get(entry, "role");
255
- const name = get(entry, "tool") ?? get(entry, "name");
256
- if (role === "assistant" || role === "user") {
257
- const text = extractText(get(entry, "content") ?? get(entry, "text"));
258
- if (text)
259
- events.push({ type: "message", role, text });
260
- }
261
- else if (typeof name === "string") {
262
- if (get(entry, "result") !== undefined || get(entry, "output") !== undefined) {
263
- emitResult(get(entry, "result") ?? get(entry, "output"), !get(entry, "error"), get(entry, "call_id") ?? get(entry, "id"));
264
- }
265
- else {
266
- emitCall(name, coerceArgs(get(entry, "args") ?? get(entry, "arguments") ?? get(entry, "input")), get(entry, "call_id") ?? get(entry, "id"));
239
+ else if (kind !== "system") {
240
+ unrecognized(kind);
267
241
  }
242
+ continue;
268
243
  }
244
+ unrecognized(typeof type === "string" ? `type:${type}` : "<missing-kind>");
269
245
  }
270
246
  catch {
271
247
  parseSuccess = false;
@@ -280,7 +256,7 @@ function parseBubTranscript(raw) {
280
256
  usage.requests = requests;
281
257
  if (hasObservedCostUSD)
282
258
  usage.costUSD = costUSD;
283
- return { events, usage, compactions, parseSuccess };
259
+ return { events, usage, compactions, parseSuccess, unrecognizedEvents };
284
260
  }
285
261
  /** 便捷形态:只要 StreamEvent[]。 */
286
262
  function parseBub(raw) {
@@ -1 +1 @@
1
- {"version":3,"file":"bub.js","sourceRoot":"","sources":["bub.ts"],"names":[],"mappings":"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","sourcesContent":["// Bub(republic tape)transcript 解析器,同时充当「通用 JSONL」兜底解析器。\n//\n// 真实 tape 格式(~/.bub/tapes/<md5(ws)__md5(sess)>.jsonl,按 id 升序逐行):\n// - kind=message payload={role, content} → 对话\n// - kind=tool_call payload={calls:[{id,function:{name,arguments}}]}\n// - kind=tool_result payload={results:[...]} ← 与上一条 tool_call.calls 按位对齐\n// - kind=event payload={name, data} name==\"run\" → data.usage 是该次模型调用用量\n// - kind=anchor payload={name, state:{summary?}} name!=\"session/start\" = tape.handoff(压缩检查点)\n// - kind=system/error\n// 用量路径(已对真实 tape 校验):payload.data.usage.{prompt_tokens,completion_tokens,total_tokens,\n// prompt_tokens_details.cached_tokens, cost}。compaction = 非 bootstrap 的 anchor(handoff)条数。\n// 也保留 legacy {type:...} 与无 type/kind 的通用兜底。\nimport type { StreamEvent, Usage, ToolName, JsonValue } from \"../../types.ts\";\nimport type { ParsedTranscript } from \"./index.ts\";\nimport { GENERIC_VERB_ALIASES, normalizeToolName as normalizeShared } from \"../tool-names.ts\";\nimport { normalizeJsonValue } from \"../../shared/json-value.ts\";\nimport { notCommandProjection, opaqueCommandProjection } from \"../command-projection.ts\";\n/** Bub 特有别名(fs.* / web.* 命名空间与裸 read/write/edit)+ 裸动词;通用别名走基表。 */\nexport const BUB_TOOL_ALIASES: globalThis.Record<string, ToolName> = {\n ...GENERIC_VERB_ALIASES,\n \"fs.read\": \"file_read\", fs_read: \"file_read\", read: \"file_read\",\n \"fs.write\": \"file_write\", fs_write: \"file_write\", write: \"file_write\",\n \"fs.edit\": \"file_edit\", fs_edit: \"file_edit\", edit: \"file_edit\",\n \"web.fetch\": \"web_fetch\",\n \"web.search\": \"web_search\",\n update_todos: \"agent_task\",\n};\nfunction normalizeToolName(name: string): ToolName {\n return normalizeShared(name, BUB_TOOL_ALIASES);\n}\n/** Bub tape 的 `bash` 是原生 shell action;tape 只保留 source,不能证明 argv。 */\nfunction commandProjectionForBubTool(name: string) {\n return name.toLowerCase() === \"bash\"\n ? opaqueCommandProjection(\"unsupported-protocol\")\n : notCommandProjection();\n}\nfunction get(obj: unknown, key: string): unknown {\n return obj && typeof obj === \"object\" ? (obj as globalThis.Record<string, unknown>)[key] : undefined;\n}\nfunction num(obj: unknown, ...keys: string[]): number {\n for (const k of keys) {\n const v = get(obj, k);\n if (typeof v === \"number\" && Number.isFinite(v))\n return v;\n }\n return 0;\n}\nfunction optionalNum(obj: unknown, ...keys: string[]): number | undefined {\n for (const key of keys) {\n const value = get(obj, key);\n if (typeof value === \"number\" && Number.isFinite(value))\n return value;\n }\n return undefined;\n}\nfunction coerceArgs(value: unknown): JsonValue {\n if (typeof value === \"string\") {\n try {\n const parsed: unknown = JSON.parse(value);\n return normalizeJsonValue(parsed, value);\n }\n catch {\n return value;\n }\n }\n return normalizeJsonValue(value, {});\n}\nfunction extractText(content: unknown): string {\n if (typeof content === \"string\")\n return content;\n if (Array.isArray(content)) {\n const parts: string[] = [];\n for (const b of content) {\n if (typeof b === \"string\")\n parts.push(b);\n else {\n const t = get(b, \"text\") ?? get(b, \"content\");\n if (typeof t === \"string\")\n parts.push(t);\n }\n }\n return parts.join(\"\\n\");\n }\n return \"\";\n}\nexport function parseBubTranscript(raw: string | undefined): ParsedTranscript {\n const events: StreamEvent[] = [];\n let inputTokens = 0;\n let outputTokens = 0;\n let cacheReadTokens = 0;\n let costUSD = 0;\n let hasObservedCostUSD = false;\n let requests = 0;\n let compactions = 0;\n let parseSuccess = true;\n if (!raw || !raw.trim()) {\n return { events, usage: {}, compactions: 0, parseSuccess: true };\n }\n // tape 的 tool_result 与上一条 tool_call 按位对齐;记下上一批 callId。\n let lastCallIds: string[] = [];\n // 无显式 id 的兜底配对。\n const pendingCallIds: string[] = [];\n let synth = 0;\n const nextSynthId = (): string => `bub_${++synth}`;\n // 从 event/run 的 data.usage(或 legacy 顶层 usage)累加用量。\n const addUsage = (usage: unknown): void => {\n if (!usage || typeof usage !== \"object\")\n return;\n const rawInput = num(usage, \"input_tokens\", \"prompt_tokens\", \"inputTokens\");\n const output = num(usage, \"output_tokens\", \"completion_tokens\", \"outputTokens\");\n let cache = num(usage, \"cached_input_tokens\", \"cache_read_input_tokens\", \"cacheReadTokens\");\n if (cache === 0)\n cache = num(get(usage, \"prompt_tokens_details\"), \"cached_tokens\");\n const cost = optionalNum(usage, \"cost\");\n if (rawInput === 0 && output === 0 && cache === 0 && cost === undefined)\n return;\n // Chat Completions 口径的 prompt_tokens 含缓存命中,cached_tokens 是其子集;\n // 落互斥桶前扣掉(docs/feature/adapters/sdk/bub/cost.md)\n const input = Math.max(0, rawInput - cache);\n inputTokens += input;\n outputTokens += output;\n cacheReadTokens += cache;\n if (cost !== undefined) {\n costUSD += cost;\n hasObservedCostUSD = true;\n }\n requests += 1;\n };\n const emitCall = (originalName: string, input: JsonValue, explicitId: unknown): string => {\n const callId = explicitId != null ? String(explicitId) : nextSynthId();\n if (explicitId == null)\n pendingCallIds.push(callId);\n events.push({\n type: \"operation.started\",\n operationId: callId,\n operation: {\n kind: \"tool\",\n name: originalName,\n input,\n tool: normalizeToolName(originalName),\n command: commandProjectionForBubTool(originalName),\n },\n });\n return callId;\n };\n const emitResult = (output: unknown, success: boolean, explicitId: unknown): void => {\n const callId = explicitId != null ? String(explicitId) : pendingCallIds.shift() ?? nextSynthId();\n events.push({\n type: \"operation.finished\",\n operationId: callId,\n kind: \"tool\",\n output: (output ?? null) as JsonValue,\n status: success ? \"completed\" : \"failed\",\n });\n };\n for (const line of raw.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed)\n continue;\n let entry: unknown;\n try {\n entry = JSON.parse(trimmed);\n }\n catch {\n parseSuccess = false;\n continue;\n }\n try {\n const type = get(entry, \"type\");\n const kind = get(entry, \"kind\");\n // ── legacy: 顶层 type ──\n if (typeof type === \"string\") {\n addUsage(get(entry, \"usage\"));\n if (type === \"message\") {\n const role = get(entry, \"role\") === \"user\" ? \"user\" : \"assistant\";\n const text = extractText(get(entry, \"content\") ?? get(entry, \"text\"));\n if (text)\n events.push({ type: \"message\", role, text });\n }\n else if (type === \"tool_call\") {\n const name = String(get(entry, \"tool_name\") ?? get(entry, \"name\") ?? get(entry, \"tool\") ?? \"unknown\");\n emitCall(name, coerceArgs(get(entry, \"args\") ?? get(entry, \"input\")), get(entry, \"call_id\") ?? get(entry, \"id\"));\n }\n else if (type === \"tool_result\") {\n emitResult(get(entry, \"result\") ?? get(entry, \"output\") ?? get(entry, \"content\"), get(entry, \"success\") !== false && !get(entry, \"error\"), get(entry, \"call_id\") ?? get(entry, \"tool_call_id\") ?? get(entry, \"id\"));\n }\n else if (type === \"thinking\" || type === \"reasoning\") {\n const text = extractText(get(entry, \"content\") ?? get(entry, \"text\"));\n if (text)\n events.push({ type: \"thinking\", text });\n }\n else if (type === \"error\") {\n events.push({ type: \"error\", message: String(get(entry, \"message\") ?? get(entry, \"error\") ?? \"error\") });\n }\n continue;\n }\n // ── republic tape: kind + payload ──\n if (typeof kind === \"string\") {\n const payload = get(entry, \"payload\");\n if (kind === \"message\") {\n const role = get(payload, \"role\") === \"user\" ? \"user\" : \"assistant\";\n const text = extractText(get(payload, \"content\") ?? get(payload, \"text\"));\n if (text)\n events.push({ type: \"message\", role, text });\n }\n else if (kind === \"tool_call\") {\n // 模型「先说话再调工具」:伴随文本记在 tool_call 的 payload.content 上\n // (bub 不给它单独的 message 条目)。先还原成 assistant message,再吐 calls,\n // 否则 transcript 里每次 send 后面都看不到 AI 回复。\n const accompanying = extractText(get(payload, \"content\"));\n if (accompanying)\n events.push({ type: \"message\", role: \"assistant\", text: accompanying });\n const calls = get(payload, \"calls\");\n const list = Array.isArray(calls) ? calls : [payload];\n lastCallIds = [];\n for (const call of list) {\n const fn = get(call, \"function\") ?? call;\n const name = String(get(fn, \"name\") ?? get(call, \"name\") ?? \"unknown\");\n const id = emitCall(name, coerceArgs(get(fn, \"arguments\") ?? get(call, \"args\") ?? get(call, \"input\")), get(call, \"id\") ?? get(call, \"call_id\"));\n lastCallIds.push(id);\n }\n }\n else if (kind === \"tool_result\") {\n const results = get(payload, \"results\");\n const list = Array.isArray(results) ? results : [get(payload, \"result\") ?? payload];\n // republic:results 与上一条 tool_call.calls 按位对齐。\n list.forEach((r, i) => {\n const isError = typeof r === \"object\" && r !== null && \"error\" in (r as globalThis.Record<string, unknown>);\n const explicitId = get(r, \"tool_call_id\") ?? get(r, \"id\") ?? lastCallIds[i];\n emitResult(get(r, \"output\") ?? get(r, \"result\") ?? get(r, \"content\") ?? r, !isError, explicitId);\n });\n }\n else if (kind === \"event\") {\n const data = get(payload, \"data\");\n // 用量:run 事件首选 data.usage;但新版 bub.tape 不一定每轮都发 run/usage,\n // 所以任何 event 上挂的 usage 也兜底累加(addUsage 自带去重式全零跳过)。\n addUsage(get(data, \"usage\"));\n // 仅在「真失败」时记 error:有 error 字段,或 status 命中失败词。\n // loop.step 这类控制事件 status==\"continue\"/\"running\" 不是错误 —— 别再当 error 刷屏。\n const status = get(data, \"status\");\n const errVal = get(data, \"error\");\n const failed = (errVal != null && errVal !== false && errVal !== \"\") ||\n (typeof status === \"string\" && /^(error|failed|aborted|cancell?ed|timeout)$/i.test(status));\n if (failed) {\n events.push({ type: \"error\", message: typeof errVal === \"string\" && errVal ? errVal : `${String(get(payload, \"name\"))}: ${String(status)}` });\n }\n }\n else if (kind === \"anchor\") {\n // 非 bootstrap 的 anchor = tape.handoff = 一次压缩检查点(供 t.transcript.compactions() 守卫)。\n const name = String(get(payload, \"name\") ?? \"\");\n if (name && name !== \"session/start\") {\n compactions += 1;\n events.push({ type: \"compaction\", reason: name });\n }\n }\n else if (kind === \"error\") {\n events.push({ type: \"error\", message: String(get(payload, \"message\") ?? get(payload, \"kind\") ?? \"error\") });\n }\n continue;\n }\n // ── 通用兜底:既无 type 也无 kind ──\n addUsage(get(entry, \"usage\"));\n const role = get(entry, \"role\");\n const name = get(entry, \"tool\") ?? get(entry, \"name\");\n if (role === \"assistant\" || role === \"user\") {\n const text = extractText(get(entry, \"content\") ?? get(entry, \"text\"));\n if (text)\n events.push({ type: \"message\", role, text });\n }\n else if (typeof name === \"string\") {\n if (get(entry, \"result\") !== undefined || get(entry, \"output\") !== undefined) {\n emitResult(get(entry, \"result\") ?? get(entry, \"output\"), !get(entry, \"error\"), get(entry, \"call_id\") ?? get(entry, \"id\"));\n }\n else {\n emitCall(name, coerceArgs(get(entry, \"args\") ?? get(entry, \"arguments\") ?? get(entry, \"input\")), get(entry, \"call_id\") ?? get(entry, \"id\"));\n }\n }\n }\n catch {\n parseSuccess = false;\n }\n }\n // requests > 0 意味着至少一次 addUsage 真的读到了非零字段;整份 tape 没有任何 usage 时\n // input/output 也不该垫成 0(见 docs/feature/record/architecture.md#usage)。\n const usage: Usage = requests > 0 ? { inputTokens, outputTokens } : {};\n if (cacheReadTokens > 0)\n usage.cacheReadTokens = cacheReadTokens;\n if (requests > 0)\n usage.requests = requests;\n if (hasObservedCostUSD)\n usage.costUSD = costUSD;\n return { events, usage, compactions, parseSuccess };\n}\n/** 便捷形态:只要 StreamEvent[]。 */\nexport function parseBub(raw: string | undefined): StreamEvent[] {\n return parseBubTranscript(raw).events;\n}\n"]}
1
+ {"version":3,"file":"bub.js","sourceRoot":"","sources":["bub.ts"],"names":[],"mappings":"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","sourcesContent":["// Bub 0.5.1 tape transcript 解析器。\n//\n// 真实 tape 格式(~/.bub/tapes/<md5(ws)__md5(sess)>.jsonl,按 id 升序逐行):\n// - kind=message payload={role, content} → 对话\n// - kind=tool_call payload={calls:[{id,function:{name,arguments}}]}\n// - kind=tool_result payload={results:[...]} ← 与上一条 tool_call.calls 按位对齐\n// - kind=event payload={name, data} name==\"run\" → data.usage 是该次模型调用用量\n// - kind=anchor payload={name, state:{summary?}} name!=\"session/start\" = tape.handoff(压缩检查点)\n// - kind=system/error\n// 用量路径(已对真实 tape 校验):payload.data.usage.{prompt_tokens,completion_tokens,total_tokens,\n// prompt_tokens_details.cached_tokens, cost}。compaction = 非 bootstrap 的 anchor(handoff)条数。\n// 只读取固定版本的 kind + payload 协议。\nimport type { StreamEvent, Usage, ToolName, JsonValue } from \"../../types.ts\";\nimport type { ParsedTranscript } from \"./index.ts\";\nimport { GENERIC_VERB_ALIASES, normalizeToolName as normalizeShared } from \"../tool-names.ts\";\nimport { normalizeJsonValue } from \"../../shared/json-value.ts\";\nimport { notCommandProjection, opaqueCommandProjection } from \"../command-projection.ts\";\n/** Bub 特有别名(fs.* / web.* 命名空间与裸 read/write/edit)+ 裸动词;通用别名走基表。 */\nexport const BUB_TOOL_ALIASES: globalThis.Record<string, ToolName> = {\n ...GENERIC_VERB_ALIASES,\n \"fs.read\": \"file_read\", fs_read: \"file_read\", read: \"file_read\",\n \"fs.write\": \"file_write\", fs_write: \"file_write\", write: \"file_write\",\n \"fs.edit\": \"file_edit\", fs_edit: \"file_edit\", edit: \"file_edit\",\n \"web.fetch\": \"web_fetch\",\n \"web.search\": \"web_search\",\n update_todos: \"agent_task\",\n};\nfunction normalizeToolName(name: string): ToolName {\n return normalizeShared(name, BUB_TOOL_ALIASES);\n}\n/** Bub tape 的 `bash` 是原生 shell action;tape 只保留 source,不能证明 argv。 */\nfunction commandProjectionForBubTool(name: string) {\n return name.toLowerCase() === \"bash\"\n ? opaqueCommandProjection(\"unsupported-protocol\")\n : notCommandProjection();\n}\nfunction get(obj: unknown, key: string): unknown {\n return obj && typeof obj === \"object\" ? (obj as globalThis.Record<string, unknown>)[key] : undefined;\n}\nfunction num(obj: unknown, ...keys: string[]): number {\n for (const k of keys) {\n const v = get(obj, k);\n if (typeof v === \"number\" && Number.isFinite(v))\n return v;\n }\n return 0;\n}\nfunction optionalNum(obj: unknown, ...keys: string[]): number | undefined {\n for (const key of keys) {\n const value = get(obj, key);\n if (typeof value === \"number\" && Number.isFinite(value))\n return value;\n }\n return undefined;\n}\nfunction coerceArgs(value: unknown): JsonValue {\n if (typeof value === \"string\") {\n try {\n const parsed: unknown = JSON.parse(value);\n return normalizeJsonValue(parsed, value);\n }\n catch {\n return value;\n }\n }\n return normalizeJsonValue(value, {});\n}\nfunction extractText(content: unknown): string {\n if (typeof content === \"string\")\n return content;\n if (Array.isArray(content)) {\n const parts: string[] = [];\n for (const b of content) {\n if (get(b, \"type\") === \"text\") {\n const t = get(b, \"text\");\n if (typeof t === \"string\")\n parts.push(t);\n }\n }\n return parts.join(\"\\n\");\n }\n return \"\";\n}\nexport function parseBubTranscript(raw: string | undefined): ParsedTranscript {\n const events: StreamEvent[] = [];\n let inputTokens = 0;\n let outputTokens = 0;\n let cacheReadTokens = 0;\n let costUSD = 0;\n let hasObservedCostUSD = false;\n let requests = 0;\n let compactions = 0;\n let parseSuccess = true;\n const unrecognizedEvents: Record<string, number> = Object.create(null);\n const unrecognized = (type: string): void => {\n unrecognizedEvents[type] = (unrecognizedEvents[type] ?? 0) + 1;\n };\n if (!raw || !raw.trim()) {\n return { events, usage: {}, compactions: 0, parseSuccess: true };\n }\n // tape 的 tool_result 与上一条 tool_call 按位对齐;记下上一批 callId。\n let lastCallIds: (string | undefined)[] = [];\n // 从 event/run 的 data.usage 累加用量。\n const addUsage = (usage: unknown): void => {\n if (!usage || typeof usage !== \"object\")\n return;\n const rawInput = num(usage, \"prompt_tokens\");\n const output = num(usage, \"completion_tokens\");\n const cache = num(get(usage, \"prompt_tokens_details\"), \"cached_tokens\");\n const cost = optionalNum(usage, \"cost\");\n if (rawInput === 0 && output === 0 && cache === 0 && cost === undefined)\n return;\n // Chat Completions 口径的 prompt_tokens 含缓存命中,cached_tokens 是其子集;\n // 落互斥桶前扣掉(docs/feature/adapters/sdk/bub/cost.md)\n const input = Math.max(0, rawInput - cache);\n inputTokens += input;\n outputTokens += output;\n cacheReadTokens += cache;\n if (cost !== undefined) {\n costUSD += cost;\n hasObservedCostUSD = true;\n }\n requests += 1;\n };\n const emitCall = (originalName: string, input: JsonValue, callId: string): string => {\n events.push({\n type: \"operation.started\",\n operationId: callId,\n operation: {\n kind: \"tool\",\n name: originalName,\n input,\n tool: normalizeToolName(originalName),\n command: commandProjectionForBubTool(originalName),\n },\n });\n return callId;\n };\n const emitResult = (output: unknown, success: boolean, callId: string): void => {\n events.push({\n type: \"operation.finished\",\n operationId: callId,\n kind: \"tool\",\n output: (output ?? null) as JsonValue,\n status: success ? \"completed\" : \"failed\",\n });\n };\n for (const line of raw.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed)\n continue;\n let entry: unknown;\n try {\n entry = JSON.parse(trimmed);\n }\n catch {\n parseSuccess = false;\n continue;\n }\n try {\n const type = get(entry, \"type\");\n const kind = get(entry, \"kind\");\n // ── republic tape: kind + payload ──\n if (typeof kind === \"string\") {\n const payload = get(entry, \"payload\");\n if (kind === \"message\") {\n const role = get(payload, \"role\");\n if (role !== \"user\" && role !== \"assistant\") {\n parseSuccess = false;\n continue;\n }\n const text = extractText(get(payload, \"content\"));\n if (text)\n events.push({ type: \"message\", role, text });\n }\n else if (kind === \"tool_call\") {\n // 模型「先说话再调工具」:伴随文本记在 tool_call 的 payload.content 上\n // (bub 不给它单独的 message 条目)。先还原成 assistant message,再吐 calls,\n // 否则 transcript 里每次 send 后面都看不到 AI 回复。\n const accompanying = extractText(get(payload, \"content\"));\n if (accompanying)\n events.push({ type: \"message\", role: \"assistant\", text: accompanying });\n const calls = get(payload, \"calls\");\n const list = Array.isArray(calls) ? calls : [];\n if (!Array.isArray(calls))\n parseSuccess = false;\n lastCallIds = list.map((call) => {\n const fn = get(call, \"function\");\n const name = get(fn, \"name\");\n const id = get(call, \"id\");\n if (typeof name !== \"string\" || typeof id !== \"string\") {\n parseSuccess = false;\n return undefined;\n }\n return emitCall(name, coerceArgs(get(fn, \"arguments\")), id);\n });\n }\n else if (kind === \"tool_result\") {\n const results = get(payload, \"results\");\n const list = Array.isArray(results) ? results : [];\n if (!Array.isArray(results))\n parseSuccess = false;\n // republic:results 与上一条 tool_call.calls 按位对齐。\n list.forEach((r, i) => {\n const isError = typeof r === \"object\" && r !== null && \"error\" in (r as globalThis.Record<string, unknown>);\n const explicitId = lastCallIds[i];\n if (explicitId === undefined) {\n parseSuccess = false;\n return;\n }\n emitResult(r, !isError, explicitId);\n });\n }\n else if (kind === \"event\") {\n const name = get(payload, \"name\");\n if (typeof name !== \"string\" || ![\"run\", \"handoff\", \"loop.start\", \"loop.step.start\", \"loop.step\"].includes(name)) {\n unrecognized(`event:${String(name ?? \"<missing-name>\")}`);\n continue;\n }\n const data = get(payload, \"data\");\n if (name === \"run\")\n addUsage(get(data, \"usage\"));\n // 仅在「真失败」时记 error:有 error 字段,或 status 命中失败词。\n // loop.step 这类控制事件 status==\"continue\"/\"running\" 不是错误 —— 别再当 error 刷屏。\n const status = get(data, \"status\");\n const errVal = get(data, \"error\");\n const failed = (errVal != null && errVal !== false && errVal !== \"\") ||\n (typeof status === \"string\" && /^(error|failed|aborted|cancell?ed|timeout)$/i.test(status));\n if (failed) {\n events.push({ type: \"error\", message: typeof errVal === \"string\" && errVal ? errVal : `${String(get(payload, \"name\"))}: ${String(status)}` });\n }\n }\n else if (kind === \"anchor\") {\n // 非 bootstrap 的 anchor = tape.handoff = 一次压缩检查点(供 t.transcript.compactions() 守卫)。\n const name = String(get(payload, \"name\") ?? \"\");\n if (name && name !== \"session/start\") {\n compactions += 1;\n events.push({ type: \"compaction\", reason: name });\n }\n }\n else if (kind === \"error\") {\n const message = get(payload, \"message\");\n if (typeof message === \"string\")\n events.push({ type: \"error\", message });\n else\n parseSuccess = false;\n }\n else if (kind !== \"system\") {\n unrecognized(kind);\n }\n continue;\n }\n unrecognized(typeof type === \"string\" ? `type:${type}` : \"<missing-kind>\");\n }\n catch {\n parseSuccess = false;\n }\n }\n // requests > 0 意味着至少一次 addUsage 真的读到了非零字段;整份 tape 没有任何 usage 时\n // input/output 也不该垫成 0(见 docs/feature/record/architecture.md#usage)。\n const usage: Usage = requests > 0 ? { inputTokens, outputTokens } : {};\n if (cacheReadTokens > 0)\n usage.cacheReadTokens = cacheReadTokens;\n if (requests > 0)\n usage.requests = requests;\n if (hasObservedCostUSD)\n usage.costUSD = costUSD;\n return { events, usage, compactions, parseSuccess, unrecognizedEvents };\n}\n/** 便捷形态:只要 StreamEvent[]。 */\nexport function parseBub(raw: string | undefined): StreamEvent[] {\n return parseBubTranscript(raw).events;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;AAOA,yCAA8D;AAUrD,qGAVA,+BAAoB,OAUA;AAAE,2FAVA,qBAAU,OAUA;AATzC,qDAA8E;AASnC,0GATlC,0CAAyB,OASkC;AAAE,gGATlC,gCAAe,OASkC;AARrF,qCAAwD;AAQ+B,mGAR9E,2BAAkB,OAQ8E;AAAE,yFAR9E,iBAAQ,OAQ8E","sourcesContent":["// o11y 解析器入口:把各 agent 的原始 transcript 归一成 niceeval StreamEvent[]。\n// 每个解析器都返回同一个 ParsedTranscript 形状。\n//\n// 这里没有「按 agent 名分派」的入口:解析器由 adapter 直连(shared.parseCodex /\n// parseClaudeCode / parseBub),core 不按名字分支。接新 agent = 写新解析器 + adapter\n// 里直接调,不改本文件的任何分派逻辑。\nimport type { StreamEvent, Usage } from \"../../types.ts\";\nimport { parseCodexTranscript, parseCodex } from \"./codex.ts\";\nimport { parseClaudeCodeTranscript, parseClaudeCode } from \"./claude-code.ts\";\nimport { parseBubTranscript, parseBub } from \"./bub.ts\";\n/** 解析结果:事件流为核心,外加 usage / 压缩次数 / 是否全程解析成功。 */\nexport interface ParsedTranscript {\n events: StreamEvent[];\n usage: Usage;\n compactions: number;\n parseSuccess: boolean;\n}\nexport { parseCodexTranscript, parseCodex, parseClaudeCodeTranscript, parseClaudeCode, parseBubTranscript, parseBub, };\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;AAOA,yCAA8D;AAYrD,qGAZA,+BAAoB,OAYA;AAAE,2FAZA,qBAAU,OAYA;AAXzC,qDAA8E;AAWnC,0GAXlC,0CAAyB,OAWkC;AAAE,gGAXlC,gCAAe,OAWkC;AAVrF,qCAAwD;AAU+B,mGAV9E,2BAAkB,OAU8E;AAAE,yFAV9E,iBAAQ,OAU8E","sourcesContent":["// o11y 解析器入口:把各 agent 的原始 transcript 归一成 niceeval StreamEvent[]。\n// 每个解析器都返回同一个 ParsedTranscript 形状。\n//\n// 这里没有「按 agent 名分派」的入口:解析器由 adapter 直连(shared.parseCodex /\n// parseClaudeCode / parseBub),core 不按名字分支。接新 agent = 写新解析器 + adapter\n// 里直接调,不改本文件的任何分派逻辑。\nimport type { StreamEvent, Usage } from \"../../types.ts\";\nimport { parseCodexTranscript, parseCodex } from \"./codex.ts\";\nimport { parseClaudeCodeTranscript, parseClaudeCode } from \"./claude-code.ts\";\nimport { parseBubTranscript, parseBub } from \"./bub.ts\";\n/** 解析结果:事件流为核心,外加 usage / 压缩次数 / 是否全程解析成功。 */\nexport interface ParsedTranscript {\n events: StreamEvent[];\n usage: Usage;\n compactions: number;\n parseSuccess: boolean;\n /** Unknown upstream event types, excluded from the normalized event stream. */\n unrecognizedEvents?: Readonly<Record<string, number>>;\n}\nexport { parseCodexTranscript, parseCodex, parseClaudeCodeTranscript, parseClaudeCode, parseBubTranscript, parseBub, };\n"]}
@@ -8,5 +8,7 @@ export interface ParsedTranscript {
8
8
  usage: Usage;
9
9
  compactions: number;
10
10
  parseSuccess: boolean;
11
+ /** Unknown upstream event types, excluded from the normalized event stream. */
12
+ unrecognizedEvents?: Readonly<Record<string, number>>;
11
13
  }
12
14
  export { parseCodexTranscript, parseCodex, parseClaudeCodeTranscript, parseClaudeCode, parseBubTranscript, parseBub, };
@@ -8,5 +8,7 @@ export interface ParsedTranscript {
8
8
  usage: Usage;
9
9
  compactions: number;
10
10
  parseSuccess: boolean;
11
+ /** Unknown upstream event types, excluded from the normalized event stream. */
12
+ unrecognizedEvents?: Readonly<Record<string, number>>;
11
13
  }
12
14
  export { parseCodexTranscript, parseCodex, parseClaudeCodeTranscript, parseClaudeCode, parseBubTranscript, parseBub, };
@@ -8,5 +8,7 @@ export interface ParsedTranscript {
8
8
  usage: Usage;
9
9
  compactions: number;
10
10
  parseSuccess: boolean;
11
+ /** Unknown upstream event types, excluded from the normalized event stream. */
12
+ unrecognizedEvents?: Readonly<Record<string, number>>;
11
13
  }
12
14
  export { parseCodexTranscript, parseCodex, parseClaudeCodeTranscript, parseClaudeCode, parseBubTranscript, parseBub, };