@cryptiklemur/lattice 5.10.1-beta.1 → 5.12.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/dist/client/assets/{angular-html-D6m09EG8.js → angular-html-u7-FkTHq.js} +1 -1
- package/dist/client/assets/{angular-ts-BBq8Hbdf.js → angular-ts-BE8DugAt.js} +1 -1
- package/dist/client/assets/apl-CtfeVeo7.js +1 -0
- package/dist/client/assets/{apl-xC8C0X93.js → apl-vwkcGC98.js} +1 -1
- package/dist/client/assets/asciiarmor-D9t2jc8I.js +1 -0
- package/dist/client/assets/asn1-G8L642Gf.js +1 -0
- package/dist/client/assets/asterisk-DE-h77IU.js +1 -0
- package/dist/client/assets/{astro-vbKausOH.js → astro-D_KXdsxq.js} +1 -1
- package/dist/client/assets/{blade-DioaAET-.js → blade-CLWQA5YQ.js} +1 -1
- package/dist/client/assets/brainfuck-xriqAMlA.js +1 -0
- package/dist/client/assets/{bsl-BRmzGEWg.js → bsl-DI2KOR3D.js} +1 -1
- package/dist/client/assets/{c-B91mlIdk.js → c-CMDgDy3h.js} +1 -1
- package/dist/client/assets/{cairo-CaIu88t6.js → cairo-BLW1-yrm.js} +1 -1
- package/dist/client/assets/clike-DKxy6znE.js +1 -0
- package/dist/client/assets/clojure-BEypuZGB.js +1 -0
- package/dist/client/assets/cmake-CPOSjK1n.js +1 -0
- package/dist/client/assets/{cobol-DjlVBbCJ.js → cobol-9glAj1XI.js} +1 -1
- package/dist/client/assets/cobol-DeFy0o5A.js +1 -0
- package/dist/client/assets/{coffee-CPkMIjww.js → coffee-CB7sM38M.js} +1 -1
- package/dist/client/assets/coffeescript-DfLAkA9d.js +1 -0
- package/dist/client/assets/commonlisp-m15goeW5.js +1 -0
- package/dist/client/assets/{cpp-8m5goXOK.js → cpp-DvFsqT7C.js} +1 -1
- package/dist/client/assets/{crystal-CXphABcj.js → crystal-BSwdQRsq.js} +1 -1
- package/dist/client/assets/crystal-DkLvnJPs.js +1 -0
- package/dist/client/assets/css-D0210L0p.js +1 -0
- package/dist/client/assets/{css-CUkHaN8R.js → css-DtdGTk5D.js} +1 -1
- package/dist/client/assets/cypher-CasfIY7y.js +1 -0
- package/dist/client/assets/d-Cdn2AFnp.js +1 -0
- package/dist/client/assets/diff-CsQu64MQ.js +1 -0
- package/dist/client/assets/dist-7cPY2VfM.js +1 -0
- package/dist/client/assets/dist-B2Kmv4VP.js +12 -0
- package/dist/client/assets/dist-BDUIUwuP.js +1 -0
- package/dist/client/assets/dist-BGrEnzSd.js +2 -0
- package/dist/client/assets/dist-BOM8UXzu.js +9 -0
- package/dist/client/assets/dist-BqnKw1mg.js +1 -0
- package/dist/client/assets/dist-CH4ux_NV.js +1 -0
- package/dist/client/assets/dist-CVd9myNS.js +11 -0
- package/dist/client/assets/dist-Cbmj28I_.js +1 -0
- package/dist/client/assets/{dist-BssewFKQ.js → dist-DRbDL5Bd.js} +5 -5
- package/dist/client/assets/dist-DTdiyFXe.js +1 -0
- package/dist/client/assets/dist-DacYekBQ.js +1 -0
- package/dist/client/assets/dist-DpyvKyx4.js +1 -0
- package/dist/client/assets/dist-DrVgLaKG.js +1 -0
- package/dist/client/assets/dist-JAKtFuZo.js +1 -0
- package/dist/client/assets/dist-QgglNoJS.js +1 -0
- package/dist/client/assets/dist-VHLsuz98.js +1 -0
- package/dist/client/assets/dist-hfHNZoxo.js +1 -0
- package/dist/client/assets/dist-ntpDmu68.js +1 -0
- package/dist/client/assets/dist-ugNuVsVT.js +1 -0
- package/dist/client/assets/dockerfile-D4EJKg6d.js +1 -0
- package/dist/client/assets/dtd-Bm30AEAE.js +1 -0
- package/dist/client/assets/dylan-CXISgR5e.js +1 -0
- package/dist/client/assets/ebnf-B7L3kbeB.js +1 -0
- package/dist/client/assets/ecl-Bllw0JDE.js +1 -0
- package/dist/client/assets/{edge-DuRyfHAG.js → edge-ImH0CVa4.js} +1 -1
- package/dist/client/assets/eiffel-pn5EnCbJ.js +1 -0
- package/dist/client/assets/{elixir-Kh4tHsPU.js → elixir-BTA0pgnK.js} +1 -1
- package/dist/client/assets/elm-BW9HFysA.js +1 -0
- package/dist/client/assets/{elm-DP5BBq5g.js → elm-D8iE_p48.js} +1 -1
- package/dist/client/assets/{erb-CPwtAg8p.js → erb-DdN-YVLk.js} +1 -1
- package/dist/client/assets/{erlang-LvhGhZI3.js → erlang-CmwBywR-.js} +1 -1
- package/dist/client/assets/erlang-Ctl5tqvi.js +1 -0
- package/dist/client/assets/factor-B2iqLyvO.js +1 -0
- package/dist/client/assets/fcl-CHzzWDH7.js +1 -0
- package/dist/client/assets/forth-jxkuuQBT.js +1 -0
- package/dist/client/assets/fortran-T8ZhhRUi.js +1 -0
- package/dist/client/assets/{fortran-fixed-form-BXvkHMbK.js → fortran-fixed-form-TvXpM4F9.js} +1 -1
- package/dist/client/assets/{fsharp-uxIU8dwY.js → fsharp-CS-Pkz57.js} +1 -1
- package/dist/client/assets/gas-C6kAdB_8.js +1 -0
- package/dist/client/assets/{gdresource-DkI-mZL2.js → gdresource-CxeZzfg7.js} +1 -1
- package/dist/client/assets/gherkin-DKN-CEiy.js +1 -0
- package/dist/client/assets/{git-commit-a3TktZ3A.js → git-commit-Da7bdZ3Y.js} +1 -1
- package/dist/client/assets/{git-rebase-D7Y7VykT.js → git-rebase-D3qSdkTJ.js} +1 -1
- package/dist/client/assets/{glimmer-js-BUvQ43T_.js → glimmer-js-7YCCLNwO.js} +1 -1
- package/dist/client/assets/{glimmer-ts-DJuVunYJ.js → glimmer-ts-CDdu8Qd8.js} +1 -1
- package/dist/client/assets/{glsl-BiMffKEF.js → glsl-_nrZTA3g.js} +1 -1
- package/dist/client/assets/{graphql-DVujBgqT.js → graphql-7veyvoHL.js} +1 -1
- package/dist/client/assets/groovy-DUIj4WPu.js +1 -0
- package/dist/client/assets/{hack-3q6XAaux.js → hack-AP9w659y.js} +1 -1
- package/dist/client/assets/{haml-2tZ0yjTq.js → haml-CxFgqevH.js} +1 -1
- package/dist/client/assets/{handlebars-BXM_86F7.js → handlebars-C0QMthrf.js} +1 -1
- package/dist/client/assets/haskell-X-rGCpr_.js +1 -0
- package/dist/client/assets/haxe-C90FcyDF.js +1 -0
- package/dist/client/assets/{html-DD3u231D.js → html-BffHwMvJ.js} +1 -1
- package/dist/client/assets/{html-derivative-CsugPCRn.js → html-derivative-CYRBBGvG.js} +1 -1
- package/dist/client/assets/http-BKtm9NwN.js +1 -0
- package/dist/client/assets/{http-YDBoN0g2.js → http-Bde-CNYF.js} +1 -1
- package/dist/client/assets/{hurl-BK0VLIzz.js → hurl-CTqau0Ep.js} +1 -1
- package/dist/client/assets/{hxml-Bdi_kWeE.js → hxml-CGjKtqGT.js} +1 -1
- package/dist/client/assets/idl-SlIGMRhH.js +1 -0
- package/dist/client/assets/index-BBNq6BrR.js +581 -0
- package/dist/client/assets/index-BqaEsnA3.css +2 -0
- package/dist/client/assets/{java-DaXWRTJ3.js → java-Dj9ZhWOm.js} +1 -1
- package/dist/client/assets/javascript-C1CwuCil.js +1 -0
- package/dist/client/assets/{javascript-D8MAdpSq.js → javascript-CbKvVdrj.js} +1 -1
- package/dist/client/assets/{jinja-C4W9K1GV.js → jinja-uJK6XW_T.js} +1 -1
- package/dist/client/assets/{jison-DVxjxSXc.js → jison-CFAwedSj.js} +1 -1
- package/dist/client/assets/{json-yxP5bfsL.js → json-BqLSloeE.js} +1 -1
- package/dist/client/assets/{jsx-CVmtEgAW.js → jsx-D22SZoUE.js} +1 -1
- package/dist/client/assets/{julia-DYV2y1VD.js → julia-C0qhkiSe.js} +1 -1
- package/dist/client/assets/julia-DFoqV-f-.js +1 -0
- package/dist/client/assets/{just-DUWBFXa_.js → just-D2QihHiD.js} +1 -1
- package/dist/client/assets/{latex-D6BHuAKY.js → latex-B1ty0Fuq.js} +1 -1
- package/dist/client/assets/{liquid-pX028QHo.js → liquid-B7O5OkOo.js} +1 -1
- package/dist/client/assets/livescript-fL-Gs_1D.js +1 -0
- package/dist/client/assets/lua-DPWP-WrC.js +1 -0
- package/dist/client/assets/{lua-CrZQfADi.js → lua-DulTdQqC.js} +1 -1
- package/dist/client/assets/{marko-DPT7DbA-.js → marko-BtuEmp3R.js} +1 -1
- package/dist/client/assets/mathematica-uOx2kz-B.js +1 -0
- package/dist/client/assets/mbox-D92CR1CJ.js +1 -0
- package/dist/client/assets/{mdc-B440WyEa.js → mdc-C37zTB-h.js} +1 -1
- package/dist/client/assets/mirc-Ied37SW6.js +1 -0
- package/dist/client/assets/mllike-BTv2yt7Y.js +1 -0
- package/dist/client/assets/modelica-C4fphIHQ.js +1 -0
- package/dist/client/assets/mscgen-DW04m5e1.js +1 -0
- package/dist/client/assets/mumps-DTK8qu7D.js +1 -0
- package/dist/client/assets/{nextflow-DXxhyYjQ.js → nextflow-Cvs2ct76.js} +1 -1
- package/dist/client/assets/{nginx-Dk_bQ4Yj.js → nginx-stXqTRKc.js} +1 -1
- package/dist/client/assets/nginx-wuRafYuI.js +1 -0
- package/dist/client/assets/{nim-cPgQ4L-0.js → nim-CsJb3G7e.js} +1 -1
- package/dist/client/assets/nsis-BNo9jlCs.js +1 -0
- package/dist/client/assets/ntriples-CBC5Dh0s.js +1 -0
- package/dist/client/assets/octave-RJ0OJdYv.js +1 -0
- package/dist/client/assets/oz-C9wGyect.js +1 -0
- package/dist/client/assets/pascal-Ca57mNkb.js +1 -0
- package/dist/client/assets/{perl-CWFn5ond.js → perl-BWxc1iun.js} +1 -1
- package/dist/client/assets/perl-XipeIRz5.js +1 -0
- package/dist/client/assets/{php-CvNBGtIg.js → php-BdbNi3xs.js} +1 -1
- package/dist/client/assets/pig-57iTwSTb.js +1 -0
- package/dist/client/assets/powershell-Cl6BbjWW.js +1 -0
- package/dist/client/assets/properties-CUpF3p4b.js +1 -0
- package/dist/client/assets/protobuf-CSLtyyfN.js +1 -0
- package/dist/client/assets/{pug-F6vKbSyn.js → pug-8_aAnw9p.js} +1 -1
- package/dist/client/assets/pug-tUC5j5Z0.js +1 -0
- package/dist/client/assets/puppet-DSnog0v-.js +1 -0
- package/dist/client/assets/python-D0Kjo4_X.js +1 -0
- package/dist/client/assets/q-BzbOiVmg.js +1 -0
- package/dist/client/assets/{qml-DyOHEVPF.js → qml-B3ULUO-7.js} +1 -1
- package/dist/client/assets/{r-BZFfAnXR.js → r-CSrYo7D3.js} +1 -1
- package/dist/client/assets/r-dtKbSlFc.js +1 -0
- package/dist/client/assets/{razor-Cm_pxXFv.js → razor-C-E8kaVh.js} +1 -1
- package/dist/client/assets/{regexp-BRKWuKox.js → regexp-wINyl5st.js} +1 -1
- package/dist/client/assets/rpm-CyMjyX0l.js +1 -0
- package/dist/client/assets/{rst-BWcH6sbJ.js → rst-Dti6b94r.js} +1 -1
- package/dist/client/assets/{ruby-z5snpDGg.js → ruby-Bvljl0-N.js} +1 -1
- package/dist/client/assets/ruby-UpDQg5ds.js +1 -0
- package/dist/client/assets/sas-CaP3Rr5W.js +1 -0
- package/dist/client/assets/{sas-4jFEUh-p.js → sas-N3Cp8Utt.js} +1 -1
- package/dist/client/assets/scheme-CvqPEyph.js +1 -0
- package/dist/client/assets/{scss-BcID7jTl.js → scss-C7I5A9ky.js} +1 -1
- package/dist/client/assets/{shaderlab-C5utLNvK.js → shaderlab-Don9AZBL.js} +1 -1
- package/dist/client/assets/shell-BoHxI50V.js +1 -0
- package/dist/client/assets/{shellscript-Bg8L6Od0.js → shellscript-BMf0mGDu.js} +1 -1
- package/dist/client/assets/{shellsession-CmQ9QPst.js → shellsession-DyP83RaE.js} +1 -1
- package/dist/client/assets/sieve-BgCheMmy.js +1 -0
- package/dist/client/assets/simple-mode-DfidwQJh.js +1 -0
- package/dist/client/assets/smalltalk-t7otg6ln.js +1 -0
- package/dist/client/assets/solr-BX0e8Kv9.js +1 -0
- package/dist/client/assets/{soy-BpFIyqxX.js → soy-7Mh3vuoD.js} +1 -1
- package/dist/client/assets/sparql-82OTHp9C.js +1 -0
- package/dist/client/assets/{sparql-nVt1Q8sD.js → sparql-BL6CgR-R.js} +1 -1
- package/dist/client/assets/spreadsheet-Cax4jzUy.js +1 -0
- package/dist/client/assets/sql-B-GCIxdb.js +1 -0
- package/dist/client/assets/{sql-0exFQL7-.js → sql-CBNknhge.js} +1 -1
- package/dist/client/assets/{stata-DvY92nam.js → stata-gSfr4MpA.js} +1 -1
- package/dist/client/assets/stex-4iL5nWyp.js +1 -0
- package/dist/client/assets/stylus-DTeSICO9.js +1 -0
- package/dist/client/assets/{surrealql-Cw-Jgrl5.js → surrealql-BLaWeDsw.js} +1 -1
- package/dist/client/assets/{svelte-BneErU22.js → svelte-DbdbTnjR.js} +1 -1
- package/dist/client/assets/swift-BG4IS1ba.js +1 -0
- package/dist/client/assets/tcl-Dv8h2fZf.js +1 -0
- package/dist/client/assets/{templ-Dnkqy_8n.js → templ-B3Gv7rrn.js} +1 -1
- package/dist/client/assets/{tex-BxdAJFqf.js → tex-Cr9iATVB.js} +1 -1
- package/dist/client/assets/textile-CivEdSk-.js +1 -0
- package/dist/client/assets/tiddlywiki-q6qX3kCQ.js +1 -0
- package/dist/client/assets/tiki-C5MPAC7Z.js +1 -0
- package/dist/client/assets/toml-4Y1WOP_Q.js +1 -0
- package/dist/client/assets/troff-cGxjhI7S.js +1 -0
- package/dist/client/assets/{ts-tags-oAz_19BM.js → ts-tags-BXP2IdpZ.js} +1 -1
- package/dist/client/assets/{tsx-BeHgXqoc.js → tsx-CjSRRT1y.js} +1 -1
- package/dist/client/assets/ttcn-cfg-1D-6UX0A.js +1 -0
- package/dist/client/assets/ttcn-p6dROhnp.js +1 -0
- package/dist/client/assets/turtle-CTAvtFCG.js +1 -0
- package/dist/client/assets/{twig-BcjKasxp.js → twig-BOSfeIcS.js} +1 -1
- package/dist/client/assets/{typescript-CCiyYFTo.js → typescript-B0IbyyXR.js} +1 -1
- package/dist/client/assets/vb-ClSsLMsa.js +1 -0
- package/dist/client/assets/vbscript-ekGC3C_A.js +1 -0
- package/dist/client/assets/velocity-n3KN2p0e.js +1 -0
- package/dist/client/assets/verilog-CK7xX9OB.js +1 -0
- package/dist/client/assets/vhdl-D-avMEiw.js +1 -0
- package/dist/client/assets/{vue-DVWxXyVo.js → vue-I0cA8DRe.js} +1 -1
- package/dist/client/assets/{vue-html-DbSydaRs.js → vue-html-CQZ8e6ga.js} +1 -1
- package/dist/client/assets/{vue-vine-CZjkcCsd.js → vue-vine-SbGWY_cx.js} +1 -1
- package/dist/client/assets/webidl-CvRo18Et.js +1 -0
- package/dist/client/assets/{xml-CFx3Qtzw.js → xml-YOHFVmNI.js} +1 -1
- package/dist/client/assets/xquery-DZdYf9U3.js +1 -0
- package/dist/client/assets/{xsl-D0kNsWrm.js → xsl-CUy0cPIN.js} +1 -1
- package/dist/client/assets/yacas-CzRJxclb.js +1 -0
- package/dist/client/assets/{yaml-afCjX0q1.js → yaml-lJdieEA8.js} +1 -1
- package/dist/client/assets/z80-CbgddEXB.js +1 -0
- package/dist/client/index.html +4 -2
- package/dist/client/sw.js +1 -1
- package/dist/server/analytics/engine.js +241 -241
- package/dist/server/assets.js +4 -4
- package/dist/server/auth/passphrase.js +13 -13
- package/dist/server/config.js +7 -7
- package/dist/server/daemon.js +93 -93
- package/dist/server/features/brainstorm.js +42 -42
- package/dist/server/features/ralph-loop.js +33 -33
- package/dist/server/features/scheduler.js +53 -53
- package/dist/server/features/specs.js +54 -54
- package/dist/server/features/sticky-notes.js +17 -17
- package/dist/server/features/superpowers.js +24 -24
- package/dist/server/handlers/analytics.js +1 -1
- package/dist/server/handlers/attachment.js +32 -32
- package/dist/server/handlers/bookmarks.js +4 -4
- package/dist/server/handlers/brainstorm.js +4 -4
- package/dist/server/handlers/chat.js +54 -54
- package/dist/server/handlers/editor.js +13 -13
- package/dist/server/handlers/fs.js +51 -51
- package/dist/server/handlers/hooks.js +20 -20
- package/dist/server/handlers/loop.js +6 -6
- package/dist/server/handlers/memory.js +44 -44
- package/dist/server/handlers/mesh.js +60 -60
- package/dist/server/handlers/notes.js +7 -7
- package/dist/server/handlers/plugins.js +174 -174
- package/dist/server/handlers/project-settings.js +26 -26
- package/dist/server/handlers/scheduler.js +6 -6
- package/dist/server/handlers/session.js +24 -24
- package/dist/server/handlers/settings.js +21 -21
- package/dist/server/handlers/skills.js +91 -91
- package/dist/server/handlers/specs.js +51 -28
- package/dist/server/handlers/terminal.js +13 -13
- package/dist/server/handlers/themes.js +21 -21
- package/dist/server/handlers/update.js +17 -17
- package/dist/server/identity.js +6 -6
- package/dist/server/index.js +111 -111
- package/dist/server/logger.js +1 -1
- package/dist/server/mesh/connector.js +78 -78
- package/dist/server/mesh/crypto.js +20 -20
- package/dist/server/mesh/discovery.js +14 -14
- package/dist/server/mesh/pairing.js +30 -30
- package/dist/server/mesh/peers.js +10 -10
- package/dist/server/mesh/proxy.js +14 -14
- package/dist/server/mesh/session-sync.js +23 -23
- package/dist/server/project/bookmarks.js +11 -11
- package/dist/server/project/context-breakdown.js +70 -70
- package/dist/server/project/file-browser.js +17 -17
- package/dist/server/project/project-files.js +68 -68
- package/dist/server/project/registry.js +10 -10
- package/dist/server/project/sdk-bridge.js +157 -157
- package/dist/server/project/session.js +201 -199
- package/dist/server/project/terminal.js +15 -15
- package/dist/server/project/warmup.js +38 -37
- package/dist/server/push.js +11 -11
- package/dist/server/runtime.js +1 -1
- package/dist/server/tls.js +15 -15
- package/dist/server/tui.js +15 -15
- package/dist/server/update-checker.js +21 -21
- package/dist/server/ws/broadcast.js +18 -18
- package/dist/server/ws/router.js +17 -17
- package/dist/shared/constants.js +8 -8
- package/package.json +7 -7
- package/dist/client/assets/index-Be0f1i2O.js +0 -659
- package/dist/client/assets/index-DlfI20Gn.css +0 -2
- /package/dist/client/assets/{abap-DOv5zRgd.js → abap-Cmj0Nk-Z.js} +0 -0
- /package/dist/client/assets/{actionscript-3-D_b0n2Ff.js → actionscript-3-BmgSZ1d1.js} +0 -0
- /package/dist/client/assets/{ada-C6m8O36S.js → ada-Ckd7rwvB.js} +0 -0
- /package/dist/client/assets/{andromeeda-LdzAHaKR.js → andromeeda-B6e4eNz0.js} +0 -0
- /package/dist/client/assets/{apache-CE7PmWoU.js → apache-Bvd3DK8C.js} +0 -0
- /package/dist/client/assets/{apex-DOfNfL0V.js → apex-BXVnN85f.js} +0 -0
- /package/dist/client/assets/{applescript-D4zGaScB.js → applescript-D5_ugV3G.js} +0 -0
- /package/dist/client/assets/{ara-DMoCP0pJ.js → ara-DAwwS7gl.js} +0 -0
- /package/dist/client/assets/{asciidoc-BkmPq932.js → asciidoc-CVdUBRc9.js} +0 -0
- /package/dist/client/assets/{asm-ClIKbvsu.js → asm-BqH8pPU3.js} +0 -0
- /package/dist/client/assets/{aurora-x-DTcNXZIS.js → aurora-x-pFdyTYcw.js} +0 -0
- /package/dist/client/assets/{awk-D1ZOsISX.js → awk-CEJ-HMbA.js} +0 -0
- /package/dist/client/assets/{ayu-dark-DpNcORnA.js → ayu-dark-DLXpThOR.js} +0 -0
- /package/dist/client/assets/{ayu-light-lHqf0ddo.js → ayu-light-B6l2JP-2.js} +0 -0
- /package/dist/client/assets/{ayu-mirage-Dji5RWiH.js → ayu-mirage-vFtAVFo8.js} +0 -0
- /package/dist/client/assets/{ballerina-H14_EqPr.js → ballerina-DEnG7B70.js} +0 -0
- /package/dist/client/assets/{bat-cyb3gF8B.js → bat-6aBJEOBU.js} +0 -0
- /package/dist/client/assets/{beancount-D84pBacF.js → beancount-Cr6BBraX.js} +0 -0
- /package/dist/client/assets/{berry-B29XeKK4.js → berry-C3dEYuh4.js} +0 -0
- /package/dist/client/assets/{bibtex-Hs7VvQaV.js → bibtex-C3fW7OVS.js} +0 -0
- /package/dist/client/assets/{bicep-CugTE5CQ.js → bicep-CXdZJn7c.js} +0 -0
- /package/dist/client/assets/{bird2-mieRHotO.js → bird2-DlY4aIej.js} +0 -0
- /package/dist/client/assets/{c3-Dx2gByXW.js → c3-DmNghKyz.js} +0 -0
- /package/dist/client/assets/{cadence-CCTSwj3w.js → cadence-CaHDavSY.js} +0 -0
- /package/dist/client/assets/{catppuccin-frappe-DQrU04q0.js → catppuccin-frappe-BCo5msEa.js} +0 -0
- /package/dist/client/assets/{catppuccin-latte-B_oiWZka.js → catppuccin-latte-CY8pJj9v.js} +0 -0
- /package/dist/client/assets/{catppuccin-macchiato-D8VB2qi4.js → catppuccin-macchiato-DWctQKOC.js} +0 -0
- /package/dist/client/assets/{catppuccin-mocha-5vkMJ1Mb.js → catppuccin-mocha-DpMRQFx4.js} +0 -0
- /package/dist/client/assets/{clarity-BbUNTPrg.js → clarity-cevzIuVI.js} +0 -0
- /package/dist/client/assets/{clojure-Bcw7lCta.js → clojure-G-6D-9ty.js} +0 -0
- /package/dist/client/assets/{cmake-DM0FE-T9.js → cmake-PULhkjs2.js} +0 -0
- /package/dist/client/assets/{codeowners-CBvEPOlS.js → codeowners-DzyHyLov.js} +0 -0
- /package/dist/client/assets/{codeql-CjS8Tp16.js → codeql-Cr3zMCSL.js} +0 -0
- /package/dist/client/assets/{common-lisp-BCx4dVK8.js → common-lisp-CTGb9Qda.js} +0 -0
- /package/dist/client/assets/{coq-Ddo7YIsR.js → coq-PtKNcji9.js} +0 -0
- /package/dist/client/assets/{csharp-Kzd7Ey2d.js → csharp-BzDNV1H8.js} +0 -0
- /package/dist/client/assets/{csv-DGwgERVJ.js → csv-sU8ECZ_Q.js} +0 -0
- /package/dist/client/assets/{cue-CMabdDG0.js → cue-BH1Sd4Rr.js} +0 -0
- /package/dist/client/assets/{cypher-CJUzJAhQ.js → cypher-B_iIZEtn.js} +0 -0
- /package/dist/client/assets/{d-BvLF4qGs.js → d-DZTmqtV9.js} +0 -0
- /package/dist/client/assets/{dark-plus-BMwvn5lx.js → dark-plus-Bo9qvWQL.js} +0 -0
- /package/dist/client/assets/{dart-DxXbDeKR.js → dart-CEnxLQnE.js} +0 -0
- /package/dist/client/assets/{dax-BvrCypuS.js → dax-CY3Yz5Am.js} +0 -0
- /package/dist/client/assets/{desktop-BEul_kAS.js → desktop-DEBmLZ-w.js} +0 -0
- /package/dist/client/assets/{diff-B7rhrwA5.js → diff-D4QDVkWF.js} +0 -0
- /package/dist/client/assets/{docker-9Zbx0dQX.js → docker-FkS9pOoC.js} +0 -0
- /package/dist/client/assets/{dotenv-C0epktMv.js → dotenv-DZoFwkHG.js} +0 -0
- /package/dist/client/assets/{dracula-CBD4ckb0.js → dracula-BO1nFC1t.js} +0 -0
- /package/dist/client/assets/{dracula-soft-CuGBZj_h.js → dracula-soft-BXEd2c9N.js} +0 -0
- /package/dist/client/assets/{dream-maker-D6UB367x.js → dream-maker-CYwhkcWt.js} +0 -0
- /package/dist/client/assets/{emacs-lisp-DFyMFAZA.js → emacs-lisp-C5on1_C4.js} +0 -0
- /package/dist/client/assets/{everforest-dark-BhFNrp2k.js → everforest-dark-cYrV3iFr.js} +0 -0
- /package/dist/client/assets/{everforest-light-CpIbZ9aT.js → everforest-light-BFYmMmB0.js} +0 -0
- /package/dist/client/assets/{fennel-CH1ohGYX.js → fennel-DOUQ-PJT.js} +0 -0
- /package/dist/client/assets/{fish-D2X4h_sR.js → fish-tU0XEiDI.js} +0 -0
- /package/dist/client/assets/{fluent-B_In4uB6.js → fluent-CLjEAUYv.js} +0 -0
- /package/dist/client/assets/{fortran-free-form-Bw_JZ1tj.js → fortran-free-form-i1oSxlBi.js} +0 -0
- /package/dist/client/assets/{gdscript-DDro0rs8.js → gdscript-DoKmcfqT.js} +0 -0
- /package/dist/client/assets/{gdshader-DkUeC1ld.js → gdshader-DkxS1q2w.js} +0 -0
- /package/dist/client/assets/{genie-khT2hrp-.js → genie-CzjuaGtt.js} +0 -0
- /package/dist/client/assets/{gherkin-CPELKal0.js → gherkin-fpI0deuw.js} +0 -0
- /package/dist/client/assets/{github-dark-DQp1Qkx5.js → github-dark-BLAZcc9K.js} +0 -0
- /package/dist/client/assets/{github-dark-default-BroO-mT3.js → github-dark-default-BKx-M5rS.js} +0 -0
- /package/dist/client/assets/{github-dark-dimmed-D8UZ8uTL.js → github-dark-dimmed-CpLgrGYo.js} +0 -0
- /package/dist/client/assets/{github-dark-high-contrast-CM0RRMCj.js → github-dark-high-contrast-VOQjCWmV.js} +0 -0
- /package/dist/client/assets/{github-light-BRTmX4Ht.js → github-light-BvHvw558.js} +0 -0
- /package/dist/client/assets/{github-light-default-dl7biQ4g.js → github-light-default-Br2CRkp2.js} +0 -0
- /package/dist/client/assets/{github-light-high-contrast-Cvzq8ZXJ.js → github-light-high-contrast-BFsOyo_C.js} +0 -0
- /package/dist/client/assets/{gleam-7UVjplRF.js → gleam-D6yLlB_s.js} +0 -0
- /package/dist/client/assets/{gn-EcrZPIZo.js → gn-CIEAcT5u.js} +0 -0
- /package/dist/client/assets/{gnuplot-CcsFlqcz.js → gnuplot-D3apx92u.js} +0 -0
- /package/dist/client/assets/{go-TqNfhUhh.js → go-CVvducQG.js} +0 -0
- /package/dist/client/assets/{groovy-bfrzFpSZ.js → groovy-0BMfeOwI.js} +0 -0
- /package/dist/client/assets/{gruvbox-dark-hard-CBFL_VqK.js → gruvbox-dark-hard-CYlE_Ioi.js} +0 -0
- /package/dist/client/assets/{gruvbox-dark-medium-Dn18r-Yz.js → gruvbox-dark-medium-CPnNv_qA.js} +0 -0
- /package/dist/client/assets/{gruvbox-dark-soft-DUyKWd02.js → gruvbox-dark-soft-D9ImK6Ww.js} +0 -0
- /package/dist/client/assets/{gruvbox-light-hard-DV9RwKs4.js → gruvbox-light-hard-CNKFbaWf.js} +0 -0
- /package/dist/client/assets/{gruvbox-light-medium-Ba-VIg48.js → gruvbox-light-medium-B6aRnAAu.js} +0 -0
- /package/dist/client/assets/{gruvbox-light-soft-CVIZMKFx.js → gruvbox-light-soft-CY5W_9bh.js} +0 -0
- /package/dist/client/assets/{haskell-DzEtL6Zk.js → haskell-CIXAQuBT.js} +0 -0
- /package/dist/client/assets/{haxe-wLDEcRoz.js → haxe-BbPW0PV8.js} +0 -0
- /package/dist/client/assets/{hcl-C1fs3gTM.js → hcl-BAhXnxEb.js} +0 -0
- /package/dist/client/assets/{hjson-B4b85MZo.js → hjson-w0zQjT1b.js} +0 -0
- /package/dist/client/assets/{hlsl-JhqkHhML.js → hlsl-BZIeCd1U.js} +0 -0
- /package/dist/client/assets/{horizon-bright-CPVackS9.js → horizon-bright-CoLIUhK-.js} +0 -0
- /package/dist/client/assets/{horizon-DMOEeSnA.js → horizon-u0mrDa4H.js} +0 -0
- /package/dist/client/assets/{houston-DSlR9wH9.js → houston-Dg_Sw3IO.js} +0 -0
- /package/dist/client/assets/{hy-uAHU8420.js → hy-yfQTgdnC.js} +0 -0
- /package/dist/client/assets/{imba-CPCwfD-G.js → imba-CH3r71m8.js} +0 -0
- /package/dist/client/assets/{ini-2Ew1Qzj6.js → ini-CFGjiumx.js} +0 -0
- /package/dist/client/assets/{json5-Dl8gAgq4.js → json5-Bl9TLCA_.js} +0 -0
- /package/dist/client/assets/{jsonc-C9b23pMf.js → jsonc-C5MYZbZA.js} +0 -0
- /package/dist/client/assets/{jsonl-DkF3QjsY.js → jsonl-BUZGz6Nz.js} +0 -0
- /package/dist/client/assets/{jsonnet-DH4UkOBo.js → jsonnet-BR0nqn6X.js} +0 -0
- /package/dist/client/assets/{jssm-CBV9_O8o.js → jssm-CBTdduNQ.js} +0 -0
- /package/dist/client/assets/{kanagawa-dragon-DLDXA4f2.js → kanagawa-dragon-D37ccMj8.js} +0 -0
- /package/dist/client/assets/{kanagawa-lotus-qAvw6eOU.js → kanagawa-lotus-CQwQI5XJ.js} +0 -0
- /package/dist/client/assets/{kanagawa-wave-DFO_g5Mb.js → kanagawa-wave-CoEPa5VN.js} +0 -0
- /package/dist/client/assets/{kdl-BQl-X5Uf.js → kdl-Zssqs7XG.js} +0 -0
- /package/dist/client/assets/{kotlin-d6oenWPH.js → kotlin-Dq2AM2zV.js} +0 -0
- /package/dist/client/assets/{kusto-Cpu9Tdho.js → kusto-Bf6C0JAP.js} +0 -0
- /package/dist/client/assets/{laserwave-Bbquw0Nf.js → laserwave-Dungh0s5.js} +0 -0
- /package/dist/client/assets/{lean-CvyEisyW.js → lean-ClY6v3AE.js} +0 -0
- /package/dist/client/assets/{less-B9RQiV1N.js → less-CvM4wSPb.js} +0 -0
- /package/dist/client/assets/{light-plus-Ch1Usv7R.js → light-plus-BR_n1CxC.js} +0 -0
- /package/dist/client/assets/{llvm-DtrwjsAs.js → llvm-DzxLhkKH.js} +0 -0
- /package/dist/client/assets/{log-JKbKuM4J.js → log-BDAJFf74.js} +0 -0
- /package/dist/client/assets/{logo-BsxZM_eb.js → logo-BlUmufty.js} +0 -0
- /package/dist/client/assets/{luau-D9oeBRnv.js → luau-DZ2-jnXM.js} +0 -0
- /package/dist/client/assets/{make-DLuqI3Sa.js → make-Dfox3qgR.js} +0 -0
- /package/dist/client/assets/{markdown-hfQzyr6v.js → markdown-DQTxlAgS.js} +0 -0
- /package/dist/client/assets/{material-theme-kX26WiJU.js → material-theme-Ca-eMEoE.js} +0 -0
- /package/dist/client/assets/{material-theme-darker-yvetTWEr.js → material-theme-darker-tDRSeAjj.js} +0 -0
- /package/dist/client/assets/{material-theme-lighter-L4j3qddN.js → material-theme-lighter-C0MRc9II.js} +0 -0
- /package/dist/client/assets/{material-theme-ocean-BnNk1wNQ.js → material-theme-ocean-CPMt5a9Z.js} +0 -0
- /package/dist/client/assets/{material-theme-palenight-W0qbGyud.js → material-theme-palenight-BopXlqoA.js} +0 -0
- /package/dist/client/assets/{matlab-Cz4xBfaA.js → matlab-B0EYivAm.js} +0 -0
- /package/dist/client/assets/{mdx-Crds6sJw.js → mdx-zyuvufgY.js} +0 -0
- /package/dist/client/assets/{mermaid-Bk1sayFm.js → mermaid-CXPg53i3.js} +0 -0
- /package/dist/client/assets/{min-dark-DK6uq44k.js → min-dark-Dc7JF_0M.js} +0 -0
- /package/dist/client/assets/{min-light-lr1QiEOE.js → min-light-DK0JIAk_.js} +0 -0
- /package/dist/client/assets/{mipsasm-D3Vr1VJI.js → mipsasm-BKic4Q6r.js} +0 -0
- /package/dist/client/assets/{mojo-D3ai4ATt.js → mojo-D2QSC8Up.js} +0 -0
- /package/dist/client/assets/{monokai-DZSWSdmN.js → monokai-DAduqgyw.js} +0 -0
- /package/dist/client/assets/{moonbit-c7XV1V8w.js → moonbit-Bg8t2qV7.js} +0 -0
- /package/dist/client/assets/{move--lg8RSZu.js → move-D2XYF2cL.js} +0 -0
- /package/dist/client/assets/{narrat-Bn_PlXDl.js → narrat-Dc-7zgpc.js} +0 -0
- /package/dist/client/assets/{nextflow-groovy-CUrXbMOF.js → nextflow-groovy-DM-q1yDV.js} +0 -0
- /package/dist/client/assets/{night-owl-DnKT96OJ.js → night-owl-DLGGnVs3.js} +0 -0
- /package/dist/client/assets/{night-owl-light-gVSh6ltn.js → night-owl-light-RFt0bXLV.js} +0 -0
- /package/dist/client/assets/{nix-DE1Q2B1F.js → nix-Y_mzbhtn.js} +0 -0
- /package/dist/client/assets/{nord-CbYaE7ZY.js → nord-C3wm8E4I.js} +0 -0
- /package/dist/client/assets/{nushell-BBFYNdNE.js → nushell-DybY7eY7.js} +0 -0
- /package/dist/client/assets/{objective-c-mc6rHp-y.js → objective-c-Xv41DRqF.js} +0 -0
- /package/dist/client/assets/{objective-cpp-D96wcRis.js → objective-cpp-CpCjh4iG.js} +0 -0
- /package/dist/client/assets/{ocaml-Ddt3E4VO.js → ocaml-BkH0TtHI.js} +0 -0
- /package/dist/client/assets/{odin-BUZTfc03.js → odin-ByoEVs_h.js} +0 -0
- /package/dist/client/assets/{one-dark-pro-CLMO01es.js → one-dark-pro-B6FJ0zvF.js} +0 -0
- /package/dist/client/assets/{one-light-27sfjFDM.js → one-light-BGXnR4Yd.js} +0 -0
- /package/dist/client/assets/{openscad-C-XxCD_t.js → openscad-Cuk7R1cf.js} +0 -0
- /package/dist/client/assets/{pascal-BvJwb9Ca.js → pascal-ClnFuuSu.js} +0 -0
- /package/dist/client/assets/{pkl-DtSDxyR8.js → pkl-B9cmWSnc.js} +0 -0
- /package/dist/client/assets/{plastic-Dd1-4HJb.js → plastic-BRO-85T7.js} +0 -0
- /package/dist/client/assets/{plsql-CgEVu7mV.js → plsql-Cq55IOpg.js} +0 -0
- /package/dist/client/assets/{po-BNFx8QMG.js → po-5X8BthBl.js} +0 -0
- /package/dist/client/assets/{poimandres-DdZFFINT.js → poimandres-DCo9RR46.js} +0 -0
- /package/dist/client/assets/{polar-DcGwqI2v.js → polar-CWZaZyg5.js} +0 -0
- /package/dist/client/assets/{postcss-BgFCg0uM.js → postcss-Bef1Uhrq.js} +0 -0
- /package/dist/client/assets/{powerquery-BNMZnWRc.js → powerquery-D9pPkT1t.js} +0 -0
- /package/dist/client/assets/{powershell-CeNh_gMu.js → powershell-B3XNafuX.js} +0 -0
- /package/dist/client/assets/{prisma-C4wKi9Xs.js → prisma-5gZW7ocs.js} +0 -0
- /package/dist/client/assets/{prolog-DcNkIfZZ.js → prolog-D7gIbUtl.js} +0 -0
- /package/dist/client/assets/{proto-BqsNb_Ru.js → proto-DVj7EW9q.js} +0 -0
- /package/dist/client/assets/{puppet-BLvi8DVC.js → puppet-BQIch9Wt.js} +0 -0
- /package/dist/client/assets/{purescript-B_tjgp5s.js → purescript-Chi-qOnj.js} +0 -0
- /package/dist/client/assets/{python-xLLWlBd0.js → python-5JpI6kgG.js} +0 -0
- /package/dist/client/assets/{qmldir-CDe6ORFD.js → qmldir-DV5mjtmi.js} +0 -0
- /package/dist/client/assets/{qss-CvW7b9vz.js → qss-B1TrC4-y.js} +0 -0
- /package/dist/client/assets/{racket-CA2oKVL1.js → racket-j2Qs80i3.js} +0 -0
- /package/dist/client/assets/{raku-D9dEetfn.js → raku-DThySOcs.js} +0 -0
- /package/dist/client/assets/{red-Cj1vpJ_n.js → red-Ih7tMgXP.js} +0 -0
- /package/dist/client/assets/{reg-CHsE82Pk.js → reg-CeWg2nAt.js} +0 -0
- /package/dist/client/assets/{rel-SUS6CYTF.js → rel-0yDiB4cH.js} +0 -0
- /package/dist/client/assets/{riscv-xyAKa3qa.js → riscv-DGASrDZv.js} +0 -0
- /package/dist/client/assets/{ron-D5BrJbC5.js → ron-PTfTVUsf.js} +0 -0
- /package/dist/client/assets/{rose-pine-Dd0RAvir.js → rose-pine-CBcSv8_z.js} +0 -0
- /package/dist/client/assets/{rose-pine-dawn-CeS_2jlO.js → rose-pine-dawn-DsFTrjAP.js} +0 -0
- /package/dist/client/assets/{rose-pine-moon-CQrvtQEF.js → rose-pine-moon-DSRrHXqB.js} +0 -0
- /package/dist/client/assets/{rosmsg-Bie95NPX.js → rosmsg-BZRVDGoy.js} +0 -0
- /package/dist/client/assets/{rust-CAON_J-7.js → rust-IilUxR0Y.js} +0 -0
- /package/dist/client/assets/{sass-CKkv3rB4.js → sass-BWTyD0km.js} +0 -0
- /package/dist/client/assets/{scala-BADlfUbE.js → scala-DBszRdoo.js} +0 -0
- /package/dist/client/assets/{scheme-Bv8vdcS_.js → scheme-CtV0KGCW.js} +0 -0
- /package/dist/client/assets/{sdbl-TUdAkzzL.js → sdbl-NrV9zyWH.js} +0 -0
- /package/dist/client/assets/{slack-dark-BeQrlvP4.js → slack-dark-DJYHgMC5.js} +0 -0
- /package/dist/client/assets/{slack-ochin-DaA1aBiy.js → slack-ochin-DMZh8xHM.js} +0 -0
- /package/dist/client/assets/{smalltalk-C1k1DVft.js → smalltalk-BF00pyFX.js} +0 -0
- /package/dist/client/assets/{snazzy-light-C9Bzvwcg.js → snazzy-light-CWz9pGNQ.js} +0 -0
- /package/dist/client/assets/{solarized-dark--ZJpQY8O.js → solarized-dark-D9XpTy8q.js} +0 -0
- /package/dist/client/assets/{solarized-light-wzNWfjF2.js → solarized-light-CbOIwuI-.js} +0 -0
- /package/dist/client/assets/{solidity-CaEDdWYR.js → solidity-CbwhXqqI.js} +0 -0
- /package/dist/client/assets/{splunk-mpBjmHRA.js → splunk-BifnD-Y9.js} +0 -0
- /package/dist/client/assets/{ssh-config-DqmSAS3N.js → ssh-config-CALIsjYt.js} +0 -0
- /package/dist/client/assets/{stylus-mNYBrtqL.js → stylus-CW9hRw3O.js} +0 -0
- /package/dist/client/assets/{swift-BXoR6L-y.js → swift-XnvjWWWQ.js} +0 -0
- /package/dist/client/assets/{synthwave-84-ybvkLGau.js → synthwave-84-BnPKtV8a.js} +0 -0
- /package/dist/client/assets/{system-verilog-BnyrpGlO.js → system-verilog-sXcvSAdV.js} +0 -0
- /package/dist/client/assets/{systemd-BBVr_qxh.js → systemd-gIHkqv2y.js} +0 -0
- /package/dist/client/assets/{talonscript-l0qUQn2r.js → talonscript-u0b1kqtW.js} +0 -0
- /package/dist/client/assets/{tasl-BzcMwPTS.js → tasl-4NbQVfsv.js} +0 -0
- /package/dist/client/assets/{tcl-CQgtyMkG.js → tcl-CohiqM0A.js} +0 -0
- /package/dist/client/assets/{terraform-BgPqtSWN.js → terraform-C2SCpFsh.js} +0 -0
- /package/dist/client/assets/{tokyo-night-BZt2NwCl.js → tokyo-night-ByryBNMy.js} +0 -0
- /package/dist/client/assets/{toml-CpHBCfVl.js → toml-DIwLv6ba.js} +0 -0
- /package/dist/client/assets/{tsv-DYxH1-vL.js → tsv-Wq0jy8zc.js} +0 -0
- /package/dist/client/assets/{turtle-DdFFvP5J.js → turtle-DtUXQD5N.js} +0 -0
- /package/dist/client/assets/{typespec-CHOxKRtr.js → typespec-CMzaYGNR.js} +0 -0
- /package/dist/client/assets/{typst-C0VS9TQm.js → typst-BXss02ax.js} +0 -0
- /package/dist/client/assets/{v-CfOPGXPl.js → v-Dlx5aRMh.js} +0 -0
- /package/dist/client/assets/{vala-DYqHmNOK.js → vala-BPY-dxs1.js} +0 -0
- /package/dist/client/assets/{vb-DUBgqZ02.js → vb-fEZJaj_I.js} +0 -0
- /package/dist/client/assets/{verilog-BxybH_AY.js → verilog-Ch3h9a5t.js} +0 -0
- /package/dist/client/assets/{vesper-BDlBlJR-.js → vesper-RapGiuFK.js} +0 -0
- /package/dist/client/assets/{vhdl-DBoxxi7I.js → vhdl-k9JLsLxQ.js} +0 -0
- /package/dist/client/assets/{viml-C8vROCgw.js → viml-AETnYpBH.js} +0 -0
- /package/dist/client/assets/{vitesse-black-CUBzmgJa.js → vitesse-black-CK3sbzcK.js} +0 -0
- /package/dist/client/assets/{vitesse-dark-COrLBgkv.js → vitesse-dark-D1-w1Fr7.js} +0 -0
- /package/dist/client/assets/{vitesse-light-ThZGgLQK.js → vitesse-light-D7Ky4DHb.js} +0 -0
- /package/dist/client/assets/{vyper-D08CaD4o.js → vyper-BOB1dBvz.js} +0 -0
- /package/dist/client/assets/{wasm-DiIFv9DE.js → wasm-BQxIq9Eb.js} +0 -0
- /package/dist/client/assets/{wasm-CoVafRYN.js → wasm-CkSOvETR.js} +0 -0
- /package/dist/client/assets/{wenyan-GlRgAbTB.js → wenyan-klF87KTD.js} +0 -0
- /package/dist/client/assets/{wgsl-BmWpQFqb.js → wgsl-Critfvz0.js} +0 -0
- /package/dist/client/assets/{wikitext-Axug2vPC.js → wikitext-o9T06DMF.js} +0 -0
- /package/dist/client/assets/{wit-Dk1fPIaK.js → wit-13nwpGLw.js} +0 -0
- /package/dist/client/assets/{wolfram-DMhXlmnL.js → wolfram-DrTARb9i.js} +0 -0
- /package/dist/client/assets/{zenscript-x7PXwj2_.js → zenscript-npva8tX5.js} +0 -0
- /package/dist/client/assets/{zig-BlD2NI35.js → zig-shXrLLVU.js} +0 -0
|
@@ -4,13 +4,13 @@ import { broadcast } from "../ws/broadcast.js";
|
|
|
4
4
|
import { loadConfig } from "../config.js";
|
|
5
5
|
import { log } from "../logger.js";
|
|
6
6
|
import { upsertFromSnapshot, addToolEventToHistory, markSessionEnded } from "../features/session-history.js";
|
|
7
|
-
|
|
7
|
+
const sessionProjectMap = new Map();
|
|
8
8
|
function matchCwdToProject(cwd) {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
for (
|
|
12
|
-
|
|
13
|
-
|
|
9
|
+
const config = loadConfig();
|
|
10
|
+
const resolved = resolve(cwd);
|
|
11
|
+
for (let i = 0; i < config.projects.length; i++) {
|
|
12
|
+
const p = config.projects[i];
|
|
13
|
+
const projectPath = resolve(p.path);
|
|
14
14
|
if (resolved === projectPath || resolved.startsWith(projectPath + "/")) {
|
|
15
15
|
return { projectName: p.title, projectSlug: p.slug };
|
|
16
16
|
}
|
|
@@ -57,7 +57,7 @@ export function handleHookStatusline(req, res) {
|
|
|
57
57
|
cacheReadTokens,
|
|
58
58
|
cacheCreationTokens,
|
|
59
59
|
}, contextWindow);
|
|
60
|
-
|
|
60
|
+
const statusProject = sessionProjectMap.get(body.session_id) || null;
|
|
61
61
|
broadcast({
|
|
62
62
|
type: "context:statusline",
|
|
63
63
|
hookSessionId: body.session_id,
|
|
@@ -157,7 +157,7 @@ export function handleHookEvent(req, res) {
|
|
|
157
157
|
function estimateTokens(value) {
|
|
158
158
|
if (value == null)
|
|
159
159
|
return 0;
|
|
160
|
-
|
|
160
|
+
const text = typeof value === "string" ? value : JSON.stringify(value);
|
|
161
161
|
return Math.ceil(text.length / 4);
|
|
162
162
|
}
|
|
163
163
|
function summarizeInput(toolName, input) {
|
|
@@ -166,7 +166,7 @@ function summarizeInput(toolName, input) {
|
|
|
166
166
|
if (typeof input === "string")
|
|
167
167
|
return input.slice(0, 120);
|
|
168
168
|
if (typeof input === "object") {
|
|
169
|
-
|
|
169
|
+
const obj = input;
|
|
170
170
|
if (obj.command)
|
|
171
171
|
return String(obj.command).slice(0, 120);
|
|
172
172
|
if (obj.file_path)
|
|
@@ -177,32 +177,32 @@ function summarizeInput(toolName, input) {
|
|
|
177
177
|
return String(obj.query).slice(0, 120);
|
|
178
178
|
if (obj.prompt)
|
|
179
179
|
return String(obj.prompt).slice(0, 120);
|
|
180
|
-
|
|
180
|
+
const keys = Object.keys(obj);
|
|
181
181
|
if (keys.length > 0)
|
|
182
182
|
return keys.slice(0, 3).join(", ");
|
|
183
183
|
}
|
|
184
184
|
return "";
|
|
185
185
|
}
|
|
186
186
|
export function handleHookToolUse(req, res) {
|
|
187
|
-
|
|
187
|
+
const body = req.body;
|
|
188
188
|
if (!body.session_id) {
|
|
189
189
|
res.status(400).json({ status: "error", message: "missing session_id" });
|
|
190
190
|
return;
|
|
191
191
|
}
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
192
|
+
const toolName = body.tool_name || "unknown";
|
|
193
|
+
const inputSummary = summarizeInput(toolName, body.tool_input);
|
|
194
|
+
const estInput = estimateTokens(body.tool_input);
|
|
195
|
+
const estOutput = estimateTokens(body.tool_response);
|
|
196
|
+
const now = Date.now();
|
|
197
197
|
if (body.cwd && !sessionProjectMap.has(body.session_id)) {
|
|
198
|
-
|
|
198
|
+
const match = matchCwdToProject(body.cwd);
|
|
199
199
|
if (match) {
|
|
200
200
|
sessionProjectMap.set(body.session_id, match);
|
|
201
201
|
}
|
|
202
202
|
}
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
203
|
+
const sessionProject = sessionProjectMap.get(body.session_id) || null;
|
|
204
|
+
const analyzer = getOrCreateAnalyzer(body.session_id);
|
|
205
|
+
const toolId = body.session_id + "-" + now;
|
|
206
206
|
analyzer.onToolStart(toolId, toolName);
|
|
207
207
|
analyzer.onToolResult(toolId);
|
|
208
208
|
broadcast({
|
|
@@ -3,8 +3,8 @@ import { sendTo } from "../ws/broadcast.js";
|
|
|
3
3
|
import { startLoop, stopLoop, getLoopStatus } from "../features/ralph-loop.js";
|
|
4
4
|
registerHandler("loop", function (clientId, message) {
|
|
5
5
|
if (message.type === "loop:start") {
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
const startMsg = message;
|
|
7
|
+
const loop = startLoop(startMsg.projectSlug);
|
|
8
8
|
if (!loop) {
|
|
9
9
|
sendTo(clientId, { type: "chat:error", message: "No PROMPT.md found in .claude/loops/ for this project" });
|
|
10
10
|
return;
|
|
@@ -13,16 +13,16 @@ registerHandler("loop", function (clientId, message) {
|
|
|
13
13
|
return;
|
|
14
14
|
}
|
|
15
15
|
if (message.type === "loop:stop") {
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
const stopMsg = message;
|
|
17
|
+
const stopped = stopLoop(stopMsg.loopId);
|
|
18
18
|
if (!stopped) {
|
|
19
19
|
sendTo(clientId, { type: "chat:error", message: "Loop not found or not running" });
|
|
20
20
|
}
|
|
21
21
|
return;
|
|
22
22
|
}
|
|
23
23
|
if (message.type === "loop:status") {
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
const statusMsg = message;
|
|
25
|
+
const status = getLoopStatus(statusMsg.loopId);
|
|
26
26
|
if (!status) {
|
|
27
27
|
sendTo(clientId, { type: "chat:error", message: "Loop not found" });
|
|
28
28
|
return;
|
|
@@ -9,31 +9,31 @@ function getMemoryDir(projectSlug) {
|
|
|
9
9
|
if (projectSlug === "__global__") {
|
|
10
10
|
return join(homedir(), ".claude", "memory");
|
|
11
11
|
}
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
const config = loadConfig();
|
|
13
|
+
const project = config.projects.find(function (p) { return p.slug === projectSlug; });
|
|
14
14
|
if (!project)
|
|
15
15
|
return null;
|
|
16
|
-
|
|
16
|
+
const hash = "-" + project.path.replace(/\//g, "-").replace(/^-/, "");
|
|
17
17
|
return join(homedir(), ".claude", "projects", hash, "memory");
|
|
18
18
|
}
|
|
19
19
|
function parseFrontmatter(content) {
|
|
20
|
-
|
|
20
|
+
const match = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
|
|
21
21
|
if (!match)
|
|
22
22
|
return { name: "", description: "", type: "" };
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
for (
|
|
29
|
-
|
|
30
|
-
|
|
23
|
+
const yaml = match[1];
|
|
24
|
+
let name = "";
|
|
25
|
+
let description = "";
|
|
26
|
+
let type = "";
|
|
27
|
+
const lines = yaml.split(/\r?\n/);
|
|
28
|
+
for (let i = 0; i < lines.length; i++) {
|
|
29
|
+
const line = lines[i];
|
|
30
|
+
const nameMatch = line.match(/^name:\s*(.+)/);
|
|
31
31
|
if (nameMatch)
|
|
32
32
|
name = nameMatch[1].trim().replace(/^["']|["']$/g, "");
|
|
33
|
-
|
|
33
|
+
const descMatch = line.match(/^description:\s*(.+)/);
|
|
34
34
|
if (descMatch)
|
|
35
35
|
description = descMatch[1].trim().replace(/^["']|["']$/g, "");
|
|
36
|
-
|
|
36
|
+
const typeMatch = line.match(/^type:\s*(.+)/);
|
|
37
37
|
if (typeMatch)
|
|
38
38
|
type = typeMatch[1].trim().replace(/^["']|["']$/g, "");
|
|
39
39
|
}
|
|
@@ -42,28 +42,28 @@ function parseFrontmatter(content) {
|
|
|
42
42
|
async function regenerateIndex(memoryDir) {
|
|
43
43
|
if (!existsSync(memoryDir))
|
|
44
44
|
return;
|
|
45
|
-
|
|
45
|
+
const files = (await readdir(memoryDir)).filter(function (f) {
|
|
46
46
|
return f.endsWith(".md") && f !== "MEMORY.md";
|
|
47
47
|
});
|
|
48
|
-
|
|
49
|
-
for (
|
|
48
|
+
const grouped = {};
|
|
49
|
+
for (let i = 0; i < files.length; i++) {
|
|
50
50
|
try {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
51
|
+
const content = await readFile(join(memoryDir, files[i]), "utf-8");
|
|
52
|
+
const meta = parseFrontmatter(content);
|
|
53
|
+
const type = meta.type || "other";
|
|
54
54
|
if (!grouped[type])
|
|
55
55
|
grouped[type] = [];
|
|
56
56
|
grouped[type].push({ filename: files[i], name: meta.name || files[i], description: meta.description || "" });
|
|
57
57
|
}
|
|
58
58
|
catch { }
|
|
59
59
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
for (
|
|
60
|
+
const lines = ["# Memory Index", ""];
|
|
61
|
+
const types = Object.keys(grouped).sort();
|
|
62
|
+
for (let t = 0; t < types.length; t++) {
|
|
63
63
|
lines.push("## " + types[t].charAt(0).toUpperCase() + types[t].slice(1));
|
|
64
|
-
|
|
65
|
-
for (
|
|
66
|
-
|
|
64
|
+
const entries = grouped[types[t]];
|
|
65
|
+
for (let e = 0; e < entries.length; e++) {
|
|
66
|
+
const desc = entries[e].description ? " — " + entries[e].description : "";
|
|
67
67
|
lines.push("- [" + entries[e].filename + "](" + entries[e].filename + ")" + desc);
|
|
68
68
|
}
|
|
69
69
|
lines.push("");
|
|
@@ -71,14 +71,14 @@ async function regenerateIndex(memoryDir) {
|
|
|
71
71
|
await writeFile(join(memoryDir, "MEMORY.md"), lines.join("\n"), "utf-8");
|
|
72
72
|
}
|
|
73
73
|
async function listMemoryFiles(memDir) {
|
|
74
|
-
|
|
74
|
+
const files = (await readdir(memDir)).filter(function (f) {
|
|
75
75
|
return f.endsWith(".md") && f !== "MEMORY.md";
|
|
76
76
|
});
|
|
77
|
-
|
|
78
|
-
for (
|
|
77
|
+
const memories = [];
|
|
78
|
+
for (let i = 0; i < files.length; i++) {
|
|
79
79
|
try {
|
|
80
|
-
|
|
81
|
-
|
|
80
|
+
const content = await readFile(join(memDir, files[i]), "utf-8");
|
|
81
|
+
const meta = parseFrontmatter(content);
|
|
82
82
|
memories.push({
|
|
83
83
|
filename: files[i],
|
|
84
84
|
name: meta.name || files[i].replace(/\.md$/, ""),
|
|
@@ -93,25 +93,25 @@ async function listMemoryFiles(memDir) {
|
|
|
93
93
|
}
|
|
94
94
|
registerHandler("memory", async function (clientId, message) {
|
|
95
95
|
if (message.type === "memory:list") {
|
|
96
|
-
|
|
97
|
-
|
|
96
|
+
const listMsg = message;
|
|
97
|
+
const memDir = getMemoryDir(listMsg.projectSlug);
|
|
98
98
|
if (!memDir || !existsSync(memDir)) {
|
|
99
99
|
sendTo(clientId, { type: "memory:list_result", projectSlug: listMsg.projectSlug, memories: [] });
|
|
100
100
|
return;
|
|
101
101
|
}
|
|
102
|
-
|
|
102
|
+
const memories = await listMemoryFiles(memDir);
|
|
103
103
|
sendTo(clientId, { type: "memory:list_result", projectSlug: listMsg.projectSlug, memories: memories });
|
|
104
104
|
return;
|
|
105
105
|
}
|
|
106
106
|
if (message.type === "memory:view") {
|
|
107
|
-
|
|
108
|
-
|
|
107
|
+
const viewMsg = message;
|
|
108
|
+
const viewDir = getMemoryDir(viewMsg.projectSlug);
|
|
109
109
|
if (!viewDir) {
|
|
110
110
|
sendTo(clientId, { type: "memory:view_result", filename: viewMsg.filename, content: "Project not found." });
|
|
111
111
|
return;
|
|
112
112
|
}
|
|
113
113
|
try {
|
|
114
|
-
|
|
114
|
+
const viewContent = await readFile(join(viewDir, viewMsg.filename), "utf-8");
|
|
115
115
|
sendTo(clientId, { type: "memory:view_result", filename: viewMsg.filename, content: viewContent });
|
|
116
116
|
}
|
|
117
117
|
catch {
|
|
@@ -120,8 +120,8 @@ registerHandler("memory", async function (clientId, message) {
|
|
|
120
120
|
return;
|
|
121
121
|
}
|
|
122
122
|
if (message.type === "memory:save") {
|
|
123
|
-
|
|
124
|
-
|
|
123
|
+
const saveMsg = message;
|
|
124
|
+
const saveDir = getMemoryDir(saveMsg.projectSlug);
|
|
125
125
|
if (!saveDir) {
|
|
126
126
|
sendTo(clientId, { type: "memory:save_result", success: false, message: "Project not found." });
|
|
127
127
|
return;
|
|
@@ -131,7 +131,7 @@ registerHandler("memory", async function (clientId, message) {
|
|
|
131
131
|
await writeFile(join(saveDir, saveMsg.filename), saveMsg.content, "utf-8");
|
|
132
132
|
await regenerateIndex(saveDir);
|
|
133
133
|
sendTo(clientId, { type: "memory:save_result", success: true });
|
|
134
|
-
|
|
134
|
+
const updatedMemories = await listMemoryFiles(saveDir);
|
|
135
135
|
sendTo(clientId, { type: "memory:list_result", projectSlug: saveMsg.projectSlug, memories: updatedMemories });
|
|
136
136
|
}
|
|
137
137
|
catch (err) {
|
|
@@ -140,14 +140,14 @@ registerHandler("memory", async function (clientId, message) {
|
|
|
140
140
|
return;
|
|
141
141
|
}
|
|
142
142
|
if (message.type === "memory:delete") {
|
|
143
|
-
|
|
144
|
-
|
|
143
|
+
const delMsg = message;
|
|
144
|
+
const delDir = getMemoryDir(delMsg.projectSlug);
|
|
145
145
|
if (!delDir) {
|
|
146
146
|
sendTo(clientId, { type: "memory:delete_result", success: false, message: "Project not found." });
|
|
147
147
|
return;
|
|
148
148
|
}
|
|
149
149
|
try {
|
|
150
|
-
|
|
150
|
+
const filePath = join(delDir, delMsg.filename);
|
|
151
151
|
if (!existsSync(filePath)) {
|
|
152
152
|
sendTo(clientId, { type: "memory:delete_result", success: false, message: "Memory not found." });
|
|
153
153
|
return;
|
|
@@ -155,7 +155,7 @@ registerHandler("memory", async function (clientId, message) {
|
|
|
155
155
|
await unlink(filePath);
|
|
156
156
|
await regenerateIndex(delDir);
|
|
157
157
|
sendTo(clientId, { type: "memory:delete_result", success: true });
|
|
158
|
-
|
|
158
|
+
const remainingMemories = await listMemoryFiles(delDir);
|
|
159
159
|
sendTo(clientId, { type: "memory:list_result", projectSlug: delMsg.projectSlug, memories: remainingMemories });
|
|
160
160
|
}
|
|
161
161
|
catch (err) {
|
|
@@ -12,27 +12,27 @@ import { networkInterfaces } from "node:os";
|
|
|
12
12
|
import { existsSync, readFileSync } from "node:fs";
|
|
13
13
|
import { execSync } from "node:child_process";
|
|
14
14
|
function getLocalAddress() {
|
|
15
|
-
|
|
15
|
+
const all = getAllAddresses();
|
|
16
16
|
return all.length > 0 ? all[0].address : "localhost";
|
|
17
17
|
}
|
|
18
18
|
function getAllAddresses() {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
for (
|
|
23
|
-
|
|
19
|
+
const interfaces = networkInterfaces();
|
|
20
|
+
const keys = Object.keys(interfaces);
|
|
21
|
+
const results = [];
|
|
22
|
+
for (let i = 0; i < keys.length; i++) {
|
|
23
|
+
const addrs = interfaces[keys[i]];
|
|
24
24
|
if (!addrs)
|
|
25
25
|
continue;
|
|
26
|
-
for (
|
|
26
|
+
for (let j = 0; j < addrs.length; j++) {
|
|
27
27
|
if (!addrs[j].internal && addrs[j].family === "IPv4") {
|
|
28
28
|
results.push({ name: keys[i], address: addrs[j].address });
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
32
|
if (isWSL()) {
|
|
33
|
-
|
|
34
|
-
for (
|
|
35
|
-
|
|
33
|
+
const windowsAddrs = getWindowsHostAddresses();
|
|
34
|
+
for (let w = 0; w < windowsAddrs.length; w++) {
|
|
35
|
+
const exists = results.some(function (r) { return r.address === windowsAddrs[w].address; });
|
|
36
36
|
if (!exists) {
|
|
37
37
|
results.push(windowsAddrs[w]);
|
|
38
38
|
}
|
|
@@ -43,7 +43,7 @@ function getAllAddresses() {
|
|
|
43
43
|
function isWSL() {
|
|
44
44
|
try {
|
|
45
45
|
if (existsSync("/proc/version")) {
|
|
46
|
-
|
|
46
|
+
const version = readFileSync("/proc/version", "utf-8");
|
|
47
47
|
return version.toLowerCase().includes("microsoft");
|
|
48
48
|
}
|
|
49
49
|
}
|
|
@@ -51,14 +51,14 @@ function isWSL() {
|
|
|
51
51
|
return false;
|
|
52
52
|
}
|
|
53
53
|
function getWindowsHostAddresses() {
|
|
54
|
-
|
|
54
|
+
const results = [];
|
|
55
55
|
try {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
for (
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
56
|
+
const output = execSync("powershell.exe -NoProfile -Command \"Get-NetIPAddress -AddressFamily IPv4 | ForEach-Object { \\$_.IPAddress + '|' + \\$_.InterfaceAlias }\"", { encoding: "utf-8", timeout: 5000, stdio: ["pipe", "pipe", "pipe"] });
|
|
57
|
+
const lines = output.trim().split(/\r?\n/);
|
|
58
|
+
for (let i = 0; i < lines.length; i++) {
|
|
59
|
+
const parts = lines[i].trim().split("|");
|
|
60
|
+
const ip = parts[0];
|
|
61
|
+
const iface = parts[1] || "windows";
|
|
62
62
|
if (!ip || ip === "127.0.0.1")
|
|
63
63
|
continue;
|
|
64
64
|
if (ip.startsWith("169.254."))
|
|
@@ -72,18 +72,18 @@ function getWindowsHostAddresses() {
|
|
|
72
72
|
return results;
|
|
73
73
|
}
|
|
74
74
|
function getLocalProjectsList() {
|
|
75
|
-
|
|
75
|
+
const config = loadConfig();
|
|
76
76
|
return config.projects.map(function (p) {
|
|
77
77
|
return { slug: p.slug, title: p.title };
|
|
78
78
|
});
|
|
79
79
|
}
|
|
80
80
|
export function buildNodesMessage() {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
81
|
+
const peers = loadPeers();
|
|
82
|
+
const config = loadConfig();
|
|
83
|
+
const identity = loadOrCreateIdentity();
|
|
84
|
+
const connectedIds = new Set(getConnectedPeerIds());
|
|
85
|
+
const localAddrs = getAllAddresses().map(function (a) { return a.address + ":" + config.port; });
|
|
86
|
+
const local = {
|
|
87
87
|
id: identity.id,
|
|
88
88
|
name: config.name,
|
|
89
89
|
address: localAddrs[0] ?? "localhost:" + config.port,
|
|
@@ -95,9 +95,9 @@ export function buildNodesMessage() {
|
|
|
95
95
|
return { slug: p.slug, path: p.path, title: p.title, nodeId: identity.id };
|
|
96
96
|
}),
|
|
97
97
|
};
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
98
|
+
const remotes = peers.map(function (peer) {
|
|
99
|
+
const peerProjects = getConnectedPeerProjects(peer.id);
|
|
100
|
+
const health = getPeerHealth(peer.id);
|
|
101
101
|
return {
|
|
102
102
|
id: peer.id,
|
|
103
103
|
name: peer.name,
|
|
@@ -118,9 +118,9 @@ export function buildNodesMessage() {
|
|
|
118
118
|
registerHandler("mesh", function (clientId, message) {
|
|
119
119
|
log.meshHello("mesh message: %s from %s", message.type, clientId.slice(0, 8));
|
|
120
120
|
if (message.type === "mesh:generate_invite") {
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
121
|
+
const genMsg = message;
|
|
122
|
+
const config = loadConfig();
|
|
123
|
+
const address = genMsg.address || getLocalAddress();
|
|
124
124
|
generateInviteCode(address, config.port).then(function (result) {
|
|
125
125
|
sendTo(clientId, {
|
|
126
126
|
type: "mesh:invite_code",
|
|
@@ -133,26 +133,26 @@ registerHandler("mesh", function (clientId, message) {
|
|
|
133
133
|
return;
|
|
134
134
|
}
|
|
135
135
|
if (message.type === "mesh:addresses") {
|
|
136
|
-
|
|
136
|
+
const addresses = getAllAddresses();
|
|
137
137
|
sendTo(clientId, { type: "mesh:addresses_result", addresses: addresses });
|
|
138
138
|
return;
|
|
139
139
|
}
|
|
140
140
|
if (message.type === "mesh:pair") {
|
|
141
|
-
|
|
142
|
-
|
|
141
|
+
const pairMsg = message;
|
|
142
|
+
const parsed = parseInviteCode(pairMsg.code);
|
|
143
143
|
if (!parsed) {
|
|
144
144
|
sendTo(clientId, { type: "mesh:pair_failed", message: "Invalid invite code format" });
|
|
145
145
|
return;
|
|
146
146
|
}
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
147
|
+
const wsUrl = "ws://" + parsed.address + ":" + parsed.port + "/ws";
|
|
148
|
+
const pairWs = new WebSocket(wsUrl);
|
|
149
|
+
const pairTimeout = setTimeout(function () {
|
|
150
150
|
pairWs.close();
|
|
151
151
|
sendTo(clientId, { type: "mesh:pair_failed", message: "Connection timed out" });
|
|
152
152
|
}, 15000);
|
|
153
153
|
pairWs.addEventListener("open", function () {
|
|
154
|
-
|
|
155
|
-
|
|
154
|
+
const identity = loadOrCreateIdentity();
|
|
155
|
+
const pairConfig = loadConfig();
|
|
156
156
|
pairWs.send(JSON.stringify({
|
|
157
157
|
type: "mesh:hello",
|
|
158
158
|
nodeId: identity.id,
|
|
@@ -166,7 +166,7 @@ registerHandler("mesh", function (clientId, message) {
|
|
|
166
166
|
});
|
|
167
167
|
pairWs.addEventListener("message", function (event) {
|
|
168
168
|
try {
|
|
169
|
-
|
|
169
|
+
const data = JSON.parse(event.data);
|
|
170
170
|
if (data.type === "mesh:hello_rejected") {
|
|
171
171
|
clearTimeout(pairTimeout);
|
|
172
172
|
pairWs.close();
|
|
@@ -175,8 +175,8 @@ registerHandler("mesh", function (clientId, message) {
|
|
|
175
175
|
}
|
|
176
176
|
if (data.type === "mesh:hello" && data.nodeId && data.name) {
|
|
177
177
|
clearTimeout(pairTimeout);
|
|
178
|
-
|
|
179
|
-
|
|
178
|
+
const peerAddr = parsed.address + ":" + parsed.port;
|
|
179
|
+
const peer = {
|
|
180
180
|
id: data.nodeId,
|
|
181
181
|
name: data.name,
|
|
182
182
|
addresses: [peerAddr],
|
|
@@ -186,8 +186,8 @@ registerHandler("mesh", function (clientId, message) {
|
|
|
186
186
|
addPeer(peer);
|
|
187
187
|
pairWs.close();
|
|
188
188
|
connectToPeer(peer.id, peerAddr);
|
|
189
|
-
|
|
190
|
-
|
|
189
|
+
const remoteProjectsList = data.projects ?? [];
|
|
190
|
+
const nodeInfo = {
|
|
191
191
|
id: peer.id,
|
|
192
192
|
name: peer.name,
|
|
193
193
|
address: peerAddr,
|
|
@@ -214,8 +214,8 @@ registerHandler("mesh", function (clientId, message) {
|
|
|
214
214
|
return;
|
|
215
215
|
}
|
|
216
216
|
if (message.type === "mesh:hello") {
|
|
217
|
-
|
|
218
|
-
|
|
217
|
+
const hello = message;
|
|
218
|
+
const knownPeer = hello.nodeId ? getPeer(hello.nodeId) : undefined;
|
|
219
219
|
log.meshHello("mesh:hello from nodeId=%s name=%s known=%s", hello.nodeId?.slice(0, 8), hello.name, !!knownPeer);
|
|
220
220
|
if (knownPeer) {
|
|
221
221
|
if (knownPeer.publicKey && hello.publicKey && knownPeer.publicKey !== hello.publicKey) {
|
|
@@ -223,12 +223,12 @@ registerHandler("mesh", function (clientId, message) {
|
|
|
223
223
|
sendTo(clientId, { type: "mesh:hello_rejected", error: "Public key mismatch — possible impersonation" });
|
|
224
224
|
return;
|
|
225
225
|
}
|
|
226
|
-
|
|
226
|
+
const inboundWs = getClientWebSocket(clientId);
|
|
227
227
|
log.meshHello(" registering inbound connection for %s (ws=%s, projects=%d)", hello.name, !!inboundWs, hello.projects?.length ?? 0);
|
|
228
228
|
if (inboundWs) {
|
|
229
229
|
registerInboundPeer(hello.nodeId, inboundWs, hello.projects ?? []);
|
|
230
230
|
}
|
|
231
|
-
|
|
231
|
+
const identity = loadOrCreateIdentity();
|
|
232
232
|
sendTo(clientId, {
|
|
233
233
|
type: "mesh:hello",
|
|
234
234
|
nodeId: identity.id,
|
|
@@ -244,8 +244,8 @@ registerHandler("mesh", function (clientId, message) {
|
|
|
244
244
|
return;
|
|
245
245
|
}
|
|
246
246
|
consumePairingToken(hello.token);
|
|
247
|
-
|
|
248
|
-
|
|
247
|
+
const peerAddresses = hello.addresses ?? [];
|
|
248
|
+
const peer = {
|
|
249
249
|
id: hello.nodeId,
|
|
250
250
|
name: hello.name,
|
|
251
251
|
addresses: peerAddresses,
|
|
@@ -256,7 +256,7 @@ registerHandler("mesh", function (clientId, message) {
|
|
|
256
256
|
if (peerAddresses.length > 0) {
|
|
257
257
|
connectToPeer(peer.id, peerAddresses[0]);
|
|
258
258
|
}
|
|
259
|
-
|
|
259
|
+
const identity2 = loadOrCreateIdentity();
|
|
260
260
|
sendTo(clientId, {
|
|
261
261
|
type: "mesh:hello",
|
|
262
262
|
nodeId: identity2.id,
|
|
@@ -268,7 +268,7 @@ registerHandler("mesh", function (clientId, message) {
|
|
|
268
268
|
return;
|
|
269
269
|
}
|
|
270
270
|
if (message.type === "mesh:proxy_request") {
|
|
271
|
-
|
|
271
|
+
const proxyReq = message;
|
|
272
272
|
log.meshProxy("received proxy_request via handler from %s: %s for %s", clientId.slice(0, 8), proxyReq.payload.type, proxyReq.projectSlug);
|
|
273
273
|
registerVirtualClient("mesh-proxy:" + clientId + ":" + proxyReq.requestId, function (response) {
|
|
274
274
|
log.meshProxy(" → sending proxy_response %s back to client %s", response.type, clientId.slice(0, 8));
|
|
@@ -286,13 +286,13 @@ registerHandler("mesh", function (clientId, message) {
|
|
|
286
286
|
return;
|
|
287
287
|
}
|
|
288
288
|
if (message.type === "mesh:proxy_response") {
|
|
289
|
-
|
|
289
|
+
const proxyRes = message;
|
|
290
290
|
log.meshProxy("received proxy_response via handler: %s", proxyRes.payload.type);
|
|
291
291
|
handleProxyResponse(proxyRes);
|
|
292
292
|
return;
|
|
293
293
|
}
|
|
294
294
|
if (message.type === "mesh:reconnect") {
|
|
295
|
-
|
|
295
|
+
const reconnectMsg = message;
|
|
296
296
|
reconnectPeer(reconnectMsg.nodeId);
|
|
297
297
|
setTimeout(function () {
|
|
298
298
|
broadcast({ type: "mesh:nodes", nodes: buildNodesMessage() });
|
|
@@ -300,23 +300,23 @@ registerHandler("mesh", function (clientId, message) {
|
|
|
300
300
|
return;
|
|
301
301
|
}
|
|
302
302
|
if (message.type === "mesh:unpair") {
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
303
|
+
const unpairMsg = message;
|
|
304
|
+
const identity = loadOrCreateIdentity();
|
|
305
|
+
const peerWs = getPeerConnection(unpairMsg.nodeId);
|
|
306
306
|
if (peerWs) {
|
|
307
307
|
peerWs.send(JSON.stringify({ type: "mesh:unpaired", nodeId: identity.id }));
|
|
308
308
|
}
|
|
309
309
|
disconnectPeer(unpairMsg.nodeId);
|
|
310
|
-
|
|
310
|
+
const removed = removePeer(unpairMsg.nodeId);
|
|
311
311
|
if (removed) {
|
|
312
312
|
broadcast({ type: "mesh:nodes", nodes: buildNodesMessage() });
|
|
313
313
|
}
|
|
314
314
|
return;
|
|
315
315
|
}
|
|
316
316
|
if (message.type === "mesh:unpaired") {
|
|
317
|
-
|
|
317
|
+
const unpaired = message;
|
|
318
318
|
disconnectPeer(unpaired.nodeId);
|
|
319
|
-
|
|
319
|
+
const wasRemoved = removePeer(unpaired.nodeId);
|
|
320
320
|
if (wasRemoved) {
|
|
321
321
|
broadcast({ type: "mesh:nodes", nodes: buildNodesMessage() });
|
|
322
322
|
}
|
|
@@ -3,19 +3,19 @@ import { sendTo, broadcast } from "../ws/broadcast.js";
|
|
|
3
3
|
import { listNotes, createNote, updateNote, deleteNote } from "../features/sticky-notes.js";
|
|
4
4
|
registerHandler("notes", function (clientId, message) {
|
|
5
5
|
if (message.type === "notes:list") {
|
|
6
|
-
|
|
6
|
+
const listMsg = message;
|
|
7
7
|
sendTo(clientId, { type: "notes:list_result", notes: listNotes(listMsg.projectSlug) });
|
|
8
8
|
return;
|
|
9
9
|
}
|
|
10
10
|
if (message.type === "notes:create") {
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
const createMsg = message;
|
|
12
|
+
const note = createNote(createMsg.content, createMsg.projectSlug);
|
|
13
13
|
broadcast({ type: "notes:created", note });
|
|
14
14
|
return;
|
|
15
15
|
}
|
|
16
16
|
if (message.type === "notes:update") {
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
const updateMsg = message;
|
|
18
|
+
const updated = updateNote(updateMsg.id, updateMsg.content);
|
|
19
19
|
if (!updated) {
|
|
20
20
|
sendTo(clientId, { type: "chat:error", message: "Note not found" });
|
|
21
21
|
return;
|
|
@@ -24,8 +24,8 @@ registerHandler("notes", function (clientId, message) {
|
|
|
24
24
|
return;
|
|
25
25
|
}
|
|
26
26
|
if (message.type === "notes:delete") {
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
const deleteMsg = message;
|
|
28
|
+
const deleted = deleteNote(deleteMsg.id);
|
|
29
29
|
if (!deleted) {
|
|
30
30
|
sendTo(clientId, { type: "chat:error", message: "Note not found" });
|
|
31
31
|
return;
|