reasonix 0.52.0 → 0.53.0

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 (143) hide show
  1. package/README.md +1 -0
  2. package/README.zh-CN.md +1 -0
  3. package/dashboard/dist/app.css +1 -1
  4. package/dashboard/dist/app.js +13 -13
  5. package/dashboard/dist/app.js.map +1 -1
  6. package/dist/cli/{acp-NEUYWGUU.js → acp-ABNDGEYC.js} +63 -30
  7. package/dist/cli/acp-ABNDGEYC.js.map +1 -0
  8. package/dist/cli/chat-377YZV56.js +49 -0
  9. package/dist/cli/{chunk-FY5UERSG.js → chunk-2WZT27GR.js} +9 -9
  10. package/dist/cli/{chunk-B4MOGWHW.js → chunk-4EHRIP5U.js} +7 -7
  11. package/dist/cli/chunk-4EHRIP5U.js.map +1 -0
  12. package/dist/cli/{chunk-RCC73DWQ.js → chunk-4SBXAHR6.js} +4 -4
  13. package/dist/cli/{chunk-5YLEKX2V.js → chunk-4V4TKQMB.js} +4 -4
  14. package/dist/cli/{chunk-5YLEKX2V.js.map → chunk-4V4TKQMB.js.map} +1 -1
  15. package/dist/cli/chunk-7ZO6H6ZK.js +54 -0
  16. package/dist/cli/chunk-7ZO6H6ZK.js.map +1 -0
  17. package/dist/cli/{chunk-3OXD5CBM.js → chunk-A6GSOADP.js} +17870 -16070
  18. package/dist/cli/chunk-A6GSOADP.js.map +1 -0
  19. package/dist/cli/{chunk-Z663GVUB.js → chunk-APOSDBAU.js} +3 -3
  20. package/dist/cli/{chunk-CTRM32BP.js → chunk-B5JISV5I.js} +2 -2
  21. package/dist/cli/{chunk-HNZ4727T.js → chunk-DFHI2MRB.js} +412 -152
  22. package/dist/cli/chunk-DFHI2MRB.js.map +1 -0
  23. package/dist/cli/{chunk-CGVW5W7N.js → chunk-EPIHGOM3.js} +14 -14
  24. package/dist/cli/{chunk-CGVW5W7N.js.map → chunk-EPIHGOM3.js.map} +1 -1
  25. package/dist/cli/{chunk-77JIQ7SL.js → chunk-EQFZIHKJ.js} +8 -8
  26. package/dist/cli/chunk-EQFZIHKJ.js.map +1 -0
  27. package/dist/cli/{chunk-XNMXVL6C.js → chunk-FB27YXPX.js} +2 -2
  28. package/dist/cli/{chunk-ARBGTNHM.js → chunk-FK7NXDRP.js} +2 -2
  29. package/dist/cli/{chunk-AOYUW3HR.js → chunk-GCNBIWK7.js} +22 -2
  30. package/dist/cli/chunk-GCNBIWK7.js.map +1 -0
  31. package/dist/cli/{chunk-XBYHNZ5Z.js → chunk-GMQVINZK.js} +13 -5
  32. package/dist/cli/chunk-GMQVINZK.js.map +1 -0
  33. package/dist/cli/{chunk-MVLPXZAA.js → chunk-GOASYYZ4.js} +43 -11
  34. package/dist/cli/{chunk-MVLPXZAA.js.map → chunk-GOASYYZ4.js.map} +1 -1
  35. package/dist/cli/{chunk-WPY7AFS6.js → chunk-I4SH5Z7S.js} +2 -2
  36. package/dist/cli/{chunk-MW64SQUE.js → chunk-J26XOB2T.js} +2 -2
  37. package/dist/cli/{chunk-DLTE4GBY.js → chunk-J4MYMBJ7.js} +3 -3
  38. package/dist/cli/{chunk-CFJY64UA.js → chunk-LRO63VNK.js} +2 -2
  39. package/dist/cli/{chunk-XUZHBQSM.js → chunk-MQJR7YQ2.js} +2 -2
  40. package/dist/cli/{chunk-CPCUMMSR.js → chunk-NVI4XPOQ.js} +3 -3
  41. package/dist/cli/{chunk-RHQOGG43.js → chunk-OHSVEXFF.js} +3 -3
  42. package/dist/cli/chunk-OHSVEXFF.js.map +1 -0
  43. package/dist/cli/{chunk-AMSK3ZLB.js → chunk-P5SUHDUQ.js} +2 -2
  44. package/dist/cli/{chunk-GFJJEW3Z.js → chunk-QSKDP3OS.js} +55 -5
  45. package/dist/cli/chunk-QSKDP3OS.js.map +1 -0
  46. package/dist/cli/{chunk-D6WRFR6V.js → chunk-R7JMQMLD.js} +6 -5
  47. package/dist/cli/chunk-R7JMQMLD.js.map +1 -0
  48. package/dist/cli/{chunk-VVPV5HU6.js → chunk-RRZIIMAF.js} +2 -2
  49. package/dist/cli/{chunk-GNRKXRRE.js → chunk-S3QII236.js} +369 -359
  50. package/dist/cli/{chunk-GNRKXRRE.js.map → chunk-S3QII236.js.map} +1 -1
  51. package/dist/cli/{chunk-HI6THNAZ.js → chunk-TGP7JGHN.js} +32 -14
  52. package/dist/cli/chunk-TGP7JGHN.js.map +1 -0
  53. package/dist/cli/{chunk-CLHMV6OL.js → chunk-U7G72DHQ.js} +83 -42
  54. package/dist/cli/chunk-U7G72DHQ.js.map +1 -0
  55. package/dist/cli/{chunk-OMNRXZNA.js → chunk-URAI4YRL.js} +2 -2
  56. package/dist/cli/{chunk-6QBUXA73.js → chunk-V4AXMN4X.js} +2 -2
  57. package/dist/cli/{chunk-2W4F3RIZ.js → chunk-XHP6NYOT.js} +3 -2
  58. package/dist/cli/{chunk-2W4F3RIZ.js.map → chunk-XHP6NYOT.js.map} +1 -1
  59. package/dist/cli/{code-WN6D4VZO.js → code-JPFZJYVW.js} +34 -34
  60. package/dist/cli/{commands-DHETOY7O.js → commands-IUL2CLKH.js} +4 -4
  61. package/dist/cli/{commit-BBUYAKZV.js → commit-JT7LYBTL.js} +3 -3
  62. package/dist/cli/{config-KV7VV5LG.js → config-T4RWI5NG.js} +6 -2
  63. package/dist/cli/{desktop-LJVXWXNF.js → desktop-AUBW2SLL.js} +122 -38
  64. package/dist/cli/desktop-AUBW2SLL.js.map +1 -0
  65. package/dist/cli/devtools-O5HOMAGZ.js +3 -0
  66. package/dist/cli/diff-NINZHUJR.js +165 -0
  67. package/dist/cli/diff-NINZHUJR.js.map +1 -0
  68. package/dist/cli/{doctor-GI5LOEZL.js → doctor-OMAYGY4F.js} +10 -10
  69. package/dist/cli/{events-LBKMLFM4.js → events-5IVFJ4H3.js} +5 -5
  70. package/dist/cli/index.js +38 -38
  71. package/dist/cli/{mcp-DKEJK5ND.js → mcp-ECGJACAP.js} +3 -3
  72. package/dist/cli/{mcp-browse-V7KWDY32.js → mcp-browse-NGEOHVJB.js} +15 -15
  73. package/dist/cli/mcp-browse-NGEOHVJB.js.map +1 -0
  74. package/dist/cli/{mcp-inspect-MTABNHVM.js → mcp-inspect-ZIMNRG7G.js} +5 -5
  75. package/dist/cli/{prompt-ATI7DKHF.js → prompt-JCC3A7AA.js} +5 -5
  76. package/dist/cli/{prune-sessions-YQQSZTZS.js → prune-sessions-TE4BJYO2.js} +4 -4
  77. package/dist/cli/{replay-ZJQ4I4CJ.js → replay-2UUTCRTG.js} +29 -29
  78. package/dist/cli/replay-2UUTCRTG.js.map +1 -0
  79. package/dist/cli/{run-HFPRNWJY.js → run-ABQYOPVM.js} +22 -22
  80. package/dist/cli/{server-UHKO2VVM.js → server-MPCXIW2O.js} +27 -25
  81. package/dist/cli/{server-UHKO2VVM.js.map → server-MPCXIW2O.js.map} +1 -1
  82. package/dist/cli/{sessions-IQEWWUH3.js → sessions-YBPRGIAF.js} +16 -16
  83. package/dist/cli/{setup-5BYKCL62.js → setup-A34LF2QE.js} +42 -42
  84. package/dist/cli/setup-A34LF2QE.js.map +1 -0
  85. package/dist/cli/{stats-OFCGOQMZ.js → stats-GKG5JZQX.js} +6 -6
  86. package/dist/cli/stats-GKG5JZQX.js.map +1 -0
  87. package/dist/cli/{version-EODUFAAI.js → version-JD6QSM4X.js} +16 -16
  88. package/dist/index.d.ts +36 -5
  89. package/dist/index.js +443 -73
  90. package/dist/index.js.map +1 -1
  91. package/package.json +7 -2
  92. package/dist/cli/acp-NEUYWGUU.js.map +0 -1
  93. package/dist/cli/chat-QA6IVFJD.js +0 -49
  94. package/dist/cli/chunk-3OXD5CBM.js.map +0 -1
  95. package/dist/cli/chunk-77JIQ7SL.js.map +0 -1
  96. package/dist/cli/chunk-AOYUW3HR.js.map +0 -1
  97. package/dist/cli/chunk-B4MOGWHW.js.map +0 -1
  98. package/dist/cli/chunk-CLHMV6OL.js.map +0 -1
  99. package/dist/cli/chunk-D6WRFR6V.js.map +0 -1
  100. package/dist/cli/chunk-GFJJEW3Z.js.map +0 -1
  101. package/dist/cli/chunk-HI6THNAZ.js.map +0 -1
  102. package/dist/cli/chunk-HNZ4727T.js.map +0 -1
  103. package/dist/cli/chunk-I3NE5S63.js +0 -54
  104. package/dist/cli/chunk-I3NE5S63.js.map +0 -1
  105. package/dist/cli/chunk-RHQOGG43.js.map +0 -1
  106. package/dist/cli/chunk-XBYHNZ5Z.js.map +0 -1
  107. package/dist/cli/desktop-LJVXWXNF.js.map +0 -1
  108. package/dist/cli/diff-2JHMQAHI.js +0 -165
  109. package/dist/cli/diff-2JHMQAHI.js.map +0 -1
  110. package/dist/cli/mcp-browse-V7KWDY32.js.map +0 -1
  111. package/dist/cli/replay-ZJQ4I4CJ.js.map +0 -1
  112. package/dist/cli/setup-5BYKCL62.js.map +0 -1
  113. /package/dist/cli/{chat-QA6IVFJD.js.map → chat-377YZV56.js.map} +0 -0
  114. /package/dist/cli/{chunk-FY5UERSG.js.map → chunk-2WZT27GR.js.map} +0 -0
  115. /package/dist/cli/{chunk-RCC73DWQ.js.map → chunk-4SBXAHR6.js.map} +0 -0
  116. /package/dist/cli/{chunk-Z663GVUB.js.map → chunk-APOSDBAU.js.map} +0 -0
  117. /package/dist/cli/{chunk-CTRM32BP.js.map → chunk-B5JISV5I.js.map} +0 -0
  118. /package/dist/cli/{chunk-XNMXVL6C.js.map → chunk-FB27YXPX.js.map} +0 -0
  119. /package/dist/cli/{chunk-ARBGTNHM.js.map → chunk-FK7NXDRP.js.map} +0 -0
  120. /package/dist/cli/{chunk-WPY7AFS6.js.map → chunk-I4SH5Z7S.js.map} +0 -0
  121. /package/dist/cli/{chunk-MW64SQUE.js.map → chunk-J26XOB2T.js.map} +0 -0
  122. /package/dist/cli/{chunk-DLTE4GBY.js.map → chunk-J4MYMBJ7.js.map} +0 -0
  123. /package/dist/cli/{chunk-CFJY64UA.js.map → chunk-LRO63VNK.js.map} +0 -0
  124. /package/dist/cli/{chunk-XUZHBQSM.js.map → chunk-MQJR7YQ2.js.map} +0 -0
  125. /package/dist/cli/{chunk-CPCUMMSR.js.map → chunk-NVI4XPOQ.js.map} +0 -0
  126. /package/dist/cli/{chunk-AMSK3ZLB.js.map → chunk-P5SUHDUQ.js.map} +0 -0
  127. /package/dist/cli/{chunk-VVPV5HU6.js.map → chunk-RRZIIMAF.js.map} +0 -0
  128. /package/dist/cli/{chunk-OMNRXZNA.js.map → chunk-URAI4YRL.js.map} +0 -0
  129. /package/dist/cli/{chunk-6QBUXA73.js.map → chunk-V4AXMN4X.js.map} +0 -0
  130. /package/dist/cli/{code-WN6D4VZO.js.map → code-JPFZJYVW.js.map} +0 -0
  131. /package/dist/cli/{commands-DHETOY7O.js.map → commands-IUL2CLKH.js.map} +0 -0
  132. /package/dist/cli/{commit-BBUYAKZV.js.map → commit-JT7LYBTL.js.map} +0 -0
  133. /package/dist/cli/{config-KV7VV5LG.js.map → config-T4RWI5NG.js.map} +0 -0
  134. /package/dist/cli/{doctor-GI5LOEZL.js.map → devtools-O5HOMAGZ.js.map} +0 -0
  135. /package/dist/cli/{prompt-ATI7DKHF.js.map → doctor-OMAYGY4F.js.map} +0 -0
  136. /package/dist/cli/{events-LBKMLFM4.js.map → events-5IVFJ4H3.js.map} +0 -0
  137. /package/dist/cli/{mcp-DKEJK5ND.js.map → mcp-ECGJACAP.js.map} +0 -0
  138. /package/dist/cli/{mcp-inspect-MTABNHVM.js.map → mcp-inspect-ZIMNRG7G.js.map} +0 -0
  139. /package/dist/cli/{stats-OFCGOQMZ.js.map → prompt-JCC3A7AA.js.map} +0 -0
  140. /package/dist/cli/{prune-sessions-YQQSZTZS.js.map → prune-sessions-TE4BJYO2.js.map} +0 -0
  141. /package/dist/cli/{run-HFPRNWJY.js.map → run-ABQYOPVM.js.map} +0 -0
  142. /package/dist/cli/{sessions-IQEWWUH3.js.map → sessions-YBPRGIAF.js.map} +0 -0
  143. /package/dist/cli/{version-EODUFAAI.js.map → version-JD6QSM4X.js.map} +0 -0
@@ -1,20 +1,20 @@
1
- import{r as l,j as e,c as Yn}from"./vendor-react.js";import"./vendor-katex.js";import{F as Qn,P as Zn,h as Xn,e as es,a as ts,b as Ft,D as ns,T as ss,f as as,g as is,I as rs,S as os,E as ls,C as At,c as Pt,d as cs}from"./vendor-icons.js";import{H as ds}from"./vendor-prism.js";import{M as us,r as ps,b as ms,a as hs,c as gs}from"./vendor-markdown.js";const fs="modulepreload",bs=function(t){return"/"+t},$t={},xs=function(n,s,i){let r=Promise.resolve();if(s&&s.length>0){document.getElementsByTagName("link");const d=document.querySelector("meta[property=csp-nonce]"),p=d?.nonce||d?.getAttribute("nonce");r=Promise.allSettled(s.map(h=>{if(h=bs(h),h in $t)return;$t[h]=!0;const g=h.endsWith(".css"),k=g?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${h}"]${k}`))return;const v=document.createElement("link");if(v.rel=g?"stylesheet":fs,g||(v.as="script"),v.crossOrigin="",v.href=h,p&&v.setAttribute("nonce",p),document.head.appendChild(v),g)return new Promise((f,m)=>{v.addEventListener("load",f),v.addEventListener("error",()=>m(new Error(`Unable to preload CSS for ${h}`)))})}))}function o(d){const p=new Event("vite:preloadError",{cancelable:!0});if(p.payload=d,window.dispatchEvent(p),!p.defaultPrevented)throw d}return r.then(d=>{for(const p of d||[])p.status==="rejected"&&o(p.reason);return n().catch(o)})},Je=new Map;let We=0,we=1;const ys=document.querySelector('meta[name="reasonix-mode"]'),ft=ys?.getAttribute("content")??"",Mt=ft!==""&&ft!=="__REASONIX_MODE__",on=Mt?"server":"mock",ln=Mt;console.log(`[tauri-bridge] mode=${on}${Mt?` mode="${ft}"`:""}`);function ks(t,n){const s=Je.get(t);if(s)for(const i of s)i({payload:n,event:t})}function D(t){ks("rpc:event",{data:JSON.stringify(t)})}let Te=null,Ge=!1,Ve=0;const ws=10,vs=1e3;let Ut=!1;function Kt(t){Ut!==t&&(Ut=!t,D(t?{type:"status",text:"连接已恢复",tabId:"tab-1"}:{type:"status",text:"正在重连…",tabId:"tab-1"}))}function js(t){const n=[];switch(t.kind){case"assistant_delta":{Ge||(Ge=!0,we++,n.push({type:"model.turn.started",tabId:"tab-1",id:t.id,turn:we,model:"deepseek-reasoner"})),t.contentDelta&&n.push({type:"model.delta",tabId:"tab-1",channel:"content",text:t.contentDelta,turn:we}),t.reasoningDelta&&n.push({type:"model.delta",tabId:"tab-1",channel:"reasoning",text:t.reasoningDelta,turn:we});break}case"assistant_final":{n.push({type:"model.final",tabId:"tab-1",turn:we,content:t.text??"",reasoningContent:t.reasoning??"",usage:t.usage??void 0,costUsd:t.costUsd??void 0});break}case"tool_start":{n.push({type:"tool.preparing",tabId:"tab-1",turn:we,callId:t.id,name:t.toolName}),n.push({type:"tool.intent",tabId:"tab-1",turn:we,callId:t.id,name:t.toolName,args:t.args??""});break}case"tool":{n.push({type:"tool.result",tabId:"tab-1",turn:we,callId:t.id,name:t.toolName,output:t.content,ok:!0});break}case"user":{n.push({type:"user.message",tabId:"tab-1",id:t.id,turn:we,text:t.text});break}case"busy-change":{!t.busy&&Ge&&(n.push({type:"$turn_complete",tabId:"tab-1"}),Ge=!1);break}case"modal-up":{const s=t.modal;s?.kind==="shell"?n.push({type:"$confirm_required",tabId:"tab-1",id:s.id??++We,kind:"run_command",command:s.command}):s?.kind==="choice"?n.push({type:"$choice_required",tabId:"tab-1",id:s.id??++We,question:s.question,options:s.options??[],allowCustom:s.allowCustom??!1}):s?.kind==="plan"?n.push({type:"$plan_required",tabId:"tab-1",id:s.id??++We,plan:s.plan??"",summary:s.summary,steps:s.steps}):s?.kind==="checkpoint"&&n.push({type:"$checkpoint_required",tabId:"tab-1",id:s.id??++We,stepId:s.stepId,title:s.title,result:s.result,notes:s.notes,completed:s.completed,total:s.total});break}case"modal-down":{typeof t.modalKind=="string"&&n.push({type:"$modal_dismissed",tabId:"tab-1",kind:t.modalKind});break}case"warning":case"error":{n.push({type:"$error",tabId:"tab-1",message:t.text});break}case"status":{n.push({type:"status",tabId:"tab-1",text:t.text});break}case"ping":break;default:console.warn("[tauri-bridge] unhandled SSE event kind:",t.kind)}return n}function cn(){Te&&Te.close();const t=document.querySelector('meta[name="reasonix-token"]')?.getAttribute("content")??"",n=t&&t!=="__REASONIX_TOKEN__"?`/api/events?token=${encodeURIComponent(t)}`:"/api/events";Te=new EventSource(n),Te.onmessage=s=>{try{const i=JSON.parse(s.data);if(i.kind==="error"&&i.text?.includes("token")){D({type:"$error",tabId:"tab-1",message:"链接已过期,请重新从 CLI 打开"});return}const r=js(i);for(const o of r)D(o);Ve=0,Kt(!0)}catch(i){console.warn("[tauri-bridge] bad SSE event:",i)}},Te.onerror=()=>{if(console.warn("[tauri-bridge] SSE connection lost, retrying…"),Te?.close(),Te=null,Kt(!1),Ve++,Ve>ws){D({type:"$error",tabId:"tab-1",message:"CLI 已停止,请重新启动"});return}const s=vs*Math.pow(2,Ve-1);setTimeout(cn,Math.min(s,3e4))},Ss()}let ot=null;function Ss(){ot&&clearInterval(ot),ot=setInterval(async()=>{try{const t=await _("overview");if(t?.stats){const n=t.stats;if(n.balance){const i=n.balance[0];i&&D({type:"$balance",tabId:"tab-1",currency:i.currency,total:Number.parseFloat(i.total_balance)||0,isAvailable:!0})}const s=Math.round(n.totalCostUsd>0?n.cacheHitRatio*1e4:0)}}catch{}},5e3)}async function _(t,n){const s=document.querySelector('meta[name="reasonix-token"]')?.getAttribute("content"),i={...n?.headers??{}};s&&s!=="__REASONIX_TOKEN__"&&(i["x-reasonix-token"]=s),n?.body&&!i["content-type"]&&(i["content-type"]="application/json");const r=await fetch(`/api/${t}`,{...n,headers:i});if(r.status===204)return null;const o=await r.text();try{return JSON.parse(o)}catch{return o}}function bt(t,n){D({type:"$settings",tabId:"tab-1",reasoningEffort:t?.reasoningEffort??n?.reasoningEffort??"high",editMode:t?.editMode??n?.editMode??"review",budgetUsd:t?.budgetUsd??n?.budgetUsd??null,workspaceDir:n?.cwd??"",recentWorkspaces:[],model:n?.model??t?.model??"deepseek-v4-flash",editor:"code",webSearchEngine:t?.webSearchEngine??"bing",subagentModels:t?.subagentModels??{},version:n?.version??"",baseUrl:t?.baseUrl??"",apiKeyPrefix:t?.apiKey??""})}function Ns(t,n){const s=new Map;for(const r of n??[])typeof r?.spec=="string"&&s.set(r.spec,r);const i=(t??[]).map(r=>{const o=s.get(r.raw);return{raw:r.raw,name:r.name??null,transport:r.transport,summary:r.summary,parseError:r.parseError,status:o?"connected":r.parseError?"failed":"configured",statusReason:o?void 0:r.parseError,toolCount:o?.toolCount}});D({type:"$mcp_specs",tabId:"tab-1",specs:i,bridged:i.length>0&&i.every(r=>r.status==="connected")})}function Cs(t){const n=[],s=(i,r)=>{for(const o of i??[])n.push({name:o.name,description:o.description??"",scope:r,path:o.path??"",runAs:o.runAs??"inline",model:o.model})};s(t?.builtin,"builtin"),s(t?.global,"global"),s(t?.custom,"global"),s(t?.project,"project"),D({type:"$skills",tabId:"tab-1",items:n})}function Ts(t){D({type:"$memory",tabId:"tab-1",entries:t??[]})}async function xt(){try{const[t,n]=await Promise.all([_("mcp/specs"),_("mcp")]);Ns(t?.specs,n?.servers)}catch(t){console.warn("[tauri-bridge] mcp fetch failed:",t)}}async function dn(){try{const t=await _("skills");t&&Cs(t)}catch(t){console.warn("[tauri-bridge] skills fetch failed:",t)}}async function un(){try{const t=await _("memory/entries");Ts(t?.entries)}catch(t){console.warn("[tauri-bridge] memory fetch failed:",t)}}async function As(t){try{const n=await _(`memory/read?path=${encodeURIComponent(t)}`);n?.detail&&D({type:"$memory_detail",tabId:"tab-1",detail:n.detail})}catch(n){console.warn("[tauri-bridge] memory read failed:",n)}}async function Ps(){document.documentElement.dataset.web="true";let t="";try{const[n,s,i]=await Promise.all([_("settings"),_("sessions"),_("overview")]);if(t=i?.cwd??"",n&&bt(n,i),s?.sessions){const o=s.sessions.map(d=>({name:d.name,messageCount:d.messageCount,mtime:new Date(d.mtime).toISOString(),summary:d.summary}));D({type:"$sessions",tabId:"tab-1",items:o})}const r=i?.stats;if(r?.balance){const o=r.balance[0];o&&D({type:"$balance",tabId:"tab-1",currency:o.currency,total:Number.parseFloat(o.total_balance)||0,isAvailable:!0})}}catch(n){console.warn("[tauri-bridge] server init failed:",n)}Promise.all([xt(),dn(),un()]),D({type:"$ready",tabId:"tab-1"}),D({type:"$tab_opened",tabId:"tab-1",workspaceDir:t,active:!0}),cn()}async function Ms(t){const n=t.cmd;switch(n){case"user_input":{const s=await _("submit",{method:"POST",body:JSON.stringify({prompt:t.text})}).catch(i=>(console.warn("[tauri-bridge] submit failed:",i),null));s?.accepted||D({type:"$error",tabId:"tab-1",message:s?.reason??"提交失败,请重试"});break}case"abort":{await _("abort",{method:"POST"}).catch(()=>{});break}case"session_list":{try{const s=await _("sessions");if(s?.sessions){const i=s.sessions.map(r=>({name:r.name,messageCount:r.messageCount,mtime:new Date(r.mtime).toISOString(),summary:r.summary}));D({type:"$sessions",tabId:"tab-1",items:i})}}catch{}break}case"session_load":{try{const s=await _(`sessions/${encodeURIComponent(t.name)}/switch`,{method:"POST"});if(!s?.ok){console.warn("[tauri-bridge] session switch failed:",t.name,s);break}const i=await _(`sessions/${encodeURIComponent(t.name)}`);if(!Array.isArray(i?.messages)){console.warn("[tauri-bridge] session_load: GET response missing messages",i);break}const r=i.messages,o=new Map;for(const p of r)p?.role==="tool"&&typeof p.toolCallId=="string"&&o.set(p.toolCallId,{content:typeof p.content=="string"?p.content:"",name:typeof p.toolName=="string"?p.toolName:void 0});const d=[];for(const p of r){if(p?.role==="user"){d.push({kind:"user",text:p.content??""});continue}if(p?.role==="assistant"){const h=[];if(typeof p.reasoning=="string"&&p.reasoning.length>0&&h.push({kind:"reasoning",text:p.reasoning}),typeof p.content=="string"&&p.content.length>0&&h.push({kind:"text",text:p.content}),Array.isArray(p.toolCalls))for(const g of p.toolCalls){const k=o.get(g.id);h.push({kind:"tool",callId:g.id,name:g.name||k?.name||"tool",args:g.arguments??"",startedAt:0,result:k?.content,ok:k!=null,durationMs:0})}d.push({kind:"assistant",turn:p.turn??0,segments:h,pending:!1})}}D({type:"$session_loaded",tabId:"tab-1",name:t.name,messages:d,carryover:{totalCostUsd:0,cacheHitTokens:0,cacheMissTokens:0}})}catch(s){console.warn("[tauri-bridge] session load failed:",s)}break}case"session_delete":{try{await _(`sessions/${encodeURIComponent(t.name)}`,{method:"DELETE"});const s=await _("sessions");if(s?.sessions){const i=s.sessions.map(r=>({name:r.name,messageCount:r.messageCount,mtime:new Date(r.mtime).toISOString(),summary:r.summary}));D({type:"$sessions",tabId:"tab-1",items:i})}}catch{}break}case"new_chat":{try{const s=await _("sessions/new",{method:"POST"});if(s?.ok){const i=typeof s.name=="string"?s.name:"default";D({type:"$session_loaded",tabId:"tab-1",name:i,messages:[],carryover:{totalCostUsd:0,cacheHitTokens:0,cacheMissTokens:0}});const r=await _("sessions");if(r?.sessions){const o=r.sessions.map(d=>({name:d.name,messageCount:d.messageCount,mtime:new Date(d.mtime).toISOString(),summary:d.summary}));D({type:"$sessions",tabId:"tab-1",items:o})}}}catch{}break}case"settings_get":{try{const[s,i]=await Promise.all([_("settings"),_("overview")]);s&&bt(s,i)}catch{}break}case"settings_save":{try{await _("settings",{method:"POST",body:JSON.stringify(t)});const[s,i]=await Promise.all([_("settings"),_("overview")]);s&&bt(s,i)}catch{}break}case"setup_save_key":{await _("settings",{method:"POST",body:JSON.stringify({apiKey:t.key})}).catch(()=>{});break}case"confirm_response":{const s=t.kind==="path"?"path":"shell";await _("modal/resolve",{method:"POST",body:JSON.stringify({kind:s,choice:t.response.type})}).catch(()=>{});break}case"choice_response":{const s=t.response;let i;s.type==="pick"?i={kind:"pick",optionId:s.optionId}:s.type==="text"?i={kind:"custom",text:s.text}:i={kind:"cancel"},await _("modal/resolve",{method:"POST",body:JSON.stringify({kind:"choice",choice:i})}).catch(()=>{});break}case"plan_response":{const s=t.response;await _("modal/resolve",{method:"POST",body:JSON.stringify({kind:"plan",choice:s.type,text:s.feedback})}).catch(()=>{});break}case"checkpoint_response":{const s=t.response,i=s.type==="revise"?s.feedback:void 0;await _("modal/resolve",{method:"POST",body:JSON.stringify({kind:"checkpoint",choice:s.type,text:i})}).catch(()=>{});break}case"revision_response":{const s=t.response,i=s.type==="accepted"?"accept":s.type==="rejected"?"reject":null;if(i===null)break;await _("modal/resolve",{method:"POST",body:JSON.stringify({kind:"revision",choice:i})}).catch(()=>{});break}case"jobs_list":{try{const s=await _("usage");s?.jobs&&D({type:"$jobs",tabId:"tab-1",items:s.jobs})}catch{}break}case"mention_query":{try{const s=await _(`files/search?q=${encodeURIComponent(t.query)}&nonce=${t.nonce}`);s&&D({type:"$mention_results",tabId:"tab-1",nonce:t.nonce,query:t.query,results:s.results??[]})}catch{}break}case"mention_preview":{try{const s=await _(`file-read?path=${encodeURIComponent(t.path)}&nonce=${t.nonce}`);s&&D({type:"$mention_preview",tabId:"tab-1",nonce:t.nonce,path:t.path,head:s.head??"",totalLines:s.totalLines??0})}catch{}break}case"qq_status_get":case"qq_connect":case"qq_disconnect":case"qq_config_save":case"tab_activate":case"tab_open":case"tab_close":case"mention_picked":case"btw":break;case"jobs_stop":{try{await _(`jobs/${t.jobId}/stop`,{method:"POST"})}catch{}break}case"jobs_stop_all":{try{await _("jobs/stop-all",{method:"POST"})}catch{}break}case"compact_history":{try{await _("messages/compact",{method:"POST"})}catch{}break}case"retry":{try{await _("submit",{method:"POST",body:JSON.stringify({retry:!0})})}catch{}break}case"skill_run":{const s={name:t.name};t.args&&(s.args=t.args);try{await _("skills/run",{method:"POST",body:JSON.stringify(s)})}catch{}break}case"mcp_specs_get":{await xt();break}case"skills_get":{await dn();break}case"memory_get":{await un();break}case"memory_read":{typeof t.path=="string"&&await As(t.path);break}case"mcp_specs_add":case"mcp_specs_remove":{try{await _("mcp",{method:"POST",body:JSON.stringify({action:n==="mcp_specs_add"?"add":"remove",spec:t.spec})}),await xt()}catch{}break}default:console.warn("[tauri-bridge] unhandled RPC cmd:",n)}}async function ve(t,n){if(console.log(`[tauri-bridge] invoke -> cmd: ${t}${n?" "+JSON.stringify(n):""}`),on==="server"){if(t==="rpc_spawn")return Ps().catch(console.warn),Promise.resolve();if(t==="rpc_send"){const s=JSON.parse(n.line);return s.tabId=s.tabId??"tab-1",Ms(s).catch(console.warn),Promise.resolve()}return t==="open_in_editor"&&console.log("[tauri-bridge] open in editor:",n),Promise.resolve()}if(t==="rpc_spawn")return Is(),Promise.resolve();if(t==="rpc_send"){const s=JSON.parse(n.line);return s.cmd==="user_input"?(D({type:"user.message",tabId:"tab-1",id:Date.now(),ts:new Date().toISOString(),turn:2,text:s.text}),Ls(s.text)):s.cmd==="session_list"?D({type:"$sessions",tabId:"tab-1",items:hn}):s.cmd==="session_load"?D({type:"$session_loaded",tabId:"tab-1",name:s.name,messages:Rs,carryover:{totalCostUsd:.045,cacheHitTokens:2500,cacheMissTokens:1400}}):s.cmd==="new_chat"?D({type:"$session_empty",tabId:"tab-1",name:"desktop-new-session",sizeBytes:0}):s.cmd==="settings_get"&&D({type:"$settings",tabId:"tab-1",...gn}),Promise.resolve()}return t==="open_in_editor"&&console.log("[tauri-bridge] open in editor simulation:",n),Promise.resolve()}async function Ye(t,n){let s=Je.get(t);return s||(s=new Set,Je.set(t,s)),s.add(n),()=>{const i=Je.get(t);i&&i.delete(n)}}function Es(){return{onDragDropEvent:async t=>(console.log("[tauri-bridge] onDragDropEvent (no-op in web)"),()=>{})}}function yt(){return{isMaximized:async()=>!1,minimize:async()=>{console.log("[tauri-bridge] minimize (no-op)")},close:async()=>{console.log("[tauri-bridge] close (no-op)")},toggleMaximize:async()=>{console.log("[tauri-bridge] toggleMaximize (no-op)")},listen:async(t,n)=>()=>{},label:"main"}}async function Et(t){return console.log("[tauri-bridge] dialog open:",t),Promise.resolve("")}async function pn(t){return console.log("[tauri-bridge] dialog save:",t),Promise.resolve("")}async function Be(t){return console.log(`[tauri-bridge] open url -> ${t}`),window.open(t,"_blank"),Promise.resolve()}async function mn(t){return console.log(`[tauri-bridge] open path -> ${t}`),Promise.resolve()}async function Ds(){return console.log("[tauri-bridge] process relaunch (reload page)"),window.location.reload(),Promise.resolve()}const hn=[{name:"desktop-20260520-1",messageCount:8,mtime:new Date().toISOString(),summary:"项目工程模块重构及自适应 UI 设计"},{name:"desktop-20260519-2",messageCount:14,mtime:new Date(Date.now()-864e5).toISOString(),summary:"编写 WebSocket 桥接与 RPC 行协议对接逻辑"},{name:"desktop-20260518-3",messageCount:4,mtime:new Date(Date.now()-1728e5).toISOString(),summary:"测试移动端 TextArea 与 Dynamic Viewport"}],gn={reasoningEffort:"high",editMode:"review",budgetUsd:null,workspaceDir:"",recentWorkspaces:[],model:"deepseek-v4-flash",version:"0.47.2"},Rs=[{kind:"user",text:"你好 Reasonix,帮我列出这个项目的主要技术栈以及前端架构体系。"},{kind:"assistant",turn:1,segments:[{kind:"reasoning",text:"用户询问项目的技术栈和前端架构。"},{kind:"text",text:"你好!**DeepSeek-Reasonix** 是一个以 DeepSeek 为内核的智能代码助手…"}],pending:!1}];function Ls(t){D({type:"status",text:"DeepSeek R1 思考中...",tabId:"tab-1"}),setTimeout(()=>{D({type:"model.turn.started",tabId:"tab-1",id:Date.now(),turn:2,model:"deepseek-reasoner",reasoningEffort:"high"})},600);const n=[`分析用户的输入内容。
1
+ import{r as l,j as e,c as Xn}from"./vendor-react.js";import"./vendor-katex.js";import{F as es,P as ts,h as ns,e as ss,a as as,b as Kt,D as is,T as rs,f as os,g as ls,I as cs,S as ds,E as us,C as Mt,c as Et,d as ps}from"./vendor-icons.js";import{H as ms}from"./vendor-prism.js";import{M as hs,r as gs,b as fs,a as bs,c as xs}from"./vendor-markdown.js";const ys="modulepreload",ks=function(t){return"/"+t},Wt={},ws=function(n,s,i){let r=Promise.resolve();if(s&&s.length>0){document.getElementsByTagName("link");const d=document.querySelector("meta[property=csp-nonce]"),p=d?.nonce||d?.getAttribute("nonce");r=Promise.allSettled(s.map(h=>{if(h=ks(h),h in Wt)return;Wt[h]=!0;const g=h.endsWith(".css"),k=g?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${h}"]${k}`))return;const v=document.createElement("link");if(v.rel=g?"stylesheet":ys,g||(v.as="script"),v.crossOrigin="",v.href=h,p&&v.setAttribute("nonce",p),document.head.appendChild(v),g)return new Promise((f,m)=>{v.addEventListener("load",f),v.addEventListener("error",()=>m(new Error(`Unable to preload CSS for ${h}`)))})}))}function o(d){const p=new Event("vite:preloadError",{cancelable:!0});if(p.payload=d,window.dispatchEvent(p),!p.defaultPrevented)throw d}return r.then(d=>{for(const p of d||[])p.status==="rejected"&&o(p.reason);return n().catch(o)})},Ze=new Map;let Ve=0,we=1;const vs=document.querySelector('meta[name="reasonix-mode"]'),xt=vs?.getAttribute("content")??"",Rt=xt!==""&&xt!=="__REASONIX_MODE__",dn=Rt?"server":"mock",un=Rt;console.log(`[tauri-bridge] mode=${dn}${Rt?` mode="${xt}"`:""}`);function Ss(t,n){const s=Ze.get(t);if(s)for(const i of s)i({payload:n,event:t})}function _(t){Ss("rpc:event",{data:JSON.stringify(t)})}let Te=null,Je=!1,Ye=0;const js=10,Cs=1e3;let Gt=!1;function Vt(t){Gt!==t&&(Gt=!t,_(t?{type:"status",text:"连接已恢复",tabId:"tab-1"}:{type:"status",text:"正在重连…",tabId:"tab-1"}))}function Ns(t){const n=[];switch(t.kind){case"assistant_delta":{Je||(Je=!0,we++,n.push({type:"model.turn.started",tabId:"tab-1",id:t.id,turn:we,model:"deepseek-reasoner"})),t.contentDelta&&n.push({type:"model.delta",tabId:"tab-1",channel:"content",text:t.contentDelta,turn:we}),t.reasoningDelta&&n.push({type:"model.delta",tabId:"tab-1",channel:"reasoning",text:t.reasoningDelta,turn:we});break}case"assistant_final":{n.push({type:"model.final",tabId:"tab-1",turn:we,content:t.text??"",reasoningContent:t.reasoning??"",usage:t.usage??void 0,costUsd:t.costUsd??void 0});break}case"tool_start":{n.push({type:"tool.preparing",tabId:"tab-1",turn:we,callId:t.id,name:t.toolName}),n.push({type:"tool.intent",tabId:"tab-1",turn:we,callId:t.id,name:t.toolName,args:t.args??""});break}case"tool":{n.push({type:"tool.result",tabId:"tab-1",turn:we,callId:t.id,name:t.toolName,output:t.content,ok:!0});break}case"user":{n.push({type:"user.message",tabId:"tab-1",id:t.id,turn:we,text:t.text});break}case"busy-change":{!t.busy&&Je&&(n.push({type:"$turn_complete",tabId:"tab-1"}),Je=!1);break}case"modal-up":{const s=t.modal;s?.kind==="shell"?n.push({type:"$confirm_required",tabId:"tab-1",id:s.id??++Ve,kind:"run_command",command:s.command}):s?.kind==="choice"?n.push({type:"$choice_required",tabId:"tab-1",id:s.id??++Ve,question:s.question,options:s.options??[],allowCustom:s.allowCustom??!1}):s?.kind==="plan"?n.push({type:"$plan_required",tabId:"tab-1",id:s.id??++Ve,plan:s.plan??"",summary:s.summary,steps:s.steps}):s?.kind==="checkpoint"&&n.push({type:"$checkpoint_required",tabId:"tab-1",id:s.id??++Ve,stepId:s.stepId,title:s.title,result:s.result,notes:s.notes,completed:s.completed,total:s.total});break}case"modal-down":{typeof t.modalKind=="string"&&n.push({type:"$modal_dismissed",tabId:"tab-1",kind:t.modalKind});break}case"warning":case"error":{n.push({type:"$error",tabId:"tab-1",message:t.text});break}case"status":{n.push({type:"status",tabId:"tab-1",text:t.text});break}case"ping":break;default:console.warn("[tauri-bridge] unhandled SSE event kind:",t.kind)}return n}function pn(){Te&&Te.close();const t=document.querySelector('meta[name="reasonix-token"]')?.getAttribute("content")??"",n=t&&t!=="__REASONIX_TOKEN__"?`/api/events?token=${encodeURIComponent(t)}`:"/api/events";Te=new EventSource(n),Te.onmessage=s=>{try{const i=JSON.parse(s.data);if(i.kind==="error"&&i.text?.includes("token")){_({type:"$error",tabId:"tab-1",message:"链接已过期,请重新从 CLI 打开"});return}const r=Ns(i);for(const o of r)_(o);Ye=0,Vt(!0)}catch(i){console.warn("[tauri-bridge] bad SSE event:",i)}},Te.onerror=()=>{if(console.warn("[tauri-bridge] SSE connection lost, retrying…"),Te?.close(),Te=null,Vt(!1),Ye++,Ye>js){_({type:"$error",tabId:"tab-1",message:"CLI 已停止,请重新启动"});return}const s=Cs*Math.pow(2,Ye-1);setTimeout(pn,Math.min(s,3e4))},Ts()}let ct=null;function Ts(){ct&&clearInterval(ct),ct=setInterval(async()=>{try{await Ps()}catch{}},5e3)}async function L(t,n){const s=document.querySelector('meta[name="reasonix-token"]')?.getAttribute("content"),i={...n?.headers??{}};s&&s!=="__REASONIX_TOKEN__"&&(i["x-reasonix-token"]=s),n?.body&&!i["content-type"]&&(i["content-type"]="application/json");const r=await fetch(`/api/${t}`,{...n,headers:i});if(r.status===204)return null;const o=await r.text();try{return JSON.parse(o)}catch{return o}}function yt(t,n){_({type:"$settings",tabId:"tab-1",reasoningEffort:t?.reasoningEffort??n?.reasoningEffort??"high",editMode:t?.editMode??n?.editMode??"review",budgetUsd:t?.budgetUsd??n?.budgetUsd??null,workspaceDir:n?.cwd??"",recentWorkspaces:[],model:n?.model??t?.model??"deepseek-v4-flash",editor:"code",webSearchEngine:t?.webSearchEngine??"bing",subagentModels:t?.subagentModels??{},version:n?.version??"",baseUrl:t?.baseUrl??"",apiKeyPrefix:t?.apiKey??""})}function Qe(t,n=0){const s=typeof t=="number"?t:Number(t);return Number.isFinite(s)?s:n}function As(t){return{name:t.name,messageCount:t.messageCount,mtime:new Date(t.mtime).toISOString(),summary:t.summary,workspaceStatus:t.workspaceStatus}}function Be(t){t?.sessions&&_({type:"$sessions",tabId:"tab-1",currentSession:typeof t.currentSession=="string"?t.currentSession:null,items:t.sessions.map(As)})}function Dt(t){const n=t?.stats;if(!n)return;const s=Qe(n.cacheHitTokens),i=Qe(n.cacheMissTokens);_({type:"$session_usage",tabId:"tab-1",totalCostUsd:Qe(n.totalCostUsd),totalPromptTokens:s+i,totalCompletionTokens:Qe(n.totalCompletionTokens),cacheHitTokens:s,cacheMissTokens:i});const r=n.balance?.[0];r&&_({type:"$balance",tabId:"tab-1",currency:r.currency,total:Number.parseFloat(r.total_balance)||0,isAvailable:!0})}async function Ps(){const[t,n]=await Promise.all([L("sessions"),L("overview")]);Be(t),Dt(n)}function Ms(t,n){const s=new Map;for(const r of n??[])typeof r?.spec=="string"&&s.set(r.spec,r);const i=(t??[]).map(r=>{const o=s.get(r.raw);return{raw:r.raw,name:r.name??null,transport:r.transport,summary:r.summary,parseError:r.parseError,status:o?"connected":r.parseError?"failed":"configured",statusReason:o?void 0:r.parseError,toolCount:o?.toolCount}});_({type:"$mcp_specs",tabId:"tab-1",specs:i,bridged:i.length>0&&i.every(r=>r.status==="connected")})}function Es(t){const n=[],s=(i,r)=>{for(const o of i??[])n.push({name:o.name,description:o.description??"",scope:r,path:o.path??"",runAs:o.runAs??"inline",model:o.model})};s(t?.builtin,"builtin"),s(t?.global,"global"),s(t?.custom,"global"),s(t?.project,"project"),_({type:"$skills",tabId:"tab-1",items:n})}function Rs(t){_({type:"$memory",tabId:"tab-1",entries:t??[]})}async function kt(){try{const[t,n]=await Promise.all([L("mcp/specs"),L("mcp")]);Ms(t?.specs,n?.servers)}catch(t){console.warn("[tauri-bridge] mcp fetch failed:",t)}}async function mn(){try{const t=await L("skills");t&&Es(t)}catch(t){console.warn("[tauri-bridge] skills fetch failed:",t)}}async function hn(){try{const t=await L("memory/entries");Rs(t?.entries)}catch(t){console.warn("[tauri-bridge] memory fetch failed:",t)}}async function Ds(t){try{const n=await L(`memory/read?path=${encodeURIComponent(t)}`);n?.detail&&_({type:"$memory_detail",tabId:"tab-1",detail:n.detail})}catch(n){console.warn("[tauri-bridge] memory read failed:",n)}}async function Ls(){document.documentElement.dataset.web="true";let t="";try{const[n,s,i]=await Promise.all([L("settings"),L("sessions"),L("overview")]);t=i?.cwd??"",n&&yt(n,i),Be(s),Dt(i)}catch(n){console.warn("[tauri-bridge] server init failed:",n)}Promise.all([kt(),mn(),hn()]),_({type:"$ready",tabId:"tab-1"}),_({type:"$tab_opened",tabId:"tab-1",workspaceDir:t,active:!0}),pn()}async function Is(t){const n=t.cmd;switch(n){case"user_input":{const s=await L("submit",{method:"POST",body:JSON.stringify({prompt:t.text})}).catch(i=>(console.warn("[tauri-bridge] submit failed:",i),null));s?.accepted||_({type:"$error",tabId:"tab-1",message:s?.reason??"提交失败,请重试"});break}case"abort":{await L("abort",{method:"POST"}).catch(()=>{});break}case"session_list":{try{const s=await L("sessions");Be(s)}catch{}break}case"session_load":{try{const s=await L(`sessions/${encodeURIComponent(t.name)}/switch`,{method:"POST"});if(!s?.ok){console.warn("[tauri-bridge] session switch failed:",t.name,s);break}const i=await L(`sessions/${encodeURIComponent(t.name)}`);if(!Array.isArray(i?.messages)){console.warn("[tauri-bridge] session_load: GET response missing messages",i);break}const r=i.messages,o=new Map;for(const p of r)p?.role==="tool"&&typeof p.toolCallId=="string"&&o.set(p.toolCallId,{content:typeof p.content=="string"?p.content:"",name:typeof p.toolName=="string"?p.toolName:void 0});const d=[];for(const p of r){if(p?.role==="user"){d.push({kind:"user",text:p.content??""});continue}if(p?.role==="assistant"){const h=[];if(typeof p.reasoning=="string"&&p.reasoning.length>0&&h.push({kind:"reasoning",text:p.reasoning}),typeof p.content=="string"&&p.content.length>0&&h.push({kind:"text",text:p.content}),Array.isArray(p.toolCalls))for(const g of p.toolCalls){const k=o.get(g.id);h.push({kind:"tool",callId:g.id,name:g.name||k?.name||"tool",args:g.arguments??"",startedAt:0,result:k?.content,ok:k!=null,durationMs:0})}d.push({kind:"assistant",turn:p.turn??0,segments:h,pending:!1})}}_({type:"$session_loaded",tabId:"tab-1",name:t.name,messages:d,carryover:{totalCostUsd:0,cacheHitTokens:0,cacheMissTokens:0}})}catch(s){console.warn("[tauri-bridge] session load failed:",s)}break}case"session_delete":{try{await L(`sessions/${encodeURIComponent(t.name)}`,{method:"DELETE"});const s=await L("sessions");Be(s)}catch{}break}case"new_chat":{try{const s=await L("sessions/new",{method:"POST"});if(s?.ok){const i=typeof s.name=="string"?s.name:"default";_({type:"$session_loaded",tabId:"tab-1",name:i,messages:[],carryover:{totalCostUsd:0,cacheHitTokens:0,cacheMissTokens:0}});const r=await L("sessions");Be(r);const o=await L("overview");Dt(o)}}catch{}break}case"settings_get":{try{const[s,i]=await Promise.all([L("settings"),L("overview")]);s&&yt(s,i)}catch{}break}case"settings_save":{try{await L("settings",{method:"POST",body:JSON.stringify(t)});const[s,i]=await Promise.all([L("settings"),L("overview")]);s&&yt(s,i)}catch{}break}case"setup_save_key":{await L("settings",{method:"POST",body:JSON.stringify({apiKey:t.key})}).catch(()=>{});break}case"confirm_response":{const s=t.kind==="path"?"path":"shell";await L("modal/resolve",{method:"POST",body:JSON.stringify({kind:s,choice:t.response.type})}).catch(()=>{});break}case"choice_response":{const s=t.response;let i;s.type==="pick"?i={kind:"pick",optionId:s.optionId}:s.type==="text"?i={kind:"custom",text:s.text}:i={kind:"cancel"},await L("modal/resolve",{method:"POST",body:JSON.stringify({kind:"choice",choice:i})}).catch(()=>{});break}case"plan_response":{const s=t.response;await L("modal/resolve",{method:"POST",body:JSON.stringify({kind:"plan",choice:s.type,text:s.feedback})}).catch(()=>{});break}case"checkpoint_response":{const s=t.response,i=s.type==="revise"?s.feedback:void 0;await L("modal/resolve",{method:"POST",body:JSON.stringify({kind:"checkpoint",choice:s.type,text:i})}).catch(()=>{});break}case"revision_response":{const s=t.response,i=s.type==="accepted"?"accept":s.type==="rejected"?"reject":null;if(i===null)break;await L("modal/resolve",{method:"POST",body:JSON.stringify({kind:"revision",choice:i})}).catch(()=>{});break}case"jobs_list":{try{const s=await L("usage");s?.jobs&&_({type:"$jobs",tabId:"tab-1",items:s.jobs})}catch{}break}case"mention_query":{try{const s=await L(`files/search?q=${encodeURIComponent(t.query)}&nonce=${t.nonce}`);s&&_({type:"$mention_results",tabId:"tab-1",nonce:t.nonce,query:t.query,results:s.results??[]})}catch{}break}case"mention_preview":{try{const s=await L(`file-read?path=${encodeURIComponent(t.path)}&nonce=${t.nonce}`);s&&_({type:"$mention_preview",tabId:"tab-1",nonce:t.nonce,path:t.path,head:s.head??"",totalLines:s.totalLines??0})}catch{}break}case"qq_status_get":case"qq_connect":case"qq_disconnect":case"qq_config_save":case"tab_activate":case"tab_open":case"tab_close":case"mention_picked":case"btw":break;case"jobs_stop":{try{await L(`jobs/${t.jobId}/stop`,{method:"POST"})}catch{}break}case"jobs_stop_all":{try{await L("jobs/stop-all",{method:"POST"})}catch{}break}case"compact_history":{try{await L("messages/compact",{method:"POST"})}catch{}break}case"retry":{try{await L("submit",{method:"POST",body:JSON.stringify({retry:!0})})}catch{}break}case"skill_run":{const s={name:t.name};t.args&&(s.args=t.args);try{await L("skills/run",{method:"POST",body:JSON.stringify(s)})}catch{}break}case"mcp_specs_get":{await kt();break}case"skills_get":{await mn();break}case"memory_get":{await hn();break}case"memory_read":{typeof t.path=="string"&&await Ds(t.path);break}case"mcp_specs_add":case"mcp_specs_remove":{try{await L("mcp",{method:"POST",body:JSON.stringify({action:n==="mcp_specs_add"?"add":"remove",spec:t.spec})}),await kt()}catch{}break}default:console.warn("[tauri-bridge] unhandled RPC cmd:",n)}}async function ve(t,n){if(console.log(`[tauri-bridge] invoke -> cmd: ${t}${n?" "+JSON.stringify(n):""}`),dn==="server"){if(t==="rpc_spawn")return Ls().catch(console.warn),Promise.resolve();if(t==="rpc_send"){const s=JSON.parse(n.line);return s.tabId=s.tabId??"tab-1",Is(s).catch(console.warn),Promise.resolve()}return t==="open_in_editor"&&console.log("[tauri-bridge] open in editor:",n),Promise.resolve()}if(t==="rpc_spawn")return Hs(),Promise.resolve();if(t==="rpc_send"){const s=JSON.parse(n.line);return s.cmd==="user_input"?(_({type:"user.message",tabId:"tab-1",id:Date.now(),ts:new Date().toISOString(),turn:2,text:s.text}),Bs(s.text)):s.cmd==="session_list"?_({type:"$sessions",tabId:"tab-1",items:bn}):s.cmd==="session_load"?_({type:"$session_loaded",tabId:"tab-1",name:s.name,messages:qs,carryover:{totalCostUsd:.045,cacheHitTokens:2500,cacheMissTokens:1400}}):s.cmd==="new_chat"?_({type:"$session_empty",tabId:"tab-1",name:"desktop-new-session",sizeBytes:0}):s.cmd==="settings_get"&&_({type:"$settings",tabId:"tab-1",...xn}),Promise.resolve()}return t==="open_in_editor"&&console.log("[tauri-bridge] open in editor simulation:",n),Promise.resolve()}async function Xe(t,n){let s=Ze.get(t);return s||(s=new Set,Ze.set(t,s)),s.add(n),()=>{const i=Ze.get(t);i&&i.delete(n)}}function zs(){return{onDragDropEvent:async t=>(console.log("[tauri-bridge] onDragDropEvent (no-op in web)"),()=>{})}}function wt(){return{isMaximized:async()=>!1,minimize:async()=>{console.log("[tauri-bridge] minimize (no-op)")},close:async()=>{console.log("[tauri-bridge] close (no-op)")},toggleMaximize:async()=>{console.log("[tauri-bridge] toggleMaximize (no-op)")},listen:async(t,n)=>()=>{},label:"main"}}async function Lt(t){return console.log("[tauri-bridge] dialog open:",t),Promise.resolve("")}async function gn(t){return console.log("[tauri-bridge] dialog save:",t),Promise.resolve("")}async function Oe(t){return console.log(`[tauri-bridge] open url -> ${t}`),window.open(t,"_blank"),Promise.resolve()}async function fn(t){return console.log(`[tauri-bridge] open path -> ${t}`),Promise.resolve()}async function _s(){return console.log("[tauri-bridge] process relaunch (reload page)"),window.location.reload(),Promise.resolve()}const bn=[{name:"desktop-20260520-1",messageCount:8,mtime:new Date().toISOString(),summary:"项目工程模块重构及自适应 UI 设计"},{name:"desktop-20260519-2",messageCount:14,mtime:new Date(Date.now()-864e5).toISOString(),summary:"编写 WebSocket 桥接与 RPC 行协议对接逻辑"},{name:"desktop-20260518-3",messageCount:4,mtime:new Date(Date.now()-1728e5).toISOString(),summary:"测试移动端 TextArea 与 Dynamic Viewport"}],xn={reasoningEffort:"high",editMode:"review",budgetUsd:null,workspaceDir:"",recentWorkspaces:[],model:"deepseek-v4-flash",version:"0.47.2"},qs=[{kind:"user",text:"你好 Reasonix,帮我列出这个项目的主要技术栈以及前端架构体系。"},{kind:"assistant",turn:1,segments:[{kind:"reasoning",text:"用户询问项目的技术栈和前端架构。"},{kind:"text",text:"你好!**DeepSeek-Reasonix** 是一个以 DeepSeek 为内核的智能代码助手…"}],pending:!1}];function Bs(t){_({type:"status",text:"DeepSeek R1 思考中...",tabId:"tab-1"}),setTimeout(()=>{_({type:"model.turn.started",tabId:"tab-1",id:Date.now(),turn:2,model:"deepseek-reasoner",reasoningEffort:"high"})},600);const n=[`分析用户的输入内容。
2
2
  `,`用户要求提供自适应 UI 重构的验证指令。
3
- `];let s=1200;n.forEach(r=>{setTimeout(()=>{D({type:"model.delta",tabId:"tab-1",channel:"reasoning",text:r,turn:2})},s),s+=800}),setTimeout(()=>{D({type:"tool.preparing",tabId:"tab-1",name:"list_dir",callId:"call_12345"})},s),s+=500,setTimeout(()=>{D({type:"tool.intent",tabId:"tab-1",name:"list_dir",args:JSON.stringify({DirectoryPath:"d:/AI/workspace/dashboard"}),callId:"call_12345"})},s),s+=1e3,setTimeout(()=>{D({type:"tool.result",tabId:"tab-1",name:"list_dir",ok:!0,output:JSON.stringify([{name:"package.json",sizeBytes:864},{name:"src",isDir:!0}]),callId:"call_12345"})},s),s+=800;const i=[`您的 dashboard 目录结构已确认。在**独立 Mock 开发预览阶段**,
3
+ `];let s=1200;n.forEach(r=>{setTimeout(()=>{_({type:"model.delta",tabId:"tab-1",channel:"reasoning",text:r,turn:2})},s),s+=800}),setTimeout(()=>{_({type:"tool.preparing",tabId:"tab-1",name:"list_dir",callId:"call_12345"})},s),s+=500,setTimeout(()=>{_({type:"tool.intent",tabId:"tab-1",name:"list_dir",args:JSON.stringify({DirectoryPath:"d:/AI/workspace/dashboard"}),callId:"call_12345"})},s),s+=1e3,setTimeout(()=>{_({type:"tool.result",tabId:"tab-1",name:"list_dir",ok:!0,output:JSON.stringify([{name:"package.json",sizeBytes:864},{name:"src",isDir:!0}]),callId:"call_12345"})},s),s+=800;const i=[`您的 dashboard 目录结构已确认。在**独立 Mock 开发预览阶段**,
4
4
  `,"您可以使用 `npm run dev` 启动 Vite 开发服务,\n",`配合 Chrome 设备模拟器或真实手机进行移动端自适应效果验证。
5
- `,"手机端支持侧滑拉出会话抽屉,输入框紧贴虚拟键盘。"];i.forEach(r=>{setTimeout(()=>{D({type:"model.delta",tabId:"tab-1",channel:"content",text:r,turn:2})},s),s+=500}),setTimeout(()=>{D({type:"model.final",tabId:"tab-1",turn:2,content:i.join(""),reasoningContent:n.join(""),costUsd:.002}),D({type:"$turn_complete",tabId:"tab-1"})},s+400)}function Is(){document.documentElement.dataset.web="true",setTimeout(()=>D({type:"$ready",tabId:"tab-1"}),100),setTimeout(()=>{D({type:"$tab_opened",tabId:"tab-1",workspaceDir:"d:\\AI\\workspace",active:!0})},150),setTimeout(()=>D({type:"$settings",tabId:"tab-1",...gn}),200),setTimeout(()=>D({type:"$sessions",tabId:"tab-1",items:hn}),350)}const zs=Object.freeze(Object.defineProperty({__proto__:null,getCurrentWebview:Es,getCurrentWindow:yt,invoke:ve,isWebRuntime:ln,listen:Ye,open:Et,openPath:mn,openUrl:Be,relaunch:Ds,save:pn},Symbol.toStringTag,{value:"Module"})),A={app:{sectionWorkspace:"workspace",sectionObserve:"observe",sectionConfigure:"configure",tabChat:"Chat",tabPlans:"Plans",tabSessions:"Sessions",tabOverview:"Overview",tabUsage:"Usage",tabSystem:"System",tabSemantic:"Semantic",tabTools:"Tools",tabPermissions:"Permissions",tabMcp:"MCP",tabSkills:"Skills",tabMemory:"Memory",tabHooks:"Hooks",tabSettings:"Settings",sectionChanges:"Changes",tabChanges:"Changes",footer:"127.0.0.1 only · token-gated",themeToggle:"Toggle theme",themeLight:"Light",themeDark:"Dark",skill:{scope:{builtin:"Built-in",global:"Global",project:"Project"},runAs:{subagent:"Subagent",inline:"Inline"},generic:"Skill"},exportReasoningSummary:"Reasoning Summary",exportToolLabel:"Tool Calls",exportUserLabel:"User Messages",empty:{currentWorkspace:"Current workspace",selectWorkspace:"Select a workspace to get started",suggestion0:"Start a new conversation",suggestion1:"Open settings",suggestion2:"View overview",suggestion3:"Browse sessions",welcome:"Welcome to Reasonix"},errorLabel:"Error",connecting:"Connecting…",session:{format:"Session",new:"New Session"},setup:{choose:"Choose a workspace",description:"Select a workspace to start working",notSelected:"No workspace selected",saveAndStart:"Save & Start",welcome:"Welcome",workspace:"Workspace"},tab:{newTab:"+ New Tab",newTabTitle:"Open a new tab"},titlebar:{clearChat:"Clear Chat",close:"Close",commandPalette:"Command Palette",contextPanel:"Context Panel",copyMd:"Copy as Markdown",exportMd:"Export as Markdown",maximize:"Maximize",minimize:"Minimize",more:"More",restore:"Restore",settings:"Settings",sidebar:"Sidebar",windowControls:"Window Controls"},toast:{cleared:"Chat cleared",copied:"Copied to clipboard",copiedMd:"Copied as Markdown",emptySession:"No messages to export",exportDialogTitle:"Export Chat",exportedMd:"Exported as Markdown",exportFailed:"Export failed",langSwitched:"Language switched",modelSwitched:"Model → {model}",effortSwitched:"Effort → {effort}",modeSwitched:"Mode switched",newSession:"New session created"},yolo:{toast:"YOLO mode enabled"},cmd:{abort:"Abort",btw:"BTW",clearChat:"Clear Chat",compact:"Compact",copyLast:"Copy Last",exportMd:"Export as Markdown",feedback:"Feedback",help:"Help",newSession:"New Session",retry:"Retry",switchModel:"Switch Model",toggleCurrency:"Toggle Currency",toggleLang:"Toggle Language",toggleTheme:"Toggle Theme"},header:{abort:"Abort",clickToSelect:"Click to select",copy:"Copy",copyMd:"Copy as Markdown",export:"Export",exportMd:"Export as Markdown",newChat:"New Chat",noWorkspace:"No workspace",running:"Running…"},jumpToBottom:"Jump to bottom",langEN:"English",langZH:"中文",splashSubtitle:"AI-powered coding assistant"},changes:{chatPlaceholder:"Ask about your code...",chatWelcome:"Changes — ask questions about your project files.",chatSend:"Send",viewerPlaceholder:"Select a file to view",treeEmpty:"(empty)",tabClose:"Close tab",newConversation:"New",clearConversation:"Clear",newTitle:"/new — wipe conversation context",clearTitle:"/clear — wipe visible scrollback",newConfirmBusy:"A turn is in flight. Abort and start a new conversation?",newConfirm:"Clear current conversation and start fresh?",newToast:"new conversation",clearToast:"scrollback cleared",newFailed:"/new failed: {error}",clearFailed:"/clear failed: {error}",chatSendBtn:"Send",fileTreeTitle:"Files",codeViewerTitle:"Code Viewer",chatPanelTitle:"Chat",loadingFiles:"Loading project files…",review:"Review",allFiles:"All Files",changes:"changes",commentLabel:"Commenting on line",commentPlaceholder:"Add a comment…",commentCancel:"Cancel",commentSubmit:"Comment",commentLine:"Line",commentEdit:"Edit",commentDelete:"Delete",diffSourceGit:"Git changes",diffSourceSession:"Previous session",diffSourceCheckpoint:"Checkpoint",checkpointEmpty:"No checkpoints in this workspace yet.",restoreBtn:"Restore",restoreConfirm:'Restore "{name}"? This will overwrite current files.',deleteBtn:"Delete",deleteConfirm:'Delete checkpoint "{name}"? Snapshot will be removed, files stay unchanged.',createBtn:"Snapshot",createPlaceholder:"name for snapshot…",backToList:"back to list",reviewEmpty:"No pending reviews.",diffStyleUnified:"Unified",diffStyleSplit:"Split",expandAll:"Expand all",collapseAll:"Collapse all",createFailed:"create failed",restoreFailed:"restore failed",deleteFailed:"delete failed"},common:{loading:"loading…",loadingFailed:"{name} failed: {error}",back:"← back",save:"Save",remove:"remove",cancel:"Cancel",delete:"Delete",add:"Add",confirm:"Confirm",noData:"No {name} yet.",all:"all",yes:"yes",no:"no",on:"ON",off:"off",enabled:"enabled",disabled:"disabled"},settings:{title:"Settings",loading:"loading settings…",saved:"saved: {fields}",sectionApi:"DeepSeek API",apiKey:"API key",apiKeyNotSet:"Not set",apiKeySave:"Save key",apiKeySet:"Set",apiSection:"API Configuration",notSet:"(not set)",replace:"replace",pasteKey:"paste a fresh sk-… token",saveKey:"Save key",baseUrl:"base url",baseUrlPlaceholder:"https://api.deepseek.com (default)",baseUrlHint:"Base URL for API requests",sectionDefaults:"Defaults",effortSection:"Reasoning effort",modelCustom:"Custom model id",modelCustomHint:"Any OpenAI-compatible id your endpoint serves (vLLM, Ollama, Together, …).",modelCustomActive:"Currently running on a custom id: {model}",appliesNextTurn:"applies next turn",effort:"effort",effortMax:"max (DeepSeek extension — rejected by stock OpenAI / vLLM)",effortHigh:"high (safe default — vLLM / Azure compatible)",effortMedium:"medium",effortLow:"low (fastest)",webSearch:"web search",webSearchNote:"web_fetch + web_search tools",webSearchEngine:"search engine",webSearchEngineBing:"bing — default, works from CN without proxy",webSearchEngineSearxng:"searxng — self-hosted (set endpoint via /se searxng <url>)",webSearchEngineMetaso:"metaso — 100/day free (CN-friendly, free key at metaso.cn)",webSearchEngineTavily:"tavily — 1000/mo free (set TAVILY_API_KEY)",webSearchEnginePerplexity:"perplexity — AI-native (set PERPLEXITY_API_KEY)",webSearchEngineExa:"exa — AI-native 1000/mo free (set EXA_API_KEY)",webSearchEngineNote:"applies to the next web_search call",sectionBudget:"Budget",budget:"Budget",budgetHint:"Set spending limits",budgetPlaceholder:"Enter budget amount",budgetOf:"of",budgetSetCap:"set a cap",budgetCustom:"custom",budgetBumpHint:"bump the cap to keep going",budgetClear:"Clear cap",budgetIdleLine:"warns at 80% · refuses past 100%",budgetWarnLine:"approaching cap — loop will refuse past 100%",budgetRefusing:"cap exhausted — next turn refused until bumped or cleared",sectionLoop:"Loop",loopIdleHint:"Auto-resubmit a prompt on a fixed interval.",loopCostHint:"Each iteration costs ~{cost} (last turn).",loopInterval:"interval",loopCustom:"custom",loopRangeError:"interval must fall in 5s..6h",loopPrompt:"prompt",loopPromptPlaceholder:"e.g. check the deploy status and report any errors",loopStart:"Start loop",loopStop:"Stop",loopRunning:"running",loopIter:"iter {iter}",loopFiresIn:"fires in {remaining}",sectionSkills:"Skills",skillPaths:"skill paths",skillPathsPlaceholder:"/path/to/skills-a, /path/to/skills-b",skillPathsNote:"comma-separated · next /new or new session",skillsEmpty:"No skills loaded",skillsLoaded:"Skills loaded",subagentModelFlash:"flash",subagentModelPro:"pro",subagentModelHint:"Model used when this skill spawns its isolated subagent",sectionRuntime:"Runtime",activeModel:"active model",model:"Model",modelFlashDesc:"Flash — always flash",modelProDesc:"Pro — always pro",modelPricingLine:"${hit} hit · ${miss} miss · ${out} out per 1M tok",editMode:"edit mode",editModeNote:"switch from the Chat tab header",editModeHint:"Configure edit mode",showSystemEvents:"system events",showSystemEventsHint:"Show quiet inline notices for context compaction, abort, rate-limit.",shown:"shown",hidden:"hidden",sectionLanguage:"Language",language:"language",languageHint:"Switch language",langEn:"English",langZhCn:"简体中文",appMode:"App mode",appearanceSection:"Appearance",behaviorSection:"Behavior",ruleAutoApprovalHint:"Configure auto-approval rules",ruleAutoApprovalSection:"Auto-approval Rules",theme:"Theme",themeDark:"Dark",themeHint:"Switch between light and dark themes",themeLight:"Light",themeStyle:"Theme style",themeStyleHint:"Choose theme style",themeStyleGraphite:"Graphite",themeStyleGraphiteDesc:"Cool dark neutrals — best for long sessions.",themeStyleSandstone:"Sandstone",themeStyleSandstoneDesc:"Warm light tones — easy on bright rooms.",themeStylePorcelain:"Porcelain",themeStylePorcelainDesc:"Clean light with extra contrast.",themeStyleMidnight:"Midnight",themeStyleMidnightDesc:"Deep dark with cooler highlights.",pageGeneralLabel:"General",pageGeneralDesc:"Theme, fonts, language and workspace.",pageModelsLabel:"Models",pageModelsDesc:"Default model and reasoning effort.",pageMcpLabel:"MCP servers",pageMcpDesc:"Connect external tool servers.",pageSkillsLabel:"Skills",pageSkillsDesc:"User-defined skills you can run with /skill.",pageMemoryLabel:"Memory",pageMemoryDesc:"Long-lived notes carried across sessions.",pageRulesLabel:"Rules",pageRulesDesc:"Auto-approval rules for shell + path access.",pageBillingLabel:"Billing",pageBillingDesc:"API key, balance and per-session budget.",pageShortcutsLabel:"Shortcuts",pageShortcutsDesc:"Keyboard shortcuts reference.",fontFamily:"Font family",fontFamilyHint:"Choose font family",fontFamilySans:"Sans-serif",fontFamilySerif:"Serif",fontFamilySystem:"System",fontScale:"Font scale",fontScaleHint:"Adjust font size",fontScaleLarge:"Large",fontScaleMedium:"Medium",fontScaleSmall:"Small",currentWorkspace:"Current workspace",defaultModelCurrent:"Current model",editor:"Editor",editorHint:"Configure editor preferences",maxOutput:"Max output",reasoningEffort:"Reasoning effort",reasoningEffortHint:"Adjust reasoning depth",sessionCost:"Session cost",balanceAvailable:"Available",balanceLabel:"Balance",balanceLow:"Low balance",cacheHitRate:"Cache hit rate",ctxWindow:"Context window",notSelected:"Not selected",parseError:"Parse error",workspaceChange:"Change",workspaceSection:"Workspace",mcpAdd:"Add",mcpAddSection:"Add MCP Server",mcpBridged:"Bridged",mcpConfigured:"Configured",mcpEmpty:"No MCP servers",mcpNotBridged:"Not bridged",mcpRemove:"Remove",mcpSpecFormat:"JSON format",mcpSpecLabel:"Server spec",memoryDesc:"Configure memory settings",memorySection:"Memory",shortcutAbort:"Abort",shortcutCloseTab:"Close Tab",shortcutCommandPalette:"Command Palette",shortcutFocusComposer:"Focus Composer",shortcutNewChat:"New Chat",shortcutNewTab:"New Tab",shortcutSettings:"Settings",shortcutSwitchTab:"Switch Tab",qqAccessAllowlist:"Allowlist",qqAccessOpen:"Open",qqAccessOwner:"Owner",qqAccessOwnerWithAllowlist:"Owner + Allowlist",qqAccessRuntime:"Runtime",qqAppId:"App ID",qqApplyAction:"Apply",qqApplyLabel:"Apply",qqAppSecret:"App Secret",qqBack:"Back",qqConfigure:"Configure",qqConfigureHint:"Set up QQ integration",qqConfigureTitle:"QQ Configuration",qqConnected:"Connected",qqConnecting:"Connecting…",qqDisconnected:"Disconnected",qqEnvironment:"Environment",qqFailed:"Failed",qqProduction:"Production",qqSandbox:"Sandbox",qqSave:"Save",qqSaveAndConnect:"Save & Connect",qqSection:"QQ Integration",qqSummaryAppId:"App ID",qqSummaryDetail:"Details",qqSummaryMissing:"Not configured",qqTitle:"QQ Bot"},chat:{modeMirror:"TUI mirror",modeView:"session view",placeholder:"Type a prompt — Enter sends, Shift+Enter for a newline · / @ for pickers",placeholderBusy:"wait for the current turn to finish…",placeholderSteerBusy:"type to steer — commands and pickers are disabled while busy",steerHint:"message steers the current turn (added as instruction)",send:"Send",new:"New",clear:"Clear",newTitle:"/new — wipe conversation context (loop log + scrollback)",clearTitle:"/clear — wipe just visible scrollback (context kept)",noConversation:"No conversation yet. Send a prompt below to begin.",newConfirmBusy:"A turn is in flight. Abort and start a new conversation?",newConfirm:"Clear current conversation and start fresh?",newToast:"new conversation",clearToast:"scrollback cleared",newFailed:"/new failed: {error}",clearFailed:"/clear failed: {error}",eventStreamError:"event stream interrupted — reconnecting…",semanticBanner:"Semantic search isn't enabled for this project.",semanticBannerDesc:'Build the index once and the model can find code by meaning ("where do we handle auth failures?") instead of grep on exact strings.',semanticBannerBtn:"Build it →",semanticBannerDismiss:"dismiss (don't show again)",slashCommands:"slash commands",projectFiles:"project files",effortTitle:"reasoning_effort — applies next turn",effortMaxTitle:"max (DeepSeek extension)",effortHighTitle:"high (safe default — vLLM / Azure compatible)",effortMediumTitle:"medium",effortLowTitle:"low (fastest)",editGateTitle:"edit gate — Shift+Tab cycles in TUI",editReviewTitle:"review — both edits and non-allowlisted shell ask first",editAutoTitle:"auto — edits auto-apply, shell still asks",editYoloTitle:"yolo — edits AND shell auto-run, allowlist bypassed",railSession:"Session",railTurns:"turns",railPromptTok:"prompt tok",railCost:"cost",railCacheHit:"cache hit",railToolBudget:"Tool budget",railSpend:"spend",railActivePlan:"Active plan",railProgress:"progress",statusModel:"model",statusCtx:"ctx",statusCache:"cache",statusTurn:"turn",statusSession:"session",statusBalance:"balance",statusTurns:"{count} turn{s}",waitingStats:"· · · waiting for live stats",inflightPhase:"{phase}",inflightRunning:"running",inflightThinking:"thinking",inflightStreaming:"streaming",inflightWaiting:"waiting",inflightReasoning:"reasoning {count} ch",inflightOut:"out {count} ch",abortBtn:"Abort (Esc)",confirmBtn:"Apply (y)",rejectBtn:"Reject (n)",applyRestBtn:"Apply rest (a)",flipAutoBtn:"Flip to AUTO (A)"},overview:{loading:"loading overview…",failed:"overview failed: {error}",standaloneTitle:"Standalone mode",standaloneDesc:"Read-only disk view. Start /dashboard from inside reasonix code for live session state, MCP, and tools.",cockpit:"Cockpit",balance:"balance",tokens7d:"tokens · 7d",cacheHit:"cache hit",toolCalls24h:"tool calls · 24h",budget:"budget",currentSession:"current session",noSession:"No live session — /dashboard from inside reasonix code to attach.",promptTok:"prompt tok",completionTok:"completion tok",cost:"cost",costTrend:"cost · 14 day",noUsageYet:"no usage yet",dayAvg:"/day avg",recentPlans:"recent plans",noPlans:"No plans yet — submit one with submit_plan.",toolActivity:"tool activity",noToolCalls:"No tool calls yet.",toolsLoaded:"tools loaded",mcpServers:"mcp servers",editMode:"edit mode",version:"Reasonix",workingDir:"Working directory",projectRoot:"project root",noPriorData:"no prior data",stable:"— stable",vsPrior:"{arrow} {pct}% vs prior",active:"active",allUp:"all up",yoloWarning:"all prompts bypassed",checking:"checking",latest:"latest"},usage:{loading:"loading usage…",failed:"usage failed: {error}",records:"{count} records",dailyUsage:"Daily usage",dailyMeta:"cost · cache saved · turns",noData:"No usage data yet — run a turn in reasonix chat / code / run and refresh.",windows:"Rolling windows",colWindow:"window",colTurns:"turns",colCacheHit:"cache hit",colCost:"cost (USD)",colCacheSaved:"cache saved",colVsClaude:"vs Claude",colSaved:"saved",axisTime:"time",axisUsd:"USD",axisTurns:"turns",seriesCost:"cost",seriesCacheSaved:"cache saved",seriesTurns:"turns",mostUsed:"Most used models",colModel:"model"},sessions:{loading:"loading sessions…",failed:"sessions failed: {error}",noSessions:"No saved sessions yet.",filterPlaceholder:"filter sessions",msgs:"msgs",pickHint:"Pick a session on the left to read its transcript.",resumeTitle:"Resume in TUI",resumeDesc:"Mid-session swap requires a restart so the message log can rewind cleanly. Quit your current session, then run:",loadingTranscript:"loading transcript…",emptyTranscript:"empty transcript.",messages:"{count} message{s}",newBtn:"New session",newHint:"Archive the current conversation and start a fresh one",switchBtn:"Switch to this session",deleteBtn:"Delete",deleteConfirm:'Delete session "{name}"? This removes the transcript file and cannot be undone.',cantDeleteActive:"Switch to a different session before deleting this one.",attachRequired:"Live session operations need an attached CLI session. Launch via reasonix chat or open the dashboard from inside a TUI session.",activeChip:"active",activePill:"active"},tools:{loading:"loading tools…",failed:"tools failed: {error}",noTools:"No tools registered.",planMode:"plan mode — writes gated",colTool:"tool",colFlags:"flags",colDesc:"description",readOnly:"read-only",write:"write",flat:"flat",desc:{web_search:"Search the public web. Returns ranked results with title, url, and snippet. Call this when the answer depends on current state — events, prices, releases, real-world status.",web_fetch:"Download a URL and return its visible text content (scripts/styles/nav stripped). Use after web_search when a snippet isn't enough.",run_command:"Run a shell command in the project root; returns combined stdout+stderr. Allowlisted read-only commands run immediately; mutations are gated by user confirmation.",run_background:"Spawn a long-running process and detach. Returns a job id for tailing logs, waiting for completion, or killing. Use for dev servers, watchers, and one-shot long jobs.",job_output:"Read the latest output of a background job. Returns the tail of the buffer and tells you whether the job is still running.",wait_for_job:"Block server-side until a background job finishes, bounded by timeout. Use instead of polling job_output in a loop.",stop_job:"Stop a background job. SIGTERM first, SIGKILL after a grace period. Safe to call on an already-exited job.",list_jobs:"List every background job started this session — running and exited — with id, command, pid, and status.",remember:"Save a memory for future sessions. Use when the user states a preference, corrects your approach, shares a non-obvious fact, or asks you to remember something.",forget:"Delete a memory file and remove it from MEMORY.md. Use when the user asks to forget something or a remembered fact is now wrong.",recall_memory:"Read the full body of a memory file when its one-line summary isn't enough detail.",read_file:"Read a file under the sandbox root. Supports head/tail/range scoping to save context. Auto-returns a preview for files over 200 lines.",list_directory:"List entries in a directory. Returns one line per entry, marking directories with a trailing slash.",directory_tree:"Recursively list entries in a directory as an indented tree. Budget-aware with auto-collapse for large subtrees.",search_files:"Find files whose NAME matches a substring or regex. Case-insensitive. Skips dependency/build directories by default.",search_content:"Recursively grep file CONTENTS for a substring or regex. Returns matches in path:line:text format. The right tool for finding references.",glob:"List files matching a glob pattern, sorted by mtime. Default limit 200, max 1000. Skips node_modules/.git/dist by default.",get_file_info:"Stat a path under the sandbox root. Returns type, size in bytes, and mtime.",write_file:"Create or overwrite a file with the given content. Parent directories are created as needed.",edit_file:"Apply a SEARCH/REPLACE edit to an existing file. The search must match exactly and be unique in the file.",multi_edit:"Apply N SEARCH/REPLACE edits across one or more files atomically. If any edit fails, no files are written.",create_directory:"Create a directory (and any missing parents) under the sandbox root.",move_file:"Rename or move a file or directory under the sandbox root.",delete_file:"Delete one file under the sandbox root. Refuses directories — use delete_directory for those.",delete_directory:"Recursively delete a directory under the sandbox root. Pass recursive:false to refuse non-empty directories.",copy_file:"Copy a file or directory under the sandbox root. Refuses to overwrite an existing destination.",submit_plan:"Submit one concrete plan for a review gate. Use for multi-file refactors, architecture changes, or anything expensive to undo.",mark_step_complete:"Mark one step of the approved plan as done. Call exactly once after finishing each step.",revise_plan:"Surgically replace the remaining steps of an in-flight plan. Done steps are never touched.",run_skill:"Invoke a playbook from the Skills index. Pass the bare skill name. Subagent-tagged skills spawn an isolated subagent.",spawn_subagent:"Spawn an isolated subagent for a self-contained subtask. Use for parallel fan-out or when the work needs many file reads.",todo_write:"In-session task tracker for multi-step work. Replaces the entire list every call. No approval gate or file writes.",ask_choice:"Present 2-6 alternatives to the user. Use when the user asks for options or you need a preference decision.",create_skill:"Scaffold a new skill the user can invoke later via /skill. Supports inline and subagent run modes.",add_mcp_server:"Register a new MCP server in the user's config. Takes effect on the next session. Supports stdio, SSE, and streamable-http."}},permissions:{loading:"loading permissions…",failed:"permissions failed: {error}",yoloTitle:"YOLO mode",yoloDesc:"Every shell command auto-runs, allowlist bypassed. Switch back with /mode review in the TUI.",project:"project",builtin:"builtin",addPrefix:"add a prefix",addPlaceholder:'e.g. "npm run build" or "deploy.sh"',clearAll:"Clear all",alreadyIn:"{prefix} already in list",added:"added: {prefix}",removed:"removed: {prefix}",cleared:"cleared {count} entr{y}",removeConfirm:`Remove "{prefix}" from this project's allowlist?`,clearConfirm:"Wipe every project allowlist entry? Builtin entries are unaffected.",projectAllowlist:"Project allowlist · {count}",nothingStored:"Nothing stored yet for this project.",colNum:"#",colPrefix:"prefix",builtinTitle:"Builtin · {count} · read-only",standaloneWarning:"Mutations require /dashboard from inside an active reasonix code session — standalone reasonix dashboard can't tell which project's allowlist to edit."},mcp:{loading:"loading MCP…",servers:"MCP servers · {count} bridged",all:"all",live:"live",unbridged:"unbridged",specPlaceholder:"spec — e.g. fs=npx -y @modelcontextprotocol/...",saved:"saved",savedRestart:"saved — restart reasonix code to bridge this server",removed:"removed — restart to drop the live bridge",removeConfirm:`Remove MCP spec from config?
5
+ `,"手机端支持侧滑拉出会话抽屉,输入框紧贴虚拟键盘。"];i.forEach(r=>{setTimeout(()=>{_({type:"model.delta",tabId:"tab-1",channel:"content",text:r,turn:2})},s),s+=500}),setTimeout(()=>{_({type:"model.final",tabId:"tab-1",turn:2,content:i.join(""),reasoningContent:n.join(""),costUsd:.002}),_({type:"$turn_complete",tabId:"tab-1"})},s+400)}function Hs(){document.documentElement.dataset.web="true",setTimeout(()=>_({type:"$ready",tabId:"tab-1"}),100),setTimeout(()=>{_({type:"$tab_opened",tabId:"tab-1",workspaceDir:"d:\\AI\\workspace",active:!0})},150),setTimeout(()=>_({type:"$settings",tabId:"tab-1",...xn}),200),setTimeout(()=>_({type:"$sessions",tabId:"tab-1",items:bn}),350)}const Os=Object.freeze(Object.defineProperty({__proto__:null,getCurrentWebview:zs,getCurrentWindow:wt,invoke:ve,isWebRuntime:un,listen:Xe,open:Lt,openPath:fn,openUrl:Oe,relaunch:_s,save:gn},Symbol.toStringTag,{value:"Module"})),A={app:{sectionWorkspace:"workspace",sectionObserve:"observe",sectionConfigure:"configure",tabChat:"Chat",tabPlans:"Plans",tabSessions:"Sessions",tabOverview:"Overview",tabUsage:"Usage",tabSystem:"System",tabSemantic:"Semantic",tabTools:"Tools",tabPermissions:"Permissions",tabMcp:"MCP",tabSkills:"Skills",tabMemory:"Memory",tabHooks:"Hooks",tabSettings:"Settings",sectionChanges:"Changes",tabChanges:"Changes",footer:"127.0.0.1 only · token-gated",themeToggle:"Toggle theme",themeLight:"Light",themeDark:"Dark",skill:{scope:{builtin:"Built-in",global:"Global",project:"Project"},runAs:{subagent:"Subagent",inline:"Inline"},generic:"Skill"},exportReasoningSummary:"Reasoning Summary",exportToolLabel:"Tool Calls",exportUserLabel:"User Messages",empty:{currentWorkspace:"Current workspace",selectWorkspace:"Select a workspace to get started",suggestion0:"Start a new conversation",suggestion1:"Open settings",suggestion2:"View overview",suggestion3:"Browse sessions",welcome:"Welcome to Reasonix"},errorLabel:"Error",connecting:"Connecting…",session:{format:"Session",new:"New Session"},setup:{choose:"Choose a workspace",description:"Select a workspace to start working",notSelected:"No workspace selected",saveAndStart:"Save & Start",welcome:"Welcome",workspace:"Workspace"},tab:{newTab:"+ New Tab",newTabTitle:"Open a new tab"},titlebar:{clearChat:"Clear Chat",close:"Close",commandPalette:"Command Palette",contextPanel:"Context Panel",copyMd:"Copy as Markdown",exportMd:"Export as Markdown",maximize:"Maximize",minimize:"Minimize",more:"More",restore:"Restore",settings:"Settings",sidebar:"Sidebar",windowControls:"Window Controls"},toast:{cleared:"Chat cleared",copied:"Copied to clipboard",copiedMd:"Copied as Markdown",emptySession:"No messages to export",exportDialogTitle:"Export Chat",exportedMd:"Exported as Markdown",exportFailed:"Export failed",langSwitched:"Language switched",modelSwitched:"Model → {model}",effortSwitched:"Effort → {effort}",modeSwitched:"Mode switched",newSession:"New session created"},yolo:{toast:"YOLO mode enabled"},cmd:{abort:"Abort",btw:"BTW",clearChat:"Clear Chat",compact:"Compact",copyLast:"Copy Last",exportMd:"Export as Markdown",feedback:"Feedback",help:"Help",newSession:"New Session",retry:"Retry",switchModel:"Switch Model",toggleCurrency:"Toggle Currency",toggleLang:"Toggle Language",toggleTheme:"Toggle Theme"},header:{abort:"Abort",clickToSelect:"Click to select",copy:"Copy",copyMd:"Copy as Markdown",export:"Export",exportMd:"Export as Markdown",newChat:"New Chat",noWorkspace:"No workspace",running:"Running…"},jumpToBottom:"Jump to bottom",langEN:"English",langZH:"中文",splashSubtitle:"AI-powered coding assistant"},changes:{chatPlaceholder:"Ask about your code...",chatWelcome:"Changes — ask questions about your project files.",chatSend:"Send",viewerPlaceholder:"Select a file to view",treeEmpty:"(empty)",tabClose:"Close tab",newConversation:"New",clearConversation:"Clear",newTitle:"/new — wipe conversation context",clearTitle:"/clear — wipe visible scrollback",newConfirmBusy:"A turn is in flight. Abort and start a new conversation?",newConfirm:"Clear current conversation and start fresh?",newToast:"new conversation",clearToast:"scrollback cleared",newFailed:"/new failed: {error}",clearFailed:"/clear failed: {error}",chatSendBtn:"Send",fileTreeTitle:"Files",codeViewerTitle:"Code Viewer",chatPanelTitle:"Chat",loadingFiles:"Loading project files…",review:"Review",allFiles:"All Files",changes:"changes",commentLabel:"Commenting on line",commentPlaceholder:"Add a comment…",commentCancel:"Cancel",commentSubmit:"Comment",commentLine:"Line",commentEdit:"Edit",commentDelete:"Delete",diffSourceGit:"Git changes",diffSourceSession:"Previous session",diffSourceCheckpoint:"Checkpoint",checkpointEmpty:"No checkpoints in this workspace yet.",restoreBtn:"Restore",restoreConfirm:'Restore "{name}"? This will overwrite current files.',deleteBtn:"Delete",deleteConfirm:'Delete checkpoint "{name}"? Snapshot will be removed, files stay unchanged.',createBtn:"Snapshot",createPlaceholder:"name for snapshot…",backToList:"back to list",reviewEmpty:"No pending reviews.",diffStyleUnified:"Unified",diffStyleSplit:"Split",expandAll:"Expand all",collapseAll:"Collapse all",createFailed:"create failed",restoreFailed:"restore failed",deleteFailed:"delete failed"},common:{loading:"loading…",loadingFailed:"{name} failed: {error}",back:"← back",save:"Save",remove:"remove",cancel:"Cancel",delete:"Delete",add:"Add",confirm:"Confirm",noData:"No {name} yet.",all:"all",yes:"yes",no:"no",on:"ON",off:"off",enabled:"enabled",disabled:"disabled"},settings:{title:"Settings",loading:"loading settings…",saved:"saved: {fields}",sectionApi:"DeepSeek API",apiKey:"API key",apiKeyNotSet:"Not set",apiKeySave:"Save key",apiKeySet:"Set",apiSection:"API Configuration",notSet:"(not set)",replace:"replace",pasteKey:"paste a fresh sk-… token",saveKey:"Save key",baseUrl:"base url",baseUrlPlaceholder:"https://api.deepseek.com (default)",baseUrlHint:"Base URL for API requests",sectionDefaults:"Defaults",effortSection:"Reasoning effort",modelCustom:"Custom model id",modelCustomHint:"Any OpenAI-compatible id your endpoint serves (vLLM, Ollama, Together, …).",modelCustomActive:"Currently running on a custom id: {model}",appliesNextTurn:"applies next turn",effort:"effort",effortMax:"max (DeepSeek extension — rejected by stock OpenAI / vLLM)",effortHigh:"high (safe default — vLLM / Azure compatible)",effortMedium:"medium",effortLow:"low (fastest)",webSearch:"web search",webSearchNote:"web_fetch + web_search tools",webSearchEngine:"search engine",webSearchEngineBing:"bing — default, works from CN without proxy",webSearchEngineSearxng:"searxng — self-hosted (set endpoint via /se searxng <url>)",webSearchEngineMetaso:"metaso — 100/day free (CN-friendly, free key at metaso.cn)",webSearchEngineTavily:"tavily — 1000/mo free (set TAVILY_API_KEY)",webSearchEnginePerplexity:"perplexity — AI-native (set PERPLEXITY_API_KEY)",webSearchEngineExa:"exa — AI-native 1000/mo free (set EXA_API_KEY)",webSearchEngineBrave:"brave — independent index, 2000/mo free (set BRAVE_SEARCH_API_KEY)",webSearchEngineOllama:"ollama — Ollama cloud web search (set OLLAMA_API_KEY)",webSearchEngineNote:"applies to the next web_search call",sectionBudget:"Budget",budget:"Budget",budgetHint:"Set spending limits",budgetPlaceholder:"Enter budget amount",budgetOf:"of",budgetSetCap:"set a cap",budgetCustom:"custom",budgetBumpHint:"bump the cap to keep going",budgetClear:"Clear cap",budgetIdleLine:"warns at 80% · refuses past 100%",budgetWarnLine:"approaching cap — loop will refuse past 100%",budgetRefusing:"cap exhausted — next turn refused until bumped or cleared",sectionLoop:"Loop",loopIdleHint:"Auto-resubmit a prompt on a fixed interval.",loopCostHint:"Each iteration costs ~{cost} (last turn).",loopInterval:"interval",loopCustom:"custom",loopRangeError:"interval must fall in 5s..6h",loopPrompt:"prompt",loopPromptPlaceholder:"e.g. check the deploy status and report any errors",loopStart:"Start loop",loopStop:"Stop",loopRunning:"running",loopIter:"iter {iter}",loopFiresIn:"fires in {remaining}",sectionSkills:"Skills",skillPaths:"skill paths",skillPathsPlaceholder:"/path/to/skills-a, /path/to/skills-b",skillPathsNote:"comma-separated · next /new or new session",skillsEmpty:"No skills loaded",skillsLoaded:"Skills loaded",subagentModelFlash:"flash",subagentModelPro:"pro",subagentModelHint:"Model used when this skill spawns its isolated subagent",sectionRuntime:"Runtime",activeModel:"active model",model:"Model",modelFlashDesc:"Flash — always flash",modelProDesc:"Pro — always pro",modelPricingLine:"${hit} hit · ${miss} miss · ${out} out per 1M tok",editMode:"edit mode",editModeNote:"switch from the Chat tab header",editModeHint:"Configure edit mode",showSystemEvents:"system events",showSystemEventsHint:"Show quiet inline notices for context compaction, abort, rate-limit.",shown:"shown",hidden:"hidden",sectionLanguage:"Language",language:"language",languageHint:"Switch language",langEn:"English",langZhCn:"简体中文",appMode:"App mode",appearanceSection:"Appearance",behaviorSection:"Behavior",ruleAutoApprovalHint:"Configure auto-approval rules",ruleAutoApprovalSection:"Auto-approval Rules",theme:"Theme",themeDark:"Dark",themeHint:"Switch between light and dark themes",themeLight:"Light",themeStyle:"Theme style",themeStyleHint:"Choose theme style",themeStyleGraphite:"Graphite",themeStyleGraphiteDesc:"Cool dark neutrals — best for long sessions.",themeStyleSandstone:"Sandstone",themeStyleSandstoneDesc:"Warm light tones — easy on bright rooms.",themeStylePorcelain:"Porcelain",themeStylePorcelainDesc:"Clean light with extra contrast.",themeStyleMidnight:"Midnight",themeStyleMidnightDesc:"Deep dark with cooler highlights.",pageGeneralLabel:"General",pageGeneralDesc:"Theme, fonts, language and workspace.",pageModelsLabel:"Models",pageModelsDesc:"Default model and reasoning effort.",pageMcpLabel:"MCP servers",pageMcpDesc:"Connect external tool servers.",pageSkillsLabel:"Skills",pageSkillsDesc:"User-defined skills you can run with /skill.",pageMemoryLabel:"Memory",pageMemoryDesc:"Long-lived notes carried across sessions.",pageRulesLabel:"Rules",pageRulesDesc:"Auto-approval rules for shell + path access.",pageBillingLabel:"Billing",pageBillingDesc:"API key, balance and per-session budget.",pageShortcutsLabel:"Shortcuts",pageShortcutsDesc:"Keyboard shortcuts reference.",fontFamily:"Font family",fontFamilyHint:"Choose font family",fontFamilySans:"Sans-serif",fontFamilySerif:"Serif",fontFamilySystem:"System",fontScale:"Font scale",fontScaleHint:"Adjust font size",fontScaleLarge:"Large",fontScaleMedium:"Medium",fontScaleSmall:"Small",currentWorkspace:"Current workspace",defaultModelCurrent:"Current model",editor:"Editor",editorHint:"Configure editor preferences",maxOutput:"Max output",reasoningEffort:"Reasoning effort",reasoningEffortHint:"Adjust reasoning depth",sessionCost:"Session cost",balanceAvailable:"Available",balanceLabel:"Balance",balanceLow:"Low balance",cacheHitRate:"Cache hit rate",ctxWindow:"Context window",notSelected:"Not selected",parseError:"Parse error",workspaceChange:"Change",workspaceSection:"Workspace",mcpAdd:"Add",mcpAddSection:"Add MCP Server",mcpBridged:"Bridged",mcpConfigured:"Configured",mcpEmpty:"No MCP servers",mcpNotBridged:"Not bridged",mcpRemove:"Remove",mcpSpecFormat:"JSON format",mcpSpecLabel:"Server spec",memoryDesc:"Configure memory settings",memorySection:"Memory",shortcutAbort:"Abort",shortcutCloseTab:"Close Tab",shortcutCommandPalette:"Command Palette",shortcutFocusComposer:"Focus Composer",shortcutNewChat:"New Chat",shortcutNewTab:"New Tab",shortcutSettings:"Settings",shortcutSwitchTab:"Switch Tab",qqAccessAllowlist:"Allowlist",qqAccessOpen:"Open",qqAccessOwner:"Owner",qqAccessOwnerWithAllowlist:"Owner + Allowlist",qqAccessRuntime:"Runtime",qqAppId:"App ID",qqApplyAction:"Apply",qqApplyLabel:"Apply",qqAppSecret:"App Secret",qqBack:"Back",qqConfigure:"Configure",qqConfigureHint:"Set up QQ integration",qqConfigureTitle:"QQ Configuration",qqConnected:"Connected",qqConnecting:"Connecting…",qqDisconnected:"Disconnected",qqEnvironment:"Environment",qqFailed:"Failed",qqProduction:"Production",qqSandbox:"Sandbox",qqSave:"Save",qqSaveAndConnect:"Save & Connect",qqSection:"QQ Integration",qqSummaryAppId:"App ID",qqSummaryDetail:"Details",qqSummaryMissing:"Not configured",qqTitle:"QQ Bot"},chat:{modeMirror:"TUI mirror",modeView:"session view",placeholder:"Type a prompt — Enter sends, Shift+Enter for a newline · / @ for pickers",placeholderBusy:"wait for the current turn to finish…",placeholderSteerBusy:"type to steer — commands and pickers are disabled while busy",steerHint:"message steers the current turn (added as instruction)",send:"Send",new:"New",clear:"Clear",newTitle:"/new — wipe conversation context (loop log + scrollback)",clearTitle:"/clear — wipe just visible scrollback (context kept)",noConversation:"No conversation yet. Send a prompt below to begin.",newConfirmBusy:"A turn is in flight. Abort and start a new conversation?",newConfirm:"Clear current conversation and start fresh?",newToast:"new conversation",clearToast:"scrollback cleared",newFailed:"/new failed: {error}",clearFailed:"/clear failed: {error}",eventStreamError:"event stream interrupted — reconnecting…",semanticBanner:"Semantic search isn't enabled for this project.",semanticBannerDesc:'Build the index once and the model can find code by meaning ("where do we handle auth failures?") instead of grep on exact strings.',semanticBannerBtn:"Build it →",semanticBannerDismiss:"dismiss (don't show again)",slashCommands:"slash commands",projectFiles:"project files",effortTitle:"reasoning_effort — applies next turn",effortMaxTitle:"max (DeepSeek extension)",effortHighTitle:"high (safe default — vLLM / Azure compatible)",effortMediumTitle:"medium",effortLowTitle:"low (fastest)",editGateTitle:"edit gate — Shift+Tab cycles in TUI",editReviewTitle:"review — both edits and non-allowlisted shell ask first",editAutoTitle:"auto — edits auto-apply, shell still asks",editYoloTitle:"yolo — edits AND shell auto-run, allowlist bypassed",railSession:"Session",railTurns:"turns",railPromptTok:"prompt tok",railCost:"cost",railCacheHit:"cache hit",railToolBudget:"Tool budget",railSpend:"spend",railActivePlan:"Active plan",railProgress:"progress",statusModel:"model",statusCtx:"ctx",statusCache:"cache",statusTurn:"turn",statusSession:"session",statusBalance:"balance",statusTurns:"{count} turn{s}",waitingStats:"· · · waiting for live stats",inflightPhase:"{phase}",inflightRunning:"running",inflightThinking:"thinking",inflightStreaming:"streaming",inflightWaiting:"waiting",inflightReasoning:"reasoning {count} ch",inflightOut:"out {count} ch",abortBtn:"Abort (Esc)",confirmBtn:"Apply (y)",rejectBtn:"Reject (n)",applyRestBtn:"Apply rest (a)",flipAutoBtn:"Flip to AUTO (A)"},overview:{loading:"loading overview…",failed:"overview failed: {error}",standaloneTitle:"Standalone mode",standaloneDesc:"Read-only disk view. Start /dashboard from inside reasonix code for live session state, MCP, and tools.",cockpit:"Cockpit",balance:"balance",tokens7d:"tokens · 7d",cacheHit:"cache hit",toolCalls24h:"tool calls · 24h",budget:"budget",currentSession:"current session",noSession:"No live session — /dashboard from inside reasonix code to attach.",promptTok:"prompt tok",completionTok:"completion tok",cost:"cost",costTrend:"cost · 14 day",noUsageYet:"no usage yet",dayAvg:"/day avg",recentPlans:"recent plans",noPlans:"No plans yet — submit one with submit_plan.",toolActivity:"tool activity",noToolCalls:"No tool calls yet.",toolsLoaded:"tools loaded",mcpServers:"mcp servers",editMode:"edit mode",version:"Reasonix",workingDir:"Working directory",projectRoot:"project root",noPriorData:"no prior data",stable:"— stable",vsPrior:"{arrow} {pct}% vs prior",active:"active",allUp:"all up",yoloWarning:"all prompts bypassed",checking:"checking",latest:"latest"},usage:{loading:"loading usage…",failed:"usage failed: {error}",records:"{count} records",dailyUsage:"Daily usage",dailyMeta:"cost · cache saved · turns",noData:"No usage data yet — run a turn in reasonix chat / code / run and refresh.",windows:"Rolling windows",colWindow:"window",colTurns:"turns",colCacheHit:"cache hit",colCost:"cost (USD)",colCacheSaved:"cache saved",colVsClaude:"vs Claude",colSaved:"saved",axisTime:"time",axisUsd:"USD",axisTurns:"turns",seriesCost:"cost",seriesCacheSaved:"cache saved",seriesTurns:"turns",mostUsed:"Most used models",colModel:"model"},sessions:{loading:"loading sessions…",failed:"sessions failed: {error}",noSessions:"No saved sessions yet.",filterPlaceholder:"filter sessions",msgs:"msgs",pickHint:"Pick a session on the left to read its transcript.",resumeTitle:"Resume in TUI",resumeDesc:"Mid-session swap requires a restart so the message log can rewind cleanly. Quit your current session, then run:",loadingTranscript:"loading transcript…",emptyTranscript:"empty transcript.",messages:"{count} message{s}",newBtn:"New session",newHint:"Archive the current conversation and start a fresh one",switchBtn:"Switch to this session",deleteBtn:"Delete",deleteConfirm:'Delete session "{name}"? This removes the transcript file and cannot be undone.',cantDeleteActive:"Switch to a different session before deleting this one.",attachRequired:"Live session operations need an attached CLI session. Launch via reasonix chat or open the dashboard from inside a TUI session.",activeChip:"active",activePill:"active"},tools:{loading:"loading tools…",failed:"tools failed: {error}",noTools:"No tools registered.",planMode:"plan mode — writes gated",colTool:"tool",colFlags:"flags",colDesc:"description",readOnly:"read-only",write:"write",flat:"flat",desc:{web_search:"Search the public web. Returns ranked results with title, url, and snippet. Call this when the answer depends on current state — events, prices, releases, real-world status.",web_fetch:"Download a URL and return its visible text content (scripts/styles/nav stripped). Use after web_search when a snippet isn't enough.",run_command:"Run a shell command in the project root; returns combined stdout+stderr. Allowlisted read-only commands run immediately; mutations are gated by user confirmation.",run_background:"Spawn a long-running process and detach. Returns a job id for tailing logs, waiting for completion, or killing. Use for dev servers, watchers, and one-shot long jobs.",job_output:"Read the latest output of a background job. Returns the tail of the buffer and tells you whether the job is still running.",wait_for_job:"Block server-side until a background job finishes, bounded by timeout. Use instead of polling job_output in a loop.",stop_job:"Stop a background job. SIGTERM first, SIGKILL after a grace period. Safe to call on an already-exited job.",list_jobs:"List every background job started this session — running and exited — with id, command, pid, and status.",remember:"Save a memory for future sessions. Use when the user states a preference, corrects your approach, shares a non-obvious fact, or asks you to remember something.",forget:"Delete a memory file and remove it from MEMORY.md. Use when the user asks to forget something or a remembered fact is now wrong.",recall_memory:"Read the full body of a memory file when its one-line summary isn't enough detail.",read_file:"Read a file under the sandbox root. Supports head/tail/range scoping to save context. Auto-returns a preview for files over 200 lines.",list_directory:"List entries in a directory. Returns one line per entry, marking directories with a trailing slash.",directory_tree:"Recursively list entries in a directory as an indented tree. Budget-aware with auto-collapse for large subtrees.",search_files:"Find files whose NAME matches a substring or regex. Case-insensitive. Skips dependency/build directories by default.",search_content:"Recursively grep file CONTENTS for a substring or regex. Returns matches in path:line:text format. The right tool for finding references.",glob:"List files matching a glob pattern, sorted by mtime. Default limit 200, max 1000. Skips node_modules/.git/dist by default.",get_file_info:"Stat a path under the sandbox root. Returns type, size in bytes, and mtime.",write_file:"Create or overwrite a file with the given content. Parent directories are created as needed.",edit_file:"Apply a SEARCH/REPLACE edit to an existing file. The search must match exactly and be unique in the file.",multi_edit:"Apply N SEARCH/REPLACE edits across one or more files atomically. If any edit fails, no files are written.",create_directory:"Create a directory (and any missing parents) under the sandbox root.",move_file:"Rename or move a file or directory under the sandbox root.",delete_file:"Delete one file under the sandbox root. Refuses directories — use delete_directory for those.",delete_directory:"Recursively delete a directory under the sandbox root. Pass recursive:false to refuse non-empty directories.",copy_file:"Copy a file or directory under the sandbox root. Refuses to overwrite an existing destination.",submit_plan:"Submit one concrete plan for a review gate. Use for multi-file refactors, architecture changes, or anything expensive to undo.",mark_step_complete:"Mark one step of the approved plan as done. Call exactly once after finishing each step.",revise_plan:"Surgically replace the remaining steps of an in-flight plan. Done steps are never touched.",run_skill:"Invoke a playbook from the Skills index. Pass the bare skill name. Subagent-tagged skills spawn an isolated subagent.",spawn_subagent:"Spawn an isolated subagent for a self-contained subtask. Use for parallel fan-out or when the work needs many file reads.",todo_write:"In-session task tracker for multi-step work. Replaces the entire list every call. No approval gate or file writes.",ask_choice:"Present 2-6 alternatives to the user. Use when the user asks for options or you need a preference decision.",create_skill:"Scaffold a new skill the user can invoke later via /skill. Supports inline and subagent run modes.",add_mcp_server:"Register a new MCP server in the user's config. Takes effect on the next session. Supports stdio, SSE, and streamable-http."}},permissions:{loading:"loading permissions…",failed:"permissions failed: {error}",yoloTitle:"YOLO mode",yoloDesc:"Every shell command auto-runs, allowlist bypassed. Switch back with /mode review in the TUI.",project:"project",builtin:"builtin",addPrefix:"add a prefix",addPlaceholder:'e.g. "npm run build" or "deploy.sh"',clearAll:"Clear all",alreadyIn:"{prefix} already in list",added:"added: {prefix}",removed:"removed: {prefix}",cleared:"cleared {count} entr{y}",removeConfirm:`Remove "{prefix}" from this project's allowlist?`,clearConfirm:"Wipe every project allowlist entry? Builtin entries are unaffected.",projectAllowlist:"Project allowlist · {count}",nothingStored:"Nothing stored yet for this project.",colNum:"#",colPrefix:"prefix",builtinTitle:"Builtin · {count} · read-only",standaloneWarning:"Mutations require /dashboard from inside an active reasonix code session — standalone reasonix dashboard can't tell which project's allowlist to edit."},mcp:{loading:"loading MCP…",servers:"MCP servers · {count} bridged",all:"all",live:"live",unbridged:"unbridged",specPlaceholder:"spec — e.g. fs=npx -y @modelcontextprotocol/...",saved:"saved",savedRestart:"saved — restart reasonix code to bridge this server",removed:"removed — restart to drop the live bridge",removeConfirm:`Remove MCP spec from config?
6
6
 
7
- {spec}`,noServers:"No MCP servers in this session.",tools:"tools",inConfig:"in config · not loaded",unbridgedTitle:"unbridged · in config",removeBtn:"Remove",spec:"spec",whyUnbridged:"Why unbridged?",whyUnbridgedDesc:"This spec lives in your config.json but isn't bridged into the live session. MCP servers attach when reasonix code starts; the dashboard alone can't spawn the child process.",whyUnbridgedHint:"To activate: restart reasonix code, then refresh this dashboard.",bridgeFailed:"Bridge failed",bridgeFailedTitle:"bridge failed · in config",bridgeFailedHint:"Reasonix tried to bridge this server and the attempt errored. Common causes: wrong URL, missing auth header, upstream 404/5xx, missing local command. Fix and restart reasonix code to retry.",pickHint:"Pick an MCP server on the left to inspect tools / resources / prompts.",toolsTitle:"Tools · {count}",resourcesTitle:"Resources · {count}",promptsTitle:"Prompts · {count}",colName:"name",colDesc:"description",colUri:"uri",marketplace:"marketplace",marketplaceSearch:"search the registry…",marketplaceLoading:"loading registry…",marketplaceMore:"load 5 more pages",marketplaceMoreLabel:"load 50 more · showing {shown} / {total}",marketplaceMoreHint:"fetches more pages from the registry",marketplaceMoreCachedHint:"more entries already cached locally",marketplaceExhausted:"all pages loaded",marketplaceExhaustedFull:"showing all {total} entries — registry exhausted",marketplaceCount:"{loaded} loaded · {matched} match · source: {source}{cached}",marketplaceCachedSuffix:" · cached",marketplaceNoMatches:"No matches. Try different terms or load more pages.",marketplaceInstall:"Install",marketplacePickHint:"Pick a server on the left, then Install.",marketplaceInstalled:"installed → {spec}",marketplaceInstalledBridged:"installed + bridged → {spec}",marketplaceAlready:"already installed",marketplaceNeedsEnv:"needs env: {names}",marketplaceSourceTag:"[{source}]",marketplaceNoInstall:"smithery listing — install metadata not exposed; use `npx -y @smithery/cli install {name}` directly",marketplaceFetchOnInstall:"Smithery listing — install detail fetched on Install. http servers map to streamable-http remotes; stdio servers run via @smithery/cli.",marketplaceInstalledBadge:"installed",marketplaceUninstall:"Uninstall",marketplaceEnvTitle:"Required environment variables",marketplaceEnvHint:"Set these in your shell before next `reasonix code` so the bridged server can authenticate.",marketplaceRestartHint:"Spec written to ~/.reasonix/config.json. Restart `reasonix code` to bridge the server (live hot-reload is on the roadmap)."},memory:{loading:"loading memory…",files:"memory · {count} files",exists:"exists",create:"create",noFiles:"No memory files yet.",pickHint:"Pick a memory file on the left.",pickDesc:"Project REASONIX.md is committable; global notes live in ~/.reasonix/memory/.",chars:"{count} chars",saved:"saved {scope}",reloadHint:"re-applied on next /new or session restart"},hooks:{loading:"loading hooks…",resolved:"resolved",eventMatrix:"Event matrix",matrixSub:"{scripts} script{s} × {events} event{s}",noHooks:"No hooks configured. Edit the JSON below to add some.",colScript:"script",noProject:"No active project — open /dashboard from reasonix code to edit project hooks.",saveReload:"Save + Reload",discard:"Discard changes",savedReloaded:"saved + reloaded {scope}",recentRuns:"Recent runs",noRuns:"No hook runs in the recent session log.",colWhen:"when",colPhase:"phase",colHook:"hook",colOutcome:"outcome"},skills:{loading:"loading skills…",filterPlaceholder:"filter skills",project:"project",custom:"custom",global:"global",builtin:"builtin",newSkill:"new skill",noDescription:"(no description)",runs7d:"runs · 7d",pickHint:"Pick a skill on the left, or create a new one above.",readOnlyBuiltin:"read-only · builtin",readOnlyCustom:"read-only · custom path",builtinDesc:"Built-in skills ship with Reasonix; the model picks them up automatically. To customize, create a project- or global-scoped skill with the same name.",saved:"saved {scope}/{name}",deleteConfirm:"Delete skill {scope}/{name}?",reloadHint:"re-loaded on next /new or session restart"},system:{loading:"loading health…",failed:"health failed: {error}",healthChecks:"Health checks",version:"version",checking:"checking",latest:"● latest",outOfDate:"● out of date",versionPending:"version check pending",upToDate:"up to date",latestVer:"latest: {version}",sessions:"sessions",ok:"● ok",memory:"memory",semanticIndex:"semantic index",built:"● built",none:"— none",runIndex:"run reasonix index to build",usageLog:"usage log",backgroundJobs:"background jobs",noSession:"— no session",running:"{count} running",attachHint:"attach a session to see jobs",shellSpawn:"shell + spawn",paths:"paths",home:"home",sessionsPath:"sessions",memoryPath:"memory",semanticPath:"semantic",usagePath:"usage"},plans:{loading:"loading plans…",failed:"plans failed: {error}",noPlans:"No archived plans yet — run a turn that calls submit_plan and mark_step_complete.",filterPlaceholder:"filter plans",active:"active",done:"done",idle:"idle",steps:"steps",pickHint:"Pick a plan on the left.",noTitle:"(no title)",stepTimeline:"Step timeline · {done} / {total}",step:"step {n}"},semantic:{codeRequired:"Semantic — code-mode required",indexBuilt:"index built",noIndex:"no index yet",ready:"ready",setupNeeded:"setup needed",installOllama:"Install Ollama",installOllamaDesc:"Reasonix doesn't run package managers for you. Install Ollama first, then come back:",macWindows:"macOS / Windows:",download:"download from ollama.com/download",linux:"Linux:",refreshHint:"Refresh after install — this panel will offer to start the daemon and pull {model}.",daemon:"Daemon",daemonDesc:"ollama is on your PATH but the HTTP daemon isn't reachable.",startDaemon:"Start daemon",runsOllama:"runs ollama serve detached",model:"Model",modelMissing:"{model} isn't installed yet.",modelSize:"~270 MB on first pull.",pulling:"pulling…",pullModel:"Pull {model}",indexStatus:"index status",builtStatus:"● built",incompatibleStatus:"● incompatible",chunks:"chunks",files:"files",dim:"dim",size:"size",lastBuild:"last build",builtWith:"built with",currentTarget:"current target",incompatibleHint:"This on-disk index was built for a different provider or model. Run Rebuild to replace it.",runIndexHint:"Run an index to enable semantic_search.",reIndex:"Re-index",build:"Build",rebuild:"Rebuild",stop:"Stop",provider:"provider",providerType:"service type",openaiCompat:"openai-compatible",apiUrl:"API URL",apiKey:"API key",apiKeyStoredNote:"API key is stored in ~/.reasonix/config.json — do not share that file.",customRequestBody:"custom request body",invalidCustomRequestBody:"Custom request body must be valid JSON: {error}",customRequestBodyMustBeObject:"Custom request body must be a JSON object.",saveBeforeIndex:"Save semantic settings before starting an index.",extraBody:"extra body",batchSize:"batch size",keepExistingKey:"leave blank to keep existing key",remoteProvider:"Remote embedding provider",remoteProviderDesc:"Configure the full OpenAI-compatible embeddings URL here. Reasonix will send requests exactly to the URL you provide.",ollama:"ollama",binary:"binary",found:"found",missing:"missing",daemonStatus:"daemon",up:"up",down:"down",pulled:"pulled",indexConfig:"index config",reset:"reset",excludeDirs:"exclude dirs",excludeFiles:"exclude files",excludeExts:"exclude exts",excludePatterns:"exclude patterns",glob:"glob",respectGitignore:"respect .gitignore",maxFileBytes:"max file bytes",skipLarger:"skip files larger than ~{size} MiB",preview:"Preview",searchPlaceholder:"describe what to find — 'where do we handle abort signals'",searching:"searching…",results:"{count} result{s} · {ms}ms · {model}",noMatches:"No matches above the score threshold.",previewSummary:"Preview — would index {included} file(s), skip {skipped}",nothingSkipped:"nothing skipped — all walked files would be indexed.",firstIncluded:"first {count} included file(s)",job:"Job",phaseSetup:"preparing",phaseScan:"scanning files",phaseEmbed:"embedding chunks",phaseWrite:"writing index",phaseDone:"done",phaseError:"error",phaseCancelled:"cancelled",setupFailed:"setup failed",stopping:"stopping",scanned:"scanned {count}",changed:"changed {count}",skipped:"skipped {count}",chunksProgress:"{done} / {total} ({pct}%)",result:"result",added:"added {count}",removed:"removed {count}",failed:"failed {count}",skippedFiles:"{total} files ({details})",rebuildStarted:"rebuild started",incrementalStarted:"incremental index started",stopRequested:"stopping requested — current chunk batch will finish first",startingDaemon:"starting ollama daemon (15s timeout)…",daemonUp:"daemon is up",daemonTimeout:"daemon didn't come up in time — check ollama serve manually",pullingModel:"pulling {model} — this may take a few minutes on first install",savedConfig:"saved · {count} fields updated · re-run index to apply",runningPreview:"running dry walk against project root…",exclude:"exclude"},modal:{shellTitle:"shell command",shellBgTitle:"background process",shellSubtitle:"model wants to run a shell command",shellBgSubtitle:"long-running — keeps running after approval",pathTitle:"file outside sandbox",pathSubtitle:"{intent} via {tool}",pathRead:"read",pathWrite:"write",pathSandboxLabel:"sandbox",pathAllowPrefixLabel:"allow prefix",runOnce:"Run once",alwaysAllow:'Always allow "{prefix}"',deny:"Deny",choiceTitle:"model wants you to pick",typeOwn:"Type my own answer",typeOwnSummary:"None of the above fits — write a free-form reply.",typePlaceholder:"Type a free-form answer…",send:"Send",cancel:"Cancel",cancelSummary:"Drop the question. Model will ask what you actually want.",planTitle:"plan submitted",planSubtitle:"model proposed a plan; review then pick",approveInstructions:"Optional last instructions / answers to open questions (Enter to send blank)",refinePlaceholder:"What needs to change? Be specific.",approve:"Approve",refine:"Refine",sendRefinement:"Send refinement",editTitle:"edit pending review",editSubtitle:"{path} · {remaining} of {total} blocks remaining",before:"before",after:"after",workspaceTitle:"model wants to switch workspace",workspaceSubtitle:"every subsequent file / shell / memory tool resolves against the new root",switchBtn:"Switch (Enter)",denyBtn:"Deny (Esc)",stepComplete:"step complete{counter}",continueBtn:"Continue",reviseBtn:"Revise…",stopBtn:"Stop",revisionTitle:"model proposed a plan revision",sendRevision:"Send revision",accept:"Accept",reject:"Reject",arguments:"arguments",revisePlaceholder:"What needs to change before the next step? Leave blank to just continue.",pickerFilter:"Filter…",pickerEmpty:"Nothing to show.",pickerLoadMore:"Load more",pickerPick:"Open",pickerInstall:"Install",pickerUninstall:"Uninstall",pickerRename:"Rename…",pickerNew:"New…",pickerNewPlaceholder:"Name (leave blank for default)",viewerClose:"Close"},error:{title:"Something broke in the dashboard",body:"The TUI is unaffected — only this browser tab tripped. You can dismiss and keep working, or report it so we can fix the underlying cause.",copyDetails:"Copy details",copied:"Copied ✓",reportOnGithub:"Report on GitHub",dismiss:"Dismiss (Esc)",crashing:"this panel keeps crashing — {name}",retry:"Try again",recovering:"recovering…"},fmt:{justNow:"just now",minutesAgo:"{n}m ago",hoursAgo:"{n}h ago",daysAgo:"{n}d ago"},cards:{applied:"Applied",cacheHit:"Cache hit",checkpointRewind:"Checkpoint Rewind",cost:"Cost",diffApply:"Apply",diffApplyChanges:"Apply Changes",diffAwaiting:"Awaiting review",diffDiscard:"Discard",done:"Done",elapsed:"Elapsed",error:"Error",errorName:"Error",failed:"Failed",hits:"Hits",memoryCountSuffix:"memories",memoryName:"Memory",output:"Output",planDefaultTitle:"Plan",prompt:"Prompt",compactionMeta:"{chars} chars",compactionName:"Compacted history",reasoningComplete:"Reasoning complete",reasoningName:"Reasoning",result:"Result",running:"Running",searchName:"Search",shellAlwaysAllow:"Always Allow",shellAwaiting:"Awaiting approval",shellExecuteHint:"Execute this command?",shellReject:"Reject",shellRun:"Run",shellRunning:"Running",streaming:"Streaming",subagentDone:"Subagent done",subagentDoneProgress:"Subagent done ({pct}%)",subagentFailed:"Subagent failed",subagentRunning:"Subagent running"},planBadge:{blocked:"Blocked",done:"Done",failed:"Failed",pending:"Pending",running:"Running"},composer:{atHeader:"Mention files",close:"Close",commandPalette:"Command Palette",commands:"Commands",commandsLabel:"Commands",confirm:"Confirm",imageFilterName:"Images",insertFile:"Insert File",insertImage:"Insert Image",interrupt:"Interrupt",mentionFiles:"Mention Files",mentionLabel:"Mention",newline:"New Line",noMatches:"No matches",placeholder:"Type a prompt…",queue:"Queue",queueCount:"{count} queued",select:"Select",send:"Send",slashHeader:"Slash Commands",switchModel:"Switch Model",switchEffort:"Switch Reasoning Effort",workspaceRoot:"Workspace Root"},contextPanel:{allow:"Allow",ask:"Ask",autoApproveTitle:"Auto-approve",cacheKey:"Cache",contextTokens:"Context tokens",fileInContext:"In context",fileModified:"Modified",filesCount:"{count} files",filesTab:"Files",filesTitle:"Files",freeKey:"Free",itemCount:"{count} items",mcpConfigured:"Configured",mcpConnecting:"Connecting…",mcpDisabled:"Disabled",mcpEmpty:"No MCP servers",mcpFailed:"Failed",mcpReady:"Ready",mcpReadyAll:"All ready",mcpReadySome:"Some ready",mcpTitle:"MCP",mcpTools:"Tools",memoryTab:"Memory",memoryTitle:"Memory",noFilesMsg:"No files in context",noMemoriesMsg:"No memories",reservedKey:"Reserved",ruleReadOnly:"Read-only",ruleReview:"Review",ruleShellAllowlist:"Shell allowlist",rulesTab:"Rules",ruleWritesAsk:"Writes ask",ruleYolo:"YOLO",scopeGlobal:"Global",scopeProject:"Project",toolsTab:"Tools",usedKey:"Used"},dragDrop:{overlay:"Drop files here"},extraCards:{approve:"Approve",balance:"Balance",cache:"Cache",cacheHit:"Cache hit",contextWindow:"Context window",doctorTitle:"Diagnostics",output:"Output",prompt:"Prompt",reasoning:"Reasoning",reject:"Reject",sessionCost:"Session cost",sessionUsage:"Session usage",topToolsUsage:"Top tools",unknownKind:"Unknown",memoryUser:"User",memoryFeedback:"Feedback",memoryProject:"Project",memoryReference:"Reference"},jobs:{empty:"No background jobs",exited:"Exited",kbClose:"Close",kbToggle:"Toggle",running:"Running",stop:"Stop",stopAll:"Stop All",stopAllTip:"Stop all jobs",stopOne:"Stop",title:"Background Jobs"},live:{deliveredWaiting:"Waiting for next message",reasoning:"Reasoning",running:"Running",secondsAgo:"{n}s ago",you:"You"},markdown:{copied:"Copied!",copy:"Copy",externalLinkTitle:"Open in new tab",filePillTitle:"Open file",localLinkTitle:"Open link"},palette:{abort:"Abort",abortHint:"Abort current request",about:"About",clearChat:"Clear Chat",clearChatHint:"Clear conversation",closeTab:"Close Tab",closeTabHint:"Close current tab",copyConv:"Copy Conversation",copyConvHint:"Copy conversation as Markdown",copyLast:"Copy Last Response",copyLastHint:"Copy last assistant message",countSuffix:"items",empty:"No matching commands",exportMd:"Export as Markdown",exportMdHint:"Export chat as Markdown file",focusComposer:"Focus Composer",footClose:"Close",footMove:"Move",footRun:"Run",groupAction:"Actions",groupNav:"Navigation",groupSettings:"Settings",groupWorkspace:"Workspace",newChat:"New Chat",newChatHint:"Start a new conversation",newTab:"New Tab",newTabHint:"Open a new tab",pickWorkspace:"Switch Workspace",pickWorkspaceHint:"Change workspace",searchPlaceholder:"Search commands…",settings:"Settings",settingsHint:"Open settings"},panel:{renderError:"Panel crashed"},sidebarPanel:{approvalRules:"Approval Rules",cancel:"Cancel",commandPalette:"Command Palette",daysAgo:"{n}d ago",delete:"Delete",deleteSession:"Delete Session",hoursAgo:"{n}h ago",justNow:"Just now",loading:"Loading…",messageCount:"{count} messages",minutesAgo:"{n}m ago",newChat:"New Chat",noMatches:"No matches",noSessions:"No sessions",recent:"Recent",searchSessions:"Search sessions…",sessionTitle:"Sessions",settings:"Settings",weeksAgo:"{n}w ago"},statusbar:{balance:"Balance",busy:"Busy",cache:"Cache",cacheHit:"Cache hit",jobs:"Jobs",jobsTip:"Background jobs",offline:"Offline",online:"Online",switchCurrency:"Switch currency",switchTheme:"Switch theme",switchWorkspace:"Switch workspace",themeDark:"Dark",themeLight:"Light",themeStyleGraphite:"Graphite",themeStyleSandstone:"Sandstone",themeStylePorcelain:"Porcelain",themeStyleMidnight:"Midnight",thisTurn:"This turn",tokens:"Tokens"},thread:{activePlan:"Active plan",allowRead:"Allow read",allowWrite:"Allow write",alwaysAllow:"Always allow",alwaysAllowPrefix:"Always allow {prefix}",approve:"Approve",approveRewrite:"Approve rewrite",cancel:"Cancel",checkpointKind:"Checkpoint",checkpointSub:"Save current state",checkpointTitle:"Create checkpoint",collapse:"Collapse",continue:"Continue",copyMessage:"Copy message",copyResponse:"Copy response",execute:"Execute",keepOriginal:"Keep original",keepSteps:"Keep steps",optionCount:"{count} options",pathAccessKind:"Path access",planConfirmationKind:"Plan approval",planRevisionKind:"Plan revision",planRunning:"Plan in progress",planStepCount:"Step {done}/{total}",readPathOutsideSandbox:"Read path outside sandbox",refine:"Refine",reject:"Reject",revise:"Revise",revisionMeta:"Revision",rewritePlan:"Rewrite plan",risk:"Risk assessment",riskMedium:"Medium risk",runBackgroundCommand:"Run in background",runCommand:"Run command",shellConfirmationKind:"Shell confirmation",startPlan:"Start plan",stop:"Stop",subagent:"Subagent",userChoiceKind:"User choice",writePathOutsideSandbox:"Write path outside sandbox",you:"You"},workdir:{browse:"Browse…",cancel:"Cancel",empty:"No workspaces",emptyDir:"No subdirectories.",go:"Go",goTip:"Navigate to this path",loading:"Loading…",openHere:"Open this folder",pathPlaceholder:"Absolute path…",promptWeb:"Enter the absolute path of the workspace to open:",searchPlaceholder:"Search workspaces…",title:"Workspace"},about:{close:"Close",repo:"Repository",sidebarLabel:"About",tagline:"AI-powered coding assistant",version:"Version"},effort:{lowDesc:"fastest — minimal reasoning",mediumDesc:"balanced",highDesc:"default — safe for vLLM / Azure",maxDesc:"DeepSeek extension; rejected by stock OpenAI / vLLM"},editMode:{plan:"Plan",planHint:"read-only · all write tools refuse to dispatch",review:"Review",reviewHint:"both edits and non-allowlisted shell ask first",auto:"Auto",autoHint:"edits auto-apply, shell still asks",yolo:"YOLO",yoloHint:"edits AND shell auto-run, allowlist bypassed"}},_s={...A,app:{...A.app,sectionWorkspace:"Arbeitsbereich",sectionObserve:"Beobachten",sectionConfigure:"Konfigurieren",tabChat:"Chat",tabPlans:"Pläne",tabSessions:"Sitzungen",tabOverview:"Übersicht",tabUsage:"Nutzung",tabSystem:"System",tabSemantic:"Semantisch",tabTools:"Werkzeuge",tabPermissions:"Berechtigungen",tabMcp:"MCP",tabSkills:"Fertigkeiten",tabMemory:"Memory",tabHooks:"Hooks",tabSettings:"Einstellungen",sectionChanges:"Änderungen",tabChanges:"Änderungen",footer:"127.0.0.1 nur · token-gesichert",themeToggle:"Theme umschalten",themeLight:"Hell",themeDark:"Dunkel",skill:{...A.app.skill,scope:{...A.app.skill.scope,builtin:"Eingebaut",global:"Global",project:"Projekt"},runAs:{subagent:"Subagent",inline:"Inline"},generic:"Fertigkeit"},exportReasoningSummary:"Reasoning-Zusammenfassung",exportToolLabel:"Tool-Aufrufe",exportUserLabel:"Benutzernachrichten",empty:{...A.app.empty,currentWorkspace:"Aktueller Arbeitsbereich",selectWorkspace:"Wähle einen Arbeitsbereich zum Starten",suggestion0:"Meine letzten Commit-Änderungen überprüfen",suggestion1:"Alle TypeScript-Fehler in der aktuellen Datei beheben",suggestion2:"README ins Chinesische/Englische übersetzen",suggestion3:"CHANGELOG für dieses Repo generieren",welcome:"Willkommen bei Reasonix"},errorLabel:"Fehler",connecting:"Verbinde…",session:{...A.app.session,format:"Sitzung",new:"Neue Sitzung"},setup:{...A.app.setup,choose:"Arbeitsbereich wählen",description:"Wähle einen Arbeitsbereich zum Starten",notSelected:"Kein Arbeitsbereich ausgewählt",saveAndStart:"Speichern & Starten",welcome:"Willkommen",workspace:"Arbeitsbereich"},tab:{...A.app.tab,newTab:"+ Neuer Tab",newTabTitle:"Neuen Tab öffnen"},titlebar:{...A.app.titlebar,clearChat:"Chat leeren",close:"Schließen",commandPalette:"Befehlsübersicht",contextPanel:"Kontext-Panel",copyMd:"Als Markdown kopieren",exportMd:"Als Markdown exportieren",maximize:"Maximieren",minimize:"Minimieren",more:"Mehr",restore:"Wiederherstellen",settings:"Einstellungen",sidebar:"Seitenleiste",windowControls:"Fenstersteuerung"},toast:{...A.app.toast,cleared:"Chat geleert",copied:"In die Zwischenablage kopiert",copiedMd:"Als Markdown kopiert",emptySession:"Keine Nachrichten zum Exportieren",exportDialogTitle:"Chat exportieren",exportedMd:"Als Markdown exportiert",exportFailed:"Export fehlgeschlagen",langSwitched:"Sprache gewechselt",modelSwitched:"Modell → {model}",effortSwitched:"Effort → {effort}",modeSwitched:"Modus gewechselt",newSession:"Neue Sitzung erstellt"},yolo:{...A.app.yolo,toast:"YOLO-Modus aktiviert"},cmd:{...A.app.cmd,abort:"Abbrechen",btw:"BTW",clearChat:"Chat leeren",compact:"Komprimieren",copyLast:"Letzte kopieren",exportMd:"Als Markdown exportieren",feedback:"Feedback",help:"Hilfe",newSession:"Neue Sitzung",retry:"Erneut versuchen",switchModel:"Modell wechseln",toggleCurrency:"Währung wechseln",toggleLang:"Sprache wechseln",toggleTheme:"Theme wechseln"},header:{...A.app.header,abort:"Abbrechen",clickToSelect:"Klicken zum Auswählen",copy:"Kopieren",copyMd:"Als Markdown kopieren",export:"Exportieren",exportMd:"Als Markdown exportieren",newChat:"Neuer Chat",noWorkspace:"Kein Arbeitsbereich",running:"Läuft…"},jumpToBottom:"Nach unten springen",langEN:"Englisch",langZH:"中文",splashSubtitle:"KI-gestützter Coding-Assistent"},changes:{...A.changes,chatPlaceholder:"Frag etwas zu deinem Code...",chatWelcome:"Änderungen — stelle Fragen zu deinen Projektdateien.",chatSend:"Senden",viewerPlaceholder:"Wähle eine Datei zum Anzeigen",treeEmpty:"(leer)",tabClose:"Tab schließen",newConversation:"Neu",clearConversation:"Leeren",newTitle:"/new — Gesprächskontext löschen",clearTitle:"/clear — sichtbaren Scrollback leeren",newConfirmBusy:"Ein Turn läuft gerade. Abbrechen und neues Gespräch beginnen?",newConfirm:"Aktuelles Gespräch leeren und neu beginnen?",newToast:"neues Gespräch",clearToast:"Scrollback geleert",newFailed:"/new fehlgeschlagen: {error}",clearFailed:"/clear fehlgeschlagen: {error}",chatSendBtn:"Senden",fileTreeTitle:"Dateien",codeViewerTitle:"Code-Ansicht",chatPanelTitle:"Chat",loadingFiles:"Lade Projektdateien…",review:"Überprüfen",allFiles:"Alle Dateien",changes:"Änderungen",commentLabel:"Kommentar zu Zeile",commentPlaceholder:"Kommentar hinzufügen…",commentCancel:"Abbrechen",commentSubmit:"Kommentieren",commentLine:"Zeile",commentEdit:"Bearbeiten",commentDelete:"Löschen",diffSourceGit:"Git-Änderungen",diffSourceSession:"Vorherige Sitzung",diffSourceCheckpoint:"Checkpoint",checkpointEmpty:"Noch keine Checkpoints in diesem Arbeitsbereich.",restoreBtn:"Wiederherstellen",restoreConfirm:'"{name}" wiederherstellen? Dies überschreibt aktuelle Dateien.',deleteBtn:"Löschen",deleteConfirm:'Checkpoint "{name}" löschen? Der Schnappschuss wird entfernt, Dateien bleiben unverändert.',createBtn:"Schnappschuss",createPlaceholder:"Name für Schnappschuss…",backToList:"zurück zur Liste",reviewEmpty:"Keine ausstehenden Überprüfungen.",diffStyleUnified:"Unifiziert",diffStyleSplit:"Geteilt",expandAll:"Alle erweitern",collapseAll:"Alle einklappen",createFailed:"Erstellen fehlgeschlagen",restoreFailed:"Wiederherstellen fehlgeschlagen",deleteFailed:"Löschen fehlgeschlagen"},common:{...A.common,loading:"lade...",loadingFailed:"{name} fehlgeschlagen: {error}",back:"← zurück",save:"Speichern",remove:"entfernen",cancel:"Abbrechen",delete:"Löschen",add:"Hinzufügen",confirm:"Bestätigen",noData:"Noch keine {name}.",all:"alle",yes:"ja",no:"nein",on:"AN",off:"aus",enabled:"aktiviert",disabled:"deaktiviert"},settings:{...A.settings,title:"Einstellungen",loading:"Einstellungen werden geladen...",saved:"gespeichert: {fields}",sectionApi:"DeepSeek API",apiKey:"API-Schlüssel",apiKeyNotSet:"Nicht gesetzt",apiKeySave:"Schlüssel speichern",apiKeySet:"Gesetzt",apiSection:"API-Konfiguration",notSet:"(nicht gesetzt)",replace:"ersetzen",pasteKey:"füge ein neues sk-…-Token ein",saveKey:"Schlüssel speichern",baseUrl:"Basis-URL",baseUrlPlaceholder:"https://api.deepseek.com (Standard)",baseUrlHint:"Basis-URL für API-Anfragen",sectionDefaults:"Standardwerte",effortSection:"Reasoning-Effort",modelCustom:"Benutzerdefinierte Modell-ID",modelCustomHint:"Jede OpenAI-kompatible ID, die dein Endpunkt bereitstellt (vLLM, Ollama, Together, …).",modelCustomActive:"Läuft aktuell auf benutzerdefinierter ID: {model}",appliesNextTurn:"gilt ab nächstem Turn",effort:"Effort",effortMax:"max (DeepSeek-Erweiterung — von stock OpenAI / vLLM abgelehnt)",effortHigh:"hoch (sicherer Standard — vLLM / Azure kompatibel)",effortMedium:"mittel",effortLow:"niedrig (am schnellsten)",webSearch:"Websuche",webSearchNote:"web_fetch + web_search Werkzeuge",webSearchEngine:"Suchmaschine",webSearchEngineBing:"bing — Standard, funktioniert von CN ohne Proxy",webSearchEngineSearxng:"searxng — selbst gehostet (Endpunkt via /se searxng <url>)",webSearchEngineMetaso:"metaso — 100/Tag kostenlos (CN-freundlich, kostenloser Schlüssel auf metaso.cn)",webSearchEngineTavily:"tavily — 1000/Monat kostenlos (TAVILY_API_KEY setzen)",webSearchEnginePerplexity:"perplexity — AI-native (PERPLEXITY_API_KEY setzen)",webSearchEngineExa:"exa — AI-native 1000/Monat kostenlos (EXA_API_KEY setzen)",webSearchEngineNote:"gilt für den nächsten web_search-Aufruf",sectionBudget:"Budget",budget:"Budget",budgetHint:"Ausgabengrenzen festlegen",budgetPlaceholder:"Budgetbetrag eingeben",budgetOf:"von",budgetSetCap:"Grenze setzen",budgetCustom:"benutzerdefiniert",budgetBumpHint:"Grenze erhöhen, um fortzufahren",budgetClear:"Grenze entfernen",budgetIdleLine:"warnt bei 80 % · verweigert ab 100 %",budgetWarnLine:"Grenze naht — Schleife wird ab 100 % verweigern",budgetRefusing:"Grenze erschöpft — nächster Turn verweigert bis Erhöhung oder Löschung",sectionLoop:"Schleife",loopIdleHint:"Prompt automatisch in festem Intervall erneut senden.",loopCostHint:"Jede Iteration kostet ~{cost} (letzter Turn).",loopInterval:"Intervall",loopCustom:"benutzerdefiniert",loopRangeError:"Intervall muss zwischen 5s und 6h liegen",loopPrompt:"Prompt",loopPromptPlaceholder:"z.B. überprüfe den Bereitstellungsstatus und melde Fehler",loopStart:"Schleife starten",loopStop:"Stopp",loopRunning:"läuft",loopIter:"Iteration {iter}",loopFiresIn:"startet in {remaining}",sectionSkills:"Fertigkeiten",skillPaths:"Skill-Pfade",skillPathsPlaceholder:"/pfad/zu/skills-a, /pfad/zu/skills-b",skillPathsNote:"kommagetrennt · nächstes /new oder neue Sitzung",skillsEmpty:"Keine Skills geladen",skillsLoaded:"Skills geladen",subagentModelFlash:"flash",subagentModelPro:"pro",subagentModelHint:"Modell, das verwendet wird, wenn dieser Skill seinen isolierten Subagenten startet",sectionRuntime:"Laufzeit",activeModel:"aktives Modell",model:"Modell",modelFlashDesc:"Flash — immer flash",modelProDesc:"Pro — immer pro",modelPricingLine:"${hit} Treffer · ${miss} Fehler · ${out} Ausgabe pro 1M Tokens",editMode:"Bearbeitungsmodus",editModeNote:"Umschaltung über den Chat-Tab-Header",editModeHint:"Bearbeitungsmodus konfigurieren",showSystemEvents:"Systemereignisse",showSystemEventsHint:"Zeige leise Inline-Hinweise zur Kontextkomprimierung, Abbruch, Ratelimit.",shown:"angezeigt",hidden:"ausgeblendet",sectionLanguage:"Sprache",language:"Sprache",languageHint:"Sprache wechseln",langEn:"English",langZhCn:"简体中文",appMode:"App-Modus",appearanceSection:"Darstellung",behaviorSection:"Verhalten",ruleAutoApprovalHint:"Auto-Genehmigungsregeln konfigurieren",ruleAutoApprovalSection:"Auto-Genehmigungsregeln",theme:"Theme",themeDark:"Dunkel",themeHint:"Zwischen hellem und dunklem Theme wechseln",themeLight:"Hell",themeStyle:"Theme-Stil",themeStyleHint:"Theme-Stil wählen",themeStyleGraphite:"Graphit",themeStyleGraphiteDesc:"Kühle dunkle Neutrale — am besten für lange Sitzungen.",themeStyleSandstone:"Sandstein",themeStyleSandstoneDesc:"Warme helle Töne — angenehm in hellen Räumen.",themeStylePorcelain:"Porzellan",themeStylePorcelainDesc:"Sauberes Hell mit extra Kontrast.",themeStyleMidnight:"Mitternacht",themeStyleMidnightDesc:"Tiefes Dunkel mit kühleren Highlights.",pageGeneralLabel:"Allgemein",pageGeneralDesc:"Theme, Schriften, Sprache und Arbeitsbereich.",pageModelsLabel:"Modelle",pageModelsDesc:"Standardmodell und Reasoning-Effort.",pageMcpLabel:"MCP-Server",pageMcpDesc:"Externe Tool-Server verbinden.",pageSkillsLabel:"Skills",pageSkillsDesc:"Benutzerdefinierte Skills, die mit /skill ausgeführt werden.",pageMemoryLabel:"Memory",pageMemoryDesc:"Langzeitnotizen, die sitzungsübergreifend mitgeführt werden.",pageRulesLabel:"Regeln",pageRulesDesc:"Auto-Genehmigungsregeln für Shell- und Pfadzugriff.",pageBillingLabel:"Abrechnung",pageBillingDesc:"API-Schlüssel, Guthaben und Sitzungsbudget.",pageShortcutsLabel:"Kürzel",pageShortcutsDesc:"Tastaturkürzel-Referenz.",fontFamily:"Schriftfamilie",fontFamilyHint:"Schriftfamilie wählen",fontFamilySans:"Serifenlos",fontFamilySerif:"Serife",fontFamilySystem:"System",fontScale:"Schriftgröße",fontScaleHint:"Schriftgröße anpassen",fontScaleLarge:"Groß",fontScaleMedium:"Mittel",fontScaleSmall:"Klein",currentWorkspace:"Aktueller Arbeitsbereich",defaultModelCurrent:"Aktuelles Modell",editor:"Editor",editorHint:"Editor-Einstellungen konfigurieren",maxOutput:"Max. Ausgabe",reasoningEffort:"Reasoning-Effort",reasoningEffortHint:"Reasoning-Tiefe anpassen",sessionCost:"Sitzungskosten",balanceAvailable:"Verfügbar",balanceLabel:"Guthaben",balanceLow:"Niedriges Guthaben",cacheHitRate:"Cache-Trefferquote",ctxWindow:"Kontextfenster",notSelected:"Nicht ausgewählt",parseError:"Parse-Fehler",workspaceChange:"Ändern",workspaceSection:"Arbeitsbereich",mcpAdd:"Hinzufügen",mcpAddSection:"MCP-Server hinzufügen",mcpBridged:"Verbunden",mcpConfigured:"Konfiguriert",mcpEmpty:"Keine MCP-Server",mcpNotBridged:"Nicht verbunden",mcpRemove:"Entfernen",mcpSpecFormat:"JSON-Format",mcpSpecLabel:"Server-Spec",memoryDesc:"Memory-Einstellungen konfigurieren",memorySection:"Memory",shortcutAbort:"Abbrechen",shortcutCloseTab:"Tab schließen",shortcutCommandPalette:"Befehlsübersicht",shortcutFocusComposer:"Composer fokussieren",shortcutNewChat:"Neuer Chat",shortcutNewTab:"Neuer Tab",shortcutSettings:"Einstellungen",shortcutSwitchTab:"Tab wechseln",qqAccessAllowlist:"Allowlist",qqAccessOpen:"Offen",qqAccessOwner:"Besitzer",qqAccessOwnerWithAllowlist:"Besitzer + Allowlist",qqAccessRuntime:"Laufzeit",qqAppId:"App-ID",qqApplyAction:"Anwenden",qqApplyLabel:"Anwenden",qqAppSecret:"App-Secret",qqBack:"Zurück",qqConfigure:"Konfigurieren",qqConfigureHint:"QQ-Integration einrichten",qqConfigureTitle:"QQ-Konfiguration",qqConnected:"Verbunden",qqConnecting:"Verbinde…",qqDisconnected:"Getrennt",qqEnvironment:"Umgebung",qqFailed:"Fehlgeschlagen",qqProduction:"Produktion",qqSandbox:"Sandbox",qqSave:"Speichern",qqSaveAndConnect:"Speichern & Verbinden",qqSection:"QQ-Integration",qqSummaryAppId:"App-ID",qqSummaryDetail:"Details",qqSummaryMissing:"Nicht konfiguriert",qqTitle:"QQ-Bot"},chat:{...A.chat,modeMirror:"TUI-Spiegel",modeView:"Sitzungsansicht",placeholder:"Prompt eingeben – Enter sendet, Shift+Enter für neue Zeile · / @ für Auswahl",placeholderBusy:"warte auf Abschluss des aktuellen Turns…",placeholderSteerBusy:"tippe zum Steuern — Befehle und Auswahl sind während des Betriebs deaktiviert",steerHint:"Nachricht steuert den aktuellen Turn (wird als Anweisung hinzugefügt)",send:"Senden",new:"Neu",clear:"Leeren",newTitle:"/new — Gesprächskontext löschen (Schleifenlog + Scrollback)",clearTitle:"/clear — nur sichtbaren Scrollback leeren (Kontext bleibt)",noConversation:"Noch keine Unterhaltung. Sende unten einen Prompt.",newConfirmBusy:"Ein Turn läuft gerade. Abbrechen und neues Gespräch beginnen?",newConfirm:"Aktuelles Gespräch leeren und neu beginnen?",newToast:"neues Gespräch",clearToast:"Scrollback geleert",newFailed:"/new fehlgeschlagen: {error}",clearFailed:"/clear fehlgeschlagen: {error}",eventStreamError:"Ereignisstrom unterbrochen — verbinde neu…",semanticBanner:"Semantische Suche ist für dieses Projekt nicht aktiviert.",semanticBannerDesc:"Erstelle den Index einmal, und das Modell kann Code anhand der Bedeutung finden (»Wo behandeln wir Authentifizierungsfehler?«) statt nach exakten Zeichenketten zu greppen.",semanticBannerBtn:"Erstellen →",semanticBannerDismiss:"ausblenden (nicht wieder anzeigen)",slashCommands:"Slash-Befehle",projectFiles:"Projektdateien",effortTitle:"reasoning_effort — gilt ab nächstem Turn",effortMaxTitle:"max (DeepSeek-Erweiterung)",effortHighTitle:"hoch (sicherer Standard — vLLM / Azure kompatibel)",effortMediumTitle:"mittel",effortLowTitle:"niedrig (am schnellsten)",editGateTitle:"Edit-Gate — Shift+Tab schaltet in der TUI",editReviewTitle:"review — sowohl Edits als auch nicht-allowlistete Shell fragen zuerst",editAutoTitle:"auto — Edits auto-anwenden, Shell fragt weiterhin",editYoloTitle:"yolo — Edits UND Shell auto-ausführen, Allowlist umgangen",railSession:"Sitzung",railTurns:"Turns",railPromptTok:"Prompt-Tok",railCost:"Kosten",railCacheHit:"Cache-Treffer",railToolBudget:"Tool-Budget",railSpend:"Ausgaben",railActivePlan:"Aktiver Plan",railProgress:"Fortschritt",statusModel:"Modell",statusCtx:"Kontext",statusCache:"Cache",statusTurn:"Turn",statusSession:"Sitzung",statusBalance:"Guthaben",statusTurns:"{count} Turn{s}",waitingStats:"··· warte auf Live-Statistiken",inflightPhase:"{phase}",inflightRunning:"läuft",inflightThinking:"denkt nach",inflightStreaming:"streamt",inflightWaiting:"wartet",inflightReasoning:"Reasoning {count} Zch",inflightOut:"Ausgabe {count} Zch",abortBtn:"Abbrechen (Esc)",confirmBtn:"Anwenden (y)",rejectBtn:"Ablehnen (n)",applyRestBtn:"Rest anwenden (a)",flipAutoBtn:"Zu AUTO umschalten (A)"},overview:{...A.overview,loading:"lade Übersicht…",failed:"Übersicht fehlgeschlagen: {error}",standaloneTitle:"Standalone-Modus",standaloneDesc:"Schreibgeschützte Plattenansicht. Starte /dashboard von innerhalb von reasonix code für Live-Sitzungsstatus, MCP und Tools.",cockpit:"Cockpit",balance:"Guthaben",tokens7d:"Tokens · 7d",cacheHit:"Cache-Treffer",toolCalls24h:"Tool-Aufrufe · 24h",budget:"Budget",currentSession:"aktuelle Sitzung",noSession:"Keine Live-Sitzung — /dashboard von reasonix code aus, um dich zu verbinden.",promptTok:"Prompt-Tok",completionTok:"Completion-Tok",cost:"Kosten",costTrend:"Kosten · 14 Tage",noUsageYet:"noch keine Nutzung",dayAvg:"/Tag Ø",recentPlans:"letzte Pläne",noPlans:"Noch keine Pläne — erstelle einen mit submit_plan.",toolActivity:"Tool-Aktivität",noToolCalls:"Noch keine Tool-Aufrufe.",toolsLoaded:"Tools geladen",mcpServers:"MCP-Server",editMode:"Bearbeitungsmodus",version:"Reasonix",workingDir:"Arbeitsverzeichnis",projectRoot:"Projekt-Root",noPriorData:"keine vorherigen Daten",stable:"— stabil",vsPrior:"{arrow} {pct}% vs. vorher",active:"aktiv",allUp:"alle betriebsbereit",yoloWarning:"alle Prompts umgangen",checking:"prüfe",latest:"neueste"},usage:{...A.usage,loading:"lade Nutzung…",failed:"Nutzung fehlgeschlagen: {error}",records:"{count} Datensätze",dailyUsage:"Tägliche Nutzung",dailyMeta:"Kosten · Cache-Ersparnis · Turns",noData:"Noch keine Nutzungsdaten — führe einen Turn in reasonix chat / code / run aus und aktualisiere.",windows:"Rollierende Fenster",colWindow:"Fenster",colTurns:"Turns",colCacheHit:"Cache-Treffer",colCost:"Kosten (USD)",colCacheSaved:"Cache gespart",colVsClaude:"vs. Claude",colSaved:"gespart",axisTime:"Zeit",axisUsd:"USD",axisTurns:"Turns",seriesCost:"Kosten",seriesCacheSaved:"Cache gespart",seriesTurns:"Turns",mostUsed:"Meistgenutzte Modelle",colModel:"Modell"},sessions:{...A.sessions,loading:"lade Sitzungen…",failed:"Sitzungen fehlgeschlagen: {error}",noSessions:"Noch keine gespeicherten Sitzungen.",filterPlaceholder:"Sitzungen filtern",msgs:"Nachr",pickHint:"Wähle links eine Sitzung, um ihr Transkript zu lesen.",resumeTitle:"In TUI fortsetzen",resumeDesc:"Ein Sitzungswechsel mid-Session erfordert einen Neustart, damit der Nachrichtenverlauf sauber zurückgespult werden kann. Beende deine aktuelle Sitzung und führe dann aus:",loadingTranscript:"lade Transkript…",emptyTranscript:"leeres Transkript.",messages:"{count} Nachricht{s}",newBtn:"Neue Sitzung",newHint:"Aktuelles Gespräch archivieren und neues beginnen",switchBtn:"Zu dieser Sitzung wechseln",deleteBtn:"Löschen",deleteConfirm:'Sitzung "{name}" löschen? Dies entfernt die Transkriptdatei und kann nicht rückgängig gemacht werden.',cantDeleteActive:"Wechsle zu einer anderen Sitzung, bevor du diese löschst.",attachRequired:"Live-Sitzungsoperationen benötigen eine angehängte CLI-Sitzung. Starte über reasonix chat oder öffne das Dashboard von einer TUI-Sitzung aus.",activeChip:"aktiv",activePill:"aktiv"},tools:{...A.tools,loading:"lade Tools…",failed:"Tools fehlgeschlagen: {error}",noTools:"Keine Tools registriert.",planMode:"Plan-Modus — Schreibzugriffe blockiert",colTool:"Tool",colFlags:"Flags",colDesc:"Beschreibung",readOnly:"schreibgeschützt",write:"schreiben",flat:"flach",desc:{...A.tools.desc,web_search:"Durchsuche das öffentliche Web. Liefert sortierte Ergebnisse mit Titel, URL und Ausschnitt. Verwende dies, wenn die Antwort vom aktuellen Zustand abhängt — Ereignisse, Preise, Veröffentlichungen, Echtzeit-Status.",web_fetch:"Lade eine URL herunter und gib den sichtbaren Textinhalt zurück (Skripte/Styles/Navigation entfernt). Nach web_search verwenden, wenn ein Ausschnitt nicht ausreicht.",run_command:"Führe einen Shell-Befehl im Projekt-Root aus; gibt kombinierte stdout+stderr zurück. Allowlistete schreibgeschützte Befehle werden sofort ausgeführt; Änderungen benötigen Benutzerbestätigung.",run_background:"Starte einen langlebigen Prozess und trenne ihn. Liefert eine Job-ID zum Verfolgen der Logs, Warten auf Abschluss oder Beenden. Für Dev-Server, Watcher und einmalige Langzeit-Jobs.",job_output:"Lies die neueste Ausgabe eines Hintergrund-Jobs. Gibt das Ende des Puffers zurück und sagt dir, ob der Job noch läuft.",wait_for_job:"Blockiere serverseitig, bis ein Hintergrund-Job abgeschlossen ist, zeitlich begrenzt. Statt job_output in einer Schleife zu pollen.",stop_job:"Stoppe einen Hintergrund-Job. SIGTERM zuerst, SIGKILL nach einer Gnadenfrist. Sicher für bereits beendete Jobs.",list_jobs:"Liste jeden in dieser Sitzung gestarteten Hintergrund-Job auf — laufende und beendete — mit ID, Befehl, PID und Status.",remember:"Speichere eine Erinnerung für zukünftige Sitzungen. Verwende, wenn der Benutzer eine Präferenz angibt, deinen Ansatz korrigiert, eine nicht offensichtliche Tatsache teilt oder dich bittet, etwas zu merken.",forget:"Lösche eine Memory-Datei und entferne sie aus MEMORY.md. Verwende, wenn der Benutzer vergessen möchte oder eine gespeicherte Tatsache jetzt falsch ist.",recall_memory:"Lies den vollständigen Body einer Memory-Datei, wenn die einzeilige Zusammenfassung nicht genug Detail bietet.",read_file:"Lese eine Datei unter dem Sandbox-Root. Unterstützt head/tail/range-Begrenzung zum Kontextsparen. Gibt automatisch eine Vorschau für Dateien über 200 Zeilen zurück.",list_directory:"Liste Einträge in einem Verzeichnis auf. Gibt eine Zeile pro Eintrag zurück und markiert Verzeichnisse mit einem Schrägstrich.",directory_tree:"Liste Einträge in einem Verzeichnis rekursiv als eingerückten Baum auf. Budget-bewusst mit automatischem Einklappen für große Unterbäume.",search_files:"Finde Dateien, deren NAME einem Teilstring oder Regex entspricht. Groß-/Kleinschreibung unwichtig. Überspringt standardmäßig Abhängigkeits-/Build-Verzeichnisse.",search_content:"Durchsuche Dateiinhalte rekursiv mit grep nach einem Teilstring oder Regex. Liefert Treffer im Format pfad:zeile:text. Das richtige Werkzeug zum Finden von Referenzen.",glob:"Liste Dateien, die einem Glob-Muster entsprechen, sortiert nach Änderungsdatum. Standardlimit 200, max 1000. Überspringt node_modules/.git/dist standardmäßig.",get_file_info:"Ermittle Informationen zu einem Pfad unter dem Sandbox-Root. Liefert Typ, Größe in Bytes und Änderungsdatum.",write_file:"Erstelle oder überschreibe eine Datei mit dem angegebenen Inhalt. Übergeordnete Verzeichnisse werden bei Bedarf erstellt.",edit_file:"Wende eine SEARCH/REPLACE-Bearbeitung auf eine vorhandene Datei an. Die Suche muss exakt übereinstimmen und in der Datei eindeutig sein.",multi_edit:"Wende N SEARCH/REPLACE-Bearbeitungen atomar auf eine oder mehrere Dateien an. Wenn eine Bearbeitung fehlschlägt, werden keine Dateien geschrieben.",create_directory:"Erstelle ein Verzeichnis (und alle fehlenden übergeordneten) unter dem Sandbox-Root.",move_file:"Benenne eine Datei oder ein Verzeichnis unter dem Sandbox-Root um oder verschiebe es.",delete_file:"Lösche eine Datei unter dem Sandbox-Root. Lehnt Verzeichnisse ab — verwende delete_directory dafür.",delete_directory:"Lösche rekursiv ein Verzeichnis unter dem Sandbox-Root. Übergib recursive:false, um nicht-leere Verzeichnisse abzulehnen.",copy_file:"Kopiere eine Datei oder ein Verzeichnis unter dem Sandbox-Root. Lehnt das Überschreiben eines vorhandenen Ziels ab.",submit_plan:"Reiche einen konkreten Plan für ein Review-Gate ein. Für dateiübergreifende Refactorings, Architekturänderungen oder alles, was teuer rückgängig zu machen ist.",mark_step_complete:"Markiere einen Schritt des genehmigten Plans als erledigt. Genau einmal nach Abschluss jedes Schritts aufrufen.",revise_plan:"Ersetze gezielt die verbleibenden Schritte eines laufenden Plans. Erledigte Schritte werden nie berührt.",run_skill:"Rufe ein Playbook aus dem Skills-Index auf. Übergib den bloßen Skill-Namen. Subagent-gekennzeichnete Skills starten einen isolierten Subagenten.",spawn_subagent:"Starte einen isolierten Subagenten für eine in sich geschlossene Teilaufgabe. Für paralleles Fan-out oder wenn die Arbeit viele Dateilesevorgänge benötigt.",todo_write:"Aufgaben-Tracker innerhalb der Sitzung für mehrschrittige Arbeit. Ersetzt bei jedem Aufruf die gesamte Liste. Kein Genehmigungs-Gate oder Dateischreibvorgänge.",ask_choice:"Präsentiere 2–6 Alternativen dem Benutzer. Verwende, wenn der Benutzer nach Optionen fragt oder du eine Präferenzentscheidung benötigst.",create_skill:"Erstelle ein neues Skill-Gerüst, das der Benutzer später mit /skill aufrufen kann. Unterstützt Inline- und Subagent-Ausführungsmodi.",add_mcp_server:"Registriere einen neuen MCP-Server in der Konfiguration des Benutzers. Wirkt ab der nächsten Sitzung. Unterstützt stdio, SSE und streamable-http."}},permissions:{...A.permissions,loading:"lade Berechtigungen…",failed:"Berechtigungen fehlgeschlagen: {error}",yoloTitle:"YOLO-Modus",yoloDesc:"Jeder Shell-Befehl läuft automatisch, Allowlist umgangen. Zurück mit /mode review in der TUI.",project:"Projekt",builtin:"Eingebaut",addPrefix:"Präfix hinzufügen",addPlaceholder:'z.B. "npm run build" oder "deploy.sh"',clearAll:"Alle löschen",alreadyIn:"{prefix} bereits in der Liste",added:"hinzugefügt: {prefix}",removed:"entfernt: {prefix}",cleared:"{count} Eintrag{Einträge} gelöscht",removeConfirm:'"{prefix}" aus der Allowlist dieses Projekts entfernen?',clearConfirm:"Alle Projekt-Allowlist-Einträge löschen? Builtin-Einträge bleiben unberührt.",projectAllowlist:"Projekt-Allowlist · {count}",nothingStored:"Noch nichts für dieses Projekt gespeichert.",colNum:"#",colPrefix:"Präfix",builtinTitle:"Eingebaut · {count} · schreibgeschützt",standaloneWarning:"Änderungen erfordern /dashboard von innerhalb einer aktiven reasonix code-Sitzung — das Standalone-Dashboard kann nicht erkennen, welche Projekt-Allowlist zu bearbeiten ist."},mcp:{...A.mcp,loading:"lade MCP…",servers:"MCP-Server · {count} verbunden",all:"alle",live:"live",unbridged:"unverbunden",specPlaceholder:"Spec — z.B. fs=npx -y @modelcontextprotocol/...",saved:"gespeichert",savedRestart:"gespeichert — starte reasonix code neu, um diesen Server zu verbinden",removed:"entfernt — starte neu, um die Live-Verbindung zu trennen",removeConfirm:`MCP-Spec aus Konfiguration entfernen?
7
+ {spec}`,noServers:"No MCP servers in this session.",tools:"tools",inConfig:"in config · not loaded",unbridgedTitle:"unbridged · in config",removeBtn:"Remove",spec:"spec",whyUnbridged:"Why unbridged?",whyUnbridgedDesc:"This spec lives in your config.json but isn't bridged into the live session. MCP servers attach when reasonix code starts; the dashboard alone can't spawn the child process.",whyUnbridgedHint:"To activate: restart reasonix code, then refresh this dashboard.",bridgeFailed:"Bridge failed",bridgeFailedTitle:"bridge failed · in config",bridgeFailedHint:"Reasonix tried to bridge this server and the attempt errored. Common causes: wrong URL, missing auth header, upstream 404/5xx, missing local command. Fix and restart reasonix code to retry.",pickHint:"Pick an MCP server on the left to inspect tools / resources / prompts.",toolsTitle:"Tools · {count}",resourcesTitle:"Resources · {count}",promptsTitle:"Prompts · {count}",colName:"name",colDesc:"description",colUri:"uri",marketplace:"marketplace",marketplaceSearch:"search the registry…",marketplaceLoading:"loading registry…",marketplaceMore:"load 5 more pages",marketplaceMoreLabel:"load 50 more · showing {shown} / {total}",marketplaceMoreHint:"fetches more pages from the registry",marketplaceMoreCachedHint:"more entries already cached locally",marketplaceExhausted:"all pages loaded",marketplaceExhaustedFull:"showing all {total} entries — registry exhausted",marketplaceCount:"{loaded} loaded · {matched} match · source: {source}{cached}",marketplaceCachedSuffix:" · cached",marketplaceNoMatches:"No matches. Try different terms or load more pages.",marketplaceInstall:"Install",marketplacePickHint:"Pick a server on the left, then Install.",marketplaceInstalled:"installed → {spec}",marketplaceInstalledBridged:"installed + bridged → {spec}",marketplaceAlready:"already installed",marketplaceNeedsEnv:"needs env: {names}",marketplaceSourceTag:"[{source}]",marketplaceNoInstall:"smithery listing — install metadata not exposed; use `npx -y @smithery/cli install {name}` directly",marketplaceFetchOnInstall:"Smithery listing — install detail fetched on Install. http servers map to streamable-http remotes; stdio servers run via @smithery/cli.",marketplaceInstalledBadge:"installed",marketplaceUninstall:"Uninstall",marketplaceEnvTitle:"Required environment variables",marketplaceEnvHint:"Set these in your shell before next `reasonix code` so the bridged server can authenticate.",marketplaceRestartHint:"Spec written to ~/.reasonix/config.json. Restart `reasonix code` to bridge the server (live hot-reload is on the roadmap)."},memory:{loading:"loading memory…",files:"memory · {count} files",exists:"exists",create:"create",noFiles:"No memory files yet.",pickHint:"Pick a memory file on the left.",pickDesc:"Project REASONIX.md is committable; global notes live in ~/.reasonix/memory/.",chars:"{count} chars",saved:"saved {scope}",reloadHint:"re-applied on next /new or session restart"},hooks:{loading:"loading hooks…",resolved:"resolved",eventMatrix:"Event matrix",matrixSub:"{scripts} script{s} × {events} event{s}",noHooks:"No hooks configured. Edit the JSON below to add some.",colScript:"script",noProject:"No active project — open /dashboard from reasonix code to edit project hooks.",saveReload:"Save + Reload",discard:"Discard changes",savedReloaded:"saved + reloaded {scope}",recentRuns:"Recent runs",noRuns:"No hook runs in the recent session log.",colWhen:"when",colPhase:"phase",colHook:"hook",colOutcome:"outcome"},skills:{loading:"loading skills…",filterPlaceholder:"filter skills",project:"project",custom:"custom",global:"global",builtin:"builtin",newSkill:"new skill",noDescription:"(no description)",runs7d:"runs · 7d",pickHint:"Pick a skill on the left, or create a new one above.",readOnlyBuiltin:"read-only · builtin",readOnlyCustom:"read-only · custom path",builtinDesc:"Built-in skills ship with Reasonix; the model picks them up automatically. To customize, create a project- or global-scoped skill with the same name.",saved:"saved {scope}/{name}",deleteConfirm:"Delete skill {scope}/{name}?",reloadHint:"re-loaded on next /new or session restart"},system:{loading:"loading health…",failed:"health failed: {error}",healthChecks:"Health checks",version:"version",checking:"checking",latest:"● latest",outOfDate:"● out of date",versionPending:"version check pending",upToDate:"up to date",latestVer:"latest: {version}",sessions:"sessions",ok:"● ok",memory:"memory",semanticIndex:"semantic index",built:"● built",none:"— none",runIndex:"run reasonix index to build",usageLog:"usage log",backgroundJobs:"background jobs",noSession:"— no session",running:"{count} running",attachHint:"attach a session to see jobs",shellSpawn:"shell + spawn",paths:"paths",home:"home",sessionsPath:"sessions",memoryPath:"memory",semanticPath:"semantic",usagePath:"usage"},plans:{loading:"loading plans…",failed:"plans failed: {error}",noPlans:"No archived plans yet — run a turn that calls submit_plan and mark_step_complete.",filterPlaceholder:"filter plans",active:"active",done:"done",idle:"idle",steps:"steps",pickHint:"Pick a plan on the left.",noTitle:"(no title)",stepTimeline:"Step timeline · {done} / {total}",step:"step {n}"},semantic:{codeRequired:"Semantic — code-mode required",indexBuilt:"index built",noIndex:"no index yet",ready:"ready",setupNeeded:"setup needed",installOllama:"Install Ollama",installOllamaDesc:"Reasonix doesn't run package managers for you. Install Ollama first, then come back:",macWindows:"macOS / Windows:",download:"download from ollama.com/download",linux:"Linux:",refreshHint:"Refresh after install — this panel will offer to start the daemon and pull {model}.",daemon:"Daemon",daemonDesc:"ollama is on your PATH but the HTTP daemon isn't reachable.",startDaemon:"Start daemon",runsOllama:"runs ollama serve detached",model:"Model",modelMissing:"{model} isn't installed yet.",modelSize:"~270 MB on first pull.",pulling:"pulling…",pullModel:"Pull {model}",indexStatus:"index status",builtStatus:"● built",incompatibleStatus:"● incompatible",chunks:"chunks",files:"files",dim:"dim",size:"size",lastBuild:"last build",builtWith:"built with",currentTarget:"current target",incompatibleHint:"This on-disk index was built for a different provider or model. Run Rebuild to replace it.",runIndexHint:"Run an index to enable semantic_search.",reIndex:"Re-index",build:"Build",rebuild:"Rebuild",stop:"Stop",provider:"provider",providerType:"service type",openaiCompat:"openai-compatible",apiUrl:"API URL",apiKey:"API key",apiKeyStoredNote:"API key is stored in ~/.reasonix/config.json — do not share that file.",customRequestBody:"custom request body",invalidCustomRequestBody:"Custom request body must be valid JSON: {error}",customRequestBodyMustBeObject:"Custom request body must be a JSON object.",saveBeforeIndex:"Save semantic settings before starting an index.",extraBody:"extra body",batchSize:"batch size",keepExistingKey:"leave blank to keep existing key",remoteProvider:"Remote embedding provider",remoteProviderDesc:"Configure the full OpenAI-compatible embeddings URL here. Reasonix will send requests exactly to the URL you provide.",ollama:"ollama",binary:"binary",found:"found",missing:"missing",daemonStatus:"daemon",up:"up",down:"down",pulled:"pulled",indexConfig:"index config",reset:"reset",excludeDirs:"exclude dirs",excludeFiles:"exclude files",excludeExts:"exclude exts",excludePatterns:"exclude patterns",glob:"glob",respectGitignore:"respect .gitignore",maxFileBytes:"max file bytes",skipLarger:"skip files larger than ~{size} MiB",preview:"Preview",searchPlaceholder:"describe what to find — 'where do we handle abort signals'",searching:"searching…",results:"{count} result{s} · {ms}ms · {model}",noMatches:"No matches above the score threshold.",previewSummary:"Preview — would index {included} file(s), skip {skipped}",nothingSkipped:"nothing skipped — all walked files would be indexed.",firstIncluded:"first {count} included file(s)",job:"Job",phaseSetup:"preparing",phaseScan:"scanning files",phaseEmbed:"embedding chunks",phaseWrite:"writing index",phaseDone:"done",phaseError:"error",phaseCancelled:"cancelled",setupFailed:"setup failed",stopping:"stopping",scanned:"scanned {count}",changed:"changed {count}",skipped:"skipped {count}",chunksProgress:"{done} / {total} ({pct}%)",result:"result",added:"added {count}",removed:"removed {count}",failed:"failed {count}",skippedFiles:"{total} files ({details})",rebuildStarted:"rebuild started",incrementalStarted:"incremental index started",stopRequested:"stopping requested — current chunk batch will finish first",startingDaemon:"starting ollama daemon (15s timeout)…",daemonUp:"daemon is up",daemonTimeout:"daemon didn't come up in time — check ollama serve manually",pullingModel:"pulling {model} — this may take a few minutes on first install",savedConfig:"saved · {count} fields updated · re-run index to apply",runningPreview:"running dry walk against project root…",exclude:"exclude"},modal:{shellTitle:"shell command",shellBgTitle:"background process",shellSubtitle:"model wants to run a shell command",shellBgSubtitle:"long-running — keeps running after approval",pathTitle:"file outside sandbox",pathSubtitle:"{intent} via {tool}",pathRead:"read",pathWrite:"write",pathSandboxLabel:"sandbox",pathAllowPrefixLabel:"allow prefix",runOnce:"Run once",alwaysAllow:'Always allow "{prefix}"',deny:"Deny",choiceTitle:"model wants you to pick",typeOwn:"Type my own answer",typeOwnSummary:"None of the above fits — write a free-form reply.",typePlaceholder:"Type a free-form answer…",send:"Send",cancel:"Cancel",cancelSummary:"Drop the question. Model will ask what you actually want.",planTitle:"plan submitted",planSubtitle:"model proposed a plan; review then pick",approveInstructions:"Optional last instructions / answers to open questions (Enter to send blank)",refinePlaceholder:"What needs to change? Be specific.",approve:"Approve",refine:"Refine",sendRefinement:"Send refinement",editTitle:"edit pending review",editSubtitle:"{path} · {remaining} of {total} blocks remaining",before:"before",after:"after",workspaceTitle:"model wants to switch workspace",workspaceSubtitle:"every subsequent file / shell / memory tool resolves against the new root",switchBtn:"Switch (Enter)",denyBtn:"Deny (Esc)",stepComplete:"step complete{counter}",continueBtn:"Continue",reviseBtn:"Revise…",stopBtn:"Stop",revisionTitle:"model proposed a plan revision",sendRevision:"Send revision",accept:"Accept",reject:"Reject",arguments:"arguments",revisePlaceholder:"What needs to change before the next step? Leave blank to just continue.",pickerFilter:"Filter…",pickerEmpty:"Nothing to show.",pickerLoadMore:"Load more",pickerPick:"Open",pickerInstall:"Install",pickerUninstall:"Uninstall",pickerRename:"Rename…",pickerNew:"New…",pickerNewPlaceholder:"Name (leave blank for default)",viewerClose:"Close"},error:{title:"Something broke in the dashboard",body:"The TUI is unaffected — only this browser tab tripped. You can dismiss and keep working, or report it so we can fix the underlying cause.",copyDetails:"Copy details",copied:"Copied ✓",reportOnGithub:"Report on GitHub",dismiss:"Dismiss (Esc)",crashing:"this panel keeps crashing — {name}",retry:"Try again",recovering:"recovering…"},fmt:{justNow:"just now",minutesAgo:"{n}m ago",hoursAgo:"{n}h ago",daysAgo:"{n}d ago"},cards:{applied:"Applied",cacheHit:"Cache hit",checkpointRewind:"Checkpoint Rewind",cost:"Cost",diffApply:"Apply",diffApplyChanges:"Apply Changes",diffAwaiting:"Awaiting review",diffDiscard:"Discard",done:"Done",elapsed:"Elapsed",error:"Error",errorName:"Error",failed:"Failed",hits:"Hits",memoryCountSuffix:"memories",memoryName:"Memory",output:"Output",planDefaultTitle:"Plan",prompt:"Prompt",compactionMeta:"{chars} chars",compactionName:"Compacted history",reasoningComplete:"Reasoning complete",reasoningName:"Reasoning",result:"Result",running:"Running",searchName:"Search",shellAlwaysAllow:"Always Allow",shellAwaiting:"Awaiting approval",shellExecuteHint:"Execute this command?",shellReject:"Reject",shellRun:"Run",shellRunning:"Running",streaming:"Streaming",subagentDone:"Subagent done",subagentDoneProgress:"Subagent done ({pct}%)",subagentFailed:"Subagent failed",subagentRunning:"Subagent running"},planBadge:{blocked:"Blocked",done:"Done",failed:"Failed",pending:"Pending",running:"Running"},composer:{atHeader:"Mention files",close:"Close",commandPalette:"Command Palette",commands:"Commands",commandsLabel:"Commands",confirm:"Confirm",imageFilterName:"Images",insertFile:"Insert File",insertImage:"Insert Image",interrupt:"Interrupt",mentionFiles:"Mention Files",mentionLabel:"Mention",newline:"New Line",noMatches:"No matches",placeholder:"Type a prompt…",queue:"Queue",queueCount:"{count} queued",select:"Select",send:"Send",slashHeader:"Slash Commands",switchModel:"Switch Model",switchEffort:"Switch Reasoning Effort",workspaceRoot:"Workspace Root"},contextPanel:{allow:"Allow",ask:"Ask",autoApproveTitle:"Auto-approve",cacheKey:"Cache",contextTokens:"Context tokens",fileInContext:"In context",fileModified:"Modified",filesCount:"{count} files",filesTab:"Files",filesTitle:"Files",freeKey:"Free",itemCount:"{count} items",mcpConfigured:"Configured",mcpConnecting:"Connecting…",mcpDisabled:"Disabled",mcpEmpty:"No MCP servers",mcpFailed:"Failed",mcpReady:"Ready",mcpReadyAll:"All ready",mcpReadySome:"Some ready",mcpTitle:"MCP",mcpTools:"Tools",memoryTab:"Memory",memoryTitle:"Memory",noFilesMsg:"No files in context",noMemoriesMsg:"No memories",reservedKey:"Reserved",ruleReadOnly:"Read-only",ruleReview:"Review",ruleShellAllowlist:"Shell allowlist",rulesTab:"Rules",ruleWritesAsk:"Writes ask",ruleYolo:"YOLO",scopeGlobal:"Global",scopeProject:"Project",toolsTab:"Tools",usedKey:"Used"},dragDrop:{overlay:"Drop files here"},extraCards:{approve:"Approve",balance:"Balance",cache:"Cache",cacheHit:"Cache hit",contextWindow:"Context window",doctorTitle:"Diagnostics",output:"Output",prompt:"Prompt",reasoning:"Reasoning",reject:"Reject",sessionCost:"Session cost",sessionUsage:"Session usage",topToolsUsage:"Top tools",unknownKind:"Unknown",memoryUser:"User",memoryFeedback:"Feedback",memoryProject:"Project",memoryReference:"Reference"},jobs:{empty:"No background jobs",exited:"Exited",kbClose:"Close",kbToggle:"Toggle",running:"Running",stop:"Stop",stopAll:"Stop All",stopAllTip:"Stop all jobs",stopOne:"Stop",title:"Background Jobs"},live:{deliveredWaiting:"Waiting for next message",reasoning:"Reasoning",running:"Running",secondsAgo:"{n}s ago",you:"You"},markdown:{copied:"Copied!",copy:"Copy",externalLinkTitle:"Open in new tab",filePillTitle:"Open file",localLinkTitle:"Open link"},palette:{abort:"Abort",abortHint:"Abort current request",about:"About",clearChat:"Clear Chat",clearChatHint:"Clear conversation",closeTab:"Close Tab",closeTabHint:"Close current tab",copyConv:"Copy Conversation",copyConvHint:"Copy conversation as Markdown",copyLast:"Copy Last Response",copyLastHint:"Copy last assistant message",countSuffix:"items",empty:"No matching commands",exportMd:"Export as Markdown",exportMdHint:"Export chat as Markdown file",focusComposer:"Focus Composer",footClose:"Close",footMove:"Move",footRun:"Run",groupAction:"Actions",groupNav:"Navigation",groupSettings:"Settings",groupWorkspace:"Workspace",newChat:"New Chat",newChatHint:"Start a new conversation",newTab:"New Tab",newTabHint:"Open a new tab",pickWorkspace:"Switch Workspace",pickWorkspaceHint:"Change workspace",searchPlaceholder:"Search commands…",settings:"Settings",settingsHint:"Open settings"},panel:{renderError:"Panel crashed"},sidebarPanel:{approvalRules:"Approval Rules",cancel:"Cancel",commandPalette:"Command Palette",daysAgo:"{n}d ago",delete:"Delete",deleteSession:"Delete Session",hoursAgo:"{n}h ago",justNow:"Just now",loading:"Loading…",messageCount:"{count} messages",minutesAgo:"{n}m ago",newChat:"New Chat",noMatches:"No matches",noSessions:"No sessions",recent:"Recent",searchSessions:"Search sessions…",sessionTitle:"Sessions",settings:"Settings",weeksAgo:"{n}w ago"},statusbar:{balance:"Balance",busy:"Busy",cache:"Cache",cacheHit:"Cache hit",jobs:"Jobs",jobsTip:"Background jobs",offline:"Offline",online:"Online",switchCurrency:"Switch currency",switchTheme:"Switch theme",switchWorkspace:"Switch workspace",themeDark:"Dark",themeLight:"Light",themeStyleGraphite:"Graphite",themeStyleSandstone:"Sandstone",themeStylePorcelain:"Porcelain",themeStyleMidnight:"Midnight",thisTurn:"This turn",tokens:"Tokens"},thread:{activePlan:"Active plan",allowRead:"Allow read",allowWrite:"Allow write",alwaysAllow:"Always allow",alwaysAllowPrefix:"Always allow {prefix}",approve:"Approve",approveRewrite:"Approve rewrite",cancel:"Cancel",checkpointKind:"Checkpoint",checkpointSub:"Save current state",checkpointTitle:"Create checkpoint",collapse:"Collapse",continue:"Continue",copyMessage:"Copy message",copyResponse:"Copy response",execute:"Execute",keepOriginal:"Keep original",keepSteps:"Keep steps",optionCount:"{count} options",pathAccessKind:"Path access",planConfirmationKind:"Plan approval",planRevisionKind:"Plan revision",planRunning:"Plan in progress",planStepCount:"Step {done}/{total}",readPathOutsideSandbox:"Read path outside sandbox",refine:"Refine",reject:"Reject",revise:"Revise",revisionMeta:"Revision",rewritePlan:"Rewrite plan",risk:"Risk assessment",riskMedium:"Medium risk",runBackgroundCommand:"Run in background",runCommand:"Run command",shellConfirmationKind:"Shell confirmation",startPlan:"Start plan",stop:"Stop",subagent:"Subagent",userChoiceKind:"User choice",writePathOutsideSandbox:"Write path outside sandbox",you:"You"},workdir:{browse:"Browse…",cancel:"Cancel",empty:"No workspaces",emptyDir:"No subdirectories.",go:"Go",goTip:"Navigate to this path",loading:"Loading…",openHere:"Open this folder",pathPlaceholder:"Absolute path…",promptWeb:"Enter the absolute path of the workspace to open:",searchPlaceholder:"Search workspaces…",title:"Workspace"},about:{close:"Close",repo:"Repository",sidebarLabel:"About",tagline:"AI-powered coding assistant",version:"Version"},effort:{lowDesc:"fastest — minimal reasoning",mediumDesc:"balanced",highDesc:"default — safe for vLLM / Azure",maxDesc:"DeepSeek extension; rejected by stock OpenAI / vLLM"},editMode:{plan:"Plan",planHint:"read-only · all write tools refuse to dispatch",review:"Review",reviewHint:"both edits and non-allowlisted shell ask first",auto:"Auto",autoHint:"edits auto-apply, shell still asks",yolo:"YOLO",yoloHint:"edits AND shell auto-run, allowlist bypassed"}},Fs={...A,app:{...A.app,sectionWorkspace:"Arbeitsbereich",sectionObserve:"Beobachten",sectionConfigure:"Konfigurieren",tabChat:"Chat",tabPlans:"Pläne",tabSessions:"Sitzungen",tabOverview:"Übersicht",tabUsage:"Nutzung",tabSystem:"System",tabSemantic:"Semantisch",tabTools:"Werkzeuge",tabPermissions:"Berechtigungen",tabMcp:"MCP",tabSkills:"Fertigkeiten",tabMemory:"Memory",tabHooks:"Hooks",tabSettings:"Einstellungen",sectionChanges:"Änderungen",tabChanges:"Änderungen",footer:"127.0.0.1 nur · token-gesichert",themeToggle:"Theme umschalten",themeLight:"Hell",themeDark:"Dunkel",skill:{...A.app.skill,scope:{...A.app.skill.scope,builtin:"Eingebaut",global:"Global",project:"Projekt"},runAs:{subagent:"Subagent",inline:"Inline"},generic:"Fertigkeit"},exportReasoningSummary:"Reasoning-Zusammenfassung",exportToolLabel:"Tool-Aufrufe",exportUserLabel:"Benutzernachrichten",empty:{...A.app.empty,currentWorkspace:"Aktueller Arbeitsbereich",selectWorkspace:"Wähle einen Arbeitsbereich zum Starten",suggestion0:"Meine letzten Commit-Änderungen überprüfen",suggestion1:"Alle TypeScript-Fehler in der aktuellen Datei beheben",suggestion2:"README ins Chinesische/Englische übersetzen",suggestion3:"CHANGELOG für dieses Repo generieren",welcome:"Willkommen bei Reasonix"},errorLabel:"Fehler",connecting:"Verbinde…",session:{...A.app.session,format:"Sitzung",new:"Neue Sitzung"},setup:{...A.app.setup,choose:"Arbeitsbereich wählen",description:"Wähle einen Arbeitsbereich zum Starten",notSelected:"Kein Arbeitsbereich ausgewählt",saveAndStart:"Speichern & Starten",welcome:"Willkommen",workspace:"Arbeitsbereich"},tab:{...A.app.tab,newTab:"+ Neuer Tab",newTabTitle:"Neuen Tab öffnen"},titlebar:{...A.app.titlebar,clearChat:"Chat leeren",close:"Schließen",commandPalette:"Befehlsübersicht",contextPanel:"Kontext-Panel",copyMd:"Als Markdown kopieren",exportMd:"Als Markdown exportieren",maximize:"Maximieren",minimize:"Minimieren",more:"Mehr",restore:"Wiederherstellen",settings:"Einstellungen",sidebar:"Seitenleiste",windowControls:"Fenstersteuerung"},toast:{...A.app.toast,cleared:"Chat geleert",copied:"In die Zwischenablage kopiert",copiedMd:"Als Markdown kopiert",emptySession:"Keine Nachrichten zum Exportieren",exportDialogTitle:"Chat exportieren",exportedMd:"Als Markdown exportiert",exportFailed:"Export fehlgeschlagen",langSwitched:"Sprache gewechselt",modelSwitched:"Modell → {model}",effortSwitched:"Effort → {effort}",modeSwitched:"Modus gewechselt",newSession:"Neue Sitzung erstellt"},yolo:{...A.app.yolo,toast:"YOLO-Modus aktiviert"},cmd:{...A.app.cmd,abort:"Abbrechen",btw:"BTW",clearChat:"Chat leeren",compact:"Komprimieren",copyLast:"Letzte kopieren",exportMd:"Als Markdown exportieren",feedback:"Feedback",help:"Hilfe",newSession:"Neue Sitzung",retry:"Erneut versuchen",switchModel:"Modell wechseln",toggleCurrency:"Währung wechseln",toggleLang:"Sprache wechseln",toggleTheme:"Theme wechseln"},header:{...A.app.header,abort:"Abbrechen",clickToSelect:"Klicken zum Auswählen",copy:"Kopieren",copyMd:"Als Markdown kopieren",export:"Exportieren",exportMd:"Als Markdown exportieren",newChat:"Neuer Chat",noWorkspace:"Kein Arbeitsbereich",running:"Läuft…"},jumpToBottom:"Nach unten springen",langEN:"Englisch",langZH:"中文",splashSubtitle:"KI-gestützter Coding-Assistent"},changes:{...A.changes,chatPlaceholder:"Frag etwas zu deinem Code...",chatWelcome:"Änderungen — stelle Fragen zu deinen Projektdateien.",chatSend:"Senden",viewerPlaceholder:"Wähle eine Datei zum Anzeigen",treeEmpty:"(leer)",tabClose:"Tab schließen",newConversation:"Neu",clearConversation:"Leeren",newTitle:"/new — Gesprächskontext löschen",clearTitle:"/clear — sichtbaren Scrollback leeren",newConfirmBusy:"Ein Turn läuft gerade. Abbrechen und neues Gespräch beginnen?",newConfirm:"Aktuelles Gespräch leeren und neu beginnen?",newToast:"neues Gespräch",clearToast:"Scrollback geleert",newFailed:"/new fehlgeschlagen: {error}",clearFailed:"/clear fehlgeschlagen: {error}",chatSendBtn:"Senden",fileTreeTitle:"Dateien",codeViewerTitle:"Code-Ansicht",chatPanelTitle:"Chat",loadingFiles:"Lade Projektdateien…",review:"Überprüfen",allFiles:"Alle Dateien",changes:"Änderungen",commentLabel:"Kommentar zu Zeile",commentPlaceholder:"Kommentar hinzufügen…",commentCancel:"Abbrechen",commentSubmit:"Kommentieren",commentLine:"Zeile",commentEdit:"Bearbeiten",commentDelete:"Löschen",diffSourceGit:"Git-Änderungen",diffSourceSession:"Vorherige Sitzung",diffSourceCheckpoint:"Checkpoint",checkpointEmpty:"Noch keine Checkpoints in diesem Arbeitsbereich.",restoreBtn:"Wiederherstellen",restoreConfirm:'"{name}" wiederherstellen? Dies überschreibt aktuelle Dateien.',deleteBtn:"Löschen",deleteConfirm:'Checkpoint "{name}" löschen? Der Schnappschuss wird entfernt, Dateien bleiben unverändert.',createBtn:"Schnappschuss",createPlaceholder:"Name für Schnappschuss…",backToList:"zurück zur Liste",reviewEmpty:"Keine ausstehenden Überprüfungen.",diffStyleUnified:"Unifiziert",diffStyleSplit:"Geteilt",expandAll:"Alle erweitern",collapseAll:"Alle einklappen",createFailed:"Erstellen fehlgeschlagen",restoreFailed:"Wiederherstellen fehlgeschlagen",deleteFailed:"Löschen fehlgeschlagen"},common:{...A.common,loading:"lade...",loadingFailed:"{name} fehlgeschlagen: {error}",back:"← zurück",save:"Speichern",remove:"entfernen",cancel:"Abbrechen",delete:"Löschen",add:"Hinzufügen",confirm:"Bestätigen",noData:"Noch keine {name}.",all:"alle",yes:"ja",no:"nein",on:"AN",off:"aus",enabled:"aktiviert",disabled:"deaktiviert"},settings:{...A.settings,title:"Einstellungen",loading:"Einstellungen werden geladen...",saved:"gespeichert: {fields}",sectionApi:"DeepSeek API",apiKey:"API-Schlüssel",apiKeyNotSet:"Nicht gesetzt",apiKeySave:"Schlüssel speichern",apiKeySet:"Gesetzt",apiSection:"API-Konfiguration",notSet:"(nicht gesetzt)",replace:"ersetzen",pasteKey:"füge ein neues sk-…-Token ein",saveKey:"Schlüssel speichern",baseUrl:"Basis-URL",baseUrlPlaceholder:"https://api.deepseek.com (Standard)",baseUrlHint:"Basis-URL für API-Anfragen",sectionDefaults:"Standardwerte",effortSection:"Reasoning-Effort",modelCustom:"Benutzerdefinierte Modell-ID",modelCustomHint:"Jede OpenAI-kompatible ID, die dein Endpunkt bereitstellt (vLLM, Ollama, Together, …).",modelCustomActive:"Läuft aktuell auf benutzerdefinierter ID: {model}",appliesNextTurn:"gilt ab nächstem Turn",effort:"Effort",effortMax:"max (DeepSeek-Erweiterung — von stock OpenAI / vLLM abgelehnt)",effortHigh:"hoch (sicherer Standard — vLLM / Azure kompatibel)",effortMedium:"mittel",effortLow:"niedrig (am schnellsten)",webSearch:"Websuche",webSearchNote:"web_fetch + web_search Werkzeuge",webSearchEngine:"Suchmaschine",webSearchEngineBing:"bing — Standard, funktioniert von CN ohne Proxy",webSearchEngineSearxng:"searxng — selbst gehostet (Endpunkt via /se searxng <url>)",webSearchEngineMetaso:"metaso — 100/Tag kostenlos (CN-freundlich, kostenloser Schlüssel auf metaso.cn)",webSearchEngineTavily:"tavily — 1000/Monat kostenlos (TAVILY_API_KEY setzen)",webSearchEnginePerplexity:"perplexity — AI-native (PERPLEXITY_API_KEY setzen)",webSearchEngineExa:"exa — AI-native 1000/Monat kostenlos (EXA_API_KEY setzen)",webSearchEngineBrave:"brave — unabhängiger Index, 2000/Monat kostenlos (BRAVE_SEARCH_API_KEY setzen)",webSearchEngineOllama:"ollama — Ollama Cloud-Websuche (OLLAMA_API_KEY setzen)",webSearchEngineNote:"gilt für den nächsten web_search-Aufruf",sectionBudget:"Budget",budget:"Budget",budgetHint:"Ausgabengrenzen festlegen",budgetPlaceholder:"Budgetbetrag eingeben",budgetOf:"von",budgetSetCap:"Grenze setzen",budgetCustom:"benutzerdefiniert",budgetBumpHint:"Grenze erhöhen, um fortzufahren",budgetClear:"Grenze entfernen",budgetIdleLine:"warnt bei 80 % · verweigert ab 100 %",budgetWarnLine:"Grenze naht — Schleife wird ab 100 % verweigern",budgetRefusing:"Grenze erschöpft — nächster Turn verweigert bis Erhöhung oder Löschung",sectionLoop:"Schleife",loopIdleHint:"Prompt automatisch in festem Intervall erneut senden.",loopCostHint:"Jede Iteration kostet ~{cost} (letzter Turn).",loopInterval:"Intervall",loopCustom:"benutzerdefiniert",loopRangeError:"Intervall muss zwischen 5s und 6h liegen",loopPrompt:"Prompt",loopPromptPlaceholder:"z.B. überprüfe den Bereitstellungsstatus und melde Fehler",loopStart:"Schleife starten",loopStop:"Stopp",loopRunning:"läuft",loopIter:"Iteration {iter}",loopFiresIn:"startet in {remaining}",sectionSkills:"Fertigkeiten",skillPaths:"Skill-Pfade",skillPathsPlaceholder:"/pfad/zu/skills-a, /pfad/zu/skills-b",skillPathsNote:"kommagetrennt · nächstes /new oder neue Sitzung",skillsEmpty:"Keine Skills geladen",skillsLoaded:"Skills geladen",subagentModelFlash:"flash",subagentModelPro:"pro",subagentModelHint:"Modell, das verwendet wird, wenn dieser Skill seinen isolierten Subagenten startet",sectionRuntime:"Laufzeit",activeModel:"aktives Modell",model:"Modell",modelFlashDesc:"Flash — immer flash",modelProDesc:"Pro — immer pro",modelPricingLine:"${hit} Treffer · ${miss} Fehler · ${out} Ausgabe pro 1M Tokens",editMode:"Bearbeitungsmodus",editModeNote:"Umschaltung über den Chat-Tab-Header",editModeHint:"Bearbeitungsmodus konfigurieren",showSystemEvents:"Systemereignisse",showSystemEventsHint:"Zeige leise Inline-Hinweise zur Kontextkomprimierung, Abbruch, Ratelimit.",shown:"angezeigt",hidden:"ausgeblendet",sectionLanguage:"Sprache",language:"Sprache",languageHint:"Sprache wechseln",langEn:"English",langZhCn:"简体中文",appMode:"App-Modus",appearanceSection:"Darstellung",behaviorSection:"Verhalten",ruleAutoApprovalHint:"Auto-Genehmigungsregeln konfigurieren",ruleAutoApprovalSection:"Auto-Genehmigungsregeln",theme:"Theme",themeDark:"Dunkel",themeHint:"Zwischen hellem und dunklem Theme wechseln",themeLight:"Hell",themeStyle:"Theme-Stil",themeStyleHint:"Theme-Stil wählen",themeStyleGraphite:"Graphit",themeStyleGraphiteDesc:"Kühle dunkle Neutrale — am besten für lange Sitzungen.",themeStyleSandstone:"Sandstein",themeStyleSandstoneDesc:"Warme helle Töne — angenehm in hellen Räumen.",themeStylePorcelain:"Porzellan",themeStylePorcelainDesc:"Sauberes Hell mit extra Kontrast.",themeStyleMidnight:"Mitternacht",themeStyleMidnightDesc:"Tiefes Dunkel mit kühleren Highlights.",pageGeneralLabel:"Allgemein",pageGeneralDesc:"Theme, Schriften, Sprache und Arbeitsbereich.",pageModelsLabel:"Modelle",pageModelsDesc:"Standardmodell und Reasoning-Effort.",pageMcpLabel:"MCP-Server",pageMcpDesc:"Externe Tool-Server verbinden.",pageSkillsLabel:"Skills",pageSkillsDesc:"Benutzerdefinierte Skills, die mit /skill ausgeführt werden.",pageMemoryLabel:"Memory",pageMemoryDesc:"Langzeitnotizen, die sitzungsübergreifend mitgeführt werden.",pageRulesLabel:"Regeln",pageRulesDesc:"Auto-Genehmigungsregeln für Shell- und Pfadzugriff.",pageBillingLabel:"Abrechnung",pageBillingDesc:"API-Schlüssel, Guthaben und Sitzungsbudget.",pageShortcutsLabel:"Kürzel",pageShortcutsDesc:"Tastaturkürzel-Referenz.",fontFamily:"Schriftfamilie",fontFamilyHint:"Schriftfamilie wählen",fontFamilySans:"Serifenlos",fontFamilySerif:"Serife",fontFamilySystem:"System",fontScale:"Schriftgröße",fontScaleHint:"Schriftgröße anpassen",fontScaleLarge:"Groß",fontScaleMedium:"Mittel",fontScaleSmall:"Klein",currentWorkspace:"Aktueller Arbeitsbereich",defaultModelCurrent:"Aktuelles Modell",editor:"Editor",editorHint:"Editor-Einstellungen konfigurieren",maxOutput:"Max. Ausgabe",reasoningEffort:"Reasoning-Effort",reasoningEffortHint:"Reasoning-Tiefe anpassen",sessionCost:"Sitzungskosten",balanceAvailable:"Verfügbar",balanceLabel:"Guthaben",balanceLow:"Niedriges Guthaben",cacheHitRate:"Cache-Trefferquote",ctxWindow:"Kontextfenster",notSelected:"Nicht ausgewählt",parseError:"Parse-Fehler",workspaceChange:"Ändern",workspaceSection:"Arbeitsbereich",mcpAdd:"Hinzufügen",mcpAddSection:"MCP-Server hinzufügen",mcpBridged:"Verbunden",mcpConfigured:"Konfiguriert",mcpEmpty:"Keine MCP-Server",mcpNotBridged:"Nicht verbunden",mcpRemove:"Entfernen",mcpSpecFormat:"JSON-Format",mcpSpecLabel:"Server-Spec",memoryDesc:"Memory-Einstellungen konfigurieren",memorySection:"Memory",shortcutAbort:"Abbrechen",shortcutCloseTab:"Tab schließen",shortcutCommandPalette:"Befehlsübersicht",shortcutFocusComposer:"Composer fokussieren",shortcutNewChat:"Neuer Chat",shortcutNewTab:"Neuer Tab",shortcutSettings:"Einstellungen",shortcutSwitchTab:"Tab wechseln",qqAccessAllowlist:"Allowlist",qqAccessOpen:"Offen",qqAccessOwner:"Besitzer",qqAccessOwnerWithAllowlist:"Besitzer + Allowlist",qqAccessRuntime:"Laufzeit",qqAppId:"App-ID",qqApplyAction:"Anwenden",qqApplyLabel:"Anwenden",qqAppSecret:"App-Secret",qqBack:"Zurück",qqConfigure:"Konfigurieren",qqConfigureHint:"QQ-Integration einrichten",qqConfigureTitle:"QQ-Konfiguration",qqConnected:"Verbunden",qqConnecting:"Verbinde…",qqDisconnected:"Getrennt",qqEnvironment:"Umgebung",qqFailed:"Fehlgeschlagen",qqProduction:"Produktion",qqSandbox:"Sandbox",qqSave:"Speichern",qqSaveAndConnect:"Speichern & Verbinden",qqSection:"QQ-Integration",qqSummaryAppId:"App-ID",qqSummaryDetail:"Details",qqSummaryMissing:"Nicht konfiguriert",qqTitle:"QQ-Bot"},chat:{...A.chat,modeMirror:"TUI-Spiegel",modeView:"Sitzungsansicht",placeholder:"Prompt eingeben – Enter sendet, Shift+Enter für neue Zeile · / @ für Auswahl",placeholderBusy:"warte auf Abschluss des aktuellen Turns…",placeholderSteerBusy:"tippe zum Steuern — Befehle und Auswahl sind während des Betriebs deaktiviert",steerHint:"Nachricht steuert den aktuellen Turn (wird als Anweisung hinzugefügt)",send:"Senden",new:"Neu",clear:"Leeren",newTitle:"/new — Gesprächskontext löschen (Schleifenlog + Scrollback)",clearTitle:"/clear — nur sichtbaren Scrollback leeren (Kontext bleibt)",noConversation:"Noch keine Unterhaltung. Sende unten einen Prompt.",newConfirmBusy:"Ein Turn läuft gerade. Abbrechen und neues Gespräch beginnen?",newConfirm:"Aktuelles Gespräch leeren und neu beginnen?",newToast:"neues Gespräch",clearToast:"Scrollback geleert",newFailed:"/new fehlgeschlagen: {error}",clearFailed:"/clear fehlgeschlagen: {error}",eventStreamError:"Ereignisstrom unterbrochen — verbinde neu…",semanticBanner:"Semantische Suche ist für dieses Projekt nicht aktiviert.",semanticBannerDesc:"Erstelle den Index einmal, und das Modell kann Code anhand der Bedeutung finden (»Wo behandeln wir Authentifizierungsfehler?«) statt nach exakten Zeichenketten zu greppen.",semanticBannerBtn:"Erstellen →",semanticBannerDismiss:"ausblenden (nicht wieder anzeigen)",slashCommands:"Slash-Befehle",projectFiles:"Projektdateien",effortTitle:"reasoning_effort — gilt ab nächstem Turn",effortMaxTitle:"max (DeepSeek-Erweiterung)",effortHighTitle:"hoch (sicherer Standard — vLLM / Azure kompatibel)",effortMediumTitle:"mittel",effortLowTitle:"niedrig (am schnellsten)",editGateTitle:"Edit-Gate — Shift+Tab schaltet in der TUI",editReviewTitle:"review — sowohl Edits als auch nicht-allowlistete Shell fragen zuerst",editAutoTitle:"auto — Edits auto-anwenden, Shell fragt weiterhin",editYoloTitle:"yolo — Edits UND Shell auto-ausführen, Allowlist umgangen",railSession:"Sitzung",railTurns:"Turns",railPromptTok:"Prompt-Tok",railCost:"Kosten",railCacheHit:"Cache-Treffer",railToolBudget:"Tool-Budget",railSpend:"Ausgaben",railActivePlan:"Aktiver Plan",railProgress:"Fortschritt",statusModel:"Modell",statusCtx:"Kontext",statusCache:"Cache",statusTurn:"Turn",statusSession:"Sitzung",statusBalance:"Guthaben",statusTurns:"{count} Turn{s}",waitingStats:"··· warte auf Live-Statistiken",inflightPhase:"{phase}",inflightRunning:"läuft",inflightThinking:"denkt nach",inflightStreaming:"streamt",inflightWaiting:"wartet",inflightReasoning:"Reasoning {count} Zch",inflightOut:"Ausgabe {count} Zch",abortBtn:"Abbrechen (Esc)",confirmBtn:"Anwenden (y)",rejectBtn:"Ablehnen (n)",applyRestBtn:"Rest anwenden (a)",flipAutoBtn:"Zu AUTO umschalten (A)"},overview:{...A.overview,loading:"lade Übersicht…",failed:"Übersicht fehlgeschlagen: {error}",standaloneTitle:"Standalone-Modus",standaloneDesc:"Schreibgeschützte Plattenansicht. Starte /dashboard von innerhalb von reasonix code für Live-Sitzungsstatus, MCP und Tools.",cockpit:"Cockpit",balance:"Guthaben",tokens7d:"Tokens · 7d",cacheHit:"Cache-Treffer",toolCalls24h:"Tool-Aufrufe · 24h",budget:"Budget",currentSession:"aktuelle Sitzung",noSession:"Keine Live-Sitzung — /dashboard von reasonix code aus, um dich zu verbinden.",promptTok:"Prompt-Tok",completionTok:"Completion-Tok",cost:"Kosten",costTrend:"Kosten · 14 Tage",noUsageYet:"noch keine Nutzung",dayAvg:"/Tag Ø",recentPlans:"letzte Pläne",noPlans:"Noch keine Pläne — erstelle einen mit submit_plan.",toolActivity:"Tool-Aktivität",noToolCalls:"Noch keine Tool-Aufrufe.",toolsLoaded:"Tools geladen",mcpServers:"MCP-Server",editMode:"Bearbeitungsmodus",version:"Reasonix",workingDir:"Arbeitsverzeichnis",projectRoot:"Projekt-Root",noPriorData:"keine vorherigen Daten",stable:"— stabil",vsPrior:"{arrow} {pct}% vs. vorher",active:"aktiv",allUp:"alle betriebsbereit",yoloWarning:"alle Prompts umgangen",checking:"prüfe",latest:"neueste"},usage:{...A.usage,loading:"lade Nutzung…",failed:"Nutzung fehlgeschlagen: {error}",records:"{count} Datensätze",dailyUsage:"Tägliche Nutzung",dailyMeta:"Kosten · Cache-Ersparnis · Turns",noData:"Noch keine Nutzungsdaten — führe einen Turn in reasonix chat / code / run aus und aktualisiere.",windows:"Rollierende Fenster",colWindow:"Fenster",colTurns:"Turns",colCacheHit:"Cache-Treffer",colCost:"Kosten (USD)",colCacheSaved:"Cache gespart",colVsClaude:"vs. Claude",colSaved:"gespart",axisTime:"Zeit",axisUsd:"USD",axisTurns:"Turns",seriesCost:"Kosten",seriesCacheSaved:"Cache gespart",seriesTurns:"Turns",mostUsed:"Meistgenutzte Modelle",colModel:"Modell"},sessions:{...A.sessions,loading:"lade Sitzungen…",failed:"Sitzungen fehlgeschlagen: {error}",noSessions:"Noch keine gespeicherten Sitzungen.",filterPlaceholder:"Sitzungen filtern",msgs:"Nachr",pickHint:"Wähle links eine Sitzung, um ihr Transkript zu lesen.",resumeTitle:"In TUI fortsetzen",resumeDesc:"Ein Sitzungswechsel mid-Session erfordert einen Neustart, damit der Nachrichtenverlauf sauber zurückgespult werden kann. Beende deine aktuelle Sitzung und führe dann aus:",loadingTranscript:"lade Transkript…",emptyTranscript:"leeres Transkript.",messages:"{count} Nachricht{s}",newBtn:"Neue Sitzung",newHint:"Aktuelles Gespräch archivieren und neues beginnen",switchBtn:"Zu dieser Sitzung wechseln",deleteBtn:"Löschen",deleteConfirm:'Sitzung "{name}" löschen? Dies entfernt die Transkriptdatei und kann nicht rückgängig gemacht werden.',cantDeleteActive:"Wechsle zu einer anderen Sitzung, bevor du diese löschst.",attachRequired:"Live-Sitzungsoperationen benötigen eine angehängte CLI-Sitzung. Starte über reasonix chat oder öffne das Dashboard von einer TUI-Sitzung aus.",activeChip:"aktiv",activePill:"aktiv"},tools:{...A.tools,loading:"lade Tools…",failed:"Tools fehlgeschlagen: {error}",noTools:"Keine Tools registriert.",planMode:"Plan-Modus — Schreibzugriffe blockiert",colTool:"Tool",colFlags:"Flags",colDesc:"Beschreibung",readOnly:"schreibgeschützt",write:"schreiben",flat:"flach",desc:{...A.tools.desc,web_search:"Durchsuche das öffentliche Web. Liefert sortierte Ergebnisse mit Titel, URL und Ausschnitt. Verwende dies, wenn die Antwort vom aktuellen Zustand abhängt — Ereignisse, Preise, Veröffentlichungen, Echtzeit-Status.",web_fetch:"Lade eine URL herunter und gib den sichtbaren Textinhalt zurück (Skripte/Styles/Navigation entfernt). Nach web_search verwenden, wenn ein Ausschnitt nicht ausreicht.",run_command:"Führe einen Shell-Befehl im Projekt-Root aus; gibt kombinierte stdout+stderr zurück. Allowlistete schreibgeschützte Befehle werden sofort ausgeführt; Änderungen benötigen Benutzerbestätigung.",run_background:"Starte einen langlebigen Prozess und trenne ihn. Liefert eine Job-ID zum Verfolgen der Logs, Warten auf Abschluss oder Beenden. Für Dev-Server, Watcher und einmalige Langzeit-Jobs.",job_output:"Lies die neueste Ausgabe eines Hintergrund-Jobs. Gibt das Ende des Puffers zurück und sagt dir, ob der Job noch läuft.",wait_for_job:"Blockiere serverseitig, bis ein Hintergrund-Job abgeschlossen ist, zeitlich begrenzt. Statt job_output in einer Schleife zu pollen.",stop_job:"Stoppe einen Hintergrund-Job. SIGTERM zuerst, SIGKILL nach einer Gnadenfrist. Sicher für bereits beendete Jobs.",list_jobs:"Liste jeden in dieser Sitzung gestarteten Hintergrund-Job auf — laufende und beendete — mit ID, Befehl, PID und Status.",remember:"Speichere eine Erinnerung für zukünftige Sitzungen. Verwende, wenn der Benutzer eine Präferenz angibt, deinen Ansatz korrigiert, eine nicht offensichtliche Tatsache teilt oder dich bittet, etwas zu merken.",forget:"Lösche eine Memory-Datei und entferne sie aus MEMORY.md. Verwende, wenn der Benutzer vergessen möchte oder eine gespeicherte Tatsache jetzt falsch ist.",recall_memory:"Lies den vollständigen Body einer Memory-Datei, wenn die einzeilige Zusammenfassung nicht genug Detail bietet.",read_file:"Lese eine Datei unter dem Sandbox-Root. Unterstützt head/tail/range-Begrenzung zum Kontextsparen. Gibt automatisch eine Vorschau für Dateien über 200 Zeilen zurück.",list_directory:"Liste Einträge in einem Verzeichnis auf. Gibt eine Zeile pro Eintrag zurück und markiert Verzeichnisse mit einem Schrägstrich.",directory_tree:"Liste Einträge in einem Verzeichnis rekursiv als eingerückten Baum auf. Budget-bewusst mit automatischem Einklappen für große Unterbäume.",search_files:"Finde Dateien, deren NAME einem Teilstring oder Regex entspricht. Groß-/Kleinschreibung unwichtig. Überspringt standardmäßig Abhängigkeits-/Build-Verzeichnisse.",search_content:"Durchsuche Dateiinhalte rekursiv mit grep nach einem Teilstring oder Regex. Liefert Treffer im Format pfad:zeile:text. Das richtige Werkzeug zum Finden von Referenzen.",glob:"Liste Dateien, die einem Glob-Muster entsprechen, sortiert nach Änderungsdatum. Standardlimit 200, max 1000. Überspringt node_modules/.git/dist standardmäßig.",get_file_info:"Ermittle Informationen zu einem Pfad unter dem Sandbox-Root. Liefert Typ, Größe in Bytes und Änderungsdatum.",write_file:"Erstelle oder überschreibe eine Datei mit dem angegebenen Inhalt. Übergeordnete Verzeichnisse werden bei Bedarf erstellt.",edit_file:"Wende eine SEARCH/REPLACE-Bearbeitung auf eine vorhandene Datei an. Die Suche muss exakt übereinstimmen und in der Datei eindeutig sein.",multi_edit:"Wende N SEARCH/REPLACE-Bearbeitungen atomar auf eine oder mehrere Dateien an. Wenn eine Bearbeitung fehlschlägt, werden keine Dateien geschrieben.",create_directory:"Erstelle ein Verzeichnis (und alle fehlenden übergeordneten) unter dem Sandbox-Root.",move_file:"Benenne eine Datei oder ein Verzeichnis unter dem Sandbox-Root um oder verschiebe es.",delete_file:"Lösche eine Datei unter dem Sandbox-Root. Lehnt Verzeichnisse ab — verwende delete_directory dafür.",delete_directory:"Lösche rekursiv ein Verzeichnis unter dem Sandbox-Root. Übergib recursive:false, um nicht-leere Verzeichnisse abzulehnen.",copy_file:"Kopiere eine Datei oder ein Verzeichnis unter dem Sandbox-Root. Lehnt das Überschreiben eines vorhandenen Ziels ab.",submit_plan:"Reiche einen konkreten Plan für ein Review-Gate ein. Für dateiübergreifende Refactorings, Architekturänderungen oder alles, was teuer rückgängig zu machen ist.",mark_step_complete:"Markiere einen Schritt des genehmigten Plans als erledigt. Genau einmal nach Abschluss jedes Schritts aufrufen.",revise_plan:"Ersetze gezielt die verbleibenden Schritte eines laufenden Plans. Erledigte Schritte werden nie berührt.",run_skill:"Rufe ein Playbook aus dem Skills-Index auf. Übergib den bloßen Skill-Namen. Subagent-gekennzeichnete Skills starten einen isolierten Subagenten.",spawn_subagent:"Starte einen isolierten Subagenten für eine in sich geschlossene Teilaufgabe. Für paralleles Fan-out oder wenn die Arbeit viele Dateilesevorgänge benötigt.",todo_write:"Aufgaben-Tracker innerhalb der Sitzung für mehrschrittige Arbeit. Ersetzt bei jedem Aufruf die gesamte Liste. Kein Genehmigungs-Gate oder Dateischreibvorgänge.",ask_choice:"Präsentiere 2–6 Alternativen dem Benutzer. Verwende, wenn der Benutzer nach Optionen fragt oder du eine Präferenzentscheidung benötigst.",create_skill:"Erstelle ein neues Skill-Gerüst, das der Benutzer später mit /skill aufrufen kann. Unterstützt Inline- und Subagent-Ausführungsmodi.",add_mcp_server:"Registriere einen neuen MCP-Server in der Konfiguration des Benutzers. Wirkt ab der nächsten Sitzung. Unterstützt stdio, SSE und streamable-http."}},permissions:{...A.permissions,loading:"lade Berechtigungen…",failed:"Berechtigungen fehlgeschlagen: {error}",yoloTitle:"YOLO-Modus",yoloDesc:"Jeder Shell-Befehl läuft automatisch, Allowlist umgangen. Zurück mit /mode review in der TUI.",project:"Projekt",builtin:"Eingebaut",addPrefix:"Präfix hinzufügen",addPlaceholder:'z.B. "npm run build" oder "deploy.sh"',clearAll:"Alle löschen",alreadyIn:"{prefix} bereits in der Liste",added:"hinzugefügt: {prefix}",removed:"entfernt: {prefix}",cleared:"{count} Eintrag{Einträge} gelöscht",removeConfirm:'"{prefix}" aus der Allowlist dieses Projekts entfernen?',clearConfirm:"Alle Projekt-Allowlist-Einträge löschen? Builtin-Einträge bleiben unberührt.",projectAllowlist:"Projekt-Allowlist · {count}",nothingStored:"Noch nichts für dieses Projekt gespeichert.",colNum:"#",colPrefix:"Präfix",builtinTitle:"Eingebaut · {count} · schreibgeschützt",standaloneWarning:"Änderungen erfordern /dashboard von innerhalb einer aktiven reasonix code-Sitzung — das Standalone-Dashboard kann nicht erkennen, welche Projekt-Allowlist zu bearbeiten ist."},mcp:{...A.mcp,loading:"lade MCP…",servers:"MCP-Server · {count} verbunden",all:"alle",live:"live",unbridged:"unverbunden",specPlaceholder:"Spec — z.B. fs=npx -y @modelcontextprotocol/...",saved:"gespeichert",savedRestart:"gespeichert — starte reasonix code neu, um diesen Server zu verbinden",removed:"entfernt — starte neu, um die Live-Verbindung zu trennen",removeConfirm:`MCP-Spec aus Konfiguration entfernen?
8
8
 
9
- {spec}`,noServers:"Keine MCP-Server in dieser Sitzung.",tools:"Tools",inConfig:"in Konfiguration · nicht geladen",unbridgedTitle:"unverbunden · in Konfiguration",removeBtn:"Entfernen",spec:"Spec",whyUnbridged:"Warum unverbunden?",whyUnbridgedDesc:"Diese Spec befindet sich in deiner config.json, ist aber nicht in die Live-Sitzung eingebunden. MCP-Server werden beim Start von reasonix code angehängt; das Dashboard allein kann den Kindprozess nicht starten.",whyUnbridgedHint:"Zum Aktivieren: starte reasonix code neu und aktualisiere dieses Dashboard.",bridgeFailed:"Verbindung fehlgeschlagen",bridgeFailedTitle:"Verbindung fehlgeschlagen · in Konfiguration",bridgeFailedHint:"Reasonix hat versucht, diesen Server zu verbinden, und der Versuch ist fehlgeschlagen. Häufige Ursachen: falsche URL, fehlender Auth-Header, upstream 404/5xx, fehlender lokaler Befehl. Behebe und starte reasonix code neu.",pickHint:"Wähle links einen MCP-Server zum Inspizieren von Tools / Ressourcen / Prompts.",toolsTitle:"Tools · {count}",resourcesTitle:"Ressourcen · {count}",promptsTitle:"Prompts · {count}",colName:"Name",colDesc:"Beschreibung",colUri:"URI",marketplace:"Marktplatz",marketplaceSearch:"Registry durchsuchen…",marketplaceLoading:"lade Registry…",marketplaceMore:"5 weitere Seiten laden",marketplaceMoreLabel:"50 mehr laden · zeige {shown} / {total}",marketplaceMoreHint:"ruft weitere Seiten von der Registry ab",marketplaceMoreCachedHint:"weitere Einträge bereits lokal zwischengespeichert",marketplaceExhausted:"alle Seiten geladen",marketplaceExhaustedFull:"zeige alle {total} Einträge — Registry erschöpft",marketplaceCount:"{loaded} geladen · {matched} Treffer · Quelle: {source}{cached}",marketplaceCachedSuffix:" · zwischengespeichert",marketplaceNoMatches:"Keine Treffer. Versuche andere Begriffe oder lade mehr Seiten.",marketplaceInstall:"Installieren",marketplacePickHint:"Wähle links einen Server, dann Installieren.",marketplaceInstalled:"installiert → {spec}",marketplaceInstalledBridged:"installiert + verbunden → {spec}",marketplaceAlready:"bereits installiert",marketplaceNeedsEnv:"benötigt Umgebungsvariable: {names}",marketplaceSourceTag:"[{source}]",marketplaceNoInstall:"Smithery-Eintrag — Installationsmetadaten nicht verfügbar; verwende `npx -y @smithery/cli install {name}` direkt",marketplaceFetchOnInstall:"Smithery-Eintrag — Installationsdetails werden bei Install abgerufen. HTTP-Server werden als streamable-http-Remotes abgebildet; stdio-Server laufen über @smithery/cli.",marketplaceInstalledBadge:"installiert",marketplaceUninstall:"Deinstallieren",marketplaceEnvTitle:"Erforderliche Umgebungsvariablen",marketplaceEnvHint:"Setze diese in deiner Shell vor dem nächsten `reasonix code`, damit der verbundene Server authentifizieren kann.",marketplaceRestartHint:"Spec in ~/.reasonix/config.json geschrieben. Starte `reasonix code` neu, um den Server zu verbinden (Live-Hot-Reload ist auf der Roadmap)."},memory:{...A.memory,loading:"lade Memory…",files:"Memory · {count} Dateien",exists:"existiert",create:"erstellen",noFiles:"Noch keine Memory-Dateien.",pickHint:"Wähle links eine Memory-Datei.",pickDesc:"Projekt-REASONIX.md ist commitierbar; globale Notizen leben in ~/.reasonix/memory/.",chars:"{count} Zeichen",saved:"{scope} gespeichert",reloadHint:"wird beim nächsten /new oder Sitzungsneustart neu angewendet"},hooks:{...A.hooks,loading:"lade Hooks…",resolved:"aufgelöst",eventMatrix:"Ereignismatrix",matrixSub:"{scripts} Skript{s} × {events} Ereignis{se}",noHooks:"Keine Hooks konfiguriert. Bearbeite das JSON unten, um welche hinzuzufügen.",colScript:"Skript",noProject:"Kein aktives Projekt — öffne /dashboard von reasonix code, um Projekt-Hooks zu bearbeiten.",saveReload:"Speichern + Neu laden",discard:"Änderungen verwerfen",savedReloaded:"{scope} gespeichert + neu geladen",recentRuns:"Letzte Ausführungen",noRuns:"Keine Hook-Ausführungen im aktuellen Sitzungslog.",colWhen:"Wann",colPhase:"Phase",colHook:"Hook",colOutcome:"Ergebnis"},skills:{...A.skills,loading:"lade Skills…",filterPlaceholder:"Skills filtern",project:"Projekt",custom:"Benutzerdefiniert",global:"Global",builtin:"Eingebaut",newSkill:"neuer Skill",noDescription:"(keine Beschreibung)",runs7d:"Ausführungen · 7d",pickHint:"Wähle links einen Skill oder erstelle oben einen neuen.",readOnlyBuiltin:"schreibgeschützt · eingebaut",readOnlyCustom:"schreibgeschützt · benutzerdefinierter Pfad",builtinDesc:"Eingebaute Skills werden mit Reasonix ausgeliefert; das Modell nimmt sie automatisch auf. Zum Anpassen erstelle einen Skill mit gleichem Namen im Projekt- oder globalen Bereich.",saved:"{scope}/{name} gespeichert",deleteConfirm:"Skill {scope}/{name} löschen?",reloadHint:"wird beim nächsten /new oder Sitzungsneustart neu geladen"},system:{...A.system,loading:"lade Gesundheit…",failed:"Gesundheitscheck fehlgeschlagen: {error}",healthChecks:"Gesundheitsprüfungen",version:"Version",checking:"prüfe",latest:"● aktuell",outOfDate:"● veraltet",versionPending:"Versionsprüfung ausstehend",upToDate:"aktuell",latestVer:"neueste: {version}",sessions:"Sitzungen",ok:"● ok",memory:"Memory",semanticIndex:"Semantischer Index",built:"● erstellt",none:"— keine",runIndex:"führe reasonix index zum Erstellen aus",usageLog:"Nutzungslog",backgroundJobs:"Hintergrund-Jobs",noSession:"— keine Sitzung",running:"{count} laufend",attachHint:"Sitzung anhängen, um Jobs zu sehen",shellSpawn:"Shell + Start",paths:"Pfade",home:"Home",sessionsPath:"Sitzungen",memoryPath:"Memory",semanticPath:"Semantisch",usagePath:"Nutzung"},plans:{...A.plans,loading:"lade Pläne…",failed:"Pläne fehlgeschlagen: {error}",noPlans:"Noch keine archivierten Pläne — führe einen Turn aus, der submit_plan und mark_step_complete aufruft.",filterPlaceholder:"Pläne filtern",active:"aktiv",done:"erledigt",idle:"inaktiv",steps:"Schritte",pickHint:"Wähle links einen Plan.",noTitle:"(kein Titel)",stepTimeline:"Schritt-Zeitleiste · {done} / {total}",step:"Schritt {n}"},semantic:{...A.semantic,codeRequired:"Semantisch — Code-Modus erforderlich",indexBuilt:"Index erstellt",noIndex:"noch kein Index",ready:"bereit",setupNeeded:"Setup erforderlich",installOllama:"Ollama installieren",installOllamaDesc:"Reasonix führt keine Paketverwaltung für dich aus. Installiere zuerst Ollama, dann komme zurück:",macWindows:"macOS / Windows:",download:"herunterladen von ollama.com/download",linux:"Linux:",refreshHint:"Nach der Installation aktualisieren — dieses Panel bietet dann an, den Daemon zu starten und {model} zu ziehen.",daemon:"Daemon",daemonDesc:"Ollama ist im PATH, aber der HTTP-Daemon ist nicht erreichbar.",startDaemon:"Daemon starten",runsOllama:"führt ollama serve getrennt aus",model:"Modell",modelMissing:"{model} ist noch nicht installiert.",modelSize:"~270 MB beim ersten Pull.",pulling:"ziehe…",pullModel:"{model} ziehen",indexStatus:"Index-Status",builtStatus:"● erstellt",incompatibleStatus:"● inkompatibel",chunks:"Chunks",files:"Dateien",dim:"Dim",size:"Größe",lastBuild:"letzte Erstellung",builtWith:"erstellt mit",currentTarget:"aktuelles Ziel",incompatibleHint:"Dieser Index auf der Platte wurde für einen anderen Anbieter oder ein anderes Modell erstellt. Führe Neu erstellen aus, um ihn zu ersetzen.",runIndexHint:"Führe einen Index aus, um semantic_search zu aktivieren.",reIndex:"Neu indizieren",build:"Erstellen",rebuild:"Neu erstellen",stop:"Stopp",provider:"Anbieter",providerType:"Diensttyp",openaiCompat:"OpenAI-kompatibel",apiUrl:"API-URL",apiKey:"API-Schlüssel",apiKeyStoredNote:"API-Schlüssel wird in ~/.reasonix/config.json gespeichert — teile diese Datei nicht.",customRequestBody:"benutzerdefinierter Request-Body",invalidCustomRequestBody:"Der benutzerdefinierte Request-Body muss gültiges JSON sein: {error}",customRequestBodyMustBeObject:"Der benutzerdefinierte Request-Body muss ein JSON-Objekt sein.",saveBeforeIndex:"Speichere semantische Einstellungen vor dem Start eines Index.",extraBody:"zusätzlicher Body",batchSize:"Batch-Größe",keepExistingKey:"leer lassen, um vorhandenen Schlüssel zu behalten",remoteProvider:"Remote-Embedding-Anbieter",remoteProviderDesc:"Konfiguriere hier die vollständige OpenAI-kompatible Embeddings-URL. Reasonix sendet Anfragen genau an die von dir angegebene URL.",ollama:"Ollama",binary:"Binärdatei",found:"gefunden",missing:"fehlt",daemonStatus:"Daemon",up:"aktiv",down:"inaktiv",pulled:"gezogen",indexConfig:"Index-Konfiguration",reset:"Zurücksetzen",excludeDirs:"Verzeichnisse ausschließen",excludeFiles:"Dateien ausschließen",excludeExts:"Erweiterungen ausschließen",excludePatterns:"Muster ausschließen",glob:"Glob",respectGitignore:".gitignore beachten",maxFileBytes:"max. Dateigröße",skipLarger:"überspringe Dateien größer als ~{size} MiB",preview:"Vorschau",searchPlaceholder:"beschreibe, was zu finden ist — »wo behandeln wir Abbruchsignale«",searching:"suche…",results:"{count} Ergebnis{se} · {ms}ms · {model}",noMatches:"Keine Treffer über dem Schwellenwert.",previewSummary:"Vorschau — würde {included} Datei(en) indizieren, {skipped} überspringen",nothingSkipped:"nichts übersprungen — alle durchlaufenen Dateien würden indiziert.",firstIncluded:"erste {count} einbezogene Datei(en)",job:"Job",phaseSetup:"Vorbereitung",phaseScan:"Dateien scannen",phaseEmbed:"Chunks einbetten",phaseWrite:"Index schreiben",phaseDone:"erledigt",phaseError:"Fehler",phaseCancelled:"abgebrochen",setupFailed:"Setup fehlgeschlagen",stopping:"stoppe",scanned:"{count} gescannt",changed:"{count} geändert",skipped:"{count} übersprungen",chunksProgress:"{done} / {total} ({pct}%)",result:"Ergebnis",added:"{count} hinzugefügt",removed:"{count} entfernt",failed:"{count} fehlgeschlagen",skippedFiles:"{total} Dateien ({details})",rebuildStarted:"Neuerstellung gestartet",incrementalStarted:"inkrementelle Indizierung gestartet",stopRequested:"Stopp angefordert — aktueller Chunk-Batch wird zuerst beendet",startingDaemon:"starte Ollama-Daemon (15s Timeout)…",daemonUp:"Daemon ist aktiv",daemonTimeout:"Daemon wurde nicht rechtzeitig aktiv — überprüfe ollama serve manuell",pullingModel:"ziehe {model} — dies kann bei der ersten Installation einige Minuten dauern",savedConfig:"gespeichert · {count} Felder aktualisiert · führe Index erneut aus, um anzuwenden",runningPreview:"führe Trockenlauf gegen Projekt-Root aus…",exclude:"ausschließen"},modal:{...A.modal,shellTitle:"Shell-Befehl",shellBgTitle:"Hintergrundprozess",shellSubtitle:"Modell möchte einen Shell-Befehl ausführen",shellBgSubtitle:"langlebig — läuft nach Genehmigung weiter",pathTitle:"Datei außerhalb des Sandbox",pathSubtitle:"{intent} via {tool}",pathRead:"lesen",pathWrite:"schreiben",pathSandboxLabel:"Sandbox",pathAllowPrefixLabel:"Präfix erlauben",runOnce:"Einmal ausführen",alwaysAllow:'"{prefix}" immer erlauben',deny:"Ablehnen",choiceTitle:"Modell möchte, dass du wählst",typeOwn:"Eigene Antwort eingeben",typeOwnSummary:"Keine der Optionen passt — schreibe eine Freitext-Antwort.",typePlaceholder:"Freitext-Antwort eingeben…",send:"Senden",cancel:"Abbrechen",cancelSummary:"Frage verwerfen. Modell fragt, was du eigentlich möchtest.",planTitle:"Plan eingereicht",planSubtitle:"Modell hat einen Plan vorgeschlagen; überprüfe, dann wähle",approveInstructions:"Optionale letzte Anweisungen / Antworten auf offene Fragen (Enter zum Leer-Senden)",refinePlaceholder:"Was muss sich ändern? Sei konkret.",approve:"Genehmigen",refine:"Verfeinern",sendRefinement:"Verfeinerung senden",editTitle:"Edit ausstehend zur Überprüfung",editSubtitle:"{path} · {remaining} von {total} Blöcken verbleibend",before:"vorher",after:"nachher",workspaceTitle:"Modell möchte Arbeitsbereich wechseln",workspaceSubtitle:"jedes nachfolgende Datei-/Shell-/Memory-Tool wird gegen den neuen Root aufgelöst",switchBtn:"Wechseln (Enter)",denyBtn:"Ablehnen (Esc)",stepComplete:"Schritt abgeschlossen{counter}",continueBtn:"Fortsetzen",reviseBtn:"Überarbeiten…",stopBtn:"Stopp",revisionTitle:"Modell hat eine Planüberarbeitung vorgeschlagen",sendRevision:"Überarbeitung senden",accept:"Akzeptieren",reject:"Ablehnen",arguments:"Argumente",revisePlaceholder:"Was muss sich vor dem nächsten Schritt ändern? Leer lassen zum Fortfahren.",pickerFilter:"Filter…",pickerEmpty:"Nichts anzuzeigen.",pickerLoadMore:"Mehr laden",pickerPick:"Öffnen",pickerInstall:"Installieren",pickerUninstall:"Deinstallieren",pickerRename:"Umbenennen…",pickerNew:"Neu…",pickerNewPlaceholder:"Name (leer lassen für Standard)",viewerClose:"Schließen"},error:{...A.error,title:"Etwas ist im Dashboard kaputtgegangen",body:"Die TUI ist nicht betroffen — nur dieser Browser-Tab ist gestolpert. Du kannst schließen und weiterarbeiten oder es melden, damit wir die Ursache beheben.",copyDetails:"Details kopieren",copied:"Kopiert ✓",reportOnGithub:"Auf GitHub melden",dismiss:"Schließen (Esc)",crashing:"dieses Panel stürzt ständig ab — {name}",retry:"Erneut versuchen",recovering:"wiederherstellen…"},fmt:{...A.fmt,justNow:"gerade eben",minutesAgo:"vor {n}m",hoursAgo:"vor {n}h",daysAgo:"vor {n}T"},cards:{...A.cards,applied:"Angewendet",cacheHit:"Cache-Treffer",checkpointRewind:"Checkpoint-Rückspulen",cost:"Kosten",diffApply:"Anwenden",diffApplyChanges:"Änderungen anwenden",diffAwaiting:"Wartet auf Überprüfung",diffDiscard:"Verwerfen",done:"Fertig",elapsed:"Verstrichen",error:"Fehler",errorName:"Fehler",failed:"Fehlgeschlagen",hits:"Treffer",memoryCountSuffix:"Erinnerungen",memoryName:"Memory",output:"Ausgabe",planDefaultTitle:"Plan",prompt:"Prompt",compactionMeta:"{chars} Zeichen",compactionName:"Komprimierter Verlauf",reasoningComplete:"Reasoning abgeschlossen",reasoningName:"Reasoning",result:"Ergebnis",running:"Läuft",searchName:"Suche",shellAlwaysAllow:"Immer erlauben",shellAwaiting:"Wartet auf Genehmigung",shellExecuteHint:"Diesen Befehl ausführen?",shellReject:"Ablehnen",shellRun:"Ausführen",shellRunning:"Läuft",streaming:"Streamt",subagentDone:"Subagent erledigt",subagentDoneProgress:"Subagent erledigt ({pct}%)",subagentFailed:"Subagent fehlgeschlagen",subagentRunning:"Subagent läuft"},planBadge:{...A.planBadge,blocked:"Blockiert",done:"Erledigt",failed:"Fehlgeschlagen",pending:"Ausstehend",running:"Läuft"},composer:{...A.composer,atHeader:"Dateien erwähnen",close:"Schließen",commandPalette:"Befehlsübersicht",commands:"Befehle",commandsLabel:"Befehle",confirm:"Bestätigen",imageFilterName:"Bilder",insertFile:"Datei einfügen",insertImage:"Bild einfügen",interrupt:"Unterbrechen",mentionFiles:"Dateien erwähnen",mentionLabel:"Erwähnen",newline:"Neue Zeile",noMatches:"Keine Treffer",placeholder:"Prompt eingeben…",queue:"Warteschlange",queueCount:"{count} in Warteschlange",select:"Auswählen",send:"Senden",slashHeader:"Slash-Befehle",switchModel:"Modell wechseln",switchEffort:"Reasoning-Effort wechseln",workspaceRoot:"Arbeitsbereich-Root"},contextPanel:{...A.contextPanel,allow:"Erlauben",ask:"Fragen",autoApproveTitle:"Auto-genehmigen",cacheKey:"Cache",contextTokens:"Kontext-Tokens",fileInContext:"Im Kontext",fileModified:"Geändert",filesCount:"{count} Dateien",filesTab:"Dateien",filesTitle:"Dateien",freeKey:"Frei",itemCount:"{count} Einträge",mcpConfigured:"Konfiguriert",mcpConnecting:"Verbinde…",mcpDisabled:"Deaktiviert",mcpEmpty:"Keine MCP-Server",mcpFailed:"Fehlgeschlagen",mcpReady:"Bereit",mcpReadyAll:"Alle bereit",mcpReadySome:"Teils bereit",mcpTitle:"MCP",mcpTools:"Tools",memoryTab:"Memory",memoryTitle:"Memory",noFilesMsg:"Keine Dateien im Kontext",noMemoriesMsg:"Keine Erinnerungen",reservedKey:"Reserviert",ruleReadOnly:"Schreibgeschützt",ruleReview:"Überprüfung",ruleShellAllowlist:"Shell-Allowlist",rulesTab:"Regeln",ruleWritesAsk:"Schreiben fragen",ruleYolo:"YOLO",scopeGlobal:"Global",scopeProject:"Projekt",toolsTab:"Tools",usedKey:"Verwendet"},dragDrop:{...A.dragDrop,overlay:"Dateien hier ablegen"},extraCards:{...A.extraCards,approve:"Genehmigen",balance:"Guthaben",cache:"Cache",cacheHit:"Cache-Treffer",contextWindow:"Kontextfenster",doctorTitle:"Diagnose",output:"Ausgabe",prompt:"Prompt",reasoning:"Reasoning",reject:"Ablehnen",sessionCost:"Sitzungskosten",sessionUsage:"Sitzungsnutzung",topToolsUsage:"Top-Tools",unknownKind:"Unbekannt",memoryUser:"Benutzer",memoryFeedback:"Feedback",memoryProject:"Projekt",memoryReference:"Referenz"},jobs:{...A.jobs,empty:"Keine Hintergrund-Jobs",exited:"Beendet",kbClose:"Schließen",kbToggle:"Umschalten",running:"Läuft",stop:"Stopp",stopAll:"Alle stoppen",stopAllTip:"Alle Jobs stoppen",stopOne:"Stopp",title:"Hintergrund-Jobs"},live:{...A.live,deliveredWaiting:"Warte auf nächste Nachricht",reasoning:"Reasoning",running:"Läuft",secondsAgo:"vor {n}s",you:"Du"},markdown:{...A.markdown,copied:"Kopiert!",copy:"Kopieren",externalLinkTitle:"In neuem Tab öffnen",filePillTitle:"Datei öffnen",localLinkTitle:"Link öffnen"},palette:{...A.palette,abort:"Abbrechen",abortHint:"Aktuelle Anfrage abbrechen",about:"Über",clearChat:"Chat leeren",clearChatHint:"Unterhaltung leeren",closeTab:"Tab schließen",closeTabHint:"Aktuellen Tab schließen",copyConv:"Unterhaltung kopieren",copyConvHint:"Unterhaltung als Markdown kopieren",copyLast:"Letzte Antwort kopieren",copyLastHint:"Letzte Assistentennachricht kopieren",countSuffix:"Einträge",empty:"Keine passenden Befehle",exportMd:"Als Markdown exportieren",exportMdHint:"Chat als Markdown-Datei exportieren",focusComposer:"Composer fokussieren",footClose:"Schließen",footMove:"Bewegen",footRun:"Ausführen",groupAction:"Aktionen",groupNav:"Navigation",groupSettings:"Einstellungen",groupWorkspace:"Arbeitsbereich",newChat:"Neuer Chat",newChatHint:"Neues Gespräch beginnen",newTab:"Neuer Tab",newTabHint:"Neuen Tab öffnen",pickWorkspace:"Arbeitsbereich wechseln",pickWorkspaceHint:"Arbeitsbereich ändern",searchPlaceholder:"Befehle suchen…",settings:"Einstellungen",settingsHint:"Einstellungen öffnen"},panel:{...A.panel,renderError:"Panel abgestürzt"},sidebarPanel:{...A.sidebarPanel,approvalRules:"Genehmigungsregeln",cancel:"Abbrechen",commandPalette:"Befehlsübersicht",daysAgo:"vor {n}T",delete:"Löschen",deleteSession:"Sitzung löschen",hoursAgo:"vor {n}h",justNow:"Gerade eben",loading:"Lade…",messageCount:"{count} Nachrichten",minutesAgo:"vor {n}m",newChat:"Neuer Chat",noMatches:"Keine Treffer",noSessions:"Keine Sitzungen",recent:"Letzte",searchSessions:"Sitzungen durchsuchen…",sessionTitle:"Sitzungen",settings:"Einstellungen",weeksAgo:"vor {n}W"},statusbar:{...A.statusbar,balance:"Guthaben",busy:"Beschäftigt",cache:"Cache",cacheHit:"Cache-Treffer",jobs:"Jobs",jobsTip:"Hintergrund-Jobs",offline:"Offline",online:"Online",switchCurrency:"Währung wechseln",switchTheme:"Theme wechseln",switchWorkspace:"Arbeitsbereich wechseln",themeDark:"Dunkel",themeLight:"Hell",themeStyleGraphite:"Graphit",themeStyleSandstone:"Sandstein",themeStylePorcelain:"Porzellan",themeStyleMidnight:"Mitternacht",thisTurn:"Dieser Turn",tokens:"Tokens"},thread:{...A.thread,activePlan:"Aktiver Plan",allowRead:"Lesen erlauben",allowWrite:"Schreiben erlauben",alwaysAllow:"Immer erlauben",alwaysAllowPrefix:"{prefix} immer erlauben",approve:"Genehmigen",approveRewrite:"Neuschreibung genehmigen",cancel:"Abbrechen",checkpointKind:"Checkpoint",checkpointSub:"Aktuellen Zustand speichern",checkpointTitle:"Checkpoint erstellen",collapse:"Einklappen",continue:"Fortsetzen",copyMessage:"Nachricht kopieren",copyResponse:"Antwort kopieren",execute:"Ausführen",keepOriginal:"Original behalten",keepSteps:"Schritte behalten",optionCount:"{count} Optionen",pathAccessKind:"Pfadzugriff",planConfirmationKind:"Plan-Genehmigung",planRevisionKind:"Plan-Überarbeitung",planRunning:"Plan in Bearbeitung",planStepCount:"Schritt {done}/{total}",readPathOutsideSandbox:"Pfad außerhalb des Sandbox lesen",refine:"Verfeinern",reject:"Ablehnen",revise:"Überarbeiten",revisionMeta:"Überarbeitung",rewritePlan:"Plan umschreiben",risk:"Risikobewertung",riskMedium:"Mittleres Risiko",runBackgroundCommand:"Im Hintergrund ausführen",runCommand:"Befehl ausführen",shellConfirmationKind:"Shell-Bestätigung",startPlan:"Plan starten",stop:"Stopp",subagent:"Subagent",userChoiceKind:"Benutzerauswahl",writePathOutsideSandbox:"Pfad außerhalb des Sandbox schreiben",you:"Du"},workdir:{...A.workdir,browse:"Durchsuchen…",cancel:"Abbrechen",empty:"Keine Arbeitsbereiche",emptyDir:"Keine Unterverzeichnisse.",go:"Gehe zu",goTip:"Zu diesem Pfad navigieren",loading:"Lade…",openHere:"Diesen Ordner öffnen",pathPlaceholder:"Absoluter Pfad…",promptWeb:"Absoluten Pfad des zu öffnenden Arbeitsbereichs eingeben:",searchPlaceholder:"Arbeitsbereiche durchsuchen…",title:"Arbeitsbereich"},about:{...A.about,close:"Schließen",repo:"Repository",sidebarLabel:"Über",tagline:"KI-gestützter Coding-Assistent",version:"Version"},effort:{...A.effort,lowDesc:"am schnellsten — minimales Reasoning",mediumDesc:"ausgewogen",highDesc:"Standard — sicher für vLLM / Azure",maxDesc:"DeepSeek-Erweiterung; von stock OpenAI / vLLM abgelehnt"},editMode:{...A.editMode,plan:"Plan",planHint:"schreibgeschützt · alle Schreibwerkzeuge verweigern die Ausführung",review:"Überprüfen",reviewHint:"sowohl Edits als auch nicht-allowlistete Shell fragen zuerst",auto:"Auto",autoHint:"Edits auto-anwenden, Shell fragt weiterhin",yolo:"YOLO",yoloHint:"Edits UND Shell auto-ausführen, Allowlist umgangen"}},qs={app:{sectionWorkspace:"工作区",sectionObserve:"监控",sectionConfigure:"配置",tabChat:"对话",tabPlans:"计划",tabSessions:"会话",tabOverview:"概览",tabUsage:"用量",tabSystem:"系统",tabSemantic:"语义",tabTools:"工具",tabPermissions:"权限",tabMcp:"MCP",tabSkills:"技能",tabMemory:"记忆",tabHooks:"钩子",tabSettings:"设置",sectionChanges:"变更",tabChanges:"变更",footer:"仅 127.0.0.1 · Token 保护",themeToggle:"切换主题",themeLight:"浅色",themeDark:"深色",skill:{scope:{builtin:"内置",global:"全局",project:"项目"},runAs:{subagent:"子代理",inline:"内联"},generic:"技能"},exportReasoningSummary:"推理摘要",exportToolLabel:"工具调用",exportUserLabel:"用户消息",empty:{currentWorkspace:"当前工作区",selectWorkspace:"选择一个工作区开始",suggestion0:"开始新对话",suggestion1:"打开设置",suggestion2:"查看概览",suggestion3:"浏览会话",welcome:"欢迎使用 Reasonix"},errorLabel:"错误",connecting:"连接中…",session:{format:"会话",new:"新建会话"},setup:{choose:"选择工作区",description:"选择一个工作区开始工作",notSelected:"未选择工作区",saveAndStart:"保存并开始",welcome:"欢迎",workspace:"工作区"},tab:{newTab:"+ 新建标签",newTabTitle:"打开新标签"},titlebar:{clearChat:"清除对话",close:"关闭",commandPalette:"命令面板",contextPanel:"上下文面板",copyMd:"复制为 Markdown",exportMd:"导出为 Markdown",maximize:"最大化",minimize:"最小化",more:"更多",restore:"还原",settings:"设置",sidebar:"侧边栏",windowControls:"窗口控制"},toast:{cleared:"对话已清除",copied:"已复制到剪贴板",copiedMd:"已复制为 Markdown",emptySession:"无消息可导出",exportDialogTitle:"导出对话",exportedMd:"已导出为 Markdown",exportFailed:"导出失败",langSwitched:"语言已切换",modelSwitched:"模型 → {model}",effortSwitched:"强度 → {effort}",modeSwitched:"模式已切换",newSession:"新会话已创建"},yolo:{toast:"YOLO 模式已启用"},cmd:{abort:"中止",btw:"顺便说一下",clearChat:"清除对话",compact:"紧凑",copyLast:"复制上条",exportMd:"导出为 Markdown",feedback:"反馈",help:"帮助",newSession:"新建会话",retry:"重试",switchModel:"切换模型",toggleCurrency:"切换货币",toggleLang:"切换语言",toggleTheme:"切换主题"},header:{abort:"中止",clickToSelect:"点击选择",copy:"复制",copyMd:"复制为 Markdown",export:"导出",exportMd:"导出为 Markdown",newChat:"新建对话",noWorkspace:"无工作区",running:"运行中…"},jumpToBottom:"跳到底部",langEN:"English",langZH:"中文",splashSubtitle:"AI 驱动的编程助手"},changes:{chatPlaceholder:"询问代码问题…",chatWelcome:"变更 — 询问项目文件相关问题。",chatSend:"发送",viewerPlaceholder:"选择一个文件查看",treeEmpty:"(空)",tabClose:"关闭标签",newConversation:"新建",clearConversation:"清除",newTitle:"/new — 清除对话上下文",clearTitle:"/clear — 仅清除可见的滚动回放",newConfirmBusy:"有轮次正在执行。中止并开始新对话?",newConfirm:"清除当前对话并重新开始?",newToast:"新对话",clearToast:"滚动回放已清除",newFailed:"/new 失败:{error}",clearFailed:"/clear 失败:{error}",chatSendBtn:"发送",fileTreeTitle:"文件",codeViewerTitle:"代码查看器",chatPanelTitle:"对话",loadingFiles:"正在加载项目文件…",review:"审查",allFiles:"所有文件",changes:"更改",commentLabel:"正在评论 第",commentPlaceholder:"添加评论…",commentCancel:"取消",commentSubmit:"评论",commentLine:"第",commentEdit:"编辑",commentDelete:"删除",diffSourceGit:"Git 变更",diffSourceSession:"上一轮变更",diffSourceCheckpoint:"检查点",checkpointEmpty:"暂无检查点",restoreBtn:"恢复",restoreConfirm:'确定要恢复检查点"{name}"吗?当前更改将被覆盖。',deleteBtn:"删除",deleteConfirm:'确定要删除检查点"{name}"吗?',createBtn:"创建",createPlaceholder:"检查点名称…",backToList:"返回列表",reviewEmpty:"暂无可审查的更改",diffStyleUnified:"统一视图",diffStyleSplit:"分栏视图",expandAll:"全部展开",collapseAll:"全部折叠",createFailed:"创建失败",restoreFailed:"恢复失败",deleteFailed:"删除失败"},common:{loading:"加载中…",loadingFailed:"{name}失败:{error}",back:"← 返回",save:"保存",remove:"移除",cancel:"取消",delete:"删除",add:"添加",confirm:"确认",noData:"暂无{name}。",all:"全部",yes:"是",no:"否",on:"开启",off:"关闭",enabled:"已启用",disabled:"已禁用"},settings:{title:"设置",loading:"加载设置…",saved:"已保存:{fields}",sectionApi:"DeepSeek API",apiKey:"API 密钥",apiKeyNotSet:"未设置",apiKeySave:"保存密钥",apiKeySet:"已设置",apiSection:"API 配置",notSet:"(未设置)",replace:"替换",pasteKey:"粘贴新的 sk-… 令牌",saveKey:"保存密钥",baseUrl:"基础 URL",baseUrlPlaceholder:"https://api.deepseek.com(默认)",baseUrlHint:"API 请求的基础 URL",sectionDefaults:"默认设置",effortSection:"推理强度",modelCustom:"自定义模型 ID",modelCustomHint:"任何 OpenAI 兼容的 ID(vLLM、Ollama、Together …)。",modelCustomActive:"当前运行自定义 ID:{model}",appliesNextTurn:"下一轮生效",effort:"推理强度",effortMax:"max(DeepSeek 扩展 — 标准 OpenAI / vLLM 会拒绝)",effortHigh:"high(安全默认 — vLLM / Azure 兼容)",effortMedium:"medium",effortLow:"low(最快)",webSearch:"网页搜索",webSearchNote:"web_fetch + web_search 工具",webSearchEngine:"搜索引擎",webSearchEngineBing:"bing — 默认,国内裸 IP 直连,无需代理",webSearchEngineSearxng:"searxng — 自托管(端点用 /se searxng <url> 配置)",webSearchEngineMetaso:"metaso — 每日 100 次免费(国内友好,metaso.cn 可领免费 key)",webSearchEngineTavily:"tavily — 每月 1000 次免费(设置 TAVILY_API_KEY)",webSearchEnginePerplexity:"perplexity — AI 直接回答(设置 PERPLEXITY_API_KEY)",webSearchEngineExa:"exa — AI 直接回答,每月 1000 次免费(设置 EXA_API_KEY)",webSearchEngineNote:"下一次 web_search 调用生效",sectionBudget:"预算",budget:"预算",budgetHint:"设置支出限额",budgetPlaceholder:"输入预算金额",budgetOf:"/",budgetSetCap:"设置上限",budgetCustom:"自定义",budgetBumpHint:"提高上限以继续",budgetClear:"清除上限",budgetIdleLine:"80% 时提醒 · 100% 后拒绝执行",budgetWarnLine:"接近上限 — 超过 100% 将拒绝执行",budgetRefusing:"已超出上限 — 提高或清除后才会继续",sectionLoop:"循环",loopIdleHint:"按固定间隔自动重新提交一段提示词。",loopCostHint:"每次迭代约 {cost}(上一轮成本)。",loopInterval:"间隔",loopCustom:"自定义",loopRangeError:"间隔需在 5s..6h 之间",loopPrompt:"提示词",loopPromptPlaceholder:"例如:检查部署状态并汇报任何错误",loopStart:"启动循环",loopStop:"停止",loopRunning:"运行中",loopIter:"第 {iter} 次",loopFiresIn:"{remaining} 后触发",sectionSkills:"技能",skillPaths:"技能路径",skillPathsPlaceholder:"/path/to/skills-a, /path/to/skills-b",skillPathsNote:"英文逗号分隔 · 下次 /new 或新会话生效",skillsEmpty:"无已加载技能",skillsLoaded:"技能已加载",subagentModelFlash:"flash",subagentModelPro:"pro",subagentModelHint:"技能派生独立 subagent 时使用的模型",sectionRuntime:"运行时",activeModel:"当前模型",model:"模型",modelFlashDesc:"Flash — 始终 flash",modelProDesc:"Pro — 始终 pro",modelPricingLine:"${hit} 命中 · ${miss} 未命中 · ${out} 输出 / 100 万 tok",editMode:"编辑模式",editModeNote:"在对话标签页头部切换",editModeHint:"配置编辑模式",showSystemEvents:"系统事件",showSystemEventsHint:"在对话流中以细线显示压缩 / 中断 / 限速等系统事件",shown:"显示",hidden:"隐藏",appMode:"应用模式",sectionLanguage:"语言",language:"语言",languageHint:"切换语言",langEn:"English",langZhCn:"简体中文",appearanceSection:"外观",behaviorSection:"行为",ruleAutoApprovalHint:"配置自动审批规则",ruleAutoApprovalSection:"自动审批规则",theme:"主题",themeDark:"深色",themeHint:"在浅色和深色主题之间切换",themeLight:"浅色",themeStyle:"主题风格",themeStyleHint:"选择主题风格",themeStyleGraphite:"石墨",themeStyleGraphiteDesc:"冷色深色调,适合长时间使用。",themeStyleSandstone:"砂岩",themeStyleSandstoneDesc:"暖色浅色调,明亮环境更舒适。",themeStylePorcelain:"瓷白",themeStylePorcelainDesc:"高对比度浅色,简洁清爽。",themeStyleMidnight:"午夜",themeStyleMidnightDesc:"深色配冷色高光,更深邃。",pageGeneralLabel:"通用",pageGeneralDesc:"主题、字体、语言与工作目录。",pageModelsLabel:"模型",pageModelsDesc:"默认模型与推理强度。",pageMcpLabel:"MCP 服务器",pageMcpDesc:"接入外部工具服务器。",pageSkillsLabel:"技能",pageSkillsDesc:"可通过 /skill 调用的自定义技能。",pageMemoryLabel:"记忆",pageMemoryDesc:"跨会话保留的长期笔记。",pageRulesLabel:"规则",pageRulesDesc:"Shell 与路径访问的自动审批规则。",pageBillingLabel:"账单",pageBillingDesc:"API key、余额与会话预算。",pageShortcutsLabel:"快捷键",pageShortcutsDesc:"键盘快捷键参考。",fontFamily:"字体",fontFamilyHint:"选择字体",fontFamilySans:"无衬线",fontFamilySerif:"衬线",fontFamilySystem:"系统",fontScale:"字体大小",fontScaleHint:"调整字体大小",fontScaleLarge:"大",fontScaleMedium:"中",fontScaleSmall:"小",currentWorkspace:"当前工作区",defaultModelCurrent:"当前模型",editor:"编辑器",editorHint:"配置编辑器偏好",maxOutput:"最大输出",reasoningEffort:"推理强度",reasoningEffortHint:"调整推理深度",sessionCost:"会话成本",balanceAvailable:"可用",balanceLabel:"余额",balanceLow:"余额不足",cacheHitRate:"缓存命中率",ctxWindow:"上下文窗口",notSelected:"未选择",parseError:"解析错误",workspaceChange:"更改",workspaceSection:"工作区",mcpAdd:"添加",mcpAddSection:"添加 MCP 服务器",mcpBridged:"已桥接",mcpConfigured:"已配置",mcpEmpty:"无 MCP 服务器",mcpNotBridged:"未桥接",mcpRemove:"移除",mcpSpecFormat:"JSON 格式",mcpSpecLabel:"服务器规格",memoryDesc:"配置记忆设置",memorySection:"记忆",shortcutAbort:"中止",shortcutCloseTab:"关闭标签",shortcutCommandPalette:"命令面板",shortcutFocusComposer:"聚焦编辑器",shortcutNewChat:"新建对话",shortcutNewTab:"新建标签",shortcutSettings:"设置",shortcutSwitchTab:"切换标签",qqAccessAllowlist:"允许列表",qqAccessOpen:"开放",qqAccessOwner:"所有者",qqAccessOwnerWithAllowlist:"所有者 + 允许列表",qqAccessRuntime:"运行时",qqAppId:"App ID",qqApplyAction:"应用",qqApplyLabel:"应用",qqAppSecret:"App Secret",qqBack:"返回",qqConfigure:"配置",qqConfigureHint:"设置 QQ 集成",qqConfigureTitle:"QQ 配置",qqConnected:"已连接",qqConnecting:"连接中…",qqDisconnected:"已断开",qqEnvironment:"环境",qqFailed:"失败",qqProduction:"生产环境",qqSandbox:"沙箱环境",qqSave:"保存",qqSaveAndConnect:"保存并连接",qqSection:"QQ 集成",qqSummaryAppId:"App ID",qqSummaryDetail:"详情",qqSummaryMissing:"未配置",qqTitle:"QQ 机器人"},chat:{modeMirror:"TUI 镜像",modeView:"会话视图",placeholder:"输入提示词 — Enter 发送,Shift+Enter 换行 · / @ 打开选择器",placeholderBusy:"请等待当前轮次完成…",placeholderSteerBusy:"输入消息以引导当前任务 — 忙碌时不支持命令和选择器",steerHint:"消息将作为附加指示引导当前轮次",send:"发送",new:"新建",clear:"清除",newTitle:"/new — 清除对话上下文(循环日志 + 滚动回放)",clearTitle:"/clear — 仅清除可见的滚动回放(上下文保留)",noConversation:"暂无对话。在下方发送提示词开始。",newConfirmBusy:"有轮次正在执行。中止并开始新对话?",newConfirm:"清除当前对话并重新开始?",newToast:"新对话",clearToast:"滚动回放已清除",newFailed:"/new 失败:{error}",clearFailed:"/clear 失败:{error}",eventStreamError:"事件流中断 — 正在重连…",semanticBanner:"此项目未启用语义搜索。",semanticBannerDesc:"构建一次索引,模型即可按含义查找代码(“哪里处理认证失败?”),而不仅依赖精确字符串的 grep。",semanticBannerBtn:"构建 →",semanticBannerDismiss:"关闭(不再显示)",slashCommands:"斜杠命令",projectFiles:"项目文件",effortTitle:"reasoning_effort — 下一轮生效",effortMaxTitle:"max(DeepSeek 扩展)",effortHighTitle:"high(安全默认 — vLLM / Azure 兼容)",effortMediumTitle:"medium",effortLowTitle:"low(最快)",editGateTitle:"编辑门控 — Shift+Tab 在 TUI 中循环",editReviewTitle:"review — 编辑和非允许列表的 shell 命令都会先询问",editAutoTitle:"auto — 编辑自动应用,shell 仍会询问",editYoloTitle:"yolo — 编辑和 shell 都自动运行,绕过允许列表",railSession:"会话",railTurns:"轮次",railPromptTok:"提示 tokens",railCost:"费用",railCacheHit:"缓存命中",railToolBudget:"工具预算",railSpend:"已用",railActivePlan:"活跃计划",railProgress:"进度",statusModel:"模型",statusCtx:"上下文",statusCache:"缓存",statusTurn:"轮次",statusSession:"会话",statusBalance:"余额",statusTurns:"{count} 轮",waitingStats:"· · · 等待实时统计",inflightPhase:"{phase}",inflightRunning:"运行中",inflightThinking:"思考中",inflightStreaming:"输出中",inflightWaiting:"等待中",inflightReasoning:"推理 {count} 字符",inflightOut:"输出 {count} 字符",abortBtn:"中止 (Esc)",confirmBtn:"应用 (y)",rejectBtn:"拒绝 (n)",applyRestBtn:"应用剩余 (a)",flipAutoBtn:"切换为 AUTO (A)"},overview:{loading:"加载概览…",failed:"概览失败:{error}",standaloneTitle:"独立模式",standaloneDesc:"只读磁盘视图。在 reasonix code 内启动 /dashboard 以获取实时会话状态、MCP 和工具。",cockpit:"驾驶舱",balance:"余额",tokens7d:"tokens · 7 天",cacheHit:"缓存命中",toolCalls24h:"工具调用 · 24 小时",budget:"预算",currentSession:"当前会话",noSession:"无活跃会话 — 在 reasonix code 内执行 /dashboard 进行连接。",promptTok:"提示 tokens",completionTok:"补全 tokens",cost:"费用",costTrend:"费用 · 14 天",noUsageYet:"暂无用量",dayAvg:"/天 均值",recentPlans:"近期计划",noPlans:"暂无计划 — 使用 submit_plan 提交一个。",toolActivity:"工具活动",noToolCalls:"暂无工具调用。",toolsLoaded:"已加载工具",mcpServers:"MCP 服务器",editMode:"编辑模式",version:"Reasonix",workingDir:"工作目录",projectRoot:"项目根目录",noPriorData:"无历史数据",stable:"— 稳定",vsPrior:"{arrow} {pct}% 较上期",active:"活跃",allUp:"全部在线",yoloWarning:"所有提示被绕过",checking:"检查中",latest:"最新"},usage:{loading:"加载用量…",failed:"用量失败:{error}",records:"{count} 条记录",dailyUsage:"每日用量",dailyMeta:"费用 · 缓存节省 · 轮次",noData:"暂无用量数据 — 在 reasonix chat / code / run 中执行一轮,然后刷新。",windows:"滚动窗口",colWindow:"时间范围",colTurns:"轮次",colCacheHit:"缓存命中",colCost:"费用 (USD)",colCacheSaved:"缓存节省",colVsClaude:"对比 Claude",colSaved:"节省",axisTime:"时间",axisUsd:"美元",axisTurns:"轮次",seriesCost:"费用",seriesCacheSaved:"缓存节省",seriesTurns:"轮次",mostUsed:"最常用模型",colModel:"模型"},sessions:{loading:"加载会话…",failed:"会话失败:{error}",noSessions:"暂无已保存的会话。",filterPlaceholder:"筛选会话",msgs:"条消息",pickHint:"选择左侧的会话以查看其转录稿。",resumeTitle:"在 TUI 中恢复",resumeDesc:"会话中途切换需要重启,以便消息日志可以干净地回退。请退出当前会话,然后运行:",loadingTranscript:"加载转录稿…",emptyTranscript:"空的转录稿。",messages:"{count} 条消息",newBtn:"新建会话",newHint:"归档当前会话并开启新会话",switchBtn:"切换到此会话",deleteBtn:"删除",deleteConfirm:"确定删除会话「{name}」?转录文件将被移除,无法撤销。",cantDeleteActive:"请先切换到其他会话,再删除当前会话。",attachRequired:"实时会话操作需要已连接的 CLI 会话。请通过 reasonix chat 启动,或在 TUI 会话中打开仪表盘。",activeChip:"当前",activePill:"当前"},tools:{loading:"加载工具…",failed:"工具失败:{error}",noTools:"未注册任何工具。",planMode:"计划模式 — 写入受限",colTool:"工具",colFlags:"标志",colDesc:"描述",readOnly:"只读",write:"写入",flat:"扁平",desc:{web_search:"搜索公共网络。返回带标题、URL 和摘要的排序结果。当答案的正确性依赖于当前状态时调用——事件、价格、发布、现实世界的状态。",web_fetch:"下载 URL 并返回其可见文本内容(已剥离脚本/样式/导航)。在 web_search 摘要不够时使用。",run_command:"在项目根目录执行 shell 命令,返回合并的标准输出和标准错误。白名单中的只读命令立即执行;可能修改状态的操作需用户确认。",run_background:"启动一个长时间运行的进程并分离。返回任务 ID 用于查看日志、等待完成或终止。用于开发服务器、文件监听器和一次性长时间任务。",job_output:"读取后台任务的最新输出。返回缓冲区末尾内容并告知任务是否仍在运行。",wait_for_job:"在服务端阻塞直到后台任务完成(有超时限制)。用于替代轮询 job_output。",stop_job:"停止后台任务。先发送 SIGTERM,宽限期后发送 SIGKILL。可安全调用已退出的任务。",list_jobs:"列出本次会话启动的所有后台任务——运行中和已退出的——包含 ID、命令、PID 和状态。",remember:"保存一条记忆供未来会话使用。当用户陈述偏好、纠正你的方法、分享非显而易见的事实或要求你记住某事时使用。",forget:"删除记忆文件并从 MEMORY.md 中移除。当用户要求忘记某事或之前记住的事实已不再正确时使用。",recall_memory:"当记忆文件的一行摘要不够详细时,读取其完整内容。",read_file:"读取沙箱根目录下的文件。支持 head/tail/range 范围读取以节省上下文。超过 200 行的文件自动返回预览。",list_directory:"列出目录中的条目。每行一个条目,目录以斜杠标记。",directory_tree:"递归列出目录中的条目,以缩进树形结构显示。对大子目录自动折叠以节省预算。",search_files:"根据名称匹配子串或正则表达式查找文件。不区分大小写。默认跳过依赖/构建目录。",search_content:"递归搜索文件内容中的子串或正则表达式。以 path:line:text 格式返回匹配结果。查找引用的正确工具。",glob:"按 glob 模式列出文件,按修改时间排序。默认限制 200,最大 1000。默认跳过 node_modules/.git/dist。",get_file_info:"获取沙箱根目录下路径的状态信息。返回类型、字节大小和修改时间。",write_file:"创建或覆盖文件,内容由参数指定。按需创建父目录。",edit_file:"对现有文件应用 SEARCH/REPLACE 编辑。搜索必须完全匹配且在文件中唯一。",multi_edit:"跨一个或多个文件原子性地应用 N 个 SEARCH/REPLACE 编辑。如果任何编辑失败,不写入任何文件。",create_directory:"在沙箱根目录下创建目录(以及任何缺失的父目录)。",move_file:"重命名或移动沙箱根目录下的文件或目录。",delete_file:"删除沙箱根目录下的一个文件。拒绝目录——请使用 delete_directory 删除目录。",delete_directory:"递归删除沙箱根目录下的目录。传入 recursive:false 可拒绝非空目录。",copy_file:"复制沙箱根目录下的文件或目录。拒绝覆盖已存在的目标。",submit_plan:"提交一个具体的计划以供审查审批。用于多文件重构、架构变更或任何撤销代价高昂的操作。",mark_step_complete:"将已批准计划的一个步骤标记为完成。完成每个步骤后恰好调用一次。",revise_plan:"外科手术式替换进行中计划的剩余步骤。已完成的步骤永远不会被触及。",run_skill:"从技能索引中调用一个 playbook。传入裸技能名称。标记为子代理的技能将启动独立的子代理。",spawn_subagent:"为一个独立子任务启动隔离的子代理。用于并行分发或需要大量文件读取的工作。",todo_write:"多步工作的会话内任务跟踪器。每次调用替换整个列表。无审批关卡,不写入文件。",ask_choice:"向用户展示 2-6 个选项。当用户要求选择或需要偏好决策时使用。",create_skill:"创建一个新技能,用户可通过 /skill 命令调用。支持内联和子代理两种运行模式。",add_mcp_server:"在用户配置中注册新的 MCP 服务器。下次会话生效。支持 stdio、SSE 和 streamable-http。"}},permissions:{loading:"加载权限…",failed:"权限失败:{error}",yoloTitle:"YOLO 模式",yoloDesc:"所有 shell 命令自动运行,允许列表被绕过。在 TUI 中使用 /mode review 切换回来。",project:"项目",builtin:"内置",addPrefix:"添加前缀",addPlaceholder:'例如 "npm run build" 或 "deploy.sh"',clearAll:"清除全部",alreadyIn:"{prefix} 已在列表中",added:"已添加:{prefix}",removed:"已移除:{prefix}",cleared:"已清除 {count} 条",removeConfirm:'从此项目的允许列表中移除 "{prefix}"?',clearConfirm:"清除所有项目允许列表条目?内置条目不受影响。",projectAllowlist:"项目允许列表 · {count}",nothingStored:"此项目暂无存储的条目。",colNum:"#",colPrefix:"前缀",builtinTitle:"内置 · {count} · 只读",standaloneWarning:"修改操作需要在活跃的 reasonix code 会话内执行 /dashboard — 独立模式的 reasonix dashboard 无法确定要编辑哪个项目的允许列表。"},mcp:{loading:"加载 MCP…",servers:"MCP 服务器 · {count} 个已桥接",all:"全部",live:"在线",unbridged:"未桥接",specPlaceholder:"规格 — 例如 fs=npx -y @modelcontextprotocol/...",saved:"已保存",savedRestart:"已保存 — 重启 reasonix code 以桥接此服务器",removed:"已移除 — 重启以断开实时桥接",removeConfirm:`从配置中移除 MCP 规格?
9
+ {spec}`,noServers:"Keine MCP-Server in dieser Sitzung.",tools:"Tools",inConfig:"in Konfiguration · nicht geladen",unbridgedTitle:"unverbunden · in Konfiguration",removeBtn:"Entfernen",spec:"Spec",whyUnbridged:"Warum unverbunden?",whyUnbridgedDesc:"Diese Spec befindet sich in deiner config.json, ist aber nicht in die Live-Sitzung eingebunden. MCP-Server werden beim Start von reasonix code angehängt; das Dashboard allein kann den Kindprozess nicht starten.",whyUnbridgedHint:"Zum Aktivieren: starte reasonix code neu und aktualisiere dieses Dashboard.",bridgeFailed:"Verbindung fehlgeschlagen",bridgeFailedTitle:"Verbindung fehlgeschlagen · in Konfiguration",bridgeFailedHint:"Reasonix hat versucht, diesen Server zu verbinden, und der Versuch ist fehlgeschlagen. Häufige Ursachen: falsche URL, fehlender Auth-Header, upstream 404/5xx, fehlender lokaler Befehl. Behebe und starte reasonix code neu.",pickHint:"Wähle links einen MCP-Server zum Inspizieren von Tools / Ressourcen / Prompts.",toolsTitle:"Tools · {count}",resourcesTitle:"Ressourcen · {count}",promptsTitle:"Prompts · {count}",colName:"Name",colDesc:"Beschreibung",colUri:"URI",marketplace:"Marktplatz",marketplaceSearch:"Registry durchsuchen…",marketplaceLoading:"lade Registry…",marketplaceMore:"5 weitere Seiten laden",marketplaceMoreLabel:"50 mehr laden · zeige {shown} / {total}",marketplaceMoreHint:"ruft weitere Seiten von der Registry ab",marketplaceMoreCachedHint:"weitere Einträge bereits lokal zwischengespeichert",marketplaceExhausted:"alle Seiten geladen",marketplaceExhaustedFull:"zeige alle {total} Einträge — Registry erschöpft",marketplaceCount:"{loaded} geladen · {matched} Treffer · Quelle: {source}{cached}",marketplaceCachedSuffix:" · zwischengespeichert",marketplaceNoMatches:"Keine Treffer. Versuche andere Begriffe oder lade mehr Seiten.",marketplaceInstall:"Installieren",marketplacePickHint:"Wähle links einen Server, dann Installieren.",marketplaceInstalled:"installiert → {spec}",marketplaceInstalledBridged:"installiert + verbunden → {spec}",marketplaceAlready:"bereits installiert",marketplaceNeedsEnv:"benötigt Umgebungsvariable: {names}",marketplaceSourceTag:"[{source}]",marketplaceNoInstall:"Smithery-Eintrag — Installationsmetadaten nicht verfügbar; verwende `npx -y @smithery/cli install {name}` direkt",marketplaceFetchOnInstall:"Smithery-Eintrag — Installationsdetails werden bei Install abgerufen. HTTP-Server werden als streamable-http-Remotes abgebildet; stdio-Server laufen über @smithery/cli.",marketplaceInstalledBadge:"installiert",marketplaceUninstall:"Deinstallieren",marketplaceEnvTitle:"Erforderliche Umgebungsvariablen",marketplaceEnvHint:"Setze diese in deiner Shell vor dem nächsten `reasonix code`, damit der verbundene Server authentifizieren kann.",marketplaceRestartHint:"Spec in ~/.reasonix/config.json geschrieben. Starte `reasonix code` neu, um den Server zu verbinden (Live-Hot-Reload ist auf der Roadmap)."},memory:{...A.memory,loading:"lade Memory…",files:"Memory · {count} Dateien",exists:"existiert",create:"erstellen",noFiles:"Noch keine Memory-Dateien.",pickHint:"Wähle links eine Memory-Datei.",pickDesc:"Projekt-REASONIX.md ist commitierbar; globale Notizen leben in ~/.reasonix/memory/.",chars:"{count} Zeichen",saved:"{scope} gespeichert",reloadHint:"wird beim nächsten /new oder Sitzungsneustart neu angewendet"},hooks:{...A.hooks,loading:"lade Hooks…",resolved:"aufgelöst",eventMatrix:"Ereignismatrix",matrixSub:"{scripts} Skript{s} × {events} Ereignis{se}",noHooks:"Keine Hooks konfiguriert. Bearbeite das JSON unten, um welche hinzuzufügen.",colScript:"Skript",noProject:"Kein aktives Projekt — öffne /dashboard von reasonix code, um Projekt-Hooks zu bearbeiten.",saveReload:"Speichern + Neu laden",discard:"Änderungen verwerfen",savedReloaded:"{scope} gespeichert + neu geladen",recentRuns:"Letzte Ausführungen",noRuns:"Keine Hook-Ausführungen im aktuellen Sitzungslog.",colWhen:"Wann",colPhase:"Phase",colHook:"Hook",colOutcome:"Ergebnis"},skills:{...A.skills,loading:"lade Skills…",filterPlaceholder:"Skills filtern",project:"Projekt",custom:"Benutzerdefiniert",global:"Global",builtin:"Eingebaut",newSkill:"neuer Skill",noDescription:"(keine Beschreibung)",runs7d:"Ausführungen · 7d",pickHint:"Wähle links einen Skill oder erstelle oben einen neuen.",readOnlyBuiltin:"schreibgeschützt · eingebaut",readOnlyCustom:"schreibgeschützt · benutzerdefinierter Pfad",builtinDesc:"Eingebaute Skills werden mit Reasonix ausgeliefert; das Modell nimmt sie automatisch auf. Zum Anpassen erstelle einen Skill mit gleichem Namen im Projekt- oder globalen Bereich.",saved:"{scope}/{name} gespeichert",deleteConfirm:"Skill {scope}/{name} löschen?",reloadHint:"wird beim nächsten /new oder Sitzungsneustart neu geladen"},system:{...A.system,loading:"lade Gesundheit…",failed:"Gesundheitscheck fehlgeschlagen: {error}",healthChecks:"Gesundheitsprüfungen",version:"Version",checking:"prüfe",latest:"● aktuell",outOfDate:"● veraltet",versionPending:"Versionsprüfung ausstehend",upToDate:"aktuell",latestVer:"neueste: {version}",sessions:"Sitzungen",ok:"● ok",memory:"Memory",semanticIndex:"Semantischer Index",built:"● erstellt",none:"— keine",runIndex:"führe reasonix index zum Erstellen aus",usageLog:"Nutzungslog",backgroundJobs:"Hintergrund-Jobs",noSession:"— keine Sitzung",running:"{count} laufend",attachHint:"Sitzung anhängen, um Jobs zu sehen",shellSpawn:"Shell + Start",paths:"Pfade",home:"Home",sessionsPath:"Sitzungen",memoryPath:"Memory",semanticPath:"Semantisch",usagePath:"Nutzung"},plans:{...A.plans,loading:"lade Pläne…",failed:"Pläne fehlgeschlagen: {error}",noPlans:"Noch keine archivierten Pläne — führe einen Turn aus, der submit_plan und mark_step_complete aufruft.",filterPlaceholder:"Pläne filtern",active:"aktiv",done:"erledigt",idle:"inaktiv",steps:"Schritte",pickHint:"Wähle links einen Plan.",noTitle:"(kein Titel)",stepTimeline:"Schritt-Zeitleiste · {done} / {total}",step:"Schritt {n}"},semantic:{...A.semantic,codeRequired:"Semantisch — Code-Modus erforderlich",indexBuilt:"Index erstellt",noIndex:"noch kein Index",ready:"bereit",setupNeeded:"Setup erforderlich",installOllama:"Ollama installieren",installOllamaDesc:"Reasonix führt keine Paketverwaltung für dich aus. Installiere zuerst Ollama, dann komme zurück:",macWindows:"macOS / Windows:",download:"herunterladen von ollama.com/download",linux:"Linux:",refreshHint:"Nach der Installation aktualisieren — dieses Panel bietet dann an, den Daemon zu starten und {model} zu ziehen.",daemon:"Daemon",daemonDesc:"Ollama ist im PATH, aber der HTTP-Daemon ist nicht erreichbar.",startDaemon:"Daemon starten",runsOllama:"führt ollama serve getrennt aus",model:"Modell",modelMissing:"{model} ist noch nicht installiert.",modelSize:"~270 MB beim ersten Pull.",pulling:"ziehe…",pullModel:"{model} ziehen",indexStatus:"Index-Status",builtStatus:"● erstellt",incompatibleStatus:"● inkompatibel",chunks:"Chunks",files:"Dateien",dim:"Dim",size:"Größe",lastBuild:"letzte Erstellung",builtWith:"erstellt mit",currentTarget:"aktuelles Ziel",incompatibleHint:"Dieser Index auf der Platte wurde für einen anderen Anbieter oder ein anderes Modell erstellt. Führe Neu erstellen aus, um ihn zu ersetzen.",runIndexHint:"Führe einen Index aus, um semantic_search zu aktivieren.",reIndex:"Neu indizieren",build:"Erstellen",rebuild:"Neu erstellen",stop:"Stopp",provider:"Anbieter",providerType:"Diensttyp",openaiCompat:"OpenAI-kompatibel",apiUrl:"API-URL",apiKey:"API-Schlüssel",apiKeyStoredNote:"API-Schlüssel wird in ~/.reasonix/config.json gespeichert — teile diese Datei nicht.",customRequestBody:"benutzerdefinierter Request-Body",invalidCustomRequestBody:"Der benutzerdefinierte Request-Body muss gültiges JSON sein: {error}",customRequestBodyMustBeObject:"Der benutzerdefinierte Request-Body muss ein JSON-Objekt sein.",saveBeforeIndex:"Speichere semantische Einstellungen vor dem Start eines Index.",extraBody:"zusätzlicher Body",batchSize:"Batch-Größe",keepExistingKey:"leer lassen, um vorhandenen Schlüssel zu behalten",remoteProvider:"Remote-Embedding-Anbieter",remoteProviderDesc:"Konfiguriere hier die vollständige OpenAI-kompatible Embeddings-URL. Reasonix sendet Anfragen genau an die von dir angegebene URL.",ollama:"Ollama",binary:"Binärdatei",found:"gefunden",missing:"fehlt",daemonStatus:"Daemon",up:"aktiv",down:"inaktiv",pulled:"gezogen",indexConfig:"Index-Konfiguration",reset:"Zurücksetzen",excludeDirs:"Verzeichnisse ausschließen",excludeFiles:"Dateien ausschließen",excludeExts:"Erweiterungen ausschließen",excludePatterns:"Muster ausschließen",glob:"Glob",respectGitignore:".gitignore beachten",maxFileBytes:"max. Dateigröße",skipLarger:"überspringe Dateien größer als ~{size} MiB",preview:"Vorschau",searchPlaceholder:"beschreibe, was zu finden ist — »wo behandeln wir Abbruchsignale«",searching:"suche…",results:"{count} Ergebnis{se} · {ms}ms · {model}",noMatches:"Keine Treffer über dem Schwellenwert.",previewSummary:"Vorschau — würde {included} Datei(en) indizieren, {skipped} überspringen",nothingSkipped:"nichts übersprungen — alle durchlaufenen Dateien würden indiziert.",firstIncluded:"erste {count} einbezogene Datei(en)",job:"Job",phaseSetup:"Vorbereitung",phaseScan:"Dateien scannen",phaseEmbed:"Chunks einbetten",phaseWrite:"Index schreiben",phaseDone:"erledigt",phaseError:"Fehler",phaseCancelled:"abgebrochen",setupFailed:"Setup fehlgeschlagen",stopping:"stoppe",scanned:"{count} gescannt",changed:"{count} geändert",skipped:"{count} übersprungen",chunksProgress:"{done} / {total} ({pct}%)",result:"Ergebnis",added:"{count} hinzugefügt",removed:"{count} entfernt",failed:"{count} fehlgeschlagen",skippedFiles:"{total} Dateien ({details})",rebuildStarted:"Neuerstellung gestartet",incrementalStarted:"inkrementelle Indizierung gestartet",stopRequested:"Stopp angefordert — aktueller Chunk-Batch wird zuerst beendet",startingDaemon:"starte Ollama-Daemon (15s Timeout)…",daemonUp:"Daemon ist aktiv",daemonTimeout:"Daemon wurde nicht rechtzeitig aktiv — überprüfe ollama serve manuell",pullingModel:"ziehe {model} — dies kann bei der ersten Installation einige Minuten dauern",savedConfig:"gespeichert · {count} Felder aktualisiert · führe Index erneut aus, um anzuwenden",runningPreview:"führe Trockenlauf gegen Projekt-Root aus…",exclude:"ausschließen"},modal:{...A.modal,shellTitle:"Shell-Befehl",shellBgTitle:"Hintergrundprozess",shellSubtitle:"Modell möchte einen Shell-Befehl ausführen",shellBgSubtitle:"langlebig — läuft nach Genehmigung weiter",pathTitle:"Datei außerhalb des Sandbox",pathSubtitle:"{intent} via {tool}",pathRead:"lesen",pathWrite:"schreiben",pathSandboxLabel:"Sandbox",pathAllowPrefixLabel:"Präfix erlauben",runOnce:"Einmal ausführen",alwaysAllow:'"{prefix}" immer erlauben',deny:"Ablehnen",choiceTitle:"Modell möchte, dass du wählst",typeOwn:"Eigene Antwort eingeben",typeOwnSummary:"Keine der Optionen passt — schreibe eine Freitext-Antwort.",typePlaceholder:"Freitext-Antwort eingeben…",send:"Senden",cancel:"Abbrechen",cancelSummary:"Frage verwerfen. Modell fragt, was du eigentlich möchtest.",planTitle:"Plan eingereicht",planSubtitle:"Modell hat einen Plan vorgeschlagen; überprüfe, dann wähle",approveInstructions:"Optionale letzte Anweisungen / Antworten auf offene Fragen (Enter zum Leer-Senden)",refinePlaceholder:"Was muss sich ändern? Sei konkret.",approve:"Genehmigen",refine:"Verfeinern",sendRefinement:"Verfeinerung senden",editTitle:"Edit ausstehend zur Überprüfung",editSubtitle:"{path} · {remaining} von {total} Blöcken verbleibend",before:"vorher",after:"nachher",workspaceTitle:"Modell möchte Arbeitsbereich wechseln",workspaceSubtitle:"jedes nachfolgende Datei-/Shell-/Memory-Tool wird gegen den neuen Root aufgelöst",switchBtn:"Wechseln (Enter)",denyBtn:"Ablehnen (Esc)",stepComplete:"Schritt abgeschlossen{counter}",continueBtn:"Fortsetzen",reviseBtn:"Überarbeiten…",stopBtn:"Stopp",revisionTitle:"Modell hat eine Planüberarbeitung vorgeschlagen",sendRevision:"Überarbeitung senden",accept:"Akzeptieren",reject:"Ablehnen",arguments:"Argumente",revisePlaceholder:"Was muss sich vor dem nächsten Schritt ändern? Leer lassen zum Fortfahren.",pickerFilter:"Filter…",pickerEmpty:"Nichts anzuzeigen.",pickerLoadMore:"Mehr laden",pickerPick:"Öffnen",pickerInstall:"Installieren",pickerUninstall:"Deinstallieren",pickerRename:"Umbenennen…",pickerNew:"Neu…",pickerNewPlaceholder:"Name (leer lassen für Standard)",viewerClose:"Schließen"},error:{...A.error,title:"Etwas ist im Dashboard kaputtgegangen",body:"Die TUI ist nicht betroffen — nur dieser Browser-Tab ist gestolpert. Du kannst schließen und weiterarbeiten oder es melden, damit wir die Ursache beheben.",copyDetails:"Details kopieren",copied:"Kopiert ✓",reportOnGithub:"Auf GitHub melden",dismiss:"Schließen (Esc)",crashing:"dieses Panel stürzt ständig ab — {name}",retry:"Erneut versuchen",recovering:"wiederherstellen…"},fmt:{...A.fmt,justNow:"gerade eben",minutesAgo:"vor {n}m",hoursAgo:"vor {n}h",daysAgo:"vor {n}T"},cards:{...A.cards,applied:"Angewendet",cacheHit:"Cache-Treffer",checkpointRewind:"Checkpoint-Rückspulen",cost:"Kosten",diffApply:"Anwenden",diffApplyChanges:"Änderungen anwenden",diffAwaiting:"Wartet auf Überprüfung",diffDiscard:"Verwerfen",done:"Fertig",elapsed:"Verstrichen",error:"Fehler",errorName:"Fehler",failed:"Fehlgeschlagen",hits:"Treffer",memoryCountSuffix:"Erinnerungen",memoryName:"Memory",output:"Ausgabe",planDefaultTitle:"Plan",prompt:"Prompt",compactionMeta:"{chars} Zeichen",compactionName:"Komprimierter Verlauf",reasoningComplete:"Reasoning abgeschlossen",reasoningName:"Reasoning",result:"Ergebnis",running:"Läuft",searchName:"Suche",shellAlwaysAllow:"Immer erlauben",shellAwaiting:"Wartet auf Genehmigung",shellExecuteHint:"Diesen Befehl ausführen?",shellReject:"Ablehnen",shellRun:"Ausführen",shellRunning:"Läuft",streaming:"Streamt",subagentDone:"Subagent erledigt",subagentDoneProgress:"Subagent erledigt ({pct}%)",subagentFailed:"Subagent fehlgeschlagen",subagentRunning:"Subagent läuft"},planBadge:{...A.planBadge,blocked:"Blockiert",done:"Erledigt",failed:"Fehlgeschlagen",pending:"Ausstehend",running:"Läuft"},composer:{...A.composer,atHeader:"Dateien erwähnen",close:"Schließen",commandPalette:"Befehlsübersicht",commands:"Befehle",commandsLabel:"Befehle",confirm:"Bestätigen",imageFilterName:"Bilder",insertFile:"Datei einfügen",insertImage:"Bild einfügen",interrupt:"Unterbrechen",mentionFiles:"Dateien erwähnen",mentionLabel:"Erwähnen",newline:"Neue Zeile",noMatches:"Keine Treffer",placeholder:"Prompt eingeben…",queue:"Warteschlange",queueCount:"{count} in Warteschlange",select:"Auswählen",send:"Senden",slashHeader:"Slash-Befehle",switchModel:"Modell wechseln",switchEffort:"Reasoning-Effort wechseln",workspaceRoot:"Arbeitsbereich-Root"},contextPanel:{...A.contextPanel,allow:"Erlauben",ask:"Fragen",autoApproveTitle:"Auto-genehmigen",cacheKey:"Cache",contextTokens:"Kontext-Tokens",fileInContext:"Im Kontext",fileModified:"Geändert",filesCount:"{count} Dateien",filesTab:"Dateien",filesTitle:"Dateien",freeKey:"Frei",itemCount:"{count} Einträge",mcpConfigured:"Konfiguriert",mcpConnecting:"Verbinde…",mcpDisabled:"Deaktiviert",mcpEmpty:"Keine MCP-Server",mcpFailed:"Fehlgeschlagen",mcpReady:"Bereit",mcpReadyAll:"Alle bereit",mcpReadySome:"Teils bereit",mcpTitle:"MCP",mcpTools:"Tools",memoryTab:"Memory",memoryTitle:"Memory",noFilesMsg:"Keine Dateien im Kontext",noMemoriesMsg:"Keine Erinnerungen",reservedKey:"Reserviert",ruleReadOnly:"Schreibgeschützt",ruleReview:"Überprüfung",ruleShellAllowlist:"Shell-Allowlist",rulesTab:"Regeln",ruleWritesAsk:"Schreiben fragen",ruleYolo:"YOLO",scopeGlobal:"Global",scopeProject:"Projekt",toolsTab:"Tools",usedKey:"Verwendet"},dragDrop:{...A.dragDrop,overlay:"Dateien hier ablegen"},extraCards:{...A.extraCards,approve:"Genehmigen",balance:"Guthaben",cache:"Cache",cacheHit:"Cache-Treffer",contextWindow:"Kontextfenster",doctorTitle:"Diagnose",output:"Ausgabe",prompt:"Prompt",reasoning:"Reasoning",reject:"Ablehnen",sessionCost:"Sitzungskosten",sessionUsage:"Sitzungsnutzung",topToolsUsage:"Top-Tools",unknownKind:"Unbekannt",memoryUser:"Benutzer",memoryFeedback:"Feedback",memoryProject:"Projekt",memoryReference:"Referenz"},jobs:{...A.jobs,empty:"Keine Hintergrund-Jobs",exited:"Beendet",kbClose:"Schließen",kbToggle:"Umschalten",running:"Läuft",stop:"Stopp",stopAll:"Alle stoppen",stopAllTip:"Alle Jobs stoppen",stopOne:"Stopp",title:"Hintergrund-Jobs"},live:{...A.live,deliveredWaiting:"Warte auf nächste Nachricht",reasoning:"Reasoning",running:"Läuft",secondsAgo:"vor {n}s",you:"Du"},markdown:{...A.markdown,copied:"Kopiert!",copy:"Kopieren",externalLinkTitle:"In neuem Tab öffnen",filePillTitle:"Datei öffnen",localLinkTitle:"Link öffnen"},palette:{...A.palette,abort:"Abbrechen",abortHint:"Aktuelle Anfrage abbrechen",about:"Über",clearChat:"Chat leeren",clearChatHint:"Unterhaltung leeren",closeTab:"Tab schließen",closeTabHint:"Aktuellen Tab schließen",copyConv:"Unterhaltung kopieren",copyConvHint:"Unterhaltung als Markdown kopieren",copyLast:"Letzte Antwort kopieren",copyLastHint:"Letzte Assistentennachricht kopieren",countSuffix:"Einträge",empty:"Keine passenden Befehle",exportMd:"Als Markdown exportieren",exportMdHint:"Chat als Markdown-Datei exportieren",focusComposer:"Composer fokussieren",footClose:"Schließen",footMove:"Bewegen",footRun:"Ausführen",groupAction:"Aktionen",groupNav:"Navigation",groupSettings:"Einstellungen",groupWorkspace:"Arbeitsbereich",newChat:"Neuer Chat",newChatHint:"Neues Gespräch beginnen",newTab:"Neuer Tab",newTabHint:"Neuen Tab öffnen",pickWorkspace:"Arbeitsbereich wechseln",pickWorkspaceHint:"Arbeitsbereich ändern",searchPlaceholder:"Befehle suchen…",settings:"Einstellungen",settingsHint:"Einstellungen öffnen"},panel:{...A.panel,renderError:"Panel abgestürzt"},sidebarPanel:{...A.sidebarPanel,approvalRules:"Genehmigungsregeln",cancel:"Abbrechen",commandPalette:"Befehlsübersicht",daysAgo:"vor {n}T",delete:"Löschen",deleteSession:"Sitzung löschen",hoursAgo:"vor {n}h",justNow:"Gerade eben",loading:"Lade…",messageCount:"{count} Nachrichten",minutesAgo:"vor {n}m",newChat:"Neuer Chat",noMatches:"Keine Treffer",noSessions:"Keine Sitzungen",recent:"Letzte",searchSessions:"Sitzungen durchsuchen…",sessionTitle:"Sitzungen",settings:"Einstellungen",weeksAgo:"vor {n}W"},statusbar:{...A.statusbar,balance:"Guthaben",busy:"Beschäftigt",cache:"Cache",cacheHit:"Cache-Treffer",jobs:"Jobs",jobsTip:"Hintergrund-Jobs",offline:"Offline",online:"Online",switchCurrency:"Währung wechseln",switchTheme:"Theme wechseln",switchWorkspace:"Arbeitsbereich wechseln",themeDark:"Dunkel",themeLight:"Hell",themeStyleGraphite:"Graphit",themeStyleSandstone:"Sandstein",themeStylePorcelain:"Porzellan",themeStyleMidnight:"Mitternacht",thisTurn:"Dieser Turn",tokens:"Tokens"},thread:{...A.thread,activePlan:"Aktiver Plan",allowRead:"Lesen erlauben",allowWrite:"Schreiben erlauben",alwaysAllow:"Immer erlauben",alwaysAllowPrefix:"{prefix} immer erlauben",approve:"Genehmigen",approveRewrite:"Neuschreibung genehmigen",cancel:"Abbrechen",checkpointKind:"Checkpoint",checkpointSub:"Aktuellen Zustand speichern",checkpointTitle:"Checkpoint erstellen",collapse:"Einklappen",continue:"Fortsetzen",copyMessage:"Nachricht kopieren",copyResponse:"Antwort kopieren",execute:"Ausführen",keepOriginal:"Original behalten",keepSteps:"Schritte behalten",optionCount:"{count} Optionen",pathAccessKind:"Pfadzugriff",planConfirmationKind:"Plan-Genehmigung",planRevisionKind:"Plan-Überarbeitung",planRunning:"Plan in Bearbeitung",planStepCount:"Schritt {done}/{total}",readPathOutsideSandbox:"Pfad außerhalb des Sandbox lesen",refine:"Verfeinern",reject:"Ablehnen",revise:"Überarbeiten",revisionMeta:"Überarbeitung",rewritePlan:"Plan umschreiben",risk:"Risikobewertung",riskMedium:"Mittleres Risiko",runBackgroundCommand:"Im Hintergrund ausführen",runCommand:"Befehl ausführen",shellConfirmationKind:"Shell-Bestätigung",startPlan:"Plan starten",stop:"Stopp",subagent:"Subagent",userChoiceKind:"Benutzerauswahl",writePathOutsideSandbox:"Pfad außerhalb des Sandbox schreiben",you:"Du"},workdir:{...A.workdir,browse:"Durchsuchen…",cancel:"Abbrechen",empty:"Keine Arbeitsbereiche",emptyDir:"Keine Unterverzeichnisse.",go:"Gehe zu",goTip:"Zu diesem Pfad navigieren",loading:"Lade…",openHere:"Diesen Ordner öffnen",pathPlaceholder:"Absoluter Pfad…",promptWeb:"Absoluten Pfad des zu öffnenden Arbeitsbereichs eingeben:",searchPlaceholder:"Arbeitsbereiche durchsuchen…",title:"Arbeitsbereich"},about:{...A.about,close:"Schließen",repo:"Repository",sidebarLabel:"Über",tagline:"KI-gestützter Coding-Assistent",version:"Version"},effort:{...A.effort,lowDesc:"am schnellsten — minimales Reasoning",mediumDesc:"ausgewogen",highDesc:"Standard — sicher für vLLM / Azure",maxDesc:"DeepSeek-Erweiterung; von stock OpenAI / vLLM abgelehnt"},editMode:{...A.editMode,plan:"Plan",planHint:"schreibgeschützt · alle Schreibwerkzeuge verweigern die Ausführung",review:"Überprüfen",reviewHint:"sowohl Edits als auch nicht-allowlistete Shell fragen zuerst",auto:"Auto",autoHint:"Edits auto-anwenden, Shell fragt weiterhin",yolo:"YOLO",yoloHint:"Edits UND Shell auto-ausführen, Allowlist umgangen"}},$s={app:{sectionWorkspace:"工作区",sectionObserve:"监控",sectionConfigure:"配置",tabChat:"对话",tabPlans:"计划",tabSessions:"会话",tabOverview:"概览",tabUsage:"用量",tabSystem:"系统",tabSemantic:"语义",tabTools:"工具",tabPermissions:"权限",tabMcp:"MCP",tabSkills:"技能",tabMemory:"记忆",tabHooks:"钩子",tabSettings:"设置",sectionChanges:"变更",tabChanges:"变更",footer:"仅 127.0.0.1 · Token 保护",themeToggle:"切换主题",themeLight:"浅色",themeDark:"深色",skill:{scope:{builtin:"内置",global:"全局",project:"项目"},runAs:{subagent:"子代理",inline:"内联"},generic:"技能"},exportReasoningSummary:"推理摘要",exportToolLabel:"工具调用",exportUserLabel:"用户消息",empty:{currentWorkspace:"当前工作区",selectWorkspace:"选择一个工作区开始",suggestion0:"开始新对话",suggestion1:"打开设置",suggestion2:"查看概览",suggestion3:"浏览会话",welcome:"欢迎使用 Reasonix"},errorLabel:"错误",connecting:"连接中…",session:{format:"会话",new:"新建会话"},setup:{choose:"选择工作区",description:"选择一个工作区开始工作",notSelected:"未选择工作区",saveAndStart:"保存并开始",welcome:"欢迎",workspace:"工作区"},tab:{newTab:"+ 新建标签",newTabTitle:"打开新标签"},titlebar:{clearChat:"清除对话",close:"关闭",commandPalette:"命令面板",contextPanel:"上下文面板",copyMd:"复制为 Markdown",exportMd:"导出为 Markdown",maximize:"最大化",minimize:"最小化",more:"更多",restore:"还原",settings:"设置",sidebar:"侧边栏",windowControls:"窗口控制"},toast:{cleared:"对话已清除",copied:"已复制到剪贴板",copiedMd:"已复制为 Markdown",emptySession:"无消息可导出",exportDialogTitle:"导出对话",exportedMd:"已导出为 Markdown",exportFailed:"导出失败",langSwitched:"语言已切换",modelSwitched:"模型 → {model}",effortSwitched:"强度 → {effort}",modeSwitched:"模式已切换",newSession:"新会话已创建"},yolo:{toast:"YOLO 模式已启用"},cmd:{abort:"中止",btw:"顺便说一下",clearChat:"清除对话",compact:"紧凑",copyLast:"复制上条",exportMd:"导出为 Markdown",feedback:"反馈",help:"帮助",newSession:"新建会话",retry:"重试",switchModel:"切换模型",toggleCurrency:"切换货币",toggleLang:"切换语言",toggleTheme:"切换主题"},header:{abort:"中止",clickToSelect:"点击选择",copy:"复制",copyMd:"复制为 Markdown",export:"导出",exportMd:"导出为 Markdown",newChat:"新建对话",noWorkspace:"无工作区",running:"运行中…"},jumpToBottom:"跳到底部",langEN:"English",langZH:"中文",splashSubtitle:"AI 驱动的编程助手"},changes:{chatPlaceholder:"询问代码问题…",chatWelcome:"变更 — 询问项目文件相关问题。",chatSend:"发送",viewerPlaceholder:"选择一个文件查看",treeEmpty:"(空)",tabClose:"关闭标签",newConversation:"新建",clearConversation:"清除",newTitle:"/new — 清除对话上下文",clearTitle:"/clear — 仅清除可见的滚动回放",newConfirmBusy:"有轮次正在执行。中止并开始新对话?",newConfirm:"清除当前对话并重新开始?",newToast:"新对话",clearToast:"滚动回放已清除",newFailed:"/new 失败:{error}",clearFailed:"/clear 失败:{error}",chatSendBtn:"发送",fileTreeTitle:"文件",codeViewerTitle:"代码查看器",chatPanelTitle:"对话",loadingFiles:"正在加载项目文件…",review:"审查",allFiles:"所有文件",changes:"更改",commentLabel:"正在评论 第",commentPlaceholder:"添加评论…",commentCancel:"取消",commentSubmit:"评论",commentLine:"第",commentEdit:"编辑",commentDelete:"删除",diffSourceGit:"Git 变更",diffSourceSession:"上一轮变更",diffSourceCheckpoint:"检查点",checkpointEmpty:"暂无检查点",restoreBtn:"恢复",restoreConfirm:'确定要恢复检查点"{name}"吗?当前更改将被覆盖。',deleteBtn:"删除",deleteConfirm:'确定要删除检查点"{name}"吗?',createBtn:"创建",createPlaceholder:"检查点名称…",backToList:"返回列表",reviewEmpty:"暂无可审查的更改",diffStyleUnified:"统一视图",diffStyleSplit:"分栏视图",expandAll:"全部展开",collapseAll:"全部折叠",createFailed:"创建失败",restoreFailed:"恢复失败",deleteFailed:"删除失败"},common:{loading:"加载中…",loadingFailed:"{name}失败:{error}",back:"← 返回",save:"保存",remove:"移除",cancel:"取消",delete:"删除",add:"添加",confirm:"确认",noData:"暂无{name}。",all:"全部",yes:"是",no:"否",on:"开启",off:"关闭",enabled:"已启用",disabled:"已禁用"},settings:{title:"设置",loading:"加载设置…",saved:"已保存:{fields}",sectionApi:"DeepSeek API",apiKey:"API 密钥",apiKeyNotSet:"未设置",apiKeySave:"保存密钥",apiKeySet:"已设置",apiSection:"API 配置",notSet:"(未设置)",replace:"替换",pasteKey:"粘贴新的 sk-… 令牌",saveKey:"保存密钥",baseUrl:"基础 URL",baseUrlPlaceholder:"https://api.deepseek.com(默认)",baseUrlHint:"API 请求的基础 URL",sectionDefaults:"默认设置",effortSection:"推理强度",modelCustom:"自定义模型 ID",modelCustomHint:"任何 OpenAI 兼容的 ID(vLLM、Ollama、Together …)。",modelCustomActive:"当前运行自定义 ID:{model}",appliesNextTurn:"下一轮生效",effort:"推理强度",effortMax:"max(DeepSeek 扩展 — 标准 OpenAI / vLLM 会拒绝)",effortHigh:"high(安全默认 — vLLM / Azure 兼容)",effortMedium:"medium",effortLow:"low(最快)",webSearch:"网页搜索",webSearchNote:"web_fetch + web_search 工具",webSearchEngine:"搜索引擎",webSearchEngineBing:"bing — 默认,国内裸 IP 直连,无需代理",webSearchEngineSearxng:"searxng — 自托管(端点用 /se searxng <url> 配置)",webSearchEngineMetaso:"metaso — 每日 100 次免费(国内友好,metaso.cn 可领免费 key)",webSearchEngineTavily:"tavily — 每月 1000 次免费(设置 TAVILY_API_KEY)",webSearchEnginePerplexity:"perplexity — AI 直接回答(设置 PERPLEXITY_API_KEY)",webSearchEngineExa:"exa — AI 直接回答,每月 1000 次免费(设置 EXA_API_KEY)",webSearchEngineBrave:"brave — 独立索引,每月 2000 次免费(设置 BRAVE_SEARCH_API_KEY)",webSearchEngineOllama:"ollama — Ollama 云端网页搜索(设置 OLLAMA_API_KEY)",webSearchEngineNote:"下一次 web_search 调用生效",sectionBudget:"预算",budget:"预算",budgetHint:"设置支出限额",budgetPlaceholder:"输入预算金额",budgetOf:"/",budgetSetCap:"设置上限",budgetCustom:"自定义",budgetBumpHint:"提高上限以继续",budgetClear:"清除上限",budgetIdleLine:"80% 时提醒 · 100% 后拒绝执行",budgetWarnLine:"接近上限 — 超过 100% 将拒绝执行",budgetRefusing:"已超出上限 — 提高或清除后才会继续",sectionLoop:"循环",loopIdleHint:"按固定间隔自动重新提交一段提示词。",loopCostHint:"每次迭代约 {cost}(上一轮成本)。",loopInterval:"间隔",loopCustom:"自定义",loopRangeError:"间隔需在 5s..6h 之间",loopPrompt:"提示词",loopPromptPlaceholder:"例如:检查部署状态并汇报任何错误",loopStart:"启动循环",loopStop:"停止",loopRunning:"运行中",loopIter:"第 {iter} 次",loopFiresIn:"{remaining} 后触发",sectionSkills:"技能",skillPaths:"技能路径",skillPathsPlaceholder:"/path/to/skills-a, /path/to/skills-b",skillPathsNote:"英文逗号分隔 · 下次 /new 或新会话生效",skillsEmpty:"无已加载技能",skillsLoaded:"技能已加载",subagentModelFlash:"flash",subagentModelPro:"pro",subagentModelHint:"技能派生独立 subagent 时使用的模型",sectionRuntime:"运行时",activeModel:"当前模型",model:"模型",modelFlashDesc:"Flash — 始终 flash",modelProDesc:"Pro — 始终 pro",modelPricingLine:"${hit} 命中 · ${miss} 未命中 · ${out} 输出 / 100 万 tok",editMode:"编辑模式",editModeNote:"在对话标签页头部切换",editModeHint:"配置编辑模式",showSystemEvents:"系统事件",showSystemEventsHint:"在对话流中以细线显示压缩 / 中断 / 限速等系统事件",shown:"显示",hidden:"隐藏",appMode:"应用模式",sectionLanguage:"语言",language:"语言",languageHint:"切换语言",langEn:"English",langZhCn:"简体中文",appearanceSection:"外观",behaviorSection:"行为",ruleAutoApprovalHint:"配置自动审批规则",ruleAutoApprovalSection:"自动审批规则",theme:"主题",themeDark:"深色",themeHint:"在浅色和深色主题之间切换",themeLight:"浅色",themeStyle:"主题风格",themeStyleHint:"选择主题风格",themeStyleGraphite:"石墨",themeStyleGraphiteDesc:"冷色深色调,适合长时间使用。",themeStyleSandstone:"砂岩",themeStyleSandstoneDesc:"暖色浅色调,明亮环境更舒适。",themeStylePorcelain:"瓷白",themeStylePorcelainDesc:"高对比度浅色,简洁清爽。",themeStyleMidnight:"午夜",themeStyleMidnightDesc:"深色配冷色高光,更深邃。",pageGeneralLabel:"通用",pageGeneralDesc:"主题、字体、语言与工作目录。",pageModelsLabel:"模型",pageModelsDesc:"默认模型与推理强度。",pageMcpLabel:"MCP 服务器",pageMcpDesc:"接入外部工具服务器。",pageSkillsLabel:"技能",pageSkillsDesc:"可通过 /skill 调用的自定义技能。",pageMemoryLabel:"记忆",pageMemoryDesc:"跨会话保留的长期笔记。",pageRulesLabel:"规则",pageRulesDesc:"Shell 与路径访问的自动审批规则。",pageBillingLabel:"账单",pageBillingDesc:"API key、余额与会话预算。",pageShortcutsLabel:"快捷键",pageShortcutsDesc:"键盘快捷键参考。",fontFamily:"字体",fontFamilyHint:"选择字体",fontFamilySans:"无衬线",fontFamilySerif:"衬线",fontFamilySystem:"系统",fontScale:"字体大小",fontScaleHint:"调整字体大小",fontScaleLarge:"大",fontScaleMedium:"中",fontScaleSmall:"小",currentWorkspace:"当前工作区",defaultModelCurrent:"当前模型",editor:"编辑器",editorHint:"配置编辑器偏好",maxOutput:"最大输出",reasoningEffort:"推理强度",reasoningEffortHint:"调整推理深度",sessionCost:"会话成本",balanceAvailable:"可用",balanceLabel:"余额",balanceLow:"余额不足",cacheHitRate:"缓存命中率",ctxWindow:"上下文窗口",notSelected:"未选择",parseError:"解析错误",workspaceChange:"更改",workspaceSection:"工作区",mcpAdd:"添加",mcpAddSection:"添加 MCP 服务器",mcpBridged:"已桥接",mcpConfigured:"已配置",mcpEmpty:"无 MCP 服务器",mcpNotBridged:"未桥接",mcpRemove:"移除",mcpSpecFormat:"JSON 格式",mcpSpecLabel:"服务器规格",memoryDesc:"配置记忆设置",memorySection:"记忆",shortcutAbort:"中止",shortcutCloseTab:"关闭标签",shortcutCommandPalette:"命令面板",shortcutFocusComposer:"聚焦编辑器",shortcutNewChat:"新建对话",shortcutNewTab:"新建标签",shortcutSettings:"设置",shortcutSwitchTab:"切换标签",qqAccessAllowlist:"允许列表",qqAccessOpen:"开放",qqAccessOwner:"所有者",qqAccessOwnerWithAllowlist:"所有者 + 允许列表",qqAccessRuntime:"运行时",qqAppId:"App ID",qqApplyAction:"应用",qqApplyLabel:"应用",qqAppSecret:"App Secret",qqBack:"返回",qqConfigure:"配置",qqConfigureHint:"设置 QQ 集成",qqConfigureTitle:"QQ 配置",qqConnected:"已连接",qqConnecting:"连接中…",qqDisconnected:"已断开",qqEnvironment:"环境",qqFailed:"失败",qqProduction:"生产环境",qqSandbox:"沙箱环境",qqSave:"保存",qqSaveAndConnect:"保存并连接",qqSection:"QQ 集成",qqSummaryAppId:"App ID",qqSummaryDetail:"详情",qqSummaryMissing:"未配置",qqTitle:"QQ 机器人"},chat:{modeMirror:"TUI 镜像",modeView:"会话视图",placeholder:"输入提示词 — Enter 发送,Shift+Enter 换行 · / @ 打开选择器",placeholderBusy:"请等待当前轮次完成…",placeholderSteerBusy:"输入消息以引导当前任务 — 忙碌时不支持命令和选择器",steerHint:"消息将作为附加指示引导当前轮次",send:"发送",new:"新建",clear:"清除",newTitle:"/new — 清除对话上下文(循环日志 + 滚动回放)",clearTitle:"/clear — 仅清除可见的滚动回放(上下文保留)",noConversation:"暂无对话。在下方发送提示词开始。",newConfirmBusy:"有轮次正在执行。中止并开始新对话?",newConfirm:"清除当前对话并重新开始?",newToast:"新对话",clearToast:"滚动回放已清除",newFailed:"/new 失败:{error}",clearFailed:"/clear 失败:{error}",eventStreamError:"事件流中断 — 正在重连…",semanticBanner:"此项目未启用语义搜索。",semanticBannerDesc:"构建一次索引,模型即可按含义查找代码(“哪里处理认证失败?”),而不仅依赖精确字符串的 grep。",semanticBannerBtn:"构建 →",semanticBannerDismiss:"关闭(不再显示)",slashCommands:"斜杠命令",projectFiles:"项目文件",effortTitle:"reasoning_effort — 下一轮生效",effortMaxTitle:"max(DeepSeek 扩展)",effortHighTitle:"high(安全默认 — vLLM / Azure 兼容)",effortMediumTitle:"medium",effortLowTitle:"low(最快)",editGateTitle:"编辑门控 — Shift+Tab 在 TUI 中循环",editReviewTitle:"review — 编辑和非允许列表的 shell 命令都会先询问",editAutoTitle:"auto — 编辑自动应用,shell 仍会询问",editYoloTitle:"yolo — 编辑和 shell 都自动运行,绕过允许列表",railSession:"会话",railTurns:"轮次",railPromptTok:"提示 tokens",railCost:"费用",railCacheHit:"缓存命中",railToolBudget:"工具预算",railSpend:"已用",railActivePlan:"活跃计划",railProgress:"进度",statusModel:"模型",statusCtx:"上下文",statusCache:"缓存",statusTurn:"轮次",statusSession:"会话",statusBalance:"余额",statusTurns:"{count} 轮",waitingStats:"· · · 等待实时统计",inflightPhase:"{phase}",inflightRunning:"运行中",inflightThinking:"思考中",inflightStreaming:"输出中",inflightWaiting:"等待中",inflightReasoning:"推理 {count} 字符",inflightOut:"输出 {count} 字符",abortBtn:"中止 (Esc)",confirmBtn:"应用 (y)",rejectBtn:"拒绝 (n)",applyRestBtn:"应用剩余 (a)",flipAutoBtn:"切换为 AUTO (A)"},overview:{loading:"加载概览…",failed:"概览失败:{error}",standaloneTitle:"独立模式",standaloneDesc:"只读磁盘视图。在 reasonix code 内启动 /dashboard 以获取实时会话状态、MCP 和工具。",cockpit:"驾驶舱",balance:"余额",tokens7d:"tokens · 7 天",cacheHit:"缓存命中",toolCalls24h:"工具调用 · 24 小时",budget:"预算",currentSession:"当前会话",noSession:"无活跃会话 — 在 reasonix code 内执行 /dashboard 进行连接。",promptTok:"提示 tokens",completionTok:"补全 tokens",cost:"费用",costTrend:"费用 · 14 天",noUsageYet:"暂无用量",dayAvg:"/天 均值",recentPlans:"近期计划",noPlans:"暂无计划 — 使用 submit_plan 提交一个。",toolActivity:"工具活动",noToolCalls:"暂无工具调用。",toolsLoaded:"已加载工具",mcpServers:"MCP 服务器",editMode:"编辑模式",version:"Reasonix",workingDir:"工作目录",projectRoot:"项目根目录",noPriorData:"无历史数据",stable:"— 稳定",vsPrior:"{arrow} {pct}% 较上期",active:"活跃",allUp:"全部在线",yoloWarning:"所有提示被绕过",checking:"检查中",latest:"最新"},usage:{loading:"加载用量…",failed:"用量失败:{error}",records:"{count} 条记录",dailyUsage:"每日用量",dailyMeta:"费用 · 缓存节省 · 轮次",noData:"暂无用量数据 — 在 reasonix chat / code / run 中执行一轮,然后刷新。",windows:"滚动窗口",colWindow:"时间范围",colTurns:"轮次",colCacheHit:"缓存命中",colCost:"费用 (USD)",colCacheSaved:"缓存节省",colVsClaude:"对比 Claude",colSaved:"节省",axisTime:"时间",axisUsd:"美元",axisTurns:"轮次",seriesCost:"费用",seriesCacheSaved:"缓存节省",seriesTurns:"轮次",mostUsed:"最常用模型",colModel:"模型"},sessions:{loading:"加载会话…",failed:"会话失败:{error}",noSessions:"暂无已保存的会话。",filterPlaceholder:"筛选会话",msgs:"条消息",pickHint:"选择左侧的会话以查看其转录稿。",resumeTitle:"在 TUI 中恢复",resumeDesc:"会话中途切换需要重启,以便消息日志可以干净地回退。请退出当前会话,然后运行:",loadingTranscript:"加载转录稿…",emptyTranscript:"空的转录稿。",messages:"{count} 条消息",newBtn:"新建会话",newHint:"归档当前会话并开启新会话",switchBtn:"切换到此会话",deleteBtn:"删除",deleteConfirm:"确定删除会话「{name}」?转录文件将被移除,无法撤销。",cantDeleteActive:"请先切换到其他会话,再删除当前会话。",attachRequired:"实时会话操作需要已连接的 CLI 会话。请通过 reasonix chat 启动,或在 TUI 会话中打开仪表盘。",activeChip:"当前",activePill:"当前"},tools:{loading:"加载工具…",failed:"工具失败:{error}",noTools:"未注册任何工具。",planMode:"计划模式 — 写入受限",colTool:"工具",colFlags:"标志",colDesc:"描述",readOnly:"只读",write:"写入",flat:"扁平",desc:{web_search:"搜索公共网络。返回带标题、URL 和摘要的排序结果。当答案的正确性依赖于当前状态时调用——事件、价格、发布、现实世界的状态。",web_fetch:"下载 URL 并返回其可见文本内容(已剥离脚本/样式/导航)。在 web_search 摘要不够时使用。",run_command:"在项目根目录执行 shell 命令,返回合并的标准输出和标准错误。白名单中的只读命令立即执行;可能修改状态的操作需用户确认。",run_background:"启动一个长时间运行的进程并分离。返回任务 ID 用于查看日志、等待完成或终止。用于开发服务器、文件监听器和一次性长时间任务。",job_output:"读取后台任务的最新输出。返回缓冲区末尾内容并告知任务是否仍在运行。",wait_for_job:"在服务端阻塞直到后台任务完成(有超时限制)。用于替代轮询 job_output。",stop_job:"停止后台任务。先发送 SIGTERM,宽限期后发送 SIGKILL。可安全调用已退出的任务。",list_jobs:"列出本次会话启动的所有后台任务——运行中和已退出的——包含 ID、命令、PID 和状态。",remember:"保存一条记忆供未来会话使用。当用户陈述偏好、纠正你的方法、分享非显而易见的事实或要求你记住某事时使用。",forget:"删除记忆文件并从 MEMORY.md 中移除。当用户要求忘记某事或之前记住的事实已不再正确时使用。",recall_memory:"当记忆文件的一行摘要不够详细时,读取其完整内容。",read_file:"读取沙箱根目录下的文件。支持 head/tail/range 范围读取以节省上下文。超过 200 行的文件自动返回预览。",list_directory:"列出目录中的条目。每行一个条目,目录以斜杠标记。",directory_tree:"递归列出目录中的条目,以缩进树形结构显示。对大子目录自动折叠以节省预算。",search_files:"根据名称匹配子串或正则表达式查找文件。不区分大小写。默认跳过依赖/构建目录。",search_content:"递归搜索文件内容中的子串或正则表达式。以 path:line:text 格式返回匹配结果。查找引用的正确工具。",glob:"按 glob 模式列出文件,按修改时间排序。默认限制 200,最大 1000。默认跳过 node_modules/.git/dist。",get_file_info:"获取沙箱根目录下路径的状态信息。返回类型、字节大小和修改时间。",write_file:"创建或覆盖文件,内容由参数指定。按需创建父目录。",edit_file:"对现有文件应用 SEARCH/REPLACE 编辑。搜索必须完全匹配且在文件中唯一。",multi_edit:"跨一个或多个文件原子性地应用 N 个 SEARCH/REPLACE 编辑。如果任何编辑失败,不写入任何文件。",create_directory:"在沙箱根目录下创建目录(以及任何缺失的父目录)。",move_file:"重命名或移动沙箱根目录下的文件或目录。",delete_file:"删除沙箱根目录下的一个文件。拒绝目录——请使用 delete_directory 删除目录。",delete_directory:"递归删除沙箱根目录下的目录。传入 recursive:false 可拒绝非空目录。",copy_file:"复制沙箱根目录下的文件或目录。拒绝覆盖已存在的目标。",submit_plan:"提交一个具体的计划以供审查审批。用于多文件重构、架构变更或任何撤销代价高昂的操作。",mark_step_complete:"将已批准计划的一个步骤标记为完成。完成每个步骤后恰好调用一次。",revise_plan:"外科手术式替换进行中计划的剩余步骤。已完成的步骤永远不会被触及。",run_skill:"从技能索引中调用一个 playbook。传入裸技能名称。标记为子代理的技能将启动独立的子代理。",spawn_subagent:"为一个独立子任务启动隔离的子代理。用于并行分发或需要大量文件读取的工作。",todo_write:"多步工作的会话内任务跟踪器。每次调用替换整个列表。无审批关卡,不写入文件。",ask_choice:"向用户展示 2-6 个选项。当用户要求选择或需要偏好决策时使用。",create_skill:"创建一个新技能,用户可通过 /skill 命令调用。支持内联和子代理两种运行模式。",add_mcp_server:"在用户配置中注册新的 MCP 服务器。下次会话生效。支持 stdio、SSE 和 streamable-http。"}},permissions:{loading:"加载权限…",failed:"权限失败:{error}",yoloTitle:"YOLO 模式",yoloDesc:"所有 shell 命令自动运行,允许列表被绕过。在 TUI 中使用 /mode review 切换回来。",project:"项目",builtin:"内置",addPrefix:"添加前缀",addPlaceholder:'例如 "npm run build" 或 "deploy.sh"',clearAll:"清除全部",alreadyIn:"{prefix} 已在列表中",added:"已添加:{prefix}",removed:"已移除:{prefix}",cleared:"已清除 {count} 条",removeConfirm:'从此项目的允许列表中移除 "{prefix}"?',clearConfirm:"清除所有项目允许列表条目?内置条目不受影响。",projectAllowlist:"项目允许列表 · {count}",nothingStored:"此项目暂无存储的条目。",colNum:"#",colPrefix:"前缀",builtinTitle:"内置 · {count} · 只读",standaloneWarning:"修改操作需要在活跃的 reasonix code 会话内执行 /dashboard — 独立模式的 reasonix dashboard 无法确定要编辑哪个项目的允许列表。"},mcp:{loading:"加载 MCP…",servers:"MCP 服务器 · {count} 个已桥接",all:"全部",live:"在线",unbridged:"未桥接",specPlaceholder:"规格 — 例如 fs=npx -y @modelcontextprotocol/...",saved:"已保存",savedRestart:"已保存 — 重启 reasonix code 以桥接此服务器",removed:"已移除 — 重启以断开实时桥接",removeConfirm:`从配置中移除 MCP 规格?
10
10
 
11
- {spec}`,noServers:"此会话中无 MCP 服务器。",tools:"个工具",inConfig:"在配置中 · 未加载",unbridgedTitle:"未桥接 · 在配置中",removeBtn:"移除",spec:"规格",whyUnbridged:"为什么未桥接?",whyUnbridgedDesc:"此规格存在于您的 config.json 中,但未桥接到实时会话。MCP 服务器在 reasonix code 启动时连接;仪表盘本身无法生成子进程。",whyUnbridgedHint:"激活方法:重启 reasonix code,然后刷新此仪表盘。",bridgeFailed:"桥接失败",bridgeFailedTitle:"桥接失败 · 在配置中",bridgeFailedHint:"已尝试桥接但失败。常见原因:URL 错误、需要鉴权、上游 404 / 5xx、本地命令缺失。修复后重启 reasonix code 重试。",pickHint:"选择左侧的 MCP 服务器以检查工具 / 资源 / 提示。",toolsTitle:"工具 · {count}",resourcesTitle:"资源 · {count}",promptsTitle:"提示 · {count}",colName:"名称",colDesc:"描述",colUri:"URI",marketplace:"市场",marketplaceSearch:"搜索注册表…",marketplaceLoading:"加载注册表…",marketplaceMore:"再加载 5 页",marketplaceMoreLabel:"再加载 50 条 · 当前 {shown} / {total}",marketplaceMoreHint:"需要从远端注册表再拉几页",marketplaceMoreCachedHint:"本地缓存已有更多条目",marketplaceExhausted:"已加载全部页",marketplaceExhaustedFull:"已展示全部 {total} 条 — 注册表耗尽",marketplaceCount:"已载入 {loaded} · 匹配 {matched} · 来源:{source}{cached}",marketplaceCachedSuffix:" · 缓存中",marketplaceNoMatches:"无匹配结果。换关键词或加载更多页。",marketplaceInstall:"安装",marketplacePickHint:"在左侧选择服务器,然后点安装。",marketplaceInstalled:"已安装 → {spec}",marketplaceInstalledBridged:"已安装并桥接 → {spec}",marketplaceAlready:"已安装过",marketplaceNeedsEnv:"需设置环境变量:{names}",marketplaceSourceTag:"[{source}]",marketplaceNoInstall:"Smithery 列表项 — 不暴露安装元数据;请直接 `npx -y @smithery/cli install {name}`",marketplaceFetchOnInstall:"Smithery 列表 — 安装时再拉详情。HTTP 服务映射为 streamable-http 远端;stdio 服务通过 @smithery/cli 运行。",marketplaceInstalledBadge:"已安装",marketplaceUninstall:"卸载",marketplaceEnvTitle:"必需的环境变量",marketplaceEnvHint:"下次启动 `reasonix code` 之前在 shell 里设好,桥接的服务器才能正常鉴权。",marketplaceRestartHint:"已写入 ~/.reasonix/config.json。重启 `reasonix code` 后服务器才会真正桥接(热重载在路线图上)。"},memory:{loading:"加载记忆…",files:"记忆 · {count} 个文件",exists:"已存在",create:"创建",noFiles:"暂无记忆文件。",pickHint:"选择左侧的记忆文件。",pickDesc:"项目 REASONIX.md 可提交;全局笔记存储在 ~/.reasonix/memory/。",chars:"{count} 个字符",saved:"已保存 {scope}",reloadHint:"在下次 /new 或会话重启时重新加载"},hooks:{loading:"加载钩子…",resolved:"已解析",eventMatrix:"事件矩阵",matrixSub:"{scripts} 个脚本 × {events} 个事件",noHooks:"未配置钩子。编辑下方的 JSON 以添加。",colScript:"脚本",noProject:"无活跃项目 — 在 reasonix code 中打开 /dashboard 以编辑项目钩子。",saveReload:"保存并重载",discard:"放弃更改",savedReloaded:"已保存并重载 {scope}",recentRuns:"近期运行",noRuns:"近期会话日志中无钩子运行记录。",colWhen:"时间",colPhase:"阶段",colHook:"钩子",colOutcome:"结果"},skills:{loading:"加载技能…",filterPlaceholder:"筛选技能",project:"项目",custom:"自定义",global:"全局",builtin:"内置",newSkill:"新技能",noDescription:"(无描述)",runs7d:"次运行 · 7 天",pickHint:"选择左侧的技能,或在上方创建新技能。",readOnlyBuiltin:"只读 · 内置",readOnlyCustom:"只读 · 自定义路径",builtinDesc:"内置技能随 Reasonix 一起发布;模型会自动识别。如需自定义,请创建同名的项目或全局技能。",saved:"已保存 {scope}/{name}",deleteConfirm:"删除技能 {scope}/{name}?",reloadHint:"在下次 /new 或会话重启时重新加载"},system:{loading:"加载健康状态…",failed:"健康检查失败:{error}",healthChecks:"健康检查",version:"版本",checking:"检查中",latest:"● 最新",outOfDate:"● 需要更新",versionPending:"版本检查中",upToDate:"已是最新",latestVer:"最新:{version}",sessions:"会话",ok:"● 正常",memory:"记忆",semanticIndex:"语义索引",built:"● 已构建",none:"— 无",runIndex:"运行 reasonix index 以构建",usageLog:"用量日志",backgroundJobs:"后台任务",noSession:"— 无会话",running:"{count} 个运行中",attachHint:"连接会话以查看任务",shellSpawn:"Shell + 生成",paths:"路径",home:"主目录",sessionsPath:"会话",memoryPath:"记忆",semanticPath:"语义",usagePath:"用量"},plans:{loading:"加载计划…",failed:"计划失败:{error}",noPlans:"暂无归档计划 — 运行调用 submit_plan 和 mark_step_complete 的轮次。",filterPlaceholder:"筛选计划",active:"进行中",done:"已完成",idle:"未开始",steps:"步骤",pickHint:"选择左侧的计划。",noTitle:"(无标题)",stepTimeline:"步骤时间线 · {done} / {total}",step:"步骤 {n}"},semantic:{codeRequired:"语义 — 需要代码模式",indexBuilt:"索引已构建",noIndex:"尚无索引",ready:"就绪",setupNeeded:"需要设置",installOllama:"安装 Ollama",installOllamaDesc:"Reasonix 不会为您运行包管理器。请先安装 Ollama,然后返回:",macWindows:"macOS / Windows:",download:"从 ollama.com/download 下载",linux:"Linux:",refreshHint:"安装后刷新 — 此面板将提供启动守护进程和拉取 {model} 的选项。",daemon:"守护进程",daemonDesc:"ollama 在您的 PATH 中,但 HTTP 守护进程不可达。",startDaemon:"启动守护进程",runsOllama:"以分离模式运行 ollama serve",model:"模型",modelMissing:"{model} 尚未安装。",modelSize:"首次拉取约 270 MB。",pulling:"拉取中…",pullModel:"拉取 {model}",indexStatus:"索引状态",builtStatus:"● 已构建",incompatibleStatus:"● 不兼容",chunks:"分块",files:"文件",dim:"维度",size:"大小",lastBuild:"上次构建",builtWith:"构建来源",currentTarget:"当前目标",incompatibleHint:"磁盘上的这个索引是为不同的 provider 或 model 构建的。运行“完全重建”即可替换。",runIndexHint:"运行索引以启用 semantic_search。",reIndex:"重建索引",build:"构建",rebuild:"完全重建",stop:"停止",provider:"提供方",providerType:"服务类型",openaiCompat:"OpenAI-Compatible",apiUrl:"API URL",apiKey:"API Key",apiKeyStoredNote:"API Key 仅保存在本地,不会发送到第三方。",customRequestBody:"自定义请求体",invalidCustomRequestBody:"自定义请求体必须是合法 JSON:{error}",customRequestBodyMustBeObject:"自定义请求体必须是 JSON 对象。",saveBeforeIndex:"请先保存语义设置,再启动索引。",extraBody:"扩展请求体",batchSize:"批次大小",keepExistingKey:"留空则保留现有 Key",remoteProvider:"远程向量服务",remoteProviderDesc:"在这里配置 OpenAI-Compatible embeddings 的完整 URL。Reasonix 会严格使用你提供的 URL 发起请求。",ollama:"Ollama",binary:"二进制",found:"已找到",missing:"缺失",daemonStatus:"守护进程",up:"运行中",down:"已停止",pulled:"已拉取",indexConfig:"索引配置",reset:"重置",excludeDirs:"排除目录",excludeFiles:"排除文件",excludeExts:"排除扩展名",excludePatterns:"排除模式",glob:"glob",respectGitignore:"遵循 .gitignore",maxFileBytes:"最大文件字节数",skipLarger:"跳过大于 ~{size} MiB 的文件",preview:"预览",searchPlaceholder:"描述要查找的内容 — '哪里处理中止信号'",searching:"搜索中…",results:"{count} 个结果 · {ms}ms · {model}",noMatches:"没有超过分数阈值的匹配。",previewSummary:"预览 — 将索引 {included} 个文件,跳过 {skipped} 个",nothingSkipped:"无跳过 — 所有遍历的文件都将被索引。",firstIncluded:"前 {count} 个包含的文件",job:"任务",phaseSetup:"初始化中",phaseScan:"扫描文件",phaseEmbed:"嵌入分块",phaseWrite:"写入索引",phaseDone:"完成",phaseError:"错误",phaseCancelled:"已停止",setupFailed:"初始化失败",stopping:"停止中",scanned:"已扫描 {count}",changed:"已变更 {count}",skipped:"已跳过 {count}",chunksProgress:"{done} / {total}({pct}%)",result:"结果",added:"已添加 {count}",removed:"已移除 {count}",failed:"失败 {count}",skippedFiles:"{total} 个文件({details})",rebuildStarted:"已启动完全重建",incrementalStarted:"已启动增量索引",stopRequested:"已请求停止 — 当前分块批次将首先完成",startingDaemon:"正在启动 ollama 守护进程(15 秒超时)…",daemonUp:"守护进程已启动",daemonTimeout:"守护进程未在规定时间内启动 — 请手动检查 ollama serve",pullingModel:"正在拉取 {model} — 首次安装可能需要几分钟",savedConfig:"已保存 · {count} 个字段已更新 · 重新运行索引以应用",runningPreview:"正在对项目根目录执行干运行…",exclude:"排除"},modal:{shellTitle:"Shell 命令",shellBgTitle:"后台进程",shellSubtitle:"模型想要运行一条 Shell 命令",shellBgSubtitle:"长时间运行 — 批准后继续运行",pathTitle:"沙箱外文件访问",pathSubtitle:"{intent} · 通过 {tool}",pathRead:"读取",pathWrite:"写入",pathSandboxLabel:"沙箱",pathAllowPrefixLabel:"允许前缀",runOnce:"运行一次",alwaysAllow:'始终允许 "{prefix}"',deny:"拒绝",choiceTitle:"模型需要您选择",typeOwn:"输入自定义回答",typeOwnSummary:"以上选项都不合适 — 写一个自由格式的回复。",typePlaceholder:"输入自由格式的回答…",send:"发送",cancel:"取消",cancelSummary:"放弃此问题。模型将询问您实际想要什么。",planTitle:"计划已提交",planSubtitle:"模型提出了一项计划;请审阅后选择",approveInstructions:"可选的最后指示 / 对开放问题的回答(Enter 发送空白)",refinePlaceholder:"需要更改什么?请具体说明。",approve:"批准",refine:"优化",sendRefinement:"发送优化",editTitle:"编辑待审阅",editSubtitle:"{path} · {remaining} / {total} 个块剩余",before:"修改前",after:"修改后",workspaceTitle:"模型想要切换工作区",workspaceSubtitle:"后续所有文件 / Shell / 记忆工具将针对新根目录解析",switchBtn:"切换 (Enter)",denyBtn:"拒绝 (Esc)",stepComplete:"步骤完成{counter}",continueBtn:"继续",reviseBtn:"修订…",stopBtn:"停止",revisionTitle:"模型提出了计划修订",sendRevision:"发送修订",accept:"接受",reject:"拒绝",arguments:"参数",revisePlaceholder:"下一步之前需要更改什么?留空则直接继续。",pickerFilter:"过滤…",pickerEmpty:"暂无内容。",pickerLoadMore:"加载更多",pickerPick:"打开",pickerInstall:"安装",pickerUninstall:"卸载",pickerRename:"重命名…",pickerNew:"新建…",pickerNewPlaceholder:"名称(留空使用默认)",viewerClose:"关闭"},error:{title:"仪表盘出错了",body:"TUI 不受影响——只有这个浏览器标签出了问题。通常可以直接关闭并继续使用,不会打断智能体。",copyDetails:"复制详情",copied:"已复制 ✓",reportOnGithub:"在 GitHub 上报告",dismiss:"关闭 (Esc)",crashing:"此面板持续崩溃 — {name}",retry:"重试",recovering:"恢复中…"},fmt:{justNow:"刚刚",minutesAgo:"{n} 分钟前",hoursAgo:"{n} 小时前",daysAgo:"{n} 天前"},cards:{applied:"已应用",cacheHit:"缓存命中",checkpointRewind:"检查点回退",cost:"费用",diffApply:"应用",diffApplyChanges:"应用更改",diffAwaiting:"待审阅",diffDiscard:"丢弃",done:"完成",elapsed:"耗时",error:"错误",errorName:"错误",failed:"失败",hits:"命中",memoryCountSuffix:"条记忆",memoryName:"记忆",output:"输出",planDefaultTitle:"计划",prompt:"提示词",compactionMeta:"{chars} 字符",compactionName:"已压缩历史",reasoningComplete:"推理完成",reasoningName:"推理",result:"结果",running:"运行中",searchName:"搜索",shellAlwaysAllow:"始终允许",shellAwaiting:"待审批",shellExecuteHint:"执行此命令?",shellReject:"拒绝",shellRun:"运行",shellRunning:"运行中",streaming:"输出中",subagentDone:"子代理完成",subagentDoneProgress:"子代理完成 ({pct}%)",subagentFailed:"子代理失败",subagentRunning:"子代理运行中"},planBadge:{blocked:"已阻塞",done:"完成",failed:"失败",pending:"待处理",running:"运行中"},composer:{atHeader:"提及文件",close:"关闭",commandPalette:"命令面板",commands:"命令",commandsLabel:"命令",confirm:"确认",imageFilterName:"图片",insertFile:"插入文件",insertImage:"插入图片",interrupt:"中断",mentionFiles:"提及文件",mentionLabel:"提及",newline:"换行",noMatches:"无匹配",placeholder:"输入提示词…",queue:"队列",queueCount:"{count} 个排队",select:"选择",send:"发送",slashHeader:"斜杠命令",switchModel:"切换模型",switchEffort:"切换推理强度",workspaceRoot:"工作区根目录"},contextPanel:{allow:"允许",ask:"询问",autoApproveTitle:"自动审批",cacheKey:"缓存",contextTokens:"上下文 tokens",fileInContext:"在上下文中",fileModified:"已修改",filesCount:"{count} 个文件",filesTab:"文件",filesTitle:"文件",freeKey:"空闲",itemCount:"{count} 个项目",mcpConfigured:"已配置",mcpConnecting:"连接中…",mcpDisabled:"已禁用",mcpEmpty:"无 MCP 服务器",mcpFailed:"失败",mcpReady:"就绪",mcpReadyAll:"全部就绪",mcpReadySome:"部分就绪",mcpTitle:"MCP",mcpTools:"工具",memoryTab:"记忆",memoryTitle:"记忆",noFilesMsg:"上下文中无文件",noMemoriesMsg:"无记忆",reservedKey:"保留",ruleReadOnly:"只读",ruleReview:"审阅",ruleShellAllowlist:"Shell 允许列表",rulesTab:"规则",ruleWritesAsk:"写入需询问",ruleYolo:"YOLO",scopeGlobal:"全局",scopeProject:"项目",toolsTab:"工具",usedKey:"已用"},dragDrop:{overlay:"拖放文件到此处"},extraCards:{approve:"批准",balance:"余额",cache:"缓存",cacheHit:"缓存命中",contextWindow:"上下文窗口",doctorTitle:"诊断",output:"输出",prompt:"提示词",reasoning:"推理",reject:"拒绝",sessionCost:"会话成本",sessionUsage:"会话用量",topToolsUsage:"热门工具",unknownKind:"未知",memoryUser:"用户",memoryFeedback:"反馈",memoryProject:"项目",memoryReference:"参考"},jobs:{empty:"无后台任务",exited:"已退出",kbClose:"关闭",kbToggle:"切换",running:"运行中",stop:"停止",stopAll:"全部停止",stopAllTip:"停止所有任务",stopOne:"停止",title:"后台任务"},live:{deliveredWaiting:"等待下一条消息",reasoning:"推理",running:"运行中",secondsAgo:"{n} 秒前",you:"你"},markdown:{copied:"已复制!",copy:"复制",externalLinkTitle:"在新标签中打开",filePillTitle:"打开文件",localLinkTitle:"打开链接"},palette:{abort:"中止",abortHint:"中止当前请求",about:"关于",clearChat:"清除对话",clearChatHint:"清除对话",closeTab:"关闭标签",closeTabHint:"关闭当前标签",copyConv:"复制对话",copyConvHint:"复制对话为 Markdown",copyLast:"复制上条回复",copyLastHint:"复制上条助手消息",countSuffix:"个项目",empty:"无匹配命令",exportMd:"导出为 Markdown",exportMdHint:"导出对话为 Markdown 文件",focusComposer:"聚焦编辑器",footClose:"关闭",footMove:"移动",footRun:"运行",groupAction:"操作",groupNav:"导航",groupSettings:"设置",groupWorkspace:"工作区",newChat:"新建对话",newChatHint:"开始新对话",newTab:"新建标签",newTabHint:"打开新标签",pickWorkspace:"切换工作区",pickWorkspaceHint:"更改工作区",searchPlaceholder:"搜索命令…",settings:"设置",settingsHint:"打开设置"},panel:{renderError:"面板崩溃"},sidebarPanel:{approvalRules:"审批规则",cancel:"取消",commandPalette:"命令面板",daysAgo:"{n} 天前",delete:"删除",deleteSession:"删除会话",hoursAgo:"{n} 小时前",justNow:"刚刚",loading:"加载中…",messageCount:"{count} 条消息",minutesAgo:"{n} 分钟前",newChat:"新建对话",noMatches:"无匹配",noSessions:"无会话",recent:"最近",searchSessions:"搜索会话…",sessionTitle:"会话",settings:"设置",weeksAgo:"{n} 周前"},statusbar:{balance:"余额",busy:"忙碌",cache:"缓存",cacheHit:"缓存命中",jobs:"任务",jobsTip:"后台任务",offline:"离线",online:"在线",switchCurrency:"切换货币",switchTheme:"切换主题",switchWorkspace:"切换工作区",themeDark:"深色",themeLight:"浅色",themeStyleGraphite:"石墨",themeStyleSandstone:"砂岩",themeStylePorcelain:"瓷白",themeStyleMidnight:"午夜",thisTurn:"本轮",tokens:"Tokens"},thread:{activePlan:"活跃计划",allowRead:"允许读取",allowWrite:"允许写入",alwaysAllow:"始终允许",alwaysAllowPrefix:"始终允许 {prefix}",approve:"批准",approveRewrite:"批准重写",cancel:"取消",checkpointKind:"检查点",checkpointSub:"保存当前状态",checkpointTitle:"创建检查点",collapse:"折叠",continue:"继续",copyMessage:"复制消息",copyResponse:"复制回复",execute:"执行",keepOriginal:"保留原始",keepSteps:"保留步骤",optionCount:"{count} 个选项",pathAccessKind:"路径访问",planConfirmationKind:"计划审批",planRevisionKind:"计划修订",planRunning:"计划进行中",planStepCount:"步骤 {done}/{total}",readPathOutsideSandbox:"沙箱外读取路径",refine:"优化",reject:"拒绝",revise:"修订",revisionMeta:"修订",rewritePlan:"重写计划",risk:"风险评估",riskMedium:"中等风险",runBackgroundCommand:"后台运行",runCommand:"运行命令",shellConfirmationKind:"Shell 确认",startPlan:"启动计划",stop:"停止",subagent:"子代理",userChoiceKind:"用户选择",writePathOutsideSandbox:"沙箱外写入路径",you:"你"},workdir:{browse:"浏览…",cancel:"取消",empty:"无工作区",emptyDir:"无子目录。",go:"前往",goTip:"跳转到该路径",loading:"加载中…",openHere:"打开此目录",pathPlaceholder:"绝对路径…",promptWeb:"输入要打开的工作区绝对路径:",searchPlaceholder:"搜索工作区…",title:"工作区"},about:{close:"关闭",repo:"仓库",sidebarLabel:"关于",tagline:"AI 驱动的编程助手",version:"版本"},effort:{lowDesc:"最快 — 极少推理",mediumDesc:"平衡",highDesc:"默认 — vLLM / Azure 安全",maxDesc:"DeepSeek 扩展;标准 OpenAI / vLLM 会拒绝"},editMode:{plan:"计划",planHint:"只读模式 · 所有写工具都不会派发",review:"审阅",reviewHint:"编辑和非允许列表的 shell 命令都会先询问",auto:"自动",autoHint:"编辑自动应用,shell 仍会询问",yolo:"YOLO",yoloHint:"编辑和 shell 都自动运行,绕过允许列表"}},fn=["en","zh-CN","de"],bn=new Set(fn),Bs={en:"English","zh-CN":"简体中文",de:"Deutsch"},xn="reasonix.lang",Qe=[];function Hs(){try{const s=localStorage.getItem(xn);if(s&&bn.has(s))return s}catch{}const n=(typeof navigator<"u"?navigator.language:"").toLowerCase();return n.startsWith("zh")?"zh-CN":n.startsWith("de")?"de":"en"}let Re=Hs();function yn(t){if(!(typeof document>"u"))try{document.documentElement.lang=t}catch{}}yn(Re);function Os(){return Re}function kn(){return fn}function wn(t){return Bs[t]}function vn(t){if(!(!bn.has(t)||t===Re)){Re=t;try{localStorage.setItem(xn,t)}catch{}yn(t);for(const n of Qe)n()}}function $(){const[,t]=l.useState(0);return l.useEffect(()=>{const n=()=>t(s=>s+1);return Qe.push(n),()=>{const s=Qe.indexOf(n);s>=0&&Qe.splice(s,1)}},[]),Re}const Fs={en:A,"zh-CN":qs,de:_s};function $s(t,n){const s=n.split(".");let i=t;for(const r of s)if(i&&typeof i=="object"&&r in i)i=i[r];else return n;return typeof i=="string"?i:n}function a(t,n){const s=$s(Fs[Re],t);return n?s.replace(/\{(\w+)\}/g,(i,r)=>r in n?String(n[r]):`{${r}}`):s}function Dt(){return typeof document>"u"?!1:document.documentElement.dataset.platform==="macos"}function Rt(t,n){switch(t){case"mod":case"⌘":return n?"⌘":"Ctrl";case"shift":case"⇧":return n?"⇧":"Shift";case"enter":case"⏎":return"Enter";case"tab":case"⇥":return"Tab";case"esc":return"Esc";case"updown":case"↑↓":return"↑↓";default:return t}}function Us(t){const n=Dt();return t.map(s=>Rt(s,n)).join(n?"":"+")}function jn(t){return t.replace(/⌘/g,Rt("mod",Dt()))}function G({keys:t,className:n}){const s=Dt();return e.jsx("span",{className:["shortcut",n].filter(Boolean).join(" "),children:t.map((i,r)=>e.jsx("kbd",{"data-key":i,children:Rt(i,s)},`${i}-${r}`))})}function Ks(t=!0){const[n,s]=l.useState(!1);return l.useEffect(()=>{if(!t)return;const i=r=>{(r.ctrlKey||r.metaKey)&&(r.key==="k"||r.key==="K")?(r.preventDefault(),s(d=>!d)):r.key==="Escape"&&s(!1)};return window.addEventListener("keydown",i),()=>window.removeEventListener("keydown",i)},[t]),{open:n,setOpen:s}}function Ws(t){const n=[{id:"new-chat",group:"nav",label:a("palette.newChat"),hint:a("palette.newChatHint"),icon:e.jsx(Qn,{size:13}),shortcut:["mod","N"],run:t.newChat},{id:"new-tab",group:"nav",label:a("palette.newTab"),hint:a("palette.newTabHint"),icon:e.jsx(Zn,{size:13}),shortcut:["mod","T"],run:t.newTab}];return t.canCloseTab&&n.push({id:"close-tab",group:"nav",label:a("palette.closeTab"),hint:a("palette.closeTabHint"),icon:e.jsx(Xn,{size:13}),shortcut:["mod","W"],run:t.closeTab}),n.push({id:"focus-composer",group:"nav",label:a("palette.focusComposer"),icon:e.jsx(es,{size:13}),shortcut:["mod","L"],run:t.focusComposer}),t.busy&&n.push({id:"abort",group:"action",label:a("palette.abort"),hint:a("palette.abortHint"),icon:e.jsx(ts,{size:13}),shortcut:["esc"],run:t.abort}),t.hasMessages&&(n.push({id:"copy-last",group:"action",label:a("palette.copyLast"),hint:a("palette.copyLastHint"),icon:e.jsx(Ft,{size:13}),run:t.copyLast}),n.push({id:"copy-conv",group:"action",label:a("palette.copyConv"),hint:a("palette.copyConvHint"),icon:e.jsx(Ft,{size:13}),run:t.conversationCopy}),n.push({id:"export-md",group:"action",label:a("palette.exportMd"),hint:a("palette.exportMdHint"),icon:e.jsx(ns,{size:13}),run:t.exportMarkdown}),n.push({id:"clear-chat",group:"action",label:a("palette.clearChat"),hint:a("palette.clearChatHint"),icon:e.jsx(ss,{size:13}),run:t.clearChat})),n.push({id:"pick-workspace",group:"workspace",label:a("palette.pickWorkspace"),hint:a("palette.pickWorkspaceHint"),icon:e.jsx(as,{size:13}),run:t.pickWorkspace}),n.push({id:"settings",group:"settings",label:a("palette.settings"),hint:a("palette.settingsHint"),icon:e.jsx(is,{size:13}),run:t.openSettings}),n.push({id:"about",group:"settings",label:a("palette.about"),icon:e.jsx(rs,{size:13}),run:t.about}),n}const Gs=["nav","action","workspace","settings"];function Wt(t){switch(t){case"nav":return a("palette.groupNav");case"action":return a("palette.groupAction");case"workspace":return a("palette.groupWorkspace");case"settings":return a("palette.groupSettings")}}function Vs({open:t,onClose:n,commands:s}){$();const[i,r]=l.useState(""),[o,d]=l.useState(0),p=l.useRef(null),h=l.useRef(null),g=l.useMemo(()=>{const f=i.trim().toLowerCase();return f?s.filter(m=>[m.label,m.hint].filter(Boolean).join(" ").toLowerCase().includes(f)):s},[i,s]);l.useEffect(()=>{t&&(r(""),d(0),requestAnimationFrame(()=>p.current?.focus()))},[t]),l.useEffect(()=>{d(f=>Math.min(f,Math.max(0,g.length-1)))},[g.length]),l.useEffect(()=>{h.current?.querySelector(`[data-idx="${o}"]`)?.scrollIntoView({block:"nearest"})},[o]);const k=l.useMemo(()=>{const f=new Map;for(const m of g){const y=f.get(m.group)??[];y.push(m),f.set(m.group,y)}return Gs.map(m=>({group:m,items:f.get(m)??[]})).filter(m=>m.items.length>0)},[g]);if(!t)return null;const v=f=>{f.run(),n()};return e.jsx("div",{className:"cmdk-mask",onMouseDown:n,children:e.jsxs("div",{className:"cmdk",onMouseDown:f=>f.stopPropagation(),children:[e.jsxs("div",{className:"cmdk-head",children:[e.jsx(os,{size:14}),e.jsx("input",{ref:p,placeholder:a("palette.searchPlaceholder"),value:i,onChange:f=>r(f.target.value),onKeyDown:f=>{if(f.key==="ArrowDown")f.preventDefault(),d(m=>Math.min(m+1,g.length-1));else if(f.key==="ArrowUp")f.preventDefault(),d(m=>Math.max(m-1,0));else if(f.key==="Enter"){f.preventDefault();const m=g[o];m&&v(m)}}}),e.jsx("span",{className:"hint",children:e.jsx(G,{keys:["esc"]})})]}),e.jsxs("div",{className:"cmdk-body",ref:h,children:[g.length===0?e.jsx("div",{className:"cmdk-empty",children:a("palette.empty")}):null,k.map(f=>e.jsxs("div",{className:"cmdk-group",children:[e.jsx("div",{className:"cmdk-gh",children:Wt(f.group)}),f.items.map(m=>{const y=g.indexOf(m);return e.jsxs("div",{"data-idx":y,className:"cmdk-row","data-active":y===o,onMouseEnter:()=>d(y),onClick:()=>v(m),children:[e.jsx("span",{className:"ic",children:m.icon}),e.jsx("span",{className:"l",children:m.label}),e.jsx("span",{className:"g",children:Wt(m.group)}),m.shortcut?e.jsx("span",{className:"kb",children:e.jsx(G,{keys:m.shortcut})}):e.jsx("span",{className:"kb-empty"})]},m.id)})]},f.group))]}),e.jsxs("div",{className:"cmdk-foot",children:[e.jsxs("span",{children:[e.jsx(G,{keys:["updown"]}),a("palette.footMove")]}),e.jsxs("span",{children:[e.jsx(G,{keys:["enter"]}),a("palette.footRun")]}),e.jsxs("span",{children:[e.jsx(G,{keys:["esc"]}),a("palette.footClose")]}),e.jsxs("span",{style:{marginLeft:"auto",color:"var(--muted)"},children:[g.length," ",a("palette.countSuffix")]})]})]})})}function Js({message:t}){return t?t.yolo?e.jsxs("div",{className:"toast toast-yolo",children:[e.jsx("span",{className:"toast-yolo-badge",children:"YOLO"}),t.msg]}):e.jsx("div",{className:"toast",children:t.msg}):null}const Ys={plain:{color:"#dde1ea",backgroundColor:"transparent"},styles:[{types:["comment","prolog","doctype","cdata"],style:{color:"#6d6e80",fontStyle:"italic"}},{types:["punctuation"],style:{color:"#a8a9b8"}},{types:["property","tag","boolean","number","constant","symbol","deleted"],style:{color:"#fbbf24"}},{types:["selector","attr-name","string","char","builtin","inserted"],style:{color:"#86dcb1"}},{types:["operator","entity","url"],style:{color:"#84b9e8"}},{types:["atrule","attr-value","keyword"],style:{color:"#b4a8f0"}},{types:["function","class-name","maybe-class-name"],style:{color:"#84b9e8",fontWeight:"500"}},{types:["regex","important","variable"],style:{color:"#f0c062"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["italic"],style:{fontStyle:"italic"}}]},Qs={plain:{color:"#24292e",backgroundColor:"transparent"},styles:[{types:["comment","prolog","doctype","cdata"],style:{color:"#6a737d",fontStyle:"italic"}},{types:["punctuation"],style:{color:"#24292e"}},{types:["property","tag","boolean","number","constant","symbol","deleted"],style:{color:"#d73a49"}},{types:["selector","attr-name","string","char","builtin","inserted"],style:{color:"#032f62"}},{types:["operator","entity","url"],style:{color:"#d73a49"}},{types:["atrule","attr-value","keyword"],style:{color:"#d73a49"}},{types:["function","class-name","maybe-class-name"],style:{color:"#6f42c1",fontWeight:"500"}},{types:["regex","important","variable"],style:{color:"#e36209"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["italic"],style:{fontStyle:"italic"}}]};function Zs(){const[t,n]=l.useState(()=>document.documentElement.dataset.theme==="light"?"light":"dark"),s=l.useRef(t);return l.useEffect(()=>{const i=document.documentElement,r=()=>{const d=i.dataset.theme==="light"?"light":"dark";d!==s.current&&(s.current=d,n(d))},o=new MutationObserver(r);return o.observe(i,{attributes:!0,attributeFilter:["data-theme"]}),()=>o.disconnect()},[]),t==="dark"?Ys:Qs}function Xs({text:t,lang:n,startLine:s=1,showLineNumbers:i=!0}){const r=Zs();return e.jsx(ds,{theme:r,code:t,language:n,children:({className:o,tokens:d,getLineProps:p,getTokenProps:h})=>e.jsx("pre",{className:`codeview ${o}`,children:d.map((g,k)=>e.jsxs("div",{...p({line:g}),className:"codeview-line",children:[i&&e.jsx("span",{className:"codeview-line-num",children:k+s}),e.jsx("span",{className:"codeview-line-content",children:g.map((v,f)=>e.jsx("span",{...h({token:v})},f))})]},k))})})}async function Sn(t,n,s){if(t&&t.trim()){await ve("open_in_editor",{command:t,path:n,line:s??null});return}await mn(n)}const Lt=l.createContext({}),ea=Lt.Provider;function Nn(t,n){if(!n||/^[a-zA-Z]:[\\/]/.test(t)||t.startsWith("/"))return t;const s=n.includes("\\")?"\\":"/";return`${n.replace(/[\\/]$/,"")}${s}${t.replace(/^\.[\\/]/,"")}`}const ta="ts|tsx|mts|cts|js|jsx|mjs|cjs|py|pyi|rs|go|json|jsonc|md|mdx|css|scss|less|html|htm|xml|svg|yaml|yml|toml|sh|bash|zsh|fish|sql|rb|java|kt|swift|c|cpp|cc|cxx|h|hpp|hxx|cs|php|lua|dart|ex|exs|erl|hs|clj|cljs|zig|vue|svelte|graphql|gql|proto",lt=new RegExp(`(^|[\\s\`'"(\\[])((?:[\\w.-]+\\/)+[\\w.-]+\\.(?:${ta}))(?::(\\d+(?:-\\d+)?))?(?=[\\s.,;!?\\]\\)'"\`]|$)`,"g");function na({path:t,line:n}){$();const s=l.useContext(Lt),[i,r]=l.useState(null),o=n?`${t}:${n}`:t,d=async()=>{try{const h=Nn(t,s.dir),g=n?Number.parseInt(n.split("-")[0]??n,10):void 0;await Sn(s.editor,h,Number.isFinite(g)?g:void 0),r("open"),setTimeout(()=>r(null),1200)}catch{try{await navigator.clipboard.writeText(o),r("copy"),setTimeout(()=>r(null),1200)}catch{}}},p=async h=>{h.stopPropagation();try{await navigator.clipboard.writeText(o),r("copy"),setTimeout(()=>r(null),1200)}catch{}};return e.jsxs("span",{className:`file-pill ${i?"done":""}`,role:"button",tabIndex:0,onClick:d,onContextMenu:h=>{h.preventDefault(),p(h)},onKeyDown:h=>{(h.key==="Enter"||h.key===" ")&&(h.preventDefault(),d())},title:a("markdown.filePillTitle"),children:[e.jsx(cs,{size:10,className:"file-pill-icon"}),e.jsx("span",{className:"file-pill-path",children:t}),n&&e.jsxs("span",{className:"file-pill-line",children:[":",n]}),i&&e.jsx(At,{size:10,className:"file-pill-check"})]})}function sa(t){lt.lastIndex=0;const n=[];let s=0,i=lt.exec(t);for(;i!==null;){const r=i[1]??"",o=i[2],d=i[3],p=i.index+r.length;p>s&&n.push(t.slice(s,p)),n.push(e.jsx(na,{path:o,line:d},`fp-${p}`)),s=p+o.length+(d?d.length+1:0),i=lt.exec(t)}return n.length===0?t:(s<t.length&&n.push(t.slice(s)),n)}function Ze(t){return l.Children.map(t,n=>{if(typeof n=="string")return sa(n);if(l.isValidElement(n)){const s=n.props;if(s.children!==void 0)return l.cloneElement(n,void 0,Ze(s.children))}return n})}const Cn=l.memo(function({source:n}){return e.jsx("div",{className:"markdown",children:e.jsx(us,{remarkPlugins:[ms,hs,gs],rehypePlugins:[[ps,{throwOnError:!1}]],components:{pre:({children:s})=>{const i=kt(s).trimEnd();return e.jsx(ra,{lang:ia(s),text:i})},code:({className:s,children:i})=>e.jsx("code",{className:s,children:i}),a:({href:s,children:i})=>e.jsx(aa,{href:s,children:i}),p:({children:s})=>e.jsx("p",{children:Ze(s)}),li:({children:s})=>e.jsx("li",{children:Ze(s)}),td:({children:s})=>e.jsx("td",{children:Ze(s)})},children:n})})});function aa({href:t,children:n}){$();const s=l.useContext(Lt),[i,r]=l.useState(!1),o=!!t&&/^https?:\/\//i.test(t),d=async p=>{if(p.preventDefault(),!!t){if(o){try{await Be(t)}catch{window.open(t,"_blank","noopener,noreferrer")}return}try{const h=t.replace(/^file:\/\//,""),g=Nn(h,s.dir);await Sn(s.editor,g)}catch{try{await navigator.clipboard.writeText(t),r(!0),setTimeout(()=>r(!1),1200)}catch{}}}};return e.jsxs("a",{href:t??"#",onClick:d,className:`md-link ${o?"external":"local"} ${i?"done":""}`,title:o?a("markdown.externalLinkTitle",{href:t??""}):a("markdown.localLinkTitle",{href:t??""}),children:[n,o?e.jsx(ls,{size:10,className:"md-link-icon"}):i?e.jsx(At,{size:10,className:"md-link-icon"}):null]})}function ia(t){for(const n of l.Children.toArray(t))if(l.isValidElement(n)){const s=n.props.className;if(typeof s=="string"){const i=s.match(/language-([\w-]+)/);if(i)return i[1]}}return"text"}function kt(t){return typeof t=="string"||typeof t=="number"?String(t):Array.isArray(t)?t.map(kt).join(""):l.isValidElement(t)?kt(t.props.children):""}function ra({lang:t,text:n}){$();const[s,i]=l.useState(!1),r=async()=>{try{await navigator.clipboard.writeText(n),i(!0),setTimeout(()=>i(!1),1400)}catch{}};return e.jsxs("div",{className:"codeblock",children:[e.jsxs("div",{className:"codeblock-head",children:[e.jsx("span",{className:"codeblock-lang",children:t}),e.jsxs("button",{type:"button",className:`copy-btn ${s?"done":""}`,onClick:r,children:[s?e.jsx(At,{size:11}):e.jsx(Pt,{size:11}),a(s?"markdown.copied":"markdown.copy")]})]}),e.jsx(Xs,{text:n,lang:t})]})}function P({size:t=14,children:n,...s}){return e.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",width:t,height:t,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round",...s,children:n})}const x={plus:t=>e.jsx(P,{...t,children:e.jsx("path",{d:"M12 5v14M5 12h14"})}),search:t=>e.jsxs(P,{...t,children:[e.jsx("circle",{cx:"11",cy:"11",r:"7"}),e.jsx("path",{d:"m20 20-3.5-3.5"})]}),send:t=>e.jsx(P,{...t,children:e.jsx("path",{d:"M4 12 20 4l-6 16-3-7-7-1Z"})}),chev:t=>e.jsx(P,{...t,children:e.jsx("path",{d:"m6 9 6 6 6-6"})}),chevR:t=>e.jsx(P,{...t,children:e.jsx("path",{d:"m9 6 6 6-6 6"})}),check:t=>e.jsx(P,{...t,children:e.jsx("path",{d:"m5 12 5 5L20 7"})}),x:t=>e.jsx(P,{...t,children:e.jsx("path",{d:"M6 6l12 12M18 6 6 18"})}),terminal:t=>e.jsxs(P,{...t,children:[e.jsx("rect",{x:"3",y:"4",width:"18",height:"16",rx:"2"}),e.jsx("path",{d:"m7 9 3 3-3 3M13 15h4"})]}),brain:t=>e.jsxs(P,{...t,children:[e.jsx("path",{d:"M9 4a3 3 0 0 0-3 3v0a3 3 0 0 0-2 5 3 3 0 0 0 2 5 3 3 0 0 0 3 3h0a3 3 0 0 0 3-3V4"}),e.jsx("path",{d:"M15 4a3 3 0 0 1 3 3 3 3 0 0 1 2 5 3 3 0 0 1-2 5 3 3 0 0 1-3 3"})]}),list:t=>e.jsx(P,{...t,children:e.jsx("path",{d:"M4 6h2M4 12h2M4 18h2M9 6h11M9 12h11M9 18h11"})}),diff:t=>e.jsxs(P,{...t,children:[e.jsx("path",{d:"M7 4v11a3 3 0 0 0 3 3h2M17 20V9a3 3 0 0 0-3-3h-2"}),e.jsx("circle",{cx:"7",cy:"20",r:"2"}),e.jsx("circle",{cx:"17",cy:"4",r:"2"})]}),globe:t=>e.jsxs(P,{...t,children:[e.jsx("circle",{cx:"12",cy:"12",r:"9"}),e.jsx("path",{d:"M3 12h18M12 3a14 14 0 0 1 0 18M12 3a14 14 0 0 0 0 18"})]}),link:t=>e.jsxs(P,{...t,children:[e.jsx("path",{d:"M10 14a4 4 0 0 1 0-6l3-3a4 4 0 0 1 6 6l-2 2"}),e.jsx("path",{d:"M14 10a4 4 0 0 1 0 6l-3 3a4 4 0 0 1-6-6l2-2"})]}),wrench:t=>e.jsx(P,{...t,children:e.jsx("path",{d:"M14 7a4 4 0 1 0 4 4l3 3-3 3-3-3a4 4 0 0 1-4-4l-3-3-3 3 3 3a4 4 0 0 0 6 0"})}),bot:t=>e.jsxs(P,{...t,children:[e.jsx("rect",{x:"4",y:"7",width:"16",height:"12",rx:"3"}),e.jsx("path",{d:"M12 3v4M8 12h.01M16 12h.01M9 16h6"})]}),archive:t=>e.jsxs(P,{...t,children:[e.jsx("rect",{x:"3",y:"3",width:"18",height:"5",rx:"1"}),e.jsx("path",{d:"M5 8v11a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1V8M10 12h4"})]}),bookmark:t=>e.jsx(P,{...t,children:e.jsx("path",{d:"M6 3h12v18l-6-4-6 4Z"})}),warning:t=>e.jsxs(P,{...t,children:[e.jsx("path",{d:"M12 3 2 21h20Z"}),e.jsx("path",{d:"M12 10v5M12 18h.01"})]}),zap:t=>e.jsx(P,{...t,children:e.jsx("path",{d:"M13 3 4 14h7l-1 7 9-11h-7Z"})}),database:t=>e.jsxs(P,{...t,children:[e.jsx("ellipse",{cx:"12",cy:"5",rx:"8",ry:"3"}),e.jsx("path",{d:"M4 5v6c0 1.7 3.6 3 8 3s8-1.3 8-3V5M4 11v6c0 1.7 3.6 3 8 3s8-1.3 8-3v-6"})]}),cpu:t=>e.jsxs(P,{...t,children:[e.jsx("rect",{x:"5",y:"5",width:"14",height:"14",rx:"2"}),e.jsx("rect",{x:"9",y:"9",width:"6",height:"6"}),e.jsx("path",{d:"M9 2v3M15 2v3M9 19v3M15 19v3M2 9h3M2 15h3M19 9h3M19 15h3"})]}),coin:t=>e.jsxs(P,{...t,children:[e.jsx("circle",{cx:"12",cy:"12",r:"9"}),e.jsx("path",{d:"M12 7v10M9 10h4a2 2 0 0 1 0 4H9"})]}),file:t=>e.jsxs(P,{...t,children:[e.jsx("path",{d:"M14 3H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9Z"}),e.jsx("path",{d:"M14 3v6h6"})]}),folder:t=>e.jsx(P,{...t,children:e.jsx("path",{d:"M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2Z"})}),image:t=>e.jsxs(P,{...t,children:[e.jsx("rect",{x:"3",y:"4",width:"18",height:"16",rx:"2"}),e.jsx("circle",{cx:"9",cy:"10",r:"2"}),e.jsx("path",{d:"m3 18 5-5 4 4 3-3 6 6"})]}),paperclip:t=>e.jsx(P,{...t,children:e.jsx("path",{d:"M21 12 12 21a5 5 0 0 1-7-7L14 5a3 3 0 0 1 4 4l-9 9a1 1 0 0 1-2-2l8-8"})}),mic:t=>e.jsxs(P,{...t,children:[e.jsx("rect",{x:"9",y:"3",width:"6",height:"12",rx:"3"}),e.jsx("path",{d:"M5 11a7 7 0 0 0 14 0M12 18v3M9 21h6"})]}),sun:t=>e.jsxs(P,{...t,children:[e.jsx("circle",{cx:"12",cy:"12",r:"4"}),e.jsx("path",{d:"M12 2v2M12 20v2M2 12h2M20 12h2M5 5l1.5 1.5M17.5 17.5 19 19M5 19l1.5-1.5M17.5 6.5 19 5"})]}),moon:t=>e.jsx(P,{...t,children:e.jsx("path",{d:"M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8Z"})}),panel_l:t=>e.jsxs(P,{...t,children:[e.jsx("rect",{x:"3",y:"4",width:"18",height:"16",rx:"2"}),e.jsx("path",{d:"M9 4v16"})]}),panel_r:t=>e.jsxs(P,{...t,children:[e.jsx("rect",{x:"3",y:"4",width:"18",height:"16",rx:"2"}),e.jsx("path",{d:"M15 4v16"})]}),cog:t=>e.jsxs(P,{...t,children:[e.jsx("path",{d:"M12 3.6 19.2 7.8v8.4L12 20.4 4.8 16.2V7.8Z"}),e.jsx("circle",{cx:"12",cy:"12",r:"3.7"})]}),stop:t=>e.jsx(P,{...t,children:e.jsx("rect",{x:"6",y:"6",width:"12",height:"12",rx:"2"})}),play:t=>e.jsx(P,{...t,children:e.jsx("path",{d:"M7 5v14l12-7Z"})}),more:t=>e.jsxs(P,{...t,children:[e.jsx("circle",{cx:"6",cy:"12",r:"1.6",fill:"currentColor"}),e.jsx("circle",{cx:"12",cy:"12",r:"1.6",fill:"currentColor"}),e.jsx("circle",{cx:"18",cy:"12",r:"1.6",fill:"currentColor"})]}),pin:t=>e.jsx(P,{...t,children:e.jsx("path",{d:"M15 3 9 9l-4 1 9 9 1-4 6-6ZM4 20l5-5"})}),rotate:t=>e.jsxs(P,{...t,children:[e.jsx("path",{d:"M3 12a9 9 0 1 0 3-6.7L3 8"}),e.jsx("path",{d:"M3 3v5h5"})]}),branch:t=>e.jsxs(P,{...t,children:[e.jsx("circle",{cx:"6",cy:"4",r:"2"}),e.jsx("circle",{cx:"6",cy:"20",r:"2"}),e.jsx("circle",{cx:"18",cy:"8",r:"2"}),e.jsx("path",{d:"M6 6v12M6 14a6 6 0 0 0 6-6h4"})]}),at:t=>e.jsxs(P,{...t,children:[e.jsx("circle",{cx:"12",cy:"12",r:"4"}),e.jsx("path",{d:"M16 8v6a3 3 0 0 0 5-2 9 9 0 1 0-4 7"})]}),slash:t=>e.jsx(P,{...t,children:e.jsx("path",{d:"M16 4 8 20"})}),layers:t=>e.jsxs(P,{...t,children:[e.jsx("path",{d:"m12 3 9 5-9 5-9-5Z"}),e.jsx("path",{d:"m3 13 9 5 9-5M3 18l9 5 9-5"})]}),download:t=>e.jsx(P,{...t,children:e.jsx("path",{d:"M12 4v12M6 12l6 6 6-6M4 20h16"})}),upload:t=>e.jsx(P,{...t,children:e.jsx("path",{d:"M12 20V8M6 12l6-6 6 6M4 4h16"})}),history:t=>e.jsx(P,{...t,children:e.jsx("path",{d:"M3 12a9 9 0 1 0 3-6.7L3 8M12 7v5l3 2"})}),shield:t=>e.jsxs(P,{...t,children:[e.jsx("path",{d:"M12 3 4 6v6c0 5 3.5 8 8 9 4.5-1 8-4 8-9V6Z"}),e.jsx("path",{d:"m9 12 2 2 4-4"})]}),warn:t=>e.jsxs(P,{...t,children:[e.jsx("path",{d:"M12 3 2 21h20Z"}),e.jsx("path",{d:"M12 10v5M12 18h.01"})]}),help:t=>e.jsxs(P,{...t,children:[e.jsx("circle",{cx:"12",cy:"12",r:"9"}),e.jsx("path",{d:"M9.5 9a2.5 2.5 0 0 1 5 0c0 1.5-2.5 2-2.5 4M12 17h.01"})]}),refresh:t=>e.jsx(P,{...t,children:e.jsx("path",{d:"M3 12a9 9 0 0 1 15-6.7L21 8M21 4v4h-4M21 12a9 9 0 0 1-15 6.7L3 16M3 20v-4h4"})}),copy:t=>e.jsxs(P,{...t,children:[e.jsx("rect",{x:"8",y:"8",width:"12",height:"12",rx:"2"}),e.jsx("path",{d:"M4 16V6a2 2 0 0 1 2-2h10"})]})},se={DARK:"dark",LIGHT:"light"};function wt(t){return t===se.DARK||t===se.LIGHT}const me={GRAPHITE:"graphite",SANDSTONE:"sandstone",PORCELAIN:"porcelain",MIDNIGHT:"midnight"},oa={dark:me.GRAPHITE,light:me.SANDSTONE},la={graphite:se.DARK,sandstone:se.LIGHT,porcelain:se.LIGHT,midnight:se.DARK},Tn=[me.GRAPHITE,me.SANDSTONE,me.PORCELAIN,me.MIDNIGHT];function vt(t){return t===me.GRAPHITE||t===me.SANDSTONE||t===me.PORCELAIN||t===me.MIDNIGHT}function He(t){return la[t]}function jt(t){return oa[t]}const ue={SMALL:"small",MEDIUM:"medium",LARGE:"large"};function ca(t){return t===ue.SMALL||t===ue.MEDIUM||t===ue.LARGE}const da={small:.875,medium:1,large:1.125},pe={SANS:"sans",SYSTEM:"system",SERIF:"serif"};function ua(t){return t===pe.SANS||t===pe.SYSTEM||t===pe.SERIF}const pa={sans:'"Geist", system-ui, sans-serif',system:'-apple-system, system-ui, "Segoe UI", Roboto, sans-serif',serif:'Georgia, "Times New Roman", serif'},An="session";function ma(){if(typeof window>"u")return null;const t=new URLSearchParams(window.location.search).get(An);if(!t)return null;const n=t.trim();return n.length>0?n:null}function ha(t){if(typeof window>"u")return;const n=new URL(window.location.href);n.searchParams.delete(An),n.href!==window.location.href&&window.history.replaceState(null,"",n.href)}function ga(t){const n=t/1e3;return n<10?`${n.toFixed(1)}s`:`${Math.floor(n)}s`}function fa(t,n){const[s,i]=l.useState(0),r=l.useRef(null);return l.useEffect(()=>{if(!t){i(0),r.current=null;return}r.current=performance.now();const o=setInterval(()=>{r.current!==null&&i(performance.now()-r.current)},80);return()=>clearInterval(o)},[t,n]),s}const ba=["low","medium","high","max"],xa=[{k:"plan",label:"editMode.plan",icon:e.jsx(x.list,{size:11}),hint:"editMode.planHint"},{k:"review",label:"editMode.review",icon:e.jsx(x.shield,{size:11}),hint:"editMode.reviewHint"},{k:"auto",label:"editMode.auto",icon:e.jsx(x.zap,{size:11}),hint:"editMode.autoHint"},{k:"yolo",label:"editMode.yolo",icon:e.jsx(x.warn,{size:11}),hint:"editMode.yoloHint"}];function Gt({mode:t,onChange:n}){return e.jsx("div",{className:"mode-switch","data-mode":t,children:xa.map(s=>e.jsxs("button",{type:"button",className:"ms-seg","data-on":t===s.k,"data-k":s.k,onClick:()=>n(s.k),title:a(s.hint),children:[s.icon,e.jsx("span",{children:a(s.label)})]},s.k))})}function ya(t){return{"/clear":e.jsx(x.x,{size:12}),"/new":e.jsx(x.plus,{size:12}),"/abort":e.jsx(x.stop,{size:12}),"/copy":e.jsx(x.layers,{size:12}),"/export":e.jsx(x.download,{size:12}),"/model":e.jsx(x.cpu,{size:12}),"/theme":e.jsx(x.sun,{size:12}),"/lang":e.jsx(x.globe,{size:12})}[t]||e.jsx(x.slash,{size:12})}function ct(t){const n=t.replace(/\\/g,"/"),s=n.endsWith("/"),i=n.lastIndexOf("/");if(i<0)return null;const r=s?n.slice(0,-1):n.slice(0,i);if(!r)return null;const o=r.lastIndexOf("/");return o>=0?`${r.slice(0,o)}/`:""}function ka(t){return t==="file"?e.jsx(x.file,{size:12}):t==="dir"?e.jsx(x.folder,{size:12}):t==="url"?e.jsx(x.globe,{size:12}):t==="agent"?e.jsx(x.bot,{size:12}):t==="clip"?e.jsx(x.layers,{size:12}):e.jsx(x.at,{size:12})}function wa({draft:t,setDraft:n,onSend:s,onAbort:i,disabled:r,busy:o,busyLabel:d,busyElapsedMs:p,modelLabel:h,reasoningEffort:g,onModelChange:k,onEffortChange:v,editMode:f,onEditModeChange:m,textareaRef:y,slashCommands:j,onMentionQuery:I,onMentionPreview:q,onMentionPicked:X,mentionResults:R,workspaceDir:L,queuedSends:K,onQueueWhileBusy:F,onDequeueSend:J}){const[ee,E]=l.useState([]),[u,z]=l.useState(null),[le,ne]=l.useState(0),[he,Z]=l.useState(!1),ce=l.useRef(0),ge=l.useRef(null),S=l.useRef(!1),C=l.useRef(0),H=l.useRef(t);l.useEffect(()=>{const w=H.current;H.current=t,t==="/"&&w!=="/"&&z({kind:"slash",query:""})},[t]),l.useEffect(()=>{if(!he)return;const w=T=>{ge.current&&!ge.current.contains(T.target)&&Z(!1)};return window.addEventListener("mousedown",w),()=>window.removeEventListener("mousedown",w)},[he]);const te=async w=>{try{const T=await Et({multiple:!1,directory:!1,defaultPath:L,filters:w==="image"?[{name:a("composer.imageFilterName"),extensions:["png","jpg","jpeg","gif","webp","svg"]}]:void 0});if(typeof T!="string"||!T)return;const O=L&&T.startsWith(L)?T.slice(L.length).replace(/^[\\/]+/,""):T;n(t?`${t.replace(/\s+$/,"")} @${O} `:`@${O} `),E(ie=>[...ie,{kind:"at",label:O}]),X?.(O),y.current?.focus()}catch(T){console.error("attach failed",T)}},re=l.useMemo(()=>{if(!u||u.kind!=="slash")return[];const w=u.query.toLowerCase();return w?j.filter(T=>T.cmd.toLowerCase().includes(w)):j},[u,j]),fe=l.useMemo(()=>{if(!u||u.kind!=="at")return[];if(!R||R.nonce!==u.nonce)return[];const w=R.results.map(O=>({name:O,kind:O.endsWith("/")||O.endsWith("\\")?"dir":"file",desc:O})),T=ct(u.query);return T!==null&&w.unshift({name:"..",kind:"dir",desc:T?`↑ ${T}`:`↑ ${a("composer.workspaceRoot")}`}),w},[u,R]),W=u?.kind==="slash"?re:u?.kind==="at"?fe:[];l.useEffect(()=>{ne(0)},[W.length,u?.kind]),l.useEffect(()=>{!u||u.kind!=="at"||!I||I(u.query,u.nonce)},[u,I]);const Y=w=>{const T=w.target.value;n(T);const O=T.match(/(^|\s)([/@])([^\s]*)$/);if(O){const ie=O[2],V=O[3]??"";if(ie==="/")z({kind:"slash",query:V});else{const oe=++ce.current;z({kind:"at",query:V,nonce:oe})}}else u&&z(null)},B=()=>z(null),Q=w=>{const T=W[w];if(!(!T||!u)){if(u.kind==="slash"){const O=T.cmd;if(T.insertOnly===!0){const V=t.replace(/[/@][^\s]*$/,"").trimEnd();n(V?`${V} ${O} `:`${O} `),E(oe=>[...oe,{kind:"slash",label:O.replace(/^\//,"")}])}else{const V=t.replace(/[/@][^\s]*$/,"").trimEnd();n(V),E(oe=>[...oe,{kind:"slash",label:O.replace(/^\//,"")}]),T.run()}}else{const O=T;if(O.name===".."){const V=ct(u.query)??"",oe=t.replace(/[@][^\s]*$/,`@${V}`);n(oe);const Ae=++ce.current;z({kind:"at",query:V,nonce:Ae}),y.current?.focus();return}const ie=t.replace(/[/@][^\s]*$/,"").trimEnd();n(ie?`${ie} @${O.name} `:`@${O.name} `),E(V=>[...V,{kind:"at",label:O.name}]),X?.(O.name)}z(null),y.current?.focus()}},be=w=>{if(u){if(w.key==="ArrowDown"){w.preventDefault(),ne(T=>W.length?(T+1)%W.length:0);return}if(w.key==="ArrowUp"){w.preventDefault(),ne(T=>W.length?(T-1+W.length)%W.length:0);return}if(w.key==="Escape"){w.preventDefault(),B();return}if(w.key==="Tab"&&u.kind==="at"&&W.length>0){const T=W[le];if(T&&T.kind==="dir"){w.preventDefault();const O=T;if(O.name===".."){const Ae=ct(u.query)??"",Ie=t.replace(/[@][^\s]*$/,`@${Ae}`);n(Ie);const de=++ce.current;z({kind:"at",query:Ae,nonce:de});return}const ie=O.name.replace(/\/+$/,""),V=t.replace(/[@][^\s]*$/,`@${ie}/`);n(V);const oe=++ce.current;z({kind:"at",query:`${ie}/`,nonce:oe});return}}if(w.key==="Enter"){if(W.length>0){w.preventDefault(),Q(le);return}B()}}if(!(S.current||Date.now()-C.current<50)&&w.key==="Enter"&&!w.shiftKey&&!u)if(w.preventDefault(),o){const T=t.trim();T&&F&&(F(T),E([]))}else!r&&t.trim()&&(s(),E([]))};return e.jsx("div",{className:"composer-wrap",children:e.jsxs("div",{className:"composer-inner",children:[K&&K.length>0?e.jsxs("div",{className:"composer-queued",children:[e.jsx("span",{className:"composer-queued-label",children:a("composer.queueCount",{count:K.length})}),K.map((w,T)=>e.jsxs("span",{className:"composer-queue-chip",title:w,children:[e.jsx("span",{className:"text",children:w}),J?e.jsx("span",{className:"x",onClick:()=>J(T),children:e.jsx(x.x,{size:10})}):null]},T))]}):null,e.jsx("div",{className:"hint-row",children:o&&d?e.jsxs(e.Fragment,{children:[e.jsxs("span",{className:"composer-busy-status",children:[e.jsx("span",{className:"composer-busy-pip"}),e.jsx("span",{className:"composer-busy-label",children:d}),e.jsx("span",{className:"composer-busy-time",children:ga(p??0)})]}),e.jsx("span",{className:"grow"}),e.jsx(Gt,{mode:f,onChange:m}),e.jsx("span",{className:"hint-sep"}),e.jsxs("span",{children:[e.jsx(G,{keys:["enter"]})," ",a("composer.queue"),"  · "," ",e.jsx(G,{keys:["esc"]})," ",a("composer.interrupt")]})]}):e.jsxs(e.Fragment,{children:[e.jsxs("span",{children:[e.jsx(G,{keys:["/"]})," ",a("composer.commands"),"  · "," ",e.jsx(G,{keys:["@"]})," ",a("composer.mentionFiles")," ·  ",e.jsx(G,{keys:["mod","K"]})," ",a("composer.commandPalette")]}),e.jsx("span",{className:"grow"}),e.jsx(Gt,{mode:f,onChange:m}),e.jsx("span",{className:"hint-sep"}),e.jsxs("span",{children:[e.jsx(G,{keys:["enter"]})," ",a("composer.send"),"  "," ",e.jsx(G,{keys:["shift","enter"]})," ",a("composer.newline")]})]})}),e.jsxs("div",{className:"composer",children:[ee.length>0?e.jsx("div",{className:"composer-tags",children:ee.map((w,T)=>e.jsxs("span",{className:`chip ${w.kind}`,children:[w.kind==="slash"?e.jsx(x.slash,{size:11}):e.jsx(x.at,{size:11}),e.jsx("span",{children:w.label}),e.jsx("span",{className:"x",onClick:()=>E(O=>O.filter((ie,V)=>V!==T)),children:e.jsx(x.x,{size:10})})]},T))}):null,e.jsx("textarea",{ref:y,value:t,placeholder:a("composer.placeholder"),onChange:Y,onKeyDown:be,onCompositionStart:()=>{S.current=!0},onCompositionEnd:()=>{S.current=!1,C.current=Date.now()},rows:2,disabled:r}),e.jsxs("div",{className:"composer-foot",children:[e.jsx("button",{type:"button",className:"cf-btn",title:a("composer.insertFile"),onClick:()=>void te(),children:e.jsx("span",{className:"ico",children:e.jsx(x.paperclip,{size:14})})}),e.jsx("button",{type:"button",className:"cf-btn",title:a("composer.insertImage"),onClick:()=>void te("image"),children:e.jsx("span",{className:"ico",children:e.jsx(x.image,{size:14})})}),e.jsxs("button",{type:"button",className:"cf-btn",onClick:()=>z({kind:"slash",query:""}),children:[e.jsx("span",{className:"ico",children:e.jsx(x.slash,{size:14})}),e.jsx("span",{className:"label",children:a("composer.commandsLabel")})]}),e.jsxs("button",{type:"button",className:"cf-btn",onClick:()=>{const w=++ce.current;z({kind:"at",query:"",nonce:w})},children:[e.jsx("span",{className:"ico",children:e.jsx(x.at,{size:14})}),e.jsx("span",{className:"label",children:a("composer.mentionLabel")})]}),e.jsx("span",{className:"grow"}),e.jsxs("div",{ref:ge,style:{position:"relative"},children:[e.jsxs("button",{type:"button",className:"model-pill",onClick:()=>Z(w=>!w),title:a("composer.switchModel"),children:[e.jsx(x.brain,{size:12}),e.jsx("span",{children:h}),e.jsx("span",{className:"badge",children:g}),e.jsx(x.chev,{size:10})]}),he?e.jsx(Sa,{modelLabel:h,currentEffort:g,onPickModel:w=>{k(w),Z(!1)},onPickEffort:w=>{v(w),Z(!1)}}):null]}),o?e.jsx("button",{type:"button",className:"send-btn",style:{background:"var(--danger)"},onClick:i,title:a("composer.interrupt"),children:e.jsx(x.stop,{size:14})}):e.jsx("button",{type:"button",className:"send-btn",disabled:r||!t.trim(),onClick:()=>{!r&&t.trim()&&(s(),E([]))},children:e.jsx(x.send,{size:14})})]}),u?e.jsx(va,{kind:u.kind,items:W,activeIdx:le,onPick:w=>Q(w),onClose:B,onHover:(w,T)=>{if(ne(w),u.kind==="at"&&q){const O=T.name;q(O,u.nonce)}}}):null]})]})})}function va({kind:t,items:n,activeIdx:s,onPick:i,onClose:r,onHover:o}){const d=l.useRef(null);return l.useEffect(()=>{requestAnimationFrame(()=>{d.current?.querySelector('[data-active="true"]')?.scrollIntoView({block:"nearest"})})},[s]),e.jsxs("div",{className:"popup",onMouseDown:p=>p.preventDefault(),children:[e.jsxs("div",{className:"ph",children:[e.jsx("span",{className:"tok",children:t==="slash"?"/":"@"}),e.jsx("span",{children:a(t==="slash"?"composer.slashHeader":"composer.atHeader")}),e.jsx("span",{className:"grow"}),e.jsx("span",{style:{cursor:"pointer"},onClick:r,children:e.jsx(x.x,{size:11})})]}),e.jsxs("div",{className:"popup-list",ref:d,children:[n.length===0?e.jsx("div",{style:{padding:"12px 8px",fontSize:11.5,color:"var(--muted-2)",fontFamily:"Geist Mono, monospace"},children:a("composer.noMatches")}):null,n.map((p,h)=>e.jsxs("div",{className:"popup-item","data-active":h===s,onClick:()=>i(h),onMouseEnter:()=>o(h,p),children:[e.jsx("span",{className:"ico",children:t==="slash"?ya(p.cmd):ka(p.kind)}),e.jsx("div",{className:"nm",children:t==="slash"?e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"cmd",children:p.cmd}),e.jsx("span",{className:"desc",children:p.desc})]}):e.jsxs(e.Fragment,{children:[e.jsx("span",{children:p.name}),p.desc?e.jsx("div",{className:"desc",children:p.desc}):null]})}),e.jsx("span",{className:"kb",children:t==="slash"?p.kb??"":""})]},h))]}),e.jsxs("div",{className:"popup-foot",children:[e.jsxs("span",{children:[e.jsx(G,{keys:["updown"]})," ",a("composer.select")]}),e.jsxs("span",{children:[e.jsx(G,{keys:["enter"]})," ",a("composer.confirm")]}),e.jsxs("span",{children:[e.jsx(G,{keys:["esc"]})," ",a("composer.close")]})]})]})}const ja=["deepseek-v4-flash","deepseek-v4-pro"];function Sa({modelLabel:t,currentEffort:n,onPickModel:s,onPickEffort:i}){const[r,o]=l.useState(t);return e.jsxs("div",{className:"popup",style:{bottom:"calc(100% + 6px)",left:"auto",right:0,width:280,position:"absolute"},children:[e.jsxs("div",{className:"ph",children:[e.jsx("span",{className:"tok",children:"M"}),e.jsx("span",{children:a("composer.switchModel")})]}),e.jsxs("div",{className:"popup-list",children:[ja.map(d=>e.jsxs("div",{className:"popup-item","data-active":d===t,onClick:()=>s(d),children:[e.jsx("span",{className:"ico",children:e.jsx(x.brain,{size:12})}),e.jsx("div",{className:"nm",children:e.jsx("span",{className:"cmd",children:d})})]},d)),e.jsxs("div",{style:{padding:"6px 8px",display:"flex",gap:6},children:[e.jsx("input",{className:"field mono",style:{flex:1},value:r,onChange:d=>o(d.target.value),placeholder:"custom model id"}),e.jsx("button",{type:"button",className:"btn",disabled:!r.trim()||r.trim()===t,onClick:()=>s(r.trim()),children:a("composer.confirm")})]})]}),e.jsxs("div",{className:"ph",style:{marginTop:4},children:[e.jsx("span",{className:"tok",children:"E"}),e.jsx("span",{children:a("composer.switchEffort")})]}),e.jsx("div",{className:"popup-list",children:ba.map(d=>e.jsxs("div",{className:"popup-item","data-active":d===n,onClick:()=>i(d),children:[e.jsx("span",{className:"ico",children:e.jsx(x.cpu,{size:12})}),e.jsxs("div",{className:"nm",children:[e.jsx("span",{className:"cmd",children:d}),e.jsx("div",{className:"desc",children:a(`effort.${d}Desc`)})]})]},d))})]})}class Na extends l.Component{state={error:null};static getDerivedStateFromError(n){return{error:n}}componentDidCatch(n,s){console.error(`[panel:${this.props.label}] render error`,n,s)}render(){return this.state.error?e.jsxs("div",{className:"ctx-empty",style:{color:"var(--danger, #e25555)",padding:12,fontSize:12,whiteSpace:"pre-wrap",wordBreak:"break-word"},children:[a("panel.renderError",{panel:this.props.label}),": ",this.state.error.message]}):this.props.children}}const qe=1e6;function Ca({settings:t,usage:n,mcpSpecs:s,mcpBridged:i,sessionFiles:r,memory:o,memoryDetail:d,onReadMemory:p}){$();const[h,g]=l.useState("files"),k=n.reservedTokens,v=Math.max(0,n.cacheHitTokens-k),f=Math.max(0,n.cacheMissTokens-Math.max(0,k-n.cacheHitTokens)),m=Math.min(100,k/qe*100),y=Math.min(100,f/qe*100),j=Math.min(100,v/qe*100),I=Math.max(0,qe-k-f-v);return e.jsxs("aside",{className:"ctx",children:[e.jsxs("div",{className:"ctx-tabs",children:[e.jsx("div",{className:"ctx-tab","data-active":h==="files",onClick:()=>g("files"),children:a("contextPanel.filesTab")}),e.jsx("div",{className:"ctx-tab","data-active":h==="tools",onClick:()=>g("tools"),children:a("contextPanel.toolsTab")}),e.jsx("div",{className:"ctx-tab","data-active":h==="memory",onClick:()=>g("memory"),children:a("contextPanel.memoryTab")}),e.jsx("div",{className:"ctx-tab","data-active":h==="rules",onClick:()=>g("rules"),children:a("contextPanel.rulesTab")})]}),e.jsxs("div",{className:"ctx-body",children:[e.jsxs("div",{className:"ctx-block",children:[e.jsxs("div",{className:"h",children:[e.jsx("span",{children:a("contextPanel.contextTokens")}),e.jsxs("span",{className:"right",children:[(k+f+v).toLocaleString()," /"," ",qe.toLocaleString()]})]}),e.jsxs("div",{className:"meter",children:[e.jsx("span",{className:"rsvd",style:{width:`${m}%`}}),e.jsx("span",{className:"cached",style:{width:`${j}%`}}),e.jsx("span",{className:"used",style:{width:`${y}%`}})]}),e.jsxs("div",{className:"legend",children:[e.jsxs("span",{className:"l",children:[e.jsx("span",{className:"sw r"}),a("contextPanel.reservedKey")," ",e.jsx("span",{className:"v",children:k.toLocaleString()})]}),e.jsxs("span",{className:"l",children:[e.jsx("span",{className:"sw c"}),a("contextPanel.cacheKey")," ",e.jsx("span",{className:"v",children:v.toLocaleString()})]}),e.jsxs("span",{className:"l",children:[e.jsx("span",{className:"sw u"}),a("contextPanel.usedKey")," ",e.jsx("span",{className:"v",children:f.toLocaleString()})]}),e.jsxs("span",{className:"l",children:[a("contextPanel.freeKey")," ",e.jsx("span",{className:"v",children:I.toLocaleString()})]})]})]}),e.jsxs(Na,{label:h,children:[h==="files"&&e.jsx(Aa,{files:r}),h==="tools"&&e.jsx(Pa,{specs:s,bridged:i}),h==="memory"&&e.jsx(Ma,{entries:o,detail:d,onRead:p}),h==="rules"&&e.jsx(Ea,{settings:t})]},h)]})]})}function Ta(t){const n=[...t].sort((r,o)=>r.path.replace(/\\/g,"/").localeCompare(o.path.replace(/\\/g,"/"))),s=[],i=new Set;for(const r of n){const o=r.path.replace(/\\/g,"/").split("/").filter(Boolean);if(o.length===0)continue;let d="";for(let h=0;h<o.length-1;h++){const g=o[h]??"";d=d?`${d}/${g}`:g,i.has(d)||(i.add(d),s.push({kind:"dir",depth:h,name:g,key:`d:${d}`}))}const p=o[o.length-1]??"";s.push({kind:"file",depth:o.length-1,name:p,key:`f:${r.path}`,status:r.status})}return s}function Aa({files:t}){const n=l.useMemo(()=>Ta(t),[t]);return e.jsxs("div",{className:"ctx-block",children:[e.jsxs("div",{className:"h",children:[e.jsx("span",{children:a("contextPanel.filesTitle")}),e.jsx("span",{className:"right",children:t.length===0?"—":a("contextPanel.filesCount",{count:t.length})})]}),e.jsx("div",{className:"tree",children:t.length===0?e.jsx("div",{className:"ctx-empty",children:a("contextPanel.noFilesMsg")}):n.map(s=>s.kind==="dir"?e.jsxs("div",{className:"node","data-d":s.depth,"data-kind":"dir",children:[e.jsx("span",{className:"ico",children:e.jsx(x.folder,{size:12})}),e.jsxs("span",{className:"nm",children:[s.name,"/"]})]},s.key):e.jsxs("div",{className:"node","data-d":s.depth,"data-kind":"file",title:s.name,children:[e.jsx("span",{className:"ico",children:e.jsx(x.file,{size:12})}),e.jsx("span",{className:"nm",children:s.name}),e.jsx("span",{className:"dot","data-s":s.status,title:s.status==="m"?a("contextPanel.fileModified"):a("contextPanel.fileInContext")})]},s.key))})]})}function Pa({specs:t,bridged:n}){const s=t.filter(i=>i.status==="connected").length;return e.jsxs("div",{className:"ctx-block",children:[e.jsxs("div",{className:"h",children:[e.jsx("span",{children:a("contextPanel.mcpTitle")}),e.jsx("span",{className:"right",children:t.length===0?"—":n?a("contextPanel.mcpReadyAll",{count:t.length}):a("contextPanel.mcpReadySome",{ready:s,count:t.length})})]}),t.length===0?e.jsx("div",{className:"ctx-empty",children:a("contextPanel.mcpEmpty")}):t.map(i=>{const r=i.status==="connected"?"ok":i.status==="failed"||i.parseError?"off":"pending",o=i.statusReason?` · ${i.statusReason}`:i.status==="connected"?typeof i.toolCount=="number"?` · ${a("contextPanel.mcpTools",{count:i.toolCount})}`:` · ${a("contextPanel.mcpReady")}`:i.status==="handshake"?` · ${a("contextPanel.mcpConnecting")}`:i.status==="disabled"?` · ${a("contextPanel.mcpDisabled")}`:i.status==="failed"?` · ${a("contextPanel.mcpFailed")}`:` · ${a("contextPanel.mcpConfigured")}`;return e.jsxs("div",{className:"mcp-row",children:[e.jsx("span",{className:"ico",children:e.jsx(x.wrench,{size:12})}),e.jsxs("div",{className:"body",children:[e.jsx("div",{className:"n",children:i.name??i.summary}),e.jsxs("div",{className:"m",children:[i.transport,o]})]}),e.jsx("span",{className:"status","data-s":r})]},i.raw)})]})}function Ma({entries:t,detail:n,onRead:s}){return e.jsxs("div",{className:"ctx-block",children:[e.jsxs("div",{className:"h",children:[e.jsx("span",{children:a("contextPanel.memoryTitle")}),e.jsx("span",{className:"right",children:t.length===0?"—":a("contextPanel.itemCount",{count:t.length})})]}),t.length===0?e.jsx("div",{className:"ctx-empty",children:a("contextPanel.noMemoriesMsg")}):e.jsxs("div",{className:"mem",children:[t.map(i=>e.jsxs("button",{type:"button",className:"mem-row","data-active":n?.path===i.path,onClick:()=>s(i.path),children:[e.jsx("span",{className:"scope","data-s":i.scope,children:i.scope==="project"?a("contextPanel.scopeProject"):a("contextPanel.scopeGlobal")}),e.jsx("span",{className:"txt",children:i.description||i.name})]},i.path)),n?e.jsx("pre",{className:"mem-detail",children:n.body}):null]})]})}function Ea({settings:t}){const n=t?.editMode??"review",s=n==="yolo"?[{p:"*",allow:!0,desc:a("contextPanel.ruleYolo")}]:n==="auto"?[{p:"read_file, list_directory, search_files, *",allow:!0,desc:a("contextPanel.ruleReadOnly")},{p:"run_command (allowlist)",allow:!0,desc:a("contextPanel.ruleShellAllowlist")},{p:"edit_file, write_file, run_command (other)",allow:!1,desc:a("contextPanel.ruleWritesAsk")}]:[{p:"*",allow:!1,desc:a("contextPanel.ruleReview")}];return e.jsxs("div",{className:"ctx-block",children:[e.jsxs("div",{className:"h",children:[e.jsx("span",{children:a("contextPanel.autoApproveTitle")}),e.jsx("span",{className:"right",children:n})]}),s.map(i=>e.jsxs("div",{className:"rule",children:[e.jsxs("div",{className:"top",children:[e.jsx("span",{className:`pat ${i.allow?"":"deny"}`,children:i.p}),e.jsx("span",{className:`sw ${i.allow?"":"deny"}`,children:i.allow?a("contextPanel.allow"):a("contextPanel.ask")})]}),e.jsx("div",{className:"desc",children:i.desc})]},i.p))]})}function Da({open:t,onClose:n,jobs:s,onStop:i,onStopAll:r}){$();const[o,d]=l.useState(0);l.useEffect(()=>{if(!t)return;const g=window.setInterval(()=>d(k=>k+1),600);return()=>window.clearInterval(g)},[t]),l.useEffect(()=>{if(!t)return;const g=k=>{k.key==="Escape"&&(k.preventDefault(),n())};return window.addEventListener("keydown",g),()=>window.removeEventListener("keydown",g)},[t,n]);const p=l.useMemo(()=>s.filter(g=>g.running),[s]),h=l.useMemo(()=>s.filter(g=>!g.running),[s]);return t?e.jsx("div",{className:"jobs-mask",onClick:n,children:e.jsxs("div",{className:"jobs-pop",onClick:g=>g.stopPropagation(),children:[e.jsxs("div",{className:"jobs-head",children:[e.jsx("span",{className:"ico",children:e.jsx(x.cpu,{size:13})}),e.jsxs("div",{children:[e.jsx("div",{className:"tt",children:a("jobs.title")}),e.jsxs("div",{className:"ss",children:[e.jsx("span",{className:"b ok",children:p.length})," ",a("jobs.running")," ·"," ",e.jsx("span",{className:"b mut",children:h.length})," ",a("jobs.exited")]})]}),e.jsx("span",{className:"grow"}),p.length>0?e.jsxs("button",{type:"button",className:"btn danger sm",onClick:r,title:a("jobs.stopAllTip"),children:[e.jsx(x.stop,{size:10})," ",a("jobs.stopAll")]}):null]}),e.jsx("div",{className:"jobs-body",children:s.length===0?e.jsx("div",{className:"jobs-empty",children:a("jobs.empty")}):e.jsxs(e.Fragment,{children:[p.length>0?e.jsx("div",{className:"jobs-grp",children:a("jobs.running")}):null,p.map(g=>e.jsx(Jt,{job:g,tick:o,onStop:i},g.id)),h.length>0?e.jsx("div",{className:"jobs-grp",children:a("jobs.exited")}):null,h.map(g=>e.jsx(Jt,{job:g,tick:o,onStop:i},g.id))]})}),e.jsx("div",{className:"jobs-foot",children:e.jsxs("div",{className:"row",children:[e.jsx(x.zap,{size:11}),e.jsxs("span",{children:[a("jobs.running")," ",e.jsx("span",{className:"v",children:p.length})]}),e.jsx("span",{children:"·"}),e.jsxs("span",{children:[a("jobs.exited")," ",e.jsx("span",{className:"v",children:h.length})]}),e.jsx("span",{className:"grow"}),e.jsxs("span",{children:[e.jsx(G,{keys:["mod","J"]})," ",a("jobs.kbToggle")," ·"," ",e.jsx(G,{keys:["esc"]})," ",a("jobs.kbClose")]})]})})]})}):null}function Vt(t){if(t<1e3)return`${t}ms`;const n=t/1e3;if(n<60)return`${n.toFixed(1)}s`;const s=Math.floor(n/60),i=Math.floor(n%60);return`${s}m${i}s`}function Jt({job:t,tick:n,onStop:s}){const[i,r]=l.useState(!1),o=(t.running?Date.now():t.startedAt+0)-t.startedAt,d=t.running?Date.now()-t.startedAt:o;return e.jsxs("div",{className:"job-row","data-status":t.running?"running":"exited",children:[e.jsxs("div",{className:"jr-main",onClick:()=>r(p=>!p),children:[e.jsx("span",{className:"jr-state",children:t.running?e.jsx("span",{className:"spin"}):e.jsx(x.history,{size:11,style:{color:"var(--muted-2)"}})}),e.jsxs("span",{className:"jr-kind",children:[e.jsx(x.terminal,{size:11}),e.jsx("span",{children:"shell"})]}),e.jsxs("div",{className:"jr-body",children:[e.jsx("div",{className:"nm",title:t.command,children:t.command}),e.jsxs("div",{className:"sub",children:[e.jsx("span",{className:"ses",children:t.sessionLabel}),t.spawnError?e.jsxs("span",{className:"rk",children:["· ",t.spawnError]}):null,!t.running&&t.exitCode!==null&&t.exitCode!==0?e.jsxs("span",{className:"rk",children:["· exit ",t.exitCode]}):null]})]}),e.jsx("div",{className:"jr-time",children:Vt(d)}),e.jsx("div",{className:"jr-act",children:t.running?e.jsxs("button",{type:"button",className:"btn danger sm",title:a("jobs.stopOne"),onClick:p=>{p.stopPropagation(),s(t.id)},children:[e.jsx(x.stop,{size:10})," ",a("jobs.stop")]}):e.jsx("span",{className:"jr-exit",title:`exit ${t.exitCode??"—"}`,children:t.exitCode===0?"ok":`exit ${t.exitCode??"?"}`})})]}),i?e.jsxs("div",{className:"jr-detail",children:[e.jsxs("div",{className:"kv-grid",children:[e.jsxs("div",{children:[e.jsx("span",{className:"k",children:"job_id"}),e.jsx("span",{className:"v",children:t.id})]}),e.jsxs("div",{children:[e.jsx("span",{className:"k",children:"pid"}),e.jsx("span",{className:"v",children:t.pid??"—"})]}),e.jsxs("div",{children:[e.jsx("span",{className:"k",children:"elapsed"}),e.jsx("span",{className:"v",children:Vt(d)})]})]}),t.outputTail?e.jsx("pre",{className:"jr-log",children:t.outputTail}):null]}):null]})}const Ra="https://github.com/esengine/DeepSeek-Reasonix";function La({onClose:t}){const n=()=>{Be(Ra).catch(()=>{})};return e.jsx("div",{className:"about-mask",onClick:t,children:e.jsxs("div",{className:"about-modal",onClick:s=>s.stopPropagation(),children:[e.jsx("button",{type:"button",className:"about-close",onClick:t,"aria-label":a("about.close"),children:e.jsx(x.x,{size:14})}),e.jsxs("div",{className:"about-brand",children:[e.jsx("div",{className:"about-name",children:"Reasonix"}),e.jsx("div",{className:"about-tagline",children:a("about.tagline")})]}),e.jsxs("div",{className:"about-meta",children:[e.jsxs("div",{className:"about-row",children:[e.jsx("span",{className:"about-label",children:a("about.version")}),e.jsx("code",{className:"about-value",children:"0.47.2"})]}),e.jsxs("div",{className:"about-row",children:[e.jsx("span",{className:"about-label",children:a("about.repo")}),e.jsxs("button",{type:"button",className:"about-link",onClick:n,children:[e.jsx(x.link,{size:12}),e.jsx("span",{children:"esengine/DeepSeek-Reasonix"})]})]})]})]})})}function Ia(t){if(t)return t.length>6?`${t.slice(0,6)}...`:t}function za(t){return t.configured?"connect":"configure"}function _a(t){switch(t.runtimeState){case"connected":return a("settings.qqConnected");case"connecting":return a("settings.qqConnecting");case"failed":return a("settings.qqFailed");default:return a("settings.qqDisconnected")}}function qa(t){const n=/^owner (.+?)(?:, allowlist (\d+))?$/.exec(t);if(n){const r=n[1]??"unknown",o=n[2];return o?a("settings.qqAccessOwnerWithAllowlist",{openId:r,count:o}):a("settings.qqAccessOwner",{openId:r})}const s=/^allowlist (\d+)$/.exec(t);if(s)return a("settings.qqAccessAllowlist",{count:s[1]??"0"});const i=/^first-sender \(runtime only, (.+)\)$/.exec(t);return i?a("settings.qqAccessRuntime",{openId:i[1]??"unknown"}):a("settings.qqAccessOpen")}function Ba(t){if(!t.configured)return a("settings.qqSummaryMissing");const n=t.appIdPreview??Ia(t.appId)??"unknown";return a("settings.qqSummaryDetail",{appId:a("settings.qqSummaryAppId",{appId:n}),environment:t.sandbox?a("settings.qqSandbox"):a("settings.qqProduction"),access:qa(t.access)})}const dt=[{id:"general",icon:"cog"},{id:"models",icon:"brain"},{id:"mcp",icon:"wrench"},{id:"skills",icon:"zap"},{id:"memory",icon:"bookmark"},{id:"rules",icon:"shield"},{id:"billing",icon:"coin"},{id:"shortcuts",icon:"cpu"}];function Ha({settings:t,balance:n,usage:s,currency:i,theme:r,themeStyle:o,onSetTheme:d,onSetThemeStyle:p,fontScale:h,onSetFontScale:g,fontFamily:k,onSetFontFamily:v,initialPage:f,mcpSpecs:m,mcpBridged:y,skills:j,memory:I,memoryDetail:q,qq:X,onClose:R,onSave:L,onSaveApiKey:K,onLoadQQ:F,onConnectQQ:J,onDisconnectQQ:ee,onSaveQQConfig:E,onOpenQQApplyLink:u,onPickWorkspace:z,onAddMcpSpec:le,onRemoveMcpSpec:ne,onReadMemory:he}){const[Z,ce]=l.useState(f??"general"),[ge,S]=l.useState(!1),C=dt.find(H=>H.id===Z)??dt[0];return e.jsx("div",{className:"settings-mask",onClick:R,children:e.jsxs("div",{className:"settings",onClick:H=>H.stopPropagation(),children:[e.jsxs("nav",{className:"settings-side",children:[e.jsx("div",{className:"sg",children:a("settings.title")}),dt.map(H=>e.jsxs("div",{className:"row","data-active":Z===H.id,onClick:()=>ce(H.id),children:[e.jsx("span",{className:"ico",children:x[H.icon]({size:13})}),e.jsx("span",{children:a(`settings.page${H.id[0].toUpperCase()}${H.id.slice(1)}Label`)})]},H.id))]}),e.jsxs("div",{className:"settings-main",children:[e.jsxs("div",{className:"settings-head",children:[e.jsxs("div",{children:[e.jsx("h2",{children:a(`settings.page${C.id[0].toUpperCase()}${C.id.slice(1)}Label`)}),e.jsx("div",{className:"desc",children:a(`settings.page${C.id[0].toUpperCase()}${C.id.slice(1)}Desc`)})]}),e.jsx("span",{className:"grow"}),e.jsx("button",{type:"button",className:"close-btn",onClick:R,children:e.jsx(x.x,{size:14})})]}),e.jsxs("div",{className:"settings-body",children:[Z==="general"&&e.jsx(Fa,{settings:t,theme:r,themeStyle:o,onSetTheme:d,onSetThemeStyle:p,fontScale:h,onSetFontScale:g,fontFamily:k,onSetFontFamily:v,onSave:L,onPickWorkspace:z}),Z==="models"&&e.jsx(Ka,{settings:t,onSave:L}),Z==="mcp"&&e.jsx(Wa,{specs:m,bridged:y,onAdd:le,onRemove:ne}),Z==="skills"&&e.jsx(Ga,{skills:j,subagentModels:t.subagentModels??{},onSave:L}),Z==="memory"&&e.jsx(Va,{entries:I,detail:q,onRead:he}),Z==="rules"&&e.jsx(Ja,{settings:t,onSave:L}),Z==="billing"&&e.jsx(Ya,{balance:n,usage:s,currency:i}),Z==="shortcuts"&&e.jsx(Qa,{}),Z==="general"?e.jsxs(e.Fragment,{children:[e.jsx($a,{baseUrl:t.baseUrl,apiKeyPrefix:t.apiKeyPrefix,onSave:L,onSaveApiKey:K}),e.jsx(Oa,{qq:X,configureOpen:ge,onOpenConfigure:()=>{F(),S(!0)},onCloseConfigure:()=>S(!1),onConnect:J,onDisconnect:ee,onSaveConfig:E,onSaveAndConnect:H=>{E(H),J()},onOpenApplyLink:u})]}):null]})]})]})})}function Oa({qq:t,configureOpen:n,onOpenConfigure:s,onCloseConfigure:i,onConnect:r,onDisconnect:o,onSaveConfig:d,onSaveAndConnect:p,onOpenApplyLink:h}){const g=t??{appId:void 0,appSecret:void 0,sandbox:!0,configured:!1,runtimeState:"disconnected",access:"open (unbound)"},[k,v]=l.useState(g.appId??""),[f,m]=l.useState(g.appSecret??""),[y,j]=l.useState(g.sandbox??!0);l.useEffect(()=>{v(g.appId??""),m(g.appSecret??""),j(g.sandbox??!0)},[g.appId,g.appSecret,g.sandbox,n]);const I={appId:k,appSecret:f,sandbox:y};return e.jsxs("section",{className:"section",children:[e.jsx("div",{className:"stitle",children:a("settings.qqSection")}),n?e.jsxs("div",{className:"qq-config-card",children:[e.jsxs("div",{className:"qq-config-head",children:[e.jsxs("div",{children:[e.jsx("div",{className:"n",children:a("settings.qqConfigureTitle")}),e.jsx("div",{className:"h",children:a("settings.qqConfigureHint")})]}),e.jsx("button",{type:"button",className:"btn",onClick:i,children:a("settings.qqBack")})]}),e.jsxs("div",{className:"setting-row",children:[e.jsx("div",{className:"l",children:e.jsx("div",{className:"n",children:a("settings.qqAppId")})}),e.jsx("input",{className:"field mono",value:k,onChange:q=>v(q.target.value),placeholder:"QQ Open Platform App ID"})]}),e.jsxs("div",{className:"setting-row",children:[e.jsx("div",{className:"l",children:e.jsx("div",{className:"n",children:a("settings.qqAppSecret")})}),e.jsx("input",{className:"field mono",type:"password",value:f,onChange:q=>m(q.target.value),placeholder:"QQ Open Platform App Secret"})]}),e.jsxs("div",{className:"setting-row",children:[e.jsx("div",{className:"l",children:e.jsx("div",{className:"n",children:a("settings.qqEnvironment")})}),e.jsxs("div",{className:"seg-ctrl",children:[e.jsx("button",{type:"button","data-on":y,onClick:()=>j(!0),children:a("settings.qqSandbox")}),e.jsx("button",{type:"button","data-on":!y,onClick:()=>j(!1),children:a("settings.qqProduction")})]})]}),e.jsxs("div",{className:"setting-row",children:[e.jsx("div",{className:"l",children:e.jsx("div",{className:"n",children:a("settings.qqApplyLabel")})}),e.jsx("button",{type:"button",className:"btn",onClick:h,children:a("settings.qqApplyAction")})]}),e.jsxs("div",{className:"qq-config-actions",children:[e.jsx("button",{type:"button",className:"btn",onClick:()=>{d(I),i()},children:a("settings.qqSave")}),e.jsx("button",{type:"button",className:"btn primary",onClick:()=>{p(I),i()},children:a("settings.qqSaveAndConnect")})]})]}):e.jsxs("div",{className:"setting-row qq-setting-row",children:[e.jsxs("div",{className:"l",children:[e.jsx("div",{className:"n",children:a("settings.qqTitle")}),e.jsx("div",{className:"h",children:Ba(g)})]}),e.jsxs("div",{className:"qq-row-actions",children:[e.jsx("button",{type:"button",className:`btn qq-status-btn qq-status-${g.runtimeState==="connected"?"on":g.runtimeState==="connecting"?"connecting":g.runtimeState==="failed"?"failed":"off"}`,onClick:()=>{if(za(g)==="configure"){s();return}if(g.runtimeState==="connected"){o();return}r()},children:_a(g)}),e.jsx("button",{type:"button",className:"btn",onClick:s,children:a("settings.qqConfigure")})]})]})]})}function Fa({settings:t,theme:n,themeStyle:s,onSetTheme:i,onSetThemeStyle:r,fontScale:o,onSetFontScale:d,fontFamily:p,onSetFontFamily:h,onSave:g,onPickWorkspace:k}){const[v,f]=l.useState(t.editor??""),m=$();return e.jsxs(e.Fragment,{children:[e.jsxs("section",{className:"section",children:[e.jsx("div",{className:"stitle",children:a("settings.appearanceSection")}),e.jsxs("div",{className:"setting-row",children:[e.jsxs("div",{className:"l",children:[e.jsx("div",{className:"n",children:a("settings.theme")}),e.jsx("div",{className:"h",children:a("settings.themeHint")})]}),e.jsxs("div",{className:"seg-ctrl",children:[e.jsx("button",{type:"button","data-on":n===se.DARK,onClick:()=>i(se.DARK),children:a("settings.themeDark")}),e.jsx("button",{type:"button","data-on":n===se.LIGHT,onClick:()=>i(se.LIGHT),children:a("settings.themeLight")})]})]}),e.jsxs("div",{className:"setting-row theme-style-row",children:[e.jsxs("div",{className:"l",children:[e.jsx("div",{className:"n",children:a("settings.themeStyle")}),e.jsx("div",{className:"h",children:a("settings.themeStyleHint")})]}),e.jsx("div",{className:"style-grid",children:Tn.map(y=>e.jsxs("button",{type:"button",className:"style-card","data-on":s===y,"data-style":y,onClick:()=>r(y),children:[e.jsxs("span",{className:"style-card-head",children:[e.jsx("span",{className:"style-name",children:a(`settings.themeStyle${y[0].toUpperCase()}${y.slice(1)}`)}),e.jsx("span",{className:"style-mode",children:He(y)===se.DARK?a("settings.themeDark"):a("settings.themeLight")})]}),e.jsxs("span",{className:"style-swatches","aria-hidden":"true",children:[e.jsx("span",{}),e.jsx("span",{}),e.jsx("span",{})]}),e.jsx("span",{className:"style-desc",children:a(`settings.themeStyle${y[0].toUpperCase()}${y.slice(1)}Desc`)})]},y))})]}),e.jsxs("div",{className:"setting-row",children:[e.jsxs("div",{className:"l",children:[e.jsx("div",{className:"n",children:a("settings.fontScale")}),e.jsx("div",{className:"h",children:a("settings.fontScaleHint")})]}),e.jsxs("div",{className:"seg-ctrl",children:[e.jsx("button",{type:"button","data-on":o===ue.SMALL,onClick:()=>d(ue.SMALL),children:a("settings.fontScaleSmall")}),e.jsx("button",{type:"button","data-on":o===ue.MEDIUM,onClick:()=>d(ue.MEDIUM),children:a("settings.fontScaleMedium")}),e.jsx("button",{type:"button","data-on":o===ue.LARGE,onClick:()=>d(ue.LARGE),children:a("settings.fontScaleLarge")})]})]}),e.jsxs("div",{className:"setting-row",children:[e.jsxs("div",{className:"l",children:[e.jsx("div",{className:"n",children:a("settings.fontFamily")}),e.jsx("div",{className:"h",children:a("settings.fontFamilyHint")})]}),e.jsxs("div",{className:"seg-ctrl",children:[e.jsx("button",{type:"button","data-on":p===pe.SANS,onClick:()=>h(pe.SANS),children:a("settings.fontFamilySans")}),e.jsx("button",{type:"button","data-on":p===pe.SYSTEM,onClick:()=>h(pe.SYSTEM),children:a("settings.fontFamilySystem")}),e.jsx("button",{type:"button","data-on":p===pe.SERIF,onClick:()=>h(pe.SERIF),children:a("settings.fontFamilySerif")})]})]}),e.jsxs("div",{className:"setting-row",children:[e.jsxs("div",{className:"l",children:[e.jsx("div",{className:"n",children:a("settings.language")}),e.jsx("div",{className:"h",children:a("settings.languageHint")})]}),e.jsx("div",{className:"seg-ctrl",children:kn().map(y=>e.jsx("button",{type:"button","data-on":m===y,onClick:()=>vn(y),children:wn(y)},y))})]})]}),e.jsxs("section",{className:"section",children:[e.jsx("div",{className:"stitle",children:a("settings.workspaceSection")}),e.jsxs("div",{className:"setting-row",children:[e.jsxs("div",{className:"l",children:[e.jsx("div",{className:"n",children:a("settings.currentWorkspace")}),e.jsx("div",{className:"h",children:t.workspaceDir||a("settings.notSelected")})]}),e.jsx("button",{type:"button",className:"btn",onClick:k,children:a("settings.workspaceChange")})]}),e.jsxs("div",{className:"setting-row",children:[e.jsxs("div",{className:"l",children:[e.jsx("div",{className:"n",children:a("settings.editor")}),e.jsx("div",{className:"h",children:a("settings.editorHint")})]}),e.jsx("input",{className:"field mono",value:v,placeholder:"cursor --goto",onChange:y=>f(y.target.value),onBlur:()=>g({editor:v||void 0})})]})]}),e.jsxs("section",{className:"section",children:[e.jsx("div",{className:"stitle",children:a("settings.behaviorSection")}),e.jsxs("div",{className:"setting-row",children:[e.jsxs("div",{className:"l",children:[e.jsx("div",{className:"n",children:a("settings.reasoningEffort")}),e.jsx("div",{className:"h",children:a("settings.reasoningEffortHint")})]}),e.jsx("div",{className:"seg-ctrl",children:["low","medium","high","max"].map(y=>e.jsx("button",{type:"button","data-on":t.reasoningEffort===y,onClick:()=>g({reasoningEffort:y}),children:y},y))})]}),e.jsxs("div",{className:"setting-row",children:[e.jsxs("div",{className:"l",children:[e.jsx("div",{className:"n",children:a("settings.editMode")}),e.jsx("div",{className:"h",children:a("settings.editModeHint")})]}),e.jsx("div",{className:"seg-ctrl",children:["plan","review","auto","yolo"].map(y=>e.jsx("button",{type:"button","data-on":t.editMode===y,onClick:()=>g({editMode:y}),children:y},y))})]}),e.jsxs("div",{className:"setting-row",children:[e.jsxs("div",{className:"l",children:[e.jsx("div",{className:"n",children:a("settings.showSystemEvents")}),e.jsx("div",{className:"h",children:a("settings.showSystemEventsHint")})]}),e.jsxs("div",{className:"seg-ctrl",children:[e.jsx("button",{type:"button","data-on":t.showSystemEvents!==!1,onClick:()=>g({showSystemEvents:!0}),children:a("settings.shown")}),e.jsx("button",{type:"button","data-on":t.showSystemEvents===!1,onClick:()=>g({showSystemEvents:!1}),children:a("settings.hidden")})]})]}),e.jsxs("div",{className:"setting-row",children:[e.jsxs("div",{className:"l",children:[e.jsx("div",{className:"n",children:a("settings.budget")}),e.jsx("div",{className:"h",children:a("settings.budgetHint")})]}),e.jsx("input",{className:"field",type:"number",defaultValue:t.budgetUsd??"",placeholder:a("settings.budgetPlaceholder"),onBlur:y=>{const j=y.target.value.trim();g({budgetUsd:j===""?null:Number(j)})}})]}),e.jsxs("div",{className:"setting-row",children:[e.jsxs("div",{className:"l",children:[e.jsx("div",{className:"n",children:a("settings.webSearchEngine")}),e.jsx("div",{className:"h",children:a("settings.webSearchEngineNote")})]}),e.jsxs("select",{className:"field",value:t.webSearchEngine??"bing",onChange:y=>g({webSearchEngine:y.target.value}),children:[e.jsx("option",{value:"bing",children:a("settings.webSearchEngineBing")}),e.jsx("option",{value:"searxng",children:a("settings.webSearchEngineSearxng")}),e.jsx("option",{value:"metaso",children:a("settings.webSearchEngineMetaso")}),e.jsx("option",{value:"tavily",children:a("settings.webSearchEngineTavily")}),e.jsx("option",{value:"perplexity",children:a("settings.webSearchEnginePerplexity")}),e.jsx("option",{value:"exa",children:a("settings.webSearchEngineExa")})]})]})]})]})}function $a({baseUrl:t,apiKeyPrefix:n,onSave:s,onSaveApiKey:i}){const[r,o]=l.useState(""),[d,p]=l.useState(t??"");return e.jsxs("section",{className:"section",children:[e.jsx("div",{className:"stitle",children:a("settings.apiSection")}),e.jsxs("div",{className:"setting-row",children:[e.jsxs("div",{className:"l",children:[e.jsx("div",{className:"n",children:a("settings.apiKey")}),e.jsx("div",{className:"h",children:n?a("settings.apiKeySet",{prefix:n}):a("settings.apiKeyNotSet")})]}),e.jsxs("div",{style:{display:"flex",gap:6},children:[e.jsx("input",{className:"field mono",type:"password",value:r,onChange:h=>o(h.target.value),placeholder:"sk-…"}),e.jsx("button",{type:"button",className:"btn primary",disabled:!r,onClick:()=>{r&&(i(r),o(""))},children:a("settings.apiKeySave")})]})]}),e.jsxs("div",{className:"setting-row",children:[e.jsxs("div",{className:"l",children:[e.jsx("div",{className:"n",children:a("settings.baseUrl")}),e.jsx("div",{className:"h",children:a("settings.baseUrlHint")})]}),e.jsx("input",{className:"field mono",value:d,onChange:h=>p(h.target.value),onBlur:()=>s({baseUrl:d.trim()||void 0})})]})]})}const Yt=["deepseek-v4-flash","deepseek-v4-pro"],Ua=["low","medium","high","max"];function Ka({settings:t,onSave:n}){const[s,i]=l.useState(t.model);l.useEffect(()=>i(t.model),[t.model]);const r=Yt.includes(t.model);return e.jsxs(e.Fragment,{children:[e.jsxs("section",{className:"section",children:[e.jsx("div",{className:"stitle",children:a("settings.defaultModelCurrent",{model:t.model})}),e.jsx("div",{className:"model-grid",children:Yt.map(o=>e.jsx("div",{className:"mcard","data-on":t.model===o,onClick:()=>n({model:o}),children:e.jsx("div",{className:"nm",children:o})},o))}),e.jsxs("div",{className:"setting-row",style:{marginTop:12},children:[e.jsxs("div",{className:"l",children:[e.jsx("div",{className:"n",children:a("settings.modelCustom")}),e.jsx("div",{className:"h",children:a("settings.modelCustomHint")})]}),e.jsxs("div",{style:{display:"flex",gap:6},children:[e.jsx("input",{className:"field mono",value:s,onChange:o=>i(o.target.value),placeholder:"deepseek-v4-flash"}),e.jsx("button",{type:"button",className:"btn primary",disabled:!s.trim()||s.trim()===t.model,onClick:()=>n({model:s.trim()}),children:a("settings.apiKeySave")})]})]}),r?null:e.jsx("div",{className:"h",style:{marginTop:6},children:a("settings.modelCustomActive",{model:t.model})})]}),e.jsxs("section",{className:"section",children:[e.jsx("div",{className:"stitle",children:a("settings.effortSection")}),e.jsxs("div",{className:"setting-row",children:[e.jsxs("div",{className:"l",children:[e.jsx("div",{className:"n",children:a("settings.reasoningEffort")}),e.jsx("div",{className:"h",children:a("settings.reasoningEffortHint")})]}),e.jsx("div",{className:"seg-ctrl",children:Ua.map(o=>e.jsx("button",{type:"button","data-on":t.reasoningEffort===o,onClick:()=>n({reasoningEffort:o}),children:o},o))})]})]})]})}function Wa({specs:t,bridged:n,onAdd:s,onRemove:i}){const[r,o]=l.useState(""),d=()=>{const p=r.trim();p&&(s(p),o(""))};return e.jsxs(e.Fragment,{children:[e.jsxs("section",{className:"section",children:[e.jsxs("div",{className:"stitle",children:[a("settings.mcpConfigured",{count:t.length}),n?e.jsx("span",{style:{color:"var(--accent)",marginLeft:8,fontSize:11},children:a("settings.mcpBridged")}):e.jsx("span",{style:{color:"var(--muted)",marginLeft:8,fontSize:11},children:a("settings.mcpNotBridged")})]}),t.length===0?e.jsx("div",{style:{padding:16,background:"var(--card)",border:"1px solid var(--border)",borderRadius:10,fontSize:12,color:"var(--muted)"},children:a("settings.mcpEmpty")}):t.map(p=>e.jsxs("div",{className:"scard",children:[e.jsxs("div",{className:"top",children:[e.jsx("span",{className:"ico",children:e.jsx(x.wrench,{size:14})}),e.jsxs("div",{children:[e.jsx("div",{className:"nm",children:p.name??"(anonymous)"}),e.jsx("div",{className:"sub",children:p.summary})]}),e.jsx("span",{className:"grow"}),e.jsx("button",{type:"button",className:"btn ghost",style:{color:"var(--danger)"},onClick:()=>i(p.raw),children:a("settings.mcpRemove")})]}),p.parseError?e.jsx("div",{className:"desc",style:{color:"var(--danger)"},children:a("settings.parseError",{error:p.parseError})}):null]},p.raw))]}),e.jsxs("section",{className:"section",children:[e.jsx("div",{className:"stitle",children:a("settings.mcpAddSection")}),e.jsxs("div",{className:"setting-row",children:[e.jsxs("div",{className:"l",children:[e.jsx("div",{className:"n",children:a("settings.mcpSpecLabel")}),e.jsx("div",{className:"h",dangerouslySetInnerHTML:{__html:a("settings.mcpSpecFormat")}})]}),e.jsxs("div",{style:{display:"flex",gap:6},children:[e.jsx("input",{className:"field mono",value:r,onChange:p=>o(p.target.value),placeholder:"github=npx -y @smithery/cli ...",onKeyDown:p=>{p.key==="Enter"&&d()}}),e.jsx("button",{type:"button",className:"btn primary",disabled:!r.trim(),onClick:d,children:a("settings.mcpAdd")})]})]})]})]})}function Ga({skills:t,subagentModels:n,onSave:s}){const i=(r,o)=>{s({subagentModels:{...n,[r]:o}})};return e.jsxs("section",{className:"section",children:[e.jsx("div",{className:"stitle",children:a("settings.skillsLoaded",{count:t.length})}),t.length===0?e.jsx("div",{style:{padding:16,background:"var(--card)",border:"1px solid var(--border)",borderRadius:10,fontSize:12,color:"var(--muted)"},children:a("settings.skillsEmpty")}):t.map(r=>e.jsxs("div",{className:"scard",children:[e.jsxs("div",{className:"top",children:[e.jsx("span",{className:"ico",children:e.jsx(x.zap,{size:14})}),e.jsxs("div",{children:[e.jsx("div",{className:"nm",children:e.jsxs("span",{style:{fontFamily:"Geist Mono, monospace",color:"var(--accent)"},children:["/",r.name]})}),e.jsxs("div",{className:"sub",children:[r.scope," · ",r.runAs,r.model?` · ${r.model}`:""]})]}),r.runAs==="subagent"?e.jsxs("select",{className:"field",style:{marginLeft:"auto",minWidth:96},value:n[r.name]??"flash",onChange:o=>i(r.name,o.target.value),title:a("settings.subagentModelHint"),children:[e.jsx("option",{value:"flash",children:a("settings.subagentModelFlash")}),e.jsx("option",{value:"pro",children:a("settings.subagentModelPro")})]}):null]}),e.jsx("div",{className:"desc",children:r.description}),e.jsx("div",{style:{fontFamily:"Geist Mono, monospace",fontSize:10.5,color:"var(--muted-2)",marginTop:4},children:r.path})]},`${r.scope}:${r.name}`))]})}function Va({entries:t,detail:n,onRead:s}){return e.jsxs("section",{className:"section",children:[e.jsx("div",{className:"stitle",children:a("settings.memorySection")}),t.length===0?e.jsx("div",{className:"muted-card",children:a("settings.memoryDesc")}):e.jsxs("div",{className:"memory-browser",children:[e.jsx("div",{className:"memory-list",children:t.map(i=>e.jsxs("button",{type:"button",className:"memory-item","data-active":n?.path===i.path,onClick:()=>s(i.path),children:[e.jsx("span",{className:"memory-kind",children:i.kind.replace("_"," ")}),e.jsx("span",{className:"memory-name",children:i.description||i.name}),e.jsx("span",{className:"memory-path",children:i.path})]},i.path))}),e.jsx("pre",{className:"memory-detail",children:n?n.body:a("settings.memoryDesc")})]})]})}function Ja({settings:t,onSave:n}){return e.jsxs(e.Fragment,{children:[e.jsxs("section",{className:"section",children:[e.jsx("div",{className:"stitle",children:a("settings.editMode")}),e.jsxs("div",{className:"setting-row",children:[e.jsxs("div",{className:"l",children:[e.jsx("div",{className:"n",children:a("settings.appMode")}),e.jsx("div",{className:"h",children:a("settings.editModeHint")})]}),e.jsx("div",{className:"seg-ctrl",children:["plan","review","auto","yolo"].map(s=>e.jsx("button",{type:"button","data-on":t.editMode===s,onClick:()=>n({editMode:s}),children:s},s))})]})]}),e.jsxs("section",{className:"section",children:[e.jsx("div",{className:"stitle",children:a("settings.ruleAutoApprovalSection")}),e.jsx("div",{style:{padding:12,background:"var(--card)",border:"1px solid var(--border)",borderRadius:10,fontSize:12,color:"var(--muted)"},children:a("settings.ruleAutoApprovalHint")})]})]})}function Ya({balance:t,usage:n,currency:s}){const i=s==="CNY"?"¥":"$",r=s==="CNY"?n.totalCostUsd*7.2:n.totalCostUsd,o=n.cacheHitTokens+n.cacheMissTokens,d=o>0?Math.round(n.cacheHitTokens/o*100):0;return e.jsx(e.Fragment,{children:e.jsxs("div",{className:"bill-grid",children:[e.jsxs("div",{className:"bill-card",children:[e.jsx("div",{className:"l",children:a("settings.balanceLabel")}),e.jsx("div",{className:"v ok",children:t?`${t.currency==="USD"?"$":"¥"} ${t.total.toFixed(2)}`:"—"}),e.jsx("div",{className:"sub",children:t&&!t.isAvailable?a("settings.balanceLow"):a("settings.balanceAvailable")})]}),e.jsxs("div",{className:"bill-card",children:[e.jsx("div",{className:"l",children:a("settings.sessionCost")}),e.jsxs("div",{className:"v",children:[i," ",r.toFixed(4)]}),e.jsxs("div",{className:"sub",children:["prompt ",n.totalPromptTokens.toLocaleString()," t"]})]}),e.jsxs("div",{className:"bill-card",children:[e.jsx("div",{className:"l",children:a("settings.cacheHitRate")}),e.jsxs("div",{className:"v acc",children:[d,"%"]}),e.jsxs("div",{className:"sub",children:["hit ",n.cacheHitTokens.toLocaleString()," / miss"," ",n.cacheMissTokens.toLocaleString()]})]})]})})}function Qa(){const t=[{nm:a("settings.shortcutNewChat"),keys:["mod","N"]},{nm:a("settings.shortcutNewTab"),keys:["mod","T"]},{nm:a("settings.shortcutCloseTab"),keys:["mod","W"]},{nm:a("settings.shortcutCommandPalette"),keys:["mod","K"]},{nm:a("settings.shortcutFocusComposer"),keys:["mod","L"]},{nm:a("settings.shortcutSwitchTab"),keys:["mod","tab"]},{nm:a("settings.shortcutAbort"),keys:["esc"]},{nm:a("settings.shortcutSettings"),keys:["mod",","]}];return e.jsx("section",{className:"section",children:e.jsx("div",{className:"kbd-grid",children:t.map((n,s)=>e.jsx(Za,{nm:n.nm,keys:n.keys},s))})})}function Za({nm:t,keys:n}){return e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"nm",children:t}),e.jsx("div",{className:"keys",children:e.jsx(G,{keys:n})})]})}function ut(t){if(t.summary&&t.summary.trim())return t.summary.trim();const n=t.name.match(/^desktop-(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(?:-(\d+))?$/);if(n){const[,,s,i,r,o,d]=n;return`${a("sidebarPanel.sessionTitle",{month:s,day:i,hour:r,minute:o})}${d&&d!=="1"?` · #${d}`:""}`}return t.name.replace(/^desktop-/,"").replace(/[-_]+/g," ")}function Xa(t){const n=t/6e4;if(n<1)return a("sidebarPanel.justNow");if(n<60)return a("sidebarPanel.minutesAgo",{n:Math.floor(n)});const s=n/60;if(s<24)return a("sidebarPanel.hoursAgo",{n:Math.floor(s)});const i=s/24;return i<7?a("sidebarPanel.daysAgo",{n:Math.floor(i)}):a("sidebarPanel.weeksAgo",{n:Math.floor(i/7)})}function ei({sessions:t,activeName:n,loadingName:s,onNewChat:i,onLoadSession:r,onDeleteSession:o,onOpenSettings:d,onOpenRules:p,onOpenCommands:h,onOpenAbout:g}){$();const[k,v]=l.useState(""),[f,m]=l.useState(null),y=k?t.filter(j=>{const I=k.toLowerCase();return ut(j).toLowerCase().includes(I)||j.name.toLowerCase().includes(I)}):t;return l.useEffect(()=>{if(!f)return;const j=q=>{q.target?.closest(".session-delete-popover")||m(null)},I=q=>{q.key==="Escape"&&m(null)};return window.addEventListener("mousedown",j),window.addEventListener("keydown",I),()=>{window.removeEventListener("mousedown",j),window.removeEventListener("keydown",I)}},[f]),e.jsxs("aside",{className:"sidebar",children:[e.jsxs("div",{className:"side-head",children:[e.jsxs("button",{type:"button",className:"new-btn",onClick:i,children:[e.jsx(x.plus,{size:14}),e.jsx("span",{children:a("sidebarPanel.newChat")}),e.jsx(G,{keys:["mod","N"]})]}),e.jsx("button",{type:"button",className:"icon-btn",title:a("sidebarPanel.commandPalette"),onClick:h,children:e.jsx(x.history,{size:14})})]}),e.jsx("div",{className:"search-row",children:e.jsxs("div",{className:"input",children:[e.jsx(x.search,{size:13}),e.jsx("input",{placeholder:a("sidebarPanel.searchSessions"),value:k,onChange:j=>v(j.target.value)}),e.jsx(G,{keys:["mod","K"]})]})}),e.jsx("div",{className:"session-list",children:e.jsxs("div",{className:"side-section",children:[e.jsxs("div",{className:"label",children:[e.jsx("span",{children:a("sidebarPanel.recent")}),e.jsx("span",{className:"count",children:y.length})]}),t.length===0?e.jsx("div",{style:{padding:"12px 8px",fontSize:11,color:"var(--muted-2)",fontFamily:"Geist Mono, monospace"},children:a("sidebarPanel.noSessions")}):y.length===0?e.jsx("div",{style:{padding:"12px 8px",fontSize:11,color:"var(--muted-2)",fontFamily:"Geist Mono, monospace"},children:a("sidebarPanel.noMatches")}):null,y.map(j=>{const I=j.name===n,q=j.name===s,X=Date.parse(j.mtime),R=Number.isFinite(X)?Xa(Date.now()-X):j.mtime;return e.jsxs("div",{className:"session-item","data-active":I,"data-loading":q||void 0,style:s&&!q?{opacity:.5,pointerEvents:"none"}:void 0,onClick:()=>r(j.name),role:"button",tabIndex:0,title:j.name,onKeyDown:L=>{L.key==="Enter"&&r(j.name)},children:[e.jsx("span",{className:"state",style:{background:q||I?"var(--accent)":"var(--border-strong)",animation:q?"session-pulse 0.9s ease-in-out infinite":void 0}}),e.jsxs("div",{className:"body",children:[e.jsx("span",{className:"title",children:ut(j)}),e.jsx("span",{className:"meta",children:q?e.jsx("span",{children:a("sidebarPanel.loading")}):e.jsxs(e.Fragment,{children:[e.jsx("span",{children:a("sidebarPanel.messageCount",{count:j.messageCount})}),e.jsx("span",{className:"sep",children:"·"}),e.jsx("span",{children:R})]})})]}),e.jsx("button",{type:"button",className:"delete-btn",title:a("sidebarPanel.deleteSession"),"aria-label":a("sidebarPanel.deleteSession"),onClick:L=>{L.stopPropagation();const K=L.currentTarget.getBoundingClientRect();m({name:j.name,pretty:ut(j),x:K.right,y:K.bottom})},onKeyDown:L=>{(L.key==="Enter"||L.key===" ")&&L.stopPropagation()},children:e.jsx(x.x,{size:12})})]},j.name)})]})}),e.jsxs("div",{className:"side-foot",children:[e.jsxs("div",{className:"row",onClick:p,children:[e.jsx("span",{className:"ico",children:e.jsx(x.shield,{size:13})}),e.jsx("span",{children:a("sidebarPanel.approvalRules")})]}),e.jsxs("div",{className:"row",onClick:g,children:[e.jsx("span",{className:"ico",children:e.jsx(x.help,{size:13})}),e.jsx("span",{children:a("about.sidebarLabel")})]}),e.jsxs("div",{className:"row",onClick:d,children:[e.jsx("span",{className:"ico",children:e.jsx(x.cog,{size:13})}),e.jsx("span",{children:a("sidebarPanel.settings")}),e.jsx("span",{className:"right",children:e.jsx(G,{keys:["mod",","]})})]})]}),f?e.jsx(ti,{target:f,onCancel:()=>m(null),onConfirm:()=>{o(f.name),m(null)}}):null]})}function ti({target:t,onCancel:n,onConfirm:s}){const i=l.useRef(null),r=l.useRef(null),[o,d]=l.useState({left:t.x,top:t.y});return l.useLayoutEffect(()=>{const p=i.current;if(!p)return;const h=p.getBoundingClientRect(),g=8,k=window.innerWidth,v=window.innerHeight;let f=t.x,m=t.y;f+h.width+g>k&&(f=Math.max(g,k-h.width-g)),m+h.height+g>v&&(m=Math.max(g,v-h.height-g)),(f!==o.left||m!==o.top)&&d({left:f,top:m}),r.current?.focus()},[t.x,t.y,o.left,o.top]),e.jsxs("div",{ref:i,className:"session-delete-popover",role:"dialog","aria-modal":"true",style:{left:o.left,top:o.top},children:[e.jsxs("div",{className:"msg",children:[a("sidebarPanel.deleteSession"),e.jsx("span",{className:"name",children:t.pretty})]}),e.jsxs("div",{className:"actions",children:[e.jsx("button",{ref:r,type:"button",className:"cancel",onClick:n,children:a("sidebarPanel.cancel")}),e.jsxs("button",{type:"button",className:"confirm",onClick:s,children:[e.jsx(x.x,{size:11}),a("sidebarPanel.delete")]})]})]})}const Pn="reasonix.splash.shown";function ni(){try{return sessionStorage.getItem(Pn)!=="1"}catch{return!0}}function pt(){try{sessionStorage.setItem(Pn,"1")}catch{}}function si({onDone:t}){const[n,s]=l.useState(!1),i=l.useRef(t);i.current=t,l.useEffect(()=>{const o=window.setTimeout(()=>s(!0),1350),d=window.setTimeout(()=>{pt(),i.current()},1800);return()=>{window.clearTimeout(o),window.clearTimeout(d)}},[]),l.useEffect(()=>{const o=d=>{d.key!=="Escape"&&d.key!=="Enter"&&d.key!==" "||(pt(),i.current())};return window.addEventListener("keydown",o),()=>window.removeEventListener("keydown",o)},[]);const r=()=>{pt(),t()};return e.jsx("div",{className:"splash","data-leaving":n,onClick:r,children:e.jsxs("div",{className:"splash-card",children:[e.jsx("div",{className:"splash-mark"}),e.jsx("div",{className:"splash-name",children:"Reasonix"}),e.jsx("div",{className:"splash-sub",children:a("app.splashSubtitle")}),e.jsxs("div",{className:"splash-dots",children:[e.jsx("span",{}),e.jsx("span",{}),e.jsx("span",{})]})]})})}const ai=7.2;function ii(t,n){const s=n==="CNY"?"¥":"$",i=n==="CNY"?t*ai:t;return`${s} ${i.toFixed(4)}`}function ri(t){return t>=1e3?`${(t/1e3).toFixed(1)}k`:`${t}`}function oi({settings:t,balance:n,usage:s,busy:i,ready:r,currency:o,theme:d,themeStyle:p,jobs:h,jobsOpen:g,onToggleJobs:k,onSetThemeStyle:v,onToggleCurrency:f,onOpenSettings:m,onOpenWorkdir:y}){const j=s.cacheHitTokens+s.cacheMissTokens,I=j>0?Math.round(s.cacheHitTokens/j*100):0,q=h.filter(E=>E.running).length,X=ii(s.totalCostUsd,o),R=n?`${n.currency==="USD"?"$":"¥"} ${n.total.toFixed(2)}`:"—",L=r?i?"running":"online":"off",[K,F]=l.useState(!1),J=l.useRef(null),ee=l.useRef(null);return l.useEffect(()=>{if(!K)return;const E=u=>{const z=u.target;J.current?.contains(z)||ee.current?.contains(z)||F(!1)};return window.addEventListener("pointerdown",E),()=>window.removeEventListener("pointerdown",E)},[K]),e.jsxs("footer",{className:"statusbar",children:[e.jsxs("span",{className:"seg",title:`API · ${t?.baseUrl??"api.deepseek.com"}`,children:[e.jsx("span",{className:L==="off"?"sw warn":"sw",style:L==="off"?{background:"var(--danger)"}:void 0}),e.jsx("span",{children:t?.baseUrl?.replace(/^https?:\/\//,"")??"api.deepseek.com"}),e.jsx("span",{className:"v",children:a(r?i?"statusbar.busy":"statusbar.online":"statusbar.offline")})]}),e.jsxs("span",{className:"seg",title:a("statusbar.cacheHit"),children:[e.jsx(x.zap,{size:11,style:{color:"var(--accent)"}}),e.jsx("span",{children:a("statusbar.cache")}),e.jsxs("span",{className:"v acc",children:[I,"%"]})]}),e.jsxs("span",{className:"seg",children:[e.jsx(x.cpu,{size:11}),e.jsx("span",{children:a("statusbar.tokens")}),e.jsx("span",{className:"v",children:ri(j)})]}),e.jsxs("span",{className:"seg",children:[e.jsx(x.coin,{size:11}),e.jsx("span",{children:a("statusbar.thisTurn")}),e.jsx("span",{className:"v ok",children:X})]}),e.jsx("span",{className:"grow"}),e.jsxs("span",{className:`seg jobs ${g?"active":""}`,onClick:k,title:jn(a("statusbar.jobsTip")),children:[e.jsx(x.cpu,{size:11}),e.jsx("span",{children:a("statusbar.jobs")}),e.jsx("span",{className:q>0?"v acc":"v",children:q})]}),t?.workspaceDir?e.jsxs("span",{className:"seg",title:a("statusbar.switchWorkspace",{workspace:t.workspaceDir}),style:y?{cursor:"pointer"}:void 0,onClick:E=>{if(!y)return;const u=E.currentTarget.getBoundingClientRect();y({bottom:window.innerHeight-u.top+6,left:u.left})},children:[e.jsx(x.folder,{size:11}),e.jsx("span",{className:"v",children:t.workspaceDir.split(/[\\/]/).pop()||"ws"})]}):null,e.jsxs("span",{className:"seg",title:`model · effort ${t?.reasoningEffort??"high"}`,onClick:m,children:[e.jsx(x.brain,{size:11,style:{color:"var(--violet)"}}),e.jsx("span",{className:"v vio",children:t?.model??"—"}),e.jsx("span",{className:"v",children:t?.reasoningEffort??"high"})]}),e.jsxs("span",{className:"seg",title:a("statusbar.switchCurrency"),onClick:f,children:[e.jsx(x.coin,{size:11}),e.jsx("span",{children:a("statusbar.balance")}),e.jsx("span",{className:"v ok",children:R})]}),e.jsxs("span",{ref:ee,className:`seg theme-trigger ${K?"active":""}`,title:a("statusbar.switchTheme"),onClick:()=>F(E=>!E),children:[d===se.DARK?e.jsx(x.moon,{size:11}):e.jsx(x.sun,{size:11}),e.jsx("span",{className:"v",children:a(`statusbar.themeStyle${p[0].toUpperCase()}${p.slice(1)}`)})]}),K?e.jsxs("div",{ref:J,className:"theme-pop",role:"menu","aria-label":a("settings.themeStyle"),children:[e.jsxs("div",{className:"theme-pop-head",children:[e.jsx("div",{className:"tt",children:a("settings.themeStyle")}),e.jsx("div",{className:"ss",children:a("statusbar.switchTheme")})]}),e.jsx("div",{className:"theme-pop-list",children:Tn.map(E=>e.jsxs("button",{type:"button",className:"theme-pop-item","data-on":p===E,"data-style":E,onClick:()=>{v(E),F(!1)},children:[e.jsxs("span",{className:"style-swatches","aria-hidden":"true",children:[e.jsx("span",{}),e.jsx("span",{}),e.jsx("span",{})]}),e.jsxs("span",{className:"txt",children:[e.jsx("span",{className:"nm",children:a(`statusbar.themeStyle${E[0].toUpperCase()}${E.slice(1)}`)}),e.jsx("span",{className:"md",children:He(E)===se.DARK?a("statusbar.themeDark"):a("statusbar.themeLight")})]}),p===E?e.jsx(x.check,{size:13}):null]},E))})]}):null]})}const St=`[CONVERSATION HISTORY SUMMARY — earlier turns folded for context efficiency]
11
+ {spec}`,noServers:"此会话中无 MCP 服务器。",tools:"个工具",inConfig:"在配置中 · 未加载",unbridgedTitle:"未桥接 · 在配置中",removeBtn:"移除",spec:"规格",whyUnbridged:"为什么未桥接?",whyUnbridgedDesc:"此规格存在于您的 config.json 中,但未桥接到实时会话。MCP 服务器在 reasonix code 启动时连接;仪表盘本身无法生成子进程。",whyUnbridgedHint:"激活方法:重启 reasonix code,然后刷新此仪表盘。",bridgeFailed:"桥接失败",bridgeFailedTitle:"桥接失败 · 在配置中",bridgeFailedHint:"已尝试桥接但失败。常见原因:URL 错误、需要鉴权、上游 404 / 5xx、本地命令缺失。修复后重启 reasonix code 重试。",pickHint:"选择左侧的 MCP 服务器以检查工具 / 资源 / 提示。",toolsTitle:"工具 · {count}",resourcesTitle:"资源 · {count}",promptsTitle:"提示 · {count}",colName:"名称",colDesc:"描述",colUri:"URI",marketplace:"市场",marketplaceSearch:"搜索注册表…",marketplaceLoading:"加载注册表…",marketplaceMore:"再加载 5 页",marketplaceMoreLabel:"再加载 50 条 · 当前 {shown} / {total}",marketplaceMoreHint:"需要从远端注册表再拉几页",marketplaceMoreCachedHint:"本地缓存已有更多条目",marketplaceExhausted:"已加载全部页",marketplaceExhaustedFull:"已展示全部 {total} 条 — 注册表耗尽",marketplaceCount:"已载入 {loaded} · 匹配 {matched} · 来源:{source}{cached}",marketplaceCachedSuffix:" · 缓存中",marketplaceNoMatches:"无匹配结果。换关键词或加载更多页。",marketplaceInstall:"安装",marketplacePickHint:"在左侧选择服务器,然后点安装。",marketplaceInstalled:"已安装 → {spec}",marketplaceInstalledBridged:"已安装并桥接 → {spec}",marketplaceAlready:"已安装过",marketplaceNeedsEnv:"需设置环境变量:{names}",marketplaceSourceTag:"[{source}]",marketplaceNoInstall:"Smithery 列表项 — 不暴露安装元数据;请直接 `npx -y @smithery/cli install {name}`",marketplaceFetchOnInstall:"Smithery 列表 — 安装时再拉详情。HTTP 服务映射为 streamable-http 远端;stdio 服务通过 @smithery/cli 运行。",marketplaceInstalledBadge:"已安装",marketplaceUninstall:"卸载",marketplaceEnvTitle:"必需的环境变量",marketplaceEnvHint:"下次启动 `reasonix code` 之前在 shell 里设好,桥接的服务器才能正常鉴权。",marketplaceRestartHint:"已写入 ~/.reasonix/config.json。重启 `reasonix code` 后服务器才会真正桥接(热重载在路线图上)。"},memory:{loading:"加载记忆…",files:"记忆 · {count} 个文件",exists:"已存在",create:"创建",noFiles:"暂无记忆文件。",pickHint:"选择左侧的记忆文件。",pickDesc:"项目 REASONIX.md 可提交;全局笔记存储在 ~/.reasonix/memory/。",chars:"{count} 个字符",saved:"已保存 {scope}",reloadHint:"在下次 /new 或会话重启时重新加载"},hooks:{loading:"加载钩子…",resolved:"已解析",eventMatrix:"事件矩阵",matrixSub:"{scripts} 个脚本 × {events} 个事件",noHooks:"未配置钩子。编辑下方的 JSON 以添加。",colScript:"脚本",noProject:"无活跃项目 — 在 reasonix code 中打开 /dashboard 以编辑项目钩子。",saveReload:"保存并重载",discard:"放弃更改",savedReloaded:"已保存并重载 {scope}",recentRuns:"近期运行",noRuns:"近期会话日志中无钩子运行记录。",colWhen:"时间",colPhase:"阶段",colHook:"钩子",colOutcome:"结果"},skills:{loading:"加载技能…",filterPlaceholder:"筛选技能",project:"项目",custom:"自定义",global:"全局",builtin:"内置",newSkill:"新技能",noDescription:"(无描述)",runs7d:"次运行 · 7 天",pickHint:"选择左侧的技能,或在上方创建新技能。",readOnlyBuiltin:"只读 · 内置",readOnlyCustom:"只读 · 自定义路径",builtinDesc:"内置技能随 Reasonix 一起发布;模型会自动识别。如需自定义,请创建同名的项目或全局技能。",saved:"已保存 {scope}/{name}",deleteConfirm:"删除技能 {scope}/{name}?",reloadHint:"在下次 /new 或会话重启时重新加载"},system:{loading:"加载健康状态…",failed:"健康检查失败:{error}",healthChecks:"健康检查",version:"版本",checking:"检查中",latest:"● 最新",outOfDate:"● 需要更新",versionPending:"版本检查中",upToDate:"已是最新",latestVer:"最新:{version}",sessions:"会话",ok:"● 正常",memory:"记忆",semanticIndex:"语义索引",built:"● 已构建",none:"— 无",runIndex:"运行 reasonix index 以构建",usageLog:"用量日志",backgroundJobs:"后台任务",noSession:"— 无会话",running:"{count} 个运行中",attachHint:"连接会话以查看任务",shellSpawn:"Shell + 生成",paths:"路径",home:"主目录",sessionsPath:"会话",memoryPath:"记忆",semanticPath:"语义",usagePath:"用量"},plans:{loading:"加载计划…",failed:"计划失败:{error}",noPlans:"暂无归档计划 — 运行调用 submit_plan 和 mark_step_complete 的轮次。",filterPlaceholder:"筛选计划",active:"进行中",done:"已完成",idle:"未开始",steps:"步骤",pickHint:"选择左侧的计划。",noTitle:"(无标题)",stepTimeline:"步骤时间线 · {done} / {total}",step:"步骤 {n}"},semantic:{codeRequired:"语义 — 需要代码模式",indexBuilt:"索引已构建",noIndex:"尚无索引",ready:"就绪",setupNeeded:"需要设置",installOllama:"安装 Ollama",installOllamaDesc:"Reasonix 不会为您运行包管理器。请先安装 Ollama,然后返回:",macWindows:"macOS / Windows:",download:"从 ollama.com/download 下载",linux:"Linux:",refreshHint:"安装后刷新 — 此面板将提供启动守护进程和拉取 {model} 的选项。",daemon:"守护进程",daemonDesc:"ollama 在您的 PATH 中,但 HTTP 守护进程不可达。",startDaemon:"启动守护进程",runsOllama:"以分离模式运行 ollama serve",model:"模型",modelMissing:"{model} 尚未安装。",modelSize:"首次拉取约 270 MB。",pulling:"拉取中…",pullModel:"拉取 {model}",indexStatus:"索引状态",builtStatus:"● 已构建",incompatibleStatus:"● 不兼容",chunks:"分块",files:"文件",dim:"维度",size:"大小",lastBuild:"上次构建",builtWith:"构建来源",currentTarget:"当前目标",incompatibleHint:"磁盘上的这个索引是为不同的 provider 或 model 构建的。运行“完全重建”即可替换。",runIndexHint:"运行索引以启用 semantic_search。",reIndex:"重建索引",build:"构建",rebuild:"完全重建",stop:"停止",provider:"提供方",providerType:"服务类型",openaiCompat:"OpenAI-Compatible",apiUrl:"API URL",apiKey:"API Key",apiKeyStoredNote:"API Key 仅保存在本地,不会发送到第三方。",customRequestBody:"自定义请求体",invalidCustomRequestBody:"自定义请求体必须是合法 JSON:{error}",customRequestBodyMustBeObject:"自定义请求体必须是 JSON 对象。",saveBeforeIndex:"请先保存语义设置,再启动索引。",extraBody:"扩展请求体",batchSize:"批次大小",keepExistingKey:"留空则保留现有 Key",remoteProvider:"远程向量服务",remoteProviderDesc:"在这里配置 OpenAI-Compatible embeddings 的完整 URL。Reasonix 会严格使用你提供的 URL 发起请求。",ollama:"Ollama",binary:"二进制",found:"已找到",missing:"缺失",daemonStatus:"守护进程",up:"运行中",down:"已停止",pulled:"已拉取",indexConfig:"索引配置",reset:"重置",excludeDirs:"排除目录",excludeFiles:"排除文件",excludeExts:"排除扩展名",excludePatterns:"排除模式",glob:"glob",respectGitignore:"遵循 .gitignore",maxFileBytes:"最大文件字节数",skipLarger:"跳过大于 ~{size} MiB 的文件",preview:"预览",searchPlaceholder:"描述要查找的内容 — '哪里处理中止信号'",searching:"搜索中…",results:"{count} 个结果 · {ms}ms · {model}",noMatches:"没有超过分数阈值的匹配。",previewSummary:"预览 — 将索引 {included} 个文件,跳过 {skipped} 个",nothingSkipped:"无跳过 — 所有遍历的文件都将被索引。",firstIncluded:"前 {count} 个包含的文件",job:"任务",phaseSetup:"初始化中",phaseScan:"扫描文件",phaseEmbed:"嵌入分块",phaseWrite:"写入索引",phaseDone:"完成",phaseError:"错误",phaseCancelled:"已停止",setupFailed:"初始化失败",stopping:"停止中",scanned:"已扫描 {count}",changed:"已变更 {count}",skipped:"已跳过 {count}",chunksProgress:"{done} / {total}({pct}%)",result:"结果",added:"已添加 {count}",removed:"已移除 {count}",failed:"失败 {count}",skippedFiles:"{total} 个文件({details})",rebuildStarted:"已启动完全重建",incrementalStarted:"已启动增量索引",stopRequested:"已请求停止 — 当前分块批次将首先完成",startingDaemon:"正在启动 ollama 守护进程(15 秒超时)…",daemonUp:"守护进程已启动",daemonTimeout:"守护进程未在规定时间内启动 — 请手动检查 ollama serve",pullingModel:"正在拉取 {model} — 首次安装可能需要几分钟",savedConfig:"已保存 · {count} 个字段已更新 · 重新运行索引以应用",runningPreview:"正在对项目根目录执行干运行…",exclude:"排除"},modal:{shellTitle:"Shell 命令",shellBgTitle:"后台进程",shellSubtitle:"模型想要运行一条 Shell 命令",shellBgSubtitle:"长时间运行 — 批准后继续运行",pathTitle:"沙箱外文件访问",pathSubtitle:"{intent} · 通过 {tool}",pathRead:"读取",pathWrite:"写入",pathSandboxLabel:"沙箱",pathAllowPrefixLabel:"允许前缀",runOnce:"运行一次",alwaysAllow:'始终允许 "{prefix}"',deny:"拒绝",choiceTitle:"模型需要您选择",typeOwn:"输入自定义回答",typeOwnSummary:"以上选项都不合适 — 写一个自由格式的回复。",typePlaceholder:"输入自由格式的回答…",send:"发送",cancel:"取消",cancelSummary:"放弃此问题。模型将询问您实际想要什么。",planTitle:"计划已提交",planSubtitle:"模型提出了一项计划;请审阅后选择",approveInstructions:"可选的最后指示 / 对开放问题的回答(Enter 发送空白)",refinePlaceholder:"需要更改什么?请具体说明。",approve:"批准",refine:"优化",sendRefinement:"发送优化",editTitle:"编辑待审阅",editSubtitle:"{path} · {remaining} / {total} 个块剩余",before:"修改前",after:"修改后",workspaceTitle:"模型想要切换工作区",workspaceSubtitle:"后续所有文件 / Shell / 记忆工具将针对新根目录解析",switchBtn:"切换 (Enter)",denyBtn:"拒绝 (Esc)",stepComplete:"步骤完成{counter}",continueBtn:"继续",reviseBtn:"修订…",stopBtn:"停止",revisionTitle:"模型提出了计划修订",sendRevision:"发送修订",accept:"接受",reject:"拒绝",arguments:"参数",revisePlaceholder:"下一步之前需要更改什么?留空则直接继续。",pickerFilter:"过滤…",pickerEmpty:"暂无内容。",pickerLoadMore:"加载更多",pickerPick:"打开",pickerInstall:"安装",pickerUninstall:"卸载",pickerRename:"重命名…",pickerNew:"新建…",pickerNewPlaceholder:"名称(留空使用默认)",viewerClose:"关闭"},error:{title:"仪表盘出错了",body:"TUI 不受影响——只有这个浏览器标签出了问题。通常可以直接关闭并继续使用,不会打断智能体。",copyDetails:"复制详情",copied:"已复制 ✓",reportOnGithub:"在 GitHub 上报告",dismiss:"关闭 (Esc)",crashing:"此面板持续崩溃 — {name}",retry:"重试",recovering:"恢复中…"},fmt:{justNow:"刚刚",minutesAgo:"{n} 分钟前",hoursAgo:"{n} 小时前",daysAgo:"{n} 天前"},cards:{applied:"已应用",cacheHit:"缓存命中",checkpointRewind:"检查点回退",cost:"费用",diffApply:"应用",diffApplyChanges:"应用更改",diffAwaiting:"待审阅",diffDiscard:"丢弃",done:"完成",elapsed:"耗时",error:"错误",errorName:"错误",failed:"失败",hits:"命中",memoryCountSuffix:"条记忆",memoryName:"记忆",output:"输出",planDefaultTitle:"计划",prompt:"提示词",compactionMeta:"{chars} 字符",compactionName:"已压缩历史",reasoningComplete:"推理完成",reasoningName:"推理",result:"结果",running:"运行中",searchName:"搜索",shellAlwaysAllow:"始终允许",shellAwaiting:"待审批",shellExecuteHint:"执行此命令?",shellReject:"拒绝",shellRun:"运行",shellRunning:"运行中",streaming:"输出中",subagentDone:"子代理完成",subagentDoneProgress:"子代理完成 ({pct}%)",subagentFailed:"子代理失败",subagentRunning:"子代理运行中"},planBadge:{blocked:"已阻塞",done:"完成",failed:"失败",pending:"待处理",running:"运行中"},composer:{atHeader:"提及文件",close:"关闭",commandPalette:"命令面板",commands:"命令",commandsLabel:"命令",confirm:"确认",imageFilterName:"图片",insertFile:"插入文件",insertImage:"插入图片",interrupt:"中断",mentionFiles:"提及文件",mentionLabel:"提及",newline:"换行",noMatches:"无匹配",placeholder:"输入提示词…",queue:"队列",queueCount:"{count} 个排队",select:"选择",send:"发送",slashHeader:"斜杠命令",switchModel:"切换模型",switchEffort:"切换推理强度",workspaceRoot:"工作区根目录"},contextPanel:{allow:"允许",ask:"询问",autoApproveTitle:"自动审批",cacheKey:"缓存",contextTokens:"上下文 tokens",fileInContext:"在上下文中",fileModified:"已修改",filesCount:"{count} 个文件",filesTab:"文件",filesTitle:"文件",freeKey:"空闲",itemCount:"{count} 个项目",mcpConfigured:"已配置",mcpConnecting:"连接中…",mcpDisabled:"已禁用",mcpEmpty:"无 MCP 服务器",mcpFailed:"失败",mcpReady:"就绪",mcpReadyAll:"全部就绪",mcpReadySome:"部分就绪",mcpTitle:"MCP",mcpTools:"工具",memoryTab:"记忆",memoryTitle:"记忆",noFilesMsg:"上下文中无文件",noMemoriesMsg:"无记忆",reservedKey:"保留",ruleReadOnly:"只读",ruleReview:"审阅",ruleShellAllowlist:"Shell 允许列表",rulesTab:"规则",ruleWritesAsk:"写入需询问",ruleYolo:"YOLO",scopeGlobal:"全局",scopeProject:"项目",toolsTab:"工具",usedKey:"已用"},dragDrop:{overlay:"拖放文件到此处"},extraCards:{approve:"批准",balance:"余额",cache:"缓存",cacheHit:"缓存命中",contextWindow:"上下文窗口",doctorTitle:"诊断",output:"输出",prompt:"提示词",reasoning:"推理",reject:"拒绝",sessionCost:"会话成本",sessionUsage:"会话用量",topToolsUsage:"热门工具",unknownKind:"未知",memoryUser:"用户",memoryFeedback:"反馈",memoryProject:"项目",memoryReference:"参考"},jobs:{empty:"无后台任务",exited:"已退出",kbClose:"关闭",kbToggle:"切换",running:"运行中",stop:"停止",stopAll:"全部停止",stopAllTip:"停止所有任务",stopOne:"停止",title:"后台任务"},live:{deliveredWaiting:"等待下一条消息",reasoning:"推理",running:"运行中",secondsAgo:"{n} 秒前",you:"你"},markdown:{copied:"已复制!",copy:"复制",externalLinkTitle:"在新标签中打开",filePillTitle:"打开文件",localLinkTitle:"打开链接"},palette:{abort:"中止",abortHint:"中止当前请求",about:"关于",clearChat:"清除对话",clearChatHint:"清除对话",closeTab:"关闭标签",closeTabHint:"关闭当前标签",copyConv:"复制对话",copyConvHint:"复制对话为 Markdown",copyLast:"复制上条回复",copyLastHint:"复制上条助手消息",countSuffix:"个项目",empty:"无匹配命令",exportMd:"导出为 Markdown",exportMdHint:"导出对话为 Markdown 文件",focusComposer:"聚焦编辑器",footClose:"关闭",footMove:"移动",footRun:"运行",groupAction:"操作",groupNav:"导航",groupSettings:"设置",groupWorkspace:"工作区",newChat:"新建对话",newChatHint:"开始新对话",newTab:"新建标签",newTabHint:"打开新标签",pickWorkspace:"切换工作区",pickWorkspaceHint:"更改工作区",searchPlaceholder:"搜索命令…",settings:"设置",settingsHint:"打开设置"},panel:{renderError:"面板崩溃"},sidebarPanel:{approvalRules:"审批规则",cancel:"取消",commandPalette:"命令面板",daysAgo:"{n} 天前",delete:"删除",deleteSession:"删除会话",hoursAgo:"{n} 小时前",justNow:"刚刚",loading:"加载中…",messageCount:"{count} 条消息",minutesAgo:"{n} 分钟前",newChat:"新建对话",noMatches:"无匹配",noSessions:"无会话",recent:"最近",searchSessions:"搜索会话…",sessionTitle:"会话",settings:"设置",weeksAgo:"{n} 周前"},statusbar:{balance:"余额",busy:"忙碌",cache:"缓存",cacheHit:"缓存命中",jobs:"任务",jobsTip:"后台任务",offline:"离线",online:"在线",switchCurrency:"切换货币",switchTheme:"切换主题",switchWorkspace:"切换工作区",themeDark:"深色",themeLight:"浅色",themeStyleGraphite:"石墨",themeStyleSandstone:"砂岩",themeStylePorcelain:"瓷白",themeStyleMidnight:"午夜",thisTurn:"本轮",tokens:"Tokens"},thread:{activePlan:"活跃计划",allowRead:"允许读取",allowWrite:"允许写入",alwaysAllow:"始终允许",alwaysAllowPrefix:"始终允许 {prefix}",approve:"批准",approveRewrite:"批准重写",cancel:"取消",checkpointKind:"检查点",checkpointSub:"保存当前状态",checkpointTitle:"创建检查点",collapse:"折叠",continue:"继续",copyMessage:"复制消息",copyResponse:"复制回复",execute:"执行",keepOriginal:"保留原始",keepSteps:"保留步骤",optionCount:"{count} 个选项",pathAccessKind:"路径访问",planConfirmationKind:"计划审批",planRevisionKind:"计划修订",planRunning:"计划进行中",planStepCount:"步骤 {done}/{total}",readPathOutsideSandbox:"沙箱外读取路径",refine:"优化",reject:"拒绝",revise:"修订",revisionMeta:"修订",rewritePlan:"重写计划",risk:"风险评估",riskMedium:"中等风险",runBackgroundCommand:"后台运行",runCommand:"运行命令",shellConfirmationKind:"Shell 确认",startPlan:"启动计划",stop:"停止",subagent:"子代理",userChoiceKind:"用户选择",writePathOutsideSandbox:"沙箱外写入路径",you:"你"},workdir:{browse:"浏览…",cancel:"取消",empty:"无工作区",emptyDir:"无子目录。",go:"前往",goTip:"跳转到该路径",loading:"加载中…",openHere:"打开此目录",pathPlaceholder:"绝对路径…",promptWeb:"输入要打开的工作区绝对路径:",searchPlaceholder:"搜索工作区…",title:"工作区"},about:{close:"关闭",repo:"仓库",sidebarLabel:"关于",tagline:"AI 驱动的编程助手",version:"版本"},effort:{lowDesc:"最快 — 极少推理",mediumDesc:"平衡",highDesc:"默认 — vLLM / Azure 安全",maxDesc:"DeepSeek 扩展;标准 OpenAI / vLLM 会拒绝"},editMode:{plan:"计划",planHint:"只读模式 · 所有写工具都不会派发",review:"审阅",reviewHint:"编辑和非允许列表的 shell 命令都会先询问",auto:"自动",autoHint:"编辑自动应用,shell 仍会询问",yolo:"YOLO",yoloHint:"编辑和 shell 都自动运行,绕过允许列表"}},yn=["en","zh-CN","de"],kn=new Set(yn),Us={en:"English","zh-CN":"简体中文",de:"Deutsch"},wn="reasonix.lang",et=[];function Ks(){try{const s=localStorage.getItem(wn);if(s&&kn.has(s))return s}catch{}const n=(typeof navigator<"u"?navigator.language:"").toLowerCase();return n.startsWith("zh")?"zh-CN":n.startsWith("de")?"de":"en"}let De=Ks();function vn(t){if(!(typeof document>"u"))try{document.documentElement.lang=t}catch{}}vn(De);function Ws(){return De}function Sn(){return yn}function jn(t){return Us[t]}function Cn(t){if(!(!kn.has(t)||t===De)){De=t;try{localStorage.setItem(wn,t)}catch{}vn(t);for(const n of et)n()}}function $(){const[,t]=l.useState(0);return l.useEffect(()=>{const n=()=>t(s=>s+1);return et.push(n),()=>{const s=et.indexOf(n);s>=0&&et.splice(s,1)}},[]),De}const Gs={en:A,"zh-CN":$s,de:Fs};function Vs(t,n){const s=n.split(".");let i=t;for(const r of s)if(i&&typeof i=="object"&&r in i)i=i[r];else return n;return typeof i=="string"?i:n}function a(t,n){const s=Vs(Gs[De],t);return n?s.replace(/\{(\w+)\}/g,(i,r)=>r in n?String(n[r]):`{${r}}`):s}function It(){return typeof document>"u"?!1:document.documentElement.dataset.platform==="macos"}function zt(t,n){switch(t){case"mod":case"⌘":return n?"⌘":"Ctrl";case"shift":case"⇧":return n?"⇧":"Shift";case"enter":case"⏎":return"Enter";case"tab":case"⇥":return"Tab";case"esc":return"Esc";case"updown":case"↑↓":return"↑↓";default:return t}}function Js(t){const n=It();return t.map(s=>zt(s,n)).join(n?"":"+")}function Nn(t){return t.replace(/⌘/g,zt("mod",It()))}function G({keys:t,className:n}){const s=It();return e.jsx("span",{className:["shortcut",n].filter(Boolean).join(" "),children:t.map((i,r)=>e.jsx("kbd",{"data-key":i,children:zt(i,s)},`${i}-${r}`))})}function Ys(t=!0){const[n,s]=l.useState(!1);return l.useEffect(()=>{if(!t)return;const i=r=>{(r.ctrlKey||r.metaKey)&&(r.key==="k"||r.key==="K")?(r.preventDefault(),s(d=>!d)):r.key==="Escape"&&s(!1)};return window.addEventListener("keydown",i),()=>window.removeEventListener("keydown",i)},[t]),{open:n,setOpen:s}}function Qs(t){const n=[{id:"new-chat",group:"nav",label:a("palette.newChat"),hint:a("palette.newChatHint"),icon:e.jsx(es,{size:13}),shortcut:["mod","N"],run:t.newChat},{id:"new-tab",group:"nav",label:a("palette.newTab"),hint:a("palette.newTabHint"),icon:e.jsx(ts,{size:13}),shortcut:["mod","T"],run:t.newTab}];return t.canCloseTab&&n.push({id:"close-tab",group:"nav",label:a("palette.closeTab"),hint:a("palette.closeTabHint"),icon:e.jsx(ns,{size:13}),shortcut:["mod","W"],run:t.closeTab}),n.push({id:"focus-composer",group:"nav",label:a("palette.focusComposer"),icon:e.jsx(ss,{size:13}),shortcut:["mod","L"],run:t.focusComposer}),t.busy&&n.push({id:"abort",group:"action",label:a("palette.abort"),hint:a("palette.abortHint"),icon:e.jsx(as,{size:13}),shortcut:["esc"],run:t.abort}),t.hasMessages&&(n.push({id:"copy-last",group:"action",label:a("palette.copyLast"),hint:a("palette.copyLastHint"),icon:e.jsx(Kt,{size:13}),run:t.copyLast}),n.push({id:"copy-conv",group:"action",label:a("palette.copyConv"),hint:a("palette.copyConvHint"),icon:e.jsx(Kt,{size:13}),run:t.conversationCopy}),n.push({id:"export-md",group:"action",label:a("palette.exportMd"),hint:a("palette.exportMdHint"),icon:e.jsx(is,{size:13}),run:t.exportMarkdown}),n.push({id:"clear-chat",group:"action",label:a("palette.clearChat"),hint:a("palette.clearChatHint"),icon:e.jsx(rs,{size:13}),run:t.clearChat})),n.push({id:"pick-workspace",group:"workspace",label:a("palette.pickWorkspace"),hint:a("palette.pickWorkspaceHint"),icon:e.jsx(os,{size:13}),run:t.pickWorkspace}),n.push({id:"settings",group:"settings",label:a("palette.settings"),hint:a("palette.settingsHint"),icon:e.jsx(ls,{size:13}),run:t.openSettings}),n.push({id:"about",group:"settings",label:a("palette.about"),icon:e.jsx(cs,{size:13}),run:t.about}),n}const Zs=["nav","action","workspace","settings"];function Jt(t){switch(t){case"nav":return a("palette.groupNav");case"action":return a("palette.groupAction");case"workspace":return a("palette.groupWorkspace");case"settings":return a("palette.groupSettings")}}function Xs({open:t,onClose:n,commands:s}){$();const[i,r]=l.useState(""),[o,d]=l.useState(0),p=l.useRef(null),h=l.useRef(null),g=l.useMemo(()=>{const f=i.trim().toLowerCase();return f?s.filter(m=>[m.label,m.hint].filter(Boolean).join(" ").toLowerCase().includes(f)):s},[i,s]);l.useEffect(()=>{t&&(r(""),d(0),requestAnimationFrame(()=>p.current?.focus()))},[t]),l.useEffect(()=>{d(f=>Math.min(f,Math.max(0,g.length-1)))},[g.length]),l.useEffect(()=>{h.current?.querySelector(`[data-idx="${o}"]`)?.scrollIntoView({block:"nearest"})},[o]);const k=l.useMemo(()=>{const f=new Map;for(const m of g){const y=f.get(m.group)??[];y.push(m),f.set(m.group,y)}return Zs.map(m=>({group:m,items:f.get(m)??[]})).filter(m=>m.items.length>0)},[g]);if(!t)return null;const v=f=>{f.run(),n()};return e.jsx("div",{className:"cmdk-mask",onMouseDown:n,children:e.jsxs("div",{className:"cmdk",onMouseDown:f=>f.stopPropagation(),children:[e.jsxs("div",{className:"cmdk-head",children:[e.jsx(ds,{size:14}),e.jsx("input",{ref:p,placeholder:a("palette.searchPlaceholder"),value:i,onChange:f=>r(f.target.value),onKeyDown:f=>{if(f.key==="ArrowDown")f.preventDefault(),d(m=>Math.min(m+1,g.length-1));else if(f.key==="ArrowUp")f.preventDefault(),d(m=>Math.max(m-1,0));else if(f.key==="Enter"){f.preventDefault();const m=g[o];m&&v(m)}}}),e.jsx("span",{className:"hint",children:e.jsx(G,{keys:["esc"]})})]}),e.jsxs("div",{className:"cmdk-body",ref:h,children:[g.length===0?e.jsx("div",{className:"cmdk-empty",children:a("palette.empty")}):null,k.map(f=>e.jsxs("div",{className:"cmdk-group",children:[e.jsx("div",{className:"cmdk-gh",children:Jt(f.group)}),f.items.map(m=>{const y=g.indexOf(m);return e.jsxs("div",{"data-idx":y,className:"cmdk-row","data-active":y===o,onMouseEnter:()=>d(y),onClick:()=>v(m),children:[e.jsx("span",{className:"ic",children:m.icon}),e.jsx("span",{className:"l",children:m.label}),e.jsx("span",{className:"g",children:Jt(m.group)}),m.shortcut?e.jsx("span",{className:"kb",children:e.jsx(G,{keys:m.shortcut})}):e.jsx("span",{className:"kb-empty"})]},m.id)})]},f.group))]}),e.jsxs("div",{className:"cmdk-foot",children:[e.jsxs("span",{children:[e.jsx(G,{keys:["updown"]}),a("palette.footMove")]}),e.jsxs("span",{children:[e.jsx(G,{keys:["enter"]}),a("palette.footRun")]}),e.jsxs("span",{children:[e.jsx(G,{keys:["esc"]}),a("palette.footClose")]}),e.jsxs("span",{style:{marginLeft:"auto",color:"var(--muted)"},children:[g.length," ",a("palette.countSuffix")]})]})]})})}function ea({message:t}){return t?t.yolo?e.jsxs("div",{className:"toast toast-yolo",children:[e.jsx("span",{className:"toast-yolo-badge",children:"YOLO"}),t.msg]}):e.jsx("div",{className:"toast",children:t.msg}):null}const ta={plain:{color:"#dde1ea",backgroundColor:"transparent"},styles:[{types:["comment","prolog","doctype","cdata"],style:{color:"#6d6e80",fontStyle:"italic"}},{types:["punctuation"],style:{color:"#a8a9b8"}},{types:["property","tag","boolean","number","constant","symbol","deleted"],style:{color:"#fbbf24"}},{types:["selector","attr-name","string","char","builtin","inserted"],style:{color:"#86dcb1"}},{types:["operator","entity","url"],style:{color:"#84b9e8"}},{types:["atrule","attr-value","keyword"],style:{color:"#b4a8f0"}},{types:["function","class-name","maybe-class-name"],style:{color:"#84b9e8",fontWeight:"500"}},{types:["regex","important","variable"],style:{color:"#f0c062"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["italic"],style:{fontStyle:"italic"}}]},na={plain:{color:"#24292e",backgroundColor:"transparent"},styles:[{types:["comment","prolog","doctype","cdata"],style:{color:"#6a737d",fontStyle:"italic"}},{types:["punctuation"],style:{color:"#24292e"}},{types:["property","tag","boolean","number","constant","symbol","deleted"],style:{color:"#d73a49"}},{types:["selector","attr-name","string","char","builtin","inserted"],style:{color:"#032f62"}},{types:["operator","entity","url"],style:{color:"#d73a49"}},{types:["atrule","attr-value","keyword"],style:{color:"#d73a49"}},{types:["function","class-name","maybe-class-name"],style:{color:"#6f42c1",fontWeight:"500"}},{types:["regex","important","variable"],style:{color:"#e36209"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["italic"],style:{fontStyle:"italic"}}]};function sa(){const[t,n]=l.useState(()=>document.documentElement.dataset.theme==="light"?"light":"dark"),s=l.useRef(t);return l.useEffect(()=>{const i=document.documentElement,r=()=>{const d=i.dataset.theme==="light"?"light":"dark";d!==s.current&&(s.current=d,n(d))},o=new MutationObserver(r);return o.observe(i,{attributes:!0,attributeFilter:["data-theme"]}),()=>o.disconnect()},[]),t==="dark"?ta:na}function aa({text:t,lang:n,startLine:s=1,showLineNumbers:i=!0}){const r=sa();return e.jsx(ms,{theme:r,code:t,language:n,children:({className:o,tokens:d,getLineProps:p,getTokenProps:h})=>e.jsx("pre",{className:`codeview ${o}`,children:d.map((g,k)=>e.jsxs("div",{...p({line:g}),className:"codeview-line",children:[i&&e.jsx("span",{className:"codeview-line-num",children:k+s}),e.jsx("span",{className:"codeview-line-content",children:g.map((v,f)=>e.jsx("span",{...h({token:v})},f))})]},k))})})}async function Tn(t,n,s){if(t&&t.trim()){await ve("open_in_editor",{command:t,path:n,line:s??null});return}await fn(n)}const _t=l.createContext({}),ia=_t.Provider;function An(t,n){if(!n||/^[a-zA-Z]:[\\/]/.test(t)||t.startsWith("/"))return t;const s=n.includes("\\")?"\\":"/";return`${n.replace(/[\\/]$/,"")}${s}${t.replace(/^\.[\\/]/,"")}`}const ra="ts|tsx|mts|cts|js|jsx|mjs|cjs|py|pyi|rs|go|json|jsonc|md|mdx|css|scss|less|html|htm|xml|svg|yaml|yml|toml|sh|bash|zsh|fish|sql|rb|java|kt|swift|c|cpp|cc|cxx|h|hpp|hxx|cs|php|lua|dart|ex|exs|erl|hs|clj|cljs|zig|vue|svelte|graphql|gql|proto",dt=new RegExp(`(^|[\\s\`'"(\\[])((?:[\\w.-]+\\/)+[\\w.-]+\\.(?:${ra}))(?::(\\d+(?:-\\d+)?))?(?=[\\s.,;!?\\]\\)'"\`]|$)`,"g");function oa({path:t,line:n}){$();const s=l.useContext(_t),[i,r]=l.useState(null),o=n?`${t}:${n}`:t,d=async()=>{try{const h=An(t,s.dir),g=n?Number.parseInt(n.split("-")[0]??n,10):void 0;await Tn(s.editor,h,Number.isFinite(g)?g:void 0),r("open"),setTimeout(()=>r(null),1200)}catch{try{await navigator.clipboard.writeText(o),r("copy"),setTimeout(()=>r(null),1200)}catch{}}},p=async h=>{h.stopPropagation();try{await navigator.clipboard.writeText(o),r("copy"),setTimeout(()=>r(null),1200)}catch{}};return e.jsxs("span",{className:`file-pill ${i?"done":""}`,role:"button",tabIndex:0,onClick:d,onContextMenu:h=>{h.preventDefault(),p(h)},onKeyDown:h=>{(h.key==="Enter"||h.key===" ")&&(h.preventDefault(),d())},title:a("markdown.filePillTitle"),children:[e.jsx(ps,{size:10,className:"file-pill-icon"}),e.jsx("span",{className:"file-pill-path",children:t}),n&&e.jsxs("span",{className:"file-pill-line",children:[":",n]}),i&&e.jsx(Mt,{size:10,className:"file-pill-check"})]})}function la(t){dt.lastIndex=0;const n=[];let s=0,i=dt.exec(t);for(;i!==null;){const r=i[1]??"",o=i[2],d=i[3],p=i.index+r.length;p>s&&n.push(t.slice(s,p)),n.push(e.jsx(oa,{path:o,line:d},`fp-${p}`)),s=p+o.length+(d?d.length+1:0),i=dt.exec(t)}return n.length===0?t:(s<t.length&&n.push(t.slice(s)),n)}function tt(t){return l.Children.map(t,n=>{if(typeof n=="string")return la(n);if(l.isValidElement(n)){const s=n.props;if(s.children!==void 0)return l.cloneElement(n,void 0,tt(s.children))}return n})}const Pn=l.memo(function({source:n}){return e.jsx("div",{className:"markdown",children:e.jsx(hs,{remarkPlugins:[fs,bs,xs],rehypePlugins:[[gs,{throwOnError:!1}]],components:{pre:({children:s})=>{const i=vt(s).trimEnd();return e.jsx(ua,{lang:da(s),text:i})},code:({className:s,children:i})=>e.jsx("code",{className:s,children:i}),a:({href:s,children:i})=>e.jsx(ca,{href:s,children:i}),p:({children:s})=>e.jsx("p",{children:tt(s)}),li:({children:s})=>e.jsx("li",{children:tt(s)}),td:({children:s})=>e.jsx("td",{children:tt(s)})},children:n})})});function ca({href:t,children:n}){$();const s=l.useContext(_t),[i,r]=l.useState(!1),o=!!t&&/^https?:\/\//i.test(t),d=async p=>{if(p.preventDefault(),!!t){if(o){try{await Oe(t)}catch{window.open(t,"_blank","noopener,noreferrer")}return}try{const h=t.replace(/^file:\/\//,""),g=An(h,s.dir);await Tn(s.editor,g)}catch{try{await navigator.clipboard.writeText(t),r(!0),setTimeout(()=>r(!1),1200)}catch{}}}};return e.jsxs("a",{href:t??"#",onClick:d,className:`md-link ${o?"external":"local"} ${i?"done":""}`,title:o?a("markdown.externalLinkTitle",{href:t??""}):a("markdown.localLinkTitle",{href:t??""}),children:[n,o?e.jsx(us,{size:10,className:"md-link-icon"}):i?e.jsx(Mt,{size:10,className:"md-link-icon"}):null]})}function da(t){for(const n of l.Children.toArray(t))if(l.isValidElement(n)){const s=n.props.className;if(typeof s=="string"){const i=s.match(/language-([\w-]+)/);if(i)return i[1]}}return"text"}function vt(t){return typeof t=="string"||typeof t=="number"?String(t):Array.isArray(t)?t.map(vt).join(""):l.isValidElement(t)?vt(t.props.children):""}function ua({lang:t,text:n}){$();const[s,i]=l.useState(!1),r=async()=>{try{await navigator.clipboard.writeText(n),i(!0),setTimeout(()=>i(!1),1400)}catch{}};return e.jsxs("div",{className:"codeblock",children:[e.jsxs("div",{className:"codeblock-head",children:[e.jsx("span",{className:"codeblock-lang",children:t}),e.jsxs("button",{type:"button",className:`copy-btn ${s?"done":""}`,onClick:r,children:[s?e.jsx(Mt,{size:11}):e.jsx(Et,{size:11}),a(s?"markdown.copied":"markdown.copy")]})]}),e.jsx(aa,{text:n,lang:t})]})}function P({size:t=14,children:n,...s}){return e.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",width:t,height:t,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round",...s,children:n})}const x={plus:t=>e.jsx(P,{...t,children:e.jsx("path",{d:"M12 5v14M5 12h14"})}),search:t=>e.jsxs(P,{...t,children:[e.jsx("circle",{cx:"11",cy:"11",r:"7"}),e.jsx("path",{d:"m20 20-3.5-3.5"})]}),send:t=>e.jsx(P,{...t,children:e.jsx("path",{d:"M4 12 20 4l-6 16-3-7-7-1Z"})}),chev:t=>e.jsx(P,{...t,children:e.jsx("path",{d:"m6 9 6 6 6-6"})}),chevR:t=>e.jsx(P,{...t,children:e.jsx("path",{d:"m9 6 6 6-6 6"})}),check:t=>e.jsx(P,{...t,children:e.jsx("path",{d:"m5 12 5 5L20 7"})}),x:t=>e.jsx(P,{...t,children:e.jsx("path",{d:"M6 6l12 12M18 6 6 18"})}),terminal:t=>e.jsxs(P,{...t,children:[e.jsx("rect",{x:"3",y:"4",width:"18",height:"16",rx:"2"}),e.jsx("path",{d:"m7 9 3 3-3 3M13 15h4"})]}),brain:t=>e.jsxs(P,{...t,children:[e.jsx("path",{d:"M9 4a3 3 0 0 0-3 3v0a3 3 0 0 0-2 5 3 3 0 0 0 2 5 3 3 0 0 0 3 3h0a3 3 0 0 0 3-3V4"}),e.jsx("path",{d:"M15 4a3 3 0 0 1 3 3 3 3 0 0 1 2 5 3 3 0 0 1-2 5 3 3 0 0 1-3 3"})]}),list:t=>e.jsx(P,{...t,children:e.jsx("path",{d:"M4 6h2M4 12h2M4 18h2M9 6h11M9 12h11M9 18h11"})}),diff:t=>e.jsxs(P,{...t,children:[e.jsx("path",{d:"M7 4v11a3 3 0 0 0 3 3h2M17 20V9a3 3 0 0 0-3-3h-2"}),e.jsx("circle",{cx:"7",cy:"20",r:"2"}),e.jsx("circle",{cx:"17",cy:"4",r:"2"})]}),globe:t=>e.jsxs(P,{...t,children:[e.jsx("circle",{cx:"12",cy:"12",r:"9"}),e.jsx("path",{d:"M3 12h18M12 3a14 14 0 0 1 0 18M12 3a14 14 0 0 0 0 18"})]}),link:t=>e.jsxs(P,{...t,children:[e.jsx("path",{d:"M10 14a4 4 0 0 1 0-6l3-3a4 4 0 0 1 6 6l-2 2"}),e.jsx("path",{d:"M14 10a4 4 0 0 1 0 6l-3 3a4 4 0 0 1-6-6l2-2"})]}),wrench:t=>e.jsx(P,{...t,children:e.jsx("path",{d:"M14 7a4 4 0 1 0 4 4l3 3-3 3-3-3a4 4 0 0 1-4-4l-3-3-3 3 3 3a4 4 0 0 0 6 0"})}),bot:t=>e.jsxs(P,{...t,children:[e.jsx("rect",{x:"4",y:"7",width:"16",height:"12",rx:"3"}),e.jsx("path",{d:"M12 3v4M8 12h.01M16 12h.01M9 16h6"})]}),archive:t=>e.jsxs(P,{...t,children:[e.jsx("rect",{x:"3",y:"3",width:"18",height:"5",rx:"1"}),e.jsx("path",{d:"M5 8v11a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1V8M10 12h4"})]}),bookmark:t=>e.jsx(P,{...t,children:e.jsx("path",{d:"M6 3h12v18l-6-4-6 4Z"})}),warning:t=>e.jsxs(P,{...t,children:[e.jsx("path",{d:"M12 3 2 21h20Z"}),e.jsx("path",{d:"M12 10v5M12 18h.01"})]}),zap:t=>e.jsx(P,{...t,children:e.jsx("path",{d:"M13 3 4 14h7l-1 7 9-11h-7Z"})}),database:t=>e.jsxs(P,{...t,children:[e.jsx("ellipse",{cx:"12",cy:"5",rx:"8",ry:"3"}),e.jsx("path",{d:"M4 5v6c0 1.7 3.6 3 8 3s8-1.3 8-3V5M4 11v6c0 1.7 3.6 3 8 3s8-1.3 8-3v-6"})]}),cpu:t=>e.jsxs(P,{...t,children:[e.jsx("rect",{x:"5",y:"5",width:"14",height:"14",rx:"2"}),e.jsx("rect",{x:"9",y:"9",width:"6",height:"6"}),e.jsx("path",{d:"M9 2v3M15 2v3M9 19v3M15 19v3M2 9h3M2 15h3M19 9h3M19 15h3"})]}),coin:t=>e.jsxs(P,{...t,children:[e.jsx("circle",{cx:"12",cy:"12",r:"9"}),e.jsx("path",{d:"M12 7v10M9 10h4a2 2 0 0 1 0 4H9"})]}),file:t=>e.jsxs(P,{...t,children:[e.jsx("path",{d:"M14 3H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9Z"}),e.jsx("path",{d:"M14 3v6h6"})]}),folder:t=>e.jsx(P,{...t,children:e.jsx("path",{d:"M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2Z"})}),image:t=>e.jsxs(P,{...t,children:[e.jsx("rect",{x:"3",y:"4",width:"18",height:"16",rx:"2"}),e.jsx("circle",{cx:"9",cy:"10",r:"2"}),e.jsx("path",{d:"m3 18 5-5 4 4 3-3 6 6"})]}),paperclip:t=>e.jsx(P,{...t,children:e.jsx("path",{d:"M21 12 12 21a5 5 0 0 1-7-7L14 5a3 3 0 0 1 4 4l-9 9a1 1 0 0 1-2-2l8-8"})}),mic:t=>e.jsxs(P,{...t,children:[e.jsx("rect",{x:"9",y:"3",width:"6",height:"12",rx:"3"}),e.jsx("path",{d:"M5 11a7 7 0 0 0 14 0M12 18v3M9 21h6"})]}),sun:t=>e.jsxs(P,{...t,children:[e.jsx("circle",{cx:"12",cy:"12",r:"4"}),e.jsx("path",{d:"M12 2v2M12 20v2M2 12h2M20 12h2M5 5l1.5 1.5M17.5 17.5 19 19M5 19l1.5-1.5M17.5 6.5 19 5"})]}),moon:t=>e.jsx(P,{...t,children:e.jsx("path",{d:"M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8Z"})}),panel_l:t=>e.jsxs(P,{...t,children:[e.jsx("rect",{x:"3",y:"4",width:"18",height:"16",rx:"2"}),e.jsx("path",{d:"M9 4v16"})]}),panel_r:t=>e.jsxs(P,{...t,children:[e.jsx("rect",{x:"3",y:"4",width:"18",height:"16",rx:"2"}),e.jsx("path",{d:"M15 4v16"})]}),cog:t=>e.jsxs(P,{...t,children:[e.jsx("path",{d:"M12 3.6 19.2 7.8v8.4L12 20.4 4.8 16.2V7.8Z"}),e.jsx("circle",{cx:"12",cy:"12",r:"3.7"})]}),stop:t=>e.jsx(P,{...t,children:e.jsx("rect",{x:"6",y:"6",width:"12",height:"12",rx:"2"})}),play:t=>e.jsx(P,{...t,children:e.jsx("path",{d:"M7 5v14l12-7Z"})}),more:t=>e.jsxs(P,{...t,children:[e.jsx("circle",{cx:"6",cy:"12",r:"1.6",fill:"currentColor"}),e.jsx("circle",{cx:"12",cy:"12",r:"1.6",fill:"currentColor"}),e.jsx("circle",{cx:"18",cy:"12",r:"1.6",fill:"currentColor"})]}),pin:t=>e.jsx(P,{...t,children:e.jsx("path",{d:"M15 3 9 9l-4 1 9 9 1-4 6-6ZM4 20l5-5"})}),rotate:t=>e.jsxs(P,{...t,children:[e.jsx("path",{d:"M3 12a9 9 0 1 0 3-6.7L3 8"}),e.jsx("path",{d:"M3 3v5h5"})]}),branch:t=>e.jsxs(P,{...t,children:[e.jsx("circle",{cx:"6",cy:"4",r:"2"}),e.jsx("circle",{cx:"6",cy:"20",r:"2"}),e.jsx("circle",{cx:"18",cy:"8",r:"2"}),e.jsx("path",{d:"M6 6v12M6 14a6 6 0 0 0 6-6h4"})]}),at:t=>e.jsxs(P,{...t,children:[e.jsx("circle",{cx:"12",cy:"12",r:"4"}),e.jsx("path",{d:"M16 8v6a3 3 0 0 0 5-2 9 9 0 1 0-4 7"})]}),slash:t=>e.jsx(P,{...t,children:e.jsx("path",{d:"M16 4 8 20"})}),layers:t=>e.jsxs(P,{...t,children:[e.jsx("path",{d:"m12 3 9 5-9 5-9-5Z"}),e.jsx("path",{d:"m3 13 9 5 9-5M3 18l9 5 9-5"})]}),download:t=>e.jsx(P,{...t,children:e.jsx("path",{d:"M12 4v12M6 12l6 6 6-6M4 20h16"})}),upload:t=>e.jsx(P,{...t,children:e.jsx("path",{d:"M12 20V8M6 12l6-6 6 6M4 4h16"})}),history:t=>e.jsx(P,{...t,children:e.jsx("path",{d:"M3 12a9 9 0 1 0 3-6.7L3 8M12 7v5l3 2"})}),shield:t=>e.jsxs(P,{...t,children:[e.jsx("path",{d:"M12 3 4 6v6c0 5 3.5 8 8 9 4.5-1 8-4 8-9V6Z"}),e.jsx("path",{d:"m9 12 2 2 4-4"})]}),warn:t=>e.jsxs(P,{...t,children:[e.jsx("path",{d:"M12 3 2 21h20Z"}),e.jsx("path",{d:"M12 10v5M12 18h.01"})]}),help:t=>e.jsxs(P,{...t,children:[e.jsx("circle",{cx:"12",cy:"12",r:"9"}),e.jsx("path",{d:"M9.5 9a2.5 2.5 0 0 1 5 0c0 1.5-2.5 2-2.5 4M12 17h.01"})]}),refresh:t=>e.jsx(P,{...t,children:e.jsx("path",{d:"M3 12a9 9 0 0 1 15-6.7L21 8M21 4v4h-4M21 12a9 9 0 0 1-15 6.7L3 16M3 20v-4h4"})}),copy:t=>e.jsxs(P,{...t,children:[e.jsx("rect",{x:"8",y:"8",width:"12",height:"12",rx:"2"}),e.jsx("path",{d:"M4 16V6a2 2 0 0 1 2-2h10"})]})},se={DARK:"dark",LIGHT:"light"};function St(t){return t===se.DARK||t===se.LIGHT}const me={GRAPHITE:"graphite",SANDSTONE:"sandstone",PORCELAIN:"porcelain",MIDNIGHT:"midnight"},pa={dark:me.GRAPHITE,light:me.SANDSTONE},ma={graphite:se.DARK,sandstone:se.LIGHT,porcelain:se.LIGHT,midnight:se.DARK},Mn=[me.GRAPHITE,me.SANDSTONE,me.PORCELAIN,me.MIDNIGHT];function jt(t){return t===me.GRAPHITE||t===me.SANDSTONE||t===me.PORCELAIN||t===me.MIDNIGHT}function Fe(t){return ma[t]}function Ct(t){return pa[t]}const ue={SMALL:"small",MEDIUM:"medium",LARGE:"large"};function ha(t){return t===ue.SMALL||t===ue.MEDIUM||t===ue.LARGE}const ga={small:.875,medium:1,large:1.125},pe={SANS:"sans",SYSTEM:"system",SERIF:"serif"};function fa(t){return t===pe.SANS||t===pe.SYSTEM||t===pe.SERIF}const ba={sans:'"Geist", system-ui, sans-serif',system:'-apple-system, system-ui, "Segoe UI", Roboto, sans-serif',serif:'Georgia, "Times New Roman", serif'},En="session";function xa(){if(typeof window>"u")return null;const t=new URLSearchParams(window.location.search).get(En);if(!t)return null;const n=t.trim();return n.length>0?n:null}function ya(t){if(typeof window>"u")return;const n=new URL(window.location.href);n.searchParams.delete(En),n.href!==window.location.href&&window.history.replaceState(null,"",n.href)}function ka(t){const n=t/1e3;return n<10?`${n.toFixed(1)}s`:`${Math.floor(n)}s`}function wa(t,n){const[s,i]=l.useState(0),r=l.useRef(null);return l.useEffect(()=>{if(!t){i(0),r.current=null;return}r.current=performance.now();const o=setInterval(()=>{r.current!==null&&i(performance.now()-r.current)},80);return()=>clearInterval(o)},[t,n]),s}const va=["low","medium","high","max"],Sa=[{k:"plan",label:"editMode.plan",icon:e.jsx(x.list,{size:11}),hint:"editMode.planHint"},{k:"review",label:"editMode.review",icon:e.jsx(x.shield,{size:11}),hint:"editMode.reviewHint"},{k:"auto",label:"editMode.auto",icon:e.jsx(x.zap,{size:11}),hint:"editMode.autoHint"},{k:"yolo",label:"editMode.yolo",icon:e.jsx(x.warn,{size:11}),hint:"editMode.yoloHint"}];function Yt({mode:t,onChange:n}){return e.jsx("div",{className:"mode-switch","data-mode":t,children:Sa.map(s=>e.jsxs("button",{type:"button",className:"ms-seg","data-on":t===s.k,"data-k":s.k,onClick:()=>n(s.k),title:a(s.hint),children:[s.icon,e.jsx("span",{children:a(s.label)})]},s.k))})}function ja(t){return{"/clear":e.jsx(x.x,{size:12}),"/new":e.jsx(x.plus,{size:12}),"/abort":e.jsx(x.stop,{size:12}),"/copy":e.jsx(x.layers,{size:12}),"/export":e.jsx(x.download,{size:12}),"/model":e.jsx(x.cpu,{size:12}),"/theme":e.jsx(x.sun,{size:12}),"/lang":e.jsx(x.globe,{size:12})}[t]||e.jsx(x.slash,{size:12})}function ut(t){const n=t.replace(/\\/g,"/"),s=n.endsWith("/"),i=n.lastIndexOf("/");if(i<0)return null;const r=s?n.slice(0,-1):n.slice(0,i);if(!r)return null;const o=r.lastIndexOf("/");return o>=0?`${r.slice(0,o)}/`:""}function Ca(t){return t==="file"?e.jsx(x.file,{size:12}):t==="dir"?e.jsx(x.folder,{size:12}):t==="url"?e.jsx(x.globe,{size:12}):t==="agent"?e.jsx(x.bot,{size:12}):t==="clip"?e.jsx(x.layers,{size:12}):e.jsx(x.at,{size:12})}function Na({draft:t,setDraft:n,onSend:s,onAbort:i,disabled:r,busy:o,busyLabel:d,busyElapsedMs:p,modelLabel:h,reasoningEffort:g,onModelChange:k,onEffortChange:v,editMode:f,onEditModeChange:m,textareaRef:y,slashCommands:S,onMentionQuery:I,onMentionPreview:q,onMentionPicked:X,mentionResults:R,workspaceDir:D,queuedSends:K,onQueueWhileBusy:F,onDequeueSend:J}){const[ee,E]=l.useState([]),[u,z]=l.useState(null),[le,ne]=l.useState(0),[he,Z]=l.useState(!1),ce=l.useRef(0),ge=l.useRef(null),j=l.useRef(!1),N=l.useRef(0),H=l.useRef(t);l.useEffect(()=>{const w=H.current;H.current=t,t==="/"&&w!=="/"&&z({kind:"slash",query:""})},[t]),l.useEffect(()=>{if(!he)return;const w=T=>{ge.current&&!ge.current.contains(T.target)&&Z(!1)};return window.addEventListener("mousedown",w),()=>window.removeEventListener("mousedown",w)},[he]);const te=async w=>{try{const T=await Lt({multiple:!1,directory:!1,defaultPath:D,filters:w==="image"?[{name:a("composer.imageFilterName"),extensions:["png","jpg","jpeg","gif","webp","svg"]}]:void 0});if(typeof T!="string"||!T)return;const O=D&&T.startsWith(D)?T.slice(D.length).replace(/^[\\/]+/,""):T;n(t?`${t.replace(/\s+$/,"")} @${O} `:`@${O} `),E(ie=>[...ie,{kind:"at",label:O}]),X?.(O),y.current?.focus()}catch(T){console.error("attach failed",T)}},re=l.useMemo(()=>{if(!u||u.kind!=="slash")return[];const w=u.query.toLowerCase();return w?S.filter(T=>T.cmd.toLowerCase().includes(w)):S},[u,S]),fe=l.useMemo(()=>{if(!u||u.kind!=="at")return[];if(!R||R.nonce!==u.nonce)return[];const w=R.results.map(O=>({name:O,kind:O.endsWith("/")||O.endsWith("\\")?"dir":"file",desc:O})),T=ut(u.query);return T!==null&&w.unshift({name:"..",kind:"dir",desc:T?`↑ ${T}`:`↑ ${a("composer.workspaceRoot")}`}),w},[u,R]),W=u?.kind==="slash"?re:u?.kind==="at"?fe:[];l.useEffect(()=>{ne(0)},[W.length,u?.kind]),l.useEffect(()=>{!u||u.kind!=="at"||!I||I(u.query,u.nonce)},[u,I]);const Y=w=>{const T=w.target.value;n(T);const O=T.match(/(^|\s)([/@])([^\s]*)$/);if(O){const ie=O[2],V=O[3]??"";if(ie==="/")z({kind:"slash",query:V});else{const oe=++ce.current;z({kind:"at",query:V,nonce:oe})}}else u&&z(null)},B=()=>z(null),Q=w=>{const T=W[w];if(!(!T||!u)){if(u.kind==="slash"){const O=T.cmd;if(T.insertOnly===!0){const V=t.replace(/[/@][^\s]*$/,"").trimEnd();n(V?`${V} ${O} `:`${O} `),E(oe=>[...oe,{kind:"slash",label:O.replace(/^\//,"")}])}else{const V=t.replace(/[/@][^\s]*$/,"").trimEnd();n(V),E(oe=>[...oe,{kind:"slash",label:O.replace(/^\//,"")}]),T.run()}}else{const O=T;if(O.name===".."){const V=ut(u.query)??"",oe=t.replace(/[@][^\s]*$/,`@${V}`);n(oe);const Ae=++ce.current;z({kind:"at",query:V,nonce:Ae}),y.current?.focus();return}const ie=t.replace(/[/@][^\s]*$/,"").trimEnd();n(ie?`${ie} @${O.name} `:`@${O.name} `),E(V=>[...V,{kind:"at",label:O.name}]),X?.(O.name)}z(null),y.current?.focus()}},be=w=>{if(u){if(w.key==="ArrowDown"){w.preventDefault(),ne(T=>W.length?(T+1)%W.length:0);return}if(w.key==="ArrowUp"){w.preventDefault(),ne(T=>W.length?(T-1+W.length)%W.length:0);return}if(w.key==="Escape"){w.preventDefault(),B();return}if(w.key==="Tab"&&u.kind==="at"&&W.length>0){const T=W[le];if(T&&T.kind==="dir"){w.preventDefault();const O=T;if(O.name===".."){const Ae=ut(u.query)??"",Ie=t.replace(/[@][^\s]*$/,`@${Ae}`);n(Ie);const de=++ce.current;z({kind:"at",query:Ae,nonce:de});return}const ie=O.name.replace(/\/+$/,""),V=t.replace(/[@][^\s]*$/,`@${ie}/`);n(V);const oe=++ce.current;z({kind:"at",query:`${ie}/`,nonce:oe});return}}if(w.key==="Enter"){if(W.length>0){w.preventDefault(),Q(le);return}B()}}if(!(j.current||Date.now()-N.current<50)&&w.key==="Enter"&&!w.shiftKey&&!u)if(w.preventDefault(),o){const T=t.trim();T&&F&&(F(T),E([]))}else!r&&t.trim()&&(s(),E([]))};return e.jsx("div",{className:"composer-wrap",children:e.jsxs("div",{className:"composer-inner",children:[K&&K.length>0?e.jsxs("div",{className:"composer-queued",children:[e.jsx("span",{className:"composer-queued-label",children:a("composer.queueCount",{count:K.length})}),K.map((w,T)=>e.jsxs("span",{className:"composer-queue-chip",title:w,children:[e.jsx("span",{className:"text",children:w}),J?e.jsx("span",{className:"x",onClick:()=>J(T),children:e.jsx(x.x,{size:10})}):null]},T))]}):null,e.jsx("div",{className:"hint-row",children:o&&d?e.jsxs(e.Fragment,{children:[e.jsxs("span",{className:"composer-busy-status",children:[e.jsx("span",{className:"composer-busy-pip"}),e.jsx("span",{className:"composer-busy-label",children:d}),e.jsx("span",{className:"composer-busy-time",children:ka(p??0)})]}),e.jsx("span",{className:"grow"}),e.jsx(Yt,{mode:f,onChange:m}),e.jsx("span",{className:"hint-sep"}),e.jsxs("span",{children:[e.jsx(G,{keys:["enter"]})," ",a("composer.queue"),"  · "," ",e.jsx(G,{keys:["esc"]})," ",a("composer.interrupt")]})]}):e.jsxs(e.Fragment,{children:[e.jsxs("span",{children:[e.jsx(G,{keys:["/"]})," ",a("composer.commands"),"  · "," ",e.jsx(G,{keys:["@"]})," ",a("composer.mentionFiles")," ·  ",e.jsx(G,{keys:["mod","K"]})," ",a("composer.commandPalette")]}),e.jsx("span",{className:"grow"}),e.jsx(Yt,{mode:f,onChange:m}),e.jsx("span",{className:"hint-sep"}),e.jsxs("span",{children:[e.jsx(G,{keys:["enter"]})," ",a("composer.send"),"  "," ",e.jsx(G,{keys:["shift","enter"]})," ",a("composer.newline")]})]})}),e.jsxs("div",{className:"composer",children:[ee.length>0?e.jsx("div",{className:"composer-tags",children:ee.map((w,T)=>e.jsxs("span",{className:`chip ${w.kind}`,children:[w.kind==="slash"?e.jsx(x.slash,{size:11}):e.jsx(x.at,{size:11}),e.jsx("span",{children:w.label}),e.jsx("span",{className:"x",onClick:()=>E(O=>O.filter((ie,V)=>V!==T)),children:e.jsx(x.x,{size:10})})]},T))}):null,e.jsx("textarea",{ref:y,value:t,placeholder:a("composer.placeholder"),onChange:Y,onKeyDown:be,onCompositionStart:()=>{j.current=!0},onCompositionEnd:()=>{j.current=!1,N.current=Date.now()},rows:2,disabled:r}),e.jsxs("div",{className:"composer-foot",children:[e.jsx("button",{type:"button",className:"cf-btn",title:a("composer.insertFile"),onClick:()=>void te(),children:e.jsx("span",{className:"ico",children:e.jsx(x.paperclip,{size:14})})}),e.jsx("button",{type:"button",className:"cf-btn",title:a("composer.insertImage"),onClick:()=>void te("image"),children:e.jsx("span",{className:"ico",children:e.jsx(x.image,{size:14})})}),e.jsxs("button",{type:"button",className:"cf-btn",onClick:()=>z({kind:"slash",query:""}),children:[e.jsx("span",{className:"ico",children:e.jsx(x.slash,{size:14})}),e.jsx("span",{className:"label",children:a("composer.commandsLabel")})]}),e.jsxs("button",{type:"button",className:"cf-btn",onClick:()=>{const w=++ce.current;z({kind:"at",query:"",nonce:w})},children:[e.jsx("span",{className:"ico",children:e.jsx(x.at,{size:14})}),e.jsx("span",{className:"label",children:a("composer.mentionLabel")})]}),e.jsx("span",{className:"grow"}),e.jsxs("div",{ref:ge,style:{position:"relative"},children:[e.jsxs("button",{type:"button",className:"model-pill",onClick:()=>Z(w=>!w),title:a("composer.switchModel"),children:[e.jsx(x.brain,{size:12}),e.jsx("span",{children:h}),e.jsx("span",{className:"badge",children:g}),e.jsx(x.chev,{size:10})]}),he?e.jsx(Pa,{modelLabel:h,currentEffort:g,onPickModel:w=>{k(w),Z(!1)},onPickEffort:w=>{v(w),Z(!1)}}):null]}),o?e.jsx("button",{type:"button",className:"send-btn",style:{background:"var(--danger)"},onClick:i,title:a("composer.interrupt"),children:e.jsx(x.stop,{size:14})}):e.jsx("button",{type:"button",className:"send-btn",disabled:r||!t.trim(),onClick:()=>{!r&&t.trim()&&(s(),E([]))},children:e.jsx(x.send,{size:14})})]}),u?e.jsx(Ta,{kind:u.kind,items:W,activeIdx:le,onPick:w=>Q(w),onClose:B,onHover:(w,T)=>{if(ne(w),u.kind==="at"&&q){const O=T.name;q(O,u.nonce)}}}):null]})]})})}function Ta({kind:t,items:n,activeIdx:s,onPick:i,onClose:r,onHover:o}){const d=l.useRef(null);return l.useEffect(()=>{requestAnimationFrame(()=>{d.current?.querySelector('[data-active="true"]')?.scrollIntoView({block:"nearest"})})},[s]),e.jsxs("div",{className:"popup",onMouseDown:p=>p.preventDefault(),children:[e.jsxs("div",{className:"ph",children:[e.jsx("span",{className:"tok",children:t==="slash"?"/":"@"}),e.jsx("span",{children:a(t==="slash"?"composer.slashHeader":"composer.atHeader")}),e.jsx("span",{className:"grow"}),e.jsx("span",{style:{cursor:"pointer"},onClick:r,children:e.jsx(x.x,{size:11})})]}),e.jsxs("div",{className:"popup-list",ref:d,children:[n.length===0?e.jsx("div",{style:{padding:"12px 8px",fontSize:11.5,color:"var(--muted-2)",fontFamily:"Geist Mono, monospace"},children:a("composer.noMatches")}):null,n.map((p,h)=>e.jsxs("div",{className:"popup-item","data-active":h===s,onClick:()=>i(h),onMouseEnter:()=>o(h,p),children:[e.jsx("span",{className:"ico",children:t==="slash"?ja(p.cmd):Ca(p.kind)}),e.jsx("div",{className:"nm",children:t==="slash"?e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"cmd",children:p.cmd}),e.jsx("span",{className:"desc",children:p.desc})]}):e.jsxs(e.Fragment,{children:[e.jsx("span",{children:p.name}),p.desc?e.jsx("div",{className:"desc",children:p.desc}):null]})}),e.jsx("span",{className:"kb",children:t==="slash"?p.kb??"":""})]},h))]}),e.jsxs("div",{className:"popup-foot",children:[e.jsxs("span",{children:[e.jsx(G,{keys:["updown"]})," ",a("composer.select")]}),e.jsxs("span",{children:[e.jsx(G,{keys:["enter"]})," ",a("composer.confirm")]}),e.jsxs("span",{children:[e.jsx(G,{keys:["esc"]})," ",a("composer.close")]})]})]})}const Aa=["deepseek-v4-flash","deepseek-v4-pro"];function Pa({modelLabel:t,currentEffort:n,onPickModel:s,onPickEffort:i}){const[r,o]=l.useState(t);return e.jsxs("div",{className:"popup",style:{bottom:"calc(100% + 6px)",left:"auto",right:0,width:280,position:"absolute"},children:[e.jsxs("div",{className:"ph",children:[e.jsx("span",{className:"tok",children:"M"}),e.jsx("span",{children:a("composer.switchModel")})]}),e.jsxs("div",{className:"popup-list",children:[Aa.map(d=>e.jsxs("div",{className:"popup-item","data-active":d===t,onClick:()=>s(d),children:[e.jsx("span",{className:"ico",children:e.jsx(x.brain,{size:12})}),e.jsx("div",{className:"nm",children:e.jsx("span",{className:"cmd",children:d})})]},d)),e.jsxs("div",{style:{padding:"6px 8px",display:"flex",gap:6},children:[e.jsx("input",{className:"field mono",style:{flex:1},value:r,onChange:d=>o(d.target.value),placeholder:"custom model id"}),e.jsx("button",{type:"button",className:"btn",disabled:!r.trim()||r.trim()===t,onClick:()=>s(r.trim()),children:a("composer.confirm")})]})]}),e.jsxs("div",{className:"ph",style:{marginTop:4},children:[e.jsx("span",{className:"tok",children:"E"}),e.jsx("span",{children:a("composer.switchEffort")})]}),e.jsx("div",{className:"popup-list",children:va.map(d=>e.jsxs("div",{className:"popup-item","data-active":d===n,onClick:()=>i(d),children:[e.jsx("span",{className:"ico",children:e.jsx(x.cpu,{size:12})}),e.jsxs("div",{className:"nm",children:[e.jsx("span",{className:"cmd",children:d}),e.jsx("div",{className:"desc",children:a(`effort.${d}Desc`)})]})]},d))})]})}class Ma extends l.Component{state={error:null};static getDerivedStateFromError(n){return{error:n}}componentDidCatch(n,s){console.error(`[panel:${this.props.label}] render error`,n,s)}render(){return this.state.error?e.jsxs("div",{className:"ctx-empty",style:{color:"var(--danger, #e25555)",padding:12,fontSize:12,whiteSpace:"pre-wrap",wordBreak:"break-word"},children:[a("panel.renderError",{panel:this.props.label}),": ",this.state.error.message]}):this.props.children}}const qe=1e6;function Ea({settings:t,usage:n,mcpSpecs:s,mcpBridged:i,sessionFiles:r,memory:o,memoryDetail:d,onReadMemory:p}){$();const[h,g]=l.useState("files"),k=n.reservedTokens,v=Math.max(0,n.cacheHitTokens-k),f=Math.max(0,n.cacheMissTokens-Math.max(0,k-n.cacheHitTokens)),m=Math.min(100,k/qe*100),y=Math.min(100,f/qe*100),S=Math.min(100,v/qe*100),I=Math.max(0,qe-k-f-v);return e.jsxs("aside",{className:"ctx",children:[e.jsxs("div",{className:"ctx-tabs",children:[e.jsx("div",{className:"ctx-tab","data-active":h==="files",onClick:()=>g("files"),children:a("contextPanel.filesTab")}),e.jsx("div",{className:"ctx-tab","data-active":h==="tools",onClick:()=>g("tools"),children:a("contextPanel.toolsTab")}),e.jsx("div",{className:"ctx-tab","data-active":h==="memory",onClick:()=>g("memory"),children:a("contextPanel.memoryTab")}),e.jsx("div",{className:"ctx-tab","data-active":h==="rules",onClick:()=>g("rules"),children:a("contextPanel.rulesTab")})]}),e.jsxs("div",{className:"ctx-body",children:[e.jsxs("div",{className:"ctx-block",children:[e.jsxs("div",{className:"h",children:[e.jsx("span",{children:a("contextPanel.contextTokens")}),e.jsxs("span",{className:"right",children:[(k+f+v).toLocaleString()," /"," ",qe.toLocaleString()]})]}),e.jsxs("div",{className:"meter",children:[e.jsx("span",{className:"rsvd",style:{width:`${m}%`}}),e.jsx("span",{className:"cached",style:{width:`${S}%`}}),e.jsx("span",{className:"used",style:{width:`${y}%`}})]}),e.jsxs("div",{className:"legend",children:[e.jsxs("span",{className:"l",children:[e.jsx("span",{className:"sw r"}),a("contextPanel.reservedKey")," ",e.jsx("span",{className:"v",children:k.toLocaleString()})]}),e.jsxs("span",{className:"l",children:[e.jsx("span",{className:"sw c"}),a("contextPanel.cacheKey")," ",e.jsx("span",{className:"v",children:v.toLocaleString()})]}),e.jsxs("span",{className:"l",children:[e.jsx("span",{className:"sw u"}),a("contextPanel.usedKey")," ",e.jsx("span",{className:"v",children:f.toLocaleString()})]}),e.jsxs("span",{className:"l",children:[a("contextPanel.freeKey")," ",e.jsx("span",{className:"v",children:I.toLocaleString()})]})]})]}),e.jsxs(Ma,{label:h,children:[h==="files"&&e.jsx(Da,{files:r}),h==="tools"&&e.jsx(La,{specs:s,bridged:i}),h==="memory"&&e.jsx(Ia,{entries:o,detail:d,onRead:p}),h==="rules"&&e.jsx(za,{settings:t})]},h)]})]})}function Ra(t){const n=[...t].sort((r,o)=>r.path.replace(/\\/g,"/").localeCompare(o.path.replace(/\\/g,"/"))),s=[],i=new Set;for(const r of n){const o=r.path.replace(/\\/g,"/").split("/").filter(Boolean);if(o.length===0)continue;let d="";for(let h=0;h<o.length-1;h++){const g=o[h]??"";d=d?`${d}/${g}`:g,i.has(d)||(i.add(d),s.push({kind:"dir",depth:h,name:g,key:`d:${d}`}))}const p=o[o.length-1]??"";s.push({kind:"file",depth:o.length-1,name:p,key:`f:${r.path}`,status:r.status})}return s}function Da({files:t}){const n=l.useMemo(()=>Ra(t),[t]);return e.jsxs("div",{className:"ctx-block",children:[e.jsxs("div",{className:"h",children:[e.jsx("span",{children:a("contextPanel.filesTitle")}),e.jsx("span",{className:"right",children:t.length===0?"—":a("contextPanel.filesCount",{count:t.length})})]}),e.jsx("div",{className:"tree",children:t.length===0?e.jsx("div",{className:"ctx-empty",children:a("contextPanel.noFilesMsg")}):n.map(s=>s.kind==="dir"?e.jsxs("div",{className:"node","data-d":s.depth,"data-kind":"dir",children:[e.jsx("span",{className:"ico",children:e.jsx(x.folder,{size:12})}),e.jsxs("span",{className:"nm",children:[s.name,"/"]})]},s.key):e.jsxs("div",{className:"node","data-d":s.depth,"data-kind":"file",title:s.name,children:[e.jsx("span",{className:"ico",children:e.jsx(x.file,{size:12})}),e.jsx("span",{className:"nm",children:s.name}),e.jsx("span",{className:"dot","data-s":s.status,title:s.status==="m"?a("contextPanel.fileModified"):a("contextPanel.fileInContext")})]},s.key))})]})}function La({specs:t,bridged:n}){const s=t.filter(i=>i.status==="connected").length;return e.jsxs("div",{className:"ctx-block",children:[e.jsxs("div",{className:"h",children:[e.jsx("span",{children:a("contextPanel.mcpTitle")}),e.jsx("span",{className:"right",children:t.length===0?"—":n?a("contextPanel.mcpReadyAll",{count:t.length}):a("contextPanel.mcpReadySome",{ready:s,count:t.length})})]}),t.length===0?e.jsx("div",{className:"ctx-empty",children:a("contextPanel.mcpEmpty")}):t.map(i=>{const r=i.status==="connected"?"ok":i.status==="failed"||i.parseError?"off":"pending",o=i.statusReason?` · ${i.statusReason}`:i.status==="connected"?typeof i.toolCount=="number"?` · ${a("contextPanel.mcpTools",{count:i.toolCount})}`:` · ${a("contextPanel.mcpReady")}`:i.status==="handshake"?` · ${a("contextPanel.mcpConnecting")}`:i.status==="disabled"?` · ${a("contextPanel.mcpDisabled")}`:i.status==="failed"?` · ${a("contextPanel.mcpFailed")}`:` · ${a("contextPanel.mcpConfigured")}`;return e.jsxs("div",{className:"mcp-row",children:[e.jsx("span",{className:"ico",children:e.jsx(x.wrench,{size:12})}),e.jsxs("div",{className:"body",children:[e.jsx("div",{className:"n",children:i.name??i.summary}),e.jsxs("div",{className:"m",children:[i.transport,o]})]}),e.jsx("span",{className:"status","data-s":r})]},i.raw)})]})}function Ia({entries:t,detail:n,onRead:s}){return e.jsxs("div",{className:"ctx-block",children:[e.jsxs("div",{className:"h",children:[e.jsx("span",{children:a("contextPanel.memoryTitle")}),e.jsx("span",{className:"right",children:t.length===0?"—":a("contextPanel.itemCount",{count:t.length})})]}),t.length===0?e.jsx("div",{className:"ctx-empty",children:a("contextPanel.noMemoriesMsg")}):e.jsxs("div",{className:"mem",children:[t.map(i=>e.jsxs("button",{type:"button",className:"mem-row","data-active":n?.path===i.path,onClick:()=>s(i.path),children:[e.jsx("span",{className:"scope","data-s":i.scope,children:i.scope==="project"?a("contextPanel.scopeProject"):a("contextPanel.scopeGlobal")}),e.jsx("span",{className:"txt",children:i.description||i.name})]},i.path)),n?e.jsx("pre",{className:"mem-detail",children:n.body}):null]})]})}function za({settings:t}){const n=t?.editMode??"review",s=n==="yolo"?[{p:"*",allow:!0,desc:a("contextPanel.ruleYolo")}]:n==="auto"?[{p:"read_file, list_directory, search_files, *",allow:!0,desc:a("contextPanel.ruleReadOnly")},{p:"run_command (allowlist)",allow:!0,desc:a("contextPanel.ruleShellAllowlist")},{p:"edit_file, write_file, run_command (other)",allow:!1,desc:a("contextPanel.ruleWritesAsk")}]:[{p:"*",allow:!1,desc:a("contextPanel.ruleReview")}];return e.jsxs("div",{className:"ctx-block",children:[e.jsxs("div",{className:"h",children:[e.jsx("span",{children:a("contextPanel.autoApproveTitle")}),e.jsx("span",{className:"right",children:n})]}),s.map(i=>e.jsxs("div",{className:"rule",children:[e.jsxs("div",{className:"top",children:[e.jsx("span",{className:`pat ${i.allow?"":"deny"}`,children:i.p}),e.jsx("span",{className:`sw ${i.allow?"":"deny"}`,children:i.allow?a("contextPanel.allow"):a("contextPanel.ask")})]}),e.jsx("div",{className:"desc",children:i.desc})]},i.p))]})}function _a({open:t,onClose:n,jobs:s,onStop:i,onStopAll:r}){$();const[o,d]=l.useState(0);l.useEffect(()=>{if(!t)return;const g=window.setInterval(()=>d(k=>k+1),600);return()=>window.clearInterval(g)},[t]),l.useEffect(()=>{if(!t)return;const g=k=>{k.key==="Escape"&&(k.preventDefault(),n())};return window.addEventListener("keydown",g),()=>window.removeEventListener("keydown",g)},[t,n]);const p=l.useMemo(()=>s.filter(g=>g.running),[s]),h=l.useMemo(()=>s.filter(g=>!g.running),[s]);return t?e.jsx("div",{className:"jobs-mask",onClick:n,children:e.jsxs("div",{className:"jobs-pop",onClick:g=>g.stopPropagation(),children:[e.jsxs("div",{className:"jobs-head",children:[e.jsx("span",{className:"ico",children:e.jsx(x.cpu,{size:13})}),e.jsxs("div",{children:[e.jsx("div",{className:"tt",children:a("jobs.title")}),e.jsxs("div",{className:"ss",children:[e.jsx("span",{className:"b ok",children:p.length})," ",a("jobs.running")," ·"," ",e.jsx("span",{className:"b mut",children:h.length})," ",a("jobs.exited")]})]}),e.jsx("span",{className:"grow"}),p.length>0?e.jsxs("button",{type:"button",className:"btn danger sm",onClick:r,title:a("jobs.stopAllTip"),children:[e.jsx(x.stop,{size:10})," ",a("jobs.stopAll")]}):null]}),e.jsx("div",{className:"jobs-body",children:s.length===0?e.jsx("div",{className:"jobs-empty",children:a("jobs.empty")}):e.jsxs(e.Fragment,{children:[p.length>0?e.jsx("div",{className:"jobs-grp",children:a("jobs.running")}):null,p.map(g=>e.jsx(Zt,{job:g,tick:o,onStop:i},g.id)),h.length>0?e.jsx("div",{className:"jobs-grp",children:a("jobs.exited")}):null,h.map(g=>e.jsx(Zt,{job:g,tick:o,onStop:i},g.id))]})}),e.jsx("div",{className:"jobs-foot",children:e.jsxs("div",{className:"row",children:[e.jsx(x.zap,{size:11}),e.jsxs("span",{children:[a("jobs.running")," ",e.jsx("span",{className:"v",children:p.length})]}),e.jsx("span",{children:"·"}),e.jsxs("span",{children:[a("jobs.exited")," ",e.jsx("span",{className:"v",children:h.length})]}),e.jsx("span",{className:"grow"}),e.jsxs("span",{children:[e.jsx(G,{keys:["mod","J"]})," ",a("jobs.kbToggle")," ·"," ",e.jsx(G,{keys:["esc"]})," ",a("jobs.kbClose")]})]})})]})}):null}function Qt(t){if(t<1e3)return`${t}ms`;const n=t/1e3;if(n<60)return`${n.toFixed(1)}s`;const s=Math.floor(n/60),i=Math.floor(n%60);return`${s}m${i}s`}function Zt({job:t,tick:n,onStop:s}){const[i,r]=l.useState(!1),o=(t.running?Date.now():t.startedAt+0)-t.startedAt,d=t.running?Date.now()-t.startedAt:o;return e.jsxs("div",{className:"job-row","data-status":t.running?"running":"exited",children:[e.jsxs("div",{className:"jr-main",onClick:()=>r(p=>!p),children:[e.jsx("span",{className:"jr-state",children:t.running?e.jsx("span",{className:"spin"}):e.jsx(x.history,{size:11,style:{color:"var(--muted-2)"}})}),e.jsxs("span",{className:"jr-kind",children:[e.jsx(x.terminal,{size:11}),e.jsx("span",{children:"shell"})]}),e.jsxs("div",{className:"jr-body",children:[e.jsx("div",{className:"nm",title:t.command,children:t.command}),e.jsxs("div",{className:"sub",children:[e.jsx("span",{className:"ses",children:t.sessionLabel}),t.spawnError?e.jsxs("span",{className:"rk",children:["· ",t.spawnError]}):null,!t.running&&t.exitCode!==null&&t.exitCode!==0?e.jsxs("span",{className:"rk",children:["· exit ",t.exitCode]}):null]})]}),e.jsx("div",{className:"jr-time",children:Qt(d)}),e.jsx("div",{className:"jr-act",children:t.running?e.jsxs("button",{type:"button",className:"btn danger sm",title:a("jobs.stopOne"),onClick:p=>{p.stopPropagation(),s(t.id)},children:[e.jsx(x.stop,{size:10})," ",a("jobs.stop")]}):e.jsx("span",{className:"jr-exit",title:`exit ${t.exitCode??"—"}`,children:t.exitCode===0?"ok":`exit ${t.exitCode??"?"}`})})]}),i?e.jsxs("div",{className:"jr-detail",children:[e.jsxs("div",{className:"kv-grid",children:[e.jsxs("div",{children:[e.jsx("span",{className:"k",children:"job_id"}),e.jsx("span",{className:"v",children:t.id})]}),e.jsxs("div",{children:[e.jsx("span",{className:"k",children:"pid"}),e.jsx("span",{className:"v",children:t.pid??"—"})]}),e.jsxs("div",{children:[e.jsx("span",{className:"k",children:"elapsed"}),e.jsx("span",{className:"v",children:Qt(d)})]})]}),t.outputTail?e.jsx("pre",{className:"jr-log",children:t.outputTail}):null]}):null]})}const qa="https://github.com/esengine/DeepSeek-Reasonix";function Ba({onClose:t}){const n=()=>{Oe(qa).catch(()=>{})};return e.jsx("div",{className:"about-mask",onClick:t,children:e.jsxs("div",{className:"about-modal",onClick:s=>s.stopPropagation(),children:[e.jsx("button",{type:"button",className:"about-close",onClick:t,"aria-label":a("about.close"),children:e.jsx(x.x,{size:14})}),e.jsxs("div",{className:"about-brand",children:[e.jsx("div",{className:"about-name",children:"Reasonix"}),e.jsx("div",{className:"about-tagline",children:a("about.tagline")})]}),e.jsxs("div",{className:"about-meta",children:[e.jsxs("div",{className:"about-row",children:[e.jsx("span",{className:"about-label",children:a("about.version")}),e.jsx("code",{className:"about-value",children:"0.47.2"})]}),e.jsxs("div",{className:"about-row",children:[e.jsx("span",{className:"about-label",children:a("about.repo")}),e.jsxs("button",{type:"button",className:"about-link",onClick:n,children:[e.jsx(x.link,{size:12}),e.jsx("span",{children:"esengine/DeepSeek-Reasonix"})]})]})]})]})})}function Ha(t){if(t)return t.length>6?`${t.slice(0,6)}...`:t}function Oa(t){return t.configured?"connect":"configure"}function Fa(t){switch(t.runtimeState){case"connected":return a("settings.qqConnected");case"connecting":return a("settings.qqConnecting");case"failed":return a("settings.qqFailed");default:return a("settings.qqDisconnected")}}function $a(t){const n=/^owner (.+?)(?:, allowlist (\d+))?$/.exec(t);if(n){const r=n[1]??"unknown",o=n[2];return o?a("settings.qqAccessOwnerWithAllowlist",{openId:r,count:o}):a("settings.qqAccessOwner",{openId:r})}const s=/^allowlist (\d+)$/.exec(t);if(s)return a("settings.qqAccessAllowlist",{count:s[1]??"0"});const i=/^first-sender \(runtime only, (.+)\)$/.exec(t);return i?a("settings.qqAccessRuntime",{openId:i[1]??"unknown"}):a("settings.qqAccessOpen")}function Ua(t){if(!t.configured)return a("settings.qqSummaryMissing");const n=t.appIdPreview??Ha(t.appId)??"unknown";return a("settings.qqSummaryDetail",{appId:a("settings.qqSummaryAppId",{appId:n}),environment:t.sandbox?a("settings.qqSandbox"):a("settings.qqProduction"),access:$a(t.access)})}const pt=[{id:"general",icon:"cog"},{id:"models",icon:"brain"},{id:"mcp",icon:"wrench"},{id:"skills",icon:"zap"},{id:"memory",icon:"bookmark"},{id:"rules",icon:"shield"},{id:"billing",icon:"coin"},{id:"shortcuts",icon:"cpu"}];function Ka({settings:t,balance:n,usage:s,currency:i,theme:r,themeStyle:o,onSetTheme:d,onSetThemeStyle:p,fontScale:h,onSetFontScale:g,fontFamily:k,onSetFontFamily:v,initialPage:f,mcpSpecs:m,mcpBridged:y,skills:S,memory:I,memoryDetail:q,qq:X,onClose:R,onSave:D,onSaveApiKey:K,onLoadQQ:F,onConnectQQ:J,onDisconnectQQ:ee,onSaveQQConfig:E,onOpenQQApplyLink:u,onPickWorkspace:z,onAddMcpSpec:le,onRemoveMcpSpec:ne,onReadMemory:he}){const[Z,ce]=l.useState(f??"general"),[ge,j]=l.useState(!1),N=pt.find(H=>H.id===Z)??pt[0];return e.jsx("div",{className:"settings-mask",onClick:R,children:e.jsxs("div",{className:"settings",onClick:H=>H.stopPropagation(),children:[e.jsxs("nav",{className:"settings-side",children:[e.jsx("div",{className:"sg",children:a("settings.title")}),pt.map(H=>e.jsxs("div",{className:"row","data-active":Z===H.id,onClick:()=>ce(H.id),children:[e.jsx("span",{className:"ico",children:x[H.icon]({size:13})}),e.jsx("span",{children:a(`settings.page${H.id[0].toUpperCase()}${H.id.slice(1)}Label`)})]},H.id))]}),e.jsxs("div",{className:"settings-main",children:[e.jsxs("div",{className:"settings-head",children:[e.jsxs("div",{children:[e.jsx("h2",{children:a(`settings.page${N.id[0].toUpperCase()}${N.id.slice(1)}Label`)}),e.jsx("div",{className:"desc",children:a(`settings.page${N.id[0].toUpperCase()}${N.id.slice(1)}Desc`)})]}),e.jsx("span",{className:"grow"}),e.jsx("button",{type:"button",className:"close-btn",onClick:R,children:e.jsx(x.x,{size:14})})]}),e.jsxs("div",{className:"settings-body",children:[Z==="general"&&e.jsx(Ga,{settings:t,theme:r,themeStyle:o,onSetTheme:d,onSetThemeStyle:p,fontScale:h,onSetFontScale:g,fontFamily:k,onSetFontFamily:v,onSave:D,onPickWorkspace:z}),Z==="models"&&e.jsx(Ya,{settings:t,onSave:D}),Z==="mcp"&&e.jsx(Qa,{specs:m,bridged:y,onAdd:le,onRemove:ne}),Z==="skills"&&e.jsx(Za,{skills:S,subagentModels:t.subagentModels??{},onSave:D}),Z==="memory"&&e.jsx(Xa,{entries:I,detail:q,onRead:he}),Z==="rules"&&e.jsx(ei,{settings:t,onSave:D}),Z==="billing"&&e.jsx(ti,{balance:n,usage:s,currency:i}),Z==="shortcuts"&&e.jsx(ni,{}),Z==="general"?e.jsxs(e.Fragment,{children:[e.jsx(Va,{baseUrl:t.baseUrl,apiKeyPrefix:t.apiKeyPrefix,onSave:D,onSaveApiKey:K}),e.jsx(Wa,{qq:X,configureOpen:ge,onOpenConfigure:()=>{F(),j(!0)},onCloseConfigure:()=>j(!1),onConnect:J,onDisconnect:ee,onSaveConfig:E,onSaveAndConnect:H=>{E(H),J()},onOpenApplyLink:u})]}):null]})]})]})})}function Wa({qq:t,configureOpen:n,onOpenConfigure:s,onCloseConfigure:i,onConnect:r,onDisconnect:o,onSaveConfig:d,onSaveAndConnect:p,onOpenApplyLink:h}){const g=t??{appId:void 0,appSecret:void 0,sandbox:!0,configured:!1,runtimeState:"disconnected",access:"open (unbound)"},[k,v]=l.useState(g.appId??""),[f,m]=l.useState(g.appSecret??""),[y,S]=l.useState(g.sandbox??!0);l.useEffect(()=>{v(g.appId??""),m(g.appSecret??""),S(g.sandbox??!0)},[g.appId,g.appSecret,g.sandbox,n]);const I={appId:k,appSecret:f,sandbox:y};return e.jsxs("section",{className:"section",children:[e.jsx("div",{className:"stitle",children:a("settings.qqSection")}),n?e.jsxs("div",{className:"qq-config-card",children:[e.jsxs("div",{className:"qq-config-head",children:[e.jsxs("div",{children:[e.jsx("div",{className:"n",children:a("settings.qqConfigureTitle")}),e.jsx("div",{className:"h",children:a("settings.qqConfigureHint")})]}),e.jsx("button",{type:"button",className:"btn",onClick:i,children:a("settings.qqBack")})]}),e.jsxs("div",{className:"setting-row",children:[e.jsx("div",{className:"l",children:e.jsx("div",{className:"n",children:a("settings.qqAppId")})}),e.jsx("input",{className:"field mono",value:k,onChange:q=>v(q.target.value),placeholder:"QQ Open Platform App ID"})]}),e.jsxs("div",{className:"setting-row",children:[e.jsx("div",{className:"l",children:e.jsx("div",{className:"n",children:a("settings.qqAppSecret")})}),e.jsx("input",{className:"field mono",type:"password",value:f,onChange:q=>m(q.target.value),placeholder:"QQ Open Platform App Secret"})]}),e.jsxs("div",{className:"setting-row",children:[e.jsx("div",{className:"l",children:e.jsx("div",{className:"n",children:a("settings.qqEnvironment")})}),e.jsxs("div",{className:"seg-ctrl",children:[e.jsx("button",{type:"button","data-on":y,onClick:()=>S(!0),children:a("settings.qqSandbox")}),e.jsx("button",{type:"button","data-on":!y,onClick:()=>S(!1),children:a("settings.qqProduction")})]})]}),e.jsxs("div",{className:"setting-row",children:[e.jsx("div",{className:"l",children:e.jsx("div",{className:"n",children:a("settings.qqApplyLabel")})}),e.jsx("button",{type:"button",className:"btn",onClick:h,children:a("settings.qqApplyAction")})]}),e.jsxs("div",{className:"qq-config-actions",children:[e.jsx("button",{type:"button",className:"btn",onClick:()=>{d(I),i()},children:a("settings.qqSave")}),e.jsx("button",{type:"button",className:"btn primary",onClick:()=>{p(I),i()},children:a("settings.qqSaveAndConnect")})]})]}):e.jsxs("div",{className:"setting-row qq-setting-row",children:[e.jsxs("div",{className:"l",children:[e.jsx("div",{className:"n",children:a("settings.qqTitle")}),e.jsx("div",{className:"h",children:Ua(g)})]}),e.jsxs("div",{className:"qq-row-actions",children:[e.jsx("button",{type:"button",className:`btn qq-status-btn qq-status-${g.runtimeState==="connected"?"on":g.runtimeState==="connecting"?"connecting":g.runtimeState==="failed"?"failed":"off"}`,onClick:()=>{if(Oa(g)==="configure"){s();return}if(g.runtimeState==="connected"){o();return}r()},children:Fa(g)}),e.jsx("button",{type:"button",className:"btn",onClick:s,children:a("settings.qqConfigure")})]})]})]})}function Ga({settings:t,theme:n,themeStyle:s,onSetTheme:i,onSetThemeStyle:r,fontScale:o,onSetFontScale:d,fontFamily:p,onSetFontFamily:h,onSave:g,onPickWorkspace:k}){const[v,f]=l.useState(t.editor??""),m=$();return e.jsxs(e.Fragment,{children:[e.jsxs("section",{className:"section",children:[e.jsx("div",{className:"stitle",children:a("settings.appearanceSection")}),e.jsxs("div",{className:"setting-row",children:[e.jsxs("div",{className:"l",children:[e.jsx("div",{className:"n",children:a("settings.theme")}),e.jsx("div",{className:"h",children:a("settings.themeHint")})]}),e.jsxs("div",{className:"seg-ctrl",children:[e.jsx("button",{type:"button","data-on":n===se.DARK,onClick:()=>i(se.DARK),children:a("settings.themeDark")}),e.jsx("button",{type:"button","data-on":n===se.LIGHT,onClick:()=>i(se.LIGHT),children:a("settings.themeLight")})]})]}),e.jsxs("div",{className:"setting-row theme-style-row",children:[e.jsxs("div",{className:"l",children:[e.jsx("div",{className:"n",children:a("settings.themeStyle")}),e.jsx("div",{className:"h",children:a("settings.themeStyleHint")})]}),e.jsx("div",{className:"style-grid",children:Mn.map(y=>e.jsxs("button",{type:"button",className:"style-card","data-on":s===y,"data-style":y,onClick:()=>r(y),children:[e.jsxs("span",{className:"style-card-head",children:[e.jsx("span",{className:"style-name",children:a(`settings.themeStyle${y[0].toUpperCase()}${y.slice(1)}`)}),e.jsx("span",{className:"style-mode",children:Fe(y)===se.DARK?a("settings.themeDark"):a("settings.themeLight")})]}),e.jsxs("span",{className:"style-swatches","aria-hidden":"true",children:[e.jsx("span",{}),e.jsx("span",{}),e.jsx("span",{})]}),e.jsx("span",{className:"style-desc",children:a(`settings.themeStyle${y[0].toUpperCase()}${y.slice(1)}Desc`)})]},y))})]}),e.jsxs("div",{className:"setting-row",children:[e.jsxs("div",{className:"l",children:[e.jsx("div",{className:"n",children:a("settings.fontScale")}),e.jsx("div",{className:"h",children:a("settings.fontScaleHint")})]}),e.jsxs("div",{className:"seg-ctrl",children:[e.jsx("button",{type:"button","data-on":o===ue.SMALL,onClick:()=>d(ue.SMALL),children:a("settings.fontScaleSmall")}),e.jsx("button",{type:"button","data-on":o===ue.MEDIUM,onClick:()=>d(ue.MEDIUM),children:a("settings.fontScaleMedium")}),e.jsx("button",{type:"button","data-on":o===ue.LARGE,onClick:()=>d(ue.LARGE),children:a("settings.fontScaleLarge")})]})]}),e.jsxs("div",{className:"setting-row",children:[e.jsxs("div",{className:"l",children:[e.jsx("div",{className:"n",children:a("settings.fontFamily")}),e.jsx("div",{className:"h",children:a("settings.fontFamilyHint")})]}),e.jsxs("div",{className:"seg-ctrl",children:[e.jsx("button",{type:"button","data-on":p===pe.SANS,onClick:()=>h(pe.SANS),children:a("settings.fontFamilySans")}),e.jsx("button",{type:"button","data-on":p===pe.SYSTEM,onClick:()=>h(pe.SYSTEM),children:a("settings.fontFamilySystem")}),e.jsx("button",{type:"button","data-on":p===pe.SERIF,onClick:()=>h(pe.SERIF),children:a("settings.fontFamilySerif")})]})]}),e.jsxs("div",{className:"setting-row",children:[e.jsxs("div",{className:"l",children:[e.jsx("div",{className:"n",children:a("settings.language")}),e.jsx("div",{className:"h",children:a("settings.languageHint")})]}),e.jsx("div",{className:"seg-ctrl",children:Sn().map(y=>e.jsx("button",{type:"button","data-on":m===y,onClick:()=>Cn(y),children:jn(y)},y))})]})]}),e.jsxs("section",{className:"section",children:[e.jsx("div",{className:"stitle",children:a("settings.workspaceSection")}),e.jsxs("div",{className:"setting-row",children:[e.jsxs("div",{className:"l",children:[e.jsx("div",{className:"n",children:a("settings.currentWorkspace")}),e.jsx("div",{className:"h",children:t.workspaceDir||a("settings.notSelected")})]}),e.jsx("button",{type:"button",className:"btn",onClick:k,children:a("settings.workspaceChange")})]}),e.jsxs("div",{className:"setting-row",children:[e.jsxs("div",{className:"l",children:[e.jsx("div",{className:"n",children:a("settings.editor")}),e.jsx("div",{className:"h",children:a("settings.editorHint")})]}),e.jsx("input",{className:"field mono",value:v,placeholder:"cursor --goto",onChange:y=>f(y.target.value),onBlur:()=>g({editor:v||void 0})})]})]}),e.jsxs("section",{className:"section",children:[e.jsx("div",{className:"stitle",children:a("settings.behaviorSection")}),e.jsxs("div",{className:"setting-row",children:[e.jsxs("div",{className:"l",children:[e.jsx("div",{className:"n",children:a("settings.reasoningEffort")}),e.jsx("div",{className:"h",children:a("settings.reasoningEffortHint")})]}),e.jsx("div",{className:"seg-ctrl",children:["low","medium","high","max"].map(y=>e.jsx("button",{type:"button","data-on":t.reasoningEffort===y,onClick:()=>g({reasoningEffort:y}),children:y},y))})]}),e.jsxs("div",{className:"setting-row",children:[e.jsxs("div",{className:"l",children:[e.jsx("div",{className:"n",children:a("settings.editMode")}),e.jsx("div",{className:"h",children:a("settings.editModeHint")})]}),e.jsx("div",{className:"seg-ctrl",children:["plan","review","auto","yolo"].map(y=>e.jsx("button",{type:"button","data-on":t.editMode===y,onClick:()=>g({editMode:y}),children:y},y))})]}),e.jsxs("div",{className:"setting-row",children:[e.jsxs("div",{className:"l",children:[e.jsx("div",{className:"n",children:a("settings.showSystemEvents")}),e.jsx("div",{className:"h",children:a("settings.showSystemEventsHint")})]}),e.jsxs("div",{className:"seg-ctrl",children:[e.jsx("button",{type:"button","data-on":t.showSystemEvents!==!1,onClick:()=>g({showSystemEvents:!0}),children:a("settings.shown")}),e.jsx("button",{type:"button","data-on":t.showSystemEvents===!1,onClick:()=>g({showSystemEvents:!1}),children:a("settings.hidden")})]})]}),e.jsxs("div",{className:"setting-row",children:[e.jsxs("div",{className:"l",children:[e.jsx("div",{className:"n",children:a("settings.budget")}),e.jsx("div",{className:"h",children:a("settings.budgetHint")})]}),e.jsx("input",{className:"field",type:"number",defaultValue:t.budgetUsd??"",placeholder:a("settings.budgetPlaceholder"),onBlur:y=>{const S=y.target.value.trim();g({budgetUsd:S===""?null:Number(S)})}})]}),e.jsxs("div",{className:"setting-row",children:[e.jsxs("div",{className:"l",children:[e.jsx("div",{className:"n",children:a("settings.webSearchEngine")}),e.jsx("div",{className:"h",children:a("settings.webSearchEngineNote")})]}),e.jsxs("select",{className:"field",value:t.webSearchEngine??"bing",onChange:y=>g({webSearchEngine:y.target.value}),children:[e.jsx("option",{value:"bing",children:a("settings.webSearchEngineBing")}),e.jsx("option",{value:"searxng",children:a("settings.webSearchEngineSearxng")}),e.jsx("option",{value:"metaso",children:a("settings.webSearchEngineMetaso")}),e.jsx("option",{value:"tavily",children:a("settings.webSearchEngineTavily")}),e.jsx("option",{value:"perplexity",children:a("settings.webSearchEnginePerplexity")}),e.jsx("option",{value:"exa",children:a("settings.webSearchEngineExa")}),e.jsx("option",{value:"brave",children:a("settings.webSearchEngineBrave")}),e.jsx("option",{value:"ollama",children:a("settings.webSearchEngineOllama")})]})]})]})]})}function Va({baseUrl:t,apiKeyPrefix:n,onSave:s,onSaveApiKey:i}){const[r,o]=l.useState(""),[d,p]=l.useState(t??"");return e.jsxs("section",{className:"section",children:[e.jsx("div",{className:"stitle",children:a("settings.apiSection")}),e.jsxs("div",{className:"setting-row",children:[e.jsxs("div",{className:"l",children:[e.jsx("div",{className:"n",children:a("settings.apiKey")}),e.jsx("div",{className:"h",children:n?a("settings.apiKeySet",{prefix:n}):a("settings.apiKeyNotSet")})]}),e.jsxs("div",{style:{display:"flex",gap:6},children:[e.jsx("input",{className:"field mono",type:"password",value:r,onChange:h=>o(h.target.value),placeholder:"sk-…"}),e.jsx("button",{type:"button",className:"btn primary",disabled:!r,onClick:()=>{r&&(i(r),o(""))},children:a("settings.apiKeySave")})]})]}),e.jsxs("div",{className:"setting-row",children:[e.jsxs("div",{className:"l",children:[e.jsx("div",{className:"n",children:a("settings.baseUrl")}),e.jsx("div",{className:"h",children:a("settings.baseUrlHint")})]}),e.jsx("input",{className:"field mono",value:d,onChange:h=>p(h.target.value),onBlur:()=>s({baseUrl:d.trim()||void 0})})]})]})}const Xt=["deepseek-v4-flash","deepseek-v4-pro"],Ja=["low","medium","high","max"];function Ya({settings:t,onSave:n}){const[s,i]=l.useState(t.model);l.useEffect(()=>i(t.model),[t.model]);const r=Xt.includes(t.model);return e.jsxs(e.Fragment,{children:[e.jsxs("section",{className:"section",children:[e.jsx("div",{className:"stitle",children:a("settings.defaultModelCurrent",{model:t.model})}),e.jsx("div",{className:"model-grid",children:Xt.map(o=>e.jsx("div",{className:"mcard","data-on":t.model===o,onClick:()=>n({model:o}),children:e.jsx("div",{className:"nm",children:o})},o))}),e.jsxs("div",{className:"setting-row",style:{marginTop:12},children:[e.jsxs("div",{className:"l",children:[e.jsx("div",{className:"n",children:a("settings.modelCustom")}),e.jsx("div",{className:"h",children:a("settings.modelCustomHint")})]}),e.jsxs("div",{style:{display:"flex",gap:6},children:[e.jsx("input",{className:"field mono",value:s,onChange:o=>i(o.target.value),placeholder:"deepseek-v4-flash"}),e.jsx("button",{type:"button",className:"btn primary",disabled:!s.trim()||s.trim()===t.model,onClick:()=>n({model:s.trim()}),children:a("settings.apiKeySave")})]})]}),r?null:e.jsx("div",{className:"h",style:{marginTop:6},children:a("settings.modelCustomActive",{model:t.model})})]}),e.jsxs("section",{className:"section",children:[e.jsx("div",{className:"stitle",children:a("settings.effortSection")}),e.jsxs("div",{className:"setting-row",children:[e.jsxs("div",{className:"l",children:[e.jsx("div",{className:"n",children:a("settings.reasoningEffort")}),e.jsx("div",{className:"h",children:a("settings.reasoningEffortHint")})]}),e.jsx("div",{className:"seg-ctrl",children:Ja.map(o=>e.jsx("button",{type:"button","data-on":t.reasoningEffort===o,onClick:()=>n({reasoningEffort:o}),children:o},o))})]})]})]})}function Qa({specs:t,bridged:n,onAdd:s,onRemove:i}){const[r,o]=l.useState(""),d=()=>{const p=r.trim();p&&(s(p),o(""))};return e.jsxs(e.Fragment,{children:[e.jsxs("section",{className:"section",children:[e.jsxs("div",{className:"stitle",children:[a("settings.mcpConfigured",{count:t.length}),n?e.jsx("span",{style:{color:"var(--accent)",marginLeft:8,fontSize:11},children:a("settings.mcpBridged")}):e.jsx("span",{style:{color:"var(--muted)",marginLeft:8,fontSize:11},children:a("settings.mcpNotBridged")})]}),t.length===0?e.jsx("div",{style:{padding:16,background:"var(--card)",border:"1px solid var(--border)",borderRadius:10,fontSize:12,color:"var(--muted)"},children:a("settings.mcpEmpty")}):t.map(p=>e.jsxs("div",{className:"scard",children:[e.jsxs("div",{className:"top",children:[e.jsx("span",{className:"ico",children:e.jsx(x.wrench,{size:14})}),e.jsxs("div",{children:[e.jsx("div",{className:"nm",children:p.name??"(anonymous)"}),e.jsx("div",{className:"sub",children:p.summary})]}),e.jsx("span",{className:"grow"}),e.jsx("button",{type:"button",className:"btn ghost",style:{color:"var(--danger)"},onClick:()=>i(p.raw),children:a("settings.mcpRemove")})]}),p.parseError?e.jsx("div",{className:"desc",style:{color:"var(--danger)"},children:a("settings.parseError",{error:p.parseError})}):null]},p.raw))]}),e.jsxs("section",{className:"section",children:[e.jsx("div",{className:"stitle",children:a("settings.mcpAddSection")}),e.jsxs("div",{className:"setting-row",children:[e.jsxs("div",{className:"l",children:[e.jsx("div",{className:"n",children:a("settings.mcpSpecLabel")}),e.jsx("div",{className:"h",dangerouslySetInnerHTML:{__html:a("settings.mcpSpecFormat")}})]}),e.jsxs("div",{style:{display:"flex",gap:6},children:[e.jsx("input",{className:"field mono",value:r,onChange:p=>o(p.target.value),placeholder:"github=npx -y @smithery/cli ...",onKeyDown:p=>{p.key==="Enter"&&d()}}),e.jsx("button",{type:"button",className:"btn primary",disabled:!r.trim(),onClick:d,children:a("settings.mcpAdd")})]})]})]})]})}function Za({skills:t,subagentModels:n,onSave:s}){const i=(r,o)=>{s({subagentModels:{...n,[r]:o}})};return e.jsxs("section",{className:"section",children:[e.jsx("div",{className:"stitle",children:a("settings.skillsLoaded",{count:t.length})}),t.length===0?e.jsx("div",{style:{padding:16,background:"var(--card)",border:"1px solid var(--border)",borderRadius:10,fontSize:12,color:"var(--muted)"},children:a("settings.skillsEmpty")}):t.map(r=>e.jsxs("div",{className:"scard",children:[e.jsxs("div",{className:"top",children:[e.jsx("span",{className:"ico",children:e.jsx(x.zap,{size:14})}),e.jsxs("div",{children:[e.jsx("div",{className:"nm",children:e.jsxs("span",{style:{fontFamily:"Geist Mono, monospace",color:"var(--accent)"},children:["/",r.name]})}),e.jsxs("div",{className:"sub",children:[r.scope," · ",r.runAs,r.model?` · ${r.model}`:""]})]}),r.runAs==="subagent"?e.jsxs("select",{className:"field",style:{marginLeft:"auto",minWidth:96},value:n[r.name]??"flash",onChange:o=>i(r.name,o.target.value),title:a("settings.subagentModelHint"),children:[e.jsx("option",{value:"flash",children:a("settings.subagentModelFlash")}),e.jsx("option",{value:"pro",children:a("settings.subagentModelPro")})]}):null]}),e.jsx("div",{className:"desc",children:r.description}),e.jsx("div",{style:{fontFamily:"Geist Mono, monospace",fontSize:10.5,color:"var(--muted-2)",marginTop:4},children:r.path})]},`${r.scope}:${r.name}`))]})}function Xa({entries:t,detail:n,onRead:s}){return e.jsxs("section",{className:"section",children:[e.jsx("div",{className:"stitle",children:a("settings.memorySection")}),t.length===0?e.jsx("div",{className:"muted-card",children:a("settings.memoryDesc")}):e.jsxs("div",{className:"memory-browser",children:[e.jsx("div",{className:"memory-list",children:t.map(i=>e.jsxs("button",{type:"button",className:"memory-item","data-active":n?.path===i.path,onClick:()=>s(i.path),children:[e.jsx("span",{className:"memory-kind",children:i.kind.replace("_"," ")}),e.jsx("span",{className:"memory-name",children:i.description||i.name}),e.jsx("span",{className:"memory-path",children:i.path})]},i.path))}),e.jsx("pre",{className:"memory-detail",children:n?n.body:a("settings.memoryDesc")})]})]})}function ei({settings:t,onSave:n}){return e.jsxs(e.Fragment,{children:[e.jsxs("section",{className:"section",children:[e.jsx("div",{className:"stitle",children:a("settings.editMode")}),e.jsxs("div",{className:"setting-row",children:[e.jsxs("div",{className:"l",children:[e.jsx("div",{className:"n",children:a("settings.appMode")}),e.jsx("div",{className:"h",children:a("settings.editModeHint")})]}),e.jsx("div",{className:"seg-ctrl",children:["plan","review","auto","yolo"].map(s=>e.jsx("button",{type:"button","data-on":t.editMode===s,onClick:()=>n({editMode:s}),children:s},s))})]})]}),e.jsxs("section",{className:"section",children:[e.jsx("div",{className:"stitle",children:a("settings.ruleAutoApprovalSection")}),e.jsx("div",{style:{padding:12,background:"var(--card)",border:"1px solid var(--border)",borderRadius:10,fontSize:12,color:"var(--muted)"},children:a("settings.ruleAutoApprovalHint")})]})]})}function ti({balance:t,usage:n,currency:s}){const i=s==="CNY"?"¥":"$",r=s==="CNY"?n.totalCostUsd*7.2:n.totalCostUsd,o=n.cacheHitTokens+n.cacheMissTokens,d=o>0?Math.round(n.cacheHitTokens/o*100):0;return e.jsx(e.Fragment,{children:e.jsxs("div",{className:"bill-grid",children:[e.jsxs("div",{className:"bill-card",children:[e.jsx("div",{className:"l",children:a("settings.balanceLabel")}),e.jsx("div",{className:"v ok",children:t?`${t.currency==="USD"?"$":"¥"} ${t.total.toFixed(2)}`:"—"}),e.jsx("div",{className:"sub",children:t&&!t.isAvailable?a("settings.balanceLow"):a("settings.balanceAvailable")})]}),e.jsxs("div",{className:"bill-card",children:[e.jsx("div",{className:"l",children:a("settings.sessionCost")}),e.jsxs("div",{className:"v",children:[i," ",r.toFixed(4)]}),e.jsxs("div",{className:"sub",children:["prompt ",n.totalPromptTokens.toLocaleString()," t"]})]}),e.jsxs("div",{className:"bill-card",children:[e.jsx("div",{className:"l",children:a("settings.cacheHitRate")}),e.jsxs("div",{className:"v acc",children:[d,"%"]}),e.jsxs("div",{className:"sub",children:["hit ",n.cacheHitTokens.toLocaleString()," / miss"," ",n.cacheMissTokens.toLocaleString()]})]})]})})}function ni(){const t=[{nm:a("settings.shortcutNewChat"),keys:["mod","N"]},{nm:a("settings.shortcutNewTab"),keys:["mod","T"]},{nm:a("settings.shortcutCloseTab"),keys:["mod","W"]},{nm:a("settings.shortcutCommandPalette"),keys:["mod","K"]},{nm:a("settings.shortcutFocusComposer"),keys:["mod","L"]},{nm:a("settings.shortcutSwitchTab"),keys:["mod","tab"]},{nm:a("settings.shortcutAbort"),keys:["esc"]},{nm:a("settings.shortcutSettings"),keys:["mod",","]}];return e.jsx("section",{className:"section",children:e.jsx("div",{className:"kbd-grid",children:t.map((n,s)=>e.jsx(si,{nm:n.nm,keys:n.keys},s))})})}function si({nm:t,keys:n}){return e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"nm",children:t}),e.jsx("div",{className:"keys",children:e.jsx(G,{keys:n})})]})}function mt(t){if(t.summary&&t.summary.trim())return t.summary.trim();const n=t.name.match(/^desktop-(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(?:-(\d+))?$/);if(n){const[,,s,i,r,o,d]=n;return`${a("sidebarPanel.sessionTitle",{month:s,day:i,hour:r,minute:o})}${d&&d!=="1"?` · #${d}`:""}`}return t.name.replace(/^desktop-/,"").replace(/[-_]+/g," ")}function ai(t){const n=t/6e4;if(n<1)return a("sidebarPanel.justNow");if(n<60)return a("sidebarPanel.minutesAgo",{n:Math.floor(n)});const s=n/60;if(s<24)return a("sidebarPanel.hoursAgo",{n:Math.floor(s)});const i=s/24;return i<7?a("sidebarPanel.daysAgo",{n:Math.floor(i)}):a("sidebarPanel.weeksAgo",{n:Math.floor(i/7)})}function ii({sessions:t,activeName:n,loadingName:s,onNewChat:i,onLoadSession:r,onDeleteSession:o,onOpenSettings:d,onOpenRules:p,onOpenCommands:h,onOpenAbout:g}){$();const[k,v]=l.useState(""),[f,m]=l.useState(null),y=k?t.filter(S=>{const I=k.toLowerCase();return mt(S).toLowerCase().includes(I)||S.name.toLowerCase().includes(I)}):t;return l.useEffect(()=>{if(!f)return;const S=q=>{q.target?.closest(".session-delete-popover")||m(null)},I=q=>{q.key==="Escape"&&m(null)};return window.addEventListener("mousedown",S),window.addEventListener("keydown",I),()=>{window.removeEventListener("mousedown",S),window.removeEventListener("keydown",I)}},[f]),e.jsxs("aside",{className:"sidebar",children:[e.jsxs("div",{className:"side-head",children:[e.jsxs("button",{type:"button",className:"new-btn",onClick:i,children:[e.jsx(x.plus,{size:14}),e.jsx("span",{children:a("sidebarPanel.newChat")}),e.jsx(G,{keys:["mod","N"]})]}),e.jsx("button",{type:"button",className:"icon-btn",title:a("sidebarPanel.commandPalette"),onClick:h,children:e.jsx(x.history,{size:14})})]}),e.jsx("div",{className:"search-row",children:e.jsxs("div",{className:"input",children:[e.jsx(x.search,{size:13}),e.jsx("input",{placeholder:a("sidebarPanel.searchSessions"),value:k,onChange:S=>v(S.target.value)}),e.jsx(G,{keys:["mod","K"]})]})}),e.jsx("div",{className:"session-list",children:e.jsxs("div",{className:"side-section",children:[e.jsxs("div",{className:"label",children:[e.jsx("span",{children:a("sidebarPanel.recent")}),e.jsx("span",{className:"count",children:y.length})]}),t.length===0?e.jsx("div",{style:{padding:"12px 8px",fontSize:11,color:"var(--muted-2)",fontFamily:"Geist Mono, monospace"},children:a("sidebarPanel.noSessions")}):y.length===0?e.jsx("div",{style:{padding:"12px 8px",fontSize:11,color:"var(--muted-2)",fontFamily:"Geist Mono, monospace"},children:a("sidebarPanel.noMatches")}):null,y.map(S=>{const I=S.name===n,q=S.name===s,X=Date.parse(S.mtime),R=Number.isFinite(X)?ai(Date.now()-X):S.mtime;return e.jsxs("div",{className:"session-item","data-active":I,"data-loading":q||void 0,style:s&&!q?{opacity:.5,pointerEvents:"none"}:void 0,onClick:()=>r(S.name),role:"button",tabIndex:0,title:S.name,onKeyDown:D=>{D.key==="Enter"&&r(S.name)},children:[e.jsx("span",{className:"state",style:{background:q||I?"var(--accent)":"var(--border-strong)",animation:q?"session-pulse 0.9s ease-in-out infinite":void 0}}),e.jsxs("div",{className:"body",children:[e.jsx("span",{className:"title",children:mt(S)}),e.jsx("span",{className:"meta",children:q?e.jsx("span",{children:a("sidebarPanel.loading")}):e.jsxs(e.Fragment,{children:[e.jsx("span",{children:a("sidebarPanel.messageCount",{count:S.messageCount})}),e.jsx("span",{className:"sep",children:"·"}),e.jsx("span",{children:R})]})})]}),e.jsx("button",{type:"button",className:"delete-btn",title:a("sidebarPanel.deleteSession"),"aria-label":a("sidebarPanel.deleteSession"),onClick:D=>{D.stopPropagation();const K=D.currentTarget.getBoundingClientRect();m({name:S.name,pretty:mt(S),x:K.right,y:K.bottom})},onKeyDown:D=>{(D.key==="Enter"||D.key===" ")&&D.stopPropagation()},children:e.jsx(x.x,{size:12})})]},S.name)})]})}),e.jsxs("div",{className:"side-foot",children:[e.jsxs("div",{className:"row",onClick:p,children:[e.jsx("span",{className:"ico",children:e.jsx(x.shield,{size:13})}),e.jsx("span",{children:a("sidebarPanel.approvalRules")})]}),e.jsxs("div",{className:"row",onClick:g,children:[e.jsx("span",{className:"ico",children:e.jsx(x.help,{size:13})}),e.jsx("span",{children:a("about.sidebarLabel")})]}),e.jsxs("div",{className:"row",onClick:d,children:[e.jsx("span",{className:"ico",children:e.jsx(x.cog,{size:13})}),e.jsx("span",{children:a("sidebarPanel.settings")}),e.jsx("span",{className:"right",children:e.jsx(G,{keys:["mod",","]})})]})]}),f?e.jsx(ri,{target:f,onCancel:()=>m(null),onConfirm:()=>{o(f.name),m(null)}}):null]})}function ri({target:t,onCancel:n,onConfirm:s}){const i=l.useRef(null),r=l.useRef(null),[o,d]=l.useState({left:t.x,top:t.y});return l.useLayoutEffect(()=>{const p=i.current;if(!p)return;const h=p.getBoundingClientRect(),g=8,k=window.innerWidth,v=window.innerHeight;let f=t.x,m=t.y;f+h.width+g>k&&(f=Math.max(g,k-h.width-g)),m+h.height+g>v&&(m=Math.max(g,v-h.height-g)),(f!==o.left||m!==o.top)&&d({left:f,top:m}),r.current?.focus()},[t.x,t.y,o.left,o.top]),e.jsxs("div",{ref:i,className:"session-delete-popover",role:"dialog","aria-modal":"true",style:{left:o.left,top:o.top},children:[e.jsxs("div",{className:"msg",children:[a("sidebarPanel.deleteSession"),e.jsx("span",{className:"name",children:t.pretty})]}),e.jsxs("div",{className:"actions",children:[e.jsx("button",{ref:r,type:"button",className:"cancel",onClick:n,children:a("sidebarPanel.cancel")}),e.jsxs("button",{type:"button",className:"confirm",onClick:s,children:[e.jsx(x.x,{size:11}),a("sidebarPanel.delete")]})]})]})}const Rn="reasonix.splash.shown";function oi(){try{return sessionStorage.getItem(Rn)!=="1"}catch{return!0}}function ht(){try{sessionStorage.setItem(Rn,"1")}catch{}}function li({onDone:t}){const[n,s]=l.useState(!1),i=l.useRef(t);i.current=t,l.useEffect(()=>{const o=window.setTimeout(()=>s(!0),1350),d=window.setTimeout(()=>{ht(),i.current()},1800);return()=>{window.clearTimeout(o),window.clearTimeout(d)}},[]),l.useEffect(()=>{const o=d=>{d.key!=="Escape"&&d.key!=="Enter"&&d.key!==" "||(ht(),i.current())};return window.addEventListener("keydown",o),()=>window.removeEventListener("keydown",o)},[]);const r=()=>{ht(),t()};return e.jsx("div",{className:"splash","data-leaving":n,onClick:r,children:e.jsxs("div",{className:"splash-card",children:[e.jsx("div",{className:"splash-mark"}),e.jsx("div",{className:"splash-name",children:"Reasonix"}),e.jsx("div",{className:"splash-sub",children:a("app.splashSubtitle")}),e.jsxs("div",{className:"splash-dots",children:[e.jsx("span",{}),e.jsx("span",{}),e.jsx("span",{})]})]})})}const ci=7.2;function di(t,n){const s=n==="CNY"?"¥":"$",i=n==="CNY"?t*ci:t;return`${s} ${i.toFixed(4)}`}function ui(t){return t>=1e3?`${(t/1e3).toFixed(1)}k`:`${t}`}function pi({settings:t,balance:n,usage:s,busy:i,ready:r,currency:o,theme:d,themeStyle:p,jobs:h,jobsOpen:g,onToggleJobs:k,onSetThemeStyle:v,onToggleCurrency:f,onOpenSettings:m,onOpenWorkdir:y}){const S=s.cacheHitTokens+s.cacheMissTokens,I=S>0?Math.round(s.cacheHitTokens/S*100):0,q=h.filter(E=>E.running).length,X=di(s.totalCostUsd,o),R=n?`${n.currency==="USD"?"$":"¥"} ${n.total.toFixed(2)}`:"—",D=r?i?"running":"online":"off",[K,F]=l.useState(!1),J=l.useRef(null),ee=l.useRef(null);return l.useEffect(()=>{if(!K)return;const E=u=>{const z=u.target;J.current?.contains(z)||ee.current?.contains(z)||F(!1)};return window.addEventListener("pointerdown",E),()=>window.removeEventListener("pointerdown",E)},[K]),e.jsxs("footer",{className:"statusbar",children:[e.jsxs("span",{className:"seg",title:`API · ${t?.baseUrl??"api.deepseek.com"}`,children:[e.jsx("span",{className:D==="off"?"sw warn":"sw",style:D==="off"?{background:"var(--danger)"}:void 0}),e.jsx("span",{children:t?.baseUrl?.replace(/^https?:\/\//,"")??"api.deepseek.com"}),e.jsx("span",{className:"v",children:a(r?i?"statusbar.busy":"statusbar.online":"statusbar.offline")})]}),e.jsxs("span",{className:"seg",title:a("statusbar.cacheHit"),children:[e.jsx(x.zap,{size:11,style:{color:"var(--accent)"}}),e.jsx("span",{children:a("statusbar.cache")}),e.jsxs("span",{className:"v acc",children:[I,"%"]})]}),e.jsxs("span",{className:"seg",children:[e.jsx(x.cpu,{size:11}),e.jsx("span",{children:a("statusbar.tokens")}),e.jsx("span",{className:"v",children:ui(S)})]}),e.jsxs("span",{className:"seg",children:[e.jsx(x.coin,{size:11}),e.jsx("span",{children:a("statusbar.thisTurn")}),e.jsx("span",{className:"v ok",children:X})]}),e.jsx("span",{className:"grow"}),e.jsxs("span",{className:`seg jobs ${g?"active":""}`,onClick:k,title:Nn(a("statusbar.jobsTip")),children:[e.jsx(x.cpu,{size:11}),e.jsx("span",{children:a("statusbar.jobs")}),e.jsx("span",{className:q>0?"v acc":"v",children:q})]}),t?.workspaceDir?e.jsxs("span",{className:"seg",title:a("statusbar.switchWorkspace",{workspace:t.workspaceDir}),style:y?{cursor:"pointer"}:void 0,onClick:E=>{if(!y)return;const u=E.currentTarget.getBoundingClientRect();y({bottom:window.innerHeight-u.top+6,left:u.left})},children:[e.jsx(x.folder,{size:11}),e.jsx("span",{className:"v",children:t.workspaceDir.split(/[\\/]/).pop()||"ws"})]}):null,e.jsxs("span",{className:"seg",title:`model · effort ${t?.reasoningEffort??"high"}`,onClick:m,children:[e.jsx(x.brain,{size:11,style:{color:"var(--violet)"}}),e.jsx("span",{className:"v vio",children:t?.model??"—"}),e.jsx("span",{className:"v",children:t?.reasoningEffort??"high"})]}),e.jsxs("span",{className:"seg",title:a("statusbar.switchCurrency"),onClick:f,children:[e.jsx(x.coin,{size:11}),e.jsx("span",{children:a("statusbar.balance")}),e.jsx("span",{className:"v ok",children:R})]}),e.jsxs("span",{ref:ee,className:`seg theme-trigger ${K?"active":""}`,title:a("statusbar.switchTheme"),onClick:()=>F(E=>!E),children:[d===se.DARK?e.jsx(x.moon,{size:11}):e.jsx(x.sun,{size:11}),e.jsx("span",{className:"v",children:a(`statusbar.themeStyle${p[0].toUpperCase()}${p.slice(1)}`)})]}),K?e.jsxs("div",{ref:J,className:"theme-pop",role:"menu","aria-label":a("settings.themeStyle"),children:[e.jsxs("div",{className:"theme-pop-head",children:[e.jsx("div",{className:"tt",children:a("settings.themeStyle")}),e.jsx("div",{className:"ss",children:a("statusbar.switchTheme")})]}),e.jsx("div",{className:"theme-pop-list",children:Mn.map(E=>e.jsxs("button",{type:"button",className:"theme-pop-item","data-on":p===E,"data-style":E,onClick:()=>{v(E),F(!1)},children:[e.jsxs("span",{className:"style-swatches","aria-hidden":"true",children:[e.jsx("span",{}),e.jsx("span",{}),e.jsx("span",{})]}),e.jsxs("span",{className:"txt",children:[e.jsx("span",{className:"nm",children:a(`statusbar.themeStyle${E[0].toUpperCase()}${E.slice(1)}`)}),e.jsx("span",{className:"md",children:Fe(E)===se.DARK?a("statusbar.themeDark"):a("statusbar.themeLight")})]}),p===E?e.jsx(x.check,{size:13}):null]},E))})]}):null]})}const Nt=`[CONVERSATION HISTORY SUMMARY — earlier turns folded for context efficiency]
12
12
 
13
- `;function li(t){return typeof t=="string"&&t.startsWith(St)}function ci(t){return t.startsWith(St)?t.slice(St.length):t}function Mn(t){const n=t.trim().split(/\s+/).filter(Boolean);if(n.length===0)return"";if(n.length===1)return n[0];const s=n[0];return new Set(["npm","npx","pnpm","yarn","bun","git","cargo","go","docker","kubectl","python","python3","deno","pip","pip3","make","rake","bundle","gem"]).has(s)?`${s} ${n[1]}`:s}function et({tone:t="default",icon:n,kind:s,name:i,meta:r,defaultOpen:o=!0,compact:d=!1,children:p,headRight:h}){const[g,k]=l.useState(o);return e.jsxs("div",{className:d?"card is-compact":"card","data-tone":t,"data-open":g,children:[e.jsxs("button",{type:"button",className:"card-head",onClick:()=>k(v=>!v),style:{width:"100%",background:"none",border:"none",textAlign:"left",font:"inherit",color:"inherit"},children:[e.jsx("span",{className:"ico",children:n}),e.jsx("span",{className:"kind",children:s}),i?e.jsx("span",{className:"name",children:i}):null,e.jsx("span",{className:"grow"}),r?e.jsx("span",{className:"meta",children:r}):null,h,e.jsx("span",{className:"chev",children:e.jsx(x.chev,{size:12})})]}),g?e.jsx("div",{className:"card-body",children:p}):null]})}function je({state:t,label:n}){switch(t){case"running":return e.jsx("span",{className:"spin-meta",role:"img","aria-label":n,title:n});case"done":return e.jsx(x.check,{size:10,style:{color:"var(--success)"},"aria-label":n});case"failed":return e.jsx(x.x,{size:10,style:{color:"var(--danger)"},"aria-label":n});case"waiting":return e.jsx("span",{className:"status-dot warn",role:"img","aria-label":n,title:n});case"blocked":return e.jsx(x.slash,{size:10,style:{color:"var(--warning)"},"aria-label":n})}}function di({text:t,streaming:n,tokens:s,elapsed:i,model:r}){return $(),e.jsx(et,{tone:"violet",icon:e.jsx(x.brain,{size:12}),kind:"reasoning",name:a("cards.reasoningName"),meta:e.jsxs(e.Fragment,{children:[i||s?e.jsxs("span",{children:[i??"",i&&s?" · ":"",s?`${s.toLocaleString()} t`:""]}):null,n?e.jsx(je,{state:"running",label:a("cards.streaming")}):e.jsx(je,{state:"done",label:a("cards.reasoningComplete")})]}),defaultOpen:n,compact:!0,children:e.jsxs("div",{className:"reason",children:[e.jsx("div",{className:"stream",children:t.split(/\n\n+/).map((o,d)=>e.jsx("p",{dangerouslySetInnerHTML:{__html:o.replace(/`([^`]+)`/g,'<span class="hl">$1</span>').replace(/\*\*([^*]+)\*\*/g,"<strong>$1</strong>")}},d))}),r||s!==void 0?e.jsxs("div",{className:"meta",children:[r?e.jsxs("span",{children:[e.jsx("span",{className:"k",children:a("settings.model")})," ",r]}):null,s!==void 0?e.jsxs("span",{children:[e.jsx("span",{className:"k",children:a("statusbar.tokens")})," ",s.toLocaleString()]}):null]}):null]})})}function ui({command:t,output:n,state:s,durationMs:i,onApprove:r,onReject:o,onAlwaysAllow:d}){$();const p=s==="failed"?"danger":s==="done"?"success":"warning";return e.jsx(et,{tone:p,icon:e.jsx(x.terminal,{size:12}),kind:"shell",name:"shell",compact:!0,meta:e.jsxs(e.Fragment,{children:[s==="await"?e.jsx(je,{state:"waiting",label:a("cards.shellAwaiting")}):s==="running"?e.jsx(je,{state:"running",label:a("cards.shellRunning")}):s==="failed"?e.jsx(je,{state:"failed",label:a("cards.failed")}):e.jsx(je,{state:"done",label:a("cards.done")}),(s==="done"||s==="failed")&&i?e.jsxs("span",{className:"meta-dur",children:[(i/1e3).toFixed(2),"s"]}):null]}),children:e.jsxs("div",{className:"shell",children:[e.jsxs("div",{className:"cmd",children:[e.jsx("span",{className:"prompt",children:"$"}),e.jsx("span",{className:"text",children:t})]}),n?e.jsx("pre",{className:"out",children:n.split(`
14
- `).map((h,g)=>h.startsWith(" ✓")||h.startsWith("✓")?e.jsx("div",{children:e.jsx("span",{className:"ok",children:h})},g):h.startsWith(" ✗")||h.startsWith("✗")||/error/i.test(h)?e.jsx("div",{children:e.jsx("span",{className:"err",children:h})},g):e.jsx("div",{children:h},g))}):null,s==="await"&&r?e.jsxs("div",{className:"approve-row",children:[e.jsxs("div",{className:"why",children:[e.jsx("b",{children:a("cards.shellAwaiting")})," — ",a("cards.shellExecuteHint")]}),e.jsxs("div",{className:"actions",children:[d?e.jsx("button",{type:"button",className:"btn ghost",onClick:d,children:a("cards.shellAlwaysAllow")}):null,o?e.jsxs("button",{type:"button",className:"btn",onClick:o,children:[a("cards.shellReject")," ",e.jsx(G,{keys:["mod","."]})]}):null,e.jsxs("button",{type:"button",className:"btn primary",onClick:r,children:[a("cards.shellRun")," ",e.jsx(G,{keys:["mod","enter"]})]})]})]}):null]})})}function pi({summary:t}){$();const n=t.length;return e.jsx(et,{tone:"default",icon:e.jsx(x.archive,{size:12}),kind:"compaction",name:a("cards.compactionName"),meta:e.jsx("span",{children:a("cards.compactionMeta",{chars:n.toLocaleString()})}),defaultOpen:!1,compact:!0,children:e.jsx("div",{className:"compaction-body",children:e.jsx(Cn,{source:t})})})}function mi({name:t,args:n,result:s,ok:i,durationMs:r}){$();const o=s===void 0,d=o?"default":i===!1?"danger":"success";return e.jsx(et,{tone:d,icon:e.jsx(x.wrench,{size:12}),kind:"tool",name:t,defaultOpen:!1,compact:!0,meta:e.jsxs(e.Fragment,{children:[o?e.jsx(je,{state:"running",label:a("cards.running")}):i===!1?e.jsx(je,{state:"failed",label:a("cards.error")}):e.jsx(je,{state:"done",label:a("cards.done")}),!o&&r!==void 0?e.jsxs("span",{className:"meta-dur",children:[r," ms"]}):null]}),children:e.jsxs("div",{className:"tool-call",children:[n?e.jsxs("div",{className:"row",children:[e.jsx("span",{className:"k",children:"args"}),e.jsx("span",{className:"v",children:e.jsx("span",{className:"str",children:n.length>600?`${n.slice(0,600)}…`:n})})]}):null,s!==void 0?e.jsxs("div",{className:"row",children:[e.jsx("span",{className:"k",children:a(i===!1?"cards.error":"cards.result")}),e.jsx("span",{className:"v",children:e.jsx("span",{className:i===!1?"num":"str",children:s.length>1200?`${s.slice(0,1200)}…`:s})})]}):null]})})}const hi=l.memo(function({text:n}){return e.jsx("div",{className:"msg-text",children:e.jsx(Cn,{source:n})})});function Le({kind:t,tone:n="info",title:s,sub:i,body:r,preview:o,meta:d,primaryLabel:p,secondaryLabel:h,tertiaryLabel:g,onPrimary:k,onSecondary:v,onTertiary:f}){return $(),e.jsxs("div",{className:"approval","data-tone":n,children:[e.jsxs("div",{className:"ap-head",children:[e.jsx("span",{className:"ap-ico",children:e.jsx(x.shield,{size:13})}),e.jsxs("div",{children:[e.jsx("div",{className:"ap-kind",children:t}),e.jsx("div",{className:"ap-title",children:s}),i?e.jsx("div",{className:"ap-sub",children:i}):null]})]}),r?e.jsx("div",{className:"ap-body",children:r}):null,o?e.jsx("div",{className:"ap-preview",children:o}):null,e.jsxs("div",{className:"ap-foot",children:[k?e.jsx("button",{type:"button",className:"btn primary",onClick:k,children:p??a("extraCards.approve")}):null,v?e.jsx("button",{type:"button",className:"btn ghost",onClick:v,children:h??a("extraCards.reject")}):null,f&&g?e.jsx("button",{type:"button",className:"btn ghost",onClick:f,children:g}):null,e.jsx("span",{className:"grow"}),d?e.jsx("span",{className:"meta",children:d}):null]})]})}function gi({title:t,subtitle:n,steps:s}){$();const i=s.filter(o=>o.state==="done").length,r=s.length?i/s.length*100:0;return e.jsxs("div",{className:"task-card",children:[e.jsxs("div",{className:"th",children:[e.jsx("span",{className:"ico",children:e.jsx(x.list,{size:13})}),e.jsxs("div",{children:[e.jsx("div",{className:"tt",children:t}),n?e.jsx("div",{className:"ss",children:n}):null]}),e.jsx("span",{className:"grow"}),e.jsxs("span",{className:"ss",children:[i,"/",s.length]}),e.jsx("div",{className:"meter",children:e.jsx("span",{style:{width:`${r}%`}})})]}),e.jsx("div",{className:"tb",children:s.map(o=>e.jsxs("div",{className:"task-step","data-state":o.state,children:[e.jsxs("span",{className:"nx",children:["step.",o.n]}),e.jsx("span",{className:"st"}),e.jsxs("div",{className:"l",children:[o.label,o.hint?e.jsx("div",{className:"h",children:o.hint}):null]}),e.jsx("span",{className:"t",children:o.durationLabel??"—"})]},o.n))})]})}function fi({label:t}){return e.jsxs("div",{className:"turn-divider",children:[e.jsx("span",{children:t}),e.jsx("span",{className:"line"})]})}const bi=l.memo(function({text:n,time:s,skill:i}){$();const[r,o]=l.useState(!1),d=async()=>{try{await navigator.clipboard.writeText(n),o(!0),setTimeout(()=>o(!1),1200)}catch{}};return e.jsxs("div",{className:"msg user",children:[e.jsx("div",{className:"avatar",children:"YOU"}),e.jsxs("div",{className:"body",children:[e.jsxs("div",{className:"who",children:[e.jsx("span",{className:"name",children:a("thread.you")}),i?e.jsxs("span",{className:"skill-chip",title:`skill · ${i.runAs}`,children:[e.jsx(x.zap,{size:10})," /",i.name,i.runAs==="subagent"?e.jsx("span",{className:"sub",children:a("thread.subagent")}):null]}):null,s?e.jsx("span",{className:"time",children:s}):null]}),e.jsx("div",{className:"msg-text",children:n}),e.jsx("div",{className:"msg-actions",children:e.jsxs("button",{type:"button",className:`copy-btn ${r?"done":""}`,onClick:d,title:a("thread.copyMessage"),children:[e.jsx(Pt,{size:11}),r?a("markdown.copied"):null]})})]})]})}),xi=l.memo(function({segments:n,pending:s,model:i,time:r,onApproveConfirm:o,onRejectConfirm:d,onAlwaysAllowConfirm:p,pendingConfirms:h}){const[g,k]=l.useState(!1),v=n.filter(m=>m.kind==="text").map(m=>m.text).join(`
13
+ `;function mi(t){return typeof t=="string"&&t.startsWith(Nt)}function hi(t){return t.startsWith(Nt)?t.slice(Nt.length):t}function Dn(t){const n=t.trim().split(/\s+/).filter(Boolean);if(n.length===0)return"";if(n.length===1)return n[0];const s=n[0];return new Set(["npm","npx","pnpm","yarn","bun","git","cargo","go","docker","kubectl","python","python3","deno","pip","pip3","make","rake","bundle","gem"]).has(s)?`${s} ${n[1]}`:s}function nt({tone:t="default",icon:n,kind:s,name:i,meta:r,defaultOpen:o=!0,compact:d=!1,children:p,headRight:h}){const[g,k]=l.useState(o);return e.jsxs("div",{className:d?"card is-compact":"card","data-tone":t,"data-open":g,children:[e.jsxs("button",{type:"button",className:"card-head",onClick:()=>k(v=>!v),style:{width:"100%",background:"none",border:"none",textAlign:"left",font:"inherit",color:"inherit"},children:[e.jsx("span",{className:"ico",children:n}),e.jsx("span",{className:"kind",children:s}),i?e.jsx("span",{className:"name",children:i}):null,e.jsx("span",{className:"grow"}),r?e.jsx("span",{className:"meta",children:r}):null,h,e.jsx("span",{className:"chev",children:e.jsx(x.chev,{size:12})})]}),g?e.jsx("div",{className:"card-body",children:p}):null]})}function Se({state:t,label:n}){switch(t){case"running":return e.jsx("span",{className:"spin-meta",role:"img","aria-label":n,title:n});case"done":return e.jsx(x.check,{size:10,style:{color:"var(--success)"},"aria-label":n});case"failed":return e.jsx(x.x,{size:10,style:{color:"var(--danger)"},"aria-label":n});case"waiting":return e.jsx("span",{className:"status-dot warn",role:"img","aria-label":n,title:n});case"blocked":return e.jsx(x.slash,{size:10,style:{color:"var(--warning)"},"aria-label":n})}}function gi({text:t,streaming:n,tokens:s,elapsed:i,model:r}){return $(),e.jsx(nt,{tone:"violet",icon:e.jsx(x.brain,{size:12}),kind:"reasoning",name:a("cards.reasoningName"),meta:e.jsxs(e.Fragment,{children:[i||s?e.jsxs("span",{children:[i??"",i&&s?" · ":"",s?`${s.toLocaleString()} t`:""]}):null,n?e.jsx(Se,{state:"running",label:a("cards.streaming")}):e.jsx(Se,{state:"done",label:a("cards.reasoningComplete")})]}),defaultOpen:n,compact:!0,children:e.jsxs("div",{className:"reason",children:[e.jsx("div",{className:"stream",children:t.split(/\n\n+/).map((o,d)=>e.jsx("p",{dangerouslySetInnerHTML:{__html:o.replace(/`([^`]+)`/g,'<span class="hl">$1</span>').replace(/\*\*([^*]+)\*\*/g,"<strong>$1</strong>")}},d))}),r||s!==void 0?e.jsxs("div",{className:"meta",children:[r?e.jsxs("span",{children:[e.jsx("span",{className:"k",children:a("settings.model")})," ",r]}):null,s!==void 0?e.jsxs("span",{children:[e.jsx("span",{className:"k",children:a("statusbar.tokens")})," ",s.toLocaleString()]}):null]}):null]})})}function fi({command:t,output:n,state:s,durationMs:i,onApprove:r,onReject:o,onAlwaysAllow:d}){$();const p=s==="failed"?"danger":s==="done"?"success":"warning";return e.jsx(nt,{tone:p,icon:e.jsx(x.terminal,{size:12}),kind:"shell",name:"shell",compact:!0,meta:e.jsxs(e.Fragment,{children:[s==="await"?e.jsx(Se,{state:"waiting",label:a("cards.shellAwaiting")}):s==="running"?e.jsx(Se,{state:"running",label:a("cards.shellRunning")}):s==="failed"?e.jsx(Se,{state:"failed",label:a("cards.failed")}):e.jsx(Se,{state:"done",label:a("cards.done")}),(s==="done"||s==="failed")&&i?e.jsxs("span",{className:"meta-dur",children:[(i/1e3).toFixed(2),"s"]}):null]}),children:e.jsxs("div",{className:"shell",children:[e.jsxs("div",{className:"cmd",children:[e.jsx("span",{className:"prompt",children:"$"}),e.jsx("span",{className:"text",children:t})]}),n?e.jsx("pre",{className:"out",children:n.split(`
14
+ `).map((h,g)=>h.startsWith(" ✓")||h.startsWith("✓")?e.jsx("div",{children:e.jsx("span",{className:"ok",children:h})},g):h.startsWith(" ✗")||h.startsWith("✗")||/error/i.test(h)?e.jsx("div",{children:e.jsx("span",{className:"err",children:h})},g):e.jsx("div",{children:h},g))}):null,s==="await"&&r?e.jsxs("div",{className:"approve-row",children:[e.jsxs("div",{className:"why",children:[e.jsx("b",{children:a("cards.shellAwaiting")})," — ",a("cards.shellExecuteHint")]}),e.jsxs("div",{className:"actions",children:[d?e.jsx("button",{type:"button",className:"btn ghost",onClick:d,children:a("cards.shellAlwaysAllow")}):null,o?e.jsxs("button",{type:"button",className:"btn",onClick:o,children:[a("cards.shellReject")," ",e.jsx(G,{keys:["mod","."]})]}):null,e.jsxs("button",{type:"button",className:"btn primary",onClick:r,children:[a("cards.shellRun")," ",e.jsx(G,{keys:["mod","enter"]})]})]})]}):null]})})}function bi({summary:t}){$();const n=t.length;return e.jsx(nt,{tone:"default",icon:e.jsx(x.archive,{size:12}),kind:"compaction",name:a("cards.compactionName"),meta:e.jsx("span",{children:a("cards.compactionMeta",{chars:n.toLocaleString()})}),defaultOpen:!1,compact:!0,children:e.jsx("div",{className:"compaction-body",children:e.jsx(Pn,{source:t})})})}function xi({name:t,args:n,result:s,ok:i,durationMs:r}){$();const o=s===void 0,d=o?"default":i===!1?"danger":"success";return e.jsx(nt,{tone:d,icon:e.jsx(x.wrench,{size:12}),kind:"tool",name:t,defaultOpen:!1,compact:!0,meta:e.jsxs(e.Fragment,{children:[o?e.jsx(Se,{state:"running",label:a("cards.running")}):i===!1?e.jsx(Se,{state:"failed",label:a("cards.error")}):e.jsx(Se,{state:"done",label:a("cards.done")}),!o&&r!==void 0?e.jsxs("span",{className:"meta-dur",children:[r," ms"]}):null]}),children:e.jsxs("div",{className:"tool-call",children:[n?e.jsxs("div",{className:"row",children:[e.jsx("span",{className:"k",children:"args"}),e.jsx("span",{className:"v",children:e.jsx("span",{className:"str",children:n.length>600?`${n.slice(0,600)}…`:n})})]}):null,s!==void 0?e.jsxs("div",{className:"row",children:[e.jsx("span",{className:"k",children:a(i===!1?"cards.error":"cards.result")}),e.jsx("span",{className:"v",children:e.jsx("span",{className:i===!1?"num":"str",children:s.length>1200?`${s.slice(0,1200)}…`:s})})]}):null]})})}const yi=l.memo(function({text:n}){return e.jsx("div",{className:"msg-text",children:e.jsx(Pn,{source:n})})});function Le({kind:t,tone:n="info",title:s,sub:i,body:r,preview:o,meta:d,primaryLabel:p,secondaryLabel:h,tertiaryLabel:g,onPrimary:k,onSecondary:v,onTertiary:f}){return $(),e.jsxs("div",{className:"approval","data-tone":n,children:[e.jsxs("div",{className:"ap-head",children:[e.jsx("span",{className:"ap-ico",children:e.jsx(x.shield,{size:13})}),e.jsxs("div",{children:[e.jsx("div",{className:"ap-kind",children:t}),e.jsx("div",{className:"ap-title",children:s}),i?e.jsx("div",{className:"ap-sub",children:i}):null]})]}),r?e.jsx("div",{className:"ap-body",children:r}):null,o?e.jsx("div",{className:"ap-preview",children:o}):null,e.jsxs("div",{className:"ap-foot",children:[k?e.jsx("button",{type:"button",className:"btn primary",onClick:k,children:p??a("extraCards.approve")}):null,v?e.jsx("button",{type:"button",className:"btn ghost",onClick:v,children:h??a("extraCards.reject")}):null,f&&g?e.jsx("button",{type:"button",className:"btn ghost",onClick:f,children:g}):null,e.jsx("span",{className:"grow"}),d?e.jsx("span",{className:"meta",children:d}):null]})]})}function ki({title:t,subtitle:n,steps:s}){$();const i=s.filter(o=>o.state==="done").length,r=s.length?i/s.length*100:0;return e.jsxs("div",{className:"task-card",children:[e.jsxs("div",{className:"th",children:[e.jsx("span",{className:"ico",children:e.jsx(x.list,{size:13})}),e.jsxs("div",{children:[e.jsx("div",{className:"tt",children:t}),n?e.jsx("div",{className:"ss",children:n}):null]}),e.jsx("span",{className:"grow"}),e.jsxs("span",{className:"ss",children:[i,"/",s.length]}),e.jsx("div",{className:"meter",children:e.jsx("span",{style:{width:`${r}%`}})})]}),e.jsx("div",{className:"tb",children:s.map(o=>e.jsxs("div",{className:"task-step","data-state":o.state,children:[e.jsxs("span",{className:"nx",children:["step.",o.n]}),e.jsx("span",{className:"st"}),e.jsxs("div",{className:"l",children:[o.label,o.hint?e.jsx("div",{className:"h",children:o.hint}):null]}),e.jsx("span",{className:"t",children:o.durationLabel??"—"})]},o.n))})]})}function wi({label:t}){return e.jsxs("div",{className:"turn-divider",children:[e.jsx("span",{children:t}),e.jsx("span",{className:"line"})]})}const vi=l.memo(function({text:n,time:s,skill:i}){$();const[r,o]=l.useState(!1),d=async()=>{try{await navigator.clipboard.writeText(n),o(!0),setTimeout(()=>o(!1),1200)}catch{}};return e.jsxs("div",{className:"msg user",children:[e.jsx("div",{className:"avatar",children:"YOU"}),e.jsxs("div",{className:"body",children:[e.jsxs("div",{className:"who",children:[e.jsx("span",{className:"name",children:a("thread.you")}),i?e.jsxs("span",{className:"skill-chip",title:`skill · ${i.runAs}`,children:[e.jsx(x.zap,{size:10})," /",i.name,i.runAs==="subagent"?e.jsx("span",{className:"sub",children:a("thread.subagent")}):null]}):null,s?e.jsx("span",{className:"time",children:s}):null]}),e.jsx("div",{className:"msg-text",children:n}),e.jsx("div",{className:"msg-actions",children:e.jsxs("button",{type:"button",className:`copy-btn ${r?"done":""}`,onClick:d,title:a("thread.copyMessage"),children:[e.jsx(Et,{size:11}),r?a("markdown.copied"):null]})})]})]})}),Si=l.memo(function({segments:n,pending:s,model:i,time:r,onApproveConfirm:o,onRejectConfirm:d,onAlwaysAllowConfirm:p,pendingConfirms:h}){const[g,k]=l.useState(!1),v=n.filter(m=>m.kind==="text").map(m=>m.text).join(`
15
15
 
16
- `),f=async()=>{try{await navigator.clipboard.writeText(v),k(!0),setTimeout(()=>k(!1),1200)}catch{}};return e.jsxs("div",{className:"msg assistant",children:[e.jsx("div",{className:"avatar",children:"DS"}),e.jsxs("div",{className:"body",children:[e.jsxs("div",{className:"who",children:[e.jsx("span",{className:"name",children:"Reasonix"}),i?e.jsx("span",{className:"model",children:i}):null,r?e.jsx("span",{className:"time",children:r}):null]}),n.map((m,y)=>{if(m.kind==="text")return m.text.trim()?li(m.text)?e.jsx(pi,{summary:ci(m.text)},y):e.jsx(hi,{text:m.text},y):null;if(m.kind==="reasoning")return e.jsx(di,{text:m.text,streaming:s&&y===n.length-1},y);const j=(m.name==="run_command"||m.name==="run_background")&&m.result===void 0?h.find(I=>I.command===Qt(m.args)):void 0;if(m.name==="run_command"||m.name==="run_background"){const I=Qt(m.args)??m.args,q=m.result===void 0?j?"await":"running":m.ok===!1?"failed":"done";return e.jsx(ui,{command:I,output:m.result,state:q,durationMs:m.durationMs,onApprove:j?()=>o(j.id):void 0,onReject:j?()=>d(j.id):void 0,onAlwaysAllow:j?()=>{p(j.id,Mn(I))}:void 0},y)}return e.jsx(mi,{name:m.name,args:m.args,result:m.result,ok:m.ok,durationMs:m.durationMs},y)}),v?e.jsx("div",{className:"msg-actions",children:e.jsxs("button",{type:"button",className:`copy-btn ${g?"done":""}`,onClick:f,title:a("thread.copyResponse"),children:[e.jsx(Pt,{size:11}),g?a("markdown.copied"):null]})}):null]})]})});function Qt(t){if(t)try{const n=JSON.parse(t);if(n&&typeof n=="object"&&typeof n.command=="string")return n.command}catch{}}function yi({plan:t,onDismiss:n}){$();const s=t.steps.length||1,i=t.completedStepIds.length,r=i/s*100,o=t.steps.find(d=>!t.completedStepIds.includes(d.id));return e.jsxs("div",{className:"plan-banner",children:[e.jsx("span",{className:"ico",children:e.jsx(x.list,{size:14})}),e.jsxs("div",{className:"body",children:[e.jsxs("div",{className:"t",children:[a("thread.planRunning",{step:Math.min(i+1,s),total:s}),o?` — ${o.title}`:""]}),e.jsx("div",{className:"s",children:t.plan})]}),e.jsxs("div",{className:"prog",children:[e.jsx("div",{className:"meter-mini",children:e.jsx("span",{style:{width:`${r}%`}})}),n?e.jsx("button",{type:"button",onClick:n,children:a("thread.collapse")}):null]})]})}function ki({p:t,onApprove:n,onRefine:s,onCancel:i}){$();const r=t.steps?.length??0,o=r>0?a("thread.planStepCount",{count:r}):void 0;return e.jsx(Le,{kind:a("thread.planConfirmationKind"),tone:"info",title:a("thread.startPlan"),sub:o,body:e.jsxs(e.Fragment,{children:[t.summary?e.jsx("div",{style:{marginBottom:6},children:t.summary}):null,e.jsx("div",{style:{whiteSpace:"pre-wrap"},children:t.plan})]}),meta:`plan/#${t.id}`,primaryLabel:a("thread.approve"),secondaryLabel:a("thread.cancel"),tertiaryLabel:a("thread.refine"),onPrimary:n,onSecondary:i,onTertiary:s})}function wi({c:t,onContinue:n,onRevise:s,onStop:i}){return $(),e.jsx(Le,{kind:a("thread.checkpointKind"),tone:"brand",title:t.title??a("thread.checkpointTitle",{completed:t.completed,total:t.total}),sub:a("thread.checkpointSub",{completed:t.completed,total:t.total}),body:e.jsxs(e.Fragment,{children:[e.jsx("div",{style:{whiteSpace:"pre-wrap"},children:t.result}),t.notes?e.jsx("div",{style:{marginTop:8,fontSize:11.5,color:"var(--muted)"},children:t.notes}):null]}),meta:`checkpoint · ${t.stepId}`,primaryLabel:a("thread.continue"),secondaryLabel:a("thread.stop"),tertiaryLabel:a("thread.revise"),onPrimary:n,onSecondary:i,onTertiary:s})}function vi({r:t,onAccept:n,onReject:s}){return $(),e.jsx(Le,{kind:a("thread.planRevisionKind"),tone:"warn",title:a("thread.rewritePlan"),sub:a("thread.keepSteps",{n:t.remainingSteps.length}),body:e.jsxs(e.Fragment,{children:[e.jsx("div",{style:{marginBottom:8},children:t.reason}),t.summary?e.jsx("div",{style:{fontSize:11.5,color:"var(--muted)",marginBottom:8},children:t.summary}):null,e.jsx("ul",{style:{margin:0,paddingLeft:18},children:t.remainingSteps.map(i=>e.jsxs("li",{style:{fontSize:12,marginBottom:2},children:[i.title,i.risk?e.jsxs("span",{style:{marginLeft:6,fontSize:10,color:i.risk==="high"?"var(--tone-err)":i.risk==="med"?"var(--tone-warn)":"var(--muted)"},children:["[",i.risk,"]"]}):null]},i.id))})]}),meta:a("thread.revisionMeta"),primaryLabel:a("thread.approveRewrite"),secondaryLabel:a("thread.keepOriginal"),onPrimary:n,onSecondary:s})}function ji({c:t,onAllow:n,onAlwaysAllow:s,onDeny:i}){$();const r=t.kind==="run_background",o=Mn(t.command);return e.jsx(Le,{kind:a("thread.shellConfirmationKind"),tone:"warn",title:a(r?"thread.runBackgroundCommand":"thread.runCommand"),sub:t.command.length>80?`${t.command.slice(0,80)}…`:t.command,preview:e.jsxs(e.Fragment,{children:[e.jsx("span",{style:{color:"var(--accent)"},children:"$"})," ",t.command]}),meta:a("thread.riskMedium",{kind:t.kind}),primaryLabel:a("thread.execute"),secondaryLabel:a("thread.reject"),tertiaryLabel:a("thread.alwaysAllow",{prefix:o}),onPrimary:n,onSecondary:i,onTertiary:()=>s(o)})}function Si({p:t,onAllow:n,onAlwaysAllow:s,onDeny:i}){$();const r=t.intent==="write";return e.jsx(Le,{kind:a("thread.pathAccessKind"),tone:"warn",title:a(r?"thread.writePathOutsideSandbox":"thread.readPathOutsideSandbox"),sub:t.path,preview:e.jsxs(e.Fragment,{children:[e.jsxs("div",{children:[t.toolName," → ",t.path]}),e.jsxs("div",{style:{color:"var(--muted)",marginTop:4},children:["workspace: ",t.sandboxRoot]})]}),meta:a("thread.riskMedium",{kind:t.intent}),primaryLabel:a(r?"thread.allowWrite":"thread.allowRead"),secondaryLabel:a("thread.reject"),tertiaryLabel:a("thread.alwaysAllowPrefix",{prefix:t.allowPrefix}),onPrimary:n,onSecondary:i,onTertiary:()=>s(t.allowPrefix)})}function Ni({c:t,onPick:n,onCancel:s}){return $(),e.jsx(Le,{kind:a("thread.userChoiceKind"),tone:"info",title:t.question,sub:a("thread.optionCount",{count:t.options.length}),body:e.jsx("div",{style:{display:"flex",flexDirection:"column",gap:6},children:t.options.map(i=>e.jsx("button",{type:"button",className:"btn",style:{justifyContent:"flex-start",textAlign:"left"},onClick:()=>n(i.id),children:e.jsxs("div",{children:[e.jsx("div",{style:{fontWeight:600},children:i.title}),i.summary?e.jsx("div",{style:{fontSize:11,color:"var(--muted)",marginTop:2},children:i.summary}):null]})},i.id))}),primaryLabel:a("thread.cancel"),onPrimary:s})}function Ci(t){const n=new Set(t.completedStepIds);return t.steps.map((s,i)=>({n:String(i+1),state:n.has(s.id)?"done":i===t.completedStepIds.length?"running":"queued",label:s.title,hint:s.action,durationLabel:void 0}))}function Ti({plan:t}){return $(),e.jsx(gi,{title:a("thread.activePlan"),subtitle:t.summary,steps:Ci(t)})}function Ai({open:t,onClose:n,recent:s,current:i,anchor:r,onPick:o,onBrowse:d}){$();const[p,h]=l.useState(""),g=l.useRef(null);l.useEffect(()=>{if(!t)return;h("");const m=window.setTimeout(()=>g.current?.focus(),40);return()=>window.clearTimeout(m)},[t]);const k=l.useMemo(()=>{const m=s.length>0?s:i?[i]:[],y=p.trim().toLowerCase();return y?m.filter(j=>j.toLowerCase().includes(y)):m},[s,i,p]);if(!t)return null;const v=r?.left??240,f=r?.bottom!==void 0?{bottom:r.bottom,left:v}:{top:r?.top??56,left:v};return e.jsx("div",{className:"wd-mask",onMouseDown:n,children:e.jsxs("div",{className:"wd-pop",style:f,onMouseDown:m=>m.stopPropagation(),children:[e.jsxs("div",{className:"wd-head",children:[e.jsx(x.folder,{size:12}),e.jsx("span",{children:a("workdir.title")}),e.jsx("span",{style:{marginLeft:"auto",fontFamily:"Geist Mono, monospace",fontSize:10,color:"var(--muted)"},children:e.jsx(G,{keys:["mod","O"]})})]}),e.jsx("input",{ref:g,className:"wd-search",placeholder:a("workdir.searchPlaceholder"),value:p,onChange:m=>h(m.target.value),onKeyDown:m=>{m.key==="Escape"?(m.preventDefault(),n()):m.key==="Enter"&&k[0]&&(m.preventDefault(),o(k[0]),n())}}),e.jsxs("div",{className:"wd-list",children:[k.length===0?e.jsx("div",{style:{padding:"16px 12px",fontSize:11.5,color:"var(--muted)",fontFamily:"Geist Mono, monospace"},children:a("workdir.empty")}):null,k.map(m=>{const y=m===i,j=m.split(/[\\/]/).filter(Boolean).pop()??m;return e.jsxs("div",{className:"wd-row",onClick:()=>{y||o(m),n()},title:m,children:[e.jsx("span",{className:"ic",children:e.jsx(x.folder,{size:12})}),e.jsxs("div",{className:"b",children:[e.jsx("div",{className:"p",children:j}),e.jsx("div",{className:"br",children:m})]}),y?e.jsx("span",{className:"pin",children:e.jsx(x.check,{size:11})}):null]},m)})]}),e.jsx("div",{className:"wd-foot",children:e.jsxs("button",{type:"button",className:"btn ghost",onClick:()=>{d(),n()},children:[e.jsx(x.plus,{size:11})," ",a("workdir.browse")]})})]})})}async function Pi(t){const n=document.querySelector('meta[name="reasonix-token"]')?.getAttribute("content")??"",s=new URLSearchParams;t&&s.set("path",t),n&&n!=="__REASONIX_TOKEN__"&&s.set("token",n);const i=await fetch(`/api/browse?${s.toString()}`);if(!i.ok){const r=await i.text();throw new Error(r||`browse failed (${i.status})`)}return await i.json()}function Mi({open:t,initialPath:n,onCancel:s,onConfirm:i}){$();const[r,o]=l.useState(n??""),[d,p]=l.useState(null),[h,g]=l.useState(""),[k,v]=l.useState(!1),f=l.useRef(!1),m=l.useCallback(async R=>{v(!0),g("");try{const L=await Pi(R);p(L),o(L.path)}catch(L){g(L instanceof Error?L.message:String(L))}finally{v(!1)}},[]);if(l.useEffect(()=>{if(!t){f.current=!1;return}f.current||(f.current=!0,m(n??""))},[t,n,m]),!t)return null;const y=r.trim(),j=y.length>0&&!k,I=d!==null&&y===d.path,q=()=>{j&&i(y)},X=R=>{R.key==="Escape"?(R.preventDefault(),s()):R.key==="Enter"&&(R.preventDefault(),I?q():m(y))};return e.jsx("div",{className:"settings-mask",onMouseDown:s,children:e.jsxs("div",{className:"workdir-input",onMouseDown:R=>R.stopPropagation(),children:[e.jsxs("div",{className:"workdir-input-head",children:[e.jsx(x.folder,{size:14}),e.jsx("span",{children:a("workdir.title")}),e.jsx("button",{type:"button",className:"close-btn",onClick:s,title:a("workdir.cancel"),children:e.jsx(x.x,{size:13})})]}),e.jsxs("div",{className:"workdir-input-pathrow",children:[e.jsx("input",{autoFocus:!0,className:"workdir-input-path",value:r,placeholder:a("workdir.pathPlaceholder"),onChange:R=>o(R.target.value),onKeyDown:X,spellCheck:!1}),e.jsx("button",{type:"button",className:"btn ghost",onClick:()=>void m(y),disabled:k||y.length===0,title:a("workdir.goTip"),children:a("workdir.go")})]}),h?e.jsx("div",{className:"workdir-input-error",children:h}):null,e.jsxs("div",{className:"workdir-input-list",children:[d?.parent?e.jsxs("div",{className:"workdir-input-row up",onClick:()=>void m(d.parent),role:"button",tabIndex:0,onKeyDown:R=>{(R.key==="Enter"||R.key===" ")&&m(d.parent)},children:[e.jsx("span",{className:"ic",children:"↑"}),e.jsx("span",{children:".."})]}):null,d?.entries.length===0&&!k?e.jsx("div",{className:"workdir-input-empty",children:a("workdir.emptyDir")}):null,d?.entries.map(R=>e.jsxs("div",{className:"workdir-input-row",onClick:()=>void m(R.full),onDoubleClick:()=>i(R.full),role:"button",tabIndex:0,title:R.full,onKeyDown:L=>{L.key==="Enter"&&m(R.full)},children:[e.jsx("span",{className:"ic",children:e.jsx(x.folder,{size:12})}),e.jsx("span",{className:"n",children:R.name})]},R.full)),k?e.jsx("div",{className:"workdir-input-empty",children:a("workdir.loading")}):null]}),e.jsxs("div",{className:"workdir-input-foot",children:[e.jsx("button",{type:"button",className:"btn ghost",onClick:s,children:a("workdir.cancel")}),e.jsx("button",{type:"button",className:"btn primary",onClick:q,disabled:!j,children:a("workdir.openHere")})]})]})})}const mt=80;function Ei(t,n,s,i){const[r,o]=l.useState(!1),d=l.useRef(!0),p=l.useRef(s),h=l.useRef(0),g=l.useCallback(()=>{const f=t.current;return f?f.scrollTop+f.clientHeight>=f.scrollHeight-mt:!0},[t]),k=l.useCallback(()=>{const f=t.current;f&&o(!d.current&&f.scrollHeight>f.clientHeight+mt)},[t]),v=l.useCallback((f=!0)=>{const m=t.current;m&&(d.current=!0,o(!1),m.scrollTo({top:m.scrollHeight,behavior:f?"smooth":"instant"}))},[t]);return l.useEffect(()=>{const f=t.current;if(!f)return;let m=0;const y=()=>{m&&cancelAnimationFrame(m),m=requestAnimationFrame(()=>{m=0,d.current=g(),k()})};return f.addEventListener("wheel",y,{passive:!0}),f.addEventListener("touchmove",y,{passive:!0}),f.addEventListener("keydown",y),f.addEventListener("pointerdown",y),()=>{m&&cancelAnimationFrame(m),f.removeEventListener("wheel",y),f.removeEventListener("touchmove",y),f.removeEventListener("keydown",y),f.removeEventListener("pointerdown",y)}},[t,g,k]),l.useEffect(()=>{p.current!==s&&v(!0),p.current=s},[s,v]),l.useEffect(()=>{const f=n.current;if(!f)return;const m=new ResizeObserver(()=>{h.current&&cancelAnimationFrame(h.current),h.current=requestAnimationFrame(()=>{h.current=0;const y=t.current;y&&(d.current?y.scrollTo({top:y.scrollHeight,behavior:"instant"}):k())})});return m.observe(f),()=>{m.disconnect(),h.current&&(cancelAnimationFrame(h.current),h.current=0)}},[t,n,k]),l.useEffect(()=>{const f=t.current;if(!f)return;const m=setTimeout(()=>{const y=i?.()??null;y!=null&&y>mt?(d.current=!1,f.scrollTop=y,k()):(d.current=!0,o(!1),f.scrollTo({top:f.scrollHeight,behavior:"instant"}))},60);return()=>clearTimeout(m)},[t,i,k]),{showJumpButton:r,scrollToBottom:v}}const Di='input, textarea, [contenteditable=""], [contenteditable="true"], [contenteditable="plaintext-only"]';function Ri(){return{autoCorrect:"off",autoCapitalize:"off",spellCheck:!1}}function Li(){return typeof document>"u"?!1:document.documentElement.dataset.platform==="macos"}function Nt(t){if(!(t instanceof HTMLElement)||!(t instanceof HTMLInputElement)&&!(t instanceof HTMLTextAreaElement)&&!t.isContentEditable)return;const n=Ri();t.setAttribute("autocorrect",n.autoCorrect),t.setAttribute("autocapitalize",n.autoCapitalize),t.setAttribute("spellcheck",String(n.spellCheck)),t.spellcheck=n.spellCheck}function Zt(t){t instanceof Element&&Nt(t),t.querySelectorAll(Di).forEach(Nt)}function Ii(){l.useEffect(()=>{if(typeof document>"u"||!Li())return;const t=document.body;if(!t)return;Zt(t);const n=i=>{i.target instanceof Element&&Nt(i.target)},s=new MutationObserver(i=>{for(const r of i)r.addedNodes.forEach(o=>{o instanceof Element&&Zt(o)})});return document.addEventListener("focusin",n,!0),s.observe(t,{childList:!0,subtree:!0}),()=>{document.removeEventListener("focusin",n,!0),s.disconnect()}},[])}function zi(t){const n=t.scope==="builtin"?a("app.skill.scope.builtin"):t.scope==="global"?a("app.skill.scope.global"):a("app.skill.scope.project"),s=t.runAs==="subagent"?a("app.skill.runAs.subagent"):a("app.skill.runAs.inline");return a("app.skill.generic",{scope:n,runAs:s})}function Ct(t){return t.reduce((s,i)=>i.kind==="user"||i.kind==="assistant"?Math.max(s,i.turn):s,0)+1}function _i(t,n){switch(n.t){case"send_user":return{...t,busy:!0,messages:[...t.messages,{kind:"user",text:n.text,clientId:n.clientId,turn:Ct(t.messages)}]};case"start_skill":{const s=n.args?` ${n.args}`:"";return{...t,busy:!0,activeSkill:n.skill,messages:[...t.messages,{kind:"user",text:`/${n.skill.name}${s}`,clientId:n.clientId,turn:Ct(t.messages),skill:n.skill}]}}case"rpc_exit":return{...t,ready:!1,busy:!1,activeSkill:null,queuedSends:[],messages:[...t.messages,{kind:"error",message:`reasonix exited (code ${n.code??"?"})`}]};case"incoming":return Hi(t,n.event);case"batch_delta":{const s=[];for(const i of n.items){const r=s[s.length-1];r&&r.turn===i.turn&&r.channel===i.channel?r.text+=i.text:s.push({...i})}return{...t,messages:t.messages.map(i=>{if(i.kind!=="assistant")return i;const r=s.filter(d=>d.turn===i.turn);if(r.length===0)return i;let o=i.segments;for(const d of r)o=Tt(o,d.channel==="content"?"text":"reasoning",d.text);return{...i,segments:o}})}}case"clear":return{...t,busy:!1,currentSession:void 0,messages:[],pendingConfirms:[],pendingPathAccess:[],pendingChoices:[],pendingPlans:[],pendingCheckpoints:[],pendingRevisions:[],activePlan:null,usage:Xe(),sessionFiles:[],activeSkill:null,queuedSends:[],retryNonce:0};case"resolve_confirm":return{...t,pendingConfirms:t.pendingConfirms.filter(s=>s.id!==n.id)};case"resolve_path_access":return{...t,pendingPathAccess:t.pendingPathAccess.filter(s=>s.id!==n.id)};case"resolve_choice":return{...t,pendingChoices:t.pendingChoices.filter(s=>s.id!==n.id)};case"resolve_plan":{const s=t.pendingPlans.find(r=>r.id===n.id);let i=t.activePlan;if(s&&n.verdict.type==="approve"){const r=s.steps;i={plan:s.plan,summary:s.summary,steps:r??[],completedStepIds:[],stepResults:{}}}return{...t,pendingPlans:t.pendingPlans.filter(r=>r.id!==n.id),activePlan:i}}case"resolve_checkpoint":return{...t,pendingCheckpoints:t.pendingCheckpoints.filter(s=>s.id!==n.id)};case"resolve_revision":{const s=t.pendingRevisions.find(r=>r.id===n.id);let i=t.activePlan;if(s&&n.verdict.type==="accepted"&&i){const r=new Set(i.completedStepIds),o=i.steps.filter(d=>r.has(d.id));i={...i,steps:[...o,...s.remainingSteps]}}return{...t,pendingRevisions:t.pendingRevisions.filter(r=>r.id!==n.id),activePlan:i}}case"dismiss_plan":return{...t,activePlan:null};case"mention_results":return{...t,mentionResults:n.results};case"mention_preview":return{...t,mentionPreview:n.preview};case"enqueue_send":return{...t,queuedSends:[...t.queuedSends,n.text]};case"dequeue_send":return{...t,queuedSends:t.queuedSends.filter((s,i)=>i!==n.index)};case"shift_queued_send":return{...t,queuedSends:t.queuedSends.slice(1)}}}const qi=new Set(["read_file"]),Bi=new Set(["edit_file","write_file"]);function Xt(t,n){try{const s=JSON.parse(n);if(qi.has(t)&&typeof s?.path=="string")return[{path:s.path,status:"c"}];if(Bi.has(t)&&typeof s?.path=="string")return[{path:s.path,status:"m"}];if(t==="multi_edit"&&Array.isArray(s?.edits)){const i=[],r=new Set;for(const o of s.edits)typeof o?.path=="string"&&!r.has(o.path)&&(r.add(o.path),i.push({path:o.path,status:"m"}));return i}}catch{}return[]}function en(t,n){if(n.length===0)return t;const s=[...t],i=new Map;s.forEach((o,d)=>i.set(o.path,d));let r=!1;for(const o of n){const d=i.get(o.path);if(d===void 0){i.set(o.path,s.length),s.push(o),r=!0;continue}const p=s[d];!p||p.status==="m"||p.status!==o.status&&(s[d]=o,r=!0)}return r?s:t}function Xe(){return{totalCostUsd:0,totalPromptTokens:0,totalCompletionTokens:0,cacheHitTokens:0,cacheMissTokens:0,lastCallCacheHit:null,lastCallCacheMiss:null,reservedTokens:0}}function Tt(t,n,s){const i=t[t.length-1];return i&&i.kind===n?[...t.slice(0,-1),{...i,text:i.text+s}]:[...t,{kind:n,text:s}]}function Hi(t,n){switch(n.type){case"user.message":{const s=t.messages[t.messages.length-1];return t.busy&&s?.kind==="user"&&s.text===n.text?t:{...t,busy:!0,messages:[...t.messages,{kind:"user",text:n.text,clientId:`remote-${n.id}`,turn:n.turn>0?n.turn:Ct(t.messages)}]}}case"$ready":return{...t,ready:!0,needsSetup:!1};case"$needs_setup":return{...t,needsSetup:!0,ready:!1};case"$turn_complete":return{...t,busy:!1,activeSkill:null};case"$confirm_required":return{...t,pendingConfirms:[...t.pendingConfirms,{id:n.id,kind:n.kind,command:n.command}]};case"$path_access_required":return{...t,pendingPathAccess:[...t.pendingPathAccess,{id:n.id,path:n.path,intent:n.intent,toolName:n.toolName,sandboxRoot:n.sandboxRoot,allowPrefix:n.allowPrefix}]};case"$choice_required":return{...t,pendingChoices:[...t.pendingChoices,{id:n.id,question:n.question,options:n.options,allowCustom:n.allowCustom}]};case"$plan_required":{const s=Array.isArray(n.steps)?n.steps:void 0;return{...t,pendingPlans:[...t.pendingPlans,{id:n.id,plan:n.plan,summary:n.summary,...s?{steps:s}:{}}]}}case"$checkpoint_required":return{...t,pendingCheckpoints:[...t.pendingCheckpoints,{id:n.id,stepId:n.stepId,title:n.title,result:n.result,notes:n.notes,completed:n.completed,total:n.total}]};case"$revision_required":return{...t,pendingRevisions:[...t.pendingRevisions,{id:n.id,reason:n.reason,remainingSteps:n.remainingSteps,summary:n.summary}]};case"$modal_dismissed":switch(n.kind){case"shell":return{...t,pendingConfirms:[]};case"path":return{...t,pendingPathAccess:[]};case"choice":return{...t,pendingChoices:[]};case"plan":return{...t,pendingPlans:[]};case"checkpoint":return{...t,pendingCheckpoints:[]};case"revision":return{...t,pendingRevisions:[]};default:return t}case"$step_completed":{if(!t.activePlan)return t;const s=new Set(t.activePlan.completedStepIds);return s.add(n.stepId),{...t,activePlan:{...t.activePlan,completedStepIds:[...s],stepResults:{...t.activePlan.stepResults,[n.stepId]:n.result}}}}case"$plan_cleared":return{...t,activePlan:null,pendingCheckpoints:[],pendingRevisions:[]};case"$sessions":return{...t,sessions:n.items};case"$mcp_specs":return{...t,mcpSpecs:Array.isArray(n.specs)?n.specs:[],mcpBridged:!!n.bridged};case"$skills":return{...t,skills:n.items};case"$ctx_breakdown":return{...t,usage:{...t.usage,reservedTokens:n.reservedTokens}};case"$memory":return{...t,memory:n.entries,memoryDetail:t.memoryDetail&&n.entries.some(s=>s.path===t.memoryDetail?.path)?t.memoryDetail:null};case"$memory_detail":return{...t,memoryDetail:n.detail};case"$jobs":return{...t,jobs:n.items};case"$balance":return{...t,balance:{currency:n.currency,total:n.total,isAvailable:n.isAvailable}};case"$qq_settings":return{...t,qq:{appId:n.appId,appSecret:n.appSecret,sandbox:n.sandbox,enabled:n.enabled,configured:n.configured,runtimeState:n.runtimeState,lastError:n.lastError,appIdPreview:n.appIdPreview,access:n.access}};case"$settings":{const s=t.settings?.workspaceDir,i=s!==void 0&&s!==n.workspaceDir;return{...t,busy:i?!1:t.busy,messages:i?[]:t.messages,pendingConfirms:i?[]:t.pendingConfirms,pendingPathAccess:i?[]:t.pendingPathAccess,pendingChoices:i?[]:t.pendingChoices,pendingPlans:i?[]:t.pendingPlans,pendingCheckpoints:i?[]:t.pendingCheckpoints,pendingRevisions:i?[]:t.pendingRevisions,activePlan:i?null:t.activePlan,usage:i?Xe():t.usage,sessionFiles:i?[]:t.sessionFiles,retryNonce:i?0:t.retryNonce,settings:{reasoningEffort:n.reasoningEffort,editMode:n.editMode,budgetUsd:n.budgetUsd,baseUrl:n.baseUrl,apiKeyPrefix:n.apiKeyPrefix,workspaceDir:n.workspaceDir,recentWorkspaces:n.recentWorkspaces,model:n.model,editor:n.editor,webSearchEngine:n.webSearchEngine,subagentModels:n.subagentModels,showSystemEvents:n.showSystemEvents,version:n.version}}}case"$session_loaded":{const s=n.name,i=n.messages.map((o,d)=>{if(o.kind==="user")return{kind:"user",text:o.text,clientId:`c-loaded-${d}`,turn:d+1};const p=o.segments.map(h=>h.kind==="tool"?{kind:"tool",callId:h.callId,name:h.name,args:h.args,startedAt:0,result:h.result,ok:h.ok,durationMs:0}:h);return{kind:"assistant",turn:o.turn,segments:p,pending:!1}});let r=[];for(const o of i)if(o.kind==="assistant")for(const d of o.segments)d.kind==="tool"&&(r=en(r,Xt(d.name,d.args)));return{...t,busy:!1,currentSession:s,messages:i,pendingConfirms:[],pendingPathAccess:[],pendingChoices:[],pendingPlans:[],pendingCheckpoints:[],pendingRevisions:[],activePlan:null,usage:{...Xe(),totalCostUsd:n.carryover.totalCostUsd,totalPromptTokens:n.carryover.cacheHitTokens+n.carryover.cacheMissTokens,cacheHitTokens:n.carryover.cacheHitTokens,cacheMissTokens:n.carryover.cacheMissTokens},sessionFiles:r,activeSkill:null,queuedSends:[],retryNonce:0}}case"$session_empty":{const s=n.sizeBytes===0?"0 bytes":`${n.sizeBytes} bytes, no valid entries`;return{...t,messages:[...t.messages,{kind:"error",message:`Session "${n.name}" loaded with no messages (${s}). The file ~/.reasonix/sessions/${n.name}.jsonl exists but couldn't be parsed — start a new chat or restore from .jsonl.bak if you have one.`}]}}case"$error":case"error":return{...t,busy:!1,activeSkill:null,messages:[...t.messages,{kind:"error",message:n.message}]};case"model.turn.started":return t.messages.some(s=>s.kind==="assistant"&&s.turn===n.turn)?{...t,model:n.model}:{...t,model:n.model,messages:[...t.messages,{kind:"assistant",turn:n.turn,segments:[],pending:!0}]};case"model.delta":return{...t,messages:t.messages.map(s=>s.kind!=="assistant"||s.turn!==n.turn?s:n.channel==="content"?{...s,segments:Tt(s.segments,"text",n.text)}:n.channel==="reasoning"?{...s,segments:Tt(s.segments,"reasoning",n.text)}:s)};case"model.final":{const s=n.usage,i=s?.prompt_cache_hit_tokens??0,r=s?.prompt_cache_miss_tokens??0,o=i>0||r>0,d={totalCostUsd:t.usage.totalCostUsd+(n.costUsd??0),totalPromptTokens:t.usage.totalPromptTokens+(s?.prompt_tokens??0),totalCompletionTokens:t.usage.totalCompletionTokens+(s?.completion_tokens??0),cacheHitTokens:t.usage.cacheHitTokens+i,cacheMissTokens:t.usage.cacheMissTokens+r,lastCallCacheHit:o?i:t.usage.lastCallCacheHit,lastCallCacheMiss:o?r:t.usage.lastCallCacheMiss,reservedTokens:t.usage.reservedTokens};return{...t,usage:d,messages:t.messages.map(p=>p.kind!=="assistant"||p.turn!==n.turn?p:{...p,pending:!1})}}case"tool.preparing":return{...t,messages:t.messages.map(s=>s.kind!=="assistant"||s.turn!==n.turn||s.segments.some(i=>i.kind==="tool"&&i.callId===n.callId)?s:{...s,segments:[...s.segments,{kind:"tool",callId:n.callId,name:n.name,args:"",startedAt:Date.now()}]})};case"tool.intent":{const s=Xt(n.name,n.args);return{...t,sessionFiles:en(t.sessionFiles,s),messages:t.messages.map(i=>{if(i.kind!=="assistant"||i.turn!==n.turn)return i;const r=i.segments.findIndex(o=>o.kind==="tool"&&o.callId===n.callId);if(r>=0){const o=[...i.segments],d=o[r];return d?.kind==="tool"&&(o[r]={...d,args:n.args}),{...i,segments:o}}return{...i,segments:[...i.segments,{kind:"tool",callId:n.callId,name:n.name,args:n.args,startedAt:Date.now()}]}})}}case"tool.result":return{...t,messages:t.messages.map(s=>{if(s.kind!=="assistant")return s;let i=!1;const r=s.segments.map(o=>o.kind==="tool"&&o.callId===n.callId?(i=!0,{...o,result:n.output,ok:n.ok,durationMs:Date.now()-o.startedAt}):o);return i?{...s,segments:r}:s})};case"$retry_result":return{...t,retryText:n.text,retryNonce:t.retryNonce+1};case"$btw_result":return{...t,messages:[...t.messages,{kind:"status",text:`≫ btw
17
- ${n.answer}`}]};case"status":return t;case"warning":return n.severity!=="high"?t:{...t,messages:[...t.messages,{kind:"warning",id:`w-${n.id}`,text:n.text,severity:n.severity}]};default:return t}}function tn(t,n){return t.map(s=>s.kind==="user"?`### ${n}
16
+ `),f=async()=>{try{await navigator.clipboard.writeText(v),k(!0),setTimeout(()=>k(!1),1200)}catch{}};return e.jsxs("div",{className:"msg assistant",children:[e.jsx("div",{className:"avatar",children:"DS"}),e.jsxs("div",{className:"body",children:[e.jsxs("div",{className:"who",children:[e.jsx("span",{className:"name",children:"Reasonix"}),i?e.jsx("span",{className:"model",children:i}):null,r?e.jsx("span",{className:"time",children:r}):null]}),n.map((m,y)=>{if(m.kind==="text")return m.text.trim()?mi(m.text)?e.jsx(bi,{summary:hi(m.text)},y):e.jsx(yi,{text:m.text},y):null;if(m.kind==="reasoning")return e.jsx(gi,{text:m.text,streaming:s&&y===n.length-1},y);const S=(m.name==="run_command"||m.name==="run_background")&&m.result===void 0?h.find(I=>I.command===en(m.args)):void 0;if(m.name==="run_command"||m.name==="run_background"){const I=en(m.args)??m.args,q=m.result===void 0?S?"await":"running":m.ok===!1?"failed":"done";return e.jsx(fi,{command:I,output:m.result,state:q,durationMs:m.durationMs,onApprove:S?()=>o(S.id):void 0,onReject:S?()=>d(S.id):void 0,onAlwaysAllow:S?()=>{p(S.id,Dn(I))}:void 0},y)}return e.jsx(xi,{name:m.name,args:m.args,result:m.result,ok:m.ok,durationMs:m.durationMs},y)}),v?e.jsx("div",{className:"msg-actions",children:e.jsxs("button",{type:"button",className:`copy-btn ${g?"done":""}`,onClick:f,title:a("thread.copyResponse"),children:[e.jsx(Et,{size:11}),g?a("markdown.copied"):null]})}):null]})]})});function en(t){if(t)try{const n=JSON.parse(t);if(n&&typeof n=="object"&&typeof n.command=="string")return n.command}catch{}}function ji({plan:t,onDismiss:n}){$();const s=t.steps.length||1,i=t.completedStepIds.length,r=i/s*100,o=t.steps.find(d=>!t.completedStepIds.includes(d.id));return e.jsxs("div",{className:"plan-banner",children:[e.jsx("span",{className:"ico",children:e.jsx(x.list,{size:14})}),e.jsxs("div",{className:"body",children:[e.jsxs("div",{className:"t",children:[a("thread.planRunning",{step:Math.min(i+1,s),total:s}),o?` — ${o.title}`:""]}),e.jsx("div",{className:"s",children:t.plan})]}),e.jsxs("div",{className:"prog",children:[e.jsx("div",{className:"meter-mini",children:e.jsx("span",{style:{width:`${r}%`}})}),n?e.jsx("button",{type:"button",onClick:n,children:a("thread.collapse")}):null]})]})}function Ci({p:t,onApprove:n,onRefine:s,onCancel:i}){$();const r=t.steps?.length??0,o=r>0?a("thread.planStepCount",{count:r}):void 0;return e.jsx(Le,{kind:a("thread.planConfirmationKind"),tone:"info",title:a("thread.startPlan"),sub:o,body:e.jsxs(e.Fragment,{children:[t.summary?e.jsx("div",{style:{marginBottom:6},children:t.summary}):null,e.jsx("div",{style:{whiteSpace:"pre-wrap"},children:t.plan})]}),meta:`plan/#${t.id}`,primaryLabel:a("thread.approve"),secondaryLabel:a("thread.cancel"),tertiaryLabel:a("thread.refine"),onPrimary:n,onSecondary:i,onTertiary:s})}function Ni({c:t,onContinue:n,onRevise:s,onStop:i}){return $(),e.jsx(Le,{kind:a("thread.checkpointKind"),tone:"brand",title:t.title??a("thread.checkpointTitle",{completed:t.completed,total:t.total}),sub:a("thread.checkpointSub",{completed:t.completed,total:t.total}),body:e.jsxs(e.Fragment,{children:[e.jsx("div",{style:{whiteSpace:"pre-wrap"},children:t.result}),t.notes?e.jsx("div",{style:{marginTop:8,fontSize:11.5,color:"var(--muted)"},children:t.notes}):null]}),meta:`checkpoint · ${t.stepId}`,primaryLabel:a("thread.continue"),secondaryLabel:a("thread.stop"),tertiaryLabel:a("thread.revise"),onPrimary:n,onSecondary:i,onTertiary:s})}function Ti({r:t,onAccept:n,onReject:s}){return $(),e.jsx(Le,{kind:a("thread.planRevisionKind"),tone:"warn",title:a("thread.rewritePlan"),sub:a("thread.keepSteps",{n:t.remainingSteps.length}),body:e.jsxs(e.Fragment,{children:[e.jsx("div",{style:{marginBottom:8},children:t.reason}),t.summary?e.jsx("div",{style:{fontSize:11.5,color:"var(--muted)",marginBottom:8},children:t.summary}):null,e.jsx("ul",{style:{margin:0,paddingLeft:18},children:t.remainingSteps.map(i=>e.jsxs("li",{style:{fontSize:12,marginBottom:2},children:[i.title,i.risk?e.jsxs("span",{style:{marginLeft:6,fontSize:10,color:i.risk==="high"?"var(--tone-err)":i.risk==="med"?"var(--tone-warn)":"var(--muted)"},children:["[",i.risk,"]"]}):null]},i.id))})]}),meta:a("thread.revisionMeta"),primaryLabel:a("thread.approveRewrite"),secondaryLabel:a("thread.keepOriginal"),onPrimary:n,onSecondary:s})}function Ai({c:t,onAllow:n,onAlwaysAllow:s,onDeny:i}){$();const r=t.kind==="run_background",o=Dn(t.command);return e.jsx(Le,{kind:a("thread.shellConfirmationKind"),tone:"warn",title:a(r?"thread.runBackgroundCommand":"thread.runCommand"),sub:t.command.length>80?`${t.command.slice(0,80)}…`:t.command,preview:e.jsxs(e.Fragment,{children:[e.jsx("span",{style:{color:"var(--accent)"},children:"$"})," ",t.command]}),meta:a("thread.riskMedium",{kind:t.kind}),primaryLabel:a("thread.execute"),secondaryLabel:a("thread.reject"),tertiaryLabel:a("thread.alwaysAllow",{prefix:o}),onPrimary:n,onSecondary:i,onTertiary:()=>s(o)})}function Pi({p:t,onAllow:n,onAlwaysAllow:s,onDeny:i}){$();const r=t.intent==="write";return e.jsx(Le,{kind:a("thread.pathAccessKind"),tone:"warn",title:a(r?"thread.writePathOutsideSandbox":"thread.readPathOutsideSandbox"),sub:t.path,preview:e.jsxs(e.Fragment,{children:[e.jsxs("div",{children:[t.toolName," → ",t.path]}),e.jsxs("div",{style:{color:"var(--muted)",marginTop:4},children:["workspace: ",t.sandboxRoot]})]}),meta:a("thread.riskMedium",{kind:t.intent}),primaryLabel:a(r?"thread.allowWrite":"thread.allowRead"),secondaryLabel:a("thread.reject"),tertiaryLabel:a("thread.alwaysAllowPrefix",{prefix:t.allowPrefix}),onPrimary:n,onSecondary:i,onTertiary:()=>s(t.allowPrefix)})}function Mi({c:t,onPick:n,onCancel:s}){return $(),e.jsx(Le,{kind:a("thread.userChoiceKind"),tone:"info",title:t.question,sub:a("thread.optionCount",{count:t.options.length}),body:e.jsx("div",{style:{display:"flex",flexDirection:"column",gap:6},children:t.options.map(i=>e.jsx("button",{type:"button",className:"btn",style:{justifyContent:"flex-start",textAlign:"left"},onClick:()=>n(i.id),children:e.jsxs("div",{children:[e.jsx("div",{style:{fontWeight:600},children:i.title}),i.summary?e.jsx("div",{style:{fontSize:11,color:"var(--muted)",marginTop:2},children:i.summary}):null]})},i.id))}),primaryLabel:a("thread.cancel"),onPrimary:s})}function Ei(t){const n=new Set(t.completedStepIds);return t.steps.map((s,i)=>({n:String(i+1),state:n.has(s.id)?"done":i===t.completedStepIds.length?"running":"queued",label:s.title,hint:s.action,durationLabel:void 0}))}function Ri({plan:t}){return $(),e.jsx(ki,{title:a("thread.activePlan"),subtitle:t.summary,steps:Ei(t)})}function Di({open:t,onClose:n,recent:s,current:i,anchor:r,onPick:o,onBrowse:d}){$();const[p,h]=l.useState(""),g=l.useRef(null);l.useEffect(()=>{if(!t)return;h("");const m=window.setTimeout(()=>g.current?.focus(),40);return()=>window.clearTimeout(m)},[t]);const k=l.useMemo(()=>{const m=s.length>0?s:i?[i]:[],y=p.trim().toLowerCase();return y?m.filter(S=>S.toLowerCase().includes(y)):m},[s,i,p]);if(!t)return null;const v=r?.left??240,f=r?.bottom!==void 0?{bottom:r.bottom,left:v}:{top:r?.top??56,left:v};return e.jsx("div",{className:"wd-mask",onMouseDown:n,children:e.jsxs("div",{className:"wd-pop",style:f,onMouseDown:m=>m.stopPropagation(),children:[e.jsxs("div",{className:"wd-head",children:[e.jsx(x.folder,{size:12}),e.jsx("span",{children:a("workdir.title")}),e.jsx("span",{style:{marginLeft:"auto",fontFamily:"Geist Mono, monospace",fontSize:10,color:"var(--muted)"},children:e.jsx(G,{keys:["mod","O"]})})]}),e.jsx("input",{ref:g,className:"wd-search",placeholder:a("workdir.searchPlaceholder"),value:p,onChange:m=>h(m.target.value),onKeyDown:m=>{m.key==="Escape"?(m.preventDefault(),n()):m.key==="Enter"&&k[0]&&(m.preventDefault(),o(k[0]),n())}}),e.jsxs("div",{className:"wd-list",children:[k.length===0?e.jsx("div",{style:{padding:"16px 12px",fontSize:11.5,color:"var(--muted)",fontFamily:"Geist Mono, monospace"},children:a("workdir.empty")}):null,k.map(m=>{const y=m===i,S=m.split(/[\\/]/).filter(Boolean).pop()??m;return e.jsxs("div",{className:"wd-row",onClick:()=>{y||o(m),n()},title:m,children:[e.jsx("span",{className:"ic",children:e.jsx(x.folder,{size:12})}),e.jsxs("div",{className:"b",children:[e.jsx("div",{className:"p",children:S}),e.jsx("div",{className:"br",children:m})]}),y?e.jsx("span",{className:"pin",children:e.jsx(x.check,{size:11})}):null]},m)})]}),e.jsx("div",{className:"wd-foot",children:e.jsxs("button",{type:"button",className:"btn ghost",onClick:()=>{d(),n()},children:[e.jsx(x.plus,{size:11})," ",a("workdir.browse")]})})]})})}async function Li(t){const n=document.querySelector('meta[name="reasonix-token"]')?.getAttribute("content")??"",s=new URLSearchParams;t&&s.set("path",t),n&&n!=="__REASONIX_TOKEN__"&&s.set("token",n);const i=await fetch(`/api/browse?${s.toString()}`);if(!i.ok){const r=await i.text();throw new Error(r||`browse failed (${i.status})`)}return await i.json()}function Ii({open:t,initialPath:n,onCancel:s,onConfirm:i}){$();const[r,o]=l.useState(n??""),[d,p]=l.useState(null),[h,g]=l.useState(""),[k,v]=l.useState(!1),f=l.useRef(!1),m=l.useCallback(async R=>{v(!0),g("");try{const D=await Li(R);p(D),o(D.path)}catch(D){g(D instanceof Error?D.message:String(D))}finally{v(!1)}},[]);if(l.useEffect(()=>{if(!t){f.current=!1;return}f.current||(f.current=!0,m(n??""))},[t,n,m]),!t)return null;const y=r.trim(),S=y.length>0&&!k,I=d!==null&&y===d.path,q=()=>{S&&i(y)},X=R=>{R.key==="Escape"?(R.preventDefault(),s()):R.key==="Enter"&&(R.preventDefault(),I?q():m(y))};return e.jsx("div",{className:"settings-mask",onMouseDown:s,children:e.jsxs("div",{className:"workdir-input",onMouseDown:R=>R.stopPropagation(),children:[e.jsxs("div",{className:"workdir-input-head",children:[e.jsx(x.folder,{size:14}),e.jsx("span",{children:a("workdir.title")}),e.jsx("button",{type:"button",className:"close-btn",onClick:s,title:a("workdir.cancel"),children:e.jsx(x.x,{size:13})})]}),e.jsxs("div",{className:"workdir-input-pathrow",children:[e.jsx("input",{autoFocus:!0,className:"workdir-input-path",value:r,placeholder:a("workdir.pathPlaceholder"),onChange:R=>o(R.target.value),onKeyDown:X,spellCheck:!1}),e.jsx("button",{type:"button",className:"btn ghost",onClick:()=>void m(y),disabled:k||y.length===0,title:a("workdir.goTip"),children:a("workdir.go")})]}),h?e.jsx("div",{className:"workdir-input-error",children:h}):null,e.jsxs("div",{className:"workdir-input-list",children:[d?.parent?e.jsxs("div",{className:"workdir-input-row up",onClick:()=>void m(d.parent),role:"button",tabIndex:0,onKeyDown:R=>{(R.key==="Enter"||R.key===" ")&&m(d.parent)},children:[e.jsx("span",{className:"ic",children:"↑"}),e.jsx("span",{children:".."})]}):null,d?.entries.length===0&&!k?e.jsx("div",{className:"workdir-input-empty",children:a("workdir.emptyDir")}):null,d?.entries.map(R=>e.jsxs("div",{className:"workdir-input-row",onClick:()=>void m(R.full),onDoubleClick:()=>i(R.full),role:"button",tabIndex:0,title:R.full,onKeyDown:D=>{D.key==="Enter"&&m(R.full)},children:[e.jsx("span",{className:"ic",children:e.jsx(x.folder,{size:12})}),e.jsx("span",{className:"n",children:R.name})]},R.full)),k?e.jsx("div",{className:"workdir-input-empty",children:a("workdir.loading")}):null]}),e.jsxs("div",{className:"workdir-input-foot",children:[e.jsx("button",{type:"button",className:"btn ghost",onClick:s,children:a("workdir.cancel")}),e.jsx("button",{type:"button",className:"btn primary",onClick:q,disabled:!S,children:a("workdir.openHere")})]})]})})}const gt=80;function zi(t,n,s,i){const[r,o]=l.useState(!1),d=l.useRef(!0),p=l.useRef(s),h=l.useRef(0),g=l.useCallback(()=>{const f=t.current;return f?f.scrollTop+f.clientHeight>=f.scrollHeight-gt:!0},[t]),k=l.useCallback(()=>{const f=t.current;f&&o(!d.current&&f.scrollHeight>f.clientHeight+gt)},[t]),v=l.useCallback((f=!0)=>{const m=t.current;m&&(d.current=!0,o(!1),m.scrollTo({top:m.scrollHeight,behavior:f?"smooth":"instant"}))},[t]);return l.useEffect(()=>{const f=t.current;if(!f)return;let m=0;const y=()=>{m&&cancelAnimationFrame(m),m=requestAnimationFrame(()=>{m=0,d.current=g(),k()})};return f.addEventListener("wheel",y,{passive:!0}),f.addEventListener("touchmove",y,{passive:!0}),f.addEventListener("keydown",y),f.addEventListener("pointerdown",y),()=>{m&&cancelAnimationFrame(m),f.removeEventListener("wheel",y),f.removeEventListener("touchmove",y),f.removeEventListener("keydown",y),f.removeEventListener("pointerdown",y)}},[t,g,k]),l.useEffect(()=>{p.current!==s&&v(!0),p.current=s},[s,v]),l.useEffect(()=>{const f=n.current;if(!f)return;const m=new ResizeObserver(()=>{h.current&&cancelAnimationFrame(h.current),h.current=requestAnimationFrame(()=>{h.current=0;const y=t.current;y&&(d.current?y.scrollTo({top:y.scrollHeight,behavior:"instant"}):k())})});return m.observe(f),()=>{m.disconnect(),h.current&&(cancelAnimationFrame(h.current),h.current=0)}},[t,n,k]),l.useEffect(()=>{const f=t.current;if(!f)return;const m=setTimeout(()=>{const y=i?.()??null;y!=null&&y>gt?(d.current=!1,f.scrollTop=y,k()):(d.current=!0,o(!1),f.scrollTo({top:f.scrollHeight,behavior:"instant"}))},60);return()=>clearTimeout(m)},[t,i,k]),{showJumpButton:r,scrollToBottom:v}}const _i='input, textarea, [contenteditable=""], [contenteditable="true"], [contenteditable="plaintext-only"]';function qi(){return{autoCorrect:"off",autoCapitalize:"off",spellCheck:!1}}function Bi(){return typeof document>"u"?!1:document.documentElement.dataset.platform==="macos"}function Tt(t){if(!(t instanceof HTMLElement)||!(t instanceof HTMLInputElement)&&!(t instanceof HTMLTextAreaElement)&&!t.isContentEditable)return;const n=qi();t.setAttribute("autocorrect",n.autoCorrect),t.setAttribute("autocapitalize",n.autoCapitalize),t.setAttribute("spellcheck",String(n.spellCheck)),t.spellcheck=n.spellCheck}function tn(t){t instanceof Element&&Tt(t),t.querySelectorAll(_i).forEach(Tt)}function Hi(){l.useEffect(()=>{if(typeof document>"u"||!Bi())return;const t=document.body;if(!t)return;tn(t);const n=i=>{i.target instanceof Element&&Tt(i.target)},s=new MutationObserver(i=>{for(const r of i)r.addedNodes.forEach(o=>{o instanceof Element&&tn(o)})});return document.addEventListener("focusin",n,!0),s.observe(t,{childList:!0,subtree:!0}),()=>{document.removeEventListener("focusin",n,!0),s.disconnect()}},[])}function Oi(t){const n=t.scope==="builtin"?a("app.skill.scope.builtin"):t.scope==="global"?a("app.skill.scope.global"):a("app.skill.scope.project"),s=t.runAs==="subagent"?a("app.skill.runAs.subagent"):a("app.skill.runAs.inline");return a("app.skill.generic",{scope:n,runAs:s})}function At(t){return t.reduce((s,i)=>i.kind==="user"||i.kind==="assistant"?Math.max(s,i.turn):s,0)+1}function Fi(t,n){switch(n.t){case"send_user":return{...t,busy:!0,messages:[...t.messages,{kind:"user",text:n.text,clientId:n.clientId,turn:At(t.messages)}]};case"start_skill":{const s=n.args?` ${n.args}`:"";return{...t,busy:!0,activeSkill:n.skill,messages:[...t.messages,{kind:"user",text:`/${n.skill.name}${s}`,clientId:n.clientId,turn:At(t.messages),skill:n.skill}]}}case"rpc_exit":return{...t,ready:!1,busy:!1,activeSkill:null,queuedSends:[],messages:[...t.messages,{kind:"error",message:`reasonix exited (code ${n.code??"?"})`}]};case"incoming":return Ki(t,n.event);case"batch_delta":{const s=[];for(const i of n.items){const r=s[s.length-1];r&&r.turn===i.turn&&r.channel===i.channel?r.text+=i.text:s.push({...i})}return{...t,messages:t.messages.map(i=>{if(i.kind!=="assistant")return i;const r=s.filter(d=>d.turn===i.turn);if(r.length===0)return i;let o=i.segments;for(const d of r)o=Pt(o,d.channel==="content"?"text":"reasoning",d.text);return{...i,segments:o}})}}case"clear":return{...t,busy:!1,currentSession:void 0,messages:[],pendingConfirms:[],pendingPathAccess:[],pendingChoices:[],pendingPlans:[],pendingCheckpoints:[],pendingRevisions:[],activePlan:null,usage:He(),sessionFiles:[],activeSkill:null,queuedSends:[],retryNonce:0};case"resolve_confirm":return{...t,pendingConfirms:t.pendingConfirms.filter(s=>s.id!==n.id)};case"resolve_path_access":return{...t,pendingPathAccess:t.pendingPathAccess.filter(s=>s.id!==n.id)};case"resolve_choice":return{...t,pendingChoices:t.pendingChoices.filter(s=>s.id!==n.id)};case"resolve_plan":{const s=t.pendingPlans.find(r=>r.id===n.id);let i=t.activePlan;if(s&&n.verdict.type==="approve"){const r=s.steps;i={plan:s.plan,summary:s.summary,steps:r??[],completedStepIds:[],stepResults:{}}}return{...t,pendingPlans:t.pendingPlans.filter(r=>r.id!==n.id),activePlan:i}}case"resolve_checkpoint":return{...t,pendingCheckpoints:t.pendingCheckpoints.filter(s=>s.id!==n.id)};case"resolve_revision":{const s=t.pendingRevisions.find(r=>r.id===n.id);let i=t.activePlan;if(s&&n.verdict.type==="accepted"&&i){const r=new Set(i.completedStepIds),o=i.steps.filter(d=>r.has(d.id));i={...i,steps:[...o,...s.remainingSteps]}}return{...t,pendingRevisions:t.pendingRevisions.filter(r=>r.id!==n.id),activePlan:i}}case"dismiss_plan":return{...t,activePlan:null};case"mention_results":return{...t,mentionResults:n.results};case"mention_preview":return{...t,mentionPreview:n.preview};case"enqueue_send":return{...t,queuedSends:[...t.queuedSends,n.text]};case"dequeue_send":return{...t,queuedSends:t.queuedSends.filter((s,i)=>i!==n.index)};case"shift_queued_send":return{...t,queuedSends:t.queuedSends.slice(1)}}}const $i=new Set(["read_file"]),Ui=new Set(["edit_file","write_file"]);function nn(t,n){try{const s=JSON.parse(n);if($i.has(t)&&typeof s?.path=="string")return[{path:s.path,status:"c"}];if(Ui.has(t)&&typeof s?.path=="string")return[{path:s.path,status:"m"}];if(t==="multi_edit"&&Array.isArray(s?.edits)){const i=[],r=new Set;for(const o of s.edits)typeof o?.path=="string"&&!r.has(o.path)&&(r.add(o.path),i.push({path:o.path,status:"m"}));return i}}catch{}return[]}function sn(t,n){if(n.length===0)return t;const s=[...t],i=new Map;s.forEach((o,d)=>i.set(o.path,d));let r=!1;for(const o of n){const d=i.get(o.path);if(d===void 0){i.set(o.path,s.length),s.push(o),r=!0;continue}const p=s[d];!p||p.status==="m"||p.status!==o.status&&(s[d]=o,r=!0)}return r?s:t}function He(){return{totalCostUsd:0,totalPromptTokens:0,totalCompletionTokens:0,cacheHitTokens:0,cacheMissTokens:0,lastCallCacheHit:null,lastCallCacheMiss:null,reservedTokens:0}}function Pt(t,n,s){const i=t[t.length-1];return i&&i.kind===n?[...t.slice(0,-1),{...i,text:i.text+s}]:[...t,{kind:n,text:s}]}function Ki(t,n){switch(n.type){case"user.message":{const s=t.messages[t.messages.length-1];return t.busy&&s?.kind==="user"&&s.text===n.text?t:{...t,busy:!0,messages:[...t.messages,{kind:"user",text:n.text,clientId:`remote-${n.id}`,turn:n.turn>0?n.turn:At(t.messages)}]}}case"$ready":return{...t,ready:!0,needsSetup:!1};case"$needs_setup":return{...t,needsSetup:!0,ready:!1};case"$turn_complete":return{...t,busy:!1,activeSkill:null};case"$confirm_required":return{...t,pendingConfirms:[...t.pendingConfirms,{id:n.id,kind:n.kind,command:n.command}]};case"$path_access_required":return{...t,pendingPathAccess:[...t.pendingPathAccess,{id:n.id,path:n.path,intent:n.intent,toolName:n.toolName,sandboxRoot:n.sandboxRoot,allowPrefix:n.allowPrefix}]};case"$choice_required":return{...t,pendingChoices:[...t.pendingChoices,{id:n.id,question:n.question,options:n.options,allowCustom:n.allowCustom}]};case"$plan_required":{const s=Array.isArray(n.steps)?n.steps:void 0;return{...t,pendingPlans:[...t.pendingPlans,{id:n.id,plan:n.plan,summary:n.summary,...s?{steps:s}:{}}]}}case"$checkpoint_required":return{...t,pendingCheckpoints:[...t.pendingCheckpoints,{id:n.id,stepId:n.stepId,title:n.title,result:n.result,notes:n.notes,completed:n.completed,total:n.total}]};case"$revision_required":return{...t,pendingRevisions:[...t.pendingRevisions,{id:n.id,reason:n.reason,remainingSteps:n.remainingSteps,summary:n.summary}]};case"$modal_dismissed":switch(n.kind){case"shell":return{...t,pendingConfirms:[]};case"path":return{...t,pendingPathAccess:[]};case"choice":return{...t,pendingChoices:[]};case"plan":return{...t,pendingPlans:[]};case"checkpoint":return{...t,pendingCheckpoints:[]};case"revision":return{...t,pendingRevisions:[]};default:return t}case"$step_completed":{if(!t.activePlan)return t;const s=new Set(t.activePlan.completedStepIds);return s.add(n.stepId),{...t,activePlan:{...t.activePlan,completedStepIds:[...s],stepResults:{...t.activePlan.stepResults,[n.stepId]:n.result}}}}case"$plan_cleared":return{...t,activePlan:null,pendingCheckpoints:[],pendingRevisions:[]};case"$sessions":{const s="currentSession"in n,i=n.currentSession===null?void 0:n.currentSession??t.currentSession,r=s&&i!==t.currentSession;return{...t,sessions:n.items,currentSession:i,messages:r?[]:t.messages,pendingConfirms:r?[]:t.pendingConfirms,pendingPathAccess:r?[]:t.pendingPathAccess,pendingChoices:r?[]:t.pendingChoices,pendingPlans:r?[]:t.pendingPlans,pendingCheckpoints:r?[]:t.pendingCheckpoints,pendingRevisions:r?[]:t.pendingRevisions,activePlan:r?null:t.activePlan,usage:r?He():t.usage,sessionFiles:r?[]:t.sessionFiles,queuedSends:r?[]:t.queuedSends}}case"$session_usage":{const s=n.totalCostUsd===0&&n.totalPromptTokens===0&&n.totalCompletionTokens===0&&n.cacheHitTokens===0&&n.cacheMissTokens===0;return{...t,usage:{...t.usage,totalCostUsd:n.totalCostUsd,totalPromptTokens:n.totalPromptTokens,totalCompletionTokens:n.totalCompletionTokens,cacheHitTokens:n.cacheHitTokens,cacheMissTokens:n.cacheMissTokens,lastCallCacheHit:s?null:t.usage.lastCallCacheHit,lastCallCacheMiss:s?null:t.usage.lastCallCacheMiss}}}case"$mcp_specs":return{...t,mcpSpecs:Array.isArray(n.specs)?n.specs:[],mcpBridged:!!n.bridged};case"$skills":return{...t,skills:n.items};case"$ctx_breakdown":return{...t,usage:{...t.usage,reservedTokens:n.reservedTokens}};case"$memory":return{...t,memory:n.entries,memoryDetail:t.memoryDetail&&n.entries.some(s=>s.path===t.memoryDetail?.path)?t.memoryDetail:null};case"$memory_detail":return{...t,memoryDetail:n.detail};case"$jobs":return{...t,jobs:n.items};case"$balance":return{...t,balance:{currency:n.currency,total:n.total,isAvailable:n.isAvailable}};case"$qq_settings":return{...t,qq:{appId:n.appId,appSecret:n.appSecret,sandbox:n.sandbox,enabled:n.enabled,configured:n.configured,runtimeState:n.runtimeState,lastError:n.lastError,appIdPreview:n.appIdPreview,access:n.access}};case"$settings":{const s=t.settings?.workspaceDir,i=s!==void 0&&s!==n.workspaceDir;return{...t,busy:i?!1:t.busy,messages:i?[]:t.messages,pendingConfirms:i?[]:t.pendingConfirms,pendingPathAccess:i?[]:t.pendingPathAccess,pendingChoices:i?[]:t.pendingChoices,pendingPlans:i?[]:t.pendingPlans,pendingCheckpoints:i?[]:t.pendingCheckpoints,pendingRevisions:i?[]:t.pendingRevisions,activePlan:i?null:t.activePlan,usage:i?He():t.usage,sessionFiles:i?[]:t.sessionFiles,retryNonce:i?0:t.retryNonce,settings:{reasoningEffort:n.reasoningEffort,editMode:n.editMode,budgetUsd:n.budgetUsd,baseUrl:n.baseUrl,apiKeyPrefix:n.apiKeyPrefix,workspaceDir:n.workspaceDir,recentWorkspaces:n.recentWorkspaces,model:n.model,editor:n.editor,webSearchEngine:n.webSearchEngine,subagentModels:n.subagentModels,showSystemEvents:n.showSystemEvents,version:n.version}}}case"$session_loaded":{const s=n.name,i=n.messages.map((o,d)=>{if(o.kind==="user")return{kind:"user",text:o.text,clientId:`c-loaded-${d}`,turn:d+1};const p=o.segments.map(h=>h.kind==="tool"?{kind:"tool",callId:h.callId,name:h.name,args:h.args,startedAt:0,result:h.result,ok:h.ok,durationMs:0}:h);return{kind:"assistant",turn:o.turn,segments:p,pending:!1}});let r=[];for(const o of i)if(o.kind==="assistant")for(const d of o.segments)d.kind==="tool"&&(r=sn(r,nn(d.name,d.args)));return{...t,busy:!1,currentSession:s,messages:i,pendingConfirms:[],pendingPathAccess:[],pendingChoices:[],pendingPlans:[],pendingCheckpoints:[],pendingRevisions:[],activePlan:null,usage:{...He(),totalCostUsd:n.carryover.totalCostUsd,totalPromptTokens:n.carryover.cacheHitTokens+n.carryover.cacheMissTokens,cacheHitTokens:n.carryover.cacheHitTokens,cacheMissTokens:n.carryover.cacheMissTokens},sessionFiles:r,activeSkill:null,queuedSends:[],retryNonce:0}}case"$session_empty":{const s=n.sizeBytes===0?"0 bytes":`${n.sizeBytes} bytes, no valid entries`;return{...t,messages:[...t.messages,{kind:"error",message:`Session "${n.name}" loaded with no messages (${s}). The file ~/.reasonix/sessions/${n.name}.jsonl exists but couldn't be parsed — start a new chat or restore from .jsonl.bak if you have one.`}]}}case"$error":case"error":return{...t,busy:!1,activeSkill:null,messages:[...t.messages,{kind:"error",message:n.message}]};case"model.turn.started":return t.messages.some(s=>s.kind==="assistant"&&s.turn===n.turn)?{...t,model:n.model}:{...t,model:n.model,messages:[...t.messages,{kind:"assistant",turn:n.turn,segments:[],pending:!0}]};case"model.delta":return{...t,messages:t.messages.map(s=>s.kind!=="assistant"||s.turn!==n.turn?s:n.channel==="content"?{...s,segments:Pt(s.segments,"text",n.text)}:n.channel==="reasoning"?{...s,segments:Pt(s.segments,"reasoning",n.text)}:s)};case"model.final":{const s=n.usage,i=s?.prompt_cache_hit_tokens??0,r=s?.prompt_cache_miss_tokens??0,o=i>0||r>0,d={totalCostUsd:t.usage.totalCostUsd+(n.costUsd??0),totalPromptTokens:t.usage.totalPromptTokens+(s?.prompt_tokens??0),totalCompletionTokens:t.usage.totalCompletionTokens+(s?.completion_tokens??0),cacheHitTokens:t.usage.cacheHitTokens+i,cacheMissTokens:t.usage.cacheMissTokens+r,lastCallCacheHit:o?i:t.usage.lastCallCacheHit,lastCallCacheMiss:o?r:t.usage.lastCallCacheMiss,reservedTokens:t.usage.reservedTokens};return{...t,usage:d,messages:t.messages.map(p=>p.kind!=="assistant"||p.turn!==n.turn?p:{...p,pending:!1})}}case"tool.preparing":return{...t,messages:t.messages.map(s=>s.kind!=="assistant"||s.turn!==n.turn||s.segments.some(i=>i.kind==="tool"&&i.callId===n.callId)?s:{...s,segments:[...s.segments,{kind:"tool",callId:n.callId,name:n.name,args:"",startedAt:Date.now()}]})};case"tool.intent":{const s=nn(n.name,n.args);return{...t,sessionFiles:sn(t.sessionFiles,s),messages:t.messages.map(i=>{if(i.kind!=="assistant"||i.turn!==n.turn)return i;const r=i.segments.findIndex(o=>o.kind==="tool"&&o.callId===n.callId);if(r>=0){const o=[...i.segments],d=o[r];return d?.kind==="tool"&&(o[r]={...d,args:n.args}),{...i,segments:o}}return{...i,segments:[...i.segments,{kind:"tool",callId:n.callId,name:n.name,args:n.args,startedAt:Date.now()}]}})}}case"tool.result":return{...t,messages:t.messages.map(s=>{if(s.kind!=="assistant")return s;let i=!1;const r=s.segments.map(o=>o.kind==="tool"&&o.callId===n.callId?(i=!0,{...o,result:n.output,ok:n.ok,durationMs:Date.now()-o.startedAt}):o);return i?{...s,segments:r}:s})};case"$retry_result":return{...t,retryText:n.text,retryNonce:t.retryNonce+1};case"$btw_result":return{...t,messages:[...t.messages,{kind:"status",text:`≫ btw
17
+ ${n.answer}`}]};case"status":return t;case"warning":return n.severity!=="high"?t:{...t,messages:[...t.messages,{kind:"warning",id:`w-${n.id}`,text:n.text,severity:n.severity}]};default:return t}}function an(t,n){return t.map(s=>s.kind==="user"?`### ${n}
18
18
 
19
19
  ${s.text}`:s.kind==="assistant"?`### Reasonix
20
20
 
@@ -39,9 +39,9 @@ ${s.message}`:"").filter(Boolean).join(`
39
39
 
40
40
  ---
41
41
 
42
- `)}function Oi(t){return t.replace(/[<>:"/\\|?*\x00-\x1f]/g,"_").replace(/^\.+/,"").slice(0,200)||"session"}function Fi(t){return`${Oi(t)}.md`}function $i({tabId:t,active:n,currency:s,registerDispatch:i,onNewTab:r,onCloseTab:o,canCloseTab:d,theme:p,themeStyle:h,onSetTheme:g,onSetThemeStyle:k,onToggleTheme:v,fontScale:f,onSetFontScale:m,fontFamily:y,onSetFontFamily:j,sideCollapsed:I,ctxCollapsed:q,onToggleSide:X,onToggleCtx:R,onToggleCurrency:L,tabsList:K,activeTabId:F,setActiveTabId:J,mobileSideOpen:ee,onToggleMobileSide:E}){const[u,z]=l.useReducer(_i,{ready:!1,needsSetup:!1,busy:!1,messages:[],pendingConfirms:[],pendingPathAccess:[],pendingChoices:[],pendingPlans:[],pendingCheckpoints:[],pendingRevisions:[],activePlan:null,usage:Xe(),sessions:[],settings:null,qq:null,balance:null,mentionResults:null,mentionPreview:null,mcpSpecs:[],mcpBridged:!1,skills:[],sessionFiles:[],memory:[],memoryDetail:null,jobs:[],activeSkill:null,queuedSends:[],retryNonce:0});$(),Ii();const[le,ne]=l.useState(""),[he,Z]=l.useState(null),[ce,ge]=l.useState(()=>ni()),[S,C]=l.useState(!1),[H,te]=l.useState(void 0),re=l.useRef(null),fe=l.useRef(null),W=l.useRef(null),[Y,B]=l.useState(!1),[Q,be]=l.useState("general"),[w,T]=l.useState(!1),[O,ie]=l.useState(!1),[V,oe]=l.useState(null),[Ae,Ie]=l.useState(!1);l.useEffect(()=>{V&&u.currentSession===V&&oe(null)},[V,u.currentSession]);const de=l.useCallback((c="general")=>{be(c),B(!0)},[]),Oe=Ks(n);l.useEffect(()=>(i(t,z),()=>i(t,null)),[t,i]);const N=l.useCallback(c=>{const b={tabId:t,...c};ve("rpc_send",{line:JSON.stringify(b)}).catch(M=>console.error(`${c.cmd} failed`,M))},[t]),Rn=l.useCallback((c,b)=>N({cmd:"mention_query",query:c,nonce:b}),[N]),Ln=l.useCallback((c,b)=>N({cmd:"mention_preview",path:c,nonce:b}),[N]),tt=l.useCallback(c=>N({cmd:"mention_picked",path:c}),[N]),Se=l.useCallback(c=>N({cmd:"settings_save",...c}),[N]),nt=l.useCallback(()=>N({cmd:"qq_status_get"}),[N]),In=l.useCallback(()=>N({cmd:"qq_connect"}),[N]),zn=l.useCallback(()=>N({cmd:"qq_disconnect"}),[N]),_n=l.useCallback(c=>N({cmd:"qq_config_save",...c}),[N]),qn=l.useCallback(c=>N({cmd:"setup_save_key",key:c}),[N]),Bn=l.useCallback(c=>N({cmd:"mcp_specs_add",spec:c}),[N]),Hn=l.useCallback(c=>N({cmd:"mcp_specs_remove",spec:c}),[N]),Pe=l.useCallback(()=>{N({cmd:"new_chat"}),z({t:"clear"})},[N]),Fe=l.useCallback(async()=>{if(ln){Ie(!0);return}try{const c=await Et({directory:!0,multiple:!1,title:a("workdir.title"),defaultPath:u.settings?.workspaceDir});typeof c=="string"&&c.length>0&&Se({workspaceDir:c})}catch(c){console.error("pickWorkspace failed",c)}},[Se,u.settings?.workspaceDir]),ae=l.useCallback((c,b)=>{Z({msg:c,yolo:b?.yolo}),window.setTimeout(()=>Z(null),b?.duration??1600)},[]),It=l.useRef(n);l.useEffect(()=>{It.current=n},[n]),l.useEffect(()=>{const c=u.settings?.workspaceDir;let b=null,M=!1;return(async()=>{try{const Ne=await(await xs(()=>Promise.resolve().then(()=>zs),void 0)).getCurrentWebview().onDragDropEvent(Ee=>{if(!It.current)return;if(Ee.payload.type==="enter"){document.body.style.setProperty("--drop-overlay-label",`"${a("dragDrop.overlay")}"`),document.body.dataset.dragOver="1";return}if(Ee.payload.type==="leave"){delete document.body.dataset.dragOver;return}if(Ee.payload.type!=="drop")return;delete document.body.dataset.dragOver;const Ce=Ee.payload.paths??[];if(Ce.length===0)return;const De=Ce.map(ke=>{const ze=ke.replace(/\\/g,"/");if(c){const _e=c.replace(/\\/g,"/").replace(/\/+$/,"");if(ze===_e||ze.startsWith(`${_e}/`))return ze.slice(_e.length).replace(/^\/+/,"")||"."}return ze});ne(ke=>`${ke.trim()?`${ke.replace(/\s+$/,"")} `:""}${De.map(_e=>`@${_e}`).join(" ")} `);for(const ke of De)tt(ke);re.current?.focus()});M?Ne():b=Ne}catch(U){console.error("drag-drop listen failed",U)}})(),()=>{M=!0,b?.(),delete document.body.dataset.dragOver}},[u.settings?.workspaceDir,tt]);const $e=l.useCallback(c=>{const b=(c??le).trim();if(!b||!u.ready||u.busy)return;const M=/^\/btw(?:\s+([\s\S]+))?$/.exec(b);if(M){const Ne=M[1]?.trim()??"";if(!Ne)return;N({cmd:"btw",text:Ne}),c||ne("");return}const U=b.match(/^\/([a-zA-Z0-9_-]+)(\s+.*)?$/);if(U){const[,Ne,Ee]=U,Ce=u.skills.find(De=>De.name===Ne);if(Ce){const De=`skill-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,ke=Ee?.trim()??"";z({t:"start_skill",skill:{name:Ce.name,runAs:Ce.runAs},args:ke,clientId:De}),N({cmd:"skill_run",name:Ce.name,args:ke||void 0}),c||ne("");return}}const ye=`c-${Date.now()}`;z({t:"send_user",text:b,clientId:ye}),N({cmd:"user_input",text:b}),c||ne("")},[le,u.ready,u.busy,u.skills,N]),Me=l.useCallback(()=>N({cmd:"abort"}),[N]);l.useEffect(()=>{u.retryNonce>0&&u.retryText&&(ne(u.retryText),re.current?.focus())},[u.retryNonce]),l.useEffect(()=>{if(u.busy||!u.ready||u.queuedSends.length===0)return;const c=u.queuedSends[0];c&&(z({t:"shift_queued_send"}),$e(c))},[u.busy,u.ready,u.queuedSends,$e]);const xe=l.useCallback((c,b)=>{N({cmd:"confirm_response",id:c,response:b,kind:"shell"}),z({t:"resolve_confirm",id:c})},[N]),On=l.useCallback(c=>xe(c,{type:"run_once"}),[xe]),Fn=l.useCallback(c=>xe(c,{type:"deny"}),[xe]),$n=l.useCallback((c,b)=>xe(c,{type:"always_allow",prefix:b}),[xe]),st=l.useCallback((c,b)=>{N({cmd:"confirm_response",id:c,response:b,kind:"path"}),z({t:"resolve_path_access",id:c})},[N]),zt=l.useCallback((c,b)=>{N({cmd:"choice_response",id:c,response:b}),z({t:"resolve_choice",id:c})},[N]),at=l.useCallback((c,b)=>{N({cmd:"plan_response",id:c,response:b}),z({t:"resolve_plan",id:c,verdict:b})},[N]),it=l.useCallback((c,b)=>{N({cmd:"checkpoint_response",id:c,response:b}),z({t:"resolve_checkpoint",id:c,verdict:b})},[N]),_t=l.useCallback((c,b)=>{N({cmd:"revision_response",id:c,response:b}),z({t:"resolve_revision",id:c,verdict:b})},[N]),qt=l.useRef(u.currentSession);qt.current=u.currentSession;const Un=l.useCallback(()=>{const c=qt.current;if(!c)return null;const b=localStorage.getItem(`reasonix.scroll.${c}`),M=b?Number(b):Number.NaN;return Number.isFinite(M)?M:null},[]),{showJumpButton:Kn,scrollToBottom:Wn}=Ei(fe,W,u.busy,Un);l.useEffect(()=>{const c=fe.current,b=u.currentSession;if(!c||!b)return;const M=`reasonix.scroll.${b}`;let U;const ye=()=>{clearTimeout(U),U=setTimeout(()=>{c.scrollTop+c.clientHeight>=c.scrollHeight-80?localStorage.removeItem(M):localStorage.setItem(M,String(Math.round(c.scrollTop)))},250)};return c.addEventListener("scroll",ye,{passive:!0}),()=>{c.removeEventListener("scroll",ye),clearTimeout(U)}},[u.currentSession]),l.useEffect(()=>{if(!n||!w)return;N({cmd:"jobs_list"});const c=window.setInterval(()=>N({cmd:"jobs_list"}),1500);return()=>window.clearInterval(c)},[n,w,N]),l.useEffect(()=>{n&&(u.busy||N({cmd:"jobs_list"}))},[n,u.busy,N]),l.useEffect(()=>{n&&nt()},[n,nt]);const Gn=l.useRef(ma()),Bt=l.useRef(!1);l.useEffect(()=>{if(!n||Bt.current||!u.ready||u.sessions.length===0)return;Bt.current=!0;const c=Gn.current;if(c&&c!==u.currentSession){if(!u.sessions.some(b=>b.name===c)){ha();return}N({cmd:"session_load",name:c})}},[n,u.ready,u.sessions,u.currentSession,N]),l.useEffect(()=>{if(!n)return;const c=b=>{const M=b.ctrlKey||b.metaKey;if(M&&(b.key==="a"||b.key==="A")){const U=b.target?.tagName;U!=="INPUT"&&U!=="TEXTAREA"&&b.preventDefault();return}if(M&&(b.key==="l"||b.key==="L"))b.preventDefault(),re.current?.focus();else if(M&&(b.key==="n"||b.key==="N"))b.preventDefault(),Pe();else if(M&&(b.key==="o"||b.key==="O"))b.preventDefault(),te(void 0),C(U=>!U);else if(M&&b.key===",")b.preventDefault(),Y?B(!1):de("general");else if(M&&(b.key==="j"||b.key==="J"))b.preventDefault(),T(U=>!U);else if(b.key==="Escape"&&u.busy){const U=b.target;if(U?.tagName==="INPUT"||U?.tagName==="TEXTAREA")return;b.preventDefault(),Me()}};return window.addEventListener("keydown",c),()=>window.removeEventListener("keydown",c)},[n,u.busy,Me,Pe,Y,de]);const Vn=Ws({newChat:()=>{Pe(),ae(a("app.toast.newSession"))},clearChat:()=>{z({t:"clear"}),ae(a("app.toast.cleared"))},focusComposer:()=>re.current?.focus(),openSettings:()=>de("general"),about:()=>ie(!0),abort:Me,copyLast:()=>{const c=[...u.messages].reverse().find(M=>M.kind==="assistant");if(!c||c.kind!=="assistant")return;const b=c.segments.filter(M=>M.kind==="text").map(M=>M.text).join(`
42
+ `)}function Wi(t){return t.replace(/[<>:"/\\|?*\x00-\x1f]/g,"_").replace(/^\.+/,"").slice(0,200)||"session"}function Gi(t){return`${Wi(t)}.md`}function Vi({tabId:t,active:n,currency:s,registerDispatch:i,onNewTab:r,onCloseTab:o,canCloseTab:d,theme:p,themeStyle:h,onSetTheme:g,onSetThemeStyle:k,onToggleTheme:v,fontScale:f,onSetFontScale:m,fontFamily:y,onSetFontFamily:S,sideCollapsed:I,ctxCollapsed:q,onToggleSide:X,onToggleCtx:R,onToggleCurrency:D,tabsList:K,activeTabId:F,setActiveTabId:J,mobileSideOpen:ee,onToggleMobileSide:E}){const[u,z]=l.useReducer(Fi,{ready:!1,needsSetup:!1,busy:!1,messages:[],pendingConfirms:[],pendingPathAccess:[],pendingChoices:[],pendingPlans:[],pendingCheckpoints:[],pendingRevisions:[],activePlan:null,usage:He(),sessions:[],settings:null,qq:null,balance:null,mentionResults:null,mentionPreview:null,mcpSpecs:[],mcpBridged:!1,skills:[],sessionFiles:[],memory:[],memoryDetail:null,jobs:[],activeSkill:null,queuedSends:[],retryNonce:0});$(),Hi();const[le,ne]=l.useState(""),[he,Z]=l.useState(null),[ce,ge]=l.useState(()=>oi()),[j,N]=l.useState(!1),[H,te]=l.useState(void 0),re=l.useRef(null),fe=l.useRef(null),W=l.useRef(null),[Y,B]=l.useState(!1),[Q,be]=l.useState("general"),[w,T]=l.useState(!1),[O,ie]=l.useState(!1),[V,oe]=l.useState(null),[Ae,Ie]=l.useState(!1);l.useEffect(()=>{V&&u.currentSession===V&&oe(null)},[V,u.currentSession]);const de=l.useCallback((c="general")=>{be(c),B(!0)},[]),$e=Ys(n);l.useEffect(()=>(i(t,z),()=>i(t,null)),[t,i]);const C=l.useCallback(c=>{const b={tabId:t,...c};ve("rpc_send",{line:JSON.stringify(b)}).catch(M=>console.error(`${c.cmd} failed`,M))},[t]),zn=l.useCallback((c,b)=>C({cmd:"mention_query",query:c,nonce:b}),[C]),_n=l.useCallback((c,b)=>C({cmd:"mention_preview",path:c,nonce:b}),[C]),st=l.useCallback(c=>C({cmd:"mention_picked",path:c}),[C]),je=l.useCallback(c=>C({cmd:"settings_save",...c}),[C]),at=l.useCallback(()=>C({cmd:"qq_status_get"}),[C]),qn=l.useCallback(()=>C({cmd:"qq_connect"}),[C]),Bn=l.useCallback(()=>C({cmd:"qq_disconnect"}),[C]),Hn=l.useCallback(c=>C({cmd:"qq_config_save",...c}),[C]),On=l.useCallback(c=>C({cmd:"setup_save_key",key:c}),[C]),Fn=l.useCallback(c=>C({cmd:"mcp_specs_add",spec:c}),[C]),$n=l.useCallback(c=>C({cmd:"mcp_specs_remove",spec:c}),[C]),Pe=l.useCallback(()=>{C({cmd:"new_chat"}),z({t:"clear"})},[C]),Ue=l.useCallback(async()=>{if(un){Ie(!0);return}try{const c=await Lt({directory:!0,multiple:!1,title:a("workdir.title"),defaultPath:u.settings?.workspaceDir});typeof c=="string"&&c.length>0&&je({workspaceDir:c})}catch(c){console.error("pickWorkspace failed",c)}},[je,u.settings?.workspaceDir]),ae=l.useCallback((c,b)=>{Z({msg:c,yolo:b?.yolo}),window.setTimeout(()=>Z(null),b?.duration??1600)},[]),qt=l.useRef(n);l.useEffect(()=>{qt.current=n},[n]),l.useEffect(()=>{const c=u.settings?.workspaceDir;let b=null,M=!1;return(async()=>{try{const Ce=await(await ws(()=>Promise.resolve().then(()=>Os),void 0)).getCurrentWebview().onDragDropEvent(Ee=>{if(!qt.current)return;if(Ee.payload.type==="enter"){document.body.style.setProperty("--drop-overlay-label",`"${a("dragDrop.overlay")}"`),document.body.dataset.dragOver="1";return}if(Ee.payload.type==="leave"){delete document.body.dataset.dragOver;return}if(Ee.payload.type!=="drop")return;delete document.body.dataset.dragOver;const Ne=Ee.payload.paths??[];if(Ne.length===0)return;const Re=Ne.map(ke=>{const ze=ke.replace(/\\/g,"/");if(c){const _e=c.replace(/\\/g,"/").replace(/\/+$/,"");if(ze===_e||ze.startsWith(`${_e}/`))return ze.slice(_e.length).replace(/^\/+/,"")||"."}return ze});ne(ke=>`${ke.trim()?`${ke.replace(/\s+$/,"")} `:""}${Re.map(_e=>`@${_e}`).join(" ")} `);for(const ke of Re)st(ke);re.current?.focus()});M?Ce():b=Ce}catch(U){console.error("drag-drop listen failed",U)}})(),()=>{M=!0,b?.(),delete document.body.dataset.dragOver}},[u.settings?.workspaceDir,st]);const Ke=l.useCallback(c=>{const b=(c??le).trim();if(!b||!u.ready||u.busy)return;const M=/^\/btw(?:\s+([\s\S]+))?$/.exec(b);if(M){const Ce=M[1]?.trim()??"";if(!Ce)return;C({cmd:"btw",text:Ce}),c||ne("");return}const U=b.match(/^\/([a-zA-Z0-9_-]+)(\s+.*)?$/);if(U){const[,Ce,Ee]=U,Ne=u.skills.find(Re=>Re.name===Ce);if(Ne){const Re=`skill-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,ke=Ee?.trim()??"";z({t:"start_skill",skill:{name:Ne.name,runAs:Ne.runAs},args:ke,clientId:Re}),C({cmd:"skill_run",name:Ne.name,args:ke||void 0}),c||ne("");return}}const ye=`c-${Date.now()}`;z({t:"send_user",text:b,clientId:ye}),C({cmd:"user_input",text:b}),c||ne("")},[le,u.ready,u.busy,u.skills,C]),Me=l.useCallback(()=>C({cmd:"abort"}),[C]);l.useEffect(()=>{u.retryNonce>0&&u.retryText&&(ne(u.retryText),re.current?.focus())},[u.retryNonce]),l.useEffect(()=>{if(u.busy||!u.ready||u.queuedSends.length===0)return;const c=u.queuedSends[0];c&&(z({t:"shift_queued_send"}),Ke(c))},[u.busy,u.ready,u.queuedSends,Ke]);const xe=l.useCallback((c,b)=>{C({cmd:"confirm_response",id:c,response:b,kind:"shell"}),z({t:"resolve_confirm",id:c})},[C]),Un=l.useCallback(c=>xe(c,{type:"run_once"}),[xe]),Kn=l.useCallback(c=>xe(c,{type:"deny"}),[xe]),Wn=l.useCallback((c,b)=>xe(c,{type:"always_allow",prefix:b}),[xe]),it=l.useCallback((c,b)=>{C({cmd:"confirm_response",id:c,response:b,kind:"path"}),z({t:"resolve_path_access",id:c})},[C]),Bt=l.useCallback((c,b)=>{C({cmd:"choice_response",id:c,response:b}),z({t:"resolve_choice",id:c})},[C]),rt=l.useCallback((c,b)=>{C({cmd:"plan_response",id:c,response:b}),z({t:"resolve_plan",id:c,verdict:b})},[C]),ot=l.useCallback((c,b)=>{C({cmd:"checkpoint_response",id:c,response:b}),z({t:"resolve_checkpoint",id:c,verdict:b})},[C]),Ht=l.useCallback((c,b)=>{C({cmd:"revision_response",id:c,response:b}),z({t:"resolve_revision",id:c,verdict:b})},[C]),Ot=l.useRef(u.currentSession);Ot.current=u.currentSession;const Gn=l.useCallback(()=>{const c=Ot.current;if(!c)return null;const b=localStorage.getItem(`reasonix.scroll.${c}`),M=b?Number(b):Number.NaN;return Number.isFinite(M)?M:null},[]),{showJumpButton:Vn,scrollToBottom:Jn}=zi(fe,W,u.busy,Gn);l.useEffect(()=>{const c=fe.current,b=u.currentSession;if(!c||!b)return;const M=`reasonix.scroll.${b}`;let U;const ye=()=>{clearTimeout(U),U=setTimeout(()=>{c.scrollTop+c.clientHeight>=c.scrollHeight-80?localStorage.removeItem(M):localStorage.setItem(M,String(Math.round(c.scrollTop)))},250)};return c.addEventListener("scroll",ye,{passive:!0}),()=>{c.removeEventListener("scroll",ye),clearTimeout(U)}},[u.currentSession]),l.useEffect(()=>{if(!n||!w)return;C({cmd:"jobs_list"});const c=window.setInterval(()=>C({cmd:"jobs_list"}),1500);return()=>window.clearInterval(c)},[n,w,C]),l.useEffect(()=>{n&&(u.busy||C({cmd:"jobs_list"}))},[n,u.busy,C]),l.useEffect(()=>{n&&at()},[n,at]);const Yn=l.useRef(xa()),Ft=l.useRef(!1);l.useEffect(()=>{if(!n||Ft.current||!u.ready||u.sessions.length===0)return;Ft.current=!0;const c=Yn.current;if(c&&c!==u.currentSession){if(!u.sessions.some(b=>b.name===c)){ya();return}C({cmd:"session_load",name:c})}},[n,u.ready,u.sessions,u.currentSession,C]),l.useEffect(()=>{if(!n)return;const c=b=>{const M=b.ctrlKey||b.metaKey;if(M&&(b.key==="a"||b.key==="A")){const U=b.target?.tagName;U!=="INPUT"&&U!=="TEXTAREA"&&b.preventDefault();return}if(M&&(b.key==="l"||b.key==="L"))b.preventDefault(),re.current?.focus();else if(M&&(b.key==="n"||b.key==="N"))b.preventDefault(),Pe();else if(M&&(b.key==="o"||b.key==="O"))b.preventDefault(),te(void 0),N(U=>!U);else if(M&&b.key===",")b.preventDefault(),Y?B(!1):de("general");else if(M&&(b.key==="j"||b.key==="J"))b.preventDefault(),T(U=>!U);else if(b.key==="Escape"&&u.busy){const U=b.target;if(U?.tagName==="INPUT"||U?.tagName==="TEXTAREA")return;b.preventDefault(),Me()}};return window.addEventListener("keydown",c),()=>window.removeEventListener("keydown",c)},[n,u.busy,Me,Pe,Y,de]);const Qn=Qs({newChat:()=>{Pe(),ae(a("app.toast.newSession"))},clearChat:()=>{z({t:"clear"}),ae(a("app.toast.cleared"))},focusComposer:()=>re.current?.focus(),openSettings:()=>de("general"),about:()=>ie(!0),abort:Me,copyLast:()=>{const c=[...u.messages].reverse().find(M=>M.kind==="assistant");if(!c||c.kind!=="assistant")return;const b=c.segments.filter(M=>M.kind==="text").map(M=>M.text).join(`
43
43
 
44
- `).trim();b&&(navigator.clipboard.writeText(b),ae(a("app.toast.copied")))},conversationCopy:()=>{rt()},exportMarkdown:()=>{Ke()},pickWorkspace:Fe,newTab:r,closeTab:o,busy:u.busy,canCloseTab:d,hasMessages:u.messages.length>0}),Ht=[{cmd:"/help",desc:a("app.cmd.help"),run:()=>{ne("/"),re.current?.focus()}},{cmd:"/new",desc:a("app.cmd.newSession"),run:()=>Pe(),kb:Us(["mod","N"])},{cmd:"/clear",desc:a("app.cmd.clearChat"),run:()=>z({t:"clear"})},{cmd:"/abort",desc:a("app.cmd.abort"),run:()=>Me(),kb:"esc"},{cmd:"/copy",desc:a("app.cmd.copyLast"),run:()=>{const c=[...u.messages].reverse().find(b=>b.kind==="assistant");if(c?.kind==="assistant"){const b=c.segments.filter(M=>M.kind==="text").map(M=>M.text).join(`
44
+ `).trim();b&&(navigator.clipboard.writeText(b),ae(a("app.toast.copied")))},conversationCopy:()=>{lt()},exportMarkdown:()=>{Ge()},pickWorkspace:Ue,newTab:r,closeTab:o,busy:u.busy,canCloseTab:d,hasMessages:u.messages.length>0}),$t=[{cmd:"/help",desc:a("app.cmd.help"),run:()=>{ne("/"),re.current?.focus()}},{cmd:"/new",desc:a("app.cmd.newSession"),run:()=>Pe(),kb:Js(["mod","N"])},{cmd:"/clear",desc:a("app.cmd.clearChat"),run:()=>z({t:"clear"})},{cmd:"/abort",desc:a("app.cmd.abort"),run:()=>Me(),kb:"esc"},{cmd:"/copy",desc:a("app.cmd.copyLast"),run:()=>{const c=[...u.messages].reverse().find(b=>b.kind==="assistant");if(c?.kind==="assistant"){const b=c.segments.filter(M=>M.kind==="text").map(M=>M.text).join(`
45
45
 
46
- `);b&&(navigator.clipboard.writeText(b),ae(a("app.toast.copied")))}}},{cmd:"/model",desc:a("app.cmd.switchModel"),run:()=>de("models")},{cmd:"/theme",desc:a("app.cmd.toggleTheme"),run:v},{cmd:"/currency",desc:a("app.cmd.toggleCurrency"),run:L},{cmd:"/lang",desc:a("app.cmd.toggleLang"),run:()=>{const c=kn(),b=c[(c.indexOf(Os())+1)%c.length]??"en";vn(b);const M=wn(b);ae(a("app.toast.langSwitched",{lang:M}))}},{cmd:"/export",desc:a("app.cmd.exportMd"),run:()=>Ke()},{cmd:"/feedback",desc:a("app.cmd.feedback"),run:()=>{Be("https://github.com/esengine/DeepSeek-Reasonix/issues/new/choose").catch(()=>{})}},{cmd:"/compact",desc:a("app.cmd.compact"),run:()=>N({cmd:"compact_history"})},{cmd:"/retry",desc:a("app.cmd.retry"),run:()=>N({cmd:"retry"})},{cmd:"/btw",desc:a("app.cmd.btw"),run:()=>{ne("/btw "),re.current?.focus()}},...u.skills.map(c=>({cmd:`/${c.name}`,desc:c.description?.trim()||zi(c),insertOnly:!0,run:()=>{z({t:"start_skill",skill:{name:c.name,runAs:c.runAs},clientId:`skill-${Date.now()}-${Math.random().toString(36).slice(2,8)}`}),N({cmd:"skill_run",name:c.name})}}))],Jn=fa(u.busy),Ot=u.settings?.workspaceDir?u.settings.workspaceDir.split(/[\\/]/).pop()||"workspace":"Reasonix",Ue=(()=>{const c=u.messages.find(b=>b.kind==="user");if(c&&c.kind==="user"){const b=c.text.replace(/\s+/g," ").trim();if(b)return b.length>60?`${b.slice(0,60)}…`:b}if(u.currentSession){const b=u.sessions.find(U=>U.name===u.currentSession);if(b?.summary?.trim())return b.summary.trim();const M=u.currentSession.match(/^desktop-(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})/);if(M)return a("app.session.format",{month:M[2],day:M[3],hour:M[4],minute:M[5]})}return u.messages.length===0?a("app.session.new",{workspace:Ot}):Ot})(),Ke=l.useCallback(async()=>{const c=a("app.exportUserLabel"),b=tn(u.messages,c);if(!b){ae(a("app.toast.emptySession"));return}try{const M=Fi(Ue),U=await pn({defaultPath:M,filters:[{name:"Markdown",extensions:["md"]}],title:a("app.toast.exportDialogTitle")});if(!U)return;await ve("write_text_file",{path:U,content:b}),ae(a("app.toast.exportedMd"))}catch(M){console.error("export failed",M),ae(a("app.toast.exportFailed",{error:String(M)}))}},[u.messages,Ue,ae]),rt=l.useCallback(()=>{const c=a("app.exportUserLabel"),b=tn(u.messages,c);if(!b){ae(a("app.toast.emptySession"));return}navigator.clipboard.writeText(b),ae(a("app.toast.copiedMd"))},[u.messages,ae]);return e.jsx(ea,{value:{dir:u.settings?.workspaceDir,editor:u.settings?.editor},children:e.jsxs("div",{className:"app","data-theme":p,"data-theme-style":h,"data-side-collapsed":I,"data-ctx-collapsed":q,"data-mobile-side-open":ee,style:{display:n?void 0:"none"},children:[e.jsx("div",{className:"mobile-overlay","aria-hidden":"true",onClick:E}),e.jsx(Ui,{session:Ue,model:u.settings?.model,sideOn:!I,ctxOn:!q,onToggleSide:X,onToggleCtx:R,onOpenCommands:()=>Oe.setOpen(!0),onOpenSettings:()=>de("general"),onCopy:rt,onExport:Ke,onClear:()=>z({t:"clear"}),hasMessages:u.messages.length>0,mobileSideOpen:ee,onToggleMobileSide:E}),e.jsx(Ki,{tabs:K,activeId:F,setActive:J,onClose:c=>{K.length<=1||ve("rpc_send",{line:JSON.stringify({cmd:"tab_close",tabId:c})}).catch(b=>console.error("tab_close failed",b))},onNew:r,singleTab:K.length<=1}),e.jsx(ei,{sessions:u.sessions,activeName:u.currentSession,loadingName:V,onNewChat:()=>{Pe(),E&&ee&&E()},onLoadSession:c=>{c===u.currentSession||c===V||(oe(c),N({cmd:"session_load",name:c}),ee&&E())},onDeleteSession:c=>N({cmd:"session_delete",name:c}),onOpenSettings:()=>{de("general"),ee&&E()},onOpenRules:()=>{de("rules"),ee&&E()},onOpenCommands:()=>{Oe.setOpen(!0),ee&&E()},onOpenAbout:()=>{ie(!0),ee&&E()}}),e.jsx("main",{className:"main",style:{position:"relative"},children:u.needsSetup?e.jsx(Vi,{workspaceDir:u.settings?.workspaceDir,onPickWorkspace:Fe,onSubmit:c=>N({cmd:"setup_save_key",key:c})}):e.jsxs(e.Fragment,{children:[e.jsx(Wi,{session:Ue,model:u.settings?.model,workspaceDir:u.settings?.workspaceDir,busy:u.busy,hasMessages:u.messages.length>0,onAbort:Me,onNewChat:Pe,onCopy:rt,onExport:Ke,onOpenWorkdir:c=>{te(c),C(!0)}}),e.jsxs("div",{className:"thread",ref:fe,style:{position:"relative"},children:[V?e.jsxs("div",{className:"thread-loading-overlay",children:[a("sidebarPanel.loading")," ",V]}):null,e.jsxs("div",{className:"thread-inner",ref:W,children:[u.activePlan?e.jsxs(e.Fragment,{children:[e.jsx(yi,{plan:u.activePlan,onDismiss:u.busy?void 0:()=>z({t:"dismiss_plan"})}),e.jsx(Ti,{plan:u.activePlan})]}):null,u.messages.length===0?e.jsx(Gi,{onPick:c=>{const b=c.trim();if(b.startsWith("/")){const M=b.split(/\s+/)[0]??"",U=Ht.find(ye=>ye.cmd===M);if(U){U.run();return}}$e(c)},workspaceDir:u.settings?.workspaceDir}):null,u.messages.map((c,b)=>{if(c.kind==="user"){const M=`turn ${c.turn}`,U=u.messages[b-1],ye=!U||U.kind==="user";return e.jsxs("div",{children:[ye?e.jsx(fi,{label:M}):null,e.jsx(bi,{text:c.text,skill:c.skill})]},`u-${b}`)}return c.kind==="assistant"?e.jsx(xi,{segments:c.segments,pending:c.pending,model:u.model,onApproveConfirm:On,onRejectConfirm:Fn,onAlwaysAllowConfirm:$n,pendingConfirms:u.pendingConfirms},`a-${b}`):c.kind==="error"?e.jsxs("div",{className:"warn-card",style:{borderColor:"var(--tone-err)",background:"var(--danger-soft)"},children:[e.jsx("span",{className:"ico",style:{color:"var(--tone-err)"},children:e.jsx(x.warning,{size:16})}),e.jsxs("div",{children:[e.jsx("div",{className:"tt",children:a("app.errorLabel")}),e.jsx("div",{className:"ds",children:c.message})]})]},`e-${b}`):c.kind==="warning"?u.settings?.showSystemEvents===!1?null:e.jsxs("div",{className:"sys-event-row",title:c.text,children:[e.jsx("span",{className:"line"}),e.jsx("span",{className:"label",children:c.text}),e.jsx("span",{className:"line"})]},c.id):null}),u.pendingPlans.map(c=>e.jsx(ki,{p:c,onApprove:()=>at(c.id,{type:"approve"}),onRefine:()=>at(c.id,{type:"refine"}),onCancel:()=>at(c.id,{type:"cancel"})},`pp-${c.id}`)),u.pendingCheckpoints.map(c=>e.jsx(wi,{c,onContinue:()=>it(c.id,{type:"continue"}),onRevise:()=>it(c.id,{type:"revise"}),onStop:()=>it(c.id,{type:"stop"})},`cp-${c.id}`)),u.pendingRevisions.map(c=>e.jsx(vi,{r:c,onAccept:()=>_t(c.id,{type:"accepted"}),onReject:()=>_t(c.id,{type:"rejected"})},`rv-${c.id}`)),u.pendingConfirms.map(c=>e.jsx(ji,{c,onAllow:()=>xe(c.id,{type:"run_once"}),onAlwaysAllow:b=>xe(c.id,{type:"always_allow",prefix:b}),onDeny:()=>xe(c.id,{type:"deny"})},`cc-${c.id}`)),u.pendingPathAccess.map(c=>e.jsx(Si,{p:c,onAllow:()=>st(c.id,{type:"run_once"}),onAlwaysAllow:b=>st(c.id,{type:"always_allow",prefix:b}),onDeny:()=>st(c.id,{type:"deny"})},`pa-${c.id}`)),u.pendingChoices.map(c=>e.jsx(Ni,{c,onPick:b=>zt(c.id,{type:"pick",optionId:b}),onCancel:()=>zt(c.id,{type:"cancel"})},`ch-${c.id}`)),u.ready?null:e.jsx("div",{style:{padding:12,color:"var(--muted)",fontFamily:"Geist Mono, monospace",fontSize:11},children:a("app.connecting")})]}),Kn?e.jsx("button",{className:"thread-jump-bottom",onClick:()=>Wn(!0),title:a("app.jumpToBottom")??"Jump to bottom","aria-label":a("app.jumpToBottom")??"Jump to bottom",children:e.jsx(x.chev,{size:16})}):null]}),e.jsx(wa,{draft:le,setDraft:ne,onSend:()=>$e(),onAbort:Me,disabled:!u.ready,busy:u.busy,busyLabel:u.busy?u.activeSkill?`Skill · ${u.activeSkill.name}`:"Reasoning":void 0,busyElapsedMs:Jn,textareaRef:re,modelLabel:u.settings?.model??"deepseek-v4-flash",reasoningEffort:u.settings?.reasoningEffort??"high",onModelChange:c=>{Se({model:c}),ae(a("app.toast.modelSwitched",{model:c}))},onEffortChange:c=>{Se({reasoningEffort:c}),ae(a("app.toast.effortSwitched",{effort:c}))},editMode:u.settings?.editMode??"review",onEditModeChange:c=>{Se({editMode:c}),c==="yolo"?ae(a("app.yolo.toast"),{yolo:!0,duration:3e3}):ae(a("app.toast.modeSwitched",{mode:c.toUpperCase()}))},workspaceDir:u.settings?.workspaceDir,slashCommands:Ht,onMentionQuery:Rn,onMentionPreview:Ln,onMentionPicked:tt,mentionResults:u.mentionResults,queuedSends:u.queuedSends,onQueueWhileBusy:c=>{z({t:"enqueue_send",text:c}),ne("")},onDequeueSend:c=>z({t:"dequeue_send",index:c})})]})}),e.jsx(Ca,{settings:u.settings,usage:u.usage,mcpSpecs:u.mcpSpecs,mcpBridged:u.mcpBridged,sessionFiles:u.sessionFiles,memory:u.memory,memoryDetail:u.memoryDetail,onReadMemory:c=>N({cmd:"memory_read",path:c})}),e.jsx(oi,{settings:u.settings,balance:u.balance,usage:u.usage,busy:u.busy,ready:u.ready,currency:s,theme:p,themeStyle:h,jobs:u.jobs,jobsOpen:w,onToggleJobs:()=>T(c=>!c),onSetThemeStyle:k,onToggleCurrency:L,onOpenSettings:()=>de("general"),onOpenWorkdir:c=>{te(c),C(!0)}}),e.jsx(Vs,{open:Oe.open,onClose:()=>Oe.setOpen(!1),commands:Vn}),e.jsx(Ai,{open:S,onClose:()=>C(!1),recent:u.settings?.recentWorkspaces??[],current:u.settings?.workspaceDir,anchor:H,onPick:c=>Se({workspaceDir:c}),onBrowse:Fe}),e.jsx(Mi,{open:Ae,initialPath:u.settings?.workspaceDir,onCancel:()=>Ie(!1),onConfirm:c=>{Se({workspaceDir:c}),Ie(!1)}}),O?e.jsx(La,{onClose:()=>ie(!1)}):null,Y&&u.settings?e.jsx(Ha,{settings:u.settings,balance:u.balance,usage:u.usage,currency:s,theme:p,themeStyle:h,onSetTheme:g,onSetThemeStyle:k,fontScale:f,onSetFontScale:m,fontFamily:y,onSetFontFamily:j,initialPage:Q,mcpSpecs:u.mcpSpecs,mcpBridged:u.mcpBridged,skills:u.skills,memory:u.memory,memoryDetail:u.memoryDetail,qq:u.qq,onClose:()=>B(!1),onSave:Se,onSaveApiKey:qn,onLoadQQ:nt,onConnectQQ:In,onDisconnectQQ:zn,onSaveQQConfig:_n,onOpenQQApplyLink:()=>Be("https://q.qq.com/qqbot/openclaw/login.html").catch(()=>{}),onPickWorkspace:Fe,onAddMcpSpec:Bn,onRemoveMcpSpec:Hn,onReadMemory:c=>N({cmd:"memory_read",path:c})}):null,e.jsx(Da,{open:w,onClose:()=>T(!1),jobs:u.jobs,onStop:c=>N({cmd:"jobs_stop",jobId:c}),onStopAll:()=>N({cmd:"jobs_stop_all"})}),e.jsx(Js,{message:he}),ce?e.jsx(si,{onDone:()=>ge(!1)}):null]})})}function nn(){return e.jsx("svg",{width:"10",height:"1",viewBox:"0 0 10 1","aria-hidden":!0,children:e.jsx("rect",{width:"10",height:"1",fill:"currentColor"})})}function sn(){return e.jsx("svg",{width:"10",height:"10",viewBox:"0 0 10 10","aria-hidden":!0,children:e.jsx("rect",{x:"0.5",y:"0.5",width:"9",height:"9",fill:"none",stroke:"currentColor",strokeWidth:"1"})})}function an(){return e.jsxs("svg",{width:"10",height:"10",viewBox:"0 0 10 10","aria-hidden":!0,children:[e.jsx("rect",{x:"2.5",y:"0.5",width:"7",height:"7",fill:"none",stroke:"currentColor",strokeWidth:"1"}),e.jsx("rect",{x:"0.5",y:"2.5",width:"7",height:"7",fill:"var(--bg-2, #eee)",stroke:"currentColor",strokeWidth:"1"})]})}function rn(){return e.jsxs("svg",{width:"10",height:"10",viewBox:"0 0 10 10","aria-hidden":!0,children:[e.jsx("line",{x1:"0.5",y1:"0.5",x2:"9.5",y2:"9.5",stroke:"currentColor",strokeWidth:"1.2",strokeLinecap:"round"}),e.jsx("line",{x1:"9.5",y1:"0.5",x2:"0.5",y2:"9.5",stroke:"currentColor",strokeWidth:"1.2",strokeLinecap:"round"})]})}function Ui({session:t,model:n,sideOn:s,ctxOn:i,onToggleSide:r,onToggleCtx:o,onOpenCommands:d,onOpenSettings:p,onCopy:h,onExport:g,onClear:k,hasMessages:v,mobileSideOpen:f,onToggleMobileSide:m}){$();const[y,j]=l.useState(!1),[I,q]=l.useState(!1),X=l.useRef(null),R=document.documentElement.dataset.platform==="macos",L=document.documentElement.dataset.web==="true";l.useEffect(()=>{const F=yt();F.isMaximized().then(q);let J;return F.listen("tauri://resize",async()=>{q(await F.isMaximized())}).then(ee=>{J=ee}),()=>J?.()},[]),l.useEffect(()=>{if(!y)return;const F=J=>{X.current&&!X.current.contains(J.target)&&j(!1)};return window.addEventListener("mousedown",F),()=>window.removeEventListener("mousedown",F)},[y]);const K=yt();return e.jsxs("header",{className:"titlebar",children:[e.jsxs("div",{className:"tb-left",children:[R&&!L?e.jsxs("div",{className:"mac-controls","aria-label":a("app.titlebar.windowControls"),children:[e.jsx("button",{type:"button",className:"mac-ctrl close",title:a("app.titlebar.close"),"aria-label":a("app.titlebar.close"),onMouseDown:F=>{F.stopPropagation(),K.close()},children:e.jsx(rn,{})}),e.jsx("button",{type:"button",className:"mac-ctrl minimize",title:a("app.titlebar.minimize"),"aria-label":a("app.titlebar.minimize"),onMouseDown:F=>{F.stopPropagation(),K.minimize()},children:e.jsx(nn,{})}),e.jsx("button",{type:"button",className:"mac-ctrl zoom",title:a(I?"app.titlebar.restore":"app.titlebar.maximize"),"aria-label":a(I?"app.titlebar.restore":"app.titlebar.maximize"),onMouseDown:F=>{F.stopPropagation(),K.toggleMaximize()},children:I?e.jsx(an,{}):e.jsx(sn,{})})]}):null,e.jsx("button",{type:"button",className:"tb-mobile-menu","aria-label":"打开会话列表","aria-expanded":f,onClick:m,children:f?e.jsx(x.x,{size:18}):e.jsx(x.panel_l,{size:18})}),e.jsx("button",{type:"button",className:"iconbtn tb-desktop-side-btn","data-on":s,title:jn(a("app.titlebar.sidebar")),onClick:r,children:e.jsx(x.panel_l,{size:14})}),e.jsxs("div",{className:"tb-meta","data-tauri-drag-region":!0,children:[e.jsxs("div",{className:"brand","data-tauri-drag-region":!0,children:[e.jsx("span",{className:"mark"}),e.jsx("span",{className:"brand-name",children:"Reasonix"})]}),t&&e.jsxs("div",{className:"crumbs","data-tauri-drag-region":!0,children:[e.jsx("span",{className:"sep",children:"/"}),e.jsx("span",{className:"cur",children:n??"—"})]})]})]}),e.jsx("span",{className:"grow","data-tauri-drag-region":!0}),e.jsxs("div",{className:"tb-right",children:[e.jsx("button",{type:"button",className:"iconbtn","data-on":i,title:a("app.titlebar.contextPanel"),onClick:o,children:e.jsx(x.panel_r,{size:14})}),e.jsxs("div",{ref:X,style:{position:"relative"},children:[e.jsx("button",{type:"button",className:"iconbtn",title:a("app.titlebar.more"),onClick:()=>j(F=>!F),children:e.jsx(x.more,{size:14})}),y?e.jsx("div",{className:"popup",style:{top:"calc(100% + 6px)",right:0,left:"auto",bottom:"auto",width:220},children:e.jsxs("div",{className:"popup-list",children:[e.jsxs("div",{className:"popup-item",onClick:()=>{d(),j(!1)},children:[e.jsx("span",{className:"ico",children:e.jsx(x.search,{size:12})}),e.jsx("div",{className:"nm",children:e.jsx("span",{children:a("app.titlebar.commandPalette")})}),e.jsx("span",{className:"kb",children:e.jsx(G,{keys:["mod","K"]})})]}),e.jsxs("div",{className:"popup-item",onClick:()=>{v&&h(),j(!1)},style:{opacity:v?1:.5},children:[e.jsx("span",{className:"ico",children:e.jsx(x.copy,{size:12})}),e.jsx("div",{className:"nm",children:e.jsx("span",{children:a("app.titlebar.copyMd")})})]}),e.jsxs("div",{className:"popup-item",onClick:()=>{v&&g(),j(!1)},style:{opacity:v?1:.5},children:[e.jsx("span",{className:"ico",children:e.jsx(x.download,{size:12})}),e.jsx("div",{className:"nm",children:e.jsx("span",{children:a("app.titlebar.exportMd")})})]}),e.jsxs("div",{className:"popup-item",onClick:()=>{k(),j(!1)},children:[e.jsx("span",{className:"ico",children:e.jsx(x.x,{size:12})}),e.jsx("div",{className:"nm",children:e.jsx("span",{children:a("app.titlebar.clearChat")})})]}),e.jsxs("div",{className:"popup-item",onClick:()=>{p(),j(!1)},children:[e.jsx("span",{className:"ico",children:e.jsx(x.cog,{size:12})}),e.jsx("div",{className:"nm",children:e.jsx("span",{children:a("app.titlebar.settings")})}),e.jsx("span",{className:"kb",children:e.jsx(G,{keys:["mod",","]})})]})]})}):null]}),!R&&!L?e.jsxs("div",{className:"win-controls",children:[e.jsx("button",{type:"button",className:"win-ctrl",title:a("app.titlebar.minimize"),onMouseDown:F=>{F.stopPropagation(),K.minimize()},children:e.jsx(nn,{})}),e.jsx("button",{type:"button",className:"win-ctrl",title:a(I?"app.titlebar.restore":"app.titlebar.maximize"),onMouseDown:F=>{F.stopPropagation(),K.toggleMaximize()},children:I?e.jsx(an,{}):e.jsx(sn,{})}),e.jsx("button",{type:"button",className:"win-ctrl close",title:a("app.titlebar.close"),onMouseDown:F=>{F.stopPropagation(),K.close()},children:e.jsx(rn,{})})]}):null]})]})}function Ki({tabs:t,activeId:n,setActive:s,onClose:i,onNew:r,singleTab:o}){return $(),e.jsx("div",{className:"tabbar",children:t.map(d=>{const p=d.workspaceDir??"",h=p.replace(/[\\/]$/,"").split(/[\\/]/).pop()||"workspace";return e.jsxs("div",{className:"tab","data-active":d.id===n,onClick:()=>s(d.id),title:p||h,children:[e.jsx("span",{className:"dot","data-state":"running"}),e.jsx("span",{className:"label",children:h}),o?null:e.jsx("span",{className:"close",onClick:g=>{g.stopPropagation(),i(d.id)},children:e.jsx(x.x,{size:11})})]},d.id)})})}function Wi({session:t,model:n,workspaceDir:s,busy:i,hasMessages:r,onAbort:o,onNewChat:d,onCopy:p,onExport:h,onOpenWorkdir:g}){$();const k=s?s.split(/[\\/]/).pop()||"workspace":a("app.header.noWorkspace");return e.jsxs("div",{className:"main-head",children:[e.jsxs("div",{className:"title-wrap",children:[e.jsxs("h1",{children:[e.jsx("span",{className:"editable",children:t}),i?e.jsxs("span",{className:"pill",style:{color:"var(--accent)"},children:[e.jsx("span",{className:"dot"}),e.jsx("span",{className:"shimmer",children:a("app.header.running")})]}):null]}),e.jsxs("div",{className:"sub",children:[e.jsxs("span",{className:"ws-crumb",onClick:v=>{const f=v.currentTarget.getBoundingClientRect();g({top:f.bottom+6,left:f.left})},style:{cursor:"pointer"},title:s??a("app.header.clickToSelect"),children:[e.jsx(x.folder,{size:10})," ",k]}),n?e.jsxs("span",{className:"pill",children:[e.jsx(x.brain,{size:10})," ",n]}):null]})]}),e.jsx("span",{className:"grow"}),e.jsxs("button",{type:"button",className:"h-btn",onClick:p,disabled:!r,title:a("app.header.copyMd"),children:[e.jsx(x.copy,{size:12})," ",a("app.header.copy")]}),e.jsxs("button",{type:"button",className:"h-btn",onClick:h,disabled:!r,title:a("app.header.exportMd"),children:[e.jsx(x.download,{size:12})," ",a("app.header.export")]}),e.jsxs("button",{type:"button",className:"h-btn",onClick:d,children:[e.jsx(x.plus,{size:12})," ",a("app.header.newChat")]}),i?e.jsxs("button",{type:"button",className:"h-btn primary",onClick:o,children:[e.jsx(x.stop,{size:12})," ",a("app.header.abort")]}):null]})}function Gi({onPick:t,workspaceDir:n}){$();const s=[a("app.empty.suggestion0"),a("app.empty.suggestion1"),a("app.empty.suggestion2"),a("app.empty.suggestion3"),"/help"],i=n?n.split(/[\\/]/).pop():null;return e.jsxs("div",{style:{padding:"48px 16px 24px",textAlign:"center",color:"var(--muted)",fontFamily:"var(--font-sans, 'Geist', sans-serif)"},children:[e.jsx("div",{style:{width:56,height:56,borderRadius:12,margin:"0 auto 14px",background:"linear-gradient(135deg, var(--accent), var(--violet))",position:"relative"},children:e.jsx("span",{style:{position:"absolute",inset:8,borderRadius:6,background:"var(--bg)"}})}),e.jsx("div",{style:{fontSize:18,fontWeight:600,color:"var(--fg)",marginBottom:4},children:a("app.empty.welcome")}),e.jsx("div",{style:{fontSize:12,marginBottom:18},children:i?e.jsxs(e.Fragment,{children:[a("app.empty.currentWorkspace"),e.jsx("code",{style:{fontFamily:"Geist Mono, monospace"},children:i})]}):a("app.empty.selectWorkspace")}),e.jsx("div",{style:{display:"flex",flexWrap:"wrap",gap:8,justifyContent:"center",maxWidth:540,margin:"0 auto"},children:s.map(r=>e.jsx("button",{type:"button",className:"btn",style:{fontSize:11.5},onClick:()=>t(r),children:r},r))})]})}function Vi({workspaceDir:t,onPickWorkspace:n,onSubmit:s}){$();const[i,r]=l.useState("");return e.jsxs("div",{style:{flex:1,display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",padding:24,gap:18},children:[e.jsx("div",{style:{fontSize:18,fontWeight:600},children:a("app.setup.welcome")}),e.jsx("div",{style:{fontSize:12.5,color:"var(--muted)",maxWidth:400,textAlign:"center"},children:a("app.setup.description")}),e.jsxs("div",{style:{width:"min(420px, 100%)",display:"flex",flexDirection:"column",gap:10},children:[e.jsxs("div",{className:"setting-row",style:{borderBottom:"none"},children:[e.jsxs("div",{className:"l",children:[e.jsx("div",{className:"n",children:a("app.setup.workspace")}),e.jsx("div",{className:"h",children:t||a("app.setup.notSelected")})]}),e.jsx("button",{type:"button",className:"btn",onClick:n,children:a("app.setup.choose")})]}),e.jsx("input",{className:"field mono",type:"password",value:i,onChange:o=>r(o.target.value),placeholder:"sk-…",style:{width:"100%"}}),e.jsx("button",{type:"button",className:"btn primary",disabled:!i.trim(),onClick:()=>s(i.trim()),children:a("app.setup.saveAndStart")})]})]})}function Ji(){const[t,n]=l.useState([]),[s,i]=l.useState(""),r=l.useRef(new Map),o=l.useRef(new Map),d=l.useRef(new Map),p=l.useRef(!1),h=l.useRef([]);l.useEffect(()=>{h.current=t},[t]);const[g,k]=l.useState(()=>localStorage.getItem("reasonix.currency")==="USD"?"USD":"CNY"),[v,f]=l.useState(()=>{const S=localStorage.getItem("reasonix.theme"),C=localStorage.getItem("reasonix.themeStyle");return vt(C)?He(C):wt(S)?S:se.DARK}),[m,y]=l.useState(()=>{const S=localStorage.getItem("reasonix.themeStyle");if(vt(S))return S;const C=localStorage.getItem("reasonix.theme");return jt(wt(C)?C:se.DARK)}),[j,I]=l.useState(()=>{const S=localStorage.getItem("reasonix.fontScale");return ca(S)?S:ue.MEDIUM}),[q,X]=l.useState(()=>{const S=localStorage.getItem("reasonix.fontFamily");return ua(S)?S:pe.SANS}),[R,L]=l.useState(()=>localStorage.getItem("reasonix.sideCollapsed")==="1"),[K,F]=l.useState(()=>localStorage.getItem("reasonix.ctxCollapsed")==="1");l.useEffect(()=>{document.documentElement.dataset.theme=v,document.documentElement.dataset.themeStyle=m,localStorage.setItem("reasonix.theme",v),localStorage.setItem("reasonix.themeStyle",m)},[v,m]),l.useEffect(()=>{localStorage.setItem("reasonix.sideCollapsed",R?"1":"0")},[R]),l.useEffect(()=>{localStorage.setItem("reasonix.ctxCollapsed",K?"1":"0")},[K]),l.useEffect(()=>{document.documentElement.style.setProperty("zoom",String(da[j])),localStorage.setItem("reasonix.fontScale",j)},[j]),l.useEffect(()=>{document.documentElement.style.setProperty("--font-sans",pa[q]),localStorage.setItem("reasonix.fontFamily",q)},[q]),l.useEffect(()=>{const S=C=>{const H=C.detail;(H==="CNY"||H==="USD")&&k(H)};return window.addEventListener("reasonix:currency",S),()=>window.removeEventListener("reasonix:currency",S)},[]);const J=l.useCallback((S,C)=>{const H=r.current.get(S);if(H)H(C);else{const te=o.current.get(S)??[];te.push(C),o.current.set(S,te)}},[]),ee=l.useCallback((S,C)=>{if(C){r.current.set(S,C);const H=o.current.get(S);if(H&&H.length>0){for(const te of H)C(te);o.current.delete(S)}}else r.current.delete(S)},[]);l.useEffect(()=>{let S=!1;const C=[],H=()=>{p.current=!1;for(const[W,Y]of d.current)Y.length!==0&&(J(W,{t:"batch_delta",items:Y}),d.current.set(W,[]))},te=()=>{p.current||S||(p.current=!0,requestAnimationFrame(H))},re=W=>{const Y=d.current.get(W);Y&&Y.length>0&&(J(W,{t:"batch_delta",items:Y}),d.current.set(W,[]))};return(async()=>{const W=await Promise.all([Ye("rpc:event",Y=>{try{const B=JSON.parse(Y.payload.data),Q=B.tabId;if(B.type==="$tab_opened"&&Q){n(w=>w.some(T=>T.id===Q)?w:[...w,{id:Q,workspaceDir:B.workspaceDir}]),i(w=>B.active||!w?Q:w);return}if(B.type==="$tab_closed"&&Q){n(w=>w.filter(T=>T.id!==Q)),i(w=>w!==Q?w:h.current.filter(O=>O.id!==Q)[0]?.id??""),r.current.delete(Q),o.current.delete(Q),d.current.delete(Q);return}if(B.type==="model.delta"&&Q&&(B.channel==="content"||B.channel==="reasoning")){const w=d.current.get(Q)??[];w.push({turn:B.turn,channel:B.channel,text:B.text}),d.current.set(Q,w),te();return}if(B.type==="$settings"&&Q&&n(w=>w.map(T=>T.id===Q?{...T,workspaceDir:B.workspaceDir}:T)),B.type==="$jobs"){for(const w of r.current.keys())J(w,{t:"incoming",event:B});return}const be=Q;if(be){if(re(be),B.type==="$mention_results"){J(be,{t:"mention_results",results:{nonce:B.nonce,query:B.query,results:B.results}});return}if(B.type==="$mention_preview"){J(be,{t:"mention_preview",preview:{nonce:B.nonce,path:B.path,head:B.head,totalLines:B.totalLines}});return}J(be,{t:"incoming",event:B})}}catch{console.error("bad rpc:event line",Y.payload.data)}}),Ye("rpc:stderr",Y=>{console.warn("[reasonix stderr]",Y.payload.data)}),Ye("rpc:exit",Y=>{for(const B of r.current.keys())re(B);for(const B of r.current.values())B({t:"rpc_exit",code:Y.payload.code})})]);if(S){for(const Y of W)Y();return}C.push(...W);try{await ve("rpc_spawn")}catch(Y){S||console.error("rpc_spawn failed",Y)}})(),()=>{S=!0;for(const W of C)W()}},[J]),l.useEffect(()=>{s&&ve("rpc_send",{line:JSON.stringify({cmd:"tab_activate",tabId:s})}).catch(()=>{})},[s]);const E=l.useCallback(()=>{ve("rpc_send",{line:JSON.stringify({cmd:"tab_open"})}).catch(S=>console.error("tab_open failed",S))},[]),u=l.useCallback(S=>{t.length<=1||ve("rpc_send",{line:JSON.stringify({cmd:"tab_close",tabId:S})}).catch(C=>console.error("tab_close failed",C))},[t.length]);l.useEffect(()=>{const S=C=>{const H=C.ctrlKey||C.metaKey;if(H&&(C.key==="t"||C.key==="T"))C.preventDefault(),E();else if(H&&(C.key==="w"||C.key==="W")&&s&&t.length>1)C.preventDefault(),u(s);else if(H&&C.key==="Tab"){if(t.length<=1)return;C.preventDefault();const te=t.findIndex(W=>W.id===s),re=C.shiftKey?(te-1+t.length)%t.length:(te+1)%t.length,fe=t[re];fe&&i(fe.id)}else H&&(C.key==="b"||C.key==="B")&&(C.altKey?(C.preventDefault(),F(te=>!te)):(C.preventDefault(),L(te=>!te)))};return window.addEventListener("keydown",S),()=>window.removeEventListener("keydown",S)},[E,u,s,t]);const z=l.useCallback(S=>{f(S),y(jt(S))},[]),le=l.useCallback(S=>{y(S),f(He(S))},[]),ne=l.useCallback(()=>{z(v===se.DARK?se.LIGHT:se.DARK)},[z,v]),[he,Z]=l.useState(!1),ce=l.useCallback(()=>Z(S=>!S),[]),ge=l.useCallback(()=>{k(S=>{const C=S==="CNY"?"USD":"CNY";return localStorage.setItem("reasonix.currency",C),window.dispatchEvent(new CustomEvent("reasonix:currency",{detail:C})),C})},[]);return e.jsx(e.Fragment,{children:t.map(S=>e.jsx($i,{tabId:S.id,active:S.id===s,currency:g,registerDispatch:ee,onNewTab:E,onCloseTab:()=>u(S.id),canCloseTab:t.length>1,theme:v,themeStyle:m,onSetTheme:z,onSetThemeStyle:le,onToggleTheme:ne,fontScale:j,onSetFontScale:I,fontFamily:q,onSetFontFamily:X,sideCollapsed:R,ctxCollapsed:K,onToggleSide:()=>L(C=>!C),onToggleCtx:()=>F(C=>!C),onToggleCurrency:ge,mobileSideOpen:he,onToggleMobileSide:ce,tabsList:t,activeTabId:s,setActiveTabId:i},S.id))})}const ht=localStorage.getItem("reasonix.theme"),gt=localStorage.getItem("reasonix.themeStyle");vt(gt)?(document.documentElement.dataset.themeStyle=gt,document.documentElement.dataset.theme=He(gt)):wt(ht)&&(document.documentElement.dataset.theme=ht,document.documentElement.dataset.themeStyle=jt(ht));const En=/Mac|macOS/i.test(navigator.userAgent)?"macos":/Windows/i.test(navigator.userAgent)?"windows":"default";document.documentElement.dataset.platform=En;document.body.dataset.platform=En;const Dn=document.getElementById("root");if(!Dn)throw new Error("#root missing");Yn.createRoot(Dn).render(e.jsx(Ji,{}));
46
+ `);b&&(navigator.clipboard.writeText(b),ae(a("app.toast.copied")))}}},{cmd:"/model",desc:a("app.cmd.switchModel"),run:()=>de("models")},{cmd:"/theme",desc:a("app.cmd.toggleTheme"),run:v},{cmd:"/currency",desc:a("app.cmd.toggleCurrency"),run:D},{cmd:"/lang",desc:a("app.cmd.toggleLang"),run:()=>{const c=Sn(),b=c[(c.indexOf(Ws())+1)%c.length]??"en";Cn(b);const M=jn(b);ae(a("app.toast.langSwitched",{lang:M}))}},{cmd:"/export",desc:a("app.cmd.exportMd"),run:()=>Ge()},{cmd:"/feedback",desc:a("app.cmd.feedback"),run:()=>{Oe("https://github.com/esengine/DeepSeek-Reasonix/issues/new/choose").catch(()=>{})}},{cmd:"/compact",desc:a("app.cmd.compact"),run:()=>C({cmd:"compact_history"})},{cmd:"/retry",desc:a("app.cmd.retry"),run:()=>C({cmd:"retry"})},{cmd:"/btw",desc:a("app.cmd.btw"),run:()=>{ne("/btw "),re.current?.focus()}},...u.skills.map(c=>({cmd:`/${c.name}`,desc:c.description?.trim()||Oi(c),insertOnly:!0,run:()=>{z({t:"start_skill",skill:{name:c.name,runAs:c.runAs},clientId:`skill-${Date.now()}-${Math.random().toString(36).slice(2,8)}`}),C({cmd:"skill_run",name:c.name})}}))],Zn=wa(u.busy),Ut=u.settings?.workspaceDir?u.settings.workspaceDir.split(/[\\/]/).pop()||"workspace":"Reasonix",We=(()=>{const c=u.messages.find(b=>b.kind==="user");if(c&&c.kind==="user"){const b=c.text.replace(/\s+/g," ").trim();if(b)return b.length>60?`${b.slice(0,60)}…`:b}if(u.currentSession){const b=u.sessions.find(U=>U.name===u.currentSession);if(b?.summary?.trim())return b.summary.trim();const M=u.currentSession.match(/^desktop-(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})/);if(M)return a("app.session.format",{month:M[2],day:M[3],hour:M[4],minute:M[5]})}return u.messages.length===0?a("app.session.new",{workspace:Ut}):Ut})(),Ge=l.useCallback(async()=>{const c=a("app.exportUserLabel"),b=an(u.messages,c);if(!b){ae(a("app.toast.emptySession"));return}try{const M=Gi(We),U=await gn({defaultPath:M,filters:[{name:"Markdown",extensions:["md"]}],title:a("app.toast.exportDialogTitle")});if(!U)return;await ve("write_text_file",{path:U,content:b}),ae(a("app.toast.exportedMd"))}catch(M){console.error("export failed",M),ae(a("app.toast.exportFailed",{error:String(M)}))}},[u.messages,We,ae]),lt=l.useCallback(()=>{const c=a("app.exportUserLabel"),b=an(u.messages,c);if(!b){ae(a("app.toast.emptySession"));return}navigator.clipboard.writeText(b),ae(a("app.toast.copiedMd"))},[u.messages,ae]);return e.jsx(ia,{value:{dir:u.settings?.workspaceDir,editor:u.settings?.editor},children:e.jsxs("div",{className:"app","data-theme":p,"data-theme-style":h,"data-side-collapsed":I,"data-ctx-collapsed":q,"data-mobile-side-open":ee,style:{display:n?void 0:"none"},children:[e.jsx("div",{className:"mobile-overlay","aria-hidden":"true",onClick:E}),e.jsx(Ji,{session:We,model:u.settings?.model,sideOn:!I,ctxOn:!q,onToggleSide:X,onToggleCtx:R,onOpenCommands:()=>$e.setOpen(!0),onOpenSettings:()=>de("general"),onCopy:lt,onExport:Ge,onClear:()=>z({t:"clear"}),hasMessages:u.messages.length>0,mobileSideOpen:ee,onToggleMobileSide:E}),e.jsx(Yi,{tabs:K,activeId:F,setActive:J,onClose:c=>{K.length<=1||ve("rpc_send",{line:JSON.stringify({cmd:"tab_close",tabId:c})}).catch(b=>console.error("tab_close failed",b))},onNew:r,singleTab:K.length<=1}),e.jsx(ii,{sessions:u.sessions,activeName:u.currentSession,loadingName:V,onNewChat:()=>{Pe(),E&&ee&&E()},onLoadSession:c=>{c===u.currentSession||c===V||(oe(c),C({cmd:"session_load",name:c}),ee&&E())},onDeleteSession:c=>C({cmd:"session_delete",name:c}),onOpenSettings:()=>{de("general"),ee&&E()},onOpenRules:()=>{de("rules"),ee&&E()},onOpenCommands:()=>{$e.setOpen(!0),ee&&E()},onOpenAbout:()=>{ie(!0),ee&&E()}}),e.jsx("main",{className:"main",style:{position:"relative"},children:u.needsSetup?e.jsx(Xi,{workspaceDir:u.settings?.workspaceDir,onPickWorkspace:Ue,onSubmit:c=>C({cmd:"setup_save_key",key:c})}):e.jsxs(e.Fragment,{children:[e.jsx(Qi,{session:We,model:u.settings?.model,workspaceDir:u.settings?.workspaceDir,busy:u.busy,hasMessages:u.messages.length>0,onAbort:Me,onNewChat:Pe,onCopy:lt,onExport:Ge,onOpenWorkdir:c=>{te(c),N(!0)}}),e.jsxs("div",{className:"thread",ref:fe,style:{position:"relative"},children:[V?e.jsxs("div",{className:"thread-loading-overlay",children:[a("sidebarPanel.loading")," ",V]}):null,e.jsxs("div",{className:"thread-inner",ref:W,children:[u.activePlan?e.jsxs(e.Fragment,{children:[e.jsx(ji,{plan:u.activePlan,onDismiss:u.busy?void 0:()=>z({t:"dismiss_plan"})}),e.jsx(Ri,{plan:u.activePlan})]}):null,u.messages.length===0?e.jsx(Zi,{onPick:c=>{const b=c.trim();if(b.startsWith("/")){const M=b.split(/\s+/)[0]??"",U=$t.find(ye=>ye.cmd===M);if(U){U.run();return}}Ke(c)},workspaceDir:u.settings?.workspaceDir}):null,u.messages.map((c,b)=>{if(c.kind==="user"){const M=`turn ${c.turn}`,U=u.messages[b-1],ye=!U||U.kind==="user";return e.jsxs("div",{children:[ye?e.jsx(wi,{label:M}):null,e.jsx(vi,{text:c.text,skill:c.skill})]},`u-${b}`)}return c.kind==="assistant"?e.jsx(Si,{segments:c.segments,pending:c.pending,model:u.model,onApproveConfirm:Un,onRejectConfirm:Kn,onAlwaysAllowConfirm:Wn,pendingConfirms:u.pendingConfirms},`a-${b}`):c.kind==="error"?e.jsxs("div",{className:"warn-card",style:{borderColor:"var(--tone-err)",background:"var(--danger-soft)"},children:[e.jsx("span",{className:"ico",style:{color:"var(--tone-err)"},children:e.jsx(x.warning,{size:16})}),e.jsxs("div",{children:[e.jsx("div",{className:"tt",children:a("app.errorLabel")}),e.jsx("div",{className:"ds",children:c.message})]})]},`e-${b}`):c.kind==="warning"?u.settings?.showSystemEvents===!1?null:e.jsxs("div",{className:"sys-event-row",title:c.text,children:[e.jsx("span",{className:"line"}),e.jsx("span",{className:"label",children:c.text}),e.jsx("span",{className:"line"})]},c.id):null}),u.pendingPlans.map(c=>e.jsx(Ci,{p:c,onApprove:()=>rt(c.id,{type:"approve"}),onRefine:()=>rt(c.id,{type:"refine"}),onCancel:()=>rt(c.id,{type:"cancel"})},`pp-${c.id}`)),u.pendingCheckpoints.map(c=>e.jsx(Ni,{c,onContinue:()=>ot(c.id,{type:"continue"}),onRevise:()=>ot(c.id,{type:"revise"}),onStop:()=>ot(c.id,{type:"stop"})},`cp-${c.id}`)),u.pendingRevisions.map(c=>e.jsx(Ti,{r:c,onAccept:()=>Ht(c.id,{type:"accepted"}),onReject:()=>Ht(c.id,{type:"rejected"})},`rv-${c.id}`)),u.pendingConfirms.map(c=>e.jsx(Ai,{c,onAllow:()=>xe(c.id,{type:"run_once"}),onAlwaysAllow:b=>xe(c.id,{type:"always_allow",prefix:b}),onDeny:()=>xe(c.id,{type:"deny"})},`cc-${c.id}`)),u.pendingPathAccess.map(c=>e.jsx(Pi,{p:c,onAllow:()=>it(c.id,{type:"run_once"}),onAlwaysAllow:b=>it(c.id,{type:"always_allow",prefix:b}),onDeny:()=>it(c.id,{type:"deny"})},`pa-${c.id}`)),u.pendingChoices.map(c=>e.jsx(Mi,{c,onPick:b=>Bt(c.id,{type:"pick",optionId:b}),onCancel:()=>Bt(c.id,{type:"cancel"})},`ch-${c.id}`)),u.ready?null:e.jsx("div",{style:{padding:12,color:"var(--muted)",fontFamily:"Geist Mono, monospace",fontSize:11},children:a("app.connecting")})]}),Vn?e.jsx("button",{className:"thread-jump-bottom",onClick:()=>Jn(!0),title:a("app.jumpToBottom")??"Jump to bottom","aria-label":a("app.jumpToBottom")??"Jump to bottom",children:e.jsx(x.chev,{size:16})}):null]}),e.jsx(Na,{draft:le,setDraft:ne,onSend:()=>Ke(),onAbort:Me,disabled:!u.ready,busy:u.busy,busyLabel:u.busy?u.activeSkill?`Skill · ${u.activeSkill.name}`:"Reasoning":void 0,busyElapsedMs:Zn,textareaRef:re,modelLabel:u.settings?.model??"deepseek-v4-flash",reasoningEffort:u.settings?.reasoningEffort??"high",onModelChange:c=>{je({model:c}),ae(a("app.toast.modelSwitched",{model:c}))},onEffortChange:c=>{je({reasoningEffort:c}),ae(a("app.toast.effortSwitched",{effort:c}))},editMode:u.settings?.editMode??"review",onEditModeChange:c=>{je({editMode:c}),c==="yolo"?ae(a("app.yolo.toast"),{yolo:!0,duration:3e3}):ae(a("app.toast.modeSwitched",{mode:c.toUpperCase()}))},workspaceDir:u.settings?.workspaceDir,slashCommands:$t,onMentionQuery:zn,onMentionPreview:_n,onMentionPicked:st,mentionResults:u.mentionResults,queuedSends:u.queuedSends,onQueueWhileBusy:c=>{z({t:"enqueue_send",text:c}),ne("")},onDequeueSend:c=>z({t:"dequeue_send",index:c})})]})}),e.jsx(Ea,{settings:u.settings,usage:u.usage,mcpSpecs:u.mcpSpecs,mcpBridged:u.mcpBridged,sessionFiles:u.sessionFiles,memory:u.memory,memoryDetail:u.memoryDetail,onReadMemory:c=>C({cmd:"memory_read",path:c})}),e.jsx(pi,{settings:u.settings,balance:u.balance,usage:u.usage,busy:u.busy,ready:u.ready,currency:s,theme:p,themeStyle:h,jobs:u.jobs,jobsOpen:w,onToggleJobs:()=>T(c=>!c),onSetThemeStyle:k,onToggleCurrency:D,onOpenSettings:()=>de("general"),onOpenWorkdir:c=>{te(c),N(!0)}}),e.jsx(Xs,{open:$e.open,onClose:()=>$e.setOpen(!1),commands:Qn}),e.jsx(Di,{open:j,onClose:()=>N(!1),recent:u.settings?.recentWorkspaces??[],current:u.settings?.workspaceDir,anchor:H,onPick:c=>je({workspaceDir:c}),onBrowse:Ue}),e.jsx(Ii,{open:Ae,initialPath:u.settings?.workspaceDir,onCancel:()=>Ie(!1),onConfirm:c=>{je({workspaceDir:c}),Ie(!1)}}),O?e.jsx(Ba,{onClose:()=>ie(!1)}):null,Y&&u.settings?e.jsx(Ka,{settings:u.settings,balance:u.balance,usage:u.usage,currency:s,theme:p,themeStyle:h,onSetTheme:g,onSetThemeStyle:k,fontScale:f,onSetFontScale:m,fontFamily:y,onSetFontFamily:S,initialPage:Q,mcpSpecs:u.mcpSpecs,mcpBridged:u.mcpBridged,skills:u.skills,memory:u.memory,memoryDetail:u.memoryDetail,qq:u.qq,onClose:()=>B(!1),onSave:je,onSaveApiKey:On,onLoadQQ:at,onConnectQQ:qn,onDisconnectQQ:Bn,onSaveQQConfig:Hn,onOpenQQApplyLink:()=>Oe("https://q.qq.com/qqbot/openclaw/login.html").catch(()=>{}),onPickWorkspace:Ue,onAddMcpSpec:Fn,onRemoveMcpSpec:$n,onReadMemory:c=>C({cmd:"memory_read",path:c})}):null,e.jsx(_a,{open:w,onClose:()=>T(!1),jobs:u.jobs,onStop:c=>C({cmd:"jobs_stop",jobId:c}),onStopAll:()=>C({cmd:"jobs_stop_all"})}),e.jsx(ea,{message:he}),ce?e.jsx(li,{onDone:()=>ge(!1)}):null]})})}function rn(){return e.jsx("svg",{width:"10",height:"1",viewBox:"0 0 10 1","aria-hidden":!0,children:e.jsx("rect",{width:"10",height:"1",fill:"currentColor"})})}function on(){return e.jsx("svg",{width:"10",height:"10",viewBox:"0 0 10 10","aria-hidden":!0,children:e.jsx("rect",{x:"0.5",y:"0.5",width:"9",height:"9",fill:"none",stroke:"currentColor",strokeWidth:"1"})})}function ln(){return e.jsxs("svg",{width:"10",height:"10",viewBox:"0 0 10 10","aria-hidden":!0,children:[e.jsx("rect",{x:"2.5",y:"0.5",width:"7",height:"7",fill:"none",stroke:"currentColor",strokeWidth:"1"}),e.jsx("rect",{x:"0.5",y:"2.5",width:"7",height:"7",fill:"var(--bg-2, #eee)",stroke:"currentColor",strokeWidth:"1"})]})}function cn(){return e.jsxs("svg",{width:"10",height:"10",viewBox:"0 0 10 10","aria-hidden":!0,children:[e.jsx("line",{x1:"0.5",y1:"0.5",x2:"9.5",y2:"9.5",stroke:"currentColor",strokeWidth:"1.2",strokeLinecap:"round"}),e.jsx("line",{x1:"9.5",y1:"0.5",x2:"0.5",y2:"9.5",stroke:"currentColor",strokeWidth:"1.2",strokeLinecap:"round"})]})}function Ji({session:t,model:n,sideOn:s,ctxOn:i,onToggleSide:r,onToggleCtx:o,onOpenCommands:d,onOpenSettings:p,onCopy:h,onExport:g,onClear:k,hasMessages:v,mobileSideOpen:f,onToggleMobileSide:m}){$();const[y,S]=l.useState(!1),[I,q]=l.useState(!1),X=l.useRef(null),R=document.documentElement.dataset.platform==="macos",D=document.documentElement.dataset.web==="true";l.useEffect(()=>{const F=wt();F.isMaximized().then(q);let J;return F.listen("tauri://resize",async()=>{q(await F.isMaximized())}).then(ee=>{J=ee}),()=>J?.()},[]),l.useEffect(()=>{if(!y)return;const F=J=>{X.current&&!X.current.contains(J.target)&&S(!1)};return window.addEventListener("mousedown",F),()=>window.removeEventListener("mousedown",F)},[y]);const K=wt();return e.jsxs("header",{className:"titlebar",children:[e.jsxs("div",{className:"tb-left",children:[R&&!D?e.jsxs("div",{className:"mac-controls","aria-label":a("app.titlebar.windowControls"),children:[e.jsx("button",{type:"button",className:"mac-ctrl close",title:a("app.titlebar.close"),"aria-label":a("app.titlebar.close"),onMouseDown:F=>{F.stopPropagation(),K.close()},children:e.jsx(cn,{})}),e.jsx("button",{type:"button",className:"mac-ctrl minimize",title:a("app.titlebar.minimize"),"aria-label":a("app.titlebar.minimize"),onMouseDown:F=>{F.stopPropagation(),K.minimize()},children:e.jsx(rn,{})}),e.jsx("button",{type:"button",className:"mac-ctrl zoom",title:a(I?"app.titlebar.restore":"app.titlebar.maximize"),"aria-label":a(I?"app.titlebar.restore":"app.titlebar.maximize"),onMouseDown:F=>{F.stopPropagation(),K.toggleMaximize()},children:I?e.jsx(ln,{}):e.jsx(on,{})})]}):null,e.jsx("button",{type:"button",className:"tb-mobile-menu","aria-label":"打开会话列表","aria-expanded":f,onClick:m,children:f?e.jsx(x.x,{size:18}):e.jsx(x.panel_l,{size:18})}),e.jsx("button",{type:"button",className:"iconbtn tb-desktop-side-btn","data-on":s,title:Nn(a("app.titlebar.sidebar")),onClick:r,children:e.jsx(x.panel_l,{size:14})}),e.jsxs("div",{className:"tb-meta","data-tauri-drag-region":!0,children:[e.jsxs("div",{className:"brand","data-tauri-drag-region":!0,children:[e.jsx("span",{className:"mark"}),e.jsx("span",{className:"brand-name",children:"Reasonix"})]}),t&&e.jsxs("div",{className:"crumbs","data-tauri-drag-region":!0,children:[e.jsx("span",{className:"sep",children:"/"}),e.jsx("span",{className:"cur",children:n??"—"})]})]})]}),e.jsx("span",{className:"grow","data-tauri-drag-region":!0}),e.jsxs("div",{className:"tb-right",children:[e.jsx("button",{type:"button",className:"iconbtn","data-on":i,title:a("app.titlebar.contextPanel"),onClick:o,children:e.jsx(x.panel_r,{size:14})}),e.jsxs("div",{ref:X,style:{position:"relative"},children:[e.jsx("button",{type:"button",className:"iconbtn",title:a("app.titlebar.more"),onClick:()=>S(F=>!F),children:e.jsx(x.more,{size:14})}),y?e.jsx("div",{className:"popup",style:{top:"calc(100% + 6px)",right:0,left:"auto",bottom:"auto",width:220},children:e.jsxs("div",{className:"popup-list",children:[e.jsxs("div",{className:"popup-item",onClick:()=>{d(),S(!1)},children:[e.jsx("span",{className:"ico",children:e.jsx(x.search,{size:12})}),e.jsx("div",{className:"nm",children:e.jsx("span",{children:a("app.titlebar.commandPalette")})}),e.jsx("span",{className:"kb",children:e.jsx(G,{keys:["mod","K"]})})]}),e.jsxs("div",{className:"popup-item",onClick:()=>{v&&h(),S(!1)},style:{opacity:v?1:.5},children:[e.jsx("span",{className:"ico",children:e.jsx(x.copy,{size:12})}),e.jsx("div",{className:"nm",children:e.jsx("span",{children:a("app.titlebar.copyMd")})})]}),e.jsxs("div",{className:"popup-item",onClick:()=>{v&&g(),S(!1)},style:{opacity:v?1:.5},children:[e.jsx("span",{className:"ico",children:e.jsx(x.download,{size:12})}),e.jsx("div",{className:"nm",children:e.jsx("span",{children:a("app.titlebar.exportMd")})})]}),e.jsxs("div",{className:"popup-item",onClick:()=>{k(),S(!1)},children:[e.jsx("span",{className:"ico",children:e.jsx(x.x,{size:12})}),e.jsx("div",{className:"nm",children:e.jsx("span",{children:a("app.titlebar.clearChat")})})]}),e.jsxs("div",{className:"popup-item",onClick:()=>{p(),S(!1)},children:[e.jsx("span",{className:"ico",children:e.jsx(x.cog,{size:12})}),e.jsx("div",{className:"nm",children:e.jsx("span",{children:a("app.titlebar.settings")})}),e.jsx("span",{className:"kb",children:e.jsx(G,{keys:["mod",","]})})]})]})}):null]}),!R&&!D?e.jsxs("div",{className:"win-controls",children:[e.jsx("button",{type:"button",className:"win-ctrl",title:a("app.titlebar.minimize"),onMouseDown:F=>{F.stopPropagation(),K.minimize()},children:e.jsx(rn,{})}),e.jsx("button",{type:"button",className:"win-ctrl",title:a(I?"app.titlebar.restore":"app.titlebar.maximize"),onMouseDown:F=>{F.stopPropagation(),K.toggleMaximize()},children:I?e.jsx(ln,{}):e.jsx(on,{})}),e.jsx("button",{type:"button",className:"win-ctrl close",title:a("app.titlebar.close"),onMouseDown:F=>{F.stopPropagation(),K.close()},children:e.jsx(cn,{})})]}):null]})]})}function Yi({tabs:t,activeId:n,setActive:s,onClose:i,onNew:r,singleTab:o}){return $(),e.jsx("div",{className:"tabbar",children:t.map(d=>{const p=d.workspaceDir??"",h=p.replace(/[\\/]$/,"").split(/[\\/]/).pop()||"workspace";return e.jsxs("div",{className:"tab","data-active":d.id===n,onClick:()=>s(d.id),title:p||h,children:[e.jsx("span",{className:"dot","data-state":"running"}),e.jsx("span",{className:"label",children:h}),o?null:e.jsx("span",{className:"close",onClick:g=>{g.stopPropagation(),i(d.id)},children:e.jsx(x.x,{size:11})})]},d.id)})})}function Qi({session:t,model:n,workspaceDir:s,busy:i,hasMessages:r,onAbort:o,onNewChat:d,onCopy:p,onExport:h,onOpenWorkdir:g}){$();const k=s?s.split(/[\\/]/).pop()||"workspace":a("app.header.noWorkspace");return e.jsxs("div",{className:"main-head",children:[e.jsxs("div",{className:"title-wrap",children:[e.jsxs("h1",{children:[e.jsx("span",{className:"editable",children:t}),i?e.jsxs("span",{className:"pill",style:{color:"var(--accent)"},children:[e.jsx("span",{className:"dot"}),e.jsx("span",{className:"shimmer",children:a("app.header.running")})]}):null]}),e.jsxs("div",{className:"sub",children:[e.jsxs("span",{className:"ws-crumb",onClick:v=>{const f=v.currentTarget.getBoundingClientRect();g({top:f.bottom+6,left:f.left})},style:{cursor:"pointer"},title:s??a("app.header.clickToSelect"),children:[e.jsx(x.folder,{size:10})," ",k]}),n?e.jsxs("span",{className:"pill",children:[e.jsx(x.brain,{size:10})," ",n]}):null]})]}),e.jsx("span",{className:"grow"}),e.jsxs("button",{type:"button",className:"h-btn",onClick:p,disabled:!r,title:a("app.header.copyMd"),children:[e.jsx(x.copy,{size:12})," ",a("app.header.copy")]}),e.jsxs("button",{type:"button",className:"h-btn",onClick:h,disabled:!r,title:a("app.header.exportMd"),children:[e.jsx(x.download,{size:12})," ",a("app.header.export")]}),e.jsxs("button",{type:"button",className:"h-btn",onClick:d,children:[e.jsx(x.plus,{size:12})," ",a("app.header.newChat")]}),i?e.jsxs("button",{type:"button",className:"h-btn primary",onClick:o,children:[e.jsx(x.stop,{size:12})," ",a("app.header.abort")]}):null]})}function Zi({onPick:t,workspaceDir:n}){$();const s=[a("app.empty.suggestion0"),a("app.empty.suggestion1"),a("app.empty.suggestion2"),a("app.empty.suggestion3"),"/help"],i=n?n.split(/[\\/]/).pop():null;return e.jsxs("div",{style:{padding:"48px 16px 24px",textAlign:"center",color:"var(--muted)",fontFamily:"var(--font-sans, 'Geist', sans-serif)"},children:[e.jsx("div",{style:{width:56,height:56,borderRadius:12,margin:"0 auto 14px",background:"linear-gradient(135deg, var(--accent), var(--violet))",position:"relative"},children:e.jsx("span",{style:{position:"absolute",inset:8,borderRadius:6,background:"var(--bg)"}})}),e.jsx("div",{style:{fontSize:18,fontWeight:600,color:"var(--fg)",marginBottom:4},children:a("app.empty.welcome")}),e.jsx("div",{style:{fontSize:12,marginBottom:18},children:i?e.jsxs(e.Fragment,{children:[a("app.empty.currentWorkspace"),e.jsx("code",{style:{fontFamily:"Geist Mono, monospace"},children:i})]}):a("app.empty.selectWorkspace")}),e.jsx("div",{style:{display:"flex",flexWrap:"wrap",gap:8,justifyContent:"center",maxWidth:540,margin:"0 auto"},children:s.map(r=>e.jsx("button",{type:"button",className:"btn",style:{fontSize:11.5},onClick:()=>t(r),children:r},r))})]})}function Xi({workspaceDir:t,onPickWorkspace:n,onSubmit:s}){$();const[i,r]=l.useState("");return e.jsxs("div",{style:{flex:1,display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",padding:24,gap:18},children:[e.jsx("div",{style:{fontSize:18,fontWeight:600},children:a("app.setup.welcome")}),e.jsx("div",{style:{fontSize:12.5,color:"var(--muted)",maxWidth:400,textAlign:"center"},children:a("app.setup.description")}),e.jsxs("div",{style:{width:"min(420px, 100%)",display:"flex",flexDirection:"column",gap:10},children:[e.jsxs("div",{className:"setting-row",style:{borderBottom:"none"},children:[e.jsxs("div",{className:"l",children:[e.jsx("div",{className:"n",children:a("app.setup.workspace")}),e.jsx("div",{className:"h",children:t||a("app.setup.notSelected")})]}),e.jsx("button",{type:"button",className:"btn",onClick:n,children:a("app.setup.choose")})]}),e.jsx("input",{className:"field mono",type:"password",value:i,onChange:o=>r(o.target.value),placeholder:"sk-…",style:{width:"100%"}}),e.jsx("button",{type:"button",className:"btn primary",disabled:!i.trim(),onClick:()=>s(i.trim()),children:a("app.setup.saveAndStart")})]})]})}function er(){const[t,n]=l.useState([]),[s,i]=l.useState(""),r=l.useRef(new Map),o=l.useRef(new Map),d=l.useRef(new Map),p=l.useRef(!1),h=l.useRef([]);l.useEffect(()=>{h.current=t},[t]);const[g,k]=l.useState(()=>localStorage.getItem("reasonix.currency")==="USD"?"USD":"CNY"),[v,f]=l.useState(()=>{const j=localStorage.getItem("reasonix.theme"),N=localStorage.getItem("reasonix.themeStyle");return jt(N)?Fe(N):St(j)?j:se.DARK}),[m,y]=l.useState(()=>{const j=localStorage.getItem("reasonix.themeStyle");if(jt(j))return j;const N=localStorage.getItem("reasonix.theme");return Ct(St(N)?N:se.DARK)}),[S,I]=l.useState(()=>{const j=localStorage.getItem("reasonix.fontScale");return ha(j)?j:ue.MEDIUM}),[q,X]=l.useState(()=>{const j=localStorage.getItem("reasonix.fontFamily");return fa(j)?j:pe.SANS}),[R,D]=l.useState(()=>localStorage.getItem("reasonix.sideCollapsed")==="1"),[K,F]=l.useState(()=>localStorage.getItem("reasonix.ctxCollapsed")==="1");l.useEffect(()=>{document.documentElement.dataset.theme=v,document.documentElement.dataset.themeStyle=m,localStorage.setItem("reasonix.theme",v),localStorage.setItem("reasonix.themeStyle",m)},[v,m]),l.useEffect(()=>{localStorage.setItem("reasonix.sideCollapsed",R?"1":"0")},[R]),l.useEffect(()=>{localStorage.setItem("reasonix.ctxCollapsed",K?"1":"0")},[K]),l.useEffect(()=>{document.documentElement.style.setProperty("zoom",String(ga[S])),localStorage.setItem("reasonix.fontScale",S)},[S]),l.useEffect(()=>{document.documentElement.style.setProperty("--font-sans",ba[q]),localStorage.setItem("reasonix.fontFamily",q)},[q]),l.useEffect(()=>{const j=N=>{const H=N.detail;(H==="CNY"||H==="USD")&&k(H)};return window.addEventListener("reasonix:currency",j),()=>window.removeEventListener("reasonix:currency",j)},[]);const J=l.useCallback((j,N)=>{const H=r.current.get(j);if(H)H(N);else{const te=o.current.get(j)??[];te.push(N),o.current.set(j,te)}},[]),ee=l.useCallback((j,N)=>{if(N){r.current.set(j,N);const H=o.current.get(j);if(H&&H.length>0){for(const te of H)N(te);o.current.delete(j)}}else r.current.delete(j)},[]);l.useEffect(()=>{let j=!1;const N=[],H=()=>{p.current=!1;for(const[W,Y]of d.current)Y.length!==0&&(J(W,{t:"batch_delta",items:Y}),d.current.set(W,[]))},te=()=>{p.current||j||(p.current=!0,requestAnimationFrame(H))},re=W=>{const Y=d.current.get(W);Y&&Y.length>0&&(J(W,{t:"batch_delta",items:Y}),d.current.set(W,[]))};return(async()=>{const W=await Promise.all([Xe("rpc:event",Y=>{try{const B=JSON.parse(Y.payload.data),Q=B.tabId;if(B.type==="$tab_opened"&&Q){n(w=>w.some(T=>T.id===Q)?w:[...w,{id:Q,workspaceDir:B.workspaceDir}]),i(w=>B.active||!w?Q:w);return}if(B.type==="$tab_closed"&&Q){n(w=>w.filter(T=>T.id!==Q)),i(w=>w!==Q?w:h.current.filter(O=>O.id!==Q)[0]?.id??""),r.current.delete(Q),o.current.delete(Q),d.current.delete(Q);return}if(B.type==="model.delta"&&Q&&(B.channel==="content"||B.channel==="reasoning")){const w=d.current.get(Q)??[];w.push({turn:B.turn,channel:B.channel,text:B.text}),d.current.set(Q,w),te();return}if(B.type==="$settings"&&Q&&n(w=>w.map(T=>T.id===Q?{...T,workspaceDir:B.workspaceDir}:T)),B.type==="$jobs"){for(const w of r.current.keys())J(w,{t:"incoming",event:B});return}const be=Q;if(be){if(re(be),B.type==="$mention_results"){J(be,{t:"mention_results",results:{nonce:B.nonce,query:B.query,results:B.results}});return}if(B.type==="$mention_preview"){J(be,{t:"mention_preview",preview:{nonce:B.nonce,path:B.path,head:B.head,totalLines:B.totalLines}});return}J(be,{t:"incoming",event:B})}}catch{console.error("bad rpc:event line",Y.payload.data)}}),Xe("rpc:stderr",Y=>{console.warn("[reasonix stderr]",Y.payload.data)}),Xe("rpc:exit",Y=>{for(const B of r.current.keys())re(B);for(const B of r.current.values())B({t:"rpc_exit",code:Y.payload.code})})]);if(j){for(const Y of W)Y();return}N.push(...W);try{await ve("rpc_spawn")}catch(Y){j||console.error("rpc_spawn failed",Y)}})(),()=>{j=!0;for(const W of N)W()}},[J]),l.useEffect(()=>{s&&ve("rpc_send",{line:JSON.stringify({cmd:"tab_activate",tabId:s})}).catch(()=>{})},[s]);const E=l.useCallback(()=>{ve("rpc_send",{line:JSON.stringify({cmd:"tab_open"})}).catch(j=>console.error("tab_open failed",j))},[]),u=l.useCallback(j=>{t.length<=1||ve("rpc_send",{line:JSON.stringify({cmd:"tab_close",tabId:j})}).catch(N=>console.error("tab_close failed",N))},[t.length]);l.useEffect(()=>{const j=N=>{const H=N.ctrlKey||N.metaKey;if(H&&(N.key==="t"||N.key==="T"))N.preventDefault(),E();else if(H&&(N.key==="w"||N.key==="W")&&s&&t.length>1)N.preventDefault(),u(s);else if(H&&N.key==="Tab"){if(t.length<=1)return;N.preventDefault();const te=t.findIndex(W=>W.id===s),re=N.shiftKey?(te-1+t.length)%t.length:(te+1)%t.length,fe=t[re];fe&&i(fe.id)}else H&&(N.key==="b"||N.key==="B")&&(N.altKey?(N.preventDefault(),F(te=>!te)):(N.preventDefault(),D(te=>!te)))};return window.addEventListener("keydown",j),()=>window.removeEventListener("keydown",j)},[E,u,s,t]);const z=l.useCallback(j=>{f(j),y(Ct(j))},[]),le=l.useCallback(j=>{y(j),f(Fe(j))},[]),ne=l.useCallback(()=>{z(v===se.DARK?se.LIGHT:se.DARK)},[z,v]),[he,Z]=l.useState(!1),ce=l.useCallback(()=>Z(j=>!j),[]),ge=l.useCallback(()=>{k(j=>{const N=j==="CNY"?"USD":"CNY";return localStorage.setItem("reasonix.currency",N),window.dispatchEvent(new CustomEvent("reasonix:currency",{detail:N})),N})},[]);return e.jsx(e.Fragment,{children:t.map(j=>e.jsx(Vi,{tabId:j.id,active:j.id===s,currency:g,registerDispatch:ee,onNewTab:E,onCloseTab:()=>u(j.id),canCloseTab:t.length>1,theme:v,themeStyle:m,onSetTheme:z,onSetThemeStyle:le,onToggleTheme:ne,fontScale:S,onSetFontScale:I,fontFamily:q,onSetFontFamily:X,sideCollapsed:R,ctxCollapsed:K,onToggleSide:()=>D(N=>!N),onToggleCtx:()=>F(N=>!N),onToggleCurrency:ge,mobileSideOpen:he,onToggleMobileSide:ce,tabsList:t,activeTabId:s,setActiveTabId:i},j.id))})}const ft=localStorage.getItem("reasonix.theme"),bt=localStorage.getItem("reasonix.themeStyle");jt(bt)?(document.documentElement.dataset.themeStyle=bt,document.documentElement.dataset.theme=Fe(bt)):St(ft)&&(document.documentElement.dataset.theme=ft,document.documentElement.dataset.themeStyle=Ct(ft));const Ln=/Mac|macOS/i.test(navigator.userAgent)?"macos":/Windows/i.test(navigator.userAgent)?"windows":"default";document.documentElement.dataset.platform=Ln;document.body.dataset.platform=Ln;const In=document.getElementById("root");if(!In)throw new Error("#root missing");Xn.createRoot(In).render(e.jsx(er,{}));
47
47
  //# sourceMappingURL=app.js.map