niceeval 0.13.2 → 0.13.3

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 (494) hide show
  1. package/dist/agents/bub.cjs +4 -4
  2. package/dist/agents/bub.cjs.map +1 -1
  3. package/dist/agents/bub.d.cts +2 -2
  4. package/dist/agents/bub.d.mts +2 -2
  5. package/dist/agents/bub.d.ts +2 -2
  6. package/dist/agents/claude-code-native.cjs +213 -0
  7. package/dist/agents/claude-code-native.cjs.map +1 -0
  8. package/dist/agents/claude-code-native.d.cts +5 -0
  9. package/dist/agents/claude-code-native.d.mts +5 -0
  10. package/dist/agents/claude-code-native.d.ts +5 -0
  11. package/dist/agents/claude-code-native.js +6 -0
  12. package/dist/agents/claude-code-native.js.map +1 -0
  13. package/dist/agents/claude-code.cjs +26 -80
  14. package/dist/agents/claude-code.cjs.map +1 -1
  15. package/dist/agents/codex-app-server.cjs +314 -0
  16. package/dist/agents/codex-app-server.cjs.map +1 -0
  17. package/dist/agents/codex-app-server.d.cts +9 -0
  18. package/dist/agents/codex-app-server.d.mts +9 -0
  19. package/dist/agents/codex-app-server.d.ts +9 -0
  20. package/dist/agents/codex-app-server.js +6 -0
  21. package/dist/agents/codex-app-server.js.map +1 -0
  22. package/dist/agents/codex.cjs +19 -68
  23. package/dist/agents/codex.cjs.map +1 -1
  24. package/dist/agents/codex.d.cts +3 -3
  25. package/dist/agents/codex.d.mts +3 -3
  26. package/dist/agents/codex.d.ts +3 -3
  27. package/dist/agents/index.cjs +3 -1
  28. package/dist/agents/index.cjs.map +1 -1
  29. package/dist/agents/index.d.cts +1 -0
  30. package/dist/agents/index.d.mts +1 -0
  31. package/dist/agents/index.d.ts +1 -0
  32. package/dist/agents/index.js +84 -82
  33. package/dist/agents/index.mjs +84 -82
  34. package/dist/agents/managed-jsonl.cjs +207 -0
  35. package/dist/agents/managed-jsonl.cjs.map +1 -0
  36. package/dist/agents/managed-jsonl.d.cts +39 -0
  37. package/dist/agents/managed-jsonl.d.mts +39 -0
  38. package/dist/agents/managed-jsonl.d.ts +39 -0
  39. package/dist/agents/managed-jsonl.js +6 -0
  40. package/dist/agents/managed-jsonl.js.map +1 -0
  41. package/dist/agents/managed-process.cjs +31 -0
  42. package/dist/agents/managed-process.cjs.map +1 -0
  43. package/dist/agents/managed-process.d.cts +3 -0
  44. package/dist/agents/managed-process.d.mts +3 -0
  45. package/dist/agents/managed-process.d.ts +3 -0
  46. package/dist/agents/managed-process.js +6 -0
  47. package/dist/agents/managed-process.js.map +1 -0
  48. package/dist/agents/omp.cjs +18 -1
  49. package/dist/agents/omp.cjs.map +1 -1
  50. package/dist/agents/sdk-streams.cjs +11 -4
  51. package/dist/agents/sdk-streams.cjs.map +1 -1
  52. package/dist/agents/types.cjs.map +1 -1
  53. package/dist/agents/types.d.cts +8 -0
  54. package/dist/agents/types.d.mts +8 -0
  55. package/dist/agents/types.d.ts +8 -0
  56. package/dist/analysis/bindings.cjs +74 -19
  57. package/dist/analysis/bindings.cjs.map +1 -1
  58. package/dist/analysis/bindings.d.cts +534 -156
  59. package/dist/analysis/bindings.d.mts +534 -156
  60. package/dist/analysis/bindings.d.ts +534 -156
  61. package/dist/analysis/domain-view.cjs.map +1 -1
  62. package/dist/analysis/domain-view.d.cts +137 -8
  63. package/dist/analysis/domain-view.d.mts +137 -8
  64. package/dist/analysis/domain-view.d.ts +137 -8
  65. package/dist/analysis/index.cjs.map +1 -1
  66. package/dist/analysis/index.d.cts +1 -1
  67. package/dist/analysis/index.d.mts +1 -1
  68. package/dist/analysis/index.d.ts +1 -1
  69. package/dist/assertions/api.cjs.map +1 -1
  70. package/dist/assertions/api.d.cts +62 -0
  71. package/dist/assertions/api.d.mts +62 -0
  72. package/dist/assertions/api.d.ts +62 -0
  73. package/dist/assertions/judge.cjs +56 -5
  74. package/dist/assertions/judge.cjs.map +1 -1
  75. package/dist/assertions/match.cjs +66 -42
  76. package/dist/assertions/match.cjs.map +1 -1
  77. package/dist/assertions/match.d.cts +13 -0
  78. package/dist/assertions/match.d.mts +13 -0
  79. package/dist/assertions/match.d.ts +13 -0
  80. package/dist/assertions/record/attachment.cjs +104 -33
  81. package/dist/assertions/record/attachment.cjs.map +1 -1
  82. package/dist/assertions/record/attachment.d.cts +294 -57
  83. package/dist/assertions/record/attachment.d.mts +294 -57
  84. package/dist/assertions/record/attachment.d.ts +294 -57
  85. package/dist/assertions/record/codec.cjs +91 -17
  86. package/dist/assertions/record/codec.cjs.map +1 -1
  87. package/dist/assertions/record/codec.d.cts +280 -52
  88. package/dist/assertions/record/codec.d.mts +280 -52
  89. package/dist/assertions/record/codec.d.ts +280 -52
  90. package/dist/assertions/record/index.js +2 -0
  91. package/dist/assertions/record/model.cjs +16 -0
  92. package/dist/assertions/record/model.cjs.map +1 -1
  93. package/dist/assertions/record/model.d.cts +120 -13
  94. package/dist/assertions/record/model.d.mts +120 -13
  95. package/dist/assertions/record/model.d.ts +120 -13
  96. package/dist/assertions/record/model.js +2 -0
  97. package/dist/assertions/record/producer.cjs +70 -50
  98. package/dist/assertions/record/producer.cjs.map +1 -1
  99. package/dist/assertions/record/producer.d.cts +8 -7
  100. package/dist/assertions/record/producer.d.mts +8 -7
  101. package/dist/assertions/record/producer.d.ts +8 -7
  102. package/dist/assertions/runtime.cjs +49 -7
  103. package/dist/assertions/runtime.cjs.map +1 -1
  104. package/dist/cli/application.cjs +40 -0
  105. package/dist/cli/application.cjs.map +1 -0
  106. package/dist/cli/application.d.cts +129 -0
  107. package/dist/cli/application.d.mts +129 -0
  108. package/dist/cli/application.d.ts +129 -0
  109. package/dist/cli/application.js +24 -0
  110. package/dist/cli/application.js.map +1 -0
  111. package/dist/cli/bootstrap.cjs +10 -4
  112. package/dist/cli/bootstrap.cjs.map +1 -1
  113. package/dist/cli/node-application.cjs +123 -0
  114. package/dist/cli/node-application.cjs.map +1 -0
  115. package/dist/cli/node-application.d.cts +14 -0
  116. package/dist/cli/node-application.d.mts +14 -0
  117. package/dist/cli/node-application.d.ts +14 -0
  118. package/dist/cli/node-application.js +26 -0
  119. package/dist/cli/node-application.js.map +1 -0
  120. package/dist/cli/program.cjs +2807 -0
  121. package/dist/cli/program.cjs.map +1 -0
  122. package/dist/cli/program.d.cts +352 -0
  123. package/dist/cli/program.d.mts +352 -0
  124. package/dist/cli/program.d.ts +352 -0
  125. package/dist/cli/program.js +36 -0
  126. package/dist/cli/program.js.map +1 -0
  127. package/dist/cli/project-configuration.cjs +134 -0
  128. package/dist/cli/project-configuration.cjs.map +1 -0
  129. package/dist/cli/project-configuration.d.cts +64 -0
  130. package/dist/cli/project-configuration.d.mts +64 -0
  131. package/dist/cli/project-configuration.d.ts +64 -0
  132. package/dist/cli/project-configuration.js +22 -0
  133. package/dist/cli/project-configuration.js.map +1 -0
  134. package/dist/cli/record.cjs +20 -4
  135. package/dist/cli/record.cjs.map +1 -1
  136. package/dist/cli/record.d.cts +3 -3
  137. package/dist/cli/record.d.mts +3 -3
  138. package/dist/cli/record.d.ts +3 -3
  139. package/dist/cli.cjs +19 -3130
  140. package/dist/cli.cjs.map +1 -1
  141. package/dist/cli.d.cts +2 -148
  142. package/dist/cli.d.mts +2 -148
  143. package/dist/cli.d.ts +2 -148
  144. package/dist/cli.js +22 -30
  145. package/dist/context/assert-first.cjs +21 -15
  146. package/dist/context/assert-first.cjs.map +1 -1
  147. package/dist/context/assert-first.d.cts +1 -0
  148. package/dist/context/assert-first.d.mts +1 -0
  149. package/dist/context/assert-first.d.ts +1 -0
  150. package/dist/context/attempt-resources.cjs +13 -0
  151. package/dist/context/attempt-resources.cjs.map +1 -0
  152. package/dist/context/attempt-resources.d.cts +3 -0
  153. package/dist/context/attempt-resources.d.mts +3 -0
  154. package/dist/context/attempt-resources.d.ts +3 -0
  155. package/dist/context/attempt-resources.js +8 -0
  156. package/dist/context/attempt-resources.js.map +1 -0
  157. package/dist/context/session.cjs +4 -3
  158. package/dist/context/session.cjs.map +1 -1
  159. package/dist/context/session.d.cts +1 -0
  160. package/dist/context/session.d.mts +1 -0
  161. package/dist/context/session.d.ts +1 -0
  162. package/dist/eval/record/verdict.cjs +3 -2
  163. package/dist/eval/record/verdict.cjs.map +1 -1
  164. package/dist/experiment/host/index.cjs +1 -6
  165. package/dist/experiment/host/index.cjs.map +1 -1
  166. package/dist/experiment/host/index.d.cts +1 -0
  167. package/dist/experiment/host/index.d.mts +1 -0
  168. package/dist/experiment/host/index.d.ts +1 -0
  169. package/dist/load-config.cjs +13 -4
  170. package/dist/load-config.cjs.map +1 -1
  171. package/dist/load-config.d.cts +4 -3
  172. package/dist/load-config.d.mts +4 -3
  173. package/dist/load-config.d.ts +4 -3
  174. package/dist/load-config.js +4 -2
  175. package/dist/o11y/parsers/codex.cjs +29 -7
  176. package/dist/o11y/parsers/codex.cjs.map +1 -1
  177. package/dist/record/codec/core.d.cts +0 -2
  178. package/dist/record/codec/core.d.mts +0 -2
  179. package/dist/record/codec/core.d.ts +0 -2
  180. package/dist/record/codec/identifiers.cjs +2 -3
  181. package/dist/record/codec/identifiers.cjs.map +1 -1
  182. package/dist/record/codec/identifiers.d.cts +1 -2
  183. package/dist/record/codec/identifiers.d.mts +1 -2
  184. package/dist/record/codec/identifiers.d.ts +1 -2
  185. package/dist/record/codec/identifiers.js +10 -12
  186. package/dist/record/codec/index.js +42 -44
  187. package/dist/record/definition/attachment.cjs +1 -0
  188. package/dist/record/definition/attachment.cjs.map +1 -1
  189. package/dist/record/definition/attachment.d.cts +14 -0
  190. package/dist/record/definition/attachment.d.mts +14 -0
  191. package/dist/record/definition/attachment.d.ts +14 -0
  192. package/dist/record/family/assertions-v1.cjs +104 -0
  193. package/dist/record/family/assertions-v1.cjs.map +1 -0
  194. package/dist/record/family/assertions-v1.d.cts +2 -0
  195. package/dist/record/family/assertions-v1.d.mts +2 -0
  196. package/dist/record/family/assertions-v1.d.ts +2 -0
  197. package/dist/record/family/assertions-v1.js +6 -0
  198. package/dist/record/family/assertions-v1.js.map +1 -0
  199. package/dist/record/family/assertions.cjs +16 -5
  200. package/dist/record/family/assertions.cjs.map +1 -1
  201. package/dist/record/family/assertions.d.cts +510 -56
  202. package/dist/record/family/assertions.d.mts +510 -56
  203. package/dist/record/family/assertions.d.ts +510 -56
  204. package/dist/record/family/assertions.js +14 -10
  205. package/dist/record/family/catalog.cjs +17 -1
  206. package/dist/record/family/catalog.cjs.map +1 -1
  207. package/dist/record/family/catalog.d.cts +1292 -104
  208. package/dist/record/family/catalog.d.mts +1292 -104
  209. package/dist/record/family/catalog.d.ts +1292 -104
  210. package/dist/record/family/catalog.js +22 -20
  211. package/dist/record/family/index.js +144 -138
  212. package/dist/record/family/observability-v1.cjs +5 -0
  213. package/dist/record/family/observability-v1.cjs.map +1 -1
  214. package/dist/record/family/observability.cjs +1 -1
  215. package/dist/record/family/observability.cjs.map +1 -1
  216. package/dist/record/host/runtime.cjs +323 -173
  217. package/dist/record/host/runtime.cjs.map +1 -1
  218. package/dist/record/host/types.cjs.map +1 -1
  219. package/dist/record/host/types.d.cts +9 -7
  220. package/dist/record/host/types.d.mts +9 -7
  221. package/dist/record/host/types.d.ts +9 -7
  222. package/dist/record/model/core.cjs.map +1 -1
  223. package/dist/record/model/core.d.cts +1 -2
  224. package/dist/record/model/core.d.mts +1 -2
  225. package/dist/record/model/core.d.ts +1 -2
  226. package/dist/record/model/definition.cjs +1 -2
  227. package/dist/record/model/definition.cjs.map +1 -1
  228. package/dist/record/model/definition.d.cts +1 -7
  229. package/dist/record/model/definition.d.mts +1 -7
  230. package/dist/record/model/definition.d.ts +1 -7
  231. package/dist/record/model/identifiers.cjs +2 -3
  232. package/dist/record/model/identifiers.cjs.map +1 -1
  233. package/dist/record/model/identifiers.d.cts +1 -3
  234. package/dist/record/model/identifiers.d.mts +1 -3
  235. package/dist/record/model/identifiers.d.ts +1 -3
  236. package/dist/record/model/identifiers.js +36 -38
  237. package/dist/record/model/index.js +60 -62
  238. package/dist/record/platform/node.cjs +17 -7
  239. package/dist/record/platform/node.cjs.map +1 -1
  240. package/dist/record/platform/services.cjs.map +1 -1
  241. package/dist/record/platform/services.d.cts +8 -3
  242. package/dist/record/platform/services.d.mts +8 -3
  243. package/dist/record/platform/services.d.ts +8 -3
  244. package/dist/record/reader/format.cjs +16 -65
  245. package/dist/record/reader/format.cjs.map +1 -1
  246. package/dist/record/reader/format.d.cts +5 -9
  247. package/dist/record/reader/format.d.mts +5 -9
  248. package/dist/record/reader/format.d.ts +5 -9
  249. package/dist/record/reader/index.js +10 -8
  250. package/dist/record/reader/runtime.cjs +63 -32
  251. package/dist/record/reader/runtime.cjs.map +1 -1
  252. package/dist/record/reader/runtime.d.cts +40 -4
  253. package/dist/record/reader/runtime.d.mts +40 -4
  254. package/dist/record/reader/runtime.d.ts +40 -4
  255. package/dist/record/reader/runtime.js +6 -4
  256. package/dist/report/assets/enhance.js +5 -5
  257. package/dist/report/assets/styles.css +190 -24
  258. package/dist/report/built-in/result-components.cjs +8 -5
  259. package/dist/report/built-in/result-components.cjs.map +1 -1
  260. package/dist/report/built-in/standard.cjs +3 -0
  261. package/dist/report/built-in/standard.cjs.map +1 -1
  262. package/dist/report/built-in/standard.d.cts +2 -0
  263. package/dist/report/built-in/standard.d.mts +2 -0
  264. package/dist/report/built-in/standard.d.ts +2 -0
  265. package/dist/report/client-dist/app.js +53 -0
  266. package/dist/report/components/attempt-detail/compute.cjs +108 -231
  267. package/dist/report/components/attempt-detail/compute.cjs.map +1 -1
  268. package/dist/report/components/attempt-detail/compute.d.cts +11 -45
  269. package/dist/report/components/attempt-detail/compute.d.mts +11 -45
  270. package/dist/report/components/attempt-detail/compute.d.ts +11 -45
  271. package/dist/report/components/attempt-detail/compute.js +2 -4
  272. package/dist/report/components/attempt-detail/content.cjs +4 -4
  273. package/dist/report/components/attempt-detail/content.cjs.map +1 -1
  274. package/dist/report/components/attempt-detail/validate.cjs +47 -4
  275. package/dist/report/components/attempt-detail/validate.cjs.map +1 -1
  276. package/dist/report/components/entity-lists/compute.cjs +9 -15
  277. package/dist/report/components/entity-lists/compute.cjs.map +1 -1
  278. package/dist/report/components/entity-lists/content.cjs +53 -40
  279. package/dist/report/components/entity-lists/content.cjs.map +1 -1
  280. package/dist/report/components/entity-lists/index.cjs +1 -3
  281. package/dist/report/components/entity-lists/index.cjs.map +1 -1
  282. package/dist/report/components/experiment-detail/compute.cjs +4 -6
  283. package/dist/report/components/experiment-detail/compute.cjs.map +1 -1
  284. package/dist/report/components/summaries/index.cjs +5 -1
  285. package/dist/report/components/summaries/index.cjs.map +1 -1
  286. package/dist/report/definition/cell.cjs +14 -7
  287. package/dist/report/definition/cell.cjs.map +1 -1
  288. package/dist/report/definition/cell.d.cts +4 -0
  289. package/dist/report/definition/cell.d.mts +4 -0
  290. package/dist/report/definition/cell.d.ts +4 -0
  291. package/dist/report/definition/primitives/assertion-evidence.cjs +96 -0
  292. package/dist/report/definition/primitives/assertion-evidence.cjs.map +1 -0
  293. package/dist/report/definition/primitives/assertion-evidence.d.cts +11 -0
  294. package/dist/report/definition/primitives/assertion-evidence.d.mts +11 -0
  295. package/dist/report/definition/primitives/assertion-evidence.d.ts +11 -0
  296. package/dist/report/definition/primitives/assertion-evidence.js +6 -0
  297. package/dist/report/definition/primitives/assertion-evidence.js.map +1 -0
  298. package/dist/report/definition/primitives/conversation.cjs +7 -0
  299. package/dist/report/definition/primitives/conversation.cjs.map +1 -1
  300. package/dist/report/definition/primitives/conversation.d.cts +2 -0
  301. package/dist/report/definition/primitives/conversation.d.mts +2 -0
  302. package/dist/report/definition/primitives/conversation.d.ts +2 -0
  303. package/dist/report/definition/primitives/turn-trace.cjs +53 -3
  304. package/dist/report/definition/primitives/turn-trace.cjs.map +1 -1
  305. package/dist/report/definition/primitives.cjs +14 -1
  306. package/dist/report/definition/primitives.cjs.map +1 -1
  307. package/dist/report/definition/report.cjs +16 -8
  308. package/dist/report/definition/report.cjs.map +1 -1
  309. package/dist/report/definition/report.d.cts +6 -0
  310. package/dist/report/definition/report.d.mts +6 -0
  311. package/dist/report/definition/report.d.ts +6 -0
  312. package/dist/report/definition/table-text.cjs +12 -3
  313. package/dist/report/definition/table-text.cjs.map +1 -1
  314. package/dist/report/definition/table-text.d.cts +6 -1
  315. package/dist/report/definition/table-text.d.mts +6 -1
  316. package/dist/report/definition/table-text.d.ts +6 -1
  317. package/dist/report/execution/model.cjs +6 -14
  318. package/dist/report/execution/model.cjs.map +1 -1
  319. package/dist/report/execution/model.d.cts +5 -10
  320. package/dist/report/execution/model.d.mts +5 -10
  321. package/dist/report/execution/model.d.ts +5 -10
  322. package/dist/report/execution/model.js +6 -6
  323. package/dist/report/execution/paths.cjs +0 -11
  324. package/dist/report/execution/paths.cjs.map +1 -1
  325. package/dist/report/execution/paths.d.cts +0 -1
  326. package/dist/report/execution/paths.d.mts +0 -1
  327. package/dist/report/execution/paths.d.ts +0 -1
  328. package/dist/report/execution/paths.js +6 -8
  329. package/dist/report/host/execute.cjs +13 -22
  330. package/dist/report/host/execute.cjs.map +1 -1
  331. package/dist/report/host/execute.d.cts +1 -4
  332. package/dist/report/host/execute.d.mts +1 -4
  333. package/dist/report/host/execute.d.ts +1 -4
  334. package/dist/report/host/from-record.cjs +3 -0
  335. package/dist/report/host/from-record.cjs.map +1 -1
  336. package/dist/report/host/from-record.d.cts +4 -1
  337. package/dist/report/host/from-record.d.mts +4 -1
  338. package/dist/report/host/from-record.d.ts +4 -1
  339. package/dist/report/host/site-assets.cjs +1 -2
  340. package/dist/report/host/site-assets.cjs.map +1 -1
  341. package/dist/report/host/site-assets.d.cts +0 -1
  342. package/dist/report/host/site-assets.d.mts +0 -1
  343. package/dist/report/host/site-assets.d.ts +0 -1
  344. package/dist/report/host/site-assets.js +2 -4
  345. package/dist/report/host/static.cjs +71 -346
  346. package/dist/report/host/static.cjs.map +1 -1
  347. package/dist/report/host/static.d.cts +1 -3
  348. package/dist/report/host/static.d.mts +1 -3
  349. package/dist/report/host/static.d.ts +1 -3
  350. package/dist/report/host/static.js +2 -2
  351. package/dist/report/host/view-session.cjs.map +1 -1
  352. package/dist/report/host/view-session.d.cts +1 -1
  353. package/dist/report/host/view-session.d.mts +1 -1
  354. package/dist/report/host/view-session.d.ts +1 -1
  355. package/dist/report/model/locale.cjs +1 -1
  356. package/dist/report/model/locale.cjs.map +1 -1
  357. package/dist/report/model/locale.d.cts +1 -1
  358. package/dist/report/model/locale.d.mts +1 -1
  359. package/dist/report/model/locale.d.ts +1 -1
  360. package/dist/report/model/pricing.cjs +2 -2
  361. package/dist/report/model/pricing.cjs.map +1 -1
  362. package/dist/report/react/enhance.js +5 -5
  363. package/dist/report/react/styles.css +190 -24
  364. package/dist/runner/adoption.cjs +4 -7
  365. package/dist/runner/adoption.cjs.map +1 -1
  366. package/dist/runner/attempt-resources.cjs +60 -0
  367. package/dist/runner/attempt-resources.cjs.map +1 -0
  368. package/dist/runner/attempt-resources.d.cts +13 -0
  369. package/dist/runner/attempt-resources.d.mts +13 -0
  370. package/dist/runner/attempt-resources.d.ts +13 -0
  371. package/dist/runner/attempt-resources.js +6 -0
  372. package/dist/runner/attempt-resources.js.map +1 -0
  373. package/dist/runner/attempt.cjs +37 -3
  374. package/dist/runner/attempt.cjs.map +1 -1
  375. package/dist/runner/feedback/failure.cjs +77 -2
  376. package/dist/runner/feedback/failure.cjs.map +1 -1
  377. package/dist/runner/feedback/failure.d.cts +2 -1
  378. package/dist/runner/feedback/failure.d.mts +2 -1
  379. package/dist/runner/feedback/failure.d.ts +2 -1
  380. package/dist/runner/project-current.cjs +2 -13
  381. package/dist/runner/project-current.cjs.map +1 -1
  382. package/dist/runner/project-current.d.cts +4 -2
  383. package/dist/runner/project-current.d.mts +4 -2
  384. package/dist/runner/project-current.d.ts +4 -2
  385. package/dist/runner/reporters/braintrust.cjs +7 -7
  386. package/dist/runner/reporters/braintrust.cjs.map +1 -1
  387. package/dist/runner/reuse-readback.cjs +3 -4
  388. package/dist/runner/reuse-readback.cjs.map +1 -1
  389. package/dist/runner/run.cjs +5 -2
  390. package/dist/runner/run.cjs.map +1 -1
  391. package/dist/sandbox/backend.cjs +32 -2
  392. package/dist/sandbox/backend.cjs.map +1 -1
  393. package/dist/sandbox/backend.d.cts +12 -1
  394. package/dist/sandbox/backend.d.mts +12 -1
  395. package/dist/sandbox/backend.d.ts +12 -1
  396. package/dist/sandbox/backend.js +28 -22
  397. package/dist/sandbox/docker.cjs +140 -0
  398. package/dist/sandbox/docker.cjs.map +1 -1
  399. package/dist/sandbox/docker.d.cts +3 -1
  400. package/dist/sandbox/docker.d.mts +3 -1
  401. package/dist/sandbox/docker.d.ts +3 -1
  402. package/dist/sandbox/e2b.cjs +42 -0
  403. package/dist/sandbox/e2b.cjs.map +1 -1
  404. package/dist/sandbox/e2b.d.cts +2 -0
  405. package/dist/sandbox/e2b.d.mts +2 -0
  406. package/dist/sandbox/e2b.d.ts +2 -0
  407. package/dist/sandbox/local.cjs +64 -0
  408. package/dist/sandbox/local.cjs.map +1 -1
  409. package/dist/sandbox/local.d.cts +3 -1
  410. package/dist/sandbox/local.d.mts +3 -1
  411. package/dist/sandbox/local.d.ts +3 -1
  412. package/dist/sandbox/managed-process.cjs +49 -0
  413. package/dist/sandbox/managed-process.cjs.map +1 -0
  414. package/dist/sandbox/managed-process.d.cts +11 -0
  415. package/dist/sandbox/managed-process.d.mts +11 -0
  416. package/dist/sandbox/managed-process.d.ts +11 -0
  417. package/dist/sandbox/managed-process.js +6 -0
  418. package/dist/sandbox/managed-process.js.map +1 -0
  419. package/dist/sandbox/types.cjs.map +1 -1
  420. package/dist/sandbox/types.d.cts +24 -0
  421. package/dist/sandbox/types.d.mts +24 -0
  422. package/dist/sandbox/types.d.ts +24 -0
  423. package/dist/sandbox/vercel.cjs +1 -0
  424. package/dist/sandbox/vercel.cjs.map +1 -1
  425. package/dist/sandbox/vercel.d.cts +1 -0
  426. package/dist/sandbox/vercel.d.mts +1 -0
  427. package/dist/sandbox/vercel.d.ts +1 -0
  428. package/dist/view/server.cjs +2 -37
  429. package/dist/view/server.cjs.map +1 -1
  430. package/dist/view/server.d.cts +0 -3
  431. package/dist/view/server.d.mts +0 -3
  432. package/dist/view/server.d.ts +0 -3
  433. package/docs-site/zh/reference/builtin-agents.mdx +7 -7
  434. package/docs-site/zh/reference/official-adapters.mdx +4 -4
  435. package/docs-site/zh/reference/report-components.mdx +2 -2
  436. package/docs-site/zh/tutorials/configuration.mdx +2 -2
  437. package/docs-site/zh/tutorials/deploy-report-site.mdx +24 -2
  438. package/docs-site/zh/tutorials/publish-report.mdx +4 -4
  439. package/docs-site/zh/tutorials/sandbox-agent.mdx +5 -5
  440. package/docs-site/zh/tutorials/theming.mdx +2 -2
  441. package/package.json +4 -6
  442. package/dist/record/migration/index.cjs +0 -5
  443. package/dist/record/migration/index.cjs.map +0 -1
  444. package/dist/record/migration/index.d.cts +0 -11
  445. package/dist/record/migration/index.d.mts +0 -11
  446. package/dist/record/migration/index.d.ts +0 -11
  447. package/dist/record/migration/index.js +0 -6
  448. package/dist/record/migration/index.js.map +0 -1
  449. package/dist/report/host/site-runtime.cjs +0 -92
  450. package/dist/report/host/site-runtime.cjs.map +0 -1
  451. package/dist/report/host/site-runtime.d.cts +0 -9
  452. package/dist/report/host/site-runtime.d.mts +0 -9
  453. package/dist/report/host/site-runtime.d.ts +0 -9
  454. package/dist/report/host/site-runtime.js +0 -10
  455. package/dist/report/host/site-runtime.js.map +0 -1
  456. package/dist/view/client-dist/app.css +0 -2
  457. package/dist/view/client-dist/app.js +0 -49
  458. package/dist/view/data.cjs +0 -3
  459. package/dist/view/data.cjs.map +0 -1
  460. package/dist/view/data.d.cts +0 -9
  461. package/dist/view/data.d.mts +0 -9
  462. package/dist/view/data.d.ts +0 -9
  463. package/dist/view/data.js +0 -4
  464. package/dist/view/data.js.map +0 -1
  465. package/dist/view/index.cjs +0 -24
  466. package/dist/view/index.cjs.map +0 -1
  467. package/dist/view/index.d.cts +0 -9
  468. package/dist/view/index.d.mts +0 -9
  469. package/dist/view/index.d.ts +0 -9
  470. package/dist/view/index.js +0 -28
  471. package/dist/view/index.js.map +0 -1
  472. package/dist/view/report-view-cache.cjs +0 -200
  473. package/dist/view/report-view-cache.cjs.map +0 -1
  474. package/dist/view/report-view-cache.d.cts +0 -67
  475. package/dist/view/report-view-cache.d.mts +0 -67
  476. package/dist/view/report-view-cache.d.ts +0 -67
  477. package/dist/view/report-view-cache.js +0 -8
  478. package/dist/view/report-view-cache.js.map +0 -1
  479. package/dist/view/shared/types.cjs +0 -3
  480. package/dist/view/shared/types.cjs.map +0 -1
  481. package/dist/view/shared/types.d.cts +0 -51
  482. package/dist/view/shared/types.d.mts +0 -51
  483. package/dist/view/shared/types.d.ts +0 -51
  484. package/dist/view/shared/types.js +0 -4
  485. package/dist/view/shared/types.js.map +0 -1
  486. package/dist/view/site.cjs +0 -32
  487. package/dist/view/site.cjs.map +0 -1
  488. package/dist/view/site.d.cts +0 -24
  489. package/dist/view/site.d.mts +0 -24
  490. package/dist/view/site.d.ts +0 -24
  491. package/dist/view/site.js +0 -8
  492. package/dist/view/site.js.map +0 -1
  493. package/dist/view/styles.css +0 -170
  494. package/dist/view/template.html +0 -17
@@ -1 +1 @@
1
- {"version":3,"file":"vercel.js","sourceRoot":"","sources":["vercel.ts"],"names":[],"mappings":"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","sourcesContent":["// Vercel Sandbox provider:用 @vercel/sandbox SDK 把 Vercel microVM 当隔离工作区跑 eval。\n// 契约对齐 ../types.ts 的 Sandbox 接口,与 DockerSandbox 可互换。\nimport { Sandbox as VSandbox, APIError } from \"@vercel/sandbox\";\nimport { Effect } from \"effect\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport type { CommandResult, CommandOptions, SandboxReuseCapability, SuccessfulCommandResult, } from \"../types.ts\";\nimport { downloadDirectoryByList } from \"./download-directory.ts\";\nimport { collectLocalFiles, type CollectedLocalFile } from \"./local-files.ts\";\nimport { resolveLocalPath, resolveSandboxPath } from \"./paths.ts\";\nimport { shellQuote } from \"./shell.ts\";\nimport { commandLimit } from \"./deadline.ts\";\nimport { t } from \"../i18n/index.ts\";\nimport { reportActivity, reportDiagnostic } from \"../runner/feedback/sink.ts\";\nimport { classifyProvisionErrorFallback, type SandboxProvisionErrorKind } from \"./errors.ts\";\nimport { successfulCommandResult } from \"./operations.ts\";\nimport { supportedBackendCapability, unsupportedBackendCapability, type SandboxProviderBackend } from \"./backend.ts\";\n/**\n * vercel SDK 对单次 fetch 的 429 已有内部重试(见 @vercel/sandbox 的 with-retry.js,\n * 5 次指数退避);这里再分类是为了给 create() 整体重试兜底——耗尽内部重试后仍返回 429\n * 响应的 APIError,或 create() 轮询 session 状态过程里撞到的限流,都会走到这里。\n */\nexport function classifyProvisionError(e: unknown): SandboxProvisionErrorKind {\n if (e instanceof APIError && e.response.status === 429)\n return \"rate_limit\";\n // SDK 没有按元数据检索实例的通道:歧义类不重试、第一次抛出(见 retry.ts 的 reconcile 语义)。\n return classifyProvisionErrorFallback(e);\n}\n// Vercel Sandbox 的默认工作区路径(SDK writeFiles 默认落这里)。\nconst VERCEL_WORKDIR = \"/vercel/sandbox\";\n// rotate 时停掉旧 session 的等待上限:stop 挂起时不无限拖住当前命令。\nconst STOP_OLD_SESSION_TIMEOUT_MS = 15000;\n/** 给 promise 套超时;到点 fail。计时用 Effect Clock/Sleep,超时分支中断等待 fiber,不再手工管 timer。 */\nfunction withTimeout<T>(promise: Promise<T>, ms: number): Promise<T> {\n return Effect.runPromise(Effect.tryPromise({\n try: () => promise,\n catch: (cause) => cause,\n }).pipe(Effect.timeoutFail({\n duration: ms,\n onTimeout: () => new Error(`timed out after ${ms}ms`),\n })));\n}\nexport class VercelSandbox implements SandboxProviderBackend, SandboxReuseCapability {\n readonly workdir = VERCEL_WORKDIR;\n readonly otlpHost = null;\n private vsb: InstanceType<typeof VSandbox>;\n private commandTimeoutMs?: number;\n private deadlineAt?: number;\n private lifetimeMs?: number;\n private sessionCreatedAt: number;\n private runtime: string;\n /** factory `pathPrepend`;按声明顺序前置到受管 PATH,省略 = 空数组。 */\n private readonly pathPrepend: readonly string[];\n readonly sandboxId: string;\n readonly capabilities = {\n rootCommands: supportedBackendCapability(true as const),\n appendLog: unsupportedBackendCapability,\n suspend: supportedBackendCapability(() => this.suspend()),\n ensureLifetime: supportedBackendCapability((minRemainingMs: number) => this.ensureLifetime(minRemainingMs)),\n setCommandDeadline: supportedBackendCapability((deadlineAt?: number) => this.setCommandDeadline(deadlineAt)),\n };\n private constructor(vsb: InstanceType<typeof VSandbox>, id: string, commandTimeoutMs: number | undefined, runtime: string, pathPrepend: readonly string[] = [], lifetimeMs?: number, deadlineAt?: number) {\n this.vsb = vsb;\n this.sandboxId = id;\n this.commandTimeoutMs = commandTimeoutMs;\n this.deadlineAt = deadlineAt;\n this.sessionCreatedAt = Date.now();\n this.runtime = runtime;\n this.pathPrepend = pathPrepend;\n this.lifetimeMs = lifetimeMs;\n }\n /** 复用下由池在每次借出时换成承接者自己的 deadline(见 sandbox/deadline.ts)。 */\n setCommandDeadline(deadlineAt?: number): void {\n this.deadlineAt = deadlineAt;\n }\n static async create(opts: {\n timeout?: number;\n /** attempt deadline 的截止时刻(epoch ms);单条命令按剩余量取上限。 */\n deadlineAt?: number;\n runtime?: \"node20\" | \"node24\";\n snapshotId?: string;\n /** 实例 session 寿命;由当前 Vercel project plan 在 create 时真实校验。 */\n lifetimeMs?: number;\n feedback?: import(\"../types.ts\").ScopedFeedback;\n /**\n * 按序前置到受管 `PATH` 的目录;省略 = 不改 PATH(见 docs/feature/sandbox/library.md\n * 「PATH:受管变量与 pathPrepend」)。\n */\n pathPrepend?: readonly string[];\n } = {}): Promise<VercelSandbox> {\n // Vercel 支持 node22/node24/node26/python3.13;node20 回退到 node22。\n const runtime = opts.runtime === \"node20\" ? \"node22\" : (opts.runtime ?? \"node24\");\n // 单条命令没有 provider 级默认:上限恒从 attempt deadline 派生(见 deadline.ts)。\n const commandTimeoutMs = opts.timeout;\n // 凭据:优先从 env 显式传入(绕过 OIDC flow,非 TTY 环境也能用)。\n // 需要同时设 VERCEL_API_TOKEN + VERCEL_TEAM_ID + VERCEL_PROJECT_ID 三个。\n const token = process.env.VERCEL_API_TOKEN;\n const teamId = process.env.VERCEL_TEAM_ID;\n const projectId = process.env.VERCEL_PROJECT_ID ?? \"vercel-sandbox-default-project\";\n const credParams = token && teamId ? { token, teamId, projectId } : {};\n // 给了 snapshotId 就从快照起 microVM(预制模板:烘焙好 agent CLI 的快照)。\n const sourceParams = opts.snapshotId ? { source: { type: \"run\", snapshotId: opts.snapshotId } } : {};\n // 未声明 lifetimeMs 时交给 provider 选择默认值;声明后原值交给 provider 校验,绝不按\n // 本地假定的账号上限静默压短。\n const vsb = await VSandbox.create({\n runtime,\n ...(opts.lifetimeMs !== undefined ? { timeout: opts.lifetimeMs } : {}),\n ...sourceParams,\n ...credParams,\n } as Parameters<typeof VSandbox.create>[0]);\n // sandboxId = 沙箱的持久 name(留存唤醒的查找键),不是当前 session 的 sessionId——\n // session 在 rotate / stop-resume 之间会变,name 才是 `Sandbox.get({ name })` 能找回的\n // 稳定身份(SDK 与官方文档都按 name 索引,见 vercel.com/docs/sandbox/cli-reference)。\n const id = vsb.name;\n return new VercelSandbox(vsb, id, commandTimeoutMs, runtime, opts.pathPrepend ?? [], opts.lifetimeMs, opts.deadlineAt);\n }\n // 当前 session 的真实剩余寿命不足以覆盖即将执行的命令时,拍快照并请求一条新 session。\n // 是否允许该请求由当前 project plan 裁决,不维护一张会漂移的本地上限表。\n private async rotateIfNeeded(minRemainingMs: number | undefined): Promise<void> {\n if (minRemainingMs === undefined)\n return;\n const currentSession = this.vsb.currentSession();\n const remainingMs = currentSession.createdAt.getTime() + currentSession.timeout - Date.now();\n if (remainingMs >= minRemainingMs)\n return;\n const requestedLifetimeMs = this.lifetimeMs ?? Math.max(currentSession.timeout, minRemainingMs);\n const elapsed = Date.now() - this.sessionCreatedAt;\n const token = process.env.VERCEL_API_TOKEN;\n const teamId = process.env.VERCEL_TEAM_ID;\n const projectId = process.env.VERCEL_PROJECT_ID ?? \"vercel-sandbox-default-project\";\n const credParams = token && teamId ? { token, teamId, projectId } : {};\n try {\n const snap = await this.vsb.snapshot();\n const snapshotId = snap.snapshotId;\n const newVsb = await VSandbox.create({\n runtime: this.runtime,\n timeout: requestedLifetimeMs,\n source: { type: \"snapshot\", snapshotId },\n ...credParams,\n } as Parameters<typeof VSandbox.create>[0]);\n const oldVsb = this.vsb;\n this.vsb = newVsb;\n this.sessionCreatedAt = Date.now();\n // 旧 session 的 microVM 不随快照 / 新 session 创建自动回收,必须显式 stop,否则每次\n // rotate 都泄漏一台在计费的 microVM。stop 与新 session 无数据依赖,不 await ——\n // 挂起的 stop(最长 15s)不该拖住触发 rotate 的那条命令,还烧新 session 的时长。\n // 失败只警告不静默(旧的到 session timeout 也会被平台回收)。\n void withTimeout(oldVsb.stop(), STOP_OLD_SESSION_TIMEOUT_MS).catch((stopErr) => {\n reportDiagnostic({\n key: \"vercel-stop-rotated-session-failed\",\n severity: \"warning\",\n message: `[VercelSandbox] warning: failed to stop rotated-out session, microVM may leak until session timeout: ${String(stopErr)}`,\n data: { sandboxId: this.sandboxId, error: String(stopErr) },\n });\n });\n reportActivity(t(\"vercel.rotated\", {\n seconds: Math.round(elapsed / 1000),\n sessionId: newVsb.currentSession().sessionId,\n }).trimEnd());\n }\n catch (err) {\n reportDiagnostic({\n key: \"vercel-rotate-failed\",\n severity: \"warning\",\n message: t(\"vercel.rotateFailed\", {\n seconds: Math.round(elapsed / 1000),\n error: String(err),\n }).trimEnd(),\n data: { sandboxId: this.sandboxId, error: String(err) },\n });\n }\n }\n /**\n * 寿命确认:两次都读**当前 session 的远端元数据**(`createdAt + timeout`),不拿本地时钟记账,\n * 也不复读我们请求的续期值——vercel 的 plan 上限决定实际给多少,`extendTimeout` 在超出计划\n * 上限时直接抛 HTTP 400(本仓库真实跑分里恒抛,rotateIfNeeded 那条快照轮换路径就是为它写的)。\n * 请求值当答案会把「平台不给续」伪装成「续上了」,而症状要到实例中途消失才出现。\n */\n async ensureLifetime(minRemainingMs: number): Promise<{\n ready: true;\n expiresAt?: string;\n } | {\n ready: false;\n reason: string;\n }> {\n const remainingMs = (): number => {\n const session = this.vsb.currentSession();\n return session.createdAt.getTime() + session.timeout - Date.now();\n };\n try {\n const before = remainingMs();\n if (before >= minRemainingMs)\n return { ready: true, expiresAt: new Date(Date.now() + before).toISOString() };\n await this.vsb.extendTimeout(minRemainingMs - before);\n const after = remainingMs();\n return after >= minRemainingMs\n ? { ready: true, expiresAt: new Date(Date.now() + after).toISOString() }\n : {\n ready: false,\n reason: `vercel granted only ${Math.round(after / 1000)}s after extendTimeout; the next attempt needs ` +\n `${Math.round(minRemainingMs / 1000)}s (the plan's maximum execution timeout caps it)`,\n };\n }\n catch (e) {\n return {\n ready: false,\n reason: \"vercel refused to extend this sandbox's session (extendTimeout is rejected above the plan's maximum \" +\n `execution timeout): ${e instanceof Error ? e.message : String(e)}`,\n };\n }\n }\n async runCommand(cmd: string, args: readonly string[] = [], opts: CommandOptions = {}): Promise<CommandResult> {\n // pathPrepend 只能在 bash 里靠 `$PATH` 展开;直接 exec 的 cmd/args 不经 shell,\n // 因此路过 runShell 走同一条 bash -c 通道(与 docker `opts.stream` 的 tee 重路由同构)。\n if (this.pathPrepend.length > 0) {\n const joined = [cmd, ...args.map(shellQuote)].join(\" \");\n return this.runShell(joined, opts);\n }\n return this.execDirect(cmd, args, opts);\n }\n async runShell(script: string, opts: CommandOptions = {}): Promise<CommandResult> {\n // pathPrepend 是受管 PATH,在脚本自己的 shell 里对 `$PATH` 前置——env 走的是 SDK 的\n // env 参数(可能被 opts.env.PATH 覆盖),而这一行在它之后执行,始终生效\n // (见 docs/feature/sandbox/library.md「PATH:受管变量与 pathPrepend」)。\n const scriptWithPath = this.pathPrepend.length > 0\n ? `PATH=${shellQuote(this.pathPrepend.join(\":\"))}:\"$PATH\"\\n${script}`\n : script;\n return this.execDirect(\"bash\", [\"-c\", scriptWithPath], opts);\n }\n /** 实际发起 Vercel `runCommand` 调用的唯一出口;`runCommand`/`runShell` 都收敛到这里。 */\n private async execDirect(cmd: string, args: readonly string[], opts: CommandOptions): Promise<CommandResult> {\n // Vercel 命令级只认 `user: \"root\"`(映射 `sudo: true`);其它显式值报错,省略 = `sudo: false`\n // (见 docs/feature/sandbox/library.md「执行身份」)。\n if (opts.user !== undefined && opts.user !== \"root\") {\n throw new Error(t(\"vercel.userUnsupported\", { user: opts.user }));\n }\n const limit = commandLimit(opts, { commandTimeoutMs: this.commandTimeoutMs, deadlineAt: this.deadlineAt });\n // 只有 runner 交付的 attempt deadline 才是「当前物理实例必须承接多久」的请求。\n // 普通 provider 调用或显式的单命令 timeout 只是这条命令的执行上限,不能为此读取\n // currentSession()/轮换实例;前者在留存、文件传输等常规操作中甚至未必可用。\n await this.rotateIfNeeded(this.deadlineAt === undefined ? undefined : limit.timeoutMs);\n const finished = await this.vsb.runCommand({\n cmd,\n args: [...args],\n cwd: resolveSandboxPath(this.workdir, opts.cwd),\n env: opts.env,\n sudo: opts.user === \"root\",\n // per-command 上限从 attempt deadline 的剩余量派生(显式传 timeout 时按显式值);\n // 没有 deadline 就不设,provider 层不发明一条自己的线。\n ...(limit.timeoutMs !== undefined ? { timeoutMs: limit.timeoutMs } : {}),\n signal: opts.signal,\n });\n const stdout = await finished.stdout();\n const stderr = await finished.stderr();\n // Vercel SDK 的命令 API 只在结束后给完整输出;仍兑现 CommandOptions 回调的\n // 「至少一次」语义,让 adapter 不必按 provider 分叉。\n if (stdout)\n await opts.onStdout?.(stdout);\n if (stderr)\n await opts.onStderr?.(stderr);\n return {\n stdout,\n stderr,\n exitCode: finished.exitCode,\n };\n }\n async runCommandOrThrow(cmd: string, args: readonly string[] = [], opts: CommandOptions = {}): Promise<SuccessfulCommandResult> {\n return successfulCommandResult(await this.runCommand(cmd, args, opts), opts.sensitiveValues);\n }\n async runShellOrThrow(script: string, opts: CommandOptions = {}): Promise<SuccessfulCommandResult> {\n return successfulCommandResult(await this.runShell(script, opts), opts.sensitiveValues);\n }\n async readText(path: string): Promise<string> {\n const absPath = resolveSandboxPath(this.workdir, path);\n const buf = await this.vsb.readFileToBuffer({ path: absPath });\n if (!buf)\n throw new Error(t(\"vercel.fileNotFound\", { path: absPath }));\n return buf.toString(\"utf8\");\n }\n async pathExists(path: string): Promise<boolean> {\n const absPath = resolveSandboxPath(this.workdir, path);\n return this.vsb.fs.exists(absPath);\n }\n // targetDir 已由 paths.ts 的 normalizeSandboxPaths 解析成绝对路径;这里再解析一次\n // 只是对直接使用 provider 实例(未包 normalize)的幂等防御,提到 map 外只算一次。\n private async writeCollectedFiles(files: readonly CollectedLocalFile[], targetDir?: string): Promise<void> {\n const base = resolveSandboxPath(this.workdir, targetDir);\n const entries = files.map(({ path, content }) => ({\n path: resolveSandboxPath(base, path),\n content: Buffer.from(content),\n }));\n if (entries.length === 0)\n return;\n await this.vsb.writeFiles(entries);\n }\n async writeText(path: string, content: string): Promise<void> {\n await this.vsb.writeFiles([{ path: resolveSandboxPath(this.workdir, path), content }]);\n }\n async readBytes(path: string): Promise<Uint8Array> {\n const absPath = resolveSandboxPath(this.workdir, path);\n const buf = await this.vsb.readFileToBuffer({ path: absPath });\n if (!buf)\n throw new Error(t(\"vercel.fileNotFound\", { path: absPath }));\n return buf;\n }\n async writeBytes(path: string, content: Uint8Array): Promise<void> {\n await this.vsb.writeFiles([{\n path: resolveSandboxPath(this.workdir, path),\n content: Buffer.from(content),\n }]);\n }\n async uploadFile(source: string | URL, targetPath: string): Promise<void> {\n await this.writeBytes(targetPath, await readFile(resolveLocalPath(undefined, source)));\n }\n async uploadDirectory(sourceDir: string | URL, targetDir?: string, opts: {\n readonly ignore?: readonly string[];\n } = {}): Promise<void> {\n await this.writeCollectedFiles(await collectLocalFiles(resolveLocalPath(undefined, sourceDir), opts.ignore), targetDir);\n }\n /**\n * 递归下载沙箱内一个目录到本地磁盘,与 uploadDirectory 对称:两阶段模板(与 e2b provider\n * 共用)——find 列路径 + 逐文件 readFileToBuffer(独立 HTTP GET)读取,写回本地磁盘。\n */\n async downloadFile(sourcePath: string, target: string | URL): Promise<void> {\n const destination = resolveLocalPath(undefined, target);\n await mkdir(dirname(destination), { recursive: true });\n await writeFile(destination, await this.readBytes(sourcePath));\n }\n async downloadDirectory(sourceDir: string, targetDir: string | URL, opts: {\n readonly ignore?: readonly string[];\n } = {}): Promise<void> {\n const remoteDir = resolveSandboxPath(this.workdir, sourceDir);\n await downloadDirectoryByList({\n localDir: resolveLocalPath(undefined, targetDir),\n ignore: opts.ignore ?? [],\n runShell: (script) => this.runShell(script, { cwd: remoteDir }),\n readOne: (relPath) => this.readBytes(`${remoteDir}/${relPath}`),\n });\n }\n async stop(): Promise<void> {\n await this.vsb.stop();\n }\n /**\n * 留存休眠(suspend):vercel `stop`——sandbox 默认持久,stop 保存文件系统,之后经\n * `Sandbox.get` 恢复(SDK 原生能力);内存态不保留,唤醒后进程要重新启动。\n */\n async suspend(): Promise<void> {\n await this.vsb.stop();\n }\n}\n"]}
1
+ {"version":3,"file":"vercel.js","sourceRoot":"","sources":["vercel.ts"],"names":[],"mappings":"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","sourcesContent":["// Vercel Sandbox provider:用 @vercel/sandbox SDK 把 Vercel microVM 当隔离工作区跑 eval。\n// 契约对齐 ../types.ts 的 Sandbox 接口,与 DockerSandbox 可互换。\nimport { Sandbox as VSandbox, APIError } from \"@vercel/sandbox\";\nimport { Effect } from \"effect\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport type { CommandResult, CommandOptions, SandboxReuseCapability, SuccessfulCommandResult, } from \"../types.ts\";\nimport { downloadDirectoryByList } from \"./download-directory.ts\";\nimport { collectLocalFiles, type CollectedLocalFile } from \"./local-files.ts\";\nimport { resolveLocalPath, resolveSandboxPath } from \"./paths.ts\";\nimport { shellQuote } from \"./shell.ts\";\nimport { commandLimit } from \"./deadline.ts\";\nimport { t } from \"../i18n/index.ts\";\nimport { reportActivity, reportDiagnostic } from \"../runner/feedback/sink.ts\";\nimport { classifyProvisionErrorFallback, type SandboxProvisionErrorKind } from \"./errors.ts\";\nimport { successfulCommandResult } from \"./operations.ts\";\nimport { supportedBackendCapability, unsupportedBackendCapability, unsupportedBackendCapabilityBecause, type SandboxProviderBackend } from \"./backend.ts\";\n/**\n * vercel SDK 对单次 fetch 的 429 已有内部重试(见 @vercel/sandbox 的 with-retry.js,\n * 5 次指数退避);这里再分类是为了给 create() 整体重试兜底——耗尽内部重试后仍返回 429\n * 响应的 APIError,或 create() 轮询 session 状态过程里撞到的限流,都会走到这里。\n */\nexport function classifyProvisionError(e: unknown): SandboxProvisionErrorKind {\n if (e instanceof APIError && e.response.status === 429)\n return \"rate_limit\";\n // SDK 没有按元数据检索实例的通道:歧义类不重试、第一次抛出(见 retry.ts 的 reconcile 语义)。\n return classifyProvisionErrorFallback(e);\n}\n// Vercel Sandbox 的默认工作区路径(SDK writeFiles 默认落这里)。\nconst VERCEL_WORKDIR = \"/vercel/sandbox\";\n// rotate 时停掉旧 session 的等待上限:stop 挂起时不无限拖住当前命令。\nconst STOP_OLD_SESSION_TIMEOUT_MS = 15000;\n/** 给 promise 套超时;到点 fail。计时用 Effect Clock/Sleep,超时分支中断等待 fiber,不再手工管 timer。 */\nfunction withTimeout<T>(promise: Promise<T>, ms: number): Promise<T> {\n return Effect.runPromise(Effect.tryPromise({\n try: () => promise,\n catch: (cause) => cause,\n }).pipe(Effect.timeoutFail({\n duration: ms,\n onTimeout: () => new Error(`timed out after ${ms}ms`),\n })));\n}\nexport class VercelSandbox implements SandboxProviderBackend, SandboxReuseCapability {\n readonly workdir = VERCEL_WORKDIR;\n readonly otlpHost = null;\n private vsb: InstanceType<typeof VSandbox>;\n private commandTimeoutMs?: number;\n private deadlineAt?: number;\n private lifetimeMs?: number;\n private sessionCreatedAt: number;\n private runtime: string;\n /** factory `pathPrepend`;按声明顺序前置到受管 PATH,省略 = 空数组。 */\n private readonly pathPrepend: readonly string[];\n readonly sandboxId: string;\n readonly capabilities = {\n rootCommands: supportedBackendCapability(true as const),\n appendLog: unsupportedBackendCapability,\n suspend: supportedBackendCapability(() => this.suspend()),\n ensureLifetime: supportedBackendCapability((minRemainingMs: number) => this.ensureLifetime(minRemainingMs)),\n setCommandDeadline: supportedBackendCapability((deadlineAt?: number) => this.setCommandDeadline(deadlineAt)),\n managedProcess: unsupportedBackendCapabilityBecause(\"@vercel/sandbox 2.2.1 does not expose bidirectional stdin or raw output chunks\"),\n };\n private constructor(vsb: InstanceType<typeof VSandbox>, id: string, commandTimeoutMs: number | undefined, runtime: string, pathPrepend: readonly string[] = [], lifetimeMs?: number, deadlineAt?: number) {\n this.vsb = vsb;\n this.sandboxId = id;\n this.commandTimeoutMs = commandTimeoutMs;\n this.deadlineAt = deadlineAt;\n this.sessionCreatedAt = Date.now();\n this.runtime = runtime;\n this.pathPrepend = pathPrepend;\n this.lifetimeMs = lifetimeMs;\n }\n /** 复用下由池在每次借出时换成承接者自己的 deadline(见 sandbox/deadline.ts)。 */\n setCommandDeadline(deadlineAt?: number): void {\n this.deadlineAt = deadlineAt;\n }\n static async create(opts: {\n timeout?: number;\n /** attempt deadline 的截止时刻(epoch ms);单条命令按剩余量取上限。 */\n deadlineAt?: number;\n runtime?: \"node20\" | \"node24\";\n snapshotId?: string;\n /** 实例 session 寿命;由当前 Vercel project plan 在 create 时真实校验。 */\n lifetimeMs?: number;\n feedback?: import(\"../types.ts\").ScopedFeedback;\n /**\n * 按序前置到受管 `PATH` 的目录;省略 = 不改 PATH(见 docs/feature/sandbox/library.md\n * 「PATH:受管变量与 pathPrepend」)。\n */\n pathPrepend?: readonly string[];\n } = {}): Promise<VercelSandbox> {\n // Vercel 支持 node22/node24/node26/python3.13;node20 回退到 node22。\n const runtime = opts.runtime === \"node20\" ? \"node22\" : (opts.runtime ?? \"node24\");\n // 单条命令没有 provider 级默认:上限恒从 attempt deadline 派生(见 deadline.ts)。\n const commandTimeoutMs = opts.timeout;\n // 凭据:优先从 env 显式传入(绕过 OIDC flow,非 TTY 环境也能用)。\n // 需要同时设 VERCEL_API_TOKEN + VERCEL_TEAM_ID + VERCEL_PROJECT_ID 三个。\n const token = process.env.VERCEL_API_TOKEN;\n const teamId = process.env.VERCEL_TEAM_ID;\n const projectId = process.env.VERCEL_PROJECT_ID ?? \"vercel-sandbox-default-project\";\n const credParams = token && teamId ? { token, teamId, projectId } : {};\n // 给了 snapshotId 就从快照起 microVM(预制模板:烘焙好 agent CLI 的快照)。\n const sourceParams = opts.snapshotId ? { source: { type: \"run\", snapshotId: opts.snapshotId } } : {};\n // 未声明 lifetimeMs 时交给 provider 选择默认值;声明后原值交给 provider 校验,绝不按\n // 本地假定的账号上限静默压短。\n const vsb = await VSandbox.create({\n runtime,\n ...(opts.lifetimeMs !== undefined ? { timeout: opts.lifetimeMs } : {}),\n ...sourceParams,\n ...credParams,\n } as Parameters<typeof VSandbox.create>[0]);\n // sandboxId = 沙箱的持久 name(留存唤醒的查找键),不是当前 session 的 sessionId——\n // session 在 rotate / stop-resume 之间会变,name 才是 `Sandbox.get({ name })` 能找回的\n // 稳定身份(SDK 与官方文档都按 name 索引,见 vercel.com/docs/sandbox/cli-reference)。\n const id = vsb.name;\n return new VercelSandbox(vsb, id, commandTimeoutMs, runtime, opts.pathPrepend ?? [], opts.lifetimeMs, opts.deadlineAt);\n }\n // 当前 session 的真实剩余寿命不足以覆盖即将执行的命令时,拍快照并请求一条新 session。\n // 是否允许该请求由当前 project plan 裁决,不维护一张会漂移的本地上限表。\n private async rotateIfNeeded(minRemainingMs: number | undefined): Promise<void> {\n if (minRemainingMs === undefined)\n return;\n const currentSession = this.vsb.currentSession();\n const remainingMs = currentSession.createdAt.getTime() + currentSession.timeout - Date.now();\n if (remainingMs >= minRemainingMs)\n return;\n const requestedLifetimeMs = this.lifetimeMs ?? Math.max(currentSession.timeout, minRemainingMs);\n const elapsed = Date.now() - this.sessionCreatedAt;\n const token = process.env.VERCEL_API_TOKEN;\n const teamId = process.env.VERCEL_TEAM_ID;\n const projectId = process.env.VERCEL_PROJECT_ID ?? \"vercel-sandbox-default-project\";\n const credParams = token && teamId ? { token, teamId, projectId } : {};\n try {\n const snap = await this.vsb.snapshot();\n const snapshotId = snap.snapshotId;\n const newVsb = await VSandbox.create({\n runtime: this.runtime,\n timeout: requestedLifetimeMs,\n source: { type: \"snapshot\", snapshotId },\n ...credParams,\n } as Parameters<typeof VSandbox.create>[0]);\n const oldVsb = this.vsb;\n this.vsb = newVsb;\n this.sessionCreatedAt = Date.now();\n // 旧 session 的 microVM 不随快照 / 新 session 创建自动回收,必须显式 stop,否则每次\n // rotate 都泄漏一台在计费的 microVM。stop 与新 session 无数据依赖,不 await ——\n // 挂起的 stop(最长 15s)不该拖住触发 rotate 的那条命令,还烧新 session 的时长。\n // 失败只警告不静默(旧的到 session timeout 也会被平台回收)。\n void withTimeout(oldVsb.stop(), STOP_OLD_SESSION_TIMEOUT_MS).catch((stopErr) => {\n reportDiagnostic({\n key: \"vercel-stop-rotated-session-failed\",\n severity: \"warning\",\n message: `[VercelSandbox] warning: failed to stop rotated-out session, microVM may leak until session timeout: ${String(stopErr)}`,\n data: { sandboxId: this.sandboxId, error: String(stopErr) },\n });\n });\n reportActivity(t(\"vercel.rotated\", {\n seconds: Math.round(elapsed / 1000),\n sessionId: newVsb.currentSession().sessionId,\n }).trimEnd());\n }\n catch (err) {\n reportDiagnostic({\n key: \"vercel-rotate-failed\",\n severity: \"warning\",\n message: t(\"vercel.rotateFailed\", {\n seconds: Math.round(elapsed / 1000),\n error: String(err),\n }).trimEnd(),\n data: { sandboxId: this.sandboxId, error: String(err) },\n });\n }\n }\n /**\n * 寿命确认:两次都读**当前 session 的远端元数据**(`createdAt + timeout`),不拿本地时钟记账,\n * 也不复读我们请求的续期值——vercel 的 plan 上限决定实际给多少,`extendTimeout` 在超出计划\n * 上限时直接抛 HTTP 400(本仓库真实跑分里恒抛,rotateIfNeeded 那条快照轮换路径就是为它写的)。\n * 请求值当答案会把「平台不给续」伪装成「续上了」,而症状要到实例中途消失才出现。\n */\n async ensureLifetime(minRemainingMs: number): Promise<{\n ready: true;\n expiresAt?: string;\n } | {\n ready: false;\n reason: string;\n }> {\n const remainingMs = (): number => {\n const session = this.vsb.currentSession();\n return session.createdAt.getTime() + session.timeout - Date.now();\n };\n try {\n const before = remainingMs();\n if (before >= minRemainingMs)\n return { ready: true, expiresAt: new Date(Date.now() + before).toISOString() };\n await this.vsb.extendTimeout(minRemainingMs - before);\n const after = remainingMs();\n return after >= minRemainingMs\n ? { ready: true, expiresAt: new Date(Date.now() + after).toISOString() }\n : {\n ready: false,\n reason: `vercel granted only ${Math.round(after / 1000)}s after extendTimeout; the next attempt needs ` +\n `${Math.round(minRemainingMs / 1000)}s (the plan's maximum execution timeout caps it)`,\n };\n }\n catch (e) {\n return {\n ready: false,\n reason: \"vercel refused to extend this sandbox's session (extendTimeout is rejected above the plan's maximum \" +\n `execution timeout): ${e instanceof Error ? e.message : String(e)}`,\n };\n }\n }\n async runCommand(cmd: string, args: readonly string[] = [], opts: CommandOptions = {}): Promise<CommandResult> {\n // pathPrepend 只能在 bash 里靠 `$PATH` 展开;直接 exec 的 cmd/args 不经 shell,\n // 因此路过 runShell 走同一条 bash -c 通道(与 docker `opts.stream` 的 tee 重路由同构)。\n if (this.pathPrepend.length > 0) {\n const joined = [cmd, ...args.map(shellQuote)].join(\" \");\n return this.runShell(joined, opts);\n }\n return this.execDirect(cmd, args, opts);\n }\n async runShell(script: string, opts: CommandOptions = {}): Promise<CommandResult> {\n // pathPrepend 是受管 PATH,在脚本自己的 shell 里对 `$PATH` 前置——env 走的是 SDK 的\n // env 参数(可能被 opts.env.PATH 覆盖),而这一行在它之后执行,始终生效\n // (见 docs/feature/sandbox/library.md「PATH:受管变量与 pathPrepend」)。\n const scriptWithPath = this.pathPrepend.length > 0\n ? `PATH=${shellQuote(this.pathPrepend.join(\":\"))}:\"$PATH\"\\n${script}`\n : script;\n return this.execDirect(\"bash\", [\"-c\", scriptWithPath], opts);\n }\n /** 实际发起 Vercel `runCommand` 调用的唯一出口;`runCommand`/`runShell` 都收敛到这里。 */\n private async execDirect(cmd: string, args: readonly string[], opts: CommandOptions): Promise<CommandResult> {\n // Vercel 命令级只认 `user: \"root\"`(映射 `sudo: true`);其它显式值报错,省略 = `sudo: false`\n // (见 docs/feature/sandbox/library.md「执行身份」)。\n if (opts.user !== undefined && opts.user !== \"root\") {\n throw new Error(t(\"vercel.userUnsupported\", { user: opts.user }));\n }\n const limit = commandLimit(opts, { commandTimeoutMs: this.commandTimeoutMs, deadlineAt: this.deadlineAt });\n // 只有 runner 交付的 attempt deadline 才是「当前物理实例必须承接多久」的请求。\n // 普通 provider 调用或显式的单命令 timeout 只是这条命令的执行上限,不能为此读取\n // currentSession()/轮换实例;前者在留存、文件传输等常规操作中甚至未必可用。\n await this.rotateIfNeeded(this.deadlineAt === undefined ? undefined : limit.timeoutMs);\n const finished = await this.vsb.runCommand({\n cmd,\n args: [...args],\n cwd: resolveSandboxPath(this.workdir, opts.cwd),\n env: opts.env,\n sudo: opts.user === \"root\",\n // per-command 上限从 attempt deadline 的剩余量派生(显式传 timeout 时按显式值);\n // 没有 deadline 就不设,provider 层不发明一条自己的线。\n ...(limit.timeoutMs !== undefined ? { timeoutMs: limit.timeoutMs } : {}),\n signal: opts.signal,\n });\n const stdout = await finished.stdout();\n const stderr = await finished.stderr();\n // Vercel SDK 的命令 API 只在结束后给完整输出;仍兑现 CommandOptions 回调的\n // 「至少一次」语义,让 adapter 不必按 provider 分叉。\n if (stdout)\n await opts.onStdout?.(stdout);\n if (stderr)\n await opts.onStderr?.(stderr);\n return {\n stdout,\n stderr,\n exitCode: finished.exitCode,\n };\n }\n async runCommandOrThrow(cmd: string, args: readonly string[] = [], opts: CommandOptions = {}): Promise<SuccessfulCommandResult> {\n return successfulCommandResult(await this.runCommand(cmd, args, opts), opts.sensitiveValues);\n }\n async runShellOrThrow(script: string, opts: CommandOptions = {}): Promise<SuccessfulCommandResult> {\n return successfulCommandResult(await this.runShell(script, opts), opts.sensitiveValues);\n }\n async readText(path: string): Promise<string> {\n const absPath = resolveSandboxPath(this.workdir, path);\n const buf = await this.vsb.readFileToBuffer({ path: absPath });\n if (!buf)\n throw new Error(t(\"vercel.fileNotFound\", { path: absPath }));\n return buf.toString(\"utf8\");\n }\n async pathExists(path: string): Promise<boolean> {\n const absPath = resolveSandboxPath(this.workdir, path);\n return this.vsb.fs.exists(absPath);\n }\n // targetDir 已由 paths.ts 的 normalizeSandboxPaths 解析成绝对路径;这里再解析一次\n // 只是对直接使用 provider 实例(未包 normalize)的幂等防御,提到 map 外只算一次。\n private async writeCollectedFiles(files: readonly CollectedLocalFile[], targetDir?: string): Promise<void> {\n const base = resolveSandboxPath(this.workdir, targetDir);\n const entries = files.map(({ path, content }) => ({\n path: resolveSandboxPath(base, path),\n content: Buffer.from(content),\n }));\n if (entries.length === 0)\n return;\n await this.vsb.writeFiles(entries);\n }\n async writeText(path: string, content: string): Promise<void> {\n await this.vsb.writeFiles([{ path: resolveSandboxPath(this.workdir, path), content }]);\n }\n async readBytes(path: string): Promise<Uint8Array> {\n const absPath = resolveSandboxPath(this.workdir, path);\n const buf = await this.vsb.readFileToBuffer({ path: absPath });\n if (!buf)\n throw new Error(t(\"vercel.fileNotFound\", { path: absPath }));\n return buf;\n }\n async writeBytes(path: string, content: Uint8Array): Promise<void> {\n await this.vsb.writeFiles([{\n path: resolveSandboxPath(this.workdir, path),\n content: Buffer.from(content),\n }]);\n }\n async uploadFile(source: string | URL, targetPath: string): Promise<void> {\n await this.writeBytes(targetPath, await readFile(resolveLocalPath(undefined, source)));\n }\n async uploadDirectory(sourceDir: string | URL, targetDir?: string, opts: {\n readonly ignore?: readonly string[];\n } = {}): Promise<void> {\n await this.writeCollectedFiles(await collectLocalFiles(resolveLocalPath(undefined, sourceDir), opts.ignore), targetDir);\n }\n /**\n * 递归下载沙箱内一个目录到本地磁盘,与 uploadDirectory 对称:两阶段模板(与 e2b provider\n * 共用)——find 列路径 + 逐文件 readFileToBuffer(独立 HTTP GET)读取,写回本地磁盘。\n */\n async downloadFile(sourcePath: string, target: string | URL): Promise<void> {\n const destination = resolveLocalPath(undefined, target);\n await mkdir(dirname(destination), { recursive: true });\n await writeFile(destination, await this.readBytes(sourcePath));\n }\n async downloadDirectory(sourceDir: string, targetDir: string | URL, opts: {\n readonly ignore?: readonly string[];\n } = {}): Promise<void> {\n const remoteDir = resolveSandboxPath(this.workdir, sourceDir);\n await downloadDirectoryByList({\n localDir: resolveLocalPath(undefined, targetDir),\n ignore: opts.ignore ?? [],\n runShell: (script) => this.runShell(script, { cwd: remoteDir }),\n readOne: (relPath) => this.readBytes(`${remoteDir}/${relPath}`),\n });\n }\n async stop(): Promise<void> {\n await this.vsb.stop();\n }\n /**\n * 留存休眠(suspend):vercel `stop`——sandbox 默认持久,stop 保存文件系统,之后经\n * `Sandbox.get` 恢复(SDK 原生能力);内存态不保留,唤醒后进程要重新启动。\n */\n async suspend(): Promise<void> {\n await this.vsb.stop();\n }\n}\n"]}
@@ -31,6 +31,7 @@ export declare class VercelSandbox implements SandboxProviderBackend, SandboxReu
31
31
  reason: string;
32
32
  }>>;
33
33
  setCommandDeadline: import("./backend.cjs").SandboxBackendSupport<(deadlineAt?: number) => void>;
34
+ managedProcess: import("./backend.cjs").SandboxBackendSupport<never>;
34
35
  };
35
36
  private constructor();
36
37
  /** 复用下由池在每次借出时换成承接者自己的 deadline(见 sandbox/deadline.ts)。 */
@@ -31,6 +31,7 @@ export declare class VercelSandbox implements SandboxProviderBackend, SandboxReu
31
31
  reason: string;
32
32
  }>>;
33
33
  setCommandDeadline: import("./backend.mjs").SandboxBackendSupport<(deadlineAt?: number) => void>;
34
+ managedProcess: import("./backend.mjs").SandboxBackendSupport<never>;
34
35
  };
35
36
  private constructor();
36
37
  /** 复用下由池在每次借出时换成承接者自己的 deadline(见 sandbox/deadline.ts)。 */
@@ -31,6 +31,7 @@ export declare class VercelSandbox implements SandboxProviderBackend, SandboxReu
31
31
  reason: string;
32
32
  }>>;
33
33
  setCommandDeadline: import("./backend.js").SandboxBackendSupport<(deadlineAt?: number) => void>;
34
+ managedProcess: import("./backend.js").SandboxBackendSupport<never>;
34
35
  };
35
36
  private constructor();
36
37
  /** 复用下由池在每次借出时换成承接者自己的 deadline(见 sandbox/deadline.ts)。 */
@@ -237,9 +237,6 @@ function serveRequest(session, request, advertisedAuthorities) {
237
237
  }));
238
238
  }
239
239
  const resolved = siteFileForPath(url.pathname, state.current.site);
240
- if (resolved.state === "redirect") {
241
- return effect_1.Effect.sync(() => redirect(request.response, resolved.location, headers));
242
- }
243
240
  if (resolved.state === "missing") {
244
241
  return effect_1.Effect.sync(() => sendText(request.response, 404, url.pathname.startsWith("/downloads/") ? "download not found" : "page not found", headers));
245
242
  }
@@ -517,42 +514,16 @@ function siteFileForPath(pathname, site) {
517
514
  return Object.freeze({ state: "missing" });
518
515
  }
519
516
  const requested = pathname.slice(1);
517
+ // The SPA shell is the revision's sole root document. All business
518
+ // navigation belongs to its hash router, not to host-side path probing.
520
519
  const exact = requested === "" ? "index.html" : requested;
521
520
  const revision = (0, model_ts_1.closedSiteRevisionData)(site);
522
521
  const files = revision.files;
523
- if (requested === "" && revision.defaultRoute !== undefined && revision.defaultRoute !== "/") {
524
- const entryFile = staticPageFileForRoute(revision.defaultRoute);
525
- if (files.some((file) => file.path === entryFile)) {
526
- return Object.freeze({ state: "redirect", location: revision.defaultRoute });
527
- }
528
- }
529
522
  const direct = files.find((file) => file.path === exact);
530
523
  if (direct !== undefined)
531
524
  return Object.freeze({ state: "file", file: direct });
532
- // A report may deliberately declare its first Page at /overview (or another
533
- // route), so its immutable closure has no root index.html. The advertised
534
- // root must still land on that revision's canonical entry route rather than
535
- // becoming a host-generated 404 or re-entering Report execution.
536
- if (requested === "" && revision.defaultRoute !== undefined) {
537
- const entryFile = staticPageFileForRoute(revision.defaultRoute);
538
- if (files.some((file) => file.path === entryFile)) {
539
- return Object.freeze({ state: "redirect", location: revision.defaultRoute });
540
- }
541
- }
542
- // Keep direct Page URLs convenient without manufacturing a different body.
543
- // The redirect selects the exact generated index.html path from this same map.
544
- const indexPath = requested.endsWith("/")
545
- ? `${requested}index.html`
546
- : `${requested}/index.html`;
547
- const page = files.find((file) => file.path === indexPath);
548
- if (page !== undefined) {
549
- return Object.freeze({ state: "redirect", location: `/${indexPath}` });
550
- }
551
525
  return Object.freeze({ state: "missing" });
552
526
  }
553
- function staticPageFileForRoute(route) {
554
- return route === "/" ? "index.html" : `${route.slice(1)}/index.html`;
555
- }
556
527
  function requestUrl(request) {
557
528
  try {
558
529
  return new URL(request.url ?? "/", "http://127.0.0.1");
@@ -584,12 +555,6 @@ function send(response, status, body, contentType, headers) {
584
555
  response.writeHead(status, { "content-type": contentType, ...headers });
585
556
  response.end(body);
586
557
  }
587
- function redirect(response, location, headers) {
588
- if (response.destroyed)
589
- return;
590
- response.writeHead(308, { location, ...headers });
591
- response.end();
592
- }
593
558
  const SAFE_MEDIA_TYPE = /^[A-Za-z0-9!#$%&'*+.^_`|~-]+\/[A-Za-z0-9!#$%&'*+.^_`|~-]+$/;
594
559
  function siteContentType(mediaType) {
595
560
  const base = mediaType.split(";", 1)[0]?.trim() ?? "";
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["server.ts"],"names":[],"mappings":"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","sourcesContent":["// The Node view host owns transport and watch lifetime only. Its caller has\n// already closed Record -> Sample -> Report into a fixed execution rebuild;\n// this module never reopens Record facts.\nimport { readdirSync, statSync, watch, type FSWatcher } from \"node:fs\";\nimport { createServer, type IncomingMessage, type Server, type ServerResponse } from \"node:http\";\nimport type { Socket } from \"node:net\";\nimport { networkInterfaces } from \"node:os\";\nimport { basename, dirname, resolve } from \"node:path\";\nimport { Effect } from \"effect\";\nimport type * as Scope from \"effect/Scope\";\nimport { closedSiteRevisionData, type ClosedSiteFile, type ClosedSiteRevision, } from \"../report/execution/model.ts\";\nimport { openReportViewSession, type OpenReportViewSessionInput, type ReportViewOpenError, type ReportViewSessionClosed, type ReportViewSession, } from \"../report/host/view-session.ts\";\nimport type { ViewScanOptions } from \"./data.ts\";\nexport interface NodeViewServerError {\n readonly code: \"report-view-server-failed\";\n readonly operation: \"open\" | \"listen\" | \"watch\";\n readonly reason: string;\n}\nexport interface ViewOptions<Requirements = never> {\n readonly input?: string;\n readonly out?: string;\n readonly port?: number;\n /** Defaults to loopback. An explicit address opts into that network exposure. */\n readonly host?: string;\n /** Retained for the CLI-shaped facade; it is never interpreted as Record data. */\n readonly scan?: ViewScanOptions;\n /**\n * Bootstrap watch inputs when the session/request has none yet. After each\n * successful rebuild the session revision owns the next-round watch set.\n */\n readonly watchInputs?: readonly string[];\n readonly onRebuild?: (completedAt: Date) => void;\n /** An already-open scoped session owned by the caller. */\n readonly session?: ReportViewSession<Requirements>;\n /** Or let this scope open a session from a caller-supplied current rebuild. */\n readonly request?: OpenReportViewSessionInput<Requirements>;\n}\n/** The native Effect-facing server handle. Its resources are also Scope-owned. */\nexport interface ReportViewServer {\n readonly url: string;\n readonly urls: readonly string[];\n readonly close: Effect.Effect<void>;\n}\nexport type RebuildReason = \"records\" | \"modules\";\ninterface InboxClosed {\n readonly code: \"report-view-inbox-closed\";\n}\nconst inboxClosed: InboxClosed = Object.freeze({ code: \"report-view-inbox-closed\" });\ninterface HttpRequest {\n readonly request: IncomingMessage;\n readonly response: ServerResponse;\n}\nconst HTTP_REQUEST_QUEUE_MAX = 128;\n/**\n * A small callback-to-Effect bridge. Node callbacks only enqueue a value; the\n * long-lived scoped Effect performs every session operation, so callbacks do\n * not create private runtimes or invoke `runPromise`/`runSync`.\n */\nclass Inbox<Value> {\n private readonly values: Value[] = [];\n private resume: ((effect: Effect.Effect<Value, InboxClosed>) => void) | undefined;\n private closed = false;\n constructor(private readonly capacity: number) { }\n take(): Effect.Effect<Value, InboxClosed> {\n return Effect.async((resume) => {\n if (this.values.length > 0) {\n resume(Effect.succeed(this.values.shift()!));\n return Effect.void;\n }\n if (this.closed) {\n resume(Effect.fail(inboxClosed));\n return Effect.void;\n }\n this.resume = resume;\n return Effect.sync(() => {\n if (this.resume === resume)\n this.resume = undefined;\n });\n });\n }\n offer(value: Value): boolean {\n if (this.closed)\n return false;\n const resume = this.resume;\n if (resume === undefined) {\n if (this.values.length >= this.capacity)\n return false;\n this.values.push(value);\n return true;\n }\n this.resume = undefined;\n resume(Effect.succeed(value));\n return true;\n }\n close(): void {\n if (this.closed)\n return;\n this.closed = true;\n const resume = this.resume;\n this.resume = undefined;\n resume?.(Effect.fail(inboxClosed));\n }\n}\n/** Coalesces a burst of filesystem events into sequential refresh requests. */\nclass RefreshInbox {\n private pending = false;\n private resume: ((effect: Effect.Effect<void, InboxClosed>) => void) | undefined;\n private closed = false;\n take(): Effect.Effect<void, InboxClosed> {\n return Effect.async((resume) => {\n if (this.pending) {\n this.pending = false;\n resume(Effect.void);\n return Effect.void;\n }\n if (this.closed) {\n resume(Effect.fail(inboxClosed));\n return Effect.void;\n }\n this.resume = resume;\n return Effect.sync(() => {\n if (this.resume === resume)\n this.resume = undefined;\n });\n });\n }\n request(): void {\n if (this.closed)\n return;\n const resume = this.resume;\n if (resume === undefined) {\n this.pending = true;\n return;\n }\n this.resume = undefined;\n resume(Effect.void);\n }\n close(): void {\n if (this.closed)\n return;\n this.closed = true;\n const resume = this.resume;\n this.resume = undefined;\n resume?.(Effect.fail(inboxClosed));\n }\n}\ninterface ServerResources {\n readonly server: Server;\n readonly sockets: Set<Socket>;\n readonly requests: Inbox<HttpRequest>;\n readonly refreshes: RefreshInbox;\n closed: boolean;\n}\ninterface WatchResources {\n /** The one currently published watcher closure. */\n current: WatchSet;\n /** Stable refresh request callback for the current server lifetime. */\n onChange: () => void;\n closed: boolean;\n}\n/**\n * A complete watcher closure. A candidate stays `opening` until every watch\n * for its current directory tree has opened. Callbacks test both this state\n * and the owning resource's current reference, so an old or failed candidate\n * cannot enqueue a late rebuild.\n */\ninterface WatchSet {\n readonly inputs: readonly string[];\n readonly watchers: Map<string, FSWatcher>;\n state: \"opening\" | \"active\" | \"closed\";\n}\n/**\n * Opens a real HTTP server, defaulting to loopback. A watcher event only requests\n * `session.refresh`; the session serializes rebuild and close, preserves the\n * last good immutable execution and recoverable watch set, and publishes a new\n * revision only on success. The Node server then atomically replaces its\n * fs.watch resources from that revision's watchInputs.\n */\nexport function openViewServer<Requirements>(options: ViewOptions<Requirements> = {}): Effect.Effect<ReportViewServer, NodeViewServerError | ReportViewOpenError, Scope.Scope | Requirements> {\n return Effect.gen(function* () {\n const serverScope = yield* Effect.scope;\n if (options.session !== undefined && options.request !== undefined) {\n return yield* Effect.fail(serverError(\"open\", \"provide either session or request, not both\"));\n }\n const host = (options.host ?? \"127.0.0.1\").trim();\n if (host.length === 0) {\n return yield* Effect.fail(serverError(\"open\", \"view host must not be empty\"));\n }\n if (host.includes(\"%\")) {\n return yield* Effect.fail(serverError(\"open\", \"scoped IPv6 view hosts are not supported\"));\n }\n const port = options.port ?? 0;\n if (!Number.isInteger(port) || port < 0 || port > 65535) {\n return yield* Effect.fail(serverError(\"open\", `view port must be an integer from 0 through 65535, got ${port}`));\n }\n const session = options.session ?? (options.request === undefined\n ? yield* Effect.fail(serverError(\"open\", \"view needs a scoped ReportViewSession or current rebuild request\"))\n : yield* openReportViewSession({\n ...options.request,\n // Bootstrap the opening revision when the request omitted a watch set.\n watchInputs: options.request.watchInputs ?? optionWatchInputs(options),\n }));\n const opening = yield* session.snapshot.pipe(Effect.mapError(() => serverError(\"open\", \"report view session closed before watchers opened\")));\n const initialWatchInputs = opening.current.watchInputs.length > 0\n ? opening.current.watchInputs\n : optionWatchInputs(options);\n const resources = yield* Effect.acquireRelease(Effect.sync(() => makeResources()), (value) => closeResources(value));\n const address = yield* listen(resources.server, host, port);\n const urls = viewUrls(host, address.port);\n const advertisedAuthorities = Object.freeze(new Set(urls.map((url) => new URL(url).host)));\n const watches = yield* Effect.acquireRelease(openWatchers(initialWatchInputs, () => resources.refreshes.request()), (value) => closeWatchers(value));\n yield* Effect.forkScoped(Effect.forever(Effect.flatMap(resources.requests.take(), (request) => serveRequest(session, request, advertisedAuthorities))).pipe(Effect.catchAll(() => Effect.void)));\n yield* Effect.forkScoped(Effect.forever(Effect.flatMap(resources.refreshes.take(), () => registerRefreshIntent(session, watches, options.onRebuild, serverScope))).pipe(Effect.catchAll(() => Effect.void)));\n const close = Effect.zipRight(closeWatchers(watches), closeResources(resources));\n return Object.freeze({ url: urls[0]!, urls, close });\n });\n}\nfunction makeResources(): ServerResources {\n const requests = new Inbox<HttpRequest>(HTTP_REQUEST_QUEUE_MAX);\n const refreshes = new RefreshInbox();\n const sockets = new Set<Socket>();\n const server = createServer((request, response) => {\n if (!requests.offer(Object.freeze({ request, response }))) {\n sendText(response, 503, \"report view is busy; retry shortly\");\n }\n });\n server.on(\"connection\", (socket) => {\n sockets.add(socket);\n socket.once(\"close\", () => sockets.delete(socket));\n });\n return { server, sockets, requests, refreshes, closed: false };\n}\nfunction listen(server: Server, host: string, port: number): Effect.Effect<{\n readonly host: string;\n readonly port: number;\n}, NodeViewServerError> {\n return Effect.async((resume) => {\n const cleanup = (): void => {\n server.off(\"error\", onError);\n server.off(\"listening\", onListening);\n };\n const onError = (error: Error): void => {\n cleanup();\n resume(Effect.fail(serverError(\"listen\", error.message)));\n };\n const onListening = (): void => {\n cleanup();\n const address = server.address();\n if (address === null || typeof address === \"string\") {\n resume(Effect.fail(serverError(\"listen\", \"server did not expose a TCP address\")));\n return;\n }\n resume(Effect.succeed(Object.freeze({ host: address.address, port: address.port })));\n };\n server.once(\"error\", onError);\n server.once(\"listening\", onListening);\n try {\n server.listen({ host, port });\n }\n catch (error) {\n onError(asError(error));\n }\n return Effect.sync(() => cleanup());\n });\n}\nfunction serveRequest<Requirements>(session: ReportViewSession<Requirements>, request: HttpRequest, advertisedAuthorities: ReadonlySet<string>): Effect.Effect<void> {\n const authority = requestAuthority(request.request.headers.host);\n if (authority === undefined || !advertisedAuthorities.has(authority)) {\n return Effect.sync(() => sendText(request.response, 421, \"view host is not advertised\"));\n }\n if (request.request.method !== \"GET\" && request.request.method !== \"HEAD\") {\n return Effect.sync(() => sendText(request.response, 405, \"method not allowed\", { allow: \"GET, HEAD\" }));\n }\n const url = requestUrl(request.request);\n if (url === undefined) {\n return Effect.sync(() => sendText(request.response, 400, \"bad request\"));\n }\n if (url.pathname === \"/healthz\") {\n return Effect.sync(() => sendText(request.response, 200, \"ok\"));\n }\n return session.snapshot.pipe(Effect.flatMap((state) => {\n const headers = Object.freeze({\n \"cache-control\": \"no-store\",\n \"x-niceeval-report-revision\": String(state.current.revision),\n \"x-niceeval-report-content-hash\": closedSiteRevisionData(state.current.site).identity.contentHash,\n ...(state.lastProblem === undefined ? {} : { \"x-niceeval-last-rebuild-problem\": \"1\" }),\n });\n // Optional host transport probe. It contains no Report body and does\n // not belong to the content-addressed file mapping. The HTML response\n // below establishes its own served revision through an HttpOnly cookie;\n // after publication this endpoint can report that the browser document\n // is stale without putting revision information into its body bytes.\n if (url.pathname === \"/_niceeval/refresh\") {\n const servedIdentity = reportRevisionCookieValue(request.request.headers.cookie);\n return Effect.sync(() => send(request.response, 204, new Uint8Array(), \"text/plain; charset=utf-8\", {\n ...headers,\n \"x-niceeval-view-stale\": servedIdentity === undefined || servedIdentity === closedSiteRevisionData(state.current.site).identity.contentHash\n ? \"0\"\n : \"1\",\n }));\n }\n const resolved = siteFileForPath(url.pathname, state.current.site);\n if (resolved.state === \"redirect\") {\n return Effect.sync(() => redirect(request.response, resolved.location, headers));\n }\n if (resolved.state === \"missing\") {\n return Effect.sync(() => sendText(request.response, 404, url.pathname.startsWith(\"/downloads/\") ? \"download not found\" : \"page not found\", headers));\n }\n return Effect.sync(() => send(request.response, 200, resolved.file.bytes, siteContentType(resolved.file.mediaType), resolved.file.path.startsWith(\"downloads/\")\n ? { ...headers, \"content-disposition\": \"attachment\", \"x-content-type-options\": \"nosniff\" }\n : resolved.file.mediaType.startsWith(\"text/html;\")\n ? { ...headers, \"set-cookie\": reportRevisionCookie(closedSiteRevisionData(state.current.site).identity.contentHash) }\n : headers));\n }), Effect.catchAll(() => Effect.sync(() => sendText(request.response, 503, \"report view session is closed\"))));\n}\n/**\n * Register immediately, then subscribe in a scoped waiter. The refresh inbox\n * can therefore accept a newer intent while this candidate still performs\n * author work; only a published outcome mutates watcher ownership or emits a\n * browser-facing rebuild notification.\n */\nfunction registerRefreshIntent<Requirements>(session: ReportViewSession<Requirements>, watches: WatchResources, onRebuild: ViewOptions[\"onRebuild\"], serverScope: Scope.Scope): Effect.Effect<void, ReportViewSessionClosed, Requirements> {\n return Effect.gen(function* () {\n const intent = yield* session.refresh;\n yield* Effect.forkIn(intent.outcome.pipe(Effect.flatMap((outcome) => outcome.state !== \"published\"\n ? Effect.void\n : Effect.gen(function* () {\n // One published revision owns its corresponding successful watch set.\n yield* Effect.sync(() => replaceWatchInputs(watches, outcome.revision.watchInputs));\n if (onRebuild !== undefined) {\n yield* Effect.try({\n try: () => onRebuild(new Date()),\n catch: () => undefined,\n }).pipe(Effect.ignore);\n }\n }))), serverScope);\n });\n}\nfunction optionWatchInputs<Requirements>(options: ViewOptions<Requirements>): readonly string[] {\n const values = options.watchInputs ?? [];\n return Object.freeze([...new Set(values.map((value) => resolve(value)))]);\n}\nfunction openWatchers(inputs: readonly string[], onChange: () => void): Effect.Effect<WatchResources, NodeViewServerError> {\n return Effect.try({\n try: () => {\n const resources: WatchResources = {\n current: closedWatchSet(),\n onChange,\n closed: false,\n };\n try {\n const opening = openWatchSet(resources, inputs);\n publishWatchSet(resources, opening);\n return resources;\n }\n catch (error) {\n closeWatchSet(resources.current);\n throw error;\n }\n },\n catch: (error): NodeViewServerError => serverError(\"watch\", asError(error).message),\n });\n}\n/**\n * Atomically swaps the next-round watch set after a successful revision. Failure\n * paths never call this, so last-good entry edges remain recoverable.\n */\nfunction replaceWatchInputs(resources: WatchResources, inputs: readonly string[]): void {\n if (resources.closed)\n return;\n try {\n const opening = openWatchSet(resources, inputs);\n if (resources.closed) {\n closeWatchSet(opening);\n return;\n }\n // No Effect boundary or callback can interleave this publication: the\n // replacement is entirely synchronous after the candidate validated.\n publishWatchSet(resources, opening);\n }\n catch {\n // A transient directory race must not discard the previous recoverable\n // closure. The next filesystem hint retries full reconciliation.\n }\n}\nfunction closedWatchSet(): WatchSet {\n return {\n inputs: Object.freeze([]),\n watchers: new Map(),\n state: \"closed\",\n };\n}\n/**\n * Opens a whole candidate closure without touching the published set. This is\n * also the full reconciliation path for directory-tree changes: fs.watch is a\n * hint, so every event rescans all inputs before requesting a rebuild.\n */\nfunction openWatchSet(resources: WatchResources, inputs: readonly string[]): WatchSet {\n const watchSet: WatchSet = {\n inputs: normalizeWatchInputs(inputs),\n watchers: new Map(),\n state: \"opening\",\n };\n try {\n synchronizeWatchSet(resources, watchSet);\n return watchSet;\n }\n catch (error) {\n closeWatchSet(watchSet);\n throw error;\n }\n}\n/** Watch the Record root and its current Run directories without a polling loop. */\nfunction synchronizeWatchSet(resources: WatchResources, watchSet: WatchSet): void {\n for (const input of watchSet.inputs) {\n let inputIsDirectory: boolean;\n try {\n inputIsDirectory = statSync(input).isDirectory();\n }\n catch (error) {\n if (!isMissingPath(error))\n throw error;\n // A missing config / module / Record root remains observable through its\n // parent directory. It can appear later without restarting the host.\n watchNamedInput(resources, watchSet, dirname(input), basename(input));\n continue;\n }\n if (inputIsDirectory) {\n watchDirectoryTree(resources, watchSet, input, 0);\n }\n else {\n watchNamedInput(resources, watchSet, dirname(input), basename(input));\n }\n }\n}\nfunction normalizeWatchInputs(inputs: readonly string[]): readonly string[] {\n return Object.freeze([...new Set(inputs.map((input) => resolve(input)))].sort());\n}\nconst WATCH_DIRECTORY_DEPTH_MAX = 4;\nfunction watchDirectoryTree(resources: WatchResources, watchSet: WatchSet, directory: string, depth: number): void {\n try {\n watchDirectory(resources, watchSet, directory);\n }\n catch (error) {\n if (!isMissingPath(error))\n throw error;\n watchNamedInput(resources, watchSet, dirname(directory), basename(directory));\n return;\n }\n if (depth >= WATCH_DIRECTORY_DEPTH_MAX)\n return;\n let entries: readonly {\n readonly name: string;\n isDirectory(): boolean;\n }[];\n try {\n entries = readdirSync(directory, { withFileTypes: true });\n }\n catch (error) {\n if (!isMissingPath(error))\n throw error;\n watchNamedInput(resources, watchSet, dirname(directory), basename(directory));\n return;\n }\n for (const entry of entries) {\n if (entry.isDirectory()) {\n watchDirectoryTree(resources, watchSet, resolve(directory, entry.name), depth + 1);\n }\n }\n}\nfunction watchDirectory(resources: WatchResources, watchSet: WatchSet, directory: string): void {\n const key = `directory:${directory}`;\n if (watchSet.watchers.has(key))\n return;\n const watcher = watch(directory, () => watchSetChanged(resources, watchSet));\n watchSet.watchers.set(key, watcher);\n watchFailure(resources, watchSet, key, watcher);\n}\nfunction watchNamedInput(resources: WatchResources, watchSet: WatchSet, directory: string, name: string): void {\n const key = `named:${directory}:${name}`;\n if (watchSet.watchers.has(key))\n return;\n const watcher = watch(directory, (_event, filename) => {\n if (filename === null || filename.toString() === name)\n watchSetChanged(resources, watchSet);\n });\n watchSet.watchers.set(key, watcher);\n watchFailure(resources, watchSet, key, watcher);\n}\nfunction watchFailure(resources: WatchResources, watchSet: WatchSet, key: string, watcher: FSWatcher): void {\n watcher.once(\"error\", () => {\n if (watchSet.watchers.get(key) === watcher) {\n watchSet.watchers.delete(key);\n closeWatcher(watcher);\n }\n watchSetChanged(resources, watchSet);\n });\n}\nfunction watchSetChanged(resources: WatchResources, watchSet: WatchSet): void {\n if (!isCurrentWatchSet(resources, watchSet))\n return;\n // A new Run gets its own directory before its completion marker. Reconcile\n // the whole closure now so the marker change is observed as well as the\n // first incomplete rebuild. Failure leaves this complete old set active.\n replaceWatchInputs(resources, watchSet.inputs);\n if (isCurrentWatchSet(resources, resources.current))\n resources.onChange();\n}\nfunction isCurrentWatchSet(resources: WatchResources, watchSet: WatchSet): boolean {\n return !resources.closed && resources.current === watchSet && watchSet.state === \"active\";\n}\n/** Publishes a fully opened candidate, then retires the old closure synchronously. */\nfunction publishWatchSet(resources: WatchResources, opening: WatchSet): void {\n if (resources.closed) {\n closeWatchSet(opening);\n return;\n }\n const previous = resources.current;\n opening.state = \"active\";\n resources.current = opening;\n closeWatchSet(previous);\n}\nfunction closeWatchSet(watchSet: WatchSet): void {\n if (watchSet.state === \"closed\")\n return;\n watchSet.state = \"closed\";\n const watchers = [...watchSet.watchers.values()];\n watchSet.watchers.clear();\n for (const watcher of watchers)\n closeWatcher(watcher);\n}\nfunction closeWatcher(watcher: FSWatcher): void {\n try {\n watcher.close();\n }\n catch {\n // Closing is best-effort and idempotent at the Node boundary.\n }\n}\nfunction closeResources(resources: ServerResources): Effect.Effect<void> {\n return Effect.suspend(() => {\n if (resources.closed)\n return Effect.void;\n resources.closed = true;\n return Effect.zipRight(Effect.sync(() => {\n resources.requests.close();\n resources.refreshes.close();\n for (const socket of resources.sockets)\n socket.destroy();\n }), closeServer(resources.server));\n });\n}\nfunction closeWatchers(resources: WatchResources): Effect.Effect<void> {\n return Effect.suspend(() => {\n if (resources.closed)\n return Effect.void;\n resources.closed = true;\n return Effect.sync(() => closeWatchSet(resources.current));\n });\n}\nfunction closeServer(server: Server): Effect.Effect<void> {\n return Effect.async((resume) => {\n if (!server.listening) {\n resume(Effect.void);\n return Effect.void;\n }\n try {\n server.close(() => resume(Effect.void));\n }\n catch {\n resume(Effect.void);\n }\n return Effect.void;\n });\n}\ntype SitePathLookup = {\n readonly state: \"file\";\n readonly file: ClosedSiteFile;\n} | {\n readonly state: \"redirect\";\n readonly location: string;\n} | {\n readonly state: \"missing\";\n};\n/**\n * Resolves HTTP paths strictly through the current revision's finished file\n * map. There is intentionally no route callback, renderer, Sample, or Record\n * fallback here, so a request can never splice two revisions together.\n */\nfunction siteFileForPath(pathname: string, site: ClosedSiteRevision): SitePathLookup {\n if (!pathname.startsWith(\"/\") || pathname.includes(\"%\") || pathname.includes(\"\\\\\")) {\n return Object.freeze({ state: \"missing\" as const });\n }\n const requested = pathname.slice(1);\n const exact = requested === \"\" ? \"index.html\" : requested;\n const revision = closedSiteRevisionData(site);\n const files = revision.files;\n if (requested === \"\" && revision.defaultRoute !== undefined && revision.defaultRoute !== \"/\") {\n const entryFile = staticPageFileForRoute(revision.defaultRoute);\n if (files.some((file) => file.path === entryFile)) {\n return Object.freeze({ state: \"redirect\" as const, location: revision.defaultRoute });\n }\n }\n const direct = files.find((file) => file.path === exact);\n if (direct !== undefined)\n return Object.freeze({ state: \"file\" as const, file: direct });\n // A report may deliberately declare its first Page at /overview (or another\n // route), so its immutable closure has no root index.html. The advertised\n // root must still land on that revision's canonical entry route rather than\n // becoming a host-generated 404 or re-entering Report execution.\n if (requested === \"\" && revision.defaultRoute !== undefined) {\n const entryFile = staticPageFileForRoute(revision.defaultRoute);\n if (files.some((file) => file.path === entryFile)) {\n return Object.freeze({ state: \"redirect\" as const, location: revision.defaultRoute });\n }\n }\n // Keep direct Page URLs convenient without manufacturing a different body.\n // The redirect selects the exact generated index.html path from this same map.\n const indexPath = requested.endsWith(\"/\")\n ? `${requested}index.html`\n : `${requested}/index.html`;\n const page = files.find((file) => file.path === indexPath);\n if (page !== undefined) {\n return Object.freeze({ state: \"redirect\" as const, location: `/${indexPath}` });\n }\n return Object.freeze({ state: \"missing\" as const });\n}\nfunction staticPageFileForRoute(route: string): string {\n return route === \"/\" ? \"index.html\" : `${route.slice(1)}/index.html`;\n}\nfunction requestUrl(request: IncomingMessage): URL | undefined {\n try {\n return new URL(request.url ?? \"/\", \"http://127.0.0.1\");\n }\n catch {\n return undefined;\n }\n}\nconst REPORT_REVISION_COOKIE = \"niceeval_report_revision\";\nfunction reportRevisionCookie(contentHash: string): string {\n return `${REPORT_REVISION_COOKIE}=${contentHash}; Path=/; SameSite=Strict; HttpOnly`;\n}\nfunction reportRevisionCookieValue(cookie: string | undefined): string | undefined {\n if (cookie === undefined)\n return undefined;\n for (const entry of cookie.split(\";\")) {\n const [name, ...value] = entry.trim().split(\"=\");\n if (name === REPORT_REVISION_COOKIE)\n return value.join(\"=\");\n }\n return undefined;\n}\nfunction sendText(response: ServerResponse, status: number, body: string, headers: Readonly<Record<string, string>> = {}): void {\n send(response, status, body, \"text/plain; charset=utf-8\", headers);\n}\nfunction send(response: ServerResponse, status: number, body: string | Uint8Array, contentType: string, headers: Readonly<Record<string, string>>): void {\n if (response.destroyed)\n return;\n response.writeHead(status, { \"content-type\": contentType, ...headers });\n response.end(body);\n}\nfunction redirect(response: ServerResponse, location: string, headers: Readonly<Record<string, string>>): void {\n if (response.destroyed)\n return;\n response.writeHead(308, { location, ...headers });\n response.end();\n}\nconst SAFE_MEDIA_TYPE = /^[A-Za-z0-9!#$%&'*+.^_`|~-]+\\/[A-Za-z0-9!#$%&'*+.^_`|~-]+$/;\nfunction siteContentType(mediaType: string): string {\n const base = mediaType.split(\";\", 1)[0]?.trim() ?? \"\";\n return SAFE_MEDIA_TYPE.test(base) ? base : \"application/octet-stream\";\n}\nfunction viewUrls(host: string, port: number): readonly string[] {\n if (host === \"0.0.0.0\") {\n return urlsForAddresses([\n \"127.0.0.1\",\n ...interfaceAddresses(\"IPv4\"),\n ], port);\n }\n if (host === \"::\") {\n return urlsForAddresses([\n \"::1\",\n ...interfaceAddresses(\"IPv6\"),\n ], port);\n }\n return Object.freeze([viewUrl(host, port)]);\n}\nfunction interfaceAddresses(family: \"IPv4\" | \"IPv6\"): readonly string[] {\n const addresses: string[] = [];\n for (const entries of Object.values(networkInterfaces())) {\n for (const entry of entries ?? []) {\n if (entry.family === family &&\n !entry.internal &&\n !entry.address.includes(\"%\") &&\n (family !== \"IPv6\" || entry.scopeid === 0)) {\n addresses.push(entry.address);\n }\n }\n }\n return addresses.sort((left, right) => left.localeCompare(right));\n}\nfunction urlsForAddresses(addresses: readonly string[], port: number): readonly string[] {\n return Object.freeze([...new Set(addresses)].map((address) => viewUrl(address, port)));\n}\nfunction viewUrl(host: string, port: number): string {\n return new URL(`http://${formatHost(host)}:${port}/`).toString();\n}\nfunction requestAuthority(value: string | undefined): string | undefined {\n if (value === undefined)\n return undefined;\n try {\n const url = new URL(`http://${value}`);\n if (url.username.length > 0 || url.password.length > 0)\n return undefined;\n return url.host;\n }\n catch {\n return undefined;\n }\n}\nfunction formatHost(host: string): string {\n return host.includes(\":\") ? `[${host}]` : host;\n}\nfunction serverError(operation: NodeViewServerError[\"operation\"], reason: string): NodeViewServerError {\n return Object.freeze({ code: \"report-view-server-failed\", operation, reason });\n}\nfunction asError(error: unknown): Error {\n return error instanceof Error ? error : new Error(String(error));\n}\nfunction isMissingPath(error: unknown): boolean {\n if (typeof error !== \"object\" || error === null)\n return false;\n const code = Reflect.get(error, \"code\");\n return code === \"ENOENT\" || code === \"ENOTDIR\";\n}\n"]}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["server.ts"],"names":[],"mappings":"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","sourcesContent":["// The Node view host owns transport and watch lifetime only. Its caller has\n// already closed Record -> Sample -> Report into a fixed execution rebuild;\n// this module never reopens Record facts.\nimport { readdirSync, statSync, watch, type FSWatcher } from \"node:fs\";\nimport { createServer, type IncomingMessage, type Server, type ServerResponse } from \"node:http\";\nimport type { Socket } from \"node:net\";\nimport { networkInterfaces } from \"node:os\";\nimport { basename, dirname, resolve } from \"node:path\";\nimport { Effect } from \"effect\";\nimport type * as Scope from \"effect/Scope\";\nimport { closedSiteRevisionData, type ClosedSiteFile, type ClosedSiteRevision, } from \"../report/execution/model.ts\";\nimport { openReportViewSession, type OpenReportViewSessionInput, type ReportViewOpenError, type ReportViewSessionClosed, type ReportViewSession, } from \"../report/host/view-session.ts\";\nexport interface NodeViewServerError {\n readonly code: \"report-view-server-failed\";\n readonly operation: \"open\" | \"listen\" | \"watch\";\n readonly reason: string;\n}\nexport interface ViewOptions<Requirements = never> {\n readonly input?: string;\n readonly out?: string;\n readonly port?: number;\n /** Defaults to loopback. An explicit address opts into that network exposure. */\n readonly host?: string;\n /**\n * Bootstrap watch inputs when the session/request has none yet. After each\n * successful rebuild the session revision owns the next-round watch set.\n */\n readonly watchInputs?: readonly string[];\n readonly onRebuild?: (completedAt: Date) => void;\n /** An already-open scoped session owned by the caller. */\n readonly session?: ReportViewSession<Requirements>;\n /** Or let this scope open a session from a caller-supplied current rebuild. */\n readonly request?: OpenReportViewSessionInput<Requirements>;\n}\n/** The native Effect-facing server handle. Its resources are also Scope-owned. */\nexport interface ReportViewServer {\n readonly url: string;\n readonly urls: readonly string[];\n readonly close: Effect.Effect<void>;\n}\nexport type RebuildReason = \"records\" | \"modules\";\ninterface InboxClosed {\n readonly code: \"report-view-inbox-closed\";\n}\nconst inboxClosed: InboxClosed = Object.freeze({ code: \"report-view-inbox-closed\" });\ninterface HttpRequest {\n readonly request: IncomingMessage;\n readonly response: ServerResponse;\n}\nconst HTTP_REQUEST_QUEUE_MAX = 128;\n/**\n * A small callback-to-Effect bridge. Node callbacks only enqueue a value; the\n * long-lived scoped Effect performs every session operation, so callbacks do\n * not create private runtimes or invoke `runPromise`/`runSync`.\n */\nclass Inbox<Value> {\n private readonly values: Value[] = [];\n private resume: ((effect: Effect.Effect<Value, InboxClosed>) => void) | undefined;\n private closed = false;\n constructor(private readonly capacity: number) { }\n take(): Effect.Effect<Value, InboxClosed> {\n return Effect.async((resume) => {\n if (this.values.length > 0) {\n resume(Effect.succeed(this.values.shift()!));\n return Effect.void;\n }\n if (this.closed) {\n resume(Effect.fail(inboxClosed));\n return Effect.void;\n }\n this.resume = resume;\n return Effect.sync(() => {\n if (this.resume === resume)\n this.resume = undefined;\n });\n });\n }\n offer(value: Value): boolean {\n if (this.closed)\n return false;\n const resume = this.resume;\n if (resume === undefined) {\n if (this.values.length >= this.capacity)\n return false;\n this.values.push(value);\n return true;\n }\n this.resume = undefined;\n resume(Effect.succeed(value));\n return true;\n }\n close(): void {\n if (this.closed)\n return;\n this.closed = true;\n const resume = this.resume;\n this.resume = undefined;\n resume?.(Effect.fail(inboxClosed));\n }\n}\n/** Coalesces a burst of filesystem events into sequential refresh requests. */\nclass RefreshInbox {\n private pending = false;\n private resume: ((effect: Effect.Effect<void, InboxClosed>) => void) | undefined;\n private closed = false;\n take(): Effect.Effect<void, InboxClosed> {\n return Effect.async((resume) => {\n if (this.pending) {\n this.pending = false;\n resume(Effect.void);\n return Effect.void;\n }\n if (this.closed) {\n resume(Effect.fail(inboxClosed));\n return Effect.void;\n }\n this.resume = resume;\n return Effect.sync(() => {\n if (this.resume === resume)\n this.resume = undefined;\n });\n });\n }\n request(): void {\n if (this.closed)\n return;\n const resume = this.resume;\n if (resume === undefined) {\n this.pending = true;\n return;\n }\n this.resume = undefined;\n resume(Effect.void);\n }\n close(): void {\n if (this.closed)\n return;\n this.closed = true;\n const resume = this.resume;\n this.resume = undefined;\n resume?.(Effect.fail(inboxClosed));\n }\n}\ninterface ServerResources {\n readonly server: Server;\n readonly sockets: Set<Socket>;\n readonly requests: Inbox<HttpRequest>;\n readonly refreshes: RefreshInbox;\n closed: boolean;\n}\ninterface WatchResources {\n /** The one currently published watcher closure. */\n current: WatchSet;\n /** Stable refresh request callback for the current server lifetime. */\n onChange: () => void;\n closed: boolean;\n}\n/**\n * A complete watcher closure. A candidate stays `opening` until every watch\n * for its current directory tree has opened. Callbacks test both this state\n * and the owning resource's current reference, so an old or failed candidate\n * cannot enqueue a late rebuild.\n */\ninterface WatchSet {\n readonly inputs: readonly string[];\n readonly watchers: Map<string, FSWatcher>;\n state: \"opening\" | \"active\" | \"closed\";\n}\n/**\n * Opens a real HTTP server, defaulting to loopback. A watcher event only requests\n * `session.refresh`; the session serializes rebuild and close, preserves the\n * last good immutable execution and recoverable watch set, and publishes a new\n * revision only on success. The Node server then atomically replaces its\n * fs.watch resources from that revision's watchInputs.\n */\nexport function openViewServer<Requirements>(options: ViewOptions<Requirements> = {}): Effect.Effect<ReportViewServer, NodeViewServerError | ReportViewOpenError, Scope.Scope | Requirements> {\n return Effect.gen(function* () {\n const serverScope = yield* Effect.scope;\n if (options.session !== undefined && options.request !== undefined) {\n return yield* Effect.fail(serverError(\"open\", \"provide either session or request, not both\"));\n }\n const host = (options.host ?? \"127.0.0.1\").trim();\n if (host.length === 0) {\n return yield* Effect.fail(serverError(\"open\", \"view host must not be empty\"));\n }\n if (host.includes(\"%\")) {\n return yield* Effect.fail(serverError(\"open\", \"scoped IPv6 view hosts are not supported\"));\n }\n const port = options.port ?? 0;\n if (!Number.isInteger(port) || port < 0 || port > 65535) {\n return yield* Effect.fail(serverError(\"open\", `view port must be an integer from 0 through 65535, got ${port}`));\n }\n const session = options.session ?? (options.request === undefined\n ? yield* Effect.fail(serverError(\"open\", \"view needs a scoped ReportViewSession or current rebuild request\"))\n : yield* openReportViewSession({\n ...options.request,\n // Bootstrap the opening revision when the request omitted a watch set.\n watchInputs: options.request.watchInputs ?? optionWatchInputs(options),\n }));\n const opening = yield* session.snapshot.pipe(Effect.mapError(() => serverError(\"open\", \"report view session closed before watchers opened\")));\n const initialWatchInputs = opening.current.watchInputs.length > 0\n ? opening.current.watchInputs\n : optionWatchInputs(options);\n const resources = yield* Effect.acquireRelease(Effect.sync(() => makeResources()), (value) => closeResources(value));\n const address = yield* listen(resources.server, host, port);\n const urls = viewUrls(host, address.port);\n const advertisedAuthorities = Object.freeze(new Set(urls.map((url) => new URL(url).host)));\n const watches = yield* Effect.acquireRelease(openWatchers(initialWatchInputs, () => resources.refreshes.request()), (value) => closeWatchers(value));\n yield* Effect.forkScoped(Effect.forever(Effect.flatMap(resources.requests.take(), (request) => serveRequest(session, request, advertisedAuthorities))).pipe(Effect.catchAll(() => Effect.void)));\n yield* Effect.forkScoped(Effect.forever(Effect.flatMap(resources.refreshes.take(), () => registerRefreshIntent(session, watches, options.onRebuild, serverScope))).pipe(Effect.catchAll(() => Effect.void)));\n const close = Effect.zipRight(closeWatchers(watches), closeResources(resources));\n return Object.freeze({ url: urls[0]!, urls, close });\n });\n}\nfunction makeResources(): ServerResources {\n const requests = new Inbox<HttpRequest>(HTTP_REQUEST_QUEUE_MAX);\n const refreshes = new RefreshInbox();\n const sockets = new Set<Socket>();\n const server = createServer((request, response) => {\n if (!requests.offer(Object.freeze({ request, response }))) {\n sendText(response, 503, \"report view is busy; retry shortly\");\n }\n });\n server.on(\"connection\", (socket) => {\n sockets.add(socket);\n socket.once(\"close\", () => sockets.delete(socket));\n });\n return { server, sockets, requests, refreshes, closed: false };\n}\nfunction listen(server: Server, host: string, port: number): Effect.Effect<{\n readonly host: string;\n readonly port: number;\n}, NodeViewServerError> {\n return Effect.async((resume) => {\n const cleanup = (): void => {\n server.off(\"error\", onError);\n server.off(\"listening\", onListening);\n };\n const onError = (error: Error): void => {\n cleanup();\n resume(Effect.fail(serverError(\"listen\", error.message)));\n };\n const onListening = (): void => {\n cleanup();\n const address = server.address();\n if (address === null || typeof address === \"string\") {\n resume(Effect.fail(serverError(\"listen\", \"server did not expose a TCP address\")));\n return;\n }\n resume(Effect.succeed(Object.freeze({ host: address.address, port: address.port })));\n };\n server.once(\"error\", onError);\n server.once(\"listening\", onListening);\n try {\n server.listen({ host, port });\n }\n catch (error) {\n onError(asError(error));\n }\n return Effect.sync(() => cleanup());\n });\n}\nfunction serveRequest<Requirements>(session: ReportViewSession<Requirements>, request: HttpRequest, advertisedAuthorities: ReadonlySet<string>): Effect.Effect<void> {\n const authority = requestAuthority(request.request.headers.host);\n if (authority === undefined || !advertisedAuthorities.has(authority)) {\n return Effect.sync(() => sendText(request.response, 421, \"view host is not advertised\"));\n }\n if (request.request.method !== \"GET\" && request.request.method !== \"HEAD\") {\n return Effect.sync(() => sendText(request.response, 405, \"method not allowed\", { allow: \"GET, HEAD\" }));\n }\n const url = requestUrl(request.request);\n if (url === undefined) {\n return Effect.sync(() => sendText(request.response, 400, \"bad request\"));\n }\n if (url.pathname === \"/healthz\") {\n return Effect.sync(() => sendText(request.response, 200, \"ok\"));\n }\n return session.snapshot.pipe(Effect.flatMap((state) => {\n const headers = Object.freeze({\n \"cache-control\": \"no-store\",\n \"x-niceeval-report-revision\": String(state.current.revision),\n \"x-niceeval-report-content-hash\": closedSiteRevisionData(state.current.site).identity.contentHash,\n ...(state.lastProblem === undefined ? {} : { \"x-niceeval-last-rebuild-problem\": \"1\" }),\n });\n // Optional host transport probe. It contains no Report body and does\n // not belong to the content-addressed file mapping. The HTML response\n // below establishes its own served revision through an HttpOnly cookie;\n // after publication this endpoint can report that the browser document\n // is stale without putting revision information into its body bytes.\n if (url.pathname === \"/_niceeval/refresh\") {\n const servedIdentity = reportRevisionCookieValue(request.request.headers.cookie);\n return Effect.sync(() => send(request.response, 204, new Uint8Array(), \"text/plain; charset=utf-8\", {\n ...headers,\n \"x-niceeval-view-stale\": servedIdentity === undefined || servedIdentity === closedSiteRevisionData(state.current.site).identity.contentHash\n ? \"0\"\n : \"1\",\n }));\n }\n const resolved = siteFileForPath(url.pathname, state.current.site);\n if (resolved.state === \"missing\") {\n return Effect.sync(() => sendText(request.response, 404, url.pathname.startsWith(\"/downloads/\") ? \"download not found\" : \"page not found\", headers));\n }\n return Effect.sync(() => send(request.response, 200, resolved.file.bytes, siteContentType(resolved.file.mediaType), resolved.file.path.startsWith(\"downloads/\")\n ? { ...headers, \"content-disposition\": \"attachment\", \"x-content-type-options\": \"nosniff\" }\n : resolved.file.mediaType.startsWith(\"text/html;\")\n ? { ...headers, \"set-cookie\": reportRevisionCookie(closedSiteRevisionData(state.current.site).identity.contentHash) }\n : headers));\n }), Effect.catchAll(() => Effect.sync(() => sendText(request.response, 503, \"report view session is closed\"))));\n}\n/**\n * Register immediately, then subscribe in a scoped waiter. The refresh inbox\n * can therefore accept a newer intent while this candidate still performs\n * author work; only a published outcome mutates watcher ownership or emits a\n * browser-facing rebuild notification.\n */\nfunction registerRefreshIntent<Requirements>(session: ReportViewSession<Requirements>, watches: WatchResources, onRebuild: ViewOptions[\"onRebuild\"], serverScope: Scope.Scope): Effect.Effect<void, ReportViewSessionClosed, Requirements> {\n return Effect.gen(function* () {\n const intent = yield* session.refresh;\n yield* Effect.forkIn(intent.outcome.pipe(Effect.flatMap((outcome) => outcome.state !== \"published\"\n ? Effect.void\n : Effect.gen(function* () {\n // One published revision owns its corresponding successful watch set.\n yield* Effect.sync(() => replaceWatchInputs(watches, outcome.revision.watchInputs));\n if (onRebuild !== undefined) {\n yield* Effect.try({\n try: () => onRebuild(new Date()),\n catch: () => undefined,\n }).pipe(Effect.ignore);\n }\n }))), serverScope);\n });\n}\nfunction optionWatchInputs<Requirements>(options: ViewOptions<Requirements>): readonly string[] {\n const values = options.watchInputs ?? [];\n return Object.freeze([...new Set(values.map((value) => resolve(value)))]);\n}\nfunction openWatchers(inputs: readonly string[], onChange: () => void): Effect.Effect<WatchResources, NodeViewServerError> {\n return Effect.try({\n try: () => {\n const resources: WatchResources = {\n current: closedWatchSet(),\n onChange,\n closed: false,\n };\n try {\n const opening = openWatchSet(resources, inputs);\n publishWatchSet(resources, opening);\n return resources;\n }\n catch (error) {\n closeWatchSet(resources.current);\n throw error;\n }\n },\n catch: (error): NodeViewServerError => serverError(\"watch\", asError(error).message),\n });\n}\n/**\n * Atomically swaps the next-round watch set after a successful revision. Failure\n * paths never call this, so last-good entry edges remain recoverable.\n */\nfunction replaceWatchInputs(resources: WatchResources, inputs: readonly string[]): void {\n if (resources.closed)\n return;\n try {\n const opening = openWatchSet(resources, inputs);\n if (resources.closed) {\n closeWatchSet(opening);\n return;\n }\n // No Effect boundary or callback can interleave this publication: the\n // replacement is entirely synchronous after the candidate validated.\n publishWatchSet(resources, opening);\n }\n catch {\n // A transient directory race must not discard the previous recoverable\n // closure. The next filesystem hint retries full reconciliation.\n }\n}\nfunction closedWatchSet(): WatchSet {\n return {\n inputs: Object.freeze([]),\n watchers: new Map(),\n state: \"closed\",\n };\n}\n/**\n * Opens a whole candidate closure without touching the published set. This is\n * also the full reconciliation path for directory-tree changes: fs.watch is a\n * hint, so every event rescans all inputs before requesting a rebuild.\n */\nfunction openWatchSet(resources: WatchResources, inputs: readonly string[]): WatchSet {\n const watchSet: WatchSet = {\n inputs: normalizeWatchInputs(inputs),\n watchers: new Map(),\n state: \"opening\",\n };\n try {\n synchronizeWatchSet(resources, watchSet);\n return watchSet;\n }\n catch (error) {\n closeWatchSet(watchSet);\n throw error;\n }\n}\n/** Watch the Record root and its current Run directories without a polling loop. */\nfunction synchronizeWatchSet(resources: WatchResources, watchSet: WatchSet): void {\n for (const input of watchSet.inputs) {\n let inputIsDirectory: boolean;\n try {\n inputIsDirectory = statSync(input).isDirectory();\n }\n catch (error) {\n if (!isMissingPath(error))\n throw error;\n // A missing config / module / Record root remains observable through its\n // parent directory. It can appear later without restarting the host.\n watchNamedInput(resources, watchSet, dirname(input), basename(input));\n continue;\n }\n if (inputIsDirectory) {\n watchDirectoryTree(resources, watchSet, input, 0);\n }\n else {\n watchNamedInput(resources, watchSet, dirname(input), basename(input));\n }\n }\n}\nfunction normalizeWatchInputs(inputs: readonly string[]): readonly string[] {\n return Object.freeze([...new Set(inputs.map((input) => resolve(input)))].sort());\n}\nconst WATCH_DIRECTORY_DEPTH_MAX = 4;\nfunction watchDirectoryTree(resources: WatchResources, watchSet: WatchSet, directory: string, depth: number): void {\n try {\n watchDirectory(resources, watchSet, directory);\n }\n catch (error) {\n if (!isMissingPath(error))\n throw error;\n watchNamedInput(resources, watchSet, dirname(directory), basename(directory));\n return;\n }\n if (depth >= WATCH_DIRECTORY_DEPTH_MAX)\n return;\n let entries: readonly {\n readonly name: string;\n isDirectory(): boolean;\n }[];\n try {\n entries = readdirSync(directory, { withFileTypes: true });\n }\n catch (error) {\n if (!isMissingPath(error))\n throw error;\n watchNamedInput(resources, watchSet, dirname(directory), basename(directory));\n return;\n }\n for (const entry of entries) {\n if (entry.isDirectory()) {\n watchDirectoryTree(resources, watchSet, resolve(directory, entry.name), depth + 1);\n }\n }\n}\nfunction watchDirectory(resources: WatchResources, watchSet: WatchSet, directory: string): void {\n const key = `directory:${directory}`;\n if (watchSet.watchers.has(key))\n return;\n const watcher = watch(directory, () => watchSetChanged(resources, watchSet));\n watchSet.watchers.set(key, watcher);\n watchFailure(resources, watchSet, key, watcher);\n}\nfunction watchNamedInput(resources: WatchResources, watchSet: WatchSet, directory: string, name: string): void {\n const key = `named:${directory}:${name}`;\n if (watchSet.watchers.has(key))\n return;\n const watcher = watch(directory, (_event, filename) => {\n if (filename === null || filename.toString() === name)\n watchSetChanged(resources, watchSet);\n });\n watchSet.watchers.set(key, watcher);\n watchFailure(resources, watchSet, key, watcher);\n}\nfunction watchFailure(resources: WatchResources, watchSet: WatchSet, key: string, watcher: FSWatcher): void {\n watcher.once(\"error\", () => {\n if (watchSet.watchers.get(key) === watcher) {\n watchSet.watchers.delete(key);\n closeWatcher(watcher);\n }\n watchSetChanged(resources, watchSet);\n });\n}\nfunction watchSetChanged(resources: WatchResources, watchSet: WatchSet): void {\n if (!isCurrentWatchSet(resources, watchSet))\n return;\n // A new Run gets its own directory before its completion marker. Reconcile\n // the whole closure now so the marker change is observed as well as the\n // first incomplete rebuild. Failure leaves this complete old set active.\n replaceWatchInputs(resources, watchSet.inputs);\n if (isCurrentWatchSet(resources, resources.current))\n resources.onChange();\n}\nfunction isCurrentWatchSet(resources: WatchResources, watchSet: WatchSet): boolean {\n return !resources.closed && resources.current === watchSet && watchSet.state === \"active\";\n}\n/** Publishes a fully opened candidate, then retires the old closure synchronously. */\nfunction publishWatchSet(resources: WatchResources, opening: WatchSet): void {\n if (resources.closed) {\n closeWatchSet(opening);\n return;\n }\n const previous = resources.current;\n opening.state = \"active\";\n resources.current = opening;\n closeWatchSet(previous);\n}\nfunction closeWatchSet(watchSet: WatchSet): void {\n if (watchSet.state === \"closed\")\n return;\n watchSet.state = \"closed\";\n const watchers = [...watchSet.watchers.values()];\n watchSet.watchers.clear();\n for (const watcher of watchers)\n closeWatcher(watcher);\n}\nfunction closeWatcher(watcher: FSWatcher): void {\n try {\n watcher.close();\n }\n catch {\n // Closing is best-effort and idempotent at the Node boundary.\n }\n}\nfunction closeResources(resources: ServerResources): Effect.Effect<void> {\n return Effect.suspend(() => {\n if (resources.closed)\n return Effect.void;\n resources.closed = true;\n return Effect.zipRight(Effect.sync(() => {\n resources.requests.close();\n resources.refreshes.close();\n for (const socket of resources.sockets)\n socket.destroy();\n }), closeServer(resources.server));\n });\n}\nfunction closeWatchers(resources: WatchResources): Effect.Effect<void> {\n return Effect.suspend(() => {\n if (resources.closed)\n return Effect.void;\n resources.closed = true;\n return Effect.sync(() => closeWatchSet(resources.current));\n });\n}\nfunction closeServer(server: Server): Effect.Effect<void> {\n return Effect.async((resume) => {\n if (!server.listening) {\n resume(Effect.void);\n return Effect.void;\n }\n try {\n server.close(() => resume(Effect.void));\n }\n catch {\n resume(Effect.void);\n }\n return Effect.void;\n });\n}\ntype SitePathLookup = {\n readonly state: \"file\";\n readonly file: ClosedSiteFile;\n} | {\n readonly state: \"missing\";\n};\n/**\n * Resolves HTTP paths strictly through the current revision's finished file\n * map. There is intentionally no route callback, renderer, Sample, or Record\n * fallback here, so a request can never splice two revisions together.\n */\nfunction siteFileForPath(pathname: string, site: ClosedSiteRevision): SitePathLookup {\n if (!pathname.startsWith(\"/\") || pathname.includes(\"%\") || pathname.includes(\"\\\\\")) {\n return Object.freeze({ state: \"missing\" as const });\n }\n const requested = pathname.slice(1);\n // The SPA shell is the revision's sole root document. All business\n // navigation belongs to its hash router, not to host-side path probing.\n const exact = requested === \"\" ? \"index.html\" : requested;\n const revision = closedSiteRevisionData(site);\n const files = revision.files;\n const direct = files.find((file) => file.path === exact);\n if (direct !== undefined)\n return Object.freeze({ state: \"file\" as const, file: direct });\n return Object.freeze({ state: \"missing\" as const });\n}\nfunction requestUrl(request: IncomingMessage): URL | undefined {\n try {\n return new URL(request.url ?? \"/\", \"http://127.0.0.1\");\n }\n catch {\n return undefined;\n }\n}\nconst REPORT_REVISION_COOKIE = \"niceeval_report_revision\";\nfunction reportRevisionCookie(contentHash: string): string {\n return `${REPORT_REVISION_COOKIE}=${contentHash}; Path=/; SameSite=Strict; HttpOnly`;\n}\nfunction reportRevisionCookieValue(cookie: string | undefined): string | undefined {\n if (cookie === undefined)\n return undefined;\n for (const entry of cookie.split(\";\")) {\n const [name, ...value] = entry.trim().split(\"=\");\n if (name === REPORT_REVISION_COOKIE)\n return value.join(\"=\");\n }\n return undefined;\n}\nfunction sendText(response: ServerResponse, status: number, body: string, headers: Readonly<Record<string, string>> = {}): void {\n send(response, status, body, \"text/plain; charset=utf-8\", headers);\n}\nfunction send(response: ServerResponse, status: number, body: string | Uint8Array, contentType: string, headers: Readonly<Record<string, string>>): void {\n if (response.destroyed)\n return;\n response.writeHead(status, { \"content-type\": contentType, ...headers });\n response.end(body);\n}\nconst SAFE_MEDIA_TYPE = /^[A-Za-z0-9!#$%&'*+.^_`|~-]+\\/[A-Za-z0-9!#$%&'*+.^_`|~-]+$/;\nfunction siteContentType(mediaType: string): string {\n const base = mediaType.split(\";\", 1)[0]?.trim() ?? \"\";\n return SAFE_MEDIA_TYPE.test(base) ? base : \"application/octet-stream\";\n}\nfunction viewUrls(host: string, port: number): readonly string[] {\n if (host === \"0.0.0.0\") {\n return urlsForAddresses([\n \"127.0.0.1\",\n ...interfaceAddresses(\"IPv4\"),\n ], port);\n }\n if (host === \"::\") {\n return urlsForAddresses([\n \"::1\",\n ...interfaceAddresses(\"IPv6\"),\n ], port);\n }\n return Object.freeze([viewUrl(host, port)]);\n}\nfunction interfaceAddresses(family: \"IPv4\" | \"IPv6\"): readonly string[] {\n const addresses: string[] = [];\n for (const entries of Object.values(networkInterfaces())) {\n for (const entry of entries ?? []) {\n if (entry.family === family &&\n !entry.internal &&\n !entry.address.includes(\"%\") &&\n (family !== \"IPv6\" || entry.scopeid === 0)) {\n addresses.push(entry.address);\n }\n }\n }\n return addresses.sort((left, right) => left.localeCompare(right));\n}\nfunction urlsForAddresses(addresses: readonly string[], port: number): readonly string[] {\n return Object.freeze([...new Set(addresses)].map((address) => viewUrl(address, port)));\n}\nfunction viewUrl(host: string, port: number): string {\n return new URL(`http://${formatHost(host)}:${port}/`).toString();\n}\nfunction requestAuthority(value: string | undefined): string | undefined {\n if (value === undefined)\n return undefined;\n try {\n const url = new URL(`http://${value}`);\n if (url.username.length > 0 || url.password.length > 0)\n return undefined;\n return url.host;\n }\n catch {\n return undefined;\n }\n}\nfunction formatHost(host: string): string {\n return host.includes(\":\") ? `[${host}]` : host;\n}\nfunction serverError(operation: NodeViewServerError[\"operation\"], reason: string): NodeViewServerError {\n return Object.freeze({ code: \"report-view-server-failed\", operation, reason });\n}\nfunction asError(error: unknown): Error {\n return error instanceof Error ? error : new Error(String(error));\n}\nfunction isMissingPath(error: unknown): boolean {\n if (typeof error !== \"object\" || error === null)\n return false;\n const code = Reflect.get(error, \"code\");\n return code === \"ENOENT\" || code === \"ENOTDIR\";\n}\n"]}
@@ -1,7 +1,6 @@
1
1
  import { Effect } from "effect";
2
2
  import type * as Scope from "effect/Scope";
3
3
  import { type OpenReportViewSessionInput, type ReportViewOpenError, type ReportViewSession } from "../report/host/view-session.cjs";
4
- import type { ViewScanOptions } from "./data.cjs";
5
4
  export interface NodeViewServerError {
6
5
  readonly code: "report-view-server-failed";
7
6
  readonly operation: "open" | "listen" | "watch";
@@ -13,8 +12,6 @@ export interface ViewOptions<Requirements = never> {
13
12
  readonly port?: number;
14
13
  /** Defaults to loopback. An explicit address opts into that network exposure. */
15
14
  readonly host?: string;
16
- /** Retained for the CLI-shaped facade; it is never interpreted as Record data. */
17
- readonly scan?: ViewScanOptions;
18
15
  /**
19
16
  * Bootstrap watch inputs when the session/request has none yet. After each
20
17
  * successful rebuild the session revision owns the next-round watch set.
@@ -1,7 +1,6 @@
1
1
  import { Effect } from "effect";
2
2
  import type * as Scope from "effect/Scope";
3
3
  import { type OpenReportViewSessionInput, type ReportViewOpenError, type ReportViewSession } from "../report/host/view-session.mjs";
4
- import type { ViewScanOptions } from "./data.mjs";
5
4
  export interface NodeViewServerError {
6
5
  readonly code: "report-view-server-failed";
7
6
  readonly operation: "open" | "listen" | "watch";
@@ -13,8 +12,6 @@ export interface ViewOptions<Requirements = never> {
13
12
  readonly port?: number;
14
13
  /** Defaults to loopback. An explicit address opts into that network exposure. */
15
14
  readonly host?: string;
16
- /** Retained for the CLI-shaped facade; it is never interpreted as Record data. */
17
- readonly scan?: ViewScanOptions;
18
15
  /**
19
16
  * Bootstrap watch inputs when the session/request has none yet. After each
20
17
  * successful rebuild the session revision owns the next-round watch set.
@@ -1,7 +1,6 @@
1
1
  import { Effect } from "effect";
2
2
  import type * as Scope from "effect/Scope";
3
3
  import { type OpenReportViewSessionInput, type ReportViewOpenError, type ReportViewSession } from "../report/host/view-session.js";
4
- import type { ViewScanOptions } from "./data.js";
5
4
  export interface NodeViewServerError {
6
5
  readonly code: "report-view-server-failed";
7
6
  readonly operation: "open" | "listen" | "watch";
@@ -13,8 +12,6 @@ export interface ViewOptions<Requirements = never> {
13
12
  readonly port?: number;
14
13
  /** Defaults to loopback. An explicit address opts into that network exposure. */
15
14
  readonly host?: string;
16
- /** Retained for the CLI-shaped facade; it is never interpreted as Record data. */
17
- readonly scan?: ViewScanOptions;
18
15
  /**
19
16
  * Bootstrap watch inputs when the session/request has none yet. After each
20
17
  * successful rebuild the session revision owns the next-round watch set.