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,95 +1,2 @@
1
- /**
2
- * Internal discovery provenance. A shared helper is evaluated only once in a
3
- * fresh module graph, so discovery uses its source module to copy these paths
4
- * to every Eval entry that statically imports that helper.
5
- */
6
- export interface LoaderCaptureOrigin {
7
- readonly sourcePath: string;
8
- readonly paths: readonly string[];
9
- readonly criteriaPaths: readonly string[];
10
- readonly privatePaths: readonly string[];
11
- }
12
- export interface LoaderCapturePaths {
13
- readonly paths: readonly string[];
14
- readonly criteriaPaths: readonly string[];
15
- readonly privatePaths: readonly string[];
16
- }
17
- /**
18
- * 发现期包住一个 eval 模块的求值,记录它经公开 loader 读取的数据文件(`paths`)、
19
- * 经 `loadCriteria` 登记的判据树(`criteriaPaths`)、经 `loadPrivate` 登记的永不上传路径
20
- * (`privatePaths`)。三格分开是因为指纹与泄题门口径不同:
21
- * data 哈希已读进内存的内容;criteria / private 按内容流式哈希,且 private 另进泄题门。
22
- */
23
- export declare function captureLoadedFiles<T>(load: () => Promise<T>): Promise<{
24
- value: T;
25
- paths: string[];
26
- criteriaPaths: string[];
27
- privatePaths: string[];
28
- origins: readonly LoaderCaptureOrigin[];
29
- unattributed: LoaderCapturePaths;
30
- }>;
31
- /**
32
- * 读入一个 JSON 数据文件并解析。路径写项目根相对的字符串,或 eval 文件相对的
33
- * `new URL(p, import.meta.url)`。内容哈希进读它的那条 eval 的指纹。`decode` 必须在
34
- * 这个动态输入边界完成结构验证与归一;不提供「用泛型直接信任文件」的入口。
35
- */
36
- type DecodedData<T> = unknown extends T ? never : T;
37
- /**
38
- * 动态文件值到领域值的唯一出口。`unknown`(以及会把它吞掉的 `any`)不能成为解码结果;
39
- * decoder 必须返回一个比动态输入更窄、可供 Eval 定义直接使用的领域类型。
40
- */
41
- export type DataDecoder<T> = (value: unknown) => DecodedData<T> | Promise<DecodedData<T>>;
42
- export declare function loadJson<T>(path: string | URL, decode: DataDecoder<T>): Promise<T>;
43
- /**
44
- * 按 utf-8 读入一个文件的原文。判据不是结构化数据时用它:隐藏测试脚本、参考实现、
45
- * shell 模板都是判据文件。读入即宣告「它参与判定」——文件内容哈希进读它的那条 eval
46
- * 的指纹,改一字节就重跑那条 eval。用 `fs` 自行读入的文件不进指纹。
47
- * 路径写项目根相对的字符串,或 eval 文件相对的 `new URL(p, import.meta.url)`。
48
- */
49
- export declare function loadText(path: string | URL): Promise<string>;
50
- /** eval 文件相对的 glob;pattern 与 URL 分开,避免 URL parser 改写 glob 字符。 */
51
- export interface RelativeCriteriaPattern {
52
- readonly pattern: string;
53
- readonly relativeTo: URL;
54
- }
55
- export type CriteriaPattern = string | RelativeCriteriaPattern;
56
- /**
57
- * 登记一棵判据树进这条 eval 的指纹,不把内容读进内存。判分标准是一整棵树(隐藏测试目录、
58
- * 参考实现、跑测脚本)、内容只经 `t.sandbox.uploadDirectory` 整体送进沙箱时用它:
59
- * 发现期展开 glob、把每个匹配文件流式哈希进指纹,返回排序后的项目根相对路径清单。
60
- * 树里改一字节、增一个文件、删一个文件,都作废引用这棵树的那条 eval;权限位与修改时间不进哈希,
61
- * 重新 clone 一份工作树不作废。单个文件、且内容要写进沙箱时用 `loadText`。
62
- *
63
- * pattern 是项目根相对的 glob(`**` 跨层、`*` / `?` 段内、`[...]` 字符类、`{a,b}` 分支),
64
- * `!` 前缀为排除;按声明顺序求值,后写的覆盖先写的。匹配集按文件系统枚举、不看 git:
65
- * 新写的判据没 `git add` 也照样进指纹,代价是本地跑测冒出的生成物同样被盖到,用 `!` 排除。
66
- *
67
- * 只能在 eval 文件的模块顶层调用(发现期求值那一刻),`test(t)` 运行期调用直接报错——
68
- * 携带决策发生在任何 attempt 执行之前,那时才登记已经来不及。
69
- *
70
- * 两种用法错误直接抛:某个 include pattern 一个文件都没匹配到(或命中的都被 `!` 排除了)——
71
- * 多半是写错了或文件搬走了,别的 pattern 有命中也不放过,静默放过等于判据悄悄变窄;
72
- * 以及匹配落到项目根外(符号链接穿出根)。`!` 排除 pattern 不受「必须有命中」这条约束。
73
- *
74
- * @param patterns 项目根相对 glob,或 `{ pattern, relativeTo: import.meta.url }`;`!` 排除只收字符串。
75
- * @returns 匹配集的项目根相对路径,排序后(正斜杠分隔),不含内容。
76
- */
77
- export declare function loadCriteria(...patterns: CriteriaPattern[]): Promise<string[]>;
78
- /**
79
- * 登记永不上传的 private 路径进这条 eval 的判据指纹与泄题门,不把内容读进内存。
80
- * solution、生成器、参考答案必须与 eval 共址时用它:发现期与全部 build context /
81
- * bind mount 交叉检查,任何阶段都不得进入 Agent 可见面(见 docs/feature/sandbox/case.md「泄题门」)。
82
- *
83
- * pattern 语法、发现期约束、空匹配与穿出项目根的报错与 `loadCriteria` 同形。
84
- *
85
- * @param patterns 一个或多个项目根相对 glob,`!` 前缀为排除。
86
- * @returns 匹配集的项目根相对路径,排序后(正斜杠分隔),不含内容。
87
- */
88
- export declare function loadPrivate(...patterns: string[]): Promise<string[]>;
89
- /**
90
- * 读入一个 YAML 数据文件并解析,需要项目里装了 `yaml`。路径写项目根相对的字符串,
91
- * 或 eval 文件相对的 `new URL(p, import.meta.url)`。内容哈希进读它的那条 eval 的指纹。解析结果与
92
- * JSON 一样必须立即经 `decode` 验证,不让未证明的动态值进入 Eval 定义。
93
- */
94
- export declare function loadYaml<T>(path: string | URL, decode: DataDecoder<T>): Promise<T>;
95
- export {};
1
+ export { loadJson, loadText, loadYaml, loadCriteria, loadPrivate } from "./runtime.js";
2
+ export type { DataDecoder, RelativeCriteriaPattern, CriteriaPattern } from "./runtime.js";
@@ -1,16 +1,14 @@
1
1
  import { createRequire as __niceevalCreateRequire } from "node:module";
2
2
  const __niceevalRequire = __niceevalCreateRequire(import.meta.url);
3
3
  const __niceevalCanonical = __niceevalRequire("./index.cjs");
4
- const __niceevalExport0 = __niceevalCanonical["captureLoadedFiles"];
5
- export { __niceevalExport0 as captureLoadedFiles };
6
- const __niceevalExport1 = __niceevalCanonical["loadCriteria"];
7
- export { __niceevalExport1 as loadCriteria };
8
- const __niceevalExport2 = __niceevalCanonical["loadJson"];
9
- export { __niceevalExport2 as loadJson };
10
- const __niceevalExport3 = __niceevalCanonical["loadPrivate"];
11
- export { __niceevalExport3 as loadPrivate };
12
- const __niceevalExport4 = __niceevalCanonical["loadText"];
13
- export { __niceevalExport4 as loadText };
14
- const __niceevalExport5 = __niceevalCanonical["loadYaml"];
15
- export { __niceevalExport5 as loadYaml };
4
+ const __niceevalExport0 = __niceevalCanonical["loadCriteria"];
5
+ export { __niceevalExport0 as loadCriteria };
6
+ const __niceevalExport1 = __niceevalCanonical["loadJson"];
7
+ export { __niceevalExport1 as loadJson };
8
+ const __niceevalExport2 = __niceevalCanonical["loadPrivate"];
9
+ export { __niceevalExport2 as loadPrivate };
10
+ const __niceevalExport3 = __niceevalCanonical["loadText"];
11
+ export { __niceevalExport3 as loadText };
12
+ const __niceevalExport4 = __niceevalCanonical["loadYaml"];
13
+ export { __niceevalExport4 as loadYaml };
16
14
  //# sourceMappingURL=index.js.map
@@ -1,16 +1,14 @@
1
1
  import { createRequire as __niceevalCreateRequire } from "node:module";
2
2
  const __niceevalRequire = __niceevalCreateRequire(import.meta.url);
3
3
  const __niceevalCanonical = __niceevalRequire("./index.cjs");
4
- const __niceevalExport0 = __niceevalCanonical["captureLoadedFiles"];
5
- export { __niceevalExport0 as captureLoadedFiles };
6
- const __niceevalExport1 = __niceevalCanonical["loadCriteria"];
7
- export { __niceevalExport1 as loadCriteria };
8
- const __niceevalExport2 = __niceevalCanonical["loadJson"];
9
- export { __niceevalExport2 as loadJson };
10
- const __niceevalExport3 = __niceevalCanonical["loadPrivate"];
11
- export { __niceevalExport3 as loadPrivate };
12
- const __niceevalExport4 = __niceevalCanonical["loadText"];
13
- export { __niceevalExport4 as loadText };
14
- const __niceevalExport5 = __niceevalCanonical["loadYaml"];
15
- export { __niceevalExport5 as loadYaml };
4
+ const __niceevalExport0 = __niceevalCanonical["loadCriteria"];
5
+ export { __niceevalExport0 as loadCriteria };
6
+ const __niceevalExport1 = __niceevalCanonical["loadJson"];
7
+ export { __niceevalExport1 as loadJson };
8
+ const __niceevalExport2 = __niceevalCanonical["loadPrivate"];
9
+ export { __niceevalExport2 as loadPrivate };
10
+ const __niceevalExport3 = __niceevalCanonical["loadText"];
11
+ export { __niceevalExport3 as loadText };
12
+ const __niceevalExport4 = __niceevalCanonical["loadYaml"];
13
+ export { __niceevalExport4 as loadYaml };
16
14
  //# sourceMappingURL=index.mjs.map
@@ -0,0 +1,283 @@
1
+ "use strict";
2
+ const { pathToFileURL: __niceevalPathToFileURL } = require("node:url");
3
+ const __niceevalImportMetaUrl = __niceevalPathToFileURL(__filename).href;
4
+ const __niceevalDynamicImport = (specifier) => import(specifier);
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.captureLoadedFiles = captureLoadedFiles;
7
+ exports.loadJson = loadJson;
8
+ exports.loadText = loadText;
9
+ exports.loadCriteria = loadCriteria;
10
+ exports.loadPrivate = loadPrivate;
11
+ exports.loadYaml = loadYaml;
12
+ // 数据集加载与发现期捕获共用同一模块状态;公开入口仅导出作者加载函数。
13
+ // 数据集与判据文件加载器:结构化数据读成 YAML / JSON,配 .map(row => defineEval(...)) 扇出;
14
+ // 非结构化的判据文件读成原文;一整棵判据树只登记不读入(loadCriteria,流式哈希)。
15
+ // 经这里读入或登记的文件都进读它那条 eval 的指纹。
16
+ // 单文件路径两种写法等价:项目根相对字符串,或 eval 文件相对的 `file:` URL。
17
+ // glob 不能塞进 URL(`?` 会变 query、`{}` 会编码),所以相对 glob 把 pattern 与基准 URL 分开传。
18
+ // 登记只在发现期的模块求值里成立,所以 capture 不在场时直接报错,不静默漏登记。
19
+ const promises_1 = require("node:fs/promises");
20
+ const node_path_1 = require("node:path");
21
+ const node_url_1 = require("node:url");
22
+ const glob_ts_1 = require("./glob.cjs");
23
+ let activeCapture;
24
+ /**
25
+ * 发现期包住一个 eval 模块的求值,记录它经公开 loader 读取的数据文件(`paths`)、
26
+ * 经 `loadCriteria` 登记的判据树(`criteriaPaths`)、经 `loadPrivate` 登记的永不上传路径
27
+ * (`privatePaths`)。三格分开是因为指纹与泄题门口径不同:
28
+ * data 哈希已读进内存的内容;criteria / private 按内容流式哈希,且 private 另进泄题门。
29
+ */
30
+ async function captureLoadedFiles(load) {
31
+ const previous = activeCapture;
32
+ const capture = {
33
+ data: new Set(),
34
+ criteria: new Set(),
35
+ private: new Set(),
36
+ origins: new Map(),
37
+ unattributed: newBuckets(),
38
+ };
39
+ activeCapture = capture;
40
+ try {
41
+ const value = await load();
42
+ return {
43
+ value,
44
+ paths: [...capture.data].sort(),
45
+ criteriaPaths: [...capture.criteria].sort(),
46
+ privatePaths: [...capture.private].sort(),
47
+ origins: Object.freeze([...capture.origins.entries()]
48
+ .map(([sourcePath, buckets]) => Object.freeze({
49
+ sourcePath,
50
+ paths: Object.freeze([...buckets.data].sort()),
51
+ criteriaPaths: Object.freeze([...buckets.criteria].sort()),
52
+ privatePaths: Object.freeze([...buckets.private].sort()),
53
+ }))
54
+ .sort((left, right) => left.sourcePath.localeCompare(right.sourcePath))),
55
+ unattributed: Object.freeze({
56
+ paths: Object.freeze([...capture.unattributed.data].sort()),
57
+ criteriaPaths: Object.freeze([...capture.unattributed.criteria].sort()),
58
+ privatePaths: Object.freeze([...capture.unattributed.private].sort()),
59
+ }),
60
+ };
61
+ }
62
+ finally {
63
+ activeCapture = previous;
64
+ }
65
+ }
66
+ function newBuckets() {
67
+ return {
68
+ data: new Set(),
69
+ criteria: new Set(),
70
+ private: new Set(),
71
+ };
72
+ }
73
+ /** Best-effort source ownership for a public loader call, without exposing it as an API. */
74
+ function loaderCallerPath() {
75
+ const stack = new Error().stack;
76
+ if (stack === undefined)
77
+ return undefined;
78
+ const self = (0, node_path_1.resolve)((0, node_url_1.fileURLToPath)(__niceevalImportMetaUrl));
79
+ for (const line of stack.split("\n").slice(1)) {
80
+ const match = line.match(/(?:file:\/\/)?(\/.*?):\d+:\d+/);
81
+ if (match?.[1] === undefined)
82
+ continue;
83
+ let candidate;
84
+ try {
85
+ candidate = line.includes("file://") ? (0, node_url_1.fileURLToPath)(`file://${match[1]}`) : match[1];
86
+ }
87
+ catch {
88
+ continue;
89
+ }
90
+ const absolute = (0, node_path_1.resolve)(candidate);
91
+ if (absolute !== self)
92
+ return absolute;
93
+ }
94
+ return undefined;
95
+ }
96
+ function registerCapturePath(bucket, absolute) {
97
+ const capture = activeCapture;
98
+ if (capture === undefined)
99
+ return;
100
+ capture[bucket].add(absolute);
101
+ const caller = loaderCallerPath();
102
+ if (caller === undefined) {
103
+ capture.unattributed[bucket].add(absolute);
104
+ return;
105
+ }
106
+ const buckets = capture.origins.get(caller) ?? newBuckets();
107
+ capture.origins.set(caller, buckets);
108
+ buckets[bucket].add(absolute);
109
+ }
110
+ // 两种入参在这里归一成一个绝对路径,登记与指纹因此天然等价:字符串按项目根(进程 cwd)解析,
111
+ // URL 只认 `file:`。fileURLToPath 是 niceeval 内部实现,用户侧写 `new URL(p, import.meta.url)`
112
+ // 就够,不需要 import node:url。
113
+ function resolvedPath(path) {
114
+ const absolute = typeof path === "string" ? (0, node_path_1.resolve)(process.cwd(), path) : fromFileUrl(path);
115
+ if (!activeCapture)
116
+ throw new Error(`Read of "${String(path)}" happened outside discovery: loaders may only be called at the module top level of an eval file (while discovery evaluates that module), which is the only point early enough for the file's content to enter this eval's fingerprint. Move the read to the module top level and keep the result in a constant that test(t) uses; loaders cannot be called at run time from test(t) or from lifecycle hooks.`);
117
+ registerCapturePath("data", absolute);
118
+ return absolute;
119
+ }
120
+ function fromFileUrl(url) {
121
+ if (url.protocol !== "file:")
122
+ throw new Error(`A URL passed to a loader must use the file: protocol, but got ${url.protocol} (${url.href}). Pass new URL(relativePath, import.meta.url) instead, or use a plain project-root-relative string path.`);
123
+ return (0, node_url_1.fileURLToPath)(url);
124
+ }
125
+ async function loadJson(path, decode) {
126
+ const raw = await (0, promises_1.readFile)(resolvedPath(path), "utf-8");
127
+ const parsed = JSON.parse(raw);
128
+ return decode(parsed);
129
+ }
130
+ /**
131
+ * 按 utf-8 读入一个文件的原文。判据不是结构化数据时用它:隐藏测试脚本、参考实现、
132
+ * shell 模板都是判据文件。读入即宣告「它参与判定」——文件内容哈希进读它的那条 eval
133
+ * 的指纹,改一字节就重跑那条 eval。用 `fs` 自行读入的文件不进指纹。
134
+ * 路径写项目根相对的字符串,或 eval 文件相对的 `new URL(p, import.meta.url)`。
135
+ */
136
+ async function loadText(path) {
137
+ return (0, promises_1.readFile)(resolvedPath(path), "utf-8");
138
+ }
139
+ /**
140
+ * 登记一棵判据树进这条 eval 的指纹,不把内容读进内存。判分标准是一整棵树(隐藏测试目录、
141
+ * 参考实现、跑测脚本)、内容只经 `t.sandbox.uploadDirectory` 整体送进沙箱时用它:
142
+ * 发现期展开 glob、把每个匹配文件流式哈希进指纹,返回排序后的项目根相对路径清单。
143
+ * 树里改一字节、增一个文件、删一个文件,都作废引用这棵树的那条 eval;权限位与修改时间不进哈希,
144
+ * 重新 clone 一份工作树不作废。单个文件、且内容要写进沙箱时用 `loadText`。
145
+ *
146
+ * pattern 是项目根相对的 glob(`**` 跨层、`*` / `?` 段内、`[...]` 字符类、`{a,b}` 分支),
147
+ * `!` 前缀为排除;按声明顺序求值,后写的覆盖先写的。匹配集按文件系统枚举、不看 git:
148
+ * 新写的判据没 `git add` 也照样进指纹,代价是本地跑测冒出的生成物同样被盖到,用 `!` 排除。
149
+ *
150
+ * 只能在 eval 文件的模块顶层调用(发现期求值那一刻),`test(t)` 运行期调用直接报错——
151
+ * 携带决策发生在任何 attempt 执行之前,那时才登记已经来不及。
152
+ *
153
+ * 两种用法错误直接抛:某个 include pattern 一个文件都没匹配到(或命中的都被 `!` 排除了)——
154
+ * 多半是写错了或文件搬走了,别的 pattern 有命中也不放过,静默放过等于判据悄悄变窄;
155
+ * 以及匹配落到项目根外(符号链接穿出根)。`!` 排除 pattern 不受「必须有命中」这条约束。
156
+ *
157
+ * @param patterns 项目根相对 glob,或 `{ pattern, relativeTo: import.meta.url }`;`!` 排除只收字符串。
158
+ * @returns 匹配集的项目根相对路径,排序后(正斜杠分隔),不含内容。
159
+ */
160
+ async function loadCriteria(...patterns) {
161
+ if (!activeCapture) {
162
+ const path = patterns
163
+ .map((pattern) => typeof pattern === "string" ? pattern : `${pattern.pattern} relative to ${pattern.relativeTo.href}`)
164
+ .join(" ");
165
+ throw new Error(`Read of "${path}" happened outside discovery: loaders may only be called at the module top level of an eval file (while discovery evaluates that module), which is the only point early enough for the file's content to enter this eval's fingerprint. Move the read to the module top level and keep the result in a constant that test(t) uses; loaders cannot be called at run time from test(t) or from lifecycle hooks.`);
166
+ }
167
+ return registerGlobPatterns(patterns.map(normalizeCriteriaPattern), "criteria");
168
+ }
169
+ function normalizeCriteriaPattern(pattern) {
170
+ if (typeof pattern === "string")
171
+ return pattern;
172
+ if (pattern.pattern.startsWith("!")) {
173
+ throw new Error("loadCriteria exclusions must be project-root-relative strings; " +
174
+ "put the relative include in { pattern, relativeTo } and pass the exclusion separately");
175
+ }
176
+ const baseDir = (0, node_path_1.dirname)(fromFileUrl(pattern.relativeTo));
177
+ return (0, node_path_1.relative)(process.cwd(), (0, node_path_1.resolve)(baseDir, pattern.pattern)).split(node_path_1.sep).join("/");
178
+ }
179
+ /**
180
+ * 登记永不上传的 private 路径进这条 eval 的判据指纹与泄题门,不把内容读进内存。
181
+ * solution、生成器、参考答案必须与 eval 共址时用它:发现期与全部 build context /
182
+ * bind mount 交叉检查,任何阶段都不得进入 Agent 可见面(见 docs/feature/sandbox/case.md「泄题门」)。
183
+ *
184
+ * pattern 语法、发现期约束、空匹配与穿出项目根的报错与 `loadCriteria` 同形。
185
+ *
186
+ * @param patterns 一个或多个项目根相对 glob,`!` 前缀为排除。
187
+ * @returns 匹配集的项目根相对路径,排序后(正斜杠分隔),不含内容。
188
+ */
189
+ async function loadPrivate(...patterns) {
190
+ return registerGlobPatterns(patterns, "private");
191
+ }
192
+ async function registerGlobPatterns(patterns, bucket) {
193
+ const capture = activeCapture;
194
+ if (!capture)
195
+ throw new Error(`Read of "${patterns.join(" ")}" happened outside discovery: loaders may only be called at the module top level of an eval file (while discovery evaluates that module), which is the only point early enough for the file's content to enter this eval's fingerprint. Move the read to the module top level and keep the result in a constant that test(t) uses; loaders cannot be called at run time from test(t) or from lifecycle hooks.`);
196
+ const root = process.cwd();
197
+ const compiled = (0, glob_ts_1.compilePatterns)(patterns);
198
+ const matched = new Set();
199
+ for (const base of (0, glob_ts_1.enumerationBases)(compiled)) {
200
+ await collectCriteria(root, base, compiled, matched);
201
+ }
202
+ const relativePaths = [...matched].sort();
203
+ // 逐条 include pattern 判空,不是整次调用判空:三条 pattern 里搬走了一条对应的文件时,
204
+ // 别的两条有命中会让整体放行,判据悄悄变窄——正是「该重跑的没重跑」那个方向。
205
+ const missing = (0, glob_ts_1.unmatchedIncludes)(compiled, relativePaths);
206
+ if (missing.length > 0) {
207
+ const patterns = missing.join(" ");
208
+ throw new Error(bucket === "private"
209
+ ? `These loadPrivate patterns matched no files (or everything they matched was excluded by a later \`!\` pattern): ${patterns}. They are most likely misspelled, or the private files moved — patterns expand from the project root ${root}, not from the eval file's directory. Check these against the real paths on disk; letting this pass silently would drop hidden inputs from the leak gate and the fingerprint.`
210
+ : `These loadCriteria patterns matched no files (or everything they matched was excluded by a later \`!\` pattern): ${patterns}. They are most likely misspelled, or the criteria files moved — patterns expand from the project root ${root}, not from the eval file's directory. Check these against the real paths on disk, and drop the pattern if it is no longer needed; the other patterns having matches is no excuse, because letting this pass silently narrows the criteria, and narrowed criteria let an eval that should re-run keep carrying its old verdict.`);
211
+ }
212
+ for (const path of relativePaths)
213
+ registerCapturePath(bucket, (0, node_path_1.resolve)(root, path));
214
+ return relativePaths;
215
+ }
216
+ /** 从一个枚举起点往下走,把命中 pattern 集的文件按项目根相对路径收进 out。 */
217
+ async function collectCriteria(root, base, compiled, out) {
218
+ // pattern 自己就指到根外(`../`、绝对路径)时在起点上先报,不用等枚举。
219
+ await assertInsideRoot(root, (0, node_path_1.resolve)(root, base), base || ".");
220
+ // 符号链接可以指回树内,realpath 去重防环。
221
+ const visited = new Set();
222
+ const walk = async (dir) => {
223
+ const real = await (0, promises_1.realpath)(dir).catch(() => undefined);
224
+ if (real === undefined || visited.has(real))
225
+ return;
226
+ visited.add(real);
227
+ // 起点不存在 / 不是目录时不在这里报:交给「匹配集为空」统一给下一步。
228
+ const entries = await (0, promises_1.readdir)(dir, { withFileTypes: true }).catch(() => undefined);
229
+ if (entries === undefined)
230
+ return;
231
+ for (const entry of entries) {
232
+ const absolute = (0, node_path_1.join)(dir, entry.name);
233
+ let isDirectory = entry.isDirectory();
234
+ let isFile = entry.isFile();
235
+ if (entry.isSymbolicLink()) {
236
+ const target = await (0, promises_1.stat)(absolute).catch(() => undefined);
237
+ if (target === undefined)
238
+ continue; // 断链按不存在处理
239
+ isDirectory = target.isDirectory();
240
+ isFile = target.isFile();
241
+ }
242
+ if (isDirectory) {
243
+ await walk(absolute);
244
+ continue;
245
+ }
246
+ if (!isFile)
247
+ continue;
248
+ const relativePath = (0, node_path_1.relative)(root, absolute).split(node_path_1.sep).join("/");
249
+ if (!(0, glob_ts_1.includedByPatterns)(relativePath, compiled))
250
+ continue;
251
+ await assertInsideRoot(root, absolute, relativePath);
252
+ out.add(relativePath);
253
+ }
254
+ };
255
+ await walk((0, node_path_1.resolve)(root, base));
256
+ }
257
+ async function assertInsideRoot(root, absolute, shown) {
258
+ const real = await (0, promises_1.realpath)(absolute).catch(() => absolute);
259
+ if (real !== root && !real.startsWith(`${root}${node_path_1.sep}`)) {
260
+ throw new Error(`loadCriteria matched "${shown}", which lands outside the project root (it resolves to ${real}): a criteria file's project-root-relative path is its fingerprint key, and that key stops being stable once it points out of the root. Move the tree (or the symlink's target) inside the project root ${root}, or exclude that link with a \`!\` pattern.`);
261
+ }
262
+ }
263
+ /**
264
+ * 读入一个 YAML 数据文件并解析,需要项目里装了 `yaml`。路径写项目根相对的字符串,
265
+ * 或 eval 文件相对的 `new URL(p, import.meta.url)`。内容哈希进读它的那条 eval 的指纹。解析结果与
266
+ * JSON 一样必须立即经 `decode` 验证,不让未证明的动态值进入 Eval 定义。
267
+ */
268
+ async function loadYaml(path, decode) {
269
+ const raw = await (0, promises_1.readFile)(resolvedPath(path), "utf-8");
270
+ // yaml 是可选依赖:用变量 specifier 避免 tsc 静态解析。装了就用真解析器;
271
+ // 没装直接报错并给出下一步 —— 不再退回手写的「极简 YAML」:它对嵌套 / 多行 /
272
+ // 锚点会静默解析出错误数据,让 eval 拿着错的 case 跑起来比直接失败更糟。
273
+ const yamlPkg = "yaml";
274
+ let parse;
275
+ try {
276
+ ({ parse } = (await __niceevalDynamicImport(yamlPkg)));
277
+ }
278
+ catch {
279
+ throw new Error(`loadYaml("${String(path)}") needs a YAML parser: run \`pnpm add yaml\` first (or switch to loadJson with a JSON dataset).`);
280
+ }
281
+ return decode(parse(raw));
282
+ }
283
+ //# sourceMappingURL=runtime.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["runtime.ts"],"names":[],"mappings":"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","sourcesContent":["// 数据集加载与发现期捕获共用同一模块状态;公开入口仅导出作者加载函数。\n// 数据集与判据文件加载器:结构化数据读成 YAML / JSON,配 .map(row => defineEval(...)) 扇出;\n// 非结构化的判据文件读成原文;一整棵判据树只登记不读入(loadCriteria,流式哈希)。\n// 经这里读入或登记的文件都进读它那条 eval 的指纹。\n// 单文件路径两种写法等价:项目根相对字符串,或 eval 文件相对的 `file:` URL。\n// glob 不能塞进 URL(`?` 会变 query、`{}` 会编码),所以相对 glob 把 pattern 与基准 URL 分开传。\n// 登记只在发现期的模块求值里成立,所以 capture 不在场时直接报错,不静默漏登记。\nimport { readdir, readFile, realpath, stat } from \"node:fs/promises\";\nimport { dirname, join, relative, resolve, sep } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { compilePatterns, enumerationBases, includedByPatterns, unmatchedIncludes, type CompiledPattern } from \"./glob.ts\";\n/**\n * 一次发现期求值的登记表:\n * - data:读入即登记的数据文件(内容已在内存)\n * - criteria:只登记不读入的判据树(verifier)\n * - private:只登记不读入、永不上传的隐藏文件\n * 三格分开是因为指纹与泄题门口径不同。\n */\ninterface LoaderCapture {\n readonly data: Set<string>;\n readonly criteria: Set<string>;\n readonly private: Set<string>;\n /** Source module -> registrations made while that module was evaluated. */\n readonly origins: Map<string, LoaderCaptureBuckets>;\n /** No usable caller frame: discovery conservatively attributes these to all entries. */\n readonly unattributed: LoaderCaptureBuckets;\n}\ninterface LoaderCaptureBuckets {\n readonly data: Set<string>;\n readonly criteria: Set<string>;\n readonly private: Set<string>;\n}\ntype LoaderCaptureBucketName = \"data\" | \"criteria\" | \"private\";\n/**\n * Internal discovery provenance. A shared helper is evaluated only once in a\n * fresh module graph, so discovery uses its source module to copy these paths\n * to every Eval entry that statically imports that helper.\n */\nexport interface LoaderCaptureOrigin {\n readonly sourcePath: string;\n readonly paths: readonly string[];\n readonly criteriaPaths: readonly string[];\n readonly privatePaths: readonly string[];\n}\nexport interface LoaderCapturePaths {\n readonly paths: readonly string[];\n readonly criteriaPaths: readonly string[];\n readonly privatePaths: readonly string[];\n}\nlet activeCapture: LoaderCapture | undefined;\n/**\n * 发现期包住一个 eval 模块的求值,记录它经公开 loader 读取的数据文件(`paths`)、\n * 经 `loadCriteria` 登记的判据树(`criteriaPaths`)、经 `loadPrivate` 登记的永不上传路径\n * (`privatePaths`)。三格分开是因为指纹与泄题门口径不同:\n * data 哈希已读进内存的内容;criteria / private 按内容流式哈希,且 private 另进泄题门。\n */\nexport async function captureLoadedFiles<T>(load: () => Promise<T>): Promise<{\n value: T;\n paths: string[];\n criteriaPaths: string[];\n privatePaths: string[];\n origins: readonly LoaderCaptureOrigin[];\n unattributed: LoaderCapturePaths;\n}> {\n const previous = activeCapture;\n const capture: LoaderCapture = {\n data: new Set<string>(),\n criteria: new Set<string>(),\n private: new Set<string>(),\n origins: new Map<string, LoaderCaptureBuckets>(),\n unattributed: newBuckets(),\n };\n activeCapture = capture;\n try {\n const value = await load();\n return {\n value,\n paths: [...capture.data].sort(),\n criteriaPaths: [...capture.criteria].sort(),\n privatePaths: [...capture.private].sort(),\n origins: Object.freeze([...capture.origins.entries()]\n .map(([sourcePath, buckets]) => Object.freeze({\n sourcePath,\n paths: Object.freeze([...buckets.data].sort()),\n criteriaPaths: Object.freeze([...buckets.criteria].sort()),\n privatePaths: Object.freeze([...buckets.private].sort()),\n }))\n .sort((left, right) => left.sourcePath.localeCompare(right.sourcePath))),\n unattributed: Object.freeze({\n paths: Object.freeze([...capture.unattributed.data].sort()),\n criteriaPaths: Object.freeze([...capture.unattributed.criteria].sort()),\n privatePaths: Object.freeze([...capture.unattributed.private].sort()),\n }),\n };\n }\n finally {\n activeCapture = previous;\n }\n}\nfunction newBuckets(): LoaderCaptureBuckets {\n return {\n data: new Set<string>(),\n criteria: new Set<string>(),\n private: new Set<string>(),\n };\n}\n/** Best-effort source ownership for a public loader call, without exposing it as an API. */\nfunction loaderCallerPath(): string | undefined {\n const stack = new Error().stack;\n if (stack === undefined)\n return undefined;\n const self = resolve(fileURLToPath(__niceevalImportMetaUrl));\n for (const line of stack.split(\"\\n\").slice(1)) {\n const match = line.match(/(?:file:\\/\\/)?(\\/.*?):\\d+:\\d+/);\n if (match?.[1] === undefined)\n continue;\n let candidate: string;\n try {\n candidate = line.includes(\"file://\") ? fileURLToPath(`file://${match[1]}`) : match[1];\n }\n catch {\n continue;\n }\n const absolute = resolve(candidate);\n if (absolute !== self)\n return absolute;\n }\n return undefined;\n}\nfunction registerCapturePath(bucket: LoaderCaptureBucketName, absolute: string): void {\n const capture = activeCapture;\n if (capture === undefined)\n return;\n capture[bucket].add(absolute);\n const caller = loaderCallerPath();\n if (caller === undefined) {\n capture.unattributed[bucket].add(absolute);\n return;\n }\n const buckets = capture.origins.get(caller) ?? newBuckets();\n capture.origins.set(caller, buckets);\n buckets[bucket].add(absolute);\n}\n// 两种入参在这里归一成一个绝对路径,登记与指纹因此天然等价:字符串按项目根(进程 cwd)解析,\n// URL 只认 `file:`。fileURLToPath 是 niceeval 内部实现,用户侧写 `new URL(p, import.meta.url)`\n// 就够,不需要 import node:url。\nfunction resolvedPath(path: string | URL): string {\n const absolute = typeof path === \"string\" ? resolve(process.cwd(), path) : fromFileUrl(path);\n if (!activeCapture)\n throw new Error(`Read of \"${String(path)}\" happened outside discovery: loaders may only be called at the module top level of an eval file (while discovery evaluates that module), which is the only point early enough for the file's content to enter this eval's fingerprint. Move the read to the module top level and keep the result in a constant that test(t) uses; loaders cannot be called at run time from test(t) or from lifecycle hooks.`);\n registerCapturePath(\"data\", absolute);\n return absolute;\n}\nfunction fromFileUrl(url: URL): string {\n if (url.protocol !== \"file:\")\n throw new Error(`A URL passed to a loader must use the file: protocol, but got ${url.protocol} (${url.href}). Pass new URL(relativePath, import.meta.url) instead, or use a plain project-root-relative string path.`);\n return fileURLToPath(url);\n}\n/**\n * 读入一个 JSON 数据文件并解析。路径写项目根相对的字符串,或 eval 文件相对的\n * `new URL(p, import.meta.url)`。内容哈希进读它的那条 eval 的指纹。`decode` 必须在\n * 这个动态输入边界完成结构验证与归一;不提供「用泛型直接信任文件」的入口。\n */\ntype DecodedData<T> = unknown extends T ? never : T;\n/**\n * 动态文件值到领域值的唯一出口。`unknown`(以及会把它吞掉的 `any`)不能成为解码结果;\n * decoder 必须返回一个比动态输入更窄、可供 Eval 定义直接使用的领域类型。\n */\nexport type DataDecoder<T> = (value: unknown) => DecodedData<T> | Promise<DecodedData<T>>;\nexport async function loadJson<T>(path: string | URL, decode: DataDecoder<T>): Promise<T> {\n const raw = await readFile(resolvedPath(path), \"utf-8\");\n const parsed: unknown = JSON.parse(raw);\n return decode(parsed);\n}\n/**\n * 按 utf-8 读入一个文件的原文。判据不是结构化数据时用它:隐藏测试脚本、参考实现、\n * shell 模板都是判据文件。读入即宣告「它参与判定」——文件内容哈希进读它的那条 eval\n * 的指纹,改一字节就重跑那条 eval。用 `fs` 自行读入的文件不进指纹。\n * 路径写项目根相对的字符串,或 eval 文件相对的 `new URL(p, import.meta.url)`。\n */\nexport async function loadText(path: string | URL): Promise<string> {\n return readFile(resolvedPath(path), \"utf-8\");\n}\n/** eval 文件相对的 glob;pattern 与 URL 分开,避免 URL parser 改写 glob 字符。 */\nexport interface RelativeCriteriaPattern {\n readonly pattern: string;\n readonly relativeTo: URL;\n}\nexport type CriteriaPattern = string | RelativeCriteriaPattern;\n/**\n * 登记一棵判据树进这条 eval 的指纹,不把内容读进内存。判分标准是一整棵树(隐藏测试目录、\n * 参考实现、跑测脚本)、内容只经 `t.sandbox.uploadDirectory` 整体送进沙箱时用它:\n * 发现期展开 glob、把每个匹配文件流式哈希进指纹,返回排序后的项目根相对路径清单。\n * 树里改一字节、增一个文件、删一个文件,都作废引用这棵树的那条 eval;权限位与修改时间不进哈希,\n * 重新 clone 一份工作树不作废。单个文件、且内容要写进沙箱时用 `loadText`。\n *\n * pattern 是项目根相对的 glob(`**` 跨层、`*` / `?` 段内、`[...]` 字符类、`{a,b}` 分支),\n * `!` 前缀为排除;按声明顺序求值,后写的覆盖先写的。匹配集按文件系统枚举、不看 git:\n * 新写的判据没 `git add` 也照样进指纹,代价是本地跑测冒出的生成物同样被盖到,用 `!` 排除。\n *\n * 只能在 eval 文件的模块顶层调用(发现期求值那一刻),`test(t)` 运行期调用直接报错——\n * 携带决策发生在任何 attempt 执行之前,那时才登记已经来不及。\n *\n * 两种用法错误直接抛:某个 include pattern 一个文件都没匹配到(或命中的都被 `!` 排除了)——\n * 多半是写错了或文件搬走了,别的 pattern 有命中也不放过,静默放过等于判据悄悄变窄;\n * 以及匹配落到项目根外(符号链接穿出根)。`!` 排除 pattern 不受「必须有命中」这条约束。\n *\n * @param patterns 项目根相对 glob,或 `{ pattern, relativeTo: import.meta.url }`;`!` 排除只收字符串。\n * @returns 匹配集的项目根相对路径,排序后(正斜杠分隔),不含内容。\n */\nexport async function loadCriteria(...patterns: CriteriaPattern[]): Promise<string[]> {\n if (!activeCapture) {\n const path = patterns\n .map((pattern) => typeof pattern === \"string\" ? pattern : `${pattern.pattern} relative to ${pattern.relativeTo.href}`)\n .join(\" \");\n throw new Error(`Read of \"${path}\" happened outside discovery: loaders may only be called at the module top level of an eval file (while discovery evaluates that module), which is the only point early enough for the file's content to enter this eval's fingerprint. Move the read to the module top level and keep the result in a constant that test(t) uses; loaders cannot be called at run time from test(t) or from lifecycle hooks.`);\n }\n return registerGlobPatterns(patterns.map(normalizeCriteriaPattern), \"criteria\");\n}\nfunction normalizeCriteriaPattern(pattern: CriteriaPattern): string {\n if (typeof pattern === \"string\")\n return pattern;\n if (pattern.pattern.startsWith(\"!\")) {\n throw new Error(\"loadCriteria exclusions must be project-root-relative strings; \" +\n \"put the relative include in { pattern, relativeTo } and pass the exclusion separately\");\n }\n const baseDir = dirname(fromFileUrl(pattern.relativeTo));\n return relative(process.cwd(), resolve(baseDir, pattern.pattern)).split(sep).join(\"/\");\n}\n/**\n * 登记永不上传的 private 路径进这条 eval 的判据指纹与泄题门,不把内容读进内存。\n * solution、生成器、参考答案必须与 eval 共址时用它:发现期与全部 build context /\n * bind mount 交叉检查,任何阶段都不得进入 Agent 可见面(见 docs/feature/sandbox/case.md「泄题门」)。\n *\n * pattern 语法、发现期约束、空匹配与穿出项目根的报错与 `loadCriteria` 同形。\n *\n * @param patterns 一个或多个项目根相对 glob,`!` 前缀为排除。\n * @returns 匹配集的项目根相对路径,排序后(正斜杠分隔),不含内容。\n */\nexport async function loadPrivate(...patterns: string[]): Promise<string[]> {\n return registerGlobPatterns(patterns, \"private\");\n}\nasync function registerGlobPatterns(patterns: string[], bucket: \"criteria\" | \"private\"): Promise<string[]> {\n const capture = activeCapture;\n if (!capture)\n throw new Error(`Read of \"${patterns.join(\" \")}\" happened outside discovery: loaders may only be called at the module top level of an eval file (while discovery evaluates that module), which is the only point early enough for the file's content to enter this eval's fingerprint. Move the read to the module top level and keep the result in a constant that test(t) uses; loaders cannot be called at run time from test(t) or from lifecycle hooks.`);\n const root = process.cwd();\n const compiled = compilePatterns(patterns);\n const matched = new Set<string>();\n for (const base of enumerationBases(compiled)) {\n await collectCriteria(root, base, compiled, matched);\n }\n const relativePaths = [...matched].sort();\n // 逐条 include pattern 判空,不是整次调用判空:三条 pattern 里搬走了一条对应的文件时,\n // 别的两条有命中会让整体放行,判据悄悄变窄——正是「该重跑的没重跑」那个方向。\n const missing = unmatchedIncludes(compiled, relativePaths);\n if (missing.length > 0) {\n const patterns = missing.join(\" \");\n throw new Error(bucket === \"private\"\n ? `These loadPrivate patterns matched no files (or everything they matched was excluded by a later \\`!\\` pattern): ${patterns}. They are most likely misspelled, or the private files moved — patterns expand from the project root ${root}, not from the eval file's directory. Check these against the real paths on disk; letting this pass silently would drop hidden inputs from the leak gate and the fingerprint.`\n : `These loadCriteria patterns matched no files (or everything they matched was excluded by a later \\`!\\` pattern): ${patterns}. They are most likely misspelled, or the criteria files moved — patterns expand from the project root ${root}, not from the eval file's directory. Check these against the real paths on disk, and drop the pattern if it is no longer needed; the other patterns having matches is no excuse, because letting this pass silently narrows the criteria, and narrowed criteria let an eval that should re-run keep carrying its old verdict.`);\n }\n for (const path of relativePaths)\n registerCapturePath(bucket, resolve(root, path));\n return relativePaths;\n}\n/** 从一个枚举起点往下走,把命中 pattern 集的文件按项目根相对路径收进 out。 */\nasync function collectCriteria(root: string, base: string, compiled: readonly CompiledPattern[], out: Set<string>): Promise<void> {\n // pattern 自己就指到根外(`../`、绝对路径)时在起点上先报,不用等枚举。\n await assertInsideRoot(root, resolve(root, base), base || \".\");\n // 符号链接可以指回树内,realpath 去重防环。\n const visited = new Set<string>();\n const walk = async (dir: string): Promise<void> => {\n const real = await realpath(dir).catch(() => undefined);\n if (real === undefined || visited.has(real))\n return;\n visited.add(real);\n // 起点不存在 / 不是目录时不在这里报:交给「匹配集为空」统一给下一步。\n const entries = await readdir(dir, { withFileTypes: true }).catch(() => undefined);\n if (entries === undefined)\n return;\n for (const entry of entries) {\n const absolute = join(dir, entry.name);\n let isDirectory = entry.isDirectory();\n let isFile = entry.isFile();\n if (entry.isSymbolicLink()) {\n const target = await stat(absolute).catch(() => undefined);\n if (target === undefined)\n continue; // 断链按不存在处理\n isDirectory = target.isDirectory();\n isFile = target.isFile();\n }\n if (isDirectory) {\n await walk(absolute);\n continue;\n }\n if (!isFile)\n continue;\n const relativePath = relative(root, absolute).split(sep).join(\"/\");\n if (!includedByPatterns(relativePath, compiled))\n continue;\n await assertInsideRoot(root, absolute, relativePath);\n out.add(relativePath);\n }\n };\n await walk(resolve(root, base));\n}\nasync function assertInsideRoot(root: string, absolute: string, shown: string): Promise<void> {\n const real = await realpath(absolute).catch(() => absolute);\n if (real !== root && !real.startsWith(`${root}${sep}`)) {\n throw new Error(`loadCriteria matched \"${shown}\", which lands outside the project root (it resolves to ${real}): a criteria file's project-root-relative path is its fingerprint key, and that key stops being stable once it points out of the root. Move the tree (or the symlink's target) inside the project root ${root}, or exclude that link with a \\`!\\` pattern.`);\n }\n}\n/**\n * 读入一个 YAML 数据文件并解析,需要项目里装了 `yaml`。路径写项目根相对的字符串,\n * 或 eval 文件相对的 `new URL(p, import.meta.url)`。内容哈希进读它的那条 eval 的指纹。解析结果与\n * JSON 一样必须立即经 `decode` 验证,不让未证明的动态值进入 Eval 定义。\n */\nexport async function loadYaml<T>(path: string | URL, decode: DataDecoder<T>): Promise<T> {\n const raw = await readFile(resolvedPath(path), \"utf-8\");\n // yaml 是可选依赖:用变量 specifier 避免 tsc 静态解析。装了就用真解析器;\n // 没装直接报错并给出下一步 —— 不再退回手写的「极简 YAML」:它对嵌套 / 多行 /\n // 锚点会静默解析出错误数据,让 eval 拿着错的 case 跑起来比直接失败更糟。\n const yamlPkg = \"yaml\";\n let parse: (s: string) => unknown;\n try {\n ({ parse } = (await __niceevalDynamicImport(yamlPkg)) as {\n parse(s: string): unknown;\n });\n }\n catch {\n throw new Error(`loadYaml(\"${String(path)}\") needs a YAML parser: run \\`pnpm add yaml\\` first (or switch to loadJson with a JSON dataset).`);\n }\n return decode(parse(raw));\n}\n"]}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Internal discovery provenance. A shared helper is evaluated only once in a
3
+ * fresh module graph, so discovery uses its source module to copy these paths
4
+ * to every Eval entry that statically imports that helper.
5
+ */
6
+ export interface LoaderCaptureOrigin {
7
+ readonly sourcePath: string;
8
+ readonly paths: readonly string[];
9
+ readonly criteriaPaths: readonly string[];
10
+ readonly privatePaths: readonly string[];
11
+ }
12
+ export interface LoaderCapturePaths {
13
+ readonly paths: readonly string[];
14
+ readonly criteriaPaths: readonly string[];
15
+ readonly privatePaths: readonly string[];
16
+ }
17
+ /**
18
+ * 发现期包住一个 eval 模块的求值,记录它经公开 loader 读取的数据文件(`paths`)、
19
+ * 经 `loadCriteria` 登记的判据树(`criteriaPaths`)、经 `loadPrivate` 登记的永不上传路径
20
+ * (`privatePaths`)。三格分开是因为指纹与泄题门口径不同:
21
+ * data 哈希已读进内存的内容;criteria / private 按内容流式哈希,且 private 另进泄题门。
22
+ */
23
+ export declare function captureLoadedFiles<T>(load: () => Promise<T>): Promise<{
24
+ value: T;
25
+ paths: string[];
26
+ criteriaPaths: string[];
27
+ privatePaths: string[];
28
+ origins: readonly LoaderCaptureOrigin[];
29
+ unattributed: LoaderCapturePaths;
30
+ }>;
31
+ /**
32
+ * 读入一个 JSON 数据文件并解析。路径写项目根相对的字符串,或 eval 文件相对的
33
+ * `new URL(p, import.meta.url)`。内容哈希进读它的那条 eval 的指纹。`decode` 必须在
34
+ * 这个动态输入边界完成结构验证与归一;不提供「用泛型直接信任文件」的入口。
35
+ */
36
+ type DecodedData<T> = unknown extends T ? never : T;
37
+ /**
38
+ * 动态文件值到领域值的唯一出口。`unknown`(以及会把它吞掉的 `any`)不能成为解码结果;
39
+ * decoder 必须返回一个比动态输入更窄、可供 Eval 定义直接使用的领域类型。
40
+ */
41
+ export type DataDecoder<T> = (value: unknown) => DecodedData<T> | Promise<DecodedData<T>>;
42
+ export declare function loadJson<T>(path: string | URL, decode: DataDecoder<T>): Promise<T>;
43
+ /**
44
+ * 按 utf-8 读入一个文件的原文。判据不是结构化数据时用它:隐藏测试脚本、参考实现、
45
+ * shell 模板都是判据文件。读入即宣告「它参与判定」——文件内容哈希进读它的那条 eval
46
+ * 的指纹,改一字节就重跑那条 eval。用 `fs` 自行读入的文件不进指纹。
47
+ * 路径写项目根相对的字符串,或 eval 文件相对的 `new URL(p, import.meta.url)`。
48
+ */
49
+ export declare function loadText(path: string | URL): Promise<string>;
50
+ /** eval 文件相对的 glob;pattern 与 URL 分开,避免 URL parser 改写 glob 字符。 */
51
+ export interface RelativeCriteriaPattern {
52
+ readonly pattern: string;
53
+ readonly relativeTo: URL;
54
+ }
55
+ export type CriteriaPattern = string | RelativeCriteriaPattern;
56
+ /**
57
+ * 登记一棵判据树进这条 eval 的指纹,不把内容读进内存。判分标准是一整棵树(隐藏测试目录、
58
+ * 参考实现、跑测脚本)、内容只经 `t.sandbox.uploadDirectory` 整体送进沙箱时用它:
59
+ * 发现期展开 glob、把每个匹配文件流式哈希进指纹,返回排序后的项目根相对路径清单。
60
+ * 树里改一字节、增一个文件、删一个文件,都作废引用这棵树的那条 eval;权限位与修改时间不进哈希,
61
+ * 重新 clone 一份工作树不作废。单个文件、且内容要写进沙箱时用 `loadText`。
62
+ *
63
+ * pattern 是项目根相对的 glob(`**` 跨层、`*` / `?` 段内、`[...]` 字符类、`{a,b}` 分支),
64
+ * `!` 前缀为排除;按声明顺序求值,后写的覆盖先写的。匹配集按文件系统枚举、不看 git:
65
+ * 新写的判据没 `git add` 也照样进指纹,代价是本地跑测冒出的生成物同样被盖到,用 `!` 排除。
66
+ *
67
+ * 只能在 eval 文件的模块顶层调用(发现期求值那一刻),`test(t)` 运行期调用直接报错——
68
+ * 携带决策发生在任何 attempt 执行之前,那时才登记已经来不及。
69
+ *
70
+ * 两种用法错误直接抛:某个 include pattern 一个文件都没匹配到(或命中的都被 `!` 排除了)——
71
+ * 多半是写错了或文件搬走了,别的 pattern 有命中也不放过,静默放过等于判据悄悄变窄;
72
+ * 以及匹配落到项目根外(符号链接穿出根)。`!` 排除 pattern 不受「必须有命中」这条约束。
73
+ *
74
+ * @param patterns 项目根相对 glob,或 `{ pattern, relativeTo: import.meta.url }`;`!` 排除只收字符串。
75
+ * @returns 匹配集的项目根相对路径,排序后(正斜杠分隔),不含内容。
76
+ */
77
+ export declare function loadCriteria(...patterns: CriteriaPattern[]): Promise<string[]>;
78
+ /**
79
+ * 登记永不上传的 private 路径进这条 eval 的判据指纹与泄题门,不把内容读进内存。
80
+ * solution、生成器、参考答案必须与 eval 共址时用它:发现期与全部 build context /
81
+ * bind mount 交叉检查,任何阶段都不得进入 Agent 可见面(见 docs/feature/sandbox/case.md「泄题门」)。
82
+ *
83
+ * pattern 语法、发现期约束、空匹配与穿出项目根的报错与 `loadCriteria` 同形。
84
+ *
85
+ * @param patterns 一个或多个项目根相对 glob,`!` 前缀为排除。
86
+ * @returns 匹配集的项目根相对路径,排序后(正斜杠分隔),不含内容。
87
+ */
88
+ export declare function loadPrivate(...patterns: string[]): Promise<string[]>;
89
+ /**
90
+ * 读入一个 YAML 数据文件并解析,需要项目里装了 `yaml`。路径写项目根相对的字符串,
91
+ * 或 eval 文件相对的 `new URL(p, import.meta.url)`。内容哈希进读它的那条 eval 的指纹。解析结果与
92
+ * JSON 一样必须立即经 `decode` 验证,不让未证明的动态值进入 Eval 定义。
93
+ */
94
+ export declare function loadYaml<T>(path: string | URL, decode: DataDecoder<T>): Promise<T>;
95
+ export {};