niceeval 0.13.3 → 0.13.4-canary.39

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 (487) hide show
  1. package/INDEX.md +5 -5
  2. package/dist/agents/index.cjs +2 -2
  3. package/dist/agents/index.cjs.map +1 -1
  4. package/dist/agents/project.json +6 -0
  5. package/dist/agents/streaming.cjs.map +1 -1
  6. package/dist/agents/types.cjs.map +1 -1
  7. package/dist/agents/types.d.cts +1 -1
  8. package/dist/agents/types.d.mts +1 -1
  9. package/dist/agents/types.d.ts +1 -1
  10. package/dist/analysis/bindings.d.cts +8 -8
  11. package/dist/analysis/bindings.d.mts +8 -8
  12. package/dist/analysis/bindings.d.ts +8 -8
  13. package/dist/analysis/contracts.cjs.map +1 -1
  14. package/dist/analysis/contracts.d.cts +8 -19
  15. package/dist/analysis/contracts.d.mts +8 -19
  16. package/dist/analysis/contracts.d.ts +8 -19
  17. package/dist/analysis/experiment-groups.cjs +7 -14
  18. package/dist/analysis/experiment-groups.cjs.map +1 -1
  19. package/dist/analysis/index.cjs.map +1 -1
  20. package/dist/analysis/index.d.cts +1 -1
  21. package/dist/analysis/index.d.mts +1 -1
  22. package/dist/analysis/index.d.ts +1 -1
  23. package/dist/cli/application.cjs +4 -13
  24. package/dist/cli/application.cjs.map +1 -1
  25. package/dist/cli/application.d.cts +62 -59
  26. package/dist/cli/application.d.mts +62 -59
  27. package/dist/cli/application.d.ts +62 -59
  28. package/dist/cli/application.js +6 -12
  29. package/dist/cli/bootstrap.cjs +28 -2
  30. package/dist/cli/bootstrap.cjs.map +1 -1
  31. package/dist/cli/contribution.cjs +185 -0
  32. package/dist/cli/contribution.cjs.map +1 -0
  33. package/dist/cli/contribution.d.cts +55 -0
  34. package/dist/cli/contribution.d.mts +55 -0
  35. package/dist/cli/contribution.d.ts +55 -0
  36. package/dist/cli/contribution.js +20 -0
  37. package/dist/cli/contribution.js.map +1 -0
  38. package/dist/cli/node-application.cjs +119 -87
  39. package/dist/cli/node-application.cjs.map +1 -1
  40. package/dist/cli/node-application.d.cts +2 -8
  41. package/dist/cli/node-application.d.mts +2 -8
  42. package/dist/cli/node-application.d.ts +2 -8
  43. package/dist/cli/node-application.js +12 -22
  44. package/dist/cli/program.cjs +87 -2756
  45. package/dist/cli/program.cjs.map +1 -1
  46. package/dist/cli/program.d.cts +11 -332
  47. package/dist/cli/program.d.mts +11 -332
  48. package/dist/cli/program.d.ts +11 -332
  49. package/dist/cli/program.js +4 -28
  50. package/dist/cli.cjs +0 -3
  51. package/dist/cli.cjs.map +1 -1
  52. package/dist/cli.d.cts +0 -1
  53. package/dist/cli.d.mts +0 -1
  54. package/dist/cli.d.ts +0 -1
  55. package/dist/cli.js +6 -14
  56. package/dist/define.cjs +1 -1
  57. package/dist/define.cjs.map +1 -1
  58. package/dist/docker/cache-administration.cjs +8 -0
  59. package/dist/docker/cache-administration.cjs.map +1 -0
  60. package/dist/docker/cache-administration.d.cts +33 -0
  61. package/dist/docker/cache-administration.d.mts +33 -0
  62. package/dist/docker/cache-administration.d.ts +33 -0
  63. package/dist/docker/cache-administration.js +6 -0
  64. package/dist/docker/cache-administration.js.map +1 -0
  65. package/dist/docker/cache-live.cjs +27 -0
  66. package/dist/docker/cache-live.cjs.map +1 -0
  67. package/dist/docker/cache-live.d.cts +3 -0
  68. package/dist/docker/cache-live.d.mts +3 -0
  69. package/dist/docker/cache-live.d.ts +3 -0
  70. package/dist/docker/cache-live.js +6 -0
  71. package/dist/docker/cache-live.js.map +1 -0
  72. package/dist/docker/cli/contribution.cjs +223 -0
  73. package/dist/docker/cli/contribution.cjs.map +1 -0
  74. package/dist/docker/cli/contribution.d.cts +48 -0
  75. package/dist/docker/cli/contribution.d.mts +48 -0
  76. package/dist/docker/cli/contribution.d.ts +48 -0
  77. package/dist/docker/cli/contribution.js +8 -0
  78. package/dist/docker/cli/contribution.js.map +1 -0
  79. package/dist/eval/cli/contribution.cjs +62 -0
  80. package/dist/eval/cli/contribution.cjs.map +1 -0
  81. package/dist/eval/cli/contribution.d.cts +21 -0
  82. package/dist/eval/cli/contribution.d.mts +21 -0
  83. package/dist/eval/cli/contribution.d.ts +21 -0
  84. package/dist/eval/cli/contribution.js +8 -0
  85. package/dist/eval/cli/contribution.js.map +1 -0
  86. package/dist/eval/host/index.cjs +23 -0
  87. package/dist/eval/host/index.cjs.map +1 -0
  88. package/dist/eval/host/index.d.cts +27 -0
  89. package/dist/eval/host/index.d.mts +27 -0
  90. package/dist/eval/host/index.d.ts +27 -0
  91. package/dist/eval/host/index.js +8 -0
  92. package/dist/eval/host/index.js.map +1 -0
  93. package/dist/eval/host/index.mjs +8 -0
  94. package/dist/eval/host/index.mjs.map +1 -0
  95. package/dist/experiment/host/cli/contribution.cjs +835 -0
  96. package/dist/experiment/host/cli/contribution.cjs.map +1 -0
  97. package/dist/experiment/host/cli/contribution.d.cts +329 -0
  98. package/dist/experiment/host/cli/contribution.d.mts +329 -0
  99. package/dist/experiment/host/cli/contribution.d.ts +329 -0
  100. package/dist/experiment/host/cli/contribution.js +22 -0
  101. package/dist/experiment/host/cli/contribution.js.map +1 -0
  102. package/dist/experiment/host/cli/index.cjs +9 -0
  103. package/dist/experiment/host/cli/index.cjs.map +1 -0
  104. package/dist/experiment/host/cli/index.d.cts +2 -0
  105. package/dist/experiment/host/cli/index.d.mts +2 -0
  106. package/dist/experiment/host/cli/index.d.ts +2 -0
  107. package/dist/experiment/host/cli/index.js +10 -0
  108. package/dist/experiment/host/cli/index.js.map +1 -0
  109. package/dist/experiment/host/cli/terminal.cjs +15 -0
  110. package/dist/experiment/host/cli/terminal.cjs.map +1 -0
  111. package/dist/experiment/host/cli/terminal.d.cts +14 -0
  112. package/dist/experiment/host/cli/terminal.d.mts +14 -0
  113. package/dist/experiment/host/cli/terminal.d.ts +14 -0
  114. package/dist/experiment/host/cli/terminal.js +8 -0
  115. package/dist/experiment/host/cli/terminal.js.map +1 -0
  116. package/dist/experiment/host/index.cjs +35 -58
  117. package/dist/experiment/host/index.cjs.map +1 -1
  118. package/dist/experiment/host/index.d.cts +5 -79
  119. package/dist/experiment/host/index.d.mts +5 -79
  120. package/dist/experiment/host/index.d.ts +5 -79
  121. package/dist/experiment/host/index.js +4 -2
  122. package/dist/experiment/host/index.mjs +4 -2
  123. package/dist/experiment/host/operations.cjs +678 -0
  124. package/dist/experiment/host/operations.cjs.map +1 -0
  125. package/dist/experiment/host/operations.d.cts +19 -0
  126. package/dist/experiment/host/operations.d.mts +19 -0
  127. package/dist/experiment/host/operations.d.ts +19 -0
  128. package/dist/experiment/host/operations.js +24 -0
  129. package/dist/experiment/host/operations.js.map +1 -0
  130. package/dist/experiment/host/presentation.cjs +81 -0
  131. package/dist/experiment/host/presentation.cjs.map +1 -0
  132. package/dist/experiment/host/presentation.d.cts +9 -0
  133. package/dist/experiment/host/presentation.d.mts +9 -0
  134. package/dist/experiment/host/presentation.d.ts +9 -0
  135. package/dist/experiment/host/presentation.js +8 -0
  136. package/dist/experiment/host/presentation.js.map +1 -0
  137. package/dist/experiment/host/teardown.cjs +394 -0
  138. package/dist/experiment/host/teardown.cjs.map +1 -0
  139. package/dist/experiment/host/teardown.d.cts +5 -0
  140. package/dist/experiment/host/teardown.d.mts +5 -0
  141. package/dist/experiment/host/teardown.d.ts +5 -0
  142. package/dist/experiment/host/teardown.js +8 -0
  143. package/dist/experiment/host/teardown.js.map +1 -0
  144. package/dist/experiment/host/types.cjs +9 -0
  145. package/dist/experiment/host/types.cjs.map +1 -0
  146. package/dist/experiment/host/types.d.cts +423 -0
  147. package/dist/experiment/host/types.d.mts +423 -0
  148. package/dist/experiment/host/types.d.ts +423 -0
  149. package/dist/experiment/host/types.js +6 -0
  150. package/dist/experiment/host/types.js.map +1 -0
  151. package/dist/i18n/en.cjs +8 -50
  152. package/dist/i18n/en.cjs.map +1 -1
  153. package/dist/i18n/en.d.cts +2 -6
  154. package/dist/i18n/en.d.mts +2 -6
  155. package/dist/i18n/en.d.ts +2 -6
  156. package/dist/o11y/project.json +6 -0
  157. package/dist/project/cli/contribution.cjs +66 -0
  158. package/dist/project/cli/contribution.cjs.map +1 -0
  159. package/dist/project/cli/contribution.d.cts +17 -0
  160. package/dist/project/cli/contribution.d.mts +17 -0
  161. package/dist/project/cli/contribution.d.ts +17 -0
  162. package/dist/project/cli/contribution.js +8 -0
  163. package/dist/project/cli/contribution.js.map +1 -0
  164. package/dist/project/cli/index.cjs +7 -0
  165. package/dist/project/cli/index.cjs.map +1 -0
  166. package/dist/project/cli/index.d.cts +1 -0
  167. package/dist/project/cli/index.d.mts +1 -0
  168. package/dist/project/cli/index.d.ts +1 -0
  169. package/dist/project/cli/index.js +8 -0
  170. package/dist/project/cli/index.js.map +1 -0
  171. package/dist/project/host/index.cjs +11 -0
  172. package/dist/project/host/index.cjs.map +1 -0
  173. package/dist/project/host/index.d.cts +4 -0
  174. package/dist/project/host/index.d.mts +4 -0
  175. package/dist/project/host/index.d.ts +4 -0
  176. package/dist/project/host/index.js +14 -0
  177. package/dist/project/host/index.js.map +1 -0
  178. package/dist/project/host/index.mjs +14 -0
  179. package/dist/project/host/index.mjs.map +1 -0
  180. package/dist/project/host.cjs +59 -0
  181. package/dist/project/host.cjs.map +1 -0
  182. package/dist/project/host.d.cts +17 -0
  183. package/dist/project/host.d.mts +17 -0
  184. package/dist/project/host.d.ts +17 -0
  185. package/dist/project/host.js +6 -0
  186. package/dist/project/host.js.map +1 -0
  187. package/dist/project/index.cjs +11 -0
  188. package/dist/project/index.cjs.map +1 -0
  189. package/dist/project/index.d.cts +4 -0
  190. package/dist/project/index.d.mts +4 -0
  191. package/dist/project/index.d.ts +4 -0
  192. package/dist/project/index.js +14 -0
  193. package/dist/project/index.js.map +1 -0
  194. package/dist/project/node.cjs +91 -0
  195. package/dist/project/node.cjs.map +1 -0
  196. package/dist/project/node.d.cts +6 -0
  197. package/dist/project/node.d.mts +6 -0
  198. package/dist/project/node.d.ts +6 -0
  199. package/dist/project/node.js +12 -0
  200. package/dist/project/node.js.map +1 -0
  201. package/dist/project/services.cjs +17 -0
  202. package/dist/project/services.cjs.map +1 -0
  203. package/dist/project/services.d.cts +47 -0
  204. package/dist/project/services.d.mts +47 -0
  205. package/dist/project/services.d.ts +47 -0
  206. package/dist/project/services.js +12 -0
  207. package/dist/project/services.js.map +1 -0
  208. package/dist/project/templates.cjs +28 -0
  209. package/dist/project/templates.cjs.map +1 -0
  210. package/dist/project/templates.d.cts +4 -0
  211. package/dist/project/templates.d.mts +4 -0
  212. package/dist/project/templates.d.ts +4 -0
  213. package/dist/project/templates.js +12 -0
  214. package/dist/project/templates.js.map +1 -0
  215. package/dist/project.json +6 -0
  216. package/dist/record/family/catalog.d.cts +10 -10
  217. package/dist/record/family/catalog.d.mts +10 -10
  218. package/dist/record/family/catalog.d.ts +10 -10
  219. package/dist/record/family/file-changes.d.cts +8 -8
  220. package/dist/record/family/file-changes.d.mts +8 -8
  221. package/dist/record/family/file-changes.d.ts +8 -8
  222. package/dist/record/host/cli/contribution.cjs +206 -0
  223. package/dist/record/host/cli/contribution.cjs.map +1 -0
  224. package/dist/record/host/cli/contribution.d.cts +32 -0
  225. package/dist/record/host/cli/contribution.d.mts +32 -0
  226. package/dist/record/host/cli/contribution.d.ts +32 -0
  227. package/dist/record/host/cli/contribution.js +10 -0
  228. package/dist/record/host/cli/contribution.js.map +1 -0
  229. package/dist/record/host/cli/index.cjs +8 -0
  230. package/dist/record/host/cli/index.cjs.map +1 -0
  231. package/dist/record/host/cli/index.d.cts +1 -0
  232. package/dist/record/host/cli/index.d.mts +1 -0
  233. package/dist/record/host/cli/index.d.ts +1 -0
  234. package/dist/record/host/cli/index.js +10 -0
  235. package/dist/record/host/cli/index.js.map +1 -0
  236. package/dist/record/host/cli/presentation.cjs +122 -0
  237. package/dist/record/host/cli/presentation.cjs.map +1 -0
  238. package/dist/record/host/cli/presentation.d.cts +7 -0
  239. package/dist/record/host/cli/presentation.d.mts +7 -0
  240. package/dist/record/host/cli/presentation.d.ts +7 -0
  241. package/dist/record/host/cli/presentation.js +12 -0
  242. package/dist/record/host/cli/presentation.js.map +1 -0
  243. package/dist/record/host/index.cjs.map +1 -1
  244. package/dist/record/host/index.d.cts +1 -1
  245. package/dist/record/host/index.d.mts +1 -1
  246. package/dist/record/host/index.d.ts +1 -1
  247. package/dist/record/host/runtime.cjs +184 -1
  248. package/dist/record/host/runtime.cjs.map +1 -1
  249. package/dist/record/host/types.cjs.map +1 -1
  250. package/dist/record/host/types.d.cts +120 -0
  251. package/dist/record/host/types.d.mts +120 -0
  252. package/dist/record/host/types.d.ts +120 -0
  253. package/dist/record/project.json +6 -0
  254. package/dist/report/assets/styles.css +80 -0
  255. package/dist/report/cli/contribution.cjs +325 -0
  256. package/dist/report/cli/contribution.cjs.map +1 -0
  257. package/dist/report/cli/contribution.d.cts +143 -0
  258. package/dist/report/cli/contribution.d.mts +143 -0
  259. package/dist/report/cli/contribution.d.ts +143 -0
  260. package/dist/report/cli/contribution.js +12 -0
  261. package/dist/report/cli/contribution.js.map +1 -0
  262. package/dist/report/client-dist/app.js +9 -9
  263. package/dist/report/components/attempt-detail/content.cjs +1 -1
  264. package/dist/report/components/attempt-detail/content.cjs.map +1 -1
  265. package/dist/report/components/entity-lists/compute.cjs +5 -0
  266. package/dist/report/components/entity-lists/compute.cjs.map +1 -1
  267. package/dist/report/components/entity-lists/compute.d.cts +2 -0
  268. package/dist/report/components/entity-lists/compute.d.mts +2 -0
  269. package/dist/report/components/entity-lists/compute.d.ts +2 -0
  270. package/dist/report/components/entity-lists/content.cjs +35 -12
  271. package/dist/report/components/entity-lists/content.cjs.map +1 -1
  272. package/dist/report/components/entity-lists/index.cjs +0 -3
  273. package/dist/report/components/entity-lists/index.cjs.map +1 -1
  274. package/dist/report/components/summaries/index.cjs +2 -4
  275. package/dist/report/components/summaries/index.cjs.map +1 -1
  276. package/dist/report/definition/cell.cjs +7 -2
  277. package/dist/report/definition/cell.cjs.map +1 -1
  278. package/dist/report/definition/cell.d.cts +2 -0
  279. package/dist/report/definition/cell.d.mts +2 -0
  280. package/dist/report/definition/cell.d.ts +2 -0
  281. package/dist/report/definition/primitives/assertion-evidence.cjs +190 -4
  282. package/dist/report/definition/primitives/assertion-evidence.cjs.map +1 -1
  283. package/dist/report/definition/primitives/assertion-evidence.d.cts +4 -0
  284. package/dist/report/definition/primitives/assertion-evidence.d.mts +4 -0
  285. package/dist/report/definition/primitives/assertion-evidence.d.ts +4 -0
  286. package/dist/report/execution/machine.cjs +2 -3
  287. package/dist/report/execution/machine.cjs.map +1 -1
  288. package/dist/report/execution/machine.d.cts +11 -8
  289. package/dist/report/execution/machine.d.mts +11 -8
  290. package/dist/report/execution/machine.d.ts +11 -8
  291. package/dist/report/host/from-record.cjs +13 -8
  292. package/dist/report/host/from-record.cjs.map +1 -1
  293. package/dist/report/host/index.cjs +5 -1
  294. package/dist/report/host/index.cjs.map +1 -1
  295. package/dist/report/host/index.d.cts +1 -0
  296. package/dist/report/host/index.d.mts +1 -0
  297. package/dist/report/host/index.d.ts +1 -0
  298. package/dist/report/host/index.js +8 -2
  299. package/dist/report/host/index.mjs +8 -2
  300. package/dist/report/host/machine.cjs +23 -22
  301. package/dist/report/host/machine.cjs.map +1 -1
  302. package/dist/report/host/machine.d.cts +1 -1
  303. package/dist/report/host/machine.d.mts +1 -1
  304. package/dist/report/host/machine.d.ts +1 -1
  305. package/dist/report/host/node/loader.cjs +4 -2
  306. package/dist/report/host/node/loader.cjs.map +1 -1
  307. package/dist/report/host/node/loader.d.cts +3 -1
  308. package/dist/report/host/node/loader.d.mts +3 -1
  309. package/dist/report/host/node/loader.d.ts +3 -1
  310. package/dist/report/host/node.cjs +44 -9
  311. package/dist/report/host/node.cjs.map +1 -1
  312. package/dist/report/host/node.d.cts +13 -3
  313. package/dist/report/host/node.d.mts +13 -3
  314. package/dist/report/host/node.d.ts +13 -3
  315. package/dist/report/host/node.js +44 -32
  316. package/dist/report/host/operations.cjs +14 -0
  317. package/dist/report/host/operations.cjs.map +1 -0
  318. package/dist/report/host/operations.d.cts +39 -0
  319. package/dist/report/host/operations.d.mts +39 -0
  320. package/dist/report/host/operations.d.ts +39 -0
  321. package/dist/report/host/operations.js +10 -0
  322. package/dist/report/host/operations.js.map +1 -0
  323. package/dist/report/model/chart/plot.cjs +1 -1
  324. package/dist/report/model/chart/plot.cjs.map +1 -1
  325. package/dist/report/model/locale.cjs +4 -0
  326. package/dist/report/model/locale.cjs.map +1 -1
  327. package/dist/report/model/locale.d.cts +3 -1
  328. package/dist/report/model/locale.d.mts +3 -1
  329. package/dist/report/model/locale.d.ts +3 -1
  330. package/dist/report/react/styles.css +80 -0
  331. package/dist/runner/build-preparation.cjs +5 -5
  332. package/dist/runner/build-preparation.cjs.map +1 -1
  333. package/dist/runner/build-preparation.d.cts +2 -3
  334. package/dist/runner/build-preparation.d.mts +2 -3
  335. package/dist/runner/build-preparation.d.ts +2 -3
  336. package/dist/runner/feedback/coordinator.cjs +18 -15
  337. package/dist/runner/feedback/coordinator.cjs.map +1 -1
  338. package/dist/runner/feedback/coordinator.d.cts +6 -0
  339. package/dist/runner/feedback/coordinator.d.mts +6 -0
  340. package/dist/runner/feedback/coordinator.d.ts +6 -0
  341. package/dist/runner/ledger.cjs +3 -13
  342. package/dist/runner/ledger.cjs.map +1 -1
  343. package/dist/runner/ledger.d.cts +1 -3
  344. package/dist/runner/ledger.d.mts +1 -3
  345. package/dist/runner/ledger.d.ts +1 -3
  346. package/dist/runner/run.cjs +63 -18
  347. package/dist/runner/run.cjs.map +1 -1
  348. package/dist/runner/session.cjs +10 -0
  349. package/dist/runner/session.cjs.map +1 -1
  350. package/dist/runner/session.d.cts +25 -0
  351. package/dist/runner/session.d.mts +25 -0
  352. package/dist/runner/session.d.ts +25 -0
  353. package/dist/runner/types.cjs.map +1 -1
  354. package/dist/runner/types.d.cts +1 -2
  355. package/dist/runner/types.d.mts +1 -2
  356. package/dist/runner/types.d.ts +1 -2
  357. package/dist/sandbox/build-coordinator.cjs +38 -19
  358. package/dist/sandbox/build-coordinator.cjs.map +1 -1
  359. package/dist/sandbox/build-coordinator.d.cts +47 -7
  360. package/dist/sandbox/build-coordinator.d.mts +47 -7
  361. package/dist/sandbox/build-coordinator.d.ts +47 -7
  362. package/dist/sandbox/build-coordinator.js +8 -4
  363. package/dist/sandbox/cli/contribution.cjs +128 -0
  364. package/dist/sandbox/cli/contribution.cjs.map +1 -0
  365. package/dist/sandbox/cli/contribution.d.cts +71 -0
  366. package/dist/sandbox/cli/contribution.d.mts +71 -0
  367. package/dist/sandbox/cli/contribution.d.ts +71 -0
  368. package/dist/sandbox/cli/contribution.js +8 -0
  369. package/dist/sandbox/cli/contribution.js.map +1 -0
  370. package/dist/sandbox/cli-commands.cjs +14 -21
  371. package/dist/sandbox/cli-commands.cjs.map +1 -1
  372. package/dist/sandbox/cli-commands.d.cts +12 -8
  373. package/dist/sandbox/cli-commands.d.mts +12 -8
  374. package/dist/sandbox/cli-commands.d.ts +12 -8
  375. package/dist/sandbox/compose.cjs +22 -2
  376. package/dist/sandbox/compose.cjs.map +1 -1
  377. package/dist/sandbox/compose.d.cts +1 -1
  378. package/dist/sandbox/compose.d.mts +1 -1
  379. package/dist/sandbox/compose.d.ts +1 -1
  380. package/dist/sandbox/docker-profile/cli.cjs +13 -9
  381. package/dist/sandbox/docker-profile/cli.cjs.map +1 -1
  382. package/dist/sandbox/docker-profile/cli.d.cts +2 -0
  383. package/dist/sandbox/docker-profile/cli.d.mts +2 -0
  384. package/dist/sandbox/docker-profile/cli.d.ts +2 -0
  385. package/dist/sandbox/docker-profile/runtime.cjs +68 -7
  386. package/dist/sandbox/docker-profile/runtime.cjs.map +1 -1
  387. package/dist/sandbox/docker-profile/runtime.d.cts +19 -1
  388. package/dist/sandbox/docker-profile/runtime.d.mts +19 -1
  389. package/dist/sandbox/docker-profile/runtime.d.ts +19 -1
  390. package/dist/sandbox/docker-profile/runtime.js +10 -8
  391. package/dist/sandbox/docker-profile/schema.cjs +68 -19
  392. package/dist/sandbox/docker-profile/schema.cjs.map +1 -1
  393. package/dist/sandbox/docker-profile/schema.d.cts +23 -9
  394. package/dist/sandbox/docker-profile/schema.d.mts +23 -9
  395. package/dist/sandbox/docker-profile/schema.d.ts +23 -9
  396. package/dist/sandbox/docker-task-build-cache.cjs +532 -0
  397. package/dist/sandbox/docker-task-build-cache.cjs.map +1 -0
  398. package/dist/sandbox/docker-task-build-cache.d.cts +68 -0
  399. package/dist/sandbox/docker-task-build-cache.d.mts +68 -0
  400. package/dist/sandbox/docker-task-build-cache.d.ts +68 -0
  401. package/dist/sandbox/docker-task-build-cache.js +20 -0
  402. package/dist/sandbox/docker-task-build-cache.js.map +1 -0
  403. package/dist/sandbox/docker.cjs +50 -0
  404. package/dist/sandbox/docker.cjs.map +1 -1
  405. package/dist/sandbox/docker.d.cts +15 -0
  406. package/dist/sandbox/docker.d.mts +15 -0
  407. package/dist/sandbox/docker.d.ts +15 -0
  408. package/dist/sandbox/dockerfile-build.cjs +55 -5
  409. package/dist/sandbox/dockerfile-build.cjs.map +1 -1
  410. package/dist/sandbox/dockerfile-build.d.cts +2 -2
  411. package/dist/sandbox/dockerfile-build.d.mts +2 -2
  412. package/dist/sandbox/dockerfile-build.d.ts +2 -2
  413. package/dist/sandbox/index.cjs +5 -3
  414. package/dist/sandbox/index.cjs.map +1 -1
  415. package/dist/sandbox/index.d.cts +4 -3
  416. package/dist/sandbox/index.d.mts +4 -3
  417. package/dist/sandbox/index.d.ts +4 -3
  418. package/dist/sandbox/index.js +16 -14
  419. package/dist/sandbox/index.mjs +16 -14
  420. package/dist/sandbox/keep.cjs +1 -3
  421. package/dist/sandbox/keep.cjs.map +1 -1
  422. package/dist/sandbox/layer.cjs +70 -79
  423. package/dist/sandbox/layer.cjs.map +1 -1
  424. package/dist/sandbox/layer.d.cts +6 -12
  425. package/dist/sandbox/layer.d.mts +6 -12
  426. package/dist/sandbox/layer.d.ts +6 -12
  427. package/dist/sandbox/layer.js +16 -18
  428. package/dist/sandbox/ledger-paths.cjs +4 -18
  429. package/dist/sandbox/ledger-paths.cjs.map +1 -1
  430. package/dist/sandbox/ledger-paths.d.cts +3 -13
  431. package/dist/sandbox/ledger-paths.d.mts +3 -13
  432. package/dist/sandbox/ledger-paths.d.ts +3 -13
  433. package/dist/sandbox/ledger-paths.js +4 -8
  434. package/dist/sandbox/registry.cjs +1 -1
  435. package/dist/sandbox/registry.cjs.map +1 -1
  436. package/dist/sandbox/runtime.cjs +27 -37
  437. package/dist/sandbox/runtime.cjs.map +1 -1
  438. package/dist/sandbox/runtime.d.cts +1 -2
  439. package/dist/sandbox/runtime.d.mts +1 -2
  440. package/dist/sandbox/runtime.d.ts +1 -2
  441. package/dist/sandbox/runtime.js +6 -8
  442. package/dist/sandbox/types.cjs.map +1 -1
  443. package/dist/sandbox/types.d.cts +3 -3
  444. package/dist/sandbox/types.d.mts +3 -3
  445. package/dist/sandbox/types.d.ts +3 -3
  446. package/dist/sources/project.json +6 -0
  447. package/dist/vendor/remark/remark-gfm.cjs +72 -72
  448. package/dist/vendor/remark/remark-gfm.cjs.map +1 -1
  449. package/dist/vendor/remark/remark-parse.cjs +54 -54
  450. package/dist/vendor/remark/remark-parse.cjs.map +1 -1
  451. package/dist/vendor/remark/remark.cjs +125 -125
  452. package/dist/vendor/remark/remark.cjs.map +2 -2
  453. package/docs-site/zh/README.md +1 -1
  454. package/docs-site/zh/explanation/assert.mdx +4 -0
  455. package/docs-site/zh/explanation/judge.mdx +40 -9
  456. package/docs-site/zh/reference/cli.mdx +67 -43
  457. package/docs-site/zh/reference/define-agent.mdx +2 -2
  458. package/docs-site/zh/reference/report-components.mdx +4 -3
  459. package/docs-site/zh/troubleshooting/debug-sandbox.mdx +6 -0
  460. package/docs-site/zh/troubleshooting/debugging.mdx +28 -1
  461. package/docs-site/zh/tutorials/agent-feedback-loop.mdx +4 -2
  462. package/docs-site/zh/tutorials/concurrency.mdx +2 -2
  463. package/docs-site/zh/tutorials/custom-reports.mdx +175 -9
  464. package/docs-site/zh/tutorials/docker-in-docker.mdx +52 -7
  465. package/docs-site/zh/tutorials/eval-groups.mdx +1 -2
  466. package/docs-site/zh/tutorials/evaluation-kinds.mdx +39 -6
  467. package/docs-site/zh/tutorials/nixos-managed-dind.mdx +14 -5
  468. package/docs-site/zh/tutorials/sandbox-providers.mdx +1 -28
  469. package/docs-site/zh/tutorials/sandbox-reuse.mdx +1 -1
  470. package/docs-site/zh/tutorials/viewing-results.mdx +2 -0
  471. package/package.json +24 -19
  472. package/README.md +0 -176
  473. package/README.zh.md +0 -176
  474. package/dist/cli/record.cjs +0 -246
  475. package/dist/cli/record.cjs.map +0 -1
  476. package/dist/cli/record.d.cts +0 -40
  477. package/dist/cli/record.d.mts +0 -40
  478. package/dist/cli/record.d.ts +0 -40
  479. package/dist/cli/record.js +0 -10
  480. package/dist/cli/record.js.map +0 -1
  481. package/dist/sandbox/local.cjs +0 -361
  482. package/dist/sandbox/local.cjs.map +0 -1
  483. package/dist/sandbox/local.d.cts +0 -80
  484. package/dist/sandbox/local.d.mts +0 -80
  485. package/dist/sandbox/local.d.ts +0 -80
  486. package/dist/sandbox/local.js +0 -6
  487. package/dist/sandbox/local.js.map +0 -1
@@ -202,6 +202,16 @@ class SessionTracker {
202
202
  }
203
203
  /** coordinator 的同步事件回调;只更新最小索引并把 snapshot 交给 Effect-owned serial worker。 */
204
204
  onFeedback(event, _state) {
205
+ if (event.type === "attempt:start" ||
206
+ event.type === "attempt:complete" ||
207
+ event.type === "attempt:early-exit" ||
208
+ event.type === "lock-wait" ||
209
+ event.type === "experiment-hook") {
210
+ this.onInvocationEvent(event);
211
+ }
212
+ }
213
+ /** Host-side observer bridge; no runtime is started from a synchronous callback. */
214
+ onInvocationEvent(event) {
205
215
  if (!this.started || this.closed || this.record === undefined || this.record.status !== "active")
206
216
  return;
207
217
  const identity = "identity" in event && event.identity !== undefined ? event.identity : undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"session.js","sourceRoot":"","sources":["session.ts"],"names":[],"mappings":"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","sourcesContent":["// Experiment Invocation 的轻量 Session 索引。\n//\n// Session 只回答「哪一批 Run 由同一次 exp 调度、当前是否仍活跃」;完整的\n// Attempt / verdict / artifact 继续由 Run 记录保存。所有写入都走逐条目原子\n// 文件原语,Session 不参与用例锁或实验级闸的判定。\nimport { randomUUID } from \"node:crypto\";\nimport { join } from \"node:path\";\nimport { t } from \"../i18n/index.ts\";\nimport { Cause, Deferred, Effect, Exit, Fiber, Queue, Scope } from \"effect\";\nimport { readAllEntryFilesEffect, writeEntryFileEffect } from \"../shared/entry-file-store.ts\";\nimport type { CompletionStatus, InvocationCompletion, InvocationReceipt, RunFeedbackEvent, RunFeedbackState, } from \"./types.ts\";\nimport type { AgentRun } from \"./types.ts\";\nexport const SESSION_HEARTBEAT_INTERVAL_MS = 10000;\nexport const SESSION_EXPIRY_MS = 30000;\nexport type SessionExperimentState = \"setup\" | \"running\" | \"waiting\" | \"teardown\";\nexport type SessionStatus = \"active\" | \"completed\" | \"incomplete\" | \"interrupted\";\nexport interface SessionExperimentRecord {\n experimentId: string;\n runId: string;\n /** The Record v1 receipt confirmed that this draft reached a complete marker. */\n published?: boolean;\n state?: SessionExperimentState;\n running?: number;\n queued?: number;\n elsewhere?: number;\n}\nexport interface SessionRecord {\n sessionId: string;\n pid: number;\n startedAt: string;\n status: SessionStatus;\n experiments: SessionExperimentRecord[];\n heartbeatAt?: string;\n completedAt?: string;\n completion?: InvocationCompletion;\n}\nexport interface ExpiredSessionRecord {\n sessionId: string;\n pid: number;\n startedAt: string;\n heartbeatAt?: string;\n}\nexport interface SessionListDocument {\n format: \"niceeval.sessions\";\n sessions: SessionRecord[];\n expired: ExpiredSessionRecord[];\n}\nexport interface SessionShowDocument {\n format: \"niceeval.session\";\n session: SessionRecord | ExpiredSessionRecord;\n expired?: boolean;\n}\nexport interface SessionStartInput {\n runIds: ReadonlyMap<string, string>;\n agentRuns: readonly AgentRun[];\n /** 已规划、可携入的 attempt 数;用于创建记录时准确初始化 queued。 */\n carriedAttemptsByKey?: ReadonlyMap<string, ReadonlySet<number>>;\n startedAt?: string;\n pid?: number;\n}\nexport interface SessionCloseInput {\n status?: CompletionStatus | SessionStatus;\n completion?: InvocationCompletion;\n /** Only IDs in this receipt are safe targets for `niceeval show --run`. */\n receipt?: InvocationReceipt;\n completedAt?: string;\n}\nfunction sessionsDirOf(niceevalRoot: string): string {\n return join(niceevalRoot, \"sessions\");\n}\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n ? value as Record<string, unknown>\n : undefined;\n}\nfunction isTimestamp(value: unknown): value is string {\n return typeof value === \"string\" && Number.isFinite(Date.parse(value));\n}\nfunction isPositiveInteger(value: unknown): value is number {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value > 0;\n}\nfunction isNonNegativeInteger(value: unknown): value is number {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value >= 0;\n}\nfunction decodeExperiment(value: unknown): SessionExperimentRecord | undefined {\n const raw = asRecord(value);\n if (raw === undefined || typeof raw.experimentId !== \"string\" || typeof raw.runId !== \"string\")\n return undefined;\n if (raw.published !== undefined && typeof raw.published !== \"boolean\")\n return undefined;\n const state = raw.state;\n if (state !== undefined && state !== \"setup\" && state !== \"running\" && state !== \"waiting\" && state !== \"teardown\") {\n return undefined;\n }\n for (const key of [\"running\", \"queued\", \"elsewhere\"] as const) {\n if (raw[key] !== undefined && !isNonNegativeInteger(raw[key]))\n return undefined;\n }\n const running = raw.running;\n const queued = raw.queued;\n const elsewhere = raw.elsewhere;\n return {\n experimentId: raw.experimentId,\n runId: raw.runId,\n ...(raw.published === true ? { published: true } : {}),\n ...(state !== undefined ? { state } : {}),\n ...(running !== undefined ? { running: running as number } : {}),\n ...(queued !== undefined ? { queued: queued as number } : {}),\n ...(elsewhere !== undefined ? { elsewhere: elsewhere as number } : {}),\n };\n}\n/** 完整读取边界:损坏/未知格式条目从查询中跳过,不拖垮整个目录。 */\nexport function decodeSession(value: unknown): SessionRecord | undefined {\n const raw = asRecord(value);\n if (raw === undefined ||\n typeof raw.sessionId !== \"string\" ||\n !isPositiveInteger(raw.pid) ||\n !isTimestamp(raw.startedAt) ||\n (raw.status !== \"active\" && raw.status !== \"completed\" && raw.status !== \"incomplete\" && raw.status !== \"interrupted\") ||\n !Array.isArray(raw.experiments))\n return undefined;\n if (raw.heartbeatAt !== undefined && !isTimestamp(raw.heartbeatAt))\n return undefined;\n if (raw.completedAt !== undefined && !isTimestamp(raw.completedAt))\n return undefined;\n const experiments = raw.experiments.map(decodeExperiment);\n if (experiments.some((item) => item === undefined))\n return undefined;\n return {\n sessionId: raw.sessionId,\n pid: raw.pid,\n startedAt: raw.startedAt,\n status: raw.status,\n experiments: experiments as SessionExperimentRecord[],\n ...(raw.heartbeatAt !== undefined ? { heartbeatAt: raw.heartbeatAt } : {}),\n ...(raw.completedAt !== undefined ? { completedAt: raw.completedAt } : {}),\n ...(raw.completion !== undefined && asRecord(raw.completion) !== undefined\n ? { completion: raw.completion as InvocationCompletion }\n : {}),\n };\n}\nfunction keyOf(experimentId: string, evalId: string): string {\n // 与 runner/sandbox-selection.ts 的 runPairKey 保持同形,但避免运行时依赖造成循环导入。\n return experimentId.includes(\"|\") || evalId.includes(\"|\")\n ? JSON.stringify([experimentId, evalId])\n : `${experimentId}|${evalId}`;\n}\nfunction sessionStatusOf(status: CompletionStatus | SessionStatus | undefined): SessionStatus {\n if (status === \"complete\" || status === \"completed\" || status === undefined)\n return \"completed\";\n if (status === \"interrupted\")\n return \"interrupted\";\n return \"incomplete\";\n}\nfunction cloneRecord(record: SessionRecord): SessionRecord {\n return {\n ...record,\n experiments: record.experiments.map((experiment) => ({ ...experiment })),\n ...(record.completion ? { completion: { ...record.completion, reporterErrors: [...record.completion.reporterErrors] } } : {}),\n };\n}\ntype SessionPersistenceRequest = {\n readonly _tag: \"write\";\n readonly snapshot: SessionRecord;\n /** 缺席时是反馈索引的尽力写;失败不影响 attempt 判定。 */\n readonly completion?: Deferred.Deferred<void, unknown>;\n} | {\n readonly _tag: \"barrier\";\n readonly completion: Deferred.Deferred<void, unknown>;\n};\n/**\n * Session 的 Effect 资源组刻意不绑定 `start()` 调用点的 Scope:`runEvals()` 自己会\n * 在 dispatch 完成时关闭内部 Scope,但 CLI 仍要在随后拿到 receipt 后再写最终 completed\n * Session。调用方的 `close()`(CLI 已有的 finalizer)才是这一组 worker/timer 的唯一\n * 释放边界。\n */\ninterface SessionPersistence {\n readonly scope: Scope.CloseableScope;\n readonly requests: Queue.Queue<SessionPersistenceRequest>;\n readonly worker: Fiber.RuntimeFiber<void, never>;\n heartbeat?: Fiber.RuntimeFiber<never, never>;\n accepting: boolean;\n stopped: boolean;\n}\n/**\n * 在 Effect 中等一段不会让 Node 进程仅因 Session 心跳而存活的时间。中断会清掉当前 timer;\n * 这保留旧 `setInterval(...).unref()` 的进程退出语义,同时不会把定时器生命周期漏到 Effect\n * 之外。\n */\nfunction unrefDelayEffect(milliseconds: number): Effect.Effect<void> {\n return Effect.async<void>((resume) => {\n const timer = setTimeout(() => resume(Effect.void), milliseconds);\n timer.unref?.();\n return Effect.sync(() => clearTimeout(timer));\n });\n}\n/** 可持久化的 Session 生命周期;所有磁盘 I/O 由一个 Effect worker 按入队顺序串行化。 */\nexport class SessionTracker {\n readonly niceevalRoot: string;\n readonly sessionId: string;\n private record: SessionRecord | undefined;\n private persistence: SessionPersistence | undefined;\n private started = false;\n private closed = false;\n constructor(niceevalRoot: string, sessionId = `s_${randomUUID()}`) {\n this.niceevalRoot = niceevalRoot;\n this.sessionId = sessionId;\n }\n get current(): SessionRecord | undefined {\n return this.record === undefined ? undefined : cloneRecord(this.record);\n }\n /**\n * Effect 主入口:先完成第一份 durable snapshot,再开始心跳。持久化 Scope 跨过\n * `runEvals()` 的内部 Scope,由 closeEffect 关闭,因而最终 receipt 不会被抢先截断。\n */\n start(input: SessionStartInput): Effect.Effect<SessionRecord, unknown> {\n let persistence: SessionPersistence | undefined;\n return Effect.gen(this, function* () {\n if (this.started)\n return yield* Effect.fail(new Error(\"SessionTracker.start() called more than once.\"));\n const scope = yield* Scope.make();\n const requests = yield* Queue.unbounded<SessionPersistenceRequest>();\n const worker = yield* Effect.forkIn(this.persistenceWorkerEffect(requests), scope);\n persistence = { scope, requests, worker, accepting: true, stopped: false };\n this.persistence = persistence;\n this.started = true;\n const startedAt = input.startedAt ?? new Date().toISOString();\n const carried = input.carriedAttemptsByKey;\n const experiments: SessionExperimentRecord[] = [];\n for (const run of input.agentRuns) {\n if (run.experimentId === undefined)\n continue;\n const runId = input.runIds.get(run.experimentId);\n if (runId === undefined)\n continue;\n const planned = run.selectedEvalIds.length * run.attempts;\n const carriedCount = run.selectedEvalIds.reduce((count, evalId) => count + (carried?.get(keyOf(run.experimentId!, evalId))?.size ?? 0), 0);\n const queued = Math.max(0, planned - carriedCount);\n experiments.push({\n experimentId: run.experimentId,\n runId,\n state: run.setup && queued > 0 ? \"setup\" : \"running\",\n running: 0,\n queued,\n elsewhere: 0,\n });\n }\n const now = new Date().toISOString();\n this.record = {\n sessionId: this.sessionId,\n pid: input.pid ?? process.pid,\n startedAt,\n status: \"active\",\n heartbeatAt: now,\n experiments,\n };\n // Unlike feedback snapshots, the initial entry is a durable boundary:\n // dispatch must not start until it has either reached disk or failed.\n yield* this.flush();\n persistence.heartbeat = yield* Effect.forkIn(this.heartbeatLoopEffect(), scope);\n return this.current!;\n }).pipe(\n // A failed first write must not leave the manually held Scope (or its\n // queue worker) alive. Preserve the original failure after cleanup.\n Effect.onError((cause) => persistence === undefined\n ? Effect.void\n : this.stopPersistenceEffect(persistence, Exit.failCause(cause)).pipe(Effect.ignore)));\n }\n /** coordinator 的同步事件回调;只更新最小索引并把 snapshot 交给 Effect-owned serial worker。 */\n onFeedback(event: RunFeedbackEvent, _state?: RunFeedbackState): void {\n if (!this.started || this.closed || this.record === undefined || this.record.status !== \"active\")\n return;\n const identity = \"identity\" in event && event.identity !== undefined ? event.identity : undefined;\n const experimentId = identity\n ? identity.experimentId\n : \"experimentId\" in event\n ? event.experimentId\n : undefined;\n const experiment = experimentId === undefined\n ? undefined\n : this.record.experiments.find((item) => item.experimentId === experimentId);\n let changed = false;\n if (event.type === \"attempt:start\" && experiment) {\n experiment.queued = Math.max(0, (experiment.queued ?? 0) - 1);\n experiment.running = (experiment.running ?? 0) + 1;\n experiment.state = \"running\";\n changed = true;\n }\n else if (event.type === \"attempt:complete\" && experiment) {\n experiment.running = Math.max(0, (experiment.running ?? 0) - 1);\n this.refreshState(experiment);\n changed = true;\n }\n else if (event.type === \"attempt:early-exit\" && experiment) {\n experiment.queued = Math.max(0, (experiment.queued ?? 0) - 1);\n this.refreshState(experiment);\n changed = true;\n }\n else if (event.type === \"lock-wait\" && experiment) {\n if (event.status === \"started\") {\n const attempts = event.attempts ?? 1;\n experiment.queued = Math.max(0, (experiment.queued ?? 0) - attempts);\n experiment.elsewhere = (experiment.elsewhere ?? 0) + attempts;\n experiment.state = \"waiting\";\n changed = true;\n }\n else {\n const moved = (event.carried ?? 0) + (event.dispatched ?? 0);\n experiment.elsewhere = Math.max(0, (experiment.elsewhere ?? 0) - moved);\n experiment.queued = (experiment.queued ?? 0) + (event.dispatched ?? 0);\n this.refreshState(experiment);\n changed = true;\n }\n }\n else if (event.type === \"experiment-hook\" && experiment) {\n if (event.status === \"started\")\n experiment.state = event.hook === \"setup\" ? \"setup\" : \"teardown\";\n else\n this.refreshState(experiment);\n changed = true;\n }\n if (changed)\n this.enqueuePersist();\n }\n private refreshState(experiment: SessionExperimentRecord): void {\n if ((experiment.elsewhere ?? 0) > 0 && (experiment.running ?? 0) === 0) {\n experiment.state = \"waiting\";\n }\n else if ((experiment.running ?? 0) > 0 || (experiment.queued ?? 0) > 0) {\n experiment.state = \"running\";\n }\n else {\n experiment.state = \"teardown\";\n }\n }\n /** 一次可观察的 heartbeat;显式调用者会收到本次 flush 的真实 I/O failure。 */\n heartbeat(): Effect.Effect<void, unknown> {\n return Effect.suspend(() => {\n if (!this.started || this.closed || this.record === undefined || this.record.status !== \"active\")\n return Effect.void;\n this.record.heartbeatAt = new Date().toISOString();\n return this.flush();\n });\n }\n /**\n * 完成最终 Session:先停止 heartbeat,再把完成 snapshot 排在所有既有反馈写之后。该收尾\n * 区域不可中断,避免 interruption 留下 active 条目或后台 Fiber。\n */\n close(input: SessionCloseInput = {}): Effect.Effect<SessionRecord | undefined, unknown> {\n return Effect.uninterruptible(Effect.suspend(() => {\n if (!this.started || this.record === undefined || this.closed)\n return Effect.succeed(this.current);\n this.closed = true;\n const now = new Date().toISOString();\n this.record.status = sessionStatusOf(input.status);\n this.record.completedAt = input.completedAt ?? now;\n delete this.record.heartbeatAt;\n if (input.completion !== undefined)\n this.record.completion = input.completion;\n const publishedRunIds = new Set(input.receipt?.runIds ?? []);\n for (const experiment of this.record.experiments) {\n if (publishedRunIds.has(experiment.runId))\n experiment.published = true;\n else\n delete experiment.published;\n delete experiment.state;\n delete experiment.running;\n delete experiment.queued;\n delete experiment.elsewhere;\n }\n const snapshot = cloneRecord(this.record);\n const persistence = this.persistence;\n const persist = persistence === undefined\n ? writeEntryFileEffect(sessionsDirOf(this.niceevalRoot), this.sessionId, snapshot)\n : this.stopPersistenceEffect(persistence, Exit.void, snapshot);\n return persist.pipe(Effect.as(this.current));\n }));\n }\n /** 按入队顺序强制写出当前 snapshot;worker 已关闭后退化为同一条 *Effect 原语的直接写。 */\n private flush(): Effect.Effect<void, unknown> {\n return Effect.suspend(() => {\n if (this.record === undefined)\n return Effect.void;\n const snapshot = cloneRecord(this.record);\n const persistence = this.persistence;\n return persistence !== undefined && persistence.accepting && !persistence.stopped\n ? this.offerWriteEffect(persistence, snapshot)\n : writeEntryFileEffect(sessionsDirOf(this.niceevalRoot), this.sessionId, snapshot);\n });\n }\n private enqueuePersist(): void {\n const persistence = this.persistence;\n if (this.record === undefined ||\n persistence === undefined ||\n !persistence.accepting ||\n persistence.stopped)\n return;\n const snapshot = cloneRecord(this.record);\n // 反馈 API 受 coordinator 的同步 callback 契约限制,不能在这里启动 runtime。Queue 是\n // Effect worker 的同步入口;false 只会发生在 close 已关闭队列的竞态,此时最终 flush\n // 已覆盖当前 record。\n Queue.unsafeOffer(persistence.requests, { _tag: \"write\", snapshot });\n }\n private persistenceWorkerEffect(requests: Queue.Queue<SessionPersistenceRequest>): Effect.Effect<void> {\n const handle = (request: SessionPersistenceRequest): Effect.Effect<void> => {\n if (request._tag === \"barrier\") {\n return Deferred.succeed(request.completion, undefined).pipe(Effect.asVoid);\n }\n // Each request owns a frozen snapshot. Capture the full Exit before\n // settling its waiter so a failed heartbeat cannot kill the serial\n // worker; a later state change is still allowed to retry the index write.\n return writeEntryFileEffect(sessionsDirOf(this.niceevalRoot), this.sessionId, request.snapshot).pipe(Effect.exit, Effect.flatMap((exit) => request.completion === undefined\n ? Effect.void\n : Deferred.done(request.completion, exit).pipe(Effect.asVoid)));\n };\n return Effect.forever(Queue.take(requests).pipe(Effect.flatMap(handle))).pipe(\n // Queue shutdown interrupts its pending take. A different cause is a\n // broken worker invariant and stays a defect instead of being erased.\n Effect.catchAllCause((cause) => Cause.isInterruptedOnly(cause) ? Effect.void : Effect.die(cause)));\n }\n private heartbeatLoopEffect(): Effect.Effect<never> {\n return Effect.forever(unrefDelayEffect(SESSION_HEARTBEAT_INTERVAL_MS).pipe(\n // Heartbeats are observability only. Explicit heartbeat callers\n // receive failures; the background loop deliberately retries later.\n Effect.zipRight(this.heartbeat().pipe(Effect.ignore))));\n }\n private offerWriteEffect(persistence: SessionPersistence, snapshot: SessionRecord): Effect.Effect<void, unknown> {\n return Effect.gen(function* () {\n const completion = yield* Deferred.make<void, unknown>();\n const accepted = yield* Effect.sync(() => Queue.unsafeOffer(persistence.requests, { _tag: \"write\", snapshot, completion }));\n if (!accepted)\n return yield* Effect.fail(new Error(\"Session persistence queue closed before flush.\"));\n yield* Deferred.await(completion);\n });\n }\n private barrierEffect(persistence: SessionPersistence): Effect.Effect<void, unknown> {\n return Effect.gen(function* () {\n const completion = yield* Deferred.make<void, unknown>();\n const accepted = yield* Effect.sync(() => Queue.unsafeOffer(persistence.requests, { _tag: \"barrier\", completion }));\n if (!accepted)\n return yield* Effect.fail(new Error(\"Session persistence queue closed before drain.\"));\n yield* Deferred.await(completion);\n });\n }\n /**\n * 停止顺序固定为:拒绝新反馈 → 等 heartbeat 停稳 → FIFO flush/barrier → shutdown queue →\n * close Scope。因而 final snapshot 不会被较早的后台写覆盖,且任一路径都会终结两条 Fiber。\n */\n private stopPersistenceEffect(persistence: SessionPersistence, exit: Exit.Exit<unknown, unknown>, finalSnapshot?: SessionRecord): Effect.Effect<void, unknown> {\n return Effect.uninterruptible(Effect.suspend(() => {\n if (persistence.stopped)\n return Effect.void;\n persistence.accepting = false;\n const stopHeartbeat = persistence.heartbeat === undefined\n ? Effect.void\n : Fiber.interrupt(persistence.heartbeat).pipe(Effect.asVoid);\n const drain = finalSnapshot === undefined\n ? this.barrierEffect(persistence)\n : this.offerWriteEffect(persistence, finalSnapshot);\n return stopHeartbeat.pipe(Effect.zipRight(drain), Effect.ensuring(this.releasePersistenceEffect(persistence, exit)));\n }));\n }\n private releasePersistenceEffect(persistence: SessionPersistence, exit: Exit.Exit<unknown, unknown>): Effect.Effect<void> {\n return Effect.uninterruptible(Effect.suspend(() => {\n if (persistence.stopped)\n return Effect.void;\n persistence.stopped = true;\n if (this.persistence === persistence)\n this.persistence = undefined;\n return Queue.shutdown(persistence.requests).pipe(Effect.zipRight(Scope.close(persistence.scope, exit)));\n }));\n }\n}\nexport function isSessionExpired(record: SessionRecord, nowMs = Date.now()): boolean {\n if (record.status !== \"active\")\n return false;\n const heartbeatMs = Date.parse(record.heartbeatAt ?? \"\");\n return !Number.isFinite(heartbeatMs) || nowMs - heartbeatMs > SESSION_EXPIRY_MS;\n}\nfunction expiredProjection(record: SessionRecord): ExpiredSessionRecord {\n return {\n sessionId: record.sessionId,\n pid: record.pid,\n startedAt: record.startedAt,\n ...(record.heartbeatAt !== undefined ? { heartbeatAt: record.heartbeatAt } : {}),\n };\n}\n/** 完整读取边界仍由 entry-file-store 的 decoder 容错纪律拥有。 */\nexport function readSessions(niceevalRoot: string): Effect.Effect<SessionRecord[], unknown> {\n return readAllEntryFilesEffect(sessionsDirOf(niceevalRoot), decodeSession).pipe(Effect.map((entries) => entries.map(({ entry }) => entry).sort((a, b) => a.startedAt.localeCompare(b.startedAt))));\n}\nexport function sessionListDocument(records: readonly SessionRecord[], options: {\n all?: boolean;\n selector?: string;\n nowMs?: number;\n} = {}): SessionListDocument {\n const selector = options.selector;\n const matches = (record: SessionRecord): boolean => selector === undefined || record.experiments.some((experiment) => experiment.experimentId.startsWith(selector));\n const sessions: SessionRecord[] = [];\n const expired: ExpiredSessionRecord[] = [];\n for (const record of records) {\n if (!matches(record))\n continue;\n if (isSessionExpired(record, options.nowMs)) {\n expired.push(expiredProjection(record));\n }\n else if (record.status === \"active\" || options.all === true) {\n sessions.push(cloneRecord(record));\n }\n }\n return { format: \"niceeval.sessions\", sessions, expired };\n}\nexport function listSessions(niceevalRoot: string, options: {\n all?: boolean;\n selector?: string;\n nowMs?: number;\n} = {}): Effect.Effect<SessionListDocument, unknown> {\n return readSessions(niceevalRoot).pipe(Effect.map((records) => sessionListDocument(records, options)));\n}\nexport function resolveSessionPrefix(records: readonly SessionRecord[], prefix: string): SessionRecord {\n const matches = records.filter((record) => record.sessionId === prefix || record.sessionId.startsWith(prefix));\n if (matches.length === 0)\n throw new Error(`No session matched: ${prefix}`);\n if (matches.length > 1) {\n throw new Error(`Ambiguous session prefix ${prefix}. Candidates: ${matches.map((record) => record.sessionId).join(\", \")}`);\n }\n return cloneRecord(matches[0]!);\n}\nexport function showSession(niceevalRoot: string, prefix: string, nowMs = Date.now()): Effect.Effect<SessionShowDocument, unknown> {\n return readSessions(niceevalRoot).pipe(Effect.map((records) => {\n const record = resolveSessionPrefix(records, prefix);\n const expired = isSessionExpired(record, nowMs);\n return {\n format: \"niceeval.session\",\n session: expired ? expiredProjection(record) : record,\n ...(expired ? { expired: true } : {}),\n };\n }));\n}\nfunction shortRunId(runId: string): string {\n return runId.slice(0, 8);\n}\nfunction ageLabel(iso: string, nowMs: number): string {\n const elapsed = Math.max(0, nowMs - Date.parse(iso));\n if (elapsed < 1000)\n return \"now\";\n if (elapsed < 60000)\n return `${Math.floor(elapsed / 1000)}s ago`;\n if (elapsed < 3600000)\n return `${Math.floor(elapsed / 60000)}m ago`;\n return `${Math.floor(elapsed / 3600000)}h ago`;\n}\nfunction renderExperimentLine(experiment: SessionExperimentRecord, published: boolean): string {\n if (published) {\n return ` ${experiment.experimentId} niceeval show --run ${experiment.runId}`;\n }\n const counters = [\n experiment.running ? `${experiment.running} running` : \"\",\n experiment.queued ? `${experiment.queued} queued` : \"\",\n experiment.elsewhere ? `${experiment.elsewhere} elsewhere` : \"\",\n ].filter(Boolean);\n return ` ${experiment.experimentId} @run:${shortRunId(experiment.runId)} ${experiment.state ?? \"running\"}${counters.length ? ` · ${counters.join(\" · \")}` : \"\"}`;\n}\nfunction publishedForSession(experiment: SessionExperimentRecord, status: SessionStatus): boolean {\n // Older session entries have no receipt marker. Preserve their established\n // completed/interrupted behavior while new entries rely on the exact receipt.\n return experiment.published ?? (status === \"completed\" || status === \"interrupted\");\n}\nexport function renderSessionListText(document: SessionListDocument, nowMs = Date.now(), all = false): string {\n const lines: string[] = [`ACTIVE SESSIONS (${document.sessions.filter((session) => session.status === \"active\").length})`];\n const active = document.sessions.filter((session) => session.status === \"active\");\n if (active.length === 0)\n lines.push(\"(none)\");\n for (const session of active) {\n lines.push(`${session.sessionId} · pid ${session.pid} · ${ageLabel(session.startedAt, nowMs)} · heartbeat ${ageLabel(session.heartbeatAt ?? session.startedAt, nowMs)}`);\n lines.push(...session.experiments.map((experiment) => renderExperimentLine(experiment, false)));\n }\n if (all) {\n const completed = document.sessions.filter((session) => session.status !== \"active\");\n lines.push(`COMPLETED SESSIONS (${completed.length})`);\n if (completed.length === 0)\n lines.push(\"(none)\");\n for (const session of completed) {\n lines.push(`${session.sessionId} · pid ${session.pid} · ${session.status} · completed ${session.completedAt ?? \"—\"}`);\n lines.push(...session.experiments.map((experiment) => renderExperimentLine(experiment, publishedForSession(experiment, session.status))));\n }\n if (document.expired.length > 0) {\n lines.push(`EXPIRED SESSIONS (${document.expired.length})`);\n for (const expired of document.expired) {\n lines.push(`${expired.sessionId} · pid ${expired.pid} · heartbeat ${expired.heartbeatAt ?? \"unknown\"} · ${t(\"session.rerunOriginal\")}`);\n }\n }\n }\n return `${lines.join(\"\\n\")}\\n`;\n}\nexport function renderSessionShowText(document: SessionShowDocument): string {\n const session = document.session;\n const lines = [`SESSION ${session.sessionId}${document.expired ? \" · EXPIRED\" : \"\"}`, `pid ${session.pid} · started ${session.startedAt}`];\n if (\"status\" in session)\n lines.push(`status ${session.status}${session.completedAt ? ` · completed ${session.completedAt}` : \"\"}`);\n if (\"experiments\" in session) {\n lines.push(...session.experiments.map((experiment) => renderExperimentLine(experiment, publishedForSession(experiment, session.status))));\n }\n if (document.expired)\n lines.push(t(\"session.nextRerunOriginal\"));\n return `${lines.join(\"\\n\")}\\n`;\n}\n"]}
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["session.ts"],"names":[],"mappings":"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","sourcesContent":["// Experiment Invocation 的轻量 Session 索引。\n//\n// Session 只回答「哪一批 Run 由同一次 exp 调度、当前是否仍活跃」;完整的\n// Attempt / verdict / artifact 继续由 Run 记录保存。所有写入都走逐条目原子\n// 文件原语,Session 不参与用例锁或实验级闸的判定。\nimport { randomUUID } from \"node:crypto\";\nimport { join } from \"node:path\";\nimport { t } from \"../i18n/index.ts\";\nimport { Cause, Deferred, Effect, Exit, Fiber, Queue, Scope } from \"effect\";\nimport { readAllEntryFilesEffect, writeEntryFileEffect } from \"../shared/entry-file-store.ts\";\nimport type { CompletionStatus, InvocationCompletion, InvocationReceipt, RunFeedbackEvent, RunFeedbackState, } from \"./types.ts\";\nimport type { AgentRun } from \"./types.ts\";\nexport const SESSION_HEARTBEAT_INTERVAL_MS = 10000;\nexport const SESSION_EXPIRY_MS = 30000;\nexport type SessionExperimentState = \"setup\" | \"running\" | \"waiting\" | \"teardown\";\nexport type SessionStatus = \"active\" | \"completed\" | \"incomplete\" | \"interrupted\";\nexport interface SessionExperimentRecord {\n experimentId: string;\n runId: string;\n /** The Record v1 receipt confirmed that this draft reached a complete marker. */\n published?: boolean;\n state?: SessionExperimentState;\n running?: number;\n queued?: number;\n elsewhere?: number;\n}\nexport interface SessionRecord {\n sessionId: string;\n pid: number;\n startedAt: string;\n status: SessionStatus;\n experiments: SessionExperimentRecord[];\n heartbeatAt?: string;\n completedAt?: string;\n completion?: InvocationCompletion;\n}\nexport interface ExpiredSessionRecord {\n sessionId: string;\n pid: number;\n startedAt: string;\n heartbeatAt?: string;\n}\nexport interface SessionListDocument {\n format: \"niceeval.sessions\";\n sessions: SessionRecord[];\n expired: ExpiredSessionRecord[];\n}\nexport interface SessionShowDocument {\n format: \"niceeval.session\";\n session: SessionRecord | ExpiredSessionRecord;\n expired?: boolean;\n}\nexport interface SessionStartInput {\n runIds: ReadonlyMap<string, string>;\n agentRuns: readonly AgentRun[];\n /** 已规划、可携入的 attempt 数;用于创建记录时准确初始化 queued。 */\n carriedAttemptsByKey?: ReadonlyMap<string, ReadonlySet<number>>;\n startedAt?: string;\n pid?: number;\n}\nexport interface SessionCloseInput {\n status?: CompletionStatus | SessionStatus;\n completion?: InvocationCompletion;\n /** Only IDs in this receipt are safe targets for `niceeval show --run`. */\n receipt?: InvocationReceipt;\n completedAt?: string;\n}\n/**\n * Narrow transient event bridge owned by the Experiment Host. Session data is\n * an invocation-local index, so this intentionally excludes Record facts and\n * every feedback event that cannot change its small progress projection.\n */\nexport type SessionInvocationEvent = {\n readonly type: \"attempt:start\" | \"attempt:complete\" | \"attempt:early-exit\";\n readonly identity?: {\n readonly experimentId?: string;\n };\n} | {\n readonly type: \"lock-wait\";\n readonly experimentId: string;\n readonly status: \"started\" | \"resolved\";\n readonly attempts?: number;\n readonly carried?: number;\n readonly dispatched?: number;\n} | {\n readonly type: \"experiment-hook\";\n readonly experimentId: string;\n readonly hook: \"setup\" | \"teardown\";\n readonly status: \"started\" | \"done\" | \"failed\";\n};\nfunction sessionsDirOf(niceevalRoot: string): string {\n return join(niceevalRoot, \"sessions\");\n}\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n ? value as Record<string, unknown>\n : undefined;\n}\nfunction isTimestamp(value: unknown): value is string {\n return typeof value === \"string\" && Number.isFinite(Date.parse(value));\n}\nfunction isPositiveInteger(value: unknown): value is number {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value > 0;\n}\nfunction isNonNegativeInteger(value: unknown): value is number {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value >= 0;\n}\nfunction decodeExperiment(value: unknown): SessionExperimentRecord | undefined {\n const raw = asRecord(value);\n if (raw === undefined || typeof raw.experimentId !== \"string\" || typeof raw.runId !== \"string\")\n return undefined;\n if (raw.published !== undefined && typeof raw.published !== \"boolean\")\n return undefined;\n const state = raw.state;\n if (state !== undefined && state !== \"setup\" && state !== \"running\" && state !== \"waiting\" && state !== \"teardown\") {\n return undefined;\n }\n for (const key of [\"running\", \"queued\", \"elsewhere\"] as const) {\n if (raw[key] !== undefined && !isNonNegativeInteger(raw[key]))\n return undefined;\n }\n const running = raw.running;\n const queued = raw.queued;\n const elsewhere = raw.elsewhere;\n return {\n experimentId: raw.experimentId,\n runId: raw.runId,\n ...(raw.published === true ? { published: true } : {}),\n ...(state !== undefined ? { state } : {}),\n ...(running !== undefined ? { running: running as number } : {}),\n ...(queued !== undefined ? { queued: queued as number } : {}),\n ...(elsewhere !== undefined ? { elsewhere: elsewhere as number } : {}),\n };\n}\n/** 完整读取边界:损坏/未知格式条目从查询中跳过,不拖垮整个目录。 */\nexport function decodeSession(value: unknown): SessionRecord | undefined {\n const raw = asRecord(value);\n if (raw === undefined ||\n typeof raw.sessionId !== \"string\" ||\n !isPositiveInteger(raw.pid) ||\n !isTimestamp(raw.startedAt) ||\n (raw.status !== \"active\" && raw.status !== \"completed\" && raw.status !== \"incomplete\" && raw.status !== \"interrupted\") ||\n !Array.isArray(raw.experiments))\n return undefined;\n if (raw.heartbeatAt !== undefined && !isTimestamp(raw.heartbeatAt))\n return undefined;\n if (raw.completedAt !== undefined && !isTimestamp(raw.completedAt))\n return undefined;\n const experiments = raw.experiments.map(decodeExperiment);\n if (experiments.some((item) => item === undefined))\n return undefined;\n return {\n sessionId: raw.sessionId,\n pid: raw.pid,\n startedAt: raw.startedAt,\n status: raw.status,\n experiments: experiments as SessionExperimentRecord[],\n ...(raw.heartbeatAt !== undefined ? { heartbeatAt: raw.heartbeatAt } : {}),\n ...(raw.completedAt !== undefined ? { completedAt: raw.completedAt } : {}),\n ...(raw.completion !== undefined && asRecord(raw.completion) !== undefined\n ? { completion: raw.completion as InvocationCompletion }\n : {}),\n };\n}\nfunction keyOf(experimentId: string, evalId: string): string {\n // 与 runner/sandbox-selection.ts 的 runPairKey 保持同形,但避免运行时依赖造成循环导入。\n return experimentId.includes(\"|\") || evalId.includes(\"|\")\n ? JSON.stringify([experimentId, evalId])\n : `${experimentId}|${evalId}`;\n}\nfunction sessionStatusOf(status: CompletionStatus | SessionStatus | undefined): SessionStatus {\n if (status === \"complete\" || status === \"completed\" || status === undefined)\n return \"completed\";\n if (status === \"interrupted\")\n return \"interrupted\";\n return \"incomplete\";\n}\nfunction cloneRecord(record: SessionRecord): SessionRecord {\n return {\n ...record,\n experiments: record.experiments.map((experiment) => ({ ...experiment })),\n ...(record.completion ? { completion: { ...record.completion, reporterErrors: [...record.completion.reporterErrors] } } : {}),\n };\n}\ntype SessionPersistenceRequest = {\n readonly _tag: \"write\";\n readonly snapshot: SessionRecord;\n /** 缺席时是反馈索引的尽力写;失败不影响 attempt 判定。 */\n readonly completion?: Deferred.Deferred<void, unknown>;\n} | {\n readonly _tag: \"barrier\";\n readonly completion: Deferred.Deferred<void, unknown>;\n};\n/**\n * Session 的 Effect 资源组刻意不绑定 `start()` 调用点的 Scope:`runEvals()` 自己会\n * 在 dispatch 完成时关闭内部 Scope,但 CLI 仍要在随后拿到 receipt 后再写最终 completed\n * Session。调用方的 `close()`(CLI 已有的 finalizer)才是这一组 worker/timer 的唯一\n * 释放边界。\n */\ninterface SessionPersistence {\n readonly scope: Scope.CloseableScope;\n readonly requests: Queue.Queue<SessionPersistenceRequest>;\n readonly worker: Fiber.RuntimeFiber<void, never>;\n heartbeat?: Fiber.RuntimeFiber<never, never>;\n accepting: boolean;\n stopped: boolean;\n}\n/**\n * 在 Effect 中等一段不会让 Node 进程仅因 Session 心跳而存活的时间。中断会清掉当前 timer;\n * 这保留旧 `setInterval(...).unref()` 的进程退出语义,同时不会把定时器生命周期漏到 Effect\n * 之外。\n */\nfunction unrefDelayEffect(milliseconds: number): Effect.Effect<void> {\n return Effect.async<void>((resume) => {\n const timer = setTimeout(() => resume(Effect.void), milliseconds);\n timer.unref?.();\n return Effect.sync(() => clearTimeout(timer));\n });\n}\n/** 可持久化的 Session 生命周期;所有磁盘 I/O 由一个 Effect worker 按入队顺序串行化。 */\nexport class SessionTracker {\n readonly niceevalRoot: string;\n readonly sessionId: string;\n private record: SessionRecord | undefined;\n private persistence: SessionPersistence | undefined;\n private started = false;\n private closed = false;\n constructor(niceevalRoot: string, sessionId = `s_${randomUUID()}`) {\n this.niceevalRoot = niceevalRoot;\n this.sessionId = sessionId;\n }\n get current(): SessionRecord | undefined {\n return this.record === undefined ? undefined : cloneRecord(this.record);\n }\n /**\n * Effect 主入口:先完成第一份 durable snapshot,再开始心跳。持久化 Scope 跨过\n * `runEvals()` 的内部 Scope,由 closeEffect 关闭,因而最终 receipt 不会被抢先截断。\n */\n start(input: SessionStartInput): Effect.Effect<SessionRecord, unknown> {\n let persistence: SessionPersistence | undefined;\n return Effect.gen(this, function* () {\n if (this.started)\n return yield* Effect.fail(new Error(\"SessionTracker.start() called more than once.\"));\n const scope = yield* Scope.make();\n const requests = yield* Queue.unbounded<SessionPersistenceRequest>();\n const worker = yield* Effect.forkIn(this.persistenceWorkerEffect(requests), scope);\n persistence = { scope, requests, worker, accepting: true, stopped: false };\n this.persistence = persistence;\n this.started = true;\n const startedAt = input.startedAt ?? new Date().toISOString();\n const carried = input.carriedAttemptsByKey;\n const experiments: SessionExperimentRecord[] = [];\n for (const run of input.agentRuns) {\n if (run.experimentId === undefined)\n continue;\n const runId = input.runIds.get(run.experimentId);\n if (runId === undefined)\n continue;\n const planned = run.selectedEvalIds.length * run.attempts;\n const carriedCount = run.selectedEvalIds.reduce((count, evalId) => count + (carried?.get(keyOf(run.experimentId!, evalId))?.size ?? 0), 0);\n const queued = Math.max(0, planned - carriedCount);\n experiments.push({\n experimentId: run.experimentId,\n runId,\n state: run.setup && queued > 0 ? \"setup\" : \"running\",\n running: 0,\n queued,\n elsewhere: 0,\n });\n }\n const now = new Date().toISOString();\n this.record = {\n sessionId: this.sessionId,\n pid: input.pid ?? process.pid,\n startedAt,\n status: \"active\",\n heartbeatAt: now,\n experiments,\n };\n // Unlike feedback snapshots, the initial entry is a durable boundary:\n // dispatch must not start until it has either reached disk or failed.\n yield* this.flush();\n persistence.heartbeat = yield* Effect.forkIn(this.heartbeatLoopEffect(), scope);\n return this.current!;\n }).pipe(\n // A failed first write must not leave the manually held Scope (or its\n // queue worker) alive. Preserve the original failure after cleanup.\n Effect.onError((cause) => persistence === undefined\n ? Effect.void\n : this.stopPersistenceEffect(persistence, Exit.failCause(cause)).pipe(Effect.ignore)));\n }\n /** coordinator 的同步事件回调;只更新最小索引并把 snapshot 交给 Effect-owned serial worker。 */\n onFeedback(event: RunFeedbackEvent, _state?: RunFeedbackState): void {\n if (event.type === \"attempt:start\" ||\n event.type === \"attempt:complete\" ||\n event.type === \"attempt:early-exit\" ||\n event.type === \"lock-wait\" ||\n event.type === \"experiment-hook\") {\n this.onInvocationEvent(event);\n }\n }\n /** Host-side observer bridge; no runtime is started from a synchronous callback. */\n onInvocationEvent(event: SessionInvocationEvent): void {\n if (!this.started || this.closed || this.record === undefined || this.record.status !== \"active\")\n return;\n const identity = \"identity\" in event && event.identity !== undefined ? event.identity : undefined;\n const experimentId = identity\n ? identity.experimentId\n : \"experimentId\" in event\n ? event.experimentId\n : undefined;\n const experiment = experimentId === undefined\n ? undefined\n : this.record.experiments.find((item) => item.experimentId === experimentId);\n let changed = false;\n if (event.type === \"attempt:start\" && experiment) {\n experiment.queued = Math.max(0, (experiment.queued ?? 0) - 1);\n experiment.running = (experiment.running ?? 0) + 1;\n experiment.state = \"running\";\n changed = true;\n }\n else if (event.type === \"attempt:complete\" && experiment) {\n experiment.running = Math.max(0, (experiment.running ?? 0) - 1);\n this.refreshState(experiment);\n changed = true;\n }\n else if (event.type === \"attempt:early-exit\" && experiment) {\n experiment.queued = Math.max(0, (experiment.queued ?? 0) - 1);\n this.refreshState(experiment);\n changed = true;\n }\n else if (event.type === \"lock-wait\" && experiment) {\n if (event.status === \"started\") {\n const attempts = event.attempts ?? 1;\n experiment.queued = Math.max(0, (experiment.queued ?? 0) - attempts);\n experiment.elsewhere = (experiment.elsewhere ?? 0) + attempts;\n experiment.state = \"waiting\";\n changed = true;\n }\n else {\n const moved = (event.carried ?? 0) + (event.dispatched ?? 0);\n experiment.elsewhere = Math.max(0, (experiment.elsewhere ?? 0) - moved);\n experiment.queued = (experiment.queued ?? 0) + (event.dispatched ?? 0);\n this.refreshState(experiment);\n changed = true;\n }\n }\n else if (event.type === \"experiment-hook\" && experiment) {\n if (event.status === \"started\")\n experiment.state = event.hook === \"setup\" ? \"setup\" : \"teardown\";\n else\n this.refreshState(experiment);\n changed = true;\n }\n if (changed)\n this.enqueuePersist();\n }\n private refreshState(experiment: SessionExperimentRecord): void {\n if ((experiment.elsewhere ?? 0) > 0 && (experiment.running ?? 0) === 0) {\n experiment.state = \"waiting\";\n }\n else if ((experiment.running ?? 0) > 0 || (experiment.queued ?? 0) > 0) {\n experiment.state = \"running\";\n }\n else {\n experiment.state = \"teardown\";\n }\n }\n /** 一次可观察的 heartbeat;显式调用者会收到本次 flush 的真实 I/O failure。 */\n heartbeat(): Effect.Effect<void, unknown> {\n return Effect.suspend(() => {\n if (!this.started || this.closed || this.record === undefined || this.record.status !== \"active\")\n return Effect.void;\n this.record.heartbeatAt = new Date().toISOString();\n return this.flush();\n });\n }\n /**\n * 完成最终 Session:先停止 heartbeat,再把完成 snapshot 排在所有既有反馈写之后。该收尾\n * 区域不可中断,避免 interruption 留下 active 条目或后台 Fiber。\n */\n close(input: SessionCloseInput = {}): Effect.Effect<SessionRecord | undefined, unknown> {\n return Effect.uninterruptible(Effect.suspend(() => {\n if (!this.started || this.record === undefined || this.closed)\n return Effect.succeed(this.current);\n this.closed = true;\n const now = new Date().toISOString();\n this.record.status = sessionStatusOf(input.status);\n this.record.completedAt = input.completedAt ?? now;\n delete this.record.heartbeatAt;\n if (input.completion !== undefined)\n this.record.completion = input.completion;\n const publishedRunIds = new Set(input.receipt?.runIds ?? []);\n for (const experiment of this.record.experiments) {\n if (publishedRunIds.has(experiment.runId))\n experiment.published = true;\n else\n delete experiment.published;\n delete experiment.state;\n delete experiment.running;\n delete experiment.queued;\n delete experiment.elsewhere;\n }\n const snapshot = cloneRecord(this.record);\n const persistence = this.persistence;\n const persist = persistence === undefined\n ? writeEntryFileEffect(sessionsDirOf(this.niceevalRoot), this.sessionId, snapshot)\n : this.stopPersistenceEffect(persistence, Exit.void, snapshot);\n return persist.pipe(Effect.as(this.current));\n }));\n }\n /** 按入队顺序强制写出当前 snapshot;worker 已关闭后退化为同一条 *Effect 原语的直接写。 */\n private flush(): Effect.Effect<void, unknown> {\n return Effect.suspend(() => {\n if (this.record === undefined)\n return Effect.void;\n const snapshot = cloneRecord(this.record);\n const persistence = this.persistence;\n return persistence !== undefined && persistence.accepting && !persistence.stopped\n ? this.offerWriteEffect(persistence, snapshot)\n : writeEntryFileEffect(sessionsDirOf(this.niceevalRoot), this.sessionId, snapshot);\n });\n }\n private enqueuePersist(): void {\n const persistence = this.persistence;\n if (this.record === undefined ||\n persistence === undefined ||\n !persistence.accepting ||\n persistence.stopped)\n return;\n const snapshot = cloneRecord(this.record);\n // 反馈 API 受 coordinator 的同步 callback 契约限制,不能在这里启动 runtime。Queue 是\n // Effect worker 的同步入口;false 只会发生在 close 已关闭队列的竞态,此时最终 flush\n // 已覆盖当前 record。\n Queue.unsafeOffer(persistence.requests, { _tag: \"write\", snapshot });\n }\n private persistenceWorkerEffect(requests: Queue.Queue<SessionPersistenceRequest>): Effect.Effect<void> {\n const handle = (request: SessionPersistenceRequest): Effect.Effect<void> => {\n if (request._tag === \"barrier\") {\n return Deferred.succeed(request.completion, undefined).pipe(Effect.asVoid);\n }\n // Each request owns a frozen snapshot. Capture the full Exit before\n // settling its waiter so a failed heartbeat cannot kill the serial\n // worker; a later state change is still allowed to retry the index write.\n return writeEntryFileEffect(sessionsDirOf(this.niceevalRoot), this.sessionId, request.snapshot).pipe(Effect.exit, Effect.flatMap((exit) => request.completion === undefined\n ? Effect.void\n : Deferred.done(request.completion, exit).pipe(Effect.asVoid)));\n };\n return Effect.forever(Queue.take(requests).pipe(Effect.flatMap(handle))).pipe(\n // Queue shutdown interrupts its pending take. A different cause is a\n // broken worker invariant and stays a defect instead of being erased.\n Effect.catchAllCause((cause) => Cause.isInterruptedOnly(cause) ? Effect.void : Effect.die(cause)));\n }\n private heartbeatLoopEffect(): Effect.Effect<never> {\n return Effect.forever(unrefDelayEffect(SESSION_HEARTBEAT_INTERVAL_MS).pipe(\n // Heartbeats are observability only. Explicit heartbeat callers\n // receive failures; the background loop deliberately retries later.\n Effect.zipRight(this.heartbeat().pipe(Effect.ignore))));\n }\n private offerWriteEffect(persistence: SessionPersistence, snapshot: SessionRecord): Effect.Effect<void, unknown> {\n return Effect.gen(function* () {\n const completion = yield* Deferred.make<void, unknown>();\n const accepted = yield* Effect.sync(() => Queue.unsafeOffer(persistence.requests, { _tag: \"write\", snapshot, completion }));\n if (!accepted)\n return yield* Effect.fail(new Error(\"Session persistence queue closed before flush.\"));\n yield* Deferred.await(completion);\n });\n }\n private barrierEffect(persistence: SessionPersistence): Effect.Effect<void, unknown> {\n return Effect.gen(function* () {\n const completion = yield* Deferred.make<void, unknown>();\n const accepted = yield* Effect.sync(() => Queue.unsafeOffer(persistence.requests, { _tag: \"barrier\", completion }));\n if (!accepted)\n return yield* Effect.fail(new Error(\"Session persistence queue closed before drain.\"));\n yield* Deferred.await(completion);\n });\n }\n /**\n * 停止顺序固定为:拒绝新反馈 → 等 heartbeat 停稳 → FIFO flush/barrier → shutdown queue →\n * close Scope。因而 final snapshot 不会被较早的后台写覆盖,且任一路径都会终结两条 Fiber。\n */\n private stopPersistenceEffect(persistence: SessionPersistence, exit: Exit.Exit<unknown, unknown>, finalSnapshot?: SessionRecord): Effect.Effect<void, unknown> {\n return Effect.uninterruptible(Effect.suspend(() => {\n if (persistence.stopped)\n return Effect.void;\n persistence.accepting = false;\n const stopHeartbeat = persistence.heartbeat === undefined\n ? Effect.void\n : Fiber.interrupt(persistence.heartbeat).pipe(Effect.asVoid);\n const drain = finalSnapshot === undefined\n ? this.barrierEffect(persistence)\n : this.offerWriteEffect(persistence, finalSnapshot);\n return stopHeartbeat.pipe(Effect.zipRight(drain), Effect.ensuring(this.releasePersistenceEffect(persistence, exit)));\n }));\n }\n private releasePersistenceEffect(persistence: SessionPersistence, exit: Exit.Exit<unknown, unknown>): Effect.Effect<void> {\n return Effect.uninterruptible(Effect.suspend(() => {\n if (persistence.stopped)\n return Effect.void;\n persistence.stopped = true;\n if (this.persistence === persistence)\n this.persistence = undefined;\n return Queue.shutdown(persistence.requests).pipe(Effect.zipRight(Scope.close(persistence.scope, exit)));\n }));\n }\n}\nexport function isSessionExpired(record: SessionRecord, nowMs = Date.now()): boolean {\n if (record.status !== \"active\")\n return false;\n const heartbeatMs = Date.parse(record.heartbeatAt ?? \"\");\n return !Number.isFinite(heartbeatMs) || nowMs - heartbeatMs > SESSION_EXPIRY_MS;\n}\nfunction expiredProjection(record: SessionRecord): ExpiredSessionRecord {\n return {\n sessionId: record.sessionId,\n pid: record.pid,\n startedAt: record.startedAt,\n ...(record.heartbeatAt !== undefined ? { heartbeatAt: record.heartbeatAt } : {}),\n };\n}\n/** 完整读取边界仍由 entry-file-store 的 decoder 容错纪律拥有。 */\nexport function readSessions(niceevalRoot: string): Effect.Effect<SessionRecord[], unknown> {\n return readAllEntryFilesEffect(sessionsDirOf(niceevalRoot), decodeSession).pipe(Effect.map((entries) => entries.map(({ entry }) => entry).sort((a, b) => a.startedAt.localeCompare(b.startedAt))));\n}\nexport function sessionListDocument(records: readonly SessionRecord[], options: {\n all?: boolean;\n selector?: string;\n nowMs?: number;\n} = {}): SessionListDocument {\n const selector = options.selector;\n const matches = (record: SessionRecord): boolean => selector === undefined || record.experiments.some((experiment) => experiment.experimentId.startsWith(selector));\n const sessions: SessionRecord[] = [];\n const expired: ExpiredSessionRecord[] = [];\n for (const record of records) {\n if (!matches(record))\n continue;\n if (isSessionExpired(record, options.nowMs)) {\n expired.push(expiredProjection(record));\n }\n else if (record.status === \"active\" || options.all === true) {\n sessions.push(cloneRecord(record));\n }\n }\n return { format: \"niceeval.sessions\", sessions, expired };\n}\nexport function listSessions(niceevalRoot: string, options: {\n all?: boolean;\n selector?: string;\n nowMs?: number;\n} = {}): Effect.Effect<SessionListDocument, unknown> {\n return readSessions(niceevalRoot).pipe(Effect.map((records) => sessionListDocument(records, options)));\n}\nexport function resolveSessionPrefix(records: readonly SessionRecord[], prefix: string): SessionRecord {\n const matches = records.filter((record) => record.sessionId === prefix || record.sessionId.startsWith(prefix));\n if (matches.length === 0)\n throw new Error(`No session matched: ${prefix}`);\n if (matches.length > 1) {\n throw new Error(`Ambiguous session prefix ${prefix}. Candidates: ${matches.map((record) => record.sessionId).join(\", \")}`);\n }\n return cloneRecord(matches[0]!);\n}\nexport function showSession(niceevalRoot: string, prefix: string, nowMs = Date.now()): Effect.Effect<SessionShowDocument, unknown> {\n return readSessions(niceevalRoot).pipe(Effect.map((records) => {\n const record = resolveSessionPrefix(records, prefix);\n const expired = isSessionExpired(record, nowMs);\n return {\n format: \"niceeval.session\",\n session: expired ? expiredProjection(record) : record,\n ...(expired ? { expired: true } : {}),\n };\n }));\n}\nfunction shortRunId(runId: string): string {\n return runId.slice(0, 8);\n}\nfunction ageLabel(iso: string, nowMs: number): string {\n const elapsed = Math.max(0, nowMs - Date.parse(iso));\n if (elapsed < 1000)\n return \"now\";\n if (elapsed < 60000)\n return `${Math.floor(elapsed / 1000)}s ago`;\n if (elapsed < 3600000)\n return `${Math.floor(elapsed / 60000)}m ago`;\n return `${Math.floor(elapsed / 3600000)}h ago`;\n}\nfunction renderExperimentLine(experiment: SessionExperimentRecord, published: boolean): string {\n if (published) {\n return ` ${experiment.experimentId} niceeval show --run ${experiment.runId}`;\n }\n const counters = [\n experiment.running ? `${experiment.running} running` : \"\",\n experiment.queued ? `${experiment.queued} queued` : \"\",\n experiment.elsewhere ? `${experiment.elsewhere} elsewhere` : \"\",\n ].filter(Boolean);\n return ` ${experiment.experimentId} @run:${shortRunId(experiment.runId)} ${experiment.state ?? \"running\"}${counters.length ? ` · ${counters.join(\" · \")}` : \"\"}`;\n}\nfunction publishedForSession(experiment: SessionExperimentRecord, status: SessionStatus): boolean {\n // Older session entries have no receipt marker. Preserve their established\n // completed/interrupted behavior while new entries rely on the exact receipt.\n return experiment.published ?? (status === \"completed\" || status === \"interrupted\");\n}\nexport function renderSessionListText(document: SessionListDocument, nowMs = Date.now(), all = false): string {\n const lines: string[] = [`ACTIVE SESSIONS (${document.sessions.filter((session) => session.status === \"active\").length})`];\n const active = document.sessions.filter((session) => session.status === \"active\");\n if (active.length === 0)\n lines.push(\"(none)\");\n for (const session of active) {\n lines.push(`${session.sessionId} · pid ${session.pid} · ${ageLabel(session.startedAt, nowMs)} · heartbeat ${ageLabel(session.heartbeatAt ?? session.startedAt, nowMs)}`);\n lines.push(...session.experiments.map((experiment) => renderExperimentLine(experiment, false)));\n }\n if (all) {\n const completed = document.sessions.filter((session) => session.status !== \"active\");\n lines.push(`COMPLETED SESSIONS (${completed.length})`);\n if (completed.length === 0)\n lines.push(\"(none)\");\n for (const session of completed) {\n lines.push(`${session.sessionId} · pid ${session.pid} · ${session.status} · completed ${session.completedAt ?? \"—\"}`);\n lines.push(...session.experiments.map((experiment) => renderExperimentLine(experiment, publishedForSession(experiment, session.status))));\n }\n if (document.expired.length > 0) {\n lines.push(`EXPIRED SESSIONS (${document.expired.length})`);\n for (const expired of document.expired) {\n lines.push(`${expired.sessionId} · pid ${expired.pid} · heartbeat ${expired.heartbeatAt ?? \"unknown\"} · ${t(\"session.rerunOriginal\")}`);\n }\n }\n }\n return `${lines.join(\"\\n\")}\\n`;\n}\nexport function renderSessionShowText(document: SessionShowDocument): string {\n const session = document.session;\n const lines = [`SESSION ${session.sessionId}${document.expired ? \" · EXPIRED\" : \"\"}`, `pid ${session.pid} · started ${session.startedAt}`];\n if (\"status\" in session)\n lines.push(`status ${session.status}${session.completedAt ? ` · completed ${session.completedAt}` : \"\"}`);\n if (\"experiments\" in session) {\n lines.push(...session.experiments.map((experiment) => renderExperimentLine(experiment, publishedForSession(experiment, session.status))));\n }\n if (document.expired)\n lines.push(t(\"session.nextRerunOriginal\"));\n return `${lines.join(\"\\n\")}\\n`;\n}\n"]}
@@ -56,6 +56,29 @@ export interface SessionCloseInput {
56
56
  receipt?: InvocationReceipt;
57
57
  completedAt?: string;
58
58
  }
59
+ /**
60
+ * Narrow transient event bridge owned by the Experiment Host. Session data is
61
+ * an invocation-local index, so this intentionally excludes Record facts and
62
+ * every feedback event that cannot change its small progress projection.
63
+ */
64
+ export type SessionInvocationEvent = {
65
+ readonly type: "attempt:start" | "attempt:complete" | "attempt:early-exit";
66
+ readonly identity?: {
67
+ readonly experimentId?: string;
68
+ };
69
+ } | {
70
+ readonly type: "lock-wait";
71
+ readonly experimentId: string;
72
+ readonly status: "started" | "resolved";
73
+ readonly attempts?: number;
74
+ readonly carried?: number;
75
+ readonly dispatched?: number;
76
+ } | {
77
+ readonly type: "experiment-hook";
78
+ readonly experimentId: string;
79
+ readonly hook: "setup" | "teardown";
80
+ readonly status: "started" | "done" | "failed";
81
+ };
59
82
  /** 完整读取边界:损坏/未知格式条目从查询中跳过,不拖垮整个目录。 */
60
83
  export declare function decodeSession(value: unknown): SessionRecord | undefined;
61
84
  /** 可持久化的 Session 生命周期;所有磁盘 I/O 由一个 Effect worker 按入队顺序串行化。 */
@@ -75,6 +98,8 @@ export declare class SessionTracker {
75
98
  start(input: SessionStartInput): Effect.Effect<SessionRecord, unknown>;
76
99
  /** coordinator 的同步事件回调;只更新最小索引并把 snapshot 交给 Effect-owned serial worker。 */
77
100
  onFeedback(event: RunFeedbackEvent, _state?: RunFeedbackState): void;
101
+ /** Host-side observer bridge; no runtime is started from a synchronous callback. */
102
+ onInvocationEvent(event: SessionInvocationEvent): void;
78
103
  private refreshState;
79
104
  /** 一次可观察的 heartbeat;显式调用者会收到本次 flush 的真实 I/O failure。 */
80
105
  heartbeat(): Effect.Effect<void, unknown>;
@@ -56,6 +56,29 @@ export interface SessionCloseInput {
56
56
  receipt?: InvocationReceipt;
57
57
  completedAt?: string;
58
58
  }
59
+ /**
60
+ * Narrow transient event bridge owned by the Experiment Host. Session data is
61
+ * an invocation-local index, so this intentionally excludes Record facts and
62
+ * every feedback event that cannot change its small progress projection.
63
+ */
64
+ export type SessionInvocationEvent = {
65
+ readonly type: "attempt:start" | "attempt:complete" | "attempt:early-exit";
66
+ readonly identity?: {
67
+ readonly experimentId?: string;
68
+ };
69
+ } | {
70
+ readonly type: "lock-wait";
71
+ readonly experimentId: string;
72
+ readonly status: "started" | "resolved";
73
+ readonly attempts?: number;
74
+ readonly carried?: number;
75
+ readonly dispatched?: number;
76
+ } | {
77
+ readonly type: "experiment-hook";
78
+ readonly experimentId: string;
79
+ readonly hook: "setup" | "teardown";
80
+ readonly status: "started" | "done" | "failed";
81
+ };
59
82
  /** 完整读取边界:损坏/未知格式条目从查询中跳过,不拖垮整个目录。 */
60
83
  export declare function decodeSession(value: unknown): SessionRecord | undefined;
61
84
  /** 可持久化的 Session 生命周期;所有磁盘 I/O 由一个 Effect worker 按入队顺序串行化。 */
@@ -75,6 +98,8 @@ export declare class SessionTracker {
75
98
  start(input: SessionStartInput): Effect.Effect<SessionRecord, unknown>;
76
99
  /** coordinator 的同步事件回调;只更新最小索引并把 snapshot 交给 Effect-owned serial worker。 */
77
100
  onFeedback(event: RunFeedbackEvent, _state?: RunFeedbackState): void;
101
+ /** Host-side observer bridge; no runtime is started from a synchronous callback. */
102
+ onInvocationEvent(event: SessionInvocationEvent): void;
78
103
  private refreshState;
79
104
  /** 一次可观察的 heartbeat;显式调用者会收到本次 flush 的真实 I/O failure。 */
80
105
  heartbeat(): Effect.Effect<void, unknown>;
@@ -56,6 +56,29 @@ export interface SessionCloseInput {
56
56
  receipt?: InvocationReceipt;
57
57
  completedAt?: string;
58
58
  }
59
+ /**
60
+ * Narrow transient event bridge owned by the Experiment Host. Session data is
61
+ * an invocation-local index, so this intentionally excludes Record facts and
62
+ * every feedback event that cannot change its small progress projection.
63
+ */
64
+ export type SessionInvocationEvent = {
65
+ readonly type: "attempt:start" | "attempt:complete" | "attempt:early-exit";
66
+ readonly identity?: {
67
+ readonly experimentId?: string;
68
+ };
69
+ } | {
70
+ readonly type: "lock-wait";
71
+ readonly experimentId: string;
72
+ readonly status: "started" | "resolved";
73
+ readonly attempts?: number;
74
+ readonly carried?: number;
75
+ readonly dispatched?: number;
76
+ } | {
77
+ readonly type: "experiment-hook";
78
+ readonly experimentId: string;
79
+ readonly hook: "setup" | "teardown";
80
+ readonly status: "started" | "done" | "failed";
81
+ };
59
82
  /** 完整读取边界:损坏/未知格式条目从查询中跳过,不拖垮整个目录。 */
60
83
  export declare function decodeSession(value: unknown): SessionRecord | undefined;
61
84
  /** 可持久化的 Session 生命周期;所有磁盘 I/O 由一个 Effect worker 按入队顺序串行化。 */
@@ -75,6 +98,8 @@ export declare class SessionTracker {
75
98
  start(input: SessionStartInput): Effect.Effect<SessionRecord, unknown>;
76
99
  /** coordinator 的同步事件回调;只更新最小索引并把 snapshot 交给 Effect-owned serial worker。 */
77
100
  onFeedback(event: RunFeedbackEvent, _state?: RunFeedbackState): void;
101
+ /** Host-side observer bridge; no runtime is started from a synchronous callback. */
102
+ onInvocationEvent(event: SessionInvocationEvent): void;
78
103
  private refreshState;
79
104
  /** 一次可观察的 heartbeat;显式调用者会收到本次 flush 的真实 I/O failure。 */
80
105
  heartbeat(): Effect.Effect<void, unknown>;