@cryptiklemur/lattice 1.47.0 → 2.0.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 (597) hide show
  1. package/README.md +14 -36
  2. package/bin/lattice +5 -21
  3. package/dist/client/assets/abap-DOv5zRgd.js +1 -0
  4. package/dist/client/assets/actionscript-3-D_b0n2Ff.js +1 -0
  5. package/dist/client/assets/ada-C6m8O36S.js +1 -0
  6. package/dist/client/assets/andromeeda-LdzAHaKR.js +1 -0
  7. package/dist/client/assets/angular-html-BBi1Szz5.js +1 -0
  8. package/dist/client/assets/angular-ts-2PMpSPqc.js +1 -0
  9. package/dist/client/assets/apache-CE7PmWoU.js +1 -0
  10. package/dist/client/assets/apex-DOfNfL0V.js +1 -0
  11. package/dist/client/assets/apl-B-NEtBvQ.js +1 -0
  12. package/dist/client/assets/applescript-D4zGaScB.js +1 -0
  13. package/dist/client/assets/ara-DMoCP0pJ.js +1 -0
  14. package/dist/client/assets/asciidoc-BkmPq932.js +1 -0
  15. package/dist/client/assets/asm-ClIKbvsu.js +1 -0
  16. package/dist/client/assets/astro-mxH1DA5Z.js +1 -0
  17. package/dist/client/assets/aurora-x-DTcNXZIS.js +1 -0
  18. package/dist/client/assets/awk-D1ZOsISX.js +1 -0
  19. package/dist/client/assets/ayu-dark-DpNcORnA.js +1 -0
  20. package/dist/client/assets/ayu-light-lHqf0ddo.js +1 -0
  21. package/dist/client/assets/ayu-mirage-Dji5RWiH.js +1 -0
  22. package/dist/client/assets/ballerina-H14_EqPr.js +1 -0
  23. package/dist/client/assets/bat-cyb3gF8B.js +1 -0
  24. package/dist/client/assets/beancount-D84pBacF.js +1 -0
  25. package/dist/client/assets/berry-B29XeKK4.js +1 -0
  26. package/dist/client/assets/bibtex-Hs7VvQaV.js +1 -0
  27. package/dist/client/assets/bicep-CugTE5CQ.js +1 -0
  28. package/dist/client/assets/bird2-mieRHotO.js +1 -0
  29. package/dist/client/assets/blade-BUQ9XSm3.js +1 -0
  30. package/dist/client/assets/bsl-BRmzGEWg.js +1 -0
  31. package/dist/client/assets/c-DrQixLw7.js +1 -0
  32. package/dist/client/assets/c3-Dx2gByXW.js +1 -0
  33. package/dist/client/assets/cadence-CCTSwj3w.js +1 -0
  34. package/dist/client/assets/cairo-CaIu88t6.js +1 -0
  35. package/dist/client/assets/catppuccin-frappe-DQrU04q0.js +1 -0
  36. package/dist/client/assets/catppuccin-latte-B_oiWZka.js +1 -0
  37. package/dist/client/assets/catppuccin-macchiato-D8VB2qi4.js +1 -0
  38. package/dist/client/assets/catppuccin-mocha-5vkMJ1Mb.js +1 -0
  39. package/dist/client/assets/clarity-BbUNTPrg.js +1 -0
  40. package/dist/client/assets/clojure-Bcw7lCta.js +1 -0
  41. package/dist/client/assets/cmake-DM0FE-T9.js +1 -0
  42. package/dist/client/assets/cobol-42amjOMh.js +1 -0
  43. package/dist/client/assets/codeowners-CBvEPOlS.js +1 -0
  44. package/dist/client/assets/codeql-CjS8Tp16.js +1 -0
  45. package/dist/client/assets/coffee-CMSEUKyy.js +1 -0
  46. package/dist/client/assets/common-lisp-BCx4dVK8.js +1 -0
  47. package/dist/client/assets/coq-Ddo7YIsR.js +1 -0
  48. package/dist/client/assets/cpp-C4yJBzl2.js +1 -0
  49. package/dist/client/assets/crystal-DZ27EoiA.js +1 -0
  50. package/dist/client/assets/csharp-Kzd7Ey2d.js +1 -0
  51. package/dist/client/assets/css-CdQwkSNm.js +1 -0
  52. package/dist/client/assets/csv-DGwgERVJ.js +1 -0
  53. package/dist/client/assets/cue-CMabdDG0.js +1 -0
  54. package/dist/client/assets/cypher-CJUzJAhQ.js +1 -0
  55. package/dist/client/assets/d-BvLF4qGs.js +1 -0
  56. package/dist/client/assets/dark-plus-BMwvn5lx.js +1 -0
  57. package/dist/client/assets/dart-DxXbDeKR.js +1 -0
  58. package/dist/client/assets/dax-BvrCypuS.js +1 -0
  59. package/dist/client/assets/desktop-BEul_kAS.js +1 -0
  60. package/dist/client/assets/diff-B7rhrwA5.js +1 -0
  61. package/dist/client/assets/dist-CBRIe7YG.js +153 -0
  62. package/dist/client/assets/docker-9Zbx0dQX.js +1 -0
  63. package/dist/client/assets/dotenv-C0epktMv.js +1 -0
  64. package/dist/client/assets/dracula-CBD4ckb0.js +1 -0
  65. package/dist/client/assets/dracula-soft-CuGBZj_h.js +1 -0
  66. package/dist/client/assets/dream-maker-D6UB367x.js +1 -0
  67. package/dist/client/assets/edge-J8VemHZC.js +1 -0
  68. package/dist/client/assets/elixir-DU66qSn_.js +1 -0
  69. package/dist/client/assets/elm-8cz1JjRg.js +1 -0
  70. package/dist/client/assets/emacs-lisp-DFyMFAZA.js +1 -0
  71. package/dist/client/assets/erb-DMl63J6s.js +1 -0
  72. package/dist/client/assets/erlang-LvhGhZI3.js +1 -0
  73. package/dist/client/assets/everforest-dark-BhFNrp2k.js +1 -0
  74. package/dist/client/assets/everforest-light-CpIbZ9aT.js +1 -0
  75. package/dist/client/assets/fennel-CH1ohGYX.js +1 -0
  76. package/dist/client/assets/fish-D2X4h_sR.js +1 -0
  77. package/dist/client/assets/fluent-B_In4uB6.js +1 -0
  78. package/dist/client/assets/fortran-fixed-form-BXvkHMbK.js +1 -0
  79. package/dist/client/assets/fortran-free-form-Bw_JZ1tj.js +1 -0
  80. package/dist/client/assets/fsharp-uxIU8dwY.js +1 -0
  81. package/dist/client/assets/gdresource-DkI-mZL2.js +1 -0
  82. package/dist/client/assets/gdscript-DDro0rs8.js +1 -0
  83. package/dist/client/assets/gdshader-DkUeC1ld.js +1 -0
  84. package/dist/client/assets/genie-khT2hrp-.js +1 -0
  85. package/dist/client/assets/gherkin-CPELKal0.js +1 -0
  86. package/dist/client/assets/git-commit-a3TktZ3A.js +1 -0
  87. package/dist/client/assets/git-rebase-DjlZL8cj.js +1 -0
  88. package/dist/client/assets/github-dark-DQp1Qkx5.js +1 -0
  89. package/dist/client/assets/github-dark-default-BroO-mT3.js +1 -0
  90. package/dist/client/assets/github-dark-dimmed-D8UZ8uTL.js +1 -0
  91. package/dist/client/assets/github-dark-high-contrast-CM0RRMCj.js +1 -0
  92. package/dist/client/assets/github-light-BRTmX4Ht.js +1 -0
  93. package/dist/client/assets/github-light-default-dl7biQ4g.js +1 -0
  94. package/dist/client/assets/github-light-high-contrast-Cvzq8ZXJ.js +1 -0
  95. package/dist/client/assets/gleam-7UVjplRF.js +1 -0
  96. package/dist/client/assets/glimmer-js-Fu7vOQY-.js +1 -0
  97. package/dist/client/assets/glimmer-ts-AJljRs0A.js +1 -0
  98. package/dist/client/assets/glsl-CfodGzSv.js +1 -0
  99. package/dist/client/assets/gn-EcrZPIZo.js +1 -0
  100. package/dist/client/assets/gnuplot-CcsFlqcz.js +1 -0
  101. package/dist/client/assets/go-TqNfhUhh.js +1 -0
  102. package/dist/client/assets/graphql-C8GPKPx1.js +1 -0
  103. package/dist/client/assets/groovy-bfrzFpSZ.js +1 -0
  104. package/dist/client/assets/gruvbox-dark-hard-CBFL_VqK.js +1 -0
  105. package/dist/client/assets/gruvbox-dark-medium-Dn18r-Yz.js +1 -0
  106. package/dist/client/assets/gruvbox-dark-soft-DUyKWd02.js +1 -0
  107. package/dist/client/assets/gruvbox-light-hard-DV9RwKs4.js +1 -0
  108. package/dist/client/assets/gruvbox-light-medium-Ba-VIg48.js +1 -0
  109. package/dist/client/assets/gruvbox-light-soft-CVIZMKFx.js +1 -0
  110. package/dist/client/assets/hack-Gp6OuE21.js +1 -0
  111. package/dist/client/assets/haml-BOyG6GfM.js +1 -0
  112. package/dist/client/assets/handlebars-B9IoVRxd.js +1 -0
  113. package/dist/client/assets/haskell-DzEtL6Zk.js +1 -0
  114. package/dist/client/assets/haxe-wLDEcRoz.js +1 -0
  115. package/dist/client/assets/hcl-C1fs3gTM.js +1 -0
  116. package/dist/client/assets/hjson-B4b85MZo.js +1 -0
  117. package/dist/client/assets/hlsl-JhqkHhML.js +1 -0
  118. package/dist/client/assets/horizon-DMOEeSnA.js +1 -0
  119. package/dist/client/assets/horizon-bright-CPVackS9.js +1 -0
  120. package/dist/client/assets/houston-DSlR9wH9.js +1 -0
  121. package/dist/client/assets/html-CFrSukiU.js +1 -0
  122. package/dist/client/assets/html-derivative-D0_gRK_M.js +1 -0
  123. package/dist/client/assets/http-D4MmFixi.js +1 -0
  124. package/dist/client/assets/hurl-D1xbk-LS.js +1 -0
  125. package/dist/client/assets/hxml-Bdi_kWeE.js +1 -0
  126. package/dist/client/assets/hy-uAHU8420.js +1 -0
  127. package/dist/client/assets/imba-CPCwfD-G.js +1 -0
  128. package/dist/client/assets/index-DrTbNMzI.css +2 -0
  129. package/dist/client/assets/index-ZIuI5BCP.js +284 -0
  130. package/dist/client/assets/ini-2Ew1Qzj6.js +1 -0
  131. package/dist/client/assets/java-CfPMY1Dv.js +1 -0
  132. package/dist/client/assets/javascript-B8vNHeqm.js +1 -0
  133. package/dist/client/assets/jinja-CF0K8bFV.js +1 -0
  134. package/dist/client/assets/jison-BP7my5TL.js +1 -0
  135. package/dist/client/assets/json-TeXNjpMZ.js +1 -0
  136. package/dist/client/assets/json5-Dl8gAgq4.js +1 -0
  137. package/dist/client/assets/jsonc-C9b23pMf.js +1 -0
  138. package/dist/client/assets/jsonl-DkF3QjsY.js +1 -0
  139. package/dist/client/assets/jsonnet-DH4UkOBo.js +1 -0
  140. package/dist/client/assets/jssm-CBV9_O8o.js +1 -0
  141. package/dist/client/assets/jsx-C86NmHc2.js +1 -0
  142. package/dist/client/assets/julia-C58U_aQP.js +1 -0
  143. package/dist/client/assets/just-h6Vco8Qu.js +1 -0
  144. package/dist/client/assets/kanagawa-dragon-DLDXA4f2.js +1 -0
  145. package/dist/client/assets/kanagawa-lotus-qAvw6eOU.js +1 -0
  146. package/dist/client/assets/kanagawa-wave-DFO_g5Mb.js +1 -0
  147. package/dist/client/assets/kdl-BQl-X5Uf.js +1 -0
  148. package/dist/client/assets/kotlin-d6oenWPH.js +1 -0
  149. package/dist/client/assets/kusto-Cpu9Tdho.js +1 -0
  150. package/dist/client/assets/laserwave-Bbquw0Nf.js +1 -0
  151. package/dist/client/assets/latex-DRsNisjT.js +1 -0
  152. package/dist/client/assets/lean-CvyEisyW.js +1 -0
  153. package/dist/client/assets/less-B9RQiV1N.js +1 -0
  154. package/dist/client/assets/light-plus-Ch1Usv7R.js +1 -0
  155. package/dist/client/assets/liquid-C9jXC9M7.js +1 -0
  156. package/dist/client/assets/llvm-DtrwjsAs.js +1 -0
  157. package/dist/client/assets/log-JKbKuM4J.js +1 -0
  158. package/dist/client/assets/logo-BsxZM_eb.js +1 -0
  159. package/dist/client/assets/lua-BUYvdn-F.js +1 -0
  160. package/dist/client/assets/luau-D9oeBRnv.js +1 -0
  161. package/dist/client/assets/make-DLuqI3Sa.js +1 -0
  162. package/dist/client/assets/markdown-hfQzyr6v.js +1 -0
  163. package/dist/client/assets/marko-BqB4tqw-.js +1 -0
  164. package/dist/client/assets/material-theme-darker-yvetTWEr.js +1 -0
  165. package/dist/client/assets/material-theme-kX26WiJU.js +1 -0
  166. package/dist/client/assets/material-theme-lighter-L4j3qddN.js +1 -0
  167. package/dist/client/assets/material-theme-ocean-BnNk1wNQ.js +1 -0
  168. package/dist/client/assets/material-theme-palenight-W0qbGyud.js +1 -0
  169. package/dist/client/assets/matlab-Cz4xBfaA.js +1 -0
  170. package/dist/client/assets/mdc-C8Rs68Nw.js +1 -0
  171. package/dist/client/assets/mdx-Crds6sJw.js +1 -0
  172. package/dist/client/assets/mermaid-Bk1sayFm.js +1 -0
  173. package/dist/client/assets/min-dark-DK6uq44k.js +1 -0
  174. package/dist/client/assets/min-light-lr1QiEOE.js +1 -0
  175. package/dist/client/assets/mipsasm-D3Vr1VJI.js +1 -0
  176. package/dist/client/assets/mojo-D3ai4ATt.js +1 -0
  177. package/dist/client/assets/monokai-DZSWSdmN.js +1 -0
  178. package/dist/client/assets/moonbit-c7XV1V8w.js +1 -0
  179. package/dist/client/assets/move--lg8RSZu.js +1 -0
  180. package/dist/client/assets/narrat-Bn_PlXDl.js +1 -0
  181. package/dist/client/assets/nextflow-DXxhyYjQ.js +1 -0
  182. package/dist/client/assets/nextflow-groovy-CUrXbMOF.js +1 -0
  183. package/dist/client/assets/nginx-Dj6E3HRL.js +1 -0
  184. package/dist/client/assets/night-owl-DnKT96OJ.js +1 -0
  185. package/dist/client/assets/night-owl-light-gVSh6ltn.js +1 -0
  186. package/dist/client/assets/nim-BizJb4iF.js +1 -0
  187. package/dist/client/assets/nix-DE1Q2B1F.js +1 -0
  188. package/dist/client/assets/nord-CbYaE7ZY.js +1 -0
  189. package/dist/client/assets/nushell-BBFYNdNE.js +1 -0
  190. package/dist/client/assets/objective-c-mc6rHp-y.js +1 -0
  191. package/dist/client/assets/objective-cpp-D96wcRis.js +1 -0
  192. package/dist/client/assets/ocaml-Ddt3E4VO.js +1 -0
  193. package/dist/client/assets/odin-BUZTfc03.js +1 -0
  194. package/dist/client/assets/one-dark-pro-CLMO01es.js +1 -0
  195. package/dist/client/assets/one-light-27sfjFDM.js +1 -0
  196. package/dist/client/assets/openscad-C-XxCD_t.js +1 -0
  197. package/dist/client/assets/pascal-BvJwb9Ca.js +1 -0
  198. package/dist/client/assets/perl-DnJAtWNn.js +1 -0
  199. package/dist/client/assets/php-BeY_VEeb.js +1 -0
  200. package/dist/client/assets/pkl-DtSDxyR8.js +1 -0
  201. package/dist/client/assets/plastic-Dd1-4HJb.js +1 -0
  202. package/dist/client/assets/plsql-CgEVu7mV.js +1 -0
  203. package/dist/client/assets/po-BNFx8QMG.js +1 -0
  204. package/dist/client/assets/poimandres-DdZFFINT.js +1 -0
  205. package/dist/client/assets/polar-DcGwqI2v.js +1 -0
  206. package/dist/client/assets/postcss-BgFCg0uM.js +1 -0
  207. package/dist/client/assets/powerquery-BNMZnWRc.js +1 -0
  208. package/dist/client/assets/powershell-CeNh_gMu.js +1 -0
  209. package/dist/client/assets/prisma-C4wKi9Xs.js +1 -0
  210. package/dist/client/assets/prolog-DcNkIfZZ.js +1 -0
  211. package/dist/client/assets/proto-BqsNb_Ru.js +1 -0
  212. package/dist/client/assets/pug-DXhFbVDh.js +1 -0
  213. package/dist/client/assets/puppet-BLvi8DVC.js +1 -0
  214. package/dist/client/assets/purescript-B_tjgp5s.js +1 -0
  215. package/dist/client/assets/python-xLLWlBd0.js +1 -0
  216. package/dist/client/assets/qml-CngzXsz8.js +1 -0
  217. package/dist/client/assets/qmldir-CDe6ORFD.js +1 -0
  218. package/dist/client/assets/qss-CvW7b9vz.js +1 -0
  219. package/dist/client/assets/r-BMmy9apu.js +1 -0
  220. package/dist/client/assets/racket-CA2oKVL1.js +1 -0
  221. package/dist/client/assets/raku-D9dEetfn.js +1 -0
  222. package/dist/client/assets/razor-kIo5DNUk.js +1 -0
  223. package/dist/client/assets/red-Cj1vpJ_n.js +1 -0
  224. package/dist/client/assets/reg-CHsE82Pk.js +1 -0
  225. package/dist/client/assets/regexp-BIa5IayX.js +1 -0
  226. package/dist/client/assets/rel-SUS6CYTF.js +1 -0
  227. package/dist/client/assets/riscv-xyAKa3qa.js +1 -0
  228. package/dist/client/assets/ron-D5BrJbC5.js +1 -0
  229. package/dist/client/assets/rose-pine-Dd0RAvir.js +1 -0
  230. package/dist/client/assets/rose-pine-dawn-CeS_2jlO.js +1 -0
  231. package/dist/client/assets/rose-pine-moon-CQrvtQEF.js +1 -0
  232. package/dist/client/assets/rosmsg-Bie95NPX.js +1 -0
  233. package/dist/client/assets/rst-McWv3WP0.js +1 -0
  234. package/dist/client/assets/ruby-CkenUDKe.js +1 -0
  235. package/dist/client/assets/rust-CAON_J-7.js +1 -0
  236. package/dist/client/assets/sas-Dgn9Yrr5.js +1 -0
  237. package/dist/client/assets/sass-CKkv3rB4.js +1 -0
  238. package/dist/client/assets/scala-BADlfUbE.js +1 -0
  239. package/dist/client/assets/scheme-Bv8vdcS_.js +1 -0
  240. package/dist/client/assets/scss-Tfn9jzBB.js +1 -0
  241. package/dist/client/assets/sdbl-TUdAkzzL.js +1 -0
  242. package/dist/client/assets/shaderlab-C5utLNvK.js +1 -0
  243. package/dist/client/assets/shellscript-vGpgBWOS.js +1 -0
  244. package/dist/client/assets/shellsession-7CA0dOzR.js +1 -0
  245. package/dist/client/assets/slack-dark-BeQrlvP4.js +1 -0
  246. package/dist/client/assets/slack-ochin-DaA1aBiy.js +1 -0
  247. package/dist/client/assets/smalltalk-C1k1DVft.js +1 -0
  248. package/dist/client/assets/snazzy-light-C9Bzvwcg.js +1 -0
  249. package/dist/client/assets/solarized-dark--ZJpQY8O.js +1 -0
  250. package/dist/client/assets/solarized-light-wzNWfjF2.js +1 -0
  251. package/dist/client/assets/solidity-CaEDdWYR.js +1 -0
  252. package/dist/client/assets/soy-DbBURueN.js +1 -0
  253. package/dist/client/assets/sparql-nVt1Q8sD.js +1 -0
  254. package/dist/client/assets/splunk-mpBjmHRA.js +1 -0
  255. package/dist/client/assets/sql-BJGtbEM8.js +1 -0
  256. package/dist/client/assets/ssh-config-DqmSAS3N.js +1 -0
  257. package/dist/client/assets/stata-L0kV9FQT.js +1 -0
  258. package/dist/client/assets/stylus-mNYBrtqL.js +1 -0
  259. package/dist/client/assets/surrealql-C17jcHRl.js +1 -0
  260. package/dist/client/assets/svelte-B5_CmVcu.js +1 -0
  261. package/dist/client/assets/swift-BXoR6L-y.js +1 -0
  262. package/dist/client/assets/synthwave-84-ybvkLGau.js +1 -0
  263. package/dist/client/assets/system-verilog-BnyrpGlO.js +1 -0
  264. package/dist/client/assets/systemd-BBVr_qxh.js +1 -0
  265. package/dist/client/assets/talonscript-l0qUQn2r.js +1 -0
  266. package/dist/client/assets/tasl-BzcMwPTS.js +1 -0
  267. package/dist/client/assets/tcl-CQgtyMkG.js +1 -0
  268. package/dist/client/assets/templ-C5f2EORt.js +1 -0
  269. package/dist/client/assets/terraform-BgPqtSWN.js +1 -0
  270. package/dist/client/assets/tex-DvaBtCMN.js +1 -0
  271. package/dist/client/assets/tokyo-night-BZt2NwCl.js +1 -0
  272. package/dist/client/assets/toml-CpHBCfVl.js +1 -0
  273. package/dist/client/assets/ts-tags-DlZzQdBU.js +1 -0
  274. package/dist/client/assets/tsv-DYxH1-vL.js +1 -0
  275. package/dist/client/assets/tsx-DaLOIju9.js +1 -0
  276. package/dist/client/assets/turtle-DdFFvP5J.js +1 -0
  277. package/dist/client/assets/twig-BB7320dl.js +1 -0
  278. package/dist/client/assets/typescript-D8B-VgXj.js +1 -0
  279. package/dist/client/assets/typespec-CHOxKRtr.js +1 -0
  280. package/dist/client/assets/typst-C0VS9TQm.js +1 -0
  281. package/dist/client/assets/v-CfOPGXPl.js +1 -0
  282. package/dist/client/assets/vala-DYqHmNOK.js +1 -0
  283. package/dist/client/assets/vb-DUBgqZ02.js +1 -0
  284. package/dist/client/assets/verilog-BxybH_AY.js +1 -0
  285. package/dist/client/assets/vesper-BDlBlJR-.js +1 -0
  286. package/dist/client/assets/vhdl-DBoxxi7I.js +1 -0
  287. package/dist/client/assets/viml-C8vROCgw.js +1 -0
  288. package/dist/client/assets/vitesse-black-CUBzmgJa.js +1 -0
  289. package/dist/client/assets/vitesse-dark-COrLBgkv.js +1 -0
  290. package/dist/client/assets/vitesse-light-ThZGgLQK.js +1 -0
  291. package/dist/client/assets/vue-DylGFDrG.js +1 -0
  292. package/dist/client/assets/vue-html-Dt8r3B9y.js +1 -0
  293. package/dist/client/assets/vue-vine-DdN02uhY.js +1 -0
  294. package/dist/client/assets/vyper-D08CaD4o.js +1 -0
  295. package/dist/client/assets/wasm-CoVafRYN.js +1 -0
  296. package/dist/client/assets/wasm-DiIFv9DE.js +1 -0
  297. package/dist/client/assets/wenyan-GlRgAbTB.js +1 -0
  298. package/dist/client/assets/wgsl-BmWpQFqb.js +1 -0
  299. package/dist/client/assets/wikitext-Axug2vPC.js +1 -0
  300. package/dist/client/assets/wit-Dk1fPIaK.js +1 -0
  301. package/dist/client/assets/wolfram-DMhXlmnL.js +1 -0
  302. package/dist/client/assets/xml-CBEuB6I0.js +1 -0
  303. package/dist/client/assets/xsl-CuhlgDL5.js +1 -0
  304. package/dist/client/assets/yaml-Da6ymghi.js +1 -0
  305. package/dist/client/assets/zenscript-x7PXwj2_.js +1 -0
  306. package/dist/client/assets/zig-BlD2NI35.js +1 -0
  307. package/dist/client/index.html +21 -0
  308. package/dist/client/manifest.webmanifest +1 -0
  309. package/dist/client/registerSW.js +1 -0
  310. package/dist/client/sw-push.js +53 -0
  311. package/dist/client/sw.js +1 -0
  312. package/dist/client/workbox-b51dd497.js +1 -0
  313. package/{client/index.html → index.html} +1 -1
  314. package/package.json +62 -14
  315. package/public/icons/icon-192.svg +11 -0
  316. package/public/icons/icon-512.svg +11 -0
  317. package/public/sw-push.js +53 -0
  318. package/{client/src → src/client}/components/analytics/AnalyticsView.tsx +70 -78
  319. package/{client/src → src/client}/components/analytics/ChartCard.tsx +8 -2
  320. package/{client/src → src/client}/components/analytics/QuickStats.tsx +12 -10
  321. package/{client/src → src/client}/components/analytics/charts/ActivityCalendar.tsx +5 -3
  322. package/{client/src → src/client}/components/analytics/charts/CacheEfficiencyChart.tsx +1 -1
  323. package/{client/src → src/client}/components/analytics/charts/ContextUtilizationChart.tsx +33 -25
  324. package/{client/src → src/client}/components/analytics/charts/CostAreaChart.tsx +4 -4
  325. package/{client/src → src/client}/components/analytics/charts/CostDistributionChart.tsx +1 -0
  326. package/{client/src → src/client}/components/analytics/charts/CostDonutChart.tsx +1 -0
  327. package/{client/src → src/client}/components/analytics/charts/CumulativeCostChart.tsx +1 -0
  328. package/{client/src → src/client}/components/analytics/charts/HourlyHeatmap.tsx +5 -3
  329. package/{client/src → src/client}/components/analytics/charts/ProjectRadar.tsx +30 -26
  330. package/{client/src → src/client}/components/analytics/charts/ResponseTimeScatter.tsx +16 -10
  331. package/{client/src → src/client}/components/analytics/charts/SessionBubbleChart.tsx +23 -16
  332. package/{client/src → src/client}/components/analytics/charts/SessionTimeline.tsx +5 -3
  333. package/{client/src → src/client}/components/analytics/charts/TokenFlowChart.tsx +3 -3
  334. package/{client/src → src/client}/components/analytics/charts/ToolSunburst.tsx +26 -23
  335. package/{client/src → src/client}/components/chat/ChatView.tsx +59 -25
  336. package/{client/src → src/client}/components/chat/Message.tsx +245 -8
  337. package/{client/src → src/client}/components/chat/ModelSelector.tsx +29 -8
  338. package/src/client/components/settings/Appearance.tsx +275 -0
  339. package/{client/src → src/client}/components/settings/Notifications.tsx +35 -0
  340. package/src/client/components/settings/ThemePreview.tsx +140 -0
  341. package/src/client/components/settings/ThemeWizard.tsx +405 -0
  342. package/{client/src → src/client}/components/sidebar/ProjectRail.tsx +43 -169
  343. package/{client/src → src/client}/components/sidebar/SessionList.tsx +27 -49
  344. package/{client/src → src/client}/components/sidebar/Sidebar.tsx +2 -6
  345. package/{client/src → src/client}/components/sidebar/UserIsland.tsx +24 -5
  346. package/{client/src → src/client}/components/sidebar/UserMenu.tsx +4 -2
  347. package/src/client/components/ui/ContextMenu.tsx +153 -0
  348. package/{client/src → src/client}/components/ui/PopupMenu.tsx +4 -2
  349. package/{client/src → src/client}/components/ui/SaveFooter.tsx +1 -1
  350. package/{client/src → src/client}/components/workspace/TabBar.tsx +17 -64
  351. package/{client/src → src/client}/hooks/useAnalytics.ts +17 -8
  352. package/src/client/hooks/usePushNotifications.ts +92 -0
  353. package/{client/src → src/client}/hooks/useSession.ts +35 -8
  354. package/{client/src → src/client}/hooks/useWebSocket.ts +0 -3
  355. package/src/client/lib/theme-derive.ts +196 -0
  356. package/{client/src → src/client}/stores/analytics.ts +20 -6
  357. package/{client/src → src/client}/stores/session.ts +32 -2
  358. package/{client/src → src/client}/stores/sidebar.ts +3 -1
  359. package/{client/src → src/client}/themes/index.ts +26 -0
  360. package/{server/src → src/server}/analytics/engine.ts +87 -30
  361. package/src/server/assets.ts +45 -0
  362. package/src/server/daemon.ts +547 -0
  363. package/{server/src → src/server}/handlers/analytics.ts +13 -8
  364. package/{server/src → src/server}/handlers/chat.ts +73 -2
  365. package/{server/src → src/server}/handlers/mesh.ts +3 -2
  366. package/{server/src → src/server}/handlers/plugins.ts +10 -13
  367. package/{server/src → src/server}/handlers/session.ts +6 -1
  368. package/{server/src → src/server}/handlers/settings.ts +1 -1
  369. package/{server/src → src/server}/handlers/skills.ts +7 -9
  370. package/src/server/handlers/themes.ts +121 -0
  371. package/{server/src → src/server}/handlers/update.ts +5 -23
  372. package/{server/src → src/server}/index.ts +97 -134
  373. package/{server/src → src/server}/mesh/connector.ts +1 -1
  374. package/{server/src → src/server}/project/context-breakdown.ts +4 -5
  375. package/{server/src → src/server}/project/pty-worker.cjs +1 -1
  376. package/{server/src → src/server}/project/sdk-bridge.ts +434 -289
  377. package/{server/src → src/server}/project/session.ts +84 -38
  378. package/{server/src → src/server}/project/terminal.ts +7 -24
  379. package/{server/src → src/server}/project/warmup.ts +63 -10
  380. package/src/server/push.ts +121 -0
  381. package/src/server/runtime.ts +1 -0
  382. package/src/server/tui.ts +103 -0
  383. package/{server/src → src/server}/update-checker.ts +10 -10
  384. package/{server/src → src/server}/ws/broadcast.ts +8 -8
  385. package/{server/src → src/server}/ws/router.ts +21 -25
  386. package/{shared/src → src/shared}/analytics.ts +1 -0
  387. package/{shared/src → src/shared}/constants.ts +1 -0
  388. package/{shared/src → src/shared}/messages.ts +104 -6
  389. package/{shared/src → src/shared}/models.ts +1 -1
  390. package/tsconfig.json +7 -8
  391. package/{client/vite.config.ts → vite.config.ts} +14 -18
  392. package/.editorconfig +0 -12
  393. package/.github/workflows/ci.yml +0 -81
  394. package/.github/workflows/release.yml +0 -87
  395. package/.impeccable.md +0 -66
  396. package/.releaserc.json +0 -33
  397. package/.serena/memories/code_style_and_conventions.md +0 -35
  398. package/.serena/memories/project_overview.md +0 -51
  399. package/.serena/memories/suggested_commands.md +0 -32
  400. package/.serena/memories/task_completion_checklist.md +0 -15
  401. package/.serena/project.yml +0 -152
  402. package/CLAUDE.md +0 -71
  403. package/CONTRIBUTING.md +0 -93
  404. package/bun.lock +0 -2246
  405. package/bunfig.toml +0 -2
  406. package/client/package.json +0 -43
  407. package/client/src/components/settings/Appearance.tsx +0 -152
  408. package/client/tsconfig.json +0 -18
  409. package/install.sh +0 -71
  410. package/playwright.config.ts +0 -19
  411. package/scripts/build-binary.ts +0 -157
  412. package/scripts/postinstall.js +0 -31
  413. package/server/package.json +0 -24
  414. package/server/src/_generated/embedded-assets.ts +0 -2
  415. package/server/src/assets.ts +0 -69
  416. package/server/src/daemon.ts +0 -459
  417. package/server/src/runtime.ts +0 -4
  418. package/server/tsconfig.json +0 -20
  419. package/shared/package.json +0 -11
  420. package/shared/tsconfig.json +0 -15
  421. package/tests/accessibility.spec.ts +0 -77
  422. package/tests/keyboard-shortcuts.spec.ts +0 -70
  423. package/tests/message-actions.spec.ts +0 -112
  424. package/tests/onboarding.spec.ts +0 -72
  425. package/tests/session-flow.spec.ts +0 -117
  426. package/tests/session-preview.spec.ts +0 -83
  427. package/themes/amoled.json +0 -20
  428. package/themes/ayu-light.json +0 -9
  429. package/themes/catppuccin-latte.json +0 -9
  430. package/themes/catppuccin-mocha.json +0 -9
  431. package/themes/clay-light.json +0 -10
  432. package/themes/clay.json +0 -10
  433. package/themes/dracula.json +0 -9
  434. package/themes/everforest-light.json +0 -9
  435. package/themes/everforest.json +0 -9
  436. package/themes/github-light.json +0 -9
  437. package/themes/gruvbox-dark.json +0 -9
  438. package/themes/gruvbox-light.json +0 -9
  439. package/themes/monokai.json +0 -9
  440. package/themes/nord-light.json +0 -9
  441. package/themes/nord.json +0 -9
  442. package/themes/one-dark.json +0 -9
  443. package/themes/one-light.json +0 -9
  444. package/themes/rose-pine-dawn.json +0 -9
  445. package/themes/rose-pine.json +0 -9
  446. package/themes/solarized-dark.json +0 -9
  447. package/themes/solarized-light.json +0 -9
  448. package/themes/tokyo-night-light.json +0 -9
  449. package/themes/tokyo-night.json +0 -9
  450. package/tp.js +0 -19
  451. /package/{client/public → dist/client}/icons/icon-192.svg +0 -0
  452. /package/{client/public → dist/client}/icons/icon-512.svg +0 -0
  453. /package/{client/src → src/client}/App.tsx +0 -0
  454. /package/{client/src → src/client}/commands.ts +0 -0
  455. /package/{client/src → src/client}/components/analytics/PeriodSelector.tsx +0 -0
  456. /package/{client/src → src/client}/components/analytics/chartTokens.ts +0 -0
  457. /package/{client/src → src/client}/components/analytics/charts/DailySummaryCards.tsx +0 -0
  458. /package/{client/src → src/client}/components/analytics/charts/NodeFleetOverview.tsx +0 -0
  459. /package/{client/src → src/client}/components/analytics/charts/PermissionBreakdown.tsx +0 -0
  460. /package/{client/src → src/client}/components/analytics/charts/SessionComplexityList.tsx +0 -0
  461. /package/{client/src → src/client}/components/analytics/charts/TokenSankeyChart.tsx +0 -0
  462. /package/{client/src → src/client}/components/analytics/charts/ToolTreemap.tsx +0 -0
  463. /package/{client/src → src/client}/components/auth/PassphrasePrompt.tsx +0 -0
  464. /package/{client/src → src/client}/components/chat/AttachmentChips.tsx +0 -0
  465. /package/{client/src → src/client}/components/chat/ChatInput.tsx +0 -0
  466. /package/{client/src → src/client}/components/chat/CommandPalette.tsx +0 -0
  467. /package/{client/src → src/client}/components/chat/ElicitationCard.tsx +0 -0
  468. /package/{client/src → src/client}/components/chat/PermissionModeSelector.tsx +0 -0
  469. /package/{client/src → src/client}/components/chat/PromptQuestion.tsx +0 -0
  470. /package/{client/src → src/client}/components/chat/StatusBar.tsx +0 -0
  471. /package/{client/src → src/client}/components/chat/TodoCard.tsx +0 -0
  472. /package/{client/src → src/client}/components/chat/ToolGroup.tsx +0 -0
  473. /package/{client/src → src/client}/components/chat/ToolResultRenderer.tsx +0 -0
  474. /package/{client/src → src/client}/components/chat/VoiceRecorder.tsx +0 -0
  475. /package/{client/src → src/client}/components/chat/toolSummary.ts +0 -0
  476. /package/{client/src → src/client}/components/dashboard/DashboardView.tsx +0 -0
  477. /package/{client/src → src/client}/components/dashboard/ProjectDashboardView.tsx +0 -0
  478. /package/{client/src → src/client}/components/mesh/NodeBadge.tsx +0 -0
  479. /package/{client/src → src/client}/components/mesh/PairingDialog.tsx +0 -0
  480. /package/{client/src → src/client}/components/project-settings/ProjectClaude.tsx +0 -0
  481. /package/{client/src → src/client}/components/project-settings/ProjectEnvironment.tsx +0 -0
  482. /package/{client/src → src/client}/components/project-settings/ProjectGeneral.tsx +0 -0
  483. /package/{client/src → src/client}/components/project-settings/ProjectMcp.tsx +0 -0
  484. /package/{client/src → src/client}/components/project-settings/ProjectMemory.tsx +0 -0
  485. /package/{client/src → src/client}/components/project-settings/ProjectNotifications.tsx +0 -0
  486. /package/{client/src → src/client}/components/project-settings/ProjectPermissions.tsx +0 -0
  487. /package/{client/src → src/client}/components/project-settings/ProjectPlugins.tsx +0 -0
  488. /package/{client/src → src/client}/components/project-settings/ProjectRules.tsx +0 -0
  489. /package/{client/src → src/client}/components/project-settings/ProjectSettingsView.tsx +0 -0
  490. /package/{client/src → src/client}/components/project-settings/ProjectSkills.tsx +0 -0
  491. /package/{client/src → src/client}/components/settings/BudgetSettings.tsx +0 -0
  492. /package/{client/src → src/client}/components/settings/ClaudeSettings.tsx +0 -0
  493. /package/{client/src → src/client}/components/settings/Editor.tsx +0 -0
  494. /package/{client/src → src/client}/components/settings/Environment.tsx +0 -0
  495. /package/{client/src → src/client}/components/settings/GlobalMcp.tsx +0 -0
  496. /package/{client/src → src/client}/components/settings/GlobalMemory.tsx +0 -0
  497. /package/{client/src → src/client}/components/settings/GlobalPlugins.tsx +0 -0
  498. /package/{client/src → src/client}/components/settings/GlobalRules.tsx +0 -0
  499. /package/{client/src → src/client}/components/settings/GlobalSkills.tsx +0 -0
  500. /package/{client/src → src/client}/components/settings/MeshStatus.tsx +0 -0
  501. /package/{client/src → src/client}/components/settings/SettingsView.tsx +0 -0
  502. /package/{client/src → src/client}/components/settings/SkillMarketplace.tsx +0 -0
  503. /package/{client/src → src/client}/components/settings/mcp-shared.tsx +0 -0
  504. /package/{client/src → src/client}/components/settings/skill-shared.tsx +0 -0
  505. /package/{client/src → src/client}/components/setup/SetupWizard.tsx +0 -0
  506. /package/{client/src → src/client}/components/sidebar/AddProjectModal.tsx +0 -0
  507. /package/{client/src → src/client}/components/sidebar/NodeSettingsModal.tsx +0 -0
  508. /package/{client/src → src/client}/components/sidebar/ProjectDropdown.tsx +0 -0
  509. /package/{client/src → src/client}/components/sidebar/SearchFilter.tsx +0 -0
  510. /package/{client/src → src/client}/components/sidebar/SettingsSidebar.tsx +0 -0
  511. /package/{client/src → src/client}/components/ui/CommandPalette.tsx +0 -0
  512. /package/{client/src → src/client}/components/ui/ErrorBoundary.tsx +0 -0
  513. /package/{client/src → src/client}/components/ui/IconPicker.tsx +0 -0
  514. /package/{client/src → src/client}/components/ui/KeyboardShortcuts.tsx +0 -0
  515. /package/{client/src → src/client}/components/ui/LatticeLogomark.tsx +0 -0
  516. /package/{client/src → src/client}/components/ui/NodeDisconnectedOverlay.tsx +0 -0
  517. /package/{client/src → src/client}/components/ui/Toast.tsx +0 -0
  518. /package/{client/src → src/client}/components/ui/UpdateBanner.tsx +0 -0
  519. /package/{client/src → src/client}/components/ui/UpdatePrompt.tsx +0 -0
  520. /package/{client/src → src/client}/components/workspace/BookmarksView.tsx +0 -0
  521. /package/{client/src → src/client}/components/workspace/FileBrowser.tsx +0 -0
  522. /package/{client/src → src/client}/components/workspace/FileTree.tsx +0 -0
  523. /package/{client/src → src/client}/components/workspace/FileViewer.tsx +0 -0
  524. /package/{client/src → src/client}/components/workspace/NoteCard.tsx +0 -0
  525. /package/{client/src → src/client}/components/workspace/NotesView.tsx +0 -0
  526. /package/{client/src → src/client}/components/workspace/ScheduledTasksView.tsx +0 -0
  527. /package/{client/src → src/client}/components/workspace/SplitPane.tsx +0 -0
  528. /package/{client/src → src/client}/components/workspace/TaskCard.tsx +0 -0
  529. /package/{client/src → src/client}/components/workspace/TaskEditModal.tsx +0 -0
  530. /package/{client/src → src/client}/components/workspace/TerminalInstance.tsx +0 -0
  531. /package/{client/src → src/client}/components/workspace/TerminalView.tsx +0 -0
  532. /package/{client/src → src/client}/components/workspace/WorkspaceView.tsx +0 -0
  533. /package/{client/src → src/client}/hooks/useAttachments.ts +0 -0
  534. /package/{client/src → src/client}/hooks/useBookmarks.ts +0 -0
  535. /package/{client/src → src/client}/hooks/useEditorConfig.ts +0 -0
  536. /package/{client/src → src/client}/hooks/useFocusTrap.ts +0 -0
  537. /package/{client/src → src/client}/hooks/useIdleDetection.ts +0 -0
  538. /package/{client/src → src/client}/hooks/useInstallPrompt.ts +0 -0
  539. /package/{client/src → src/client}/hooks/useMesh.ts +0 -0
  540. /package/{client/src → src/client}/hooks/useNotifications.ts +0 -0
  541. /package/{client/src → src/client}/hooks/useOnline.ts +0 -0
  542. /package/{client/src → src/client}/hooks/useProjectSettings.ts +0 -0
  543. /package/{client/src → src/client}/hooks/useProjects.ts +0 -0
  544. /package/{client/src → src/client}/hooks/useSaveState.ts +0 -0
  545. /package/{client/src → src/client}/hooks/useSidebar.ts +0 -0
  546. /package/{client/src → src/client}/hooks/useSkills.ts +0 -0
  547. /package/{client/src → src/client}/hooks/useSpinnerVerb.ts +0 -0
  548. /package/{client/src → src/client}/hooks/useSwipeDrawer.ts +0 -0
  549. /package/{client/src → src/client}/hooks/useTheme.ts +0 -0
  550. /package/{client/src → src/client}/hooks/useTimeTick.ts +0 -0
  551. /package/{client/src → src/client}/hooks/useVoiceRecorder.ts +0 -0
  552. /package/{client/src → src/client}/hooks/useWorkspace.ts +0 -0
  553. /package/{client/src → src/client}/lib/workspace-url.ts +0 -0
  554. /package/{client/src → src/client}/main.tsx +0 -0
  555. /package/{client/src → src/client}/providers/WebSocketProvider.tsx +0 -0
  556. /package/{client/src → src/client}/router.tsx +0 -0
  557. /package/{client/src → src/client}/stores/bookmarks.ts +0 -0
  558. /package/{client/src → src/client}/stores/mesh.ts +0 -0
  559. /package/{client/src → src/client}/stores/theme.ts +0 -0
  560. /package/{client/src → src/client}/stores/workspace.ts +0 -0
  561. /package/{client/src → src/client}/styles/global.css +0 -0
  562. /package/{client/src → src/client}/styles/theme-vars.css +0 -0
  563. /package/{client/src → src/client}/utils/editorUrl.ts +0 -0
  564. /package/{client/src → src/client}/utils/findDuplicateKeys.ts +0 -0
  565. /package/{client/src → src/client}/utils/formatSessionTitle.ts +0 -0
  566. /package/{client/src → src/client}/vite-env.d.ts +0 -0
  567. /package/{server/src → src/server}/auth/passphrase.ts +0 -0
  568. /package/{server/src → src/server}/config.ts +0 -0
  569. /package/{server/src → src/server}/features/ralph-loop.ts +0 -0
  570. /package/{server/src → src/server}/features/scheduler.ts +0 -0
  571. /package/{server/src → src/server}/features/sticky-notes.ts +0 -0
  572. /package/{server/src → src/server}/handlers/attachment.ts +0 -0
  573. /package/{server/src → src/server}/handlers/bookmarks.ts +0 -0
  574. /package/{server/src → src/server}/handlers/editor.ts +0 -0
  575. /package/{server/src → src/server}/handlers/fs.ts +0 -0
  576. /package/{server/src → src/server}/handlers/loop.ts +0 -0
  577. /package/{server/src → src/server}/handlers/memory.ts +0 -0
  578. /package/{server/src → src/server}/handlers/notes.ts +0 -0
  579. /package/{server/src → src/server}/handlers/project-settings.ts +0 -0
  580. /package/{server/src → src/server}/handlers/scheduler.ts +0 -0
  581. /package/{server/src → src/server}/handlers/terminal.ts +0 -0
  582. /package/{server/src → src/server}/identity.ts +0 -0
  583. /package/{server/src → src/server}/logger.ts +0 -0
  584. /package/{server/src → src/server}/mesh/crypto.ts +0 -0
  585. /package/{server/src → src/server}/mesh/discovery.ts +0 -0
  586. /package/{server/src → src/server}/mesh/pairing.ts +0 -0
  587. /package/{server/src → src/server}/mesh/peers.ts +0 -0
  588. /package/{server/src → src/server}/mesh/proxy.ts +0 -0
  589. /package/{server/src → src/server}/mesh/session-sync.ts +0 -0
  590. /package/{server/src → src/server}/project/bookmarks.ts +0 -0
  591. /package/{server/src → src/server}/project/file-browser.ts +0 -0
  592. /package/{server/src → src/server}/project/project-files.ts +0 -0
  593. /package/{server/src → src/server}/project/registry.ts +0 -0
  594. /package/{server/src → src/server}/tls.ts +0 -0
  595. /package/{server/src → src/server}/ws/server.ts +0 -0
  596. /package/{shared/src → src/shared}/index.ts +0 -0
  597. /package/{shared/src → src/shared}/project-settings.ts +0 -0
@@ -5,7 +5,8 @@ import {
5
5
  renameSession as sdkRenameSession,
6
6
  } from "@anthropic-ai/claude-agent-sdk";
7
7
  import type { SDKSessionInfo, SessionMessage } from "@anthropic-ai/claude-agent-sdk";
8
- import { existsSync, unlinkSync, readFileSync } from "node:fs";
8
+ import { existsSync, unlinkSync, readFileSync, statSync } from "node:fs";
9
+ import * as fsPromises from "node:fs/promises";
9
10
  import { join } from "node:path";
10
11
  import { randomUUID } from "node:crypto";
11
12
  import { homedir } from "node:os";
@@ -138,8 +139,16 @@ function extractUserText(content: unknown): string {
138
139
  return "";
139
140
  }
140
141
 
142
+ var HIDDEN_TOOLS = new Set([
143
+ "TaskUpdate", "TaskCreate", "TaskGet", "TaskList", "TaskOutput", "TaskStop",
144
+ "TodoWrite", "TodoRead",
145
+ "EnterPlanMode", "ExitPlanMode",
146
+ "ToolSearch",
147
+ ]);
148
+
141
149
  function convertSessionMessages(messages: SessionMessage[]): HistoryMessage[] {
142
150
  var result: HistoryMessage[] = [];
151
+ var hiddenToolIds = new Set<string>();
143
152
 
144
153
  for (var i = 0; i < messages.length; i++) {
145
154
  var msg = messages[i];
@@ -147,11 +156,24 @@ function convertSessionMessages(messages: SessionMessage[]): HistoryMessage[] {
147
156
  var apiMsg = msg.message as { role?: string; content?: unknown };
148
157
 
149
158
  if (msg.type === "user") {
159
+ if ((msg as Record<string, unknown>).isCompactSummary === true) {
160
+ var summaryText = typeof apiMsg.content === "string" ? apiMsg.content : "";
161
+ if (summaryText) {
162
+ result.push({
163
+ type: "compact_summary",
164
+ uuid: msg.uuid,
165
+ text: summaryText,
166
+ timestamp: ts,
167
+ });
168
+ }
169
+ continue;
170
+ }
150
171
  if (Array.isArray(apiMsg.content)) {
151
172
  var hadToolResult = false;
152
173
  for (var j = 0; j < apiMsg.content.length; j++) {
153
174
  var block = apiMsg.content[j] as { type?: string; text?: string; tool_use_id?: string; content?: unknown };
154
175
  if (block.type === "tool_result" && block.tool_use_id) {
176
+ if (hiddenToolIds.has(block.tool_use_id)) continue;
155
177
  hadToolResult = true;
156
178
  var resultContent = "";
157
179
  if (typeof block.content === "string") {
@@ -212,13 +234,17 @@ function convertSessionMessages(messages: SessionMessage[]): HistoryMessage[] {
212
234
  timestamp: ts,
213
235
  });
214
236
  } else if (aBlock.type === "tool_use" && aBlock.id && aBlock.name) {
215
- result.push({
216
- type: "tool_start",
217
- toolId: aBlock.id,
218
- name: aBlock.name,
219
- args: JSON.stringify(aBlock.input ?? {}),
220
- timestamp: ts,
221
- });
237
+ if (HIDDEN_TOOLS.has(aBlock.name)) {
238
+ hiddenToolIds.add(aBlock.id);
239
+ } else {
240
+ result.push({
241
+ type: "tool_start",
242
+ toolId: aBlock.id,
243
+ name: aBlock.name,
244
+ args: JSON.stringify(aBlock.input ?? {}),
245
+ timestamp: ts,
246
+ });
247
+ }
222
248
  }
223
249
  }
224
250
  if (msgUsage && lastAssistantIdx >= 0) {
@@ -294,15 +320,14 @@ export async function getSessionUsage(projectSlug: string, sessionId: string): P
294
320
  if (!existsSync(sessionFile)) return null;
295
321
 
296
322
  try {
297
- var { openSync, readSync, fstatSync, closeSync } = require("node:fs") as typeof import("node:fs");
298
- var fd = openSync(sessionFile, "r");
299
- var stat = fstatSync(fd);
300
- var tailSize = Math.min(stat.size, 512 * 1024);
301
- var buf = Buffer.alloc(tailSize);
302
- readSync(fd, buf, 0, tailSize, stat.size - tailSize);
303
- closeSync(fd);
304
-
305
- var text = buf.toString("utf-8");
323
+ var fhUsage = await fsPromises.open(sessionFile, "r");
324
+ var statUsage = await fhUsage.stat();
325
+ var tailSize = Math.min(statUsage.size, 512 * 1024);
326
+ var bufUsage = Buffer.alloc(tailSize);
327
+ await fhUsage.read(bufUsage, 0, tailSize, statUsage.size - tailSize);
328
+ await fhUsage.close();
329
+
330
+ var text = bufUsage.toString("utf-8");
306
331
  var lines = text.split("\n");
307
332
 
308
333
  for (var i = lines.length - 1; i >= 0; i--) {
@@ -453,6 +478,12 @@ export function invalidateSessionCache(projectSlug: string): void {
453
478
  sessionListCache.delete(projectSlug);
454
479
  }
455
480
 
481
+ export function invalidateHistoryCache(sessionId: string): void {
482
+ historyCache.delete(sessionId);
483
+ var idx = historyCacheOrder.indexOf(sessionId);
484
+ if (idx >= 0) historyCacheOrder.splice(idx, 1);
485
+ }
486
+
456
487
  export async function getSessionTitle(projectSlug: string, sessionId: string): Promise<string> {
457
488
  var projectPath = getProjectPath(projectSlug);
458
489
  var options = projectPath ? { dir: projectPath } : undefined;
@@ -489,8 +520,8 @@ export function appendToHistoryCache(sessionId: string, message: HistoryMessage)
489
520
  touchCache(sessionId);
490
521
  }
491
522
 
492
- var INITIAL_MESSAGE_COUNT = 100;
493
- var TAIL_READ_BYTES = 2 * 1024 * 1024;
523
+ var INITIAL_MESSAGE_COUNT = 300;
524
+ var TAIL_READ_BYTES = 512 * 1024;
494
525
 
495
526
  function getSessionFilePath(projectSlug: string, sessionId: string): string | null {
496
527
  var projectPath = getProjectPath(projectSlug);
@@ -500,21 +531,34 @@ function getSessionFilePath(projectSlug: string, sessionId: string): string | nu
500
531
  return existsSync(filePath) ? filePath : null;
501
532
  }
502
533
 
503
- function readTailLines(filePath: string, maxBytes: number): { lines: string[]; isPartial: boolean; fileSize: number } {
504
- var { openSync, readSync, fstatSync, closeSync } = require("node:fs") as typeof import("node:fs");
505
- var fd = openSync(filePath, "r");
506
- var stat = fstatSync(fd);
507
- var readStart = Math.max(0, stat.size - maxBytes);
508
- var buf = Buffer.alloc(stat.size - readStart);
509
- readSync(fd, buf, 0, buf.length, readStart);
510
- closeSync(fd);
511
- var text = buf.toString("utf-8");
512
- if (readStart > 0) {
513
- var firstNewline = text.indexOf("\n");
514
- if (firstNewline >= 0) text = text.slice(firstNewline + 1);
534
+ export function getSessionFileSizeBytes(projectSlug: string, sessionId: string): number | null {
535
+ var filePath = getSessionFilePath(projectSlug, sessionId);
536
+ if (!filePath) return null;
537
+ try {
538
+ return statSync(filePath).size;
539
+ } catch {
540
+ return null;
541
+ }
542
+ }
543
+
544
+ async function readTailLines(filePath: string, maxBytes: number): Promise<{ lines: string[]; isPartial: boolean; fileSize: number }> {
545
+ var fh = await fsPromises.open(filePath, "r");
546
+ try {
547
+ var stat = await fh.stat();
548
+ var readStart = Math.max(0, stat.size - maxBytes);
549
+ var length = stat.size - readStart;
550
+ var buf = Buffer.alloc(length);
551
+ await fh.read(buf, 0, length, readStart);
552
+ var text = buf.toString("utf-8");
553
+ if (readStart > 0) {
554
+ var firstNewline = text.indexOf("\n");
555
+ if (firstNewline >= 0) text = text.slice(firstNewline + 1);
556
+ }
557
+ var lines = text.split("\n").filter(function (l) { return l.length > 0; });
558
+ return { lines, isPartial: readStart > 0, fileSize: stat.size };
559
+ } finally {
560
+ await fh.close();
515
561
  }
516
- var lines = text.split("\n").filter(function (l) { return l.length > 0; });
517
- return { lines, isPartial: readStart > 0, fileSize: stat.size };
518
562
  }
519
563
 
520
564
  function parseJsonlLines(lines: string[]): SessionMessage[] {
@@ -545,14 +589,14 @@ export async function loadSessionHistory(projectSlug: string, sessionId: string)
545
589
 
546
590
  var filePath = getSessionFilePath(projectSlug, sessionId);
547
591
  if (filePath) {
548
- var tailData = readTailLines(filePath, TAIL_READ_BYTES);
592
+ var tailData = await readTailLines(filePath, TAIL_READ_BYTES);
549
593
  var tailRaw = parseJsonlLines(tailData.lines);
550
594
  var tailMessages = convertSessionMessages(tailRaw);
551
595
  var hasMore = tailData.isPartial;
552
596
 
553
597
  log.session("loadSessionHistory %s: %dms (tail read, %d msgs, partial=%s)", sessionId.slice(0, 8), Date.now() - t0, tailMessages.length, hasMore);
554
598
 
555
- if (!hasMore) {
599
+ if (!hasMore && tailMessages.length > 0) {
556
600
  historyCache.set(sessionId, { messages: tailMessages, title: null });
557
601
  touchCache(sessionId);
558
602
  evictOldest();
@@ -569,9 +613,11 @@ export async function loadSessionHistory(projectSlug: string, sessionId: string)
569
613
  var options = projectPath ? { dir: projectPath } : undefined;
570
614
  var rawMessages = await getSessionMessages(sessionId, options);
571
615
  var allMessages = convertSessionMessages(rawMessages);
572
- historyCache.set(sessionId, { messages: allMessages, title: null });
573
- touchCache(sessionId);
574
- evictOldest();
616
+ if (allMessages.length > 0) {
617
+ historyCache.set(sessionId, { messages: allMessages, title: null });
618
+ touchCache(sessionId);
619
+ evictOldest();
620
+ }
575
621
  log.session("loadSessionHistory %s: %dms (full SDK, %d msgs)", sessionId.slice(0, 8), Date.now() - t0, allMessages.length);
576
622
  var tailSlice = allMessages.length > INITIAL_MESSAGE_COUNT
577
623
  ? allMessages.slice(allMessages.length - INITIAL_MESSAGE_COUNT)
@@ -1,10 +1,11 @@
1
1
  import { randomUUID } from "node:crypto";
2
2
  import { spawn } from "node:child_process";
3
3
  import type { ChildProcess } from "node:child_process";
4
- import { join } from "node:path";
5
- import { existsSync, writeFileSync, readFileSync, mkdirSync } from "node:fs";
6
- import { homedir } from "node:os";
7
- import { IS_COMPILED } from "../runtime";
4
+ import { join, dirname } from "node:path";
5
+ import { fileURLToPath } from "node:url";
6
+ import { existsSync } from "node:fs";
7
+
8
+ var __dirname_local = dirname(fileURLToPath(import.meta.url));
8
9
 
9
10
  interface TerminalWorker {
10
11
  process: ChildProcess;
@@ -13,22 +14,7 @@ interface TerminalWorker {
13
14
 
14
15
  var terminals = new Map<string, TerminalWorker>();
15
16
 
16
- function getWorkerPath(): string {
17
- if (!IS_COMPILED) {
18
- return join(import.meta.dir, "pty-worker.cjs");
19
- }
20
- var extractedPath = join(homedir(), ".lattice", "pty-worker.cjs");
21
- if (!existsSync(extractedPath)) {
22
- var srcPath = join(import.meta.dir, "pty-worker.cjs");
23
- if (existsSync(srcPath)) {
24
- mkdirSync(join(homedir(), ".lattice"), { recursive: true });
25
- writeFileSync(extractedPath, readFileSync(srcPath));
26
- }
27
- }
28
- return extractedPath;
29
- }
30
-
31
- var WORKER_PATH = getWorkerPath();
17
+ var WORKER_PATH = join(__dirname_local, "pty-worker.cjs");
32
18
 
33
19
  var NODE_MODULES_PATH = (function () {
34
20
  try {
@@ -37,10 +23,7 @@ var NODE_MODULES_PATH = (function () {
37
23
  parts.pop();
38
24
  return parts.join("/node_modules/") + "/node_modules";
39
25
  } catch {
40
- if (IS_COMPILED) {
41
- return "";
42
- }
43
- return join(import.meta.dir, "..", "..", "..", "node_modules");
26
+ return join(__dirname_local, "..", "..", "..", "node_modules");
44
27
  }
45
28
  })();
46
29
 
@@ -5,6 +5,9 @@ import { log } from "../logger";
5
5
  import { loadConfig } from "../config";
6
6
  import { listSessions, loadSessionHistory } from "./session";
7
7
  import { execSync } from "node:child_process";
8
+ import { existsSync, unlinkSync, rmSync } from "node:fs";
9
+ import { join } from "node:path";
10
+ import { homedir } from "node:os";
8
11
 
9
12
  var claudeExePath: string | null = null;
10
13
 
@@ -35,6 +38,18 @@ var warmupSlashCommands: string[] = [];
35
38
  var warmupAccountInfo: AccountInfo | null = null;
36
39
  var warmupComplete = false;
37
40
 
41
+ interface WarmupRateLimitEntry {
42
+ status: string;
43
+ utilization?: number;
44
+ resetsAt?: number;
45
+ rateLimitType?: string;
46
+ overageStatus?: string;
47
+ overageResetsAt?: number;
48
+ isUsingOverage?: boolean;
49
+ }
50
+
51
+ var warmupRateLimits: Map<string, WarmupRateLimitEntry> = new Map();
52
+
38
53
  function ensureKnownModels(sdkModels: ModelEntry[]): ModelEntry[] {
39
54
  var seen = new Set<string>();
40
55
  for (var i = 0; i < sdkModels.length; i++) {
@@ -49,11 +64,31 @@ function ensureKnownModels(sdkModels: ModelEntry[]): ModelEntry[] {
49
64
  return result;
50
65
  }
51
66
 
67
+ function deleteWarmupSession(cwd: string, sessionId: string | null): void {
68
+ if (!sessionId) return;
69
+ try {
70
+ var hash = cwd.replace(/\//g, "-");
71
+ var projectDir = join(homedir(), ".claude", "projects", hash);
72
+ var jsonlPath = join(projectDir, sessionId + ".jsonl");
73
+ var dirPath = join(projectDir, sessionId);
74
+ if (existsSync(jsonlPath)) {
75
+ unlinkSync(jsonlPath);
76
+ log.server("Deleted warmup session file: %s", sessionId);
77
+ }
78
+ if (existsSync(dirPath)) {
79
+ rmSync(dirPath, { recursive: true, force: true });
80
+ }
81
+ } catch (err) {
82
+ log.server("Failed to delete warmup session: %O", err);
83
+ }
84
+ }
85
+
52
86
  export async function runWarmup(cwd: string): Promise<void> {
53
87
  log.server("SDK warmup starting (cwd: %s)...", cwd);
54
88
  try {
55
89
  var ac = new AbortController();
56
90
  var ended = false;
91
+ var WARMUP_SESSION_ID = "lattice-warmup";
57
92
 
58
93
  var mq = {
59
94
  [Symbol.asyncIterator]: function () {
@@ -66,7 +101,7 @@ export async function runWarmup(cwd: string): Promise<void> {
66
101
  type: "user" as const,
67
102
  message: { role: "user" as const, content: [{ type: "text" as const, text: "hi" }] },
68
103
  parent_tool_use_id: null,
69
- session_id: "warmup",
104
+ session_id: WARMUP_SESSION_ID,
70
105
  },
71
106
  done: false,
72
107
  });
@@ -79,6 +114,7 @@ export async function runWarmup(cwd: string): Promise<void> {
79
114
  prompt: mq as any,
80
115
  options: {
81
116
  cwd,
117
+ sessionId: WARMUP_SESSION_ID,
82
118
  settingSources: ["user", "project", "local"],
83
119
  abortController: ac,
84
120
  permissionMode: "plan",
@@ -89,12 +125,10 @@ export async function runWarmup(cwd: string): Promise<void> {
89
125
  },
90
126
  });
91
127
 
92
- var gotInit = false;
93
128
  for await (var msg of stream) {
94
129
  if (msg.type === "system") {
95
130
  var sysMsg = msg as any;
96
131
  if (sysMsg.subtype === "init") {
97
- gotInit = true;
98
132
  if (sysMsg.slash_commands) {
99
133
  warmupSlashCommands = sysMsg.slash_commands;
100
134
  }
@@ -109,12 +143,25 @@ export async function runWarmup(cwd: string): Promise<void> {
109
143
  try {
110
144
  warmupAccountInfo = await stream.accountInfo();
111
145
  } catch {}
146
+
147
+ ac.abort();
148
+ break;
112
149
  }
113
150
  }
114
151
 
115
152
  if (msg.type === "rate_limit_event") {
116
153
  var rlMsg = msg as { type: string; rate_limit_info: { status: string; utilization?: number; resetsAt?: number; rateLimitType?: string; overageStatus?: string; overageResetsAt?: number; isUsingOverage?: boolean } };
117
154
  var rli = rlMsg.rate_limit_info;
155
+ var cacheKey = rli.rateLimitType || "default";
156
+ warmupRateLimits.set(cacheKey, {
157
+ status: rli.status,
158
+ utilization: rli.utilization,
159
+ resetsAt: rli.resetsAt,
160
+ rateLimitType: rli.rateLimitType,
161
+ overageStatus: rli.overageStatus,
162
+ overageResetsAt: rli.overageResetsAt,
163
+ isUsingOverage: rli.isUsingOverage,
164
+ });
118
165
  broadcast({
119
166
  type: "chat:rate_limit",
120
167
  status: rli.status,
@@ -126,14 +173,10 @@ export async function runWarmup(cwd: string): Promise<void> {
126
173
  isUsingOverage: rli.isUsingOverage,
127
174
  } as any);
128
175
  }
129
-
130
- if (msg.type === "result" && gotInit) {
131
- ac.abort();
132
- break;
133
- }
134
176
  }
135
177
 
136
178
  warmupComplete = true;
179
+ deleteWarmupSession(cwd, WARMUP_SESSION_ID);
137
180
  log.server("SDK warmup complete: %d models, %d commands, auth=%s",
138
181
  warmupModels.length, warmupSlashCommands.length,
139
182
  warmupAccountInfo?.apiKeySource || "unknown");
@@ -194,10 +237,11 @@ async function warmupProjectData(): Promise<void> {
194
237
  sessions: result.sessions,
195
238
  totalCount: result.totalCount,
196
239
  } as any);
197
- if (result.sessions.length > 0) {
240
+ var preWarmCount = Math.min(5, result.sessions.length);
241
+ for (var k = 0; k < preWarmCount; k++) {
198
242
  recentSessionIds.push({
199
243
  projectSlug: projects[i].slug,
200
- sessionId: result.sessions[0].id,
244
+ sessionId: result.sessions[k].id,
201
245
  });
202
246
  }
203
247
  } catch {}
@@ -227,6 +271,15 @@ export function getWarmupAccountInfo(): AccountInfo | null {
227
271
  return warmupAccountInfo;
228
272
  }
229
273
 
274
+ export function getWarmupRateLimits(): WarmupRateLimitEntry[] {
275
+ return Array.from(warmupRateLimits.values());
276
+ }
277
+
278
+ export function cacheRateLimitEntry(entry: WarmupRateLimitEntry): void {
279
+ var key = entry.rateLimitType || "default";
280
+ warmupRateLimits.set(key, entry);
281
+ }
282
+
230
283
  export function isWarmupComplete(): boolean {
231
284
  return warmupComplete;
232
285
  }
@@ -0,0 +1,121 @@
1
+ import webpush from "web-push";
2
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ import { getLatticeHome } from "./config";
5
+ import { log } from "./logger";
6
+
7
+ interface VapidKeys {
8
+ publicKey: string;
9
+ privateKey: string;
10
+ }
11
+
12
+ interface PushSubscription {
13
+ endpoint: string;
14
+ keys: {
15
+ p256dh: string;
16
+ auth: string;
17
+ };
18
+ }
19
+
20
+ var vapidKeys: VapidKeys | null = null;
21
+ var subscriptions = new Map<string, PushSubscription>();
22
+
23
+ function getVapidPath(): string {
24
+ return join(getLatticeHome(), "vapid.json");
25
+ }
26
+
27
+ function getSubscriptionsPath(): string {
28
+ return join(getLatticeHome(), "push-subs.json");
29
+ }
30
+
31
+ function ensureVapidKeys(): VapidKeys {
32
+ if (vapidKeys) return vapidKeys;
33
+
34
+ var vapidPath = getVapidPath();
35
+ if (existsSync(vapidPath)) {
36
+ try {
37
+ vapidKeys = JSON.parse(readFileSync(vapidPath, "utf-8"));
38
+ if (vapidKeys) return vapidKeys;
39
+ } catch {}
40
+ }
41
+
42
+ var generated = webpush.generateVAPIDKeys();
43
+ vapidKeys = {
44
+ publicKey: generated.publicKey,
45
+ privateKey: generated.privateKey,
46
+ };
47
+
48
+ var dir = getLatticeHome();
49
+ if (!existsSync(dir)) {
50
+ mkdirSync(dir, { recursive: true });
51
+ }
52
+ writeFileSync(vapidPath, JSON.stringify(vapidKeys, null, 2), "utf-8");
53
+ log.server("Generated VAPID keys for push notifications");
54
+ return vapidKeys;
55
+ }
56
+
57
+ function loadSubscriptions(): void {
58
+ var subsPath = getSubscriptionsPath();
59
+ if (!existsSync(subsPath)) return;
60
+ try {
61
+ var data = JSON.parse(readFileSync(subsPath, "utf-8")) as PushSubscription[];
62
+ for (var i = 0; i < data.length; i++) {
63
+ subscriptions.set(data[i].endpoint, data[i]);
64
+ }
65
+ } catch {}
66
+ }
67
+
68
+ function saveSubscriptions(): void {
69
+ var arr: PushSubscription[] = [];
70
+ subscriptions.forEach(function (sub) {
71
+ arr.push(sub);
72
+ });
73
+ writeFileSync(getSubscriptionsPath(), JSON.stringify(arr), "utf-8");
74
+ }
75
+
76
+ export function initPush(): void {
77
+ var keys = ensureVapidKeys();
78
+ webpush.setVapidDetails(
79
+ "mailto:lattice@localhost",
80
+ keys.publicKey,
81
+ keys.privateKey,
82
+ );
83
+ loadSubscriptions();
84
+ log.server("Push notifications ready (%d subscription(s))", subscriptions.size);
85
+ }
86
+
87
+ export function getVapidPublicKey(): string {
88
+ return ensureVapidKeys().publicKey;
89
+ }
90
+
91
+ export function addPushSubscription(sub: PushSubscription): void {
92
+ subscriptions.set(sub.endpoint, sub);
93
+ saveSubscriptions();
94
+ }
95
+
96
+ export function removePushSubscription(endpoint: string): void {
97
+ subscriptions.delete(endpoint);
98
+ saveSubscriptions();
99
+ }
100
+
101
+ export interface PushPayload {
102
+ type: "done" | "permission_request" | "elicitation" | "error";
103
+ title: string;
104
+ body: string;
105
+ sessionId?: string;
106
+ projectSlug?: string;
107
+ }
108
+
109
+ export function sendPush(payload: PushPayload): void {
110
+ if (subscriptions.size === 0) return;
111
+
112
+ var json = JSON.stringify(payload);
113
+ subscriptions.forEach(function (sub, endpoint) {
114
+ webpush.sendNotification(sub, json).catch(function (err: { statusCode?: number }) {
115
+ if (err.statusCode === 410 || err.statusCode === 404 || err.statusCode === 403) {
116
+ subscriptions.delete(endpoint);
117
+ saveSubscriptions();
118
+ }
119
+ });
120
+ });
121
+ }
@@ -0,0 +1 @@
1
+ export var IS_NPM = true;
@@ -0,0 +1,103 @@
1
+ import * as p from "@clack/prompts";
2
+ import { existsSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ import { getLatticeHome, loadConfig, saveConfig } from "./config";
5
+ import type { LatticeConfig } from "@lattice/shared";
6
+ import { DEFAULT_PORT } from "@lattice/shared";
7
+
8
+ var BANNER = `
9
+ \x1b[36m██╗\x1b[0m \x1b[36m█████╗\x1b[0m \x1b[36m████████╗████████╗██╗\x1b[0m \x1b[36m██████╗\x1b[0m \x1b[36m███████╗\x1b[0m
10
+ \x1b[36m██║\x1b[0m \x1b[36m██╔══██╗\x1b[0m\x1b[2m╚══\x1b[0m\x1b[36m██\x1b[0m\x1b[2m╔══╝╚══\x1b[0m\x1b[36m██\x1b[0m\x1b[2m╔══╝\x1b[0m\x1b[36m██║\x1b[0m\x1b[36m██╔════╝\x1b[0m\x1b[36m██╔════╝\x1b[0m
11
+ \x1b[36m██║\x1b[0m \x1b[36m███████║\x1b[0m \x1b[36m██║\x1b[0m \x1b[36m██║\x1b[0m \x1b[36m██║██║\x1b[0m \x1b[36m█████╗\x1b[0m
12
+ \x1b[36m██║\x1b[0m \x1b[36m██╔══██║\x1b[0m \x1b[36m██║\x1b[0m \x1b[36m██║\x1b[0m \x1b[36m██║██║\x1b[0m \x1b[36m██╔══╝\x1b[0m
13
+ \x1b[36m███████╗██║ ██║\x1b[0m \x1b[36m██║\x1b[0m \x1b[36m██║\x1b[0m \x1b[36m██║\x1b[0m\x1b[2m╚\x1b[0m\x1b[36m██████╗███████╗\x1b[0m
14
+ \x1b[2m╚══════╝╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝╚══════╝\x1b[0m
15
+ `;
16
+
17
+ export function printBanner(): void {
18
+ console.log(BANNER);
19
+ }
20
+
21
+ export function printStatus(config: LatticeConfig, version: string, projectCount: number, sessionCount: number): void {
22
+ var protocol = config.tls ? "https" : "http";
23
+ var url = protocol + "://localhost:" + config.port;
24
+
25
+ console.log("");
26
+ p.note(
27
+ "lattice v" + version + " — " + url + "\n" +
28
+ projectCount + " project" + (projectCount !== 1 ? "s" : "") +
29
+ " · " + sessionCount + " session" + (sessionCount !== 1 ? "s" : "") + "\n" +
30
+ "Press Ctrl+C to stop",
31
+ "Running"
32
+ );
33
+ console.log("");
34
+ }
35
+
36
+ export async function printQrCode(url: string): Promise<void> {
37
+ try {
38
+ var qrcode = await import("qrcode");
39
+ var qr = await (qrcode as any).toString(url, {
40
+ type: "terminal",
41
+ small: true,
42
+ });
43
+ console.log(qr);
44
+ console.log(" \x1b[2m" + url + "\x1b[0m");
45
+ console.log("");
46
+ } catch {
47
+ console.log(" " + url);
48
+ console.log("");
49
+ }
50
+ }
51
+
52
+ export async function runOnboarding(): Promise<{ port: number; passphrase: string | null }> {
53
+ var configPath = join(getLatticeHome(), "config.json");
54
+ var isFirstRun = !existsSync(configPath);
55
+
56
+ if (!isFirstRun) {
57
+ var config = loadConfig();
58
+ return { port: config.port, passphrase: null };
59
+ }
60
+
61
+ printBanner();
62
+
63
+ p.intro("Welcome to Lattice");
64
+
65
+ p.note(
66
+ "Anyone with the URL gets full Claude Code access to this machine.\n" +
67
+ "Use a private network (Tailscale, VPN) or set a passphrase.",
68
+ "Security"
69
+ );
70
+
71
+ var portResult = await p.text({
72
+ message: "Port",
73
+ placeholder: String(DEFAULT_PORT),
74
+ defaultValue: String(DEFAULT_PORT),
75
+ validate: function (val: string | undefined) {
76
+ var n = parseInt(val || "", 10);
77
+ if (isNaN(n) || n < 1 || n > 65535) return "Enter a valid port (1-65535)";
78
+ return undefined;
79
+ },
80
+ });
81
+ if (p.isCancel(portResult)) {
82
+ p.cancel("Setup cancelled");
83
+ process.exit(0);
84
+ }
85
+ var port = parseInt(portResult as string, 10);
86
+
87
+ var passphraseResult = await p.password({
88
+ message: "Passphrase (optional, press Enter to skip)",
89
+ });
90
+ if (p.isCancel(passphraseResult)) {
91
+ p.cancel("Setup cancelled");
92
+ process.exit(0);
93
+ }
94
+ var passphrase = (passphraseResult as string) || null;
95
+
96
+ p.outro("Setup complete");
97
+
98
+ var config = loadConfig();
99
+ config.port = port;
100
+ saveConfig(config);
101
+
102
+ return { port, passphrase };
103
+ }