@jetcrab/pi-desk 1.1.23-dev → 1.1.25

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.
Files changed (95) hide show
  1. package/docs/commands.md +4 -2
  2. package/docs/plugins.md +2 -0
  3. package/package.json +2 -2
  4. package/src/app/project-preview/page.tsx +13 -0
  5. package/src/client/l1_entry/pages/l1-project-preview-page.tsx +1 -5
  6. package/src/client/l2_biz/project-preview/hooks/l2-use-project-preview.ts +25 -0
  7. package/src/client/l2_biz/project-preview/l2-project-preview-storage.ts +7 -7
  8. package/src/client/l2_biz/project-preview/l2-project-preview.tsx +8 -5
  9. package/src/client/l2_biz/project-preview/runtime/l2-project-history-runtime.ts +14 -11
  10. package/src/client/l2_biz/project-preview/views/l2-project-branch-select.tsx +347 -0
  11. package/src/client/l2_biz/project-preview/views/l2-project-change-tree.tsx +28 -11
  12. package/src/client/l2_biz/project-preview/views/l2-project-history-list.tsx +35 -8
  13. package/src/client/l2_biz/project-preview/views/l2-project-history-view.tsx +46 -48
  14. package/src/client/l2_biz/workbench/file-workspace/l2-file-workspace-runtime.ts +2 -1
  15. package/src/client/l2_biz/workbench/file-workspace/l2-file-workspace-view.tsx +6 -2
  16. package/src/client/l3_modules/conversation/l3-conversation-viewport.tsx +18 -8
  17. package/src/client/l3_modules/project-files/l3-project-document-view.tsx +7 -4
  18. package/src/client/l3_modules/project-files/l3-project-file-runtime.ts +181 -89
  19. package/src/client/l3_modules/project-files/l3-project-file-tabs.tsx +80 -28
  20. package/src/common/l2_biz/project-preview/l2-project-history-messages.ts +4 -2
  21. package/src/common/l2_biz/project-preview/l2-project-preview-navigation.ts +14 -0
  22. package/src/server/l1_entry/api/l1-plugin-management-route.ts +0 -4
  23. package/src/server/l2_biz/plugin-management/l2-plugin-management.ts +4 -37
  24. package/src/server/l2_biz/plugin-management/l2-plugin-updates.ts +1 -4
  25. package/src/server/l2_biz/work-session/l2-work-session-chat-runtime.ts +4 -2
  26. package/src/server/l4_foundation/pi/l4-pi-chat-worker.ts +16 -1
  27. package/src/server/l4_foundation/pi/l4-pi-package-root-consistency.ts +3 -6
  28. package/src/server/l4_foundation/pi/l4-pi-package-root-gate.ts +1 -1
  29. package/src/server/l4_foundation/pi/l4-pi-plugin-owner-runtime.ts +4 -0
  30. package/src/server/l4_foundation/pi/l4-pi-plugin-sources.ts +5 -1
  31. package/src/server/l4_foundation/pi/l4-pi-session-initialization.ts +30 -34
  32. package/src/server/l4_foundation/pi/l4-pi-session-resources.ts +15 -14
  33. package/src/server/l4_foundation/pi/l4-pi-work-session-runtime.ts +1 -1
  34. package/src/server/l4_foundation/skills/runtime/l4-skill-catalog.ts +159 -166
  35. package/temp/build/pi-desk/release/.next/BUILD_ID +1 -1
  36. package/temp/build/pi-desk/release/.next/build-manifest.json +3 -3
  37. package/temp/build/pi-desk/release/.next/prerender-manifest.json +3 -3
  38. package/temp/build/pi-desk/release/.next/react-loadable-manifest.json +1 -1
  39. package/temp/build/pi-desk/release/.next/required-server-files.js +3 -3
  40. package/temp/build/pi-desk/release/.next/required-server-files.json +3 -3
  41. package/temp/build/pi-desk/release/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  42. package/temp/build/pi-desk/release/.next/server/app/_global-error.html +1 -1
  43. package/temp/build/pi-desk/release/.next/server/app/_global-error.rsc +1 -1
  44. package/temp/build/pi-desk/release/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  45. package/temp/build/pi-desk/release/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  46. package/temp/build/pi-desk/release/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  47. package/temp/build/pi-desk/release/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  48. package/temp/build/pi-desk/release/.next/server/app/api/health/route.js +1 -1
  49. package/temp/build/pi-desk/release/.next/server/app/api/plugins/add/route.js +1 -1
  50. package/temp/build/pi-desk/release/.next/server/app/api/plugins/apply/route.js +1 -1
  51. package/temp/build/pi-desk/release/.next/server/app/api/plugins/batch/route.js +1 -1
  52. package/temp/build/pi-desk/release/.next/server/app/api/plugins/del/route.js +1 -1
  53. package/temp/build/pi-desk/release/.next/server/app/api/plugins/enabled-set/route.js +1 -1
  54. package/temp/build/pi-desk/release/.next/server/app/api/plugins/get/route.js +1 -1
  55. package/temp/build/pi-desk/release/.next/server/app/api/plugins/list/route.js +1 -1
  56. package/temp/build/pi-desk/release/.next/server/app/api/plugins/reload/route.js +1 -1
  57. package/temp/build/pi-desk/release/.next/server/app/api/plugins/update/route.js +1 -1
  58. package/temp/build/pi-desk/release/.next/server/app/login/page_client-reference-manifest.js +1 -1
  59. package/temp/build/pi-desk/release/.next/server/app/page.js +2 -2
  60. package/temp/build/pi-desk/release/.next/server/app/page_client-reference-manifest.js +1 -1
  61. package/temp/build/pi-desk/release/.next/server/app/project-preview/page.js +1 -1
  62. package/temp/build/pi-desk/release/.next/server/app/project-preview/page_client-reference-manifest.js +1 -1
  63. package/temp/build/pi-desk/release/.next/server/chunks/16438.js +1 -1
  64. package/temp/build/pi-desk/release/.next/server/chunks/18748.js +1 -0
  65. package/temp/build/pi-desk/release/.next/server/chunks/24557.js +1 -1
  66. package/temp/build/pi-desk/release/.next/server/chunks/25406.js +13 -14
  67. package/temp/build/pi-desk/release/.next/server/chunks/27344.js +15 -0
  68. package/temp/build/pi-desk/release/.next/server/chunks/35985.js +1 -1
  69. package/temp/build/pi-desk/release/.next/server/chunks/36361.js +2 -2
  70. package/temp/build/pi-desk/release/.next/server/chunks/50520.js +2 -2
  71. package/temp/build/pi-desk/release/.next/server/chunks/6917.js +1 -1
  72. package/temp/build/pi-desk/release/.next/server/chunks/80290.js +1 -1
  73. package/temp/build/pi-desk/release/.next/server/chunks/92386.js +15 -16
  74. package/temp/build/pi-desk/release/.next/server/instrumentation.js +1 -1
  75. package/temp/build/pi-desk/release/.next/server/middleware-build-manifest.js +1 -1
  76. package/temp/build/pi-desk/release/.next/server/middleware-react-loadable-manifest.js +1 -1
  77. package/temp/build/pi-desk/release/.next/server/pages/500.html +1 -1
  78. package/temp/build/pi-desk/release/.next/server/server-reference-manifest.json +1 -1
  79. package/temp/build/pi-desk/release/.next/static/chunks/15302-6e070e13fa65c863.js +1 -0
  80. package/temp/build/pi-desk/release/.next/static/chunks/19991.bcca96d396b83030.js +1 -0
  81. package/temp/build/pi-desk/release/.next/static/chunks/65232-ef4e5a4174f62faf.js +15 -0
  82. package/temp/build/pi-desk/release/.next/static/chunks/app/{page-54040b9fd54ee8b3.js → page-18d63fd3920dfae0.js} +3 -3
  83. package/temp/build/pi-desk/release/.next/static/chunks/app/project-preview/page-038b6c14e03ed878.js +1 -0
  84. package/temp/build/pi-desk/release/.next/static/chunks/{webpack-48eecbb66781c006.js → webpack-c0b805df46fcf8b3.js} +1 -1
  85. package/temp/build/pi-desk/release/.next/static/css/c43b04c244a64fb4.css +1 -0
  86. package/temp/build/pi-desk/release/.next/trace-build +1 -1
  87. package/temp/build/pi-desk/release/.next/server/chunks/20460.js +0 -15
  88. package/temp/build/pi-desk/release/.next/server/chunks/93049.js +0 -1
  89. package/temp/build/pi-desk/release/.next/static/chunks/15302-9c807afc6c60de0c.js +0 -1
  90. package/temp/build/pi-desk/release/.next/static/chunks/19991.8aa2e4b6df15fad6.js +0 -1
  91. package/temp/build/pi-desk/release/.next/static/chunks/9038-05fd2688407b39c1.js +0 -15
  92. package/temp/build/pi-desk/release/.next/static/chunks/app/project-preview/page-bc18765121950e65.js +0 -1
  93. package/temp/build/pi-desk/release/.next/static/css/10e063cfb3cda7bd.css +0 -1
  94. /package/temp/build/pi-desk/release/.next/static/{gAYTx4KJJR3vTtGYexj4J → 6a4eIEjmpW5l8Qlgtzzzg}/_buildManifest.js +0 -0
  95. /package/temp/build/pi-desk/release/.next/static/{gAYTx4KJJR3vTtGYexj4J → 6a4eIEjmpW5l8Qlgtzzzg}/_ssgManifest.js +0 -0
@@ -26,5 +26,5 @@ exports.id=35985,exports.ids=[35985],exports.modules={2002:(a,b,c)=>{"use strict
26
26
  } catch {
27
27
  root.dataset.piDeskDisplaySize = ${JSON.stringify(j.Y8)};
28
28
  }
29
- })()`,q="force-dynamic",r={title:"Pi Desk",description:"Pi Desk web workspace"},s={interactiveWidget:"resizes-content"};function m({children:a}){let b=(0,f.J)().getSnapshot();return(0,e.jsxs)("html",{lang:b.region.locale,className:"dark","data-pi-desk-display-size":j.Y8,suppressHydrationWarning:!0,children:[(0,e.jsxs)("head",{children:[(0,e.jsx)("script",{type:"importmap",dangerouslySetInnerHTML:{__html:n}}),(0,e.jsx)(g.default,{id:"pi-desk-theme",strategy:"beforeInteractive",children:o}),(0,e.jsx)(g.default,{id:"pi-desk-display-size",strategy:"beforeInteractive",children:p})]}),(0,e.jsx)("body",{children:(0,e.jsx)(k.L1AppProviders,{initialSettings:b,children:a})})]})}d()}catch(a){d(a)}})},21147:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>e});var d=c(52834);function e({error:a,reset:b}){return(0,d.jsx)("html",{lang:"en",children:(0,d.jsxs)("body",{style:{margin:0,padding:"15vh 1rem",fontFamily:"system-ui, sans-serif",textAlign:"center"},children:[(0,d.jsx)("h1",{children:"Page unavailable / 页面暂时无法加载"}),(0,d.jsx)("button",{type:"button",onClick:b,style:{padding:"0.5rem 1rem",cursor:"pointer"},children:"Try again / 重试"})]})})}c(49147)},21169:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,7005,23)),Promise.resolve().then(c.t.bind(c,49453,23)),Promise.resolve().then(c.t.bind(c,79460,23)),Promise.resolve().then(c.t.bind(c,88476,23)),Promise.resolve().then(c.t.bind(c,97016,23)),Promise.resolve().then(c.t.bind(c,27297,23)),Promise.resolve().then(c.bind(c,1480))},21850:(a,b,c)=>{"use strict";c.d(b,{B:()=>f,o:()=>e});let d=null;function e(a){d=a}function f(a){return a.i18n?d?.(a.i18n.key,a.i18n.params)??a.msg:a.msg}},23579:(a,b,c)=>{"use strict";c.d(b,{L1AppProviders:()=>y});var d=c(52834),e=c(49147),f=c(51601),g=c(60632),h=c(43115),i=c(38273),j=c(96436),k=c(89172),l=c(92991),m=c(72062),n=c(84074),o=c(96478);function p({children:a}){let{wrapLines:b}=(0,o.TX)();return(0,d.jsx)(d.Fragment,{children:a})}var q=c(4998),r=c(57850),s=c(2719);function t(){let{pendingLocale:a}=(0,q.i)(),{t:b}=(0,r.Bd)("common");return(0,s.G)(),(0,e.useRef)(null),null}var u=c(59582),v=c(60141),w=c(96298);let x={en:{...l.n.en,errors:{invalidJson:"Invalid request JSON",invalidClient:"Invalid client identifier",invalidInput:"Invalid request details",sourceExpired:"The chat source has changed",sessionMissing:"Work session not found",projectChanged:"The work session project has changed",projectMissing:"Project directory not found",fileMissing:"File or directory not found",notDirectory:"The target is not a directory",notFile:"The target is not a file",outsideProject:"The target is outside the current project",textTooLarge:"This text file exceeds 5 MB and cannot be previewed online",imageTooLarge:"This image is too large for online preview",previewUnsupported:"This file type cannot be previewed online",fileReadFailed:"Could not read the project file",projectSearchPatternInvalid:"The search expression is invalid or uses unsupported syntax",projectSearchUnavailable:"The project search engine is unavailable. Reinstall the complete runtime dependencies",projectSearchTimeout:"Project search timed out. Narrow the search scope and try again",projectSearchReadFailed:"Could not read project search files or results",projectSearchCancelled:"Project search was cancelled",revealFailed:"Could not open the file location",repositoryMissing:"Git repository not found",gitOutsideProject:"The Git target is outside the current project",gitReadFailed:"Could not read the Git repository",skillsInputInvalid:"Invalid Skills request details",skillsContentTooLarge:"The submitted text exceeds the file size limit",skillsProjectChanged:"This project is no longer in the workspace. Select a project again",skillMissing:"Skill or file not found",skillsPermissionDenied:"Permission denied when accessing the Skill file",skillsFileFailed:"Could not process the Skills file. Please try again",chatSubscribeInvalid:"Invalid chat subscription details",chatSubscribeExpired:"The chat subscription source has changed",chatSubscribeFailed:"Could not initialize chat subscriptions",chatSendInvalid:"Invalid message details",chatSendTooLarge:"Message exceeds 31 MB",chatInterruptInvalid:"Invalid interrupt request",chatCompactInvalid:"Invalid compaction request",chatReloadInvalid:"Invalid Pi configuration reload request",chatRestoreInvalid:"Invalid queued message restore request",chatRestoreTooLarge:"Restored content exceeds the transport limit",chatModelInvalid:"Invalid model settings request",chatModeInvalid:"Invalid capability mode request",chatSourceBusy:"The work session is changing or switching branches",socketUnknownPath:"Unknown WebSocket operation",sessionsNotReady:"Work sessions are not initialized yet",sessionsInitializing:"Work sessions are initializing",sessionsInitializeInvalid:"Invalid work session initialization request",sessionsInitializeFailed:"Could not initialize work sessions",completionAckInvalid:"Invalid completion acknowledgement",completionAckFailed:"Could not confirm the work session completion state",capabilityFailed:"Could not update capability modes",capabilityRuleInvalid:"Check the capability mode rules",chatContextJsonInvalid:"Invalid JSON for system context request",chatContextInvalid:"Invalid system context request",chatContextBusy:"Session is running. System context is temporarily unavailable",chatContextFailed:"Could not read system context",chatMessageInvalid:"Invalid message detail request",chatMessageMissing:"Chat message not found",chatMessageFailed:"Could not load message details",chatImageInvalid:"Invalid chat image request",chatImageMissing:"Chat image not found",chatImageFailed:"Could not load chat image",modelSettingsInvalid:"Invalid model configuration",modelCatalogInvalid:"Invalid model catalog request",modelCatalogUnavailable:"Model reference catalog is temporarily unavailable",modelSaveFailed:"Could not save model configuration",modelSettingsGetInvalid:"Invalid model settings request",modelSettingsGetFailed:"Could not read model settings",projectDefaultInputInvalid:"Invalid project directory",projectDefaultGetFailed:"Could not read project model default",projectDefaultSaveInvalid:"Invalid project model default",projectDefaultSaveFailed:"Could not save project model default",modelsListFailed:"Could not list models",directoryBrowseInvalid:"Invalid directory browser request",directoryMissing:"Directory not found or is not a folder",directoryReadDenied:"Could not read directory",directoryBrowseFailed:"Could not browse server directories",workSessionCreateInvalid:"Invalid cwd or session ID",workSessionDirectoryMissing:"Project directory does not exist or is not a folder",historySessionMissing:"No Pi session found in this directory",historySessionOccupied:"Pi session is already used by another work session",workSessionCreateFailed:"Could not create work session",workSessionReplaceInvalid:"Invalid work session replacement request",workSessionReplaceOccupied:"Pi session is bound to another work session",workSessionReplaceFailed:"Could not replace the Pi session",workSessionRenameInvalid:"Invalid work session title request",workSessionRenameChanged:"Work session changed. Reopen the title editor",workSessionRenameFailed:"Could not rename the work session",workSessionDeleteInvalid:"Invalid work ID",workSessionDeleteFailed:"Could not delete work session",workSessionSortInvalid:"Invalid work session order or pinned count",workSessionOrderChanged:"Work session list changed. Refresh and try again",workSessionSortFailed:"Could not reorder work sessions",sessionTreeInvalid:"Invalid session tree request",sessionTreeChanged:"Work session changed. Reopen the session tree",sessionTreeFailed:"Could not read session tree",sessionTreeEntryInvalid:"Invalid session tree entry request",sessionTreeEntryMissing:"Session tree entry not found or no longer available",sessionTreeEntryFailed:"Could not read session tree entry",branchInputInvalid:"Invalid branch operation request",branchEntryMissing:"Branch entry not found or no longer available",branchForkUserOnly:"Only user messages can start a new session",branchCloneEmpty:"There are no messages to clone yet",branchFailed:"Could not perform branch operation",taskDetailInvalid:"Invalid task detail request",taskSourceChanged:"Work session source changed",taskMissing:"Task not found",taskDetailUnsupported:"Task does not provide conversation details",taskMessageMissing:"Task message not found",taskMessageNoDetail:"Task message has no details",taskConversationUnavailable:"Task conversation is temporarily unavailable",taskMessageFailed:"Could not read task message details",taskImageMissing:"Task image not found",taskImageFailed:"Could not read task image",refreshInvalid:"Invalid forceRefresh setting",piDirectoriesFailed:"Could not list Pi project directories",ignoredDirectoriesFailed:"Could not list ignored folders",directoryIgnoreInvalid:"Invalid ignored folder request",directoryIgnoreFailed:"Could not update ignored folders",historyQueryInvalid:"Invalid session history search",historyQueryFailed:"Could not list Pi session history",userMessagesInvalid:"Invalid user message request",piSessionMissing:"Pi session not found",userMessagesFailed:"Could not load past user messages",projectJsonInvalid:"Invalid project request JSON",projectInputInvalid:"Invalid project request",projectCwdAbsolute:"Project directory must be an absolute path",projectOperationFailed:"Project operation failed",capabilityGetInvalid:"Invalid capability mode query",capabilityGetFailed:"Could not read capability modes",capabilityReplaceInvalid:"Invalid capability mode configuration",capabilityReplaceFailed:"Could not save capability modes",pluginResourceMissing:"Plugin browser resource not found",pluginResourceReadFailed:"Could not read plugin browser resource",hostResourceMissing:"Host plugin resource not found",hostRuntimeUnavailable:"Host plugin runtime is not built",hostResourceReadFailed:"Could not read Host plugin resource",gitAddJsonInvalid:"Invalid JSON for new Git branch",gitAddInputInvalid:"Invalid new Git branch request",gitAddFailed:"Could not create Git branch",gitSwitchJsonInvalid:"Invalid Git branch switch JSON",gitSwitchInputInvalid:"Invalid Git branch switch request",gitSwitchFailed:"Could not switch Git branch",gitReadOperationFailed:"Could not read Git data",pluginNpmRootUnavailable:"Pi Package npm root is unavailable: {{detail}}",pluginNpmRootMissingDeclarations:"Pi Package configuration does not match the npm root (missing declarations: {{declarations}})",pluginNpmRootMissingFolders:"Pi Package configuration does not match the npm root (missing folders: {{folders}})",pluginNpmRootMissingBoth:"Pi Package configuration does not match the npm root (missing declarations: {{declarations}}; missing folders: {{folders}})",pluginReloadBlocked:"Work session {{workId}} blocked plugin reload: {{reason}}",pluginRuntimeBusy:"Plugin runtime still has active calls",pluginRestartPending:"Another plugin operation must finish restarting first",pluginRestartUnavailable:"This launch mode cannot restart Pi Desk automatically",pluginNotFound:"Plugin not found: {{source}}",pluginSourceInvalid:"Invalid plugin source"},auth:{title:"Sign in to Pi Desk",subtitle:"Continue your work.",protection:"Sign-in protection",enabled:"Enabled",disabled:"Not enabled",publicAccess:"Anyone who can reach this service can open the workspace.",changePassword:"Change password",setPassword:"Set a password",newPassword:"New password",passwordHint:"12–64 characters; use at least three of: uppercase letters, lowercase letters, numbers and symbols. No leading/trailing spaces, line breaks or invisible control characters.",generatePassword:"Generate password",generatePasswordHint:"Generate a random 16-character password",generatePasswordFailed:"Unable to generate a password. Please try again.",saveEffect:"Keep your password safe. Saving requires all devices to sign in again.",enable:"Enable sign-in protection",saveAndSignIn:"Save and sign in again",saving:"Saving…",logout:"Sign out",signingOut:"Signing out…",logoutFailed:"Unable to sign out. Please try again later.",logoutInvalid:"Invalid sign-out request.",logoutCrossOriginDenied:"Cross-site sign-out requests are not allowed.",disable:"Disable protection",disableTitle:"Disable sign-in protection?",disableDescription:"Anyone who can reach this service will be able to open the workspace. Continue?",recovery:"Forgot your password?",recoveryDescription:"Delete this file on the device running the service, then refresh the page to restore access.",settingsFailed:"Unable to load or save sign-in protection settings.",settingsInvalid:"The password does not meet the requirements shown below the field.",configUnavailable:"Unable to read sign-in protection settings. Repair the configuration or delete auth.json and set it up again.",crossOriginDenied:"Cross-site changes to sign-in protection are not allowed.",password:"Password",submit:"Sign in",submitting:"Signing in…",loginFailed:"Unable to sign in",invalidResponse:"Invalid response from the sign-in service",invalidCredentials:"Sign-in failed. Check your sign-in details and try again.",invalidInput:"Sign-in failed. Check your sign-in details and try again.",unavailable:"Sign-in is temporarily unavailable. Please try again later.",tooManyAttempts:"Too many sign-in attempts. Please try again later.",loginAlertTitle:"Unusual sign-in activity",loginAlertDescription:"More than 5 consecutive sign-in failures. Check whether these attempts were yours.",invalidClient:"Invalid client identifier"},capabilityModes:{saved:"Capability modes saved",saving:"Saving…",saveModes:"Save modes",settings:"Capability mode settings",editMode:"Edit mode",selectMode:"Select a capability mode to edit",unnamedMode:"Unnamed mode",allDefault:"All enabled \xb7 Default",addMode:"Add mode",copyMode:"Copy current mode",copyTitle:"Copy mode",deleteMode:"Delete current mode",deleteTitle:"Delete mode",refreshCatalog:"Refresh capability options",retryRead:"Retry loading",loadingCatalog:"Loading capability options…",allEnabled:"All enabled",allDescription:"Use all loaded capabilities.",unsaved:"Unsaved changes",allIsDefault:"All enabled is the default mode",policyAll:"Enable all",policyAllow:"Only these",policyDeny:"Exclude these",policyNone:"Disable all",ruleEditor:"Edit {{name}} rules",ruleMode:"{{name}} availability",exclusions:"Exclusions",ruleSearch:"Search or enter capability rules",ruleSearchPlaceholder:"Search names or enter * patterns",clearSearch:"Clear rule search",selectedOnly:"Selected only",selectedShort:"Selected",allowRules:"Allow rules",excludeRules:"Exclude rules",selectedCount_one:"{{count}} selected",selectedCount_other:"{{count}} selected",selectVisible:"Select visible",clearSelected:"Clear selected",addRule:"Add rule",allowValue:"Allow {{name}}",excludeValue:"Exclude {{name}}",pattern:"Pattern",noMatches:"No matches; you can add the rule above.",noSelection:"No rules selected yet.",enterPattern:"Enter a name or wildcard rule to add it.",moreRules:"Show more \xb7 {{count}} remaining",deleteConfirm:"Delete capability mode?",saveConfirm:"Save mode changes?",deleteDescription:"Delete “{{name}}” and save? Sessions using it will switch to All enabled.",unsavedDescription:"Changes to capability modes have not been saved.",cancel:"Cancel",delete:"Delete mode",discard:"Discard changes",saveContinue:"Save and continue",modeName:"Mode name",category:"Capability categories",groupTools:"Tools",modeSwitching:"Switching…",modePicker:"Capability mode: {{name}}",catalogFailed:"Could not load capability options",saveFailed:"Could not save capability modes",copySuffix:"{{name}} copy",newMode:"New mode"},pluginManagement:{actionAdd:"Install plugin",actionUpdate:"Update plugin",actionDelete:"Uninstall plugin",actionReload:"Restart Pi Desk",restartNormal:"Restart with plugins",restartNormalDescription:"Restart Pi Desk and load external plugins again. All connections will be restored after restart.",applyChanges:"Load changes",applyDescription:"Update plugin services and views now. Existing Pi sessions keep their extensions until manually reloaded.",reloadOne:"Reload",reloadSource:"Reload {{name}}",basicModeNotice:"Basic mode skips plugin loading and inspection. Repair files using chat, then choose Restart with plugins.",localExtension:"Local source",localSourceHelp:"Manage this entry in its source directory",discovered:"Enabled",disabledByPi:"Disabled",active:"Enabled",notLoaded:"Not loaded",phase_queued:"Queued",phase_checking:"Checking",phase_applying:"Applying",phase_waiting:"Waiting to activate",phase_failed:"Failed",updateCheckFailed:"Could not check plugin updates",actionFailed:"{{action}} failed",retrying:"Retrying {{name}}",retryFailed:"Could not retry plugin UI",refreshingEntries:"Refreshing plugin UI",refreshEntriesFailed:"Could not refresh plugin UI",detailFailed:"Could not load plugin details",title:"Plugins",description:"Manage plugin packages and local extensions.",noPluginDescription:"No description available",checkUpdates:"Check updates",checkingUpdates:"Checking…",restartApply:"Restart to finish",installPlugin:"Install plugin",source:"Plugin source",sourcePlaceholder:"npm package, Git URL or local directory",install:"Install",installVersion:"Install this version",installIncompatible:"This plugin version is incompatible with the current Pi Desk version and cannot be installed.",pendingRestart:"Plugin changes will take effect after restart",retry:"Retry",confirmAction:"{{action}}?",restartDescription:"Restart Pi Desk to apply pending changes. Connections will be restored after restart.",cancel:"Cancel",installed:"Installed plugins",loading:"Loading plugins…",updateAvailable:"Update available",abnormal:"Error",capabilityCategories:"Plugin capability categories",update:"Update",details:"Details",viewDetails:"View plugin details: {{name}}",remove:"Uninstall",empty:"No plugins found",viewLoading:"Loading plugin UI…",viewFailed:"Could not load plugin UI",closeApplication:"Close plugin application",closeNamedApplication:"Close {{name}}",eventAgentStart:"Before agent starts",eventAgentStartDescription:"Can append to or replace the system prompt and inject session messages.",eventContext:"Before model call",eventContextDescription:"Can replace the messages sent to the model for this call.",eventInput:"User input",eventInputDescription:"Can rewrite, intercept or handle user input.",eventProvider:"Before provider request",eventProviderDescription:"Can replace the final provider payload.",eventToolCall:"Before tool call",eventToolCallDescription:"Can modify tool arguments or block execution.",eventToolResult:"After tool result",eventToolResultDescription:"Can modify tool results entering later model context.",eventMessageEnd:"After message completes",eventMessageEndDescription:"Can replace the final message and affect later context.",eventBeforeCompact:"Before context compaction",eventBeforeCompactDescription:"Can cancel compaction or replace the summary.",contributionApplication:"Application",contributionComposer:"Composer panel",contributionSettings:"Settings page",contributionMessage:"Message view",contributionSidebar:"Session sidebar",contributionWidget:"Composer widget",contributionSessionHeader:"Session header item",tagTools:"{{count}} tools",tagFixed:"{{count}} fixed prompts",tagDynamic:"{{count}} dynamic hooks",tagOverride:"{{count}} builtin overrides",tagManual:"{{count}} manual prompts",tagInteraction:"{{count}} interactions",unknown:"Unknown",stateActive:"Active",stateInactive:"Inactive",stateShadowed:"Overridden",copied:"Copied",copy:"Copy",copyNamed:"Copy {{name}}",dynamicTitle:"Dynamic context hooks",dynamicDescription:"These hooks can affect prompts and messages, but registration does not mean each call changed them.",arguments:"Arguments",none:"None",required:"Required",optional:"Optional",noArguments:"This tool takes no arguments.",rawSchema:"Raw schema",toolCapabilities:"Tool capabilities",toolDescription:"Each tool shows its purpose, parameters and declared system prompts.",overridesBuiltin:"Overrides a Pi builtin tool",noDescription:"No description provided",systemPrompts:"System prompts",inactivePrompt:"This tool is inactive; its prompts do not enter the system prompt.",truncated:"Content exceeds 64 KB; showing the first 64 KB.",resourcesTitle:"Skills and prompts",resourcesDescription:"Callable Skills contribute metadata to the system prompt; full content is loaded on demand. Prompt templates expand when invoked by the user.",skillModelVisible:"Description in system prompt",manualOnly:"Manual invocation only",skillMetadata:"Skill metadata in system prompt",viewSkillContent:"View Skill content",viewPromptContent:"View prompt content",otherCapabilities:"Other capabilities",messageDeclarations:"Message declarations:",backToList:"Back to plugins",incompleteCapabilities:"Capability list incomplete: {{error}}",metricToolDefinitions:"Tool definitions",metricFixed:"Fixed prompts",metricDynamic:"Dynamic hooks",metricManual:"Manual prompt resources",loadingFullDetails:"Loading full capability details",installedTab:"Installed",searchPlugins:"Find plugins",directInstall:"Manual install",advancedOptions:"Advanced options",capabilityDetails:"Features and runtime details",newVersion:"New v{{version}}",removeNamed:"Uninstall {{name}}",updateAll:"Update all ({{count}})",batchManage:"Select plugins",finishSelection:"Done",selectAll:"Select all",filterStatus:"Plugin status",statusFilter_all:"All statuses",statusFilter_updates:"Updates available",statusFilter_disabled:"Disabled",statusFilter_failed:"Errors",batchWaiting:"Not submitted. Finish pending operations, then try again.",batchInstall:"Install plugins",batchSourcePlaceholder:"One npm package per line; a single source can also be a Git URL or local directory",batchNpmOnly:"Enter one npm package per line for batch installation.",batchLimit:"Choose up to 32 plugins per batch.",batchFailed:"Could not submit plugin changes",sourceBusy:"This plugin has an operation in progress. Try again when it finishes.",selectFiltered:"Select all results",selectPlugin:"Select {{name}}",selectedCount:"{{count}} selected",clearSelection:"Clear selection",checkSelected:"Check selected",updateSelected:"Update selected",removeSelected:"Uninstall selected",setChannel:"Set channel",installChannel:"Version preference",defaultChannel:"Default",automaticVersion:"Default version",allChannels:"All channels",filterChannel:"Filter by channel",channelLatest:"Stable",channelDev:"Development",followingChannel:"Channel: {{tag}}",targetVersion:"Target: {{version}}",itemCheckFailed:"Update check failed: {{error}}",filterInstalled:"Search installed plugins",noMatches:"No matching plugins",enabled:"Enabled",disabled:"Disabled",enable:"Enable",disable:"Disable",togglePlugin:"Enable or disable {{name}}",submitting:"Submitting…",installing:"Installing…",alreadyInstalled:"Installed",retryView:"Retry plugin view",more:"More",downloadSource:"Download source",installDownloadSource:"Download source for this install",useDefaultSource:"Use saved default",download_local:"No override (local configuration)",download_auto:"Automatic",download_domestic:"China mirror",download_official:"Official npm",download_custom:"Custom",registryUrl:"Registry URL",sourceDetails:"View source URL",recommending:"Choosing a source…",saving:"Saving…",save:"Save",settingsFailed:"Could not save or read download settings",invalidRegistry:"Enter a valid HTTP or HTTPS registry URL without credentials, query or fragment.",searchPlaceholder:"Search plugin name or description",searchSource:"Search registry",publicNpm:"Public npm",customSearchSource:"Custom registry",searchRegistryUrl:"Search registry URL",pluginKind:"Plugin type",kind_all:"All types",kind_desk:"Pi Desk",kind_pi:"Pi",kind_unknown:"Unverified type",official:"Official",publisher:"Publisher",unknownPublisher:"Publisher not provided",searchFailed:"Could not search plugins",searching:"Searching…",noSearchResults:"No matching plugins. Try another search.",loadMore:"Load more",loadingPackage:"Loading package details…",readPackage:"Read package details",version:"Version",packageName:"Package",readme:"README",noReadme:"No README provided",readmeLanguage:"Language",defaultLanguage:"Automatic / original",compatible:"Compatible",incompatible:"Not compatible with this version",compatibilityUnknown:"Compatibility not verified",homepage:"Website",repository:"Source code",removeDescription:"Remove this plugin. Saved configuration and data will be kept.",thirdPartyDescription:"This plugin can execute code on your computer. Only install it if you trust its publisher and source.",confirmChange:"Apply this change to the selected plugin.",fromSource:"Version from source",pluginDetails:"Plugin details",pluginRemoved:"This plugin is no longer installed.",close:"Close"},projectHistory:f.p.en,settings:{title:"Settings",general:"General settings",workCapabilities:"Tools & models",application:"Application",category:"Settings section",appearance:"Appearance",region:"Language & time zone",habits:"Preferences",loginProtection:"Sign in",models:"Models",mcpSettings:"MCP",capabilityModes:"Capability modes",skills:"Skills",plugins:"Plugins",pluginSettings:"Plugin settings",about:"About",language:"Language",timeZone:"Time zone",currentLanguage:"Current language: {{locale}}",currentTimeZone:"Current time zone: {{timeZone}}",timeExample:"Local time",searchTimeZones:"Search time zones",reloadLanguage:"Reload to use this language",version:"Current version",versionUpdated:"Version updated",webDescription:"Pi in your browser",discardModelTitle:"Unsaved model settings",discardModelDescription:"Discard changes to model settings?",discardModelConfirm:"Discard changes",theme:"Theme",themeLight:"Light",themeDark:"Dark",displaySize:"Display size",sizeCompact:"Compact",sizeStandard:"Standard",sizeLarge:"Large",displayPreview:"Display preview",displayPreviewContent:'## Project progress\n\nToday we organized the work plan. Next, we will finish the remaining tasks.\n\n```ts\nconst status = "ready"\n```',browserOnly:"These settings only apply to this browser.",newSessionBehavior:"After creating a session",behaviorNone:"Keep current session",behaviorNoneDescription:"Stay in the current session after creating another.",behaviorActivate:"Switch to new session",behaviorActivateDescription:"Open the new session immediately.",behaviorPin:"Pin automatically",behaviorPinDescription:"Pin the new session and keep the current one active.",desktopOnlyBehavior:"Applies on desktop only; mobile always opens the new session.",imagePreviewMode:"Image preview",imageCompressed:"Optimized preview",imageCompressedDescription:"Reduce data use for large images without modifying project files.",imageOriginal:"Original image",imageOriginalDescription:"Keep original quality; large images use more data.",imagePreviewApply:"Changes apply to newly loaded or manually reloaded images.",modelProviders:"Model management",modelPresets:"Common combinations",serviceAddress:"Service address",serviceKey:"Access key",serviceId:"Service ID",serviceIdInvalid:"Enter a unique, non-empty service ID.",serviceConnection:"Service connection",serviceSettingsNamed:"{{name}} connection settings",currentServiceSettings:"Current service connection settings",modelAddToService:"Add a model to {{name}}",inheritService:"Inherit service settings",inheritServiceValue:"Inherit service: {{value}}",applyServiceDraft:"Apply to draft",serviceDraftScope:"Used by {{count}} models. Apply here, then save the model configuration.",discardServiceTitle:"Unsaved connection changes",discardServiceDescription:"Discard this connection draft?",selectModelToEdit:"Select a model to edit",backModelList:"Back to model list",modelIdRequired:"Enter a model ID.",modelNameRequired:"Enter a display name.",capacityInvalid:"Enter a positive number with up to three decimal places.",priceInvalid:"Enter a non-negative number.",inputAndThinking:"Input and reasoning",addModelPreset:"Add to common combinations",saveBeforePreset:"Save this model before adding it to common combinations.",modelDraftPending:"Configuration changes are not saved",modelDraftClean:"No unsaved changes",fixModelInputs:"Correct the invalid model fields before saving",revertModels:"Discard configuration changes",modelMoreActions:"Model configuration actions",nativeConfig:"Pi configuration",nativeConfigEditor:"Pi model configuration",nativeConfigScope:"Edit the complete models.json configuration, including modelOverrides, inputLimits, promptCache, samplingParams and tiered pricing.",nativeProtectDraft:"Save or discard your form changes before opening Pi configuration.",saveNativeConfig:"Save Pi configuration",discardNativeTitle:"Unsaved Pi configuration",discardNativeDescription:"Discard changes to the Pi configuration?",projectDefault:"Project defaults",loadingModels:"Loading model settings…",modelsUnavailable:"Model settings unavailable",modelsLoadFailed:"Could not load model settings",catalogCached:"Refresh failed. Using the previous model catalog.",catalogPartial:"Model catalog partly updated. Failed sources are using cached data.",catalogUnchanged:"Model catalog is already up to date.",catalogUpdated:"Model catalog updated.",catalogRefreshFailed:"Could not refresh the model catalog",modelsNoChanges:"There are no model configuration changes to save.",removeInvalidPresetsTitle:"Remove invalid common combinations?",removeInvalidPresets_one:"{{count}} common combination refers to a removed model. Saving will remove this combination.",removeInvalidPresets_other:"{{count}} common combinations refer to removed models. Saving will remove them.",removeAndSave:"Remove and save",replaceProjectDefaultsTitle:"Update project default models",replaceProjectDefaultsDescription:"The following project defaults will be updated or cleared. Confirm to save all changes together.",clearProjectDefault:"Clear project default",confirmAndSaveModels:"Confirm and save",modelSaved:"Model configuration saved.",modelSaveFailed:"Could not save the model configuration",catalogUpdatedAt:"Reference catalog updated at {{time}}",catalogUnavailable:"Reference catalog unavailable",refreshingCatalog:"Refreshing…",refreshCatalog:"Refresh model catalog",savingModels:"Saving…",saveModels:"Save model configuration",thinkingOff:"Off",thinkingMinimal:"Minimal",thinkingLow:"Low",thinkingMedium:"Medium",thinkingHigh:"High",thinkingXhigh:"Very high",thinkingMax:"Maximum",priceMissing:"Price unavailable",priceInput:"Input {{price}}",priceOutput:"Output {{price}}",priceCacheRead:"Cached {{price}}",priceCacheWrite:"Cache write {{price}}",perMillionTokens:" / million tokens",catalogSearchFailed:"Could not search the model catalog",catalogSelected:"Selected {{provider}} / {{model}}.",modelId:"Model ID",modelIdSearch:"Search and select by model ID",chooseModel:"Choose or change model",matchingCatalog:"Finding models…",noCatalogMatches:"No matching models",officialRecommended:"Official recommendation",sameConfiguration:"{{count}} identical sources",contextAndOutput:"{{context}} context \xb7 {{output}} output",contextAndOutputTitle:"Context {{context}} tokens, maximum output {{output}} tokens",moreConfigurations:"Show {{count}} more configurations",modelName:"Display name",contextLength:"Context window",maximumOutput:"Maximum output per request",capabilities:"Capabilities",textInput:"Text input",imageInput:"Image input",supportsThinking:"Supports reasoning",thinkingMapping:"Thinking levels and provider mapping",providerMapping:"{{level}} provider mapping",noMapping:"No mapping",price:"Pricing",inputPrice:"Input price / million tokens",outputPrice:"Output price / million tokens",cacheReadPrice:"Cache read price",cacheWritePrice:"Cache write price",clearPrice:"Clear pricing",advancedCompatibility:"Advanced settings",apiOverride:"Model API override",baseUrlOverride:"Model Base URL override",inheritProvider:"Leave blank to inherit the provider",developerRole:"Supports Developer Role",replayReasoning:"Replay reasoning_content",modelHeaders:"Model headers",headerPlaceholder:"Header-Name: value, one per line",useDefault:"Use default",yes:"Yes",no:"No",providerNew:"Add service connection",accountCustomApi:"Custom API",accountLogin:"Sign in",accountRelogin:"Sign in again",accountLogout:"Sign out",accountLogoutTitle:"Sign out of this service?",accountLogoutDescription:"Sign out of “{{name}}”? Its account models will be unavailable until you sign in again. Your model selections and drafts will be kept; this will not switch the current session.",accountLogoutFailed:"Could not sign out",accountCustomSettings:"Custom API settings",accountCustomModel:"Custom model",accountChooseProvider:"Choose a service",accountLoadingProviders:"Loading services…",accountNoProviders:"No sign-in services available",accountChooseOption:"Choose an option",accountContinue:"Continue",accountWaiting:"Waiting for authorization…",accountLoggedIn:"Signed in",accountLoggedOut:"Not signed in",accountLoginFailed:"Could not sign in",accountRefreshFailed:"Signed in, but could not refresh the model list",accountDisconnected:"Connection lost. This sign-in was cancelled. Reconnect, then start again.",accountConnectionNotReady:"Connection is not ready. Try again after it reconnects.",accountDeviceCode:"Authorization code",accountCopyCode:"Copy code",accountOpenLink:"Open authorization page",accountCopyLink:"Copy link",accountInvalidLink:"This authorization link is not a valid web address.",accountCopied:"Copied",accountCopyFailed:"Could not copy",accountModelSearch:"Search model name or ID",accountModelAdded:"Added",accountNoModels:"No matching models",accountAddLater:"Add later",accountAddSelected:"Add {{count}} selected",accountModelUnavailable:"This model is no longer available in the service catalog. You can remove it from your configuration.",accountModelUnavailableShort:"Unavailable",accountSubscription:"Subscription",accountReferencePrice:"Reference pricing",accountAdjustParameters:"Adjust parameters",accountRestoreDefaults:"Restore defaults",accountRemove:"Remove model",accountRemoveTitle:"Remove model?",accountRemoveDescription:"Remove “{{name}}” from your model list? This takes effect after saving and does not sign you out.",providerUnnamed:"Service ID required",providerList:"Model services",providerSummary:"{{providers}} providers \xb7 {{models}} models",providerConfig:"Provider configuration",providerEmpty:"No services configured",providerModels:"{{count}} custom models",providerDelete:"Remove service",providerDeleteTitle:"Remove service?",providerDeleteDescription:"Remove “{{name}}” and its {{count}} models? The change takes effect after you save.",modelDeleteTitle:"Remove model?",modelDeleteDescription:"Remove “{{name}}”? The change takes effect after you save.",providerIdExample:"e.g. my-provider",providerApiType:"Default API",providerAdvanced:"Advanced connection settings",providerAuthHeader:"Add Authorization header automatically",providerHeaders:"Service headers",modelsHeading:"Models",modelAdd:"Add model",modelEmpty:"No models yet",modelUnnamed:"Unnamed model",modelIdPending:"Model ID required",modelDelete:"Remove model",modelDeleteNamed:"Remove model {{name}}",presetDescription:"Choose a model and reasoning level quickly in chat. Drag or use the buttons to reorder.",presetDrag:"Drag to reorder",presetMoveUp:"Move combination up",presetMoveDown:"Move combination down",presetModel:"Combination model",presetModelNew:"Model for new combination",modelSearch:"Search model name, service ID or model ID",thinkingLevel:"Thinking level",presetThinking:"Combination thinking level",presetThinkingNew:"Thinking level for new combination",presetColor:"Color",presetColorLabel:"Combination color",presetColorNone:"No color",presetColorCustom:"Custom color",presetColorBlue:"Blue",presetColorCyan:"Cyan",presetColorGreen:"Green",presetColorAmber:"Amber",presetColorOrange:"Orange",presetColorRed:"Red",presetColorPink:"Pink",presetColorPurple:"Purple",presetDelete:"Remove combination",presetAdd:"Add",presetEmpty:"No common combinations yet",projectSessionCount_one:"{{count}} session",projectSessionCount_other:"{{count}} sessions",projectDirectoriesFailed:"Could not load project directories",projectDefaultFailed:"Could not load project model defaults",projectDefaultSaved:"Project model default saved.",projectDefaultGlobalSaved:"Project is following the current global Pi model.",projectDefaultSaveFailed:"Could not save the project model default",projectLoading:"Loading project settings…",projectDescription:"Project settings take precedence over Pi’s current global selection. Changing a model in chat will not change this setting.",projectEmpty:"No project directories with Pi sessions found",project:"Project",projectSearch:"Search project paths",projectList:"Project list",backProjectList:"Back to project list",selectProjectToConfigure:"Select a project to configure its default model",projectDefaultSource:"Project model default source",projectFollowGlobal:"Follow current global Pi selection",projectFollowGlobalDescription:"Do not set a separate default model for this project.",projectFixed:"Set a project default",projectFixedDescription:"Select a model and reasoning level for this project.",projectDefaultModel:"Default model",projectDefaultThinking:"Project default thinking level",fromPreset:"Choose from common combinations",saveProjectDefault:"Save project default"},skills:g.P.en,taskCenter:h.U.en,workbench:i.R.en,workbenchPicker:{sessionFallback:"Session {{id}}",newSession:"New session",scopeTitle:"Title",scopeUser:"User messages",scopeAssistant:"AI replies",scopeUserMatches:"User messages {{count}}",scopeAssistantMatches:"AI replies {{count}}",loadUserFailed:"Could not load user messages",ignoredRestoreTitle:"Restore ignored folder",browseOtherTitle:"Choose a project folder",replaceTitle:"Replace work session",createTitle:"Create work session",ignoredRestoreDescription:"This project will appear again in regular folder lists.",browseDescription:"Browse the filesystem of the server running Pi Desk to choose a project directory.",replaceDescription:"Replace: {{project}} \xb7 {{session}}",replaceMissingDescription:"Replacement target is no longer available. Close this dialog and select a work session again.",createDescription:"Choose an existing Pi project or browse server folders to create a work session.",searchHistory:"Search past sessions",searchBrowser:"Search folders in this location",searchIgnored:"Search ignored folders",searchProjects:"Search project names or full paths",currentProject:"Current project: {{path}}",ignoredCount_one:"{{count}} ignored folder",ignoredCount_other:"{{count}} ignored folders",rootChoose:"Choose a drive or root directory",root:"Drives or root directories",replaceChooseFirst:"Choose a project to see its available past sessions.",regularExcludesIgnored:"Ignored projects are excluded from regular folder lists.",loadingHistory:"Loading past sessions…",loadingIgnored:"Loading ignored folders…",loadingBrowser:"Browsing server folders…",loadingProjects:"Loading Pi projects…",backFolders:"Back to folder list",pastePath:"Paste a full folder path and press Enter",fullPath:"Full folder path",openTyped:"Open entered folder",enterAbsolute:"Enter an absolute folder path",open:"Open",absoluteExample:"Enter an absolute folder path, e.g. C:\\projects\\example.",pasteHint:"Paste and open a full path; Windows “Copy as path” is supported.",searchScopes:"Search in",replaceTargetMissing:"Replacement target is no longer available.",noHistoryMatches:"No matching past sessions",noReplaceHistory:"This project has no available past sessions",sessionFound_one:"{{count}} session found",sessionFound_other:"{{count}} sessions found",sessionMessages:"{{users}}/{{total}} messages \xb7 {{time}}",replacing:"Replacing",current:"Current",alreadyUsed:"In use",targetUnavailable:"Target unavailable",replace:"Replace",currentBound:"This past session is bound to the current work session",historyUsed:"This past session is in use by another work session",replaceTargetUnavailable:"Replacement target is unavailable",replaceWith:"Replace with {{name}}",hideUserMessages:"Hide user messages",viewMatching_one:"View {{count}} match",viewMatching_other:"View all {{count}} matches",viewUserMessages_one:"View {{count}} user message",viewUserMessages_other:"View {{count}} user messages",viewMatch:"View {{label}}",matchingUserCount:"{{count}} matching user messages",userCount:"{{count}} user messages",viewAll:"View all",noUserMessages:"No user messages to display",noText:"(no text)",loadMore:"Load more",browserEmpty:"No subfolders here. You can select this folder.",rootsEmpty:"No drives or root directories to browse",subfoldersNoMatches:"No matching subfolders",ignoredEmpty:"No ignored Pi projects",projectsEmpty:"No Pi projects available",projectNoMatches:"No matching Pi projects",restoreFolder:"Restore folder {{name}}",restoreTip:"Restore to regular folder lists",restore:"Restore",directorySessions_one:"{{count}} session \xb7 {{time}}",directorySessions_other:"{{count}} sessions \xb7 {{time}}",directoryCount_one:"{{count}} session",directoryCount_other:"{{count}} sessions",creating:"Creating",ignoreFolder:"Ignore folder {{name}}",ignoreTip:"Hide from regular folder lists",ignoredFolders:"Ignored folders",chooseOther:"Choose another folder",selectCurrent:"Select this folder",parentDirectory:"Back to parent folder",backRoots:"Back to drives or roots",refreshList:"Refresh this list",filterDefault:"Default",filterNoTools:"Hide tools",filterUserOnly:"User messages",filterLabeled:"Labeled",filterAll:"All",kindUser:"User",kindTool:"Tool",kindMessage:"Message",kindCompaction:"Summary",kindBranchSummary:"Branch summary",kindCustom:"Record",kindModel:"Model",kindThinking:"Thinking",kindSession:"Session",kindLabel:"Label",treeIntent:"Switch the current session branch",forkIntent:"Start a session from a user message",cloneIntent:"Clone the current session",runningTitle:"The current session is running",runningStop:"To continue “{{action}}”, the current response will stop. Saved messages remain available.",runningWait:"To continue “{{action}}”, wait for the running background task to finish.",confirming:"Working…",confirmContinue:"Confirm and continue",back:"Back",confirmHint:"Enter to confirm \xb7 Esc to go back",branchPicker:"Session branch picker",branchTitle:"Session branches",closeBranchPicker:"Close session branch picker",branchSearch:"Search session branches",branchSearchPlaceholder:"Search messages, tools or labels",branchFilter:"Filter session tree, current: {{filter}}",loadingEntry:"Loading full content…",entryEmpty:"No text available for this entry",entryTruncated:"Long content has been truncated.",selectEntry:"Select an entry to view its full content",branchWorking:"Stopping or waiting for the running task…",branchLoading:"Loading session tree…",branchEmpty:"No entries to select yet",branchNoMatches:"No matching session entries",branchTree:"Session tree",collapseBranch:"Collapse branch",expandBranch:"Expand branch",noPreview:"Nothing to preview",switchToMessage:"Switch to {{kind}} message",switch:"Switch",forkFromUser:"Start a session from this user message",branchShortcuts:"↑↓ Select \xb7 Tab Filter \xb7 ←→ Branch \xb7 Enter Switch \xb7 Esc Close"},conversation:j.W.en,projectFiles:k.C.en},"zh-CN":{...l.n["zh-CN"],errors:{invalidJson:"请求 JSON 格式无效",invalidClient:"客户端标识无效",invalidInput:"请求参数无效",sourceExpired:"聊天 Source 已过期",sessionMissing:"工作会话不存在",projectChanged:"工作会话项目已变化",projectMissing:"项目目录不存在",fileMissing:"文件或目录不存在",notDirectory:"目标不是目录",notFile:"目标不是文件",outsideProject:"目标不在当前项目目录内",textTooLarge:"文本文件超过 5MB,暂不支持在线预览",imageTooLarge:"图片过大,暂不支持在线预览",previewUnsupported:"当前文件类型不支持在线预览",fileReadFailed:"读取项目文件失败",projectSearchPatternInvalid:"搜索表达式无效或包含不支持的语法",projectSearchUnavailable:"项目搜索引擎不可用,请重新安装完整运行依赖",projectSearchTimeout:"项目搜索超时,请缩小搜索范围后重试",projectSearchReadFailed:"无法读取项目搜索文件或结果",projectSearchCancelled:"项目搜索已取消",revealFailed:"打开所在文件夹失败",repositoryMissing:"Git 仓库不存在",gitOutsideProject:"Git 目标不在当前项目目录内",gitReadFailed:"读取 Git 仓库失败",skillsInputInvalid:"Skills 请求参数无效",skillsContentTooLarge:"提交文本超过大小限制",skillsProjectChanged:"此项目已不在当前工作区,请重新选择项目",skillMissing:"Skill 或文件已不存在",skillsPermissionDenied:"没有权限读写此 Skill 文件",skillsFileFailed:"Skills 文件操作失败,请重试",chatSubscribeInvalid:"聊天订阅参数无效",chatSubscribeExpired:"聊天订阅绑定已过期",chatSubscribeFailed:"聊天订阅初始化失败",chatSendInvalid:"聊天发送参数无效",chatSendTooLarge:"聊天发送内容超过 31MB",chatInterruptInvalid:"聊天打断参数无效",chatCompactInvalid:"上下文压缩参数无效",chatReloadInvalid:"Pi 配置重载参数无效",chatRestoreInvalid:"恢复队列参数无效",chatRestoreTooLarge:"恢复内容超过传输上限",chatModelInvalid:"模型设置参数无效",chatModeInvalid:"能力模式参数无效",chatSourceBusy:"工作会话正在替换或切换分支",socketUnknownPath:"未知 WebSocket 路径",sessionsNotReady:"工作会话尚未初始化",sessionsInitializing:"工作会话正在初始化",sessionsInitializeInvalid:"工作会话初始化参数无效",sessionsInitializeFailed:"工作会话初始化失败",completionAckInvalid:"工作会话完成确认参数无效",completionAckFailed:"确认工作会话完成状态失败",capabilityFailed:"能力模式请求失败",capabilityRuleInvalid:"请检查模式规则",chatContextJsonInvalid:"系统上下文请求 JSON 格式无效",chatContextInvalid:"系统上下文请求参数无效",chatContextBusy:"当前会话正在运行,暂时无法查看系统上下文",chatContextFailed:"读取系统上下文失败",chatMessageInvalid:"消息详情参数无效",chatMessageMissing:"聊天消息不存在",chatMessageFailed:"查询聊天消息详情失败",chatImageInvalid:"聊天图片参数无效",chatImageMissing:"聊天图片不存在",chatImageFailed:"查询聊天图片失败",modelSettingsInvalid:"模型配置格式无效",modelCatalogInvalid:"模型目录参数无效",modelCatalogUnavailable:"模型参考目录暂不可用",modelSaveFailed:"保存模型配置失败",modelSettingsGetInvalid:"模型配置参数无效",modelSettingsGetFailed:"读取模型配置失败",projectDefaultInputInvalid:"项目目录参数无效",projectDefaultGetFailed:"读取项目默认模型失败",projectDefaultSaveInvalid:"项目默认模型格式无效",projectDefaultSaveFailed:"保存项目默认模型失败",modelsListFailed:"查询模型目录失败",directoryBrowseInvalid:"目录浏览参数无效",directoryMissing:"目录不存在或不是目录",directoryReadDenied:"无法读取目录",directoryBrowseFailed:"浏览服务端目录失败",workSessionCreateInvalid:"cwd 或 sessionId 无效",workSessionDirectoryMissing:"项目目录不存在或不是目录",historySessionMissing:"指定目录中不存在 Pi 会话",historySessionOccupied:"Pi 会话已经关联到其他工作会话",workSessionCreateFailed:"创建工作会话失败",workSessionReplaceInvalid:"替换会话参数无效",workSessionReplaceOccupied:"Pi 会话已绑定到其他工作会话",workSessionReplaceFailed:"替换 Pi 会话失败",workSessionRenameInvalid:"会话标题参数无效",workSessionRenameChanged:"工作会话已切换,请重新打开标题编辑",workSessionRenameFailed:"修改会话标题失败",workSessionDeleteInvalid:"workId 格式无效",workSessionDeleteFailed:"删除工作会话失败",workSessionSortInvalid:"workIds 或 pinnedCount 格式无效",workSessionOrderChanged:"工作会话列表已变化,请刷新后重试",workSessionSortFailed:"更新工作会话排列失败",sessionTreeInvalid:"会话树查询参数无效",sessionTreeChanged:"工作会话已切换,请重新打开会话树",sessionTreeFailed:"读取会话树失败",sessionTreeEntryInvalid:"会话树节点参数无效",sessionTreeEntryMissing:"会话树节点不存在或已失效",sessionTreeEntryFailed:"读取会话树节点详情失败",branchInputInvalid:"分支操作参数无效",branchEntryMissing:"分支节点不存在或已失效",branchForkUserOnly:"只有用户消息可以 Fork",branchCloneEmpty:"当前会话还没有可克隆的消息",branchFailed:"执行分支操作失败",taskDetailInvalid:"任务详情参数无效",taskSourceChanged:"工作会话来源已变化",taskMissing:"任务不存在",taskDetailUnsupported:"任务不支持会话详情",taskMessageMissing:"任务消息不存在",taskMessageNoDetail:"任务消息没有详情",taskConversationUnavailable:"任务会话暂不可用",taskMessageFailed:"查询任务消息详情失败",taskImageMissing:"任务图片不存在",taskImageFailed:"查询任务图片失败",refreshInvalid:"forceRefresh 格式无效",piDirectoriesFailed:"查询 Pi 目录失败",ignoredDirectoriesFailed:"查询忽略目录失败",directoryIgnoreInvalid:"忽略目录参数无效",directoryIgnoreFailed:"更新忽略目录失败",historyQueryInvalid:"历史会话查询参数无效",historyQueryFailed:"查询 Pi 历史会话失败",userMessagesInvalid:"用户消息参数无效",piSessionMissing:"Pi 会话不存在",userMessagesFailed:"查询历史用户消息失败",projectJsonInvalid:"项目请求 JSON 格式无效",projectInputInvalid:"项目请求参数无效",projectCwdAbsolute:"项目目录必须是绝对路径",projectOperationFailed:"项目操作失败",capabilityGetInvalid:"能力模式查询参数无效",capabilityGetFailed:"读取能力模式失败",capabilityReplaceInvalid:"能力模式格式无效",capabilityReplaceFailed:"保存能力模式失败",pluginResourceMissing:"插件资源不存在",pluginResourceReadFailed:"读取插件资源失败",hostResourceMissing:"Host 公共插件资源不存在",hostRuntimeUnavailable:"Host 公共插件 Runtime 尚未构建",hostResourceReadFailed:"读取 Host 公共插件资源失败",gitAddJsonInvalid:"新建 Git 分支请求 JSON 格式无效",gitAddInputInvalid:"新建 Git 分支请求参数无效",gitAddFailed:"新建 Git 分支失败",gitSwitchJsonInvalid:"Git 分支切换请求 JSON 格式无效",gitSwitchInputInvalid:"Git 分支切换请求参数无效",gitSwitchFailed:"切换 Git 分支失败",gitReadOperationFailed:"读取 Git 失败",pluginNpmRootUnavailable:"Pi Package npm 根不可用:{{detail}}",pluginNpmRootMissingDeclarations:"Pi Package 配置与 npm 根不一致(缺少声明:{{declarations}})",pluginNpmRootMissingFolders:"Pi Package 配置与 npm 根不一致(缺少目录:{{folders}})",pluginNpmRootMissingBoth:"Pi Package 配置与 npm 根不一致(缺少声明:{{declarations}};缺少目录:{{folders}})",pluginReloadBlocked:"工作会话 {{workId}} 阻止插件重载:{{reason}}",pluginRuntimeBusy:"插件运行时仍有调用正在执行",pluginRestartPending:"已有插件操作需要重启完成",pluginRestartUnavailable:"当前启动方式不支持自动重启 Pi Desk",pluginNotFound:"插件不存在:{{source}}",pluginSourceInvalid:"插件来源无效"},auth:{title:"登录 Pi Desk",subtitle:"继续你的工作会话",protection:"登录保护",enabled:"已启用",disabled:"未启用",publicAccess:"任何能够访问此服务的人都可以进入工作台。",changePassword:"修改密码",setPassword:"设置密码",newPassword:"新密码",passwordHint:"12–64 个字符,至少包含大写字母、小写字母、数字、符号中的三类;不能有首尾空白、换行或不可见控制字符。",generatePassword:"生成密码",generatePasswordHint:"随机生成 16 位密码",generatePasswordFailed:"生成密码失败,请重试。",saveEffect:"请妥善保存密码。保存后,所有设备都需要重新登录。",enable:"启用登录保护",saveAndSignIn:"保存并重新登录",saving:"正在保存…",logout:"退出登录",signingOut:"正在退出…",logoutFailed:"退出登录失败,请稍后重试。",logoutInvalid:"退出登录参数无效。",logoutCrossOriginDenied:"不允许跨站退出登录。",disable:"关闭保护",disableTitle:"关闭登录保护?",disableDescription:"关闭后,任何能够访问此服务的人都可以直接进入工作台。是否继续?",recovery:"忘记密码?",recoveryDescription:"在运行服务的设备上删除下面的文件,然后刷新页面,即可恢复访问。",settingsFailed:"登录保护设置处理失败。",settingsInvalid:"密码不符合要求,请按输入框下方的规则调整。",configUnavailable:"登录保护配置无法读取,请修复配置或删除 auth.json 后重新设置。",crossOriginDenied:"不允许跨站修改登录保护。",password:"密码",submit:"登录",submitting:"正在登录",loginFailed:"登录失败",invalidResponse:"登录服务响应无效",invalidCredentials:"登录失败,请检查登录信息后重试。",invalidInput:"登录失败,请检查登录信息后重试。",unavailable:"登录暂不可用,请稍后重试。",tooManyAttempts:"登录尝试过多,请稍后重试。",loginAlertTitle:"登录异常提醒",loginAlertDescription:"登录已连续失败超过 5 次,请确认是否为本人操作。",invalidClient:"客户端标识无效"},capabilityModes:{saved:"能力模式已保存",saving:"保存中…",saveModes:"保存模式",settings:"能力模式设置",editMode:"编辑模式",selectMode:"选择要编辑的能力模式",unnamedMode:"未命名模式",allDefault:"全开 \xb7 默认",addMode:"新增模式",copyMode:"复制当前模式",copyTitle:"复制模式",deleteMode:"删除当前模式",deleteTitle:"删除模式",refreshCatalog:"刷新能力选项",retryRead:"重试读取",loadingCatalog:"正在读取能力选项…",allEnabled:"全开",allDescription:"使用全部已加载能力。",unsaved:"有未保存的修改",allIsDefault:"全开为默认模式",policyAll:"全部开启",policyAllow:"只开这些",policyDeny:"关闭这些",policyNone:"全部关闭",ruleEditor:"{{name}}规则编辑",ruleMode:"{{name}}开放方式",exclusions:"排除项",ruleSearch:"搜索或输入能力规则",ruleSearchPlaceholder:"搜索名称或输入 * 规则",clearSearch:"清空规则搜索",selectedOnly:"仅看已选",selectedShort:"已选",allowRules:"允许规则",excludeRules:"排除规则",selectedCount_one:"已选 {{count}} 条",selectedCount_other:"已选 {{count}} 条",selectVisible:"全选可见项",clearSelected:"清空已选",addRule:"添加规则",allowValue:"允许 {{name}}",excludeValue:"排除 {{name}}",pattern:"匹配规则",noMatches:"没有匹配项,可直接添加上面的规则。",noSelection:"尚未选择规则。",enterPattern:"输入名称或通配规则即可添加。",moreRules:"显示更多 \xb7 剩余 {{count}} 项",deleteConfirm:"删除能力模式?",saveConfirm:"保存模式修改?",deleteDescription:"删除“{{name}}”并保存后,使用此模式的会话将切回全开。",unsavedDescription:"能力模式的修改尚未保存。",cancel:"取消",delete:"删除模式",discard:"放弃修改",saveContinue:"保存并继续",modeName:"模式名称",category:"能力分类",groupTools:"工具",modeSwitching:"切换中…",modePicker:"能力模式:{{name}}",catalogFailed:"读取能力选项失败",saveFailed:"保存能力模式失败",copySuffix:"{{name}} 副本",newMode:"新模式"},pluginManagement:{actionAdd:"安装插件",actionUpdate:"更新插件",actionDelete:"卸载插件",actionReload:"重启 Pi Desk",restartNormal:"重启并启用插件",restartNormalDescription:"重启 Pi Desk 并重新加载外部插件,完成后恢复所有连接。",applyChanges:"加载变更",applyDescription:"更新插件服务和界面;已有会话扩展保持不变,手动重载 PI 后更新。",reloadOne:"重新加载",reloadSource:"重新加载 {{name}}",basicModeNotice:"基础模式已关闭插件加载与盘点。可以继续聊天修复文件,再选择“重启并启用插件”。",localExtension:"本地源码",localSourceHelp:"在源目录管理此入口",discovered:"已启用",disabledByPi:"已停用",active:"已启用",notLoaded:"未加载",phase_queued:"排队中",phase_checking:"检查中",phase_applying:"应用中",phase_waiting:"等待生效",phase_failed:"操作失败",updateCheckFailed:"检查插件更新失败",actionFailed:"{{action}}失败",retrying:"重试 {{name}}",retryFailed:"重试插件界面失败",refreshingEntries:"刷新插件界面",refreshEntriesFailed:"刷新插件界面失败",detailFailed:"读取插件详情失败",title:"插件",description:"管理插件包与本地扩展。",noPluginDescription:"暂无说明",checkUpdates:"检查更新",checkingUpdates:"检查中…",restartApply:"重启并完成",installPlugin:"安装插件",source:"插件来源",sourcePlaceholder:"npm Package、Git 地址或本地目录",install:"安装",installVersion:"安装此版本",installIncompatible:"此插件版本不兼容当前 Pi Desk,无法安装。",pendingRestart:"插件变化待重启生效",retry:"重试",confirmAction:"确认{{action}}?",restartDescription:"重启 Pi Desk 以应用待处理变更,完成后自动恢复连接。",cancel:"取消",installed:"已安装插件",loading:"正在读取插件",updateAvailable:"可更新",abnormal:"异常",capabilityCategories:"插件能力类别",update:"更新",details:"详情",viewDetails:"查看插件详情:{{name}}",remove:"卸载",empty:"暂无插件",viewLoading:"正在加载插件界面…",viewFailed:"插件界面加载失败",closeApplication:"关闭插件应用",closeNamedApplication:"关闭 {{name}}",eventAgentStart:"任务开始前",eventAgentStartDescription:"具备追加或替换系统提示词、注入会话消息的能力。",eventContext:"模型调用前",eventContextDescription:"具备替换本次发送给模型的会话消息的能力。",eventInput:"用户输入阶段",eventInputDescription:"具备改写、拦截或接管用户输入的能力。",eventProvider:"Provider 请求前",eventProviderDescription:"具备替换最终 Provider Payload 的能力。",eventToolCall:"工具调用前",eventToolCallDescription:"具备修改工具参数或阻止工具调用的能力。",eventToolResult:"工具结果后",eventToolResultDescription:"具备修改进入后续模型上下文的工具结果的能力。",eventMessageEnd:"消息完成后",eventMessageEndDescription:"具备替换最终消息并影响后续上下文的能力。",eventBeforeCompact:"上下文压缩前",eventBeforeCompactDescription:"具备取消压缩或替换压缩摘要的能力。",contributionApplication:"应用入口",contributionComposer:"输入面板",contributionSettings:"设置页",contributionMessage:"消息视图",contributionSidebar:"会话侧栏",contributionWidget:"输入区挂件",contributionSessionHeader:"会话标题项",tagTools:"工具 {{count}}",tagFixed:"固定提示 {{count}}",tagDynamic:"动态影响 {{count}}",tagOverride:"替换内置 {{count}}",tagManual:"手动提示 {{count}}",tagInteraction:"交互 {{count}}",unknown:"未知",stateActive:"启用",stateInactive:"未启用",stateShadowed:"被覆盖",copied:"已复制",copy:"复制",copyNamed:"复制{{name}}",dynamicTitle:"动态上下文能力",dynamicDescription:"以下内容表示插件注册了对应运行时钩子,不代表每次调用都实际修改了提示词或消息。",arguments:"调用参数",none:"无",required:"必填",optional:"可选",noArguments:"该 Tool 不需要参数。",rawSchema:"原始 Schema",toolCapabilities:"工具能力",toolDescription:"每个 Tool 同时展示能力说明、调用参数及其声明的系统提示词。",overridesBuiltin:"替换 Pi 内置工具",noDescription:"未提供能力说明",systemPrompts:"系统提示词",inactivePrompt:"当前 Tool 未启用,不会进入系统提示词",truncated:"正文超过 64KB,当前显示前 64KB。",resourcesTitle:"Skill 与提示模板",resourcesDescription:"可由模型调用的 Skill 只会常驻名称、描述和位置,完整正文按需读取;Prompt 模板仅在用户手动调用后展开。",skillModelVisible:"描述进入系统提示词",manualOnly:"仅手动调用",skillMetadata:"系统提示词中的 Skill 元数据",viewSkillContent:"查看 Skill 正文",viewPromptContent:"查看 Prompt 正文",otherCapabilities:"其他能力",messageDeclarations:"消息声明:",backToList:"返回插件列表",incompleteCapabilities:"能力清单读取不完整:{{error}}",metricToolDefinitions:"工具定义",metricFixed:"当前固定提示",metricDynamic:"动态影响钩子",metricManual:"手动提示资源",loadingFullDetails:"正在读取完整能力详情",installedTab:"已安装",searchPlugins:"搜索插件",directInstall:"手动安装",advancedOptions:"高级选项",capabilityDetails:"功能与运行信息",newVersion:"新版本 v{{version}}",removeNamed:"卸载 {{name}}",updateAll:"全部更新({{count}})",batchManage:"批量管理",finishSelection:"完成",selectAll:"全选",filterStatus:"插件状态",statusFilter_all:"全部状态",statusFilter_updates:"有更新",statusFilter_disabled:"已停用",statusFilter_failed:"异常",batchWaiting:"尚未提交,请完成等待中的操作后重试。",batchInstall:"批量安装",batchSourcePlaceholder:"每行一个 npm 包名;单项也可填写 Git 地址或本地目录",batchNpmOnly:"批量安装时请每行填写一个 npm 包名。",batchLimit:"每次批量操作最多选择 32 个插件。",batchFailed:"提交插件变更失败",sourceBusy:"此插件正在处理其他操作,完成后可重试。",selectFiltered:"全选当前结果",selectPlugin:"选择 {{name}}",selectedCount:"已选 {{count}} 项",clearSelection:"清空选择",checkSelected:"批量检查",updateSelected:"更新所选",removeSelected:"卸载所选",setChannel:"设置渠道",installChannel:"版本偏好",defaultChannel:"默认",automaticVersion:"默认版本",allChannels:"全部渠道",filterChannel:"按渠道筛选",channelLatest:"稳定版",channelDev:"开发版",followingChannel:"跟随 {{tag}}",targetVersion:"目标版本 {{version}}",itemCheckFailed:"查询更新失败:{{error}}",filterInstalled:"搜索已安装插件",noMatches:"没有匹配的插件",enabled:"已启用",disabled:"已停用",enable:"启用",disable:"停用",togglePlugin:"启用或停用 {{name}}",submitting:"正在提交…",installing:"安装中…",alreadyInstalled:"已安装",retryView:"重试插件界面",more:"更多",downloadSource:"下载源",installDownloadSource:"本次安装下载源",useDefaultSource:"使用已保存的默认设置",download_local:"不使用源(本机配置)",download_auto:"自动",download_domestic:"国内加速",download_official:"官方",download_custom:"自定义",registryUrl:"仓库地址",sourceDetails:"查看来源地址",recommending:"正在推荐来源…",saving:"正在保存…",save:"保存",settingsFailed:"保存或读取下载设置失败",invalidRegistry:"请输入有效的 HTTP 或 HTTPS 仓库地址,不包含账号、查询参数或片段。",searchPlaceholder:"搜索插件名称或简介",searchSource:"搜索仓库",publicNpm:"npm 公开仓库",customSearchSource:"自定义仓库",searchRegistryUrl:"搜索仓库地址",pluginKind:"插件类型",kind_all:"全部类型",kind_desk:"Pi Desk",kind_pi:"Pi",kind_unknown:"类型待确认",official:"官方",publisher:"发布者",unknownPublisher:"未提供发布者",searchFailed:"搜索插件失败",searching:"正在搜索…",noSearchResults:"没有匹配的插件,可以换个关键词。",loadMore:"加载更多",loadingPackage:"正在读取包详情…",readPackage:"读取包详情",version:"版本",packageName:"插件包",readme:"使用说明",noReadme:"未提供使用说明",readmeLanguage:"语言",defaultLanguage:"自动 / 原文",compatible:"兼容当前版本",incompatible:"不兼容当前版本",compatibilityUnknown:"兼容性待确认",homepage:"官网",repository:"源码",removeDescription:"卸载此插件,保留已保存的配置和数据。",thirdPartyDescription:"此插件能够在你的电脑上执行代码。请确认信任其发布者和来源后再安装。",confirmChange:"应用此插件变更。",fromSource:"以来源提供的版本为准",pluginDetails:"插件详情",pluginRemoved:"此插件已不在安装列表中。",close:"关闭"},projectHistory:f.p["zh-CN"],settings:{title:"设置",general:"通用设置",workCapabilities:"工作能力",application:"应用",category:"设置分类",appearance:"外观",region:"语言与地区",habits:"习惯",loginProtection:"登录",models:"模型",mcpSettings:"MCP",capabilityModes:"能力模式",skills:"Skills",plugins:"插件",pluginSettings:"插件设置",about:"关于",language:"语言",timeZone:"时区",currentLanguage:"当前语言:{{locale}}",currentTimeZone:"当前时区:{{timeZone}}",timeExample:"当前时间",searchTimeZones:"搜索时区",reloadLanguage:"重新加载以使用该语言",version:"当前版本",versionUpdated:"版本更新时间",webDescription:"Pi 的 Web 端",discardModelTitle:"模型配置尚未保存",discardModelDescription:"要丢弃尚未保存的模型配置吗?",discardModelConfirm:"丢弃修改",theme:"界面主题",themeLight:"浅色",themeDark:"深色",displaySize:"显示大小",sizeCompact:"紧凑",sizeStandard:"标准",sizeLarge:"大号",displayPreview:"界面预览",displayPreviewContent:'## 项目进展\n\n今天整理了工作计划,接下来继续完成待办事项。\n\n```ts\nconst status = "ready"\n```',browserOnly:"设置仅在当前浏览器生效。",newSessionBehavior:"新建会话后的行为",behaviorNone:"无操作",behaviorNoneDescription:"创建后保留当前会话。",behaviorActivate:"切换到新会话",behaviorActivateDescription:"创建后立即进入新会话。",behaviorPin:"自动固定",behaviorPinDescription:"固定新会话,保留当前活跃会话。",desktopOnlyBehavior:"仅桌面端生效;移动端始终进入新会话。",imagePreviewMode:"图片预览方式",imageCompressed:"压缩预览",imageCompressedDescription:"优化大图以减少流量,不修改项目原文件。",imageOriginal:"原图预览",imageOriginalDescription:"保留原始画质,加载大图会消耗更多流量。",imagePreviewApply:"更改后对新加载或主动重新加载的图片生效。",modelProviders:"模型管理",modelPresets:"常用组合",serviceAddress:"服务地址",serviceKey:"访问密钥",serviceId:"服务 ID",serviceIdInvalid:"请填写非空且不重复的服务 ID。",serviceConnection:"服务连接",serviceSettingsNamed:"{{name}}连接设置",currentServiceSettings:"当前服务连接设置",modelAddToService:"在{{name}}添加模型",inheritService:"继承服务设置",inheritServiceValue:"继承服务:{{value}}",applyServiceDraft:"应用到草稿",serviceDraftScope:"供 {{count}} 个模型使用,应用后在主页面保存模型配置。",discardServiceTitle:"连接修改尚未应用",discardServiceDescription:"要丢弃这次连接修改吗?",selectModelToEdit:"选择一个模型进行编辑",backModelList:"返回模型列表",modelIdRequired:"请填写模型 ID。",modelNameRequired:"请填写显示名称。",capacityInvalid:"请输入大于 0 的数值,最多保留三位小数。",priceInvalid:"请输入不小于 0 的数值。",inputAndThinking:"输入与思考",addModelPreset:"加入常用组合",saveBeforePreset:"保存模型后可加入常用组合。",modelDraftPending:"配置有未保存修改",modelDraftClean:"没有未保存的修改",fixModelInputs:"请先修正模型字段,再保存配置",revertModels:"撤销配置修改",modelMoreActions:"模型配置操作",nativeConfig:"Pi 配置",nativeConfigEditor:"Pi 模型配置",nativeConfigScope:"编辑完整 models.json,包括 modelOverrides、inputLimits、promptCache、samplingParams 与阶梯费率。",nativeProtectDraft:"请先保存或撤销表单修改,再打开 Pi 配置。",saveNativeConfig:"保存 Pi 配置",discardNativeTitle:"Pi 配置尚未保存",discardNativeDescription:"要丢弃这次 Pi 配置修改吗?",projectDefault:"项目默认",loadingModels:"加载模型设置…",modelsUnavailable:"模型设置暂不可用",modelsLoadFailed:"模型设置加载失败",catalogCached:"刷新失败,继续使用上次模型目录缓存。",catalogPartial:"模型目录已部分更新,失败来源继续使用缓存。",catalogUnchanged:"模型目录已经是最新。",catalogUpdated:"模型目录已更新。",catalogRefreshFailed:"模型目录刷新失败",modelsNoChanges:"没有需要保存的模型配置。",removeInvalidPresetsTitle:"删除失效的常用组合?",removeInvalidPresets_one:"有 {{count}} 个常用组合引用了已删除模型,保存配置将同时删除这些组合。",removeInvalidPresets_other:"有 {{count}} 个常用组合引用了已删除模型,保存配置将同时删除这些组合。",removeAndSave:"删除并保存",replaceProjectDefaultsTitle:"同步项目默认模型",replaceProjectDefaultsDescription:"以下项目默认将更新或清除,确认后一起保存。",clearProjectDefault:"清除项目默认",confirmAndSaveModels:"确认并保存",modelSaved:"模型配置已保存。",modelSaveFailed:"模型配置保存失败",catalogUpdatedAt:"参考目录更新于 {{time}}",catalogUnavailable:"参考目录尚未可用",refreshingCatalog:"刷新中…",refreshCatalog:"刷新模型目录",savingModels:"保存中…",saveModels:"保存模型配置",thinkingOff:"关闭",thinkingMinimal:"极少",thinkingLow:"低",thinkingMedium:"中",thinkingHigh:"高",thinkingXhigh:"超高",thinkingMax:"最大",priceMissing:"价格未提供",priceInput:"输入 {{price}}",priceOutput:"输出 {{price}}",priceCacheRead:"缓存 {{price}}",priceCacheWrite:"缓存写 {{price}}",perMillionTokens:" / 百万 Token",catalogSearchFailed:"查询模型目录失败",catalogSelected:"已选择 {{provider}} 的 {{model}}。",modelId:"模型 ID",modelIdSearch:"输入模型 ID 搜索并选择",chooseModel:"选择或切换模型",matchingCatalog:"正在匹配模型目录…",noCatalogMatches:"没有匹配的目录模型",officialRecommended:"官方推荐",sameConfiguration:"同配置 \xd7{{count}}",contextAndOutput:"{{context}} 上下文 \xb7 {{output}} 输出",contextAndOutputTitle:"上下文 {{context}} Token,最大输出 {{output}} Token",moreConfigurations:"查看其余 {{count}} 种配置",modelName:"显示名称",contextLength:"上下文容量",maximumOutput:"每次最多输出",capabilities:"能力",textInput:"文本输入",imageInput:"图片输入",supportsThinking:"支持思考",thinkingMapping:"思考等级与服务映射",providerMapping:"{{level}} 服务映射",noMapping:"无需映射",price:"价格",inputPrice:"输入价格 / 百万 Token",outputPrice:"输出价格 / 百万 Token",cacheReadPrice:"缓存读取价格",cacheWritePrice:"缓存写入价格",clearPrice:"清除价格配置",advancedCompatibility:"高级配置",apiOverride:"单独调用方式",baseUrlOverride:"单独服务地址",inheritProvider:"留空继承 Provider",developerRole:"支持 Developer Role",replayReasoning:"回放 reasoning_content",modelHeaders:"模型请求头",headerPlaceholder:"Header-Name: value,每行一个",useDefault:"使用默认",yes:"是",no:"否",providerNew:"添加服务连接",accountCustomApi:"自定义 API",accountLogin:"登录",accountRelogin:"重新登录",accountLogout:"退出登录",accountLogoutTitle:"退出这个服务的登录?",accountLogoutDescription:"退出“{{name}}”后,该账号模型在重新登录前将不可用。保留已收录模型与配置草稿,不切换当前会话。",accountLogoutFailed:"退出登录失败",accountCustomSettings:"自定义 API 设置",accountCustomModel:"自定义模型",accountChooseProvider:"选择服务商",accountLoadingProviders:"加载服务商…",accountNoProviders:"暂无可登录的服务商",accountChooseOption:"请选择",accountContinue:"继续",accountWaiting:"等待授权…",accountLoggedIn:"已登录",accountLoggedOut:"未登录",accountLoginFailed:"登录失败",accountRefreshFailed:"登录成功,但模型列表刷新失败",accountDisconnected:"连接已断开,本次登录已取消。连接恢复后请重新登录。",accountConnectionNotReady:"连接尚未就绪,请在连接恢复后重试。",accountDeviceCode:"授权码",accountCopyCode:"复制授权码",accountOpenLink:"打开授权页面",accountCopyLink:"复制链接",accountInvalidLink:"授权链接不是有效的网页地址。",accountCopied:"已复制",accountCopyFailed:"复制失败",accountModelSearch:"搜索模型名称或 ID",accountModelAdded:"已添加",accountNoModels:"没有匹配的模型",accountAddLater:"稍后添加",accountAddSelected:"添加选中的 {{count}} 个",accountModelUnavailable:"服务目录中已没有这个模型,可以从配置中移除。",accountModelUnavailableShort:"不可用",accountSubscription:"订阅",accountReferencePrice:"参考价格",accountAdjustParameters:"调整参数",accountRestoreDefaults:"恢复默认",accountRemove:"移除模型",accountRemoveTitle:"移除模型?",accountRemoveDescription:"将“{{name}}”从模型列表移除,保存配置后生效,不会退出账号登录。",providerUnnamed:"等待填写服务 ID",providerList:"模型服务",providerSummary:"{{providers}} 个 \xb7 {{models}} 个模型",providerConfig:"Provider 配置",providerEmpty:"还没有配置服务",providerModels:"{{count}} 个自定义模型",providerDelete:"删除服务",providerDeleteTitle:"删除服务?",providerDeleteDescription:"将移除“{{name}}”及其 {{count}} 个模型,保存配置后生效。",modelDeleteTitle:"删除模型?",modelDeleteDescription:"将移除“{{name}}”,保存配置后生效。",providerIdExample:"例如 my",providerApiType:"默认调用方式",providerAdvanced:"高级连接设置",providerAuthHeader:"自动添加 Authorization Header",providerHeaders:"服务请求头",modelsHeading:"模型",modelAdd:"添加模型",modelEmpty:"还没有模型",modelUnnamed:"未命名模型",modelIdPending:"等待填写模型 ID",modelDelete:"删除模型",modelDeleteNamed:"删除模型 {{name}}",presetDescription:"聊天中快速选择的模型与思考等级组合,拖拽或按钮可调整顺序。",presetDrag:"拖拽排序",presetMoveUp:"上移常用组合",presetMoveDown:"下移常用组合",presetModel:"常用模型",presetModelNew:"新增常用模型",modelSearch:"搜索模型名称、服务 ID 或模型 ID",thinkingLevel:"思考等级",presetThinking:"常用思考等级",presetThinkingNew:"新增组合的思考等级",presetColor:"颜色",presetColorLabel:"常用组合颜色",presetColorNone:"无颜色",presetColorCustom:"自定义颜色",presetColorBlue:"蓝色",presetColorCyan:"青色",presetColorGreen:"绿色",presetColorAmber:"琥珀色",presetColorOrange:"橙色",presetColorRed:"红色",presetColorPink:"粉色",presetColorPurple:"紫色",presetDelete:"删除常用组合",presetAdd:"添加",presetEmpty:"还没有常用组合",projectSessionCount_one:"{{count}} 个会话",projectSessionCount_other:"{{count}} 个会话",projectDirectoriesFailed:"项目目录加载失败",projectDefaultFailed:"项目默认模型加载失败",projectDefaultSaved:"项目固定默认模型已保存。",projectDefaultGlobalSaved:"项目已恢复跟随 Pi 全局当前值。",projectDefaultSaveFailed:"项目默认模型保存失败",projectLoading:"加载项目配置…",projectDescription:"项目配置优先于 Pi 全局当前值,普通模型切换不会修改这里。",projectEmpty:"没有找到已有 Pi 会话的项目目录",project:"项目",projectSearch:"搜索项目路径",projectList:"项目列表",backProjectList:"返回项目列表",selectProjectToConfigure:"选择项目配置默认模型",projectDefaultSource:"项目默认模型来源",projectFollowGlobal:"跟随 Pi 全局当前值",projectFollowGlobalDescription:"不单独设置这个项目的默认模型。",projectFixed:"固定项目默认",projectFixedDescription:"为这个项目指定模型和思考等级。",projectDefaultModel:"默认模型",projectDefaultThinking:"项目默认思考等级",fromPreset:"从常用组合选择",saveProjectDefault:"保存项目默认"},skills:g.P["zh-CN"],taskCenter:h.U["zh-CN"],workbench:i.R["zh-CN"],workbenchPicker:{sessionFallback:"会话 {{id}}",newSession:"新会话",scopeTitle:"标题",scopeUser:"用户消息",scopeAssistant:"AI 回复",scopeUserMatches:"用户消息 {{count}}",scopeAssistantMatches:"AI 回复 {{count}}",loadUserFailed:"加载用户消息失败",ignoredRestoreTitle:"恢复忽略目录",browseOtherTitle:"选择项目目录",replaceTitle:"替换工作会话",createTitle:"新建工作会话",ignoredRestoreDescription:"恢复后,该项目会重新出现在所有普通目录列表中。",browseDescription:"浏览运行 Pi Desk 的服务端文件系统,选择项目工作目录。",replaceDescription:"将替换到:{{project}} \xb7 {{session}}",replaceMissingDescription:"替换目标已失效,请关闭后重新选择工作会话。",createDescription:"选择已有 Pi 项目,或浏览服务端目录创建新的工作会话。",searchHistory:"搜索历史会话",searchBrowser:"搜索当前层级的目录",searchIgnored:"搜索已忽略目录",searchProjects:"搜索项目名称或完整路径",currentProject:"当前项目:{{path}}",ignoredCount_one:"{{count}} 个已忽略目录",ignoredCount_other:"{{count}} 个已忽略目录",rootChoose:"选择磁盘或根目录",root:"磁盘或根目录",replaceChooseFirst:"选择项目后查看可替换的历史会话。",regularExcludesIgnored:"普通目录列表已自动排除忽略项目。",loadingHistory:"正在加载历史会话…",loadingIgnored:"正在加载忽略目录…",loadingBrowser:"正在浏览服务端目录…",loadingProjects:"正在加载 Pi 项目…",backFolders:"返回目录列表",pastePath:"粘贴完整目录路径后按 Enter",fullPath:"完整目录路径",openTyped:"打开输入的目录",enterAbsolute:"请输入绝对目录路径",open:"打开",absoluteExample:"请输入绝对目录路径,例如 C:\\projects\\example。",pasteHint:"可直接粘贴完整路径并打开;兼容 Windows“复制为路径”。",searchScopes:"搜索范围",replaceTargetMissing:"替换目标已失效,无法继续替换。",noHistoryMatches:"没有匹配的历史会话",noReplaceHistory:"当前项目没有可替换的历史会话",sessionFound_one:"找到 {{count}} 个会话",sessionFound_other:"找到 {{count}} 个会话",sessionMessages:"{{users}}/{{total}} 条消息 \xb7 {{time}}",replacing:"替换中",current:"当前",alreadyUsed:"已使用",targetUnavailable:"目标失效",replace:"替换",currentBound:"当前工作会话已绑定此历史会话",historyUsed:"该历史会话已被其他工作会话占用",replaceTargetUnavailable:"替换目标已失效",replaceWith:"替换为 {{name}}",hideUserMessages:"收起用户消息",viewMatching_one:"查看全部 {{count}} 条匹配",viewMatching_other:"查看全部 {{count}} 条匹配",viewUserMessages_one:"查看 {{count}} 条用户消息",viewUserMessages_other:"查看 {{count}} 条用户消息",viewMatch:"查看{{label}}",matchingUserCount:"匹配的用户消息 {{count}} 条",userCount:"用户消息 {{count}} 条",viewAll:"查看全部",noUserMessages:"没有可展示的用户消息",noText:"(无文字内容)",loadMore:"加载更多",browserEmpty:"当前目录没有可浏览的子目录,可直接选择当前目录",rootsEmpty:"没有可浏览的磁盘或根目录",subfoldersNoMatches:"没有匹配的子目录",ignoredEmpty:"没有已忽略的 Pi 项目",projectsEmpty:"没有可选择的 Pi 项目",projectNoMatches:"没有匹配的 Pi 项目",restoreFolder:"恢复目录 {{name}}",restoreTip:"恢复到普通目录列表",restore:"恢复",directorySessions_one:"{{count}} 个会话 \xb7 {{time}}",directorySessions_other:"{{count}} 个会话 \xb7 {{time}}",directoryCount_one:"{{count}} 个会话",directoryCount_other:"{{count}} 个会话",creating:"创建中",ignoreFolder:"忽略目录 {{name}}",ignoreTip:"从所有普通目录列表中隐藏",ignoredFolders:"已忽略目录",chooseOther:"选择其他目录",selectCurrent:"选择当前目录",parentDirectory:"返回上一级目录",backRoots:"返回磁盘或根目录",refreshList:"刷新当前列表",filterDefault:"默认",filterNoTools:"无工具",filterUserOnly:"仅用户",filterLabeled:"有标签",filterAll:"全部",kindUser:"用户",kindTool:"工具",kindMessage:"消息",kindCompaction:"压缩",kindBranchSummary:"摘要",kindCustom:"记录",kindModel:"模型",kindThinking:"思考",kindSession:"会话",kindLabel:"标签",treeIntent:"切换当前会话分支",forkIntent:"从用户消息新开会话",cloneIntent:"克隆当前会话",runningTitle:"当前工作会话正在运行",runningStop:"继续“{{action}}”会先停止当前响应。已保存的消息会保留。",runningWait:"继续“{{action}}”会等待当前后台任务结束。",confirming:"正在处理…",confirmContinue:"确认并继续",back:"返回",confirmHint:"Enter 确认 \xb7 Esc 返回",branchPicker:"会话分支选择器",branchTitle:"会话分支",closeBranchPicker:"关闭会话分支选择器",branchSearch:"搜索会话分支",branchSearchPlaceholder:"搜索消息、工具或标签",branchFilter:"过滤会话树,当前:{{filter}}",loadingEntry:"正在读取完整内容…",entryEmpty:"该节点没有可展示的文字内容",entryTruncated:"内容较长,已截断显示。",selectEntry:"从树中选择一条记录查看完整内容",branchWorking:"正在停止或等待当前运行并执行操作…",branchLoading:"正在读取会话树…",branchEmpty:"当前会话还没有可选择的节点",branchNoMatches:"没有匹配的会话节点",branchTree:"会话树",collapseBranch:"收起分支",expandBranch:"展开分支",noPreview:"无可预览文字",switchToMessage:"切换到{{kind}}消息",switch:"切换",forkFromUser:"从这条用户消息新开会话",branchShortcuts:"↑↓ 选择 \xb7 Tab 筛选 \xb7 ←→ 分支 \xb7 Enter 切换 \xb7 Esc 关闭"},conversation:j.W["zh-CN"],projectFiles:k.C["zh-CN"]}};function y({children:a,initialSettings:b}){let[c]=(0,e.useState)(v.y);return(0,d.jsx)(w.O.Provider,{value:c,children:(0,d.jsx)(m.rg,{children:(0,d.jsx)(n.Zi,{children:(0,d.jsx)(p,{children:(0,d.jsx)(q.A,{resources:x,initialSettings:b,children:(0,d.jsxs)(s.c,{children:[(0,d.jsx)(t,{}),(0,d.jsx)(u.Bc,{children:a})]})})})})})})}},24187:(a,b,c)=>{"use strict";c.d(b,{Dz:()=>h,f7:()=>g,tv:()=>f});var d=c(59473);let e=d.Yj().trim().min(1).max(64).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/),f=e,g=e,h=d.g1(d.Yj(),d.Pq());d.Yj().trim().min(3).max(129).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*\/[a-z0-9]+(?:-[a-z0-9]+)*$/);let i=d.k5(["plugin","server","rocket","settings","panel","message","terminal","file","folder","bot","wrench","database","globe"]);d.gM("type",[d.Ik({type:d.eu("builtin"),name:i}).strict(),d.Ik({type:d.eu("svg"),content:d.Yj().trim().min(1).max(16384)}).strict()])},30897:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,17179,23)),Promise.resolve().then(c.t.bind(c,39159,23)),Promise.resolve().then(c.t.bind(c,52442,23)),Promise.resolve().then(c.t.bind(c,270,23)),Promise.resolve().then(c.t.bind(c,47594,23)),Promise.resolve().then(c.t.bind(c,52047,23)),Promise.resolve().then(c.t.bind(c,7770,23))},34525:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,29190,23)),Promise.resolve().then(c.bind(c,64669))},35166:()=>{},35282:(a,b,c)=>{"use strict";c.d(b,{J:()=>f,a:()=>e});var d=c(87883);let e=d.Ik({locale:d.k5(["zh-CN","en"]),timeZone:d.Yj().trim().min(1).max(100).refine(a=>{try{return new Intl.DateTimeFormat("en",{timeZone:a}),!0}catch{return!1}},"无效的 IANA 时区")}).strict().readonly(),f=d.Ik({region:e}).strict().readonly()},37222:(a,b,c)=>{"use strict";c.d(b,{Hc:()=>r,SJ:()=>l,UV:()=>n,ae:()=>m,fx:()=>p,pW:()=>o,re:()=>q});var d=c(35282);let e=new Set,f=new Set,g=d.J.parse({region:{locale:"en",timeZone:"UTC"}}),h=null,i=!1,j=0;function k(a){return{locale:a,timeZone:g.region.timeZone,localePreference:g.region.locale,timeZonePreference:g.region.timeZone,pendingLocale:a===g.region.locale?null:g.region.locale}}function l(){return g}function m(a){return f.add(a),()=>f.delete(a)}function n(a){let b=d.J.parse(a),c=JSON.stringify(g)!==JSON.stringify(b);if(i&&!c)return;let j=i&&h?h.locale:b.region.locale;for(let a of(g=b,i=!0,h=k(j),e))a();if(c)for(let a of f)a()}function o(a){for(let b of(h={...k(a),pendingLocale:null},e))b()}function p(){return h}function q(a){return e.add(a),()=>e.delete(a)}function r(){if(j+=1,!h)for(let a of(h=k(g.region.locale),e))a();return()=>{0==(j-=1)&&(h=null,i=!1,g=d.J.parse({region:{locale:"en",timeZone:"UTC"}}),e.clear(),f.clear())}}},37957:(a,b,c)=>{Promise.resolve().then(c.bind(c,56951))},38273:(a,b,c)=>{"use strict";c.d(b,{R:()=>d});let d={en:{terminal:"Terminal",newTerminal:"New terminal",terminalTabs:"Terminals",terminalActions:"Terminal actions",terminalDockBottom:"Dock at bottom",terminalDockRight:"Dock at right",terminalMaximize:"Maximize",terminalRestore:"Restore",terminalCollapse:"Collapse",terminalExpand:"Expand terminals ({{count}})",terminalCloseTab:"Close {{title}}",terminalRemove:"Remove exited terminal",terminalExited:"Exited",terminalExitCode:"Exit {{code}}",terminalOpening:"Opening terminal…",terminalReconnecting:"Reconnecting…",terminalSyncing:"Restoring terminal…",terminalLoadFailed:"Could not load terminal",terminalScreen:"Terminal screen",terminalInput:"Input",terminalResize:"Resize terminal",terminalKeyleft:"Left arrow",terminalKeyright:"Right arrow",terminalKeyup:"Up arrow",terminalKeydown:"Down arrow",toolsAndContext:"Tools and context",sessionContextDescription:"Tools, system instructions and services for this session",mcpSession:"Session MCP",modelAutomaticRouting:"Automatic routing",modelFixed:"Fixed models",modelChanging:"Changing model…",modelContextUnknown:"Context unknown",mcpSessionActions:"Session MCP actions",mcpStatus:"Status",mcpLogin:"Sign in",mcpReconnect:"Reconnect",mcpLogout:"Sign out",mcpServerName:"Server name",mcpServerNamePlaceholder:"Enter the configured server name",mcpServerNameInvalid:"Use letters, numbers, underscores and hyphens.",mcpLogoutConfirm:"Delete shared credentials. Other sessions may need to sign in again.",mcpExecute:"Run",mcpExecuting:"Running",mcpCommandUnavailable:"No MCP command is registered in this session.",nativeCommandOutput:"Session command output",nativeCommandOutputEmpty:"No session command output yet",searchToolsSources:"Search names, sources or descriptions",toolFilter:"Tool usage",allTools:"All tools",toolBlockedByMode:"Restricted by mode",toolSource:"Source",toolUnknown:"Unknown",toolActive:"Currently selected",toolInactive:"Not currently selected",toolModeUnknown:"Mode restriction unknown",toolNotBlocked:"Not restricted by mode",noRegisteredTools:"No tools registered in this session",toolExposureDirect:"Direct use",toolExposureModelOnly:"Model only",toolExposureCodemode:"Via scripts",toolExposureDeferred:"On-demand discovery",toolExposureHidden:"Unavailable",nativeUiTitle:"Plugin request",nativeUiInfo:"Additional information",nativeUiStatus:"Plugin status",nativeUiConfirm:"Confirm",nativeUiCancel:"Cancel",nativeUiReject:"Decline",nativeUiLater:"Later",nativeUiResume:"Continue",nativeUiPending:"{{count}} pending",nativeUiMore:"{{count}} more",nativeUiSubmit:"Submit",nativeUiSubmitting:"Submitting…",nativeUiDisconnected:"Waiting for connection. Your input is kept.",nativeUiUnknown:"Checking whether your answer was received. It will not be sent again automatically.",nativeUiFailed:"Could not load plugin interaction",nativeUiRetry:"Refresh status",nativeUiCountdown:"Cancels in {{seconds}}s",nativeUiStop:"Stop",nativeUiExpand:"Expand editor",nativeUiBack:"Back to chat",nativeUiDraft:"Suggested text",nativeUiAppend:"Append to draft",nativeUiReplace:"Replace draft",nativeUiDismiss:"Dismiss",nativeUiComposer:"Answer the pending question before sending more messages.",nativeUiAnswerExpired:"This question has ended.",thinkingOff:"Off",thinkingMinimal:"Minimal",thinkingLow:"Low",thinkingMedium:"Medium",thinkingHigh:"High",thinkingXhigh:"Very high",thinkingMax:"Maximum",selectModel:"Select model",thinkingLevel:"Thinking: {{level}}",imagePreview:"Preview {{name}}",imageRemove:"Remove {{name}}",imageProcessing:"Processing",imageFailed:"Failed",draftLoading:"Restoring draft…",draftFailed:"Could not restore draft. Retry first.",inputPlaceholder:"Message… Enter to send, Shift+Enter for a new line",more:"More",moreActions:"More actions",session:"Session",tools:"Tools",plugins:"Plugins",sessionBranch:"Session branches",switchBranch:"Switch session branch",clone:"Clone session",cloning:"Cloning session…",cloneEmpty:"No messages to clone yet",cloneTip:"Clone the current branch into a new session",replaceSession:"Replace with a new session",replacing:"Replacing…",systemContext:"View system context",readingContext:"Loading system context…",reloadPi:"Reload Pi configuration",restorePluginPresentation:"Restore plugin message views",initializationDegraded:"No-extension fallback",initializationDetails:"Reason for fallback",copyInitializationError:"Copy reason",initializationCopyFailed:"Could not copy the reason. Please select and copy it manually.",reloadingPi:"Reloading Pi configuration…",reloadPiTip:"Reload Pi configuration, extensions, Skills, prompts and context files",addImage:"Add image",chooseModel:"Select model and thinking level",currentModel:"Current model",allModels:"All models",modelsLoading:"Loading models…",modelsFailed:"Could not load models. Retry",noModels:"No authenticated models available",presets:"Common combinations",commonCombinationsEmpty:"No common combinations yet",configureCommonCombinations:"Set up common combinations",preparingContext:"Preparing context…",steerNow:"Guide the current response now",sendFollowUp:"Send after this turn",stopResponse:"Stop response",sending:"Sending message",send:"Send message",synchronizing:"Synchronizing session",noModelSelected:"No model selected",modelTooltip:"Current model: {{model}}. Choose another",operationFailed:"Action failed",modeChangeFailed:"Could not change capability mode",contextFailed:"Could not load system context",sendFailed:"Could not send message",confirmingSend:"Checking send result…",sendUnknown:"Send result unknown. Your message is saved locally. Check the conversation before restoring or deleting it.",sendFailure:"Send failed: {{error}}",unknownError:"Unknown error",restoreDraft:"Restore draft",delete:"Delete",retryDraft:"Retry restoring draft",composerRunning:"Message composer, running",composerCompleted:"Message composer, response ready",composer:"Message composer",escapeTwice:"Esc twice",thinkingLevels:"Thinking level",imagePreviewPending:"Images to send",tooManyImages:"Send at most 10 images at once. Remove some images first.",imageUnsupported:"The current model cannot receive images. Choose a model with image support.",imagesTooLarge:"Images cannot exceed 20 MB in total.",pluginRestoreFailed:"Could not load plugin state after restart",syncFailed:"Could not resynchronize work sessions",workSessionUpdateInvalid:"Work session update invalid; resynchronizing",appRuntimeUpdateInvalid:"Application update invalid; resynchronizing",projectDirectoriesFailed:"Could not load Pi projects",ignoredDirectoriesFailed:"Could not load ignored folders",browseDirectoryFailed:"Could not browse server folders",historyFailed:"Could not load past Pi sessions",chatSyncFailed:"Could not synchronize chat messages",taskSyncFailed:"Could not synchronize task details",replacedConnection:"Another connection replaced this page connection",connectionFailed:"Connection failed",realtimeFailed:"Could not connect to real-time work sessions",workSessionInitializing:"Work sessions are still initializing",sessionNotFound:"Session not found in the current work session",sortFailed:"Could not reorder work sessions",deleteFailed:"Could not delete work session",ignoreFailed:"Could not ignore folder",restoreIgnoredFailed:"Could not restore folder",autoPinFailed:"Session created, but could not pin it automatically",createFailed:"Could not create work session",replaceTargetMissing:"Replacement target is no longer available. Select a work session again.",replacementMissing:"Replacement work session not found",replaceFailed:"Could not replace work session",emptyReplacementMissing:"New empty work session not found",replaceEmptyFailed:"Could not replace with an empty session",sourceChanged:"Work session source changed.",invalidFilePath:"Invalid file path.",invalidToolFilePath:"Invalid tool file path.",noPreviewSession:"There is no work session to preview files.",noRevealSession:"There is no work session to locate files.",notificationActionFailed:"Could not perform notification action",notificationDeleteFailed:"Could not dismiss notification",closeSessionMenu:"Close work session menu",resizeSessionList:"Resize work session list",showSidebarMode:"Show {{name}}",sidebarContents:"Sidebar content",sidebarActions:"Sidebar actions",mainRunning:"Main session running",backgroundRunning:"Background task running",completedUnread:"Completed; not viewed yet",idle:"Idle",newSession:"New session",copiedProjectPath:"Project path copied.",copyProjectPathFailed:"Could not copy project path. Please copy it manually.",dragSession:"Drag to reorder {{name}}",dragOrder:"Drag to reorder",sessionMessages:"{{count}} messages \xb7 {{time}}",pinSession:"Pin {{name}}",unpinSession:"Unpin {{name}}",pin:"Pin session",unpin:"Unpin session",deleteSession:"Delete {{name}}",deleteSessionTitle:"Delete work session",copyProjectPath:"Copy project path",renameSessionTitle:"Edit title",reloadChatData:"Reload chat data",reloadChatDataFailed:"Could not reload chat data",reloadChatSourceChanged:"The session has changed. Select it again.",sessionTitleLabel:"Session title",renameSessionFailed:"Could not save the session title",sidebarSessions:"Work sessions",sidebarFiles:"Project files",sidebarReplaceSession:"Replace work session",createSession:"Create work session",projectPreview:"Project preview",projectPreviewWindow:"Open in new window",refreshFiles:"Refresh project files",pinnedBelow:"Pinned below",settings:"Settings",settingsWarning:"Settings, extension error",moreShortcuts:"More shortcuts",noSessions:"No work sessions yet",selectSessionFirst:"Select a work session first",shortcuts:"Shortcuts",gitStatusReadFailed:"Could not read Git status",gitOperationFailed:"Could not change Git branch",checkedOut:"Checked out {{name}}",switchedBranch:"Switched to {{name}}",branchCreated:"Created and switched to {{name}}",current:"Current",recent:"Recent",checkoutRemote:"Check out as local branch",switchGitBranch:"Switch to this branch",branchFromHere:"Create branch from here",gitBranches:"Git branches",readingRepos:"Loading repositories…",repositoryUnavailable:"Git unavailable",repositorySummary:"{{name}} \xb7 {{branch}}",repositoryCount_one:"{{count}} repository",repositoryCount_other:"{{count}} repositories",refreshBranches:"Refresh Git branches",close:"Close",repositories:"Repositories",unavailable:"Unavailable",backRepositories:"Back to repositories",chooseRepository:"Choose a repository",createBranch:"New branch",newBranchName:"New branch name",createAndSwitch:"Create and switch",cancel:"Cancel",searchBranches:"Search branches",loadingBranches:"Loading branches…",retry:"Retry",recentlyUsed:"Recently used",localBranches:"Local branches",remoteBranches:"Remote branches",noBranchMatches:"No matching branches",contextUsageWithIgnore:"Context {{percent}}%, estimated {{projected}}% after ignoring; ignored {{ignored}}, can ignore {{potential}}",contextUsageSimple:"Context {{percent}}% of {{limit}} tokens",contextDetails:"Context usage details",contextMetrics:"Current / Limit / Used",afterIgnore:"Estimated remaining",potentialIgnore:"Can ignore",alreadyIgnored:"Ignored",ignoreNow:"Ignore {{amount}} now",nothingToIgnore:"No context available to ignore",ignoring:"Ignoring…",ignore:"Ignore",compacting:"Compacting…",compact:"Compact",contextCritical:"Context usage is very high.",contextWarning:"Context is approaching its limit.",copySessionId:"Copy current session ID {{id}}",copySessionFailed:"Could not copy session ID. Please copy it manually.",currentSessionId:"Current session ID",copied:"Copied",clickToCopy:"Click to copy",copyCurrentPath:"Copy current path {{path}}",copyPathFailed:"Could not copy path. Please copy it manually.",currentPath:"Current path",copy:"Copy",contextCopyFailed:"Could not copy system context. Please copy it manually.",contextTitle:"System context",contextDescription:"System prompt and tool definitions used in the current model request",copyContext:"Copy system context",contextContents:"Context contents",systemPrompt:"System prompt",toolDefinitions:"{{count}} tool definitions",searchTools:"Search tool definitions",searchNames:"Search names or descriptions",charCount:"{{count}} characters",contextLoading:"Loading system context…",contextRetry:"Retry",emptyContent:"(empty)",contextTools:"Model context tools",parameterSchema:"Parameter schema",noMatchingTools:"No matching tools",noActiveTools:"No active tools",clearSearch:"Clear search",queueItems_one:"{{count}} item",queueItems_other:"{{count}} items",queueImages_one:"{{count}} image",queueImages_other:"{{count}} images",imageOnly:"Image-only message",noMessageText:"No text content",viewQueued:"View {{count}} queued messages",queuedCount:"{{count}} queued",queueCurrent:"Queued messages",queuePendingDescription:"Waiting messages will be handled in this order",queueSteer:"Guide now",queueSteerDescription:"Guide the current response",queueFollowUp:"Send later",queueFollowUpDescription:"Send in order after this turn",queueRestore:"Undo all and restore to draft",noticeInfo:"Information",noticeSuccess:"Success",noticeWarning:"Warning",noticeError:"Error",actionableNotice:"{{level}} notification: {{title}}. Activate to open",noticeLabel:"{{level}} notification: {{title}}",olderNotices:"Show {{count}} earlier notifications",deleteNotice:"Dismiss notification: {{title}}",dismissNotice:"Dismiss notification",hideSessionMenu:"Hide session menu",showSessionMenu:"Show session menu",openSessionFiles:"Open session files",sessionFiles:"Files \xb7 {{count}}",unpinWorkSession:"Unpin work session {{name}}",workSession:"Work session",loading:"Loading",chooseSession:"Choose a session",expandSession:"Expand session {{name}}",resizeColumns:"Resize columns {{left}} and {{right}}",emptySelectSession:"Choose a work session",emptyQuip0:"You bring the ideas. I'll bring the tinkering.",emptyQuip1:"Enough floating around. Let's make something.",emptyQuip2:"So, what are we tinkering with today?",emptyQuip3:"Your ideas. My keyboard.",emptyQuip4:"Brainstorming mode: hungry for ideas.",emptyQuip5:"Cute face. Surprisingly useful paws.",emptyQuip6:"Today's wild ideas may now take the stage.",emptyQuip7:"Let's turn that 'what if' into something real.",emptyQuip8:"You start it. I'll help get it rolling.",emptyQuip9:"Paws in position. Ready to work.",emptyQuip10:"Let's make something, then look thoughtful.",emptyQuip11:"Toss me an idea. I've got it.",emptyQuip12:"Wild ideas welcome. We'll figure out the rest.",emptyQuip13:"Let's turn 'maybe' into 'done'.",emptyQuip14:"Daydream break over. Brainstorming open.",emptyQuip15:"Got a bold idea? Let me sit down first.",emptyQuip16:"Not sleeping. Just loading ideas with my eyes closed.",emptyWakeReply:"I'm awake! Let's get to work.",emptyFishReply:"Coming right up!",emptyCuriousReply:"Oh, you really meant it!",emptyPartnerReply:"Got it. Let's do this.",emptyLoading:"Loading sessions…",file:"File",fileViewer:"{{name}} file viewer",collapseProjectTree:"Collapse project tree",expandProjectTree:"Expand project tree",exitExpanded:"Exit expanded view",expandFile:"Expand file",returnChat:"Back to chat",hideFile:"Hide file",chat:"Chat",collapse:"Collapse",browseProject:"Browse project folders",fileWorkspaceTitle:"Project files",resizeChatFile:"Resize chat and file panes",standaloneReadFailed:"Could not read file",standaloneViewer:"{{name}} standalone file preview",reloadFile:"Reload file",standaloneImage:"{{name}} image preview",standaloneHtml:"{{name}} HTML preview",loadingFile:"Loading file…",slashLoadingMore:"Loading more commands…",slashMoreFailed:"Could not load additional commands",slashCandidates:"Slash command suggestions",slashLoading:"Loading commands…",slashFailed:"Could not load commands",slashEmpty:"No matching commands",slashSummary:"{{commands}} commands \xb7 {{groups}} categories",slashCount:"{{count}} commands",slashUpDown:"↑↓ Select",slashEnter:"Enter Select",slashEscape:"Esc Close",slashGroupBuiltin:"Pi commands",slashGroupSkill:"Skills",slashGroupPrompt:"Prompt templates",slashGroupExtension:"Extension commands",reloadDescription:"Reload the latest Pi configuration and extensions",chatMessages:"{{name}} chat messages",sessionWindows:"Work session windows",fixedSession:"Pinned",primarySession:"Main session",sourceSyncing:"Session is synchronizing. Try again shortly.",draftSaveFailed:"Could not save draft",imageProcessFailed:"Could not process image",draftImage:"Draft image",uncertainRecovered:"A previous send had an unknown result. Check the conversation before sending again.",draftLoadFailed:"Could not load draft",imageAddLimit:"Add at most 10 images",imageUnavailable:"Image unavailable",imageAddOverflow:"10-image limit reached. Other images were not added.",resolveOutboxFirst:"Resolve the previous unconfirmed message first",emptyInput:"Enter text or add an image",imageSendLimit:"Send at most 10 images",imagesPending:"Images are still processing",imageProcessingFailed:"An image could not be processed",imageBytesLimit:"Images in one message cannot exceed 20 MB",messageBytesLimit:"Message exceeds 31 MB",outboxRestored:"Unconfirmed message restored to draft.",outboxDeleted:"Unconfirmed message deleted.",interruptFailed:"Could not interrupt the current response",restoredImage:"Restored image {{count}}",queuesRestored:"All queued messages restored to draft.",queueRestoreFailed:"Could not restore queued messages",modelCatalogFailed:"Could not load model catalog",setModelFailed:"Could not set model",imageIdentityInvalid:"Invalid chat image identity",localImagePending:"Local temporary image is not ready",imageFileFailed:"{{name}}: {{error}}",treeLoadFailed:"Could not load session tree",treeSourceInvalid:"Work session changed. Session tree is unavailable",treeDetailFailed:"Could not load entry details",branchTargetMissing:"Branched work session not found",branchOperationFailed:"Could not perform branch operation",interruptForBranchFailed:"Could not stop the current response",treeChanged:"Work session changed. Reopen the session tree",cloneUnavailable:"Work session changed. Cannot clone",branchUnavailable:"Work session changed. Cannot continue",branchChanged:"Work session changed. Try again",chatCacheMismatch:"Local chat cache does not match the synchronization cursor; resynchronizing",chatMessageMissing:"Chat message not found: {{index}}/{{entryId}}",gitNoProjectBranches:"This project is not bound to a work session. Git branches are unavailable.",gitBranchesReadFailed:"Could not read Git branches",gitNoProjectStatus:"This project is not bound to a work session. Git status is unavailable.",gitNoProjectOperation:"This project is not bound to a work session. Git actions are unavailable.",outboxMissing:"No unconfirmed message is available to restore",imageDecodeFailed:"Image could not be decoded",imageInvalidDimensions:"Invalid image dimensions",canvasUnavailable:"Browser could not create an image canvas",imageCompressFailed:"Browser could not compress image",imageTypeUnsupported:"Only JPEG, PNG, WebP, GIF or BMP images are supported",singleImageLimit:"Images must be 10 MB or smaller",compressedImageTooLarge:"Image still exceeds 10 MB after compression",compressedTypeUnsupported:"Unsupported compressed image format"},"zh-CN":{terminal:"终端",newTerminal:"新建终端",terminalTabs:"终端标签",terminalActions:"终端操作",terminalDockBottom:"停靠底部",terminalDockRight:"停靠右侧",terminalMaximize:"最大化",terminalRestore:"还原",terminalCollapse:"折叠终端",terminalExpand:"展开终端({{count}})",terminalCloseTab:"关闭 {{title}}",terminalRemove:"移除已退出终端",terminalExited:"已退出",terminalExitCode:"退出码 {{code}}",terminalOpening:"正在打开终端…",terminalReconnecting:"正在重新连接…",terminalSyncing:"正在恢复画面…",terminalLoadFailed:"终端加载失败",terminalScreen:"终端画面",terminalInput:"输入",terminalResize:"调整终端尺寸",terminalKeyleft:"向左",terminalKeyright:"向右",terminalKeyup:"向上",terminalKeydown:"向下",toolsAndContext:"工具与上下文",sessionContextDescription:"当前会话的工具、系统提示词和服务",mcpSession:"会话 MCP",modelAutomaticRouting:"自动路由",modelFixed:"固定模型",modelChanging:"正在切换模型…",modelContextUnknown:"上下文未知",mcpSessionActions:"MCP 会话操作",mcpStatus:"状态",mcpLogin:"登录",mcpReconnect:"重连",mcpLogout:"退出登录",mcpServerName:"服务名称",mcpServerNamePlaceholder:"输入已配置的服务名称",mcpServerNameInvalid:"服务名称只能包含字母、数字、下划线和连字符。",mcpLogoutConfirm:"删除共享登录凭据,其他会话下次访问也可能需要重新登录。",mcpExecute:"执行",mcpExecuting:"正在执行",mcpCommandUnavailable:"当前会话未注册 MCP 命令。",nativeCommandOutput:"会话命令输出",nativeCommandOutputEmpty:"暂无会话命令输出",searchToolsSources:"搜索名称、来源或描述",toolFilter:"工具使用方式",allTools:"全部工具",toolBlockedByMode:"受模式限制",toolSource:"来源",toolUnknown:"未知",toolActive:"当前已选用",toolInactive:"当前未选用",toolModeUnknown:"模式限制未知",toolNotBlocked:"未受模式限制",noRegisteredTools:"当前会话没有登记工具",toolExposureDirect:"直接使用",toolExposureModelOnly:"仅模型调用",toolExposureCodemode:"通过脚本调用",toolExposureDeferred:"按需发现",toolExposureHidden:"不可调用",nativeUiTitle:"插件请求",nativeUiInfo:"附加信息",nativeUiStatus:"插件状态",nativeUiConfirm:"确认",nativeUiCancel:"取消",nativeUiReject:"拒绝",nativeUiLater:"稍后处理",nativeUiResume:"继续处理",nativeUiPending:"{{count}} 项待处理",nativeUiMore:"另有 {{count}} 项",nativeUiSubmit:"提交",nativeUiSubmitting:"正在提交…",nativeUiDisconnected:"连接恢复后可继续,输入已保留。",nativeUiUnknown:"正在核对是否收到回答,不会自动重复提交。",nativeUiFailed:"无法加载插件交互",nativeUiRetry:"刷新状态",nativeUiCountdown:"{{seconds}} 秒后取消",nativeUiStop:"停止任务",nativeUiExpand:"展开编辑",nativeUiBack:"返回聊天",nativeUiDraft:"插件发来一段草稿",nativeUiAppend:"追加到草稿",nativeUiReplace:"替换草稿",nativeUiDismiss:"忽略",nativeUiComposer:"处理问题后可发送补充内容。",nativeUiAnswerExpired:"这个问题已结束。",thinkingOff:"关闭",thinkingMinimal:"最少",thinkingLow:"低",thinkingMedium:"中",thinkingHigh:"高",thinkingXhigh:"很高",thinkingMax:"最大",selectModel:"选择模型",thinkingLevel:"思考 {{level}}",imagePreview:"预览 {{name}}",imageRemove:"移除 {{name}}",imageProcessing:"处理中",imageFailed:"失败",draftLoading:"正在恢复草稿…",draftFailed:"草稿恢复失败,请先重试",inputPlaceholder:"输入消息,Enter 发送,Shift+Enter 换行",more:"更多",moreActions:"更多操作",session:"会话",tools:"工具",plugins:"插件",sessionBranch:"会话分支",switchBranch:"切换会话分支",clone:"克隆当前会话",cloning:"正在克隆当前会话",cloneEmpty:"当前会话还没有可克隆的消息",cloneTip:"克隆当前活动分支到新会话",replaceSession:"替换为新会话",replacing:"正在替换…",systemContext:"查看系统上下文",readingContext:"正在读取系统上下文…",reloadPi:"重载 Pi 配置",restorePluginPresentation:"恢复插件消息展示",initializationDegraded:"无扩展降级会话",initializationDetails:"降级原因",copyInitializationError:"复制原因",initializationCopyFailed:"复制原因失败,请选中文字后手动复制。",reloadingPi:"正在重载 Pi 配置…",reloadPiTip:"重新读取 Pi 的配置、扩展、Skills、提示模板和上下文文件",addImage:"添加图片",chooseModel:"选择模型与思考等级",currentModel:"当前模型",allModels:"全部模型",modelsLoading:"正在加载模型…",modelsFailed:"加载失败,点击重试",noModels:"没有已认证的可用模型",presets:"常用组合",commonCombinationsEmpty:"还没有常用组合",configureCommonCombinations:"设置常用组合",preparingContext:"正在准备上下文…",steerNow:"立即引导当前响应",sendFollowUp:"当前轮结束后发送",stopResponse:"停止当前响应",sending:"正在发送消息",send:"发送消息",synchronizing:"正在同步会话",noModelSelected:"尚未选择模型",modelTooltip:"当前模型:{{model}},点击切换",operationFailed:"操作失败",modeChangeFailed:"切换能力模式失败",contextFailed:"读取系统上下文失败",sendFailed:"发送消息失败",confirmingSend:"正在确认发送结果…",sendUnknown:"发送结果未知,内容仍保留在本机。请确认聊天记录后再恢复或删除。",sendFailure:"发送失败:{{error}}",unknownError:"未知错误",restoreDraft:"恢复草稿",delete:"删除",retryDraft:"重试恢复",composerRunning:"消息输入区,运行中",composerCompleted:"消息输入区,完成待查看",composer:"消息输入区",escapeTwice:"双击 Esc",thinkingLevels:"思考等级",imagePreviewPending:"待发送图片预览",tooManyImages:"单次最多发送 10 张图片,请先删除部分恢复内容。",imageUnsupported:"当前模型不支持图片输入,请切换到带图片图标的模型。",imagesTooLarge:"图片总量不能超过 20MB。",pluginRestoreFailed:"服务重启后读取插件状态失败",syncFailed:"重新同步工作会话失败",workSessionUpdateInvalid:"工作会话增量无效,正在重新同步",appRuntimeUpdateInvalid:"应用运行态增量无效,正在重新同步",projectDirectoriesFailed:"加载 Pi 目录失败",ignoredDirectoriesFailed:"加载忽略目录失败",browseDirectoryFailed:"浏览服务端目录失败",historyFailed:"加载 Pi 历史会话失败",chatSyncFailed:"聊天消息同步失败",taskSyncFailed:"任务详情同步失败",replacedConnection:"当前页面连接已被新的同 clientId 连接替换",connectionFailed:"连接失败",realtimeFailed:"工作会话实时连接失败",workSessionInitializing:"工作会话仍在初始化",sessionNotFound:"当前工作会话中未找到该会话",sortFailed:"更新会话排列失败",deleteFailed:"删除工作会话失败",ignoreFailed:"忽略目录失败",restoreIgnoredFailed:"恢复目录失败",autoPinFailed:"会话已创建,但自动固定失败",createFailed:"创建工作会话失败",replaceTargetMissing:"替换目标已失效,请关闭后重新选择工作会话",replacementMissing:"替换后的工作会话不存在",replaceFailed:"替换工作会话失败",emptyReplacementMissing:"替换后的空会话不存在",replaceEmptyFailed:"替换为空会话失败",sourceChanged:"工作会话来源已变化。",invalidFilePath:"文件路径无效。",invalidToolFilePath:"工具文件路径无效。",noPreviewSession:"当前没有可预览文件的工作会话。",noRevealSession:"当前没有可定位文件的工作会话。",notificationActionFailed:"通知操作执行失败",notificationDeleteFailed:"删除通知失败",closeSessionMenu:"关闭工作会话菜单",resizeSessionList:"调整工作会话列表宽度",showSidebarMode:"显示{{name}}",sidebarContents:"左侧栏内容",sidebarActions:"侧栏操作",mainRunning:"主会话运行中",backgroundRunning:"后台任务运行中",completedUnread:"完成待查看",idle:"空闲",newSession:"新会话",copiedProjectPath:"已复制项目路径。",copyProjectPathFailed:"复制项目路径失败,请手动复制。",dragSession:"拖拽调整工作会话 {{name}} 的顺序",dragOrder:"拖拽调整顺序",sessionMessages:"{{count}} 条消息 \xb7 {{time}}",pinSession:"固定工作会话 {{name}}",unpinSession:"取消固定工作会话 {{name}}",pin:"固定会话",unpin:"取消固定会话",deleteSession:"删除工作会话 {{name}}",deleteSessionTitle:"删除工作会话",copyProjectPath:"复制项目路径",renameSessionTitle:"修改标题",reloadChatData:"重新加载聊天数据",reloadChatDataFailed:"重新加载聊天数据失败",reloadChatSourceChanged:"会话已变化,请重新选择会话",sessionTitleLabel:"会话标题",renameSessionFailed:"保存会话标题失败",sidebarSessions:"工作会话",sidebarFiles:"项目文件",sidebarReplaceSession:"替换工作会话",createSession:"新建工作会话",projectPreview:"项目预览",projectPreviewWindow:"在新窗口打开",refreshFiles:"刷新项目文件",pinnedBelow:"以下固定",settings:"设置",settingsWarning:"设置,有扩展异常",moreShortcuts:"更多快捷入口",noSessions:"还没有工作会话",selectSessionFirst:"请先选择一个工作会话",shortcuts:"快捷入口",gitStatusReadFailed:"读取 Git 状态失败",gitOperationFailed:"Git 分支操作失败",checkedOut:"已检出 {{name}}",switchedBranch:"已切换到 {{name}}",branchCreated:"已创建并切换到 {{name}}",current:"当前",recent:"最近",checkoutRemote:"检出为本地分支",switchGitBranch:"切换到此分支",branchFromHere:"从此分支新建",gitBranches:"Git 分支",readingRepos:"正在读取仓库…",repositoryUnavailable:"Git 不可用",repositorySummary:"{{name}} \xb7 {{branch}}",repositoryCount_one:"{{count}} 个仓库",repositoryCount_other:"{{count}} 个仓库",refreshBranches:"刷新 Git 分支",close:"关闭",repositories:"仓库",unavailable:"不可用",backRepositories:"返回仓库列表",chooseRepository:"选择仓库",createBranch:"新建分支",newBranchName:"新分支名称",createAndSwitch:"创建并切换",cancel:"取消",searchBranches:"搜索分支",loadingBranches:"正在读取分支…",retry:"重试",recentlyUsed:"最近使用",localBranches:"本地分支",remoteBranches:"远程分支",noBranchMatches:"没有匹配分支",contextUsageWithIgnore:"上下文 {{percent}}%,忽略后预计 {{projected}}%,已忽略 {{ignored}},可忽略 {{potential}}",contextUsageSimple:"上下文 {{percent}}%,{{limit}} tokens",contextDetails:"上下文用量详情",contextMetrics:"当前占用 / 上限 / 使用百分比",afterIgnore:"忽略后预计保留",potentialIgnore:"可忽略",alreadyIgnored:"已忽略",ignoreNow:"立即忽略 {{amount}}",nothingToIgnore:"暂无可忽略上下文",ignoring:"忽略中…",ignore:"忽略",compacting:"压缩中…",compact:"压缩",contextCritical:"上下文占用已很高。",contextWarning:"上下文正在接近上限。",copySessionId:"复制当前会话 ID {{id}}",copySessionFailed:"复制当前会话 ID 失败,请手动复制。",currentSessionId:"当前会话 ID",copied:"已复制",clickToCopy:"点击复制",copyCurrentPath:"复制当前路径 {{path}}",copyPathFailed:"复制当前路径失败,请手动复制。",currentPath:"当前路径",copy:"复制",contextCopyFailed:"复制系统上下文失败,请手动复制。",contextTitle:"系统上下文",contextDescription:"当前模型请求使用的系统提示词和工具定义",copyContext:"复制系统上下文",contextContents:"上下文内容",systemPrompt:"系统提示词",toolDefinitions:"工具定义 \xb7 {{count}}",searchTools:"搜索工具定义",searchNames:"搜索名称或描述",charCount:"{{count}} 字符",contextLoading:"正在读取系统上下文…",contextRetry:"重试",emptyContent:"(空)",contextTools:"模型上下文工具",parameterSchema:"参数 Schema",noMatchingTools:"没有匹配的工具",noActiveTools:"当前没有启用工具",clearSearch:"清除搜索",queueItems_one:"{{count}} 条",queueItems_other:"{{count}} 条",queueImages_one:"{{count}} 张图片",queueImages_other:"{{count}} 张图片",imageOnly:"仅图片消息",noMessageText:"无文本内容",viewQueued:"查看 {{count}} 条排队消息",queuedCount:"排队 {{count}}",queueCurrent:"当前排队消息",queuePendingDescription:"等待中的消息会按下列顺序处理",queueSteer:"立即引导",queueSteerDescription:"用于引导当前响应",queueFollowUp:"后续发送",queueFollowUpDescription:"当前轮结束后依次发送",queueRestore:"撤销全部并恢复到草稿",noticeInfo:"信息",noticeSuccess:"成功",noticeWarning:"警告",noticeError:"错误",actionableNotice:"{{level}}通知:{{title}},点击处理",noticeLabel:"{{level}}通知:{{title}}",olderNotices:"展开 {{count}} 条更早通知",deleteNotice:"删除通知:{{title}}",dismissNotice:"删除通知",hideSessionMenu:"隐藏工作会话菜单",showSessionMenu:"显示工作会话菜单",openSessionFiles:"打开会话文件",sessionFiles:"文件 \xb7 {{count}}",unpinWorkSession:"取消固定工作会话 {{name}}",workSession:"工作会话",loading:"正在加载",chooseSession:"选择会话",expandSession:"展开会话 {{name}}",resizeColumns:"调整第 {{left}} 列与第 {{right}} 列宽度",emptySelectSession:"选择一个工作会话",emptyQuip0:"你负责脑洞,我负责折腾。",emptyQuip1:"不摸鱼了,整点活。",emptyQuip2:"说吧,今天捣鼓点什么?",emptyQuip3:"点子归你,敲键盘归我。",emptyQuip4:"脑洞已开,等你投喂。",emptyQuip5:"别看我可爱,活儿我也会干。",emptyQuip6:"今天的奇思妙想,请开始表演。",emptyQuip7:"来,把那个“要不试试”做出来。",emptyQuip8:"你先开个头,我来接着整。",emptyQuip9:"小爪子就位,准备开工。",emptyQuip10:"先整点东西,再假装深思熟虑。",emptyQuip11:"把想法丢过来,我接着。",emptyQuip12:"灵感可以离谱,咱们慢慢靠谱。",emptyQuip13:"今天也要把“不一定”变成“搞定”。",emptyQuip14:"摸鱼暂停,脑洞营业。",emptyQuip15:"有什么大胆的想法?我先坐稳。",emptyQuip16:"我没睡,只是在闭眼加载灵感。",emptyWakeReply:"醒了醒了,这就开工。",emptyFishReply:"来了来了!",emptyCuriousReply:"好家伙,来真的啊。",emptyPartnerReply:"收到,开整。",emptyLoading:"正在加载会话…",file:"文件",fileViewer:"{{name}} 文件查看器",collapseProjectTree:"收起项目目录",expandProjectTree:"展开项目目录",exitExpanded:"退出放大",expandFile:"放大文件",returnChat:"返回聊天",hideFile:"收起文件",chat:"聊天",collapse:"收起",browseProject:"预览项目目录",fileWorkspaceTitle:"项目文件",resizeChatFile:"调整聊天和文件宽度",standaloneReadFailed:"读取文件失败",standaloneViewer:"{{name}} 独立文件预览",reloadFile:"重新读取",standaloneImage:"{{name}} 图片预览",standaloneHtml:"{{name}} HTML 预览",loadingFile:"正在读取文件…",slashLoadingMore:"正在加载其他命令…",slashMoreFailed:"其他命令加载失败",slashCandidates:"Slash Command 候选",slashLoading:"正在加载命令…",slashFailed:"命令加载失败",slashEmpty:"无匹配命令",slashSummary:"{{commands}} 条命令 \xb7 {{groups}} 类",slashCount:"{{count}} 条命令",slashUpDown:"↑↓ 选择",slashEnter:"Enter 选择",slashEscape:"Esc 关闭",slashGroupBuiltin:"Pi 内置命令",slashGroupSkill:"Skills",slashGroupPrompt:"提示模板",slashGroupExtension:"扩展命令",reloadDescription:"重新读取 Pi 最新配置与扩展资源",chatMessages:"{{name}}聊天消息",sessionWindows:"工作会话窗口",fixedSession:"固定",primarySession:"主会话",sourceSyncing:"会话正在同步,请稍后重试",draftSaveFailed:"草稿保存失败",imageProcessFailed:"图片处理失败",draftImage:"草稿图片",uncertainRecovered:"已恢复上次发送状态未知的内容,请确认后重发。",draftLoadFailed:"加载草稿失败",imageAddLimit:"单次最多添加 10 张图片",imageUnavailable:"图片不可用",imageAddOverflow:"已达到 10 张图片上限,其余文件未添加",resolveOutboxFirst:"请先处理上一条待确认发送内容",emptyInput:"请输入文字或添加图片",imageSendLimit:"单次最多发送 10 张图片",imagesPending:"图片仍在处理中",imageProcessingFailed:"存在处理失败的图片",imageBytesLimit:"单次发送图片总量不能超过 20MB",messageBytesLimit:"聊天发送内容超过 31MB",outboxRestored:"待确认内容已恢复到草稿。",outboxDeleted:"待确认内容已删除。",interruptFailed:"打断当前响应失败",restoredImage:"恢复图片 {{count}}",queuesRestored:"全部排队消息已恢复到草稿。",queueRestoreFailed:"恢复全部排队消息失败",modelCatalogFailed:"加载模型目录失败",setModelFailed:"设置模型失败",imageIdentityInvalid:"聊天图片身份无效",localImagePending:"本机临时图片尚未就绪",imageFileFailed:"{{name}}:{{error}}",treeLoadFailed:"读取会话树失败",treeSourceInvalid:"工作会话已失效,无法打开会话树",treeDetailFailed:"读取节点详情失败",branchTargetMissing:"分支操作返回的目标工作会话不存在",branchOperationFailed:"执行分支操作失败",interruptForBranchFailed:"停止当前响应失败",treeChanged:"工作会话已经变化,请重新打开会话树",cloneUnavailable:"工作会话已失效,无法克隆",branchUnavailable:"工作会话已失效,无法继续操作",branchChanged:"工作会话已经变化,请重新操作",chatCacheMismatch:"本地缓存与聊天同步起点不一致,需要全量同步",chatMessageMissing:"聊天消息不存在:{{index}}/{{entryId}}",gitNoProjectBranches:"当前项目未绑定工作会话,暂时无法读取 Git 分支",gitBranchesReadFailed:"读取 Git 分支失败",gitNoProjectStatus:"当前项目未绑定工作会话,暂时无法读取 Git 状态",gitNoProjectOperation:"当前项目未绑定工作会话,暂时无法执行 Git 操作",outboxMissing:"没有可恢复的待确认发送内容",imageDecodeFailed:"图片无法解码",imageInvalidDimensions:"图片尺寸无效",canvasUnavailable:"浏览器无法创建图片画布",imageCompressFailed:"浏览器图片压缩失败",imageTypeUnsupported:"仅支持 JPEG、PNG、WebP、GIF 或 BMP 图片",singleImageLimit:"单张图片不能超过 10MB",compressedImageTooLarge:"图片压缩后仍超过 10MB",compressedTypeUnsupported:"图片压缩格式不受支持"}}},40217:(a,b,c)=>{Promise.resolve().then(c.bind(c,70961))},41904:(a,b,c)=>{"use strict";c.d(b,{J:()=>f,a:()=>e});var d=c(59473);let e=d.Ik({locale:d.k5(["zh-CN","en"]),timeZone:d.Yj().trim().min(1).max(100).refine(a=>{try{return new Intl.DateTimeFormat("en",{timeZone:a}),!0}catch{return!1}},"无效的 IANA 时区")}).strict().readonly(),f=d.Ik({region:e}).strict().readonly()},43115:(a,b,c)=>{"use strict";c.d(b,{U:()=>d});let d={en:{statusRunning:"Running",statusCompleted:"Completed",statusFailed:"Failed",statusStopped:"Stopped",statusInterrupted:"Interrupted",seconds_one:"{{count}} second",seconds_other:"{{count}} seconds",minutes_one:"{{count}} minute",minutes_other:"{{count}} minutes",hours_one:"{{count}} hour",hours_other:"{{count}} hours",copyFailed:"Could not copy {{name}}. Please copy it manually.",copied:"{{name}} copied",copy:"Copy {{name}}",copiedShort:"Copied",clickToCopy:"Click to copy {{name}}",conversationDetails:"Task conversation",noMessages:"No conversation messages",interruptFailed:"Could not interrupt task",selectTask:"Select a task to see its details",confirmInterrupt:"Confirm interrupt",interrupt:"Interrupt",waitingOutput:"Waiting for output…",noDetails:"No task details to display",retry:"Retry",loadingDetail:"Loading task details…",refreshing:"Refreshing",title:"Task center",close:"Close task center",recordCount_one:"{{count}} task",recordCount_other:"{{count}} tasks",noTasks:"No tasks",back:"Back to task list",detail:"Task details",open:"Open task center",runningTime:"Duration {{duration}}, started {{time}}",runningCount_one:"{{count}} task running",runningCount_other:"{{count}} tasks running",detailUnavailable:"Task details are no longer available",detailResponseMissing:"Server did not return task details",detailLoadFailed:"Could not load task details",imageDurableOnly:"Task images are only available for saved messages",centerClosed:"Task center is closed"},"zh-CN":{statusRunning:"执行中",statusCompleted:"已完成",statusFailed:"失败",statusStopped:"已停止",statusInterrupted:"已中断",seconds_one:"{{count}} 秒",seconds_other:"{{count}} 秒",minutes_one:"{{count}} 分钟",minutes_other:"{{count}} 分钟",hours_one:"{{count}} 小时",hours_other:"{{count}} 小时",copyFailed:"复制{{name}}失败,请手动复制。",copied:"已复制{{name}}",copy:"复制{{name}}",copiedShort:"已复制",clickToCopy:"点击复制{{name}}",conversationDetails:"任务会话详情",noMessages:"暂无会话消息",interruptFailed:"打断任务失败",selectTask:"从左侧选择一个任务查看详情",confirmInterrupt:"确认打断",interrupt:"打断",waitingOutput:"等待输出…",noDetails:"该任务没有可展示的详情",retry:"重试",loadingDetail:"正在加载任务详情…",refreshing:"正在刷新",title:"任务中心",close:"关闭任务中心",recordCount_one:"{{count}} 条执行记录",recordCount_other:"{{count}} 条执行记录",noTasks:"暂无任务",back:"返回任务列表",detail:"任务详情",open:"打开任务中心",runningTime:"执行时长 {{duration}},启动时间 {{time}}",runningCount_one:"{{count}} 个任务执行中",runningCount_other:"{{count}} 个任务执行中",detailUnavailable:"任务详情已不可用",detailResponseMissing:"服务端未返回任务详情",detailLoadFailed:"加载任务详情失败",imageDurableOnly:"任务图片只支持当前 Durable 消息",centerClosed:"任务中心已关闭"}}},43305:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>f});var d=c(52834);c(49147);var e=c(4527);function f({error:a,reset:b}){return(0,d.jsx)(e.L1ErrorPage,{retry:b})}},48452:(a,b,c)=>{"use strict";c.d(b,{Y:()=>f,n:()=>e});var d=c(59473);let e="X-Pi-Desk-Client-Id",f=d.Yj().uuid()},51601:(a,b,c)=>{"use strict";c.d(b,{p:()=>d});let d={en:{chooseProject:"Open a project",switchProject:"Switch project",directoryPath:"Directory path",directoryPlaceholder:"Enter an absolute directory path",serverDirectoryHint:"Browse directories on the connected server.",openProject:"Open",recentProjects:"Project history",browseDirectories:"Browse directories",loadingDirectories:"Loading directories…",parentDirectory:"Parent directory",directoryRoots:"Directories",openThisDirectory:"Open this directory",noSubdirectories:"No subdirectories",noRecentProjects:"No project history. Enter a path or browse directories.",currentHead:"Current HEAD",localBranch:"Local branch",remoteBranch:"Remote branch \xb7 local record",retry:"Retry",compareDirect:"Compare directly",loadingCommits:"Loading commits…",commitList:"Git commits",noCommitMessage:"(no commit message)",noMatchingCommits:"No matching commits",noCommits:"No commits",scanLimit:"History scan limit reached. Choose a more specific branch or commit.",loadedLimit:"2,000 commits loaded. Narrow your search.",loadMoreCommits:"Load more commits",backCommits:"Back to commits",commitChanges:"Commit changes",cumulativeChanges:"Cumulative changes",loadedFiles:"{{count}} files loaded",backCumulative:"Back to cumulative changes",loadingChanges:"Loading changes…",noDiff:"No file differences",loadMoreFiles:"Load more files",changesLimit:"Change file display limit reached.",commitDetails:"Commit details",copySha:"Copy commit SHA",compareParent:"Compare parent commit",parentCommit:"Parent {{count}} \xb7 {{oid}}",mergeBaseToTarget:"Common ancestor → target commit",baseToTarget:"Base commit → target commit",emptyRevision:"Empty revision",selectCommit:"Select a commit to view its details",historyAndCompare:"Git history and comparison",viewMode:"Git view mode",historyMode:"Commit history",compareMode:"Compare branches",selectRepository:"Select repository",viewBranch:"View branch",baseBranch:"Base branch",chooseBase:"Choose base branch",targetBranch:"Target branch",comparison:"Comparison method",introducedChanges:"Changes introduced by this branch",directComparison:"Compare two versions directly",filterAuthor:"Filter by author",author:"Commit author",searchCommits:"Search commit message or SHA",refreshGit:"Refresh Git history",localRecord:"Local record",refUnavailable:"Reference unavailable",aheadBehind:"{{ahead}} ahead \xb7 {{behind}} behind",chooseBaseBranch:"Choose a base branch",restoreGit:"Restore Git panel",maximizeGit:"Maximize Git panel",collapseGit:"Collapse Git panel",copyFailed:"Could not copy",findingGit:"Detecting Git repositories…",noGit:"No Git repository found",collapseDirectory:"Collapse folder tree",expandDirectory:"Expand folder tree",previewDescription:"Read-only preview of project files and Git history",gitRecords:"Git history",refreshPreview:"Refresh project preview",restoreWindow:"Restore preview window",maximizeWindow:"Maximize preview window",closePreview:"Close project preview",previewArea:"Project preview area",files:"Files",code:"Code",changeFiles:"Files changed in commit",viewDiff:"View diff",gitStatus:"Git status {{status}}",viewDiffPath:"View diff: {{path}}",historyDiffAncestor:"Common ancestor {{left}} ↔ {{target}}",historyDiffDirect:"{{left}} ↔ {{target}}",historyReadFailed:"Could not read Git history"},"zh-CN":{chooseProject:"打开项目",switchProject:"切换项目",directoryPath:"目录路径",directoryPlaceholder:"输入完整目录路径",serverDirectoryHint:"选择所连接服务上的目录。",openProject:"打开",recentProjects:"历史项目",browseDirectories:"浏览目录",loadingDirectories:"正在读取目录…",parentDirectory:"上级目录",directoryRoots:"目录",openThisDirectory:"打开此目录",noSubdirectories:"没有子目录",noRecentProjects:"没有历史项目,可输入路径或浏览目录。",currentHead:"当前 HEAD",localBranch:"本地分支",remoteBranch:"远程分支 \xb7 本地记录",retry:"重试",compareDirect:"直接比较",loadingCommits:"读取提交…",commitList:"Git 提交列表",noCommitMessage:"(无提交说明)",noMatchingCommits:"没有匹配的提交",noCommits:"没有提交记录",scanLimit:"历史扫描达到上限,请选择更具体的分支或提交。",loadedLimit:"已加载 2000 条,请缩小查询范围。",loadMoreCommits:"加载更多提交",backCommits:"返回提交列表",commitChanges:"提交变更",cumulativeChanges:"累计变更",loadedFiles:"已加载 {{count}} 个文件",backCumulative:"返回累计变更",loadingChanges:"读取变更…",noDiff:"没有文件差异",loadMoreFiles:"加载更多文件",changesLimit:"变更文件超过显示上限。",commitDetails:"提交详情",copySha:"复制提交SHA",compareParent:"比较父提交",parentCommit:"父提交 {{count}} \xb7 {{oid}}",mergeBaseToTarget:"共同祖先 → 目标提交",baseToTarget:"基准提交 → 目标提交",emptyRevision:"空版本",selectCommit:"选择提交查看详情",historyAndCompare:"Git 历史与比较",viewMode:"Git 查看方式",historyMode:"提交记录",compareMode:"分支比较",selectRepository:"查看仓库",viewBranch:"查看分支",baseBranch:"基准分支",chooseBase:"选择基准分支",targetBranch:"目标分支",comparison:"比较方式",introducedChanges:"本分支引入的变更",directComparison:"两个版本直接比较",filterAuthor:"按提交用户筛选",author:"提交用户",searchCommits:"搜索提交说明或 SHA",refreshGit:"刷新Git记录",localRecord:"本地记录",refUnavailable:"引用不可用",aheadBehind:"领先 {{ahead}} \xb7 落后 {{behind}}",chooseBaseBranch:"选择基准分支",restoreGit:"还原Git区域",maximizeGit:"最大化Git区域",collapseGit:"收起Git区域",copyFailed:"复制失败",findingGit:"正在识别 Git 仓库…",noGit:"未发现 Git 仓库",collapseDirectory:"收起目录",expandDirectory:"展开目录",previewDescription:"只读项目文件和 Git 历史预览",gitRecords:"Git 记录",refreshPreview:"刷新项目预览",restoreWindow:"还原预览窗口",maximizeWindow:"最大化预览窗口",closePreview:"关闭项目预览",previewArea:"项目预览区域",files:"文件",code:"代码",changeFiles:"提交变更文件",viewDiff:"查看差异",gitStatus:"Git 状态 {{status}}",viewDiffPath:"查看差异 {{path}}",historyDiffAncestor:"共同祖先 {{left}} ↔ {{target}}",historyDiffDirect:"{{left}} ↔ {{target}}",historyReadFailed:"读取 Git 历史失败"}}},53085:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,58044,23)),Promise.resolve().then(c.bind(c,23579))},56951:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>d});let d=(0,c(68032).registerClientReference)(function(){throw Error("Attempted to call the default export of \"/home/runner/work/pi-desk/pi-desk/src/app/error.tsx\" from the server, but it's on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"/home/runner/work/pi-desk/pi-desk/src/app/error.tsx","default")},59582:(a,b,c)=>{"use strict";c.d(b,{Bc:()=>m,ZI:()=>p,k$:()=>o,m_:()=>n});var d=c(52834),e=c(92108),f=c(60426),g=c(61604),h=c(69032),i=c(62288),j=c(15672),k=c(42582),l=c(15620);function m({delay:a=0,...b}){return(0,d.jsx)(e.B,{"data-slot":"tooltip-provider",delay:a,...b})}function n({...a}){return(0,d.jsx)(f.s,{"data-slot":"tooltip",...a})}function o({...a}){return(0,d.jsx)(g.k,{"data-slot":"tooltip-trigger",...a})}function p({className:a,side:b="top",sideOffset:c=4,align:e="center",alignOffset:f=0,children:g,...m}){return(0,d.jsx)(h.K,{children:(0,d.jsx)(i.o,{align:e,alignOffset:f,side:b,sideOffset:c,className:"isolate z-50",children:(0,d.jsxs)(j.o,{"data-slot":"tooltip-content",className:(0,l.cn)("z-50 inline-flex w-fit max-w-xs origin-(--transform-origin) items-center gap-2 rounded-md bg-foreground px-2 py-1 text-xs leading-5 text-background duration-100 motion-reduce:animate-none has-data-[slot=kbd]:pr-1.5 data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-sm data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",a),...m,children:[g,(0,d.jsx)(k.P,{className:"z-50 size-2.5 translate-y-[calc(-50%-2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground data-[side=bottom]:top-1 data-[side=inline-end]:top-1/2! data-[side=inline-end]:-left-1 data-[side=inline-end]:-translate-y-1/2 data-[side=inline-start]:top-1/2! data-[side=inline-start]:-right-1 data-[side=inline-start]:-translate-y-1/2 data-[side=left]:top-1/2! data-[side=left]:-right-1 data-[side=left]:-translate-y-1/2 data-[side=right]:top-1/2! data-[side=right]:-left-1 data-[side=right]:-translate-y-1/2 data-[side=top]:-bottom-2.5"})]})})})}},59587:(a,b,c)=>{"use strict";c.d(b,{Jz:()=>g,bm:()=>n,iT:()=>i,sd:()=>j});var d=c(59473),e=c(2002),f=c(24187);let g=d.Yj().min(32).max(128).regex(/^[A-Za-z0-9_-]+$/),h="/api/plugins/host-runtime/v1",i=Object.freeze({imports:Object.freeze({react:`${h}/base.js`,"react/jsx-runtime":`${h}/base.js`,"react/jsx-dev-runtime":`${h}/base.js`,"react-dom":`${h}/base.js`,"react-dom/client":`${h}/base.js`,"@jetcrab/pi-desk-sdk/react/base":`${h}/base.js`,"@jetcrab/pi-desk-sdk/react/markdown":`${h}/markdown.js`})}),j=d.eu("v1"),k=d.Ik({pluginName:f.tv,url:d.Yj().regex(/^\/api\/plugins\/browser-resources\/[A-Za-z0-9_-]{32,128}\/entry\.js$/,"Browser Entry URL 无效")}).strict(),l=d.Ik({}).strict(),m=d.Ik({entries:d.YO(k)}).strict(),n=Object.freeze({list:(0,e.Vc)({path:"plugins/browser-entries/list",inputSchema:l,outputSchema:m})})},60141:(a,b,c)=>{"use strict";function d(){let a=globalThis.crypto;if("function"==typeof a.randomUUID)return a.randomUUID();let b=a.getRandomValues(new Uint8Array(16));b[6]=15&b[6]|64,b[8]=63&b[8]|128;let c=Array.from(b,a=>a.toString(16).padStart(2,"0")).join("");return`${c.slice(0,8)}-${c.slice(8,12)}-${c.slice(12,16)}-${c.slice(16,20)}-${c.slice(20)}`}c.d(b,{y:()=>d})},60632:(a,b,c)=>{"use strict";c.d(b,{P:()=>d});let d={en:{imagePreview:"Skill image preview",chooseFile:"Select a Skill file",chooseFileDescription:"Choose a Skill from your projects to view or edit its instructions, scripts and reference files.",global:"Global",project:"Project",package:"Package",local:"Local",saving:"Saving",switchingFile:"Switching files",unsavedChanges:"Unsaved changes",readOnlyFile:"Read-only file",fileSaved:"File saved",unsaved:"Unsaved",readOnly:"Read-only",saved:"Saved",copySkillPath:"Copy Skill file path",copyPath:"Copy file path",saveSkill:"Save Skill file",save:"Save",reload:"Reload",loadingFile:"Loading file…",fileSize:"{{size}} bytes",saveShortcut:"Ctrl / ⌘ S to save",wrapLines:"Wrap lines",retryFolder:"Retry folder",loadingFolder:"Loading folder…",skillFile:"Skill file: {{path}}",skillName:"Skill: {{name}}",emptyFolder:"Empty folder",folderTruncated:"Too many entries; showing part of the folder.",skillFolder:"Skill folder: {{path}}",packageSkill:"Skill from a package",globalSkills:"Global Skills",projectSkills:"Project Skills: {{name}}",skillsGroup:"Skills group: {{name}}",retryGroup:"Retry group",noSkillMatches:"No matching Skills in this group",noSkills:"No Skills found in this group",diagnostics_one:"{{count}} resource diagnostic",diagnostics_other:"{{count}} resource diagnostics",searchSkills:"Search projects or Skills",searchSkillsPlaceholder:"Search projects or Skills…",workspaceCount_one:"Current workspace \xb7 {{count}} project",workspaceCount_other:"Current workspace \xb7 {{count}} projects",workspaceEmpty:"No projects in this workspace. Global Skills are still available.",pathCopied:"File path copied",copyFailed:"Could not copy. Check browser clipboard permission.",skillsManagement:"Manage Skills",openSkillsFolder:"Open Skills folder",collapseSkillsFolder:"Collapse Skills folder",expandSkillsFolder:"Expand Skills folder",refreshSkillsFolder:"Refresh Skills folder",refreshFolder:"Refresh folder",skillsProjectFolder:"Skills project folder",skillsFolderTitle:"Skills folder",saveChangesTitle:"Save file changes?",saveChangesDescription:"Changes to {{path}} are not saved.",cancel:"Cancel",discard:"Discard changes",savingChanges:"Saving…",saveContinue:"Save and continue",saveFailed:"Could not save file",fileReadFailed:"Could not read file",skillsReadFailed:"Could not load Skills",directoryReadFailed:"Could not read folder"},"zh-CN":{imagePreview:"Skill 图片预览",chooseFile:"选择一个 Skill 文件",chooseFileDescription:"从项目目录中选择 Skill,查看和编辑它的说明、脚本与参考文件。",global:"全局",project:"项目",package:"包",local:"本地",saving:"正在保存",switchingFile:"正在切换文件",unsavedChanges:"有未保存修改",readOnlyFile:"文件只读",fileSaved:"文件已保存",unsaved:"未保存",readOnly:"只读",saved:"已保存",copySkillPath:"复制 Skill 文件路径",copyPath:"复制文件路径",saveSkill:"保存 Skill 文件",save:"保存",reload:"重新读取",loadingFile:"正在读取文件…",fileSize:"{{size}} 字节",saveShortcut:"Ctrl / ⌘ S 保存",wrapLines:"自动换行",retryFolder:"重试目录",loadingFolder:"正在读取目录…",skillFile:"Skill 文件:{{path}}",skillName:"Skill:{{name}}",emptyFolder:"空目录",folderTruncated:"目录项过多,仅显示部分内容。",skillFolder:"Skill 目录:{{path}}",packageSkill:"包提供的 Skill",globalSkills:"全局 Skills",projectSkills:"项目 Skills:{{name}}",skillsGroup:"Skills 分组:{{name}}",retryGroup:"重试分组",noSkillMatches:"此分组没有匹配的 Skill",noSkills:"此分组没有发现 Skills",diagnostics_one:"{{count}} 项资源诊断",diagnostics_other:"{{count}} 项资源诊断",searchSkills:"搜索项目或 Skill",searchSkillsPlaceholder:"搜索项目或 Skill…",workspaceCount_one:"当前工作区 \xb7 {{count}} 个项目",workspaceCount_other:"当前工作区 \xb7 {{count}} 个项目",workspaceEmpty:"工作区暂无项目,仍可管理全局 Skills。",pathCopied:"文件路径已复制",copyFailed:"复制失败,请检查浏览器剪贴板权限",skillsManagement:"Skills 管理",openSkillsFolder:"打开 Skills 目录",collapseSkillsFolder:"收起 Skills 目录",expandSkillsFolder:"展开 Skills 目录",refreshSkillsFolder:"刷新 Skills 目录",refreshFolder:"刷新目录",skillsProjectFolder:"Skills 项目目录",skillsFolderTitle:"Skills 目录",saveChangesTitle:"保存文件修改?",saveChangesDescription:"{{path}} 的修改尚未保存。",cancel:"取消",discard:"放弃修改",savingChanges:"正在保存…",saveContinue:"保存并继续",saveFailed:"保存失败",fileReadFailed:"读取文件失败",skillsReadFailed:"读取 Skills 失败",directoryReadFailed:"读取目录失败"}}},61035:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{J:()=>l});var e=c(77598),f=c(73024),g=c(76760),h=c(75430),i=c(41904),j=a([h]);function k(){let a=Intl.DateTimeFormat().resolvedOptions();return i.J.parse({region:{locale:a.locale.toLowerCase().startsWith("zh")?"zh-CN":"en",timeZone:a.timeZone||"UTC"}})}h=(j.then?(await j)():j)[0];class m{constructor(a=(0,g.join)((0,h.getAgentDir)(),"pi-desk-settings.json"),b=k){this.path=a,this.defaults=b,this.snapshot=null,this.listeners=new Set,this.tail=Promise.resolve()}getSnapshot(){if(!this.snapshot)if((0,f.existsSync)(this.path))this.snapshot=i.J.parse(JSON.parse((0,f.readFileSync)(this.path,"utf8")));else{let a=i.J.parse(this.defaults());this.save(a),this.snapshot=a}return this.snapshot}subscribe(a){return this.listeners.add(a),()=>this.listeners.delete(a)}update(a){let b=this.tail.then(()=>{let b=this.getSnapshot(),c=i.J.parse({region:{...b.region,...a}});if(JSON.stringify(b)!==JSON.stringify(c))for(let a of(this.save(c),this.snapshot=c,console.info("[Pi Desk][Settings] 共享地区设置已保存",c.region),this.listeners))try{a()}catch(a){console.error("[Pi Desk][Settings] 设置订阅回调失败",{message:a instanceof Error?a.message:String(a)})}});return this.tail=b.catch(()=>void 0),b}save(a){(0,f.mkdirSync)((0,g.dirname)(this.path),{recursive:!0});let b=`${this.path}.${process.pid}.${(0,e.randomUUID)()}.tmp`;try{(0,f.writeFileSync)(b,`${JSON.stringify(a,null,2)}
29
+ })()`,q="force-dynamic",r={title:"Pi Desk",description:"Pi Desk web workspace"},s={interactiveWidget:"resizes-content"};function m({children:a}){let b=(0,f.J)().getSnapshot();return(0,e.jsxs)("html",{lang:b.region.locale,className:"dark","data-pi-desk-display-size":j.Y8,suppressHydrationWarning:!0,children:[(0,e.jsxs)("head",{children:[(0,e.jsx)("script",{type:"importmap",dangerouslySetInnerHTML:{__html:n}}),(0,e.jsx)(g.default,{id:"pi-desk-theme",strategy:"beforeInteractive",children:o}),(0,e.jsx)(g.default,{id:"pi-desk-display-size",strategy:"beforeInteractive",children:p})]}),(0,e.jsx)("body",{children:(0,e.jsx)(k.L1AppProviders,{initialSettings:b,children:a})})]})}d()}catch(a){d(a)}})},21147:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>e});var d=c(52834);function e({error:a,reset:b}){return(0,d.jsx)("html",{lang:"en",children:(0,d.jsxs)("body",{style:{margin:0,padding:"15vh 1rem",fontFamily:"system-ui, sans-serif",textAlign:"center"},children:[(0,d.jsx)("h1",{children:"Page unavailable / 页面暂时无法加载"}),(0,d.jsx)("button",{type:"button",onClick:b,style:{padding:"0.5rem 1rem",cursor:"pointer"},children:"Try again / 重试"})]})})}c(49147)},21169:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,7005,23)),Promise.resolve().then(c.t.bind(c,49453,23)),Promise.resolve().then(c.t.bind(c,79460,23)),Promise.resolve().then(c.t.bind(c,88476,23)),Promise.resolve().then(c.t.bind(c,97016,23)),Promise.resolve().then(c.t.bind(c,27297,23)),Promise.resolve().then(c.bind(c,1480))},21850:(a,b,c)=>{"use strict";c.d(b,{B:()=>f,o:()=>e});let d=null;function e(a){d=a}function f(a){return a.i18n?d?.(a.i18n.key,a.i18n.params)??a.msg:a.msg}},23579:(a,b,c)=>{"use strict";c.d(b,{L1AppProviders:()=>y});var d=c(52834),e=c(49147),f=c(51601),g=c(60632),h=c(43115),i=c(38273),j=c(96436),k=c(89172),l=c(92991),m=c(72062),n=c(84074),o=c(96478);function p({children:a}){let{wrapLines:b}=(0,o.TX)();return(0,d.jsx)(d.Fragment,{children:a})}var q=c(4998),r=c(57850),s=c(2719);function t(){let{pendingLocale:a}=(0,q.i)(),{t:b}=(0,r.Bd)("common");return(0,s.G)(),(0,e.useRef)(null),null}var u=c(59582),v=c(60141),w=c(96298);let x={en:{...l.n.en,errors:{invalidJson:"Invalid request JSON",invalidClient:"Invalid client identifier",invalidInput:"Invalid request details",sourceExpired:"The chat source has changed",sessionMissing:"Work session not found",projectChanged:"The work session project has changed",projectMissing:"Project directory not found",fileMissing:"File or directory not found",notDirectory:"The target is not a directory",notFile:"The target is not a file",outsideProject:"The target is outside the current project",textTooLarge:"This text file exceeds 5 MB and cannot be previewed online",imageTooLarge:"This image is too large for online preview",previewUnsupported:"This file type cannot be previewed online",fileReadFailed:"Could not read the project file",projectSearchPatternInvalid:"The search expression is invalid or uses unsupported syntax",projectSearchUnavailable:"The project search engine is unavailable. Reinstall the complete runtime dependencies",projectSearchTimeout:"Project search timed out. Narrow the search scope and try again",projectSearchReadFailed:"Could not read project search files or results",projectSearchCancelled:"Project search was cancelled",revealFailed:"Could not open the file location",repositoryMissing:"Git repository not found",gitOutsideProject:"The Git target is outside the current project",gitReadFailed:"Could not read the Git repository",skillsInputInvalid:"Invalid Skills request details",skillsContentTooLarge:"The submitted text exceeds the file size limit",skillsProjectChanged:"This project is no longer in the workspace. Select a project again",skillMissing:"Skill or file not found",skillsPermissionDenied:"Permission denied when accessing the Skill file",skillsFileFailed:"Could not process the Skills file. Please try again",chatSubscribeInvalid:"Invalid chat subscription details",chatSubscribeExpired:"The chat subscription source has changed",chatSubscribeFailed:"Could not initialize chat subscriptions",chatSendInvalid:"Invalid message details",chatSendTooLarge:"Message exceeds 31 MB",chatInterruptInvalid:"Invalid interrupt request",chatCompactInvalid:"Invalid compaction request",chatReloadInvalid:"Invalid Pi configuration reload request",chatRestoreInvalid:"Invalid queued message restore request",chatRestoreTooLarge:"Restored content exceeds the transport limit",chatModelInvalid:"Invalid model settings request",chatModeInvalid:"Invalid capability mode request",chatSourceBusy:"The work session is changing or switching branches",socketUnknownPath:"Unknown WebSocket operation",sessionsNotReady:"Work sessions are not initialized yet",sessionsInitializing:"Work sessions are initializing",sessionsInitializeInvalid:"Invalid work session initialization request",sessionsInitializeFailed:"Could not initialize work sessions",completionAckInvalid:"Invalid completion acknowledgement",completionAckFailed:"Could not confirm the work session completion state",capabilityFailed:"Could not update capability modes",capabilityRuleInvalid:"Check the capability mode rules",chatContextJsonInvalid:"Invalid JSON for system context request",chatContextInvalid:"Invalid system context request",chatContextBusy:"Session is running. System context is temporarily unavailable",chatContextFailed:"Could not read system context",chatMessageInvalid:"Invalid message detail request",chatMessageMissing:"Chat message not found",chatMessageFailed:"Could not load message details",chatImageInvalid:"Invalid chat image request",chatImageMissing:"Chat image not found",chatImageFailed:"Could not load chat image",modelSettingsInvalid:"Invalid model configuration",modelCatalogInvalid:"Invalid model catalog request",modelCatalogUnavailable:"Model reference catalog is temporarily unavailable",modelSaveFailed:"Could not save model configuration",modelSettingsGetInvalid:"Invalid model settings request",modelSettingsGetFailed:"Could not read model settings",projectDefaultInputInvalid:"Invalid project directory",projectDefaultGetFailed:"Could not read project model default",projectDefaultSaveInvalid:"Invalid project model default",projectDefaultSaveFailed:"Could not save project model default",modelsListFailed:"Could not list models",directoryBrowseInvalid:"Invalid directory browser request",directoryMissing:"Directory not found or is not a folder",directoryReadDenied:"Could not read directory",directoryBrowseFailed:"Could not browse server directories",workSessionCreateInvalid:"Invalid cwd or session ID",workSessionDirectoryMissing:"Project directory does not exist or is not a folder",historySessionMissing:"No Pi session found in this directory",historySessionOccupied:"Pi session is already used by another work session",workSessionCreateFailed:"Could not create work session",workSessionReplaceInvalid:"Invalid work session replacement request",workSessionReplaceOccupied:"Pi session is bound to another work session",workSessionReplaceFailed:"Could not replace the Pi session",workSessionRenameInvalid:"Invalid work session title request",workSessionRenameChanged:"Work session changed. Reopen the title editor",workSessionRenameFailed:"Could not rename the work session",workSessionDeleteInvalid:"Invalid work ID",workSessionDeleteFailed:"Could not delete work session",workSessionSortInvalid:"Invalid work session order or pinned count",workSessionOrderChanged:"Work session list changed. Refresh and try again",workSessionSortFailed:"Could not reorder work sessions",sessionTreeInvalid:"Invalid session tree request",sessionTreeChanged:"Work session changed. Reopen the session tree",sessionTreeFailed:"Could not read session tree",sessionTreeEntryInvalid:"Invalid session tree entry request",sessionTreeEntryMissing:"Session tree entry not found or no longer available",sessionTreeEntryFailed:"Could not read session tree entry",branchInputInvalid:"Invalid branch operation request",branchEntryMissing:"Branch entry not found or no longer available",branchForkUserOnly:"Only user messages can start a new session",branchCloneEmpty:"There are no messages to clone yet",branchFailed:"Could not perform branch operation",taskDetailInvalid:"Invalid task detail request",taskSourceChanged:"Work session source changed",taskMissing:"Task not found",taskDetailUnsupported:"Task does not provide conversation details",taskMessageMissing:"Task message not found",taskMessageNoDetail:"Task message has no details",taskConversationUnavailable:"Task conversation is temporarily unavailable",taskMessageFailed:"Could not read task message details",taskImageMissing:"Task image not found",taskImageFailed:"Could not read task image",refreshInvalid:"Invalid forceRefresh setting",piDirectoriesFailed:"Could not list Pi project directories",ignoredDirectoriesFailed:"Could not list ignored folders",directoryIgnoreInvalid:"Invalid ignored folder request",directoryIgnoreFailed:"Could not update ignored folders",historyQueryInvalid:"Invalid session history search",historyQueryFailed:"Could not list Pi session history",userMessagesInvalid:"Invalid user message request",piSessionMissing:"Pi session not found",userMessagesFailed:"Could not load past user messages",projectJsonInvalid:"Invalid project request JSON",projectInputInvalid:"Invalid project request",projectCwdAbsolute:"Project directory must be an absolute path",projectOperationFailed:"Project operation failed",capabilityGetInvalid:"Invalid capability mode query",capabilityGetFailed:"Could not read capability modes",capabilityReplaceInvalid:"Invalid capability mode configuration",capabilityReplaceFailed:"Could not save capability modes",pluginResourceMissing:"Plugin browser resource not found",pluginResourceReadFailed:"Could not read plugin browser resource",hostResourceMissing:"Host plugin resource not found",hostRuntimeUnavailable:"Host plugin runtime is not built",hostResourceReadFailed:"Could not read Host plugin resource",gitAddJsonInvalid:"Invalid JSON for new Git branch",gitAddInputInvalid:"Invalid new Git branch request",gitAddFailed:"Could not create Git branch",gitSwitchJsonInvalid:"Invalid Git branch switch JSON",gitSwitchInputInvalid:"Invalid Git branch switch request",gitSwitchFailed:"Could not switch Git branch",gitReadOperationFailed:"Could not read Git data",pluginNpmRootUnavailable:"Pi Package npm root is unavailable: {{detail}}",pluginNpmRootMissingDeclarations:"Pi Package configuration does not match the npm root (missing declarations: {{declarations}})",pluginNpmRootMissingFolders:"Pi Package configuration does not match the npm root (missing folders: {{folders}})",pluginNpmRootMissingBoth:"Pi Package configuration does not match the npm root (missing declarations: {{declarations}}; missing folders: {{folders}})",pluginReloadBlocked:"Work session {{workId}} blocked plugin reload: {{reason}}",pluginRuntimeBusy:"Plugin runtime still has active calls",pluginRestartPending:"Another plugin operation must finish restarting first",pluginRestartUnavailable:"This launch mode cannot restart Pi Desk automatically",pluginNotFound:"Plugin not found: {{source}}",pluginSourceInvalid:"Invalid plugin source"},auth:{title:"Sign in to Pi Desk",subtitle:"Continue your work.",protection:"Sign-in protection",enabled:"Enabled",disabled:"Not enabled",publicAccess:"Anyone who can reach this service can open the workspace.",changePassword:"Change password",setPassword:"Set a password",newPassword:"New password",passwordHint:"12–64 characters; use at least three of: uppercase letters, lowercase letters, numbers and symbols. No leading/trailing spaces, line breaks or invisible control characters.",generatePassword:"Generate password",generatePasswordHint:"Generate a random 16-character password",generatePasswordFailed:"Unable to generate a password. Please try again.",saveEffect:"Keep your password safe. Saving requires all devices to sign in again.",enable:"Enable sign-in protection",saveAndSignIn:"Save and sign in again",saving:"Saving…",logout:"Sign out",signingOut:"Signing out…",logoutFailed:"Unable to sign out. Please try again later.",logoutInvalid:"Invalid sign-out request.",logoutCrossOriginDenied:"Cross-site sign-out requests are not allowed.",disable:"Disable protection",disableTitle:"Disable sign-in protection?",disableDescription:"Anyone who can reach this service will be able to open the workspace. Continue?",recovery:"Forgot your password?",recoveryDescription:"Delete this file on the device running the service, then refresh the page to restore access.",settingsFailed:"Unable to load or save sign-in protection settings.",settingsInvalid:"The password does not meet the requirements shown below the field.",configUnavailable:"Unable to read sign-in protection settings. Repair the configuration or delete auth.json and set it up again.",crossOriginDenied:"Cross-site changes to sign-in protection are not allowed.",password:"Password",submit:"Sign in",submitting:"Signing in…",loginFailed:"Unable to sign in",invalidResponse:"Invalid response from the sign-in service",invalidCredentials:"Sign-in failed. Check your sign-in details and try again.",invalidInput:"Sign-in failed. Check your sign-in details and try again.",unavailable:"Sign-in is temporarily unavailable. Please try again later.",tooManyAttempts:"Too many sign-in attempts. Please try again later.",loginAlertTitle:"Unusual sign-in activity",loginAlertDescription:"More than 5 consecutive sign-in failures. Check whether these attempts were yours.",invalidClient:"Invalid client identifier"},capabilityModes:{saved:"Capability modes saved",saving:"Saving…",saveModes:"Save modes",settings:"Capability mode settings",editMode:"Edit mode",selectMode:"Select a capability mode to edit",unnamedMode:"Unnamed mode",allDefault:"All enabled \xb7 Default",addMode:"Add mode",copyMode:"Copy current mode",copyTitle:"Copy mode",deleteMode:"Delete current mode",deleteTitle:"Delete mode",refreshCatalog:"Refresh capability options",retryRead:"Retry loading",loadingCatalog:"Loading capability options…",allEnabled:"All enabled",allDescription:"Use all loaded capabilities.",unsaved:"Unsaved changes",allIsDefault:"All enabled is the default mode",policyAll:"Enable all",policyAllow:"Only these",policyDeny:"Exclude these",policyNone:"Disable all",ruleEditor:"Edit {{name}} rules",ruleMode:"{{name}} availability",exclusions:"Exclusions",ruleSearch:"Search or enter capability rules",ruleSearchPlaceholder:"Search names or enter * patterns",clearSearch:"Clear rule search",selectedOnly:"Selected only",selectedShort:"Selected",allowRules:"Allow rules",excludeRules:"Exclude rules",selectedCount_one:"{{count}} selected",selectedCount_other:"{{count}} selected",selectVisible:"Select visible",clearSelected:"Clear selected",addRule:"Add rule",allowValue:"Allow {{name}}",excludeValue:"Exclude {{name}}",pattern:"Pattern",noMatches:"No matches; you can add the rule above.",noSelection:"No rules selected yet.",enterPattern:"Enter a name or wildcard rule to add it.",moreRules:"Show more \xb7 {{count}} remaining",deleteConfirm:"Delete capability mode?",saveConfirm:"Save mode changes?",deleteDescription:"Delete “{{name}}” and save? Sessions using it will switch to All enabled.",unsavedDescription:"Changes to capability modes have not been saved.",cancel:"Cancel",delete:"Delete mode",discard:"Discard changes",saveContinue:"Save and continue",modeName:"Mode name",category:"Capability categories",groupTools:"Tools",modeSwitching:"Switching…",modePicker:"Capability mode: {{name}}",catalogFailed:"Could not load capability options",saveFailed:"Could not save capability modes",copySuffix:"{{name}} copy",newMode:"New mode"},pluginManagement:{actionAdd:"Install plugin",actionUpdate:"Update plugin",actionDelete:"Uninstall plugin",actionReload:"Restart Pi Desk",restartNormal:"Restart with plugins",restartNormalDescription:"Restart Pi Desk and load external plugins again. All connections will be restored after restart.",applyChanges:"Load changes",applyDescription:"Update plugin services and views now. Existing Pi sessions keep their extensions until manually reloaded.",reloadOne:"Reload",reloadSource:"Reload {{name}}",basicModeNotice:"Basic mode skips plugin loading and inspection. Repair files using chat, then choose Restart with plugins.",localExtension:"Local source",localSourceHelp:"Manage this entry in its source directory",discovered:"Enabled",disabledByPi:"Disabled",active:"Enabled",notLoaded:"Not loaded",phase_queued:"Queued",phase_checking:"Checking",phase_applying:"Applying",phase_waiting:"Waiting to activate",phase_failed:"Failed",updateCheckFailed:"Could not check plugin updates",actionFailed:"{{action}} failed",retrying:"Retrying {{name}}",retryFailed:"Could not retry plugin UI",refreshingEntries:"Refreshing plugin UI",refreshEntriesFailed:"Could not refresh plugin UI",detailFailed:"Could not load plugin details",title:"Plugins",description:"Manage plugin packages and local extensions.",noPluginDescription:"No description available",checkUpdates:"Check updates",checkingUpdates:"Checking…",restartApply:"Restart to finish",installPlugin:"Install plugin",source:"Plugin source",sourcePlaceholder:"npm package, Git URL or local directory",install:"Install",installVersion:"Install this version",installIncompatible:"This plugin version is incompatible with the current Pi Desk version and cannot be installed.",pendingRestart:"Plugin changes will take effect after restart",retry:"Retry",confirmAction:"{{action}}?",restartDescription:"Restart Pi Desk to apply pending changes. Connections will be restored after restart.",cancel:"Cancel",installed:"Installed plugins",loading:"Loading plugins…",updateAvailable:"Update available",abnormal:"Error",capabilityCategories:"Plugin capability categories",update:"Update",details:"Details",viewDetails:"View plugin details: {{name}}",remove:"Uninstall",empty:"No plugins found",viewLoading:"Loading plugin UI…",viewFailed:"Could not load plugin UI",closeApplication:"Close plugin application",closeNamedApplication:"Close {{name}}",eventAgentStart:"Before agent starts",eventAgentStartDescription:"Can append to or replace the system prompt and inject session messages.",eventContext:"Before model call",eventContextDescription:"Can replace the messages sent to the model for this call.",eventInput:"User input",eventInputDescription:"Can rewrite, intercept or handle user input.",eventProvider:"Before provider request",eventProviderDescription:"Can replace the final provider payload.",eventToolCall:"Before tool call",eventToolCallDescription:"Can modify tool arguments or block execution.",eventToolResult:"After tool result",eventToolResultDescription:"Can modify tool results entering later model context.",eventMessageEnd:"After message completes",eventMessageEndDescription:"Can replace the final message and affect later context.",eventBeforeCompact:"Before context compaction",eventBeforeCompactDescription:"Can cancel compaction or replace the summary.",contributionApplication:"Application",contributionComposer:"Composer panel",contributionSettings:"Settings page",contributionMessage:"Message view",contributionSidebar:"Session sidebar",contributionWidget:"Composer widget",contributionSessionHeader:"Session header item",tagTools:"{{count}} tools",tagFixed:"{{count}} fixed prompts",tagDynamic:"{{count}} dynamic hooks",tagOverride:"{{count}} builtin overrides",tagManual:"{{count}} manual prompts",tagInteraction:"{{count}} interactions",unknown:"Unknown",stateActive:"Active",stateInactive:"Inactive",stateShadowed:"Overridden",copied:"Copied",copy:"Copy",copyNamed:"Copy {{name}}",dynamicTitle:"Dynamic context hooks",dynamicDescription:"These hooks can affect prompts and messages, but registration does not mean each call changed them.",arguments:"Arguments",none:"None",required:"Required",optional:"Optional",noArguments:"This tool takes no arguments.",rawSchema:"Raw schema",toolCapabilities:"Tool capabilities",toolDescription:"Each tool shows its purpose, parameters and declared system prompts.",overridesBuiltin:"Overrides a Pi builtin tool",noDescription:"No description provided",systemPrompts:"System prompts",inactivePrompt:"This tool is inactive; its prompts do not enter the system prompt.",truncated:"Content exceeds 64 KB; showing the first 64 KB.",resourcesTitle:"Skills and prompts",resourcesDescription:"Callable Skills contribute metadata to the system prompt; full content is loaded on demand. Prompt templates expand when invoked by the user.",skillModelVisible:"Description in system prompt",manualOnly:"Manual invocation only",skillMetadata:"Skill metadata in system prompt",viewSkillContent:"View Skill content",viewPromptContent:"View prompt content",otherCapabilities:"Other capabilities",messageDeclarations:"Message declarations:",backToList:"Back to plugins",incompleteCapabilities:"Capability list incomplete: {{error}}",metricToolDefinitions:"Tool definitions",metricFixed:"Fixed prompts",metricDynamic:"Dynamic hooks",metricManual:"Manual prompt resources",loadingFullDetails:"Loading full capability details",installedTab:"Installed",searchPlugins:"Find plugins",directInstall:"Manual install",advancedOptions:"Advanced options",capabilityDetails:"Features and runtime details",newVersion:"New v{{version}}",removeNamed:"Uninstall {{name}}",updateAll:"Update all ({{count}})",batchManage:"Select plugins",finishSelection:"Done",selectAll:"Select all",filterStatus:"Plugin status",statusFilter_all:"All statuses",statusFilter_updates:"Updates available",statusFilter_disabled:"Disabled",statusFilter_failed:"Errors",batchWaiting:"Not submitted. Finish pending operations, then try again.",batchInstall:"Install plugins",batchSourcePlaceholder:"One npm package per line; a single source can also be a Git URL or local directory",batchNpmOnly:"Enter one npm package per line for batch installation.",batchLimit:"Choose up to 32 plugins per batch.",batchFailed:"Could not submit plugin changes",sourceBusy:"This plugin has an operation in progress. Try again when it finishes.",selectFiltered:"Select all results",selectPlugin:"Select {{name}}",selectedCount:"{{count}} selected",clearSelection:"Clear selection",checkSelected:"Check selected",updateSelected:"Update selected",removeSelected:"Uninstall selected",setChannel:"Set channel",installChannel:"Version preference",defaultChannel:"Default",automaticVersion:"Default version",allChannels:"All channels",filterChannel:"Filter by channel",channelLatest:"Stable",channelDev:"Development",followingChannel:"Channel: {{tag}}",targetVersion:"Target: {{version}}",itemCheckFailed:"Update check failed: {{error}}",filterInstalled:"Search installed plugins",noMatches:"No matching plugins",enabled:"Enabled",disabled:"Disabled",enable:"Enable",disable:"Disable",togglePlugin:"Enable or disable {{name}}",submitting:"Submitting…",installing:"Installing…",alreadyInstalled:"Installed",retryView:"Retry plugin view",more:"More",downloadSource:"Download source",installDownloadSource:"Download source for this install",useDefaultSource:"Use saved default",download_local:"No override (local configuration)",download_auto:"Automatic",download_domestic:"China mirror",download_official:"Official npm",download_custom:"Custom",registryUrl:"Registry URL",sourceDetails:"View source URL",recommending:"Choosing a source…",saving:"Saving…",save:"Save",settingsFailed:"Could not save or read download settings",invalidRegistry:"Enter a valid HTTP or HTTPS registry URL without credentials, query or fragment.",searchPlaceholder:"Search plugin name or description",searchSource:"Search registry",publicNpm:"Public npm",customSearchSource:"Custom registry",searchRegistryUrl:"Search registry URL",pluginKind:"Plugin type",kind_all:"All types",kind_desk:"Pi Desk",kind_pi:"Pi",kind_unknown:"Unverified type",official:"Official",publisher:"Publisher",unknownPublisher:"Publisher not provided",searchFailed:"Could not search plugins",searching:"Searching…",noSearchResults:"No matching plugins. Try another search.",loadMore:"Load more",loadingPackage:"Loading package details…",readPackage:"Read package details",version:"Version",packageName:"Package",readme:"README",noReadme:"No README provided",readmeLanguage:"Language",defaultLanguage:"Automatic / original",compatible:"Compatible",incompatible:"Not compatible with this version",compatibilityUnknown:"Compatibility not verified",homepage:"Website",repository:"Source code",removeDescription:"Remove this plugin. Saved configuration and data will be kept.",thirdPartyDescription:"This plugin can execute code on your computer. Only install it if you trust its publisher and source.",confirmChange:"Apply this change to the selected plugin.",fromSource:"Version from source",pluginDetails:"Plugin details",pluginRemoved:"This plugin is no longer installed.",close:"Close"},projectHistory:f.p.en,settings:{title:"Settings",general:"General settings",workCapabilities:"Tools & models",application:"Application",category:"Settings section",appearance:"Appearance",region:"Language & time zone",habits:"Preferences",loginProtection:"Sign in",models:"Models",mcpSettings:"MCP",capabilityModes:"Capability modes",skills:"Skills",plugins:"Plugins",pluginSettings:"Plugin settings",about:"About",language:"Language",timeZone:"Time zone",currentLanguage:"Current language: {{locale}}",currentTimeZone:"Current time zone: {{timeZone}}",timeExample:"Local time",searchTimeZones:"Search time zones",reloadLanguage:"Reload to use this language",version:"Current version",versionUpdated:"Version updated",webDescription:"Pi in your browser",discardModelTitle:"Unsaved model settings",discardModelDescription:"Discard changes to model settings?",discardModelConfirm:"Discard changes",theme:"Theme",themeLight:"Light",themeDark:"Dark",displaySize:"Display size",sizeCompact:"Compact",sizeStandard:"Standard",sizeLarge:"Large",displayPreview:"Display preview",displayPreviewContent:'## Project progress\n\nToday we organized the work plan. Next, we will finish the remaining tasks.\n\n```ts\nconst status = "ready"\n```',browserOnly:"These settings only apply to this browser.",newSessionBehavior:"After creating a session",behaviorNone:"Keep current session",behaviorNoneDescription:"Stay in the current session after creating another.",behaviorActivate:"Switch to new session",behaviorActivateDescription:"Open the new session immediately.",behaviorPin:"Pin automatically",behaviorPinDescription:"Pin the new session and keep the current one active.",desktopOnlyBehavior:"Applies on desktop only; mobile always opens the new session.",imagePreviewMode:"Image preview",imageCompressed:"Optimized preview",imageCompressedDescription:"Reduce data use for large images without modifying project files.",imageOriginal:"Original image",imageOriginalDescription:"Keep original quality; large images use more data.",imagePreviewApply:"Changes apply to newly loaded or manually reloaded images.",modelProviders:"Model management",modelPresets:"Common combinations",serviceAddress:"Service address",serviceKey:"Access key",serviceId:"Service ID",serviceIdInvalid:"Enter a unique, non-empty service ID.",serviceConnection:"Service connection",serviceSettingsNamed:"{{name}} connection settings",currentServiceSettings:"Current service connection settings",modelAddToService:"Add a model to {{name}}",inheritService:"Inherit service settings",inheritServiceValue:"Inherit service: {{value}}",applyServiceDraft:"Apply to draft",serviceDraftScope:"Used by {{count}} models. Apply here, then save the model configuration.",discardServiceTitle:"Unsaved connection changes",discardServiceDescription:"Discard this connection draft?",selectModelToEdit:"Select a model to edit",backModelList:"Back to model list",modelIdRequired:"Enter a model ID.",modelNameRequired:"Enter a display name.",capacityInvalid:"Enter a positive number with up to three decimal places.",priceInvalid:"Enter a non-negative number.",inputAndThinking:"Input and reasoning",addModelPreset:"Add to common combinations",saveBeforePreset:"Save this model before adding it to common combinations.",modelDraftPending:"Configuration changes are not saved",modelDraftClean:"No unsaved changes",fixModelInputs:"Correct the invalid model fields before saving",revertModels:"Discard configuration changes",modelMoreActions:"Model configuration actions",nativeConfig:"Pi configuration",nativeConfigEditor:"Pi model configuration",nativeConfigScope:"Edit the complete models.json configuration, including modelOverrides, inputLimits, promptCache, samplingParams and tiered pricing.",nativeProtectDraft:"Save or discard your form changes before opening Pi configuration.",saveNativeConfig:"Save Pi configuration",discardNativeTitle:"Unsaved Pi configuration",discardNativeDescription:"Discard changes to the Pi configuration?",projectDefault:"Project defaults",loadingModels:"Loading model settings…",modelsUnavailable:"Model settings unavailable",modelsLoadFailed:"Could not load model settings",catalogCached:"Refresh failed. Using the previous model catalog.",catalogPartial:"Model catalog partly updated. Failed sources are using cached data.",catalogUnchanged:"Model catalog is already up to date.",catalogUpdated:"Model catalog updated.",catalogRefreshFailed:"Could not refresh the model catalog",modelsNoChanges:"There are no model configuration changes to save.",removeInvalidPresetsTitle:"Remove invalid common combinations?",removeInvalidPresets_one:"{{count}} common combination refers to a removed model. Saving will remove this combination.",removeInvalidPresets_other:"{{count}} common combinations refer to removed models. Saving will remove them.",removeAndSave:"Remove and save",replaceProjectDefaultsTitle:"Update project default models",replaceProjectDefaultsDescription:"The following project defaults will be updated or cleared. Confirm to save all changes together.",clearProjectDefault:"Clear project default",confirmAndSaveModels:"Confirm and save",modelSaved:"Model configuration saved.",modelSaveFailed:"Could not save the model configuration",catalogUpdatedAt:"Reference catalog updated at {{time}}",catalogUnavailable:"Reference catalog unavailable",refreshingCatalog:"Refreshing…",refreshCatalog:"Refresh model catalog",savingModels:"Saving…",saveModels:"Save model configuration",thinkingOff:"Off",thinkingMinimal:"Minimal",thinkingLow:"Low",thinkingMedium:"Medium",thinkingHigh:"High",thinkingXhigh:"Very high",thinkingMax:"Maximum",priceMissing:"Price unavailable",priceInput:"Input {{price}}",priceOutput:"Output {{price}}",priceCacheRead:"Cached {{price}}",priceCacheWrite:"Cache write {{price}}",perMillionTokens:" / million tokens",catalogSearchFailed:"Could not search the model catalog",catalogSelected:"Selected {{provider}} / {{model}}.",modelId:"Model ID",modelIdSearch:"Search and select by model ID",chooseModel:"Choose or change model",matchingCatalog:"Finding models…",noCatalogMatches:"No matching models",officialRecommended:"Official recommendation",sameConfiguration:"{{count}} identical sources",contextAndOutput:"{{context}} context \xb7 {{output}} output",contextAndOutputTitle:"Context {{context}} tokens, maximum output {{output}} tokens",moreConfigurations:"Show {{count}} more configurations",modelName:"Display name",contextLength:"Context window",maximumOutput:"Maximum output per request",capabilities:"Capabilities",textInput:"Text input",imageInput:"Image input",supportsThinking:"Supports reasoning",thinkingMapping:"Thinking levels and provider mapping",providerMapping:"{{level}} provider mapping",noMapping:"No mapping",price:"Pricing",inputPrice:"Input price / million tokens",outputPrice:"Output price / million tokens",cacheReadPrice:"Cache read price",cacheWritePrice:"Cache write price",clearPrice:"Clear pricing",advancedCompatibility:"Advanced settings",apiOverride:"Model API override",baseUrlOverride:"Model Base URL override",inheritProvider:"Leave blank to inherit the provider",developerRole:"Supports Developer Role",replayReasoning:"Replay reasoning_content",modelHeaders:"Model headers",headerPlaceholder:"Header-Name: value, one per line",useDefault:"Use default",yes:"Yes",no:"No",providerNew:"Add service connection",accountCustomApi:"Custom API",accountLogin:"Sign in",accountRelogin:"Sign in again",accountLogout:"Sign out",accountLogoutTitle:"Sign out of this service?",accountLogoutDescription:"Sign out of “{{name}}”? Its account models will be unavailable until you sign in again. Your model selections and drafts will be kept; this will not switch the current session.",accountLogoutFailed:"Could not sign out",accountCustomSettings:"Custom API settings",accountCustomModel:"Custom model",accountChooseProvider:"Choose a service",accountLoadingProviders:"Loading services…",accountNoProviders:"No sign-in services available",accountChooseOption:"Choose an option",accountContinue:"Continue",accountWaiting:"Waiting for authorization…",accountLoggedIn:"Signed in",accountLoggedOut:"Not signed in",accountLoginFailed:"Could not sign in",accountRefreshFailed:"Signed in, but could not refresh the model list",accountDisconnected:"Connection lost. This sign-in was cancelled. Reconnect, then start again.",accountConnectionNotReady:"Connection is not ready. Try again after it reconnects.",accountDeviceCode:"Authorization code",accountCopyCode:"Copy code",accountOpenLink:"Open authorization page",accountCopyLink:"Copy link",accountInvalidLink:"This authorization link is not a valid web address.",accountCopied:"Copied",accountCopyFailed:"Could not copy",accountModelSearch:"Search model name or ID",accountModelAdded:"Added",accountNoModels:"No matching models",accountAddLater:"Add later",accountAddSelected:"Add {{count}} selected",accountModelUnavailable:"This model is no longer available in the service catalog. You can remove it from your configuration.",accountModelUnavailableShort:"Unavailable",accountSubscription:"Subscription",accountReferencePrice:"Reference pricing",accountAdjustParameters:"Adjust parameters",accountRestoreDefaults:"Restore defaults",accountRemove:"Remove model",accountRemoveTitle:"Remove model?",accountRemoveDescription:"Remove “{{name}}” from your model list? This takes effect after saving and does not sign you out.",providerUnnamed:"Service ID required",providerList:"Model services",providerSummary:"{{providers}} providers \xb7 {{models}} models",providerConfig:"Provider configuration",providerEmpty:"No services configured",providerModels:"{{count}} custom models",providerDelete:"Remove service",providerDeleteTitle:"Remove service?",providerDeleteDescription:"Remove “{{name}}” and its {{count}} models? The change takes effect after you save.",modelDeleteTitle:"Remove model?",modelDeleteDescription:"Remove “{{name}}”? The change takes effect after you save.",providerIdExample:"e.g. my-provider",providerApiType:"Default API",providerAdvanced:"Advanced connection settings",providerAuthHeader:"Add Authorization header automatically",providerHeaders:"Service headers",modelsHeading:"Models",modelAdd:"Add model",modelEmpty:"No models yet",modelUnnamed:"Unnamed model",modelIdPending:"Model ID required",modelDelete:"Remove model",modelDeleteNamed:"Remove model {{name}}",presetDescription:"Choose a model and reasoning level quickly in chat. Drag or use the buttons to reorder.",presetDrag:"Drag to reorder",presetMoveUp:"Move combination up",presetMoveDown:"Move combination down",presetModel:"Combination model",presetModelNew:"Model for new combination",modelSearch:"Search model name, service ID or model ID",thinkingLevel:"Thinking level",presetThinking:"Combination thinking level",presetThinkingNew:"Thinking level for new combination",presetColor:"Color",presetColorLabel:"Combination color",presetColorNone:"No color",presetColorCustom:"Custom color",presetColorBlue:"Blue",presetColorCyan:"Cyan",presetColorGreen:"Green",presetColorAmber:"Amber",presetColorOrange:"Orange",presetColorRed:"Red",presetColorPink:"Pink",presetColorPurple:"Purple",presetDelete:"Remove combination",presetAdd:"Add",presetEmpty:"No common combinations yet",projectSessionCount_one:"{{count}} session",projectSessionCount_other:"{{count}} sessions",projectDirectoriesFailed:"Could not load project directories",projectDefaultFailed:"Could not load project model defaults",projectDefaultSaved:"Project model default saved.",projectDefaultGlobalSaved:"Project is following the current global Pi model.",projectDefaultSaveFailed:"Could not save the project model default",projectLoading:"Loading project settings…",projectDescription:"Project settings take precedence over Pi’s current global selection. Changing a model in chat will not change this setting.",projectEmpty:"No project directories with Pi sessions found",project:"Project",projectSearch:"Search project paths",projectList:"Project list",backProjectList:"Back to project list",selectProjectToConfigure:"Select a project to configure its default model",projectDefaultSource:"Project model default source",projectFollowGlobal:"Follow current global Pi selection",projectFollowGlobalDescription:"Do not set a separate default model for this project.",projectFixed:"Set a project default",projectFixedDescription:"Select a model and reasoning level for this project.",projectDefaultModel:"Default model",projectDefaultThinking:"Project default thinking level",fromPreset:"Choose from common combinations",saveProjectDefault:"Save project default"},skills:g.P.en,taskCenter:h.U.en,workbench:i.R.en,workbenchPicker:{sessionFallback:"Session {{id}}",newSession:"New session",scopeTitle:"Title",scopeUser:"User messages",scopeAssistant:"AI replies",scopeUserMatches:"User messages {{count}}",scopeAssistantMatches:"AI replies {{count}}",loadUserFailed:"Could not load user messages",ignoredRestoreTitle:"Restore ignored folder",browseOtherTitle:"Choose a project folder",replaceTitle:"Replace work session",createTitle:"Create work session",ignoredRestoreDescription:"This project will appear again in regular folder lists.",browseDescription:"Browse the filesystem of the server running Pi Desk to choose a project directory.",replaceDescription:"Replace: {{project}} \xb7 {{session}}",replaceMissingDescription:"Replacement target is no longer available. Close this dialog and select a work session again.",createDescription:"Choose an existing Pi project or browse server folders to create a work session.",searchHistory:"Search past sessions",searchBrowser:"Search folders in this location",searchIgnored:"Search ignored folders",searchProjects:"Search project names or full paths",currentProject:"Current project: {{path}}",ignoredCount_one:"{{count}} ignored folder",ignoredCount_other:"{{count}} ignored folders",rootChoose:"Choose a drive or root directory",root:"Drives or root directories",replaceChooseFirst:"Choose a project to see its available past sessions.",regularExcludesIgnored:"Ignored projects are excluded from regular folder lists.",loadingHistory:"Loading past sessions…",loadingIgnored:"Loading ignored folders…",loadingBrowser:"Browsing server folders…",loadingProjects:"Loading Pi projects…",backFolders:"Back to folder list",pastePath:"Paste a full folder path and press Enter",fullPath:"Full folder path",openTyped:"Open entered folder",enterAbsolute:"Enter an absolute folder path",open:"Open",absoluteExample:"Enter an absolute folder path, e.g. C:\\projects\\example.",pasteHint:"Paste and open a full path; Windows “Copy as path” is supported.",searchScopes:"Search in",replaceTargetMissing:"Replacement target is no longer available.",noHistoryMatches:"No matching past sessions",noReplaceHistory:"This project has no available past sessions",sessionFound_one:"{{count}} session found",sessionFound_other:"{{count}} sessions found",sessionMessages:"{{users}}/{{total}} messages \xb7 {{time}}",replacing:"Replacing",current:"Current",alreadyUsed:"In use",targetUnavailable:"Target unavailable",replace:"Replace",currentBound:"This past session is bound to the current work session",historyUsed:"This past session is in use by another work session",replaceTargetUnavailable:"Replacement target is unavailable",replaceWith:"Replace with {{name}}",hideUserMessages:"Hide user messages",viewMatching_one:"View {{count}} match",viewMatching_other:"View all {{count}} matches",viewUserMessages_one:"View {{count}} user message",viewUserMessages_other:"View {{count}} user messages",viewMatch:"View {{label}}",matchingUserCount:"{{count}} matching user messages",userCount:"{{count}} user messages",viewAll:"View all",noUserMessages:"No user messages to display",noText:"(no text)",loadMore:"Load more",browserEmpty:"No subfolders here. You can select this folder.",rootsEmpty:"No drives or root directories to browse",subfoldersNoMatches:"No matching subfolders",ignoredEmpty:"No ignored Pi projects",projectsEmpty:"No Pi projects available",projectNoMatches:"No matching Pi projects",restoreFolder:"Restore folder {{name}}",restoreTip:"Restore to regular folder lists",restore:"Restore",directorySessions_one:"{{count}} session \xb7 {{time}}",directorySessions_other:"{{count}} sessions \xb7 {{time}}",directoryCount_one:"{{count}} session",directoryCount_other:"{{count}} sessions",creating:"Creating",ignoreFolder:"Ignore folder {{name}}",ignoreTip:"Hide from regular folder lists",ignoredFolders:"Ignored folders",chooseOther:"Choose another folder",selectCurrent:"Select this folder",parentDirectory:"Back to parent folder",backRoots:"Back to drives or roots",refreshList:"Refresh this list",filterDefault:"Default",filterNoTools:"Hide tools",filterUserOnly:"User messages",filterLabeled:"Labeled",filterAll:"All",kindUser:"User",kindTool:"Tool",kindMessage:"Message",kindCompaction:"Summary",kindBranchSummary:"Branch summary",kindCustom:"Record",kindModel:"Model",kindThinking:"Thinking",kindSession:"Session",kindLabel:"Label",treeIntent:"Switch the current session branch",forkIntent:"Start a session from a user message",cloneIntent:"Clone the current session",runningTitle:"The current session is running",runningStop:"To continue “{{action}}”, the current response will stop. Saved messages remain available.",runningWait:"To continue “{{action}}”, wait for the running background task to finish.",confirming:"Working…",confirmContinue:"Confirm and continue",back:"Back",confirmHint:"Enter to confirm \xb7 Esc to go back",branchPicker:"Session branch picker",branchTitle:"Session branches",closeBranchPicker:"Close session branch picker",branchSearch:"Search session branches",branchSearchPlaceholder:"Search messages, tools or labels",branchFilter:"Filter session tree, current: {{filter}}",loadingEntry:"Loading full content…",entryEmpty:"No text available for this entry",entryTruncated:"Long content has been truncated.",selectEntry:"Select an entry to view its full content",branchWorking:"Stopping or waiting for the running task…",branchLoading:"Loading session tree…",branchEmpty:"No entries to select yet",branchNoMatches:"No matching session entries",branchTree:"Session tree",collapseBranch:"Collapse branch",expandBranch:"Expand branch",noPreview:"Nothing to preview",switchToMessage:"Switch to {{kind}} message",switch:"Switch",forkFromUser:"Start a session from this user message",branchShortcuts:"↑↓ Select \xb7 Tab Filter \xb7 ←→ Branch \xb7 Enter Switch \xb7 Esc Close"},conversation:j.W.en,projectFiles:k.C.en},"zh-CN":{...l.n["zh-CN"],errors:{invalidJson:"请求 JSON 格式无效",invalidClient:"客户端标识无效",invalidInput:"请求参数无效",sourceExpired:"聊天 Source 已过期",sessionMissing:"工作会话不存在",projectChanged:"工作会话项目已变化",projectMissing:"项目目录不存在",fileMissing:"文件或目录不存在",notDirectory:"目标不是目录",notFile:"目标不是文件",outsideProject:"目标不在当前项目目录内",textTooLarge:"文本文件超过 5MB,暂不支持在线预览",imageTooLarge:"图片过大,暂不支持在线预览",previewUnsupported:"当前文件类型不支持在线预览",fileReadFailed:"读取项目文件失败",projectSearchPatternInvalid:"搜索表达式无效或包含不支持的语法",projectSearchUnavailable:"项目搜索引擎不可用,请重新安装完整运行依赖",projectSearchTimeout:"项目搜索超时,请缩小搜索范围后重试",projectSearchReadFailed:"无法读取项目搜索文件或结果",projectSearchCancelled:"项目搜索已取消",revealFailed:"打开所在文件夹失败",repositoryMissing:"Git 仓库不存在",gitOutsideProject:"Git 目标不在当前项目目录内",gitReadFailed:"读取 Git 仓库失败",skillsInputInvalid:"Skills 请求参数无效",skillsContentTooLarge:"提交文本超过大小限制",skillsProjectChanged:"此项目已不在当前工作区,请重新选择项目",skillMissing:"Skill 或文件已不存在",skillsPermissionDenied:"没有权限读写此 Skill 文件",skillsFileFailed:"Skills 文件操作失败,请重试",chatSubscribeInvalid:"聊天订阅参数无效",chatSubscribeExpired:"聊天订阅绑定已过期",chatSubscribeFailed:"聊天订阅初始化失败",chatSendInvalid:"聊天发送参数无效",chatSendTooLarge:"聊天发送内容超过 31MB",chatInterruptInvalid:"聊天打断参数无效",chatCompactInvalid:"上下文压缩参数无效",chatReloadInvalid:"Pi 配置重载参数无效",chatRestoreInvalid:"恢复队列参数无效",chatRestoreTooLarge:"恢复内容超过传输上限",chatModelInvalid:"模型设置参数无效",chatModeInvalid:"能力模式参数无效",chatSourceBusy:"工作会话正在替换或切换分支",socketUnknownPath:"未知 WebSocket 路径",sessionsNotReady:"工作会话尚未初始化",sessionsInitializing:"工作会话正在初始化",sessionsInitializeInvalid:"工作会话初始化参数无效",sessionsInitializeFailed:"工作会话初始化失败",completionAckInvalid:"工作会话完成确认参数无效",completionAckFailed:"确认工作会话完成状态失败",capabilityFailed:"能力模式请求失败",capabilityRuleInvalid:"请检查模式规则",chatContextJsonInvalid:"系统上下文请求 JSON 格式无效",chatContextInvalid:"系统上下文请求参数无效",chatContextBusy:"当前会话正在运行,暂时无法查看系统上下文",chatContextFailed:"读取系统上下文失败",chatMessageInvalid:"消息详情参数无效",chatMessageMissing:"聊天消息不存在",chatMessageFailed:"查询聊天消息详情失败",chatImageInvalid:"聊天图片参数无效",chatImageMissing:"聊天图片不存在",chatImageFailed:"查询聊天图片失败",modelSettingsInvalid:"模型配置格式无效",modelCatalogInvalid:"模型目录参数无效",modelCatalogUnavailable:"模型参考目录暂不可用",modelSaveFailed:"保存模型配置失败",modelSettingsGetInvalid:"模型配置参数无效",modelSettingsGetFailed:"读取模型配置失败",projectDefaultInputInvalid:"项目目录参数无效",projectDefaultGetFailed:"读取项目默认模型失败",projectDefaultSaveInvalid:"项目默认模型格式无效",projectDefaultSaveFailed:"保存项目默认模型失败",modelsListFailed:"查询模型目录失败",directoryBrowseInvalid:"目录浏览参数无效",directoryMissing:"目录不存在或不是目录",directoryReadDenied:"无法读取目录",directoryBrowseFailed:"浏览服务端目录失败",workSessionCreateInvalid:"cwd 或 sessionId 无效",workSessionDirectoryMissing:"项目目录不存在或不是目录",historySessionMissing:"指定目录中不存在 Pi 会话",historySessionOccupied:"Pi 会话已经关联到其他工作会话",workSessionCreateFailed:"创建工作会话失败",workSessionReplaceInvalid:"替换会话参数无效",workSessionReplaceOccupied:"Pi 会话已绑定到其他工作会话",workSessionReplaceFailed:"替换 Pi 会话失败",workSessionRenameInvalid:"会话标题参数无效",workSessionRenameChanged:"工作会话已切换,请重新打开标题编辑",workSessionRenameFailed:"修改会话标题失败",workSessionDeleteInvalid:"workId 格式无效",workSessionDeleteFailed:"删除工作会话失败",workSessionSortInvalid:"workIds 或 pinnedCount 格式无效",workSessionOrderChanged:"工作会话列表已变化,请刷新后重试",workSessionSortFailed:"更新工作会话排列失败",sessionTreeInvalid:"会话树查询参数无效",sessionTreeChanged:"工作会话已切换,请重新打开会话树",sessionTreeFailed:"读取会话树失败",sessionTreeEntryInvalid:"会话树节点参数无效",sessionTreeEntryMissing:"会话树节点不存在或已失效",sessionTreeEntryFailed:"读取会话树节点详情失败",branchInputInvalid:"分支操作参数无效",branchEntryMissing:"分支节点不存在或已失效",branchForkUserOnly:"只有用户消息可以 Fork",branchCloneEmpty:"当前会话还没有可克隆的消息",branchFailed:"执行分支操作失败",taskDetailInvalid:"任务详情参数无效",taskSourceChanged:"工作会话来源已变化",taskMissing:"任务不存在",taskDetailUnsupported:"任务不支持会话详情",taskMessageMissing:"任务消息不存在",taskMessageNoDetail:"任务消息没有详情",taskConversationUnavailable:"任务会话暂不可用",taskMessageFailed:"查询任务消息详情失败",taskImageMissing:"任务图片不存在",taskImageFailed:"查询任务图片失败",refreshInvalid:"forceRefresh 格式无效",piDirectoriesFailed:"查询 Pi 目录失败",ignoredDirectoriesFailed:"查询忽略目录失败",directoryIgnoreInvalid:"忽略目录参数无效",directoryIgnoreFailed:"更新忽略目录失败",historyQueryInvalid:"历史会话查询参数无效",historyQueryFailed:"查询 Pi 历史会话失败",userMessagesInvalid:"用户消息参数无效",piSessionMissing:"Pi 会话不存在",userMessagesFailed:"查询历史用户消息失败",projectJsonInvalid:"项目请求 JSON 格式无效",projectInputInvalid:"项目请求参数无效",projectCwdAbsolute:"项目目录必须是绝对路径",projectOperationFailed:"项目操作失败",capabilityGetInvalid:"能力模式查询参数无效",capabilityGetFailed:"读取能力模式失败",capabilityReplaceInvalid:"能力模式格式无效",capabilityReplaceFailed:"保存能力模式失败",pluginResourceMissing:"插件资源不存在",pluginResourceReadFailed:"读取插件资源失败",hostResourceMissing:"Host 公共插件资源不存在",hostRuntimeUnavailable:"Host 公共插件 Runtime 尚未构建",hostResourceReadFailed:"读取 Host 公共插件资源失败",gitAddJsonInvalid:"新建 Git 分支请求 JSON 格式无效",gitAddInputInvalid:"新建 Git 分支请求参数无效",gitAddFailed:"新建 Git 分支失败",gitSwitchJsonInvalid:"Git 分支切换请求 JSON 格式无效",gitSwitchInputInvalid:"Git 分支切换请求参数无效",gitSwitchFailed:"切换 Git 分支失败",gitReadOperationFailed:"读取 Git 失败",pluginNpmRootUnavailable:"Pi Package npm 根不可用:{{detail}}",pluginNpmRootMissingDeclarations:"Pi Package 配置与 npm 根不一致(缺少声明:{{declarations}})",pluginNpmRootMissingFolders:"Pi Package 配置与 npm 根不一致(缺少目录:{{folders}})",pluginNpmRootMissingBoth:"Pi Package 配置与 npm 根不一致(缺少声明:{{declarations}};缺少目录:{{folders}})",pluginReloadBlocked:"工作会话 {{workId}} 阻止插件重载:{{reason}}",pluginRuntimeBusy:"插件运行时仍有调用正在执行",pluginRestartPending:"已有插件操作需要重启完成",pluginRestartUnavailable:"当前启动方式不支持自动重启 Pi Desk",pluginNotFound:"插件不存在:{{source}}",pluginSourceInvalid:"插件来源无效"},auth:{title:"登录 Pi Desk",subtitle:"继续你的工作会话",protection:"登录保护",enabled:"已启用",disabled:"未启用",publicAccess:"任何能够访问此服务的人都可以进入工作台。",changePassword:"修改密码",setPassword:"设置密码",newPassword:"新密码",passwordHint:"12–64 个字符,至少包含大写字母、小写字母、数字、符号中的三类;不能有首尾空白、换行或不可见控制字符。",generatePassword:"生成密码",generatePasswordHint:"随机生成 16 位密码",generatePasswordFailed:"生成密码失败,请重试。",saveEffect:"请妥善保存密码。保存后,所有设备都需要重新登录。",enable:"启用登录保护",saveAndSignIn:"保存并重新登录",saving:"正在保存…",logout:"退出登录",signingOut:"正在退出…",logoutFailed:"退出登录失败,请稍后重试。",logoutInvalid:"退出登录参数无效。",logoutCrossOriginDenied:"不允许跨站退出登录。",disable:"关闭保护",disableTitle:"关闭登录保护?",disableDescription:"关闭后,任何能够访问此服务的人都可以直接进入工作台。是否继续?",recovery:"忘记密码?",recoveryDescription:"在运行服务的设备上删除下面的文件,然后刷新页面,即可恢复访问。",settingsFailed:"登录保护设置处理失败。",settingsInvalid:"密码不符合要求,请按输入框下方的规则调整。",configUnavailable:"登录保护配置无法读取,请修复配置或删除 auth.json 后重新设置。",crossOriginDenied:"不允许跨站修改登录保护。",password:"密码",submit:"登录",submitting:"正在登录",loginFailed:"登录失败",invalidResponse:"登录服务响应无效",invalidCredentials:"登录失败,请检查登录信息后重试。",invalidInput:"登录失败,请检查登录信息后重试。",unavailable:"登录暂不可用,请稍后重试。",tooManyAttempts:"登录尝试过多,请稍后重试。",loginAlertTitle:"登录异常提醒",loginAlertDescription:"登录已连续失败超过 5 次,请确认是否为本人操作。",invalidClient:"客户端标识无效"},capabilityModes:{saved:"能力模式已保存",saving:"保存中…",saveModes:"保存模式",settings:"能力模式设置",editMode:"编辑模式",selectMode:"选择要编辑的能力模式",unnamedMode:"未命名模式",allDefault:"全开 \xb7 默认",addMode:"新增模式",copyMode:"复制当前模式",copyTitle:"复制模式",deleteMode:"删除当前模式",deleteTitle:"删除模式",refreshCatalog:"刷新能力选项",retryRead:"重试读取",loadingCatalog:"正在读取能力选项…",allEnabled:"全开",allDescription:"使用全部已加载能力。",unsaved:"有未保存的修改",allIsDefault:"全开为默认模式",policyAll:"全部开启",policyAllow:"只开这些",policyDeny:"关闭这些",policyNone:"全部关闭",ruleEditor:"{{name}}规则编辑",ruleMode:"{{name}}开放方式",exclusions:"排除项",ruleSearch:"搜索或输入能力规则",ruleSearchPlaceholder:"搜索名称或输入 * 规则",clearSearch:"清空规则搜索",selectedOnly:"仅看已选",selectedShort:"已选",allowRules:"允许规则",excludeRules:"排除规则",selectedCount_one:"已选 {{count}} 条",selectedCount_other:"已选 {{count}} 条",selectVisible:"全选可见项",clearSelected:"清空已选",addRule:"添加规则",allowValue:"允许 {{name}}",excludeValue:"排除 {{name}}",pattern:"匹配规则",noMatches:"没有匹配项,可直接添加上面的规则。",noSelection:"尚未选择规则。",enterPattern:"输入名称或通配规则即可添加。",moreRules:"显示更多 \xb7 剩余 {{count}} 项",deleteConfirm:"删除能力模式?",saveConfirm:"保存模式修改?",deleteDescription:"删除“{{name}}”并保存后,使用此模式的会话将切回全开。",unsavedDescription:"能力模式的修改尚未保存。",cancel:"取消",delete:"删除模式",discard:"放弃修改",saveContinue:"保存并继续",modeName:"模式名称",category:"能力分类",groupTools:"工具",modeSwitching:"切换中…",modePicker:"能力模式:{{name}}",catalogFailed:"读取能力选项失败",saveFailed:"保存能力模式失败",copySuffix:"{{name}} 副本",newMode:"新模式"},pluginManagement:{actionAdd:"安装插件",actionUpdate:"更新插件",actionDelete:"卸载插件",actionReload:"重启 Pi Desk",restartNormal:"重启并启用插件",restartNormalDescription:"重启 Pi Desk 并重新加载外部插件,完成后恢复所有连接。",applyChanges:"加载变更",applyDescription:"更新插件服务和界面;已有会话扩展保持不变,手动重载 PI 后更新。",reloadOne:"重新加载",reloadSource:"重新加载 {{name}}",basicModeNotice:"基础模式已关闭插件加载与盘点。可以继续聊天修复文件,再选择“重启并启用插件”。",localExtension:"本地源码",localSourceHelp:"在源目录管理此入口",discovered:"已启用",disabledByPi:"已停用",active:"已启用",notLoaded:"未加载",phase_queued:"排队中",phase_checking:"检查中",phase_applying:"应用中",phase_waiting:"等待生效",phase_failed:"操作失败",updateCheckFailed:"检查插件更新失败",actionFailed:"{{action}}失败",retrying:"重试 {{name}}",retryFailed:"重试插件界面失败",refreshingEntries:"刷新插件界面",refreshEntriesFailed:"刷新插件界面失败",detailFailed:"读取插件详情失败",title:"插件",description:"管理插件包与本地扩展。",noPluginDescription:"暂无说明",checkUpdates:"检查更新",checkingUpdates:"检查中…",restartApply:"重启并完成",installPlugin:"安装插件",source:"插件来源",sourcePlaceholder:"npm Package、Git 地址或本地目录",install:"安装",installVersion:"安装此版本",installIncompatible:"此插件版本不兼容当前 Pi Desk,无法安装。",pendingRestart:"插件变化待重启生效",retry:"重试",confirmAction:"确认{{action}}?",restartDescription:"重启 Pi Desk 以应用待处理变更,完成后自动恢复连接。",cancel:"取消",installed:"已安装插件",loading:"正在读取插件",updateAvailable:"可更新",abnormal:"异常",capabilityCategories:"插件能力类别",update:"更新",details:"详情",viewDetails:"查看插件详情:{{name}}",remove:"卸载",empty:"暂无插件",viewLoading:"正在加载插件界面…",viewFailed:"插件界面加载失败",closeApplication:"关闭插件应用",closeNamedApplication:"关闭 {{name}}",eventAgentStart:"任务开始前",eventAgentStartDescription:"具备追加或替换系统提示词、注入会话消息的能力。",eventContext:"模型调用前",eventContextDescription:"具备替换本次发送给模型的会话消息的能力。",eventInput:"用户输入阶段",eventInputDescription:"具备改写、拦截或接管用户输入的能力。",eventProvider:"Provider 请求前",eventProviderDescription:"具备替换最终 Provider Payload 的能力。",eventToolCall:"工具调用前",eventToolCallDescription:"具备修改工具参数或阻止工具调用的能力。",eventToolResult:"工具结果后",eventToolResultDescription:"具备修改进入后续模型上下文的工具结果的能力。",eventMessageEnd:"消息完成后",eventMessageEndDescription:"具备替换最终消息并影响后续上下文的能力。",eventBeforeCompact:"上下文压缩前",eventBeforeCompactDescription:"具备取消压缩或替换压缩摘要的能力。",contributionApplication:"应用入口",contributionComposer:"输入面板",contributionSettings:"设置页",contributionMessage:"消息视图",contributionSidebar:"会话侧栏",contributionWidget:"输入区挂件",contributionSessionHeader:"会话标题项",tagTools:"工具 {{count}}",tagFixed:"固定提示 {{count}}",tagDynamic:"动态影响 {{count}}",tagOverride:"替换内置 {{count}}",tagManual:"手动提示 {{count}}",tagInteraction:"交互 {{count}}",unknown:"未知",stateActive:"启用",stateInactive:"未启用",stateShadowed:"被覆盖",copied:"已复制",copy:"复制",copyNamed:"复制{{name}}",dynamicTitle:"动态上下文能力",dynamicDescription:"以下内容表示插件注册了对应运行时钩子,不代表每次调用都实际修改了提示词或消息。",arguments:"调用参数",none:"无",required:"必填",optional:"可选",noArguments:"该 Tool 不需要参数。",rawSchema:"原始 Schema",toolCapabilities:"工具能力",toolDescription:"每个 Tool 同时展示能力说明、调用参数及其声明的系统提示词。",overridesBuiltin:"替换 Pi 内置工具",noDescription:"未提供能力说明",systemPrompts:"系统提示词",inactivePrompt:"当前 Tool 未启用,不会进入系统提示词",truncated:"正文超过 64KB,当前显示前 64KB。",resourcesTitle:"Skill 与提示模板",resourcesDescription:"可由模型调用的 Skill 只会常驻名称、描述和位置,完整正文按需读取;Prompt 模板仅在用户手动调用后展开。",skillModelVisible:"描述进入系统提示词",manualOnly:"仅手动调用",skillMetadata:"系统提示词中的 Skill 元数据",viewSkillContent:"查看 Skill 正文",viewPromptContent:"查看 Prompt 正文",otherCapabilities:"其他能力",messageDeclarations:"消息声明:",backToList:"返回插件列表",incompleteCapabilities:"能力清单读取不完整:{{error}}",metricToolDefinitions:"工具定义",metricFixed:"当前固定提示",metricDynamic:"动态影响钩子",metricManual:"手动提示资源",loadingFullDetails:"正在读取完整能力详情",installedTab:"已安装",searchPlugins:"搜索插件",directInstall:"手动安装",advancedOptions:"高级选项",capabilityDetails:"功能与运行信息",newVersion:"新版本 v{{version}}",removeNamed:"卸载 {{name}}",updateAll:"全部更新({{count}})",batchManage:"批量管理",finishSelection:"完成",selectAll:"全选",filterStatus:"插件状态",statusFilter_all:"全部状态",statusFilter_updates:"有更新",statusFilter_disabled:"已停用",statusFilter_failed:"异常",batchWaiting:"尚未提交,请完成等待中的操作后重试。",batchInstall:"批量安装",batchSourcePlaceholder:"每行一个 npm 包名;单项也可填写 Git 地址或本地目录",batchNpmOnly:"批量安装时请每行填写一个 npm 包名。",batchLimit:"每次批量操作最多选择 32 个插件。",batchFailed:"提交插件变更失败",sourceBusy:"此插件正在处理其他操作,完成后可重试。",selectFiltered:"全选当前结果",selectPlugin:"选择 {{name}}",selectedCount:"已选 {{count}} 项",clearSelection:"清空选择",checkSelected:"批量检查",updateSelected:"更新所选",removeSelected:"卸载所选",setChannel:"设置渠道",installChannel:"版本偏好",defaultChannel:"默认",automaticVersion:"默认版本",allChannels:"全部渠道",filterChannel:"按渠道筛选",channelLatest:"稳定版",channelDev:"开发版",followingChannel:"跟随 {{tag}}",targetVersion:"目标版本 {{version}}",itemCheckFailed:"查询更新失败:{{error}}",filterInstalled:"搜索已安装插件",noMatches:"没有匹配的插件",enabled:"已启用",disabled:"已停用",enable:"启用",disable:"停用",togglePlugin:"启用或停用 {{name}}",submitting:"正在提交…",installing:"安装中…",alreadyInstalled:"已安装",retryView:"重试插件界面",more:"更多",downloadSource:"下载源",installDownloadSource:"本次安装下载源",useDefaultSource:"使用已保存的默认设置",download_local:"不使用源(本机配置)",download_auto:"自动",download_domestic:"国内加速",download_official:"官方",download_custom:"自定义",registryUrl:"仓库地址",sourceDetails:"查看来源地址",recommending:"正在推荐来源…",saving:"正在保存…",save:"保存",settingsFailed:"保存或读取下载设置失败",invalidRegistry:"请输入有效的 HTTP 或 HTTPS 仓库地址,不包含账号、查询参数或片段。",searchPlaceholder:"搜索插件名称或简介",searchSource:"搜索仓库",publicNpm:"npm 公开仓库",customSearchSource:"自定义仓库",searchRegistryUrl:"搜索仓库地址",pluginKind:"插件类型",kind_all:"全部类型",kind_desk:"Pi Desk",kind_pi:"Pi",kind_unknown:"类型待确认",official:"官方",publisher:"发布者",unknownPublisher:"未提供发布者",searchFailed:"搜索插件失败",searching:"正在搜索…",noSearchResults:"没有匹配的插件,可以换个关键词。",loadMore:"加载更多",loadingPackage:"正在读取包详情…",readPackage:"读取包详情",version:"版本",packageName:"插件包",readme:"使用说明",noReadme:"未提供使用说明",readmeLanguage:"语言",defaultLanguage:"自动 / 原文",compatible:"兼容当前版本",incompatible:"不兼容当前版本",compatibilityUnknown:"兼容性待确认",homepage:"官网",repository:"源码",removeDescription:"卸载此插件,保留已保存的配置和数据。",thirdPartyDescription:"此插件能够在你的电脑上执行代码。请确认信任其发布者和来源后再安装。",confirmChange:"应用此插件变更。",fromSource:"以来源提供的版本为准",pluginDetails:"插件详情",pluginRemoved:"此插件已不在安装列表中。",close:"关闭"},projectHistory:f.p["zh-CN"],settings:{title:"设置",general:"通用设置",workCapabilities:"工作能力",application:"应用",category:"设置分类",appearance:"外观",region:"语言与地区",habits:"习惯",loginProtection:"登录",models:"模型",mcpSettings:"MCP",capabilityModes:"能力模式",skills:"Skills",plugins:"插件",pluginSettings:"插件设置",about:"关于",language:"语言",timeZone:"时区",currentLanguage:"当前语言:{{locale}}",currentTimeZone:"当前时区:{{timeZone}}",timeExample:"当前时间",searchTimeZones:"搜索时区",reloadLanguage:"重新加载以使用该语言",version:"当前版本",versionUpdated:"版本更新时间",webDescription:"Pi 的 Web 端",discardModelTitle:"模型配置尚未保存",discardModelDescription:"要丢弃尚未保存的模型配置吗?",discardModelConfirm:"丢弃修改",theme:"界面主题",themeLight:"浅色",themeDark:"深色",displaySize:"显示大小",sizeCompact:"紧凑",sizeStandard:"标准",sizeLarge:"大号",displayPreview:"界面预览",displayPreviewContent:'## 项目进展\n\n今天整理了工作计划,接下来继续完成待办事项。\n\n```ts\nconst status = "ready"\n```',browserOnly:"设置仅在当前浏览器生效。",newSessionBehavior:"新建会话后的行为",behaviorNone:"无操作",behaviorNoneDescription:"创建后保留当前会话。",behaviorActivate:"切换到新会话",behaviorActivateDescription:"创建后立即进入新会话。",behaviorPin:"自动固定",behaviorPinDescription:"固定新会话,保留当前活跃会话。",desktopOnlyBehavior:"仅桌面端生效;移动端始终进入新会话。",imagePreviewMode:"图片预览方式",imageCompressed:"压缩预览",imageCompressedDescription:"优化大图以减少流量,不修改项目原文件。",imageOriginal:"原图预览",imageOriginalDescription:"保留原始画质,加载大图会消耗更多流量。",imagePreviewApply:"更改后对新加载或主动重新加载的图片生效。",modelProviders:"模型管理",modelPresets:"常用组合",serviceAddress:"服务地址",serviceKey:"访问密钥",serviceId:"服务 ID",serviceIdInvalid:"请填写非空且不重复的服务 ID。",serviceConnection:"服务连接",serviceSettingsNamed:"{{name}}连接设置",currentServiceSettings:"当前服务连接设置",modelAddToService:"在{{name}}添加模型",inheritService:"继承服务设置",inheritServiceValue:"继承服务:{{value}}",applyServiceDraft:"应用到草稿",serviceDraftScope:"供 {{count}} 个模型使用,应用后在主页面保存模型配置。",discardServiceTitle:"连接修改尚未应用",discardServiceDescription:"要丢弃这次连接修改吗?",selectModelToEdit:"选择一个模型进行编辑",backModelList:"返回模型列表",modelIdRequired:"请填写模型 ID。",modelNameRequired:"请填写显示名称。",capacityInvalid:"请输入大于 0 的数值,最多保留三位小数。",priceInvalid:"请输入不小于 0 的数值。",inputAndThinking:"输入与思考",addModelPreset:"加入常用组合",saveBeforePreset:"保存模型后可加入常用组合。",modelDraftPending:"配置有未保存修改",modelDraftClean:"没有未保存的修改",fixModelInputs:"请先修正模型字段,再保存配置",revertModels:"撤销配置修改",modelMoreActions:"模型配置操作",nativeConfig:"Pi 配置",nativeConfigEditor:"Pi 模型配置",nativeConfigScope:"编辑完整 models.json,包括 modelOverrides、inputLimits、promptCache、samplingParams 与阶梯费率。",nativeProtectDraft:"请先保存或撤销表单修改,再打开 Pi 配置。",saveNativeConfig:"保存 Pi 配置",discardNativeTitle:"Pi 配置尚未保存",discardNativeDescription:"要丢弃这次 Pi 配置修改吗?",projectDefault:"项目默认",loadingModels:"加载模型设置…",modelsUnavailable:"模型设置暂不可用",modelsLoadFailed:"模型设置加载失败",catalogCached:"刷新失败,继续使用上次模型目录缓存。",catalogPartial:"模型目录已部分更新,失败来源继续使用缓存。",catalogUnchanged:"模型目录已经是最新。",catalogUpdated:"模型目录已更新。",catalogRefreshFailed:"模型目录刷新失败",modelsNoChanges:"没有需要保存的模型配置。",removeInvalidPresetsTitle:"删除失效的常用组合?",removeInvalidPresets_one:"有 {{count}} 个常用组合引用了已删除模型,保存配置将同时删除这些组合。",removeInvalidPresets_other:"有 {{count}} 个常用组合引用了已删除模型,保存配置将同时删除这些组合。",removeAndSave:"删除并保存",replaceProjectDefaultsTitle:"同步项目默认模型",replaceProjectDefaultsDescription:"以下项目默认将更新或清除,确认后一起保存。",clearProjectDefault:"清除项目默认",confirmAndSaveModels:"确认并保存",modelSaved:"模型配置已保存。",modelSaveFailed:"模型配置保存失败",catalogUpdatedAt:"参考目录更新于 {{time}}",catalogUnavailable:"参考目录尚未可用",refreshingCatalog:"刷新中…",refreshCatalog:"刷新模型目录",savingModels:"保存中…",saveModels:"保存模型配置",thinkingOff:"关闭",thinkingMinimal:"极少",thinkingLow:"低",thinkingMedium:"中",thinkingHigh:"高",thinkingXhigh:"超高",thinkingMax:"最大",priceMissing:"价格未提供",priceInput:"输入 {{price}}",priceOutput:"输出 {{price}}",priceCacheRead:"缓存 {{price}}",priceCacheWrite:"缓存写 {{price}}",perMillionTokens:" / 百万 Token",catalogSearchFailed:"查询模型目录失败",catalogSelected:"已选择 {{provider}} 的 {{model}}。",modelId:"模型 ID",modelIdSearch:"输入模型 ID 搜索并选择",chooseModel:"选择或切换模型",matchingCatalog:"正在匹配模型目录…",noCatalogMatches:"没有匹配的目录模型",officialRecommended:"官方推荐",sameConfiguration:"同配置 \xd7{{count}}",contextAndOutput:"{{context}} 上下文 \xb7 {{output}} 输出",contextAndOutputTitle:"上下文 {{context}} Token,最大输出 {{output}} Token",moreConfigurations:"查看其余 {{count}} 种配置",modelName:"显示名称",contextLength:"上下文容量",maximumOutput:"每次最多输出",capabilities:"能力",textInput:"文本输入",imageInput:"图片输入",supportsThinking:"支持思考",thinkingMapping:"思考等级与服务映射",providerMapping:"{{level}} 服务映射",noMapping:"无需映射",price:"价格",inputPrice:"输入价格 / 百万 Token",outputPrice:"输出价格 / 百万 Token",cacheReadPrice:"缓存读取价格",cacheWritePrice:"缓存写入价格",clearPrice:"清除价格配置",advancedCompatibility:"高级配置",apiOverride:"单独调用方式",baseUrlOverride:"单独服务地址",inheritProvider:"留空继承 Provider",developerRole:"支持 Developer Role",replayReasoning:"回放 reasoning_content",modelHeaders:"模型请求头",headerPlaceholder:"Header-Name: value,每行一个",useDefault:"使用默认",yes:"是",no:"否",providerNew:"添加服务连接",accountCustomApi:"自定义 API",accountLogin:"登录",accountRelogin:"重新登录",accountLogout:"退出登录",accountLogoutTitle:"退出这个服务的登录?",accountLogoutDescription:"退出“{{name}}”后,该账号模型在重新登录前将不可用。保留已收录模型与配置草稿,不切换当前会话。",accountLogoutFailed:"退出登录失败",accountCustomSettings:"自定义 API 设置",accountCustomModel:"自定义模型",accountChooseProvider:"选择服务商",accountLoadingProviders:"加载服务商…",accountNoProviders:"暂无可登录的服务商",accountChooseOption:"请选择",accountContinue:"继续",accountWaiting:"等待授权…",accountLoggedIn:"已登录",accountLoggedOut:"未登录",accountLoginFailed:"登录失败",accountRefreshFailed:"登录成功,但模型列表刷新失败",accountDisconnected:"连接已断开,本次登录已取消。连接恢复后请重新登录。",accountConnectionNotReady:"连接尚未就绪,请在连接恢复后重试。",accountDeviceCode:"授权码",accountCopyCode:"复制授权码",accountOpenLink:"打开授权页面",accountCopyLink:"复制链接",accountInvalidLink:"授权链接不是有效的网页地址。",accountCopied:"已复制",accountCopyFailed:"复制失败",accountModelSearch:"搜索模型名称或 ID",accountModelAdded:"已添加",accountNoModels:"没有匹配的模型",accountAddLater:"稍后添加",accountAddSelected:"添加选中的 {{count}} 个",accountModelUnavailable:"服务目录中已没有这个模型,可以从配置中移除。",accountModelUnavailableShort:"不可用",accountSubscription:"订阅",accountReferencePrice:"参考价格",accountAdjustParameters:"调整参数",accountRestoreDefaults:"恢复默认",accountRemove:"移除模型",accountRemoveTitle:"移除模型?",accountRemoveDescription:"将“{{name}}”从模型列表移除,保存配置后生效,不会退出账号登录。",providerUnnamed:"等待填写服务 ID",providerList:"模型服务",providerSummary:"{{providers}} 个 \xb7 {{models}} 个模型",providerConfig:"Provider 配置",providerEmpty:"还没有配置服务",providerModels:"{{count}} 个自定义模型",providerDelete:"删除服务",providerDeleteTitle:"删除服务?",providerDeleteDescription:"将移除“{{name}}”及其 {{count}} 个模型,保存配置后生效。",modelDeleteTitle:"删除模型?",modelDeleteDescription:"将移除“{{name}}”,保存配置后生效。",providerIdExample:"例如 my",providerApiType:"默认调用方式",providerAdvanced:"高级连接设置",providerAuthHeader:"自动添加 Authorization Header",providerHeaders:"服务请求头",modelsHeading:"模型",modelAdd:"添加模型",modelEmpty:"还没有模型",modelUnnamed:"未命名模型",modelIdPending:"等待填写模型 ID",modelDelete:"删除模型",modelDeleteNamed:"删除模型 {{name}}",presetDescription:"聊天中快速选择的模型与思考等级组合,拖拽或按钮可调整顺序。",presetDrag:"拖拽排序",presetMoveUp:"上移常用组合",presetMoveDown:"下移常用组合",presetModel:"常用模型",presetModelNew:"新增常用模型",modelSearch:"搜索模型名称、服务 ID 或模型 ID",thinkingLevel:"思考等级",presetThinking:"常用思考等级",presetThinkingNew:"新增组合的思考等级",presetColor:"颜色",presetColorLabel:"常用组合颜色",presetColorNone:"无颜色",presetColorCustom:"自定义颜色",presetColorBlue:"蓝色",presetColorCyan:"青色",presetColorGreen:"绿色",presetColorAmber:"琥珀色",presetColorOrange:"橙色",presetColorRed:"红色",presetColorPink:"粉色",presetColorPurple:"紫色",presetDelete:"删除常用组合",presetAdd:"添加",presetEmpty:"还没有常用组合",projectSessionCount_one:"{{count}} 个会话",projectSessionCount_other:"{{count}} 个会话",projectDirectoriesFailed:"项目目录加载失败",projectDefaultFailed:"项目默认模型加载失败",projectDefaultSaved:"项目固定默认模型已保存。",projectDefaultGlobalSaved:"项目已恢复跟随 Pi 全局当前值。",projectDefaultSaveFailed:"项目默认模型保存失败",projectLoading:"加载项目配置…",projectDescription:"项目配置优先于 Pi 全局当前值,普通模型切换不会修改这里。",projectEmpty:"没有找到已有 Pi 会话的项目目录",project:"项目",projectSearch:"搜索项目路径",projectList:"项目列表",backProjectList:"返回项目列表",selectProjectToConfigure:"选择项目配置默认模型",projectDefaultSource:"项目默认模型来源",projectFollowGlobal:"跟随 Pi 全局当前值",projectFollowGlobalDescription:"不单独设置这个项目的默认模型。",projectFixed:"固定项目默认",projectFixedDescription:"为这个项目指定模型和思考等级。",projectDefaultModel:"默认模型",projectDefaultThinking:"项目默认思考等级",fromPreset:"从常用组合选择",saveProjectDefault:"保存项目默认"},skills:g.P["zh-CN"],taskCenter:h.U["zh-CN"],workbench:i.R["zh-CN"],workbenchPicker:{sessionFallback:"会话 {{id}}",newSession:"新会话",scopeTitle:"标题",scopeUser:"用户消息",scopeAssistant:"AI 回复",scopeUserMatches:"用户消息 {{count}}",scopeAssistantMatches:"AI 回复 {{count}}",loadUserFailed:"加载用户消息失败",ignoredRestoreTitle:"恢复忽略目录",browseOtherTitle:"选择项目目录",replaceTitle:"替换工作会话",createTitle:"新建工作会话",ignoredRestoreDescription:"恢复后,该项目会重新出现在所有普通目录列表中。",browseDescription:"浏览运行 Pi Desk 的服务端文件系统,选择项目工作目录。",replaceDescription:"将替换到:{{project}} \xb7 {{session}}",replaceMissingDescription:"替换目标已失效,请关闭后重新选择工作会话。",createDescription:"选择已有 Pi 项目,或浏览服务端目录创建新的工作会话。",searchHistory:"搜索历史会话",searchBrowser:"搜索当前层级的目录",searchIgnored:"搜索已忽略目录",searchProjects:"搜索项目名称或完整路径",currentProject:"当前项目:{{path}}",ignoredCount_one:"{{count}} 个已忽略目录",ignoredCount_other:"{{count}} 个已忽略目录",rootChoose:"选择磁盘或根目录",root:"磁盘或根目录",replaceChooseFirst:"选择项目后查看可替换的历史会话。",regularExcludesIgnored:"普通目录列表已自动排除忽略项目。",loadingHistory:"正在加载历史会话…",loadingIgnored:"正在加载忽略目录…",loadingBrowser:"正在浏览服务端目录…",loadingProjects:"正在加载 Pi 项目…",backFolders:"返回目录列表",pastePath:"粘贴完整目录路径后按 Enter",fullPath:"完整目录路径",openTyped:"打开输入的目录",enterAbsolute:"请输入绝对目录路径",open:"打开",absoluteExample:"请输入绝对目录路径,例如 C:\\projects\\example。",pasteHint:"可直接粘贴完整路径并打开;兼容 Windows“复制为路径”。",searchScopes:"搜索范围",replaceTargetMissing:"替换目标已失效,无法继续替换。",noHistoryMatches:"没有匹配的历史会话",noReplaceHistory:"当前项目没有可替换的历史会话",sessionFound_one:"找到 {{count}} 个会话",sessionFound_other:"找到 {{count}} 个会话",sessionMessages:"{{users}}/{{total}} 条消息 \xb7 {{time}}",replacing:"替换中",current:"当前",alreadyUsed:"已使用",targetUnavailable:"目标失效",replace:"替换",currentBound:"当前工作会话已绑定此历史会话",historyUsed:"该历史会话已被其他工作会话占用",replaceTargetUnavailable:"替换目标已失效",replaceWith:"替换为 {{name}}",hideUserMessages:"收起用户消息",viewMatching_one:"查看全部 {{count}} 条匹配",viewMatching_other:"查看全部 {{count}} 条匹配",viewUserMessages_one:"查看 {{count}} 条用户消息",viewUserMessages_other:"查看 {{count}} 条用户消息",viewMatch:"查看{{label}}",matchingUserCount:"匹配的用户消息 {{count}} 条",userCount:"用户消息 {{count}} 条",viewAll:"查看全部",noUserMessages:"没有可展示的用户消息",noText:"(无文字内容)",loadMore:"加载更多",browserEmpty:"当前目录没有可浏览的子目录,可直接选择当前目录",rootsEmpty:"没有可浏览的磁盘或根目录",subfoldersNoMatches:"没有匹配的子目录",ignoredEmpty:"没有已忽略的 Pi 项目",projectsEmpty:"没有可选择的 Pi 项目",projectNoMatches:"没有匹配的 Pi 项目",restoreFolder:"恢复目录 {{name}}",restoreTip:"恢复到普通目录列表",restore:"恢复",directorySessions_one:"{{count}} 个会话 \xb7 {{time}}",directorySessions_other:"{{count}} 个会话 \xb7 {{time}}",directoryCount_one:"{{count}} 个会话",directoryCount_other:"{{count}} 个会话",creating:"创建中",ignoreFolder:"忽略目录 {{name}}",ignoreTip:"从所有普通目录列表中隐藏",ignoredFolders:"已忽略目录",chooseOther:"选择其他目录",selectCurrent:"选择当前目录",parentDirectory:"返回上一级目录",backRoots:"返回磁盘或根目录",refreshList:"刷新当前列表",filterDefault:"默认",filterNoTools:"无工具",filterUserOnly:"仅用户",filterLabeled:"有标签",filterAll:"全部",kindUser:"用户",kindTool:"工具",kindMessage:"消息",kindCompaction:"压缩",kindBranchSummary:"摘要",kindCustom:"记录",kindModel:"模型",kindThinking:"思考",kindSession:"会话",kindLabel:"标签",treeIntent:"切换当前会话分支",forkIntent:"从用户消息新开会话",cloneIntent:"克隆当前会话",runningTitle:"当前工作会话正在运行",runningStop:"继续“{{action}}”会先停止当前响应。已保存的消息会保留。",runningWait:"继续“{{action}}”会等待当前后台任务结束。",confirming:"正在处理…",confirmContinue:"确认并继续",back:"返回",confirmHint:"Enter 确认 \xb7 Esc 返回",branchPicker:"会话分支选择器",branchTitle:"会话分支",closeBranchPicker:"关闭会话分支选择器",branchSearch:"搜索会话分支",branchSearchPlaceholder:"搜索消息、工具或标签",branchFilter:"过滤会话树,当前:{{filter}}",loadingEntry:"正在读取完整内容…",entryEmpty:"该节点没有可展示的文字内容",entryTruncated:"内容较长,已截断显示。",selectEntry:"从树中选择一条记录查看完整内容",branchWorking:"正在停止或等待当前运行并执行操作…",branchLoading:"正在读取会话树…",branchEmpty:"当前会话还没有可选择的节点",branchNoMatches:"没有匹配的会话节点",branchTree:"会话树",collapseBranch:"收起分支",expandBranch:"展开分支",noPreview:"无可预览文字",switchToMessage:"切换到{{kind}}消息",switch:"切换",forkFromUser:"从这条用户消息新开会话",branchShortcuts:"↑↓ 选择 \xb7 Tab 筛选 \xb7 ←→ 分支 \xb7 Enter 切换 \xb7 Esc 关闭"},conversation:j.W["zh-CN"],projectFiles:k.C["zh-CN"]}};function y({children:a,initialSettings:b}){let[c]=(0,e.useState)(v.y);return(0,d.jsx)(w.O.Provider,{value:c,children:(0,d.jsx)(m.rg,{children:(0,d.jsx)(n.Zi,{children:(0,d.jsx)(p,{children:(0,d.jsx)(q.A,{resources:x,initialSettings:b,children:(0,d.jsxs)(s.c,{children:[(0,d.jsx)(t,{}),(0,d.jsx)(u.Bc,{children:a})]})})})})})})}},24187:(a,b,c)=>{"use strict";c.d(b,{Dz:()=>h,f7:()=>g,tv:()=>f});var d=c(59473);let e=d.Yj().trim().min(1).max(64).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/),f=e,g=e,h=d.g1(d.Yj(),d.Pq());d.Yj().trim().min(3).max(129).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*\/[a-z0-9]+(?:-[a-z0-9]+)*$/);let i=d.k5(["plugin","server","rocket","settings","panel","message","terminal","file","folder","bot","wrench","database","globe"]);d.gM("type",[d.Ik({type:d.eu("builtin"),name:i}).strict(),d.Ik({type:d.eu("svg"),content:d.Yj().trim().min(1).max(16384)}).strict()])},30897:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,17179,23)),Promise.resolve().then(c.t.bind(c,39159,23)),Promise.resolve().then(c.t.bind(c,52442,23)),Promise.resolve().then(c.t.bind(c,270,23)),Promise.resolve().then(c.t.bind(c,47594,23)),Promise.resolve().then(c.t.bind(c,52047,23)),Promise.resolve().then(c.t.bind(c,7770,23))},34525:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,29190,23)),Promise.resolve().then(c.bind(c,64669))},35166:()=>{},35282:(a,b,c)=>{"use strict";c.d(b,{J:()=>f,a:()=>e});var d=c(87883);let e=d.Ik({locale:d.k5(["zh-CN","en"]),timeZone:d.Yj().trim().min(1).max(100).refine(a=>{try{return new Intl.DateTimeFormat("en",{timeZone:a}),!0}catch{return!1}},"无效的 IANA 时区")}).strict().readonly(),f=d.Ik({region:e}).strict().readonly()},37222:(a,b,c)=>{"use strict";c.d(b,{Hc:()=>r,SJ:()=>l,UV:()=>n,ae:()=>m,fx:()=>p,pW:()=>o,re:()=>q});var d=c(35282);let e=new Set,f=new Set,g=d.J.parse({region:{locale:"en",timeZone:"UTC"}}),h=null,i=!1,j=0;function k(a){return{locale:a,timeZone:g.region.timeZone,localePreference:g.region.locale,timeZonePreference:g.region.timeZone,pendingLocale:a===g.region.locale?null:g.region.locale}}function l(){return g}function m(a){return f.add(a),()=>f.delete(a)}function n(a){let b=d.J.parse(a),c=JSON.stringify(g)!==JSON.stringify(b);if(i&&!c)return;let j=i&&h?h.locale:b.region.locale;for(let a of(g=b,i=!0,h=k(j),e))a();if(c)for(let a of f)a()}function o(a){for(let b of(h={...k(a),pendingLocale:null},e))b()}function p(){return h}function q(a){return e.add(a),()=>e.delete(a)}function r(){if(j+=1,!h)for(let a of(h=k(g.region.locale),e))a();return()=>{0==(j-=1)&&(h=null,i=!1,g=d.J.parse({region:{locale:"en",timeZone:"UTC"}}),e.clear(),f.clear())}}},37957:(a,b,c)=>{Promise.resolve().then(c.bind(c,56951))},38273:(a,b,c)=>{"use strict";c.d(b,{R:()=>d});let d={en:{terminal:"Terminal",newTerminal:"New terminal",terminalTabs:"Terminals",terminalActions:"Terminal actions",terminalDockBottom:"Dock at bottom",terminalDockRight:"Dock at right",terminalMaximize:"Maximize",terminalRestore:"Restore",terminalCollapse:"Collapse",terminalExpand:"Expand terminals ({{count}})",terminalCloseTab:"Close {{title}}",terminalRemove:"Remove exited terminal",terminalExited:"Exited",terminalExitCode:"Exit {{code}}",terminalOpening:"Opening terminal…",terminalReconnecting:"Reconnecting…",terminalSyncing:"Restoring terminal…",terminalLoadFailed:"Could not load terminal",terminalScreen:"Terminal screen",terminalInput:"Input",terminalResize:"Resize terminal",terminalKeyleft:"Left arrow",terminalKeyright:"Right arrow",terminalKeyup:"Up arrow",terminalKeydown:"Down arrow",toolsAndContext:"Tools and context",sessionContextDescription:"Tools, system instructions and services for this session",mcpSession:"Session MCP",modelAutomaticRouting:"Automatic routing",modelFixed:"Fixed models",modelChanging:"Changing model…",modelContextUnknown:"Context unknown",mcpSessionActions:"Session MCP actions",mcpStatus:"Status",mcpLogin:"Sign in",mcpReconnect:"Reconnect",mcpLogout:"Sign out",mcpServerName:"Server name",mcpServerNamePlaceholder:"Enter the configured server name",mcpServerNameInvalid:"Use letters, numbers, underscores and hyphens.",mcpLogoutConfirm:"Delete shared credentials. Other sessions may need to sign in again.",mcpExecute:"Run",mcpExecuting:"Running",mcpCommandUnavailable:"No MCP command is registered in this session.",nativeCommandOutput:"Session command output",nativeCommandOutputEmpty:"No session command output yet",searchToolsSources:"Search names, sources or descriptions",toolFilter:"Tool usage",allTools:"All tools",toolBlockedByMode:"Restricted by mode",toolSource:"Source",toolUnknown:"Unknown",toolActive:"Currently selected",toolInactive:"Not currently selected",toolModeUnknown:"Mode restriction unknown",toolNotBlocked:"Not restricted by mode",noRegisteredTools:"No tools registered in this session",toolExposureDirect:"Direct use",toolExposureModelOnly:"Model only",toolExposureCodemode:"Via scripts",toolExposureDeferred:"On-demand discovery",toolExposureHidden:"Unavailable",nativeUiTitle:"Plugin request",nativeUiInfo:"Additional information",nativeUiStatus:"Plugin status",nativeUiConfirm:"Confirm",nativeUiCancel:"Cancel",nativeUiReject:"Decline",nativeUiLater:"Later",nativeUiResume:"Continue",nativeUiPending:"{{count}} pending",nativeUiMore:"{{count}} more",nativeUiSubmit:"Submit",nativeUiSubmitting:"Submitting…",nativeUiDisconnected:"Waiting for connection. Your input is kept.",nativeUiUnknown:"Checking whether your answer was received. It will not be sent again automatically.",nativeUiFailed:"Could not load plugin interaction",nativeUiRetry:"Refresh status",nativeUiCountdown:"Cancels in {{seconds}}s",nativeUiStop:"Stop",nativeUiExpand:"Expand editor",nativeUiBack:"Back to chat",nativeUiDraft:"Suggested text",nativeUiAppend:"Append to draft",nativeUiReplace:"Replace draft",nativeUiDismiss:"Dismiss",nativeUiComposer:"Answer the pending question before sending more messages.",nativeUiAnswerExpired:"This question has ended.",thinkingOff:"Off",thinkingMinimal:"Minimal",thinkingLow:"Low",thinkingMedium:"Medium",thinkingHigh:"High",thinkingXhigh:"Very high",thinkingMax:"Maximum",selectModel:"Select model",thinkingLevel:"Thinking: {{level}}",imagePreview:"Preview {{name}}",imageRemove:"Remove {{name}}",imageProcessing:"Processing",imageFailed:"Failed",draftLoading:"Restoring draft…",draftFailed:"Could not restore draft. Retry first.",inputPlaceholder:"Message… Enter to send, Shift+Enter for a new line",more:"More",moreActions:"More actions",session:"Session",tools:"Tools",plugins:"Plugins",sessionBranch:"Session branches",switchBranch:"Switch session branch",clone:"Clone session",cloning:"Cloning session…",cloneEmpty:"No messages to clone yet",cloneTip:"Clone the current branch into a new session",replaceSession:"Replace with a new session",replacing:"Replacing…",systemContext:"View system context",readingContext:"Loading system context…",reloadPi:"Reload Pi configuration",restorePluginPresentation:"Restore plugin message views",initializationDegraded:"No-extension fallback",initializationDetails:"Reason for fallback",copyInitializationError:"Copy reason",initializationCopyFailed:"Could not copy the reason. Please select and copy it manually.",reloadingPi:"Reloading Pi configuration…",reloadPiTip:"Reload Pi configuration, extensions, Skills, prompts and context files",addImage:"Add image",chooseModel:"Select model and thinking level",currentModel:"Current model",allModels:"All models",modelsLoading:"Loading models…",modelsFailed:"Could not load models. Retry",noModels:"No authenticated models available",presets:"Common combinations",commonCombinationsEmpty:"No common combinations yet",configureCommonCombinations:"Set up common combinations",preparingContext:"Preparing context…",steerNow:"Guide the current response now",sendFollowUp:"Send after this turn",stopResponse:"Stop response",sending:"Sending message",send:"Send message",synchronizing:"Synchronizing session",noModelSelected:"No model selected",modelTooltip:"Current model: {{model}}. Choose another",operationFailed:"Action failed",modeChangeFailed:"Could not change capability mode",contextFailed:"Could not load system context",sendFailed:"Could not send message",confirmingSend:"Checking send result…",sendUnknown:"Send result unknown. Your message is saved locally. Check the conversation before restoring or deleting it.",sendFailure:"Send failed: {{error}}",unknownError:"Unknown error",restoreDraft:"Restore draft",delete:"Delete",retryDraft:"Retry restoring draft",composerRunning:"Message composer, running",composerCompleted:"Message composer, response ready",composer:"Message composer",escapeTwice:"Esc twice",thinkingLevels:"Thinking level",imagePreviewPending:"Images to send",tooManyImages:"Send at most 10 images at once. Remove some images first.",imageUnsupported:"The current model cannot receive images. Choose a model with image support.",imagesTooLarge:"Images cannot exceed 20 MB in total.",pluginRestoreFailed:"Could not load plugin state after restart",syncFailed:"Could not resynchronize work sessions",workSessionUpdateInvalid:"Work session update invalid; resynchronizing",appRuntimeUpdateInvalid:"Application update invalid; resynchronizing",projectDirectoriesFailed:"Could not load Pi projects",ignoredDirectoriesFailed:"Could not load ignored folders",browseDirectoryFailed:"Could not browse server folders",historyFailed:"Could not load past Pi sessions",chatSyncFailed:"Could not synchronize chat messages",taskSyncFailed:"Could not synchronize task details",replacedConnection:"Another connection replaced this page connection",connectionFailed:"Connection failed",realtimeFailed:"Could not connect to real-time work sessions",workSessionInitializing:"Work sessions are still initializing",sessionNotFound:"Session not found in the current work session",sortFailed:"Could not reorder work sessions",deleteFailed:"Could not delete work session",ignoreFailed:"Could not ignore folder",restoreIgnoredFailed:"Could not restore folder",autoPinFailed:"Session created, but could not pin it automatically",createFailed:"Could not create work session",replaceTargetMissing:"Replacement target is no longer available. Select a work session again.",replacementMissing:"Replacement work session not found",replaceFailed:"Could not replace work session",emptyReplacementMissing:"New empty work session not found",replaceEmptyFailed:"Could not replace with an empty session",sourceChanged:"Work session source changed.",invalidFilePath:"Invalid file path.",invalidToolFilePath:"Invalid tool file path.",noPreviewSession:"There is no work session to preview files.",noRevealSession:"There is no work session to locate files.",notificationActionFailed:"Could not perform notification action",notificationDeleteFailed:"Could not dismiss notification",closeSessionMenu:"Close work session menu",resizeSessionList:"Resize work session list",showSidebarMode:"Show {{name}}",sidebarContents:"Sidebar content",sidebarActions:"Sidebar actions",mainRunning:"Main session running",backgroundRunning:"Background task running",completedUnread:"Completed; not viewed yet",idle:"Idle",newSession:"New session",copiedProjectPath:"Project path copied.",copyProjectPathFailed:"Could not copy project path. Please copy it manually.",dragSession:"Drag to reorder {{name}}",dragOrder:"Drag to reorder",sessionMessages:"{{count}} messages \xb7 {{time}}",pinSession:"Pin {{name}}",unpinSession:"Unpin {{name}}",pin:"Pin session",unpin:"Unpin session",deleteSession:"Delete {{name}}",deleteSessionTitle:"Delete work session",copyProjectPath:"Copy project path",renameSessionTitle:"Edit title",reloadChatData:"Reload chat data",reloadChatDataFailed:"Could not reload chat data",reloadChatSourceChanged:"The session has changed. Select it again.",sessionTitleLabel:"Session title",renameSessionFailed:"Could not save the session title",sidebarSessions:"Work sessions",sidebarFiles:"Project files",sidebarReplaceSession:"Replace work session",createSession:"Create work session",projectPreview:"Project preview",projectPreviewWindow:"Open in new window",refreshFiles:"Refresh project files",pinnedBelow:"Pinned below",settings:"Settings",settingsWarning:"Settings, extension error",moreShortcuts:"More shortcuts",noSessions:"No work sessions yet",selectSessionFirst:"Select a work session first",shortcuts:"Shortcuts",gitStatusReadFailed:"Could not read Git status",gitOperationFailed:"Could not change Git branch",checkedOut:"Checked out {{name}}",switchedBranch:"Switched to {{name}}",branchCreated:"Created and switched to {{name}}",current:"Current",recent:"Recent",checkoutRemote:"Check out as local branch",switchGitBranch:"Switch to this branch",branchFromHere:"Create branch from here",gitBranches:"Git branches",readingRepos:"Loading repositories…",repositoryUnavailable:"Git unavailable",repositorySummary:"{{name}} \xb7 {{branch}}",repositoryCount_one:"{{count}} repository",repositoryCount_other:"{{count}} repositories",refreshBranches:"Refresh Git branches",close:"Close",repositories:"Repositories",unavailable:"Unavailable",backRepositories:"Back to repositories",chooseRepository:"Choose a repository",createBranch:"New branch",newBranchName:"New branch name",createAndSwitch:"Create and switch",cancel:"Cancel",searchBranches:"Search branches",loadingBranches:"Loading branches…",retry:"Retry",recentlyUsed:"Recently used",localBranches:"Local branches",remoteBranches:"Remote branches",noBranchMatches:"No matching branches",contextUsageWithIgnore:"Context {{percent}}%, estimated {{projected}}% after ignoring; ignored {{ignored}}, can ignore {{potential}}",contextUsageSimple:"Context {{percent}}% of {{limit}} tokens",contextDetails:"Context usage details",contextMetrics:"Current / Limit / Used",afterIgnore:"Estimated remaining",potentialIgnore:"Can ignore",alreadyIgnored:"Ignored",ignoreNow:"Ignore {{amount}} now",nothingToIgnore:"No context available to ignore",ignoring:"Ignoring…",ignore:"Ignore",compacting:"Compacting…",compact:"Compact",contextCritical:"Context usage is very high.",contextWarning:"Context is approaching its limit.",copySessionId:"Copy current session ID {{id}}",copySessionFailed:"Could not copy session ID. Please copy it manually.",currentSessionId:"Current session ID",copied:"Copied",clickToCopy:"Click to copy",copyCurrentPath:"Copy current path {{path}}",copyPathFailed:"Could not copy path. Please copy it manually.",currentPath:"Current path",copy:"Copy",contextCopyFailed:"Could not copy system context. Please copy it manually.",contextTitle:"System context",contextDescription:"System prompt and tool definitions used in the current model request",copyContext:"Copy system context",contextContents:"Context contents",systemPrompt:"System prompt",toolDefinitions:"{{count}} tool definitions",searchTools:"Search tool definitions",searchNames:"Search names or descriptions",charCount:"{{count}} characters",contextLoading:"Loading system context…",contextRetry:"Retry",emptyContent:"(empty)",contextTools:"Model context tools",parameterSchema:"Parameter schema",noMatchingTools:"No matching tools",noActiveTools:"No active tools",clearSearch:"Clear search",queueItems_one:"{{count}} item",queueItems_other:"{{count}} items",queueImages_one:"{{count}} image",queueImages_other:"{{count}} images",imageOnly:"Image-only message",noMessageText:"No text content",viewQueued:"View {{count}} queued messages",queuedCount:"{{count}} queued",queueCurrent:"Queued messages",queuePendingDescription:"Waiting messages will be handled in this order",queueSteer:"Guide now",queueSteerDescription:"Guide the current response",queueFollowUp:"Send later",queueFollowUpDescription:"Send in order after this turn",queueRestore:"Undo all and restore to draft",noticeInfo:"Information",noticeSuccess:"Success",noticeWarning:"Warning",noticeError:"Error",actionableNotice:"{{level}} notification: {{title}}. Activate to open",noticeLabel:"{{level}} notification: {{title}}",olderNotices:"Show {{count}} earlier notifications",deleteNotice:"Dismiss notification: {{title}}",dismissNotice:"Dismiss notification",hideSessionMenu:"Hide session menu",showSessionMenu:"Show session menu",openSessionFiles:"Open session files",sessionFiles:"Files \xb7 {{count}}",unpinWorkSession:"Unpin work session {{name}}",workSession:"Work session",loading:"Loading",chooseSession:"Choose a session",expandSession:"Expand session {{name}}",resizeColumns:"Resize columns {{left}} and {{right}}",emptySelectSession:"Choose a work session",emptyQuip0:"You bring the ideas. I'll bring the tinkering.",emptyQuip1:"Enough floating around. Let's make something.",emptyQuip2:"So, what are we tinkering with today?",emptyQuip3:"Your ideas. My keyboard.",emptyQuip4:"Brainstorming mode: hungry for ideas.",emptyQuip5:"Cute face. Surprisingly useful paws.",emptyQuip6:"Today's wild ideas may now take the stage.",emptyQuip7:"Let's turn that 'what if' into something real.",emptyQuip8:"You start it. I'll help get it rolling.",emptyQuip9:"Paws in position. Ready to work.",emptyQuip10:"Let's make something, then look thoughtful.",emptyQuip11:"Toss me an idea. I've got it.",emptyQuip12:"Wild ideas welcome. We'll figure out the rest.",emptyQuip13:"Let's turn 'maybe' into 'done'.",emptyQuip14:"Daydream break over. Brainstorming open.",emptyQuip15:"Got a bold idea? Let me sit down first.",emptyQuip16:"Not sleeping. Just loading ideas with my eyes closed.",emptyWakeReply:"I'm awake! Let's get to work.",emptyFishReply:"Coming right up!",emptyCuriousReply:"Oh, you really meant it!",emptyPartnerReply:"Got it. Let's do this.",emptyLoading:"Loading sessions…",file:"File",fileViewer:"{{name}} file viewer",collapseProjectTree:"Collapse project tree",expandProjectTree:"Expand project tree",exitExpanded:"Exit expanded view",expandFile:"Expand file",returnChat:"Back to chat",hideFile:"Hide file",chat:"Chat",collapse:"Collapse",browseProject:"Browse project folders",fileWorkspaceTitle:"Project files",resizeChatFile:"Resize chat and file panes",standaloneReadFailed:"Could not read file",standaloneViewer:"{{name}} standalone file preview",reloadFile:"Reload file",standaloneImage:"{{name}} image preview",standaloneHtml:"{{name}} HTML preview",loadingFile:"Loading file…",slashLoadingMore:"Loading more commands…",slashMoreFailed:"Could not load additional commands",slashCandidates:"Slash command suggestions",slashLoading:"Loading commands…",slashFailed:"Could not load commands",slashEmpty:"No matching commands",slashSummary:"{{commands}} commands \xb7 {{groups}} categories",slashCount:"{{count}} commands",slashUpDown:"↑↓ Select",slashEnter:"Enter Select",slashEscape:"Esc Close",slashGroupBuiltin:"Pi commands",slashGroupSkill:"Skills",slashGroupPrompt:"Prompt templates",slashGroupExtension:"Extension commands",reloadDescription:"Reload the latest Pi configuration and extensions",chatMessages:"{{name}} chat messages",sessionWindows:"Work session windows",fixedSession:"Pinned",primarySession:"Main session",sourceSyncing:"Session is synchronizing. Try again shortly.",draftSaveFailed:"Could not save draft",imageProcessFailed:"Could not process image",draftImage:"Draft image",uncertainRecovered:"A previous send had an unknown result. Check the conversation before sending again.",draftLoadFailed:"Could not load draft",imageAddLimit:"Add at most 10 images",imageUnavailable:"Image unavailable",imageAddOverflow:"10-image limit reached. Other images were not added.",resolveOutboxFirst:"Resolve the previous unconfirmed message first",emptyInput:"Enter text or add an image",imageSendLimit:"Send at most 10 images",imagesPending:"Images are still processing",imageProcessingFailed:"An image could not be processed",imageBytesLimit:"Images in one message cannot exceed 20 MB",messageBytesLimit:"Message exceeds 31 MB",outboxRestored:"Unconfirmed message restored to draft.",outboxDeleted:"Unconfirmed message deleted.",interruptFailed:"Could not interrupt the current response",restoredImage:"Restored image {{count}}",queuesRestored:"All queued messages restored to draft.",queueRestoreFailed:"Could not restore queued messages",modelCatalogFailed:"Could not load model catalog",setModelFailed:"Could not set model",imageIdentityInvalid:"Invalid chat image identity",localImagePending:"Local temporary image is not ready",imageFileFailed:"{{name}}: {{error}}",treeLoadFailed:"Could not load session tree",treeSourceInvalid:"Work session changed. Session tree is unavailable",treeDetailFailed:"Could not load entry details",branchTargetMissing:"Branched work session not found",branchOperationFailed:"Could not perform branch operation",interruptForBranchFailed:"Could not stop the current response",treeChanged:"Work session changed. Reopen the session tree",cloneUnavailable:"Work session changed. Cannot clone",branchUnavailable:"Work session changed. Cannot continue",branchChanged:"Work session changed. Try again",chatCacheMismatch:"Local chat cache does not match the synchronization cursor; resynchronizing",chatMessageMissing:"Chat message not found: {{index}}/{{entryId}}",gitNoProjectBranches:"This project is not bound to a work session. Git branches are unavailable.",gitBranchesReadFailed:"Could not read Git branches",gitNoProjectStatus:"This project is not bound to a work session. Git status is unavailable.",gitNoProjectOperation:"This project is not bound to a work session. Git actions are unavailable.",outboxMissing:"No unconfirmed message is available to restore",imageDecodeFailed:"Image could not be decoded",imageInvalidDimensions:"Invalid image dimensions",canvasUnavailable:"Browser could not create an image canvas",imageCompressFailed:"Browser could not compress image",imageTypeUnsupported:"Only JPEG, PNG, WebP, GIF or BMP images are supported",singleImageLimit:"Images must be 10 MB or smaller",compressedImageTooLarge:"Image still exceeds 10 MB after compression",compressedTypeUnsupported:"Unsupported compressed image format"},"zh-CN":{terminal:"终端",newTerminal:"新建终端",terminalTabs:"终端标签",terminalActions:"终端操作",terminalDockBottom:"停靠底部",terminalDockRight:"停靠右侧",terminalMaximize:"最大化",terminalRestore:"还原",terminalCollapse:"折叠终端",terminalExpand:"展开终端({{count}})",terminalCloseTab:"关闭 {{title}}",terminalRemove:"移除已退出终端",terminalExited:"已退出",terminalExitCode:"退出码 {{code}}",terminalOpening:"正在打开终端…",terminalReconnecting:"正在重新连接…",terminalSyncing:"正在恢复画面…",terminalLoadFailed:"终端加载失败",terminalScreen:"终端画面",terminalInput:"输入",terminalResize:"调整终端尺寸",terminalKeyleft:"向左",terminalKeyright:"向右",terminalKeyup:"向上",terminalKeydown:"向下",toolsAndContext:"工具与上下文",sessionContextDescription:"当前会话的工具、系统提示词和服务",mcpSession:"会话 MCP",modelAutomaticRouting:"自动路由",modelFixed:"固定模型",modelChanging:"正在切换模型…",modelContextUnknown:"上下文未知",mcpSessionActions:"MCP 会话操作",mcpStatus:"状态",mcpLogin:"登录",mcpReconnect:"重连",mcpLogout:"退出登录",mcpServerName:"服务名称",mcpServerNamePlaceholder:"输入已配置的服务名称",mcpServerNameInvalid:"服务名称只能包含字母、数字、下划线和连字符。",mcpLogoutConfirm:"删除共享登录凭据,其他会话下次访问也可能需要重新登录。",mcpExecute:"执行",mcpExecuting:"正在执行",mcpCommandUnavailable:"当前会话未注册 MCP 命令。",nativeCommandOutput:"会话命令输出",nativeCommandOutputEmpty:"暂无会话命令输出",searchToolsSources:"搜索名称、来源或描述",toolFilter:"工具使用方式",allTools:"全部工具",toolBlockedByMode:"受模式限制",toolSource:"来源",toolUnknown:"未知",toolActive:"当前已选用",toolInactive:"当前未选用",toolModeUnknown:"模式限制未知",toolNotBlocked:"未受模式限制",noRegisteredTools:"当前会话没有登记工具",toolExposureDirect:"直接使用",toolExposureModelOnly:"仅模型调用",toolExposureCodemode:"通过脚本调用",toolExposureDeferred:"按需发现",toolExposureHidden:"不可调用",nativeUiTitle:"插件请求",nativeUiInfo:"附加信息",nativeUiStatus:"插件状态",nativeUiConfirm:"确认",nativeUiCancel:"取消",nativeUiReject:"拒绝",nativeUiLater:"稍后处理",nativeUiResume:"继续处理",nativeUiPending:"{{count}} 项待处理",nativeUiMore:"另有 {{count}} 项",nativeUiSubmit:"提交",nativeUiSubmitting:"正在提交…",nativeUiDisconnected:"连接恢复后可继续,输入已保留。",nativeUiUnknown:"正在核对是否收到回答,不会自动重复提交。",nativeUiFailed:"无法加载插件交互",nativeUiRetry:"刷新状态",nativeUiCountdown:"{{seconds}} 秒后取消",nativeUiStop:"停止任务",nativeUiExpand:"展开编辑",nativeUiBack:"返回聊天",nativeUiDraft:"插件发来一段草稿",nativeUiAppend:"追加到草稿",nativeUiReplace:"替换草稿",nativeUiDismiss:"忽略",nativeUiComposer:"处理问题后可发送补充内容。",nativeUiAnswerExpired:"这个问题已结束。",thinkingOff:"关闭",thinkingMinimal:"最少",thinkingLow:"低",thinkingMedium:"中",thinkingHigh:"高",thinkingXhigh:"很高",thinkingMax:"最大",selectModel:"选择模型",thinkingLevel:"思考 {{level}}",imagePreview:"预览 {{name}}",imageRemove:"移除 {{name}}",imageProcessing:"处理中",imageFailed:"失败",draftLoading:"正在恢复草稿…",draftFailed:"草稿恢复失败,请先重试",inputPlaceholder:"输入消息,Enter 发送,Shift+Enter 换行",more:"更多",moreActions:"更多操作",session:"会话",tools:"工具",plugins:"插件",sessionBranch:"会话分支",switchBranch:"切换会话分支",clone:"克隆当前会话",cloning:"正在克隆当前会话",cloneEmpty:"当前会话还没有可克隆的消息",cloneTip:"克隆当前活动分支到新会话",replaceSession:"替换为新会话",replacing:"正在替换…",systemContext:"查看系统上下文",readingContext:"正在读取系统上下文…",reloadPi:"重载 Pi 配置",restorePluginPresentation:"恢复插件消息展示",initializationDegraded:"无扩展降级会话",initializationDetails:"降级原因",copyInitializationError:"复制原因",initializationCopyFailed:"复制原因失败,请选中文字后手动复制。",reloadingPi:"正在重载 Pi 配置…",reloadPiTip:"重新读取 Pi 的配置、扩展、Skills、提示模板和上下文文件",addImage:"添加图片",chooseModel:"选择模型与思考等级",currentModel:"当前模型",allModels:"全部模型",modelsLoading:"正在加载模型…",modelsFailed:"加载失败,点击重试",noModels:"没有已认证的可用模型",presets:"常用组合",commonCombinationsEmpty:"还没有常用组合",configureCommonCombinations:"设置常用组合",preparingContext:"正在准备上下文…",steerNow:"立即引导当前响应",sendFollowUp:"当前轮结束后发送",stopResponse:"停止当前响应",sending:"正在发送消息",send:"发送消息",synchronizing:"正在同步会话",noModelSelected:"尚未选择模型",modelTooltip:"当前模型:{{model}},点击切换",operationFailed:"操作失败",modeChangeFailed:"切换能力模式失败",contextFailed:"读取系统上下文失败",sendFailed:"发送消息失败",confirmingSend:"正在确认发送结果…",sendUnknown:"发送结果未知,内容仍保留在本机。请确认聊天记录后再恢复或删除。",sendFailure:"发送失败:{{error}}",unknownError:"未知错误",restoreDraft:"恢复草稿",delete:"删除",retryDraft:"重试恢复",composerRunning:"消息输入区,运行中",composerCompleted:"消息输入区,完成待查看",composer:"消息输入区",escapeTwice:"双击 Esc",thinkingLevels:"思考等级",imagePreviewPending:"待发送图片预览",tooManyImages:"单次最多发送 10 张图片,请先删除部分恢复内容。",imageUnsupported:"当前模型不支持图片输入,请切换到带图片图标的模型。",imagesTooLarge:"图片总量不能超过 20MB。",pluginRestoreFailed:"服务重启后读取插件状态失败",syncFailed:"重新同步工作会话失败",workSessionUpdateInvalid:"工作会话增量无效,正在重新同步",appRuntimeUpdateInvalid:"应用运行态增量无效,正在重新同步",projectDirectoriesFailed:"加载 Pi 目录失败",ignoredDirectoriesFailed:"加载忽略目录失败",browseDirectoryFailed:"浏览服务端目录失败",historyFailed:"加载 Pi 历史会话失败",chatSyncFailed:"聊天消息同步失败",taskSyncFailed:"任务详情同步失败",replacedConnection:"当前页面连接已被新的同 clientId 连接替换",connectionFailed:"连接失败",realtimeFailed:"工作会话实时连接失败",workSessionInitializing:"工作会话仍在初始化",sessionNotFound:"当前工作会话中未找到该会话",sortFailed:"更新会话排列失败",deleteFailed:"删除工作会话失败",ignoreFailed:"忽略目录失败",restoreIgnoredFailed:"恢复目录失败",autoPinFailed:"会话已创建,但自动固定失败",createFailed:"创建工作会话失败",replaceTargetMissing:"替换目标已失效,请关闭后重新选择工作会话",replacementMissing:"替换后的工作会话不存在",replaceFailed:"替换工作会话失败",emptyReplacementMissing:"替换后的空会话不存在",replaceEmptyFailed:"替换为空会话失败",sourceChanged:"工作会话来源已变化。",invalidFilePath:"文件路径无效。",invalidToolFilePath:"工具文件路径无效。",noPreviewSession:"当前没有可预览文件的工作会话。",noRevealSession:"当前没有可定位文件的工作会话。",notificationActionFailed:"通知操作执行失败",notificationDeleteFailed:"删除通知失败",closeSessionMenu:"关闭工作会话菜单",resizeSessionList:"调整工作会话列表宽度",showSidebarMode:"显示{{name}}",sidebarContents:"左侧栏内容",sidebarActions:"侧栏操作",mainRunning:"主会话运行中",backgroundRunning:"后台任务运行中",completedUnread:"完成待查看",idle:"空闲",newSession:"新会话",copiedProjectPath:"已复制项目路径。",copyProjectPathFailed:"复制项目路径失败,请手动复制。",dragSession:"拖拽调整工作会话 {{name}} 的顺序",dragOrder:"拖拽调整顺序",sessionMessages:"{{count}} 条消息 \xb7 {{time}}",pinSession:"固定工作会话 {{name}}",unpinSession:"取消固定工作会话 {{name}}",pin:"固定会话",unpin:"取消固定会话",deleteSession:"删除工作会话 {{name}}",deleteSessionTitle:"删除工作会话",copyProjectPath:"复制项目路径",renameSessionTitle:"修改标题",reloadChatData:"重新加载聊天数据",reloadChatDataFailed:"重新加载聊天数据失败",reloadChatSourceChanged:"会话已变化,请重新选择会话",sessionTitleLabel:"会话标题",renameSessionFailed:"保存会话标题失败",sidebarSessions:"工作会话",sidebarFiles:"项目文件",sidebarReplaceSession:"替换工作会话",createSession:"新建工作会话",projectPreview:"项目预览",projectPreviewWindow:"在新窗口打开",refreshFiles:"刷新项目文件",pinnedBelow:"以下固定",settings:"设置",settingsWarning:"设置,有扩展异常",moreShortcuts:"更多快捷入口",noSessions:"还没有工作会话",selectSessionFirst:"请先选择一个工作会话",shortcuts:"快捷入口",gitStatusReadFailed:"读取 Git 状态失败",gitOperationFailed:"Git 分支操作失败",checkedOut:"已检出 {{name}}",switchedBranch:"已切换到 {{name}}",branchCreated:"已创建并切换到 {{name}}",current:"当前",recent:"最近",checkoutRemote:"检出为本地分支",switchGitBranch:"切换到此分支",branchFromHere:"从此分支新建",gitBranches:"Git 分支",readingRepos:"正在读取仓库…",repositoryUnavailable:"Git 不可用",repositorySummary:"{{name}} \xb7 {{branch}}",repositoryCount_one:"{{count}} 个仓库",repositoryCount_other:"{{count}} 个仓库",refreshBranches:"刷新 Git 分支",close:"关闭",repositories:"仓库",unavailable:"不可用",backRepositories:"返回仓库列表",chooseRepository:"选择仓库",createBranch:"新建分支",newBranchName:"新分支名称",createAndSwitch:"创建并切换",cancel:"取消",searchBranches:"搜索分支",loadingBranches:"正在读取分支…",retry:"重试",recentlyUsed:"最近使用",localBranches:"本地分支",remoteBranches:"远程分支",noBranchMatches:"没有匹配分支",contextUsageWithIgnore:"上下文 {{percent}}%,忽略后预计 {{projected}}%,已忽略 {{ignored}},可忽略 {{potential}}",contextUsageSimple:"上下文 {{percent}}%,{{limit}} tokens",contextDetails:"上下文用量详情",contextMetrics:"当前占用 / 上限 / 使用百分比",afterIgnore:"忽略后预计保留",potentialIgnore:"可忽略",alreadyIgnored:"已忽略",ignoreNow:"立即忽略 {{amount}}",nothingToIgnore:"暂无可忽略上下文",ignoring:"忽略中…",ignore:"忽略",compacting:"压缩中…",compact:"压缩",contextCritical:"上下文占用已很高。",contextWarning:"上下文正在接近上限。",copySessionId:"复制当前会话 ID {{id}}",copySessionFailed:"复制当前会话 ID 失败,请手动复制。",currentSessionId:"当前会话 ID",copied:"已复制",clickToCopy:"点击复制",copyCurrentPath:"复制当前路径 {{path}}",copyPathFailed:"复制当前路径失败,请手动复制。",currentPath:"当前路径",copy:"复制",contextCopyFailed:"复制系统上下文失败,请手动复制。",contextTitle:"系统上下文",contextDescription:"当前模型请求使用的系统提示词和工具定义",copyContext:"复制系统上下文",contextContents:"上下文内容",systemPrompt:"系统提示词",toolDefinitions:"工具定义 \xb7 {{count}}",searchTools:"搜索工具定义",searchNames:"搜索名称或描述",charCount:"{{count}} 字符",contextLoading:"正在读取系统上下文…",contextRetry:"重试",emptyContent:"(空)",contextTools:"模型上下文工具",parameterSchema:"参数 Schema",noMatchingTools:"没有匹配的工具",noActiveTools:"当前没有启用工具",clearSearch:"清除搜索",queueItems_one:"{{count}} 条",queueItems_other:"{{count}} 条",queueImages_one:"{{count}} 张图片",queueImages_other:"{{count}} 张图片",imageOnly:"仅图片消息",noMessageText:"无文本内容",viewQueued:"查看 {{count}} 条排队消息",queuedCount:"排队 {{count}}",queueCurrent:"当前排队消息",queuePendingDescription:"等待中的消息会按下列顺序处理",queueSteer:"立即引导",queueSteerDescription:"用于引导当前响应",queueFollowUp:"后续发送",queueFollowUpDescription:"当前轮结束后依次发送",queueRestore:"撤销全部并恢复到草稿",noticeInfo:"信息",noticeSuccess:"成功",noticeWarning:"警告",noticeError:"错误",actionableNotice:"{{level}}通知:{{title}},点击处理",noticeLabel:"{{level}}通知:{{title}}",olderNotices:"展开 {{count}} 条更早通知",deleteNotice:"删除通知:{{title}}",dismissNotice:"删除通知",hideSessionMenu:"隐藏工作会话菜单",showSessionMenu:"显示工作会话菜单",openSessionFiles:"打开会话文件",sessionFiles:"文件 \xb7 {{count}}",unpinWorkSession:"取消固定工作会话 {{name}}",workSession:"工作会话",loading:"正在加载",chooseSession:"选择会话",expandSession:"展开会话 {{name}}",resizeColumns:"调整第 {{left}} 列与第 {{right}} 列宽度",emptySelectSession:"选择一个工作会话",emptyQuip0:"你负责脑洞,我负责折腾。",emptyQuip1:"不摸鱼了,整点活。",emptyQuip2:"说吧,今天捣鼓点什么?",emptyQuip3:"点子归你,敲键盘归我。",emptyQuip4:"脑洞已开,等你投喂。",emptyQuip5:"别看我可爱,活儿我也会干。",emptyQuip6:"今天的奇思妙想,请开始表演。",emptyQuip7:"来,把那个“要不试试”做出来。",emptyQuip8:"你先开个头,我来接着整。",emptyQuip9:"小爪子就位,准备开工。",emptyQuip10:"先整点东西,再假装深思熟虑。",emptyQuip11:"把想法丢过来,我接着。",emptyQuip12:"灵感可以离谱,咱们慢慢靠谱。",emptyQuip13:"今天也要把“不一定”变成“搞定”。",emptyQuip14:"摸鱼暂停,脑洞营业。",emptyQuip15:"有什么大胆的想法?我先坐稳。",emptyQuip16:"我没睡,只是在闭眼加载灵感。",emptyWakeReply:"醒了醒了,这就开工。",emptyFishReply:"来了来了!",emptyCuriousReply:"好家伙,来真的啊。",emptyPartnerReply:"收到,开整。",emptyLoading:"正在加载会话…",file:"文件",fileViewer:"{{name}} 文件查看器",collapseProjectTree:"收起项目目录",expandProjectTree:"展开项目目录",exitExpanded:"退出放大",expandFile:"放大文件",returnChat:"返回聊天",hideFile:"收起文件",chat:"聊天",collapse:"收起",browseProject:"预览项目目录",fileWorkspaceTitle:"项目文件",resizeChatFile:"调整聊天和文件宽度",standaloneReadFailed:"读取文件失败",standaloneViewer:"{{name}} 独立文件预览",reloadFile:"重新读取",standaloneImage:"{{name}} 图片预览",standaloneHtml:"{{name}} HTML 预览",loadingFile:"正在读取文件…",slashLoadingMore:"正在加载其他命令…",slashMoreFailed:"其他命令加载失败",slashCandidates:"Slash Command 候选",slashLoading:"正在加载命令…",slashFailed:"命令加载失败",slashEmpty:"无匹配命令",slashSummary:"{{commands}} 条命令 \xb7 {{groups}} 类",slashCount:"{{count}} 条命令",slashUpDown:"↑↓ 选择",slashEnter:"Enter 选择",slashEscape:"Esc 关闭",slashGroupBuiltin:"Pi 内置命令",slashGroupSkill:"Skills",slashGroupPrompt:"提示模板",slashGroupExtension:"扩展命令",reloadDescription:"重新读取 Pi 最新配置与扩展资源",chatMessages:"{{name}}聊天消息",sessionWindows:"工作会话窗口",fixedSession:"固定",primarySession:"主会话",sourceSyncing:"会话正在同步,请稍后重试",draftSaveFailed:"草稿保存失败",imageProcessFailed:"图片处理失败",draftImage:"草稿图片",uncertainRecovered:"已恢复上次发送状态未知的内容,请确认后重发。",draftLoadFailed:"加载草稿失败",imageAddLimit:"单次最多添加 10 张图片",imageUnavailable:"图片不可用",imageAddOverflow:"已达到 10 张图片上限,其余文件未添加",resolveOutboxFirst:"请先处理上一条待确认发送内容",emptyInput:"请输入文字或添加图片",imageSendLimit:"单次最多发送 10 张图片",imagesPending:"图片仍在处理中",imageProcessingFailed:"存在处理失败的图片",imageBytesLimit:"单次发送图片总量不能超过 20MB",messageBytesLimit:"聊天发送内容超过 31MB",outboxRestored:"待确认内容已恢复到草稿。",outboxDeleted:"待确认内容已删除。",interruptFailed:"打断当前响应失败",restoredImage:"恢复图片 {{count}}",queuesRestored:"全部排队消息已恢复到草稿。",queueRestoreFailed:"恢复全部排队消息失败",modelCatalogFailed:"加载模型目录失败",setModelFailed:"设置模型失败",imageIdentityInvalid:"聊天图片身份无效",localImagePending:"本机临时图片尚未就绪",imageFileFailed:"{{name}}:{{error}}",treeLoadFailed:"读取会话树失败",treeSourceInvalid:"工作会话已失效,无法打开会话树",treeDetailFailed:"读取节点详情失败",branchTargetMissing:"分支操作返回的目标工作会话不存在",branchOperationFailed:"执行分支操作失败",interruptForBranchFailed:"停止当前响应失败",treeChanged:"工作会话已经变化,请重新打开会话树",cloneUnavailable:"工作会话已失效,无法克隆",branchUnavailable:"工作会话已失效,无法继续操作",branchChanged:"工作会话已经变化,请重新操作",chatCacheMismatch:"本地缓存与聊天同步起点不一致,需要全量同步",chatMessageMissing:"聊天消息不存在:{{index}}/{{entryId}}",gitNoProjectBranches:"当前项目未绑定工作会话,暂时无法读取 Git 分支",gitBranchesReadFailed:"读取 Git 分支失败",gitNoProjectStatus:"当前项目未绑定工作会话,暂时无法读取 Git 状态",gitNoProjectOperation:"当前项目未绑定工作会话,暂时无法执行 Git 操作",outboxMissing:"没有可恢复的待确认发送内容",imageDecodeFailed:"图片无法解码",imageInvalidDimensions:"图片尺寸无效",canvasUnavailable:"浏览器无法创建图片画布",imageCompressFailed:"浏览器图片压缩失败",imageTypeUnsupported:"仅支持 JPEG、PNG、WebP、GIF 或 BMP 图片",singleImageLimit:"单张图片不能超过 10MB",compressedImageTooLarge:"图片压缩后仍超过 10MB",compressedTypeUnsupported:"图片压缩格式不受支持"}}},40217:(a,b,c)=>{Promise.resolve().then(c.bind(c,70961))},41904:(a,b,c)=>{"use strict";c.d(b,{J:()=>f,a:()=>e});var d=c(59473);let e=d.Ik({locale:d.k5(["zh-CN","en"]),timeZone:d.Yj().trim().min(1).max(100).refine(a=>{try{return new Intl.DateTimeFormat("en",{timeZone:a}),!0}catch{return!1}},"无效的 IANA 时区")}).strict().readonly(),f=d.Ik({region:e}).strict().readonly()},43115:(a,b,c)=>{"use strict";c.d(b,{U:()=>d});let d={en:{statusRunning:"Running",statusCompleted:"Completed",statusFailed:"Failed",statusStopped:"Stopped",statusInterrupted:"Interrupted",seconds_one:"{{count}} second",seconds_other:"{{count}} seconds",minutes_one:"{{count}} minute",minutes_other:"{{count}} minutes",hours_one:"{{count}} hour",hours_other:"{{count}} hours",copyFailed:"Could not copy {{name}}. Please copy it manually.",copied:"{{name}} copied",copy:"Copy {{name}}",copiedShort:"Copied",clickToCopy:"Click to copy {{name}}",conversationDetails:"Task conversation",noMessages:"No conversation messages",interruptFailed:"Could not interrupt task",selectTask:"Select a task to see its details",confirmInterrupt:"Confirm interrupt",interrupt:"Interrupt",waitingOutput:"Waiting for output…",noDetails:"No task details to display",retry:"Retry",loadingDetail:"Loading task details…",refreshing:"Refreshing",title:"Task center",close:"Close task center",recordCount_one:"{{count}} task",recordCount_other:"{{count}} tasks",noTasks:"No tasks",back:"Back to task list",detail:"Task details",open:"Open task center",runningTime:"Duration {{duration}}, started {{time}}",runningCount_one:"{{count}} task running",runningCount_other:"{{count}} tasks running",detailUnavailable:"Task details are no longer available",detailResponseMissing:"Server did not return task details",detailLoadFailed:"Could not load task details",imageDurableOnly:"Task images are only available for saved messages",centerClosed:"Task center is closed"},"zh-CN":{statusRunning:"执行中",statusCompleted:"已完成",statusFailed:"失败",statusStopped:"已停止",statusInterrupted:"已中断",seconds_one:"{{count}} 秒",seconds_other:"{{count}} 秒",minutes_one:"{{count}} 分钟",minutes_other:"{{count}} 分钟",hours_one:"{{count}} 小时",hours_other:"{{count}} 小时",copyFailed:"复制{{name}}失败,请手动复制。",copied:"已复制{{name}}",copy:"复制{{name}}",copiedShort:"已复制",clickToCopy:"点击复制{{name}}",conversationDetails:"任务会话详情",noMessages:"暂无会话消息",interruptFailed:"打断任务失败",selectTask:"从左侧选择一个任务查看详情",confirmInterrupt:"确认打断",interrupt:"打断",waitingOutput:"等待输出…",noDetails:"该任务没有可展示的详情",retry:"重试",loadingDetail:"正在加载任务详情…",refreshing:"正在刷新",title:"任务中心",close:"关闭任务中心",recordCount_one:"{{count}} 条执行记录",recordCount_other:"{{count}} 条执行记录",noTasks:"暂无任务",back:"返回任务列表",detail:"任务详情",open:"打开任务中心",runningTime:"执行时长 {{duration}},启动时间 {{time}}",runningCount_one:"{{count}} 个任务执行中",runningCount_other:"{{count}} 个任务执行中",detailUnavailable:"任务详情已不可用",detailResponseMissing:"服务端未返回任务详情",detailLoadFailed:"加载任务详情失败",imageDurableOnly:"任务图片只支持当前 Durable 消息",centerClosed:"任务中心已关闭"}}},43305:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>f});var d=c(52834);c(49147);var e=c(4527);function f({error:a,reset:b}){return(0,d.jsx)(e.L1ErrorPage,{retry:b})}},48452:(a,b,c)=>{"use strict";c.d(b,{Y:()=>f,n:()=>e});var d=c(59473);let e="X-Pi-Desk-Client-Id",f=d.Yj().uuid()},51601:(a,b,c)=>{"use strict";c.d(b,{p:()=>d});let d={en:{previewTitle:"Project preview",chooseProject:"Open a project",switchProject:"Switch project",directoryPath:"Directory path",directoryPlaceholder:"Enter an absolute directory path",serverDirectoryHint:"Browse directories on the connected server.",openProject:"Open",recentProjects:"Project history",browseDirectories:"Browse directories",loadingDirectories:"Loading directories…",parentDirectory:"Parent directory",directoryRoots:"Directories",openThisDirectory:"Open this directory",noSubdirectories:"No subdirectories",noRecentProjects:"No project history. Enter a path or browse directories.",currentHead:"Current HEAD",localBranch:"Local branch",remoteBranch:"Remote branch \xb7 local record",retry:"Retry",compareDirect:"Compare directly",loadingCommits:"Loading commits…",commitList:"Git commits",noCommitMessage:"(no commit message)",noMatchingCommits:"No matching commits",noCommits:"No commits",scanLimit:"History scan limit reached. Choose a more specific branch or commit.",loadedLimit:"2,000 commits loaded. Narrow your search.",noMoreCommits:"All commits loaded",backCommits:"Back to commits",commitChanges:"Commit changes",cumulativeChanges:"Cumulative changes",loadedFiles:"{{count}} files loaded",backCumulative:"Back to cumulative changes",loadingChanges:"Loading changes…",noDiff:"No file differences",loadMoreFiles:"Load more files",changesLimit:"Change file display limit reached.",commitDetails:"Commit details",copySha:"Copy commit SHA",compareParent:"Compare parent commit",parentCommit:"Parent {{count}} \xb7 {{oid}}",mergeBaseToTarget:"Common ancestor → target commit",baseToTarget:"Base commit → target commit",emptyRevision:"Empty revision",selectCommit:"Select a commit to view its details",historyAndCompare:"Git history and comparison",viewMode:"Git view mode",historyMode:"Commit history",compareMode:"Compare branches",selectRepository:"Select repository",viewBranch:"View branch",baseBranch:"Base branch",chooseBase:"Choose base branch",targetBranch:"Target branch",comparison:"Comparison method",introducedChanges:"Changes introduced by this branch",directComparison:"Compare two versions directly",filterAuthor:"Filter by author",author:"Commit author",searchCommits:"Search commit message or SHA",refreshGit:"Refresh Git history",localRecord:"Local record",refUnavailable:"Reference unavailable",aheadBehind:"{{ahead}} ahead \xb7 {{behind}} behind",chooseBaseBranch:"Choose a base branch",restoreGit:"Restore Git panel",maximizeGit:"Maximize Git panel",collapseGit:"Collapse Git panel",copyFailed:"Could not copy",findingGit:"Detecting Git repositories…",noGit:"No Git repository found",collapseDirectory:"Collapse folder tree",expandDirectory:"Expand folder tree",previewDescription:"Read-only preview of project files and Git history",gitRecords:"Git history",refreshPreview:"Refresh project preview",restoreWindow:"Restore preview window",maximizeWindow:"Maximize preview window",closePreview:"Close project preview",previewArea:"Project preview area",files:"Files",code:"Code",changeFiles:"Files changed in commit",viewDiff:"View diff",gitStatus:"Git status {{status}}",viewDiffPath:"View diff: {{path}}",historyDiffAncestor:"Common ancestor {{left}} ↔ {{target}}",historyDiffDirect:"{{left}} ↔ {{target}}",historyReadFailed:"Could not read Git history"},"zh-CN":{previewTitle:"项目预览",chooseProject:"打开项目",switchProject:"切换项目",directoryPath:"目录路径",directoryPlaceholder:"输入完整目录路径",serverDirectoryHint:"选择所连接服务上的目录。",openProject:"打开",recentProjects:"历史项目",browseDirectories:"浏览目录",loadingDirectories:"正在读取目录…",parentDirectory:"上级目录",directoryRoots:"目录",openThisDirectory:"打开此目录",noSubdirectories:"没有子目录",noRecentProjects:"没有历史项目,可输入路径或浏览目录。",currentHead:"当前 HEAD",localBranch:"本地分支",remoteBranch:"远程分支 \xb7 本地记录",retry:"重试",compareDirect:"直接比较",loadingCommits:"读取提交…",commitList:"Git 提交列表",noCommitMessage:"(无提交说明)",noMatchingCommits:"没有匹配的提交",noCommits:"没有提交记录",scanLimit:"历史扫描达到上限,请选择更具体的分支或提交。",loadedLimit:"已加载 2000 条,请缩小查询范围。",noMoreCommits:"已加载全部提交",backCommits:"返回提交列表",commitChanges:"提交变更",cumulativeChanges:"累计变更",loadedFiles:"已加载 {{count}} 个文件",backCumulative:"返回累计变更",loadingChanges:"读取变更…",noDiff:"没有文件差异",loadMoreFiles:"加载更多文件",changesLimit:"变更文件超过显示上限。",commitDetails:"提交详情",copySha:"复制提交SHA",compareParent:"比较父提交",parentCommit:"父提交 {{count}} \xb7 {{oid}}",mergeBaseToTarget:"共同祖先 → 目标提交",baseToTarget:"基准提交 → 目标提交",emptyRevision:"空版本",selectCommit:"选择提交查看详情",historyAndCompare:"Git 历史与比较",viewMode:"Git 查看方式",historyMode:"提交记录",compareMode:"分支比较",selectRepository:"查看仓库",viewBranch:"查看分支",baseBranch:"基准分支",chooseBase:"选择基准分支",targetBranch:"目标分支",comparison:"比较方式",introducedChanges:"本分支引入的变更",directComparison:"两个版本直接比较",filterAuthor:"按提交用户筛选",author:"提交用户",searchCommits:"搜索提交说明或 SHA",refreshGit:"刷新Git记录",localRecord:"本地记录",refUnavailable:"引用不可用",aheadBehind:"领先 {{ahead}} \xb7 落后 {{behind}}",chooseBaseBranch:"选择基准分支",restoreGit:"还原Git区域",maximizeGit:"最大化Git区域",collapseGit:"收起Git区域",copyFailed:"复制失败",findingGit:"正在识别 Git 仓库…",noGit:"未发现 Git 仓库",collapseDirectory:"收起目录",expandDirectory:"展开目录",previewDescription:"只读项目文件和 Git 历史预览",gitRecords:"Git 记录",refreshPreview:"刷新项目预览",restoreWindow:"还原预览窗口",maximizeWindow:"最大化预览窗口",closePreview:"关闭项目预览",previewArea:"项目预览区域",files:"文件",code:"代码",changeFiles:"提交变更文件",viewDiff:"查看差异",gitStatus:"Git 状态 {{status}}",viewDiffPath:"查看差异 {{path}}",historyDiffAncestor:"共同祖先 {{left}} ↔ {{target}}",historyDiffDirect:"{{left}} ↔ {{target}}",historyReadFailed:"读取 Git 历史失败"}}},53085:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,58044,23)),Promise.resolve().then(c.bind(c,23579))},56951:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>d});let d=(0,c(68032).registerClientReference)(function(){throw Error("Attempted to call the default export of \"/home/runner/work/pi-desk/pi-desk/src/app/error.tsx\" from the server, but it's on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"/home/runner/work/pi-desk/pi-desk/src/app/error.tsx","default")},59582:(a,b,c)=>{"use strict";c.d(b,{Bc:()=>m,ZI:()=>p,k$:()=>o,m_:()=>n});var d=c(52834),e=c(92108),f=c(60426),g=c(61604),h=c(69032),i=c(62288),j=c(15672),k=c(42582),l=c(15620);function m({delay:a=0,...b}){return(0,d.jsx)(e.B,{"data-slot":"tooltip-provider",delay:a,...b})}function n({...a}){return(0,d.jsx)(f.s,{"data-slot":"tooltip",...a})}function o({...a}){return(0,d.jsx)(g.k,{"data-slot":"tooltip-trigger",...a})}function p({className:a,side:b="top",sideOffset:c=4,align:e="center",alignOffset:f=0,children:g,...m}){return(0,d.jsx)(h.K,{children:(0,d.jsx)(i.o,{align:e,alignOffset:f,side:b,sideOffset:c,className:"isolate z-50",children:(0,d.jsxs)(j.o,{"data-slot":"tooltip-content",className:(0,l.cn)("z-50 inline-flex w-fit max-w-xs origin-(--transform-origin) items-center gap-2 rounded-md bg-foreground px-2 py-1 text-xs leading-5 text-background duration-100 motion-reduce:animate-none has-data-[slot=kbd]:pr-1.5 data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-sm data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",a),...m,children:[g,(0,d.jsx)(k.P,{className:"z-50 size-2.5 translate-y-[calc(-50%-2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground data-[side=bottom]:top-1 data-[side=inline-end]:top-1/2! data-[side=inline-end]:-left-1 data-[side=inline-end]:-translate-y-1/2 data-[side=inline-start]:top-1/2! data-[side=inline-start]:-right-1 data-[side=inline-start]:-translate-y-1/2 data-[side=left]:top-1/2! data-[side=left]:-right-1 data-[side=left]:-translate-y-1/2 data-[side=right]:top-1/2! data-[side=right]:-left-1 data-[side=right]:-translate-y-1/2 data-[side=top]:-bottom-2.5"})]})})})}},59587:(a,b,c)=>{"use strict";c.d(b,{Jz:()=>g,bm:()=>n,iT:()=>i,sd:()=>j});var d=c(59473),e=c(2002),f=c(24187);let g=d.Yj().min(32).max(128).regex(/^[A-Za-z0-9_-]+$/),h="/api/plugins/host-runtime/v1",i=Object.freeze({imports:Object.freeze({react:`${h}/base.js`,"react/jsx-runtime":`${h}/base.js`,"react/jsx-dev-runtime":`${h}/base.js`,"react-dom":`${h}/base.js`,"react-dom/client":`${h}/base.js`,"@jetcrab/pi-desk-sdk/react/base":`${h}/base.js`,"@jetcrab/pi-desk-sdk/react/markdown":`${h}/markdown.js`})}),j=d.eu("v1"),k=d.Ik({pluginName:f.tv,url:d.Yj().regex(/^\/api\/plugins\/browser-resources\/[A-Za-z0-9_-]{32,128}\/entry\.js$/,"Browser Entry URL 无效")}).strict(),l=d.Ik({}).strict(),m=d.Ik({entries:d.YO(k)}).strict(),n=Object.freeze({list:(0,e.Vc)({path:"plugins/browser-entries/list",inputSchema:l,outputSchema:m})})},60141:(a,b,c)=>{"use strict";function d(){let a=globalThis.crypto;if("function"==typeof a.randomUUID)return a.randomUUID();let b=a.getRandomValues(new Uint8Array(16));b[6]=15&b[6]|64,b[8]=63&b[8]|128;let c=Array.from(b,a=>a.toString(16).padStart(2,"0")).join("");return`${c.slice(0,8)}-${c.slice(8,12)}-${c.slice(12,16)}-${c.slice(16,20)}-${c.slice(20)}`}c.d(b,{y:()=>d})},60632:(a,b,c)=>{"use strict";c.d(b,{P:()=>d});let d={en:{imagePreview:"Skill image preview",chooseFile:"Select a Skill file",chooseFileDescription:"Choose a Skill from your projects to view or edit its instructions, scripts and reference files.",global:"Global",project:"Project",package:"Package",local:"Local",saving:"Saving",switchingFile:"Switching files",unsavedChanges:"Unsaved changes",readOnlyFile:"Read-only file",fileSaved:"File saved",unsaved:"Unsaved",readOnly:"Read-only",saved:"Saved",copySkillPath:"Copy Skill file path",copyPath:"Copy file path",saveSkill:"Save Skill file",save:"Save",reload:"Reload",loadingFile:"Loading file…",fileSize:"{{size}} bytes",saveShortcut:"Ctrl / ⌘ S to save",wrapLines:"Wrap lines",retryFolder:"Retry folder",loadingFolder:"Loading folder…",skillFile:"Skill file: {{path}}",skillName:"Skill: {{name}}",emptyFolder:"Empty folder",folderTruncated:"Too many entries; showing part of the folder.",skillFolder:"Skill folder: {{path}}",packageSkill:"Skill from a package",globalSkills:"Global Skills",projectSkills:"Project Skills: {{name}}",skillsGroup:"Skills group: {{name}}",retryGroup:"Retry group",noSkillMatches:"No matching Skills in this group",noSkills:"No Skills found in this group",diagnostics_one:"{{count}} resource diagnostic",diagnostics_other:"{{count}} resource diagnostics",searchSkills:"Search projects or Skills",searchSkillsPlaceholder:"Search projects or Skills…",workspaceCount_one:"Current workspace \xb7 {{count}} project",workspaceCount_other:"Current workspace \xb7 {{count}} projects",workspaceEmpty:"No projects in this workspace. Global Skills are still available.",pathCopied:"File path copied",copyFailed:"Could not copy. Check browser clipboard permission.",skillsManagement:"Manage Skills",openSkillsFolder:"Open Skills folder",collapseSkillsFolder:"Collapse Skills folder",expandSkillsFolder:"Expand Skills folder",refreshSkillsFolder:"Refresh Skills folder",refreshFolder:"Refresh folder",skillsProjectFolder:"Skills project folder",skillsFolderTitle:"Skills folder",saveChangesTitle:"Save file changes?",saveChangesDescription:"Changes to {{path}} are not saved.",cancel:"Cancel",discard:"Discard changes",savingChanges:"Saving…",saveContinue:"Save and continue",saveFailed:"Could not save file",fileReadFailed:"Could not read file",skillsReadFailed:"Could not load Skills",directoryReadFailed:"Could not read folder"},"zh-CN":{imagePreview:"Skill 图片预览",chooseFile:"选择一个 Skill 文件",chooseFileDescription:"从项目目录中选择 Skill,查看和编辑它的说明、脚本与参考文件。",global:"全局",project:"项目",package:"包",local:"本地",saving:"正在保存",switchingFile:"正在切换文件",unsavedChanges:"有未保存修改",readOnlyFile:"文件只读",fileSaved:"文件已保存",unsaved:"未保存",readOnly:"只读",saved:"已保存",copySkillPath:"复制 Skill 文件路径",copyPath:"复制文件路径",saveSkill:"保存 Skill 文件",save:"保存",reload:"重新读取",loadingFile:"正在读取文件…",fileSize:"{{size}} 字节",saveShortcut:"Ctrl / ⌘ S 保存",wrapLines:"自动换行",retryFolder:"重试目录",loadingFolder:"正在读取目录…",skillFile:"Skill 文件:{{path}}",skillName:"Skill:{{name}}",emptyFolder:"空目录",folderTruncated:"目录项过多,仅显示部分内容。",skillFolder:"Skill 目录:{{path}}",packageSkill:"包提供的 Skill",globalSkills:"全局 Skills",projectSkills:"项目 Skills:{{name}}",skillsGroup:"Skills 分组:{{name}}",retryGroup:"重试分组",noSkillMatches:"此分组没有匹配的 Skill",noSkills:"此分组没有发现 Skills",diagnostics_one:"{{count}} 项资源诊断",diagnostics_other:"{{count}} 项资源诊断",searchSkills:"搜索项目或 Skill",searchSkillsPlaceholder:"搜索项目或 Skill…",workspaceCount_one:"当前工作区 \xb7 {{count}} 个项目",workspaceCount_other:"当前工作区 \xb7 {{count}} 个项目",workspaceEmpty:"工作区暂无项目,仍可管理全局 Skills。",pathCopied:"文件路径已复制",copyFailed:"复制失败,请检查浏览器剪贴板权限",skillsManagement:"Skills 管理",openSkillsFolder:"打开 Skills 目录",collapseSkillsFolder:"收起 Skills 目录",expandSkillsFolder:"展开 Skills 目录",refreshSkillsFolder:"刷新 Skills 目录",refreshFolder:"刷新目录",skillsProjectFolder:"Skills 项目目录",skillsFolderTitle:"Skills 目录",saveChangesTitle:"保存文件修改?",saveChangesDescription:"{{path}} 的修改尚未保存。",cancel:"取消",discard:"放弃修改",savingChanges:"正在保存…",saveContinue:"保存并继续",saveFailed:"保存失败",fileReadFailed:"读取文件失败",skillsReadFailed:"读取 Skills 失败",directoryReadFailed:"读取目录失败"}}},61035:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{J:()=>l});var e=c(77598),f=c(73024),g=c(76760),h=c(75430),i=c(41904),j=a([h]);function k(){let a=Intl.DateTimeFormat().resolvedOptions();return i.J.parse({region:{locale:a.locale.toLowerCase().startsWith("zh")?"zh-CN":"en",timeZone:a.timeZone||"UTC"}})}h=(j.then?(await j)():j)[0];class m{constructor(a=(0,g.join)((0,h.getAgentDir)(),"pi-desk-settings.json"),b=k){this.path=a,this.defaults=b,this.snapshot=null,this.listeners=new Set,this.tail=Promise.resolve()}getSnapshot(){if(!this.snapshot)if((0,f.existsSync)(this.path))this.snapshot=i.J.parse(JSON.parse((0,f.readFileSync)(this.path,"utf8")));else{let a=i.J.parse(this.defaults());this.save(a),this.snapshot=a}return this.snapshot}subscribe(a){return this.listeners.add(a),()=>this.listeners.delete(a)}update(a){let b=this.tail.then(()=>{let b=this.getSnapshot(),c=i.J.parse({region:{...b.region,...a}});if(JSON.stringify(b)!==JSON.stringify(c))for(let a of(this.save(c),this.snapshot=c,console.info("[Pi Desk][Settings] 共享地区设置已保存",c.region),this.listeners))try{a()}catch(a){console.error("[Pi Desk][Settings] 设置订阅回调失败",{message:a instanceof Error?a.message:String(a)})}});return this.tail=b.catch(()=>void 0),b}save(a){(0,f.mkdirSync)((0,g.dirname)(this.path),{recursive:!0});let b=`${this.path}.${process.pid}.${(0,e.randomUUID)()}.tmp`;try{(0,f.writeFileSync)(b,`${JSON.stringify(a,null,2)}
30
30
  `,"utf8"),(0,f.renameSync)(b,this.path)}finally{(0,f.existsSync)(b)&&(0,f.unlinkSync)(b)}}}function l(){return globalThis.__piDeskHostSettingsStore??=new m}d()}catch(a){d(a)}})},64669:(a,b,c)=>{"use strict";c.d(b,{L1AppProviders:()=>d});let d=(0,c(68032).registerClientReference)(function(){throw Error("Attempted to call L1AppProviders() from the server but L1AppProviders is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"/home/runner/work/pi-desk/pi-desk/src/client/l1_entry/providers/l1-app-providers.tsx","L1AppProviders")},68005:(a,b,c)=>{"use strict";c.d(b,{Y8:()=>e,c4:()=>g,nD:()=>d,qD:()=>f});let d=["compact","standard","large"],e="compact",f="pi-desk:display-size",g="pi-super:work-session-visual"},70961:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>d});let d=(0,c(68032).registerClientReference)(function(){throw Error("Attempted to call the default export of \"/home/runner/work/pi-desk/pi-desk/src/app/global-error.tsx\" from the server, but it's on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"/home/runner/work/pi-desk/pi-desk/src/app/global-error.tsx","default")},72062:(a,b,c)=>{"use strict";c.d(b,{Cy:()=>j,Is:()=>h,VS:()=>i,rg:()=>k});var d=c(52834);c(49147);var e=c(84524);let f="pi-desk:theme-change",g=null;function h(){if(null!==g)return g;try{let a=window.localStorage.getItem(e.Tb);g=(0,e.Wv)(a)?a:e.Pl}catch{g=e.Pl}return g}function i(a){let b;g=a;try{window.localStorage.setItem(e.Tb,a)}catch{}b=(0,e.Mj)(a,window.matchMedia("(prefers-color-scheme: dark)").matches),document.documentElement.classList.toggle("dark","dark"===b),document.documentElement.style.colorScheme=b,window.dispatchEvent(new Event(f))}function j(a){let b=b=>{b.key===e.Tb&&(g=(0,e.Wv)(b.newValue)?b.newValue:e.Pl,a())};return window.addEventListener(f,a),window.addEventListener("storage",b),()=>{window.removeEventListener(f,a),window.removeEventListener("storage",b)}}function k({children:a}){return(0,d.jsx)(d.Fragment,{children:a})}},74405:(a,b,c)=>{Promise.resolve().then(c.bind(c,43305))},76665:(a,b,c)=>{Promise.resolve().then(c.bind(c,21147))},79958:(a,b,c)=>{"use strict";c.d(b,{Pl:()=>e,Tb:()=>d});let d="pi-super-theme",e="dark"},82117:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>f});var d=c(89564),e=c(88893);function f(){return(0,d.jsx)(e.L1ErrorPage,{notFound:!0})}},84074:(a,b,c)=>{"use strict";c.d(b,{$y:()=>i,Ev:()=>h,Zi:()=>k,wm:()=>j});var d=c(52834);c(49147);var e=c(2191);let f="pi-desk:display-size-change",g=null;function h(){if(null!==g)return g;try{let a=window.localStorage.getItem(e.qD),b=null===a?JSON.parse(window.localStorage.getItem(e.c4)??"null"):null;g=(0,e.eN)(a,b)}catch{g=e.Y8}return g}function i(a){g=a;try{window.localStorage.setItem(e.qD,a)}catch{}document.documentElement.dataset.piDeskDisplaySize=a,window.dispatchEvent(new Event(f))}function j(a){let b=b=>{(null===b.key||b.key===e.qD||b.key===e.c4)&&(g=null,a())};return window.addEventListener(f,a),window.addEventListener("storage",b),()=>{window.removeEventListener(f,a),window.removeEventListener("storage",b)}}function k({children:a}){return(0,d.jsx)(d.Fragment,{children:a})}},84524:(a,b,c)=>{"use strict";c.d(b,{Mj:()=>h,Pl:()=>e,Tb:()=>d,Wv:()=>g});let d="pi-super-theme",e="dark",f=["system","light","dark"];function g(a){return f.some(b=>b===a)}function h(a,b){return"system"===a?b?"dark":"light":a}},88893:(a,b,c)=>{"use strict";c.d(b,{L1ErrorPage:()=>d});let d=(0,c(68032).registerClientReference)(function(){throw Error("Attempted to call L1ErrorPage() from the server but L1ErrorPage is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"/home/runner/work/pi-desk/pi-desk/src/client/l1_entry/pages/l1-error-page.tsx","L1ErrorPage")},89172:(a,b,c)=>{"use strict";c.d(b,{C:()=>d});let d={en:{reading:"Loading…",retryReading:"{{error}}. Retry",showMore:"Show more ({{visible}} / {{total}})",viewDiff:"View diff",openPreview:"Open preview",gitStatus:"Git status {{status}}",directoryLimit:"This folder has many entries. Showing the first 5,000; use search to find more.",emptyDirectory:"Empty folder",incompleteRepository:"Some repositories could not be read. The change list may be incomplete.",noChangedFiles:"No changed files",noChanges:"No changes",gitBranches:"Git branches",gitBranchReadOnly:"Git branch (read-only)",selectPreviewDirectory:"Switch preview directory",previewDirectories:"Preview directories",sessionDirectory:"Original folder",unavailable:"Unavailable",projectFiles:"{{name}} project files",searchFiles:"Search filenames or paths",searchAll:"Search files or content",searchContent:"Search file content",searchScope:"Search scope",searchScopeAll:"All",searchScopeFiles:"Files",searchScopeContent:"Content",searchCaseSensitive:"Match case",searchWholeWord:"Match whole word",searchRegex:"Use regular expression",searchResults:"Search results",searchStart:"Search this project",searchTryOptions:"Try another query or adjust the search options.",searchFailed:"Could not search the project. Please try again.",searchCounts:"{{files}} files \xb7 {{lines}} matching lines",searchShownCounts:"Shown: {{counts}}",searchFileHeading:"Filenames",searchContentHeading:"Content",searchContentCounts:"{{lines}} matching lines \xb7 {{files}} files",searchProjectRoot:"Project root",searchExpandFiles:"Show {{count}} more files",searchOpenLine:"Open {{path}}, line {{line}}",searchLineUnavailable:"The file content has changed and the matching line no longer exists.",searchTextLimit:"Content search: previewable UTF-8 text up to 5 MiB.",closeSearch:"Exit search",layout:"File organization",directory:"Folders",repository:"Repositories",changesOnly:"Changes only",searchProject:"Search project",noMatches:"No matching results",searching:"Searching…",resultLimit:"Results are limited. Refine your query or narrow the search scope.",copied:"Copied.",copyFailed:"Could not copy. Please try again.",revealRequested:"Opened the system file manager.",revealFailed:"Could not locate the file",collapse:"Collapse",expand:"Expand",openCurrentWorkspace:"Open current workspace folder",locateCurrentWorkspace:"Locate in current workspace",openFolder:"Open this folder",openContainingFolder:"Open containing folder",copyAbsolutePath:"Copy absolute path",copyRelativePath:"Copy relative path",copyFolderName:"Copy folder name",copyFileName:"Copy filename",copyOldRelativePath:"Copy original relative path",selectedCodeCopied:"Selected code copied.",allCodeCopied:"All code copied.",copyContentFailed:"Could not copy the file. Please copy it manually.",fileActions:"File actions",headToWorking:"HEAD ↔ working tree",gitChangesCount:"Against HEAD \xb7 {{count}} changes",gitChangesCompact:"{{count}} changes",gitMarkersLoading:"Comparing with HEAD…",gitMarkersFailed:"Could not read changes \xb7 Reload to retry",gitMarkersUnavailable:"Line change markers unavailable",gitAddedLines:"{{count}} lines added",gitModifiedLines:"{{count}} lines modified",gitDeletedLines:"{{count}} lines deleted",noDiffChanges:" \xb7 No content differences",previousChange:"Previous change",nextChange:"Next change",inlineDiff:"Switch to inline diff",sideBySideDiff:"Switch to side-by-side diff",wrapOff:"Turn off line wrapping",wrapOn:"Turn on line wrapping",expandUnchanged:"Expand unchanged content",collapseUnchanged:"Collapse unchanged content",reloadDiff:"Reload diff",htmlMode:"HTML display mode",markdownMode:"Markdown display mode",markdownPreview:"{{name}} Markdown preview",previewMode:"Preview",sourceMode:"Source",findInFile:"Find in file",goToLine:"Go to line",copySelectionOrAll:"Copy selected or all content",reloadCurrentFile:"Reload this file",binaryDiffUnavailable:"Binary files cannot be diffed online.",largeDiffUnavailable:"Files over 5 MB cannot be diffed online.",readAgain:"Reload",noOpenFile:"No file open",imageViewer:"{{name}} image viewer",htmlPreview:"{{name}} HTML preview",loadingFile:"Loading file…",closeTab:"Close tab",closeOtherTabs:"Close other tabs",closeRightTabs:"Close tabs to the right",closeLeftTabs:"Close tabs to the left",closeAllTabs:"Close all tabs",openFiles:"Open files",closeDiff:"Close diff {{name}}",closeFile:"Close file {{name}}",collapseTabs:"Collapse tabs",expandTabs:"Expand tabs \xb7 {{count}}",gitUnavailable:"Git unavailable",repositoriesUnit:"repositories",projectReadFailed:"Could not read project",revealUnavailable:"File location is not available yet",maxOpenFiles:"At most {{count}} files can be open. Close some files first.",branchFileClosed:"File no longer exists on the selected branch and was closed: {{path}}"},"zh-CN":{reading:"正在读取…",retryReading:"{{error}},点击重试",showMore:"显示更多({{visible}} / {{total}})",viewDiff:"查看差异",openPreview:"打开预览",gitStatus:"Git 状态 {{status}}",directoryLimit:"该目录内容较多,仅显示前 5000 项,请使用搜索。",emptyDirectory:"空目录",incompleteRepository:"仓库读取不完整,无法确认全部变更",noChangedFiles:"没有变更文件",noChanges:"没有变更",gitBranches:"Git 分支",gitBranchReadOnly:"Git 分支(只读)",selectPreviewDirectory:"切换预览目录",previewDirectories:"预览目录",sessionDirectory:"原目录",unavailable:"不可用",projectFiles:"{{name}} 项目文件",searchFiles:"搜索文件名或路径",searchAll:"搜索文件或内容",searchContent:"搜索文件内容",searchScope:"搜索范围",searchScopeAll:"全部",searchScopeFiles:"文件",searchScopeContent:"内容",searchCaseSensitive:"区分大小写",searchWholeWord:"全词匹配",searchRegex:"使用正则表达式",searchResults:"搜索结果",searchStart:"搜索这个项目",searchTryOptions:"试试其他关键词,或调整搜索选项。",searchFailed:"项目搜索失败,请重试。",searchCounts:"{{files}} 个文件 \xb7 {{lines}} 个命中行",searchShownCounts:"已显示:{{counts}}",searchFileHeading:"文件名",searchContentHeading:"内容",searchContentCounts:"{{lines}} 个命中行 \xb7 {{files}} 个文件",searchProjectRoot:"项目根目录",searchExpandFiles:"展开其余 {{count}} 个文件",searchOpenLine:"打开 {{path}} 第 {{line}} 行",searchLineUnavailable:"文件内容已变化,搜索命中行已不存在",searchTextLimit:"正文搜索:可预览的 UTF-8 文本,不超过 5 MiB。",closeSearch:"退出搜索",layout:"文件组织方式",directory:"目录",repository:"仓库",changesOnly:"只看变更",searchProject:"搜索项目",noMatches:"没有匹配结果",searching:"正在搜索…",resultLimit:"结果较多,已截断显示。请细化关键词或缩小搜索范围。",copied:"已复制。",copyFailed:"复制失败,请重试。",revealRequested:"已请求运行端文件管理器定位。",revealFailed:"系统定位失败",collapse:"收起",expand:"展开",openCurrentWorkspace:"打开当前工作区目录",locateCurrentWorkspace:"在当前工作区定位",openFolder:"打开此文件夹",openContainingFolder:"打开所在文件夹",copyAbsolutePath:"复制绝对路径",copyRelativePath:"复制相对路径",copyFolderName:"复制目录名",copyFileName:"复制文件名",copyOldRelativePath:"复制原相对路径",selectedCodeCopied:"已复制选中代码。",allCodeCopied:"已复制全部代码。",copyContentFailed:"复制文件内容失败,请手动复制。",fileActions:"文件操作",headToWorking:"HEAD ↔ 工作区",gitChangesCount:"相对 HEAD \xb7 {{count}} 处变更",gitChangesCompact:"{{count}} 处变更",gitMarkersLoading:"正在与 HEAD 比较…",gitMarkersFailed:"变更读取失败 \xb7 刷新重试",gitMarkersUnavailable:"此文件无法显示行变更",gitAddedLines:"新增 {{count}} 行",gitModifiedLines:"修改 {{count}} 行",gitDeletedLines:"删除 {{count}} 行",noDiffChanges:" \xb7 当前比较无内容差异",previousChange:"上一个变更",nextChange:"下一个变更",inlineDiff:"切换为单栏 Diff",sideBySideDiff:"切换为左右 Diff",wrapOff:"关闭自动换行",wrapOn:"开启自动换行",expandUnchanged:"展开未变更内容",collapseUnchanged:"折叠未变更内容",reloadDiff:"重新加载 Diff",htmlMode:"HTML 显示方式",markdownMode:"Markdown 显示方式",markdownPreview:"{{name}} Markdown 预览",previewMode:"预览",sourceMode:"源码",findInFile:"在文件中查找",goToLine:"跳转到行",copySelectionOrAll:"复制选中内容或全部",reloadCurrentFile:"重新加载当前文件",binaryDiffUnavailable:"二进制文件暂不支持在线 Diff。",largeDiffUnavailable:"文件超过 5MB,暂不支持在线 Diff。",readAgain:"重新读取",noOpenFile:"尚未打开文件",imageViewer:"{{name}} 图片查看器",htmlPreview:"{{name}} HTML 预览",loadingFile:"正在读取文件…",closeTab:"关闭标签",closeOtherTabs:"关闭其他标签",closeRightTabs:"关闭右侧标签",closeLeftTabs:"关闭左侧标签",closeAllTabs:"关闭全部标签",openFiles:"已打开文件",closeDiff:"关闭 Diff {{name}}",closeFile:"关闭文件 {{name}}",collapseTabs:"收起标签",expandTabs:"展开标签 \xb7 {{count}}",gitUnavailable:"Git 不可用",repositoriesUnit:"个仓库",projectReadFailed:"读取项目失败",revealUnavailable:"系统定位尚未准备好",maxOpenFiles:"最多打开 {{count}} 个文件,请先关闭部分文件",branchFileClosed:"文件在切换后的分支中不存在,已关闭:{{path}}"}}},92991:(a,b,c)=>{"use strict";c.d(b,{n:()=>d});let d={en:{common:{system:"Follow system",chinese:"简体中文",english:"English",unavailable:"Unavailable",close:"Close",closeDialog:"Close dialog",selectPlaceholder:"Select an option",searchPlaceholder:"Search…",noMatches:"No matches",cancel:"Cancel",delete:"Delete",retry:"Retry",save:"Save",reload:"Reload",loading:"Loading…",today:"Today",yesterday:"Yesterday",localeError:"Language settings could not be saved.",timeZoneError:"Time zone settings could not be saved.",languagePending:"Reload this page to use the selected language.",languagePendingNotice:"Language changed. Reload from settings when you are ready.",reloadConfirm:"Reload the page to change language? Unsaved changes in plugins may be lost.",reloadBlocked:"The draft could not be saved or a message send is still unresolved. Please try again later.",unknownError:"Something went wrong",errorDetails:"Error details",pluginNotice:"Plugin notification",closeNotice:"Close notification",duplicateRequest:"This request is already being processed",tooManyRequests:"Too many requests on this connection",socketUnavailable:"The connection is not ready",serverRequestFailed:"The server could not process this request",notFound:"Page not found",pageError:"This page could not be loaded",backHome:"Back to the workspace",recover:"Try again",authenticationRequired:"Please sign in",authUnavailable:"Sign-in service is not ready",shuttingDown:"The service is shutting down",markdownPending:"Not completed",markdownCompleted:"Completed",markdownProgress:"In progress",markdownNote:"Note",markdownTip:"Tip",markdownImportant:"Important",markdownWarning:"Warning",markdownCaution:"Caution",codeReadOnly:"Read-only code file",codeLoading:"Loading code viewer…",codeFailed:"Could not load code viewer. Reopen the file.",skillEditor:"Skill file editor",editorLoading:"Loading editor…",editorFailed:"Could not load editor. Reopen the file.",gitDiffReadOnly:"Read-only Git diff",diffStatus:"Diff calculation status",diffCalculating:"Calculating differences…",diffCount_one:"{{count}} difference",diffCount_other:"{{count}} differences",diffLoading:"Loading diff…",diffFailed:"Could not load diff viewer. Reopen the file.",showPassword:"Show password",hidePassword:"Hide password",revealSecret:"Show text",hideSecret:"Hide text",socketConnectFailed:"WebSocket connection failed",socketDisconnected:"WebSocket connection closed",socketNotConnected:"WebSocket is not connected",socketRequestTimeout:"WebSocket request timed out: {{path}}",socketSendFailed:"Could not send WebSocket request",socketResponseMismatch:"WebSocket response did not match the request",socketResponseInvalid:"Invalid WebSocket response data",dbOpenTimeout:"Opening local chat storage timed out. Refresh the page and try again.",dbOpenBlocked:"Another Pi Desk tab is blocking local chat storage. Close that tab and try again.",dbOpenFailed:"Could not open local chat storage",dbDeleteTimeout:"Clearing local chat storage timed out. Close other Pi Desk tabs and try again.",dbDeleteBlocked:"Another Pi Desk tab is blocking local chat storage cleanup. Close that tab and try again.",dbDeleteFailed:"Could not clear local chat storage",dbRequestFailed:"Local chat storage request failed",dbTransactionAborted:"Local chat storage transaction was aborted",dbTransactionFailed:"Local chat storage transaction failed"}},"zh-CN":{common:{system:"跟随系统",chinese:"简体中文",english:"English",unavailable:"暂不可用",close:"关闭",closeDialog:"关闭弹窗",selectPlaceholder:"请选择",searchPlaceholder:"搜索…",noMatches:"没有匹配结果",cancel:"取消",delete:"删除",retry:"重试",save:"保存",reload:"重新加载",loading:"正在加载…",today:"今天",yesterday:"昨天",localeError:"语言设置未能保存。",timeZoneError:"时区设置未能保存。",languagePending:"重新加载页面以使用所选语言。",languagePendingNotice:"语言设置已变化,准备好后可在设置中重新加载。",reloadConfirm:"重新加载页面以切换语言?插件中未保存的内容可能丢失。",reloadBlocked:"草稿保存失败或消息发送结果尚未确定,请稍后重试。",unknownError:"操作失败",errorDetails:"错误详情",pluginNotice:"插件通知",closeNotice:"关闭提示",duplicateRequest:"requestId 正在处理中",tooManyRequests:"当前连接并发请求过多",socketUnavailable:"应用 WebSocket 尚未就绪",serverRequestFailed:"服务端请求处理失败",notFound:"找不到页面",pageError:"页面暂时无法加载",backHome:"返回工作台",recover:"重试",authenticationRequired:"请先登录",authUnavailable:"登录认证尚未就绪",shuttingDown:"服务正在关闭",markdownPending:"未完成",markdownCompleted:"已完成",markdownProgress:"进行中",markdownNote:"说明",markdownTip:"提示",markdownImportant:"重要",markdownWarning:"警告",markdownCaution:"注意",codeReadOnly:"只读代码文件",codeLoading:"正在加载代码查看器…",codeFailed:"代码查看器加载失败,请重新打开文件。",skillEditor:"Skill 文件编辑器",editorLoading:"正在加载编辑器…",editorFailed:"编辑器加载失败,请重新打开文件。",gitDiffReadOnly:"只读 Git Diff",diffStatus:"差异计算状态",diffCalculating:"正在计算差异…",diffCount_one:"{{count}} 处差异",diffCount_other:"{{count}} 处差异",diffLoading:"正在加载 Diff…",diffFailed:"Diff 查看器加载失败,请重新打开。",showPassword:"显示密码",hidePassword:"隐藏密码",revealSecret:"显示原文",hideSecret:"隐藏原文",socketConnectFailed:"WebSocket 连接失败",socketDisconnected:"WebSocket 连接已断开",socketNotConnected:"WebSocket 尚未连接",socketRequestTimeout:"WebSocket 请求超时:{{path}}",socketSendFailed:"WebSocket 请求发送失败",socketResponseMismatch:"WebSocket 响应 path 与请求不一致",socketResponseInvalid:"WebSocket 响应数据无效",dbOpenTimeout:"打开本地聊天数据库超时,请刷新页面后重试",dbOpenBlocked:"本地聊天数据库打开或升级被其他 Pi Desk 页面阻塞,请关闭其他标签页后重试",dbOpenFailed:"打开 IndexedDB 失败",dbDeleteTimeout:"清理本地聊天数据库超时,请关闭其他 Pi Desk 页面后重试",dbDeleteBlocked:"本地聊天数据库清理被其他 Pi Desk 页面阻塞,请关闭其他标签页后重试",dbDeleteFailed:"清理 IndexedDB 失败",dbRequestFailed:"IndexedDB 请求失败",dbTransactionAborted:"IndexedDB 事务已中止",dbTransactionFailed:"IndexedDB 事务失败"}}}},96298:(a,b,c)=>{"use strict";c.d(b,{A:()=>f,O:()=>e});var d=c(49147);let e=(0,d.createContext)(null);function f(){let a=(0,d.useContext)(e);if(null===a)throw Error("缺少页面 clientId Provider");return a}},96436:(a,b,c)=>{"use strict";c.d(b,{W:()=>d,X:()=>e});let d={en:{calls:{title:"Model calls",loadedTitle:"Model calls \xb7 Loaded history",model:"Model",unknownModel:"Unknown model",input:"Input",output:"Output",cached:"Cache",cost:"Cost",error:"Failed",aborted:"Aborted",close:"Close model calls"},nestedCalls:"Nested calls",nestedCallsIncomplete:"Nested calls \xb7 Incomplete record",nestedStatus:{ok:"Completed",error:"Failed",unfinished:"Unfinished"},nestedArguments:"Arguments",nestedArgumentsBytes:"Arguments: {{count}} bytes",image:"Markdown image",imageUnavailable:"Image unavailable",previewImage:"Preview image: {{name}}",imagePreview:"Markdown image preview",codeCopyFailed:"Could not copy code. Please copy it manually.",detailFailed:"Could not load message details",messageCopyFailed:"Could not copy the message. Please copy it manually.",copied:"Copied",copyMessage:"Copy message",usage:"Input {{input}} / Output {{output}} / Cached input {{cached}} / {{cost}}",chatImage:"Chat image {{count}}",imageLoading:"Loading image…",previewImageNumber:"Preview image {{count}}",chatImagePreview:"Chat image preview",expand:"Show full message",collapse:"Collapse",thinking:"Thinking…",thinkingLoading:"Loading thoughts…",thinkingUnavailable:"Thoughts unavailable",thinkingProcess:"Reasoning",thinkingTruncated:"Showing the last {{count}} characters",copyThinking:"Copy full reasoning",streamInterrupted:"The response stream ended before the model completed its answer.",requestTimedOut:"The model did not complete its response in time.",modelFailed:"The model request failed without a detailed error.",toolResult:"{{name}} tool result",tool:"{{name}} tool",expandTool:"Expand {{name}} tool result",collapseTool:"Collapse {{name}} tool result",previewFile:"Preview current file",previewFilePath:"Preview current file: {{path}}",loadingResult:"Loading result…",emptyResult:"The tool result is empty",toolOutput:"Tool output",pideskHelp:"View command help",pideskVersion:"View Pi Desk version",pideskInfo:"View runtime environment",pideskReload:"Reload current session configuration",pideskListPlugins:"View plugins",pideskShowPlugin:"View plugin",pideskInstallPlugin:"Install plugin",pideskRemovePlugin:"Remove plugin",pidesk:{command:"Command",output:"Output",copyCommand:"Copy command",copyOutput:"Copy output",empty:"No output",noPlugins:"No plugins",unknownVersion:"Version unknown",updateChannel:"Following {{tag}}",targetVersion:"Available version {{version}}",restartRequired:"Pi Desk needs to be restarted",pluginDetail:"Plugin details",info:{version:"Version",environment:"Environment",mode:"Mode",cwd:"Project directory",agentDir:"Pi directory",docsDirectory:"Documentation directory"},environment:{development:"Development",production:"Production"},mode:{basic:"Basic mode",normal:"Normal mode"},kind:{package:"Package",extension:"Local extension"},status:{ready:"Loaded",available:"Available",disabled:"Disabled",failed:"Load failed"},action:{add:"Install",update:"Update",del:"Remove",apply:"Load changes"},phase:{queued:"Queued",checking:"Checking",applying:"Applying",waiting:"Waiting",failed:"Failed"},errorPhase:{package:"Package",entry:"Entry",setup:"Initialization",resources:"Resources",resolve:"Resolution",native:"Pi extension"}},loadingRead:"Loading file content…",readUnavailable:"File content unavailable",readEmpty:"File content is empty",readContent:"Read file content",loadingDiff:"Loading file diff…",diffUnavailable:"File diff unavailable",editDiff:"Edited file diff",editResult:"Edit tool result",loadingWrite:"Loading written content…",writeUnavailable:"Written content unavailable",writeEmpty:"Written content is empty",writeContent:"Written file content",writeResult:"Write tool result",emptyMessage:"Empty message",compactionSummary:"Context summary",compactionSummaryContent:"Context summary content",compactionRunning:"Summarizing context…",compactionComplete:"Context summary complete",compactionLoading:"Loading context summary…",compactionUnavailable:"Context summary unavailable",processGroup:"Activity",toolCalls_one:"{{count}} tool call",toolCalls_other:"{{count}} tool calls",viewFailed:"Message view failed to load",viewLoading:"Loading message…",messageContent:"Message content",useBasicPresentation:"Use basic message views",reservedView:"Reserved view",publicSnapshot:"Public snapshot",retry:"Retry",loadDetail:"Load details",declarationFailed:"Server message declaration failed",viewConflict:"Multiple message views have the same highest priority",viewMissing:"No message view registered for {{viewKey}}",nextUserMessage:"Go to next user message",bottom:"Go to bottom of chat",userNavigation:"User message navigation",previousUserMessage:"Go to previous user message",previousUserShort:"Previous user message"},"zh-CN":{calls:{title:"模型调用",loadedTitle:"模型调用 \xb7 已加载记录",model:"模型",unknownModel:"未知模型",input:"输入",output:"输出",cached:"缓存",cost:"费用",error:"失败",aborted:"已中止",close:"关闭模型调用"},nestedCalls:"嵌套调用",nestedCallsIncomplete:"嵌套调用 \xb7 记录未完整",nestedStatus:{ok:"完成",error:"失败",unfinished:"未完成"},nestedArguments:"调用参数",nestedArgumentsBytes:"参数 {{count}} 字节",image:"Markdown 图片",imageUnavailable:"图片暂不可用",previewImage:"预览图片:{{name}}",imagePreview:"Markdown 图片预览",codeCopyFailed:"复制代码失败,请手动复制。",detailFailed:"加载消息详情失败",messageCopyFailed:"复制消息失败,请手动复制。",copied:"已复制",copyMessage:"复制消息",usage:"输入 {{input}} / 输出 {{output}} / 输入缓存 {{cached}} / {{cost}}",chatImage:"聊天图片 {{count}}",imageLoading:"加载图片…",previewImageNumber:"预览第 {{count}} 张图片",chatImagePreview:"聊天图片预览",expand:"展开全文",collapse:"收起",thinking:"正在思考…",thinkingLoading:"正在加载思考内容…",thinkingUnavailable:"思考内容不可用",thinkingProcess:"思考过程",thinkingTruncated:"仅显示最近 {{count}} 个字符",copyThinking:"复制完整思考",streamInterrupted:"模型响应流意外中断:连接在回答完成前被关闭。",requestTimedOut:"模型请求超时:在限定时间内未收到完整响应。",modelFailed:"模型请求失败:服务端未提供具体错误信息。",toolResult:"{{name}} 工具结果",tool:"{{name}} 工具",expandTool:"展开 {{name}} 工具结果",collapseTool:"收起 {{name}} 工具结果",previewFile:"预览当前文件",previewFilePath:"预览当前文件 {{path}}",loadingResult:"正在加载结果…",emptyResult:"工具结果为空",toolOutput:"工具输出",pideskHelp:"查看命令帮助",pideskVersion:"查看 Pi Desk 版本",pideskInfo:"查看运行环境",pideskReload:"重载当前会话配置",pideskListPlugins:"查看插件列表",pideskShowPlugin:"查看插件",pideskInstallPlugin:"安装插件",pideskRemovePlugin:"卸载插件",pidesk:{command:"执行命令",output:"返回内容",copyCommand:"复制命令",copyOutput:"复制返回内容",empty:"无返回内容",noPlugins:"暂无插件",unknownVersion:"版本未知",updateChannel:"跟随 {{tag}}",targetVersion:"候选版本 {{version}}",restartRequired:"需要重启 Pi Desk",pluginDetail:"插件详情",info:{version:"版本",environment:"运行环境",mode:"运行模式",cwd:"项目目录",agentDir:"Pi 目录",docsDirectory:"文档目录"},environment:{development:"开发环境",production:"正式环境"},mode:{basic:"基础模式",normal:"正常模式"},kind:{package:"插件包",extension:"本地扩展"},status:{ready:"已加载",available:"可用",disabled:"已禁用",failed:"加载失败"},action:{add:"安装",update:"更新",del:"卸载",apply:"加载变更"},phase:{queued:"排队中",checking:"检查中",applying:"应用中",waiting:"等待中",failed:"失败"},errorPhase:{package:"插件包",entry:"入口",setup:"初始化",resources:"资源",resolve:"解析",native:"Pi 扩展"}},loadingRead:"正在加载读取内容…",readUnavailable:"读取内容不可用",readEmpty:"读取内容为空",readContent:"read 读取内容",loadingDiff:"正在加载文件差异…",diffUnavailable:"文件差异不可用",editDiff:"edit 文件差异",editResult:"edit 工具结果",loadingWrite:"正在加载写入内容…",writeUnavailable:"写入内容不可用",writeEmpty:"写入内容为空",writeContent:"write 写入内容",writeResult:"write 工具结果",emptyMessage:"空消息",compactionSummary:"上下文压缩摘要",compactionSummaryContent:"上下文压缩摘要内容",compactionRunning:"正在压缩上下文…",compactionComplete:"上下文压缩完成",compactionLoading:"正在加载压缩摘要…",compactionUnavailable:"压缩摘要不可用",processGroup:"处理过程",toolCalls_one:"{{count}} 次工具调用",toolCalls_other:"{{count}} 次工具调用",viewFailed:"消息视图加载失败",viewLoading:"正在加载消息…",messageContent:"消息内容",useBasicPresentation:"使用基础消息展示",reservedView:"保留视图",publicSnapshot:"公共 Snapshot",retry:"重试",loadDetail:"加载 Detail",declarationFailed:"服务端 Message Declaration 失败",viewConflict:"同最高优先级存在多个 Message View",viewMissing:"没有 Message View 声明:{{viewKey}}",nextUserMessage:"定位到下一条用户消息",bottom:"回到聊天底部",userNavigation:"用户消息导航",previousUserMessage:"定位到上一条用户消息",previousUserShort:"上一条用户消息"}},e={close:"关闭",copied:"已复制",copyCode:"复制代码",copyLink:"复制链接",copyTable:"复制表格",copyTableAsCsv:"复制为 CSV",copyTableAsMarkdown:"复制为 Markdown",copyTableAsTsv:"复制为 TSV",downloadDiagram:"下载图表",downloadDiagramAsMmd:"下载 Mermaid 文件",downloadDiagramAsPng:"下载 PNG",downloadDiagramAsSvg:"下载 SVG",downloadFile:"下载文件",downloadImage:"下载图片",downloadTable:"下载表格",downloadTableAsCsv:"下载 CSV",downloadTableAsMarkdown:"下载 Markdown",exitFullscreen:"退出全屏",externalLinkWarning:"即将打开外部链接",imageNotAvailable:"图片不可用",mermaidFormatMmd:"Mermaid 文件",mermaidFormatPng:"PNG 图片",mermaidFormatSvg:"SVG 图片",openExternalLink:"打开外部链接",openLink:"打开链接",tableFormatCsv:"CSV",tableFormatMarkdown:"Markdown",tableFormatTsv:"TSV",viewFullscreen:"全屏查看"}},96478:(a,b,c)=>{"use strict";c.d(b,{E6:()=>j,TX:()=>m,ZQ:()=>k});var d=c(49147),e=c(87883);let f=e.Ik({wrapLines:e.zM().default(!0),diffViewMode:e.k5(["side-by-side","inline"]).default("side-by-side"),collapseUnchanged:e.zM().default(!1)}),g=f.parse({}),h=new Set,i=null;function j(){return g}function k(a){var b;let c=f.parse({...j(),...a});if(b=i,b?.wrapLines!==c.wrapLines||b.diffViewMode!==c.diffViewMode||b.collapseUnchanged!==c.collapseUnchanged)for(let a of(i=c,h))a()}function l(a){return h.size,h.add(a),()=>{h.delete(a),h.size}}function m(){return(0,d.useSyncExternalStore)(l,j,()=>g)}},99883:(a,b,c)=>{Promise.resolve().then(c.bind(c,4527))}};