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.
- package/LICENSE +22 -0
- package/README.md +111 -0
- package/bin/opencami.js +155 -0
- package/dist/client/apple-touch-icon-180x180.png +0 -0
- package/dist/client/assets/_sessionKey-B-MBYHgD.js +95 -0
- package/dist/client/assets/abap-BdImnpbu.js +1 -0
- package/dist/client/assets/actionscript-3-CfeIJUat.js +1 -0
- package/dist/client/assets/ada-bCR0ucgS.js +1 -0
- package/dist/client/assets/andromeeda-C-Jbm3Hp.js +1 -0
- package/dist/client/assets/angular-html-CU67Zn6k.js +1 -0
- package/dist/client/assets/angular-ts-BwZT4LLn.js +1 -0
- package/dist/client/assets/apache-Pmp26Uib.js +1 -0
- package/dist/client/assets/apex-D8_7TLub.js +1 -0
- package/dist/client/assets/apl-dKokRX4l.js +1 -0
- package/dist/client/assets/applescript-Co6uUVPk.js +1 -0
- package/dist/client/assets/ara-BRHolxvo.js +1 -0
- package/dist/client/assets/asciidoc-Dv7Oe6Be.js +1 -0
- package/dist/client/assets/asm-D_Q5rh1f.js +1 -0
- package/dist/client/assets/astro-CbQHKStN.js +1 -0
- package/dist/client/assets/aurora-x-D-2ljcwZ.js +1 -0
- package/dist/client/assets/awk-DMzUqQB5.js +1 -0
- package/dist/client/assets/ayu-dark-CmMr59Fi.js +1 -0
- package/dist/client/assets/ballerina-BFfxhgS-.js +1 -0
- package/dist/client/assets/bat-BkioyH1T.js +1 -0
- package/dist/client/assets/beancount-k_qm7-4y.js +1 -0
- package/dist/client/assets/berry-uYugtg8r.js +1 -0
- package/dist/client/assets/bibtex-CHM0blh-.js +1 -0
- package/dist/client/assets/bicep-Bmn6On1c.js +1 -0
- package/dist/client/assets/blade-D4QpJJKB.js +1 -0
- package/dist/client/assets/bsl-BO_Y6i37.js +1 -0
- package/dist/client/assets/button-D_9OBT_f.js +1 -0
- package/dist/client/assets/c-BIGW1oBm.js +1 -0
- package/dist/client/assets/c3-VCDPK7BO.js +1 -0
- package/dist/client/assets/cadence-Bv_4Rxtq.js +1 -0
- package/dist/client/assets/cairo-KRGpt6FW.js +1 -0
- package/dist/client/assets/catppuccin-frappe-DFWUc33u.js +1 -0
- package/dist/client/assets/catppuccin-latte-C9dUb6Cb.js +1 -0
- package/dist/client/assets/catppuccin-macchiato-DQyhUUbL.js +1 -0
- package/dist/client/assets/catppuccin-mocha-D87Tk5Gz.js +1 -0
- package/dist/client/assets/clarity-D53aC0YG.js +1 -0
- package/dist/client/assets/clojure-P80f7IUj.js +1 -0
- package/dist/client/assets/cmake-D1j8_8rp.js +1 -0
- package/dist/client/assets/cobol-nwyudZeR.js +1 -0
- package/dist/client/assets/codeowners-Bp6g37R7.js +1 -0
- package/dist/client/assets/codeql-DsOJ9woJ.js +1 -0
- package/dist/client/assets/coffee-Ch7k5sss.js +1 -0
- package/dist/client/assets/common-lisp-Cg-RD9OK.js +1 -0
- package/dist/client/assets/connect-BRasuRbB.js +2 -0
- package/dist/client/assets/coq-DkFqJrB1.js +1 -0
- package/dist/client/assets/cpp-CofmeUqb.js +1 -0
- package/dist/client/assets/crystal-tKQVLTB8.js +1 -0
- package/dist/client/assets/csharp-K5feNrxe.js +1 -0
- package/dist/client/assets/css-DPfMkruS.js +1 -0
- package/dist/client/assets/csv-fuZLfV_i.js +1 -0
- package/dist/client/assets/cue-D82EKSYY.js +1 -0
- package/dist/client/assets/cypher-COkxafJQ.js +1 -0
- package/dist/client/assets/d-85-TOEBH.js +1 -0
- package/dist/client/assets/dark-plus-C3mMm8J8.js +1 -0
- package/dist/client/assets/dart-CF10PKvl.js +1 -0
- package/dist/client/assets/dax-CEL-wOlO.js +1 -0
- package/dist/client/assets/desktop-BmXAJ9_W.js +1 -0
- package/dist/client/assets/diff-D97Zzqfu.js +1 -0
- package/dist/client/assets/docker-BcOcwvcX.js +1 -0
- package/dist/client/assets/dotenv-Da5cRb03.js +1 -0
- package/dist/client/assets/dracula-BzJJZx-M.js +1 -0
- package/dist/client/assets/dracula-soft-BXkSAIEj.js +1 -0
- package/dist/client/assets/dream-maker-BtqSS_iP.js +1 -0
- package/dist/client/assets/edge-BkV0erSs.js +1 -0
- package/dist/client/assets/elixir-CDX3lj18.js +1 -0
- package/dist/client/assets/elm-DbKCFpqz.js +1 -0
- package/dist/client/assets/emacs-lisp-C9XAeP06.js +1 -0
- package/dist/client/assets/erb-BOJIQeun.js +1 -0
- package/dist/client/assets/erlang-DsQrWhSR.js +1 -0
- package/dist/client/assets/everforest-dark-BgDCqdQA.js +1 -0
- package/dist/client/assets/everforest-light-C8M2exoo.js +1 -0
- package/dist/client/assets/fennel-BYunw83y.js +1 -0
- package/dist/client/assets/file-explorer-screen-Daf4rIq9.js +1 -0
- package/dist/client/assets/files-ByeIMLfw.js +2 -0
- package/dist/client/assets/fish-BvzEVeQv.js +1 -0
- package/dist/client/assets/fluent-C4IJs8-o.js +1 -0
- package/dist/client/assets/fortran-fixed-form-CkoXwp7k.js +1 -0
- package/dist/client/assets/fortran-free-form-BxgE0vQu.js +1 -0
- package/dist/client/assets/fsharp-CXgrBDvD.js +1 -0
- package/dist/client/assets/gdresource-B7Tvp0Sc.js +1 -0
- package/dist/client/assets/gdscript-DTMYz4Jt.js +1 -0
- package/dist/client/assets/gdshader-DkwncUOv.js +1 -0
- package/dist/client/assets/genie-D0YGMca9.js +1 -0
- package/dist/client/assets/gherkin-DyxjwDmM.js +1 -0
- package/dist/client/assets/git-commit-F4YmCXRG.js +1 -0
- package/dist/client/assets/git-rebase-r7XF79zn.js +1 -0
- package/dist/client/assets/github-dark-DHJKELXO.js +1 -0
- package/dist/client/assets/github-dark-default-Cuk6v7N8.js +1 -0
- package/dist/client/assets/github-dark-dimmed-DH5Ifo-i.js +1 -0
- package/dist/client/assets/github-dark-high-contrast-E3gJ1_iC.js +1 -0
- package/dist/client/assets/github-light-DAi9KRSo.js +1 -0
- package/dist/client/assets/github-light-default-D7oLnXFd.js +1 -0
- package/dist/client/assets/github-light-high-contrast-BfjtVDDH.js +1 -0
- package/dist/client/assets/gleam-BspZqrRM.js +1 -0
- package/dist/client/assets/glimmer-js-Rg0-pVw9.js +1 -0
- package/dist/client/assets/glimmer-ts-U6CK756n.js +1 -0
- package/dist/client/assets/glsl-DplSGwfg.js +1 -0
- package/dist/client/assets/gn-n2N0HUVH.js +1 -0
- package/dist/client/assets/gnuplot-DdkO51Og.js +1 -0
- package/dist/client/assets/go-Dn2_MT6a.js +1 -0
- package/dist/client/assets/graphql-ChdNCCLP.js +1 -0
- package/dist/client/assets/groovy-gcz8RCvz.js +1 -0
- package/dist/client/assets/gruvbox-dark-hard-CFHQjOhq.js +1 -0
- package/dist/client/assets/gruvbox-dark-medium-GsRaNv29.js +1 -0
- package/dist/client/assets/gruvbox-dark-soft-CVdnzihN.js +1 -0
- package/dist/client/assets/gruvbox-light-hard-CH1njM8p.js +1 -0
- package/dist/client/assets/gruvbox-light-medium-DRw_LuNl.js +1 -0
- package/dist/client/assets/gruvbox-light-soft-hJgmCMqR.js +1 -0
- package/dist/client/assets/hack-CaT9iCJl.js +1 -0
- package/dist/client/assets/haml-B8DHNrY2.js +1 -0
- package/dist/client/assets/handlebars-BL8al0AC.js +1 -0
- package/dist/client/assets/haskell-Df6bDoY_.js +1 -0
- package/dist/client/assets/haxe-CzTSHFRz.js +1 -0
- package/dist/client/assets/hcl-BWvSN4gD.js +1 -0
- package/dist/client/assets/hjson-D5-asLiD.js +1 -0
- package/dist/client/assets/hlsl-D3lLCCz7.js +1 -0
- package/dist/client/assets/houston-DnULxvSX.js +1 -0
- package/dist/client/assets/html-GMplVEZG.js +1 -0
- package/dist/client/assets/html-derivative-BFtXZ54Q.js +1 -0
- package/dist/client/assets/http-jrhK8wxY.js +1 -0
- package/dist/client/assets/hurl-irOxFIW8.js +1 -0
- package/dist/client/assets/hxml-Bvhsp5Yf.js +1 -0
- package/dist/client/assets/hy-DFXneXwc.js +1 -0
- package/dist/client/assets/imba-DGztddWO.js +1 -0
- package/dist/client/assets/index-ByUDBI-n.js +14 -0
- package/dist/client/assets/index-DHGnKfAU.js +1 -0
- package/dist/client/assets/ini-BEwlwnbL.js +1 -0
- package/dist/client/assets/java-CylS5w8V.js +1 -0
- package/dist/client/assets/javascript-wDzz0qaB.js +1 -0
- package/dist/client/assets/jinja-4LBKfQ-Z.js +1 -0
- package/dist/client/assets/jison-wvAkD_A8.js +1 -0
- package/dist/client/assets/json-Cp-IABpG.js +1 -0
- package/dist/client/assets/json5-C9tS-k6U.js +1 -0
- package/dist/client/assets/jsonc-Des-eS-w.js +1 -0
- package/dist/client/assets/jsonl-DcaNXYhu.js +1 -0
- package/dist/client/assets/jsonnet-DFQXde-d.js +1 -0
- package/dist/client/assets/jssm-C2t-YnRu.js +1 -0
- package/dist/client/assets/jsx-g9-lgVsj.js +1 -0
- package/dist/client/assets/julia-CxzCAyBv.js +1 -0
- package/dist/client/assets/kanagawa-dragon-CkXjmgJE.js +1 -0
- package/dist/client/assets/kanagawa-lotus-CfQXZHmo.js +1 -0
- package/dist/client/assets/kanagawa-wave-DWedfzmr.js +1 -0
- package/dist/client/assets/kdl-DV7GczEv.js +1 -0
- package/dist/client/assets/keyboard-shortcuts-dialog-agsWJ36q.js +1 -0
- package/dist/client/assets/kotlin-BdnUsdx6.js +1 -0
- package/dist/client/assets/kusto-DZf3V79B.js +1 -0
- package/dist/client/assets/laserwave-DUszq2jm.js +1 -0
- package/dist/client/assets/latex-B4uzh10-.js +1 -0
- package/dist/client/assets/lean-BZvkOJ9d.js +1 -0
- package/dist/client/assets/less-B1dDrJ26.js +1 -0
- package/dist/client/assets/light-plus-B7mTdjB0.js +1 -0
- package/dist/client/assets/liquid-DYVedYrR.js +1 -0
- package/dist/client/assets/llvm-BtvRca6l.js +1 -0
- package/dist/client/assets/log-2UxHyX5q.js +1 -0
- package/dist/client/assets/logo-BtOb2qkB.js +1 -0
- package/dist/client/assets/lua-BbnMAYS6.js +1 -0
- package/dist/client/assets/luau-C-HG3fhB.js +1 -0
- package/dist/client/assets/main-BAHT5yqU.js +81 -0
- package/dist/client/assets/make-CHLpvVh8.js +1 -0
- package/dist/client/assets/markdown-Cvjx9yec.js +1 -0
- package/dist/client/assets/marko-DZsq8hO1.js +1 -0
- package/dist/client/assets/material-theme-D5KoaKCx.js +1 -0
- package/dist/client/assets/material-theme-darker-BfHTSMKl.js +1 -0
- package/dist/client/assets/material-theme-lighter-B0m2ddpp.js +1 -0
- package/dist/client/assets/material-theme-ocean-CyktbL80.js +1 -0
- package/dist/client/assets/material-theme-palenight-Csfq5Kiy.js +1 -0
- package/dist/client/assets/matlab-D7o27uSR.js +1 -0
- package/dist/client/assets/mdc-DUICxH0z.js +1 -0
- package/dist/client/assets/mdx-Cmh6b_Ma.js +1 -0
- package/dist/client/assets/menu-BhVaz8Ly.js +20 -0
- package/dist/client/assets/mermaid-mWjccvbQ.js +1 -0
- package/dist/client/assets/min-dark-CafNBF8u.js +1 -0
- package/dist/client/assets/min-light-CTRr51gU.js +1 -0
- package/dist/client/assets/mipsasm-CKIfxQSi.js +1 -0
- package/dist/client/assets/mojo-B93PlW-d.js +1 -0
- package/dist/client/assets/monokai-D4h5O-jR.js +1 -0
- package/dist/client/assets/moonbit-Ba13S78F.js +1 -0
- package/dist/client/assets/move-Bu9oaDYs.js +1 -0
- package/dist/client/assets/narrat-DRg8JJMk.js +1 -0
- package/dist/client/assets/new-DLlBm66g.js +1 -0
- package/dist/client/assets/nextflow-BrzmwbiE.js +1 -0
- package/dist/client/assets/nginx-DknmC5AR.js +1 -0
- package/dist/client/assets/night-owl-C39BiMTA.js +1 -0
- package/dist/client/assets/nim-CVrawwO9.js +1 -0
- package/dist/client/assets/nix-CwoSXNpI.js +1 -0
- package/dist/client/assets/nord-Ddv68eIx.js +1 -0
- package/dist/client/assets/nushell-C-sUppwS.js +1 -0
- package/dist/client/assets/objective-c-DXmwc3jG.js +1 -0
- package/dist/client/assets/objective-cpp-CLxacb5B.js +1 -0
- package/dist/client/assets/ocaml-C0hk2d4L.js +1 -0
- package/dist/client/assets/one-dark-pro-DVMEJ2y_.js +1 -0
- package/dist/client/assets/one-light-PoHY5YXO.js +1 -0
- package/dist/client/assets/openscad-C4EeE6gA.js +1 -0
- package/dist/client/assets/pascal-D93ZcfNL.js +1 -0
- package/dist/client/assets/perl-C0TMdlhV.js +1 -0
- package/dist/client/assets/php-CDn_0X-4.js +1 -0
- package/dist/client/assets/pkl-u5AG7uiY.js +1 -0
- package/dist/client/assets/plastic-3e1v2bzS.js +1 -0
- package/dist/client/assets/plsql-ChMvpjG-.js +1 -0
- package/dist/client/assets/po-BTJTHyun.js +1 -0
- package/dist/client/assets/poimandres-CS3Unz2-.js +1 -0
- package/dist/client/assets/polar-C0HS_06l.js +1 -0
- package/dist/client/assets/postcss-CXtECtnM.js +1 -0
- package/dist/client/assets/powerquery-CEu0bR-o.js +1 -0
- package/dist/client/assets/powershell-Dpen1YoG.js +1 -0
- package/dist/client/assets/prisma-Dd19v3D-.js +1 -0
- package/dist/client/assets/prolog-CbFg5uaA.js +1 -0
- package/dist/client/assets/proto-C7zT0LnQ.js +1 -0
- package/dist/client/assets/pug-CGlum2m_.js +1 -0
- package/dist/client/assets/puppet-BMWR74SV.js +1 -0
- package/dist/client/assets/purescript-CklMAg4u.js +1 -0
- package/dist/client/assets/python-B6aJPvgy.js +1 -0
- package/dist/client/assets/qml-3beO22l8.js +1 -0
- package/dist/client/assets/qmldir-C8lEn-DE.js +1 -0
- package/dist/client/assets/qss-IeuSbFQv.js +1 -0
- package/dist/client/assets/r-Dspwwk_N.js +1 -0
- package/dist/client/assets/racket-BqYA7rlc.js +1 -0
- package/dist/client/assets/raku-DXvB9xmW.js +1 -0
- package/dist/client/assets/razor-C1TweQQi.js +1 -0
- package/dist/client/assets/red-bN70gL4F.js +1 -0
- package/dist/client/assets/reg-C-SQnVFl.js +1 -0
- package/dist/client/assets/regexp-CDVJQ6XC.js +1 -0
- package/dist/client/assets/rel-C3B-1QV4.js +1 -0
- package/dist/client/assets/riscv-BM1_JUlF.js +1 -0
- package/dist/client/assets/rose-pine-dawn-DHQR4-dF.js +1 -0
- package/dist/client/assets/rose-pine-moon-D4_iv3hh.js +1 -0
- package/dist/client/assets/rose-pine-qdsjHGoJ.js +1 -0
- package/dist/client/assets/rosmsg-BJDFO7_C.js +1 -0
- package/dist/client/assets/rst-B0xPkSld.js +1 -0
- package/dist/client/assets/ruby-BvKwtOVI.js +1 -0
- package/dist/client/assets/rust-B1yitclQ.js +1 -0
- package/dist/client/assets/sas-cz2c8ADy.js +1 -0
- package/dist/client/assets/sass-Cj5Yp3dK.js +1 -0
- package/dist/client/assets/scala-C151Ov-r.js +1 -0
- package/dist/client/assets/scheme-C98Dy4si.js +1 -0
- package/dist/client/assets/scss-OYdSNvt2.js +1 -0
- package/dist/client/assets/sdbl-DVxCFoDh.js +1 -0
- package/dist/client/assets/search-dialog-CHwnOyPS.js +1 -0
- package/dist/client/assets/session-export-dialog-uOlDUzgX.js +1 -0
- package/dist/client/assets/settings-dialog-D0aYDkAM.js +1 -0
- package/dist/client/assets/shaderlab-Dg9Lc6iA.js +1 -0
- package/dist/client/assets/shellscript-Yzrsuije.js +1 -0
- package/dist/client/assets/shellsession-BADoaaVG.js +1 -0
- package/dist/client/assets/slack-dark-BthQWCQV.js +1 -0
- package/dist/client/assets/slack-ochin-DqwNpetd.js +1 -0
- package/dist/client/assets/smalltalk-BERRCDM3.js +1 -0
- package/dist/client/assets/snazzy-light-Bw305WKR.js +1 -0
- package/dist/client/assets/solarized-dark-DXbdFlpD.js +1 -0
- package/dist/client/assets/solarized-light-L9t79GZl.js +1 -0
- package/dist/client/assets/solidity-rGO070M0.js +1 -0
- package/dist/client/assets/soy-Brmx7dQM.js +1 -0
- package/dist/client/assets/sparql-rVzFXLq3.js +1 -0
- package/dist/client/assets/splunk-BtCnVYZw.js +1 -0
- package/dist/client/assets/sql-BLtJtn59.js +1 -0
- package/dist/client/assets/ssh-config-_ykCGR6B.js +1 -0
- package/dist/client/assets/stata-BH5u7GGu.js +1 -0
- package/dist/client/assets/styles-7aVSlb6l.css +1 -0
- package/dist/client/assets/stylus-BEDo0Tqx.js +1 -0
- package/dist/client/assets/svelte-zxCyuUbr.js +1 -0
- package/dist/client/assets/swift-Dg5xB15N.js +1 -0
- package/dist/client/assets/synthwave-84-CbfX1IO0.js +1 -0
- package/dist/client/assets/system-verilog-CnnmHF94.js +1 -0
- package/dist/client/assets/systemd-4A_iFExJ.js +1 -0
- package/dist/client/assets/talonscript-CkByrt1z.js +1 -0
- package/dist/client/assets/tasl-QIJgUcNo.js +1 -0
- package/dist/client/assets/tcl-dwOrl1Do.js +1 -0
- package/dist/client/assets/templ-W15q3VgB.js +1 -0
- package/dist/client/assets/terraform-BETggiCN.js +1 -0
- package/dist/client/assets/tex-CvyZ59Mk.js +1 -0
- package/dist/client/assets/tokyo-night-hegEt444.js +1 -0
- package/dist/client/assets/toml-vGWfd6FD.js +1 -0
- package/dist/client/assets/ts-tags-zn1MmPIZ.js +1 -0
- package/dist/client/assets/tsv-B_m7g4N7.js +1 -0
- package/dist/client/assets/tsx-COt5Ahok.js +1 -0
- package/dist/client/assets/turtle-BsS91CYL.js +1 -0
- package/dist/client/assets/twig-CO9l9SDP.js +1 -0
- package/dist/client/assets/typescript-BPQ3VLAy.js +1 -0
- package/dist/client/assets/typespec-BGHnOYBU.js +1 -0
- package/dist/client/assets/typst-DHCkPAjA.js +1 -0
- package/dist/client/assets/v-BcVCzyr7.js +1 -0
- package/dist/client/assets/vala-CsfeWuGM.js +1 -0
- package/dist/client/assets/vb-D17OF-Vu.js +1 -0
- package/dist/client/assets/verilog-BQ8w6xss.js +1 -0
- package/dist/client/assets/vesper-DU1UobuO.js +1 -0
- package/dist/client/assets/vhdl-CeAyd5Ju.js +1 -0
- package/dist/client/assets/viml-CJc9bBzg.js +1 -0
- package/dist/client/assets/vitesse-black-Bkuqu6BP.js +1 -0
- package/dist/client/assets/vitesse-dark-D0r3Knsf.js +1 -0
- package/dist/client/assets/vitesse-light-CVO1_9PV.js +1 -0
- package/dist/client/assets/vue-DN_0RTcg.js +1 -0
- package/dist/client/assets/vue-html-AaS7Mt5G.js +1 -0
- package/dist/client/assets/vue-vine-CQOfvN7w.js +1 -0
- package/dist/client/assets/vyper-CDx5xZoG.js +1 -0
- package/dist/client/assets/wasm-CG6Dc4jp.js +1 -0
- package/dist/client/assets/wasm-MzD3tlZU.js +1 -0
- package/dist/client/assets/wenyan-BV7otONQ.js +1 -0
- package/dist/client/assets/wgsl-Dx-B1_4e.js +1 -0
- package/dist/client/assets/wikitext-BhOHFoWU.js +1 -0
- package/dist/client/assets/wit-5i3qLPDT.js +1 -0
- package/dist/client/assets/wolfram-lXgVvXCa.js +1 -0
- package/dist/client/assets/xml-sdJ4AIDG.js +1 -0
- package/dist/client/assets/xsl-CtQFsRM5.js +1 -0
- package/dist/client/assets/yaml-Buea-lGh.js +1 -0
- package/dist/client/assets/zenscript-DVFEvuxE.js +1 -0
- package/dist/client/assets/zig-VOosw3JB.js +1 -0
- package/dist/client/cover.jpg +0 -0
- package/dist/client/cover.webp +0 -0
- package/dist/client/favicon.svg +4 -0
- package/dist/client/manifest.json +40 -0
- package/dist/client/pwa-192x192.png +0 -0
- package/dist/client/pwa-512x512.png +0 -0
- package/dist/client/pwa-maskable-512x512.png +0 -0
- package/dist/client/robots.txt +3 -0
- package/dist/client/screenshot-file-explorer.png +0 -0
- package/dist/client/sw.js +165 -0
- package/dist/server/assets/_sessionKey-qlAPF_Ft.js +6130 -0
- package/dist/server/assets/_tanstack-start-manifest_v-El8F-kd-.js +4 -0
- package/dist/server/assets/button-DtQ3rV1m.js +53 -0
- package/dist/server/assets/connect-BWI_6rCm.js +80 -0
- package/dist/server/assets/file-explorer-screen-DJXPEG_J.js +2450 -0
- package/dist/server/assets/files-CONoVTGD.js +11 -0
- package/dist/server/assets/index-Bp8QskbI.js +28 -0
- package/dist/server/assets/index-COu2idHm.js +226 -0
- package/dist/server/assets/keyboard-shortcuts-dialog-D5hqVX2v.js +69 -0
- package/dist/server/assets/menu-D6n4DB0U.js +156 -0
- package/dist/server/assets/new-Dzk5YxE9.js +6 -0
- package/dist/server/assets/router-DbxyvprK.js +2749 -0
- package/dist/server/assets/search-dialog-JY8C3mqa.js +443 -0
- package/dist/server/assets/session-export-dialog-D87uafPD.js +80 -0
- package/dist/server/assets/settings-dialog-CBj7njLM.js +568 -0
- package/dist/server/assets/start-HYkvq4Ni.js +4 -0
- package/dist/server/server.js +1013 -0
- package/package.json +93 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Julien Thibeaut (original WebClaw - github.com/ibelick/webclaw)
|
|
4
|
+
Copyright (c) 2026 Robby (OpenCami additions - github.com/robbyczgw-cla/opencami)
|
|
5
|
+
|
|
6
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
7
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
8
|
+
in the Software without restriction, including without limitation the rights
|
|
9
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
10
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
11
|
+
furnished to do so, subject to the following conditions:
|
|
12
|
+
|
|
13
|
+
The above copyright notice and this permission notice shall be included in all
|
|
14
|
+
copies or substantial portions of the Software.
|
|
15
|
+
|
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
17
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
18
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
19
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
20
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
21
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
22
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# OpenCami 🦎
|
|
2
|
+
|
|
3
|
+
> **Web chat client for [OpenClaw](https://github.com/openclaw/openclaw)** — AI chat interface with PWA support, smart titles, voice playback & more.
|
|
4
|
+
|
|
5
|
+
Forked from [WebClaw](https://github.com/ibelick/webclaw).
|
|
6
|
+
|
|
7
|
+
[](https://opencami.xyz)
|
|
8
|
+
[](LICENSE)
|
|
9
|
+
|
|
10
|
+

|
|
11
|
+
|
|
12
|
+
## ✨ Features
|
|
13
|
+
|
|
14
|
+
**Core:**
|
|
15
|
+
💬 Multi-session chat · 🎨 Theme support · ⚙️ Settings dialog · 📝 Markdown rendering · 📱 Mobile-responsive
|
|
16
|
+
|
|
17
|
+
**Communication:**
|
|
18
|
+
⚡ Real-time streaming · 🔊 Voice playback (TTS)
|
|
19
|
+
|
|
20
|
+
**Organization:**
|
|
21
|
+
📁 Session folders · 🦎 OpenCami chat folder · 📌 Pin sessions · 🗑️ Bulk delete · 🛡️ Protected sessions
|
|
22
|
+
|
|
23
|
+
**Search & Navigation:**
|
|
24
|
+
🔍 Conversation search · ⌨️ Keyboard shortcuts · 📥 Export conversations
|
|
25
|
+
|
|
26
|
+
**Customization:**
|
|
27
|
+
🎨 Model selector · 🎭 Persona picker · 🦎 Chameleon theme · 🔤 Text size control
|
|
28
|
+
|
|
29
|
+
**Files:**
|
|
30
|
+
📂 File explorer · 🖼️ Image attachments
|
|
31
|
+
|
|
32
|
+
**Smart Features:**
|
|
33
|
+
🏷️ Smart titles · 💡 Smart follow-ups · 💬 Slash commands
|
|
34
|
+
|
|
35
|
+
**Mobile:**
|
|
36
|
+
👉 Swipe gestures · ⚡ Lazy loading · 📱 Native Android APK (Capacitor)
|
|
37
|
+
|
|
38
|
+
**PWA:**
|
|
39
|
+
📱 Install as app · 🔄 Offline support · 🚀 Auto-update
|
|
40
|
+
|
|
41
|
+
→ **[See detailed feature descriptions in docs/features.md](docs/features.md)**
|
|
42
|
+
|
|
43
|
+
## 🚀 Quick Start
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
# Clone
|
|
47
|
+
git clone https://github.com/robbyczgw-cla/opencami.git
|
|
48
|
+
cd opencami
|
|
49
|
+
|
|
50
|
+
# Install
|
|
51
|
+
npm install
|
|
52
|
+
|
|
53
|
+
# Configure
|
|
54
|
+
cp .env.example .env.local
|
|
55
|
+
# Edit .env.local with your Gateway URL and token
|
|
56
|
+
|
|
57
|
+
# Run
|
|
58
|
+
npm run dev
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Open http://localhost:3001
|
|
62
|
+
|
|
63
|
+
## 📱 Install as PWA
|
|
64
|
+
|
|
65
|
+
1. Open OpenCami in your browser
|
|
66
|
+
2. **Android:** Tap ⋮ menu → "Install app" or "Add to Home Screen"
|
|
67
|
+
3. **iOS:** Tap Share → "Add to Home Screen"
|
|
68
|
+
|
|
69
|
+
## 📚 Documentation
|
|
70
|
+
|
|
71
|
+
- **[Features](docs/features.md)** — Detailed feature descriptions
|
|
72
|
+
- **[Architecture](docs/architecture.md)** — Technical overview
|
|
73
|
+
- **[Deployment](docs/deployment.md)** — Self-hosting guide
|
|
74
|
+
- **[Contributing](docs/contributing.md)** — Development workflow
|
|
75
|
+
- **[Changelog](docs/changelog.md)** — Version history
|
|
76
|
+
|
|
77
|
+
## 🔄 Upstream Contributions
|
|
78
|
+
|
|
79
|
+
PRs submitted to [ibelick/webclaw](https://github.com/ibelick/webclaw):
|
|
80
|
+
- ✅ [PR #1](https://github.com/ibelick/webclaw/pull/1) — Locale fix (MERGED)
|
|
81
|
+
- ⏳ [PR #4](https://github.com/ibelick/webclaw/pull/4) — Image attachments
|
|
82
|
+
- ⏳ [PR #9](https://github.com/ibelick/webclaw/pull/9) — Conversation search
|
|
83
|
+
- ⏳ [PR #10](https://github.com/ibelick/webclaw/pull/10) — Conversation export
|
|
84
|
+
- ⏳ [PR #11](https://github.com/ibelick/webclaw/pull/11) — Text size setting
|
|
85
|
+
|
|
86
|
+
## 🗺️ Roadmap
|
|
87
|
+
|
|
88
|
+
- [x] 🔊 Voice Playback (multi-provider TTS)
|
|
89
|
+
- [x] 🎭 Persona Picker
|
|
90
|
+
- [x] 🎨 Model Selector
|
|
91
|
+
- [x] 📱 PWA Support
|
|
92
|
+
- [x] ⚡ Real-Time Streaming
|
|
93
|
+
- [x] 📂 File Explorer
|
|
94
|
+
- [ ] 🔔 Push Notifications (PWA)
|
|
95
|
+
- [ ] 🎤 Voice Input (Whisper transcription)
|
|
96
|
+
- [ ] 📎 File Uploads (PDFs, docs, code)
|
|
97
|
+
- [ ] 📊 Usage Dashboard
|
|
98
|
+
|
|
99
|
+
## 🙏 Credits
|
|
100
|
+
|
|
101
|
+
- **[WebClaw](https://github.com/ibelick/webclaw)** by [Julien Thibeaut](https://github.com/ibelick) — Original project
|
|
102
|
+
- **[balin-ar](https://github.com/balin-ar)** — File Explorer with built-in text editor ([PR #2](https://github.com/ibelick/webclaw/pull/2))
|
|
103
|
+
- **[OpenClaw](https://github.com/openclaw/openclaw)** — The gateway that powers it all
|
|
104
|
+
|
|
105
|
+
## 📄 License
|
|
106
|
+
|
|
107
|
+
MIT — See [LICENSE](LICENSE)
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
🌐 **[opencami.xyz](https://opencami.xyz)** · Built with 💚 by the OpenCami community
|
package/bin/opencami.js
ADDED
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { createServer } from 'node:http';
|
|
4
|
+
import { readFile, stat } from 'node:fs/promises';
|
|
5
|
+
import { join, extname } from 'node:path';
|
|
6
|
+
import { fileURLToPath } from 'node:url';
|
|
7
|
+
import { exec } from 'node:child_process';
|
|
8
|
+
|
|
9
|
+
const __dirname = fileURLToPath(new URL('..', import.meta.url));
|
|
10
|
+
|
|
11
|
+
// Parse args
|
|
12
|
+
const args = process.argv.slice(2);
|
|
13
|
+
function getArg(name, def) {
|
|
14
|
+
const i = args.indexOf(`--${name}`);
|
|
15
|
+
if (i === -1) return def;
|
|
16
|
+
return args[i + 1] || def;
|
|
17
|
+
}
|
|
18
|
+
const port = parseInt(getArg('port', '3000'), 10);
|
|
19
|
+
const host = getArg('host', '127.0.0.1');
|
|
20
|
+
const gateway = getArg('gateway', 'ws://127.0.0.1:18789');
|
|
21
|
+
const noOpen = args.includes('--no-open');
|
|
22
|
+
|
|
23
|
+
if (args.includes('--help') || args.includes('-h')) {
|
|
24
|
+
console.log(`
|
|
25
|
+
opencami - Web UI for OpenClaw
|
|
26
|
+
|
|
27
|
+
Usage: opencami [options]
|
|
28
|
+
|
|
29
|
+
Options:
|
|
30
|
+
--port <n> Port to listen on (default: 3000)
|
|
31
|
+
--host <addr> Host to bind to (default: 127.0.0.1)
|
|
32
|
+
--gateway <url> OpenClaw gateway URL (default: ws://127.0.0.1:18789)
|
|
33
|
+
--no-open Don't open browser on start
|
|
34
|
+
-h, --help Show this help
|
|
35
|
+
`);
|
|
36
|
+
process.exit(0);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Set gateway env for the app
|
|
40
|
+
process.env.OPENCLAW_GATEWAY = gateway;
|
|
41
|
+
|
|
42
|
+
const MIME_TYPES = {
|
|
43
|
+
'.html': 'text/html',
|
|
44
|
+
'.js': 'application/javascript',
|
|
45
|
+
'.css': 'text/css',
|
|
46
|
+
'.json': 'application/json',
|
|
47
|
+
'.png': 'image/png',
|
|
48
|
+
'.jpg': 'image/jpeg',
|
|
49
|
+
'.jpeg': 'image/jpeg',
|
|
50
|
+
'.gif': 'image/gif',
|
|
51
|
+
'.svg': 'image/svg+xml',
|
|
52
|
+
'.webp': 'image/webp',
|
|
53
|
+
'.ico': 'image/x-icon',
|
|
54
|
+
'.woff': 'font/woff',
|
|
55
|
+
'.woff2': 'font/woff2',
|
|
56
|
+
'.ttf': 'font/ttf',
|
|
57
|
+
'.txt': 'text/plain',
|
|
58
|
+
'.webmanifest': 'application/manifest+json',
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
const clientDir = join(__dirname, 'dist', 'client');
|
|
62
|
+
|
|
63
|
+
async function serveStatic(pathname) {
|
|
64
|
+
const filePath = join(clientDir, pathname);
|
|
65
|
+
// Prevent path traversal
|
|
66
|
+
if (!filePath.startsWith(clientDir)) return null;
|
|
67
|
+
try {
|
|
68
|
+
const s = await stat(filePath);
|
|
69
|
+
if (!s.isFile()) return null;
|
|
70
|
+
const data = await readFile(filePath);
|
|
71
|
+
const ext = extname(filePath);
|
|
72
|
+
return { data, mime: MIME_TYPES[ext] || 'application/octet-stream' };
|
|
73
|
+
} catch {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Import the TanStack Start server
|
|
79
|
+
const { default: server } = await import(join(__dirname, 'dist', 'server', 'server.js'));
|
|
80
|
+
|
|
81
|
+
const httpServer = createServer(async (req, res) => {
|
|
82
|
+
const url = new URL(req.url, `http://${req.headers.host}`);
|
|
83
|
+
|
|
84
|
+
// Try static files first
|
|
85
|
+
const staticFile = await serveStatic(url.pathname);
|
|
86
|
+
if (staticFile) {
|
|
87
|
+
res.writeHead(200, { 'Content-Type': staticFile.mime, 'Cache-Control': 'public, max-age=31536000, immutable' });
|
|
88
|
+
res.end(staticFile.data);
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Forward to SSR handler
|
|
93
|
+
try {
|
|
94
|
+
const headers = new Headers();
|
|
95
|
+
for (const [key, value] of Object.entries(req.headers)) {
|
|
96
|
+
if (value) headers.set(key, Array.isArray(value) ? value.join(', ') : value);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const body = req.method !== 'GET' && req.method !== 'HEAD'
|
|
100
|
+
? await new Promise((resolve, reject) => {
|
|
101
|
+
const chunks = [];
|
|
102
|
+
req.on('data', c => chunks.push(c));
|
|
103
|
+
req.on('end', () => resolve(Buffer.concat(chunks)));
|
|
104
|
+
req.on('error', reject);
|
|
105
|
+
})
|
|
106
|
+
: undefined;
|
|
107
|
+
|
|
108
|
+
const request = new Request(url.href, {
|
|
109
|
+
method: req.method,
|
|
110
|
+
headers,
|
|
111
|
+
body,
|
|
112
|
+
duplex: 'half',
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
const response = await server.fetch(request);
|
|
116
|
+
|
|
117
|
+
res.writeHead(response.status, Object.fromEntries(response.headers.entries()));
|
|
118
|
+
|
|
119
|
+
if (response.body) {
|
|
120
|
+
const reader = response.body.getReader();
|
|
121
|
+
const pump = async () => {
|
|
122
|
+
while (true) {
|
|
123
|
+
const { done, value } = await reader.read();
|
|
124
|
+
if (done) { res.end(); break; }
|
|
125
|
+
res.write(value);
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
pump().catch(() => res.end());
|
|
129
|
+
} else {
|
|
130
|
+
const buf = await response.arrayBuffer();
|
|
131
|
+
res.end(Buffer.from(buf));
|
|
132
|
+
}
|
|
133
|
+
} catch (err) {
|
|
134
|
+
console.error('Request error:', err.message);
|
|
135
|
+
if (!res.headersSent) {
|
|
136
|
+
res.writeHead(500, { 'Content-Type': 'text/plain' });
|
|
137
|
+
res.end('Internal Server Error');
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
httpServer.listen(port, host, () => {
|
|
143
|
+
const url = `http://${host === '0.0.0.0' ? 'localhost' : host}:${port}`;
|
|
144
|
+
console.log();
|
|
145
|
+
console.log(' 🐾 \x1b[1mOpenCami\x1b[0m');
|
|
146
|
+
console.log();
|
|
147
|
+
console.log(` ➜ Local: \x1b[36m${url}\x1b[0m`);
|
|
148
|
+
console.log(` ➜ Gateway: \x1b[33m${gateway}\x1b[0m`);
|
|
149
|
+
console.log();
|
|
150
|
+
|
|
151
|
+
if (!noOpen) {
|
|
152
|
+
const cmd = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'start' : 'xdg-open';
|
|
153
|
+
exec(`${cmd} ${url}`, () => {});
|
|
154
|
+
}
|
|
155
|
+
});
|
|
Binary file
|