@aiderdesk/aiderdesk 0.61.0 → 0.62.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/out/renderer/assets/{_baseUniq-BPF2Herp.js → _baseUniq-B7TxjYgy.js} +1 -1
- package/out/renderer/assets/abap-B7h4dtBh.js +7 -0
- package/out/renderer/assets/actionscript-3-DtnkuHN2.js +7 -0
- package/out/renderer/assets/ada-BZS802Se.js +7 -0
- package/out/renderer/assets/andromeeda-C847lm7Z.js +4 -0
- package/out/renderer/assets/angular-html-BYG42TJr.js +42 -0
- package/out/renderer/assets/angular-ts-BftcHvZ6.js +29 -0
- package/out/renderer/assets/apache-D4roVlsU.js +7 -0
- package/out/renderer/assets/apex-B-mI3Md2.js +7 -0
- package/out/renderer/assets/apl-CGZawg-A.js +18 -0
- package/out/renderer/assets/applescript-C43Knf0G.js +7 -0
- package/out/renderer/assets/ara-DRBH84ND.js +7 -0
- package/out/renderer/assets/{arc-DfPLteHF.js → arc-TuVjX2tH.js} +1 -1
- package/out/renderer/assets/{architectureDiagram-Q4EWVU46-Bw0u-sSH.js → architectureDiagram-Q4EWVU46-CnAcyRvO.js} +5 -5
- package/out/renderer/assets/asciidoc-CT8_dLUs.js +7 -0
- package/out/renderer/assets/asm-3tg4MVib.js +7 -0
- package/out/renderer/assets/astro-BxdWOZvM.js +19 -0
- package/out/renderer/assets/aurora-x-wJ4-eM2h.js +4 -0
- package/out/renderer/assets/awk-ChreaG-G.js +7 -0
- package/out/renderer/assets/ayu-dark-rtpbXCNg.js +4 -0
- package/out/renderer/assets/ayu-light-BCZDSyV8.js +4 -0
- package/out/renderer/assets/ayu-mirage-BVoH71sA.js +4 -0
- package/out/renderer/assets/ballerina-B0yt0TYU.js +7 -0
- package/out/renderer/assets/bat-BzNgQIA7.js +7 -0
- package/out/renderer/assets/beancount-aZWrE5WV.js +7 -0
- package/out/renderer/assets/berry--Qc8OslH.js +7 -0
- package/out/renderer/assets/bibtex-BLeFwAes.js +7 -0
- package/out/renderer/assets/bicep-DbBeGdXQ.js +7 -0
- package/out/renderer/assets/bird2-aXhIUHPg.js +7 -0
- package/out/renderer/assets/blade-BbH7YAUi.js +22 -0
- package/out/renderer/assets/{blockDiagram-DXYQGD6D-CkfB9if8.js → blockDiagram-DXYQGD6D-DBoJhGAM.js} +6 -6
- package/out/renderer/assets/bsl-DwPS0BId.js +9 -0
- package/out/renderer/assets/c-C4VtT7JA.js +7 -0
- package/out/renderer/assets/c3-CWHczQMq.js +7 -0
- package/out/renderer/assets/{c4Diagram-AHTNJAMY-DweK9Liz.js → c4Diagram-AHTNJAMY-BzW0gKwX.js} +2 -2
- package/out/renderer/assets/cadence-S_NtR5Dy.js +7 -0
- package/out/renderer/assets/cairo-BtYx2aM5.js +9 -0
- package/out/renderer/assets/catppuccin-frappe-C21OPQfC.js +4 -0
- package/out/renderer/assets/catppuccin-latte-0ZtXlsrX.js +4 -0
- package/out/renderer/assets/catppuccin-macchiato-BD_FR4sl.js +4 -0
- package/out/renderer/assets/catppuccin-mocha-C653csR5.js +4 -0
- package/out/renderer/assets/{channel-C5wwrRof.js → channel-CqR4FAVX.js} +1 -1
- package/out/renderer/assets/{chunk-4BX2VUAB-0KM14cFd.js → chunk-4BX2VUAB-DQjg_Naa.js} +1 -1
- package/out/renderer/assets/{chunk-4TB4RGXK-CmVtCVL4.js → chunk-4TB4RGXK-DkcI1yaW.js} +5 -5
- package/out/renderer/assets/{chunk-55IACEB6-BzVYZvBM.js → chunk-55IACEB6-pFPEMTmI.js} +1 -1
- package/out/renderer/assets/{chunk-EDXVE4YY-BryQl5Kv.js → chunk-EDXVE4YY-DRk838hn.js} +1 -1
- package/out/renderer/assets/{chunk-FMBD7UC4-CRiLea_e.js → chunk-FMBD7UC4-BagQdd5u.js} +1 -1
- package/out/renderer/assets/{chunk-OYMX7WX6-Cpi4N3NO.js → chunk-OYMX7WX6-DOGJ-XHp.js} +3 -3
- package/out/renderer/assets/{chunk-QZHKN3VN-BT8kABWC.js → chunk-QZHKN3VN-CdzjbbBk.js} +1 -1
- package/out/renderer/assets/{chunk-YZCP3GAM-OLZV_Sef.js → chunk-YZCP3GAM-BKZRTlUj.js} +1 -1
- package/out/renderer/assets/clarity-D2ViJC0i.js +7 -0
- package/out/renderer/assets/{classDiagram-6PBFFD2Q-VdE6G90i.js → classDiagram-6PBFFD2Q-CjVhmlxb.js} +6 -6
- package/out/renderer/assets/{classDiagram-v2-HSJHXN6E-VdE6G90i.js → classDiagram-v2-HSJHXN6E-CjVhmlxb.js} +6 -6
- package/out/renderer/assets/clojure-C_G4_w5x.js +7 -0
- package/out/renderer/assets/{clone-DwQZ86nS.js → clone-B-kqpcr4.js} +1 -1
- package/out/renderer/assets/cmake-CDfQILeU.js +7 -0
- package/out/renderer/assets/cobol-B8r1pfPr.js +13 -0
- package/out/renderer/assets/codeowners-awy7PWCD.js +7 -0
- package/out/renderer/assets/codeql-lfK8ppuq.js +7 -0
- package/out/renderer/assets/coffee-XLjtuEYs.js +9 -0
- package/out/renderer/assets/common-lisp-DAq1kaby.js +7 -0
- package/out/renderer/assets/coq-l_JvzFJl.js +7 -0
- package/out/renderer/assets/{cose-bilkent-S5V4N54A-BEcAKM9H.js → cose-bilkent-S5V4N54A-CZLRecVB.js} +1 -1
- package/out/renderer/assets/cpp-zh2ePAE_.js +22 -0
- package/out/renderer/assets/crystal-BqBRy7Ec.js +19 -0
- package/out/renderer/assets/csharp-DxX_6tHh.js +7 -0
- package/out/renderer/assets/css-BtVcDqlU.js +7 -0
- package/out/renderer/assets/csv-Ba84L8e5.js +7 -0
- package/out/renderer/assets/cue-BFSVLV6N.js +7 -0
- package/out/renderer/assets/cypher-DbUmWIxC.js +7 -0
- package/out/renderer/assets/d-9qSZPw74.js +7 -0
- package/out/renderer/assets/{dagre-KV5264BT-BcFQYL1M.js → dagre-KV5264BT-BUAzC7Um.js} +6 -6
- package/out/renderer/assets/dark-plus-DmZ1Dzd4.js +4 -0
- package/out/renderer/assets/dart-CCSsOg9l.js +7 -0
- package/out/renderer/assets/dax-CvsmLV-B.js +7 -0
- package/out/renderer/assets/desktop-_xiGZ9X1.js +7 -0
- package/out/renderer/assets/{diagram-5BDNPKRD-GrUNdC1u.js → diagram-5BDNPKRD-DNQEDszc.js} +6 -6
- package/out/renderer/assets/{diagram-G4DWMVQ6-CG4S-ov5.js → diagram-G4DWMVQ6-D9YY6W2O.js} +6 -6
- package/out/renderer/assets/{diagram-MMDJMWI5-9ogY3MRC.js → diagram-MMDJMWI5-B5H49OVD.js} +5 -5
- package/out/renderer/assets/{diagram-TYMM5635-Ck7mI1bS.js → diagram-TYMM5635-Bw7r467p.js} +5 -5
- package/out/renderer/assets/diff-BEdzuHlE.js +7 -0
- package/out/renderer/assets/docker-CUaLOm2I.js +7 -0
- package/out/renderer/assets/dotenv-Bb4iNxXK.js +7 -0
- package/out/renderer/assets/dracula-B8-AVrwI.js +4 -0
- package/out/renderer/assets/dracula-soft-BHeefow7.js +4 -0
- package/out/renderer/assets/dream-maker-CNLQpoF-.js +7 -0
- package/out/renderer/assets/edge-CnHxQ_FD.js +15 -0
- package/out/renderer/assets/elixir-B_LIBv5J.js +11 -0
- package/out/renderer/assets/elm-BlO7pcFp.js +10 -0
- package/out/renderer/assets/emacs-lisp-4gdXY_g3.js +7 -0
- package/out/renderer/assets/{erDiagram-SMLLAGMA-Dvf_c-7M.js → erDiagram-SMLLAGMA-Bz4ALNLp.js} +4 -4
- package/out/renderer/assets/erb-Bzn22wO6.js +28 -0
- package/out/renderer/assets/erlang-Ch5kuXHm.js +9 -0
- package/out/renderer/assets/everforest-dark-Cg1xdODP.js +4 -0
- package/out/renderer/assets/everforest-light-BmTD3bxe.js +4 -0
- package/out/renderer/assets/fennel-BTELNkeT.js +7 -0
- package/out/renderer/assets/fish-kGF2-4SL.js +7 -0
- package/out/renderer/assets/{flowDiagram-DWJPFMVM-CPDjOXYp.js → flowDiagram-DWJPFMVM-Uqg1ZeN2.js} +6 -6
- package/out/renderer/assets/fluent-YyC28MRr.js +7 -0
- package/out/renderer/assets/fortran-fixed-form-CpmOyvS5.js +9 -0
- package/out/renderer/assets/fortran-free-form-5X94ETMi.js +7 -0
- package/out/renderer/assets/fsharp-5vtGqRR9.js +9 -0
- package/out/renderer/assets/{ganttDiagram-T4ZO3ILL-B4dJrK-3.js → ganttDiagram-T4ZO3ILL-Dm0tRLCH.js} +1 -1
- package/out/renderer/assets/gdresource-B5TLWiFO.js +11 -0
- package/out/renderer/assets/gdscript-CNW3Aj-d.js +7 -0
- package/out/renderer/assets/gdshader-BEzE4j_3.js +7 -0
- package/out/renderer/assets/genie-BvhtM5Ga.js +7 -0
- package/out/renderer/assets/gherkin-xCNF9gh8.js +7 -0
- package/out/renderer/assets/git-commit-PP9xCApN.js +9 -0
- package/out/renderer/assets/git-rebase-D-XQSvDj.js +9 -0
- package/out/renderer/assets/{gitGraphDiagram-UUTBAWPF-De2eCfMN.js → gitGraphDiagram-UUTBAWPF-R8imfIrj.js} +6 -6
- package/out/renderer/assets/github-dark-O22yVQaY.js +4 -0
- package/out/renderer/assets/github-dark-default-DB2Hkvqn.js +4 -0
- package/out/renderer/assets/github-dark-dimmed-CMZ_OfqC.js +4 -0
- package/out/renderer/assets/github-dark-high-contrast-DmxWVmCU.js +4 -0
- package/out/renderer/assets/github-light-BTbR9xVK.js +4 -0
- package/out/renderer/assets/github-light-default-DWEonwFe.js +4 -0
- package/out/renderer/assets/github-light-high-contrast-WJ_cPDts.js +4 -0
- package/out/renderer/assets/gleam-LmNxrMsN.js +7 -0
- package/out/renderer/assets/glimmer-js-h2QNNiD7.js +15 -0
- package/out/renderer/assets/glimmer-ts-Bk3uX6Ae.js +15 -0
- package/out/renderer/assets/glsl-CGsiYPcu.js +9 -0
- package/out/renderer/assets/gn-OUMx7fqt.js +7 -0
- package/out/renderer/assets/gnuplot-tV8vezdE.js +7 -0
- package/out/renderer/assets/go-DRMr3iML.js +7 -0
- package/out/renderer/assets/{graph-BFn23kR_.js → graph-B5YWEnt0.js} +2 -2
- package/out/renderer/assets/graphql-CwmtR1ib.js +15 -0
- package/out/renderer/assets/groovy-Bn4MhXgW.js +7 -0
- package/out/renderer/assets/gruvbox-dark-hard-DVsRsETr.js +4 -0
- package/out/renderer/assets/gruvbox-dark-medium-B5JBrQdg.js +4 -0
- package/out/renderer/assets/gruvbox-dark-soft-Db-YOqRx.js +4 -0
- package/out/renderer/assets/gruvbox-light-hard-CXzJt7DI.js +4 -0
- package/out/renderer/assets/gruvbox-light-medium-B89RAI1Y.js +4 -0
- package/out/renderer/assets/gruvbox-light-soft-Cs0hTZYv.js +4 -0
- package/out/renderer/assets/hack-BTX3ICIE.js +13 -0
- package/out/renderer/assets/haml-DrIklt7F.js +11 -0
- package/out/renderer/assets/handlebars-yWFGGD2R.js +15 -0
- package/out/renderer/assets/haskell-CzPS7wjM.js +7 -0
- package/out/renderer/assets/haxe-BpobLYM9.js +7 -0
- package/out/renderer/assets/hcl-axoq0Ycu.js +7 -0
- package/out/renderer/assets/hjson-I7LcauIB.js +7 -0
- package/out/renderer/assets/hlsl-TRzjajlb.js +7 -0
- package/out/renderer/assets/horizon-DWzh3z5C.js +4 -0
- package/out/renderer/assets/horizon-bright-C1AFkPsv.js +4 -0
- package/out/renderer/assets/houston-CF_ws8Cq.js +4 -0
- package/out/renderer/assets/html-GC16tDh9.js +11 -0
- package/out/renderer/assets/html-derivative-HU9p64q4.js +11 -0
- package/out/renderer/assets/http-DjsOm9E4.js +20 -0
- package/out/renderer/assets/hurl-Am2cDU4f.js +18 -0
- package/out/renderer/assets/hxml-Jle7oGdm.js +9 -0
- package/out/renderer/assets/hy-B1k9U6S8.js +7 -0
- package/out/renderer/assets/imba-C4923lSV.js +7 -0
- package/out/renderer/assets/{index-BkntVzTm.css → index-B6Zj03wk.css} +82 -24
- package/out/renderer/assets/{index-BL-57WPa.js → index-D7Xi0GX5.js} +30034 -9238
- package/out/renderer/assets/{infoDiagram-42DDH7IO-BIt9B6mQ.js → infoDiagram-42DDH7IO-CWPYNP1k.js} +4 -4
- package/out/renderer/assets/ini-B84Ha1bx.js +7 -0
- package/out/renderer/assets/{ishikawaDiagram-UXIWVN3A-CXZs0KGV.js → ishikawaDiagram-UXIWVN3A-CFTrc-S6.js} +1 -1
- package/out/renderer/assets/java-BfXh-0uJ.js +7 -0
- package/out/renderer/assets/javascript-BsAkV7mL.js +7 -0
- package/out/renderer/assets/jinja-FkIlHBgj.js +16 -0
- package/out/renderer/assets/jison-BkdOIOd4.js +9 -0
- package/out/renderer/assets/{journeyDiagram-VCZTEJTY-B-EXuj5b.js → journeyDiagram-VCZTEJTY-Dfd-piIf.js} +4 -4
- package/out/renderer/assets/json-TjWBGEk1.js +7 -0
- package/out/renderer/assets/json5-DCGCKrmX.js +7 -0
- package/out/renderer/assets/jsonc-DLVLp8id.js +7 -0
- package/out/renderer/assets/jsonl-B-R_pDGg.js +7 -0
- package/out/renderer/assets/jsonnet-Cs8BnnC6.js +7 -0
- package/out/renderer/assets/jssm-DDuANZ2u.js +7 -0
- package/out/renderer/assets/jsx-BPmvoin2.js +7 -0
- package/out/renderer/assets/julia-CU_UwNb8.js +20 -0
- package/out/renderer/assets/just-tGFryTtU.js +34 -0
- package/out/renderer/assets/kanagawa-dragon-DU8n2NNT.js +4 -0
- package/out/renderer/assets/kanagawa-lotus-Byd0CDet.js +4 -0
- package/out/renderer/assets/kanagawa-wave-DExoagcR.js +4 -0
- package/out/renderer/assets/{kanban-definition-6JOO6SKY-ByvN0qaD.js → kanban-definition-6JOO6SKY-BocrfAtb.js} +2 -2
- package/out/renderer/assets/kdl-DzNQTDs7.js +7 -0
- package/out/renderer/assets/kotlin-BM2ZNTMh.js +7 -0
- package/out/renderer/assets/kusto-dtpuxMFE.js +7 -0
- package/out/renderer/assets/laserwave-DF03wMlf.js +4 -0
- package/out/renderer/assets/latex-B0gTO9uZ.js +10 -0
- package/out/renderer/assets/{layout-BpybWUv6.js → layout-DHzrXVin.js} +4 -4
- package/out/renderer/assets/lean-CTow-IzD.js +7 -0
- package/out/renderer/assets/less-BAzLMJNR.js +7 -0
- package/out/renderer/assets/light-plus-DS08Xg5J.js +4 -0
- package/out/renderer/assets/liquid-QmJ_LYTW.js +15 -0
- package/out/renderer/assets/llvm-CTKcAHbb.js +7 -0
- package/out/renderer/assets/log-BF22rfM9.js +7 -0
- package/out/renderer/assets/logo-D9l7oEJ8.js +7 -0
- package/out/renderer/assets/lua-BVbbqwZC.js +9 -0
- package/out/renderer/assets/luau-CdZ6BoEa.js +7 -0
- package/out/renderer/assets/make-DLtqaK4D.js +7 -0
- package/out/renderer/assets/markdown-F_EULe_G.js +7 -0
- package/out/renderer/assets/marko-BAWrmNIa.js +15 -0
- package/out/renderer/assets/material-theme-B8B2U48Q.js +4 -0
- package/out/renderer/assets/material-theme-darker-BV0iY_T3.js +4 -0
- package/out/renderer/assets/material-theme-lighter-DrzybSTF.js +4 -0
- package/out/renderer/assets/material-theme-ocean-BRPLVReX.js +4 -0
- package/out/renderer/assets/material-theme-palenight-DSJwsR_D.js +4 -0
- package/out/renderer/assets/matlab-7XHduepk.js +7 -0
- package/out/renderer/assets/mdc-Ca0ft0PS.js +16 -0
- package/out/renderer/assets/mdx-D5wExp-O.js +7 -0
- package/out/renderer/assets/mermaid-z_1ejSlp.js +7 -0
- package/out/renderer/assets/{min-DB8ixvoT.js → min-D6g96v7R.js} +2 -2
- package/out/renderer/assets/min-dark-BNaN9fWk.js +4 -0
- package/out/renderer/assets/min-light-CMrjentn.js +4 -0
- package/out/renderer/assets/{mindmap-definition-QFDTVHPH-Do-I-At8.js → mindmap-definition-QFDTVHPH-D9cyK1Gb.js} +3 -3
- package/out/renderer/assets/mipsasm-BQyyUrpa.js +7 -0
- package/out/renderer/assets/mojo-ByCRDvCf.js +7 -0
- package/out/renderer/assets/monokai-DelygWXa.js +4 -0
- package/out/renderer/assets/moonbit-CqjK87KZ.js +7 -0
- package/out/renderer/assets/move-DhTNmxqC.js +7 -0
- package/out/renderer/assets/narrat-CLjGcbCy.js +7 -0
- package/out/renderer/assets/nextflow-B166B-y1.js +9 -0
- package/out/renderer/assets/nextflow-groovy-BOO9s0iq.js +7 -0
- package/out/renderer/assets/nginx-BFAkI5_-.js +10 -0
- package/out/renderer/assets/night-owl-DSS199ra.js +4 -0
- package/out/renderer/assets/night-owl-light-gC6E-Eh2.js +4 -0
- package/out/renderer/assets/nim-B3PAIZ4D.js +22 -0
- package/out/renderer/assets/nix-ByWcmvXF.js +12 -0
- package/out/renderer/assets/nord-CvDbBq5M.js +4 -0
- package/out/renderer/assets/nushell-DB8ZUEbK.js +7 -0
- package/out/renderer/assets/objective-c-BRoNQF42.js +7 -0
- package/out/renderer/assets/objective-cpp-DEoN9Fe5.js +7 -0
- package/out/renderer/assets/ocaml-B1kfGk9Y.js +7 -0
- package/out/renderer/assets/odin-CNQ56Ay2.js +7 -0
- package/out/renderer/assets/one-dark-pro-CsMf0BoJ.js +4 -0
- package/out/renderer/assets/one-light-B0cTzZyr.js +4 -0
- package/out/renderer/assets/openscad-C_m7ehZF.js +7 -0
- package/out/renderer/assets/pascal-CU8Kjkr_.js +7 -0
- package/out/renderer/assets/perl-HITCDkgu.js +18 -0
- package/out/renderer/assets/php-C2HieitX.js +20 -0
- package/out/renderer/assets/{pieDiagram-DEJITSTG-Cnpf6Gt6.js → pieDiagram-DEJITSTG-LUWwVJA5.js} +6 -6
- package/out/renderer/assets/pierre-dark-DADY5eR0.js +4 -0
- package/out/renderer/assets/pierre-light-DUjirxKp.js +4 -0
- package/out/renderer/assets/pkl-BsByaYax.js +7 -0
- package/out/renderer/assets/plastic-BjwMpBc0.js +4 -0
- package/out/renderer/assets/plsql-B3Na24V4.js +7 -0
- package/out/renderer/assets/po-BajfNjc5.js +7 -0
- package/out/renderer/assets/poimandres-ChWyhPrn.js +4 -0
- package/out/renderer/assets/polar-BB-dlxnO.js +7 -0
- package/out/renderer/assets/postcss-kj1IbjVd.js +7 -0
- package/out/renderer/assets/powerquery-B-e1fO-k.js +7 -0
- package/out/renderer/assets/powershell-BcMVbGpk.js +7 -0
- package/out/renderer/assets/prisma-bmxcSDxq.js +7 -0
- package/out/renderer/assets/prolog-BT9GCzqD.js +7 -0
- package/out/renderer/assets/proto-Ds-m32NR.js +7 -0
- package/out/renderer/assets/pug-BwQB43qN.js +13 -0
- package/out/renderer/assets/puppet-N15G4Usj.js +7 -0
- package/out/renderer/assets/purescript-DrwsEYNH.js +7 -0
- package/out/renderer/assets/python-CrdIx4PZ.js +7 -0
- package/out/renderer/assets/qml-jtL8okyu.js +9 -0
- package/out/renderer/assets/qmldir-DuMSk0Oz.js +7 -0
- package/out/renderer/assets/qss-BFrB6p4y.js +7 -0
- package/out/renderer/assets/{quadrantDiagram-34T5L4WZ-VcOb1qLd.js → quadrantDiagram-34T5L4WZ-DdWTi9yW.js} +1 -1
- package/out/renderer/assets/r-Dpdc-Kyk.js +7 -0
- package/out/renderer/assets/racket-DbA06HL7.js +7 -0
- package/out/renderer/assets/raku-6v-Y17bs.js +7 -0
- package/out/renderer/assets/razor-gBXW6YBJ.js +13 -0
- package/out/renderer/assets/red-DByOl5N0.js +4 -0
- package/out/renderer/assets/reg-CULnG2WX.js +7 -0
- package/out/renderer/assets/regexp-BxWeO75u.js +7 -0
- package/out/renderer/assets/rel-CHRwzjd4.js +7 -0
- package/out/renderer/assets/{requirementDiagram-MS252O5E-VJs9Hpaw.js → requirementDiagram-MS252O5E-BoLT3tay.js} +3 -3
- package/out/renderer/assets/riscv-BNQ9cVpw.js +7 -0
- package/out/renderer/assets/ron-CUEPaFZU.js +7 -0
- package/out/renderer/assets/rose-pine-B-kZ4Z9q.js +4 -0
- package/out/renderer/assets/rose-pine-dawn-efeVGdSI.js +4 -0
- package/out/renderer/assets/rose-pine-moon-DmodZNzl.js +4 -0
- package/out/renderer/assets/rosmsg-Bfahr6vb.js +7 -0
- package/out/renderer/assets/rst-by6KAwTb.js +37 -0
- package/out/renderer/assets/ruby-C13Bjepi.js +37 -0
- package/out/renderer/assets/rust-CMNYZh5a.js +7 -0
- package/out/renderer/assets/{sankeyDiagram-XADWPNL6-BoXxgLvi.js → sankeyDiagram-XADWPNL6-B4gY_QI-.js} +1 -1
- package/out/renderer/assets/sas-BLBgC3TA.js +9 -0
- package/out/renderer/assets/sass-BheygBdF.js +7 -0
- package/out/renderer/assets/scala-B-_7vFVn.js +7 -0
- package/out/renderer/assets/scheme-BSHdPinv.js +7 -0
- package/out/renderer/assets/scss-Dq-LbI_c.js +9 -0
- package/out/renderer/assets/sdbl-BBUhycGU.js +7 -0
- package/out/renderer/assets/{sequenceDiagram-FGHM5R23-b69hQjSp.js → sequenceDiagram-FGHM5R23-B-JJvxQW.js} +3 -3
- package/out/renderer/assets/shaderlab-C07uO3dL.js +9 -0
- package/out/renderer/assets/shellscript-CQ8MXh-D.js +7 -0
- package/out/renderer/assets/shellsession-CkeTp4M1.js +9 -0
- package/out/renderer/assets/slack-dark-BEe10hxO.js +4 -0
- package/out/renderer/assets/slack-ochin-BKmu9pBc.js +4 -0
- package/out/renderer/assets/smalltalk-qxcGy4fT.js +7 -0
- package/out/renderer/assets/snazzy-light-Dcvd-ZyI.js +4 -0
- package/out/renderer/assets/solarized-dark-BBl5y5sR.js +4 -0
- package/out/renderer/assets/solarized-light-DW9b_AY8.js +4 -0
- package/out/renderer/assets/solidity-CSTQ0FCC.js +7 -0
- package/out/renderer/assets/soy-BHaHgMUy.js +11 -0
- package/out/renderer/assets/sparql-DswowMAp.js +9 -0
- package/out/renderer/assets/splunk-DcGJXIDa.js +7 -0
- package/out/renderer/assets/sql-DzUuSofg.js +7 -0
- package/out/renderer/assets/ssh-config-Bk_I5wDR.js +7 -0
- package/out/renderer/assets/stata-Dl7wDdBE.js +9 -0
- package/out/renderer/assets/{stateDiagram-FHFEXIEX-BK7E-REm.js → stateDiagram-FHFEXIEX-BntwOBUs.js} +8 -8
- package/out/renderer/assets/{stateDiagram-v2-QKLJ7IA2-Cd2wfCQu.js → stateDiagram-v2-QKLJ7IA2-C__eWVIe.js} +4 -4
- package/out/renderer/assets/stylus-DXFa_2Jl.js +7 -0
- package/out/renderer/assets/surrealql-Bs3vUeKA.js +9 -0
- package/out/renderer/assets/svelte-fC0HkEkx.js +15 -0
- package/out/renderer/assets/swift-Cohr-WZC.js +7 -0
- package/out/renderer/assets/synthwave-84-CoUef9sh.js +4 -0
- package/out/renderer/assets/system-verilog-BcESSvRn.js +7 -0
- package/out/renderer/assets/systemd-DJPFjU02.js +7 -0
- package/out/renderer/assets/talonscript-CEEMXJTH.js +7 -0
- package/out/renderer/assets/tasl-DfOr2qHi.js +7 -0
- package/out/renderer/assets/tcl-CTsc4-t7.js +7 -0
- package/out/renderer/assets/templ-CSEiQwNm.js +13 -0
- package/out/renderer/assets/terraform-CeztUfUr.js +7 -0
- package/out/renderer/assets/tex-CGVqF8nD.js +9 -0
- package/out/renderer/assets/{timeline-definition-GMOUNBTQ-Bl-MTfK5.js → timeline-definition-GMOUNBTQ-C7ch2INk.js} +2 -2
- package/out/renderer/assets/tokyo-night-DjtLpAEY.js +4 -0
- package/out/renderer/assets/toml-vHPzWDj6.js +7 -0
- package/out/renderer/assets/ts-tags-cG2hZuda.js +54 -0
- package/out/renderer/assets/tsv-ChRVFvMy.js +7 -0
- package/out/renderer/assets/tsx-CmGGo4Hm.js +7 -0
- package/out/renderer/assets/turtle-BnC7StHY.js +7 -0
- package/out/renderer/assets/twig-CwEEYIBf.js +36 -0
- package/out/renderer/assets/typescript-CP6ECzON.js +7 -0
- package/out/renderer/assets/typespec-CkDVVIcK.js +7 -0
- package/out/renderer/assets/typst-XYLFxYau.js +7 -0
- package/out/renderer/assets/v-BSYXvR4g.js +7 -0
- package/out/renderer/assets/vala-qJa5rry9.js +7 -0
- package/out/renderer/assets/vb-Bzg9rspf.js +7 -0
- package/out/renderer/assets/{vennDiagram-DHZGUBPP-DNmr1k2L.js → vennDiagram-DHZGUBPP-CQ__NSue.js} +1 -1
- package/out/renderer/assets/verilog-CCb_iTfF.js +7 -0
- package/out/renderer/assets/vesper-4Q1cEwPL.js +4 -0
- package/out/renderer/assets/vhdl-DMqk4T2s.js +7 -0
- package/out/renderer/assets/viml--FINbfoq.js +7 -0
- package/out/renderer/assets/vitesse-black-BqNLki8b.js +4 -0
- package/out/renderer/assets/vitesse-dark-jJ32WhwH.js +4 -0
- package/out/renderer/assets/vitesse-light-476zM4e6.js +4 -0
- package/out/renderer/assets/vue-K-7Ga-y8.js +40 -0
- package/out/renderer/assets/vue-html-DhreShjd.js +9 -0
- package/out/renderer/assets/vue-vine-rMIwOpFf.js +19 -0
- package/out/renderer/assets/vyper-DP4whl13.js +7 -0
- package/out/renderer/assets/{wardley-RL74JXVD-DTbxPMj9.js → wardley-RL74JXVD-Kh6mNiRV.js} +3 -3
- package/out/renderer/assets/{wardleyDiagram-NUSXRM2D-BWw08wtD.js → wardleyDiagram-NUSXRM2D-CfRYzJMU.js} +5 -5
- package/out/renderer/assets/wasm-BBh6f151.js +7 -0
- package/out/renderer/assets/wasm-DDgzZJey.js +10 -0
- package/out/renderer/assets/wenyan-BdqozpMZ.js +7 -0
- package/out/renderer/assets/wgsl-Vo-hHVWH.js +7 -0
- package/out/renderer/assets/wikitext-BDjE6pmL.js +7 -0
- package/out/renderer/assets/wit-C_nQzOkY.js +7 -0
- package/out/renderer/assets/wolfram-CRmjUoI4.js +7 -0
- package/out/renderer/assets/xml-BMzZeaqs.js +9 -0
- package/out/renderer/assets/xsl-CnwVr_6q.js +10 -0
- package/out/renderer/assets/{xychartDiagram-5P7HB3ND-EEYPnLDT.js → xychartDiagram-5P7HB3ND-BFq2zIne.js} +1 -1
- package/out/renderer/assets/yaml-B_vW5iTY.js +7 -0
- package/out/renderer/assets/zenscript-DFINJL6j.js +7 -0
- package/out/renderer/assets/zig-CS4FMAZp.js +7 -0
- package/out/renderer/index.html +2 -2
- package/out/resources/linux/probe +0 -0
- package/out/resources/linux-x64/probe +0 -0
- package/out/resources/mcp-server/aider-desk-mcp-server.js +16 -1
- package/out/resources/prompts/code-change-requests.hbs +21 -0
- package/out/resources/skills/extension-creator/SKILL.md +345 -0
- package/out/resources/skills/extension-creator/assets/templates/Component.jsx.template +76 -0
- package/out/resources/skills/extension-creator/assets/templates/ConfigComponent.jsx.template +38 -0
- package/out/resources/skills/extension-creator/assets/templates/folder-extension/config.ts.template +29 -0
- package/out/resources/skills/extension-creator/assets/templates/folder-extension/index.ts.template +42 -0
- package/out/resources/skills/extension-creator/assets/templates/folder-extension/package.json +12 -0
- package/out/resources/skills/extension-creator/assets/templates/folder-extension/tsconfig.json +23 -0
- package/out/resources/skills/extension-creator/assets/templates/folder-extension-with-config/index.ts.template +80 -0
- package/out/resources/skills/extension-creator/assets/templates/single-file.ts.template +30 -0
- package/out/resources/skills/extension-creator/assets/templates/ui-component-external.ts.template +91 -0
- package/out/resources/skills/extension-creator/assets/templates/ui-component.ts.template +79 -0
- package/out/resources/skills/extension-creator/references/command-definition.md +170 -0
- package/out/resources/skills/extension-creator/references/config-components.md +427 -0
- package/out/resources/skills/extension-creator/references/event-types.md +156 -0
- package/out/resources/skills/extension-creator/references/examples-gallery.md +583 -0
- package/out/resources/skills/extension-creator/references/extension-interface.md +306 -0
- package/out/resources/skills/extension-creator/references/extension-types.md +186 -0
- package/out/resources/skills/extension-creator/references/in-repo-flow.md +132 -0
- package/out/resources/skills/extension-creator/references/install-targets.md +96 -0
- package/out/resources/skills/extension-creator/references/project-global-flow.md +76 -0
- package/out/resources/skills/extension-creator/references/ui-components.md +663 -0
- package/out/runner.js +509 -164
- package/package.json +11 -9
- package/out/resources/prompts/code-inline-request.hbs +0 -16
- /package/patches/{ai+5.0.167.patch → ai+5.0.172.patch} +0 -0
|
@@ -0,0 +1,583 @@
|
|
|
1
|
+
# Examples Gallery
|
|
2
|
+
|
|
3
|
+
Real extension examples from the AiderDesk repository.
|
|
4
|
+
|
|
5
|
+
## Single-File Examples
|
|
6
|
+
|
|
7
|
+
### Theme Switcher (Commands)
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
// theme.ts - Adds /theme command
|
|
11
|
+
import type { Extension, ExtensionContext, CommandDefinition } from '@aiderdesk/extensions';
|
|
12
|
+
|
|
13
|
+
const AVAILABLE_THEMES = ['dark', 'light', 'ocean', 'forest'];
|
|
14
|
+
|
|
15
|
+
const THEME_COMMAND: CommandDefinition = {
|
|
16
|
+
name: 'theme',
|
|
17
|
+
description: 'Switch the AiderDesk theme',
|
|
18
|
+
arguments: [
|
|
19
|
+
{ description: 'Theme name', required: true, options: AVAILABLE_THEMES }
|
|
20
|
+
],
|
|
21
|
+
async execute(args: string[], context: ExtensionContext): Promise<void> {
|
|
22
|
+
const themeName = args[0];
|
|
23
|
+
await context.updateSettings({ theme: themeName });
|
|
24
|
+
context.getTaskContext()?.addLogMessage('info', `Theme: ${themeName}`);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export default class ThemeExtension implements Extension {
|
|
29
|
+
static metadata = {
|
|
30
|
+
name: 'Theme Extension',
|
|
31
|
+
version: '1.0.0',
|
|
32
|
+
description: 'Adds /theme command',
|
|
33
|
+
author: 'my_git_name',
|
|
34
|
+
capabilities: ['commands'],
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
async onLoad(context: ExtensionContext): Promise<void> {
|
|
38
|
+
// context.log() outputs to backend console only; for user-visible messages use context.getTaskContext()?.addLogMessage()
|
|
39
|
+
context.log('Theme Extension loaded', 'info');
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
getCommands(_context: ExtensionContext): CommandDefinition[] {
|
|
43
|
+
return [THEME_COMMAND];
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### Plan Mode (Modes + Events)
|
|
49
|
+
|
|
50
|
+
```typescript
|
|
51
|
+
// plan-mode.ts - Adds Plan mode with prepended instructions
|
|
52
|
+
import type { Extension, ExtensionContext, ModeDefinition, AgentStartedEvent } from '@aiderdesk/extensions';
|
|
53
|
+
|
|
54
|
+
const PLAN_USER_MESSAGE = 'Create a plan before coding...';
|
|
55
|
+
|
|
56
|
+
export default class PlanModeExtension implements Extension {
|
|
57
|
+
static metadata = {
|
|
58
|
+
name: 'Plan Mode',
|
|
59
|
+
version: '1.0.0',
|
|
60
|
+
description: 'Adds Plan mode',
|
|
61
|
+
author: 'my_git_name',
|
|
62
|
+
capabilities: ['modes', 'events'],
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
getModes(): ModeDefinition[] {
|
|
66
|
+
return [{ name: 'plan', label: 'Plan', description: 'Plan first', icon: 'GoProjectRoadmap' }];
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
async onAgentStarted(event: AgentStartedEvent): Promise<Partial<AgentStartedEvent>> {
|
|
70
|
+
if (event.mode !== 'plan') return {};
|
|
71
|
+
|
|
72
|
+
return {
|
|
73
|
+
contextMessages: [
|
|
74
|
+
{ id: 'plan-user', role: 'user', content: PLAN_USER_MESSAGE },
|
|
75
|
+
{ id: 'plan-assistant', role: 'assistant', content: 'OK, I will plan first.' },
|
|
76
|
+
...event.contextMessages
|
|
77
|
+
]
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### Permission Gate (Blocking)
|
|
84
|
+
|
|
85
|
+
```typescript
|
|
86
|
+
// permission-gate.ts - Blocks dangerous commands
|
|
87
|
+
import type { Extension, ExtensionContext, ToolCalledEvent } from '@aiderdesk/extensions';
|
|
88
|
+
|
|
89
|
+
const DANGEROUS_PATTERNS = ['rm -rf', 'sudo', 'chmod 777'];
|
|
90
|
+
|
|
91
|
+
export default class PermissionGateExtension implements Extension {
|
|
92
|
+
static metadata = {
|
|
93
|
+
name: 'Permission Gate',
|
|
94
|
+
version: '1.0.0',
|
|
95
|
+
description: 'Prompts for dangerous commands',
|
|
96
|
+
author: 'my_git_name',
|
|
97
|
+
capabilities: ['events'],
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
async onToolCalled(event: ToolCalledEvent, context: ExtensionContext): Promise<Partial<ToolCalledEvent>> {
|
|
101
|
+
if (event.tool !== 'power---bash') return {};
|
|
102
|
+
|
|
103
|
+
const command = event.toolInput.command as string;
|
|
104
|
+
if (DANGEROUS_PATTERNS.some(p => command.includes(p))) {
|
|
105
|
+
const taskContext = context.getTaskContext();
|
|
106
|
+
const answer = await taskContext?.askQuestion(
|
|
107
|
+
`Allow dangerous command: ${command}?`,
|
|
108
|
+
{ options: ['Yes', 'No'] }
|
|
109
|
+
);
|
|
110
|
+
if (answer !== 'Yes') {
|
|
111
|
+
return { blocked: true };
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return {};
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## Folder Examples
|
|
120
|
+
|
|
121
|
+
### Tree-Sitter Repo Map (Folder + Dependencies)
|
|
122
|
+
|
|
123
|
+
```
|
|
124
|
+
tree-sitter-repo-map/
|
|
125
|
+
├── index.ts # Main extension
|
|
126
|
+
├── config.ts # Config management
|
|
127
|
+
├── logger.ts # Local logger
|
|
128
|
+
├── constants.ts # Extension constants
|
|
129
|
+
├── repo-map-manager.ts # Core functionality
|
|
130
|
+
├── tree-sitter-parser.ts # Parser wrapper
|
|
131
|
+
├── package.json # Dependencies
|
|
132
|
+
├── tsconfig.json # TS config
|
|
133
|
+
├── README.md # Docs
|
|
134
|
+
└── resources/
|
|
135
|
+
├── wasm/ # Tree-sitter WASM files
|
|
136
|
+
└── queries/ # Language queries
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
Key patterns:
|
|
140
|
+
- Local imports only (no `@/` paths)
|
|
141
|
+
- Config stored in extension directory
|
|
142
|
+
- Resources bundled with extension
|
|
143
|
+
- Singleton manager pattern
|
|
144
|
+
|
|
145
|
+
### Sandbox (External Dependencies)
|
|
146
|
+
|
|
147
|
+
```
|
|
148
|
+
sandbox/
|
|
149
|
+
├── index.ts # Extension implementation
|
|
150
|
+
└── package.json # @anthropic-ai/sandbox-runtime
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
```json
|
|
154
|
+
// package.json
|
|
155
|
+
{
|
|
156
|
+
"dependencies": {
|
|
157
|
+
"@anthropic-ai/sandbox-runtime": "^0.0.38"
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### TPS Counter (UI Components + Data)
|
|
163
|
+
|
|
164
|
+
```typescript
|
|
165
|
+
// tps-counter/index.ts - Display tokens per second metrics
|
|
166
|
+
import { readFileSync } from 'fs';
|
|
167
|
+
import { join } from 'path';
|
|
168
|
+
import type {
|
|
169
|
+
Extension,
|
|
170
|
+
ExtensionContext,
|
|
171
|
+
UIComponentDefinition,
|
|
172
|
+
ResponseChunkEvent,
|
|
173
|
+
ResponseCompletedEvent
|
|
174
|
+
} from '@aiderdesk/extensions';
|
|
175
|
+
|
|
176
|
+
export default class TPSCounterExtension implements Extension {
|
|
177
|
+
static metadata = {
|
|
178
|
+
name: 'TPS Counter',
|
|
179
|
+
version: '1.0.0',
|
|
180
|
+
description: 'Displays tokens per second for responses',
|
|
181
|
+
author: 'my_git_name',
|
|
182
|
+
capabilities: ['metrics', 'ui'],
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
private messageStartTimes = new Map<string, number>();
|
|
186
|
+
private messageTpsData = new Map<string, { tps: number; tokens: number; duration: number }>();
|
|
187
|
+
private currentData = { averageTps: 0, messageCount: 0 };
|
|
188
|
+
|
|
189
|
+
async onResponseChunk(event: ResponseChunkEvent): Promise<void> {
|
|
190
|
+
const messageId = event.chunk.messageId;
|
|
191
|
+
if (!this.messageStartTimes.has(messageId)) {
|
|
192
|
+
this.messageStartTimes.set(messageId, Date.now());
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
async onResponseCompleted(event: ResponseCompletedEvent, context: ExtensionContext): Promise<void> {
|
|
197
|
+
const messageId = event.response.messageId;
|
|
198
|
+
const startTime = this.messageStartTimes.get(messageId);
|
|
199
|
+
if (!startTime) return;
|
|
200
|
+
|
|
201
|
+
const duration = (Date.now() - startTime) / 1000;
|
|
202
|
+
const tokens = event.response.usageReport?.receivedTokens || 0;
|
|
203
|
+
const tps = duration > 0 ? tokens / duration : 0;
|
|
204
|
+
|
|
205
|
+
this.messageTpsData.set(messageId, { tps, tokens, duration });
|
|
206
|
+
this.currentData.averageTps = this.calculateAverage();
|
|
207
|
+
this.currentData.messageCount++;
|
|
208
|
+
|
|
209
|
+
// Trigger UI refresh
|
|
210
|
+
context.triggerUIDataRefresh('tps-counter');
|
|
211
|
+
context.triggerUIDataRefresh('tps-counter-message-bar');
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
getUIComponents(): UIComponentDefinition[] {
|
|
215
|
+
return [
|
|
216
|
+
{
|
|
217
|
+
id: 'tps-counter',
|
|
218
|
+
placement: 'task-usage-info-bottom',
|
|
219
|
+
jsx: readFileSync(join(__dirname, './TPSCounter.jsx'), 'utf-8'),
|
|
220
|
+
loadData: true,
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
id: 'tps-counter-message-bar',
|
|
224
|
+
placement: 'task-message-bar',
|
|
225
|
+
jsx: readFileSync(join(__dirname, './TPSMessageBar.jsx'), 'utf-8'),
|
|
226
|
+
loadData: true,
|
|
227
|
+
},
|
|
228
|
+
];
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
async getUIExtensionData(componentId: string): Promise<unknown> {
|
|
232
|
+
if (componentId === 'tps-counter') {
|
|
233
|
+
return this.currentData;
|
|
234
|
+
}
|
|
235
|
+
if (componentId === 'tps-counter-message-bar') {
|
|
236
|
+
return Object.fromEntries(this.messageTpsData);
|
|
237
|
+
}
|
|
238
|
+
return undefined;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
private calculateAverage(): number {
|
|
242
|
+
// Calculate average TPS from all messages
|
|
243
|
+
const values = Array.from(this.messageTpsData.values());
|
|
244
|
+
return values.reduce((sum, v) => sum + v.tps, 0) / values.length;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
**TPSCounter.jsx:**
|
|
250
|
+
```jsx
|
|
251
|
+
({ data }) => {
|
|
252
|
+
if (!data || data.messageCount === 0) return null;
|
|
253
|
+
|
|
254
|
+
return (
|
|
255
|
+
<div className="flex items-center gap-1 text-2xs mt-1 w-full justify-between">
|
|
256
|
+
<span>Avg. tokens/s:</span>
|
|
257
|
+
<span>{Math.round(data.averageTps)}</span>
|
|
258
|
+
</div>
|
|
259
|
+
);
|
|
260
|
+
}
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
**TPSMessageBar.jsx:**
|
|
264
|
+
```jsx
|
|
265
|
+
({ data, message }) => {
|
|
266
|
+
if (!data || !message?.id) return null;
|
|
267
|
+
|
|
268
|
+
const messageTps = data[message.id];
|
|
269
|
+
if (!messageTps) return null;
|
|
270
|
+
|
|
271
|
+
return (
|
|
272
|
+
<span
|
|
273
|
+
className="text-2xs mt-[4px] text-text-muted"
|
|
274
|
+
title={`${messageTps.tokens} tokens in ${messageTps.duration.toFixed(2)}s`}
|
|
275
|
+
>
|
|
276
|
+
{Math.round(messageTps.tps)} TPS
|
|
277
|
+
</span>
|
|
278
|
+
);
|
|
279
|
+
}
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
### Multi-Model Run (Interactive UI)
|
|
283
|
+
|
|
284
|
+
```typescript
|
|
285
|
+
// multi-model-run/index.ts - Run prompts across multiple models
|
|
286
|
+
import { readFileSync } from 'fs';
|
|
287
|
+
import { join } from 'path';
|
|
288
|
+
import type {
|
|
289
|
+
Extension,
|
|
290
|
+
ExtensionContext,
|
|
291
|
+
UIComponentDefinition,
|
|
292
|
+
PromptStartedEvent
|
|
293
|
+
} from '@aiderdesk/extensions';
|
|
294
|
+
|
|
295
|
+
interface MultiModelState {
|
|
296
|
+
models: Array<{ index: number; modelId: string }>;
|
|
297
|
+
useWorktrees: boolean;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
export default class MultiModelRunExtension implements Extension {
|
|
301
|
+
static metadata = {
|
|
302
|
+
name: 'Multi-Model Run',
|
|
303
|
+
version: '1.0.0',
|
|
304
|
+
description: 'Run prompts across multiple models',
|
|
305
|
+
author: 'my_git_name',
|
|
306
|
+
capabilities: ['ui', 'task-manipulation'],
|
|
307
|
+
};
|
|
308
|
+
|
|
309
|
+
private state: MultiModelState = { models: [], useWorktrees: true };
|
|
310
|
+
|
|
311
|
+
getUIComponents(): UIComponentDefinition[] {
|
|
312
|
+
return [{
|
|
313
|
+
id: 'multi-model-selector',
|
|
314
|
+
placement: 'task-input-above',
|
|
315
|
+
jsx: readFileSync(join(__dirname, './MultiModelSelector.jsx'), 'utf-8'),
|
|
316
|
+
loadData: true,
|
|
317
|
+
}];
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
async getUIExtensionData(componentId: string): Promise<unknown> {
|
|
321
|
+
if (componentId === 'multi-model-selector') {
|
|
322
|
+
return this.state;
|
|
323
|
+
}
|
|
324
|
+
return undefined;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
async executeUIExtensionAction(
|
|
328
|
+
componentId: string,
|
|
329
|
+
action: string,
|
|
330
|
+
args: unknown[],
|
|
331
|
+
context: ExtensionContext
|
|
332
|
+
): Promise<unknown> {
|
|
333
|
+
if (componentId !== 'multi-model-selector') return;
|
|
334
|
+
|
|
335
|
+
if (action === 'add-model') {
|
|
336
|
+
this.state.models.push({
|
|
337
|
+
index: this.state.models.length,
|
|
338
|
+
modelId: ''
|
|
339
|
+
});
|
|
340
|
+
context.triggerUIDataRefresh('multi-model-selector');
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
if (action === 'remove-model') {
|
|
344
|
+
const index = args[0] as number;
|
|
345
|
+
this.state.models = this.state.models.filter(m => m.index !== index);
|
|
346
|
+
context.triggerUIDataRefresh('multi-model-selector');
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
if (action === 'update-model') {
|
|
350
|
+
const [index, modelId] = args as [number, string];
|
|
351
|
+
const model = this.state.models.find(m => m.index === index);
|
|
352
|
+
if (model) {
|
|
353
|
+
model.modelId = modelId;
|
|
354
|
+
context.triggerUIDataRefresh('multi-model-selector');
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
if (action === 'set-use-worktrees') {
|
|
359
|
+
this.state.useWorktrees = args[0] as boolean;
|
|
360
|
+
context.triggerUIDataRefresh('multi-model-selector');
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
return { success: true };
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
async onPromptStarted(event: PromptStartedEvent, context: ExtensionContext): Promise<void> {
|
|
367
|
+
const selectedModels = this.state.models.filter(m => m.modelId);
|
|
368
|
+
if (selectedModels.length === 0) return;
|
|
369
|
+
|
|
370
|
+
// Create duplicate tasks for each additional model
|
|
371
|
+
const projectContext = context.getProjectContext();
|
|
372
|
+
const taskContext = context.getTaskContext();
|
|
373
|
+
|
|
374
|
+
for (const model of selectedModels.slice(1)) {
|
|
375
|
+
await projectContext.createTask({
|
|
376
|
+
name: `${taskContext?.data.name} (${model.modelId})`,
|
|
377
|
+
initialPrompt: event.prompt,
|
|
378
|
+
modelId: model.modelId,
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
**MultiModelSelector.jsx:**
|
|
386
|
+
```jsx
|
|
387
|
+
({ data, models, providers, ui, executeExtensionAction }) => {
|
|
388
|
+
const { useCallback } = React;
|
|
389
|
+
const { Button, ModelSelector, Checkbox } = ui;
|
|
390
|
+
|
|
391
|
+
const modelSelections = data?.models ?? [];
|
|
392
|
+
const useWorktrees = data?.useWorktrees ?? true;
|
|
393
|
+
|
|
394
|
+
const handleAddModel = useCallback(async () => {
|
|
395
|
+
await executeExtensionAction('add-model');
|
|
396
|
+
}, [executeExtensionAction]);
|
|
397
|
+
|
|
398
|
+
const handleRemoveModel = useCallback((index) => async () => {
|
|
399
|
+
await executeExtensionAction('remove-model', index);
|
|
400
|
+
}, [executeExtensionAction]);
|
|
401
|
+
|
|
402
|
+
const handleModelChange = useCallback((index) => async (model) => {
|
|
403
|
+
const modelId = model ? `${model.providerId}/${model.id}` : '';
|
|
404
|
+
await executeExtensionAction('update-model', index, modelId);
|
|
405
|
+
}, [executeExtensionAction]);
|
|
406
|
+
|
|
407
|
+
const handleWorktreesChange = useCallback(async (checked) => {
|
|
408
|
+
await executeExtensionAction('set-use-worktrees', checked);
|
|
409
|
+
}, [executeExtensionAction]);
|
|
410
|
+
|
|
411
|
+
return (
|
|
412
|
+
<div className="flex flex-col gap-2 pb-2 w-full">
|
|
413
|
+
<div className="flex gap-4 w-full justify-between items-center">
|
|
414
|
+
<div className="flex items-center gap-2 flex-wrap">
|
|
415
|
+
{modelSelections.map((selection) => (
|
|
416
|
+
<div key={selection.index} className="flex items-center gap-1">
|
|
417
|
+
<ModelSelector
|
|
418
|
+
models={models}
|
|
419
|
+
providers={providers}
|
|
420
|
+
selectedModelId={selection.modelId}
|
|
421
|
+
onChange={handleModelChange(selection.index)}
|
|
422
|
+
/>
|
|
423
|
+
<button
|
|
424
|
+
onClick={handleRemoveModel(selection.index)}
|
|
425
|
+
className="text-text-muted hover:text-text-primary"
|
|
426
|
+
>
|
|
427
|
+
×
|
|
428
|
+
</button>
|
|
429
|
+
</div>
|
|
430
|
+
))}
|
|
431
|
+
</div>
|
|
432
|
+
<div className="flex gap-2 items-center">
|
|
433
|
+
<Checkbox
|
|
434
|
+
label="Use worktrees"
|
|
435
|
+
checked={useWorktrees}
|
|
436
|
+
onChange={handleWorktreesChange}
|
|
437
|
+
size="xs"
|
|
438
|
+
/>
|
|
439
|
+
<Button
|
|
440
|
+
variant="outline"
|
|
441
|
+
size="xs"
|
|
442
|
+
onClick={handleAddModel}
|
|
443
|
+
>
|
|
444
|
+
+ Add model
|
|
445
|
+
</Button>
|
|
446
|
+
</div>
|
|
447
|
+
</div>
|
|
448
|
+
</div>
|
|
449
|
+
);
|
|
450
|
+
}
|
|
451
|
+
```
|
|
452
|
+
|
|
453
|
+
### External Rules (Config Component + Events)
|
|
454
|
+
|
|
455
|
+
Extension with a **config component** (settings dialog) that lets users configure additional rule folders, plus an event handler that uses the loaded config.
|
|
456
|
+
|
|
457
|
+
```
|
|
458
|
+
external-rules/
|
|
459
|
+
├── index.ts # Main extension with 3 config methods + event handler
|
|
460
|
+
├── ConfigComponent.jsx # Settings UI (text input for comma-separated folders)
|
|
461
|
+
└── config.json # Persisted config: { "ruleFolders": "" }
|
|
462
|
+
```
|
|
463
|
+
|
|
464
|
+
**index.ts:**
|
|
465
|
+
```typescript
|
|
466
|
+
import { existsSync, readFileSync, readdirSync, statSync, writeFileSync } from 'node:fs';
|
|
467
|
+
import { join, relative } from 'node:path';
|
|
468
|
+
import type { Extension, ExtensionContext, RuleFilesRetrievedEvent } from '@aiderdesk/extensions';
|
|
469
|
+
|
|
470
|
+
const configComponentJsx = readFileSync(join(__dirname, './ConfigComponent.jsx'), 'utf-8');
|
|
471
|
+
|
|
472
|
+
const DEFAULT_RULE_DIRECTORIES = ['.cursor/rules', '.roo/rules'];
|
|
473
|
+
const DEFAULT_ROOT_RULE_FILES = ['CLAUDE.md'];
|
|
474
|
+
|
|
475
|
+
interface ExternalRulesConfig {
|
|
476
|
+
ruleFolders: string;
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
const DEFAULT_CONFIG: ExternalRulesConfig = { ruleFolders: '' };
|
|
480
|
+
|
|
481
|
+
export default class ExternalRulesExtension implements Extension {
|
|
482
|
+
static metadata = {
|
|
483
|
+
name: 'External Rules',
|
|
484
|
+
version: '1.0.0',
|
|
485
|
+
description: 'Includes rule files from Cursor, Claude Code, and Roo Code',
|
|
486
|
+
author: 'author-name',
|
|
487
|
+
capabilities: ['context'],
|
|
488
|
+
};
|
|
489
|
+
|
|
490
|
+
private configPath: string;
|
|
491
|
+
|
|
492
|
+
constructor() {
|
|
493
|
+
this.configPath = join(__dirname, 'config.json');
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
async onLoad(context: ExtensionContext): Promise<void> {
|
|
497
|
+
// context.log() outputs to backend console only; for user-visible messages use context.getTaskContext()?.addLogMessage()
|
|
498
|
+
context.log('External Rules Extension loaded', 'info');
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
// --- Config Component API ---
|
|
502
|
+
|
|
503
|
+
getConfigComponent(_context: ExtensionContext): string {
|
|
504
|
+
return configComponentJsx;
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
async getConfigData(_context: ExtensionContext): Promise<ExternalRulesConfig> {
|
|
508
|
+
try {
|
|
509
|
+
if (existsSync(this.configPath)) {
|
|
510
|
+
const data = readFileSync(this.configPath, 'utf-8');
|
|
511
|
+
return { ...DEFAULT_CONFIG, ...JSON.parse(data) };
|
|
512
|
+
}
|
|
513
|
+
} catch { /* ignore */ }
|
|
514
|
+
return { ...DEFAULT_CONFIG };
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
async saveConfigData(configData: unknown, _context: ExtensionContext): Promise<unknown> {
|
|
518
|
+
const merged: ExternalRulesConfig = { ...DEFAULT_CONFIG, ...configData as Partial<ExternalRulesConfig> };
|
|
519
|
+
writeFileSync(this.configPath, JSON.stringify(merged, null, 2), 'utf-8');
|
|
520
|
+
return merged;
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
// --- Event Handler using loaded config ---
|
|
524
|
+
|
|
525
|
+
async onRuleFilesRetrieved(event: RuleFilesRetrievedEvent, context: ExtensionContext) {
|
|
526
|
+
const projectDir = context.getProjectDir();
|
|
527
|
+
if (!projectDir) return undefined;
|
|
528
|
+
|
|
529
|
+
// Load user-configured additional folders
|
|
530
|
+
const config = await this.getConfigData(context);
|
|
531
|
+
const additionalFolders = config.ruleFolders
|
|
532
|
+
? config.ruleFolders.split(',').map((f) => f.trim()).filter(Boolean)
|
|
533
|
+
: [];
|
|
534
|
+
|
|
535
|
+
// Merge defaults with user folders
|
|
536
|
+
const allDirectories = [...DEFAULT_RULE_DIRECTORIES, ...additionalFolders];
|
|
537
|
+
// ... scan directories and return augmented files ...
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
```
|
|
541
|
+
|
|
542
|
+
**ConfigComponent.jsx:**
|
|
543
|
+
```jsx
|
|
544
|
+
({ config, updateConfig, ui }) => {
|
|
545
|
+
const { Input } = ui;
|
|
546
|
+
|
|
547
|
+
return (
|
|
548
|
+
<div className="flex flex-col gap-4">
|
|
549
|
+
<Input
|
|
550
|
+
label="Additional Rule Folders"
|
|
551
|
+
value={config?.ruleFolders || ''}
|
|
552
|
+
onChange={(value) => updateConfig({ ...config, ruleFolders: value })}
|
|
553
|
+
placeholder=".custom-rules, .ai/rules"
|
|
554
|
+
/>
|
|
555
|
+
<p className="text-xs text-text-secondary -mt-2">
|
|
556
|
+
Comma-separated folder paths relative to project root. Scanned in addition to built-in sources.
|
|
557
|
+
</p>
|
|
558
|
+
</div>
|
|
559
|
+
);
|
|
560
|
+
};
|
|
561
|
+
```
|
|
562
|
+
|
|
563
|
+
**Key patterns shown:**
|
|
564
|
+
- JSX loaded from external file via `readFileSync` at module level
|
|
565
|
+
- Three-method config API: `getConfigComponent`, `getConfigData`, `saveConfigData`
|
|
566
|
+
- **No inner state**: reads directly from `config` prop, uses `ui.Input` instead of raw HTML
|
|
567
|
+
- Config used at runtime by event handlers (`onRuleFilesRetrieved` calls `this.getConfigData`)
|
|
568
|
+
- Default merging ensures missing fields are handled gracefully
|
|
569
|
+
|
|
570
|
+
## Common Patterns Summary
|
|
571
|
+
|
|
572
|
+
| Pattern | Extension | Use Case |
|
|
573
|
+
|---------|-----------|----------|
|
|
574
|
+
| Commands | theme.ts | Add /commands |
|
|
575
|
+
| Modes | plan-mode.ts | Custom conversation modes |
|
|
576
|
+
| Blocking | permission-gate.ts | Prevent operations |
|
|
577
|
+
| Modifying | tree-sitter-repo-map | Change event data |
|
|
578
|
+
| Config | tree-sitter-repo-map | Persistent settings (internal) |
|
|
579
|
+
| **Config Component** | **external-rules** | **Settings UI dialog with Save/Cancel** |
|
|
580
|
+
| Agents | pirate.ts | Custom agent profiles |
|
|
581
|
+
| Tools | chunkhound-search | Custom AI tools |
|
|
582
|
+
| UI Display | tps-counter | Show information in UI |
|
|
583
|
+
| UI Interactive | multi-model-run | User input in UI |
|