@chainingintention/pi-web-cn 2.202610.5 → 2.202611.2
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 +4 -2
- package/dist/bin/pi-web-server.sh +91 -0
- package/dist/bin/pi-web-sessiond.sh +91 -0
- package/dist/bin/pi-web.sh +91 -0
- package/dist/cli.js +33 -29
- package/dist/cli.js.map +1 -1
- package/dist/client/assets/3d-Dr68X8h8.svg +1 -0
- package/dist/client/assets/PiWebApp-Dur6Wi62.js +3952 -0
- package/dist/client/assets/SettingsDialog-SOljSiee.js +1129 -0
- package/dist/client/assets/abap-uAHVFerN.svg +1 -0
- package/dist/client/assets/abc-CXjdSXsv.svg +1 -0
- package/dist/client/assets/actionscript-BCkIwjgm.svg +1 -0
- package/dist/client/assets/ada-GL6JWmc_.svg +1 -0
- package/dist/client/assets/adobe-illustrator-DhGvkpwi.svg +1 -0
- package/dist/client/assets/adobe-photoshop-0hmnA7cm.svg +1 -0
- package/dist/client/assets/adobe-swc-myFGSGFT.svg +1 -0
- package/dist/client/assets/adonis-SdGYdzCA.svg +1 -0
- package/dist/client/assets/advpl-BWLgf_Ky.svg +1 -0
- package/dist/client/assets/advpl-include-DYgH3R0u.svg +1 -0
- package/dist/client/assets/advpl-ptm-C5Y5ffZi.svg +1 -0
- package/dist/client/assets/advpl-tlpp-BAlVwpPL.svg +1 -0
- package/dist/client/assets/agent-DAWBwR7s.svg +1 -0
- package/dist/client/assets/amplify-BAWPaFFb.svg +1 -0
- package/dist/client/assets/android-TigHCxTb.svg +1 -0
- package/dist/client/assets/angular-D2ijCUIg.svg +1 -0
- package/dist/client/assets/angular-component-eczQQRE6.svg +1 -0
- package/dist/client/assets/angular-directive-C_jq8cjP.svg +1 -0
- package/dist/client/assets/angular-guard-B4iC5rXF.svg +1 -0
- package/dist/client/assets/angular-interceptor-CJvi6DuQ.svg +1 -0
- package/dist/client/assets/angular-pipe-BQZMATB_.svg +1 -0
- package/dist/client/assets/angular-service-DHYn6jIk.svg +1 -0
- package/dist/client/assets/antlr-DkzdiGgY.svg +1 -0
- package/dist/client/assets/apiblueprint-BDRvCIBM.svg +1 -0
- package/dist/client/assets/apollo-BAVoyYDs.svg +1 -0
- package/dist/client/assets/applescript-Bm_R8YT0.svg +1 -0
- package/dist/client/assets/apps-script-6efl-CXu.svg +1 -0
- package/dist/client/assets/appveyor-6B1suIBr.svg +1 -0
- package/dist/client/assets/appwrite-D7AlK8SW.svg +1 -0
- package/dist/client/assets/architecture-CtuqF8rD.svg +1 -0
- package/dist/client/assets/arduino-DFxCIupZ.svg +1 -0
- package/dist/client/assets/asciidoc-DUAdVwVP.svg +1 -0
- package/dist/client/assets/assembly-BKikEKKy.svg +1 -0
- package/dist/client/assets/astro-Bivf18eC.svg +1 -0
- package/dist/client/assets/astro-config-Cr5suFul.svg +1 -0
- package/dist/client/assets/astyle-BiqOWu-0.svg +1 -0
- package/dist/client/assets/audio-B4FatEUD.svg +1 -0
- package/dist/client/assets/aurelia-CnUjHPcZ.svg +1 -0
- package/dist/client/assets/authors-DdaDoKVR.svg +1 -0
- package/dist/client/assets/auto-BOO_fhxh.svg +1 -0
- package/dist/client/assets/autohotkey-D87F33UG.svg +1 -0
- package/dist/client/assets/autoit-DQTGS66r.svg +1 -0
- package/dist/client/assets/azure-DMSkMABH.svg +1 -0
- package/dist/client/assets/azure-pipelines-CcGJw3Rl.svg +1 -0
- package/dist/client/assets/babel-DFMbiqHA.svg +1 -0
- package/dist/client/assets/ballerina-BT8MyHl8.svg +1 -0
- package/dist/client/assets/bashly-settings-Ch9mIpw9.svg +1 -0
- package/dist/client/assets/bazel-CPXexffJ.svg +1 -0
- package/dist/client/assets/bbx-CB-6IYxw.svg +1 -0
- package/dist/client/assets/beancount-DR_GSwds.svg +1 -0
- package/dist/client/assets/bench-js-DOHd4EZB.svg +1 -0
- package/dist/client/assets/bench-jsx-CLJJl81D.svg +1 -0
- package/dist/client/assets/bench-ts-BM8GsfrF.svg +1 -0
- package/dist/client/assets/bibliography-D3emS1pd.svg +1 -0
- package/dist/client/assets/bibtex-style-CVY4tTiP.svg +1 -0
- package/dist/client/assets/bicep-BMMGt18P.svg +1 -0
- package/dist/client/assets/biome-Bf2373dl.svg +1 -0
- package/dist/client/assets/bitbucket-BQr8Az5R.svg +1 -0
- package/dist/client/assets/bithound-BOh7-s-G.svg +1 -0
- package/dist/client/assets/blender-B7Vz8gxa.svg +1 -0
- package/dist/client/assets/blink-DVWcfhba.svg +1 -0
- package/dist/client/assets/blitz-B4hhOxPa.svg +1 -0
- package/dist/client/assets/bower-CkFcC1Ou.svg +1 -0
- package/dist/client/assets/brainfuck-BXozg9z7.svg +1 -0
- package/dist/client/assets/browserlist-CUbhNMS9.svg +1 -0
- package/dist/client/assets/bruno-CoSNrNfv.svg +1 -0
- package/dist/client/assets/buck-BRuOl0ko.svg +1 -0
- package/dist/client/assets/bucklescript-TfoVgTnq.svg +1 -0
- package/dist/client/assets/buildkite-BrDKWLhW.svg +1 -0
- package/dist/client/assets/bun-CZtgPBjt.svg +1 -0
- package/dist/client/assets/c-CCkhSkL9.svg +1 -0
- package/dist/client/assets/c3-J0cVtsWq.svg +1 -0
- package/dist/client/assets/cabal-CQb4_DnV.svg +1 -0
- package/dist/client/assets/caddy-ywaArsUF.svg +1 -0
- package/dist/client/assets/cadence-BRBsaulT.svg +1 -0
- package/dist/client/assets/cairo-Cls19dwE.svg +1 -0
- package/dist/client/assets/cake-DpuWz3gE.svg +1 -0
- package/dist/client/assets/capacitor-CugB3p3d.svg +1 -0
- package/dist/client/assets/capnp-DtxOZ2_z.svg +1 -0
- package/dist/client/assets/cbx-QvSmyWq4.svg +1 -0
- package/dist/client/assets/cds-Bi3ghsEA.svg +1 -0
- package/dist/client/assets/certificate-B5QPOK_C.svg +1 -0
- package/dist/client/assets/changelog-mhp3hE32.svg +1 -0
- package/dist/client/assets/chess-4hVz24Rg.svg +1 -0
- package/dist/client/assets/chromatic-DRZoj4Hg.svg +1 -0
- package/dist/client/assets/chrome-ox3b9yI4.svg +1 -0
- package/dist/client/assets/circleci-DubwoSEv.svg +1 -0
- package/dist/client/assets/citation-ldCt-JF8.svg +1 -0
- package/dist/client/assets/clangd-bL8W2_13.svg +1 -0
- package/dist/client/assets/claude-DypBvzkn.svg +1 -0
- package/dist/client/assets/cline-Dd7x4bMT.svg +1 -0
- package/dist/client/assets/clojure-wfCfR06G.svg +1 -0
- package/dist/client/assets/cloudfoundry-BS-9yLUv.svg +1 -0
- package/dist/client/assets/cmake-B7q-R28A.svg +1 -0
- package/dist/client/assets/coala-D4YHPVOS.svg +1 -0
- package/dist/client/assets/cobol-wDz3o6g-.svg +1 -0
- package/dist/client/assets/coconut-C7cPswso.svg +1 -0
- package/dist/client/assets/code-climate-BJrwzyOv.svg +1 -0
- package/dist/client/assets/codecov-CXg1oY95.svg +1 -0
- package/dist/client/assets/codeowners-D_rztV49.svg +1 -0
- package/dist/client/assets/coderabbit-ai-DGoTDlyw.svg +1 -0
- package/dist/client/assets/coffee-D5JGmA63.svg +1 -0
- package/dist/client/assets/coldfusion-DhOnvVS_.svg +1 -0
- package/dist/client/assets/coloredpetrinets-DY894G_S.svg +1 -0
- package/dist/client/assets/command-Df3AkI2A.svg +1 -0
- package/dist/client/assets/commitizen-9SU1u7to.svg +1 -0
- package/dist/client/assets/commitlint-3vvjpxJt.svg +1 -0
- package/dist/client/assets/composerShortcuts-BggqvE9J.js +31 -0
- package/dist/client/assets/concourse-DAGkX2vY.svg +1 -0
- package/dist/client/assets/conduct-2Bm8RK0N.svg +1 -0
- package/dist/client/assets/console-pcgGAn8Z.svg +1 -0
- package/dist/client/assets/contentlayer-vXTwXOHk.svg +1 -0
- package/dist/client/assets/context-CebLrksE.svg +1 -0
- package/dist/client/assets/contributing-DLcmDS34.svg +1 -0
- package/dist/client/assets/controller-Doc75EnV.svg +1 -0
- package/dist/client/assets/copilot-DBlNrZ6L.svg +1 -0
- package/dist/client/assets/cpp-DT2939hp.svg +1 -0
- package/dist/client/assets/craco-BySmcQ23.svg +1 -0
- package/dist/client/assets/credits-GALyqcNu.svg +1 -0
- package/dist/client/assets/crystal-BbNQlJLs.svg +1 -0
- package/dist/client/assets/csharp-D5ZKsaqY.svg +1 -0
- package/dist/client/assets/css-JKwEyWYb.svg +1 -0
- package/dist/client/assets/css-map-Ctu4D9Ve.svg +1 -0
- package/dist/client/assets/cucumber-B3ZYwjRe.svg +1 -0
- package/dist/client/assets/cuda-CRW2z42A.svg +1 -0
- package/dist/client/assets/cue-ni2TTLiZ.svg +1 -0
- package/dist/client/assets/cursor-CJahHGg2.svg +1 -0
- package/dist/client/assets/cypress-DR0JRbfI.svg +1 -0
- package/dist/client/assets/d-B87zyVMx.svg +1 -0
- package/dist/client/assets/dart-Dx2oVcaR.svg +1 -0
- package/dist/client/assets/dart_generated-Wk58pte9.svg +1 -0
- package/dist/client/assets/database-B_oKaDcf.svg +1 -0
- package/dist/client/assets/deepsource-DUTIJ9mv.svg +1 -0
- package/dist/client/assets/denizenscript-BJc2vgOS.svg +1 -0
- package/dist/client/assets/deno-CyFvrzCm.svg +1 -0
- package/dist/client/assets/dependabot-BgJkJLU3.svg +1 -0
- package/dist/client/assets/dependencies-update-CdGy9ujO.svg +1 -0
- package/dist/client/assets/dhall-Dmhh82EO.svg +1 -0
- package/dist/client/assets/diff-6SXDCokN.svg +1 -0
- package/dist/client/assets/dinophp-D9hQnqAR.svg +1 -0
- package/dist/client/assets/disc-h_dLNGEL.svg +1 -0
- package/dist/client/assets/django-N1UNAXk1.svg +1 -0
- package/dist/client/assets/dll-1DkaBp0q.svg +1 -0
- package/dist/client/assets/docker-CfHcr61D.svg +1 -0
- package/dist/client/assets/doctex-installer-Cs7SA-ct.svg +1 -0
- package/dist/client/assets/document-o-3iA9GQ.svg +1 -0
- package/dist/client/assets/dotjs-DIyH7Gzv.svg +1 -0
- package/dist/client/assets/drawio-2RVDLi9g.svg +1 -0
- package/dist/client/assets/drizzle-hhBCZx1t.svg +1 -0
- package/dist/client/assets/drone-KvQ2n-xY.svg +1 -0
- package/dist/client/assets/dtx-DdGk8fFj.svg +1 -0
- package/dist/client/assets/duc-CHcAZQos.svg +1 -0
- package/dist/client/assets/dune-DuGO6qDA.svg +1 -0
- package/dist/client/assets/edge-ChHKXrYp.svg +1 -0
- package/dist/client/assets/editorconfig-BUzUAwRX.svg +1 -0
- package/dist/client/assets/ejs-D_Li05n3.svg +1 -0
- package/dist/client/assets/elixir-75mYTx2s.svg +1 -0
- package/dist/client/assets/elm-DE_LIp02.svg +1 -0
- package/dist/client/assets/email-G8mUttGa.svg +1 -0
- package/dist/client/assets/ember-B1y9-Oks.svg +1 -0
- package/dist/client/assets/epub-DPvrBCNf.svg +1 -0
- package/dist/client/assets/erlang-DosS6spf.svg +1 -0
- package/dist/client/assets/esbuild-DV6xNZ-T.svg +1 -0
- package/dist/client/assets/eslint-IU_g232-.svg +1 -0
- package/dist/client/assets/excalidraw-BllKd-7L.svg +1 -0
- package/dist/client/assets/exe-SfcXmkQy.svg +1 -0
- package/dist/client/assets/expo-B4PonO4I.svg +1 -0
- package/dist/client/assets/external-DjGXa4ZP.js +1 -0
- package/dist/client/assets/fastlane-C4SZDg50.svg +1 -0
- package/dist/client/assets/favicon-VsCcG-A-.svg +1 -0
- package/dist/client/assets/figma-C8Gjq2Xj.svg +1 -0
- package/dist/client/assets/file-BEIHQH8Q.svg +256 -0
- package/dist/client/assets/firebase-DHIO0glR.svg +1 -0
- package/dist/client/assets/flash-Dck7x_rj.svg +1 -0
- package/dist/client/assets/flow-DD4KQiTg.svg +1 -0
- package/dist/client/assets/font-ChbWr8nk.svg +1 -0
- package/dist/client/assets/forth-C3qwGqMh.svg +1 -0
- package/dist/client/assets/fortran-B0jORJ3v.svg +1 -0
- package/dist/client/assets/foxpro-D3Wp1B1h.svg +1 -0
- package/dist/client/assets/freemarker-BLonnh3h.svg +1 -0
- package/dist/client/assets/fsharp-QwwPC8x_.svg +1 -0
- package/dist/client/assets/fusebox-DqjzyXyI.svg +1 -0
- package/dist/client/assets/gamemaker-C82Pt646.svg +1 -0
- package/dist/client/assets/garden-BUsWpFKW.svg +1 -0
- package/dist/client/assets/gatsby-OA1TADMJ.svg +1 -0
- package/dist/client/assets/gcp-CW2RG_Wp.svg +1 -0
- package/dist/client/assets/gemfile-1RY6BqSx.svg +1 -0
- package/dist/client/assets/gemini-CIgUY8Tg.svg +1 -0
- package/dist/client/assets/gemini-ai-Bwe7HeFb.svg +1 -0
- package/dist/client/assets/git-BEMs8TOZ.svg +1 -0
- package/dist/client/assets/gitlab-zt07_Oa4.svg +1 -0
- package/dist/client/assets/gitpod-BtZJQuF0.svg +1 -0
- package/dist/client/assets/gleam-CKPcrRAD.svg +1 -0
- package/dist/client/assets/gnuplot-BvFqM0ms.svg +1 -0
- package/dist/client/assets/go-ByY4sxRu.svg +1 -0
- package/dist/client/assets/go-mod-CB6BWQDr.svg +1 -0
- package/dist/client/assets/godot-C1EmL4jR.svg +1 -0
- package/dist/client/assets/godot-assets-D-FMsuJX.svg +1 -0
- package/dist/client/assets/google-BnrMOJ4V.svg +1 -0
- package/dist/client/assets/gradle-zsQ12U1q.svg +1 -0
- package/dist/client/assets/grafana-alloy-D2DQ33BM.svg +1 -0
- package/dist/client/assets/grain-5NkvKROL.svg +1 -0
- package/dist/client/assets/graphcool-CInCTIdE.svg +1 -0
- package/dist/client/assets/graphql-DnNt2maR.svg +1 -0
- package/dist/client/assets/gridsome-C2H5SpaD.svg +1 -0
- package/dist/client/assets/groovy-B93RxI7a.svg +1 -0
- package/dist/client/assets/grunt-cwitasVS.svg +1 -0
- package/dist/client/assets/gulp-BIZ8EAl0.svg +1 -0
- package/dist/client/assets/h-1bd73y8t.svg +1 -0
- package/dist/client/assets/hack-Bsd1y9bu.svg +1 -0
- package/dist/client/assets/hadolint-D1aEtESc.svg +1 -0
- package/dist/client/assets/haml-BKq8hU-U.svg +1 -0
- package/dist/client/assets/handlebars-Dem98Ago.svg +1 -0
- package/dist/client/assets/happo-B64XokX0.svg +1 -0
- package/dist/client/assets/hardhat-ByFzkuf4.svg +1 -0
- package/dist/client/assets/harmonix-CUh3S11M.svg +1 -0
- package/dist/client/assets/haskell-C6GxEwdX.svg +1 -0
- package/dist/client/assets/haxe-DdxZWPQy.svg +1 -0
- package/dist/client/assets/hcl-BJiZ3gWE.svg +1 -0
- package/dist/client/assets/helm-CF4Mi35z.svg +1 -0
- package/dist/client/assets/heroku-B6vPz_TJ.svg +1 -0
- package/dist/client/assets/hex-BuGJuqn1.svg +1 -0
- package/dist/client/assets/hip-DB4xe1Ab.svg +1 -0
- package/dist/client/assets/histoire-BMTufysg.svg +1 -0
- package/dist/client/assets/hjson-Dl4ZTgK4.svg +1 -0
- package/dist/client/assets/horusec-z6vyrVAy.svg +1 -0
- package/dist/client/assets/hosts-BydfWJ9z.svg +1 -0
- package/dist/client/assets/hpp-HerxyIaC.svg +1 -0
- package/dist/client/assets/html-BNRzQ3jk.svg +1 -0
- package/dist/client/assets/http-Cp7RCu8F.svg +1 -0
- package/dist/client/assets/huff-t3uGT10D.svg +1 -0
- package/dist/client/assets/hurl-S3Fvmz3R.svg +1 -0
- package/dist/client/assets/husky-A0ALYNcp.svg +1 -0
- package/dist/client/assets/i18n-BezCQ09L.svg +1 -0
- package/dist/client/assets/idris-CfHPjxcM.svg +1 -0
- package/dist/client/assets/ifanr-cloud-DnqgZYHA.svg +1 -0
- package/dist/client/assets/image-DYZiZ4CP.svg +1 -0
- package/dist/client/assets/imba-C1Q6aK1I.svg +1 -0
- package/dist/client/assets/index-CInvlJKI.js +2 -0
- package/dist/client/assets/installation-p19cVXO7.svg +1 -0
- package/dist/client/assets/instructions-CaWEzdge.svg +1 -0
- package/dist/client/assets/ionic-Xp-47Icg.svg +1 -0
- package/dist/client/assets/istanbul-DJKvMwnq.svg +1 -0
- package/dist/client/assets/jar-BaN44U3v.svg +1 -0
- package/dist/client/assets/java-QyMrrPma.svg +1 -0
- package/dist/client/assets/javaclass-BU8_3KBR.svg +1 -0
- package/dist/client/assets/javascript-CQjpTQab.svg +1 -0
- package/dist/client/assets/javascript-map-BQGiWnDM.svg +1 -0
- package/dist/client/assets/jenkins-Bf7aNz-w.svg +1 -0
- package/dist/client/assets/jest-BgbiFFEd.svg +1 -0
- package/dist/client/assets/jinja-4WR9tA6i.svg +1 -0
- package/dist/client/assets/jsconfig-ZAi6fTF1.svg +1 -0
- package/dist/client/assets/json-NsberLUP.svg +1 -0
- package/dist/client/assets/json_schema-sOuobP_H.svg +1 -0
- package/dist/client/assets/jsr-CWVSPSyV.svg +1 -0
- package/dist/client/assets/julia-DCKDSo9T.svg +1 -0
- package/dist/client/assets/jupyter-BKV2q0IB.svg +1 -0
- package/dist/client/assets/just-WQgcj-TR.svg +1 -0
- package/dist/client/assets/karma-Dm3AtiMd.svg +1 -0
- package/dist/client/assets/kcl-CyzArNE1.svg +1 -0
- package/dist/client/assets/key-CrFjkQiv.svg +1 -0
- package/dist/client/assets/keystatic-BECeLiHJ.svg +1 -0
- package/dist/client/assets/kivy-baDYR7ar.svg +1 -0
- package/dist/client/assets/kl-Dy3qeUbd.svg +1 -0
- package/dist/client/assets/knip-BWpBMXqu.svg +1 -0
- package/dist/client/assets/kotlin-DcjME28v.svg +1 -0
- package/dist/client/assets/kubernetes-B5EEXb3e.svg +1 -0
- package/dist/client/assets/kusto-CIjvTfRW.svg +1 -0
- package/dist/client/assets/label-AKZOJqFh.svg +1 -0
- package/dist/client/assets/laravel-DWauj5w4.svg +1 -0
- package/dist/client/assets/latexmk-DQ0u8QMa.svg +1 -0
- package/dist/client/assets/lbx-BMCQe48q.svg +1 -0
- package/dist/client/assets/lean-COOrALn9.svg +1 -0
- package/dist/client/assets/lefthook-DClcp3br.svg +1 -0
- package/dist/client/assets/lerna-BsWY3uYS.svg +1 -0
- package/dist/client/assets/less-0c0PeB1Z.svg +1 -0
- package/dist/client/assets/liara-CSN9sJzE.svg +1 -0
- package/dist/client/assets/lib-B-NXM8aC.svg +1 -0
- package/dist/client/assets/license-DmydDYqK.svg +1 -0
- package/dist/client/assets/lighthouse-CtbIoCdK.svg +1 -0
- package/dist/client/assets/lilypond-CBSm3LFL.svg +1 -0
- package/dist/client/assets/lintstaged-Bj1Eddi5.svg +1 -0
- package/dist/client/assets/liquid-ClnkrScY.svg +1 -0
- package/dist/client/assets/lisp-CMn3epg5.svg +1 -0
- package/dist/client/assets/lit-CJ6w1GHF.js +2 -0
- package/dist/client/assets/livescript-B5PkWD8e.svg +1 -0
- package/dist/client/assets/lock-DRloBj1S.svg +1 -0
- package/dist/client/assets/log-Db6NwxHZ.svg +1 -0
- package/dist/client/assets/lolcode-C6q6fY1O.svg +1 -0
- package/dist/client/assets/lottie-ExyLYhtq.svg +1 -0
- package/dist/client/assets/lua-CUh_Iwk8.svg +1 -0
- package/dist/client/assets/luau-De_4eP_9.svg +1 -0
- package/dist/client/assets/lynx-B49IBNBN.svg +1 -0
- package/dist/client/assets/lyric-Bm3UlVp3.svg +1 -0
- package/dist/client/assets/macaulay2-0YotwNnE.svg +1 -0
- package/dist/client/assets/main-CWcn0Deu.js +2 -0
- package/dist/client/assets/makefile-B2WlY55Y.svg +1 -0
- package/dist/client/assets/markdoc-DjROVW5I.svg +1 -0
- package/dist/client/assets/markdoc-config-BpVRhg1B.svg +1 -0
- package/dist/client/assets/markdown-Bm_LLmmi.svg +1 -0
- package/dist/client/assets/markdownlint-D4M2LXbH.svg +1 -0
- package/dist/client/assets/markojs-BohUrSLp.svg +1 -0
- package/dist/client/assets/mathematica-BGWNQXSR.svg +1 -0
- package/dist/client/assets/maven-BffVB5hm.svg +1 -0
- package/dist/client/assets/mdsvex-Dc9CFJJa.svg +1 -0
- package/dist/client/assets/mdx-D6qa5U8C.svg +1 -0
- package/dist/client/assets/mercurial-BDoD6ubd.svg +1 -0
- package/dist/client/assets/merlin-D5wTXfO4.svg +1 -0
- package/dist/client/assets/mermaid-BTscZDRS.svg +1 -0
- package/dist/client/assets/meson-dcvm8lmo.svg +1 -0
- package/dist/client/assets/metro-XIyWX0Go.svg +1 -0
- package/dist/client/assets/minecraft-CE8xXE3-.svg +1 -0
- package/dist/client/assets/minecraft-fabric-wG6LwgIf.svg +1 -0
- package/dist/client/assets/mint-Cb-YXACo.svg +1 -0
- package/dist/client/assets/mist-DAm4UkTw.svg +1 -0
- package/dist/client/assets/mjml-C_r30C5E.svg +1 -0
- package/dist/client/assets/mocha-BF5_j65C.svg +1 -0
- package/dist/client/assets/modernizr-89IMS8eL.svg +1 -0
- package/dist/client/assets/mojo-CscjT2Jm.svg +1 -0
- package/dist/client/assets/moon-_L_nTq1_.svg +1 -0
- package/dist/client/assets/moonscript-Ayut2PrD.svg +1 -0
- package/dist/client/assets/mrpack-BVpGpKVf.svg +1 -0
- package/dist/client/assets/mxml-B21Nbdgw.svg +1 -0
- package/dist/client/assets/nano-staged-CAVSFkY8.svg +1 -0
- package/dist/client/assets/ndst-DpYLiHkx.svg +1 -0
- package/dist/client/assets/nest-CUu_iPqI.svg +1 -0
- package/dist/client/assets/netlify-Bb7vRMfV.svg +1 -0
- package/dist/client/assets/next-2gAImGWJ.svg +1 -0
- package/dist/client/assets/nextflow-dPJG5e3G.svg +1 -0
- package/dist/client/assets/nginx-Ss9U_SJ3.svg +1 -0
- package/dist/client/assets/nim-CXHB5kuH.svg +1 -0
- package/dist/client/assets/nix-DoxxkZ2k.svg +1 -0
- package/dist/client/assets/nodejs-Czg5JT6z.svg +1 -0
- package/dist/client/assets/nodemon-CprsexAJ.svg +1 -0
- package/dist/client/assets/npm-BSKPS9CC.svg +1 -0
- package/dist/client/assets/nuget-D_mqKH22.svg +1 -0
- package/dist/client/assets/nunjucks-CSL1En7R.svg +1 -0
- package/dist/client/assets/nuxt-BszScKzK.svg +1 -0
- package/dist/client/assets/nx-CTIqtdbG.svg +1 -0
- package/dist/client/assets/objective-c-3E5wWl6u.svg +1 -0
- package/dist/client/assets/objective-cpp-DjpoLOMo.svg +1 -0
- package/dist/client/assets/ocaml-T4fLeZFT.svg +1 -0
- package/dist/client/assets/odin-DlWnbZWN.svg +1 -0
- package/dist/client/assets/onnx-C6WInyrb.svg +1 -0
- package/dist/client/assets/opa-D5GoZW5M.svg +1 -0
- package/dist/client/assets/opam-3IZadro4.svg +1 -0
- package/dist/client/assets/openapi-DjlVyoOp.svg +1 -0
- package/dist/client/assets/opencode-BaYncWio.svg +1 -0
- package/dist/client/assets/opentofu-jFw9lQBP.svg +1 -0
- package/dist/client/assets/otne-SLiO8whA.svg +1 -0
- package/dist/client/assets/oxc-DN6_023j.svg +1 -0
- package/dist/client/assets/packship-UyLXQ_8n.svg +1 -0
- package/dist/client/assets/palette-C0GOsJgu.svg +1 -0
- package/dist/client/assets/panda-D469wGns.svg +1 -0
- package/dist/client/assets/parcel-BrXQSBYb.svg +1 -0
- package/dist/client/assets/pascal-oxGvvJ_x.svg +1 -0
- package/dist/client/assets/pawn-BvapPd-t.svg +1 -0
- package/dist/client/assets/payload-Cks6N40-.svg +1 -0
- package/dist/client/assets/pdf-DtjgBDdX.svg +1 -0
- package/dist/client/assets/pdm-CbwhGqOl.svg +1 -0
- package/dist/client/assets/peg-BJdFn78b.svg +1 -0
- package/dist/client/assets/percy-CWbuYL05.svg +1 -0
- package/dist/client/assets/perl-DUX0zwsQ.svg +1 -0
- package/dist/client/assets/php-5lebFt-d.svg +1 -0
- package/dist/client/assets/php-cs-fixer-D3Vv91zO.svg +1 -0
- package/dist/client/assets/phpstan-D9FJYotS.svg +1 -0
- package/dist/client/assets/phpunit-BlNyjrEw.svg +1 -0
- package/dist/client/assets/pinejs-CDuWmsOY.svg +1 -0
- package/dist/client/assets/pipeline-CCHJ-CIC.svg +1 -0
- package/dist/client/assets/pkl-CzHZDqdt.svg +1 -0
- package/dist/client/assets/plastic-CvMMB3c5.svg +1 -0
- package/dist/client/assets/playwright-C8c_RKic.svg +1 -0
- package/dist/client/assets/plop-D4uymN-_.svg +1 -0
- package/dist/client/assets/pm2-ecosystem-Cv28zGx9.svg +1 -0
- package/dist/client/assets/pnpm-ndvMXYUu.svg +1 -0
- package/dist/client/assets/poetry-ClZfXo_0.svg +1 -0
- package/dist/client/assets/postcss-g3C3DDoi.svg +1 -0
- package/dist/client/assets/posthtml-BkDCsIkz.svg +1 -0
- package/dist/client/assets/powerpoint-CCXYfzLu.svg +1 -0
- package/dist/client/assets/powershell-DnXi9Rjx.svg +1 -0
- package/dist/client/assets/pre-commit-DXbl2unR.svg +1 -0
- package/dist/client/assets/preload-helper-CRzLMJPS.js +1 -0
- package/dist/client/assets/prettier-DFxlFAp4.svg +1 -0
- package/dist/client/assets/prisma-BgG1MIwh.svg +1 -0
- package/dist/client/assets/processing-B1bs0VmW.svg +1 -0
- package/dist/client/assets/prolog-CxwCfnlm.svg +1 -0
- package/dist/client/assets/prompt-7jgVTNou.svg +1 -0
- package/dist/client/assets/proto-Bv4-L0XU.svg +1 -0
- package/dist/client/assets/protractor-CJWv1lK-.svg +1 -0
- package/dist/client/assets/pug-BXlORXuH.svg +1 -0
- package/dist/client/assets/puppet-CKCVJvZX.svg +1 -0
- package/dist/client/assets/puppeteer-DDZkfQNZ.svg +1 -0
- package/dist/client/assets/purescript-CUdIfJrp.svg +1 -0
- package/dist/client/assets/python-misc-BZ5TXfdG.svg +1 -0
- package/dist/client/assets/python-oHA753pt.svg +1 -0
- package/dist/client/assets/pytorch-f0udCMaw.svg +1 -0
- package/dist/client/assets/qsharp-BaFNvoXS.svg +1 -0
- package/dist/client/assets/quarto-zhC7oGOB.svg +1 -0
- package/dist/client/assets/quasar-BXE2pW5w.svg +1 -0
- package/dist/client/assets/quokka-DrMOw93T.svg +1 -0
- package/dist/client/assets/r-AQewf3lz.svg +1 -0
- package/dist/client/assets/racket-BCyLzvrP.svg +1 -0
- package/dist/client/assets/raml-WDbT4cRb.svg +1 -0
- package/dist/client/assets/razor-BAUCpTxC.svg +1 -0
- package/dist/client/assets/rbxmk-CZ9pB7X6.svg +1 -0
- package/dist/client/assets/rc-BDgxm_A8.svg +1 -0
- package/dist/client/assets/react-CdMrIyLK.svg +1 -0
- package/dist/client/assets/react_ts-9WeLJBIj.svg +1 -0
- package/dist/client/assets/readme-BSIQKZwq.svg +1 -0
- package/dist/client/assets/reason-m9vOqeqw.svg +1 -0
- package/dist/client/assets/red-Dzf3O8j4.svg +1 -0
- package/dist/client/assets/regedit-DJzxfiQN.svg +1 -0
- package/dist/client/assets/remark-C55cxr93.svg +1 -0
- package/dist/client/assets/remix-Bk2h4zH7.svg +1 -0
- package/dist/client/assets/renovate-zzi8oRFv.svg +1 -0
- package/dist/client/assets/replit-BpeMxcBh.svg +1 -0
- package/dist/client/assets/requiredTerminalPlugin-B-0wkiKe.js +3 -0
- package/dist/client/assets/rescript-interface-a87dYX5u.svg +1 -0
- package/dist/client/assets/rescript-qPAwtDLa.svg +1 -0
- package/dist/client/assets/restql-CnZcZpny.svg +1 -0
- package/dist/client/assets/riot-DjRzaRVp.svg +1 -0
- package/dist/client/assets/roadmap-DWpVc5P5.svg +1 -0
- package/dist/client/assets/roblox-Bv5zbklC.svg +1 -0
- package/dist/client/assets/robot-Cto_i8jo.svg +1 -0
- package/dist/client/assets/robots-COnOCAqh.svg +1 -0
- package/dist/client/assets/rocket-CAmUpMm6.svg +1 -0
- package/dist/client/assets/rolldown-Cy_4AzVW.svg +1 -0
- package/dist/client/assets/rollup-2ZkmBeWV.svg +1 -0
- package/dist/client/assets/rome-Cq3lb2xY.svg +1 -0
- package/dist/client/assets/routing-BNxHhbXZ.svg +1 -0
- package/dist/client/assets/rspec-CoEmfx5H.svg +1 -0
- package/dist/client/assets/rstack-DzJ3cPXM.svg +1 -0
- package/dist/client/assets/rubocop-CokGq15J.svg +1 -0
- package/dist/client/assets/ruby-DTGQ4xCM.svg +1 -0
- package/dist/client/assets/ruff-BN0KpNzC.svg +1 -0
- package/dist/client/assets/rust-B122pUHY.svg +1 -0
- package/dist/client/assets/salt-B8j0OVNV.svg +1 -0
- package/dist/client/assets/san-C0UnyaU4.svg +1 -0
- package/dist/client/assets/sas-RNoBA0-Y.svg +1 -0
- package/dist/client/assets/sass-B7y5mYt_.svg +1 -0
- package/dist/client/assets/sbt-DosCci-d.svg +1 -0
- package/dist/client/assets/scala-CsGkKwl5.svg +1 -0
- package/dist/client/assets/scheme-CS2UbTis.svg +1 -0
- package/dist/client/assets/scons-CyqfFgvx.svg +1 -0
- package/dist/client/assets/screwdriver-DjTKuDz7.svg +1 -0
- package/dist/client/assets/search-fq7VxV09.svg +1 -0
- package/dist/client/assets/semantic-release-BbLzZX96.svg +1 -0
- package/dist/client/assets/semgrep-Cl6VUQtd.svg +1 -0
- package/dist/client/assets/sentry-MrouyD-P.svg +1 -0
- package/dist/client/assets/sequelize-BQWikTCs.svg +1 -0
- package/dist/client/assets/serverless-C7Jdn6_T.svg +1 -0
- package/dist/client/assets/settings-CtzL1evz.svg +1 -0
- package/dist/client/assets/shader-BZXKDeiD.svg +1 -0
- package/dist/client/assets/shellcheck-BgWOclub.svg +1 -0
- package/dist/client/assets/simulink-yQnKyx__.svg +1 -0
- package/dist/client/assets/siyuan-CPWD86-6.svg +1 -0
- package/dist/client/assets/sketch-NbltjaPf.svg +1 -0
- package/dist/client/assets/skill-BThvgH87.svg +1 -0
- package/dist/client/assets/slim-CTjdZAfz.svg +1 -0
- package/dist/client/assets/slint-B0xbkqgr.svg +1 -0
- package/dist/client/assets/slug-CWkQgR9s.svg +1 -0
- package/dist/client/assets/smarty-BXDiLQNt.svg +1 -0
- package/dist/client/assets/sml-DMkoWEN5.svg +1 -0
- package/dist/client/assets/snakemake-xG7xUrdI.svg +1 -0
- package/dist/client/assets/snapcraft-zvgAcZ4p.svg +1 -0
- package/dist/client/assets/snowpack-l0uHt304.svg +1 -0
- package/dist/client/assets/snyk-DCW3rtvv.svg +1 -0
- package/dist/client/assets/solidity-C4TQWJKU.svg +1 -0
- package/dist/client/assets/sonarcloud-ClLIXGyx.svg +1 -0
- package/dist/client/assets/spwn-31WG9ftR.svg +1 -0
- package/dist/client/assets/stackblitz-ZX6aBRKb.svg +1 -0
- package/dist/client/assets/stan-CPcUXbxB.svg +1 -0
- package/dist/client/assets/steadybit-BZtlLY-3.svg +1 -0
- package/dist/client/assets/stencil-D0FNO32O.svg +1 -0
- package/dist/client/assets/stitches-BYlEJvuz.svg +1 -0
- package/dist/client/assets/storybook-KxGhpZYa.svg +1 -0
- package/dist/client/assets/stryker-CYflxT_R.svg +1 -0
- package/dist/client/assets/sty-C4HqHV4z.svg +1 -0
- package/dist/client/assets/stylable-Bi9Gr97T.svg +1 -0
- package/dist/client/assets/styleSources-CdF2T_pj.js +1 -0
- package/dist/client/assets/stylelint-JSbd-yhE.svg +1 -0
- package/dist/client/assets/styles-BwN5rgmt.js +10 -0
- package/dist/client/assets/styles-DK4aKhCE.js +1 -0
- package/dist/client/assets/stylus-ZoqbP9jE.svg +1 -0
- package/dist/client/assets/sublime-DFvp_Ess.svg +1 -0
- package/dist/client/assets/subtitles-BNOc1mEf.svg +1 -0
- package/dist/client/assets/supabase-CX7cap86.svg +1 -0
- package/dist/client/assets/svelte-B8HKO6BX.svg +1 -0
- package/dist/client/assets/svelte_js-C_RKcwSP.svg +1 -0
- package/dist/client/assets/svelte_ts-APH7lcVp.svg +1 -0
- package/dist/client/assets/svg-DVy7iktw.svg +1 -0
- package/dist/client/assets/svgo-CJXaeDEN.svg +1 -0
- package/dist/client/assets/svgr-Dn8OFGar.svg +1 -0
- package/dist/client/assets/swagger-Dqyrwr4g.svg +1 -0
- package/dist/client/assets/sway-C1Kkif7r.svg +1 -0
- package/dist/client/assets/swc-BUhoW8cb.svg +1 -0
- package/dist/client/assets/swift-D4_pkWil.svg +1 -0
- package/dist/client/assets/syncpack-DtZ994Gf.svg +1 -0
- package/dist/client/assets/table-YhsaNNk_.svg +1 -0
- package/dist/client/assets/tailwindcss-DODJSdj1.svg +1 -0
- package/dist/client/assets/tape-DGYhnMht.svg +1 -0
- package/dist/client/assets/taskfile-f5DM79_-.svg +1 -0
- package/dist/client/assets/tauri-DBBtDoCo.svg +1 -0
- package/dist/client/assets/taze-BPR9LgXp.svg +1 -0
- package/dist/client/assets/tcl-CiAJKGaA.svg +1 -0
- package/dist/client/assets/teal-WyfAQok0.svg +1 -0
- package/dist/client/assets/templ-BHla0pe-.svg +1 -0
- package/dist/client/assets/template-qJWiB5gQ.svg +1 -0
- package/dist/client/assets/terraform-R86_iPhv.svg +1 -0
- package/dist/client/assets/test-js-A34KrdbK.svg +1 -0
- package/dist/client/assets/test-jsx-C2PQBkQP.svg +1 -0
- package/dist/client/assets/test-ts-fdt299ek.svg +1 -0
- package/dist/client/assets/tex-DpewR4UN.svg +1 -0
- package/dist/client/assets/textlint-pjwsbDhs.svg +1 -0
- package/dist/client/assets/themeCatalog-B3yda95n.js +1 -0
- package/dist/client/assets/themePreference-BBiJxLjs.js +1 -0
- package/dist/client/assets/themeStartup-0b02tNrh.js +2 -0
- package/dist/client/assets/tilt-Dwon5dv-.svg +1 -0
- package/dist/client/assets/tldraw-BnDJmluq.svg +1 -0
- package/dist/client/assets/tobi-CQ-666uh.svg +1 -0
- package/dist/client/assets/tobimake-DzDbTYW1.svg +1 -0
- package/dist/client/assets/toc-nUTycYjl.svg +1 -0
- package/dist/client/assets/todo-CpcorlsE.svg +1 -0
- package/dist/client/assets/toml-DvUt-GOd.svg +1 -0
- package/dist/client/assets/toon-CGe9RDKY.svg +1 -0
- package/dist/client/assets/travis-CH6zNy43.svg +1 -0
- package/dist/client/assets/tree-epW9JaxP.svg +1 -0
- package/dist/client/assets/trigger-CqdxCyG0.svg +1 -0
- package/dist/client/assets/tsconfig-ROp_YdWL.svg +1 -0
- package/dist/client/assets/tsdoc-BEXcYgLD.svg +1 -0
- package/dist/client/assets/tsdown-B96z16my.svg +1 -0
- package/dist/client/assets/tsil-D-U9yWS8.svg +1 -0
- package/dist/client/assets/tune-DISlqKNZ.svg +1 -0
- package/dist/client/assets/turborepo-CWNwoZtI.svg +1 -0
- package/dist/client/assets/twig-CA70AYNK.svg +1 -0
- package/dist/client/assets/twine-BPJsGZd2.svg +1 -0
- package/dist/client/assets/typedoc-FY7jFoGW.svg +1 -0
- package/dist/client/assets/typescript-DjjXqw-n.svg +1 -0
- package/dist/client/assets/typescript-def-CTN5WM5i.svg +1 -0
- package/dist/client/assets/typst-CnDSkp_i.svg +1 -0
- package/dist/client/assets/uiua-BOsurlxn.svg +1 -0
- package/dist/client/assets/umi-DYOjFi8w.svg +1 -0
- package/dist/client/assets/uml-CYijxuna.svg +1 -0
- package/dist/client/assets/unity-CRNCEoK6.svg +1 -0
- package/dist/client/assets/unlicense-DG_b3BEE.svg +1 -0
- package/dist/client/assets/unocss-MqLuLfeL.svg +1 -0
- package/dist/client/assets/url-hE4h5p6b.svg +1 -0
- package/dist/client/assets/uv-DRTOVSi_.svg +1 -0
- package/dist/client/assets/vagrant-YnxMTuKe.svg +1 -0
- package/dist/client/assets/vala-m_i2ZWns.svg +1 -0
- package/dist/client/assets/vanilla-extract-76H6-A4R.svg +1 -0
- package/dist/client/assets/varnish-CX3oiNcp.svg +1 -0
- package/dist/client/assets/vedic-D6-oQUka.svg +1 -0
- package/dist/client/assets/velite-nLLNxKBA.svg +1 -0
- package/dist/client/assets/velocity-CSvfE9yM.svg +1 -0
- package/dist/client/assets/vercel-CgKLo9IO.svg +1 -0
- package/dist/client/assets/verdaccio-gsdiCbvv.svg +1 -0
- package/dist/client/assets/verified-BFLtqroG.svg +1 -0
- package/dist/client/assets/verilog-CbZvRaae.svg +1 -0
- package/dist/client/assets/verse-D_RZ0Bz0.svg +1 -0
- package/dist/client/assets/vfl-8CAM-hjs.svg +1 -0
- package/dist/client/assets/video-qxpJXkH6.svg +1 -0
- package/dist/client/assets/vim-CB8qTVuS.svg +1 -0
- package/dist/client/assets/virtual-Hoc2XbZN.svg +1 -0
- package/dist/client/assets/visualstudio-BHj2x5q7.svg +1 -0
- package/dist/client/assets/vite-JKzchVew.svg +1 -0
- package/dist/client/assets/vitest-Cl4_wKFu.svg +1 -0
- package/dist/client/assets/vlang-C3-DMUIm.svg +1 -0
- package/dist/client/assets/vscode-BtTXhPua.svg +1 -0
- package/dist/client/assets/vue-BlenztPP.svg +1 -0
- package/dist/client/assets/vue-config-o7yPAADv.svg +1 -0
- package/dist/client/assets/wakatime-DNz7qcxZ.svg +1 -0
- package/dist/client/assets/wallaby-C0UIkEOa.svg +1 -0
- package/dist/client/assets/wally-Ds1quKSG.svg +1 -0
- package/dist/client/assets/warp-B3X5Zoeh.svg +1 -0
- package/dist/client/assets/watchman-7EFq9LSa.svg +1 -0
- package/dist/client/assets/webassembly-Bs4UtU2T.svg +1 -0
- package/dist/client/assets/webhint-B4I6V0Ee.svg +1 -0
- package/dist/client/assets/webpack-zo2uWGOg.svg +1 -0
- package/dist/client/assets/wepy-Cho54Qlr.svg +1 -0
- package/dist/client/assets/werf-BW9FiKe5.svg +1 -0
- package/dist/client/assets/windicss-C_8y516i.svg +1 -0
- package/dist/client/assets/wolframlanguage-D6C1WBYh.svg +1 -0
- package/dist/client/assets/word-BcPLm6YH.svg +1 -0
- package/dist/client/assets/wrangler-CjgAkoTg.svg +1 -0
- package/dist/client/assets/wxt-c6drtC9H.svg +1 -0
- package/dist/client/assets/xaml-DE72OHNQ.svg +1 -0
- package/dist/client/assets/xmake-4WNmmIJj.svg +1 -0
- package/dist/client/assets/xml-S4aCxoUr.svg +1 -0
- package/dist/client/assets/yaml-DPTMsOTP.svg +1 -0
- package/dist/client/assets/yang-N-7dP4WI.svg +1 -0
- package/dist/client/assets/yarn-Cios8OFX.svg +1 -0
- package/dist/client/assets/zeabur-kqbNXTTH.svg +1 -0
- package/dist/client/assets/zig-CdphsgLN.svg +1 -0
- package/dist/client/assets/zip-GDnEynqi.svg +1 -0
- package/dist/client/assets/zizmor-IsFFdy6W.svg +1 -0
- package/dist/client/index.html +12 -6
- package/dist/config.js +233 -87
- package/dist/config.js.map +1 -1
- package/dist/configSessionNamingMigration.js +63 -0
- package/dist/configSessionNamingMigration.js.map +1 -0
- package/dist/nativeServices/serviceDoctor.js +3 -3
- package/dist/nativeServices/serviceDoctor.js.map +1 -1
- package/dist/nativeServices/servicePlan.js +53 -23
- package/dist/nativeServices/servicePlan.js.map +1 -1
- package/dist/nativeServices/serviceProbe.js +27 -7
- package/dist/nativeServices/serviceProbe.js.map +1 -1
- package/dist/pi-packages/relays/markdownDocument.js +8 -9
- package/dist/pi-packages/relays/pi-web-plugin.js +11 -11
- package/dist/pi-packages/relays/relays.messages.js +38 -0
- package/dist/pi-packages/relays/relaysLocalization.js +19 -0
- package/dist/pi-packages/relays/relaysPanelElement.js +151 -96
- package/dist/pi-packages/scheduled-tasks/browser/pi-web-plugin.js +1135 -0
- package/dist/pi-packages/scheduled-tasks/domain.js +63 -0
- package/dist/pi-packages/scheduled-tasks/extensions/index.js +710 -0
- package/dist/pi-packages/scheduled-tasks/package.json +30 -0
- package/dist/pi-packages/scheduled-tasks/scheduler.js +89 -0
- package/dist/pi-packages/scheduled-tasks/server-plugin.js +9872 -0
- package/dist/pi-packages/scheduled-tasks/service.js +178 -0
- package/dist/pi-packages/scheduled-tasks/skills/scheduled-tasks/SKILL.md +30 -0
- package/dist/pi-packages/scheduled-tasks/sqlite.js +18 -0
- package/dist/pi-packages/scheduled-tasks/store.js +230 -0
- package/dist/pi-packages/scheduled-tasks/vite.browser.config.mjs +16 -0
- package/dist/pi-packages/scheduled-tasks/vite.companion.config.mjs +17 -0
- package/dist/pi-packages/scheduled-tasks/vite.config.mjs +17 -0
- package/dist/pi-packages/session-naming/config.js +78 -0
- package/dist/pi-packages/session-naming/extensions/index.js +74 -0
- package/dist/pi-packages/session-naming/generator.js +76 -0
- package/dist/pi-packages/session-naming/package.json +15 -0
- package/dist/pi-packages/workflows/browser/pi-web-plugin.js +10 -7
- package/dist/pi-packages/workflows/browser/workflows.messages.js +32 -0
- package/dist/pi-packages/workflows/browser/worktreeDialog.js +71 -50
- package/dist/pi-packages/workflows/server-plugin.js +137 -23
- package/dist/pi-web-plugins/audio/audioElement.js +61 -0
- package/dist/pi-web-plugins/audio/audioFormats.js +18 -0
- package/dist/pi-web-plugins/audio/byteRange.js +21 -0
- package/dist/pi-web-plugins/audio/package.json +10 -0
- package/dist/pi-web-plugins/audio/pi-web-plugin.js +39 -0
- package/dist/pi-web-plugins/audio/server.js +71 -0
- package/dist/pi-web-plugins/code-highlight/browser/pi-web-plugin.js +4 -4
- package/dist/pi-web-plugins/custom-ui-codex/codex.css +8 -0
- package/dist/pi-web-plugins/custom-ui-codex/fileIcons.js +30 -0
- package/dist/pi-web-plugins/custom-ui-codex/package.json +8 -1
- package/dist/pi-web-plugins/custom-ui-codex/pi-web-plugin.js +8 -8
- package/dist/pi-web-plugins/files/browser/pi-web-plugin.js +236 -259
- package/dist/pi-web-plugins/git/browser/git-panel.js +138 -59
- package/dist/pi-web-plugins/git/browser/git.messages.js +47 -0
- package/dist/pi-web-plugins/git/browser/gitFileIcon.js +71 -0
- package/dist/pi-web-plugins/git/browser/pi-web-plugin.js +21 -4
- package/dist/pi-web-plugins/git/server-plugin.js +5 -3
- package/dist/pi-web-plugins/info/info.messages.js +66 -0
- package/dist/pi-web-plugins/info/infoInternals.js +217 -217
- package/dist/pi-web-plugins/info/pi-web-plugin.js +19 -14
- package/dist/pi-web-plugins/language-spanish/catalogs.js +1896 -0
- package/dist/pi-web-plugins/language-spanish/package.json +14 -0
- package/dist/pi-web-plugins/language-spanish/pi-web-plugin.js +90 -0
- package/dist/pi-web-plugins/language-swedish/catalogs.js +1896 -0
- package/dist/pi-web-plugins/language-swedish/package.json +14 -0
- package/dist/pi-web-plugins/language-swedish/pi-web-plugin.js +89 -0
- package/dist/pi-web-plugins/mermaid/browser/pi-web-plugin.js +4 -4
- package/dist/pi-web-plugins/terminal/browser/pi-web-plugin.js +71 -66
- package/dist/pi-web-plugins/terminal/bunPtyProvider.js +109 -0
- package/dist/pi-web-plugins/terminal/nodePtyProvider.js +75 -0
- package/dist/pi-web-plugins/terminal/nodePtySpawnHelper.js +36 -0
- package/dist/pi-web-plugins/terminal/ptyComposition.js +12 -0
- package/dist/pi-web-plugins/terminal/ptyProvider.js +2 -0
- package/dist/pi-web-plugins/terminal/server-plugin.js +42 -14
- package/dist/pi-web-plugins/terminal/terminalService.js +218 -76
- package/dist/pi-web-plugins/themes/assets/graphite.css +56 -0
- package/dist/pi-web-plugins/themes/assets/paper.css +56 -0
- package/dist/pi-web-plugins/themes/package.json +21 -0
- package/dist/pi-web-plugins/updates/pi-web-plugin.js +200 -155
- package/dist/pi-web-plugins/updates/updates.messages.js +59 -0
- package/dist/pi-web-plugins/updates/updatesLogic.js +27 -29
- package/dist/pi-web-plugins/workspace-tasks/config.js +18 -19
- package/dist/pi-web-plugins/workspace-tasks/pi-web-plugin.js +13 -8
- package/dist/pi-web-plugins/workspace-tasks/tasks.messages.js +45 -0
- package/dist/pi-web-plugins/workspace-tasks/tasksLocalization.js +33 -0
- package/dist/pi-web-plugins/workspace-tasks/tasksPanelElement.js +56 -42
- package/dist/pi-web-plugins/workspace-tasks/workspaceTasksClient.js +7 -33
- package/dist/pi-web-plugins/zh-cn/catalogs.json +1803 -0
- package/dist/pi-web-plugins/zh-cn/main.json +5 -1
- package/dist/pi-web-plugins/zh-cn/management-errors.json +6 -0
- package/dist/pi-web-plugins/zh-cn/pi-web-plugin.js +13 -4
- package/dist/pi-web-plugins/zh-cn/server.json +1 -1
- package/dist/piWebVersionReport.js +2 -0
- package/dist/piWebVersionReport.js.map +1 -1
- package/dist/plugin-api.d.ts +194 -9
- package/dist/runtimePreflight.js +14 -0
- package/dist/runtimePreflight.js.map +1 -0
- package/dist/server/activity/workspaceActivityService.js +18 -1
- package/dist/server/activity/workspaceActivityService.js.map +1 -1
- package/dist/server/app.js +45 -10
- package/dist/server/app.js.map +1 -1
- package/dist/server/configRoutes.js +117 -139
- package/dist/server/configRoutes.js.map +1 -1
- package/dist/server/configUpdates.js +104 -0
- package/dist/server/configUpdates.js.map +1 -0
- package/dist/server/deploymentIdentity.js +12 -10
- package/dist/server/deploymentIdentity.js.map +1 -1
- package/dist/server/deploymentIdentityRoutes.js +2 -1
- package/dist/server/deploymentIdentityRoutes.js.map +1 -1
- package/dist/server/diagnostics/nodePtyNativeModule.js +0 -18
- package/dist/server/diagnostics/nodePtyNativeModule.js.map +1 -1
- package/dist/server/diagnostics/terminalPrerequisites.js +54 -0
- package/dist/server/diagnostics/terminalPrerequisites.js.map +1 -0
- package/dist/server/index.js +9 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/knownAutoInstallPiPackages.js +6 -0
- package/dist/server/knownAutoInstallPiPackages.js.map +1 -1
- package/dist/server/knownPiPackages.js +4 -4
- package/dist/server/knownPiPackages.js.map +1 -1
- package/dist/server/machines/machineClient.js +39 -17
- package/dist/server/machines/machineClient.js.map +1 -1
- package/dist/server/machines/machinePluginProxyRoutes.js +3 -1
- package/dist/server/machines/machinePluginProxyRoutes.js.map +1 -1
- package/dist/server/machines/machineProxyRoutes.js +60 -9
- package/dist/server/machines/machineProxyRoutes.js.map +1 -1
- package/dist/server/machines/machineService.js +81 -13
- package/dist/server/machines/machineService.js.map +1 -1
- package/dist/server/machines/machineStore.js.map +1 -1
- package/dist/server/managementEmbed.js +4 -1
- package/dist/server/managementEmbed.js.map +1 -1
- package/dist/server/managementEntryRoutes.js +51 -0
- package/dist/server/managementEntryRoutes.js.map +1 -0
- package/dist/server/managementEntryTickets.js +46 -0
- package/dist/server/managementEntryTickets.js.map +1 -0
- package/dist/server/managementTransportLimits.js +5 -0
- package/dist/server/managementTransportLimits.js.map +1 -0
- package/dist/server/navigationPreferenceRoutes.js +58 -2
- package/dist/server/navigationPreferenceRoutes.js.map +1 -1
- package/dist/server/normalAuth.js +3 -1
- package/dist/server/normalAuth.js.map +1 -1
- package/dist/server/notices/serverNoticeStore.js +4 -0
- package/dist/server/notices/serverNoticeStore.js.map +1 -1
- package/dist/server/piPackageService.js +15 -1
- package/dist/server/piPackageService.js.map +1 -1
- package/dist/server/piWebPluginCatalog.js +23 -11
- package/dist/server/piWebPluginCatalog.js.map +1 -1
- package/dist/server/piWebPluginLifecycle.js +14 -4
- package/dist/server/piWebPluginLifecycle.js.map +1 -1
- package/dist/server/piWebPluginService.js +11 -5
- package/dist/server/piWebPluginService.js.map +1 -1
- package/dist/server/piWebStatus.js +12 -10
- package/dist/server/piWebStatus.js.map +1 -1
- package/dist/server/piWebStatusCache.js +3 -1
- package/dist/server/piWebStatusCache.js.map +1 -1
- package/dist/server/plugins/pluginBackendRegistry.js +229 -4
- package/dist/server/plugins/pluginBackendRegistry.js.map +1 -1
- package/dist/server/plugins/pluginBackendResourceProxyRoutes.js +40 -0
- package/dist/server/plugins/pluginBackendResourceProxyRoutes.js.map +1 -0
- package/dist/server/plugins/pluginBackendResourceResponse.js +84 -0
- package/dist/server/plugins/pluginBackendResourceResponse.js.map +1 -0
- package/dist/server/plugins/projectPluginSettings.js +9 -2
- package/dist/server/plugins/projectPluginSettings.js.map +1 -1
- package/dist/server/plugins/serverPluginCatalogCapability.js +7 -2
- package/dist/server/plugins/serverPluginCatalogCapability.js.map +1 -1
- package/dist/server/plugins/serverPluginPiSessionsCapability.js +16 -3
- package/dist/server/plugins/serverPluginPiSessionsCapability.js.map +1 -1
- package/dist/server/plugins/serverPluginRuntime.js +25 -9
- package/dist/server/plugins/serverPluginRuntime.js.map +1 -1
- package/dist/server/plugins/serverPluginSessionLifecycleCapability.js +87 -0
- package/dist/server/plugins/serverPluginSessionLifecycleCapability.js.map +1 -0
- package/dist/server/requestLogging.js +1 -1
- package/dist/server/requestLogging.js.map +1 -1
- package/dist/server/sessiond/agentHttpDispatcher.js +14 -7
- package/dist/server/sessiond/agentHttpDispatcher.js.map +1 -1
- package/dist/server/sessiond/autoInstallPiPackageSources.js +54 -0
- package/dist/server/sessiond/autoInstallPiPackageSources.js.map +1 -0
- package/dist/server/sessiond/autoInstallPiPackages.js +77 -30
- package/dist/server/sessiond/autoInstallPiPackages.js.map +1 -1
- package/dist/server/sessiond/pluginBackendChannelRoutes.js +3 -13
- package/dist/server/sessiond/pluginBackendChannelRoutes.js.map +1 -1
- package/dist/server/sessiond/pluginBackendResourceRoutes.js +62 -0
- package/dist/server/sessiond/pluginBackendResourceRoutes.js.map +1 -0
- package/dist/server/sessiond/pluginSessionLifecycleRoutes.js +45 -0
- package/dist/server/sessiond/pluginSessionLifecycleRoutes.js.map +1 -0
- package/dist/server/sessiond/sessionProxyRoutes.js +76 -12
- package/dist/server/sessiond/sessionProxyRoutes.js.map +1 -1
- package/dist/server/sessiond/sessionServiceDependencies.js +3 -0
- package/dist/server/sessiond/sessionServiceDependencies.js.map +1 -1
- package/dist/server/sessiond.js +47 -16
- package/dist/server/sessiond.js.map +1 -1
- package/dist/server/sessions/askUserDomain.js +24 -2
- package/dist/server/sessions/askUserDomain.js.map +1 -1
- package/dist/server/sessions/askUserTool.js +1 -1
- package/dist/server/sessions/askUserTool.js.map +1 -1
- package/dist/server/sessions/dockerEnvironmentFacts.js +10 -9
- package/dist/server/sessions/dockerEnvironmentFacts.js.map +1 -1
- package/dist/server/sessions/mcpOAuthCredentialAdapter.js +4 -4
- package/dist/server/sessions/mcpOAuthCredentialAdapter.js.map +1 -1
- package/dist/server/sessions/piSessionService.js +491 -283
- package/dist/server/sessions/piSessionService.js.map +1 -1
- package/dist/server/sessions/requestHumanInterventionTool.js +27 -0
- package/dist/server/sessions/requestHumanInterventionTool.js.map +1 -0
- package/dist/server/sessions/sendSessionMessageTool.js +32 -0
- package/dist/server/sessions/sendSessionMessageTool.js.map +1 -0
- package/dist/server/sessions/sessionActivityCoordinator.js.map +1 -1
- package/dist/server/sessions/sessionCleanup.js +18 -1
- package/dist/server/sessions/sessionCleanup.js.map +1 -1
- package/dist/server/sessions/sessionCommandService.js +58 -52
- package/dist/server/sessions/sessionCommandService.js.map +1 -1
- package/dist/server/sessions/sessionContentSearch.js +103 -30
- package/dist/server/sessions/sessionContentSearch.js.map +1 -1
- package/dist/server/sessions/sessionIntervention.js +29 -0
- package/dist/server/sessions/sessionIntervention.js.map +1 -0
- package/dist/server/sessions/sessionNameGenerator.js +0 -60
- package/dist/server/sessions/sessionNameGenerator.js.map +1 -1
- package/dist/server/sessions/sessionNotificationStore.js +2 -1
- package/dist/server/sessions/sessionNotificationStore.js.map +1 -1
- package/dist/server/sessions/sessionRoutes.js +25 -28
- package/dist/server/sessions/sessionRoutes.js.map +1 -1
- package/dist/server/sessions/sessionSummaryScanner.js +8 -0
- package/dist/server/sessions/sessionSummaryScanner.js.map +1 -1
- package/dist/server/sessions/sessionTreeProjection.js +108 -97
- package/dist/server/sessions/sessionTreeProjection.js.map +1 -1
- package/dist/server/sessions/sessionUiEvents.js +2 -0
- package/dist/server/sessions/sessionUiEvents.js.map +1 -1
- package/dist/server/sessions/sessionUnreadStore.js +11 -1
- package/dist/server/sessions/sessionUnreadStore.js.map +1 -1
- package/dist/server/sessions/spawnSubsessionTool.js +66 -15
- package/dist/server/sessions/spawnSubsessionTool.js.map +1 -1
- package/dist/server/sessions/subsessionCompletionDelivery.js +6 -3
- package/dist/server/sessions/subsessionCompletionDelivery.js.map +1 -1
- package/dist/server/sessions/subsessionCompletionInbox.js +6 -9
- package/dist/server/sessions/subsessionCompletionInbox.js.map +1 -1
- package/dist/server/status/machineStatusService.js +15 -3
- package/dist/server/status/machineStatusService.js.map +1 -1
- package/dist/server/storage/navigationPreferenceStore.js +19 -2
- package/dist/server/storage/navigationPreferenceStore.js.map +1 -1
- package/dist/server/storage/sessionPinStore.js +101 -0
- package/dist/server/storage/sessionPinStore.js.map +1 -0
- package/dist/server/terminals/maintenanceExecutionContext.js +18 -0
- package/dist/server/terminals/maintenanceExecutionContext.js.map +1 -0
- package/dist/server/terminals/maintenanceTerminalCapability.js +25 -0
- package/dist/server/terminals/maintenanceTerminalCapability.js.map +1 -0
- package/dist/server/terminals/requiredTerminalService.js.map +1 -1
- package/dist/server/terminals/terminalStatusRoutes.js +22 -0
- package/dist/server/terminals/terminalStatusRoutes.js.map +1 -0
- package/dist/server/themeBootstrap.js +123 -0
- package/dist/server/themeBootstrap.js.map +1 -0
- package/dist/server/themeCatalog.js +206 -0
- package/dist/server/themeCatalog.js.map +1 -0
- package/dist/server/themeMetadata.js +74 -0
- package/dist/server/themeMetadata.js.map +1 -0
- package/dist/server/webSocketBridge.js +16 -12
- package/dist/server/webSocketBridge.js.map +1 -1
- package/dist/server/webSocketPayloadLimit.js +17 -0
- package/dist/server/webSocketPayloadLimit.js.map +1 -0
- package/dist/server/workspaces/effectivePathAccess.js +1 -1
- package/dist/server/workspaces/effectivePathAccess.js.map +1 -1
- package/dist/server/workspaces/projectPiWebConfig.js +30 -7
- package/dist/server/workspaces/projectPiWebConfig.js.map +1 -1
- package/dist/server/workspaces/sessionDaemonWorkspaceCatalog.js +2 -0
- package/dist/server/workspaces/sessionDaemonWorkspaceCatalog.js.map +1 -1
- package/dist/server/workspaces/workspaceProviderRegistry.js +6 -2
- package/dist/server/workspaces/workspaceProviderRegistry.js.map +1 -1
- package/dist/server/workspaces/workspaceRemovalService.js +6 -4
- package/dist/server/workspaces/workspaceRemovalService.js.map +1 -1
- package/dist/server-plugin-api.d.ts +39 -1
- package/dist/server-plugin-api.js +18 -3
- package/dist/server-plugin-api.js.map +1 -1
- package/dist/sessiond/sessionDaemonClient.js +7 -1
- package/dist/sessiond/sessionDaemonClient.js.map +1 -1
- package/dist/sessiond/sessionDaemonTerminalStatus.js +27 -0
- package/dist/sessiond/sessionDaemonTerminalStatus.js.map +1 -0
- package/dist/shared/apiTypes.js +5 -0
- package/dist/shared/apiTypes.js.map +1 -1
- package/dist/shared/capabilities.js +9 -0
- package/dist/shared/capabilities.js.map +1 -1
- package/dist/shared/commandOutputPresentation.js +17 -0
- package/dist/shared/commandOutputPresentation.js.map +1 -0
- package/dist/shared/commandResultPresentation.js +51 -0
- package/dist/shared/commandResultPresentation.js.map +1 -0
- package/dist/shared/configResolution.js +99 -0
- package/dist/shared/configResolution.js.map +1 -0
- package/dist/shared/defaultLocalization.js +60 -0
- package/dist/shared/defaultLocalization.js.map +1 -0
- package/dist/shared/federatedRoutes.js +11 -4
- package/dist/shared/federatedRoutes.js.map +1 -1
- package/dist/shared/installationName.js +21 -0
- package/dist/shared/installationName.js.map +1 -0
- package/dist/shared/localization.d.ts +55 -0
- package/dist/shared/localization.js +4 -0
- package/dist/shared/machineStatus.js +2 -0
- package/dist/shared/machineStatus.js.map +1 -1
- package/dist/shared/piWebConfigParsing.js +16 -30
- package/dist/shared/piWebConfigParsing.js.map +1 -1
- package/dist/shared/piWebRuntime.js +17 -0
- package/dist/shared/piWebRuntime.js.map +1 -0
- package/dist/shared/piWebStatusParsing.js +5 -0
- package/dist/shared/piWebStatusParsing.js.map +1 -1
- package/dist/shared/pluginApiTypes.d.ts +35 -7
- package/dist/shared/pluginBackendProtocol.js +24 -0
- package/dist/shared/pluginBackendProtocol.js.map +1 -1
- package/dist/shared/pluginCatalogTypes.d.ts +8 -0
- package/dist/shared/pluginCatalogTypes.js +15 -0
- package/dist/shared/pluginCatalogTypes.js.map +1 -1
- package/dist/shared/pluginResourceMetadata.js +58 -0
- package/dist/shared/pluginResourceMetadata.js.map +1 -0
- package/dist/shared/pluginSessionLifecycleTypes.d.ts +24 -0
- package/dist/shared/pluginSessionLifecycleTypes.js +56 -0
- package/dist/shared/pluginSessionLifecycleTypes.js.map +1 -0
- package/dist/shared/serverNoticePresentation.d.ts +9 -0
- package/dist/shared/serverNoticePresentation.js +12 -0
- package/dist/shared/serverNoticePresentation.js.map +1 -0
- package/dist/shared/sessionActivityPresentation.js +73 -0
- package/dist/shared/sessionActivityPresentation.js.map +1 -0
- package/dist/shared/sessionNotificationPresentation.js +16 -0
- package/dist/shared/sessionNotificationPresentation.js.map +1 -0
- package/dist/shared/terminalCommandRun.js +4 -0
- package/dist/shared/terminalCommandRun.js.map +1 -1
- package/dist/shared/terminalServiceStatus.js +14 -0
- package/dist/shared/terminalServiceStatus.js.map +1 -0
- package/dist/shared/terminalTitlePresentation.d.ts +10 -0
- package/dist/shared/terminalTitlePresentation.js +13 -0
- package/dist/shared/terminalTitlePresentation.js.map +1 -0
- package/dist/shared/themeCatalog.js +2 -0
- package/dist/shared/themeCatalog.js.map +1 -0
- package/dist/shared/themePreference.js +1 -0
- package/dist/shared/themePreference.js.map +1 -1
- package/dist/shared/thinkingLevels.d.ts +29 -0
- package/dist/shared/thinkingLevels.js +6 -4
- package/dist/shared/thinkingLevels.js.map +1 -1
- package/dist/shared/versionCheckPolicy.js +10 -0
- package/dist/shared/versionCheckPolicy.js.map +1 -0
- package/dist/shared/workspaceRemovalPresentation.d.ts +8 -0
- package/dist/shared/workspaceRemovalPresentation.js +10 -0
- package/dist/shared/workspaceRemovalPresentation.js.map +1 -0
- package/docs/README.md +7 -3
- package/docs/assets/pi-web-desktop-graphite.png +0 -0
- package/docs/assets/pi-web-desktop-paper.png +0 -0
- package/docs/assets/pi-web-desktop-pi-web-dark.png +0 -0
- package/docs/assets/pi-web-desktop-pi-web-light.png +0 -0
- package/docs/assets/pi-web-desktop.png +0 -0
- package/docs/assets/pi-web-mobile-graphite.png +0 -0
- package/docs/assets/pi-web-mobile-paper.png +0 -0
- package/docs/assets/pi-web-mobile-pi-web-dark.png +0 -0
- package/docs/assets/pi-web-mobile-pi-web-light.png +0 -0
- package/docs/assets/pi-web-mobile-themes.gif +0 -0
- package/docs/assets/pi-web-mobile.png +0 -0
- package/docs/assets/pi-web-tablet-graphite.png +0 -0
- package/docs/assets/pi-web-tablet-paper.png +0 -0
- package/docs/assets/pi-web-tablet-pi-web-dark.png +0 -0
- package/docs/assets/pi-web-tablet-pi-web-light.png +0 -0
- package/docs/assets/pi-web-tablet-themes.gif +0 -0
- package/docs/assets/pi-web-tablet.png +0 -0
- package/docs/assets/pi-web-themes.gif +0 -0
- package/docs/config.md +193 -55
- package/docs/plugins.md +350 -21
- package/docs/scheduled-tasks.md +127 -0
- package/package.json +43 -19
- package/dist/client/assets/CommandPicker-8oDe6AaV.js +0 -70
- package/dist/client/assets/PiWebApp-TCQVYghs.js +0 -3761
- package/dist/client/assets/SettingsDialog-DFUpwUyp.js +0 -1015
- package/dist/client/assets/index-DzMPXVth.js +0 -2
- package/dist/client/assets/managementEmbed-Bx8Mwzdw.js +0 -2
- package/dist/client/assets/preload-helper-XpATwJ5c.js +0 -1
- package/dist/pi-packages/captains-log/README.md +0 -11
- package/dist/pi-packages/captains-log/dist/browser/channelProtocol.js +0 -29
- package/dist/pi-packages/captains-log/dist/browser/index.js +0 -143
- package/dist/pi-packages/captains-log/dist/browser/markdown.js +0 -68
- package/dist/pi-packages/captains-log/dist/browser/panel.js +0 -148
- package/dist/pi-packages/captains-log/dist/browser/protocol.js +0 -26
- package/dist/pi-packages/captains-log/dist/companion.js +0 -126
- package/dist/pi-packages/captains-log/dist/roundtrip.js +0 -62
- package/dist/pi-packages/captains-log/dist/server.js +0 -210
- package/dist/pi-packages/captains-log/dist/store.js +0 -75
- package/dist/pi-packages/captains-log/docs/usage.md +0 -29
- package/dist/pi-packages/captains-log/i18n.js +0 -7
- package/dist/pi-packages/captains-log/package.json +0 -35
- package/dist/pi-packages/captains-log/tsconfig.json +0 -21
- package/dist/pi-packages/captains-log/vite.config.mjs +0 -28
- package/dist/server/sessions/sessionPinStore.js +0 -109
- package/dist/server/sessions/sessionPinStore.js.map +0 -1
- package/examples/session-bridge-plugin/README.md +0 -20
- package/examples/session-bridge-plugin/docs/usage.md +0 -54
- package/examples/session-bridge-plugin/package.json +0 -26
- package/examples/session-bridge-plugin/src/browser/index.ts +0 -87
- package/examples/session-bridge-plugin/src/browser/protocol.ts +0 -24
- package/examples/session-bridge-plugin/src/companion.ts +0 -65
- package/examples/session-bridge-plugin/src/reviewRun.ts +0 -39
- package/examples/session-bridge-plugin/src/server.ts +0 -85
- package/examples/session-bridge-plugin/src/store.ts +0 -80
- package/examples/session-bridge-plugin/tsconfig.json +0 -21
- /package/dist/{client/assets/classic-CyM97Akm.css → pi-web-plugins/themes/assets/classic.css} +0 -0
- /package/dist/{client/assets/pi-web-dark-D_KtbM95.css → pi-web-plugins/themes/assets/pi-web-dark.css} +0 -0
- /package/dist/{client/assets/pi-web-light-DSNLMIBI.css → pi-web-plugins/themes/assets/pi-web-light.css} +0 -0
package/docs/plugins.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
## 内置中文语言插件
|
|
8
8
|
|
|
9
|
-
`zh-cn` 随包提供且默认启用;在机器配置设置 `plugins["zh-cn"].enabled: false` 后恢复英文,无需额外语言文件。刷新网页、下次启动 CLI、重启服务后生效,详见[配置参考](config.md#chinese-language-plugin)
|
|
9
|
+
`zh-cn` 随包提供且默认启用;在机器配置设置 `plugins["zh-cn"].enabled: false` 后恢复英文,无需额外语言文件。刷新网页、下次启动 CLI、重启服务后生效,详见[配置参考](config.md#chinese-language-plugin)。浏览器默认中文来自网关,设备可在语言与区域设置选择其他界面语言;远端提示保持远端语言。
|
|
10
10
|
|
|
11
11
|
浏览器插件可通过激活上下文的可选 `translate(key, englishFallback, params)` 使用稳定消息键和命名参数;未提供翻译器或词条缺失时使用英文。语言插件以 `localizations` 贡献纯文本词典,不扫描 DOM 或注入 HTML。服务端激活上下文也可提供 `translate`,按所属机器配置格式化自有提示。旧插件 API 仍兼容;不要翻译用户输入、模型回复或代理转发的远端响应。Node 端只读取随包的 JSON 词典,不执行浏览器入口。
|
|
12
12
|
|
|
@@ -15,6 +15,8 @@
|
|
|
15
15
|
<a id="what-can-be-built"></a>
|
|
16
16
|
## 可实现的功能
|
|
17
17
|
|
|
18
|
+
浏览器 v5 还可用 [transcript renderers](#transcript-renderers) 定制内置工具条目及可见自定义消息的正文,不改变工具执行或历史。
|
|
19
|
+
|
|
18
20
|
| 目标 | 插件功能 |
|
|
19
21
|
| --- | --- |
|
|
20
22
|
| 展示项目健康状态、服务链接、环境信息 | 工作区标签与面板 |
|
|
@@ -59,6 +61,8 @@
|
|
|
59
61
|
<a id="scoped-discovery-and-backend"></a>
|
|
60
62
|
### 作用域发现与后端
|
|
61
63
|
|
|
64
|
+
v5 catalog 的会话投影包含布尔 `pinned`、运行状态 `not-hosted` / `idle` / `busy`,以及 `created`、`modified`、`archivedAt`(ISO 时间或 `null`)。未知时间不是旧时间;非归档会话 `archivedAt` 也是 `null`。按空闲年龄使用 `modified`,按归档时长使用 `archivedAt`;不要用归档文件的 mtime 替代。`pinned` 汇总保留作用域的保护,不只当前工作区。依赖这些字段需要更新宿主,没有独立能力回退。清理策略执行前重新读取资格和 pin;catalog 只读,实际变更使用[生命周期能力](#session-lifecycle)。
|
|
65
|
+
|
|
62
66
|
浏览器 API v5 的 `catalog` 固定到创建上下文时的机器,只读查询公开项目、工作区和会话投影,不返回 transcript 或内部会话路径。切换选择不会改变已保留 catalog 的目标;会话使用完整、区分大小写的精确 ID,不接受缩写。
|
|
63
67
|
|
|
64
68
|
可选 `backend` 指向同包配对的实际服务端入口:`backend.forScope({ kind: "machine" })`、`{ kind: "project", projectId }` 或 `{ kind: "workspace", projectId, workspaceId }` 返回请求/通道 peer。没有 session backend scope。宿主重新解析 authority,插件不传可信 cwd;机器与后端 revision 不匹配时拒绝,不静默使用网关同名后端。操作是否支持取决于实际 peer/capability,不由 API 版本单独保证。旧浏览器 v4 与服务端 v3 继续使用其原契约。
|
|
@@ -68,13 +72,13 @@
|
|
|
68
72
|
<a id="styles-highlighting-and-display"></a>
|
|
69
73
|
### 样式、高亮与显示文本
|
|
70
74
|
|
|
71
|
-
v5 `stylesheets` 贡献包含 `id`、HTTP(S) `url` 和可选 `order`(默认 `1000`,较小先加载,同序按限定贡献 ID)。使用模块相对 URL 生成 CSS 文件地址,文件内资产相对 CSS 地址解析;不支持内联 CSS 或运行时 `@import
|
|
75
|
+
v5 `stylesheets` 贡献包含 `id`、HTTP(S) `url` 和可选 `order`(默认 `1000`,较小先加载,同序按限定贡献 ID)。使用模块相对 URL 生成 CSS 文件地址,文件内资产相对 CSS 地址解析;不支持内联 CSS 或运行时 `@import`。新主题通过[静态包元数据](#css-first-themes)声明;运行时 themes/themePairs 已弃用但继续兼容并发出警告。v5 主题使用样式表;需要共享样式的组件使用公开 `StylesheetIntegrationCapabilityV1` 注册 shadow root 或创建 Lit lifecycle controller,并在断开时释放。主题属于网关应用,浏览器设备偏好优先于网关默认值。
|
|
72
76
|
|
|
73
77
|
共享基础 UI 通过 `{ pluginId: "pi-web", id: "stylesheet-integration", version: 1, parse }` 声明依赖并在 `start` 中解析;组件使用 `createController(this, { sharedUi: true })` 或 `registerRoot(root, { sharedUi: true })`。省略 opt-in 只接收贡献样式,不接收共享按钮、选择器、工具栏、标签和文件行。宿主持有注入、排序与清理;原生事件、键盘交互、焦点与 ARIA 仍由消费者持有。共享 UI 不包含菜单、表单和对话框,插件不得深导入客户端私有样式。
|
|
74
78
|
|
|
75
79
|
`stylesheet-integration` 能力可由支持的浏览器 v4/v5 入口声明,能力版本与入口版本独立;这不使旧入口获得 v5 专属的 `stylesheets` 贡献字段。
|
|
76
80
|
|
|
77
|
-
基础主题同步提供默认布局与控件表现,主题 CSS 可扩展配色与布局;基础规则在 `pi-web-base` cascade layer,普通未分层主题规则遵循 CSS cascade
|
|
81
|
+
基础主题同步提供默认布局与控件表现,主题 CSS 可扩展配色与布局;基础规则在 `pi-web-base` cascade layer,普通未分层主题规则遵循 CSS cascade 覆盖。[主题样式契约](theme-styling-contract.md)列明受支持的消息、选择、导航行、编辑器及菜单挂钩;其余内部选择器、共享类和外观仍属实验性,不因能力版本而冻结;具体控件入口见[共享 UI 导航](https://github.com/nayuto-wakusei/pi-web-ChineseTranslation/blob/main/docs/ui-primitives.md)。
|
|
78
82
|
|
|
79
83
|
宿主锚点弹层支持面板 CSS 变量 `--ui-popup-placement`,可取 `below-end`、`below-start`、`above-start` 或 `left-end`。宿主显式定位选项优先;未指定选项时读取该变量,空值或不支持的值使用默认 `below-end`。样式只选择首选对齐,宿主仍按可见视口约束尺寸并在必要时切换上下方向,继续管理焦点和弹层关闭。
|
|
80
84
|
|
|
@@ -93,12 +97,17 @@ Pi 的 Markdown transformer 链在 daemon 的浏览器投影阶段运行,仅
|
|
|
93
97
|
| `context-bar` | `content`、`actions` |
|
|
94
98
|
| `chat-chrome` | `transcript`、`composer` |
|
|
95
99
|
| `settings-navigation` | `navigation` |
|
|
100
|
+
| `files-toolbar` | 无;使用宿主提供的文件操作 |
|
|
101
|
+
|
|
102
|
+
`files-toolbar` 的 `context.actions` 提供 `new-file`、`new-folder`、`upload`、`download`、`rename`、`delete`、`refresh`;`download` 仅在选中文件时出现。动作的标签和禁用状态由文件宿主持有,插件负责展示;宿主拒绝禁用动作及已失效的面板、选择或展示生命周期中的旧回调。该区域不替换文件预览标题栏的下载入口,也不接管独立的管理 `AGENTS.md` 菜单。
|
|
103
|
+
|
|
104
|
+
`UiPresentationCapabilityV1` 的可选 `render(context)` 返回区域模板或 `undefined`,`subscribe(listener)` 返回取消订阅函数,`fail(region, error)` 将错误交给网关展示失败边界并返回是否处理。文件面板通过这些方法使用同一展示生命周期;旧宿主未提供方法或当前没有可用模板时,保留默认工具栏。
|
|
96
105
|
|
|
97
106
|
`navigation` 贡献可选声明 `navigationLayout: "tree"`,请求宿主将原有列表组合为选中分支树:在选中项目下展开工作区,在选中工作区下展开会话;普通文件夹省略重复的工作区层。其他区域不能声明该字段,不支持的布局值会拒绝激活。树模式采用静态分区标题,由节点展开控件管理分支,不沿用手机独立列表的单层互斥折叠;定向定位工作区或会话时先展开所选祖先。展开和选择由宿主控件处理,数据仍由原有 controller 按当前选择加载;插件不会因此获得未选中分支的会话数据。未声明时保留宿主的独立列表布局与折叠偏好。
|
|
98
107
|
|
|
99
108
|
渲染器使用 `context.slots` 中的名称输出 `<slot name="...">`,不查找、移动或重建宿主控件。宿主持有编辑器和消息视图的生命周期,界面切换不重建它们;导航列表可随树形与独立布局切换重新装配,操作仍复用宿主菜单、信任入口和权限检查。上下文仅含普通/管理模式、紧凑布局标记及机器、项目、工作区、会话的只读标识和显示名称;可选操作由宿主按权限提供,并在选择或生命周期变化后失效。调用操作时还会核对展示贡献当前是否活动,未重绘前失去活动资格也不能执行保留的回调;界面回退后,旧快照不会因贡献恢复活动而重新生效。它不提供凭据、消息正文、内部路径或普通宿主会话连接,管理视图也不因此获得额外权限。
|
|
100
109
|
|
|
101
|
-
|
|
110
|
+
禁用或缺少展示贡献时使用宿主默认界面,并恢复独立导航列表。展示渲染失败时,宿主停止使用该插件的运行时贡献(包括展示、样式与运行时主题),报告错误并回退;网关声明式静态主题目录不因此移除。插件仍是可信代码,此机制不是执行沙箱。布局 API 与样式表互补,精确类型以公开 `plugin-api` 声明为准。
|
|
102
111
|
|
|
103
112
|
### 应用级面板与选择
|
|
104
113
|
|
|
@@ -140,7 +149,53 @@ await context.navigate({
|
|
|
140
149
|
|
|
141
150
|
所有字段都可省略:`machineId`、`projectId`、`workspaceId`、`sessionId`、`view` 及完整贡献 ID 的 `tool`。省略机器意味着调用时选中的机器。这不是路由补丁:省略字段使用宿主普通恢复默认值,不复制当前会话、工具或贡献查询;默认值可以恢复记忆中的会话。打开已知会话时提供项目和工作区作用域。宿主不会遍历查找 ID,也不会创建不存在的目的地。
|
|
142
151
|
|
|
143
|
-
Promise 在恢复完成时结束,也可在被较新导航取代时正常结束。缺失或不可用的目的地使用普通宿主 UI,不再额外拒绝 Promise。参数类型错误或无效 `view` 会在改变 URL/UI 前以 `TypeError` 拒绝。
|
|
152
|
+
Promise 在恢复完成时结束,也可在被较新导航取代时正常结束。缺失或不可用的目的地使用普通宿主 UI,不再额外拒绝 Promise。参数类型错误或无效 `view` 会在改变 URL/UI 前以 `TypeError` 拒绝。
|
|
153
|
+
|
|
154
|
+
### Transcript renderers
|
|
155
|
+
|
|
156
|
+
Browser v5 plugins can contribute `transcriptRenderers` to customize tool entries, including built-in tools, and displayed custom messages. The host retains the transcript frame and its controls; the plugin supplies the entry body. Rendering changes presentation, not tool execution or session history. Hidden custom messages remain hidden; this API does not expose `appendEntry`.
|
|
157
|
+
|
|
158
|
+
Each contribution has a unique local `id`. Declare the host capability `pi-web/transcript-rendering@1` (`pluginId: "pi-web"`, `id: "transcript-rendering"`, `version: 1`) in `requires` when the plugin needs this feature on older hosts. The capability is a feature marker; rendering uses contributions, not capability methods.
|
|
159
|
+
|
|
160
|
+
**Tools** contribute `{ id, target: "tool", resolve(toolName, next) }`. There is no declarative `toolName` field: the resolver chooses which names to handle. Resolvers run synchronously in plugin discovery order, so the first resolver gets first refusal. Asynchronous import completion does not change that order. A resolver returns a `TranscriptToolRenderer`—an object with `render(input): TemplateResult | undefined`—or `undefined`.
|
|
161
|
+
|
|
162
|
+
- **Delegate:** return `next()` for a name you do not handle.
|
|
163
|
+
- **Replace:** return your own renderer without calling `next()`.
|
|
164
|
+
- **Wrap:** call `next()` to obtain the downstream renderer, then return a renderer that calls `downstream.render(input)` and decorates its result.
|
|
165
|
+
|
|
166
|
+
`next()` returns renderer callbacks, not HTML. Treat the returned renderer as read-only; return a new renderer object to replace or wrap it. The web transcript supplies its core default renderer at the end of the chain, so wrappers can decorate the normal tool card as well as another plugin's renderer. Delegating unchanged all the way to that default keeps the normal view without a custom-view toggle. The resolver type still permits `undefined` for contexts without a supplied default. Returning `undefined` from a resolver ends selection; the host does not automatically try later resolvers and instead shows the core fallback. Returning `undefined` from a selected renderer's `render` also shows that fallback without restarting selection.
|
|
167
|
+
|
|
168
|
+
**Custom messages** contribute `{ id, target: "custom-message", customType, render }`. The first eligible contribution in discovery order with an exact, case-sensitive `customType` wins, like TUI custom-message rendering. Messages have no `next` callback. Declining or failing does not try a later matching message renderer.
|
|
169
|
+
|
|
170
|
+
The [standalone example](https://github.com/jmfederico/pi-web/tree/main/examples/transcript-renderer-plugin) demonstrates actual tool chaining: a wrapper resolver precedes the checks renderer in the same contribution array. Its core pattern is:
|
|
171
|
+
|
|
172
|
+
```ts
|
|
173
|
+
{
|
|
174
|
+
id: "checks-wrapper",
|
|
175
|
+
target: "tool",
|
|
176
|
+
resolve(toolName, next) {
|
|
177
|
+
if (toolName !== "example_checks") return next();
|
|
178
|
+
const downstream = next();
|
|
179
|
+
if (!downstream) return undefined;
|
|
180
|
+
return {
|
|
181
|
+
render(input) {
|
|
182
|
+
const body = downstream.render(input);
|
|
183
|
+
return body === undefined ? undefined : html`
|
|
184
|
+
<div><p>Rendered by the example plugin</p>${body}</div>
|
|
185
|
+
`;
|
|
186
|
+
},
|
|
187
|
+
};
|
|
188
|
+
},
|
|
189
|
+
}
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
`scope` contains `machineId` and `sessionId`, with optional `projectId` and `workspaceId`. A tool `entry` contains `toolName`, `status` (`pending`, `running`, `success`, or `error`), and optional `toolCallId`, `args`, `content`, `details`, and `resultText`. A custom-message `entry` contains `customType`, `content`, and optional `entryId` and `details`. Treat opaque `args`, `content`, and `details` as untrusted data: validate your own schema before using them.
|
|
193
|
+
|
|
194
|
+
Both tool and message `render` callbacks receive `{ scope, entry, signal, fail }`. Rendering is synchronous and returns a Lit `TemplateResult` or `undefined`; returning a Promise is unsupported. Unlike resolver delegation through `next()`, returning `undefined` from `render` declines the current body and retains the existing view without restarting selection. An empty template deliberately renders an empty body. A thrown error or `fail(error)` restores the existing view. The host's default-view control also lets the user bypass the custom body.
|
|
195
|
+
|
|
196
|
+
Rendering may repeat as inputs change. Keep it repeatable and do not execute tools or session operations as a side effect of rendering. Honor `signal` for asynchronous work and release resources: it aborts when inputs change, the entry unmounts, the plugin is disabled, or the user selects the default view. Report asynchronous failures through `fail`; obsolete calls are ignored.
|
|
197
|
+
|
|
198
|
+
Use the existing [stylesheet integration](#styles-highlighting-and-display) for plugin-owned shadow roots and [theme tokens and cascade layers](theme-architecture.md) for appearance. The host's frame remains core-owned; renderer bodies do not replace it or introduce a separate styling contract.
|
|
144
199
|
|
|
145
200
|
### 聊天与文件内容预览
|
|
146
201
|
|
|
@@ -166,6 +221,8 @@ Raw 始终提供未高亮源码,Copy 复制当前代码块源码,即使正
|
|
|
166
221
|
|
|
167
222
|
### 会话与配套扩展
|
|
168
223
|
|
|
224
|
+
宿主 Pi sessions 能力的 `run()` 接受可选 `model`(精确 `provider/model-id`)和 `thinkingLevel`;省略使用普通会话默认值,返回 handle 可包含有效启动设置。宿主不静默替换不可用覆盖;错误码 `PI_SESSION_MODEL_UNAVAILABLE` 或 `PI_SESSION_THINKING_UNAVAILABLE` 保证未提交初始提示,调用者可显式移除被拒覆盖再重试。其他启动/完成错误不提供该保证;[定时任务](scheduled-tasks.md#model-and-thinking-overrides)记录自己的设置回退。
|
|
225
|
+
|
|
169
226
|
服务端插件可创建普通、可见的 Pi 会话,可带初始提示词,也可不带。配套 Pi 扩展可与后端交换消息,使用 Pi API 执行代理工作。
|
|
170
227
|
|
|
171
228
|
**会话一旦发布就属于用户。** 初始任务完成、浏览器关闭或发起插件销毁,都不会丢弃会话或停止用户后续工作;用户可以继续对话。
|
|
@@ -212,6 +269,9 @@ systemctl --user restart pi-web-sessiond
|
|
|
212
269
|
|
|
213
270
|
### 本地开发
|
|
214
271
|
|
|
272
|
+
`npm run dev:web` 默认启用 `PI_WEB_DEV_PLUGIN_PAIRING=1`,允许开发浏览器 UI 连接尚未重启的后端;设为 `0` 恢复严格配对。生产与其他启动路径默认严格。此开关不热替换后端,服务端变化仍需手动重启 daemon。
|
|
273
|
+
|
|
274
|
+
|
|
215
275
|
代理可在任意目录开发包,再链接到本地插件目录:
|
|
216
276
|
|
|
217
277
|
```sh
|
|
@@ -238,7 +298,9 @@ ln -s /path/to/plugin-folder ~/.pi-web/plugins/my-plugin
|
|
|
238
298
|
- **Mermaid**默认手动模式,点击“渲染”预览 `mermaid` 围栏和 `.mmd`/`.mermaid` 文件。内置引擎在不透明来源、网络受阻的沙箱中本地运行,不发送源码给图表服务。交互链接和外部资源不可用。禁用后保持代码显示;纯浏览器插件只需刷新页面。
|
|
239
299
|
- **信息**作为应用级面板显示 PI WEB 状态与可复制诊断,无需先选择工作区。
|
|
240
300
|
- **更新**在需要时显示更新/重启建议,并提供手动检查。
|
|
241
|
-
-
|
|
301
|
+
- **工作区任务**将项目命令显示为可运行操作,与定时派发对话不同。
|
|
302
|
+
- **Session naming** 可移除 Pi 扩展,负责新会话首条提示命名;配置与迁移见[会话命名](config.md#session-naming)。
|
|
303
|
+
- **Scheduled agent tasks(beta)** 可选包,提供代理管理的计划与只读“计划任务”面板;Web 插件默认禁用。安装、时区及执行历史见[指南](scheduled-tasks.md)。
|
|
242
304
|
|
|
243
305
|
<a id="managed-agents-review"></a>
|
|
244
306
|
### 管理工作区指令
|
|
@@ -284,19 +346,6 @@ Workflows 随包提供 Pi 工作流提示词和工作树操作。普通 profile
|
|
|
284
346
|
|
|
285
347
|
工作树操作选择 base 与用途后,由目标机器重验项目、工作区和 Git base 再派发;仅在普通模式及所需能力可用时提供。创建工作树、发布会话与打开页面是独立结果,派发结果不确定或导航失败时不自动重试,先查看目标机器已有结果,避免重复工作树。实现示例见 [Workflows 包](https://github.com/nayuto-wakusei/pi-web-ChineseTranslation/tree/main/pi-packages/workflows)。
|
|
286
348
|
|
|
287
|
-
### 试用 Captain's Log
|
|
288
|
-
|
|
289
|
-
Captain's Log 是可选示例,将会话最近的助手回复改写为海盗风格简报,演示浏览器面板、后端和 Pi 配套扩展协作。
|
|
290
|
-
|
|
291
|
-
1. 在目标机器的 **设置 → Pi 包 → 可用包** 安装 **船长日志**。
|
|
292
|
-
2. 在 **设置 → PI WEB 插件** 启用它。
|
|
293
|
-
3. 安全时重启目标机器会话守护进程,再刷新浏览器。
|
|
294
|
-
4. 选择会话,打开“船长日志”,点击“让船长来讲述”。
|
|
295
|
-
|
|
296
|
-
它随主包预构建发布,**默认不安装、不启用**,无需现场编译。读取源回复但不修改源会话,另建海盗会话;需要模型凭据,源文本会发给海盗会话的模型提供器,可能产生模型费用。已有结果会保存。守护进程重启后,可从“会话”打开已有海盗会话继续上下文。
|
|
297
|
-
|
|
298
|
-
详见[船长日志使用指南](https://github.com/nayuto-wakusei/pi-web-ChineseTranslation/blob/main/pi-packages/captains-log/docs/usage.md)。
|
|
299
|
-
|
|
300
349
|
<a id="pi-extension-dialogs"></a>
|
|
301
350
|
## Pi 扩展对话框
|
|
302
351
|
|
|
@@ -306,7 +355,252 @@ Pi 扩展可请求确认、选择或文本输入;问题以内联方式展示
|
|
|
306
355
|
|
|
307
356
|
仅支持这三种对话框,不支持自定义编辑器或组件等其他 Pi UI;不要因为 `hasUI` 为真就假定所有 UI 可用。
|
|
308
357
|
|
|
358
|
+
## V5 display and transport
|
|
359
|
+
|
|
360
|
+
### Contribute file previewers
|
|
361
|
+
|
|
362
|
+
Browser v5 plugins can contribute `filePreviewers` to the existing Files panel. Use these for file-specific views, including binary formats; use `contentRenderers` for text presentations shared with chat code blocks. A previewer does not need its own file browser or companion backend.
|
|
363
|
+
|
|
364
|
+
Each previewer declares an `id`, a human-readable `title`, and `fileExtensions` (without leading dots), `mimeTypes` (exact types or `audio/*`-style wildcards), or a synchronous `supports(request)` callback. Extension and MIME selectors are alternatives; `supports`, when supplied, further restricts them. With only `supports`, it decides eligibility. Matching is case-insensitive. Unknown formats may have no MIME metadata, so extension matching is useful.
|
|
365
|
+
|
|
366
|
+
```ts
|
|
367
|
+
export default {
|
|
368
|
+
apiVersion: 5,
|
|
369
|
+
name: "Custom file views",
|
|
370
|
+
activate({ html }) {
|
|
371
|
+
return {
|
|
372
|
+
contributions: {
|
|
373
|
+
filePreviewers: [{
|
|
374
|
+
id: "model",
|
|
375
|
+
title: "3D model",
|
|
376
|
+
fileExtensions: ["mesh"],
|
|
377
|
+
supports: ({ file }) => file.size <= 20 * 1024 * 1024,
|
|
378
|
+
// Manual by default: no rendering or file fetch until selected.
|
|
379
|
+
render({ file, files, signal, fail }) {
|
|
380
|
+
return html`<my-model-viewer .path=${file.path}
|
|
381
|
+
.files=${files} .signal=${signal} .fail=${fail}></my-model-viewer>`;
|
|
382
|
+
},
|
|
383
|
+
}],
|
|
384
|
+
},
|
|
385
|
+
};
|
|
386
|
+
},
|
|
387
|
+
};
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
The plugin owns `my-model-viewer` in this example. Its component can fetch existing workspace bytes using the supplied file helpers:
|
|
391
|
+
|
|
392
|
+
```ts
|
|
393
|
+
if (files.capabilityVersion !== 1) throw new Error("Workspace download URLs are unavailable");
|
|
394
|
+
const response = await fetch(files.downloadUrl(path), { signal });
|
|
395
|
+
if (!response.ok) throw new Error(`File load failed: HTTP ${response.status}`);
|
|
396
|
+
const bytes = await response.arrayBuffer();
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
This uses the same authenticated file-serving path as downloads, including remote machines. `Content-Disposition: attachment` does not trigger a download when using `fetch()`. For browser media, construct a `Blob` with the appropriate MIME type and revoke its object URL during cleanup. Fetching into a blob loads the whole file; apply a suitable size limit. A companion backend is optional for processing, generated resources, or plugin-managed range streaming; see [binary resources](#binary-resources-and-media-delivery).
|
|
400
|
+
|
|
401
|
+
Files shows all eligible previewers as named view buttons and keeps **Download** available. Images, SVG, PDF, HTML, and Markdown are contributions from the bundled Files plugin, using the same discovery, selection, and lifecycle API as Audio and third-party previews. Existing text `contentRenderers` are adapted into this file-preview pipeline; their chat behavior and public contribution API remain unchanged. Files itself owns only selection, Raw source, and download fallback. `renderMode: "automatic"` opts into automatic rendering; otherwise selection is explicit. Later matching automatic previewers take precedence over earlier defaults, but an explicit view choice takes priority. Raster images and PDF opt into automatic rendering. SVG, HTML, and Markdown keep Raw as their fresh-browser default; a saved or linked Preview preference activates their registered previewer. Built-in document previewers retain the core size limits, safe file URLs, HTML sandboxing, and native PDF policy. Previewers can handle large files without inheriting the core inline-preview size cap; they must enforce their own limits.
|
|
402
|
+
|
|
403
|
+
`render` receives a frozen file snapshot, `machineId`, `projectId`, `workspaceId`, workspace `files`, and—when this package has one—its own paired `backend`. It never receives another plugin's backend. The host aborts `signal` when the file, selected view, mounting, or plugin lifetime changes. Stop requests and release media, object URLs, observers, and workers when aborted or disconnected. Report asynchronous failures through `fail(error)`; synchronous failures are caught by the host. Files displays the failure and retains a source/download fallback; failures from obsolete previews cannot replace a newer selection.
|
|
404
|
+
|
|
405
|
+
For another file-view consumer, require the host capability `{ pluginId: "pi-web", id: "file-previewing", version: 1 }`. Its `listPreviewers(request)` discovers matching views and `renderPreview({ ...request, previewerId, files, fail })` mounts one selected view with the same lifecycle handling. Supply the actual machine and authoritative project/workspace IDs. Require this capability when your plugin must fail explicitly on older hosts rather than run without file-preview support.
|
|
406
|
+
|
|
407
|
+
The bundled [Audio plugin](https://github.com/nayuto-wakusei/pi-web-ChineseTranslation/tree/main/pi-web-plugins/audio) is a complete consumer example. No DOCX conversion is included.
|
|
408
|
+
|
|
409
|
+
### Highlight additional languages
|
|
410
|
+
|
|
411
|
+
The bundled **Code highlighting** plugin supplies one **Highlighted** renderer, offered only for languages it supports. Browser v5 plugins can extend it with `syntaxHighlighters` for any language, including languages that PI WEB does not recognize on the server. Match chat fences with `languages` (including aliases) and files with `fileExtensions` (without a leading dot). Adding a grammar expands this renderer's coverage; it does not add a separate renderer choice. Highlighting is available in completed chat fences, Markdown files, and standalone Files previews. **Raw** stays unhighlighted.
|
|
412
|
+
|
|
413
|
+
Use any tokenizer or grammar bundled with your plugin. The `highlight({ text, signal })` callback returns tokens synchronously or asynchronously: `{ from, to, kind }`, with UTF-16 offsets into the unchanged source. Ranges must be ordered, non-overlapping, non-empty, and within the source. Unmarked text remains plain. Kinds are `keyword`, `string`, `number`, `comment`, `type`, `function`, `variable`, `operator`, `punctuation`, `property`, `literal`, or `meta`; PI WEB supplies theme-aware colours. Return tokens, not HTML or CodeMirror extensions, so independently bundled parsers do not need to share an editor-library instance with the host.
|
|
414
|
+
|
|
415
|
+
Plugins should stop asynchronous work when `signal` is aborted. Oversized input is not sent to highlighters. A failed highlighter leaves source readable and reports the failure. If several grammar contributions match, the last discovered one wins. Highlighting adds no editing, completion, language-server support, or plugin-defined styling.
|
|
416
|
+
|
|
417
|
+
A plugin can instead provide an independent highlighting system as a `contentRenderers` contribution. Both highlighting renderers remain separate choices when they support the source; the same last-automatic-renderer rule chooses the default. A v5 renderer's `supports(request)` callback can determine eligibility dynamically, and `title` names its view button—for example, **Highlighted** or **Diagram**. Without a title, the host uses the plugin and contribution IDs. V5 rendering receives the source language, file path, and machine as well as the text; v4 renderer inputs retain their original text, signal, and failure callback. The bundled highlighting plugin demonstrates this pattern.
|
|
418
|
+
|
|
419
|
+
The bundled Mermaid plugin contributes both a **Diagram** renderer and a source grammar for `mermaid` fences and `.mmd`/`.mermaid` files. Its grammar adds **Highlighted** to those sources without loading the diagram engine. Diagram rendering stays manual; **Raw**, **Highlighted**, and **Diagram** retain the same source text. The lightweight grammar colours common Mermaid syntax; it does not validate diagrams.
|
|
420
|
+
|
|
421
|
+
Older hosts ignore syntax-highlighter contributions; require the host capability `{ pluginId: "pi-web", id: "syntax-highlighting", version: 1 }` when your plugin depends on this feature. This capability exposes `supports()` and `highlight()` for renderers that consume semantic token contributions. See `SyntaxHighlighterContribution`, `SyntaxHighlightingCapability`, and `ContentRendererContributionV5` in the [public browser contract](https://github.com/nayuto-wakusei/pi-web-ChineseTranslation/blob/main/src/plugin-api.ts).
|
|
422
|
+
|
|
423
|
+
### Binary resources and media delivery
|
|
424
|
+
|
|
425
|
+
Use a **resource** to deliver bytes from a plugin's server entry to its browser entry. Resources are general-purpose: generated reports, audio, converted documents, and other binary results use the same transport. Resources provide transport, not viewer registration: pair them with [file previewers](#contribute-file-previewers) when the result belongs in Files. They do not change the core file-preview allowlist.
|
|
426
|
+
|
|
427
|
+
A server v5 peer can implement `resource` alongside `request` and `openChannel`, or by itself. The callback receives the operation, JSON input, cancellation signal, and host-resolved machine/project/workspace scope. It returns `ServerPluginResourceResponse`: a `Uint8Array` or asynchronous iterable of byte chunks, a `contentType`, and optional `contentLength`. Node readable streams can be used as asynchronous iterables.
|
|
428
|
+
|
|
429
|
+
```ts
|
|
430
|
+
// Server entry: no separate HTTP listener or public port.
|
|
431
|
+
export default {
|
|
432
|
+
apiVersion: 5,
|
|
433
|
+
name: "Generated reports",
|
|
434
|
+
activate() {
|
|
435
|
+
return {
|
|
436
|
+
peer: {
|
|
437
|
+
resource({ operation, scope, signal }) {
|
|
438
|
+
signal.throwIfAborted();
|
|
439
|
+
if (operation !== "summary" || scope.kind !== "workspace") {
|
|
440
|
+
throw new Error("A workspace summary was requested outside its scope");
|
|
441
|
+
}
|
|
442
|
+
const body = new TextEncoder().encode(`Workspace: ${scope.workspace.label}\n`);
|
|
443
|
+
return { body, contentType: "text/plain; charset=utf-8", contentLength: body.byteLength };
|
|
444
|
+
},
|
|
445
|
+
},
|
|
446
|
+
};
|
|
447
|
+
},
|
|
448
|
+
};
|
|
449
|
+
```
|
|
450
|
+
|
|
451
|
+
In a browser v5 panel or action, capture the desired scope and feature-detect `resourceUrl`:
|
|
452
|
+
|
|
453
|
+
```ts
|
|
454
|
+
const peer = context.backend?.forScope({
|
|
455
|
+
kind: "workspace",
|
|
456
|
+
projectId: context.workspace.projectId,
|
|
457
|
+
workspaceId: context.workspace.id,
|
|
458
|
+
});
|
|
459
|
+
if (peer?.resourceUrl === undefined) throw new Error("Update PI WEB and restart its session daemon to use resources");
|
|
460
|
+
const url = peer.resourceUrl("summary", null);
|
|
461
|
+
const response = await fetch(url, { signal });
|
|
462
|
+
if (!response.ok) throw new Error(`Summary failed: HTTP ${response.status}`);
|
|
463
|
+
const summary = await response.text();
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
`resourceUrl()` returns an absolute, browser-ready URL. Use it directly with browser APIs or media elements; do not resolve it again or construct private routes. The URL captures the package revision, machine, and scope. Every load uses normal PI WEB authentication and re-resolves authority on the owning machine, including remote machines. A URL is not a public share link or a bearer credential. Resource URLs from older revisions fail rather than silently invoking new plugin code.
|
|
467
|
+
|
|
468
|
+
Resource selectors are JSON of at most **4 KiB UTF-8** and appear in the URL. Keep them short and non-secret; URLs can appear in history and logs. Use a normal backend request for large or private inputs, then select a plugin-owned result by a short opaque identifier. Resource callbacks serve GET requests and should not start mutating jobs; browsers may repeat loads or request ranges.
|
|
469
|
+
|
|
470
|
+
For seeking or partial downloads, the callback receives the optional HTTP `range` string. A plugin may ignore it and return a full `200` response, or implement range handling with `statusCode: 206`, `contentRange`, `contentLength`, and `acceptRanges: "bytes"`. Unsatisfiable ranges use `statusCode: 416` and `contentRange: "bytes */TOTAL"`. PI WEB forwards these fields; it does not seek or slice plugin-owned data. Plugins must validate range requests against their actual resource.
|
|
471
|
+
|
|
472
|
+
The host streams bytes with backpressure rather than wrapping them in JSON/base64. It validates response metadata and any declared length, cancels work on disconnect or daemon shutdown, and limits resource lifetimes and concurrency. Plugins must honor `signal`, release their own resources, and apply format-specific size and conversion limits. File reads and conversions belong to the plugin: resolve file inputs against the host-provided scope and validate browser-supplied selectors.
|
|
473
|
+
|
|
474
|
+
Responses are private, uncached, and protected by host-owned MIME and sandbox policies; plugins cannot supply arbitrary HTTP headers, cookies, or redirects. HTML and SVG documents remain sandboxed. Native PDF responses omit the sandbox restriction but retain restrictive CSP and `nosniff`. Inserting fetched HTML into a panel bypasses document isolation: sanitize it before rendering, and never execute untrusted document content.
|
|
475
|
+
|
|
476
|
+
After upgrading PI WEB for this API, restart the affected session daemon when safe, then reload the browser. Gateways and remote machines must both support resources. This transport does not add resource methods to companion Pi extensions; those continue to use requests and channels.
|
|
477
|
+
|
|
478
|
+
### File icon themes
|
|
479
|
+
|
|
480
|
+
Files and Git display extension-specific shapes from one selected icon theme in a single muted tone. The active colour theme supplies the grey for both light and dark appearances. Git shows change status through filename colours and status labels in both list and tree views. Material icons are bundled locally by default, using the pinned npm package at build time rather than a tracked SVG collection. Choose an icon theme or generic file icons in **Settings → General → File icons**. This choice belongs to the current browser, not the gateway configuration.
|
|
481
|
+
|
|
482
|
+
Browser API v5 plugins can contribute complete sets through `fileIconThemes`:
|
|
483
|
+
|
|
484
|
+
```ts
|
|
485
|
+
fileIconThemes: [{
|
|
486
|
+
id: "my-icons",
|
|
487
|
+
name: "My icons",
|
|
488
|
+
file: { url: new URL("./file.svg", import.meta.url).href },
|
|
489
|
+
files: [{
|
|
490
|
+
filenames: ["Dockerfile"],
|
|
491
|
+
icon: { url: new URL("./docker.svg", import.meta.url).href },
|
|
492
|
+
}, {
|
|
493
|
+
extensions: [".ts", ".tsx"],
|
|
494
|
+
icon: {
|
|
495
|
+
url: new URL("./typescript.svg", import.meta.url).href,
|
|
496
|
+
},
|
|
497
|
+
}],
|
|
498
|
+
}]
|
|
499
|
+
```
|
|
500
|
+
|
|
501
|
+
`file` is the fallback asset. Matching uses only the basename, without reading file contents: exact filenames win over extensions, longer extensions win over shorter ones (such as `.d.ts` before `.ts`), and declaration order breaks ties. Matching is case-insensitive. Directory disclosure arrows are unchanged. Asset URLs must be absolute HTTP(S) URLs. Use SVGs with transparent backgrounds and recognisable alpha silhouettes; other transparent browser image formats work too. Opaque fills become solid shapes, regardless of their original colours. Bundle assets under the plugin's browser-public root and use module-relative URLs; with Vite, prevent small assets becoming data URLs. Icons render as decorative CSS alpha masks, never injected SVG markup, and failed image loads fall back to the generic file icon. Remote assets require CORS and depend on network access and the deployment's content security policy; bundled assets avoid third-party requests.
|
|
502
|
+
|
|
503
|
+
Like colour themes, icon themes are app-wide and only gateway contributions are used. A missing selected theme temporarily falls back to Material without erasing the browser choice. Plugins consuming the selected icons can require `{ pluginId: "pi-web", id: "file-icons", version: 1 }` and use its `FileIconsCapability`: `resolveIcon(path)` returns the current mask asset URL or `undefined` for generic icons, and `subscribe(listener)` reports selection, colour-scheme, and contribution changes. Unsubscribe on disconnect and subscribe again on reconnect or capability replacement.
|
|
504
|
+
|
|
505
|
+
|
|
506
|
+
### Maintenance terminals
|
|
507
|
+
|
|
508
|
+
The Terminal plugin provides machine-scoped `maintenanceTerminal` in contexts where that optional helper is available. Maintenance commands start in `$PI_WEB_DATA_DIR/maintenance`, independently of workspace selection, and do not acquire project/workspace identity. Feature-detect the helper on older hosts. Ordinary workspace commands keep their workspace scope; management-mode authorization remains separate.
|
|
509
|
+
|
|
510
|
+
### Language packs and compatibility
|
|
511
|
+
|
|
512
|
+
Feature-detect the optional activation-context `localization` service. Register ICU messages with `localization.registerMessages`, use stable IDs and English fallback messages, and dispose registrations with the plugin lifecycle. Language packs contribute catalogs instead of scanning DOM or injecting HTML. UI language, formatting locale, time zone, and hour cycle are independent; see [Localization](localization.md). The bundled `zh-cn` plugin supplies Chinese ICU catalogs and the legacy `translate` dictionaries. The legacy browser bridge follows the selected UI language, while CLI/server text follows the owning machine's language configuration. Do not translate user/model text, protocol identifiers, or remote-owned payloads.
|
|
513
|
+
|
|
514
|
+
### Managed package sources
|
|
515
|
+
|
|
516
|
+
Relays、Workflows 和 Session naming 随 PI WEB 分发及更新,daemon 启动时将已配置来源对齐到当前安装并保留资源过滤器。在“设置 → Pi 包”移除会持久记录;仅执行 `pi remove` 可能在下次 daemon 启动重新安装。
|
|
517
|
+
|
|
518
|
+
Bundled Relays, Workflows, and Session naming registrations follow the running installation's shipped package paths. Source migration preserves package resource filters and remembered explicit removals. Missing historical global-install sources from either `@jmfederico/pi-web` or `@chainingintention/pi-web-cn` can be repaired to the current installation; unrelated user package sources are not rewritten.
|
|
519
|
+
|
|
520
|
+
Management resource requests retain management context and authorized workspace scope; a resource URL never grants access beyond that context or falls back to the gateway's ordinary workspace.
|
|
521
|
+
|
|
522
|
+
|
|
309
523
|
<a id="agent-development"></a>
|
|
524
|
+
### CSS-first themes
|
|
525
|
+
|
|
526
|
+
Themes extend the built-in base theme: they can supply layout and control rules as well as palette properties. The base provides the default shell, responsive layout, shared controls, and transcript presentation in the `pi-web-base` cascade layer. Normal unlayered theme rules override those defaults. A supported contract covers conversation, choice, project/workspace/session navigation-row, composer-control, and popup/menu hooks; specialised local component/plugin styles outside that boundary are still being migrated. See [theme architecture](theme-architecture.md) for composition, examples, and current limits.
|
|
527
|
+
|
|
528
|
+
Declare new themes as static package metadata. A theme-only package ships CSS and assets without browser JavaScript or a server module. The gateway reads themes without evaluating package code and includes its default-theme details and CSS in the initial page. Details include the associated light/dark pair; both variants' CSS are included for Auto. The app can show that palette while a different browser preference loads through an ordinary request. General settings fetch the full inventory once per dialog, with explicit retry on failure and HTTP caching across requests. Built-in palettes use the same declarative mechanism. Optional Custom UI Codex contributes presentation styles and static theme metadata; it does not change the default theme, and Paper / Graphite remain ordinary catalog choices. Defaults, device precedence, and enforcement are described in [configuration](config.md#default-theme-and-streaming).
|
|
529
|
+
|
|
530
|
+
For example, ship this `package.json` alongside `assets/dark.css` and `assets/light.css`:
|
|
531
|
+
|
|
532
|
+
```json
|
|
533
|
+
{
|
|
534
|
+
"name": "pi-web-ocean-themes",
|
|
535
|
+
"version": "1.0.0",
|
|
536
|
+
"files": ["assets"],
|
|
537
|
+
"piWeb": {
|
|
538
|
+
"plugins": [{
|
|
539
|
+
"id": "ocean-themes",
|
|
540
|
+
"browserRoot": "assets",
|
|
541
|
+
"themes": [{
|
|
542
|
+
"id": "ocean-dark",
|
|
543
|
+
"name": "Ocean Dark",
|
|
544
|
+
"colorScheme": "dark",
|
|
545
|
+
"stylesheets": [{ "id": "palette", "path": "dark.css" }]
|
|
546
|
+
}, {
|
|
547
|
+
"id": "ocean-light",
|
|
548
|
+
"name": "Ocean Light",
|
|
549
|
+
"colorScheme": "light",
|
|
550
|
+
"stylesheets": [{ "id": "palette", "path": "light.css" }]
|
|
551
|
+
}],
|
|
552
|
+
"themePairs": [{
|
|
553
|
+
"id": "ocean",
|
|
554
|
+
"name": "Ocean",
|
|
555
|
+
"light": "ocean-light",
|
|
556
|
+
"dark": "ocean-dark"
|
|
557
|
+
}]
|
|
558
|
+
}]
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
```
|
|
562
|
+
|
|
563
|
+
Theme and pair declarations require `id` and `name`, and accept optional `description` and finite numeric `order`. Themes also require `colorScheme` (`light` or `dark`) and a nonempty `stylesheets` list. Each stylesheet requires a local `id` and a `path` relative to `browserRoot`, with optional finite numeric `order`. Local IDs begin with a lowercase letter and contain only lowercase letters, digits, dots, or hyphens. Theme and pair IDs must be distinct within an entry; stylesheet IDs must be distinct within each theme. Pair members must reference local themes with matching light/dark schemes.
|
|
564
|
+
|
|
565
|
+
Keep paths inside the browser-public root, without leading slashes, backslashes, empty segments, `.` or `..` segments. Everything in `browserRoot` is public; ship only intended assets. The gateway supplies qualified theme IDs such as `ocean-themes:ocean-dark` and default/enforced policy. Initial delivery contains only the default selection, or Classic if the initial default is absent from the static catalog (for example, a legacy runtime theme, a disabled plugin, or an unknown ID). This bootstrap fallback preserves the original preference and does not apply to explicit theme queries. `GET api/theme?themeId=…&auto=…` supplies another selection on demand, and General settings use `GET api/themes` for the complete enabled picker inventory. The application HTML embeds the same bootstrap envelope when it is available. The development Vite server obtains that identical envelope server-to-server through `GET`/`HEAD api/theme-bootstrap`; this one route is anonymous because the dev server has no user session. `GET api/theme` and `GET api/themes` remain behind ordinary authentication, and theme CSS keeps ordinary static-resource access. Metadata responses support private HTTP caching with ETag revalidation. It supplies revision-path stylesheet URLs so relative CSS fonts and images use the same immutable asset revision. Keep those assets under the same root, and bundle CSS imports before shipping. Theme-only changes need a browser reload, not a session-daemon restart.
|
|
566
|
+
|
|
567
|
+
#### Migrating runtime themes
|
|
568
|
+
|
|
569
|
+
Browser `activate().contributions.themes` and `themePairs` are deprecated but remain supported, with a browser-console deprecation warning. V5 runtime themes still use CSS stylesheet URLs; v4 themes retain their required `tokens: ThemeTokens` contract and cannot declare stylesheet contributions. Existing token palettes continue to work through semantic-property fallbacks, and switching away clears their overrides. Runtime themes require browser activation and cannot benefit from early static discovery.
|
|
570
|
+
|
|
571
|
+
Move theme and pair metadata into the same entry's `piWeb.plugins[]` declaration. Replace stylesheet `url` expressions with `path` values relative to `browserRoot`, and ship the CSS and referenced assets there. Convert v4 tokens into CSS custom properties. Preserve the plugin ID and local theme/pair IDs to keep saved choices valid, and remove the old runtime registrations rather than registering the same themes twice. Remove `module` only if the browser entry has no other work; remove `serverModule` only if no backend is needed.
|
|
572
|
+
|
|
573
|
+
Put palette custom properties on `:root` so they inherit into shadow trees; use ordinary selectors in the same file for direct rules in participating roots.
|
|
574
|
+
|
|
575
|
+
`dark.css` might start with:
|
|
576
|
+
|
|
577
|
+
```css
|
|
578
|
+
:root {
|
|
579
|
+
--pi-bg: #071923;
|
|
580
|
+
--pi-surface: #102b38;
|
|
581
|
+
--pi-text: #e4f5ff;
|
|
582
|
+
--pi-accent: #60d7ee;
|
|
583
|
+
}
|
|
584
|
+
```
|
|
585
|
+
|
|
586
|
+
#### Semantic appearance properties
|
|
587
|
+
|
|
588
|
+
Themes can override these properties independently of the base palette:
|
|
589
|
+
|
|
590
|
+
| Properties | Purpose |
|
|
591
|
+
| --- | --- |
|
|
592
|
+
| `--pi-font`, `--pi-mono` | UI and code font-family stacks; control sizes and line heights stay component-owned |
|
|
593
|
+
| `--pi-thinking`, `--pi-tool` | Thinking and tool activity tones |
|
|
594
|
+
| `--pi-syntax-comment`, `--pi-syntax-keyword`, `--pi-syntax-string`, `--pi-syntax-number`, `--pi-syntax-title`, `--pi-syntax-deletion` | Syntax-highlighting colours, independent of success/warning/error feedback |
|
|
595
|
+
| `--pi-chat-conversation-bg`, `--pi-chat-conversation-border` | Ordinary conversation surface and leading edge |
|
|
596
|
+
| `--pi-chat-user-bg`, `--pi-chat-user-border` | User-message surface and leading edge |
|
|
597
|
+
| `--pi-chat-system-bg` | System-message surface |
|
|
598
|
+
| `--pi-chat-activity-bg`, `--pi-chat-compacting-bg` | Session activity and compaction surfaces |
|
|
599
|
+
|
|
600
|
+
Define these on `:root`, alongside the base palette. Font properties accept font-family stacks, not complete `font` shorthands; keep `--pi-mono` monospaced for code alignment. The terminal's xterm grid and copy-selection overlay retain their configured font so cell geometry stays aligned. Existing themes may omit them: components fall back to base palette colours, existing colour mixes, and system fonts. Built-in themes declare them explicitly; most colours alias or mix base palette properties. Syntax deletions default to `--pi-danger`; the legacy `--pi-error` property remains a fallback for older external themes. Theme properties control appearance; direct CSS rules can also customise migrated base layouts. Components retain interaction and scroll controllers, while the base theme supplies default responsive CSS and visual accessibility treatments. These properties, like shared UI classes, remain experimental.
|
|
601
|
+
|
|
602
|
+
The example above is a partial palette. Use the [built-in palette files](https://github.com/jmfederico/pi-web/tree/main/pi-web-plugins/themes/assets) as a reference for the shared `--pi-*` vocabulary. `colorScheme` remains required metadata for native controls and browser appearance; declaring CSS alone does not set it. Theme pair `light` and `dark` values are local theme IDs from the same plugin. Auto mode follows the device preference within the pair; unpaired themes stay selected. See [theme selection and defaults](config.md#theme-default-and-device-choices) for device choices, fallback, and the preserved built-in IDs. Machine-bound remote theme contributions remain ignored; themes are app-wide.
|
|
603
|
+
|
|
310
604
|
## 代理开发
|
|
311
605
|
|
|
312
606
|
给代理具体目标、数据来源及允许的动作:
|
|
@@ -332,8 +626,6 @@ Pi 扩展可请求确认、选择或文本输入;问题以内联方式展示
|
|
|
332
626
|
| 小型浏览器插件 | [信息](https://github.com/nayuto-wakusei/pi-web-ChineseTranslation/tree/main/pi-web-plugins/info) |
|
|
333
627
|
| 独立浏览器/服务端包 | [工作区提供器示例](https://github.com/nayuto-wakusei/pi-web-ChineseTranslation/tree/main/examples/workspace-provider-plugin) |
|
|
334
628
|
| 生产工作区提供器与配套 UI | [Git](https://github.com/nayuto-wakusei/pi-web-ChineseTranslation/tree/main/pi-web-plugins/git) |
|
|
335
|
-
| 已托管会话、实时更新与 Pi 配套扩展 | [Captain's Log](https://github.com/nayuto-wakusei/pi-web-ChineseTranslation/tree/main/pi-packages/captains-log) |
|
|
336
|
-
| 简单初始提示词工作流 | [工作区审查示例](https://github.com/nayuto-wakusei/pi-web-ChineseTranslation/tree/main/examples/session-bridge-plugin) |
|
|
337
629
|
| 发现规则与诊断 | [插件目录](https://github.com/nayuto-wakusei/pi-web-ChineseTranslation/blob/main/src/server/piWebPluginCatalog.ts) |
|
|
338
630
|
|
|
339
631
|
当前浏览器与服务端契约均为 **API v5**;宿主继续支持浏览器 **API v4** 和服务端 **API v3**,旧类型名兼容保留。catalog、作用域 backend 及 v5 贡献需使用对应 v5 入口,不将新功能直接塞进旧版本贡献。公开源码契约和已安装声明是签名、验证、限制与生命周期的依据。
|
|
@@ -346,6 +638,43 @@ Pi 扩展可请求确认、选择或文本输入;问题以内联方式展示
|
|
|
346
638
|
- 工作区发现与会话支持功能分离,代理行为放在 Pi 配套扩展,而不是导入宿主内部模块。
|
|
347
639
|
|
|
348
640
|
<a id="trust-and-recovery"></a>
|
|
641
|
+
## Session lifecycle
|
|
642
|
+
|
|
643
|
+
Plugins can manage a saved session by its full `{ projectId, workspaceId, sessionId }` identity, without selecting it in the browser or opening its runtime. The host resolves the workspace; plugins do not supply session file paths.
|
|
644
|
+
|
|
645
|
+
Browser v5 invocation contexts expose optional `context.sessions`, bound to that context's machine. Check for its presence on older hosts. Server plugins declare `PI_WEB_HOST_SESSION_LIFECYCLE_CAPABILITY` from `@jmfederico/pi-web/server-plugin-api` in `requires`, then resolve it in `start({ capabilities })`. The capability is local to that daemon and becomes available after workspace providers have settled; workspace providers must not depend on it.
|
|
646
|
+
|
|
647
|
+
| Method | Effect |
|
|
648
|
+
| --- | --- |
|
|
649
|
+
| `get(target)` | Read `{ sessionId, pinned, archived }`. |
|
|
650
|
+
| `pin(target)` | Persist a pin in the target workspace for an active or archived session. |
|
|
651
|
+
| `unpin(target)` | Remove that workspace's pin; pins in other scopes remain in effect. |
|
|
652
|
+
| `archive(target)` | Archive that session, without implicitly archiving descendants. |
|
|
653
|
+
| `restore(target)` | Restore an archived session without starting its runtime. |
|
|
654
|
+
| `delete(target)` | Permanently delete an already-archived session. |
|
|
655
|
+
|
|
656
|
+
```ts
|
|
657
|
+
// In a browser plugin's event handler, using IDs returned by context.catalog:
|
|
658
|
+
const sessions = context.sessions;
|
|
659
|
+
if (sessions === undefined) throw new Error("This host does not support session lifecycle operations");
|
|
660
|
+
const target = { projectId, workspaceId, sessionId };
|
|
661
|
+
await sessions.pin(target);
|
|
662
|
+
const state = await sessions.get(target);
|
|
663
|
+
```
|
|
664
|
+
|
|
665
|
+
**Pins protect cleanup, not explicit plugin commands.** A plugin can explicitly archive a pinned session or delete it once archived; it does not need to unpin first. Native busy-session and archived-only deletion safeguards still apply. Plugins are trusted code and must decide when to request confirmation for destructive actions. Cleanup previews remain estimates: cleanup rechecks eligibility and pins when it runs, rather than freezing a session list.
|
|
666
|
+
|
|
667
|
+
Calls accept an optional `{ signal }`. Cancellation or plugin disposal prevents new work; it does not undo a mutation already admitted by the host. Call mutations from event handlers or background work, not render or availability callbacks. Errors are reported to the caller; do not automatically retry a destructive operation after an ambiguous transport failure without checking the current state.
|
|
668
|
+
|
|
669
|
+
### Pin-storage upgrade
|
|
670
|
+
|
|
671
|
+
Session pins for navigation and lifecycle are daemon-owned managed state in `$PI_WEB_DATA_DIR/navigation-session-pins.json`. Normal pins and restricted or fully privileged management pins share this store: management scopes are isolated by the verified context's root-user and user IDs, and project/workspace membership is validated. Normal plugin lifecycle, catalog, and cleanup never see management pins, and management invalidations are published only to the matching management event scope. Project and workspace ordering remains unavailable in management mode. Pinned session membership and ordering both come from navigation preferences, not the retired cwd session routes. The old `session-pins.json` and the `/sessions/pins` and `/sessions/:id/pin` routes are retired; new code never reads or writes that file, which stays as a backup and is not auto-converted. When the navigation file is absent, only normal pins are imported from `navigation-preferences.json`. If the old file is navigation-format and the new file does not exist, copy it manually before startup; scoped data requires an explicit mapping decision and must not be renamed or copied into the new schema. Browser pin actions, plugin commands, and cleanup then use the same daemon-owned pins.
|
|
672
|
+
|
|
673
|
+
Upgrade/restart the web/API process **before** starting the updated session daemon, then reload the browser. Do not keep an older web/API process writing pins after the daemon takes ownership. Managed pins additionally require the `sessions.pins.managementScoped` capability on both web/API and daemon; the gateway rejects an unsupported daemon instead of using the ordinary pin scope. New web/API processes do not fall back to legacy pin writes if the daemon is unavailable or outdated. **Restarting sessiond interrupts active sessions and terminals**; schedule this cutover when they can be interrupted.
|
|
674
|
+
|
|
675
|
+
|
|
676
|
+
普通插件会话生命周期能力不开放管理会话;管理身份、授权和审计边界不因显式 pin/archive/delete 操作而消失。
|
|
677
|
+
|
|
349
678
|
## 信任与恢复
|
|
350
679
|
|
|
351
680
|
**仅安装可信插件。** 浏览器入口在页面内运行;服务端入口在守护进程内使用其文件系统、环境及进程权限,没有独立沙箱。阻塞或故障服务端代码可影响同一守护进程所有会话;超时只能帮助配合取消的工作,不能停止阻塞代码。管理嵌入继续保留独立认证、授权资源、能力与审计边界,不向插件放开普通模式能力。
|