pisper 0.6.25 → 0.6.26

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 (113) hide show
  1. package/package.json +6 -6
  2. package/web/.vite/manifest.json +573 -573
  3. package/web/assets/{AppDialog-CuxO26Km.js → AppDialog-B9y7rq_4.js} +1 -1
  4. package/web/assets/{AppOverlays-Bt5SL3PY.js → AppOverlays-CzdCHrpC.js} +1 -1
  5. package/web/assets/{AssetsPage-BE6AzOGC.js → AssetsPage-MzCklx_a.js} +1 -1
  6. package/web/assets/{BoardPage-DX0fJ_ap.js → BoardPage-CjQXbluj.js} +3 -3
  7. package/web/assets/{ChannelsPage-CyT7oDYZ.js → ChannelsPage-C6HqgnP7.js} +1 -1
  8. package/web/assets/{ChatAppearancePage-B6Dzj2Bj.js → ChatAppearancePage-BRlvWkJX.js} +1 -1
  9. package/web/assets/{ChatHistoryPage-Cq20l93c.js → ChatHistoryPage-D3jSE4oY.js} +1 -1
  10. package/web/assets/{ChatPage-DgiS-Qj_.js → ChatPage-BfG3KbJi.js} +3 -3
  11. package/web/assets/{ConfigPage-CgrWdzb5.js → ConfigPage-CshLFv2D.js} +1 -1
  12. package/web/assets/{DesktopWindowControls-D8axeuEx.js → DesktopWindowControls-BZu-eiS1.js} +1 -1
  13. package/web/assets/{FeaturePage-BB1TeMlr.js → FeaturePage-DD_32h19.js} +1 -1
  14. package/web/assets/{FileAttachmentPreview-DPjT_iYk.js → FileAttachmentPreview-DDX_cRzm.js} +1 -1
  15. package/web/assets/{FloatingWidgets-FI1S4hdn.js → FloatingWidgets-Dc4Lhl5d.js} +1 -1
  16. package/web/assets/{FocusRuntimeControls-CvAx-KDV.js → FocusRuntimeControls-CkYJXBrP.js} +1 -1
  17. package/web/assets/{GitDiffViewer-DwFfeFOA.js → GitDiffViewer-DeVUAwce.js} +1 -1
  18. package/web/assets/{ManageProjectsDialog-BSLNf6qD.js → ManageProjectsDialog-DPzESWUB.js} +1 -1
  19. package/web/assets/{MarkdownMessage-NK7Ixb4Y.js → MarkdownMessage-BfSy1Cg4.js} +1 -1
  20. package/web/assets/{McpPage-Cn-yDgC5.js → McpPage-CcJDe2nE.js} +1 -1
  21. package/web/assets/MemoryEvolution-Cwdreg5P.js +1 -0
  22. package/web/assets/{MemoryPage-ZwoG_oj6.js → MemoryPage-BkALQ2WN.js} +2 -2
  23. package/web/assets/{MobileNavigation-DK5a0kZU.js → MobileNavigation-C1mjjmqO.js} +1 -1
  24. package/web/assets/{MorePage-BL8nDnTQ.js → MorePage-C7kCRfpo.js} +1 -1
  25. package/web/assets/{NewFolderDialog-COkq83LW.js → NewFolderDialog-sqiEXqxJ.js} +1 -1
  26. package/web/assets/{PageHeader-BBTCMqXc.js → PageHeader-DDaW4Sdv.js} +1 -1
  27. package/web/assets/{PhoneDrawer-BcPKJWl-.js → PhoneDrawer-Be7C0xLf.js} +1 -1
  28. package/web/assets/{PhoneMenuButton-D6vdTZdF.js → PhoneMenuButton-1dPMDaRV.js} +1 -1
  29. package/web/assets/{PhoneTopBar-MqNeI69v.js → PhoneTopBar-BLXoPO6P.js} +1 -1
  30. package/web/assets/{PluginsPage-Bp71HpKD.js → PluginsPage-Bjp82DPO.js} +1 -1
  31. package/web/assets/{SafeModePrompt-CpvvU5wL.js → SafeModePrompt-D_OCmR6G.js} +1 -1
  32. package/web/assets/{SchedulesPage-Drs10rEV.js → SchedulesPage-DCOhjQ8W.js} +1 -1
  33. package/web/assets/{SessionBrowserPane-DjtB4MCI.js → SessionBrowserPane-Cvmqo12R.js} +2 -2
  34. package/web/assets/{SessionContextPanel-ETfnp4pT.js → SessionContextPanel-B9KtrMwl.js} +2 -2
  35. package/web/assets/{SessionHome-CHBw3ZvP.js → SessionHome-DMAZBF3M.js} +1 -1
  36. package/web/assets/{SessionInspector-DVaRflQy.js → SessionInspector-DfinUUs5.js} +1 -1
  37. package/web/assets/{SessionShell-CwfQAX7i.js → SessionShell-BxYZQh_O.js} +1 -1
  38. package/web/assets/{SettingsSidebar-FgC-tlY2.js → SettingsSidebar-DWXc-Z4_.js} +1 -1
  39. package/web/assets/{ShortcutHelpDialog-DKbIkUnk.js → ShortcutHelpDialog-QBYqmifG.js} +1 -1
  40. package/web/assets/{ShortcutKeys-BuHXNKVW.js → ShortcutKeys-B6hllpKE.js} +1 -1
  41. package/web/assets/{SidebarUpdateStatus-LKwNKESF.js → SidebarUpdateStatus-C-ebi4wI.js} +1 -1
  42. package/web/assets/{SkillsPage-BbnerW44.js → SkillsPage-CcNononn.js} +1 -1
  43. package/web/assets/{TaskProcessesPane-B2fyZEK9.js → TaskProcessesPane-D442bSux.js} +1 -1
  44. package/web/assets/{TaskTerminalView-CKApgF75.js → TaskTerminalView-B4fD3kVF.js} +1 -1
  45. package/web/assets/{TerminalPanel-D03WycYm.js → TerminalPanel-64E97AR4.js} +1 -1
  46. package/web/assets/{WebDesktopPet-K2dbcbnQ.js → WebDesktopPet-DUpnoJ1_.js} +1 -1
  47. package/web/assets/{WorkflowsPage-CmzftCtz.js → WorkflowsPage-Cj0mQmb3.js} +1 -1
  48. package/web/assets/{WorkspacePicker-DbdbTOV2.js → WorkspacePicker-_dbgAw5b.js} +1 -1
  49. package/web/assets/{api-BW_X0FMZ.js → api-_MWfl2VL.js} +1 -1
  50. package/web/assets/{app-update-DYFXTosD.js → app-update-CJSjwHEp.js} +1 -1
  51. package/web/assets/{approval-confirm-DQ5N_lJB.js → approval-confirm-D9j-l9WE.js} +1 -1
  52. package/web/assets/{board-projects-CrejrMrn.js → board-projects-BI5ssHIa.js} +1 -1
  53. package/web/assets/{bots-store-CNXTx3UY.js → bots-store-D8M80DQa.js} +1 -1
  54. package/web/assets/{chat-api-Bo6nhq40.js → chat-api-9V8j4rSS.js} +1 -1
  55. package/web/assets/{client-store-DzgOPMlh.js → client-store-xZC2AfqC.js} +1 -1
  56. package/web/assets/{config-search-BiQmWst4.js → config-search-VE6brXfx.js} +1 -1
  57. package/web/assets/{dialog-DFZX_Dek.js → dialog-BgFAhLng.js} +1 -1
  58. package/web/assets/{events-PfANjkHx.js → events-C96FsPEU.js} +1 -1
  59. package/web/assets/{focus-session-composer-bits-C_LOpJH_.js → focus-session-composer-bits-DJHZmmrf.js} +1 -1
  60. package/web/assets/{folder-paths-aRRH_MYq.js → folder-paths-BguW7FsR.js} +1 -1
  61. package/web/assets/{hosts-lvoPwC3T.js → hosts-D2X7ud3S.js} +1 -1
  62. package/web/assets/i18n-zKD1z9i9.js +1 -0
  63. package/web/assets/{index-D_zLThH_.js → index-CwdjZZLG.js} +2 -2
  64. package/web/assets/{memory-api-DkPje--t.js → memory-api-DilYLnpG.js} +1 -1
  65. package/web/assets/{mount-app-7pFSwVLO.js → mount-app-Dc-WeJ9N.js} +3 -3
  66. package/web/assets/{permission-rules-api-CAJsSBA5.js → permission-rules-api-CW4GK6hJ.js} +1 -1
  67. package/web/assets/{pick-system-directory-yk6L7wR2.js → pick-system-directory-UTgPstWX.js} +1 -1
  68. package/web/assets/{placements-CMrgmg3t.js → placements-Cw2TcTmd.js} +2 -2
  69. package/web/assets/{popover--q2hs_pT.js → popover-Cw7QFeII.js} +1 -1
  70. package/web/assets/{public-DkqrpWXx.js → public-4OSY9BE4.js} +2 -2
  71. package/web/assets/{public-DWbrDr0p.js → public-DaL-1TT_.js} +1 -1
  72. package/web/assets/{public-62LVX7HU.js → public-DdhGlwHC.js} +1 -1
  73. package/web/assets/{public-components-DHMvCgH2.js → public-components-C0KUBrxH.js} +1 -1
  74. package/web/assets/public-diff-ooK8-fn0.js +1 -0
  75. package/web/assets/public-events-ntCr-b1Y.js +1 -0
  76. package/web/assets/{public-flags-D9LdpQwJ.js → public-flags-D6y-DU98.js} +1 -1
  77. package/web/assets/{public-greeting-DEKYruJJ.js → public-greeting-JGqTdWhf.js} +1 -1
  78. package/web/assets/{public-session-B9UHA6rN.js → public-session-fPM64rB7.js} +1 -1
  79. package/web/assets/{public-sidebar-Lne86i_K.js → public-sidebar-CvLw1vam.js} +1 -1
  80. package/web/assets/{runtime-capabilities-store-BNM5Ug-5.js → runtime-capabilities-store-CWJvmV83.js} +1 -1
  81. package/web/assets/{safe-mode-instance-DnTP7EUr.js → safe-mode-instance-Dz4-ObZg.js} +1 -1
  82. package/web/assets/safe-mode-sentinel-Bg8pbnu-.js +1 -0
  83. package/web/assets/{session-change-summary-api-DMTwGz7o.js → session-change-summary-api-C3QE98fZ.js} +1 -1
  84. package/web/assets/{session-home-DUpZt2dn.js → session-home-CLGrhgld.js} +1 -1
  85. package/web/assets/{session-organization-api-BGyp66Uv.js → session-organization-api-B2UGOx0B.js} +1 -1
  86. package/web/assets/{session-scope-DZITSvZr.js → session-scope-okdygSiV.js} +1 -1
  87. package/web/assets/{session-tree-actions-CRWyFqAD.js → session-tree-actions-9m9DHqIx.js} +1 -1
  88. package/web/assets/{session-tree-summary-HTmAo_9V.js → session-tree-summary-u-RSxXXY.js} +1 -1
  89. package/web/assets/{shortcuts-D72gQCwH.js → shortcuts-CVPFuAiJ.js} +1 -1
  90. package/web/assets/{side-chat-context-D1hZOT7g.js → side-chat-context-By5GbAvl.js} +4 -4
  91. package/web/assets/{sidebar-sj8X80Y9.js → sidebar-BWHi3RGN.js} +1 -1
  92. package/web/assets/{sidebar-store-CXZ7QrOr.js → sidebar-store-CLA6EfOm.js} +1 -1
  93. package/web/assets/{speech-session-D2GQEOAL.js → speech-session-CFUz5f6J.js} +1 -1
  94. package/web/assets/{startup-queries-CuEXV1Zu.js → startup-queries-Xa-I9BT7.js} +1 -1
  95. package/web/assets/{use-i18n-_vdxObu5.js → use-i18n-CIheiCov.js} +1 -1
  96. package/web/assets/{use-open-bot-BTxzOAbZ.js → use-open-bot-zjJ_Tnfv.js} +1 -1
  97. package/web/assets/{use-studio-actions-CbMHRZpd.js → use-studio-actions-BiRUtcRX.js} +1 -1
  98. package/web/assets/{useCatalogProjects-BEkCpADy.js → useCatalogProjects-CbyrRuIn.js} +1 -1
  99. package/web/assets/{useNewProjectPicker-CUtLjwYE.js → useNewProjectPicker-6iK1xIT3.js} +2 -2
  100. package/web/assets/{useNow-eQeBCqQk.js → useNow-CE8ZJGxH.js} +1 -1
  101. package/web/assets/{usePhoneShell-DZHZWXnN.js → usePhoneShell-sWQz-gv8.js} +1 -1
  102. package/web/assets/{useSessionListQuery-BoUzmjZC.js → useSessionListQuery-K7Hh_V_2.js} +1 -1
  103. package/web/assets/{useSessionRowActions-DCqDrGZY.js → useSessionRowActions-Geuo0bzR.js} +1 -1
  104. package/web/assets/{useSidebarModel-CZAfH4Fa.js → useSidebarModel-BuyZjTgh.js} +1 -1
  105. package/web/assets/{web-preview-XrRFo42l.js → web-preview-0hEXH_IN.js} +1 -1
  106. package/web/assets/{web-preview-events-Ba6duwGi.js → web-preview-events-B5w8DSl2.js} +1 -1
  107. package/web/assets/{workspace-order-store-Ao4OZ13V.js → workspace-order-store-GwJH1aiS.js} +1 -1
  108. package/web/index.html +1 -1
  109. package/web/assets/MemoryEvolution-B8IeSLcd.js +0 -1
  110. package/web/assets/i18n-EVP8yIdy.js +0 -1
  111. package/web/assets/public-diff-WjbTu91T.js +0 -1
  112. package/web/assets/public-events-CTdTIu5Q.js +0 -1
  113. package/web/assets/safe-mode-sentinel-DOhqH4gj.js +0 -1
@@ -1 +0,0 @@
1
- import{h as e}from"./vendor-router-CSN_DGvx.js";import{t}from"./index-D_zLThH_.js";import{t as n}from"./storage-DtvZ_lEu.js";var r=e=>typeof e==`string`,i=()=>{let e,t,n=new Promise((n,r)=>{e=n,t=r});return n.resolve=e,n.reject=t,n},a=e=>e==null?``:String(e),o=(e,t,n)=>{e.forEach(e=>{t[e]&&(n[e]=t[e])})},s=/###/g,c=e=>e&&e.includes(`###`)?e.replace(s,`.`):e,l=e=>!e||r(e),u=(e,t,n)=>{let i=r(t)?t.split(`.`):t,a=0;for(;a<i.length-1;){if(l(e))return{};let t=c(i[a]);!e[t]&&n&&(e[t]=new n),e=Object.prototype.hasOwnProperty.call(e,t)?e[t]:{},++a}return l(e)?{}:{obj:e,k:c(i[a])}},d=(e,t,n)=>{let{obj:r,k:i}=u(e,t,Object);if(r!==void 0||t.length===1){r[i]=n;return}let a=t[t.length-1],o=t.slice(0,t.length-1),s=u(e,o,Object);for(;s.obj===void 0&&o.length;)a=`${o[o.length-1]}.${a}`,o=o.slice(0,o.length-1),s=u(e,o,Object),s?.obj&&s.obj[`${s.k}.${a}`]!==void 0&&(s.obj=void 0);s.obj[`${s.k}.${a}`]=n},f=(e,t,n,r)=>{let{obj:i,k:a}=u(e,t,Object);i[a]=i[a]||[],i[a].push(n)},p=(e,t)=>{let{obj:n,k:r}=u(e,t);if(n&&Object.prototype.hasOwnProperty.call(n,r))return n[r]},m=(e,t,n)=>{let r=p(e,n);return r===void 0?p(t,n):r},h=(e,t,n)=>{for(let i in t)i!==`__proto__`&&i!==`constructor`&&(Object.prototype.hasOwnProperty.call(e,i)?r(e[i])||e[i]instanceof String||r(t[i])||t[i]instanceof String?n&&(e[i]=t[i]):h(e[i],t[i],n):e[i]=t[i]);return e},g=e=>e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,`\\$&`),_={"&":`&amp;`,"<":`&lt;`,">":`&gt;`,'"':`&quot;`,"'":`&#39;`,"/":`&#x2F;`},v=e=>r(e)?e.replace(/[&<>"'\/]/g,e=>_[e]):e,y=class{constructor(e){this.capacity=e,this.regExpMap=new Map,this.regExpQueue=[]}getRegExp(e){let t=this.regExpMap.get(e);if(t!==void 0)return t;let n=new RegExp(e);return this.regExpQueue.length===this.capacity&&this.regExpMap.delete(this.regExpQueue.shift()),this.regExpMap.set(e,n),this.regExpQueue.push(e),n}},b=[` `,`,`,`?`,`!`,`;`],x=new y(20),S=(e,t,n)=>{t||=``,n||=``;let r=b.filter(e=>!t.includes(e)&&!n.includes(e));if(r.length===0)return!0;let i=x.getRegExp(`(${r.map(e=>e===`?`?`\\?`:e).join(`|`)})`),a=!i.test(e);if(!a){let t=e.indexOf(n);t>0&&!i.test(e.substring(0,t))&&(a=!0)}return a},C=(e,t,n=`.`)=>{if(!e)return;if(e[t])return Object.prototype.hasOwnProperty.call(e,t)?e[t]:void 0;let r=t.split(n),i=e;for(let e=0;e<r.length;){if(!i||typeof i!=`object`)return;let t,a=``;for(let o=e;o<r.length;++o)if(o!==e&&(a+=n),a+=r[o],t=i[a],t!==void 0){if([`string`,`number`,`boolean`].includes(typeof t)&&o<r.length-1)continue;e+=o-e+1;break}i=t}return i},w=e=>e?.replace(/_/g,`-`),T={type:`logger`,log(e){this.output(`log`,e)},warn(e){this.output(`warn`,e)},error(e){this.output(`error`,e)},output(e,t){console?.[e]?.apply?.(console,t)}},E=new class e{constructor(e,t={}){this.init(e,t)}init(e,t={}){this.prefix=t.prefix||`i18next:`,this.logger=e||T,this.options=t,this.debug=t.debug}log(...e){return this.forward(e,`log`,``,!0)}warn(...e){return this.forward(e,`warn`,``,!0)}error(...e){return this.forward(e,`error`,``)}deprecate(...e){return this.forward(e,`warn`,`WARNING DEPRECATED: `,!0)}forward(e,t,n,i){return i&&!this.debug?null:(e=e.map(e=>r(e)?e.replace(/[\r\n\x00-\x1F\x7F]/g,` `):e),r(e[0])&&(e[0]=`${n}${this.prefix} ${e[0]}`),this.logger[t](e))}create(t){return new e(this.logger,{prefix:`${this.prefix}:${t}:`,...this.options})}clone(t){return t||=this.options,t.prefix=t.prefix||this.prefix,new e(this.logger,t)}},D=class{constructor(){this.observers={}}on(e,t){return e.split(` `).forEach(e=>{this.observers[e]||(this.observers[e]=new Map);let n=this.observers[e].get(t)||0;this.observers[e].set(t,n+1)}),this}off(e,t){if(this.observers[e]){if(!t){delete this.observers[e];return}this.observers[e].delete(t)}}once(e,t){let n=(...r)=>{t(...r),this.off(e,n)};return this.on(e,n),this}emit(e,...t){this.observers[e]&&Array.from(this.observers[e].entries()).forEach(([e,n])=>{for(let r=0;r<n;r++)e(...t)}),this.observers[`*`]&&Array.from(this.observers[`*`].entries()).forEach(([n,r])=>{for(let i=0;i<r;i++)n(e,...t)})}},O=class extends D{constructor(e,t={ns:[`translation`],defaultNS:`translation`}){super(),this.data=e||{},this.options=t,this.options.keySeparator===void 0&&(this.options.keySeparator=`.`),this.options.ignoreJSONStructure===void 0&&(this.options.ignoreJSONStructure=!0)}addNamespaces(e){this.options.ns.includes(e)||this.options.ns.push(e)}removeNamespaces(e){let t=this.options.ns.indexOf(e);t>-1&&this.options.ns.splice(t,1)}getResource(e,t,n,i={}){let a=i.keySeparator===void 0?this.options.keySeparator:i.keySeparator,o=i.ignoreJSONStructure===void 0?this.options.ignoreJSONStructure:i.ignoreJSONStructure,s;e.includes(`.`)?s=e.split(`.`):(s=[e,t],n&&(Array.isArray(n)?s.push(...n):r(n)&&a?s.push(...n.split(a)):s.push(n)));let c=p(this.data,s);return!c&&!t&&!n&&e.includes(`.`)&&(e=s[0],t=s[1],n=s.slice(2).join(`.`)),c||!o||!r(n)?c:C(this.data?.[e]?.[t],n,a)}addResource(e,t,n,r,i={silent:!1}){let a=i.keySeparator===void 0?this.options.keySeparator:i.keySeparator,o=[e,t];n&&(o=o.concat(a?n.split(a):n)),e.includes(`.`)&&(o=e.split(`.`),r=t,t=o[1]),this.addNamespaces(t),d(this.data,o,r),i.silent||this.emit(`added`,e,t,n,r)}addResources(e,t,n,i={silent:!1}){for(let i in n)(r(n[i])||Array.isArray(n[i]))&&this.addResource(e,t,i,n[i],{silent:!0});i.silent||this.emit(`added`,e,t,n)}addResourceBundle(e,t,n,r,i,a={silent:!1,skipCopy:!1}){let o=[e,t];e.includes(`.`)&&(o=e.split(`.`),r=n,n=t,t=o[1]),this.addNamespaces(t);let s=p(this.data,o)||{};a.skipCopy||(n=JSON.parse(JSON.stringify(n))),r?h(s,n,i):s={...s,...n},d(this.data,o,s),a.silent||this.emit(`added`,e,t,n)}removeResourceBundle(e,t){this.hasResourceBundle(e,t)&&delete this.data[e][t],this.removeNamespaces(t),this.emit(`removed`,e,t)}hasResourceBundle(e,t){return this.getResource(e,t)!==void 0}getResourceBundle(e,t){return t||=this.options.defaultNS,this.getResource(e,t)}getDataByLanguage(e){return this.data[e]}hasLanguageSomeTranslations(e){let t=this.getDataByLanguage(e);return!!(t&&Object.keys(t)||[]).find(e=>t[e]&&Object.keys(t[e]).length>0)}toJSON(){return this.data}},k={processors:{},addPostProcessor(e){this.processors[e.name]=e},handle(e,t,n,r,i){return e.forEach(e=>{t=this.processors[e]?.process(t,n,r,i)??t}),t}},ee=Symbol(`i18next/PATH_KEY`);function te(){let e=[],t=Object.create(null),n;return t.get=(r,i)=>(n?.revoke?.(),i===ee?e:(e.push(i),n=Proxy.revocable(r,t),n.proxy)),Proxy.revocable(Object.create(null),t).proxy}function A(e,t){let{[ee]:n}=e(te()),r=t?.keySeparator??`.`,i=t?.nsSeparator??`:`,a=t?.enableSelector===`strict`;if(n.length>1&&i){let e=t?.ns,o=a?Array.isArray(e)?e:e?[e]:null:Array.isArray(e)?e:null;if(o&&(a?o:o.length>1?o.slice(1):[]).includes(n[0]))return`${n[0]}${i}${n.slice(1).join(r)}`}return n.join(r)}var j=e=>!r(e)&&typeof e!=`boolean`&&typeof e!=`number`,M=class e extends D{constructor(e,t={}){super(),o([`resourceStore`,`languageUtils`,`pluralResolver`,`interpolator`,`backendConnector`,`i18nFormat`,`utils`],e,this),this.options=t,this.options.keySeparator===void 0&&(this.options.keySeparator=`.`),this.logger=E.create(`translator`),this.checkedLoadedFor={}}changeLanguage(e){e&&(this.language=e)}exists(e,t={interpolation:{}}){let n={...t};if(e==null)return!1;let r=this.resolve(e,n);if(r?.res===void 0)return!1;let i=j(r.res);return!(n.returnObjects===!1&&i)}extractFromKey(e,t){let n=t.nsSeparator===void 0?this.options.nsSeparator:t.nsSeparator;n===void 0&&(n=`:`);let i=t.keySeparator===void 0?this.options.keySeparator:t.keySeparator,a=t.ns||this.options.defaultNS||[],o=n&&e.includes(n),s=!this.options.userDefinedKeySeparator&&!t.keySeparator&&!this.options.userDefinedNsSeparator&&!t.nsSeparator&&!S(e,n,i);if(o&&!s){let t=e.match(this.interpolator.nestingRegexp);if(t&&t.length>0)return{key:e,namespaces:r(a)?[a]:a};let o=e.split(n);(n!==i||n===i&&this.options.ns.includes(o[0]))&&(a=o.shift()),e=o.join(i)}return{key:e,namespaces:r(a)?[a]:a}}translate(t,n,i){let a=typeof n==`object`?{...n}:n;if(typeof a!=`object`&&this.options.overloadTranslationOptionHandler&&(a=this.options.overloadTranslationOptionHandler(arguments)),typeof a==`object`&&(a={...a}),a||={},t==null)return``;typeof t==`function`&&(t=A(t,{...this.options,...a})),Array.isArray(t)||(t=[String(t)]),t=t.map(e=>typeof e==`function`?A(e,{...this.options,...a}):String(e));let o=a.returnDetails===void 0?this.options.returnDetails:a.returnDetails,s=a.keySeparator===void 0?this.options.keySeparator:a.keySeparator,{key:c,namespaces:l}=this.extractFromKey(t[t.length-1],a),u=l[l.length-1],d=a.nsSeparator===void 0?this.options.nsSeparator:a.nsSeparator;d===void 0&&(d=`:`);let f=a.lng||this.language,p=a.appendNamespaceToCIMode||this.options.appendNamespaceToCIMode;if(f?.toLowerCase()===`cimode`)return p?o?{res:`${u}${d}${c}`,usedKey:c,exactUsedKey:c,usedLng:f,usedNS:u,usedParams:this.getUsedParamsDetails(a)}:`${u}${d}${c}`:o?{res:c,usedKey:c,exactUsedKey:c,usedLng:f,usedNS:u,usedParams:this.getUsedParamsDetails(a)}:c;let m=this.resolve(t,a),h=m?.res,g=m?.usedKey||c,_=m?.exactUsedKey||c,v=[`[object Number]`,`[object Function]`,`[object RegExp]`],y=a.joinArrays===void 0?this.options.joinArrays:a.joinArrays,b=!this.i18nFormat||this.i18nFormat.handleAsObject,x=a.count!==void 0&&!r(a.count),S=e.hasDefaultValue(a),C=x?this.pluralResolver.getSuffix(f,a.count,a):``,w=a.ordinal&&x?this.pluralResolver.getSuffix(f,a.count,{ordinal:!1}):``,T=x&&!a.ordinal&&a.count===0,E=T&&a[`defaultValue${this.options.pluralSeparator}zero`]||a[`defaultValue${C}`]||a[`defaultValue${w}`]||a.defaultValue,D=h;b&&!h&&S&&(D=E);let O=j(D),k=Object.prototype.toString.apply(D);if(b&&D&&O&&!v.includes(k)&&!(r(y)&&Array.isArray(D))){if(!a.returnObjects&&!this.options.returnObjects){this.options.returnedObjectHandler||this.logger.warn(`accessing an object - but returnObjects options is not enabled!`);let e=this.options.returnedObjectHandler?this.options.returnedObjectHandler(g,D,{...a,ns:l}):`key '${c} (${this.language})' returned an object instead of string.`;return o?(m.res=e,m.usedParams=this.getUsedParamsDetails(a),m):e}if(s){let e=Array.isArray(D),t=e?[]:{},n=e?_:g;for(let e in D)if(Object.prototype.hasOwnProperty.call(D,e)){let r=`${n}${s}${e}`;t[e]=S&&!h?this.translate(r,{...a,defaultValue:j(E)?E[e]:void 0,joinArrays:!1,ns:l}):this.translate(r,{...a,joinArrays:!1,ns:l}),t[e]===r&&(t[e]=D[e])}h=t}}else if(b&&r(y)&&Array.isArray(h))h=h.join(y),h&&=this.extendTranslation(h,t,a,i);else{let e=!1,n=!1;!this.isValidLookup(h)&&S&&(e=!0,h=E),this.isValidLookup(h)||(n=!0,h=c);let r=(a.missingKeyNoValueFallbackToKey||this.options.missingKeyNoValueFallbackToKey)&&n?void 0:h,o=S&&E!==h&&this.options.updateMissing;if(n||e||o){if(this.logger.log(o?`updateKey`:`missingKey`,f,u,x&&!o?`${c}${this.pluralResolver.getSuffix(f,a.count,a)}`:c,o?E:h),s){let e=this.resolve(c,{...a,keySeparator:!1});e&&e.res&&this.logger.warn(`Seems the loaded translations were in flat JSON format instead of nested. Either set keySeparator: false on init or make sure your translations are published in nested format.`)}let e=[],t=this.languageUtils.getFallbackCodes(this.options.fallbackLng,a.lng||this.language);if(this.options.saveMissingTo===`fallback`&&t&&t[0])for(let n=0;n<t.length;n++)e.push(t[n]);else this.options.saveMissingTo===`all`?e=this.languageUtils.toResolveHierarchy(a.lng||this.language):e.push(a.lng||this.language);let n=(e,t,n)=>{let i=S&&n!==h?n:r;this.options.missingKeyHandler?this.options.missingKeyHandler(e,u,t,i,o,a):this.backendConnector?.saveMissing&&this.backendConnector.saveMissing(e,u,t,i,o,a),this.emit(`missingKey`,e,u,t,h)};this.options.saveMissing&&(this.options.saveMissingPlurals&&x?e.forEach(e=>{let t=this.pluralResolver.getSuffixes(e,a);T&&a[`defaultValue${this.options.pluralSeparator}zero`]&&!t.includes(`${this.options.pluralSeparator}zero`)&&t.push(`${this.options.pluralSeparator}zero`),t.forEach(t=>{n([e],c+t,a[`defaultValue${t}`]||E)})}):n(e,c,E))}h=this.extendTranslation(h,t,a,m,i),n&&h===c&&this.options.appendNamespaceToMissingKey&&(h=`${u}${d}${c}`),(n||e)&&this.options.parseMissingKeyHandler&&(h=this.options.parseMissingKeyHandler(this.options.appendNamespaceToMissingKey?`${u}${d}${c}`:c,e?h:void 0,a))}return o?(m.res=h,m.usedParams=this.getUsedParamsDetails(a),m):h}extendTranslation(e,t,n,i,a){if(this.i18nFormat?.parse)e=this.i18nFormat.parse(e,{...this.options.interpolation.defaultVariables,...n},n.lng||this.language||i.usedLng,i.usedNS,i.usedKey,{resolved:i});else if(!n.skipInterpolation){n.interpolation&&this.interpolator.init({...n,interpolation:{...this.options.interpolation,...n.interpolation}});let o=r(e)&&(n?.interpolation?.skipOnVariables===void 0?this.options.interpolation.skipOnVariables:n.interpolation.skipOnVariables),s;if(o){let t=e.match(this.interpolator.nestingRegexp);s=t&&t.length}let c=n.replace&&!r(n.replace)?n.replace:n;if(this.options.interpolation.defaultVariables&&(c={...this.options.interpolation.defaultVariables,...c}),e=this.interpolator.interpolate(e,c,n.lng||this.language||i.usedLng,n),o){let t=e.match(this.interpolator.nestingRegexp),r=t&&t.length;s<r&&(n.nest=!1)}!n.lng&&i&&i.res&&(n.lng=this.language||i.usedLng),n.nest!==!1&&(e=this.interpolator.nest(e,(...e)=>a?.[0]===e[0]&&!n.context?(this.logger.warn(`It seems you are nesting recursively key: ${e[0]} in key: ${t[0]}`),null):this.translate(...e,t),n)),n.interpolation&&this.interpolator.reset()}let o=n.postProcess||this.options.postProcess,s=r(o)?[o]:o;return e!=null&&s?.length&&n.applyPostProcessor!==!1&&(e=k.handle(s,e,t,this.options&&this.options.postProcessPassResolved?{i18nResolved:{...i,usedParams:this.getUsedParamsDetails(n)},...n}:n,this)),e}resolve(e,t={}){let n,i,a,o,s;return r(e)&&(e=[e]),Array.isArray(e)&&(e=e.map(e=>typeof e==`function`?A(e,{...this.options,...t}):e)),e.forEach(e=>{if(this.isValidLookup(n))return;let c=this.extractFromKey(e,t),l=c.key;i=l;let u=c.namespaces;this.options.fallbackNS&&(u=u.concat(this.options.fallbackNS));let d=t.count!==void 0&&!r(t.count),f=d&&!t.ordinal&&t.count===0,p=t.context!==void 0&&(r(t.context)||typeof t.context==`number`)&&t.context!==``,m=t.lngs?t.lngs:this.languageUtils.toResolveHierarchy(t.lng||this.language,t.fallbackLng);u.forEach(e=>{this.isValidLookup(n)||(s=e,!this.checkedLoadedFor[`${m[0]}-${e}`]&&this.utils?.hasLoadedNamespace&&!this.utils?.hasLoadedNamespace(s)&&(this.checkedLoadedFor[`${m[0]}-${e}`]=!0,this.logger.warn(`key "${i}" for languages "${m.join(`, `)}" won't get resolved as namespace "${s}" was not yet loaded`,`This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!`)),m.forEach(r=>{if(this.isValidLookup(n))return;o=r;let i=[l];if(this.i18nFormat?.addLookupKeys)this.i18nFormat.addLookupKeys(i,l,r,e,t);else{let e;d&&(e=this.pluralResolver.getSuffix(r,t.count,t));let n=`${this.options.pluralSeparator}zero`,a=`${this.options.pluralSeparator}ordinal${this.options.pluralSeparator}`;if(d&&(t.ordinal&&e.startsWith(a)&&i.push(l+e.replace(a,this.options.pluralSeparator)),i.push(l+e),f&&i.push(l+n)),p){let r=`${l}${this.options.contextSeparator||`_`}${t.context}`;i.push(r),d&&(t.ordinal&&e.startsWith(a)&&i.push(r+e.replace(a,this.options.pluralSeparator)),i.push(r+e),f&&i.push(r+n))}}let s;for(;s=i.pop();)this.isValidLookup(n)||(a=s,n=this.getResource(r,e,s,t))}))})}),{res:n,usedKey:i,exactUsedKey:a,usedLng:o,usedNS:s}}isValidLookup(e){return e!==void 0&&!(!this.options.returnNull&&e===null)&&!(!this.options.returnEmptyString&&e===``)}getResource(e,t,n,r={}){return this.i18nFormat?.getResource?this.i18nFormat.getResource(e,t,n,r):this.resourceStore.getResource(e,t,n,r)}getUsedParamsDetails(e={}){let t=[`defaultValue`,`ordinal`,`context`,`replace`,`lng`,`lngs`,`fallbackLng`,`ns`,`keySeparator`,`nsSeparator`,`returnObjects`,`returnDetails`,`joinArrays`,`postProcess`,`interpolation`],n=e.replace&&!r(e.replace),i=n?e.replace:e;if(n&&e.count!==void 0&&(i={...i,count:e.count}),this.options.interpolation.defaultVariables&&(i={...this.options.interpolation.defaultVariables,...i}),!n){i={...i};for(let e of t)delete i[e]}return i}static hasDefaultValue(e){for(let t in e)if(Object.prototype.hasOwnProperty.call(e,t)&&t.startsWith(`defaultValue`)&&e[t]!==void 0)return!0;return!1}},N=class{constructor(e){this.options=e,this.supportedLngs=this.options.supportedLngs||!1,this.logger=E.create(`languageUtils`)}getScriptPartFromCode(e){if(e=w(e),!e||!e.includes(`-`))return null;let t=e.split(`-`);return t.length===2||(t.pop(),t[t.length-1].toLowerCase()===`x`)?null:this.formatLanguageCode(t.join(`-`))}getLanguagePartFromCode(e){if(e=w(e),!e||!e.includes(`-`))return e;let t=e.split(`-`);return this.formatLanguageCode(t[0])}formatLanguageCode(e){if(r(e)&&e.includes(`-`)){let t;try{t=Intl.getCanonicalLocales(e)[0]}catch{}return t&&this.options.lowerCaseLng&&(t=t.toLowerCase()),t||(this.options.lowerCaseLng?e.toLowerCase():e)}return this.options.cleanCode||this.options.lowerCaseLng?e.toLowerCase():e}isSupportedCode(e){return(this.options.load===`languageOnly`||this.options.nonExplicitSupportedLngs)&&(e=this.getLanguagePartFromCode(e)),!this.supportedLngs||!this.supportedLngs.length||this.supportedLngs.includes(e)}getBestMatchFromCodes(e){if(!e)return null;let t;return e.forEach(e=>{if(t)return;let n=this.formatLanguageCode(e);(!this.options.supportedLngs||this.isSupportedCode(n))&&(t=n)}),!t&&this.options.supportedLngs&&e.forEach(e=>{if(t)return;let n=this.getScriptPartFromCode(e);if(this.isSupportedCode(n))return t=n;let r=this.getLanguagePartFromCode(e);if(this.isSupportedCode(r))return t=r;t=this.options.supportedLngs.find(e=>e===r?!0:!e.includes(`-`)&&!r.includes(`-`)?!1:!!(e.includes(`-`)&&!r.includes(`-`)&&e.slice(0,e.indexOf(`-`))===r||e.startsWith(r)&&r.length>1))}),t||=this.getFallbackCodes(this.options.fallbackLng)[0],t}getFallbackCodes(e,t){if(!e)return[];if(typeof e==`function`&&(e=e(t)),r(e)&&(e=[e]),Array.isArray(e))return e;if(!t)return e.default||[];let n=e[t];return n||=e[this.getScriptPartFromCode(t)],n||=e[this.formatLanguageCode(t)],n||=e[this.getLanguagePartFromCode(t)],n||=e.default,n||[]}toResolveHierarchy(e,t){let n=this.getFallbackCodes((t===!1?[]:t)||this.options.fallbackLng||[],e),i=[],a=e=>{e&&(this.isSupportedCode(e)?i.push(e):this.logger.warn(`rejecting language code not found in supportedLngs: ${e}`))};return r(e)&&(e.includes(`-`)||e.includes(`_`))?(this.options.load!==`languageOnly`&&a(this.formatLanguageCode(e)),this.options.load!==`languageOnly`&&this.options.load!==`currentOnly`&&a(this.getScriptPartFromCode(e)),this.options.load!==`currentOnly`&&a(this.getLanguagePartFromCode(e))):r(e)&&a(this.formatLanguageCode(e)),n.forEach(e=>{i.includes(e)||a(this.formatLanguageCode(e))}),i}},P={zero:0,one:1,two:2,few:3,many:4,other:5},F={select:e=>e===1?`one`:`other`,resolvedOptions:()=>({pluralCategories:[`one`,`other`]})},ne=class{constructor(e,t={}){this.languageUtils=e,this.options=t,this.logger=E.create(`pluralResolver`),this.pluralRulesCache={}}clearCache(){this.pluralRulesCache={}}getRule(e,t={}){let n=w(e===`dev`?`en`:e),r=t.ordinal?`ordinal`:`cardinal`,i=JSON.stringify({cleanedCode:n,type:r});if(i in this.pluralRulesCache)return this.pluralRulesCache[i];let a;try{a=new Intl.PluralRules(n,{type:r})}catch{if(typeof Intl>`u`)return this.logger.error(`No Intl support, please use an Intl polyfill!`),F;if(!e.match(/-|_/))return F;let n=this.languageUtils.getLanguagePartFromCode(e);a=this.getRule(n,t)}return this.pluralRulesCache[i]=a,a}needsPlural(e,t={}){let n=this.getRule(e,t);return n||=this.getRule(`dev`,t),n?.resolvedOptions().pluralCategories.length>1}getPluralFormsOfKey(e,t,n={}){return this.getSuffixes(e,n).map(e=>`${t}${e}`)}getSuffixes(e,t={}){let n=this.getRule(e,t);return n||=this.getRule(`dev`,t),n?n.resolvedOptions().pluralCategories.sort((e,t)=>P[e]-P[t]).map(e=>`${this.options.prepend}${t.ordinal?`ordinal${this.options.prepend}`:``}${e}`):[]}getSuffix(e,t,n={}){let r=this.getRule(e,n);return r?`${this.options.prepend}${n.ordinal?`ordinal${this.options.prepend}`:``}${r.select(t)}`:(this.logger.warn(`no plural rule found for: ${e}`),this.getSuffix(`dev`,t,n))}},I=(e,t,n,i=`.`,a=!0)=>{let o=m(e,t,n);return!o&&a&&r(n)&&(o=C(e,n,i),o===void 0&&(o=C(t,n,i))),o},re=e=>e.replace(/\$/g,`$$$$`),L=class{constructor(e={}){this.logger=E.create(`interpolator`),this.options=e,this.format=e?.interpolation?.format||(e=>e),this.init(e)}init(e={}){e.interpolation||={escapeValue:!0};let{escape:t,escapeValue:n,useRawValueToEscape:r,prefix:i,prefixEscaped:a,suffix:o,suffixEscaped:s,formatSeparator:c,unescapeSuffix:l,unescapePrefix:u,nestingPrefix:d,nestingPrefixEscaped:f,nestingSuffix:p,nestingSuffixEscaped:m,nestingOptionsSeparator:h,maxReplaces:_,alwaysFormat:y}=e.interpolation;this.escape=t===void 0?v:t,this.escapeValue=n===void 0||n,this.useRawValueToEscape=r!==void 0&&r,this.prefix=i?g(i):a||`{{`,this.suffix=o?g(o):s||`}}`,this.formatSeparator=c||`,`,this.unescapePrefix=l?``:u?g(u):`-`,this.unescapeSuffix=this.unescapePrefix?``:l?g(l):``,this.nestingPrefix=d?g(d):f||g(`$t(`),this.nestingSuffix=p?g(p):m||g(`)`),this.nestingOptionsSeparator=h||`,`,this.maxReplaces=_||1e3,this.alwaysFormat=y!==void 0&&y,this.resetRegExp()}reset(){this.options&&this.init(this.options)}resetRegExp(){let e=(e,t)=>e?.source===t?(e.lastIndex=0,e):new RegExp(t,`g`);this.regexp=e(this.regexp,`${this.prefix}(.+?)${this.suffix}`),this.regexpUnescape=e(this.regexpUnescape,`${this.prefix}${this.unescapePrefix}(.+?)${this.unescapeSuffix}${this.suffix}`),this.nestingRegexp=e(this.nestingRegexp,`${this.nestingPrefix}((?:[^()"']+|"[^"]*"|'[^']*'|\\((?:[^()]|"[^"]*"|'[^']*')*\\))*?)${this.nestingSuffix}`)}interpolate(e,t,n,i){let o,s,c,l=this.options&&this.options.interpolation&&this.options.interpolation.defaultVariables||{},u=e=>{if(!e.includes(this.formatSeparator)){let r=I(t,l,e,this.options.keySeparator,this.options.ignoreJSONStructure);return this.alwaysFormat?this.format(r,void 0,n,{...i,...t,interpolationkey:e}):r}let r=e.split(this.formatSeparator),a=r.shift().trim(),o=r.join(this.formatSeparator).trim();return this.format(I(t,l,a,this.options.keySeparator,this.options.ignoreJSONStructure),o,n,{...i,...t,interpolationkey:a})};this.resetRegExp(),!this.escapeValue&&typeof e==`string`&&/\$t\([^)]*\{[^}]*\{\{/.test(e)&&this.logger.warn(`nesting options string contains interpolated variables with escapeValue: false — if any of those values are attacker-controlled they can inject additional nesting options (e.g. redirect lng/ns). Sanitise untrusted input before passing it to t(), or keep escapeValue: true.`);let d=i?.missingInterpolationHandler||this.options.missingInterpolationHandler,f=i?.interpolation?.skipOnVariables===void 0?this.options.interpolation.skipOnVariables:i.interpolation.skipOnVariables;return[{regex:this.regexpUnescape,safeValue:e=>e},{regex:this.regexp,safeValue:e=>this.escapeValue?this.escape(e):e}].forEach(t=>{for(c=0;o=t.regex.exec(e);){let n=o[1].trim();if(s=u(n),s===void 0){if(typeof d==`function`){let t=d(e,o,i);s=r(t)?t:``}else if(i&&Object.prototype.hasOwnProperty.call(i,n))s=``;else if(f){s=o[0];continue}else this.logger.warn(`missed to pass in variable ${n} for interpolating ${e}`),s=``}else!r(s)&&!this.useRawValueToEscape&&(s=a(s));let l=t.safeValue(s);if(e=e.replace(o[0],re(l)),f?(t.regex.lastIndex+=l.length,t.regex.lastIndex-=o[0].length):t.regex.lastIndex=0,c++,c>=this.maxReplaces)break}}),e}nest(e,t,n={}){let i,o,s,c=(e,t)=>{let n=this.nestingOptionsSeparator;if(!e.includes(n))return e;let r=e.split(RegExp(`${g(n)}[ ]*{`)),i=`{${r[1]}`;e=r[0],i=this.interpolate(i,s);let a=i.match(/'/g),o=i.match(/"/g);((a?.length??0)%2==0&&!o||(o?.length??0)%2!=0)&&(i=i.replace(/'/g,`"`));try{s=JSON.parse(i),t&&(s={...t,...s})}catch(t){return this.logger.warn(`failed parsing options string in nesting for key ${e}`,t),`${e}${n}${i}`}return s.defaultValue&&s.defaultValue.includes(this.prefix)&&delete s.defaultValue,e};for(;i=this.nestingRegexp.exec(e);){let l=[];s={...n},s=s.replace&&!r(s.replace)?s.replace:s,s.applyPostProcessor=!1,delete s.defaultValue;let u=/{.*}/s.test(i[1])?i[1].lastIndexOf(`}`)+1:i[1].indexOf(this.formatSeparator);if(u!==-1&&(l=i[1].slice(u).split(this.formatSeparator).map(e=>e.trim()).filter(Boolean),i[1]=i[1].slice(0,u)),o=t(c.call(this,i[1].trim(),s),s),o&&i[0]===e&&!r(o))return o;r(o)||(o=a(o)),o||=(this.logger.warn(`missed to resolve ${i[1]} for nesting ${e}`),``),l.length&&(o=l.reduce((e,t)=>this.format(e,t,n.lng,{...n,interpolationkey:i[1].trim()}),o.trim())),e=e.replace(i[0],o),this.regexp.lastIndex=0}return e}},ie=e=>{let t=e.toLowerCase().trim(),n={};if(e.includes(`(`)){let r=e.split(`(`);t=r[0].toLowerCase().trim();let i=r[1].slice(0,-1);t===`currency`&&!i.includes(`:`)?n.currency||=i.trim():t===`relativetime`&&!i.includes(`:`)?n.range||=i.trim():i.split(`;`).forEach(e=>{if(e){let[t,...r]=e.split(`:`),i=r.join(`:`).trim().replace(/^'+|'+$/g,``),a=t.trim();n[a]||(n[a]=i),i===`false`&&(n[a]=!1),i===`true`&&(n[a]=!0),isNaN(i)||(n[a]=parseInt(i,10))}})}return{formatName:t,formatOptions:n}},R=e=>{let t={};return(n,r,i)=>{let a=i;i&&i.interpolationkey&&i.formatParams&&i.formatParams[i.interpolationkey]&&i[i.interpolationkey]&&(a={...a,[i.interpolationkey]:void 0});let o=r+JSON.stringify(a),s=t[o];return s||(s=e(w(r),i),t[o]=s),s(n)}},ae=e=>(t,n,r)=>e(w(n),r)(t),oe=class{constructor(e={}){this.logger=E.create(`formatter`),this.options=e,this.init(e)}init(e,t={interpolation:{}}){this.formatSeparator=t.interpolation.formatSeparator||`,`;let n=t.cacheInBuiltFormats?R:ae;this.formats={number:n((e,t)=>{let n=new Intl.NumberFormat(e,{...t});return e=>n.format(e)}),currency:n((e,t)=>{let n=new Intl.NumberFormat(e,{...t,style:`currency`});return e=>n.format(e)}),datetime:n((e,t)=>{let n=new Intl.DateTimeFormat(e,{...t});return e=>n.format(e)}),relativetime:n((e,t)=>{let n=new Intl.RelativeTimeFormat(e,{...t});return e=>n.format(e,t.range||`day`)}),list:n((e,t)=>{let n=new Intl.ListFormat(e,{...t});return e=>n.format(e)})}}add(e,t){this.formats[e.toLowerCase().trim()]=t}addCached(e,t){this.formats[e.toLowerCase().trim()]=R(t)}format(e,t,n,r={}){if(!t||e==null)return e;let i=t.split(this.formatSeparator),a=[];for(let e=0;e<i.length;e++){let t=i[e];for(;t.indexOf(`(`)>-1&&!t.includes(`)`)&&e+1<i.length;)t=`${t}${this.formatSeparator}${i[++e]}`;a.push(t)}return a.reduce((e,t)=>{let{formatName:i,formatOptions:a}=ie(t);if(this.formats[i]){let t=e;try{let o=r?.formatParams?.[r.interpolationkey]||{},s=o.locale||o.lng||r.locale||r.lng||n;t=this.formats[i](e,s,{...a,...r,...o})}catch(e){this.logger.warn(e)}return t}return this.logger.warn(`there was no format function for ${i}`),e},e)}},se=(e,t)=>{e.pending[t]!==void 0&&(delete e.pending[t],e.pendingCount--)},ce=class extends D{constructor(e,t,n,r={}){super(),this.backend=e,this.store=t,this.services=n,this.languageUtils=n.languageUtils,this.options=r,this.logger=E.create(`backendConnector`),this.waitingReads=[],this.maxParallelReads=r.maxParallelReads||10,this.readingCalls=0,this.maxRetries=r.maxRetries>=0?r.maxRetries:5,this.retryTimeout=r.retryTimeout>=1?r.retryTimeout:350,this.state={},this.queue=[],this.backend?.init?.(n,r.backend,r)}queueLoad(e,t,n,r){let i={},a={},o={},s={};return e.forEach(e=>{let r=!0;t.forEach(t=>{let o=`${e}|${t}`;!n.reload&&this.store.hasResourceBundle(e,t)?this.state[o]=2:this.state[o]<0||(this.state[o]===1?a[o]===void 0&&(a[o]=!0):(this.state[o]=1,r=!1,a[o]===void 0&&(a[o]=!0),i[o]===void 0&&(i[o]=!0),s[t]===void 0&&(s[t]=!0)))}),r||(o[e]=!0)}),(Object.keys(i).length||Object.keys(a).length)&&this.queue.push({pending:a,pendingCount:Object.keys(a).length,loaded:{},errors:[],callback:r}),{toLoad:Object.keys(i),pending:Object.keys(a),toLoadLanguages:Object.keys(o),toLoadNamespaces:Object.keys(s)}}loaded(e,t,n){let r=e.split(`|`),i=r[0],a=r[1];t&&this.emit(`failedLoading`,i,a,t),!t&&n&&this.store.addResourceBundle(i,a,n,void 0,void 0,{skipCopy:!0}),this.state[e]=t?-1:2,t&&n&&(this.state[e]=0);let o={};this.queue.forEach(n=>{f(n.loaded,[i],a),se(n,e),t&&n.errors.push(t),n.pendingCount===0&&!n.done&&(Object.keys(n.loaded).forEach(e=>{o[e]||(o[e]={});let t=n.loaded[e];t.length&&t.forEach(t=>{o[e][t]===void 0&&(o[e][t]=!0)})}),n.done=!0,n.errors.length?n.callback(n.errors):n.callback())}),this.emit(`loaded`,o),this.queue=this.queue.filter(e=>!e.done)}read(e,t,n,r=0,i=this.retryTimeout,a){if(!e.length)return a(null,{});if(this.readingCalls>=this.maxParallelReads){this.waitingReads.push({lng:e,ns:t,fcName:n,tried:r,wait:i,callback:a});return}this.readingCalls++;let o=(o,s)=>{if(this.readingCalls--,this.waitingReads.length>0){let e=this.waitingReads.shift();this.read(e.lng,e.ns,e.fcName,e.tried,e.wait,e.callback)}if(o&&s&&r<this.maxRetries){setTimeout(()=>{this.read(e,t,n,r+1,i*2,a)},i);return}a(o,s)},s=this.backend[n].bind(this.backend);if(s.length===2){try{let n=s(e,t);n&&typeof n.then==`function`?n.then(e=>o(null,e)).catch(o):o(null,n)}catch(e){o(e)}return}return s(e,t,o)}prepareLoading(e,t,n={},i){if(!this.backend)return this.logger.warn(`No backend was added via i18next.use. Will not load resources.`),i&&i();r(e)&&(e=this.languageUtils.toResolveHierarchy(e)),r(t)&&(t=[t]);let a=this.queueLoad(e,t,n,i);if(!a.toLoad.length)return a.pending.length||i(),null;a.toLoad.forEach(e=>{this.loadOne(e)})}load(e,t,n){this.prepareLoading(e,t,{},n)}reload(e,t,n){this.prepareLoading(e,t,{reload:!0},n)}loadOne(e,t=``){let n=e.split(`|`),r=n[0],i=n[1];this.read(r,i,`read`,void 0,void 0,(n,a)=>{n&&this.logger.warn(`${t}loading namespace ${i} for language ${r} failed`,n),!n&&a&&this.logger.log(`${t}loaded namespace ${i} for language ${r}`,a),this.loaded(e,n,a)})}saveMissing(e,t,n,r,i,a={},o=()=>{}){if(this.services?.utils?.hasLoadedNamespace&&!this.services?.utils?.hasLoadedNamespace(t)){this.logger.warn(`did not save key "${n}" as the namespace "${t}" was not yet loaded`,`This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!`);return}if(n!=null&&n!==``){if(this.backend?.create){let s={...a,isUpdate:i},c=this.backend.create.bind(this.backend);if(c.length<6)try{let i;i=c.length===5?c(e,t,n,r,s):c(e,t,n,r),i&&typeof i.then==`function`?i.then(e=>o(null,e)).catch(o):o(null,i)}catch(e){o(e)}else c(e,t,n,r,o,s)}!e||!e[0]||this.store.addResource(e[0],t,n,r)}}},z=()=>({debug:!1,initAsync:!0,ns:[`translation`],defaultNS:[`translation`],fallbackLng:[`dev`],fallbackNS:!1,supportedLngs:!1,nonExplicitSupportedLngs:!1,load:`all`,preload:!1,keySeparator:`.`,nsSeparator:`:`,pluralSeparator:`_`,contextSeparator:`_`,enableSelector:!1,partialBundledLanguages:!1,saveMissing:!1,updateMissing:!1,saveMissingTo:`fallback`,saveMissingPlurals:!0,missingKeyHandler:!1,missingInterpolationHandler:!1,postProcess:!1,postProcessPassResolved:!1,returnNull:!1,returnEmptyString:!0,returnObjects:!1,joinArrays:!1,returnedObjectHandler:!1,parseMissingKeyHandler:!1,appendNamespaceToMissingKey:!1,appendNamespaceToCIMode:!1,overloadTranslationOptionHandler:e=>{let t={};if(typeof e[1]==`object`&&(t=e[1]),r(e[1])&&(t.defaultValue=e[1]),r(e[2])&&(t.tDescription=e[2]),typeof e[2]==`object`||typeof e[3]==`object`){let n=e[3]||e[2];Object.keys(n).forEach(e=>{t[e]=n[e]})}return t},interpolation:{escapeValue:!0,prefix:`{{`,suffix:`}}`,formatSeparator:`,`,unescapePrefix:`-`,nestingPrefix:`$t(`,nestingSuffix:`)`,nestingOptionsSeparator:`,`,maxReplaces:1e3,skipOnVariables:!0},cacheInBuiltFormats:!0}),B=e=>(r(e.ns)&&(e.ns=[e.ns]),r(e.fallbackLng)&&(e.fallbackLng=[e.fallbackLng]),r(e.fallbackNS)&&(e.fallbackNS=[e.fallbackNS]),e.supportedLngs&&!e.supportedLngs.includes(`cimode`)&&(e.supportedLngs=e.supportedLngs.concat([`cimode`])),e),V=()=>{},le=e=>{Object.getOwnPropertyNames(Object.getPrototypeOf(e)).forEach(t=>{typeof e[t]==`function`&&(e[t]=e[t].bind(e))})},H=class e extends D{constructor(e={},t){if(super(),this.options=B(e),this.services={},this.logger=E,this.modules={external:[]},le(this),t&&!this.isInitialized&&!e.isClone){if(!this.options.initAsync)return this.init(e,t),this;setTimeout(()=>{this.init(e,t)},0)}}init(e={},t){this.isInitializing=!0,typeof e==`function`&&(t=e,e={}),e.defaultNS==null&&e.ns&&(r(e.ns)?e.defaultNS=e.ns:e.ns.includes(`translation`)||(e.defaultNS=e.ns[0]));let n=z();this.options={...n,...this.options,...B(e)},this.options.interpolation={...n.interpolation,...this.options.interpolation},e.keySeparator!==void 0&&(this.options.userDefinedKeySeparator=e.keySeparator),e.nsSeparator!==void 0&&(this.options.userDefinedNsSeparator=e.nsSeparator),typeof this.options.overloadTranslationOptionHandler!=`function`&&(this.options.overloadTranslationOptionHandler=n.overloadTranslationOptionHandler);let a=e=>e?typeof e==`function`?new e:e:null;if(!this.options.isClone){this.modules.logger?E.init(a(this.modules.logger),this.options):E.init(null,this.options);let e;e=this.modules.formatter?this.modules.formatter:oe;let t=new N(this.options);this.store=new O(this.options.resources,this.options);let n=this.services;n.logger=E,n.resourceStore=this.store,n.languageUtils=t,n.pluralResolver=new ne(t,{prepend:this.options.pluralSeparator}),e&&(n.formatter=a(e),n.formatter.init&&n.formatter.init(n,this.options),this.options.interpolation.format=n.formatter.format.bind(n.formatter)),n.interpolator=new L(this.options),n.utils={hasLoadedNamespace:this.hasLoadedNamespace.bind(this)},n.backendConnector=new ce(a(this.modules.backend),n.resourceStore,n,this.options),n.backendConnector.on(`*`,(e,...t)=>{this.emit(e,...t)}),this.modules.languageDetector&&(n.languageDetector=a(this.modules.languageDetector),n.languageDetector.init&&n.languageDetector.init(n,this.options.detection,this.options)),this.modules.i18nFormat&&(n.i18nFormat=a(this.modules.i18nFormat),n.i18nFormat.init&&n.i18nFormat.init(this)),this.translator=new M(this.services,this.options),this.translator.on(`*`,(e,...t)=>{this.emit(e,...t)}),this.modules.external.forEach(e=>{e.init&&e.init(this)})}if(this.format=this.options.interpolation.format,t||=V,this.options.fallbackLng&&!this.services.languageDetector&&!this.options.lng){let e=this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);e.length>0&&e[0]!==`dev`&&(this.options.lng=e[0])}!this.services.languageDetector&&!this.options.lng&&this.logger.warn(`init: no languageDetector is used and no lng is defined`),[`getResource`,`hasResourceBundle`,`getResourceBundle`,`getDataByLanguage`].forEach(e=>{this[e]=(...t)=>this.store[e](...t)}),[`addResource`,`addResources`,`addResourceBundle`,`removeResourceBundle`].forEach(e=>{this[e]=(...t)=>(this.store[e](...t),this)});let o=i(),s=()=>{let e=(e,n)=>{this.isInitializing=!1,this.isInitialized&&!this.initializedStoreOnce&&this.logger.warn(`init: i18next is already initialized. You should call init just once!`),this.isInitialized=!0,this.options.isClone||this.logger.log(`initialized`,this.options),this.emit(`initialized`,this.options),o.resolve(n),t(e,n)};if((this.languages||this.isLanguageChangingTo)&&!this.isInitialized)return e(null,this.t.bind(this));this.changeLanguage(this.options.lng,e)};return this.options.resources||!this.options.initAsync?s():setTimeout(s,0),o}loadResources(e,t=V){let n=t,i=r(e)?e:this.language;if(typeof e==`function`&&(n=e),!this.options.resources||this.options.partialBundledLanguages){if(i?.toLowerCase()===`cimode`&&(!this.options.preload||this.options.preload.length===0))return n();let e=[],t=t=>{t&&t!==`cimode`&&this.services.languageUtils.toResolveHierarchy(t).forEach(t=>{t!==`cimode`&&(e.includes(t)||e.push(t))})};i?t(i):this.services.languageUtils.getFallbackCodes(this.options.fallbackLng).forEach(e=>t(e)),this.options.preload?.forEach?.(e=>t(e)),this.services.backendConnector.load(e,this.options.ns,e=>{!e&&!this.resolvedLanguage&&this.language&&this.setResolvedLanguage(this.language),n(e)})}else n(null)}reloadResources(e,t,n){let r=i();return typeof e==`function`&&(n=e,e=void 0),typeof t==`function`&&(n=t,t=void 0),e||=this.languages,t||=this.options.ns,n||=V,this.services.backendConnector.reload(e,t,e=>{r.resolve(),n(e)}),r}use(e){if(!e)throw Error(`You are passing an undefined module! Please check the object you are passing to i18next.use()`);if(!e.type)throw Error(`You are passing a wrong module! Please check the object you are passing to i18next.use()`);return e.type===`backend`&&(this.modules.backend=e),(e.type===`logger`||e.log&&e.warn&&e.error)&&(this.modules.logger=e),e.type===`languageDetector`&&(this.modules.languageDetector=e),e.type===`i18nFormat`&&(this.modules.i18nFormat=e),e.type===`postProcessor`&&k.addPostProcessor(e),e.type===`formatter`&&(this.modules.formatter=e),e.type===`3rdParty`&&this.modules.external.push(e),this}setResolvedLanguage(e){if(!(!e||!this.languages)&&![`cimode`,`dev`].includes(e)){for(let e=0;e<this.languages.length;e++){let t=this.languages[e];if(![`cimode`,`dev`].includes(t)&&this.store.hasLanguageSomeTranslations(t)){this.resolvedLanguage=t;break}}!this.resolvedLanguage&&!this.languages.includes(e)&&this.store.hasLanguageSomeTranslations(e)&&(this.resolvedLanguage=e,this.languages.unshift(e))}}changeLanguage(e,t){this.isLanguageChangingTo=e;let n=i();this.emit(`languageChanging`,e);let a=e=>{this.language=e,this.languages=this.services.languageUtils.toResolveHierarchy(e),this.resolvedLanguage=void 0,this.setResolvedLanguage(e)},o=(r,i)=>{i?this.isLanguageChangingTo===e&&(a(i),this.translator.changeLanguage(i),this.isLanguageChangingTo=void 0,this.emit(`languageChanged`,i),this.logger.log(`languageChanged`,i)):this.isLanguageChangingTo=void 0,n.resolve((...e)=>this.t(...e)),t&&t(r,(...e)=>this.t(...e))},s=t=>{!e&&!t&&this.services.languageDetector&&(t=[]);let n=r(t)?t:t&&t[0],i=this.store.hasLanguageSomeTranslations(n)?n:this.services.languageUtils.getBestMatchFromCodes(r(t)?[t]:t);i&&(this.language||a(i),this.translator.language||this.translator.changeLanguage(i),this.services.languageDetector?.cacheUserLanguage?.(i)),this.loadResources(i,e=>{o(e,i)})};return!e&&this.services.languageDetector&&!this.services.languageDetector.async?s(this.services.languageDetector.detect()):!e&&this.services.languageDetector&&this.services.languageDetector.async?this.services.languageDetector.detect.length===0?this.services.languageDetector.detect().then(s):this.services.languageDetector.detect(s):s(e),n}getFixedT(e,t,n,i){let a=i?.scopeNs,o=(e,t,...r)=>{let i;i=typeof t==`object`?{...t}:this.options.overloadTranslationOptionHandler([e,t].concat(r)),i.lng=i.lng||o.lng,i.lngs=i.lngs||o.lngs;let s=i.ns!==void 0&&i.ns!==null;i.ns=i.ns||o.ns,i.keyPrefix!==``&&(i.keyPrefix=i.keyPrefix||n||o.keyPrefix);let c={...this.options,...i};Array.isArray(a)&&!s&&(c.ns=a),typeof i.keyPrefix==`function`&&(i.keyPrefix=A(i.keyPrefix,c));let l=this.options.keySeparator||`.`,u;return i.keyPrefix&&Array.isArray(e)?u=e.map(e=>(typeof e==`function`&&(e=A(e,c)),`${i.keyPrefix}${l}${e}`)):(typeof e==`function`&&(e=A(e,c)),u=i.keyPrefix?`${i.keyPrefix}${l}${e}`:e),this.t(u,i)};return r(e)?o.lng=e:o.lngs=e,o.ns=t,o.keyPrefix=n,o}t(...e){return this.translator?.translate(...e)}exists(...e){return this.translator?.exists(...e)}setDefaultNamespace(e){this.options.defaultNS=e}hasLoadedNamespace(e,t={}){if(!this.isInitialized)return this.logger.warn(`hasLoadedNamespace: i18next was not initialized`,this.languages),!1;if(!this.languages||!this.languages.length)return this.logger.warn(`hasLoadedNamespace: i18n.languages were undefined or empty`,this.languages),!1;let n=t.lng||this.resolvedLanguage||this.languages[0],r=this.options?this.options.fallbackLng:!1,i=this.languages[this.languages.length-1];if(n.toLowerCase()===`cimode`)return!0;let a=(e,t)=>{let n=this.services.backendConnector.state[`${e}|${t}`];return n===-1||n===0||n===2};if(t.precheck){let e=t.precheck(this,a);if(e!==void 0)return e}return!!(this.hasResourceBundle(n,e)||!this.services.backendConnector.backend||this.options.resources&&!this.options.partialBundledLanguages||a(n,e)&&(!r||a(i,e)))}loadNamespaces(e,t){let n=i();return this.options.ns?(r(e)&&(e=[e]),e.forEach(e=>{this.options.ns.includes(e)||this.options.ns.push(e)}),this.loadResources(e=>{n.resolve(),t&&t(e)}),n):(t&&t(),Promise.resolve())}loadLanguages(e,t){let n=i();r(e)&&(e=[e]);let a=this.options.preload||[],o=e.filter(e=>!a.includes(e)&&this.services.languageUtils.isSupportedCode(e));return o.length?(this.options.preload=a.concat(o),this.loadResources(e=>{n.resolve(),t&&t(e)}),n):(t&&t(),Promise.resolve())}dir(e){if(e||=this.resolvedLanguage||(this.languages?.length>0?this.languages[0]:this.language),!e)return`rtl`;try{let t=new Intl.Locale(e);if(t&&t.getTextInfo){let e=t.getTextInfo();if(e&&e.direction)return e.direction}}catch{}let t=`ar.shu.sqr.ssh.xaa.yhd.yud.aao.abh.abv.acm.acq.acw.acx.acy.adf.ads.aeb.aec.afb.ajp.apc.apd.arb.arq.ars.ary.arz.auz.avl.ayh.ayl.ayn.ayp.bbz.pga.he.iw.ps.pbt.pbu.pst.prp.prd.ug.ur.ydd.yds.yih.ji.yi.hbo.men.xmn.fa.jpr.peo.pes.prs.dv.sam.ckb`.split(`.`),n=this.services?.languageUtils||new N(z());return e.toLowerCase().indexOf(`-latn`)>1?`ltr`:t.includes(n.getLanguagePartFromCode(e))||e.toLowerCase().indexOf(`-arab`)>1?`rtl`:`ltr`}static createInstance(t={},n){let r=new e(t,n);return r.createInstance=e.createInstance,r}cloneInstance(t={},n=V){let r=t.forkResourceStore;r&&delete t.forkResourceStore;let i={...this.options,...t,isClone:!0},a=new e(i);if((t.debug!==void 0||t.prefix!==void 0)&&(a.logger=a.logger.clone(t)),[`store`,`services`,`language`].forEach(e=>{a[e]=this[e]}),a.services={...this.services},a.services.utils={hasLoadedNamespace:a.hasLoadedNamespace.bind(a)},r&&(a.store=new O(Object.keys(this.store.data).reduce((e,t)=>(e[t]={...this.store.data[t]},e[t]=Object.keys(e[t]).reduce((n,r)=>(n[r]={...e[t][r]},n),e[t]),e),{}),i),a.services.resourceStore=a.store),t.interpolation){let e={...z().interpolation,...this.options.interpolation,...t.interpolation},n={...i,interpolation:e};a.services.interpolator=new L(n)}return a.translator=new M(a.services,i),a.translator.on(`*`,(e,...t)=>{a.emit(e,...t)}),a.init(i,n),a.translator.options=i,a.translator.backendConnector.services.utils={hasLoadedNamespace:a.hasLoadedNamespace.bind(a)},a}toJSON(){return{options:this.options,store:this.store,language:this.language,languages:this.languages,resolvedLanguage:this.resolvedLanguage}}}.createInstance();H.createInstance,H.dir,H.init,H.loadResources,H.reloadResources,H.use,H.changeLanguage,H.getFixedT,H.t,H.exists,H.setDefaultNamespace,H.hasLoadedNamespace,H.loadNamespaces,H.loadLanguages;var ue=/&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34|nbsp|#160|copy|#169|reg|#174|hellip|#8230|#x2F|#47);/g,de={"&amp;":`&`,"&#38;":`&`,"&lt;":`<`,"&#60;":`<`,"&gt;":`>`,"&#62;":`>`,"&apos;":`'`,"&#39;":`'`,"&quot;":`"`,"&#34;":`"`,"&nbsp;":` `,"&#160;":` `,"&copy;":`©`,"&#169;":`©`,"&reg;":`®`,"&#174;":`®`,"&hellip;":`…`,"&#8230;":`…`,"&#x2F;":`/`,"&#47;":`/`},fe=e=>de[e],U={bindI18n:`languageChanged`,bindI18nStore:``,transEmptyNodeValue:``,transSupportBasicHtmlNodes:!0,transWrapTextNodes:``,transKeepBasicHtmlNodesFor:[`br`,`strong`,`i`,`p`],useSuspense:!0,unescape:e=>e.replace(ue,fe),transDefaultProps:void 0},pe=(e={})=>{U={...U,...e}},me=()=>U,W,he=e=>{W=e},ge=()=>W,_e={type:`3rdParty`,init(e){pe(e.options.react),he(e)}},ve={"assetsPage.images":`Images`,"assetsPage.videos":`Videos`,"assetsPage.files":`Files`,"assetsPage.links":`Links`,"assetsPage.fromCurrentChat":`From current chat`,"assetsPage.adding":`Adding…`,"assetsPage.addLink":`Add link`,"assetsPage.addLinkAsset":`Add link asset`,"assetsPage.agentOutputs":`Agent outputs`,"assetsPage.all":`All`,"assetsPage.assetDeleted":`Asset deleted`,"assetsPage.bringInALinkOrAttachAFileInAConversationPisperWillGatherTheOutputsCreatedAlongTheWay":`Bring in a link or attach a file in a conversation; Pisper will gather the outputs created along the way.`,"assetsPage.cancel":`Cancel`,"assetsPage.conversationAttachmentsAndAgentOutputsGatherHereAutomatically":`Conversation attachments and Agent outputs gather here automatically.`,"assetsPage.delete":`Delete`,"assetsPage.deleteAsset":`Delete asset`,"assetsPage.deleteAssetName":`Delete asset “{name}”?`,"assetsPage.download":`Download`,"assetsPage.downloadStarted":`Download started`,"assetsPage.forExampleOpenAIAPIDocs":`For example, OpenAI API docs`,"assetsPage.fromName":`From: {name}`,"assetsPage.linkAssetAdded":`Link asset added`,"assetsPage.linksCanBeArchivedOpenedOrAddedToAChatAsContext":`Links can be archived, opened, or added to a chat as context.`,"assetsPage.loadingAssets":`Loading assets`,"assetsPage.loadFailed":`Couldn’t load assets`,"assetsPage.chatAttachments":`Chat attachments`,"assetsPage.manualUploads":`Manual uploads`,"assetsPage.name":`Name`,"assetsPage.nameAddedToChat":`{name} added to chat`,"assetsPage.nothingHasGatheredHereYet":`Nothing has gathered here yet`,"assetsPage.open":`Open`,"assetsPage.openedInApplication":`Sent to a system application`,"assetsPage.openInApplication":`Open in app`,"assetsPage.preview":`Preview`,"assetsPage.thisFileTypeCanBeDownloadedSupportedDocumentsCanAlsoBeAddedToAChatForAnalysis":`This file type can be downloaded. Supported documents can also be added to a chat for analysis.`,"assetsPage.useInChat":`Use in chat`,"assetsPage.filters":`Filters`,"assetsPage.assetType":`Asset type`,"assetsPage.removeFilter":`Remove {filter} filter`,"assetsPage.refreshAssets":`Refresh assets`,"assetsPage.refreshingAssets":`Refreshing assets…`,"assetsPage.retry":`Retry`,"assetsPage.mediaFailed":`Media could not be loaded`,"assetsPage.loadingPreview":`Loading preview…`,"assetsPage.previewTruncated":`Preview is truncated. Download the complete file.`,"assetsPage.noActiveSession":`Select a conversation to view its assets.`,"assetsPage.noCurrentAssets":`No matching assets in this conversation`,"assetsPage.noMatchingAssets":`No matching assets`,"assetsPage.tryOtherFilters":`Try other filters or search terms.`,"assetsPage.invalidLink":`Enter a valid http or https link.`},ye={"sessionContext.title":`Session context`,"sessionContext.resize":`Resize session context`,"sessionContext.resizeHint":`Drag or use arrow keys to resize; double-click to reset`,"focusSession.fileChangesRevertFileDescription":`Revert the session changes to {path} and restore its snapshot? This will overwrite the file's current contents.`,"sessionContext.plan":`Plan`,"sessionContext.planEmpty":`This session has no execution plan yet.`,"sessionContext.openUrl":`Open`,"sessionContext.invalidUrl":`Enter a valid http or https address.`,"sessionContext.browserEmpty":`Enter a URL to preview a page.`,"resourcePicker.title":`Invoke a resource`,"resourcePicker.description":`Insert a Prompt, invoke a Skill or Tool, or start a workflow you can track over time.`,"resourcePicker.open":`Skills and tools`,"resourcePicker.close":`Close resource picker`,"resourcePicker.search":`Search Prompts, Skills, Tools, and workflows`,"resourcePicker.categories":`Resource categories`,"resourcePicker.all":`All`,"resourcePicker.prompt":`Prompt`,"resourcePicker.skill":`Skill`,"resourcePicker.workflow":`Workflow`,"resourcePicker.tool":`Tool`,"resourcePicker.loading":`Loading resources…`,"resourcePicker.empty":`No invokable resources found.`,"resourcePicker.noDescription":`No description`,"resourcePicker.chooseResource":`Choose a resource to configure the invocation.`,"resourcePicker.useResource":`Use this resource`,"resourcePicker.insertPrompt":`Insert Prompt`,"resourcePicker.remove":`Remove invoked resource`,"commands.open":`Open Slash commands`,"commands.prompt":`Prompt`,"commands.skill":`Skill`,"commands.loading":`Loading commands…`,"commands.loadError":`Commands could not be loaded.`,"commands.empty":`No matching commands.`,"commands.noDescription":`No description`,"commands.scope.user":`User`,"commands.scope.project":`Project`,"commands.scope.package":`Package`,"commands.scope.custom":`Custom`,"commands.builtin.label":`Command`,"commands.builtin.current":`Current`,"commands.builtin.new":`Start a new task`,"commands.builtin.model":`Switch model; keep context`,"commands.builtin.effort":`Set reasoning effort for this conversation`,"commands.builtin.approval":`Choose when tools need your approval`,"commands.builtin.run":`Pick the run mode: Plan, goal, or team`,"commands.builtin.compact":`Summarize older context now`,"commands.builtin.changes":`Review this session's changes`,"commands.builtin.btw":`Side question: ask about this conversation without interrupting or adding to it`,"sideQuestion.label":`Side question`,"sideQuestion.close":`Close side question`,"sideQuestion.answering":`Answering…`,"sideQuestion.empty":`No answer.`,"sideQuestion.toolIgnored":`The model needed tools to answer. Side questions do not run tools; send it to the agent instead.`,"sideQuestion.failed":`Side question failed: {error}`,"sideQuestion.note":`Answered from this conversation and not saved to it. Closing discards it.`,"sessionTree.menu":`Session tree`,"sessionTree.title":`Session tree`,"sessionTree.branches":`Branches`,"sessionTree.description":`This conversation contains {nodes} nodes across {branches} branching paths. Switching paths preserves the rest of the context.`,"sessionTree.labeled":`Labeled`,"sessionTree.allMarks":`All marks`,"sessionTree.showAllEntries":`Show all entries (tool calls, settings)`,"sessionTree.backToNodes":`Back to nodes`,"sessionTree.markActive":`Active branch`,"sessionTree.markTimes":`Chat {sessionTime} · node {nodeTime}`,"sessionTree.noMarksYet":`No turns have been marked yet. Use “⋯ → Mark this turn” under a reply.`,"sessionTree.loadingMarks":`Loading marks`,"sessionTree.userMessage":`User message`,"sessionTree.agentMessage":`Agent response`,"sessionTree.toolResult":`Tool result`,"sessionTree.toolCall":`Tool call`,"sessionTree.branchSummary":`Branch summary`,"sessionTree.compactionSummary":`Context summary`,"sessionTree.settingsChange":`Runtime setting`,"sessionTree.labelChange":`Mark change`,"sessionTree.branchPosition":`Pending branch position`,"sessionTree.extensionEntry":`Runtime entry`,"sessionTree.metadataEntry":`Session metadata`,"sessionTree.message":`Message`,"sessionTree.current":`Current`,"sessionTree.fork":`Fork`,"sessionTree.active":`Active branch`,"sessionTree.loading":`Loading the session tree…`,"sessionTree.searchPlaceholder":`Search marks and node content`,"sessionTree.empty":`No nodes match this filter.`,"sessionTree.noPreview":`This node has no displayable text.`,"sessionTree.nodeLabel":`Node mark`,"sessionTree.labelPlaceholder":`Optional navigation marker`,"sessionTree.saveLabel":`Save mark`,"sessionTree.savingLabel":`Saving…`,"sessionTree.removeLabel":`Remove mark`,"sessionTree.abandonedBranchSummary":`Summarize the branch being left`,"sessionTree.abandonedBranchSummaryHint":`The current model generates context for the new branch. This makes one model request.`,"sessionTree.sideEffectsRemain":`Switching changes future conversation context only. It does not undo file, network, or tool effects.`,"sessionTree.navigating":`Switching…`,"sessionTree.currentPosition":`Current node`,"sessionTree.continueFromNode":`Continue from here`,"sessionTree.createChildChat":`Open a separate chat`,"sessionTree.creatingChildChat":`Creating separate chat…`,"sessionTree.conversationLineage":`Conversation lineage`,"sessionTree.returnToOriginalChat":`Return to original chat: {name}`,"sessionTree.openSeparateChat":`Open separate chat: {name}`,"sessionTree.chooseNode":`Choose a node to inspect it.`,"sessionTree.retry":`Retry`,"sessionTree.undo":`Undo`,"sessionTree.undone":`Undone — back on the original branch`,"sessionTree.switchedBranch":`Switched to the branch with this mark`,"sessionTree.otherBranchTitle":`This mark is on another branch`,"sessionTree.otherBranchMessage":`Opening it switches the current branch. The original branch stays in the session tree, and you can undo after switching.`,"sessionTree.switchBranch":`Switch branch and open`,"workflowRun.running":`Running`,"workflowRun.waitingApproval":`Waiting for approval`,"workflowRun.completed":`Completed`,"workflowRun.failed":`Failed`,"workflowRun.stopped":`Stopped`,"workflowRun.interrupted":`Interrupted`,"workflowRun.approve":`Approve`,"workflowRun.reject":`Reject`,"workflowRun.stop":`Stop run`,"workflowRun.request":`Request`,"workflowRun.inputs":`Inputs`,"planBoard.ariaLabel":`Execution plan`,"planBoard.toggleAriaLabel":`Expand or collapse the current execution plan`,"planBoard.progress":`Plan · {completed}/{total}`,"planBoard.countInProgress":`{count} in progress`,"planBoard.countBlocked":`{count} blocked`,"planBoard.completed":`Completed`,"planBoard.inProgress":`In progress`,"planBoard.blocked":`Blocked`,"planBoard.pending":`Pending`,"planBoard.unassigned":`Unassigned`,"planBoard.assignedTo":`Assigned to {name}`,"planBoard.waitingFor":`Waiting for: {tasks}`,"agentRunActivity.readingFiles":`Reading files`,"agentRunActivity.searchingContent":`Searching content`,"agentRunActivity.findingFiles":`Finding files`,"agentRunActivity.browsingDirectories":`Browsing directories`,"agentRunActivity.editingFiles":`Editing files`,"agentRunActivity.writingFiles":`Writing files`,"agentRunActivity.runningCommands":`Running commands`,"agentRunActivity.runningScript":`Running script`,"agentRunActivity.searchingMemory":`Searching memory`,"agentRunActivity.savingMemory":`Saving memory`,"agentRunActivity.openingMemory":`Opening memory`,"agentRunActivity.confirmingMemory":`Confirming memory`,"agentRunActivity.forgettingMemory":`Forgetting memory`,"agentRunActivity.startingSubagent":`Starting subagent`,"agentRunActivity.checkingSubagents":`Checking subagents`,"agentRunActivity.messagingSubagent":`Messaging subagent`,"agentRunActivity.messagingTeamMember":`Messaging a Team member`,"agentRunActivity.checkingTeamMembers":`Checking Team members`,"agentRunActivity.runningTeamWorkflow":`Running Team workflow script`,"agentRunActivity.addingSubagentTask":`Adding a subagent task`,"agentRunActivity.waitingForSubagent":`Waiting for subagent`,"agentRunActivity.interruptingSubagent":`Interrupting subagent`,"agentRunActivity.liveCommandOutput":`Live command output`,"agentRunActivity.readingPlan":`Reading plan`,"agentRunActivity.updatingPlan":`Updating plan`,"agentRunActivity.controllingBrowser":`Controlling browser`,"agentRunActivity.observingInterface":`Observing app interface`,"agentRunActivity.operatingInterface":`Operating app interface`,"agentRunActivity.searchingInterface":`Searching interface elements`,"agentRunActivity.findingAppWindows":`Finding app windows`,"agentRunActivity.readingInterfaceText":`Reading interface text`,"agentRunActivity.waitingForInterface":`Waiting for interface change`,"agentRunActivity.interfaceObserved":`App interface observed`,"agentRunActivity.interfaceActionCompleted":`Interface action completed`,"agentRunActivity.interfaceTextRead":`Interface text read`,"agentRunActivity.toolPreviewAlt":`Tool interface preview`,"computerUseLive.previewAlt":`Live app window`,"computerUseLive.appWindow":`App window`,"computerUseLive.waitingForFirstFrame":`Connecting to the window…`,"computerUseLive.live":`Live`,"computerUseLive.connecting":`Connecting`,"computerUseLive.staticPreview":`Static preview`,"computerUseLive.secureInput":`Secure input is active: password protection blocks synthetic keyboard input, so agent typing may have no effect.`,"agentRunActivity.generatingVisualContent":`Generating visual content`,"agentRunActivity.discoveringTools":`Discovering optional tools`,"agentRunActivity.filesRead":`Files read`,"agentRunActivity.searchCompleted":`Search completed`,"agentRunActivity.findCompleted":`Find completed`,"agentRunActivity.directoriesBrowsed":`Directories browsed`,"agentRunActivity.filesEdited":`Files edited`,"agentRunActivity.filesWritten":`Files written`,"agentRunActivity.commandCompleted":`Command completed`,"agentRunActivity.scriptCompleted":`Script finished`,"agentRunActivity.commandOutput":`Command output`,"agentRunActivity.exitCode":`exit {code}`,"agentRunActivity.subagentStarted":`Subagent started`,"agentRunActivity.teamMessageSent":`Team message sent`,"agentRunActivity.teamMembersListed":`Team members listed`,"agentRunActivity.teamWorkflowStarted":`Team workflow started`,"agentRunActivity.subagentStatusUpdated":`Subagent status updated`,"agentRunActivity.toolsDiscovered":`Tool discovery completed`,"agentRunActivity.agentQueued":`{name} is queued`,"agentRunActivity.agentStarting":`{name} is starting`,"agentRunActivity.agentRunning":`{name} is running`,"agentRunActivity.agentCompleted":`{name} completed`,"agentRunActivity.agentInterrupted":`{name} was interrupted`,"agentRunActivity.agentFailed":`{name} failed`,"agentRunActivity.agentStatusUpdated":`{name} status updated`,"agentRunActivity.addedTitle":`Added: {title}`,"agentRunActivity.advancingTheTask":`Advancing the task`,"agentRunActivity.blockedTitle":`Blocked: {title}`,"agentRunActivity.compactingContext":`Compacting context`,"agentRunActivity.completedTitle":`Completed: {title}`,"agentRunActivity.completedTotalCompleted":`{completed}/{total} completed`,"agentRunActivity.contextCompactedBeforeAfterTokens":`Context compacted: {before} → {after} tokens`,"agentRunActivity.contextIsFullTheRequestWillRetryAfterCompaction":`Context is full; the request will retry after compaction`,"agentRunActivity.contextIsNearingItsLimitSummarizingOlderMessages":`Context is nearing its limit; summarizing older messages`,"agentRunActivity.countInProgress":`{count} in progress`,"agentRunActivity.countMoreChanges":`{count} more changes`,"agentRunActivity.countPlanChanges":`{count} plan changes`,"agentRunActivity.currentOperationCompleted":`Current operation completed`,"agentRunActivity.inProgressTitle":`In progress: {title}`,"agentRunActivity.noNewProgressForCountS":`No new progress for {count}s`,"agentRunActivity.pendingTitle":`Pending: {title}`,"agentRunActivity.planCleared":`Plan cleared`,"agentRunActivity.planUpdated":`Plan updated`,"agentRunActivity.preparingTheResponse":`Preparing the response`,"agentRunActivity.processingToolResult":`Processing tool result`,"agentRunActivity.startingTheModel":`Starting the model request`,"agentRunActivity.reasoningAboutTheNextStep":`Reasoning about the next step`,"agentRunActivity.reasoningInProgress":`Thinking`,"agentRunActivity.reasoningCompleted":`Reasoning`,"agentRunActivity.toggleReasoning":`Expand or collapse reasoning`,"agentRunActivity.toolActivityAriaLabel":`Tool activity`,"agentRunActivity.removedTitle":`Removed: {title}`,"agentRunActivity.retryingRequest":`Retrying request`,"agentRunActivity.runStopped":`Run stopped`,"agentRunActivity.subagent":`Subagent`,"agentRunActivity.subagentWithProfile":`{name} ({profile} · {model})`,"agentRunActivity.subagentTierModelFallback":`The model named in the definition is unavailable; using the tier model {model}`,"agentRunActivity.subagentParentModelFallback":`The definition's model is unavailable or its tier is unset; using this session's model {model}`,"agentRunActivity.subagentTierUnavailableFallback":`The tier's model is unavailable; using this session's model {model}`,"agentRunActivity.summarizingOlderMessages":`Summarizing older messages`,"agentRunActivity.summarizingOlderMessagesAsRequested":`Summarizing older messages as requested`,"agentRunActivity.thisRunFailed":`This run failed`,"agentRunActivity.toolFailed":`{tool} failed`,"agentRunActivity.tools":`Tools`,"agentRunActivity.understandingTheTask":`Understanding the task`,"agentRunActivity.usingTool":`Using {tool}`,"agentRunActivity.waitingForTheModel":`Waiting for the model`,"agentRunActivity.waitingToRetry":`Waiting to retry`,"agentRunActivity.finalizingTheRun":`Finalizing this run`,"agentRunActivity.teamBudget":`{used} / {budget} tokens`,"agentRunActivity.teamBlocked":`{count} blockers`,"agentRunActivity.teamConflicts":`{count} file conflicts`,"agentRunActivity.teamSummary":`Final team summary`,"agentRunActivity.teamActive":`Team is coordinating work`,"agentRunActivity.teamPaused":`Team is paused`,"agentRunActivity.teamStalled":`Team stalled; review progress`,"agentRunActivity.teamBudgetLimited":`Team budget reached`,"agentRunActivity.teamComplete":`Team completed`,"agentRunActivity.teamTaskStatus":`{name} · {role} · {status}`,"agentRunActivity.teamTaskStatusWithoutRole":`{name} · {status}`,"agentRunActivity.teamTaskQueued":`Queued`,"agentRunActivity.teamTaskStarting":`Starting`,"agentRunActivity.teamTaskRunning":`Running`,"agentRunActivity.teamTaskCompleted":`Completed`,"agentRunActivity.teamTaskFailed":`Failed`,"agentRunActivity.teamTaskInterrupted":`Interrupted`,"agentRunActivity.teamTaskBlocked":`Blocked`,"agentRunActivity.teamTaskStatusUpdated":`Status updated`,"agentRunActivity.teamScript":`Script: {path}`,"agentRunActivity.teamCommunicationCount":`{count} direct Team messages`,"agentRunActivity.teamMessageActivity":`Team member message`,"agentRunActivity.teamMessageDetail":`{from} -> {to}`,"attachments.couldNotReadFile":`Could not read file`,"attachments.nameExceedsThe10MBLimit":`{name} exceeds the 10 MB limit`,"attachments.nameIsNotSupportedChooseAnImageOrTextCodeFile":`{name} is not supported. Choose an image, document, or text/code file.`,"attachments.totalAttachmentSizeCannotExceed20MB":`Total attachment size cannot exceed 20 MB`,"chatDock.newChat":`New chat`,"chatDock.openAChatFromTheSessionListOrSplitItInAnyDirection":`Open a chat from the sidebar, or split it in any direction.`,"chatDock.openAChatToBegin":`Open a chat to begin`,"chatHistoryPage.statusRunning":`Running`,"chatHistoryPage.statusFailed":`Failed`,"chatHistoryPage.statusApproval":`Awaiting approval`,"chatHistoryPage.groupPinned":`Pinned`,"chatHistoryPage.groupToday":`Today`,"chatHistoryPage.groupWeek":`Previous 7 days`,"chatHistoryPage.groupEarlier":`Earlier`,"chatHistoryPage.historySections":`Chat sections`,"chatHistoryPage.activeChats":`Active`,"chatHistoryPage.activeChatsCount":`Active ({count})`,"chatHistoryPage.noActiveChats":`No active chats`,"chatHistoryPage.noArchivedChats":`No archived chats`,"chatHistoryPage.archivedChatsAppearHere":`Archived chats appear here and can be restored anytime.`,"chatHistoryPage.restoreArchivedChats":`Open Archived to restore a chat.`,"chatHistoryPage.sessionUpdateFailed":`The chat could not be updated. Refresh and try again.`,"chatHistoryPage.archivedChats":`Archived ({count})`,"chatHistoryPage.archived":`Archived`,"chatHistoryPage.needsAttention":`Needs attention`,"chatHistoryPage.unread":`Unread`,"chatHistoryPage.pin":`Pin`,"chatHistoryPage.unpin":`Unpin`,"chatHistoryPage.pinned":`Chat pinned`,"chatHistoryPage.unpinned":`Chat unpinned`,"chatHistoryPage.archive":`Archive`,"chatHistoryPage.restore":`Restore`,"chatHistoryPage.movedToArchive":`Chat archived`,"chatHistoryPage.restored":`Chat restored`,"chatHistoryPage.markRead":`Mark as read`,"chatHistoryPage.markedRead":`Marked as read`,"chatHistoryPage.changeSummary":`{count} files · +{added}/-{removed}`,"chatHistoryPage.allChatsShown":`All {count} chats shown`,"chatHistoryPage.chatDeleted":`Chat deleted`,"chatHistoryPage.chatHistory":`Chat history`,"chatHistoryPage.lede":`Every conversation, archived ones included. Open a row to pick it back up.`,"chatHistoryPage.loadFailed":`Couldn’t load chat history`,"chatHistoryPage.chatTitle":`Chat title`,"chatHistoryPage.chatTitleUpdated":`Chat title updated`,"chatHistoryPage.countChatHistoryItems":`{count} chat history items`,"chatHistoryPage.countCurrentlyFiltered":`{count} currently filtered`,"chatHistoryPage.countMessages":`{count} messages`,"chatHistoryPage.delete":`Delete`,"chatHistoryPage.deleteChat":`Delete chat`,"chatHistoryPage.deleteChatNameThisAlsoRemovesLocalChatHistory":`Delete chat “{name}”? This also removes local chat history.`,"chatHistoryPage.loadingChatHistory":`Loading chat history`,"chatHistoryPage.loadMoreChats":`Show more chats ({shown} of {total})`,"chatHistoryPage.moreActionsForChat":`More actions for {name}`,"chatHistoryPage.noConversationsHaveLeftAnEchoYet":`No conversations have left an echo yet`,"chatHistoryPage.noMatchingConversations":`No matching conversations`,"chatHistoryPage.noMessageSummary":`No message summary`,"chatHistoryPage.openChatNamed":`Open chat {name}`,"chatHistoryPage.onceAConversationBeginsItWillBeQuietlyGatheredHere":`Once a conversation begins, it will be quietly gathered here.`,"chatHistoryPage.refresh":`Refresh`,"chatHistoryPage.renameChat":`Rename chat`,"chatHistoryPage.save":`Save`,"chatHistoryPage.sortedByMostRecentlyUpdated":`Sorted by most recently updated`,"chatHistoryPage.tryADifferentSearch":`Try a different search.`,"chatHistoryPage.untitledChat":`Untitled chat`,"chatMessage.closePreview":`Close preview`,"chatMessage.downloadOriginal":`Download original`,"chatMessage.deriveFromHere":`Continue from here`,"chatMessage.rewindHere":`Go back here (with files)`,"fileRewind.title":`Go back here and restore files to the end of this turn?`,"fileRewind.summary":`{count} files will be reverted ({restore} restored, {remove} deleted):`,"fileRewind.restoreItem":`· Restore {path}`,"fileRewind.deleteItem":`· Delete {path} (created after this turn)`,"fileRewind.more":`· {count} more files`,"fileRewind.nothing":`No file changes after this turn can be reverted; only the conversation goes back here.`,"fileRewind.unavailable":`{count} files cannot be reverted (too large, not a regular file, or moved out of the workspace): {paths}`,"fileRewind.incomplete":`Older file snapshots were cleaned up, so the result may be incomplete.`,"fileRewind.scope":`Only changes made by Pisper's write/edit tools are reverted; files changed by shell commands, MCP or other means are not. Reverting files cannot be undone.`,"fileRewind.confirm":`Revert files and go back`,"fileRewind.confirmChatOnly":`Go back here`,"fileRewind.done":`Went back here; {count} files reverted`,"fileRewind.doneChatOnly":`Went back here; no files needed reverting`,"fileRewind.doneUnavailable":`{count} files could not be reverted.`,"chatMessage.createChildChat":`Open a separate chat from here`,"chatMessage.retry":`Retry`,"chatMessage.labelThisTurn":`Mark this turn`,"chatMessage.turnLabel":`Mark: {label}`,"chatMessage.thinkingTime":`Thought {duration}`,"chatMessage.fileAttachment":`File attachment`,"chatMessage.fullScreenImagePreview":`Full-screen image preview`,"chatMessage.generatedImage":`Generated image`,"chatMessage.generatedVideo":`Generated video`,"chatMessage.imageAttachment":`Image attachment`,"chatMessage.openFullScreenPreview":`Open full-screen preview`,"chatMessage.previousImage":`Previous image`,"chatMessage.nextImage":`Next image`,"chatPage.appChat":`{app} chat`,"chatPage.approvalRequired":`Review before writing`,"chatPage.approvalStatusUpdated":`Approval status updated`,"chatPage.chatTitle":`Chat title`,"chatPage.chatTitleUpdated":`Chat title updated`,"chatPage.contextCompacted":`Context compacted`,"chatPage.compactAfterModelSwitch":`Compact the current context?`,"chatPage.compactAfterModelSwitchDescription":`The previous prefix cache cannot be reused after switching models. Compacting now reduces the input the new model must process on its first request.`,"chatPage.compactNow":`Compact now`,"chatPage.currentRunStopped":`Current run stopped`,"chatPage.branchedFromNode":`Derived a branch from this turn; the conversation continues here`,"chatPage.createChildChat":`Open a separate chat from here`,"chatPage.separateChatSuffix":`Separate`,"chatPage.childChatCreated":`Separate chat created`,"chatPage.create":`Create`,"chatPage.enableFullAccess":`Enable full access`,"chatPage.executionModeChangedToMode":`Approval mode changed to {mode}`,"chatPage.fullAccess":`Full access`,"chatPage.fullAccessAllowsTheAgentToUseFilesAndNetworkServicesOutsideTheWorkspaceAndShellCommandsWillNoLon":`Full access allows the Agent to use files and network services outside the workspace and run Shell as the current OS user without per-command approval.`,"chatPage.goalPaused":`Goal paused`,"chatPage.goalTokenBudgetUpdated":`Goal token budget updated`,"chatPage.modelsSessionsAndContextAreSettlingIntoPlace":`Models, sessions, and context are settling into place…`,"chatPage.newChat":`New chat`,"chatPage.newChatCreated":`New chat created`,"chatPage.noModelConfigured":`No model configured`,"chatPage.pleaseAnalyzeTheseAttachments":`Please analyze these attachments.`,"chatPage.renameChat":`Rename chat`,"chatPage.save":`Save`,"chatPage.stopped":`Stopped`,"chatPage.switchedToModel":`Switched to {model}`,"chatPage.switchedToThinkingLevel":`Switched thinking level to {level}`,"chatPage.theAgentHasFinishedResponding":`The agent has finished responding.`,"chatPage.theChatWasCreatedButTheListCouldNotBeRefreshedError":`The chat was created, but the list could not be refreshed: {error}`,"chatPage.waitingForConfiguration":`Waiting for configuration`,"chatPage.wakingTheAgent":`Waking the Agent`,"chatPage.remoteUnavailableSwitchedToLocal":`Remote desktop connection timed out; switched to on-device mode`,"chatPage.workingDirectoryChangedToWorkspace":`Working directory changed to {workspace}`,"chatPage.stopTheActiveRunBeforeChangingTheWorkspace":`Stop the active run before changing the working directory`,"chatPage.stopTheActiveRunBeforeRenamingTheChat":`Stop the active run before renaming the chat`,"focusSession.addAttachment":`Add attachment`,"focusSession.dropAttachment":`Drop files to attach`,"focusSession.queuedInputAlreadyConsumed":`This message has already left the queue and cannot be withdrawn.`,"focusSession.toolbarModel":`Chat model`,"voiceInput.open":`Start voice input`,"voiceInput.close":`Close voice input`,"voiceInput.stop":`Stop recording`,"voiceInput.permissionDenied":`Microphone access was not granted. Allow Pisper to use the microphone in system settings.`,"voiceInput.failed":`Voice input failed`,"voiceInput.empty":`No recognizable voice was captured.`,"voiceMode.title":`Voice Chat`,"voiceMode.idle":`Tap the mic to start talking`,"voiceMode.requesting":`Requesting microphone access…`,"voiceMode.listening":`Listening — tap send when done`,"voiceMode.transcribing":`Transcribing…`,"voiceMode.thinking":`Pisper is thinking…`,"voiceMode.speaking":`Speaking the reply — tap to interrupt`,"voiceMode.failed":`Voice chat error`,"voiceMode.interrupt":`Interrupt and keep talking`,"voiceMode.mute":`Pause listening`,"voiceMode.unmute":`Resume listening`,"voiceMode.emptyReply":`(Nothing speakable in the reply)`,"voiceMode.startConversation":`Start conversation`,"voiceMode.endConversation":`End conversation`,"speechModels.title":`Speech Models & Voices`,"speechModels.notices":`Licenses & Provenance`,"speechModels.provenancePending":`Pending Review`,"speechModels.modifications":`Local Derivation Record`,"speechModels.downloadNotices":`Download Licenses & Provenance`,"speechModels.notInstalled":`Not installed`,"speechModels.downloading":`Downloading`,"speechModels.verifying":`Verifying and installing`,"speechModels.installed":`Installed`,"speechModels.cancelled":`Download cancelled`,"speechModels.failed":`Download failed`,"speechModels.loading":`Loading model status`,"speechModels.recognition":`Speech recognition`,"speechModels.synthesis":`Speech synthesis`,"speechModels.cancelDownload":`Cancel download`,"speechModels.download":`Download model`,"speechModels.downloadAll":`Download Required Models`,"speechModels.voice":`Voice`,"speechModels.preview":`Preview voice`,"speechModels.stopPreview":`Stop preview`,"speechModels.previewEnglish":`Hello. What would you like to work on today?`,"speechModels.previewChinese":`你好,今天有什么需要我帮忙的吗?`,"speechModels.done":`Done`,"speechModels.close":`Close voice conversation`,"focusSession.allow":`Allow`,"focusSession.allowAlways":`Always allow {prefix}`,"focusSession.allowAlwaysHint":`In this project, single commands starting with {prefix} won't ask again (remove it in Settings › Models › Permission rules)`,"focusSession.autoCompactionThreshold":`Auto-compaction threshold`,"focusSession.compactingContext":`Compacting context`,"focusSession.contextUsageToCompactionTokensPercent":`{tokens} tokens ({percent}%) remain before auto-compaction`,"focusSession.currentChatModel":`Current chat model`,"focusSession.modelChipShort":`Model`,"focusSession.currentThinkingLevel":`Current thinking level`,"focusSession.searchModels":`Search models`,"focusSession.noMatchingModels":`No matching models`,"focusSession.noModelsAvailable":`No chat models yet. Add a provider in Settings first.`,"focusSession.thinkingModelDefault":`Model default`,"focusSession.thinkingReset":`Reset`,"focusSession.thinkingLevelTitle":`Reasoning`,"newTask.placeholder":`Describe the task, or type / for commands`,"newTask.greetingMorning":`Good morning`,"newTask.greetingNoon":`Good day`,"newTask.greetingAfternoon":`Good afternoon`,"newTask.greetingEvening":`Good evening`,"newTask.greetingLateNight":`Working late?`,"focusSession.queuedTitle":`Queued`,"focusSession.queuedAfter":`Starts automatically when “{title}” finishes its current turn.`,"focusSession.queuedAfterUnknown":`Starts automatically when the previous task finishes its current turn.`,"focusSession.startQueuedNow":`Start now`,"focusSession.emptyTitle":`No messages yet`,"focusSession.emptyDescription":`Send the first message below.`,"focusSession.taskDescription":`Task description`,"focusSession.thinkingLabel.off":`Off`,"focusSession.thinkingLabel.minimal":`Minimal`,"focusSession.thinkingLabel.low":`Low`,"focusSession.thinkingLabel.medium":`Medium`,"focusSession.thinkingLabel.high":`High`,"focusSession.thinkingLabel.xhigh":`Extra high`,"focusSession.thinkingLabel.max":`Max`,"focusSession.thinkingLevelUnsupported":`The current model has no configurable thinking levels`,"focusSession.thinkingLevelFixed":`The current model only supports the {level} thinking level`,"focusSession.thinkingLevelsLoadFailed":`Thinking levels failed to load. Refresh to retry.`,"focusSession.loadingThinkingLevels":`Loading thinking levels…`,"focusSession.deny":`Deny`,"focusSession.document":`Document`,"focusSession.derivedFromSession":`Derived from “{name}”`,"focusSession.openSourceTurn":`Open this turn in the original chat`,"focusSession.approvalMode":`Approval mode`,"focusSession.executionMode":`Execution mode`,"focusSession.planMode":`Plan mode`,"focusSession.planModeDescription":`Follows a plan for this message, then waits for you`,"focusSession.goalModeDescription":`One Agent keeps going until done or paused`,"focusSession.teamMode":`Team mode`,"focusSession.teamModeDescription":`A lead Agent coordinates subagents to finish`,"focusSession.runningAsTeam":`Team is working together`,"focusSession.goalTokenBudgetUnlimited":`Unlimited`,"focusSession.usedUnlimitedGoalTokens":`{used} tokens used (unlimited)`,"focusSession.fullAccess":`Full access`,"focusSession.goalComplete":`Goal complete`,"focusSession.goalMode":`Goal mode`,"focusSession.goalBudgetSave":`Save budget`,"focusSession.goalTokenBudget":`Goal token budget`,"focusSession.teamTokenBudget":`Team token budget`,"focusSession.goalTokenBudgetHint":`Leave empty for unlimited tokens; entered budgets must be at least 1,000 tokens`,"focusSession.goalTokenBudgetUpdateHint":`Applies immediately and is used on the next goal resume`,"focusSession.teamTokenBudgetHint":`Leave empty for unlimited Team tokens; an entered budget must be at least 1,000 tokens`,"focusSession.fileChanges":`File changes`,"focusSession.fileChangesCount":`Edited {count} files`,"focusSession.fileChangesPending":`{count} pending`,"focusSession.fileChangesEmpty":`No file changes in this session yet`,"focusSession.fileChangesApproved":`Approved`,"focusSession.fileChangesReverted":`Reverted`,"focusSession.fileChangesFormatOnly":`Format only: {detail}`,"focusSession.fileChangesLineEnding":`line endings {from} → {to}`,"focusSession.fileChangesBomAdded":`BOM added`,"focusSession.fileChangesBomRemoved":`BOM removed`,"focusSession.fileChangesNoSnapshot":`This file is binary or too large to preview`,"focusSession.fileChangesApproveFile":`Approve this file`,"focusSession.fileChangesRevertFile":`Revert this file`,"focusSession.fileChangesApproveAll":`Approve all`,"focusSession.fileChangesRevertAll":`Revert all`,"focusSession.fileChangesRevertAllDescription":`Restore every file to its pre-edit state (new files will be deleted)`,"focusSession.fileChangesConfirmRevert":`Confirm revert`,"focusSession.fileChangesApproveDone":`All file changes approved`,"focusSession.fileChangesRevertDone":`File changes reverted`,"focusSession.fileChangesRevertPartial":`Restored {count} file changes; files without snapshots were kept`,"focusSession.fileChangesRevertUnavailable":`No file changes can be restored`,"focusSession.gitCloseDiff":`Close diff`,"focusSession.gitDiffChangedFiles":`Changed files`,"focusSession.gitDiffFileCount":`{count} files`,"focusSession.gitDiffModified":`Modified`,"focusSession.gitDiffNoTextChanges":`No text changes are available for this file`,"focusSession.gitDiffOriginal":`Original`,"focusSession.gitDiffTruncated":`diff truncated (too large)`,"focusSession.gitDiffUnavailable":`No diff available`,"focusSession.gitLoading":`Loading...`,"focusSession.gitMoreFiles":`{count} more files not shown`,"focusSession.gitRefresh":`Refresh changes`,"focusSession.gitViewDiff":`View diff`,"focusSession.gitWaitForRunToFinish":`Wait for the current run to finish`,"focusSession.cacheHitRate":`Cache`,"focusSession.cacheHitRateUnavailable":`The current provider does not report cache usage, so the hit rate is unavailable`,"focusSession.sessionStats":`Detailed statistics`,"focusSession.statCurrentModel":`Current model`,"focusSession.statContextTokens":`Context usage`,"focusSession.statInputTokens":`Input tokens`,"focusSession.statOutputTokens":`Output tokens`,"focusSession.statCacheReadTokens":`Cache read`,"focusSession.statCacheWriteTokens":`Cache write`,"focusSession.statReasoningTokens":`Reasoning tokens`,"focusSession.statProcessedTokens":`Processed tokens`,"focusSession.statRequests":`Requests`,"focusSession.statAvgFirstToken":`Avg. time to first token`,"focusSession.statAvgDuration":`Avg. response duration`,"focusSession.sessionStatsHint":`Timing covers model requests recorded on this device and is kept with the session.`,"focusSession.goalPaused":`Goal paused`,"focusSession.goalReachedItsBudget":`Goal reached its budget`,"focusSession.image":`Image`,"focusSession.localPath":`Local path`,"focusSession.loadingConversationHistory":`Loading conversation history…`,"focusSession.loadingOlderMessages":`Loading older messages…`,"focusSession.loadOlderMessages":`Load older messages`,"focusSession.newContent":`New content`,"focusSession.approvalRequiredShort":`Review`,"focusSession.workspaceWriteShort":`Auto`,"focusSession.fullAccessShort":`Full access`,"focusSession.approvalRequired":`Review before writing`,"focusSession.approvalRequiredShowsADiffBeforeWriting":`Review Diffs and confirm each command`,"focusSession.fullAccessRunsShellWithoutPerCommandApproval":`No more prompts for files or network`,"focusSession.workspaceWrite":`Auto-approve`,"focusSession.workspaceWriteRunsCommandsWithAutomaticApproval":`Auto-approve workspace; confirm outside files`,"focusSession.removeName":`Remove {name}`,"focusSession.renameChat":`Rename chat`,"sessionMenu.exportMarkdown":`Export as Markdown`,"sessionMenu.exported":`Exported “{title}”, without reasoning or full local paths.`,"sessionMenu.exportFailed":`Couldn't export.`,"focusSession.retryOlderMessages":`Retry older messages`,"focusSession.running":`Running`,"focusSession.savingCompactionThreshold":`Saving threshold…`,"focusSession.runningAutonomously":`Running autonomously`,"focusSession.sendMessage":`Send message`,"focusSession.sentToTheRunningAgent":`Queued messages`,"focusSession.stop":`Stop`,"focusSession.stopRunShortcut":`Stop run (Esc)`,"focusSession.text":`Text`,"focusSession.toolRequestsApproval":`{tool} requests approval`,"focusSession.truncated":`Truncated`,"focusSession.unknownSourceSession":`Unknown source chat`,"focusSession.usedBudgetTokensUsed":`{used}/{budget} tokens used`,"focusSession.viewCallArguments":`View call arguments`,"focusSession.generateImage":`Generate image`,"focusSession.visualPromptTemplate":`Generate an image: `,"focusSession.configureVisualModelFirst":`No visual model configured yet — opening model settings`,"chatMessage.fileActionPreview":`Preview`,"chatMessage.filePreviewLoading":`Loading file…`,"chatMessage.filePreviewRetry":`Retry`,"chatMessage.filePreviewSource":`Source`,"chatMessage.filePreviewUnavailable":`Content preview is unavailable for this file.`,"chatMessage.filePreviewTruncated":`Only part of this large file is shown.`,"chatMessage.fileDiffEmpty":`No changes to display: the file is unchanged or has no earlier snapshot.`,"chatMessage.fileDiffFailed":`Failed to load file changes.`,"chatMessage.fileActionDownload":`Download`,"chatMessage.fileActionReveal":`Reveal in file manager`,"chatMessage.fileActionDiff":`View changes`,"chatMessage.fileActionRevert":`Revert changes`,"chatMessage.fileActionConfirmRevert":`Click again to confirm revert`,"chatMessage.fileActionRevertDone":`Changes reverted: {path}`,"chatMessage.fileActionRevertFailed":`Failed to revert changes: {path}`,"chatMessage.moreFiles":`{count} more files`,"chatMessage.fewerFiles":`Show fewer`,"requestNotice.incomplete":`This request could not be completed`,"requestNotice.showDetails":`View details`,"requestNotice.hideDetails":`Hide details`,"requestNotice.details":`Request details`,"requestNotice.retryingAttempt":`Retrying automatically ({attempt}/{maxAttempts})`,"requestNotice.modelFallback":`The primary model is unavailable; switched to backup model {model} to continue`,"focusSession.modelAndThinking":`Model & reasoning`,"sessionContext.addPage":`Add auxiliary page`,"sessionContext.closePage":`Close auxiliary page`,"sessionContext.pageLimit":`Up to 12 auxiliary pages`,"focusSession.runtimeSelectionDeferred":`Changes apply after this response finishes.`,"focusSession.thinkingAfterModelSwitch":`Thinking levels appear once the new model is applied.`,"sideChat.title":`Temporary chat`,"sideChat.retention":`Uses this chat’s workspace and model settings with a separate history. Cleared after 24 idle hours; running tasks do not expire.`,"sideChat.empty":`Explore a side topic without interrupting your main chat.`,"sideChat.expired":`This temporary chat has expired. Your draft is kept; start a new side chat to continue.`,"sideChat.restart":`Start a new side chat`,"sideChat.message":`Temporary chat message`,"sideChat.placeholder":`Explore a side topic…`,"sideChat.send":`Send temporary message`,"sideChat.stop":`Stop temporary response`,"workbench.backToConversation":`Back to conversation`,"workbench.newTab":`New tab`,"workbench.summary":`Pinned summary`,"workbench.closeSummary":`Close summary`,"workbench.projectChanges":`Project changes`,"workbench.taskSnapshots":`Task file snapshots`,"workbench.sources":`Sources`,"workbench.unavailable":`Unavailable`,"workbench.changesFailed":`Could not load project changes. Retry in the changes tab.`,"workbench.otherState":`Other status`,"workbench.viewAll":`View all`,"workbench.addSource":`Add to task draft`,"workbench.sourcesScope":`Sources from loaded task messages. Send new attachments from the composer to include them here.`,"workbench.searchSources":`Search sources`,"workbench.sourceType":`Source type`,"workbench.allTypes":`All types`,"workbench.images":`Images`,"workbench.text":`Text`,"workbench.files":`Files`,"workbench.noMatches":`No matching sources`,"workbench.noSources":`No sources for this task yet`,"workbench.registeredAsset":`Registered attachment`,"workbench.pathReference":`Runtime path reference; preview depends on existing read capabilities.`,"workbench.invalidReference":`Invalid or unregistered reference`,"workbench.projectScope":`Version-control changes in the project directory, including changes from other tasks.`,"workbench.taskSnapshotScope":`File snapshots recorded by this task’s tools; existing approval and revert rules apply.`,"workbench.notRepository":`This directory is not a supported version-control repository.`,"workbench.expandAll":`Expand all`,"workbench.collapseAll":`Collapse all`,"workbench.fullDiff":`Full diff view`,"workbench.partialCounts":`Known text lines (partial)`,"workbench.fileNoLongerChanged":`This file is no longer in the current changes: {path}`,"chatMessage.copyMessage":`Copy message`,"chatMessage.queued":`Queued`,"chatMessage.interrupted":`Interrupted`,"chatMessage.copyReply":`Copy response`,"chatMessage.copyReplyFailed":`Copy failed. Try again or select the text manually.`,"chatMessage.moreReplyActions":`More response actions`,"focusSession.preparingAttachments":`Preparing attachments`,"focusSession.stopping":`Stopping`,"focusSession.waitingForModel":`Switching model. Please wait.`,"focusSession.returnToLatest":`Return to latest messages`,"agentJob.title":`Handed off: {task}`,"agentJob.command":`Background command: {command}`,"agentJob.queued":`queued`,"agentJob.running":`working`,"agentJob.completed":`done`,"agentJob.failed":`failed`,"agentJob.interrupted":`stopped`,"agentJob.stop":`Stop`,"agentJob.expand":`Show this job`,"agentJob.collapse":`Hide`,"agentJob.model":`Model {model}`,"agentJob.tools":`{count} steps`,"botLink.waiting":`waiting for a reply`,"botLink.answered":`replied`,"botLink.stoppedHops":`too many back-and-forths, stopped here`,"botLink.stoppedRate":`too many messages, stopped here`,"sessionMenu.rename":`Rename`,"sessionMenu.compactContext":`Compact context`,"sessionMenu.workflowRuns":`Workflow runs`,"sessionMenu.voiceMode":`Voice chat`,"planBoard.paused":`Paused`,"planBoard.countPaused":`{count} paused`},be={"unsaved.title":`Discard changes?`,"unsaved.description":`Your unsaved changes will be lost.`,"unsaved.keepEditing":`Keep editing`,"unsaved.discard":`Discard`,"unsaved.saving":`Changes are being saved. Try navigating again when saving finishes.`,"app.dragTabsOrSplitChatsInAnyDirectionFromTheSessionList":`Drag tabs, or split chats in any direction`,"app.sessions":`Sessions`,"app.wakingPisper":`Waking Pisper…`,"markdownMessage.copied":`Copied`,"markdownMessage.copy":`Copy`,"markdownMessage.copyCode":`Copy code`,"markdownMessage.revealLocalPath":`Show in file manager: {path}`,"markdownMessage.revealLocalPathOk":`Requested to show in the file manager: {path}`,"markdownMessage.revealLocalPathFailed":`Couldn't show this path in the file manager: {path}`,"markdownMessage.revealLocalPathUnavailable":`Local file reveal is unavailable. Retry in the desktop app on the computer containing this file, or copy the path to open it manually.`,"markdownMessage.revealLocalPathTimeout":`The file manager hasn't responded. You can copy the path to open it manually.`,"markdownMessage.copyPath":`Copy path`,"markdownMessage.copyPathFailed":`Couldn't copy the path. Select and copy it manually.`,"ui.actionFailed":`The action failed. Please try again.`,"ui.cancel":`Cancel`,"ui.closeDialog":`Close dialog`,"ui.notifications":`Notifications`,"ui.confirm":`Confirm`,"ui.name":`Name`,"useAppDialog.confirm":`Confirm`,"useAppDialog.confirmAction":`Confirm action`,"useAppDialog.enterContent":`Enter content`,"useAppDialog.save":`Save`,"workspacePicker.enterAbsolutePath":`Enter an absolute path, such as /home/user/project`,"workspacePicker.importFolderCopy":`Choose device folder and import a copy`,"workspacePicker.importingFolder":`Choosing or importing folder...`,"workspacePicker.selectDirectoryDescription":`Enter a working directory path on the Runtime device. Add attachments using the system file picker.`,"workspacePicker.selectWorkspaceForChat":`Select the working directory for “{name}”`,"workspacePicker.selectWorkspaceForSchedule":`Select the working directory for this schedule`,"workspacePicker.setWorkingDirectory":`Set working directory`,"workspacePicker.switching":`Switching…`,"workspacePicker.systemPickerUnavailable":`The system file manager is not available on this device. Enter the path directly.`,"workspacePicker.useThisFolder":`Use this directory`,"workspacePicker.workingDirectoryPath":`Working directory path`,"webPreview.embedNotice":`Some websites block embedded previews. Use Open in browser if the page does not load.`,"webPreview.openExternal":`Open in browser`,"webPreview.title":`Web preview`,"webPreview.url":`Preview URL`,"webPreview.urlPlaceholder":`Enter a URL…`,"api.invalidResponse":`The server returned an invalid response. Please try again.`,"pageTemplate.loading":`Loading…`,"pageTemplate.retry":`Retry`,"statusGlyph.attention":`Needs you`,"statusGlyph.run":`Running`,"statusGlyph.queued":`Queued`,"statusGlyph.done":`Done`,"statusGlyph.failed":`Failed · seen`,"statusGlyph.stopped":`Stopped`},xe={"modelOnboarding.eyebrow":`Get started with Pisper`,"modelOnboarding.title":`Connect a model first`,"modelOnboarding.description":`Once connected, you can chat, use tools, and run tasks. Set it up now or explore the app first.`,"modelOnboarding.connectionTitle":`Prepare a model service`,"modelOnboarding.connectionDescription":`Enter a model service URL. You can use a cloud service or a compatible endpoint on your private network.`,"modelOnboarding.modelTitle":`Authenticate and choose a model`,"modelOnboarding.modelDescription":`Paste an API key, fetch the model list, and choose the default chat model.`,"modelOnboarding.findExisting":`Find local setup`,"modelOnboarding.later":`Maybe later`,"modelOnboarding.openSettings":`Set up model`,"notificationSettings.feishu":`Feishu`,"notificationSettings.weChat":`WeChat`,"notificationSettings.qq":`QQ`,"notificationSettings.telegram":`Telegram`,"notificationSettings.browserNotification":`Notification`,"notificationSettings.chatCompleted":`Chat completed`,"notificationSettings.chatCompletedDescription":`Sent after Agent finishes responding`,"notificationSettings.chatWaiting":`Waiting for confirmation`,"notificationSettings.chatWaitingDescription":`Sent when Agent pauses and waits for user confirmation`,"notificationSettings.confirmationIsRequired":`Confirmation is required before this action can run.`,"notificationSettings.scheduleCompleted":`Scheduled task completed`,"notificationSettings.scheduleCompletedDescription":`Sent after a scheduled task completes successfully`,"notificationSettings.scheduleFailed":`Scheduled task failed`,"notificationSettings.scheduleFailedDescription":`Sent after a scheduled task fails`,"notificationSettings.workflowCompleted":`Workflow completed`,"notificationSettings.workflowCompletedDescription":`Sent after every node in a workflow completes`,"notificationSettings.workflowFailed":`Workflow failed`,"notificationSettings.workflowFailedDescription":`Sent after a workflow is interrupted or a node fails`,"settingsShell.settingsNavigation":`Settings navigation`,"settingsShell.back":`Back`,"settingsShell.featuresHint":`Plugins, MCP, skills and more are in Features`,"settingsShell.section.models":`Models`,"settingsShell.section.interface":`Interface`,"settingsShell.section.notifications":`Notifications`,"settingsShell.section.shortcuts":`Shortcuts`,"settingsShell.section.updates":`Updates`,"settingsShell.section.labs":`Labs`,"settingsShell.section.about":`About`,"settingsShell.lede.models":`Default model and model providers for new sessions. Each session can still switch model and reasoning in its composer.`,"settingsShell.lede.interface":`Theme, accent, language, density, corners, motion and text size.`,"settingsShell.lede.notifications":`How Pisper tells you when an agent finishes, needs you, or fails.`,"settingsShell.lede.shortcuts":`Review and customize keyboard shortcuts.`,"settingsShell.lede.updates":`Check for, download and install new versions of Pisper.`,"settingsShell.lede.labs":`Try features that are still in development.`,"settingsShell.lede.about":`Version, source code and license.`,"aboutSettings.copyright":`Pisper Contributors · MIT License`,"aboutSettings.description":`A multi-agent app for desktop, terminal, and mobile.`,"aboutSettings.license":`Open-source license`,"aboutSettings.openLinkFailed":`Could not open the link in your browser. Please try again.`,"aboutSettings.projectInformation":`Project information`,"aboutSettings.sourceCode":`Source code`,"aboutSettings.starOnGitHub":`Support Pisper on GitHub`,"aboutSettings.supportDescription":`If Pisper has been useful to you, leave a Star on GitHub to help more people discover the project.`,"aboutSettings.supportPisper":`Support Pisper`,"configPage.addProvider":`Add Provider`,"configPage.addProviderConnection":`Add Provider connection`,"configPage.editProviderConnection":`Edit Provider connection`,"configPage.updateProviderKeyURLAndModelSettings":`Update the key, endpoint, or model used by this connection.`,"configPage.agentRuntimePolicy":`Agent runtime policy`,"configPage.apiKeyRequired":`API key required`,"configPage.apiKey":`API key`,"configPage.leaveBlankToKeepExistingKey":`Leave blank to keep the saved key`,"configPage.leaveBlankToCopySourceKey":`Leave blank to copy the source key`,"configPage.cloneProvider":`Clone Provider`,"configPage.clonedProviderName":`{name} (copy)`,"configPage.providerDefaultModel":`Provider default model`,"configPage.selectModel":`Select a model`,"configPage.defaultProviderUpdated":`{name} is now the default Provider`,"configPage.providerEnabled":`Enable {name}`,"configPage.apiProtocol":`API protocol`,"configPage.about":`About`,"configPage.appUpdates":`App updates`,"configPage.labs":`Labs`,"configPage.authenticationIncludedInConfiguration":`Authentication included in configuration`,"configPage.authenticationReady":`Authentication ready`,"configPage.authenticationRequired":`Authentication required`,"configPage.availableTools":`Available tools`,"configPage.cancel":`Cancel`,"configPage.cannotLoad":`Cannot load`,"configPage.chat":`Chat`,"configPage.chatProvider":`Chat Provider`,"configPage.closeDialog":`Close dialog`,"configPage.codexCLILoginRequired":`Codex CLI login required`,"configPage.configurationFileIsTooLarge":`Configuration file is too large`,"configPage.conflictDetected":`Conflict detected`,"configPage.countModels":`{count} models`,"configPage.createConnection":`Create connection`,"configPage.saveChanges":`Save changes`,"configPage.customManageEachToolOnThePluginsPage":`Custom: manage each tool on the Plugins page`,"configPage.delete":`Delete`,"configPage.deleteNameItsModelSettingsAndAuthenticationDetailsWillAlsoBeRemoved":`Delete “{name}”? Its model settings and authentication details will also be removed.`,"configPage.deleteProvider":`Delete Provider`,"configPage.deleteProviderConnection":`Delete Provider connection`,"configPage.disabled":`Disabled`,"configPage.disabled2":`Disabled`,"configPage.desktopPet":`Desktop pet`,"configPage.displayName":`Display name`,"configPage.enableAfterCreation":`Enable after creation`,"configPage.enabled":`Enabled`,"configPage.enterTheAPIKeyForThisConnection":`Enter the API key for this connection`,"configPage.enterTheProviderAPIKey":`Enter the Provider API key`,"configPage.fetching":`Fetching…`,"configPage.fetchModels":`Fetch models`,"configPage.fetchOrAddAChatModel":`Fetch or add a chat model.`,"configPage.forExampleOpenAIOfficial":`For example, OpenAI Official`,"configPage.fullToolAccess":`All built-in tools (incl. Shell)`,"configPage.image":`Image`,"configPage.imageGenerationAndEditing":`Image generation and editing`,"configPage.initialModelID":`Initial model ID`,"configPage.incompleteLoginState":`Login state is incomplete; sign in again with the official client`,"configPage.interface":`Interface`,"configPage.shortcuts":`Keyboard Shortcuts`,"shortcuts.commandPalette":`Command palette`,"shortcuts.primaryAction":`New task`,"shortcuts.toggleSidebar":`Collapse / expand sidebar`,"shortcuts.toggleTerminal":`Toggle terminal`,"shortcuts.openSettings":`Open settings`,"shortcuts.focusComposer":`Focus chat input`,"shortcuts.voiceInput":`Voice input (hold to talk)`,"shortcuts.edit":`Edit {action} shortcut`,"shortcuts.disable":`Disable {action} shortcut`,"shortcuts.reset":`Reset {action} shortcut`,"shortcuts.resetAll":`Restore defaults`,"shortcuts.resetConfirm":`Restore all keyboard shortcuts to their defaults?`,"shortcuts.recording":`Waiting for keys...`,"shortcuts.disabled":`Unassigned`,"shortcuts.conflict":`This shortcut is already assigned to {action}.`,"shortcuts.invalid":`This combination is unavailable or reserved for the system and text editing.`,"shortcuts.saveFailed":`Could not save: device storage is unavailable.`,"shortcuts.saved":`Saved on this device`,"shortcuts.deviceScope":`This device · In-app shortcuts`,"shortcuts.options":`{action} options`,"shortcuts.disableKey":`Disable shortcut`,"configPage.invalidConfigurationFileFormat":`Invalid configuration file format`,"configPage.keyVariableName":`Key variable: {name}`,"configPage.leaveBlankToUseTheModelID":`Leave blank to use the model ID`,"configPage.loadConfiguration":`Load configuration`,"configPage.loadLoginState":`Load login state`,"configPage.loadOfficialProviderLoginStateFromSource":`Load the login state from {source}? It will be bound only to the official Provider and will not be used with custom Base URLs.`,"configPage.loaded":`Loaded`,"configPage.loading":`Loading…`,"configPage.loadingModelCatalog":`Loading model catalog`,"configPage.loadProviderConfiguration":`Load provider configuration`,"configPage.loadThisProviderConfigurationFromSource":`Load this Provider configuration from {source}?`,"configPage.localProviderConfiguration":`Local provider configuration`,"configPage.modelName":`Model name`,"configPage.models":`Models`,"configPage.modelType":`Model type`,"configPage.multipleAuthenticationFieldsWereDetectedTheAuthorizationFieldTakesPrecedence":`Multiple authentication fields were detected; the authorization field takes precedence.`,"configPage.nameConfigurationHasBeenLoadedIntoPisper":`{name} configuration has been loaded into Pisper`,"configPage.nameLoginStateHasBeenLoadedIntoPisper":`{name} login state has been loaded into Pisper`,"configPage.nameState":`{name} {state}`,"configPage.noAuthenticationInConfiguration":`No authentication in configuration`,"configPage.noBaseURLSpecified":`No Base URL specified`,"configPage.noImportableCodexOrClaudeProviderConfigurationWasDetected":`No importable Codex or Claude provider configuration was detected.`,"configPage.noImportableProviderConfigurationWasFound":`No importable provider configuration was found`,"configPage.noModelSpecified":`No model specified`,"configPage.notifications":`Notifications`,"configPage.remoteAccess":`Remote access`,"configPage.mobileServer":`Servers`,"mobileServer.addServer":`Add server`,"mobileServer.awaitingApproval":`A connection request was sent to “{name}”. Approve it on the desktop.`,"mobileServer.cameraDenied":`Camera permission was not granted. Grant it in system settings and try again.`,"mobileServer.cancelRequest":`Cancel request`,"mobileServer.cancelScan":`Cancel scan`,"mobileServer.connect":`Connect`,"mobileServer.current":`Connected`,"mobileServer.currentLocal":`Running here`,"mobileServer.description":`Choose which desktop to connect to. Sessions and data live on the desktop; this device is a client.`,"mobileServer.discoverDescription":`Choose a desktop found on this LAN and wait for its approval, or pair remotely with a QR code.`,"mobileServer.discovering":`Searching this LAN for Pisper Desktop…`,"mobileServer.discoveryFailed":`LAN discovery is unavailable. Try again or pair with a QR code.`,"mobileServer.localNetworkDenied":`Local network access is required to discover desktops. Allow it in system settings and retry.`,"mobileServer.empty":`No paired servers yet. Tap “Add server” to connect.`,"mobileServer.forget":`Forget`,"mobileServer.forgetConfirm":`You will need to pair again to reconnect to this server. Forget it?`,"mobileServer.loadFailed":`Failed to load the server list. Please restart the app.`,"mobileServer.localTitle":`On-device`,"mobileServer.localDescription":`Run the same Pisper Runtime used by desktop directly on this device. Available capabilities depend on the device environment.`,"mobileServer.enterLocal":`Run on this device`,"mobileServer.nearby":`Nearby desktops`,"mobileServer.noNearby":`No available desktops were found. Make sure remote access is enabled on the computer.`,"mobileServer.otherMethods":`Other connection methods`,"mobileServer.pairFailed":`Pairing succeeded, but the server proxy address is unavailable.`,"mobileServer.scan":`Scan QR code`,"mobileServer.scanFailed":`No valid pairing QR code was found.`,"mobileServer.scanHint":`Place the desktop QR code inside the frame. It scans automatically; no photo is needed.`,"mobileServer.scanTitle":`Scan pairing QR code`,"mobileServer.rediscover":`Search the LAN again`,"mobileServer.requestConnect":`Request access`,"mobileServer.activeTransport":`Current path: {transport}`,"mobileServer.transportLan":`LAN`,"mobileServer.transportLanP2p":`LAN + P2P`,"mobileServer.transportP2p":`P2P`,"mobileServer.title":`Servers`,"remoteAccess.approvalFailed":`Failed to process the connection request: {message}`,"remoteAccess.approve":`Approve`,"remoteAccess.codeExpiresAt":`Pairing code expires {time}`,"remoteAccess.currentDevice":`(this device)`,"remoteAccess.description":`Connect a phone or tablet to this Pisper instance. The app prefers LAN and falls back to Iroh P2P away from home; TLS fingerprint pinning and device tokens still protect the upper layer.`,"remoteAccess.devices":`Paired devices`,"remoteAccess.firewallTitle":`System firewall`,"remoteAccess.firewallDisabled":`Remote access is off. Rules managed by Pisper have been cleaned up.`,"remoteAccess.firewallConfigured":`Pisper firewall policy was configured at the last check.`,"remoteAccess.firewallNotNeeded":`The system firewall was detected as inactive. No allow rule is needed.`,"remoteAccess.firewallNeedsAuthorization":`An allow policy has not been confirmed. Retry locally and complete system authorization.`,"remoteAccess.firewallUnsupported":`Automatic firewall configuration is unavailable in this environment.`,"remoteAccess.firewallCancelled":`System authorization was cancelled. Access has not been confirmed.`,"remoteAccess.firewallError":`Firewall configuration is incomplete.`,"remoteAccess.firewallCleanupPending":`The remote listener has stopped, but firewall rules still need cleanup. Retry cleanup.`,"remoteAccess.firewallPackagedApp":`macOS requires the packaged Pisper app to authorize its dedicated sidecar. Generic Node.js processes are never allowed.`,"remoteAccess.firewallUnsupportedBackend":`No supported system firewall tool is available. Linux automation supports UFW and an active firewalld.`,"remoteAccess.firewallPermissionDenied":`System permission was not granted. Policy enforcement has not been confirmed.`,"remoteAccess.firewallTimeout":`System authorization or the operation timed out. It may still be running; retry the check later.`,"remoteAccess.firewallBlockAll":`macOS is set to block all incoming connections. Pisper does not change this global setting.`,"remoteAccess.firewallRuleChanged":`The HTTPS port, runtime path, or network zone has changed. Existing rules need updating.`,"remoteAccess.firewallVerificationFailed":`System policy could not be verified. Retry and check system permissions or organization policies.`,"remoteAccess.firewallRetry":`Check and retry authorization`,"remoteAccess.firewallRetryCleanup":`Authorize rule cleanup`,"remoteAccess.firewallRetryFailed":`Firewall operation failed: {message}`,"remoteAccess.firewallWorking":`Checking or waiting for system authorization…`,"remoteAccess.firewallApplicationScope":`macOS authorizes applications: only the packaged Pisper sidecar is allowed to receive connections. This system policy cannot be limited to one port.`,"remoteAccess.firewallProgramPortScope":`Windows allows only this runtime program on HTTPS TCP port {port}, from LocalSubnet sources including LAN IPv4/IPv6. No additional Tailscale address range is allowed.`,"remoteAccess.firewallPortScope":`Linux allows only remote HTTPS TCP port {port}. The global firewall switch is unchanged.`,"remoteAccess.firewallReachability":`A local listener or configured rule does not prove the phone can connect. LAN reachability is unverified and still depends on network isolation, other firewalls, and phone permissions.`,"remoteAccess.firewallCheckedAt":`Last checked: {time}`,"remoteAccess.generateQr":`Generate pairing QR code`,"remoteAccess.generatingQr":`Generating…`,"remoteAccess.lastSeen":`Last active: {time}`,"remoteAccess.listenFailed":`Remote listener failed to start: {message}`,"remoteAccess.loadFailed":`Failed to load remote access status. Make sure the runtime supports remote access.`,"remoteAccess.noDevices":`No paired devices yet. Generate a pairing QR code and scan it with the Pisper app on your phone.`,"remoteAccess.pairing":`Device pairing`,"remoteAccess.pairingDescription":`Click the button to open a pairing QR code. The pairing code is valid for 5 minutes and can be used once.`,"remoteAccess.pairingFailed":`Failed to generate pairing code: {message}`,"remoteAccess.pairingQrTitle":`Pair with the Pisper app`,"remoteAccess.pendingApprovals":`Pending connections`,"remoteAccess.pendingApprovalsDescription":`Approve only the device you are connecting now. It cannot access sessions or Runtime APIs before approval.`,"remoteAccess.qrAlt":`Pairing QR code`,"remoteAccess.qrUnavailable":`The QR code could not be generated. Regenerate it or restart the desktop Runtime.`,"remoteAccess.scanQrDescription":`Open Add server on your phone and scan the QR code below. The app prefers LAN and falls back to Iroh P2P when needed.`,"remoteAccess.regenerate":`Regenerate`,"remoteAccess.refresh":`Refresh`,"remoteAccess.reject":`Reject`,"remoteAccess.requestedAt":`Requested {time}`,"remoteAccess.requestSource":`Source address: {ip}`,"remoteAccess.revoke":`Revoke`,"remoteAccess.revokeConfirm":`Revoking will immediately disconnect “{name}”. Continue?`,"remoteAccess.revokeFailed":`Failed to revoke device: {message}`,"remoteAccess.title":`Remote access`,"remoteAccess.toggleFailed":`Failed to toggle remote access: {message}`,"configPage.loginStateFileDetected":`Verified OAuth login state`,"configPage.officialEndpointOnly":`Official endpoint only`,"configPage.officialProviderAuthenticationOnly":`Official Provider authentication`,"configPage.optionalUsedOnlyForOpenAIOrganization":`Optional; used only for OpenAI Organization`,"configPage.providerConnectionCreated":`Provider connection created`,"configPage.providerConnectionUpdated":`Provider connection updated`,"configPage.providerConnectionDeleted":`Provider connection deleted`,"configPage.providerPurpose":`Provider purpose`,"configPage.readingProvidersAndAuthenticationStatus":`Reading Providers and authentication status…`,"configPage.readProviderEndpointModelAndAuthenticationFieldsFromCodexConfigTomlAndClaudeSettingsJson":`Read Provider settings and explicitly import official Codex or Claude login states from local files.`,"configPage.rescan":`Rescan`,"configPage.setAsDefaultProvider":`Set as default Provider`,"configPage.saving":`Saving…`,"configPage.scanningProviderConfigurationFiles":`Scanning provider configuration files…`,"configPage.someConfigurationFieldsCannotBeImported":`Some configuration fields cannot be imported`,"configPage.theAPIProtocolInThisConfigurationIsNotSupportedYet":`The API protocol in this configuration is not supported yet`,"configPage.theKeyEnvironmentVariableNameIsInvalid":`The key environment variable name is invalid`,"configPage.theProviderEndpointIsInvalid":`The provider endpoint is invalid`,"configPage.thinkingLevel":`Thinking level`,"configPage.modelThinkingLevels":`Supported thinking levels`,"configPage.modelThinkingLevelsHint":`Select the levels this model actually supports; unchecked levels are hidden from the composer's thinking dropdown. For local models (llama.cpp / LM Studio etc.), pick the levels its chat template supports.`,"configPage.unableToReadTheConfigurationFile":`Unable to read the configuration file`,"configPage.unsavedChanges":`Unsaved settings`,"configPage.video":`Video`,"configPage.videoGeneration":`Video generation`,"configPage.visualModels":`Visual models`,"configPage.visualModelsAreSelectedByTheVisualGenerationToolAndDoNotAppearInTheChatModelList":`Visual models are selected by the visual generation tool and do not appear in the chat model list.`,"configPage.visualProvider":`Visual Provider`,"configPage.youCanCreateMultipleConnectionsUsingTheSameProtocolEachWithItsOwnKeyAndBaseURL":`You can create multiple connections using the same protocol, each with its own key and base URL.`,"interfaceSettings.accentBlue":`Pisper blue`,"interfaceSettings.accentColor":`Accent color`,"interfaceSettings.accentCoral":`Coral`,"interfaceSettings.accentCustom":`Custom`,"interfaceSettings.customAccentColor":`Custom accent color`,"interfaceSettings.customAccentHex":`Enter a HEX color`,"interfaceSettings.invalidAccentColor":`Enter a 6-digit HEX color (e.g. #1677e8)`,"interfaceSettings.accentNeutral":`Graphite`,"interfaceSettings.accentTeal":`Teal`,"interfaceSettings.accentViolet":`Violet`,"interfaceSettings.advanced":`Advanced`,"interfaceSettings.visualStyle":`Visual style`,"interfaceSettings.appearance":`Appearance`,"interfaceSettings.appearanceDescription":`Choose the color mode, accent, and visual style of the interface.`,"interfaceSettings.automaticByTime":`Automatic by time`,"interfaceSettings.automaticByTimeDescription":`Use dark mode from 18:00 to 08:00`,"interfaceSettings.colorMode":`Color mode`,"interfaceSettings.comfortable":`Comfortable`,"interfaceSettings.comfortableDescription":`Keep relaxed spacing and sizing`,"interfaceSettings.compact":`Compact`,"interfaceSettings.compactDescription":`Fit more content on screen`,"interfaceSettings.cornerStyle":`Corner style`,"interfaceSettings.dark":`Dark`,"interfaceSettings.darkDescription":`Always use the low-light interface`,"interfaceSettings.defaultsRestored":`Interface settings restored to defaults`,"interfaceSettings.displayAndMotion":`Display and motion`,"interfaceSettings.followSystem":`Follow system`,"interfaceSettings.followSystemDescription":`Match the operating system color mode`,"interfaceSettings.interfaceDensity":`Interface density`,"interfaceSettings.interfaceStyle":`Interface style`,"interfaceSettings.light":`Light`,"interfaceSettings.lightDescription":`Always use the bright interface`,"interfaceSettings.motion":`Interface motion`,"interfaceSettings.pinInspector":`Pin the inspector`,"interfaceSettings.pinInspectorDescription":`Keep it docked instead of sliding in on demand.`,"interfaceSettings.motionFull":`Full`,"interfaceSettings.motionFullDescription":`Keep all transitions and feedback`,"interfaceSettings.motionReduced":`Reduced`,"interfaceSettings.motionReducedDescription":`Reduce nonessential movement`,"interfaceSettings.motionSystem":`Follow system`,"interfaceSettings.motionSystemDescription":`Use the operating system motion preference`,"interfaceSettings.preferencesUpdated":`Interface preferences updated`,"interfaceSettings.restoreDefaults":`Restore defaults`,"interfaceSettings.sharp":`Sharp`,"interfaceSettings.soft":`Soft`,"interfaceSettings.standard":`Standard`,"languageSettings.interfaceOnlyHint":`Interface only; does not change agent response language.`,"languageSettings.displayLanguage":`Display language`,"languageSettings.displayLanguageChangedToEnglish":`Display language changed to English`,"languageSettings.displayLanguageChangedToSimplifiedChinese":`Display language changed to Simplified Chinese`,"languageSettings.english":`English`,"languageSettings.simplifiedChinese":`Simplified Chinese`,"cliSettings.checking":`Checking`,"cliSettings.commandNotInstalled":`The {command} terminal command is not installed`,"cliSettings.commandReady":`The {command} terminal command is ready`,"cliSettings.description":`Install the Pisper terminal client and configure PATH for the current user without administrator access.`,"cliSettings.install":`Install terminal command`,"cliSettings.installed":`Installed`,"cliSettings.installedNotification":`Pisper terminal command installed; restart the terminal host to activate it`,"cliSettings.needsRepair":`Needs repair`,"cliSettings.notInstalled":`Not installed`,"cliSettings.pathConfigured":`Added to the current user's PATH.`,"cliSettings.pathNeedsRepair":`PATH configuration is incomplete. Repair the installation.`,"cliSettings.repair":`Repair terminal command`,"cliSettings.restartTerminal":`Restart the terminal host after installing or uninstalling so it reads the updated PATH. Fully quit and reopen Windows Terminal, or restart the IDE that owns an integrated terminal.`,"cliSettings.title":`Pisper terminal command`,"cliSettings.unavailable":`Unavailable in this build`,"cliSettings.uninstall":`Uninstall terminal command`,"cliSettings.uninstalledNotification":`Pisper terminal command uninstalled`,"notificationSettings.appNotificationTest":`{app} notification test`,"notificationSettings.availableVariables":`Available variables`,"notificationSettings.browserFailedToStart":`Browser failed to start`,"notificationSettings.browserNotificationsAreBlocked":`Browser notifications are blocked`,"notificationSettings.checking":`Checking`,"notificationSettings.controlledByBrowserSitePermissions":`Controlled by browser site permissions`,"notificationSettings.controlledByOperatingSystemNotificationSettings":`Controlled by operating system notification settings`,"notificationSettings.dailyCodeReview":`Daily code review`,"notificationSettings.endToEndTests":`End-to-end tests`,"notificationSettings.fixChannelNotification":`Fix channel notification`,"notificationSettings.found2IssuesToAddressTheReportHasBeenArchived":`Found 2 issues to address. The report has been archived.`,"notificationSettings.implementationIsCompleteTestsAndBuildHavePassed":`Implementation is complete. Tests and build have passed.`,"notificationSettings.loadingNotificationSettings":`Loading notification settings`,"notificationSettings.message2Min18Sec":`2 min 18 sec`,"notificationSettings.message6Min42Sec":`6 min 42 sec`,"notificationSettings.messageContent":`Message content`,"notificationSettings.notificationPermissionWasNotGrantedAllowNotificationsInTheBrowserSiteSettings":`Notification permission was not granted. Allow notifications in the browser site settings.`,"notificationSettings.notificationsAreWorking":`Notifications are working.`,"notificationSettings.notificationTemplates":`Notification templates`,"notificationSettings.notificationTemplateSaved":`Notification template saved`,"notificationSettings.notSupported":`Not supported`,"notificationSettings.openNotificationPermissionsInYourOperatingSystemSettings":`Open notification permissions in your operating system settings.`,"notificationSettings.openSystemNotificationSettings":`Open system notification settings`,"notificationSettings.permissionGranted":`Permission granted`,"notificationSettings.preReleaseChecks":`Pre-release checks`,"notificationSettings.preview":`Preview`,"notificationSettings.saveTemplate":`Save template`,"notificationSettings.sendTest":`Send test`,"notificationSettings.sendTestNotification":`Send test notification`,"notificationSettings.systemNotificationsAreNotSupportedInThisEnvironment":`System notifications are not supported in this environment.`,"notificationSettings.systemNotificationsAreOff":`System notifications are off`,"notificationSettings.systemNotificationsAreOffAllowPisperToSendNotificationsInYourOperatingSystemSettings":`System notifications are off. Allow Pisper to send notifications in your operating system settings.`,"notificationSettings.testNotificationSentToCountChats":`Test notification sent to {count} chats`,"notificationSettings.testProcessTimedOut":`Test process timed out`,"notificationSettings.testsBuildAndSecurityChecksHaveAllPassed":`Tests, build, and security checks have all passed.`,"notificationSettings.theBrowserBackgroundNotificationServiceCouldNotBeRegistered":`The browser background notification service could not be registered.`,"notificationSettings.theDesktopAppUsesOperatingSystemNotificationsTurningThisOffDoesNotChangeTheOperatingSystemPermis":`The desktop app uses operating system notifications. Turning this off does not change the operating system permission itself.`,"notificationSettings.theOperatingSystemDidNotAcceptTheNotificationCheckYourSystemNotificationSettings":`The operating system did not accept the notification. Check your system notification settings.`,"notificationSettings.theTestNotificationWasSentCheckYourSystemNotificationCenter":`The test notification was sent. Check your system notification center.`,"notificationSettings.theWebAppUsesBrowserSiteNotificationsTurningThisOffDoesNotChangeTheBrowserPermissionItself":`The Web app uses browser site notifications. Turning this off does not change the browser permission itself.`,"notificationSettings.tomorrow0900":`Tomorrow 09:00`,"notificationSettings.pisperUsesTheCurrentPlatformNotificationSystemWhenAnAgentCompletesOrFails":`Pisper uses the current platform notification system when an agent completes or fails.`,"notificationSettings.waitingForPermission":`Waiting for permission`,"updateSettings.browserMode":`Browser mode`,"updateSettings.checkFailed":`Check failed`,"updateSettings.checkForUpdates":`Check for updates`,"updateSettings.checking":`Checking`,"updateSettings.checking2":`Checking…`,"updateSettings.commitsThatHaveNotBeenSyncedWillAppearHereAfterTheCheck":`Commits that have not been synced will appear here after the check.`,"updateSettings.commitsToSync":`Commits to sync`,"updateSettings.currentReleaseNotes":`Current release notes`,"updateSettings.currentSource":`Current source`,"updateSettings.currentSourceStatus":`Current source status`,"updateSettings.currentVersion":`Current version`,"updateSettings.downloadedDataWasPreservedAndCanResumeFromTheInterruptionPoint":`Downloaded data was preserved and can resume from the interruption point.`,"updateSettings.downloading":`Downloading`,"updateSettings.downloadPaused":`Download paused`,"desktopPetSettings.browsePetdex":`Browse Petdex pets`,"desktopPetSettings.bubbleDone":`All done!`,"desktopPetSettings.bubbleFailed":`Something went wrong`,"desktopPetSettings.bubbleHello":`Hello!`,"desktopPetSettings.bubbleResponding":`Responding…`,"desktopPetSettings.bubbleThinking":`Thinking…`,"desktopPetSettings.bubbleWorking":`Working…`,"desktopPetSettings.currentPet":`Current pet: {name}`,"desktopPetSettings.delete":`Delete pet`,"desktopPetSettings.deleteConfirm":`Delete “{name}”? Its local pet resources will be removed.`,"desktopPetSettings.deleteTitle":`Delete desktop pet`,"desktopPetSettings.description":`This is a built-in Pisper desktop pet. The desktop app uses an independent window, while the Web app floats it inside Pisper and drives it from current Agent activity.`,"desktopPetSettings.desktopOnly":`Desktop-only feature`,"desktopPetSettings.desktopOnlyDescription":`Desktop pets are available only in the Pisper desktop app.`,"desktopPetSettings.install":`Install`,"desktopPetSettings.installed":`Installed`,"desktopPetSettings.installBeforeEnabling":`Install a pet from Petdex before enabling desktop display.`,"desktopPetSettings.installDescription":`Search Petdex pets. Pisper installs and manages them without the Petdex CLI or separate desktop app.`,"desktopPetSettings.installedDescription":`Choose the pet shown by Pisper. Existing Petdex and Codex pet directories remain compatible.`,"desktopPetSettings.installedTitle":`Installed pets`,"desktopPetSettings.installTitle":`Add a pet from Petdex`,"desktopPetSettings.loading":`Loading desktop pet status…`,"desktopPetSettings.opacity":`Pet opacity`,"desktopPetSettings.petDisabled":`Desktop pet disabled`,"desktopPetSettings.petEnabled":`Desktop pet enabled`,"desktopPetSettings.petInstalled":`Installed and selected {name}`,"desktopPetSettings.petRemoved":`Deleted {name}`,"desktopPetSettings.petSelected":`Switched to {name}`,"desktopPetSettings.petSlug":`Petdex pet slug`,"desktopPetSettings.running":`Visible`,"desktopPetSettings.search":`Search`,"desktopPetSettings.searchPlaceholder":`Search by pet name or slug, for example boba`,"desktopPetSettings.showOnDesktop":`Show on desktop`,"desktopPetSettings.stopped":`Hidden`,"desktopPetSettings.title":`Pisper desktop pet`,"desktopPetSettings.webPetLabel":`Pisper desktop pet: {name}`,"updateSettings.appComponents":`App components`,"updateSettings.desktopFrontend":`Desktop frontend`,"updateSettings.downloadAndInstallUpdates":`Download and install updates`,"updateSettings.downloadProgress":`Download progress`,"updateSettings.downloadUpdate":`Download update`,"updateSettings.installed":`Installed`,"updateSettings.installingUpdates":`Installing updates…`,"updateSettings.newVersionReleaseNotes":`New version release notes`,"updateSettings.noReleaseNotesAreAvailableForThisVersion":`No release notes are available for this version.`,"updateSettings.notChecked":`Not checked`,"updateSettings.platform":`Platform`,"updateSettings.readyToRestart":`Ready to restart`,"updateSettings.restartAndInstall":`Restart and install`,"updateSettings.resumeDownload":`Resume download`,"updateSettings.runtime":`Runtime`,"updateSettings.sourceUpdatesAvailable":`Source updates available`,"updateSettings.theCurrentWebSourceIsSyncedWithBranch":`The current Web source is synced with {branch}.`,"updateSettings.updateAvailable":`Update available`,"updateSettings.tuiClient":`TUI client`,"updateSettings.updateChannel":`Update channel`,"updateSettings.upToDate":`Up to date`,"updateSettings.pisperAppUpdates":`Pisper app updates`,"updateSettings.viewRelease":`View release`,"updateSettings.viewSourceUpdates":`View source updates`,"updateSettings.viewUpdateDiagnosticLog":`View update diagnostic log`,"configPage.connection":`Connection`,"configPage.authentication":`Authentication`,"configPage.currentChatModel":`Default Provider and model`,"configPage.quickSetup":`Quick setup`,"configPage.quickSetupTitle":`Quick model setup`,"configPage.visualQuickSetupTitle":`Quick visual model setup`,"configPage.visualQuickSetup":`Set up visual models`,"configPage.quickSetupStepBaseUrl":`Enter Base URL`,"configPage.quickSetupStepProtocol":`Choose API protocol`,"configPage.quickSetupStepModel":`Fetch and choose a model`,"configPage.quickSetupBaseUrlHint":`Enter the model API endpoint from your provider. The next step uses the selected protocol to fetch its model list.`,"configPage.providerBaseURLMustBeHTTPOrHTTPS":`Base URL must be a valid HTTP or HTTPS address.`,"configPage.selectAPIProtocol":`Select an API protocol.`,"configPage.selectVisualModelToFinish":`Choose an image or video model so the Agent can use visual generation.`,"configPage.fetchOrAddAVisualModel":`Fetch an image or video model.`,"configPage.stepIndicator":`Step {current} of {total}`,"configPage.addCustomConnection":`Add a custom connection`,"configPage.fetchingModels":`Fetching models…`,"configPage.selectModelToFinish":`Provider default chat model`,"configPage.setupComplete":`Provider configuration saved`,"configPage.nextStep":`Next`,"configPage.previousStep":`Back`,"configPage.visualImageModel":`Image model`,"configPage.visualVideoModel":`Video model`,"configPage.testGeneration":`Test generation`,"configPage.testingGeneration":`Testing generation…`,"configPage.testSucceeded":`Test succeeded — the visual model works`,"configPage.visualEmptyHint":`Once a visual model is configured, the Agent can generate images, edit images, or create videos right in chat.`,"configPage.visualModelUpdated":`Visual model selection updated`,"configPage.visualAutoSelected":`Auto-selected`,"configPage.visualConnections":`Visual connections`,"configPage.visualConnectionsHint":`Toggle visual providers and pick default models`,"configPage.currentVisualModel":`Current visual model`,"configPage.visualNoneConfigured":`No visual model configured`,"configPage.loadingVisualStatus":`Loading visual model status…`,"configPage.connections":`Connections`,"configPage.defaultBadge":`Default`,"configPage.configure":`Configure`,"configPage.manualModelId":`Model ID (manual)`,"configPage.manualModelIdHint":`If the model you need is not listed, enter its ID directly`,"configPage.manualModelIds":`Add more model IDs (optional)`,"configPage.manualModelIdsHint":`Click + or press Enter to append each ID; all are saved to this connection with the selected model`,"configPage.runtimePolicySaved":`Runtime policy saved`,"configPage.manageConnections":`Manage connections`,"configPage.localProviderImportHint":`{count} local configuration(s) available to import`,"configPage.reviewLocalProviders":`Review`,"configPage.discoverFailedUsingExisting":`Couldn't fetch the model list ({message}) — you can pick from the existing models`,"configSearch.placeholder":`Search settings (model, notifications…)`,"configSearch.placeholderShort":`Search settings`,"configSearch.noResults":`No matching settings found`,"providerWorkbench.actions":`Connection actions`,"providerWorkbench.models":`Models`,"providerWorkbench.advanced":`More settings`,"providerWorkbench.advancedHint":`Local config import and image / video models`,"providerWorkbench.modelOptions":`Model capabilities and additional models`,"interfaceSettings.uiFontSize":`UI font size`,"interfaceSettings.codeFontSize":`Code font size`,"interfaceSettings.numericFontHint":`Adjust UI and code independently. Chat text and icons keep their own sizes.`,"interfaceSettings.invalidFontSize":`Enter a whole number from {min} to {max}.`,"providerWorkbench.noConnections":`No providers added yet`,"providerWorkbench.default":`Default`,"providerWorkbench.addConnectionHint":`Use Quick Setup or Add provider below to enter the endpoint, protocol and key, then pick models.`,"providerWorkbench.scanningLocal":`Connecting local Claude Code / Codex settings…`,"providerWorkbench.localImportStatus":`Local configuration · {imported} imported · {skipped} need review`,"providerWorkbench.addConnection":`Add connection`,"providerWorkbench.contextColumn":`Context`,"providerWorkbench.defaultModel":`Default model`,"providerWorkbench.defaultModelHint":`Used by new task drafts and the dispatch dialog`,"providerWorkbench.noChatModel":`No chat model available yet`,"providerWorkbench.fallbackModels":`Backup models`,"providerWorkbench.fallbackModelsHint":`Used in order when the primary model is still unavailable after retries or out of quota`,"providerWorkbench.fallbackNone":`None`,"providerWorkbench.fallbackFirst":`First backup model`,"providerWorkbench.fallbackSecond":`Second backup model`,"providerWorkbench.fallbackModelsSaved":`Backup models saved`,"providerWorkbench.auxiliaryModel":`Auxiliary model`,"providerWorkbench.auxiliaryModelHint":`Writes session titles, compacts context and organizes memory; falls back to the usual model when unavailable`,"providerWorkbench.auxiliaryFollowSession":`None (follow the session model)`,"providerWorkbench.auxiliaryModelSaved":`Auxiliary model saved`,"subagents.title":`Subagents`,"subagents.hint":`The main agent picks a tier (fast, standard, or strong) for each subagent; choose which model each tier uses here, effective right away. Unset tiers follow the current session model. A subagent definition that names a model or tier takes precedence.`,"subagents.tierFast":`Fast`,"subagents.tierFastHint":`Simple lookups and tidying, on a cheap, quick model`,"subagents.tierStandard":`Standard`,"subagents.tierStandardHint":`Everyday implementation and edits`,"subagents.tierStrong":`Strong`,"subagents.tierStrongHint":`Hard design, debugging, and review`,"subagents.followSession":`Follow the session model`,"subagents.tiersSaved":`Subagent model tiers saved`,"subagents.globalDefinitions":`Global subagent definitions`,"subagents.definitionsHint":`One Markdown file per subagent. Global definitions live in agents/ inside the data directory and apply to every project; project definitions live in the project's .pisper/agents/, can be committed with the repository, and override a global definition with the same name.`,"subagents.loading":`Reading subagent definitions…`,"subagents.empty":`No global subagent definitions yet.`,"subagents.inheritModel":`Follows the session model`,"subagents.toolCount":`Tools: {count}`,"permissionRules.title":`Permission rules`,"permissionRules.hint":`Allow by command prefix or directory, deny by command prefix. Allow rules only match single commands without pipes or redirects, and commands flagged by the command guard still ask; deny rules apply even in full access.`,"permissionRules.loading":`Loading rules…`,"permissionRules.empty":`No rules yet. Choose “Always allow” when approving a command, or add one below.`,"permissionRules.allow":`Allow`,"permissionRules.deny":`Deny`,"permissionRules.command":`Command`,"permissionRules.files":`File writes`,"permissionRules.global":`Global`,"permissionRules.remove":`Remove rule {pattern}`,"permissionRules.removed":`Rule removed`,"permissionRules.added":`Rule added`,"permissionRules.effectLabel":`Rule type`,"permissionRules.toolLabel":`Applies to`,"permissionRules.patternLabel":`Command prefix or directory`,"permissionRules.commandPlaceholder":`e.g. npm test`,"permissionRules.filesPlaceholder":`e.g. src (relative to workspace)`,"permissionRules.add":`Add`,"providerWorkbench.thinkingHint":`Higher is slower; each chat can still switch it in the composer`,"providerWorkbench.toolsHint":`Enforced by the Runtime; running chats keep going, new chats use the latest policy`,"providerWorkbench.defaultsNeedProvider":`Add and enable a provider before setting these defaults.`,"providerWorkbench.providers":`Providers`,"providerWorkbench.providersHint":`Expand a provider to edit its connection, key and models; leave the key blank to keep the existing one.`,"providerWorkbench.connected":`Connected`,"providerWorkbench.notConnected":`Not connected`,"providerWorkbench.keyConfigured":`API key configured`,"providerWorkbench.toggleProvider":`Show the connection and models for {name}`,"providerWorkbench.addProvider":`Add provider`,"providerWorkbench.addProviderHint":`OpenAI-compatible APIs and more, via the Quick Setup steps`,"providerWorkbench.loadFailed":`Couldn’t load model settings`,"remoteWorkspace.title":`Connect to a Linux workspace`,"interfaceSettings.accentDescription":`Used for primary buttons, active indicators, interactive links, and keyboard focus. Status colors stay unchanged.`,"interfaceSettings.colorSpectrum":`Accent saturation and brightness`,"interfaceSettings.colorHue":`Accent hue`,"interfaceSettings.colorSpectrumHint":`Use left/right for saturation and up/down for brightness, or enter a complete HEX color.`,"notificationSettings.notificationCategories":`Notification categories`,"notificationSettings.channelPreferenceHint":`Choose channels for each event. Preferences do not connect bots or change system permissions.`,"notificationSettings.editNotificationTemplates":`Edit notification templates`,"notificationSettings.backToCategories":`Back to notification categories`,"notificationSettings.eventChannels":`{event}: notification channels`,"notificationSettings.channelsOff":`Off`,"notificationSettings.enableEvent":`Enable this event`,"notificationSettings.channelNeedsSetup":`Setup required for delivery`,"notificationSettings.channelPreferencesUnsupported":`This Runtime does not support per-event channel preferences. Event switches and templates remain available.`,"notificationSettings.noNotificationEvents":`No notification events are available.`,"notificationSettings.notificationEvent":`Notification event`,"notificationSettings.notificationChannel":`Notification channel`,"notificationSettings.saveBeforeTest":`Save your changes first. Tests use the saved template.`,"notificationSettings.testUsesSavedTemplate":`Tests use this channel’s saved template.`,"notificationSettings.channelTestUnavailable":`Testing is unavailable. Check the global switch, local permission, and the channel’s conversation history.`,"notificationSettings.systemNotificationChannel":`System notification`,"shortcuts.openBoard":`Open All agents`,"shortcuts.openComponents":`Open Component studio`,"shortcuts.openMore":`Open Features`,"shortcuts.jumpToAttention":`Focus the longest-waiting item that needs you (then A / D, ↵ to open)`,"shortcuts.boardNext":`Next agent`,"shortcuts.boardPrevious":`Previous agent`,"shortcuts.boardApprove":`Allow a standard approval (high risk opens the session)`,"shortcuts.boardDeny":`Deny`,"shortcuts.boardRetry":`Retry failed task`,"shortcuts.boardTriage":`Triage items that need you`,"shortcuts.boardToggleGrouping":`Toggle by status / by project (phone)`,"remoteAccess.loading":`Loading remote access…`,"remoteAccess.thisComputer":`This computer`,"remoteAccess.allowConnections":`Allow phones to connect`,"remoteAccess.stateListening":`Accepting connections`,"remoteAccess.stateStarting":`Starting`,"remoteAccess.stateOff":`Off`,"remoteAccess.stateFailed":`Failed to start`,"remoteAccess.firewallChecking":`Checking`,"remoteAccess.firewallNeedsYou":`Needs authorization`,"remoteAccess.waitingForYou":`Waiting for you`,"remoteAccess.pairWithPhone":`Pair a phone by QR code`,"desktopPetSettings.displayTitle":`Display`,"desktopPetSettings.use":`Use`,"desktopPetSettings.inUse":`In use`,"deviceFeature.remoteAccessLede":`Let phones and tablets connect to Pisper on this computer, and manage paired devices and remote workspaces.`,"deviceFeature.mobileServerLede":`Choose which desktop this phone connects to, or run on this device.`,"deviceFeature.unavailableTitle":`Not available on this device`,"deviceFeature.unavailable":`Unavailable`,"deviceFeature.runtimeUnavailable":`The current Runtime does not provide this capability.`,"deviceFeature.mobileOnly":`Mobile servers are only available in the Pisper mobile app; on desktop, use Remote access to let phones connect.`,"deviceFeature.remoteAccessDesktopOnly":`Remote access is only available on desktop; on a phone, use Servers to connect to a desktop.`,"subagents.configuredSummary":`{count} tiers set`,"permissionRules.countSummary":`{count} rules`,"permissionRules.noneSummary":`No rules yet`,"notificationSounds.title":`Sounds`,"notificationSounds.description":`Play a sound when something needs you, finishes or fails. Saved per device, independent of system notifications.`,"notificationSounds.enabled":`Play sounds`,"notificationSounds.eventWaiting":`Needs you`,"notificationSounds.eventWaitingHint":`When an approval or a question is waiting for you`,"notificationSounds.eventFinished":`Finished`,"notificationSounds.eventFinishedHint":`When a session or a Bot finishes its turn`,"notificationSounds.eventFailed":`Failed`,"notificationSounds.eventFailedHint":`When a run fails`,"notificationSounds.soundNone":`None`,"notificationSounds.soundChime":`Chime`,"notificationSounds.soundMarimba":`Marimba`,"notificationSounds.soundDrop":`Drop`,"notificationSounds.soundBell":`Bell`,"notificationSounds.soundLow":`Low tone`,"notificationSounds.preview":`Preview: {event}`,"notificationSounds.volume":`Volume`,"notificationSounds.whileFocused":`Also play while Pisper is in front`,"notificationSounds.whileFocusedHint":`When off, sounds play only while you are not looking at Pisper.`,"configPage.modelThinkingLevelsAutoHint":`Left as is, levels come from the model catalog; models it does not list stop at “high”.`,"providerWorkbench.thinkingUnsupportedByModel":`{level} (not supported by the default model)`},Se={"memoryPage.conceptType":`Concept`,"memoryPage.fileType":`File`,"memoryPage.riskType":`Risk`,"memoryPage.preferenceType":`Preference`,"memoryPage.decisionType":`Decision`,"memoryPage.factType":`Fact`,"memoryPage.taskType":`Task`,"memoryPage.lede":`Preferences, decisions and facts agents remember across chats. They apply right away and outdated ones retire on their own. Drag the timeline to see how they evolved.`,"memoryPage.loadFailed":`Couldn’t load memories`,"memoryPage.viewsLabel":`Memory views`,"memoryPage.evolutionView":`Evolution`,"memoryPage.timelineView":`Timeline`,"memoryPage.activityView":`Activity`,"memoryPage.addMemory":`Add memory`,"memoryPage.moreActions":`More actions`,"memoryPage.allSpaces":`All spaces`,"memoryPage.globalMemorySpace":`Global`,"memoryPage.memorySpace":`Memory space`,"memoryPage.newMemorySpace":`New memory space`,"memoryPage.renameMemorySpace":`Rename memory space`,"memoryPage.deleteMemorySpace":`Delete memory space`,"memoryPage.deleteMemorySpaceNameAndAllMemoriesInIt":`Delete memory space “{name}”? The memories in it will be permanently deleted. This can’t be undone.`,"memoryPage.memorySpaceName":`Space name`,"memoryPage.memorySpaceCreated":`Memory space created`,"memoryPage.memorySpaceRenamed":`Memory space renamed`,"memoryPage.memorySpaceDeleted":`Memory space deleted`,"memoryPage.memorySpaceHint":`Give each theme or project its own space so memories don’t mix.`,"memoryPage.forExampleProductDesignGuidelines":`For example: Product design guidelines`,"memoryPage.exportMarkdown":`Export Markdown`,"memoryPage.exported":`Memories exported`,"memoryPage.consolidateNow":`Tidy up now`,"memoryPage.clearEpisodes":`Clear saved conversations`,"memoryPage.clearEpisodesConfirm":`Clear the conversation text kept in memory for tracing and background extraction. Your memories stay, and your sessions are not deleted. This cannot be undone.`,"memoryPage.clearEpisodesAction":`Clear`,"memoryPage.episodesCleared":`Cleared {count} saved conversation turns`,"memoryPage.consolidated":`Tidied up`,"memoryPage.nothingToConsolidate":`Nothing to tidy up right now`,"memoryPage.refresh":`Refresh`,"memoryPage.loadMore":`Load more`,"memoryPage.statusFilterLabel":`Filter by status`,"memoryPage.statusCurrent":`Current`,"memoryPage.statusArchived":`Archived`,"memoryPage.statusHistory":`Past versions`,"memoryPage.groupToday":`Today`,"memoryPage.groupYesterday":`Yesterday`,"memoryPage.groupThisWeek":`This week`,"memoryPage.groupUnknown":`Unknown time`,"memoryPage.searchResults":`Results`,"memoryPage.noMemoriesInSpace":`No memories here yet. Preferences and decisions from your chats are saved automatically, or add one yourself.`,"memoryPage.noArchivedMemories":`No archived memories.`,"memoryPage.noHistoryVersions":`No past versions.`,"memoryPage.noMatchingMemories":`No matching memories`,"memoryPage.selectAMemoryToViewDetails":`Select a memory to see its evidence and past versions.`,"memoryPage.selectedMemory":`Selected memory`,"memoryPage.closeDetail":`Close details`,"memoryPage.detailLoadFailed":`Couldn’t load the details`,"memoryPage.retry":`Retry`,"memoryPage.memoryType":`Type`,"memoryPage.source":`Source`,"memoryPage.evidence":`Evidence`,"memoryPage.evidenceFrom":`Evidence from`,"memoryPage.validFrom":`True since`,"memoryPage.validTo":`True until`,"memoryPage.stillValid":`Now`,"memoryPage.created":`Recorded`,"memoryPage.confirmCount":`Times confirmed`,"memoryPage.expires":`Expires`,"memoryPage.relatedFilePath":`Related file path`,"memoryPage.archiveReason":`Why archived`,"memoryPage.versionHistory":`Version history`,"memoryPage.currentVersion":`Current`,"memoryPage.edit":`Edit`,"memoryPage.delete":`Delete`,"memoryPage.pin":`Pin`,"memoryPage.unpin":`Unpin`,"memoryPage.confirmStillValid":`Still correct`,"memoryPage.restore":`Restore`,"memoryPage.pinned":`Pinned`,"memoryPage.unpinned":`Unpinned`,"memoryPage.confirmed":`Marked as still correct`,"memoryPage.restored":`Restored`,"memoryPage.pinnedBadge":`Pinned`,"memoryPage.staleBadge":`May be outdated`,"memoryPage.taintedBadge":`External source`,"memoryPage.archivedBadge":`Archived`,"memoryPage.supersededBadge":`Replaced`,"memoryPage.staleHint":`The file it refers to has changed, so this may be outdated.`,"memoryPage.taintedHint":`From an external source: it isn’t added to chats automatically, or to summaries and profiles.`,"memoryPage.deleteMemory":`Delete memory`,"memoryPage.deleteMemoryName":`Delete “{name}”? This memory and its past versions will be permanently deleted. This can’t be undone, and it won’t be saved automatically again.`,"memoryPage.memoryDeleted":`Memory deleted`,"memoryPage.sourceManual":`Added manually`,"memoryPage.sourceUserRequest":`You asked to remember it`,"memoryPage.sourceConversation":`From a chat`,"memoryPage.sourceAgent":`Inferred by the Agent`,"memoryPage.sourceTool":`Tool result`,"memoryPage.sourceExternal":`External channel`,"memoryPage.roleUser":`Something you said`,"memoryPage.roleAssistant":`Something the Agent said`,"memoryPage.roleTool":`A tool result`,"memoryPage.roleExternal":`A message from an external channel`,"memoryPage.roleManual":`Entered manually`,"memoryPage.editMemory":`Edit memory`,"memoryPage.memoryDialogHint":`Write one self-contained statement so future chats can use it.`,"memoryPage.memoryTitle":`Title`,"memoryPage.forExampleProjectUIConstraints":`For example: Project UI constraints`,"memoryPage.memoryContent":`Content`,"memoryPage.recordStandaloneReusableMemoryForFutureChats":`Record standalone, reusable memory for future chats`,"memoryPage.importance":`Importance`,"memoryPage.normal":`Normal`,"memoryPage.common":`Common`,"memoryPage.important":`Important`,"memoryPage.strict":`Strict`,"memoryPage.optionalForExampleECodeProjectREADMEMd":`Optional, for example E:\\code\\project\\README.md`,"memoryPage.cancel":`Cancel`,"memoryPage.save":`Save`,"memoryPage.saving":`Saving…`,"memoryPage.memoryCreated":`Memory added`,"memoryPage.memoryUpdated":`Memory updated`,"memoryPage.noActivity":`No activity yet.`,"memoryPage.activityUnsupported":`The connected Runtime is too old to show activity.`,"memoryPage.undo":`Undo`,"memoryPage.undone":`Undone`,"memoryPage.eventUndone":`Change undone`,"memoryPage.activityLoadFailed":`Couldn’t load the activity`,"memoryPage.eventAdd":`Added`,"memoryPage.eventSupersede":`Replaced an older version`,"memoryPage.eventMerge":`Merged duplicates`,"memoryPage.eventArchive":`Archived`,"memoryPage.eventExpire":`Expired`,"memoryPage.eventStale":`Marked as maybe outdated`,"memoryPage.eventConfirm":`Confirmed as still correct`,"memoryPage.eventRestore":`Restored`,"memoryPage.eventEdit":`Edited`,"memoryPage.eventPin":`Pinned`,"memoryPage.eventUnpin":`Unpinned`,"memoryPage.eventDelete":`Deleted a memory`,"memoryPage.eventPurge":`Cleared content past its retention period`,"memoryPage.eventUndo":`Undid a change`,"memoryPage.eventReinforce":`Confirmed again`,"memoryPage.eventMigrate":`Upgraded the memory store`,"memoryPage.eventConsolidate":`Tidied up memories`,"memoryPage.reasonConsolidatedBoth":`{digests} digests written, {merged} duplicates merged`,"memoryPage.reasonConsolidatedDigests":`{digests} digests written`,"memoryPage.reasonConsolidatedMerged":`{merged} duplicates merged`,"memoryPage.eventGeneric":`Memory changed`,"memoryPage.actorYou":`You`,"memoryPage.actorSystem":`System`,"memoryPage.actorConsolidator":`Background tidy-up`,"memoryPage.actorAgent":`Agent`,"memoryPage.actorConversation":`From a chat`,"memoryPage.reasonSameIdentity":`New information on the same topic`,"memoryPage.reasonLowerAuthority":`Conflicts with something you stated directly, so it wasn’t applied`,"memoryPage.reasonExpired":`It expired`,"memoryPage.reasonLowUtility":`Not used for a long time`,"memoryPage.reasonUserDeleted":`You deleted it`,"memoryPage.reasonUserRequested":`You asked to forget it`,"memoryPage.reasonPromoted":`{count} pending items now apply directly`,"memoryEvolution.regionLabel":`Memory rings`,"memoryEvolution.stageLabel":`Memory rings on {date}: {active} in effect, {superseded} replaced, {archived} archived.`,"memoryEvolution.timelineLabel":`Timeline`,"memoryEvolution.active":`In effect`,"memoryEvolution.superseded":`Replaced`,"memoryEvolution.archived":`Archived`,"memoryEvolution.notYet":`Not yet`,"memoryEvolution.now":`Now`,"memoryEvolution.play":`Play`,"memoryEvolution.pause":`Pause`,"memoryEvolution.backToNow":`Back to now`,"memoryEvolution.speed":`Playback speed`,"memoryEvolution.legend":`Memory types`,"memoryEvolution.howToRead":`How to read this`,"memoryEvolution.howToReadBody":`Time grows outward in rings, and the outermost ring is the moment on the timeline. Each point of light is a memory: those still in effect float above the disc, replaced ones burn down to embers with an arc to whatever replaced them, and archived ones sink into the dark.`,"memoryEvolution.gestures":`Drag to rotate, drag up and down with a mouse to tilt, Ctrl + scroll or pinch to zoom, double-click to reset. Keyboard: left and right arrows move through time, Space plays.`,"memoryEvolution.typeDecision":`Decision`,"memoryEvolution.typePreference":`Preference`,"memoryEvolution.typeFact":`Fact`,"memoryEvolution.typeConcept":`Concept`,"memoryEvolution.typeRisk":`Risk`,"memoryEvolution.typeFile":`File`,"memoryEvolution.typeTask":`Task`,"memoryEvolution.learnedLate":`Learned later: recorded on {date}`,"memoryEvolution.closeCard":`Close`,"memoryEvolution.pinned":`Pinned`,"memoryEvolution.untrusted":`External source`,"memoryEvolution.stale":`May be outdated`,"memoryEvolution.emptyTitle":`No rings yet`,"memoryEvolution.emptyDescription":`Tell Pisper about your preferences and project decisions, and memory will grow outward from here.`,"memoryEvolution.truncated":`Too many memories: showing the most recent {count}.`,"memoryEvolution.loading":`Loading memories`,"memoryEvolution.loadFailed":`Couldn't load the memory rings`,"memoryEvolution.retry":`Retry`},Ce={"navigation.app":`App`,"navigation.chat":`Sessions`,"navigation.chatDescription":`Keep multiple chats moving forward in parallel on their own tracks`,"navigation.chatHistory":`Chat history`,"navigation.chatHistoryDescription":`Every conversation leaves a clear, searchable echo here`,"navigation.assets":`Assets`,"navigation.assetsDescription":`Gather files, images, and creative outputs from conversations`,"navigation.channels":`Channels`,"navigation.channelsDescription":`Bring Pisper beyond the screen and into your collaboration spaces`,"navigation.schedules":`Scheduled tasks`,"navigation.bots":`Bots`,"navigation.schedulesDescription":`Leave repetitive waiting to tasks that start on time`,"navigation.settings":`Settings`,"navigation.settingsDescription":`Tune models, runtime policies, and notification cadence`,"navigation.plugins":`Plugins`,"navigation.pluginsDescription":`Install and manage plugins while controlling the tool capabilities available to Agent`,"navigation.memory":`Memory`,"navigation.memoryDescription":`Carry preferences and decisions across chats, and look back over time`,"navigation.mcp":`MCP`,"navigation.mcpDescription":`Connect external capabilities while protecting every permission boundary`,"navigation.skills":`Skills`,"navigation.components":`Custom components`,"navigation.componentsDescription":`Preview, place and generate native components`,"navigation.skillsDescription":`Collect reusable techniques so capabilities can be invoked by each task`,"navigation.workflows":`Workflows`,"navigation.workflowsDescription":`Create, run and manage reusable workflows.`,"navigation.newWorkflow":`New workflow`,"navigation.newWorkflowDescription":`Connect steps and configure the inputs for each run.`,"navigation.editWorkflow":`Edit workflow`,"navigation.editWorkflowDescription":`Adjust the steps and configure the inputs for each run.`,"appOverlays.actions":`Actions`,"appOverlays.commandPalette":`Command palette`,"appOverlays.newChat":`New chat`,"appOverlays.noMatchingResults":`No matching results`,"appOverlays.openLabeledTurnFailed":`Could not open the response for this mark`,"appOverlays.labelResultTimes":`Chat {sessionTime} · node {nodeTime}`,"appOverlays.locatingLabel":`Locating mark…`,"appOverlays.searchPagesChatsOrActions":`Search pages, chats, marks, or actions`,"appOverlays.searchingLabels":`Searching session marks…`,"appOverlays.untitledChat":`Untitled chat`,"appOverlays.unknownTime":`Unknown time`,"appOverlays.agentsAndSessions":`Agents & sessions`,"appOverlays.newTask":`New task`,"appOverlays.hintSelect":`Select`,"appOverlays.hintOpen":`Open`,"appOverlays.hintGroups":`Next group`,"appOverlays.hintClose":`Close`,"appSidebar.countCommitsBehindBranch":`{count} commits behind {branch}`,"appSidebar.downloading":`Downloading`,"appSidebar.renameProject":`Rename project`,"appSidebar.projectName":`Project name`,"appSidebar.projectNameUpdated":`Project name updated`,"appSidebar.projectNameSaveFailed":`Could not save the project name. Check local storage and try again.`,"appSidebar.deleteProject":`Delete project`,"appSidebar.deleteProjectConfirm":`This deletes "{project}" and its {count} chats. This cannot be undone.`,"appSidebar.deleteProjectAction":`Delete`,"appSidebar.projectDeleted":`Project "{project}" deleted`,"appSidebar.projectRemoved":`Removed project "{project}". Its folder and files are untouched.`,"appSidebar.projectNoChats":`Project "{project}" has no chats. Refresh and try again.`,"appSidebar.projectDeletePartial":`Confirmed {deleted} chats deleted. Project "{project}" currently has {remaining} chats. Check and retry any remaining deletions.`,"appSidebar.projectDeleteUnverified":`Confirmed {deleted} chats deleted, but the remaining chat count for project "{project}" could not be verified. Refresh and check again.`,"appSidebar.readyToRestart":`Ready to restart`,"appSidebar.sourceUpdatesAvailable":`Source updates available`,"appSidebar.updateAvailable":`Update available`,"appSidebar.viewUpdateDetails":`View update details`,"pageHeader.quickSetup":`Quick setup`,"pageHeader.addService":`Add service`,"pageHeader.installSkill":`Import global Skill`,"pageHeader.newChat":`New chat`,"pageHeader.search":`Search (/)`,"pageHeader.searchMemoriesOrFiles":`Search memories or files`,"pageHeader.searchPage":`Search {page}`,"pageHeader.searchServicesOrTools":`Search services or tools`,"pageHeader.toggleTerminal":`Toggle terminal`,"pageLoader.bringingTheNeededCapabilitiesIntoPlace":`Bringing the needed capabilities into place…`,"pageLoader.lightingUpThisPage":`Lighting up this page`,"window.controls":`Window controls`,"window.minimize":`Minimize`,"window.maximize":`Maximize / restore`,"window.close":`Close window`,"appOverlays.pages":`Pages`,"appOverlays.labels":`Conversation labels`,"appOverlays.searchLabelsFailed":`Could not search conversation labels`,"appOverlays.loadChatsFailed":`Could not load conversations`,"appOverlays.openResultFailed":`Could not open this result. Try again.`,"shell.board":`Board`,"shell.boardDescription":`Whatever needs you always comes first`,"shell.components":`Component studio`,"shell.more":`More`,"shell.moreDescription":`History, resources, automation and extensions`,"shell.primaryNavigation":`Main navigation`,"shell.newTask":`New task`,"shell.untitledSession":`Untitled session`,"shell.backToBoardLabel":`Back to All agents`,"shell.sessionNotFound":`Session not found`,"shell.sessionNotFoundHint":`It may have been deleted, or the link is incomplete.`,"shell.backToFeaturesLabel":`Back to Features`,"more.title":`Features`,"more.lede":`Everything that isn’t always on screen lives here, and opens straight from {shortcut} too.`,"more.ledeNoShortcut":`Everything that isn’t always on screen lives here, and opens straight from the command palette too.`,"more.search":`Search features, settings and commands`,"more.noResults":`No matching features`,"more.noResultsHint":`Try another keyword, or search sessions and commands with {shortcut}.`,"more.clearSearch":`Clear search`,"more.groupSessions":`Sessions and resources`,"more.groupAutomation":`Automation`,"more.groupExtensions":`Extensions`,"more.groupDevices":`Devices and connections`,"more.groupComponents":`My components`,"more.chatHistoryHint":`All sessions, archived too`,"more.assetsHint":`Generated images and files`,"more.memoryHint":`Long-term memory · timeline`,"more.workflowsHint":`Multi-step pipelines`,"more.schedulesHint":`Dispatch agents on a timer`,"more.channelsHint":`Dispatch from chat apps`,"more.pluginsHint":`Install and manage plugins`,"more.skillsHint":`Reusable agent skills`,"more.mcpHint":`Connect external tools`,"more.componentStudioHint":`Create and place components`,"more.remoteAccessHint":`Reach this computer by phone`,"more.mobileServerHint":`Desktop or on-device server`,"more.desktopPetHint":`A desktop companion`,"more.desktopOnly":`Desktop only`,"more.componentHint":`Full-page component`,"more.addComponent":`Place a component`,"more.addComponentHint":`Create or import in the studio`,"more.componentsLoading":`Loading components…`,"more.componentsError":`Installed components could not be loaded`,"more.retry":`Retry`,"more.disabledTile":`{label}: {reason}`,"shell.createSessionFailed":`Could not create a session`,"more.badgeRunning":`{count} running`,"more.badgeEnabled":`{count} enabled`,"more.badgeDisconnected":`{count} disconnected`,"more.badgeOnline":`{count} online`,"more.settingsResults":`Settings and commands`,"more.searchPalette":`Search “{query}” in the command palette`,"more.searchPaletteHint":`Sessions, turn labels and commands`,"sidebar.label":`Sessions and navigation`,"sidebar.labelCollapsed":`Sessions and navigation (collapsed)`,"sidebar.collapse":`Collapse sidebar`,"sidebar.expand":`Expand sidebar`,"sidebar.allAgents":`All agents`,"sidebar.features":`Features`,"sidebar.loading":`Loading sessions`,"appOverlays.toggleTheme":`Switch theme`,"sidebar.search":`Search`,"phone.menu":`Open navigation`,"phone.menuAttention":`Open navigation, {count} need you`,"phone.drawer":`Navigation`,"phone.drawerHint":`Search, new task, all agents, features, sessions and settings`},we={"toolLabels.imageAssets":`Image assets`,"toolLabels.imageAssetsDescription":`Expose action generation, local background removal, frame splitting, manual edits, and atlas export to agents. Off by default; workflows and the workbench remain available.`,"toolLabels.imageAssetsScope":`Imported workspace images and managed media`,"toolLabels.imageAssetsCapability":`Generate, edit, arrange, and export animation frames using the shared image-processing engine`,"pluginsPage.all":`All`,"toolLabels.read":`Read files`,"toolLabels.list":`List directories`,"toolLabels.grep":`Search content`,"toolLabels.find":`Find files`,"toolLabels.edit":`Edit files`,"toolLabels.write":`Write files`,"toolLabels.shell":`Run commands`,"toolLabels.webSearch":`Web search`,"toolLabels.browserControl":`Browser control`,"toolLabels.visualGeneration":`Generate visual content`,"toolLabels.skillCreate":`Create Skill`,"toolLabels.pluginCreate":`Create plugin`,"toolLabels.memorySearch":`Search memory`,"toolLabels.memoryRemember":`Save memory`,"toolLabels.memoryOpen":`Open memory`,"toolLabels.memoryConfirm":`Confirm memory`,"toolLabels.memoryForget":`Forget memory`,"toolLabels.mcpList":`View MCP services`,"toolLabels.mcpManage":`Manage MCP services`,"toolLabels.codemode":`Script orchestration`,"toolLabels.readDescription":`Read text, code, and image files in the workspace.`,"toolLabels.listDescription":`List directory structures and basic file information.`,"toolLabels.grepDescription":`Run full-text and regular-expression searches across project files.`,"toolLabels.findDescription":`Find project files by name and pattern.`,"toolLabels.editDescription":`Apply precise local edits to existing files.`,"toolLabels.writeDescription":`Create new files or overwrite file contents.`,"toolLabels.shellDescription":`Run terminal commands as the current operating-system user.`,"toolLabels.webSearchDescription":`Search the internet through Bing RSS without installation or an API key.`,"toolLabels.browserControlDescription":`Give Agent an isolated, controlled browser for navigation, inspection, and interaction.`,"toolLabels.visualGenerationDescription":`Use configured visual providers to generate or edit images and generate videos in the workspace.`,"toolLabels.skillCreateDescription":`Create a standards-compliant Agent Skill in the current project or global Pisper skills directory.`,"toolLabels.pluginCreateDescription":`Define, validate, and install a local Pisper plugin with one or more Agent tools. Local plugins only add tools, and every call needs approval; use a Pi extension to change how the agent itself behaves.`,"toolLabels.memorySearchDescription":`Search long-term memory across global and current-project spaces, by relevance or by time, including how something changed.`,"toolLabels.memoryRememberDescription":`Save a durable fact to long-term memory. It applies immediately and replaces an older fact on the same topic.`,"toolLabels.memoryOpenDescription":`Expand a search result: a fact to its evidence, version history and source chat, or a summary to the facts behind it.`,"toolLabels.memoryConfirmDescription":`After checking the current files, mark a possibly outdated memory as still correct.`,"toolLabels.memoryForgetDescription":`Permanently delete a memory and its older versions when the user explicitly asks.`,"toolLabels.mcpListDescription":`Read configured MCP services, connection status, and available tools.`,"toolLabels.mcpManageDescription":`Add, update, delete, test, enable, or disable MCP services and tools with structured parameters.`,"toolLabels.codemodeDescription":`Let the Agent write a JavaScript script that calls other enabled tools in parallel and returns only the script output to the model. Off by default.`,"toolLabels.lowRisk":`Low risk`,"toolLabels.mediumRisk":`Medium risk`,"toolLabels.highRisk":`High risk`,"toolLabels.fileSystem":`File system`,"toolLabels.search":`Search`,"toolLabels.terminal":`Terminal`,"toolLabels.visual":`Visual`,"toolLabels.skills":`Skills`,"toolLabels.plugins":`Plugins`,"toolLabels.browser":`Browser`,"toolLabels.memory":`Memory`,"toolLabels.mcp":`MCP`,"toolLabels.collaboration":`Collaboration`,"toolLabels.orchestration":`Orchestration`,"toolLabels.currentChatWorkspace":`Current chat workspace`,"toolLabels.currentOsUser":`Current operating-system user`,"toolLabels.bingPublicWebSearch":`Bing public web search`,"toolLabels.isolatedSessionBrowser":`Isolated browser for the current primary Agent chat; HTTP/HTTPS only`,"toolLabels.visualProviderAndWorkspace":`Configured visual providers and the current workspace/generated/visuals directory`,"toolLabels.projectAndGlobalSkills":`Current project and global Pisper skills directories`,"toolLabels.globalPluginSources":`Global Pisper plugin sources and local plugin installation`,"toolLabels.globalAndProjectMemory":`Global and current-project memory spaces`,"toolLabels.applicationMcpConfiguration":`Application-level MCP configuration`,"toolLabels.codemodeScope":`Isolated script sandbox with no file, network, or shell access of its own; every tool it calls is still approved individually within its own scope`,"toolLabels.readCapability":`Read file contents without modifying files`,"toolLabels.listCapability":`Browse directories without reading file contents`,"toolLabels.grepCapability":`Search text without modifying files`,"toolLabels.findCapability":`Find paths without modifying files`,"toolLabels.editCapability":`Modify existing files and produce diffs`,"toolLabels.writeCapability":`Create and overwrite files`,"toolLabels.shellCapability":`Run commands, builds, and tests`,"toolLabels.webSearchCapability":`Send search terms and return titles, links, summaries, and dates without modifying web pages`,"toolLabels.browserControlCapability":`Navigate, inspect, click, type, wait, capture screenshots, and close the browser without arbitrary JavaScript`,"toolLabels.visualGenerationCapability":`Use visual models to generate or edit images and generate videos, then write output files`,"toolLabels.skillCreateCapability":`Validate and atomically create a new SKILL.md without overwriting existing content`,"toolLabels.pluginCreateCapability":`Create plugin source without overwriting files, run the standard preflight checks, and install all declared tools`,"toolLabels.memorySearchCapability":`Read relevant preferences, facts, decisions, and tasks without modifying memory`,"toolLabels.memoryRememberCapability":`Save durable facts directly and hide common secret formats`,"toolLabels.memoryOpenCapability":`Read the evidence and history behind a memory without modifying it`,"toolLabels.memoryConfirmCapability":`Clear the possibly-outdated flag on a memory`,"toolLabels.memoryForgetCapability":`Delete a memory only with an exact quote of the user asking for it`,"toolLabels.mcpListCapability":`Read redacted MCP service information without changing configuration`,"toolLabels.mcpManageCapability":`Modify MCP service configuration without exposing sensitive headers or environment values`,"toolLabels.codemodeCapability":`Batch, filter, and combine tool calls so individual results do not fill the context`,"pluginsPage.auto":`Auto`,"pluginsPage.bingSearchIsAvailableAndReturnedCountResults":`Bing search is available and returned {count} results`,"pluginsPage.defaultLanguage":`Default language`,"pluginsPage.enabled":`Enabled`,"pluginsPage.enabled2":`Enabled`,"pluginsPage.english":`English`,"pluginsPage.loadingToolPlugins":`Loading tool plugins`,"pluginsPage.loadFailed":`Couldn’t load tool plugins`,"pluginsPage.moderate":`Moderate`,"pluginsPage.noMatchingTools":`No matching tools`,"pluginsPage.noPluginPolicyChanges":`No plugin policy changes`,"pluginsPage.off":`Off`,"pluginsPage.pathScope":`Path scope`,"pluginsPage.pluginPolicySavedAgentRuntimeUpdated":`Plugin policy saved. Agent runtime updated.`,"pluginsPage.resultCount":`Result count`,"pluginsPage.riskLevel":`Risk level`,"pluginsPage.safeSearch":`Safe search`,"pluginsPage.savePolicy":`Save policy`,"pluginsPage.simplifiedChinese":`Simplified Chinese`,"pluginsPage.source":`Source`,"pluginsPage.strict":`Strict`,"pluginsPage.testConnection":`Test connection`,"pluginsPage.testing":`Testing…`,"pluginsPage.unsaved":`Unsaved`,"pluginsPage.builtIn":`Built-in`,"pluginsPage.local":`Local`,"pluginsPage.toolCatalog":`Tool catalog`,"pluginsPage.installPlugin":`Install plugin`,"pluginsPage.installLocalPlugin":`Install local plugin`,"pluginsPage.installLocalPluginDescription":`Inspect and install a plugin from a local directory.`,"pluginsPage.pluginDirectory":`Plugin directory`,"pluginsPage.pluginDirectoryPlaceholder":`Absolute path containing pisper-plugin.json`,"pluginsPage.chooseDirectory":`Choose directory`,"pluginsPage.files":`files`,"pluginsPage.inspectPlugin":`Inspect plugin`,"pluginsPage.processing":`Processing…`,"pluginsPage.localPluginSecurityWarning":`Local plugin code runs in an isolated Worker, but it can still access local files and the network as the current operating-system user. Outside Full Access mode, you are asked to confirm each call.`,"pluginsPage.toggleToolDetails":`Toggle details for {name}`,"pluginsPage.executionMode":`Execution mode`,"pluginsPage.confirmUnlessFullAccess":`Available in every mode; confirmed on each call except in Full Access`,"pluginsPage.uninstallPlugin":`Uninstall plugin`,"pluginsPage.uninstallPluginDescription":`Uninstall {name} and all tools it provides? Built-in Pisper tools cannot be uninstalled.`,"pluginsPage.pluginUninstalled":`{name} was uninstalled`,"pluginsPage.saveBeforePluginChanges":`Save pending tool policy changes before installing or uninstalling a plugin.`,"pluginsPage.extensionMarket":`Extension marketplace`,"pluginsPage.openPackageCatalog":`Open full catalog`,"pluginsPage.searchPackageCatalog":`Search the pi.dev package catalog`,"pluginsPage.search":`Search`,"pluginsPage.installedExtensions":`Installed Extensions`,"pluginsPage.installExtension":`Install Extension`,"pluginsPage.uninstallExtension":`Uninstall Extension`,"pluginsPage.extensionSource":`Extension source`,"pluginsPage.extensionSourceHelp":`Enter an npm package, Git URL, or local extension directory. Packages with pi.extensions or pi.prompts can be installed as Extensions; pi.skills in mixed packages are also shown by category.`,"pluginsPage.extensionType.tool":`Tool`,"pluginsPage.extensionType.prompt":`Prompt`,"pluginsPage.extensionType.skill":`Skill`,"pluginsPage.extensionSecurityWarning":`Extension code runs in the Agent Runtime, can intercept tool calls and change prompts, and may access files, the network, and current-user permissions. Only install sources you trust. Install {name}?`,"pluginsPage.extensionInstalled":`Extension installed. Start a new session to load it.`,"pluginsPage.extensionUninstalled":`Extension uninstalled. Start a new session to stop using it.`,"pluginsPage.uninstallExtensionDescription":`Uninstall {name} and its Pi Extension configuration?`,"pluginsPage.installed":`Installed`,"pluginsPage.lede":`Manage the tools and Pi extensions agents can call. Local plugins only add tools, and every call needs approval; Pi extensions run inside the Runtime and can change how the agent itself behaves. Changes apply from the next agent request after you save the policy.`,"toolLabels.scheduleList":`View scheduled tasks`,"toolLabels.scheduleManage":`Manage scheduled tasks`,"toolLabels.scheduleListDescription":`Read scheduled tasks with their timing, next run and last result.`,"toolLabels.scheduleManageDescription":`Create, update, pause, resume, delete or run scheduled tasks, including one-time tasks that turn themselves off after running.`,"toolLabels.schedules":`Scheduled tasks`,"toolLabels.applicationSchedules":`Application scheduled tasks`,"toolLabels.scheduleListCapability":`Read scheduled tasks without changing them`,"toolLabels.scheduleManageCapability":`Schedule tasks that later run unattended with full access; outside full-access sessions, creating, changing, resuming and running them need your confirmation`,"toolLabels.workflowList":`View workflows`,"toolLabels.workflowRun":`Run workflows`,"toolLabels.workflowListDescription":`Read workflows, their inputs and the recent runs of a workflow.`,"toolLabels.workflowRunDescription":`Start or stop a published workflow.`,"toolLabels.workflows":`Workflows`,"toolLabels.applicationWorkflows":`Application workflows`,"toolLabels.workflowListCapability":`Read workflows and run results without changing them`,"toolLabels.workflowRunCapability":`Start workflows whose nodes run unattended with full access; outside full-access sessions, starting one needs your confirmation`},Te={"schedulesPage.fullAccessHelp":`Background tasks run Shell as the current OS user without per-command approval.`,"schedulesPage.atIntervals":`At intervals`,"schedulesPage.daily":`Daily`,"schedulesPage.weekly":`Weekly`,"schedulesPage.monthly":`Monthly`,"schedulesPage.minutes":`Minutes`,"schedulesPage.hours":`Hours`,"schedulesPage.days":`Days`,"schedulesPage.browserNotification":`Notification`,"schedulesPage.feishu":`Feishu`,"schedulesPage.weChat":`WeChat`,"schedulesPage.qq":`QQ`,"schedulesPage.telegram":`Telegram`,"schedulesPage.browseDirectories":`Browse directories`,"schedulesPage.cancel":`Cancel`,"schedulesPage.countSec":`{count} sec`,"schedulesPage.createATaskAndLetItSetOutAutomaticallyAtTheAppointedTime":`Create a task and let it set out automatically at the appointed time.`,"schedulesPage.creating":`Creating…`,"schedulesPage.delete":`Delete`,"schedulesPage.deleteScheduledTask":`Delete scheduled task`,"schedulesPage.deleteScheduledTaskNameAndItsRunHistory":`Delete scheduled task “{name}” and its run history?`,"schedulesPage.deleteTask":`Delete task`,"schedulesPage.describeTheWorkTheAgentShouldCompleteEachTime":`Describe the work the agent should complete each time`,"schedulesPage.editTemplates":`Edit templates`,"schedulesPage.enabled":`Enabled`,"schedulesPage.enabledAutomaticallyAfterCreation":`Enabled automatically after creation`,"schedulesPage.enterTheProjectSAbsolutePath":`Enter the project’s absolute path`,"schedulesPage.executionMode":`Execution mode`,"schedulesPage.executionTarget":`Execution target`,"schedulesPage.forExampleDailyCodeReview":`For example, daily code review`,"schedulesPage.frequency":`Frequency`,"schedulesPage.fullAccess":`Full access`,"schedulesPage.lastRunTime":`Last run: {time}`,"schedulesPage.loadingScheduledTasks":`Loading scheduled tasks`,"schedulesPage.pause":`Pause`,"schedulesPage.lastRunFailed":`Last run failed`,"schedulesPage.notifyWhen":`Notify on`,"schedulesPage.failuresOnly":`Failures only`,"schedulesPage.runNow":`Run now`,"schedulesPage.scheduledTrigger":`Scheduled trigger`,"schedulesPage.completionAndFailure":`Completion and failure`,"schedulesPage.taskFailed":`Task failed`,"schedulesPage.taskInterrupted":`Task interrupted because Pisper restarted`,"schedulesPage.createTask":`Create task`,"schedulesPage.manualRun":`Manual run`,"schedulesPage.saveTask":`Save task`,"schedulesPage.taskCompleted":`Task completed`,"schedulesPage.newScheduledTask":`New scheduled task`,"schedulesPage.nextRunTime":`Next run: {time}`,"schedulesPage.noRunHistory":`No run history`,"schedulesPage.notificationChannels":`Notification channels`,"schedulesPage.recentRuns":`Recent runs`,"schedulesPage.runInterval":`Run interval`,"schedulesPage.running":`Running`,"schedulesPage.running2":`Running`,"schedulesPage.saving":`Saving…`,"schedulesPage.scheduledTaskCreated":`Scheduled task created`,"schedulesPage.scheduledTaskDeleted":`Scheduled task deleted`,"schedulesPage.scheduledTaskSaved":`Scheduled task saved`,"schedulesPage.scheduledTaskStarted":`Scheduled task started`,"schedulesPage.taskName":`Task name`,"schedulesPage.theScheduledAgentWillRunInThisDirectory":`The scheduled Agent will run in this directory.`,"schedulesPage.theTimelineIsStillUnlit":`The timeline is still unlit`,"schedulesPage.time":`Time`,"schedulesPage.timeZone":`Time zone`,"schedulesPage.workingDirectory":`Working directory`,"schedulesPage.workflow":`Workflow`,"schedulesPage.workflowUnavailable":`Workflow unavailable`,"schedulesPage.selectPublishedWorkflow":`Select a published workflow`,"schedulesPage.noPublishedWorkflows":`No published workflows are available. Publish one from the Workflows page first.`,"schedulesPage.workflowUsesItsOwnRuntimeSettings":`The workflow controls its own working directory, model, and execution settings.`,"schedulesPage.workflowInputs":`Workflow inputs`,"schedulesPage.workflowInputsHelp":`Saved only with this task and passed to the selected workflow on every run.`,"schedulesPage.youCanContinueEditingTheRunTimeAndNotificationChannelsAfterCreation":`You can continue editing the run time and notification channels after creation.`,"schedulesPage.youCanContinueSettingTheRunTimeAndNotificationChannelsAfterCreation":`You can continue setting the run time and notification channels after creation.`,"schedulesPage.notificationChannelsHelp":`Choose channels to notify when the task finishes`,"schedulesPage.configured":`Configured`,"schedulesPage.notConfigured":`Not configured`,"schedulesPage.lede":`Start a chat or run a workflow on a schedule, and send the result to notifications and channels.`,"schedulesPage.loadFailed":`Could not load scheduled tasks`,"schedulesPage.newTask":`New task`,"schedulesPage.tasks":`Tasks`,"schedulesPage.enabledCount":`{count} enabled`,"schedulesPage.toggleTaskDetails":`Show or hide settings for {name}`,"schedulesPage.noMatchingTasks":`No tasks match your search`,"schedulesPage.enableTaskName":`Enable {name}`,"schedulesPage.once":`Once`,"schedulesPage.date":`Date`,"schedulesPage.onceDone":`Ran once, won’t run again`,"schedulesPage.missed":`Missed (Pisper wasn’t running)`,"schedulesPage.createdByAgent":`Created by an agent`,"schedulesPage.botTarget":`Hand to a Bot: {message}`,"schedulesPage.botManagedThere":`This is handed to a Bot on schedule. Change or delete it on that Bot’s page.`,"schedulesPage.openBot":`Open the Bot`},Ee={"skillsPage.all":`All`,"skillsPage.design":`Design`,"skillsPage.code":`Code`,"skillsPage.documents":`Documents`,"skillsPage.global":`Global`,"skillsPage.globalSkills":`Global Skills`,"skillsPage.globalSkillSourceHelp":`Enter a Skill source: a local Skill directory or SKILL.md, an npm package name, or a git URL. Pisper extracts only Skill resources and copies them to ~/.pisper/agent/skills for use in every project.`,"skillsPage.highPrivilege":`High privilege`,"skillsPage.allowAutomaticModelInvocation":`Allow automatic model invocation`,"skillsPage.automaticManual":`Automatic + manual`,"skillsPage.configuredSkillPackages":`Configured skill packages`,"skillsPage.continue":`Continue`,"skillsPage.declaresRequiredTools":`Declares required tools`,"skillsPage.import":`Import`,"skillsPage.importGlobalSkill":`Import global Skill`,"skillsPage.loadingSkills":`Loading skills`,"skillsPage.loadFailed":`Couldn’t load skills`,"skillsPage.locallyReady":`Locally ready`,"skillsPage.manualOnly":`Manual only`,"skillsPage.noGlobalSkills":`No global Skills. Import one into ~/.pisper/agent/skills.`,"skillsPage.noProjectSkills":`This workspace has no project Skills. Add one under .pisper/skills in the current workspace.`,"skillsPage.noSkillPackagesAreConfiguredYetAfterYouInstallASkillItsSourceWillAppearHere":`No skill packages are configured yet. After you install a skill, its source will appear here.`,"skillsPage.noSkillsMatchTheCurrentFilter":`No skills match the current filter.`,"skillsPage.notMaterialized":`Not materialized`,"skillsPage.permissions":`Permissions`,"skillsPage.project":`Project`,"skillsPage.projectSkills":`Project Skills`,"skillsPage.projectScopedConfiguration":`Project-scoped configuration`,"skillsPage.projectScopedSkill":`Project-scoped skill`,"skillsPage.addGlobalOrProjectSkill":`Import a global Skill into ~/.pisper/agent/skills, or add a project Skill under .pisper/skills in the current workspace.`,"skillsPage.saveSettings":`Save settings`,"skillsPage.scanningSkillDirectoriesAndConfiguredPackages":`Scanning global Skills and current project Skills`,"skillsPage.scope":`Scope`,"skillsPage.skillInstalledAndLoadedIntoTheAgentRuntime":`Global Skill imported and loaded into the agent runtime`,"skillsPage.skillSettingsSavedAndReloaded":`Skill settings saved and reloaded`,"skillsPage.skillSource":`Skill source`,"skillsPage.skillsProvideInstructionsToTheAgentAndMayIncludeExecutableScriptsConfirmThatYouTrustTheSource":`Skills provide instructions to the agent and may include executable scripts. Confirm that you trust the source.`,"skillsPage.skillUninstalled":`Skill uninstalled`,"skillsPage.source":`Source`,"skillsPage.supportManualSkillCommand":`Support manual /skill command`,"skillsPage.thisRemovesTheSkillDirectoryInstalledByPisperItDoesNotUninstallTheOriginalNpmOrGitPackage":`This removes the skill directory installed by Pisper. It does not uninstall the original npm or git package.`,"skillsPage.toggleSkillName":`Toggle skill {name}`,"skillsPage.triggerConditions":`Trigger conditions`,"skillsPage.triggerMode":`Trigger mode`,"skillsPage.uninstall":`Uninstall`,"skillsPage.uninstallSkill":`Uninstall skill`,"skillsPage.userScopedConfiguration":`User-scoped configuration`,"skillsPage.usesChatToolPermissions":`Uses chat tool permissions`,"skillsPage.version":`Version`,"skillsPage.lede":`Skills are reusable instructions and scripts for agents. Invoke them with /skill or let the model call them automatically.`,"skillsPage.toggleSkillDetails":`Expand or collapse details for {name}`},De={"terminalPanel.terminal":`Terminal`,"terminalPanel.resizeTerminal":`Resize terminal`,"terminalPanel.hideTerminal":"Hide terminal (Ctrl+`)","terminalPanel.showTerminal":"Show terminal (Ctrl+`)","terminalPanel.newTerminal":`New terminal`,"terminalPanel.closeTerminal":`Close terminal`,"terminalPanel.maximizeTerminal":`Expand terminal panel`,"terminalPanel.openTerminal":`Open terminal`,"terminalPanel.usesActiveSessionWorkspace":`New terminals use the active session workspace`,"terminalPanel.orphanedTerminal":`Unlinked`,"terminalPanel.starting":`Starting shell...`,"terminalPanel.processExited":`Process exited with code {code}`,"workspace.unavailable":`Terminal unavailable`,"workspace.nativeOnly":`This connection has no native terminal bridge. Terminal processes cannot be listed or started.`,"workspace.ephemeral":`Terminal connections do not survive a refresh. Create a new terminal.`,"workspace.create":`Create terminal`,"workspace.defaultDirectory":`Default terminal directory`,"workspace.profile":`Terminal profile`,"workspace.orphaned":`Original task deleted`,"workspace.exited":`Exited`,"workspace.error":`Error`,"workspace.starting":`Starting`,"workspace.stopping":`Stopping`,"workspace.running":`Running`,"workspace.stop":`Stop process`,"workspace.follow":`Follow output`,"workspace.truncated":`Only recent output is retained. Earlier logs have left the memory buffer.`,"workspace.noOutput":`No output yet`,"workspace.ownedProcesses":`Terminal processes created by Pisper for this task only`,"workspace.filter":`Filter process status`,"workspace.all":`All statuses`,"workspace.noMatch":`No matching processes`,"workspace.noProcesses":`No terminal processes for this task`,"workspace.logs":`Toggle logs`,"workspace.unknown":`Unknown status`,"workspace.open":`Open terminal`,"workspace.closeView":`Close view (process keeps running)`,"workspace.restoreViews":`Show hidden terminals`,"workspace.terminal":`Terminal`,"workspace.processes":`Background processes`},Oe={"assetsPage.images":`图片`,"assetsPage.videos":`视频`,"assetsPage.files":`文件`,"assetsPage.links":`链接`,"assetsPage.fromCurrentChat":`来自当前会话`,"assetsPage.adding":`添加中…`,"assetsPage.addLink":`添加链接`,"assetsPage.addLinkAsset":`添加链接资产`,"assetsPage.agentOutputs":`Agent 产物`,"assetsPage.all":`全部`,"assetsPage.assetDeleted":`资产已删除`,"assetsPage.bringInALinkOrAttachAFileInAConversationPisperWillGatherTheOutputsCreatedAlongTheWay":`把链接带来,或在对话中加入附件;Pisper 会把沿途生成的文件一并收好。`,"assetsPage.cancel":`取消`,"assetsPage.conversationAttachmentsAndAgentOutputsGatherHereAutomatically":`对话附件与 Agent 产物,会在这里自动汇聚`,"assetsPage.delete":`删除`,"assetsPage.deleteAsset":`删除资产`,"assetsPage.deleteAssetName":`确定删除资产「{name}」吗?`,"assetsPage.download":`下载`,"assetsPage.downloadStarted":`已开始下载`,"assetsPage.forExampleOpenAIAPIDocs":`例如 OpenAI API 文档`,"assetsPage.fromName":`来自:{name}`,"assetsPage.linkAssetAdded":`链接资产已添加`,"assetsPage.linksCanBeArchivedOpenedOrAddedToAChatAsContext":`链接可以归档、打开,也可以作为上下文加入对话。`,"assetsPage.loadingAssets":`正在加载资产`,"assetsPage.loadFailed":`资产读取失败`,"assetsPage.chatAttachments":`对话附件`,"assetsPage.manualUploads":`手动上传`,"assetsPage.name":`名称`,"assetsPage.nameAddedToChat":`{name} 已加入对话`,"assetsPage.nothingHasGatheredHereYet":`这里还没有留下产物`,"assetsPage.open":`打开`,"assetsPage.openedInApplication":`已交给系统应用处理`,"assetsPage.openInApplication":`以应用打开`,"assetsPage.preview":`预览`,"assetsPage.thisFileTypeCanBeDownloadedSupportedDocumentsCanAlsoBeAddedToAChatForAnalysis":`此类型可下载,支持的文档也可以直接加入对话分析。`,"assetsPage.useInChat":`用于对话`,"assetsPage.filters":`筛选`,"assetsPage.assetType":`资产类型`,"assetsPage.removeFilter":`移除{filter}筛选`,"assetsPage.refreshAssets":`刷新资产`,"assetsPage.refreshingAssets":`正在刷新资产…`,"assetsPage.retry":`重试`,"assetsPage.mediaFailed":`媒体加载失败`,"assetsPage.loadingPreview":`正在加载预览…`,"assetsPage.previewTruncated":`预览内容已截断;下载可获取完整文件。`,"assetsPage.noActiveSession":`请选择一个会话以查看其资产。`,"assetsPage.noCurrentAssets":`当前会话中没有符合条件的资产`,"assetsPage.noMatchingAssets":`没有匹配的资产`,"assetsPage.tryOtherFilters":`尝试其他筛选条件或搜索词。`,"assetsPage.invalidLink":`请输入有效的 http 或 https 链接。`},ke={"sessionContext.title":`会话上下文`,"sessionContext.resize":`调整会话上下文宽度`,"sessionContext.resizeHint":`拖动或用左右方向键调整宽度,双击恢复默认`,"focusSession.fileChangesRevertFileDescription":`确定撤销 {path} 的会话改动并恢复快照内容?此操作会覆盖该文件当前的内容。`,"sessionContext.plan":`计划`,"sessionContext.planEmpty":`此会话还没有执行计划。`,"sessionContext.openUrl":`打开`,"sessionContext.invalidUrl":`请输入有效的 http 或 https 地址。`,"sessionContext.browserEmpty":`输入网址以预览页面。`,"resourcePicker.title":`调用资源`,"resourcePicker.description":`插入 Prompt,调用 Skill 或工具,或启动可持续跟踪的工作流。`,"resourcePicker.open":`技能与工具`,"resourcePicker.close":`关闭资源选择器`,"resourcePicker.search":`搜索 Prompt、Skill、工具和工作流`,"resourcePicker.categories":`资源分类`,"resourcePicker.all":`全部`,"resourcePicker.prompt":`Prompt`,"resourcePicker.skill":`Skill`,"resourcePicker.workflow":`工作流`,"resourcePicker.tool":`工具`,"resourcePicker.loading":`正在加载资源…`,"resourcePicker.empty":`没有找到可调用的资源。`,"resourcePicker.noDescription":`暂无说明`,"resourcePicker.chooseResource":`选择左侧资源以查看调用配置。`,"resourcePicker.useResource":`使用此资源`,"resourcePicker.insertPrompt":`插入 Prompt`,"resourcePicker.remove":`移除调用资源`,"commands.open":`打开 Slash 命令`,"commands.prompt":`Prompt`,"commands.skill":`Skill`,"commands.loading":`正在加载命令…`,"commands.loadError":`命令加载失败。`,"commands.empty":`没有匹配的命令。`,"commands.noDescription":`暂无说明`,"commands.scope.user":`用户级`,"commands.scope.project":`项目级`,"commands.scope.package":`Package`,"commands.scope.custom":`自定义`,"commands.builtin.label":`命令`,"commands.builtin.current":`当前`,"commands.builtin.new":`开始新任务`,"commands.builtin.model":`切换模型,保留上下文`,"commands.builtin.effort":`设置这次对话的思考强度`,"commands.builtin.approval":`选择工具什么时候需要你批准`,"commands.builtin.run":`选择运行方式:Plan、目标或团队`,"commands.builtin.compact":`现在压缩较早的上下文`,"commands.builtin.changes":`查看本会话的改动`,"commands.builtin.btw":`旁问:带着当前对话单独问一句,不打断、不写入会话`,"sideQuestion.label":`旁问`,"sideQuestion.close":`关闭旁问`,"sideQuestion.answering":`正在回答…`,"sideQuestion.empty":`没有回答内容。`,"sideQuestion.toolIgnored":`模型想调用工具才能回答;旁问不执行工具,可以直接发给代理。`,"sideQuestion.failed":`旁问失败:{error}`,"sideQuestion.note":`基于当前对话回答,不会写入会话;关闭即丢弃。`,"sessionTree.menu":`会话树`,"sessionTree.title":`会话树`,"sessionTree.branches":`分支`,"sessionTree.description":`这段对话沉淀了 {nodes} 个节点和 {branches} 条分叉路径;切换路径不会删除其他上下文。`,"sessionTree.labeled":`标记`,"sessionTree.allMarks":`全部标记`,"sessionTree.showAllEntries":`显示全部条目(工具调用、设置)`,"sessionTree.backToNodes":`返回节点列表`,"sessionTree.markActive":`当前分支`,"sessionTree.markTimes":`会话 {sessionTime} · 节点 {nodeTime}`,"sessionTree.noMarksYet":`还没有标记过任何回合。回复下方“⋯ → 标记此回合”可以标记。`,"sessionTree.loadingMarks":`正在加载标记`,"sessionTree.userMessage":`用户消息`,"sessionTree.agentMessage":`Agent 回复`,"sessionTree.toolResult":`工具结果`,"sessionTree.toolCall":`工具调用`,"sessionTree.branchSummary":`分支摘要`,"sessionTree.compactionSummary":`上下文摘要`,"sessionTree.settingsChange":`运行设置`,"sessionTree.labelChange":`标记变更`,"sessionTree.branchPosition":`待继续的分支位置`,"sessionTree.extensionEntry":`Runtime 条目`,"sessionTree.metadataEntry":`会话元数据`,"sessionTree.message":`消息`,"sessionTree.current":`当前`,"sessionTree.fork":`分叉`,"sessionTree.active":`活动分支`,"sessionTree.loading":`正在读取会话树…`,"sessionTree.searchPlaceholder":`搜索标记和节点内容`,"sessionTree.empty":`此筛选下没有节点。`,"sessionTree.noPreview":`此节点没有可显示的正文。`,"sessionTree.nodeLabel":`节点标记`,"sessionTree.labelPlaceholder":`可选,用于快速定位`,"sessionTree.saveLabel":`保存标记`,"sessionTree.savingLabel":`正在保存…`,"sessionTree.removeLabel":`删除标记`,"sessionTree.abandonedBranchSummary":`总结离开的分支`,"sessionTree.abandonedBranchSummaryHint":`由当前模型生成摘要并带入新分支,会产生一次模型请求。`,"sessionTree.sideEffectsRemain":`切换只改变后续对话上下文,不会撤销文件、网络或工具操作。`,"sessionTree.navigating":`正在切换…`,"sessionTree.currentPosition":`当前节点`,"sessionTree.continueFromNode":`从此处继续`,"sessionTree.createChildChat":`从此处另开`,"sessionTree.creatingChildChat":`正在创建独立对话…`,"sessionTree.conversationLineage":`对话脉络`,"sessionTree.returnToOriginalChat":`返回原对话:{name}`,"sessionTree.openSeparateChat":`打开另开的对话:{name}`,"sessionTree.chooseNode":`选择一个节点查看详情。`,"sessionTree.retry":`重试`,"sessionTree.undo":`撤销`,"sessionTree.undone":`已撤销,回到原来的分支`,"sessionTree.switchedBranch":`已切换到标记所在的分支`,"sessionTree.otherBranchTitle":`这个标记在另一条分支上`,"sessionTree.otherBranchMessage":`打开它会把当前分支切换过去;原来的分支仍保留在会话树里,切换后可以撤销。`,"sessionTree.switchBranch":`切换分支并打开`,"workflowRun.running":`运行中`,"workflowRun.waitingApproval":`等待审批`,"workflowRun.completed":`已完成`,"workflowRun.failed":`失败`,"workflowRun.stopped":`已停止`,"workflowRun.interrupted":`已中断`,"workflowRun.approve":`批准`,"workflowRun.reject":`拒绝`,"workflowRun.stop":`停止运行`,"workflowRun.request":`启动说明`,"workflowRun.inputs":`输入参数`,"planBoard.ariaLabel":`执行计划`,"planBoard.toggleAriaLabel":`展开或折叠当前执行计划`,"planBoard.progress":`Plan · {completed}/{total}`,"planBoard.countInProgress":`{count} 进行中`,"planBoard.countBlocked":`{count} 被阻塞`,"planBoard.completed":`已完成`,"planBoard.inProgress":`进行中`,"planBoard.blocked":`被阻塞`,"planBoard.pending":`待处理`,"planBoard.unassigned":`未认领`,"planBoard.assignedTo":`认领人:{name}`,"planBoard.waitingFor":`等待:{tasks}`,"agentRunActivity.readingFiles":`正在读取文件`,"agentRunActivity.searchingContent":`正在搜索内容`,"agentRunActivity.findingFiles":`正在查找文件`,"agentRunActivity.browsingDirectories":`正在浏览目录`,"agentRunActivity.editingFiles":`正在修改文件`,"agentRunActivity.writingFiles":`正在写入文件`,"agentRunActivity.runningCommands":`正在运行命令`,"agentRunActivity.runningScript":`正在运行脚本`,"agentRunActivity.searchingMemory":`正在搜索记忆`,"agentRunActivity.savingMemory":`正在保存记忆`,"agentRunActivity.openingMemory":`正在查看记忆`,"agentRunActivity.confirmingMemory":`正在确认记忆`,"agentRunActivity.forgettingMemory":`正在删除记忆`,"agentRunActivity.startingSubagent":`正在启动子 Agent`,"agentRunActivity.checkingSubagents":`正在检查子 Agent`,"agentRunActivity.messagingSubagent":`正在向子 Agent 发送消息`,"agentRunActivity.messagingTeamMember":`正在向 Team 成员发送消息`,"agentRunActivity.checkingTeamMembers":`正在查看 Team 成员`,"agentRunActivity.runningTeamWorkflow":`正在执行 Team 工作流脚本`,"agentRunActivity.addingSubagentTask":`正在追加子 Agent 任务`,"agentRunActivity.waitingForSubagent":`正在等待子 Agent`,"agentRunActivity.interruptingSubagent":`正在中断子 Agent`,"agentRunActivity.liveCommandOutput":`实时命令输出`,"agentRunActivity.readingPlan":`正在读取计划`,"agentRunActivity.updatingPlan":`正在更新计划`,"agentRunActivity.controllingBrowser":`正在操作浏览器`,"agentRunActivity.observingInterface":`正在查看应用界面`,"agentRunActivity.operatingInterface":`正在操作应用界面`,"agentRunActivity.searchingInterface":`正在搜索界面元素`,"agentRunActivity.findingAppWindows":`正在查找应用窗口`,"agentRunActivity.readingInterfaceText":`正在读取界面文字`,"agentRunActivity.waitingForInterface":`正在等待界面变化`,"agentRunActivity.interfaceObserved":`应用界面已查看`,"agentRunActivity.interfaceActionCompleted":`界面操作已完成`,"agentRunActivity.interfaceTextRead":`界面文字已读取`,"agentRunActivity.toolPreviewAlt":`工具界面预览图`,"computerUseLive.previewAlt":`应用窗口实时画面`,"computerUseLive.appWindow":`应用窗口`,"computerUseLive.waitingForFirstFrame":`正在连接窗口画面…`,"computerUseLive.live":`实时`,"computerUseLive.connecting":`连接中`,"computerUseLive.staticPreview":`静态预览`,"computerUseLive.secureInput":`系统安全输入已激活:密码保护拦截了自动化键盘输入,代理的输入可能无效。`,"agentRunActivity.generatingVisualContent":`正在生成视觉内容`,"agentRunActivity.discoveringTools":`正在查找可选工具`,"agentRunActivity.filesRead":`已读取文件`,"agentRunActivity.searchCompleted":`已完成搜索`,"agentRunActivity.findCompleted":`已完成查找`,"agentRunActivity.directoriesBrowsed":`已浏览目录`,"agentRunActivity.filesEdited":`已修改文件`,"agentRunActivity.filesWritten":`已写入文件`,"agentRunActivity.commandCompleted":`命令执行完成`,"agentRunActivity.scriptCompleted":`脚本运行完成`,"agentRunActivity.commandOutput":`命令输出`,"agentRunActivity.exitCode":`exit {code}`,"agentRunActivity.subagentStarted":`子 Agent 已启动`,"agentRunActivity.teamMessageSent":`Team 消息已发送`,"agentRunActivity.teamMembersListed":`Team 成员已列出`,"agentRunActivity.teamWorkflowStarted":`Team 工作流已启动`,"agentRunActivity.subagentStatusUpdated":`子 Agent 状态已更新`,"agentRunActivity.toolsDiscovered":`已完成工具发现`,"agentRunActivity.agentQueued":`{name} 等待调度`,"agentRunActivity.agentStarting":`{name} 正在启动`,"agentRunActivity.agentRunning":`{name} 正在运行`,"agentRunActivity.agentCompleted":`{name} 已完成`,"agentRunActivity.agentInterrupted":`{name} 已中断`,"agentRunActivity.agentFailed":`{name} 执行失败`,"agentRunActivity.agentStatusUpdated":`{name} 状态已更新`,"agentRunActivity.addedTitle":`新增:{title}`,"agentRunActivity.advancingTheTask":`正在推进任务`,"agentRunActivity.blockedTitle":`阻塞:{title}`,"agentRunActivity.compactingContext":`正在压缩上下文`,"agentRunActivity.completedTitle":`完成:{title}`,"agentRunActivity.completedTotalCompleted":`{completed}/{total} 已完成`,"agentRunActivity.contextCompactedBeforeAfterTokens":`上下文已压缩:{before} → {after} tokens`,"agentRunActivity.contextIsFullTheRequestWillRetryAfterCompaction":`上下文已满,压缩后将自动重试`,"agentRunActivity.contextIsNearingItsLimitSummarizingOlderMessages":`上下文接近上限,正在摘要较早消息`,"agentRunActivity.countInProgress":`{count} 项进行中`,"agentRunActivity.countMoreChanges":`还有 {count} 项变更`,"agentRunActivity.countPlanChanges":`{count} 项计划变更`,"agentRunActivity.currentOperationCompleted":`当前操作已完成`,"agentRunActivity.inProgressTitle":`进行中:{title}`,"agentRunActivity.noNewProgressForCountS":`{count} 秒无新进度`,"agentRunActivity.pendingTitle":`待处理:{title}`,"agentRunActivity.planCleared":`计划已清空`,"agentRunActivity.planUpdated":`已更新计划`,"agentRunActivity.preparingTheResponse":`正在整理回复`,"agentRunActivity.processingToolResult":`正在处理工具结果`,"agentRunActivity.startingTheModel":`正在启动模型请求`,"agentRunActivity.reasoningAboutTheNextStep":`正在推理下一步`,"agentRunActivity.reasoningInProgress":`思考中`,"agentRunActivity.reasoningCompleted":`思考过程`,"agentRunActivity.toggleReasoning":`展开或折叠思考过程`,"agentRunActivity.toolActivityAriaLabel":`工具使用记录`,"agentRunActivity.removedTitle":`移除:{title}`,"agentRunActivity.retryingRequest":`正在重试请求`,"agentRunActivity.runStopped":`已停止运行`,"agentRunActivity.subagent":`子 Agent`,"agentRunActivity.subagentWithProfile":`{name}({profile} · {model})`,"agentRunActivity.subagentTierModelFallback":`定义里指定的模型不可用,改用档位模型 {model}`,"agentRunActivity.subagentParentModelFallback":`定义里的模型不可用或档位未设置,改用当前会话模型 {model}`,"agentRunActivity.subagentTierUnavailableFallback":`档位对应的模型不可用,改用当前会话模型 {model}`,"agentRunActivity.summarizingOlderMessages":`正在整理较早消息`,"agentRunActivity.summarizingOlderMessagesAsRequested":`正在按请求整理较早消息`,"agentRunActivity.thisRunFailed":`本轮执行失败`,"agentRunActivity.toolFailed":`{tool}执行失败`,"agentRunActivity.tools":`工具`,"agentRunActivity.understandingTheTask":`正在理解任务`,"agentRunActivity.usingTool":`正在使用 {tool}`,"agentRunActivity.waitingForTheModel":`正在等待模型响应`,"agentRunActivity.waitingToRetry":`正在等待重试`,"agentRunActivity.finalizingTheRun":`正在完成本轮执行`,"agentRunActivity.teamBudget":`{used} / {budget} tokens`,"agentRunActivity.teamBlocked":`{count} 个阻塞项`,"agentRunActivity.teamConflicts":`{count} 个文件冲突`,"agentRunActivity.teamSummary":`团队最终汇总`,"agentRunActivity.teamActive":`团队正在协同工作`,"agentRunActivity.teamPaused":`团队已暂停`,"agentRunActivity.teamStalled":`团队长时间无进展,请检查任务`,"agentRunActivity.teamBudgetLimited":`团队预算已用尽`,"agentRunActivity.teamComplete":`团队已完成`,"agentRunActivity.teamTaskStatus":`{name} · {role} · {status}`,"agentRunActivity.teamTaskStatusWithoutRole":`{name} · {status}`,"agentRunActivity.teamTaskQueued":`排队中`,"agentRunActivity.teamTaskStarting":`启动中`,"agentRunActivity.teamTaskRunning":`运行中`,"agentRunActivity.teamTaskCompleted":`已完成`,"agentRunActivity.teamTaskFailed":`失败`,"agentRunActivity.teamTaskInterrupted":`已中断`,"agentRunActivity.teamTaskBlocked":`已阻塞`,"agentRunActivity.teamTaskStatusUpdated":`状态已更新`,"agentRunActivity.teamScript":`脚本:{path}`,"agentRunActivity.teamCommunicationCount":`{count} 条 Team 直连消息`,"agentRunActivity.teamMessageActivity":`Team 成员消息`,"agentRunActivity.teamMessageDetail":`{from} -> {to}`,"attachments.couldNotReadFile":`读取文件失败`,"attachments.nameExceedsThe10MBLimit":`{name} 超过 10 MB 限制`,"attachments.nameIsNotSupportedChooseAnImageOrTextCodeFile":`{name} 暂不支持;请选择图片、文档或文本/代码文件`,"attachments.totalAttachmentSizeCannotExceed20MB":`附件总大小不能超过 20 MB`,"chatDock.newChat":`新建会话`,"chatDock.openAChatFromTheSessionListOrSplitItInAnyDirection":`从侧边栏打开会话,或向任意方向拆分。`,"chatDock.openAChatToBegin":`打开一个会话开始工作`,"chatHistoryPage.statusRunning":`运行中`,"chatHistoryPage.statusFailed":`失败`,"chatHistoryPage.statusApproval":`待审批`,"chatHistoryPage.groupPinned":`已置顶`,"chatHistoryPage.groupToday":`今天`,"chatHistoryPage.groupWeek":`近 7 天`,"chatHistoryPage.groupEarlier":`更早`,"chatHistoryPage.historySections":`会话分类`,"chatHistoryPage.activeChats":`未归档`,"chatHistoryPage.activeChatsCount":`未归档({count})`,"chatHistoryPage.noActiveChats":`暂无未归档会话`,"chatHistoryPage.noArchivedChats":`暂无归档会话`,"chatHistoryPage.archivedChatsAppearHere":`归档后的会话会显示在这里,随时可以恢复。`,"chatHistoryPage.restoreArchivedChats":`可切换到已归档并恢复会话。`,"chatHistoryPage.sessionUpdateFailed":`会话状态未能更新,请刷新后重试。`,"chatHistoryPage.archivedChats":`已归档({count})`,"chatHistoryPage.archived":`已归档`,"chatHistoryPage.needsAttention":`需要处理`,"chatHistoryPage.unread":`未读`,"chatHistoryPage.pin":`置顶`,"chatHistoryPage.unpin":`取消置顶`,"chatHistoryPage.pinned":`会话已置顶`,"chatHistoryPage.unpinned":`已取消置顶`,"chatHistoryPage.archive":`归档`,"chatHistoryPage.restore":`恢复`,"chatHistoryPage.movedToArchive":`会话已归档`,"chatHistoryPage.restored":`会话已恢复`,"chatHistoryPage.markRead":`标为已读`,"chatHistoryPage.markedRead":`已标为已读`,"chatHistoryPage.changeSummary":`{count} 个文件 · +{added}/-{removed}`,"chatHistoryPage.allChatsShown":`已显示全部 {count} 条会话`,"chatHistoryPage.chatDeleted":`会话已删除`,"chatHistoryPage.chatHistory":`历史会话`,"chatHistoryPage.lede":`全部会话都在这里,含已归档的;点一行回到那次对话。`,"chatHistoryPage.loadFailed":`历史会话读取失败`,"chatHistoryPage.chatTitle":`会话标题`,"chatHistoryPage.chatTitleUpdated":`会话标题已更新`,"chatHistoryPage.countChatHistoryItems":`{count} 个历史会话`,"chatHistoryPage.countCurrentlyFiltered":`当前筛选到 {count} 个`,"chatHistoryPage.countMessages":`{count} 条消息`,"chatHistoryPage.delete":`删除`,"chatHistoryPage.deleteChat":`删除会话`,"chatHistoryPage.deleteChatNameThisAlsoRemovesLocalChatHistory":`确定删除会话「{name}」吗?此操作会删除本地历史记录。`,"chatHistoryPage.loadingChatHistory":`正在加载历史会话`,"chatHistoryPage.loadMoreChats":`加载更多会话(已显示 {shown} / {total})`,"chatHistoryPage.moreActionsForChat":`{name} 的更多操作`,"chatHistoryPage.noConversationsHaveLeftAnEchoYet":`还没有会话留下回声`,"chatHistoryPage.noMatchingConversations":`没有匹配的历史会话`,"chatHistoryPage.noMessageSummary":`暂无消息摘要`,"chatHistoryPage.openChatNamed":`打开会话 {name}`,"chatHistoryPage.onceAConversationBeginsItWillBeQuietlyGatheredHere":`开始一段对话后,它会被安静地收进这里。`,"chatHistoryPage.refresh":`刷新`,"chatHistoryPage.renameChat":`重命名会话`,"chatHistoryPage.save":`保存`,"chatHistoryPage.sortedByMostRecentlyUpdated":`按最近更新时间排列`,"chatHistoryPage.tryADifferentSearch":`更换搜索关键词后重试。`,"chatHistoryPage.untitledChat":`未命名会话`,"chatMessage.closePreview":`关闭预览`,"chatMessage.downloadOriginal":`下载原图`,"chatMessage.deriveFromHere":`从此处继续`,"chatMessage.rewindHere":`回到这里(含文件)`,"fileRewind.title":`回到这里,并把文件回退到这一轮结束时?`,"fileRewind.summary":`将回退 {count} 个文件(恢复 {restore} 个,删除 {remove} 个):`,"fileRewind.restoreItem":`· 恢复 {path}`,"fileRewind.deleteItem":`· 删除 {path}(这一轮之后才新建)`,"fileRewind.more":`· 另外 {count} 个文件`,"fileRewind.nothing":`这一轮之后没有可回退的文件修改,只会把对话回到这里。`,"fileRewind.unavailable":`{count} 个文件无法回退(过大、不是普通文件或已移出工作区):{paths}`,"fileRewind.incomplete":`更早的文件快照已清理,回退结果可能不完整。`,"fileRewind.scope":`只回退 Pisper 写入/编辑工具做的修改;命令行、MCP 等其它方式改动的文件不会回退。文件回退后不能撤销。`,"fileRewind.confirm":`回退文件并回到这里`,"fileRewind.confirmChatOnly":`回到这里`,"fileRewind.done":`已回到这里,{count} 个文件已回退`,"fileRewind.doneChatOnly":`已回到这里,没有需要回退的文件`,"fileRewind.doneUnavailable":`{count} 个文件无法回退。`,"chatMessage.createChildChat":`从此处另开对话`,"chatMessage.retry":`重试`,"chatMessage.labelThisTurn":`标记此回合`,"chatMessage.turnLabel":`标记:{label}`,"chatMessage.thinkingTime":`思考 {duration}`,"chatMessage.fileAttachment":`文件附件`,"chatMessage.fullScreenImagePreview":`图片大屏预览`,"chatMessage.generatedImage":`生成图片`,"chatMessage.generatedVideo":`生成视频`,"chatMessage.imageAttachment":`图片附件`,"chatMessage.openFullScreenPreview":`点击大屏查看`,"chatMessage.previousImage":`上一张图片`,"chatMessage.nextImage":`下一张图片`,"chatPage.appChat":`{app} 对话`,"chatPage.approvalRequired":`审批后写入`,"chatPage.approvalStatusUpdated":`授权状态已更新`,"chatPage.chatTitle":`会话标题`,"chatPage.chatTitleUpdated":`会话标题已更新`,"chatPage.contextCompacted":`上下文已压缩`,"chatPage.compactAfterModelSwitch":`压缩当前上下文?`,"chatPage.compactAfterModelSwitchDescription":`切换模型后原有前缀缓存无法继续复用。现在压缩历史上下文,可减少新模型首次请求需要重新处理的输入量。`,"chatPage.compactNow":`立即压缩`,"chatPage.currentRunStopped":`已停止当前运行`,"chatPage.branchedFromNode":`已从该节点衍生分支,后续对话将在此继续`,"chatPage.createChildChat":`从此处另开对话`,"chatPage.separateChatSuffix":`另开`,"chatPage.childChatCreated":`独立对话已创建`,"chatPage.create":`创建`,"chatPage.enableFullAccess":`启用完全访问`,"chatPage.executionModeChangedToMode":`审批模式已切换为{mode}`,"chatPage.fullAccess":`完全访问`,"chatPage.fullAccessAllowsTheAgentToUseFilesAndNetworkServicesOutsideTheWorkspaceAndShellCommandsWillNoLon":`完全访问允许 Agent 操作工作区之外的文件和网络服务,并以当前系统用户权限运行 Shell,不再逐次请求授权。`,"chatPage.goalPaused":`Goal 已暂停`,"chatPage.goalTokenBudgetUpdated":`Goal token 预算已更新`,"chatPage.modelsSessionsAndContextAreSettlingIntoPlace":`模型、会话与上下文正在依次归位…`,"chatPage.newChat":`新会话`,"chatPage.newChatCreated":`新会话已创建`,"chatPage.noModelConfigured":`未配置模型`,"chatPage.pleaseAnalyzeTheseAttachments":`请分析这些附件。`,"chatPage.renameChat":`重命名会话`,"chatPage.save":`保存`,"chatPage.stopped":`已停止`,"chatPage.switchedToModel":`已切换至 {model}`,"chatPage.switchedToThinkingLevel":`已切换思考等级至 {level}`,"chatPage.theAgentHasFinishedResponding":`Agent 已完成回复。`,"chatPage.theChatWasCreatedButTheListCouldNotBeRefreshedError":`会话已创建,但刷新列表失败:{error}`,"chatPage.waitingForConfiguration":`等待配置`,"chatPage.wakingTheAgent":`正在唤醒 Agent`,"chatPage.remoteUnavailableSwitchedToLocal":`远程桌面连接超时,已自动切换回本机模式`,"chatPage.workingDirectoryChangedToWorkspace":`工作目录已切换至 {workspace}`,"chatPage.stopTheActiveRunBeforeChangingTheWorkspace":`请先停止运行,再切换工作目录`,"chatPage.stopTheActiveRunBeforeRenamingTheChat":`请先停止运行,再重命名会话`,"focusSession.addAttachment":`添加附件`,"focusSession.dropAttachment":`松开以添加附件`,"focusSession.queuedInputAlreadyConsumed":`该消息已离开待发送队列,无法撤回。`,"focusSession.toolbarModel":`会话模型`,"voiceInput.open":`开始语音输入`,"voiceInput.close":`关闭语音输入`,"voiceInput.stop":`停止录音`,"voiceInput.permissionDenied":`麦克风权限未授予,请在系统设置中允许 Pisper 使用麦克风。`,"voiceInput.failed":`语音输入失败`,"voiceInput.empty":`未采集到可识别的语音。`,"voiceMode.title":`语音对话`,"voiceMode.idle":`轻点麦克风开始说话`,"voiceMode.requesting":`正在请求麦克风权限…`,"voiceMode.listening":`正在聆听,说完轻点发送`,"voiceMode.transcribing":`正在转写…`,"voiceMode.thinking":`Pisper 正在思考…`,"voiceMode.speaking":`正在播报回复,轻点可打断`,"voiceMode.failed":`语音对话出错`,"voiceMode.interrupt":`打断并继续对话`,"voiceMode.mute":`暂停聆听`,"voiceMode.unmute":`恢复聆听`,"voiceMode.emptyReply":`(回复没有可朗读的内容)`,"voiceMode.startConversation":`开始对话`,"voiceMode.endConversation":`结束对话`,"speechModels.title":`语音模型与音色`,"speechModels.notices":`许可与来源说明`,"speechModels.provenancePending":`待核对`,"speechModels.modifications":`本地派生记录`,"speechModels.downloadNotices":`下载许可与来源说明`,"speechModels.notInstalled":`待下载`,"speechModels.downloading":`下载中`,"speechModels.verifying":`校验并安装中`,"speechModels.installed":`已安装`,"speechModels.cancelled":`下载已取消`,"speechModels.failed":`下载失败`,"speechModels.loading":`正在读取模型状态`,"speechModels.recognition":`语音识别`,"speechModels.synthesis":`语音合成`,"speechModels.cancelDownload":`取消下载`,"speechModels.download":`下载模型`,"speechModels.downloadAll":`下载所需模型`,"speechModels.voice":`音色`,"speechModels.preview":`试听音色`,"speechModels.stopPreview":`停止试听`,"speechModels.previewEnglish":`Hello. What would you like to work on today?`,"speechModels.previewChinese":`你好,今天有什么需要我帮忙的吗?`,"speechModels.done":`完成`,"speechModels.close":`关闭语音对话`,"focusSession.allow":`允许`,"focusSession.allowAlways":`以后都允许 {prefix}`,"focusSession.allowAlwaysHint":`在这个项目里,以 {prefix} 开头的单条命令以后不再询问(可在 设置 › 模型 › 权限规则 中删除)`,"focusSession.autoCompactionThreshold":`自动压缩阈值`,"focusSession.compactingContext":`正在压缩上下文`,"focusSession.contextUsageToCompactionTokensPercent":`距离自动压缩还剩 {tokens} tokens({percent}%)`,"focusSession.currentChatModel":`当前会话模型`,"focusSession.modelChipShort":`模型`,"focusSession.currentThinkingLevel":`当前思考等级`,"focusSession.searchModels":`搜索模型`,"focusSession.noMatchingModels":`没有匹配的模型`,"focusSession.noModelsAvailable":`还没有可用的对话模型,请先在设置里添加服务商`,"focusSession.thinkingModelDefault":`模型默认`,"focusSession.thinkingReset":`恢复默认`,"focusSession.thinkingLevelTitle":`思考等级`,"newTask.placeholder":`描述要做的事,或用 / 调用命令`,"newTask.greetingMorning":`早上好`,"newTask.greetingNoon":`中午好`,"newTask.greetingAfternoon":`下午好`,"newTask.greetingEvening":`晚上好`,"newTask.greetingLateNight":`夜深了,还在忙?`,"focusSession.queuedTitle":`排队中`,"focusSession.queuedAfter":`排在「{title}」之后:它这一轮结束时自动开始。`,"focusSession.queuedAfterUnknown":`等前一个任务这一轮结束后自动开始。`,"focusSession.startQueuedNow":`立即开始`,"focusSession.emptyTitle":`这个会话还没有消息`,"focusSession.emptyDescription":`在下方输入框发出第一条消息。`,"focusSession.taskDescription":`任务描述`,"focusSession.thinkingLabel.off":`关闭`,"focusSession.thinkingLabel.minimal":`极轻`,"focusSession.thinkingLabel.low":`轻度`,"focusSession.thinkingLabel.medium":`标准`,"focusSession.thinkingLabel.high":`深度`,"focusSession.thinkingLabel.xhigh":`极深`,"focusSession.thinkingLabel.max":`最深`,"focusSession.thinkingLevelUnsupported":`当前模型不支持配置思考等级`,"focusSession.thinkingLevelFixed":`当前模型仅支持 {level} 思考等级`,"focusSession.thinkingLevelsLoadFailed":`思考等级加载失败,请刷新重试`,"focusSession.loadingThinkingLevels":`正在加载思考等级…`,"focusSession.deny":`拒绝`,"focusSession.document":`文档`,"focusSession.derivedFromSession":`衍生自「{name}」`,"focusSession.openSourceTurn":`打开原对话里的这一回合`,"focusSession.approvalMode":`审批模式`,"focusSession.executionMode":`执行模式`,"focusSession.planMode":`Plan 模式`,"focusSession.planModeDescription":`按计划推进这条消息,完成后等你下一条`,"focusSession.goalModeDescription":`单个 Agent 持续推进,直到完成或暂停`,"focusSession.teamMode":`Team 模式`,"focusSession.teamModeDescription":`主 Agent 组织多个 subagent 协同完成`,"focusSession.runningAsTeam":`团队正在协同执行`,"focusSession.goalTokenBudgetUnlimited":`不限`,"focusSession.usedUnlimitedGoalTokens":`已用 {used} tokens(不限)`,"focusSession.fullAccess":`完全访问`,"focusSession.goalComplete":`Goal 已完成`,"focusSession.goalMode":`Goal 模式`,"focusSession.goalBudgetSave":`保存预算`,"focusSession.goalTokenBudget":`Goal Token 预算`,"focusSession.teamTokenBudget":`Team Token 预算`,"focusSession.goalTokenBudgetHint":`留空表示不限 Token;填写后不低于 1,000 tokens`,"focusSession.goalTokenBudgetUpdateHint":`调整后即时生效,并用于下一次继续 Goal`,"focusSession.teamTokenBudgetHint":`留空表示 Team 不限 Token;填写后不低于 1,000 tokens`,"focusSession.fileChanges":`文件改动`,"focusSession.fileChangesCount":`已编辑 {count} 个文件`,"focusSession.fileChangesPending":`{count} 个待审批`,"focusSession.fileChangesEmpty":`本会话还没有文件改动`,"focusSession.fileChangesApproved":`已批准`,"focusSession.fileChangesReverted":`已撤销`,"focusSession.fileChangesFormatOnly":`仅格式:{detail}`,"focusSession.fileChangesLineEnding":`换行符 {from} → {to}`,"focusSession.fileChangesBomAdded":`加了 BOM`,"focusSession.fileChangesBomRemoved":`去掉 BOM`,"focusSession.fileChangesNoSnapshot":`该文件为二进制或过大,无法生成预览`,"focusSession.fileChangesApproveFile":`批准此文件`,"focusSession.fileChangesRevertFile":`撤销此文件`,"focusSession.fileChangesApproveAll":`全部批准`,"focusSession.fileChangesRevertAll":`全部撤销`,"focusSession.fileChangesRevertAllDescription":`把所有文件恢复到修改前(新建文件将被删除)`,"focusSession.fileChangesConfirmRevert":`确认撤销`,"focusSession.fileChangesApproveDone":`已批准全部文件改动`,"focusSession.fileChangesRevertDone":`已撤销文件改动`,"focusSession.fileChangesRevertPartial":`已恢复 {count} 个文件改动;无快照的文件已保留`,"focusSession.fileChangesRevertUnavailable":`没有可恢复的文件改动`,"focusSession.gitCloseDiff":`关闭 Diff`,"focusSession.gitDiffChangedFiles":`变更文件`,"focusSession.gitDiffFileCount":`{count} 个文件`,"focusSession.gitDiffModified":`修改后`,"focusSession.gitDiffNoTextChanges":`该文件没有可显示的文本差异`,"focusSession.gitDiffOriginal":`原始`,"focusSession.gitDiffTruncated":`diff 过长已截断`,"focusSession.gitDiffUnavailable":`暂无可用 diff`,"focusSession.gitLoading":`加载中…`,"focusSession.gitMoreFiles":`还有 {count} 个文件未显示`,"focusSession.gitRefresh":`刷新改动`,"focusSession.gitViewDiff":`查看 diff`,"focusSession.gitWaitForRunToFinish":`请等待当前运行完成`,"focusSession.cacheHitRate":`缓存`,"focusSession.cacheHitRateUnavailable":`当前 Provider 未上报缓存用量,命中率无法统计`,"focusSession.sessionStats":`详细统计`,"focusSession.statCurrentModel":`当前模型`,"focusSession.statContextTokens":`上下文占用`,"focusSession.statInputTokens":`输入 Tokens`,"focusSession.statOutputTokens":`输出 Tokens`,"focusSession.statCacheReadTokens":`缓存读取`,"focusSession.statCacheWriteTokens":`缓存写入`,"focusSession.statReasoningTokens":`推理 Tokens`,"focusSession.statProcessedTokens":`Tokens 处理总量`,"focusSession.statRequests":`请求次数`,"focusSession.statAvgFirstToken":`首字平均耗时`,"focusSession.statAvgDuration":`平均响应时长`,"focusSession.sessionStatsHint":`时序统计覆盖本机记录的模型请求,随会话保留。`,"focusSession.goalPaused":`Goal 已暂停`,"focusSession.goalReachedItsBudget":`Goal 已达到预算`,"focusSession.image":`图片`,"focusSession.localPath":`本机路径`,"focusSession.loadingConversationHistory":`正在载入会话记录…`,"focusSession.loadingOlderMessages":`正在加载更早消息…`,"focusSession.loadOlderMessages":`加载更早消息`,"focusSession.newContent":`有新内容`,"focusSession.approvalRequiredShort":`审批`,"focusSession.workspaceWriteShort":`自动`,"focusSession.fullAccessShort":`完全访问`,"focusSession.approvalRequired":`审批后写入`,"focusSession.approvalRequiredShowsADiffBeforeWriting":`写文件前看 Diff,命令逐条确认`,"focusSession.fullAccessRunsShellWithoutPerCommandApproval":`本机文件和网络都不再逐次确认`,"focusSession.workspaceWrite":`自动审批`,"focusSession.workspaceWriteRunsCommandsWithAutomaticApproval":`工作区内自动通过,外部文件先确认`,"focusSession.removeName":`移除 {name}`,"focusSession.renameChat":`重命名会话`,"sessionMenu.exportMarkdown":`导出 Markdown`,"sessionMenu.exported":`已导出“{title}”。不含思考过程与完整的本机路径。`,"sessionMenu.exportFailed":`导出失败。`,"focusSession.retryOlderMessages":`重试加载更早消息`,"focusSession.running":`运行中`,"focusSession.savingCompactionThreshold":`正在保存阈值…`,"focusSession.runningAutonomously":`正在自动执行`,"focusSession.sendMessage":`发送消息`,"focusSession.sentToTheRunningAgent":`待追加发送`,"focusSession.stop":`停止`,"focusSession.stopRunShortcut":`停止运行(Esc)`,"focusSession.text":`文本`,"focusSession.toolRequestsApproval":`{tool} 请求授权`,"focusSession.truncated":`已截断`,"focusSession.unknownSourceSession":`未知来源会话`,"focusSession.usedBudgetTokensUsed":`已用 {used}/{budget} tokens`,"focusSession.viewCallArguments":`查看调用参数`,"focusSession.generateImage":`生成图片`,"focusSession.visualPromptTemplate":`帮我生成一张图片:`,"focusSession.configureVisualModelFirst":`尚未配置视觉模型,已为你打开模型设置`,"chatMessage.fileActionPreview":`预览`,"chatMessage.filePreviewLoading":`正在读取文件…`,"chatMessage.filePreviewRetry":`重试`,"chatMessage.filePreviewSource":`源码`,"chatMessage.filePreviewUnavailable":`此文件暂不支持内容预览。`,"chatMessage.filePreviewTruncated":`内容过长,仅显示部分。`,"chatMessage.fileDiffEmpty":`没有可显示的改动:文件未变化,或没有修改前快照。`,"chatMessage.fileDiffFailed":`读取文件改动失败。`,"chatMessage.fileActionDownload":`下载`,"chatMessage.fileActionReveal":`在文件管理器中显示`,"chatMessage.fileActionDiff":`查看改动`,"chatMessage.fileActionRevert":`撤销改动`,"chatMessage.fileActionConfirmRevert":`再次点击确认撤销`,"chatMessage.fileActionRevertDone":`已撤销改动:{path}`,"chatMessage.fileActionRevertFailed":`撤销改动失败:{path}`,"chatMessage.moreFiles":`还有 {count} 个文件`,"chatMessage.fewerFiles":`收起`,"requestNotice.incomplete":`本次请求未完成`,"requestNotice.showDetails":`查看详情`,"requestNotice.hideDetails":`收起详情`,"requestNotice.details":`请求详情`,"requestNotice.retryingAttempt":`正在自动重试({attempt}/{maxAttempts})`,"requestNotice.modelFallback":`主模型暂时不可用,已切换到备用模型 {model} 继续`,"focusSession.modelAndThinking":`模型与智力`,"sessionContext.addPage":`新增辅助页面`,"sessionContext.closePage":`关闭辅助页面`,"sessionContext.pageLimit":`最多打开 12 个辅助页面`,"focusSession.runtimeSelectionDeferred":`生成时可预选,本轮结束后应用。`,"focusSession.thinkingAfterModelSwitch":`新模型生效后显示它支持的思考档位。`,"sideChat.title":`临时聊天`,"sideChat.retention":`继承当前会话的工作目录与模型设置,不共享聊天记录。闲置 24 小时后自动清理,任务运行中不会过期。`,"sideChat.empty":`在这里聊个支线话题,不打断主会话。`,"sideChat.expired":`临时聊天已过期。草稿仍保留,可以新开侧边聊天继续。`,"sideChat.restart":`新开侧边聊天`,"sideChat.message":`临时聊天消息`,"sideChat.placeholder":`聊点别的…`,"sideChat.send":`发送临时消息`,"sideChat.stop":`停止临时回复`,"workbench.backToConversation":`返回对话`,"workbench.newTab":`新建标签页`,"workbench.summary":`置顶摘要`,"workbench.closeSummary":`关闭摘要`,"workbench.projectChanges":`项目变更`,"workbench.taskSnapshots":`任务文件快照`,"workbench.sources":`来源`,"workbench.unavailable":`暂不可用`,"workbench.changesFailed":`无法读取项目变更,请在变更标签中重试。`,"workbench.otherState":`其他状态`,"workbench.viewAll":`查看全部`,"workbench.addSource":`添加到任务草稿`,"workbench.sourcesScope":`来源来自当前已加载的任务消息;新附件通过输入框发送后进入来源列表。`,"workbench.searchSources":`搜索来源`,"workbench.sourceType":`来源类型`,"workbench.allTypes":`全部类型`,"workbench.images":`图片`,"workbench.text":`文本`,"workbench.files":`文件`,"workbench.noMatches":`没有匹配的来源`,"workbench.noSources":`当前任务尚无来源`,"workbench.registeredAsset":`已登记附件`,"workbench.pathReference":`Runtime 路径引用;预览取决于已有读取能力。`,"workbench.invalidReference":`引用无效或未登记`,"workbench.projectScope":`当前项目目录的版本控制变更,可能包含其他任务的修改。`,"workbench.taskSnapshotScope":`当前任务工具记录的文件快照;审批与撤销沿用原有规则。`,"workbench.notRepository":`当前目录未使用受支持的版本控制。`,"workbench.expandAll":`全部展开`,"workbench.collapseAll":`全部收起`,"workbench.fullDiff":`完整差异视图`,"workbench.partialCounts":`已知文本行数(部分)`,"workbench.fileNoLongerChanged":`此文件已不在当前变更中:{path}`,"chatMessage.copyMessage":`复制消息`,"chatMessage.queued":`排队中`,"chatMessage.interrupted":`已打断`,"chatMessage.copyReply":`复制回复`,"chatMessage.copyReplyFailed":`复制失败,请重试或手动选择文字。`,"chatMessage.moreReplyActions":`更多回复操作`,"focusSession.preparingAttachments":`正在准备附件`,"focusSession.stopping":`正在停止`,"focusSession.waitingForModel":`正在切换模型,请稍候`,"focusSession.returnToLatest":`返回最新消息`,"agentJob.title":`派了:{task}`,"agentJob.command":`后台命令:{command}`,"agentJob.queued":`排队中`,"agentJob.running":`在做`,"agentJob.completed":`做完了`,"agentJob.failed":`没做成`,"agentJob.interrupted":`停下了`,"agentJob.stop":`停下`,"agentJob.expand":`展开这件活`,"agentJob.collapse":`收起`,"agentJob.model":`模型 {model}`,"agentJob.tools":`{count} 个操作`,"botLink.waiting":`在等回话`,"botLink.answered":`回话了`,"botLink.stoppedHops":`来回太多次,停在这里了`,"botLink.stoppedRate":`发得太频繁,停在这里了`,"sessionMenu.rename":`重命名`,"sessionMenu.compactContext":`压缩上下文`,"sessionMenu.workflowRuns":`工作流记录`,"sessionMenu.voiceMode":`语音对话`,"planBoard.paused":`已暂停`,"planBoard.countPaused":`{count} 已暂停`},Ae={"unsaved.title":`放弃更改?`,"unsaved.description":`尚未保存的更改将丢失。`,"unsaved.keepEditing":`继续编辑`,"unsaved.discard":`放弃`,"unsaved.saving":`正在保存更改,请在保存完成后再次选择目标。`,"app.dragTabsOrSplitChatsInAnyDirectionFromTheSessionList":`拖动标签,或向左、右、上、下拆分会话`,"app.sessions":`会话`,"app.wakingPisper":`正在唤醒 Pisper…`,"markdownMessage.copied":`已复制`,"markdownMessage.copy":`复制`,"markdownMessage.copyCode":`复制代码`,"markdownMessage.revealLocalPath":`在文件管理器中显示:{path}`,"markdownMessage.revealLocalPathOk":`已请求在文件管理器中显示:{path}`,"markdownMessage.revealLocalPathFailed":`无法在文件管理器中显示:{path}`,"markdownMessage.revealLocalPathUnavailable":`本地文件定位不可用,请在文件所在电脑的桌面应用中重试,或复制路径手动打开。`,"markdownMessage.revealLocalPathTimeout":`文件管理器尚未返回结果,可复制路径手动打开。`,"markdownMessage.copyPath":`复制路径`,"markdownMessage.copyPathFailed":`无法复制路径,请手动选择并复制。`,"ui.actionFailed":`操作失败,请重试。`,"ui.cancel":`取消`,"ui.closeDialog":`关闭对话框`,"ui.notifications":`通知`,"ui.confirm":`确认`,"ui.name":`名称`,"useAppDialog.confirm":`确认`,"useAppDialog.confirmAction":`确认操作`,"useAppDialog.enterContent":`输入内容`,"useAppDialog.save":`保存`,"workspacePicker.enterAbsolutePath":`输入工作目录的绝对路径`,"workspacePicker.importFolderCopy":`从手机选择文件夹并导入副本`,"workspacePicker.importingFolder":`正在选择或导入文件夹…`,"workspacePicker.selectDirectoryDescription":`输入 Runtime 所在设备上的工作目录路径;附件通过系统文件选择器添加。`,"workspacePicker.selectWorkspaceForChat":`为“{name}”选择工作目录`,"workspacePicker.selectWorkspaceForSchedule":`选择定时任务运行的工作目录`,"workspacePicker.setWorkingDirectory":`设置工作目录`,"workspacePicker.switching":`正在切换…`,"workspacePicker.systemPickerUnavailable":`此设备无法打开系统文件管理器,请直接输入路径。`,"workspacePicker.useThisFolder":`使用此目录`,"workspacePicker.workingDirectoryPath":`工作目录路径`,"webPreview.embedNotice":`部分网站会阻止嵌入式预览。如果页面无法加载,请使用“在浏览器中打开”。`,"webPreview.openExternal":`在浏览器中打开`,"webPreview.title":`网页预览`,"webPreview.url":`预览地址`,"webPreview.urlPlaceholder":`输入网址…`,"api.invalidResponse":`服务器响应格式异常,请稍后重试。`,"pageTemplate.loading":`正在加载…`,"pageTemplate.retry":`重试`,"statusGlyph.attention":`需要你`,"statusGlyph.run":`运行中`,"statusGlyph.queued":`排队`,"statusGlyph.done":`已完成`,"statusGlyph.failed":`失败 · 已查看`,"statusGlyph.stopped":`已停止`},je={"modelOnboarding.eyebrow":`开始使用 Pisper`,"modelOnboarding.title":`先连接一个模型`,"modelOnboarding.description":`连接后就能开始对话、调用工具和执行任务。你可以现在设置,也可以先逛一逛。`,"modelOnboarding.connectionTitle":`准备模型服务`,"modelOnboarding.connectionDescription":`填写模型服务地址,可以使用云端服务,也可以连接内网中的兼容接口。`,"modelOnboarding.modelTitle":`完成认证并选择模型`,"modelOnboarding.modelDescription":`粘贴 API Key,获取模型列表后选择默认对话模型。`,"modelOnboarding.findExisting":`查找本地配置`,"modelOnboarding.later":`稍后再说`,"modelOnboarding.openSettings":`设置模型`,"notificationSettings.feishu":`飞书`,"notificationSettings.weChat":`微信`,"notificationSettings.qq":`QQ`,"notificationSettings.telegram":`Telegram`,"notificationSettings.browserNotification":`通知`,"notificationSettings.chatCompleted":`对话完成`,"notificationSettings.chatCompletedDescription":`Agent 完成回复后发送`,"notificationSettings.chatWaiting":`等待用户确认`,"notificationSettings.chatWaitingDescription":`Agent 暂停运行并等待用户确认时发送`,"notificationSettings.confirmationIsRequired":`需要确认后才能执行此操作。`,"notificationSettings.scheduleCompleted":`定时任务完成`,"notificationSettings.scheduleCompletedDescription":`定时任务正常完成后发送`,"notificationSettings.scheduleFailed":`定时任务失败`,"notificationSettings.scheduleFailedDescription":`定时任务执行失败后发送`,"notificationSettings.workflowCompleted":`工作流完成`,"notificationSettings.workflowCompletedDescription":`工作流所有节点执行完成后发送`,"notificationSettings.workflowFailed":`工作流失败`,"notificationSettings.workflowFailedDescription":`工作流中断或节点失败后发送`,"settingsShell.settingsNavigation":`设置导航`,"settingsShell.back":`返回`,"settingsShell.featuresHint":`插件、MCP、技能等在“功能”里`,"settingsShell.section.models":`模型`,"settingsShell.section.interface":`界面`,"settingsShell.section.notifications":`通知`,"settingsShell.section.shortcuts":`快捷键`,"settingsShell.section.updates":`更新`,"settingsShell.section.labs":`实验功能`,"settingsShell.section.about":`关于`,"settingsShell.lede.models":`新会话的默认模型与模型提供方。每个会话仍可在输入框里单独切换模型与思考强度。`,"settingsShell.lede.interface":`主题、强调色、语言、密度、圆角、动效与字号。`,"settingsShell.lede.notifications":`代理完成、等你确认或失败时,用哪些方式提醒你。`,"settingsShell.lede.shortcuts":`查看并自定义键盘快捷键。`,"settingsShell.lede.updates":`检查、下载并安装 Pisper 的新版本。`,"settingsShell.lede.labs":`抢先试用还在开发中的功能。`,"settingsShell.lede.about":`版本、源代码与开源许可证。`,"aboutSettings.copyright":`Pisper Contributors · MIT License`,"aboutSettings.description":`桌面、终端与移动端的多 Agent 应用。`,"aboutSettings.license":`开源许可证`,"aboutSettings.openLinkFailed":`无法在浏览器中打开链接,请稍后重试。`,"aboutSettings.projectInformation":`项目信息`,"aboutSettings.sourceCode":`源代码`,"aboutSettings.starOnGitHub":`在 GitHub 上支持 Pisper`,"aboutSettings.supportDescription":`如果 Pisper 对你有帮助,欢迎在 GitHub 上留下 Star,帮助更多人发现这个项目。`,"aboutSettings.supportPisper":`支持 Pisper`,"configPage.addProvider":`添加 Provider`,"configPage.addProviderConnection":`添加 Provider 连接`,"configPage.editProviderConnection":`编辑 Provider 连接`,"configPage.updateProviderKeyURLAndModelSettings":`更新此连接使用的 Key、地址或模型。`,"configPage.agentRuntimePolicy":`Agent 运行策略`,"configPage.apiKeyRequired":`需要 API Key`,"configPage.apiKey":`API Key`,"configPage.leaveBlankToKeepExistingKey":`留空保留已保存的 Key`,"configPage.leaveBlankToCopySourceKey":`留空复制来源 Key`,"configPage.cloneProvider":`克隆 Provider`,"configPage.clonedProviderName":`{name}(副本)`,"configPage.providerDefaultModel":`Provider 默认模型`,"configPage.selectModel":`选择模型`,"configPage.defaultProviderUpdated":`已将 {name} 设为默认 Provider`,"configPage.providerEnabled":`启用 {name}`,"configPage.apiProtocol":`API 协议`,"configPage.about":`关于`,"configPage.appUpdates":`应用更新`,"configPage.labs":`实验功能`,"configPage.authenticationIncludedInConfiguration":`配置中包含认证`,"configPage.authenticationReady":`认证可用`,"configPage.authenticationRequired":`需重新认证`,"configPage.availableTools":`可用工具`,"configPage.cancel":`取消`,"configPage.cannotLoad":`不可加载`,"configPage.chat":`对话`,"configPage.chatProvider":`对话 Provider`,"configPage.closeDialog":`关闭对话框`,"configPage.codexCLILoginRequired":`需要 Codex CLI 登录`,"configPage.configurationFileIsTooLarge":`配置文件过大`,"configPage.conflictDetected":`存在冲突`,"configPage.countModels":`{count} 个模型`,"configPage.createConnection":`创建连接`,"configPage.saveChanges":`保存修改`,"configPage.customManageEachToolOnThePluginsPage":`自定义:在插件页逐项管理`,"configPage.delete":`删除`,"configPage.deleteNameItsModelSettingsAndAuthenticationDetailsWillAlsoBeRemoved":`确定删除「{name}」吗?对应的模型配置和认证信息也会删除。`,"configPage.deleteProvider":`删除 Provider`,"configPage.deleteProviderConnection":`删除 Provider 连接`,"configPage.disabled":`停用`,"configPage.disabled2":`已停用`,"configPage.desktopPet":`桌面宠物`,"configPage.displayName":`显示名称`,"configPage.enableAfterCreation":`创建后启用`,"configPage.enabled":`启用`,"configPage.enterTheAPIKeyForThisConnection":`输入此连接使用的 API Key`,"configPage.enterTheProviderAPIKey":`输入 Provider API Key`,"configPage.fetching":`获取中…`,"configPage.fetchModels":`获取模型`,"configPage.fetchOrAddAChatModel":`请获取或添加一个对话模型。`,"configPage.forExampleOpenAIOfficial":`例如 OpenAI 官方`,"configPage.fullToolAccess":`全部内置工具(含 Shell)`,"configPage.image":`图像`,"configPage.imageGenerationAndEditing":`图像生成与编辑`,"configPage.initialModelID":`初始模型 ID`,"configPage.incompleteLoginState":`登录状态不完整,请在对应官方客户端重新登录`,"configPage.interface":`界面设置`,"configPage.shortcuts":`快捷键`,"shortcuts.commandPalette":`命令面板`,"shortcuts.primaryAction":`新任务`,"shortcuts.toggleSidebar":`收起 / 展开侧栏`,"shortcuts.toggleTerminal":`显示 / 隐藏终端`,"shortcuts.openSettings":`打开设置`,"shortcuts.focusComposer":`聚焦聊天输入框`,"shortcuts.voiceInput":`语音输入(按住说话)`,"shortcuts.edit":`修改「{action}」快捷键`,"shortcuts.disable":`禁用「{action}」快捷键`,"shortcuts.reset":`恢复「{action}」默认快捷键`,"shortcuts.resetAll":`恢复默认`,"shortcuts.resetConfirm":`所有快捷键将恢复默认设置,是否继续?`,"shortcuts.recording":`等待按键…`,"shortcuts.disabled":`未绑定`,"shortcuts.conflict":`与「{action}」的快捷键冲突。`,"shortcuts.invalid":`此按键组合不可用,或已保留给系统和文本编辑。`,"shortcuts.saveFailed":`保存失败:当前设备存储不可用。`,"shortcuts.saved":`已保存到当前设备`,"shortcuts.deviceScope":`当前设备 · 应用内快捷键`,"shortcuts.options":`「{action}」选项`,"shortcuts.disableKey":`禁用快捷键`,"configPage.invalidConfigurationFileFormat":`配置文件格式无效`,"configPage.keyVariableName":`密钥变量:{name}`,"configPage.leaveBlankToUseTheModelID":`留空使用模型 ID`,"configPage.loadConfiguration":`加载配置`,"configPage.loadLoginState":`加载登录状态`,"configPage.loadOfficialProviderLoginStateFromSource":`从 {source} 加载登录状态?该状态只会绑定官方 Provider,不会用于自定义 Base URL。`,"configPage.loaded":`已加载`,"configPage.loading":`加载中…`,"configPage.loadingModelCatalog":`正在加载模型目录`,"configPage.loadProviderConfiguration":`加载 Provider 配置`,"configPage.loadThisProviderConfigurationFromSource":`从 {source} 加载此 Provider 配置?`,"configPage.localProviderConfiguration":`本机 Provider 配置`,"configPage.modelName":`模型名称`,"configPage.models":`模型配置`,"configPage.modelType":`模型用途`,"configPage.multipleAuthenticationFieldsWereDetectedTheAuthorizationFieldTakesPrecedence":`检测到多个认证字段,将优先使用授权字段`,"configPage.nameConfigurationHasBeenLoadedIntoPisper":`{name} 配置已加载到 Pisper`,"configPage.nameLoginStateHasBeenLoadedIntoPisper":`{name} 登录状态已加载到 Pisper`,"configPage.nameState":`{name} 已{state}`,"configPage.noAuthenticationInConfiguration":`配置中未包含认证`,"configPage.noBaseURLSpecified":`未指定 Base URL`,"configPage.noImportableCodexOrClaudeProviderConfigurationWasDetected":`未检测到可导入的 Codex 或 Claude Provider 配置。`,"configPage.noImportableProviderConfigurationWasFound":`未找到可导入的 Provider 配置`,"configPage.noModelSpecified":`未指定模型`,"configPage.notifications":`通知设置`,"configPage.remoteAccess":`远程访问`,"configPage.mobileServer":`服务器`,"mobileServer.addServer":`添加服务器`,"mobileServer.awaitingApproval":`已向“{name}”发送连接申请,请在桌面端批准。`,"mobileServer.cameraDenied":`相机权限未授予,请在系统设置中授权后重试。`,"mobileServer.cancelRequest":`取消申请`,"mobileServer.cancelScan":`取消扫描`,"mobileServer.connect":`连接`,"mobileServer.current":`当前连接`,"mobileServer.currentLocal":`当前运行`,"mobileServer.description":`选择要连接的桌面端。会话与数据都保存在桌面端,手机作为客户端接入。`,"mobileServer.discoverDescription":`选择同一局域网内发现的桌面端并等待对方批准,或使用二维码远程配对。`,"mobileServer.discovering":`正在搜索同一局域网内的 Pisper Desktop…`,"mobileServer.discoveryFailed":`局域网发现不可用,请重试或使用二维码配对。`,"mobileServer.localNetworkDenied":`需要允许本地网络访问才能发现桌面端,请在系统设置中授权后重试。`,"mobileServer.empty":`还没有已配对的服务器。点击「添加服务器」开始连接。`,"mobileServer.forget":`删除`,"mobileServer.forgetConfirm":`删除后需要重新配对才能连接该服务器,确定删除?`,"mobileServer.loadFailed":`读取服务器列表失败,请重启应用后重试。`,"mobileServer.localTitle":`本机运行`,"mobileServer.localDescription":`不连接桌面端,直接运行与桌面端同源的 Pisper Runtime;可用能力由当前设备环境决定。`,"mobileServer.enterLocal":`在本机运行`,"mobileServer.nearby":`附近的桌面端`,"mobileServer.noNearby":`未发现可连接的桌面端,请确认电脑已开启远程访问。`,"mobileServer.otherMethods":`其他连接方式`,"mobileServer.pairFailed":`配对成功,但服务器代理地址不可用。`,"mobileServer.scan":`扫描二维码`,"mobileServer.scanFailed":`未读取到有效的配对二维码。`,"mobileServer.scanHint":`将桌面端二维码置于框内,系统会自动识别,无需拍照。`,"mobileServer.scanTitle":`扫描配对二维码`,"mobileServer.rediscover":`重新搜索局域网设备`,"mobileServer.requestConnect":`申请连接`,"mobileServer.activeTransport":`当前路径:{transport}`,"mobileServer.transportLan":`局域网`,"mobileServer.transportLanP2p":`局域网 + P2P`,"mobileServer.transportP2p":`P2P`,"mobileServer.title":`服务器`,"remoteAccess.approvalFailed":`处理连接申请失败:{message}`,"remoteAccess.approve":`批准`,"remoteAccess.codeExpiresAt":`配对码 {time}过期`,"remoteAccess.currentDevice":`(当前设备)`,"remoteAccess.description":`让手机或平板连接到这台电脑上的 Pisper。优先使用局域网,离开局域网后自动回退到 Iroh P2P;上层仍由 TLS 指纹和设备令牌保护。`,"remoteAccess.devices":`已配对设备`,"remoteAccess.firewallTitle":`系统防火墙`,"remoteAccess.firewallDisabled":`远程访问已关闭,Pisper 管理的规则已清理。`,"remoteAccess.firewallConfigured":`上次检查时,Pisper 防火墙策略已配置。`,"remoteAccess.firewallNotNeeded":`检测到系统防火墙未启用,无需添加放行策略。`,"remoteAccess.firewallNeedsAuthorization":`尚未确认放行策略,请在本机点击重试并完成系统授权。`,"remoteAccess.firewallUnsupported":`当前环境无法自动配置防火墙。`,"remoteAccess.firewallCancelled":`系统授权已取消,尚未确认放行。`,"remoteAccess.firewallError":`防火墙配置未完成。`,"remoteAccess.firewallCleanupPending":`远程监听已停止,但防火墙规则尚未完全清理。请重试清理。`,"remoteAccess.firewallPackagedApp":`macOS 需要打包的 Pisper App 才能授权专用 sidecar。不会对通用 Node.js 进程放行。`,"remoteAccess.firewallUnsupportedBackend":`未检测到可用的系统防火墙管理工具。Linux 自动配置支持 UFW 和运行中的 firewalld。`,"remoteAccess.firewallPermissionDenied":`未取得足够的系统权限;策略是否生效尚未确认。`,"remoteAccess.firewallTimeout":`系统授权或操作超时。操作可能尚未结束,请稍后重试检查。`,"remoteAccess.firewallBlockAll":`macOS 已启用“阻止所有传入连接”。Pisper 不会修改这项全局设置。`,"remoteAccess.firewallRuleChanged":`HTTPS 端口、运行时路径或网络区域已变化,需要更新旧规则。`,"remoteAccess.firewallVerificationFailed":`无法验证系统策略。请重试,并检查系统权限或组织管理策略。`,"remoteAccess.firewallRetry":`检查并重试授权`,"remoteAccess.firewallRetryCleanup":`授权清理规则`,"remoteAccess.firewallRetryFailed":`防火墙操作失败:{message}`,"remoteAccess.firewallWorking":`正在检查或等待系统授权…`,"remoteAccess.firewallApplicationScope":`macOS 按应用授权:仅允许打包的 Pisper sidecar 接收连接。此系统策略无法限定到单个端口。`,"remoteAccess.firewallProgramPortScope":`Windows 规则仅允许当前运行时程序的 HTTPS TCP {port} 端口,来源限定为本地子网(含 LAN IPv4/IPv6)。不会额外放行 Tailscale 地址段。`,"remoteAccess.firewallPortScope":`Linux 规则仅放行远程 HTTPS TCP {port} 端口,不改变防火墙全局开关。`,"remoteAccess.firewallReachability":`本机监听或规则配置成功不代表手机已能连通。LAN 可达性尚未验证,仍取决于网络隔离、其他防火墙及手机权限。`,"remoteAccess.firewallCheckedAt":`上次检查:{time}`,"remoteAccess.generateQr":`生成配对二维码`,"remoteAccess.generatingQr":`正在生成…`,"remoteAccess.lastSeen":`最近活跃:{time}`,"remoteAccess.listenFailed":`远程监听启动失败:{message}`,"remoteAccess.loadFailed":`远程访问状态加载失败,请确认运行时支持远程访问。`,"remoteAccess.noDevices":`还没有已配对的设备。生成配对二维码,在手机上打开 Pisper App 扫码即可配对。`,"remoteAccess.pairing":`设备配对`,"remoteAccess.pairingDescription":`点击按钮后会打开配对二维码。配对码 5 分钟内有效且仅可使用一次。`,"remoteAccess.pairingFailed":`生成配对码失败:{message}`,"remoteAccess.pairingQrTitle":`使用 Pisper App 扫码配对`,"remoteAccess.pendingApprovals":`待审批连接`,"remoteAccess.pendingApprovalsDescription":`仅批准你正在连接的设备。批准前,对方无法访问会话或 Runtime API。`,"remoteAccess.qrAlt":`配对二维码`,"remoteAccess.qrUnavailable":`二维码生成失败,请重新生成或重启桌面端 Runtime。`,"remoteAccess.scanQrDescription":`在手机端打开“添加服务器”,扫描下方二维码。连接时优先使用局域网,失败后自动回退到 Iroh P2P。`,"remoteAccess.regenerate":`重新生成`,"remoteAccess.refresh":`刷新`,"remoteAccess.reject":`拒绝`,"remoteAccess.requestedAt":`申请于 {time}`,"remoteAccess.requestSource":`来源地址:{ip}`,"remoteAccess.revoke":`吊销`,"remoteAccess.revokeConfirm":`吊销后设备「{name}」将立即断开连接,确定吊销?`,"remoteAccess.revokeFailed":`吊销失败:{message}`,"remoteAccess.title":`远程访问`,"remoteAccess.toggleFailed":`切换远程访问失败:{message}`,"configPage.loginStateFileDetected":`已验证 OAuth 登录状态`,"configPage.officialEndpointOnly":`仅限官方端点`,"configPage.officialProviderAuthenticationOnly":`官方 Provider 认证`,"configPage.optionalUsedOnlyForOpenAIOrganization":`可选,仅 OpenAI Organization 使用`,"configPage.providerConnectionCreated":`Provider 连接已创建`,"configPage.providerConnectionUpdated":`Provider 连接已更新`,"configPage.providerConnectionDeleted":`Provider 连接已删除`,"configPage.providerPurpose":`Provider 用途`,"configPage.readingProvidersAndAuthenticationStatus":`读取 Provider 与认证状态…`,"configPage.readProviderEndpointModelAndAuthenticationFieldsFromCodexConfigTomlAndClaudeSettingsJson":`读取本机 Provider 配置,并由你明确导入官方 Codex 或 Claude 登录状态。`,"configPage.rescan":`重新扫描`,"configPage.setAsDefaultProvider":`设为默认 Provider`,"configPage.saving":`保存中…`,"configPage.scanningProviderConfigurationFiles":`正在扫描 Provider 配置文件…`,"configPage.someConfigurationFieldsCannotBeImported":`部分配置字段无法导入`,"configPage.theAPIProtocolInThisConfigurationIsNotSupportedYet":`配置中的 API 协议暂不支持`,"configPage.theKeyEnvironmentVariableNameIsInvalid":`密钥环境变量名称无效`,"configPage.theProviderEndpointIsInvalid":`Provider 地址无效`,"configPage.thinkingLevel":`思考强度`,"configPage.modelThinkingLevels":`模型支持的思考等级`,"configPage.modelThinkingLevelsHint":`勾选该模型实际支持的等级;未勾选的等级会在对话输入框的思考下拉中隐藏。本地模型(llama.cpp / LM Studio 等)请按其 chat template 支持的档位选择。`,"configPage.unableToReadTheConfigurationFile":`无法读取配置文件`,"configPage.unsavedChanges":`有未保存的配置`,"configPage.video":`视频`,"configPage.videoGeneration":`视频生成`,"configPage.visualModels":`视觉模型`,"configPage.visualModelsAreSelectedByTheVisualGenerationToolAndDoNotAppearInTheChatModelList":`视觉模型由视觉生成工具自动选择,不会进入对话模型列表`,"configPage.visualProvider":`视觉 Provider`,"configPage.youCanCreateMultipleConnectionsUsingTheSameProtocolEachWithItsOwnKeyAndBaseURL":`同一种协议可创建多个连接,每个连接独立使用 Key 和 Base URL。`,"interfaceSettings.accentBlue":`Pisper 蓝`,"interfaceSettings.accentColor":`强调色`,"interfaceSettings.accentCoral":`珊瑚红`,"interfaceSettings.accentCustom":`自定义`,"interfaceSettings.customAccentColor":`自定义强调色`,"interfaceSettings.customAccentHex":`输入 HEX 颜色`,"interfaceSettings.invalidAccentColor":`请输入 6 位 HEX 颜色(如 #1677e8)`,"interfaceSettings.accentNeutral":`石墨`,"interfaceSettings.accentTeal":`青绿色`,"interfaceSettings.accentViolet":`紫罗兰`,"interfaceSettings.advanced":`高级`,"interfaceSettings.visualStyle":`视觉风格`,"interfaceSettings.appearance":`外观`,"interfaceSettings.appearanceDescription":`选择界面的明暗模式、强调色和视觉风格。`,"interfaceSettings.automaticByTime":`按时间自动`,"interfaceSettings.automaticByTimeDescription":`18:00 至次日 8:00 使用深色`,"interfaceSettings.colorMode":`颜色模式`,"interfaceSettings.comfortable":`舒适`,"interfaceSettings.comfortableDescription":`保留宽松的间距与尺寸`,"interfaceSettings.compact":`紧凑`,"interfaceSettings.compactDescription":`在同屏显示更多内容`,"interfaceSettings.cornerStyle":`圆角风格`,"interfaceSettings.dark":`深色`,"interfaceSettings.darkDescription":`始终使用低亮度深色界面`,"interfaceSettings.defaultsRestored":`界面设置已恢复默认值`,"interfaceSettings.displayAndMotion":`显示与动效`,"interfaceSettings.followSystem":`跟随系统`,"interfaceSettings.followSystemDescription":`随操作系统明暗模式切换`,"interfaceSettings.interfaceDensity":`界面密度`,"interfaceSettings.interfaceStyle":`界面风格`,"interfaceSettings.light":`浅色`,"interfaceSettings.lightDescription":`始终使用明亮的浅色界面`,"interfaceSettings.motion":`界面动效`,"interfaceSettings.pinInspector":`固定检查器`,"interfaceSettings.pinInspectorDescription":`常驻会话页右侧;关闭时按需滑入。`,"interfaceSettings.motionFull":`完整`,"interfaceSettings.motionFullDescription":`保留全部过渡与反馈`,"interfaceSettings.motionReduced":`减少`,"interfaceSettings.motionReducedDescription":`减少非必要的移动效果`,"interfaceSettings.motionSystem":`跟随系统`,"interfaceSettings.motionSystemDescription":`采用系统的动态效果偏好`,"interfaceSettings.preferencesUpdated":`界面偏好已更新`,"interfaceSettings.restoreDefaults":`恢复默认`,"interfaceSettings.sharp":`利落`,"interfaceSettings.soft":`柔和`,"interfaceSettings.standard":`标准`,"languageSettings.interfaceOnlyHint":`仅影响界面,不改变 Agent 回复语言。`,"languageSettings.displayLanguage":`界面语言`,"languageSettings.displayLanguageChangedToEnglish":`界面语言已切换为英文`,"languageSettings.displayLanguageChangedToSimplifiedChinese":`界面语言已切换为简体中文`,"languageSettings.english":`English`,"languageSettings.simplifiedChinese":`简体中文`,"cliSettings.checking":`正在检查`,"cliSettings.commandNotInstalled":`终端命令 {command} 尚未安装`,"cliSettings.commandReady":`终端命令 {command} 已可用`,"cliSettings.description":`安装 Pisper 终端客户端并配置当前用户的 PATH,无需管理员权限。`,"cliSettings.install":`安装终端命令`,"cliSettings.installed":`已安装`,"cliSettings.installedNotification":`Pisper 终端命令已安装;重启终端宿主后生效`,"cliSettings.needsRepair":`需要修复`,"cliSettings.notInstalled":`未安装`,"cliSettings.pathConfigured":`已写入当前用户 PATH。`,"cliSettings.pathNeedsRepair":`PATH 配置不完整,请修复安装。`,"cliSettings.repair":`修复终端命令`,"cliSettings.restartTerminal":`安装或卸载后需重启终端宿主以读取最新 PATH。Windows Terminal 请完全退出后重开;IDE 内置终端需重启 IDE。`,"cliSettings.title":`Pisper 终端命令`,"cliSettings.unavailable":`当前构建不可用`,"cliSettings.uninstall":`卸载终端命令`,"cliSettings.uninstalledNotification":`Pisper 终端命令已卸载`,"notificationSettings.appNotificationTest":`{app} 通知测试`,"notificationSettings.availableVariables":`可用变量`,"notificationSettings.browserFailedToStart":`浏览器启动失败`,"notificationSettings.browserNotificationsAreBlocked":`浏览器通知已关闭`,"notificationSettings.checking":`正在检查`,"notificationSettings.controlledByBrowserSitePermissions":`由浏览器站点权限控制`,"notificationSettings.controlledByOperatingSystemNotificationSettings":`由操作系统通知设置控制`,"notificationSettings.dailyCodeReview":`每日代码巡检`,"notificationSettings.endToEndTests":`端到端测试`,"notificationSettings.fixChannelNotification":`修复渠道通知`,"notificationSettings.found2IssuesToAddressTheReportHasBeenArchived":`发现 2 个待处理问题,报告已归档。`,"notificationSettings.implementationIsCompleteTestsAndBuildHavePassed":`实现已完成,测试和构建均已通过。`,"notificationSettings.loadingNotificationSettings":`正在加载通知设置`,"notificationSettings.message2Min18Sec":`2 分 18 秒`,"notificationSettings.message6Min42Sec":`6 分 42 秒`,"notificationSettings.messageContent":`消息内容`,"notificationSettings.notificationPermissionWasNotGrantedAllowNotificationsInTheBrowserSiteSettings":`通知权限未授权,请在浏览器站点设置中允许通知`,"notificationSettings.notificationsAreWorking":`通知工作正常。`,"notificationSettings.notificationTemplates":`通知模板`,"notificationSettings.notificationTemplateSaved":`通知模板已保存`,"notificationSettings.notSupported":`当前环境不支持`,"notificationSettings.openNotificationPermissionsInYourOperatingSystemSettings":`请在操作系统设置中打开通知权限。`,"notificationSettings.openSystemNotificationSettings":`打开系统通知设置`,"notificationSettings.permissionGranted":`权限已允许`,"notificationSettings.preReleaseChecks":`发布前检查`,"notificationSettings.preview":`预览`,"notificationSettings.saveTemplate":`保存模板`,"notificationSettings.sendTest":`测试发送`,"notificationSettings.sendTestNotification":`发送测试通知`,"notificationSettings.systemNotificationsAreNotSupportedInThisEnvironment":`当前环境不支持系统通知`,"notificationSettings.systemNotificationsAreOff":`系统通知已关闭`,"notificationSettings.systemNotificationsAreOffAllowPisperToSendNotificationsInYourOperatingSystemSettings":`系统通知已关闭,请在操作系统设置中允许 Pisper 发送通知。`,"notificationSettings.testNotificationSentToCountChats":`测试通知已发送到 {count} 个会话`,"notificationSettings.testProcessTimedOut":`测试进程超时`,"notificationSettings.testsBuildAndSecurityChecksHaveAllPassed":`测试、构建和安全检查均已通过。`,"notificationSettings.theBrowserBackgroundNotificationServiceCouldNotBeRegistered":`浏览器后台通知服务注册失败`,"notificationSettings.theDesktopAppUsesOperatingSystemNotificationsTurningThisOffDoesNotChangeTheOperatingSystemPermis":`桌面端使用操作系统通知;关闭开关不会修改系统自身的通知权限。`,"notificationSettings.theOperatingSystemDidNotAcceptTheNotificationCheckYourSystemNotificationSettings":`系统没有接受通知请求,请检查操作系统通知设置。`,"notificationSettings.theTestNotificationWasSentCheckYourSystemNotificationCenter":`测试通知已发送,请检查系统通知中心。`,"notificationSettings.theWebAppUsesBrowserSiteNotificationsTurningThisOffDoesNotChangeTheBrowserPermissionItself":`Web 端使用浏览器站点通知;关闭开关不会修改浏览器自身的站点权限。`,"notificationSettings.tomorrow0900":`明天 09:00`,"notificationSettings.pisperUsesTheCurrentPlatformNotificationSystemWhenAnAgentCompletesOrFails":`Agent 完成或失败时,Pisper 会通过当前平台的系统通知提醒你。`,"notificationSettings.waitingForPermission":`等待授权`,"updateSettings.browserMode":`浏览器模式`,"updateSettings.checkFailed":`检查失败`,"updateSettings.checkForUpdates":`检查更新`,"updateSettings.checking":`正在检查`,"updateSettings.checking2":`正在检查…`,"updateSettings.commitsThatHaveNotBeenSyncedWillAppearHereAfterTheCheck":`检查后将在这里显示尚未同步的提交。`,"updateSettings.commitsToSync":`待同步提交`,"updateSettings.currentReleaseNotes":`当前版本更新日志`,"updateSettings.currentSource":`当前源码`,"updateSettings.currentSourceStatus":`当前源码状态`,"updateSettings.currentVersion":`当前版本`,"updateSettings.downloadedDataWasPreservedAndCanResumeFromTheInterruptionPoint":`下载进度已保留,可从断点继续。`,"updateSettings.downloading":`正在下载`,"updateSettings.downloadPaused":`下载已暂停`,"desktopPetSettings.browsePetdex":`浏览 Petdex 宠物库`,"desktopPetSettings.bubbleDone":`完成啦!`,"desktopPetSettings.bubbleFailed":`遇到问题了`,"desktopPetSettings.bubbleHello":`你好!`,"desktopPetSettings.bubbleResponding":`正在回复…`,"desktopPetSettings.bubbleThinking":`正在思考…`,"desktopPetSettings.bubbleWorking":`正在工作…`,"desktopPetSettings.currentPet":`当前宠物:{name}`,"desktopPetSettings.delete":`删除宠物`,"desktopPetSettings.deleteConfirm":`确定删除「{name}」吗?本地宠物资源将被移除。`,"desktopPetSettings.deleteTitle":`删除桌面宠物`,"desktopPetSettings.description":`这是 Pisper 内建的桌面宠物功能。桌面端显示独立宠物窗口,Web 端在 Pisper 页面内悬浮,并直接响应当前 Agent 的活动。`,"desktopPetSettings.desktopOnly":`桌面端专属功能`,"desktopPetSettings.desktopOnlyDescription":`桌面宠物仅在 Pisper 桌面应用中可用。`,"desktopPetSettings.install":`安装`,"desktopPetSettings.installed":`已安装`,"desktopPetSettings.installBeforeEnabling":`先从 Petdex 安装一只宠物,再启用桌面显示。`,"desktopPetSettings.installDescription":`搜索 Petdex 宠物,由 Pisper 安装并管理资源,无需 Petdex CLI 或独立桌面程序。`,"desktopPetSettings.installedDescription":`选择 Pisper 桌面上显示的宠物。兼容已有 Petdex/Codex 宠物目录。`,"desktopPetSettings.installedTitle":`已安装的宠物`,"desktopPetSettings.installTitle":`从 Petdex 添加宠物`,"desktopPetSettings.loading":`正在读取桌面宠物状态…`,"desktopPetSettings.opacity":`宠物透明度`,"desktopPetSettings.petDisabled":`桌面宠物已关闭`,"desktopPetSettings.petEnabled":`桌面宠物已启用`,"desktopPetSettings.petInstalled":`已安装并选择 {name}`,"desktopPetSettings.petRemoved":`已删除 {name}`,"desktopPetSettings.petSelected":`已切换到 {name}`,"desktopPetSettings.petSlug":`Petdex 宠物标识`,"desktopPetSettings.running":`显示中`,"desktopPetSettings.search":`搜索`,"desktopPetSettings.searchPlaceholder":`搜索宠物名称或标识,例如 boba`,"desktopPetSettings.showOnDesktop":`在桌面上显示`,"desktopPetSettings.stopped":`已隐藏`,"desktopPetSettings.title":`Pisper 桌面宠物`,"desktopPetSettings.webPetLabel":`Pisper 桌面宠物:{name}`,"updateSettings.appComponents":`应用组件`,"updateSettings.desktopFrontend":`Desktop 前端`,"updateSettings.downloadAndInstallUpdates":`下载并安装更新`,"updateSettings.downloadProgress":`下载进度`,"updateSettings.downloadUpdate":`下载更新`,"updateSettings.installed":`已安装`,"updateSettings.installingUpdates":`正在安装更新…`,"updateSettings.newVersionReleaseNotes":`新版本更新日志`,"updateSettings.noReleaseNotesAreAvailableForThisVersion":`该版本暂未提供更新日志。`,"updateSettings.notChecked":`尚未检查`,"updateSettings.platform":`运行平台`,"updateSettings.readyToRestart":`等待重启安装`,"updateSettings.restartAndInstall":`重启并安装`,"updateSettings.resumeDownload":`继续下载`,"updateSettings.runtime":`Runtime`,"updateSettings.sourceUpdatesAvailable":`发现代码更新`,"updateSettings.theCurrentWebSourceIsSyncedWithBranch":`当前 Web 源码已同步 {branch}。`,"updateSettings.updateAvailable":`发现新版本`,"updateSettings.tuiClient":`TUI 客户端`,"updateSettings.updateChannel":`更新通道`,"updateSettings.upToDate":`已是最新`,"updateSettings.pisperAppUpdates":`Pisper 应用更新`,"updateSettings.viewRelease":`查看新版本`,"updateSettings.viewSourceUpdates":`查看代码更新`,"updateSettings.viewUpdateDiagnosticLog":`查看更新诊断日志`,"configPage.connection":`连接`,"configPage.authentication":`认证`,"configPage.currentChatModel":`默认 Provider 与模型`,"configPage.quickSetup":`快速配置`,"configPage.quickSetupTitle":`快速配置模型`,"configPage.visualQuickSetupTitle":`快速配置视觉模型`,"configPage.visualQuickSetup":`设置视觉模型`,"configPage.quickSetupStepBaseUrl":`填写 Base URL`,"configPage.quickSetupStepProtocol":`选择 API 协议`,"configPage.quickSetupStepModel":`获取并选择模型`,"configPage.quickSetupBaseUrlHint":`填写服务商提供的模型接口地址。系统会在下一步按协议请求模型列表。`,"configPage.providerBaseURLMustBeHTTPOrHTTPS":`Base URL 必须是有效的 HTTP 或 HTTPS 地址。`,"configPage.selectAPIProtocol":`请选择 API 协议。`,"configPage.selectVisualModelToFinish":`选择一个图像或视频模型,保存后 Agent 才能使用视觉生成。`,"configPage.fetchOrAddAVisualModel":`请获取一个图像或视频模型。`,"configPage.stepIndicator":`第 {current} 步 / 共 {total} 步`,"configPage.addCustomConnection":`添加自定义连接`,"configPage.fetchingModels":`正在获取模型…`,"configPage.selectModelToFinish":`Provider 默认对话模型`,"configPage.setupComplete":`Provider 配置已保存`,"configPage.nextStep":`下一步`,"configPage.previousStep":`上一步`,"configPage.visualImageModel":`图像模型`,"configPage.visualVideoModel":`视频模型`,"configPage.testGeneration":`测试生成`,"configPage.testingGeneration":`正在测试生成…`,"configPage.testSucceeded":`测试成功,视觉模型可用`,"configPage.visualEmptyHint":`配置视觉模型后,Agent 就能在对话中生成图片、编辑图片或生成视频。`,"configPage.visualModelUpdated":`视觉模型选择已更新`,"configPage.visualAutoSelected":`自动选中`,"configPage.visualConnections":`视觉连接`,"configPage.visualConnectionsHint":`启停视觉供应商、选择默认模型`,"configPage.currentVisualModel":`当前视觉模型`,"configPage.visualNoneConfigured":`未配置视觉模型`,"configPage.loadingVisualStatus":`正在读取视觉模型状态…`,"configPage.connections":`连接`,"configPage.defaultBadge":`默认`,"configPage.configure":`配置`,"configPage.manualModelId":`模型 ID(手动输入)`,"configPage.manualModelIdHint":`列表中没有需要的模型时,直接输入模型 ID`,"configPage.manualModelIds":`追加模型 ID(可选)`,"configPage.manualModelIdsHint":`输入后点击 + 或按回车追加,可添加多个;保存时随选中模型一并加入该连接`,"configPage.runtimePolicySaved":`运行策略已保存`,"configPage.manageConnections":`连接管理`,"configPage.localProviderImportHint":`发现 {count} 项可导入的本地配置`,"configPage.reviewLocalProviders":`查看`,"configPage.discoverFailedUsingExisting":`在线获取模型列表失败({message}),可直接从已有模型中选择`,"configSearch.placeholder":`搜索设置(模型 / 通知 / theme…)`,"configSearch.placeholderShort":`搜索设置`,"configSearch.noResults":`未找到匹配的设置项`,"providerWorkbench.actions":`连接操作`,"providerWorkbench.models":`模型`,"providerWorkbench.advanced":`更多设置`,"providerWorkbench.advancedHint":`本地配置导入与图片 / 视频模型`,"providerWorkbench.modelOptions":`模型能力与追加模型`,"interfaceSettings.uiFontSize":`界面字号`,"interfaceSettings.codeFontSize":`代码字号`,"interfaceSettings.numericFontHint":`界面和代码分别调整;聊天正文与图标保持各自的尺寸。`,"interfaceSettings.invalidFontSize":`请输入 {min}–{max} 之间的整数。`,"providerWorkbench.noConnections":`尚未添加供应商`,"providerWorkbench.default":`默认`,"providerWorkbench.addConnectionHint":`点“快速设置”或下面的“添加提供方”,按步骤填写接口地址、协议和密钥并选择模型。`,"providerWorkbench.scanningLocal":`正在接入本机 Claude Code / Codex 配置…`,"providerWorkbench.localImportStatus":`本地配置自动接入 · 新增 {imported} 项 · 待检查 {skipped} 项`,"providerWorkbench.addConnection":`添加连接`,"providerWorkbench.contextColumn":`上下文`,"providerWorkbench.defaultModel":`默认模型`,"providerWorkbench.defaultModelHint":`新任务草稿与派发对话框使用`,"providerWorkbench.noChatModel":`还没有可用的对话模型`,"providerWorkbench.fallbackModels":`备用模型`,"providerWorkbench.fallbackModelsHint":`主模型重试后仍不可用或额度用尽时,按顺序切换并接着跑`,"providerWorkbench.fallbackNone":`不使用`,"providerWorkbench.fallbackFirst":`第一备用模型`,"providerWorkbench.fallbackSecond":`第二备用模型`,"providerWorkbench.fallbackModelsSaved":`备用模型已保存`,"providerWorkbench.auxiliaryModel":`辅助模型`,"providerWorkbench.auxiliaryModelHint":`生成会话标题、压缩上下文和整理记忆用它;用不了时退回原来的模型`,"providerWorkbench.auxiliaryFollowSession":`不使用(跟随会话模型)`,"providerWorkbench.auxiliaryModelSaved":`辅助模型已保存`,"subagents.title":`子代理`,"subagents.hint":`主 Agent 派子代理时按任务选 fast、standard 或 strong 档位,这里决定每档用哪个模型,选好即生效;没设置的档位跟随当前会话模型。子代理定义里写了模型或档位时以定义为准。`,"subagents.tierFast":`快速`,"subagents.tierFastHint":`检索、整理这类简单任务,用便宜、快的模型`,"subagents.tierStandard":`标准`,"subagents.tierStandardHint":`一般的实现和修改`,"subagents.tierStrong":`强`,"subagents.tierStrongHint":`复杂的设计、排错和审查`,"subagents.followSession":`跟随当前会话模型`,"subagents.tiersSaved":`子代理模型档位已保存`,"subagents.globalDefinitions":`全局子代理定义`,"subagents.definitionsHint":`每个子代理一个 Markdown 文件:全局定义放在数据目录的 agents/ 下,对所有项目生效;项目定义放在项目的 .pisper/agents/ 下,可随仓库提交,同名时覆盖全局定义。`,"subagents.loading":`正在读取子代理定义…`,"subagents.empty":`还没有全局子代理定义。`,"subagents.inheritModel":`跟随会话模型`,"subagents.toolCount":`{count} 个工具`,"permissionRules.title":`权限规则`,"permissionRules.hint":`按命令开头或目录批量允许、按命令开头禁止。允许规则只匹配不含管道、重定向的单条命令,命令守卫标出的危险命令仍需确认;禁止规则在完全访问模式下也生效。`,"permissionRules.loading":`正在读取规则…`,"permissionRules.empty":`还没有规则。审批命令时点“以后都允许”,或在下面添加。`,"permissionRules.allow":`允许`,"permissionRules.deny":`禁止`,"permissionRules.command":`命令`,"permissionRules.files":`文件写入`,"permissionRules.global":`全局`,"permissionRules.remove":`删除规则 {pattern}`,"permissionRules.removed":`规则已删除`,"permissionRules.added":`规则已添加`,"permissionRules.effectLabel":`规则类型`,"permissionRules.toolLabel":`适用于`,"permissionRules.patternLabel":`命令开头或目录`,"permissionRules.commandPlaceholder":`例如 npm test`,"permissionRules.filesPlaceholder":`例如 src(相对工作区)`,"permissionRules.add":`添加`,"providerWorkbench.thinkingHint":`越高越慢;每个会话仍可在输入框里单独切换`,"providerWorkbench.toolsHint":`权限由 Runtime 执行;现有会话继续运行,新会话使用最新策略`,"providerWorkbench.defaultsNeedProvider":`先添加并启用一个提供方,才能设置这些默认值。`,"providerWorkbench.providers":`提供方`,"providerWorkbench.providersHint":`展开一个提供方,编辑它的连接、密钥与模型;密钥留空会沿用已有配置。`,"providerWorkbench.connected":`已连接`,"providerWorkbench.notConnected":`未连接`,"providerWorkbench.keyConfigured":`API Key 已配置`,"providerWorkbench.toggleProvider":`展开 {name} 的连接与模型`,"providerWorkbench.addProvider":`添加提供方`,"providerWorkbench.addProviderHint":`OpenAI 兼容接口等,按快速设置的步骤填写`,"providerWorkbench.loadFailed":`模型配置读取失败`,"remoteWorkspace.title":`连接到 Linux 工作区`,"interfaceSettings.accentDescription":`用于主按钮、活动标记、交互链接和键盘焦点;状态颜色保持不变。`,"interfaceSettings.colorSpectrum":`强调色饱和度和亮度`,"interfaceSettings.colorHue":`强调色色相`,"interfaceSettings.colorSpectrumHint":`左右键调整饱和度,上下键调整亮度。也可输入完整 HEX。`,"notificationSettings.notificationCategories":`通知类别`,"notificationSettings.channelPreferenceHint":`选择各事件的通知渠道。订阅偏好不会连接机器人,也不会改变系统权限。`,"notificationSettings.editNotificationTemplates":`编辑通知模板`,"notificationSettings.backToCategories":`返回通知类别`,"notificationSettings.eventChannels":`{event}:通知渠道`,"notificationSettings.channelsOff":`关闭`,"notificationSettings.enableEvent":`启用此事件`,"notificationSettings.channelNeedsSetup":`需先设置才能投递`,"notificationSettings.channelPreferencesUnsupported":`当前 Runtime 不支持逐事件渠道偏好。仍可设置事件总开关和编辑模板。`,"notificationSettings.noNotificationEvents":`没有可用的通知事件。`,"notificationSettings.notificationEvent":`通知事件`,"notificationSettings.notificationChannel":`通知渠道`,"notificationSettings.saveBeforeTest":`请先保存更改;测试使用已保存的模板。`,"notificationSettings.testUsesSavedTemplate":`测试使用此渠道已保存的模板。`,"notificationSettings.channelTestUnavailable":`此渠道暂时无法测试。请检查全局开关、本机权限和渠道历史会话。`,"notificationSettings.systemNotificationChannel":`系统通知`,"shortcuts.openBoard":`打开全部代理`,"shortcuts.openComponents":`打开组件工作室`,"shortcuts.openMore":`打开功能`,"shortcuts.jumpToAttention":`聚焦等待最久的需要你(再按 A / D 处理,↵ 打开)`,"shortcuts.boardNext":`下一个代理`,"shortcuts.boardPrevious":`上一个代理`,"shortcuts.boardApprove":`允许普通批准(高风险进会话处理)`,"shortcuts.boardDeny":`拒绝`,"shortcuts.boardRetry":`重试失败的任务`,"shortcuts.boardTriage":`逐个处理需要你的事项`,"shortcuts.boardToggleGrouping":`切换按状态 / 按项目(手机)`,"remoteAccess.loading":`正在读取远程访问状态…`,"remoteAccess.thisComputer":`这台电脑`,"remoteAccess.allowConnections":`允许手机连接`,"remoteAccess.stateListening":`正在接受连接`,"remoteAccess.stateStarting":`正在启动`,"remoteAccess.stateOff":`已关闭`,"remoteAccess.stateFailed":`启动失败`,"remoteAccess.firewallChecking":`检查中`,"remoteAccess.firewallNeedsYou":`需要授权`,"remoteAccess.waitingForYou":`等你批准`,"remoteAccess.pairWithPhone":`用手机扫码配对`,"desktopPetSettings.displayTitle":`显示`,"desktopPetSettings.use":`使用`,"desktopPetSettings.inUse":`正在使用`,"deviceFeature.remoteAccessLede":`让手机或平板连接这台电脑上的 Pisper,管理配对的设备与远程工作区。`,"deviceFeature.mobileServerLede":`选择这台手机连接的桌面端,或直接在本机运行。`,"deviceFeature.unavailableTitle":`在这台设备上不可用`,"deviceFeature.unavailable":`不可用`,"deviceFeature.runtimeUnavailable":`当前 Runtime 没有提供这项能力。`,"deviceFeature.mobileOnly":`手机服务器只在 Pisper 手机 App 里可用;桌面端请用“远程访问”让手机连进来。`,"deviceFeature.remoteAccessDesktopOnly":`远程访问只在桌面端可用;手机上请用“服务器”连接桌面端。`,"subagents.configuredSummary":`已设置 {count} 个档位`,"permissionRules.countSummary":`{count} 条`,"permissionRules.noneSummary":`还没有规则`,"notificationSounds.title":`提示音`,"notificationSounds.description":`有事找你、做完或出错时响一声。按设备保存,和系统通知开关互不影响。`,"notificationSounds.enabled":`开启提示音`,"notificationSounds.eventWaiting":`需要你`,"notificationSounds.eventWaitingHint":`等你批准操作或回答问题时`,"notificationSounds.eventFinished":`做完了`,"notificationSounds.eventFinishedHint":`一个会话或 Bot 跑完这一轮时`,"notificationSounds.eventFailed":`出错了`,"notificationSounds.eventFailedHint":`运行失败时`,"notificationSounds.soundNone":`不响`,"notificationSounds.soundChime":`叮咚`,"notificationSounds.soundMarimba":`木琴`,"notificationSounds.soundDrop":`水滴`,"notificationSounds.soundBell":`铃声`,"notificationSounds.soundLow":`低鸣`,"notificationSounds.preview":`试听:{event}`,"notificationSounds.volume":`音量`,"notificationSounds.whileFocused":`Pisper 在前台时也响`,"notificationSounds.whileFocusedHint":`关掉后,只在你没看着 Pisper 时响。`,"configPage.modelThinkingLevelsAutoHint":`不改动时按模型目录判断;目录里没有的模型到“high”为止。`,"providerWorkbench.thinkingUnsupportedByModel":`{level}(默认模型不支持)`},Me={"memoryPage.conceptType":`概念`,"memoryPage.fileType":`文件`,"memoryPage.riskType":`风险`,"memoryPage.preferenceType":`偏好`,"memoryPage.decisionType":`决策`,"memoryPage.factType":`事实`,"memoryPage.taskType":`任务`,"memoryPage.lede":`代理跨会话记住的偏好、决策和事实。直接生效,过时的会自动淘汰;拖动时间轴,看它们如何一步步演变。`,"memoryPage.loadFailed":`记忆读取失败`,"memoryPage.viewsLabel":`记忆视图`,"memoryPage.evolutionView":`演算`,"memoryPage.timelineView":`时间线`,"memoryPage.activityView":`整理记录`,"memoryPage.addMemory":`添加记忆`,"memoryPage.moreActions":`更多操作`,"memoryPage.allSpaces":`全部空间`,"memoryPage.globalMemorySpace":`全局`,"memoryPage.memorySpace":`记忆空间`,"memoryPage.newMemorySpace":`新建记忆空间`,"memoryPage.renameMemorySpace":`重命名记忆空间`,"memoryPage.deleteMemorySpace":`删除记忆空间`,"memoryPage.deleteMemorySpaceNameAndAllMemoriesInIt":`确定删除记忆空间“{name}”吗?里面的记忆会被彻底删除,不能撤销。`,"memoryPage.memorySpaceName":`空间名称`,"memoryPage.memorySpaceCreated":`记忆空间已创建`,"memoryPage.memorySpaceRenamed":`记忆空间已重命名`,"memoryPage.memorySpaceDeleted":`记忆空间已删除`,"memoryPage.memorySpaceHint":`给不同主题或项目各留一个空间,记忆不会混在一起。`,"memoryPage.forExampleProductDesignGuidelines":`例如:产品设计规范`,"memoryPage.exportMarkdown":`导出 Markdown`,"memoryPage.exported":`记忆已导出`,"memoryPage.consolidateNow":`立即整理`,"memoryPage.clearEpisodes":`清除对话原文`,"memoryPage.clearEpisodesConfirm":`清除保存在记忆里的对话原文,用于追溯和后台抽取。已经记下的记忆不受影响,会话本身也不会被删除。此操作不能撤销。`,"memoryPage.clearEpisodesAction":`清除`,"memoryPage.episodesCleared":`已清除 {count} 轮对话原文`,"memoryPage.consolidated":`整理完成`,"memoryPage.nothingToConsolidate":`现在没有需要整理的内容`,"memoryPage.refresh":`刷新`,"memoryPage.loadMore":`加载更多`,"memoryPage.statusFilterLabel":`按状态筛选`,"memoryPage.statusCurrent":`当前`,"memoryPage.statusArchived":`已归档`,"memoryPage.statusHistory":`历史版本`,"memoryPage.groupToday":`今天`,"memoryPage.groupYesterday":`昨天`,"memoryPage.groupThisWeek":`本周`,"memoryPage.groupUnknown":`时间未知`,"memoryPage.searchResults":`相关结果`,"memoryPage.noMemoriesInSpace":`这里还没有记忆。对话里提到的偏好和决定会自动记下来,也可以手动添加。`,"memoryPage.noArchivedMemories":`没有已归档的记忆。`,"memoryPage.noHistoryVersions":`没有被替换的历史版本。`,"memoryPage.noMatchingMemories":`没有匹配的记忆`,"memoryPage.selectAMemoryToViewDetails":`选一条记忆查看证据和版本历史。`,"memoryPage.selectedMemory":`选中的记忆`,"memoryPage.closeDetail":`关闭详情`,"memoryPage.detailLoadFailed":`详情读取失败`,"memoryPage.retry":`重试`,"memoryPage.memoryType":`类型`,"memoryPage.source":`来源`,"memoryPage.evidence":`证据`,"memoryPage.evidenceFrom":`证据来自`,"memoryPage.validFrom":`生效时间`,"memoryPage.validTo":`失效时间`,"memoryPage.stillValid":`至今`,"memoryPage.created":`记录时间`,"memoryPage.confirmCount":`证实次数`,"memoryPage.expires":`到期时间`,"memoryPage.relatedFilePath":`关联文件路径`,"memoryPage.archiveReason":`归档原因`,"memoryPage.versionHistory":`版本历史`,"memoryPage.currentVersion":`当前版本`,"memoryPage.edit":`编辑`,"memoryPage.delete":`删除`,"memoryPage.pin":`钉住`,"memoryPage.unpin":`取消钉住`,"memoryPage.confirmStillValid":`确认仍有效`,"memoryPage.restore":`恢复`,"memoryPage.pinned":`已钉住`,"memoryPage.unpinned":`已取消钉住`,"memoryPage.confirmed":`已确认仍有效`,"memoryPage.restored":`已恢复`,"memoryPage.pinnedBadge":`已钉住`,"memoryPage.staleBadge":`可能过期`,"memoryPage.taintedBadge":`外部来源`,"memoryPage.archivedBadge":`已归档`,"memoryPage.supersededBadge":`已被替换`,"memoryPage.staleHint":`它引用的文件变了,内容可能已经过期。`,"memoryPage.taintedHint":`来自外部来源:不会自动进入对话,也不会写进摘要和画像。`,"memoryPage.deleteMemory":`删除记忆`,"memoryPage.deleteMemoryName":`确定删除“{name}”吗?这条记忆和它的历史版本会被彻底删除,不能撤销,之后也不会再被自动记回来。`,"memoryPage.memoryDeleted":`记忆已删除`,"memoryPage.sourceManual":`手动添加`,"memoryPage.sourceUserRequest":`你明确要求记住`,"memoryPage.sourceConversation":`对话中提到`,"memoryPage.sourceAgent":`Agent 推断`,"memoryPage.sourceTool":`工具结果`,"memoryPage.sourceExternal":`外部渠道`,"memoryPage.roleUser":`你说的话`,"memoryPage.roleAssistant":`Agent 说的话`,"memoryPage.roleTool":`工具结果`,"memoryPage.roleExternal":`外部渠道的消息`,"memoryPage.roleManual":`手动填写`,"memoryPage.editMemory":`编辑记忆`,"memoryPage.memoryDialogHint":`写成一句独立能懂的话,以后的对话才用得上。`,"memoryPage.memoryTitle":`标题`,"memoryPage.forExampleProjectUIConstraints":`例如:项目 UI 约束`,"memoryPage.memoryContent":`内容`,"memoryPage.recordStandaloneReusableMemoryForFutureChats":`记录独立可理解、未来可复用的记忆`,"memoryPage.importance":`重要度`,"memoryPage.normal":`一般`,"memoryPage.common":`常用`,"memoryPage.important":`重要`,"memoryPage.strict":`强约束`,"memoryPage.optionalForExampleECodeProjectREADMEMd":`可选,例如 E:\\code\\project\\README.md`,"memoryPage.cancel":`取消`,"memoryPage.save":`保存`,"memoryPage.saving":`保存中…`,"memoryPage.memoryCreated":`记忆已添加`,"memoryPage.memoryUpdated":`记忆已更新`,"memoryPage.noActivity":`还没有整理记录。`,"memoryPage.activityUnsupported":`连接的 Runtime 版本较旧,暂时看不到整理记录。`,"memoryPage.undo":`撤销`,"memoryPage.undone":`已撤销`,"memoryPage.eventUndone":`已撤销这次改动`,"memoryPage.activityLoadFailed":`整理记录读取失败`,"memoryPage.eventAdd":`新增记忆`,"memoryPage.eventSupersede":`替换了旧版本`,"memoryPage.eventMerge":`合并了重复内容`,"memoryPage.eventArchive":`转入归档`,"memoryPage.eventExpire":`到期归档`,"memoryPage.eventStale":`标记为可能过期`,"memoryPage.eventConfirm":`确认仍有效`,"memoryPage.eventRestore":`恢复`,"memoryPage.eventEdit":`编辑`,"memoryPage.eventPin":`钉住`,"memoryPage.eventUnpin":`取消钉住`,"memoryPage.eventDelete":`删除了一条记忆`,"memoryPage.eventPurge":`清理了过保留期的内容`,"memoryPage.eventUndo":`撤销了一次改动`,"memoryPage.eventReinforce":`再次证实`,"memoryPage.eventMigrate":`升级记忆库`,"memoryPage.eventConsolidate":`整理了记忆`,"memoryPage.reasonConsolidatedBoth":`生成 {digests} 份摘要,合并 {merged} 条重复`,"memoryPage.reasonConsolidatedDigests":`生成 {digests} 份摘要`,"memoryPage.reasonConsolidatedMerged":`合并 {merged} 条重复`,"memoryPage.eventGeneric":`记忆有变化`,"memoryPage.actorYou":`你`,"memoryPage.actorSystem":`系统`,"memoryPage.actorConsolidator":`后台整理`,"memoryPage.actorAgent":`Agent`,"memoryPage.actorConversation":`对话抽取`,"memoryPage.reasonSameIdentity":`同一主题有了新内容`,"memoryPage.reasonLowerAuthority":`和你明确说过的内容矛盾,没有生效`,"memoryPage.reasonExpired":`已到期`,"memoryPage.reasonLowUtility":`长期没有用到`,"memoryPage.reasonUserDeleted":`你删除了它`,"memoryPage.reasonUserRequested":`你要求忘掉它`,"memoryPage.reasonPromoted":`{count} 条待确认的内容直接生效`,"memoryEvolution.regionLabel":`记忆年轮`,"memoryEvolution.stageLabel":`{date} 的记忆年轮:{active} 条有效,{superseded} 条已被替换,{archived} 条已归档。`,"memoryEvolution.timelineLabel":`时间轴`,"memoryEvolution.active":`有效`,"memoryEvolution.superseded":`已替换`,"memoryEvolution.archived":`已归档`,"memoryEvolution.notYet":`还没发生`,"memoryEvolution.now":`现在`,"memoryEvolution.play":`播放`,"memoryEvolution.pause":`暂停`,"memoryEvolution.backToNow":`回到现在`,"memoryEvolution.speed":`播放速度`,"memoryEvolution.legend":`记忆类型`,"memoryEvolution.howToRead":`怎么看这张图`,"memoryEvolution.howToReadBody":`时间由内向外长成年轮,最外圈就是时间轴所在的时刻。每个光点是一条记忆:还在生效的浮在盘面上,被替换的烧成余烬,并有一道弧线连向替换它的新记忆,归档的沉入暗处。`,"memoryEvolution.gestures":`拖动旋转,鼠标上下拖动调俯仰,Ctrl + 滚轮或捏合缩放,双击复位。键盘:左右键调时间,空格播放。`,"memoryEvolution.typeDecision":`决策`,"memoryEvolution.typePreference":`偏好`,"memoryEvolution.typeFact":`事实`,"memoryEvolution.typeConcept":`概念`,"memoryEvolution.typeRisk":`风险`,"memoryEvolution.typeFile":`文件`,"memoryEvolution.typeTask":`任务`,"memoryEvolution.learnedLate":`事后才知道:{date} 才记下`,"memoryEvolution.closeCard":`关闭`,"memoryEvolution.pinned":`已钉住`,"memoryEvolution.untrusted":`外部来源`,"memoryEvolution.stale":`可能过期`,"memoryEvolution.emptyTitle":`年轮还是空的`,"memoryEvolution.emptyDescription":`和 Pisper 聊聊你的偏好和项目决定,记忆会从这里一圈圈长出来。`,"memoryEvolution.truncated":`记忆太多,这里只画最近 {count} 条。`,"memoryEvolution.loading":`正在读取记忆`,"memoryEvolution.loadFailed":`记忆年轮读取失败`,"memoryEvolution.retry":`重试`},Ne={"navigation.app":`应用`,"navigation.chat":`会话`,"navigation.chatDescription":`让多个会话沿各自轨道并行推进`,"navigation.chatHistory":`历史会话`,"navigation.chatHistoryDescription":`每一次交谈,都在这里留下清晰可寻的回声`,"navigation.assets":`资产`,"navigation.assetsDescription":`收拢对话中的文件、图像与灵感产物`,"navigation.channels":`渠道`,"navigation.channelsDescription":`让 Pisper 穿过屏幕,抵达你的协作现场`,"navigation.schedules":`定时任务`,"navigation.bots":`Bots`,"navigation.schedulesDescription":`把重复的等待,交给准时启程的任务`,"navigation.settings":`设置`,"navigation.settingsDescription":`校准模型、运行策略与通知节奏`,"navigation.plugins":`插件`,"navigation.pluginsDescription":`安装和管理插件,同时控制 Agent 可调用的工具能力`,"navigation.memory":`记忆`,"navigation.memoryDescription":`让偏好与决策跨会话延续,也能按时间回看`,"navigation.mcp":`MCP`,"navigation.mcpDescription":`连接外部能力,也守住每一道权限边界`,"navigation.skills":`技能`,"navigation.components":`自定义组件`,"navigation.componentsDescription":`预览、放置与生成原生组件`,"navigation.skillsDescription":`收纳可复用的技艺,让能力随任务被唤醒`,"navigation.workflows":`工作流`,"navigation.workflowsDescription":`创建、运行和管理可复用的流程。`,"navigation.newWorkflow":`新建工作流`,"navigation.newWorkflowDescription":`连接处理步骤,配置每次运行的内容。`,"navigation.editWorkflow":`编辑工作流`,"navigation.editWorkflowDescription":`调整处理步骤,配置每次运行的内容。`,"appOverlays.actions":`操作`,"appOverlays.commandPalette":`命令面板`,"appOverlays.newChat":`新会话`,"appOverlays.noMatchingResults":`无匹配结果`,"appOverlays.openLabeledTurnFailed":`无法打开此标记所在的回复`,"appOverlays.labelResultTimes":`会话 {sessionTime} · 节点 {nodeTime}`,"appOverlays.locatingLabel":`正在定位标记…`,"appOverlays.searchPagesChatsOrActions":`搜索页面、会话、标记或操作`,"appOverlays.searchingLabels":`正在搜索会话标记…`,"appOverlays.untitledChat":`未命名会话`,"appOverlays.unknownTime":`时间未知`,"appOverlays.agentsAndSessions":`代理与会话`,"appOverlays.newTask":`新任务`,"appOverlays.hintSelect":`选择`,"appOverlays.hintOpen":`打开`,"appOverlays.hintGroups":`切换分组`,"appOverlays.hintClose":`关闭`,"appSidebar.countCommitsBehindBranch":`落后 {branch} {count} 个提交`,"appSidebar.downloading":`正在下载`,"appSidebar.renameProject":`重命名项目`,"appSidebar.projectName":`项目名称`,"appSidebar.projectNameUpdated":`项目名称已更新`,"appSidebar.projectNameSaveFailed":`无法保存项目名称,请检查本地存储后重试。`,"appSidebar.deleteProject":`删除项目`,"appSidebar.deleteProjectConfirm":`将删除「{project}」及其 {count} 个会话,删除后不可恢复。`,"appSidebar.deleteProjectAction":`删除`,"appSidebar.projectDeleted":`项目「{project}」已删除`,"appSidebar.projectRemoved":`已移除项目「{project}」,目录与文件不受影响`,"appSidebar.projectNoChats":`项目「{project}」已没有会话,请刷新后重试。`,"appSidebar.projectDeletePartial":`已确认删除 {deleted} 个会话,项目「{project}」目前剩余 {remaining} 个会话。请检查后重试未完成的删除。`,"appSidebar.projectDeleteUnverified":`已确认删除 {deleted} 个会话,但无法确认项目「{project}」的剩余数量。请刷新后检查。`,"appSidebar.readyToRestart":`等待重启安装`,"appSidebar.sourceUpdatesAvailable":`发现代码更新`,"appSidebar.updateAvailable":`发现新版本`,"appSidebar.viewUpdateDetails":`点击查看更新`,"pageHeader.quickSetup":`快速设置`,"pageHeader.addService":`添加服务`,"pageHeader.installSkill":`导入全局 Skill`,"pageHeader.newChat":`新会话`,"pageHeader.search":`搜索(/)`,"pageHeader.searchMemoriesOrFiles":`搜索记忆或文件`,"pageHeader.searchPage":`搜索{page}`,"pageHeader.searchServicesOrTools":`搜索服务或工具`,"pageHeader.toggleTerminal":`切换终端`,"pageLoader.bringingTheNeededCapabilitiesIntoPlace":`所需能力正在依次就位…`,"pageLoader.lightingUpThisPage":`正在点亮此页`,"window.controls":`窗口控制`,"window.minimize":`最小化`,"window.maximize":`最大化 / 还原`,"window.close":`关闭窗口`,"appOverlays.pages":`页面`,"appOverlays.labels":`会话标记`,"appOverlays.searchLabelsFailed":`无法搜索会话标记`,"appOverlays.loadChatsFailed":`无法读取会话列表`,"appOverlays.openResultFailed":`无法打开此结果,请重试`,"shell.board":`看板`,"shell.boardDescription":`需要你的事项永远排在最前`,"shell.components":`组件工作室`,"shell.more":`更多`,"shell.moreDescription":`历史、资料、自动化与扩展`,"shell.primaryNavigation":`主导航`,"shell.newTask":`新任务`,"shell.untitledSession":`未命名会话`,"shell.backToBoardLabel":`返回全部代理`,"shell.sessionNotFound":`找不到这个会话`,"shell.sessionNotFoundHint":`它可能已被删除,或链接不完整。`,"shell.backToFeaturesLabel":`返回功能`,"more.title":`功能`,"more.lede":`不常驻的能力都在这里,也都能用 {shortcut} 直接打开。`,"more.ledeNoShortcut":`不常驻的能力都在这里,也都能在命令面板里直接打开。`,"more.search":`搜索功能、设置与命令`,"more.noResults":`没有匹配的功能`,"more.noResultsHint":`换个关键词,或在 {shortcut} 命令面板里搜索会话与命令。`,"more.clearSearch":`清除搜索`,"more.groupSessions":`会话与资料`,"more.groupAutomation":`自动化`,"more.groupExtensions":`扩展`,"more.groupDevices":`设备与连接`,"more.groupComponents":`我的组件`,"more.chatHistoryHint":`全部会话,含归档`,"more.assetsHint":`生成的图片与文件`,"more.memoryHint":`长期记忆 · 时间演算`,"more.workflowsHint":`多步骤编排`,"more.schedulesHint":`按时间派发代理`,"more.channelsHint":`在聊天工具里派发任务`,"more.pluginsHint":`安装与管理插件`,"more.skillsHint":`可复用的代理技能`,"more.mcpHint":`连接外部工具`,"more.componentStudioHint":`创建与放置组件`,"more.remoteAccessHint":`让手机连接这台电脑`,"more.mobileServerHint":`连接桌面或本机服务`,"more.desktopPetHint":`桌面陪伴形象`,"more.desktopOnly":`仅桌面端可用`,"more.componentHint":`整页组件`,"more.addComponent":`放置组件`,"more.addComponentHint":`去组件工作室创建或导入`,"more.componentsLoading":`正在读取组件…`,"more.componentsError":`无法读取已安装的组件`,"more.retry":`重试`,"more.disabledTile":`{label}:{reason}`,"shell.createSessionFailed":`无法新建会话`,"more.badgeRunning":`{count} 运行中`,"more.badgeEnabled":`{count} 启用`,"more.badgeDisconnected":`{count} 断开`,"more.badgeOnline":`{count} 在线`,"more.settingsResults":`设置与命令`,"more.searchPalette":`在命令面板中搜索“{query}”`,"more.searchPaletteHint":`会话、Turn 标签与命令`,"sidebar.label":`会话与导航`,"sidebar.labelCollapsed":`会话与导航(已收起)`,"sidebar.collapse":`收起侧栏`,"sidebar.expand":`展开侧栏`,"sidebar.allAgents":`全部代理`,"sidebar.features":`功能`,"sidebar.loading":`正在加载会话`,"appOverlays.toggleTheme":`切换主题`,"sidebar.search":`搜索`,"phone.menu":`打开导航`,"phone.menuAttention":`打开导航,{count} 个需要你`,"phone.drawer":`导航`,"phone.drawerHint":`搜索、新任务、全部代理、功能、会话与设置`},Pe={"toolLabels.imageAssets":`素材工具`,"toolLabels.imageAssetsDescription":`为 Agent 提供动作生成、本地去背景、拆帧、人工帧修正与图集导出。默认关闭;工作流和工作台仍可直接使用。`,"toolLabels.imageAssetsScope":`导入的工作区图片与应用管理的素材`,"toolLabels.imageAssetsCapability":`复用素材处理引擎,可生成、修正、排列动画帧并导出图集`,"pluginsPage.all":`全部`,"toolLabels.read":`读取文件`,"toolLabels.list":`浏览目录`,"toolLabels.grep":`搜索内容`,"toolLabels.find":`查找文件`,"toolLabels.edit":`修改文件`,"toolLabels.write":`写入文件`,"toolLabels.shell":`运行命令`,"toolLabels.webSearch":`联网搜索`,"toolLabels.browserControl":`浏览器控制`,"toolLabels.visualGeneration":`生成视觉内容`,"toolLabels.skillCreate":`创建技能`,"toolLabels.pluginCreate":`创建插件`,"toolLabels.memorySearch":`搜索记忆`,"toolLabels.memoryRemember":`保存记忆`,"toolLabels.memoryOpen":`查看记忆详情`,"toolLabels.memoryConfirm":`确认记忆仍有效`,"toolLabels.memoryForget":`删除记忆`,"toolLabels.mcpList":`查看 MCP 服务`,"toolLabels.mcpManage":`管理 MCP 服务`,"toolLabels.codemode":`脚本编排`,"toolLabels.readDescription":`读取工作目录中的文本、代码和图片文件。`,"toolLabels.listDescription":`列出目录结构和文件基本信息。`,"toolLabels.grepDescription":`在项目文件中进行全文和正则搜索。`,"toolLabels.findDescription":`按名称和模式查找项目文件。`,"toolLabels.editDescription":`对现有文件执行精确的局部编辑。`,"toolLabels.writeDescription":`创建新文件或覆盖写入文件内容。`,"toolLabels.shellDescription":`以当前系统用户权限执行终端命令。`,"toolLabels.webSearchDescription":`通过无需安装和 API Key 的 Bing RSS 搜索互联网。`,"toolLabels.browserControlDescription":`为 Agent 提供隔离、受控的浏览器环境,用于网页导航、内容检查和页面交互。`,"toolLabels.visualGenerationDescription":`自动调用已配置的视觉 Provider 生成图片、编辑图片或生成视频,并保存到工作目录。`,"toolLabels.skillCreateDescription":`在当前项目或 Pisper 全局技能目录中创建符合规范的 Agent Skill。`,"toolLabels.pluginCreateDescription":`定义、校验并安装一个提供一个或多个 Agent 工具的本地 Pisper 插件。本地插件只增加工具,每次调用都要审批;要改变代理本身的行为请改用 Pi Extension。`,"toolLabels.memorySearchDescription":`按相关性或时间搜索全局与当前项目的长期记忆,也能查某件事是怎么变过来的。`,"toolLabels.memoryRememberDescription":`把长期有用的事实写入记忆,直接生效,并替换同一主题的旧内容。`,"toolLabels.memoryOpenDescription":`展开一条搜索结果:看事实的证据、版本历史和原始对话,或摘要背后的事实。`,"toolLabels.memoryConfirmDescription":`核对当前文件后,把标记为可能过期的记忆确认为仍然有效。`,"toolLabels.memoryForgetDescription":`用户明确要求忘掉时,彻底删除一条记忆和它的历史版本。`,"toolLabels.mcpListDescription":`读取已配置的 MCP 服务、连接状态和可用工具。`,"toolLabels.mcpManageDescription":`使用结构化参数添加、更新、删除、测试或启停 MCP 服务和工具。`,"toolLabels.codemodeDescription":`让 Agent 写一段 JavaScript 脚本,并行调用其他已开启的工具,只把脚本的输出交回模型。默认关闭。`,"toolLabels.lowRisk":`低风险`,"toolLabels.mediumRisk":`中风险`,"toolLabels.highRisk":`高风险`,"toolLabels.fileSystem":`文件系统`,"toolLabels.search":`搜索`,"toolLabels.terminal":`终端`,"toolLabels.visual":`视觉`,"toolLabels.skills":`技能`,"toolLabels.plugins":`插件`,"toolLabels.browser":`浏览器`,"toolLabels.memory":`记忆`,"toolLabels.mcp":`MCP`,"toolLabels.collaboration":`协作`,"toolLabels.orchestration":`编排`,"toolLabels.currentChatWorkspace":`当前会话工作目录`,"toolLabels.currentOsUser":`当前系统用户权限`,"toolLabels.bingPublicWebSearch":`Bing 公开网页搜索`,"toolLabels.isolatedSessionBrowser":`当前主 Agent 会话的隔离浏览器;仅支持 HTTP/HTTPS`,"toolLabels.visualProviderAndWorkspace":`已配置的视觉 Provider;当前会话工作目录/generated/visuals`,"toolLabels.projectAndGlobalSkills":`当前项目与 Pisper 全局技能目录`,"toolLabels.globalPluginSources":`Pisper 全局插件源码与本地插件安装目录`,"toolLabels.globalAndProjectMemory":`全局与当前项目的记忆空间`,"toolLabels.applicationMcpConfiguration":`应用级 MCP 配置`,"toolLabels.codemodeScope":`隔离的脚本沙箱,本身不能读写文件、联网或运行命令;调用的每个工具仍按各自范围逐次审批`,"toolLabels.readCapability":`读取文件内容,不修改文件`,"toolLabels.listCapability":`浏览目录,不读取文件正文`,"toolLabels.grepCapability":`搜索文本,不修改文件`,"toolLabels.findCapability":`查找路径,不修改文件`,"toolLabels.editCapability":`修改现有文件并生成差异`,"toolLabels.writeCapability":`创建和覆盖文件`,"toolLabels.shellCapability":`执行命令、构建和测试`,"toolLabels.webSearchCapability":`发送搜索关键词并返回标题、链接、摘要和发布时间,不修改网页内容`,"toolLabels.browserControlCapability":`导航、检查、点击、输入、等待、截图和关闭浏览器;不执行任意 JavaScript`,"toolLabels.visualGenerationCapability":`调用视觉模型生成或编辑图片、生成视频,并写入输出文件`,"toolLabels.skillCreateCapability":`校验并原子创建新的 SKILL.md,不覆盖已有内容`,"toolLabels.pluginCreateCapability":`不覆盖现有文件地创建插件源码,执行统一预检,并安装声明的全部工具`,"toolLabels.memorySearchCapability":`读取相关的偏好、事实、决策和任务记忆,不修改记忆`,"toolLabels.memoryRememberCapability":`直接保存长期有用的事实,并自动隐藏常见密钥格式`,"toolLabels.memoryOpenCapability":`读取记忆背后的证据和历史,不修改记忆`,"toolLabels.memoryConfirmCapability":`清除记忆上“可能过期”的标记`,"toolLabels.memoryForgetCapability":`只有逐字引用用户的要求才能删除记忆`,"toolLabels.mcpListCapability":`读取经过脱敏的 MCP 服务信息,不修改配置`,"toolLabels.mcpManageCapability":`修改 MCP 服务配置;敏感 headers 和 env 不出现在返回结果中`,"toolLabels.codemodeCapability":`批量、过滤和合并工具调用,减少逐条结果占用的上下文`,"pluginsPage.auto":`自动`,"pluginsPage.bingSearchIsAvailableAndReturnedCountResults":`Bing 搜索可用,返回 {count} 条结果`,"pluginsPage.defaultLanguage":`默认语言`,"pluginsPage.enabled":`启用`,"pluginsPage.enabled2":`已启用`,"pluginsPage.english":`英语`,"pluginsPage.loadingToolPlugins":`正在加载工具插件`,"pluginsPage.loadFailed":`工具插件读取失败`,"pluginsPage.moderate":`适中`,"pluginsPage.noMatchingTools":`没有匹配的工具`,"pluginsPage.noPluginPolicyChanges":`插件策略没有变化`,"pluginsPage.off":`关闭`,"pluginsPage.pathScope":`路径范围`,"pluginsPage.pluginPolicySavedAgentRuntimeUpdated":`插件策略已保存,Agent 运行时已更新`,"pluginsPage.resultCount":`结果数量`,"pluginsPage.riskLevel":`风险等级`,"pluginsPage.safeSearch":`安全搜索`,"pluginsPage.savePolicy":`保存策略`,"pluginsPage.simplifiedChinese":`简体中文`,"pluginsPage.source":`来源`,"pluginsPage.strict":`严格`,"pluginsPage.testConnection":`测试连接`,"pluginsPage.testing":`测试中…`,"pluginsPage.unsaved":`未保存`,"pluginsPage.builtIn":`内置`,"pluginsPage.local":`本地`,"pluginsPage.toolCatalog":`工具目录`,"pluginsPage.installPlugin":`安装插件`,"pluginsPage.installLocalPlugin":`安装本地插件`,"pluginsPage.installLocalPluginDescription":`检查并安装本机目录中的插件。`,"pluginsPage.pluginDirectory":`插件目录`,"pluginsPage.pluginDirectoryPlaceholder":`包含 pisper-plugin.json 的绝对路径`,"pluginsPage.chooseDirectory":`选择目录`,"pluginsPage.files":`个文件`,"pluginsPage.inspectPlugin":`检查插件`,"pluginsPage.processing":`处理中…`,"pluginsPage.localPluginSecurityWarning":`本地插件代码在独立 Worker 中运行,但仍能以当前系统用户权限访问本机文件和网络;除“完全访问”模式外,每次调用前都会请你确认。`,"pluginsPage.toggleToolDetails":`展开或收起 {name} 的详情`,"pluginsPage.executionMode":`执行模式`,"pluginsPage.confirmUnlessFullAccess":`所有模式可用,完全访问以外每次确认`,"pluginsPage.uninstallPlugin":`卸载插件`,"pluginsPage.uninstallPluginDescription":`卸载 {name} 及其提供的全部工具?Pisper 内置工具不支持卸载。`,"pluginsPage.pluginUninstalled":`已卸载 {name}`,"pluginsPage.saveBeforePluginChanges":`请先保存待处理的工具策略变更,再安装或卸载插件。`,"pluginsPage.extensionMarket":`Extension 插件市场`,"pluginsPage.openPackageCatalog":`打开完整目录`,"pluginsPage.searchPackageCatalog":`搜索 pi.dev 包目录`,"pluginsPage.search":`搜索`,"pluginsPage.installedExtensions":`已安装 Extension`,"pluginsPage.installExtension":`安装 Extension`,"pluginsPage.uninstallExtension":`卸载 Extension`,"pluginsPage.extensionSource":`扩展来源`,"pluginsPage.extensionSourceHelp":`输入 npm 包、Git 地址或本地扩展目录。包含 pi.extensions 或 pi.prompts 的包可作为 Extension 安装;混合包中的 pi.skills 也会分类展示。`,"pluginsPage.extensionType.tool":`工具`,"pluginsPage.extensionType.prompt":`Prompt`,"pluginsPage.extensionType.skill":`Skill`,"pluginsPage.extensionSecurityWarning":`Extension 代码将在 Agent Runtime 中运行,可以拦截工具调用、修改提示词,并可能访问文件、网络和当前用户权限。只安装你信任的来源。确定安装 {name}?`,"pluginsPage.extensionInstalled":`Extension 已安装;请新建会话使其生效。`,"pluginsPage.extensionUninstalled":`Extension 已卸载;请新建会话使其停止生效。`,"pluginsPage.uninstallExtensionDescription":`卸载 {name} 及其所有 Pi Extension 配置?`,"pluginsPage.installed":`已安装`,"pluginsPage.lede":`管理代理可以调用的工具与 Pi Extension。本地插件只给代理增加工具,每次调用都要审批;Pi Extension 在 Runtime 里运行,可以改变代理本身的行为。启停改动在“保存策略”后,从下一次代理请求开始生效。`,"toolLabels.scheduleList":`查看定时任务`,"toolLabels.scheduleManage":`管理定时任务`,"toolLabels.scheduleListDescription":`读取定时任务的计划、下次运行与上次结果。`,"toolLabels.scheduleManageDescription":`新建、修改、暂停、恢复、删除或立即运行定时任务,包括执行一次后自动停用的一次性任务。`,"toolLabels.schedules":`定时任务`,"toolLabels.applicationSchedules":`应用的定时任务`,"toolLabels.scheduleListCapability":`读取定时任务,不做修改`,"toolLabels.scheduleManageCapability":`安排之后无人值守、以完全访问权限运行的任务;非完全访问会话里新建、修改、恢复与立即运行都要你确认`,"toolLabels.workflowList":`查看工作流`,"toolLabels.workflowRun":`运行工作流`,"toolLabels.workflowListDescription":`读取工作流、它们的输入和某个工作流最近的运行结果。`,"toolLabels.workflowRunDescription":`启动或停止已发布的工作流。`,"toolLabels.workflows":`工作流`,"toolLabels.applicationWorkflows":`应用的工作流`,"toolLabels.workflowListCapability":`读取工作流与运行结果,不做修改`,"toolLabels.workflowRunCapability":`启动节点无人值守、以完全访问权限运行的工作流;非完全访问会话里启动都要你确认`},Fe={"schedulesPage.fullAccessHelp":`后台任务以当前系统用户权限运行 Shell,不会逐次请求授权。`,"schedulesPage.atIntervals":`每隔一段时间`,"schedulesPage.daily":`每天`,"schedulesPage.weekly":`每周`,"schedulesPage.monthly":`每月`,"schedulesPage.minutes":`分钟`,"schedulesPage.hours":`小时`,"schedulesPage.days":`天`,"schedulesPage.browserNotification":`通知`,"schedulesPage.feishu":`飞书`,"schedulesPage.weChat":`微信`,"schedulesPage.qq":`QQ`,"schedulesPage.telegram":`Telegram`,"schedulesPage.browseDirectories":`浏览目录`,"schedulesPage.cancel":`取消`,"schedulesPage.countSec":`{count} 秒`,"schedulesPage.createATaskAndLetItSetOutAutomaticallyAtTheAppointedTime":`新建一项任务,让它在约定的时刻自动启程。`,"schedulesPage.creating":`创建中…`,"schedulesPage.delete":`删除`,"schedulesPage.deleteScheduledTask":`删除定时任务`,"schedulesPage.deleteScheduledTaskNameAndItsRunHistory":`删除定时任务「{name}」及其执行历史?`,"schedulesPage.deleteTask":`删除任务`,"schedulesPage.describeTheWorkTheAgentShouldCompleteEachTime":`描述 Agent 每次需要完成的工作`,"schedulesPage.editTemplates":`编辑模板`,"schedulesPage.enabled":`启用`,"schedulesPage.enabledAutomaticallyAfterCreation":`创建后自动启用`,"schedulesPage.enterTheProjectSAbsolutePath":`输入项目的绝对路径`,"schedulesPage.executionMode":`执行模式`,"schedulesPage.executionTarget":`执行目标`,"schedulesPage.forExampleDailyCodeReview":`例如 每日代码巡检`,"schedulesPage.frequency":`频率`,"schedulesPage.fullAccess":`完全访问`,"schedulesPage.lastRunTime":`上次运行:{time}`,"schedulesPage.loadingScheduledTasks":`正在加载定时任务`,"schedulesPage.pause":`暂停`,"schedulesPage.lastRunFailed":`上次失败`,"schedulesPage.notifyWhen":`通知时机`,"schedulesPage.failuresOnly":`仅失败时`,"schedulesPage.runNow":`立即运行`,"schedulesPage.scheduledTrigger":`定时触发`,"schedulesPage.completionAndFailure":`完成与失败`,"schedulesPage.taskFailed":`任务执行失败`,"schedulesPage.taskInterrupted":`任务因 Pisper 重启而中断`,"schedulesPage.createTask":`创建任务`,"schedulesPage.manualRun":`手动运行`,"schedulesPage.saveTask":`保存任务`,"schedulesPage.taskCompleted":`任务已完成`,"schedulesPage.newScheduledTask":`新建定时任务`,"schedulesPage.nextRunTime":`下次运行:{time}`,"schedulesPage.noRunHistory":`暂无执行记录`,"schedulesPage.notificationChannels":`通知渠道`,"schedulesPage.recentRuns":`最近执行`,"schedulesPage.runInterval":`执行间隔`,"schedulesPage.running":`运行中`,"schedulesPage.running2":`正在运行`,"schedulesPage.saving":`保存中…`,"schedulesPage.scheduledTaskCreated":`定时任务已创建`,"schedulesPage.scheduledTaskDeleted":`定时任务已删除`,"schedulesPage.scheduledTaskSaved":`定时任务已保存`,"schedulesPage.scheduledTaskStarted":`定时任务已开始运行`,"schedulesPage.taskName":`任务名称`,"schedulesPage.theScheduledAgentWillRunInThisDirectory":`定时任务的 Agent 将在此目录中运行。`,"schedulesPage.theTimelineIsStillUnlit":`时间轴尚未点亮`,"schedulesPage.time":`时间`,"schedulesPage.timeZone":`时区`,"schedulesPage.workingDirectory":`工作目录`,"schedulesPage.workflow":`工作流`,"schedulesPage.workflowUnavailable":`工作流不可用`,"schedulesPage.selectPublishedWorkflow":`选择已发布的工作流`,"schedulesPage.noPublishedWorkflows":`暂无已发布的工作流。请先在工作流页面发布一个工作流。`,"schedulesPage.workflowUsesItsOwnRuntimeSettings":`工作目录、模型和执行参数由工作流自身配置决定。`,"schedulesPage.workflowInputs":`工作流输入`,"schedulesPage.workflowInputsHelp":`仅保存到当前任务,每次运行时传入所选工作流。`,"schedulesPage.youCanContinueEditingTheRunTimeAndNotificationChannelsAfterCreation":`创建后可继续编辑运行时间和通知渠道。`,"schedulesPage.youCanContinueSettingTheRunTimeAndNotificationChannelsAfterCreation":`创建后可继续设置运行时间和通知渠道。`,"schedulesPage.notificationChannelsHelp":`选择任务完成后需要通知的渠道`,"schedulesPage.configured":`已配置`,"schedulesPage.notConfigured":`未配置`,"schedulesPage.lede":`按时间自动发起对话或运行工作流,结果可以推送到通知与渠道。`,"schedulesPage.loadFailed":`定时任务读取失败`,"schedulesPage.newTask":`新建任务`,"schedulesPage.tasks":`任务`,"schedulesPage.enabledCount":`{count} 个启用`,"schedulesPage.toggleTaskDetails":`展开或收起 {name} 的设置`,"schedulesPage.noMatchingTasks":`没有符合搜索的任务`,"schedulesPage.enableTaskName":`启用 {name}`,"schedulesPage.once":`一次`,"schedulesPage.date":`日期`,"schedulesPage.onceDone":`已执行,不再运行`,"schedulesPage.missed":`已错过(Pisper 当时没在运行)`,"schedulesPage.createdByAgent":`由代理创建`,"schedulesPage.botTarget":`交给 Bot:{message}`,"schedulesPage.botManagedThere":`这件事到点交给一个 Bot 去做,在它的页面里修改或删除。`,"schedulesPage.openBot":`打开这个 Bot`},Ie={"skillsPage.all":`全部`,"skillsPage.design":`设计`,"skillsPage.code":`代码`,"skillsPage.documents":`文档`,"skillsPage.global":`全局`,"skillsPage.globalSkills":`全局 Skill`,"skillsPage.globalSkillSourceHelp":`输入一个 Skill 来源:本地技能目录或 SKILL.md、npm 包名,或者 git 地址。Pisper 只提取其中的 Skill 资源并复制到 ~/.pisper/agent/skills,所有项目均可使用。`,"skillsPage.highPrivilege":`高权限`,"skillsPage.allowAutomaticModelInvocation":`允许模型自动调用`,"skillsPage.automaticManual":`自动 + 手动`,"skillsPage.configuredSkillPackages":`已配置技能包`,"skillsPage.continue":`继续`,"skillsPage.declaresRequiredTools":`声明所需工具`,"skillsPage.import":`导入`,"skillsPage.importGlobalSkill":`导入全局 Skill`,"skillsPage.loadingSkills":`正在加载技能`,"skillsPage.loadFailed":`技能读取失败`,"skillsPage.locallyReady":`本地已就绪`,"skillsPage.manualOnly":`仅手动`,"skillsPage.noGlobalSkills":`尚无全局 Skill。可导入到 ~/.pisper/agent/skills。`,"skillsPage.noProjectSkills":`当前工作区没有项目 Skill。请将 Skill 放入当前工作区的 .pisper/skills。`,"skillsPage.noSkillPackagesAreConfiguredYetAfterYouInstallASkillItsSourceWillAppearHere":`当前没有已配置技能包。安装技能后,对应来源会出现在这里。`,"skillsPage.noSkillsMatchTheCurrentFilter":`当前筛选下没有匹配技能。`,"skillsPage.notMaterialized":`尚未落地`,"skillsPage.permissions":`权限`,"skillsPage.project":`项目`,"skillsPage.projectSkills":`项目 Skill`,"skillsPage.projectScopedConfiguration":`项目级配置`,"skillsPage.projectScopedSkill":`项目范围技能`,"skillsPage.addGlobalOrProjectSkill":`可导入全局 Skill 到 ~/.pisper/agent/skills,或在当前工作区的 .pisper/skills 中添加项目 Skill。`,"skillsPage.saveSettings":`保存设置`,"skillsPage.scanningSkillDirectoriesAndConfiguredPackages":`正在扫描全局 Skill 与当前项目 Skill`,"skillsPage.scope":`范围`,"skillsPage.skillInstalledAndLoadedIntoTheAgentRuntime":`全局 Skill 已导入并载入 Agent Runtime`,"skillsPage.skillSettingsSavedAndReloaded":`技能设置已保存并重新载入`,"skillsPage.skillSource":`技能来源`,"skillsPage.skillsProvideInstructionsToTheAgentAndMayIncludeExecutableScriptsConfirmThatYouTrustTheSource":`技能会向 Agent 提供指令,并可能包含可执行脚本。请确认该来源可信。`,"skillsPage.skillUninstalled":`技能已卸载`,"skillsPage.source":`来源`,"skillsPage.supportManualSkillCommand":`支持 /skill 手动命令`,"skillsPage.thisRemovesTheSkillDirectoryInstalledByPisperItDoesNotUninstallTheOriginalNpmOrGitPackage":`将删除由 Pisper 安装的技能目录。此操作不会卸载原始 npm 或 git 包。`,"skillsPage.toggleSkillName":`切换技能 {name}`,"skillsPage.triggerConditions":`触发条件`,"skillsPage.triggerMode":`触发方式`,"skillsPage.uninstall":`卸载`,"skillsPage.uninstallSkill":`卸载技能`,"skillsPage.userScopedConfiguration":`用户级配置`,"skillsPage.usesChatToolPermissions":`按会话工具权限`,"skillsPage.version":`版本`,"skillsPage.lede":`技能是给代理的可复用说明与脚本:可以用 /skill 手动调用,也可以允许模型自动调用。`,"skillsPage.toggleSkillDetails":`展开或收起 {name} 的详情`},Le={"terminalPanel.terminal":`终端`,"terminalPanel.resizeTerminal":`调整终端高度`,"terminalPanel.hideTerminal":"收起终端(Ctrl+`)","terminalPanel.showTerminal":"显示终端(Ctrl+`)","terminalPanel.newTerminal":`新建终端`,"terminalPanel.closeTerminal":`关闭终端`,"terminalPanel.maximizeTerminal":`增大终端面板`,"terminalPanel.openTerminal":`打开终端`,"terminalPanel.usesActiveSessionWorkspace":`新终端使用当前活动会话的工作目录`,"terminalPanel.orphanedTerminal":`未关联`,"terminalPanel.starting":`正在启动 Shell...`,"terminalPanel.processExited":`进程已退出,代码 {code}`,"workspace.unavailable":`终端不可用`,"workspace.nativeOnly":`此连接没有原生终端桥接,无法列出或启动终端进程。`,"workspace.ephemeral":`终端连接不会在刷新后恢复,请创建新的终端。`,"workspace.create":`创建终端`,"workspace.defaultDirectory":`默认终端目录`,"workspace.profile":`终端配置`,"workspace.orphaned":`原任务已删除`,"workspace.exited":`已退出`,"workspace.error":`错误`,"workspace.starting":`启动中`,"workspace.stopping":`停止中`,"workspace.running":`运行中`,"workspace.stop":`停止进程`,"workspace.follow":`自动跟随输出`,"workspace.truncated":`仅保留最近的输出,较早的日志已移出内存缓冲。`,"workspace.noOutput":`暂无输出`,"workspace.ownedProcesses":`仅显示本任务中由 Pisper 创建的终端进程`,"workspace.filter":`筛选进程状态`,"workspace.all":`全部状态`,"workspace.noMatch":`没有符合筛选条件的进程`,"workspace.noProcesses":`本任务暂无终端进程`,"workspace.logs":`展开或收起日志`,"workspace.unknown":`未知状态`,"workspace.open":`打开终端`,"workspace.closeView":`关闭视图(进程继续运行)`,"workspace.restoreViews":`显示已隐藏终端`,"workspace.terminal":`终端`,"workspace.processes":`后台进程`},G=`zh-CN`,K=[`zh-CN`,`en-US`];function q(e){return typeof e==`string`&&K.includes(e)}var Re=[{value:`zh-CN`,shortName:`中文`},{value:`en-US`,shortName:`EN`}],ze=Object.freeze([`assets`,`board`,`bots`,`channels`,`common`,`navigation`,`chat`,`config`,`labs`,`providers`,`remote-workspace`,`custom-ui`,`mcp`,`memory`,`plugins`,`schedules`,`skills`,`terminal`,`workflows`]);function Be(){try{let e=t.getItem(n.language);return q(e)?e:G}catch{return G}}var J=H.createInstance();J.use(_e).init({lng:Be(),fallbackLng:G,supportedLngs:K,defaultNS:`common`,ns:ze,resources:{"zh-CN":{assets:Oe,common:Ae,navigation:Ne,chat:ke,config:je,memory:Me,plugins:Pe,schedules:Fe,skills:Ie,terminal:Le},"en-US":{assets:ve,common:be,navigation:Ce,chat:ye,config:xe,memory:Se,plugins:we,schedules:Te,skills:Ee,terminal:De}},interpolation:{prefix:`{`,suffix:`}`,escapeValue:!1},keySeparator:!1,nsSeparator:`:`,initAsync:!1});var Y=null,X=null,Z=null;function Ve(){return J.hasResourceBundle(`zh-CN`,`custom-ui`)&&J.hasResourceBundle(`en-US`,`custom-ui`)?Promise.resolve():(Z??=e(async()=>{let{customUiMessages:{zh:e,en:t}}=await import(`./custom-ui-messages-DR-tPetW.js`);return{customUiMessages:{zh:e,en:t}}},[]).then(({customUiMessages:{zh:e,en:t}})=>{J.addResourceBundle(`zh-CN`,`custom-ui`,e),J.addResourceBundle(`en-US`,`custom-ui`,t)}).catch(e=>{throw Z=null,e}),Z)}function He(){return J.hasResourceBundle(`zh-CN`,`channels`)&&J.hasResourceBundle(`en-US`,`channels`)?Promise.resolve():(Y??=e(async()=>{let{channelsMessages:{zh:e,en:t}}=await import(`./channels-messages-KabR1HOR.js`);return{channelsMessages:{zh:e,en:t}}},[]).then(({channelsMessages:{zh:e,en:t}})=>{J.addResourceBundle(`zh-CN`,`channels`,e),J.addResourceBundle(`en-US`,`channels`,t)}).catch(e=>{throw Y=null,e}),Y)}function Ue(){return J.hasResourceBundle(`zh-CN`,`mcp`)&&J.hasResourceBundle(`en-US`,`mcp`)?Promise.resolve():(X??=Promise.all([e(()=>import(`./mcp-ZCMDzpoJ.js`),[]),e(()=>import(`./mcp-BcCwwm4p.js`),[])]).then(([e,t])=>{J.addResourceBundle(`zh-CN`,`mcp`,e.default),J.addResourceBundle(`en-US`,`mcp`,t.default)}).catch(e=>{throw X=null,e}),X)}function We(e,t=G,n){return J.getFixedT(t)(e,n)}var Q=null;function Ge(){return J.hasResourceBundle(`zh-CN`,`board`)&&J.hasResourceBundle(`en-US`,`board`)?Promise.resolve():(Q??=e(async()=>{let{boardMessages:{zh:e,en:t}}=await import(`./board-messages-BptuVfY-.js`);return{boardMessages:{zh:e,en:t}}},[]).then(({boardMessages:{zh:e,en:t}})=>{J.addResourceBundle(`zh-CN`,`board`,e),J.addResourceBundle(`en-US`,`board`,t)}).catch(e=>{throw Q=null,e}),Q)}var $=null;function Ke(){return J.hasResourceBundle(`zh-CN`,`workflows`)&&J.hasResourceBundle(`en-US`,`workflows`)?Promise.resolve():($??=e(async()=>{let{workflowMessages:{zh:e,en:t}}=await import(`./workflow-messages-Cc4pX_oo.js`);return{workflowMessages:{zh:e,en:t}}},[]).then(({workflowMessages:{zh:e,en:t}})=>{J.addResourceBundle(`zh-CN`,`workflows`,e),J.addResourceBundle(`en-US`,`workflows`,t)}).catch(e=>{throw $=null,e}),$)}export{Ve as a,J as c,We as d,ge as f,He as i,q as l,Re as n,Ue as o,me as p,Ge as r,Ke as s,G as t,Be as u};