@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
|
@@ -3,9 +3,9 @@ import { join } from "node:path";
|
|
|
3
3
|
import { loadConfig } from "../config.js";
|
|
4
4
|
import { broadcast } from "../ws/broadcast.js";
|
|
5
5
|
import { log } from "../logger.js";
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
let activeBrainstorms = {};
|
|
7
|
+
let watchers = [];
|
|
8
|
+
let debounceTimers = {};
|
|
9
9
|
function debounce(key, fn, ms) {
|
|
10
10
|
if (debounceTimers[key]) {
|
|
11
11
|
clearTimeout(debounceTimers[key]);
|
|
@@ -19,13 +19,13 @@ function getMostRecentSessionDir(brainstormDir) {
|
|
|
19
19
|
if (!existsSync(brainstormDir)) {
|
|
20
20
|
return null;
|
|
21
21
|
}
|
|
22
|
-
|
|
22
|
+
const entries = [];
|
|
23
23
|
try {
|
|
24
|
-
|
|
25
|
-
for (
|
|
26
|
-
|
|
24
|
+
const names = readdirSync(brainstormDir);
|
|
25
|
+
for (let i = 0; i < names.length; i++) {
|
|
26
|
+
const fullPath = join(brainstormDir, names[i]);
|
|
27
27
|
try {
|
|
28
|
-
|
|
28
|
+
const stat = statSync(fullPath);
|
|
29
29
|
if (stat.isDirectory()) {
|
|
30
30
|
entries.push({ name: names[i], mtime: stat.mtimeMs });
|
|
31
31
|
}
|
|
@@ -59,11 +59,11 @@ function handleContentFile(projectSlug, contentDir, sessionDir, filename) {
|
|
|
59
59
|
broadcast({ type: "brainstorm:cleared" });
|
|
60
60
|
return;
|
|
61
61
|
}
|
|
62
|
-
|
|
62
|
+
const filePath = join(contentDir, filename);
|
|
63
63
|
if (!existsSync(filePath)) {
|
|
64
64
|
return;
|
|
65
65
|
}
|
|
66
|
-
|
|
66
|
+
let html;
|
|
67
67
|
try {
|
|
68
68
|
html = readFileSync(filePath, "utf-8");
|
|
69
69
|
}
|
|
@@ -83,32 +83,32 @@ function handleStateFile(projectSlug, filename) {
|
|
|
83
83
|
}
|
|
84
84
|
}
|
|
85
85
|
function watchSessionDir(projectSlug, sessionDir) {
|
|
86
|
-
|
|
87
|
-
|
|
86
|
+
const contentDir = join(sessionDir, "content");
|
|
87
|
+
const stateDir = join(sessionDir, "state");
|
|
88
88
|
if (!existsSync(contentDir)) {
|
|
89
89
|
mkdirSync(contentDir, { recursive: true });
|
|
90
90
|
}
|
|
91
91
|
if (!existsSync(stateDir)) {
|
|
92
92
|
mkdirSync(stateDir, { recursive: true });
|
|
93
93
|
}
|
|
94
|
-
|
|
94
|
+
const alreadyStopped = existsSync(join(stateDir, "server-stopped"));
|
|
95
95
|
if (!alreadyStopped) {
|
|
96
|
-
|
|
96
|
+
let existingFiles = [];
|
|
97
97
|
try {
|
|
98
98
|
existingFiles = readdirSync(contentDir);
|
|
99
99
|
}
|
|
100
100
|
catch {
|
|
101
101
|
// ok
|
|
102
102
|
}
|
|
103
|
-
for (
|
|
104
|
-
|
|
103
|
+
for (let i = 0; i < existingFiles.length; i++) {
|
|
104
|
+
const fname = existingFiles[i];
|
|
105
105
|
if (fname.endsWith(".html") && !isWaitingFile(fname)) {
|
|
106
106
|
handleContentFile(projectSlug, contentDir, sessionDir, fname);
|
|
107
107
|
}
|
|
108
108
|
}
|
|
109
109
|
}
|
|
110
110
|
try {
|
|
111
|
-
|
|
111
|
+
const contentWatcher = watch(contentDir, function (eventType, filename) {
|
|
112
112
|
if (!filename) {
|
|
113
113
|
return;
|
|
114
114
|
}
|
|
@@ -122,7 +122,7 @@ function watchSessionDir(projectSlug, sessionDir) {
|
|
|
122
122
|
log.server("[brainstorm] failed to watch content dir %s: %s", contentDir, err);
|
|
123
123
|
}
|
|
124
124
|
try {
|
|
125
|
-
|
|
125
|
+
const stateWatcher = watch(stateDir, function (eventType, filename) {
|
|
126
126
|
if (!filename) {
|
|
127
127
|
return;
|
|
128
128
|
}
|
|
@@ -137,19 +137,19 @@ function watchSessionDir(projectSlug, sessionDir) {
|
|
|
137
137
|
}
|
|
138
138
|
}
|
|
139
139
|
function watchBrainstormDir(projectSlug, brainstormDir) {
|
|
140
|
-
|
|
140
|
+
const recentSession = getMostRecentSessionDir(brainstormDir);
|
|
141
141
|
if (recentSession) {
|
|
142
142
|
watchSessionDir(projectSlug, recentSession);
|
|
143
143
|
}
|
|
144
144
|
try {
|
|
145
|
-
|
|
145
|
+
const dirWatcher = watch(brainstormDir, function (eventType, filename) {
|
|
146
146
|
if (!filename) {
|
|
147
147
|
return;
|
|
148
148
|
}
|
|
149
149
|
debounce("brainstorm:" + brainstormDir + ":" + filename, function () {
|
|
150
|
-
|
|
150
|
+
const candidate = join(brainstormDir, filename);
|
|
151
151
|
try {
|
|
152
|
-
|
|
152
|
+
const stat = statSync(candidate);
|
|
153
153
|
if (stat.isDirectory()) {
|
|
154
154
|
log.server("[brainstorm] new session dir detected: %s", candidate);
|
|
155
155
|
watchSessionDir(projectSlug, candidate);
|
|
@@ -167,8 +167,8 @@ function watchBrainstormDir(projectSlug, brainstormDir) {
|
|
|
167
167
|
}
|
|
168
168
|
}
|
|
169
169
|
function watchProjectRoot(projectSlug, projectPath) {
|
|
170
|
-
|
|
171
|
-
|
|
170
|
+
const superpowersDir = join(projectPath, ".superpowers");
|
|
171
|
+
const brainstormDir = join(superpowersDir, "brainstorm");
|
|
172
172
|
if (existsSync(brainstormDir)) {
|
|
173
173
|
watchBrainstormDir(projectSlug, brainstormDir);
|
|
174
174
|
return;
|
|
@@ -178,7 +178,7 @@ function watchProjectRoot(projectSlug, projectPath) {
|
|
|
178
178
|
return;
|
|
179
179
|
}
|
|
180
180
|
try {
|
|
181
|
-
|
|
181
|
+
const rootWatcher = watch(projectPath, function (eventType, filename) {
|
|
182
182
|
if (filename !== ".superpowers") {
|
|
183
183
|
return;
|
|
184
184
|
}
|
|
@@ -199,7 +199,7 @@ function watchForBrainstormDir(projectSlug, superpowersDir, brainstormDir) {
|
|
|
199
199
|
return;
|
|
200
200
|
}
|
|
201
201
|
try {
|
|
202
|
-
|
|
202
|
+
const spWatcher = watch(superpowersDir, function (eventType, filename) {
|
|
203
203
|
if (filename !== "brainstorm") {
|
|
204
204
|
return;
|
|
205
205
|
}
|
|
@@ -215,10 +215,10 @@ function watchForBrainstormDir(projectSlug, superpowersDir, brainstormDir) {
|
|
|
215
215
|
}
|
|
216
216
|
}
|
|
217
217
|
export function startBrainstormWatchers() {
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
for (
|
|
221
|
-
|
|
218
|
+
const config = loadConfig();
|
|
219
|
+
const projects = config.projects;
|
|
220
|
+
for (let i = 0; i < projects.length; i++) {
|
|
221
|
+
const project = projects[i];
|
|
222
222
|
if (!project.path || !project.slug) {
|
|
223
223
|
continue;
|
|
224
224
|
}
|
|
@@ -230,7 +230,7 @@ export function startBrainstormWatchers() {
|
|
|
230
230
|
}
|
|
231
231
|
}
|
|
232
232
|
export function stopBrainstormWatchers() {
|
|
233
|
-
for (
|
|
233
|
+
for (let i = 0; i < watchers.length; i++) {
|
|
234
234
|
try {
|
|
235
235
|
watchers[i].close();
|
|
236
236
|
}
|
|
@@ -240,8 +240,8 @@ export function stopBrainstormWatchers() {
|
|
|
240
240
|
}
|
|
241
241
|
watchers = [];
|
|
242
242
|
activeBrainstorms = {};
|
|
243
|
-
|
|
244
|
-
for (
|
|
243
|
+
const keys = Object.keys(debounceTimers);
|
|
244
|
+
for (let i = 0; i < keys.length; i++) {
|
|
245
245
|
clearTimeout(debounceTimers[keys[i]]);
|
|
246
246
|
}
|
|
247
247
|
debounceTimers = {};
|
|
@@ -250,23 +250,23 @@ export function getActiveBrainstorm(projectSlug) {
|
|
|
250
250
|
return activeBrainstorms[projectSlug] || null;
|
|
251
251
|
}
|
|
252
252
|
export function getAnyActiveBrainstorm() {
|
|
253
|
-
|
|
253
|
+
const keys = Object.keys(activeBrainstorms);
|
|
254
254
|
if (keys.length === 0)
|
|
255
255
|
return null;
|
|
256
256
|
return activeBrainstorms[keys[0]];
|
|
257
257
|
}
|
|
258
258
|
export function stopBrainstorm(projectSlug) {
|
|
259
|
-
|
|
260
|
-
for (
|
|
261
|
-
|
|
262
|
-
|
|
259
|
+
const slugs = projectSlug ? [projectSlug] : Object.keys(activeBrainstorms);
|
|
260
|
+
for (let i = 0; i < slugs.length; i++) {
|
|
261
|
+
const slug = slugs[i];
|
|
262
|
+
const active = activeBrainstorms[slug];
|
|
263
263
|
if (!active)
|
|
264
264
|
continue;
|
|
265
|
-
|
|
265
|
+
const stateDir = join(active.sessionDir, "state");
|
|
266
266
|
if (!existsSync(stateDir)) {
|
|
267
267
|
mkdirSync(stateDir, { recursive: true });
|
|
268
268
|
}
|
|
269
|
-
|
|
269
|
+
const stoppedPath = join(stateDir, "server-stopped");
|
|
270
270
|
if (!existsSync(stoppedPath)) {
|
|
271
271
|
try {
|
|
272
272
|
writeFileSync(stoppedPath, String(Date.now()));
|
|
@@ -281,11 +281,11 @@ export function stopBrainstorm(projectSlug) {
|
|
|
281
281
|
broadcast({ type: "brainstorm:cleared" });
|
|
282
282
|
}
|
|
283
283
|
export function writeBrainstormEvent(sessionDir, event) {
|
|
284
|
-
|
|
284
|
+
const stateDir = join(sessionDir, "state");
|
|
285
285
|
if (!existsSync(stateDir)) {
|
|
286
286
|
mkdirSync(stateDir, { recursive: true });
|
|
287
287
|
}
|
|
288
|
-
|
|
288
|
+
const eventsFile = join(stateDir, "events");
|
|
289
289
|
try {
|
|
290
290
|
appendFileSync(eventsFile, JSON.stringify(event) + "\n", "utf-8");
|
|
291
291
|
}
|
|
@@ -4,25 +4,25 @@ import { randomBytes } from "node:crypto";
|
|
|
4
4
|
import { query } from "@anthropic-ai/claude-agent-sdk";
|
|
5
5
|
import { broadcast } from "../ws/broadcast.js";
|
|
6
6
|
import { getProjectBySlug } from "../project/registry.js";
|
|
7
|
-
|
|
7
|
+
const activeLoops = new Map();
|
|
8
8
|
function readLoopFile(projectPath, filename) {
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
const loopsDir = join(projectPath, ".claude", "loops");
|
|
10
|
+
const filePath = join(loopsDir, filename);
|
|
11
11
|
if (!existsSync(filePath)) {
|
|
12
12
|
return null;
|
|
13
13
|
}
|
|
14
14
|
return readFileSync(filePath, "utf-8");
|
|
15
15
|
}
|
|
16
16
|
async function runIteration(loopId, prompt, cwd, iterationNum) {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
for await (
|
|
20
|
-
|
|
17
|
+
let accumulated = "";
|
|
18
|
+
const stream = query({ prompt, options: { cwd, allowedTools: ["*"], permissionMode: "acceptEdits" } });
|
|
19
|
+
for await (const msg of stream) {
|
|
20
|
+
const typedMsg = msg;
|
|
21
21
|
if (typedMsg.type === "stream_event") {
|
|
22
|
-
|
|
23
|
-
|
|
22
|
+
const partial = typedMsg;
|
|
23
|
+
const evt = partial.event;
|
|
24
24
|
if (evt.type === "content_block_delta") {
|
|
25
|
-
|
|
25
|
+
const deltaEvt = evt;
|
|
26
26
|
if (deltaEvt.delta.type === "text_delta" && typeof deltaEvt.delta.text === "string") {
|
|
27
27
|
accumulated += deltaEvt.delta.text;
|
|
28
28
|
broadcast({ type: "loop:delta", loopId, iteration: iterationNum, text: deltaEvt.delta.text });
|
|
@@ -33,38 +33,38 @@ async function runIteration(loopId, prompt, cwd, iterationNum) {
|
|
|
33
33
|
return accumulated;
|
|
34
34
|
}
|
|
35
35
|
async function runJudge(judgePrompt, iterationResult, cwd) {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
for await (
|
|
40
|
-
|
|
36
|
+
const fullPrompt = `${judgePrompt}\n\n<iteration_result>\n${iterationResult}\n</iteration_result>\n\nRespond with PASS or FAIL on the first line, followed by a brief reason.`;
|
|
37
|
+
let accumulated = "";
|
|
38
|
+
const stream = query({ prompt: fullPrompt, options: { cwd, allowedTools: [], permissionMode: "acceptEdits" } });
|
|
39
|
+
for await (const msg of stream) {
|
|
40
|
+
const typedMsg = msg;
|
|
41
41
|
if (typedMsg.type === "stream_event") {
|
|
42
|
-
|
|
43
|
-
|
|
42
|
+
const partial = typedMsg;
|
|
43
|
+
const evt = partial.event;
|
|
44
44
|
if (evt.type === "content_block_delta") {
|
|
45
|
-
|
|
45
|
+
const deltaEvt = evt;
|
|
46
46
|
if (deltaEvt.delta.type === "text_delta" && typeof deltaEvt.delta.text === "string") {
|
|
47
47
|
accumulated += deltaEvt.delta.text;
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
51
|
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
52
|
+
const firstLine = accumulated.trim().split("\n")[0].toUpperCase();
|
|
53
|
+
const pass = firstLine.startsWith("PASS");
|
|
54
|
+
const reason = accumulated.trim().split("\n").slice(1).join("\n").trim() || accumulated.trim();
|
|
55
55
|
return { pass, reason };
|
|
56
56
|
}
|
|
57
57
|
export function startLoop(projectSlug) {
|
|
58
|
-
|
|
58
|
+
const project = getProjectBySlug(projectSlug);
|
|
59
59
|
if (!project) {
|
|
60
60
|
return null;
|
|
61
61
|
}
|
|
62
|
-
|
|
62
|
+
const prompt = readLoopFile(project.path, "PROMPT.md");
|
|
63
63
|
if (!prompt) {
|
|
64
64
|
return null;
|
|
65
65
|
}
|
|
66
|
-
|
|
67
|
-
|
|
66
|
+
const loopId = "loop_" + Date.now() + "_" + randomBytes(3).toString("hex");
|
|
67
|
+
const loopStatus = {
|
|
68
68
|
id: loopId,
|
|
69
69
|
projectSlug,
|
|
70
70
|
status: "running",
|
|
@@ -77,9 +77,9 @@ export function startLoop(projectSlug) {
|
|
|
77
77
|
activeLoops.set(loopId, loopStatus);
|
|
78
78
|
broadcast({ type: "loop:started", loop: loopStatus });
|
|
79
79
|
void (async function () {
|
|
80
|
-
|
|
81
|
-
for (
|
|
82
|
-
|
|
80
|
+
const judgePrompt = readLoopFile(project.path, "JUDGE.md");
|
|
81
|
+
for (let i = 1; i <= loopStatus.maxIterations; i++) {
|
|
82
|
+
const current = activeLoops.get(loopId);
|
|
83
83
|
if (!current || current.status === "stopped") {
|
|
84
84
|
break;
|
|
85
85
|
}
|
|
@@ -87,9 +87,9 @@ export function startLoop(projectSlug) {
|
|
|
87
87
|
activeLoops.set(loopId, current);
|
|
88
88
|
broadcast({ type: "loop:status_update", loop: { ...current } });
|
|
89
89
|
try {
|
|
90
|
-
|
|
90
|
+
const result = await runIteration(loopId, prompt, project.path, i);
|
|
91
91
|
if (judgePrompt) {
|
|
92
|
-
|
|
92
|
+
const judgment = await runJudge(judgePrompt, result, project.path);
|
|
93
93
|
current.judgeReason = judgment.reason;
|
|
94
94
|
activeLoops.set(loopId, current);
|
|
95
95
|
if (judgment.pass) {
|
|
@@ -102,7 +102,7 @@ export function startLoop(projectSlug) {
|
|
|
102
102
|
}
|
|
103
103
|
}
|
|
104
104
|
catch (err) {
|
|
105
|
-
|
|
105
|
+
const errMsg = err instanceof Error ? err.message : String(err);
|
|
106
106
|
console.error(`[ralph-loop] Iteration ${i} error:`, errMsg);
|
|
107
107
|
current.status = "error";
|
|
108
108
|
current.judgeReason = errMsg;
|
|
@@ -112,7 +112,7 @@ export function startLoop(projectSlug) {
|
|
|
112
112
|
return;
|
|
113
113
|
}
|
|
114
114
|
}
|
|
115
|
-
|
|
115
|
+
const final = activeLoops.get(loopId);
|
|
116
116
|
if (final && final.status === "running") {
|
|
117
117
|
final.status = "done";
|
|
118
118
|
final.finishedAt = Date.now();
|
|
@@ -123,7 +123,7 @@ export function startLoop(projectSlug) {
|
|
|
123
123
|
return loopStatus;
|
|
124
124
|
}
|
|
125
125
|
export function stopLoop(loopId) {
|
|
126
|
-
|
|
126
|
+
const loop = activeLoops.get(loopId);
|
|
127
127
|
if (!loop || loop.status !== "running") {
|
|
128
128
|
return false;
|
|
129
129
|
}
|
|
@@ -3,11 +3,11 @@ import { join } from "node:path";
|
|
|
3
3
|
import { randomBytes } from "node:crypto";
|
|
4
4
|
import { getLatticeHome } from "../config.js";
|
|
5
5
|
import { broadcast } from "../ws/broadcast.js";
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
6
|
+
let schedulesFile = "";
|
|
7
|
+
let tasks = [];
|
|
8
|
+
let timerId = null;
|
|
9
|
+
const lastTriggeredMinute = {};
|
|
10
|
+
const CHECK_INTERVAL = 30 * 1000;
|
|
11
11
|
function getSchedulesPath() {
|
|
12
12
|
if (!schedulesFile) {
|
|
13
13
|
schedulesFile = join(getLatticeHome(), "schedules.json");
|
|
@@ -15,37 +15,37 @@ function getSchedulesPath() {
|
|
|
15
15
|
return schedulesFile;
|
|
16
16
|
}
|
|
17
17
|
function parseCronField(field, min, max) {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
for (
|
|
21
|
-
|
|
18
|
+
const values = [];
|
|
19
|
+
const parts = field.split(",");
|
|
20
|
+
for (let i = 0; i < parts.length; i++) {
|
|
21
|
+
const part = parts[i].trim();
|
|
22
22
|
if (part.indexOf("/") !== -1) {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
23
|
+
const slashParts = part.split("/");
|
|
24
|
+
const step = parseInt(slashParts[1], 10);
|
|
25
|
+
const rangeStr = slashParts[0];
|
|
26
|
+
let rangeMin = min;
|
|
27
|
+
let rangeMax = max;
|
|
28
28
|
if (rangeStr !== "*") {
|
|
29
|
-
|
|
29
|
+
const rp = rangeStr.split("-");
|
|
30
30
|
rangeMin = parseInt(rp[0], 10);
|
|
31
31
|
rangeMax = rp.length > 1 ? parseInt(rp[1], 10) : rangeMin;
|
|
32
32
|
}
|
|
33
|
-
for (
|
|
33
|
+
for (let v = rangeMin; v <= rangeMax; v += step) {
|
|
34
34
|
values.push(v);
|
|
35
35
|
}
|
|
36
36
|
continue;
|
|
37
37
|
}
|
|
38
38
|
if (part === "*") {
|
|
39
|
-
for (
|
|
39
|
+
for (let v = min; v <= max; v++) {
|
|
40
40
|
values.push(v);
|
|
41
41
|
}
|
|
42
42
|
continue;
|
|
43
43
|
}
|
|
44
44
|
if (part.indexOf("-") !== -1) {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
for (
|
|
45
|
+
const rangeParts = part.split("-");
|
|
46
|
+
const from = parseInt(rangeParts[0], 10);
|
|
47
|
+
const to = parseInt(rangeParts[1], 10);
|
|
48
|
+
for (let v = from; v <= to; v++) {
|
|
49
49
|
values.push(v);
|
|
50
50
|
}
|
|
51
51
|
continue;
|
|
@@ -55,7 +55,7 @@ function parseCronField(field, min, max) {
|
|
|
55
55
|
return values;
|
|
56
56
|
}
|
|
57
57
|
function parseCron(expr) {
|
|
58
|
-
|
|
58
|
+
const fields = expr.trim().split(/\s+/);
|
|
59
59
|
if (fields.length !== 5) {
|
|
60
60
|
return null;
|
|
61
61
|
}
|
|
@@ -75,15 +75,15 @@ function cronMatches(parsed, date) {
|
|
|
75
75
|
parsed.daysOfWeek.indexOf(date.getDay()) !== -1);
|
|
76
76
|
}
|
|
77
77
|
function nextRunTime(cronExpr, after) {
|
|
78
|
-
|
|
78
|
+
const parsed = parseCron(cronExpr);
|
|
79
79
|
if (!parsed) {
|
|
80
80
|
return null;
|
|
81
81
|
}
|
|
82
|
-
|
|
82
|
+
const d = new Date(after || Date.now());
|
|
83
83
|
d.setSeconds(0, 0);
|
|
84
84
|
d.setMinutes(d.getMinutes() + 1);
|
|
85
|
-
|
|
86
|
-
for (
|
|
85
|
+
const limit = 366 * 24 * 60;
|
|
86
|
+
for (let i = 0; i < limit; i++) {
|
|
87
87
|
if (cronMatches(parsed, d)) {
|
|
88
88
|
return d.getTime();
|
|
89
89
|
}
|
|
@@ -92,17 +92,17 @@ function nextRunTime(cronExpr, after) {
|
|
|
92
92
|
return null;
|
|
93
93
|
}
|
|
94
94
|
export function loadSchedules() {
|
|
95
|
-
|
|
95
|
+
const path = getSchedulesPath();
|
|
96
96
|
if (!existsSync(path)) {
|
|
97
97
|
tasks = [];
|
|
98
98
|
return;
|
|
99
99
|
}
|
|
100
100
|
try {
|
|
101
|
-
|
|
102
|
-
|
|
101
|
+
const raw = readFileSync(path, "utf-8");
|
|
102
|
+
const parsed = JSON.parse(raw);
|
|
103
103
|
tasks = parsed.tasks || [];
|
|
104
|
-
for (
|
|
105
|
-
|
|
104
|
+
for (let i = 0; i < tasks.length; i++) {
|
|
105
|
+
const task = tasks[i];
|
|
106
106
|
if (task.enabled && task.cron) {
|
|
107
107
|
task.nextRunAt = nextRunTime(task.cron);
|
|
108
108
|
}
|
|
@@ -114,12 +114,12 @@ export function loadSchedules() {
|
|
|
114
114
|
}
|
|
115
115
|
}
|
|
116
116
|
function saveSchedules() {
|
|
117
|
-
|
|
118
|
-
|
|
117
|
+
const path = getSchedulesPath();
|
|
118
|
+
const dir = join(path, "..");
|
|
119
119
|
if (!existsSync(dir)) {
|
|
120
120
|
mkdirSync(dir, { recursive: true });
|
|
121
121
|
}
|
|
122
|
-
|
|
122
|
+
const tmp = path + ".tmp";
|
|
123
123
|
try {
|
|
124
124
|
writeFileSync(tmp, JSON.stringify({ tasks }, null, 2));
|
|
125
125
|
renameSync(tmp, path);
|
|
@@ -129,25 +129,25 @@ function saveSchedules() {
|
|
|
129
129
|
}
|
|
130
130
|
}
|
|
131
131
|
function tick() {
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
for (
|
|
135
|
-
|
|
132
|
+
const now = Date.now();
|
|
133
|
+
const nowMinuteKey = Math.floor(now / 60000);
|
|
134
|
+
for (let i = 0; i < tasks.length; i++) {
|
|
135
|
+
const task = tasks[i];
|
|
136
136
|
if (!task.enabled || !task.nextRunAt) {
|
|
137
137
|
continue;
|
|
138
138
|
}
|
|
139
139
|
if (task.nextRunAt > now) {
|
|
140
140
|
continue;
|
|
141
141
|
}
|
|
142
|
-
|
|
142
|
+
const triggerKey = task.id + "_" + nowMinuteKey;
|
|
143
143
|
if (lastTriggeredMinute[triggerKey]) {
|
|
144
144
|
continue;
|
|
145
145
|
}
|
|
146
146
|
lastTriggeredMinute[triggerKey] = true;
|
|
147
|
-
|
|
148
|
-
for (
|
|
149
|
-
|
|
150
|
-
|
|
147
|
+
const keys = Object.keys(lastTriggeredMinute);
|
|
148
|
+
for (let k = 0; k < keys.length; k++) {
|
|
149
|
+
const keyParts = keys[k].split("_");
|
|
150
|
+
const keyMinute = parseInt(keyParts[keyParts.length - 1], 10);
|
|
151
151
|
if (keyMinute < nowMinuteKey - 1) {
|
|
152
152
|
delete lastTriggeredMinute[keys[k]];
|
|
153
153
|
}
|
|
@@ -180,12 +180,12 @@ export function listTasks() {
|
|
|
180
180
|
return tasks.slice();
|
|
181
181
|
}
|
|
182
182
|
export function createTask(data) {
|
|
183
|
-
|
|
183
|
+
const parsed = parseCron(data.cron);
|
|
184
184
|
if (!parsed) {
|
|
185
185
|
return null;
|
|
186
186
|
}
|
|
187
|
-
|
|
188
|
-
|
|
187
|
+
const now = Date.now();
|
|
188
|
+
const task = {
|
|
189
189
|
id: "task_" + now + "_" + randomBytes(3).toString("hex"),
|
|
190
190
|
name: data.name,
|
|
191
191
|
prompt: data.prompt,
|
|
@@ -202,8 +202,8 @@ export function createTask(data) {
|
|
|
202
202
|
return task;
|
|
203
203
|
}
|
|
204
204
|
export function updateTask(taskId, data) {
|
|
205
|
-
|
|
206
|
-
for (
|
|
205
|
+
let task = null;
|
|
206
|
+
for (let i = 0; i < tasks.length; i++) {
|
|
207
207
|
if (tasks[i].id === taskId) {
|
|
208
208
|
task = tasks[i];
|
|
209
209
|
break;
|
|
@@ -212,7 +212,7 @@ export function updateTask(taskId, data) {
|
|
|
212
212
|
if (!task)
|
|
213
213
|
return null;
|
|
214
214
|
if (data.cron && data.cron !== task.cron) {
|
|
215
|
-
|
|
215
|
+
const parsed = parseCron(data.cron);
|
|
216
216
|
if (!parsed)
|
|
217
217
|
return null;
|
|
218
218
|
task.cron = data.cron;
|
|
@@ -227,8 +227,8 @@ export function updateTask(taskId, data) {
|
|
|
227
227
|
return task;
|
|
228
228
|
}
|
|
229
229
|
export function deleteTask(taskId) {
|
|
230
|
-
|
|
231
|
-
for (
|
|
230
|
+
let idx = -1;
|
|
231
|
+
for (let i = 0; i < tasks.length; i++) {
|
|
232
232
|
if (tasks[i].id === taskId) {
|
|
233
233
|
idx = i;
|
|
234
234
|
break;
|
|
@@ -242,8 +242,8 @@ export function deleteTask(taskId) {
|
|
|
242
242
|
return true;
|
|
243
243
|
}
|
|
244
244
|
export function toggleTask(taskId) {
|
|
245
|
-
|
|
246
|
-
for (
|
|
245
|
+
let task = null;
|
|
246
|
+
for (let i = 0; i < tasks.length; i++) {
|
|
247
247
|
if (tasks[i].id === taskId) {
|
|
248
248
|
task = tasks[i];
|
|
249
249
|
break;
|