@cryptiklemur/lattice 1.46.7 → 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 (599) 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 +65 -96
  336. package/src/client/components/chat/ElicitationCard.tsx +235 -0
  337. package/{client/src → src/client}/components/chat/Message.tsx +261 -8
  338. package/{client/src → src/client}/components/chat/ModelSelector.tsx +29 -8
  339. package/src/client/components/settings/Appearance.tsx +275 -0
  340. package/{client/src → src/client}/components/settings/BudgetSettings.tsx +6 -2
  341. package/{client/src → src/client}/components/settings/Notifications.tsx +35 -0
  342. package/src/client/components/settings/ThemePreview.tsx +140 -0
  343. package/src/client/components/settings/ThemeWizard.tsx +405 -0
  344. package/{client/src → src/client}/components/sidebar/ProjectRail.tsx +43 -169
  345. package/{client/src → src/client}/components/sidebar/SessionList.tsx +27 -49
  346. package/{client/src → src/client}/components/sidebar/Sidebar.tsx +2 -6
  347. package/src/client/components/sidebar/UserIsland.tsx +282 -0
  348. package/{client/src → src/client}/components/sidebar/UserMenu.tsx +4 -2
  349. package/src/client/components/ui/ContextMenu.tsx +153 -0
  350. package/{client/src → src/client}/components/ui/PopupMenu.tsx +4 -2
  351. package/src/client/components/ui/SaveFooter.tsx +63 -0
  352. package/{client/src → src/client}/components/workspace/TabBar.tsx +17 -64
  353. package/{client/src → src/client}/hooks/useAnalytics.ts +17 -8
  354. package/src/client/hooks/usePushNotifications.ts +92 -0
  355. package/{client/src → src/client}/hooks/useSession.ts +123 -49
  356. package/{client/src → src/client}/hooks/useWebSocket.ts +0 -3
  357. package/src/client/lib/theme-derive.ts +196 -0
  358. package/{client/src → src/client}/stores/analytics.ts +20 -6
  359. package/{client/src → src/client}/stores/session.ts +63 -15
  360. package/{client/src → src/client}/stores/sidebar.ts +3 -1
  361. package/{client/src → src/client}/themes/index.ts +26 -0
  362. package/{server/src → src/server}/analytics/engine.ts +87 -30
  363. package/src/server/assets.ts +45 -0
  364. package/src/server/daemon.ts +547 -0
  365. package/{server/src → src/server}/handlers/analytics.ts +13 -8
  366. package/{server/src → src/server}/handlers/chat.ts +83 -1
  367. package/{server/src → src/server}/handlers/mesh.ts +3 -2
  368. package/{server/src → src/server}/handlers/plugins.ts +10 -13
  369. package/{server/src → src/server}/handlers/session.ts +7 -16
  370. package/{server/src → src/server}/handlers/settings.ts +3 -0
  371. package/{server/src → src/server}/handlers/skills.ts +7 -9
  372. package/src/server/handlers/themes.ts +121 -0
  373. package/{server/src → src/server}/handlers/update.ts +5 -23
  374. package/{server/src → src/server}/index.ts +100 -134
  375. package/{server/src → src/server}/mesh/connector.ts +1 -1
  376. package/{server/src → src/server}/project/context-breakdown.ts +4 -5
  377. package/{server/src → src/server}/project/pty-worker.cjs +1 -1
  378. package/{server/src → src/server}/project/sdk-bridge.ts +526 -428
  379. package/{server/src → src/server}/project/session.ts +117 -42
  380. package/{server/src → src/server}/project/terminal.ts +7 -24
  381. package/src/server/project/warmup.ts +285 -0
  382. package/src/server/push.ts +121 -0
  383. package/src/server/runtime.ts +1 -0
  384. package/src/server/tui.ts +103 -0
  385. package/{server/src → src/server}/update-checker.ts +10 -10
  386. package/{server/src → src/server}/ws/broadcast.ts +8 -8
  387. package/{server/src → src/server}/ws/router.ts +21 -25
  388. package/{shared/src → src/shared}/analytics.ts +1 -0
  389. package/{shared/src → src/shared}/constants.ts +1 -0
  390. package/{shared/src → src/shared}/messages.ts +151 -15
  391. package/{shared/src → src/shared}/models.ts +7 -1
  392. package/tsconfig.json +7 -8
  393. package/{client/vite.config.ts → vite.config.ts} +14 -18
  394. package/.editorconfig +0 -12
  395. package/.github/workflows/ci.yml +0 -81
  396. package/.github/workflows/release.yml +0 -87
  397. package/.impeccable.md +0 -66
  398. package/.releaserc.json +0 -33
  399. package/.serena/memories/code_style_and_conventions.md +0 -35
  400. package/.serena/memories/project_overview.md +0 -51
  401. package/.serena/memories/suggested_commands.md +0 -32
  402. package/.serena/memories/task_completion_checklist.md +0 -15
  403. package/.serena/project.yml +0 -152
  404. package/CLAUDE.md +0 -71
  405. package/CONTRIBUTING.md +0 -93
  406. package/bun.lock +0 -2246
  407. package/bunfig.toml +0 -2
  408. package/client/package.json +0 -43
  409. package/client/src/components/settings/Appearance.tsx +0 -152
  410. package/client/src/components/sidebar/UserIsland.tsx +0 -136
  411. package/client/src/components/ui/SaveFooter.tsx +0 -38
  412. package/client/tsconfig.json +0 -18
  413. package/install.sh +0 -71
  414. package/playwright.config.ts +0 -19
  415. package/scripts/build-binary.ts +0 -157
  416. package/scripts/postinstall.js +0 -31
  417. package/server/package.json +0 -24
  418. package/server/src/_generated/embedded-assets.ts +0 -2
  419. package/server/src/assets.ts +0 -69
  420. package/server/src/daemon.ts +0 -442
  421. package/server/src/runtime.ts +0 -4
  422. package/server/tsconfig.json +0 -20
  423. package/shared/package.json +0 -11
  424. package/shared/tsconfig.json +0 -15
  425. package/tests/accessibility.spec.ts +0 -77
  426. package/tests/keyboard-shortcuts.spec.ts +0 -70
  427. package/tests/message-actions.spec.ts +0 -112
  428. package/tests/onboarding.spec.ts +0 -72
  429. package/tests/session-flow.spec.ts +0 -117
  430. package/tests/session-preview.spec.ts +0 -83
  431. package/themes/amoled.json +0 -20
  432. package/themes/ayu-light.json +0 -9
  433. package/themes/catppuccin-latte.json +0 -9
  434. package/themes/catppuccin-mocha.json +0 -9
  435. package/themes/clay-light.json +0 -10
  436. package/themes/clay.json +0 -10
  437. package/themes/dracula.json +0 -9
  438. package/themes/everforest-light.json +0 -9
  439. package/themes/everforest.json +0 -9
  440. package/themes/github-light.json +0 -9
  441. package/themes/gruvbox-dark.json +0 -9
  442. package/themes/gruvbox-light.json +0 -9
  443. package/themes/monokai.json +0 -9
  444. package/themes/nord-light.json +0 -9
  445. package/themes/nord.json +0 -9
  446. package/themes/one-dark.json +0 -9
  447. package/themes/one-light.json +0 -9
  448. package/themes/rose-pine-dawn.json +0 -9
  449. package/themes/rose-pine.json +0 -9
  450. package/themes/solarized-dark.json +0 -9
  451. package/themes/solarized-light.json +0 -9
  452. package/themes/tokyo-night-light.json +0 -9
  453. package/themes/tokyo-night.json +0 -9
  454. package/tp.js +0 -19
  455. /package/{client/public → dist/client}/icons/icon-192.svg +0 -0
  456. /package/{client/public → dist/client}/icons/icon-512.svg +0 -0
  457. /package/{client/src → src/client}/App.tsx +0 -0
  458. /package/{client/src → src/client}/commands.ts +0 -0
  459. /package/{client/src → src/client}/components/analytics/PeriodSelector.tsx +0 -0
  460. /package/{client/src → src/client}/components/analytics/chartTokens.ts +0 -0
  461. /package/{client/src → src/client}/components/analytics/charts/DailySummaryCards.tsx +0 -0
  462. /package/{client/src → src/client}/components/analytics/charts/NodeFleetOverview.tsx +0 -0
  463. /package/{client/src → src/client}/components/analytics/charts/PermissionBreakdown.tsx +0 -0
  464. /package/{client/src → src/client}/components/analytics/charts/SessionComplexityList.tsx +0 -0
  465. /package/{client/src → src/client}/components/analytics/charts/TokenSankeyChart.tsx +0 -0
  466. /package/{client/src → src/client}/components/analytics/charts/ToolTreemap.tsx +0 -0
  467. /package/{client/src → src/client}/components/auth/PassphrasePrompt.tsx +0 -0
  468. /package/{client/src → src/client}/components/chat/AttachmentChips.tsx +0 -0
  469. /package/{client/src → src/client}/components/chat/ChatInput.tsx +0 -0
  470. /package/{client/src → src/client}/components/chat/CommandPalette.tsx +0 -0
  471. /package/{client/src → src/client}/components/chat/PermissionModeSelector.tsx +0 -0
  472. /package/{client/src → src/client}/components/chat/PromptQuestion.tsx +0 -0
  473. /package/{client/src → src/client}/components/chat/StatusBar.tsx +0 -0
  474. /package/{client/src → src/client}/components/chat/TodoCard.tsx +0 -0
  475. /package/{client/src → src/client}/components/chat/ToolGroup.tsx +0 -0
  476. /package/{client/src → src/client}/components/chat/ToolResultRenderer.tsx +0 -0
  477. /package/{client/src → src/client}/components/chat/VoiceRecorder.tsx +0 -0
  478. /package/{client/src → src/client}/components/chat/toolSummary.ts +0 -0
  479. /package/{client/src → src/client}/components/dashboard/DashboardView.tsx +0 -0
  480. /package/{client/src → src/client}/components/dashboard/ProjectDashboardView.tsx +0 -0
  481. /package/{client/src → src/client}/components/mesh/NodeBadge.tsx +0 -0
  482. /package/{client/src → src/client}/components/mesh/PairingDialog.tsx +0 -0
  483. /package/{client/src → src/client}/components/project-settings/ProjectClaude.tsx +0 -0
  484. /package/{client/src → src/client}/components/project-settings/ProjectEnvironment.tsx +0 -0
  485. /package/{client/src → src/client}/components/project-settings/ProjectGeneral.tsx +0 -0
  486. /package/{client/src → src/client}/components/project-settings/ProjectMcp.tsx +0 -0
  487. /package/{client/src → src/client}/components/project-settings/ProjectMemory.tsx +0 -0
  488. /package/{client/src → src/client}/components/project-settings/ProjectNotifications.tsx +0 -0
  489. /package/{client/src → src/client}/components/project-settings/ProjectPermissions.tsx +0 -0
  490. /package/{client/src → src/client}/components/project-settings/ProjectPlugins.tsx +0 -0
  491. /package/{client/src → src/client}/components/project-settings/ProjectRules.tsx +0 -0
  492. /package/{client/src → src/client}/components/project-settings/ProjectSettingsView.tsx +0 -0
  493. /package/{client/src → src/client}/components/project-settings/ProjectSkills.tsx +0 -0
  494. /package/{client/src → src/client}/components/settings/ClaudeSettings.tsx +0 -0
  495. /package/{client/src → src/client}/components/settings/Editor.tsx +0 -0
  496. /package/{client/src → src/client}/components/settings/Environment.tsx +0 -0
  497. /package/{client/src → src/client}/components/settings/GlobalMcp.tsx +0 -0
  498. /package/{client/src → src/client}/components/settings/GlobalMemory.tsx +0 -0
  499. /package/{client/src → src/client}/components/settings/GlobalPlugins.tsx +0 -0
  500. /package/{client/src → src/client}/components/settings/GlobalRules.tsx +0 -0
  501. /package/{client/src → src/client}/components/settings/GlobalSkills.tsx +0 -0
  502. /package/{client/src → src/client}/components/settings/MeshStatus.tsx +0 -0
  503. /package/{client/src → src/client}/components/settings/SettingsView.tsx +0 -0
  504. /package/{client/src → src/client}/components/settings/SkillMarketplace.tsx +0 -0
  505. /package/{client/src → src/client}/components/settings/mcp-shared.tsx +0 -0
  506. /package/{client/src → src/client}/components/settings/skill-shared.tsx +0 -0
  507. /package/{client/src → src/client}/components/setup/SetupWizard.tsx +0 -0
  508. /package/{client/src → src/client}/components/sidebar/AddProjectModal.tsx +0 -0
  509. /package/{client/src → src/client}/components/sidebar/NodeSettingsModal.tsx +0 -0
  510. /package/{client/src → src/client}/components/sidebar/ProjectDropdown.tsx +0 -0
  511. /package/{client/src → src/client}/components/sidebar/SearchFilter.tsx +0 -0
  512. /package/{client/src → src/client}/components/sidebar/SettingsSidebar.tsx +0 -0
  513. /package/{client/src → src/client}/components/ui/CommandPalette.tsx +0 -0
  514. /package/{client/src → src/client}/components/ui/ErrorBoundary.tsx +0 -0
  515. /package/{client/src → src/client}/components/ui/IconPicker.tsx +0 -0
  516. /package/{client/src → src/client}/components/ui/KeyboardShortcuts.tsx +0 -0
  517. /package/{client/src → src/client}/components/ui/LatticeLogomark.tsx +0 -0
  518. /package/{client/src → src/client}/components/ui/NodeDisconnectedOverlay.tsx +0 -0
  519. /package/{client/src → src/client}/components/ui/Toast.tsx +0 -0
  520. /package/{client/src → src/client}/components/ui/UpdateBanner.tsx +0 -0
  521. /package/{client/src → src/client}/components/ui/UpdatePrompt.tsx +0 -0
  522. /package/{client/src → src/client}/components/workspace/BookmarksView.tsx +0 -0
  523. /package/{client/src → src/client}/components/workspace/FileBrowser.tsx +0 -0
  524. /package/{client/src → src/client}/components/workspace/FileTree.tsx +0 -0
  525. /package/{client/src → src/client}/components/workspace/FileViewer.tsx +0 -0
  526. /package/{client/src → src/client}/components/workspace/NoteCard.tsx +0 -0
  527. /package/{client/src → src/client}/components/workspace/NotesView.tsx +0 -0
  528. /package/{client/src → src/client}/components/workspace/ScheduledTasksView.tsx +0 -0
  529. /package/{client/src → src/client}/components/workspace/SplitPane.tsx +0 -0
  530. /package/{client/src → src/client}/components/workspace/TaskCard.tsx +0 -0
  531. /package/{client/src → src/client}/components/workspace/TaskEditModal.tsx +0 -0
  532. /package/{client/src → src/client}/components/workspace/TerminalInstance.tsx +0 -0
  533. /package/{client/src → src/client}/components/workspace/TerminalView.tsx +0 -0
  534. /package/{client/src → src/client}/components/workspace/WorkspaceView.tsx +0 -0
  535. /package/{client/src → src/client}/hooks/useAttachments.ts +0 -0
  536. /package/{client/src → src/client}/hooks/useBookmarks.ts +0 -0
  537. /package/{client/src → src/client}/hooks/useEditorConfig.ts +0 -0
  538. /package/{client/src → src/client}/hooks/useFocusTrap.ts +0 -0
  539. /package/{client/src → src/client}/hooks/useIdleDetection.ts +0 -0
  540. /package/{client/src → src/client}/hooks/useInstallPrompt.ts +0 -0
  541. /package/{client/src → src/client}/hooks/useMesh.ts +0 -0
  542. /package/{client/src → src/client}/hooks/useNotifications.ts +0 -0
  543. /package/{client/src → src/client}/hooks/useOnline.ts +0 -0
  544. /package/{client/src → src/client}/hooks/useProjectSettings.ts +0 -0
  545. /package/{client/src → src/client}/hooks/useProjects.ts +0 -0
  546. /package/{client/src → src/client}/hooks/useSaveState.ts +0 -0
  547. /package/{client/src → src/client}/hooks/useSidebar.ts +0 -0
  548. /package/{client/src → src/client}/hooks/useSkills.ts +0 -0
  549. /package/{client/src → src/client}/hooks/useSpinnerVerb.ts +0 -0
  550. /package/{client/src → src/client}/hooks/useSwipeDrawer.ts +0 -0
  551. /package/{client/src → src/client}/hooks/useTheme.ts +0 -0
  552. /package/{client/src → src/client}/hooks/useTimeTick.ts +0 -0
  553. /package/{client/src → src/client}/hooks/useVoiceRecorder.ts +0 -0
  554. /package/{client/src → src/client}/hooks/useWorkspace.ts +0 -0
  555. /package/{client/src → src/client}/lib/workspace-url.ts +0 -0
  556. /package/{client/src → src/client}/main.tsx +0 -0
  557. /package/{client/src → src/client}/providers/WebSocketProvider.tsx +0 -0
  558. /package/{client/src → src/client}/router.tsx +0 -0
  559. /package/{client/src → src/client}/stores/bookmarks.ts +0 -0
  560. /package/{client/src → src/client}/stores/mesh.ts +0 -0
  561. /package/{client/src → src/client}/stores/theme.ts +0 -0
  562. /package/{client/src → src/client}/stores/workspace.ts +0 -0
  563. /package/{client/src → src/client}/styles/global.css +0 -0
  564. /package/{client/src → src/client}/styles/theme-vars.css +0 -0
  565. /package/{client/src → src/client}/utils/editorUrl.ts +0 -0
  566. /package/{client/src → src/client}/utils/findDuplicateKeys.ts +0 -0
  567. /package/{client/src → src/client}/utils/formatSessionTitle.ts +0 -0
  568. /package/{client/src → src/client}/vite-env.d.ts +0 -0
  569. /package/{server/src → src/server}/auth/passphrase.ts +0 -0
  570. /package/{server/src → src/server}/config.ts +0 -0
  571. /package/{server/src → src/server}/features/ralph-loop.ts +0 -0
  572. /package/{server/src → src/server}/features/scheduler.ts +0 -0
  573. /package/{server/src → src/server}/features/sticky-notes.ts +0 -0
  574. /package/{server/src → src/server}/handlers/attachment.ts +0 -0
  575. /package/{server/src → src/server}/handlers/bookmarks.ts +0 -0
  576. /package/{server/src → src/server}/handlers/editor.ts +0 -0
  577. /package/{server/src → src/server}/handlers/fs.ts +0 -0
  578. /package/{server/src → src/server}/handlers/loop.ts +0 -0
  579. /package/{server/src → src/server}/handlers/memory.ts +0 -0
  580. /package/{server/src → src/server}/handlers/notes.ts +0 -0
  581. /package/{server/src → src/server}/handlers/project-settings.ts +0 -0
  582. /package/{server/src → src/server}/handlers/scheduler.ts +0 -0
  583. /package/{server/src → src/server}/handlers/terminal.ts +0 -0
  584. /package/{server/src → src/server}/identity.ts +0 -0
  585. /package/{server/src → src/server}/logger.ts +0 -0
  586. /package/{server/src → src/server}/mesh/crypto.ts +0 -0
  587. /package/{server/src → src/server}/mesh/discovery.ts +0 -0
  588. /package/{server/src → src/server}/mesh/pairing.ts +0 -0
  589. /package/{server/src → src/server}/mesh/peers.ts +0 -0
  590. /package/{server/src → src/server}/mesh/proxy.ts +0 -0
  591. /package/{server/src → src/server}/mesh/session-sync.ts +0 -0
  592. /package/{server/src → src/server}/project/bookmarks.ts +0 -0
  593. /package/{server/src → src/server}/project/file-browser.ts +0 -0
  594. /package/{server/src → src/server}/project/project-files.ts +0 -0
  595. /package/{server/src → src/server}/project/registry.ts +0 -0
  596. /package/{server/src → src/server}/tls.ts +0 -0
  597. /package/{server/src → src/server}/ws/server.ts +0 -0
  598. /package/{shared/src → src/shared}/index.ts +0 -0
  599. /package/{shared/src → src/shared}/project-settings.ts +0 -0
@@ -0,0 +1,235 @@
1
+ import { useState } from "react";
2
+ import { Globe, FormInput, Check, X, ExternalLink } from "lucide-react";
3
+ import { useWebSocket } from "../../hooks/useWebSocket";
4
+
5
+ interface ElicitationCardProps {
6
+ requestId: string;
7
+ serverName: string;
8
+ message: string;
9
+ mode: "form" | "url";
10
+ url?: string | null;
11
+ requestedSchema?: Record<string, unknown> | null;
12
+ resolved?: boolean;
13
+ resolvedAction?: "accept" | "decline";
14
+ }
15
+
16
+ interface SchemaProperty {
17
+ type?: string;
18
+ description?: string;
19
+ enum?: string[];
20
+ default?: unknown;
21
+ }
22
+
23
+ function renderFormField(
24
+ key: string,
25
+ prop: SchemaProperty,
26
+ value: unknown,
27
+ onChange: (key: string, val: unknown) => void,
28
+ required: boolean,
29
+ ) {
30
+ var label = key.replace(/_/g, " ").replace(/\b\w/g, function (c) { return c.toUpperCase(); });
31
+
32
+ if (prop.type === "boolean") {
33
+ return (
34
+ <label key={key} className="flex items-center gap-2.5 py-1.5 cursor-pointer">
35
+ <input
36
+ type="checkbox"
37
+ checked={!!value}
38
+ onChange={function (e) { onChange(key, e.target.checked); }}
39
+ className="checkbox checkbox-xs checkbox-primary"
40
+ />
41
+ <span className="text-[12px] text-base-content/70">{label}</span>
42
+ {prop.description && (
43
+ <span className="text-[10px] text-base-content/30" title={prop.description}>?</span>
44
+ )}
45
+ </label>
46
+ );
47
+ }
48
+
49
+ if (prop.enum && prop.enum.length > 0) {
50
+ return (
51
+ <div key={key} className="flex flex-col gap-1">
52
+ <label className="text-[10px] font-mono uppercase tracking-wider text-base-content/35">
53
+ {label}{required && <span className="text-error/50 ml-0.5">*</span>}
54
+ </label>
55
+ <select
56
+ value={String(value || "")}
57
+ onChange={function (e) { onChange(key, e.target.value); }}
58
+ className="select select-xs select-bordered bg-base-content/[0.03] text-[12px] text-base-content/70"
59
+ >
60
+ <option value="">Select...</option>
61
+ {prop.enum.map(function (opt) {
62
+ return <option key={opt} value={opt}>{opt}</option>;
63
+ })}
64
+ </select>
65
+ </div>
66
+ );
67
+ }
68
+
69
+ if (prop.type === "number" || prop.type === "integer") {
70
+ return (
71
+ <div key={key} className="flex flex-col gap-1">
72
+ <label className="text-[10px] font-mono uppercase tracking-wider text-base-content/35">
73
+ {label}{required && <span className="text-error/50 ml-0.5">*</span>}
74
+ </label>
75
+ <input
76
+ type="number"
77
+ value={value != null ? String(value) : ""}
78
+ placeholder={prop.description || ""}
79
+ onChange={function (e) { onChange(key, e.target.value ? Number(e.target.value) : ""); }}
80
+ className="input input-xs input-bordered bg-base-content/[0.03] text-[12px] text-base-content/70 placeholder:text-base-content/20"
81
+ />
82
+ </div>
83
+ );
84
+ }
85
+
86
+ return (
87
+ <div key={key} className="flex flex-col gap-1">
88
+ <label className="text-[10px] font-mono uppercase tracking-wider text-base-content/35">
89
+ {label}{required && <span className="text-error/50 ml-0.5">*</span>}
90
+ </label>
91
+ <input
92
+ type="text"
93
+ value={String(value || "")}
94
+ placeholder={prop.description || ""}
95
+ onChange={function (e) { onChange(key, e.target.value); }}
96
+ className="input input-xs input-bordered bg-base-content/[0.03] text-[12px] text-base-content/70 placeholder:text-base-content/20"
97
+ />
98
+ </div>
99
+ );
100
+ }
101
+
102
+ export function ElicitationCard(props: ElicitationCardProps) {
103
+ var { send } = useWebSocket();
104
+ var [formData, setFormData] = useState<Record<string, unknown>>({});
105
+ var [submitted, setSubmitted] = useState(props.resolved || false);
106
+ var [action, setAction] = useState<"accept" | "decline" | null>(props.resolvedAction || null);
107
+
108
+ function handleFieldChange(key: string, value: unknown) {
109
+ setFormData(function (prev) {
110
+ var next = { ...prev };
111
+ next[key] = value;
112
+ return next;
113
+ });
114
+ }
115
+
116
+ function handleSubmit(submitAction: "accept" | "decline") {
117
+ setSubmitted(true);
118
+ setAction(submitAction);
119
+ send({
120
+ type: "chat:elicitation_response",
121
+ requestId: props.requestId,
122
+ action: submitAction,
123
+ content: submitAction === "accept" ? formData : undefined,
124
+ } as any);
125
+ }
126
+
127
+ if (submitted) {
128
+ var isAccepted = action === "accept";
129
+ return (
130
+ <div className="ml-14 mr-5 py-0.5 max-w-[95%] sm:max-w-[75%]">
131
+ <div className={"rounded-lg text-[12px] border px-2.5 py-1.5 flex items-center gap-2 " + (isAccepted ? "border-success/15 bg-success/3" : "border-error/15 bg-error/3")}>
132
+ {isAccepted ? <Check size={12} className="text-success" /> : <X size={12} className="text-error" />}
133
+ <span className="text-base-content/35">{isAccepted ? "Submitted" : "Declined"}</span>
134
+ <Globe size={11} className="text-base-content/20" />
135
+ <span className="text-[11px] text-base-content/40">{props.serverName}</span>
136
+ </div>
137
+ </div>
138
+ );
139
+ }
140
+
141
+ var schema = props.requestedSchema;
142
+ var properties: Record<string, SchemaProperty> = {};
143
+ var requiredFields: string[] = [];
144
+ if (schema && typeof schema === "object") {
145
+ if (schema.properties && typeof schema.properties === "object") {
146
+ properties = schema.properties as Record<string, SchemaProperty>;
147
+ }
148
+ if (Array.isArray(schema.required)) {
149
+ requiredFields = schema.required as string[];
150
+ }
151
+ }
152
+ var hasFormFields = Object.keys(properties).length > 0;
153
+
154
+ return (
155
+ <div className="ml-14 mr-5 py-1 max-w-[95%] sm:max-w-[75%]">
156
+ <div className="border border-info/25 bg-info/5 rounded-lg overflow-hidden">
157
+ <div className="flex items-center gap-2.5 px-3.5 py-2.5 border-b border-base-content/5 bg-base-content/[0.02]">
158
+ {props.mode === "url"
159
+ ? <Globe size={14} className="text-info/50 flex-shrink-0" />
160
+ : <FormInput size={14} className="text-info/50 flex-shrink-0" />
161
+ }
162
+ <span className="text-[10px] font-mono font-bold uppercase tracking-widest text-info/40">
163
+ {props.serverName}
164
+ </span>
165
+ <span className="flex-1" />
166
+ <span className="text-[9px] font-mono text-base-content/20">{props.mode} input</span>
167
+ </div>
168
+
169
+ <div className="px-3.5 py-3">
170
+ {props.message && (
171
+ <div className="text-[13px] text-base-content/75 mb-3 leading-relaxed">{props.message}</div>
172
+ )}
173
+
174
+ {props.mode === "url" && props.url && (
175
+ <div className="flex flex-col gap-2">
176
+ <a
177
+ href={props.url}
178
+ target="_blank"
179
+ rel="noopener noreferrer"
180
+ className="flex items-center gap-2 px-3 py-2 rounded-lg bg-base-content/[0.04] border border-base-content/8 text-[12px] text-info/70 hover:bg-base-content/[0.07] hover:border-info/20 transition-colors"
181
+ >
182
+ <ExternalLink size={12} />
183
+ <span className="truncate flex-1">{props.url}</span>
184
+ </a>
185
+ </div>
186
+ )}
187
+
188
+ {props.mode === "form" && hasFormFields && (
189
+ <div className="flex flex-col gap-2.5">
190
+ {Object.entries(properties).map(function ([key, prop]) {
191
+ return renderFormField(
192
+ key,
193
+ prop,
194
+ formData[key],
195
+ handleFieldChange,
196
+ requiredFields.includes(key),
197
+ );
198
+ })}
199
+ </div>
200
+ )}
201
+
202
+ {props.mode === "form" && !hasFormFields && (
203
+ <div className="flex flex-col gap-1.5">
204
+ <label className="text-[10px] font-mono uppercase tracking-wider text-base-content/35">Response</label>
205
+ <textarea
206
+ rows={3}
207
+ value={String(formData._raw || "")}
208
+ onChange={function (e) { handleFieldChange("_raw", e.target.value); }}
209
+ placeholder="Enter your response..."
210
+ className="textarea textarea-bordered textarea-xs bg-base-content/[0.03] text-[12px] text-base-content/70 placeholder:text-base-content/20"
211
+ />
212
+ </div>
213
+ )}
214
+
215
+ <div className="flex items-center gap-2 mt-3">
216
+ <button
217
+ onClick={function () { handleSubmit("accept"); }}
218
+ className="flex items-center gap-1.5 px-3 py-1.5 rounded-lg bg-success/15 text-success text-[11px] font-medium hover:bg-success/25 transition-colors cursor-pointer"
219
+ >
220
+ <Check size={11} />
221
+ {props.mode === "url" ? "Done" : "Submit"}
222
+ </button>
223
+ <button
224
+ onClick={function () { handleSubmit("decline"); }}
225
+ className="flex items-center gap-1.5 px-3 py-1.5 rounded-lg bg-base-content/5 text-base-content/40 text-[11px] font-medium hover:bg-base-content/10 hover:text-base-content/60 transition-colors cursor-pointer"
226
+ >
227
+ <X size={11} />
228
+ Decline
229
+ </button>
230
+ </div>
231
+ </div>
232
+ </div>
233
+ </div>
234
+ );
235
+ }
@@ -1,7 +1,7 @@
1
1
  import { useState, useRef, useEffect, memo, useMemo } from "react";
2
2
  import Markdown from "react-markdown";
3
3
  import remarkGfm from "remark-gfm";
4
- import { Wrench, TriangleAlert, ChevronDown, ChevronRight, Check, X, Shield, Zap, Link, Copy, SquarePlus, Bookmark, BookmarkCheck } from "lucide-react";
4
+ import { Wrench, TriangleAlert, ChevronDown, ChevronRight, Check, X, Shield, Zap, Link, Copy, SquarePlus, Bookmark, BookmarkCheck, RotateCcw, ClipboardCopy, FileText, MessageSquarePlus, History } from "lucide-react";
5
5
  import type { HistoryMessage, ChatPermissionResponseMessage } from "@lattice/shared";
6
6
  import { useStore } from "@tanstack/react-store";
7
7
  import { useWebSocket } from "../../hooks/useWebSocket";
@@ -11,6 +11,9 @@ import { ToolResultRenderer } from "./ToolResultRenderer";
11
11
  import { formatToolSummary } from "./toolSummary";
12
12
  import { PromptQuestion } from "./PromptQuestion";
13
13
  import { TodoCard } from "./TodoCard";
14
+ import { ElicitationCard } from "./ElicitationCard";
15
+ import { ContextMenu, useContextMenu } from "../ui/ContextMenu";
16
+ import type { ContextMenuEntry } from "../ui/ContextMenu";
14
17
 
15
18
  function TableWrapper(props: React.HTMLAttributes<HTMLTableElement>) {
16
19
  var wrapperRef = useRef<HTMLDivElement>(null);
@@ -185,7 +188,7 @@ function parseSkillInvocation(text: string): { skillName: string; content: strin
185
188
  function SkillMessage(props: { skillName: string; content: string; time: string | null; uuid?: string }) {
186
189
  var [expanded, setExpanded] = useState(false);
187
190
  return (
188
- <div id={props.uuid ? "msg-" + props.uuid : undefined} data-allow-context-menu className="chat chat-end px-5 py-1 group/msg">
191
+ <div id={props.uuid ? "msg-" + props.uuid : undefined} className="chat chat-end px-5 py-1 group/msg">
189
192
  <div className="chat-bubble chat-bubble-primary text-[13px] leading-relaxed break-words max-w-[95%] sm:max-w-[85%] shadow-sm">
190
193
  <button
191
194
  type="button"
@@ -221,28 +224,156 @@ function SkillMessage(props: { skillName: string; content: string; time: string
221
224
  );
222
225
  }
223
226
 
227
+ function RewindButton(props: { uuid: string }) {
228
+ var ws = useWebSocket();
229
+ var [pending, setPending] = useState(false);
230
+ var [preview, setPreview] = useState<{ canRewind: boolean; filesChanged?: number; error?: string } | null>(null);
231
+
232
+ useEffect(function () {
233
+ function handlePreview(msg: any) {
234
+ if (msg.type === "chat:rewind_preview_result" && msg.messageUuid === props.uuid) {
235
+ setPreview(msg);
236
+ setPending(false);
237
+ }
238
+ }
239
+ function handleExecResult(msg: any) {
240
+ if (msg.type === "chat:rewind_execute_result" && msg.messageUuid === props.uuid) {
241
+ setPreview(null);
242
+ }
243
+ }
244
+ ws.subscribe("chat:rewind_preview_result", handlePreview);
245
+ ws.subscribe("chat:rewind_execute_result", handleExecResult);
246
+ return function () {
247
+ ws.unsubscribe("chat:rewind_preview_result", handlePreview);
248
+ ws.unsubscribe("chat:rewind_execute_result", handleExecResult);
249
+ };
250
+ }, [ws, props.uuid]);
251
+
252
+ function handleClick() {
253
+ if (preview) {
254
+ ws.send({ type: "chat:rewind_execute", messageUuid: props.uuid, mode: "files" } as any);
255
+ setPreview(null);
256
+ return;
257
+ }
258
+ setPending(true);
259
+ ws.send({ type: "chat:rewind_preview", messageUuid: props.uuid } as any);
260
+ }
261
+
262
+ if (preview && !preview.canRewind) {
263
+ return (
264
+ <span className="text-error/60 text-[10px]" title={preview.error || "Cannot rewind"}>
265
+ {preview.error || "Cannot rewind"}
266
+ </span>
267
+ );
268
+ }
269
+
270
+ if (preview && preview.canRewind) {
271
+ return (
272
+ <span className="flex items-center gap-1">
273
+ <button
274
+ onClick={handleClick}
275
+ className="btn btn-ghost btn-xs h-4 min-h-0 px-1 text-warning/70 hover:text-warning"
276
+ title={"Rewind files (" + (preview.filesChanged || 0) + " changed)"}
277
+ >
278
+ <RotateCcw className="!size-3" />
279
+ <span className="text-[10px]">Rewind {preview.filesChanged || 0} files</span>
280
+ </button>
281
+ <button
282
+ onClick={function () { setPreview(null); }}
283
+ className="btn btn-ghost btn-xs h-4 min-h-0 px-0.5 text-base-content/30 hover:text-base-content/60"
284
+ >
285
+ <X className="!size-3" />
286
+ </button>
287
+ </span>
288
+ );
289
+ }
290
+
291
+ return (
292
+ <button
293
+ onClick={handleClick}
294
+ disabled={pending}
295
+ className="btn btn-ghost btn-xs h-4 min-h-0 px-0.5 opacity-0 group-hover/msg:opacity-100 transition-opacity text-base-content/30 hover:text-base-content/60"
296
+ title="Rewind files to this point"
297
+ >
298
+ <RotateCcw className={"!size-3" + (pending ? " animate-spin" : "")} />
299
+ </button>
300
+ );
301
+ }
302
+
224
303
  function UserMessage(props: { message: HistoryMessage }) {
225
304
  var msg = props.message;
226
305
  var time = formatTime(msg.timestamp);
227
306
  var text = msg.text || "";
228
307
  var skill = parseSkillInvocation(text);
308
+ var ctxMenu = useContextMenu<HistoryMessage>();
309
+ var ws = useWebSocket();
310
+ var bookmarkState = useStore(getBookmarkStore(), function (s) { return s; });
311
+ var isBookmarked = useMemo(function () {
312
+ if (!msg.uuid) return false;
313
+ for (var i = 0; i < bookmarkState.bookmarks.length; i++) {
314
+ if (bookmarkState.bookmarks[i].messageUuid === msg.uuid) return true;
315
+ }
316
+ return false;
317
+ }, [msg.uuid, bookmarkState.bookmarks]);
318
+
319
+ function handleNewSession() {
320
+ var state = getSessionStore().state;
321
+ if (!state.activeProjectSlug) return;
322
+ setPendingPrefill(text);
323
+ ws.send({ type: "session:create", projectSlug: state.activeProjectSlug });
324
+ }
325
+
326
+ function handleBookmarkToggle() {
327
+ var state = getSessionStore().state;
328
+ if (!state.activeSessionId || !state.activeProjectSlug || !msg.uuid) return;
329
+ if (isBookmarked) {
330
+ var bm = findBookmarkByUuid(msg.uuid);
331
+ if (bm) {
332
+ ws.send({ type: "bookmark:remove", id: bm.id });
333
+ }
334
+ } else {
335
+ ws.send({
336
+ type: "bookmark:add",
337
+ sessionId: state.activeSessionId,
338
+ projectSlug: state.activeProjectSlug,
339
+ messageUuid: msg.uuid,
340
+ messageText: text.slice(0, 100),
341
+ messageType: "user",
342
+ });
343
+ }
344
+ }
345
+
346
+ function buildContextItems(): ContextMenuEntry[] {
347
+ return [
348
+ { label: "Copy", icon: <Copy size={14} />, onClick: function () { navigator.clipboard.writeText(text); } },
349
+ { label: "Copy as plain text", icon: <FileText size={14} />, onClick: function () { navigator.clipboard.writeText(stripMarkdown(text)); } },
350
+ { type: "divider" as const },
351
+ { label: "Start new session with this message", icon: <MessageSquarePlus size={14} />, onClick: handleNewSession },
352
+ { type: "divider" as const },
353
+ { label: isBookmarked ? "Unbookmark" : "Bookmark", icon: isBookmarked ? <BookmarkCheck size={14} /> : <Bookmark size={14} />, onClick: handleBookmarkToggle, hidden: !msg.uuid },
354
+ { label: "Copy link to message", icon: <Link size={14} />, onClick: function () { navigator.clipboard.writeText(window.location.origin + window.location.pathname + "#msg-" + msg.uuid); }, hidden: !msg.uuid },
355
+ ];
356
+ }
357
+
229
358
  if (skill) {
230
359
  return <SkillMessage skillName={skill.skillName} content={skill.content} time={time} uuid={msg.uuid} />;
231
360
  }
232
361
  return (
233
- <div id={msg.uuid ? "msg-" + msg.uuid : undefined} data-allow-context-menu className="chat chat-end px-5 py-1 group/msg">
362
+ <div id={msg.uuid ? "msg-" + msg.uuid : undefined} data-allow-context-menu className="chat chat-end px-5 py-1 group/msg" onContextMenu={function (e) { ctxMenu.open(e, msg); }}>
234
363
  <div className="chat-bubble chat-bubble-primary text-[13px] leading-relaxed break-words max-w-[95%] sm:max-w-[85%] shadow-sm">
235
- <div className="prose prose-sm max-w-none [&>*:first-child]:mt-0 [&>*:last-child]:mb-0 prose-headings:text-primary-content prose-p:text-primary-content prose-strong:text-primary-content prose-code:text-primary-content/80 prose-pre:bg-primary/20 prose-a:text-primary-content/90 prose-a:underline">
364
+ <div className="prose prose-sm max-w-none [&>*:first-child]:mt-0 [&>*:last-child]:mb-0 prose-headings:text-primary-content prose-p:text-primary-content prose-strong:text-primary-content prose-code:text-primary-content/80 prose-pre:bg-primary/20 prose-a:text-primary-content/90 prose-a:underline prose-li:text-primary-content [&_ul>li::marker]:text-primary-content [&_ol>li::marker]:text-primary-content">
236
365
  <Markdown remarkPlugins={[remarkGfm]} components={mdComponents}>{text}</Markdown>
237
366
  </div>
238
367
  </div>
239
368
  {time && (
240
369
  <div className="chat-footer text-[10px] text-base-content/30 mt-0.5 flex items-center gap-1">
241
370
  {time}
371
+ {msg.uuid && <RewindButton uuid={msg.uuid} />}
242
372
  <MessageAnchor id={msg.uuid} />
243
373
  <MessageActions text={text} showNewSession messageUuid={msg.uuid} messageType="user" />
244
374
  </div>
245
375
  )}
376
+ {ctxMenu.state && <ContextMenu x={ctxMenu.state.x} y={ctxMenu.state.y} items={buildContextItems()} onClose={ctxMenu.close} label="User message actions" />}
246
377
  </div>
247
378
  );
248
379
  }
@@ -264,8 +395,59 @@ function formatTokenCount(n: number): string {
264
395
  function AssistantMessage(props: { message: HistoryMessage; responseCost?: number | null; responseDuration?: number | null }) {
265
396
  var msg = props.message;
266
397
  var time = formatTime(msg.timestamp);
398
+ var text = msg.text || "";
399
+ var ctxMenu = useContextMenu<HistoryMessage>();
400
+ var ws = useWebSocket();
401
+ var bookmarkState = useStore(getBookmarkStore(), function (s) { return s; });
402
+ var isBookmarked = useMemo(function () {
403
+ if (!msg.uuid) return false;
404
+ for (var i = 0; i < bookmarkState.bookmarks.length; i++) {
405
+ if (bookmarkState.bookmarks[i].messageUuid === msg.uuid) return true;
406
+ }
407
+ return false;
408
+ }, [msg.uuid, bookmarkState.bookmarks]);
409
+
410
+ function handleNewSession() {
411
+ var state = getSessionStore().state;
412
+ if (!state.activeProjectSlug) return;
413
+ setPendingPrefill(text);
414
+ ws.send({ type: "session:create", projectSlug: state.activeProjectSlug });
415
+ }
416
+
417
+ function handleBookmarkToggle() {
418
+ var state = getSessionStore().state;
419
+ if (!state.activeSessionId || !state.activeProjectSlug || !msg.uuid) return;
420
+ if (isBookmarked) {
421
+ var bm = findBookmarkByUuid(msg.uuid);
422
+ if (bm) {
423
+ ws.send({ type: "bookmark:remove", id: bm.id });
424
+ }
425
+ } else {
426
+ ws.send({
427
+ type: "bookmark:add",
428
+ sessionId: state.activeSessionId,
429
+ projectSlug: state.activeProjectSlug,
430
+ messageUuid: msg.uuid,
431
+ messageText: text.slice(0, 100),
432
+ messageType: "assistant",
433
+ });
434
+ }
435
+ }
436
+
437
+ function buildContextItems(): ContextMenuEntry[] {
438
+ return [
439
+ { label: "Copy", icon: <Copy size={14} />, onClick: function () { navigator.clipboard.writeText(text); } },
440
+ { label: "Copy as plain text", icon: <FileText size={14} />, onClick: function () { navigator.clipboard.writeText(stripMarkdown(text)); } },
441
+ { type: "divider" as const },
442
+ { label: "Start new session with this message", icon: <MessageSquarePlus size={14} />, onClick: handleNewSession },
443
+ { type: "divider" as const },
444
+ { label: isBookmarked ? "Unbookmark" : "Bookmark", icon: isBookmarked ? <BookmarkCheck size={14} /> : <Bookmark size={14} />, onClick: handleBookmarkToggle, hidden: !msg.uuid },
445
+ { label: "Copy link to message", icon: <Link size={14} />, onClick: function () { navigator.clipboard.writeText(window.location.origin + window.location.pathname + "#msg-" + msg.uuid); }, hidden: !msg.uuid },
446
+ ];
447
+ }
448
+
267
449
  return (
268
- <div id={msg.uuid ? "msg-" + msg.uuid : undefined} data-allow-context-menu className="chat chat-start px-5 py-1 group/msg">
450
+ <div id={msg.uuid ? "msg-" + msg.uuid : undefined} data-allow-context-menu className="chat chat-start px-5 py-1 group/msg" onContextMenu={function (e) { ctxMenu.open(e, msg); }}>
269
451
  <div className="chat-image">
270
452
  <div className="w-6 h-6 rounded-full bg-primary/15 border border-primary/20 flex items-center justify-center">
271
453
  <div className="w-2.5 h-2.5 rounded-full bg-primary" />
@@ -273,7 +455,7 @@ function AssistantMessage(props: { message: HistoryMessage; responseCost?: numbe
273
455
  </div>
274
456
  <div className="chat-bubble bg-base-300/70 text-base-content text-[13px] leading-relaxed break-words max-w-[95%] sm:max-w-[85%] shadow-sm border border-base-content/5">
275
457
  <div className="prose prose-sm max-w-none [&>*:first-child]:mt-0 [&>*:last-child]:mb-0 prose-headings:text-base-content prose-p:text-base-content prose-strong:text-base-content prose-code:text-base-content/70 prose-code:bg-base-100/50 prose-pre:bg-base-100 prose-pre:text-base-content/70 prose-a:text-primary prose-a:underline prose-li:text-base-content">
276
- <Markdown remarkPlugins={[remarkGfm]} components={mdComponents}>{msg.text || ""}</Markdown>
458
+ <Markdown remarkPlugins={[remarkGfm]} components={mdComponents}>{text}</Markdown>
277
459
  </div>
278
460
  </div>
279
461
  {time && (
@@ -291,9 +473,10 @@ function AssistantMessage(props: { message: HistoryMessage; responseCost?: numbe
291
473
  <span className="text-base-content/15">{formatTokenCount(msg.outputTokens)} out</span>
292
474
  )}
293
475
  <MessageAnchor id={msg.uuid} />
294
- <MessageActions text={msg.text || ""} showNewSession messageUuid={msg.uuid} messageType="assistant" />
476
+ <MessageActions text={text} showNewSession messageUuid={msg.uuid} messageType="assistant" />
295
477
  </div>
296
478
  )}
479
+ {ctxMenu.state && <ContextMenu x={ctxMenu.state.x} y={ctxMenu.state.y} items={buildContextItems()} onClose={ctxMenu.close} label="Assistant message actions" />}
297
480
  </div>
298
481
  );
299
482
  }
@@ -302,6 +485,7 @@ function ToolMessage(props: { message: HistoryMessage }) {
302
485
  var msg = props.message;
303
486
  var [expanded, setExpanded] = useState<boolean>(false);
304
487
  var hasResult = Boolean(msg.content);
488
+ var ctxMenu = useContextMenu<HistoryMessage>();
305
489
 
306
490
  var parsedArgs: string = msg.args || "";
307
491
  try {
@@ -312,8 +496,15 @@ function ToolMessage(props: { message: HistoryMessage }) {
312
496
  parsedArgs = msg.args || "";
313
497
  }
314
498
 
499
+ function buildContextItems(): ContextMenuEntry[] {
500
+ return [
501
+ { label: "Copy output", icon: <ClipboardCopy size={14} />, onClick: function () { navigator.clipboard.writeText(msg.content || ""); }, disabled: !hasResult },
502
+ { label: "Copy tool input", icon: <Copy size={14} />, onClick: function () { navigator.clipboard.writeText(parsedArgs); } },
503
+ ];
504
+ }
505
+
315
506
  return (
316
- <div className="ml-14 mr-5 py-0.5 max-w-[95%] sm:max-w-[75%] group/msg">
507
+ <div data-allow-context-menu className="ml-14 mr-5 py-0.5 max-w-[95%] sm:max-w-[75%] group/msg" onContextMenu={function (e) { ctxMenu.open(e, msg); }}>
317
508
  <div
318
509
  className={
319
510
  "rounded-lg overflow-hidden text-[12px] border transition-colors duration-100 " +
@@ -364,6 +555,7 @@ function ToolMessage(props: { message: HistoryMessage }) {
364
555
  <MessageActions text={msg.content || ""} />
365
556
  </div>
366
557
  )}
558
+ {ctxMenu.state && <ContextMenu x={ctxMenu.state.x} y={ctxMenu.state.y} items={buildContextItems()} onClose={ctxMenu.close} label="Tool message actions" />}
367
559
  </div>
368
560
  );
369
561
  }
@@ -540,6 +732,48 @@ function PermissionMessage(props: { message: HistoryMessage }) {
540
732
  );
541
733
  }
542
734
 
735
+ function CompactSummaryMessage(props: { message: HistoryMessage }) {
736
+ var [expanded, setExpanded] = useState(false);
737
+ var msg = props.message;
738
+ var text = msg.text || "";
739
+ var time = formatTime(msg.timestamp);
740
+
741
+ return (
742
+ <div id={msg.uuid ? "msg-" + msg.uuid : undefined} className="px-5 py-3">
743
+ <button
744
+ type="button"
745
+ onClick={function () { setExpanded(function (v) { return !v; }); }}
746
+ aria-expanded={expanded}
747
+ className="w-full flex items-center gap-3 group/compact focus-visible:outline-none"
748
+ >
749
+ <div className="h-px flex-1 bg-base-content/8 group-hover/compact:bg-base-content/15 transition-colors duration-150" />
750
+ <div className={"flex items-center gap-1.5 px-2.5 py-1 rounded-full border transition-all duration-150 " + (expanded ? "border-primary/30 bg-primary/8 text-primary/70" : "border-base-content/10 bg-base-200/60 text-base-content/35 hover:border-base-content/20 hover:text-base-content/55")}>
751
+ <History size={11} className="shrink-0" />
752
+ <span className="text-[10px] font-mono font-semibold tracking-wider uppercase">Context Compacted</span>
753
+ {time && <span className="text-[9px] opacity-60 ml-0.5">{time}</span>}
754
+ <ChevronDown size={10} className={"ml-0.5 transition-transform duration-200 " + (expanded ? "rotate-180" : "")} />
755
+ </div>
756
+ <div className="h-px flex-1 bg-base-content/8 group-hover/compact:bg-base-content/15 transition-colors duration-150" />
757
+ </button>
758
+
759
+ {expanded && (
760
+ <div className="mt-3 mx-auto max-w-[760px]">
761
+ <div className="rounded-xl border border-base-content/8 bg-base-200/40 overflow-hidden">
762
+ <div className="flex items-center gap-2 px-3 py-2 border-b border-base-content/6 bg-base-200/60">
763
+ <History size={12} className="text-base-content/30 shrink-0" />
764
+ <span className="text-[10px] font-mono font-semibold text-base-content/35 uppercase tracking-wider">Session Summary</span>
765
+ <span className="ml-auto text-[9px] text-base-content/20 font-mono">{time}</span>
766
+ </div>
767
+ <div className="max-h-[480px] overflow-y-auto p-4 prose prose-sm max-w-none [&>*:first-child]:mt-0 [&>*:last-child]:mb-0 prose-headings:text-base-content/70 prose-headings:text-[12px] prose-headings:font-mono prose-headings:uppercase prose-headings:tracking-wide prose-headings:mt-4 prose-headings:mb-1.5 prose-p:text-base-content/50 prose-p:text-[12px] prose-p:leading-relaxed prose-strong:text-base-content/65 prose-code:text-base-content/50 prose-code:text-[11px] prose-code:bg-base-content/5 prose-code:px-1 prose-code:py-0.5 prose-code:rounded prose-li:text-base-content/50 prose-li:text-[12px] prose-hr:border-base-content/8">
768
+ <Markdown remarkPlugins={[remarkGfm]} components={mdComponents}>{text}</Markdown>
769
+ </div>
770
+ </div>
771
+ </div>
772
+ )}
773
+ </div>
774
+ );
775
+ }
776
+
543
777
  export var Message = memo(function Message(props: MessageProps) {
544
778
  var msg = props.message;
545
779
 
@@ -555,6 +789,10 @@ export var Message = memo(function Message(props: MessageProps) {
555
789
  return <ToolMessage message={msg} />;
556
790
  }
557
791
 
792
+ if (msg.type === "compact_summary") {
793
+ return <CompactSummaryMessage message={msg} />;
794
+ }
795
+
558
796
  if (msg.type === "permission_request") {
559
797
  return <PermissionMessage message={msg} />;
560
798
  }
@@ -567,5 +805,20 @@ export var Message = memo(function Message(props: MessageProps) {
567
805
  return <TodoCard message={msg} />;
568
806
  }
569
807
 
808
+ if (msg.type === "elicitation") {
809
+ return (
810
+ <ElicitationCard
811
+ requestId={msg.toolId || ""}
812
+ serverName={msg.elicitationServerName || "MCP Server"}
813
+ message={msg.elicitationMessage || ""}
814
+ mode={msg.elicitationMode || "form"}
815
+ url={msg.elicitationUrl}
816
+ requestedSchema={msg.elicitationSchema}
817
+ resolved={msg.elicitationStatus !== "pending"}
818
+ resolvedAction={msg.elicitationStatus === "accepted" ? "accept" : msg.elicitationStatus === "declined" ? "decline" : undefined}
819
+ />
820
+ );
821
+ }
822
+
570
823
  return null;
571
824
  });