reasonix 0.51.0 → 0.52.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.
- package/dashboard/dist/app.css +1 -1
- package/dashboard/dist/app.js +3 -3
- package/dashboard/dist/app.js.map +1 -1
- package/dist/cli/{acp-XEUHGG7X.js → acp-NEUYWGUU.js} +26 -26
- package/dist/cli/chat-QA6IVFJD.js +49 -0
- package/dist/cli/{chunk-HGK57NBN.js → chunk-2W4F3RIZ.js} +2 -2
- package/dist/cli/{chunk-UO6E7FN3.js → chunk-3OXD5CBM.js} +32756 -31192
- package/dist/cli/chunk-3OXD5CBM.js.map +1 -0
- package/dist/cli/{chunk-UMZ6KHTS.js → chunk-5YLEKX2V.js} +2 -2
- package/dist/cli/{chunk-BA5R6BAE.js → chunk-6QBUXA73.js} +2 -2
- package/dist/cli/chunk-77JIQ7SL.js +40 -0
- package/dist/cli/chunk-77JIQ7SL.js.map +1 -0
- package/dist/cli/{chunk-6XWXIVQ3.js → chunk-AMSK3ZLB.js} +2 -2
- package/dist/cli/chunk-AMSK3ZLB.js.map +1 -0
- package/dist/cli/{chunk-A5PBEIJ7.js → chunk-AOYUW3HR.js} +37 -4
- package/dist/cli/chunk-AOYUW3HR.js.map +1 -0
- package/dist/cli/{chunk-3YRTIWFX.js → chunk-ARBGTNHM.js} +2 -2
- package/dist/cli/{chunk-3BTK5BHI.js → chunk-B4MOGWHW.js} +2 -2
- package/dist/cli/{chunk-5AIDYVH2.js → chunk-CFJY64UA.js} +2 -2
- package/dist/cli/{chunk-SBHF5NWD.js → chunk-CGVW5W7N.js} +14 -14
- package/dist/cli/{chunk-SBHF5NWD.js.map → chunk-CGVW5W7N.js.map} +1 -1
- package/dist/cli/{chunk-DVD67FXQ.js → chunk-CLHMV6OL.js} +568 -66
- package/dist/cli/chunk-CLHMV6OL.js.map +1 -0
- package/dist/cli/{chunk-2WUEAI2I.js → chunk-CPCUMMSR.js} +3 -3
- package/dist/cli/{chunk-JHWQDJZA.js → chunk-CTRM32BP.js} +2 -2
- package/dist/cli/{chunk-544J4PXD.js → chunk-D6WRFR6V.js} +5 -5
- package/dist/cli/{chunk-N4SEBLU4.js → chunk-DLTE4GBY.js} +3 -3
- package/dist/cli/{chunk-NRROJXXT.js → chunk-FY5UERSG.js} +9 -9
- package/dist/cli/{chunk-C2MRSJTV.js → chunk-GFJJEW3Z.js} +18 -10
- package/dist/cli/chunk-GFJJEW3Z.js.map +1 -0
- package/dist/cli/{chunk-R6KIHEF3.js → chunk-GNRKXRRE.js} +743 -660
- package/dist/cli/chunk-GNRKXRRE.js.map +1 -0
- package/dist/cli/{chunk-SXSAWOB7.js → chunk-HI6THNAZ.js} +19 -17
- package/dist/cli/chunk-HI6THNAZ.js.map +1 -0
- package/dist/cli/{chunk-K4YQFULP.js → chunk-HNZ4727T.js} +15 -15
- package/dist/cli/chunk-I3NE5S63.js +54 -0
- package/dist/cli/{chunk-EAMXOWUW.js.map → chunk-I3NE5S63.js.map} +1 -1
- package/dist/cli/{chunk-FEZK652I.js → chunk-MVLPXZAA.js} +834 -10
- package/dist/cli/chunk-MVLPXZAA.js.map +1 -0
- package/dist/cli/{chunk-36BM7INR.js → chunk-MW64SQUE.js} +2 -2
- package/dist/cli/{chunk-Z3MKG7MQ.js → chunk-OMNRXZNA.js} +2 -2
- package/dist/cli/{chunk-7YPMTE3U.js → chunk-RCC73DWQ.js} +5 -9
- package/dist/cli/chunk-RCC73DWQ.js.map +1 -0
- package/dist/cli/{chunk-2HVTBFCI.js → chunk-RHQOGG43.js} +5 -3
- package/dist/cli/chunk-RHQOGG43.js.map +1 -0
- package/dist/cli/{chunk-EWVFGYT6.js → chunk-VVPV5HU6.js} +2 -2
- package/dist/cli/{chunk-7YB26OQO.js → chunk-WPY7AFS6.js} +2 -2
- package/dist/cli/{chunk-BM6BBFAV.js → chunk-XBYHNZ5Z.js} +2 -2
- package/dist/cli/{chunk-WPOKBW5E.js → chunk-XNMXVL6C.js} +2 -2
- package/dist/cli/{chunk-SVD4UPRQ.js → chunk-XUZHBQSM.js} +2 -2
- package/dist/cli/{chunk-Q46B3Z7H.js → chunk-YMYX6QTC.js} +8 -5
- package/dist/cli/{chunk-Q46B3Z7H.js.map → chunk-YMYX6QTC.js.map} +1 -1
- package/dist/cli/{chunk-K3QJ3GKI.js → chunk-Z663GVUB.js} +3 -3
- package/dist/cli/{code-BMXLBC7D.js → code-WN6D4VZO.js} +35 -36
- package/dist/cli/{code-BMXLBC7D.js.map → code-WN6D4VZO.js.map} +1 -1
- package/dist/cli/{commands-E4RZXMF6.js → commands-DHETOY7O.js} +4 -4
- package/dist/cli/{commit-KSRQ64IL.js → commit-BBUYAKZV.js} +3 -3
- package/dist/cli/{config-QNDONOTU.js → config-KV7VV5LG.js} +4 -2
- package/dist/cli/{desktop-H3ZHIMDA.js → desktop-LJVXWXNF.js} +557 -70
- package/dist/cli/desktop-LJVXWXNF.js.map +1 -0
- package/dist/cli/diff-2JHMQAHI.js +165 -0
- package/dist/cli/{diff-I4PYI43W.js.map → diff-2JHMQAHI.js.map} +1 -1
- package/dist/cli/{doctor-Y2E4MY2F.js → doctor-GI5LOEZL.js} +11 -11
- package/dist/cli/{events-47HOT7ZA.js → events-LBKMLFM4.js} +5 -5
- package/dist/cli/index.js +40 -39
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/{mcp-76DK63ZB.js → mcp-DKEJK5ND.js} +3 -3
- package/dist/cli/{mcp-browse-SDNUGO74.js → mcp-browse-V7KWDY32.js} +15 -15
- package/dist/cli/{mcp-browse-SDNUGO74.js.map → mcp-browse-V7KWDY32.js.map} +1 -1
- package/dist/cli/{mcp-inspect-BL5DEO5M.js → mcp-inspect-MTABNHVM.js} +5 -5
- package/dist/cli/{prompt-JLATI3P7.js → prompt-ATI7DKHF.js} +5 -5
- package/dist/cli/{prune-sessions-WHZDFUKD.js → prune-sessions-YQQSZTZS.js} +4 -4
- package/dist/cli/{replay-MHXS7C7Z.js → replay-ZJQ4I4CJ.js} +30 -30
- package/dist/cli/{replay-MHXS7C7Z.js.map → replay-ZJQ4I4CJ.js.map} +1 -1
- package/dist/cli/{run-SXNCPRJE.js → run-HFPRNWJY.js} +22 -22
- package/dist/cli/{server-GEHOE6CO.js → server-UHKO2VVM.js} +23 -23
- package/dist/cli/{sessions-EPBFYISL.js → sessions-IQEWWUH3.js} +16 -16
- package/dist/cli/setup-5BYKCL62.js +502 -0
- package/dist/cli/setup-5BYKCL62.js.map +1 -0
- package/dist/cli/{stats-4WB4XHBP.js → stats-OFCGOQMZ.js} +6 -6
- package/dist/cli/{version-4SP3DLLH.js → version-EODUFAAI.js} +16 -16
- package/dist/index.d.ts +12 -1
- package/dist/index.js +613 -78
- package/dist/index.js.map +1 -1
- package/package.json +21 -3
- package/dist/cli/chat-NJ2Q5KHG.js +0 -50
- package/dist/cli/chunk-2HVTBFCI.js.map +0 -1
- package/dist/cli/chunk-5BBC6YMV.js +0 -832
- package/dist/cli/chunk-5BBC6YMV.js.map +0 -1
- package/dist/cli/chunk-6XWXIVQ3.js.map +0 -1
- package/dist/cli/chunk-7YPMTE3U.js.map +0 -1
- package/dist/cli/chunk-A5PBEIJ7.js.map +0 -1
- package/dist/cli/chunk-C2MRSJTV.js.map +0 -1
- package/dist/cli/chunk-DVD67FXQ.js.map +0 -1
- package/dist/cli/chunk-EAMXOWUW.js +0 -54
- package/dist/cli/chunk-FEZK652I.js.map +0 -1
- package/dist/cli/chunk-R6KIHEF3.js.map +0 -1
- package/dist/cli/chunk-SXSAWOB7.js.map +0 -1
- package/dist/cli/chunk-UO6E7FN3.js.map +0 -1
- package/dist/cli/chunk-UPW544V3.js +0 -96
- package/dist/cli/chunk-UPW544V3.js.map +0 -1
- package/dist/cli/desktop-H3ZHIMDA.js.map +0 -1
- package/dist/cli/devtools-HW3WDT3Q.js +0 -91
- package/dist/cli/devtools-HW3WDT3Q.js.map +0 -1
- package/dist/cli/diff-I4PYI43W.js +0 -165
- package/dist/cli/setup-IW2XR5XI.js +0 -593
- package/dist/cli/setup-IW2XR5XI.js.map +0 -1
- /package/dist/cli/{acp-XEUHGG7X.js.map → acp-NEUYWGUU.js.map} +0 -0
- /package/dist/cli/{chat-NJ2Q5KHG.js.map → chat-QA6IVFJD.js.map} +0 -0
- /package/dist/cli/{chunk-HGK57NBN.js.map → chunk-2W4F3RIZ.js.map} +0 -0
- /package/dist/cli/{chunk-UMZ6KHTS.js.map → chunk-5YLEKX2V.js.map} +0 -0
- /package/dist/cli/{chunk-BA5R6BAE.js.map → chunk-6QBUXA73.js.map} +0 -0
- /package/dist/cli/{chunk-3YRTIWFX.js.map → chunk-ARBGTNHM.js.map} +0 -0
- /package/dist/cli/{chunk-3BTK5BHI.js.map → chunk-B4MOGWHW.js.map} +0 -0
- /package/dist/cli/{chunk-5AIDYVH2.js.map → chunk-CFJY64UA.js.map} +0 -0
- /package/dist/cli/{chunk-2WUEAI2I.js.map → chunk-CPCUMMSR.js.map} +0 -0
- /package/dist/cli/{chunk-JHWQDJZA.js.map → chunk-CTRM32BP.js.map} +0 -0
- /package/dist/cli/{chunk-544J4PXD.js.map → chunk-D6WRFR6V.js.map} +0 -0
- /package/dist/cli/{chunk-N4SEBLU4.js.map → chunk-DLTE4GBY.js.map} +0 -0
- /package/dist/cli/{chunk-NRROJXXT.js.map → chunk-FY5UERSG.js.map} +0 -0
- /package/dist/cli/{chunk-K4YQFULP.js.map → chunk-HNZ4727T.js.map} +0 -0
- /package/dist/cli/{chunk-36BM7INR.js.map → chunk-MW64SQUE.js.map} +0 -0
- /package/dist/cli/{chunk-Z3MKG7MQ.js.map → chunk-OMNRXZNA.js.map} +0 -0
- /package/dist/cli/{chunk-EWVFGYT6.js.map → chunk-VVPV5HU6.js.map} +0 -0
- /package/dist/cli/{chunk-7YB26OQO.js.map → chunk-WPY7AFS6.js.map} +0 -0
- /package/dist/cli/{chunk-BM6BBFAV.js.map → chunk-XBYHNZ5Z.js.map} +0 -0
- /package/dist/cli/{chunk-WPOKBW5E.js.map → chunk-XNMXVL6C.js.map} +0 -0
- /package/dist/cli/{chunk-SVD4UPRQ.js.map → chunk-XUZHBQSM.js.map} +0 -0
- /package/dist/cli/{chunk-K3QJ3GKI.js.map → chunk-Z663GVUB.js.map} +0 -0
- /package/dist/cli/{commands-E4RZXMF6.js.map → commands-DHETOY7O.js.map} +0 -0
- /package/dist/cli/{commit-KSRQ64IL.js.map → commit-BBUYAKZV.js.map} +0 -0
- /package/dist/cli/{config-QNDONOTU.js.map → config-KV7VV5LG.js.map} +0 -0
- /package/dist/cli/{doctor-Y2E4MY2F.js.map → doctor-GI5LOEZL.js.map} +0 -0
- /package/dist/cli/{events-47HOT7ZA.js.map → events-LBKMLFM4.js.map} +0 -0
- /package/dist/cli/{mcp-76DK63ZB.js.map → mcp-DKEJK5ND.js.map} +0 -0
- /package/dist/cli/{mcp-inspect-BL5DEO5M.js.map → mcp-inspect-MTABNHVM.js.map} +0 -0
- /package/dist/cli/{prompt-JLATI3P7.js.map → prompt-ATI7DKHF.js.map} +0 -0
- /package/dist/cli/{prune-sessions-WHZDFUKD.js.map → prune-sessions-YQQSZTZS.js.map} +0 -0
- /package/dist/cli/{run-SXNCPRJE.js.map → run-HFPRNWJY.js.map} +0 -0
- /package/dist/cli/{server-GEHOE6CO.js.map → server-UHKO2VVM.js.map} +0 -0
- /package/dist/cli/{sessions-EPBFYISL.js.map → sessions-IQEWWUH3.js.map} +0 -0
- /package/dist/cli/{stats-4WB4XHBP.js.map → stats-OFCGOQMZ.js.map} +0 -0
- /package/dist/cli/{version-4SP3DLLH.js.map → version-EODUFAAI.js.map} +0 -0
package/dashboard/dist/app.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
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":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":{await _("modal",{method:"POST",body:JSON.stringify({id:t.id,response:t.response})}).catch(()=>{});break}case"choice_response":{await _("modal",{method:"POST",body:JSON.stringify({id:t.id,response:t.response})}).catch(()=>{});break}case"plan_response":{await _("modal",{method:"POST",body:JSON.stringify({id:t.id,response:t.response})}).catch(()=>{});break}case"checkpoint_response":{await _("modal",{method:"POST",body:JSON.stringify({id:t.id,response:t.response})}).catch(()=>{});break}case"revision_response":{await _("modal",{method:"POST",body:JSON.stringify({id:t.id,response:t.response})}).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 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=[`分析用户的输入内容。
|
|
2
2
|
`,`用户要求提供自适应 UI 重构的验证指令。
|
|
3
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 开发预览阶段**,
|
|
4
4
|
`,"您可以使用 `npm run dev` 启动 Vite 开发服务,\n",`配合 Chrome 设备模拟器或真实手机进行移动端自适应效果验证。
|
|
@@ -13,7 +13,7 @@ import{r as l,j as e,c as Yn}from"./vendor-react.js";import"./vendor-katex.js";i
|
|
|
13
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
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(`
|
|
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"$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
|
|
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
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}
|
|
18
18
|
|
|
19
19
|
${s.text}`:s.kind==="assistant"?`### Reasonix
|
|
@@ -39,7 +39,7 @@ ${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}),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}),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 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(`
|
|
43
43
|
|
|
44
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(`
|
|
45
45
|
|