@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";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[1278],{2730:(e,t,o)=>{function s(e,t,o){let s=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},i=o[e]?.[t]??o.en?.[t];return void 0===i?t:function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return e.replace(/\{([\w.-]+)\}/g,(e,o)=>{let s=t[o];return void 0===s?e:String(s)})}(i,s)}function i(e,t){let o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:new Date,s=(e instanceof Date?e:new Date(e)).getTime()-o.getTime(),i=Math.abs(s),[n,a]=i<6e4?["second",1e3]:i<36e5?["minute",6e4]:i<864e5?["hour",36e5]:["day",864e5],r=Math.round(s/a);return new Intl.RelativeTimeFormat(t,{numeric:"always"}).format(r,n)}function n(e,t){let o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:new Date,s=new Date(e);return Number.isNaN(s.getTime())?"":s.getFullYear()===o.getFullYear()&&s.getMonth()===o.getMonth()&&s.getDate()===o.getDate()?s.toLocaleTimeString(t,{hour:"2-digit",minute:"2-digit"}):i(s,t,o)}o.d(t,{Rg:()=>r,fw:()=>i,ob:()=>n,u0:()=>s});let a={en:{now:"now",minute:"m",hour:"h",day:"d",week:"w",month:"mo",year:"y"},"zh-CN":{now:"刚刚",minute:"分",hour:"小时",day:"天",week:"周",month:"个月",year:"年"},"zh-TW":{now:"剛剛",minute:"分",hour:"小時",day:"天",week:"週",month:"個月",year:"年"}};function r(e,t){let o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:new Date,s=e instanceof Date?e:new Date(e),i=o.getTime()-s.getTime();if(Number.isNaN(i))return"";let n=Object.hasOwn(a,t)?a[t]:a.en,r=Math.max(0,i),d=Math.floor(r/6e4);if(d<1)return n.now;if(d<60)return`${d}${n.minute}`;let c=Math.floor(r/36e5);if(c<24)return`${c}${n.hour}`;let l=Math.floor(r/864e5);return l<7?`${l}${n.day}`:l<30?`${Math.floor(l/7)}${n.week}`:l<365?`${Math.max(1,Math.floor(l/30))}${n.month}`:`${Math.floor(l/365)}${n.year}`}},21278:(e,t,o)=>{o.d(t,{I18nProvider:()=>m,s:()=>p});var s=o(95155),i=o(12115);let n=[{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."}},{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":"扩展正在等待你的输入。"}},{id:"zh-TW",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":"在 Finder 中開啟","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} 項目使用相同的網址,這是它的登入:權杖對兩者都有效。","mcp.signIn.shared.done":"已透過另一個同名的 {name} 項目登入,它使用相同的網址,因此權杖對此項目同樣有效。按「測試連線」查看此項目的伺服器提供的內容。","mcp.signIn.shared.already":"另一個同名的 {name} 項目使用相同的網址,並且已經登入,因此權杖對此項目同樣有效。按「測試連線」查看此項目的伺服器提供的內容。","mcp.signIn.shared.connect-failed":"透過另一個同名的 {name} 項目(使用相同的網址)進行的登入沒有可登入的對象:該項目的伺服器沒有連線成功,也沒有要求登入。它的「狀態」一列說明了原因。","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":"網址","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":"還沒有可讀取的內容:請貼上網址、命令列或設定。","mcp.importNote.unrecognized-input":"Pi Web 無法辨識這段內容。請貼上伺服器的網址、啟動它的命令、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 網址。","mcp.importNote.github-repo-link":"這是 GitHub 存放庫 {repository},不是伺服器。請從它的 README 複製安裝命令、網址或設定。","mcp.importNote.github-mcp-page":"這是 {name} 在 github.com/mcp 上的頁面。它的「安裝」按鈕會開啟其他應用程式,無法貼到這裡;請改為從伺服器的 README 複製 Cursor 或 VS Code 安裝徽章的連結。","mcp.importNote.github-page":"這個 GitHub 頁面不是伺服器。請從伺服器的 README 複製安裝命令、網址或設定。","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。請改為貼上伺服器自己的命令列、網址或 JSON 設定。","mcp.importNote.cli-usage":"這條 {cli} mcp add 命令不完整:它需要一個名稱,以及一個網址或命令。","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":"它同時有命令和網址,無法確定該用哪一個。","mcp.importNote.no-command-or-url":"它既沒有可啟動的命令,也沒有可連線的網址。","mcp.importNote.zed-extension-server":"它來自 Zed 擴充功能,只有 Zed 才能啟動它。","mcp.importNote.registry-packages-unsupported":"它只以待安裝的套件形式發布,而 pi 需要命令或網址。請改為貼上它的安裝命令。","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} 只憑網址新增 HTTP 伺服器,因此省略了多餘的引數 {arguments}。","mcp.importNote.mcp-remote-bridge":"這會執行 mcp-remote 來存取 {url}。pi 可以直接連線到該網址:貼上該網址即可不經橋接新增它。","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":"網址中的使用者名稱和密碼已移入 Authorization 標頭:pi 不會在網址中傳送它們。","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 網址。","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)或網址(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":"上下文視窗(Token)","models.contextForModel":"{model} 的上下文視窗","models.contextInvalid":"{model} 的上下文視窗:請輸入正整數 Token 數量。","models.contextOverrideHelp":"上下文視窗(Token),留空使用預設值。已載入的工作階段需重新啟動 Pi Web 才會更新。","models.maxOutputTokens":"最大輸出 Token 數","models.costPerMillion":"每百萬 Token 費用","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":"擴充功能正在等待你的輸入。"}}];function a(e){return n.find(t=>t.id===e)}function r(){return n.map(e=>e.id)}var d=o(2730);let c="pi-locale",l=(0,i.createContext)(null);function m(e){let{children:t}=e,[o,n]=(0,i.useState)("en"),[m,p]=(0,i.useState)(!1),h=(0,i.useMemo)(()=>r().map(e=>a(e)).filter(e=>!!e),[]),u=(0,i.useMemo)(()=>Object.fromEntries(r().flatMap(e=>{let t=a(e);return t?[[e,t.messages]]:[]})),[]);(0,i.useEffect)(()=>{let e=function(){try{let e=window.localStorage.getItem(c);if("en"===e||"zh-CN"===e||"zh-TW"===e)return e}catch{}for(let e of window.navigator.languages.length?window.navigator.languages:[window.navigator.language]){let t=e.toLowerCase();if("en"===t||t.startsWith("en-"))break;if("zh"===t||"zh-cn"===t||t.startsWith("zh-cn-")||"zh-sg"===t||t.startsWith("zh-sg-")||"zh-hans"===t||t.startsWith("zh-hans-"))return"zh-CN";if("zh-tw"===t||t.startsWith("zh-tw-")||"zh-hk"===t||t.startsWith("zh-hk-")||"zh-mo"===t||t.startsWith("zh-mo-")||"zh-hant"===t||t.startsWith("zh-hant-"))return"zh-TW";if(t.startsWith("zh-"))return"zh-CN"}return"en"}();n(e),document.documentElement.lang=e,p(!0)},[]);let g=(0,i.useCallback)(e=>{if(a(e)){n(e),document.documentElement.lang=e;try{window.localStorage.setItem(c,e)}catch{}}},[]),b=(0,i.useCallback)((e,t)=>(0,d.u0)(o,e,u,t),[o,u]),f=(0,i.useMemo)(()=>({locale:m?o:"en",setLocale:g,t:b,supportedLocales:h}),[m,o,g,b,h]);return(0,s.jsx)(l.Provider,{value:f,children:t})}function p(){let e=(0,i.useContext)(l);if(!e)throw Error("useI18n must be used inside I18nProvider");return e}}}]);
|