pi-orchestrator-config 4.3.6 → 4.3.8
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/README.md +23 -15
- package/extensions/orchestrator/extended-autocomplete.ts +4 -0
- package/extensions/orchestrator/mcpc.ts +172 -0
- package/extensions/orchestrator/session-validation.ts +5 -3
- package/extensions/pidash/pidash-ui/components.json +25 -0
- package/extensions/pidash/pidash-ui/dist/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
- package/extensions/pidash/pidash-ui/dist/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
- package/extensions/pidash/pidash-ui/dist/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
- package/extensions/pidash/pidash-ui/dist/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
- package/extensions/pidash/pidash-ui/dist/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
- package/extensions/pidash/pidash-ui/dist/assets/index-BHH9Jo-Z.css +2 -0
- package/extensions/pidash/pidash-ui/dist/assets/index-DnwxYm06.js +23 -0
- package/extensions/pidash/pidash-ui/dist/index.html +13 -0
- package/extensions/pidash/pidash-ui/index.html +12 -0
- package/extensions/pidash/pidash-ui/package-lock.json +5545 -0
- package/extensions/pidash/pidash-ui/package.json +33 -0
- package/extensions/pidash/pidash-ui/src/App.tsx +297 -0
- package/extensions/pidash/pidash-ui/src/components/InfoBar.tsx +429 -0
- package/extensions/pidash/pidash-ui/src/components/InputBar.tsx +215 -0
- package/extensions/pidash/pidash-ui/src/components/KeybindingSettings.tsx +102 -0
- package/extensions/pidash/pidash-ui/src/components/MessageList.tsx +404 -0
- package/extensions/pidash/pidash-ui/src/components/NotificationSettings.tsx +76 -0
- package/extensions/pidash/pidash-ui/src/components/SessionSidebar.tsx +227 -0
- package/extensions/pidash/pidash-ui/src/components/SessionSwitcher.tsx +101 -0
- package/extensions/pidash/pidash-ui/src/components/Sidebar.tsx +83 -0
- package/extensions/pidash/pidash-ui/src/hooks/useKeybindings.ts +102 -0
- package/extensions/pidash/pidash-ui/src/hooks/useKeyboardNavigation.ts +69 -0
- package/extensions/pidash/pidash-ui/src/hooks/useMessageHandler.ts +436 -0
- package/extensions/pidash/pidash-ui/src/hooks/useNotifications.ts +64 -0
- package/extensions/pidash/pidash-ui/src/hooks/useSessions.ts +29 -0
- package/extensions/pidash/pidash-ui/src/hooks/useWebSocket.ts +39 -0
- package/extensions/pidash/pidash-ui/src/lib/utils.ts +6 -0
- package/extensions/pidash/pidash-ui/src/main.tsx +5 -0
- package/extensions/pidash/pidash-ui/src/styles.css +184 -0
- package/extensions/pidash/pidash-ui/src/types.ts +83 -0
- package/extensions/pidash/pidash-ui/tsconfig.json +22 -0
- package/extensions/pidash/pidash-ui/vite.config.ts +53 -0
- package/extensions/pidash/pidash.ts +50 -17
- package/extensions/pidiff/pidiff-ui/dist/assets/abap-CLvhMVsD.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/actionscript-3-Cs6JJXT5.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/ada-C5qYipkI.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/ahk-CA9gdOdF.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/ahk2-_6rzW9BS.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/andromeeda-vGVdxbeo.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/angular-html-ghA4VuM0.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/angular-ts-BiEwt-Qs.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/apache-U0d_L8uA.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/apex-KFGFyKwG.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/apl-DmYAGNOL.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/applescript-CCn79oCD.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/ara-4CJ0cIlV.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/asciidoc-SCjQUq34.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/asm-Cmm7eHzH.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/astro-Bju7L81l.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/aurora-x-CDeNXAV0.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/awk-BWXHIvNe.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/ayu-dark-DluEY0Gj.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/ayu-light-C3h-C4tm.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/ayu-mirage-Bqwy1Gya.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/ballerina-B7ZEbQpA.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/bat-qdxAdBWQ.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/beancount-D-usSTwE.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/berry-DKpUyyne.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/bibtex-Ci_nEsc7.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/bicep-CUHmPFLl.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/bird2-CYIUgYqB.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/blade-C_YtSRJN.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/bsl-_VjlB9mv.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/c-DxcP9pmN.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/c3-D0apG41V.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/cadence-CQ2zXKGN.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/cairo-DLTphjLi.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/catppuccin-frappe-C9Q5zVZY.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/catppuccin-latte-CtsyrtPq.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/catppuccin-macchiato-R8nAf1vR.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/catppuccin-mocha-DjuaAJKi.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/chapel-BjVM8zvB.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/clarity-CtfBBspg.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/clojure-DqKBuwfJ.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/cmake-Bj61d0ZC.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/cobol-CyAifE-8.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/codeowners-C8r90Shi.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/codeql-oeQT6MSM.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/coffee-BNW4Zttb.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/common-lisp-Cv5bFMCO.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/coq-DuBRPxYg.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/cpp-De6s9lN-.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/crystal-JzhjW33_.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/csharp-oqKa8noW.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/css-DAnI1EKT.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/csv-Dx-8-gkx.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/cue-CE9AQfxI.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/cypher-ClKdZ_lG.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/d-qD-0Kul2.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/dark-plus-Cs2F2srj.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/dart-CnvKMtbv.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/dax-BkyTk9wS.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/desktop-Dlh5hvp9.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/diff-woXpYk--.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/docker-IyjqRm3v.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/dotenv-_5a1GRtc.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/dracula-BHWKrbxM.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/dracula-soft-5eyTD99u.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/dream-maker-DW3nJb8Q.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/edge-DlbkxEj4.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/elixir-BXz6vpDX.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/elm-CJcSKM6_.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/emacs-lisp-c_oH4hRZ.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/erb-VHOaTR5g.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/erlang-Cphh6RMH.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/everforest-dark-sB-x3p7T.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/everforest-light-Df2xbC6M.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/fennel-DQxkIbk2.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/fish-BJitypiv.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/fluent-C03EYrpw.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/fortran-fixed-form-DEKoE2YW.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/fortran-free-form-CYNrtFtB.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/fsharp-D13ZGOAj.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/gdresource-xMC7jr7x.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/gdscript-DYvRD3hg.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/gdshader-CBce3t8t.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/genie-CV2tkWYe.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/gherkin-DExj1W_8.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/git-commit-BSykSTBG.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/git-rebase-PAYwCVk-.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/github-dark-C-LZuMrd.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/github-dark-default-DXG-b-1a.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/github-dark-dimmed-Bx1FflLF.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/github-dark-high-contrast-B_tTalzw.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/github-light-EUqPIrTm.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/github-light-default-BXViO-2h.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/github-light-high-contrast-B68TUdTA.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/gleam-CSRkHgEL.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/glimmer-js-CspJJiU_.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/glimmer-ts-CSMIai5o.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/glsl-Cw9yKL2B.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/gn-ilITqXS6.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/gnuplot-7GGW24-e.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/go-rLFTqkRN.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/graphql-D0OMgGsM.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/groovy-CacY0gHj.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/gruvbox-dark-hard-C820rvS2.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/gruvbox-dark-medium-BPjhmG05.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/gruvbox-dark-soft-MrdJrrXF.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/gruvbox-light-hard-BC_s9l72.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/gruvbox-light-medium-BAWPOn9u.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/gruvbox-light-soft-BSMLrYjP.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/hack-DfiAACVA.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/haml-DU8pAbRK.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/handlebars-CoaiK3xT.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/haskell-D8IpX4py.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/haxe-C8oCnwJJ.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/hcl-Dh228itO.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/hjson-CxZEssPk.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/hlsl-Cvrh5tZx.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/horizon-CE9ld1lL.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/horizon-bright-DSNQnXHK.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/houston-CsvMBhTu.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/html-B4C3aTRB.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/html-derivative-C_NJUsxF.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/http-Cr9w59E3.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/hurl-BEScLvfg.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/hxml-Dcm88srW.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/hy-CZbG8q4J.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/imba-DsUTQ-LC.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/index-CcrT73jQ.css +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/index-CisAus9r.js +2801 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/ini-B5eOa1yu.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/java-hb-3TTCg.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/javascript-Bc0DeQtz.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/jinja-DoEIYL2y.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/jison-C2OZYR2e.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/json-DKeabECb.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/json5-BR5RXkoi.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/jsonc-CYpm1nAK.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/jsonl-CmCQp5Yx.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/jsonnet-CJTPZ8u_.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/jssm-DXw9l8Rf.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/jsx-Dadu-wAB.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/julia-CpUr0nh2.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/just-BysHL69Z.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/kanagawa-dragon-Bozd7klA.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/kanagawa-lotus-BmuOG9ZW.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/kanagawa-wave-BML5mF2J.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/kdl-CsD5j6eV.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/kotlin-DhhofPvG.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/kusto-C7mF5XQf.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/laserwave-C_8bwKvT.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/latex-iNrlK36R.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/lean-CewbzKMR.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/less-DVTAwKKz.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/light-plus-DVQuIRkW.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/liquid-g8x_A5Ru.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/llvm-DqHOMS-s.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/log-BNLmms1o.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/logo-Cluzi2Zq.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/lua-B4BSWsUC.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/luau-C2pBCSgt.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/make-Dixweg8N.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/markdown-BYOwaDjH.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/marko-CHSFXjEi.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/material-theme-Bm3Qr25_.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/material-theme-darker-2IIEA8gg.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/material-theme-lighter-uhdI0v04.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/material-theme-ocean-CHQ94UKr.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/material-theme-palenight-B5W6OYN7.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/matlab-D7qyCx1q.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/mdc-js2C5rVG.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/mdx-DQZ5AkYe.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/mermaid-BxpfTIzt.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/min-dark-BSWPekZh.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/min-light-DDpmG2fV.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/mipsasm-BMqwQI7S.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/mojo-fg40_ntQ.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/monokai-B_bV9PQ9.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/moonbit-DgjMoLWr.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/move-BYnGhZoM.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/narrat-_X_XdTYD.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/nextflow-BJtWHP5T.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/nextflow-groovy-DJMQeKeT.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/nginx-BblTQvRl.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/night-owl-DhmEMT88.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/night-owl-light-eJ-hLW7d.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/nim-ChxMAPPZ.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/nix-IvuFDN5E.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/nord-Cb4Vim4T.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/nsis-CjNLYCLg.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/nushell-DHYfO66s.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/objective-c-D1A_Heim.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/objective-cpp-BsSzOQcm.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/ocaml-O90oeIOV.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/odin-B1RWQWA5.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/one-dark-pro-CLwyXe_n.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/one-light-D7Lr4KcI.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/openscad-BUDT5pXO.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/org-CHoj3SWZ.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/pascal-4ZHwLPI5.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/perl-3zusLAIc.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/php-DVx3dbu3.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/pierre-dark-CpLgRqie.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/pierre-dark-protanopia-deuteranopia-B35FxJx-.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/pierre-dark-soft-kZQmAZld.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/pierre-dark-tritanopia-CpjhbsIL.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/pierre-dark-vibrant-CpQYzh95.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/pierre-light-CoaEpmwp.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/pierre-light-protanopia-deuteranopia-0fSaH845.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/pierre-light-soft-lWLdNTOI.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/pierre-light-tritanopia-CEbqgOJL.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/pierre-light-vibrant-D80Fkn33.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/pkl-ot-7Btpt.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/plastic-DQwYfKfQ.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/plsql-DGHpHOYJ.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/po-BiJDBrnU.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/poimandres-DRFjx7u4.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/polar-C7UOKdEL.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/postcss-BXeXVLqQ.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/powerquery-DNMTfnFr.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/powershell-CCSX75yM.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/prisma-DMgNhnYS.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/prolog-iXnhIJG7.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/proto-DB4EqR-F.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/pug-DITNjLsK.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/puppet-CDv2pdJW.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/purescript-9MfHhQsQ.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/python-gzcpVVnB.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/qml-BYmD788c.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/qmldir-DCQb3MpD.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/qss-Fe1Jh2GI.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/r-Dp_qVPOX.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/racket-DcIDlBhZ.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/raku-B3gFvitq.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/razor-DT4CEDjF.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/rbs-C0MpOrj4.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/red-DX1BQOs8.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/reg-CRGYupPL.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/regexp-DVFGbBOe.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/rel-BtDbiS_P.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/riscv-Ckw8ddFX.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/ron-VUp2lXgN.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/rose-pine-aMsaMD1D.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/rose-pine-dawn-8PwUyIlP.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/rose-pine-moon-DO-qXg-I.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/rosmsg-CAekHB0j.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/rst-njZM0E3u.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/ruby-gu2hDDCx.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/rust-Cfkwpbl8.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/sas-Bo6NwyH7.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/sass-DXrisJhu.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/scala-BiFt_7mu.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/scheme-DQCgrYNe.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/scss-COdGMqPA.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/sdbl-bTVj8UrX.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/shaderlab-TOUzSsQk.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/shellscript-DSg7qNC1.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/shellsession-CD1RmUpx.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/slack-dark-DnToyrRv.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/slack-ochin-B2OO5cIa.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/smalltalk-BHpQb5nM.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/smithy-Dgaz7aur.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/snazzy-light-4G7pJPwS.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/solarized-dark-UdsmMDCL.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/solarized-light-C1IUL_tW.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/solidity-Bj7E1mRn.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/soy-C0QWCEMl.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/sparql-D_iOobhT.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/splunk-BC2Px7Mm.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/sql-VoWQdTUw.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/ssh-config-BgfXC-Er.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/stata-BEj75h4q.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/stylus-B6D30XZt.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/surrealql-Cj1XbW6j.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/svelte-HcwCBvjC.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/swift-CyEgAFGc.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/synthwave-84-nFMaYfgc.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/system-verilog-Dh5ihWbf.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/systemd-BxMlprV5.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/talonscript-CohzipZa.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/tasl-DMoTqEGO.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/tcl-CZd0xW_V.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/templ-D775vyzu.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/terraform-DswuEJGm.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/tex-DNmK_71Q.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/tokyo-night-oM2G3aXe.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/toml-CcmNWLt0.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/ts-tags-KERjFDJj.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/tsv-sltzmVWM.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/tsx-CMT8AiHA.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/turtle-ByJddavk.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/twig-B5uxCA6R.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/typescript-5zwf3bJw.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/typespec-BRdr0IET.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/typst-xx02l63O.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/v-DBj4K9d_.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/vala-zf12oZj6.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/vb-DOwzaHZ0.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/verilog-B2gwz-sJ.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/vesper-DdrHHSXu.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/vhdl-BroJfC0k.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/viml-DvXPmvsu.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/vitesse-black-fwtXNY1n.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/vitesse-dark-BZCL-v6S.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/vitesse-light-VbXTXTou.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/vue-BvvQRkFj.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/vue-html-BrBDvgBy.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/vue-vine-1CllPWUz.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/vyper-CgoNMtux.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/wasm-BnjxR4X6.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/wasm-ByWQv1Qj.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/wenyan-C8pVoKbM.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/wgsl-BsKzXJz4.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/wikitext-ClFFjSW2.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/wit-DdvCle-K.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/wolfram-DLL8P-h_.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/worker-BX5VNpEv.js +161 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/xml-C3nsfg4x.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/xsl-DDOShcMh.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/yaml-BGNXenqm.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/zenscript-BnlCZFoB.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/assets/zig-CMLA9XwU.js +1 -0
- package/extensions/pidiff/pidiff-ui/dist/index.html +13 -0
- package/extensions/pidiff/pidiff-ui/index.html +12 -0
- package/extensions/pidiff/pidiff-ui/package-lock.json +6496 -0
- package/extensions/pidiff/pidiff-ui/package.json +35 -0
- package/extensions/pidiff/pidiff-ui/src/App.tsx +1147 -0
- package/extensions/pidiff/pidiff-ui/src/components/ui/switch.tsx +29 -0
- package/extensions/pidiff/pidiff-ui/src/hooks/useWebSocket.ts +112 -0
- package/extensions/pidiff/pidiff-ui/src/lib/app-reconnect-watch.tsx +32 -0
- package/extensions/pidiff/pidiff-ui/src/lib/app-refresh-actions.tsx +47 -0
- package/extensions/pidiff/pidiff-ui/src/lib/create-logger.ts +37 -0
- package/extensions/pidiff/pidiff-ui/src/lib/file-cache-key.ts +34 -0
- package/extensions/pidiff/pidiff-ui/src/lib/refresh-control.tsx +43 -0
- package/extensions/pidiff/pidiff-ui/src/lib/request-diffs.ts +91 -0
- package/extensions/pidiff/pidiff-ui/src/lib/utils.ts +6 -0
- package/extensions/pidiff/pidiff-ui/src/lib/ws-send.ts +141 -0
- package/extensions/pidiff/pidiff-ui/src/main.tsx +6 -0
- package/extensions/pidiff/pidiff-ui/src/styles.css +79 -0
- package/extensions/pidiff/pidiff-ui/src/types.ts +56 -0
- package/extensions/pidiff/pidiff-ui/tsconfig.json +20 -0
- package/extensions/pidiff/pidiff-ui/vite.config.ts +46 -0
- package/extensions/pidiff/pidiff.ts +17 -3
- package/extensions/shared/daemon-manager.ts +20 -29
- package/extensions/shared/find-jiti.ts +103 -0
- package/extensions/shared/live-ctx.ts +69 -0
- package/package.json +31 -2
- package/prompts/create-coms-feature-manager.md +1 -1
- package/rules/00-orchestrator-core.md +2 -2
- package/rules/15-mcpc.md +35 -0
- package/rules/45-file-preview.md +1 -1
- package/scripts/build-extension-uis.sh +23 -0
- package/scripts/daemon-shared.ts +216 -0
- package/scripts/httpd.py +52 -0
- package/scripts/pidash-discord.ts +592 -0
- package/scripts/pidash-server.ts +437 -0
- package/scripts/pidiff-git-ignore.ts +55 -0
- package/scripts/pidiff-server.ts +674 -0
- package/scripts/serve-ui.ts +97 -0
- package/scripts/symlink-cli-specialists.sh +86 -0
- package/rules/15-mcp-launchpad.md +0 -46
package/README.md
CHANGED
|
@@ -36,7 +36,7 @@ Single extension that provides:
|
|
|
36
36
|
| **Task tracking** | Structured task lists for multi-step workflows — live widget, progress tracking, reminder nudges (owned, based on [@tintinweb/pi-tasks](https://github.com/tintinweb/pi-tasks) MIT) |
|
|
37
37
|
| **Neovim integration** | Send changed files and review findings to nvim's quickfix list — only active when running inside nvim |
|
|
38
38
|
| **Inter-agent communication** | P2P (`/coms`) agent communication — on-demand activation via slash command |
|
|
39
|
-
| **Slash commands** | `/pr-review`, `/issue-review`, `/release`, `/review-local`, `/review-status`, `/query-db`, `/btw`, `/async-status`, `/async-kill`, `/status`, `/dream`, `/remember`, `/coms`, `/pi-config-settings` — with autocomplete argument hints |
|
|
39
|
+
| **Slash commands** | `/pr-review`, `/issue-review`, `/release`, `/review-local`, `/review-status`, `/query-db`, `/btw`, `/async-status`, `/async-kill`, `/status`, `/dream`, `/remember`, `/coms`, `/pi-config-settings`, `/mcpc connect` — with autocomplete argument hints |
|
|
40
40
|
| **GitHub autocomplete** | Type `#` in the editor to get issue/PR suggestions from the current repo — lazy-loaded, 5min cache |
|
|
41
41
|
| **Command arg completions** | Tab-complete arguments for slash commands — providers and models for `/external-ai`, branches for `/review-local`, PR numbers for `/pr-review`, and more |
|
|
42
42
|
| **Discord bot** | Control pi sessions from your phone via Discord DMs — send prompts, answer ask_user dialogs, switch sessions |
|
|
@@ -82,6 +82,7 @@ Single extension that provides:
|
|
|
82
82
|
| `/nvim-changed-files` | Send git changed files to nvim's quickfix list (only inside nvim) |
|
|
83
83
|
| `/pidiff start\|stop\|restart\|status` | Manage the pidiff diff viewer server (per-project) |
|
|
84
84
|
| `/coms start\|stop\|status` | P2P local agent communication (Unix socket) |
|
|
85
|
+
| `/mcpc connect` | Connect MCP servers from `~/.pi/pi-config/mcp.json` (`mcpc connect --stdio`). Run after editing that file. |
|
|
85
86
|
|
|
86
87
|
### Inter-Agent Communication (coms)
|
|
87
88
|
|
|
@@ -120,13 +121,22 @@ See the [Docker section](#docker-sandboxed-execution) below for the full run com
|
|
|
120
121
|
|
|
121
122
|
### Native (without Docker)
|
|
122
123
|
|
|
123
|
-
|
|
124
|
+
Install from npm and PyPI — no git clone of this repo:
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
pi install npm:pi-orchestrator-config
|
|
128
|
+
pi install npm:@myk-org/pi-vertex-claude # optional Vertex Claude models
|
|
129
|
+
pi install npm:pi-web-access # optional web search/fetch
|
|
130
|
+
uv tool install myk-pi-tools
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Or run the interactive installer (downloads the script only; packages still come from npm/PyPI):
|
|
124
134
|
|
|
125
135
|
```bash
|
|
126
136
|
uv run https://raw.githubusercontent.com/myk-org/pi-config/main/scripts/install.py
|
|
127
137
|
```
|
|
128
138
|
|
|
129
|
-
|
|
139
|
+
If you already have the **dev** clone:
|
|
130
140
|
|
|
131
141
|
```bash
|
|
132
142
|
uv run scripts/install.py
|
|
@@ -135,8 +145,8 @@ uv run scripts/install.py
|
|
|
135
145
|
The installer covers:
|
|
136
146
|
|
|
137
147
|
- **Pi Packages** — pi-config, pi-vertex-claude, pi-web-access, myk-pi-tools, bun
|
|
138
|
-
- **Python Tools** —
|
|
139
|
-
- **npm Packages** — acpx, agent-browser
|
|
148
|
+
- **Python Tools** — prek
|
|
149
|
+
- **npm Packages** — mcpc, acpx, agent-browser
|
|
140
150
|
- **Browser Automation** — playwright + chromium
|
|
141
151
|
- **Environment Setup** — gitignore configuration
|
|
142
152
|
|
|
@@ -192,6 +202,7 @@ Add retry logic to the HTTP client in src/api.py
|
|
|
192
202
|
/release --dry-run
|
|
193
203
|
/review-local main
|
|
194
204
|
/query-db stats
|
|
205
|
+
/mcpc connect
|
|
195
206
|
```
|
|
196
207
|
|
|
197
208
|
### Direct subagent usage
|
|
@@ -476,10 +487,6 @@ GH_CONFIG_DIR=/home/youruser/.config/gh
|
|
|
476
487
|
|
|
477
488
|
# Gemini (optional — required for image generation)
|
|
478
489
|
GEMINI_API_KEY=xxx
|
|
479
|
-
|
|
480
|
-
# mcpl (MCP Launchpad) config path inside the container (must match mount target)
|
|
481
|
-
# Use your actual home path — it resolves inside the container via the PI_HOST_USER symlink
|
|
482
|
-
MCPL_CONFIG_FILES=/home/youruser/.config/mcpl/mcp.json
|
|
483
490
|
```
|
|
484
491
|
|
|
485
492
|
Pass via `--env-file /path/to/.env` in the docker run command.
|
|
@@ -494,7 +501,8 @@ files organized by category (lessons, preferences, patterns, decisions, completi
|
|
|
494
501
|
|
|
495
502
|
The `.pi/memory/` directory is auto-added to the global gitignore in the container
|
|
496
503
|
(along with `.pi/`, `.worktrees/`, `.cursor/agents/`, `.claude/agents/`, and
|
|
497
|
-
`.gemini/agents/`).
|
|
504
|
+
`.gemini/agents/`). This repo's `.gitignore` also ignores those three `*/agents/`
|
|
505
|
+
dirs so `uv build` does not pack local specialist symlinks.
|
|
498
506
|
|
|
499
507
|
For **native** (non-container) usage, add memory (and optionally CLI agent dirs) to your
|
|
500
508
|
global gitignore:
|
|
@@ -593,6 +601,8 @@ Pidiff is a per-project diff viewer that opens in your browser, providing rich b
|
|
|
593
601
|
|
|
594
602
|
- Branch diff and commit comparison
|
|
595
603
|
- File tree with search and filtering
|
|
604
|
+
- Header **Refresh** (and the stale-file banner) updates the current diff in place — the file tree and panes stay mounted; only the button spins
|
|
605
|
+
- Refresh is disabled while pidiff is disconnected
|
|
596
606
|
- Inline review comments on specific lines
|
|
597
607
|
- Publish review comments back to the pi session
|
|
598
608
|
- Per-project isolation — no port conflicts between sessions
|
|
@@ -621,7 +631,6 @@ PI_PIDIFF_ENABLE=false pi
|
|
|
621
631
|
|
|
622
632
|
| Mount | Purpose |
|
|
623
633
|
|---|---|
|
|
624
|
-
| `-v "<PATH_TO_MCPL_CONFIG>":"$HOME/.config/mcpl/mcp.json":ro` | MCP server config for `mcpl` |
|
|
625
634
|
| `-v "$HOME/.agents":"$HOME/.agents":rw` | User-level skills (install/uninstall from container) |
|
|
626
635
|
| `-v "$HOME/.config/gcloud/application_default_credentials.json":"$HOME/.config/gcloud/application_default_credentials.json":ro` | Google Cloud ADC (for Claude via Vertex AI) |
|
|
627
636
|
| `-v "$HOME/.config/cursor/auth.json":"$HOME/.config/cursor/auth.json":ro` | Cursor CLI auth (for acpx-cursor / cli-cursor models) |
|
|
@@ -644,7 +653,7 @@ PI_PIDIFF_ENABLE=false pi
|
|
|
644
653
|
| `uv` / `uvx` | Python execution (enforced by orchestrator) |
|
|
645
654
|
| `go` | Go development and code review |
|
|
646
655
|
| `libxml2-dev` | libxml2 headers — needed for building Python C extensions (e.g. ovirt-engine-sdk-python) |
|
|
647
|
-
| `
|
|
656
|
+
| `mcpc` | MCP CLI (`npm: @apify/mcpc`). Put servers in `~/.pi/pi-config/mcp.json` (already on the `~/.pi` mount). Pi runs `mcpc connect … --stdio` on start. After editing the file, `/mcpc connect`. `entrypoint.sh` reinstalls `@apify/mcpc` on every start so `PI_HOST_USER` host `.npm-global` mapping does not hide the image copy. |
|
|
648
657
|
| `myk-pi-tools` | PR review, release, and other CLI utilities |
|
|
649
658
|
| `prek` | Pre-commit hook runner |
|
|
650
659
|
| `acpx` | Agent proxy for remote models |
|
|
@@ -716,7 +725,6 @@ alias pi-docker='docker pull ghcr.io/myk-org/pi-config:latest && \
|
|
|
716
725
|
-v "$HOME/.gitignore-global":"$HOME/.gitignore-global":ro \
|
|
717
726
|
-v "$HOME/.ssh":"$HOME/.ssh":ro \
|
|
718
727
|
-v "$HOME/.config/gh":"$HOME/.config/gh":ro \
|
|
719
|
-
-v "$HOME/.config/mcpl/mcp.json":"$HOME/.config/mcpl/mcp.json":ro \ # adjust host path to your mcpl config location
|
|
720
728
|
-v "$HOME/.agents":"$HOME/.agents":rw \
|
|
721
729
|
-v "$HOME/.config/gcloud/application_default_credentials.json":"$HOME/.config/gcloud/application_default_credentials.json":ro \
|
|
722
730
|
-v "$HOME/.config/cursor/auth.json":"$HOME/.config/cursor/auth.json":ro \
|
|
@@ -738,8 +746,8 @@ Then just run `pi-docker` from any project directory.
|
|
|
738
746
|
> `pi install` runs on each start.
|
|
739
747
|
> A `WARNING` on stderr is normal when the package is already cached in `~/.pi`.
|
|
740
748
|
> If pi misbehaves or the warning persists, verify network connectivity
|
|
741
|
-
> and run `pi install
|
|
742
|
-
> `pi install
|
|
749
|
+
> and run `pi install npm:pi-orchestrator-config` and
|
|
750
|
+
> `pi install npm:@myk-org/pi-vertex-claude` manually.
|
|
743
751
|
|
|
744
752
|
## Discord Bot
|
|
745
753
|
|
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
* /cron <Tab> → add, list, list-all, remove
|
|
20
20
|
* /dream-auto <Tab> → on, off
|
|
21
21
|
* /async-kill <Tab> → all (or type name / id prefix)
|
|
22
|
+
* /mcpc <Tab> → connect
|
|
22
23
|
*/
|
|
23
24
|
|
|
24
25
|
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
@@ -28,6 +29,7 @@ import * as fs from "node:fs";
|
|
|
28
29
|
import { execFileSync } from "node:child_process";
|
|
29
30
|
import * as path from "node:path";
|
|
30
31
|
import { getCronFilePath } from "./cron.js";
|
|
32
|
+
import { mcpcArgumentCompletions } from "./mcpc.js";
|
|
31
33
|
|
|
32
34
|
// ── Cache infrastructure ────────────────────────────────────────────
|
|
33
35
|
|
|
@@ -266,6 +268,8 @@ function registerCompletions(
|
|
|
266
268
|
}
|
|
267
269
|
},
|
|
268
270
|
|
|
271
|
+
"mcpc": mcpcArgumentCompletions,
|
|
272
|
+
|
|
269
273
|
"dream-auto": (prefix: string) => {
|
|
270
274
|
return filter([
|
|
271
275
|
{ value: "on", label: "on", description: "Enable auto-dreaming (every 3h + session end)" },
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* mcpc — connect MCP servers from ~/.pi/pi-config/mcp.json.
|
|
3
|
+
*
|
|
4
|
+
* Auto-connect on pi process start (session_start reason "startup").
|
|
5
|
+
* /mcpc connect reconnects after the user edits that file.
|
|
6
|
+
* Connect failure is logged; it never fails the pi session.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { execFile } from "node:child_process";
|
|
10
|
+
import * as fs from "node:fs";
|
|
11
|
+
import * as os from "node:os";
|
|
12
|
+
import * as path from "node:path";
|
|
13
|
+
import { promisify } from "node:util";
|
|
14
|
+
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
15
|
+
import { isPiOneshotInvocation } from "../shared/oneshot.js";
|
|
16
|
+
import { createLogger } from "../shared/logger.js";
|
|
17
|
+
|
|
18
|
+
const execFileAsync = promisify(execFile);
|
|
19
|
+
const log = createLogger("orchestrator", "mcpc");
|
|
20
|
+
|
|
21
|
+
const CONNECT_TIMEOUT_MS = 120_000;
|
|
22
|
+
const MAX_BUFFER = 10 * 1024 * 1024;
|
|
23
|
+
|
|
24
|
+
export type McpcExecFile = (
|
|
25
|
+
file: string,
|
|
26
|
+
args: readonly string[],
|
|
27
|
+
options: { timeout: number; maxBuffer: number; env?: NodeJS.ProcessEnv },
|
|
28
|
+
) => Promise<{ stdout: string | Buffer; stderr: string | Buffer }>;
|
|
29
|
+
|
|
30
|
+
let execMcpcConnect: McpcExecFile = execFileAsync as McpcExecFile;
|
|
31
|
+
|
|
32
|
+
/** Replace the mcpc subprocess (tests). Pass undefined to restore. */
|
|
33
|
+
export function setMcpcExecFile(fn: McpcExecFile | undefined): void {
|
|
34
|
+
execMcpcConnect = fn ?? (execFileAsync as McpcExecFile);
|
|
35
|
+
log.debug("setMcpcExecFile", fn ? "override" : "restore");
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function mcpcConfigPath(): string {
|
|
39
|
+
const home = process.env.HOME || os.homedir();
|
|
40
|
+
const configPath = path.join(home, ".pi", "pi-config", "mcp.json");
|
|
41
|
+
log.debug("mcpcConfigPath", configPath);
|
|
42
|
+
return configPath;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export type McpcConnectResult = {
|
|
46
|
+
ok: boolean;
|
|
47
|
+
skipped: boolean;
|
|
48
|
+
message: string;
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
export type McpcCompletionItem = {
|
|
52
|
+
value: string;
|
|
53
|
+
label: string;
|
|
54
|
+
description: string;
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
const MCPC_CONNECT_COMPLETION: McpcCompletionItem = {
|
|
58
|
+
value: "connect",
|
|
59
|
+
label: "connect",
|
|
60
|
+
description: "Connect ~/.pi/pi-config/mcp.json (--stdio)",
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
export function mcpcArgumentCompletions(prefix: string): McpcCompletionItem[] | null {
|
|
64
|
+
log.debug("mcpc argument completions", prefix);
|
|
65
|
+
const needle = prefix.trim().toLowerCase();
|
|
66
|
+
const haystack = `${MCPC_CONNECT_COMPLETION.label} ${MCPC_CONNECT_COMPLETION.description}`.toLowerCase();
|
|
67
|
+
if (!needle || haystack.includes(needle) || MCPC_CONNECT_COMPLETION.value.startsWith(needle)) {
|
|
68
|
+
return [MCPC_CONNECT_COMPLETION];
|
|
69
|
+
}
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function formatExecError(err: unknown): string {
|
|
74
|
+
if (!err || typeof err !== "object") {
|
|
75
|
+
log.debug("formatExecError non-object", String(err));
|
|
76
|
+
return String(err);
|
|
77
|
+
}
|
|
78
|
+
const e = err as {
|
|
79
|
+
code?: string;
|
|
80
|
+
killed?: boolean;
|
|
81
|
+
message?: string;
|
|
82
|
+
stdout?: string;
|
|
83
|
+
stderr?: string;
|
|
84
|
+
};
|
|
85
|
+
log.debug("formatExecError", { code: e.code ?? "none", killed: Boolean(e.killed) });
|
|
86
|
+
const parts: string[] = [];
|
|
87
|
+
if (e.code === "ENOENT") {
|
|
88
|
+
parts.push("mcpc not on PATH. Install: npm install -g @apify/mcpc");
|
|
89
|
+
} else if (e.killed) {
|
|
90
|
+
parts.push(`mcpc connect timed out after ${CONNECT_TIMEOUT_MS / 1000}s`);
|
|
91
|
+
} else if (e.message) {
|
|
92
|
+
parts.push(e.message);
|
|
93
|
+
}
|
|
94
|
+
const out = [e.stdout, e.stderr].filter(Boolean).join("\n").trim();
|
|
95
|
+
if (out) parts.push(out);
|
|
96
|
+
return parts.join("\n") || "mcpc connect failed";
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/** Run `mcpc connect <mcp.json> --stdio`. Never throws. */
|
|
100
|
+
export async function connectMcpc(): Promise<McpcConnectResult> {
|
|
101
|
+
const configPath = mcpcConfigPath();
|
|
102
|
+
log.debug("connectMcpc entry", configPath);
|
|
103
|
+
|
|
104
|
+
if (!fs.existsSync(configPath)) {
|
|
105
|
+
log.debug("skip: mcp.json missing", configPath);
|
|
106
|
+
return {
|
|
107
|
+
ok: true,
|
|
108
|
+
skipped: true,
|
|
109
|
+
message: `No MCP config at ${configPath} — skip connect (create that file to use mcpc).`,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
log.info("mcpc connect start", configPath);
|
|
114
|
+
try {
|
|
115
|
+
const { stdout, stderr } = await execMcpcConnect(
|
|
116
|
+
"mcpc",
|
|
117
|
+
["connect", configPath, "--stdio"],
|
|
118
|
+
{
|
|
119
|
+
timeout: CONNECT_TIMEOUT_MS,
|
|
120
|
+
maxBuffer: MAX_BUFFER,
|
|
121
|
+
env: process.env,
|
|
122
|
+
},
|
|
123
|
+
);
|
|
124
|
+
const out = [stdout, stderr].filter(Boolean).join("\n").trim();
|
|
125
|
+
log.info("mcpc connect finished", configPath);
|
|
126
|
+
log.debug("mcpc connect output", out);
|
|
127
|
+
return {
|
|
128
|
+
ok: true,
|
|
129
|
+
skipped: false,
|
|
130
|
+
message: out || `mcpc connect finished (${configPath} --stdio)`,
|
|
131
|
+
};
|
|
132
|
+
} catch (err) {
|
|
133
|
+
const message = formatExecError(err);
|
|
134
|
+
log.warn("mcpc connect failed; continuing", message);
|
|
135
|
+
return { ok: false, skipped: false, message };
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
export function registerMcpc(pi: ExtensionAPI): void {
|
|
140
|
+
log.info("registerMcpc");
|
|
141
|
+
pi.registerCommand("mcpc", {
|
|
142
|
+
description:
|
|
143
|
+
"Reconnect MCP servers from ~/.pi/pi-config/mcp.json (mcpc connect --stdio). Run after editing that file.",
|
|
144
|
+
handler: async (args, ctx) => {
|
|
145
|
+
const sub = (args || "").trim();
|
|
146
|
+
if (sub && sub !== "connect") {
|
|
147
|
+
log.debug("/mcpc ignored unknown args", sub);
|
|
148
|
+
if (ctx.hasUI) ctx.ui.notify("Usage: /mcpc connect", "warning");
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
log.info("/mcpc connect");
|
|
152
|
+
const result = await connectMcpc();
|
|
153
|
+
if (!ctx.hasUI) return;
|
|
154
|
+
if (result.skipped) ctx.ui.notify(result.message, "info");
|
|
155
|
+
else if (result.ok) ctx.ui.notify(result.message, "info");
|
|
156
|
+
else ctx.ui.notify(result.message, "warning");
|
|
157
|
+
},
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
pi.on("session_start", async (event, _ctx) => {
|
|
161
|
+
const reason = (event as { reason?: string })?.reason ?? "unknown";
|
|
162
|
+
if (reason !== "startup") {
|
|
163
|
+
log.debug("skip auto-connect: session_start reason", reason);
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
if (isPiOneshotInvocation()) {
|
|
167
|
+
log.debug("skip auto-connect: oneshot");
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
await connectMcpc();
|
|
171
|
+
});
|
|
172
|
+
}
|
|
@@ -8,6 +8,7 @@ import * as fs from "node:fs";
|
|
|
8
8
|
import * as path from "node:path";
|
|
9
9
|
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
10
10
|
import { setUvAvailable, isUvAvailable } from "./enforcement-helpers.js";
|
|
11
|
+
import { registerMcpc } from "./mcpc.js";
|
|
11
12
|
import { checkMinPiVersion } from "./utils.js";
|
|
12
13
|
|
|
13
14
|
/** Check whether a CLI command is available on PATH. */
|
|
@@ -209,13 +210,13 @@ async function checkSessionTools(ctx: any): Promise<void> {
|
|
|
209
210
|
// Optional
|
|
210
211
|
if (!hasCmd("gh"))
|
|
211
212
|
optional.push("gh — GitHub CLI. Install: https://cli.github.com/");
|
|
212
|
-
if (!hasCmd("
|
|
213
|
+
if (!hasCmd("mcpc"))
|
|
213
214
|
optional.push(
|
|
214
|
-
"
|
|
215
|
+
"mcpc — MCP CLI. Install: npm install -g @apify/mcpc",
|
|
215
216
|
);
|
|
216
217
|
if (!hasCmd("myk-pi-tools"))
|
|
217
218
|
optional.push(
|
|
218
|
-
"myk-pi-tools — PR/release/review CLI. Install: uv tool install
|
|
219
|
+
"myk-pi-tools — PR/release/review CLI. Install: uv tool install myk-pi-tools",
|
|
219
220
|
);
|
|
220
221
|
|
|
221
222
|
// Check agent-browser skill
|
|
@@ -333,6 +334,7 @@ async function checkUpgradeChangelog(ctx: any): Promise<void> {
|
|
|
333
334
|
|
|
334
335
|
export function registerSessionValidation(pi: ExtensionAPI): void {
|
|
335
336
|
registerRepairCommand(pi);
|
|
337
|
+
registerMcpc(pi);
|
|
336
338
|
|
|
337
339
|
pi.on("session_start", async (_event, ctx) => {
|
|
338
340
|
// Always check uv availability — even in headless mode.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://ui.shadcn.com/schema.json",
|
|
3
|
+
"style": "base-nova",
|
|
4
|
+
"rsc": false,
|
|
5
|
+
"tsx": true,
|
|
6
|
+
"tailwind": {
|
|
7
|
+
"config": "",
|
|
8
|
+
"css": "src/styles.css",
|
|
9
|
+
"baseColor": "neutral",
|
|
10
|
+
"cssVariables": true,
|
|
11
|
+
"prefix": ""
|
|
12
|
+
},
|
|
13
|
+
"iconLibrary": "lucide",
|
|
14
|
+
"rtl": false,
|
|
15
|
+
"aliases": {
|
|
16
|
+
"components": "@/components",
|
|
17
|
+
"utils": "@/lib/utils",
|
|
18
|
+
"ui": "@/components/ui",
|
|
19
|
+
"lib": "@/lib",
|
|
20
|
+
"hooks": "@/hooks"
|
|
21
|
+
},
|
|
22
|
+
"menuColor": "default",
|
|
23
|
+
"menuAccent": "subtle",
|
|
24
|
+
"registries": {}
|
|
25
|
+
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
|
|
2
|
+
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){:root,:host{--shimmer-angle:20deg}*,:before,:after,::backdrop{--tw-space-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-animation-delay:0s;--tw-animation-direction:normal;--tw-animation-duration:initial;--tw-animation-fill-mode:none;--tw-animation-iteration-count:1;--tw-enter-blur:0;--tw-enter-opacity:1;--tw-enter-rotate:0;--tw-enter-scale:1;--tw-enter-translate-x:0;--tw-enter-translate-y:0;--tw-exit-blur:0;--tw-exit-opacity:1;--tw-exit-rotate:0;--tw-exit-scale:1;--tw-exit-translate-x:0;--tw-exit-translate-y:0;--scroll-fade-t:0px;--scroll-fade-b:0px;--scroll-fade-s:0px;--scroll-fade-e:0px;--scroll-fade-mask:initial;--shimmer-image:initial;--shimmer-text-fill:initial}}}@layer theme{:root,:host{--font-sans:"Geist Variable", sans-serif;--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-orange-400:oklch(75% .183 55.934);--color-orange-500:oklch(70.5% .213 47.604);--color-yellow-300:oklch(90.5% .182 98.111);--color-yellow-400:oklch(85.2% .199 91.936);--color-yellow-500:oklch(79.5% .184 86.047);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-cyan-300:oklch(86.5% .127 207.078);--color-cyan-400:oklch(78.9% .154 211.53);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-purple-400:oklch(71.4% .203 305.504);--color-purple-500:oklch(62.7% .265 303.9);--color-pink-400:oklch(71.8% .202 349.761);--color-black:#000;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-normal:0em;--tracking-wider:.05em;--animate-ping:ping 1s cubic-bezier(0, 0, .2, 1) infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--animate-bounce:bounce 1s infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:"Geist Variable", sans-serif;--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*{border-color:var(--border);outline-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){*{outline-color:color-mix(in oklab, var(--ring) 50%, transparent)}}body{background-color:var(--background);color:var(--foreground)}html{font-family:Geist Variable,sans-serif}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.inset-0{inset:0}.-top-1{top:calc(var(--spacing) * -1)}.top-0{top:0}.top-1\.5{top:calc(var(--spacing) * 1.5)}.-right-1{right:calc(var(--spacing) * -1)}.right-0{right:0}.right-1\.5{right:calc(var(--spacing) * 1.5)}.bottom-0{bottom:0}.bottom-full{bottom:100%}.left-0{left:0}.z-10{z-index:10}.z-50{z-index:50}.container{width:100%}@media (width>=40rem){.container{max-width:40rem}}@media (width>=48rem){.container{max-width:48rem}}@media (width>=64rem){.container{max-width:64rem}}@media (width>=80rem){.container{max-width:80rem}}@media (width>=96rem){.container{max-width:96rem}}.mx-0\.5{margin-inline:calc(var(--spacing) * .5)}.mx-3{margin-inline:calc(var(--spacing) * 3)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mr-1\.5{margin-right:calc(var(--spacing) * 1.5)}.mb-0\.5{margin-bottom:calc(var(--spacing) * .5)}.mb-1{margin-bottom:var(--spacing)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.ml-0\.5{margin-left:calc(var(--spacing) * .5)}.ml-1{margin-left:var(--spacing)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-6{height:calc(var(--spacing) * 6)}.h-16{height:calc(var(--spacing) * 16)}.h-full{height:100%}.max-h-48{max-height:calc(var(--spacing) * 48)}.max-h-60{max-height:calc(var(--spacing) * 60)}.max-h-\[75vh\]{max-height:75vh}.max-h-\[300px\]{max-height:300px}.w-1{width:var(--spacing)}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-2{width:calc(var(--spacing) * 2)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-6{width:calc(var(--spacing) * 6)}.w-12{width:calc(var(--spacing) * 12)}.w-16{width:calc(var(--spacing) * 16)}.w-56{width:calc(var(--spacing) * 56)}.w-72{width:calc(var(--spacing) * 72)}.w-\[320px\]{width:320px}.w-\[520px\]{width:520px}.w-\[600px\]{width:600px}.w-full{width:100%}.w-screen{width:100vw}.max-w-\[200px\]{max-width:200px}.min-w-0{min-width:0}.min-w-\[3\.5em\]{min-width:3.5em}.min-w-\[4em\]{min-width:4em}.min-w-\[120px\]{min-width:120px}.min-w-\[200px\]{min-width:200px}.flex-1{flex:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.animate-bounce{animation:var(--animate-bounce)}.animate-ping{animation:var(--animate-ping)}.animate-pulse{animation:var(--animate-pulse)}.cursor-col-resize{cursor:col-resize}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.resize-none{resize:none}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:2147483647px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) * .8)}.rounded-sm{border-radius:calc(var(--radius) * .6)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-l-3,.border-l-\[3px\]{border-left-style:var(--tw-border-style);border-left-width:3px}.border-border,.border-border\/30{border-color:var(--border)}@supports (color:color-mix(in lab, red, red)){.border-border\/30{border-color:color-mix(in oklab, var(--border) 30%, transparent)}}.border-border\/50{border-color:var(--border)}@supports (color:color-mix(in lab, red, red)){.border-border\/50{border-color:color-mix(in oklab, var(--border) 50%, transparent)}}.border-cyan-400{border-color:var(--color-cyan-400)}.border-green-600{border-color:var(--color-green-600)}.border-orange-500{border-color:var(--color-orange-500)}.border-primary{border-color:var(--primary)}.border-purple-500{border-color:var(--color-purple-500)}.border-red-500{border-color:var(--color-red-500)}.border-yellow-500\/20{border-color:#edb20033}@supports (color:color-mix(in lab, red, red)){.border-yellow-500\/20{border-color:color-mix(in oklab, var(--color-yellow-500) 20%, transparent)}}.border-l-primary{border-left-color:var(--primary)}.border-l-transparent{border-left-color:#0000}.bg-accent,.bg-accent\/50{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.bg-accent\/50{background-color:color-mix(in oklab, var(--accent) 50%, transparent)}}.bg-background{background-color:var(--background)}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab, red, red)){.bg-black\/50{background-color:color-mix(in oklab, var(--color-black) 50%, transparent)}}.bg-black\/60{background-color:#0009}@supports (color:color-mix(in lab, red, red)){.bg-black\/60{background-color:color-mix(in oklab, var(--color-black) 60%, transparent)}}.bg-card{background-color:var(--card)}.bg-cyan-400{background-color:var(--color-cyan-400)}.bg-destructive{background-color:var(--destructive)}.bg-green-400{background-color:var(--color-green-400)}.bg-green-500{background-color:var(--color-green-500)}.bg-green-500\/15{background-color:#00c75826}@supports (color:color-mix(in lab, red, red)){.bg-green-500\/15{background-color:color-mix(in oklab, var(--color-green-500) 15%, transparent)}}.bg-muted,.bg-muted\/50{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/50{background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.bg-orange-400{background-color:var(--color-orange-400)}.bg-orange-400\/15{background-color:#ff8b1a26}@supports (color:color-mix(in lab, red, red)){.bg-orange-400\/15{background-color:color-mix(in oklab, var(--color-orange-400) 15%, transparent)}}.bg-primary{background-color:var(--primary)}.bg-red-500\/20{background-color:#fb2c3633}@supports (color:color-mix(in lab, red, red)){.bg-red-500\/20{background-color:color-mix(in oklab, var(--color-red-500) 20%, transparent)}}.bg-transparent{background-color:#0000}.bg-yellow-400{background-color:var(--color-yellow-400)}.bg-yellow-500\/10{background-color:#edb2001a}@supports (color:color-mix(in lab, red, red)){.bg-yellow-500\/10{background-color:color-mix(in oklab, var(--color-yellow-500) 10%, transparent)}}.bg-yellow-500\/15{background-color:#edb20026}@supports (color:color-mix(in lab, red, red)){.bg-yellow-500\/15{background-color:color-mix(in oklab, var(--color-yellow-500) 15%, transparent)}}.bg-yellow-500\/30{background-color:#edb2004d}@supports (color:color-mix(in lab, red, red)){.bg-yellow-500\/30{background-color:color-mix(in oklab, var(--color-yellow-500) 30%, transparent)}}.fill-current{fill:currentColor}.object-cover{object-fit:cover}.p-0{padding:0}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-8{padding:calc(var(--spacing) * 8)}.px-0\.5{padding-inline:calc(var(--spacing) * .5)}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.py-0{padding-block:0}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-\[10vh\]{padding-top:10vh}.pt-\[15vh\]{padding-top:15vh}.pt-\[env\(safe-area-inset-top\,12px\)\]{padding-top:env(safe-area-inset-top,12px)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pl-7{padding-left:calc(var(--spacing) * 7)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[8px\]{font-size:8px}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[13px\]{font-size:13px}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-normal{--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.break-words{overflow-wrap:break-word}.whitespace-pre-wrap{white-space:pre-wrap}.text-blue-400{color:var(--color-blue-400)}.text-border{color:var(--border)}.text-cyan-300{color:var(--color-cyan-300)}.text-cyan-400{color:var(--color-cyan-400)}.text-foreground{color:var(--foreground)}.text-green-500{color:var(--color-green-500)}.text-inherit{color:inherit}.text-muted-foreground,.text-muted-foreground\/50{color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.text-muted-foreground\/50{color:color-mix(in oklab, var(--muted-foreground) 50%, transparent)}}.text-orange-400{color:var(--color-orange-400)}.text-pink-400{color:var(--color-pink-400)}.text-primary{color:var(--primary)}.text-primary-foreground{color:var(--primary-foreground)}.text-purple-400{color:var(--color-purple-400)}.text-red-400{color:var(--color-red-400)}.text-red-500{color:var(--color-red-500)}.text-yellow-300{color:var(--color-yellow-300)}.text-yellow-400{color:var(--color-yellow-400)}.text-yellow-500{color:var(--color-yellow-500)}.normal-case{text-transform:none}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.accent-primary{accent-color:var(--primary)}.opacity-0{opacity:0}.opacity-35{opacity:.35}.opacity-50{opacity:.5}.opacity-75{opacity:.75}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}@media (hover:hover){.group-hover\:opacity-100:is(:where(.group):hover *),.group-hover\/session\:opacity-100:is(:where(.group\/session):hover *){opacity:1}}.placeholder\:text-muted-foreground::placeholder{color:var(--muted-foreground)}@media (hover:hover){.hover\:bg-accent:hover,.hover\:bg-accent\/30:hover{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-accent\/30:hover{background-color:color-mix(in oklab, var(--accent) 30%, transparent)}}.hover\:bg-accent\/50:hover{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-accent\/50:hover{background-color:color-mix(in oklab, var(--accent) 50%, transparent)}}.hover\:bg-primary\/30:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/30:hover{background-color:color-mix(in oklab, var(--primary) 30%, transparent)}}.hover\:bg-primary\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab, var(--primary) 90%, transparent)}}.hover\:bg-red-500\/40:hover{background-color:#fb2c3666}@supports (color:color-mix(in lab, red, red)){.hover\:bg-red-500\/40:hover{background-color:color-mix(in oklab, var(--color-red-500) 40%, transparent)}}.hover\:text-blue-300:hover{color:var(--color-blue-300)}.hover\:text-foreground:hover{color:var(--foreground)}.hover\:text-muted-foreground:hover{color:var(--muted-foreground)}.hover\:text-primary:hover,.hover\:text-primary\/80:hover{color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.hover\:text-primary\/80:hover{color:color-mix(in oklab, var(--primary) 80%, transparent)}}.hover\:text-yellow-300:hover{color:var(--color-yellow-300)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-80:hover{opacity:.8}}.focus\:border-primary:focus{border-color:var(--primary)}@media not all and (width>=48rem){.max-md\:fixed{position:fixed}.max-md\:inset-y-0{inset-block:0}.max-md\:left-0{left:0}.max-md\:z-20{z-index:20}.max-md\:block{display:block}.max-md\:hidden{display:none}.max-md\:w-\[85vw\]{width:85vw}.max-md\:max-w-\[320px\]{max-width:320px}.max-md\:flex-wrap{flex-wrap:wrap}.max-md\:gap-2{gap:calc(var(--spacing) * 2)}.max-md\:text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}}@media (width>=48rem){.md\:w-10{width:calc(var(--spacing) * 10)}.md\:scrollbar-none{scrollbar-width:none}.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.md\:whitespace-nowrap{white-space:nowrap}}}@property --tw-animation-delay{syntax:"*";inherits:false;initial-value:0s}@property --tw-animation-direction{syntax:"*";inherits:false;initial-value:normal}@property --tw-animation-duration{syntax:"*";inherits:false}@property --tw-animation-fill-mode{syntax:"*";inherits:false;initial-value:none}@property --tw-animation-iteration-count{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-translate-y{syntax:"*";inherits:false;initial-value:0}@property --scroll-fade-t{syntax:"<length-percentage>";inherits:false;initial-value:0}@property --scroll-fade-b{syntax:"<length-percentage>";inherits:false;initial-value:0}@property --scroll-fade-s{syntax:"<length-percentage>";inherits:false;initial-value:0}@property --scroll-fade-e{syntax:"<length-percentage>";inherits:false;initial-value:0}@property --scroll-fade-mask{syntax:"*";inherits:false}@property --shimmer-angle{syntax:"<angle>";inherits:true;initial-value:20deg}@property --shimmer-image{syntax:"*";inherits:false}@property --shimmer-text-fill{syntax:"*";inherits:false}@media (prefers-reduced-motion:reduce){.shimmer{-webkit-text-fill-color:currentColor;background-image:none;animation:none}}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2)format("woff2-variations");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2)format("woff2-variations");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2)format("woff2-variations");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/geist-latin-wght-normal-BgDaEnEv.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{--background:oklch(100% 0 0);--foreground:oklch(14.5% 0 0);--card:oklch(100% 0 0);--card-foreground:oklch(14.5% 0 0);--popover:oklch(100% 0 0);--popover-foreground:oklch(14.5% 0 0);--primary:oklch(20.5% 0 0);--primary-foreground:oklch(98.5% 0 0);--secondary:oklch(97% 0 0);--secondary-foreground:oklch(20.5% 0 0);--muted:oklch(97% 0 0);--muted-foreground:oklch(55.6% 0 0);--accent:oklch(97% 0 0);--accent-foreground:oklch(20.5% 0 0);--destructive:oklch(57.7% .245 27.325);--border:oklch(92.2% 0 0);--input:oklch(92.2% 0 0);--ring:oklch(70.8% 0 0);--chart-1:oklch(87% 0 0);--chart-2:oklch(55.6% 0 0);--chart-3:oklch(43.9% 0 0);--chart-4:oklch(37.1% 0 0);--chart-5:oklch(26.9% 0 0);--radius:.625rem;--sidebar:oklch(98.5% 0 0);--sidebar-foreground:oklch(14.5% 0 0);--sidebar-primary:oklch(20.5% 0 0);--sidebar-primary-foreground:oklch(98.5% 0 0);--sidebar-accent:oklch(97% 0 0);--sidebar-accent-foreground:oklch(20.5% 0 0);--sidebar-border:oklch(92.2% 0 0);--sidebar-ring:oklch(70.8% 0 0)}.dark{--background:oklch(14.5% 0 0);--foreground:oklch(98.5% 0 0);--card:oklch(20.5% 0 0);--card-foreground:oklch(98.5% 0 0);--popover:oklch(20.5% 0 0);--popover-foreground:oklch(98.5% 0 0);--primary:oklch(92.2% 0 0);--primary-foreground:oklch(20.5% 0 0);--secondary:oklch(26.9% 0 0);--secondary-foreground:oklch(98.5% 0 0);--muted:oklch(26.9% 0 0);--muted-foreground:oklch(70.8% 0 0);--accent:oklch(26.9% 0 0);--accent-foreground:oklch(98.5% 0 0);--destructive:oklch(70.4% .191 22.216);--border:oklch(100% 0 0/.1);--input:oklch(100% 0 0/.15);--ring:oklch(55.6% 0 0);--chart-1:oklch(87% 0 0);--chart-2:oklch(55.6% 0 0);--chart-3:oklch(43.9% 0 0);--chart-4:oklch(37.1% 0 0);--chart-5:oklch(26.9% 0 0);--sidebar:oklch(20.5% 0 0);--sidebar-foreground:oklch(98.5% 0 0);--sidebar-primary:oklch(48.8% .243 264.376);--sidebar-primary-foreground:oklch(98.5% 0 0);--sidebar-accent:oklch(26.9% 0 0);--sidebar-accent-foreground:oklch(98.5% 0 0);--sidebar-border:oklch(100% 0 0/.1);--sidebar-ring:oklch(55.6% 0 0)}body{font-family:SF Mono,Fira Code,JetBrains Mono,Cascadia Code,monospace!important}@media (width<=768px){body{font-size:16px}.body{padding:10px 12px;font-size:15px}.role,.think-toggle{font-size:12px}}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:oklch(40% 0 0);border-radius:3px}::-webkit-scrollbar-thumb:hover{background:oklch(50% 0 0)}*{scrollbar-width:thin;scrollbar-color:oklch(40% 0 0) transparent}html,body,#root{height:100vh}@supports (height:100dvh){html,body,#root{height:100dvh}}.scrollbar-none{-ms-overflow-style:none;scrollbar-width:none}.scrollbar-none::-webkit-scrollbar{display:none}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}@keyframes pulse{50%{opacity:.5}}@keyframes bounce{0%,to{animation-timing-function:cubic-bezier(.8,0,1,1);transform:translateY(-25%)}50%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:none}}
|