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":"table-text.js","sourceRoot":"","sources":["table-text.ts"],"names":[],"mappings":"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","sourcesContent":["// <Table> 原语的 text 面(../primitives.tsx 的 Table.text 就是它)。\n// 官方的表状组件(Table / Scoreboard / DeltaTable)的 text 面也直接\n// 调它 —— 官方与自定义表共用同一个渲染器,是「用户组件与官方组件对等」的构造证明:\n// 官方用不上的能力用户就拿不到,官方绕过它手搓它就一定会长歪。\n//\n// 列宽按显示宽度算(CJK 记 2 列);null 渲染 —,不补 0;超宽按比例压左对齐列并在格内折行,\n// 全压到下限仍放不下才从右侧丢列并如实报数(「截断报剩余」是既有契约,不在这里破例)。\n// 画线与不画线是同一份列宽算术:数据格框的列间 ` │ ` 与朴素形态的 ` ` 都占 3 列。\nimport type { TableColumn, TableRow } from \"./primitives.tsx\";\nimport type { TextContext } from \"./tree.ts\";\nimport { countText, localeText, resolveLocalizedText } from \"../model/locale.ts\";\nimport { charDisplayWidth, padDisplay, padStartDisplay, renderAlignedRows, stringWidth, wrapDisplay, type ColumnAlign, } from \"../model/text-layout.ts\";\nimport { DATA_BOX_FRAME_OVERHEAD, dataBoxBorder, dataBoxMode, dataBoxRow } from \"../model/panel.ts\";\nimport { panelSectionDepth } from \"./primitives/text-panel-state.ts\";\n/** text 排版器入参:faces.ts 与旧 Table 形态共用的预格式化表。 */\nexport interface TextTableProps {\n columns: readonly TableColumn[];\n rows: readonly TableRow[];\n locale?: import(\"../model/locale.ts\").ReportLocale;\n}\nconst MISSING_MARK = \"—\";\n/** 列间距,与 renderAlignedRows 的 join(\" \") 一致。 */\nconst COLUMN_GAP = 3;\n/** 左对齐列的压缩下限:再窄就读不成句,宁可丢列。 */\nconst MIN_TEXT_COLUMN = 8;\n/** 身份列(首列)的压缩下限:读不出身份的行等于没有,所以它比其余文本列早停在这个宽度\n * ——列自然宽本来就短于它时以自然宽为准,不给短列补空。压到这一步还放不下就丢列。 */\nconst MIN_IDENTITY_COLUMN = 24;\n/** 格子的文本形态:缺这个键、或值是 null,都渲染 —(与 web 面同源)。 */\nfunction cellText(row: TableRow, key: string): string {\n const value = row.cells[key];\n return value === null || value === undefined ? MISSING_MARK : value;\n}\nfunction totalWidth(widths: readonly number[]): number {\n return widths.reduce((sum, w) => sum + w, 0) + COLUMN_GAP * Math.max(0, widths.length - 1);\n}\n/**\n * 自然列宽 → 放得进 available 的列宽。两步,顺序即优先级:\n * 1. 按自然宽的比例压所有左对齐列(文本列)到下限 —— 右对齐列是数字,折行读不了,不压;\n * 按比例分摊而不是逐个压最宽的那列:两个都很长的文本列各让一半,比把其中一个压到\n * 下限(读出来是「Experime / nt」)可读得多;\n * 2. 全部压到下限仍放不下,才从右侧丢列(至少留一列),丢了几列如实返回。\n */\nfunction fitWidths(natural: readonly number[], align: readonly ColumnAlign[], available: number): {\n widths: number[];\n hidden: number;\n} {\n const widths = [...natural];\n const floorOf = (c: number): number => c === 0 ? Math.min(natural[0] ?? MIN_IDENTITY_COLUMN, MIN_IDENTITY_COLUMN) : MIN_TEXT_COLUMN;\n for (;;) {\n const over = totalWidth(widths) - available;\n if (over <= 0)\n break;\n const flexible = widths\n .map((w, c) => ({ c, w, floor: floorOf(c) }))\n .filter(({ c, w, floor }) => align[c] !== \"right\" && w > floor);\n if (flexible.length === 0)\n break;\n // 可压缩总量按各列自己的余量加权分摊;取整后的余数留给下一轮,循环终止于「无列可压」。\n const slack = flexible.reduce((sum, { w, floor }) => sum + (w - floor), 0);\n let remaining = Math.min(over, slack);\n for (const { c, w, floor } of flexible) {\n if (remaining <= 0)\n break;\n const share = Math.min(w - floor, Math.max(1, Math.round((over * (w - floor)) / slack)), remaining);\n widths[c] = w - share;\n remaining -= share;\n }\n }\n let hidden = 0;\n while (widths.length > 1 && totalWidth(widths) > available) {\n widths.pop();\n hidden += 1;\n }\n return { widths, hidden };\n}\n/** 按显示宽度截到 width(不够放 `…` 时原样返回)。 */\nfunction truncateDisplay(text: string, width: number): string {\n if (stringWidth(text) <= width)\n return text;\n let out = \"\";\n let used = 0;\n for (const ch of text) {\n const w = charDisplayWidth(ch.codePointAt(0)!);\n if (used + w > width)\n break;\n out += ch;\n used += w;\n }\n return out;\n}\n/** 列的 maxLines 收口:超出的行丢弃,最后一行以 `…` 如实标注被收口。 */\nfunction clampCellLines(lines: string[], maxLines: number | undefined, width: number): string[] {\n if (maxLines === undefined || lines.length <= maxLines)\n return lines;\n const kept = lines.slice(0, Math.max(1, maxLines));\n const last = kept[kept.length - 1]!;\n kept[kept.length - 1] = `${truncateDisplay(last, Math.max(1, width - 1))}…`;\n return kept;\n}\n/**\n * 折行时保住格子开头的缩进:层级就长在首列的缩进上(docs 的「层级与横线」),而 wrapDisplay\n * 会把行首空格吃掉——身份被压窄正是最需要看清层级的时候,不能一折行就把层级折没了。\n * 续行跟着对齐到同一个缩进。\n */\nfunction wrapIndented(cell: string, width: number): string[] {\n const indent = cell.length - cell.trimStart().length;\n if (indent === 0)\n return wrapDisplay(cell, width);\n const pad = \" \".repeat(indent);\n const body = wrapDisplay(cell.slice(indent), Math.max(1, width - indent));\n return body.map((line) => `${pad}${line}`);\n}\n/** 逻辑行 → 物理行:每格折到自己的列宽,列带 maxLines 就收口,行高取最高的那格,矮格补空串。 */\nfunction toPhysicalRows(cells: readonly string[], widths: readonly number[], maxLines: readonly (number | undefined)[]): string[][] {\n const wrapped = cells.map((cell, c) => \n // 放得下就原样保留:wrapDisplay 会把连续空格折成一个,而 DeltaTable 的\n // \"50% → 62% +12pp\" 这类格子内含固定间距 —— 不折行时一个字节都不能动。\n clampCellLines(!cell.includes(\"\\n\") && stringWidth(cell) <= widths[c] ? [cell] : wrapIndented(cell, widths[c]!), maxLines[c], widths[c]!));\n const height = Math.max(...wrapped.map((lines) => lines.length), 1);\n const out: string[][] = [];\n for (let i = 0; i < height; i++)\n out.push(wrapped.map((lines) => lines[i] ?? \"\"));\n return out;\n}\n/**\n * <Table> 的 text 面:columns × rows → 对齐的字符表。\n * 有任一行带 locator 时追加一列 attempt(locator 本身就是 `niceeval show <locator>`\n * 的位置参数;逐行重复整条命令会把表撑宽,与三个实体列表 text 面的既有取舍一致)。\n */\nexport function renderTableText(props: TextTableProps, ctx: TextContext): string {\n const locale = props.locale ?? ctx.locale;\n const hasLocator = props.rows.some((row) => row.locator !== undefined);\n if (props.columns.length === 0 && !hasLocator)\n return \"\";\n const header = props.columns.map((column) => resolveLocalizedText(column.header, locale));\n const align: ColumnAlign[] = props.columns.map((column) => column.align ?? \"left\");\n const body = props.rows.map((row) => props.columns.map((column) => cellText(row, column.key)));\n if (hasLocator) {\n header.push(localeText(locale, \"table.attempt\"));\n align.push(\"left\");\n props.rows.forEach((row, i) => body[i].push(row.locator ?? MISSING_MARK));\n }\n const matrix = [header, ...body];\n const natural = header.map((_, c) => Math.max(...matrix.map((row) => stringWidth(row[c] ?? \"\"))));\n // 画线时列间距与不画线时相同(` │ ` 与 ` ` 都是 3 列),所以只有外框那 4 列要先让出来。\n const lines = dataBoxMode(ctx.panelMode, ctx.width) === \"boxed\";\n // 嵌在画框的 Section 里:边界已由面板的框给出,自己只留列边界与表头横线,不套二层框。\n const outerFrame = lines && panelSectionDepth() === 0;\n const available = outerFrame ? ctx.width - DATA_BOX_FRAME_OVERHEAD : ctx.width;\n const { widths, hidden } = fitWidths(natural, align, available);\n const maxLines: (number | undefined)[] = props.columns.map((column) => column.maxLines);\n if (hasLocator)\n maxLines.push(undefined);\n // 表头不参与 maxLines 收口:表头是自己写的短词,收口只服务数据格。\n const headerPhysical = toPhysicalRows(header.slice(0, widths.length), widths, widths.map(() => undefined));\n const bodyBlocks = body.map((row, i) => ({\n depth: props.rows[i]?.depth ?? 0,\n physical: toPhysicalRows(row.slice(0, widths.length), widths, maxLines),\n }));\n const bodyPhysical = bodyBlocks.flatMap((block) => block.physical);\n const table = lines\n ? renderFramedTable(headerPhysical, bodyBlocks, widths, align, outerFrame)\n : renderAlignedRows([...headerPhysical, ...bodyPhysical], align);\n return hidden > 0 ? `${table}\\n${countText(locale, \"table.columnsHidden\", hidden)}` : table;\n}\n/**\n * 数据格框形态:列边界贯穿全表,横线画在行树自己的边界上——表头与正文之间一条,行树有\n * 嵌套时每个顶层行之前再一条(一组一格,组内不切)。平表只有表头那一条:逐行切割读起来\n * 是一堆独立小框,层级与分组反而看不出来。分隔只按 depth 判,`Table` 不认识具体实体。\n *\n * 框宽跟随表自己的内容宽度(`fitWidths` 已经把它压进可用列数),不硬拉满终端——\n * 窄表拉满只会让同一行的读数彼此远离。\n */\nfunction renderFramedTable(header: readonly string[][], body: readonly {\n depth: number;\n physical: string[][];\n}[], widths: readonly number[], align: readonly ColumnAlign[], outerFrame: boolean): string {\n // 实际列宽取该列所有物理行的最宽者:压缩与折行之后不少列比预算更窄,框跟着收。\n const physical = [...header, ...body.flatMap((block) => block.physical)];\n const actual = widths.map((w, c) => {\n const widest = Math.max(...physical.map((row) => stringWidth(row[c] ?? \"\")), 1);\n return Math.min(w, widest);\n });\n const line = (row: readonly string[]): string => dataBoxRow(actual.map((w, c) => (align[c] === \"right\" ? padStartDisplay(row[c] ?? \"\", w) : padDisplay(row[c] ?? \"\", w))), outerFrame);\n const nested = body.some((block) => block.depth > 0);\n const out: string[] = [];\n if (outerFrame)\n out.push(dataBoxBorder(\"top\", actual, true));\n for (const row of header)\n out.push(line(row));\n out.push(dataBoxBorder(\"rule\", actual, outerFrame));\n body.forEach((block, i) => {\n if (nested && i > 0 && block.depth === 0)\n out.push(dataBoxBorder(\"rule\", actual, outerFrame));\n for (const row of block.physical)\n out.push(line(row));\n });\n if (outerFrame)\n out.push(dataBoxBorder(\"bottom\", actual, true));\n return out.join(\"\\n\");\n}\n"]}
1
+ {"version":3,"file":"table-text.js","sourceRoot":"","sources":["table-text.ts"],"names":[],"mappings":"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","sourcesContent":["// <Table> 原语的 text 面(../primitives.tsx 的 Table.text 就是它)。\n// 官方的表状组件(Table / Scoreboard / DeltaTable)的 text 面也直接\n// 调它 —— 官方与自定义表共用同一个渲染器,是「用户组件与官方组件对等」的构造证明:\n// 官方用不上的能力用户就拿不到,官方绕过它手搓它就一定会长歪。\n//\n// 列宽按显示宽度算(CJK 记 2 列);null 渲染 —,不补 0;超宽按比例压左对齐列并在格内折行,\n// 全压到下限仍放不下才从右侧丢列并如实报数(「截断报剩余」是既有契约,不在这里破例)。\n// 画线与不画线是同一份列宽算术:数据格框的列间 ` │ ` 与朴素形态的 ` ` 都占 3 列。\nimport type { TableColumn, TableRow } from \"./primitives.tsx\";\nimport type { TextContext } from \"./tree.ts\";\nimport { countText, localeText, resolveLocalizedText } from \"../model/locale.ts\";\nimport { charDisplayWidth, padDisplay, padStartDisplay, renderAlignedRows, stringWidth, wrapDisplay, type ColumnAlign, } from \"../model/text-layout.ts\";\nimport { DATA_BOX_FRAME_OVERHEAD, dataBoxBorder, dataBoxMode, dataBoxRow } from \"../model/panel.ts\";\nimport { panelSectionDepth } from \"./primitives/text-panel-state.ts\";\n/** text 排版器入参:faces.ts 与旧 Table 形态共用的预格式化表。 */\ninterface TextTableRow extends TableRow {\n /** 在本行前画一条分组线;只表达表格结构,不携带领域语义。 */\n readonly ruleBefore?: boolean;\n}\nexport interface TextTableProps {\n columns: readonly TableColumn[];\n rows: readonly TextTableRow[];\n locale?: import(\"../model/locale.ts\").ReportLocale;\n}\nconst MISSING_MARK = \"—\";\n/** 列间距,与 renderAlignedRows 的 join(\" \") 一致。 */\nconst COLUMN_GAP = 3;\n/** 左对齐列的压缩下限:再窄就读不成句,宁可丢列。 */\nconst MIN_TEXT_COLUMN = 8;\n/** 身份列(首列)的压缩下限:读不出身份的行等于没有,所以它比其余文本列早停在这个宽度\n * ——列自然宽本来就短于它时以自然宽为准,不给短列补空。压到这一步还放不下就丢列。 */\nconst MIN_IDENTITY_COLUMN = 24;\n/** 格子的文本形态:缺这个键、或值是 null,都渲染 —(与 web 面同源)。 */\nfunction cellText(row: TableRow, key: string): string {\n const value = row.cells[key];\n return value === null || value === undefined ? MISSING_MARK : value;\n}\nfunction totalWidth(widths: readonly number[]): number {\n return widths.reduce((sum, w) => sum + w, 0) + COLUMN_GAP * Math.max(0, widths.length - 1);\n}\n/**\n * 自然列宽 → 放得进 available 的列宽。两步,顺序即优先级:\n * 1. 按自然宽的比例压所有左对齐列(文本列)到下限 —— 右对齐列是数字,折行读不了,不压;\n * 按比例分摊而不是逐个压最宽的那列:两个都很长的文本列各让一半,比把其中一个压到\n * 下限(读出来是「Experime / nt」)可读得多;\n * 2. 全部压到下限仍放不下,才从右侧丢列(至少留一列),丢了几列如实返回。\n */\nfunction fitWidths(natural: readonly number[], align: readonly ColumnAlign[], available: number): {\n widths: number[];\n hidden: number;\n} {\n const widths = [...natural];\n const floorOf = (c: number): number => c === 0 ? Math.min(natural[0] ?? MIN_IDENTITY_COLUMN, MIN_IDENTITY_COLUMN) : MIN_TEXT_COLUMN;\n for (;;) {\n const over = totalWidth(widths) - available;\n if (over <= 0)\n break;\n const flexible = widths\n .map((w, c) => ({ c, w, floor: floorOf(c) }))\n .filter(({ c, w, floor }) => align[c] !== \"right\" && w > floor);\n if (flexible.length === 0)\n break;\n // 可压缩总量按各列自己的余量加权分摊;取整后的余数留给下一轮,循环终止于「无列可压」。\n const slack = flexible.reduce((sum, { w, floor }) => sum + (w - floor), 0);\n let remaining = Math.min(over, slack);\n for (const { c, w, floor } of flexible) {\n if (remaining <= 0)\n break;\n const share = Math.min(w - floor, Math.max(1, Math.round((over * (w - floor)) / slack)), remaining);\n widths[c] = w - share;\n remaining -= share;\n }\n }\n let hidden = 0;\n while (widths.length > 1 && totalWidth(widths) > available) {\n widths.pop();\n hidden += 1;\n }\n return { widths, hidden };\n}\n/** 按显示宽度截到 width(不够放 `…` 时原样返回)。 */\nfunction truncateDisplay(text: string, width: number): string {\n if (stringWidth(text) <= width)\n return text;\n let out = \"\";\n let used = 0;\n for (const ch of text) {\n const w = charDisplayWidth(ch.codePointAt(0)!);\n if (used + w > width)\n break;\n out += ch;\n used += w;\n }\n return out;\n}\n/** 列的 maxLines 收口:超出的行丢弃,最后一行以 `…` 如实标注被收口。 */\nfunction clampCellLines(lines: string[], maxLines: number | undefined, width: number): string[] {\n if (maxLines === undefined || lines.length <= maxLines)\n return lines;\n const kept = lines.slice(0, Math.max(1, maxLines));\n const last = kept[kept.length - 1]!;\n kept[kept.length - 1] = `${truncateDisplay(last, Math.max(1, width - 1))}…`;\n return kept;\n}\n/**\n * 折行时保住格子开头的缩进:层级就长在首列的缩进上(docs 的「层级与横线」),而 wrapDisplay\n * 会把行首空格吃掉——身份被压窄正是最需要看清层级的时候,不能一折行就把层级折没了。\n * 续行跟着对齐到同一个缩进。\n */\nfunction wrapIndented(cell: string, width: number): string[] {\n const indent = cell.length - cell.trimStart().length;\n if (indent === 0)\n return wrapDisplay(cell, width);\n const pad = \" \".repeat(indent);\n const body = wrapDisplay(cell.slice(indent), Math.max(1, width - indent));\n return body.map((line) => `${pad}${line}`);\n}\n/** 逻辑行 → 物理行:每格折到自己的列宽,列带 maxLines 就收口,行高取最高的那格,矮格补空串。 */\nfunction toPhysicalRows(cells: readonly string[], widths: readonly number[], maxLines: readonly (number | undefined)[]): string[][] {\n const wrapped = cells.map((cell, c) => \n // 放得下就原样保留:wrapDisplay 会把连续空格折成一个,而 DeltaTable 的\n // \"50% → 62% +12pp\" 这类格子内含固定间距 —— 不折行时一个字节都不能动。\n clampCellLines(!cell.includes(\"\\n\") && stringWidth(cell) <= widths[c] ? [cell] : wrapIndented(cell, widths[c]!), maxLines[c], widths[c]!));\n const height = Math.max(...wrapped.map((lines) => lines.length), 1);\n const out: string[][] = [];\n for (let i = 0; i < height; i++)\n out.push(wrapped.map((lines) => lines[i] ?? \"\"));\n return out;\n}\n/**\n * <Table> 的 text 面:columns × rows → 对齐的字符表。\n * 有任一行带 locator 时追加一列 attempt(locator 本身就是 `niceeval show <locator>`\n * 的位置参数;逐行重复整条命令会把表撑宽,与三个实体列表 text 面的既有取舍一致)。\n */\nexport function renderTableText(props: TextTableProps, ctx: TextContext): string {\n const locale = props.locale ?? ctx.locale;\n const hasLocator = props.rows.some((row) => row.locator !== undefined);\n if (props.columns.length === 0 && !hasLocator)\n return \"\";\n const header = props.columns.map((column) => resolveLocalizedText(column.header, locale));\n const align: ColumnAlign[] = props.columns.map((column) => column.align ?? \"left\");\n const body = props.rows.map((row) => props.columns.map((column) => cellText(row, column.key)));\n if (hasLocator) {\n header.push(localeText(locale, \"table.attempt\"));\n align.push(\"left\");\n props.rows.forEach((row, i) => body[i].push(row.locator ?? MISSING_MARK));\n }\n const matrix = [header, ...body];\n const natural = header.map((_, c) => Math.max(...matrix.map((row) => stringWidth(row[c] ?? \"\"))));\n // 画线时列间距与不画线时相同(` │ ` 与 ` ` 都是 3 列),所以只有外框那 4 列要先让出来。\n const lines = dataBoxMode(ctx.panelMode, ctx.width) === \"boxed\";\n if (!lines) {\n for (const row of body) {\n if (row[0] !== undefined) {\n row[0] = row[0].replaceAll(\"│\", \"|\").replaceAll(\"├\", \"+\").replaceAll(\"└\", \"`\");\n }\n }\n }\n // 嵌在画框的 Section 里:边界已由面板的框给出,自己只留列边界与表头横线,不套二层框。\n const outerFrame = lines && panelSectionDepth() === 0;\n const available = outerFrame ? ctx.width - DATA_BOX_FRAME_OVERHEAD : ctx.width;\n const { widths, hidden } = fitWidths(natural, align, available);\n const maxLines: (number | undefined)[] = props.columns.map((column) => column.maxLines);\n if (hasLocator)\n maxLines.push(undefined);\n // 表头不参与 maxLines 收口:表头是自己写的短词,收口只服务数据格。\n const headerPhysical = toPhysicalRows(header.slice(0, widths.length), widths, widths.map(() => undefined));\n const bodyBlocks = body.map((row, i) => ({\n depth: props.rows[i]?.depth ?? 0,\n ruleBefore: props.rows[i]?.ruleBefore ?? false,\n physical: toPhysicalRows(row.slice(0, widths.length), widths, maxLines),\n }));\n const bodyPhysical = bodyBlocks.flatMap((block) => block.physical);\n const table = lines\n ? renderFramedTable(headerPhysical, bodyBlocks, widths, align, outerFrame)\n : renderAlignedRows([...headerPhysical, ...bodyPhysical], align);\n return hidden > 0 ? `${table}\\n${countText(locale, \"table.columnsHidden\", hidden)}` : table;\n}\n/**\n * 数据格框形态:列边界贯穿全表,横线画在行树自己的边界上——表头与正文之间一条,行树有\n * 嵌套时每个顶层行之前再一条,Content 也可用中立的 `ruleBefore` 标出组边界。平表默认只有\n * 表头那一条:逐行切割读起来是一堆独立小框,层级与分组反而看不出来。`Table` 不认识具体实体。\n *\n * 框宽跟随表自己的内容宽度(`fitWidths` 已经把它压进可用列数),不硬拉满终端——\n * 窄表拉满只会让同一行的读数彼此远离。\n */\nfunction renderFramedTable(header: readonly string[][], body: readonly {\n depth: number;\n ruleBefore: boolean;\n physical: string[][];\n}[], widths: readonly number[], align: readonly ColumnAlign[], outerFrame: boolean): string {\n // 实际列宽取该列所有物理行的最宽者:压缩与折行之后不少列比预算更窄,框跟着收。\n const physical = [...header, ...body.flatMap((block) => block.physical)];\n const actual = widths.map((w, c) => {\n const widest = Math.max(...physical.map((row) => stringWidth(row[c] ?? \"\")), 1);\n return Math.min(w, widest);\n });\n const line = (row: readonly string[]): string => dataBoxRow(actual.map((w, c) => (align[c] === \"right\" ? padStartDisplay(row[c] ?? \"\", w) : padDisplay(row[c] ?? \"\", w))), outerFrame);\n const nested = body.some((block) => block.depth > 0);\n const out: string[] = [];\n if (outerFrame)\n out.push(dataBoxBorder(\"top\", actual, true));\n for (const row of header)\n out.push(line(row));\n out.push(dataBoxBorder(\"rule\", actual, outerFrame));\n body.forEach((block, i) => {\n if (i > 0 && (block.ruleBefore || (nested && block.depth === 0))) {\n out.push(dataBoxBorder(\"rule\", actual, outerFrame));\n }\n for (const row of block.physical)\n out.push(line(row));\n });\n if (outerFrame)\n out.push(dataBoxBorder(\"bottom\", actual, true));\n return out.join(\"\\n\");\n}\n"]}
@@ -1,9 +1,13 @@
1
1
  import type { TableColumn, TableRow } from "./primitives.cjs";
2
2
  import type { TextContext } from "./tree.cjs";
3
3
  /** text 排版器入参:faces.ts 与旧 Table 形态共用的预格式化表。 */
4
+ interface TextTableRow extends TableRow {
5
+ /** 在本行前画一条分组线;只表达表格结构,不携带领域语义。 */
6
+ readonly ruleBefore?: boolean;
7
+ }
4
8
  export interface TextTableProps {
5
9
  columns: readonly TableColumn[];
6
- rows: readonly TableRow[];
10
+ rows: readonly TextTableRow[];
7
11
  locale?: import("../model/locale.cjs").ReportLocale;
8
12
  }
9
13
  /**
@@ -12,3 +16,4 @@ export interface TextTableProps {
12
16
  * 的位置参数;逐行重复整条命令会把表撑宽,与三个实体列表 text 面的既有取舍一致)。
13
17
  */
14
18
  export declare function renderTableText(props: TextTableProps, ctx: TextContext): string;
19
+ export {};
@@ -1,9 +1,13 @@
1
1
  import type { TableColumn, TableRow } from "./primitives.mjs";
2
2
  import type { TextContext } from "./tree.mjs";
3
3
  /** text 排版器入参:faces.ts 与旧 Table 形态共用的预格式化表。 */
4
+ interface TextTableRow extends TableRow {
5
+ /** 在本行前画一条分组线;只表达表格结构,不携带领域语义。 */
6
+ readonly ruleBefore?: boolean;
7
+ }
4
8
  export interface TextTableProps {
5
9
  columns: readonly TableColumn[];
6
- rows: readonly TableRow[];
10
+ rows: readonly TextTableRow[];
7
11
  locale?: import("../model/locale.mjs").ReportLocale;
8
12
  }
9
13
  /**
@@ -12,3 +16,4 @@ export interface TextTableProps {
12
16
  * 的位置参数;逐行重复整条命令会把表撑宽,与三个实体列表 text 面的既有取舍一致)。
13
17
  */
14
18
  export declare function renderTableText(props: TextTableProps, ctx: TextContext): string;
19
+ export {};
@@ -1,9 +1,13 @@
1
1
  import type { TableColumn, TableRow } from "./primitives.js";
2
2
  import type { TextContext } from "./tree.js";
3
3
  /** text 排版器入参:faces.ts 与旧 Table 形态共用的预格式化表。 */
4
+ interface TextTableRow extends TableRow {
5
+ /** 在本行前画一条分组线;只表达表格结构,不携带领域语义。 */
6
+ readonly ruleBefore?: boolean;
7
+ }
4
8
  export interface TextTableProps {
5
9
  columns: readonly TableColumn[];
6
- rows: readonly TableRow[];
10
+ rows: readonly TextTableRow[];
7
11
  locale?: import("../model/locale.js").ReportLocale;
8
12
  }
9
13
  /**
@@ -12,3 +16,4 @@ export interface TextTableProps {
12
16
  * 的位置参数;逐行重复整条命令会把表撑宽,与三个实体列表 text 面的既有取舍一致)。
13
17
  */
14
18
  export declare function renderTableText(props: TextTableProps, ctx: TextContext): string;
19
+ export {};
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.REPORT_STATIC_ASSET_BYTES_MAX = exports.REPORT_SOURCE_DIFF_ASSET_BYTES_MAX = exports.REPORT_DIFF_ASSET_BYTES_MAX = exports.REPORT_SOURCE_ASSET_BYTES_MAX = exports.REPORT_DOWNLOAD_FILE_BYTES_MAX = exports.REPORT_DOWNLOAD_FILES_MAX = exports.REPORT_BUILD_RSS_BYTES_MAX = exports.REPORT_BUILD_TIME_MS_MAX = exports.REPORT_SITE_HTML_BYTES_MAX = exports.REPORT_PAGE_HTML_BYTES_MAX = exports.REPORT_DOCUMENT_DEPTH_MAX = exports.REPORT_DOCUMENT_NODES_MAX = exports.REPORT_PAGES_MAX = void 0;
3
+ exports.REPORT_STATIC_ASSET_BYTES_MAX = exports.REPORT_SOURCE_DIFF_ASSET_BYTES_MAX = exports.REPORT_DIFF_ASSET_BYTES_MAX = exports.REPORT_SOURCE_ASSET_BYTES_MAX = exports.REPORT_DOWNLOAD_FILE_BYTES_MAX = exports.REPORT_DOWNLOAD_FILES_MAX = exports.REPORT_BUILD_RSS_BYTES_MAX = exports.REPORT_BUILD_TIME_MS_MAX = exports.REPORT_SHELL_FRAGMENT_BYTES_MAX = exports.REPORT_FRAGMENT_BYTES_MAX = exports.REPORT_DOCUMENT_DEPTH_MAX = exports.REPORT_DOCUMENT_NODES_MAX = exports.REPORT_PAGES_MAX = void 0;
4
4
  exports.reportBuildBudgetExceeded = reportBuildBudgetExceeded;
5
5
  exports.makeClosedSiteRevision = makeClosedSiteRevision;
6
6
  exports.closedSiteRevisionData = closedSiteRevisionData;
@@ -10,8 +10,8 @@ exports.compareUtf8 = compareUtf8;
10
10
  exports.REPORT_PAGES_MAX = 20000;
11
11
  exports.REPORT_DOCUMENT_NODES_MAX = 20000;
12
12
  exports.REPORT_DOCUMENT_DEPTH_MAX = 32;
13
- exports.REPORT_PAGE_HTML_BYTES_MAX = 16777216;
14
- exports.REPORT_SITE_HTML_BYTES_MAX = 268435456;
13
+ exports.REPORT_FRAGMENT_BYTES_MAX = 16777216;
14
+ exports.REPORT_SHELL_FRAGMENT_BYTES_MAX = 268435456;
15
15
  exports.REPORT_BUILD_TIME_MS_MAX = 120000;
16
16
  exports.REPORT_BUILD_RSS_BYTES_MAX = 1342177280;
17
17
  exports.REPORT_DOWNLOAD_FILES_MAX = 1000;
@@ -29,7 +29,7 @@ function reportBuildBudgetExceeded(budget, maximum, observedAtLeast, target) {
29
29
  ...(target === undefined ? {} : target),
30
30
  });
31
31
  }
32
- const closedSiteRevisionTypeId = Symbol.for("niceeval.report.closed-site-revision/v1");
32
+ const closedSiteRevisionTypeId = Symbol.for("niceeval.report.closed-site-revision/v2");
33
33
  function makeClosedSiteRevision(input) {
34
34
  if (typeof input.contentHash !== "string" || input.contentHash.length === 0) {
35
35
  throw new TypeError("ClosedSiteRevision requires a non-empty content hash");
@@ -50,21 +50,13 @@ function makeClosedSiteRevision(input) {
50
50
  });
51
51
  });
52
52
  files.sort((left, right) => compareUtf8(left.path, right.path));
53
- const sourceRoutes = [...new Set(input.routes)];
54
- const routes = [...sourceRoutes].sort(compareUtf8);
55
- const defaultRoute = input.defaultRoute ?? sourceRoutes[0];
56
- if (defaultRoute !== undefined && !routes.includes(defaultRoute)) {
57
- throw new TypeError("ClosedSiteRevision default route must belong to its routes");
58
- }
59
53
  const revision = {
60
54
  identity: Object.freeze({
61
- format: "niceeval.report-site-revision/v1",
62
- renderer: "niceeval.report-ssg/v1",
55
+ format: "niceeval.report-site-revision/v2",
56
+ renderer: "niceeval.report-spa/v1",
63
57
  contentHash: input.contentHash,
64
58
  }),
65
59
  files: Object.freeze(files),
66
- routes: Object.freeze(routes),
67
- ...(defaultRoute === undefined ? {} : { defaultRoute }),
68
60
  problems: Object.freeze([...(input.problems ?? [])]),
69
61
  };
70
62
  Object.defineProperty(revision, closedSiteRevisionTypeId, {
@@ -1 +1 @@
1
- {"version":3,"file":"model.js","sourceRoot":"","sources":["model.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ReportProblem } from \"./machine.ts\";\n/** Full-site budgets fixed by docs/feature/reports/architecture.md. */\nexport const REPORT_PAGES_MAX = 20000;\nexport const REPORT_DOCUMENT_NODES_MAX = 20000;\nexport const REPORT_DOCUMENT_DEPTH_MAX = 32;\nexport const REPORT_PAGE_HTML_BYTES_MAX = 16777216;\nexport const REPORT_SITE_HTML_BYTES_MAX = 268435456;\nexport const REPORT_BUILD_TIME_MS_MAX = 120000;\nexport const REPORT_BUILD_RSS_BYTES_MAX = 1342177280;\nexport const REPORT_DOWNLOAD_FILES_MAX = 1000;\nexport const REPORT_DOWNLOAD_FILE_BYTES_MAX = 33554432;\nexport const REPORT_SOURCE_ASSET_BYTES_MAX = 8388608;\nexport const REPORT_DIFF_ASSET_BYTES_MAX = 4194304;\nexport const REPORT_SOURCE_DIFF_ASSET_BYTES_MAX = 134217728;\nexport const REPORT_STATIC_ASSET_BYTES_MAX = 268435456;\nexport type ReportBuildBudget = \"pages\" | \"document-nodes\" | \"document-depth\" | \"page-html-bytes\" | \"site-html-bytes\" | \"build-time\" | \"build-rss\" | \"download-files\" | \"download-file-bytes\" | \"source-asset-bytes\" | \"diff-asset-bytes\" | \"source-diff-asset-bytes\" | \"static-asset-bytes\";\nexport interface ReportBuildBudgetExceeded {\n readonly code: \"report-build-budget-exceeded\";\n readonly budget: ReportBuildBudget;\n readonly maximum: number;\n readonly observedAtLeast: number;\n readonly pageId?: string;\n readonly route?: string;\n}\nexport function reportBuildBudgetExceeded(budget: ReportBuildBudget, maximum: number, observedAtLeast: number, target?: {\n readonly pageId: string;\n readonly route: string;\n}): ReportBuildBudgetExceeded {\n return Object.freeze({\n code: \"report-build-budget-exceeded\" as const,\n budget,\n maximum,\n observedAtLeast,\n ...(target === undefined ? {} : target),\n });\n}\n/** One exact emitted resource. view and static read these same bytes. */\nexport interface ClosedSiteFile {\n readonly path: string;\n readonly mediaType: string;\n readonly bytes: Uint8Array;\n}\nexport interface ClosedSiteIdentity {\n readonly format: \"niceeval.report-site-revision/v1\";\n readonly renderer: \"niceeval.report-ssg/v1\";\n readonly contentHash: string;\n}\nconst closedSiteRevisionTypeId: unique symbol = Symbol.for(\"niceeval.report.closed-site-revision/v1\");\n/**\n * Publicly opaque full-site closure. The unexported unique-symbol member keeps\n * author code from constructing or inspecting it through the package type.\n */\nexport interface ClosedSiteRevision {\n readonly [closedSiteRevisionTypeId]: true;\n}\n/** @internal Transport and publisher view of the opaque revision. */\nexport interface ClosedSiteRevisionData extends ClosedSiteRevision {\n readonly identity: ClosedSiteIdentity;\n readonly files: readonly ClosedSiteFile[];\n readonly routes: readonly string[];\n /** The deterministic landing route when the revision has no root index.html. */\n readonly defaultRoute?: string;\n readonly problems: readonly ReportProblem[];\n}\nexport function makeClosedSiteRevision(input: {\n readonly contentHash: string;\n readonly files: readonly ClosedSiteFile[];\n readonly routes: readonly string[];\n readonly defaultRoute?: string;\n readonly problems?: readonly ReportProblem[];\n}): ClosedSiteRevision {\n if (typeof input.contentHash !== \"string\" || input.contentHash.length === 0) {\n throw new TypeError(\"ClosedSiteRevision requires a non-empty content hash\");\n }\n const paths = new Set<string>();\n const files = input.files.map((file) => {\n if (!isPortablePath(file.path) || typeof file.mediaType !== \"string\" || file.mediaType.length === 0 ||\n !(file.bytes instanceof Uint8Array)) {\n throw new TypeError(\"ClosedSiteRevision files must contain a portable path, media type, and bytes\");\n }\n if (paths.has(file.path))\n throw new TypeError(`ClosedSiteRevision repeats file path ${JSON.stringify(file.path)}`);\n paths.add(file.path);\n return Object.freeze({\n path: file.path,\n mediaType: file.mediaType,\n bytes: new Uint8Array(file.bytes),\n });\n });\n files.sort((left, right) => compareUtf8(left.path, right.path));\n const sourceRoutes = [...new Set(input.routes)];\n const routes = [...sourceRoutes].sort(compareUtf8);\n const defaultRoute = input.defaultRoute ?? sourceRoutes[0];\n if (defaultRoute !== undefined && !routes.includes(defaultRoute)) {\n throw new TypeError(\"ClosedSiteRevision default route must belong to its routes\");\n }\n const revision: Omit<ClosedSiteRevisionData, typeof closedSiteRevisionTypeId> = {\n identity: Object.freeze({\n format: \"niceeval.report-site-revision/v1\" as const,\n renderer: \"niceeval.report-ssg/v1\" as const,\n contentHash: input.contentHash,\n }),\n files: Object.freeze(files),\n routes: Object.freeze(routes),\n ...(defaultRoute === undefined ? {} : { defaultRoute }),\n problems: Object.freeze([...(input.problems ?? [])]),\n };\n Object.defineProperty(revision, closedSiteRevisionTypeId, {\n value: true,\n enumerable: false,\n configurable: false,\n writable: false,\n });\n return Object.freeze(revision) as unknown as ClosedSiteRevision;\n}\n/** @internal The only way transports inspect an opaque revision. */\nexport function closedSiteRevisionData(value: ClosedSiteRevision): ClosedSiteRevisionData {\n if (!isClosedSiteRevision(value))\n throw new TypeError(\"value is not a ClosedSiteRevision\");\n return value;\n}\nexport function isClosedSiteRevision(value: unknown): value is ClosedSiteRevisionData {\n if (typeof value !== \"object\" || value === null)\n return false;\n const brand = Object.getOwnPropertyDescriptor(value, closedSiteRevisionTypeId);\n return brand !== undefined && \"value\" in brand && brand.value === true &&\n Array.isArray((value as Partial<ClosedSiteRevisionData>).files) &&\n typeof (value as Partial<ClosedSiteRevisionData>).identity?.contentHash === \"string\";\n}\nfunction isPortablePath(value: string): boolean {\n return value.length > 0 && !value.startsWith(\"/\") && !value.endsWith(\"/\") &&\n !value.includes(\"\\\\\") && !value.includes(\"\\u0000\") &&\n value.split(\"/\").every((segment) => segment.length > 0 && segment !== \".\" && segment !== \"..\");\n}\nconst encoder = new TextEncoder();\nexport function compareUtf8(left: string, right: string): number {\n if (left === right)\n return 0;\n const leftBytes = encoder.encode(left);\n const rightBytes = encoder.encode(right);\n const length = Math.min(leftBytes.length, rightBytes.length);\n for (let index = 0; index < length; index += 1) {\n const difference = leftBytes[index]! - rightBytes[index]!;\n if (difference !== 0)\n return difference;\n }\n return leftBytes.length - rightBytes.length;\n}\n"]}
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["model.ts"],"names":[],"mappings":";;;AAwBA,8DAWC;AA0BD,wDAwCC;AAED,wDAIC;AACD,oDAOC;AAOD,kCAYC;AArID,uEAAuE;AAC1D,QAAA,gBAAgB,GAAG,KAAK,CAAC;AACzB,QAAA,yBAAyB,GAAG,KAAK,CAAC;AAClC,QAAA,yBAAyB,GAAG,EAAE,CAAC;AAC/B,QAAA,yBAAyB,GAAG,QAAQ,CAAC;AACrC,QAAA,+BAA+B,GAAG,SAAS,CAAC;AAC5C,QAAA,wBAAwB,GAAG,MAAM,CAAC;AAClC,QAAA,0BAA0B,GAAG,UAAU,CAAC;AACxC,QAAA,yBAAyB,GAAG,IAAI,CAAC;AACjC,QAAA,8BAA8B,GAAG,QAAQ,CAAC;AAC1C,QAAA,6BAA6B,GAAG,OAAO,CAAC;AACxC,QAAA,2BAA2B,GAAG,OAAO,CAAC;AACtC,QAAA,kCAAkC,GAAG,SAAS,CAAC;AAC/C,QAAA,6BAA6B,GAAG,SAAS,CAAC;AAUvD,SAAgB,yBAAyB,CAAC,MAAyB,EAAE,OAAe,EAAE,eAAuB,EAAE,MAG9G;IACG,OAAO,MAAM,CAAC,MAAM,CAAC;QACjB,IAAI,EAAE,8BAAuC;QAC7C,MAAM;QACN,OAAO;QACP,eAAe;QACf,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;KAC1C,CAAC,CAAC;AACP,CAAC;AAYD,MAAM,wBAAwB,GAAkB,MAAM,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;AActG,SAAgB,sBAAsB,CAAC,KAItC;IACG,IAAI,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1E,MAAM,IAAI,SAAS,CAAC,sDAAsD,CAAC,CAAC;IAChF,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACnC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;YAC/F,CAAC,CAAC,IAAI,CAAC,KAAK,YAAY,UAAU,CAAC,EAAE,CAAC;YACtC,MAAM,IAAI,SAAS,CAAC,8EAA8E,CAAC,CAAC;QACxG,CAAC;QACD,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;YACpB,MAAM,IAAI,SAAS,CAAC,wCAAwC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7F,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,OAAO,MAAM,CAAC,MAAM,CAAC;YACjB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,KAAK,EAAE,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;SACpC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAChE,MAAM,QAAQ,GAAkE;QAC5E,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC;YACpB,MAAM,EAAE,kCAA2C;YACnD,QAAQ,EAAE,wBAAiC;YAC3C,WAAW,EAAE,KAAK,CAAC,WAAW;SACjC,CAAC;QACF,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;QAC3B,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC;KACvD,CAAC;IACF,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,wBAAwB,EAAE;QACtD,KAAK,EAAE,IAAI;QACX,UAAU,EAAE,KAAK;QACjB,YAAY,EAAE,KAAK;QACnB,QAAQ,EAAE,KAAK;KAClB,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAkC,CAAC;AACpE,CAAC;AACD,oEAAoE;AACpE,SAAgB,sBAAsB,CAAC,KAAyB;IAC5D,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC;QAC5B,MAAM,IAAI,SAAS,CAAC,mCAAmC,CAAC,CAAC;IAC7D,OAAO,KAAK,CAAC;AACjB,CAAC;AACD,SAAgB,oBAAoB,CAAC,KAAc;IAC/C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAC3C,OAAO,KAAK,CAAC;IACjB,MAAM,KAAK,GAAG,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,wBAAwB,CAAC,CAAC;IAC/E,OAAO,KAAK,KAAK,SAAS,IAAI,OAAO,IAAI,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI;QAClE,KAAK,CAAC,OAAO,CAAE,KAAyC,CAAC,KAAK,CAAC;QAC/D,OAAQ,KAAyC,CAAC,QAAQ,EAAE,WAAW,KAAK,QAAQ,CAAC;AAC7F,CAAC;AACD,SAAS,cAAc,CAAC,KAAa;IACjC,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;QACrE,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAClD,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK,IAAI,CAAC,CAAC;AACvG,CAAC;AACD,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;AAClC,SAAgB,WAAW,CAAC,IAAY,EAAE,KAAa;IACnD,IAAI,IAAI,KAAK,KAAK;QACd,OAAO,CAAC,CAAC;IACb,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;IAC7D,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC7C,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,CAAE,GAAG,UAAU,CAAC,KAAK,CAAE,CAAC;QAC1D,IAAI,UAAU,KAAK,CAAC;YAChB,OAAO,UAAU,CAAC;IAC1B,CAAC;IACD,OAAO,SAAS,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;AAChD,CAAC","sourcesContent":["import type { ReportProblem } from \"./machine.ts\";\n/** Full-site budgets fixed by docs/feature/reports/architecture.md. */\nexport const REPORT_PAGES_MAX = 20000;\nexport const REPORT_DOCUMENT_NODES_MAX = 20000;\nexport const REPORT_DOCUMENT_DEPTH_MAX = 32;\nexport const REPORT_FRAGMENT_BYTES_MAX = 16777216;\nexport const REPORT_SHELL_FRAGMENT_BYTES_MAX = 268435456;\nexport const REPORT_BUILD_TIME_MS_MAX = 120000;\nexport const REPORT_BUILD_RSS_BYTES_MAX = 1342177280;\nexport const REPORT_DOWNLOAD_FILES_MAX = 1000;\nexport const REPORT_DOWNLOAD_FILE_BYTES_MAX = 33554432;\nexport const REPORT_SOURCE_ASSET_BYTES_MAX = 8388608;\nexport const REPORT_DIFF_ASSET_BYTES_MAX = 4194304;\nexport const REPORT_SOURCE_DIFF_ASSET_BYTES_MAX = 134217728;\nexport const REPORT_STATIC_ASSET_BYTES_MAX = 268435456;\nexport type ReportBuildBudget = \"pages\" | \"document-nodes\" | \"document-depth\" | \"fragment-bytes\" | \"shell-fragment-bytes\" | \"build-time\" | \"build-rss\" | \"download-files\" | \"download-file-bytes\" | \"source-asset-bytes\" | \"diff-asset-bytes\" | \"source-diff-asset-bytes\" | \"static-asset-bytes\";\nexport interface ReportBuildBudgetExceeded {\n readonly code: \"report-build-budget-exceeded\";\n readonly budget: ReportBuildBudget;\n readonly maximum: number;\n readonly observedAtLeast: number;\n readonly pageId?: string;\n readonly route?: string;\n}\nexport function reportBuildBudgetExceeded(budget: ReportBuildBudget, maximum: number, observedAtLeast: number, target?: {\n readonly pageId: string;\n readonly route: string;\n}): ReportBuildBudgetExceeded {\n return Object.freeze({\n code: \"report-build-budget-exceeded\" as const,\n budget,\n maximum,\n observedAtLeast,\n ...(target === undefined ? {} : target),\n });\n}\n/** One exact emitted resource. view and static read these same bytes. */\nexport interface ClosedSiteFile {\n readonly path: string;\n readonly mediaType: string;\n readonly bytes: Uint8Array;\n}\nexport interface ClosedSiteIdentity {\n readonly format: \"niceeval.report-site-revision/v2\";\n readonly renderer: \"niceeval.report-spa/v1\";\n readonly contentHash: string;\n}\nconst closedSiteRevisionTypeId: unique symbol = Symbol.for(\"niceeval.report.closed-site-revision/v2\");\n/**\n * Publicly opaque full-site closure. The unexported unique-symbol member keeps\n * author code from constructing or inspecting it through the package type.\n */\nexport interface ClosedSiteRevision {\n readonly [closedSiteRevisionTypeId]: true;\n}\n/** @internal Transport and publisher view of the opaque revision. */\nexport interface ClosedSiteRevisionData extends ClosedSiteRevision {\n readonly identity: ClosedSiteIdentity;\n readonly files: readonly ClosedSiteFile[];\n readonly problems: readonly ReportProblem[];\n}\nexport function makeClosedSiteRevision(input: {\n readonly contentHash: string;\n readonly files: readonly ClosedSiteFile[];\n readonly problems?: readonly ReportProblem[];\n}): ClosedSiteRevision {\n if (typeof input.contentHash !== \"string\" || input.contentHash.length === 0) {\n throw new TypeError(\"ClosedSiteRevision requires a non-empty content hash\");\n }\n const paths = new Set<string>();\n const files = input.files.map((file) => {\n if (!isPortablePath(file.path) || typeof file.mediaType !== \"string\" || file.mediaType.length === 0 ||\n !(file.bytes instanceof Uint8Array)) {\n throw new TypeError(\"ClosedSiteRevision files must contain a portable path, media type, and bytes\");\n }\n if (paths.has(file.path))\n throw new TypeError(`ClosedSiteRevision repeats file path ${JSON.stringify(file.path)}`);\n paths.add(file.path);\n return Object.freeze({\n path: file.path,\n mediaType: file.mediaType,\n bytes: new Uint8Array(file.bytes),\n });\n });\n files.sort((left, right) => compareUtf8(left.path, right.path));\n const revision: Omit<ClosedSiteRevisionData, typeof closedSiteRevisionTypeId> = {\n identity: Object.freeze({\n format: \"niceeval.report-site-revision/v2\" as const,\n renderer: \"niceeval.report-spa/v1\" as const,\n contentHash: input.contentHash,\n }),\n files: Object.freeze(files),\n problems: Object.freeze([...(input.problems ?? [])]),\n };\n Object.defineProperty(revision, closedSiteRevisionTypeId, {\n value: true,\n enumerable: false,\n configurable: false,\n writable: false,\n });\n return Object.freeze(revision) as unknown as ClosedSiteRevision;\n}\n/** @internal The only way transports inspect an opaque revision. */\nexport function closedSiteRevisionData(value: ClosedSiteRevision): ClosedSiteRevisionData {\n if (!isClosedSiteRevision(value))\n throw new TypeError(\"value is not a ClosedSiteRevision\");\n return value;\n}\nexport function isClosedSiteRevision(value: unknown): value is ClosedSiteRevisionData {\n if (typeof value !== \"object\" || value === null)\n return false;\n const brand = Object.getOwnPropertyDescriptor(value, closedSiteRevisionTypeId);\n return brand !== undefined && \"value\" in brand && brand.value === true &&\n Array.isArray((value as Partial<ClosedSiteRevisionData>).files) &&\n typeof (value as Partial<ClosedSiteRevisionData>).identity?.contentHash === \"string\";\n}\nfunction isPortablePath(value: string): boolean {\n return value.length > 0 && !value.startsWith(\"/\") && !value.endsWith(\"/\") &&\n !value.includes(\"\\\\\") && !value.includes(\"\\u0000\") &&\n value.split(\"/\").every((segment) => segment.length > 0 && segment !== \".\" && segment !== \"..\");\n}\nconst encoder = new TextEncoder();\nexport function compareUtf8(left: string, right: string): number {\n if (left === right)\n return 0;\n const leftBytes = encoder.encode(left);\n const rightBytes = encoder.encode(right);\n const length = Math.min(leftBytes.length, rightBytes.length);\n for (let index = 0; index < length; index += 1) {\n const difference = leftBytes[index]! - rightBytes[index]!;\n if (difference !== 0)\n return difference;\n }\n return leftBytes.length - rightBytes.length;\n}\n"]}
@@ -3,8 +3,8 @@ import type { ReportProblem } from "./machine.cjs";
3
3
  export declare const REPORT_PAGES_MAX = 20000;
4
4
  export declare const REPORT_DOCUMENT_NODES_MAX = 20000;
5
5
  export declare const REPORT_DOCUMENT_DEPTH_MAX = 32;
6
- export declare const REPORT_PAGE_HTML_BYTES_MAX = 16777216;
7
- export declare const REPORT_SITE_HTML_BYTES_MAX = 268435456;
6
+ export declare const REPORT_FRAGMENT_BYTES_MAX = 16777216;
7
+ export declare const REPORT_SHELL_FRAGMENT_BYTES_MAX = 268435456;
8
8
  export declare const REPORT_BUILD_TIME_MS_MAX = 120000;
9
9
  export declare const REPORT_BUILD_RSS_BYTES_MAX = 1342177280;
10
10
  export declare const REPORT_DOWNLOAD_FILES_MAX = 1000;
@@ -13,7 +13,7 @@ export declare const REPORT_SOURCE_ASSET_BYTES_MAX = 8388608;
13
13
  export declare const REPORT_DIFF_ASSET_BYTES_MAX = 4194304;
14
14
  export declare const REPORT_SOURCE_DIFF_ASSET_BYTES_MAX = 134217728;
15
15
  export declare const REPORT_STATIC_ASSET_BYTES_MAX = 268435456;
16
- export type ReportBuildBudget = "pages" | "document-nodes" | "document-depth" | "page-html-bytes" | "site-html-bytes" | "build-time" | "build-rss" | "download-files" | "download-file-bytes" | "source-asset-bytes" | "diff-asset-bytes" | "source-diff-asset-bytes" | "static-asset-bytes";
16
+ export type ReportBuildBudget = "pages" | "document-nodes" | "document-depth" | "fragment-bytes" | "shell-fragment-bytes" | "build-time" | "build-rss" | "download-files" | "download-file-bytes" | "source-asset-bytes" | "diff-asset-bytes" | "source-diff-asset-bytes" | "static-asset-bytes";
17
17
  export interface ReportBuildBudgetExceeded {
18
18
  readonly code: "report-build-budget-exceeded";
19
19
  readonly budget: ReportBuildBudget;
@@ -33,8 +33,8 @@ export interface ClosedSiteFile {
33
33
  readonly bytes: Uint8Array;
34
34
  }
35
35
  export interface ClosedSiteIdentity {
36
- readonly format: "niceeval.report-site-revision/v1";
37
- readonly renderer: "niceeval.report-ssg/v1";
36
+ readonly format: "niceeval.report-site-revision/v2";
37
+ readonly renderer: "niceeval.report-spa/v1";
38
38
  readonly contentHash: string;
39
39
  }
40
40
  declare const closedSiteRevisionTypeId: unique symbol;
@@ -49,16 +49,11 @@ export interface ClosedSiteRevision {
49
49
  export interface ClosedSiteRevisionData extends ClosedSiteRevision {
50
50
  readonly identity: ClosedSiteIdentity;
51
51
  readonly files: readonly ClosedSiteFile[];
52
- readonly routes: readonly string[];
53
- /** The deterministic landing route when the revision has no root index.html. */
54
- readonly defaultRoute?: string;
55
52
  readonly problems: readonly ReportProblem[];
56
53
  }
57
54
  export declare function makeClosedSiteRevision(input: {
58
55
  readonly contentHash: string;
59
56
  readonly files: readonly ClosedSiteFile[];
60
- readonly routes: readonly string[];
61
- readonly defaultRoute?: string;
62
57
  readonly problems?: readonly ReportProblem[];
63
58
  }): ClosedSiteRevision;
64
59
  /** @internal The only way transports inspect an opaque revision. */
@@ -3,8 +3,8 @@ import type { ReportProblem } from "./machine.mjs";
3
3
  export declare const REPORT_PAGES_MAX = 20000;
4
4
  export declare const REPORT_DOCUMENT_NODES_MAX = 20000;
5
5
  export declare const REPORT_DOCUMENT_DEPTH_MAX = 32;
6
- export declare const REPORT_PAGE_HTML_BYTES_MAX = 16777216;
7
- export declare const REPORT_SITE_HTML_BYTES_MAX = 268435456;
6
+ export declare const REPORT_FRAGMENT_BYTES_MAX = 16777216;
7
+ export declare const REPORT_SHELL_FRAGMENT_BYTES_MAX = 268435456;
8
8
  export declare const REPORT_BUILD_TIME_MS_MAX = 120000;
9
9
  export declare const REPORT_BUILD_RSS_BYTES_MAX = 1342177280;
10
10
  export declare const REPORT_DOWNLOAD_FILES_MAX = 1000;
@@ -13,7 +13,7 @@ export declare const REPORT_SOURCE_ASSET_BYTES_MAX = 8388608;
13
13
  export declare const REPORT_DIFF_ASSET_BYTES_MAX = 4194304;
14
14
  export declare const REPORT_SOURCE_DIFF_ASSET_BYTES_MAX = 134217728;
15
15
  export declare const REPORT_STATIC_ASSET_BYTES_MAX = 268435456;
16
- export type ReportBuildBudget = "pages" | "document-nodes" | "document-depth" | "page-html-bytes" | "site-html-bytes" | "build-time" | "build-rss" | "download-files" | "download-file-bytes" | "source-asset-bytes" | "diff-asset-bytes" | "source-diff-asset-bytes" | "static-asset-bytes";
16
+ export type ReportBuildBudget = "pages" | "document-nodes" | "document-depth" | "fragment-bytes" | "shell-fragment-bytes" | "build-time" | "build-rss" | "download-files" | "download-file-bytes" | "source-asset-bytes" | "diff-asset-bytes" | "source-diff-asset-bytes" | "static-asset-bytes";
17
17
  export interface ReportBuildBudgetExceeded {
18
18
  readonly code: "report-build-budget-exceeded";
19
19
  readonly budget: ReportBuildBudget;
@@ -33,8 +33,8 @@ export interface ClosedSiteFile {
33
33
  readonly bytes: Uint8Array;
34
34
  }
35
35
  export interface ClosedSiteIdentity {
36
- readonly format: "niceeval.report-site-revision/v1";
37
- readonly renderer: "niceeval.report-ssg/v1";
36
+ readonly format: "niceeval.report-site-revision/v2";
37
+ readonly renderer: "niceeval.report-spa/v1";
38
38
  readonly contentHash: string;
39
39
  }
40
40
  declare const closedSiteRevisionTypeId: unique symbol;
@@ -49,16 +49,11 @@ export interface ClosedSiteRevision {
49
49
  export interface ClosedSiteRevisionData extends ClosedSiteRevision {
50
50
  readonly identity: ClosedSiteIdentity;
51
51
  readonly files: readonly ClosedSiteFile[];
52
- readonly routes: readonly string[];
53
- /** The deterministic landing route when the revision has no root index.html. */
54
- readonly defaultRoute?: string;
55
52
  readonly problems: readonly ReportProblem[];
56
53
  }
57
54
  export declare function makeClosedSiteRevision(input: {
58
55
  readonly contentHash: string;
59
56
  readonly files: readonly ClosedSiteFile[];
60
- readonly routes: readonly string[];
61
- readonly defaultRoute?: string;
62
57
  readonly problems?: readonly ReportProblem[];
63
58
  }): ClosedSiteRevision;
64
59
  /** @internal The only way transports inspect an opaque revision. */
@@ -3,8 +3,8 @@ import type { ReportProblem } from "./machine.js";
3
3
  export declare const REPORT_PAGES_MAX = 20000;
4
4
  export declare const REPORT_DOCUMENT_NODES_MAX = 20000;
5
5
  export declare const REPORT_DOCUMENT_DEPTH_MAX = 32;
6
- export declare const REPORT_PAGE_HTML_BYTES_MAX = 16777216;
7
- export declare const REPORT_SITE_HTML_BYTES_MAX = 268435456;
6
+ export declare const REPORT_FRAGMENT_BYTES_MAX = 16777216;
7
+ export declare const REPORT_SHELL_FRAGMENT_BYTES_MAX = 268435456;
8
8
  export declare const REPORT_BUILD_TIME_MS_MAX = 120000;
9
9
  export declare const REPORT_BUILD_RSS_BYTES_MAX = 1342177280;
10
10
  export declare const REPORT_DOWNLOAD_FILES_MAX = 1000;
@@ -13,7 +13,7 @@ export declare const REPORT_SOURCE_ASSET_BYTES_MAX = 8388608;
13
13
  export declare const REPORT_DIFF_ASSET_BYTES_MAX = 4194304;
14
14
  export declare const REPORT_SOURCE_DIFF_ASSET_BYTES_MAX = 134217728;
15
15
  export declare const REPORT_STATIC_ASSET_BYTES_MAX = 268435456;
16
- export type ReportBuildBudget = "pages" | "document-nodes" | "document-depth" | "page-html-bytes" | "site-html-bytes" | "build-time" | "build-rss" | "download-files" | "download-file-bytes" | "source-asset-bytes" | "diff-asset-bytes" | "source-diff-asset-bytes" | "static-asset-bytes";
16
+ export type ReportBuildBudget = "pages" | "document-nodes" | "document-depth" | "fragment-bytes" | "shell-fragment-bytes" | "build-time" | "build-rss" | "download-files" | "download-file-bytes" | "source-asset-bytes" | "diff-asset-bytes" | "source-diff-asset-bytes" | "static-asset-bytes";
17
17
  export interface ReportBuildBudgetExceeded {
18
18
  readonly code: "report-build-budget-exceeded";
19
19
  readonly budget: ReportBuildBudget;
@@ -33,8 +33,8 @@ export interface ClosedSiteFile {
33
33
  readonly bytes: Uint8Array;
34
34
  }
35
35
  export interface ClosedSiteIdentity {
36
- readonly format: "niceeval.report-site-revision/v1";
37
- readonly renderer: "niceeval.report-ssg/v1";
36
+ readonly format: "niceeval.report-site-revision/v2";
37
+ readonly renderer: "niceeval.report-spa/v1";
38
38
  readonly contentHash: string;
39
39
  }
40
40
  declare const closedSiteRevisionTypeId: unique symbol;
@@ -49,16 +49,11 @@ export interface ClosedSiteRevision {
49
49
  export interface ClosedSiteRevisionData extends ClosedSiteRevision {
50
50
  readonly identity: ClosedSiteIdentity;
51
51
  readonly files: readonly ClosedSiteFile[];
52
- readonly routes: readonly string[];
53
- /** The deterministic landing route when the revision has no root index.html. */
54
- readonly defaultRoute?: string;
55
52
  readonly problems: readonly ReportProblem[];
56
53
  }
57
54
  export declare function makeClosedSiteRevision(input: {
58
55
  readonly contentHash: string;
59
56
  readonly files: readonly ClosedSiteFile[];
60
- readonly routes: readonly string[];
61
- readonly defaultRoute?: string;
62
57
  readonly problems?: readonly ReportProblem[];
63
58
  }): ClosedSiteRevision;
64
59
  /** @internal The only way transports inspect an opaque revision. */
@@ -15,12 +15,12 @@ const __niceevalExport5 = __niceevalCanonical["REPORT_DOWNLOAD_FILES_MAX"];
15
15
  export { __niceevalExport5 as REPORT_DOWNLOAD_FILES_MAX };
16
16
  const __niceevalExport6 = __niceevalCanonical["REPORT_DOWNLOAD_FILE_BYTES_MAX"];
17
17
  export { __niceevalExport6 as REPORT_DOWNLOAD_FILE_BYTES_MAX };
18
- const __niceevalExport7 = __niceevalCanonical["REPORT_PAGES_MAX"];
19
- export { __niceevalExport7 as REPORT_PAGES_MAX };
20
- const __niceevalExport8 = __niceevalCanonical["REPORT_PAGE_HTML_BYTES_MAX"];
21
- export { __niceevalExport8 as REPORT_PAGE_HTML_BYTES_MAX };
22
- const __niceevalExport9 = __niceevalCanonical["REPORT_SITE_HTML_BYTES_MAX"];
23
- export { __niceevalExport9 as REPORT_SITE_HTML_BYTES_MAX };
18
+ const __niceevalExport7 = __niceevalCanonical["REPORT_FRAGMENT_BYTES_MAX"];
19
+ export { __niceevalExport7 as REPORT_FRAGMENT_BYTES_MAX };
20
+ const __niceevalExport8 = __niceevalCanonical["REPORT_PAGES_MAX"];
21
+ export { __niceevalExport8 as REPORT_PAGES_MAX };
22
+ const __niceevalExport9 = __niceevalCanonical["REPORT_SHELL_FRAGMENT_BYTES_MAX"];
23
+ export { __niceevalExport9 as REPORT_SHELL_FRAGMENT_BYTES_MAX };
24
24
  const __niceevalExport10 = __niceevalCanonical["REPORT_SOURCE_ASSET_BYTES_MAX"];
25
25
  export { __niceevalExport10 as REPORT_SOURCE_ASSET_BYTES_MAX };
26
26
  const __niceevalExport11 = __niceevalCanonical["REPORT_SOURCE_DIFF_ASSET_BYTES_MAX"];
@@ -4,7 +4,6 @@ exports.validateReportRoute = validateReportRoute;
4
4
  exports.validateParameterKey = validateParameterKey;
5
5
  exports.validateDownloadPath = validateDownloadPath;
6
6
  exports.routeWithParameterKey = routeWithParameterKey;
7
- exports.staticPathForRoute = staticPathForRoute;
8
7
  exports.staticPathForDownload = staticPathForDownload;
9
8
  exports.hostStaticPath = hostStaticPath;
10
9
  exports.staticPathConflicts = staticPathConflicts;
@@ -30,16 +29,6 @@ function validateDownloadPath(value) {
30
29
  function routeWithParameterKey(path, key) {
31
30
  return path === "/" ? `/${key}` : `${path}/${key}`;
32
31
  }
33
- function staticPathForRoute(route) {
34
- const routeSegments = route === "/" ? [] : route.slice(1).split("/");
35
- const segments = [...routeSegments, "index.html"];
36
- return Object.freeze({
37
- owner: "route",
38
- source: route,
39
- segments: Object.freeze(segments),
40
- posix: segments.join("/"),
41
- });
42
- }
43
32
  function staticPathForDownload(path) {
44
33
  const segments = ["downloads", ...path.split("/")];
45
34
  return Object.freeze({
@@ -1 +1 @@
1
- {"version":3,"file":"paths.js","sourceRoot":"","sources":["paths.ts"],"names":[],"mappings":"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","sourcesContent":["/** Route and download validation is pure so every host target shares one collision set. */\nexport interface ReportPathInvalid {\n readonly code: \"report-path-invalid\";\n readonly value: string;\n readonly kind: \"route\" | \"parameter-key\" | \"download\";\n readonly reason: string;\n}\nexport interface ReportStaticPath {\n readonly owner: \"route\" | \"download\" | \"host\";\n readonly source: string;\n readonly segments: readonly string[];\n readonly posix: string;\n}\nexport interface ReportStaticPathConflict {\n readonly kind: \"exact\" | \"case-fold\" | \"windows-equivalent\" | \"file-directory-prefix\";\n readonly left: ReportStaticPath;\n readonly right: ReportStaticPath;\n}\nconst SEGMENT_PATTERN = /^[a-z0-9][a-z0-9._~-]*$/;\nconst WINDOWS_DEVICE = /^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\\..*)?$/i;\nconst encoder = new TextEncoder();\nexport function validateReportRoute(value: string): ReportPathInvalid | undefined {\n if (value === \"/\")\n return undefined;\n if (!value.startsWith(\"/\"))\n return invalid(value, \"route\", \"a route must be absolute\");\n const segments = value.slice(1).split(\"/\");\n return validateSegments(value, \"route\", segments, { allowMany: true });\n}\nexport function validateParameterKey(value: string): ReportPathInvalid | undefined {\n return validateSegments(value, \"parameter-key\", [value], { allowMany: false });\n}\nexport function validateDownloadPath(value: string): ReportPathInvalid | undefined {\n if (value.startsWith(\"/\"))\n return invalid(value, \"download\", \"a download path must be relative\");\n return validateSegments(value, \"download\", value.split(\"/\"), { allowMany: true });\n}\nexport function routeWithParameterKey(path: string, key: string): string {\n return path === \"/\" ? `/${key}` : `${path}/${key}`;\n}\nexport function staticPathForRoute(route: string): ReportStaticPath {\n const routeSegments = route === \"/\" ? [] : route.slice(1).split(\"/\");\n const segments = [...routeSegments, \"index.html\"];\n return Object.freeze({\n owner: \"route\" as const,\n source: route,\n segments: Object.freeze(segments),\n posix: segments.join(\"/\"),\n });\n}\nexport function staticPathForDownload(path: string): ReportStaticPath {\n const segments = [\"downloads\", ...path.split(\"/\")];\n return Object.freeze({\n owner: \"download\" as const,\n source: path,\n segments: Object.freeze(segments),\n posix: segments.join(\"/\"),\n });\n}\n/** Host-owned files participate in exactly the same collision analysis. */\nexport function hostStaticPath(path: string): ReportStaticPath {\n const segments = path.split(\"/\");\n return Object.freeze({\n owner: \"host\" as const,\n source: path,\n segments: Object.freeze(segments),\n posix: path,\n });\n}\nexport function staticPathConflicts(paths: readonly ReportStaticPath[]): readonly ReportStaticPathConflict[] {\n const conflicts: ReportStaticPathConflict[] = [];\n const emitted = new Set<string>();\n const exact = new Map<string, ReportStaticPath>();\n const folded = new Map<string, ReportStaticPath>();\n const windows = new Map<string, ReportStaticPath>();\n const trie = newPathTrie();\n const ordered = [...paths].sort((left, right) => compareUtf8(left.posix, right.posix));\n for (const path of ordered) {\n const exactPath = exact.get(path.posix);\n if (exactPath !== undefined) {\n addConflict(conflicts, emitted, \"exact\", exactPath, path);\n }\n else {\n const foldedPath = folded.get(foldedStaticPath(path.segments));\n if (foldedPath !== undefined) {\n addConflict(conflicts, emitted, \"case-fold\", foldedPath, path);\n }\n else {\n const windowsPath = windows.get(windowsStaticPath(path.segments));\n if (windowsPath !== undefined) {\n addConflict(conflicts, emitted, \"windows-equivalent\", windowsPath, path);\n }\n }\n }\n let node = trie;\n for (const segment of path.segments) {\n for (const ancestor of node.terminals.values()) {\n addConflict(conflicts, emitted, \"file-directory-prefix\", ancestor, path);\n }\n let child = node.children.get(segment);\n if (child === undefined) {\n child = newPathTrie();\n node.children.set(segment, child);\n }\n node = child;\n }\n for (const descendant of descendantTerminals(node)) {\n addConflict(conflicts, emitted, \"file-directory-prefix\", path, descendant);\n }\n node.terminals.set(pathSourceKey(path), path);\n exact.set(path.posix, exactPath ?? path);\n folded.set(foldedStaticPath(path.segments), folded.get(foldedStaticPath(path.segments)) ?? path);\n windows.set(windowsStaticPath(path.segments), windows.get(windowsStaticPath(path.segments)) ?? path);\n }\n return Object.freeze(conflicts);\n}\nfunction validateSegments(value: string, kind: ReportPathInvalid[\"kind\"], segments: readonly string[], options: {\n readonly allowMany: boolean;\n}): ReportPathInvalid | undefined {\n if (encoder.encode(value).byteLength > 1024) {\n return invalid(value, kind, \"a path may contain at most 1,024 UTF-8 bytes\");\n }\n if (value.includes(\"%\") || value.includes(\"?\") || value.includes(\"#\") || value.includes(\"\\\\\")) {\n return invalid(value, kind, \"a path cannot contain percent, query, fragment, or backslash syntax\");\n }\n if (segments.length === 0 || (options.allowMany && segments.length > 32)) {\n return invalid(value, kind, \"a path needs from one through 32 segments\");\n }\n for (const segment of segments) {\n if (segment.length === 0 || segment === \".\" || segment === \"..\") {\n return invalid(value, kind, \"a path cannot contain an empty, dot, or dot-dot segment\");\n }\n if (encoder.encode(segment).byteLength > 128) {\n return invalid(value, kind, \"a path segment may contain at most 128 UTF-8 bytes\");\n }\n if (!SEGMENT_PATTERN.test(segment)) {\n return invalid(value, kind, \"a path segment must match [a-z0-9][a-z0-9._~-]*\");\n }\n if (segment.endsWith(\".\") || segment.endsWith(\" \")) {\n return invalid(value, kind, \"a path segment cannot end in dot or space\");\n }\n if (WINDOWS_DEVICE.test(segment)) {\n return invalid(value, kind, \"a path segment cannot be a Windows device name\");\n }\n }\n return undefined;\n}\ninterface PathTrie {\n readonly children: Map<string, PathTrie>;\n readonly terminals: Map<string, ReportStaticPath>;\n}\nfunction newPathTrie(): PathTrie {\n return { children: new Map(), terminals: new Map() };\n}\nfunction* descendantTerminals(node: PathTrie): Iterable<ReportStaticPath> {\n for (const child of node.children.values()) {\n yield* child.terminals.values();\n yield* descendantTerminals(child);\n }\n}\nfunction addConflict(conflicts: ReportStaticPathConflict[], emitted: Set<string>, kind: ReportStaticPathConflict[\"kind\"], left: ReportStaticPath, right: ReportStaticPath): void {\n const leftKey = pathSourceKey(left);\n const rightKey = pathSourceKey(right);\n const pair = compareUtf8(leftKey, rightKey) <= 0 ? `${leftKey}\\u0001${rightKey}` : `${rightKey}\\u0001${leftKey}`;\n const key = `${kind}\\u0000${pair}`;\n if (emitted.has(key))\n return;\n emitted.add(key);\n conflicts.push(Object.freeze({ kind, left, right }));\n}\nfunction pathSourceKey(path: ReportStaticPath): string {\n return `${path.owner}\\u0000${path.source}`;\n}\nfunction foldedStaticPath(segments: readonly string[]): string {\n return segments.join(\"/\").toLowerCase();\n}\nfunction windowsStaticPath(segments: readonly string[]): string {\n return segments.map((segment) => segment.replace(/[. ]+$/u, \"\").toLowerCase()).join(\"/\");\n}\nfunction invalid(value: string, kind: ReportPathInvalid[\"kind\"], reason: string): ReportPathInvalid {\n return Object.freeze({ code: \"report-path-invalid\" as const, value, kind, reason });\n}\nfunction compareUtf8(left: string, right: string): number {\n if (left === right)\n return 0;\n const leftBytes = encoder.encode(left);\n const rightBytes = encoder.encode(right);\n const length = Math.min(leftBytes.length, rightBytes.length);\n for (let index = 0; index < length; index += 1) {\n const delta = leftBytes[index]! - rightBytes[index]!;\n if (delta !== 0)\n return delta;\n }\n return leftBytes.length - rightBytes.length;\n}\n"]}
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["paths.ts"],"names":[],"mappings":"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","sourcesContent":["/** Route and download validation is pure so every host target shares one collision set. */\nexport interface ReportPathInvalid {\n readonly code: \"report-path-invalid\";\n readonly value: string;\n readonly kind: \"route\" | \"parameter-key\" | \"download\";\n readonly reason: string;\n}\nexport interface ReportStaticPath {\n readonly owner: \"route\" | \"download\" | \"host\";\n readonly source: string;\n readonly segments: readonly string[];\n readonly posix: string;\n}\nexport interface ReportStaticPathConflict {\n readonly kind: \"exact\" | \"case-fold\" | \"windows-equivalent\" | \"file-directory-prefix\";\n readonly left: ReportStaticPath;\n readonly right: ReportStaticPath;\n}\nconst SEGMENT_PATTERN = /^[a-z0-9][a-z0-9._~-]*$/;\nconst WINDOWS_DEVICE = /^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\\..*)?$/i;\nconst encoder = new TextEncoder();\nexport function validateReportRoute(value: string): ReportPathInvalid | undefined {\n if (value === \"/\")\n return undefined;\n if (!value.startsWith(\"/\"))\n return invalid(value, \"route\", \"a route must be absolute\");\n const segments = value.slice(1).split(\"/\");\n return validateSegments(value, \"route\", segments, { allowMany: true });\n}\nexport function validateParameterKey(value: string): ReportPathInvalid | undefined {\n return validateSegments(value, \"parameter-key\", [value], { allowMany: false });\n}\nexport function validateDownloadPath(value: string): ReportPathInvalid | undefined {\n if (value.startsWith(\"/\"))\n return invalid(value, \"download\", \"a download path must be relative\");\n return validateSegments(value, \"download\", value.split(\"/\"), { allowMany: true });\n}\nexport function routeWithParameterKey(path: string, key: string): string {\n return path === \"/\" ? `/${key}` : `${path}/${key}`;\n}\nexport function staticPathForDownload(path: string): ReportStaticPath {\n const segments = [\"downloads\", ...path.split(\"/\")];\n return Object.freeze({\n owner: \"download\" as const,\n source: path,\n segments: Object.freeze(segments),\n posix: segments.join(\"/\"),\n });\n}\n/** Host-owned files participate in exactly the same collision analysis. */\nexport function hostStaticPath(path: string): ReportStaticPath {\n const segments = path.split(\"/\");\n return Object.freeze({\n owner: \"host\" as const,\n source: path,\n segments: Object.freeze(segments),\n posix: path,\n });\n}\nexport function staticPathConflicts(paths: readonly ReportStaticPath[]): readonly ReportStaticPathConflict[] {\n const conflicts: ReportStaticPathConflict[] = [];\n const emitted = new Set<string>();\n const exact = new Map<string, ReportStaticPath>();\n const folded = new Map<string, ReportStaticPath>();\n const windows = new Map<string, ReportStaticPath>();\n const trie = newPathTrie();\n const ordered = [...paths].sort((left, right) => compareUtf8(left.posix, right.posix));\n for (const path of ordered) {\n const exactPath = exact.get(path.posix);\n if (exactPath !== undefined) {\n addConflict(conflicts, emitted, \"exact\", exactPath, path);\n }\n else {\n const foldedPath = folded.get(foldedStaticPath(path.segments));\n if (foldedPath !== undefined) {\n addConflict(conflicts, emitted, \"case-fold\", foldedPath, path);\n }\n else {\n const windowsPath = windows.get(windowsStaticPath(path.segments));\n if (windowsPath !== undefined) {\n addConflict(conflicts, emitted, \"windows-equivalent\", windowsPath, path);\n }\n }\n }\n let node = trie;\n for (const segment of path.segments) {\n for (const ancestor of node.terminals.values()) {\n addConflict(conflicts, emitted, \"file-directory-prefix\", ancestor, path);\n }\n let child = node.children.get(segment);\n if (child === undefined) {\n child = newPathTrie();\n node.children.set(segment, child);\n }\n node = child;\n }\n for (const descendant of descendantTerminals(node)) {\n addConflict(conflicts, emitted, \"file-directory-prefix\", path, descendant);\n }\n node.terminals.set(pathSourceKey(path), path);\n exact.set(path.posix, exactPath ?? path);\n folded.set(foldedStaticPath(path.segments), folded.get(foldedStaticPath(path.segments)) ?? path);\n windows.set(windowsStaticPath(path.segments), windows.get(windowsStaticPath(path.segments)) ?? path);\n }\n return Object.freeze(conflicts);\n}\nfunction validateSegments(value: string, kind: ReportPathInvalid[\"kind\"], segments: readonly string[], options: {\n readonly allowMany: boolean;\n}): ReportPathInvalid | undefined {\n if (encoder.encode(value).byteLength > 1024) {\n return invalid(value, kind, \"a path may contain at most 1,024 UTF-8 bytes\");\n }\n if (value.includes(\"%\") || value.includes(\"?\") || value.includes(\"#\") || value.includes(\"\\\\\")) {\n return invalid(value, kind, \"a path cannot contain percent, query, fragment, or backslash syntax\");\n }\n if (segments.length === 0 || (options.allowMany && segments.length > 32)) {\n return invalid(value, kind, \"a path needs from one through 32 segments\");\n }\n for (const segment of segments) {\n if (segment.length === 0 || segment === \".\" || segment === \"..\") {\n return invalid(value, kind, \"a path cannot contain an empty, dot, or dot-dot segment\");\n }\n if (encoder.encode(segment).byteLength > 128) {\n return invalid(value, kind, \"a path segment may contain at most 128 UTF-8 bytes\");\n }\n if (!SEGMENT_PATTERN.test(segment)) {\n return invalid(value, kind, \"a path segment must match [a-z0-9][a-z0-9._~-]*\");\n }\n if (segment.endsWith(\".\") || segment.endsWith(\" \")) {\n return invalid(value, kind, \"a path segment cannot end in dot or space\");\n }\n if (WINDOWS_DEVICE.test(segment)) {\n return invalid(value, kind, \"a path segment cannot be a Windows device name\");\n }\n }\n return undefined;\n}\ninterface PathTrie {\n readonly children: Map<string, PathTrie>;\n readonly terminals: Map<string, ReportStaticPath>;\n}\nfunction newPathTrie(): PathTrie {\n return { children: new Map(), terminals: new Map() };\n}\nfunction* descendantTerminals(node: PathTrie): Iterable<ReportStaticPath> {\n for (const child of node.children.values()) {\n yield* child.terminals.values();\n yield* descendantTerminals(child);\n }\n}\nfunction addConflict(conflicts: ReportStaticPathConflict[], emitted: Set<string>, kind: ReportStaticPathConflict[\"kind\"], left: ReportStaticPath, right: ReportStaticPath): void {\n const leftKey = pathSourceKey(left);\n const rightKey = pathSourceKey(right);\n const pair = compareUtf8(leftKey, rightKey) <= 0 ? `${leftKey}\\u0001${rightKey}` : `${rightKey}\\u0001${leftKey}`;\n const key = `${kind}\\u0000${pair}`;\n if (emitted.has(key))\n return;\n emitted.add(key);\n conflicts.push(Object.freeze({ kind, left, right }));\n}\nfunction pathSourceKey(path: ReportStaticPath): string {\n return `${path.owner}\\u0000${path.source}`;\n}\nfunction foldedStaticPath(segments: readonly string[]): string {\n return segments.join(\"/\").toLowerCase();\n}\nfunction windowsStaticPath(segments: readonly string[]): string {\n return segments.map((segment) => segment.replace(/[. ]+$/u, \"\").toLowerCase()).join(\"/\");\n}\nfunction invalid(value: string, kind: ReportPathInvalid[\"kind\"], reason: string): ReportPathInvalid {\n return Object.freeze({ code: \"report-path-invalid\" as const, value, kind, reason });\n}\nfunction compareUtf8(left: string, right: string): number {\n if (left === right)\n return 0;\n const leftBytes = encoder.encode(left);\n const rightBytes = encoder.encode(right);\n const length = Math.min(leftBytes.length, rightBytes.length);\n for (let index = 0; index < length; index += 1) {\n const delta = leftBytes[index]! - rightBytes[index]!;\n if (delta !== 0)\n return delta;\n }\n return leftBytes.length - rightBytes.length;\n}\n"]}
@@ -20,7 +20,6 @@ export declare function validateReportRoute(value: string): ReportPathInvalid |
20
20
  export declare function validateParameterKey(value: string): ReportPathInvalid | undefined;
21
21
  export declare function validateDownloadPath(value: string): ReportPathInvalid | undefined;
22
22
  export declare function routeWithParameterKey(path: string, key: string): string;
23
- export declare function staticPathForRoute(route: string): ReportStaticPath;
24
23
  export declare function staticPathForDownload(path: string): ReportStaticPath;
25
24
  /** Host-owned files participate in exactly the same collision analysis. */
26
25
  export declare function hostStaticPath(path: string): ReportStaticPath;
@@ -20,7 +20,6 @@ export declare function validateReportRoute(value: string): ReportPathInvalid |
20
20
  export declare function validateParameterKey(value: string): ReportPathInvalid | undefined;
21
21
  export declare function validateDownloadPath(value: string): ReportPathInvalid | undefined;
22
22
  export declare function routeWithParameterKey(path: string, key: string): string;
23
- export declare function staticPathForRoute(route: string): ReportStaticPath;
24
23
  export declare function staticPathForDownload(path: string): ReportStaticPath;
25
24
  /** Host-owned files participate in exactly the same collision analysis. */
26
25
  export declare function hostStaticPath(path: string): ReportStaticPath;
@@ -20,7 +20,6 @@ export declare function validateReportRoute(value: string): ReportPathInvalid |
20
20
  export declare function validateParameterKey(value: string): ReportPathInvalid | undefined;
21
21
  export declare function validateDownloadPath(value: string): ReportPathInvalid | undefined;
22
22
  export declare function routeWithParameterKey(path: string, key: string): string;
23
- export declare function staticPathForRoute(route: string): ReportStaticPath;
24
23
  export declare function staticPathForDownload(path: string): ReportStaticPath;
25
24
  /** Host-owned files participate in exactly the same collision analysis. */
26
25
  export declare function hostStaticPath(path: string): ReportStaticPath;
@@ -9,12 +9,10 @@ const __niceevalExport2 = __niceevalCanonical["staticPathConflicts"];
9
9
  export { __niceevalExport2 as staticPathConflicts };
10
10
  const __niceevalExport3 = __niceevalCanonical["staticPathForDownload"];
11
11
  export { __niceevalExport3 as staticPathForDownload };
12
- const __niceevalExport4 = __niceevalCanonical["staticPathForRoute"];
13
- export { __niceevalExport4 as staticPathForRoute };
14
- const __niceevalExport5 = __niceevalCanonical["validateDownloadPath"];
15
- export { __niceevalExport5 as validateDownloadPath };
16
- const __niceevalExport6 = __niceevalCanonical["validateParameterKey"];
17
- export { __niceevalExport6 as validateParameterKey };
18
- const __niceevalExport7 = __niceevalCanonical["validateReportRoute"];
19
- export { __niceevalExport7 as validateReportRoute };
12
+ const __niceevalExport4 = __niceevalCanonical["validateDownloadPath"];
13
+ export { __niceevalExport4 as validateDownloadPath };
14
+ const __niceevalExport5 = __niceevalCanonical["validateParameterKey"];
15
+ export { __niceevalExport5 as validateParameterKey };
16
+ const __niceevalExport6 = __niceevalCanonical["validateReportRoute"];
17
+ export { __niceevalExport6 as validateReportRoute };
20
18
  //# sourceMappingURL=paths.js.map