@colinxu/pi-web-classic 0.0.0-stage → 0.12.3
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/.next/BUILD_ID +1 -0
- package/.next/app-path-routes-manifest.json +75 -0
- package/.next/build-manifest.json +20 -0
- package/.next/diagnostics/build-diagnostics.json +6 -0
- package/.next/diagnostics/framework.json +1 -0
- package/.next/export-marker.json +6 -0
- package/.next/images-manifest.json +68 -0
- package/.next/next-minimal-server.js.nft.json +1 -0
- package/.next/next-server.js.nft.json +1 -0
- package/.next/package.json +1 -0
- package/.next/prerender-manifest.json +157 -0
- package/.next/react-loadable-manifest.json +401 -0
- package/.next/required-server-files.js +398 -0
- package/.next/required-server-files.json +398 -0
- package/.next/routes-manifest.json +561 -0
- package/.next/server/app/_global-error/page.js +31 -0
- package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -0
- package/.next/server/app/_global-error.html +1 -0
- package/.next/server/app/_global-error.meta +35 -0
- package/.next/server/app/_global-error.rsc +14 -0
- package/.next/server/app/_global-error.segments/_full.segment.rsc +14 -0
- package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +20 -0
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -0
- package/.next/server/app/_not-found/page.js +1 -0
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -0
- package/.next/server/app/_not-found.html +1 -0
- package/.next/server/app/_not-found.meta +35 -0
- package/.next/server/app/_not-found.rsc +22 -0
- package/.next/server/app/_not-found.segments/_full.segment.rsc +22 -0
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +28 -0
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +7 -0
- package/.next/server/app/api/agent/[id]/bash-output/route.js +1 -0
- package/.next/server/app/api/agent/[id]/bash-output/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/agent/[id]/events/route.js +3 -0
- package/.next/server/app/api/agent/[id]/events/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/agent/[id]/lease/route.js +1 -0
- package/.next/server/app/api/agent/[id]/lease/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/agent/[id]/route.js +1 -0
- package/.next/server/app/api/agent/[id]/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/agent/new/route.js +1 -0
- package/.next/server/app/api/agent/new/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/agent/running/route.js +1 -0
- package/.next/server/app/api/agent/running/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/app-update/route.js +1 -0
- package/.next/server/app/api/app-update/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/auth/api-key/[provider]/route.js +1 -0
- package/.next/server/app/api/auth/api-key/[provider]/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/auth/login/[provider]/route.js +3 -0
- package/.next/server/app/api/auth/login/[provider]/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/auth/logout/[provider]/route.js +1 -0
- package/.next/server/app/api/auth/logout/[provider]/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/auth/providers/route.js +1 -0
- package/.next/server/app/api/auth/providers/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/cache-miss-notices/route.js +1 -0
- package/.next/server/app/api/cache-miss-notices/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/cwd/browse/route.js +1 -0
- package/.next/server/app/api/cwd/browse/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/cwd/validate/route.js +1 -0
- package/.next/server/app/api/cwd/validate/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/default-cwd/route.js +1 -0
- package/.next/server/app/api/default-cwd/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/file-index/route.js +1 -0
- package/.next/server/app/api/file-index/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/files/[...path]/route.js +49 -0
- package/.next/server/app/api/files/[...path]/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/git/diff/route.js +6 -0
- package/.next/server/app/api/git/diff/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/git/status/route.js +6 -0
- package/.next/server/app/api/git/status/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/home/route.js +1 -0
- package/.next/server/app/api/home/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/mcp/route.js +2 -0
- package/.next/server/app/api/mcp/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/mcp/sign-in/[flowId]/route.js +1 -0
- package/.next/server/app/api/mcp/sign-in/[flowId]/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/mcp/sign-in/route.js +1 -0
- package/.next/server/app/api/mcp/sign-in/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/mcp/test/route.js +1 -0
- package/.next/server/app/api/mcp/test/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/models/default/route.js +1 -0
- package/.next/server/app/api/models/default/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/models/enabled/route.js +1 -0
- package/.next/server/app/api/models/enabled/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/models/refresh/route.js +1 -0
- package/.next/server/app/api/models/refresh/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/models/route.js +1 -0
- package/.next/server/app/api/models/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/models-config/catalog/route.js +1 -0
- package/.next/server/app/api/models-config/catalog/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/models-config/discover/route.js +1 -0
- package/.next/server/app/api/models-config/discover/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/models-config/route.js +1 -0
- package/.next/server/app/api/models-config/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/models-config/test/route.js +1 -0
- package/.next/server/app/api/models-config/test/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/open-in-explorer/route.js +1 -0
- package/.next/server/app/api/open-in-explorer/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/plugins/check/route.js +1 -0
- package/.next/server/app/api/plugins/check/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/plugins/route.js +1 -0
- package/.next/server/app/api/plugins/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/project-trust/route.js +1 -0
- package/.next/server/app/api/project-trust/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/provider-usage/query/route.js +1 -0
- package/.next/server/app/api/provider-usage/query/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/push/config/route.js +1 -0
- package/.next/server/app/api/push/config/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/push/subscribe/route.js +1 -0
- package/.next/server/app/api/push/subscribe/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/[id]/auto-name/route.js +11 -0
- package/.next/server/app/api/sessions/[id]/auto-name/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/[id]/context/route.js +1 -0
- package/.next/server/app/api/sessions/[id]/context/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/[id]/entries/[entryId]/thinking/route.js +1 -0
- package/.next/server/app/api/sessions/[id]/entries/[entryId]/thinking/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/[id]/entries/[entryId]/tool-result-image/route.js +1 -0
- package/.next/server/app/api/sessions/[id]/entries/[entryId]/tool-result-image/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/[id]/export/route.js +54 -0
- package/.next/server/app/api/sessions/[id]/export/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/[id]/fork/route.js +1 -0
- package/.next/server/app/api/sessions/[id]/fork/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/[id]/route.js +1 -0
- package/.next/server/app/api/sessions/[id]/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/[id]/state/route.js +1 -0
- package/.next/server/app/api/sessions/[id]/state/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/delete/route.js +1 -0
- package/.next/server/app/api/sessions/delete/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/route.js +1 -0
- package/.next/server/app/api/sessions/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/search/route.js +1 -0
- package/.next/server/app/api/sessions/search/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/stats/route.js +1 -0
- package/.next/server/app/api/sessions/stats/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/ui-state/route.js +1 -0
- package/.next/server/app/api/sessions/ui-state/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/skills/check/route.js +1 -0
- package/.next/server/app/api/skills/check/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/skills/content/route.js +1 -0
- package/.next/server/app/api/skills/content/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/skills/install/route.js +1 -0
- package/.next/server/app/api/skills/install/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/skills/route.js +4 -0
- package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/skills/search/route.js +1 -0
- package/.next/server/app/api/skills/search/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/skills/update/route.js +1 -0
- package/.next/server/app/api/skills/update/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/subagents/[id]/route.js +1 -0
- package/.next/server/app/api/subagents/[id]/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/subagents/profiles/route.js +1 -0
- package/.next/server/app/api/subagents/profiles/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/subagents/settings/route.js +1 -0
- package/.next/server/app/api/subagents/settings/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/terminal/[id]/events/route.js +4 -0
- package/.next/server/app/api/terminal/[id]/events/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/terminal/[id]/route.js +1 -0
- package/.next/server/app/api/terminal/[id]/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/terminal/route.js +1 -0
- package/.next/server/app/api/terminal/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/tools/settings/route.js +1 -0
- package/.next/server/app/api/tools/settings/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/web-auth/route.js +1 -0
- package/.next/server/app/api/web-auth/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/worktrees/route.js +1 -0
- package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -0
- package/.next/server/app/favicon.ico/route.js +1 -0
- package/.next/server/app/favicon.ico.body +0 -0
- package/.next/server/app/favicon.ico.meta +1 -0
- package/.next/server/app/index.html +1 -0
- package/.next/server/app/index.meta +29 -0
- package/.next/server/app/index.rsc +23 -0
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +27 -0
- package/.next/server/app/index.segments/_full.segment.rsc +23 -0
- package/.next/server/app/index.segments/_tree.segment.rsc +8 -0
- package/.next/server/app/login/page.js +1 -0
- package/.next/server/app/login/page_client-reference-manifest.js +1 -0
- package/.next/server/app/login.html +1 -0
- package/.next/server/app/login.meta +34 -0
- package/.next/server/app/login.rsc +26 -0
- package/.next/server/app/login.segments/_full.segment.rsc +26 -0
- package/.next/server/app/login.segments/_tree.segment.rsc +7 -0
- package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +32 -0
- package/.next/server/app/manifest.webmanifest/route.js +17 -0
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -0
- package/.next/server/app/page.js +309 -0
- package/.next/server/app/page_client-reference-manifest.js +1 -0
- package/.next/server/app-paths-manifest.json +75 -0
- package/.next/server/chunks/11.js +1 -0
- package/.next/server/chunks/1207.js +1 -0
- package/.next/server/chunks/1286.js +1 -0
- package/.next/server/chunks/1412.js +38 -0
- package/.next/server/chunks/1605.js +1 -0
- package/.next/server/chunks/169.js +1 -0
- package/.next/server/chunks/18.js +86 -0
- package/.next/server/chunks/1813.js +1 -0
- package/.next/server/chunks/1906.js +1 -0
- package/.next/server/chunks/2022.js +1 -0
- package/.next/server/chunks/2069.js +1 -0
- package/.next/server/chunks/2156.js +1 -0
- package/.next/server/chunks/2157.js +1 -0
- package/.next/server/chunks/2243.js +1 -0
- package/.next/server/chunks/2325.js +82 -0
- package/.next/server/chunks/2430.js +193 -0
- package/.next/server/chunks/2498.js +1 -0
- package/.next/server/chunks/27.js +1 -0
- package/.next/server/chunks/2838.js +1 -0
- package/.next/server/chunks/2897.js +79 -0
- package/.next/server/chunks/2970.js +165 -0
- package/.next/server/chunks/3227.js +1 -0
- package/.next/server/chunks/3266.js +1 -0
- package/.next/server/chunks/3379.js +1 -0
- package/.next/server/chunks/3428.js +32 -0
- package/.next/server/chunks/3479.js +1 -0
- package/.next/server/chunks/3618.js +1 -0
- package/.next/server/chunks/367.js +115 -0
- package/.next/server/chunks/3698.js +93 -0
- package/.next/server/chunks/3709.js +148 -0
- package/.next/server/chunks/3757.js +1 -0
- package/.next/server/chunks/3824.js +1 -0
- package/.next/server/chunks/4107.js +62 -0
- package/.next/server/chunks/426.js +14 -0
- package/.next/server/chunks/4569.js +34 -0
- package/.next/server/chunks/4698.js +1 -0
- package/.next/server/chunks/4755.js +153 -0
- package/.next/server/chunks/4815.js +3 -0
- package/.next/server/chunks/5002.js +1 -0
- package/.next/server/chunks/5112.js +1 -0
- package/.next/server/chunks/5289.js +8 -0
- package/.next/server/chunks/5318.js +1 -0
- package/.next/server/chunks/5452.js +23 -0
- package/.next/server/chunks/5453.js +1 -0
- package/.next/server/chunks/5582.js +8 -0
- package/.next/server/chunks/5749.js +27 -0
- package/.next/server/chunks/5782.js +36 -0
- package/.next/server/chunks/6163.js +104 -0
- package/.next/server/chunks/6169.js +64 -0
- package/.next/server/chunks/6208.js +172 -0
- package/.next/server/chunks/6399.js +24 -0
- package/.next/server/chunks/6429.js +32 -0
- package/.next/server/chunks/6496.js +1 -0
- package/.next/server/chunks/6686.js +1 -0
- package/.next/server/chunks/6823.js +215 -0
- package/.next/server/chunks/6888.js +1 -0
- package/.next/server/chunks/6953.js +1 -0
- package/.next/server/chunks/7245.js +77 -0
- package/.next/server/chunks/7307.js +1 -0
- package/.next/server/chunks/7372.js +287 -0
- package/.next/server/chunks/7384.js +226 -0
- package/.next/server/chunks/7492.js +1 -0
- package/.next/server/chunks/7516.js +1 -0
- package/.next/server/chunks/7531.js +24 -0
- package/.next/server/chunks/7591.js +1 -0
- package/.next/server/chunks/7755.js +138 -0
- package/.next/server/chunks/7916.js +1 -0
- package/.next/server/chunks/8078.js +94 -0
- package/.next/server/chunks/8253.js +41 -0
- package/.next/server/chunks/8635.js +1 -0
- package/.next/server/chunks/8637.js +1 -0
- package/.next/server/chunks/8688.js +1 -0
- package/.next/server/chunks/8872.js +1 -0
- package/.next/server/chunks/9006.js +1 -0
- package/.next/server/chunks/9018.js +1 -0
- package/.next/server/chunks/9047.js +1 -0
- package/.next/server/chunks/9108.js +1 -0
- package/.next/server/chunks/9165.js +1 -0
- package/.next/server/chunks/9280.js +256 -0
- package/.next/server/chunks/9419.js +1 -0
- package/.next/server/chunks/9430.js +1 -0
- package/.next/server/chunks/9586.js +1 -0
- package/.next/server/chunks/9690.js +90 -0
- package/.next/server/chunks/974.js +1 -0
- package/.next/server/chunks/9775.js +1 -0
- package/.next/server/chunks/992.js +1 -0
- package/.next/server/chunks/9926.js +1 -0
- package/.next/server/functions-config-manifest.json +27 -0
- package/.next/server/instrumentation.js +1 -0
- package/.next/server/instrumentation.js.nft.json +1 -0
- package/.next/server/interception-route-rewrite-manifest.js +1 -0
- package/.next/server/middleware-build-manifest.js +1 -0
- package/.next/server/middleware-manifest.json +6 -0
- package/.next/server/middleware-react-loadable-manifest.js +1 -0
- package/.next/server/middleware.js +163 -0
- package/.next/server/middleware.js.nft.json +1 -0
- package/.next/server/next-font-manifest.js +1 -0
- package/.next/server/next-font-manifest.json +1 -0
- package/.next/server/pages/404.html +1 -0
- package/.next/server/pages/500.html +1 -0
- package/.next/server/pages-manifest.json +4 -0
- package/.next/server/prefetch-hints.json +53 -0
- package/.next/server/server-reference-manifest.js +1 -0
- package/.next/server/server-reference-manifest.json +1 -0
- package/.next/server/webpack-runtime.js +1 -0
- package/.next/static/2ftfKxA2Tk6WrtjeFq3pC/_buildManifest.js +1 -0
- package/.next/static/2ftfKxA2Tk6WrtjeFq3pC/_ssgManifest.js +1 -0
- package/.next/static/chunks/1213.4848a5579bece837.js +24 -0
- package/.next/static/chunks/1278-902e48c12cf60065.js +1 -0
- package/.next/static/chunks/1326.72decfb808c97abe.js +1 -0
- package/.next/static/chunks/1519.2f596e5f5af9ef57.js +62 -0
- package/.next/static/chunks/2280.e03ab3748922284c.js +1 -0
- package/.next/static/chunks/2521.2ba812532f472610.js +77 -0
- package/.next/static/chunks/2585.4d6aa847c780c666.js +1 -0
- package/.next/static/chunks/2589.e456c324416f9615.js +1 -0
- package/.next/static/chunks/2600.45ba17a0f756fc31.js +1 -0
- package/.next/static/chunks/2619.9431a3f48da8eef4.js +1 -0
- package/.next/static/chunks/26d302b2.cd19dc0940cb3e75.js +122 -0
- package/.next/static/chunks/2768.1a75ba9e2be767cf.js +1 -0
- package/.next/static/chunks/2931.c5527c92f7264e9a.js +41 -0
- package/.next/static/chunks/3016.406e568aa95ff867.js +1 -0
- package/.next/static/chunks/3052.5da5bde6a131930a.js +90 -0
- package/.next/static/chunks/3064.3a2a1e7cd4fdca5f.js +1 -0
- package/.next/static/chunks/3174.03fbed7b7d7a8256.js +1 -0
- package/.next/static/chunks/3189.b048866768087750.js +1 -0
- package/.next/static/chunks/3217.457eee26edea225c.js +24 -0
- package/.next/static/chunks/3308.935f7625e681e15a.js +74 -0
- package/.next/static/chunks/331.fc5d78e1e91daf43.js +1 -0
- package/.next/static/chunks/3510.5d4d1c79533e080c.js +1 -0
- package/.next/static/chunks/364.ce5400a9dd70b9dc.js +1 -0
- package/.next/static/chunks/370.a485dd5092c76362.js +1 -0
- package/.next/static/chunks/3789.c418b69121761983.js +1 -0
- package/.next/static/chunks/3794-6f271a1eb27dfa20.js +52 -0
- package/.next/static/chunks/3831.25ae62d10dccc27a.js +1 -0
- package/.next/static/chunks/3a7aa434.9780f397da64eb81.js +82 -0
- package/.next/static/chunks/4020.3cc19c463c49f969.js +23 -0
- package/.next/static/chunks/4035.f5bcc2e4f0beee2b.js +1 -0
- package/.next/static/chunks/405.7027b68fbb48582a.js +215 -0
- package/.next/static/chunks/4159.8f53338a07b26845.js +138 -0
- package/.next/static/chunks/4208.e3c7f2d5c26dcf2e.js +287 -0
- package/.next/static/chunks/4263.ffa8d9bd8a0faaae.js +1 -0
- package/.next/static/chunks/4561.70303588b0cd3621.js +34 -0
- package/.next/static/chunks/4592.507c41f345e21bee.js +93 -0
- package/.next/static/chunks/4799.1d3f2e30954503b8.js +1 -0
- package/.next/static/chunks/4bd1b696-8a4ab4fdf0ae305a.js +1 -0
- package/.next/static/chunks/514.b804c51b26f5e126.js +1 -0
- package/.next/static/chunks/5270.2b9a21b6ce8fd8d2.js +1 -0
- package/.next/static/chunks/52733464.74fafefbfa340fc8.js +1 -0
- package/.next/static/chunks/5354.b559c717a607dc5c.js +1 -0
- package/.next/static/chunks/5448.23a76c3983fec0f6.js +38 -0
- package/.next/static/chunks/5772-c8175d2fabf63b95.js +3 -0
- package/.next/static/chunks/587.d52737d7288c11b4.js +1 -0
- package/.next/static/chunks/5909.172aa3edf289b590.js +115 -0
- package/.next/static/chunks/5949.54e8a766895688d7.js +104 -0
- package/.next/static/chunks/60c48509.2ba44b5cbe52c6e7.js +158 -0
- package/.next/static/chunks/6361.4b1fa56fca9b6356.js +148 -0
- package/.next/static/chunks/6774.07517a60a602aadd.js +86 -0
- package/.next/static/chunks/6968.b80277c724dbc96e.js +1 -0
- package/.next/static/chunks/7236.55a9728d35f5b8a6.js +1 -0
- package/.next/static/chunks/7390.bc7f4ed9f76fe9e1.js +1 -0
- package/.next/static/chunks/7806.a903780fcfa3a30e.js +1 -0
- package/.next/static/chunks/790.45f73b5eb2e089eb.js +1 -0
- package/.next/static/chunks/8216.64a72d4d35ea7be0.js +1 -0
- package/.next/static/chunks/830.a6da04c322e3204a.js +1 -0
- package/.next/static/chunks/8378.6acf715f56997572.js +226 -0
- package/.next/static/chunks/8501.3b0a97ac3e782a0f.js +79 -0
- package/.next/static/chunks/8663.7deb45d41d190483.js +27 -0
- package/.next/static/chunks/872.96937e758ddce860.js +1 -0
- package/.next/static/chunks/8803.75bde095fe3613f5.js +1 -0
- package/.next/static/chunks/8863.582d77dad0e1cc29.js +1 -0
- package/.next/static/chunks/90542734.90283a0c0c838d51.js +1 -0
- package/.next/static/chunks/9379.979bec4531e0611a.js +64 -0
- package/.next/static/chunks/9389.906fe7aa9cd6a170.js +1 -0
- package/.next/static/chunks/9472.08db7006e4a030a4.js +94 -0
- package/.next/static/chunks/9647.29c5a9819b36fcda.js +15 -0
- package/.next/static/chunks/966.7ab226a15142fae2.js +1 -0
- package/.next/static/chunks/975.710b5962d34d4598.js +22 -0
- package/.next/static/chunks/9884.fca67f18c0fb2808.js +36 -0
- package/.next/static/chunks/9932-60e21347ba9f8664.js +7 -0
- package/.next/static/chunks/a339c874.7657a67d1b0d46c1.js +32 -0
- package/.next/static/chunks/app/_global-error/page-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/_not-found/page-1e1cf8cba5576cd4.js +1 -0
- package/.next/static/chunks/app/api/agent/[id]/bash-output/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/agent/[id]/events/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/agent/[id]/lease/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/agent/[id]/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/agent/new/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/agent/running/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/app-update/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/auth/api-key/[provider]/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/auth/login/[provider]/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/auth/logout/[provider]/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/auth/providers/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/cache-miss-notices/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/cwd/browse/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/cwd/validate/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/default-cwd/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/file-index/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/files/[...path]/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/git/diff/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/git/status/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/home/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/mcp/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/mcp/sign-in/[flowId]/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/mcp/sign-in/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/mcp/test/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/models/default/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/models/enabled/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/models/refresh/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/models/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/models-config/catalog/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/models-config/discover/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/models-config/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/models-config/test/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/open-in-explorer/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/plugins/check/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/plugins/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/project-trust/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/provider-usage/query/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/push/config/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/push/subscribe/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/auto-name/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/context/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/entries/[entryId]/thinking/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/entries/[entryId]/tool-result-image/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/export/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/fork/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/state/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/sessions/delete/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/sessions/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/sessions/search/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/sessions/stats/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/sessions/ui-state/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/skills/check/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/skills/content/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/skills/install/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/skills/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/skills/search/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/skills/update/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/subagents/[id]/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/subagents/profiles/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/subagents/settings/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/terminal/[id]/events/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/terminal/[id]/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/terminal/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/tools/settings/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/web-auth/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/worktrees/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/layout-3339966738755d72.js +1 -0
- package/.next/static/chunks/app/login/page-3a355df23c47aa56.js +1 -0
- package/.next/static/chunks/app/manifest.webmanifest/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/page-c6eefaf480702550.js +287 -0
- package/.next/static/chunks/d3ac728e-7964f816a1ca64e5.js +1 -0
- package/.next/static/chunks/e413bedd.1332b3d1558778d6.js +153 -0
- package/.next/static/chunks/e868780c-1584512c612787d7.js +18 -0
- package/.next/static/chunks/ea233666.528d9a11a2c6fe2f.js +62 -0
- package/.next/static/chunks/framework-b33a8f5d57cd8d87.js +1 -0
- package/.next/static/chunks/main-63ddef04e98b28f4.js +5 -0
- package/.next/static/chunks/main-app-a98576891fdd8f60.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/app-error-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/forbidden-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/global-error-30078bc26a2476fc.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/not-found-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
- package/.next/static/chunks/webpack-b6c37de25f933bc6.js +1 -0
- package/.next/static/css/49692dbfa6f26eeb.css +1 -0
- package/.next/static/css/6d897e2692233627.css +1 -0
- package/.next/static/css/9bcd6051db4f8890.css +1 -0
- package/.next/static/css/b944d46e6fd6c54d.css +1 -0
- package/.next/static/css/c82f0c18392f486f.css +1 -0
- package/.next/static/media/15605e25b523335c-s.woff2 +0 -0
- package/.next/static/media/1a3dce5cfb5f7760-s.woff2 +0 -0
- package/.next/static/media/1cdd02902f937a18-s.woff2 +0 -0
- package/.next/static/media/4c4b3b30b6bcb2be-s.woff2 +0 -0
- package/.next/static/media/641a7b8a5800ee0e-s.woff2 +0 -0
- package/.next/static/media/7deddc85b7ffd1dc-s.p.woff2 +0 -0
- package/.next/static/media/KaTeX_AMS-Regular.1608a09b.woff +0 -0
- package/.next/static/media/KaTeX_AMS-Regular.4aafdb68.ttf +0 -0
- package/.next/static/media/KaTeX_AMS-Regular.a79f1c31.woff2 +0 -0
- package/.next/static/media/KaTeX_Caligraphic-Bold.b6770918.woff +0 -0
- package/.next/static/media/KaTeX_Caligraphic-Bold.cce5b8ec.ttf +0 -0
- package/.next/static/media/KaTeX_Caligraphic-Bold.ec17d132.woff2 +0 -0
- package/.next/static/media/KaTeX_Caligraphic-Regular.07ef19e7.ttf +0 -0
- package/.next/static/media/KaTeX_Caligraphic-Regular.55fac258.woff2 +0 -0
- package/.next/static/media/KaTeX_Caligraphic-Regular.dad44a7f.woff +0 -0
- package/.next/static/media/KaTeX_Fraktur-Bold.9f256b85.woff +0 -0
- package/.next/static/media/KaTeX_Fraktur-Bold.b18f59e1.ttf +0 -0
- package/.next/static/media/KaTeX_Fraktur-Bold.d42a5579.woff2 +0 -0
- package/.next/static/media/KaTeX_Fraktur-Regular.7c187121.woff +0 -0
- package/.next/static/media/KaTeX_Fraktur-Regular.d3c882a6.woff2 +0 -0
- package/.next/static/media/KaTeX_Fraktur-Regular.ed38e79f.ttf +0 -0
- package/.next/static/media/KaTeX_Main-Bold.b74a1a8b.ttf +0 -0
- package/.next/static/media/KaTeX_Main-Bold.c3fb5ac2.woff2 +0 -0
- package/.next/static/media/KaTeX_Main-Bold.d181c465.woff +0 -0
- package/.next/static/media/KaTeX_Main-BoldItalic.6f2bb1df.woff2 +0 -0
- package/.next/static/media/KaTeX_Main-BoldItalic.70d8b0a5.ttf +0 -0
- package/.next/static/media/KaTeX_Main-BoldItalic.e3f82f9d.woff +0 -0
- package/.next/static/media/KaTeX_Main-Italic.47373d1e.ttf +0 -0
- package/.next/static/media/KaTeX_Main-Italic.8916142b.woff2 +0 -0
- package/.next/static/media/KaTeX_Main-Italic.9024d815.woff +0 -0
- package/.next/static/media/KaTeX_Main-Regular.0462f03b.woff2 +0 -0
- package/.next/static/media/KaTeX_Main-Regular.7f51fe03.woff +0 -0
- package/.next/static/media/KaTeX_Main-Regular.b7f8fe9b.ttf +0 -0
- package/.next/static/media/KaTeX_Math-BoldItalic.572d331f.woff2 +0 -0
- package/.next/static/media/KaTeX_Math-BoldItalic.a879cf83.ttf +0 -0
- package/.next/static/media/KaTeX_Math-BoldItalic.f1035d8d.woff +0 -0
- package/.next/static/media/KaTeX_Math-Italic.5295ba48.woff +0 -0
- package/.next/static/media/KaTeX_Math-Italic.939bc644.ttf +0 -0
- package/.next/static/media/KaTeX_Math-Italic.f28c23ac.woff2 +0 -0
- package/.next/static/media/KaTeX_SansSerif-Bold.8c5b5494.woff2 +0 -0
- package/.next/static/media/KaTeX_SansSerif-Bold.94e1e8dc.ttf +0 -0
- package/.next/static/media/KaTeX_SansSerif-Bold.bf59d231.woff +0 -0
- package/.next/static/media/KaTeX_SansSerif-Italic.3b1e59b3.woff2 +0 -0
- package/.next/static/media/KaTeX_SansSerif-Italic.7c9bc82b.woff +0 -0
- package/.next/static/media/KaTeX_SansSerif-Italic.b4c20c84.ttf +0 -0
- package/.next/static/media/KaTeX_SansSerif-Regular.74048478.woff +0 -0
- package/.next/static/media/KaTeX_SansSerif-Regular.ba21ed5f.woff2 +0 -0
- package/.next/static/media/KaTeX_SansSerif-Regular.d4d7ba48.ttf +0 -0
- package/.next/static/media/KaTeX_Script-Regular.03e9641d.woff2 +0 -0
- package/.next/static/media/KaTeX_Script-Regular.07505710.woff +0 -0
- package/.next/static/media/KaTeX_Script-Regular.fe9cbbe1.ttf +0 -0
- package/.next/static/media/KaTeX_Size1-Regular.e1e279cb.woff +0 -0
- package/.next/static/media/KaTeX_Size1-Regular.eae34984.woff2 +0 -0
- package/.next/static/media/KaTeX_Size1-Regular.fabc004a.ttf +0 -0
- package/.next/static/media/KaTeX_Size2-Regular.57727022.woff +0 -0
- package/.next/static/media/KaTeX_Size2-Regular.5916a24f.woff2 +0 -0
- package/.next/static/media/KaTeX_Size2-Regular.d6b476ec.ttf +0 -0
- package/.next/static/media/KaTeX_Size3-Regular.9acaf01c.woff +0 -0
- package/.next/static/media/KaTeX_Size3-Regular.a144ef58.ttf +0 -0
- package/.next/static/media/KaTeX_Size3-Regular.b4230e7e.woff2 +0 -0
- package/.next/static/media/KaTeX_Size4-Regular.10d95fd3.woff2 +0 -0
- package/.next/static/media/KaTeX_Size4-Regular.7a996c9d.woff +0 -0
- package/.next/static/media/KaTeX_Size4-Regular.fbccdabe.ttf +0 -0
- package/.next/static/media/KaTeX_Typewriter-Regular.6258592b.woff +0 -0
- package/.next/static/media/KaTeX_Typewriter-Regular.a8709e36.woff2 +0 -0
- package/.next/static/media/KaTeX_Typewriter-Regular.d97aaf4a.ttf +0 -0
- package/.next/static/media/ec14413c594b3356-s.p.woff2 +0 -0
- package/.next/trace +83 -0
- package/.next/trace-build +1 -0
- package/.next/types/app/api/agent/[id]/bash-output/route.ts +353 -0
- package/.next/types/app/api/agent/[id]/events/route.ts +353 -0
- package/.next/types/app/api/agent/[id]/lease/route.ts +353 -0
- package/.next/types/app/api/agent/[id]/route.ts +353 -0
- package/.next/types/app/api/agent/new/route.ts +353 -0
- package/.next/types/app/api/agent/running/route.ts +353 -0
- package/.next/types/app/api/app-update/route.ts +353 -0
- package/.next/types/app/api/auth/api-key/[provider]/route.ts +353 -0
- package/.next/types/app/api/auth/login/[provider]/route.ts +353 -0
- package/.next/types/app/api/auth/logout/[provider]/route.ts +353 -0
- package/.next/types/app/api/auth/providers/route.ts +353 -0
- package/.next/types/app/api/cache-miss-notices/route.ts +353 -0
- package/.next/types/app/api/cwd/browse/route.ts +353 -0
- package/.next/types/app/api/cwd/validate/route.ts +353 -0
- package/.next/types/app/api/default-cwd/route.ts +353 -0
- package/.next/types/app/api/file-index/route.ts +353 -0
- package/.next/types/app/api/files/[...path]/route.ts +353 -0
- package/.next/types/app/api/git/diff/route.ts +353 -0
- package/.next/types/app/api/git/status/route.ts +353 -0
- package/.next/types/app/api/home/route.ts +353 -0
- package/.next/types/app/api/mcp/route.ts +353 -0
- package/.next/types/app/api/mcp/sign-in/[flowId]/route.ts +353 -0
- package/.next/types/app/api/mcp/sign-in/route.ts +353 -0
- package/.next/types/app/api/mcp/test/route.ts +353 -0
- package/.next/types/app/api/models/default/route.ts +353 -0
- package/.next/types/app/api/models/enabled/route.ts +353 -0
- package/.next/types/app/api/models/refresh/route.ts +353 -0
- package/.next/types/app/api/models/route.ts +353 -0
- package/.next/types/app/api/models-config/catalog/route.ts +353 -0
- package/.next/types/app/api/models-config/discover/route.ts +353 -0
- package/.next/types/app/api/models-config/route.ts +353 -0
- package/.next/types/app/api/models-config/test/route.ts +353 -0
- package/.next/types/app/api/open-in-explorer/route.ts +353 -0
- package/.next/types/app/api/plugins/check/route.ts +353 -0
- package/.next/types/app/api/plugins/route.ts +353 -0
- package/.next/types/app/api/project-trust/route.ts +353 -0
- package/.next/types/app/api/provider-usage/query/route.ts +353 -0
- package/.next/types/app/api/push/config/route.ts +353 -0
- package/.next/types/app/api/push/subscribe/route.ts +353 -0
- package/.next/types/app/api/sessions/[id]/auto-name/route.ts +353 -0
- package/.next/types/app/api/sessions/[id]/context/route.ts +353 -0
- package/.next/types/app/api/sessions/[id]/entries/[entryId]/thinking/route.ts +353 -0
- package/.next/types/app/api/sessions/[id]/entries/[entryId]/tool-result-image/route.ts +353 -0
- package/.next/types/app/api/sessions/[id]/export/route.ts +353 -0
- package/.next/types/app/api/sessions/[id]/fork/route.ts +353 -0
- package/.next/types/app/api/sessions/[id]/route.ts +353 -0
- package/.next/types/app/api/sessions/[id]/state/route.ts +353 -0
- package/.next/types/app/api/sessions/delete/route.ts +353 -0
- package/.next/types/app/api/sessions/route.ts +353 -0
- package/.next/types/app/api/sessions/search/route.ts +353 -0
- package/.next/types/app/api/sessions/stats/route.ts +353 -0
- package/.next/types/app/api/sessions/ui-state/route.ts +353 -0
- package/.next/types/app/api/skills/check/route.ts +353 -0
- package/.next/types/app/api/skills/content/route.ts +353 -0
- package/.next/types/app/api/skills/install/route.ts +353 -0
- package/.next/types/app/api/skills/route.ts +353 -0
- package/.next/types/app/api/skills/search/route.ts +353 -0
- package/.next/types/app/api/skills/update/route.ts +353 -0
- package/.next/types/app/api/subagents/[id]/route.ts +353 -0
- package/.next/types/app/api/subagents/profiles/route.ts +353 -0
- package/.next/types/app/api/subagents/settings/route.ts +353 -0
- package/.next/types/app/api/terminal/[id]/events/route.ts +353 -0
- package/.next/types/app/api/terminal/[id]/route.ts +353 -0
- package/.next/types/app/api/terminal/route.ts +353 -0
- package/.next/types/app/api/tools/settings/route.ts +353 -0
- package/.next/types/app/api/web-auth/route.ts +353 -0
- package/.next/types/app/api/worktrees/route.ts +353 -0
- package/.next/types/app/layout.ts +89 -0
- package/.next/types/app/login/page.ts +89 -0
- package/.next/types/app/page.ts +89 -0
- package/.next/types/cache-life.d.ts +146 -0
- package/.next/types/package.json +1 -0
- package/.next/types/root-params.d.ts +3 -0
- package/.next/types/routes.d.ts +140 -0
- package/.next/types/validator.ts +682 -0
- package/LICENSE +22 -0
- package/README.md +208 -2
- package/bin/browser-opener.js +34 -0
- package/bin/node-version.js +35 -0
- package/bin/pi-web-commands.js +118 -0
- package/bin/pi-web-node-args.js +11 -0
- package/bin/pi-web-options.js +141 -0
- package/bin/pi-web-update.js +148 -0
- package/bin/pi-web.js +157 -0
- package/bin/prepare-terminal.js +14 -0
- package/bin/process-lifecycle.js +81 -0
- package/bin/rotate-preview-secrets.js +105 -0
- package/bin/run-records.js +212 -0
- package/next.config.ts +110 -0
- package/package.json +105 -4
- package/public/icons/apple-touch-icon.png +0 -0
- package/public/icons/catppuccin/LICENSE +22 -0
- package/public/icons/catppuccin/README.md +10 -0
- package/public/icons/catppuccin/latte/_file.svg +3 -0
- package/public/icons/catppuccin/latte/_folder.svg +3 -0
- package/public/icons/catppuccin/latte/_folder_open.svg +3 -0
- package/public/icons/catppuccin/latte/bash.svg +7 -0
- package/public/icons/catppuccin/latte/bun-lock.svg +8 -0
- package/public/icons/catppuccin/latte/config.svg +3 -0
- package/public/icons/catppuccin/latte/css.svg +6 -0
- package/public/icons/catppuccin/latte/database.svg +3 -0
- package/public/icons/catppuccin/latte/docker.svg +3 -0
- package/public/icons/catppuccin/latte/env.svg +3 -0
- package/public/icons/catppuccin/latte/eslint.svg +6 -0
- package/public/icons/catppuccin/latte/git.svg +6 -0
- package/public/icons/catppuccin/latte/go.svg +3 -0
- package/public/icons/catppuccin/latte/graphql.svg +3 -0
- package/public/icons/catppuccin/latte/html.svg +6 -0
- package/public/icons/catppuccin/latte/javascript-react.svg +8 -0
- package/public/icons/catppuccin/latte/javascript.svg +6 -0
- package/public/icons/catppuccin/latte/json.svg +3 -0
- package/public/icons/catppuccin/latte/lock.svg +3 -0
- package/public/icons/catppuccin/latte/markdown.svg +3 -0
- package/public/icons/catppuccin/latte/ms-word.svg +6 -0
- package/public/icons/catppuccin/latte/next.svg +6 -0
- package/public/icons/catppuccin/latte/npm-lock.svg +7 -0
- package/public/icons/catppuccin/latte/pdf.svg +3 -0
- package/public/icons/catppuccin/latte/python.svg +8 -0
- package/public/icons/catppuccin/latte/rust.svg +6 -0
- package/public/icons/catppuccin/latte/sass.svg +3 -0
- package/public/icons/catppuccin/latte/terraform.svg +3 -0
- package/public/icons/catppuccin/latte/toml.svg +3 -0
- package/public/icons/catppuccin/latte/typescript-react.svg +8 -0
- package/public/icons/catppuccin/latte/typescript.svg +6 -0
- package/public/icons/catppuccin/latte/yaml.svg +3 -0
- package/public/icons/catppuccin/mocha/_file.svg +3 -0
- package/public/icons/catppuccin/mocha/_folder.svg +3 -0
- package/public/icons/catppuccin/mocha/_folder_open.svg +3 -0
- package/public/icons/catppuccin/mocha/bash.svg +7 -0
- package/public/icons/catppuccin/mocha/bun-lock.svg +8 -0
- package/public/icons/catppuccin/mocha/config.svg +3 -0
- package/public/icons/catppuccin/mocha/css.svg +6 -0
- package/public/icons/catppuccin/mocha/database.svg +3 -0
- package/public/icons/catppuccin/mocha/docker.svg +3 -0
- package/public/icons/catppuccin/mocha/env.svg +3 -0
- package/public/icons/catppuccin/mocha/eslint.svg +6 -0
- package/public/icons/catppuccin/mocha/git.svg +6 -0
- package/public/icons/catppuccin/mocha/go.svg +3 -0
- package/public/icons/catppuccin/mocha/graphql.svg +3 -0
- package/public/icons/catppuccin/mocha/html.svg +6 -0
- package/public/icons/catppuccin/mocha/javascript-react.svg +8 -0
- package/public/icons/catppuccin/mocha/javascript.svg +6 -0
- package/public/icons/catppuccin/mocha/json.svg +3 -0
- package/public/icons/catppuccin/mocha/lock.svg +3 -0
- package/public/icons/catppuccin/mocha/markdown.svg +3 -0
- package/public/icons/catppuccin/mocha/ms-word.svg +6 -0
- package/public/icons/catppuccin/mocha/next.svg +6 -0
- package/public/icons/catppuccin/mocha/npm-lock.svg +7 -0
- package/public/icons/catppuccin/mocha/pdf.svg +3 -0
- package/public/icons/catppuccin/mocha/python.svg +8 -0
- package/public/icons/catppuccin/mocha/rust.svg +6 -0
- package/public/icons/catppuccin/mocha/sass.svg +3 -0
- package/public/icons/catppuccin/mocha/terraform.svg +3 -0
- package/public/icons/catppuccin/mocha/toml.svg +3 -0
- package/public/icons/catppuccin/mocha/typescript-react.svg +8 -0
- package/public/icons/catppuccin/mocha/typescript.svg +6 -0
- package/public/icons/catppuccin/mocha/yaml.svg +3 -0
- package/public/icons/icon-192.png +0 -0
- package/public/icons/icon-512.png +0 -0
- package/public/offline.html +83 -0
- package/public/provider-icons.svg +54 -0
- package/public/sw.js +183 -0
- package/public/sw.test.mjs +339 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";exports.id=2243,exports.ids=[2243],exports.modules={9915:(a,b,c)=>{c.d(b,{Q:()=>d});let d={id:"en",label:"English",messages:{"common.ok":"OK","common.language":"Language","common.models":"Models","common.skills":"Skills","common.agents":"Sub-agents","common.plugins":"Plugins","common.settings":"Settings","settings.title":"Settings","settings.general":"General","settings.generalDescription":"Choose how Pi Web looks and which language it uses.","settings.appearance":"Appearance","settings.appearanceDescription":"Select a theme or follow your system preference.","settings.chatContentWidth":"Chat content width","settings.chatContentFontSize":"Chat font size","settings.typography":"Fonts & layout","settings.uiFontFamily":"Interface font","settings.monoFontFamily":"Monospace font","settings.uiFontPlaceholder":"System default","settings.monoFontPlaceholder":"Default: Noto Sans Mono","settings.resetUiFont":"Reset interface font","settings.resetMonoFont":"Reset monospace font","settings.fontDescription":"Names of fonts installed on this device, comma-separated; leave blank for the default. The monospace font is used for code and the terminal. Saved in this browser only.","settings.uiFontWeight":"Interface font weight","settings.monoFontWeight":"Monospace font weight","settings.fontWeightThin":"Thin","settings.fontWeightExtraLight":"Extra Light","settings.fontWeightLight":"Light","settings.fontWeightRegular":"Regular","settings.fontWeightMedium":"Medium","settings.fontWeightSemiBold":"Semi Bold","settings.resetChatContentWidth":"Reset chat content width","settings.resetChatContentFontSize":"Reset chat font size","settings.chatContentWidthDescription":"Set the maximum width of messages and the composer.","settings.themeLight":"Light","settings.themeDark":"Dark","settings.themeMist":"Mist","settings.themeRose":"Rose","settings.themePine":"Pine","settings.themeSand":"Sand","settings.themeLilac":"Lilac","settings.themeSlate":"Slate","settings.themeDusk":"Dusk","settings.themeEmber":"Ember","settings.themeContrastLight":"High contrast light","settings.themeContrastDark":"High contrast dark","settings.themeZenburn":"Zenburn","settings.themeSystem":"System","settings.thinkingDisplay":"Thinking display","settings.thinkingDisplayDescription":"Choose whether model reasoning blocks are expanded when messages load.","settings.thinkingExpandedDefault":"Expand thinking blocks by default","settings.chat":"Chat","settings.enterSendMode":"Send key","settings.enterSendModeEnter":"Enter","settings.enterSendModeCtrlEnter":"Ctrl/Cmd+Enter","settings.quoteSelection":"Show actions for selected text","settings.sidebar":"Sidebar","settings.filesPlacement":"Sidebar layout","settings.filesPlacementClassic":"Classic","settings.filesPlacementBelow":"Below sessions","settings.filesPlacementTab":"Separate tab","settings.filesPlacementDescription":"Classic is the single-project shell. Phones always use tabs.","settings.languageDescription":"Choose the language used throughout the interface.","settings.shellTool":"Shell tool","settings.shellToolDescription":"Choose which shell the model uses for commands. Direct ! and !! commands still use Bash.","settings.pushPermission":"Background push (iOS home-screen app)","settings.pushPermissionDescription":"After adding this site to your home screen (iOS 16.4+), a system notification is shown on the lock screen when a session finishes while no window is visible. If notifications stop arriving, re-register here. Registration needs a user gesture, so it is never triggered automatically.","settings.pushRegister":"Register push","settings.pushRegisterLoading":"Registering…","settings.pushRegistered":"✅ Push registered — background notifications are ready.","settings.pushRegisterFailed":"❌ Registration failed:","settings.usePowerShell":"Use PowerShell instead of Bash","settings.projectRequired":"Open a project to configure this section","settings.mcp":"MCP","auth.prompt":"Sign in to continue","auth.password":"Password","auth.logIn":"Log in","auth.loggingIn":"Logging in...","auth.invalidPassword":"Incorrect password","auth.loginFailed":"Could not log in. Try again.","auth.tooManyAttempts":"Too many failed attempts. Try again in {seconds}s.","auth.logOut":"Log out","auth.loggingOut":"Logging out...","auth.logoutFailed":"Could not log out. Try again.","skills.scope.global":"global","skills.scope.project":"project","skills.scope.path":"path","skills.groupSwitchOff":"Show every skill in {group} in the model prompt","skills.groupSwitchOn":"Hide every skill in {group} from the model prompt. They stay manually invocable.","skills.bulkFailed":"Could not change {count} of {total} skills:","skills.instructions":"Instructions","skills.noInstructions":"This skill has no instructions.","skills.documentBack":"Back","plugins.groupSwitchOff":"Enable every {group} package","plugins.groupSwitchOn":"Disable every {group} package. A package with resource filters stays on, since disabling it removes them; use its own switch.","plugins.bulkKeptFiltered":"{count} filtered package(s) stayed on: disabling one removes its resource filters, so use its own switch.","plugins.bulkEnabled":"Packages enabled.","plugins.bulkDisabled":"Packages disabled.","plugins.bulkFailed":"Could not change {count} of {total} packages:","plugins.status.loaded":"loaded","plugins.status.installed":"installed","plugins.status.missing":"missing","plugins.status.disabled":"disabled","plugins.diagnostic":"1 diagnostic","plugins.diagnostics":"{count} diagnostics","config.source":"Source","config.examples":"Examples","config.name":"Name","config.saveTo":"Save to","agents.close":"Close","agents.builtInTitle":"Enable Pi Web built-in sub-agents","agents.builtInDescription":"Provides Pi Web's integrated Agent tools and disables a conflicting pi-subagents extension.","agents.reloadRequired":"Reload the current session to apply this change.","agents.reloadSession":"Reload session","agents.maxConcurrent":"Concurrent sub-agents","agents.maxConcurrentDescription":"Maximum prompts running at once per parent session.","agents.reloading":"Reloading...","agents.loading":"Loading sub-agents...","agents.new":"New sub-agent","agents.empty":"Select or create a sub-agent profile","agents.name":"Sub-agent ID","agents.displayName":"Display name","agents.description":"Description","agents.prompt":"System instructions","agents.tools":"Tools","agents.resources":"Resources","agents.loadSkills":"Load skills","agents.loadExtensions":"Load extensions","agents.mcp":"Connect MCP servers","agents.codemode":"Code mode","agents.codemode.inherit":"Follow parent session","agents.codemode.on":"Enabled","agents.codemode.off":"Disabled","agents.codemodeHint":'"Follow parent session" matches the code mode the parent session is currently using. Tool permissions inside code mode still come from this profile\'s tool list. Changes apply to subagents started afterwards.',"agents.skillsOnly":"Loads only these skills: {skills}","agents.skillsNone":"Loads no skills: the skills list in the profile file is empty","agents.extensionsOnly":"Loads only these extensions: {extensions}","agents.extensionsNone":"Loads no extensions: the extensions list in the profile file is empty","agents.mcpHint":"Subagents connect the MCP servers in mcp.json. With read-only tools, only MCP tools their server marks read-only run. Changes apply to subagents started afterwards.","agents.mcpChatOnly":"MCP needs at least one tool, skills, or extensions: a chat-only subagent cannot use it.","agents.model":"Model override","agents.modelsLoading":"Loading models...","agents.modelUnavailable":"{model} (unavailable)","agents.thinking":"Thinking","agents.maxTurns":"Max turns","agents.inherit":"Parent default","agents.enable":"Enable sub-agent","agents.disable":"Disable sub-agent","agents.builtinPath":"Built-in profile","agents.inheritContext":"Inherit parent context","agents.background":"Run in background by default","agents.duplicate":"Duplicate","agents.copyName":"{name} copy","agents.delete":"Delete","agents.deleteConfirm":"Delete {name}?","agents.save":"Save","agents.saving":"Saving...","agents.scope.builtin":"built-in","agents.scope.global":"global","agents.scope.workspace":"workspace","agents.scope.project":"project","agents.overridden":"Overridden","subagent.openTab":"View sub-agent work in side panel","subagent.closeTab":"Close sub-agent side panel","subagent.tabLabel":"Sub-agent {name}","subagent.refresh":"Refresh","subagent.viewer.starting":"Sub-agent session is starting…","subagent.viewer.empty":"No messages yet","subagent.viewer.error":"Failed to load sub-agent session","codemode.calls":"Tool calls","codemode.callCount":"{count} calls","codemode.callCountOne":"1 call","codemode.showEarlierCalls":"Show {count} earlier calls","codemode.omittedCalls":"{count} earlier calls not shown","codemode.modelCost":"Model calls: {cost}","codemode.status.running":"Running","codemode.status.ok":"Succeeded","codemode.status.error":"Failed","codemode.status.cancelled":"Cancelled","agentSwitcher.title":"Agents","agentSwitcher.main":"Main agent","agentSwitcher.subagent":"Sub-agent","agentSwitcher.current":"Current","agentSwitcher.count":"{count} sub-agents","agentSwitcher.runningCount":"{count} running","agentSwitcher.tokens":"{count} tokens","agentSwitcher.totalUsage":"Total","agentSwitcher.totalUsageHint":"Main agent and all sub-agents","agentSwitcher.search":"Search agents","agentSwitcher.noMatches":"No matching agents","agentSwitcher.status.starting":"Starting","agentSwitcher.status.running":"Running","agentSwitcher.status.completed":"Completed","agentSwitcher.status.failed":"Failed","agentSwitcher.status.aborted":"Aborted","agentSwitcher.status.interrupted":"Interrupted","appUpdate.releaseNotes":"Pi Web v{version} is available. View release notes","sidebar.hide":"Hide sidebar","sidebar.show":"Show sidebar","theme.light":"Theme: Light","theme.dark":"Theme: Dark","theme.mist":"Theme: Mist","theme.rose":"Theme: Rose","theme.pine":"Theme: Pine","theme.auto":"Theme: System","history.full":"Full history","history.unsaved":"Full history is available after the session is saved","history.label":"Full history","title.generating":"Generating...","title.updated":"Title updated","title.failed":"Generation failed","title.generate":"Generate title","title.unsaved":"Title generation is available after the session is saved","title.noMessages":"Send a message before naming this session","title.generateSession":"Generate a session title","system.prompt":"System prompt","system.empty":"System prompt is empty (tools are disabled)","system.load":"System prompt has not loaded yet","system.loading":"Loading system prompt…","system.label":"System","tools.label":"Tools","tools.title":"Tool definitions","tools.details":"Tool definition details","tools.load":"Tool definitions have not loaded yet","tools.loading":"Loading tool definitions…","tools.noTools":"No active tools","tools.description":"Description","tools.parameters":"Parameters","tools.parameterCount":"{count} parameters","tools.noParameters":"No parameters","tools.required":"Required","tools.optional":"Optional","tools.allowedValues":"Allowed","tools.defaultValue":"Default","tools.guidelines":"Prompt guidelines","session.info":"Session info","session.name":"Name","session.file":"Session File","session.inMemory":"In-memory","session.id":"ID","session.user":"User","session.assistant":"Assistant","session.toolCalls":"Tool Calls","session.toolResults":"Tool Results","session.total":"Total","session.input":"Input","session.output":"Output","session.cacheRead":"Cache Read","session.cacheWrite":"Cache Write","session.cost":"Cost","session.context":"Context","session.cacheHitRate":"Avg cache hit rate","session.copy":"Copy {value}","session.copied":"Copied","session.title":"Session info","session.load":"Send a message or run /session to load session info","session.infoSection":"Session Info","session.projectSection":"Project Info","session.messages":"Messages","session.tokens":"Tokens","session.totalActive":"Active Time","session.copyFile":"Copy file path","session.copyId":"Copy session ID","session.projectDir":"Project Dir","session.gitBranch":"Git Branch","session.gitWorktree":"Worktree","session.copyProjectDir":"Copy project directory","session.copyGitBranch":"Copy git branch","session.copyGitWorktree":"Copy worktree path","workspace.opening":"Opening workspace...","workspace.unable":"Unable to open workspace","workspace.selectSession":"Select a session from the sidebar","workspace.getStarted":"Get Started","workspace.selectProject":"Select a project directory from the sidebar","workspace.addModels":"Open Settings at the bottom, then choose Models","workspace.stepProject":"Select a project directory from the sidebar","workspace.stepModels":"Open Settings at the bottom, then choose Models","workspace.newSessionContext":"New session location","workspace.project":"Project","files.hidePanel":"Hide file panel","files.expandPanel":"Expand file panel","files.restorePanelWidth":"Restore file panel width","files.showPanel":"Show file panel","files.noneOpen":"No file open","layout.resizeSidebar":"Resize sidebar","layout.resizeFilePanel":"Resize file panel","layout.resizeSidebarSections":"Resize sidebar sections","layout.resizeHeightHint":"Drag to resize.","layout.resizeHint":"Drag to resize. Double-click or press Enter to reset.","sidebar.new":"New","sidebar.newSessionTitle":"New session in {path}","sidebar.refresh":"Refresh","sidebar.selectProject":"Select project…","sidebar.filterProjects":"Filter projects…","sidebar.noMatchingProjects":"No matching projects","sidebar.useDefaultDirectory":"Use default directory","sidebar.customPath":"Custom path…","directoryPicker.selectDirectory":"Select directory","directoryPicker.goToParent":"Go to parent directory","directoryPicker.directoryPath":"Directory path","directoryPicker.goToDirectory":"Go to directory","directoryPicker.go":"Go","directoryPicker.loadingDirectories":"Loading directories…","directoryPicker.noSubdirectories":"No subdirectories","directoryPicker.openBeforeSelecting":"Open this path before selecting it","directoryPicker.selectCurrentDirectory":"Select current directory","directoryPicker.selectThisFolder":"Select this folder","directoryPicker.noDrives":"No drives found","directoryPicker.newDirectory":"New directory","directoryPicker.createDirectory":"Create directory","directoryPicker.directoryName":"Directory name","directoryPicker.directoryNamePlaceholder":"Enter a directory name","directoryPicker.create":"Create","directoryPicker.creating":"Creating…","sidebar.checking":"Checking…","sidebar.open":"Open","sidebar.cancel":"Cancel","sidebar.openRepoRoot":"Open repo root","sidebar.openRepoRootTitle":"Open the repository root to manage worktrees.","sidebar.worktrees":"Worktrees...","sidebar.checkingWorktrees":"Checking worktrees for this directory.","sidebar.filterWorktrees":"Filter worktrees…","sidebar.noMatchingWorktrees":"No matching worktrees","sidebar.switchWorktree":"Switch worktree","sidebar.main":"main","sidebar.forceRemoveCheckout":"Has changes or submodules. Force remove checkout?","sidebar.force":"Force","sidebar.createWorktreeTitle":"Create a worktree checkout for a branch","sidebar.newWorktree":"New worktree…","sidebar.branchName":"branch name","sidebar.creating":"Creating…","sidebar.create":"Create","sidebar.uploadFilesTitle":"Upload files to project root","sidebar.uploadFiles":"Upload files","sidebar.refreshExplorer":"Refresh file list","sidebar.showIgnoredFiles":"Show ignored files","sidebar.openInExplorer":"Open in Explorer","sidebar.openInFinder":"Open in Finder","sidebar.openInFileManager":"Open in file manager","sidebar.openInExplorerRemoteOnly":"Only available when Pi Web runs on this computer","sidebar.openInExplorerUnsupported":"Not supported on this platform","sidebar.searchFiles":"Search files","sidebar.searchFilesPlaceholder":"Search files…","sidebar.searchingFiles":"Searching…","sidebar.noMatchingFiles":"No matching files","sidebar.clearSearch":"Clear search","sidebar.searchSessions":"Search all conversations...","sidebar.toggleSessionSearch":"Search conversations","sidebar.sessionSearching":"Searching...","sidebar.sessionSearchEmpty":"No matching conversations","sidebar.sessionSearchCount":"{count} matching conversations","sidebar.sessionSearchPartial":"Search limit reached. Results may be incomplete.","sidebar.sessionSearchFailed":"Could not search conversations","sidebar.changedFiles":"{count} changed files","sidebar.loading":"Loading...","sidebar.noSessions":"No sessions found","sidebar.agentRunning":"Agent running…","sidebar.agentAwaitingInput":"Agent waiting for your input","sidebar.newActivity":"New activity","sidebar.newSessionActivity":"New session activity","sidebar.deleteSession":"Delete {title}?","sidebar.rename":"Rename","sidebar.delete":"Delete","sidebar.messagesCount":"{count} msgs","sidebar.worktreePath":"Worktree: {path}","sidebar.removeWorktreeTitle":"Remove worktree checkout {path}; the branch is kept","sidebar.removeWorktreeHeading":"Remove {name}","sidebar.brandLabel":"Pi Web, versions: web {app}, pi {pi}","sidebar.tabsLabel":"Sidebar view","sidebar.tabSessions":"Sessions","sidebar.tabFiles":"Files","sidebar.resizeFiles":"Resize file browser","sidebar.resizeFilesHint":"Drag to resize. Double-click or press Enter to reset.","sidebar.fileActions":"File actions","sidebar.explorer":"Files","sidebar.collapseOtherGroups":"Collapse other projects","sidebar.expandAllGroups":"Expand all projects","sidebar.collapseAllGroups":"Collapse all projects","sidebar.pinned":"Pinned","sidebar.pinnedProject":"Pinned","sidebar.pin":"Pin","sidebar.unpin":"Unpin","sidebar.pinProject":"Pin project","sidebar.unpinProject":"Unpin project","sidebar.renameProject":"Rename…","sidebar.resetProjectName":"Reset name","sidebar.projectName":"Project name","sidebar.moveProjectUp":"Move up","sidebar.moveProjectDown":"Move down","sidebar.archive":"Archive","sidebar.unarchive":"Unarchive","sidebar.restore":"Restore","sidebar.archived":"Archived","sidebar.archivedCount":"Archived \xb7 {count}","sidebar.archivedToast":"Archived “{title}”","sidebar.archivedManyToast":"Archived {count} sessions","sidebar.restoredToast":"Restored “{title}”","sidebar.restoredManyToast":"Restored {count} sessions","sidebar.undo":"Undo","sidebar.viewArchive":"View","sidebar.dismiss":"Dismiss","sidebar.markRead":"Mark as read","sidebar.markUnread":"Mark as unread","sidebar.moreActions":"More actions","sidebar.sessionActions":"Session actions","sidebar.showMore":"Show more \xb7 {count}","sidebar.showLess":"Show less","sidebar.openOtherProject":"Open another project…","sidebar.newSessionInProject":"New session in {name}","sidebar.projectActions":"{name} actions","sidebar.archiveOlderThanWeek":"Archive sessions older than 7 days \xb7 {count}","sidebar.openInFilesTab":"Open in Files","sidebar.viewArchived":"View archived \xb7 {count}","sidebar.archiveActions":"Archive actions","sidebar.archivedProjectActions":"Archived sessions of {name}","sidebar.restoreAllArchived":"Restore all \xb7 {count}","sidebar.deleteAllArchived":"Delete all… \xb7 {count}","sidebar.deleteOldArchived":"Delete archived over 30 days ago… \xb7 {count}","sidebar.noLiveSessions":"No sessions yet","sidebar.noArchived":"No archived sessions","sidebar.backToSessions":"Back","sidebar.cannotArchiveRunning":"Running","sidebar.newWorktreeForSession":"New worktree for a new session","sidebar.projectAndWorktree":"Project and worktree","sidebar.uiStateFailed":"Couldn’t save: {error}","sidebar.sessionNotFound":"This session no longer exists","sidebar.fork":"Fork","sidebar.openInNewTab":"Open in new tab","sidebar.forkedToast":"Forked “{title}”","sidebar.forkNotFound":"This session no longer exists","sidebar.forkUnsaved":"This session hasn’t been saved yet. Send a message first.","sidebar.forkEmpty":"Nothing to fork: this branch has no messages yet","sidebar.forkUnavailable":"This session can’t be forked","sidebar.forkFailed":"Couldn’t fork: {error}","sidebar.deleteProjectSessions":"Delete all sessions… \xb7 {count}","sidebar.deleteProjectSessionsHeading":"Delete all sessions in {name}","sidebar.deleteProjectSessionsMessage":"Pinned and archived sessions go too. This can’t be undone.","sidebar.deleteProjectSessionsRunning":"Sessions running now are kept ({count}).","sidebar.deleteArchivedInProjectHeading":"Delete archived sessions in {name}","sidebar.deleteAllArchivedHeading":"Delete all archived sessions","sidebar.deleteOldArchivedHeading":"Delete sessions archived over 30 days ago","sidebar.deleteArchivedMessage":"Their subagent sessions go too. This can’t be undone.","sidebar.deleteCount":"Delete {count}","sidebar.deletingSessions":"Deleting sessions…","sidebar.deletedOneToast":"Deleted 1 session","sidebar.deletedManyToast":"Deleted {count} sessions","sidebar.keptRunningToast":"kept {count} running","sidebar.deleteFailed":"Couldn’t delete: {error}","files.modified":"Modified","files.added":"Added","files.deleted":"Deleted","files.renamed":"Renamed","files.untracked":"Untracked","files.conflict":"Conflict","files.newlyUploaded":"Newly uploaded","files.containsChangedFiles":"Contains changed files","files.hiddenIgnored":"Ignored by Git","files.hiddenExcluded":"Hidden by default (generated or dependency folder)","files.insertPath":"Insert path into chat","files.mention":"mention","files.download":"Download file","files.outsideLink":"Links to {target}, outside this project","files.outsideLinkEncloses":"That folder contains this project or your home folder.","files.allowOutsideLink":"Allow browsing","files.allowOutsideLinkTitle":"Browse {target} until Pi Web restarts, the same as selecting it as a project directory","files.allowEnclosingLinkConfirm":"{target} contains this project or your home folder. Allowing it lets Pi Web browse everything below it until it restarts. Continue?","files.dismissError":"Dismiss error","files.addUploadedFile":"Add uploaded file to chat","files.addAllUploadedFiles":"Add all uploaded files to chat","files.dismissUploadResults":"Dismiss upload results","files.loading":"Loading files...","files.noFiles":"No files found","files.changedCount":"{count} files","files.changeStats":"{count} changed files, {additions} lines added, {deletions} lines deleted","files.conflictSummary":"{count} file{countSuffix} already exist: {files}","files.cannotReplace":"Cannot replace: {files}","files.replace":"Replace","files.skipExisting":"Skip existing","files.cancel":"Cancel","files.checking":"Checking files","files.uploading":"Uploading, {progress}%","files.dropToUpload":"Release to upload to {directory}","chat.loadingSession":"Loading session...","chat.runningTool":"Running tool...","chat.generatingToolInput":"Generating parameters...","chat.truncatedByOutputLimit":"This response was cut off after reaching the model’s output limit. Send a follow-up to continue.","chat.truncatedWithoutAnswer":"The output limit was reached before an answer was produced: thinking or a nearly full context used it up. Sending another message will likely be cut off again. Compact the context first, or lower the thinking level.","chat.runningNamedTool":"Running {name}...","chat.runningTools":"Running {names}...","chat.runningToolsMore":"Running {names} (+{count})...","chat.waitingModel":"Waiting for model...","chat.runningCommand":"Running command...","chat.thinking":"Thinking...","chat.processDetails":"Process details","chat.message":"message","chat.messages":"messages","chat.toolCall":"tool call","chat.toolCalls":"tool calls","chat.turnDuration":"took {time}","chat.collapseProcess":"Collapse process details","chat.expandProcess":"Expand process details","transcriptNotice.costSuffix":" (~{cost})","transcriptNotice.cacheMiss":"Cache miss: {tokens} tokens re-billed{cost}","transcriptNotice.cacheMissIdle":"Cache miss after {minutes}m idle: {tokens} tokens re-billed{cost}","transcriptNotice.cacheMissModelSwitch":"Cache miss after model switch: {tokens} tokens re-billed{cost}","transcriptNotice.cacheWarmed":"Cache warmed{note}: {cost}","transcriptNotice.cacheWarmedNote":" ({note})","transcriptNotice.compactionCost":"Compaction: {tokens} tokens billed{cost}","transcriptNotice.branchSummaryCost":"Branch summary: {tokens} tokens billed{cost}","transcriptNotice.thinkingDroppedOne":"Anthropic dropped 1 thinking block (details in session)","transcriptNotice.thinkingDropped":"Anthropic dropped {count} thinking blocks (details in session)","transcriptNotice.foldCacheMiss":"cache miss {tokens} tokens{cost}","transcriptNotice.foldCacheMisses":"{count} cache misses {tokens} tokens{cost}","settings.cacheMissNotices":"Show cache and cost notices","settings.cacheMissNoticesDescription":"pi's showCacheMissNotices: cache misses, cache warming, compaction cost and Anthropic dropping thinking blocks, in the chat. Saved to the global settings.json; a project's .pi/settings.json can override it.","chat.filesWritten":"Files changed","chat.openWrittenFile":"Open {name}","chat.loadEarlier":"Scroll up to load earlier messages","chat.scrollToLatest":"Scroll to latest","chat.extensionRequest":"extension request","chat.extensionExpiresIn":"expires in {seconds}s","chat.extensionPending":"Awaiting response","chat.extensionCollapse":"Collapse","chat.extensionExpand":"Expand","chat.extensionMaximize":"Maximize","chat.extensionRestoreSize":"Restore size","chat.extensionMoreWaiting":"+{count} more","chat.cancel":"Cancel","chat.confirm":"Confirm","chat.submit":"Submit","chat.extensionInput":"Extension terminal input","chat.extensionPanel":"Extension panel","chat.extensionWidgets":"Extension widgets","chat.extensionWidgetAbove":"Above editor widget","chat.extensionWidgetBelow":"Below editor widget","chat.extensionWidgetLine":"{count} line","chat.extensionWidgetLines":"{count} lines","chat.close":"Close","chat.queued":"Queued \xb7 {count}","chat.recall":"Recall to input","chat.recallTitle":"Remove all queued messages and put them back into the input box for editing","chat.retrying":"Retrying ({attempt}/{max})…","chat.loadingCommands":"Loading commands...","chat.slashCommands":"Slash commands \xb7 {label}","chat.tabEnter":"Tab / Enter","chat.noCommands":"No extension, prompt, or skill commands found","chat.match":"1 match","chat.matches":"{count} matches","chat.command":"1 command","chat.commands":"{count} commands","chat.loadingFiles":"Loading files...","chat.files":"Files \xb7 {label}{hint}","chat.searching":"Searching…","chat.noMatchingFiles":"No matching files","chat.searchingAll":" \xb7 searching all files…","chat.indexTruncated":" \xb7 index truncated","chat.steerPlaceholder":"Steer now / queue follow-up...","chat.agentPlaceholder":"Agent is running…","chat.messagePlaceholder":"Message… Type / for commands, @ for files","chat.steer":"Steer","chat.followUp":"Follow-up","chat.steerHint":"Deliver after the current response and its tool calls finish (Stop interrupts them)","chat.followUpHint":"Queue this message after the agent finishes","chat.inputHistory":"Input history","chat.modelError":"Model error","chat.modelScopeWarning":"Model scope warning","chat.modelScopeWarnings":"Model scope warnings","chat.send":"Send","chat.askSelection":"Ask about selected text","chat.askInCurrent":"Ask here","chat.askInNewChat":"Ask in new chat","chat.newQuoteChat":"New chat about selected text","chat.quoteIntro":"About this passage:","chat.quoteQuestion":"My question:","chat.quoteForkFailed":"Unable to create a branch from this message.","chat.attachFiles":"Attach files","chat.previewImage":"Preview image","chat.filterModels":"Filter models…","chat.noMatchingModels":"No matching models","chat.saveDefaultModel":"Use and save as default for new chats","chat.defaultModel":"Default model for new chats","chat.saveDefaultThinking":"Use and save as default reasoning level","chat.defaultThinking":"Default reasoning level for new chats","chat.moreControls":"More controls","chat.collapseControls":"Collapse controls","chat.shell":"Shell","terminal.title":"Terminal","terminal.tabLabel":"Terminal: {name}","terminal.open":"Open workspace terminal","terminal.close":"Terminate terminal","terminal.restart":"Restart terminal","terminal.reconnect":"Reconnect terminal","terminal.lightTheme":"Switch terminal to light theme","terminal.darkTheme":"Switch terminal to dark theme","terminal.extraKeys":"Terminal keys","terminal.connecting":"Connecting","terminal.ready":"Connected","terminal.exited":"Terminal closed","terminal.error":"Connection error","terminal.exitCode":"Process exited with code {code}","chat.outputLocal":"output stays local","chat.outputModel":"output sent to model","chat.configuredTools":"From settings.json defaultTools","chat.chatOnly":"Chat only","chat.readOnlyTools":"{count} read-only built-in tools","chat.builtInTools":"{count} built-in tools","chat.allBuiltInTools":"All built-in tools","chat.changeReasoning":"Change reasoning level: {level}","chat.changeReasoningLabel":"Change reasoning level","chat.currentReasoning":"Reasoning level for this turn: {level}","chat.changeToolPreset":"Change tool preset","chat.stopCompaction":"Stop compaction","chat.compactContext":"Compact context","chat.compacting":"Compacting…","chat.compact":"Compact","chat.dismissCompactError":"Dismiss compaction error","chat.stopAgent":"Stop agent","chat.stop":"Stop","chat.disableSound":"Disable completion sound","chat.enableSound":"Enable completion sound","chat.thinkingUseDefault":"Use pi default","chat.thinkingOff":"Reasoning off","chat.thinkingMinimal":"Minimal reasoning","chat.thinkingLow":"Low reasoning","chat.thinkingMedium":"Medium reasoning","chat.thinkingHigh":"High reasoning","chat.thinkingXhigh":"Extra-high reasoning","chat.thinkingMax":"Max reasoning","chat.builtIn":"Built-in","chat.extensions":"Extensions","chat.prompts":"Prompts","chat.skills":"Skills","chat.dormant":"dormant","chat.commandCompact":"Compress context, optionally with instructions","chat.commandAutoCompact":"Toggle automatic context compaction in settings","chat.commandReload":"Reload extensions, skills, prompts, and tools","chat.commandName":"Set the session display name","chat.commandSession":"Show session message, token, and cost stats","chat.commandCopy":"Copy the last assistant message","chat.commandClone":"Clone the current branch into a new session","chat.compacted":"Compacted","chat.imageNotSupportedTitle":"Images may not be sent","chat.imageNotSupportedBody":"The selected model ({model}) does not support image input. The attached images will likely be ignored.","chat.dropNeedsCwd":"Choose a working directory before adding files.","chat.dropUploaded":"Copied {count} file(s) into the working directory","chat.dropAlreadyExists":"Already in the working directory and not replaced; the mention points to the existing file: {names}","chat.dropFoldersUnsupported":"Folders cannot be dropped here; drop the files inside instead: {names}","chat.dropFailed":"Upload failed: {message}","chat.tokensSaved":"{saved} saved","chatMinimap.earlierTurns":"Earlier turns not loaded: {count}. Click to load","chatMinimap.locateAssistant":"Locate assistant message","chatMinimap.toolCalls":"Tool calls this turn: {count}","chatMinimap.lockPreview":"Lock: don't open the preview on hover","chatMinimap.unlockPreview":"Unlock the hover preview","i18n.close":"Close","i18n.copy":"Copy","i18n.copied":"Copied","i18n.cancel":"Cancel","i18n.save":"Save","i18n.saving":"Saving…","i18n.saved":"Saved","i18n.remove":"Remove","i18n.removing":"Removing…","i18n.delete":"Delete","i18n.loading":"Loading...","i18n.loadMore":"Load more","i18n.search":"Search","i18n.refresh":"Refresh","providerUsage.usage":"Usage","providerUsage.notQueried":"Not queried","providerUsage.refresh":"Refresh usage","providerUsage.refreshing":"Refreshing usage","providerUsage.updated":"Updated {time}","providerUsage.queryFailed":"Usage query failed.","providerUsage.available":"Available","i18n.update":"Update","i18n.updating":"Updating...","i18n.check":"Check","i18n.checking":"Checking...","i18n.install":"Install","i18n.installing":"Installing...","i18n.noResults":"No results","i18n.searchProviders":"Search providers…","i18n.noProviders":"No providers match","i18n.newModel":"new model","i18n.addProvider":"Add provider","i18n.selectProviderModel":"Select a provider or model","i18n.visibleInPrompt":"Visible in model prompt — click to disable","i18n.hiddenFromPrompt":"Hidden from model prompt — click to enable","i18n.dormant":"Dormant","i18n.hiddenButInvocable":"Hidden from model, still manually invocable","i18n.skillSearchPlaceholder":"e.g. react, testing, deploy","i18n.searching":"Searching…","i18n.noSkills":"No skills found","i18n.checkUpdates":"Check updates","i18n.updates":"updates","i18n.noResolvedResources":"No resolved resources","i18n.enablePackage":"Enable package","i18n.disablePackage":"Disable package","i18n.filtered":"filtered","i18n.openSessionToReload":"Open a session to reload","i18n.notFound":"Not found","i18n.noPlugins":"No plugins configured","trust.resourcesNotLoaded":"Restricted mode","trust.trustProject":"Trust project","trust.trusting":"Trusting...","trust.cancel":"Cancel","trust.dialogTitle":"Trust this project?","trust.dialogBody":"Project resources can run local code. Trust only projects whose contents you know.","trust.skillsNotLoaded":"Project skills are not loaded because this project is not trusted.","trust.pluginsNotLoaded":"Project plugins are not loaded because this project is not trusted.","trust.projectScopeUnavailable":"Project installs are unavailable while project resources are not loaded.","trust.mcp.title":"MCP servers in .pi/mcp.json","trust.mcp.intro":"Trusting this project lets these servers connect, in Pi Web and in the pi CLI, which share this decision. A stdio server runs its command on the computer running Pi Web.","trust.mcp.loading":"Reading .pi/mcp.json…","trust.mcp.loadFailed":"Could not list this project's MCP servers.","trust.mcp.timedOut":"Listing this project's MCP servers took too long.","trust.mcp.none":"The file declares no servers.","trust.mcp.unchecked":"Pi Web cannot load the SDK's MCP checks, so these entries are listed unchecked.","trust.mcp.cwd":"Working directory: {path}","trust.close":"Close","trust.alreadyTrusted":"This project is already trusted.","trust.trustFailed":"Could not trust this project.","mcp.transport.stdio":"stdio","mcp.transport.http":"HTTP","mcp.field.env":"env {name}","mcp.field.header":"header {name}","mcp.field.oauthClientSecret":"oauth.clientSecret","mcp.server.invalid":"Pi refuses this entry, so it never connects:","mcp.server.webPassword":"References PI_WEB_PASSWORD. Pi Web refuses to connect it, but the pi CLI reads this file too and would send the password on if that variable is set where the CLI runs:","mcp.server.disabled":"Turned off in the file, so it does not connect.","mcp.server.commandFields":"Runs a shell command on every connection:","mcp.server.replacesGlobal":"Replaces your global server of the same name while this project is trusted.","mcp.server.overridesGlobal":"Changes only {keys} of your global server of the same name while this project is trusted.","mcp.server.overridesGlobalNothing":"Names your global server of the same name, but changes none of enabled, exposure and toolExposure.","mcp.server.masked":"Parts that look like secrets are hidden.","mcp.server.hiddenCharacters":"Holds invisible or control characters, shown here as \\u{…} codes.","mcp.server.sendsVariables":"Sends environment variables of the computer running Pi Web to this server on every connection:","mcp.server.passesVariables":"Passes environment variables of the computer running Pi Web to the command it starts:","mcp.server.variableIn":"{variable} in {field}","mcp.fileProblem.unparsable":"The file is not valid JSON, so none of its servers load.","mcp.fileProblem.invalid-shape":'The file is not an object with an "mcpServers" object, so none of its servers load.',"mcp.fileProblem.auto-enable-codemode-invalid":'"autoEnableCodemode" must be true or false; the servers still load.',"mcp.fileProblem.link-dangling":"The file is a symbolic link to nothing, so no servers load from it.","mcp.fileProblem.link-outside":"The file is a symbolic link outside the folders Pi Web may read, so its servers are not listed here. Pi still loads them once the project is trusted.","mcp.fileProblem.not-a-file":"The path is not a regular file, so Pi Web does not read it.","mcp.fileProblem.too-large":"The file is larger than 1 MiB, so its servers are not listed here. Pi still loads them once the project is trusted.","mcp.fileProblem.too-many-servers":"The file declares more than 200 servers, so they are not listed here. Pi still loads them once the project is trusted.","mcp.fileProblem.unreadable":"Pi Web cannot read the file.","mcp.reason.cwd-invalid":"The project folder is missing or not an absolute path.","mcp.reason.cwd-denied":"Pi Web may not read this folder.","mcp.reason.cwd-not-directory":"The project folder no longer exists or is not a folder.","mcp.reason.request-denied":"Pi Web refused the request because it did not come from this page.","mcp.reason.content-type":"Pi Web refused the request because it was not sent as JSON.","mcp.reason.trust-unreadable":"Pi Web cannot read the trust store (trust.json), or another program has it locked.","mcp.reason.trust-not-required":"This project has no resources that need trust anymore.","mcp.reason.session-busy":"Wait for the running session in this folder to finish, then trust the project.","mcp.reason.invalid-request":"Pi Web refused the request because it does not ask for a change Pi Web can make.","mcp.reason.mcp-off":"MCP is off on this Pi Web server, so it changes no server.","mcp.reason.project-untrusted":"This project is not trusted, so Pi Web does not change its .pi/mcp.json.","mcp.reason.unparsable":"The file is not valid JSON, so Pi Web left it unchanged.","mcp.reason.invalid-shape":'The file is not an object with an "mcpServers" object, so Pi Web left it unchanged.',"mcp.reason.server-missing":"The file no longer defines this server.","mcp.reason.entry-not-object":"This entry is not an object, so it cannot be turned on or off. Remove it, or fix it in the file.","mcp.reason.web-password":"It references PI_WEB_PASSWORD, so Pi Web does not turn it on.","mcp.reason.undo-unavailable":"The removal can no longer be undone.","mcp.reason.undo-name-taken":"The file defines a server of the same name again, so the removal was not undone.","mcp.reason.name-taken":"The file already defines a server of that name.","mcp.reason.link-dangling":"The file is a symbolic link to nothing, so Pi Web does not write it.","mcp.reason.link-outside":"The file is a symbolic link outside the folders Pi Web may read, so Pi Web does not write it.","mcp.reason.not-a-file":"The path is not a regular file, so Pi Web does not write it.","mcp.reason.too-large":"The file is larger than 1 MiB, so Pi Web does not write it.","mcp.reason.too-many-servers":"The file declares more than 200 servers, so Pi Web does not act on its entries.","mcp.reason.locked":"Another program is writing the file. Try again in a moment.","mcp.reason.server-invalid":"Pi refuses this entry, so Pi Web does not connect it.","mcp.reason.sign-in-not-oauth":"This server does not sign in with OAuth: only an HTTP server without an Authorization header does.","mcp.reason.sign-in-unknown":"Pi Web no longer knows this sign-in: it ended a while ago, or Pi Web restarted.","mcp.reason.sign-in-not-waiting":"The sign-in is not waiting for an address right now.","mcp.reason.redirect-invalid":"That is not a web address. Copy the whole address from the browser's address bar.","mcp.reason.redirect-state-mismatch":"That address belongs to another sign-in. Paste the address the browser landed on after this one.","mcp.reason.redirect-no-code":"That address holds no authorization code. Paste the address the browser landed on after you approved access.","mcp.reason.redirect-denied":"The authorization server did not grant access. Open the sign-in page again, or cancel.","mcp.reason.import-failed":"No server could be read from the paste.","mcp.reason.fields-incomplete":"Some values to fill in are missing or not valid.","mcp.reason.name-invalid":"A server name uses letters, digits, _ and - only.","mcp.reason.secret-global-only":"The server holds a secret as plain text, so it is saved only in the global mcp.json.","mcp.reason.host-env-confirm":"The server would be sent variables of the computer running Pi Web; confirm that first.","mcp.reason.folder-not-fresh":"The folder changed since: it has a trust decision now, or resources that need one, so Pi Web did not trust it and added nothing.","mcp.reason.trust-too-broad":"Trusting this folder would trust the folders inside it too, so Pi Web does not do it by itself.","mcp.loadFailed":"Could not read the MCP settings.","mcp.loadTimedOut":"Pi Web did not answer in time. Press Refresh to try again.","mcp.projectNotListed":"This project's servers are not listed: {reason}","mcp.serverCount":"{enabled} of {total} servers turned on","mcp.group.empty":"No servers","mcp.group.fileProblem":"Not listed: see the file problem below","mcp.group.notListed":"Not listed","mcp.rowLabel":"{name}: {state}","mcp.state.on":"On","mcp.state.disabled":"Turned off in the file","mcp.state.invalid":"Refused by Pi","mcp.state.web-password":"Refused: references PI_WEB_PASSWORD","mcp.state.not-trusted":"Project not trusted","mcp.state.replaced":"Replaced by the project's server","mcp.state.overridden":"Changed by the project's override","mcp.state.mcp-off":"MCP is off","mcp.stateShort.invalid":"refused","mcp.stateShort.web-password":"refused","mcp.stateShort.disabled":"off","mcp.stateShort.not-trusted":"untrusted","mcp.stateShort.replaced":"replaced","mcp.stateShort.overridden":"overridden","mcp.server.shadowedByProject":"The project's server of the same name replaces this one while the project is trusted.","mcp.server.overriddenByProject":"The project's .pi/mcp.json changes this server while the project is trusted.","mcp.server.unchecked":"Listed unchecked: Pi Web cannot load the SDK's MCP checks.","mcp.detail.description":"Description","mcp.detail.transport":"Transport","mcp.detail.command":"Command","mcp.detail.url":"URL","mcp.detail.cwd":"Working directory","mcp.detail.env":"Environment","mcp.detail.headers":"Headers","mcp.detail.valuesHidden":"Values are not shown here.","mcp.detail.shellCommands":"Shell commands","mcp.detail.variables":"Host variables","mcp.detail.signIn":"Sign-in","mcp.detail.exposure":"Tools","mcp.detail.file":"File","mcp.detail.inProject":"This project","mcp.inProject.saved":"Only for this project; saved in its .pi/mcp.json.","mcp.inProject.overridden":"This project's .pi/mcp.json changes its {keys}.","mcp.inProject.refused":"This project's .pi/mcp.json overrides it, but pi refuses the override.","mcp.inProject.turnOff":"Turn off in this project","mcp.inProject.turnOn":"Turn on in this project","mcp.inProject.show":"Show","mcp.signIn.signedIn":"Signed in.","mcp.signIn.notSignedIn":"Not signed in.","mcp.signIn.registrationOnly":"Not signed in, but a client registration or an unfinished sign-in is stored for this server.","mcp.signIn.unknown":"Unknown: mcp-auth.json cannot be read.","mcp.signIn.header":"Authorization header","mcp.signIn.provider":"Sends the token of the pi provider {provider}: sign in to it under Settings › Models.","mcp.exposure.codemode":"Only the server's name and summary are listed; Code mode scripts search for its tools.","mcp.exposure.deferred":"Declared once tool search loads them; needs no Code mode.","mcp.exposure.direct":"Every tool's full declaration goes with every request: the most tokens.","mcp.exposure.hidden":"Registered but unreachable.","mcp.exposure.sandboxUnavailable":"Code mode cannot run on this Pi Web server, so these tools are reached through tool search instead.","mcp.exposure.builtinDisabled":"-builtin:codemode turns Code mode off, so these tools can be called only while tool search is active.","mcp.exposure.autoEnableOff":"autoEnableCodemode is false in {path}, so sessions do not turn Code mode on for these tools: they can be called only while Code mode is Always on or tool search is active.","mcp.exposure.label":"How {name}'s tools reach the model","mcp.exposure.optionDefault":"{label} (default)","mcp.exposure.toolOverrides":"Rules in toolExposure ({count}) keep their own exposure.","mcp.exposure.toolSearchDisabled":"-builtin:tool-search in {path} turns tool search off, so these tools can be called only from Code mode scripts while Code mode is on.","mcp.exposure.toolSearchDisabledUnknown":"-builtin:tool-search turns tool search off, so these tools can be called only from Code mode scripts while Code mode is on.","mcp.empty":"No MCP servers yet. Servers in {globalPath} and in a project's .pi/mcp.json appear here.","mcp.emptyFileProblem":"No servers could be listed: see the file problems below.","mcp.selectItem":"Select a server or Code mode.","mcp.unavailable.operator-disabled":"MCP is off: PI_WEB_DISABLE_MCP is set where Pi Web runs. The servers are listed, but no session connects them.","mcp.unavailable.internals-unavailable":"MCP is off: Pi Web cannot load the SDK's MCP modules. The servers are listed unchecked, and no session connects them.","mcp.unavailable.builtin-disabled":"MCP is off: the extensions setting in {path} turns off builtin:mcp, so no session connects these servers.","mcp.unavailable.builtin-disabled-unknown":"MCP is off: an extensions setting turns off builtin:mcp, so no session connects these servers.","mcp.trust.untrusted":"This project is not trusted, so the servers in its .pi/mcp.json do not connect.","mcp.trust.untrustedThrough":"This project is not trusted ({path} is marked untrusted), so the servers in its .pi/mcp.json do not connect.","mcp.trust.trustedThrough":"Trusted through {path}: the servers in this project's .pi/mcp.json connect, as in every folder under it.","mcp.trust.unreadable":"Pi Web cannot read the trust store (trust.json), so this project's servers count as untrusted for now.","mcp.trust.trustButton":"Trust project…","mcp.footer.fileProblem":"1 file problem","mcp.footer.fileProblems":"{count} file problems","mcp.codemode.title":"Code mode","mcp.codemode.rowLabel":"Code mode: {state}","mcp.codemode.intro":"The model calls tools from a short script; MCP tools use it by default. Changes apply to sessions started afterwards.","mcp.codemode.automatic":"Automatic","mcp.codemode.always":"Always on","mcp.codemode.unavailable":"Unavailable","mcp.codemode.mode":"Mode","mcp.codemode.automaticDescription":"Turns on when an MCP server that uses code mode connects.","mcp.codemode.alwaysDescription":"Sessions start with Code mode on.","mcp.codemode.preferenceError":"Cannot read the global settings file:","mcp.codemode.sandbox":"Sandbox","mcp.codemode.sandbox.available":"Available.","mcp.codemode.sandbox.unavailable":"Cannot run on this Pi Web server, so no session offers Code mode:","mcp.codemode.sandbox.not-checked":"Not checked yet: the self-test runs when the first session starts after Pi Web does.","mcp.codemode.builtin":"Extension","mcp.codemode.builtinDisabled":"Turned off by -builtin:codemode in {path}.","mcp.codemode.builtinDisabledUnknown":"Turned off by -builtin:codemode in an extensions setting.","mcp.codemode.builtinDisabledProject":"Turned off for this project's sessions by -builtin:codemode in {path}. Always on still applies to sessions in other folders.","mcp.codemode.autoEnableOff":"autoEnableCodemode is false in {path}, so Automatic never turns Code mode on, and the tools of servers with code mode exposure can be called only while tool search is active.","mcp.codemode.saveFailed":"Could not save the choice:","mcp.codemode.saveTimedOut":"Pi Web did not answer in time, so the choice may not have been saved.","mcp.codemode.alwaysUnavailable.sandbox":"Always on is unavailable: Code mode's sandbox cannot run on this Pi Web server.","mcp.codemode.alwaysUnavailable.builtin":"Always on is unavailable: -builtin:codemode in {path} turns Code mode off.","mcp.codemode.projectOverride.always":"This project decides for itself: defaultTools in {path} starts its sessions with Code mode on, whichever you choose here.","mcp.codemode.projectOverride.automatic":"This project decides for itself: defaultTools in {path} starts its sessions without Code mode, as Automatic does, whichever you choose here.","mcp.codemode.toolMode":"Built-in tools","mcp.codemode.toolMode.on":"Direct","mcp.codemode.toolMode.only":"In scripts","mcp.codemode.toolMode.onDescription":"The model calls read, bash and the other tools directly.","mcp.codemode.toolMode.onlyDescription":"While Code mode is on, the model calls read, bash and the other tools only from scripts.","mcp.codemode.toolMode.automaticNote":"Under Automatic, this waits until Code mode turns on.","mcp.codemode.toolMode.invalid":'codemode.mode in {path} is {value}, which pi reads as "on". Choosing either option replaces it.',"mcp.codemode.toolMode.projectOverride.on":"This project decides for itself: codemode in {path} keeps these tools declared in its sessions, whatever you choose here.","mcp.codemode.toolMode.projectOverride.only":"This project decides for itself: codemode.mode in {path} has its sessions call these tools from scripts only, whatever you choose here.","mcp.codemode.toolMode.saveFailed":"Could not save the setting:","mcp.codemode.inlineBudget":"Tool list budget","mcp.codemode.inlineBudget.unit":"tokens","mcp.codemode.inlineBudget.save":"Save","mcp.codemode.inlineBudget.description":"Tokens the code mode description may spend listing tools; scripts find the rest with searchTools(). Leave empty for pi's default, {default}.","mcp.codemode.inlineBudget.invalidDraft":"Enter a whole number from 0 to {max}, or leave it empty.","mcp.codemode.inlineBudget.invalid":"codemode.inlineBudget in {path} is {value}, which pi ignores, so sessions use {default}. Saving replaces it.","mcp.codemode.inlineBudget.projectOverride":"This project decides for itself: codemode.inlineBudget in {path} gives its sessions {value}, whatever you save here.","mcp.codemode.inlineBudget.projectOverrideDefault":"This project decides for itself: codemode in {path} leaves its sessions pi's default, {default}, whatever you save here.","mcp.codemode.inlineBudget.saveFailed":"Could not save the budget:","mcp.readOnly.mcp-off":"Servers cannot be changed here while MCP is off.","mcp.readOnly.project-untrusted":"Pi Web does not change them until the project is trusted.","mcp.readOnly.trust-unreadable":"Pi Web does not change them until it can read the trust store.","mcp.write.savedWhileOff":"Changes are saved to the file, but no session connects these servers while builtin:mcp is off.","mcp.server.switchOn":"Turn {name} on","mcp.server.switchOff":"Turn {name} off","mcp.groupSwitchOn":"Turn off every {group} server","mcp.groupSwitchOff":"Turn on every {group} server","mcp.groupKeptOff":"{count} server(s) that reference PI_WEB_PASSWORD stayed off.","mcp.bulkFailed":"Could not change {count} of {total} servers:","mcp.actionFailed":"Could not change the server:","mcp.actionTimedOut":"Pi Web did not answer in time, so the change may not have been made.","mcp.removed":"Removed {name} from {path}.","mcp.undo":"Undo","mcp.undoing":"Undoing…","mcp.undoFailed":"Could not undo:","mcp.state.connected":"Connected when tested","mcp.state.needs-auth":"Needs sign-in","mcp.state.failed":"Did not connect when tested","mcp.stateShort.needs-auth":"sign-in","mcp.stateShort.failed":"failed","mcp.exposureShort.codemode":"Code mode","mcp.exposureShort.deferred":"tool search","mcp.exposureShort.direct":"direct","mcp.exposureShort.hidden":"hidden","mcp.test.button":"Test connection","mcp.test.testing":"Testing…","mcp.test.never":"Not tested yet.","mcp.test.serial":"It runs a shell command, so its test waits for other such tests.","mcp.test.blocked.mcp-off":"MCP is off on this Pi Web server, so it tests no server.","mcp.test.blocked.project-untrusted":"This project is not trusted, so Pi Web does not start its servers.","mcp.test.blocked.trust-unreadable":"Pi Web cannot read the trust store (trust.json), so it does not start this project's servers.","mcp.test.blocked.invalid":"Pi refuses this entry, so there is nothing to test.","mcp.test.blocked.web-password":"It references PI_WEB_PASSWORD, so Pi Web does not connect it.","mcp.test.refused.entry-not-object":"This entry is not an object, so there is nothing to test. Fix it in the file.","mcp.test.refused.invalid-request":"Pi Web refused the request because it does not name a server it can test.","mcp.test.refused.unparsable":"The file is not valid JSON, so Pi Web cannot read this entry to test it.","mcp.test.refused.invalid-shape":'The file is not an object with an "mcpServers" object, so Pi Web cannot read this entry to test it.',"mcp.test.refused.link-dangling":"The file is a symbolic link to nothing, so Pi Web cannot read this entry to test it.","mcp.test.refused.link-outside":"The file is a symbolic link outside the folders Pi Web may read, so Pi Web does not test its servers.","mcp.test.refused.not-a-file":"The path is not a regular file, so Pi Web does not read it to test this entry.","mcp.test.refused.too-large":"The file is larger than 1 MiB, so Pi Web does not read it to test this entry.","mcp.test.refused.too-many-servers":"The file declares more than 200 servers, so Pi Web does not read it to test this entry.","mcp.test.state.connected":"Connected","mcp.test.state.needs-auth":"Needs sign-in","mcp.test.state.failed":"Did not connect","mcp.test.state.timedOut":"No answer","mcp.test.summary.connected":"{count} tool(s) listed in {seconds} s, tested at {time}.","mcp.test.summary.needs-auth":"The server asked for an OAuth sign-in. Tested at {time}.","mcp.test.summary.failed":"Gave up after {seconds} s, tested at {time}.","mcp.test.summary.timedOut":"It did not answer within {seconds} s, so Pi Web stopped the test. Tested at {time}.","mcp.test.error":"Error:","mcp.test.stderr":"The last lines it wrote to stderr:","mcp.test.serverInfo":"Server: {name} {version}","mcp.test.resources":"Offers resources.","mcp.test.ranIn":"Ran in {path}.","mcp.test.queued":"Waited {seconds} s for another test of a server that runs a shell command.","mcp.test.readOnly":"read-only","mcp.test.moreTools":"{count} more not shown.","mcp.test.queueTimedOut":"Another test of a server that runs a shell command did not finish in time, so this one did not start. Try again.","mcp.test.requestFailed":"Could not test the server:","mcp.test.requestTimedOut":"Pi Web did not answer in time. The test may still finish; press Refresh to see its result.","mcp.state.connecting":"Connecting in a session","mcp.state.disconnected":"Connection dropped in a session","mcp.state.conflict":"Name taken by another extension","mcp.state.session.connected":"Connected in a session","mcp.state.session.failed":"Did not connect in a session","mcp.stateShort.connecting":"connecting","mcp.stateShort.disconnected":"dropped","mcp.stateShort.conflict":"conflict","mcp.stateDetail.disconnected":"That session connects it again at the next call to one of its tools.","mcp.stateDetail.conflict":"Rename the entry in its file, or turn the other extension off.","mcp.session.state.connecting":"Connecting","mcp.session.state.connected":"Connected","mcp.session.state.needs-auth":"Needs sign-in","mcp.session.state.failed":"Did not connect","mcp.session.state.disconnected":"Dropped","mcp.session.state.conflict":"Name taken","mcp.session.state.not-trusted":"Not read","mcp.session.state.closed":"Closed","mcp.session.summary.connecting":"A session in {path} started connecting it at {time}.","mcp.session.summary.connected":"A session in {path} connected it at {time}.","mcp.session.summary.needs-auth":"The server asked a session in {path} for an OAuth sign-in at {time}.","mcp.session.summary.failed":"A session in {path} could not connect it at {time}.","mcp.session.summary.disconnected":"The connection of a session in {path} dropped at {time}.","mcp.session.summary.conflict":"A session in {path} found the name taken at {time}, so it did not connect this entry.","mcp.session.summary.not-trusted":"A session in {path} did not read it at {time}, because no decision trusted the project then.","mcp.session.summary.closed":"A session in {path} connected it at {time} and closed it at {closedTime}.","mcp.session.conflictOwner":"Registered first by:","mcp.hostInactive":"A session in {path} connects none of these servers through Pi Web: its /mcp command comes from {owner}, not from Pi's built-in MCP extension. That extension may read mcp.json and connect them its own way.","mcp.signIn.button":"Sign in","mcp.signIn.starting":"Starting…","mcp.signIn.cancel":"Cancel sign-in","mcp.signIn.cancelling":"Cancelling…","mcp.signIn.cancelFailed":"Could not cancel the sign-in:","mcp.signIn.cancelTimedOut":"Pi Web did not answer in time. The sign-in may still be under way; this line shows it once it moves on.","mcp.signIn.signOut":"Sign out","mcp.signIn.signingOut":"Signing out…","mcp.signIn.replaces":"Signing in may replace what is stored for this server.","mcp.signIn.signOutExplain":"Sign out deletes what is stored for this server; open sessions lose access at their next request.","mcp.signIn.shared":"The other {name} entry, with the same URL, started this sign-in: the tokens serve both.","mcp.signIn.shared.done":"Signed in through the other {name} entry, which has the same URL, so the tokens serve this entry too. Press Test connection to see what this entry's server offers.","mcp.signIn.shared.already":"The other {name} entry, which has the same URL, was already signed in, so the tokens serve this entry too. Press Test connection to see what this entry's server offers.","mcp.signIn.shared.connect-failed":"The sign-in through the other {name} entry, which has the same URL, found nothing to sign in to: that entry's server did not connect, and did not ask for a sign-in. Its Status row says why.","mcp.signIn.phase.connecting":"Checking whether the server asks for a sign-in…","mcp.signIn.phase.starting":"Preparing the sign-in with the server's authorization server…","mcp.signIn.phase.finishing":"Finishing the sign-in…","mcp.signIn.phase.noCancel":"The authorization server has answered, so this step can no longer be cancelled.","mcp.signIn.authorize.message":"Open the sign-in page and approve access. When the browser comes back to the computer running Pi Web, the sign-in finishes by itself. If the browser runs on another device, or the page it lands on does not load, copy that page's address and paste it here.","mcp.signIn.authorize.link":"Sign-in page:","mcp.signIn.authorize.notALink":"The server's sign-in page is not a web address, so it is shown as text only:","mcp.signIn.authorize.redirect":"After you approve, the browser is sent to {url}, which only the computer running Pi Web can open.","mcp.signIn.authorize.wait":"Pi Web waits up to 5 minutes from the start of the sign-in.","mcp.signIn.paste.label":"Address the browser landed on","mcp.signIn.paste.placeholder":"http://127.0.0.1:…/callback?code=…","mcp.signIn.paste.submit":"Continue","mcp.signIn.paste.checking":"Checking…","mcp.signIn.paste.refused":"That address does not finish this sign-in:","mcp.signIn.paste.timedOut":"Pi Web did not answer in time. If it took the address, this line shows the sign-in moving on.","mcp.signIn.done.already":"Already signed in: the server connected without a new sign-in.","mcp.signIn.done.signedIn":"Signed in. Status above shows what the server offers.","mcp.signIn.done.refreshed":"Signed in again with the stored refresh token, without the browser. Status above shows what the server offers.","mcp.signIn.done.failedAfter":"Signed in, but the server did not connect afterwards. Status above says why.","mcp.signIn.done.needsAuthAfter":"Signed in, but the server still asked for a sign-in when Pi Web connected again.","mcp.signIn.done.notConnected":"Signed in. Press Test connection to see what the server offers.","mcp.signIn.cancelled":"Sign-in cancelled.","mcp.signIn.expired":"The sign-in was not finished within 5 minutes, so Pi Web stopped waiting.","mcp.signIn.failed.connect-failed":"The server did not connect, and did not ask for a sign-in, so there was nothing to sign in to. Status above says why.","mcp.signIn.failed.queue-timed-out":"Another test of a server that runs a shell command did not finish in time, so the sign-in did not start. Try again.","mcp.signIn.failed.sign-in-failed":"The sign-in failed.","mcp.signIn.failed.internal":"The sign-in failed unexpectedly.","mcp.signIn.gone":"Pi Web no longer knows this sign-in: it ended a while ago, or Pi Web restarted. Press Sign in to start again.","mcp.signIn.requestFailed":"Could not sign in:","mcp.signIn.requestTimedOut":"Pi Web did not answer in time. Press Sign in again to see the sign-in under way.","mcp.signIn.signOutFailed":"Could not sign out:","mcp.signIn.signedOutDone":"Signed out: the tokens stored for this server were deleted.","mcp.signIn.signedOutNothing":"Nothing was stored for this server, so there was nothing to sign out of.","mcp.signIn.blocked.mcp-off":"MCP is off on this Pi Web server, so it signs in to no server.","mcp.signIn.blocked.project-untrusted":"This project is not trusted, so Pi Web does not sign in to or out of its servers.","mcp.signIn.blocked.trust-unreadable":"Pi Web cannot read the trust store (trust.json), so it does not sign in to or out of this project's servers.","mcp.signIn.blocked.invalid":"Pi refuses this entry, so there is nothing to sign in to.","mcp.signIn.refused.file":"Pi Web cannot read this entry from its file anymore. Press Refresh.","mcp.signIn.refused.invalid-request":"Pi Web refused the request because it does not name a server it can sign in to.","mcp.signIn.summary.connected":"Signed in, then {count} tool(s) listed in {seconds} s, at {time}.","mcp.signIn.summary.needs-auth":"Signed in, but the server still asked for a sign-in at {time}.","mcp.signIn.summary.failed":"Signed in, but connecting gave up after {seconds} s, at {time}.","mcp.signIn.summary.timedOut":"Signed in, but the server did not answer within {seconds} s, at {time}.","mcp.add.action":"Add MCP","mcp.add.title":"Add MCP","mcp.add.inputLabel":"Server to add","mcp.add.placeholder":'https://mcp.example.com/mcp\nnpx -y @scope/server\nclaude mcp add …\n{ "mcpServers": { … } }',"mcp.add.examples":"Supported formats (click one to fill in an example)","mcp.add.rawPi":"Enable pi mcp syntax ($NAME, !command)","mcp.add.rawPiOn":"In env and header values, $NAME reads a variable on the computer running Pi Web, and a value starting with ! runs as a command at every connection.","mcp.add.serverLabel":"Server","mcp.add.serverCount":"This paste holds {count} servers; add them one at a time.","mcp.add.preview":"Preview","mcp.add.readAs":"Read as","mcp.add.previewUnfilled":"Values still to fill in show what the paste holds there.","mcp.add.fields":"Values to fill in","mcp.add.field.optional":"Optional: left blank, the value it belongs to is left out.","mcp.add.field.optionalHeader":"Optional: left blank, the {name} header is not sent.","mcp.add.field.slot":"your value","mcp.add.field.storedAs":"Stored as {value}.","mcp.add.field.storedAsVariable":"Stored as {value}: pi reads the variable each time it connects, and the value stays out of mcp.json.","mcp.add.field.useVariable":"Read it from a variable of the computer running Pi Web","mcp.add.field.variableName":"Variable for {field}","mcp.add.field.variableHint":"Stored as ${…}: pi reads the variable each time it connects, and the value stays out of mcp.json.","mcp.add.field.choose":"Choose…","mcp.add.secrets":"Secrets in the paste","mcp.add.secret.holds":"holds a secret as plain text.","mcp.add.secret.storedAs":"Stored as {value}: pi reads the variable each time it connects, and the secret stays out of mcp.json.","mcp.add.secret.asPasted":"Saved in mcp.json as pasted, so the server can be saved only in the global file.","mcp.add.nameInvalid":"A server name uses letters, digits, _ and - only.","mcp.add.nameTaken":"{path} already has a server named {name}.","mcp.add.useName":"Use {name}","mcp.add.button":"Add","mcp.add.buttonTrust":"Add and trust this folder","mcp.add.adding":"Adding…","mcp.add.trustExplain":"This folder has no trust decision yet, and writing .pi/mcp.json makes it need one, so Add trusts {path} in the same step. The pi CLI shares this decision, and every folder inside it is trusted too.","mcp.add.afterAdd":"Adding tests the connection once.","mcp.add.failed":"Not added:","mcp.add.trustKept":"Pi Web trusted {folder} for this step and could not take that back, so the folder stays trusted.","mcp.add.hostEnv.body":"Its headers or OAuth client secret read {names}, which are set on the computer running Pi Web, and pi sends their values to the server at every connection. Add it only if this server should have them.","mcp.add.hostEnv.confirm":"Add and send these values","mcp.add.blocked.nothing":"Nothing to add yet: the paste holds no server pi can use.","mcp.add.blocked.fields":"Fill in {fields} first.","mcp.add.blocked.fieldsInvalid":"Correct {fields} first.","mcp.add.blocked.web-password":"It references PI_WEB_PASSWORD, so Pi Web does not add it.","mcp.add.refused.server-invalid":"pi refuses it as filled in: {error}","mcp.add.projectBlocked.no-project":"Open a project to add a server to its .pi/mcp.json.","mcp.add.projectBlocked.project-not-listed":"The project folder is not listed, so its .pi/mcp.json is not written.","mcp.add.projectBlocked.trust-unreadable":"Pi Web cannot read the trust store (trust.json), so it does not write this project's .pi/mcp.json.","mcp.add.projectBlocked.project-untrusted":"This project is not trusted, so Pi Web does not write its .pi/mcp.json. Trust it first.","mcp.add.projectBlocked.untrusted-decision":"This folder is marked as not trusted, so a server in its .pi/mcp.json would never connect.","mcp.add.projectBlocked.secret":"{fields} holds a secret as plain text, so this server can be saved only globally. To save it in the project, choose “Read it from a variable of the computer running Pi Web” for it.","mcp.add.projectBlocked.secretFixed":"{fields} holds a secret as plain text where pi reads no variable (the URL, the command or its arguments), so this server can be saved only globally.","mcp.add.projectBlocked.folder-not-fresh":"Something under this folder's .pi, or an .agents/skills folder above it, is a link to nothing. It would need trust once its target appears, so Pi Web does not trust the folder by itself. Remove or fix the link, then press Refresh.","mcp.add.projectBlocked.file-problem":"{path} cannot be written: {reason}","mcp.add.projectBlocked.trust-too-broad.home":"This is your home folder. Pi Web does not trust it by itself, since every folder in it would be trusted too; add the server globally.","mcp.add.projectBlocked.trust-too-broad.root":"This is a filesystem root. Pi Web does not trust it by itself, since every folder on it would be trusted too; add the server globally.","mcp.add.projectBlocked.trust-too-broad.contains-home":"This folder holds your home folder ({path}). Pi Web does not trust it by itself, since every folder in it would be trusted too; add the server globally.","mcp.add.projectBlocked.trust-too-broad.contains-agent-dir":"This folder holds Pi's agent folder ({path}). Pi Web does not trust it by itself, since every folder in it would be trusted too; add the server globally.","mcp.add.projectBlocked.trust-too-broad.contains-folder":"This folder holds {path}, another folder Pi Web knows, which trusting it would trust too. Pi Web does not do that by itself; add the server globally.","mcp.add.projectBlocked.trust-too-broad.contains-project":"This folder holds {path}, a project with resources that need trust and no decision of its own, which trusting this folder would trust too. Pi Web does not do that by itself; add the server globally, or open that project and trust it on its own.","mcp.add.projectBlocked.trust-too-broad.too-many-folders":"This folder holds too many folders for Pi Web to check that trusting it would trust no project inside them. Pi Web does not trust it by itself; add the server globally.","mcp.add.added":"Added {name} to {path}.","mcp.add.addedTrusted":"Added {name} to {path}, and trusted {folder}.","mcp.add.addedTrustedHere":"Added {name} to {path}, and trusted this folder.","mcp.add.testing":"Testing its connection…","mcp.add.needsSignIn":"It asks for a sign-in.","mcp.add.source.url":"a URL","mcp.add.source.command-line":"a command line","mcp.add.source.pi-mcp-add":"pi mcp add","mcp.add.source.claude-mcp-add":"claude mcp add","mcp.add.source.claude-mcp-add-json":"claude mcp add-json","mcp.add.source.codex-mcp-add":"codex mcp add","mcp.add.source.gemini-mcp-add":"gemini mcp add","mcp.add.source.vscode-add-mcp":"code --add-mcp","mcp.add.source.mcp-servers-json":"an mcpServers config (Claude, Cursor, Gemini…)","mcp.add.source.vscode-json":"a VS Code mcp.json","mcp.add.source.zed-json":"Zed settings","mcp.add.source.opencode-json":"an opencode config","mcp.add.source.server-object":"one server's JSON","mcp.add.source.server-map":"servers by name (JSON)","mcp.add.source.registry-server-json":"an MCP registry server.json","mcp.add.source.cursor-install-link":"a Cursor install link","mcp.add.source.vscode-install-link":"a VS Code install link","mcp.add.source.visual-studio-install-link":"a Visual Studio install link","mcp.add.source.copilot-app-install-link":"a GitHub Copilot app link","mcp.importNote.forServer":"{server}: {note}","mcp.importNote.empty-input":"Nothing to read yet: paste a URL, a command line or a config.","mcp.importNote.unrecognized-input":"Pi Web does not recognize this. Paste a server's URL, the command that starts it, an mcp add command, a JSON config or an install link.","mcp.importNote.invalid-json":"This looks like JSON but does not parse: {detail}","mcp.importNote.no-servers-found":"No MCP server was found in this config.","mcp.importNote.shell-operator":"The command line uses the shell operator {operator}. Paste only the command that starts the server.","mcp.importNote.shell-command-substitution":"The command line uses {syntax}, which only a shell runs. Write the value out instead.","mcp.importNote.shell-multiple-commands":"This holds more than one command. Paste only the one that starts the server.","mcp.importNote.shell-unterminated-quote":"A {quote} quote is never closed.","mcp.importNote.shell-parameter":"The command line uses the shell parameter {parameter}, which Pi Web cannot fill in.","mcp.importNote.shell-expansion":"The command line uses {expansion}, which only a shell expands. Write the value out instead.","mcp.importNote.unsupported-url-scheme":"A {scheme}: address is not a server: pi connects to http and https URLs.","mcp.importNote.github-repo-link":"This is the GitHub repository {repository}, not a server. Copy the install command, URL or config from its README.","mcp.importNote.github-mcp-page":"This is the github.com/mcp page of {name}. Its Install buttons open other apps and cannot be pasted here; copy the Cursor or VS Code install badge from the server's README instead.","mcp.importNote.github-page":"This GitHub page is not a server. Copy the install command, URL or config from the server's README.","mcp.importNote.by-name-link":"This link only names {name} in a registry and holds no settings, so Pi Web cannot add it yet. Copy the Cursor or VS Code install badge from the server's README instead.","mcp.importNote.badge-image":"This is a badge's image. Copy the link the badge opens instead.","mcp.importNote.install-link-invalid":"This install link cannot be read ({detail}).","mcp.importNote.claude-desktop-import":"claude mcp add-from-claude-desktop copies Claude Desktop's own servers. Paste the mcpServers part of claude_desktop_config.json instead.","mcp.importNote.cli-unsupported":"Pi Web does not read {cli}'s mcp add. Paste the server's own command line, URL or JSON config instead.","mcp.importNote.cli-usage":"This {cli} mcp add command is incomplete: it needs a name, and a URL or a command.","mcp.importNote.cli-unknown-option":"{cli} has no option {option}.","mcp.importNote.cli-option-needs-value":"The {cli} option {option} needs a value.","mcp.importNote.cli-option-wrong-transport":"The {cli} option {option} does not apply to {transport} servers.","mcp.importNote.cli-invalid-pair":"The {cli} option {option} cannot read {value}.","mcp.importNote.cli-not-a-server":"{cli} {command} manages {cli} itself; it is not a server. Paste the command that starts the server, or {cli} mcp add …","mcp.importNote.pi-help":"pi mcp add --help prints help and adds nothing.","mcp.importNote.field-required":"Fill in {field}.","mcp.importNote.field-invalid-option":"Pick one of the offered values for {field}.","mcp.importNote.field-reference-invalid.name":"{field}: a variable name has letters, digits and _, and does not start with a digit.","mcp.importNote.field-reference-invalid.target":"{field} cannot come from a variable: pi reads variables only in env values, headers and the OAuth client secret.","mcp.importNote.field-reference-invalid.missing":"{field}: enter the name of the variable to read it from.","mcp.importNote.sse-transport":"It uses the legacy SSE transport, which pi does not support.","mcp.importNote.sse-transport.suggested":"It uses the legacy SSE transport, which pi does not support. Try its streamable HTTP address instead: {suggestedUrl}","mcp.importNote.websocket-transport":"It connects over a WebSocket, which pi does not support.","mcp.importNote.unsupported-transport":"Its transport {type} is not one pi supports (stdio or streamable HTTP).","mcp.importNote.ambiguous-command-and-url":"It has both a command and a URL, so which to use is unclear.","mcp.importNote.no-command-or-url":"It has neither a command to start nor a URL to connect to.","mcp.importNote.zed-extension-server":"It comes from a Zed extension, which only Zed can start.","mcp.importNote.registry-packages-unsupported":"It is published only as packages to install, while pi needs a command or a URL. Paste its install command instead.","mcp.importNote.invalid-config":"pi would refuse it: {problem}","mcp.importNote.dropped-key":"{key} has no pi equivalent and was left out.","mcp.importNote.variable-unsupported-here":"{field} reads the variable {name}, which pi does not fill in there, so its value is asked for below.","mcp.importNote.variable-fallback-dropped":"{field}: pi has no default for a variable, so the fallback {fallback} of {name} was left out.","mcp.importNote.bare-dollar-literal":"{field} holds ${name} as text: this client does not read it as a variable, and pi will not either.","mcp.importNote.header-env-reference":"The header {header} sends the value of {names} from the computer running Pi Web to this server.","mcp.importNote.client-secret-env-reference":"The OAuth client secret is read from {names} on the computer running Pi Web and sent to the authorization server.","mcp.importNote.shell-command-value":"{field} runs a shell command on the computer running Pi Web at every connection.","mcp.importNote.shell-variable":"{field}: ${name} would be filled in by your shell. pi reads it from the environment of the computer running Pi Web, or its value is asked for below.","mcp.importNote.unsupported-variable":"{field} uses {variable}, which pi cannot fill in, so its value is asked for below.","mcp.importNote.input-undefined":"The config asks for the input {id} but does not define it, so its value is asked for below.","mcp.importNote.input-command-unsupported":"The input {id} runs a VS Code command, which Pi Web cannot, so its value is asked for below.","mcp.importNote.timeout-clamped":"The timeout of {from} seconds was cut to {to} seconds.","mcp.importNote.timeout-dropped":"The timeout {value} is not a number of seconds and was left out.","mcp.importNote.timeout-unit-guessed.milliseconds":"The timeout {value} was read as milliseconds; check it.","mcp.importNote.timeout-unit-guessed.seconds":"The timeout {value} was read as seconds; check it.","mcp.importNote.env-null-dropped":"{name} is set to null to unset it, which pi cannot do, so it was left out.","mcp.importNote.oauth-option-dropped":"The OAuth option {key} has no pi equivalent and was left out.","mcp.importNote.oauth-disable-unsupported":"The config turns OAuth off, which pi cannot: pi signs in with OAuth whenever the server asks.","mcp.importNote.callback-url-dropped":"The OAuth callback address {value} is not a loopback address pi can listen on, so it was left out.","mcp.importNote.callback-port-dropped":"The OAuth callback port {value} is not a port number, so it was left out.","mcp.importNote.invalid-exposure-dropped":"The exposure {value} is not one pi knows, so it was left out.","mcp.importNote.tool-filter-imported.include":"Only these tools are offered, the others hidden: {tools}.","mcp.importNote.tool-filter-imported.exclude":"These tools are hidden: {tools}.","mcp.importNote.transport-guessed":"The config names no transport, so Pi Web read it from the keys present.","mcp.importNote.insecure-http":"{host} is reached over plain http, so everything sent, tokens included, travels unencrypted.","mcp.importNote.literal-secret":"{field} holds a secret as plain text, so the server can be saved only in the global mcp.json.","mcp.importNote.cli-option-ignored":"The {cli} option {option} has no pi equivalent and was ignored.","mcp.importNote.cli-option-as-arg":"{option} comes after the server's command, so it is passed to the server as an argument, as {cli} does.","mcp.importNote.cli-extra-arguments":"{cli} adds an HTTP server by its URL alone, so the extra arguments {arguments} were left out.","mcp.importNote.mcp-remote-bridge":"This runs mcp-remote to reach {url}. pi can connect to that URL itself: paste the URL to add it without the bridge.","mcp.importNote.looks-like-pi-config":"This looks like pi's own mcp.json. If you copied it from there, turn on “Enable pi mcp syntax ($NAME, !command)”.","mcp.importNote.workspace-folder-relative":"{field}: {from} became the session's folder (.), where pi starts the server.","mcp.importNote.home-variable-translated":"{field}: {from} became {to}, which pi reads from the environment.","mcp.importNote.name-taken":"The file already has a server named {name}. Pick another name, such as {suggestedName}.","mcp.importNote.escaped-value":"{field}: $ and a leading ! were escaped, so pi reads the value as written and runs nothing.","mcp.importNote.variable-translated":"{field}: {from} became {to}, the way pi reads that variable.","mcp.importNote.home-translated":"{field}: {from} became ~, the home folder.","mcp.importNote.timeout-converted":"The timeout of {from} ms became {to} seconds.","mcp.importNote.env-value-stringified":"{name} was not text, so it was turned into text.","mcp.importNote.empty-authorization-dropped":"An empty Authorization header was left out, so pi signs in with OAuth if the server asks.","mcp.importNote.imported-disabled":"The config has it turned off, so it is added switched off.","mcp.importNote.name-derived":"Named {name} after its address or command.","mcp.importNote.name-sanitized":"{original} became {name}: pi server names use letters, digits, _ and -.","mcp.importNote.name-deduplicated":"{original} is already in use, so it is named {name}.","mcp.importNote.command-split":"{command} was split into a command and its arguments.","mcp.importNote.transport-assumed-http":"No transport is given, so it is read as a streamable HTTP server.","mcp.importNote.scheme-assumed":"Read as {url}.","mcp.importNote.client-secret-prompt":"The OAuth client secret is asked for below.","mcp.importNote.userinfo-moved-to-header":"The user name and password in the URL moved into an Authorization header: pi does not send them in the URL.","mcp.importProblem.name":"{name} is not a server name pi accepts (letters, digits, _ and -).","mcp.importProblem.not-an-object":"it is not an object.","mcp.importProblem.exposure":"the exposure {value} is not one pi knows.","mcp.importProblem.tool-exposure":"toolExposure must map tool names to exposures.","mcp.importProblem.tool-exposure.tool":"the toolExposure of {tool} is not an exposure pi knows.","mcp.importProblem.enabled":"enabled must be true or false.","mcp.importProblem.description":"description must be text.","mcp.importProblem.timeout":"the timeout {value} is not a positive number of seconds.","mcp.importProblem.sse":"the legacy SSE transport is not supported.","mcp.importProblem.url":"{url} is not an http or https URL.","mcp.importProblem.headers":"headers must map names to text.","mcp.importProblem.auth":"auth.provider must name a pi provider.","mcp.importProblem.auth-url":"auth sends a provider's token, so the URL must be https (or http on localhost).","mcp.importProblem.oauth":"oauth must be an object.","mcp.importProblem.oauth-client-id":"oauth.clientId must be text.","mcp.importProblem.oauth-client-secret":"oauth.clientSecret must be text.","mcp.importProblem.callback-port":"the OAuth callback port {value} is not a port number.","mcp.importProblem.callback-url":"the OAuth callback address {value} is not a loopback http address.","mcp.importProblem.callback-port-mismatch":"the OAuth callback address uses port {value}, not the callback port.","mcp.importProblem.oauth-scope":"oauth.scope must be text.","mcp.importProblem.oauth-client-name":"oauth.clientName must be non-empty text.","mcp.importProblem.oauth-client-registration":'oauth.clientRegistration {value} must be "dcr" or "cimd".',"mcp.importProblem.oauth-client-registration-client":'oauth.clientRegistration "cimd" cannot go with oauth.clientId or oauth.clientName.',"mcp.importProblem.oauth-client-registration-callback":'oauth.clientRegistration "cimd" needs oauth.callbackUrl on localhost or 127.0.0.1 with the path /callback.',"mcp.importProblem.auth-server-metadata-url":"oauth.authServerMetadataUrl {value} must be an https address (or http on localhost).","mcp.importProblem.args":"args must be a list of text.","mcp.importProblem.args.index":"args[{index}] is not text.","mcp.importProblem.env":"env must map names to text.","mcp.importProblem.cwd":"cwd must be text.","mcp.importProblem.no-command-or-url":"it needs a command (stdio) or a URL (streamable HTTP).","mcp.importField.reason.empty":"The paste leaves this empty.","mcp.importField.reason.input":"The config asks for this when it is installed.","mcp.importField.reason.variable":"The paste reads a variable here that pi does not fill in.","mcp.importField.reason.home":"The paste reads the home folder here in a way pi does not fill in.","mcp.importField.reason.workspace-basename":"The paste uses the workspace folder's name here, which pi does not know.","mcp.importField.reason.unsupported-variable":"The paste uses a variable here that pi cannot fill in.","mcp.importField.reason.client-secret":"The command asks for the OAuth client secret.","mcp.importField.reason.registry-header":"The registry entry asks for this header.","mcp.importField.reason.registry-variable":"The registry entry asks for this part of the address.","i18n.creatingSession":"Creating new session…","i18n.creating":"Creating…","i18n.subscription":"Subscription","i18n.subscriptions":"Subscriptions","i18n.customEndpoint":"Custom endpoint format","i18n.noChanges":"No changes","i18n.branches":"Branches","i18n.noActiveSession":"No active session","i18n.noBranches":"This session has no branches","i18n.branchesLockedWhileRunning":"Branches can't be switched while the session is running","i18n.source":"Source","i18n.preview":"Preview","i18n.diff":"Diff","i18n.downloadFile":"Download file","i18n.liveSync":"Live sync active","i18n.notWatching":"Not watching","i18n.fileViewMode":"File view mode","i18n.compareHead":"Compare working tree with HEAD","i18n.mentionSelectedLines":"Mention selected lines","i18n.disableWrap":"Disable word wrap","i18n.enableWrap":"Enable word wrap","i18n.htmlPreview":"HTML preview","i18n.previewFile":"Preview {file}","i18n.invalidMermaid":"Invalid Mermaid diagram","i18n.renderingMermaid":"Rendering Mermaid diagram","i18n.previewAfterStreaming":"Preview available after streaming","i18n.showMermaidSource":"Show Mermaid source","i18n.previewMermaid":"Preview Mermaid diagram","i18n.openMermaidViewer":"Open diagram viewer","i18n.mermaidViewer":"Mermaid diagram viewer","i18n.mermaidDiagram":"Mermaid diagram","i18n.zoomOut":"Zoom out","i18n.zoomIn":"Zoom in","i18n.fitToWidth":"Fit to width","models.discoveryFetching":"Importing models…","models.discoveryFetch":"Import models…","models.discoveryFilterPlaceholder":"Filter {count} models…","models.discoveryFilter":"Filter upstream models","models.discoverySelectShown":"Select shown","models.discoveryNoMatches":"No matching models.","models.configUnreadable":"Could not read models.json, so saving is disabled to avoid overwriting it. Fix the file, then reopen this panel. {error}","models.providerNameTaken":'Another provider is already named "{name}". Choose a different name.',"models.discoveryAdded":"added","models.discoveryShowing":"Showing first {shown} of {total}","models.discoveryFetched":"{count} models fetched","models.discoveryAddSelected":"Add selected","models.discoveryAddSelectedCount":"Add selected ({count})","models.catalogSource":"source: models.dev ↗","models.catalogFilling":"Filling details…","models.catalogFill":"Fill model details","models.catalogFilled":"{count} fields filled","models.catalogNoEmptyFields":"No empty fields to fill","models.catalogNoExactMatch":"No exact models.dev match","models.catalogPriceProvider":"Price matched Provider {provider}","models.catalogPriceBaseUrl":"Price matched Base URL to {provider}","models.catalogPriceConsensus":"Price agreed by {support}/{total} records","models.catalogPriceUnreliable":"No reliable price found","models.catalogUndo":"Undo","models.capabilities":"Capabilities","models.reasoning":"Reasoning / thinking","models.imageInput":"Image input","models.modelSpecs":"Model specifications","models.contextWindow":"Context window (tokens)","models.contextForModel":"Context window for {model}","models.contextInvalid":"Context window of {model}: enter a positive whole number of tokens.","models.contextOverrideHelp":"Context window in tokens; blank uses the default. Restart Pi Web to update loaded sessions.","models.maxOutputTokens":"Max output tokens","models.costPerMillion":"Cost per million tokens","models.costInput":"Input","models.costOutput":"Output","models.costCacheRead":"Cache read","models.costCacheWrite":"Cache write","models.notProvided":"Not provided","models.editCosts":"Edit prices","models.finishEditingCosts":"Done","models.costAllRequired":"Enter a valid non-negative price; blank fields are saved as 0.","models.advancedSettings":"Advanced settings","models.providerDefaults":"Using provider defaults","models.headersSummary":"Headers: {count}","models.compatSummary":"Compatibility: {count}","models.thinkingSummary":"Thinking levels: {count}","models.apiOverride":"API override","models.headers":"Headers","models.headersHelp":"Added to this model's requests and overrides provider headers.","models.compatibility":"Compatibility","models.deepSeekThinkingCompat":"DeepSeek thinking compatibility","models.developerRole":"Use the developer role for the system prompt","models.thinkingLevelMap":"Thinking level map","models.clearAll":"Clear all","models.enabledSection":"Available models","models.enabledCount":"{enabled}/{total} enabled","models.enableAll":"Enable all","models.disableAll":"Disable all","models.enableShown":"Enable shown","models.disableShown":"Disable shown","models.enabledFilter":"Filter available models","models.enabledFilterPlaceholder":"Filter {count} models…","models.enabledNoMatches":"No matching models.","models.enabledToggle":"Show {model} in the model selector","models.enabledProviderToggle":"Enable all {provider} models","models.enabledPinHint":"Thinking level pinned by enabledModels. Edit settings.json to change it.","models.enabledLastModel":"At least one model has to stay enabled.","models.enabledProjectScope":"This project's .pi/settings.json sets enabledModels and overrides the global value, so these switches are read-only. Edit that file to change the list.","models.enabledUnavailable":"Sign in to this provider to choose its models.","models.refreshCatalog":"Refresh catalog","models.refreshingCatalog":"Refreshing…","models.refreshCatalogHint":"Fetch the model list this provider publishes now. pi's built-in list is fixed at the pi version pi-web ships with, so a newly released model only shows up after a refresh.","models.catalogUpdated":"Model list updated from the provider.","models.catalogUnchanged":"Already up to date.","models.catalogUnreachable":"Could not reach the catalog. Check the connection and the provider credential, then try again.","models.catalogOffline":"PI_OFFLINE is set, so pi-web does not fetch catalogs.","models.enabledCustomEmpty":"No models available from this provider yet. Save your changes, and check that the API key works.","models.enabledStale":"{count} unmatched","models.enabledStaleHint":"A model is available when its provider has a usable credential. An entry matches nothing when that credential is missing, when the model was renamed or deleted, or when the entry was written for another machine.","models.enabledPrune":"Remove unmatched entries","models.enabledPruneHint":"Delete the configured entries that match no available model. Everything else stays as it is.","models.enabledClear":"Enable all models","models.enabledClearHint":"Remove the model filter for every provider.","i18n.testingModel":"Testing model connection...","i18n.connected":"Connected","i18n.failed":"Failed","i18n.test":"Test","i18n.testConnection":"Test model connection","i18n.provider":"Provider","i18n.model":"Model","i18n.providerName":"Provider name","i18n.rename":"Rename","i18n.default":"Default","i18n.disabled":"Disabled","i18n.noResources":"No resources","i18n.unknown":"Unknown","i18n.installedVersion":"installed {version}","i18n.configuredVersion":"configured {version}","i18n.extensions":"Extensions","i18n.prompts":"Prompts","i18n.themes":"Themes","i18n.resourceCount":"{count} {label}","i18n.extensionShort":"ext","i18n.skillShort":"skills","i18n.promptShort":"prompts","i18n.themeShort":"themes","i18n.custom":"Custom","i18n.clearAll":"clear all","i18n.connectedSuccessfully":"Connected successfully.","i18n.notConnected":"not connected","i18n.configured":"configured","i18n.notConfigured":"not configured","i18n.openingBrowser":"Opening browser…","i18n.submit":"Submit","i18n.login":"Login","i18n.relogin":"Re-login","i18n.disconnect":"Disconnect","i18n.networkError":"Network error","i18n.continuing":"Continuing…","i18n.skills":"Skills","i18n.plugins":"Plugins","i18n.addSkill":"Add skill","i18n.addPlugin":"Add plugin","i18n.selectSkill":"Select a skill","i18n.selectPackage":"Select a package","i18n.updateAvailable":"Update available","i18n.upToDate":"Up to date","i18n.automaticChecksUnavailable":"Automatic checks unavailable","i18n.checkFailed":"Check failed","i18n.installed":"Installed","i18n.status":"Status","i18n.version":"Version","i18n.description":"Description","i18n.package":"Package","i18n.resources":"Resources","i18n.installedPath":"Installed path","i18n.cwd":"CWD","i18n.resolvedResources":"Resolved Resources","i18n.reloadSession":"Reload session","i18n.reloading":"Reloading...","i18n.packageRemoved":"Package removed.","i18n.packageInstalled":"Package installed.","i18n.packageUpdated":"Package updated.","i18n.packagesUpdated":"Packages updated.","i18n.updateAllPlugins":"Update all","i18n.updateAllPluginsHint":"Updates all configured plugins","i18n.packageDisabled":"Package disabled.","i18n.packageEnabled":"Package enabled.","i18n.sessionReloaded":"Session reloaded.","i18n.thinking":"Thinking","i18n.largeMessageReveal":"Message content is very large ({size}). Click to view as plain text — markdown rendering is disabled to keep the page responsive.","i18n.loadingThinking":"Loading thinking...","i18n.copyMessage":"Copy message","i18n.editFromHere":"Edit from here","i18n.editFromHereTitle":"Edit from here — branches within this session","i18n.newSession":"New session","i18n.newSessionTitle":"New session — creates an independent copy from here","i18n.estimatedTokens":"Estimated token count while streaming","i18n.noOutput":"(no output)","i18n.noSummary":"(no summary)","i18n.conversationCompacted":"Conversation compacted","i18n.compactedFromTokens":"Compacted from {tokens} tokens","i18n.compactionDescription":"The conversation history before this point was compacted into the following summary:","i18n.fileContext":"File context: {details}","i18n.readFiles":"Read files","i18n.modifiedFiles":"Modified files","i18n.noMessage":"(no message)","i18n.collapse":"Collapse","i18n.expand":"Expand","i18n.hideDetails":"Hide details","i18n.showDetails":"Show details","i18n.thinkingUnavailable":"Thinking content unavailable","i18n.before":"Before","i18n.after":"After","i18n.sessionComplete":"Session complete","i18n.taskFinished":"Task finished.","i18n.attentionNeeded":"Pi needs your attention","i18n.extensionInputNeeded":"An extension is waiting for your input."}}},41298:(a,b,c)=>{c.d(b,{O:()=>d});let d={id:"zh-CN",label:"简体中文",messages:{"common.ok":"确定","common.language":"语言","common.models":"模型","common.skills":"技能","common.agents":"子代理","common.plugins":"插件","common.settings":"设置","settings.title":"设置","settings.general":"常规","settings.generalDescription":"选择 Pi Web 的显示方式和界面语言。","settings.appearance":"外观","settings.appearanceDescription":"选择浅色或深色主题,也可以跟随系统设置。","settings.chatContentWidth":"聊天内容宽度","settings.chatContentFontSize":"聊天字体大小","settings.typography":"字体与排版","settings.uiFontFamily":"界面字体","settings.monoFontFamily":"等宽字体","settings.uiFontPlaceholder":"系统默认","settings.monoFontPlaceholder":"默认 Noto Sans Mono","settings.resetUiFont":"重置界面字体","settings.resetMonoFont":"重置等宽字体","settings.fontDescription":"填写本机已安装的字体名,多个用逗号分隔,留空使用默认。等宽字体用于代码和终端。仅保存在当前浏览器。","settings.uiFontWeight":"界面字体字重","settings.monoFontWeight":"等宽字体字重","settings.fontWeightThin":"极细","settings.fontWeightExtraLight":"特细","settings.fontWeightLight":"细体","settings.fontWeightRegular":"常规","settings.fontWeightMedium":"中等","settings.fontWeightSemiBold":"半粗","settings.resetChatContentWidth":"重置聊天内容宽度","settings.resetChatContentFontSize":"重置聊天字体大小","settings.chatContentWidthDescription":"设置消息内容和输入框的最大宽度。","settings.themeLight":"浅色","settings.themeDark":"深色","settings.themeMist":"雾青","settings.themeRose":"蔷薇","settings.themePine":"松夜","settings.themeSand":"暖沙","settings.themeLilac":"丁香","settings.themeSlate":"岩蓝","settings.themeDusk":"暮紫","settings.themeEmber":"余烬","settings.themeContrastLight":"高对比浅色","settings.themeContrastDark":"高对比深色","settings.themeZenburn":"Zenburn","settings.themeSystem":"跟随系统","settings.thinkingDisplay":"思考过程显示","settings.thinkingDisplayDescription":"选择消息加载时模型思考块是否默认展开。","settings.thinkingExpandedDefault":"默认展开思考块","settings.chat":"对话","settings.enterSendMode":"发送按键","settings.enterSendModeEnter":"Enter","settings.enterSendModeCtrlEnter":"Ctrl/Cmd+Enter","settings.quoteSelection":"选中文字时显示提问浮窗","settings.sidebar":"侧边栏","settings.filesPlacement":"侧边栏布局","settings.filesPlacementClassic":"经典","settings.filesPlacementBelow":"会话下方","settings.filesPlacementTab":"单独标签页","settings.filesPlacementDescription":"经典为单项目布局。手机上始终用标签页切换。","settings.languageDescription":"选择整个界面使用的语言。","settings.shellTool":"Shell 工具","settings.shellToolDescription":"选择模型执行命令时使用的 Shell。直接输入的 ! 和 !! 命令仍使用 Bash。","settings.pushPermission":"后台推送(iOS 主屏应用)","settings.pushPermissionDescription":"将本站添加到主屏幕后(iPhone 需 iOS 16.4+),会话完成且页面不在前台时,可在锁屏收到系统通知。若通知不再送达,可回到这里重新注册。注册必须由点击触发,因此不会自动弹出授权。","settings.pushRegister":"注册推送","settings.pushRegisterLoading":"注册中…","settings.pushRegistered":"✅ 推送已注册,后台通知就绪。","settings.pushRegisterFailed":"❌ 注册失败:","settings.usePowerShell":"使用 PowerShell 替代 Bash","settings.projectRequired":"打开项目后才能配置此项","settings.mcp":"MCP","auth.prompt":"登录后继续使用","auth.password":"密码","auth.logIn":"登录","auth.loggingIn":"正在登录...","auth.invalidPassword":"密码不正确","auth.loginFailed":"登录失败,请重试。","auth.tooManyAttempts":"失败次数过多,请在 {seconds} 秒后重试。","auth.logOut":"退出登录","auth.loggingOut":"正在退出...","auth.logoutFailed":"退出失败,请重试。","skills.scope.global":"全局","skills.scope.project":"项目","skills.scope.path":"路径","skills.groupSwitchOff":"在模型提示词中显示「{group}」中的所有技能","skills.groupSwitchOn":"在模型提示词中隐藏「{group}」中的所有技能,仍可手动调用。","skills.bulkFailed":"{total} 个技能中有 {count} 个未能更改:","skills.instructions":"说明","skills.noInstructions":"此技能没有说明。","skills.documentBack":"返回","plugins.groupSwitchOff":"启用 {group} 中的所有包","plugins.groupSwitchOn":"禁用 {group} 中的所有包。设置了资源过滤的包会保持启用,因为禁用会清除其过滤设置;请使用它自己的开关。","plugins.bulkKeptFiltered":"{count} 个设置了资源过滤的包保持启用:禁用会清除其过滤设置,请使用它自己的开关。","plugins.bulkEnabled":"包已启用。","plugins.bulkDisabled":"包已禁用。","plugins.bulkFailed":"{total} 个包中有 {count} 个未能更改:","plugins.status.loaded":"已加载","plugins.status.installed":"已安装","plugins.status.missing":"缺失","plugins.status.disabled":"已禁用","plugins.diagnostic":"1 条诊断","plugins.diagnostics":"{count} 条诊断","config.source":"来源","config.examples":"示例","config.name":"名称","config.saveTo":"保存到","agents.close":"关闭","agents.builtInTitle":"启用 Pi Web 内置子代理","agents.builtInDescription":"提供 Pi Web 集成的 Agent 工具,并停用发生冲突的 pi-subagents 扩展。","agents.reloadRequired":"重新加载当前会话后生效。","agents.reloadSession":"重新加载会话","agents.maxConcurrent":"并发子代理数","agents.maxConcurrentDescription":"每个父会话同时运行的最大任务数。","agents.reloading":"正在重新加载...","agents.loading":"正在加载子代理...","agents.new":"新建子代理","agents.empty":"选择或创建一个子代理配置","agents.name":"子代理 ID","agents.displayName":"显示名称","agents.description":"描述","agents.prompt":"系统指令","agents.tools":"工具","agents.resources":"资源","agents.loadSkills":"加载技能","agents.loadExtensions":"加载扩展","agents.mcp":"连接 MCP 服务器","agents.codemode":"代码模式","agents.codemode.inherit":"跟随父会话","agents.codemode.on":"启用","agents.codemode.off":"禁用","agents.codemodeHint":"「跟随父会话」沿用父会话当前的代码模式启用状态。代码模式内的工具权限仍取自此配置的工具列表。更改对之后新建的子代理生效。","agents.skillsOnly":"只加载这些技能:{skills}","agents.skillsNone":"不加载任何技能:profile 文件里的 skills 列表为空","agents.extensionsOnly":"只加载这些扩展:{extensions}","agents.extensionsNone":"不加载任何扩展:profile 文件里的 extensions 列表为空","agents.mcpHint":"子代理会连接 mcp.json 里的 MCP 服务器。工具为只读时,只能调用服务器标记为只读的 MCP 工具。更改对之后新建的子代理生效。","agents.mcpChatOnly":"MCP 需要至少一个工具、技能或扩展:纯聊天的子代理不能使用。","agents.model":"指定模型","agents.modelsLoading":"正在加载模型...","agents.modelUnavailable":"{model}(不可用)","agents.thinking":"思考级别","agents.maxTurns":"最大轮次","agents.inherit":"跟随父会话","agents.enable":"启用子代理","agents.disable":"停用子代理","agents.builtinPath":"内置配置","agents.inheritContext":"继承父会话上下文","agents.background":"默认在后台运行","agents.duplicate":"创建副本","agents.copyName":"{name} 副本","agents.delete":"删除","agents.deleteConfirm":"删除 {name}?","agents.save":"保存","agents.saving":"正在保存...","agents.scope.builtin":"内置","agents.scope.global":"全局","agents.scope.workspace":"工作区","agents.scope.project":"项目","agents.overridden":"被覆盖","subagent.openTab":"在侧栏面板中查看子代理工作","subagent.closeTab":"关闭子代理侧栏面板","subagent.tabLabel":"子代理 {name}","subagent.refresh":"刷新","subagent.viewer.starting":"子代理会话正在启动…","subagent.viewer.empty":"暂无消息","subagent.viewer.error":"无法加载子代理会话","codemode.calls":"工具调用","codemode.callCount":"{count} 次调用","codemode.callCountOne":"1 次调用","codemode.showEarlierCalls":"显示更早的 {count} 次调用","codemode.omittedCalls":"更早的 {count} 次调用未显示","codemode.modelCost":"模型调用:{cost}","codemode.status.running":"运行中","codemode.status.ok":"成功","codemode.status.error":"失败","codemode.status.cancelled":"已取消","agentSwitcher.title":"Agents","agentSwitcher.main":"主 Agent","agentSwitcher.subagent":"子 Agent","agentSwitcher.current":"当前","agentSwitcher.count":"{count} 个子 Agent","agentSwitcher.runningCount":"{count} 个运行中","agentSwitcher.tokens":"{count} tokens","agentSwitcher.totalUsage":"合计","agentSwitcher.totalUsageHint":"主 Agent 与全部子 Agent","agentSwitcher.search":"搜索 Agents","agentSwitcher.noMatches":"没有匹配的 Agent","agentSwitcher.status.starting":"正在启动","agentSwitcher.status.running":"运行中","agentSwitcher.status.completed":"已完成","agentSwitcher.status.failed":"失败","agentSwitcher.status.aborted":"已中止","agentSwitcher.status.interrupted":"已中断","appUpdate.releaseNotes":"Pi Web v{version} 可用,查看更新说明","sidebar.hide":"隐藏侧边栏","sidebar.show":"显示侧边栏","theme.light":"主题:浅色","theme.dark":"主题:深色","theme.mist":"主题:雾青","theme.rose":"主题:蔷薇","theme.pine":"主题:松夜","theme.auto":"主题:跟随系统","history.full":"完整历史","history.unsaved":"会话保存后才能查看完整历史","history.label":"完整历史","title.generating":"正在生成...","title.updated":"标题已更新","title.failed":"生成失败","title.generate":"生成标题","title.unsaved":"会话保存后才能生成标题","title.noMessages":"请先发送消息,再为会话命名","title.generateSession":"生成会话标题","system.prompt":"系统提示词","system.empty":"系统提示词为空(工具已禁用)","system.load":"系统提示词尚未加载","system.loading":"正在加载系统提示词…","system.label":"系统","tools.label":"工具","tools.title":"工具定义","tools.details":"工具定义详情","tools.load":"工具定义尚未加载","tools.loading":"正在加载工具定义…","tools.noTools":"没有启用的工具","tools.description":"描述","tools.parameters":"参数","tools.parameterCount":"{count} 个参数","tools.noParameters":"无参数","tools.required":"必填","tools.optional":"可选","tools.allowedValues":"可选值","tools.defaultValue":"默认值","tools.guidelines":"提示词规则","session.info":"会话信息","session.name":"名称","session.file":"会话文件","session.inMemory":"内存中","session.id":"ID","session.user":"用户","session.assistant":"助手","session.toolCalls":"工具调用","session.toolResults":"工具结果","session.total":"总计","session.input":"输入","session.output":"输出","session.cacheRead":"缓存读取","session.cacheWrite":"缓存写入","session.cost":"费用","session.context":"上下文","session.cacheHitRate":"平均缓存命中率","session.copy":"复制{value}","session.copied":"已复制","session.title":"会话信息","session.load":"发送消息或运行 /session 以加载会话信息","session.infoSection":"会话信息","session.projectSection":"项目信息","session.messages":"消息","session.tokens":"Token","session.totalActive":"活跃时长","session.copyFile":"复制文件路径","session.copyId":"复制会话 ID","session.projectDir":"项目目录","session.gitBranch":"Git 分支","session.gitWorktree":"Worktree","session.copyProjectDir":"复制项目目录","session.copyGitBranch":"复制 Git 分支","session.copyGitWorktree":"复制 Worktree 路径","workspace.opening":"正在打开工作区...","workspace.unable":"无法打开工作区","workspace.selectSession":"从侧边栏选择一个会话","workspace.getStarted":"开始使用","workspace.selectProject":"从侧边栏选择项目目录","workspace.addModels":"打开底部的“设置”,然后选择“模型”","workspace.stepProject":"从侧边栏选择项目目录","workspace.stepModels":"打开底部的“设置”,然后选择“模型”","workspace.newSessionContext":"新会话的位置","workspace.project":"项目","files.hidePanel":"隐藏文件面板","files.expandPanel":"全宽展示文件面板","files.restorePanelWidth":"还原文件面板宽度","files.showPanel":"显示文件面板","files.noneOpen":"没有打开的文件","layout.resizeSidebar":"调整侧边栏宽度","layout.resizeFilePanel":"调整文件面板宽度","layout.resizeSidebarSections":"调整侧边栏分区高度","layout.resizeHeightHint":"拖动调整高度。","layout.resizeHint":"拖动调整宽度。双击或按 Enter 恢复默认值。","sidebar.new":"新建","sidebar.newSessionTitle":"在 {path} 中新建会话","sidebar.refresh":"刷新","sidebar.selectProject":"选择项目…","sidebar.filterProjects":"筛选项目…","sidebar.noMatchingProjects":"没有匹配的项目","sidebar.useDefaultDirectory":"使用默认目录","sidebar.customPath":"自定义路径…","directoryPicker.selectDirectory":"选择目录","directoryPicker.goToParent":"转到上级目录","directoryPicker.directoryPath":"目录路径","directoryPicker.goToDirectory":"转到目录","directoryPicker.go":"转到","directoryPicker.loadingDirectories":"正在加载目录…","directoryPicker.noSubdirectories":"没有子目录","directoryPicker.openBeforeSelecting":"选择前请先打开此路径","directoryPicker.selectCurrentDirectory":"选择当前目录","directoryPicker.selectThisFolder":"选择此文件夹","directoryPicker.noDrives":"未找到盘符","directoryPicker.newDirectory":"新建目录","directoryPicker.createDirectory":"新建目录","directoryPicker.directoryName":"目录名","directoryPicker.directoryNamePlaceholder":"请输入目录名","directoryPicker.create":"创建","directoryPicker.creating":"正在创建…","sidebar.checking":"检查中…","sidebar.open":"打开","sidebar.cancel":"取消","sidebar.openRepoRoot":"打开仓库根目录","sidebar.openRepoRootTitle":"打开仓库根目录以管理 worktree。","sidebar.worktrees":"Worktrees...","sidebar.checkingWorktrees":"正在检查此目录的 worktree。","sidebar.filterWorktrees":"筛选 worktree…","sidebar.noMatchingWorktrees":"没有匹配的 worktree","sidebar.switchWorktree":"切换 worktree","sidebar.main":"主分支","sidebar.forceRemoveCheckout":"存在未提交的更改或子模块。强制移除 checkout?","sidebar.force":"强制移除","sidebar.createWorktreeTitle":"为分支创建 worktree checkout","sidebar.newWorktree":"新建 worktree…","sidebar.branchName":"分支名称","sidebar.creating":"创建中…","sidebar.create":"创建","sidebar.uploadFilesTitle":"将文件上传到项目根目录","sidebar.uploadFiles":"上传文件","sidebar.refreshExplorer":"刷新文件列表","sidebar.showIgnoredFiles":"显示被忽略的文件","sidebar.openInExplorer":"在资源管理器中打开","sidebar.openInFinder":"在访达中打开","sidebar.openInFileManager":"在文件管理器中打开","sidebar.openInExplorerRemoteOnly":"仅在 Pi Web 运行在本机时可用","sidebar.openInExplorerUnsupported":"当前平台不支持","sidebar.searchFiles":"搜索文件","sidebar.searchFilesPlaceholder":"搜索文件…","sidebar.searchingFiles":"搜索中…","sidebar.noMatchingFiles":"没有匹配的文件","sidebar.clearSearch":"清除搜索","sidebar.searchSessions":"搜索所有对话...","sidebar.toggleSessionSearch":"搜索对话","sidebar.sessionSearching":"搜索中...","sidebar.sessionSearchEmpty":"没有匹配的对话","sidebar.sessionSearchCount":"{count} 个匹配的对话","sidebar.sessionSearchPartial":"已达到搜索上限,结果可能不完整。","sidebar.sessionSearchFailed":"无法搜索对话","sidebar.changedFiles":"{count} 个变更文件","sidebar.loading":"加载中...","sidebar.noSessions":"未找到会话","sidebar.agentRunning":"Agent 运行中…","sidebar.agentAwaitingInput":"Agent 等待你的输入","sidebar.newActivity":"有新活动","sidebar.newSessionActivity":"会话有新活动","sidebar.deleteSession":"删除 {title}?","sidebar.rename":"重命名","sidebar.delete":"删除","sidebar.messagesCount":"{count} 条消息","sidebar.worktreePath":"Worktree:{path}","sidebar.removeWorktreeTitle":"移除 worktree checkout {path};保留分支","sidebar.removeWorktreeHeading":"移除 {name}","sidebar.brandLabel":"Pi Web,版本:web {app},pi {pi}","sidebar.tabsLabel":"侧边栏视图","sidebar.tabSessions":"会话","sidebar.tabFiles":"文件","sidebar.resizeFiles":"调整文件浏览器高度","sidebar.resizeFilesHint":"拖动调整高度。双击或按 Enter 恢复默认值。","sidebar.fileActions":"文件操作","sidebar.explorer":"文件","sidebar.collapseOtherGroups":"折叠其他项目","sidebar.expandAllGroups":"展开全部项目","sidebar.collapseAllGroups":"折叠全部项目","sidebar.pinned":"置顶","sidebar.pinnedProject":"已置顶","sidebar.pin":"置顶","sidebar.unpin":"取消置顶","sidebar.pinProject":"置顶项目","sidebar.unpinProject":"取消置顶项目","sidebar.renameProject":"重命名…","sidebar.resetProjectName":"恢复默认名称","sidebar.projectName":"项目名称","sidebar.moveProjectUp":"上移","sidebar.moveProjectDown":"下移","sidebar.archive":"归档","sidebar.unarchive":"取消归档","sidebar.restore":"恢复","sidebar.archived":"已归档","sidebar.archivedCount":"已归档 \xb7 {count}","sidebar.archivedToast":"已归档「{title}」","sidebar.archivedManyToast":"已归档 {count} 个会话","sidebar.restoredToast":"已恢复「{title}」","sidebar.restoredManyToast":"已恢复 {count} 个会话","sidebar.undo":"撤销","sidebar.viewArchive":"查看","sidebar.dismiss":"关闭","sidebar.markRead":"标为已读","sidebar.markUnread":"标为未读","sidebar.moreActions":"更多操作","sidebar.sessionActions":"会话操作","sidebar.showMore":"显示更多 \xb7 {count}","sidebar.showLess":"收起","sidebar.openOtherProject":"打开其他项目…","sidebar.newSessionInProject":"在 {name} 新建会话","sidebar.projectActions":"{name} 的操作","sidebar.archiveOlderThanWeek":"归档 7 天前的会话 \xb7 {count}","sidebar.openInFilesTab":"在文件中打开","sidebar.viewArchived":"查看已归档 \xb7 {count}","sidebar.archiveActions":"归档操作","sidebar.archivedProjectActions":"{name} 的已归档会话","sidebar.restoreAllArchived":"全部恢复 \xb7 {count}","sidebar.deleteAllArchived":"全部删除… \xb7 {count}","sidebar.deleteOldArchived":"删除 30 天前归档的会话… \xb7 {count}","sidebar.noLiveSessions":"还没有会话","sidebar.noArchived":"没有已归档的会话","sidebar.backToSessions":"返回","sidebar.cannotArchiveRunning":"运行中","sidebar.newWorktreeForSession":"新建 worktree 并在其中新建会话","sidebar.projectAndWorktree":"项目和 worktree","sidebar.uiStateFailed":"保存失败:{error}","sidebar.sessionNotFound":"该会话已不存在","sidebar.fork":"分叉","sidebar.openInNewTab":"在新标签页打开","sidebar.forkedToast":"已分叉「{title}」","sidebar.forkNotFound":"该会话已不存在","sidebar.forkUnsaved":"该会话尚未保存,请先发送一条消息。","sidebar.forkEmpty":"没有可分叉的内容:此分支还没有消息","sidebar.forkUnavailable":"无法分叉此会话","sidebar.forkFailed":"分叉失败:{error}","sidebar.deleteProjectSessions":"删除全部会话… \xb7 {count}","sidebar.deleteProjectSessionsHeading":"删除 {name} 的全部会话","sidebar.deleteProjectSessionsMessage":"置顶和已归档的会话也会删除,且无法撤销。","sidebar.deleteProjectSessionsRunning":"正在运行的会话会保留({count} 个)。","sidebar.deleteArchivedInProjectHeading":"删除 {name} 的已归档会话","sidebar.deleteAllArchivedHeading":"删除全部已归档会话","sidebar.deleteOldArchivedHeading":"删除 30 天前归档的会话","sidebar.deleteArchivedMessage":"它们的子代理会话也会删除,且无法撤销。","sidebar.deleteCount":"删除 {count} 个","sidebar.deletingSessions":"正在删除会话…","sidebar.deletedOneToast":"已删除 1 个会话","sidebar.deletedManyToast":"已删除 {count} 个会话","sidebar.keptRunningToast":"保留 {count} 个运行中的会话","sidebar.deleteFailed":"删除失败:{error}","files.modified":"已修改","files.added":"已添加","files.deleted":"已删除","files.renamed":"已重命名","files.untracked":"未跟踪","files.conflict":"冲突","files.newlyUploaded":"刚上传","files.containsChangedFiles":"包含已更改文件","files.hiddenIgnored":"已被 Git 忽略","files.hiddenExcluded":"默认隐藏(生成或依赖目录)","files.insertPath":"将路径插入聊天","files.mention":"提及","files.download":"下载文件","files.outsideLink":"链接到项目外部:{target}","files.outsideLinkEncloses":"该文件夹包含当前项目或你的主目录。","files.allowOutsideLink":"允许浏览","files.allowOutsideLinkTitle":"在 Pi Web 重启前允许浏览 {target},与将其选为项目目录相同","files.allowEnclosingLinkConfirm":"{target} 包含当前项目或你的主目录。允许后,在 Pi Web 重启前可浏览其下的所有内容。是否继续?","files.dismissError":"关闭错误","files.addUploadedFile":"将上传的文件添加到聊天","files.addAllUploadedFiles":"将所有上传的文件添加到聊天","files.dismissUploadResults":"关闭上传结果","files.loading":"正在加载文件...","files.noFiles":"未找到文件","files.changedCount":"{count} 个文件","files.changeStats":"{count} 个变更文件,新增 {additions} 行,删除 {deletions} 行","files.conflictSummary":"已有 {count} 个文件:{files}","files.cannotReplace":"无法替换:{files}","files.replace":"替换","files.skipExisting":"跳过已有文件","files.cancel":"取消","files.checking":"正在检查文件","files.uploading":"正在上传,{progress}%","files.dropToUpload":"松开鼠标,上传到 {directory}","chat.loadingSession":"正在加载会话...","chat.runningTool":"正在运行工具...","chat.generatingToolInput":"正在生成参数...","chat.truncatedByOutputLimit":"回复因达到模型输出长度上限而被截断。发送一条后续消息以继续。","chat.truncatedWithoutAnswer":"输出在生成正文前就达到了上限:额度被思考或接近占满的上下文耗尽。再发消息很可能再次截断。请先压缩上下文,或降低思考档位。","chat.runningNamedTool":"正在运行 {name}...","chat.runningTools":"正在运行 {names}...","chat.runningToolsMore":"正在运行 {names}(另有 {count} 个)...","chat.waitingModel":"正在等待模型...","chat.runningCommand":"正在运行命令...","chat.thinking":"正在思考...","chat.processDetails":"处理详情","chat.message":"条消息","chat.messages":"条消息","chat.toolCall":"次工具调用","chat.toolCalls":"次工具调用","chat.turnDuration":"耗时 {time}","chat.collapseProcess":"收起处理详情","chat.expandProcess":"展开处理详情","transcriptNotice.costSuffix":"(约 {cost})","transcriptNotice.cacheMiss":"缓存未命中:{tokens} Token 重新计费{cost}","transcriptNotice.cacheMissIdle":"空闲 {minutes} 分钟后缓存未命中:{tokens} Token 重新计费{cost}","transcriptNotice.cacheMissModelSwitch":"切换模型后缓存未命中:{tokens} Token 重新计费{cost}","transcriptNotice.cacheWarmed":"缓存已预热{note}:{cost}","transcriptNotice.cacheWarmedNote":"({note})","transcriptNotice.compactionCost":"本次压缩计费 {tokens} Token{cost}","transcriptNotice.branchSummaryCost":"分支摘要计费 {tokens} Token{cost}","transcriptNotice.thinkingDroppedOne":"Anthropic 丢弃了 1 个思考块(详情见会话文件)","transcriptNotice.thinkingDropped":"Anthropic 丢弃了 {count} 个思考块(详情见会话文件)","transcriptNotice.foldCacheMiss":"缓存未命中 {tokens} Token{cost}","transcriptNotice.foldCacheMisses":"缓存未命中 {count} 次 {tokens} Token{cost}","settings.cacheMissNotices":"显示缓存与费用提示","settings.cacheMissNoticesDescription":"即 pi 的 showCacheMissNotices:在对话中显示缓存未命中、缓存预热、压缩费用,以及 Anthropic 丢弃思考块。保存到全局 settings.json,项目的 .pi/settings.json 可以覆盖它。","chat.filesWritten":"改动的文件","chat.openWrittenFile":"打开 {name}","chat.loadEarlier":"向上滚动以加载更早的消息","chat.scrollToLatest":"回到最新消息","chat.extensionRequest":"扩展请求","chat.extensionExpiresIn":"{seconds} 秒后过期","chat.extensionPending":"待回答","chat.extensionCollapse":"收起","chat.extensionExpand":"展开","chat.extensionMaximize":"放大","chat.extensionRestoreSize":"还原尺寸","chat.extensionMoreWaiting":"还有 {count} 个","chat.cancel":"取消","chat.confirm":"确认","chat.submit":"提交","chat.extensionInput":"扩展终端输入","chat.extensionPanel":"扩展面板","chat.extensionWidgets":"扩展组件","chat.extensionWidgetAbove":"输入框上方组件","chat.extensionWidgetBelow":"输入框下方组件","chat.extensionWidgetLine":"{count} 行","chat.extensionWidgetLines":"{count} 行","chat.close":"关闭","chat.queued":"已排队 \xb7 {count}","chat.recall":"移回输入框","chat.recallTitle":"移除所有排队消息并将其放回输入框编辑","chat.retrying":"正在重试({attempt}/{max})…","chat.loadingCommands":"正在加载命令...","chat.slashCommands":"斜杠命令 \xb7 {label}","chat.tabEnter":"Tab / Enter","chat.noCommands":"未找到扩展、提示词或技能命令","chat.match":"1 个匹配项","chat.matches":"{count} 个匹配项","chat.command":"1 个命令","chat.commands":"{count} 个命令","chat.loadingFiles":"正在加载文件...","chat.files":"文件 \xb7 {label}{hint}","chat.searching":"搜索中…","chat.noMatchingFiles":"未找到匹配的文件","chat.searchingAll":" \xb7 正在搜索所有文件…","chat.indexTruncated":" \xb7 索引不完整","chat.steerPlaceholder":"立即引导 / 排队后续消息...","chat.agentPlaceholder":"Agent 运行中…","chat.messagePlaceholder":"消息…输入 / 使用命令,输入 @ 查找文件","chat.steer":"引导","chat.followUp":"后续消息","chat.steerHint":"在当前回复及其工具调用完成后送达(点“停止”可中断)","chat.followUpHint":"在 Agent 完成后排队此消息","chat.inputHistory":"输入历史","chat.modelError":"模型错误","chat.modelScopeWarning":"模型范围警告","chat.modelScopeWarnings":"模型范围警告","chat.send":"发送","chat.askSelection":"询问选中的文字","chat.askInCurrent":"在当前对话询问","chat.askInNewChat":"在新对话询问","chat.newQuoteChat":"关于选中文字的新对话","chat.quoteIntro":"关于这段内容:","chat.quoteQuestion":"我的问题是:","chat.quoteForkFailed":"无法从这条消息创建分支。","chat.attachFiles":"附加文件","chat.previewImage":"预览图片","chat.filterModels":"筛选模型…","chat.noMatchingModels":"没有匹配的模型","chat.saveDefaultModel":"使用并设为新会话默认模型","chat.defaultModel":"新会话默认模型","chat.saveDefaultThinking":"使用并设为新会话默认推理级别","chat.defaultThinking":"新会话默认推理级别","chat.moreControls":"更多控件","chat.collapseControls":"收起控件","chat.shell":"Shell","terminal.title":"终端","terminal.tabLabel":"终端:{name}","terminal.open":"打开工作区终端","terminal.close":"终止终端","terminal.restart":"重启终端","terminal.reconnect":"重新连接终端","terminal.lightTheme":"终端切换为浅色主题","terminal.darkTheme":"终端切换为深色主题","terminal.extraKeys":"终端按键","terminal.connecting":"连接中","terminal.ready":"已连接","terminal.exited":"终端已关闭","terminal.error":"连接错误","terminal.exitCode":"进程已退出,退出码 {code}","chat.outputLocal":"输出保留在本地","chat.outputModel":"输出发送给模型","chat.configuredTools":"取自 settings.json 的 defaultTools","chat.chatOnly":"仅聊天","chat.readOnlyTools":"{count} 个只读内置工具","chat.builtInTools":"{count} 个内置工具","chat.allBuiltInTools":"全部内置工具","chat.changeReasoning":"更改推理级别:{level}","chat.changeReasoningLabel":"更改推理级别","chat.currentReasoning":"本轮使用的推理级别:{level}","chat.changeToolPreset":"更改工具预设","chat.stopCompaction":"停止压缩","chat.compactContext":"压缩上下文","chat.compacting":"正在压缩…","chat.compact":"压缩","chat.dismissCompactError":"关闭压缩错误","chat.stopAgent":"停止 Agent","chat.stop":"停止","chat.disableSound":"关闭完成提示音","chat.enableSound":"开启完成提示音","chat.thinkingUseDefault":"使用 pi 默认设置","chat.thinkingOff":"关闭推理","chat.thinkingMinimal":"最低限度推理","chat.thinkingLow":"低强度推理","chat.thinkingMedium":"中等强度推理","chat.thinkingHigh":"高强度推理","chat.thinkingXhigh":"超高强度推理","chat.thinkingMax":"最高强度推理","chat.builtIn":"内置","chat.extensions":"扩展","chat.prompts":"提示词","chat.skills":"技能","chat.dormant":"休眠","chat.commandCompact":"压缩上下文,可选附加说明","chat.commandAutoCompact":"切换自动上下文压缩(全局设置)","chat.commandReload":"重新加载扩展、技能、提示词和工具","chat.commandName":"设置会话显示名称","chat.commandSession":"显示会话消息、Token 和费用统计","chat.commandCopy":"复制最后一条助手消息","chat.commandClone":"将当前分支复制为独立新会话","chat.compacted":"已压缩","chat.imageNotSupportedTitle":"图片可能无法发送","chat.imageNotSupportedBody":"当前选择的模型({model})不支持图片输入,附加的图片可能会被忽略。","chat.dropNeedsCwd":"请先选择工作目录,再添加文件。","chat.dropUploaded":"已将 {count} 个文件复制到工作目录","chat.dropAlreadyExists":"工作目录中已有同名文件,未覆盖,引用的是已有文件:{names}","chat.dropFoldersUnsupported":"不支持拖入文件夹,请拖入其中的文件:{names}","chat.dropFailed":"上传失败:{message}","chat.tokensSaved":"节省 {saved}","chatMinimap.earlierTurns":"更早的 {count} 轮还没加载,点击加载","chatMinimap.locateAssistant":"定位助手消息","chatMinimap.toolCalls":"本轮 {count} 次工具调用","chatMinimap.lockPreview":"锁定:悬停时不展开预览","chatMinimap.unlockPreview":"解锁悬停预览","i18n.close":"关闭","i18n.copy":"复制","i18n.copied":"已复制","i18n.cancel":"取消","i18n.save":"保存","i18n.saving":"保存中…","i18n.saved":"已保存","i18n.remove":"移除","i18n.removing":"移除中…","i18n.delete":"删除","i18n.loading":"加载中...","i18n.loadMore":"加载更多","i18n.search":"搜索","i18n.refresh":"刷新","providerUsage.usage":"用量","providerUsage.notQueried":"尚未查询","providerUsage.refresh":"刷新用量","providerUsage.refreshing":"正在刷新用量","providerUsage.updated":"更新于 {time}","providerUsage.queryFailed":"用量查询失败。","providerUsage.available":"可用","i18n.update":"更新","i18n.updating":"更新中...","i18n.check":"检查","i18n.checking":"检查中...","i18n.install":"安装","i18n.installing":"安装中...","i18n.noResults":"没有结果","i18n.searchProviders":"搜索 Provider…","i18n.noProviders":"没有匹配的 Provider","i18n.newModel":"新模型","i18n.addProvider":"添加 Provider","i18n.selectProviderModel":"选择 Provider 或模型","i18n.visibleInPrompt":"在模型提示词中可见,点击以禁用","i18n.hiddenFromPrompt":"在模型提示词中隐藏,点击以启用","i18n.dormant":"休眠","i18n.hiddenButInvocable":"对模型隐藏,仍可手动调用","i18n.skillSearchPlaceholder":"例如 react、testing、deploy","i18n.searching":"搜索中…","i18n.noSkills":"未找到技能","i18n.checkUpdates":"检查更新","i18n.updates":"项更新","i18n.noResolvedResources":"没有已解析资源","i18n.enablePackage":"启用包","i18n.disablePackage":"禁用包","i18n.filtered":"已筛选","i18n.openSessionToReload":"打开会话后才能重新加载","i18n.notFound":"未找到","i18n.noPlugins":"未配置插件","trust.resourcesNotLoaded":"受限模式","trust.trustProject":"信任项目","trust.trusting":"正在信任...","trust.cancel":"取消","trust.dialogTitle":"信任此项目?","trust.dialogBody":"项目资源可以运行本地代码。请仅信任你了解其内容的项目。","trust.skillsNotLoaded":"此项目尚未受信任,项目技能未加载。","trust.pluginsNotLoaded":"此项目尚未受信任,项目插件未加载。","trust.projectScopeUnavailable":"项目资源未加载时,无法安装到项目范围。","trust.mcp.title":".pi/mcp.json 中的 MCP 服务器","trust.mcp.intro":"信任此项目后,这些服务器即可在 Pi Web 和 pi CLI 中连接,两者共用这一信任决定。stdio 服务器会在运行 Pi Web 的计算机上执行其命令。","trust.mcp.loading":"正在读取 .pi/mcp.json…","trust.mcp.loadFailed":"无法列出此项目的 MCP 服务器。","trust.mcp.timedOut":"列出此项目的 MCP 服务器耗时过长。","trust.mcp.none":"该文件未声明任何服务器。","trust.mcp.unchecked":"Pi Web 无法加载 SDK 的 MCP 校验,以下条目未经校验。","trust.mcp.cwd":"工作目录:{path}","trust.close":"关闭","trust.alreadyTrusted":"此项目已受信任。","trust.trustFailed":"无法信任此项目。","mcp.transport.stdio":"stdio","mcp.transport.http":"HTTP","mcp.field.env":"环境变量 {name}","mcp.field.header":"请求头 {name}","mcp.field.oauthClientSecret":"oauth.clientSecret","mcp.server.invalid":"Pi 拒绝加载此条目,它不会连接:","mcp.server.webPassword":"引用了 PI_WEB_PASSWORD。Pi Web 会拒绝连接它,但 pi CLI 也会读取此文件;如果 CLI 的运行环境中设置了该变量,它就会把密码传出去:","mcp.server.disabled":"已在文件中关闭,不会连接。","mcp.server.commandFields":"每次连接都会执行 shell 命令:","mcp.server.replacesGlobal":"此项目受信任时,它会替换你的同名全局服务器。","mcp.server.overridesGlobal":"此项目受信任时,只更改你的同名全局服务器的 {keys}。","mcp.server.overridesGlobalNothing":"指向你的同名全局服务器,但没有更改 enabled、exposure 或 toolExposure。","mcp.server.masked":"疑似密钥的部分已隐藏。","mcp.server.hiddenCharacters":"包含不可见字符或控制字符,这里以 \\u{…} 代码显示。","mcp.server.sendsVariables":"每次连接都会把运行 Pi Web 的计算机上的环境变量发送给此服务器:","mcp.server.passesVariables":"会把运行 Pi Web 的计算机上的环境变量传给它启动的命令:","mcp.server.variableIn":"{field} 中的 {variable}","mcp.fileProblem.unparsable":"该文件不是有效的 JSON,其中的服务器都不会加载。","mcp.fileProblem.invalid-shape":'该文件不是包含 "mcpServers" 对象的对象,其中的服务器都不会加载。',"mcp.fileProblem.auto-enable-codemode-invalid":'"autoEnableCodemode" 必须是 true 或 false;服务器仍会加载。',"mcp.fileProblem.link-dangling":"该文件是指向不存在目标的符号链接,不会从中加载任何服务器。","mcp.fileProblem.link-outside":"该文件是指向 Pi Web 可读取文件夹之外的符号链接,因此这里不列出其中的服务器。项目受信任后,Pi 仍会加载它们。","mcp.fileProblem.not-a-file":"该路径不是普通文件,Pi Web 不会读取。","mcp.fileProblem.too-large":"该文件超过 1 MiB,因此这里不列出其中的服务器。项目受信任后,Pi 仍会加载它们。","mcp.fileProblem.too-many-servers":"该文件声明了超过 200 个服务器,因此这里不列出它们。项目受信任后,Pi 仍会加载它们。","mcp.fileProblem.unreadable":"Pi Web 无法读取该文件。","mcp.reason.cwd-invalid":"未提供项目文件夹,或它不是绝对路径。","mcp.reason.cwd-denied":"Pi Web 无权读取此文件夹。","mcp.reason.cwd-not-directory":"项目文件夹已不存在或不是文件夹。","mcp.reason.request-denied":"该请求并非来自此页面,Pi Web 已拒绝。","mcp.reason.content-type":"该请求不是以 JSON 发送的,Pi Web 已拒绝。","mcp.reason.trust-unreadable":"Pi Web 无法读取信任记录(trust.json),或它正被其他程序锁定。","mcp.reason.trust-not-required":"此项目已没有需要信任的资源。","mcp.reason.session-busy":"请等此文件夹中正在运行的会话结束后,再信任此项目。","mcp.reason.invalid-request":"该请求没有要求 Pi Web 能够进行的更改,Pi Web 已拒绝。","mcp.reason.mcp-off":"此 Pi Web 服务器上的 MCP 已关闭,因此不会更改任何服务器。","mcp.reason.project-untrusted":"此项目未受信任,Pi Web 不会更改它的 .pi/mcp.json。","mcp.reason.unparsable":"该文件不是有效的 JSON,Pi Web 没有改动它。","mcp.reason.invalid-shape":'该文件不是包含 "mcpServers" 对象的对象,Pi Web 没有改动它。',"mcp.reason.server-missing":"该文件已不再定义此服务器。","mcp.reason.entry-not-object":"此条目不是对象,因此无法开启或关闭。请将其移除,或在文件中修正。","mcp.reason.web-password":"它引用了 PI_WEB_PASSWORD,因此 Pi Web 不会开启它。","mcp.reason.undo-unavailable":"这次移除已无法撤销。","mcp.reason.undo-name-taken":"该文件又定义了同名的服务器,因此没有撤销这次移除。","mcp.reason.name-taken":"该文件已定义了同名的服务器。","mcp.reason.link-dangling":"该文件是指向不存在目标的符号链接,Pi Web 不会写入它。","mcp.reason.link-outside":"该文件是指向 Pi Web 可读取的文件夹之外的符号链接,Pi Web 不会写入它。","mcp.reason.not-a-file":"该路径不是普通文件,Pi Web 不会写入它。","mcp.reason.too-large":"该文件超过 1 MiB,Pi Web 不会写入它。","mcp.reason.too-many-servers":"该文件声明了超过 200 个服务器,Pi Web 不会对其中的条目执行操作。","mcp.reason.locked":"另一个程序正在写入该文件,请稍后再试。","mcp.reason.server-invalid":"Pi 拒绝此条目,因此 Pi Web 不会连接它。","mcp.reason.sign-in-not-oauth":"此服务器不通过 OAuth 登录:只有没有 Authorization 请求头的 HTTP 服务器才会这样登录。","mcp.reason.sign-in-unknown":"Pi Web 已不再记得这次登录:它已结束一段时间,或者 Pi Web 已重启。","mcp.reason.sign-in-not-waiting":"这次登录现在没有在等待地址。","mcp.reason.redirect-invalid":"这不是一个网址。请从浏览器地址栏复制完整的地址。","mcp.reason.redirect-state-mismatch":"该地址属于另一次登录。请粘贴这次登录后浏览器最终打开的地址。","mcp.reason.redirect-no-code":"该地址不含授权码。请粘贴你批准访问后浏览器最终打开的地址。","mcp.reason.redirect-denied":"授权服务器没有授予访问权限。请重新打开登录页,或取消。","mcp.reason.import-failed":"无法从粘贴的内容中读取服务器。","mcp.reason.fields-incomplete":"有些需要填写的值缺失或无效。","mcp.reason.name-invalid":"服务器名称只能使用字母、数字、_ 和 -。","mcp.reason.secret-global-only":"该服务器以明文保存了一个机密,因此只会保存在全局 mcp.json 中。","mcp.reason.host-env-confirm":"该服务器会收到运行 Pi Web 的计算机上的变量,请先确认。","mcp.reason.folder-not-fresh":"此文件夹已经变了:它现在有信任决定,或有需要信任的资源,因此 Pi Web 没有信任它,也没有添加任何内容。","mcp.reason.trust-too-broad":"信任此文件夹也会信任其中的各个文件夹,因此 Pi Web 不会自行这样做。","mcp.loadFailed":"无法读取 MCP 设置。","mcp.loadTimedOut":"Pi Web 没有及时响应。请点“刷新”重试。","mcp.projectNotListed":"未列出此项目的服务器:{reason}","mcp.serverCount":"已开启 {enabled}/{total} 个服务器","mcp.group.empty":"没有服务器","mcp.group.fileProblem":"未列出:请看下方的文件问题","mcp.group.notListed":"未列出","mcp.rowLabel":"{name}:{state}","mcp.state.on":"已开启","mcp.state.disabled":"已在文件中关闭","mcp.state.invalid":"被 Pi 拒绝","mcp.state.web-password":"已拒绝:引用了 PI_WEB_PASSWORD","mcp.state.not-trusted":"项目未受信任","mcp.state.replaced":"已被项目的同名服务器替换","mcp.state.overridden":"已被项目的覆盖设置更改","mcp.state.mcp-off":"MCP 已关闭","mcp.stateShort.invalid":"已拒绝","mcp.stateShort.web-password":"已拒绝","mcp.stateShort.disabled":"已关闭","mcp.stateShort.not-trusted":"未受信任","mcp.stateShort.replaced":"已替换","mcp.stateShort.overridden":"已覆盖","mcp.server.shadowedByProject":"此项目受信任时,项目中的同名服务器会替换这个服务器。","mcp.server.overriddenByProject":"此项目受信任时,项目的 .pi/mcp.json 会更改这个服务器的设置。","mcp.server.unchecked":"未经校验:Pi Web 无法加载 SDK 的 MCP 校验。","mcp.detail.description":"简介","mcp.detail.transport":"传输方式","mcp.detail.command":"命令","mcp.detail.url":"URL","mcp.detail.cwd":"工作目录","mcp.detail.env":"环境变量","mcp.detail.headers":"请求头","mcp.detail.valuesHidden":"这里不显示其值。","mcp.detail.shellCommands":"Shell 命令","mcp.detail.variables":"主机环境变量","mcp.detail.signIn":"登录","mcp.detail.exposure":"工具","mcp.detail.file":"文件","mcp.detail.inProject":"此项目","mcp.inProject.saved":"只对此项目生效,保存在项目的 .pi/mcp.json。","mcp.inProject.overridden":"此项目的 .pi/mcp.json 改了它的 {keys}。","mcp.inProject.refused":"此项目的 .pi/mcp.json 覆盖了它,但 pi 不接受。","mcp.inProject.turnOff":"在此项目中关闭","mcp.inProject.turnOn":"在此项目中开启","mcp.inProject.show":"查看","mcp.signIn.signedIn":"已登录。","mcp.signIn.notSignedIn":"未登录。","mcp.signIn.registrationOnly":"未登录,但保存了此服务器的客户端注册信息或未完成的登录。","mcp.signIn.unknown":"未知:无法读取 mcp-auth.json。","mcp.signIn.header":"Authorization 请求头","mcp.signIn.provider":"发送 pi 提供商 {provider} 的令牌:在“设置 › 模型”中登录它。","mcp.exposure.codemode":"只列出服务器名称和简介,代码模式脚本按需搜索它的工具。","mcp.exposure.deferred":"工具搜索加载后才声明,不需要代码模式。","mcp.exposure.direct":"每次请求都带全部工具的完整声明,最占 token。","mcp.exposure.hidden":"已注册但无法调用。","mcp.exposure.sandboxUnavailable":"代码模式无法在此 Pi Web 服务器上运行,因此这些工具改为通过工具搜索调用。","mcp.exposure.builtinDisabled":"-builtin:codemode 关闭了代码模式,因此只有在工具搜索开启时才能调用这些工具。","mcp.exposure.autoEnableOff":"{path} 中的 autoEnableCodemode 为 false,因此会话不会为这些工具开启代码模式:只有代码模式设为“始终开启”或工具搜索开启时才能调用它们。","mcp.exposure.label":"{name} 的工具如何提供给模型","mcp.exposure.optionDefault":"{label}(默认)","mcp.exposure.toolOverrides":"toolExposure 中的 {count} 条规则不受影响。","mcp.exposure.toolSearchDisabled":"{path} 中的 -builtin:tool-search 关闭了工具搜索,因此这些工具只能在代码模式开启时由代码模式脚本调用。","mcp.exposure.toolSearchDisabledUnknown":"-builtin:tool-search 关闭了工具搜索,因此这些工具只能在代码模式开启时由代码模式脚本调用。","mcp.empty":"还没有 MCP 服务器。{globalPath} 和项目 .pi/mcp.json 中的服务器会显示在这里。","mcp.emptyFileProblem":"无法列出任何服务器:请看下方的文件问题。","mcp.selectItem":"选择一个服务器或代码模式。","mcp.unavailable.operator-disabled":"MCP 已关闭:运行 Pi Web 的环境设置了 PI_WEB_DISABLE_MCP。服务器会列出,但没有会话会连接它们。","mcp.unavailable.internals-unavailable":"MCP 已关闭:Pi Web 无法加载 SDK 的 MCP 模块。服务器未经校验地列出,没有会话会连接它们。","mcp.unavailable.builtin-disabled":"MCP 已关闭:{path} 中的 extensions 设置关闭了 builtin:mcp,没有会话会连接这些服务器。","mcp.unavailable.builtin-disabled-unknown":"MCP 已关闭:某个 extensions 设置关闭了 builtin:mcp,没有会话会连接这些服务器。","mcp.trust.untrusted":"此项目未受信任,其 .pi/mcp.json 中的服务器不会连接。","mcp.trust.untrustedThrough":"此项目未受信任({path} 被标记为不受信任),其 .pi/mcp.json 中的服务器不会连接。","mcp.trust.trustedThrough":"通过 {path} 受信任:此项目 .pi/mcp.json 中的服务器会连接,它下面的每个文件夹都是如此。","mcp.trust.unreadable":"Pi Web 无法读取信任记录(trust.json),因此暂时把此项目的服务器视为未受信任。","mcp.trust.trustButton":"信任项目…","mcp.footer.fileProblem":"1 个文件问题","mcp.footer.fileProblems":"{count} 个文件问题","mcp.codemode.title":"代码模式","mcp.codemode.rowLabel":"代码模式:{state}","mcp.codemode.intro":"让模型写一小段脚本来调用工具,MCP 工具默认用这种方式调用。改动只对之后新建的会话生效。","mcp.codemode.automatic":"自动","mcp.codemode.always":"始终开启","mcp.codemode.unavailable":"不可用","mcp.codemode.mode":"模式","mcp.codemode.automaticDescription":"有使用代码模式的 MCP 服务器连上时自动开启。","mcp.codemode.alwaysDescription":"会话启动时即开启代码模式。","mcp.codemode.preferenceError":"无法读取全局设置文件:","mcp.codemode.sandbox":"沙箱","mcp.codemode.sandbox.available":"可用。","mcp.codemode.sandbox.unavailable":"无法在此 Pi Web 服务器上运行,因此没有会话提供代码模式:","mcp.codemode.sandbox.not-checked":"尚未检查:Pi Web 启动后的第一个会话开始时才会运行自检。","mcp.codemode.builtin":"扩展","mcp.codemode.builtinDisabled":"已被 {path} 中的 -builtin:codemode 关闭。","mcp.codemode.builtinDisabledUnknown":"已被某个 extensions 设置中的 -builtin:codemode 关闭。","mcp.codemode.builtinDisabledProject":"{path} 中的 -builtin:codemode 为此项目的会话关闭了代码模式。“始终开启”仍对其他文件夹中的会话生效。","mcp.codemode.autoEnableOff":"{path} 中的 autoEnableCodemode 为 false,因此“自动”永远不会开启代码模式;使用代码模式公开方式的服务器,其工具只有在工具搜索开启时才能调用。","mcp.codemode.saveFailed":"无法保存此选择:","mcp.codemode.saveTimedOut":"Pi Web 没有及时响应,此选择可能未保存。","mcp.codemode.alwaysUnavailable.sandbox":"“始终开启”不可用:代码模式的沙箱无法在此 Pi Web 服务器上运行。","mcp.codemode.alwaysUnavailable.builtin":"“始终开启”不可用:{path} 中的 -builtin:codemode 关闭了代码模式。","mcp.codemode.projectOverride.always":"此项目自行决定:{path} 中的 defaultTools 让其会话启动时即开启代码模式,无论你在此处如何选择。","mcp.codemode.projectOverride.automatic":"此项目自行决定:{path} 中的 defaultTools 让其会话启动时不开启代码模式,与“自动”相同,无论你在此处如何选择。","mcp.codemode.toolMode":"内置工具","mcp.codemode.toolMode.on":"直接调用","mcp.codemode.toolMode.only":"脚本调用","mcp.codemode.toolMode.onDescription":"模型直接调用 read、bash 等工具。","mcp.codemode.toolMode.onlyDescription":"代码模式开启时,模型只在脚本中调用 read、bash 等工具。","mcp.codemode.toolMode.automaticNote":"模式为“自动”时,要等代码模式开启后才生效。","mcp.codemode.toolMode.invalid":'{path} 中的 codemode.mode 为 {value},pi 会把它当作 "on"。选择任一选项都会替换它。',"mcp.codemode.toolMode.projectOverride.on":"此项目自行决定:{path} 中的 codemode 让其会话仍向模型声明这些工具,无论你在此处如何选择。","mcp.codemode.toolMode.projectOverride.only":"此项目自行决定:{path} 中的 codemode.mode 让其会话只在脚本中调用这些工具,无论你在此处如何选择。","mcp.codemode.toolMode.saveFailed":"无法保存此设置:","mcp.codemode.inlineBudget":"工具清单预算","mcp.codemode.inlineBudget.unit":"token","mcp.codemode.inlineBudget.save":"保存","mcp.codemode.inlineBudget.description":"代码模式说明里列出工具最多用的 token 数,列不下的由脚本用 searchTools() 查找。留空使用默认值 {default}。","mcp.codemode.inlineBudget.invalidDraft":"请输入 0 到 {max} 之间的整数,或留空。","mcp.codemode.inlineBudget.invalid":"{path} 中的 codemode.inlineBudget 为 {value},pi 会忽略它,因此会话使用 {default}。保存会替换它。","mcp.codemode.inlineBudget.projectOverride":"此项目自行决定:{path} 中的 codemode.inlineBudget 让其会话使用 {value},无论你在此处保存什么。","mcp.codemode.inlineBudget.projectOverrideDefault":"此项目自行决定:{path} 中的 codemode 让其会话使用 pi 的默认值 {default},无论你在此处保存什么。","mcp.codemode.inlineBudget.saveFailed":"无法保存此预算:","mcp.readOnly.mcp-off":"MCP 关闭期间,无法在此更改服务器。","mcp.readOnly.project-untrusted":"在此项目受信任之前,Pi Web 不会更改它们。","mcp.readOnly.trust-unreadable":"在能够读取信任记录之前,Pi Web 不会更改它们。","mcp.write.savedWhileOff":"更改会保存到文件中,但在 builtin:mcp 关闭期间,没有会话会连接这些服务器。","mcp.server.switchOn":"开启 {name}","mcp.server.switchOff":"关闭 {name}","mcp.groupSwitchOn":"关闭 {group} 中的所有服务器","mcp.groupSwitchOff":"开启 {group} 中的所有服务器","mcp.groupKeptOff":"有 {count} 个引用 PI_WEB_PASSWORD 的服务器保持关闭。","mcp.bulkFailed":"{total} 个服务器中有 {count} 个未能更改:","mcp.actionFailed":"无法更改该服务器:","mcp.actionTimedOut":"Pi Web 没有及时响应,更改可能未生效。","mcp.removed":"已从 {path} 移除 {name}。","mcp.undo":"撤销","mcp.undoing":"正在撤销…","mcp.undoFailed":"无法撤销:","mcp.state.connected":"测试时已连接","mcp.state.needs-auth":"需要登录","mcp.state.failed":"测试时未能连接","mcp.stateShort.needs-auth":"需登录","mcp.stateShort.failed":"失败","mcp.exposureShort.codemode":"代码模式","mcp.exposureShort.deferred":"工具搜索","mcp.exposureShort.direct":"直接声明","mcp.exposureShort.hidden":"已隐藏","mcp.test.button":"测试连接","mcp.test.testing":"正在测试…","mcp.test.never":"尚未测试。","mcp.test.serial":"它会执行 shell 命令,因此测试要等其他此类测试结束。","mcp.test.blocked.mcp-off":"此 Pi Web 服务器上的 MCP 已关闭,因此不会测试任何服务器。","mcp.test.blocked.project-untrusted":"此项目未受信任,因此 Pi Web 不会启动它的服务器。","mcp.test.blocked.trust-unreadable":"Pi Web 无法读取信任记录(trust.json),因此不会启动此项目的服务器。","mcp.test.blocked.invalid":"Pi 拒绝此条目,因此没有可测试的内容。","mcp.test.blocked.web-password":"它引用了 PI_WEB_PASSWORD,因此 Pi Web 不会连接它。","mcp.test.refused.entry-not-object":"此条目不是对象,因此没有可测试的内容。请在文件中修正。","mcp.test.refused.invalid-request":"该请求没有指明 Pi Web 能够测试的服务器,Pi Web 已拒绝。","mcp.test.refused.unparsable":"该文件不是有效的 JSON,Pi Web 无法读取此条目进行测试。","mcp.test.refused.invalid-shape":'该文件不是包含 "mcpServers" 对象的对象,Pi Web 无法读取此条目进行测试。',"mcp.test.refused.link-dangling":"该文件是指向不存在目标的符号链接,Pi Web 无法读取此条目进行测试。","mcp.test.refused.link-outside":"该文件是指向 Pi Web 可读取的文件夹之外的符号链接,Pi Web 不会测试其中的服务器。","mcp.test.refused.not-a-file":"该路径不是普通文件,Pi Web 不会读取它来测试此条目。","mcp.test.refused.too-large":"该文件超过 1 MiB,Pi Web 不会读取它来测试此条目。","mcp.test.refused.too-many-servers":"该文件声明了超过 200 个服务器,Pi Web 不会读取它来测试此条目。","mcp.test.state.connected":"已连接","mcp.test.state.needs-auth":"需要登录","mcp.test.state.failed":"未能连接","mcp.test.state.timedOut":"无响应","mcp.test.summary.connected":"列出了 {count} 个工具,用时 {seconds} 秒,测试于 {time}。","mcp.test.summary.needs-auth":"服务器要求 OAuth 登录。测试于 {time}。","mcp.test.summary.failed":"{seconds} 秒后放弃,测试于 {time}。","mcp.test.summary.timedOut":"它在 {seconds} 秒内没有响应,因此 Pi Web 已停止测试。测试于 {time}。","mcp.test.error":"错误:","mcp.test.stderr":"它最后写入 stderr 的内容:","mcp.test.serverInfo":"服务器:{name} {version}","mcp.test.resources":"提供资源。","mcp.test.ranIn":"运行于 {path}。","mcp.test.queued":"等待了 {seconds} 秒,因为另一个会执行 shell 命令的服务器正在测试。","mcp.test.readOnly":"只读","mcp.test.moreTools":"另有 {count} 个未显示。","mcp.test.queueTimedOut":"另一个会执行 shell 命令的服务器的测试没有及时完成,因此此测试没有开始。请重试。","mcp.test.requestFailed":"无法测试该服务器:","mcp.test.requestTimedOut":"Pi Web 没有及时响应。测试可能仍会完成,按“刷新”查看结果。","mcp.state.connecting":"正在会话中连接","mcp.state.disconnected":"会话中的连接已断开","mcp.state.conflict":"名称已被其他扩展占用","mcp.state.session.connected":"已在会话中连接","mcp.state.session.failed":"未能在会话中连接","mcp.stateShort.connecting":"连接中","mcp.stateShort.disconnected":"已断开","mcp.stateShort.conflict":"冲突","mcp.stateDetail.disconnected":"该会话会在下次调用它的工具时重新连接。","mcp.stateDetail.conflict":"请在文件中重命名此条目,或关闭那个扩展。","mcp.session.state.connecting":"连接中","mcp.session.state.connected":"已连接","mcp.session.state.needs-auth":"需要登录","mcp.session.state.failed":"未能连接","mcp.session.state.disconnected":"已断开","mcp.session.state.conflict":"名称已被占用","mcp.session.state.not-trusted":"未读取","mcp.session.state.closed":"已关闭","mcp.session.summary.connecting":"{path} 中的一个会话于 {time} 开始连接它。","mcp.session.summary.connected":"{path} 中的一个会话于 {time} 连接了它。","mcp.session.summary.needs-auth":"服务器于 {time} 要求 {path} 中的一个会话进行 OAuth 登录。","mcp.session.summary.failed":"{path} 中的一个会话于 {time} 未能连接它。","mcp.session.summary.disconnected":"{path} 中一个会话的连接于 {time} 断开。","mcp.session.summary.conflict":"{path} 中的一个会话于 {time} 发现该名称已被占用,因此没有连接此条目。","mcp.session.summary.not-trusted":"{path} 中的一个会话于 {time} 没有读取它,因为当时没有任何决定信任该项目。","mcp.session.summary.closed":"{path} 中的会话 {time} 连接,{closedTime} 关闭。","mcp.session.conflictOwner":"先注册该名称的扩展:","mcp.hostInactive":"{path} 中的一个会话不会通过 Pi Web 连接这些服务器:它的 /mcp 命令来自 {owner},而不是 Pi 内置的 MCP 扩展。那个扩展可能会读取 mcp.json,并以自己的方式连接它们。","mcp.signIn.button":"登录","mcp.signIn.starting":"正在开始…","mcp.signIn.cancel":"取消登录","mcp.signIn.cancelling":"正在取消…","mcp.signIn.cancelFailed":"无法取消登录:","mcp.signIn.cancelTimedOut":"Pi Web 没有及时响应。登录可能仍在进行;一旦有进展,这里会显示。","mcp.signIn.signOut":"退出登录","mcp.signIn.signingOut":"正在退出登录…","mcp.signIn.replaces":"登录可能会替换此服务器已保存的令牌和注册信息。","mcp.signIn.signOutExplain":"退出登录会删除此服务器保存的令牌和注册信息,已打开的会话在下次请求时失去访问权限。","mcp.signIn.shared":"另一个同名的 {name} 条目使用相同的 URL,这是它的登录:令牌对两者都有效。","mcp.signIn.shared.done":"已通过另一个同名的 {name} 条目登录,它使用相同的 URL,因此令牌对此条目同样有效。按“测试连接”查看此条目的服务器提供的内容。","mcp.signIn.shared.already":"另一个同名的 {name} 条目使用相同的 URL,并且已经登录,因此令牌对此条目同样有效。按“测试连接”查看此条目的服务器提供的内容。","mcp.signIn.shared.connect-failed":"通过另一个同名的 {name} 条目(使用相同的 URL)进行的登录没有可登录的内容:该条目的服务器没有连接成功,也没有要求登录。它的“状态”一行说明了原因。","mcp.signIn.phase.connecting":"正在检查服务器是否要求登录…","mcp.signIn.phase.starting":"正在通过服务器的授权服务器准备登录…","mcp.signIn.phase.finishing":"正在完成登录…","mcp.signIn.phase.noCancel":"授权服务器已经回应,因此这一步无法再取消。","mcp.signIn.authorize.message":"打开登录页并批准访问。浏览器回到运行 Pi Web 的计算机后,登录会自动完成。如果浏览器在另一台设备上,或者它最终打开的页面无法加载,请复制该页面的地址并粘贴到这里。","mcp.signIn.authorize.link":"登录页:","mcp.signIn.authorize.notALink":"服务器给出的登录页不是网址,因此只以文本显示:","mcp.signIn.authorize.redirect":"批准后,浏览器会被发送到 {url},只有运行 Pi Web 的计算机才能打开它。","mcp.signIn.authorize.wait":"Pi Web 从登录开始起最多等待 5 分钟。","mcp.signIn.paste.label":"浏览器最终打开的地址","mcp.signIn.paste.placeholder":"http://127.0.0.1:…/callback?code=…","mcp.signIn.paste.submit":"继续","mcp.signIn.paste.checking":"正在检查…","mcp.signIn.paste.refused":"该地址无法完成这次登录:","mcp.signIn.paste.timedOut":"Pi Web 没有及时响应。如果它已接收该地址,这里会显示登录的进展。","mcp.signIn.done.already":"已经登录:服务器无需重新登录就连接上了。","mcp.signIn.done.signedIn":"已登录。上方的“状态”显示服务器提供的内容。","mcp.signIn.done.refreshed":"已使用保存的刷新令牌重新登录,无需浏览器。上方的“状态”显示服务器提供的内容。","mcp.signIn.done.failedAfter":"已登录,但之后服务器没有连接成功。上方的“状态”说明了原因。","mcp.signIn.done.needsAuthAfter":"已登录,但 Pi Web 再次连接时,服务器仍要求登录。","mcp.signIn.done.notConnected":"已登录。按“测试连接”查看服务器提供的内容。","mcp.signIn.cancelled":"已取消登录。","mcp.signIn.expired":"登录没有在 5 分钟内完成,因此 Pi Web 停止了等待。","mcp.signIn.failed.connect-failed":"服务器没有连接成功,也没有要求登录,因此没有可登录的内容。上方的“状态”说明了原因。","mcp.signIn.failed.queue-timed-out":"另一个会执行 shell 命令的服务器的测试没有及时完成,因此登录没有开始。请重试。","mcp.signIn.failed.sign-in-failed":"登录失败。","mcp.signIn.failed.internal":"登录意外失败。","mcp.signIn.gone":"Pi Web 已不再记得这次登录:它已结束一段时间,或者 Pi Web 已重启。按“登录”重新开始。","mcp.signIn.requestFailed":"无法登录:","mcp.signIn.requestTimedOut":"Pi Web 没有及时响应。再按一次“登录”可查看正在进行的登录。","mcp.signIn.signOutFailed":"无法退出登录:","mcp.signIn.signedOutDone":"已退出登录:为该服务器保存的令牌已删除。","mcp.signIn.signedOutNothing":"该服务器没有保存任何内容,因此无需退出登录。","mcp.signIn.blocked.mcp-off":"此 Pi Web 服务器上的 MCP 已关闭,因此不会登录任何服务器。","mcp.signIn.blocked.project-untrusted":"此项目未受信任,因此 Pi Web 不会登录或退出它的服务器。","mcp.signIn.blocked.trust-unreadable":"Pi Web 无法读取信任存储(trust.json),因此不会登录或退出此项目的服务器。","mcp.signIn.blocked.invalid":"Pi 拒绝此条目,因此没有可登录的内容。","mcp.signIn.refused.file":"Pi Web 已无法从文件中读取此条目。请按“刷新”。","mcp.signIn.refused.invalid-request":"Pi Web 拒绝了该请求,因为它没有指明一个可以登录的服务器。","mcp.signIn.summary.connected":"已登录,随后列出了 {count} 个工具,用时 {seconds} 秒,时间 {time}。","mcp.signIn.summary.needs-auth":"已登录,但服务器在 {time} 仍要求登录。","mcp.signIn.summary.failed":"已登录,但连接在 {seconds} 秒后放弃,时间 {time}。","mcp.signIn.summary.timedOut":"已登录,但服务器没有在 {seconds} 秒内响应,时间 {time}。","mcp.add.action":"添加 MCP","mcp.add.title":"添加 MCP","mcp.add.inputLabel":"要添加的服务器","mcp.add.placeholder":'https://mcp.example.com/mcp\nnpx -y @scope/server\nclaude mcp add …\n{ "mcpServers": { … } }',"mcp.add.examples":"支持的格式(点击填入示例)","mcp.add.rawPi":"启用 pi mcp 语法,支持 $NAME 和 !command","mcp.add.rawPiOn":"环境变量和请求头里的 $NAME 会读取运行 Pi Web 的计算机上的变量,以 ! 开头的值每次连接都会作为命令执行。","mcp.add.serverLabel":"服务器","mcp.add.serverCount":"这段内容包含 {count} 个服务器,请逐个添加。","mcp.add.preview":"预览","mcp.add.readAs":"识别为","mcp.add.previewUnfilled":"尚未填写的值按粘贴内容中的原样显示。","mcp.add.fields":"需要填写的值","mcp.add.field.optional":"可选:留空时,它所属的值会被省略。","mcp.add.field.optionalHeader":"可选:留空则不发送请求头 {name}。","mcp.add.field.slot":"填写的值","mcp.add.field.storedAs":"保存为 {value}。","mcp.add.field.storedAsVariable":"保存为 {value}:pi 每次连接时读取该变量,值本身不会写入 mcp.json。","mcp.add.field.useVariable":"从运行 Pi Web 的计算机上的变量读取","mcp.add.field.variableName":"{field} 的变量","mcp.add.field.variableHint":"保存为 ${…}:pi 每次连接时读取该变量,值本身不会写入 mcp.json。","mcp.add.field.choose":"请选择…","mcp.add.secrets":"粘贴内容中的机密","mcp.add.secret.holds":"以明文保存了一个机密。","mcp.add.secret.storedAs":"保存为 {value}:pi 每次连接时读取该变量,机密不会写入 mcp.json。","mcp.add.secret.asPasted":"按粘贴的内容保存到 mcp.json,因此该服务器只能保存在全局文件中。","mcp.add.nameInvalid":"服务器名称只能使用字母、数字、_ 和 -。","mcp.add.nameTaken":"{path} 中已有名为 {name} 的服务器。","mcp.add.useName":"使用 {name}","mcp.add.button":"添加","mcp.add.buttonTrust":"添加并信任此文件夹","mcp.add.adding":"正在添加…","mcp.add.trustExplain":"此文件夹还没有信任决定,而写入 .pi/mcp.json 会让它需要一个,因此“添加”会在同一步中信任 {path}。pi CLI 共用这个决定,其中的每个文件夹也都会受信任。","mcp.add.afterAdd":"添加后会测试一次连接。","mcp.add.failed":"未添加:","mcp.add.trustKept":"Pi Web 为这一步信任了 {folder},但无法撤销,因此该文件夹仍受信任。","mcp.add.hostEnv.body":"它的请求头或 OAuth 客户端密钥读取了 {names},这些变量已在运行 Pi Web 的计算机上设置,pi 每次连接都会把它们的值发送给服务器。只有当此服务器应当获得这些值时才添加它。","mcp.add.hostEnv.confirm":"添加并发送这些值","mcp.add.blocked.nothing":"还没有可添加的内容:粘贴的内容中没有 pi 能用的服务器。","mcp.add.blocked.fields":"请先填写 {fields}。","mcp.add.blocked.fieldsInvalid":"请先更正 {fields}。","mcp.add.blocked.web-password":"它引用了 PI_WEB_PASSWORD,因此 Pi Web 不会添加它。","mcp.add.refused.server-invalid":"按所填的值,pi 会拒绝它:{error}","mcp.add.projectBlocked.no-project":"打开一个项目后,才能把服务器添加到它的 .pi/mcp.json。","mcp.add.projectBlocked.project-not-listed":"未列出项目文件夹,因此不会写入它的 .pi/mcp.json。","mcp.add.projectBlocked.trust-unreadable":"Pi Web 无法读取信任记录(trust.json),因此不会写入此项目的 .pi/mcp.json。","mcp.add.projectBlocked.project-untrusted":"此项目未受信任,因此 Pi Web 不会写入它的 .pi/mcp.json。请先信任它。","mcp.add.projectBlocked.untrusted-decision":"此文件夹被标记为不受信任,因此其 .pi/mcp.json 中的服务器永远不会连接。","mcp.add.projectBlocked.secret":"{fields} 以明文保存了一个机密,因此该服务器只能保存在全局。要保存在项目中,请为它选择“从运行 Pi Web 的计算机上的变量读取”。","mcp.add.projectBlocked.secretFixed":"{fields} 在 pi 不读取变量的位置(URL、命令或其参数)以明文保存了一个机密,因此该服务器只能保存在全局。","mcp.add.projectBlocked.folder-not-fresh":"此文件夹的 .pi 下,或其上层某个 .agents/skills 文件夹中,有一个指向不存在目标的链接。目标出现后它就需要信任,因此 Pi Web 不会自行信任此文件夹。请删除或修复该链接,然后点击“刷新”。","mcp.add.projectBlocked.file-problem":"无法写入 {path}:{reason}","mcp.add.projectBlocked.trust-too-broad.home":"这是你的主目录。Pi Web 不会自行信任它,因为其中的每个文件夹都会一并受信任;请把服务器添加到全局。","mcp.add.projectBlocked.trust-too-broad.root":"这是文件系统的根目录。Pi Web 不会自行信任它,因为其中的每个文件夹都会一并受信任;请把服务器添加到全局。","mcp.add.projectBlocked.trust-too-broad.contains-home":"此文件夹包含你的主目录({path})。Pi Web 不会自行信任它,因为其中的每个文件夹都会一并受信任;请把服务器添加到全局。","mcp.add.projectBlocked.trust-too-broad.contains-agent-dir":"此文件夹包含 Pi 的 agent 文件夹({path})。Pi Web 不会自行信任它,因为其中的每个文件夹都会一并受信任;请把服务器添加到全局。","mcp.add.projectBlocked.trust-too-broad.contains-folder":"此文件夹包含 Pi Web 已知的另一个文件夹 {path},信任它也会信任那个文件夹。Pi Web 不会自行这样做;请把服务器添加到全局。","mcp.add.projectBlocked.trust-too-broad.contains-project":"此文件夹包含 {path},这是一个带有需要信任的资源、且自身尚无信任决定的项目,信任此文件夹也会信任它。Pi Web 不会自行这样做;请把服务器添加到全局,或打开那个项目单独信任它。","mcp.add.projectBlocked.trust-too-broad.too-many-folders":"此文件夹包含的文件夹太多,Pi Web 无法确认信任它不会同时信任其中的项目。Pi Web 不会自行信任它;请把服务器添加到全局。","mcp.add.added":"已把 {name} 添加到 {path}。","mcp.add.addedTrusted":"已把 {name} 添加到 {path},并信任了 {folder}。","mcp.add.addedTrustedHere":"已把 {name} 添加到 {path},并信任了此文件夹。","mcp.add.testing":"正在测试连接…","mcp.add.needsSignIn":"它要求登录。","mcp.add.source.url":"URL","mcp.add.source.command-line":"命令行","mcp.add.source.pi-mcp-add":"pi mcp add","mcp.add.source.claude-mcp-add":"claude mcp add","mcp.add.source.claude-mcp-add-json":"claude mcp add-json","mcp.add.source.codex-mcp-add":"codex mcp add","mcp.add.source.gemini-mcp-add":"gemini mcp add","mcp.add.source.vscode-add-mcp":"code --add-mcp","mcp.add.source.mcp-servers-json":"mcpServers 配置(Claude、Cursor、Gemini…)","mcp.add.source.vscode-json":"VS Code 的 mcp.json","mcp.add.source.zed-json":"Zed 设置","mcp.add.source.opencode-json":"opencode 配置","mcp.add.source.server-object":"单个服务器的 JSON","mcp.add.source.server-map":"按名称列出的服务器(JSON)","mcp.add.source.registry-server-json":"MCP 注册表的 server.json","mcp.add.source.cursor-install-link":"Cursor 安装链接","mcp.add.source.vscode-install-link":"VS Code 安装链接","mcp.add.source.visual-studio-install-link":"Visual Studio 安装链接","mcp.add.source.copilot-app-install-link":"GitHub Copilot 应用链接","mcp.importNote.forServer":"{server}:{note}","mcp.importNote.empty-input":"还没有可读取的内容:请粘贴 URL、命令行或配置。","mcp.importNote.unrecognized-input":"Pi Web 无法识别这段内容。请粘贴服务器的 URL、启动它的命令、mcp add 命令、JSON 配置或安装链接。","mcp.importNote.invalid-json":"这看起来像 JSON,但无法解析:{detail}","mcp.importNote.no-servers-found":"此配置中没有找到 MCP 服务器。","mcp.importNote.shell-operator":"命令行用到了 shell 运算符 {operator}。请只粘贴启动服务器的那条命令。","mcp.importNote.shell-command-substitution":"命令行用到了 {syntax},只有 shell 才会执行它。请直接写出该值。","mcp.importNote.shell-multiple-commands":"这里包含不止一条命令。请只粘贴启动服务器的那条。","mcp.importNote.shell-unterminated-quote":"有一个 {quote} 引号没有闭合。","mcp.importNote.shell-parameter":"命令行用到了 shell 参数 {parameter},Pi Web 无法填入它。","mcp.importNote.shell-expansion":"命令行用到了 {expansion},只有 shell 才会展开它。请直接写出该值。","mcp.importNote.unsupported-url-scheme":"{scheme}: 地址不是服务器:pi 只连接 http 和 https URL。","mcp.importNote.github-repo-link":"这是 GitHub 仓库 {repository},不是服务器。请从它的 README 复制安装命令、URL 或配置。","mcp.importNote.github-mcp-page":"这是 {name} 在 github.com/mcp 上的页面。它的“安装”按钮会打开其他应用,无法粘贴到这里;请改为从服务器的 README 复制 Cursor 或 VS Code 安装徽章的链接。","mcp.importNote.github-page":"这个 GitHub 页面不是服务器。请从服务器的 README 复制安装命令、URL 或配置。","mcp.importNote.by-name-link":"这个链接只是在注册表中指明了 {name},不含任何设置,因此 Pi Web 暂时无法添加它。请改为从服务器的 README 复制 Cursor 或 VS Code 安装徽章的链接。","mcp.importNote.badge-image":"这是徽章的图片。请改为复制徽章所打开的链接。","mcp.importNote.install-link-invalid":"无法读取此安装链接({detail})。","mcp.importNote.claude-desktop-import":"claude mcp add-from-claude-desktop 会复制 Claude Desktop 自己的服务器。请改为粘贴 claude_desktop_config.json 中的 mcpServers 部分。","mcp.importNote.cli-unsupported":"Pi Web 不读取 {cli} 的 mcp add。请改为粘贴服务器自己的命令行、URL 或 JSON 配置。","mcp.importNote.cli-usage":"这条 {cli} mcp add 命令不完整:它需要一个名称,以及一个 URL 或命令。","mcp.importNote.cli-unknown-option":"{cli} 没有选项 {option}。","mcp.importNote.cli-option-needs-value":"{cli} 的选项 {option} 需要一个值。","mcp.importNote.cli-option-wrong-transport":"{cli} 的选项 {option} 不适用于 {transport} 服务器。","mcp.importNote.cli-invalid-pair":"{cli} 的选项 {option} 无法读取 {value}。","mcp.importNote.cli-not-a-server":"{cli} {command} 用于管理 {cli} 本身,它不是服务器。请粘贴启动服务器的命令,或 {cli} mcp add …","mcp.importNote.pi-help":"pi mcp add --help 只会打印帮助,不会添加任何内容。","mcp.importNote.field-required":"请填写 {field}。","mcp.importNote.field-invalid-option":"请为 {field} 选择一个提供的值。","mcp.importNote.field-reference-invalid.name":"{field}:变量名只能包含字母、数字和 _,且不能以数字开头。","mcp.importNote.field-reference-invalid.target":"{field} 不能取自变量:pi 只在 env 值、请求头和 OAuth 客户端密钥中读取变量。","mcp.importNote.field-reference-invalid.missing":"{field}:请输入要读取的变量名。","mcp.importNote.sse-transport":"它使用旧版 SSE 传输方式,pi 不支持。","mcp.importNote.sse-transport.suggested":"它使用旧版 SSE 传输方式,pi 不支持。请改用它的 Streamable HTTP 地址:{suggestedUrl}","mcp.importNote.websocket-transport":"它通过 WebSocket 连接,pi 不支持。","mcp.importNote.unsupported-transport":"它的传输方式 {type} 不是 pi 支持的方式(stdio 或 Streamable HTTP)。","mcp.importNote.ambiguous-command-and-url":"它同时有命令和 URL,无法确定该用哪一个。","mcp.importNote.no-command-or-url":"它既没有可启动的命令,也没有可连接的 URL。","mcp.importNote.zed-extension-server":"它来自 Zed 扩展,只有 Zed 才能启动它。","mcp.importNote.registry-packages-unsupported":"它只以待安装的软件包形式发布,而 pi 需要命令或 URL。请改为粘贴它的安装命令。","mcp.importNote.invalid-config":"pi 会拒绝它:{problem}","mcp.importNote.dropped-key":"{key} 在 pi 中没有对应项,已省略。","mcp.importNote.variable-unsupported-here":"{field} 读取了变量 {name},pi 不会在那里填入它,因此需要在下方填写其值。","mcp.importNote.variable-fallback-dropped":"{field}:pi 不支持变量的默认值,因此省略了 {name} 的备用值 {fallback}。","mcp.importNote.bare-dollar-literal":"{field} 中的 ${name} 是普通文本:此客户端不把它当作变量,pi 也不会。","mcp.importNote.header-env-reference":"请求头 {header} 会把运行 Pi Web 的计算机上 {names} 的值发送给此服务器。","mcp.importNote.client-secret-env-reference":"OAuth 客户端密钥取自运行 Pi Web 的计算机上的 {names},并会发送给授权服务器。","mcp.importNote.shell-command-value":"{field} 每次连接都会在运行 Pi Web 的计算机上执行 shell 命令。","mcp.importNote.shell-variable":"{field}:${name} 本应由你的 shell 填入。pi 会从运行 Pi Web 的计算机的环境中读取它,否则需要在下方填写其值。","mcp.importNote.unsupported-variable":"{field} 用到了 {variable},pi 无法填入,因此需要在下方填写其值。","mcp.importNote.input-undefined":"配置要求填写输入项 {id},但没有定义它,因此需要在下方填写其值。","mcp.importNote.input-command-unsupported":"输入项 {id} 会执行 VS Code 命令,Pi Web 无法执行,因此需要在下方填写其值。","mcp.importNote.timeout-clamped":"{from} 秒的超时时间已缩短为 {to} 秒。","mcp.importNote.timeout-dropped":"超时时间 {value} 不是秒数,已省略。","mcp.importNote.timeout-unit-guessed.milliseconds":"超时时间 {value} 被当作毫秒读取,请核对。","mcp.importNote.timeout-unit-guessed.seconds":"超时时间 {value} 被当作秒读取,请核对。","mcp.importNote.env-null-dropped":"{name} 被设为 null 以取消设置,pi 做不到这一点,因此已省略。","mcp.importNote.oauth-option-dropped":"OAuth 选项 {key} 在 pi 中没有对应项,已省略。","mcp.importNote.oauth-disable-unsupported":"配置关闭了 OAuth,pi 无法这样做:只要服务器要求,pi 就会通过 OAuth 登录。","mcp.importNote.callback-url-dropped":"OAuth 回调地址 {value} 不是 pi 能监听的回环地址,因此已省略。","mcp.importNote.callback-port-dropped":"OAuth 回调端口 {value} 不是端口号,因此已省略。","mcp.importNote.invalid-exposure-dropped":"exposure {value} 不是 pi 认识的值,因此已省略。","mcp.importNote.tool-filter-imported.include":"只提供这些工具,其余的隐藏:{tools}。","mcp.importNote.tool-filter-imported.exclude":"这些工具被隐藏:{tools}。","mcp.importNote.transport-guessed":"配置没有指明传输方式,Pi Web 根据现有的键推断出了它。","mcp.importNote.insecure-http":"{host} 通过未加密的 http 访问,因此发送的所有内容(包括令牌)都以明文传输。","mcp.importNote.literal-secret":"{field} 以明文保存了一个机密,因此该服务器只能保存在全局 mcp.json 中。","mcp.importNote.cli-option-ignored":"{cli} 的选项 {option} 在 pi 中没有对应项,已忽略。","mcp.importNote.cli-option-as-arg":"{option} 位于服务器命令之后,因此会像 {cli} 那样作为参数传给服务器。","mcp.importNote.cli-extra-arguments":"{cli} 只凭 URL 添加 HTTP 服务器,因此省略了多余的参数 {arguments}。","mcp.importNote.mcp-remote-bridge":"这会运行 mcp-remote 来访问 {url}。pi 可以直接连接该 URL:粘贴该 URL 即可不经桥接添加它。","mcp.importNote.looks-like-pi-config":"这看起来像 pi 自己的 mcp.json。如果是从那里复制的,请打开“启用 pi mcp 语法,支持 $NAME 和 !command”。","mcp.importNote.workspace-folder-relative":"{field}:{from} 变成了会话所在的文件夹(.),pi 就在那里启动服务器。","mcp.importNote.home-variable-translated":"{field}:{from} 变成了 {to},pi 会从环境中读取它。","mcp.importNote.name-taken":"该文件已有名为 {name} 的服务器。请换一个名称,例如 {suggestedName}。","mcp.importNote.escaped-value":"{field}:$ 和开头的 ! 已转义,因此 pi 会按原样读取该值,不执行任何内容。","mcp.importNote.variable-translated":"{field}:{from} 变成了 {to},这是 pi 读取该变量的写法。","mcp.importNote.home-translated":"{field}:{from} 变成了 ~,即主目录。","mcp.importNote.timeout-converted":"{from} 毫秒的超时时间换算为 {to} 秒。","mcp.importNote.env-value-stringified":"{name} 不是文本,已转换为文本。","mcp.importNote.empty-authorization-dropped":"省略了空的 Authorization 请求头,因此服务器要求时 pi 会通过 OAuth 登录。","mcp.importNote.imported-disabled":"配置中它处于关闭状态,因此添加后也是关闭的。","mcp.importNote.name-derived":"根据它的地址或命令命名为 {name}。","mcp.importNote.name-sanitized":"{original} 变成了 {name}:pi 服务器名称只能使用字母、数字、_ 和 -。","mcp.importNote.name-deduplicated":"{original} 已被占用,因此命名为 {name}。","mcp.importNote.command-split":"{command} 已拆分为命令及其参数。","mcp.importNote.transport-assumed-http":"没有指明传输方式,因此按 Streamable HTTP 服务器读取。","mcp.importNote.scheme-assumed":"按 {url} 读取。","mcp.importNote.client-secret-prompt":"需要在下方填写 OAuth 客户端密钥。","mcp.importNote.userinfo-moved-to-header":"URL 中的用户名和密码已移入 Authorization 请求头:pi 不会在 URL 中发送它们。","mcp.importProblem.name":"{name} 不是 pi 接受的服务器名称(字母、数字、_ 和 -)。","mcp.importProblem.not-an-object":"它不是对象。","mcp.importProblem.exposure":"exposure {value} 不是 pi 认识的值。","mcp.importProblem.tool-exposure":"toolExposure 必须把工具名映射到 exposure 值。","mcp.importProblem.tool-exposure.tool":"{tool} 的 toolExposure 不是 pi 认识的 exposure 值。","mcp.importProblem.enabled":"enabled 必须是 true 或 false。","mcp.importProblem.description":"description 必须是文本。","mcp.importProblem.timeout":"超时时间 {value} 不是正的秒数。","mcp.importProblem.sse":"不支持旧版 SSE 传输方式。","mcp.importProblem.url":"{url} 不是 http 或 https URL。","mcp.importProblem.headers":"headers 必须把名称映射到文本。","mcp.importProblem.auth":"auth.provider 必须是一个 pi 提供商的名称。","mcp.importProblem.auth-url":"auth 会发送提供商的令牌,所以 URL 必须是 https(或 localhost 上的 http)。","mcp.importProblem.oauth":"oauth 必须是对象。","mcp.importProblem.oauth-client-id":"oauth.clientId 必须是文本。","mcp.importProblem.oauth-client-secret":"oauth.clientSecret 必须是文本。","mcp.importProblem.callback-port":"OAuth 回调端口 {value} 不是端口号。","mcp.importProblem.callback-url":"OAuth 回调地址 {value} 不是回环 http 地址。","mcp.importProblem.callback-port-mismatch":"OAuth 回调地址使用的端口是 {value},与回调端口不一致。","mcp.importProblem.oauth-scope":"oauth.scope 必须是文本。","mcp.importProblem.oauth-client-name":"oauth.clientName 必须是非空文本。","mcp.importProblem.oauth-client-registration":'oauth.clientRegistration 的值 {value} 必须是 "dcr" 或 "cimd"。',"mcp.importProblem.oauth-client-registration-client":'oauth.clientRegistration 为 "cimd" 时不能同时设置 oauth.clientId 或 oauth.clientName。',"mcp.importProblem.oauth-client-registration-callback":'oauth.clientRegistration 为 "cimd" 时,oauth.callbackUrl 必须在 localhost 或 127.0.0.1 上,且路径为 /callback。',"mcp.importProblem.auth-server-metadata-url":"oauth.authServerMetadataUrl {value} 必须是 https 地址(或 localhost 上的 http)。","mcp.importProblem.args":"args 必须是文本列表。","mcp.importProblem.args.index":"args[{index}] 不是文本。","mcp.importProblem.env":"env 必须把名称映射到文本。","mcp.importProblem.cwd":"cwd 必须是文本。","mcp.importProblem.no-command-or-url":"它需要命令(stdio)或 URL(Streamable HTTP)。","mcp.importField.reason.empty":"粘贴的内容在这里留空了。","mcp.importField.reason.input":"配置要求在安装时填写此项。","mcp.importField.reason.variable":"粘贴的内容在这里读取了一个 pi 不会填入的变量。","mcp.importField.reason.home":"粘贴的内容在这里以 pi 无法填入的方式读取主目录。","mcp.importField.reason.workspace-basename":"粘贴的内容在这里用到了工作区文件夹的名称,pi 不知道它。","mcp.importField.reason.unsupported-variable":"粘贴的内容在这里用到了 pi 无法填入的变量。","mcp.importField.reason.client-secret":"该命令要求提供 OAuth 客户端密钥。","mcp.importField.reason.registry-header":"注册表条目要求提供此请求头。","mcp.importField.reason.registry-variable":"注册表条目要求提供地址的这一部分。","i18n.creatingSession":"正在创建新会话…","i18n.creating":"创建中…","i18n.subscription":"订阅","i18n.subscriptions":"订阅服务","i18n.customEndpoint":"自定义端点格式","i18n.noChanges":"没有更改","i18n.branches":"分支","i18n.noActiveSession":"没有活动会话","i18n.noBranches":"此会话没有分支","i18n.branchesLockedWhileRunning":"会话运行中,暂时无法切换分支","i18n.source":"源代码","i18n.preview":"预览","i18n.diff":"Diff","i18n.downloadFile":"下载文件","i18n.liveSync":"实时同步已启用","i18n.notWatching":"未监视","i18n.fileViewMode":"文件视图模式","i18n.compareHead":"比较工作区与 HEAD","i18n.mentionSelectedLines":"提及所选行","i18n.disableWrap":"禁用自动换行","i18n.enableWrap":"启用自动换行","i18n.htmlPreview":"HTML 预览","i18n.previewFile":"预览 {file}","i18n.invalidMermaid":"Mermaid 图表无效","i18n.renderingMermaid":"正在渲染 Mermaid 图表","i18n.previewAfterStreaming":"流式输出完成后可预览","i18n.showMermaidSource":"显示 Mermaid 源码","i18n.previewMermaid":"预览 Mermaid 图表","i18n.openMermaidViewer":"打开图表查看器","i18n.mermaidViewer":"Mermaid 图表查看器","i18n.mermaidDiagram":"Mermaid 图表","i18n.zoomOut":"缩小","i18n.zoomIn":"放大","i18n.fitToWidth":"适应宽度","models.discoveryFetching":"正在导入模型…","models.discoveryFetch":"导入模型…","models.discoveryFilterPlaceholder":"筛选 {count} 个模型…","models.discoveryFilter":"筛选上游模型","models.discoverySelectShown":"选择当前结果","models.discoveryNoMatches":"没有匹配的模型。","models.configUnreadable":"无法读取 models.json,为避免覆盖已禁用保存。请修复该文件后重新打开此面板。{error}","models.providerNameTaken":"已存在名为“{name}”的 Provider,请换一个名称。","models.discoveryAdded":"已添加","models.discoveryShowing":"显示前 {shown} 个,共 {total} 个","models.discoveryFetched":"已获取 {count} 个模型","models.discoveryAddSelected":"添加所选模型","models.discoveryAddSelectedCount":"添加所选模型({count})","models.catalogSource":"来源:models.dev ↗","models.catalogFilling":"正在填入模型信息…","models.catalogFill":"填入模型信息","models.catalogFilled":"已填入 {count} 个字段","models.catalogNoEmptyFields":"没有需要填入的空字段","models.catalogNoExactMatch":"models.dev 中没有精确匹配","models.catalogPriceProvider":"价格已匹配 Provider {provider}","models.catalogPriceBaseUrl":"价格已按 Base URL 匹配 {provider}","models.catalogPriceConsensus":"价格得到 {support}/{total} 条记录支持","models.catalogPriceUnreliable":"未找到可靠价格","models.catalogUndo":"撤销","models.capabilities":"能力","models.reasoning":"推理 / 思考","models.imageInput":"图片输入","models.modelSpecs":"模型规格","models.contextWindow":"上下文窗口(tokens)","models.contextForModel":"{model} 的上下文窗口","models.contextInvalid":"{model} 的上下文窗口:请输入正整数 tokens 数量。","models.contextOverrideHelp":"上下文窗口(tokens),留空使用默认值。已加载的会话需重启 Pi Web 才会更新。","models.maxOutputTokens":"最大输出 tokens","models.costPerMillion":"每百万 tokens 价格","models.costInput":"输入","models.costOutput":"输出","models.costCacheRead":"缓存读取","models.costCacheWrite":"缓存写入","models.notProvided":"未提供","models.editCosts":"编辑价格","models.finishEditingCosts":"完成","models.costAllRequired":"请输入有效的非负价格;留空项将按 0 保存。","models.advancedSettings":"高级设置","models.providerDefaults":"沿用 Provider 默认设置","models.headersSummary":"Headers:{count}","models.compatSummary":"兼容性:{count}","models.thinkingSummary":"思考等级:{count}","models.apiOverride":"API 覆盖","models.headers":"Headers","models.headersHelp":"仅添加到该模型的请求中,并覆盖 Provider 的同名 Header。","models.compatibility":"兼容性","models.deepSeekThinkingCompat":"DeepSeek 思考兼容","models.developerRole":"使用 developer role 传递系统提示词","models.thinkingLevelMap":"思考等级映射","models.clearAll":"全部清除","models.enabledSection":"可用模型","models.enabledCount":"已启用 {enabled}/{total}","models.enableAll":"全部开启","models.disableAll":"全部关闭","models.enableShown":"开启筛选结果","models.disableShown":"关闭筛选结果","models.enabledFilter":"筛选可用模型","models.enabledFilterPlaceholder":"筛选 {count} 个模型…","models.enabledNoMatches":"没有匹配的模型。","models.enabledToggle":"在模型选择器中显示 {model}","models.enabledProviderToggle":"启用 {provider} 的全部模型","models.enabledPinHint":"由 enabledModels 固定的思考等级,需在 settings.json 中修改。","models.enabledLastModel":"至少需要保留一个启用的模型。","models.enabledProjectScope":"当前项目的 .pi/settings.json 设置了 enabledModels 并覆盖全局配置,因此这些开关为只读。请直接修改该文件。","models.enabledUnavailable":"登录该 provider 后即可选择模型。","models.refreshCatalog":"刷新模型目录","models.refreshingCatalog":"刷新中…","models.refreshCatalogHint":"立即获取该 provider 当前发布的模型列表。pi 内置的列表固定在 pi-web 附带的 pi 版本上,新发布的模型需要刷新后才会出现。","models.catalogUpdated":"已从服务商更新模型列表。","models.catalogUnchanged":"模型列表已是最新。","models.catalogUnreachable":"无法获取模型目录。请检查网络连接和该 provider 的凭据后重试。","models.catalogOffline":"已设置 PI_OFFLINE,pi-web 不会联网获取模型目录。","models.enabledCustomEmpty":"这个 provider 目前没有可用模型。请先保存修改,并确认 API key 有效。","models.enabledStale":"{count} 条失配","models.enabledStaleHint":"模型可用的前提是它所属的 provider 有可用凭证。凭证缺失、模型被改名或删除、配置是给别的机器写的,都会让条目匹配不到任何模型。","models.enabledPrune":"清理无效条目","models.enabledPruneHint":"删除匹配不到任何可用模型的配置条目,其余保持不变。","models.enabledClear":"启用全部模型","models.enabledClearHint":"清除所有 provider 的模型筛选。","i18n.testingModel":"正在测试模型连接...","i18n.connected":"已连接","i18n.failed":"失败","i18n.test":"测试","i18n.testConnection":"测试模型连接","i18n.provider":"Provider","i18n.model":"模型","i18n.providerName":"Provider 名称","i18n.rename":"重命名","i18n.default":"默认","i18n.disabled":"已禁用","i18n.noResources":"没有资源","i18n.unknown":"未知","i18n.installedVersion":"已安装 {version}","i18n.configuredVersion":"已配置 {version}","i18n.extensions":"扩展","i18n.prompts":"提示词","i18n.themes":"主题","i18n.resourceCount":"{count}{label}","i18n.extensionShort":"扩展","i18n.skillShort":"技能","i18n.promptShort":"提示词","i18n.themeShort":"主题","i18n.custom":"自定义","i18n.clearAll":"清除全部","i18n.connectedSuccessfully":"连接成功。","i18n.notConnected":"未连接","i18n.configured":"已配置","i18n.notConfigured":"未配置","i18n.openingBrowser":"正在打开浏览器…","i18n.submit":"提交","i18n.login":"登录","i18n.relogin":"重新登录","i18n.disconnect":"断开连接","i18n.networkError":"网络错误","i18n.continuing":"继续中…","i18n.skills":"技能","i18n.plugins":"插件","i18n.addSkill":"添加技能","i18n.addPlugin":"添加插件","i18n.selectSkill":"选择技能","i18n.selectPackage":"选择包","i18n.updateAvailable":"有可用更新","i18n.upToDate":"已是最新","i18n.automaticChecksUnavailable":"自动检查不可用","i18n.checkFailed":"检查失败","i18n.installed":"已安装","i18n.status":"状态","i18n.version":"版本","i18n.description":"描述","i18n.package":"包","i18n.resources":"资源","i18n.installedPath":"安装路径","i18n.cwd":"CWD","i18n.resolvedResources":"已解析资源","i18n.reloadSession":"重新加载会话","i18n.reloading":"重新加载中...","i18n.packageRemoved":"包已移除。","i18n.packageInstalled":"包已安装。","i18n.packageUpdated":"包已更新。","i18n.packagesUpdated":"所有插件已更新。","i18n.updateAllPlugins":"更新全部","i18n.updateAllPluginsHint":"更新所有已配置的插件","i18n.packageDisabled":"包已禁用。","i18n.packageEnabled":"包已启用。","i18n.sessionReloaded":"会话已重新加载。","i18n.thinking":"思考","i18n.largeMessageReveal":"消息内容过大({size})。点击以纯文本查看 — 已禁用 markdown 渲染以避免页面卡顿。","i18n.loadingThinking":"正在加载思考内容...","i18n.copyMessage":"复制消息","i18n.editFromHere":"从此处编辑","i18n.editFromHereTitle":"从此处编辑,此会话内创建分支","i18n.newSession":"新会话","i18n.newSessionTitle":"新会话,从此处创建独立副本","i18n.estimatedTokens":"流式输出期间的估算 Token 数","i18n.noOutput":"(无输出)","i18n.noSummary":"(无摘要)","i18n.conversationCompacted":"会话已压缩","i18n.compactedFromTokens":"压缩前 {tokens} Token","i18n.compactionDescription":"此处之前的会话历史已压缩为以下摘要:","i18n.fileContext":"文件上下文:{details}","i18n.readFiles":"读取的文件","i18n.modifiedFiles":"修改的文件","i18n.noMessage":"(无消息)","i18n.collapse":"收起","i18n.expand":"展开","i18n.hideDetails":"隐藏详情","i18n.showDetails":"显示详情","i18n.thinkingUnavailable":"思考内容不可用","i18n.before":"之前","i18n.after":"之后","i18n.sessionComplete":"任务完成","i18n.taskFinished":"任务已完成。","i18n.attentionNeeded":"Pi 需要你的操作","i18n.extensionInputNeeded":"扩展正在等待你的输入。"}}},92243:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{HR:()=>q,hO:()=>r,lB:()=>s});var e=c(29021),f=c(33873),g=c(51181),h=c.n(g),i=c(8102),j=c(9915),k=c(41298),l=c(40402),m=a([l]);function n(){return(0,f.join)((0,l.$M)(),"web-push.json")}l=(m.then?(await m)():m)[0];function o(a,b){if("zh-CN"===a){let a=k.O.messages["sessionComplete"===b?"i18n.sessionComplete":"i18n.taskFinished"];if(a)return a}return j.Q.messages["sessionComplete"===b?"i18n.sessionComplete":"i18n.taskFinished"]??("sessionComplete"===b?"Session complete":"Task finished.")}function p(){return globalThis.__piWebPushNotifier||(globalThis.__piWebPushNotifier=Promise.resolve().then(()=>{var a;let b,c,d;return b=(a={async send(a,b,c){let d;await h().sendNotification({endpoint:a.endpoint,keys:a.keys},b,{vapidDetails:{subject:(d=process.env.PI_WEB_PUSH_SUBJECT?.trim())||"https://github.com/xuzhonglin/pi-web",publicKey:c.publicKey,privateKey:c.privateKey},TTL:2419200,urgency:"high"})},loadState(){let a=n();if(!(0,e.existsSync)(a))return null;try{return JSON.parse((0,e.readFileSync)(a,"utf8"))}catch{return null}},saveState(a){let b=n();(0,e.mkdirSync)((0,f.dirname)(b),{recursive:!0}),(0,i.$)(b,JSON.stringify(a))},generateVapidKeys:()=>h().generateVAPIDKeys()}).loadState(),c=b?.vapidKeys?.publicKey&&b.vapidKeys.privateKey?b:{vapidKeys:a.generateVapidKeys(),subscriptions:[]},d=()=>{a.saveState(c)},{getVapidPublicKey:()=>(d(),c.vapidKeys.publicKey),addSubscription(a){c.subscriptions=[...c.subscriptions.filter(b=>b.endpoint!==a.endpoint),a],d()},async notifySessionComplete(b,e){if(0===c.subscriptions.length)return;let f=a=>({title:e??o(a,"sessionComplete"),body:o(a,"taskFinished"),url:`/?session=${encodeURIComponent(b)}`,tag:`pi-session-complete:${b}`}),g=!1;for(let b of[...c.subscriptions])try{await a.send(b,JSON.stringify(f(b.locale)),c.vapidKeys)}catch(d){let a=function(a){if("object"!=typeof a||null===a||!("statusCode"in a))return;let b=a.statusCode;return"number"==typeof b?b:void 0}(d);(404===a||410===a)&&(c.subscriptions=c.subscriptions.filter(a=>a.endpoint!==b.endpoint),g=!0)}g&&d()}}})),globalThis.__piWebPushNotifier}function q(){return p().then(a=>a.getVapidPublicKey())}function r(a){return p().then(b=>b.addSubscription(a))}async function s(a,b){let c=await p();await c.notifySessionComplete(a,b)}d()}catch(a){d(a)}})}};
|