@iowarp/clio-coder 0.4.9 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1172) hide show
  1. package/.claude-plugin/marketplace.json +11 -3
  2. package/CHANGELOG.md +153 -0
  3. package/CODE_OF_CONDUCT.md +10 -0
  4. package/CONTRIBUTING.md +208 -382
  5. package/NOTICE +8 -2
  6. package/README.md +199 -418
  7. package/ROADMAP.md +82 -0
  8. package/SECURITY.md +14 -11
  9. package/dist/acp-KS7ARGV6.js +132 -0
  10. package/dist/agents-YOGJ2YEJ.js +163 -0
  11. package/dist/assets/codewiki.json +1 -1
  12. package/dist/auth-CEDCO6O6.js +557 -0
  13. package/dist/background-YWTBPSQU.js +39 -0
  14. package/dist/builtins-GDYO4RTR.js +23 -0
  15. package/dist/chunk-27YTM2CV.js +175 -0
  16. package/dist/chunk-2AF6YC7Q.js +75 -0
  17. package/dist/chunk-2DTIWSAW.js +381 -0
  18. package/dist/chunk-2EMLKSCX.js +262 -0
  19. package/dist/chunk-2OJ3YZQP.js +665 -0
  20. package/dist/chunk-2VLYHHFT.js +35 -0
  21. package/dist/chunk-2WVPJF3Z.js +204 -0
  22. package/dist/chunk-33OASOS6.js +176 -0
  23. package/dist/chunk-3BD2LXYJ.js +19 -0
  24. package/dist/chunk-3JHUFKG7.js +30 -0
  25. package/dist/chunk-3JLTRPN7.js +711 -0
  26. package/dist/chunk-3LT34CAM.js +2796 -0
  27. package/dist/chunk-3O5JWP4L.js +1670 -0
  28. package/dist/chunk-3UW3KU4A.js +21 -0
  29. package/dist/chunk-4A6YRGV4.js +569 -0
  30. package/dist/chunk-4D2BRCZ3.js +67 -0
  31. package/dist/chunk-4SYHGVDE.js +668 -0
  32. package/dist/chunk-4VDHLCF5.js +66 -0
  33. package/dist/chunk-4WOOTKFD.js +637 -0
  34. package/dist/chunk-4WV4PI66.js +80 -0
  35. package/dist/chunk-53OXPRI6.js +195 -0
  36. package/dist/chunk-55RMDDFM.js +1347 -0
  37. package/dist/chunk-56XP4FJU.js +2025 -0
  38. package/dist/chunk-5B3RTYAK.js +123 -0
  39. package/dist/chunk-5CD243WE.js +45 -0
  40. package/dist/chunk-5JQR5B4D.js +709 -0
  41. package/dist/chunk-5KQEUIWM.js +597 -0
  42. package/dist/chunk-5LP5FNNR.js +915 -0
  43. package/dist/chunk-62UK7AGW.js +9344 -0
  44. package/dist/chunk-6CTHLZFB.js +563 -0
  45. package/dist/chunk-6EJYVCTN.js +23 -0
  46. package/dist/chunk-6OWUM2NC.js +12289 -0
  47. package/dist/chunk-6RJMYYIE.js +1023 -0
  48. package/dist/chunk-6W75D37F.js +643 -0
  49. package/dist/chunk-733ZBT5P.js +1721 -0
  50. package/dist/chunk-77DCC6JZ.js +3710 -0
  51. package/dist/chunk-7QXCO3AF.js +156 -0
  52. package/dist/chunk-7RET77VB.js +481 -0
  53. package/dist/chunk-A4MVRV4C.js +65 -0
  54. package/dist/chunk-ALJWT6O6.js +93 -0
  55. package/dist/chunk-AVSR2HKI.js +232 -0
  56. package/dist/chunk-B7GY6QER.js +42 -0
  57. package/dist/chunk-BFOSV5EZ.js +178 -0
  58. package/dist/chunk-BGOIM7NB.js +103 -0
  59. package/dist/chunk-BJH6WFIB.js +372 -0
  60. package/dist/chunk-BOBCCDJ6.js +1533 -0
  61. package/dist/chunk-BRCOSE7O.js +117 -0
  62. package/dist/chunk-BYFHHCFV.js +601 -0
  63. package/dist/chunk-C2CPOIH2.js +83 -0
  64. package/dist/chunk-C7AQTPCE.js +694 -0
  65. package/dist/chunk-CBAQPTDU.js +165 -0
  66. package/dist/chunk-CDQ2UC6W.js +125 -0
  67. package/dist/chunk-CN6SW5DC.js +177 -0
  68. package/dist/chunk-CRHPCPZP.js +132 -0
  69. package/dist/chunk-CTFPFW3H.js +44 -0
  70. package/dist/chunk-D3KWFOUT.js +103 -0
  71. package/dist/chunk-D65E25JG.js +185 -0
  72. package/dist/chunk-DCGHJQ2U.js +236 -0
  73. package/dist/chunk-DE2LU267.js +106 -0
  74. package/dist/chunk-DF6PI6GN.js +97 -0
  75. package/dist/chunk-DGC6X6XR.js +53 -0
  76. package/dist/chunk-DOUISWEE.js +526 -0
  77. package/dist/chunk-DR3TAEUA.js +188 -0
  78. package/dist/chunk-DVTBERFY.js +33 -0
  79. package/dist/chunk-DXSETN72.js +1051 -0
  80. package/dist/chunk-DZLR4UEH.js +128 -0
  81. package/dist/chunk-E6IPKW2E.js +77 -0
  82. package/dist/chunk-EG4ARXPC.js +139 -0
  83. package/dist/chunk-EKV4UBCM.js +652 -0
  84. package/dist/chunk-EOJPDNUP.js +1325 -0
  85. package/dist/chunk-EX57VVWW.js +4157 -0
  86. package/dist/chunk-EYTLV3W3.js +5937 -0
  87. package/dist/chunk-EZD2BXGP.js +475 -0
  88. package/dist/chunk-EZDCA34W.js +314 -0
  89. package/dist/chunk-FD2I4KBR.js +33 -0
  90. package/dist/chunk-FD3IAHQM.js +27 -0
  91. package/dist/chunk-FFYTC2KQ.js +416 -0
  92. package/dist/chunk-FGSQHUCK.js +110 -0
  93. package/dist/chunk-GCQFN7YI.js +32 -0
  94. package/dist/chunk-GGPF6LLE.js +38 -0
  95. package/dist/chunk-GGWI3OVM.js +215 -0
  96. package/dist/chunk-GLIQT7SU.js +172 -0
  97. package/dist/chunk-GN7QBEEI.js +95 -0
  98. package/dist/chunk-GRHOXDKB.js +1104 -0
  99. package/dist/chunk-HMN2C6YL.js +54 -0
  100. package/dist/chunk-HOEDA42N.js +310 -0
  101. package/dist/chunk-HOYZUKG7.js +192 -0
  102. package/dist/chunk-HQVN7G4F.js +1021 -0
  103. package/dist/chunk-HSQQFDB3.js +519 -0
  104. package/dist/chunk-I4ELN5BX.js +47 -0
  105. package/dist/chunk-I4Y4WKZR.js +386 -0
  106. package/dist/chunk-IFPDAD7R.js +797 -0
  107. package/dist/chunk-IN7DGBVS.js +582 -0
  108. package/dist/chunk-ISHUS7HC.js +396 -0
  109. package/dist/chunk-JPXLJSGR.js +191 -0
  110. package/dist/chunk-JQCLXSFI.js +69 -0
  111. package/dist/chunk-KBUTSJSR.js +61 -0
  112. package/dist/chunk-KW5HXKLJ.js +56 -0
  113. package/dist/chunk-L4APUGCT.js +139 -0
  114. package/dist/chunk-L7G7K4I2.js +505 -0
  115. package/dist/chunk-LAR7DX5E.js +1840 -0
  116. package/dist/chunk-LAVUQX3B.js +462 -0
  117. package/dist/chunk-LJRBX7QR.js +116 -0
  118. package/dist/chunk-LNOXCGN2.js +1864 -0
  119. package/dist/chunk-LTWH2ACR.js +23002 -0
  120. package/dist/chunk-LYJJ6546.js +661 -0
  121. package/dist/chunk-M2IPMWCN.js +457 -0
  122. package/dist/chunk-MGLRTOCK.js +101 -0
  123. package/dist/chunk-MZF5IKZT.js +160 -0
  124. package/dist/chunk-N24R6KWS.js +386 -0
  125. package/dist/chunk-NASYVWDB.js +604 -0
  126. package/dist/chunk-NBXFPI7U.js +195 -0
  127. package/dist/chunk-NDPF2N2L.js +400 -0
  128. package/dist/chunk-NFSK2VNU.js +446 -0
  129. package/dist/chunk-NG3QQSXY.js +43 -0
  130. package/dist/chunk-NOCSM22Y.js +63 -0
  131. package/dist/chunk-NVPXXW2H.js +1143 -0
  132. package/dist/chunk-O63U2I6I.js +30 -0
  133. package/dist/chunk-OJXOA6YU.js +98 -0
  134. package/dist/chunk-OPD7GL6F.js +1196 -0
  135. package/dist/chunk-OQ2EOAHA.js +14399 -0
  136. package/dist/chunk-OV62D6KO.js +688 -0
  137. package/dist/chunk-OZ76TLGU.js +740 -0
  138. package/dist/chunk-P4GNZPXO.js +1156 -0
  139. package/dist/chunk-PS6JAWJZ.js +78 -0
  140. package/dist/chunk-PXRCXGLK.js +1865 -0
  141. package/dist/chunk-QDUUOZ3S.js +108 -0
  142. package/dist/chunk-QG6I2T5E.js +1416 -0
  143. package/dist/chunk-QHSBROEW.js +308 -0
  144. package/dist/chunk-QNUQ7K7D.js +46 -0
  145. package/dist/chunk-QZTTRSJE.js +333 -0
  146. package/dist/chunk-R2UUNSNQ.js +1605 -0
  147. package/dist/chunk-R7FGRZNF.js +1794 -0
  148. package/dist/chunk-RNDCROSG.js +199 -0
  149. package/dist/chunk-S36CXHO2.js +302 -0
  150. package/dist/chunk-SJGS3GDI.js +575 -0
  151. package/dist/chunk-SQZHXUB3.js +510 -0
  152. package/dist/chunk-SUTLW6ND.js +686 -0
  153. package/dist/chunk-SYF7FVBL.js +179 -0
  154. package/dist/chunk-T2MDZES3.js +1577 -0
  155. package/dist/chunk-T33IYTZM.js +1146 -0
  156. package/dist/chunk-TDGYTWM6.js +49 -0
  157. package/dist/chunk-TGL5FZVD.js +132 -0
  158. package/dist/chunk-TGWZXJ7L.js +1205 -0
  159. package/dist/chunk-TKDRT2DF.js +114 -0
  160. package/dist/chunk-TV2EBCSQ.js +152 -0
  161. package/dist/chunk-U26XXPJS.js +367 -0
  162. package/dist/chunk-U5QU5ZOD.js +419 -0
  163. package/dist/chunk-U6YTUVOX.js +1011 -0
  164. package/dist/chunk-UCINIRHW.js +188 -0
  165. package/dist/chunk-UJD5MPP6.js +52 -0
  166. package/dist/chunk-URCXX7WJ.js +146 -0
  167. package/dist/chunk-UX2L5CUD.js +898 -0
  168. package/dist/chunk-UZVYEF57.js +114 -0
  169. package/dist/chunk-V35KZDUZ.js +218 -0
  170. package/dist/chunk-VESL6DQY.js +1058 -0
  171. package/dist/chunk-VKHLUZNO.js +986 -0
  172. package/dist/chunk-VOYUCAQF.js +584 -0
  173. package/dist/chunk-VYRQHORQ.js +414 -0
  174. package/dist/chunk-W53XSRQE.js +245 -0
  175. package/dist/chunk-X4CEFOSG.js +226 -0
  176. package/dist/chunk-XDHUDE5K.js +380 -0
  177. package/dist/chunk-XISLDHEL.js +1290 -0
  178. package/dist/chunk-XM34YQ2Y.js +169 -0
  179. package/dist/chunk-XMDBTYCH.js +661 -0
  180. package/dist/chunk-XS2QPZJE.js +449 -0
  181. package/dist/chunk-YBUECLAF.js +618 -0
  182. package/dist/chunk-YQ6XEFVK.js +332 -0
  183. package/dist/chunk-YYLCPDCC.js +990 -0
  184. package/dist/chunk-Z4GLJ6J4.js +1035 -0
  185. package/dist/chunk-ZARZ4POR.js +210 -0
  186. package/dist/chunk-ZJPORZTC.js +119 -0
  187. package/dist/chunk-ZNUZ3EXD.js +243 -0
  188. package/dist/chunk-ZPST2KQO.js +49 -0
  189. package/dist/chunk-ZR5YA6ZF.js +512 -0
  190. package/dist/chunk-ZU4JPCPR.js +319 -0
  191. package/dist/chunk-ZUKUCZYZ.js +39 -0
  192. package/dist/cli/index.js +56 -45
  193. package/dist/clio-K2PBVCEM.js +27 -0
  194. package/dist/clio-context-tools-GR4OHFSO.js +145 -0
  195. package/dist/code-nav-4X3OI6DK.js +715 -0
  196. package/dist/codewiki/build-worker.js +4 -4
  197. package/dist/compile-cache-YRB6QRO7.js +18 -0
  198. package/dist/components-RQOJ6NUR.js +675 -0
  199. package/dist/config-Q5J7UBAB.js +291 -0
  200. package/dist/config-XE7XYZLU.js +38 -0
  201. package/dist/config-graph-P3555574.js +175 -0
  202. package/dist/configure-KIJ32ZO6.js +104 -0
  203. package/dist/context-LFBQOSXT.js +344 -0
  204. package/dist/context-NNLBES2Y.js +82 -0
  205. package/dist/context-WBH3KSVR.js +302 -0
  206. package/dist/context-clear-YOHMQ6SQ.js +208 -0
  207. package/dist/context-index-X2N5UAIF.js +120 -0
  208. package/dist/context-map-HOSMGUG2.js +555 -0
  209. package/dist/context-working-set-MRAEVDNV.js +1564 -0
  210. package/dist/data-tool-JJPBGMQJ.js +2986 -0
  211. package/dist/detail-RHJOTGN4.js +139 -0
  212. package/dist/dispatch-runner-NC7PYNIO.js +2477 -0
  213. package/dist/docs-K4GBWRUX.js +342 -0
  214. package/dist/doctor-S5KZ2GTN.js +1138 -0
  215. package/dist/doctor-deep-2EJQSHIZ.js +130 -0
  216. package/dist/domain-loader-MB34FDPD.js +13 -0
  217. package/dist/eval-3D6M36N7.js +5220 -0
  218. package/dist/eval-inventory-SM3HNM47.js +260 -0
  219. package/dist/evals-FO6JEUCN.js +104 -0
  220. package/dist/evidence-6IYN52ET.js +262 -0
  221. package/dist/evidence-JVECPI3F.js +250 -0
  222. package/dist/evidence-XNVPPLVK.js +410 -0
  223. package/dist/evolve-TLPUDJDM.js +634 -0
  224. package/dist/extensions-ROZJ5X3J.js +311 -0
  225. package/dist/fleet-6RJWIOEO.js +284 -0
  226. package/dist/fleet-WKVBF5SZ.js +942 -0
  227. package/dist/fleet-commands-L6WFT7KZ.js +76 -0
  228. package/dist/fleet-decisions-BTQMWU5A.js +55 -0
  229. package/dist/fleet-graph-553DZ67Q.js +141 -0
  230. package/dist/fleet-inspect-236FZPRB.js +329 -0
  231. package/dist/fleet-new-CKUXP3CO.js +48 -0
  232. package/dist/fleet-preflight-NZQHABWO.js +95 -0
  233. package/dist/fleet-validate-7NLAE26R.js +96 -0
  234. package/dist/fleet-verify-E3RO6A5W.js +226 -0
  235. package/dist/fleet-view-KMZQY7YJ.js +144 -0
  236. package/dist/gui/client/assets/abnfDiagram-VCTEODGH-DPBWQwNn.js +1 -0
  237. package/dist/gui/client/assets/architecture-7GRP2DOG-D1w8FrFW.js +1 -0
  238. package/dist/gui/client/assets/architectureDiagram-5GKGNRK7-CVPgKd1-.js +36 -0
  239. package/dist/gui/client/assets/blockDiagram-I7D4REHJ-BLmnqkK5.js +129 -0
  240. package/dist/gui/client/assets/c4Diagram-7LVT6UL2-4AU9cfM7.js +38 -0
  241. package/dist/gui/client/assets/channel-DwFZ0m8S.js +1 -0
  242. package/dist/gui/client/assets/chunk-4HAMMTFA-EOWkKCav.js +62 -0
  243. package/dist/gui/client/assets/chunk-75Z2AOVW-CygeoIMl.js +2 -0
  244. package/dist/gui/client/assets/chunk-DU6HZSFF-s27fViLb.js +125 -0
  245. package/dist/gui/client/assets/chunk-F27PBJKO-BrHvwLsZ.js +1 -0
  246. package/dist/gui/client/assets/chunk-GMAD6QVW-DzPh-7jt.js +72 -0
  247. package/dist/gui/client/assets/chunk-GVQU2GXP-pIaQkIzm.js +1 -0
  248. package/dist/gui/client/assets/chunk-IMKFNOWR-BGJVE_Br.js +231 -0
  249. package/dist/gui/client/assets/chunk-L3NEJ4N5-B3YLuhww.js +1 -0
  250. package/dist/gui/client/assets/chunk-OSK3NFVY-BRj61HHU.js +10 -0
  251. package/dist/gui/client/assets/chunk-P2QGCYS3-Sno90KxP.js +1 -0
  252. package/dist/gui/client/assets/chunk-POPQ4Y6H-Cw8NTbxr.js +1 -0
  253. package/dist/gui/client/assets/chunk-PWAF6VOD-BIhHgz37.js +1 -0
  254. package/dist/gui/client/assets/chunk-SHT3W25Y-Cqv7npBj.js +168 -0
  255. package/dist/gui/client/assets/chunk-SVP7TREG-Hxzl6Dee.js +88 -0
  256. package/dist/gui/client/assets/chunk-TICWLB2K-CIFVyVP2.js +206 -0
  257. package/dist/gui/client/assets/classDiagram-ZZMXUADV-BJbAiI_w.js +1 -0
  258. package/dist/gui/client/assets/classDiagram-v2-VYDZK3BY-BJbAiI_w.js +1 -0
  259. package/dist/gui/client/assets/cynefin-OW5HDTMX-DecLWZ-y.js +1 -0
  260. package/dist/gui/client/assets/cynefinDiagram-5FMLGOSQ-CK-T2N-D.js +62 -0
  261. package/dist/gui/client/assets/dagre-GXQ25YYZ-C0dfg-OS.js +4 -0
  262. package/dist/gui/client/assets/diagram-S7CK7UJ4-EaJukVh-.js +30 -0
  263. package/dist/gui/client/assets/diagram-UQ7AKVKN-xcOucEtP.js +41 -0
  264. package/dist/gui/client/assets/diagram-VSXAHHWV-3AUJACMf.js +3 -0
  265. package/dist/gui/client/assets/diagram-VX7I27RA-TPknLqam.js +24 -0
  266. package/dist/gui/client/assets/diagram-Z3DM3KII-wa1q3YMF.js +24 -0
  267. package/dist/gui/client/assets/ebnfDiagram-PWID7BFC-JBCF2-s7.js +1 -0
  268. package/dist/gui/client/assets/erDiagram-RLTQ6QDP-CmXjXPc4.js +99 -0
  269. package/dist/gui/client/assets/eventmodeling-NTZA5JFV-D_1aJWYl.js +1 -0
  270. package/dist/gui/client/assets/flowDiagram-HODETNUW-BQtZlael.js +1 -0
  271. package/dist/gui/client/assets/framework-Bq-znqwW.js +9 -0
  272. package/dist/gui/client/assets/ganttDiagram-EL5Y4UJY-IPaL_kaa.js +292 -0
  273. package/dist/gui/client/assets/gitGraph-4MIJSDKK-Oy0Q3hoc.js +1 -0
  274. package/dist/gui/client/assets/gitGraphDiagram-WWUBYQGX-jtAuBmbc.js +106 -0
  275. package/dist/gui/client/assets/index-CuFuBEdL.css +1 -0
  276. package/dist/gui/client/assets/index-hMbEIsX0.js +87 -0
  277. package/dist/gui/client/assets/info-A6RAGUB7-UtEs1tv7.js +1 -0
  278. package/dist/gui/client/assets/infoDiagram-27XIBGKW-hlwR1pBW.js +2 -0
  279. package/dist/gui/client/assets/ishikawaDiagram-5VMMS53U-C6vMtfsd.js +70 -0
  280. package/dist/gui/client/assets/journeyDiagram-3NMN7TZE-EAwAl_PS.js +139 -0
  281. package/dist/gui/client/assets/kanban-definition-UXKFOSKX-CQOhRKHW.js +89 -0
  282. package/dist/gui/client/assets/line-DbcwGZTW.js +1 -0
  283. package/dist/gui/client/assets/mermaid-parser.core-C2QfVcHd.js +7 -0
  284. package/dist/gui/client/assets/mermaid.core-N9qUTre1.js +44 -0
  285. package/dist/gui/client/assets/mindmap-definition-YA3MSWOX-BR_FL9gK.js +96 -0
  286. package/dist/gui/client/assets/packet-AYTQ26CC-CbBJ2oAa.js +1 -0
  287. package/dist/gui/client/assets/pegDiagram-XKGWAZYB-BruU0IHM.js +1 -0
  288. package/dist/gui/client/assets/pie-WAS4IAKB-BWdSng4H.js +1 -0
  289. package/dist/gui/client/assets/pieDiagram-E7YTZNPT-CR3ljgdU.js +39 -0
  290. package/dist/gui/client/assets/quadrantDiagram-AXDQQJYC-C-boKslr.js +7 -0
  291. package/dist/gui/client/assets/radar-RG4KPBEZ-CGlOnAKG.js +1 -0
  292. package/dist/gui/client/assets/railroad-74A4TZTK-CDvuAlyC.js +1 -0
  293. package/dist/gui/client/assets/railroad-abnf-HS5TGJTU-CQUA9crC.js +1 -0
  294. package/dist/gui/client/assets/railroad-ebnf-LZEXJU2U-CD857gxq.js +1 -0
  295. package/dist/gui/client/assets/railroad-peg-WCYAUIDC-DUV4k35E.js +1 -0
  296. package/dist/gui/client/assets/railroadDiagram-O6MQD6OU-DMR4LXmA.js +1 -0
  297. package/dist/gui/client/assets/requirementDiagram-BXWQKSXE-DVltaF6c.js +84 -0
  298. package/dist/gui/client/assets/sankeyDiagram-P5KCCOFB-CHdNz472.js +40 -0
  299. package/dist/gui/client/assets/sequenceDiagram-WJ2MYXX4-DaMafIty.js +162 -0
  300. package/dist/gui/client/assets/stateDiagram-D77RDMKH-CEbBHqn3.js +1 -0
  301. package/dist/gui/client/assets/stateDiagram-v2-MP3YSRHH-B3JgDdFg.js +1 -0
  302. package/dist/gui/client/assets/swimlanes-42K2YHIH-BlPHndnJ.js +1 -0
  303. package/dist/gui/client/assets/swimlanesDiagram-VR7AAH4N-BPabHwsZ.js +8 -0
  304. package/dist/gui/client/assets/timeline-definition-24CTP7MA-E4Y1lPBI.js +120 -0
  305. package/dist/gui/client/assets/treeView-Q6P3EWNA-DrY0uhTN.js +1 -0
  306. package/dist/gui/client/assets/treemap-WGGIJYW6-CVotnLHf.js +1 -0
  307. package/dist/gui/client/assets/vennDiagram-4TSXK5OY-DJNrLIOF.js +34 -0
  308. package/dist/gui/client/assets/wardley-WFR3VGLG-ClOpAp5S.js +1 -0
  309. package/dist/gui/client/assets/wardleyDiagram-VM6X3IG4-qhMoKOXc.js +78 -0
  310. package/dist/gui/client/assets/xychartDiagram-S5SC5T6Z-CTuXoo9R.js +7 -0
  311. package/dist/gui/client/index.html +6 -0
  312. package/dist/gui/ops-worker.js +167 -0
  313. package/dist/gui/reads-worker.js +473 -0
  314. package/dist/gui/server.js +9780 -0
  315. package/dist/gui-QJS7XQMV.js +16 -0
  316. package/dist/init-DV5B6HQG.js +354 -0
  317. package/dist/install-6C45YXFP.js +19 -0
  318. package/dist/install-O7NSRU2W.js +13 -0
  319. package/dist/interactive-OXGYZYAS.js +22381 -0
  320. package/dist/interop-J7UOBOSF.js +254 -0
  321. package/dist/inventory-OEGIL6PY.js +144 -0
  322. package/dist/library-B3UPGY4V.js +83 -0
  323. package/dist/library-MXQA5DLT.js +309 -0
  324. package/dist/library-ROZAMUIL.js +496 -0
  325. package/dist/library-import-2LTWOVBD.js +190 -0
  326. package/dist/library-inventory-LJ3XHLWO.js +60 -0
  327. package/dist/library-validation-DARHHUNW.js +46 -0
  328. package/dist/mcp-2GSPYQ54.js +28 -0
  329. package/dist/memory-J3STUUIK.js +537 -0
  330. package/dist/models-Y3GMFJ2V.js +314 -0
  331. package/dist/monitor-LHNH577J.js +811 -0
  332. package/dist/orchestrator-DTAPXULA.js +12117 -0
  333. package/dist/panes-A743ONZ5.js +103 -0
  334. package/dist/panes-CTNO57ZY.js +76 -0
  335. package/dist/paths-3SBYJQDP.js +68 -0
  336. package/dist/preload-OJBMAIXF.js +140 -0
  337. package/dist/providers-CMETPZNS.js +232 -0
  338. package/dist/registry-37T4U6X2.js +15 -0
  339. package/dist/reset-O7EUCYWO.js +346 -0
  340. package/dist/resources-FY6XYFN2.js +189 -0
  341. package/dist/run-H64MEVTA.js +1067 -0
  342. package/dist/run-script-PQ5NRU3X.js +42 -0
  343. package/dist/settings-SNIQNXCW.js +73 -0
  344. package/dist/settings-controls-X6GMCPVG.js +202 -0
  345. package/dist/share-CAFMMQLM.js +299 -0
  346. package/dist/skills-ERKQUC7L.js +114 -0
  347. package/dist/skills-eval-CQ23MYQK.js +1099 -0
  348. package/dist/skills-inventory-TVUYJDVN.js +142 -0
  349. package/dist/slash-commands-ROG3KIFJ.js +107 -0
  350. package/dist/startup-background-KDWCQMWT.js +247 -0
  351. package/dist/steer-KKYXJSH4.js +77 -0
  352. package/dist/support-M3RCUUEL.js +40 -0
  353. package/dist/system-ZDW44ZGX.js +142 -0
  354. package/dist/target-runtimes-PWA22WVW.js +73 -0
  355. package/dist/targets-AJWA6E7Z.js +1207 -0
  356. package/dist/tasks-6L2JJRC5.js +39 -0
  357. package/dist/terminal-lease-YFUSDPAD.js +432 -0
  358. package/dist/tools-5XJUABRD.js +30 -0
  359. package/dist/trace-LA5MVR4Y.js +527 -0
  360. package/dist/tree-sitter-TQW3Y52T.js +4673 -0
  361. package/dist/tui-primitives-IUCVWLH5.js +19 -0
  362. package/dist/uninstall-SAWGGXAB.js +448 -0
  363. package/dist/upgrade-HSNSVTZG.js +300 -0
  364. package/dist/usage-XSILDHKF.js +1083 -0
  365. package/dist/verifiers-ECA5GIHL.js +633 -0
  366. package/dist/verify-R6QQCCEB.js +31 -0
  367. package/dist/version-PLZYB5KW.js +22 -0
  368. package/dist/web-fetch-PVZNMBOB.js +803 -0
  369. package/dist/wiki-generate-RP22WP5K.js +647 -0
  370. package/dist/with-panes-W3PAZPRF.js +629 -0
  371. package/dist/worker/entry.js +324 -284
  372. package/dist/workspace-check-3764ZKC2.js +83 -0
  373. package/docs/README.md +26 -10
  374. package/docs/architecture/acp.md +179 -12
  375. package/docs/architecture/artifact-placement.md +1 -1
  376. package/docs/architecture/capacity-and-scheduling.md +7 -8
  377. package/docs/architecture/context-engine.md +350 -95
  378. package/docs/architecture/model-catalog.md +18 -11
  379. package/docs/architecture/observability.md +1 -1
  380. package/docs/architecture/pi-boundary.md +59 -6
  381. package/docs/architecture/prompt-envelope-and-tools.md +147 -39
  382. package/docs/architecture/provider-adapter-cookbook.md +2 -2
  383. package/docs/architecture/safety-model.md +18 -4
  384. package/docs/architecture/trace-store.md +2 -2
  385. package/docs/architecture/tui-design.md +41 -81
  386. package/docs/architecture/worker-dispatch-mechanics.md +9 -1
  387. package/docs/gui/README.md +69 -0
  388. package/docs/gui/boundary-doctrine.md +104 -0
  389. package/docs/gui/chat-rendering-spec.md +1440 -0
  390. package/docs/gui/cli-surface-routing.md +148 -0
  391. package/docs/gui/delivery-order.md +53 -0
  392. package/docs/gui/event-bus-coverage.md +103 -0
  393. package/docs/gui/inspector-presentation.md +71 -0
  394. package/docs/gui/parity/01-cli-surface.md +74 -0
  395. package/docs/gui/parity/02-slash-and-surfaces.md +110 -0
  396. package/docs/gui/parity/03-domains-and-plan.md +69 -0
  397. package/docs/gui/performance-baseline.md +76 -0
  398. package/docs/gui/settings-write-surface.md +267 -0
  399. package/docs/gui/workflow-coverage.md +64 -0
  400. package/docs/guide/built-in-agents.md +1 -1
  401. package/docs/guide/commands-and-modes.md +256 -99
  402. package/docs/guide/configuration-and-targets.md +485 -124
  403. package/docs/guide/configuration-reference.md +165 -82
  404. package/docs/guide/doctor.md +127 -0
  405. package/docs/guide/environment-variables.md +1 -1
  406. package/docs/guide/exit-codes-and-output.md +3 -1
  407. package/docs/guide/extensions-and-sharing.md +3 -14
  408. package/docs/guide/fleet-dispatch.md +231 -45
  409. package/docs/guide/glossary.md +1 -1
  410. package/docs/guide/installation-and-lifecycle.md +27 -16
  411. package/docs/guide/interop.md +2 -2
  412. package/docs/guide/proactive-memory.md +154 -68
  413. package/docs/guide/resource-library.md +4 -0
  414. package/docs/guide/skills-marketplace.md +8 -4
  415. package/docs/guide/slurm.md +88 -0
  416. package/docs/guide/tool-usage.md +134 -11
  417. package/docs/guide/troubleshooting.md +4 -2
  418. package/docs/process/battletest-2026-09-20-fixes.md +161 -0
  419. package/docs/process/configure-tree-proposal.md +637 -0
  420. package/docs/process/documentation-coverage.md +8 -0
  421. package/docs/process/documentation-guide.md +18 -1
  422. package/docs/process/eval-runner.md +58 -14
  423. package/docs/process/performance-methodology.md +11 -3
  424. package/docs/process/release-cut-checklist.md +29 -3
  425. package/docs/process/tool-audit-v0.4.9.md +3 -0
  426. package/examples/extensions/README.md +1 -3
  427. package/examples/extensions/lab-status/clio-coder-extension.json +1 -1
  428. package/examples/extensions/measurements/clio-coder-extension.json +1 -1
  429. package/library/registry.yaml +30 -5
  430. package/library/skills/git/fix-issue/SKILL.md +2 -1
  431. package/library/skills/git/fix-issue/plugin.json +1 -1
  432. package/library/skills/git/ship/SKILL.md +2 -1
  433. package/library/skills/git/ship/plugin.json +1 -1
  434. package/library/skills/meta/clio-coder-test/SKILL.md +5 -6
  435. package/library/skills/meta/clio-coder-test/evals.md +2 -2
  436. package/library/skills/meta/clio-coder-test/references/test-map.md +2 -2
  437. package/library/skills/registry.yaml +9 -5
  438. package/library/skills/research/slurm-jobs/SKILL.md +110 -0
  439. package/library/skills/research/slurm-jobs/evals.md +39 -0
  440. package/library/skills/research/slurm-jobs/plugin.json +23 -0
  441. package/library/skills/skill-marketplace.json +18 -2
  442. package/package.json +15 -10
  443. package/src/cli/args.ts +59 -0
  444. package/src/cli/argv.ts +7 -0
  445. package/src/cli/clio.ts +9 -1
  446. package/src/cli/configure-controls.ts +136 -0
  447. package/src/cli/configure-onboarding.ts +24 -7
  448. package/src/cli/configure-quick.ts +32 -7
  449. package/src/cli/configure-target.ts +11 -1
  450. package/src/cli/configure.ts +253 -256
  451. package/src/cli/docs-server.ts +290 -0
  452. package/src/cli/docs.ts +60 -15
  453. package/src/cli/doctor-deep.ts +126 -0
  454. package/src/cli/doctor-hpc.ts +122 -0
  455. package/src/cli/doctor-slurm.ts +130 -0
  456. package/src/cli/doctor-task-worktrees.ts +88 -0
  457. package/src/cli/doctor.ts +165 -16
  458. package/src/cli/fleet-verify.ts +3 -2
  459. package/src/cli/gui.ts +111 -0
  460. package/src/cli/index.ts +14 -4
  461. package/src/cli/library.ts +2 -7
  462. package/src/cli/modes/json-stream.ts +4 -2
  463. package/src/cli/modes/print.ts +252 -25
  464. package/src/cli/run.ts +199 -71
  465. package/src/cli/skills.ts +25 -7
  466. package/src/cli/targets.ts +87 -9
  467. package/src/cli/uninstall.ts +28 -8
  468. package/src/cli/usage.ts +2 -1
  469. package/src/cli/workspace-check.ts +71 -0
  470. package/src/core/bash-exec.ts +8 -2
  471. package/src/core/bus-events.ts +32 -3
  472. package/src/core/cache-telemetry.ts +3 -2
  473. package/src/core/compile-cache.ts +11 -1
  474. package/src/core/config.ts +59 -6
  475. package/src/core/defaults.ts +27 -5
  476. package/src/core/diagnostics.ts +25 -0
  477. package/src/core/event-bus.ts +2 -1
  478. package/src/core/gateway-routing.ts +10 -3
  479. package/src/core/git-commit-attribution.ts +2 -1
  480. package/src/core/naming-compat.ts +6 -4
  481. package/src/core/package-root.ts +0 -9
  482. package/src/core/path-canonical.ts +143 -24
  483. package/src/core/residency-target-key.ts +2 -6
  484. package/src/core/run-overrides.ts +1 -1
  485. package/src/core/settings-awareness.ts +108 -0
  486. package/src/core/settings-controls.ts +673 -0
  487. package/src/core/settings-navigation.ts +116 -0
  488. package/src/core/theme-token-hex.ts +19 -9
  489. package/src/core/turn-constraints.ts +52 -0
  490. package/src/domains/agents/builtins/scout.md +7 -17
  491. package/src/domains/agents/catalog.ts +5 -1
  492. package/src/domains/agents/extension.ts +2 -1
  493. package/src/domains/agents/registry.ts +4 -3
  494. package/src/domains/agents/result-contract.ts +132 -1
  495. package/src/domains/config/classify.ts +11 -7
  496. package/src/domains/config/extension.ts +5 -1
  497. package/src/domains/config/keybindings.ts +2 -2
  498. package/src/domains/context/codewiki/coordinator.ts +10 -0
  499. package/src/domains/context/worker/snapshot.ts +6 -3
  500. package/src/domains/dispatch/active-route-planner.ts +2 -0
  501. package/src/domains/dispatch/agent-candidates.ts +5 -1
  502. package/src/domains/dispatch/capability-match.ts +1 -1
  503. package/src/domains/dispatch/contract.ts +28 -0
  504. package/src/domains/dispatch/event-pump.ts +37 -3
  505. package/src/domains/dispatch/extension.ts +391 -48
  506. package/src/domains/dispatch/failure-classification.ts +37 -2
  507. package/src/domains/dispatch/receipt-integrity.ts +3 -0
  508. package/src/domains/dispatch/run-identity.ts +10 -3
  509. package/src/domains/dispatch/target-breaker.ts +163 -0
  510. package/src/domains/dispatch/types.ts +29 -2
  511. package/src/domains/dispatch/worker-model-loads.ts +66 -0
  512. package/src/domains/dispatch/worker-protocol.ts +20 -1
  513. package/src/domains/dispatch/worker-spawn.ts +28 -2
  514. package/src/domains/eval/artifacts/redact.ts +9 -0
  515. package/src/domains/eval/metrics/noop.ts +61 -0
  516. package/src/domains/eval/reports/junit.ts +5 -1
  517. package/src/domains/eval/reports/text.ts +7 -0
  518. package/src/domains/eval/runners/clio-run.ts +19 -8
  519. package/src/domains/eval/runners/external-command.ts +29 -4
  520. package/src/domains/eval/schema/adapter.ts +6 -2
  521. package/src/domains/eval/schema/suite.ts +2 -0
  522. package/src/domains/eval/schema/validate.ts +3 -0
  523. package/src/domains/eval/suites/run.ts +167 -26
  524. package/src/domains/evidence/detail.ts +3 -2
  525. package/src/domains/extensions/operator-runtime.ts +11 -4
  526. package/src/domains/gateway/mcp/client.ts +1 -1
  527. package/src/domains/lifecycle/doctor.ts +42 -26
  528. package/src/domains/lifecycle/migrations/2026-09-18-ollama-runtime-id.ts +38 -0
  529. package/src/domains/lifecycle/migrations/index.ts +2 -0
  530. package/src/domains/middleware/demo-guidance.ts +36 -0
  531. package/src/domains/middleware/dispatch-nudge.ts +1 -1
  532. package/src/domains/middleware/memory-intervention.ts +51 -4
  533. package/src/domains/middleware/runtime.ts +5 -4
  534. package/src/domains/middleware/skills-reminder.ts +29 -52
  535. package/src/domains/middleware/task-nudge.ts +1 -0
  536. package/src/domains/middleware/watchdog.ts +4 -0
  537. package/src/domains/observability/extension.ts +2 -1
  538. package/src/domains/observability/out-of-turn-usage.ts +3 -2
  539. package/src/domains/observability/projection.ts +3 -2
  540. package/src/domains/observability/worker-progress.ts +48 -0
  541. package/src/domains/prompts/compiler.ts +148 -52
  542. package/src/domains/prompts/contract.ts +3 -3
  543. package/src/domains/prompts/demo-guidance.ts +8 -0
  544. package/src/domains/prompts/extension.ts +12 -7
  545. package/src/domains/prompts/fragments/identity/clio.md +2 -1
  546. package/src/domains/prompts/fragments/identity/docs-routing.md +2 -0
  547. package/src/domains/prompts/fragments/identity/self-awareness.md +4 -0
  548. package/src/domains/prompts/fragments/operating/contract.md +16 -7
  549. package/src/domains/prompts/fragments/operating/delegation.md +29 -13
  550. package/src/domains/prompts/fragments/operating/skills.md +18 -10
  551. package/src/domains/prompts/fragments/operating/worker.md +2 -0
  552. package/src/domains/providers/cache-deployment.ts +45 -2
  553. package/src/domains/providers/contract.ts +52 -11
  554. package/src/domains/providers/extension.ts +230 -53
  555. package/src/domains/providers/model-discovery.ts +22 -8
  556. package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +5 -7
  557. package/src/domains/providers/plugins.ts +3 -4
  558. package/src/domains/providers/probe/fingerprint.ts +2 -2
  559. package/src/domains/providers/probe/reasoning.ts +9 -16
  560. package/src/domains/providers/probe/tool-call.ts +236 -0
  561. package/src/domains/providers/registry.ts +51 -8
  562. package/src/domains/providers/runtime-resolution.ts +60 -12
  563. package/src/domains/providers/runtimes/boot-manifest.ts +1 -1
  564. package/src/domains/providers/runtimes/builtins.ts +2 -2
  565. package/src/domains/providers/runtimes/common/lmstudio-http.ts +57 -41
  566. package/src/domains/providers/runtimes/common/local-synth.ts +3 -1
  567. package/src/domains/providers/runtimes/common/ollama-model-ids.ts +11 -0
  568. package/src/domains/providers/runtimes/common/probe-helpers.ts +53 -0
  569. package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +3 -1
  570. package/src/domains/providers/runtimes/local-native/llamacpp-embed.ts +7 -13
  571. package/src/domains/providers/runtimes/local-native/llamacpp-rerank.ts +7 -17
  572. package/src/domains/providers/runtimes/local-native/llamacpp.ts +1 -0
  573. package/src/domains/providers/runtimes/local-native/ollama.ts +211 -0
  574. package/src/domains/providers/runtimes/protocol/litellm.ts +77 -65
  575. package/src/domains/providers/support.ts +1 -1
  576. package/src/domains/providers/types/local-model-quirks.ts +2 -3
  577. package/src/domains/providers/types/runtime-descriptor.ts +23 -3
  578. package/src/domains/providers/types/target-descriptor.ts +15 -3
  579. package/src/domains/resources/collision.ts +7 -2
  580. package/src/domains/resources/index.ts +1 -0
  581. package/src/domains/resources/library-actions.ts +4 -2
  582. package/src/domains/resources/library-inventory.ts +6 -2
  583. package/src/domains/resources/prompts/loader.ts +20 -7
  584. package/src/domains/resources/skills/availability.ts +56 -0
  585. package/src/domains/resources/skills/loader.ts +20 -9
  586. package/src/domains/safety/action-classifier.ts +282 -31
  587. package/src/domains/safety/audit.ts +2 -1
  588. package/src/domains/safety/autonomy.ts +54 -11
  589. package/src/domains/safety/decision-presentation.ts +17 -4
  590. package/src/domains/safety/finish-contract-registration.ts +25 -1
  591. package/src/domains/safety/finish-contract.ts +20 -5
  592. package/src/domains/safety/path-policy.ts +6 -2
  593. package/src/domains/safety/policy-engine.ts +168 -48
  594. package/src/domains/safety/protected-artifacts.ts +527 -16
  595. package/src/domains/safety/read-scope.ts +120 -0
  596. package/src/domains/safety/skill-authority.ts +52 -16
  597. package/src/domains/scheduling/cluster.ts +14 -3
  598. package/src/domains/scheduling/contract.ts +7 -0
  599. package/src/domains/scheduling/extension.ts +20 -9
  600. package/src/domains/scheduling/local-capacity.ts +160 -0
  601. package/src/domains/session/context-accounting.ts +44 -31
  602. package/src/domains/session/context-ledger.ts +10 -3
  603. package/src/domains/session/entries.ts +4 -0
  604. package/src/domains/session/history.ts +1 -1
  605. package/src/domains/session/prompt-cache.ts +1 -0
  606. package/src/domains/session/prompt-manifest.ts +3 -1
  607. package/src/domains/session/retry.ts +4 -6
  608. package/src/domains/session/task-board.ts +19 -4
  609. package/src/domains/session/tree/preview.ts +3 -2
  610. package/src/engine/acp/commands.ts +653 -0
  611. package/src/engine/acp/server.ts +639 -20
  612. package/src/engine/acp/tool-mediator.ts +30 -7
  613. package/src/engine/acp/types.ts +58 -0
  614. package/src/engine/agent.ts +55 -10
  615. package/src/engine/ai.ts +11 -2
  616. package/src/engine/api-registry.ts +5 -4
  617. package/src/engine/apis/degraded-inference.ts +243 -0
  618. package/src/engine/apis/llamacpp-residency.ts +50 -6
  619. package/src/engine/apis/lmstudio-residency.ts +3 -5
  620. package/src/engine/apis/lmstudio.ts +137 -31
  621. package/src/engine/apis/ollama-http.ts +118 -0
  622. package/src/engine/apis/ollama-native.ts +216 -97
  623. package/src/engine/apis/openai-completions.ts +191 -189
  624. package/src/engine/apis/output-budget.ts +3 -1
  625. package/src/engine/apis/residency-lock.ts +2 -1
  626. package/src/engine/apis/residency.ts +339 -89
  627. package/src/engine/apis/sampling-overrides.ts +23 -2
  628. package/src/engine/apis/types.ts +1 -2
  629. package/src/engine/claude/tool-safety.ts +30 -5
  630. package/src/engine/context.ts +13 -0
  631. package/src/engine/env-api-keys.ts +2 -1
  632. package/src/engine/gemma-channel-filter.ts +3 -2
  633. package/src/engine/instrumented-tui.ts +25 -0
  634. package/src/engine/loop-guard.ts +172 -6
  635. package/src/engine/pi-mono-names.ts +16 -0
  636. package/src/engine/prewarm.ts +44 -15
  637. package/src/engine/provider-payload.ts +52 -14
  638. package/src/engine/session.ts +4 -2
  639. package/src/engine/worker-events.ts +9 -1
  640. package/src/engine/worker-runtime.ts +269 -42
  641. package/src/engine/worker-tools.ts +8 -3
  642. package/src/entry/boot-options.ts +23 -0
  643. package/src/entry/orchestrator.ts +207 -36
  644. package/src/interactive/assistant-generation-timing.ts +52 -0
  645. package/src/interactive/chat-loop-messages.ts +4 -1
  646. package/src/interactive/chat-loop.ts +59 -9
  647. package/src/interactive/chat-panel.ts +10 -1
  648. package/src/interactive/clio-editor.ts +51 -79
  649. package/src/interactive/context-meter.ts +1 -0
  650. package/src/interactive/context-overlay.ts +21 -8
  651. package/src/interactive/cost-overlay.ts +1 -1
  652. package/src/interactive/dispatch-board.ts +39 -8
  653. package/src/interactive/editor-bash.ts +0 -34
  654. package/src/interactive/editor-rails.ts +43 -0
  655. package/src/interactive/editor-submit.ts +34 -2
  656. package/src/interactive/footer/dashboard.ts +67 -38
  657. package/src/interactive/footer/demo-hints.ts +40 -0
  658. package/src/interactive/footer/key-hints.ts +21 -0
  659. package/src/interactive/footer/notifications.ts +1 -1
  660. package/src/interactive/footer/pages.ts +486 -0
  661. package/src/interactive/footer/system-metrics.ts +147 -0
  662. package/src/interactive/footer/widgets.ts +158 -63
  663. package/src/interactive/footer-panel.ts +29 -7
  664. package/src/interactive/interactive-application.ts +109 -21
  665. package/src/interactive/interactive-event-projection.ts +6 -2
  666. package/src/interactive/interactive-presentation.ts +25 -29
  667. package/src/interactive/interactive-slash-runtime.ts +32 -18
  668. package/src/interactive/interactive-subscriptions.ts +25 -5
  669. package/src/interactive/interactive-tickers.ts +21 -5
  670. package/src/interactive/keybinding-manager.ts +9 -0
  671. package/src/interactive/overlay-frame.ts +29 -7
  672. package/src/interactive/overlay-lifecycle.ts +5 -3
  673. package/src/interactive/overlay-model-selectors.ts +4 -0
  674. package/src/interactive/overlay-permission-lifecycle.ts +6 -5
  675. package/src/interactive/overlays/ask-user.ts +103 -110
  676. package/src/interactive/overlays/help-reference.ts +1 -0
  677. package/src/interactive/overlays/message-picker.ts +3 -29
  678. package/src/interactive/overlays/session-selector.ts +3 -2
  679. package/src/interactive/overlays/settings-sections.ts +2 -30
  680. package/src/interactive/overlays/settings.ts +310 -607
  681. package/src/interactive/permission-hint.ts +3 -3
  682. package/src/interactive/permission-overlay.ts +45 -27
  683. package/src/interactive/renderers/doctor-report.ts +43 -0
  684. package/src/interactive/renderers/tool-execution.ts +87 -62
  685. package/src/interactive/renderers/worker-entry.ts +76 -3
  686. package/src/interactive/side-question.ts +3 -1
  687. package/src/interactive/slash-commands.ts +78 -23
  688. package/src/interactive/startup-background.ts +131 -0
  689. package/src/interactive/startup-diagnostics.ts +16 -0
  690. package/src/interactive/status/state-machine.ts +16 -3
  691. package/src/interactive/status/types.ts +2 -0
  692. package/src/interactive/status/verbs.ts +1 -1
  693. package/src/interactive/terminal-lease.ts +26 -22
  694. package/src/interactive/theme/components.ts +1 -1
  695. package/src/interactive/theme/rules.ts +1 -1
  696. package/src/interactive/theme/tokens.ts +16 -10
  697. package/src/interactive/transcript-detail.ts +4 -0
  698. package/src/interactive/turn-context.ts +56 -20
  699. package/src/interactive/turn-middleware.ts +57 -9
  700. package/src/interactive/turn-prewarm.ts +121 -18
  701. package/src/interactive/turn-recovery.ts +10 -8
  702. package/src/interactive/turn-runtime.ts +74 -29
  703. package/src/interactive/turn-state.ts +3 -0
  704. package/src/interactive/welcome-art.ts +36 -0
  705. package/src/interactive/welcome-dashboard.ts +209 -49
  706. package/src/interactive/worker-replay.ts +4 -0
  707. package/src/interactive/worker-stream.ts +17 -2
  708. package/src/tools/agent-tools.ts +22 -1
  709. package/src/tools/builtin-tool-catalog.ts +2 -2
  710. package/src/tools/codewiki/code-nav.ts +1 -1
  711. package/src/tools/codewiki/shared.ts +39 -1
  712. package/src/tools/compete-worktrees.ts +8 -91
  713. package/src/tools/context/docs-engine.ts +44 -12
  714. package/src/tools/context/index.ts +126 -22
  715. package/src/tools/context/library.ts +1 -1
  716. package/src/tools/context/surface.ts +12 -7
  717. package/src/tools/core-bootstrap.ts +3 -0
  718. package/src/tools/dispatch-runner.ts +18 -0
  719. package/src/tools/dispatch-schema.ts +187 -206
  720. package/src/tools/edit.ts +46 -42
  721. package/src/tools/file-mutation-queue.ts +25 -26
  722. package/src/tools/gateway/clio-context-surface.ts +1 -1
  723. package/src/tools/gateway/index.ts +7 -3
  724. package/src/tools/gateway/mcp-capabilities.ts +5 -3
  725. package/src/tools/grep.ts +14 -2
  726. package/src/tools/ls.ts +1 -4
  727. package/src/tools/monitor.ts +14 -1
  728. package/src/tools/observation.ts +1 -3
  729. package/src/tools/path-utils.ts +51 -18
  730. package/src/tools/process-lease.ts +99 -0
  731. package/src/tools/read.ts +1 -1
  732. package/src/tools/registry.ts +71 -9
  733. package/src/tools/task-worktree.ts +296 -17
  734. package/src/tools/tasks.ts +29 -7
  735. package/src/tools/worker-evidence.ts +60 -1
  736. package/src/tools/worktree-root.ts +252 -0
  737. package/src/tools/write.ts +34 -30
  738. package/src/worker/entry.ts +18 -1
  739. package/src/worker/protocol.ts +54 -1
  740. package/src/worker/spec-contract.ts +22 -2
  741. package/dist/acp-ZWZCPS2A.js +0 -130
  742. package/dist/agents-LYSOWZUE.js +0 -150
  743. package/dist/auth-WBQGKWQ5.js +0 -551
  744. package/dist/background-BUMOBAQN.js +0 -37
  745. package/dist/builtins-ODRJOEDI.js +0 -22
  746. package/dist/chunk-2DRRZ57Q.js +0 -571
  747. package/dist/chunk-2JBZYUPY.js +0 -105
  748. package/dist/chunk-2VBWFXYE.js +0 -198
  749. package/dist/chunk-2X2R3UTH.js +0 -1018
  750. package/dist/chunk-32KJPXAM.js +0 -75
  751. package/dist/chunk-37LW32LZ.js +0 -32
  752. package/dist/chunk-3A3CUMKA.js +0 -54
  753. package/dist/chunk-3AND2EFU.js +0 -215
  754. package/dist/chunk-3RDHGNU7.js +0 -647
  755. package/dist/chunk-3SUDBGEI.js +0 -1323
  756. package/dist/chunk-3TQN67I2.js +0 -396
  757. package/dist/chunk-3U4BL2EV.js +0 -103
  758. package/dist/chunk-3UQADNG2.js +0 -302
  759. package/dist/chunk-434LRQ6Z.js +0 -13441
  760. package/dist/chunk-4ATBOFRP.js +0 -7802
  761. package/dist/chunk-4DNL43EZ.js +0 -139
  762. package/dist/chunk-4HFJKRGZ.js +0 -5250
  763. package/dist/chunk-555E2WVV.js +0 -322
  764. package/dist/chunk-5GZICIYO.js +0 -462
  765. package/dist/chunk-5PHVPU4G.js +0 -160
  766. package/dist/chunk-5RTEFNBP.js +0 -197
  767. package/dist/chunk-64XJW7NT.js +0 -380
  768. package/dist/chunk-6TKOFFGE.js +0 -1058
  769. package/dist/chunk-6UJ7RDI7.js +0 -1143
  770. package/dist/chunk-7FBCRWVT.js +0 -1801
  771. package/dist/chunk-7JSOSVLP.js +0 -283
  772. package/dist/chunk-7N3OLLSL.js +0 -637
  773. package/dist/chunk-7QQRPB2E.js +0 -915
  774. package/dist/chunk-A6DULIMH.js +0 -986
  775. package/dist/chunk-AB3QXXBC.js +0 -123
  776. package/dist/chunk-ACCECAH4.js +0 -49
  777. package/dist/chunk-AM6CEP2K.js +0 -2120
  778. package/dist/chunk-AUHVBIDW.js +0 -19
  779. package/dist/chunk-AY4XE6GN.js +0 -665
  780. package/dist/chunk-BBA2TAWV.js +0 -667
  781. package/dist/chunk-BFPHMSK7.js +0 -169
  782. package/dist/chunk-BMNVVKEW.js +0 -604
  783. package/dist/chunk-CKK25WN3.js +0 -72
  784. package/dist/chunk-CTGZCEI6.js +0 -33
  785. package/dist/chunk-DIAJYJYG.js +0 -446
  786. package/dist/chunk-DVNAPPXU.js +0 -27
  787. package/dist/chunk-DXVMLM3Z.js +0 -92
  788. package/dist/chunk-E3LEPLQ2.js +0 -68
  789. package/dist/chunk-EHZRAB4U.js +0 -63
  790. package/dist/chunk-EM2DIQAJ.js +0 -179
  791. package/dist/chunk-EM2WNQS2.js +0 -93
  792. package/dist/chunk-ETF4ROKH.js +0 -595
  793. package/dist/chunk-F2YM3JY4.js +0 -22513
  794. package/dist/chunk-FEBQWHJT.js +0 -1023
  795. package/dist/chunk-FPS4R2RN.js +0 -1975
  796. package/dist/chunk-GD55RTIW.js +0 -33
  797. package/dist/chunk-GJDRMBDI.js +0 -573
  798. package/dist/chunk-GREYLTZ5.js +0 -658
  799. package/dist/chunk-H2WSCZZT.js +0 -238
  800. package/dist/chunk-H6IUCY6Q.js +0 -117
  801. package/dist/chunk-H72DCH3E.js +0 -563
  802. package/dist/chunk-H7TXJR23.js +0 -705
  803. package/dist/chunk-HBJQQTKM.js +0 -40
  804. package/dist/chunk-HCVKSGNZ.js +0 -990
  805. package/dist/chunk-HVCAY2FH.js +0 -67
  806. package/dist/chunk-I47EJPYL.js +0 -1377
  807. package/dist/chunk-IALGWTLO.js +0 -36
  808. package/dist/chunk-IALZJE37.js +0 -1710
  809. package/dist/chunk-IC7JXLOM.js +0 -1577
  810. package/dist/chunk-IOSVTTCD.js +0 -108
  811. package/dist/chunk-IPTPMLA6.js +0 -475
  812. package/dist/chunk-IZZI3SKQ.js +0 -128
  813. package/dist/chunk-JABWPKFY.js +0 -27
  814. package/dist/chunk-JIYWMQZ5.js +0 -175
  815. package/dist/chunk-JKU34ACI.js +0 -693
  816. package/dist/chunk-JOBN2YQQ.js +0 -176
  817. package/dist/chunk-JOL2QRLE.js +0 -152
  818. package/dist/chunk-JTR3VSV3.js +0 -44
  819. package/dist/chunk-JU6MAMRJ.js +0 -362
  820. package/dist/chunk-JURMQWVJ.js +0 -15
  821. package/dist/chunk-K2BLQC5E.js +0 -262
  822. package/dist/chunk-K3XN4LZ4.js +0 -402
  823. package/dist/chunk-KIVFXGBM.js +0 -688
  824. package/dist/chunk-KKRXONXG.js +0 -43
  825. package/dist/chunk-KOAHT3N2.js +0 -395
  826. package/dist/chunk-KP5BPXR3.js +0 -73
  827. package/dist/chunk-KQ6IDQIB.js +0 -39
  828. package/dist/chunk-KRJQG47M.js +0 -1289
  829. package/dist/chunk-KW6OJ7IY.js +0 -221
  830. package/dist/chunk-L3NBWLSN.js +0 -314
  831. package/dist/chunk-L4RUTLRL.js +0 -59
  832. package/dist/chunk-LGTVWPRN.js +0 -47
  833. package/dist/chunk-LSQW6KZO.js +0 -200
  834. package/dist/chunk-LTR5QCLS.js +0 -446
  835. package/dist/chunk-LWJYOHT3.js +0 -165
  836. package/dist/chunk-M6YLF66Z.js +0 -2687
  837. package/dist/chunk-MJ4QEJVT.js +0 -185
  838. package/dist/chunk-MO65K5CH.js +0 -1148
  839. package/dist/chunk-MTOZEQHL.js +0 -637
  840. package/dist/chunk-MZDPF35R.js +0 -45
  841. package/dist/chunk-MZKYVIWW.js +0 -188
  842. package/dist/chunk-NBPA5QM6.js +0 -386
  843. package/dist/chunk-NMBEW4PP.js +0 -688
  844. package/dist/chunk-NPLLK3HO.js +0 -3610
  845. package/dist/chunk-NSYGPIVW.js +0 -39
  846. package/dist/chunk-NXTV5OI5.js +0 -1020
  847. package/dist/chunk-NYDG4QP4.js +0 -689
  848. package/dist/chunk-OA2GDACN.js +0 -146
  849. package/dist/chunk-PJI57EC6.js +0 -236
  850. package/dist/chunk-PJJBUGMR.js +0 -4484
  851. package/dist/chunk-PNJE7JPS.js +0 -50
  852. package/dist/chunk-PP23PZEV.js +0 -1347
  853. package/dist/chunk-PPIFDSBK.js +0 -409
  854. package/dist/chunk-PTFISXQO.js +0 -319
  855. package/dist/chunk-QB33Z5S7.js +0 -1865
  856. package/dist/chunk-QGNII5VC.js +0 -110
  857. package/dist/chunk-QH3ZTUOA.js +0 -113
  858. package/dist/chunk-QI72X67S.js +0 -481
  859. package/dist/chunk-QJMRYTCX.js +0 -56
  860. package/dist/chunk-QKHZZFKH.js +0 -98
  861. package/dist/chunk-RDKX2PME.js +0 -66
  862. package/dist/chunk-RL7LJYN4.js +0 -66
  863. package/dist/chunk-RPMNIFRY.js +0 -65
  864. package/dist/chunk-RQROVOV3.js +0 -670
  865. package/dist/chunk-S34A7BSP.js +0 -97
  866. package/dist/chunk-SJETVJHX.js +0 -119
  867. package/dist/chunk-SJMNU4ZS.js +0 -634
  868. package/dist/chunk-SL2RDHKO.js +0 -19
  869. package/dist/chunk-SLLG2G44.js +0 -85
  870. package/dist/chunk-SQAZN2V3.js +0 -2744
  871. package/dist/chunk-SQBT46OF.js +0 -814
  872. package/dist/chunk-SRCEQKQS.js +0 -165
  873. package/dist/chunk-TCUOGIL2.js +0 -52
  874. package/dist/chunk-TIWPKCVO.js +0 -42
  875. package/dist/chunk-U44YYLVV.js +0 -1529
  876. package/dist/chunk-UIU7MGZ3.js +0 -486
  877. package/dist/chunk-USBBEKHW.js +0 -177
  878. package/dist/chunk-VHKTOLEW.js +0 -1416
  879. package/dist/chunk-VPWGADBG.js +0 -3151
  880. package/dist/chunk-VQD7NH7Z.js +0 -356
  881. package/dist/chunk-VWFCAK34.js +0 -697
  882. package/dist/chunk-W5RM7YAH.js +0 -78
  883. package/dist/chunk-W72LLZAV.js +0 -243
  884. package/dist/chunk-WGRDABW7.js +0 -207
  885. package/dist/chunk-WWRV5RJI.js +0 -165
  886. package/dist/chunk-XCUDZQLX.js +0 -195
  887. package/dist/chunk-XFLSL7BT.js +0 -386
  888. package/dist/chunk-XJZEDCNT.js +0 -391
  889. package/dist/chunk-XLLEL3K7.js +0 -709
  890. package/dist/chunk-XNZWWDC3.js +0 -686
  891. package/dist/chunk-XRECG65F.js +0 -308
  892. package/dist/chunk-XTQ7MEJG.js +0 -457
  893. package/dist/chunk-XW2UZICE.js +0 -372
  894. package/dist/chunk-Y3M2T5RO.js +0 -891
  895. package/dist/chunk-YGDMBK7O.js +0 -567
  896. package/dist/chunk-YJCCMYYT.js +0 -125
  897. package/dist/chunk-YPQOPFP7.js +0 -797
  898. package/dist/chunk-YQYINEJI.js +0 -132
  899. package/dist/chunk-ZF6CV4WZ.js +0 -5614
  900. package/dist/chunk-ZKJU55MX.js +0 -326
  901. package/dist/chunk-ZKQ63XZ5.js +0 -1196
  902. package/dist/chunk-ZKVMDNAN.js +0 -962
  903. package/dist/chunk-ZST3FRCV.js +0 -132
  904. package/dist/clio-JUDCLNHC.js +0 -26
  905. package/dist/clio-context-tools-FT672MNZ.js +0 -136
  906. package/dist/code-nav-7OVCTP2Z.js +0 -688
  907. package/dist/compile-cache-WJEPUZEJ.js +0 -16
  908. package/dist/components-OZXZMDWU.js +0 -674
  909. package/dist/config-P3ZQVF63.js +0 -275
  910. package/dist/config-graph-GKAOBAS5.js +0 -160
  911. package/dist/configure-25LRYZJG.js +0 -86
  912. package/dist/context-72VQV7JX.js +0 -73
  913. package/dist/context-COWRWXP3.js +0 -286
  914. package/dist/context-WB3D474G.js +0 -344
  915. package/dist/context-clear-Y4LYMWC6.js +0 -192
  916. package/dist/context-index-W6A4V7OC.js +0 -120
  917. package/dist/context-map-DKL3QT6D.js +0 -555
  918. package/dist/context-working-set-TMZYVC7A.js +0 -1560
  919. package/dist/data-tool-KMBWKKWR.js +0 -2987
  920. package/dist/detail-4GLROGY5.js +0 -123
  921. package/dist/dispatch-runner-TR3LBP5P.js +0 -2446
  922. package/dist/docs-ZK777W2G.js +0 -101
  923. package/dist/doctor-WC4OV2OB.js +0 -814
  924. package/dist/eval-FUNWJNUJ.js +0 -5050
  925. package/dist/eval-inventory-CX24K2JT.js +0 -260
  926. package/dist/evals-L73EBHSU.js +0 -104
  927. package/dist/evidence-AVJ2RTHX.js +0 -392
  928. package/dist/evidence-P4NZOAK7.js +0 -233
  929. package/dist/evidence-Y55WKYHH.js +0 -246
  930. package/dist/evolve-MAWKRYWF.js +0 -617
  931. package/dist/extensions-PYQH3H47.js +0 -308
  932. package/dist/fleet-M4H2QBWT.js +0 -268
  933. package/dist/fleet-ULBXXRDR.js +0 -923
  934. package/dist/fleet-commands-7NNC4JZU.js +0 -76
  935. package/dist/fleet-decisions-EHEY7KPU.js +0 -52
  936. package/dist/fleet-graph-LQ2AHZT3.js +0 -136
  937. package/dist/fleet-inspect-5IGBIIYZ.js +0 -312
  938. package/dist/fleet-new-RCKGSRDV.js +0 -48
  939. package/dist/fleet-preflight-UTTNOKMG.js +0 -27
  940. package/dist/fleet-validate-YGILJKA6.js +0 -91
  941. package/dist/fleet-verify-AUWTCDKR.js +0 -210
  942. package/dist/fleet-view-TGUFCY5A.js +0 -127
  943. package/dist/init-GFN2Z7NF.js +0 -333
  944. package/dist/install-3RZDDP23.js +0 -13
  945. package/dist/install-6PIF6F6W.js +0 -19
  946. package/dist/interop-EF5JUWWK.js +0 -246
  947. package/dist/inventory-I6VJDDYF.js +0 -127
  948. package/dist/library-3J5IO2OJ.js +0 -75
  949. package/dist/library-IJTOFTDS.js +0 -307
  950. package/dist/library-Z3KZSHPE.js +0 -492
  951. package/dist/library-import-IMKFLDHX.js +0 -183
  952. package/dist/library-inventory-CQP5D6GU.js +0 -56
  953. package/dist/library-validation-33UTX7AI.js +0 -42
  954. package/dist/mcp-5FWZKUS6.js +0 -26
  955. package/dist/memory-36CWN67Y.js +0 -520
  956. package/dist/models-KQ6PQJJQ.js +0 -302
  957. package/dist/monitor-XX6ZD6KC.js +0 -785
  958. package/dist/orchestrator-SK6HDAOP.js +0 -42067
  959. package/dist/panes-L27QRXUH.js +0 -74
  960. package/dist/panes-LXZIWNOZ.js +0 -103
  961. package/dist/paths-7DJDU4P4.js +0 -67
  962. package/dist/preload-K2TDYI4Y.js +0 -124
  963. package/dist/registry-DESGAXWK.js +0 -11
  964. package/dist/reset-73VU3XNT.js +0 -345
  965. package/dist/resources-3BYJYVYL.js +0 -181
  966. package/dist/run-AR7PY6GW.js +0 -896
  967. package/dist/run-script-H2KUDIII.js +0 -41
  968. package/dist/settings-3VMBMWID.js +0 -72
  969. package/dist/share-HVWH4FPF.js +0 -293
  970. package/dist/skills-5TYEY75Q.js +0 -100
  971. package/dist/skills-eval-CK3MD63Z.js +0 -1083
  972. package/dist/skills-inventory-KSFYG3I6.js +0 -138
  973. package/dist/slash-commands-DMVHML7P.js +0 -98
  974. package/dist/steer-XCD6V3EW.js +0 -77
  975. package/dist/support-JAZL6VBR.js +0 -38
  976. package/dist/system-3TDQRMZZ.js +0 -116
  977. package/dist/targets-EZKHAYRN.js +0 -1117
  978. package/dist/tasks-SNEFHWYW.js +0 -36
  979. package/dist/terminal-lease-BNLFA4OF.js +0 -419
  980. package/dist/tools-7IM6BDCE.js +0 -28
  981. package/dist/trace-C3MBGD4S.js +0 -524
  982. package/dist/tree-sitter-AQUUOSYM.js +0 -4673
  983. package/dist/tui-primitives-36BY2774.js +0 -18
  984. package/dist/uninstall-WWLOSZ42.js +0 -432
  985. package/dist/upgrade-ETK2JNSJ.js +0 -297
  986. package/dist/usage-S2HOB7BZ.js +0 -1065
  987. package/dist/verifiers-QDTEVH7R.js +0 -632
  988. package/dist/verify-SUKUK6XM.js +0 -31
  989. package/dist/version-RFPKO6T7.js +0 -21
  990. package/dist/web/client/assets/abnfDiagram-VCTEODGH-BznNOe_I.js +0 -1
  991. package/dist/web/client/assets/architecture-7GRP2DOG-BQO9DL_y.js +0 -1
  992. package/dist/web/client/assets/architectureDiagram-5GKGNRK7-CKPbdvyx.js +0 -36
  993. package/dist/web/client/assets/blockDiagram-I7D4REHJ-prINbpbM.js +0 -129
  994. package/dist/web/client/assets/c4Diagram-7LVT6UL2-DkVRKtyU.js +0 -38
  995. package/dist/web/client/assets/channel-c4EeUUqA.js +0 -1
  996. package/dist/web/client/assets/chunk-4HAMMTFA-CV0Z1ApC.js +0 -62
  997. package/dist/web/client/assets/chunk-75Z2AOVW-D34Nohxq.js +0 -2
  998. package/dist/web/client/assets/chunk-DU6HZSFF-Das_cS-O.js +0 -125
  999. package/dist/web/client/assets/chunk-F27PBJKO-CmRojxkG.js +0 -1
  1000. package/dist/web/client/assets/chunk-GMAD6QVW-ClYZmc73.js +0 -72
  1001. package/dist/web/client/assets/chunk-GVQU2GXP-B2BiHFt-.js +0 -1
  1002. package/dist/web/client/assets/chunk-IMKFNOWR-BGApZ8nP.js +0 -231
  1003. package/dist/web/client/assets/chunk-L3NEJ4N5-DIzCgpkY.js +0 -1
  1004. package/dist/web/client/assets/chunk-OSK3NFVY-BPT-yePv.js +0 -10
  1005. package/dist/web/client/assets/chunk-P2QGCYS3-BC1WTc2t.js +0 -1
  1006. package/dist/web/client/assets/chunk-POPQ4Y6H-BSjzBmZU.js +0 -1
  1007. package/dist/web/client/assets/chunk-PWAF6VOD-BIjLs86Z.js +0 -1
  1008. package/dist/web/client/assets/chunk-SHT3W25Y-CduDz2cm.js +0 -168
  1009. package/dist/web/client/assets/chunk-SVP7TREG-XUn4pPAP.js +0 -88
  1010. package/dist/web/client/assets/chunk-TICWLB2K-DcBy2DKy.js +0 -206
  1011. package/dist/web/client/assets/classDiagram-ZZMXUADV-C0HR7YKN.js +0 -1
  1012. package/dist/web/client/assets/classDiagram-v2-VYDZK3BY-C0HR7YKN.js +0 -1
  1013. package/dist/web/client/assets/cynefin-OW5HDTMX-BecPbyM6.js +0 -1
  1014. package/dist/web/client/assets/cynefinDiagram-5FMLGOSQ-BzMzFwyT.js +0 -62
  1015. package/dist/web/client/assets/dagre-GXQ25YYZ-CAWJmRMG.js +0 -4
  1016. package/dist/web/client/assets/diagram-S7CK7UJ4--lp0ALmn.js +0 -30
  1017. package/dist/web/client/assets/diagram-UQ7AKVKN-gKUnsjcj.js +0 -41
  1018. package/dist/web/client/assets/diagram-VSXAHHWV-BoN5D1Gh.js +0 -3
  1019. package/dist/web/client/assets/diagram-VX7I27RA-BMtuswQ6.js +0 -24
  1020. package/dist/web/client/assets/diagram-Z3DM3KII-DtU8LXrA.js +0 -24
  1021. package/dist/web/client/assets/ebnfDiagram-PWID7BFC-DDcnv9BH.js +0 -1
  1022. package/dist/web/client/assets/erDiagram-RLTQ6QDP-DvRb4iDL.js +0 -99
  1023. package/dist/web/client/assets/eventmodeling-NTZA5JFV-01h4SbTc.js +0 -1
  1024. package/dist/web/client/assets/flowDiagram-HODETNUW-Bll_YZ6T.js +0 -1
  1025. package/dist/web/client/assets/framework-YGoR34M4.js +0 -9
  1026. package/dist/web/client/assets/ganttDiagram-EL5Y4UJY-DdFZ9hvH.js +0 -292
  1027. package/dist/web/client/assets/gitGraph-4MIJSDKK-DjD_AAMj.js +0 -1
  1028. package/dist/web/client/assets/gitGraphDiagram-WWUBYQGX-CDyN9n2u.js +0 -106
  1029. package/dist/web/client/assets/index-CVcy0FAn.js +0 -75
  1030. package/dist/web/client/assets/index-Dsi52apB.css +0 -1
  1031. package/dist/web/client/assets/info-A6RAGUB7-C_XK8Hq0.js +0 -1
  1032. package/dist/web/client/assets/infoDiagram-27XIBGKW-DIe4tJ1i.js +0 -2
  1033. package/dist/web/client/assets/ishikawaDiagram-5VMMS53U-CVl5unKI.js +0 -70
  1034. package/dist/web/client/assets/journeyDiagram-3NMN7TZE-CPEB1Vt8.js +0 -139
  1035. package/dist/web/client/assets/kanban-definition-UXKFOSKX-j-9WXjYQ.js +0 -89
  1036. package/dist/web/client/assets/line-BIDAcEtX.js +0 -1
  1037. package/dist/web/client/assets/mermaid-parser.core-Ux4vssh0.js +0 -7
  1038. package/dist/web/client/assets/mermaid.core-CDuwVKeh.js +0 -44
  1039. package/dist/web/client/assets/mindmap-definition-YA3MSWOX-5MlQEeQ6.js +0 -96
  1040. package/dist/web/client/assets/packet-AYTQ26CC-DRO66c9Q.js +0 -1
  1041. package/dist/web/client/assets/pegDiagram-XKGWAZYB-BakZnSjM.js +0 -1
  1042. package/dist/web/client/assets/pie-WAS4IAKB-BEzcmhz8.js +0 -1
  1043. package/dist/web/client/assets/pieDiagram-E7YTZNPT-DpmqgoPt.js +0 -39
  1044. package/dist/web/client/assets/quadrantDiagram-AXDQQJYC-DuMPwwV2.js +0 -7
  1045. package/dist/web/client/assets/radar-RG4KPBEZ-Djm3oXl5.js +0 -1
  1046. package/dist/web/client/assets/railroad-74A4TZTK-Cpvkwsao.js +0 -1
  1047. package/dist/web/client/assets/railroad-abnf-HS5TGJTU-CpRQ3ruG.js +0 -1
  1048. package/dist/web/client/assets/railroad-ebnf-LZEXJU2U-1Rm5a5eJ.js +0 -1
  1049. package/dist/web/client/assets/railroad-peg-WCYAUIDC-C8344cTh.js +0 -1
  1050. package/dist/web/client/assets/railroadDiagram-O6MQD6OU-CgMS4B6R.js +0 -1
  1051. package/dist/web/client/assets/requirementDiagram-BXWQKSXE-CX5eoNdN.js +0 -84
  1052. package/dist/web/client/assets/sankeyDiagram-P5KCCOFB-CODBX2N3.js +0 -40
  1053. package/dist/web/client/assets/sequenceDiagram-WJ2MYXX4-eUhhF8OR.js +0 -162
  1054. package/dist/web/client/assets/stateDiagram-D77RDMKH-vR6l0NC2.js +0 -1
  1055. package/dist/web/client/assets/stateDiagram-v2-MP3YSRHH-BYUm8jLY.js +0 -1
  1056. package/dist/web/client/assets/swimlanes-42K2YHIH-v9Tw_zX7.js +0 -1
  1057. package/dist/web/client/assets/swimlanesDiagram-VR7AAH4N-B2jdCvhD.js +0 -8
  1058. package/dist/web/client/assets/timeline-definition-24CTP7MA-DxianbhU.js +0 -120
  1059. package/dist/web/client/assets/treeView-Q6P3EWNA-DLxnZb9R.js +0 -1
  1060. package/dist/web/client/assets/treemap-WGGIJYW6-I7UnZ6xJ.js +0 -1
  1061. package/dist/web/client/assets/vennDiagram-4TSXK5OY-Ar7M8Mrj.js +0 -34
  1062. package/dist/web/client/assets/wardley-WFR3VGLG-B8ZSHeDu.js +0 -1
  1063. package/dist/web/client/assets/wardleyDiagram-VM6X3IG4-Qks2FmIn.js +0 -78
  1064. package/dist/web/client/assets/xychartDiagram-S5SC5T6Z-BBBjRtiE.js +0 -7
  1065. package/dist/web/client/index.html +0 -6
  1066. package/dist/web/ops-worker.js +0 -37
  1067. package/dist/web/reads-worker.js +0 -1726
  1068. package/dist/web/server.js +0 -8499
  1069. package/dist/web-EMGUGGEI.js +0 -13
  1070. package/dist/web-fetch-6BRRVQON.js +0 -805
  1071. package/dist/wiki-generate-XHSJTDOP.js +0 -627
  1072. package/dist/with-panes-Z6BTEHMZ.js +0 -628
  1073. package/evals/README.md +0 -9
  1074. package/evals/behavioral-corpus-grader.mjs +0 -236
  1075. package/evals/behavioral-machinery-baseline.json +0 -2276
  1076. package/evals/behavioral-machinery-driver.ts +0 -250
  1077. package/evals/behavioral-machinery-support.ts +0 -254
  1078. package/evals/behavioral-machinery.yaml +0 -614
  1079. package/evals/behavioral-model-negative-control.yaml +0 -69
  1080. package/evals/behavioral-model.yaml +0 -482
  1081. package/evals/fixtures/behavioral-facts.txt +0 -3
  1082. package/evals/fixtures/behavioral-main.ts +0 -7
  1083. package/evals/fixtures/decoy/note.txt +0 -2
  1084. package/evals/fixtures/docs-retrieval.json +0 -102
  1085. package/evals/fixtures/private/credentials.txt +0 -1
  1086. package/evals/fixtures/scalar-decision.json +0 -17
  1087. package/evals/fixtures/scout-citation-pipeline.json +0 -55
  1088. package/evals/fixtures/source-explanation.json +0 -74
  1089. package/evals/fixtures/tool-arguments.json +0 -18
  1090. package/evals/fixtures/tool-surface/read.txt +0 -4
  1091. package/evals/fixtures/tool-surface/subdir/keep.txt +0 -1
  1092. package/evals/no-edit-memory-grader.mjs +0 -149
  1093. package/evals/scalar-decision-grader.py +0 -41
  1094. package/evals/scalar-decision-machinery.ts +0 -145
  1095. package/evals/source-explanation-grader.mjs +0 -118
  1096. package/evals/tool-surface-grader.mjs +0 -53
  1097. package/evals/tool-surface-model.yaml +0 -274
  1098. package/evals/tracked-metrics-baseline.yaml +0 -229
  1099. package/evals/tracked-metrics-grader.mjs +0 -129
  1100. package/src/cli/web.ts +0 -79
  1101. package/src/domains/providers/runtimes/local-native/ollama-native.ts +0 -122
  1102. /package/dist/assets/{web-notices → gui-notices}/@hono__node-server-LICENSE +0 -0
  1103. /package/dist/assets/{web-notices → gui-notices}/hono-LICENSE +0 -0
  1104. /package/dist/{web → gui}/client/THIRD_PARTY_LICENSES.md +0 -0
  1105. /package/dist/{web → gui}/client/assets/arc-Pry-7G1_.js +0 -0
  1106. /package/dist/{web → gui}/client/assets/array-BifhSqXX.js +0 -0
  1107. /package/dist/{web → gui}/client/assets/atkinson-hyperlegible-next-latin-ext-wght-normal-C6vrW8VD.woff2 +0 -0
  1108. /package/dist/{web → gui}/client/assets/atkinson-hyperlegible-next-latin-wght-normal-BcXVPD7q.woff2 +0 -0
  1109. /package/dist/{web → gui}/client/assets/chunk-2Q5K7J3B-C1jixKkw.js +0 -0
  1110. /package/dist/{web → gui}/client/assets/chunk-5VM5RSS4-ZNzvKenW.js +0 -0
  1111. /package/dist/{web → gui}/client/assets/chunk-FOHPRMQF-CoA4358r.js +0 -0
  1112. /package/dist/{web → gui}/client/assets/chunk-JWPE2WC7-DVXcaiue.js +0 -0
  1113. /package/dist/{web → gui}/client/assets/chunk-XXDRQBXY-DqAYeljN.js +0 -0
  1114. /package/dist/{web → gui}/client/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +0 -0
  1115. /package/dist/{web → gui}/client/assets/commit-mono-latin-400-normal-s0S3qwFW.woff +0 -0
  1116. /package/dist/{web → gui}/client/assets/commit-mono-latin-400-normal-wzhe4RuD.woff2 +0 -0
  1117. /package/dist/{web → gui}/client/assets/cose-bilkent-JH36ORCC-CVh1icwb.js +0 -0
  1118. /package/dist/{web → gui}/client/assets/cytoscape.esm-c2aL46s-.js +0 -0
  1119. /package/dist/{web → gui}/client/assets/dagre-C-rnJpZF.js +0 -0
  1120. /package/dist/{web → gui}/client/assets/defaultLocale-BFoDCU3G.js +0 -0
  1121. /package/dist/{web → gui}/client/assets/dist-v5Q1xZ2K.js +0 -0
  1122. /package/dist/{web → gui}/client/assets/graphlib-DS17s2tU.js +0 -0
  1123. /package/dist/{web → gui}/client/assets/init-C-OQMol4.js +0 -0
  1124. /package/dist/{web → gui}/client/assets/katex-ZlcWpGUi.js +0 -0
  1125. /package/dist/{web → gui}/client/assets/linear-SzVmGSw4.js +0 -0
  1126. /package/dist/{web → gui}/client/assets/newsreader-latin-ext-wght-normal-C-3rgBeH.woff2 +0 -0
  1127. /package/dist/{web → gui}/client/assets/newsreader-latin-wght-normal-CCVVNp6i.woff2 +0 -0
  1128. /package/dist/{web → gui}/client/assets/newsreader-vietnamese-wght-normal-Czsa-EzN.woff2 +0 -0
  1129. /package/dist/{web → gui}/client/assets/ordinal-BDEzSJ7C.js +0 -0
  1130. /package/dist/{web → gui}/client/assets/path-fybaL0A-.js +0 -0
  1131. /package/dist/{web → gui}/client/assets/prism-bash-D6zCJ74D.js +0 -0
  1132. /package/dist/{web → gui}/client/assets/prism-c-04YixN25.js +0 -0
  1133. /package/dist/{web → gui}/client/assets/prism-clike-DapgWyxx.js +0 -0
  1134. /package/dist/{web → gui}/client/assets/prism-core-BtsZdCS6.js +0 -0
  1135. /package/dist/{web → gui}/client/assets/prism-cpp-C-lJbC-6.js +0 -0
  1136. /package/dist/{web → gui}/client/assets/prism-css-CPgOzxXp.js +0 -0
  1137. /package/dist/{web → gui}/client/assets/prism-diff-BF8m0_mq.js +0 -0
  1138. /package/dist/{web → gui}/client/assets/prism-docker-DkT6yOFj.js +0 -0
  1139. /package/dist/{web → gui}/client/assets/prism-fortran-Be5x3y1V.js +0 -0
  1140. /package/dist/{web → gui}/client/assets/prism-go-C_8qAH5n.js +0 -0
  1141. /package/dist/{web → gui}/client/assets/prism-ini-BESK3y0r.js +0 -0
  1142. /package/dist/{web → gui}/client/assets/prism-javascript-BnO-swvr.js +0 -0
  1143. /package/dist/{web → gui}/client/assets/prism-json-Dp_-W-Hv.js +0 -0
  1144. /package/dist/{web → gui}/client/assets/prism-jsx-D-D0NWtC.js +0 -0
  1145. /package/dist/{web → gui}/client/assets/prism-julia-DIjOgiAV.js +0 -0
  1146. /package/dist/{web → gui}/client/assets/prism-latex-DNMbqcH_.js +0 -0
  1147. /package/dist/{web → gui}/client/assets/prism-makefile-CRKWLQ8l.js +0 -0
  1148. /package/dist/{web → gui}/client/assets/prism-markdown-C0FPJ1Iz.js +0 -0
  1149. /package/dist/{web → gui}/client/assets/prism-markup-Cp04rIa1.js +0 -0
  1150. /package/dist/{web → gui}/client/assets/prism-matlab-D-nk08al.js +0 -0
  1151. /package/dist/{web → gui}/client/assets/prism-python-CfiSVtM6.js +0 -0
  1152. /package/dist/{web → gui}/client/assets/prism-r-QmNGR8LX.js +0 -0
  1153. /package/dist/{web → gui}/client/assets/prism-rust-Bu9N8X3N.js +0 -0
  1154. /package/dist/{web → gui}/client/assets/prism-shell-session-Be4UuYoM.js +0 -0
  1155. /package/dist/{web → gui}/client/assets/prism-sql-CYhVDMEE.js +0 -0
  1156. /package/dist/{web → gui}/client/assets/prism-toml-DKb54GAT.js +0 -0
  1157. /package/dist/{web → gui}/client/assets/prism-tsx-p6J2Kc_4.js +0 -0
  1158. /package/dist/{web → gui}/client/assets/prism-typescript-BMqONzxf.js +0 -0
  1159. /package/dist/{web → gui}/client/assets/prism-yaml-C0JHu8gr.js +0 -0
  1160. /package/dist/{web → gui}/client/assets/purify.es-ChwZkWde.js +0 -0
  1161. /package/dist/{web → gui}/client/assets/rolldown-runtime-hePW80VL.js +0 -0
  1162. /package/dist/{web → gui}/client/assets/rough.esm-Dy-Kn_BL.js +0 -0
  1163. /package/dist/{web → gui}/client/assets/sizeCapture-INFHLROL-B0uUizjq.js +0 -0
  1164. /package/dist/{web → gui}/client/assets/src-B6xuSHsQ.js +0 -0
  1165. /package/dist/{web → gui}/client/clio-coder-logo.webp +0 -0
  1166. /package/dist/{web → gui}/client/icon-192.png +0 -0
  1167. /package/dist/{web → gui}/client/icon-512.png +0 -0
  1168. /package/dist/{web → gui}/client/manifest.webmanifest +0 -0
  1169. /package/dist/{web → gui}/client/offline.css +0 -0
  1170. /package/dist/{web → gui}/client/offline.html +0 -0
  1171. /package/dist/{web → gui}/client/offline.js +0 -0
  1172. /package/dist/{web → gui}/client/sw.js +0 -0
@@ -0,0 +1,2986 @@
1
+ import { createRequire as __clioCreateRequire } from "node:module"; const require = __clioCreateRequire(import.meta.url);
2
+ import {
3
+ DATA_FORMATS,
4
+ DATA_OBSERVATION_SELF_CAP_BYTES,
5
+ DATA_OPS,
6
+ DATA_TOOL_NAME,
7
+ DataRefusalError,
8
+ MAX_NUMBER_LITERAL_CHARS,
9
+ capText,
10
+ classifyCell,
11
+ cutView,
12
+ dataToolSurface,
13
+ emptyCellHistogram,
14
+ exactView,
15
+ headerArg,
16
+ histogramRecord,
17
+ inferColumnType,
18
+ isDataFormat,
19
+ isDataRefusal,
20
+ numberLiteralPrecision,
21
+ prepareDataAdmissionArguments,
22
+ prepareDataArguments,
23
+ refusal,
24
+ refusalFromError,
25
+ resolveMaxRows,
26
+ sampledNotice,
27
+ sampledView,
28
+ statDataFile,
29
+ streamTextChunks,
30
+ throwIfAborted
31
+ } from "./chunk-FFYTC2KQ.js";
32
+ import {
33
+ commitObservationReservation,
34
+ finalizeObservation,
35
+ observationBudgetExhausted,
36
+ releaseObservation,
37
+ reserveObservation
38
+ } from "./chunk-OPD7GL6F.js";
39
+ import "./chunk-733ZBT5P.js";
40
+ import "./chunk-GHXGMFQ5.js";
41
+ import "./chunk-KECNXMDE.js";
42
+ import "./chunk-WXA2CFJO.js";
43
+ import "./chunk-6CTHLZFB.js";
44
+ import "./chunk-2KUBKL63.js";
45
+ import "./chunk-MYI32N4R.js";
46
+ import "./chunk-X6FLVUM5.js";
47
+ import "./chunk-L7G7K4I2.js";
48
+ import "./chunk-ALJWT6O6.js";
49
+ import "./chunk-O3VV6IVK.js";
50
+ import "./chunk-5EQO5NWP.js";
51
+ import "./chunk-VYRQHORQ.js";
52
+ import "./chunk-P4GNZPXO.js";
53
+ import "./chunk-R2P2U3ZS.js";
54
+ import "./chunk-NTTS3O53.js";
55
+ import {
56
+ resolveToCwd
57
+ } from "./chunk-C2CPOIH2.js";
58
+ import "./chunk-MGLRTOCK.js";
59
+ import "./chunk-M4KFUXS7.js";
60
+ import "./chunk-V4XJWDHR.js";
61
+ import "./chunk-C27U2TYG.js";
62
+ import "./chunk-B5GGDIHT.js";
63
+ import "./chunk-M2IPMWCN.js";
64
+ import "./chunk-XS2QPZJE.js";
65
+ import "./chunk-6EXUUOSN.js";
66
+ import "./chunk-ZTNFYMIO.js";
67
+ import "./chunk-DVJL77SO.js";
68
+ import "./chunk-GH5ZR6JP.js";
69
+ import "./chunk-TK2BMCBZ.js";
70
+ import "./chunk-CTTI7G3T.js";
71
+ import "./chunk-ZZFWWYLX.js";
72
+ import "./chunk-ZPST2KQO.js";
73
+ import "./chunk-FD2I4KBR.js";
74
+ import {
75
+ init_esm_shims
76
+ } from "./chunk-ECBHH7LU.js";
77
+
78
+ // src/tools/gateway/data-tool.ts
79
+ init_esm_shims();
80
+ import path from "node:path";
81
+
82
+ // src/tools/data/index.ts
83
+ init_esm_shims();
84
+ import { open } from "node:fs/promises";
85
+ import { extname } from "node:path";
86
+
87
+ // src/tools/data/csv.ts
88
+ init_esm_shims();
89
+ var CHAR_QUOTE = 34;
90
+ var CHAR_LF = 10;
91
+ var CHAR_CR = 13;
92
+ var CSV_MAX_FIELD_CHARS = 1048576;
93
+ var CSV_MAX_RECORD_CHARS = 16 * 1048576;
94
+ var CsvParser = class {
95
+ constructor(delimiter, callbacks) {
96
+ this.delimiter = delimiter;
97
+ this.callbacks = callbacks;
98
+ }
99
+ delimiter;
100
+ callbacks;
101
+ state = 0 /* FieldStart */;
102
+ fields = [];
103
+ current = "";
104
+ recordChars = 0;
105
+ hasContent = false;
106
+ skipLf = false;
107
+ line = 1;
108
+ recordLine = 1;
109
+ records = 0;
110
+ stopped = false;
111
+ issueThisRecord = null;
112
+ blankLines = 0;
113
+ crlf = 0;
114
+ lf = 0;
115
+ cr = 0;
116
+ get isStopped() {
117
+ return this.stopped;
118
+ }
119
+ get recordCount() {
120
+ return this.records;
121
+ }
122
+ /** Feed one chunk. Returns false once the record sink asked to stop. */
123
+ push(text) {
124
+ if (this.stopped) return false;
125
+ const length = text.length;
126
+ let runStart = this.state === 1 /* Unquoted */ || this.state === 2 /* Quoted */ ? 0 : -1;
127
+ for (let index = 0; index < length; index += 1) {
128
+ const code = text.charCodeAt(index);
129
+ if (this.skipLf) {
130
+ this.skipLf = false;
131
+ if (code === CHAR_LF) {
132
+ this.crlf += 1;
133
+ this.cr -= 1;
134
+ continue;
135
+ }
136
+ }
137
+ switch (this.state) {
138
+ case 0 /* FieldStart */:
139
+ if (code === CHAR_QUOTE) {
140
+ this.state = 2 /* Quoted */;
141
+ this.hasContent = true;
142
+ runStart = index + 1;
143
+ } else if (code === this.delimiter) {
144
+ this.hasContent = true;
145
+ this.pushField("");
146
+ } else if (code === CHAR_LF || code === CHAR_CR) {
147
+ if (this.hasContent) this.pushField("");
148
+ this.newline(code);
149
+ this.endRecord();
150
+ } else {
151
+ this.state = 1 /* Unquoted */;
152
+ this.hasContent = true;
153
+ runStart = index;
154
+ }
155
+ break;
156
+ case 1 /* Unquoted */:
157
+ if (code === this.delimiter) {
158
+ const fits = this.appendRun(text, runStart, index);
159
+ runStart = -1;
160
+ if (!fits) break;
161
+ this.pushField(this.current);
162
+ this.current = "";
163
+ if (this.state === 1 /* Unquoted */) this.state = 0 /* FieldStart */;
164
+ } else if (code === CHAR_LF || code === CHAR_CR) {
165
+ const fits = this.appendRun(text, runStart, index);
166
+ runStart = -1;
167
+ if (!fits) {
168
+ this.closeOverflow(code);
169
+ break;
170
+ }
171
+ this.pushField(this.current);
172
+ this.current = "";
173
+ this.state = 0 /* FieldStart */;
174
+ this.newline(code);
175
+ this.endRecord();
176
+ } else if (code === CHAR_QUOTE) {
177
+ this.issue("bare-quote", "a quote inside an unquoted field was read as literal text");
178
+ }
179
+ break;
180
+ case 2 /* Quoted */:
181
+ if (code === CHAR_QUOTE) {
182
+ const fits = this.appendRun(text, runStart, index);
183
+ runStart = -1;
184
+ if (fits) this.state = 3 /* QuoteInQuoted */;
185
+ } else if (code === CHAR_LF || code === CHAR_CR) {
186
+ const pending = index - runStart;
187
+ if (this.current.length + pending > CSV_MAX_FIELD_CHARS || this.recordChars + pending > CSV_MAX_RECORD_CHARS) {
188
+ this.appendRun(text, runStart, index);
189
+ runStart = -1;
190
+ this.closeOverflow(code);
191
+ } else if (code === CHAR_LF) {
192
+ this.line += 1;
193
+ this.lf += 1;
194
+ } else {
195
+ this.line += 1;
196
+ this.cr += 1;
197
+ this.skipLf = true;
198
+ }
199
+ }
200
+ break;
201
+ case 3 /* QuoteInQuoted */:
202
+ if (code === CHAR_QUOTE) {
203
+ if (this.appendRun('"', 0, 1)) {
204
+ this.state = 2 /* Quoted */;
205
+ runStart = index + 1;
206
+ }
207
+ } else if (code === this.delimiter) {
208
+ this.pushField(this.current);
209
+ this.current = "";
210
+ if (this.state === 3 /* QuoteInQuoted */) this.state = 0 /* FieldStart */;
211
+ } else if (code === CHAR_LF || code === CHAR_CR) {
212
+ this.pushField(this.current);
213
+ this.current = "";
214
+ this.state = 0 /* FieldStart */;
215
+ this.newline(code);
216
+ this.endRecord();
217
+ } else {
218
+ this.issue("text-after-quote", "text after a closing quote was joined to the field");
219
+ this.state = 1 /* Unquoted */;
220
+ runStart = index;
221
+ }
222
+ break;
223
+ case 4 /* Overflow */:
224
+ if (code === CHAR_LF || code === CHAR_CR) this.closeOverflow(code);
225
+ break;
226
+ }
227
+ if (this.stopped) return false;
228
+ }
229
+ if (runStart >= 0 && (this.state === 1 /* Unquoted */ || this.state === 2 /* Quoted */)) {
230
+ this.appendRun(text, runStart, length);
231
+ }
232
+ return true;
233
+ }
234
+ end() {
235
+ if (this.stopped) return;
236
+ switch (this.state) {
237
+ case 2 /* Quoted */:
238
+ this.issue("unterminated-quote", "the file ended inside a quoted field");
239
+ this.fields.push(this.current);
240
+ this.endRecord();
241
+ break;
242
+ case 3 /* QuoteInQuoted */:
243
+ case 1 /* Unquoted */:
244
+ case 4 /* Overflow */:
245
+ this.fields.push(this.current);
246
+ this.endRecord();
247
+ break;
248
+ default:
249
+ if (this.hasContent) {
250
+ this.fields.push("");
251
+ this.endRecord();
252
+ }
253
+ break;
254
+ }
255
+ this.current = "";
256
+ this.state = 0 /* FieldStart */;
257
+ }
258
+ /**
259
+ * Append text[from, to) to the current field within the caps. Returns false
260
+ * when a cap was hit: the field keeps what fit and the parser is in the
261
+ * Overflow state, dropping input until the record's next line break.
262
+ */
263
+ appendRun(text, from, to) {
264
+ if (to <= from) return true;
265
+ const run = to - from;
266
+ const fieldRoom = CSV_MAX_FIELD_CHARS - this.current.length;
267
+ const recordRoom = CSV_MAX_RECORD_CHARS - this.recordChars;
268
+ const room = Math.min(fieldRoom, recordRoom);
269
+ if (run <= room) {
270
+ this.current += text.slice(from, to);
271
+ this.recordChars += run;
272
+ return true;
273
+ }
274
+ if (room > 0) {
275
+ this.current += text.slice(from, from + room);
276
+ this.recordChars += room;
277
+ }
278
+ this.overflow(fieldRoom <= recordRoom ? "field-too-large" : "record-too-large");
279
+ return false;
280
+ }
281
+ /** Complete a field; each field also costs one character of the record cap. */
282
+ pushField(value) {
283
+ this.fields.push(value);
284
+ this.recordChars += 1;
285
+ if (this.recordChars > CSV_MAX_RECORD_CHARS) this.overflow("record-too-large");
286
+ }
287
+ overflow(kind) {
288
+ const message = kind === "field-too-large" ? `a field exceeded ${CSV_MAX_FIELD_CHARS} characters${this.state === 2 /* Quoted */ ? " inside quotes, likely an unterminated quote" : ""}; it was cut at the cap and the record was closed at the next line break` : `a record exceeded ${CSV_MAX_RECORD_CHARS} characters; it was cut at the cap and closed at the next line break`;
289
+ this.issue(kind, message);
290
+ this.state = 4 /* Overflow */;
291
+ }
292
+ closeOverflow(code) {
293
+ this.fields.push(this.current);
294
+ this.current = "";
295
+ this.state = 0 /* FieldStart */;
296
+ this.newline(code);
297
+ this.endRecord();
298
+ }
299
+ newline(code) {
300
+ this.line += 1;
301
+ if (code === CHAR_CR) {
302
+ this.cr += 1;
303
+ this.skipLf = true;
304
+ } else {
305
+ this.lf += 1;
306
+ }
307
+ }
308
+ endRecord() {
309
+ const startLine = this.recordLine;
310
+ this.recordLine = this.line;
311
+ this.recordChars = 0;
312
+ if (!this.hasContent && this.fields.length === 0) {
313
+ this.blankLines += 1;
314
+ return;
315
+ }
316
+ this.records += 1;
317
+ const fields = this.fields;
318
+ this.fields = [];
319
+ this.hasContent = false;
320
+ this.issueThisRecord = null;
321
+ if (!this.callbacks.onRecord(fields, this.records, startLine)) this.stopped = true;
322
+ }
323
+ issue(kind, message) {
324
+ if (this.issueThisRecord === kind) return;
325
+ this.issueThisRecord = kind;
326
+ this.callbacks.onIssue({ kind, record: this.records + 1, line: this.recordLine, message });
327
+ }
328
+ };
329
+ var CSV_DELIMITER_CANDIDATES = [",", " ", ";", "|"];
330
+ var DELIMITER_SAMPLE_CHARS = 64 * 1024;
331
+ var DELIMITER_SAMPLE_RECORDS = 200;
332
+ function detectCsvDelimiter(sample, sampleComplete) {
333
+ let best = { delimiter: ",", confidence: 0, fieldCount: 1 };
334
+ for (const candidate of CSV_DELIMITER_CANDIDATES) {
335
+ const counts = [];
336
+ const parser = new CsvParser(candidate.charCodeAt(0), {
337
+ onRecord(fields) {
338
+ counts.push(fields.length);
339
+ return counts.length < DELIMITER_SAMPLE_RECORDS;
340
+ },
341
+ onIssue() {
342
+ }
343
+ });
344
+ parser.push(sample);
345
+ if (sampleComplete) parser.end();
346
+ const usable = sampleComplete || parser.isStopped ? counts : counts.slice(0, -1);
347
+ if (usable.length === 0) continue;
348
+ const tally = /* @__PURE__ */ new Map();
349
+ for (const count of usable) tally.set(count, (tally.get(count) ?? 0) + 1);
350
+ let modal = 1;
351
+ let modalHits = 0;
352
+ for (const [count, hits] of tally) {
353
+ if (hits > modalHits || hits === modalHits && count > modal) {
354
+ modal = count;
355
+ modalHits = hits;
356
+ }
357
+ }
358
+ if (modal < 2) continue;
359
+ const confidence = modalHits / usable.length;
360
+ if (confidence > best.confidence) best = { delimiter: candidate, confidence, fieldCount: modal };
361
+ }
362
+ return best;
363
+ }
364
+ function headerLooksLikeNames(record) {
365
+ return record.length > 0 && record.every((cell) => cell.trim().length > 0 && classifyCell(cell.trim()) === "string");
366
+ }
367
+ function defaultColumnName(index) {
368
+ return `column_${index + 1}`;
369
+ }
370
+ var CSV_DEFAULT_SAMPLE_ROWS = 10;
371
+ var CSV_DEFAULT_MAX_ROWS = 1e5;
372
+ var COLUMN_TRACK_CAP = 1e4;
373
+ var FIRST_ISSUES_CAP = 10;
374
+ var SAMPLE_VALUES_CAP = 5;
375
+ function newColumn(index, name) {
376
+ return {
377
+ index,
378
+ name,
379
+ nonEmpty: 0,
380
+ empty: 0,
381
+ sentinels: /* @__PURE__ */ new Map(),
382
+ types: emptyCellHistogram(),
383
+ samples: [],
384
+ minLength: Number.POSITIVE_INFINITY,
385
+ maxLength: 0,
386
+ intMin: null,
387
+ intMax: null,
388
+ intMinText: "",
389
+ intMaxText: "",
390
+ floatMin: Number.POSITIVE_INFINITY,
391
+ floatMax: Number.NEGATIVE_INFINITY,
392
+ floatMinText: "",
393
+ floatMaxText: "",
394
+ floatApproximate: false,
395
+ precisionIssues: 0
396
+ };
397
+ }
398
+ function accumulateCell(column, cell) {
399
+ const cls = classifyCell(cell);
400
+ column.types[cls] += 1;
401
+ if (cls === "empty") {
402
+ column.empty += 1;
403
+ column.minLength = 0;
404
+ return null;
405
+ }
406
+ column.nonEmpty += 1;
407
+ column.minLength = Math.min(column.minLength, cell.length);
408
+ column.maxLength = Math.max(column.maxLength, cell.length);
409
+ if (cls === "sentinel") {
410
+ column.sentinels.set(cell, (column.sentinels.get(cell) ?? 0) + 1);
411
+ return null;
412
+ }
413
+ if (column.samples.length < SAMPLE_VALUES_CAP && !column.samples.includes(cell)) column.samples.push(cell);
414
+ if (cls === "integer") {
415
+ const value = BigInt(cell);
416
+ if (column.intMin === null || value < column.intMin) {
417
+ column.intMin = value;
418
+ column.intMinText = cell;
419
+ }
420
+ if (column.intMax === null || value > column.intMax) {
421
+ column.intMax = value;
422
+ column.intMaxText = cell;
423
+ }
424
+ const precision = numberLiteralPrecision(cell);
425
+ if (precision !== null) column.precisionIssues += 1;
426
+ return precision;
427
+ }
428
+ if (cls === "float") {
429
+ const value = Number(cell);
430
+ const precision = numberLiteralPrecision(cell);
431
+ if (precision !== null) {
432
+ column.precisionIssues += 1;
433
+ column.floatApproximate = true;
434
+ }
435
+ if (Number.isFinite(value)) {
436
+ if (value < column.floatMin) {
437
+ column.floatMin = value;
438
+ column.floatMinText = cell;
439
+ }
440
+ if (value > column.floatMax) {
441
+ column.floatMax = value;
442
+ column.floatMaxText = cell;
443
+ }
444
+ }
445
+ return precision;
446
+ }
447
+ return null;
448
+ }
449
+ function numericRange(column) {
450
+ const hasInt = column.intMin !== null && column.intMax !== null;
451
+ const hasFloat = Number.isFinite(column.floatMin);
452
+ if (!hasInt && !hasFloat) return void 0;
453
+ if (hasInt && !hasFloat) return { min: column.intMinText, max: column.intMaxText, approximate: false };
454
+ if (!hasInt) return { min: column.floatMinText, max: column.floatMaxText, approximate: column.floatApproximate };
455
+ const intMinNumber = Number(column.intMin);
456
+ const intMaxNumber = Number(column.intMax);
457
+ const approximate = column.floatApproximate || !Number.isSafeInteger(intMinNumber) || !Number.isSafeInteger(intMaxNumber);
458
+ const min = intMinNumber <= column.floatMin ? column.intMinText : column.floatMinText;
459
+ const max = intMaxNumber >= column.floatMax ? column.intMaxText : column.floatMaxText;
460
+ return { min, max, approximate };
461
+ }
462
+ function columnReport(column) {
463
+ const range = numericRange(column);
464
+ return {
465
+ index: column.index,
466
+ name: column.name,
467
+ inferredType: inferColumnType(column.types),
468
+ nonEmpty: column.nonEmpty,
469
+ empty: column.empty,
470
+ sentinels: histogramRecord(column.sentinels),
471
+ types: { ...column.types },
472
+ sampleValues: column.samples.map((value) => capText(value).text),
473
+ minLength: Number.isFinite(column.minLength) ? column.minLength : 0,
474
+ maxLength: column.maxLength,
475
+ ...range !== void 0 ? { numericRange: range } : {},
476
+ precisionIssues: column.precisionIssues
477
+ };
478
+ }
479
+ function lineEndingOf(parser) {
480
+ const kinds = [parser.lf > 0, parser.crlf > 0, parser.cr > 0].filter(Boolean).length;
481
+ if (kinds === 0) return "none";
482
+ if (kinds > 1) return "mixed";
483
+ if (parser.crlf > 0) return "crlf";
484
+ if (parser.cr > 0) return "cr";
485
+ return "lf";
486
+ }
487
+ function resolveDelimiter(explicit, format) {
488
+ if (explicit === void 0) return format === "tsv" ? " " : null;
489
+ if (explicit === "\\t") return " ";
490
+ if (explicit.length !== 1) return new Error("delimiter must be one character (or \\t)");
491
+ if (explicit === '"' || explicit === "\n" || explicit === "\r") {
492
+ return new Error("delimiter cannot be a quote or a line break");
493
+ }
494
+ return explicit;
495
+ }
496
+ async function scanCsv(path2, explicitDelimiter, signal, stats, callbacks) {
497
+ let parser = null;
498
+ let delimiter = explicitDelimiter;
499
+ let delimiterSource = delimiter === null ? "detected" : "explicit";
500
+ let sample = "";
501
+ for await (const chunk of streamTextChunks(path2, { signal, stats })) {
502
+ if (parser === null) {
503
+ if (delimiter === null) {
504
+ sample += chunk.text;
505
+ if (sample.length < DELIMITER_SAMPLE_CHARS) continue;
506
+ const detected = detectCsvDelimiter(sample.slice(0, DELIMITER_SAMPLE_CHARS), false);
507
+ delimiter = detected.delimiter;
508
+ if (detected.confidence === 0) delimiterSource = "default";
509
+ parser = new CsvParser(delimiter.charCodeAt(0), callbacks);
510
+ const keepGoing = parser.push(sample);
511
+ sample = "";
512
+ if (!keepGoing) break;
513
+ continue;
514
+ }
515
+ parser = new CsvParser(delimiter.charCodeAt(0), callbacks);
516
+ }
517
+ if (!parser.push(chunk.text)) break;
518
+ }
519
+ throwIfAborted(signal, path2);
520
+ if (parser === null) {
521
+ if (delimiter === null) {
522
+ const detected = detectCsvDelimiter(sample, true);
523
+ delimiter = detected.delimiter;
524
+ if (detected.confidence === 0) delimiterSource = "default";
525
+ }
526
+ parser = new CsvParser(delimiter.charCodeAt(0), callbacks);
527
+ parser.push(sample);
528
+ }
529
+ if (!parser.isStopped) parser.end();
530
+ return { parser, delimiter, delimiterSource };
531
+ }
532
+ var HeaderResolver = class {
533
+ constructor(option) {
534
+ this.option = option;
535
+ }
536
+ option;
537
+ header = null;
538
+ source = "none";
539
+ fieldCount = 0;
540
+ settled = false;
541
+ pending = null;
542
+ /** Returns the data rows this record releases, in order. */
543
+ feed(fields, line) {
544
+ if (this.settled) return [{ fields, line }];
545
+ if (this.option === true) {
546
+ this.settle(fields, "explicit", fields.length);
547
+ return [];
548
+ }
549
+ if (this.option === false) {
550
+ this.settle(null, "none", fields.length);
551
+ return [{ fields, line }];
552
+ }
553
+ if (this.pending === null) {
554
+ this.pending = { fields, line };
555
+ return [];
556
+ }
557
+ const first = this.pending;
558
+ this.pending = null;
559
+ if (headerLooksLikeNames(first.fields)) {
560
+ this.settle(first.fields, "detected", first.fields.length);
561
+ return [{ fields, line }];
562
+ }
563
+ this.settle(null, "none", first.fields.length);
564
+ return [first, { fields, line }];
565
+ }
566
+ /** End of input: a lone pending record is data. */
567
+ finish() {
568
+ if (this.settled) return [];
569
+ const first = this.pending;
570
+ this.pending = null;
571
+ if (first === null) {
572
+ this.settle(this.option === true ? [] : null, this.option === true ? "explicit" : "none", 0);
573
+ return [];
574
+ }
575
+ this.settle(null, "none", first.fields.length);
576
+ return [first];
577
+ }
578
+ settle(header, source, fieldCount) {
579
+ this.settled = true;
580
+ this.header = header;
581
+ this.source = source;
582
+ this.fieldCount = fieldCount;
583
+ }
584
+ };
585
+ async function inspectCsv(path2, options = {}) {
586
+ const stat = statDataFile(path2);
587
+ if ("ok" in stat) return stat;
588
+ const format = options.format ?? "csv";
589
+ const explicitDelimiter = resolveDelimiter(options.delimiter, format);
590
+ if (explicitDelimiter instanceof Error) return refusal("invalid-argument", explicitDelimiter.message, { path: path2 });
591
+ const sampleRows = Math.max(0, Math.min(1e3, Math.floor(options.sampleRows ?? CSV_DEFAULT_SAMPLE_ROWS)));
592
+ const maxRows = resolveMaxRows(options.maxRows, CSV_DEFAULT_MAX_ROWS);
593
+ const stats = { bytesRead: 0, bom: false };
594
+ const headers = new HeaderResolver(options.header ?? "auto");
595
+ const state = {
596
+ columns: [],
597
+ columnsTruncated: false,
598
+ columnsEstablished: false,
599
+ dataRows: 0,
600
+ stoppedAtRows: false,
601
+ raggedCount: 0,
602
+ raggedFirst: [],
603
+ issueCount: 0,
604
+ issueFirst: [],
605
+ precisionCount: 0,
606
+ precisionFirst: [],
607
+ sample: [],
608
+ sampleTruncatedCells: 0
609
+ };
610
+ const establishColumns = () => {
611
+ if (state.columnsEstablished) return;
612
+ state.columnsEstablished = true;
613
+ const names = headers.header ?? Array.from({ length: headers.fieldCount }, (_, index) => defaultColumnName(index));
614
+ for (const [index, name] of names.entries()) {
615
+ if (state.columns.length >= COLUMN_TRACK_CAP) {
616
+ state.columnsTruncated = true;
617
+ break;
618
+ }
619
+ state.columns.push(newColumn(index, name));
620
+ }
621
+ };
622
+ const consumeDataRow = (fields, line) => {
623
+ establishColumns();
624
+ if (state.dataRows >= maxRows) {
625
+ state.stoppedAtRows = true;
626
+ return false;
627
+ }
628
+ state.dataRows += 1;
629
+ if (fields.length !== headers.fieldCount) {
630
+ state.raggedCount += 1;
631
+ if (state.raggedFirst.length < FIRST_ISSUES_CAP) {
632
+ state.raggedFirst.push({ row: state.dataRows, line, fields: fields.length });
633
+ }
634
+ }
635
+ for (const [index, cell] of fields.entries()) {
636
+ let column = state.columns[index];
637
+ if (column === void 0) {
638
+ if (state.columns.length >= COLUMN_TRACK_CAP) {
639
+ state.columnsTruncated = true;
640
+ break;
641
+ }
642
+ column = newColumn(index, defaultColumnName(index));
643
+ state.columns.push(column);
644
+ }
645
+ const precision = accumulateCell(column, cell);
646
+ if (precision !== null) {
647
+ state.precisionCount += 1;
648
+ if (state.precisionFirst.length < FIRST_ISSUES_CAP) {
649
+ state.precisionFirst.push({ kind: precision, literal: cell, row: state.dataRows, column: index });
650
+ }
651
+ }
652
+ }
653
+ if (state.sample.length < sampleRows) {
654
+ state.sample.push(
655
+ fields.map((cell) => {
656
+ const capped = capText(cell);
657
+ if (capped.truncated) state.sampleTruncatedCells += 1;
658
+ return capped.text;
659
+ })
660
+ );
661
+ }
662
+ return true;
663
+ };
664
+ const callbacks = {
665
+ onRecord(fields, _record, line) {
666
+ for (const row of headers.feed(fields, line)) {
667
+ if (!consumeDataRow(row.fields, row.line)) return false;
668
+ }
669
+ return true;
670
+ },
671
+ onIssue(issue) {
672
+ state.issueCount += 1;
673
+ if (state.issueFirst.length < FIRST_ISSUES_CAP) state.issueFirst.push(issue);
674
+ }
675
+ };
676
+ let scan;
677
+ try {
678
+ scan = await scanCsv(path2, explicitDelimiter, options.signal, stats, callbacks);
679
+ } catch (error) {
680
+ return refusalFromError(error, path2, options.signal);
681
+ }
682
+ if (!scan.parser.isStopped) {
683
+ for (const row of headers.finish()) consumeDataRow(row.fields, row.line);
684
+ establishColumns();
685
+ }
686
+ const sampled = state.stoppedAtRows;
687
+ const notes = [];
688
+ if (stats.bom) notes.push("a UTF-8 byte-order mark was stripped");
689
+ if (sampled) notes.push(sampledNotice(state.dataRows, "rows"));
690
+ if (scan.delimiterSource === "default") {
691
+ notes.push("no delimiter split the sample consistently; read as one column with the comma");
692
+ }
693
+ if (state.columnsTruncated) notes.push(`column tracking capped at ${COLUMN_TRACK_CAP} columns`);
694
+ if (state.raggedCount > 0) {
695
+ notes.push(`${state.raggedCount} row(s) have a field count other than ${headers.fieldCount}`);
696
+ }
697
+ if (state.issueCount > 0) notes.push(`${state.issueCount} quoting issue(s) were recovered leniently and are listed`);
698
+ if (state.precisionCount > 0) {
699
+ notes.push(`${state.precisionCount} numeric cell(s) would lose precision as doubles; cells stay source text`);
700
+ }
701
+ return {
702
+ ok: true,
703
+ format,
704
+ path: path2,
705
+ bytes: stat.size,
706
+ bytesScanned: stats.bytesRead,
707
+ view: sampled ? sampledView() : exactView(),
708
+ rowsScanned: state.dataRows,
709
+ rowCount: sampled ? null : state.dataRows,
710
+ delimiter: scan.delimiter,
711
+ delimiterSource: scan.delimiterSource,
712
+ header: headers.header,
713
+ headerSource: headers.source,
714
+ bom: stats.bom,
715
+ lineEnding: lineEndingOf(scan.parser),
716
+ fieldCount: headers.fieldCount,
717
+ columns: state.columns.map(columnReport),
718
+ columnsTruncated: state.columnsTruncated,
719
+ raggedRows: { count: state.raggedCount, first: state.raggedFirst },
720
+ quotingIssues: { count: state.issueCount, first: state.issueFirst },
721
+ precision: { count: state.precisionCount, first: state.precisionFirst },
722
+ blankLines: scan.parser.blankLines,
723
+ sample: state.sample,
724
+ sampleTruncatedCells: state.sampleTruncatedCells,
725
+ notes
726
+ };
727
+ }
728
+ var CSV_SELECT_DEFAULT_LIMIT = 50;
729
+ var CSV_SELECT_MAX_LIMIT = 1e3;
730
+ async function selectCsv(path2, options = {}) {
731
+ const stat = statDataFile(path2);
732
+ if ("ok" in stat) return stat;
733
+ const format = options.format ?? "csv";
734
+ const explicitDelimiter = resolveDelimiter(options.delimiter, format);
735
+ if (explicitDelimiter instanceof Error) return refusal("invalid-argument", explicitDelimiter.message, { path: path2 });
736
+ const offset = Math.max(0, Math.floor(options.offset ?? 0));
737
+ const limit = Math.max(1, Math.min(CSV_SELECT_MAX_LIMIT, Math.floor(options.limit ?? CSV_SELECT_DEFAULT_LIMIT)));
738
+ const stats = { bytesRead: 0, bom: false };
739
+ const headers = new HeaderResolver(options.header ?? "auto");
740
+ const state = {
741
+ projection: null,
742
+ projectionResolved: false,
743
+ projectionError: null,
744
+ dataRows: 0,
745
+ hasMore: false,
746
+ rows: []
747
+ };
748
+ const resolveProjection = () => {
749
+ if (state.projectionResolved) return state.projectionError === null;
750
+ state.projectionResolved = true;
751
+ if (options.columns === void 0) return true;
752
+ const names = headers.header;
753
+ const indexes2 = [];
754
+ for (const column of options.columns) {
755
+ if (typeof column === "number") {
756
+ if (!Number.isInteger(column) || column < 0) {
757
+ state.projectionError = refusal("invalid-argument", `column index ${column} is not a non-negative integer`, {
758
+ path: path2
759
+ });
760
+ return false;
761
+ }
762
+ indexes2.push(column);
763
+ continue;
764
+ }
765
+ const index = names?.indexOf(column) ?? -1;
766
+ if (index === -1) {
767
+ state.projectionError = refusal(
768
+ "unknown-column",
769
+ names === null ? `column "${column}" cannot be resolved: the file has no header; use a 0-based index` : `unknown column "${column}"; header columns are ${names.map((name) => JSON.stringify(name)).join(", ")}`,
770
+ { path: path2 }
771
+ );
772
+ return false;
773
+ }
774
+ indexes2.push(index);
775
+ }
776
+ state.projection = indexes2;
777
+ return true;
778
+ };
779
+ const consumeDataRow = (fields) => {
780
+ if (!resolveProjection()) return false;
781
+ const index = state.dataRows;
782
+ state.dataRows += 1;
783
+ if (index < offset) return true;
784
+ if (state.rows.length >= limit) {
785
+ state.hasMore = true;
786
+ return false;
787
+ }
788
+ const projection2 = state.projection;
789
+ state.rows.push(projection2 === null ? fields : projection2.map((column) => fields[column] ?? null));
790
+ return true;
791
+ };
792
+ const callbacks = {
793
+ onRecord(fields, _record, line) {
794
+ for (const row of headers.feed(fields, line)) {
795
+ if (!consumeDataRow(row.fields)) return false;
796
+ }
797
+ if (headers.settled && !resolveProjection()) return false;
798
+ return true;
799
+ },
800
+ onIssue() {
801
+ }
802
+ };
803
+ let scan;
804
+ try {
805
+ scan = await scanCsv(path2, explicitDelimiter, options.signal, stats, callbacks);
806
+ } catch (error) {
807
+ return refusalFromError(error, path2, options.signal);
808
+ }
809
+ if (state.projectionError !== null) return state.projectionError;
810
+ if (!scan.parser.isStopped) {
811
+ for (const row of headers.finish()) consumeDataRow(row.fields);
812
+ if (!resolveProjection()) return state.projectionError ?? refusal("invalid-argument", "bad projection", { path: path2 });
813
+ }
814
+ const header = headers.header;
815
+ const projection = state.projection;
816
+ const indexes = projection ?? (header !== null ? header.map((_, index) => index) : Array.from({ length: state.rows.reduce((max, row) => Math.max(max, row.length), 0) }, (_, index) => index));
817
+ const notes = [];
818
+ if (stats.bom) notes.push("a UTF-8 byte-order mark was stripped");
819
+ if (scan.delimiterSource === "default") {
820
+ notes.push("no delimiter split the sample consistently; read as one column with the comma");
821
+ }
822
+ return {
823
+ ok: true,
824
+ format,
825
+ path: path2,
826
+ bytes: stat.size,
827
+ bytesScanned: stats.bytesRead,
828
+ view: exactView(),
829
+ delimiter: scan.delimiter,
830
+ header: header === null ? null : projection === null ? header : projection.map((column) => header[column] ?? defaultColumnName(column)),
831
+ columnIndexes: indexes,
832
+ offset,
833
+ limit,
834
+ returned: state.rows.length,
835
+ hasMore: state.hasMore,
836
+ rowsScanned: state.dataRows,
837
+ rows: state.rows,
838
+ notes
839
+ };
840
+ }
841
+ async function validateCsv(path2, options = {}) {
842
+ const stat = statDataFile(path2);
843
+ if ("ok" in stat) return stat;
844
+ const format = options.format ?? "csv";
845
+ const explicitDelimiter = resolveDelimiter(options.delimiter, format);
846
+ if (explicitDelimiter instanceof Error) return refusal("invalid-argument", explicitDelimiter.message, { path: path2 });
847
+ const maxRows = resolveMaxRows(options.maxRows, CSV_DEFAULT_MAX_ROWS);
848
+ const stats = { bytesRead: 0, bom: false };
849
+ const headers = new HeaderResolver(options.header ?? "auto");
850
+ const state = {
851
+ dataRows: 0,
852
+ stoppedAtRows: false,
853
+ raggedCount: 0,
854
+ raggedFirst: [],
855
+ issueCount: 0,
856
+ issueFirst: []
857
+ };
858
+ const consumeDataRow = (fields, line) => {
859
+ if (state.dataRows >= maxRows) {
860
+ state.stoppedAtRows = true;
861
+ return false;
862
+ }
863
+ state.dataRows += 1;
864
+ if (fields.length !== headers.fieldCount) {
865
+ state.raggedCount += 1;
866
+ if (state.raggedFirst.length < FIRST_ISSUES_CAP) {
867
+ state.raggedFirst.push({ row: state.dataRows, line, fields: fields.length });
868
+ }
869
+ }
870
+ return true;
871
+ };
872
+ const callbacks = {
873
+ onRecord(fields, _record, line) {
874
+ for (const row of headers.feed(fields, line)) {
875
+ if (!consumeDataRow(row.fields, row.line)) return false;
876
+ }
877
+ return true;
878
+ },
879
+ onIssue(issue) {
880
+ state.issueCount += 1;
881
+ if (state.issueFirst.length < FIRST_ISSUES_CAP) state.issueFirst.push(issue);
882
+ }
883
+ };
884
+ let scan;
885
+ try {
886
+ scan = await scanCsv(path2, explicitDelimiter, options.signal, stats, callbacks);
887
+ } catch (error) {
888
+ return refusalFromError(error, path2, options.signal);
889
+ }
890
+ if (!scan.parser.isStopped) {
891
+ for (const row of headers.finish()) consumeDataRow(row.fields, row.line);
892
+ }
893
+ const complete = !state.stoppedAtRows;
894
+ const faults = state.raggedCount + state.issueCount;
895
+ const notes = [];
896
+ if (stats.bom) notes.push("a UTF-8 byte-order mark was stripped");
897
+ if (!complete) {
898
+ notes.push(
899
+ `validation incomplete: stopped after ${state.dataRows} rows; pass maxRows null to validate the whole file`
900
+ );
901
+ }
902
+ if (state.raggedCount > 0) {
903
+ notes.push(`${state.raggedCount} row(s) have a field count other than ${headers.fieldCount}`);
904
+ }
905
+ if (state.issueCount > 0) notes.push(`${state.issueCount} quoting issue(s)`);
906
+ return {
907
+ ok: true,
908
+ format,
909
+ path: path2,
910
+ bytes: stat.size,
911
+ bytesScanned: stats.bytesRead,
912
+ view: complete ? exactView() : sampledView(),
913
+ valid: faults > 0 ? false : complete ? true : null,
914
+ complete,
915
+ rowsScanned: state.dataRows,
916
+ rowCount: complete ? state.dataRows : null,
917
+ delimiter: scan.delimiter,
918
+ fieldCount: headers.fieldCount,
919
+ header: headers.header,
920
+ raggedRows: { count: state.raggedCount, first: state.raggedFirst },
921
+ quotingIssues: { count: state.issueCount, first: state.issueFirst },
922
+ blankLines: scan.parser.blankLines,
923
+ notes
924
+ };
925
+ }
926
+
927
+ // src/tools/data/json.ts
928
+ init_esm_shims();
929
+ var JSON_MAX_DEPTH = 1024;
930
+ var KEY_CAPTURE_CAP = 1024;
931
+ var STRING_CAPTURE_CAP = 65536;
932
+ var CHAR_QUOTE2 = 34;
933
+ var CHAR_BACKSLASH = 92;
934
+ var CHAR_LF2 = 10;
935
+ function escapeChar(code) {
936
+ switch (code) {
937
+ case CHAR_QUOTE2:
938
+ return '"';
939
+ case CHAR_BACKSLASH:
940
+ return "\\";
941
+ case 47:
942
+ return "/";
943
+ case 98:
944
+ return "\b";
945
+ case 102:
946
+ return "\f";
947
+ case 110:
948
+ return "\n";
949
+ case 114:
950
+ return "\r";
951
+ case 116:
952
+ return " ";
953
+ default:
954
+ return null;
955
+ }
956
+ }
957
+ function isWhitespace(code) {
958
+ return code === 32 || code === 9 || code === CHAR_LF2 || code === 13;
959
+ }
960
+ function isNumberChar(code) {
961
+ return code >= 48 && code <= 57 || code === 45 || code === 43 || code === 46 || code === 69 || code === 101;
962
+ }
963
+ var NUMBER_GRAMMAR = /^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?$/u;
964
+ var JsonStreamParser = class {
965
+ constructor(sink) {
966
+ this.sink = sink;
967
+ }
968
+ sink;
969
+ stack = [];
970
+ expect = 0 /* Value */;
971
+ tokenState = 0 /* None */;
972
+ token = "";
973
+ tokenTruncated = false;
974
+ stringCapture = false;
975
+ stringLength = 0;
976
+ stringIsKey = false;
977
+ escape = false;
978
+ unicodeHex = null;
979
+ line = 1;
980
+ column = 0;
981
+ chunkText = "";
982
+ chunkByteOffset = 0;
983
+ chunkIndex = 0;
984
+ stopped = false;
985
+ rootComplete = false;
986
+ /** Depth of the deepest container opened so far (root object or array is 0). */
987
+ maxDepth = 0;
988
+ get isStopped() {
989
+ return this.stopped;
990
+ }
991
+ get depth() {
992
+ return this.stack.length;
993
+ }
994
+ /** Feed one chunk. Returns false once a sink asked to stop; further pushes are ignored. */
995
+ push(text, byteOffset = 0) {
996
+ if (this.stopped) return false;
997
+ this.chunkText = text;
998
+ this.chunkByteOffset = byteOffset;
999
+ const length = text.length;
1000
+ let index = 0;
1001
+ while (index < length) {
1002
+ this.chunkIndex = index;
1003
+ const code = text.charCodeAt(index);
1004
+ if (code === CHAR_LF2) {
1005
+ this.line += 1;
1006
+ this.column = 0;
1007
+ } else {
1008
+ this.column += 1;
1009
+ }
1010
+ switch (this.tokenState) {
1011
+ case 1 /* String */:
1012
+ index = this.scanString(text, index, length);
1013
+ break;
1014
+ case 2 /* Number */:
1015
+ if (isNumberChar(code)) {
1016
+ this.appendNumberChar(text[index]);
1017
+ index += 1;
1018
+ } else {
1019
+ this.column -= 1;
1020
+ if (code === CHAR_LF2) {
1021
+ this.line -= 1;
1022
+ this.column = 0;
1023
+ }
1024
+ this.completeNumber();
1025
+ this.tokenState = 0 /* None */;
1026
+ }
1027
+ break;
1028
+ case 3 /* Literal */:
1029
+ if (code >= 97 && code <= 122) {
1030
+ this.token += text[index];
1031
+ index += 1;
1032
+ if (this.token.length >= 5) this.completeLiteral();
1033
+ } else {
1034
+ this.column -= 1;
1035
+ if (code === CHAR_LF2) {
1036
+ this.line -= 1;
1037
+ this.column = 0;
1038
+ }
1039
+ this.completeLiteral();
1040
+ }
1041
+ break;
1042
+ default:
1043
+ index = this.scanStructural(text, index, code);
1044
+ break;
1045
+ }
1046
+ if (this.stopped) return false;
1047
+ }
1048
+ return true;
1049
+ }
1050
+ end() {
1051
+ if (this.stopped) return;
1052
+ this.chunkIndex = this.chunkText.length;
1053
+ if (this.tokenState === 2 /* Number */) {
1054
+ this.completeNumber();
1055
+ this.tokenState = 0 /* None */;
1056
+ } else if (this.tokenState === 3 /* Literal */) {
1057
+ this.completeLiteral();
1058
+ } else if (this.tokenState === 1 /* String */) {
1059
+ throw this.error("unterminated string at end of input");
1060
+ }
1061
+ if (this.stopped) return;
1062
+ if (!this.rootComplete) {
1063
+ throw this.error(this.stack.length === 0 ? "unexpected end of input: no JSON value" : "unexpected end of input");
1064
+ }
1065
+ }
1066
+ scanStructural(text, index, code) {
1067
+ if (isWhitespace(code)) return index + 1;
1068
+ if (this.expect === 6 /* End */) throw this.error("unexpected content after the JSON value");
1069
+ switch (code) {
1070
+ case CHAR_QUOTE2: {
1071
+ const isKey = this.expect === 2 /* Key */ || this.expect === 1 /* KeyOrEnd */;
1072
+ if (!isKey && this.expect !== 0 /* Value */ && this.expect !== 5 /* ValueOrEnd */) {
1073
+ throw this.error(this.describeExpectation());
1074
+ }
1075
+ this.tokenState = 1 /* String */;
1076
+ this.stringIsKey = isKey;
1077
+ this.stringCapture = isKey || this.sink.captureStrings(this.stack.length);
1078
+ this.token = "";
1079
+ this.tokenTruncated = false;
1080
+ this.stringLength = 0;
1081
+ this.escape = false;
1082
+ this.unicodeHex = null;
1083
+ return index + 1;
1084
+ }
1085
+ case 123:
1086
+ this.requireValueExpectation();
1087
+ this.openContainer("object");
1088
+ return index + 1;
1089
+ case 91:
1090
+ this.requireValueExpectation();
1091
+ this.openContainer("array");
1092
+ return index + 1;
1093
+ case 125:
1094
+ this.closeContainer("object");
1095
+ return index + 1;
1096
+ case 93:
1097
+ this.closeContainer("array");
1098
+ return index + 1;
1099
+ case 58:
1100
+ if (this.expect !== 3 /* Colon */) throw this.error(this.describeExpectation());
1101
+ this.expect = 0 /* Value */;
1102
+ return index + 1;
1103
+ case 44: {
1104
+ if (this.expect !== 4 /* CommaOrEnd */) throw this.error(this.describeExpectation());
1105
+ const top = this.stack[this.stack.length - 1];
1106
+ top.expect = top.kind === "object" ? 2 /* Key */ : 0 /* Value */;
1107
+ this.expect = top.expect;
1108
+ return index + 1;
1109
+ }
1110
+ default:
1111
+ this.requireValueExpectation();
1112
+ if (isNumberChar(code) && code !== 43 && code !== 46 && code !== 69 && code !== 101) {
1113
+ this.tokenState = 2 /* Number */;
1114
+ this.token = text[index];
1115
+ this.tokenTruncated = false;
1116
+ return index + 1;
1117
+ }
1118
+ if (code >= 97 && code <= 122) {
1119
+ this.tokenState = 3 /* Literal */;
1120
+ this.token = text[index];
1121
+ return index + 1;
1122
+ }
1123
+ throw this.error(`unexpected character ${JSON.stringify(text[index])}`);
1124
+ }
1125
+ }
1126
+ scanString(text, index, length) {
1127
+ if (!this.escape && this.unicodeHex === null) {
1128
+ let end = index;
1129
+ while (end < length) {
1130
+ const code2 = text.charCodeAt(end);
1131
+ if (code2 === CHAR_QUOTE2 || code2 === CHAR_BACKSLASH || code2 < 32) break;
1132
+ end += 1;
1133
+ }
1134
+ if (end > index) {
1135
+ const run = end - index;
1136
+ this.stringLength += run;
1137
+ if (this.stringCapture) this.captureString(text.slice(index, end));
1138
+ this.column += run - 1;
1139
+ if (end >= length) return end;
1140
+ index = end;
1141
+ this.chunkIndex = index;
1142
+ this.column += 1;
1143
+ }
1144
+ }
1145
+ const code = text.charCodeAt(index);
1146
+ if (this.unicodeHex !== null) {
1147
+ if (!(code >= 48 && code <= 57 || code >= 65 && code <= 70 || code >= 97 && code <= 102)) {
1148
+ throw this.error("invalid \\u escape in string");
1149
+ }
1150
+ this.unicodeHex += text[index];
1151
+ if (this.unicodeHex.length === 4) {
1152
+ const decoded = String.fromCharCode(Number.parseInt(this.unicodeHex, 16));
1153
+ this.unicodeHex = null;
1154
+ this.stringLength += 1;
1155
+ if (this.stringCapture) this.captureString(decoded);
1156
+ }
1157
+ return index + 1;
1158
+ }
1159
+ if (this.escape) {
1160
+ this.escape = false;
1161
+ if (code === 117) {
1162
+ this.unicodeHex = "";
1163
+ return index + 1;
1164
+ }
1165
+ const decoded = escapeChar(code);
1166
+ if (decoded === null) throw this.error(`invalid escape \\${text[index]} in string`);
1167
+ this.stringLength += 1;
1168
+ if (this.stringCapture) this.captureString(decoded);
1169
+ return index + 1;
1170
+ }
1171
+ if (code === CHAR_QUOTE2) {
1172
+ this.completeString();
1173
+ return index + 1;
1174
+ }
1175
+ if (code === CHAR_BACKSLASH) {
1176
+ this.escape = true;
1177
+ return index + 1;
1178
+ }
1179
+ if (code < 32) throw this.error("unescaped control character in string");
1180
+ this.stringLength += 1;
1181
+ if (this.stringCapture) this.captureString(text[index]);
1182
+ return index + 1;
1183
+ }
1184
+ captureString(piece) {
1185
+ const cap = this.stringIsKey ? KEY_CAPTURE_CAP : STRING_CAPTURE_CAP;
1186
+ if (this.token.length >= cap) {
1187
+ this.tokenTruncated = true;
1188
+ return;
1189
+ }
1190
+ if (this.token.length + piece.length <= cap) {
1191
+ this.token += piece;
1192
+ return;
1193
+ }
1194
+ this.token += piece.slice(0, cap - this.token.length);
1195
+ this.tokenTruncated = true;
1196
+ }
1197
+ completeString() {
1198
+ this.tokenState = 0 /* None */;
1199
+ if (this.stringIsKey) {
1200
+ const top = this.stack[this.stack.length - 1];
1201
+ top.expect = 3 /* Colon */;
1202
+ this.expect = 3 /* Colon */;
1203
+ this.dispatch(this.sink.onKey(this.token, this.stack.length, this.tokenTruncated));
1204
+ return;
1205
+ }
1206
+ this.completeValue({
1207
+ type: "string",
1208
+ value: this.token,
1209
+ literal: null,
1210
+ captured: this.stringCapture,
1211
+ length: this.stringLength,
1212
+ truncated: this.tokenTruncated
1213
+ });
1214
+ }
1215
+ appendNumberChar(char) {
1216
+ if (this.token.length >= MAX_NUMBER_LITERAL_CHARS) {
1217
+ this.tokenTruncated = true;
1218
+ return;
1219
+ }
1220
+ this.token += char;
1221
+ }
1222
+ completeNumber() {
1223
+ if (!this.tokenTruncated && !NUMBER_GRAMMAR.test(this.token)) {
1224
+ throw this.error(`invalid number literal ${JSON.stringify(this.token)}`);
1225
+ }
1226
+ const literal = this.tokenTruncated ? `${this.token}\u2026` : this.token;
1227
+ this.completeValue({
1228
+ type: "number",
1229
+ value: this.tokenTruncated ? Number.NaN : Number(this.token),
1230
+ literal,
1231
+ captured: true,
1232
+ length: 0,
1233
+ truncated: this.tokenTruncated
1234
+ });
1235
+ }
1236
+ completeLiteral() {
1237
+ this.tokenState = 0 /* None */;
1238
+ const scalar = {
1239
+ type: "null",
1240
+ value: null,
1241
+ literal: null,
1242
+ captured: true,
1243
+ length: 0,
1244
+ truncated: false
1245
+ };
1246
+ if (this.token === "true") {
1247
+ scalar.type = "boolean";
1248
+ scalar.value = true;
1249
+ } else if (this.token === "false") {
1250
+ scalar.type = "boolean";
1251
+ scalar.value = false;
1252
+ } else if (this.token !== "null") {
1253
+ throw this.error(`unexpected literal ${JSON.stringify(this.token)}`);
1254
+ }
1255
+ this.completeValue(scalar);
1256
+ }
1257
+ requireValueExpectation() {
1258
+ if (this.expect !== 0 /* Value */ && this.expect !== 5 /* ValueOrEnd */) throw this.error(this.describeExpectation());
1259
+ }
1260
+ openContainer(kind) {
1261
+ if (this.stack.length >= JSON_MAX_DEPTH) {
1262
+ throw new DataRefusalError(
1263
+ refusal("nesting-too-deep", `JSON nesting exceeds ${JSON_MAX_DEPTH} levels at line ${this.line}`, {
1264
+ line: this.line,
1265
+ column: this.column,
1266
+ byteOffset: this.byteOffset()
1267
+ })
1268
+ );
1269
+ }
1270
+ const depth = this.stack.length;
1271
+ if (depth > this.maxDepth) this.maxDepth = depth;
1272
+ const container = { kind, count: 0, expect: kind === "object" ? 1 /* KeyOrEnd */ : 5 /* ValueOrEnd */ };
1273
+ this.stack.push(container);
1274
+ this.expect = container.expect;
1275
+ this.dispatch(kind === "object" ? this.sink.onStartObject(depth) : this.sink.onStartArray(depth));
1276
+ }
1277
+ closeContainer(kind) {
1278
+ const top = this.stack[this.stack.length - 1];
1279
+ if (top === void 0 || top.kind !== kind) throw this.error(`unexpected ${kind === "object" ? "}" : "]"}`);
1280
+ const canClose = this.expect === 4 /* CommaOrEnd */ || kind === "object" && this.expect === 1 /* KeyOrEnd */ || kind === "array" && this.expect === 5 /* ValueOrEnd */;
1281
+ if (!canClose) throw this.error(this.describeExpectation());
1282
+ this.stack.pop();
1283
+ const depth = this.stack.length;
1284
+ this.dispatch(kind === "object" ? this.sink.onEndObject(depth, top.count) : this.sink.onEndArray(depth, top.count));
1285
+ if (this.stopped) return;
1286
+ this.afterValue();
1287
+ }
1288
+ completeValue(scalar) {
1289
+ this.dispatch(this.sink.onScalar(scalar, this.stack.length));
1290
+ if (this.stopped) return;
1291
+ this.afterValue();
1292
+ }
1293
+ afterValue() {
1294
+ const top = this.stack[this.stack.length - 1];
1295
+ if (top === void 0) {
1296
+ this.rootComplete = true;
1297
+ this.expect = 6 /* End */;
1298
+ return;
1299
+ }
1300
+ top.count += 1;
1301
+ top.expect = 4 /* CommaOrEnd */;
1302
+ this.expect = 4 /* CommaOrEnd */;
1303
+ }
1304
+ dispatch(verdict) {
1305
+ if (verdict === false) this.stopped = true;
1306
+ }
1307
+ describeExpectation() {
1308
+ switch (this.expect) {
1309
+ case 0 /* Value */:
1310
+ return "expected a JSON value";
1311
+ case 5 /* ValueOrEnd */:
1312
+ return "expected a JSON value or ']'";
1313
+ case 1 /* KeyOrEnd */:
1314
+ return "expected a string key or '}'";
1315
+ case 2 /* Key */:
1316
+ return "expected a string key";
1317
+ case 3 /* Colon */:
1318
+ return "expected ':' after object key";
1319
+ case 4 /* CommaOrEnd */:
1320
+ return `expected ',' or '${this.stack[this.stack.length - 1].kind === "object" ? "}" : "]"}'`;
1321
+ default:
1322
+ return "unexpected content after the JSON value";
1323
+ }
1324
+ }
1325
+ byteOffset() {
1326
+ return this.chunkByteOffset + Buffer.byteLength(this.chunkText.slice(0, this.chunkIndex), "utf8");
1327
+ }
1328
+ error(message) {
1329
+ const byteOffset = this.byteOffset();
1330
+ return new DataRefusalError(
1331
+ refusal("invalid-json", `${message} at line ${this.line} column ${this.column} (byte offset ${byteOffset})`, {
1332
+ line: this.line,
1333
+ column: this.column,
1334
+ byteOffset
1335
+ })
1336
+ );
1337
+ }
1338
+ };
1339
+ var JsonValueBuilder = class {
1340
+ constructor(budgetChars, rootPointer) {
1341
+ this.budgetChars = budgetChars;
1342
+ this.rootPointer = rootPointer;
1343
+ }
1344
+ budgetChars;
1345
+ rootPointer;
1346
+ frames = [];
1347
+ spent = 0;
1348
+ exceeded = false;
1349
+ summaryType = "object";
1350
+ result;
1351
+ done = false;
1352
+ stringsCut = 0;
1353
+ issues = [];
1354
+ get complete() {
1355
+ return this.done;
1356
+ }
1357
+ /** The budget ran out; the value is (or contains) a $summary placeholder. */
1358
+ get overBudget() {
1359
+ return this.exceeded;
1360
+ }
1361
+ /** Strings cut at the capture cap, each left as a $truncated placeholder. */
1362
+ get cutStrings() {
1363
+ return this.stringsCut;
1364
+ }
1365
+ /** Anything in the value stands in for content that was not carried. */
1366
+ get truncated() {
1367
+ return this.exceeded || this.stringsCut > 0;
1368
+ }
1369
+ get value() {
1370
+ return this.result;
1371
+ }
1372
+ pointer() {
1373
+ let pointer = this.rootPointer;
1374
+ for (const frame of this.frames) {
1375
+ pointer += frame.kind === "object" ? `/${(frame.key ?? "").replace(/~/gu, "~0").replace(/\//gu, "~1")}` : `/${frame.value.length}`;
1376
+ }
1377
+ return pointer;
1378
+ }
1379
+ charge(chars) {
1380
+ if (this.exceeded) return false;
1381
+ this.spent += chars;
1382
+ if (this.spent > this.budgetChars) {
1383
+ this.exceeded = true;
1384
+ return false;
1385
+ }
1386
+ return true;
1387
+ }
1388
+ place(value) {
1389
+ const frame = this.frames[this.frames.length - 1];
1390
+ if (frame === void 0) {
1391
+ this.result = value;
1392
+ this.done = true;
1393
+ return;
1394
+ }
1395
+ if (frame.kind === "array") frame.value.push(value);
1396
+ else frame.value[frame.key ?? ""] = value;
1397
+ frame.count += 1;
1398
+ }
1399
+ /**
1400
+ * The budget ran out somewhere inside the subtree. Everything built so far
1401
+ * is discarded and the whole subtree becomes one `$summary` placed when its
1402
+ * root closes, carrying the root's true member count from the parser.
1403
+ */
1404
+ exhaust(rootKind) {
1405
+ this.exceeded = true;
1406
+ this.summaryType = this.frames[0]?.kind ?? rootKind;
1407
+ this.frames.length = 0;
1408
+ }
1409
+ startContainer(kind, _relativeDepth) {
1410
+ if (this.exceeded) return;
1411
+ if (!this.charge(2)) {
1412
+ this.exhaust(kind);
1413
+ return;
1414
+ }
1415
+ this.frames.push({ kind, value: kind === "object" ? {} : [], key: null, count: 0 });
1416
+ }
1417
+ key(name, _relativeDepth) {
1418
+ if (this.exceeded) return;
1419
+ const frame = this.frames[this.frames.length - 1];
1420
+ if (frame === void 0) return;
1421
+ if (!this.charge(name.length + 4)) {
1422
+ this.exhaust(frame.kind);
1423
+ return;
1424
+ }
1425
+ frame.key = name;
1426
+ }
1427
+ endContainer(kind, relativeDepth, count) {
1428
+ if (this.exceeded) {
1429
+ if (relativeDepth === 0) {
1430
+ this.result = {
1431
+ $summary: this.summaryType === "object" ? { type: "object", members: count, reason: "budget" } : { type: "array", length: count, reason: "budget" }
1432
+ };
1433
+ this.done = true;
1434
+ }
1435
+ return;
1436
+ }
1437
+ const frame = this.frames.pop();
1438
+ if (frame === void 0 || frame.kind !== kind) return;
1439
+ this.place(frame.value);
1440
+ }
1441
+ scalar(scalar, _relativeDepth) {
1442
+ if (this.exceeded) return;
1443
+ const cost = scalar.type === "string" ? scalar.length + 2 : scalar.literal?.length ?? 4;
1444
+ if (!this.charge(cost)) {
1445
+ const frame = this.frames[this.frames.length - 1];
1446
+ if (frame === void 0) {
1447
+ this.exceeded = false;
1448
+ this.spent = 0;
1449
+ } else {
1450
+ this.exhaust(frame.kind);
1451
+ return;
1452
+ }
1453
+ }
1454
+ if (scalar.type === "number") {
1455
+ const literal = scalar.literal ?? "";
1456
+ const precision = scalar.truncated ? "oversized-literal" : numberLiteralPrecision(literal);
1457
+ if (precision !== null) {
1458
+ this.issues.push({ kind: precision, literal, path: this.pointer() });
1459
+ this.place({ $literal: literal, precision });
1460
+ return;
1461
+ }
1462
+ this.place(scalar.value);
1463
+ return;
1464
+ }
1465
+ if (scalar.type === "string") {
1466
+ if (scalar.truncated) {
1467
+ this.stringsCut += 1;
1468
+ this.place({ $truncated: "string", length: scalar.length, text: scalar.value });
1469
+ } else this.place(scalar.value);
1470
+ return;
1471
+ }
1472
+ this.place(scalar.value);
1473
+ }
1474
+ };
1475
+ function escapePointerSegment(segment) {
1476
+ return segment.replace(/~/gu, "~0").replace(/\//gu, "~1");
1477
+ }
1478
+ function parseJsonPointer(pointer) {
1479
+ if (pointer === "") return [];
1480
+ if (!pointer.startsWith("/")) return new Error("JSON pointer must start with '/' or be empty for the whole document");
1481
+ return pointer.slice(1).split("/").map((segment) => segment.replace(/~1/gu, "/").replace(/~0/gu, "~"));
1482
+ }
1483
+ var PathTracker = class {
1484
+ segments = [];
1485
+ kinds = [];
1486
+ indexes = [];
1487
+ startContainer(kind) {
1488
+ this.kinds.push(kind);
1489
+ this.indexes.push(0);
1490
+ this.segments.push(kind === "array" ? "0" : "");
1491
+ }
1492
+ key(name) {
1493
+ this.segments[this.segments.length - 1] = name;
1494
+ }
1495
+ endContainer() {
1496
+ this.kinds.pop();
1497
+ this.indexes.pop();
1498
+ this.segments.pop();
1499
+ }
1500
+ /** Advance after a value completes inside the current container. */
1501
+ advance() {
1502
+ const top = this.kinds.length - 1;
1503
+ if (top < 0) return;
1504
+ if (this.kinds[top] === "array") {
1505
+ const next = this.indexes[top] + 1;
1506
+ this.indexes[top] = next;
1507
+ this.segments[top] = String(next);
1508
+ }
1509
+ }
1510
+ pointer() {
1511
+ return this.segments.map((segment) => `/${escapePointerSegment(segment)}`).join("");
1512
+ }
1513
+ /** Pointer of the innermost open container. */
1514
+ containerPointer() {
1515
+ return this.segments.slice(0, -1).map((segment) => `/${escapePointerSegment(segment)}`).join("");
1516
+ }
1517
+ };
1518
+ var DUPLICATE_KEY_TRACK_CAP = 1e4;
1519
+ var KEY_LIST_CAP = 200;
1520
+ var PRECISION_FIRST_CAP = 20;
1521
+ var SAMPLE_BUDGET_CHARS = 8192;
1522
+ var SELECT_BUDGET_CHARS = 1048576;
1523
+ var StructureScanner = class {
1524
+ constructor(pointerPrefix = "") {
1525
+ this.pointerPrefix = pointerPrefix;
1526
+ }
1527
+ pointerPrefix;
1528
+ path = new PathTracker();
1529
+ frames = [];
1530
+ duplicateCount = 0;
1531
+ duplicateFirst = null;
1532
+ duplicateCheckedFully = true;
1533
+ precisionCount = 0;
1534
+ precisionFirst = [];
1535
+ startContainer(kind) {
1536
+ this.path.startContainer(kind);
1537
+ this.frames.push({ seen: kind === "object" ? /* @__PURE__ */ new Set() : null, overCap: false });
1538
+ }
1539
+ key(name) {
1540
+ this.path.key(name);
1541
+ const frame = this.frames[this.frames.length - 1];
1542
+ if (frame?.seen === null || frame === void 0) return;
1543
+ if (frame.overCap) return;
1544
+ if (frame.seen.has(name)) {
1545
+ this.duplicateCount += 1;
1546
+ if (this.duplicateFirst === null) {
1547
+ this.duplicateFirst = { path: this.pointerPrefix + this.path.containerPointer(), key: name };
1548
+ }
1549
+ return;
1550
+ }
1551
+ if (frame.seen.size >= DUPLICATE_KEY_TRACK_CAP) {
1552
+ frame.overCap = true;
1553
+ frame.seen = null;
1554
+ this.duplicateCheckedFully = false;
1555
+ return;
1556
+ }
1557
+ frame.seen.add(name);
1558
+ }
1559
+ endContainer() {
1560
+ this.frames.pop();
1561
+ this.path.endContainer();
1562
+ this.path.advance();
1563
+ }
1564
+ scalar(scalar) {
1565
+ if (scalar.type === "number") {
1566
+ const literal = scalar.literal ?? "";
1567
+ const precision = scalar.truncated ? "oversized-literal" : numberLiteralPrecision(literal);
1568
+ if (precision !== null) {
1569
+ this.precisionCount += 1;
1570
+ if (this.precisionFirst.length < PRECISION_FIRST_CAP) {
1571
+ this.precisionFirst.push({ kind: precision, literal, path: this.pointerPrefix + this.path.pointer() });
1572
+ }
1573
+ }
1574
+ }
1575
+ this.path.advance();
1576
+ }
1577
+ duplicates() {
1578
+ return { count: this.duplicateCount, first: this.duplicateFirst, checkedFully: this.duplicateCheckedFully };
1579
+ }
1580
+ precision() {
1581
+ return { count: this.precisionCount, first: [...this.precisionFirst] };
1582
+ }
1583
+ };
1584
+ var JSON_DEFAULT_SAMPLE_ROWS = 10;
1585
+ var JSON_DEFAULT_MAX_ROWS = 1e5;
1586
+ var InspectSink = class {
1587
+ constructor(sampleRows, maxRows) {
1588
+ this.sampleRows = sampleRows;
1589
+ this.maxRows = maxRows;
1590
+ }
1591
+ sampleRows;
1592
+ maxRows;
1593
+ scanner = new StructureScanner();
1594
+ root = null;
1595
+ rows = 0;
1596
+ rowCount = null;
1597
+ stoppedAtRows = false;
1598
+ keys = [];
1599
+ keysTruncated = false;
1600
+ types = /* @__PURE__ */ new Map();
1601
+ sample = [];
1602
+ /** Sample values that carry a $summary or $truncated placeholder; the counts stay exact. */
1603
+ sampleCuts = 0;
1604
+ rootValue;
1605
+ builder = null;
1606
+ builderDepth = 0;
1607
+ currentKey = "";
1608
+ sampleIssues = [];
1609
+ countType(type) {
1610
+ this.types.set(type, (this.types.get(type) ?? 0) + 1);
1611
+ }
1612
+ /** A depth-1 value begins: count it, decide whether it is sampled, or stop at the row bound. */
1613
+ beginRow(type) {
1614
+ if (this.rows >= this.maxRows) {
1615
+ this.stoppedAtRows = true;
1616
+ return false;
1617
+ }
1618
+ this.rows += 1;
1619
+ this.countType(type);
1620
+ if (this.sample.length < this.sampleRows) {
1621
+ const pointer = this.root === "array" ? `/${this.rows - 1}` : `/${escapePointerSegment(this.currentKey)}`;
1622
+ this.builder = new JsonValueBuilder(SAMPLE_BUDGET_CHARS, pointer);
1623
+ this.builderDepth = 1;
1624
+ }
1625
+ return true;
1626
+ }
1627
+ finishSampled() {
1628
+ const builder = this.builder;
1629
+ if (builder === null || !builder.complete) return;
1630
+ this.builder = null;
1631
+ if (builder.truncated) this.sampleCuts += 1;
1632
+ const value = builder.value;
1633
+ if (this.root === "array") this.sample.push(value);
1634
+ else this.sample.push({ key: this.currentKey, value });
1635
+ this.sampleIssues.push(...builder.issues);
1636
+ }
1637
+ onStartObject(depth) {
1638
+ if (depth === 0) {
1639
+ this.root = "object";
1640
+ this.scanner.startContainer("object");
1641
+ return void 0;
1642
+ }
1643
+ if (depth === 1 && !this.beginRow("object")) return false;
1644
+ this.scanner.startContainer("object");
1645
+ this.builder?.startContainer("object", depth - this.builderDepth);
1646
+ return void 0;
1647
+ }
1648
+ onStartArray(depth) {
1649
+ if (depth === 0) {
1650
+ this.root = "array";
1651
+ this.scanner.startContainer("array");
1652
+ return void 0;
1653
+ }
1654
+ if (depth === 1 && !this.beginRow("array")) return false;
1655
+ this.scanner.startContainer("array");
1656
+ this.builder?.startContainer("array", depth - this.builderDepth);
1657
+ return void 0;
1658
+ }
1659
+ onKey(key, depth, truncated) {
1660
+ this.scanner.key(key);
1661
+ if (depth === 1) {
1662
+ if (this.rows >= this.maxRows) {
1663
+ this.stoppedAtRows = true;
1664
+ return false;
1665
+ }
1666
+ this.currentKey = truncated ? `${key}\u2026` : key;
1667
+ if (this.keys.length < KEY_LIST_CAP) this.keys.push(this.currentKey);
1668
+ else this.keysTruncated = true;
1669
+ return void 0;
1670
+ }
1671
+ this.builder?.key(key, depth - this.builderDepth);
1672
+ return void 0;
1673
+ }
1674
+ onEndObject(depth, memberCount) {
1675
+ if (depth === 0) {
1676
+ this.rowCount = memberCount;
1677
+ return void 0;
1678
+ }
1679
+ this.scanner.endContainer();
1680
+ this.builder?.endContainer("object", depth - this.builderDepth, memberCount);
1681
+ if (depth === 1) this.finishSampled();
1682
+ return void 0;
1683
+ }
1684
+ onEndArray(depth, length) {
1685
+ if (depth === 0) {
1686
+ this.rowCount = length;
1687
+ return void 0;
1688
+ }
1689
+ this.scanner.endContainer();
1690
+ this.builder?.endContainer("array", depth - this.builderDepth, length);
1691
+ if (depth === 1) this.finishSampled();
1692
+ return void 0;
1693
+ }
1694
+ onScalar(scalar, depth) {
1695
+ if (depth === 0) {
1696
+ this.root = scalar.type;
1697
+ this.rows = 1;
1698
+ this.rowCount = 1;
1699
+ const builder = new JsonValueBuilder(SAMPLE_BUDGET_CHARS, "");
1700
+ builder.scalar(scalar, 0);
1701
+ this.rootValue = builder.value;
1702
+ this.sampleIssues.push(...builder.issues);
1703
+ this.scanner.scalar(scalar);
1704
+ return void 0;
1705
+ }
1706
+ if (depth === 1 && !this.beginRow(scalar.type)) return false;
1707
+ this.scanner.scalar(scalar);
1708
+ this.builder?.scalar(scalar, depth - this.builderDepth);
1709
+ if (depth === 1) this.finishSampled();
1710
+ return void 0;
1711
+ }
1712
+ captureStrings(depth) {
1713
+ if (depth === 0) return true;
1714
+ if (depth === 1) return this.rows < this.maxRows && this.sample.length < this.sampleRows;
1715
+ return this.builder !== null && !this.builder.overBudget;
1716
+ }
1717
+ /** Precision issues seen inside sampled values that the scanner already counted; used only for cross-checks. */
1718
+ get sampledIssues() {
1719
+ return this.sampleIssues;
1720
+ }
1721
+ };
1722
+ async function runParser(path2, sink, signal, stats) {
1723
+ const parser = new JsonStreamParser(sink);
1724
+ for await (const chunk of streamTextChunks(path2, { signal, stats })) {
1725
+ if (!parser.push(chunk.text, chunk.byteOffset)) return { parser, stopped: true };
1726
+ }
1727
+ parser.end();
1728
+ throwIfAborted(signal, path2);
1729
+ return { parser, stopped: parser.isStopped };
1730
+ }
1731
+ async function inspectJson(path2, options = {}) {
1732
+ const stat = statDataFile(path2);
1733
+ if ("ok" in stat) return stat;
1734
+ const sampleRows = Math.max(0, Math.min(1e3, Math.floor(options.sampleRows ?? JSON_DEFAULT_SAMPLE_ROWS)));
1735
+ const maxRows = resolveMaxRows(options.maxRows, JSON_DEFAULT_MAX_ROWS);
1736
+ const stats = { bytesRead: 0, bom: false };
1737
+ const sink = new InspectSink(sampleRows, maxRows);
1738
+ let parser;
1739
+ try {
1740
+ parser = (await runParser(path2, sink, options.signal, stats)).parser;
1741
+ } catch (error) {
1742
+ return refusalFromError(error, path2, options.signal);
1743
+ }
1744
+ const sampled = sink.stoppedAtRows;
1745
+ const notes = [];
1746
+ if (stats.bom) notes.push("a UTF-8 byte-order mark was stripped");
1747
+ if (sampled) notes.push(sampledNotice(sink.rows, sink.root === "object" ? "members" : "elements"));
1748
+ if (sink.sampleCuts > 0) {
1749
+ notes.push(
1750
+ `${sink.sampleCuts} sample value(s) were cut to the preview budget and carry $summary or $truncated placeholders; the counts are exact`
1751
+ );
1752
+ }
1753
+ if (!sink.scanner.duplicateCheckedFully) {
1754
+ notes.push(
1755
+ `duplicate-key tracking stopped at ${DUPLICATE_KEY_TRACK_CAP} keys in one object; later duplicates there are unreported`
1756
+ );
1757
+ }
1758
+ if (sink.keysTruncated) notes.push(`key list capped at ${KEY_LIST_CAP} names`);
1759
+ const root = sink.root ?? "null";
1760
+ const result = {
1761
+ ok: true,
1762
+ format: "json",
1763
+ path: path2,
1764
+ bytes: stat.size,
1765
+ bytesScanned: stats.bytesRead,
1766
+ view: sampled ? sampledView() : exactView(),
1767
+ rowsScanned: sink.rows,
1768
+ rowCount: sampled ? null : sink.rowCount,
1769
+ root,
1770
+ maxDepth: parser.maxDepth,
1771
+ duplicateKeys: sink.scanner.duplicates(),
1772
+ precision: sink.scanner.precision(),
1773
+ sample: sink.sample,
1774
+ notes
1775
+ };
1776
+ const types = {};
1777
+ for (const [type, count] of sink.types) types[type] = count;
1778
+ if (root === "array") result.elementTypes = types;
1779
+ else if (root === "object") {
1780
+ result.keys = { names: sink.keys, truncated: sink.keysTruncated };
1781
+ result.memberTypes = types;
1782
+ } else if (sink.rootValue !== void 0) result.value = sink.rootValue;
1783
+ return result;
1784
+ }
1785
+ var JSON_SELECT_DEFAULT_LIMIT = 50;
1786
+ var JSON_SELECT_MAX_LIMIT = 1e3;
1787
+ var SelectSink = class {
1788
+ constructor(segments, windowOffset, windowLimit) {
1789
+ this.segments = segments;
1790
+ this.windowOffset = windowOffset;
1791
+ this.windowLimit = windowLimit;
1792
+ }
1793
+ segments;
1794
+ windowOffset;
1795
+ windowLimit;
1796
+ path = new PathTracker();
1797
+ phase = "seeking";
1798
+ targetDepth = -1;
1799
+ found = false;
1800
+ targetType = null;
1801
+ builder = null;
1802
+ /** Array-window mode state. */
1803
+ windowed = false;
1804
+ elementIndex = 0;
1805
+ elements = [];
1806
+ hasMore = false;
1807
+ issues = [];
1808
+ tooLarge = false;
1809
+ cutStrings = 0;
1810
+ /** Deepest matched prefix length, for the not-found message. */
1811
+ deepestMatch = 0;
1812
+ /** Per-object key sets inside the captured value; null past the tracking cap. */
1813
+ keySets = [];
1814
+ duplicateCount = 0;
1815
+ duplicateFirst = null;
1816
+ duplicatesCheckedFully = true;
1817
+ trackObjectStart() {
1818
+ if (this.builder !== null) this.keySets.push(/* @__PURE__ */ new Set());
1819
+ }
1820
+ trackKey(key) {
1821
+ if (this.builder === null) return;
1822
+ const keys = this.keySets[this.keySets.length - 1];
1823
+ if (keys === null || keys === void 0) return;
1824
+ if (keys.has(key)) {
1825
+ this.duplicateCount += 1;
1826
+ if (this.duplicateFirst === null) this.duplicateFirst = { path: this.path.containerPointer(), key };
1827
+ return;
1828
+ }
1829
+ if (keys.size >= DUPLICATE_KEY_TRACK_CAP) {
1830
+ this.duplicatesCheckedFully = false;
1831
+ this.keySets[this.keySets.length - 1] = null;
1832
+ return;
1833
+ }
1834
+ keys.add(key);
1835
+ }
1836
+ trackObjectEnd() {
1837
+ if (this.builder !== null) this.keySets.pop();
1838
+ }
1839
+ pointerMatches() {
1840
+ const current = this.path.segments;
1841
+ if (current.length !== this.segments.length) return false;
1842
+ for (let index = 0; index < current.length; index += 1) {
1843
+ if (current[index] !== this.segments[index]) return false;
1844
+ }
1845
+ return true;
1846
+ }
1847
+ prefixMatches() {
1848
+ const current = this.path.segments;
1849
+ if (current.length > this.segments.length) return false;
1850
+ for (let index = 0; index < current.length; index += 1) {
1851
+ if (current[index] !== this.segments[index]) return false;
1852
+ }
1853
+ if (current.length > this.deepestMatch) this.deepestMatch = current.length;
1854
+ return true;
1855
+ }
1856
+ beginTarget(type, depth) {
1857
+ this.found = true;
1858
+ this.targetType = type;
1859
+ this.targetDepth = depth;
1860
+ this.phase = "capturing";
1861
+ if (type === "array" && this.windowOffset !== null) {
1862
+ this.windowed = true;
1863
+ return;
1864
+ }
1865
+ this.builder = new JsonValueBuilder(SELECT_BUDGET_CHARS, this.path.pointer());
1866
+ }
1867
+ finishBuilder() {
1868
+ const builder = this.builder;
1869
+ if (builder === null || !builder.complete) return void 0;
1870
+ this.builder = null;
1871
+ if (builder.overBudget) {
1872
+ this.tooLarge = true;
1873
+ return false;
1874
+ }
1875
+ this.cutStrings += builder.cutStrings;
1876
+ this.issues.push(...builder.issues);
1877
+ if (this.windowed) {
1878
+ this.elements.push(builder.value);
1879
+ if (this.elements.length >= this.windowLimit) {
1880
+ return void 0;
1881
+ }
1882
+ return void 0;
1883
+ }
1884
+ this.value = builder.value;
1885
+ this.phase = "done";
1886
+ return false;
1887
+ }
1888
+ value;
1889
+ beginElement(type, depth) {
1890
+ if (!this.windowed || depth !== this.targetDepth + 1) return void 0;
1891
+ const index = this.elementIndex;
1892
+ this.elementIndex += 1;
1893
+ const offset = this.windowOffset;
1894
+ if (index < offset) return void 0;
1895
+ if (this.elements.length >= this.windowLimit) {
1896
+ this.hasMore = true;
1897
+ this.phase = "done";
1898
+ return false;
1899
+ }
1900
+ this.builder = new JsonValueBuilder(SELECT_BUDGET_CHARS, `${this.path.pointer()}`);
1901
+ void type;
1902
+ return void 0;
1903
+ }
1904
+ onStartObject(depth) {
1905
+ if (this.phase === "seeking") {
1906
+ if (this.pointerMatches()) {
1907
+ this.beginTarget("object", depth);
1908
+ this.builder?.startContainer("object", 0);
1909
+ } else this.prefixMatches();
1910
+ } else if (this.phase === "capturing") {
1911
+ const stop = this.beginElement("object", depth);
1912
+ if (stop === false) return false;
1913
+ this.builder?.startContainer("object", depth - (this.windowed ? this.targetDepth + 1 : this.targetDepth));
1914
+ }
1915
+ this.trackObjectStart();
1916
+ this.path.startContainer("object");
1917
+ return void 0;
1918
+ }
1919
+ onStartArray(depth) {
1920
+ if (this.phase === "seeking") {
1921
+ if (this.pointerMatches()) {
1922
+ this.beginTarget("array", depth);
1923
+ this.builder?.startContainer("array", 0);
1924
+ } else this.prefixMatches();
1925
+ } else if (this.phase === "capturing") {
1926
+ const stop = this.beginElement("array", depth);
1927
+ if (stop === false) return false;
1928
+ this.builder?.startContainer("array", depth - (this.windowed ? this.targetDepth + 1 : this.targetDepth));
1929
+ }
1930
+ this.path.startContainer("array");
1931
+ return void 0;
1932
+ }
1933
+ onKey(key, depth) {
1934
+ this.path.key(key);
1935
+ if (this.phase === "seeking") this.prefixMatches();
1936
+ else if (this.phase === "capturing") {
1937
+ this.trackKey(key);
1938
+ this.builder?.key(key, depth - (this.windowed ? this.targetDepth + 1 : this.targetDepth));
1939
+ }
1940
+ return void 0;
1941
+ }
1942
+ onEndObject(depth, memberCount) {
1943
+ this.trackObjectEnd();
1944
+ this.path.endContainer();
1945
+ this.path.advance();
1946
+ if (this.phase !== "capturing") return void 0;
1947
+ if (this.windowed) {
1948
+ if (depth === this.targetDepth) {
1949
+ this.phase = "done";
1950
+ return false;
1951
+ }
1952
+ this.builder?.endContainer("object", depth - (this.targetDepth + 1), memberCount);
1953
+ if (depth === this.targetDepth + 1) return this.finishBuilder();
1954
+ return void 0;
1955
+ }
1956
+ this.builder?.endContainer("object", depth - this.targetDepth, memberCount);
1957
+ if (depth === this.targetDepth) return this.finishBuilder();
1958
+ return void 0;
1959
+ }
1960
+ onEndArray(depth, length) {
1961
+ this.path.endContainer();
1962
+ this.path.advance();
1963
+ if (this.phase !== "capturing") return void 0;
1964
+ if (this.windowed) {
1965
+ if (depth === this.targetDepth) {
1966
+ this.phase = "done";
1967
+ return false;
1968
+ }
1969
+ this.builder?.endContainer("array", depth - (this.targetDepth + 1), length);
1970
+ if (depth === this.targetDepth + 1) return this.finishBuilder();
1971
+ return void 0;
1972
+ }
1973
+ this.builder?.endContainer("array", depth - this.targetDepth, length);
1974
+ if (depth === this.targetDepth) return this.finishBuilder();
1975
+ return void 0;
1976
+ }
1977
+ onScalar(scalar, depth) {
1978
+ let verdict;
1979
+ if (this.phase === "seeking") {
1980
+ if (this.pointerMatches()) {
1981
+ this.beginTarget(scalar.type, depth);
1982
+ this.builder?.scalar(scalar, 0);
1983
+ verdict = this.finishBuilder();
1984
+ } else this.prefixMatches();
1985
+ } else if (this.phase === "capturing") {
1986
+ const stop = this.beginElement(scalar.type, depth);
1987
+ if (stop === false) return false;
1988
+ if (this.windowed) {
1989
+ this.builder?.scalar(scalar, depth - (this.targetDepth + 1));
1990
+ if (depth === this.targetDepth + 1) verdict = this.finishBuilder();
1991
+ } else {
1992
+ this.builder?.scalar(scalar, depth - this.targetDepth);
1993
+ }
1994
+ }
1995
+ this.path.advance();
1996
+ return verdict;
1997
+ }
1998
+ captureStrings(depth) {
1999
+ if (this.phase === "seeking") return this.pointerMatches();
2000
+ if (this.phase !== "capturing") return false;
2001
+ if (this.windowed && depth === this.targetDepth + 1) {
2002
+ return this.elementIndex >= this.windowOffset && this.elements.length < this.windowLimit;
2003
+ }
2004
+ return this.builder !== null && !this.builder.overBudget;
2005
+ }
2006
+ };
2007
+ async function selectJson(path2, options = {}) {
2008
+ const stat = statDataFile(path2);
2009
+ if ("ok" in stat) return stat;
2010
+ const pointer = options.pointer ?? "";
2011
+ const segments = parseJsonPointer(pointer);
2012
+ if (segments instanceof Error) return refusal("invalid-argument", segments.message, { path: path2 });
2013
+ const windowed = options.offset !== void 0 || options.limit !== void 0;
2014
+ const offset = windowed ? Math.max(0, Math.floor(options.offset ?? 0)) : null;
2015
+ const limit = Math.max(1, Math.min(JSON_SELECT_MAX_LIMIT, Math.floor(options.limit ?? JSON_SELECT_DEFAULT_LIMIT)));
2016
+ const stats = { bytesRead: 0, bom: false };
2017
+ const sink = new SelectSink(segments, offset, limit);
2018
+ let stopped = false;
2019
+ try {
2020
+ stopped = (await runParser(path2, sink, options.signal, stats)).stopped;
2021
+ } catch (error) {
2022
+ return refusalFromError(error, path2, options.signal);
2023
+ }
2024
+ if (sink.tooLarge) {
2025
+ const where = pointer || "the document root";
2026
+ return refusal(
2027
+ "selection-too-large",
2028
+ windowed ? `an element of the array at ${where} exceeds the ${SELECT_BUDGET_CHARS}-character selection budget; select a deeper pointer into that element, or a window of 1 to isolate it` : `the value at ${where} exceeds the ${SELECT_BUDGET_CHARS}-character selection budget; select a deeper pointer or an array window with offset and limit`,
2029
+ { path: path2 }
2030
+ );
2031
+ }
2032
+ if (!sink.found) {
2033
+ const matched = segments.slice(0, sink.deepestMatch);
2034
+ const matchedPointer = matched.map((segment) => `/${escapePointerSegment(segment)}`).join("");
2035
+ return refusal(
2036
+ "pointer-not-found",
2037
+ `no value at ${pointer}; the deepest existing prefix is ${matchedPointer === "" ? "the document root" : matchedPointer}`,
2038
+ { path: path2 }
2039
+ );
2040
+ }
2041
+ const notes = [];
2042
+ if (stats.bom) notes.push("a UTF-8 byte-order mark was stripped");
2043
+ if (stopped) {
2044
+ notes.push("reading stopped once the selection was complete; the rest of the document was not checked for syntax");
2045
+ }
2046
+ if (sink.cutStrings > 0) {
2047
+ notes.push(
2048
+ `${sink.cutStrings} string(s) longer than ${STRING_CAPTURE_CAP} characters were cut; each is a $truncated placeholder with its full length`
2049
+ );
2050
+ }
2051
+ if (sink.duplicateCount > 0) {
2052
+ notes.push(`${sink.duplicateCount} duplicate object key(s) inside the selection; the last value was kept`);
2053
+ }
2054
+ const precision = {
2055
+ count: sink.issues.length,
2056
+ first: sink.issues.slice(0, PRECISION_FIRST_CAP)
2057
+ };
2058
+ const base = {
2059
+ ok: true,
2060
+ format: "json",
2061
+ path: path2,
2062
+ bytes: stat.size,
2063
+ bytesScanned: stats.bytesRead,
2064
+ view: sink.cutStrings > 0 ? cutView() : exactView(),
2065
+ pointer,
2066
+ precision,
2067
+ duplicateKeys: {
2068
+ count: sink.duplicateCount,
2069
+ first: sink.duplicateFirst,
2070
+ checkedFully: sink.duplicatesCheckedFully
2071
+ },
2072
+ notes
2073
+ };
2074
+ if (windowed) {
2075
+ if (sink.targetType !== "array") {
2076
+ return refusal(
2077
+ "invalid-argument",
2078
+ `offset and limit apply to an array target; the value at ${pointer || "the document root"} is ${sink.targetType ?? "unknown"}`,
2079
+ { path: path2 }
2080
+ );
2081
+ }
2082
+ return {
2083
+ ...base,
2084
+ elements: sink.elements,
2085
+ offset,
2086
+ limit,
2087
+ returned: sink.elements.length,
2088
+ hasMore: sink.hasMore
2089
+ };
2090
+ }
2091
+ return { ...base, value: sink.value ?? null };
2092
+ }
2093
+ var ValidateSink = class {
2094
+ constructor(maxRows) {
2095
+ this.maxRows = maxRows;
2096
+ }
2097
+ maxRows;
2098
+ scanner = new StructureScanner();
2099
+ root = null;
2100
+ rows = 0;
2101
+ rowCount = null;
2102
+ stoppedAtRows = false;
2103
+ beginRow() {
2104
+ if (this.rows >= this.maxRows) {
2105
+ this.stoppedAtRows = true;
2106
+ return false;
2107
+ }
2108
+ this.rows += 1;
2109
+ return true;
2110
+ }
2111
+ onStartObject(depth) {
2112
+ if (depth === 0) this.root = "object";
2113
+ else if (depth === 1 && !this.beginRow()) return false;
2114
+ this.scanner.startContainer("object");
2115
+ return void 0;
2116
+ }
2117
+ onStartArray(depth) {
2118
+ if (depth === 0) this.root = "array";
2119
+ else if (depth === 1 && !this.beginRow()) return false;
2120
+ this.scanner.startContainer("array");
2121
+ return void 0;
2122
+ }
2123
+ onKey(key, depth) {
2124
+ if (depth === 1 && this.rows >= this.maxRows) {
2125
+ this.stoppedAtRows = true;
2126
+ return false;
2127
+ }
2128
+ this.scanner.key(key);
2129
+ return void 0;
2130
+ }
2131
+ onEndObject(depth, memberCount) {
2132
+ if (depth === 0) this.rowCount = memberCount;
2133
+ this.scanner.endContainer();
2134
+ return void 0;
2135
+ }
2136
+ onEndArray(depth, length) {
2137
+ if (depth === 0) this.rowCount = length;
2138
+ this.scanner.endContainer();
2139
+ return void 0;
2140
+ }
2141
+ onScalar(scalar, depth) {
2142
+ if (depth === 0) {
2143
+ this.root = scalar.type;
2144
+ this.rows = 1;
2145
+ this.rowCount = 1;
2146
+ } else if (depth === 1 && !this.beginRow()) return false;
2147
+ this.scanner.scalar(scalar);
2148
+ return void 0;
2149
+ }
2150
+ captureStrings() {
2151
+ return false;
2152
+ }
2153
+ };
2154
+ async function validateJson(path2, options = {}) {
2155
+ const stat = statDataFile(path2);
2156
+ if ("ok" in stat) return stat;
2157
+ const maxRows = resolveMaxRows(options.maxRows, JSON_DEFAULT_MAX_ROWS);
2158
+ const stats = { bytesRead: 0, bom: false };
2159
+ const sink = new ValidateSink(maxRows);
2160
+ const parser = new JsonStreamParser(sink);
2161
+ let syntaxError;
2162
+ try {
2163
+ let stopped = false;
2164
+ for await (const chunk of streamTextChunks(path2, { signal: options.signal, stats })) {
2165
+ if (!parser.push(chunk.text, chunk.byteOffset)) {
2166
+ stopped = true;
2167
+ break;
2168
+ }
2169
+ }
2170
+ if (!stopped) parser.end();
2171
+ throwIfAborted(options.signal, path2);
2172
+ } catch (error) {
2173
+ if (error instanceof DataRefusalError && (error.refusal.reason === "invalid-json" || error.refusal.reason === "nesting-too-deep")) {
2174
+ syntaxError = {
2175
+ message: error.refusal.message,
2176
+ ...error.refusal.line !== void 0 ? { line: error.refusal.line } : {},
2177
+ ...error.refusal.column !== void 0 ? { column: error.refusal.column } : {},
2178
+ ...error.refusal.byteOffset !== void 0 ? { byteOffset: error.refusal.byteOffset } : {}
2179
+ };
2180
+ } else {
2181
+ return refusalFromError(error, path2, options.signal);
2182
+ }
2183
+ }
2184
+ const complete = !sink.stoppedAtRows;
2185
+ const notes = [];
2186
+ if (stats.bom) notes.push("a UTF-8 byte-order mark was stripped");
2187
+ if (!complete) {
2188
+ notes.push(
2189
+ `validation incomplete: stopped after ${sink.rows} top-level rows; pass maxRows null to validate the whole document`
2190
+ );
2191
+ }
2192
+ if (sink.scanner.duplicateCount > 0)
2193
+ notes.push(`${sink.scanner.duplicateCount} duplicate object key(s); JSON.parse would keep the last value`);
2194
+ return {
2195
+ ok: true,
2196
+ format: "json",
2197
+ path: path2,
2198
+ bytes: stat.size,
2199
+ bytesScanned: stats.bytesRead,
2200
+ view: complete ? exactView() : sampledView(),
2201
+ valid: syntaxError !== void 0 ? false : complete ? true : null,
2202
+ complete,
2203
+ rowsScanned: sink.rows,
2204
+ rowCount: complete && syntaxError === void 0 ? sink.rowCount : null,
2205
+ root: sink.root,
2206
+ maxDepth: parser.maxDepth,
2207
+ duplicateKeys: sink.scanner.duplicates(),
2208
+ precision: sink.scanner.precision(),
2209
+ ...syntaxError !== void 0 ? { syntaxError } : {},
2210
+ notes
2211
+ };
2212
+ }
2213
+ var TextScanSink = class {
2214
+ scanner;
2215
+ root = null;
2216
+ keys = [];
2217
+ memberTypes = /* @__PURE__ */ new Map();
2218
+ currentKey = "";
2219
+ builder;
2220
+ constructor(pointerPrefix, budgetChars) {
2221
+ this.scanner = new StructureScanner(pointerPrefix);
2222
+ this.builder = budgetChars === null ? null : new JsonValueBuilder(budgetChars, "");
2223
+ }
2224
+ get value() {
2225
+ return this.builder?.value;
2226
+ }
2227
+ get valueTruncated() {
2228
+ return this.builder?.truncated ?? false;
2229
+ }
2230
+ noteMember(type, depth) {
2231
+ if (depth !== 1) return;
2232
+ if (this.root === "object") {
2233
+ if (!this.memberTypes.has(this.currentKey)) this.memberTypes.set(this.currentKey, type);
2234
+ }
2235
+ }
2236
+ onStartObject(depth) {
2237
+ if (depth === 0) this.root = "object";
2238
+ this.noteMember("object", depth);
2239
+ this.scanner.startContainer("object");
2240
+ this.builder?.startContainer("object", depth);
2241
+ return void 0;
2242
+ }
2243
+ onStartArray(depth) {
2244
+ if (depth === 0) this.root = "array";
2245
+ this.noteMember("array", depth);
2246
+ this.scanner.startContainer("array");
2247
+ this.builder?.startContainer("array", depth);
2248
+ return void 0;
2249
+ }
2250
+ onKey(key, depth) {
2251
+ this.scanner.key(key);
2252
+ if (depth === 1) {
2253
+ this.currentKey = key;
2254
+ this.keys.push(key);
2255
+ }
2256
+ this.builder?.key(key, depth);
2257
+ return void 0;
2258
+ }
2259
+ onEndObject(depth, memberCount) {
2260
+ this.scanner.endContainer();
2261
+ this.builder?.endContainer("object", depth, memberCount);
2262
+ return void 0;
2263
+ }
2264
+ onEndArray(depth, length) {
2265
+ this.scanner.endContainer();
2266
+ this.builder?.endContainer("array", depth, length);
2267
+ return void 0;
2268
+ }
2269
+ onScalar(scalar, depth) {
2270
+ if (depth === 0) this.root = scalar.type;
2271
+ this.noteMember(scalar.type, depth);
2272
+ this.scanner.scalar(scalar);
2273
+ this.builder?.scalar(scalar, depth);
2274
+ return void 0;
2275
+ }
2276
+ captureStrings() {
2277
+ return this.builder !== null && !this.builder.overBudget;
2278
+ }
2279
+ };
2280
+ function scanJsonText(text, options = {}) {
2281
+ const sink = new TextScanSink(options.pointerPrefix ?? "", options.materializeBudgetChars ?? null);
2282
+ const parser = new JsonStreamParser(sink);
2283
+ parser.push(text, 0);
2284
+ parser.end();
2285
+ return {
2286
+ root: sink.root ?? "null",
2287
+ keys: sink.keys,
2288
+ memberTypes: sink.memberTypes,
2289
+ maxDepth: parser.maxDepth,
2290
+ duplicateKeys: sink.scanner.duplicateCount,
2291
+ precision: [...sink.scanner.precisionFirst],
2292
+ value: sink.value,
2293
+ valueTruncated: sink.valueTruncated
2294
+ };
2295
+ }
2296
+
2297
+ // src/tools/data/jsonl.ts
2298
+ init_esm_shims();
2299
+ var JSONL_DEFAULT_SAMPLE_ROWS = 10;
2300
+ var JSONL_DEFAULT_MAX_ROWS = 1e5;
2301
+ var KEY_HISTOGRAM_CAP = 500;
2302
+ var INVALID_FIRST_CAP = 10;
2303
+ function oversizedMessage(chars) {
2304
+ return `line is ${chars} characters, over the ${JSONL_MAX_LINE_CHARS}-character limit for one JSONL record; skipped without being read (a whole JSON document saved as .jsonl looks like this: read it with format json)`;
2305
+ }
2306
+ var JSONL_MAX_LINE_CHARS = 1048576;
2307
+ async function forEachLine(path2, signal, stats, visitor) {
2308
+ let carry = "";
2309
+ let skipping = false;
2310
+ let skippedChars = 0;
2311
+ let line = 0;
2312
+ let stopped = false;
2313
+ const emit = (text) => {
2314
+ line += 1;
2315
+ const body = text.endsWith("\r") ? text.slice(0, -1) : text;
2316
+ if (body.trim().length === 0) {
2317
+ visitor.onBlank?.(line);
2318
+ return true;
2319
+ }
2320
+ return visitor.onLine(body, line);
2321
+ };
2322
+ const emitOversized = (chars) => {
2323
+ line += 1;
2324
+ return visitor.onOversized(line, chars);
2325
+ };
2326
+ outer: for await (const chunk of streamTextChunks(path2, { signal, stats })) {
2327
+ const text = chunk.text;
2328
+ let start = 0;
2329
+ for (; ; ) {
2330
+ const newline = text.indexOf("\n", start);
2331
+ if (newline === -1) break;
2332
+ const span = newline - start;
2333
+ if (skipping) {
2334
+ skipping = false;
2335
+ if (!emitOversized(skippedChars + span)) {
2336
+ stopped = true;
2337
+ break outer;
2338
+ }
2339
+ } else if (carry.length + span > JSONL_MAX_LINE_CHARS) {
2340
+ const chars = carry.length + span;
2341
+ carry = "";
2342
+ if (!emitOversized(chars)) {
2343
+ stopped = true;
2344
+ break outer;
2345
+ }
2346
+ } else {
2347
+ const lineText = carry.length === 0 ? text.slice(start, newline) : carry + text.slice(start, newline);
2348
+ carry = "";
2349
+ if (!emit(lineText)) {
2350
+ stopped = true;
2351
+ break outer;
2352
+ }
2353
+ }
2354
+ start = newline + 1;
2355
+ }
2356
+ const rest = text.length - start;
2357
+ if (rest === 0) continue;
2358
+ if (skipping) skippedChars += rest;
2359
+ else if (carry.length + rest > JSONL_MAX_LINE_CHARS) {
2360
+ skipping = true;
2361
+ skippedChars = carry.length + rest;
2362
+ carry = "";
2363
+ } else carry += text.slice(start);
2364
+ }
2365
+ throwIfAborted(signal, path2);
2366
+ if (!stopped) {
2367
+ if (skipping) emitOversized(skippedChars);
2368
+ else if (carry.length > 0 && !emit(carry)) stopped = true;
2369
+ }
2370
+ return { lines: line, stopped };
2371
+ }
2372
+ async function inspectJsonl(path2, options = {}) {
2373
+ const stat = statDataFile(path2);
2374
+ if ("ok" in stat) return stat;
2375
+ const sampleRows = Math.max(0, Math.min(1e3, Math.floor(options.sampleRows ?? JSONL_DEFAULT_SAMPLE_ROWS)));
2376
+ const maxRows = resolveMaxRows(options.maxRows, JSONL_DEFAULT_MAX_ROWS);
2377
+ const stats = { bytesRead: 0, bom: false };
2378
+ const state = {
2379
+ records: 0,
2380
+ blank: 0,
2381
+ stoppedAtRows: false,
2382
+ invalidCount: 0,
2383
+ invalidFirst: [],
2384
+ rootTypes: /* @__PURE__ */ new Map(),
2385
+ keys: /* @__PURE__ */ new Map(),
2386
+ keysTruncated: false,
2387
+ keyTypes: /* @__PURE__ */ new Map(),
2388
+ maxDepth: 0,
2389
+ duplicateCount: 0,
2390
+ duplicateFirstLine: null,
2391
+ precisionCount: 0,
2392
+ precisionFirst: [],
2393
+ sample: [],
2394
+ sampleCuts: 0
2395
+ };
2396
+ let scanOutcome;
2397
+ try {
2398
+ scanOutcome = await forEachLine(path2, options.signal, stats, {
2399
+ onBlank() {
2400
+ state.blank += 1;
2401
+ },
2402
+ onOversized(line, chars) {
2403
+ if (state.records >= maxRows) {
2404
+ state.stoppedAtRows = true;
2405
+ return false;
2406
+ }
2407
+ state.records += 1;
2408
+ state.invalidCount += 1;
2409
+ if (state.invalidFirst.length < INVALID_FIRST_CAP) {
2410
+ state.invalidFirst.push({ line, message: oversizedMessage(chars) });
2411
+ }
2412
+ return true;
2413
+ },
2414
+ onLine(text, line) {
2415
+ if (state.records >= maxRows) {
2416
+ state.stoppedAtRows = true;
2417
+ return false;
2418
+ }
2419
+ state.records += 1;
2420
+ const wantSample = state.sample.length < sampleRows;
2421
+ let scan;
2422
+ try {
2423
+ scan = scanJsonText(text, {
2424
+ pointerPrefix: "",
2425
+ materializeBudgetChars: wantSample ? SAMPLE_BUDGET_CHARS : null
2426
+ });
2427
+ } catch (error) {
2428
+ if (!(error instanceof DataRefusalError)) throw error;
2429
+ state.invalidCount += 1;
2430
+ if (state.invalidFirst.length < INVALID_FIRST_CAP) {
2431
+ state.invalidFirst.push({ line, message: error.refusal.message });
2432
+ }
2433
+ return true;
2434
+ }
2435
+ state.rootTypes.set(scan.root, (state.rootTypes.get(scan.root) ?? 0) + 1);
2436
+ if (scan.root === "object") {
2437
+ for (const key of new Set(scan.keys)) {
2438
+ const seen = state.keys.get(key);
2439
+ if (seen === void 0) {
2440
+ if (state.keys.size >= KEY_HISTOGRAM_CAP) {
2441
+ state.keysTruncated = true;
2442
+ continue;
2443
+ }
2444
+ state.keys.set(key, 1);
2445
+ } else state.keys.set(key, seen + 1);
2446
+ const type = scan.memberTypes.get(key);
2447
+ if (type === void 0) continue;
2448
+ let types = state.keyTypes.get(key);
2449
+ if (types === void 0) {
2450
+ types = /* @__PURE__ */ new Map();
2451
+ state.keyTypes.set(key, types);
2452
+ }
2453
+ types.set(type, (types.get(type) ?? 0) + 1);
2454
+ }
2455
+ }
2456
+ if (scan.maxDepth > state.maxDepth) state.maxDepth = scan.maxDepth;
2457
+ if (scan.duplicateKeys > 0) {
2458
+ state.duplicateCount += scan.duplicateKeys;
2459
+ if (state.duplicateFirstLine === null) state.duplicateFirstLine = line;
2460
+ }
2461
+ for (const issue of scan.precision) {
2462
+ state.precisionCount += 1;
2463
+ if (state.precisionFirst.length < PRECISION_FIRST_CAP) state.precisionFirst.push({ ...issue, line });
2464
+ }
2465
+ if (wantSample && scan.value !== void 0) {
2466
+ state.sample.push({ line, value: scan.value });
2467
+ if (scan.valueTruncated) state.sampleCuts += 1;
2468
+ }
2469
+ return true;
2470
+ }
2471
+ });
2472
+ } catch (error) {
2473
+ return refusalFromError(error, path2, options.signal);
2474
+ }
2475
+ const sampled = state.stoppedAtRows;
2476
+ const notes = [];
2477
+ if (stats.bom) notes.push("a UTF-8 byte-order mark was stripped");
2478
+ if (sampled) notes.push(sampledNotice(state.records, "records"));
2479
+ if (state.invalidCount > 0)
2480
+ notes.push(`${state.invalidCount} line(s) are not valid JSON and are listed with their fault`);
2481
+ if (state.keysTruncated) notes.push(`key histogram capped at ${KEY_HISTOGRAM_CAP} distinct keys`);
2482
+ if (state.sampleCuts > 0) {
2483
+ notes.push(
2484
+ `${state.sampleCuts} sample record(s) were cut to the preview budget and carry $summary or $truncated placeholders; the counts are exact`
2485
+ );
2486
+ }
2487
+ const keyTypes = {};
2488
+ for (const [key, types] of state.keyTypes) keyTypes[key] = histogramRecord(types);
2489
+ return {
2490
+ ok: true,
2491
+ format: "jsonl",
2492
+ path: path2,
2493
+ bytes: stat.size,
2494
+ bytesScanned: stats.bytesRead,
2495
+ view: sampled ? sampledView() : exactView(),
2496
+ rowsScanned: state.records,
2497
+ rowCount: sampled ? null : state.records,
2498
+ linesScanned: scanOutcome.lines,
2499
+ blankLines: state.blank,
2500
+ invalid: { count: state.invalidCount, first: state.invalidFirst },
2501
+ rootTypes: histogramRecord(state.rootTypes),
2502
+ keys: { histogram: histogramRecord(state.keys), truncated: state.keysTruncated },
2503
+ keyTypes,
2504
+ maxDepth: state.maxDepth,
2505
+ duplicateKeys: { count: state.duplicateCount, firstLine: state.duplicateFirstLine },
2506
+ precision: { count: state.precisionCount, first: state.precisionFirst },
2507
+ sample: state.sample,
2508
+ notes
2509
+ };
2510
+ }
2511
+ var JSONL_SELECT_DEFAULT_LIMIT = 50;
2512
+ var JSONL_SELECT_MAX_LIMIT = 1e3;
2513
+ var SELECT_LINE_BUDGET_CHARS = 1048576;
2514
+ async function selectJsonl(path2, options = {}) {
2515
+ const stat = statDataFile(path2);
2516
+ if ("ok" in stat) return stat;
2517
+ const offset = Math.max(0, Math.floor(options.offset ?? 0));
2518
+ const limit = Math.max(1, Math.min(JSONL_SELECT_MAX_LIMIT, Math.floor(options.limit ?? JSONL_SELECT_DEFAULT_LIMIT)));
2519
+ const stats = { bytesRead: 0, bom: false };
2520
+ const state = {
2521
+ records: 0,
2522
+ hasMore: false,
2523
+ out: [],
2524
+ precisionCount: 0,
2525
+ precisionFirst: [],
2526
+ duplicateCount: 0,
2527
+ duplicateFirstLine: null
2528
+ };
2529
+ try {
2530
+ await forEachLine(path2, options.signal, stats, {
2531
+ onOversized(line, chars) {
2532
+ const index = state.records;
2533
+ state.records += 1;
2534
+ if (index < offset) return true;
2535
+ if (state.out.length >= limit) {
2536
+ state.hasMore = true;
2537
+ return false;
2538
+ }
2539
+ state.out.push({ line, error: oversizedMessage(chars) });
2540
+ return true;
2541
+ },
2542
+ onLine(text, line) {
2543
+ const index = state.records;
2544
+ state.records += 1;
2545
+ if (index < offset) return true;
2546
+ if (state.out.length >= limit) {
2547
+ state.hasMore = true;
2548
+ return false;
2549
+ }
2550
+ try {
2551
+ const scan = scanJsonText(text, { materializeBudgetChars: SELECT_LINE_BUDGET_CHARS });
2552
+ for (const issue of scan.precision) {
2553
+ state.precisionCount += 1;
2554
+ if (state.precisionFirst.length < PRECISION_FIRST_CAP) state.precisionFirst.push({ ...issue, line });
2555
+ }
2556
+ if (scan.duplicateKeys > 0) {
2557
+ state.duplicateCount += scan.duplicateKeys;
2558
+ if (state.duplicateFirstLine === null) state.duplicateFirstLine = line;
2559
+ }
2560
+ state.out.push({ line, value: scan.value ?? null, truncated: scan.valueTruncated });
2561
+ } catch (error) {
2562
+ if (!(error instanceof DataRefusalError)) throw error;
2563
+ state.out.push({ line, error: error.refusal.message });
2564
+ }
2565
+ return true;
2566
+ }
2567
+ });
2568
+ } catch (error) {
2569
+ return refusalFromError(error, path2, options.signal);
2570
+ }
2571
+ const notes = [];
2572
+ if (stats.bom) notes.push("a UTF-8 byte-order mark was stripped");
2573
+ const truncated = state.out.filter((record) => "truncated" in record && record.truncated).length;
2574
+ if (truncated > 0) {
2575
+ notes.push(
2576
+ `${truncated} record(s) were cut to the per-record budget or the string cap; $summary and $truncated placeholders mark the cuts`
2577
+ );
2578
+ }
2579
+ if (state.duplicateCount > 0) {
2580
+ notes.push(`${state.duplicateCount} duplicate object key(s) in the returned records; the last value was kept`);
2581
+ }
2582
+ return {
2583
+ ok: true,
2584
+ format: "jsonl",
2585
+ path: path2,
2586
+ bytes: stat.size,
2587
+ bytesScanned: stats.bytesRead,
2588
+ view: truncated > 0 ? cutView() : exactView(),
2589
+ offset,
2590
+ limit,
2591
+ returned: state.out.length,
2592
+ hasMore: state.hasMore,
2593
+ rowsScanned: state.records,
2594
+ records: state.out,
2595
+ precision: { count: state.precisionCount, first: state.precisionFirst },
2596
+ duplicateKeys: { count: state.duplicateCount, firstLine: state.duplicateFirstLine },
2597
+ notes
2598
+ };
2599
+ }
2600
+ async function validateJsonl(path2, options = {}) {
2601
+ const stat = statDataFile(path2);
2602
+ if ("ok" in stat) return stat;
2603
+ const maxRows = resolveMaxRows(options.maxRows, JSONL_DEFAULT_MAX_ROWS);
2604
+ const stats = { bytesRead: 0, bom: false };
2605
+ const state = {
2606
+ records: 0,
2607
+ blank: 0,
2608
+ stoppedAtRows: false,
2609
+ invalidCount: 0,
2610
+ invalidFirst: [],
2611
+ duplicateCount: 0,
2612
+ duplicateFirstLine: null,
2613
+ precisionCount: 0,
2614
+ precisionFirst: []
2615
+ };
2616
+ let scanOutcome;
2617
+ try {
2618
+ scanOutcome = await forEachLine(path2, options.signal, stats, {
2619
+ onBlank() {
2620
+ state.blank += 1;
2621
+ },
2622
+ onOversized(line, chars) {
2623
+ if (state.records >= maxRows) {
2624
+ state.stoppedAtRows = true;
2625
+ return false;
2626
+ }
2627
+ state.records += 1;
2628
+ state.invalidCount += 1;
2629
+ if (state.invalidFirst.length < INVALID_FIRST_CAP) {
2630
+ state.invalidFirst.push({ line, message: oversizedMessage(chars) });
2631
+ }
2632
+ return true;
2633
+ },
2634
+ onLine(text, line) {
2635
+ if (state.records >= maxRows) {
2636
+ state.stoppedAtRows = true;
2637
+ return false;
2638
+ }
2639
+ state.records += 1;
2640
+ try {
2641
+ const scan = scanJsonText(text);
2642
+ if (scan.duplicateKeys > 0) {
2643
+ state.duplicateCount += scan.duplicateKeys;
2644
+ if (state.duplicateFirstLine === null) state.duplicateFirstLine = line;
2645
+ }
2646
+ for (const issue of scan.precision) {
2647
+ state.precisionCount += 1;
2648
+ if (state.precisionFirst.length < PRECISION_FIRST_CAP) state.precisionFirst.push({ ...issue, line });
2649
+ }
2650
+ } catch (error) {
2651
+ if (!(error instanceof DataRefusalError)) throw error;
2652
+ state.invalidCount += 1;
2653
+ if (state.invalidFirst.length < INVALID_FIRST_CAP) {
2654
+ state.invalidFirst.push({ line, message: error.refusal.message });
2655
+ }
2656
+ }
2657
+ return true;
2658
+ }
2659
+ });
2660
+ } catch (error) {
2661
+ return refusalFromError(error, path2, options.signal);
2662
+ }
2663
+ const complete = !state.stoppedAtRows;
2664
+ const notes = [];
2665
+ if (stats.bom) notes.push("a UTF-8 byte-order mark was stripped");
2666
+ if (!complete) {
2667
+ notes.push(
2668
+ `validation incomplete: stopped after ${state.records} records; pass maxRows null to validate the whole file`
2669
+ );
2670
+ }
2671
+ if (state.invalidCount > 0) notes.push(`${state.invalidCount} line(s) are not valid JSON`);
2672
+ if (state.duplicateCount > 0)
2673
+ notes.push(`${state.duplicateCount} duplicate object key(s); JSON.parse would keep the last value`);
2674
+ return {
2675
+ ok: true,
2676
+ format: "jsonl",
2677
+ path: path2,
2678
+ bytes: stat.size,
2679
+ bytesScanned: stats.bytesRead,
2680
+ view: complete ? exactView() : sampledView(),
2681
+ valid: state.invalidCount > 0 ? false : complete ? true : null,
2682
+ complete,
2683
+ rowsScanned: state.records,
2684
+ rowCount: complete ? state.records : null,
2685
+ linesScanned: scanOutcome.lines,
2686
+ blankLines: state.blank,
2687
+ invalid: { count: state.invalidCount, first: state.invalidFirst },
2688
+ duplicateKeys: { count: state.duplicateCount, firstLine: state.duplicateFirstLine },
2689
+ precision: { count: state.precisionCount, first: state.precisionFirst },
2690
+ notes
2691
+ };
2692
+ }
2693
+
2694
+ // src/tools/data/index.ts
2695
+ var EXTENSION_FORMATS = {
2696
+ ".csv": "csv",
2697
+ ".tsv": "tsv",
2698
+ ".tab": "tsv",
2699
+ ".json": "json",
2700
+ ".jsonl": "jsonl",
2701
+ ".ndjson": "jsonl"
2702
+ };
2703
+ var SNIFF_BYTES = 4096;
2704
+ async function detectDataFormat(path2, explicit) {
2705
+ if (explicit !== void 0 && explicit !== null) {
2706
+ const normalized = explicit.trim().toLowerCase();
2707
+ return isDataFormat(normalized) ? normalized : null;
2708
+ }
2709
+ const byExtension = EXTENSION_FORMATS[extname(path2).toLowerCase()];
2710
+ if (byExtension !== void 0) return byExtension;
2711
+ let text;
2712
+ try {
2713
+ const handle = await open(path2, "r");
2714
+ try {
2715
+ const buffer = Buffer.alloc(SNIFF_BYTES);
2716
+ const { bytesRead } = await handle.read(buffer, 0, SNIFF_BYTES, 0);
2717
+ text = buffer.subarray(0, bytesRead).toString("utf8");
2718
+ } finally {
2719
+ await handle.close();
2720
+ }
2721
+ } catch {
2722
+ return null;
2723
+ }
2724
+ if (text.startsWith("\uFEFF")) text = text.slice(1);
2725
+ const trimmed = text.trimStart();
2726
+ if (trimmed.length === 0) return null;
2727
+ const first = trimmed[0];
2728
+ if (first === "[" || first === "{") {
2729
+ const lines = trimmed.split(/\r?\n/u).filter((line) => line.trim().length > 0);
2730
+ const second = lines[1]?.trimStart()[0];
2731
+ if (lines.length > 1 && (second === "{" || second === "[") && (lines[0] ?? "").trimEnd().endsWith("}")) {
2732
+ return "jsonl";
2733
+ }
2734
+ return "json";
2735
+ }
2736
+ const firstLine = trimmed.split(/\r?\n/u)[0] ?? "";
2737
+ if (firstLine.includes(" ")) return "tsv";
2738
+ if (firstLine.includes(",") || firstLine.includes(";") || firstLine.includes("|")) return "csv";
2739
+ return null;
2740
+ }
2741
+ function unsupported(path2, explicit) {
2742
+ const named = explicit === void 0 || explicit === null ? "" : ` (${JSON.stringify(explicit)})`;
2743
+ return refusal(
2744
+ "unsupported-format",
2745
+ `${path2} is not a supported structured-data format${named}; supported formats are ${DATA_FORMATS.join(", ")}. Pass format explicitly for a file with an unusual extension, or use run_script with a library for binary scientific formats.`,
2746
+ { path: path2, supported: DATA_FORMATS }
2747
+ );
2748
+ }
2749
+ async function inspectData(path2, options = {}) {
2750
+ const stat = statDataFile(path2);
2751
+ if ("ok" in stat) return stat;
2752
+ const format = await detectDataFormat(path2, options.format);
2753
+ if (format === null) return unsupported(path2, options.format);
2754
+ const shared = {
2755
+ ...options.sampleRows !== void 0 ? { sampleRows: options.sampleRows } : {},
2756
+ ...options.maxRows !== void 0 ? { maxRows: options.maxRows } : {},
2757
+ signal: options.signal
2758
+ };
2759
+ try {
2760
+ switch (format) {
2761
+ case "csv":
2762
+ case "tsv":
2763
+ return await inspectCsv(path2, {
2764
+ ...shared,
2765
+ format,
2766
+ ...options.delimiter !== void 0 ? { delimiter: options.delimiter } : {},
2767
+ ...options.header !== void 0 ? { header: options.header } : {}
2768
+ });
2769
+ case "json":
2770
+ return await inspectJson(path2, shared);
2771
+ case "jsonl":
2772
+ return await inspectJsonl(path2, shared);
2773
+ }
2774
+ } catch (error) {
2775
+ return refusalFromError(error, path2, options.signal);
2776
+ }
2777
+ }
2778
+ async function selectData(path2, options = {}) {
2779
+ const stat = statDataFile(path2);
2780
+ if ("ok" in stat) return stat;
2781
+ const format = await detectDataFormat(path2, options.format);
2782
+ if (format === null) return unsupported(path2, options.format);
2783
+ const window = {
2784
+ ...options.offset !== void 0 ? { offset: options.offset } : {},
2785
+ ...options.limit !== void 0 ? { limit: options.limit } : {},
2786
+ signal: options.signal
2787
+ };
2788
+ try {
2789
+ switch (format) {
2790
+ case "csv":
2791
+ case "tsv":
2792
+ return await selectCsv(path2, {
2793
+ ...window,
2794
+ format,
2795
+ ...options.delimiter !== void 0 ? { delimiter: options.delimiter } : {},
2796
+ ...options.header !== void 0 ? { header: options.header } : {},
2797
+ ...options.columns !== void 0 ? { columns: options.columns } : {}
2798
+ });
2799
+ case "json":
2800
+ if (options.columns !== void 0) {
2801
+ return refusal("invalid-argument", "columns applies to CSV/TSV; use pointer for a JSON document", { path: path2 });
2802
+ }
2803
+ return await selectJson(path2, {
2804
+ ...window,
2805
+ ...options.pointer !== void 0 ? { pointer: options.pointer } : {}
2806
+ });
2807
+ case "jsonl":
2808
+ if (options.pointer !== void 0) {
2809
+ return refusal(
2810
+ "invalid-argument",
2811
+ "pointer applies to a JSON document; JSONL selects records by offset and limit",
2812
+ {
2813
+ path: path2
2814
+ }
2815
+ );
2816
+ }
2817
+ return await selectJsonl(path2, window);
2818
+ }
2819
+ } catch (error) {
2820
+ return refusalFromError(error, path2, options.signal);
2821
+ }
2822
+ }
2823
+ async function validateData(path2, options = {}) {
2824
+ const stat = statDataFile(path2);
2825
+ if ("ok" in stat) return stat;
2826
+ const format = await detectDataFormat(path2, options.format);
2827
+ if (format === null) return unsupported(path2, options.format);
2828
+ const shared = {
2829
+ ...options.maxRows !== void 0 ? { maxRows: options.maxRows } : {},
2830
+ signal: options.signal
2831
+ };
2832
+ try {
2833
+ switch (format) {
2834
+ case "csv":
2835
+ case "tsv":
2836
+ return await validateCsv(path2, {
2837
+ ...shared,
2838
+ format,
2839
+ ...options.delimiter !== void 0 ? { delimiter: options.delimiter } : {},
2840
+ ...options.header !== void 0 ? { header: options.header } : {}
2841
+ });
2842
+ case "json":
2843
+ return await validateJson(path2, shared);
2844
+ case "jsonl":
2845
+ return await validateJsonl(path2, shared);
2846
+ }
2847
+ } catch (error) {
2848
+ return refusalFromError(error, path2, options.signal);
2849
+ }
2850
+ }
2851
+
2852
+ // src/tools/gateway/data-tool.ts
2853
+ function isDataOp(value) {
2854
+ return DATA_OPS.includes(value);
2855
+ }
2856
+ function countResult(op, payload) {
2857
+ if (op === "select") {
2858
+ const result = payload;
2859
+ const rows = result.rows ?? result.records ?? result.elements;
2860
+ const returned = typeof result.returned === "number" ? result.returned : Array.isArray(rows) ? rows.length : 1;
2861
+ const offset = typeof result.offset === "number" ? result.offset : 0;
2862
+ const limit = typeof result.limit === "number" ? result.limit : returned;
2863
+ const hasMore = result.hasMore === true;
2864
+ const total = typeof result.total === "number" ? result.total : hasMore ? null : offset + returned;
2865
+ return {
2866
+ unit: "entries",
2867
+ shownCount: returned,
2868
+ totalCount: total,
2869
+ truncated: hasMore,
2870
+ ...hasMore ? { next: `offset=${offset + limit}` } : {}
2871
+ };
2872
+ }
2873
+ return { unit: "results", shownCount: 1, totalCount: 1, truncated: false };
2874
+ }
2875
+ function describeDataView(view) {
2876
+ const flags = typeof view === "object" && view !== null ? view : {};
2877
+ if (flags.exact === true) return "exact";
2878
+ const parts = [...flags.sampled === true ? ["sampled"] : [], ...flags.converted === true ? ["converted"] : []];
2879
+ return parts.length > 0 ? parts.join(", ") : "value cut to budget";
2880
+ }
2881
+ function refusalResult(op, refusal2) {
2882
+ return {
2883
+ kind: "error",
2884
+ message: `data: ${op} refused (${refusal2.reason}): ${refusal2.message}`,
2885
+ details: { refusal: refusal2 }
2886
+ };
2887
+ }
2888
+ function createDataTool(deps = {}) {
2889
+ const getCwd = deps.getCwd ?? (() => process.cwd());
2890
+ return {
2891
+ ...dataToolSurface,
2892
+ prepareAdmissionArguments: (args) => prepareDataAdmissionArguments(args, getCwd()),
2893
+ async run(rawArgs, options) {
2894
+ const args = prepareDataArguments(rawArgs);
2895
+ const op = typeof args.op === "string" ? args.op : "";
2896
+ if (!isDataOp(op)) {
2897
+ return { kind: "error", message: `data: op must be inspect, select, or validate; got '${op}'` };
2898
+ }
2899
+ if (typeof args.path !== "string" || args.path.trim().length === 0) {
2900
+ return { kind: "error", message: "data: path is required" };
2901
+ }
2902
+ const target = resolveToCwd(args.path.trim(), getCwd());
2903
+ const reservation = reserveObservation(DATA_OBSERVATION_SELF_CAP_BYTES, options);
2904
+ if (reservation.exhausted) {
2905
+ return observationBudgetExhausted({
2906
+ tool: DATA_TOOL_NAME,
2907
+ unit: op === "select" ? "entries" : "results",
2908
+ reservation,
2909
+ subject: `${op} ${path.relative(getCwd(), target) || target}`,
2910
+ hint: "Continue in a follow-up turn."
2911
+ });
2912
+ }
2913
+ commitObservationReservation(reservation);
2914
+ try {
2915
+ const format = typeof args.format === "string" ? args.format : void 0;
2916
+ const delimiter = typeof args.delimiter === "string" ? args.delimiter : void 0;
2917
+ const header = headerArg(args.header);
2918
+ const signal = options?.signal;
2919
+ let result;
2920
+ if (op === "inspect") {
2921
+ const inspectOptions = {
2922
+ ...format !== void 0 ? { format } : {},
2923
+ ...delimiter !== void 0 ? { delimiter } : {},
2924
+ ...header !== void 0 ? { header } : {},
2925
+ ...typeof args.sample_rows === "number" ? { sampleRows: args.sample_rows } : {},
2926
+ ...args.max_rows === null || typeof args.max_rows === "number" ? { maxRows: args.max_rows } : {},
2927
+ signal
2928
+ };
2929
+ result = await inspectData(target, inspectOptions);
2930
+ } else if (op === "select") {
2931
+ const selectOptions = {
2932
+ ...format !== void 0 ? { format } : {},
2933
+ ...delimiter !== void 0 ? { delimiter } : {},
2934
+ ...header !== void 0 ? { header } : {},
2935
+ ...typeof args.offset === "number" ? { offset: args.offset } : {},
2936
+ ...typeof args.limit === "number" ? { limit: args.limit } : {},
2937
+ ...Array.isArray(args.columns) ? { columns: args.columns } : {},
2938
+ ...typeof args.pointer === "string" ? { pointer: args.pointer } : {},
2939
+ signal
2940
+ };
2941
+ result = await selectData(target, selectOptions);
2942
+ } else {
2943
+ const validateOptions = {
2944
+ ...format !== void 0 ? { format } : {},
2945
+ ...delimiter !== void 0 ? { delimiter } : {},
2946
+ ...header !== void 0 ? { header } : {},
2947
+ ...args.max_rows === null || typeof args.max_rows === "number" ? { maxRows: args.max_rows } : {},
2948
+ signal
2949
+ };
2950
+ result = await validateData(target, validateOptions);
2951
+ }
2952
+ if (isDataRefusal(result)) {
2953
+ releaseObservation(reservation);
2954
+ return refusalResult(op, result);
2955
+ }
2956
+ const counted = countResult(op, result);
2957
+ return finalizeObservation({
2958
+ tool: DATA_TOOL_NAME,
2959
+ unit: counted.unit,
2960
+ format: "json",
2961
+ output: JSON.stringify(result),
2962
+ shownCount: counted.shownCount,
2963
+ totalCount: counted.totalCount,
2964
+ truncated: counted.truncated,
2965
+ ...counted.next !== void 0 ? { next: counted.next } : {},
2966
+ details: { op, path: target, format: result.format, view: result.view, viewLabel: describeDataView(result.view) },
2967
+ reservation,
2968
+ ...options ? { options } : {}
2969
+ });
2970
+ } catch (error) {
2971
+ releaseObservation(reservation);
2972
+ return { kind: "error", message: `data: ${error instanceof Error ? error.message : String(error)}` };
2973
+ }
2974
+ }
2975
+ };
2976
+ }
2977
+ var dataTool = createDataTool();
2978
+ export {
2979
+ DATA_OBSERVATION_SELF_CAP_BYTES,
2980
+ DATA_TOOL_NAME,
2981
+ createDataTool,
2982
+ dataTool,
2983
+ dataToolSurface,
2984
+ prepareDataArguments
2985
+ };
2986
+ //# sourceMappingURL=data-tool-JJPBGMQJ.js.map