blade-code 0.10.158 → 0.10.160
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/dist/blade.js +2 -2
- package/dist/{chunk-jcq3tk8c.js → chunk-2ffyr4zh.js} +1 -1
- package/dist/{chunk-xxd3vx1j.js → chunk-4c13mnh8.js} +1 -1
- package/dist/{chunk-ccsgzyth.js → chunk-4n0efk4n.js} +1 -1
- package/dist/{chunk-7h3405ty.js → chunk-5f40659e.js} +1 -1
- package/dist/{chunk-4gsjcz7t.js → chunk-5xnht5vw.js} +1 -1
- package/dist/{chunk-a9fjtdsh.js → chunk-6112ra8v.js} +1 -1
- package/dist/{chunk-479y73j2.js → chunk-6c7v7ny5.js} +1 -1
- package/dist/{chunk-vs8ywzme.js → chunk-6s037nx9.js} +1 -1
- package/dist/{chunk-6htg4eyc.js → chunk-70hjk2jn.js} +1 -1
- package/dist/{chunk-95z104ay.js → chunk-7bexc9c3.js} +2 -2
- package/dist/{chunk-fp7ssc21.js → chunk-7rjft1z9.js} +1 -1
- package/dist/{chunk-tfebp09g.js → chunk-7ss9htq0.js} +1 -1
- package/dist/{chunk-pz0d6ne3.js → chunk-9q26ss92.js} +1 -1
- package/dist/{chunk-hamdqef9.js → chunk-9zvxdc7t.js} +1 -1
- package/dist/{chunk-bgc4wts7.js → chunk-a5r7c1n4.js} +1 -1
- package/dist/{chunk-jdmm68kd.js → chunk-bz9e9hj8.js} +1 -1
- package/dist/chunk-dav8ngkr.js +1 -0
- package/dist/{chunk-vg6m8ybn.js → chunk-e07acz8d.js} +1 -1
- package/dist/chunk-er7r2abv.js +1 -0
- package/dist/{chunk-kxz7j4a3.js → chunk-erext256.js} +1 -1
- package/dist/{chunk-xh3bm0p0.js → chunk-fhsvz4b1.js} +1 -1
- package/dist/{chunk-v7b7dx9j.js → chunk-g7pwwxvz.js} +1 -1
- package/dist/{chunk-ehdsj506.js → chunk-gmmhpp0k.js} +3 -3
- package/dist/{chunk-f6wx6sf2.js → chunk-hj1c3k0m.js} +1 -1
- package/dist/{chunk-7z31ajj4.js → chunk-hs56jgkm.js} +1 -1
- package/dist/{chunk-ej0a0s1t.js → chunk-kenxyanc.js} +1 -1
- package/dist/{chunk-26109k8r.js → chunk-kr5w8q8v.js} +1 -1
- package/dist/{chunk-p5k6x3be.js → chunk-p2r4svss.js} +1 -1
- package/dist/{chunk-6zzet05f.js → chunk-qzxj1gvs.js} +1 -1
- package/dist/{chunk-25z7w7jb.js → chunk-r95wa6vn.js} +1 -1
- package/dist/chunk-sn2bqttf.js +171 -0
- package/dist/{chunk-1329rzdd.js → chunk-wsa7g7vd.js} +1 -1
- package/dist/{chunk-pnfeyw0g.js → chunk-xgyx1hwx.js} +1 -1
- package/dist/{chunk-vq1myd58.js → chunk-y0vdq8h3.js} +1 -1
- package/dist/{chunk-gnjsdr40.js → chunk-yh34b6z0.js} +1 -1
- package/dist/{chunk-mm5rqxam.js → chunk-yx6kf3s7.js} +1 -1
- package/dist/{chunk-jxxvc3b0.js → chunk-zn9tdkrq.js} +1 -1
- package/dist/{chunk-thveee78.js → chunk-zv01qe34.js} +1 -1
- package/dist/web/assets/{ChatView-D9Rgy4Xd.js → ChatView-DYpMrwtA.js} +4 -4
- package/dist/web/assets/{CodeBlockHighlighter-D2xmVZ64.js → CodeBlockHighlighter-BpPOUcO7.js} +1 -1
- package/dist/web/assets/{FilePreview-DNvYgNjf.js → FilePreview-DXGkgNrQ.js} +1 -1
- package/dist/web/assets/{KanbanBoard-DHsb2qNL.js → KanbanBoard-MYvqGgQH.js} +1 -1
- package/dist/web/assets/{MarkdownRenderer-DaQIOCqh.js → MarkdownRenderer-CXDrI3kX.js} +3 -3
- package/dist/web/assets/{ScrollArea-CMTG2oYB.js → ScrollArea-DocDa_rN.js} +1 -1
- package/dist/web/assets/{SessionHistorySurface-B5W8o5Ac.js → SessionHistorySurface-D4Hxlpnr.js} +1 -1
- package/dist/web/assets/{SettingsModal-CoIGqfB8.js → SettingsModal-ROSA92Eo.js} +1 -1
- package/dist/web/assets/{Sidebar-Bp-rTtWG.js → Sidebar-ByhqdRdj.js} +1 -1
- package/dist/web/assets/TaskSwitcher-Dbo20Tim.js +26 -0
- package/dist/web/assets/{TerminalPanel-1SkToIB-.js → TerminalPanel-czvVuMgl.js} +1 -1
- package/dist/web/assets/{archive-VQ-zwIBp.js → archive-BwNnCDDQ.js} +1 -1
- package/dist/web/assets/{arrow-left-CNl5Vg6X.js → arrow-left-Dc9lvaeD.js} +1 -1
- package/dist/web/assets/{calendar-clock-B_VagIW-.js → calendar-clock-o0GyQ0Np.js} +1 -1
- package/dist/web/assets/{chevron-right-rbUP1NBz.js → chevron-right-CgHjrrmB.js} +1 -1
- package/dist/web/assets/{chevrons-up-down-DSWrXgFD.js → chevrons-up-down-zQ_UZWV9.js} +1 -1
- package/dist/web/assets/{clock-3-B7G3JFdh.js → clock-3-BB58ITKo.js} +1 -1
- package/dist/web/assets/{copy-BSAC3Lqd.js → copy-o_KiXkAh.js} +1 -1
- package/dist/web/assets/{download-Da_UuSK6.js → download-BBtK3WHk.js} +1 -1
- package/dist/web/assets/{external-link-RaJbv6zJ.js → external-link-smSBd9oE.js} +1 -1
- package/dist/web/assets/{folder-BDc_dntN.js → folder-BJP6kIlC.js} +1 -1
- package/dist/web/assets/{index-Cqil5mhT.js → index-pqMcowCZ.js} +3 -3
- package/dist/web/assets/{pause-DcqIkSCj.js → pause-yqaK1hvk.js} +1 -1
- package/dist/web/assets/{pencil-CuEcqcGd.js → pencil-BZbDnyg2.js} +1 -1
- package/dist/web/assets/{play-D-6oneXl.js → play-WQ7288Ky.js} +1 -1
- package/dist/web/assets/{plus-BszxRz9B.js → plus-veQ2IAZx.js} +1 -1
- package/dist/web/assets/{settings-C2nXcRY-.js → settings-B8xvrdSb.js} +1 -1
- package/dist/web/assets/{team-CWZp-rb4.js → team-BrF46S7E.js} +1 -1
- package/dist/web/assets/{teamService-Dyi2wFpb.js → teamService-fDnXqw4L.js} +1 -1
- package/dist/web/assets/{terminal-ZQmTPaBq.js → terminal-BrqsCKf2.js} +1 -1
- package/dist/web/index.html +1 -1
- package/package.json +1 -1
- package/dist/chunk-5kb1dh44.js +0 -1
- package/dist/chunk-9hmjg0k7.js +0 -1
- package/dist/chunk-y1t2tvmq.js +0 -171
- package/dist/web/assets/TaskSwitcher-BHlCaj6w.js +0 -26
package/dist/chunk-y1t2tvmq.js
DELETED
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
import{e as $5,f as J5,h as S$,i as M4}from"./chunk-vg6m8ybn.js";import{l as $X,m as JX,n as YX}from"./chunk-ej0a0s1t.js";import{A as q4,y as A9,z as b9}from"./chunk-xxd3vx1j.js";import{Ba as XY,Da as uY,I as cY,M as HX,O as h6,P as R6,Q as vY,W as wY,X as PY,_ as AY,ca as l$,ea as y9,fa as I9,ha as bY,ja as Q8,ka as L5,la as B5,oa as w5,pa as P5,ta as lJ,ua as B3,wa as H3,xa as F3,ya as FX,za as ZY}from"./chunk-ehdsj506.js";import"./chunk-zrgfvc4k.js";import{La as EZ,Ma as hZ,Na as gZ,Qa as WX}from"./chunk-ccsgzyth.js";import{Sa as BY}from"./chunk-ht8epjz2.js";import{Lb as FY,Mb as F4,Yb as LY,gc as P6}from"./chunk-bgc4wts7.js";import{rc as z8}from"./chunk-wm896gnx.js";import{Bd as zY,Ld as P9,Md as V2,Qd as R9,Vd as C9,Xd as t8,de as X8,ge as a0}from"./chunk-f6wx6sf2.js";import"./chunk-9xbwtjac.js";import{Ke as D9,Le as w6,Me as f9}from"./chunk-vz13c7fr.js";import{hf as e9,if as G4}from"./chunk-fx9vm1n5.js";import{vf as s5}from"./chunk-v67st2xb.js";import{wf as q8,xf as _4,zf as $1}from"./chunk-6htg4eyc.js";import"./chunk-v1mamd1x.js";import{Df as M2,Ef as F$,Ff as l1,Gf as UJ,Hf as o8,If as M9,Jf as t3,Kf as CJ,Lf as rZ,Mf as s3,Nf as k2,Of as m0,Pf as OX,Qf as L$,Rf as t5,Sf as a4,Tf as U8,Wf as s9,bg as z$}from"./chunk-pnfeyw0g.js";import"./chunk-v508x7cg.js";import"./chunk-7xhw74hk.js";import"./chunk-k1tfry97.js";import"./chunk-f2y0gxyq.js";import{tg as yJ}from"./chunk-k3ne93k8.js";import"./chunk-7wcxjbyg.js";import"./chunk-kxz7j4a3.js";import{Gg as H4,Ig as g5,Ng as F5,Wg as NX}from"./chunk-gnjsdr40.js";import"./chunk-ewwrss2w.js";import"./chunk-53vh6vpt.js";import"./chunk-hv8nt7wj.js";import"./chunk-erhaedch.js";import{wh as qJ,yh as E$}from"./chunk-v7b7dx9j.js";import"./chunk-28tzj187.js";import{Li as qX,Qi as H5,Ri as _X}from"./chunk-4gsjcz7t.js";import{Ti as h9}from"./chunk-sd9bze9x.js";import{Ui as j2,Vi as e8,Xi as _J}from"./chunk-514va7ce.js";import{aj as K$}from"./chunk-jsv3e4k6.js";import"./chunk-n34qsnks.js";import{Cj as _1,zj as zX}from"./chunk-5q4z0sfr.js";import{Kj as tZ,Lj as sZ,Oj as b1}from"./chunk-0b67y4j1.js";import"./chunk-9kj19a8t.js";import{_j as xZ}from"./chunk-xh3bm0p0.js";import{bk as uJ}from"./chunk-gm2yfq3r.js";import"./chunk-n9819k4p.js";import{ek as Z8,yk as t9}from"./chunk-7xtxvrh8.js";import{Lk as Y4}from"./chunk-sdapqhj0.js";import{useMemoizedFn as Q6}from"ahooks";import{useEffect as Uz,useState as G6}from"react";import{useMemoizedFn as i0}from"ahooks";import o5 from"ansi-escapes";import{Box as j1,useStdout as $z}from"ink";import{useEffect as e$,useMemo as Jz,useRef as R2,useState as n5}from"react";import{useShallow as wX}from"zustand/react/shallow";import{useStore as BX}from"zustand";function q0($){return BX(k2,$)}var PX=[],D2=()=>q0(($)=>$.session.sessionId),q1=()=>q0(($)=>$.session.workspaceRoot),f8=()=>q0(($)=>$.session.messages),rJ=()=>q0(($)=>$.session.clearCount),aJ=()=>q0(($)=>$.session.isCompacting),iJ=()=>q0(($)=>$.session.tokenUsage.estimatedCostUsd),oJ=()=>q0(($)=>{let{totalInputTokens:J,cacheReadTokens:Y,cacheWriteTokens:X}=$.session.tokenUsage;return lJ({totalInputTokens:J,cacheReadTokens:Y,cacheWriteTokens:X}).hitRate});var v8=()=>q0(($)=>$.session.providerRecovery),nJ=()=>q0(($)=>$.session.turnActivity),tJ=()=>q0(($)=>$.session.actionStationarity),p1=()=>q0(($)=>$.session.actions),sJ=()=>q0(($)=>{let{totalTokens:J,maxContextTokens:Y}=$.session.tokenUsage;if(Y<=0)return 100;let X=Math.max(0,100-J/Y*100);return Math.round(X)}),eJ=()=>q0(($)=>$.app.initializationStatus),$9=()=>q0(($)=>$.app.initializationError),V8=()=>q0(($)=>$.app.activeModal),J9=()=>q0(($)=>$.app.tasks),Y9=()=>q0(($)=>$.app.modelEditorTarget),Z9=()=>q0(($)=>$.app.sessionSelectorData),X9=()=>q0(($)=>$.app.sessionHistoryViewerData),Q9=()=>q0(($)=>$.app.taskAttentionStatus),j8=()=>q0(($)=>$.app.taskAttentionUnreadKeys),G9=()=>q0(($)=>$.app.awaitingSecondCtrlC),x1=()=>q0(($)=>$.app.actions),E8=()=>q0(($)=>$.app.sideConversation),U9=()=>q0(($)=>$.app.teams),h8=()=>q0(($)=>$.app.initializationStatus==="ready"),K9=()=>q0(($)=>$.app.tasks.length>0),f2=()=>q0(($)=>$.config.config?.permissionMode||"default"),z9=()=>q0(($)=>$.config.config?.models??PX),g8=()=>q0(($)=>{let J=$.config.config;if(!J)return;let Y=J.currentModelId;return J.models.find((Z)=>Z.id===Y)??J.models[0]}),m8=()=>q0(($)=>$.config.config?.currentModelId),q9=()=>q0(($)=>$.config.config?.agentTeamsEnabled===!0),D0=()=>q0(($)=>{return F$.getTheme()}),_9=()=>q0(($)=>$.config.config?.codeTheme??"default"),X$=()=>q0(($)=>$.focus.currentFocus),O9=()=>q0(($)=>$.focus.actions),v2=()=>q0(($)=>$.command.isProcessing),N9=()=>q0(($)=>$.command.actions),p8=()=>q0(($)=>$.app.followUpQueue),W9=()=>q0(($)=>$.app.followUpQueueMutation),H9=()=>q0(($)=>$.command.recoveredSteeringCount),x8=()=>q0(($)=>$.app.reasoningEffort!=="off"),c8=()=>q0(($)=>$.app.reasoningEffort),u8=()=>q0(($)=>$.app.serviceTier),d8=()=>q0(($)=>$.app.responseVerbosity),l8=()=>q0(($)=>$.app.communicationStyle),r8=()=>q0(($)=>$.session.currentThinkingContent),F9=()=>q0(($)=>$.session.thinkingExpanded),a8=()=>q0(($)=>$.session.currentStreamingMessageId),i8=()=>q0(wX(($)=>({lines:$.session.currentStreamingLines,tail:$.session.currentStreamingTail,lineCount:$.session.currentStreamingLineCount,version:$.session.currentStreamingVersion}))),L9=()=>q0(($)=>$.session.finalizingStreamingMessageId),B9=()=>q0(($)=>$.session.historyExpanded),w9=()=>q0(($)=>$.session.expandedMessageCount);import{randomUUID as O7}from"node:crypto";import{useMemoizedFn as J1}from"ahooks";import{useEffect as u1,useMemo as WY,useRef as N4}from"react";function AX($,J){try{return $.code===J.code&&$.message===J.message&&$.retryable===J.retryable&&$.resource===J.resource}catch{return!1}}class K6{options;requested=!1;waitingForIdle=!1;disposed=!1;generation=0;wakeEpoch=0;idleEpoch=0;attempt=0;recoveryStartedAt=null;scheduledToken=null;activeAttemptToken=null;activeRunController=null;retryTimer=null;deadlineTimer=null;now;scheduleCallback;setTimerCallback;clearTimerCallback;constructor($){this.options=$;this.now=$.now??Date.now,this.scheduleCallback=$.scheduleMicrotask??queueMicrotask,this.setTimerCallback=$.setTimer??setTimeout,this.clearTimerCallback=$.clearTimer??clearTimeout}request(){if(this.disposed)return;if(this.wakeEpoch++,this.requested=!0,this.waitingForIdle||this.retryTimer)return;this.scheduleIfRunnable()}notifyIdle(){if(this.disposed)return;if(this.idleEpoch++,this.retryTimer)return;this.waitingForIdle=!1,this.scheduleIfRunnable()}dispose(){if(this.disposed)return;this.disposed=!0,this.generation++,this.requested=!1,this.waitingForIdle=!1,this.scheduledToken=null,this.clearOwnedTimer("retry"),this.clearOwnedTimer("deadline"),this.activeAttemptToken=null;let $=this.activeRunController;this.activeRunController=null,$?.abort("pending-resume-coordinator-disposed"),this.resetEpisodeBudget()}scheduleIfRunnable(){if(this.disposed||!this.requested||this.scheduledToken||this.activeAttemptToken||this.retryTimer||this.waitingForIdle)return;if(!this.options.canRun()){this.waitingForIdle=!0;return}let $=this.generation,J={};this.scheduledToken=J;try{this.scheduleCallback(()=>{if(this.disposed||$!==this.generation||this.scheduledToken!==J)return;this.scheduledToken=null,this.flush($).catch((Y)=>{this.handleUnexpectedFailure(Y,$)})})}catch(Y){this.handleUnexpectedFailure(Y,$)}}async flush($){if(this.disposed||$!==this.generation||this.activeAttemptToken||!this.requested||this.retryTimer||this.waitingForIdle)return;if(!this.options.canRun()){this.waitingForIdle=!0;return}let J={},Y=new AbortController,X=this.wakeEpoch,Z=this.idleEpoch;if(this.attempt++,this.recoveryStartedAt===null)this.recoveryStartedAt=this.now(),this.installDeadlineTimer($);this.activeAttemptToken=J,this.activeRunController=Y;let Q=await this.options.run(Y.signal);if(this.disposed||$!==this.generation||this.activeAttemptToken!==J)return;if(this.activeAttemptToken=null,this.activeRunController=null,Q.status==="completed"){let G=this.wakeEpoch!==X;if(this.clearEpisode(),G)this.requested=!0,this.scheduleIfRunnable();return}if(Q.status==="deferred"){if(this.attempt--,this.attempt===0)this.clearOwnedTimer("deadline"),this.resetEpisodeBudget();if(this.requested=!0,this.idleEpoch!==Z)this.waitingForIdle=!1,this.scheduleIfRunnable();else this.waitingForIdle=!0;return}this.handleFailure(Q,$)}handleFailure($,J){let Y=V2($.taskFailure),X=this.options.sessionIdentity;if($.workKind!=="pending_input"||!$.evidence||!X||!AX($.taskFailure,$.evidence.taskFailure)){this.terminate("failed",this.attempt,Y);return}let Z=b9({sessionIdentity:X,failedAttempt:this.attempt,recoveryStartedAt:this.recoveryStartedAt??this.now(),now:this.now(),workStillPending:$.workStillPending,evidence:$.evidence});if(Z.phase!=="retry_scheduled"){this.terminate(Z.phase,this.attempt,Y);return}this.requested=!0,this.waitingForIdle=!1;let Q={},G=this.setTimerCallback(()=>{if(this.disposed||J!==this.generation||this.retryTimer?.token!==Q)return;this.retryTimer=null,this.scheduleIfRunnable()},Z.delayMs);this.retryTimer={handle:G,token:Q},G.unref?.()}handleUnexpectedFailure($,J){if(this.disposed||J!==this.generation)return;this.terminate("failed",Math.max(1,this.attempt),V2($),"pending-resume-coordinator-failed")}installDeadlineTimer($){let J={},Y=this.setTimerCallback(()=>{if(this.disposed||$!==this.generation||this.deadlineTimer?.token!==J)return;this.deadlineTimer=null,this.terminate("exhausted",Math.max(1,this.attempt),P9("timeout"),"pending-resume-recovery-deadline-exceeded")},A9);this.deadlineTimer={handle:Y,token:J},Y.unref?.()}terminate($,J,Y,X){let Z=this.activeRunController;if(this.generation++,this.requested=!1,this.waitingForIdle=!1,this.scheduledToken=null,this.activeAttemptToken=null,this.activeRunController=null,this.clearOwnedTimer("retry"),this.clearOwnedTimer("deadline"),this.resetEpisodeBudget(),X)Z?.abort(X);try{this.options.onTerminalFailure?.({phase:$,attempt:J,taskFailure:Y})}catch{}}clearEpisode(){this.requested=!1,this.waitingForIdle=!1,this.clearOwnedTimer("retry"),this.clearOwnedTimer("deadline"),this.resetEpisodeBudget()}resetEpisodeBudget(){this.attempt=0,this.recoveryStartedAt=null}clearOwnedTimer($){let J=$==="retry"?this.retryTimer:this.deadlineTimer;if(!J)return;if($==="retry")this.retryTimer=null;else this.deadlineTimer=null;this.clearTimerCallback(J.handle)}}class J8{options;finalized=!1;constructor($){this.options=$}get isFinalized(){return this.finalized}acceptsDeltas(){return!this.finalized&&!this.options.signal.aborted}startTurn(){this.finalized=!1}finalize(){if(!this.acceptsDeltas())return!1;return this.finalized=!0,this.commit(this.options.streamingBuffer.drainPendingBuffers()),!0}abortAndFinalize($){if(this.finalized)return $(),!1;this.finalized=!0;let J=this.options.streamingBuffer.drainPendingBuffers();return $(),this.commit(J),!0}discard(){this.finalized=!0,this.options.streamingBuffer.resetStreamingBuffers(),this.options.discardStreamingMessage(),this.options.clearThinking()}commit($){let J=this.options.getStreamingMessageId();if(J){if($.extraContent)o8(J,$.extraContent);M9(J)}this.options.finalizeStreamingMessage($.extraContent,$.extraThinking)}}function bX($){if(!($ instanceof Error))return"未知错误";let X=$.lastError??$;if(X.responseBody)try{let G=JSON.parse(X.responseBody)?.error?.message;if(G){let U=X.statusCode?` (HTTP ${X.statusCode})`:"";return`${G}${U}`}}catch{}let Z=$.message.match(/Last error:\s*(.+)$/);if(Z)return Z[1];return $.message}function MX($){if(!($ instanceof Error))return!1;return $.name==="AbortError"||$.message.includes("aborted")}function TX($){if(!($ instanceof Error))return!1;let J=$.message;return J.includes("can only concatenate str")||J.includes("image_url")||J.includes("multimodal")||J.includes("vision")||J.includes("does not support images")}function n8($){let J=MX($),Y=TX($),X;if(Y)X="当前模型不支持图片理解功能。请切换到支持视觉能力的模型(如 Claude 4.5、GPT-5.2、Gemini 3 Pro、Qwen3-VL-Plus 等)后重试。";else X=bX($);return{displayMessage:X,isAbort:J,isVisionNotSupported:Y}}import{appendFileSync as RX,mkdirSync as CX,writeFileSync as yX}from"node:fs";import IX from"node:os";import z6 from"node:path";var T9=null;function SX(){let $=process.env.BLADE_STORAGE_ROOT||z6.join(IX.homedir(),".blade");return z6.join($,"logs","stream-debug.log")}function kX($){if(T9===$)return;let J=z6.dirname($);CX(J,{recursive:!0,mode:493}),yX($,`=== Stream Debug Log Started: ${new Date().toISOString()} ===
|
|
2
|
-
`),T9=$}function q6($,J,Y){try{let X=SX();kX(X);let Z=new Date().toISOString(),Q=Y?` | ${JSON.stringify(Y)}`:"",G=`[${Z}] [${$}] ${J}${Q}
|
|
3
|
-
`;RX(X,G)}catch{}}var Y8=_1("UI");function _6($,J){if(J.state==="requires_attention"){let Y=J.reason==="interrupted_tool_call";$.addToolMessage("Turn recovery requires attention",{toolName:"Runtime Recovery",phase:"complete",summary:Y?"An interrupted tool may have partially completed":"A completed tool may already have changed external state",detail:`${J.turnId} · inspect workspace, processes, and external state before retrying`});return}$.addToolMessage(J.state==="completed"?"Recovered completed turn":"Resuming interrupted turn",{toolName:"Runtime Recovery",phase:"complete",summary:J.state==="completed"?"The durable final response was recovered":"No tool execution was recorded before interruption",detail:J.turnId})}function S9($,J){let Y=$.streamSession??new J8({signal:$.signal,streamingBuffer:$.streamingBuffer,getStreamingMessageId:$.getStreamingMessageId,finalizeStreamingMessage:$.sessionActions.finalizeStreamingMessage,discardStreamingMessage:$.sessionActions.discardStreamingMessage,clearThinking:()=>$.sessionActions.setCurrentThinkingContent(null)}),X=(Z)=>{for(let Q of Z){if((Q.origin??"user")!=="user")continue;let G=$.commandActions.takeFollowUpPresentation(Q.id);if(G){$.sessionActions.addUserMessage(G.displayText);continue}if(!Q.recovered||Q.persisted)continue;let U=typeof Q.content==="string"?Q.content:Q.content.map((z)=>z.type==="text"?z.text:"[Image]").join(`
|
|
4
|
-
`);$.sessionActions.addUserMessage(U)}};return(Z)=>{switch(Z.kind){case"content_delta":if(Z.delta.length>0)J.outputStarted=!0;if(!Y.acceptsDeltas())break;J.contentDeltaCount++,J.contentDeltaTotalLen+=Z.delta.length,q6("loopEventHandler","onContentDelta",{callCount:J.contentDeltaCount,deltaLen:Z.delta.length,totalLen:J.contentDeltaTotalLen}),$.streamingBuffer.batchAppendContent(Z.delta);break;case"thinking_delta":if(Z.delta.length>0)J.outputStarted=!0;if(!Y.acceptsDeltas())break;if($.thinkingModeEnabled)$.streamingBuffer.batchAppendThinking(Z.delta);break;case"stream_end":{$.sessionActions.setProviderCircuit(null),$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),Y8.debug("[loopEventHandler] stream_end",{contentDeltaCount:J.contentDeltaCount,contentDeltaTotalLen:J.contentDeltaTotalLen,streamFinalized:Y.isFinalized,signalAborted:$.signal.aborted}),q6("loopEventHandler","onStreamEnd",{contentDeltaCallCount:J.contentDeltaCount,contentDeltaTotalLen:J.contentDeltaTotalLen,streamFinalized:Y.isFinalized,signalAborted:$.signal.aborted}),Y.finalize();break}case"model_fallback":$.sessionActions.setProviderAdmission(null),$.sessionActions.setProviderCircuit(null),$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),Y.discard();break;case"provider_admission":{let{kind:Q,...G}=Z;$.sessionActions.setProviderAdmission(Z.phase==="queued"?G:null);break}case"provider_circuit":{let{kind:Q,...G}=Z;$.sessionActions.setProviderCircuit(Z.phase==="closed"?null:G);break}case"provider_retry":{let{kind:Q,...G}=Z;$.sessionActions.setProviderRetry(Z.phase==="recovered"?null:G);break}case"provider_stall":{let{kind:Q,...G}=Z;$.sessionActions.setProviderStall(Z.phase==="detected"?G:null);break}case"provider_recovery":$.sessionActions.setProviderRecovery(Z.recovery);break;case"action_stationarity":{let{kind:Q,...G}=Z;$.sessionActions.setActionStationarity(Z.phase==="recovered"?null:G);break}case"turn_recovery":{_6($.sessionActions,Z.assessment);break}case"tool_start":{J.toolExecutionStarted=!0;let Q=Z.toolCall;if(!("function"in Q))break;if(Q.function.name===t8)break;if(Y8.debug("[loopEventHandler] tool_start",{toolName:Q.function.name,toolKind:Z.toolKind}),["TaskCreate","TaskUpdate","TaskList"].includes(Q.function.name))break;try{let G=JSON.parse(Q.function.arguments),U=y9(Q.function.name,G);$.sessionActions.addToolMessage(U,{toolCallId:Q.id,toolName:Q.function.name,phase:"start",summary:U,params:G})}catch(G){Y8.error("[loopEventHandler] onToolStart error:",G)}break}case"tool_progress":{J.toolExecutionStarted=!0;let Q=Z.toolCall;if(!("function"in Q))break;if(Q.function.name===t8)break;let G=Z.update.total!==void 0?` ${Math.max(0,Math.min(100,Math.round((Z.update.progress??0)/Z.update.total*100)))}%`:"",U=`${Q.function.name}${G}: ${Z.update.message}`;$.sessionActions.addToolMessage(U,{toolCallId:Q.id,toolName:Q.function.name,phase:"progress",summary:U,...Z.update.admission?{admission:Z.update.admission}:{}});break}case"tool_result":{J.toolExecutionStarted=!0;let Q=Z.toolCall;if(!("function"in Q))break;if(Q.function.name===t8)break;Y8.debug("[loopEventHandler] tool_result",{toolName:Q.function.name,success:Z.result.success});let G=C9(I9(Q.function.name,Z.result),R9);$.sessionActions.addToolMessage(G.summary,{toolCallId:Q.id,toolName:Q.function.name,phase:"complete",summary:G.summary,detail:G.detail});break}case"structured_output":J.outputStarted=!0,$.sessionActions.replaceLastAssistantMessage(JSON.stringify(Z.output,null,2));break;case"token_usage":$.sessionActions.updateTokenUsage(Z.usage);break;case"compaction":if($.sessionActions.setCompacting(Z.phase==="start"),Z.phase==="end"){if($.sessionActions.resetContextUsage(),Z.outcome!=="failed")J.compactionCount=(J.compactionCount??0)+1;if(Z.memory?.outcome==="written"){let Q=`Saved ${Z.memory.entries} project memories`;$.sessionActions.addToolMessage(Q,{toolName:"Project Memory",phase:"complete",summary:Q})}}break;case"turn_start":Y8.debug("[loopEventHandler] turn_start",{turn:Z.turn,maxTurns:Z.maxTurns}),$.sessionActions.updateTokenUsage({turnCount:Z.turn}),$.sessionActions.setProviderCircuit(null),$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),Y.startTurn();break;case"task_update":$.appActions.setTasks(Z.tasks);break;case"goal_frontier_updated":$.appActions.setTasks(Z.tasks);break;case"mcp_catalog_changed":{let Q=`MCP catalog r${Z.revision}: +${Z.added.length} -${Z.removed.length} ~${Z.updated.length}`;$.sessionActions.addToolMessage(Q,{toolName:"MCP Catalog",phase:"complete",summary:Q,detail:[Z.added.length>0?`Added: ${Z.added.join(", ")}`:"",Z.removed.length>0?`Removed: ${Z.removed.join(", ")}`:"",Z.updated.length>0?`Updated: ${Z.updated.join(", ")}`:""].filter(Boolean).join(`
|
|
5
|
-
`)});break}case"mcp_content_changed":{let Q=`MCP ${Z.contentKind} r${Z.revision}: +${Z.added.length} -${Z.removed.length} ~${Z.updated.length}`;$.sessionActions.addToolMessage(Q,{toolName:"MCP Content",phase:"complete",summary:Q,detail:[Z.added.length>0?`Added: ${Z.added.join(", ")}`:"",Z.removed.length>0?`Removed: ${Z.removed.join(", ")}`:"",Z.updated.length>0?`Updated: ${Z.updated.join(", ")}`:""].filter(Boolean).join(`
|
|
6
|
-
`)});break}case"mcp_resource_updated":{let Q=`MCP resource updated: ${Z.uri}`;$.sessionActions.addToolMessage(Q,{toolName:"MCP Resource",phase:"progress",summary:Q,detail:`${Z.serverName} · revision ${Z.revision}`});break}case"mcp_connection_changed":{let Q=Z.phase==="reconnecting"?"recovering":Z.phase==="recovered"?"recovered":"recovery failed",G=`MCP ${Z.serverName} ${Q}`+(Z.phase==="reconnecting"?` (${Z.attempt}/${Z.maxAttempts})`:"");$.sessionActions.addToolMessage(G,{toolName:"MCP Connection",phase:"complete",summary:G,detail:[`reason: ${Z.reason}`,`revision: ${Z.revision}`,Z.error?`error: ${Z.error}`:""].filter(Boolean).join(`
|
|
7
|
-
`)});break}case"mcp_log":{let Q=Z.logger?`${Z.serverName} · ${Z.logger}`:Z.serverName,G=`MCP ${Z.level} · ${Q}`;$.sessionActions.addToolMessage(G,{toolName:"MCP Log",phase:"complete",summary:G,detail:[Z.message,`revision: ${Z.revision}`,`sha256: ${Z.dataSha256}`,Z.truncated?"truncated: true":"",Z.detailsOmitted?"details omitted by runtime policy":""].filter(Boolean).join(`
|
|
8
|
-
`)});break}case"mcp_instructions_changed":{let Q=`MCP instructions ${Z.action}: ${Z.serverName}`+(Z.truncated?" (truncated)":"");$.sessionActions.addToolMessage(Q,{toolName:"MCP Instructions",phase:"complete",summary:Q,detail:[Z.text??"",Z.sha256?`sha256: ${Z.sha256}`:"",Z.detailsOmitted?"details omitted by runtime policy":""].filter(Boolean).join(`
|
|
9
|
-
`)});break}case"mcp_task_changed":{let Q=`MCP task ${Z.status}: ${Z.taskId} (${Z.serverName}/${Z.toolName})`;$.sessionActions.addToolMessage(Q,{toolName:"MCP Task",phase:"complete",summary:Q,detail:[Z.statusMessage??"",`revision: ${Z.revision}`,Z.hasResult?"result available via TaskOutput":"",Z.error?`error: ${Z.error}`:""].filter(Boolean).join(`
|
|
10
|
-
`)});break}case"project_rules_loaded":{let Q=`Project rules loaded: ${Z.files.length}`+(Z.blockedWrite?" (write retry required)":"");$.sessionActions.addToolMessage(Q,{toolName:"Project Rules",phase:"complete",summary:Q,detail:Z.files.map((G)=>`${G.relativePath} ${G.source} sha256=${G.contentSha256}`).join(`
|
|
11
|
-
`)});break}case"steering_applied":if(X(Z.messages),$.appActions.projectFollowUpQueue(Z.queue,$.followUpQueueOwner),Z.recovered>0)$.commandActions.setRecoveredSteeringCount(Z.recovered);break;case"follow_up_started":if($.appActions.projectFollowUpQueue(Z.queue,$.followUpQueueOwner),Z.recovered>0)$.commandActions.setRecoveredSteeringCount(Z.recovered);break;case"follow_up_queue_changed":$.appActions.projectFollowUpQueue(Z.queue,$.followUpQueueOwner);break;case"goal_updated":case"goal_continuation_started":break;case"turn_activity":$.sessionActions.setTurnActivity(Z.activity);break;case"subagent_spawned":case"subagent_completed":break;default:{let Q=Z}}}}function O6($){let{text:J,parts:Y}=$,X=Y.filter((G)=>G.type==="image");if(X.length===0)return J;if(X.length>j2)throw Error(`最多只能发送 ${j2} 张图片`);if(X.reduce((G,U)=>G+`data:${U.mimeType};base64,`.length+U.base64.length,0)>e8)throw Error("图片编码后总大小不能超过 5 MiB");let Q=[];for(let G of Y)if(G.type==="text")Q.push({type:"text",text:G.text});else Q.push({type:"image_url",image_url:{url:`data:${G.mimeType};base64,${G.base64}`}});return Q}function k9($){let J=f9($.metadata);return{role:$.role,content:J?D9(J):$.content,...$.metadata?{metadata:$.metadata}:{}}}function $4($){if(!$.restoredContextMessages||$.restoredVisibleMessageCount<=0)return $.messages.map(k9);let J=$.messages.slice($.restoredVisibleMessageCount).map(k9);return[...$.restoredContextMessages,...J]}import sX from"node:path";import{basename as aX}from"node:path";import{createHash as DX}from"node:crypto";import*as X2 from"node:fs/promises";import*as Z4 from"node:path";import fX from"write-file-atomic";var N6=1,vX="tui-task-attention-v1.json",VX=/^[a-f0-9]{64}$/,jX=4194304,EX=20000,g9=1024,v9=256,hX=/^\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])T(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d\.\d{3}Z$/,gX={realpath:!1,retries:{retries:150,factor:1.2,minTimeout:10,maxTimeout:100,randomize:!0}},V9;class X4{static operations=new h9;filePath;writeFile;openFile;lockFile;chmodFile;reportDiagnostic;entries=[];pending=[];journalOverflowed=!1;constructor($={}){this.filePath=$.filePath??Z4.join(Z8(),vX),this.writeFile=$.writeFile??fX,this.openFile=$.openFile??X2.open,this.lockFile=$.lockFile??rX,this.chmodFile=$.chmodFile??X2.chmod,this.reportDiagnostic=$.reportDiagnostic??(()=>{return})}reconcile($,J){return this.mutate({kind:"reconcile",sessions:$,visibleLocator:J})}acknowledge($){return this.mutate({kind:"acknowledge",summary:$})}snapshot(){return J4(this.entries)}async mutate($){return X4.operations.runExclusive(this.filePath,async()=>{if(this.journalOverflowed||this.pending.length>=v9)return this.journalOverflowed=!0,this.entries=W6(this.entries,$),this.reportDiagnostic("TUI task attention persistence unavailable"),J4(this.entries);let J,Y,X=!1,Z=!1;try{await dX(this.filePath),J=await this.lockFile(this.filePath,{...gX,onCompromised:()=>{X=!0}});let Q=await uX(this.filePath,this.openFile);if(Y=mX(Q,[...this.pending,$]),this.entries=Y,X)throw Error("attention file lock compromised");let G=JSON.stringify({version:N6,entries:Y},null,2);if(await this.writeFile(this.filePath,G+`
|
|
12
|
-
`,{mode:384}),X)throw Error("attention file lock compromised");Z=!0,this.pending=[],await this.chmodFile(this.filePath,384)}catch{if(Z)return this.reportDiagnostic("TUI task attention persistence unavailable"),J4(this.entries);if(Y===void 0)Y=W6(this.entries,$),this.entries=Y;this.enqueue($),this.reportDiagnostic("TUI task attention persistence unavailable")}finally{if(J)try{await J()}catch{this.reportDiagnostic("TUI task attention persistence unavailable")}}return J4(this.entries)})}enqueue($){if(this.journalOverflowed)return;if(this.pending.length>=v9){this.journalOverflowed=!0;return}this.pending.push($)}}function mX($,J){return J.reduce((Y,X)=>{return W6(Y,X)},[...$])}function W6($,J){if(J.kind==="reconcile")return j9(pX($,J.sessions,J.visibleLocator));let Y=E2(J.summary.locator);return j9(m9($,{key:Y,signature:H6(J.summary),unread:!1}))}function pX($,J,Y){let X=new Map($.map((O)=>[O.key,O])),Z=new Set,Q=Y?E2(Y):void 0,G,U=[],z=[];for(let O of J){let q=E2(O.locator);if(Z.has(q))continue;Z.add(q);let N=H6(O);if(Q===q){G=O;continue}let _=X.get(q);if(!_){let H={key:q,signature:N,unread:!1};if(N===null)U.push(H);else z.push(H);continue}if(N===null){U.push({key:q,signature:null,unread:_.unread});continue}if(_.signature!==N){U.push({..._,unread:!0});continue}if(_.unread)U.push(_);else z.push(_)}let K=[...z.slice(0,g9).reverse(),...U.reverse()];if(G)K=m9(K,{key:E2(G.locator),signature:H6(G),unread:!1});return K}function j9($){let J=$.map((X,Z)=>({entry:X,index:Z})).filter(({entry:X})=>X.signature!==null&&!X.unread).map(({index:X})=>X),Y=new Set(J.slice(0,Math.max(0,J.length-g9)));return $.filter((X,Z)=>!Y.has(Z))}function m9($,J){return[...$.filter((Y)=>Y.key!==J.key),J]}function J4($){return Object.freeze({unreadKeys:Object.freeze($.filter((J)=>J.unread).map((J)=>J.key))})}function E2($){let J=$.workspace.kind==="local"?[2,"local",$.workspace.projectPath,$.sessionId]:[2,"acp-remote",$.workspace.workspaceRef,$.sessionId];return DX("sha256").update("blade-tui-task-attention-locator-v1\x00").update(JSON.stringify(J)).digest("hex")}function H6($){if($.taskStatus!=="completed"&&$.taskStatus!=="failed"&&$.taskStatus!=="interrupted")return null;return JSON.stringify([$.taskStatus,$.taskCompletedAt??null])}function xX($){try{let J=JSON.parse($);if(!Array.isArray(J)||J.length!==2||J[0]!=="completed"&&J[0]!=="failed"&&J[0]!=="interrupted")return!1;if(J[1]!==null&&(typeof J[1]!=="string"||!hX.test(J[1])||new Date(J[1]).toISOString()!==J[1]))return!1;return JSON.stringify(J)===$}catch{return!1}}function E9($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function cX($){if(!E9($)||Object.keys($).some((X)=>X!=="version"&&X!=="entries")||$.version!==N6||!Array.isArray($.entries)||$.entries.length>EX)return;let J=new Set,Y=[];for(let X of $.entries){if(!E9(X)||Object.keys(X).some((Z)=>Z!=="key"&&Z!=="signature"&&Z!=="unread")||typeof X.key!=="string"||!VX.test(X.key)||J.has(X.key)||X.signature!==null&&(typeof X.signature!=="string"||!xX(X.signature))||typeof X.unread!=="boolean")return;J.add(X.key),Y.push({key:X.key,signature:X.signature,unread:X.unread})}return{version:N6,entries:Y}}async function uX($,J){let Y;try{Y=await J($,"r");let X=await Y.readFile();if(X.byteLength>jX)return[];let Z=JSON.parse(X.toString("utf8"));return cX(Z)?.entries??[]}catch(X){if(X instanceof SyntaxError||X instanceof Error&&"code"in X&&X.code==="ENOENT")return[];throw X}finally{await Y?.close()}}async function dX($){let J=Z4.dirname($);await X2.mkdir(J,{recursive:!0,mode:448}),await X2.chmod(J,448)}async function lX(){return V9??=await import("proper-lockfile"),V9}async function rX($,J){return(await lX()).lock($,J)}function c1($){let{locator:J}=$;if(J.workspace.kind==="acp-remote")return[J.version,J.workspace.kind,J.workspace.workspaceRef,J.sessionId].join("\x00");return[J.version,J.workspace.kind,J.workspace.projectPath,J.sessionId].join("\x00")}function p9($){return E2($.locator)}async function x9($,J,Y){if(await $.start(),Y.continueSession||Y.resume!==void 0||Y.forkSession)return;if(Y.requestedSessionId!==void 0&&$.getState().status!=="ready")return;if(Y.requestedSessionId!==void 0&&$.getState().sessions.some((X)=>iX(X.locator,Y.locator)))return;await J.proveLocal(Y.locator)}function iX($,J){if($.sessionId!==J.sessionId||$.workspace.kind!==J.workspace.kind)return!1;return $.workspace.kind==="local"&&J.workspace.kind==="local"?$.workspace.projectPath===J.workspace.projectPath:$.workspace.kind==="acp-remote"&&J.workspace.kind==="acp-remote"&&$.workspace.workspaceRef===J.workspace.workspaceRef}async function oX($,J,Y,X){if($==="resume"){await Y.acknowledge(J),await Y.setVisibleLocator(J.locator);return}if(X)await Y.setVisibleLocator(X)}function c9($,J,Y,X){let Z={version:2,sessionId:Y.sessionId,workspace:{kind:"local",projectPath:Y.projectPath}};return oX($,J,{acknowledge:(Q)=>X.acknowledge(Q),setVisibleLocator:(Q)=>Q?X.proveLocal(Q):Promise.resolve()},Z)}function u9($,J){return $.proveLocal(J)}class F6{attention;remote;remoteEpoch=0;provenLocalLocator;remoteActive=!1;constructor($){this.attention=$;this.remote=new d9((J)=>$.acknowledge(J))}acknowledge($){return this.attention.acknowledge($)}async proveLocal($){if(this.provenLocalLocator=$,this.remoteActive)return;this.remoteEpoch+=1,this.remote.reset(),await this.attention.setVisibleLocator($)}async beginRemote($,J){this.remoteActive=!0,this.remoteEpoch+=1,this.remote.begin($,J)}beginRemoteOpening(){this.remoteActive=!0;let $=++this.remoteEpoch;return this.remote.reset(),{epoch:$,cleared:this.attention.setVisibleLocator(void 0)}}isRemoteOpeningCurrent($){return this.remoteActive&&this.remoteEpoch===$}bindRemoteOpening($,J,Y){if(!this.isRemoteOpeningCurrent($))return!1;return this.remote.begin(J,Y),!0}async endRemote(){if(!this.remoteActive)return;this.remoteActive=!1,this.remoteEpoch+=1,this.remote.reset(),await this.attention.setVisibleLocator(this.provenLocalLocator)}async updateRemote($,J){let Y=this.remoteEpoch;if(!await this.remote.update($,J)||Y!==this.remoteEpoch)return;await this.attention.setVisibleLocator(J.session?.locator)}}class d9{acknowledge;acknowledgedView;pendingView;expectedView;constructor($){this.acknowledge=$}begin($,J){this.expectedView=$.intent==="resume"?{key:c1($.session),generation:J}:void 0}reset(){this.expectedView=void 0}async update($,J){if($.intent!=="resume"||J.status!=="ready"||!J.session||!this.expectedView||J.viewGeneration!==this.expectedView.generation||c1($.session)!==this.expectedView.key||c1($.session)!==c1(J.session))return!1;let Y=`${J.viewGeneration}\x00${c1(J.session)}`;if(Y===this.acknowledgedView||Y===this.pendingView)return!1;this.pendingView=Y;try{if(await this.acknowledge(J.session),this.expectedView?.generation!==J.viewGeneration||this.expectedView.key!==c1(J.session))return!1;return this.acknowledgedView=Y,!0}finally{if(this.pendingView===Y)this.pendingView=void 0}}}function nX($){return $.title?.trim()||`Session ${$.locator.sessionId.slice(0,8)}`}function Q4($,J){let Y=$.filter((X)=>X.relationType!=="subagent");if(J!=="fork")return Y;return Y.filter((X)=>X.archivedAt===void 0&&X.capabilities.history.fork)}function l9($){return $.find((J)=>J.relationType!=="subagent"&&J.locator.workspace.kind==="local")}function r9($,J,Y=!1){let X=nX($),Z=Y?"[NEW] ":"";if($.locator.workspace.kind==="acp-remote"){let U=$.archivedAt?" · archived":"";return`${Z}[remote · ${$.capabilities.connection} · history${U}] ${X}
|
|
13
|
-
${$.displayCwd} · ${$.messageCount} messages · ${J}${$.hasErrors?" [!]":""}`}let Q=tX($.taskStatus),G=$.relationType==="subagent"?" ↳ subagent":$.relationType==="fork"?" ↳ fork":"";return`${Z}[${Q}] ${X} · ${J} | ${aX($.displayCwd)} | ${$.messageCount} 条消息${$.hasErrors?" [!]":""}${G}`}function a9($){return{title:$==="fork"?"选择要 fork 的会话:":"选择要恢复的会话:",instructions:"(Left/Right to page | Up/Down to select | Enter to confirm | Esc to cancel)"}}function tX($){switch($){case"queued":return"QUEUED";case"running":return"RUNNING";case"failed":return"FAILED";case"cancelled":return"CANCELLED";case"interrupted":return"INTERRUPTED";case"completed":return"DONE"}}async function $Y($,J,Y,X={}){if($.locator.workspace.kind==="acp-remote"){if(J==="fork"&&X.newSessionId)throw Error("Custom Session IDs are unavailable for remote history forks");return await Y.openHistory($,J),"history-only"}let Z=await L6($);return await Y.activateLocal(Z,J),"interactive"}function U4($){if($.remoteWorkspace)throw Error("Remote history cannot enter the local compatibility path");let J=$.archivedAt!==void 0,Y=e9($.taskCompletedAt);return G4.parse({locator:{version:2,sessionId:$.sessionId,workspace:{kind:"local",projectPath:$.projectPath}},displayCwd:$.projectPath,title:$.title,rootId:$.rootId,parentId:$.parentId,relationType:$.relationType,taskStatus:$.taskStatus,...Y!==void 0?{taskCompletedAt:Y}:{},messageCount:$.messageCount,firstMessageTime:$.firstMessageTime,lastMessageTime:$.lastMessageTime,hasErrors:$.hasErrors,archivedAt:$.archivedAt,selectedModelId:$.selectedModelId,capabilities:{connection:"local",history:{read:!0,fork:!J},turn:J?{start:!1,reason:"archived"}:{start:!0},files:J?{readText:!1,writeText:!1,browse:"none",reason:"archived"}:{readText:!0,writeText:!0,browse:"tree"},terminal:J?{mode:"none",owner:"none",reason:"archived"}:{mode:"interactive",owner:"local"}}})}async function L6($){if($.locator.workspace.kind!=="local")throw Error("Remote history cannot enter the local activation path");let J=t9($.locator.workspace.projectPath),Y=await a0.findSessionMetadata($.locator.sessionId,J);if(!Y)throw Error("Session history is no longer available");if(Y.remoteWorkspace)throw Error("Remote history cannot enter the local activation path");return Y}function i9($){if($.length<=8)return $;return`${$.slice(0,8)}…`}function eX($){return sX.resolve($)}function o9($){if(!$||!s9($))return;m0().config.actions.updateConfig({currentModelId:$})}function n9($){if(!$)return;m0().config.actions.updateConfig({permissionMode:$})}async function K4($,J,Y){let X=Y?await Y.listAll():(await a0.listSessions({includeSubagents:!1})).map(U4);return Q4(X,$)}async function z4($,J,Y,X){let{intent:Z,session:Q,newSessionId:G,announceFork:U,permissionModeOverride:z}=$,K=eX(Q.projectPath);if(Z==="fork"){let _=await a0.forkSession(Q.sessionId,{...G?{newSessionId:G}:{},sourceProjectPath:K,targetProjectPath:K}),H=await a0.loadSessionModelContext(_.sessionId,_.metadata.projectPath),W=[...a0.toUISafeMessages(_.messages)];if(U!==!1){let b=Date.parse(_.metadata.lastMessageTime);W.push({id:"fork-announcement-"+_.sessionId,role:"assistant",content:"Forked "+i9(Q.sessionId)+" → "+i9(_.sessionId),timestamp:Number.isNaN(b)?0:b})}return await X(),n9(z??_.metadata.permissionMode),o9(_.metadata.selectedModelId),Y.restoreSession(_.sessionId,W,H,_.metadata.projectPath),{sessionId:_.sessionId,messages:H,projectPath:_.metadata.projectPath}}await a0.assertSessionWritable(Q.sessionId,Q.projectPath);let[O,q]=await Promise.all([a0.loadSession(Q.sessionId,Q.projectPath),a0.loadSessionModelContext(Q.sessionId,Q.projectPath)]),N=a0.toUISafeMessages(O);return await X(),n9(z??Q.permissionMode),o9(Q.selectedModelId),Y.restoreSession(Q.sessionId,N,q,Q.projectPath),{sessionId:Q.sessionId,messages:q,projectPath:Q.projectPath}}var $7=_1("UI");function QY($){return typeof $==="object"&&$!==null&&typeof $.sessionId==="string"&&typeof $.projectPath==="string"&&typeof $.rootId==="string"&&typeof $.messageCount==="number"&&typeof $.firstMessageTime==="string"&&typeof $.lastMessageTime==="string"&&typeof $.hasErrors==="boolean"}function GY($){return G4.safeParse($).success}function JY($){if(typeof $!=="object"||$===null)return!1;return Object.hasOwn($,"locator")?GY($):QY($)}function YY($){return GY($)?$:U4($)}function J7($){return typeof $==="object"&&$!==null&&$.action==="invoke_skill"&&typeof $.skillName==="string"}function Y7($){return typeof $==="object"&&$!==null&&$.action==="invoke_custom_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function Z7($){return typeof $==="object"&&$!==null&&$.action==="invoke_plugin_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function X7($){return typeof $==="object"&&$!==null&&$.action==="invoke_once_model"&&typeof $.modelId==="string"&&typeof $.prompt==="string"}function Q7($){return typeof $==="object"&&$!==null&&["start_goal","resume_goal"].includes(String($.action))&&typeof $.goal?.objective==="string"}function G7($){return typeof $==="object"&&$!==null&&$.action==="rewind_session"&&typeof $.sessionId==="string"&&Array.isArray($.messages)&&Array.isArray($.visibleMessages)}function U7($){if(typeof $!=="object"||$===null)return!1;let J=$.intent;if(J!=="resume"&&J!=="fork")return!1;let Y=$.action;if(Y==="select_session"){let X=$.sessions;return Array.isArray(X)&&X.every(JY)}if(Y==="activate_session"){let X=$.session;return JY(X)}return!1}function K7($,J,Y,X){switch($){case"show_theme_selector":return Y.setActiveModal("themeSelector"),!0;case"show_model_selector":return Y.setActiveModal("modelSelector"),!0;case"show_model_add_wizard":return Y.setActiveModal("modelAddWizard"),!0;case"show_permissions_manager":return Y.setActiveModal("permissionsManager"),!0;case"show_agents_manager":return Y.setActiveModal("agentsManager"),!0;case"show_skills_manager":return Y.setActiveModal("skillsManager"),!0;case"show_hooks_manager":return Y.setActiveModal("hooksManager"),!0;case"show_plugins_manager":return Y.setActiveModal("pluginsManager"),!0;case"show_follow_up_queue":return Y.setActiveModal("followUpQueue"),!0;case"show_agent_creation_wizard":return Y.setActiveModal("agentCreationWizard"),!0;case"show_session_selector":{let Z=J?.sessions;return Y.showSessionSelector((Z??[]).map(U4),"resume"),!0}case"session_forked":{let Z=J;if(Z?.action!=="restore_forked_session"||!Z.sessionId||!Array.isArray(Z.messages)||!Array.isArray(Z.visibleMessages))return!1;return X.restoreSession(Z.sessionId,Z.visibleMessages,Z.messages),!0}case"session_archived":{let Z=J?.session;return X.addAssistantMessage(Z?`会话 ${Z.sessionId} 已归档。`:"当前会话已归档。"),$1(0),!0}case"clear_screen":return X.clearMessages(),X.setError(null),X.resetTokenUsage(),Y.setTasks([]),!0;case"compact_completed":case"compact_fallback":{let Z=J,Q=Z?.compactedMessages;if(Q)X.setCompactedContext(Q);if(Z?.usage)X.updateTokenUsage({inputTokens:Z.usage.promptTokens,outputTokens:Z.usage.completionTokens,totalTokens:Z.usage.totalTokens,maxContextTokens:Z.maxContextTokens,cacheReadTokens:Z.usage.cacheReadInputTokens??0,cacheWriteTokens:Z.usage.cacheCreationInputTokens??0,costUsd:Z.usage.costUsd});return X.resetContextUsage(),!0}case"exit_application":return $1(0),!0;default:return!1}}async function B6($,J,Y,X,Z,Q,G,U,z,K,O,q,N,_,H=K$(),W,b){let{text:M}=$;if(!ZY(M))return{type:"not_slash"};let B=await XY(M,{cwd:H,surface:"tui",workspaceRoot:H,sessionId:Q,messages:G,rewind:U,lifecycle:Q===void 0?void 0:{archiveCurrent:async()=>{return await Z(),a0.archiveSession(Q,H)}},subagents:z,mcp:K,reasoning:O,serviceTier:q,responseVerbosity:N,communicationStyle:_,codeReview:W,sessionSurfaces:b,signal:X});if(B.success&&U7(B.data)){if(B.data.action==="select_session")return J.showSessionSelector(B.data.sessions.map(YY),B.data.intent),{type:"handled",commandResult:{success:!0}};let L=YY(B.data.session);if(L.locator.workspace.kind==="acp-remote")return J.showSessionHistoryViewer(L,B.data.intent),{type:"handled",commandResult:{success:!0}};let A=QY(B.data.session)?B.data.session:await L6(L),F=await z4({...B.data,session:A},H,Y,Z);try{if(B.data.intent==="resume")await b?.acknowledge?.(L),await b?.setVisibleLocator?.(L.locator);else await b?.setVisibleLocator?.({version:2,sessionId:F.sessionId,workspace:{kind:"local",projectPath:F.projectPath}})}catch{$7.warn("[slashCommandRouter] Task attention activation unavailable")}return{type:"handled",commandResult:{success:!0}}}if(B.success&&G7(B.data))return Y.restoreSession(B.data.sessionId,B.data.visibleMessages,B.data.messages),J.setTasks([]),{type:"handled",commandResult:{success:!0}};if(B.message){if(K7(B.message,B.data,J,Y))return{type:"handled",commandResult:{success:!0}}}if(J7(B.data)){let{skillName:L,skillArgs:A}=B.data,F=A?`Please use the "${L}" skill to help me with: ${A}`:`Please use the "${L}" skill.`;return Y.addUserMessage(F),{type:"continue_as_agent",result:{userDisplayMessage:F,agentInput:{displayText:F,text:F,images:[],parts:[{type:"text",text:F}]},userMessageAlreadyAdded:!0}}}if(Y7(B.data)){let{commandName:L,processedContent:A}=B.data;Y.addUserMessage(M);let F=`# Custom Command: /${L}
|
|
14
|
-
|
|
15
|
-
The user has invoked the custom command "/${L}". Follow the instructions below to complete the task.
|
|
16
|
-
|
|
17
|
-
---
|
|
18
|
-
|
|
19
|
-
${A}
|
|
20
|
-
|
|
21
|
-
---
|
|
22
|
-
|
|
23
|
-
Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:M,agentInput:{displayText:M,text:F,images:[],parts:[{type:"text",text:F}]},userMessageAlreadyAdded:!0}}}if(Z7(B.data)){let{commandName:L,pluginName:A,processedContent:F}=B.data;Y.addUserMessage(M);let R=`# Plugin Command: /${L}
|
|
24
|
-
|
|
25
|
-
The user has invoked the plugin command "/${L}" from plugin "${A}". Follow the instructions below to complete the task.
|
|
26
|
-
|
|
27
|
-
---
|
|
28
|
-
|
|
29
|
-
${F}
|
|
30
|
-
|
|
31
|
-
---
|
|
32
|
-
|
|
33
|
-
Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:M,agentInput:{displayText:M,text:R,images:[],parts:[{type:"text",text:R}]},userMessageAlreadyAdded:!0}}}if(X7(B.data)){let{modelId:L,prompt:A}=B.data;return Y.addUserMessage(A),{type:"continue_as_agent",result:{userDisplayMessage:A,agentInput:{displayText:A,text:A,images:[],parts:[{type:"text",text:A}]},userMessageAlreadyAdded:!0,onceModelId:L}}}if(Q7(B.data)){let L=B.data.goal.objective;return Y.addUserMessage(M),{type:"continue_as_agent",result:{userDisplayMessage:M,agentInput:{displayText:M,text:L,images:[],parts:[{type:"text",text:L}]},userMessageAlreadyAdded:!0,goalContinuationOnly:!0}}}if(!B.success&&B.error)return Y.addAssistantMessage(`${B.error}`),{type:"handled",commandResult:{success:B.success,output:B.message,error:B.error,metadata:B.data}};let C=B.message;if(B.success&&typeof C==="string"&&C.trim()!=="")Y.addAssistantMessage(C);return{type:"handled",commandResult:{success:B.success,output:B.message,error:B.error,metadata:B.data}}}import{useMemoizedFn as p0}from"ahooks";import{useEffect as z7,useRef as A1}from"react";function q7($,J){return $.sessionId===J.sessionId&&$.workspaceRoot===J.workspaceRoot}function UY($,J){return $.factory===J.factory&&$.sessionId===J.sessionId&&$.workspaceRoot===J.workspaceRoot&&$.runtime===J.runtime&&$.systemPrompt===J.systemPrompt&&$.appendSystemPrompt===J.appendSystemPrompt&&$.maxTurns===J.maxTurns&&$.modelId===J.modelId&&$.permissionMode===J.permissionMode&&$.reasoningEffort===J.reasoningEffort&&$.serviceTier===J.serviceTier&&$.responseVerbosity===J.responseVerbosity&&$.communicationStyle===J.communicationStyle&&$.agents===J.agents}var qY=new WeakSet;function j$(){let $=new DOMException("TUI Agent lifecycle was invalidated","AbortError");return qY.add($),$}function KY($){return typeof $==="object"&&$!==null&&qY.has($)}function _Y($){let J=A1(void 0),Y=A1(void 0),X=A1(void 0),Z=A1(void 0),Q=A1(0),G=A1(!1),U=A1(void 0),z=A1(void 0),K=A1(void 0),O=(y)=>{let D=K.current;if(D?.agent===y)return D.promise;let p={agent:y,promise:Promise.resolve()};return p.promise=Promise.resolve().then(()=>y.destroy()).finally(()=>{if(K.current===p)K.current=void 0}),K.current=p,p.promise},q=p0(()=>{Q.current++;let y=U.current;if(y)y.invalidated=!0;let D=z.current;if(D)D.invalidated=!0;if(Z.current)return Z.current.promise;let p=J.current,V=Y.current;J.current=void 0,Y.current=void 0,X.current=void 0;let n=z.current,O0=U.current,Q0=K.current?.promise,R0,U0=(async()=>{let X0,h0=async(H$)=>{if(!H$)return;try{await H$}catch(g0){if(!KY(g0))X0??=g0}};if(await h0(n?.promise),n?.cleanupError!==void 0)X0??=n.cleanupError;if(await h0(Q0),p)await h0(O(p));if(await h0(O0?.promise),O0?.cleanupError!==void 0)X0??=O0.cleanupError;if(V)await h0(V.dispose());if(X0!==void 0)throw X0})();R0={promise:U0},Z.current=R0;let S0=()=>{if(Z.current===R0)Z.current=void 0};return U0.then(S0,S0),U0}),N=p0(async(y)=>{let D=Z.current;if(D){if(await D.promise,!G.current)throw j$();return N(y)}let p=$.workspaceRoot??Y.current?.workspaceRoot??K$(),V={sessionId:y,workspaceRoot:p};if(!G.current)throw j$();let n=U.current;if(n&&!n.invalidated&&n.generation===Q.current&&q7(n.target,V))return n.promise;if(n){let U0=q(),S0=Q.current;if(await U0,!G.current||Q.current!==S0)throw j$();return N(y)}if(Y.current&&(Y.current.sessionId!==y||Y.current.workspaceRoot!==p)){let U0=q(),S0=Q.current;if(await U0,!G.current||Q.current!==S0)throw j$();return N(y)}if(!G.current)throw j$();if(Y.current)return Y.current;let O0=Q.current,Q0,R0=Promise.resolve().then(async()=>{let U0,S0=()=>{if(!G.current||Q0.invalidated||Q.current!==O0||U.current!==Q0)throw j$()};try{S0();let X0=await a0.findSessionMetadata(y,p);S0();let h0=X0!==void 0&&(await a0.loadSession(y,p)).length>0;S0(),U0=await l$.create({sessionId:y,workspaceRoot:p,modelId:$.modelId,permissionMode:$.permissionMode??X0?.permissionMode,reasoningEffort:X0?.reasoningEffort??$.reasoningEffort,serviceTier:X0?.serviceTier??$.serviceTier,responseVerbosity:X0?.responseVerbosity??$.responseVerbosity,communicationStyle:X0?.communicationStyle??$.communicationStyle,communicationStyleDigest:X0?.communicationStyleDigest,agents:$.agents,...h0?{sessionStart:{isResume:!0,resumeSessionId:y}}:{}}),S0();let H$={sessionId:y,modelId:X0?.selectedModelId,permissionMode:X0?.permissionMode,reasoningEffort:X0?.reasoningEffort,serviceTier:X0?.serviceTier,responseVerbosity:X0?.responseVerbosity,communicationStyle:X0?.communicationStyle,communicationStyleDigest:X0?.communicationStyleDigest},g0=U0.getReasoningConfiguration().selection,N$=U0.getServiceTierConfiguration().selection,u$=U0.getResponseVerbosityConfiguration().selection,r0=U0.getCommunicationStyleConfiguration().selection;return S0(),L$().setReasoningEffort(g0),L$().setServiceTier(N$),L$().setResponseVerbosity(u$),L$().setCommunicationStyle(r0),S0(),Y.current=U0,X.current=H$,U0}catch(X0){if(U0&&Y.current!==U0)await U0.dispose().catch((h0)=>{Q0.cleanupError??=h0});if(Q0.invalidated||Q.current!==O0||!G.current)throw j$();throw X0}finally{if(U.current===Q0)U.current=void 0}});return Q0={generation:O0,target:V,invalidated:!1,promise:R0},U.current=Q0,R0}),_=async(y,D,p,V,n)=>{let O0;if(p&&D){let Q0=y?.modelId??$.modelId,R0=y?.reasoningEffort??(V?$.reasoningEffort:p.getReasoningConfiguration().selection),U0=y?.serviceTier??(V?$.serviceTier:p.getServiceTierConfiguration().selection),S0=y?.responseVerbosity??(V?$.responseVerbosity:p.getResponseVerbosityConfiguration().selection),X0=y?.communicationStyle??(V?$.communicationStyle:p.getCommunicationStyleConfiguration().selection),h0=p.getCurrentModelId(),H$=p.getReasoningConfiguration(),g0=p.getServiceTierConfiguration(),N$=p.getResponseVerbosityConfiguration(),u$=p.getCommunicationStyleConfiguration();if($.permissionMode&&(X.current?.sessionId!==D||X.current.permissionMode!==$.permissionMode)){let d0=await a0.setSessionPermissionMode(D,p.workspaceRoot,$.permissionMode);n(),X.current={...X.current,sessionId:D,permissionMode:d0.permissionMode}}await p.refresh({modelId:Q0,...R0?{reasoningEffort:R0}:{},...U0?{serviceTier:U0}:{},...S0?{responseVerbosity:S0}:{},...X0?{communicationStyle:X0}:{}}),n();let r0=p.getCommunicationStyleConfiguration();if(r0.source!=="built-in"&&!r0.contentSha256)throw Error("Custom communication style has no provenance");let U$={...Q0&&Q0!=="inherit"&&(X.current?.sessionId!==D||X.current.modelId!==Q0)?{selectedModelId:Q0}:{},...R0&&(X.current?.sessionId!==D||X.current.reasoningEffort!==R0)?{reasoningEffort:R0}:{},...U0&&(X.current?.sessionId!==D||X.current.serviceTier!==U0)?{serviceTier:U0}:{},...S0&&(X.current?.sessionId!==D||X.current.responseVerbosity!==S0)?{responseVerbosity:S0}:{},...X0&&(X.current?.sessionId!==D||X.current.communicationStyle!==X0||X.current.communicationStyleDigest!==r0.contentSha256)?{communicationStyle:X0,communicationStyleDigest:r0.source==="built-in"?null:r0.contentSha256}:{}};if(Object.keys(U$).length>0)try{let d0=await a0.updateSessionMetadata(D,p.workspaceRoot,U$);n(),X.current={sessionId:D,modelId:d0.selectedModelId,permissionMode:d0.permissionMode,reasoningEffort:d0.reasoningEffort,serviceTier:d0.serviceTier,responseVerbosity:d0.responseVerbosity,communicationStyle:d0.communicationStyle,communicationStyleDigest:d0.communicationStyleDigest}}catch(d0){if(KY(d0))throw d0;throw await p.refresh({...h0?{modelId:h0}:{},reasoningEffort:H$.selection,serviceTier:g0.selection,responseVerbosity:N$.selection,communicationStyle:u$.selection}).catch(()=>{return}),d0}O0=await Q8.createWithRuntime(p,{sessionId:D,systemPrompt:y?.systemPrompt??$.systemPrompt,appendSystemPrompt:y?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:y?.maxTurns??$.maxTurns,modelId:y?.modelId??$.modelId,permissionMode:y?.permissionMode??$.permissionMode,agents:$.agents})}else O0=await Q8.create({systemPrompt:y?.systemPrompt??$.systemPrompt,appendSystemPrompt:y?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:y?.maxTurns??$.maxTurns,modelId:y?.modelId??$.modelId,permissionMode:y?.permissionMode??$.permissionMode,agents:$.agents});return O0},H=p0(async(y)=>{let D=Z.current;if(D){if(await D.promise,!G.current)throw j$();return H(y)}if(!G.current)throw j$();let p=y?.sessionId??$.sessionId,V=!!y?.modelId&&y.modelId!==$.modelId,n=Y.current,O0={factory:!V&&p?"session":"standalone",sessionId:p,workspaceRoot:!V&&p?$.workspaceRoot??n?.workspaceRoot??K$():$.workspaceRoot??K$(),runtime:!V&&p&&n&&n.sessionId===p&&n.workspaceRoot===($.workspaceRoot??n.workspaceRoot)?n:void 0,systemPrompt:y?.systemPrompt??$.systemPrompt,appendSystemPrompt:y?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:y?.maxTurns??$.maxTurns,modelId:y?.modelId??$.modelId,permissionMode:y?.permissionMode??$.permissionMode,reasoningEffort:y?.reasoningEffort??$.reasoningEffort,serviceTier:y?.serviceTier??$.serviceTier,responseVerbosity:y?.responseVerbosity??$.responseVerbosity,communicationStyle:y?.communicationStyle??$.communicationStyle,agents:$.agents},Q0=z.current;if(Q0){if(!Q0.invalidated&&Q0.generation===Q.current&&UY(Q0.target,O0))return Q0.promise;Q0.invalidated=!0,Q.current++;let U$=Q.current;if(await Q0.promise.catch(()=>{return}),Q0.cleanupError!==void 0)throw Q0.cleanupError;if(!G.current||Q.current!==U$)throw j$();return H(y)}let R0=Y.current!==void 0,U0=!V&&p?await N(p):void 0;if(!G.current||U0!==void 0&&Y.current!==U0)throw j$();let S0={factory:U0?"session":"standalone",sessionId:p,workspaceRoot:U0?.workspaceRoot??$.workspaceRoot??K$(),runtime:U0,systemPrompt:y?.systemPrompt??$.systemPrompt,appendSystemPrompt:y?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:y?.maxTurns??$.maxTurns,modelId:y?.modelId??$.modelId,permissionMode:y?.permissionMode??$.permissionMode,reasoningEffort:y?.reasoningEffort??$.reasoningEffort,serviceTier:y?.serviceTier??$.serviceTier,responseVerbosity:y?.responseVerbosity??$.responseVerbosity,communicationStyle:y?.communicationStyle??$.communicationStyle,agents:$.agents},X0=z.current;if(X0&&!X0.invalidated&&X0.generation===Q.current&&UY(X0.target,S0))return X0.promise;if(X0){X0.invalidated=!0,Q.current++;let r0=Q.current;if(await X0.promise.catch(()=>{return}),X0.cleanupError!==void 0)throw X0.cleanupError;if(!G.current||Q.current!==r0)throw j$();return H(y)}let h0=Q.current,H$=J.current,g0;if(H$)J.current=void 0,g0=O(H$);let N$,u$=Promise.resolve().then(async()=>{let r0,U$=()=>{if(!G.current||N$.invalidated||Q.current!==h0||z.current!==N$||U0!==void 0&&Y.current!==U0)throw j$()};try{if(U$(),g0){try{await g0}catch(d0){throw N$.cleanupError??=d0,U$(),d0}U$()}return r0=await _(y,p,U0,R0,U$),U$(),J.current=r0,r0}catch(d0){if(r0&&J.current!==r0)await O(r0).catch((L1)=>{N$.cleanupError??=L1});if(N$.invalidated||Q.current!==h0||!G.current)throw j$();throw d0}finally{if(z.current===N$)z.current=void 0}});return N$={generation:h0,target:S0,invalidated:!1,promise:u$},z.current=N$,u$}),W=p0(async()=>{if(!$.sessionId)throw Error("No active session to rewind");return(await N($.sessionId)).listRewindCheckpoints()}),b=p0(async(y)=>{if(!$.sessionId)throw Error("No active session to rewind");let p=await(await N($.sessionId)).rewindSession(y);return await q(),p}),M=p0(async()=>{if(!$.sessionId)throw Error("No active session for subagent control");return(await N($.sessionId)).listSubagents()}),w=p0(async(y,D)=>{if(!$.sessionId)throw Error("No active session for subagent control");let p=await N($.sessionId),V=!1,n,O0=y,Q0=(U0)=>{let S0=U0.status==="completed"?U0.result?.message:U0.result?.error||U0.result?.message;k2.getState().app.actions.completeSubagentProgress(O0,U0.status==="completed",S0)},R0=p.resumeSubagent({agentId:y,prompt:D,onEvent:(U0)=>{if(U0.kind==="tool_start"&&"function"in U0.toolCall)k2.getState().app.actions.updateSubagentTool(O0,U0.toolCall.function.name)},onCompleted:(U0)=>{if(V)Q0(U0);else n=U0}});if(O0=R0.session.id,k2.getState().app.actions.startSubagentProgress(R0.session.id,R0.session.subagentType,`Resumed from ${R0.source.id}: ${R0.session.description}`),V=!0,n)Q0(n);return R0}),B=p0(async()=>{if(!$.sessionId)throw Error("No active session for MCP content");return(await N($.sessionId)).getMcpContentCatalog()}),C=p0(async(y)=>{if(!$.sessionId)throw Error("No active session for MCP content");await(await N($.sessionId)).refreshMcpContentCatalogs(y)}),L=p0(async(y,D,p)=>{if(!$.sessionId)throw Error("No active session for MCP prompts");return(await N($.sessionId)).getMcpPrompt(y,D,p)}),A=p0(async(y,D,p)=>{if(!$.sessionId)throw Error("No active session for MCP completion");return(await N($.sessionId)).completeMcpArgument(y,D,p)}),F=p0(async(y,D={})=>{if(!$.sessionId)throw Error("No active session for MCP logs");return(await N($.sessionId)).getMcpLogs(y,D)}),R=p0(async(y)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await N($.sessionId)).listMcpTasks(y)}),k=p0(async(y)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await N($.sessionId)).getMcpTask(y)}),T=p0(async(y,D)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await N($.sessionId)).cancelMcpTask(y,D)}),I=p0(async(y,D)=>{if(!$.sessionId)throw Error("No active session for MCP logging");await(await N($.sessionId)).setMcpLoggingLevel(y,D)}),P=p0(async()=>{if(!$.sessionId)throw Error("No active session for MCP instructions");return(await N($.sessionId)).getMcpInstructions()}),j=p0(async()=>{if(!$.sessionId)throw Error("No active session for reasoning effort");return(await N($.sessionId)).getReasoningConfiguration()}),o=p0(async(y)=>{if(!$.sessionId)throw Error("No active session for reasoning effort");let D=await N($.sessionId);if(D.hasTurnOwner())throw Error("Cannot switch reasoning effort while a turn is active");let p=D.getReasoningConfiguration();if(D.resolveReasoningConfiguration(y),p.selection===y)return p;await D.refresh({reasoningEffort:y});try{let V;try{V=await a0.updateSessionMetadata($.sessionId,D.workspaceRoot,{reasoningEffort:y})}catch(n){if(!(n instanceof X8)&&n.code!=="ENOENT")throw n;V=await a0.createSessionMetadata($.sessionId,D.workspaceRoot,{taskStatus:"completed",selectedModelId:D.getCurrentModelId(),reasoningEffort:y,serviceTier:D.getServiceTierConfiguration().selection,responseVerbosity:D.getResponseVerbosityConfiguration().selection,communicationStyle:D.getCommunicationStyleConfiguration().selection})}return X.current={sessionId:$.sessionId,modelId:V.selectedModelId,permissionMode:V.permissionMode,reasoningEffort:V.reasoningEffort,serviceTier:V.serviceTier,responseVerbosity:V.responseVerbosity,communicationStyle:V.communicationStyle,communicationStyleDigest:V.communicationStyleDigest},L$().setReasoningEffort(y),D.getReasoningConfiguration()}catch(V){throw await D.refresh({reasoningEffort:p.selection}),V}}),u=p0(async()=>{if(!$.sessionId)throw Error("No active session for service tier");return(await N($.sessionId)).getServiceTierConfiguration()}),Z0=p0(async(y)=>{if(!$.sessionId)throw Error("No active session for service tier");let D=await N($.sessionId);if(D.hasTurnOwner())throw Error("Cannot switch service tier while a turn is active");let p=D.getServiceTierConfiguration();if(D.resolveServiceTierConfiguration(y),p.selection===y)return p;await D.refresh({serviceTier:y});try{let V;try{V=await a0.updateSessionMetadata($.sessionId,D.workspaceRoot,{serviceTier:y})}catch(n){if(!(n instanceof X8)&&n.code!=="ENOENT")throw n;V=await a0.createSessionMetadata($.sessionId,D.workspaceRoot,{taskStatus:"completed",selectedModelId:D.getCurrentModelId(),reasoningEffort:D.getReasoningConfiguration().selection,serviceTier:y,responseVerbosity:D.getResponseVerbosityConfiguration().selection,communicationStyle:D.getCommunicationStyleConfiguration().selection})}return X.current={sessionId:$.sessionId,modelId:V.selectedModelId,permissionMode:V.permissionMode,reasoningEffort:V.reasoningEffort,serviceTier:V.serviceTier,responseVerbosity:V.responseVerbosity,communicationStyle:V.communicationStyle,communicationStyleDigest:V.communicationStyleDigest},L$().setServiceTier(y),D.getServiceTierConfiguration()}catch(V){throw await D.refresh({serviceTier:p.selection}),V}}),z0=p0(async()=>{if(!$.sessionId)throw Error("No active session for response verbosity");return(await N($.sessionId)).getResponseVerbosityConfiguration()}),J0=p0(async(y)=>{if(!$.sessionId)throw Error("No active session for response verbosity");let D=await N($.sessionId);if(D.hasTurnOwner())throw Error("Cannot switch response verbosity while a turn is active");let p=D.getResponseVerbosityConfiguration();if(D.resolveResponseVerbosityConfiguration(y),p.selection===y)return p;await D.refresh({responseVerbosity:y});try{let V;try{V=await a0.updateSessionMetadata($.sessionId,D.workspaceRoot,{responseVerbosity:y})}catch(n){if(!(n instanceof X8)&&n.code!=="ENOENT")throw n;V=await a0.createSessionMetadata($.sessionId,D.workspaceRoot,{taskStatus:"completed",selectedModelId:D.getCurrentModelId(),reasoningEffort:D.getReasoningConfiguration().selection,serviceTier:D.getServiceTierConfiguration().selection,responseVerbosity:y,communicationStyle:D.getCommunicationStyleConfiguration().selection})}return X.current={sessionId:$.sessionId,modelId:V.selectedModelId,permissionMode:V.permissionMode,reasoningEffort:V.reasoningEffort,serviceTier:V.serviceTier,responseVerbosity:V.responseVerbosity,communicationStyle:V.communicationStyle,communicationStyleDigest:V.communicationStyleDigest},L$().setResponseVerbosity(y),D.getResponseVerbosityConfiguration()}catch(V){throw await D.refresh({responseVerbosity:p.selection}),V}}),f=p0(async()=>{if(!$.sessionId)throw Error("No active session for communication style");return(await N($.sessionId)).getCommunicationStyleConfiguration()}),E=p0(async(y)=>{if(!$.sessionId)throw Error("No active session for communication style");let D=await N($.sessionId);if(D.hasTurnOwner())throw Error("Cannot switch communication style while a turn is active");let p=D.getCommunicationStyleConfiguration(),V=D.resolveCommunicationStyleConfiguration(y);if(V.source!=="built-in"&&!V.contentSha256)throw Error("Custom communication style has no provenance");if(p.selection===y)return p;await D.refresh({communicationStyle:y});try{let n;try{n=await a0.updateSessionMetadata($.sessionId,D.workspaceRoot,{communicationStyle:y,communicationStyleDigest:V.source==="built-in"?null:V.contentSha256})}catch(O0){if(!(O0 instanceof X8)&&O0.code!=="ENOENT")throw O0;n=await a0.createSessionMetadata($.sessionId,D.workspaceRoot,{taskStatus:"completed",selectedModelId:D.getCurrentModelId(),reasoningEffort:D.getReasoningConfiguration().selection,serviceTier:D.getServiceTierConfiguration().selection,responseVerbosity:D.getResponseVerbosityConfiguration().selection,communicationStyle:y,...V.source!=="built-in"&&V.contentSha256?{communicationStyleDigest:V.contentSha256}:{}})}return X.current={sessionId:$.sessionId,modelId:n.selectedModelId,permissionMode:n.permissionMode,reasoningEffort:n.reasoningEffort,serviceTier:n.serviceTier,responseVerbosity:n.responseVerbosity,communicationStyle:n.communicationStyle,communicationStyleDigest:n.communicationStyleDigest},L$().setCommunicationStyle(y),D.getCommunicationStyleConfiguration()}catch(n){throw await D.refresh({communicationStyle:p.selection}),n}}),m=p0(async(y)=>{if(!Y.current)return{accepted:!1,queued:0,reason:"no_active_turn"};return Y.current.enqueueSteering(y,{allowBeforeTurn:!0})}),Y0=p0(async(y,D)=>{let p=$.sessionId;if(!p)return{accepted:!1,queued:0,reason:"no_active_turn"};return(await N(p)).enqueueSteering(y,{allowBeforeTurn:!0,...D})}),c=p0(async()=>{let y=$.sessionId;if(!y)throw Error("Follow-up queue requires a Session");return(await N(y)).getFollowUpQueueSnapshot()}),d=p0(async(y)=>{let D=$.sessionId;if(!D)throw Error("Follow-up queue requires a Session");return(await N(D)).mutateFollowUpQueue(y)}),a=p0(async(y,D)=>{let p=$.sessionId;if(!p)throw Error("Side conversation requires a Session");return(await N(p)).askSideQuestion(y,{signal:D,systemPrompt:$.systemPrompt,appendSystemPrompt:$.appendSystemPrompt})}),W0=p0(async(y,D)=>{let p=$.sessionId;if(!p)throw Error("User shell command requires a Session");return(await N(p)).executeUserShellCommand(y,D)}),F0=p0(()=>Y.current?.getTurnRecoveryAssessment()??{state:"none"}),T0=p0(async(y,D)=>{let p=$.sessionId;if(!p)throw Error("Code review requires a Session");let V=await N(p);await q4.recoverInterrupted(V.workspaceRoot,p,V);let n=await q4.start({sessionId:p,projectPath:V.workspaceRoot,runtime:V,request:y,signal:D}),O0=await n.completion,Q0=(await q4.list(V.workspaceRoot,p)).find((R0)=>R0.start.reviewId===n.reviewId);if(!Q0)throw Error(`Review not found after completion: ${n.reviewId}`);return{reviewId:n.reviewId,status:O0.status,findings:O0.findings.length,content:zY(Q0.start,O0)}});return z7(()=>{G.current=!0;let D=_4(async()=>{G.current=!1,await q()});return()=>{D(),G.current=!1,q().catch(()=>{return})}},[q]),{agentRef:J,createAgent:H,cleanupAgent:q,steerActiveTurn:m,enqueueSessionInput:Y0,getFollowUpQueue:c,mutateFollowUpQueue:d,askSideQuestion:a,runCodeReview:T0,executeUserShellCommand:W0,getTurnRecoveryAssessment:F0,listRewindCheckpoints:W,rewindSession:b,listSubagents:M,resumeSubagent:w,getMcpContentCatalog:B,refreshMcpContentCatalogs:C,getMcpPrompt:L,completeMcpArgument:A,listMcpTasks:R,getMcpTask:k,cancelMcpTask:T,getMcpLogs:F,setMcpLoggingLevel:I,getMcpInstructions:P,getReasoningConfiguration:j,setReasoningEffort:o,getServiceTierConfiguration:u,setServiceTier:Z0,getResponseVerbosityConfiguration:z0,setResponseVerbosity:J0,getCommunicationStyleConfiguration:f,setCommunicationStyle:E}}import{useMemoizedFn as h2}from"ahooks";import{useEffect as _7,useRef as O4}from"react";function OY($){let J=0;for(let Y of $)if(Y===`
|
|
34
|
-
`)J++;return J}function NY($,J){let Y=J?.flushTimeout??300,X=J?.minLinesToFlush??5,Z=J?.minCharsToFlush??400,Q=O4(""),G=O4(null),U=O4(""),z=O4(null),K=h2(()=>{if(Q.current){let W=Q.current,b=$.appendAssistantContent(W);o8(b,W),Q.current=""}if(G.current)clearTimeout(G.current),G.current=null}),O=h2(()=>{if(U.current)$.appendThinkingContent(U.current),U.current="";if(z.current)clearTimeout(z.current),z.current=null}),q=h2((W)=>{Q.current+=W;let b=Q.current;if(OY(b)>=X||b.length>=Z){K();return}if(!G.current)G.current=setTimeout(K,Y)}),N=h2((W)=>{U.current+=W;let b=U.current;if(OY(b)>=X||b.length>=Z){O();return}if(!z.current)z.current=setTimeout(O,Y)}),_=h2(()=>{if(Q.current="",G.current)clearTimeout(G.current),G.current=null;if(U.current="",z.current)clearTimeout(z.current),z.current=null}),H=h2(()=>{if(G.current)clearTimeout(G.current),G.current=null;if(z.current)clearTimeout(z.current),z.current=null;let W=Q.current,b=U.current;return Q.current="",U.current="",{extraContent:W,extraThinking:b}});return _7(()=>{return()=>{_()}},[_]),{batchAppendContent:q,batchAppendThinking:N,flushContentBuffer:K,flushThinkingBuffer:O,resetStreamingBuffers:_,drainPendingBuffers:H}}var G8=_1("UI");function W4($,J){return[...($??[]).filter((Y)=>Y!==J),J].slice(-16)}function HY($){return $.error?.type==="canceled"||$.error?.type==="aborted"||$.metadata?.abortReason==="interrupt"}var MY=($,J,Y,X,Z,Q,G)=>{let U=v2(),z=D2(),K=q1(),O=m8(),q=f2(),N=x8(),_=c8(),H=u8(),W=d8(),b=l8(),M=E8(),w=q9(),B=p1(),C=x1(),L=N9(),A=N4(!1),F=N4(null),R=N4(null),k=N4(null),{createAgent:T,cleanupAgent:I,steerActiveTurn:P,enqueueSessionInput:j,getFollowUpQueue:o,mutateFollowUpQueue:u,listRewindCheckpoints:Z0,rewindSession:z0,listSubagents:J0,resumeSubagent:f,getMcpContentCatalog:E,refreshMcpContentCatalogs:m,getMcpPrompt:Y0,completeMcpArgument:c,listMcpTasks:d,getMcpTask:a,cancelMcpTask:W0,getMcpLogs:F0,setMcpLoggingLevel:T0,getMcpInstructions:y,getReasoningConfiguration:D,setReasoningEffort:p,getServiceTierConfiguration:V,setServiceTier:n,getResponseVerbosityConfiguration:O0,setResponseVerbosity:Q0,getCommunicationStyleConfiguration:R0,setCommunicationStyle:U0,runCodeReview:S0,askSideQuestion:X0,executeUserShellCommand:h0,getTurnRecoveryAssessment:H$}=_Y({sessionId:z,workspaceRoot:K,systemPrompt:$,appendSystemPrompt:J,maxTurns:X,modelId:O,permissionMode:q,reasoningEffort:_,serviceTier:H,responseVerbosity:W,communicationStyle:b,agents:Q}),g0=WY(()=>[K,z,O7()].join("\x00"),[z,K]),N$=J1(async()=>{let S=m0().app.followUpQueue?.version,v=m0().app.followUpQueueMutation;try{let g=await o(),x=m0().app.followUpQueue?.version,r=x===S||x===g.version;if(r)C.projectFollowUpQueue(g,g0);let P0=m0().app.followUpQueueMutation.supersededVersions;C.setFollowUpQueueMutation(v.errorCode==="revision_conflict"?{pending:!1,errorCode:v.errorCode,errorMessage:v.errorMessage,supersededVersions:r?P0:W4(P0,g.version)}:{pending:!1,supersededVersions:r?P0:W4(P0,g.version)},g0)}catch{C.setFollowUpQueueMutation({pending:!1,errorMessage:"Follow-up queue is unavailable"},g0)}}),u$=J1(async(S)=>{let v=m0().app.followUpQueue;if(!v||m0().app.followUpQueueMutation.pending)return!1;C.setFollowUpQueueMutation({pending:!0,messageId:S.messageId},g0);try{let g=await u({expectedVersion:v.version,operation:S}),x=m0().app.followUpQueue?.version;if(x===v.version||x===g.snapshot.version)C.projectFollowUpQueue(g.snapshot,g0);let r=x===v.version||x===g.snapshot.version,P0=m0().app.followUpQueueMutation.supersededVersions;if(C.setFollowUpQueueMutation({pending:!1,supersededVersions:r?P0:W4(P0,g.snapshot.version)},g0),S.type==="remove")L.takeFollowUpPresentation(S.messageId);return!0}catch(g){if(g instanceof AY){let x=m0().app.followUpQueue?.version,r=x===v.version||x===g.snapshot.version;if(r)C.projectFollowUpQueue(g.snapshot,g0);let P0=m0().app.followUpQueueMutation.supersededVersions;C.setFollowUpQueueMutation({pending:!1,errorCode:g.code,errorMessage:g.message,supersededVersions:r?P0:W4(P0,g.snapshot.version)},g0)}else C.setFollowUpQueueMutation({pending:!1,errorMessage:"Follow-up queue is unavailable"},g0);return!1}}),r0=NY(B),U$=J1((S)=>new J8({signal:S,streamingBuffer:r0,getStreamingMessageId:()=>m0().session.currentStreamingMessageId,finalizeStreamingMessage:B.finalizeStreamingMessage,discardStreamingMessage:B.discardStreamingMessage,clearThinking:()=>B.setCurrentThinkingContent(null)})),d0=J1(async()=>{if(!w||!z){C.setTeams([]);return}try{let v=await new bY({configDir:Z8(),subagentRegistry:H4(K)}).list({sessionId:z,projectPath:K});if(m0().session.sessionId===z&&m0().session.workspaceRoot===K)C.setTeams(v)}catch(S){G8.warn("[useCommandHandler] Failed to refresh Agent Teams",S)}}),L1=J1(async(S,v)=>{if(S.images.length>0)return{success:!1,error:"User shell commands do not accept image attachments"};let g=S.text.trimStart().slice(1).trim();if(!g)return{success:!1,error:"User shell command cannot be empty"};B.setCommand(`! ${g}`);try{let x=await h0(g,{signal:v});if(B.addMessage({id:`user-shell-${x.executionId}`,role:"user",content:w6(x.record),timestamp:Date.now(),metadata:{userShellCommand:x.record}}),x.delivery==="next_turn"){let r=m0().session;if(r.sessionId===z&&r.workspaceRoot===K)R.current?.request()}return{success:x.record.status!=="spawn_error",output:w6(x.record),...x.record.status==="spawn_error"?{error:x.record.stderr||"User shell command failed"}:{}}}finally{B.setCommand(null)}});u1(()=>{return()=>{F.current=null,r0.resetStreamingBuffers()}},[r0.resetStreamingBuffers]),u1(()=>{return()=>{k.current?.abort("side-conversation-session-change"),k.current=null,C.dismissSideConversation()}},[C,z,K]),u1(()=>{C.setTeams([]),d0()},[w,C,d0,z,K]),u1(()=>{if(!N)B.setCurrentThinkingContent(null)},[N,B]);let B1=J1(()=>{if(k.current){k.current.abort("user-cancel"),k.current=null,C.dismissSideConversation();return}if(!U)return;Z?.();let S=L.getAbortController()?.signal??new AbortController().signal;if((F.current??U$(S)).abortAndFinalize(()=>{L.abort("user-cancel"),C.setTasks([])}),!A.current)B.addAssistantMessage("任务已停止"),A.current=!0}),$8=J1(async(S,v)=>{let g=`side-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;if(C.startSideConversation(g,v),S.images.length>0){C.failSideConversation(g,"Side conversations do not accept image attachments");return}if(!v){C.failSideConversation(g,"Usage: /btw <question>");return}k.current?.abort("side-conversation-replaced");let x=new AbortController;k.current=x;try{let r=await X0(v,x.signal);if(x.signal.aborted||k.current!==x)return;if(C.completeSideConversation(g,r),r.usage)B.updateTokenUsage({inputTokens:r.usage.promptTokens,outputTokens:r.usage.completionTokens,totalTokens:r.usage.totalTokens,cacheReadTokens:r.usage.cacheReadInputTokens??0,cacheWriteTokens:r.usage.cacheCreationInputTokens??0,costUsd:r.usage.costUsd})}catch(r){if(x.signal.aborted||k.current!==x)return;C.failSideConversation(g,r instanceof Error?r.message:String(r))}finally{if(k.current===x)k.current=null}}),g1=J1(async(S,v)=>{let g={contentDeltaCount:0,contentDeltaTotalLen:0,outputStarted:!1,toolExecutionStarted:!1,compactionCount:0},x=U$(v.signal);F.current=x;let r=S9({sessionActions:B,appActions:C,commandActions:L,streamingBuffer:r0,thinkingModeEnabled:N,getStreamingMessageId:()=>m0().session.currentStreamingMessageId,signal:v.signal,streamSession:x,followUpQueueOwner:g0},g);try{return{loopResult:await LY(S,r),stats:g}}finally{if(F.current===x)F.current=null}}),y2=J1(async(S)=>{let v=!1,g,x=!1,r=S;try{if(S.text.trimStart().startsWith("!")){let Z$=L.getAbortController()??L.createAbortController();return await L1(S,Z$.signal)}await U8();let P0=L.getAbortController()??L.createAbortController(),l0=$4(m0().session),c0=await B6(S,C,B,P0.signal,I,z,$4(m0().session),{listCheckpoints:Z0,execute:z0},{list:J0,resume:f},{getCatalog:E,refresh:m,getPrompt:Y0,complete:c,listTasks:d,getTask:a,cancelTask:W0,getLogs:F0,setLoggingLevel:T0,getInstructions:y},{get:D,set:p},{get:V,set:n},{get:O0,set:Q0},{get:R0,set:U0},K,{run:S0},G);if(c0.type==="handled")return c0.commandResult;if(c0.type==="continue_as_agent")v=c0.result.userMessageAlreadyAdded,g=c0.result.onceModelId,x=c0.result.goalContinuationOnly===!0,r=c0.result.agentInput;let b$=E$.getInstance(),z1;if(!x){let Z$=await b$.executeUserPromptSubmitHooks(r.text,{projectDir:K,sessionId:z,permissionMode:q,hasImages:r.images.length>0,imageCount:r.images.length});if(!Z$.proceed){if(Z$.warning)B.addAssistantMessage(`${Z$.warning}`);return{success:!1,error:"blocked by hook"}}if(Z$.updatedPrompt)r={...r,text:Z$.updatedPrompt,displayText:Z$.updatedPrompt,parts:[{type:"text",text:Z$.updatedPrompt},...r.parts.filter((I2)=>I2.type==="image")]};if(Z$.contextInjection)z1=Z$.contextInjection}if(!v)B.addUserMessage(r.displayText);let Z2=O6(r),B$=await T(g?{modelId:g}:void 0);if(P0.signal.aborted)return G8.info("[handleCommandSubmit] Agent 创建期间已被中止"),{success:!1,error:"aborted"};if(z1)l0.push({role:"system",content:`<user-prompt-submit-hook>
|
|
35
|
-
${z1}
|
|
36
|
-
</user-prompt-submit-hook>`});let d$={messages:l0,userId:"cli-user",sessionId:z,workspaceRoot:K,signal:P0.signal,confirmationHandler:Y,permissionMode:q,onPermissionModeChange:async(Z$)=>{await z$().setPermissionMode(Z$)}},{loopResult:O$,stats:w1}=await g1(B$.chatStream(Z2,d$,{stream:!0,goalContinuationOnly:x,onTurnLimitReached:Y?async(Z$)=>{let I2=await Y.requestConfirmation({type:"maxTurnsExceeded",message:`已进行 ${Z$.turnsCount} 轮对话。是否继续?`,risks:["继续执行可能导致更长的等待时间","可能产生更多的 API 费用"]});return{continue:I2.approved,reason:I2.reason}}:void 0}),P0);if(w1.compactionCount>0)B.setCompactedContext(d$.messages);if(O$.success&&O$.metadata?.outputTruncated)B.addAssistantMessage("输出因达到 token 上限被截断,部分内容可能不完整。");let P1=O$.finalMessage||"";if(G8.debug("[handleCommandSubmit] final reply",{success:O$.success,outputLength:P1.length,turnsCount:O$.metadata?.turnsCount,toolCallsCount:O$.metadata?.toolCallsCount}),!O$.success&&!HY(O$)){let Z$=O$.error?.message||"任务执行失败";return B.addAssistantMessage(Z$),{success:!1,error:Z$}}if(!P1||P1.trim()===""){let Z$=O$.metadata?.abortReason;if(!A.current&&w1.contentDeltaCount===0&&Z$!=="interrupt")return B.addAssistantMessage("已取消"),{success:!0,output:"已取消"};return{success:!0,output:P1??""}}return{success:!0,output:P1}}catch(P0){if(A.current)return{success:!1,error:"aborted"};let l0=n8(P0),c0=typeof P0==="object"&&P0!==null&&"name"in P0&&P0.name==="AbortError";if(l0.isAbort||c0)return{success:!1,error:"aborted"};return B.addAssistantMessage(`${l0.displayMessage}`),{success:!1,error:l0.displayMessage}}}),Y2=J1(async(S)=>{if(S.aborted)return{status:"completed"};if(m0().command.isProcessing)return{status:"deferred"};let v=await l$.hasPendingInbox(K,z),g=!v&&await l$.hasActiveGoal(K,z),x=!v&&!g&&await l$.hasRecoverableTurn(K,z);if(S.aborted)return{status:"completed"};if(!v&&!g&&!x)return{status:"completed"};if(m0().command.isProcessing)return{status:"deferred"};if(await U8(),S.aborted)return{status:"completed"};if(m0().command.isProcessing)return{status:"deferred"};let r=L.createAbortController(),P0="preflight",l0=()=>{if(!r.signal.aborted)r.abort("pending-resume-coordinator-disposed")};if(S.addEventListener("abort",l0,{once:!0}),S.aborted)l0();r0.resetStreamingBuffers(),B.clearFinalizingStreamingMessageId(),L.setProcessing(!0);try{let c0=await T();if(r.signal.aborted)return r.signal.reason==="interrupted-by-new-command"?{status:"deferred"}:{status:"completed"};let b$=await l$.hasPendingInbox(K,z),z1=!b$&&await l$.hasActiveGoal(K,z);if(r.signal.aborted)return r.signal.reason==="interrupted-by-new-command"?{status:"deferred"}:{status:"completed"};if(!b$&&!z1){let O$=H$();if(O$.state!=="none")_6(B,O$);return{status:"completed"}}P0=b$?"pending_input":"goal";let Z2={messages:$4(m0().session),userId:"cli-user",sessionId:z,workspaceRoot:K,signal:r.signal,confirmationHandler:Y,permissionMode:q,onPermissionModeChange:async(O$)=>{await z$().setPermissionMode(O$)}},{loopResult:B$,stats:d$}=await g1(c0.chatStream("",Z2,{stream:!0,pendingInputOnly:b$,goalContinuationOnly:z1}),r);if(d$.compactionCount>0)B.setCompactedContext(Z2.messages);if(r.signal.aborted)return r.signal.reason==="interrupted-by-new-command"?{status:"deferred"}:{status:"completed"};if(B$.success&&B$.metadata?.outputTruncated)B.addAssistantMessage("输出因达到 token 上限被截断,部分内容可能不完整。");if(!B$.success&&!HY(B$)){let O$=V2(B$.error?.details??B$.error?.message??"恢复排队指令失败");if(P0==="pending_input"){let w1=B$.metadata?.toolCallsCount,P1=typeof w1==="number"&&Number.isInteger(w1)&&w1>=0?w1:-1,Z$=await l$.hasPendingInbox(K,z);if(r.signal.aborted)return r.signal.reason==="interrupted-by-new-command"?{status:"deferred"}:{status:"completed"};return{status:"failed",workKind:P0,workStillPending:Z$,taskFailure:O$,evidence:{taskFailure:O$,outputStarted:d$.outputStarted,toolExecutionStarted:d$.toolExecutionStarted,toolCallsCount:P1}}}return{status:"failed",workKind:P0,workStillPending:!1,taskFailure:O$}}return{status:"completed"}}catch(c0){let b$=n8(c0);if(r.signal.reason==="interrupted-by-new-command")return{status:"deferred"};if(b$.isAbort||S.aborted)return{status:"completed"};return{status:"failed",workKind:P0,workStillPending:!1,taskFailure:V2(c0)}}finally{if(S.removeEventListener("abort",l0),L.getAbortController()===r)L.setProcessing(!1),L.clearAbortController(r),B.setCurrentThinkingContent(null)}}),I$=WY(()=>{let S="preflight";return new K6({canRun:()=>!m0().command.isProcessing,run:async(v)=>{S="preflight";let g=await Y2(v);if(g.status==="failed")S=g.workKind;return g},sessionIdentity:JSON.stringify([K,z]),onTerminalFailure:({taskFailure:v})=>{if(S==="preflight")B.setError(`恢复排队指令失败: ${v.message}`);else B.addAssistantMessage(v.message)}})},[Y2,B,z,K]);u1(()=>{return R.current=I$,()=>{if(I$.dispose(),R.current===I$)R.current=null}},[I$]),u1(()=>{return C.claimFollowUpQueueOwner(g0),()=>{C.clearFollowUpQueue(g0)}},[C,g0]);let e=J1(async(S)=>{if(m0().app.activeModal==="sessionHistoryViewer")return;if(!S.text.trim()&&S.images.length===0)return;let v=BY(S.text);if(v){await $8(S,v.question);return}if(k.current?.abort("main-conversation-submitted"),k.current=null,C.dismissSideConversation(),S.text.trimStart().startsWith("!")&&U){let x=L.getAbortController();if(!x){B.addAssistantMessage("当前任务没有可用的取消边界,无法执行用户 Shell 命令。");return}let r=await L1(S,x.signal);if(!r.success&&r.error&&r.error!=="aborted")B.setError(r.error);return}if(U){if(S.text.trimStart().startsWith("/")){let c0=S.text.trim();if(/^\/(?:goal|queue)(?:\s|$)/i.test(c0)){await U8();let b$=L.getAbortController(),z1=/^\/queue(?:\s|$)/i.test(c0)?b$?.signal??new AbortController().signal:(b$??L.createAbortController()).signal;await B6(S,C,B,z1,I,z,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,K);return}B.addAssistantMessage("活动回合中不能执行 slash command;请先停止任务或等待完成。");return}await U8();let x=await E$.getInstance().executeUserPromptSubmitHooks(S.text,{projectDir:K,sessionId:z,permissionMode:q,hasImages:S.images.length>0,imageCount:S.images.length});if(!x.proceed){if(x.warning)B.addAssistantMessage(x.warning);return}let r=S;if(x.updatedPrompt)r={...S,text:x.updatedPrompt,parts:[{type:"text",text:x.updatedPrompt},...S.parts.filter((c0)=>c0.type==="image")]};if(x.contextInjection){let c0=`<user-prompt-submit-hook>
|
|
37
|
-
${x.contextInjection}
|
|
38
|
-
</user-prompt-submit-hook>`;r={...r,text:`${r.text}
|
|
39
|
-
|
|
40
|
-
${c0}`,parts:[...r.parts,{type:"text",text:`
|
|
41
|
-
|
|
42
|
-
${c0}`}]}}let P0=O6(r),l0=await P(P0);if(!l0.accepted){let c0=l0.reason==="queue_full"?"补充指令队列已满,请等待当前任务处理后重试。":"当前任务正在结束,补充指令未入队,请稍后重试。";B.addAssistantMessage(c0);return}if(l0.messageId)L.rememberFollowUpPresentation(l0.messageId,S);if(l0.queue)C.projectFollowUpQueue(l0.queue,g0);if(l0.delivery==="next_turn")I$.request();return}C.setTasks([]),L.setRecoveredSteeringCount(0),A.current=!1;let g=L.createAbortController();r0.resetStreamingBuffers(),B.clearFinalizingStreamingMessageId(),L.setProcessing(!0);try{let x=await y2(S);if(!x.success&&x.error&&x.error!=="aborted")B.setError(x.error)}catch(x){let r=n8(x);if(r.isAbort);else B.setError(`执行失败: ${r.displayMessage}`)}finally{if(L.getAbortController()===g)L.setProcessing(!1),L.clearAbortController(g),B.setCurrentThinkingContent(null),R.current?.notifyIdle()}});return u1(()=>{let S=F4.subscribe((v)=>{if(!FY(v,{sessionId:z,projectPath:K}))return;if(v.type.startsWith("team.")){let{teamName:g,messageId:x,content:r}=v.properties,P0=v.properties.metadata;if(v.type==="team.message.received"&&typeof g==="string"&&typeof x==="string"&&typeof r==="string"&&PY(P0,{messageId:x,teamName:g}))(async()=>{let l0=await j(r,{messageId:x,origin:"team_message",metadata:P0});if(!l0.accepted)return;if(await new wY(g,Z8()).markDelivered([x]),l0.delivery==="next_turn")I$.request()})().catch((l0)=>{G8.warn("[useCommandHandler] Failed to deliver teammate message",l0)});queueMicrotask(()=>{d0()});return}if(v.type!=="subagent.completion.queued")return;I$.request()});return()=>{S()}},[j,I$,d0,z,K]),u1(()=>{let S=!1;return(async()=>{if(Y)await P6.resolvePendingWithHandler(K,z,Y);else await P6.cancelPendingNonInteractive(K,z);if(S)return;let[v,g]=await Promise.all([l$.hasPendingInbox(K,z),l$.hasActiveGoal(K,z)]),x=!v&&!g&&await l$.hasRecoverableTurn(K,z);if(v||g||x)I$.request()})().catch((v)=>{if(!S)G8.warn("[useCommandHandler] Failed to recover pending interaction or inbox",v)}),()=>{S=!0}},[Y,I$,z,K]),{executeCommand:e,handleAbort:B1,isProcessing:U||M?.status==="loading",cleanupAgent:I,refreshFollowUpQueue:N$,controlFollowUpQueue:u$}};import{useMemoizedFn as L4}from"ahooks";import{useRef as N7,useState as W7}from"react";var TY=()=>{let[$,J]=W7([]),Y=N7(-1),X=L4((U,z)=>{let K={display:U,pasteMappings:z?new Map(z):new Map};J((O)=>[...O,K]),Y.current=-1}),Z=L4(()=>{if($.length===0)return null;let U=Y.current===-1?$.length-1:Math.max(0,Y.current-1);return Y.current=U,$[U]||null}),Q=L4(()=>{if(Y.current===-1)return null;let U=Y.current+1;if(U>=$.length)return Y.current=-1,null;else return Y.current=U,$[U]||null}),G=L4(()=>{Y.current=-1});return{commandHistory:$,historyIndex:Y.current,addToHistory:X,getPreviousCommand:Z,getNextCommand:Q,resetHistoryIndex:G}};import{useMemoizedFn as K8}from"ahooks";import{useMemo as H7,useRef as RY,useState as F7}from"react";var CY=()=>{let[$,J]=F7({isVisible:!1,details:null,resolver:null}),Y=RY(null),X=RY([]),Z=K8((O)=>{Y.current=O,J({isVisible:Boolean(O),details:O?.details??null,resolver:O?.resolve??null})}),Q=K8((O,q)=>{if(O.settled)return;if(O.settled=!0,O.signal&&O.abortListener)O.signal.removeEventListener("abort",O.abortListener);O.resolve(q)}),G=K8((O,q)=>{return new Promise((N)=>{let _={details:O,resolve:N,signal:q,settled:!1},H=()=>{if(Y.current===_){Q(_,{approved:!1,reason:z8}),Z(X.current.shift()??null);return}let W=X.current.indexOf(_);if(W>=0)X.current.splice(W,1);Q(_,{approved:!1,reason:z8})};if(_.abortListener=H,q?.aborted){H();return}if(q?.addEventListener("abort",H,{once:!0}),!Y.current){Z(_);return}X.current.push(_)})}),U=K8((O)=>{let q=Y.current;if(q)Q(q,O);let N=X.current.shift()??null;Z(N)}),z=K8(()=>{if(Y.current)Q(Y.current,{approved:!1,reason:z8});for(let O of X.current)Q(O,{approved:!1,reason:z8});X.current=[],Z(null)}),K=H7(()=>({requestConfirmation:G}),[G]);return{confirmationState:$,confirmationHandler:K,handleResponse:U,dismissAll:z}};import{useMemoizedFn as Q2}from"ahooks";import{useRef as yY,useState as L7}from"react";var A6="␞",b6="␟";function B4($){return`${A6}PASTE:${$}:`}function M6(){return b6}var B7=`${A6}PASTE:(\\d+):[\\s\\S]*?${b6}`;function w7($){return $.includes(A6)&&$.includes(b6)}function P7($,J,Y){let X=[...$.values()].filter((G)=>G.type==="image");if(X.length>=j2)throw Error(`最多只能粘贴 ${j2} 张图片`);let Z=X.reduce((G,U)=>G+`data:${U.mimeType};base64,`.length+U.data.length,0),Q=`data:${Y};base64,`.length+J.length;if(Z+Q>e8)throw Error("图片编码后总大小不能超过 5 MiB")}function A7($,J){let Y=[],X=[];if(!w7($)){let q=$.trim();if(q)X.push({type:"text",text:q});return{displayText:$,text:$,images:Y,parts:X}}let Z=Array.from($.matchAll(new RegExp(B7,"g"))),Q=0,G="",U="";for(let q of Z){let N=q.index,_=N+q[0].length,H=parseInt(q[1],10),W=J.get(H);if(N>Q){let b=$.slice(Q,N);X.push({type:"text",text:b}),G+=b,U+=b}if(!W)G+=q[0],U+=q[0],X.push({type:"text",text:q[0]});else if(W.type==="text")G+=W.data,U+=W.data,X.push({type:"text",text:W.data});else{let b={id:H,base64:W.data,mimeType:W.mimeType};Y.push(b),X.push({type:"image",...b}),U+=`[Image #${H}]`}Q=_}if(Q<$.length){let q=$.slice(Q);X.push({type:"text",text:q}),G+=q,U+=q}let z=[];for(let q of X){let N=z[z.length-1];if(q.type==="text"&&N?.type==="text")N.text+=q.text;else z.push(q)}let K=0,O=z.length;while(K<z.length){let q=z[K];if(q.type!=="text"||q.text.trim()!=="")break;K++}while(O>K){let q=z[O-1];if(q.type!=="text"||q.text.trim()!=="")break;O--}return{displayText:U.trim(),text:G.trim(),images:Y,parts:z.slice(K,O)}}function IY($="",J=0){let[Y,X]=L7({value:$,cursorPosition:J}),Z=yY(0),Q=yY(new Map),G=Q2((_)=>{X((H)=>({value:_,cursorPosition:H.cursorPosition}));for(let H of Q.current.keys()){let W=B4(H);if(!_.includes(W))Q.current.delete(H)}}),U=Q2((_)=>{X((H)=>({...H,cursorPosition:Math.max(0,Math.min(_,H.value.length))}))}),z=Q2(()=>{X({value:"",cursorPosition:0}),Q.current.clear()}),K=Q2((_)=>{Z.current+=1;let H=Z.current;return Q.current.set(H,{type:"text",data:_}),H}),O=Q2((_,H)=>{P7(Q.current,_,H),Z.current+=1;let W=Z.current;return Q.current.set(W,{type:"image",data:_,mimeType:H}),W}),q=Q2((_)=>{for(let[H,W]of _)if(Q.current.set(H,W),H>=Z.current)Z.current=H}),N=Q2((_)=>A7(_,Q.current));return{value:Y.value,cursorPosition:Y.cursorPosition,setValue:G,setCursorPosition:U,clear:z,pasteMap:Q.current,addPasteMapping:K,addImagePasteMapping:O,restorePasteMappings:q,resolveInput:N}}import{useMemoizedFn as mY}from"ahooks";import{useEffect as pY,useRef as xY,useState as C6}from"react";function b7($){return{supportsThinking:b1().resolveConfig($).reasoning}}function w4($){return b7($).supportsThinking}import{useInput as SY}from"ink";import{createContext as M7,useCallback as T7,useContext as R7,useEffect as C7,useMemo as y7,useRef as P4}from"react";import{jsxDEV as I7}from"react/jsx-dev-runtime";var kY=M7(null);function DY({children:$}){let J=P4(new Map),Y=P4(0),X=T7((Q,G,U)=>{let z=Y.current++;return J.current.set(z,{id:z,priority:G,handler:Q}),U?.(),()=>{J.current.delete(z)}},[]),Z=y7(()=>({register:X}),[X]);return SY((Q,G)=>{let U=[...J.current.values()].sort((z,K)=>K.priority-z.priority||z.id-K.id);for(let z of U)if(z.handler(Q,G)===!0)break}),I7(kY.Provider,{value:Z,children:$},void 0,!1,void 0,this)}function N0($,J={}){let Y=R7(kY),X=P4($);X.current=$;let Z=J.isActive??!0,Q=J.priority??0,G=P4(J.onRegistered);G.current=J.onRegistered,SY((U,z)=>{if(!Y&&Z)X.current(U,z)},{isActive:!Y&&Z}),C7(()=>{if(!Y||!Z)return;return Y.register((U,z)=>X.current(U,z),Q,()=>G.current?.())},[Z,Q,Y])}import S7 from"fast-glob";import k7 from"fuse.js";import{useEffect as fY,useMemo as A4,useRef as D7,useState as T6}from"react";var g2=null,f7=5000;function v7($,J){let Y=[...$.matchAll(/(?:^|\s)(@(?:"[^"]*"|(?:[^\\ ]|\\ )*))/g)];for(let X of Y){let Z=X[1],Q=X.index+(X[0].length-Z.length),G=Q+Z.length;if(J>=Q&&J<=G){let U=Z.slice(1),z=!1;if(U.startsWith('"')){if(z=!0,U=U.slice(1),U.endsWith('"'))U=U.slice(0,-1)}return{hasQuery:!0,query:U,startIndex:Q,endIndex:G,quoted:z}}}return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1}}var V7=[...R6.map(($)=>`${$}/**`),...R6,...vY.map(($)=>`**/${$}`)];function VY($,J,Y={}){let{cwd:X=K$(),maxSuggestions:Z=15,ignorePatterns:Q=V7,debounceDelay:G=300,fuzzyMatch:U=!0,disabled:z=!1,canRequest:K}=Y,O=D7(K);O.current=K;let[q,N]=T6([]),[_,H]=T6(!1),[W,b]=T6(0),M=A4(()=>JSON.stringify(Q),[Q]),w=!z&&$.includes("@"),B=A4(()=>{if(J===void 0)return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1};return v7($,J)},[$,J]);fY(()=>{if(!w){N([]),H(!1);return}let A=Date.now();if(g2&&g2.cwd===X&&g2.ignoreKey===M&&A-g2.timestamp<f7){N(g2.files),H(!1);return}let F=!1,k=setTimeout(async()=>{if(z||O.current?.()===!1){N([]),H(!1);return}H(!0);try{let I=(await S7("**/*",{cwd:X,dot:!1,followSymbolicLinks:!1,onlyFiles:!1,markDirectories:!0,unique:!0,ignore:Q})).map((P)=>P.replace(/\\/g,"/"));if(!F)N(I),g2={cwd:X,ignoreKey:M,files:I,timestamp:A}}catch(T){if(console.error("Failed to load files for @ completion:",T),!F)N([])}finally{if(!F)H(!1)}},G);return()=>{F=!0,clearTimeout(k)}},[w,X,G,M,z]);let C=A4(()=>U&&q.length>0?new k7(q,{threshold:0.4,ignoreLocation:!0,minMatchCharLength:1}):null,[q,U]),L=A4(()=>{if(!B.hasQuery||q.length===0)return[];let A=B.query.toLowerCase();if(A==="")return q.slice(0,Z);if(C)return C.search(A).slice(0,Z).map((R)=>R.item);return q.filter((F)=>F.toLowerCase().includes(A)).slice(0,Z)},[B,q,C,Z]);return fY(()=>{b(0)},[L]),{...B,suggestions:L,selectedIndex:W,loading:_}}function j7($,J=!1){if($.includes(" ")||J)return`@"${$}"`;return`@${$}`}function jY($,J,Y){if(!J.hasQuery)return{newInput:$,newCursorPos:$.length};let X=j7(Y,J.quoted),Z=$.slice(0,J.startIndex),Q=$.slice(J.endIndex),G=Z+X+" "+Q,U=J.startIndex+X.length+1;return{newInput:G,newCursorPos:U}}import{useMemoizedFn as EY}from"ahooks";import{useEffect as hY,useRef as gY}from"react";var s0=($,J)=>{let Y=gY(!1),X=gY(null),Z=EY(()=>{if(X.current)clearTimeout(X.current);X.current=setTimeout(()=>{L$().setAwaitingSecondCtrlC(!1),Y.current=!1,X.current=null},3000)}),Q=()=>{q8().shutdown("SIGINT",0)},G=EY(()=>{if(!Y.current){if(Y.current=!0,$&&J)J();L$().setAwaitingSecondCtrlC(!0),Z()}else{if(X.current)clearTimeout(X.current),X.current=null;L$().setAwaitingSecondCtrlC(!1),Q()}});return hY(()=>{if($){if(L$().setAwaitingSecondCtrlC(!1),Y.current=!1,X.current)clearTimeout(X.current),X.current=null}},[$]),hY(()=>{return()=>{if(X.current)clearTimeout(X.current)}},[]),G};var b4=_1("UI"),dY=($,J,Y,X,Z,Q,G,U,z,K,O=!1)=>{let N=X$()==="main-input",_=$.value,H=$.setValue,W=$.cursorPosition,b=p1(),M=q1(),w=x1(),B=g8(),C=B?w4(B):!1,[L,A]=C6(!1),[F,R]=C6([]),[k,T]=C6(0),I=VY(_,W,{cwd:M,maxSuggestions:10,disabled:O,canRequest:()=>m0().app.activeModal!=="sessionHistoryViewer"}),P=s0(G||!1,Q),j=xY(0),o=500,u=xY(!1);pY(()=>{if(G)u.current=!1},[G]),pY(()=>{if(O){A(!1),R([]);return}if(I.hasQuery&&I.suggestions.length>0){let J0=I.suggestions.map((f)=>({command:f,description:cY(f)?`Directory: ${f}`:`File: ${f}`,matchScore:1}));R(J0),A(!0),T(0)}else if(_.startsWith("/"))if(_.includes(" "))A(!1),R([]);else{let f=uY(_,M);R(f),A(f.length>0),T(0)}else A(!1),R([])},[_,I.hasQuery,I.suggestions,M,O]);let Z0=mY(()=>{b.clearMessages(),b.setError(null)}),z0=mY(()=>{if(O)return;b4.debug("[DIAG] handleSubmit called:",{input:_,showSuggestions:L});let J0=_.trim();if(J0){let f=$.resolveInput(J0);b4.debug("[DIAG] Submitting command:",{displayText:J0,textLength:f.text.length,imageCount:f.images.length}),A(!1),R([]);let E=$.pasteMap.size>0?new Map($.pasteMap):new Map;Z(J0,E),$.clear(),J(f),b4.debug("[DIAG] Command submitted to onSubmit callback")}else b4.debug("[DIAG] Empty command, not submitting")});return N0((J0,f)=>{if(J0==="?"&&!_)return z?.(),setTimeout(()=>$.clear(),0),!0;if(f.backspace||f.delete||f.leftArrow||f.rightArrow||f.pageUp||f.pageDown||!f.ctrl&&!f.meta&&!f.escape&&!f.tab&&!f.upArrow&&!f.downArrow&&!f.return&&!(J0==="?"&&!_))return!1;if(f.ctrl&&J0==="c"||f.meta&&J0==="c"||f.ctrl&&J0==="d"||f.meta&&J0==="d")return P(),!0;if(f.ctrl&&J0==="l"||f.meta&&J0==="l")return Z0(),!0;if(f.ctrl&&J0==="t"||f.meta&&J0==="t")return b.toggleThinkingExpanded(),!0;if(f.escape){if(K)z?.();else if(G&&Q){if(u.current)return!0;u.current=!0,Q()}else if(L)A(!1),R([]);else if(_){let m=Date.now();if(m-j.current<500)$.clear(),j.current=0;else j.current=m}return!0}if(f.tab&&f.shift)return U?.(),!0;if(f.tab){if(L&&F.length>0){let m=F[k].command;if(I.hasQuery&&I.suggestions.includes(m)){let{newInput:Y0,newCursorPos:c}=jY(_,I,m);H(Y0),$.setCursorPosition(c)}else{let Y0=m+" ";H(Y0),$.setCursorPosition(Y0.length)}A(!1),R([])}else if(C)w.toggleThinkingMode();return!0}if(f.return)return z0(),!0;if(f.upArrow){if(L&&F.length>0){let m=F.length-1;T((Y0)=>Y0>0?Y0-1:m)}else{let m=Y();if(m){if(m.pasteMappings.size>0)$.restorePasteMappings(m.pasteMappings);H(m.display),$.setCursorPosition(m.display.length)}}return!0}if(f.downArrow){if(L&&F.length>0){let m=F.length-1;T((Y0)=>Y0<m?Y0+1:0)}else{let m=X();if(m){if(m.pasteMappings.size>0)$.restorePasteMappings(m.pasteMappings);H(m.display),$.setCursorPosition(m.display.length)}}return!0}return!1},{isActive:N&&!O,priority:20}),{handleSubmit:z0,showSuggestions:L,suggestions:F,selectedSuggestionIndex:k}};import d7 from"ansi-escapes";import{useStdout as l7}from"ink";import{useCallback as r7,useEffect as a7,useRef as i7}from"react";import{useStdout as E7}from"ink";import{debounce as h7}from"lodash-es";import{useEffect as g7,useState as m7}from"react";var lY={columns:80,rows:24};function p7($){return{width:$.columns||80,height:$.rows||24}}function x7($,J){return $.width===J.width&&$.height===J.height}function rY($,J,Y){let{stdout:X}=E7(),[Z,Q]=m7(()=>$(X));return g7(()=>{let G=()=>{let z=$(X);Q((K)=>J(K,z)?K:z)},U=h7(G,Y);return G(),X.on("resize",U),()=>{X.off("resize",U),U.cancel()}},[X,Y,J,$]),Z}function c7($){return $.columns||lY.columns}function u7($){return $.rows||lY.rows}function aY($,J=200){return rY($==="columns"?c7:u7,Object.is,J)}function d1($=200){return rY(p7,x7,$)}function m2($=200){return aY("columns",$)}function iY(){let{stdout:$}=l7(),J=m2(),Y=i7(!0),X=q0((Q)=>Q.session.actions.incrementClearCount),Z=r7(()=>{if($)$.write(d7.clearTerminal);X()},[$,X]);return a7(()=>{if(Y.current){Y.current=!1;return}Z()},[J,Z]),{refreshStatic:Z}}import{useEffect as e7}from"react";var o7=50,sY=500,n7=new Set(["session_surface_cursor_invalid","session_surface_snapshot_changed"]);function oY($=0){return{viewGeneration:$,status:"idle",messages:[],truncated:!1}}function y6($,J){if($.version!==J.version||$.sessionId!==J.sessionId)return!1;if($.workspace.kind!==J.workspace.kind)return!1;if($.workspace.kind==="local"&&J.workspace.kind==="local")return $.workspace.projectPath===J.workspace.projectPath;return $.workspace.kind==="acp-remote"&&J.workspace.kind==="acp-remote"&&$.workspace.workspaceRef===J.workspace.workspaceRef}function nY($,J){if($.workspace.kind!==J.workspace.kind)return!1;if($.workspace.kind==="local"&&J.workspace.kind==="local")return $.workspace.projectPath===J.workspace.projectPath;return $.workspace.kind==="acp-remote"&&J.workspace.kind==="acp-remote"&&$.workspace.workspaceRef===J.workspace.workspaceRef}function I6($){switch($){case"session_surface_not_found":return"Session history is no longer available.";case"session_surface_cursor_invalid":case"session_surface_snapshot_changed":return"Session history changed. Reopen it to continue.";case"session_surface_capability_unavailable":case"session_surface_read_only":return"This action is unavailable in history-only mode.";case"session_surface_capacity":return"Session history is busy. Try again.";default:return"Session history is unavailable."}}function _8($){let J=$ instanceof S$?$.code:null;return{code:J,message:I6(J)}}function t7($){return $.slice(-sY).map((Y)=>({...Y}))}function s7($,J){let Y=new Set(J.map((X)=>X.id));return[...$.filter((X)=>!Y.has(X.id)),...J].slice(0,sY).map((X)=>({...X}))}class S6{serviceFactory;pageLimit;listeners=new Set;service=null;pendingServiceClose=null;ownerClosePromise=null;activeController=null;generation=0;pageRequest=null;activeActivation=null;disposed=!1;state=oY();constructor($={}){this.serviceFactory=$.serviceFactory??(()=>new M4),this.pageLimit=$.pageLimit??o7}getState(){return this.state}subscribe($){return this.listeners.add($),()=>this.listeners.delete($)}async listPage($={}){let J=this.generation;if(await this.waitForPendingServiceClose(),this.assertOpen(),!this.isCurrent(J))throw new S$("session_surface_unavailable");let Y=this.service??this.createService(),X=await Y.listPage($);if(!this.isCurrent(J,Y))throw new S$("session_surface_unavailable");return X}async listAll(){let $=this.generation,J=[],Y=new Set,X;do{if(!this.isCurrent($))throw new S$("session_surface_unavailable");let Z=await this.listPage({cursor:X,limit:this.pageLimit});if(!this.isCurrent($))throw new S$("session_surface_unavailable");for(let Q of Z.sessions){let G=tY(Q.locator);if(Y.has(G))continue;Y.add(G),J.push(Q)}X=Z.nextCursor}while(X);return J}async open($){if(this.assertOpen(),$.locator.workspace.kind!=="acp-remote")throw new S$("invalid_session_locator");let J=++this.generation;this.abortActiveRequest("history-view-replaced");let Y=this.service;if(this.service=null,!$.capabilities.history.read){this.setState({status:"error",session:$,messages:[],truncated:!1,error:{code:"session_surface_capability_unavailable",message:I6("session_surface_capability_unavailable")}}),await this.closeService(Y,"history-view-replaced");return}if(this.setState({status:"loading",session:$,messages:[],truncated:!1}),await this.closeService(Y,"history-view-replaced"),!this.isCurrent(J))return;let X=this.createService(),Z=this.beginRequest();try{let Q=await X.open($.locator,{limit:this.pageLimit});if(!this.isCurrent(J,X,Z))return;if(!y6($.locator,Q.session.locator))throw new S$("workspace_binding_mismatch");this.commitResult(Q,"ready")}catch(Q){if(!this.isCurrent(J,X,Z))return;this.setState({status:"error",session:$,messages:[],truncated:!1,error:_8(Q)})}finally{if(this.activeController===Z)this.activeController=null}}activate($,J){let Y=`${J}\x00${tY($.locator)}`;if(this.activeActivation?.key===Y)return this.activeActivation.promise;let X=this.activateUnshared($,J).finally(()=>{if(this.activeActivation?.promise===X)this.activeActivation=null});return this.activeActivation={key:Y,promise:X},X}async activateUnshared($,J){if(J==="resume")return this.open($);if(this.assertOpen(),$.locator.workspace.kind!=="acp-remote"||!$.capabilities.history.fork)throw new S$("session_surface_capability_unavailable");let Y=++this.generation;this.abortActiveRequest("history-view-replaced"),this.setState({status:"forking",session:$,messages:[],truncated:!1});let X=this.service;if(this.service=null,await this.closeService(X,"history-view-replaced"),!this.isCurrent(Y))return;let Z=this.createService(),Q=this.beginRequest();try{let G=await Z.fork($.locator);if(!this.isCurrent(Y,Z,Q))return;if(G.session.locator.workspace.kind!=="acp-remote"||!nY($.locator,G.session.locator))throw new S$("workspace_binding_mismatch");this.commitResult(G,"ready")}catch(G){if(!this.isCurrent(Y,Z,Q))return;this.setState({status:"error",session:$,messages:[],truncated:!1,error:_8(G)})}finally{if(this.activeController===Q)this.activeController=null}}loadOlder($){if(this.pageRequest)return this.pageRequest;if(this.state.status!=="ready"&&this.state.status!=="error")return Promise.resolve();let{session:J,olderCursor:Y,snapshot:X}=this.state,Z=this.service;if(!Z||!J||!Y||!X||!J.capabilities.history.read||!this.matchesActionTarget($)||$.olderCursor!==Y)return Promise.resolve();let Q=this.generation,G=this.beginRequest();this.setState({...this.state,status:"loading-older",error:void 0});let U=Z.historyPage(J.locator,{cursor:Y,expectedSnapshot:X,limit:this.pageLimit}).then((z)=>{if(!this.isCurrent(Q,Z,G))return;if(z.snapshot!==X)throw new S$("session_surface_snapshot_changed");this.setState({...this.state,status:"ready",messages:s7(z.messages,this.state.messages),olderCursor:z.olderCursor,snapshot:z.snapshot,truncated:this.state.truncated||z.truncated,error:void 0})}).catch(async(z)=>{if(!this.isCurrent(Q,Z,G))return;if(z instanceof S$&&n7.has(z.code)){this.setState({status:"loading",session:J,messages:[],truncated:!1});try{let K=await Z.open(J.locator,{limit:this.pageLimit});if(!this.isCurrent(Q,Z,G))return;if(!y6(J.locator,K.session.locator))throw new S$("workspace_binding_mismatch");this.commitResult(K,"ready")}catch(K){if(!this.isCurrent(Q,Z,G))return;this.setState({status:"error",session:J,messages:[],truncated:!1,error:_8(K)})}return}this.setState({...this.state,status:"error",error:_8(z)})}).finally(()=>{if(this.activeController===G)this.activeController=null;if(this.pageRequest===U)this.pageRequest=null});return this.pageRequest=U,U}async fork($){if(this.state.status!=="ready")return;let J=this.state.session,Y=this.service;if(!J||!Y||!this.matchesActionTarget($))return;if(!J.capabilities.history.fork){this.setState({...this.state,status:"error",error:{code:"session_surface_capability_unavailable",message:I6("session_surface_capability_unavailable")}});return}let X=++this.generation;if(this.abortActiveRequest("history-fork"),this.setState({...this.state,status:"forking",error:void 0}),this.service=null,await this.closeService(Y,"history-fork"),!this.isCurrent(X))return;let Z=this.createService(),Q=this.beginRequest();try{let G=await Z.fork(J.locator);if(!this.isCurrent(X,Z,Q))return;if(G.session.locator.workspace.kind!=="acp-remote"||!nY(J.locator,G.session.locator))throw new S$("workspace_binding_mismatch");this.commitResult(G,"ready")}catch(G){if(!this.isCurrent(X,Z,Q))return;this.setState({...this.state,status:"error",error:_8(G)})}finally{if(this.activeController===Q)this.activeController=null}}async closeView(){this.generation+=1,this.activeActivation=null,this.abortActiveRequest("history-view-closed"),this.pageRequest=null;let $=this.service;this.service=null,this.setState(oY(this.generation)),await this.closeService($,"history-view-closed")}close(){if(this.ownerClosePromise)return this.ownerClosePromise;return this.disposed=!0,this.listeners.clear(),this.ownerClosePromise=this.closeView(),this.ownerClosePromise}createService(){let $=this.serviceFactory();return this.service=$,$}closeService($,J){if(!$)return this.waitForPendingServiceClose();let Y=this.pendingServiceClose,X=(async()=>{if(Y)await Y;await $.close(J)})();this.pendingServiceClose=X;let Z=()=>{if(this.pendingServiceClose===X)this.pendingServiceClose=null};return X.then(Z,Z),X}waitForPendingServiceClose(){return this.pendingServiceClose??Promise.resolve()}matchesActionTarget($){let J=this.state.session;return J!==void 0&&$.viewGeneration===this.state.viewGeneration&&y6($.locator,J.locator)&&$.snapshot===this.state.snapshot}beginRequest(){this.abortActiveRequest("history-request-replaced");let $=new AbortController;return this.activeController=$,$}abortActiveRequest($){this.activeController?.abort($),this.activeController=null}isCurrent($,J,Y){return!this.disposed&&$===this.generation&&(J===void 0||J===this.service)&&(Y===void 0||!Y.signal.aborted)}commitResult($,J){this.setState({status:J,session:$.session,messages:t7($.history.messages),olderCursor:$.history.olderCursor,snapshot:$.history.snapshot,truncated:$.history.truncated})}setState($){this.state={...$,viewGeneration:$.viewGeneration??this.generation};for(let J of this.listeners)J(this.state)}assertOpen(){if(this.disposed)throw new S$("session_surface_unavailable")}}function tY($){return $.workspace.kind==="local"?`${$.version}\x00local\x00${$.workspace.projectPath}\x00${$.sessionId}`:`${$.version}\x00acp-remote\x00${$.workspace.workspaceRef}\x00${$.sessionId}`}class k6{factory;active;generation=0;remoteRequestEpoch=0;constructor($=()=>new S6){this.factory=$}acquire($){let J=++this.generation;this.active??=this.factory();let Y=this.active,X=Y.subscribe($);return async()=>{if(X(),await Promise.resolve(),this.generation!==J)return;if(this.active===Y)this.active=void 0;await Y.close()}}getState(){return this.active?.getState()??{viewGeneration:0,status:"idle",messages:[],truncated:!1}}activate($,J){return this.active?.activate($,J)??Promise.resolve()}closeView(){return this.cancelRemoteRequest(),this.active?.closeView()??Promise.resolve()}loadOlder($){return this.active?.loadOlder($)??Promise.resolve()}fork($){return this.active?.fork($)??Promise.resolve()}beginRemoteRequest(){return++this.remoteRequestEpoch}cancelRemoteRequest(){this.remoteRequestEpoch+=1}isCurrentRemoteRequest($){return this.active!==void 0&&this.remoteRequestEpoch===$}}async function eY($,J,Y){let X=$.beginRemoteRequest(),Z=J.beginRemoteOpening();if(await Z.cleared.catch(()=>{return}),!$.isCurrentRemoteRequest(X)||!J.isRemoteOpeningCurrent(Z.epoch))return;let Q=$.activate(Y.session,Y.intent);if(!$.isCurrentRemoteRequest(X)||!J.bindRemoteOpening(Z.epoch,Y,$.getState().viewGeneration)){await Q;return}await Q}function $3({lifecycle:$,project:J,report:Y}){e7(()=>{let X=$.acquire(J);return()=>{X().catch(Y)}},[$,J,Y])}import{useEffect as QQ}from"react";var $Q=100,JQ=30000,YQ=new Set(["task.status","session.deleted","session.archived"]);class Y3{timers=new WeakMap;setInterval($,J){let Y=setInterval($,J),X={unref:()=>Y.unref()};return this.timers.set(X,Y),X}clearInterval($){let J=this.timers.get($);if(!J)return;clearInterval(J),this.timers.delete($)}}var ZQ=new Y3;class D6{service;store;bus;timerApi;listeners=new Set;ownedOperations=new Set;mutationTail=Promise.resolve();state;visibleLocator;hasCompleteCatalog=!1;activeRefresh=null;dirty=!1;disposed=!1;started=!1;unsubscribeBus;pollTimer;closePromise;constructor($={}){this.service=$.service??new M4,this.store=$.store??new X4,this.bus=$.bus??F4,this.timerApi=$.timerApi??ZQ,this.state=J3("idle",[],this.store.snapshot().unreadKeys)}getState(){return this.state}subscribe($){if(this.disposed)return()=>{return};return this.listeners.add($),()=>this.listeners.delete($)}async start(){if(this.disposed)return;if(!this.started)this.started=!0,this.unsubscribeBus=this.bus.subscribe(($)=>{if(YQ.has($.type))this.consume(this.requestRefresh(!0))}),this.pollTimer=this.timerApi.setInterval(()=>{this.consume(this.requestRefresh(!0))},JQ),this.pollTimer.unref();await this.requestRefresh(!1)}listAll(){return this.requestRefresh(!1)}requestRefresh($){if(this.disposed)return Promise.resolve(G2(this.state.sessions));if(this.activeRefresh){if($)this.dirty=!0;return this.activeRefresh}let J,Y,X=new Promise((Z,Q)=>{J=Z,Y=Q});return this.activeRefresh=X,this.trackOperation(X),this.consume(this.drainRefresh(X,J,Y)),X}acknowledge($){return this.trackOperation(this.acknowledgeInternal($))}async acknowledgeInternal($){if(this.disposed)return;return this.enqueueMutation(async()=>{if(this.disposed)return;let J=await this.store.acknowledge($);if(this.disposed)return;this.publish(this.state.status,this.state.sessions,J.unreadKeys)})}async drainRefresh($,J,Y){try{let X=G2(this.state.sessions);do this.dirty=!1,X=await this.refreshOnce();while(!this.disposed&&this.dirty);if(this.activeRefresh===$)this.activeRefresh=null;J(X)}catch(X){if(this.activeRefresh===$)this.activeRefresh=null;Y(X)}}setVisibleLocator($){return this.trackOperation(this.setVisibleLocatorInternal($))}async setVisibleLocatorInternal($){if(this.disposed)return;if(this.visibleLocator=$?Z3($):void 0,await this.waitForActiveRefresh(),this.disposed)return;if(!this.hasCompleteCatalog)return;await this.enqueueMutation(async()=>{if(this.disposed)return;let J=await this.store.reconcile(this.state.sessions,this.visibleLocator);if(this.disposed)return;this.publish(this.state.status,this.state.sessions,J.unreadKeys)})}async waitForActiveRefresh(){let $=this.activeRefresh;while($){if(await $,this.disposed)return;$=this.activeRefresh}}close(){if(this.closePromise)return this.closePromise;if(this.disposed=!0,this.dirty=!1,this.unsubscribeBus?.(),this.unsubscribeBus=void 0,this.pollTimer)this.timerApi.clearInterval(this.pollTimer),this.pollTimer=void 0;this.listeners.clear();let $=this.service.close("tui-task-attention-controller-closed");return this.closePromise=this.drainOwnedOperations($),this.closePromise}async drainOwnedOperations($){let J=Promise.allSettled([$]);while(this.ownedOperations.size>0)await Promise.allSettled([...this.ownedOperations]);let[Y]=await J;if(Y?.status==="rejected")throw Y.reason}enqueueMutation($){let J=this.mutationTail.then($,$);return this.mutationTail=J.then(()=>{return},()=>{return}),J}trackOperation($){return this.ownedOperations.add($),$.then(()=>this.ownedOperations.delete($),()=>this.ownedOperations.delete($)),$}consume($){$.catch(()=>{return})}async refreshOnce(){this.publish("loading",this.state.sessions,this.state.unreadKeys);try{let $=await this.readCompleteCatalog();if(this.disposed)return G2(this.state.sessions);return await this.enqueueMutation(async()=>{if(this.disposed)return!1;let Y=await this.store.reconcile($,this.visibleLocator);if(this.disposed)return!1;return this.hasCompleteCatalog=!0,this.publish("ready",$,Y.unreadKeys),!0})?G2($):G2(this.state.sessions)}catch{if(!this.disposed)this.publish("error",this.state.sessions,this.state.unreadKeys);return G2(this.state.sessions)}}async readCompleteCatalog(){let $=[],J;do{let Y=await this.service.listPage({...J?{cursor:J}:{},limit:$Q});if(this.disposed)return[];$.push(...Y.sessions),J=Y.nextCursor}while(J);return $}publish($,J,Y){if(this.disposed)return;this.state=J3($,J,Y);for(let X of this.listeners)try{let Z=X(this.state);if(Z)this.consume(Z)}catch{}}}function J3($,J,Y){return Object.freeze({status:$,sessions:Object.freeze(G2(J).map(XQ)),unreadKeys:Object.freeze([...Y])})}function XQ($){return Object.freeze($.locator.workspace),Object.freeze($.locator),Object.freeze($.capabilities.history),Object.freeze($.capabilities.turn),Object.freeze($.capabilities.files),Object.freeze($.capabilities.terminal),Object.freeze($.capabilities),Object.freeze($)}function G2($){return $.map((J)=>({...J,locator:Z3(J.locator),capabilities:{...J.capabilities,history:{...J.capabilities.history},turn:{...J.capabilities.turn},files:{...J.capabilities.files},terminal:{...J.capabilities.terminal}}}))}function Z3($){return $.workspace.kind==="local"?{...$,workspace:{...$.workspace}}:{...$,workspace:{...$.workspace}}}class f6{factory;active;generation=0;constructor($=()=>new D6){this.factory=$}acquire($){let J=++this.generation;if(!this.active){let G=this.factory();this.active={controller:G,visibility:new F6(G)}}let Y=this.active,{controller:X,visibility:Z}=Y,Q=X.subscribe($);return{controller:X,visibility:Z,release:async()=>{if(Q(),await Promise.resolve(),this.generation!==J)return;if(this.active===Y)this.active=void 0;await X.close()}}}listAll(){let $=this.active?.controller;return $?$.listAll():Promise.reject(Error("TUI task attention lifecycle is not active"))}acknowledge($){return this.active?.controller.acknowledge($)??Promise.resolve()}setVisibleLocator($){return this.active?.controller.setVisibleLocator($)??Promise.resolve()}proveLocal($){return this.active?.visibility.proveLocal($)??Promise.resolve()}beginRemote($,J){return this.active?.visibility.beginRemote($,J)??Promise.resolve()}beginRemoteOpening(){return this.active?.visibility.beginRemoteOpening()??{epoch:0,cleared:Promise.resolve()}}isRemoteOpeningCurrent($){return this.active?.visibility.isRemoteOpeningCurrent($)??!1}bindRemoteOpening($,J,Y){return this.active?.visibility.bindRemoteOpening($,J,Y)??!1}endRemote(){return this.active?.visibility.endRemote()??Promise.resolve()}updateRemote($,J){return this.active?.visibility.updateRemote($,J)??Promise.resolve()}controller(){if(!this.active)throw Error("TUI task attention lifecycle is not active");return this.active.controller}visibility(){if(!this.active)throw Error("TUI task attention lifecycle is not active");return this.active.visibility}}function X3({ready:$,lifecycle:J,initialize:Y,project:X,report:Z}){QQ(()=>{if(!$)return;let Q=J.acquire(X);return Y(Q).catch(()=>Z("startup")),()=>{Q.release().catch(()=>Z("shutdown"))}},[Y,J,X,$,Z])}import U2 from"chalk";import GQ from"string-width";var k0={active:!1,renderedLineCount:0,lastRenderedLines:[],terminalWidth:process.stdout.columns||80,terminalHeight:process.stdout.rows||24,prefixIndent:4,isFirstRender:!0},R4="\x1B",v6=`${R4}[2K`,T4=($)=>$>0?`${R4}[${$}A`:"",Q3=`${R4}[?25l`,G3=`${R4}[?25h`;function U3($,J){k0.active=!0,k0.renderedLineCount=0,k0.lastRenderedLines=[],k0.terminalWidth=$,k0.terminalHeight=J,k0.isFirstRender=!0}function K3($,J){k0.terminalWidth=$,k0.terminalHeight=J}function z3($,J,Y,X){if(!k0.active)return;let Z=8,Q=Math.max(1,k0.terminalHeight-Z),G=[],U=F$.getTheme(),z=" ".repeat(k0.prefixIndent),K=U2.dim.hex(U.colors.border.light);if(J>0)G.push(`${z}${U2.dim.hex(U.colors.text.muted)(`^ ${J} lines above (streaming...)`)}`);let O=Y==="code",q=Y==="diff",N="",_=$;if(O&&$.length>0)N=$[0].match(/^```(\w+)?/)?.[1]||"",_=$.slice(1);else if(q&&$.length>0&&$[0]==="<<<DIFF>>>")_=$.slice(1);let H=_.slice(-Q);if(O&&J===0){let b=N?` ${U2.hex(U.colors.text.secondary)(N)}`:"";G.push(`${z}${K("╭─")}${b}`)}for(let b=0;b<H.length;b++){let M=H[b],w=z;if(b===0&&!X&&k0.isFirstRender&&!O&&!q)w=U2.bold.hex(U.colors.success)("• ")+" ",k0.isFirstRender=!1;let B=O?4:0,C=k0.terminalWidth-k0.prefixIndent-2-B,L=M;if(GQ(M)>C)L=M.slice(0,C);if(O)G.push(`${z}${K("│")} ${L}`);else if(q){let A=L;if(A.startsWith("+"))G.push(`${w}${U2.green(L)}`);else if(A.startsWith("-"))G.push(`${w}${U2.red(L)}`);else if(A.startsWith("@@"))G.push(`${w}${U2.dim(L)}`);else G.push(`${w}${L}`)}else G.push(`${w}${L}`);if(b===0&&!X&&k0.isFirstRender)k0.isFirstRender=!1}let W=[];if(W.push(Q3),k0.renderedLineCount>0)W.push(T4(k0.renderedLineCount)),W.push("\r");for(let b=0;b<G.length;b++){let M=G[b],w=k0.lastRenderedLines[b];if(M!==w)W.push(v6),W.push(M);if(b<G.length-1)W.push(`
|
|
43
|
-
`)}if(G.length<k0.renderedLineCount){for(let M=G.length;M<k0.renderedLineCount;M++)W.push(`
|
|
44
|
-
`),W.push(v6);let b=k0.renderedLineCount-G.length;W.push(T4(b))}W.push(G3),process.stdout.write(W.join("")),k0.renderedLineCount=G.length,k0.lastRenderedLines=G}function a$(){if(!k0.active)return;if(k0.renderedLineCount>0){let $=[];$.push(Q3),$.push(T4(k0.renderedLineCount)),$.push("\r");for(let J=0;J<k0.renderedLineCount;J++)if($.push(v6),J<k0.renderedLineCount-1)$.push(`
|
|
45
|
-
`);if(k0.renderedLineCount>1)$.push(T4(k0.renderedLineCount-1)),$.push("\r");$.push(G3),process.stdout.write($.join(""))}k0.active=!1,k0.renderedLineCount=0,k0.lastRenderedLines=[],k0.isFirstRender=!0}function Y1(){return k0.active}import q3 from"node:fs";import UQ from"node:os";import V6 from"node:path";import{MultiSelect as KQ}from"@inkjs/ui";import{useMemoizedFn as C4}from"ahooks";import{Box as b0,Text as H0,useFocus as zQ,useFocusManager as qQ}from"ink";import y4 from"ink-select-input";import _Q from"ink-spinner";import O8 from"ink-text-input";import{useEffect as _3,useState as p2}from"react";import{jsxDEV as h}from"react/jsx-dev-runtime";var OQ=[{label:"Glob - 文件搜索",value:"Glob"},{label:"Grep - 内容搜索",value:"Grep"},{label:"Read - 读取文件",value:"Read"},{label:"Write - 写入文件",value:"Write"},{label:"Edit - 编辑文件",value:"Edit"},{label:"ApplyPatch - 原子多文件补丁",value:"ApplyPatch"},{label:"Bash - 执行命令",value:"Bash"},{label:"所有工具 (不限制)",value:"all"}],NQ=[{label:"红色 (red)",value:"red"},{label:"蓝色 (blue)",value:"blue"},{label:"绿色 (green)",value:"green"},{label:"黄色 (yellow)",value:"yellow"},{label:"紫色 (purple)",value:"purple"},{label:"橙色 (orange)",value:"orange"},{label:"粉色 (pink)",value:"pink"},{label:"青色 (cyan)",value:"cyan"},{label:"不设置颜色",value:"none"}];function WQ($){if(!$||$.trim()==="")return"名称不能为空";if(!/^[a-z0-9-]+$/.test($))return"名称只能包含小写字母、数字和连字符";if($.startsWith("-")||$.endsWith("-"))return"名称不能以连字符开头或结尾";return null}function N8({onComplete:$,onCancel:J,initialConfig:Y}){let[X,Z]=p2(Y?"name":"mode"),[Q,G]=p2({name:Y?.name||"",description:Y?.description||"",tools:Y?.tools||[],color:Y?.color,location:Y?.location||"project",systemPrompt:Y?.systemPrompt||""}),[U,z]=p2(""),[K,O]=p2(!1),[q,N]=p2(""),[_,H]=p2(Y?"edit":"manual"),{focus:W}=qQ(),M={manual:["mode","name","description","tools","color","location","systemPrompt","confirm"],ai:["mode","aiPrompt","aiGenerating","confirm"],edit:["name","description","tools","color","location","systemPrompt","confirm"]}[_];_3(()=>{if(X==="name"||X==="description"||X==="systemPrompt"||X==="aiPrompt")return;W(`step-${X}`)},[X,W]);let w=C4(()=>{let F=M.indexOf(X);if(F<M.length-1)Z(M[F+1])}),B=C4(()=>{if(q)N("");if(X==="confirm"&&_==="ai"){Z("aiPrompt");return}let F=M.indexOf(X);if(F>0)Z(M[F-1]);else J()}),C=C4(async()=>{O(!0),N("");try{let F=await Q8.create(),R=`你是一个 Subagent 配置生成专家。用户会描述他们想要创建的 agent,你需要根据描述生成一个完整的 agent 配置。
|
|
46
|
-
|
|
47
|
-
## 可用工具列表
|
|
48
|
-
|
|
49
|
-
- **Glob**: 文件模式匹配(例如:查找所有 .ts 文件)
|
|
50
|
-
- **Grep**: 代码内容搜索(例如:搜索特定函数调用)
|
|
51
|
-
- **Read**: 读取文件内容
|
|
52
|
-
- **Write**: 写入/创建文件
|
|
53
|
-
- **Edit**: 编辑文件(字符串替换)
|
|
54
|
-
- **ApplyPatch**: 原子应用多文件文本补丁
|
|
55
|
-
- **Bash**: 执行命令行命令
|
|
56
|
-
|
|
57
|
-
## 可用颜色
|
|
58
|
-
|
|
59
|
-
- red, blue, green, yellow, purple, orange, pink, cyan
|
|
60
|
-
|
|
61
|
-
## 输出格式
|
|
62
|
-
|
|
63
|
-
你必须以 JSON 格式返回配置,格式如下:
|
|
64
|
-
|
|
65
|
-
\`\`\`json
|
|
66
|
-
{
|
|
67
|
-
"name": "agent-name",
|
|
68
|
-
"description": "简洁的一句话描述(英文)",
|
|
69
|
-
"tools": ["Glob", "Grep", "Read"],
|
|
70
|
-
"color": "blue",
|
|
71
|
-
"systemPrompt": "详细的系统提示词,说明这个 agent 的职责、工作方式、输出格式等"
|
|
72
|
-
}
|
|
73
|
-
\`\`\`
|
|
74
|
-
|
|
75
|
-
## 注意事项
|
|
76
|
-
|
|
77
|
-
1. **name**: 只能包含小写字母、数字和连字符(kebab-case),例如:code-reviewer
|
|
78
|
-
2. **description**: 一句话说明用途,建议以 "Fast agent specialized for..." 开头
|
|
79
|
-
3. **tools**: 根据任务选择必要的工具,不要选择太多
|
|
80
|
-
4. **color**: 选择一个合适的颜色用于 UI 区分
|
|
81
|
-
5. **systemPrompt**: 详细说明 agent 的职责、使用的工具、输出格式等,使用 Markdown 格式
|
|
82
|
-
|
|
83
|
-
**重要**:请直接返回 JSON,不要添加任何额外的解释或文字。`,T=(await F.chatWithSystem(`你是一个 Subagent 配置生成专家。用户会描述他们想要创建的 agent,你需要根据描述生成一个完整的 agent 配置。
|
|
84
|
-
|
|
85
|
-
## 可用工具列表
|
|
86
|
-
|
|
87
|
-
- **Glob**: 文件模式匹配(例如:查找所有 .ts 文件)
|
|
88
|
-
- **Grep**: 代码内容搜索(例如:搜索特定函数调用)
|
|
89
|
-
- **Read**: 读取文件内容
|
|
90
|
-
- **Write**: 写入/创建文件
|
|
91
|
-
- **Edit**: 编辑文件(字符串替换)
|
|
92
|
-
- **ApplyPatch**: 原子应用多文件文本补丁
|
|
93
|
-
- **Bash**: 执行命令行命令
|
|
94
|
-
|
|
95
|
-
## 可用颜色
|
|
96
|
-
|
|
97
|
-
- red, blue, green, yellow, purple, orange, pink, cyan
|
|
98
|
-
|
|
99
|
-
## 输出格式
|
|
100
|
-
|
|
101
|
-
你必须以 JSON 格式返回配置,格式如下:
|
|
102
|
-
|
|
103
|
-
\`\`\`json
|
|
104
|
-
{
|
|
105
|
-
"name": "agent-name",
|
|
106
|
-
"description": "简洁的一句话描述(英文)",
|
|
107
|
-
"tools": ["Glob", "Grep", "Read"],
|
|
108
|
-
"color": "blue",
|
|
109
|
-
"systemPrompt": "详细的系统提示词,说明这个 agent 的职责、工作方式、输出格式等"
|
|
110
|
-
}
|
|
111
|
-
\`\`\`
|
|
112
|
-
|
|
113
|
-
## 注意事项
|
|
114
|
-
|
|
115
|
-
1. **name**: 只能包含小写字母、数字和连字符(kebab-case),例如:code-reviewer
|
|
116
|
-
2. **description**: 一句话说明用途,建议以 "Fast agent specialized for..." 开头
|
|
117
|
-
3. **tools**: 根据任务选择必要的工具,不要选择太多
|
|
118
|
-
4. **color**: 选择一个合适的颜色用于 UI 区分
|
|
119
|
-
5. **systemPrompt**: 详细说明 agent 的职责、使用的工具、输出格式等,使用 Markdown 格式
|
|
120
|
-
|
|
121
|
-
**重要**:请直接返回 JSON,不要添加任何额外的解释或文字。`,U)).trim(),I=T.match(/```(?:json)?\s*\n([\s\S]*?)\n```/);if(I)T=I[1];let P=JSON.parse(T);if(!P.name||!P.description||!P.systemPrompt)throw Error("Missing required fields: name, description, or systemPrompt");if(!/^[a-z0-9]+(-[a-z0-9]+)*$/.test(P.name))throw Error("Invalid name format. Must be kebab-case (lowercase, numbers, hyphens only)");G({name:P.name,description:P.description,tools:Array.isArray(P.tools)?P.tools:[],color:P.color||"blue",location:"project",systemPrompt:P.systemPrompt}),Z("confirm")}catch(F){N(F instanceof Error?F.message:String(F))}finally{O(!1)}});_3(()=>{if(X==="aiGenerating"&&!K&&!q)C()},[X,K,q,C]);let L=C4(async()=>{try{let F=Q.location==="project"?V6.join(K$(),".blade","agents"):V6.join(UQ.homedir(),".blade","agents");await q3.promises.mkdir(F,{recursive:!0});let R=["---",`name: ${Q.name}`,`description: ${Q.description}`];if(Q.tools.length>0&&!Q.tools.includes("all")){R.push("tools:");for(let I of Q.tools)R.push(` - ${I}`)}if(Q.color)R.push(`color: ${Q.color}`);R.push("---");let k=[R.join(`
|
|
122
|
-
`),"",`# ${Q.name} Subagent`,"",Q.systemPrompt||"你是一个专门的代理,负责执行特定任务。",""].join(`
|
|
123
|
-
`),T=V6.join(F,`${Q.name}.md`);await q3.promises.writeFile(T,k,"utf-8"),$()}catch(F){console.error("保存配置失败:",F)}}),A=s0(!1,J);if(N0((F,R)=>{if(R.escape)B();else if(R.ctrl&&F==="c"||R.meta&&F==="c")A()},{isActive:X!=="tools"}),X==="mode")return h(b0,{flexDirection:"column",paddingY:1,children:[h(b0,{marginBottom:1,children:h(H0,{bold:!0,color:"cyan",children:"选择创建方式"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(b0,{marginBottom:1,children:h(H0,{dimColor:!0,children:"你可以手动配置每个细节,或让 AI 根据你的描述自动生成配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(y4,{items:[{label:"AI 智能生成 - 根据描述自动生成完整配置",value:"ai"},{label:"手动配置 - 逐步配置每个选项",value:"manual"}],onSelect:(F)=>{if(F.value==="ai")H("ai"),Z("aiPrompt");else H("manual"),Z("name")}},void 0,!1,void 0,this),h(b0,{marginTop:1,children:h(H0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 取消"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(X==="aiPrompt")return h(b0,{flexDirection:"column",paddingY:1,children:[h(b0,{marginBottom:1,children:h(H0,{bold:!0,color:"cyan",children:"AI 智能生成"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(b0,{marginBottom:1,children:h(H0,{dimColor:!0,children:'描述你想要创建的 Agent(例如:"一个专门用于代码审查的 agent,能够分析代码质量和潜在bug")'},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(b0,{marginBottom:1,children:[h(H0,{color:"green",children:"描述: "},void 0,!1,void 0,this),h(O8,{value:U,onChange:z,onSubmit:(F)=>{if(!F.trim())return;Z("aiGenerating")}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),h(b0,{children:h(H0,{dimColor:!0,children:"按 Enter 开始生成 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(X==="aiGenerating"){if(q)return h(b0,{flexDirection:"column",paddingY:1,children:[h(b0,{marginBottom:1,children:h(H0,{bold:!0,color:"red",children:"AI 生成失败"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(b0,{marginBottom:1,children:h(H0,{color:"red",children:q},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(b0,{marginBottom:1,children:h(H0,{dimColor:!0,children:"按 ESC 返回修改描述"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return h(b0,{flexDirection:"column",paddingY:1,children:[h(b0,{marginBottom:1,children:h(H0,{bold:!0,color:"yellow",children:[h(_Q,{type:"dots"},void 0,!1,void 0,this)," AI 正在生成配置..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),h(b0,{marginBottom:1,children:h(H0,{dimColor:!0,children:['根据你的描述:"',U,'"']},void 0,!0,void 0,this)},void 0,!1,void 0,this),h(b0,{marginBottom:1,children:h(H0,{color:"gray",children:"正在调用 LLM 生成 agent 配置,请稍候..."},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}if(X==="name"){let F=_==="edit";return h(b0,{flexDirection:"column",paddingY:1,children:[h(b0,{marginBottom:1,children:h(H0,{bold:!0,color:"cyan",children:["Step 1/7: ",F?"Agent 名称(不可修改)":"输入 Agent 名称"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),h(b0,{marginBottom:1,children:h(H0,{dimColor:!0,children:F?"编辑模式下名称不可修改(修改名称相当于创建新 Agent)":"名称只能包含小写字母、数字和连字符(例如:code-reviewer)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(b0,{marginBottom:1,children:[h(H0,{color:"green",children:"名称: "},void 0,!1,void 0,this),F?h(H0,{children:Q.name},void 0,!1,void 0,this):h(O8,{value:Q.name,onChange:(R)=>G({...Q,name:R}),onSubmit:(R)=>{if(WQ(R))return;w()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),h(b0,{children:h(H0,{dimColor:!0,children:F?"按 Enter 继续 | ESC 返回":"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),F&&h(O8,{value:"",onChange:()=>{},onSubmit:w,showCursor:!1},"edit-mode-dummy-input",!1,void 0,this)]},void 0,!0,void 0,this)}if(X==="description")return h(b0,{flexDirection:"column",paddingY:1,children:[h(b0,{marginBottom:1,children:h(H0,{bold:!0,color:"cyan",children:"Step 2/7: 输入描述信息"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(b0,{marginBottom:1,children:h(H0,{dimColor:!0,children:"简短描述这个 Agent 的用途和使用场景(这将帮助主 Agent 决定何时使用它)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(b0,{marginBottom:1,children:[h(H0,{color:"green",children:"描述: "},void 0,!1,void 0,this),h(O8,{value:Q.description,onChange:(F)=>G({...Q,description:F}),onSubmit:(F)=>{if(!F.trim())return;w()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),h(b0,{children:h(H0,{dimColor:!0,children:"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(X==="tools")return h(HQ,{config:Q,setConfig:G,onNext:w,onPrev:B},void 0,!1,void 0,this);if(X==="color")return h(b0,{flexDirection:"column",paddingY:1,children:[h(b0,{marginBottom:1,children:h(H0,{bold:!0,color:"cyan",children:"Step 4/7: 选择背景颜色"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(b0,{marginBottom:1,children:h(H0,{dimColor:!0,children:"为 Agent 选择一个颜色标识(用于在 UI 中区分不同的 Agents)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(y4,{items:NQ,onSelect:(F)=>{let R=F.value==="none"?void 0:F.value;G({...Q,color:R}),w()}},void 0,!1,void 0,this),h(b0,{marginTop:1,children:h(H0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(X==="location")return h(b0,{flexDirection:"column",paddingY:1,children:[h(b0,{marginBottom:1,children:h(H0,{bold:!0,color:"cyan",children:"Step 5/7: 选择保存位置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(b0,{marginBottom:1,children:h(H0,{dimColor:!0,children:"项目级配置仅在当前项目生效,用户级配置全局可用"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(y4,{items:[{label:"项目级 (.blade/agents/) - 仅当前项目",value:"project"},{label:"用户级 (~/.blade/agents/) - 全局可用",value:"user"}],onSelect:(F)=>{G({...Q,location:F.value}),w()}},void 0,!1,void 0,this),h(b0,{marginTop:1,children:h(H0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(X==="systemPrompt")return h(b0,{flexDirection:"column",paddingY:1,children:[h(b0,{marginBottom:1,children:h(H0,{bold:!0,color:"cyan",children:"Step 6/7: 输入系统提示词"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(b0,{marginBottom:1,children:h(H0,{dimColor:!0,children:"定义 Agent 的行为和职责(可选,留空将使用默认提示)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(b0,{marginBottom:1,children:[h(H0,{color:"green",children:"提示词: "},void 0,!1,void 0,this),h(O8,{value:Q.systemPrompt,onChange:(F)=>G({...Q,systemPrompt:F}),onSubmit:()=>w()},void 0,!1,void 0,this)]},void 0,!0,void 0,this),h(b0,{children:h(H0,{dimColor:!0,children:"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(X==="confirm")return h(b0,{flexDirection:"column",paddingY:1,children:[h(b0,{marginBottom:1,children:h(H0,{bold:!0,color:"cyan",children:"Step 7/7: 确认配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(b0,{flexDirection:"column",paddingLeft:2,marginBottom:1,children:[h(H0,{children:[h(H0,{bold:!0,color:"green",children:["名称:"," "]},void 0,!0,void 0,this),h(H0,{children:Q.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this),h(H0,{children:[h(H0,{bold:!0,color:"green",children:["描述:"," "]},void 0,!0,void 0,this),h(H0,{children:Q.description},void 0,!1,void 0,this)]},void 0,!0,void 0,this),h(H0,{children:[h(H0,{bold:!0,color:"green",children:["工具:"," "]},void 0,!0,void 0,this),h(H0,{children:Q.tools.includes("all")?"所有工具":Q.tools.join(", ")||"所有工具"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),h(H0,{children:[h(H0,{bold:!0,color:"green",children:["颜色:"," "]},void 0,!0,void 0,this),h(H0,{children:Q.color||"默认"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),h(H0,{children:[h(H0,{bold:!0,color:"green",children:["位置:"," "]},void 0,!0,void 0,this),h(H0,{children:Q.location==="project"?"项目级":"用户级"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),h(H0,{children:[h(H0,{bold:!0,color:"green",children:["提示词:"," "]},void 0,!0,void 0,this),h(H0,{children:Q.systemPrompt||"(使用默认)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),h(y4,{items:[{label:"确认并保存",value:"save"},{label:"返回上一步",value:"back"},{label:"取消",value:"cancel"}],onSelect:(F)=>{if(F.value==="save")L();else if(F.value==="back")B();else J()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}function HQ({config:$,setConfig:J,onNext:Y,onPrev:X}){let{isFocused:Z}=zQ({id:"step-tools"});N0((G,U)=>{if(U.escape)X()},{isActive:Z});let Q=(G)=>{if(G.includes("all"))J({...$,tools:["all"]});else J({...$,tools:G});Y()};return h(b0,{flexDirection:"column",paddingY:1,children:[h(b0,{marginBottom:1,children:h(H0,{bold:!0,color:"cyan",children:"Step 3/7: 选择可用工具"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(b0,{marginBottom:1,children:h(H0,{dimColor:!0,children:"方向键导航,空格切换勾选,Enter 确认进入下一步 | ESC 返回上一步"},void 0,!1,void 0,this)},void 0,!1,void 0,this),h(KQ,{options:OQ,defaultValue:$.tools,onSubmit:Q},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import FQ from"node:fs";import{useMemoizedFn as K2}from"ahooks";import{Box as o0,Text as e0}from"ink";import j6 from"ink-select-input";import{useEffect as LQ,useMemo as O3,useState as I4}from"react";import{jsxDEV as _0}from"react/jsx-dev-runtime";var E6=10;function N3({workspaceRoot:$,initialMode:J="menu",onComplete:Y,onCancel:X}){let Z=H4($),[Q,G]=I4(J),[U,z]=I4(null),[K,O]=I4(0),[q,N]=I4(0),_=K2(()=>{Z.clear(),Z.loadFromStandardLocations(),O((T)=>T+1)}),H=O3(()=>{return Z.getAllSubagents()},[K]),W=Math.ceil(H.length/E6)||1,b=O3(()=>{let T=q*E6;return H.slice(T,T+E6)},[H,q]);LQ(()=>{let T=Math.max(0,W-1);if(q>T)N(T)},[W,q]);let M=K2(()=>{if(q<W-1)N((T)=>T+1)}),w=K2(()=>{if(q>0)N((T)=>T-1)}),B=[{key:"list",label:"查看所有 Agents",value:"list"},{key:"create",label:"创建新 Agent",value:"create"},{key:"edit",label:"编辑 Agent",value:"edit"},{key:"delete",label:"删除 Agent",value:"delete"},{key:"cancel",label:"取消",value:"cancel"}],C=K2((T)=>{if(T.value==="cancel"){X?.();return}G(T.value)}),L=K2((T)=>{if(z(T.value),Q==="edit")G("editWizard");else if(Q==="delete")G("deleteConfirm")}),A=K2(async()=>{if(!U?.configPath)return;try{await FQ.promises.unlink(U.configPath),_(),F()}catch(T){console.error("删除失败:",T)}}),F=K2(()=>{G("menu"),z(null)}),R=s0(!1,X);if(N0((T,I)=>{if(I.escape){if(Q==="menu")X?.();else if(Q==="list"||Q==="edit"||Q==="delete")N(0),F();else if(Q==="deleteConfirm")F()}else if(I.ctrl&&T==="c"||I.meta&&T==="c")R();else if(Q==="list"){if(I.leftArrow||T==="h")w();else if(I.rightArrow||T==="l")M()}},{isActive:Q!=="create"&&Q!=="editWizard"}),Q==="menu")return _0(o0,{flexDirection:"column",paddingY:1,children:[_0(o0,{marginBottom:1,children:_0(e0,{bold:!0,color:"cyan",children:"Agents 管理"},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(j6,{items:B,onSelect:C},void 0,!1,void 0,this),_0(o0,{marginTop:1,children:_0(e0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 退出"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Q==="list"){if(H.length===0)return _0(o0,{flexDirection:"column",paddingY:1,children:[_0(o0,{marginBottom:1,children:_0(e0,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(o0,{paddingLeft:2,children:_0(e0,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(o0,{marginTop:1,paddingLeft:2,children:_0(e0,{color:"gray",children:"配置文件位置: .blade/agents/ 或 ~/.blade/agents/"},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(o0,{marginTop:1,paddingLeft:2,children:_0(e0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return _0(o0,{flexDirection:"column",paddingY:1,children:[_0(o0,{marginBottom:1,children:[_0(e0,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this),_0(e0,{color:"gray",children:[" (共 ",H.length," 个)"]},void 0,!0,void 0,this),W>1&&_0(e0,{color:"yellow",children:[" ","第 ",q+1,"/",W," 页"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),b.map((T)=>_0(o0,{flexDirection:"column",paddingLeft:2,children:[_0(o0,{children:_0(e0,{children:[_0(e0,{bold:!0,color:T.color||"white",children:["• ",T.name]},void 0,!0,void 0,this),_0(e0,{color:"gray",children:[" - ",T.description]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),T.tools&&T.tools.length>0&&_0(o0,{paddingLeft:2,children:_0(e0,{color:"gray",children:["工具: ",T.tools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),T.configPath&&_0(o0,{paddingLeft:2,children:_0(e0,{color:"gray",dimColor:!0,children:T.configPath},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},T.name,!0,void 0,this)),_0(o0,{marginTop:1,paddingLeft:2,children:W>1?_0(e0,{dimColor:!0,children:"Left/Right to page | ESC 返回菜单"},void 0,!1,void 0,this):_0(e0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}let k=(T)=>{if(H.length===0)return _0(o0,{flexDirection:"column",paddingY:1,children:[_0(o0,{marginBottom:1,children:_0(e0,{bold:!0,color:"cyan",children:T},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(o0,{paddingLeft:2,children:_0(e0,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(o0,{marginTop:1,paddingLeft:2,children:_0(e0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);let I=H.map((P)=>({key:P.name,label:`${P.name} - ${P.description}`,value:P}));return _0(o0,{flexDirection:"column",paddingY:1,children:[_0(o0,{marginBottom:1,children:_0(e0,{bold:!0,color:"cyan",children:T},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(j6,{items:I,onSelect:L},void 0,!1,void 0,this),_0(o0,{marginTop:1,children:_0(e0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};if(Q==="create")return _0(N8,{onComplete:()=>{_(),F()},onCancel:F},void 0,!1,void 0,this);if(Q==="edit")return k("编辑 Agent");if(Q==="editWizard"&&U){let T={name:U.name,description:U.description,tools:U.tools||[],color:U.color,location:U.configPath?.includes(".blade/agents")?"project":"user",systemPrompt:U.systemPrompt||""};return _0(N8,{initialConfig:T,onComplete:()=>{_(),F()},onCancel:F},void 0,!1,void 0,this)}if(Q==="delete")return k("删除 Agent");if(Q==="deleteConfirm"&&U)return _0(o0,{flexDirection:"column",paddingY:1,children:[_0(o0,{marginBottom:1,children:_0(e0,{bold:!0,color:"red",children:"确认删除"},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(o0,{marginBottom:1,paddingLeft:2,children:_0(e0,{children:["你确定要删除 Agent"," ",_0(e0,{bold:!0,color:"yellow",children:U.name},void 0,!1,void 0,this)," ","吗?"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),_0(o0,{marginBottom:1,paddingLeft:2,children:_0(e0,{dimColor:!0,children:["文件路径: ",U.configPath]},void 0,!0,void 0,this)},void 0,!1,void 0,this),_0(o0,{marginBottom:1,paddingLeft:2,children:_0(e0,{color:"red",children:"此操作无法撤销!"},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(j6,{items:[{label:"确认删除",value:"confirm"},{label:"取消",value:"cancel"}],onSelect:(T)=>{if(T.value==="confirm")A();else F()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}import{Box as x2,Text as M0}from"ink";import PQ,{useEffect as AQ,useState as bQ}from"react";import{useEffect as BQ,useState as W3}from"react";function L3($=K$(),J=5000){let[Y,X]=W3(null),[Z,Q]=W3(!0);return BQ(()=>{let G=!0,U=async()=>{try{let K=await H3($);if(!G)return;if(!K){X(null),Q(!1);return}let O=await F3($);if(!G)return;X(O)}catch{if(G)X(null)}finally{if(G)Q(!1)}};U();let z=null;if(J>0)z=setInterval(U,J);return()=>{if(G=!1,z)clearInterval(z)}},[$,J]),{branch:Y,loading:Z}}function z2($){let J=Math.max(0,Math.ceil($/1000)),Y=Math.floor(J/60),X=J%60;return Y>0?`${Y}m ${X}s`:`${X}s`}function wQ($,J=Date.now()){let Y=$.snapshot?.nextActionAt;return Y===void 0?void 0:Math.max(0,Y-J)}function S4($,J=Date.now()){let Y=$?.snapshot;if(!Y)return null;let X=wQ($,J),Z=X===void 0?void 0:z2(X);switch(Y.activity){case"admission_wait":{let Q=Y.admission;return{primary:"等待 Provider 容量",secondary:Q?`队列 ${Q.queuePosition}/${Math.max(Q.queueDepth,Q.queuePosition)} · ${Q.scope} · 已等待 ${z2(Q.waitMs)}`:"等待可用请求容量",compact:Q?`Provider 排队 · ${Q.queuePosition}/${Math.max(Q.queueDepth,Q.queuePosition)}`:"Provider 排队"}}case"retry_wait":{let Q=Y.retry,G=Y.reason==="rate_limit"?`Provider 请求受限${Z?`,${Z} 后重试`:""}`:`Provider 暂时不可用${Z?`,${Z} 后重试`:""}`,U=Q?[`尝试 ${Q.attempt}/${Q.maxRetries}`,Q.recoveryRemainingMs!==void 0?`剩余预算 ${z2(Q.recoveryRemainingMs)}`:void 0].filter((z)=>z!==void 0):[];return{primary:G,secondary:U.join(" · "),compact:`${Y.reason==="rate_limit"?"Provider 限流":"Provider 恢复"}${Z?` · ${Z}`:""}${Q?` · ${Q.attempt}/${Q.maxRetries}`:""}`}}case"retry_attempt":{let Q=Y.retry;return{primary:"正在重试 Provider",secondary:Q?`尝试 ${Q.attempt}/${Q.maxRetries}`:"",compact:`Provider 重试${Q?` · ${Q.attempt}/${Q.maxRetries}`:""}`}}case"circuit_open":return{primary:`${Y.reason==="rate_limit"?"Provider 请求受限":"Provider 故障已隔离"},等待恢复探测${Z?`(${Z})`:""}`,secondary:Y.circuit?.recoveryRemainingMs!==void 0?`剩余预算 ${z2(Y.circuit.recoveryRemainingMs)}`:"",compact:`Provider ${Y.reason==="rate_limit"?"限流":"熔断"}${Z?` · ${Z}`:""}`};case"circuit_probe":return{primary:"Provider 正在执行恢复探测",secondary:"",compact:"Provider 恢复探测"};case"stream_stall":{let Q=Y.stall;return{primary:Q?.outputStarted?"Provider 流暂时停滞":"Provider 尚未返回流数据",secondary:Q?`已等待 ${z2(Q.durationMs)} · 超时上限 ${z2(Q.timeoutMs)}`:"",compact:Q?`Provider 等待 · ${z2(Q.durationMs)}`:"Provider 等待"}}case"fallback":{let Q=Y.fallback;return{primary:Q?`正在切换到 ${Q.to.model}`:"正在切换模型",secondary:Q?`候选 ${Q.candidate}/${Q.candidateCount} · 来源 ${Q.from.model}`:"",compact:Q?`Provider 切换 · ${Q.to.model}`:"Provider 切换"}}}}import{jsxDEV as G0,Fragment as h$}from"react/jsx-dev-runtime";function MQ($){return $?`exec-host:${$.category}:${$.consecutiveCount}`:""}function TQ($){if(!$)return"";return`lineage:${$.rootTurnId?.slice(0,8)??"?"}:${$.currentTurnId.slice(0,8)}`}var w3=PQ.memo(()=>{let $=h8(),J=f2(),X=V8()==="shortcuts",Z=G9(),Q=q1(),{branch:G}=L3(Q),U=g8(),z=sJ(),K=aJ(),O=x8(),q=c8(),N=u8(),_=d8(),H=l8(),W=iJ(),b=oJ(),M=v8(),w=p8(),B=H9(),C=Q9(),L=j8(),A=D2(),[F,R]=bQ(null),k=S4(M);AQ(()=>{let u=!1;new h6(Q,A).get().then((J0)=>{if(!u)R(J0)}).catch(()=>{if(!u)R(null)});let z0=h6.subscribe((J0)=>{if(!u&&J0.sessionId===A&&J0.workspaceRoot===Q)R(J0.goal)});return()=>{u=!0,z0()}},[A,Q]);let T=U?w4(U):!1,P=(()=>{if(J==="default")return null;if(J==="autoEdit")return G0(M0,{color:"magenta",children:[">> ","auto edit on ",G0(M0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="plan")return G0(M0,{color:"cyan",children:["‖ plan mode on ",G0(M0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="yolo")return G0(M0,{color:"red",children:["yolo mode on ",G0(M0,{color:"gray",children:"(all tools auto-approved)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null})(),j=P!==null,o=[["Enter:发送","Shift+Enter:换行","Esc:中止"],["Shift+Tab:切换模式","Up/Down:历史","Tab:补全"],["Ctrl+A:行首","Ctrl+E:行尾","Ctrl+K:删到尾"],["Ctrl+U:删到首","Ctrl+W:删单词","Ctrl+C:退出"],["Ctrl+O:浏览记录","PgUp/PgDn:翻页","g/G:首尾"]];return G0(x2,{flexDirection:"row",justifyContent:"space-between",paddingX:2,paddingY:0,children:[X?G0(x2,{flexDirection:"column",gap:0,children:o.map((u,Z0)=>G0(x2,{flexDirection:"row",children:[u.map((z0,J0)=>{let[f,E]=z0.split(":");return G0(x2,{flexDirection:"row",width:20,children:[G0(M0,{color:"yellow",children:f},void 0,!1,void 0,this),G0(M0,{color:"gray",children:":"},void 0,!1,void 0,this),G0(M0,{color:"white",children:E},void 0,!1,void 0,this)]},J0,!0,void 0,this)}),Z0===o.length-1&&G0(M0,{color:"cyan",children:" ? 关闭"},void 0,!1,void 0,this)]},Z0,!0,void 0,this))},void 0,!1,void 0,this):G0(x2,{flexDirection:"row",gap:1,children:[G&&G0(h$,{children:[G0(M0,{color:"gray",children:[" ",G]},void 0,!0,void 0,this),G0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),P,j&&G0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this),F&&G0(h$,{children:[G0(M0,{color:F.status==="active"?"green":F.status==="verifying"?"cyan":F.status==="blocked"||F.status==="budget_limited"?"yellow":"gray",children:["goal:",F.status," ",F.objective.slice(0,32),F.prematureStop?` recovery:${F.prematureStop.consecutiveCount}`:"",F.verificationStall?` verify-gap:${F.verificationStall.consecutiveCount}`:"",F.frontierStall?` frontier:${F.frontierStall.category}:${F.frontierStall.consecutiveCount}`:"",F.executionHostFailure?` ${MQ(F.executionHostFailure)}`:"",F.turnLineage?` ${TQ(F.turnLineage)}`:""]},void 0,!0,void 0,this),G0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),G0(M0,{color:"gray",children:"? for shortcuts"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),G0(x2,{flexDirection:"row",gap:1,children:!$?G0(M0,{color:"red",children:"[WARN] API 密钥未配置"},void 0,!1,void 0,this):G0(h$,{children:[T&&G0(h$,{children:[O?G0(M0,{color:"cyan",children:["Effort ",q]},void 0,!0,void 0,this):G0(M0,{color:"gray",children:"Tab:Effort"},void 0,!1,void 0,this),G0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N!=="auto"&&G0(h$,{children:[G0(M0,{color:N==="fast"?"yellow":"gray",children:["Speed ",N]},void 0,!0,void 0,this),G0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),_!=="auto"&&G0(h$,{children:[G0(M0,{color:"gray",children:["Output ",_]},void 0,!0,void 0,this),G0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),H!=="auto"&&G0(h$,{children:[G0(M0,{color:"gray",children:["Style ",H]},void 0,!0,void 0,this),G0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),U&&G0(M0,{color:"gray",children:U.model},void 0,!1,void 0,this),k&&G0(h$,{children:[G0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this),G0(M0,{color:"yellow",children:k.compact},void 0,!1,void 0,this)]},void 0,!0,void 0,this),G0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this),K?G0(M0,{color:"yellow",children:"压缩中..."},void 0,!1,void 0,this):G0(M0,{color:z<20?"red":z<50?"yellow":"gray",children:[z,"%"]},void 0,!0,void 0,this),G0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this),G0(M0,{color:b===void 0?"gray":"cyan",children:["Cache ",B3(b)]},void 0,!0,void 0,this),W>0.001&&G0(h$,{children:[G0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this),G0(M0,{color:"green",children:["$",W<0.01?W.toFixed(4):W.toFixed(3)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),(w?.pending??0)>0&&G0(h$,{children:[G0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this),G0(M0,{color:"yellow",children:["Queued ",w?.pending??0," · /queue"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),B>0&&G0(h$,{children:[G0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this),G0(M0,{color:"cyan",children:["已恢复 ",B," 条指令"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),L.length>0&&G0(h$,{children:[G0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this),G0(M0,{color:"cyan",children:["New tasks ",L.length," · /resume"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),C==="error"&&G0(h$,{children:[G0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this),G0(M0,{color:"yellow",children:"Task sync unavailable"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Z&&G0(h$,{children:[G0(M0,{color:"gray",children:"·"},void 0,!1,void 0,this),G0(M0,{color:"yellow",children:"再按一次 Ctrl+C 退出"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as g6,Text as m6}from"ink";import RQ from"react";import{jsxDEV as c2}from"react/jsx-dev-runtime";var P3=RQ.memo(({suggestions:$,selectedIndex:J,visible:Y,maxDisplay:X=8})=>{if(!Y||$.length===0)return null;let Z=0,Q=Math.min(X,$.length),G=J>=$.length;if(J>=X&&!G)Z=J-X+1,Q=J+1;let U=$.slice(Z,Q),z=$.length>X;return c2(g6,{flexDirection:"column",paddingX:2,paddingY:0,children:[U.map((K,O)=>{let N=Z+O===J;return c2(g6,{flexDirection:"row",paddingX:1,gap:2,children:[c2(m6,{color:N?"cyan":"white",bold:N,children:K.command},void 0,!1,void 0,this),c2(m6,{color:N?"cyan":"gray",dimColor:!N,children:["- ",K.description]},void 0,!0,void 0,this)]},K.command,!0,void 0,this)}),z&&c2(g6,{paddingX:1,children:c2(m6,{color:G?"cyan":"gray",bold:G,dimColor:!G,children:["... and ",$.length-X," more"]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as o$,Text as O1,useStdout as TG}from"ink";import RG from"ink-select-input";import KJ,{useMemo as e3}from"react";import{Box as I0,Text as u0}from"ink";import _2,{useEffect as GJ,useMemo as q2,useRef as n3}from"react";import{Box as n6,Text as v3}from"ink";import mQ from"react";import{Text as Z1}from"ink";import EQ from"react";import S3 from"string-width";import W8 from"string-width";function p6({onlyFirst:$=!1}={}){return new RegExp("(?:\\u001B\\][\\s\\S]*?(?:\\u0007|\\u001B\\u005C|\\u009C))|[\\u001B\\u009B][[\\]()#;?]*(?:\\d{1,4}(?:[;:]\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]",$?void 0:"g")}var CQ=p6();function x6($){if(typeof $!=="string")throw TypeError(`Expected a \`string\`, got \`${typeof $}\``);if(!$.includes("\x1B")&&!$.includes(""))return $;return $.replace(CQ,"")}var A3=($=0)=>(J)=>`\x1B[${J+$}m`,b3=($=0)=>(J)=>`\x1B[${38+$};5;${J}m`,M3=($=0)=>(J,Y,X)=>`\x1B[${38+$};2;${J};${Y};${X}m`,Q$={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],overline:[53,55],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],gray:[90,39],grey:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgGray:[100,49],bgGrey:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}},HN=Object.keys(Q$.modifier),yQ=Object.keys(Q$.color),IQ=Object.keys(Q$.bgColor),FN=[...yQ,...IQ];function SQ(){let $=new Map;for(let[J,Y]of Object.entries(Q$)){for(let[X,Z]of Object.entries(Y))Q$[X]={open:`\x1B[${Z[0]}m`,close:`\x1B[${Z[1]}m`},Y[X]=Q$[X],$.set(Z[0],Z[1]);Object.defineProperty(Q$,J,{value:Y,enumerable:!1})}return Object.defineProperty(Q$,"codes",{value:$,enumerable:!1}),Q$.color.close="\x1B[39m",Q$.bgColor.close="\x1B[49m",Q$.color.ansi=A3(),Q$.color.ansi256=b3(),Q$.color.ansi16m=M3(),Q$.bgColor.ansi=A3(10),Q$.bgColor.ansi256=b3(10),Q$.bgColor.ansi16m=M3(10),Object.defineProperties(Q$,{rgbToAnsi256:{value(J,Y,X){if(J===Y&&Y===X){if(J<8)return 16;if(J>248)return 231;return Math.round((J-8)/247*24)+232}return 16+36*Math.round(J/255*5)+6*Math.round(Y/255*5)+Math.round(X/255*5)},enumerable:!1},hexToRgb:{value(J){let Y=/[a-f\d]{6}|[a-f\d]{3}/i.exec(J.toString(16));if(!Y)return[0,0,0];let[X]=Y;if(X.length===3)X=[...X].map((Q)=>Q+Q).join("");let Z=Number.parseInt(X,16);return[Z>>16&255,Z>>8&255,Z&255]},enumerable:!1},hexToAnsi256:{value:(J)=>Q$.rgbToAnsi256(...Q$.hexToRgb(J)),enumerable:!1},ansi256ToAnsi:{value(J){if(J<8)return 30+J;if(J<16)return 90+(J-8);let Y,X,Z;if(J>=232)Y=((J-232)*10+8)/255,X=Y,Z=Y;else{J-=16;let U=J%36;Y=Math.floor(J/36)/5,X=Math.floor(U/6)/5,Z=U%6/5}let Q=Math.max(Y,X,Z)*2;if(Q===0)return 30;let G=30+(Math.round(Z)<<2|Math.round(X)<<1|Math.round(Y));if(Q===2)G+=60;return G},enumerable:!1},rgbToAnsi:{value:(J,Y,X)=>Q$.ansi256ToAnsi(Q$.rgbToAnsi256(J,Y,X)),enumerable:!1},hexToAnsi:{value:(J)=>Q$.ansi256ToAnsi(Q$.hexToAnsi256(J)),enumerable:!1}}),Q$}var kQ=SQ(),T3=kQ;var D4=new Set(["\x1B",""]),DQ=39,u6="\x07",y3="[",fQ="]",I3="m",k4=`${fQ}8;;`,R3=($)=>`${D4.values().next().value}${y3}${$}${I3}`,C3=($)=>`${D4.values().next().value}${k4}${$}${u6}`,vQ=($)=>$.split(" ").map((J)=>W8(J)),c6=($,J,Y)=>{let X=[...J],Z=!1,Q=!1,G=W8(x6($.at(-1)));for(let[U,z]of X.entries()){let K=W8(z);if(G+K<=Y)$[$.length-1]+=z;else $.push(z),G=0;if(D4.has(z))Z=!0,Q=X.slice(U+1,U+1+k4.length).join("")===k4;if(Z){if(Q){if(z===u6)Z=!1,Q=!1}else if(z===I3)Z=!1;continue}if(G+=K,G===Y&&U<X.length-1)$.push(""),G=0}if(!G&&$.at(-1).length>0&&$.length>1)$[$.length-2]+=$.pop()},VQ=($)=>{let J=$.split(" "),Y=J.length;while(Y>0){if(W8(J[Y-1])>0)break;Y--}if(Y===J.length)return $;return J.slice(0,Y).join(" ")+J.slice(Y).join("")},jQ=($,J,Y={})=>{if(Y.trim!==!1&&$.trim()==="")return"";let X="",Z,Q,G=vQ($),U=[""];for(let[q,N]of $.split(" ").entries()){if(Y.trim!==!1)U[U.length-1]=U.at(-1).trimStart();let _=W8(U.at(-1));if(q!==0){if(_>=J&&(Y.wordWrap===!1||Y.trim===!1))U.push(""),_=0;if(_>0||Y.trim===!1)U[U.length-1]+=" ",_++}if(Y.hard&&G[q]>J){let H=J-_,W=1+Math.floor((G[q]-H-1)/J);if(Math.floor((G[q]-1)/J)<W)U.push("");c6(U,N,J);continue}if(_+G[q]>J&&_>0&&G[q]>0){if(Y.wordWrap===!1&&_<J){c6(U,N,J);continue}U.push("")}if(_+G[q]>J&&Y.wordWrap===!1){c6(U,N,J);continue}U[U.length-1]+=N}if(Y.trim!==!1)U=U.map((q)=>VQ(q));let z=U.join(`
|
|
124
|
-
`),K=[...z],O=0;for(let[q,N]of K.entries()){if(X+=N,D4.has(N)){let{groups:H}=new RegExp(`(?:\\${y3}(?<code>\\d+)m|\\${k4}(?<uri>.*)${u6})`).exec(z.slice(O))||{groups:{}};if(H.code!==void 0){let W=Number.parseFloat(H.code);Z=W===DQ?void 0:W}else if(H.uri!==void 0)Q=H.uri.length===0?void 0:H.uri}let _=T3.codes.get(Number(Z));if(K[q+1]===`
|
|
125
|
-
`){if(Q)X+=C3("");if(Z&&_)X+=R3(_)}else if(N===`
|
|
126
|
-
`){if(Z&&_)X+=R3(Z);if(Q)X+=C3(Q)}O+=N.length}return X};function d6($,J,Y){return String($).normalize().replaceAll(`\r
|
|
127
|
-
`,`
|
|
128
|
-
`).split(`
|
|
129
|
-
`).map((X)=>jQ(X,J,Y)).join(`
|
|
130
|
-
`)}var H8=($)=>{let J=$.replace(/\*\*(.*?)\*\*/g,"$1").replace(/\*(.*?)\*/g,"$1").replace(/_(.*?)_/g,"$1").replace(/~~(.*?)~~/g,"$1").replace(/`(.*?)`/g,"$1").replace(/<u>(.*?)<\/u>/g,"$1").replace(/\[(.*?)\]\(.*?\)/g,"$1");return S3(J)},k3=($,J,Y="...")=>{if(H8($)<=J)return $;if(J<=Y.length)return Y.substring(0,J);let Z=0,Q=$.length,G="";while(Z<=Q){let U=Math.floor((Z+Q)/2),z=$.substring(0,U);if(H8(z)<=J-Y.length)G=z,Z=U+1;else Q=U-1}return G+Y},D3=($)=>{return/[*_~`<[\]https?:]/.test($)},l6=($)=>{let Y=$.replace(/\*\*(.*?)\*\*/g,"$1").replace(/\*(.*?)\*/g,"$1").replace(/_(.*?)_/g,"$1").replace(/~~(.*?)~~/g,"$1").replace(/`(.*?)`/g,"$1").replace(/<u>(.*?)<\/u>/g,"$1").replace(/\[(.*?)\]\(.*?\)/g,"$1").split(/\s+/).filter((X)=>X.length>0);if(Y.length===0)return 0;return Math.max(...Y.map((X)=>S3(X)))},u2=($,J,Y=!1)=>{if(J<=0)return[$];let X=$.trimEnd(),Q=d6(X,J,{hard:Y,trim:!1,wordWrap:!0}).split(`
|
|
131
|
-
`).filter((G)=>G.length>0);return Q.length>0?Q:[""]},f3=($,J,Y,X)=>{let Z=Math.max(0,Y-J);if(X==="center"){let Q=Math.floor(Z/2);return" ".repeat(Q)+$+" ".repeat(Z-Q)}if(X==="right")return" ".repeat(Z)+$;return $+" ".repeat(Z)};import{jsxDEV as i$,Fragment as gQ}from"react/jsx-dev-runtime";var r6=2,a6=1,i6=2;function o6($,J){return`inline-${$}-${J}`}var hQ=({text:$})=>{let J=D0();if(!D3($))return i$(Z1,{children:$},void 0,!1,void 0,this);let Y=[],X=0,Z=0,Q=0,G=/(\*\*.*?\*\*|\*(?!\s).*?(?<!\s)\*|_(?!\s).*?(?<!\s)_|~~.*?~~|`+[^`]+`+|\[.*?\]\(.*?\)|https?:\/\/\S+)/g,U;while((U=G.exec($))!==null){if(U.index>X){let q=$.slice(X,U.index);Y.push(i$(Z1,{children:q},o6("text",Z++),!1,void 0,this))}let z=U[0],K=null,O=o6("match",Q++);try{if(z.startsWith("**")&&z.endsWith("**")&&z.length>r6*2)K=i$(Z1,{bold:!0,children:z.slice(r6,-r6)},O,!1,void 0,this);else if(z.length>a6*2&&(z.startsWith("*")&&z.endsWith("*")||z.startsWith("_")&&z.endsWith("_"))){let q=$.substring(U.index-1,U.index),N=$.substring(G.lastIndex,G.lastIndex+1);if(!(/\w/.test(q)||/\w/.test(N)||/[./\\]/.test(q+N)))K=i$(Z1,{italic:!0,children:z.slice(a6,-a6)},O,!1,void 0,this)}else if(z.startsWith("~~")&&z.endsWith("~~")&&z.length>i6*2)K=i$(Z1,{strikethrough:!0,children:z.slice(i6,-i6)},O,!1,void 0,this);else if(z.startsWith("`")&&z.endsWith("`")){let q=z.match(/^(`+)([^`]+)\1$/);if(q&&q[2])K=i$(Z1,{color:J.colors.syntax.keyword,backgroundColor:J.colors.background.secondary,bold:!0,children:` ${q[2]} `},O,!1,void 0,this)}else if(z.startsWith("[")&&z.includes("](")&&z.endsWith(")")){let q=z.match(/\[(.*?)\]\((.*?)\)/);if(q){let N=q[1],_=q[2];K=i$(Z1,{children:[N,i$(Z1,{color:J.colors.info,children:[" (",_,")"]},void 0,!0,void 0,this)]},O,!0,void 0,this)}}else if(z.match(/^https?:\/\//))K=i$(Z1,{color:J.colors.info,children:z},O,!1,void 0,this)}catch(q){console.error("InlineRenderer 解析错误:",z,q),K=null}Y.push(K??i$(Z1,{children:z},O,!1,void 0,this)),X=G.lastIndex}if(X<$.length){let z=$.slice(X);Y.push(i$(Z1,{children:z},o6("text",Z++),!1,void 0,this))}return i$(gQ,{children:Y.filter((z)=>z!==null)},void 0,!1,void 0,this)},X1=EQ.memo(hQ);import{jsxDEV as d2}from"react/jsx-dev-runtime";var pQ="▎",V3=mQ.memo(({lines:$,level:J})=>{let Y=D0(),X=pQ.repeat(J);return d2(n6,{flexDirection:"column",children:$.map((Z,Q)=>{if(Z.trim()==="")return d2(n6,{height:1},Q,!1,void 0,this);return d2(n6,{flexDirection:"row",children:[d2(v3,{dimColor:!0,color:Y.colors.text.muted,children:[X," "]},void 0,!0,void 0,this),d2(v3,{italic:!0,wrap:"wrap",children:d2(X1,{text:Z},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},Q,!0,void 0,this)})},void 0,!1,void 0,this)});import{Box as v4,Text as R1}from"ink";import{isPlainObject as $J}from"lodash-es";import{common as nQ,createLowlight as tQ}from"lowlight";import{LRUCache as sQ}from"lru-cache";import x3 from"react";import{Box as f4,Text as F8}from"ink";import T1,{Fragment as m3}from"react";import{LRUCache as g3}from"lru-cache";import xQ from"string-width";var cQ=1024,uQ=1048576,j3=1000,E3=new g3({max:cQ,maxSize:uQ,sizeCalculation:($,J)=>Math.max(1,J.length*2+$.length*8)});function t6($){let J=!0;for(let X=0;X<$.length;X++)if($.charCodeAt(X)>127){J=!1;break}if(J)return $.split("");if($.length<=j3){let X=E3.get($);if(X)return X}let Y=Array.from($);if($.length<=j3)E3.set($,Y);return Y}var dQ=2048,lQ=524288,rQ=4096,h3=new g3({max:dQ,maxSize:lQ,sizeCalculation:($,J)=>Math.max(1,J.length*2+8)});function M1($){if(/^[\x20-\x7E]*$/.test($))return $.length;let J=h3.get($);if(J!==void 0)return J;let Y=xQ($);if($.length<=rQ)h3.set($,Y);return Y}import{jsxDEV as l2}from"react/jsx-dev-runtime";var s6=2,p3=T1.memo(({children:$,maxWidth:J,maxHeight:Y,overflowDirection:X="top",additionalHiddenLinesCount:Z=0})=>{let Q=D0(),G=[],U=Math.max(Math.round(Y??Number.MAX_SAFE_INTEGER),s6);function z(W){if(!T1.isValidElement(W))return;if(W.type===m3){T1.Children.forEach(W.props.children,z);return}if(W.type===f4){iQ(W,J,G);return}}T1.Children.forEach($,z);let O=G.length>U||Z>0?U-1:U,q=O!==void 0?Math.max(0,G.length-O):0,N=q+Z,H=(q>0?X==="top"?G.slice(q):G.slice(0,O):G).map((W,b)=>l2(f4,{children:W.length>0?W.map((M,w)=>l2(F8,{...M.props,children:M.text},w,!1,void 0,this)):l2(F8,{children:" "},void 0,!1,void 0,this)},b,!1,void 0,this));return l2(f4,{flexDirection:"column",width:J,flexShrink:0,children:[N>0&&X==="top"&&l2(F8,{color:Q.colors.text.muted,dimColor:!0,children:["... ",N," line",N===1?"":"s"," hidden ..."]},void 0,!0,void 0,this),H,N>0&&X==="bottom"&&l2(F8,{color:Q.colors.text.muted,dimColor:!0,children:["... ",N," line",N===1?"":"s"," hidden ..."]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});function aQ($){if(!T1.isValidElement($)||$.type!==f4)return{noWrapSegments:[],segments:[]};let J={noWrapSegments:[],segments:[]},Y=!1;function X(Z,Q){if(Z===null||Z===void 0)return;if(typeof Z==="string"||typeof Z==="number"){let K=String(Z);if(!K)return;let O={text:K,props:Q??{}};if(Q===void 0||Q.wrap==="wrap")Y=!0,J.segments.push(O);else if(!Y)J.noWrapSegments.push(O);else J.segments.push(O);return}if(!T1.isValidElement(Z))return;if(Z.type===m3){T1.Children.forEach(Z.props.children,(K)=>X(K,Q));return}if(Z.type!==F8)return;let{children:G,...U}=Z.props,z=Q===void 0?U:{...Q,...U};T1.Children.forEach(G,(K)=>X(K,z))}return T1.Children.forEach($.props.children,(Z)=>X(Z,void 0)),J}function iQ($,J,Y){let X=aQ($);if(X.segments.length===0&&X.noWrapSegments.length===0){Y.push([]);return}let Z=0;for(let q of X.noWrapSegments)Z+=M1(q.text);if(X.segments.length===0){let q=[],N=[];for(let _ of X.noWrapSegments){let H=_.text.split(`
|
|
132
|
-
`);for(let W=0;W<H.length;W++){if(W>0)q.push(N),N=[];if(H[W])N.push({text:H[W],props:_.props})}}if(N.length>0)q.push(N);for(let _ of q)Y.push(_);return}let Q=J-Z;if(Q<1){oQ(X.noWrapSegments,J,Y);return}let G=[],U=[],z=0;function K(){if(G.length===0)G.push([...X.noWrapSegments,...U]);else if(Z>0)G.push([{text:" ".repeat(Z),props:{}},...U]);else G.push(U);U=[],z=0}function O(q,N){if(U.length>0&&U[U.length-1].props===N)U[U.length-1].text+=q;else U.push({text:q,props:N})}for(let q of X.segments){let N=q.text.split(`
|
|
133
|
-
`);for(let _=0;_<N.length;_++){if(_>0)K();let W=N[_].split(/(\s+)/);for(let b of W){if(!b)continue;let M=M1(b);if(z+M>Q&&z>0){if(K(),/^\s+$/.test(b))continue}if(M>Q){let B=t6(b);while(B.length>0){let C=0,L=0;for(let A of B){let F=M1(A);if(z+L+F>Q)break;L+=F,C++}if(C>0){let A=B.slice(0,C).join("");O(A,q.props),z+=M1(A),B=B.slice(C)}if(B.length>0)K()}}else O(b,q.props),z+=M}}if(q.text.endsWith(`
|
|
134
|
-
`))K()}if(U.length>0)K();for(let q of G)Y.push(q)}function oQ($,J,Y){let X=[],Z=[],Q=0;for(let G of $){let U=G.text.split(`
|
|
135
|
-
`);for(let z=0;z<U.length;z++){if(z>0)X.push(Z),Z=[],Q=0;let K=U[z];if(!K)continue;let O=M1(K),q=Math.max(0,J-M1("…"));if(O<=q&&Q===0)Z.push({text:K,props:G.props}),Q+=O;else{let N=t6(K),_=Q,H=0;for(let b of N){let M=M1(b);if(_+M>q)break;_+=M,H++}let W=N.slice(0,H).join("");if(W)Z.push({text:W,props:G.props});Z.push({text:"…",props:{}}),Q=_+M1("…")}}}if(Z.length>0)X.push(Z);if(X.length===0)X.push([{text:"…",props:{}}]);for(let G of X)Y.push(G)}import{jsxDEV as k$}from"react/jsx-dev-runtime";var e6=tQ(nQ),eQ=200,$G=524288,JG=4096,c3=new sQ({max:eQ,maxSize:$G,sizeCalculation:($)=>$.retainedChars});function u3($,J){return`${J??"__auto__"}\x00${$}`}function YG($,J){return c3.get(u3($,J))?.root}function ZG($,J,Y){if($.length>JG)return;let X=J?.length??0;c3.set(u3($,J),{root:Y,retainedChars:Math.max(1,$.length*2+X)})}function XG($){return $J($)&&$.type==="text"&&typeof $.value==="string"}function QG($){return $J($)&&$.type==="element"}function GG($){return $J($)&&$.type==="root"&&Array.isArray($.children)}function V4($,J,Y=0){if(XG($))return k$(R1,{wrap:"wrap",children:$.value},Y,!1,void 0,this);if(QG($)){let X=$.properties?.className?.[0]||"",Z=J.default;if(X.includes("comment"))Z=J.comment;else if(X.includes("string"))Z=J.string;else if(X.includes("number"))Z=J.number;else if(X.includes("keyword"))Z=J.keyword;else if(X.includes("function"))Z=J.function;else if(X.includes("variable"))Z=J.variable;else if(X.includes("operator"))Z=J.operator;else if(X.includes("type"))Z=J.type;else if(X.includes("tag"))Z=J.tag;else if(X.includes("attr"))Z=J.attr;let Q=$.children?.map((G,U)=>V4(G,J,U));return k$(R1,{color:Z,wrap:"wrap",children:Q},Y,!1,void 0,this)}if(GG($))return k$(x3.Fragment,{children:$.children.map((X,Z)=>V4(X,J,Z))},Y,!1,void 0,this);return k$(R1,{},Y,!1,void 0,this)}function UG($,J,Y){let X=Y||F$.getTheme().colors.syntax;try{let Z=YG($,J);if(Z)return V4(Z,X);let Q;if(!J||!e6.registered(J))Q=e6.highlightAuto($);else Q=e6.highlight(J,$);let G=Q;if(!G.children||G.children.length===0)return k$(R1,{color:X.default,wrap:"wrap",children:$},void 0,!1,void 0,this);return ZG($,J,Q),V4(Q,X)}catch(Z){return k$(R1,{color:X.default,wrap:"wrap",children:$},void 0,!1,void 0,this)}}var j4=x3.memo(({content:$,language:J,showLineNumbers:Y=!0,terminalWidth:X,availableHeight:Z})=>{let Q=D0(),G=$.split(`
|
|
136
|
-
`),U=0;if(Z&&G.length>Z){let q=Math.max(Z,s6);if(G.length>q)U=G.length-q,G=G.slice(U)}let z=G.length+U,K=String(z).length+1,O=Math.max(20,X-4);return k$(v4,{borderStyle:"round",borderColor:Q.colors.border.light,paddingX:1,paddingY:0,marginY:1,flexDirection:"column",children:[J&&k$(v4,{marginBottom:0,children:k$(R1,{color:Q.colors.text.secondary,children:J},void 0,!1,void 0,this)},void 0,!1,void 0,this),U>0&&k$(v4,{marginBottom:0,children:k$(R1,{color:Q.colors.text.muted,dimColor:!0,children:["... ",U," lines hidden ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),k$(p3,{maxWidth:O,maxHeight:Z,children:G.map((q,N)=>{let _=N+U+1;return k$(v4,{flexDirection:"row",children:[Y&&k$(R1,{color:Q.colors.text.muted,dimColor:!0,wrap:"truncate",children:[String(_).padStart(K-1," ")," "]},void 0,!0,void 0,this),q.trim()===""?k$(R1,{wrap:"wrap",children:" "},void 0,!1,void 0,this):UG(q,J,Q.colors.syntax)]},N,!0,void 0,this)})},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as d3,Text as p$}from"ink";import KG,{useState as zG}from"react";import{jsxDEV as D$}from"react/jsx-dev-runtime";var l3=400;function qG($){let J=$.split(`
|
|
137
|
-
`),Y=[],X=0,Z=0;for(let Q of J){if(Q.startsWith("---")||Q.startsWith("+++"))continue;if(Q.startsWith("@@")){let G=Q.match(/@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@/);if(G)X=parseInt(G[1],10),Z=parseInt(G[3],10);Y.push({type:"header",content:Q});continue}if(Q.startsWith("-")){Y.push({type:"remove",content:Q.substring(1),lineNumber:X}),X++;continue}if(Q.startsWith("+")){Y.push({type:"add",content:Q.substring(1),lineNumber:Z}),Z++;continue}if(Q.startsWith(" ")||Q===""){Y.push({type:"context",content:Q.substring(1),lineNumber:Z}),X++,Z++;continue}}return Y}var JJ=KG.memo(({patch:$,startLine:J,matchLine:Y,terminalWidth:X,maxLines:Z=20,isFocused:Q=!1})=>{let G=D0(),U=qG($),[z,K]=zG(!1);N0((w)=>{if(w.toLowerCase()==="e")K((B)=>!B)},{isActive:Q&&U.length>Z});let q=Math.max(...U.map((w)=>w.lineNumber||0)).toString().length+1,N=U.filter((w)=>w.type==="add").length,_=U.filter((w)=>w.type==="remove").length,H=U.length,W=H>Z,b;if(!W)b=U;else if(z)b=U.slice(0,l3);else b=U.slice(0,Z);let M=H-b.length;return D$(d3,{flexDirection:"column",marginTop:1,marginBottom:1,children:[D$(p$,{color:G.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,X)))},void 0,!1,void 0,this),W&&D$(p$,{color:G.colors.info,children:[z?`已展开 ${b.length}/${H} 行`:`显示前 ${Z} 行,共 ${H} 行`," · ",D$(p$,{color:G.colors.success,children:["+",N]},void 0,!0,void 0,this)," ",D$(p$,{color:G.colors.error,children:["-",_]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),W&&D$(p$,{color:G.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,X)))},void 0,!1,void 0,this),b.map((w,B)=>{if(w.type==="header")return D$(p$,{color:G.colors.muted,dimColor:!0,children:w.content},B,!1,void 0,this);let C=w.lineNumber?w.lineNumber.toString().padStart(q," "):" ".repeat(q),L=" ",A,F;if(w.type==="add")L="+",F=G.colors.success,A=void 0;else if(w.type==="remove")L="-",F=G.colors.error,A=void 0;else F=G.colors.text.primary;let R=Math.max(0,X-q-2),k=w.content;if(k.length>R)k=k.substring(0,R-3)+"...";return D$(p$,{color:F,backgroundColor:A,children:[D$(p$,{dimColor:!0,children:C},void 0,!1,void 0,this),D$(p$,{children:L},void 0,!1,void 0,this),D$(p$,{children:[" ",k]},void 0,!0,void 0,this)]},B,!0,void 0,this)}),W&&D$(d3,{marginTop:1,children:z?D$(p$,{color:G.colors.info,dimColor:!0,children:[M>0?`已达显示上限 ${l3} 行,仍有 ${M} 行未显示`:"已显示全部内容",Q?" · 按 E 折叠":""]},void 0,!0,void 0,this):D$(p$,{color:G.colors.info,dimColor:!0,children:["已隐藏剩余 ",M," 行",Q?" · 按 E 展开全部":""]},void 0,!0,void 0,this)},void 0,!1,void 0,this),D$(p$,{color:G.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,X)))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as YJ,Text as r3}from"ink";import _G from"react";import{jsxDEV as r2}from"react/jsx-dev-runtime";var OG=({itemText:$,type:J,marker:Y,leadingWhitespace:X=""})=>{let Z=J==="ol"?`${Y}. `:`${Y} `,Q=Z.length,G=X.length;return r2(YJ,{paddingLeft:G+1,flexDirection:"row",children:[r2(YJ,{width:Q,children:r2(r3,{children:Z},void 0,!1,void 0,this)},void 0,!1,void 0,this),r2(YJ,{flexGrow:1,children:r2(r3,{wrap:"wrap",children:r2(X1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},ZJ=_G.memo(OG);import{Text as XJ}from"ink";import NG,{useMemo as WG}from"react";import a3 from"string-width";import{jsxDEV as QJ}from"react/jsx-dev-runtime";var i3=4,a2=3,HG=4,o3=NG.memo(({headers:$,rows:J,terminalWidth:Y})=>{let X=D0(),Z=WG(()=>{if($.length===0||J.length===0)return null;let q=$.length,N=$.map((F,R)=>{let k=Math.max(l6(F),a2);for(let T of J)k=Math.max(k,l6(T[R]||""));return k}),_=$.map((F,R)=>{let k=Math.max(H8(F),a2);for(let T of J)k=Math.max(k,H8(T[R]||""));return k}),H=1+q*3,W=Math.max(Y-H-i3,q*a2),b=N.reduce((F,R)=>F+R,0),M=_.reduce((F,R)=>F+R,0),w=!1,B;if(M<=W)B=_;else if(b<=W){let F=W-b,R=_.map((T,I)=>T-N[I]),k=R.reduce((T,I)=>T+I,0);B=N.map((T,I)=>{if(k===0)return T;let P=Math.floor(R[I]/k*F);return T+P})}else{w=!0;let F=W/b;B=N.map((R)=>Math.max(Math.floor(R*F),a2))}function C(){let F=1;for(let R=0;R<$.length;R++){let k=u2($[R],B[R],w);F=Math.max(F,k.length)}for(let R of J)for(let k=0;k<R.length;k++){let T=u2(R[k]||"",B[k],w);F=Math.max(F,T.length)}return F}if(C()>HG)return{type:"vertical",columnWidths:B,needsHardWrap:w};return{type:"horizontal",columnWidths:B,needsHardWrap:w}},[$,J,Y]);if(!Z)return null;if(Z.type==="vertical"){let q=Math.min(Y-1,40),N="─".repeat(q);return QJ(XJ,{children:J.map((_,H)=>{let W=[];if(H>0)W.push(N);return _.forEach((b,M)=>{let w=$[M]||`Column ${M+1}`,B=(b||"").replace(/\n+/g," ").trim();W.push(`\x1B[1m${w}:\x1B[22m ${B}`)}),W.join(`
|
|
138
|
-
`)}).join(`
|
|
139
|
-
`)},void 0,!1,void 0,this)}let{columnWidths:Q,needsHardWrap:G}=Z;function U(q){let _={top:{left:"┌",mid:"┬",right:"┐",h:"─"},middle:{left:"├",mid:"┼",right:"┤",h:"─"},bottom:{left:"└",mid:"┴",right:"┘",h:"─"}}[q],H=_.left;return Q.forEach((W,b)=>{H+=_.h.repeat(W+2),H+=b<Q.length-1?_.mid:_.right}),H}function z(q,N){let _=q.map((M,w)=>{let B=Q[w]||a2;return u2(M||"",B,G)}),H=Math.max(..._.map((M)=>M.length),1),W=_.map((M)=>Math.floor((H-M.length)/2)),b=[];for(let M=0;M<H;M++){let w="│";for(let B=0;B<q.length;B++){let C=_[B],L=W[B],A=M-L,F=A>=0&&A<C.length?C[A]:"",R=Q[B]||a2,k=a3(F),T=f3(N?`\x1B[1m${F}\x1B[22m`:F,k,R,N?"center":"left");w+=` ${T} │`}b.push(w)}return b}let K=[];if(K.push(U("top")),K.push(...z($,!0)),K.push(U("middle")),J.forEach((q,N)=>{if(K.push(...z(q,!1)),N<J.length-1)K.push(U("middle"))}),K.push(U("bottom")),Math.max(...K.map((q)=>a3(q)))>Y-i3){let q=Math.min(Y-1,40),N="─".repeat(q);return QJ(XJ,{children:J.map((_,H)=>{let W=[];if(H>0)W.push(N);return _.forEach((b,M)=>{let w=$[M]||`Column ${M+1}`,B=(b||"").replace(/\n+/g," ").trim();W.push(`\x1B[1m${w}:\x1B[22m ${B}`)}),W.join(`
|
|
140
|
-
`)}).join(`
|
|
141
|
-
`)},void 0,!1,void 0,this)}return QJ(XJ,{color:X.colors.text.primary,children:K.join(`
|
|
142
|
-
`)},void 0,!1,void 0,this)});import{jsxDEV as l}from"react/jsx-dev-runtime";var FG=($,J,Y)=>{switch($){case"user":return{color:J.info,prefix:"> "};case"assistant":return{color:J.success,prefix:"• "};case"system":return{color:J.warning,prefix:" "};case"tool":{let X=Y&&"phase"in Y?Y.phase:void 0;return{color:J.text.secondary,prefix:X==="start"?"• ":X==="complete"?" └ ":" "}}default:return{color:J.text.primary,prefix:" "}}},LG=_2.memo(({content:$,language:J,terminalWidth:Y,isPending:X=!1,availableHeight:Z})=>{let Q=D0();if(X&&Z!==void 0){let G=$.split(`
|
|
143
|
-
`),U=4,z=Math.max(1,Z-4);if(G.length>z){let K=G.slice(0,z).join(`
|
|
144
|
-
`);return l(I0,{flexDirection:"column",flexShrink:0,children:[l(j4,{content:K,language:J,showLineNumbers:!0,terminalWidth:Y},void 0,!1,void 0,this),l(u0,{color:Q.colors.text.muted,dimColor:!0,children:"... generating more code ..."},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}}return l(j4,{content:$,language:J,showLineNumbers:!0,terminalWidth:Y},void 0,!1,void 0,this)}),BG=_2.memo(({content:$,level:J})=>{let Y=D0();switch(J){case 1:return l(u0,{bold:!0,color:Y.colors.primary,children:l(X1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 2:return l(u0,{bold:!0,color:Y.colors.primary,children:l(X1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 3:return l(u0,{bold:!0,color:Y.colors.text.primary,children:l(X1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 4:return l(u0,{italic:!0,color:Y.colors.text.muted,children:l(X1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);default:return l(u0,{children:l(X1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)}}),wG=_2.memo(({terminalWidth:$})=>{let J=D0(),Y=Math.max(0,Math.min($-4,80));return l(u0,{dimColor:!0,color:J.colors.text.muted,children:"─".repeat(Y)},void 0,!1,void 0,this)}),PG=_2.memo(({content:$})=>{return l(u0,{wrap:"wrap",children:l(X1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)}),AG=_2.memo(({content:$})=>{let J=D0();return l(I0,{flexDirection:"row",gap:1,children:[l(u0,{color:J.colors.info,children:" "},void 0,!1,void 0,this),l(u0,{color:J.colors.text.muted,italic:!0,children:$},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}),bG=_2.memo(({detail:$,terminalWidth:J})=>{let Y=D0(),X=50,Z=$.split(`
|
|
145
|
-
`);while(Z.length>0&&Z[0].trim()==="")Z.shift();while(Z.length>0&&Z[Z.length-1].trim()==="")Z.pop();let Q=Z.length>50,G=Q?Z.slice(0,50):Z,U=G.join(`
|
|
146
|
-
`),z=U.includes("<<<DIFF>>>"),K=U.includes("```");if(z){let O=U.match(/<<<DIFF>>>\s*({[\s\S]*?})\s*<<<\/DIFF>>>/);if(O)try{let q=JSON.parse(O[1]);return l(I0,{flexDirection:"column",children:[l(JJ,{patch:q.patch,startLine:q.startLine,matchLine:q.matchLine,terminalWidth:J},void 0,!1,void 0,this),Q&&l(I0,{marginTop:1,children:l(u0,{dimColor:!0,color:Y.colors.text.muted,children:["... 省略 ",Z.length-50," 行 ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}catch{}}if(K){let O=U.match(/```(\w+)?\s*\n([\s\S]*?)\n```/);if(O){let q=O[1]||"text",N=O[2];return l(I0,{flexDirection:"column",children:[l(j4,{content:N,language:q,showLineNumbers:!1,terminalWidth:J},void 0,!1,void 0,this),Q&&l(I0,{marginTop:1,children:l(u0,{dimColor:!0,color:Y.colors.text.muted,children:["... 省略 ",Z.length-50," 行 ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}}return l(I0,{flexDirection:"column",children:[G.map((O,q)=>l(u0,{color:Y.colors.text.primary,children:O},q,!1,void 0,this)),Q&&l(I0,{marginTop:1,children:l(u0,{dimColor:!0,color:Y.colors.text.muted,children:["... 省略 ",Z.length-50," 行 ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});function MG($,J,Y,X=80){if(!Y||J===void 0||J<=0)return{content:$,isTruncated:!1,hiddenLines:0};let Q=Math.max(1,J-8),G=Math.max(40,X*0.8),U=Q*G;if($.length<=U)return{content:$,isTruncated:!1,hiddenLines:0};let z=Math.floor(U*0.9),K=$.length-z,O=K,q=$.indexOf(`
|
|
147
|
-
`,K);if(q!==-1&&q-K<G)O=q+1;let N=$.slice(O),H=($.slice(0,O).match(/\n/g)||[]).length+1;return{content:N,isTruncated:!0,hiddenLines:H}}var C1=_2.memo(({content:$,role:J,terminalWidth:Y,metadata:X,isPending:Z=!1,availableTerminalHeight:Q,hidePrefix:G=!1,noMargin:U=!1,renderPlainTextOnly:z=!1,streamingLines:K,streamingHiddenLines:O,messageId:q,blocksOverride:N,currentLineOverride:_,streamingMode:H="text",renderCodeBlocksAsPlainText:W=!1})=>{let b=D0(),M=N!==void 0,w=q2(()=>FG(J,b.colors,X),[J,b.colors,X]),{color:B,prefix:C}=w,L=C.length+1,A=q2(()=>{if(!X||typeof X!=="object")return null;if(!("subtaskRef"in X))return null;let E=X.subtaskRef;if(!E||typeof E!=="object")return null;return E},[X]),F=J==="tool"&&X?.phase==="start",R=!U&&!F,k=q2(()=>{if(!z)return[];return $.split(/\r?\n/)},[$,z]);if(!M&&Z){let E=K??$.split(/\r?\n/),m=O??0,Y0=!1,c=!1,d=!1;if(H!=="text")Y0=H==="code",c=H==="diff",d=H==="table";return l(I0,{flexDirection:"column",marginBottom:R?1:0,flexShrink:0,children:[m>0&&l(I0,{flexDirection:"row",flexShrink:0,children:[l(I0,{width:L,flexShrink:0},void 0,!1,void 0,this),l(u0,{color:b.colors.text.muted,dimColor:!0,children:["^ ",m," lines above (streaming...)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),E.map((a,W0)=>{if(H==="text"){if(a.match(l1.codeBlock))Y0=!Y0;else if(a.match(l1.diffStart))c=!0;else if(a.match(l1.diffEnd))c=!1;else if(a.match(l1.table))d=!0;else if(d&&!a.match(l1.table))d=!1}let F0=H==="text"&&!Y0&&!c&&!d,T0=F0?a.match(l1.ulItem):null,y=F0?a.match(l1.olItem):null,D=T0??y;return l(I0,{flexDirection:"row",flexShrink:0,children:[W0===0&&!G?l(I0,{marginRight:1,flexShrink:0,children:l(u0,{color:B,bold:!0,children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this):l(I0,{width:L,flexShrink:0},void 0,!1,void 0,this),l(I0,{flexGrow:1,flexShrink:0,children:D?l(ZJ,{type:T0?"ul":"ol",marker:D[2],itemText:D[3],leadingWhitespace:D[1]},void 0,!1,void 0,this):l(u0,{wrap:"wrap",children:a===""?" ":a},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},W0,!0,void 0,this)})]},void 0,!0,void 0,this)}if(!M&&z)return l(I0,{flexDirection:"column",marginBottom:R?1:0,flexShrink:0,children:k.map((E,m)=>l(I0,{flexDirection:"row",flexShrink:0,children:[m===0&&!G?l(I0,{marginRight:1,flexShrink:0,children:l(u0,{color:B,bold:!0,children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this):l(I0,{width:L,flexShrink:0},void 0,!1,void 0,this),l(I0,{flexGrow:1,flexShrink:0,children:l(u0,{wrap:"wrap",children:E===""?" ":E},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},m,!0,void 0,this))},void 0,!1,void 0,this);let T=n3(null);GJ(()=>{T.current=null},[q]);let I=q2(()=>{if(M)return null;if(!q)return null;return t3(q)},[q,M]);GJ(()=>{if(M)return;if(!I||!q)return;T.current={messageId:q,blocks:I}},[I,q,M]),GJ(()=>{if(M)return;if(!I||!q)return;s3(q)},[I,q,M]);let P=q2(()=>M?{content:$,isTruncated:!1,hiddenLines:0}:MG($,Q,Z,Y),[$,Q,Z,Y,M]),{content:j,isTruncated:o,hiddenLines:u}=P;if(!M&&J==="tool"&&X&&"detail"in X){let E=X;if(E.detail)return l(I0,{flexDirection:"column",marginBottom:U?0:1,children:[l(I0,{flexDirection:"row",children:[l(I0,{marginRight:1,children:l(u0,{color:B,bold:!0,children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this),l(u0,{color:B,children:$},void 0,!1,void 0,this)]},void 0,!0,void 0,this),l(I0,{marginLeft:C.length+1,children:l(bG,{detail:E.detail,terminalWidth:Y-(C.length+1)},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}let{completedContent:Z0,currentLine:z0}=q2(()=>{if(M)return{completedContent:"",currentLine:_??""};if(!Z)return{completedContent:j,currentLine:""};let E=j.lastIndexOf(`
|
|
148
|
-
`);if(E===-1)return{completedContent:"",currentLine:j};return{completedContent:j.slice(0,E+1),currentLine:j.slice(E+1)}},[j,Z,M,_]),J0=n3({content:"",blocks:[]}),f=q2(()=>{if(M)return N??[];if(I)return I;if(T.current&&T.current.messageId===q)return T.current.blocks;let E=J0.current;if(!Z||!Z0.startsWith(E.content)){let d=UJ(Z0);return J0.current={content:Z0,blocks:d},d}if(Z0===E.content)return E.blocks;let m=Z0.slice(E.content.length),Y0=UJ(m),c=[...E.blocks,...Y0];return J0.current={content:Z0,blocks:c},c},[Z0,Z,M,N]);return l(I0,{flexDirection:"column",marginBottom:R?1:0,flexShrink:0,children:[o&&l(I0,{flexDirection:"row",flexShrink:0,children:[l(I0,{width:L,flexShrink:0},void 0,!1,void 0,this),l(u0,{color:b.colors.text.muted,dimColor:!0,children:["^ ",u," lines above (streaming...)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),f.map((E,m)=>{if(E.type==="empty")return l(I0,{height:1,flexShrink:0},m,!1,void 0,this);return l(I0,{flexDirection:"row",flexShrink:0,children:[m===0&&!G&&l(I0,{marginRight:1,flexShrink:0,children:l(u0,{color:B,bold:!0,children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this),(m>0||G)&&l(I0,{width:L,flexShrink:0},void 0,!1,void 0,this),l(I0,{flexGrow:1,flexShrink:0,children:E.type==="code"?W?l(u0,{wrap:"wrap",children:E.content},void 0,!1,void 0,this):l(LG,{content:E.content,language:E.language,terminalWidth:Y-L,isPending:Z,availableHeight:Q},void 0,!1,void 0,this):E.type==="table"&&E.tableData?l(o3,{headers:E.tableData.headers,rows:E.tableData.rows,terminalWidth:Y-L},void 0,!1,void 0,this):E.type==="heading"?l(BG,{content:E.content,level:E.level||1},void 0,!1,void 0,this):E.type==="list"?l(ZJ,{type:E.listType||"ul",marker:E.marker||"-",itemText:E.content,leadingWhitespace:" ".repeat(E.indentation||0)},void 0,!1,void 0,this):E.type==="hr"?l(wG,{terminalWidth:Y-L},void 0,!1,void 0,this):E.type==="diff"&&E.diffData?l(JJ,{patch:E.diffData.patch,startLine:E.diffData.startLine,matchLine:E.diffData.matchLine,terminalWidth:Y-L},void 0,!1,void 0,this):E.type==="command-message"?l(AG,{content:E.content},void 0,!1,void 0,this):E.type==="blockquote"&&E.blockquoteLines?l(V3,{lines:E.blockquoteLines,level:E.blockquoteLevel||1},void 0,!1,void 0,this):l(PG,{content:E.content},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},m,!0,void 0,this)}),z0&&l(I0,{flexDirection:"row",flexShrink:0,children:[f.length===0&&!G?l(I0,{marginRight:1,flexShrink:0,children:l(u0,{color:B,bold:!0,children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this):l(I0,{width:L,flexShrink:0},void 0,!1,void 0,this),l(I0,{flexGrow:1,flexShrink:0,children:l(u0,{wrap:"wrap",children:z0},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),A&&l(I0,{flexDirection:"row",flexShrink:0,children:[l(I0,{width:L,flexShrink:0},void 0,!1,void 0,this),l(I0,{flexDirection:"column",flexGrow:1,flexShrink:0,children:[l(u0,{color:b.colors.text.muted,children:["Subtask"," ",typeof A.agentType==="string"?`@${A.agentType}`:"",typeof A.status==="string"?` · ${A.status}`:""]},void 0,!0,void 0,this),typeof A.summary==="string"&&A.summary.trim()!==""&&l(u0,{wrap:"wrap",children:A.summary},void 0,!1,void 0,this),typeof A.childSessionId==="string"&&l(u0,{color:b.colors.text.muted,children:["Session ",A.childSessionId]},void 0,!0,void 0,this),typeof A.resumedFrom==="string"&&l(u0,{color:b.colors.text.muted,children:["Resumed from ",A.resumedFrom,typeof A.resumeDepth==="number"?` · depth ${A.resumeDepth}`:""]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},($,J)=>{return $.content===J.content&&$.role===J.role&&$.terminalWidth===J.terminalWidth&&$.isPending===J.isPending&&$.availableTerminalHeight===J.availableTerminalHeight&&$.hidePrefix===J.hidePrefix&&$.noMargin===J.noMargin&&$.renderPlainTextOnly===J.renderPlainTextOnly&&$.streamingHiddenLines===J.streamingHiddenLines&&$.streamingLines===J.streamingLines&&$.messageId===J.messageId&&$.metadata===J.metadata&&$.blocksOverride===J.blocksOverride&&$.currentLineOverride===J.currentLineOverride&&$.streamingMode===J.streamingMode&&$.renderCodeBlocksAsPlainText===J.renderCodeBlocksAsPlainText});import{jsxDEV as n0,Fragment as SG}from"react/jsx-dev-runtime";var CG=KJ.memo(({label:$,isSelected:J})=>n0(O1,{color:J?"yellow":void 0,children:$},void 0,!1,void 0,this)),yG=KJ.memo(({details:$,headerColor:J,isPlanModeExit:Y,isPlanModeEnter:X,terminalWidth:Z})=>n0(SG,{children:[n0(o$,{marginBottom:1,children:n0(O1,{children:$.message},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.planContent&&n0(o$,{flexDirection:"column",marginBottom:1,borderStyle:"single",borderColor:J,padding:1,children:[n0(O1,{bold:!0,color:J,children:"实施方案"},void 0,!1,void 0,this),n0(o$,{marginTop:1,children:n0(C1,{content:$.planContent,role:"assistant",terminalWidth:Z-4},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),!$.planContent&&$.details&&n0(o$,{flexDirection:"column",marginBottom:1,children:n0(C1,{content:$.details,role:"assistant",terminalWidth:Z},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.risks&&$.risks.length>0&&n0(o$,{flexDirection:"column",marginBottom:1,children:[n0(O1,{color:"red",bold:!0,children:"风险提示:"},void 0,!1,void 0,this),$.risks.map((Q,G)=>n0(o$,{marginLeft:2,children:n0(O1,{color:"red",children:["• ",Q]},void 0,!0,void 0,this)},G,!1,void 0,this))]},void 0,!0,void 0,this),$.affectedFiles&&$.affectedFiles.length>0&&n0(o$,{flexDirection:"column",marginBottom:1,children:[n0(O1,{color:"yellow",children:"影响的文件:"},void 0,!1,void 0,this),$.affectedFiles.slice(0,3).map((Q,G)=>n0(o$,{marginLeft:2,children:n0(O1,{children:["• ",Q]},void 0,!0,void 0,this)},G,!1,void 0,this)),$.affectedFiles.length>3&&n0(o$,{marginLeft:2,children:n0(O1,{color:"gray",children:["...还有 ",$.affectedFiles.length-3," 个文件"]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this));function IG($,J,Y,X){return`使用 ↑↓ 选择,回车确认 · ${J||Y||X?"Y/N":$?"Y/S/N":"Y/S/P/N"} 快捷键 · Esc 取消`}var $Z=KJ.memo(({details:$,onResponse:J})=>{let{stdout:Y}=TG(),X=Y.columns||80,Q=X$()==="confirmation-prompt",G=s0(!1),U=$.type==="exitPlanMode",z=$.type==="enterPlanMode",K=$.type==="maxTurnsExceeded",O=$.type==="mcpSampling";N0((_,H)=>{if(H.ctrl&&_==="c"||H.meta&&_==="c"){G();return}if(H.escape){J({approved:!1,reason:"用户取消"});return}let W=_.toLowerCase();if(U){if(W==="y"){J({approved:!0,targetMode:"autoEdit"});return}if(W==="s"){J({approved:!0,targetMode:"default"});return}if(W==="n"){J({approved:!1,reason:"方案需要改进"});return}}else if(z){if(W==="y"){J({approved:!0});return}if(W==="n"){J({approved:!1,reason:"用户拒绝进入 Plan 模式"});return}}else if(K){if(W==="y"){J({approved:!0});return}if(W==="n"){J({approved:!1,reason:"用户选择停止"});return}}else if(O){if(W==="y"){J({approved:!0,scope:"once"});return}if(W==="n"){J({approved:!1,reason:"用户拒绝 MCP Sampling"});return}}else{if(W==="y"){J({approved:!0,scope:"once"});return}if(W==="s"){J({approved:!0,scope:"session"});return}if(W==="p"){J({approved:!0,scope:"project"});return}if(W==="n"){J({approved:!1,reason:"用户拒绝"});return}}},{isActive:Q});let q=e3(()=>{if(U)return[{key:"approve-auto",label:"[Y] 批准,自动执行",value:{approved:!0,targetMode:"autoEdit"}},{key:"approve-default",label:"[S] 批准,逐步确认",value:{approved:!0,targetMode:"default"}},{key:"reject",label:"[N] 继续优化方案",value:{approved:!1,reason:"方案需要改进"}}];if(z)return[{key:"approve",label:"[Y] 进入规划模式",value:{approved:!0}},{key:"reject",label:"[N] 直接执行",value:{approved:!1,reason:"用户拒绝进入 Plan 模式"}}];if(K)return[{key:"continue",label:"[Y] 继续执行",value:{approved:!0}},{key:"stop",label:"[N] 停止",value:{approved:!1,reason:"用户选择停止"}}];if(O)return[{key:"approve-once",label:"[Y] 允许本次 Sampling",value:{approved:!0,scope:"once"}},{key:"reject",label:"[N] 拒绝",value:{approved:!1,reason:"用户拒绝 MCP Sampling"}}];return[{key:"approve-once",label:"[Y] 允许(仅本次)",value:{approved:!0,scope:"once"}},{key:"approve-session",label:"[S] 允许(本次会话)",value:{approved:!0,scope:"session"}},{key:"approve-project",label:"[P] 允许并记住(本项目)",value:{approved:!0,scope:"project"}},{key:"reject",label:"[N] 拒绝",value:{approved:!1,reason:"用户拒绝"}}]},[U,z,K,O]),N=e3(()=>{if(U)return{color:"cyan",title:"方案审核"};if(z)return{color:"magenta",title:"进入规划模式"};if(K)return{color:"yellow",title:"已达最大轮次"};return{color:"yellow",title:$.title||"操作确认"}},[U,z,K,$.title]);return n0(o$,{flexDirection:"column",borderStyle:"round",borderColor:Q?N.color:"gray",padding:1,children:[n0(o$,{marginBottom:1,children:n0(O1,{bold:!0,color:N.color,children:N.title},void 0,!1,void 0,this)},void 0,!1,void 0,this),n0(yG,{details:$,headerColor:N.color,isPlanModeExit:U,isPlanModeEnter:z,terminalWidth:X},void 0,!1,void 0,this),n0(o$,{flexDirection:"column",children:[n0(O1,{color:"gray",children:IG(U,z,K,O)},void 0,!1,void 0,this),n0(RG,{items:q,isFocused:Q,itemComponent:CG,onSelect:(_)=>{J(_.value)}},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});import{Box as zJ,Text as Q1}from"ink";import{useEffect as kG,useMemo as DG,useState as fG}from"react";import{jsxDEV as g$}from"react/jsx-dev-runtime";function vG($,J){let Y=J,X=J;while(Y>0&&$.items[Y-1]?.mutable)Y--;while(X<$.items.length-1&&$.items[X+1]?.mutable)X++;return{start:Y,end:X}}function JZ({queue:$,mutation:J,onMutate:Y,onRefresh:X,onClose:Z}){let{width:Q,height:G}=d1(),[U,z]=fG($?.items[0]?.id??null),K=Math.max(0,$?.items.findIndex((_)=>_.id===U)??0);kG(()=>{if(!$||$.items.length===0){z(null);return}if(!U||!$.items.some((_)=>_.id===U))z($.items[Math.min(K,$.items.length-1)].id)},[$,U,K]);let O=(_)=>{Promise.resolve(Y(_)).catch(()=>{return})};N0((_,H)=>{if(H.escape||_==="q")return Z(),!0;if(_==="r")return Promise.resolve(X()).catch(()=>{return}),!0;if(!$||$.items.length===0)return!0;if(H.downArrow||_==="j"){let w=Math.min($.items.length-1,K+1);return z($.items[w].id),!0}if(H.upArrow||_==="k"){let w=Math.max(0,K-1);return z($.items[w].id),!0}let W=$.items[K];if(!W?.mutable||J.pending)return!0;let b=vG($,K);if(_==="d")return O({type:"remove",messageId:W.id}),!0;let M=_==="K"?Math.max(b.start,K-1):_==="J"?Math.min(b.end,K+1):_==="g"?b.start:_==="G"?b.end:void 0;if(M!==void 0&&M!==K)O({type:"move",messageId:W.id,toPosition:M});return!0},{priority:120});let q=DG(()=>{if(!$)return[];let _=Math.max(1,G-9),H=Math.max(0,Math.min(K-Math.floor(_/2),$.items.length-_));return $.items.slice(H,H+_)},[G,$,K]),N=Math.max(8,Q-38);return g$(zJ,{flexDirection:"column",borderStyle:"double",borderColor:"yellow",paddingX:1,children:[g$(zJ,{justifyContent:"space-between",children:[g$(Q1,{bold:!0,color:"yellow",children:["Follow-up queue · ",$?.pending??0]},void 0,!0,void 0,this),g$(Q1,{dimColor:!0,children:"Esc/q close · r refresh"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g$(Q1,{dimColor:!0,children:"j/k select · d delete · J/K move · g/G segment edge"},void 0,!1,void 0,this),(J.errorCode||J.errorMessage)&&g$(Q1,{color:"red",children:J.errorCode==="revision_conflict"?"Queue changed; showing the latest order":J.errorMessage},void 0,!1,void 0,this),!$||$.items.length===0?g$(Q1,{dimColor:!0,children:"No queued follow-ups."},void 0,!1,void 0,this):q.map((_)=>{let H=_.id===U,W=_.kind==="internal"?"Internal runtime item":_.preview||"Attachment-only follow-up";return g$(zJ,{gap:1,children:[g$(Q1,{color:H?"cyan":void 0,children:H?"›":" "},void 0,!1,void 0,this),g$(Q1,{dimColor:!0,children:String(_.position+1).padStart(2," ")},void 0,!1,void 0,this),g$(Q1,{color:_.mutable?"white":"gray",children:k3(W.replace(/\s+/g," "),N,"…")},void 0,!1,void 0,this),_.attachmentCount>0&&g$(Q1,{color:"cyan",children:["[",_.attachmentCount," attachment]"]},void 0,!0,void 0,this),g$(Q1,{color:_.mutable?"green":"yellow",children:_.mutable?_.delivery.replace("_"," "):"locked"},void 0,!1,void 0,this),J.pending&&J.messageId===_.id&&g$(Q1,{color:"yellow",children:"updating…"},void 0,!1,void 0,this)]},_.id,!0,void 0,this)})]},void 0,!0,void 0,this)}import{Box as j0,Text as C0}from"ink";import YZ from"ink-text-input";import{useState as y1}from"react";import{jsxDEV as t}from"react/jsx-dev-runtime";var L8=[{action:"add",description:"Add a new hook"},{action:"status",description:"Show hooks status"},{action:"list",description:"List all configured hooks"},{action:"enable",description:"Enable hooks for this session"},{action:"disable",description:"Disable hooks for this session"},{action:"trust",description:"Trust the current project hook digest"},{action:"revoke",description:"Revoke project hook trust"}],E4=[{location:"local",name:"Project settings (local)",description:"Saved in .blade/settings.local.json"},{location:"project",name:"Project settings",description:"Checked in at .blade/settings.json"},{location:"user",name:"User settings",description:"Saved in at ~/.blade/settings.json"}],h4=[{event:"PreToolUse",description:"Before tool execution"},{event:"PostToolUse",description:"After tool execution"},{event:"PostToolUseFailure",description:"After tool execution fails"},{event:"PermissionRequest",description:"When permission is requested"},{event:"UserPromptSubmit",description:"Before processing user prompt"},{event:"Stop",description:"When Claude stops responding"},{event:"SubagentStop",description:"When subagent stops"},{event:"SessionStart",description:"When session starts"},{event:"SessionEnd",description:"When session ends"},{event:"Notification",description:"When notification is sent"},{event:"Compaction",description:"Before context compaction"}],VG=[`jq -r '.tool_input.file_path | select(endswith(".go"))' | xargs -r gofmt -w`,`jq -r '"\\(.tool_input.command) - \\(.tool_input.description // "No description")"' >> ~/.blade/bash-command-log.txt`,"/usr/local/bin/security_check.sh","python3 ~/hooks/validate_changes.py"],ZZ=({workspaceRoot:$,sessionId:J,onClose:Y,onSave:X})=>{let Z=F$.getTheme(),[Q,G]=y1("action"),[U,z]=y1(0),[K,O]=y1(0),[q,N]=y1(0),[_,H]=y1(""),[W,b]=y1(""),[M,w]=y1(null),[B,C]=y1(!1),[L,A]=y1(null),F=L8[U],R=h4[K],k=E4[q],T=()=>{if(L){A(null);return}switch(Q){case"action":Y();break;case"event":G("action");break;case"matcher":G("event");break;case"command":G("matcher");break;case"location":G("command");break;case"confirm":G("location");break}};N0((f,E)=>{if(E.escape){T();return}if(Q==="action"){if(E.upArrow)z((m)=>m>0?m-1:L8.length-1);else if(E.downArrow)z((m)=>m<L8.length-1?m+1:0);else if(E.return)I()}else if(Q==="event"){if(E.upArrow)O((m)=>m>0?m-1:h4.length-1);else if(E.downArrow)O((m)=>m<h4.length-1?m+1:0);else if(E.return)G("matcher")}else if(Q==="location"){if(E.upArrow)N((m)=>m>0?m-1:E4.length-1);else if(E.downArrow)N((m)=>m<E4.length-1?m+1:0);else if(E.return)G("confirm")}else if(Q==="confirm"){if(E.return)J0()}});let I=()=>{let f=L8[U].action;if(f==="add")G("event");else if(f==="status")P();else if(f==="list")u();else if(f==="enable")E$.getInstance().enableSession(J,$),A("Hooks enabled for this session");else if(f==="disable")E$.getInstance().disableSession(J,$),A("Hooks disabled for this session");else if(f==="trust")j();else if(f==="revoke")o()},P=async()=>{let f=E$.getInstance(),E=f.isEnabled($,J),m=f.getConfig($),Y0=await f.getTrustStatus($),c={};for(let a of Object.values(qJ)){let W0=m[a];if(W0&&Array.isArray(W0)){let F0=W0.reduce((T0,y)=>T0+(y.hooks?.length||0),0);if(F0>0)c[a]=F0}}let d=[`Status: ${E?"Enabled":"Disabled"}`,`Trust: ${Y0.state}`,`Digest: ${Y0.currentDigest??"none"}`,""];if(Object.keys(c).length>0){d.push("Configured hooks:");for(let[a,W0]of Object.entries(c))d.push(` ${a}: ${W0} hook(s)`)}else d.push("No hooks configured");A(d.join(`
|
|
149
|
-
`))},j=async()=>{try{let f=await E$.getInstance().trustProject($);A(`Trust: ${f.state}
|
|
150
|
-
Digest: ${f.currentDigest??"none"}`)}catch(f){w(f instanceof Error?f.message:"Failed to trust hooks")}},o=async()=>{try{let f=await E$.getInstance().revokeProjectTrust($);A(`Trust: ${f.state}`)}catch(f){w(f instanceof Error?f.message:"Failed to revoke hook trust")}},u=()=>{let E=E$.getInstance().getConfig($),m=[],Y0=!1;for(let c of Object.values(qJ)){let d=E[c];if(!d||!Array.isArray(d)||d.length===0)continue;Y0=!0,m.push(`${c}:`);for(let a of d){let W0=a.matcher,F0="all";if(W0?.tools)F0=`tools: ${Array.isArray(W0.tools)?W0.tools.join(", "):W0.tools}`;m.push(` [${F0}]`);for(let T0 of a.hooks||[])if(T0.type==="command")m.push(` -> ${T0.command}`)}m.push("")}if(!Y0)m.push("No hooks configured"),m.push(""),m.push("Configure hooks in .blade/settings.local.json");A(m.join(`
|
|
151
|
-
`))},Z0=()=>{G("command")},z0=()=>{if(!W.trim()){w("Command cannot be empty");return}w(null),G("location")},J0=async()=>{C(!0),w(null);try{let f=E$.getInstance(),E=await import("node:fs/promises"),m=await import("node:path"),Y0=await import("node:os"),c={matcher:_.trim()?{tools:_.trim()}:{},hooks:[{type:"command",command:W.trim()}]},d;switch(k.location){case"local":d=m.join($,".blade","settings.local.json");break;case"project":d=m.join($,".blade","settings.json");break;case"user":d=m.join(Y0.homedir(),".blade","settings.json");break}await E.mkdir(m.dirname(d),{recursive:!0});let a={};try{let y=await E.readFile(d,"utf-8");a=JSON.parse(y)}catch{}let W0=a.hooks||{},F0=W0[R.event]||[],T0={...W0,enabled:!0,[R.event]:[...F0,c]};if(a.hooks=T0,await E.writeFile(d,JSON.stringify(a,null,2),"utf-8"),await f.reloadConfig($),X)X({event:R.event,matcher:_.trim(),command:W.trim()});Y()}catch(f){w(`Failed to save hook: ${f instanceof Error?f.message:"Unknown error"}`),C(!1)}};return t(j0,{flexDirection:"column",padding:1,children:[t(j0,{marginBottom:1,children:t(C0,{bold:!0,color:Z.colors.success,children:"Hooks Manager"},void 0,!1,void 0,this)},void 0,!1,void 0,this),t(j0,{marginBottom:1,children:t(C0,{color:Z.colors.warning,children:"[WARN] Configured hooks run only after this exact project digest is trusted. Function hooks registered by application code are exempt."},void 0,!1,void 0,this)},void 0,!1,void 0,this),L&&t(j0,{flexDirection:"column",marginBottom:1,children:[t(C0,{children:L},void 0,!1,void 0,this),t(j0,{marginTop:1,children:t(C0,{color:Z.colors.muted,children:"Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q==="action"&&!L&&t(j0,{flexDirection:"column",children:[t(j0,{flexDirection:"column",marginTop:1,children:L8.map((f,E)=>t(j0,{children:[t(C0,{color:E===U?Z.colors.primary:void 0,bold:E===U,children:[E===U?"> ":" ",f.action]},void 0,!0,void 0,this),t(C0,{color:Z.colors.muted,children:[" - ",f.description]},void 0,!0,void 0,this)]},f.action,!0,void 0,this))},void 0,!1,void 0,this),t(j0,{marginTop:1,children:t(C0,{color:Z.colors.muted,children:"Up/Down to select · Enter to continue · Esc to close"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q==="event"&&t(j0,{flexDirection:"column",children:[t(C0,{bold:!0,children:"Select Event:"},void 0,!1,void 0,this),t(j0,{flexDirection:"column",marginTop:1,children:h4.map((f,E)=>t(j0,{children:[t(C0,{color:E===K?Z.colors.primary:void 0,bold:E===K,children:[E===K?"> ":" ",f.event]},void 0,!0,void 0,this),t(C0,{color:Z.colors.muted,children:[" - ",f.description]},void 0,!0,void 0,this)]},f.event,!0,void 0,this))},void 0,!1,void 0,this),t(j0,{marginTop:1,children:t(C0,{color:Z.colors.muted,children:"Up/Down to select · Enter to continue · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q!=="event"&&t(j0,{marginBottom:1,children:t(C0,{children:["Event:"," ",t(C0,{bold:!0,color:Z.colors.primary,children:R.event},void 0,!1,void 0,this),t(C0,{color:Z.colors.muted,children:[" - ",R.description]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),(Q==="matcher"||Q==="command"||Q==="confirm")&&t(j0,{flexDirection:"column",marginBottom:1,children:[t(C0,{color:Z.colors.muted,children:"Input to command is JSON of tool call arguments."},void 0,!1,void 0,this),t(C0,{color:Z.colors.muted,children:"Exit code 0 - stdout/stderr not shown"},void 0,!1,void 0,this),t(C0,{color:Z.colors.muted,children:"Exit code 2 - show stderr to model and block tool call"},void 0,!1,void 0,this),t(C0,{color:Z.colors.muted,children:"Other exit codes - show stderr to user only but continue with tool call"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q==="matcher"&&t(j0,{flexDirection:"column",children:[t(j0,{children:[t(C0,{bold:!0,children:"Matcher: "},void 0,!1,void 0,this),t(YZ,{value:_,onChange:H,onSubmit:Z0,placeholder:"e.g., Read, Bash, Edit|Write (empty = all tools)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),t(j0,{marginTop:1,children:t(C0,{color:Z.colors.muted,children:"Tool name pattern (supports | for multiple). Leave empty to match all."},void 0,!1,void 0,this)},void 0,!1,void 0,this),t(j0,{marginTop:1,children:t(C0,{color:Z.colors.muted,children:"Enter to continue · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),(Q==="command"||Q==="confirm")&&t(j0,{marginBottom:1,children:t(C0,{children:["Matcher: ",t(C0,{bold:!0,children:_||"(all tools)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),Q==="command"&&t(j0,{flexDirection:"column",children:[t(j0,{children:t(C0,{bold:!0,children:"Command: "},void 0,!1,void 0,this)},void 0,!1,void 0,this),t(j0,{borderStyle:"single",borderColor:Z.colors.border.light,paddingX:1,marginTop:1,children:t(YZ,{value:W,onChange:b,onSubmit:z0,placeholder:"Enter shell command..."},void 0,!1,void 0,this)},void 0,!1,void 0,this),t(j0,{flexDirection:"column",marginTop:1,children:[t(C0,{bold:!0,children:"Examples:"},void 0,!1,void 0,this),VG.map((f,E)=>t(C0,{color:Z.colors.muted,children:["• ",f]},E,!0,void 0,this))]},void 0,!0,void 0,this),t(j0,{marginTop:1,children:t(C0,{color:Z.colors.muted,children:"Enter to continue · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q==="location"&&t(j0,{flexDirection:"column",children:[t(j0,{flexDirection:"column",borderStyle:"round",borderColor:Z.colors.border.light,paddingX:2,paddingY:1,marginBottom:1,children:[t(C0,{bold:!0,color:Z.colors.primary,children:"Save hook configuration"},void 0,!1,void 0,this),t(C0,{children:" "},void 0,!1,void 0,this),t(C0,{children:[" ","Event: ",R.event," - ",R.description]},void 0,!0,void 0,this),t(C0,{children:[" Matcher: ",_||"(all)"]},void 0,!0,void 0,this),t(C0,{children:[" Command: ",W]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),t(C0,{bold:!0,children:"Where should this hook be saved?"},void 0,!1,void 0,this),t(j0,{flexDirection:"column",marginTop:1,children:E4.map((f,E)=>t(j0,{children:[t(C0,{color:E===q?Z.colors.primary:void 0,bold:E===q,children:[E===q?"> ":" ",E+1,". ",f.name]},void 0,!0,void 0,this),t(C0,{color:Z.colors.muted,children:[" ",f.description]},void 0,!0,void 0,this)]},f.location,!0,void 0,this))},void 0,!1,void 0,this),t(j0,{marginTop:1,children:t(C0,{color:Z.colors.muted,children:"Enter to confirm · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q==="confirm"&&t(j0,{flexDirection:"column",children:[t(j0,{flexDirection:"column",borderStyle:"round",borderColor:Z.colors.success,paddingX:2,paddingY:1,children:[t(C0,{bold:!0,children:["Saving hook to ",k.description,"..."]},void 0,!0,void 0,this),t(C0,{children:" "},void 0,!1,void 0,this),t(C0,{children:["Event: ",R.event]},void 0,!0,void 0,this),t(C0,{children:["Matcher: ",_||"(all tools)"]},void 0,!0,void 0,this),t(C0,{children:["Command: ",W]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),t(j0,{marginTop:1,children:t(C0,{color:Z.colors.muted,children:B?"Saving...":"Enter to confirm · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),M&&t(j0,{marginTop:1,children:t(C0,{color:Z.colors.error,children:M},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as MZ}from"ahooks";import{Box as sG,Text as eG}from"ink";import $U from"react";import{useMemoizedFn as m4}from"ahooks";import N2 from"chalk";import{Text as iG}from"ink";import{useEffect as PZ,useRef as B8}from"react";var g4={TIMEOUT_MS:100,RAPID_INPUT_THRESHOLD_MS:150,LARGE_INPUT_THRESHOLD:300,MEDIUM_SIZE_MULTI_CHUNK_THRESHOLD:200};function XZ($){return typeof $==="string"&&/^[0-9a-f]{32}$/.test($)}function jG($){if(!XZ($))throw Error("TUI composer ready nonce must be 32 lowercase hexadecimal chars");return`\x1B]99;blade-composer-ready=${$}\x07`}function EG($=process.env){let J=$.BLADE_TUI_COMPOSER_READY_NONCE;if(!XZ(J))return;return jG(J)}function QZ($=process.env,J=(Y)=>process.stdout.write(Y)){let Y=EG($);if(!Y)return!1;return J(Y),!0}var O2="\x1B",hG=`${O2}[200~`,gG=`${O2}[201~`,mG="[200~",pG="[201~",xG=[`${O2}[I`,`${O2}[O`,"[I","[O"],KZ=`${O2}[?2004h`,zZ=`${O2}[?2004l`,OJ=`${O2}[?1004l`,cG=[hG,mG],uG=[gG,pG];function qZ(){return{pasteBuffer:null,pasteOverflowed:!1}}function GZ($,J){let Y;for(let X of J){let Z=$.indexOf(X);if(Z===-1)continue;if(!Y||Z<Y.index||Z===Y.index&&X.length>Y.marker.length)Y={index:Z,marker:X}}return Y}function UZ($){return xG.some((J)=>$===J)}function _Z($,J){let Y=J,X=$.pasteBuffer,Z=$.pasteOverflowed,Q=X!==null,G=[];while(Y.length>0){if(X!==null){let K=GZ(Y,uG);if(!K){if(X.length+Y.length>_J)X="",Z=!0;else if(!Z)X+=Y;Y="";break}if(X.length+K.index>_J)Z=!0;else if(!Z)X+=Y.slice(0,K.index),G.push({kind:"paste",text:X});X=null,Z=!1,Q=!0,Y=Y.slice(K.index+K.marker.length);continue}let U=GZ(Y,cG);if(!U){if(UZ(Y))Q=!0;else G.push({kind:"text",text:Y});Y="";break}let z=Y.slice(0,U.index);if(z&&!UZ(z))G.push({kind:"text",text:z});X="",Z=!1,Q=!0,Y=Y.slice(U.index+U.marker.length)}if(J.length===0&&X!==null)Q=!0;return{handled:Q,state:{pasteBuffer:X,pasteOverflowed:Z},segments:G}}import{execSync as i2}from"node:child_process";import{existsSync as dG,readFileSync as NJ}from"node:fs";import{basename as OZ,isAbsolute as lG}from"node:path";function NZ($){try{let J=Buffer.from($,"base64");if(J.length<4)return"image/png";if(J[0]===137&&J[1]===80&&J[2]===78&&J[3]===71)return"image/png";if(J[0]===255&&J[1]===216&&J[2]===255)return"image/jpeg";if(J[0]===71&&J[1]===73&&J[2]===70)return"image/gif";if(J[0]===82&&J[1]===73&&J[2]===70&&J[3]===70){if(J.length>=12&&J[8]===87&&J[9]===69&&J[10]===66&&J[11]===80)return"image/webp"}return"image/png"}catch{return"image/png"}}function WZ(){let $=process.platform,J={darwin:"/tmp/blade_cli_latest_screenshot.png",linux:"/tmp/blade_cli_latest_screenshot.png",win32:process.env.TEMP?`${process.env.TEMP}\\blade_cli_latest_screenshot.png`:"C:\\Temp\\blade_cli_latest_screenshot.png"},Y={darwin:{checkImage:"osascript -e 'the clipboard as «class PNGf»'",saveImage:(X)=>`osascript -e 'set png_data to (the clipboard as «class PNGf»)' -e 'set fp to open for access POSIX file "${X}" with write permission' -e 'write png_data to fp' -e 'close access fp'`,getPath:"osascript -e 'get POSIX path of (the clipboard as «class furl»)'",deleteFile:(X)=>`rm -f "${X}"`},linux:{checkImage:'xclip -selection clipboard -t TARGETS -o | grep -E "image/(png|jpeg|jpg|gif|webp)"',saveImage:(X)=>`xclip -selection clipboard -t image/png -o > "${X}" || wl-paste --type image/png > "${X}"`,getPath:"xclip -selection clipboard -t text/plain -o",deleteFile:(X)=>`rm -f "${X}"`},win32:{checkImage:'powershell -Command "(Get-Clipboard -Format Image) -ne $null"',saveImage:(X)=>`powershell -Command "$img = Get-Clipboard -Format Image; if ($img) { $img.Save('${X.replace(/\\/g,"\\\\")}', [System.Drawing.Imaging.ImageFormat]::Png) }"`,getPath:'powershell -Command "Get-Clipboard"',deleteFile:(X)=>`del /f "${X}"`}};return{commands:Y[$]||Y.linux,screenshotPath:J[$]||J.linux}}function rG(){let{commands:$}=WZ();try{return i2($.getPath,{encoding:"utf-8"}).trim()}catch(J){return console.error("Failed to get clipboard path:",J),null}}function HZ($){if($.startsWith('"')&&$.endsWith('"')||$.startsWith("'")&&$.endsWith("'"))return $.slice(1,-1);return $}function FZ($){if(process.platform==="win32")return $;let J="__DOUBLE_BACKSLASH__";return $.replace(/\\\\/g,J).replace(/\\(.)/g,"$1").replace(new RegExp(J,"g"),"\\")}function WJ($){let J=HZ($.trim()),Y=FZ(J);return/\.(png|jpe?g|gif|webp)$/i.test(Y)}function aG($){let J=HZ($.trim()),Y=FZ(J);if(WJ(Y))return Y;return null}async function LZ($){let J=aG($);if(!J)return null;let Y;try{if(lG(J))Y=NJ(J);else{let G=rG();if(G&&J===OZ(G))Y=NJ(G);else return null}}catch(G){return console.error("Failed to read image file:",G),null}let X=Y.toString("base64"),Z=NZ(X),Q=OZ(J);return{path:J,base64:X,mediaType:Z,filename:Q}}async function BZ(){let $=process.platform,J={darwin:"pbpaste",linux:"xclip -selection clipboard -o || wl-paste",win32:'powershell -Command "Get-Clipboard"'},Y=J[$]||J.linux;try{return i2(Y,{encoding:"utf-8"})||null}catch{return null}}async function wZ(){let{commands:$,screenshotPath:J}=WZ();try{if(i2($.checkImage,{stdio:"ignore"}),i2($.saveImage(J),{stdio:"ignore"}),!dG(J))return null;let X=NJ(J).toString("base64"),Z=NZ(X);return i2($.deleteFile(J),{stdio:"ignore"}),{base64:X,mediaType:Z}}catch(Y){try{i2($.deleteFile(J),{stdio:"ignore"})}catch{}return null}}import{jsxDEV as tG}from"react/jsx-dev-runtime";var oG=/\r\n/g,nG=/\r/g;function HJ($){if(!$.includes("\r"))return $;return $.replace(oG,`
|
|
152
|
-
`).replace(nG,`
|
|
153
|
-
`)}function AZ($,J,Y){let X=Math.max(0,Math.min(Y,J.length)),Z=J.slice(0,X),Q=J.slice(X);return{newValue:Z+$+Q,newCursorPosition:X+$.length}}function bZ({value:$,placeholder:J="",focus:Y=!0,onChange:X,cursorPosition:Z,onChangeCursorPosition:Q,onPaste:G,onImagePaste:U,disabledKeys:z=[]}){let K=B8(qZ()),O=B8($),q=B8(Z),N=B8(null),_=B8(!1);PZ(()=>{O.current=$,q.current=Z},[$,Z]),PZ(()=>{if(Z>$.length)Q($.length)},[$,Z,Q]);let H=m4((L,A)=>{let F=O.current,R=q.current;if(O.current=L,q.current=A,L!==F)X(L);if(A!==R)Q(A)}),W=m4((L)=>{if(!L)return;let{newValue:A,newCursorPosition:F}=AZ(HJ(L),O.current,q.current);H(A,F)}),b=m4(async(L)=>{let A=HJ(L);if(!A)return;if(U&&WJ(A))try{let R=await LZ(A);if(R){let k=await U(R.base64,R.mediaType,R.filename);if(k?.prompt)W(k.prompt);return}}catch(R){console.error("Failed to process image path:",R)}if((A.length>g4.LARGE_INPUT_THRESHOLD||A.includes(`
|
|
154
|
-
`))&&G){let R=await G(A);if(R?.prompt){W(R.prompt);return}}W(A)}),M=m4((L)=>{let A=N.current;if(!A){try{let R=L();if(!R)return;let k=R.catch(()=>{return});N.current=k,k.finally(()=>{if(N.current===k)N.current=null})}catch{}return}let F=A.then(L).then(()=>{return}).catch(()=>{return});N.current=F,F.finally(()=>{if(N.current===F)N.current=null})});N0((L,A)=>{return M(()=>{let F=HJ(L),R=_Z(K.current,F);if(K.current=R.state,R.handled)return(async()=>{for(let o of R.segments)if(o.kind==="paste")await b(o.text);else W(o.text)})();if(z.some((o)=>A[o])||A.ctrl&&L==="c"||A.ctrl&&L==="l"||A.ctrl&&L==="t"||A.ctrl&&L==="o"||A.meta&&L==="l"||A.meta&&L==="t"||A.meta&&L==="o"||A.shift&&A.tab||F==="?"&&O.current==="")return;let T=O.current,I=q.current,P=I,j=T;if(A.leftArrow)P--;else if(A.rightArrow)P++;else if(A.backspace||A.delete){if(L===""){if(I>0)j=T.slice(0,I-1)+T.slice(I,T.length),P--}else if(I<T.length)j=T.slice(0,I)+T.slice(I+1,T.length)}else if(A.ctrl&&F==="a")P=0;else if(A.ctrl&&F==="e")P=T.length;else if(A.ctrl&&F==="k")j=T.slice(0,I);else if(A.ctrl&&F==="u")j=T.slice(I),P=0;else if(A.ctrl&&F==="w"){let u=T.slice(0,I).match(/\s*\S+\s*$/);if(u){let Z0=u[0].length;j=T.slice(0,I-Z0)+T.slice(I),P-=Z0}}else if(A.ctrl&&F==="v"){let o=process.platform==="darwin";return(async()=>{if(U){let Z0=await wZ();if(Z0){let z0=await U(Z0.base64,Z0.mediaType,"clipboard.png");if(z0?.prompt)W(z0.prompt);return}}if(o)return;let u=await BZ();if(u)await b(u)})()}else if(A.pageUp)P=0;else if(A.pageDown)P=T.length;else if(F===`
|
|
155
|
-
`&&(A.shift||A.meta)){let{newValue:o,newCursorPosition:u}=AZ(F,T,I);H(o,u);return}else if(!A.ctrl&&!A.meta){if(G&&(F.length>g4.LARGE_INPUT_THRESHOLD||F.includes(`
|
|
156
|
-
`)))return b(F);j=T.slice(0,I)+F+T.slice(I,T.length),P+=F.length}if(P<0)P=0;if(P>j.length)P=j.length;H(j,P)}),!0},{isActive:Y,priority:0,onRegistered:()=>{if(_.current)return;_.current=QZ()}});let w=Y,B=$,C=J?N2.grey(J):void 0;if(w)if(C=J.length>0?N2.inverse(J[0])+N2.grey(J.slice(1)):N2.inverse(" "),$.length===0)B=N2.inverse(" ");else{B="";for(let L=0;L<$.length;L++)if(L===Z&&Z<$.length)B+=N2.inverse($[L]);else B+=$[L];if(Z>=$.length)B+=N2.inverse(" ")}return tG(iG,{children:J?$.length>0?B:C:B},void 0,!1,void 0,this)}import{jsxDEV as FJ}from"react/jsx-dev-runtime";var TZ=$U.memo(({input:$,cursorPosition:J,onChange:Y,onChangeCursorPosition:X,onAddPasteMapping:Z,onAddImagePasteMapping:Q,disabled:G=!1})=>{let z=X$()==="main-input"&&!G,K=$.trimStart().startsWith("!"),O=MZ((N)=>{let _=N.split(`
|
|
157
|
-
`).length,H=N.length,W=500,b=10;if(H>500||_>10){let M=Z(N),w=N.slice(0,30).replace(/\n/g," "),B=`${H} chars, ${_} lines: ${w}...`;return{prompt:`${B4(M)}${B}${M6()}`}}return{}}),q=MZ(async(N,_,H)=>{try{let W=Q(N,_);return{prompt:`${B4(W)}[Image #${W}]${M6()}`}}catch(W){return console.error("[Image Paste] Failed to process image:",W),{prompt:`[Image paste failed: ${W instanceof Error?W.message:"Unknown error"}] `}}});return FJ(sG,{flexDirection:"row",width:"100%",paddingX:2,paddingY:0,flexShrink:0,flexGrow:0,overflow:"hidden",borderStyle:"round",borderColor:K?"yellow":"gray",children:[FJ(eG,{color:K?"yellow":"blue",bold:!0,children:K?"$ ":"> "},void 0,!1,void 0,this),FJ(bZ,{value:$,cursorPosition:J,onChange:Y,onChangeCursorPosition:X,onPaste:O,onImagePaste:q,placeholder:" 输入命令...",focus:z,disabledKeys:["upArrow","downArrow","tab","return","escape"]},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as o2,Text as f$}from"ink";import zU,{useEffect as fZ,useState as vZ}from"react";import{useEffect as QU,useRef as GU,useState as UU}from"react";import{useEffect as JU,useRef as YU,useState as ZU}from"react";var XU=15000,RZ="等待用户确认...",CZ=["思考中","构思中","推理中","琢磨中","分析中","斟酌中","酝酿中","推敲中","揣摩中","审视中","处理中","编排中","打磨中","编织中","拼装中","调配中","组装中","搭建中","铸造中","雕琢中","搜寻中","梳理中","排查中","勘探中","钻研中","翻阅中","遍历中","扫描中","检索中","追踪中","计算中","编译中","解析中","运算中","推演中","迭代中","收敛中","演绎中","归纳中","求解中","生成中","编写中","起草中","绘制中","勾勒中","渲染中","合成中","调和中","编曲中","烹制中","施工中","酿造中","发酵中","煎熬中","折腾中","捣鼓中","鼓捣中","腾挪中","筹备中","蓄力中"],yZ=["Esc - 中止任务 / 隐藏建议 / 双击清空输入","Shift+Tab - 切换模式 (DEFAULT → AUTO_EDIT → PLAN)","Tab - 选中建议 / 切换 thinking 模式","Up/Down - 浏览建议或输入历史","? - 显示快捷键帮助(输入框为空时)","Ctrl+C - 停止任务(双击退出)","Ctrl+L - 清屏","Ctrl+T - 展开/折叠 thinking 内容","Ctrl+O - 打开只读 transcript","Ctrl+A / Ctrl+E - 光标跳到行首/行尾","Ctrl+U / Ctrl+K - 删到行首/行尾","Ctrl+W - 删除前一个单词","Shift+Enter - 插入换行","/help - 显示所有可用命令","/init - 分析项目并生成 BLADE.md","/resume - 恢复历史会话","/compact - 压缩上下文,节省 token","/theme - 切换主题","/model - 管理和切换模型","/permissions - 管理权限规则","/mcp - 查看 MCP 服务器状态","/agents - 管理 subagent 配置","/clear - 清除对话历史","/status - 查看当前配置","/context - 可视化 token 使用情况","/git - Git 查询和 AI 辅助","/git review - AI Code Review","/git commit - AI 生成 commit message","/hooks - 管理 Hook 配置","/tasks - 查看后台任务","/skills - 查看可用 Skills","/plugins - 管理插件","/memory - 管理项目记忆","/ide - 管理 IDE 集成","@ 文件路径 - 附加文件到上下文","@dir/ - 附加整个目录","@file.ts:10-20 - 附加指定行范围","Plan 模式 - 先规划后编码(Shift+Tab 切换)","Auto Edit 模式 - 自动批准工具调用","MCP 协议 - 扩展外部工具集成","Subagents - 并行执行子任务","Hooks - 自定义工具执行流程","Skills - 可复用的技能模板","Plugins - 扩展功能插件","提示:/init 让 AI 理解你的项目结构","提示:Plan 模式适合复杂多步骤任务","提示:Auto Edit 可加速重复性操作","提示:@ 引用可提供更精准的上下文","提示:定期 /compact 节省 token","提示:Esc 可随时中断任务","提示:/resume 继续未完成的对话","提示:/model once 临时切换模型"];function IZ(){if(Math.random()<0.25){let Y=Math.floor(Math.random()*yZ.length);return yZ[Y]}let J=Math.floor(Math.random()*CZ.length);return CZ[J]}function SZ($,J,Y=!1){let[X,Z]=ZU(""),Q=YU(Y);return Q.current=Y,JU(()=>{if(J){Z(RZ);return}if(!$){Z("");return}Z((U)=>U===""||U===RZ?IZ():U);let G=setInterval(()=>{if(!Q.current)Z(IZ())},XU);return()=>{clearInterval(G)}},[$,J]),X}function kZ($,J=!1,Y=!1){let[X,Z]=UU(0),Q=GU(null),G=SZ($,J,Y);return QU(()=>{if(!$){Z(0),Q.current=null;return}if(Y)return;if(Q.current===null)Q.current=Date.now();let U=setInterval(()=>{if(Q.current!==null){let z=Math.floor((Date.now()-Q.current)/1000);Z(z)}},1000);return()=>{clearInterval(U)}},[$,Y]),{currentPhrase:G,elapsedTime:X}}function KU($){let J=Math.max(0,Math.floor($/1000));if(J<60)return`${J}s`;let Y=Math.floor(J/60),X=J%60;if(Y<60)return`${Y}m ${X}s`;return`${Math.floor(Y/60)}h ${Y%60}m ${X}s`}function DZ($,J=Date.now()){let Y=$?.snapshot;if(!Y)return null;let X=Y.activeTools.length+Y.activeToolOverflow,Z=Y.phase==="starting"?"正在启动任务":Y.phase==="thinking"?"正在思考":Y.phase==="responding"?"正在生成回复":Y.phase==="compacting"?"正在压缩上下文":Y.phase==="continuing"?"正在推进下一步":`正在执行 ${X} 个工具`,Q=Y.activeTools.slice(0,2).map((K)=>K.progress!==void 0&&K.total!==void 0?`${K.name} ${K.progress}/${K.total}`:K.name),G=Math.max(0,Y.activeTools.length-Q.length+Y.activeToolOverflow);if(G>0)Q.push(`+${G}`);let U=[...Q,Y.toolCallsStarted>0?`工具 ${Y.toolCallsCompleted}/${Y.toolCallsStarted}`:void 0,Y.turn>0?`回合 ${Y.turn}${Y.maxTurns===null?"":`/${Y.maxTurns}`}`:void 0].filter((K)=>K!==void 0),z=KU(J-Y.startedAt);return{primary:Z,secondary:U.join(" · "),compact:Y.phase==="executing_tools"?`执行工具 · ${X} 个 · ${z}`:`${Z} · ${z}`,elapsed:z}}import{jsxDEV as q$,Fragment as _U}from"react/jsx-dev-runtime";var LJ=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"],qU=80;function VZ($){if($<60)return`${$}s`;let J=Math.floor($/60),Y=$%60;return`${J}m ${Y}s`}var jZ=zU.memo(({message:$,paused:J=!1})=>{let Y=v2(),X=h8(),Z=v8(),Q=nJ(),G=tJ(),U=Y||!X,[z,K]=vZ(0),[O,q]=vZ(Date.now()),N=D0(),H=m2()>=qU,{currentPhrase:W,elapsedTime:b}=kZ(U,!1,J);if(fZ(()=>{if(!U||J){K(0);return}let L=setInterval(()=>{K((A)=>(A+1)%LJ.length)},150);return()=>clearInterval(L)},[U,J]),fZ(()=>{if(!Z?.snapshot?.nextActionAt&&!Q?.snapshot||J)return;q(Date.now());let L=setInterval(()=>q(Date.now()),1000);return()=>clearInterval(L)},[J,Z?.snapshot?.nextActionAt,Q?.snapshot]),!U)return null;let M=S4(Z,O),w=DZ(Q,O),C=(G?.phase==="detected"?`检测到 ${G.toolName} 连续 ${G.runLength} 次无进展,正在要求 Agent 切换策略`:G?.phase==="halted"?`已停止 ${G.toolName} 空转循环`:null)||M?.primary||w?.primary||$||W||"正在思考中...";if(H)return q$(o2,{paddingX:2,paddingBottom:1,flexDirection:"row",gap:1,children:[q$(f$,{color:N.colors.warning,bold:!0,children:LJ[z]},void 0,!1,void 0,this),q$(f$,{color:N.colors.text.primary,children:C},void 0,!1,void 0,this),M?.secondary&&q$(f$,{color:N.colors.info,children:M.secondary},void 0,!1,void 0,this),!M?.secondary&&w?.secondary&&q$(f$,{color:N.colors.info,children:w.secondary},void 0,!1,void 0,this),(w||b>0)&&q$(_U,{children:[q$(f$,{color:N.colors.muted,children:"|"},void 0,!1,void 0,this),q$(f$,{color:N.colors.info,children:["已用时:"," ",w?.elapsed??VZ(b)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),q$(f$,{color:N.colors.muted,children:"|"},void 0,!1,void 0,this),q$(f$,{color:N.colors.secondary,children:"Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return q$(o2,{paddingX:2,paddingBottom:1,flexDirection:"column",children:[q$(o2,{flexDirection:"row",gap:1,children:[q$(f$,{color:N.colors.warning,bold:!0,children:LJ[z]},void 0,!1,void 0,this),q$(f$,{color:N.colors.text.primary,children:C},void 0,!1,void 0,this)]},void 0,!0,void 0,this),M?.secondary&&q$(o2,{marginLeft:2,children:q$(f$,{color:N.colors.info,children:M.secondary},void 0,!1,void 0,this)},void 0,!1,void 0,this),!M?.secondary&&w?.secondary&&q$(o2,{marginLeft:2,children:q$(f$,{color:N.colors.info,children:w.secondary},void 0,!1,void 0,this)},void 0,!1,void 0,this),(w||b>0)&&q$(o2,{marginLeft:2,flexDirection:"row",gap:1,children:[q$(f$,{color:N.colors.info,children:["已用时: ",w?.elapsed??VZ(b)]},void 0,!0,void 0,this),q$(f$,{color:N.colors.muted,children:"|"},void 0,!1,void 0,this),q$(f$,{color:N.colors.secondary,children:"Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});import{Box as c4,Text as $$,useStdout as OU}from"ink";import NU from"ink-text-input";import WU,{useCallback as p4,useEffect as HU,useMemo as FU,useState as W2}from"react";import{jsxDEV as f0}from"react/jsx-dev-runtime";var mZ=WU.memo(({details:$,onComplete:J})=>{let{stdout:Y}=OU(),X=Y.columns||80,Z=X$()==="confirmation-prompt",Q=s0(!1),G=$.fields??[],[U,z]=W2("field"),[K,O]=W2(0),[q,N]=W2(()=>EZ($)),[_,H]=W2(""),[W,b]=W2(0),[M,w]=W2([]),[B,C]=W2(),L=G[K],A=FU(()=>LU(L),[L]);HU(()=>{if(!L)return;let I=q[L.name];H(typeof I==="string"||typeof I==="number"?String(I):""),w(Array.isArray(I)?[...I]:[]);let P=A.findIndex((j)=>j.value===String(I));b(P>=0?P:0),C(void 0)},[q,L,A]);let F=p4((I)=>{if(N(I),K<G.length-1){O((P)=>P+1);return}z("review")},[K,G.length]),R=p4((I)=>{if(!L)return;let P={...q};if(I===void 0)delete P[L.name];else P[L.name]=I;F(P)},[q,L,F]),k=p4((I)=>{if(!L)return;try{R(hZ(L,I))}catch(P){C(P instanceof Error?P.message:String(P))}},[L,R]),T=p4(()=>{try{let I=gZ($,{action:"accept",content:q});J({action:I.action,...I.content?{content:I.content}:{}})}catch(I){C(I instanceof Error?I.message:String(I))}},[q,$,J]);if(N0((I,P)=>{if(P.ctrl&&I==="c"||P.meta&&I==="c"){Q();return}if(P.escape){J({action:"cancel"});return}if($.mode==="url"){if(I.toLowerCase()==="y")J({action:"accept"},!0);else if(I.toLowerCase()==="n")J({action:"decline"});return}if(U==="review"){if(I.toLowerCase()==="y"||P.return)T();else if(I.toLowerCase()==="e")O(0),z("field");else if(I.toLowerCase()==="d")J({action:"decline"});return}if(!L){if(P.return)T();return}if(BJ(L))return;if(I.toLowerCase()==="d"){J({action:"decline"});return}if(P.upArrow){b((j)=>j>0?j-1:Math.max(A.length-1,0));return}if(P.downArrow||P.tab){b((j)=>j<A.length-1?j+1:0);return}if(I===" "&&L.type==="multi-select"){let j=A[W];if(j)w((o)=>o.includes(j.value)?o.filter((u)=>u!==j.value):[...o,j.value]);return}if(P.return)if(L.type==="multi-select")R(M);else{let j=A[W];if(j)R(j.typedValue)}},{isActive:Z}),$.mode==="url")return f0(x4,{width:X,color:"yellow",children:[f0($$,{bold:!0,color:"yellow",children:"MCP external authorization"},void 0,!1,void 0,this),f0($$,{children:$.message},void 0,!1,void 0,this),f0($$,{color:"yellow",children:['Only continue if you trust MCP server "',$.serverName,'".']},void 0,!0,void 0,this),f0($$,{children:["Domain: ",f0($$,{color:"cyan",children:$.domain},void 0,!1,void 0,this)]},void 0,!0,void 0,this),f0($$,{wrap:"wrap",children:["URL: ",f0($$,{color:"cyan",children:$.url},void 0,!1,void 0,this)]},void 0,!0,void 0,this),f0($$,{color:"gray",children:"[Y] Open URL · [N] Decline · Esc Cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(U==="review")return f0(x4,{width:X,color:"green",children:[f0($$,{bold:!0,color:"green",children:"Review MCP form response"},void 0,!1,void 0,this),f0($$,{children:$.message},void 0,!1,void 0,this),G.map((I)=>f0($$,{children:[I.title,": ",wU(q[I.name])]},I.name,!0,void 0,this)),B&&f0($$,{color:"red",children:B},void 0,!1,void 0,this),f0($$,{color:"gray",children:"[Y] Submit · [E] Edit · [D] Decline · Esc Cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(!L)return f0(x4,{width:X,color:"cyan",children:[f0($$,{children:$.message},void 0,!1,void 0,this),f0($$,{color:"gray",children:"This form has no fields."},void 0,!1,void 0,this),f0($$,{color:"gray",children:"Press Enter to submit · [D] Decline · Esc Cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return f0(x4,{width:X,color:"cyan",children:[f0($$,{bold:!0,color:"cyan",children:["MCP input requested by ",$.serverName]},void 0,!0,void 0,this),f0($$,{children:$.message},void 0,!1,void 0,this),f0(c4,{flexDirection:"column",marginTop:1,children:[f0($$,{bold:!0,children:[L.title,L.required?" *":""]},void 0,!0,void 0,this),L.description&&f0($$,{color:"gray",children:L.description},void 0,!1,void 0,this),f0($$,{color:"gray",children:BU(L)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),BJ(L)?f0(c4,{children:[f0($$,{color:"cyan",children:"> "},void 0,!1,void 0,this),f0(NU,{value:_,onChange:H,onSubmit:k,focus:Z,placeholder:L.defaultValue===void 0?L.required?"Required":"Optional":String(L.defaultValue)},void 0,!1,void 0,this)]},void 0,!0,void 0,this):f0(c4,{flexDirection:"column",children:A.map((I,P)=>{let j=L.type==="multi-select"&&M.includes(I.value);return f0($$,{color:W===P?"yellow":void 0,children:[W===P?"> ":" ",L.type==="multi-select"?j?"(*) ":"( ) ":"",I.label]},I.value,!0,void 0,this)})},void 0,!1,void 0,this),B&&f0($$,{color:"red",children:B},void 0,!1,void 0,this),f0($$,{color:"gray",children:[BJ(L)?"Enter to continue":L.type==="multi-select"?"Space to toggle · Enter to continue":"Up/Down to select · Enter to continue"," · [D] Decline · Esc Cancel"]},void 0,!0,void 0,this),f0($$,{color:"gray",children:["Field ",K+1," of ",G.length]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});function x4({children:$,width:J,color:Y}){return f0(c4,{flexDirection:"column",gap:1,borderStyle:"round",borderColor:Y,padding:1,width:Math.min(J-4,88),children:$},void 0,!1,void 0,this)}function BJ($){return $.type==="string"||$.type==="number"||$.type==="integer"}function LU($){if(!$)return[];if($.type==="boolean")return[{value:"true",label:"Yes",typedValue:!0},{value:"false",label:"No",typedValue:!1}];return($.options??[]).map((J)=>({...J,typedValue:J.value}))}function BU($){let J=[];if($.format)J.push(`format: ${$.format}`);if($.minimum!==void 0)J.push(`min: ${$.minimum}`);if($.maximum!==void 0)J.push(`max: ${$.maximum}`);if($.minLength!==void 0)J.push(`min length: ${$.minLength}`);if($.maxLength!==void 0)J.push(`max length: ${$.maxLength}`);if($.minItems!==void 0)J.push(`min selections: ${$.minItems}`);if($.maxItems!==void 0)J.push(`max selections: ${$.maxItems}`);return J.join(" · ")}function wU($){if($===void 0)return"(omitted)";if(Array.isArray($))return $.join(", ")||"(none)";return String($)}import d4 from"ansi-escapes";import{Box as H2,Static as SU,useStdout as kU}from"ink";import DU,{useEffect as S1,useMemo as TJ,useRef as a1,useState as RJ}from"react";import{Box as PU,Text as pZ}from"ink";import AU from"react";import{jsxDEV as wJ}from"react/jsx-dev-runtime";var PJ=AU.memo(({collapsedCount:$})=>{let J=D0();if($<=0)return null;let Y=J.colors.text.muted;return wJ(PU,{flexDirection:"row",marginBottom:1,children:[wJ(pZ,{color:Y,children:[">"," ",$," 条历史消息"]},void 0,!0,void 0,this),wJ(pZ,{color:Y,children:" [Ctrl+O 浏览]"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});PJ.displayName="CollapsedHistorySummary";import{Box as w8,Text as P8}from"ink";import bU from"ink-big-text";import MU from"ink-gradient";import TU from"react";import{jsxDEV as n$}from"react/jsx-dev-runtime";var cZ=TU.memo(()=>{return n$(w8,{flexDirection:"column",paddingX:2,paddingTop:1,paddingBottom:1,children:[n$(w8,{flexDirection:"column",children:n$(MU,{name:"pastel",children:n$(bU,{text:"BLADE",font:"block"},void 0,!1,void 0,this)},void 0,!1,void 0,this)},void 0,!1,void 0,this),n$(w8,{marginBottom:1,children:n$(P8,{color:"white",dimColor:!0,children:xZ()},void 0,!1,void 0,this)},void 0,!1,void 0,this),n$(w8,{flexDirection:"column",marginBottom:1,children:[n$(w8,{marginBottom:1,children:n$(P8,{color:"white",bold:!0,children:"使用指南:"},void 0,!1,void 0,this)},void 0,!1,void 0,this),n$(P8,{color:"white",children:"1. 输入问题、编辑文件或运行命令"},void 0,!1,void 0,this),n$(P8,{color:"white",children:"2. 使用 /init 创建项目配置文件"},void 0,!1,void 0,this),n$(P8,{color:"white",children:"3. 输入 /help 查看所有 slash 命令"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});import{Box as u4,Text as AJ}from"ink";import uZ from"react";import{jsxDEV as r1}from"react/jsx-dev-runtime";var dZ=uZ.memo(({tasks:$,visible:J=!0,compact:Y=!1})=>{let{colors:X}=D0();if(!J||$.length===0)return null;let Z={total:$.length,completed:$.filter((Q)=>Q.status==="completed").length,inProgress:$.filter((Q)=>Q.status==="in_progress").length};return r1(u4,{flexDirection:"column",borderStyle:"single",borderColor:X.border.light,paddingX:1,paddingY:Y?0:1,marginBottom:1,children:[r1(u4,{marginBottom:Y?0:1,children:[r1(AJ,{dimColor:!0,children:"Tasks "},void 0,!1,void 0,this),r1(AJ,{color:X.text.muted,children:[Z.completed,"/",Z.total]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),r1(u4,{flexDirection:"column",children:$.map((Q,G)=>r1(RU,{task:Q,compact:Y},Q.id||G,!1,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}),RU=uZ.memo(({task:$,compact:J})=>{let Y,X=!1,Z;switch($.status){case"completed":Y="[OK]",X=!0,Z=$.subject;break;case"in_progress":Y=">",X=!1,Z=$.activeForm||$.subject;break;case"pending":default:Y="-",X=!0,Z=$.subject;break}return r1(u4,{paddingY:J?0:0,children:r1(AJ,{dimColor:X,children:[Y," ",Z]},void 0,!0,void 0,this)},void 0,!1,void 0,this)});import{Box as bJ,Text as n2}from"ink";import CU,{useMemo as lZ}from"react";import{jsxDEV as I1}from"react/jsx-dev-runtime";function yU($,J=60){if(!$)return"";let Y=$.split(`
|
|
158
|
-
`)[0]||"";if(Y.length<=J)return Y;return`${Y.slice(0,J)}...`}function IU($){if(!$)return 0;return $.split(`
|
|
159
|
-
`).length}var MJ=CU.memo(({content:$,isStreaming:J=!1,isExpanded:Y})=>{let X=D0(),Z=lZ(()=>IU($),[$]),Q=lZ(()=>yU($),[$]),G=X.colors.info,U=X.colors.muted;return I1(bJ,{flexDirection:"column",marginBottom:1,children:[I1(bJ,{flexDirection:"row",children:[I1(n2,{color:G,children:Y?"v":">"},void 0,!1,void 0,this),I1(n2,{children:" "},void 0,!1,void 0,this),I1(n2,{color:U,children:["Thinking",J?"...":` (${Z} lines)`]},void 0,!0,void 0,this),!Y&&!J&&Q&&I1(n2,{color:U,children:[" - ",Q]},void 0,!0,void 0,this),I1(n2,{color:U,dimColor:!0,children:[" ","[Ctrl+T]"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Y&&$&&I1(bJ,{marginLeft:2,marginTop:1,borderStyle:"round",borderColor:"gray",paddingX:1,paddingY:0,children:I1(n2,{color:U,children:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});MJ.displayName="ThinkingBlock";import{jsxDEV as v$}from"react/jsx-dev-runtime";var fU=({active:$=!0})=>{let J=f8(),Y=a8(),X=i8(),Z=L9(),Q=v2(),G=J9(),U=K9(),z=r8(),K=F9(),O=rJ(),q=w9(),N=B9(),{width:_,height:H}=d1(),{stdout:W}=kU(),b=p1(),[M,w]=RJ(null),[B,C]=RJ([]),[L,A]=RJ(new Set),F=a1(N),R=a1(null),k=a1(0),T=a1(0),I=a1(new Set),P=a1(new Set),j=a1([]),o=a1(null);S1(()=>{if(F.current!==N){if(F.current=N,!$)return;if(Y1())a$();if(W)W.write(d4.clearTerminal);b.incrementClearCount()}},[$,N,W,b]);let u=J,Z0=Z;S1(()=>{if(!Z||Q){o.current=null;return}if(o.current===Z)return;if(o.current=Z,Y1())a$();if($&&W)W.write(d4.eraseScreen+d4.cursorTo(0,0));I.current=new Set,P.current=new Set(u.filter((c)=>c.role==="tool").map((c)=>c.id)),R.current=null,k.current=0,T.current=0,j.current=[],C([]),A(new Set),b.incrementClearCount(),b.clearFinalizingStreamingMessageId()},[Z,Q,W,b,u,$]);let z0=Y??Z;S1(()=>{if($&&Y1())a$();R.current=null,k.current=0,T.current=0,I.current=new Set,P.current=new Set(u.filter((c)=>c.role==="tool").map((c)=>c.id)),j.current=[],C([]),A(new Set)},[O]),S1(()=>{if(!z0)return;if(R.current===z0)return;R.current=z0,k.current=0,T.current=0,P.current=new Set(u.filter((c)=>c.role==="tool").map((c)=>c.id)),j.current=[],C([])},[z0,O]),S1(()=>{if(!z0)return;let c=CJ(z0);if(!c||c.length<=k.current)return;let d=c.slice(k.current);k.current=c.length;let a=d,W0=j.current;if(W0.length>0)if(a.some((D)=>D.type!=="empty"))a=[...W0,...a],j.current=[];else{j.current=[...W0,...a];return}let F0=a.length;while(F0>0&&a[F0-1].type==="empty")F0-=1;if(F0!==a.length)j.current=a.slice(F0),a=a.slice(0,F0);if(a.length===0)return;let T0=T.current;T.current+=1;let y=T0>0;if(Y1())a$();A((D)=>{if(!z0||D.has(z0))return D;let p=new Set(D);return p.add(z0),p}),C((D)=>[...D,v$(H2,{flexDirection:"column",children:v$(C1,{content:"",role:"assistant",terminalWidth:_,isPending:!1,hidePrefix:y,noMargin:!0,blocksOverride:a,renderCodeBlocksAsPlainText:!1},void 0,!1,void 0,this)},`streaming-${z0}-${T0}`,!1,void 0,this)])},[z0,X.version,_,O,$]),S1(()=>{if(!z0)return;let c=P.current,d=u.filter((a)=>a.role==="tool"&&!c.has(a.id)&&!I.current.has(a.id));if(d.length===0)return;if($&&Y1())a$();for(let a of d)I.current.add(a.id);C((a)=>[...a,...d.map((W0)=>v$(H2,{flexDirection:"column",children:v$(C1,{content:W0.content,role:W0.role,terminalWidth:_,metadata:W0.metadata,isPending:!1,messageId:W0.id},void 0,!1,void 0,this)},`streaming-tool-${W0.id}`,!1,void 0,this))])},[$,z0,u,_]),S1(()=>{if(!$){if(Y1())a$();return}if(!z0){if(Y1())a$();return}if(!Y1())U3(_,H);else K3(_,H);let c=rZ(z0);if(!c||c.lines.length===0)return;let a=Math.max(1,H-8),W0=Math.max(0,c.lines.length-a),F0=c.lines.slice(-a),T0=(CJ(z0)?.length??0)>0;z3(F0,W0,c.mode,T0)},[z0,X.version,H,_,$]),S1(()=>{if(!z0&&Y1())a$()},[z0]),S1(()=>{if(M===null&&u.length>q){if(w(u.length),$&&Y1())a$();if($&&W)W.write(d4.clearTerminal);b.incrementClearCount()}},[u.length,q,M,W,b,$]);let J0=TJ(()=>{return G.some((c)=>c.status==="pending"||c.status==="in_progress")},[G]),f=N?0:M??0,E=f,m=TJ(()=>{let c=[];if(c.push(v$(cZ,{},"header",!1,void 0,this)),E>0)c.push(v$(PJ,{collapsedCount:E},"collapsed-summary",!1,void 0,this));for(let d=f;d<u.length;d++){let a=u[d];if(Z0&&a.id===Z0)continue;if(a.role==="tool"&&I.current.has(a.id))continue;if(a.role==="assistant"&&L.has(a.id))continue;c.push(v$(H2,{flexDirection:"column",children:v$(C1,{content:a.content,role:a.role,terminalWidth:_,metadata:a.metadata,isPending:!1,messageId:a.id},void 0,!1,void 0,this)},a.id,!1,void 0,this))}return c},[u,f,E,_,Z0,L]),Y0=TJ(()=>B.length>0?[...m,...B]:m,[m,B]);return v$(H2,{flexDirection:"column",paddingX:2,children:v$(H2,{flexDirection:"column",children:[v$(SU,{items:Y0,children:(c)=>c},O,!1,void 0,this),z&&v$(H2,{marginBottom:1,children:v$(MJ,{content:z,isStreaming:Q,isExpanded:K},void 0,!1,void 0,this)},void 0,!1,void 0,this),U&&J0&&v$(H2,{marginTop:1,children:v$(dZ,{tasks:G,visible:!0,compact:!1},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this)},aZ=DU.memo(fU);import{useMemoizedFn as l4,useMount as vU}from"ahooks";import{Box as t$,Text as v0,useFocus as VU,useFocusManager as jU}from"ink";import EU from"ink-select-input";import{memo as hU,useMemo as gU,useState as r4}from"react";import{jsxDEV as L0,Fragment as xU}from"react/jsx-dev-runtime";var mU=({isSelected:$})=>L0(t$,{marginRight:1,children:L0(v0,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),pU=({isSelected:$,label:J})=>L0(v0,{bold:$,color:$?"yellow":void 0,children:J},void 0,!1,void 0,this),iZ=hU(({onClose:$,onEdit:J})=>{let Y=z9(),X=m8()??"",{isFocused:Z}=VU({id:"model-selector"}),Q=jU(),[G,U]=r4(""),[z,K]=r4(!1),[O,q]=r4(null),N=s0(!1),[_]=r4(()=>{let F=process.stdout?.columns||80;return Math.max(20,F-8)});vU(()=>{if(Q?.focus("model-selector"),Y.length>0)U(Y[0].id)}),N0((F,R)=>{if(z)return;if(R.ctrl&&F==="c"||R.meta&&F==="c"){N();return}if(R.escape){$();return}if(!Z)return;if(F==="d"||F==="D"){W();return}if((F==="e"||F==="E")&&J)b()},{isActive:!0});let H=l4(async(F)=>{if(z)return;let R=F.value;if(R===X){$();return}K(!0),q(null);try{await z$().setCurrentModel(R),$()}catch(k){q(k.message),K(!1)}}),W=l4(async()=>{if(z||G===X)return;K(!0),q(null);try{if(await z$().removeModel(G),Y.length<=1)$()}catch(F){q(F.message)}finally{K(!1)}}),b=l4(()=>{if(z||!J)return;let F=Y.find((R)=>R.id===G);if(!F)return;J(F)}),M=l4((F)=>{U(F.value)}),w=gU(()=>{return Y.find((F)=>F.id===G)},[Y,G]),B=w?a4()?.modelProviders[w.provider]:void 0,C=Y.map((F)=>{let R=F.id===X?" (当前)":"";return{label:yJ(F)+R,value:F.id}}),L=G===X;return L0(t$,{flexDirection:"column",borderStyle:"round",borderColor:"gray",padding:1,width:"100%",children:[L0(t$,{flexDirection:"row",justifyContent:"space-between",marginBottom:1,children:[L0(v0,{bold:!0,color:"cyan",children:"模型管理"},void 0,!1,void 0,this),L0(v0,{dimColor:!0,children:[z?"处理中...":L?"Enter=关闭 • E=编辑 • Esc=取消":"Enter=切换 • D=删除 • E=编辑 • Esc=取消"," • Ctrl+C=退出"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),L0(t$,{flexDirection:"row",children:[L0(t$,{flexDirection:"column",flexGrow:2,marginRight:2,borderStyle:"single",borderColor:"gray",padding:1,children:[L0(v0,{dimColor:!0,children:["已配置模型 (",Y.length,")"]},void 0,!0,void 0,this),L0(t$,{marginTop:1,children:L0(EU,{items:C,onSelect:H,onHighlight:M,indicatorComponent:mU,itemComponent:pU},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),L0(t$,{flexDirection:"column",flexGrow:3,borderStyle:"single",borderColor:"gray",padding:1,children:[L0(v0,{dimColor:!0,children:"模型详情"},void 0,!1,void 0,this),L0(t$,{marginY:1,children:L0(v0,{color:L?"green":"yellow",children:L?"* 当前使用":"* 可切换"},void 0,!1,void 0,this)},void 0,!1,void 0,this),w?L0(t$,{flexDirection:"column",children:[L0(v0,{children:[L0(v0,{dimColor:!0,children:"名称: "},void 0,!1,void 0,this),L0(v0,{bold:!0,color:"cyan",children:yJ(w)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),L0(v0,{children:[L0(v0,{dimColor:!0,children:"Provider: "},void 0,!1,void 0,this),L0(v0,{bold:!0,children:B?.name??w.provider},void 0,!1,void 0,this)]},void 0,!0,void 0,this),B&&L0(xU,{children:[L0(v0,{children:[L0(v0,{dimColor:!0,children:"Channel ID: "},void 0,!1,void 0,this),L0(v0,{children:w.provider},void 0,!1,void 0,this)]},void 0,!0,void 0,this),L0(v0,{children:[L0(v0,{dimColor:!0,children:"Wire API: "},void 0,!1,void 0,this),L0(v0,{children:B.wireApi},void 0,!1,void 0,this)]},void 0,!0,void 0,this),L0(v0,{children:[L0(v0,{dimColor:!0,children:"Endpoint: "},void 0,!1,void 0,this),L0(v0,{color:"blueBright",children:B.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),L0(v0,{children:[L0(v0,{dimColor:!0,children:"Model: "},void 0,!1,void 0,this),L0(v0,{bold:!0,children:w.model},void 0,!1,void 0,this)]},void 0,!0,void 0,this),w.overrides?.baseUrl&&L0(v0,{children:[L0(v0,{dimColor:!0,children:"Base URL override: "},void 0,!1,void 0,this),L0(v0,{color:"blueBright",children:w.overrides.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this),L0(v0,{children:[L0(v0,{dimColor:!0,children:"Context Window: "},void 0,!1,void 0,this),L0(v0,{children:b1().resolveConfig(w).contextWindow},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this):L0(v0,{dimColor:!0,children:"请选择一个模型查看详情"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),O&&L0(t$,{marginTop:1,children:L0(v0,{color:"red",children:O},void 0,!1,void 0,this)},void 0,!1,void 0,this),L0(t$,{justifyContent:"center",marginTop:1,children:L0(v0,{dimColor:!0,children:"─".repeat(_)},void 0,!1,void 0,this)},void 0,!1,void 0,this),L0(t$,{justifyContent:"center",children:L0(v0,{dimColor:!0,children:"提示:D=删除 * E=编辑 * Up/Down=移动 * Enter/ESC=确认"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{useMemoizedFn as IJ}from"ahooks";import{Box as XK,Text as SJ}from"ink";import{useState as B2}from"react";import{Box as F2,Text as k1}from"ink";import cU from"ink-text-input";import{jsxDEV as w$}from"react/jsx-dev-runtime";var oZ=({provider:$,value:J,onChange:Y,onSubmit:X,onCancel:Z,error:Q})=>{return N0((G,U)=>{if(U.escape)Z()}),w$(F2,{flexDirection:"column",children:[w$(F2,{marginBottom:1,children:w$(k1,{bold:!0,color:"blue",children:"Step 2: 输入 API Key"},void 0,!1,void 0,this)},void 0,!1,void 0,this),w$(F2,{marginBottom:1,children:w$(k1,{children:["Provider: ",w$(k1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),w$(F2,{marginBottom:1,children:w$(k1,{dimColor:!0,children:"API 密钥将存储在 ~/.blade/auth.json(权限 600),不会写入模型配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),w$(F2,{children:[w$(k1,{bold:!0,color:"cyan",children:[">"," "]},void 0,!0,void 0,this),w$(cU,{value:J,onChange:Y,onSubmit:X,placeholder:"sk-...",mask:"*"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q&&w$(F2,{marginTop:1,children:w$(k1,{color:"red",children:Q},void 0,!1,void 0,this)},void 0,!1,void 0,this),w$(F2,{marginTop:1,children:w$(k1,{dimColor:!0,children:["输入完成后按 ",w$(k1,{bold:!0,children:"Enter"},void 0,!1,void 0,this),",",w$(k1,{bold:!0,children:"Esc"},void 0,!1,void 0,this)," 返回"]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{Box as i4,Text as i1}from"ink";import uU from"ink-text-input";import{useState as o4}from"react";import{jsxDEV as x$}from"react/jsx-dev-runtime";var n4=["id","name","baseUrl","model"];function nZ($){switch($){case"id":return"Channel ID";case"name":return"Channel name";case"baseUrl":return"Base URL";case"model":return"Model ID"}}function dU($,J,Y){switch($){case"id":return"team-gateway";case"name":return Y||"Team Gateway";case"baseUrl":return J==="anthropic-messages"?"https://gateway.example.com":"https://gateway.example.com/v1";case"model":return J==="anthropic-messages"?"claude-opus-4-8":"vendor-model-2026"}}function lU($,J){let Y=$.id.trim(),X={name:$.name.trim()||Y,baseUrl:$.baseUrl.trim(),wireApi:J},Z=sZ(Y,X);if(!$.model.trim())Z.push("Model ID must not be empty");if(Z.length>0)throw Error(Z[0]);return{provider:Y,model:$.model.trim(),displayName:$.model.trim(),modelProvider:X}}var eZ=({wireApi:$,initialConfig:J,onSubmit:Y,onCancel:X})=>{let Z={id:J?.provider??"",name:J?.modelProvider?.name??"",baseUrl:J?.modelProvider?.baseUrl??"",model:J?.model??""},[Q,G]=o4(J?3:0),[U,z]=o4(J?.model??""),[K,O]=o4(Z),[q,N]=o4(),_=n4[Q];N0((W,b)=>{if(!b.escape)return;if(N(void 0),Q===0){X();return}let M=Q-1,w=n4[M];G(M),z(K[w])});let H=(W)=>{let b=W.trim();if(_==="id"&&!tZ.test(b)){N("Channel ID 必须以小写字母开头,且仅包含小写字母、数字、.、_ 或 -");return}if(_==="baseUrl")try{let w=new URL(b);if(!["http:","https:"].includes(w.protocol))throw Error()}catch{N("Base URL 必须是绝对 HTTP(S) URL");return}if(_==="model"&&!b){N("Model ID 不能为空");return}let M={...K,[_]:_==="name"&&!b?K.id:b};if(O(M),N(void 0),Q===n4.length-1){try{Y(lU(M,$))}catch(w){N(w instanceof Error?w.message:"渠道配置无效")}return}G(Q+1),z("")};return x$(i4,{flexDirection:"column",children:[x$(i4,{marginBottom:1,children:x$(i1,{bold:!0,color:"blue",children:"配置自定义 Provider 渠道"},void 0,!1,void 0,this)},void 0,!1,void 0,this),x$(i1,{dimColor:!0,children:["Protocol:"," ",$==="anthropic-messages"?"Anthropic Messages":"OpenAI Chat Completions"]},void 0,!0,void 0,this),n4.slice(0,Q).map((W)=>x$(i1,{children:[nZ(W),": ",x$(i1,{color:"cyan",children:K[W]},void 0,!1,void 0,this)]},W,!0,void 0,this)),x$(i4,{marginTop:1,children:[x$(i1,{bold:!0,children:[nZ(_),": "]},void 0,!0,void 0,this),x$(uU,{value:U,onChange:(W)=>{z(W),N(void 0)},onSubmit:H,placeholder:dU(_,$,K.id)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),_==="name"&&x$(i1,{dimColor:!0,children:"留空使用 Channel ID"},void 0,!1,void 0,this),q&&x$(i1,{color:"red",children:q},void 0,!1,void 0,this),x$(i4,{marginTop:1,children:x$(i1,{dimColor:!0,children:"Enter 继续 · Esc 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useEffect as Y5,useState as t2}from"react";var Z5=()=>{let[$,J]=t2([]),[Y,X]=t2(!0),[Z,Q]=t2(null);return Y5(()=>{let G=!1;return(async()=>{try{let z=await $5();if(!G)J(z)}catch(z){if(!G)Q(z instanceof Error?z.message:"加载 Provider 列表失败")}finally{if(!G)X(!1)}})(),()=>{G=!0}},[]),{providers:$,isLoading:Y,error:Z}},X5=($)=>{let[J,Y]=t2([]),[X,Z]=t2(!1),[Q,G]=t2(null);return Y5(()=>{if(!$){Y([]),Z(!1),G(null);return}let U=!1;return Y([]),Z(!0),G(null),(async()=>{try{let K=await J5($);if(!U)Y(K)}catch(K){if(!U)G(K instanceof Error?K.message:"加载模型列表失败")}finally{if(!U)Z(!1)}})(),()=>{U=!0}},[$]),{models:J,isLoading:X,error:Q}};import{Box as D1,Text as G1}from"ink";import rU from"ink-select-input";import aU from"ink-text-input";import{useMemo as Q5,useState as iU}from"react";import{jsxDEV as G$,Fragment as sU}from"react/jsx-dev-runtime";var oU=({isSelected:$})=>G$(D1,{marginRight:1,children:G$(G1,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),nU=($)=>{let J=[$.name];if($.contextWindow){let Y=$.contextWindow>=1e6?`${($.contextWindow/1e6).toFixed(1)}M`:$.contextWindow>=1000?`${Math.round($.contextWindow/1000)}K`:`${$.contextWindow}`;J.push(`[${Y} ctx]`)}if($.reasoning)J.push("[reasoning]");if($.input.includes("image"))J.push("[vision]");if($.cost.input||$.cost.output)J.push(`[$${$.cost.input}/$${$.cost.output}]`);return J.join(" ")},tU=({isSelected:$,label:J})=>G$(G1,{bold:$,color:$?"yellow":void 0,children:J},void 0,!1,void 0,this),G5=({provider:$,models:J,isLoading:Y,error:X,onSelect:Z,onCancel:Q})=>{let[G,U]=iU("");N0((O,q)=>{if(q.escape)if(G)U("");else Q()});let z=Q5(()=>{if(!G)return J;let O=G.toLowerCase();return J.filter((q)=>q.name.toLowerCase().includes(O)||q.id.toLowerCase().includes(O))},[J,G]),K=Q5(()=>z.map((O)=>({key:O.id,label:nU(O),value:O})),[z]);if(Y)return G$(D1,{flexDirection:"column",children:G$(G1,{color:"yellow",children:["正在加载 ",$.name," 模型列表..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this);if(X)return G$(D1,{flexDirection:"column",children:[G$(G1,{color:"red",children:X},void 0,!1,void 0,this),G$(G1,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return G$(D1,{flexDirection:"column",children:[G$(D1,{marginBottom:1,children:G$(G1,{bold:!0,color:"blue",children:"Step 3: 选择模型"},void 0,!1,void 0,this)},void 0,!1,void 0,this),G$(D1,{marginBottom:1,children:G$(G1,{children:["Provider: ",G$(G1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),G$(sU,{children:[G$(D1,{marginBottom:1,children:[G$(G1,{color:"cyan",children:"> "},void 0,!1,void 0,this),G$(aU,{value:G,onChange:U,placeholder:`搜索 ${J.length} 个模型...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),G$(D1,{marginBottom:1,children:G$(G1,{dimColor:!0,children:"模型元数据来自内置 catalog"},void 0,!1,void 0,this)},void 0,!1,void 0,this),G$(D1,{flexDirection:"column",height:12,children:G$(rU,{items:K,onSelect:(O)=>Z(O.value),indicatorComponent:oU,itemComponent:tU,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),z.length===0&&G$(G1,{color:"yellow",children:"内置 catalog 中没有匹配模型"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)};import{Box as L2,Text as o1}from"ink";import eU from"ink-select-input";import $K from"ink-text-input";import{useMemo as U5,useState as JK}from"react";import{jsxDEV as P$}from"react/jsx-dev-runtime";var YK=({isSelected:$})=>P$(L2,{marginRight:1,children:P$(o1,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),ZK=({isSelected:$,label:J})=>P$(o1,{bold:$,color:$?"yellow":void 0,children:J},void 0,!1,void 0,this),K5=({providers:$,isLoading:J,error:Y,onSelect:X,onCancel:Z})=>{let[Q,G]=JK("");N0((K,O)=>{if(O.escape)if(Q)G("");else Z()});let U=U5(()=>{if(!Q)return $;let K=Q.toLowerCase();return $.filter((O)=>O.name.toLowerCase().includes(K)||O.id.toLowerCase().includes(K))},[$,Q]),z=U5(()=>U.map((K)=>({key:K.id,label:`${K.name} - ${K.modelCount} models${K.configured?" [configured]":""}`,value:K})),[U]);if(J)return P$(L2,{flexDirection:"column",children:P$(o1,{color:"yellow",children:"正在加载 Provider 列表..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Y)return P$(L2,{flexDirection:"column",children:[P$(o1,{color:"red",children:Y},void 0,!1,void 0,this),P$(o1,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return P$(L2,{flexDirection:"column",children:[P$(L2,{marginBottom:1,children:P$(o1,{bold:!0,color:"blue",children:"Step 1: 选择 API 提供商"},void 0,!1,void 0,this)},void 0,!1,void 0,this),P$(L2,{marginBottom:1,children:[P$(o1,{color:"cyan",children:"> "},void 0,!1,void 0,this),P$($K,{value:Q,onChange:G,placeholder:`搜索 ${$.length} 个 Provider...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),P$(L2,{flexDirection:"column",height:12,children:P$(eU,{items:z,onSelect:(K)=>X(K.value),indicatorComponent:YK,itemComponent:ZK,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),U.length===0&&P$(o1,{color:"yellow",children:"未找到匹配的 Provider,按 Esc 清除搜索"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};function z5($){if($==="custom")return"provider";if($==="model")return"provider";if($==="credential")return"model";return}import{jsxDEV as n1}from"react/jsx-dev-runtime";var kJ=({mode:$,initialConfig:J,modelId:Y,onComplete:X,onCancel:Z})=>{let[Q,G]=B2("provider"),[U,z]=B2(),[K,O]=B2(),[q,N]=B2(),[_,H]=B2(""),[W,b]=B2(),[M,w]=B2(!1),B=Z5(),C=X5(U?.id),L=s0(!1);N0((k,T)=>{if(T.ctrl&&k==="c"||T.meta&&k==="c")$==="setup"?L():Z()});let A=IJ(async(k)=>{if(!U)return;let T=q??(K?{provider:U.id,model:K.id,displayName:J?.displayName}:void 0);if(!T)return;w(!0),b(void 0);try{if(T.modelProvider)b1().registerModelProvider(T.provider,T.modelProvider,[T.model]);if(k?.trim())await b1().setApiKey(T.provider,k.trim());let I={displayName:T.displayName,provider:T.provider,model:T.model,overrides:T.overrides};if($==="setup")await X(T);else if($==="add"){let P=T.modelProvider?await z$().addModelWithProvider(I,T.modelProvider):await z$().addModel(I);await z$().setCurrentModel(P.id),await X(T)}else if(Y){if(T.modelProvider)await z$().updateModelWithProvider(Y,I,T.modelProvider);else await z$().updateModel(Y,I);await X(T)}}catch(I){if(T.modelProvider){await b1().credentials.delete(T.provider);let P=a4();b1().configureModelProviders(P?.modelProviders??{},P?.models??[])}b(I instanceof Error?I.message:"保存配置失败"),w(!1)}}),F=IJ((k)=>{if(O(k),U?.configured)A();else if(U?.supportsApiKey)G("credential");else b(`${U?.name??"Provider"} 需要 OAuth 或环境凭证,请先在外部完成认证`)}),R=IJ(()=>{if(b(void 0),Q==="credential"&&q){G("custom");return}let k=z5(Q);if(k)G(k)});return n1(XK,{flexDirection:"column",padding:1,children:[n1(SJ,{bold:!0,color:"blue",children:$==="edit"?"编辑模型":"添加模型"},void 0,!1,void 0,this),Q==="provider"&&n1(K5,{...B,onSelect:(k)=>{z(k),O(void 0),N(void 0),G(k.factoryWireApi?"custom":"model")},onCancel:$==="setup"?()=>{return}:Z},void 0,!1,void 0,this),Q==="custom"&&U?.factoryWireApi&&n1(eZ,{wireApi:U.factoryWireApi,initialConfig:q,onSubmit:(k)=>{N(k),G("credential")},onCancel:R},void 0,!1,void 0,this),Q==="model"&&U&&n1(G5,{provider:U,...C,onSelect:F,onCancel:R},void 0,!1,void 0,this),Q==="credential"&&U&&n1(oZ,{provider:U,value:_,onChange:H,onSubmit:()=>void A(_),onCancel:R,error:W},void 0,!1,void 0,this),M&&n1(SJ,{color:"yellow",children:"正在保存配置..."},void 0,!1,void 0,this),W&&Q!=="credential"&&n1(SJ,{color:"red",children:W},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as A8}from"ahooks";import{promises as N5}from"fs";import{Box as c$,Text as Y$}from"ink";import q5 from"ink-select-input";import QK from"ink-text-input";import GK from"os";import t4 from"path";import{useEffect as UK,useMemo as s4,useRef as KK,useState as t1}from"react";import{jsxDEV as y0}from"react/jsx-dev-runtime";var b8=[{key:"allow",label:"Allow"},{key:"ask",label:"Ask"},{key:"deny",label:"Deny"},{key:"info",label:"Info"}],zK={allow:"Add a new rule...",ask:"Add a new rule...",deny:"Add a new rule..."},qK={allow:"Allow permission rules",ask:"Ask permission rules",deny:"Deny permission rules"},_5={project:"[项目共享配置]",global:"[用户全局配置]",local:"[本地配置]"},_K=["project","global","local"],OK={allow:[],ask:[],deny:[]},NK={localExists:!1,projectExists:!1,globalExists:!1},O5={allow:[],ask:[],deny:[]};function WK($){let J=(X)=>Array.isArray(X)?X.filter((Z)=>typeof Z==="string"):[],Y=$?.permissions??{};return{allow:J(Y?.allow),ask:J(Y?.ask),deny:J(Y?.deny)}}async function HK($){try{let J=await N5.readFile($,"utf-8"),Y=JSON.parse(J);return{exists:!0,raw:Y,permissions:WK(Y)}}catch(J){if(J.code==="ENOENT")return{exists:!1,raw:{},permissions:{...O5}};return console.warn(`[PermissionsManager] Failed to read ${$}:`,J),{exists:!0,raw:{},permissions:{...O5}}}}function FK($,J){let Y=$.padEnd(32," "),X=J==="local"?`${_5[J]} <- 可删除`:_5[J];return`${Y} ${X}`}var W5=({onClose:$})=>{let Y=X$()==="permissions-manager",X=s0(!1),[Z,Q]=t1(0),G=b8[Z].key,[U,z]=t1(OK),[K,O]=t1(NK),[q,N]=t1(!0),[_,H]=t1("list"),[W,b]=t1(""),[M,w]=t1(null),[B,C]=t1(null),L=KK(!1),A=s4(()=>t4.join(K$(),".blade","settings.local.json"),[]),F=s4(()=>t4.join(K$(),".blade","settings.json"),[]),R=s4(()=>t4.join(GK.homedir(),".blade","settings.json"),[]),k=A8(async()=>{N(!0);let c=await Promise.all([{source:"local",path:A},{source:"project",path:F},{source:"global",path:R}].map(async({source:F0,path:T0})=>{let y=await HK(T0);return{source:F0,path:T0,...y}})),d={localExists:c.find((F0)=>F0.source==="local")?.exists??!1,projectExists:c.find((F0)=>F0.source==="project")?.exists??!1,globalExists:c.find((F0)=>F0.source==="global")?.exists??!1};O(d);let a={allow:[],ask:[],deny:[]},W0=Object.fromEntries(c.map((F0)=>[F0.source,F0]));["allow","ask","deny"].forEach((F0)=>{_K.forEach((T0)=>{(W0[T0]?.permissions[F0]??[]).forEach((D,p)=>{let V={key:`${T0}:${p}:${D}`,rule:D,source:T0};a[F0].push(V)})})}),z(a),N(!1)});UK(()=>{k()},[k]);let T=A8(async(Y0,c)=>{try{let d=t4.join(K$(),".blade","settings.local.json"),a={allow:[],ask:[],deny:[]};try{let F0=await N5.readFile(d,"utf-8"),y=JSON.parse(F0).permissions||{};a={allow:Array.isArray(y.allow)?y.allow:[],ask:Array.isArray(y.ask)?y.ask:[],deny:Array.isArray(y.deny)?y.deny:[]}}catch(F0){}let W0=c(a);await z$().updateConfig({permissions:W0},{scope:"local",immediate:!0}),await k()}catch(d){throw console.error("[PermissionsManager] 修改权限规则失败:",d),d}});N0((Y0,c)=>{if(c.ctrl&&Y0==="c"||c.meta&&Y0==="c"){X();return}if(_==="locked"){if(L.current){L.current=!1;return}H("list"),w(null),C(null);return}if(c.escape){if(_==="list"||G==="info")$();else H("list"),b(""),w(null),C(null);return}if(_==="list"){if(c.tab&&c.shift)Q((d)=>(d-1+b8.length)%b8.length);else if(c.tab)Q((d)=>(d+1)%b8.length);else if(Y0?.toLowerCase()==="q")$()}},{isActive:Y});let I=A8((Y0)=>{let c=Y0.value;if(G==="info")return;if(c.type==="add"){H("add"),b(""),C(null);return}if(c.entry.source!=="local"){H("locked"),L.current=!0,w({tab:G,entry:c.entry}),C({type:"error",text:c.entry.source==="project"?"此规则定义在项目共享配置中,无法在此删除。":"此规则来自用户全局配置,无法在此删除。"});return}H("confirm-delete"),w({tab:G,entry:c.entry}),C(null)}),P=A8(async()=>{if(G==="info")return;let Y0=W.trim();if(!Y0){C({type:"error",text:"Permission rule 不能为空"});return}if(U[G].map((d)=>d.rule).includes(Y0)){C({type:"error",text:"该规则已存在"});return}try{await T(G,(d)=>{let a={allow:[...d.allow],ask:[...d.ask],deny:[...d.deny]};return a[G]=[...new Set([...d[G],Y0])],a}),H("list"),b(""),C({type:"success",text:"已添加本地权限规则"})}catch(d){C({type:"error",text:`保存失败: ${d instanceof Error?d.message:"未知错误"}`})}}),j=A8(async()=>{if(!M)return;let{tab:Y0,entry:c}=M;try{await T(Y0,(d)=>{let a={allow:[...d.allow],ask:[...d.ask],deny:[...d.deny]};return a[Y0]=d[Y0].filter((W0)=>W0!==c.rule),a}),H("list"),w(null),C({type:"success",text:"已删除本地权限规则"})}catch(d){C({type:"error",text:`删除失败: ${d instanceof Error?d.message:"未知错误"}`})}}),o=s4(()=>{if(G==="info")return[];let Y0=G;return[{key:"add-new-rule",label:`› ${zK[Y0]}`,value:{type:"add"}},...U[Y0].map((d)=>({key:d.key,label:FK(d.rule,d.source),value:{type:"rule",entry:d}}))]},[G,U]),u=()=>y0(c$,{marginBottom:1,children:b8.map((Y0,c)=>y0(c$,{marginRight:2,children:y0(Y$,{color:c===Z?"yellow":"gray",children:["[",Y0.label,"]"]},void 0,!0,void 0,this)},Y0.key,!1,void 0,this))},void 0,!1,void 0,this),Z0=()=>y0(c$,{flexDirection:"column",gap:1,children:[y0(Y$,{children:"配置文件优先级(从高到低):"},void 0,!1,void 0,this),y0(c$,{flexDirection:"column",marginLeft:2,children:[y0(Y$,{children:["1. .blade/settings.local.json (本地配置,不提交 Git)"," ",K.localExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),y0(Y$,{children:["2. .blade/settings.json (项目配置,提交 Git)"," ",K.projectExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),y0(Y$,{children:["3. ~/.blade/settings.json (用户全局配置)"," ",K.globalExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),y0(Y$,{children:"说明:"},void 0,!1,void 0,this),y0(c$,{flexDirection:"column",marginLeft:2,children:[y0(Y$,{children:"- /permissions 命令只管理本地配置 (.blade/settings.local.json)"},void 0,!1,void 0,this),y0(Y$,{children:"- 修改全局或项目配置请直接编辑对应文件"},void 0,!1,void 0,this),y0(Y$,{children:"- 本地配置不会提交到 Git"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),z0=(Y0)=>y0(c$,{flexDirection:"column",gap:1,children:[y0(Y$,{bold:!0,children:qK[Y0]},void 0,!1,void 0,this),y0(Y$,{children:"Permission rules are a tool name, optionally followed by a specifier in parentheses."},void 0,!1,void 0,this),y0(Y$,{color:"gray",children:"例如: WebFetch 或 Bash(ls:*)"},void 0,!1,void 0,this),y0(c$,{marginTop:1,children:y0(QK,{value:W,onChange:b,onSubmit:P},void 0,!1,void 0,this)},void 0,!1,void 0,this),y0(Y$,{color:"gray",children:"Enter 提交 · Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),J0=(Y0,c)=>y0(c$,{flexDirection:"column",gap:1,children:[y0(Y$,{bold:!0,children:["Delete ",Y0," permission rule?"]},void 0,!0,void 0,this),y0(Y$,{children:c.rule},void 0,!1,void 0,this),y0(Y$,{color:"gray",children:"From project local settings"},void 0,!1,void 0,this),y0(Y$,{children:"Are you sure you want to delete this permission rule?"},void 0,!1,void 0,this),y0(q5,{items:[{label:"Yes",value:"yes"},{label:"No",value:"no"}],onSelect:(d)=>{if(d.value==="yes")j();else H("list"),w(null)}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),f=(Y0)=>y0(c$,{flexDirection:"column",gap:1,children:[y0(Y$,{bold:!0,children:"Cannot delete this rule"},void 0,!1,void 0,this),y0(Y$,{children:Y0.rule},void 0,!1,void 0,this),y0(Y$,{color:"gray",children:Y0.source==="project"?"This rule is defined in .blade/settings.json. 请手动编辑该文件以移除规则。":"This rule is defined in ~/.blade/settings.json. 请手动编辑该文件以移除规则。"},void 0,!1,void 0,this),y0(Y$,{color:"gray",children:"按任意键继续"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E=(Y0)=>y0(q5,{items:o,isFocused:_==="list",onSelect:I},void 0,!1,void 0,this),m=()=>{if(q)return y0(Y$,{children:"加载中..."},void 0,!1,void 0,this);if(G==="info")return Z0();if(_==="add")return z0(G);if(_==="confirm-delete"&&M)return J0(M.tab,M.entry);if(_==="locked"&&M)return f(M.entry);return E(G)};return y0(c$,{flexDirection:"column",borderStyle:"round",borderColor:Y?"cyan":"gray",padding:1,width:80,children:[y0(Y$,{color:"cyan",bold:!0,children:"权限管理器"},void 0,!1,void 0,this),u(),y0(c$,{flexDirection:"column",gap:1,children:m()},void 0,!1,void 0,this),B&&y0(c$,{marginTop:1,children:y0(Y$,{color:B.type==="success"?"green":"red",children:B.text},void 0,!1,void 0,this)},void 0,!1,void 0,this),y0(c$,{marginTop:1,children:y0(Y$,{color:"gray",children:"Tab 切换视图 · Esc 关闭 · Q 退出"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{Box as x0,Text as A0}from"ink";import{useEffect as LK,useState as w2}from"react";import{jsxDEV as s}from"react/jsx-dev-runtime";var DJ=["local","project","global"];function A5({workspaceRoot:$,onCancel:J}){let Y=X$()==="plugins-manager",X=F5($),Z=X.getAll(),[Q,G]=w2(0),[U,z]=w2(!1),[K,O]=w2(""),[q,N]=w2(null),[_,H]=w2("local"),[W,b]=w2(null),[M,w]=w2(0),B=X.getBySource(),C=X.getStats(),L=X.getSourcePolicy(),A=s0(!1,J);LK(()=>{let P=!0;return H5.getInstance().loadWorkspacePluginSettingsResolution(X.getWorkspaceRoot()).then((j)=>{if(P)b(j.settings)}).catch((j)=>{if(P)O(j instanceof Error?j.message:"无法读取插件作用域配置")}),()=>{P=!1}},[X,M]);let F=()=>{H((P)=>{let j=DJ.indexOf(P);return DJ[(j+1)%DJ.length]}),N(null)},R=async()=>{let P=Z[Q];if(!P||U)return;if(P.source==="cli"){O(`${P.manifest.name} 由 --plugin-dir 管理,不能持久化切换`);return}if(P.status==="error"){O(P.error??`${P.manifest.name} 当前不可用`);return}z(!0),O("");try{let j=await L5(X.getWorkspaceRoot(),P.manifest.name,P.status!=="active",_);O(j.effectiveEnabled?`已启用 ${P.manifest.name} · 生效层级 ${j.effectiveScope}`:`已禁用 ${P.manifest.name} · 生效层级 ${j.effectiveScope}`),w((o)=>o+1)}catch(j){O(j instanceof Error?j.message:String(j))}finally{z(!1)}},k=async()=>{if(U)return;z(!0),O("");try{await B5(X.getWorkspaceRoot()),G(0),O("插件列表已刷新"),w((P)=>P+1)}catch(P){O(P instanceof Error?P.message:String(P))}finally{z(!1)}},T=async()=>{let P=Z[Q];if(!P||U)return;if(!P.installation){O(`${P.manifest.name} 不是 Blade 受管安装,不能自动更新`);return}z(!0),N(null),O("");try{let{result:j}=await w5(X.getWorkspaceRoot(),P.manifest.name,{trusted:!0});if(!j.success)throw Error(j.error);O(j.changed?`已更新 ${P.manifest.name} 到 ${j.installation?.revision}`:`${P.manifest.name} 已是最新版本`),w((o)=>o+1)}catch(j){O(j instanceof Error?j.message:String(j))}finally{z(!1)}},I=async()=>{let P=Z[Q];if(!P||U)return;if(!P.installation){O(`${P.manifest.name} 不是 Blade 受管安装,不能自动卸载`);return}if(q!==P.manifest.name){N(P.manifest.name),O(`再次按 x 确认卸载 ${P.manifest.name}`);return}z(!0),O("");try{let{result:j}=await P5(X.getWorkspaceRoot(),P.manifest.name,!0);if(!j.success)throw Error(j.error);N(null),G(0),O(`已卸载 ${P.manifest.name}`),w((o)=>o+1)}catch(j){O(j instanceof Error?j.message:String(j))}finally{z(!1)}};if(N0((P,j)=>{if(j.escape)J?.();else if(j.ctrl&&P==="c"||j.meta&&P==="c")A();else if((j.upArrow||P==="k")&&Z.length>0)N(null),G((o)=>(o-1+Z.length)%Z.length);else if((j.downArrow||P==="j")&&Z.length>0)N(null),G((o)=>(o+1)%Z.length);else if(P===" "||j.return)R();else if(P==="r")k();else if(P==="s")F();else if(P==="u")T();else if(P==="x")I()},{isActive:Y}),Z.length===0)return s(x0,{flexDirection:"column",paddingY:1,children:[s(x0,{marginBottom:1,children:s(A0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),s(x0,{paddingLeft:2,children:s(A0,{color:"gray",children:"没有已加载的插件"},void 0,!1,void 0,this)},void 0,!1,void 0,this),s(x0,{marginTop:1,paddingLeft:2,flexDirection:"column",children:[s(A0,{color:"gray",children:"插件目录位置:"},void 0,!1,void 0,this),s(A0,{color:"gray",dimColor:!0,children:[" ","• ~/.blade/plugins/ - 用户级插件"]},void 0,!0,void 0,this),s(A0,{color:"gray",dimColor:!0,children:[" ","• .blade/plugins/ - 项目级插件"]},void 0,!0,void 0,this),s(A0,{color:"gray",dimColor:!0,children:[" ","• --plugin-dir - CLI 指定的插件"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),s(x0,{marginTop:1,paddingLeft:2,children:s(A0,{color:"gray",children:"使用 /plugins install <url> 安装新插件"},void 0,!1,void 0,this)},void 0,!1,void 0,this),s(x0,{marginTop:1,children:s(A0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return s(x0,{flexDirection:"column",paddingY:1,children:[s(x0,{marginBottom:1,children:[s(A0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this),s(A0,{color:"gray",children:[" (共 ",C.total," 个插件)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),s(x0,{paddingLeft:2,marginBottom:1,children:s(A0,{color:"gray",children:["启用: ",C.active," | 禁用: ",C.inactive," | 命令: ",C.commands," | 技能:"," ",C.skills," | 代理: ",C.agents]},void 0,!0,void 0,this)},void 0,!1,void 0,this),s(x0,{paddingLeft:2,marginBottom:1,children:s(A0,{color:"gray",children:["来源策略: ",L.restrictToAllowedSources?"restricted":"open"," | Git SHA: ",L.requireGitCommitSha?"required":"optional"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),s(x0,{paddingLeft:2,marginBottom:1,children:s(A0,{color:"gray",children:["写入层级: ",s(A0,{color:"cyan",children:_},void 0,!1,void 0,this)," · 按 s 切换"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),B.cli.length>0&&s(x0,{flexDirection:"column",marginBottom:1,children:[s(x0,{paddingLeft:1,children:[s(A0,{bold:!0,color:"magenta",children:"CLI 指定"},void 0,!1,void 0,this),s(A0,{color:"gray",children:" (--plugin-dir)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),B.cli.map((P)=>{let j=P.status==="active"?"[on]":"[off]",o=Z.indexOf(P)===Q;return s(x0,{flexDirection:"column",paddingLeft:2,children:[s(A0,{children:[s(A0,{bold:!0,color:o?"cyan":"green",children:[o?"› ":" ",j," ",P.manifest.name]},void 0,!0,void 0,this),s(A0,{color:"gray",children:[" v",P.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),s(x0,{paddingLeft:2,children:s(A0,{color:"gray",children:P.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),s(x0,{paddingLeft:2,children:s(A0,{color:"gray",dimColor:!0,children:"生效层级: invocation"},void 0,!1,void 0,this)},void 0,!1,void 0,this),P.commands.length>0&&s(x0,{paddingLeft:2,children:s(A0,{color:"blue",children:["命令:"," ",P.commands.map((u)=>`/${u.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},P.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),B.project.length>0&&s(x0,{flexDirection:"column",marginBottom:1,children:[s(x0,{paddingLeft:1,children:[s(A0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),s(A0,{color:"gray",children:" (.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),B.project.map((P)=>{let j=P.status==="active"?"[on]":"[off]",o=Z.indexOf(P)===Q;return s(x0,{flexDirection:"column",paddingLeft:2,children:[s(A0,{children:[s(A0,{bold:!0,color:o?"cyan":"green",children:[o?"› ":" ",j," ",P.manifest.name]},void 0,!0,void 0,this),s(A0,{color:"gray",children:[" v",P.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),s(x0,{paddingLeft:2,children:s(A0,{color:"gray",children:P.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),s(x0,{paddingLeft:2,children:s(A0,{color:"gray",dimColor:!0,children:["生效层级:"," ",W?.[P.manifest.name]?.effectiveScope??"default"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),P.commands.length>0&&s(x0,{paddingLeft:2,children:s(A0,{color:"blue",children:["命令:"," ",P.commands.map((u)=>`/${u.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},P.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),B.user.length>0&&s(x0,{flexDirection:"column",marginBottom:1,children:[s(x0,{paddingLeft:1,children:[s(A0,{bold:!0,color:"cyan",children:"用户级"},void 0,!1,void 0,this),s(A0,{color:"gray",children:" (~/.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),B.user.map((P)=>{let j=P.status==="active"?"[on]":"[off]",o=Z.indexOf(P)===Q;return s(x0,{flexDirection:"column",paddingLeft:2,children:[s(A0,{children:[s(A0,{bold:!0,color:o?"cyan":"green",children:[o?"› ":" ",j," ",P.manifest.name]},void 0,!0,void 0,this),s(A0,{color:"gray",children:[" v",P.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),s(x0,{paddingLeft:2,children:s(A0,{color:"gray",children:P.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),s(x0,{paddingLeft:2,children:s(A0,{color:"gray",dimColor:!0,children:["生效层级:"," ",W?.[P.manifest.name]?.effectiveScope??"default"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),P.commands.length>0&&s(x0,{paddingLeft:2,children:s(A0,{color:"blue",children:["命令:"," ",P.commands.map((u)=>`/${u.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},P.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),s(x0,{marginTop:1,paddingLeft:2,flexDirection:"column",children:[s(A0,{color:"gray",children:"可用命令:"},void 0,!1,void 0,this),s(A0,{color:"gray",dimColor:!0,children:[" ","• /plugins list - 列出所有插件"]},void 0,!0,void 0,this),s(A0,{color:"gray",dimColor:!0,children:[" ","• /plugins info <name> - 显示插件详情"]},void 0,!0,void 0,this),s(A0,{color:"gray",dimColor:!0,children:[" ","• /plugins install <url> - 安装插件"]},void 0,!0,void 0,this),s(A0,{color:"gray",dimColor:!0,children:[" ","• /plugins enable/disable <name> - 启用/禁用插件"]},void 0,!0,void 0,this),s(A0,{color:"gray",dimColor:!0,children:[" ","• /plugins policy show|set - 来源与 SHA 策略"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),s(x0,{marginTop:1,children:s(A0,{dimColor:!0,children:"↑/↓ 选择 · Space/Enter 启停 · s 切换层级 · u 信任并更新 · x 卸载 · r 刷新 · ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),K&&s(x0,{marginTop:1,children:s(A0,{color:K.includes("失败")?"red":"cyan",children:K},void 0,!1,void 0,this)},void 0,!1,void 0,this),U&&s(A0,{color:"gray",children:"处理中..."},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import{Box as M$,Text as T$,useStdout as BK}from"ink";import wK from"ink-text-input";import fJ,{useCallback as M8,useMemo as PK,useState as s1}from"react";import{jsxDEV as V0}from"react/jsx-dev-runtime";var AK=fJ.memo(({option:$,index:J,isSelected:Y,isMultiSelect:X,isHighlighted:Z})=>V0(M$,{flexDirection:"column",marginBottom:1,children:[V0(T$,{color:Z?"yellow":Y?"green":void 0,bold:Z,children:[X?Y?"(*) ":"( ) ":Z?"> ":" ",J+1,". ",$.label]},void 0,!0,void 0,this),V0(M$,{marginLeft:4,children:V0(T$,{color:"gray",children:$.description},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)),bK=fJ.memo(({questions:$,answers:J})=>V0(M$,{flexDirection:"column",marginBottom:1,children:$.map((Y)=>{let X=J[Y.header],Z=Array.isArray(X)?X.join(", "):X||"(no answer)";return V0(M$,{marginBottom:1,children:[V0(T$,{backgroundColor:"blue",color:"white",children:[" ",Y.header," "]},void 0,!0,void 0,this),V0(T$,{color:"green",children:[" ",Z]},void 0,!0,void 0,this)]},Y.header,!0,void 0,this)})},void 0,!1,void 0,this)),b5=fJ.memo(({questions:$,onComplete:J,onCancel:Y})=>{let{stdout:X}=BK(),Z=X.columns||80,G=X$()==="confirmation-prompt",U=s0(!1),[z,K]=s1("answering"),[O,q]=s1(0),[N,_]=s1({}),[H,W]=s1(0),[b,M]=s1([]),[w,B]=s1(!1),[C,L]=s1(""),[A,F]=s1(0),R=$[O],k=PK(()=>{if(!R)return[];return[...R.options.map((u)=>({label:u.label,value:u.label,description:u.description})),{label:"Type something...",value:"__other__",description:"Enter custom response"}]},[R]),T=M8((u)=>{let Z0={...N,[R.header]:u};if(_(Z0),O<$.length-1)q(O+1),W(0),M([]),B(!1),L("");else K("submit"),F(0)},[N,R?.header,O,$.length]),I=M8((u)=>{let Z0=k[u];if(!Z0)return;if(Z0.value==="__other__"){B(!0);return}if(R.multiSelect)M((z0)=>z0.includes(Z0.value)?z0.filter((J0)=>J0!==Z0.value):[...z0,Z0.value]);else T(Z0.value)},[k,R?.multiSelect,T]),P=M8((u)=>{if(u.trim())T(u.trim())},[T]),j=M8(()=>{K("answering"),q(0),W(0),M([]),B(!1)},[]),o=M8(()=>{J(N)},[N,J]);if(N0((u,Z0)=>{if(Z0.ctrl&&u==="c"||Z0.meta&&u==="c"){U();return}if(w){if(Z0.escape)B(!1),L("");return}if(Z0.escape){Y();return}let z0=parseInt(u);if(z0>=1&&z0<=k.length){I(z0-1);return}if(Z0.upArrow){W((J0)=>J0>0?J0-1:k.length-1);return}if(Z0.downArrow||Z0.tab){W((J0)=>J0<k.length-1?J0+1:0);return}if(Z0.return){if(R.multiSelect&&b.length>0)T(b);else I(H);return}if(u===" "&&R.multiSelect){let J0=k[H];if(J0&&J0.value!=="__other__")M((f)=>f.includes(J0.value)?f.filter((E)=>E!==J0.value):[...f,J0.value]);return}},{isActive:G&&z==="answering"&&!w}),N0((u,Z0)=>{if(Z0.ctrl&&u==="c"||Z0.meta&&u==="c"){U();return}if(Z0.escape){Y();return}if(Z0.upArrow||Z0.downArrow||Z0.tab){F((z0)=>z0===0?1:0);return}if(Z0.return){if(A===0)o();else j();return}if(u.toLowerCase()==="y"){o();return}if(u.toLowerCase()==="e"){j();return}},{isActive:G&&z==="submit"}),z==="submit")return V0(M$,{flexDirection:"column",borderStyle:"round",borderColor:G?"green":"gray",padding:1,width:Math.min(Z-4,80),children:[V0(M$,{marginBottom:1,children:V0(T$,{bold:!0,color:"green",children:"[OK] Review Your Answers"},void 0,!1,void 0,this)},void 0,!1,void 0,this),V0(bK,{questions:$,answers:N},void 0,!1,void 0,this),V0(M$,{flexDirection:"column",marginTop:1,children:[V0(T$,{color:A===0?"yellow":void 0,bold:A===0,children:[A===0?"> ":" ","[Y] Submit answers"]},void 0,!0,void 0,this),V0(T$,{color:A===1?"yellow":void 0,bold:A===1,children:[A===1?"> ":" ","[E] Edit answers"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),V0(M$,{marginTop:1,children:V0(T$,{color:"gray",children:"Enter to confirm · Up/Down to navigate · Y/E for quick select"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(!R)return null;return V0(M$,{flexDirection:"column",borderStyle:"round",borderColor:G?"cyan":"gray",padding:1,width:Math.min(Z-4,80),children:[V0(M$,{marginBottom:1,children:[V0(T$,{backgroundColor:"blue",color:"white",children:[" ",R.header," "]},void 0,!0,void 0,this),V0(T$,{children:[" ",R.question]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),w?V0(M$,{flexDirection:"column",marginTop:1,children:[V0(T$,{color:"yellow",children:"Enter your response:"},void 0,!1,void 0,this),V0(M$,{marginTop:1,children:[V0(T$,{color:"cyan",children:"> "},void 0,!1,void 0,this),V0(wK,{value:C,onChange:L,onSubmit:P,focus:G},void 0,!1,void 0,this)]},void 0,!0,void 0,this),V0(M$,{marginTop:1,children:V0(T$,{color:"gray",children:"(Press Enter to submit, ESC to go back)"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this):V0(M$,{flexDirection:"column",children:k.map((u,Z0)=>V0(AK,{option:u,index:Z0,isSelected:b.includes(u.value),isMultiSelect:R.multiSelect,isHighlighted:H===Z0},u.value,!1,void 0,this))},void 0,!1,void 0,this),!w&&V0(M$,{marginTop:1,flexDirection:"column",children:[V0(T$,{color:"gray",children:R.multiSelect?"Space to toggle · Enter to confirm · 1-9 for quick select":"Enter to select · Up/Down or Tab to navigate · 1-9 for quick select"},void 0,!1,void 0,this),R.multiSelect&&b.length>0&&V0(T$,{color:"green",children:["Selected: ",b.join(", ")]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$.length>1&&V0(M$,{marginTop:1,children:V0(T$,{color:"gray",children:["Question ",O+1," of ",$.length]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as jJ,Text as f1,useStdout as kK}from"ink";import{useEffect as EJ,useMemo as J6,useRef as P2,useState as A2}from"react";function MK($,J){return[...$,J].join(`
|
|
160
|
-
`).replace(/\n+$/,"")}function T8($){let J=2166136261;for(let Y=0;Y<$.length;Y++)J^=$.charCodeAt(Y),J=Math.imul(J,16777619);return`${$.length}:${(J>>>0).toString(16)}`}function R5({messages:$,currentStreamingMessageId:J,streamingLines:Y,streamingTail:X,currentThinkingContent:Z}){let Q=MK(Y,X),G=[];for(let U of $){let z=U.id===J?Q:U.content,K=U.metadata&&"phase"in U.metadata?String(U.metadata.phase):"",O=U.id===J?Z??U.thinkingContent:U.thinkingContent;if(U.role==="assistant"&&O)G.push({id:`${U.id}:thinking`,messageId:U.id,role:"assistant",kind:"thinking",content:O,revision:`${U.timestamp}:thinking:${T8(O)}`,collapsible:!0});let q=U.role==="tool"&&U.metadata&&"detail"in U.metadata&&typeof U.metadata.detail==="string"&&U.metadata.detail.length>0?U.metadata.detail:void 0;G.push({id:U.id,messageId:U.id,role:U.role,kind:U.role==="tool"?"tool":"message",content:z,detail:q,revision:`${U.timestamp}:${T8(z)}:${T8(q??"")}:${K}`,collapsible:q!==void 0})}if(J&&!G.some((U)=>U.id===J)){if(Z)G.push({id:`${J}:thinking`,messageId:J,role:"assistant",kind:"thinking",content:Z,revision:`stream:thinking:${T8(Z)}`,collapsible:!0});G.push({id:J,messageId:J,role:"assistant",kind:"message",content:Q,revision:`stream:${T8(Q)}`,collapsible:!1})}return G}var M5={user:"> ",assistant:"• ",system:" ",tool:"└ "};function e4($,J,Y){let X=J.text.length>0?J.text.split(`
|
|
161
|
-
`):[""],Z=[];for(let[Q,G]of X.entries()){let U=Z.length===0?J.firstPrefix:J.nextPrefix,z=Math.max(1,Y-U.length),K=u2(G,z,!0),O=0;for(let q of K){let N=q.length>0?G.indexOf(q,O):O,_=N>=0?N:O,H=_+q.length,W=Z.length===0?J.firstPrefix:J.nextPrefix;Z.push({key:`${$.id}:${J.key}:${Q}:${Z.length}`,blockId:$.id,role:$.role,kind:$.kind,text:`${W}${q}`,copyText:q,pending:$.pending===!0,header:J.header&&Z.length===0,sourceLine:J.sourceLineOffset+Q,sourceStart:_,sourceEnd:H,sourceTextOffset:W.length}),O=H}}return Z}function T5($){return $.length===0?0:$.split(`
|
|
162
|
-
`).length}function TK($){let J=$.split(`
|
|
163
|
-
`)[0]?.trim()??"";if(J.length<=48)return J;return`${J.slice(0,45)}...`}function vJ($,J,Y=!1){if($.kind==="thinking"){let X=Y?"[-]":"[+]",Z=TK($.content),Q=`${X} Thinking (${T5($.content)} lines)${!Y&&Z?` - ${Z}`:""}`,G={key:`${$.id}:header`,blockId:$.id,role:$.role,kind:$.kind,text:`? ${Q}`,copyText:Q,pending:$.pending===!0,header:!0,sourceLine:null,sourceStart:0,sourceEnd:0,sourceTextOffset:2};if(!Y)return[G];return[G,...e4($,{text:$.content,firstPrefix:" ",nextPrefix:" ",sourceLineOffset:0,key:"thinking",header:!1},J)]}if($.kind==="tool"&&$.detail){let X=Y?"[-]":"[+]",Z=e4($,{text:$.content,firstPrefix:`${M5.tool}${X} `,nextPrefix:" ",sourceLineOffset:0,key:"summary",header:!0},J);if(!Y)return Z;return[...Z,...e4($,{text:$.detail,firstPrefix:" ",nextPrefix:" ",sourceLineOffset:T5($.content),key:"detail",header:!1},J)]}return e4($,{text:$.content.length>0?$.content:"…",firstPrefix:M5[$.role],nextPrefix:" ",sourceLineOffset:0,key:"content",header:!0},J)}function C5($,J,Y=new Set){return $.flatMap((X,Z)=>{let Q=vJ(X,J,Y.has(X.id));if(Z===$.length-1)return Q;return[...Q,{key:`${X.id}:separator`,blockId:X.id,role:X.role,kind:X.kind,text:"",copyText:"",pending:X.pending===!0,header:!1,sourceLine:null,sourceStart:0,sourceEnd:0,sourceTextOffset:0}]})}function RK($){if($.kind==="tool"&&$.detail)return[...$.content.split(`
|
|
164
|
-
`),...$.detail.split(`
|
|
165
|
-
`)];return $.content.split(`
|
|
166
|
-
`)}function CK($,J){let Y=[];for(let[X,Z]of RK($).entries())for(let Q of Z.matchAll(J)){let G=Q.index,U=Q[0];if(U.length===0)continue;Y.push({blockId:$.id,sourceLine:X,start:G,end:G+U.length})}return Y}class R8{cache=new Map;search($,J){if(J.length===0)return[];let Y=J.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),X=new RegExp(Y,"giu"),Z=new Set($.map((Q)=>Q.id));for(let Q of this.cache.keys())if(!Z.has(Q))this.cache.delete(Q);return $.flatMap((Q)=>{let G=this.cache.get(Q.id);if(G?.revision===Q.revision&&G.query===J)return G.matches;let U=CK(Q,X);return this.cache.set(Q.id,{revision:Q.revision,query:J,matches:U}),U})}}function VJ($,J){let Y=$.findIndex((X)=>X.blockId===J.blockId&&X.sourceLine===J.sourceLine&&J.start>=X.sourceStart&&J.start<Math.max(X.sourceEnd,X.sourceStart+1));if(Y>=0)return Y;return $.findIndex((X)=>X.blockId===J.blockId)}function y5($,J){if($.sourceLine===null||$.sourceEnd<=$.sourceStart)return[];let Y=[];for(let[X,Z]of J.entries()){if(Z.blockId!==$.blockId||Z.sourceLine!==$.sourceLine||Z.end<=$.sourceStart||Z.start>=$.sourceEnd)continue;Y.push({start:$.sourceTextOffset+Math.max($.sourceStart,Z.start)-$.sourceStart,end:$.sourceTextOffset+Math.min($.sourceEnd,Z.end)-$.sourceStart,matchIndex:X})}return Y}function I5($,J,Y){let X=Math.max(0,Math.min(J,Y)),Z=Math.min($.length-1,Math.max(J,Y));if(Z<X)return"";let Q=$.slice(X,Z+1),G="";for(let[U,z]of Q.entries()){if(U===0){G=z.copyText;continue}let K=Q[U-1],O=z.sourceLine!==null&&z.blockId===K.blockId&&z.sourceLine===K.sourceLine;G+=`${O?"":`
|
|
167
|
-
`}${z.copyText}`}return G}function S5($,J){let Y=new Map($.map((X)=>[X.id,X.revision]));return J.filter((X)=>Y.get(X.id)!==X.revision).map((X)=>X.id)}import{spawn as yK}from"node:child_process";function IK($){if($==="darwin")return[{command:"pbcopy",args:[]}];if($==="win32")return[{command:"clip",args:[]}];if($==="linux")return[{command:"wl-copy",args:[]},{command:"xclip",args:["-selection","clipboard"]},{command:"xsel",args:["--clipboard","--input"]}];return[]}function SK($,J,Y){return new Promise((X)=>{let Z=!1,Q=yK($,[...J],{stdio:["pipe","ignore","ignore"]}),G=setTimeout(()=>{if(Z)return;Z=!0,Q.kill("SIGKILL"),X(!1)},2000),U=(z)=>{if(Z)return;Z=!0,clearTimeout(G),X(z)};Q.once("error",()=>U(!1)),Q.once("close",(z)=>U(z===0)),Q.stdin.once("error",()=>U(!1)),Q.stdin.end(Y)})}function k5($,J=!1){let Y=`\x1B]52;c;${Buffer.from($,"utf8").toString("base64")}\x07`;if(!J)return Y;return`\x1BPtmux;${Y.replaceAll("\x1B","\x1B\x1B")}\x1B\\`}async function $6($,J={}){if($.length===0)return{success:!1};let Y=J.platform??process.platform,X=J.env??process.env,Z=J.runCommand??SK,Q=J.writeTerminal??((z)=>process.stdout.write(z)),G=Boolean(X.SSH_CONNECTION),U=async(z)=>{try{return await Z(z.command,z.args,$)}catch{return!1}};if(!G){for(let z of IK(Y))if(await U(z))return{success:!0,method:"native"}}if(X.TMUX){if(await U({command:"tmux",args:["load-buffer","-w","-"]})){try{Q(k5($,!0))}catch{}return{success:!0,method:"tmux"}}}try{return Q(k5($)),{success:!0,method:"osc52"}}catch{return{success:!1}}}import{jsxDEV as s$}from"react/jsx-dev-runtime";function DK($){return $.map((J)=>({id:J.id,messageId:J.id,role:J.role,kind:"message",content:J.content,revision:`${J.timestamp}:${J.content.length}:${J.truncated===!0}`,collapsible:!1}))}function fK($,J,Y){let X=Array.from($.value);if(Y.backspace||Y.delete){if($.cursor===0)return $;return X.splice($.cursor-1,1),{value:X.join(""),cursor:$.cursor-1}}if(Y.leftArrow)return{...$,cursor:Math.max(0,$.cursor-1)};if(Y.rightArrow)return{...$,cursor:Math.min(X.length,$.cursor+1)};if(!J||Y.ctrl||Y.meta)return $;return X.splice($.cursor,0,...Array.from(J)),{value:X.join(""),cursor:$.cursor+Array.from(J).length}}var D5=({state:$,onLoadOlder:J,onFork:Y,onClose:X})=>{let Z=X$(),{width:Q,height:G}=d1(),{stdout:U}=kK(),z=Math.max(20,Q-4),K=Math.max(1,G-8),O=J6(()=>DK($.messages),[$.messages]),q=J6(()=>C5(O,z),[O,z]),N=Math.max(0,q.length-K),[_,H]=A2(0),W=P2(0),[b,M]=A2(()=>Math.max(0,q.length-1)),w=P2(b),B=P2(q.at(-1)?.key??null),[C,L]=A2(!1),A=P2(!1),[F,R]=A2({value:"",cursor:0}),k=P2(F),[T,I]=A2(""),[P,j]=A2(0),o=P2(new R8),u=P2(null),[Z0,z0]=A2(null),J0=J6(()=>$.session?{viewGeneration:$.viewGeneration,locator:$.session.locator,snapshot:$.snapshot,olderCursor:$.olderCursor}:void 0,[$.olderCursor,$.session,$.snapshot,$.viewGeneration]);W.current=_,w.current=b,A.current=C,k.current=F;let f=J6(()=>o.current.search(O,T),[O,T]);EJ(()=>{u.current=null},[$.olderCursor]),EJ(()=>{if($.status==="error")u.current=null},[$.status]),EJ(()=>{let V=B.current?q.findIndex((Q0)=>Q0.key===B.current):-1,n=q.length===0?0:V>=0?V:q.length-1;w.current=n,B.current=q[n]?.key??null,M(n);let O0=Math.max(0,Math.min(W.current,N));W.current=O0,H(O0)},[q,N]);let E=()=>{let V=$.olderCursor;if(!V||!J0||!$.session?.capabilities.history.read||$.status!=="ready"&&$.status!=="error")return;if(u.current===V)return;u.current=V,J(J0)},m=(V,n=!0)=>{let O0=Math.max(0,Math.min(N,V));W.current=O0,H(O0);let Q0=Math.max(1,q.length-O0),R0=Math.max(0,Q0-K),U0=Math.max(R0,Math.min(Q0-1,w.current));if(w.current=U0,B.current=q[U0]?.key??null,M(U0),n&&O0===N)E()},Y0=(V)=>{if(f.length===0)return;let n=(V%f.length+f.length)%f.length,O0=f[n],Q0=q.findIndex((U0)=>U0.blockId===O0.blockId);if(j(n),Q0<0)return;w.current=Q0,B.current=q[Q0]?.key??null,M(Q0);let R0=Math.max(0,q.length-Math.min(q.length,Q0+1));m(R0,!1)},c=()=>{let V=q[w.current];if(!V)return;$6(V.copyText,{writeTerminal:(n)=>U.write(n)}).then((n)=>{z0(n.success?"Copied":"Copy failed")})};N0((V,n)=>{let O0=n;if(A.current){if(O0.escape)return A.current=!1,L(!1),!0;if(O0.return){let R0=k.current.value;I(R0),A.current=!1,L(!1);let U0=o.current.search(O,R0);if(U0.length>0){let S0=U0[0],X0=q.findIndex((h0)=>h0.blockId===S0.blockId);if(j(0),X0>=0)w.current=X0,B.current=q[X0]?.key??null,M(X0),m(Math.max(0,q.length-Math.min(q.length,X0+1)),!1)}return!0}let Q0=fK(k.current,V,O0);return k.current=Q0,R(Q0),!0}if(O0.escape||V==="q")return X(),!0;if(V==="/"){let Q0={value:T,cursor:Array.from(T).length};return k.current=Q0,R(Q0),A.current=!0,L(!0),!0}if(V==="n"&&f.length>0)return Y0(P+1),!0;if(V==="N"&&f.length>0)return Y0(P-1),!0;if(V==="y")return c(),!0;if(V==="f"){if(J0&&$.session?.capabilities.history.fork&&$.status==="ready")Y(J0);return!0}if(O0.home||V==="g")return w.current=0,B.current=q[0]?.key??null,M(0),m(N),!0;if(O0.end||V==="G")return w.current=Math.max(0,q.length-1),B.current=q[w.current]?.key??null,M(w.current),m(0),!0;if(O0.pageUp)return m(W.current+Math.max(1,K-1)),!0;if(O0.pageDown)return m(W.current-Math.max(1,K-1)),!0;if(O0.upArrow||V==="k")return w.current=Math.max(0,w.current-1),B.current=q[w.current]?.key??null,M(w.current),m(W.current+1),!0;if(O0.downArrow||V==="j")return w.current=Math.min(q.length-1,w.current+1),B.current=q[w.current]?.key??null,M(w.current),m(W.current-1),!0;return!0},{isActive:Z==="session-history-viewer",priority:200});let d=Math.max(0,q.length-_),a=Math.max(0,d-K),W0=q.slice(a,d),F0=T?`/${T} ${f.length>0?`${P+1}/${f.length}`:"0/0"} · loaded pages only`:null,T0=$.session,y=[T0&&!T0.capabilities.history.read?"Older history unavailable":null,T0&&!T0.capabilities.history.fork?"Fork unavailable":null].filter((V)=>V!==null).join(" · "),D=$.status==="loading"?"Loading Session history…":$.status==="forking"?"Forking Session history…":$.status==="loading-older"?"Loading older history…":null,p=$.error?.message??D??Z0??F0??(y||`${$.status==="loading-older"?"Loading older history… · ":""}/ search · y copy · f fork · Esc close`);return s$(jJ,{flexDirection:"column",width:"100%",height:G,paddingX:2,children:[s$(jJ,{justifyContent:"space-between",children:[s$(f1,{bold:!0,color:"cyan",children:T0?.title?.trim()||"Session history"},void 0,!1,void 0,this),s$(f1,{color:"yellow",children:["Remote · ",T0?.capabilities.connection??"offline"," · History only"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),s$(f1,{dimColor:!0,children:T0?.displayCwd??""},void 0,!1,void 0,this),$.truncated?s$(f1,{color:"yellow",children:"History content was truncated."},void 0,!1,void 0,this):null,s$(jJ,{flexDirection:"column",height:K,children:W0.map((V,n)=>s$(f1,{color:a+n===b?"cyan":void 0,children:V.text},V.key,!1,void 0,this))},void 0,!1,void 0,this),C?s$(f1,{children:["/",F.value]},void 0,!0,void 0,this):null,s$(f1,{color:$.error?"red":"gray",children:p},void 0,!1,void 0,this),s$(f1,{dimColor:!0,children:"Open this Session from its ACP owner to continue."},void 0,!1,void 0,this),s$(f1,{dimColor:!0,children:"Files and terminal are unavailable in history-only mode."},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{Box as y8,Text as U1}from"ink";import vK from"ink-select-input";import{useEffect as f5,useMemo as b2,useRef as v5,useState as V5}from"react";import{jsxDEV as A$}from"react/jsx-dev-runtime";function VK($){let J=new Date($),X=new Date().getTime()-J.getTime(),Z=Math.floor(X/86400000);if(Z===0)return`今天 ${J.getHours().toString().padStart(2,"0")}:${J.getMinutes().toString().padStart(2,"0")}`;if(Z===1)return"昨天";if(Z<7)return`${Z}天前`;return`${J.getMonth()+1}/${J.getDate()}`}var jK=({isSelected:$})=>A$(y8,{marginRight:1,children:A$(U1,{color:$?"cyan":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),EK=({isSelected:$,label:J})=>A$(U1,{color:$?"cyan":"white",bold:$,children:J},void 0,!1,void 0,this),C8=20,j5=({intent:$,sessions:J,taskAttentionUnreadKeys:Y=[],onSelect:X,onCancel:Z})=>{let[Q,G]=V5(0),[U,z]=V5(!1),K=v5(!1),O=v5(!0);f5(()=>{return O.current=!0,()=>{O.current=!1}},[]);let N=X$()==="session-selector",_=s0(!1);N0((A,F)=>{if(F.ctrl&&A==="c"||F.meta&&A==="c"){_();return}if(K.current)return;if(F.escape&&Z){Z();return}if(F.leftArrow||A==="h"||A==="H"){if(Q>0)G((R)=>R-1);return}if(F.rightArrow||A==="l"||A==="L"){if(Q<M-1)G((R)=>R+1);return}},{isActive:N});let H=b2(()=>Q4(J,$),[$,J]),W=b2(()=>a9($),[$]),b=b2(()=>new Set(Y),[Y]),M=b2(()=>Math.max(1,Math.ceil(H.length/C8)),[H.length]),w=b2(()=>{let A=Q*C8;return H.slice(A,A+C8)},[Q,H]),B=b2(()=>{return w.map((A)=>{let F=VK(A.lastMessageTime);return{key:c1(A),label:r9(A,F,$==="resume"&&b.has(p9(A))),value:A}})},[$,w,b]),C=b2(()=>({start:Q*C8+1,end:Math.min((Q+1)*C8,H.length)}),[Q,H.length]);f5(()=>{G(0)},[H.length]);let L=(A)=>{if(K.current)return;K.current=!0,z(!0);let F=()=>{if(!O.current)return;K.current=!1,z(!1)};Promise.resolve().then(()=>X(A.value)).then(F,F)};if(H.length===0)return A$(y8,{flexDirection:"column",paddingX:2,paddingY:1,children:[A$(U1,{color:"yellow",children:"没有找到历史会话"},void 0,!1,void 0,this),A$(U1,{dimColor:!0,children:[`
|
|
168
|
-
`,"提示: 开始一次对话后,会话历史将保存到 ~/.blade/projects/"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this);return A$(y8,{flexDirection:"column",paddingX:2,paddingY:1,children:[A$(U1,{bold:!0,color:"cyan",children:W.title},void 0,!1,void 0,this),A$(U1,{dimColor:!0,children:[`
|
|
169
|
-
`,W.instructions,`
|
|
170
|
-
`]},void 0,!0,void 0,this),A$(vK,{items:B,onSelect:L,isFocused:N&&!U,indicatorComponent:jK,itemComponent:EK},void 0,!1,void 0,this),U&&A$(U1,{color:"cyan",children:$==="fork"?"Forking…":"Resuming…"},void 0,!1,void 0,this),A$(y8,{marginTop:1,flexDirection:"column",children:[A$(U1,{dimColor:!0,children:["第 ",Q+1,"/",M," 页 · 共 ",H.length," 个会话 · 显示"," ",C.start,"-",C.end]},void 0,!0,void 0,this),M>1&&A$(y8,{marginTop:1,children:[A$(U1,{color:Q>0?"cyan":"gray",children:Q>0?"<< 上一页":" "},void 0,!1,void 0,this),A$(U1,{children:" "},void 0,!1,void 0,this),A$(U1,{color:Q<M-1?"cyan":"gray",children:Q<M-1?"下一页 >>":""},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)};import{Box as E5,Text as I8}from"ink";import hK,{useEffect as gK,useState as mK}from"react";import{jsxDEV as e1}from"react/jsx-dev-runtime";var h5=["|","/","-","\\"],hJ=hK.memo(()=>{let $=E8(),J=D0(),Y=m2(),[X,Z]=mK(0);if(gK(()=>{if($?.status!=="loading"){Z(0);return}let Q=setInterval(()=>{Z((G)=>(G+1)%h5.length)},100);return()=>clearInterval(Q)},[$?.status]),!$)return null;return e1(E5,{flexDirection:"column",borderStyle:"single",borderColor:J.colors.info,marginX:2,marginBottom:1,paddingX:1,children:[e1(E5,{children:[e1(I8,{bold:!0,color:J.colors.info,children:"BTW"},void 0,!1,void 0,this),e1(I8,{color:J.colors.muted,children:[" | ",$.question]},void 0,!0,void 0,this),$.durationMs!==void 0&&e1(I8,{color:J.colors.muted,dimColor:!0,children:[" ","| ",$.durationMs,"ms"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$.status==="loading"&&e1(I8,{color:J.colors.text.secondary,children:[h5[X]," Answering..."]},void 0,!0,void 0,this),$.status==="error"&&e1(I8,{color:J.colors.error,children:$.error??"Side conversation failed"},void 0,!1,void 0,this),$.status==="completed"&&$.response&&e1(C1,{content:$.response,role:"assistant",terminalWidth:Math.max(20,Y-8),hidePrefix:!0,noMargin:!0,messageId:`side-conversation-${$.requestId}`},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});hJ.displayName="SideConversationPanel";import{Box as _$,Text as t0}from"ink";import{jsxDEV as B0}from"react/jsx-dev-runtime";function m5({onCancel:$}){let J=q1(),Y=X$()==="skills-manager",Z=g5({cwd:J}).getAll(),Q=Z.filter((K)=>K.source==="builtin"),G=Z.filter((K)=>K.source==="user"),U=Z.filter((K)=>K.source==="project"),z=s0(!1,$);if(N0((K,O)=>{if(O.escape)$?.();else if(O.ctrl&&K==="c"||O.meta&&K==="c")z()},{isActive:Y}),Z.length===0)return B0(_$,{flexDirection:"column",paddingY:1,children:[B0(_$,{marginBottom:1,children:B0(t0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this)},void 0,!1,void 0,this),B0(_$,{paddingLeft:2,children:B0(t0,{color:"gray",children:"没有找到任何 Skill"},void 0,!1,void 0,this)},void 0,!1,void 0,this),B0(_$,{marginTop:1,paddingLeft:2,children:B0(t0,{color:"gray",children:"配置文件位置: ~/.blade/skills/ 或 .blade/skills/"},void 0,!1,void 0,this)},void 0,!1,void 0,this),B0(_$,{marginTop:1,children:B0(t0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return B0(_$,{flexDirection:"column",paddingY:1,children:[B0(_$,{marginBottom:1,children:[B0(t0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this),B0(t0,{color:"gray",children:[" (找到 ",Z.length," 个)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),U.length>0&&B0(_$,{flexDirection:"column",marginBottom:1,children:[B0(_$,{paddingLeft:1,children:[B0(t0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),B0(t0,{color:"gray",children:" (.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),U.map((K)=>{let q=K.description.length>80?`${K.description.substring(0,80)}...`:K.description;return B0(_$,{flexDirection:"column",paddingLeft:2,children:[B0(t0,{children:[B0(t0,{bold:!0,color:"green",children:["• ",K.name]},void 0,!0,void 0,this),B0(t0,{color:"gray",children:[" - ",q]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.allowedTools&&K.allowedTools.length>0&&B0(_$,{paddingLeft:2,children:B0(t0,{color:"gray",children:["工具: ",K.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),B0(_$,{paddingLeft:2,children:B0(t0,{color:"gray",dimColor:!0,children:K.path},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},K.name,!0,void 0,this)})]},void 0,!0,void 0,this),G.length>0&&B0(_$,{flexDirection:"column",marginBottom:1,children:[B0(_$,{paddingLeft:1,children:[B0(t0,{bold:!0,color:"yellow",children:"用户级"},void 0,!1,void 0,this),B0(t0,{color:"gray",children:" (~/.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),G.map((K)=>{let q=K.description.length>80?`${K.description.substring(0,80)}...`:K.description;return B0(_$,{flexDirection:"column",paddingLeft:2,children:[B0(t0,{children:[B0(t0,{bold:!0,color:"green",children:["• ",K.name]},void 0,!0,void 0,this),B0(t0,{color:"gray",children:[" - ",q]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.allowedTools&&K.allowedTools.length>0&&B0(_$,{paddingLeft:2,children:B0(t0,{color:"gray",children:["工具: ",K.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),B0(_$,{paddingLeft:2,children:B0(t0,{color:"gray",dimColor:!0,children:K.path},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},K.name,!0,void 0,this)})]},void 0,!0,void 0,this),Q.length>0&&B0(_$,{flexDirection:"column",marginBottom:1,children:[B0(_$,{paddingLeft:1,children:[B0(t0,{bold:!0,color:"cyan",children:"内置"},void 0,!1,void 0,this),B0(t0,{color:"gray",children:" (builtin)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q.map((K)=>{let q=K.description.length>80?`${K.description.substring(0,80)}...`:K.description;return B0(_$,{flexDirection:"column",paddingLeft:2,children:[B0(t0,{children:[B0(t0,{bold:!0,color:"green",children:["• ",K.name]},void 0,!0,void 0,this),B0(t0,{color:"gray",children:[" - ",q]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.userInvocable&&B0(_$,{paddingLeft:2,children:B0(t0,{color:"blue",children:["命令: /",K.name]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},K.name,!0,void 0,this)})]},void 0,!0,void 0,this),B0(_$,{marginTop:1,children:B0(t0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import{Box as p5,Text as K1}from"ink";import pK,{useEffect as xK,useMemo as cK,useState as x5}from"react";import{jsxDEV as R$,Fragment as gJ}from"react/jsx-dev-runtime";var c5=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"];function uK($){let J=Math.floor($/1000);if(J<60)return`${J}s`;let Y=Math.floor(J/60),X=J%60;return`${Y}m ${X}s`}var u5=pK.memo(()=>{let $=q0((K)=>K.app.subagentProgresses),J=q0((K)=>K.app.subagentProgress),Y=D0(),[X,Z]=x5(0),[Q,G]=x5(()=>Date.now()),U=cK(()=>{let K=Object.values($);return K.length>0?K:J?[J]:[]},[J,$]),z=U.some((K)=>K.status==="running");if(xK(()=>{if(!z){Z(0);return}let K=setInterval(()=>{Z((q)=>(q+1)%c5.length)},80),O=setInterval(()=>{G(Date.now())},1000);return()=>{clearInterval(K),clearInterval(O)}},[z]),U.length===0)return null;return R$(p5,{paddingX:2,paddingY:0,flexDirection:"column",children:U.map((K)=>{let O=K.status==="running"?c5[X]:K.status==="completed"?"[OK]":"[X]",q=K.status==="running"?Y.colors.info:K.status==="completed"?Y.colors.success:Y.colors.error,N=Math.max(0,Q-K.startTime);return R$(p5,{flexDirection:"row",gap:1,children:[R$(K1,{color:q,bold:!0,children:O},void 0,!1,void 0,this),R$(K1,{color:Y.colors.muted,children:"Subagent"},void 0,!1,void 0,this),R$(K1,{color:Y.colors.text.primary,bold:!0,children:K.type},void 0,!1,void 0,this),R$(K1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),R$(K1,{color:Y.colors.text.secondary,children:K.description},void 0,!1,void 0,this),K.currentTool&&R$(gJ,{children:[R$(K1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),R$(K1,{color:Y.colors.warning,children:K.currentTool},void 0,!1,void 0,this)]},void 0,!0,void 0,this),K.status==="running"&&N>0&&R$(gJ,{children:[R$(K1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),R$(K1,{color:Y.colors.info,children:uK(N)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),K.status==="failed"&&K.terminalSummary&&R$(gJ,{children:[R$(K1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),R$(K1,{color:Y.colors.error,children:K.terminalSummary},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},K.id,!0,void 0,this)})},void 0,!1,void 0,this)});import{Box as s2,Text as v1}from"ink";import dK from"react";import{jsxDEV as V$}from"react/jsx-dev-runtime";var mJ={idle:"-",running:">",completed:"[OK]",failed:"[X]",deleted:"[X]",leader:"*",cancelled:"[X]",unknown:"?",pending:"-",blocked:"x"},pJ=dK.memo(()=>{let $=U9().filter((Y)=>Y.status!=="deleted"),J=D0();if($.length===0)return null;return V$(s2,{flexDirection:"column",paddingX:2,children:$.map((Y)=>{let X=Y.tasks.filter((Z)=>Z.status==="completed").length;return V$(s2,{flexDirection:"column",marginBottom:1,children:[V$(s2,{gap:1,children:[V$(v1,{bold:!0,color:Y.status==="failed"?J.colors.error:Y.status==="completed"?J.colors.success:J.colors.info,children:[mJ[Y.status]," Team"]},void 0,!0,void 0,this),V$(v1,{bold:!0,color:J.colors.text.primary,children:Y.name},void 0,!1,void 0,this),V$(v1,{color:J.colors.muted,children:["| ",Y.members.length-1," members | ",X,"/",Y.tasks.length," ","tasks"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),V$(s2,{flexDirection:"column",paddingLeft:2,children:[Y.members.filter((Z)=>Z.status!=="leader").map((Z)=>V$(s2,{gap:1,children:[V$(v1,{color:J.colors.muted,children:mJ[Z.status]},void 0,!1,void 0,this),V$(v1,{color:J.colors.text.secondary,children:Z.name},void 0,!1,void 0,this),V$(v1,{color:J.colors.muted,children:["(",Z.subagentType,", ",Z.status,Z.worktreePath?", worktree":"",")"]},void 0,!0,void 0,this)]},Z.id,!0,void 0,this)),Y.tasks.map((Z)=>V$(s2,{gap:1,children:[V$(v1,{color:J.colors.muted,children:mJ[Z.status]},void 0,!1,void 0,this),V$(v1,{color:J.colors.text.secondary,children:["#",Z.id," ",Z.subject]},void 0,!0,void 0,this),V$(v1,{color:J.colors.muted,children:["(",Z.status,Z.owner?`, ${Z.owner}`:"",")"]},void 0,!0,void 0,this)]},Z.id,!0,void 0,this))]},void 0,!0,void 0,this)]},Y.name,!0,void 0,this)})},void 0,!1,void 0,this)});pJ.displayName="TeamProgress";import{useMemoizedFn as lK}from"ahooks";import{Box as N1,Text as K0}from"ink";import rK from"ink-select-input";import{useState as d5}from"react";import{jsxDEV as $0}from"react/jsx-dev-runtime";var l5=M2.map(($)=>({label:$.label,value:$.id})),aK=({theme:$})=>{let{colors:J}=$;return $0(N1,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[$0(K0,{bold:!0,color:J.text.primary,children:"代码预览"},void 0,!1,void 0,this),$0(K0,{children:" "},void 0,!1,void 0,this),$0(K0,{color:J.syntax.comment,children:"# function"},void 0,!1,void 0,this),$0(K0,{children:[$0(K0,{color:J.syntax.keyword,children:"def"},void 0,!1,void 0,this)," ",$0(K0,{color:J.syntax.function,children:"fibonacci"},void 0,!1,void 0,this),$0(K0,{color:J.text.primary,children:"("},void 0,!1,void 0,this),$0(K0,{color:J.syntax.variable,children:"n"},void 0,!1,void 0,this),$0(K0,{color:J.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(K0,{children:[" ",$0(K0,{color:J.syntax.variable,children:"a"},void 0,!1,void 0,this),$0(K0,{color:J.syntax.operator,children:","},void 0,!1,void 0,this)," ",$0(K0,{color:J.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",$0(K0,{color:J.syntax.operator,children:"="},void 0,!1,void 0,this)," ",$0(K0,{color:J.syntax.number,children:"0"},void 0,!1,void 0,this),$0(K0,{color:J.syntax.operator,children:","},void 0,!1,void 0,this)," ",$0(K0,{color:J.syntax.number,children:"1"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(K0,{children:[" ",$0(K0,{color:J.syntax.keyword,children:"for"},void 0,!1,void 0,this)," ",$0(K0,{color:J.syntax.variable,children:"_"},void 0,!1,void 0,this)," ",$0(K0,{color:J.syntax.keyword,children:"in"},void 0,!1,void 0,this)," ",$0(K0,{color:J.syntax.function,children:"range"},void 0,!1,void 0,this),$0(K0,{color:J.text.primary,children:"("},void 0,!1,void 0,this),$0(K0,{color:J.syntax.variable,children:"n"},void 0,!1,void 0,this),$0(K0,{color:J.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(K0,{children:[" ",$0(K0,{color:J.syntax.variable,children:"a"},void 0,!1,void 0,this),$0(K0,{color:J.syntax.operator,children:","},void 0,!1,void 0,this)," ",$0(K0,{color:J.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",$0(K0,{color:J.syntax.operator,children:"="},void 0,!1,void 0,this)," ",$0(K0,{color:J.syntax.variable,children:"b"},void 0,!1,void 0,this),$0(K0,{color:J.syntax.operator,children:","},void 0,!1,void 0,this)," ",$0(K0,{color:J.syntax.variable,children:"a"},void 0,!1,void 0,this)," ",$0(K0,{color:J.syntax.operator,children:"+"},void 0,!1,void 0,this)," ",$0(K0,{color:J.syntax.variable,children:"b"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(K0,{children:[" ",$0(K0,{color:J.syntax.keyword,children:"return"},void 0,!1,void 0,this)," ",$0(K0,{color:J.syntax.variable,children:"a"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(K0,{children:" "},void 0,!1,void 0,this),$0(K0,{color:J.error,children:["- print(",$0(K0,{color:J.syntax.string,children:'"Hello, "'},void 0,!1,void 0,this)," + name)"]},void 0,!0,void 0,this),$0(K0,{color:J.success,children:["+ print(",$0(K0,{color:J.syntax.string,children:['f"Hello, ',"{","name","}",'"']},void 0,!0,void 0,this),")"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},iK=({theme:$})=>{let{colors:J}=$;return $0(N1,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[$0(K0,{children:" "},void 0,!1,void 0,this),$0(K0,{bold:!0,color:J.text.primary,children:"颜色配置"},void 0,!1,void 0,this),$0(K0,{children:" "},void 0,!1,void 0,this),$0(K0,{children:[$0(K0,{color:J.text.muted,children:"Primary: "},void 0,!1,void 0,this),$0(K0,{color:J.primary,children:J.primary},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(K0,{children:[$0(K0,{color:J.text.muted,children:"Success: "},void 0,!1,void 0,this),$0(K0,{color:J.success,children:J.success},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(K0,{children:[$0(K0,{color:J.text.muted,children:"Error: "},void 0,!1,void 0,this),$0(K0,{color:J.error,children:J.error},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(K0,{children:[$0(K0,{color:J.text.muted,children:"Warning: "},void 0,!1,void 0,this),$0(K0,{color:J.warning,children:J.warning},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(K0,{children:[$0(K0,{color:J.text.muted,children:"Info: "},void 0,!1,void 0,this),$0(K0,{color:J.info,children:J.info},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},r5=()=>{let $=x1(),J=F$.getCurrentThemeName(),Y=M2.findIndex((H)=>H.label===J),X=Y>=0?M2[Y].theme:M2[0].theme,[Z,Q]=d5(X),[G,U]=d5(!1),z=lK(async(H)=>{if(G)return;U(!0);try{await z$().setTheme(H.value),$.closeModal()}catch(W){console.error("主题切换失败:",W instanceof Error?W.message:W)}finally{U(!1)}}),K=(H)=>{let W=M2.find((b)=>b.id===H.value);if(W)Q(W.theme)},q=X$()==="theme-selector",N=s0(!1);N0((H,W)=>{if(W.ctrl&&H==="c"||W.meta&&H==="c"){N();return}if(W.escape&&!G)$.closeModal()},{isActive:q});let _=(H)=>{let{isSelected:W,label:b}=H,w=b===J?"[OK]":" ";return $0(K0,{color:W?Z.colors.primary:Z.colors.text.primary,children:[w," ",b]},void 0,!0,void 0,this)};return $0(N1,{flexDirection:"column",height:"100%",children:[$0(N1,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:Z.colors.border.light,children:$0(K0,{bold:!0,color:Z.colors.primary,children:"主题选择器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),$0(N1,{flexDirection:"row",flexGrow:1,children:[$0(N1,{width:"40%",borderStyle:"single",borderColor:Z.colors.border.light,paddingX:1,children:$0(N1,{flexDirection:"column",children:[$0(N1,{paddingTop:1,paddingBottom:1,children:$0(K0,{bold:!0,color:Z.colors.text.primary,children:["可用主题 (",l5.length,")"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),$0(rK,{items:l5,initialIndex:Y>=0?Y:0,onSelect:z,onHighlight:K,itemComponent:_},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),$0(N1,{width:"60%",flexDirection:"column",borderStyle:"single",borderColor:Z.colors.border.light,children:[$0(aK,{theme:Z},void 0,!1,void 0,this),$0(iK,{theme:Z},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$0(N1,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:Z.colors.border.light,children:$0(K0,{color:Z.colors.text.muted,children:G?"正在保存...":"Enter: 选择主题 | Esc: 取消"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{Box as Y6,Text as H1,useStdout as oK}from"ink";import nK,{useCallback as V1,useEffect as T2,useMemo as xJ,useRef as m$,useState as W1}from"react";import{jsxDEV as C$}from"react/jsx-dev-runtime";function a5($,J){let Y=Array.from($.value);return{...$,cursor:Math.max(0,Math.min(Y.length,$.cursor+J))}}function tK($,J,Y){let X=Array.from($.value);if(Y.leftArrow)return a5($,-1);if(Y.rightArrow)return a5($,1);if(Y.home)return{...$,cursor:0};if(Y.end)return{...$,cursor:X.length};if(Y.backspace&&$.cursor>0)return X.splice($.cursor-1,1),{value:X.join(""),cursor:$.cursor-1};if(Y.delete&&$.cursor<X.length)return X.splice($.cursor,1),{value:X.join(""),cursor:$.cursor};if(Y.ctrl&&J.toLowerCase()==="u")return{value:"",cursor:0};if(Y.ctrl||Y.meta||J.length===0)return $;let Z=J.replace(/[\r\n\t]+/g," ");if(Z.length===0)return $;let Q=Array.from(Z);return X.splice($.cursor,0,...Q),{value:X.join(""),cursor:$.cursor+Q.length}}function sK({editor:$}){let J=Array.from($.value),Y=J.slice(0,$.cursor).join(""),X=J[$.cursor]??" ",Z=J.slice($.cursor+1).join("");return C$(H1,{wrap:"truncate-end",children:["/",Y,C$(H1,{inverse:!0,children:X},void 0,!1,void 0,this),Z,C$(H1,{dimColor:!0,children:" · Enter search · Esc cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}function eK({line:$,matches:J,currentMatchIndex:Y,selected:X,selectedBlock:Z,color:Q,highlightColor:G}){let U=y5($,J);if(X||U.length===0)return C$(H1,{wrap:"truncate-end",color:Q,inverse:X,bold:Z,underline:Z,children:$.text||" "},void 0,!1,void 0,this);let z=[],K=0;for(let O of U){if(O.start>K)z.push($.text.slice(K,O.start));z.push(C$(H1,{color:G,bold:!0,inverse:O.matchIndex===Y,children:$.text.slice(O.start,O.end)},`${$.key}:match:${O.matchIndex}`,!1,void 0,this)),K=O.end}if(K<$.text.length)z.push($.text.slice(K));return C$(H1,{wrap:"truncate-end",color:Q,bold:Z,underline:Z,children:z},void 0,!1,void 0,this)}var i5=nK.memo(({isOpen:$,onClose:J,compact:Y=!1})=>{let X=f8(),Z=a8(),Q=r8(),G=i8(),U=X$(),z=D0(),{stdout:K}=oK(),{width:O,height:q}=d1(),N=Y?Math.max(6,Math.floor(q*0.4)):q,_=Math.max(1,N-3),H=Math.max(12,O-4),W=m$(new Map),b=m$(new R8),[M,w]=W1(new Set),B=m$(M);B.current=M;let C=xJ(()=>R5({messages:X,currentStreamingMessageId:Z,streamingLines:G.lines,streamingTail:G.tail,currentThinkingContent:Q}),[X,Z,G.lines,G.tail,Q]),L=xJ(()=>{let e=new Set(C.map((S)=>S.id));for(let S of W.current.keys())if(!e.has(S))W.current.delete(S);return C.flatMap((S,v)=>{let g=M.has(S.id),x=W.current.get(S.id),r=x?.revision===S.revision&&x.width===H&&x.expanded===g?x.lines:vJ(S,H,g);if(r!==x?.lines)W.current.set(S.id,{revision:S.revision,width:H,expanded:g,lines:r});if(v===C.length-1)return r;return[...r,{key:`${S.id}:separator`,blockId:S.id,role:S.role,kind:S.kind,text:"",copyText:"",pending:S.pending===!0,header:!1,sourceLine:null,sourceStart:0,sourceEnd:0,sourceTextOffset:0}]})},[C,H,M]),[A,F]=W1(0),[R,k]=W1(new Set),[T,I]=W1(null),P=m$(null),[j,o]=W1(!1),u=m$(!1),[Z0,z0]=W1({value:"",cursor:0}),J0=m$(Z0),[f,E]=W1(""),[m,Y0]=W1(0),c=m$(0),[d,a]=W1(null),W0=m$(null),[F0,T0]=W1(null),y=m$(0),D=m$(null),p=m$(0),V=m$(C),n=m$(L.length),O0=m$(H);p.current=A,P.current=T,u.current=j,J0.current=Z0,c.current=m,W0.current=d;let Q0=xJ(()=>b.current.search(C,f),[C,f]),R0=Math.max(0,L.length-_),U0=Math.max(0,L.length-A),S0=Math.max(0,U0-_),X0=V1((e)=>{let S=Math.max(0,Math.min(R0,e));if(p.current=S,F(S),S===0)k(new Set)},[R0]),h0=V1((e)=>{if(L.length===0)return;let S=Math.max(0,Math.min(L.length-1,e)),v=Math.max(0,Math.min(L.length-_,S-Math.floor(_/2))),g=Math.min(L.length,v+_);X0(L.length-g)},[L.length,X0,_]),H$=V1((e,S,v)=>{let g=new Set(B.current);if(S)g.add(e);else g.delete(e);B.current=g,D.current=v,w(g)},[]),g0=V1((e)=>{let S=C.find((g)=>g.id===e.blockId);if(S?.collapsible&&!B.current.has(S.id)){H$(S.id,!0,{blockId:S.id,match:e});return}let v=VJ(L,e);if(v>=0)h0(v)},[C,L,h0,H$]),N$=V1((e,S=Q0)=>{if(S.length===0){c.current=0,Y0(0);return}let v=(e%S.length+S.length)%S.length;c.current=v,Y0(v);let g=S[v];P.current=g.blockId,I(g.blockId),g0(g)},[Q0,g0]),u$=V1((e)=>{let S=C.filter((P0)=>P0.collapsible);if(S.length===0)return;let v=S.findIndex((P0)=>P0.id===P.current),g=v<0?e>0?0:S.length-1:(v+e+S.length)%S.length,x=S[g].id;P.current=x,I(x);let r=L.findIndex((P0)=>P0.blockId===x&&P0.header);if(r>=0)h0(r)},[C,L,h0]),r0=V1(()=>{let e=P.current;if(!e)e=L.slice(S0,U0).find((v)=>C.some((g)=>g.id===v.blockId&&g.collapsible))?.blockId??null;if(!e)return;if(!C.find((v)=>v.id===e)?.collapsible)return;P.current=e,I(e),H$(e,!B.current.has(e),{blockId:e})},[C,U0,L,H$,S0]),U$=V1((e,S)=>{let v=W0.current;if(!v||L.length===0)return;let g=S==="top"?0:S==="bottom"?L.length-1:Math.max(0,Math.min(L.length-1,v.head+e)),x={...v,head:g};W0.current=x,a(x),h0(g)},[L.length,h0]),d0=V1(()=>{let e=W0.current;if(!e)return;let S=I5(L,e.anchor,e.head);if(!S.trim()){T0("Nothing selected");return}let v=++y.current;T0("Copying..."),$6(S,{writeTerminal:(g)=>K.write(g)}).then((g)=>{if(y.current!==v)return;T0(g.success?g.method==="osc52"?"Copy sent via OSC 52":`Copied ${S.split(`
|
|
171
|
-
`).length} lines`:"Copy failed"),W0.current=null,a(null)})},[L,K]);T2(()=>{if(!F0)return;let e=setTimeout(()=>T0(null),2500);return()=>clearTimeout(e)},[F0]),T2(()=>{if(!$){y.current++,V.current=C,n.current=L.length;return}B.current=new Set,w(new Set),P.current=null,I(null),u.current=!1,o(!1),J0.current={value:"",cursor:0},z0({value:"",cursor:0}),E(""),c.current=0,Y0(0),W0.current=null,a(null),T0(null),p.current=0,F(0),k(new Set),V.current=C,n.current=L.length,O0.current=H},[$]),T2(()=>{let e=new Set(C.map((S)=>S.id));if(w((S)=>{let v=new Set([...S].filter((x)=>e.has(x)));return B.current=v,v.size===S.size&&[...v].every((x)=>S.has(x))?S:v}),P.current&&!e.has(P.current))P.current=null,I(null)},[C]),T2(()=>{let e=n.current;if(n.current=L.length,!$)return;let S=D.current;if(S){D.current=null;let g=S.match?VJ(L,S.match):L.findIndex((x)=>x.blockId===S.blockId&&x.header);if(g>=0)h0(g);return}if(p.current===0){k(new Set);return}let v=Math.max(0,L.length-e);if(v>0)F((g)=>{let x=Math.min(R0,g+v);return p.current=x,x});else if(p.current>R0)p.current=R0,F(R0)},[H,M,$,L.length,R0,h0]),T2(()=>{let e=V.current;if(V.current=C,!$||p.current===0)return;let S=S5(e,C);if(S.length===0)return;k((v)=>{let g=new Set(v);for(let x of S)g.add(x);return g})},[C,$]),T2(()=>{if(Q0.length===0)c.current=0,Y0(0);else if(c.current>=Q0.length)c.current=Q0.length-1,Y0(Q0.length-1)},[Q0.length]),T2(()=>{if(O0.current===H)return;O0.current=H,W0.current=null,a(null);let e=Q0[c.current];if(e)g0(e)},[H,Q0,g0]),N0((e,S)=>{if(!$)return;let v=S,g=U==="transcript-pager";if((v.ctrl||v.meta)&&e.toLowerCase()==="o")return J(),!0;if(!g){if(v.pageUp)return X0(p.current+Math.max(1,_-1)),!0;if(v.pageDown)return X0(p.current-Math.max(1,_-1)),!0;return!1}if(u.current){if(v.escape)return u.current=!1,o(!1),J0.current={value:f,cursor:Array.from(f).length},z0(J0.current),!0;if(v.return){let r=J0.current.value,P0=b.current.search(C,r);return E(r),u.current=!1,o(!1),N$(0,P0),!0}let x=tK(J0.current,e,v);return J0.current=x,z0(x),!0}if(e==="q")return J(),!0;if(W0.current){if(v.escape)return W0.current=null,a(null),!0;if(e==="y"||v.ctrl&&!v.meta&&e.toLowerCase()==="c")return d0(),!0;if(v.upArrow||e==="k")return U$(-1),!0;if(v.downArrow||e==="j")return U$(1),!0;if(v.pageUp)return U$(-Math.max(1,_-1)),!0;if(v.pageDown)return U$(Math.max(1,_-1)),!0;if(v.home||e==="g")return U$(0,"top"),!0;if(v.end||e==="G")return U$(0,"bottom"),!0;return!0}if(v.escape)return J(),!0;if(e==="/"){let x={value:f,cursor:Array.from(f).length};return J0.current=x,z0(x),u.current=!0,o(!0),!0}if(e==="n"&&Q0.length>0)return N$(c.current+1),!0;if(e==="N"&&Q0.length>0)return N$(c.current-1),!0;if(v.tab)return u$(v.shift?-1:1),!0;if(v.return||e==="e")return r0(),!0;if(e==="v"){if(L.length===0)return!0;let x=Math.max(0,L.length-p.current),r=Math.max(0,x-_),P0=P.current?L.findIndex((b$)=>b$.blockId===P.current&&b$.header):-1,l0=P0>=0?P0:Math.max(0,Math.min(L.length-1,r)),c0={anchor:l0,head:l0};return W0.current=c0,a(c0),h0(l0),!0}if(v.upArrow||e==="k")return X0(p.current+1),!0;if(v.downArrow||e==="j")return X0(p.current-1),!0;if(v.pageUp)return X0(p.current+Math.max(1,_-1)),!0;if(v.pageDown)return X0(p.current-Math.max(1,_-1)),!0;if(v.home||e==="g")return X0(R0),!0;if(v.end||e==="G")return X0(0),!0;return!0},{isActive:$,priority:100});let L1=L.slice(S0,U0),B1=R.size,$8=L.length===0?"0/0":`${Math.min(U0,L.length)}/${L.length}`,g1=d?Math.min(d.anchor,d.head):-1,y2=d?Math.max(d.anchor,d.head):-1,Y2=f.length>0?`/${f} ${Q0.length>0?`${m+1}/${Q0.length}`:"0/0"}`:null,I$=F0?F0:d?`${y2-g1+1} lines selected · y copy · Esc cancel`:Y2?`${Y2} · n/N`:B1>0?`${B1} new · G latest`:"Ctrl+O / Esc / q close";return C$(Y6,{flexDirection:"column",width:"100%",height:N,paddingX:2,children:[C$(Y6,{justifyContent:"space-between",flexShrink:0,children:[C$(H1,{bold:!0,color:z.colors.primary,children:"Transcript"},void 0,!1,void 0,this),C$(H1,{color:z.colors.text.muted,children:$8},void 0,!1,void 0,this)]},void 0,!0,void 0,this),C$(Y6,{flexDirection:"column",height:_,flexShrink:0,overflow:"hidden",children:L1.length===0?C$(H1,{color:z.colors.text.muted,children:"No transcript yet"},void 0,!1,void 0,this):L1.map((e,S)=>{let v=S0+S,g=g1>=0&&v>=g1&&v<=y2,x=e.header&&e.blockId===T,r=e.pending?z.colors.warning:e.kind==="thinking"?z.colors.info:e.role==="user"?z.colors.info:e.role==="assistant"?z.colors.success:z.colors.text.secondary;return C$(eK,{line:e,matches:Q0,currentMatchIndex:m,selected:g,selectedBlock:x,color:r,highlightColor:z.colors.warning},e.key,!1,void 0,this)})},void 0,!1,void 0,this),C$(Y6,{flexShrink:0,children:j?C$(sK,{editor:Z0},void 0,!1,void 0,this):C$(H1,{color:F0||B1>0?z.colors.warning:z.colors.text.muted,wrap:"truncate-end",children:[I$," · / search · Tab/Enter expand · v/y copy · j/k PgUp/PgDn g/G"]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{jsxDEV as E0}from"react/jsx-dev-runtime";var J$=_1("UI"),e5=({debug:$,continue:J,...Y})=>{if($)J$.debug("[Debug] BladeInterface props:",{permissionMode:Y.permissionMode,yolo:Y.yolo,maxTurns:Y.maxTurns,continue:J});let X=R2(!1),Z=R2(!1),Q=R2(!1),G=R2(null),U=R2(!1),z=R2(null);if(!z.current)z.current=new k6;let K=z.current,O=R2(null);if(!O.current)O.current=new f6;let q=O.current,[N,_]=n5(K.getState()),[H,W]=n5(!1),b=eJ(),M=$9(),w=V8(),B=Z9(),C=X9(),L=j8(),A=p8(),F=W9(),R=Y9(),k=x1(),T=p1(),I=D2(),P=q1(),{stdout:j}=$z(),o=O9(),u=f2(),Z0=_9();e$(()=>{if(F$.getCurrentThemeName()!==Z0)try{F$.setTheme(Z0)}catch{}},[Z0]);let z0=b==="ready",J0=b==="needsSetup",f=b==="idle",E=Jz(()=>Y.agents?s5(Y.agents):void 0,[Y.agents]),{confirmationState:m,confirmationHandler:Y0,handleResponse:c,dismissAll:d}=CY(),{executeCommand:a,handleAbort:W0,isProcessing:F0,cleanupAgent:T0,refreshFollowUpQueue:y,controlFollowUpQueue:D}=MY(Y.systemPrompt,Y.appendSystemPrompt,Y0,Y.maxTurns,d,E,{list:()=>q.listAll(),acknowledge:(i)=>q.acknowledge(i),setVisibleLocator:(i)=>i?q.proveLocal(i):q.setVisibleLocator()}),p=i0(async(i)=>{await x9(i.controller,i.visibility,{continueSession:J===!0,resume:Y.resume,forkSession:Y.forkSession===!0,requestedSessionId:Y.sessionId,locator:{version:2,sessionId:I,workspace:{kind:"local",projectPath:P}}})}),V=i0((i)=>{k.projectTaskAttentionState(i.status,i.unreadKeys)}),n=i0((i)=>{J$.warn(`[BladeInterface] Task attention ${i} unavailable`)});X3({ready:z0,lifecycle:q,initialize:p,project:V,report:n});let O0=i0(_),Q0=i0(()=>{J$.warn("[BladeInterface] Session history shutdown unavailable")});$3({lifecycle:K,project:O0,report:Q0});let{getPreviousCommand:R0,getNextCommand:U0,addToHistory:S0}=TY();iY();let X0=IY("",0),h0=i0(()=>{a$(),j.write(o5.eraseScreen+o5.cursorTo(0,0)),T.incrementClearCount()}),H$=i0(()=>{if(H)return;W(!0)}),g0=i0(()=>{if(!H)return;W(!1)}),N$=i0(()=>{if(H)g0();else H$()});N0((i,w0)=>{if(z0&&!J0&&(w0.ctrl||w0.meta)&&i.toLowerCase()==="o")return N$(),!0;return!1},{priority:90}),e$(()=>{if(!U.current){U.current=!0;return}h0()},[h0,H]);let u$=i0(async()=>{let i=u,w0;if(i==="default")w0="autoEdit";else if(i==="autoEdit")w0="plan";else if(i==="plan")w0="default";else w0="default";try{await a0.setSessionPermissionMode(I,P,w0),await z$().setPermissionMode(w0)}catch(W$){J$.error("权限模式切换失败:",W$ instanceof Error?W$.message:W$)}}),r0=i0(async(i)=>{try{let w0={displayName:i.displayName,provider:i.provider,model:i.model,overrides:i.overrides};if(i.modelProvider)await z$().addModelWithProvider(w0,i.modelProvider);else await z$().addModel(w0);k.setInitializationStatus("ready")}catch(w0){throw J$.error("初始化配置保存失败:",w0 instanceof Error?w0.message:w0),w0}}),U$=i0(()=>{if(w==="shortcuts")k.closeModal();else k.setActiveModal("shortcuts")}),d0=i0(async()=>{try{await u9(q.visibility(),{version:2,sessionId:I,workspace:{kind:"local",projectPath:P}})}catch{J$.warn("[BladeInterface] Task attention fallback visibility unavailable")}}),L1=i0(async(i,w0,W$)=>{return z4({intent:w0,session:i,newSessionId:W$?.newSessionId,announceFork:W$?.announceFork,permissionModeOverride:Y.permissionMode},P,T,T0)}),B1=i0(async(i,w0,W$)=>{await $Y(i,w0,{openHistory:(S2,m1)=>{k.showSessionHistoryViewer(S2,m1)},activateLocal:async(S2,m1)=>{await K.closeView();let U6=await L1(S2,m1,W$);try{await c9(m1,i,U6,q.visibility())}catch{J$.warn("[BladeInterface] Task attention local activation unavailable")}k.closeModal()}},W$)}),$8=i0(async(i,w0)=>{let m1=(await K4(w0,P,q)).filter((U6)=>U6.locator.sessionId===i);if(m1.length===0)throw Error(`Session not found: ${i}`);if(m1.length>1)throw Error(`Multiple workspaces contain session ${i}; use the session selector`);return m1[0]}),{showSuggestions:g1,suggestions:y2,selectedSuggestionIndex:Y2}=dY(X0,a,R0,U0,S0,W0,F0,u$,U$,w==="shortcuts",w==="sessionHistoryViewer");e$(()=>{if(X0.value&&w==="shortcuts")k.closeModal()},[X0.value,w,k]),e$(()=>{if(w==="followUpQueue")y()},[w,y]);let I$=i0(async()=>{Q.current=!0;try{let i=Y.forkSession?"fork":"resume",w0=await K4(i,P,q);if(w0.length===0){if(Y.forkSession){J$.error("没有可供 fork 的历史会话"),$1(1);return}T.addAssistantMessage("没有找到历史会话,开始新对话。"),await d0();return}let W$=l9(w0);if(!W$){if(Y.forkSession){J$.error("没有可供 fork 的本地历史会话"),$1(1);return}T.addAssistantMessage("没有找到本地历史会话,开始新对话。"),await d0();return}await B1(W$,i,{newSessionId:Y.forkSession?Y.sessionId:void 0,announceFork:Y.forkSession?!1:void 0})}catch(i){if(J$.error("[BladeInterface] 继续会话失败:",i),Y.forkSession){$1(1);return}T.addAssistantMessage("继续会话失败,开始新对话。"),await d0()}}),e=i0(async()=>{Q.current=!0;try{if(typeof Y.resume==="string"&&Y.resume!=="true"){let W$=Y.forkSession?"fork":"resume",S2=await $8(Y.resume,W$);await B1(S2,W$,{newSessionId:Y.forkSession?Y.sessionId:void 0,announceFork:Y.forkSession?!1:void 0});return}let i=Y.forkSession?"fork":"resume",w0=await K4(i,P,q);if(w0.length===0)J$.error("没有找到历史会话"),$1(1);k.showSessionSelector(w0,i)}catch(i){J$.error("[BladeInterface] 加载会话失败:",i),$1(1)}});e$(()=>{if(X.current)return;if(J){X.current=!0,I$();return}if(Y.resume)X.current=!0,e()},[J,Y.resume,I$,e]);let S=i0(async(i)=>{let w0=m.details?.type;if(w0==="enterPlanMode"&&i.approved)try{await a0.setSessionPermissionMode(I,P,"plan"),await z$().setPermissionMode("plan"),J$.debug("[BladeInterface] Entered Plan mode")}catch(W$){J$.error("[BladeInterface] Failed to enter Plan mode:",W$)}if(w0==="exitPlanMode"&&i.approved)J$.debug("[BladeInterface] ExitPlanMode approved, Store auto-synced");c(i)}),v=i0(()=>{T.addAssistantMessage("设置已取消"),T.addAssistantMessage("Blade 需要 API 配置才能正常工作。"),T.addAssistantMessage("您可以稍后运行 Blade 重新进入设置向导。"),$1(0)}),g=i0(()=>{K.closeView().catch(()=>{J$.warn("[BladeInterface] Session history close unavailable")}),k.closeModal()}),x=i0(async(i)=>{try{let w0=B?.intent??"resume";await B1(i,w0,{newSessionId:w0==="fork"&&Y.forkSession?Y.sessionId:void 0})}catch(w0){J$.error("[BladeInterface] Failed to restore session:",w0),T.addAssistantMessage(`会话操作失败: ${w0 instanceof Error?w0.message:"未知错误"}`),k.closeModal()}}),r=i0(()=>{if(K.closeView().catch(()=>{J$.warn("[BladeInterface] Session history close unavailable")}),Y.resume)$1(0);else k.closeModal()});e$(()=>{if(w==="sessionHistoryViewer"&&C){eY(K,q,C).catch(()=>{J$.warn("[BladeInterface] Session history activation unavailable")});return}if(K.cancelRemoteRequest(),q.endRemote().catch(()=>{J$.warn("[BladeInterface] Task attention visibility unavailable")}),K.getState().status!=="idle")K.closeView().catch(()=>{J$.warn("[BladeInterface] Session history close unavailable")})},[w,K,C,q]),e$(()=>{if(!C)return;q.updateRemote(C,N).catch(()=>{J$.warn("[BladeInterface] Task attention acknowledgement unavailable")})},[N,C,q]);let P0=i0((i)=>{k.showModelEditWizard(i)}),l0=i0((i)=>{T.addAssistantMessage(`已添加模型配置: ${i.displayName??i.model},并已切换到该模型`),g()}),c0=i0((i)=>{T.addAssistantMessage(`已更新模型配置: ${i.displayName??i.model}`),g()});e$(()=>{if(J0){o.setFocus("model-config-wizard");return}if(m.isVisible)o.setFocus("confirmation-prompt");else if(w==="sessionSelector")o.setFocus("session-selector");else if(w==="sessionHistoryViewer")o.setFocus("session-history-viewer");else if(w==="followUpQueue")o.setFocus("follow-up-queue");else if(w==="themeSelector")o.setFocus("theme-selector");else if(w==="modelSelector")o.setFocus("model-selector");else if(w==="modelAddWizard"||w==="modelEditWizard")o.setFocus("model-config-wizard");else if(w==="permissionsManager")o.setFocus("permissions-manager");else if(w==="agentsManager")o.setFocus("agents-manager");else if(w==="agentCreationWizard")o.setFocus("agent-creation-wizard");else if(w==="skillsManager")o.setFocus("skills-manager");else if(w==="pluginsManager")o.setFocus("plugins-manager");else if(w==="hooksManager")o.setFocus("hooks-manager");else if(H)o.setFocus("transcript-pager");else if(w==="shortcuts")o.setFocus("main-input");else o.setFocus("main-input")},[J0,m.isVisible,w,H,o.setFocus]),e$(()=>{if(!z0||Q.current)return;if(t5().length>0){Q.current=!0;return}Q.current=!0,T.addAssistantMessage("请输入您的问题,我将为您提供帮助。")},[z0]),e$(()=>{if(!M)return;if(G.current===M)return;if(G.current=M,b==="error")T.addAssistantMessage(`初始化失败: ${M}`);else T.addAssistantMessage(`${M}`),T.addAssistantMessage("请重新尝试设置,或检查文件权限")},[M,b,T.addAssistantMessage]);let b$=i0(async(i)=>{try{await a({displayText:i,text:i,images:[],parts:[{type:"text",text:i}]})}catch(w0){let W$=w0 instanceof Error?w0.message:"无法发送初始消息";T.addAssistantMessage(`初始消息发送失败:${W$}`)}});e$(()=>{let i=Y.initialMessage?.trim();if(!i||Z.current||!z0||J0)return;Z.current=!0,S0(i),b$(i)},[Y.initialMessage,z0,J0,a,S0]);let z1=i0(async(i)=>{try{await z$().setPermissionMode(i)}catch(w0){J$.error("权限模式初始化失败:",w0 instanceof Error?w0.message:w0)}});if(e$(()=>{let i=Y.permissionMode;if($)J$.debug("[Debug] permissionMode from CLI:",i),J$.debug("[Debug] current permissionMode:",u);if(!i||i===u)return;z1(i)},[Y.permissionMode,u]),f)return null;if(J0)return E0(kJ,{mode:"setup",onComplete:r0,onCancel:v},void 0,!1,void 0,this);if($)J$.debug("[Debug] 渲染主界面,条件检查:",{confirmationVisible:m.isVisible,activeModal:w});let Z2=w==="modelSelector",B$=R,d$=w==="modelAddWizard"?"add":w==="modelEditWizard"&&B$?"edit":null,O$=Z2||Boolean(d$),w1=w==="agentsManager",P1=w==="agentCreationWizard",Z$=w==="skillsManager",I2=w==="pluginsManager",LX=B$?{displayName:B$.displayName,provider:B$.provider,model:B$.model,overrides:B$.overrides}:void 0,dJ=m.isVisible&&m.details?m.details.type==="mcpElicitation"&&m.details.mcpElicitation?E0(mZ,{details:m.details.mcpElicitation,onComplete:(i,w0)=>S({approved:i.action==="accept",elicitation:i,...w0?{openExternalUrl:!0}:{}})},void 0,!1,void 0,this):m.details.type==="askUserQuestion"&&m.details.questions?E0(b5,{questions:m.details.questions,onComplete:(i)=>S({approved:!0,answers:i}),onCancel:()=>S({approved:!1})},void 0,!1,void 0,this):E0($Z,{details:m.details,onResponse:S},void 0,!1,void 0,this):w==="themeSelector"?E0(r5,{},void 0,!1,void 0,this):w==="permissionsManager"?E0(W5,{onClose:g},void 0,!1,void 0,this):w==="sessionSelector"?E0(j5,{intent:B?.intent??"resume",sessions:B?.sessions??[],taskAttentionUnreadKeys:L,onSelect:x,onCancel:r},void 0,!1,void 0,this):w==="sessionHistoryViewer"?E0(D5,{state:N,onLoadOlder:(i)=>K.loadOlder(i),onFork:(i)=>K.fork(i),onClose:g},void 0,!1,void 0,this):w==="followUpQueue"?E0(JZ,{queue:A,mutation:F,onMutate:D,onRefresh:y,onClose:g},void 0,!1,void 0,this):w==="hooksManager"?E0(ZZ,{workspaceRoot:P,sessionId:I,onClose:g},void 0,!1,void 0,this):null,k8=Boolean(dJ);return E0(j1,{flexDirection:"column",width:"100%",overflow:"hidden",children:[dJ,E0(j1,{flexDirection:"column",display:k8||H?"none":"flex",children:[E0(aZ,{active:!k8&&!H},void 0,!1,void 0,this),E0(u5,{},void 0,!1,void 0,this),E0(pJ,{},void 0,!1,void 0,this),E0(hJ,{},void 0,!1,void 0,this),E0(jZ,{paused:k8||H},void 0,!1,void 0,this),E0(TZ,{input:X0.value,cursorPosition:X0.cursorPosition,onChange:X0.setValue,onChangeCursorPosition:X0.setCursorPosition,onAddPasteMapping:X0.addPasteMapping,onAddImagePasteMapping:X0.addImagePasteMapping,disabled:w==="sessionHistoryViewer"},void 0,!1,void 0,this),Z2&&E0(j1,{marginTop:1,paddingX:2,children:E0(iZ,{onClose:g,onEdit:P0},void 0,!1,void 0,this)},void 0,!1,void 0,this),d$&&E0(j1,{marginTop:1,paddingX:2,children:E0(kJ,{mode:d$,modelId:B$?.id,initialConfig:d$==="edit"?LX:void 0,onComplete:d$==="edit"?c0:l0,onCancel:g},void 0,!1,void 0,this)},void 0,!1,void 0,this),w1&&E0(j1,{marginTop:1,paddingX:2,children:E0(N3,{workspaceRoot:P,onComplete:g,onCancel:g},void 0,!1,void 0,this)},void 0,!1,void 0,this),P1&&E0(j1,{marginTop:1,paddingX:2,children:E0(N8,{onComplete:g,onCancel:g},void 0,!1,void 0,this)},void 0,!1,void 0,this),Z$&&E0(j1,{marginTop:1,paddingX:2,children:E0(m5,{onComplete:g,onCancel:g},void 0,!1,void 0,this)},void 0,!1,void 0,this),I2&&E0(j1,{marginTop:1,paddingX:2,children:E0(A5,{workspaceRoot:P,onComplete:g,onCancel:g},void 0,!1,void 0,this)},void 0,!1,void 0,this),E0(P3,{suggestions:y2,selectedIndex:Y2,visible:g1&&!O$},void 0,!1,void 0,this),E0(w3,{},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E0(j1,{flexDirection:"column",display:H?"flex":"none",children:E0(i5,{isOpen:H,compact:k8,onClose:g0},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{Box as Yz,Text as $2}from"ink";import Zz from"react";import{jsxDEV as E1}from"react/jsx-dev-runtime";class S8 extends Zz.Component{constructor($){super($);this.state={hasError:!1,error:null,errorInfo:null}}static getDerivedStateFromError($){return{hasError:!0,error:$,errorInfo:null}}componentDidCatch($,J){this.setState({error:$,errorInfo:J}),console.error("未捕获的错误:",$,J)}render(){if(this.state.hasError)return E1(Yz,{flexDirection:"column",padding:1,borderStyle:"round",borderColor:"red",children:[E1($2,{color:"red",children:"应用发生错误"},void 0,!1,void 0,this),E1($2,{children:" "},void 0,!1,void 0,this),E1($2,{color:"red",children:this.state.error?.message},void 0,!1,void 0,this),E1($2,{children:" "},void 0,!1,void 0,this),E1($2,{color:"gray",children:"错误详情:"},void 0,!1,void 0,this),E1($2,{color:"gray",children:this.state.error?.stack},void 0,!1,void 0,this),E1($2,{children:" "},void 0,!1,void 0,this),E1($2,{color:"yellow",children:"请重启应用或联系开发者"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return this.props.children}}import{Box as C2,Text as h1}from"ink";import{useState as cJ}from"react";import{jsxDEV as y$}from"react/jsx-dev-runtime";var Z6=[{key:"update",label:"Update now",description:`runs \`${JX()}\``},{key:"skip",label:"Skip",description:""},{key:"skip_until_next",label:"Skip until next version",description:""}],ZX=({versionInfo:$,onComplete:J})=>{let[Y,X]=cJ(0),[Z,Q]=cJ(!1),[G,U]=cJ(null);N0((K,O)=>{if(O.ctrl&&K==="c"){q8().shutdown("SIGINT",0);return}if(Z||G)return;if(O.upArrow||K==="k")X((q)=>q>0?q-1:Z6.length-1);else if(O.downArrow||K==="j")X((q)=>q<Z6.length-1?q+1:0);else if(O.return)z(Z6[Y].key);else if(K==="1")z("update");else if(K==="2")z("skip");else if(K==="3")z("skip_until_next")});let z=async(K)=>{switch(K){case"update":{Q(!0);let O=await YX();U(O.message),setTimeout(()=>{q8().shutdown("SIGINT",0)},1500);break}case"skip":J();break;case"skip_until_next":if($.latestVersion)await $X($.latestVersion);J();break}};if(G)return y$(C2,{flexDirection:"column",marginY:1,children:y$(h1,{children:G},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Z)return y$(C2,{flexDirection:"column",marginY:1,children:y$(h1,{color:"cyan",children:"Updating..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);return y$(C2,{flexDirection:"column",marginY:1,children:[y$(h1,{color:"yellow",bold:!0,children:["Update available! ",y$(h1,{color:"gray",children:[$.currentVersion," ","->"," ",$.latestVersion]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),y$(C2,{marginTop:1,children:y$(h1,{color:"gray",children:["Release notes:"," ",y$(h1,{color:"cyan",underline:!0,children:$.releaseNotesUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),y$(C2,{flexDirection:"column",marginTop:1,children:Z6.map((K,O)=>{let q=O===Y,N=q?"› ":" ",_=`${O+1}. `;return y$(C2,{children:y$(h1,{color:q?"cyan":void 0,children:[N,_,K.label,K.description&&y$(h1,{color:"gray",children:[" (",K.description,")"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},K.key,!1,void 0,this)})},void 0,!1,void 0,this),y$(C2,{marginTop:1,children:y$(h1,{color:"gray",children:"Press enter to continue"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{Box as X6,Text as e2}from"ink";import{useState as XX}from"react";import{jsxDEV as F1}from"react/jsx-dev-runtime";var QX=({status:$,onTrust:J,onContinueSafely:Y})=>{let X=F$.getTheme(),[Z,Q]=XX(!1),[G,U]=XX(null);return N0((z,K)=>{if(Z)return;if(K.return||z.toLowerCase()==="t"){Q(!0),U(null),J().catch((O)=>{U(O instanceof Error?O.message:"Failed to trust workspace"),Q(!1)});return}if(z.toLowerCase()==="s"||K.escape)Q(!0),U(null),Y().catch((O)=>{U(O instanceof Error?O.message:"Failed to continue safely"),Q(!1)})}),F1(X6,{flexDirection:"column",paddingX:1,children:[F1(e2,{bold:!0,color:X.colors.warning,children:"Workspace review required"},void 0,!1,void 0,this),F1(e2,{dimColor:!0,children:$.projectPath},void 0,!1,void 0,this),F1(X6,{marginTop:1,flexDirection:"column",children:[F1(e2,{children:"This project contains configuration that can change models, start MCP processes, relax permissions, inject environment variables, or load instructions, commands, skills, agents, and plugins."},void 0,!1,void 0,this),$.sources.map((z)=>F1(e2,{children:[" ",z.path," · ",z.effects.length," effect(s)"]},`${z.kind}:${z.path}`,!0,void 0,this))]},void 0,!0,void 0,this),G&&F1(X6,{marginTop:1,children:F1(e2,{color:X.colors.error,children:G},void 0,!1,void 0,this)},void 0,!1,void 0,this),F1(X6,{marginTop:1,children:F1(e2,{bold:!0,children:Z?"Applying decision...":"[Enter/T] Trust and load [S/Esc] Continue safely"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useStdout as Xz}from"ink";import{useEffect as Qz}from"react";function GX(){let{stdout:$}=Xz();Qz(()=>{if(!$.isTTY)return;return $.write(KZ),$.write(OJ),()=>{$.write(zZ),$.write(OJ)}},[$])}function UX($){return($ instanceof Error?$.message:String($)).replace(/sk-[a-zA-Z0-9]{32,}/g,"sk-***").replace(/apiKey['":\s]+[a-zA-Z0-9-_]+/gi,"apiKey: ***").replace(/API_KEY['":\s=]+[a-zA-Z0-9-_]+/gi,"API_KEY=***")}function Gz($){return $.forkSession?void 0:$.resumeSessionId}function KX($,J){let Y=Gz($);if(Y)J(Y)}import{jsxDEV as J2}from"react/jsx-dev-runtime";function Kz($){if(m0().config.actions.setConfig($),$.debug)console.log("[Debug] 模型配置检查通过,准备就绪");L$().setInitializationStatus("ready")}var zz=($)=>{GX();let[J,Y]=G6(!1),[X,Z]=G6(null),[Q,G]=G6(!1),[U,z]=G6(null),K=Q6((_,H)=>{let W=_ instanceof Error?_.message:String(_);if(L$().setInitializationError(W),L$().setInitializationStatus("error"),Y(!0),H)console.error("[FAIL] 应用初始化失败:",W)}),O=Q6(async()=>{try{let _=m0().config.config??qX,H=_X(_,$);if(Kz(H),KX(H,(b)=>{OX().restoreSession(b,[])}),H.debug)console.error("[Debug] 运行时配置:",H);let W=H.codeTheme;if(W&&F$.hasTheme(W)){if(F$.setTheme(W),$.debug)console.log(`[OK] 已加载主题: ${W}`)}try{E$.getInstance().loadConfig(H.hooks||{},K$());let M=await NX(K$());if($.debug&&H.hooks?.enabled)console.log("[OK] Hooks 系统已启用");if($.debug)console.log(`[OK] Workspace resources: ${M.subagents.getAllNames().length} agents, ${M.skills.size} skills, ${M.commands.getCommandCount()+M.commands.getPluginCommandCount()} commands, ${M.plugins.getAll().length} plugins`);let B=m0().session.sessionId;zX(B)}catch(b){if($.debug)console.warn("Hooks 初始化失败:",UX(b))}_4(async()=>{await HX.getInstance().killAll(),await WX.getInstance().disconnectAll(),E$.getInstance().cleanup()}),Y(!0)}catch(_){K(_,!!$.debug)}}),q=Q6(async()=>{let _=await uJ.getInstance().getStatus(K$());if(_.state==="untrusted"||_.state==="error"){z(_);return}await O()}),N=Q6(async()=>{if($.versionCheckPromise){let _=await $.versionCheckPromise;if(_){Z(_),G(!0);return}}await q()});if(Uz(()=>{N()},[]),Q&&X)return J2(S8,{children:J2(ZX,{versionInfo:X,onComplete:()=>{G(!1),q()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(U)return J2(S8,{children:J2(QX,{status:U,onTrust:async()=>{await uJ.getInstance().trust(K$()),await FX(),z(null),await O()},onContinueSafely:async()=>{z(null),await O()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(!J)return null;return J2(S8,{children:J2(e5,{...$},void 0,!1,void 0,this)},void 0,!1,void 0,this)},sA=($)=>J2(DY,{children:J2(zz,{...$},void 0,!1,void 0,this)},void 0,!1,void 0,this);export{sA as AppWrapper};
|