opencami 1.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 (337) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +111 -0
  3. package/bin/opencami.js +155 -0
  4. package/dist/client/apple-touch-icon-180x180.png +0 -0
  5. package/dist/client/assets/_sessionKey-B-MBYHgD.js +95 -0
  6. package/dist/client/assets/abap-BdImnpbu.js +1 -0
  7. package/dist/client/assets/actionscript-3-CfeIJUat.js +1 -0
  8. package/dist/client/assets/ada-bCR0ucgS.js +1 -0
  9. package/dist/client/assets/andromeeda-C-Jbm3Hp.js +1 -0
  10. package/dist/client/assets/angular-html-CU67Zn6k.js +1 -0
  11. package/dist/client/assets/angular-ts-BwZT4LLn.js +1 -0
  12. package/dist/client/assets/apache-Pmp26Uib.js +1 -0
  13. package/dist/client/assets/apex-D8_7TLub.js +1 -0
  14. package/dist/client/assets/apl-dKokRX4l.js +1 -0
  15. package/dist/client/assets/applescript-Co6uUVPk.js +1 -0
  16. package/dist/client/assets/ara-BRHolxvo.js +1 -0
  17. package/dist/client/assets/asciidoc-Dv7Oe6Be.js +1 -0
  18. package/dist/client/assets/asm-D_Q5rh1f.js +1 -0
  19. package/dist/client/assets/astro-CbQHKStN.js +1 -0
  20. package/dist/client/assets/aurora-x-D-2ljcwZ.js +1 -0
  21. package/dist/client/assets/awk-DMzUqQB5.js +1 -0
  22. package/dist/client/assets/ayu-dark-CmMr59Fi.js +1 -0
  23. package/dist/client/assets/ballerina-BFfxhgS-.js +1 -0
  24. package/dist/client/assets/bat-BkioyH1T.js +1 -0
  25. package/dist/client/assets/beancount-k_qm7-4y.js +1 -0
  26. package/dist/client/assets/berry-uYugtg8r.js +1 -0
  27. package/dist/client/assets/bibtex-CHM0blh-.js +1 -0
  28. package/dist/client/assets/bicep-Bmn6On1c.js +1 -0
  29. package/dist/client/assets/blade-D4QpJJKB.js +1 -0
  30. package/dist/client/assets/bsl-BO_Y6i37.js +1 -0
  31. package/dist/client/assets/button-D_9OBT_f.js +1 -0
  32. package/dist/client/assets/c-BIGW1oBm.js +1 -0
  33. package/dist/client/assets/c3-VCDPK7BO.js +1 -0
  34. package/dist/client/assets/cadence-Bv_4Rxtq.js +1 -0
  35. package/dist/client/assets/cairo-KRGpt6FW.js +1 -0
  36. package/dist/client/assets/catppuccin-frappe-DFWUc33u.js +1 -0
  37. package/dist/client/assets/catppuccin-latte-C9dUb6Cb.js +1 -0
  38. package/dist/client/assets/catppuccin-macchiato-DQyhUUbL.js +1 -0
  39. package/dist/client/assets/catppuccin-mocha-D87Tk5Gz.js +1 -0
  40. package/dist/client/assets/clarity-D53aC0YG.js +1 -0
  41. package/dist/client/assets/clojure-P80f7IUj.js +1 -0
  42. package/dist/client/assets/cmake-D1j8_8rp.js +1 -0
  43. package/dist/client/assets/cobol-nwyudZeR.js +1 -0
  44. package/dist/client/assets/codeowners-Bp6g37R7.js +1 -0
  45. package/dist/client/assets/codeql-DsOJ9woJ.js +1 -0
  46. package/dist/client/assets/coffee-Ch7k5sss.js +1 -0
  47. package/dist/client/assets/common-lisp-Cg-RD9OK.js +1 -0
  48. package/dist/client/assets/connect-BRasuRbB.js +2 -0
  49. package/dist/client/assets/coq-DkFqJrB1.js +1 -0
  50. package/dist/client/assets/cpp-CofmeUqb.js +1 -0
  51. package/dist/client/assets/crystal-tKQVLTB8.js +1 -0
  52. package/dist/client/assets/csharp-K5feNrxe.js +1 -0
  53. package/dist/client/assets/css-DPfMkruS.js +1 -0
  54. package/dist/client/assets/csv-fuZLfV_i.js +1 -0
  55. package/dist/client/assets/cue-D82EKSYY.js +1 -0
  56. package/dist/client/assets/cypher-COkxafJQ.js +1 -0
  57. package/dist/client/assets/d-85-TOEBH.js +1 -0
  58. package/dist/client/assets/dark-plus-C3mMm8J8.js +1 -0
  59. package/dist/client/assets/dart-CF10PKvl.js +1 -0
  60. package/dist/client/assets/dax-CEL-wOlO.js +1 -0
  61. package/dist/client/assets/desktop-BmXAJ9_W.js +1 -0
  62. package/dist/client/assets/diff-D97Zzqfu.js +1 -0
  63. package/dist/client/assets/docker-BcOcwvcX.js +1 -0
  64. package/dist/client/assets/dotenv-Da5cRb03.js +1 -0
  65. package/dist/client/assets/dracula-BzJJZx-M.js +1 -0
  66. package/dist/client/assets/dracula-soft-BXkSAIEj.js +1 -0
  67. package/dist/client/assets/dream-maker-BtqSS_iP.js +1 -0
  68. package/dist/client/assets/edge-BkV0erSs.js +1 -0
  69. package/dist/client/assets/elixir-CDX3lj18.js +1 -0
  70. package/dist/client/assets/elm-DbKCFpqz.js +1 -0
  71. package/dist/client/assets/emacs-lisp-C9XAeP06.js +1 -0
  72. package/dist/client/assets/erb-BOJIQeun.js +1 -0
  73. package/dist/client/assets/erlang-DsQrWhSR.js +1 -0
  74. package/dist/client/assets/everforest-dark-BgDCqdQA.js +1 -0
  75. package/dist/client/assets/everforest-light-C8M2exoo.js +1 -0
  76. package/dist/client/assets/fennel-BYunw83y.js +1 -0
  77. package/dist/client/assets/file-explorer-screen-Daf4rIq9.js +1 -0
  78. package/dist/client/assets/files-ByeIMLfw.js +2 -0
  79. package/dist/client/assets/fish-BvzEVeQv.js +1 -0
  80. package/dist/client/assets/fluent-C4IJs8-o.js +1 -0
  81. package/dist/client/assets/fortran-fixed-form-CkoXwp7k.js +1 -0
  82. package/dist/client/assets/fortran-free-form-BxgE0vQu.js +1 -0
  83. package/dist/client/assets/fsharp-CXgrBDvD.js +1 -0
  84. package/dist/client/assets/gdresource-B7Tvp0Sc.js +1 -0
  85. package/dist/client/assets/gdscript-DTMYz4Jt.js +1 -0
  86. package/dist/client/assets/gdshader-DkwncUOv.js +1 -0
  87. package/dist/client/assets/genie-D0YGMca9.js +1 -0
  88. package/dist/client/assets/gherkin-DyxjwDmM.js +1 -0
  89. package/dist/client/assets/git-commit-F4YmCXRG.js +1 -0
  90. package/dist/client/assets/git-rebase-r7XF79zn.js +1 -0
  91. package/dist/client/assets/github-dark-DHJKELXO.js +1 -0
  92. package/dist/client/assets/github-dark-default-Cuk6v7N8.js +1 -0
  93. package/dist/client/assets/github-dark-dimmed-DH5Ifo-i.js +1 -0
  94. package/dist/client/assets/github-dark-high-contrast-E3gJ1_iC.js +1 -0
  95. package/dist/client/assets/github-light-DAi9KRSo.js +1 -0
  96. package/dist/client/assets/github-light-default-D7oLnXFd.js +1 -0
  97. package/dist/client/assets/github-light-high-contrast-BfjtVDDH.js +1 -0
  98. package/dist/client/assets/gleam-BspZqrRM.js +1 -0
  99. package/dist/client/assets/glimmer-js-Rg0-pVw9.js +1 -0
  100. package/dist/client/assets/glimmer-ts-U6CK756n.js +1 -0
  101. package/dist/client/assets/glsl-DplSGwfg.js +1 -0
  102. package/dist/client/assets/gn-n2N0HUVH.js +1 -0
  103. package/dist/client/assets/gnuplot-DdkO51Og.js +1 -0
  104. package/dist/client/assets/go-Dn2_MT6a.js +1 -0
  105. package/dist/client/assets/graphql-ChdNCCLP.js +1 -0
  106. package/dist/client/assets/groovy-gcz8RCvz.js +1 -0
  107. package/dist/client/assets/gruvbox-dark-hard-CFHQjOhq.js +1 -0
  108. package/dist/client/assets/gruvbox-dark-medium-GsRaNv29.js +1 -0
  109. package/dist/client/assets/gruvbox-dark-soft-CVdnzihN.js +1 -0
  110. package/dist/client/assets/gruvbox-light-hard-CH1njM8p.js +1 -0
  111. package/dist/client/assets/gruvbox-light-medium-DRw_LuNl.js +1 -0
  112. package/dist/client/assets/gruvbox-light-soft-hJgmCMqR.js +1 -0
  113. package/dist/client/assets/hack-CaT9iCJl.js +1 -0
  114. package/dist/client/assets/haml-B8DHNrY2.js +1 -0
  115. package/dist/client/assets/handlebars-BL8al0AC.js +1 -0
  116. package/dist/client/assets/haskell-Df6bDoY_.js +1 -0
  117. package/dist/client/assets/haxe-CzTSHFRz.js +1 -0
  118. package/dist/client/assets/hcl-BWvSN4gD.js +1 -0
  119. package/dist/client/assets/hjson-D5-asLiD.js +1 -0
  120. package/dist/client/assets/hlsl-D3lLCCz7.js +1 -0
  121. package/dist/client/assets/houston-DnULxvSX.js +1 -0
  122. package/dist/client/assets/html-GMplVEZG.js +1 -0
  123. package/dist/client/assets/html-derivative-BFtXZ54Q.js +1 -0
  124. package/dist/client/assets/http-jrhK8wxY.js +1 -0
  125. package/dist/client/assets/hurl-irOxFIW8.js +1 -0
  126. package/dist/client/assets/hxml-Bvhsp5Yf.js +1 -0
  127. package/dist/client/assets/hy-DFXneXwc.js +1 -0
  128. package/dist/client/assets/imba-DGztddWO.js +1 -0
  129. package/dist/client/assets/index-ByUDBI-n.js +14 -0
  130. package/dist/client/assets/index-DHGnKfAU.js +1 -0
  131. package/dist/client/assets/ini-BEwlwnbL.js +1 -0
  132. package/dist/client/assets/java-CylS5w8V.js +1 -0
  133. package/dist/client/assets/javascript-wDzz0qaB.js +1 -0
  134. package/dist/client/assets/jinja-4LBKfQ-Z.js +1 -0
  135. package/dist/client/assets/jison-wvAkD_A8.js +1 -0
  136. package/dist/client/assets/json-Cp-IABpG.js +1 -0
  137. package/dist/client/assets/json5-C9tS-k6U.js +1 -0
  138. package/dist/client/assets/jsonc-Des-eS-w.js +1 -0
  139. package/dist/client/assets/jsonl-DcaNXYhu.js +1 -0
  140. package/dist/client/assets/jsonnet-DFQXde-d.js +1 -0
  141. package/dist/client/assets/jssm-C2t-YnRu.js +1 -0
  142. package/dist/client/assets/jsx-g9-lgVsj.js +1 -0
  143. package/dist/client/assets/julia-CxzCAyBv.js +1 -0
  144. package/dist/client/assets/kanagawa-dragon-CkXjmgJE.js +1 -0
  145. package/dist/client/assets/kanagawa-lotus-CfQXZHmo.js +1 -0
  146. package/dist/client/assets/kanagawa-wave-DWedfzmr.js +1 -0
  147. package/dist/client/assets/kdl-DV7GczEv.js +1 -0
  148. package/dist/client/assets/keyboard-shortcuts-dialog-agsWJ36q.js +1 -0
  149. package/dist/client/assets/kotlin-BdnUsdx6.js +1 -0
  150. package/dist/client/assets/kusto-DZf3V79B.js +1 -0
  151. package/dist/client/assets/laserwave-DUszq2jm.js +1 -0
  152. package/dist/client/assets/latex-B4uzh10-.js +1 -0
  153. package/dist/client/assets/lean-BZvkOJ9d.js +1 -0
  154. package/dist/client/assets/less-B1dDrJ26.js +1 -0
  155. package/dist/client/assets/light-plus-B7mTdjB0.js +1 -0
  156. package/dist/client/assets/liquid-DYVedYrR.js +1 -0
  157. package/dist/client/assets/llvm-BtvRca6l.js +1 -0
  158. package/dist/client/assets/log-2UxHyX5q.js +1 -0
  159. package/dist/client/assets/logo-BtOb2qkB.js +1 -0
  160. package/dist/client/assets/lua-BbnMAYS6.js +1 -0
  161. package/dist/client/assets/luau-C-HG3fhB.js +1 -0
  162. package/dist/client/assets/main-BAHT5yqU.js +81 -0
  163. package/dist/client/assets/make-CHLpvVh8.js +1 -0
  164. package/dist/client/assets/markdown-Cvjx9yec.js +1 -0
  165. package/dist/client/assets/marko-DZsq8hO1.js +1 -0
  166. package/dist/client/assets/material-theme-D5KoaKCx.js +1 -0
  167. package/dist/client/assets/material-theme-darker-BfHTSMKl.js +1 -0
  168. package/dist/client/assets/material-theme-lighter-B0m2ddpp.js +1 -0
  169. package/dist/client/assets/material-theme-ocean-CyktbL80.js +1 -0
  170. package/dist/client/assets/material-theme-palenight-Csfq5Kiy.js +1 -0
  171. package/dist/client/assets/matlab-D7o27uSR.js +1 -0
  172. package/dist/client/assets/mdc-DUICxH0z.js +1 -0
  173. package/dist/client/assets/mdx-Cmh6b_Ma.js +1 -0
  174. package/dist/client/assets/menu-BhVaz8Ly.js +20 -0
  175. package/dist/client/assets/mermaid-mWjccvbQ.js +1 -0
  176. package/dist/client/assets/min-dark-CafNBF8u.js +1 -0
  177. package/dist/client/assets/min-light-CTRr51gU.js +1 -0
  178. package/dist/client/assets/mipsasm-CKIfxQSi.js +1 -0
  179. package/dist/client/assets/mojo-B93PlW-d.js +1 -0
  180. package/dist/client/assets/monokai-D4h5O-jR.js +1 -0
  181. package/dist/client/assets/moonbit-Ba13S78F.js +1 -0
  182. package/dist/client/assets/move-Bu9oaDYs.js +1 -0
  183. package/dist/client/assets/narrat-DRg8JJMk.js +1 -0
  184. package/dist/client/assets/new-DLlBm66g.js +1 -0
  185. package/dist/client/assets/nextflow-BrzmwbiE.js +1 -0
  186. package/dist/client/assets/nginx-DknmC5AR.js +1 -0
  187. package/dist/client/assets/night-owl-C39BiMTA.js +1 -0
  188. package/dist/client/assets/nim-CVrawwO9.js +1 -0
  189. package/dist/client/assets/nix-CwoSXNpI.js +1 -0
  190. package/dist/client/assets/nord-Ddv68eIx.js +1 -0
  191. package/dist/client/assets/nushell-C-sUppwS.js +1 -0
  192. package/dist/client/assets/objective-c-DXmwc3jG.js +1 -0
  193. package/dist/client/assets/objective-cpp-CLxacb5B.js +1 -0
  194. package/dist/client/assets/ocaml-C0hk2d4L.js +1 -0
  195. package/dist/client/assets/one-dark-pro-DVMEJ2y_.js +1 -0
  196. package/dist/client/assets/one-light-PoHY5YXO.js +1 -0
  197. package/dist/client/assets/openscad-C4EeE6gA.js +1 -0
  198. package/dist/client/assets/pascal-D93ZcfNL.js +1 -0
  199. package/dist/client/assets/perl-C0TMdlhV.js +1 -0
  200. package/dist/client/assets/php-CDn_0X-4.js +1 -0
  201. package/dist/client/assets/pkl-u5AG7uiY.js +1 -0
  202. package/dist/client/assets/plastic-3e1v2bzS.js +1 -0
  203. package/dist/client/assets/plsql-ChMvpjG-.js +1 -0
  204. package/dist/client/assets/po-BTJTHyun.js +1 -0
  205. package/dist/client/assets/poimandres-CS3Unz2-.js +1 -0
  206. package/dist/client/assets/polar-C0HS_06l.js +1 -0
  207. package/dist/client/assets/postcss-CXtECtnM.js +1 -0
  208. package/dist/client/assets/powerquery-CEu0bR-o.js +1 -0
  209. package/dist/client/assets/powershell-Dpen1YoG.js +1 -0
  210. package/dist/client/assets/prisma-Dd19v3D-.js +1 -0
  211. package/dist/client/assets/prolog-CbFg5uaA.js +1 -0
  212. package/dist/client/assets/proto-C7zT0LnQ.js +1 -0
  213. package/dist/client/assets/pug-CGlum2m_.js +1 -0
  214. package/dist/client/assets/puppet-BMWR74SV.js +1 -0
  215. package/dist/client/assets/purescript-CklMAg4u.js +1 -0
  216. package/dist/client/assets/python-B6aJPvgy.js +1 -0
  217. package/dist/client/assets/qml-3beO22l8.js +1 -0
  218. package/dist/client/assets/qmldir-C8lEn-DE.js +1 -0
  219. package/dist/client/assets/qss-IeuSbFQv.js +1 -0
  220. package/dist/client/assets/r-Dspwwk_N.js +1 -0
  221. package/dist/client/assets/racket-BqYA7rlc.js +1 -0
  222. package/dist/client/assets/raku-DXvB9xmW.js +1 -0
  223. package/dist/client/assets/razor-C1TweQQi.js +1 -0
  224. package/dist/client/assets/red-bN70gL4F.js +1 -0
  225. package/dist/client/assets/reg-C-SQnVFl.js +1 -0
  226. package/dist/client/assets/regexp-CDVJQ6XC.js +1 -0
  227. package/dist/client/assets/rel-C3B-1QV4.js +1 -0
  228. package/dist/client/assets/riscv-BM1_JUlF.js +1 -0
  229. package/dist/client/assets/rose-pine-dawn-DHQR4-dF.js +1 -0
  230. package/dist/client/assets/rose-pine-moon-D4_iv3hh.js +1 -0
  231. package/dist/client/assets/rose-pine-qdsjHGoJ.js +1 -0
  232. package/dist/client/assets/rosmsg-BJDFO7_C.js +1 -0
  233. package/dist/client/assets/rst-B0xPkSld.js +1 -0
  234. package/dist/client/assets/ruby-BvKwtOVI.js +1 -0
  235. package/dist/client/assets/rust-B1yitclQ.js +1 -0
  236. package/dist/client/assets/sas-cz2c8ADy.js +1 -0
  237. package/dist/client/assets/sass-Cj5Yp3dK.js +1 -0
  238. package/dist/client/assets/scala-C151Ov-r.js +1 -0
  239. package/dist/client/assets/scheme-C98Dy4si.js +1 -0
  240. package/dist/client/assets/scss-OYdSNvt2.js +1 -0
  241. package/dist/client/assets/sdbl-DVxCFoDh.js +1 -0
  242. package/dist/client/assets/search-dialog-CHwnOyPS.js +1 -0
  243. package/dist/client/assets/session-export-dialog-uOlDUzgX.js +1 -0
  244. package/dist/client/assets/settings-dialog-D0aYDkAM.js +1 -0
  245. package/dist/client/assets/shaderlab-Dg9Lc6iA.js +1 -0
  246. package/dist/client/assets/shellscript-Yzrsuije.js +1 -0
  247. package/dist/client/assets/shellsession-BADoaaVG.js +1 -0
  248. package/dist/client/assets/slack-dark-BthQWCQV.js +1 -0
  249. package/dist/client/assets/slack-ochin-DqwNpetd.js +1 -0
  250. package/dist/client/assets/smalltalk-BERRCDM3.js +1 -0
  251. package/dist/client/assets/snazzy-light-Bw305WKR.js +1 -0
  252. package/dist/client/assets/solarized-dark-DXbdFlpD.js +1 -0
  253. package/dist/client/assets/solarized-light-L9t79GZl.js +1 -0
  254. package/dist/client/assets/solidity-rGO070M0.js +1 -0
  255. package/dist/client/assets/soy-Brmx7dQM.js +1 -0
  256. package/dist/client/assets/sparql-rVzFXLq3.js +1 -0
  257. package/dist/client/assets/splunk-BtCnVYZw.js +1 -0
  258. package/dist/client/assets/sql-BLtJtn59.js +1 -0
  259. package/dist/client/assets/ssh-config-_ykCGR6B.js +1 -0
  260. package/dist/client/assets/stata-BH5u7GGu.js +1 -0
  261. package/dist/client/assets/styles-7aVSlb6l.css +1 -0
  262. package/dist/client/assets/stylus-BEDo0Tqx.js +1 -0
  263. package/dist/client/assets/svelte-zxCyuUbr.js +1 -0
  264. package/dist/client/assets/swift-Dg5xB15N.js +1 -0
  265. package/dist/client/assets/synthwave-84-CbfX1IO0.js +1 -0
  266. package/dist/client/assets/system-verilog-CnnmHF94.js +1 -0
  267. package/dist/client/assets/systemd-4A_iFExJ.js +1 -0
  268. package/dist/client/assets/talonscript-CkByrt1z.js +1 -0
  269. package/dist/client/assets/tasl-QIJgUcNo.js +1 -0
  270. package/dist/client/assets/tcl-dwOrl1Do.js +1 -0
  271. package/dist/client/assets/templ-W15q3VgB.js +1 -0
  272. package/dist/client/assets/terraform-BETggiCN.js +1 -0
  273. package/dist/client/assets/tex-CvyZ59Mk.js +1 -0
  274. package/dist/client/assets/tokyo-night-hegEt444.js +1 -0
  275. package/dist/client/assets/toml-vGWfd6FD.js +1 -0
  276. package/dist/client/assets/ts-tags-zn1MmPIZ.js +1 -0
  277. package/dist/client/assets/tsv-B_m7g4N7.js +1 -0
  278. package/dist/client/assets/tsx-COt5Ahok.js +1 -0
  279. package/dist/client/assets/turtle-BsS91CYL.js +1 -0
  280. package/dist/client/assets/twig-CO9l9SDP.js +1 -0
  281. package/dist/client/assets/typescript-BPQ3VLAy.js +1 -0
  282. package/dist/client/assets/typespec-BGHnOYBU.js +1 -0
  283. package/dist/client/assets/typst-DHCkPAjA.js +1 -0
  284. package/dist/client/assets/v-BcVCzyr7.js +1 -0
  285. package/dist/client/assets/vala-CsfeWuGM.js +1 -0
  286. package/dist/client/assets/vb-D17OF-Vu.js +1 -0
  287. package/dist/client/assets/verilog-BQ8w6xss.js +1 -0
  288. package/dist/client/assets/vesper-DU1UobuO.js +1 -0
  289. package/dist/client/assets/vhdl-CeAyd5Ju.js +1 -0
  290. package/dist/client/assets/viml-CJc9bBzg.js +1 -0
  291. package/dist/client/assets/vitesse-black-Bkuqu6BP.js +1 -0
  292. package/dist/client/assets/vitesse-dark-D0r3Knsf.js +1 -0
  293. package/dist/client/assets/vitesse-light-CVO1_9PV.js +1 -0
  294. package/dist/client/assets/vue-DN_0RTcg.js +1 -0
  295. package/dist/client/assets/vue-html-AaS7Mt5G.js +1 -0
  296. package/dist/client/assets/vue-vine-CQOfvN7w.js +1 -0
  297. package/dist/client/assets/vyper-CDx5xZoG.js +1 -0
  298. package/dist/client/assets/wasm-CG6Dc4jp.js +1 -0
  299. package/dist/client/assets/wasm-MzD3tlZU.js +1 -0
  300. package/dist/client/assets/wenyan-BV7otONQ.js +1 -0
  301. package/dist/client/assets/wgsl-Dx-B1_4e.js +1 -0
  302. package/dist/client/assets/wikitext-BhOHFoWU.js +1 -0
  303. package/dist/client/assets/wit-5i3qLPDT.js +1 -0
  304. package/dist/client/assets/wolfram-lXgVvXCa.js +1 -0
  305. package/dist/client/assets/xml-sdJ4AIDG.js +1 -0
  306. package/dist/client/assets/xsl-CtQFsRM5.js +1 -0
  307. package/dist/client/assets/yaml-Buea-lGh.js +1 -0
  308. package/dist/client/assets/zenscript-DVFEvuxE.js +1 -0
  309. package/dist/client/assets/zig-VOosw3JB.js +1 -0
  310. package/dist/client/cover.jpg +0 -0
  311. package/dist/client/cover.webp +0 -0
  312. package/dist/client/favicon.svg +4 -0
  313. package/dist/client/manifest.json +40 -0
  314. package/dist/client/pwa-192x192.png +0 -0
  315. package/dist/client/pwa-512x512.png +0 -0
  316. package/dist/client/pwa-maskable-512x512.png +0 -0
  317. package/dist/client/robots.txt +3 -0
  318. package/dist/client/screenshot-file-explorer.png +0 -0
  319. package/dist/client/sw.js +165 -0
  320. package/dist/server/assets/_sessionKey-qlAPF_Ft.js +6130 -0
  321. package/dist/server/assets/_tanstack-start-manifest_v-El8F-kd-.js +4 -0
  322. package/dist/server/assets/button-DtQ3rV1m.js +53 -0
  323. package/dist/server/assets/connect-BWI_6rCm.js +80 -0
  324. package/dist/server/assets/file-explorer-screen-DJXPEG_J.js +2450 -0
  325. package/dist/server/assets/files-CONoVTGD.js +11 -0
  326. package/dist/server/assets/index-Bp8QskbI.js +28 -0
  327. package/dist/server/assets/index-COu2idHm.js +226 -0
  328. package/dist/server/assets/keyboard-shortcuts-dialog-D5hqVX2v.js +69 -0
  329. package/dist/server/assets/menu-D6n4DB0U.js +156 -0
  330. package/dist/server/assets/new-Dzk5YxE9.js +6 -0
  331. package/dist/server/assets/router-DbxyvprK.js +2749 -0
  332. package/dist/server/assets/search-dialog-JY8C3mqa.js +443 -0
  333. package/dist/server/assets/session-export-dialog-D87uafPD.js +80 -0
  334. package/dist/server/assets/settings-dialog-CBj7njLM.js +568 -0
  335. package/dist/server/assets/start-HYkvq4Ni.js +4 -0
  336. package/dist/server/server.js +1013 -0
  337. package/package.json +93 -0
@@ -0,0 +1,568 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { useState, useEffect } from "react";
3
+ import { HugeiconsIcon } from "@hugeicons/react";
4
+ import { Cancel01Icon, ComputerIcon, Sun01Icon, Moon01Icon, Leaf01Icon, Loading02Icon, Tick01Icon, Cancel02Icon } from "@hugeicons/core-free-icons";
5
+ import { D as DialogRoot, a as DialogContent, b as DialogTitle, c as DialogDescription, d as DialogClose } from "./menu-D6n4DB0U.js";
6
+ import { Switch as Switch$1 } from "@base-ui/react/switch";
7
+ import { c as cn, B as Button } from "./button-DtQ3rV1m.js";
8
+ import { Tabs as Tabs$1 } from "@base-ui/react/tabs";
9
+ import { u as useChatSettings } from "./index-COu2idHm.js";
10
+ import { u as useLlmSettings } from "./_sessionKey-qlAPF_Ft.js";
11
+ import "@base-ui/react/tooltip";
12
+ import "@base-ui/react/dialog";
13
+ import "@base-ui/react/menu";
14
+ import "@base-ui/react/merge-props";
15
+ import "@base-ui/react/use-render";
16
+ import "class-variance-authority";
17
+ import "clsx";
18
+ import "tailwind-merge";
19
+ import "shiki";
20
+ import "zustand";
21
+ import "zustand/middleware";
22
+ import "@tanstack/react-router";
23
+ import "@tanstack/react-query";
24
+ import "motion/react";
25
+ import "@base-ui/react/alert-dialog";
26
+ import "@base-ui/react/collapsible";
27
+ import "@base-ui/react/scroll-area";
28
+ import "marked";
29
+ import "react-markdown";
30
+ import "remark-breaks";
31
+ import "remark-gfm";
32
+ import "react-dom";
33
+ import "./router-DbxyvprK.js";
34
+ import "node:crypto";
35
+ import "ws";
36
+ import "@tanstack/router-core/ssr/client";
37
+ import "node:fs/promises";
38
+ import "node:os";
39
+ import "node:path";
40
+ import "path";
41
+ function Switch({ className, ...props }) {
42
+ return /* @__PURE__ */ jsx(
43
+ Switch$1.Root,
44
+ {
45
+ className: cn(
46
+ "inline-flex h-[calc(var(--thumb-size)+2px)] w-[calc(var(--thumb-size)*2-2px)] shrink-0 items-center rounded-full p-px outline-none transition-[background-color,box-shadow] duration-200 [--thumb-size:--spacing(5)] focus-visible:ring-2 focus-visible:ring-primary-950 focus-visible:ring-offset-1 focus-visible:ring-offset-background data-checked:bg-primary-900 data-unchecked:bg-primary-200 data-disabled:opacity-64 sm:[--thumb-size:--spacing(4)]",
47
+ className
48
+ ),
49
+ "data-slot": "switch",
50
+ ...props,
51
+ children: /* @__PURE__ */ jsx(
52
+ Switch$1.Thumb,
53
+ {
54
+ className: cn(
55
+ "pointer-events-none block aspect-square h-full origin-left in-[[role=switch]:active,[data-slot=label]:active]:not-data-disabled:scale-x-110 in-[[role=switch]:active,[data-slot=label]:active]:rounded-[var(--thumb-size)/calc(var(--thumb-size)*1.1)] rounded-(--thumb-size) bg-primary-50 shadow-sm/5 will-change-transform [transition:translate_.15s,border-radius_.15s,scale_.1s_.1s,transform-origin_.15s] data-checked:origin-[var(--thumb-size)_50%] data-checked:translate-x-[calc(var(--thumb-size)-4px)]"
56
+ ),
57
+ "data-slot": "switch-thumb"
58
+ }
59
+ )
60
+ }
61
+ );
62
+ }
63
+ function Tabs({ className, ...props }) {
64
+ return /* @__PURE__ */ jsx(
65
+ Tabs$1.Root,
66
+ {
67
+ className: cn(
68
+ "flex flex-col gap-2 data-[orientation=vertical]:flex-row",
69
+ className
70
+ ),
71
+ "data-slot": "tabs",
72
+ ...props
73
+ }
74
+ );
75
+ }
76
+ function TabsList({
77
+ variant = "default",
78
+ className,
79
+ children,
80
+ ...props
81
+ }) {
82
+ return /* @__PURE__ */ jsxs(
83
+ Tabs$1.List,
84
+ {
85
+ className: cn(
86
+ "relative z-0 flex w-fit items-center justify-center gap-x-0.5 text-primary-600",
87
+ "data-[orientation=vertical]:flex-col",
88
+ variant === "default" ? "p-0.5 text-primary-600/80" : "data-[orientation=vertical]:px-1 data-[orientation=horizontal]:py-1",
89
+ className
90
+ ),
91
+ "data-slot": "tabs-list",
92
+ ...props,
93
+ children: [
94
+ children,
95
+ /* @__PURE__ */ jsx(
96
+ Tabs$1.Indicator,
97
+ {
98
+ className: cn(
99
+ "-translate-y-(--active-tab-bottom) absolute bottom-0 left-0 h-(--active-tab-height) w-(--active-tab-width) translate-x-(--active-tab-left) transition-[width,translate] duration-200 ease-in-out",
100
+ variant === "underline" ? "data-[orientation=vertical]:-translate-x-px z-10 bg-primary-900 data-[orientation=horizontal]:h-0.5 data-[orientation=vertical]:w-0.5 data-[orientation=horizontal]:translate-y-px" : "z-0 rounded-md bg-primary-200"
101
+ ),
102
+ "data-slot": "tab-indicator"
103
+ }
104
+ )
105
+ ]
106
+ }
107
+ );
108
+ }
109
+ function TabsTab({ className, ...props }) {
110
+ return /* @__PURE__ */ jsx(
111
+ Tabs$1.Tab,
112
+ {
113
+ className: cn(
114
+ '[&_svg]:-mx-0.5 relative z-10 flex h-8 shrink-0 grow cursor-pointer items-center justify-center gap-1.5 whitespace-nowrap rounded-md px-3 text-sm font-medium outline-none transition-[color,background-color,box-shadow] hover:text-primary-900 focus-visible:ring-2 focus-visible:ring-primary-400 data-disabled:pointer-events-none data-[orientation=vertical]:w-full data-[orientation=vertical]:justify-start data-active:text-primary-900 data-disabled:opacity-64 [&_svg:not([class*="size-"])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0',
115
+ className
116
+ ),
117
+ "data-slot": "tabs-tab",
118
+ ...props
119
+ }
120
+ );
121
+ }
122
+ function SettingsSection({ title, children }) {
123
+ return /* @__PURE__ */ jsxs("div", { className: "border-b border-primary-200 py-4 last:border-0", children: [
124
+ /* @__PURE__ */ jsx("h3", { className: "mb-3 text-sm font-medium text-primary-900", children: title }),
125
+ /* @__PURE__ */ jsx("div", { className: "space-y-3", children })
126
+ ] });
127
+ }
128
+ function SettingsRow({ label, description, children }) {
129
+ return /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
130
+ /* @__PURE__ */ jsxs("div", { className: "flex-1 select-none", children: [
131
+ /* @__PURE__ */ jsx("div", { className: "text-sm text-primary-800", children: label }),
132
+ description && /* @__PURE__ */ jsx("div", { className: "text-xs text-primary-500", children: description })
133
+ ] }),
134
+ /* @__PURE__ */ jsx("div", { className: "flex items-center gap-2", children })
135
+ ] });
136
+ }
137
+ const textSizeOptions = [
138
+ { value: "14px", label: "S" },
139
+ { value: "16px", label: "M" },
140
+ { value: "18px", label: "L" },
141
+ { value: "20px", label: "XL" }
142
+ ];
143
+ function isTextSizeValue(value) {
144
+ return textSizeOptions.some((option) => option.value === value);
145
+ }
146
+ function SettingsDialog({
147
+ open,
148
+ onOpenChange,
149
+ onClose
150
+ }) {
151
+ const { settings, updateSettings } = useChatSettings();
152
+ const {
153
+ settings: llmSettings,
154
+ updateSettings: updateLlmSettings,
155
+ status: llmStatus,
156
+ testApiKey
157
+ } = useLlmSettings();
158
+ const [apiKeyInput, setApiKeyInput] = useState(llmSettings.openaiApiKey);
159
+ const [testingKey, setTestingKey] = useState(false);
160
+ const [testResult, setTestResult] = useState(null);
161
+ const [textSize, setTextSize] = useState(() => {
162
+ if (typeof window === "undefined") return "16px";
163
+ try {
164
+ const stored = localStorage.getItem("opencami-text-size");
165
+ if (stored && isTextSizeValue(stored)) return stored;
166
+ } catch {
167
+ }
168
+ return "16px";
169
+ });
170
+ const [ttsEnabled, setTtsEnabled] = useState(() => {
171
+ if (typeof window === "undefined") return true;
172
+ try {
173
+ const stored = localStorage.getItem("opencami-tts-enabled");
174
+ return stored === null ? true : stored === "true";
175
+ } catch {
176
+ return true;
177
+ }
178
+ });
179
+ function applyTextSize(value) {
180
+ if (typeof document === "undefined") return;
181
+ document.documentElement.style.setProperty("--opencami-text-size", value);
182
+ }
183
+ const handleTextSizeChange = (value) => {
184
+ if (!isTextSizeValue(value)) return;
185
+ setTextSize(value);
186
+ applyTextSize(value);
187
+ try {
188
+ localStorage.setItem("opencami-text-size", value);
189
+ } catch {
190
+ }
191
+ };
192
+ const handleTtsToggle = (checked) => {
193
+ setTtsEnabled(checked);
194
+ try {
195
+ localStorage.setItem("opencami-tts-enabled", String(checked));
196
+ } catch {
197
+ }
198
+ window.dispatchEvent(new StorageEvent("storage", {
199
+ key: "opencami-tts-enabled",
200
+ newValue: String(checked)
201
+ }));
202
+ };
203
+ const [personasAvailable, setPersonasAvailable] = useState(false);
204
+ const [personasEnabled, setPersonasEnabled] = useState(() => {
205
+ if (typeof window === "undefined") return true;
206
+ try {
207
+ const stored = localStorage.getItem("opencami-personas-enabled");
208
+ return stored === null ? true : stored === "true";
209
+ } catch {
210
+ return true;
211
+ }
212
+ });
213
+ useEffect(() => {
214
+ let mounted = true;
215
+ async function checkPersonas() {
216
+ try {
217
+ const res = await fetch("/api/personas");
218
+ if (!res.ok) return;
219
+ const data = await res.json();
220
+ if (mounted && data.ok) {
221
+ setPersonasAvailable(data.available);
222
+ }
223
+ } catch {
224
+ }
225
+ }
226
+ checkPersonas();
227
+ return () => {
228
+ mounted = false;
229
+ };
230
+ }, []);
231
+ const handlePersonasToggle = (checked) => {
232
+ setPersonasEnabled(checked);
233
+ try {
234
+ localStorage.setItem("opencami-personas-enabled", String(checked));
235
+ } catch {
236
+ }
237
+ window.dispatchEvent(new StorageEvent("storage", {
238
+ key: "opencami-personas-enabled",
239
+ newValue: String(checked)
240
+ }));
241
+ };
242
+ const handleTestApiKey = async () => {
243
+ if (!apiKeyInput.trim()) return;
244
+ setTestingKey(true);
245
+ setTestResult(null);
246
+ try {
247
+ const result = await testApiKey(apiKeyInput.trim());
248
+ setTestResult(result);
249
+ if (result.valid) {
250
+ updateLlmSettings({ openaiApiKey: apiKeyInput.trim() });
251
+ }
252
+ } finally {
253
+ setTestingKey(false);
254
+ }
255
+ };
256
+ const handleSaveApiKey = () => {
257
+ updateLlmSettings({ openaiApiKey: apiKeyInput.trim() });
258
+ setTestResult(null);
259
+ };
260
+ const handleClearApiKey = () => {
261
+ setApiKeyInput("");
262
+ updateLlmSettings({ openaiApiKey: "" });
263
+ setTestResult(null);
264
+ };
265
+ const themeOptions = [
266
+ { value: "system", label: "System", icon: ComputerIcon },
267
+ { value: "light", label: "Light", icon: Sun01Icon },
268
+ { value: "dark", label: "Dark", icon: Moon01Icon },
269
+ { value: "chameleon", label: "Chameleon", icon: Leaf01Icon }
270
+ ];
271
+ function applyTheme(theme) {
272
+ if (typeof document === "undefined") return;
273
+ const root = document.documentElement;
274
+ const media = window.matchMedia("(prefers-color-scheme: dark)");
275
+ root.classList.remove("light", "dark", "system", "chameleon");
276
+ root.classList.add(theme);
277
+ if (theme === "system" && media.matches) {
278
+ root.classList.add("dark");
279
+ }
280
+ }
281
+ return /* @__PURE__ */ jsx(DialogRoot, { open, onOpenChange, children: /* @__PURE__ */ jsx(DialogContent, { className: "w-[min(480px,92vw)] max-h-[80vh] overflow-auto", children: /* @__PURE__ */ jsxs("div", { className: "p-4", children: [
282
+ /* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between", children: [
283
+ /* @__PURE__ */ jsxs("div", { children: [
284
+ /* @__PURE__ */ jsx(DialogTitle, { className: "mb-1", children: "Settings" }),
285
+ /* @__PURE__ */ jsx(DialogDescription, { className: "hidden", children: "Configure OpenCami" })
286
+ ] }),
287
+ /* @__PURE__ */ jsx(
288
+ DialogClose,
289
+ {
290
+ render: /* @__PURE__ */ jsx(
291
+ Button,
292
+ {
293
+ size: "icon-sm",
294
+ variant: "ghost",
295
+ className: "text-primary-500 hover:bg-primary-100 hover:text-primary-700",
296
+ "aria-label": "Close",
297
+ children: /* @__PURE__ */ jsx(
298
+ HugeiconsIcon,
299
+ {
300
+ icon: Cancel01Icon,
301
+ size: 20,
302
+ strokeWidth: 1.5
303
+ }
304
+ )
305
+ }
306
+ )
307
+ }
308
+ )
309
+ ] }),
310
+ /* @__PURE__ */ jsx(SettingsSection, { title: "Connection", children: /* @__PURE__ */ jsx(SettingsRow, { label: "Status", children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1.5 text-sm text-green-600", children: [
311
+ /* @__PURE__ */ jsx("span", { className: "size-2 rounded-full bg-green-500" }),
312
+ "Connected"
313
+ ] }) }) }),
314
+ /* @__PURE__ */ jsxs(SettingsSection, { title: "Appearance", children: [
315
+ /* @__PURE__ */ jsx(SettingsRow, { label: "Theme", children: /* @__PURE__ */ jsx(
316
+ Tabs,
317
+ {
318
+ value: settings.theme,
319
+ onValueChange: (value) => {
320
+ const theme = value;
321
+ applyTheme(theme);
322
+ updateSettings({ theme });
323
+ },
324
+ children: /* @__PURE__ */ jsx(
325
+ TabsList,
326
+ {
327
+ variant: "default",
328
+ className: "gap-2 *:data-[slot=tab-indicator]:duration-0",
329
+ children: themeOptions.map((option) => /* @__PURE__ */ jsxs(TabsTab, { value: option.value, children: [
330
+ /* @__PURE__ */ jsx(
331
+ HugeiconsIcon,
332
+ {
333
+ icon: option.icon,
334
+ size: 20,
335
+ strokeWidth: 1.5
336
+ }
337
+ ),
338
+ /* @__PURE__ */ jsx("span", { children: option.label })
339
+ ] }, option.value))
340
+ }
341
+ )
342
+ }
343
+ ) }),
344
+ /* @__PURE__ */ jsx(
345
+ SettingsRow,
346
+ {
347
+ label: "Text Size",
348
+ description: "Adjust chat and composer text",
349
+ children: /* @__PURE__ */ jsx(Tabs, { value: textSize, onValueChange: handleTextSizeChange, children: /* @__PURE__ */ jsx(
350
+ TabsList,
351
+ {
352
+ variant: "default",
353
+ className: "gap-2 *:data-[slot=tab-indicator]:duration-0",
354
+ children: textSizeOptions.map((option) => /* @__PURE__ */ jsx(TabsTab, { value: option.value, children: /* @__PURE__ */ jsx("span", { className: "tabular-nums text-xs", children: option.label }) }, option.value))
355
+ }
356
+ ) })
357
+ }
358
+ )
359
+ ] }),
360
+ /* @__PURE__ */ jsxs(SettingsSection, { title: "Chat", children: [
361
+ /* @__PURE__ */ jsx(SettingsRow, { label: "Show tool messages", children: /* @__PURE__ */ jsx(
362
+ Switch,
363
+ {
364
+ checked: settings.showToolMessages,
365
+ onCheckedChange: (checked) => updateSettings({ showToolMessages: checked })
366
+ }
367
+ ) }),
368
+ /* @__PURE__ */ jsx(SettingsRow, { label: "Show reasoning blocks", children: /* @__PURE__ */ jsx(
369
+ Switch,
370
+ {
371
+ checked: settings.showReasoningBlocks,
372
+ onCheckedChange: (checked) => updateSettings({ showReasoningBlocks: checked })
373
+ }
374
+ ) })
375
+ ] }),
376
+ /* @__PURE__ */ jsxs(SettingsSection, { title: "Personas", children: [
377
+ personasAvailable ? /* @__PURE__ */ jsx(
378
+ SettingsRow,
379
+ {
380
+ label: "Persona Picker",
381
+ description: "Show persona picker in chat (20 personalities)",
382
+ children: /* @__PURE__ */ jsx(
383
+ Switch,
384
+ {
385
+ checked: personasEnabled,
386
+ onCheckedChange: handlePersonasToggle
387
+ }
388
+ )
389
+ }
390
+ ) : /* @__PURE__ */ jsx(
391
+ SettingsRow,
392
+ {
393
+ label: "Persona Picker",
394
+ description: "Install the Personas skill to unlock 20 AI personalities",
395
+ children: /* @__PURE__ */ jsx(Switch, { checked: false, disabled: true })
396
+ }
397
+ ),
398
+ !personasAvailable && /* @__PURE__ */ jsx("div", { className: "pt-1", children: /* @__PURE__ */ jsx(
399
+ "a",
400
+ {
401
+ href: "https://www.clawhub.ai/robbyczgw-cla/personas",
402
+ target: "_blank",
403
+ rel: "noopener noreferrer",
404
+ className: "text-xs text-primary-600 hover:text-primary-900 hover:underline",
405
+ children: "Get it on ClawHub →"
406
+ }
407
+ ) })
408
+ ] }),
409
+ /* @__PURE__ */ jsx(SettingsSection, { title: "Text-to-Speech", children: /* @__PURE__ */ jsx(
410
+ SettingsRow,
411
+ {
412
+ label: "Voice Playback",
413
+ description: "Add a 🔊 button to AI messages for text-to-speech",
414
+ children: /* @__PURE__ */ jsx(
415
+ Switch,
416
+ {
417
+ checked: ttsEnabled,
418
+ onCheckedChange: handleTtsToggle
419
+ }
420
+ )
421
+ }
422
+ ) }),
423
+ /* @__PURE__ */ jsxs(SettingsSection, { title: "LLM Features", children: [
424
+ /* @__PURE__ */ jsxs("div", { className: "text-xs text-primary-500 mb-3", children: [
425
+ "Enhance session titles and follow-up suggestions using OpenAI API.",
426
+ llmStatus.hasEnvKey && /* @__PURE__ */ jsx("span", { className: "block mt-1 text-green-600", children: "✓ Server has OPENAI_API_KEY configured" })
427
+ ] }),
428
+ /* @__PURE__ */ jsx(
429
+ SettingsRow,
430
+ {
431
+ label: "Smart session titles",
432
+ description: "Generate concise titles using AI",
433
+ children: /* @__PURE__ */ jsx(
434
+ Switch,
435
+ {
436
+ checked: llmSettings.useLlmTitles,
437
+ onCheckedChange: (checked) => updateLlmSettings({ useLlmTitles: checked }),
438
+ disabled: !llmStatus.isAvailable
439
+ }
440
+ )
441
+ }
442
+ ),
443
+ /* @__PURE__ */ jsx(
444
+ SettingsRow,
445
+ {
446
+ label: "Smart follow-up suggestions",
447
+ description: "AI-generated contextual follow-ups",
448
+ children: /* @__PURE__ */ jsx(
449
+ Switch,
450
+ {
451
+ checked: llmSettings.useLlmFollowUps,
452
+ onCheckedChange: (checked) => updateLlmSettings({ useLlmFollowUps: checked }),
453
+ disabled: !llmStatus.isAvailable
454
+ }
455
+ )
456
+ }
457
+ ),
458
+ /* @__PURE__ */ jsxs("div", { className: "mt-4 pt-3 border-t border-primary-100", children: [
459
+ /* @__PURE__ */ jsx("div", { className: "text-sm text-primary-800 mb-2", children: "OpenAI API Key" }),
460
+ /* @__PURE__ */ jsx("div", { className: "text-xs text-primary-500 mb-2", children: llmStatus.hasEnvKey ? "Optional: Override server key with your own" : "Required for LLM features (stored locally)" }),
461
+ /* @__PURE__ */ jsxs("div", { className: "flex gap-2", children: [
462
+ /* @__PURE__ */ jsx(
463
+ "input",
464
+ {
465
+ type: "password",
466
+ value: apiKeyInput,
467
+ onChange: (e) => {
468
+ setApiKeyInput(e.target.value);
469
+ setTestResult(null);
470
+ },
471
+ placeholder: "sk-...",
472
+ className: "flex-1 px-3 py-1.5 text-sm rounded-md border border-primary-200 bg-surface focus:outline-none focus:ring-2 focus:ring-primary-500"
473
+ }
474
+ ),
475
+ /* @__PURE__ */ jsx(
476
+ Button,
477
+ {
478
+ size: "sm",
479
+ variant: "outline",
480
+ onClick: handleTestApiKey,
481
+ disabled: !apiKeyInput.trim() || testingKey,
482
+ className: "min-w-[60px]",
483
+ children: testingKey ? /* @__PURE__ */ jsx(
484
+ HugeiconsIcon,
485
+ {
486
+ icon: Loading02Icon,
487
+ size: 16,
488
+ className: "animate-spin"
489
+ }
490
+ ) : "Test"
491
+ }
492
+ )
493
+ ] }),
494
+ testResult && /* @__PURE__ */ jsxs(
495
+ "div",
496
+ {
497
+ className: `mt-2 flex items-center gap-1.5 text-xs ${testResult.valid ? "text-green-600" : "text-red-600"}`,
498
+ children: [
499
+ /* @__PURE__ */ jsx(
500
+ HugeiconsIcon,
501
+ {
502
+ icon: testResult.valid ? Tick01Icon : Cancel02Icon,
503
+ size: 14
504
+ }
505
+ ),
506
+ testResult.valid ? "API key is valid" : testResult.error || "Invalid API key"
507
+ ]
508
+ }
509
+ ),
510
+ llmSettings.openaiApiKey && /* @__PURE__ */ jsxs("div", { className: "mt-2 flex items-center justify-between", children: [
511
+ /* @__PURE__ */ jsxs("span", { className: "text-xs text-green-600 flex items-center gap-1", children: [
512
+ /* @__PURE__ */ jsx(HugeiconsIcon, { icon: Tick01Icon, size: 14 }),
513
+ "Key saved"
514
+ ] }),
515
+ /* @__PURE__ */ jsx(
516
+ Button,
517
+ {
518
+ size: "sm",
519
+ variant: "ghost",
520
+ onClick: handleClearApiKey,
521
+ className: "text-xs text-red-600 hover:text-red-700 hover:bg-red-50",
522
+ children: "Clear"
523
+ }
524
+ )
525
+ ] }),
526
+ apiKeyInput && apiKeyInput !== llmSettings.openaiApiKey && !testResult?.valid && /* @__PURE__ */ jsx(
527
+ Button,
528
+ {
529
+ size: "sm",
530
+ variant: "outline",
531
+ onClick: handleSaveApiKey,
532
+ className: "mt-2 w-full",
533
+ children: "Save without testing"
534
+ }
535
+ )
536
+ ] })
537
+ ] }),
538
+ /* @__PURE__ */ jsxs(SettingsSection, { title: "About", children: [
539
+ /* @__PURE__ */ jsx("div", { className: "text-sm text-primary-800", children: "OpenCami" }),
540
+ /* @__PURE__ */ jsxs("div", { className: "flex gap-4 pt-2", children: [
541
+ /* @__PURE__ */ jsx(
542
+ "a",
543
+ {
544
+ href: "https://github.com/robbyczgw-cla/opencami",
545
+ target: "_blank",
546
+ rel: "noopener noreferrer",
547
+ className: "text-sm text-primary-600 hover:text-primary-900 hover:underline",
548
+ children: "GitHub"
549
+ }
550
+ ),
551
+ /* @__PURE__ */ jsx(
552
+ "a",
553
+ {
554
+ href: "https://docs.openclaw.ai",
555
+ target: "_blank",
556
+ rel: "noopener noreferrer",
557
+ className: "text-sm text-primary-600 hover:text-primary-900 hover:underline",
558
+ children: "OpenClaw docs"
559
+ }
560
+ )
561
+ ] })
562
+ ] }),
563
+ /* @__PURE__ */ jsx("div", { className: "mt-6 flex justify-end", children: /* @__PURE__ */ jsx(DialogClose, { onClick: onClose, children: "Close" }) })
564
+ ] }) }) });
565
+ }
566
+ export {
567
+ SettingsDialog
568
+ };
@@ -0,0 +1,4 @@
1
+ const startInstance = void 0;
2
+ export {
3
+ startInstance
4
+ };