@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
|
@@ -6,24 +6,24 @@ import { registerHandler } from "../ws/router.js";
|
|
|
6
6
|
import { sendTo } from "../ws/broadcast.js";
|
|
7
7
|
import { loadConfig } from "../config.js";
|
|
8
8
|
import { readGlobalMcpServers, readGlobalSkills } from "../project/project-files.js";
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
9
|
+
const searchCache = new Map();
|
|
10
|
+
let skillsCache = null;
|
|
11
|
+
let lastScanTime = 0;
|
|
12
|
+
const CACHE_TTL_MS = 60000;
|
|
13
13
|
function parseFrontmatter(content) {
|
|
14
|
-
|
|
14
|
+
const match = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
|
|
15
15
|
if (!match)
|
|
16
16
|
return { name: "", description: "" };
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
for (
|
|
22
|
-
|
|
23
|
-
|
|
17
|
+
const yaml = match[1];
|
|
18
|
+
let name = "";
|
|
19
|
+
let desc = "";
|
|
20
|
+
const lines = yaml.split(/\r?\n/);
|
|
21
|
+
for (let i = 0; i < lines.length; i++) {
|
|
22
|
+
const line = lines[i];
|
|
23
|
+
const nameMatch = line.match(/^name:\s*(.+)/);
|
|
24
24
|
if (nameMatch)
|
|
25
25
|
name = nameMatch[1].trim().replace(/^["']|["']$/g, "");
|
|
26
|
-
|
|
26
|
+
const descMatch = line.match(/^description:\s*(.+)/);
|
|
27
27
|
if (descMatch)
|
|
28
28
|
desc = descMatch[1].trim().replace(/^["']|["']$/g, "");
|
|
29
29
|
}
|
|
@@ -33,7 +33,7 @@ function findSkillFiles(rootDir) {
|
|
|
33
33
|
if (!existsSync(rootDir))
|
|
34
34
|
return [];
|
|
35
35
|
try {
|
|
36
|
-
|
|
36
|
+
const output = execSync("find " + JSON.stringify(rootDir) + " -name SKILL.md -type f 2>/dev/null", { encoding: "utf-8", timeout: 5000 });
|
|
37
37
|
return output.trim().split("\n").filter(function (l) { return l.length > 0; });
|
|
38
38
|
}
|
|
39
39
|
catch {
|
|
@@ -42,12 +42,12 @@ function findSkillFiles(rootDir) {
|
|
|
42
42
|
}
|
|
43
43
|
function parseCommandFile(filePath, fileName) {
|
|
44
44
|
try {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
for (
|
|
50
|
-
|
|
45
|
+
const content = readFileSync(filePath, "utf-8");
|
|
46
|
+
const name = fileName.replace(/\.md$/, "");
|
|
47
|
+
let desc = "";
|
|
48
|
+
const lines = content.split(/\r?\n/);
|
|
49
|
+
for (let i = 0; i < Math.min(lines.length, 10); i++) {
|
|
50
|
+
const line = lines[i].trim();
|
|
51
51
|
if (line.length > 0 && !line.startsWith("#") && !line.startsWith("---")) {
|
|
52
52
|
desc = line.slice(0, 120);
|
|
53
53
|
break;
|
|
@@ -60,16 +60,16 @@ function parseCommandFile(filePath, fileName) {
|
|
|
60
60
|
}
|
|
61
61
|
}
|
|
62
62
|
function scanCommandsDir(dirPath) {
|
|
63
|
-
|
|
63
|
+
const results = [];
|
|
64
64
|
if (!existsSync(dirPath))
|
|
65
65
|
return results;
|
|
66
66
|
try {
|
|
67
|
-
|
|
68
|
-
for (
|
|
67
|
+
const entries = readdirSync(dirPath);
|
|
68
|
+
for (let i = 0; i < entries.length; i++) {
|
|
69
69
|
if (!entries[i].endsWith(".md"))
|
|
70
70
|
continue;
|
|
71
|
-
|
|
72
|
-
|
|
71
|
+
const filePath = join(dirPath, entries[i]);
|
|
72
|
+
const info = parseCommandFile(filePath, entries[i]);
|
|
73
73
|
if (info)
|
|
74
74
|
results.push(info);
|
|
75
75
|
}
|
|
@@ -78,46 +78,46 @@ function scanCommandsDir(dirPath) {
|
|
|
78
78
|
return results;
|
|
79
79
|
}
|
|
80
80
|
function getSkills() {
|
|
81
|
-
|
|
81
|
+
const now = Date.now();
|
|
82
82
|
if (skillsCache && now - lastScanTime < CACHE_TTL_MS) {
|
|
83
83
|
return skillsCache;
|
|
84
84
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
85
|
+
const home = homedir();
|
|
86
|
+
const skills = [];
|
|
87
|
+
const skillDirs = [
|
|
88
88
|
join(home, ".claude"),
|
|
89
89
|
join(home, ".agents"),
|
|
90
90
|
join(home, ".superpowers"),
|
|
91
91
|
];
|
|
92
|
-
for (
|
|
93
|
-
|
|
94
|
-
for (
|
|
92
|
+
for (let d = 0; d < skillDirs.length; d++) {
|
|
93
|
+
const files = findSkillFiles(skillDirs[d]);
|
|
94
|
+
for (let f = 0; f < files.length; f++) {
|
|
95
95
|
try {
|
|
96
|
-
|
|
97
|
-
|
|
96
|
+
const content = readFileSync(files[f], "utf-8");
|
|
97
|
+
const meta = parseFrontmatter(content);
|
|
98
98
|
if (meta.name) {
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
99
|
+
let skillName = meta.name;
|
|
100
|
+
const filePath = files[f];
|
|
101
|
+
const pluginMatch = filePath.match(/plugins\/([^/]+)\/skills\/([^/]+)\/SKILL\.md$/);
|
|
102
102
|
if (pluginMatch) {
|
|
103
|
-
|
|
104
|
-
|
|
103
|
+
const pluginName = pluginMatch[1];
|
|
104
|
+
const rawSkillName = pluginMatch[2];
|
|
105
105
|
if (skillName.indexOf(":") === -1 && skillName === rawSkillName) {
|
|
106
106
|
skillName = pluginName + ":" + skillName;
|
|
107
107
|
}
|
|
108
108
|
}
|
|
109
|
-
|
|
109
|
+
const extPluginMatch = filePath.match(/external_plugins\/([^/]+)\/skills\/([^/]+)\/SKILL\.md$/);
|
|
110
110
|
if (extPluginMatch) {
|
|
111
|
-
|
|
112
|
-
|
|
111
|
+
const extPluginName = extPluginMatch[1];
|
|
112
|
+
const extSkillName = extPluginMatch[2];
|
|
113
113
|
if (skillName.indexOf(":") === -1 && skillName === extSkillName) {
|
|
114
114
|
skillName = extPluginName + ":" + skillName;
|
|
115
115
|
}
|
|
116
116
|
}
|
|
117
|
-
|
|
117
|
+
const marketplaceSkillMatch = filePath.match(/marketplaces\/([^/]+)\/.claude\/skills\/([^/]+)\/SKILL\.md$/);
|
|
118
118
|
if (marketplaceSkillMatch) {
|
|
119
|
-
|
|
120
|
-
|
|
119
|
+
const mktName = marketplaceSkillMatch[1];
|
|
120
|
+
const mktSkill = marketplaceSkillMatch[2];
|
|
121
121
|
if (skillName.indexOf(":") === -1 && skillName === mktSkill) {
|
|
122
122
|
skillName = mktName + ":" + skillName;
|
|
123
123
|
}
|
|
@@ -132,26 +132,26 @@ function getSkills() {
|
|
|
132
132
|
catch { }
|
|
133
133
|
}
|
|
134
134
|
}
|
|
135
|
-
|
|
136
|
-
for (
|
|
137
|
-
|
|
138
|
-
|
|
135
|
+
const config = loadConfig();
|
|
136
|
+
for (let p = 0; p < config.projects.length; p++) {
|
|
137
|
+
const projectPath = config.projects[p].path;
|
|
138
|
+
const projectSkillDirs = [
|
|
139
139
|
join(projectPath, ".claude", "skills"),
|
|
140
140
|
join(projectPath, ".claude", "commands"),
|
|
141
141
|
join(projectPath, ".superpowers", "skills"),
|
|
142
142
|
];
|
|
143
|
-
for (
|
|
143
|
+
for (let pd = 0; pd < projectSkillDirs.length; pd++) {
|
|
144
144
|
if (projectSkillDirs[pd].endsWith("commands")) {
|
|
145
|
-
|
|
146
|
-
for (
|
|
145
|
+
const cmds = scanCommandsDir(projectSkillDirs[pd]);
|
|
146
|
+
for (let c = 0; c < cmds.length; c++)
|
|
147
147
|
skills.push(cmds[c]);
|
|
148
148
|
}
|
|
149
149
|
else {
|
|
150
|
-
|
|
151
|
-
for (
|
|
150
|
+
const projFiles = findSkillFiles(projectSkillDirs[pd]);
|
|
151
|
+
for (let pf = 0; pf < projFiles.length; pf++) {
|
|
152
152
|
try {
|
|
153
|
-
|
|
154
|
-
|
|
153
|
+
const projContent = readFileSync(projFiles[pf], "utf-8");
|
|
154
|
+
const projMeta = parseFrontmatter(projContent);
|
|
155
155
|
if (projMeta.name) {
|
|
156
156
|
skills.push({
|
|
157
157
|
name: projMeta.name,
|
|
@@ -165,28 +165,28 @@ function getSkills() {
|
|
|
165
165
|
}
|
|
166
166
|
}
|
|
167
167
|
}
|
|
168
|
-
|
|
169
|
-
for (
|
|
168
|
+
const globalCommands = scanCommandsDir(join(home, ".claude", "commands"));
|
|
169
|
+
for (let gc = 0; gc < globalCommands.length; gc++) {
|
|
170
170
|
skills.push(globalCommands[gc]);
|
|
171
171
|
}
|
|
172
|
-
|
|
173
|
-
for (
|
|
174
|
-
|
|
172
|
+
const namespacedBareNames = new Set();
|
|
173
|
+
for (let n = 0; n < skills.length; n++) {
|
|
174
|
+
const colonIdx = skills[n].name.indexOf(":");
|
|
175
175
|
if (colonIdx !== -1) {
|
|
176
176
|
namespacedBareNames.add(skills[n].name.slice(colonIdx + 1));
|
|
177
177
|
}
|
|
178
178
|
}
|
|
179
|
-
|
|
180
|
-
for (
|
|
179
|
+
const filtered = [];
|
|
180
|
+
for (let fi = 0; fi < skills.length; fi++) {
|
|
181
181
|
if (skills[fi].name.indexOf(":") === -1 && namespacedBareNames.has(skills[fi].name)) {
|
|
182
182
|
continue;
|
|
183
183
|
}
|
|
184
184
|
filtered.push(skills[fi]);
|
|
185
185
|
}
|
|
186
186
|
filtered.sort(function (a, b) { return a.name.localeCompare(b.name); });
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
for (
|
|
187
|
+
const seen = new Set();
|
|
188
|
+
const unique = [];
|
|
189
|
+
for (let i = 0; i < filtered.length; i++) {
|
|
190
190
|
if (!seen.has(filtered[i].name)) {
|
|
191
191
|
seen.add(filtered[i].name);
|
|
192
192
|
unique.push(filtered[i]);
|
|
@@ -197,8 +197,8 @@ function getSkills() {
|
|
|
197
197
|
return unique;
|
|
198
198
|
}
|
|
199
199
|
export function resolveSkillContent(skillName) {
|
|
200
|
-
|
|
201
|
-
|
|
200
|
+
const skills = getSkills();
|
|
201
|
+
const match = skills.find(function (s) { return s.name === skillName; });
|
|
202
202
|
if (!match)
|
|
203
203
|
return null;
|
|
204
204
|
try {
|
|
@@ -210,19 +210,19 @@ export function resolveSkillContent(skillName) {
|
|
|
210
210
|
}
|
|
211
211
|
registerHandler("skills", function (clientId, message) {
|
|
212
212
|
if (message.type === "skills:list_request") {
|
|
213
|
-
|
|
213
|
+
const skills = getSkills();
|
|
214
214
|
sendTo(clientId, { type: "skills:list", skills: skills });
|
|
215
215
|
return;
|
|
216
216
|
}
|
|
217
217
|
if (message.type === "skills:search") {
|
|
218
|
-
|
|
219
|
-
|
|
218
|
+
const searchMsg = message;
|
|
219
|
+
const query = searchMsg.query.trim();
|
|
220
220
|
if (!query) {
|
|
221
221
|
sendTo(clientId, { type: "skills:search_results", query: query, skills: [], count: 0 });
|
|
222
222
|
return;
|
|
223
223
|
}
|
|
224
|
-
|
|
225
|
-
|
|
224
|
+
const cacheKey = "search:" + query;
|
|
225
|
+
const cached = searchCache.get(cacheKey);
|
|
226
226
|
if (cached && Date.now() - cached.time < 60000) {
|
|
227
227
|
sendTo(clientId, { type: "skills:search_results", query: query, skills: cached.skills, count: cached.count });
|
|
228
228
|
return;
|
|
@@ -230,10 +230,10 @@ registerHandler("skills", function (clientId, message) {
|
|
|
230
230
|
void fetch("https://skills.sh/api/search?q=" + encodeURIComponent(query))
|
|
231
231
|
.then(function (res) { return res.json(); })
|
|
232
232
|
.then(function (data) {
|
|
233
|
-
|
|
233
|
+
const skills = (data.skills ?? []).map(function (s) {
|
|
234
234
|
return { id: s.id, skillId: s.skillId, name: s.name, source: s.source, installs: s.installs };
|
|
235
235
|
});
|
|
236
|
-
|
|
236
|
+
const count = data.count ?? skills.length;
|
|
237
237
|
searchCache.set(cacheKey, { skills: skills, count: count, time: Date.now() });
|
|
238
238
|
sendTo(clientId, { type: "skills:search_results", query: query, skills: skills, count: count });
|
|
239
239
|
})
|
|
@@ -243,21 +243,21 @@ registerHandler("skills", function (clientId, message) {
|
|
|
243
243
|
return;
|
|
244
244
|
}
|
|
245
245
|
if (message.type === "skills:install") {
|
|
246
|
-
|
|
247
|
-
|
|
246
|
+
const installMsg = message;
|
|
247
|
+
let cwd = homedir();
|
|
248
248
|
if (installMsg.scope === "project" && installMsg.projectSlug) {
|
|
249
|
-
|
|
250
|
-
|
|
249
|
+
const installConfig = loadConfig();
|
|
250
|
+
const installProject = installConfig.projects.find(function (p) { return p.slug === installMsg.projectSlug; });
|
|
251
251
|
if (installProject) {
|
|
252
252
|
cwd = installProject.path;
|
|
253
253
|
}
|
|
254
254
|
}
|
|
255
255
|
try {
|
|
256
|
-
|
|
256
|
+
const proc = spawn("npx", ["skillsadd", installMsg.source], {
|
|
257
257
|
cwd: cwd,
|
|
258
258
|
stdio: ["ignore", "pipe", "pipe"],
|
|
259
259
|
});
|
|
260
|
-
|
|
260
|
+
const timeout = setTimeout(function () {
|
|
261
261
|
proc.kill();
|
|
262
262
|
}, 60000);
|
|
263
263
|
proc.on("close", function (code) {
|
|
@@ -270,7 +270,7 @@ registerHandler("skills", function (clientId, message) {
|
|
|
270
270
|
sendTo(clientId, { type: "skills:install_result", success: false, message: "Install failed (exit code " + code + ")" });
|
|
271
271
|
}
|
|
272
272
|
if (installMsg.scope === "global") {
|
|
273
|
-
|
|
273
|
+
const globalConfig = loadConfig();
|
|
274
274
|
sendTo(clientId, {
|
|
275
275
|
type: "settings:data",
|
|
276
276
|
config: globalConfig,
|
|
@@ -286,13 +286,13 @@ registerHandler("skills", function (clientId, message) {
|
|
|
286
286
|
return;
|
|
287
287
|
}
|
|
288
288
|
if (message.type === "skills:view") {
|
|
289
|
-
|
|
289
|
+
const viewMsg = message;
|
|
290
290
|
try {
|
|
291
291
|
if (!existsSync(viewMsg.path)) {
|
|
292
292
|
sendTo(clientId, { type: "skills:view_result", path: viewMsg.path, content: "File not found." });
|
|
293
293
|
return;
|
|
294
294
|
}
|
|
295
|
-
|
|
295
|
+
const viewContent = readFileSync(viewMsg.path, "utf-8");
|
|
296
296
|
sendTo(clientId, { type: "skills:view_result", path: viewMsg.path, content: viewContent });
|
|
297
297
|
}
|
|
298
298
|
catch {
|
|
@@ -301,9 +301,9 @@ registerHandler("skills", function (clientId, message) {
|
|
|
301
301
|
return;
|
|
302
302
|
}
|
|
303
303
|
if (message.type === "skills:delete") {
|
|
304
|
-
|
|
304
|
+
const deleteMsg = message;
|
|
305
305
|
try {
|
|
306
|
-
|
|
306
|
+
const skillDir = dirname(deleteMsg.path);
|
|
307
307
|
if (!existsSync(deleteMsg.path)) {
|
|
308
308
|
sendTo(clientId, { type: "skills:delete_result", success: false, message: "Skill not found." });
|
|
309
309
|
return;
|
|
@@ -311,7 +311,7 @@ registerHandler("skills", function (clientId, message) {
|
|
|
311
311
|
rmSync(skillDir, { recursive: true, force: true });
|
|
312
312
|
skillsCache = null;
|
|
313
313
|
sendTo(clientId, { type: "skills:delete_result", success: true, message: "Skill deleted." });
|
|
314
|
-
|
|
314
|
+
const delConfig = loadConfig();
|
|
315
315
|
sendTo(clientId, {
|
|
316
316
|
type: "settings:data",
|
|
317
317
|
config: delConfig,
|
|
@@ -325,13 +325,13 @@ registerHandler("skills", function (clientId, message) {
|
|
|
325
325
|
return;
|
|
326
326
|
}
|
|
327
327
|
if (message.type === "skills:update") {
|
|
328
|
-
|
|
328
|
+
const updateMsg = message;
|
|
329
329
|
try {
|
|
330
|
-
|
|
330
|
+
const updateProc = spawn("npx", ["skillsadd", updateMsg.source], {
|
|
331
331
|
cwd: homedir(),
|
|
332
332
|
stdio: ["ignore", "pipe", "pipe"],
|
|
333
333
|
});
|
|
334
|
-
|
|
334
|
+
const updateTimeout = setTimeout(function () {
|
|
335
335
|
updateProc.kill();
|
|
336
336
|
}, 60000);
|
|
337
337
|
updateProc.on("close", function (code) {
|
|
@@ -343,7 +343,7 @@ registerHandler("skills", function (clientId, message) {
|
|
|
343
343
|
else {
|
|
344
344
|
sendTo(clientId, { type: "skills:install_result", success: false, message: "Update failed (exit code " + code + ")" });
|
|
345
345
|
}
|
|
346
|
-
|
|
346
|
+
const updConfig = loadConfig();
|
|
347
347
|
sendTo(clientId, {
|
|
348
348
|
type: "settings:data",
|
|
349
349
|
config: updConfig,
|
|
@@ -5,13 +5,13 @@ import { createSession, updateSessionInIndex } from "../project/session.js";
|
|
|
5
5
|
import { buildBrainstormPrompt, buildWritePlanPrompt, buildExecutePrompt } from "../features/superpowers.js";
|
|
6
6
|
registerHandler("specs", function (clientId, message) {
|
|
7
7
|
if (message.type === "specs:list") {
|
|
8
|
-
|
|
8
|
+
const listMsg = message;
|
|
9
9
|
sendTo(clientId, { type: "specs:list_result", specs: listSpecs(listMsg.projectSlug) });
|
|
10
10
|
return;
|
|
11
11
|
}
|
|
12
12
|
if (message.type === "specs:get") {
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
const getMsg = message;
|
|
14
|
+
const spec = getSpec(getMsg.id);
|
|
15
15
|
if (!spec) {
|
|
16
16
|
sendTo(clientId, { type: "chat:error", message: "Spec not found" });
|
|
17
17
|
return;
|
|
@@ -20,8 +20,8 @@ registerHandler("specs", function (clientId, message) {
|
|
|
20
20
|
return;
|
|
21
21
|
}
|
|
22
22
|
if (message.type === "specs:create") {
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
const createMsg = message;
|
|
24
|
+
const created = createSpec({
|
|
25
25
|
projectSlug: createMsg.projectSlug,
|
|
26
26
|
title: createMsg.title,
|
|
27
27
|
tagline: createMsg.tagline,
|
|
@@ -34,13 +34,13 @@ registerHandler("specs", function (clientId, message) {
|
|
|
34
34
|
return;
|
|
35
35
|
}
|
|
36
36
|
if (message.type === "specs:create-with-brainstorm") {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
37
|
+
const brainstormMsg = message;
|
|
38
|
+
const slug = brainstormMsg.projectSlug;
|
|
39
|
+
const newSpec = createSpec({ projectSlug: slug, title: "New Spec" });
|
|
40
|
+
const brainstormSession = createSession(slug, "brainstorm");
|
|
41
41
|
updateSessionInIndex(slug, brainstormSession);
|
|
42
42
|
linkSession(newSpec.id, brainstormSession.id, "Brainstorm session", "brainstorm");
|
|
43
|
-
|
|
43
|
+
const brainstormPrompt = buildBrainstormPrompt(newSpec, slug);
|
|
44
44
|
sendTo(clientId, {
|
|
45
45
|
type: "specs:brainstorm-started",
|
|
46
46
|
spec: newSpec,
|
|
@@ -48,49 +48,72 @@ registerHandler("specs", function (clientId, message) {
|
|
|
48
48
|
systemPrompt: { type: "preset", preset: "claude_code", append: brainstormPrompt },
|
|
49
49
|
});
|
|
50
50
|
broadcastToProject(slug, { type: "specs:created", spec: newSpec });
|
|
51
|
+
broadcastToProject(slug, {
|
|
52
|
+
type: "session:list",
|
|
53
|
+
projectSlug: slug,
|
|
54
|
+
sessions: [brainstormSession],
|
|
55
|
+
totalCount: undefined,
|
|
56
|
+
offset: 0,
|
|
57
|
+
});
|
|
51
58
|
return;
|
|
52
59
|
}
|
|
53
60
|
if (message.type === "specs:start-plan") {
|
|
54
|
-
|
|
55
|
-
|
|
61
|
+
const planMsg = message;
|
|
62
|
+
const planSpec = getSpec(planMsg.specId);
|
|
56
63
|
if (!planSpec) {
|
|
57
64
|
sendTo(clientId, { type: "chat:error", message: "Spec not found" });
|
|
58
65
|
return;
|
|
59
66
|
}
|
|
60
|
-
|
|
67
|
+
const planSession = createSession(planMsg.projectSlug, "write-plan");
|
|
68
|
+
planSession.title = "Plan: " + planSpec.title;
|
|
61
69
|
updateSessionInIndex(planMsg.projectSlug, planSession);
|
|
62
70
|
linkSession(planSpec.id, planSession.id, "Write plan session", "write-plan");
|
|
63
|
-
|
|
71
|
+
const planPrompt = buildWritePlanPrompt(planSpec, planMsg.projectSlug);
|
|
64
72
|
sendTo(clientId, {
|
|
65
73
|
type: "specs:plan-started",
|
|
66
74
|
spec: planSpec,
|
|
67
75
|
sessionId: planSession.id,
|
|
68
76
|
systemPrompt: { type: "preset", preset: "claude_code", append: planPrompt },
|
|
69
77
|
});
|
|
78
|
+
broadcastToProject(planMsg.projectSlug, {
|
|
79
|
+
type: "session:list",
|
|
80
|
+
projectSlug: planMsg.projectSlug,
|
|
81
|
+
sessions: [planSession],
|
|
82
|
+
totalCount: undefined,
|
|
83
|
+
offset: 0,
|
|
84
|
+
});
|
|
70
85
|
return;
|
|
71
86
|
}
|
|
72
87
|
if (message.type === "specs:start-execute") {
|
|
73
|
-
|
|
74
|
-
|
|
88
|
+
const execMsg = message;
|
|
89
|
+
const execSpec = getSpec(execMsg.specId);
|
|
75
90
|
if (!execSpec) {
|
|
76
91
|
sendTo(clientId, { type: "chat:error", message: "Spec not found" });
|
|
77
92
|
return;
|
|
78
93
|
}
|
|
79
|
-
|
|
94
|
+
const execSession = createSession(execMsg.projectSlug, "execute");
|
|
95
|
+
execSession.title = "Execute: " + execSpec.title;
|
|
80
96
|
updateSessionInIndex(execMsg.projectSlug, execSession);
|
|
81
97
|
linkSession(execSpec.id, execSession.id, "Execute session", "execute");
|
|
82
|
-
|
|
98
|
+
const execPrompt = buildExecutePrompt(execSpec, execMsg.projectSlug);
|
|
83
99
|
sendTo(clientId, {
|
|
84
100
|
type: "specs:execute-started",
|
|
85
101
|
spec: execSpec,
|
|
86
102
|
sessionId: execSession.id,
|
|
87
103
|
systemPrompt: { type: "preset", preset: "claude_code", append: execPrompt },
|
|
88
104
|
});
|
|
105
|
+
broadcastToProject(execMsg.projectSlug, {
|
|
106
|
+
type: "session:list",
|
|
107
|
+
projectSlug: execMsg.projectSlug,
|
|
108
|
+
sessions: [execSession],
|
|
109
|
+
totalCount: undefined,
|
|
110
|
+
offset: 0,
|
|
111
|
+
});
|
|
89
112
|
return;
|
|
90
113
|
}
|
|
91
114
|
if (message.type === "specs:update") {
|
|
92
|
-
|
|
93
|
-
|
|
115
|
+
const updateMsg = message;
|
|
116
|
+
const updated = updateSpec(updateMsg.id, {
|
|
94
117
|
title: updateMsg.title,
|
|
95
118
|
tagline: updateMsg.tagline,
|
|
96
119
|
status: updateMsg.status,
|
|
@@ -110,8 +133,8 @@ registerHandler("specs", function (clientId, message) {
|
|
|
110
133
|
return;
|
|
111
134
|
}
|
|
112
135
|
if (message.type === "specs:delete") {
|
|
113
|
-
|
|
114
|
-
|
|
136
|
+
const deleteMsg = message;
|
|
137
|
+
const toDelete = getSpec(deleteMsg.id);
|
|
115
138
|
if (!toDelete) {
|
|
116
139
|
sendTo(clientId, { type: "chat:error", message: "Spec not found" });
|
|
117
140
|
return;
|
|
@@ -121,8 +144,8 @@ registerHandler("specs", function (clientId, message) {
|
|
|
121
144
|
return;
|
|
122
145
|
}
|
|
123
146
|
if (message.type === "specs:link-session") {
|
|
124
|
-
|
|
125
|
-
|
|
147
|
+
const linkMsg = message;
|
|
148
|
+
const linked = linkSession(linkMsg.id, linkMsg.sessionId, linkMsg.note);
|
|
126
149
|
if (!linked) {
|
|
127
150
|
sendTo(clientId, { type: "chat:error", message: "Spec not found" });
|
|
128
151
|
return;
|
|
@@ -131,8 +154,8 @@ registerHandler("specs", function (clientId, message) {
|
|
|
131
154
|
return;
|
|
132
155
|
}
|
|
133
156
|
if (message.type === "specs:unlink-session") {
|
|
134
|
-
|
|
135
|
-
|
|
157
|
+
const unlinkMsg = message;
|
|
158
|
+
const unlinked = unlinkSession(unlinkMsg.id, unlinkMsg.sessionId);
|
|
136
159
|
if (!unlinked) {
|
|
137
160
|
sendTo(clientId, { type: "chat:error", message: "Spec not found" });
|
|
138
161
|
return;
|
|
@@ -141,8 +164,8 @@ registerHandler("specs", function (clientId, message) {
|
|
|
141
164
|
return;
|
|
142
165
|
}
|
|
143
166
|
if (message.type === "specs:activity") {
|
|
144
|
-
|
|
145
|
-
|
|
167
|
+
const actMsg = message;
|
|
168
|
+
const withActivity = addActivity(actMsg.id, actMsg.activityType, actMsg.detail, actMsg.sessionId);
|
|
146
169
|
if (!withActivity) {
|
|
147
170
|
sendTo(clientId, { type: "chat:error", message: "Spec not found" });
|
|
148
171
|
return;
|
|
@@ -4,9 +4,9 @@ import { createTerminal, destroyTerminal, writeToTerminal, resizeTerminal } from
|
|
|
4
4
|
import { getActiveSession } from "./chat.js";
|
|
5
5
|
import { getProjectBySlug } from "../project/registry.js";
|
|
6
6
|
import { homedir } from "node:os";
|
|
7
|
-
|
|
7
|
+
const clientTerminals = new Map();
|
|
8
8
|
function getOrCreateClientSet(clientId) {
|
|
9
|
-
|
|
9
|
+
let set = clientTerminals.get(clientId);
|
|
10
10
|
if (!set) {
|
|
11
11
|
set = new Set();
|
|
12
12
|
clientTerminals.set(clientId, set);
|
|
@@ -14,7 +14,7 @@ function getOrCreateClientSet(clientId) {
|
|
|
14
14
|
return set;
|
|
15
15
|
}
|
|
16
16
|
export function cleanupClientTerminals(clientId) {
|
|
17
|
-
|
|
17
|
+
const set = clientTerminals.get(clientId);
|
|
18
18
|
if (set) {
|
|
19
19
|
set.forEach(function (termId) {
|
|
20
20
|
destroyTerminal(termId);
|
|
@@ -24,24 +24,24 @@ export function cleanupClientTerminals(clientId) {
|
|
|
24
24
|
}
|
|
25
25
|
registerHandler("terminal", function (clientId, message) {
|
|
26
26
|
if (message.type === "terminal:create") {
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
const createMsg = message;
|
|
28
|
+
let cwd = homedir();
|
|
29
29
|
if (createMsg.projectSlug) {
|
|
30
|
-
|
|
30
|
+
const slugProject = getProjectBySlug(createMsg.projectSlug);
|
|
31
31
|
if (slugProject) {
|
|
32
32
|
cwd = slugProject.path;
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
35
|
else {
|
|
36
|
-
|
|
36
|
+
const active = getActiveSession(clientId);
|
|
37
37
|
if (active) {
|
|
38
|
-
|
|
38
|
+
const project = getProjectBySlug(active.projectSlug);
|
|
39
39
|
if (project) {
|
|
40
40
|
cwd = project.path;
|
|
41
41
|
}
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
|
-
|
|
44
|
+
const termId = createTerminal(cwd, function (data) {
|
|
45
45
|
sendTo(clientId, { type: "terminal:output", termId: termId, data: data });
|
|
46
46
|
}, function (code) {
|
|
47
47
|
sendTo(clientId, { type: "terminal:exited", termId: termId, code: code });
|
|
@@ -52,8 +52,8 @@ registerHandler("terminal", function (clientId, message) {
|
|
|
52
52
|
return;
|
|
53
53
|
}
|
|
54
54
|
if (message.type === "terminal:input") {
|
|
55
|
-
|
|
56
|
-
|
|
55
|
+
const inputMsg = message;
|
|
56
|
+
const clientSet = clientTerminals.get(clientId);
|
|
57
57
|
if (!clientSet || !clientSet.has(inputMsg.termId)) {
|
|
58
58
|
return;
|
|
59
59
|
}
|
|
@@ -64,8 +64,8 @@ registerHandler("terminal", function (clientId, message) {
|
|
|
64
64
|
return;
|
|
65
65
|
}
|
|
66
66
|
if (message.type === "terminal:resize") {
|
|
67
|
-
|
|
68
|
-
|
|
67
|
+
const resizeMsg = message;
|
|
68
|
+
const resizeClientSet = clientTerminals.get(clientId);
|
|
69
69
|
if (!resizeClientSet || !resizeClientSet.has(resizeMsg.termId)) {
|
|
70
70
|
return;
|
|
71
71
|
}
|