blade-code 0.10.128 → 0.10.130
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-0z9nqbd0.js +2 -0
- package/dist/chunk-1bb4h5gf.js +1 -0
- package/dist/chunk-2bnpn8be.js +1 -0
- package/dist/{chunk-xzfc1s6k.js → chunk-2y1qngw7.js} +1 -1
- package/dist/{chunk-jy0vfp8a.js → chunk-42h7kj6p.js} +1 -1
- package/dist/{chunk-ted1hyvb.js → chunk-44jtpg8y.js} +1 -1
- package/dist/chunk-4sxxvtn4.js +1 -0
- package/dist/chunk-51qc7n8t.js +1 -0
- package/dist/{chunk-z3hpstky.js → chunk-53h87fmt.js} +1 -1
- package/dist/{chunk-y93nqyqd.js → chunk-55hq1ps4.js} +2 -2
- package/dist/{chunk-9n90djh7.js → chunk-5a17mdjd.js} +2 -2
- package/dist/{chunk-pq6g92cz.js → chunk-6p6ts4kv.js} +2 -2
- package/dist/{chunk-sca5q3tt.js → chunk-77efqpdc.js} +1 -1
- package/dist/chunk-7jj607dg.js +94 -0
- package/dist/{chunk-yqqeh12b.js → chunk-8a6nrqdc.js} +2 -2
- package/dist/{chunk-10w2pj3r.js → chunk-93x9xbew.js} +1 -1
- package/dist/{chunk-1aw643j2.js → chunk-9et78e3v.js} +2 -2
- package/dist/chunk-9gs4eqt8.js +1 -0
- package/dist/chunk-9s8saznq.js +1 -0
- package/dist/{chunk-fa0pyv9k.js → chunk-9yqadjea.js} +2 -2
- package/dist/{chunk-a7gghhvn.js → chunk-a4jetpj8.js} +18 -18
- package/dist/{chunk-yqpej45c.js → chunk-a60cmnmz.js} +2 -2
- package/dist/{chunk-8hd4vd20.js → chunk-aaxc81jc.js} +1 -1
- package/dist/{chunk-xejvs1fk.js → chunk-agda17kj.js} +1 -1
- package/dist/{chunk-c47db31j.js → chunk-ajsw4te2.js} +2 -2
- package/dist/{chunk-r04vwtej.js → chunk-ar5np5h5.js} +2 -2
- package/dist/chunk-b8m7zc7t.js +170 -0
- package/dist/chunk-bcre3557.js +1 -0
- package/dist/{chunk-atema2rc.js → chunk-dfjmvj3d.js} +2 -2
- package/dist/chunk-dkgaxmsp.js +10 -0
- package/dist/{chunk-mkvvyq49.js → chunk-e1d0e6t6.js} +2 -2
- package/dist/{chunk-s7axaw78.js → chunk-edtxcqxa.js} +1 -1
- package/dist/chunk-f8gb685p.js +2 -0
- package/dist/chunk-fjv2vede.js +1 -0
- package/dist/{chunk-zfyg3888.js → chunk-g4xny949.js} +1 -1
- package/dist/chunk-gfbkrk60.js +338 -0
- package/dist/{chunk-12hdakw4.js → chunk-gmqpfm52.js} +2 -2
- package/dist/{chunk-skv2gb99.js → chunk-grhsv55v.js} +2 -2
- package/dist/chunk-gzz0gnmv.js +1 -0
- package/dist/chunk-h1wphqkc.js +1 -0
- package/dist/{chunk-6v2hhgka.js → chunk-hhg1zcbq.js} +2 -2
- package/dist/{chunk-9hnfz9bx.js → chunk-hw1gbr11.js} +1 -1
- package/dist/{chunk-nx8xb7dm.js → chunk-jkfkyedn.js} +1 -1
- package/dist/chunk-kd3k1q9z.js +1 -0
- package/dist/{chunk-n8w1jxsh.js → chunk-kfkvdj49.js} +1 -1
- package/dist/chunk-m9mw8ppy.js +1 -0
- package/dist/{chunk-xshrj2nd.js → chunk-mdew58v9.js} +1 -1
- package/dist/{chunk-n4q6fvqe.js → chunk-mvm1rzc4.js} +2 -2
- package/dist/{chunk-qm632an7.js → chunk-p00f53yq.js} +1 -1
- package/dist/{chunk-p7349xay.js → chunk-p2sp2e0a.js} +2 -2
- package/dist/chunk-pj69j4zp.js +2 -0
- package/dist/{chunk-41byj2h8.js → chunk-pk11fexz.js} +2 -2
- package/dist/chunk-qahz5x5c.js +14 -0
- package/dist/{chunk-6m4sqwj0.js → chunk-qcvxff27.js} +2 -2
- package/dist/{chunk-p2rxrxct.js → chunk-r9tawy93.js} +3 -3
- package/dist/{chunk-rz2wc93t.js → chunk-s2atpv23.js} +4 -4
- package/dist/chunk-saedy6bj.js +1 -0
- package/dist/{chunk-fgbqm2jh.js → chunk-sfe4810k.js} +1 -1
- package/dist/{chunk-96w8ay2h.js → chunk-sj1dzeta.js} +1 -1
- package/dist/chunk-sn71fsm5.js +1 -0
- package/dist/{chunk-yysqw1cq.js → chunk-ss4sncn3.js} +2 -2
- package/dist/chunk-ss86eq2h.js +23 -0
- package/dist/{chunk-ektgnqmh.js → chunk-sx77dpxw.js} +1 -1
- package/dist/chunk-t4apxzp1.js +2 -0
- package/dist/chunk-te6203yf.js +1 -0
- package/dist/{chunk-gxwkwkhp.js → chunk-tkydv9k8.js} +1 -1
- package/dist/{chunk-60he05xs.js → chunk-tw5fr07c.js} +2 -2
- package/dist/{chunk-q3y3s16v.js → chunk-v52wc8yg.js} +2 -2
- package/dist/{chunk-b408cqg1.js → chunk-v5hzk7j2.js} +2 -2
- package/dist/{chunk-v4nqv1pr.js → chunk-v94ztjtp.js} +385 -385
- package/dist/{chunk-85jv1sr7.js → chunk-xa9k5pjt.js} +2 -2
- package/dist/{chunk-mvgmsjwq.js → chunk-z03dtyh6.js} +1 -1
- package/dist/{chunk-jxc67ydz.js → chunk-zc91c7b5.js} +2 -2
- package/dist/{chunk-mm05y2c5.js → chunk-zkzhm39s.js} +1 -1
- package/dist/{chunk-1xg7qx35.js → chunk-zwjrensv.js} +1 -1
- package/dist/web/assets/ChatView-Bg36FUaj.js +53 -0
- package/dist/web/assets/{CodeBlockHighlighter-0VOa5Mes.js → CodeBlockHighlighter-D5rB73Eo.js} +2 -2
- package/dist/web/assets/FilePreview-BxaBSmap.js +65 -0
- package/dist/web/assets/KanbanBoard-B4gx3JMo.js +16 -0
- package/dist/web/assets/{MarkdownRenderer-3g4TPTeI.js → MarkdownRenderer-BRH7LHhN.js} +3 -3
- package/dist/web/assets/ScrollArea-DikU3QeQ.js +1 -0
- package/dist/web/assets/SessionHistorySurface-DG80d6-F.js +6 -0
- package/dist/web/assets/{SettingsModal-3GMy6V-E.js → SettingsModal-Bxqkok81.js} +3 -3
- package/dist/web/assets/Sidebar-DGaHGcHx.js +31 -0
- package/dist/web/assets/TaskSwitcher-DOnLPurk.js +26 -0
- package/dist/web/assets/TerminalPanel-BzhCF9vw.js +6 -0
- package/dist/web/assets/archive-BiDGrqry.js +6 -0
- package/dist/web/assets/{arrow-left-03GxbYI7.js → arrow-left-BY-esOAP.js} +1 -1
- package/dist/web/assets/{calendar-clock-8W4ostX1.js → calendar-clock-BCyxvfVt.js} +1 -1
- package/dist/web/assets/chevron-right-Bg-10yuN.js +6 -0
- package/dist/web/assets/{chevrons-up-down-BboZzEAk.js → chevrons-up-down-M5SAJq7T.js} +1 -1
- package/dist/web/assets/{clock-3-aXgeptZP.js → clock-3-v-nHTA0A.js} +1 -1
- package/dist/web/assets/copy-p1zc_rjZ.js +6 -0
- package/dist/web/assets/download-D_-kbJXR.js +6 -0
- package/dist/web/assets/{external-link-UkIIC2ds.js → external-link-wSGTIqe3.js} +1 -1
- package/dist/web/assets/{folder-BOCc5dv2.js → folder-Ltm9jCS5.js} +1 -1
- package/dist/web/assets/index-B4186fIT.css +1 -0
- package/dist/web/assets/index-_xnlrekR.js +210 -0
- package/dist/web/assets/{pause-DVIT6IIr.js → pause-_LvCZkxM.js} +1 -1
- package/dist/web/assets/pencil-DB6ICr_h.js +6 -0
- package/dist/web/assets/{play-DsdF5dji.js → play-BRXP1rHJ.js} +1 -1
- package/dist/web/assets/plus-BqvjEpLw.js +6 -0
- package/dist/web/assets/session-events-AGMXvPey.js +22 -0
- package/dist/web/assets/settings-LfQbDvBA.js +6 -0
- package/dist/web/assets/teamService-B5FnUcet.js +1 -0
- package/dist/web/assets/terminal-By4sO9Gw.js +6 -0
- package/dist/web/assets/vendor-radix-D6QrtXqd.js +45 -0
- package/dist/web/index.html +3 -3
- package/package.json +1 -1
- package/dist/chunk-0ktte40x.js +0 -185
- package/dist/chunk-1acb8fwq.js +0 -120
- package/dist/chunk-3pwqqk7w.js +0 -1
- package/dist/chunk-3q7g9206.js +0 -1
- package/dist/chunk-562w5zc6.js +0 -2
- package/dist/chunk-5x56nka1.js +0 -1
- package/dist/chunk-7hajkvde.js +0 -1
- package/dist/chunk-9wptwfmg.js +0 -1
- package/dist/chunk-ap01rwg0.js +0 -169
- package/dist/chunk-cm8fy1jn.js +0 -1
- package/dist/chunk-dp4r5bay.js +0 -1
- package/dist/chunk-dtxza4zh.js +0 -1
- package/dist/chunk-hd7bxzvy.js +0 -1
- package/dist/chunk-hks48s9k.js +0 -1
- package/dist/chunk-hmncnf7p.js +0 -1
- package/dist/chunk-j6fj679p.js +0 -10
- package/dist/chunk-m8czdpyg.js +0 -1
- package/dist/chunk-p5awnndq.js +0 -8
- package/dist/chunk-s7peh6kf.js +0 -2
- package/dist/chunk-ws6gtw33.js +0 -1
- package/dist/chunk-wtmhqy5s.js +0 -1
- package/dist/chunk-xnstybjm.js +0 -2
- package/dist/chunk-xpdtg9h9.js +0 -23
- package/dist/chunk-z2jwm4s8.js +0 -1
- package/dist/web/assets/ChatView-DCHnicTP.js +0 -58
- package/dist/web/assets/FilePreview-C_3KHzzj.js +0 -65
- package/dist/web/assets/KanbanBoard-D_NTkUnD.js +0 -16
- package/dist/web/assets/TaskSwitcher-eCdxu5Eo.js +0 -26
- package/dist/web/assets/TerminalPanel-9q9Trmv9.js +0 -6
- package/dist/web/assets/index-DGf6Z2kM.css +0 -1
- package/dist/web/assets/index-DaiT-mmo.js +0 -275
- package/dist/web/assets/session-events-CWzF04l4.js +0 -22
- package/dist/web/assets/teamService-BliaDj1Z.js +0 -1
- package/dist/web/assets/vendor-radix-Bc1_Q9tz.js +0 -45
package/dist/chunk-ap01rwg0.js
DELETED
|
@@ -1,169 +0,0 @@
|
|
|
1
|
-
import{e as L3,f as w3}from"./chunk-562w5zc6.js";import{i as BX,j as AX,k as bX}from"./chunk-p7349xay.js";import{v as P9,w as M9,x as T8}from"./chunk-9n90djh7.js";import{$ as I9,F as bY,J as vX,L as m4,M as v4,N as _Y,T as e9,U as $Y,Z as g$,aa as S9,ca as JY,ea as j2,fa as V3,ga as j3,ja as E3,ka as h3,oa as rJ,pa as xY,ra as gY,sa as mY,ta as VX,ua as m9,wa as p9,ya as PY}from"./chunk-v4nqv1pr.js";import"./chunk-pq6g92cz.js";import{Ga as e6,Ha as $3,Ia as J3,La as DX}from"./chunk-60he05xs.js";import{Na as s9}from"./chunk-q3y3s16v.js";import{Hb as t9,Qb as I4,ub as o9,vb as n9}from"./chunk-rz2wc93t.js";import{$b as m2}from"./chunk-sca5q3tt.js";import{Dd as C9,Ld as D9,Md as C4,Nd as v9,Pd as A8,Xd as V2,_d as x0,jd as u9,td as b9,ud as z2,yd as R9}from"./chunk-1acb8fwq.js";import"./chunk-z3hpstky.js";import"./chunk-0ktte40x.js";import{Le as LX}from"./chunk-12hdakw4.js";import{Me as p2,Ne as R8,Pe as X1}from"./chunk-1aw643j2.js";import"./chunk-yqpej45c.js";import{$e as q3,Te as Y2,Ue as W$,Ve as k1,We as zJ,Xe as w8,Ye as y9,Ze as B6,_e as SJ,af as A6,bf as Q2,cf as _$,df as kX,ef as F$,ff as FX,gf as K4,hf as h2,kf as h9,rf as G$}from"./chunk-jxc67ydz.js";import"./chunk-v508x7cg.js";import"./chunk-xshrj2nd.js";import"./chunk-c47db31j.js";import{Hf as kJ}from"./chunk-n4q6fvqe.js";import"./chunk-s7axaw78.js";import"./chunk-yqqeh12b.js";import{Uf as S8,Xf as o3,ag as v3,jg as fX}from"./chunk-a7gghhvn.js";import"./chunk-ektgnqmh.js";import"./chunk-8hd4vd20.js";import"./chunk-10w2pj3r.js";import{Ig as NJ,Kg as D$}from"./chunk-p2rxrxct.js";import"./chunk-zfyg3888.js";import{Xh as IX,ai as D3,bi as SX}from"./chunk-6v2hhgka.js";import"./chunk-nx8xb7dm.js";import"./chunk-96w8ay2h.js";import{ki as O2,li as b8,ni as HJ}from"./chunk-s7peh6kf.js";import{si as U$}from"./chunk-ted1hyvb.js";import"./chunk-xzfc1s6k.js";import{Ri as CX,Ui as S1}from"./chunk-r04vwtej.js";import{Wi as H3,Xi as W3,_i as _1}from"./chunk-atema2rc.js";import"./chunk-gxwkwkhp.js";import{kj as Z3}from"./chunk-b408cqg1.js";import{nj as lJ}from"./chunk-6m4sqwj0.js";import"./chunk-1xg7qx35.js";import{qj as R4}from"./chunk-xnstybjm.js";import{Wj as _J}from"./chunk-mm05y2c5.js";import{useMemoizedFn as L4}from"ahooks";import{useEffect as gK,useState as w4}from"react";import{useMemoizedFn as z$}from"ahooks";import WX from"ansi-escapes";import{Box as M1,useStdout as fK}from"ink";import{useEffect as y1,useMemo as DK,useRef as $8,useState as vK}from"react";import{useShallow as EX}from"zustand/react/shallow";import{useStore as jX}from"zustand";function U0($){return jX(Q2,$)}var hX=[],K2=()=>U0(($)=>$.session.sessionId),Y1=()=>U0(($)=>$.session.workspaceRoot),Z8=()=>U0(($)=>$.session.messages),aJ=()=>U0(($)=>$.session.clearCount),iJ=()=>U0(($)=>$.session.isCompacting),oJ=()=>U0(($)=>$.session.tokenUsage.estimatedCostUsd),nJ=()=>U0(($)=>{let{totalInputTokens:J,cacheReadTokens:X,cacheWriteTokens:Y}=$.session.tokenUsage;return rJ({totalInputTokens:J,cacheReadTokens:X,cacheWriteTokens:Y}).hitRate}),tJ=()=>U0(($)=>$.session.providerCircuit),sJ=()=>U0(($)=>$.session.providerAdmission),eJ=()=>U0(($)=>$.session.providerRetry),$9=()=>U0(($)=>$.session.providerStall),J9=()=>U0(($)=>$.session.actionStationarity),C1=()=>U0(($)=>$.session.actions),Y9=()=>U0(($)=>{let{totalTokens:J,maxContextTokens:X}=$.session.tokenUsage;if(X<=0)return 100;let Y=Math.max(0,100-J/X*100);return Math.round(Y)}),X9=()=>U0(($)=>$.app.initializationStatus),Z9=()=>U0(($)=>$.app.initializationError),Q8=()=>U0(($)=>$.app.activeModal),Q9=()=>U0(($)=>$.app.tasks),K9=()=>U0(($)=>$.app.modelEditorTarget),U9=()=>U0(($)=>$.app.sessionSelectorData),G9=()=>U0(($)=>$.app.awaitingSecondCtrlC),I1=()=>U0(($)=>$.app.actions),K8=()=>U0(($)=>$.app.sideConversation),q9=()=>U0(($)=>$.app.teams),U8=()=>U0(($)=>$.app.initializationStatus==="ready"),z9=()=>U0(($)=>$.app.tasks.length>0),U2=()=>U0(($)=>$.config.config?.permissionMode||"default"),O9=()=>U0(($)=>$.config.config?.models??hX),G8=()=>U0(($)=>{let J=$.config.config;if(!J)return;let X=J.currentModelId;return J.models.find((Z)=>Z.id===X)??J.models[0]}),q8=()=>U0(($)=>$.config.config?.currentModelId),_9=()=>U0(($)=>$.config.config?.agentTeamsEnabled===!0),k0=()=>U0(($)=>{return W$.getTheme()}),N9=()=>U0(($)=>$.config.config?.codeTheme??"default"),K$=()=>U0(($)=>$.focus.currentFocus),H9=()=>U0(($)=>$.focus.actions),G2=()=>U0(($)=>$.command.isProcessing),W9=()=>U0(($)=>$.command.actions),q2=()=>U0(($)=>$.command.pendingCommands),F9=()=>U0(($)=>$.command.recoveredSteeringCount),z8=()=>U0(($)=>$.app.reasoningEffort!=="off"),O8=()=>U0(($)=>$.app.reasoningEffort),_8=()=>U0(($)=>$.app.serviceTier),N8=()=>U0(($)=>$.app.responseVerbosity),H8=()=>U0(($)=>$.app.communicationStyle),W8=()=>U0(($)=>$.session.currentThinkingContent),L9=()=>U0(($)=>$.session.thinkingExpanded),F8=()=>U0(($)=>$.session.currentStreamingMessageId),L8=()=>U0(EX(($)=>({lines:$.session.currentStreamingLines,tail:$.session.currentStreamingTail,lineCount:$.session.currentStreamingLineCount,version:$.session.currentStreamingVersion}))),w9=()=>U0(($)=>$.session.finalizingStreamingMessageId),B9=()=>U0(($)=>$.session.historyExpanded),A9=()=>U0(($)=>$.session.expandedMessageCount);import{useMemoizedFn as O1}from"ahooks";import{useEffect as u1,useMemo as UZ,useRef as I8}from"react";function gX($,J){try{return $.code===J.code&&$.message===J.message&&$.retryable===J.retryable&&$.resource===J.resource}catch{return!1}}class B4{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((X)=>{this.handleUnexpectedFailure(X,$)})})}catch(X){this.handleUnexpectedFailure(X,$)}}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={},X=new AbortController,Y=this.wakeEpoch,Z=this.idleEpoch;if(this.attempt++,this.recoveryStartedAt===null)this.recoveryStartedAt=this.now(),this.installDeadlineTimer($);this.activeAttemptToken=J,this.activeRunController=X;let Q=await this.options.run(X.signal);if(this.disposed||$!==this.generation||this.activeAttemptToken!==J)return;if(this.activeAttemptToken=null,this.activeRunController=null,Q.status==="completed"){let K=this.wakeEpoch!==Y;if(this.clearEpisode(),K)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 X=z2($.taskFailure),Y=this.options.sessionIdentity;if($.workKind!=="pending_input"||!$.evidence||!Y||!gX($.taskFailure,$.evidence.taskFailure)){this.terminate("failed",this.attempt,X);return}let Z=M9({sessionIdentity:Y,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,X);return}this.requested=!0,this.waitingForIdle=!1;let Q={},K=this.setTimerCallback(()=>{if(this.disposed||J!==this.generation||this.retryTimer?.token!==Q)return;this.retryTimer=null,this.scheduleIfRunnable()},Z.delayMs);this.retryTimer={handle:K,token:Q},K.unref?.()}handleUnexpectedFailure($,J){if(this.disposed||J!==this.generation)return;this.terminate("failed",Math.max(1,this.attempt),z2($),"pending-resume-coordinator-failed")}installDeadlineTimer($){let J={},X=this.setTimerCallback(()=>{if(this.disposed||$!==this.generation||this.deadlineTimer?.token!==J)return;this.deadlineTimer=null,this.terminate("exhausted",Math.max(1,this.attempt),b9("timeout"),"pending-resume-recovery-deadline-exceeded")},P9);this.deadlineTimer={handle:X,token:J},X.unref?.()}terminate($,J,X,Y){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(),Y)Z?.abort(Y);try{this.options.onTerminalFailure?.({phase:$,attempt:J,taskFailure:X})}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 D2{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)w8(J,$.extraContent);y9(J)}this.options.finalizeStreamingMessage($.extraContent,$.extraThinking)}}function mX($){if(!($ instanceof Error))return"未知错误";let Y=$.lastError??$;if(Y.responseBody)try{let K=JSON.parse(Y.responseBody)?.error?.message;if(K){let U=Y.statusCode?` (HTTP ${Y.statusCode})`:"";return`${K}${U}`}}catch{}let Z=$.message.match(/Last error:\s*(.+)$/);if(Z)return Z[1];return $.message}function pX($){if(!($ instanceof Error))return!1;return $.name==="AbortError"||$.message.includes("aborted")}function xX($){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 B8($){let J=pX($),X=xX($),Y;if(X)Y="当前模型不支持图片理解功能。请切换到支持视觉能力的模型(如 Claude 4.5、GPT-5.2、Gemini 3 Pro、Qwen3-VL-Plus 等)后重试。";else Y=mX($);return{displayMessage:Y,isAbort:J,isVisionNotSupported:X}}import{appendFileSync as cX,mkdirSync as uX,writeFileSync as dX}from"node:fs";import lX from"node:os";import A4 from"node:path";var T9=null;function rX(){let $=process.env.BLADE_STORAGE_ROOT||A4.join(lX.homedir(),".blade");return A4.join($,"logs","stream-debug.log")}function aX($){if(T9===$)return;let J=A4.dirname($);uX(J,{recursive:!0,mode:493}),dX($,`=== Stream Debug Log Started: ${new Date().toISOString()} ===
|
|
2
|
-
`),T9=$}function b4($,J,X){try{let Y=rX();aX(Y);let Z=new Date().toISOString(),Q=X?` | ${JSON.stringify(X)}`:"",K=`[${Z}] [${$}] ${J}${Q}
|
|
3
|
-
`;cX(Y,K)}catch{}}var v2=S1("UI");function M4($,J){if(J.state==="requires_attention"){let X=J.reason==="interrupted_tool_call";$.addToolMessage("Turn recovery requires attention",{toolName:"Runtime Recovery",phase:"complete",summary:X?"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 k9($,J){let X=$.streamSession??new D2({signal:$.signal,streamingBuffer:$.streamingBuffer,getStreamingMessageId:$.getStreamingMessageId,finalizeStreamingMessage:$.sessionActions.finalizeStreamingMessage,discardStreamingMessage:$.sessionActions.discardStreamingMessage,clearThinking:()=>$.sessionActions.setCurrentThinkingContent(null)});return(Y)=>{switch(Y.kind){case"content_delta":if(Y.delta.length>0)J.outputStarted=!0;if(!X.acceptsDeltas())break;J.contentDeltaCount++,J.contentDeltaTotalLen+=Y.delta.length,b4("loopEventHandler","onContentDelta",{callCount:J.contentDeltaCount,deltaLen:Y.delta.length,totalLen:J.contentDeltaTotalLen}),$.streamingBuffer.batchAppendContent(Y.delta);break;case"thinking_delta":if(Y.delta.length>0)J.outputStarted=!0;if(!X.acceptsDeltas())break;if($.thinkingModeEnabled)$.streamingBuffer.batchAppendThinking(Y.delta);break;case"stream_end":{$.sessionActions.setProviderCircuit(null),$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),v2.debug("[loopEventHandler] stream_end",{contentDeltaCount:J.contentDeltaCount,contentDeltaTotalLen:J.contentDeltaTotalLen,streamFinalized:X.isFinalized,signalAborted:$.signal.aborted}),b4("loopEventHandler","onStreamEnd",{contentDeltaCallCount:J.contentDeltaCount,contentDeltaTotalLen:J.contentDeltaTotalLen,streamFinalized:X.isFinalized,signalAborted:$.signal.aborted}),X.finalize();break}case"model_fallback":$.sessionActions.setProviderAdmission(null),$.sessionActions.setProviderCircuit(null),$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),X.discard();break;case"provider_admission":{let{kind:Z,...Q}=Y;$.sessionActions.setProviderAdmission(Y.phase==="queued"?Q:null);break}case"provider_circuit":{let{kind:Z,...Q}=Y;$.sessionActions.setProviderCircuit(Y.phase==="closed"?null:Q);break}case"provider_retry":{let{kind:Z,...Q}=Y;$.sessionActions.setProviderRetry(Y.phase==="recovered"?null:Q);break}case"provider_stall":{let{kind:Z,...Q}=Y;$.sessionActions.setProviderStall(Y.phase==="detected"?Q:null);break}case"action_stationarity":{let{kind:Z,...Q}=Y;$.sessionActions.setActionStationarity(Y.phase==="recovered"?null:Q);break}case"turn_recovery":{M4($.sessionActions,Y.assessment);break}case"tool_start":{J.toolExecutionStarted=!0;let Z=Y.toolCall;if(!("function"in Z))break;if(Z.function.name===A8)break;if(v2.debug("[loopEventHandler] tool_start",{toolName:Z.function.name,toolKind:Y.toolKind}),["TaskCreate","TaskUpdate","TaskList"].includes(Z.function.name))break;try{let Q=JSON.parse(Z.function.arguments),K=I9(Z.function.name,Q);$.sessionActions.addToolMessage(K,{toolCallId:Z.id,toolName:Z.function.name,phase:"start",summary:K,params:Q})}catch(Q){v2.error("[loopEventHandler] onToolStart error:",Q)}break}case"tool_progress":{J.toolExecutionStarted=!0;let Z=Y.toolCall;if(!("function"in Z))break;if(Z.function.name===A8)break;let Q=Y.update.total!==void 0?` ${Math.max(0,Math.min(100,Math.round((Y.update.progress??0)/Y.update.total*100)))}%`:"",K=`${Z.function.name}${Q}: ${Y.update.message}`;$.sessionActions.addToolMessage(K,{toolCallId:Z.id,toolName:Z.function.name,phase:"progress",summary:K,...Y.update.admission?{admission:Y.update.admission}:{}});break}case"tool_result":{J.toolExecutionStarted=!0;let Z=Y.toolCall;if(!("function"in Z))break;if(Z.function.name===A8)break;v2.debug("[loopEventHandler] tool_result",{toolName:Z.function.name,success:Y.result.success});let Q=C9(S9(Z.function.name,Y.result),R9);$.sessionActions.addToolMessage(Q.summary,{toolCallId:Z.id,toolName:Z.function.name,phase:"complete",summary:Q.summary,detail:Q.detail});break}case"structured_output":J.outputStarted=!0,$.sessionActions.replaceLastAssistantMessage(JSON.stringify(Y.output,null,2));break;case"token_usage":$.sessionActions.updateTokenUsage(Y.usage);break;case"compaction":if($.sessionActions.setCompacting(Y.phase==="start"),Y.phase==="end"){if($.sessionActions.resetContextUsage(),Y.outcome!=="failed")J.compactionCount=(J.compactionCount??0)+1}break;case"turn_start":v2.debug("[loopEventHandler] turn_start",{turn:Y.turn,maxTurns:Y.maxTurns}),$.sessionActions.updateTokenUsage({turnCount:Y.turn}),$.sessionActions.setProviderCircuit(null),$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),X.startTurn();break;case"task_update":$.appActions.setTasks(Y.tasks);break;case"goal_frontier_updated":$.appActions.setTasks(Y.tasks);break;case"mcp_catalog_changed":{let Z=`MCP catalog r${Y.revision}: +${Y.added.length} -${Y.removed.length} ~${Y.updated.length}`;$.sessionActions.addToolMessage(Z,{toolName:"MCP Catalog",phase:"complete",summary:Z,detail:[Y.added.length>0?`Added: ${Y.added.join(", ")}`:"",Y.removed.length>0?`Removed: ${Y.removed.join(", ")}`:"",Y.updated.length>0?`Updated: ${Y.updated.join(", ")}`:""].filter(Boolean).join(`
|
|
4
|
-
`)});break}case"mcp_content_changed":{let Z=`MCP ${Y.contentKind} r${Y.revision}: +${Y.added.length} -${Y.removed.length} ~${Y.updated.length}`;$.sessionActions.addToolMessage(Z,{toolName:"MCP Content",phase:"complete",summary:Z,detail:[Y.added.length>0?`Added: ${Y.added.join(", ")}`:"",Y.removed.length>0?`Removed: ${Y.removed.join(", ")}`:"",Y.updated.length>0?`Updated: ${Y.updated.join(", ")}`:""].filter(Boolean).join(`
|
|
5
|
-
`)});break}case"mcp_resource_updated":{let Z=`MCP resource updated: ${Y.uri}`;$.sessionActions.addToolMessage(Z,{toolName:"MCP Resource",phase:"progress",summary:Z,detail:`${Y.serverName} · revision ${Y.revision}`});break}case"mcp_connection_changed":{let Z=Y.phase==="reconnecting"?"recovering":Y.phase==="recovered"?"recovered":"recovery failed",Q=`MCP ${Y.serverName} ${Z}`+(Y.phase==="reconnecting"?` (${Y.attempt}/${Y.maxAttempts})`:"");$.sessionActions.addToolMessage(Q,{toolName:"MCP Connection",phase:"complete",summary:Q,detail:[`reason: ${Y.reason}`,`revision: ${Y.revision}`,Y.error?`error: ${Y.error}`:""].filter(Boolean).join(`
|
|
6
|
-
`)});break}case"mcp_log":{let Z=Y.logger?`${Y.serverName} · ${Y.logger}`:Y.serverName,Q=`MCP ${Y.level} · ${Z}`;$.sessionActions.addToolMessage(Q,{toolName:"MCP Log",phase:"complete",summary:Q,detail:[Y.message,`revision: ${Y.revision}`,`sha256: ${Y.dataSha256}`,Y.truncated?"truncated: true":"",Y.detailsOmitted?"details omitted by runtime policy":""].filter(Boolean).join(`
|
|
7
|
-
`)});break}case"mcp_instructions_changed":{let Z=`MCP instructions ${Y.action}: ${Y.serverName}`+(Y.truncated?" (truncated)":"");$.sessionActions.addToolMessage(Z,{toolName:"MCP Instructions",phase:"complete",summary:Z,detail:[Y.text??"",Y.sha256?`sha256: ${Y.sha256}`:"",Y.detailsOmitted?"details omitted by runtime policy":""].filter(Boolean).join(`
|
|
8
|
-
`)});break}case"mcp_task_changed":{let Z=`MCP task ${Y.status}: ${Y.taskId} (${Y.serverName}/${Y.toolName})`;$.sessionActions.addToolMessage(Z,{toolName:"MCP Task",phase:"complete",summary:Z,detail:[Y.statusMessage??"",`revision: ${Y.revision}`,Y.hasResult?"result available via TaskOutput":"",Y.error?`error: ${Y.error}`:""].filter(Boolean).join(`
|
|
9
|
-
`)});break}case"project_rules_loaded":{let Z=`Project rules loaded: ${Y.files.length}`+(Y.blockedWrite?" (write retry required)":"");$.sessionActions.addToolMessage(Z,{toolName:"Project Rules",phase:"complete",summary:Z,detail:Y.files.map((Q)=>`${Q.relativePath} ${Q.source} sha256=${Q.contentSha256}`).join(`
|
|
10
|
-
`)});break}case"steering_applied":for(let Z=0;Z<Y.count;Z++)$.commandActions.dequeueCommand();if(Y.recovered>0)$.commandActions.setRecoveredSteeringCount(Y.recovered);break;case"follow_up_started":for(let Z of Y.messages){if(!Z.recovered||Z.persisted)continue;let Q=typeof Z.content==="string"?Z.content:Z.content.map((K)=>K.type==="text"?K.text:"[Image]").join(`
|
|
11
|
-
`);$.sessionActions.addUserMessage(Q)}if(Y.recovered>0)$.commandActions.setRecoveredSteeringCount(Y.recovered);break;case"goal_updated":case"goal_continuation_started":break;case"subagent_spawned":case"subagent_completed":break;default:{let Z=Y}}}}function y4($){let{text:J,parts:X}=$,Y=X.filter((K)=>K.type==="image");if(Y.length===0)return J;if(Y.length>O2)throw Error(`最多只能发送 ${O2} 张图片`);if(Y.reduce((K,U)=>K+`data:${U.mimeType};base64,`.length+U.base64.length,0)>b8)throw Error("图片编码后总大小不能超过 5 MiB");let Q=[];for(let K of X)if(K.type==="text")Q.push({type:"text",text:K.text});else Q.push({type:"image_url",image_url:{url:`data:${K.mimeType};base64,${K.base64}`}});return Q}function f9($){let J=v9($.metadata);return{role:$.role,content:J?D9(J):$.content,...$.metadata?{metadata:$.metadata}:{}}}function P8($){if(!$.restoredContextMessages||$.restoredVisibleMessageCount<=0)return $.messages.map(f9);let J=$.messages.slice($.restoredVisibleMessageCount).map(f9);return[...$.restoredContextMessages,...J]}import iX from"node:path";function V9($){if($.length<=8)return $;return`${$.slice(0,8)}…`}function oX($){return iX.resolve($)}function j9($){if(!$||!h9($))return;_$().config.actions.updateConfig({currentModelId:$})}function E9($){if(!$)return;_$().config.actions.updateConfig({permissionMode:$})}async function M8($,J){return x0.listSessions({includeSubagents:!1})}async function y8($,J,X,Y){let{intent:Z,session:Q,newSessionId:K,announceFork:U,permissionModeOverride:G}=$,q=oX(Q.projectPath);if(Z==="fork"){let W=await x0.forkSession(Q.sessionId,{...K?{newSessionId:K}:{},sourceProjectPath:q,targetProjectPath:q}),F=await x0.loadSessionModelContext(W.sessionId,W.metadata.projectPath),N=[...x0.toUISafeMessages(W.messages)];if(U!==!1){let w=Date.parse(W.metadata.lastMessageTime);N.push({id:"fork-announcement-"+W.sessionId,role:"assistant",content:"Forked "+V9(Q.sessionId)+" → "+V9(W.sessionId),timestamp:Number.isNaN(w)?0:w})}return await Y(),E9(G??W.metadata.permissionMode),j9(W.metadata.selectedModelId),X.restoreSession(W.sessionId,N,F,W.metadata.projectPath),{sessionId:W.sessionId,messages:F}}await x0.assertSessionWritable(Q.sessionId,Q.projectPath);let[_,z]=await Promise.all([x0.loadSession(Q.sessionId,Q.projectPath),x0.loadSessionModelContext(Q.sessionId,Q.projectPath)]),O=x0.toUISafeMessages(_);return await Y(),E9(G??Q.permissionMode),j9(Q.selectedModelId),X.restoreSession(Q.sessionId,O,z,Q.projectPath),{sessionId:Q.sessionId,messages:z}}function g9($){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 nX($){return typeof $==="object"&&$!==null&&$.action==="invoke_skill"&&typeof $.skillName==="string"}function tX($){return typeof $==="object"&&$!==null&&$.action==="invoke_custom_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function sX($){return typeof $==="object"&&$!==null&&$.action==="invoke_plugin_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function eX($){return typeof $==="object"&&$!==null&&$.action==="invoke_once_model"&&typeof $.modelId==="string"&&typeof $.prompt==="string"}function $Z($){return typeof $==="object"&&$!==null&&["start_goal","resume_goal"].includes(String($.action))&&typeof $.goal?.objective==="string"}function JZ($){return typeof $==="object"&&$!==null&&$.action==="rewind_session"&&typeof $.sessionId==="string"&&Array.isArray($.messages)&&Array.isArray($.visibleMessages)}function YZ($){if(typeof $!=="object"||$===null)return!1;let J=$.intent;if(J!=="resume"&&J!=="fork")return!1;let X=$.action;if(X==="select_session"){let Y=$.sessions;return Array.isArray(Y)&&Y.every((Z)=>g9(Z))}if(X==="activate_session")return g9($.session);return!1}function XZ($,J,X,Y){switch($){case"show_theme_selector":return X.setActiveModal("themeSelector"),!0;case"show_model_selector":return X.setActiveModal("modelSelector"),!0;case"show_model_add_wizard":return X.setActiveModal("modelAddWizard"),!0;case"show_permissions_manager":return X.setActiveModal("permissionsManager"),!0;case"show_agents_manager":return X.setActiveModal("agentsManager"),!0;case"show_skills_manager":return X.setActiveModal("skillsManager"),!0;case"show_hooks_manager":return X.setActiveModal("hooksManager"),!0;case"show_plugins_manager":return X.setActiveModal("pluginsManager"),!0;case"show_agent_creation_wizard":return X.setActiveModal("agentCreationWizard"),!0;case"show_session_selector":{let Z=J?.sessions;return X.showSessionSelector(Z??[],"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 Y.restoreSession(Z.sessionId,Z.visibleMessages,Z.messages),!0}case"session_archived":{let Z=J?.session;return Y.addAssistantMessage(Z?`会话 ${Z.sessionId} 已归档。`:"当前会话已归档。"),X1(0),!0}case"clear_screen":return Y.clearMessages(),Y.setError(null),Y.resetTokenUsage(),X.setTasks([]),!0;case"compact_completed":case"compact_fallback":{let Z=J,Q=Z?.compactedMessages;if(Q)Y.setCompactedContext(Q);if(Z?.usage)Y.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 Y.resetContextUsage(),!0}case"exit_application":return X1(0),!0;default:return!1}}async function T4($,J,X,Y,Z,Q,K,U,G,q,_,z,O,W,F=U$(),N){let{text:w}=$;if(!m9(w))return{type:"not_slash"};let H=await p9(w,{cwd:F,surface:"tui",workspaceRoot:F,sessionId:Q,messages:K,rewind:U,lifecycle:Q===void 0?void 0:{archiveCurrent:async()=>{return await Z(),x0.archiveSession(Q,F)}},subagents:G,mcp:q,reasoning:_,serviceTier:z,responseVerbosity:O,communicationStyle:W,codeReview:N,signal:Y});if(H.success&&YZ(H.data)){if(H.data.action==="select_session")return J.showSessionSelector(H.data.sessions,H.data.intent),{type:"handled",commandResult:{success:!0}};return await y8(H.data,F,X,Z),{type:"handled",commandResult:{success:!0}}}if(H.success&&JZ(H.data))return X.restoreSession(H.data.sessionId,H.data.visibleMessages,H.data.messages),J.setTasks([]),{type:"handled",commandResult:{success:!0}};if(H.message){if(XZ(H.message,H.data,J,X))return{type:"handled",commandResult:{success:!0}}}if(nX(H.data)){let{skillName:y,skillArgs:A}=H.data,B=A?`Please use the "${y}" skill to help me with: ${A}`:`Please use the "${y}" skill.`;return X.addUserMessage(B),{type:"continue_as_agent",result:{userDisplayMessage:B,agentInput:{displayText:B,text:B,images:[],parts:[{type:"text",text:B}]},userMessageAlreadyAdded:!0}}}if(tX(H.data)){let{commandName:y,processedContent:A}=H.data;X.addUserMessage(w);let B=`# Custom Command: /${y}
|
|
12
|
-
|
|
13
|
-
The user has invoked the custom command "/${y}". Follow the instructions below to complete the task.
|
|
14
|
-
|
|
15
|
-
---
|
|
16
|
-
|
|
17
|
-
${A}
|
|
18
|
-
|
|
19
|
-
---
|
|
20
|
-
|
|
21
|
-
Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:w,agentInput:{displayText:w,text:B,images:[],parts:[{type:"text",text:B}]},userMessageAlreadyAdded:!0}}}if(sX(H.data)){let{commandName:y,pluginName:A,processedContent:B}=H.data;X.addUserMessage(w);let b=`# Plugin Command: /${y}
|
|
22
|
-
|
|
23
|
-
The user has invoked the plugin command "/${y}" from plugin "${A}". Follow the instructions below to complete the task.
|
|
24
|
-
|
|
25
|
-
---
|
|
26
|
-
|
|
27
|
-
${B}
|
|
28
|
-
|
|
29
|
-
---
|
|
30
|
-
|
|
31
|
-
Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:w,agentInput:{displayText:w,text:b,images:[],parts:[{type:"text",text:b}]},userMessageAlreadyAdded:!0}}}if(eX(H.data)){let{modelId:y,prompt:A}=H.data;return X.addUserMessage(A),{type:"continue_as_agent",result:{userDisplayMessage:A,agentInput:{displayText:A,text:A,images:[],parts:[{type:"text",text:A}]},userMessageAlreadyAdded:!0,onceModelId:y}}}if($Z(H.data)){let y=H.data.goal.objective;return X.addUserMessage(w),{type:"continue_as_agent",result:{userDisplayMessage:w,agentInput:{displayText:w,text:y,images:[],parts:[{type:"text",text:y}]},userMessageAlreadyAdded:!0,goalContinuationOnly:!0}}}if(!H.success&&H.error)return X.addAssistantMessage(`${H.error}`),{type:"handled",commandResult:{success:H.success,output:H.message,error:H.error,metadata:H.data}};let C=H.message;if(H.success&&typeof C==="string"&&C.trim()!=="")X.addAssistantMessage(C);return{type:"handled",commandResult:{success:H.success,output:H.message,error:H.error,metadata:H.data}}}import{useMemoizedFn as g0}from"ahooks";import{useEffect as ZZ,useRef as z1}from"react";function QZ($,J){return $.sessionId===J.sessionId&&$.workspaceRoot===J.workspaceRoot}function x9($,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 d9=new WeakSet;function f$(){let $=new DOMException("TUI Agent lifecycle was invalidated","AbortError");return d9.add($),$}function c9($){return typeof $==="object"&&$!==null&&d9.has($)}function l9($){let J=z1(void 0),X=z1(void 0),Y=z1(void 0),Z=z1(void 0),Q=z1(0),K=z1(!1),U=z1(void 0),G=z1(void 0),q=z1(void 0),_=(M)=>{let k=q.current;if(k?.agent===M)return k.promise;let E={agent:M,promise:Promise.resolve()};return E.promise=Promise.resolve().then(()=>M.destroy()).finally(()=>{if(q.current===E)q.current=void 0}),q.current=E,E.promise},z=g0(()=>{Q.current++;let M=U.current;if(M)M.invalidated=!0;let k=G.current;if(k)k.invalidated=!0;if(Z.current)return Z.current.promise;let E=J.current,x=X.current;J.current=void 0,X.current=void 0,Y.current=void 0;let n=G.current,H0=U.current,y0=q.current?.promise,j0,z0=(async()=>{let O0,r0=async(S0)=>{if(!S0)return;try{await S0}catch(a0){if(!c9(a0))O0??=a0}};if(await r0(n?.promise),n?.cleanupError!==void 0)O0??=n.cleanupError;if(await r0(y0),E)await r0(_(E));if(await r0(H0?.promise),H0?.cleanupError!==void 0)O0??=H0.cleanupError;if(x)await r0(x.dispose());if(O0!==void 0)throw O0})();j0={promise:z0},Z.current=j0;let A0=()=>{if(Z.current===j0)Z.current=void 0};return z0.then(A0,A0),z0}),O=g0(async(M)=>{let k=Z.current;if(k){if(await k.promise,!K.current)throw f$();return O(M)}let E=$.workspaceRoot??X.current?.workspaceRoot??U$(),x={sessionId:M,workspaceRoot:E};if(!K.current)throw f$();let n=U.current;if(n&&!n.invalidated&&n.generation===Q.current&&QZ(n.target,x))return n.promise;if(n){let z0=z(),A0=Q.current;if(await z0,!K.current||Q.current!==A0)throw f$();return O(M)}if(X.current&&(X.current.sessionId!==M||X.current.workspaceRoot!==E)){let z0=z(),A0=Q.current;if(await z0,!K.current||Q.current!==A0)throw f$();return O(M)}if(!K.current)throw f$();if(X.current)return X.current;let H0=Q.current,y0,j0=Promise.resolve().then(async()=>{let z0,A0=()=>{if(!K.current||y0.invalidated||Q.current!==H0||U.current!==y0)throw f$()};try{A0();let O0=await x0.findSessionMetadata(M,E);A0();let r0=O0!==void 0&&(await x0.loadSession(M,E)).length>0;A0(),z0=await g$.create({sessionId:M,workspaceRoot:E,modelId:$.modelId,permissionMode:$.permissionMode??O0?.permissionMode,reasoningEffort:O0?.reasoningEffort??$.reasoningEffort,serviceTier:O0?.serviceTier??$.serviceTier,responseVerbosity:O0?.responseVerbosity??$.responseVerbosity,communicationStyle:O0?.communicationStyle??$.communicationStyle,communicationStyleDigest:O0?.communicationStyleDigest,agents:$.agents,...r0?{sessionStart:{isResume:!0,resumeSessionId:M}}:{}}),A0();let S0={sessionId:M,modelId:O0?.selectedModelId,permissionMode:O0?.permissionMode,reasoningEffort:O0?.reasoningEffort,serviceTier:O0?.serviceTier,responseVerbosity:O0?.responseVerbosity,communicationStyle:O0?.communicationStyle,communicationStyleDigest:O0?.communicationStyleDigest},a0=z0.getReasoningConfiguration().selection,p0=z0.getServiceTierConfiguration().selection,A$=z0.getResponseVerbosityConfiguration().selection,i0=z0.getCommunicationStyleConfiguration().selection;return A0(),F$().setReasoningEffort(a0),F$().setServiceTier(p0),F$().setResponseVerbosity(A$),F$().setCommunicationStyle(i0),A0(),X.current=z0,Y.current=S0,z0}catch(O0){if(z0&&X.current!==z0)await z0.dispose().catch((r0)=>{y0.cleanupError??=r0});if(y0.invalidated||Q.current!==H0||!K.current)throw f$();throw O0}finally{if(U.current===y0)U.current=void 0}});return y0={generation:H0,target:x,invalidated:!1,promise:j0},U.current=y0,j0}),W=async(M,k,E,x,n)=>{let H0;if(E&&k){let y0=M?.modelId??$.modelId,j0=M?.reasoningEffort??(x?$.reasoningEffort:E.getReasoningConfiguration().selection),z0=M?.serviceTier??(x?$.serviceTier:E.getServiceTierConfiguration().selection),A0=M?.responseVerbosity??(x?$.responseVerbosity:E.getResponseVerbosityConfiguration().selection),O0=M?.communicationStyle??(x?$.communicationStyle:E.getCommunicationStyleConfiguration().selection),r0=E.getCurrentModelId(),S0=E.getReasoningConfiguration(),a0=E.getServiceTierConfiguration(),p0=E.getResponseVerbosityConfiguration(),A$=E.getCommunicationStyleConfiguration();if($.permissionMode&&(Y.current?.sessionId!==k||Y.current.permissionMode!==$.permissionMode)){let e0=await x0.setSessionPermissionMode(k,E.workspaceRoot,$.permissionMode);n(),Y.current={...Y.current,sessionId:k,permissionMode:e0.permissionMode}}await E.refresh({modelId:y0,...j0?{reasoningEffort:j0}:{},...z0?{serviceTier:z0}:{},...A0?{responseVerbosity:A0}:{},...O0?{communicationStyle:O0}:{}}),n();let i0=E.getCommunicationStyleConfiguration();if(i0.source!=="built-in"&&!i0.contentSha256)throw Error("Custom communication style has no provenance");let H$={...y0&&y0!=="inherit"&&(Y.current?.sessionId!==k||Y.current.modelId!==y0)?{selectedModelId:y0}:{},...j0&&(Y.current?.sessionId!==k||Y.current.reasoningEffort!==j0)?{reasoningEffort:j0}:{},...z0&&(Y.current?.sessionId!==k||Y.current.serviceTier!==z0)?{serviceTier:z0}:{},...A0&&(Y.current?.sessionId!==k||Y.current.responseVerbosity!==A0)?{responseVerbosity:A0}:{},...O0&&(Y.current?.sessionId!==k||Y.current.communicationStyle!==O0||Y.current.communicationStyleDigest!==i0.contentSha256)?{communicationStyle:O0,communicationStyleDigest:i0.source==="built-in"?null:i0.contentSha256}:{}};if(Object.keys(H$).length>0)try{let e0=await x0.updateSessionMetadata(k,E.workspaceRoot,H$);n(),Y.current={sessionId:k,modelId:e0.selectedModelId,permissionMode:e0.permissionMode,reasoningEffort:e0.reasoningEffort,serviceTier:e0.serviceTier,responseVerbosity:e0.responseVerbosity,communicationStyle:e0.communicationStyle,communicationStyleDigest:e0.communicationStyleDigest}}catch(e0){if(c9(e0))throw e0;throw await E.refresh({...r0?{modelId:r0}:{},reasoningEffort:S0.selection,serviceTier:a0.selection,responseVerbosity:p0.selection,communicationStyle:A$.selection}).catch(()=>{return}),e0}H0=await j2.createWithRuntime(E,{sessionId:k,systemPrompt:M?.systemPrompt??$.systemPrompt,appendSystemPrompt:M?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:M?.maxTurns??$.maxTurns,modelId:M?.modelId??$.modelId,permissionMode:M?.permissionMode??$.permissionMode,agents:$.agents})}else H0=await j2.create({systemPrompt:M?.systemPrompt??$.systemPrompt,appendSystemPrompt:M?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:M?.maxTurns??$.maxTurns,modelId:M?.modelId??$.modelId,permissionMode:M?.permissionMode??$.permissionMode,agents:$.agents});return H0},F=g0(async(M)=>{let k=Z.current;if(k){if(await k.promise,!K.current)throw f$();return F(M)}if(!K.current)throw f$();let E=M?.sessionId??$.sessionId,x=!!M?.modelId&&M.modelId!==$.modelId,n=X.current,H0={factory:!x&&E?"session":"standalone",sessionId:E,workspaceRoot:!x&&E?$.workspaceRoot??n?.workspaceRoot??U$():$.workspaceRoot??U$(),runtime:!x&&E&&n&&n.sessionId===E&&n.workspaceRoot===($.workspaceRoot??n.workspaceRoot)?n:void 0,systemPrompt:M?.systemPrompt??$.systemPrompt,appendSystemPrompt:M?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:M?.maxTurns??$.maxTurns,modelId:M?.modelId??$.modelId,permissionMode:M?.permissionMode??$.permissionMode,reasoningEffort:M?.reasoningEffort??$.reasoningEffort,serviceTier:M?.serviceTier??$.serviceTier,responseVerbosity:M?.responseVerbosity??$.responseVerbosity,communicationStyle:M?.communicationStyle??$.communicationStyle,agents:$.agents},y0=G.current;if(y0){if(!y0.invalidated&&y0.generation===Q.current&&x9(y0.target,H0))return y0.promise;y0.invalidated=!0,Q.current++;let H$=Q.current;if(await y0.promise.catch(()=>{return}),y0.cleanupError!==void 0)throw y0.cleanupError;if(!K.current||Q.current!==H$)throw f$();return F(M)}let j0=X.current!==void 0,z0=!x&&E?await O(E):void 0;if(!K.current||z0!==void 0&&X.current!==z0)throw f$();let A0={factory:z0?"session":"standalone",sessionId:E,workspaceRoot:z0?.workspaceRoot??$.workspaceRoot??U$(),runtime:z0,systemPrompt:M?.systemPrompt??$.systemPrompt,appendSystemPrompt:M?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:M?.maxTurns??$.maxTurns,modelId:M?.modelId??$.modelId,permissionMode:M?.permissionMode??$.permissionMode,reasoningEffort:M?.reasoningEffort??$.reasoningEffort,serviceTier:M?.serviceTier??$.serviceTier,responseVerbosity:M?.responseVerbosity??$.responseVerbosity,communicationStyle:M?.communicationStyle??$.communicationStyle,agents:$.agents},O0=G.current;if(O0&&!O0.invalidated&&O0.generation===Q.current&&x9(O0.target,A0))return O0.promise;if(O0){O0.invalidated=!0,Q.current++;let i0=Q.current;if(await O0.promise.catch(()=>{return}),O0.cleanupError!==void 0)throw O0.cleanupError;if(!K.current||Q.current!==i0)throw f$();return F(M)}let r0=Q.current,S0=J.current,a0;if(S0)J.current=void 0,a0=_(S0);let p0,A$=Promise.resolve().then(async()=>{let i0,H$=()=>{if(!K.current||p0.invalidated||Q.current!==r0||G.current!==p0||z0!==void 0&&X.current!==z0)throw f$()};try{if(H$(),a0){try{await a0}catch(e0){throw p0.cleanupError??=e0,H$(),e0}H$()}return i0=await W(M,E,z0,j0,H$),H$(),J.current=i0,i0}catch(e0){if(i0&&J.current!==i0)await _(i0).catch((c1)=>{p0.cleanupError??=c1});if(p0.invalidated||Q.current!==r0||!K.current)throw f$();throw e0}finally{if(G.current===p0)G.current=void 0}});return p0={generation:r0,target:A0,invalidated:!1,promise:A$},G.current=p0,A$}),N=g0(async()=>{if(!$.sessionId)throw Error("No active session to rewind");return(await O($.sessionId)).listRewindCheckpoints()}),w=g0(async(M)=>{if(!$.sessionId)throw Error("No active session to rewind");let E=await(await O($.sessionId)).rewindSession(M);return await z(),E}),R=g0(async()=>{if(!$.sessionId)throw Error("No active session for subagent control");return(await O($.sessionId)).listSubagents()}),H=g0(async(M,k)=>{if(!$.sessionId)throw Error("No active session for subagent control");let E=await O($.sessionId),x=!1,n,H0=M,y0=(z0)=>{let A0=z0.status==="completed"?z0.result?.message:z0.result?.error||z0.result?.message;Q2.getState().app.actions.completeSubagentProgress(H0,z0.status==="completed",A0)},j0=E.resumeSubagent({agentId:M,prompt:k,onEvent:(z0)=>{if(z0.kind==="tool_start"&&"function"in z0.toolCall)Q2.getState().app.actions.updateSubagentTool(H0,z0.toolCall.function.name)},onCompleted:(z0)=>{if(x)y0(z0);else n=z0}});if(H0=j0.session.id,Q2.getState().app.actions.startSubagentProgress(j0.session.id,j0.session.subagentType,`Resumed from ${j0.source.id}: ${j0.session.description}`),x=!0,n)y0(n);return j0}),C=g0(async()=>{if(!$.sessionId)throw Error("No active session for MCP content");return(await O($.sessionId)).getMcpContentCatalog()}),y=g0(async(M)=>{if(!$.sessionId)throw Error("No active session for MCP content");await(await O($.sessionId)).refreshMcpContentCatalogs(M)}),A=g0(async(M,k,E)=>{if(!$.sessionId)throw Error("No active session for MCP prompts");return(await O($.sessionId)).getMcpPrompt(M,k,E)}),B=g0(async(M,k,E)=>{if(!$.sessionId)throw Error("No active session for MCP completion");return(await O($.sessionId)).completeMcpArgument(M,k,E)}),b=g0(async(M,k={})=>{if(!$.sessionId)throw Error("No active session for MCP logs");return(await O($.sessionId)).getMcpLogs(M,k)}),L=g0(async(M)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await O($.sessionId)).listMcpTasks(M)}),D=g0(async(M)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await O($.sessionId)).getMcpTask(M)}),T=g0(async(M,k)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await O($.sessionId)).cancelMcpTask(M,k)}),S=g0(async(M,k)=>{if(!$.sessionId)throw Error("No active session for MCP logging");await(await O($.sessionId)).setMcpLoggingLevel(M,k)}),P=g0(async()=>{if(!$.sessionId)throw Error("No active session for MCP instructions");return(await O($.sessionId)).getMcpInstructions()}),v=g0(async()=>{if(!$.sessionId)throw Error("No active session for reasoning effort");return(await O($.sessionId)).getReasoningConfiguration()}),i=g0(async(M)=>{if(!$.sessionId)throw Error("No active session for reasoning effort");let k=await O($.sessionId);if(k.hasTurnOwner())throw Error("Cannot switch reasoning effort while a turn is active");let E=k.getReasoningConfiguration();if(k.resolveReasoningConfiguration(M),E.selection===M)return E;await k.refresh({reasoningEffort:M});try{let x;try{x=await x0.updateSessionMetadata($.sessionId,k.workspaceRoot,{reasoningEffort:M})}catch(n){if(!(n instanceof V2)&&n.code!=="ENOENT")throw n;x=await x0.createSessionMetadata($.sessionId,k.workspaceRoot,{taskStatus:"completed",selectedModelId:k.getCurrentModelId(),reasoningEffort:M,serviceTier:k.getServiceTierConfiguration().selection,responseVerbosity:k.getResponseVerbosityConfiguration().selection,communicationStyle:k.getCommunicationStyleConfiguration().selection})}return Y.current={sessionId:$.sessionId,modelId:x.selectedModelId,permissionMode:x.permissionMode,reasoningEffort:x.reasoningEffort,serviceTier:x.serviceTier,responseVerbosity:x.responseVerbosity,communicationStyle:x.communicationStyle,communicationStyleDigest:x.communicationStyleDigest},F$().setReasoningEffort(M),k.getReasoningConfiguration()}catch(x){throw await k.refresh({reasoningEffort:E.selection}),x}}),s=g0(async()=>{if(!$.sessionId)throw Error("No active session for service tier");return(await O($.sessionId)).getServiceTierConfiguration()}),u=g0(async(M)=>{if(!$.sessionId)throw Error("No active session for service tier");let k=await O($.sessionId);if(k.hasTurnOwner())throw Error("Cannot switch service tier while a turn is active");let E=k.getServiceTierConfiguration();if(k.resolveServiceTierConfiguration(M),E.selection===M)return E;await k.refresh({serviceTier:M});try{let x;try{x=await x0.updateSessionMetadata($.sessionId,k.workspaceRoot,{serviceTier:M})}catch(n){if(!(n instanceof V2)&&n.code!=="ENOENT")throw n;x=await x0.createSessionMetadata($.sessionId,k.workspaceRoot,{taskStatus:"completed",selectedModelId:k.getCurrentModelId(),reasoningEffort:k.getReasoningConfiguration().selection,serviceTier:M,responseVerbosity:k.getResponseVerbosityConfiguration().selection,communicationStyle:k.getCommunicationStyleConfiguration().selection})}return Y.current={sessionId:$.sessionId,modelId:x.selectedModelId,permissionMode:x.permissionMode,reasoningEffort:x.reasoningEffort,serviceTier:x.serviceTier,responseVerbosity:x.responseVerbosity,communicationStyle:x.communicationStyle,communicationStyleDigest:x.communicationStyleDigest},F$().setServiceTier(M),k.getServiceTierConfiguration()}catch(x){throw await k.refresh({serviceTier:E.selection}),x}}),_0=g0(async()=>{if(!$.sessionId)throw Error("No active session for response verbosity");return(await O($.sessionId)).getResponseVerbosityConfiguration()}),m=g0(async(M)=>{if(!$.sessionId)throw Error("No active session for response verbosity");let k=await O($.sessionId);if(k.hasTurnOwner())throw Error("Cannot switch response verbosity while a turn is active");let E=k.getResponseVerbosityConfiguration();if(k.resolveResponseVerbosityConfiguration(M),E.selection===M)return E;await k.refresh({responseVerbosity:M});try{let x;try{x=await x0.updateSessionMetadata($.sessionId,k.workspaceRoot,{responseVerbosity:M})}catch(n){if(!(n instanceof V2)&&n.code!=="ENOENT")throw n;x=await x0.createSessionMetadata($.sessionId,k.workspaceRoot,{taskStatus:"completed",selectedModelId:k.getCurrentModelId(),reasoningEffort:k.getReasoningConfiguration().selection,serviceTier:k.getServiceTierConfiguration().selection,responseVerbosity:M,communicationStyle:k.getCommunicationStyleConfiguration().selection})}return Y.current={sessionId:$.sessionId,modelId:x.selectedModelId,permissionMode:x.permissionMode,reasoningEffort:x.reasoningEffort,serviceTier:x.serviceTier,responseVerbosity:x.responseVerbosity,communicationStyle:x.communicationStyle,communicationStyleDigest:x.communicationStyleDigest},F$().setResponseVerbosity(M),k.getResponseVerbosityConfiguration()}catch(x){throw await k.refresh({responseVerbosity:E.selection}),x}}),o=g0(async()=>{if(!$.sessionId)throw Error("No active session for communication style");return(await O($.sessionId)).getCommunicationStyleConfiguration()}),f=g0(async(M)=>{if(!$.sessionId)throw Error("No active session for communication style");let k=await O($.sessionId);if(k.hasTurnOwner())throw Error("Cannot switch communication style while a turn is active");let E=k.getCommunicationStyleConfiguration(),x=k.resolveCommunicationStyleConfiguration(M);if(x.source!=="built-in"&&!x.contentSha256)throw Error("Custom communication style has no provenance");if(E.selection===M)return E;await k.refresh({communicationStyle:M});try{let n;try{n=await x0.updateSessionMetadata($.sessionId,k.workspaceRoot,{communicationStyle:M,communicationStyleDigest:x.source==="built-in"?null:x.contentSha256})}catch(H0){if(!(H0 instanceof V2)&&H0.code!=="ENOENT")throw H0;n=await x0.createSessionMetadata($.sessionId,k.workspaceRoot,{taskStatus:"completed",selectedModelId:k.getCurrentModelId(),reasoningEffort:k.getReasoningConfiguration().selection,serviceTier:k.getServiceTierConfiguration().selection,responseVerbosity:k.getResponseVerbosityConfiguration().selection,communicationStyle:M,...x.source!=="built-in"&&x.contentSha256?{communicationStyleDigest:x.contentSha256}:{}})}return Y.current={sessionId:$.sessionId,modelId:n.selectedModelId,permissionMode:n.permissionMode,reasoningEffort:n.reasoningEffort,serviceTier:n.serviceTier,responseVerbosity:n.responseVerbosity,communicationStyle:n.communicationStyle,communicationStyleDigest:n.communicationStyleDigest},F$().setCommunicationStyle(M),k.getCommunicationStyleConfiguration()}catch(n){throw await k.refresh({communicationStyle:E.selection}),n}}),a=g0(async(M)=>{if(!X.current)return{accepted:!1,queued:0,reason:"no_active_turn"};return X.current.enqueueSteering(M,{allowBeforeTurn:!0})}),e=g0(async(M,k)=>{let E=$.sessionId;if(!E)return{accepted:!1,queued:0,reason:"no_active_turn"};return(await O(E)).enqueueSteering(M,{allowBeforeTurn:!0,...k})}),Z0=g0(async(M,k)=>{let E=$.sessionId;if(!E)throw Error("Side conversation requires a Session");return(await O(E)).askSideQuestion(M,{signal:k,systemPrompt:$.systemPrompt,appendSystemPrompt:$.appendSystemPrompt})}),V=g0(async(M,k)=>{let E=$.sessionId;if(!E)throw Error("User shell command requires a Session");return(await O(E)).executeUserShellCommand(M,k)}),Y0=g0(()=>X.current?.getTurnRecoveryAssessment()??{state:"none"}),t=g0(async(M,k)=>{let E=$.sessionId;if(!E)throw Error("Code review requires a Session");let x=await O(E);await T8.recoverInterrupted(x.workspaceRoot,E,x);let n=await T8.start({sessionId:E,projectPath:x.workspaceRoot,runtime:x,request:M,signal:k}),H0=await n.completion,y0=(await T8.list(x.workspaceRoot,E)).find((j0)=>j0.start.reviewId===n.reviewId);if(!y0)throw Error(`Review not found after completion: ${n.reviewId}`);return{reviewId:n.reviewId,status:H0.status,findings:H0.findings.length,content:u9(y0.start,H0)}});return ZZ(()=>{K.current=!0;let k=R8(async()=>{K.current=!1,await z()});return()=>{k(),K.current=!1,z().catch(()=>{return})}},[z]),{agentRef:J,createAgent:F,cleanupAgent:z,steerActiveTurn:a,enqueueSessionInput:e,askSideQuestion:Z0,runCodeReview:t,executeUserShellCommand:V,getTurnRecoveryAssessment:Y0,listRewindCheckpoints:N,rewindSession:w,listSubagents:R,resumeSubagent:H,getMcpContentCatalog:C,refreshMcpContentCatalogs:y,getMcpPrompt:A,completeMcpArgument:B,listMcpTasks:L,getMcpTask:D,cancelMcpTask:T,getMcpLogs:b,setMcpLoggingLevel:S,getMcpInstructions:P,getReasoningConfiguration:v,setReasoningEffort:i,getServiceTierConfiguration:s,setServiceTier:u,getResponseVerbosityConfiguration:_0,setResponseVerbosity:m,getCommunicationStyleConfiguration:o,setCommunicationStyle:f}}import{useMemoizedFn as _2}from"ahooks";import{useEffect as KZ,useRef as C8}from"react";function r9($){let J=0;for(let X of $)if(X===`
|
|
32
|
-
`)J++;return J}function a9($,J){let X=J?.flushTimeout??300,Y=J?.minLinesToFlush??5,Z=J?.minCharsToFlush??400,Q=C8(""),K=C8(null),U=C8(""),G=C8(null),q=_2(()=>{if(Q.current){let N=Q.current,w=$.appendAssistantContent(N);w8(w,N),Q.current=""}if(K.current)clearTimeout(K.current),K.current=null}),_=_2(()=>{if(U.current)$.appendThinkingContent(U.current),U.current="";if(G.current)clearTimeout(G.current),G.current=null}),z=_2((N)=>{Q.current+=N;let w=Q.current;if(r9(w)>=Y||w.length>=Z){q();return}if(!K.current)K.current=setTimeout(q,X)}),O=_2((N)=>{U.current+=N;let w=U.current;if(r9(w)>=Y||w.length>=Z){_();return}if(!G.current)G.current=setTimeout(_,X)}),W=_2(()=>{if(Q.current="",K.current)clearTimeout(K.current),K.current=null;if(U.current="",G.current)clearTimeout(G.current),G.current=null}),F=_2(()=>{if(K.current)clearTimeout(K.current),K.current=null;if(G.current)clearTimeout(G.current),G.current=null;let N=Q.current,w=U.current;return Q.current="",U.current="",{extraContent:N,extraThinking:w}});return KZ(()=>{return()=>{W()}},[W]),{batchAppendContent:z,batchAppendThinking:O,flushContentBuffer:q,flushThinkingBuffer:_,resetStreamingBuffers:W,drainPendingBuffers:F}}var E2=S1("UI");function i9($){return $.error?.type==="canceled"||$.error?.type==="aborted"||$.metadata?.abortReason==="interrupt"}var YY=($,J,X,Y,Z,Q)=>{let K=G2(),U=K2(),G=Y1(),q=q8(),_=U2(),z=z8(),O=O8(),W=_8(),F=N8(),N=H8(),w=K8(),R=_9(),H=C1(),C=I1(),y=W9(),A=I8(!1),B=I8(null),b=I8(null),L=I8(null),{createAgent:D,cleanupAgent:T,steerActiveTurn:S,enqueueSessionInput:P,listRewindCheckpoints:v,rewindSession:i,listSubagents:s,resumeSubagent:u,getMcpContentCatalog:_0,refreshMcpContentCatalogs:m,getMcpPrompt:o,completeMcpArgument:f,listMcpTasks:a,getMcpTask:e,cancelMcpTask:Z0,getMcpLogs:V,setMcpLoggingLevel:Y0,getMcpInstructions:t,getReasoningConfiguration:M,setReasoningEffort:k,getServiceTierConfiguration:E,setServiceTier:x,getResponseVerbosityConfiguration:n,setResponseVerbosity:H0,getCommunicationStyleConfiguration:y0,setCommunicationStyle:j0,runCodeReview:z0,askSideQuestion:A0,executeUserShellCommand:O0,getTurnRecoveryAssessment:r0}=l9({sessionId:U,workspaceRoot:G,systemPrompt:$,appendSystemPrompt:J,maxTurns:Y,modelId:q,permissionMode:_,reasoningEffort:O,serviceTier:W,responseVerbosity:F,communicationStyle:N,agents:Q}),S0=a9(H),a0=O1((X0)=>new D2({signal:X0,streamingBuffer:S0,getStreamingMessageId:()=>_$().session.currentStreamingMessageId,finalizeStreamingMessage:H.finalizeStreamingMessage,discardStreamingMessage:H.discardStreamingMessage,clearThinking:()=>H.setCurrentThinkingContent(null)})),p0=O1(async()=>{if(!R||!U){C.setTeams([]);return}try{let P0=await new JY({configDir:R4(),subagentRegistry:S8(G)}).list({sessionId:U,projectPath:G});if(_$().session.sessionId===U&&_$().session.workspaceRoot===G)C.setTeams(P0)}catch(X0){E2.warn("[useCommandHandler] Failed to refresh Agent Teams",X0)}}),A$=O1(async(X0,P0)=>{if(X0.images.length>0)return{success:!1,error:"User shell commands do not accept image attachments"};let R0=X0.text.trimStart().slice(1).trim();if(!R0)return{success:!1,error:"User shell command cannot be empty"};H.setCommand(`! ${R0}`);try{let Q0=await O0(R0,{signal:P0});if(H.addMessage({id:`user-shell-${Q0.executionId}`,role:"user",content:C4(Q0.record),timestamp:Date.now(),metadata:{userShellCommand:Q0.record}}),Q0.delivery==="next_turn"){let $0=_$().session;if($0.sessionId===U&&$0.workspaceRoot===G)b.current?.request()}return{success:Q0.record.status!=="spawn_error",output:C4(Q0.record),...Q0.record.status==="spawn_error"?{error:Q0.record.stderr||"User shell command failed"}:{}}}finally{H.setCommand(null)}});u1(()=>{return()=>{B.current=null,S0.resetStreamingBuffers()}},[S0.resetStreamingBuffers]),u1(()=>{return()=>{L.current?.abort("side-conversation-session-change"),L.current=null,C.dismissSideConversation()}},[C,U,G]),u1(()=>{C.setTeams([]),p0()},[R,C,p0,U,G]),u1(()=>{if(!z)H.setCurrentThinkingContent(null)},[z,H]);let i0=O1(()=>{if(L.current){L.current.abort("user-cancel"),L.current=null,C.dismissSideConversation();return}if(!K)return;Z?.();let X0=y.getAbortController()?.signal??new AbortController().signal;if((B.current??a0(X0)).abortAndFinalize(()=>{y.abort("user-cancel"),C.setTasks([])}),!A.current)H.addAssistantMessage("任务已停止"),A.current=!0}),H$=O1(async(X0,P0)=>{let R0=`side-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;if(C.startSideConversation(R0,P0),X0.images.length>0){C.failSideConversation(R0,"Side conversations do not accept image attachments");return}if(!P0){C.failSideConversation(R0,"Usage: /btw <question>");return}L.current?.abort("side-conversation-replaced");let Q0=new AbortController;L.current=Q0;try{let $0=await A0(P0,Q0.signal);if(Q0.signal.aborted||L.current!==Q0)return;if(C.completeSideConversation(R0,$0),$0.usage)H.updateTokenUsage({inputTokens:$0.usage.promptTokens,outputTokens:$0.usage.completionTokens,totalTokens:$0.usage.totalTokens,cacheReadTokens:$0.usage.cacheReadInputTokens??0,cacheWriteTokens:$0.usage.cacheCreationInputTokens??0,costUsd:$0.usage.costUsd})}catch($0){if(Q0.signal.aborted||L.current!==Q0)return;C.failSideConversation(R0,$0 instanceof Error?$0.message:String($0))}finally{if(L.current===Q0)L.current=null}}),e0=O1(async(X0,P0)=>{let R0={contentDeltaCount:0,contentDeltaTotalLen:0,outputStarted:!1,toolExecutionStarted:!1,compactionCount:0},Q0=a0(P0.signal);B.current=Q0;let $0=k9({sessionActions:H,appActions:C,commandActions:y,streamingBuffer:S0,thinkingModeEnabled:z,getStreamingMessageId:()=>_$().session.currentStreamingMessageId,signal:P0.signal,streamSession:Q0},R0);try{return{loopResult:await t9(X0,$0),stats:R0}}finally{if(B.current===Q0)B.current=null}}),c1=O1(async(X0)=>{let P0=!1,R0,Q0=!1,$0=X0;try{if(X0.text.trimStart().startsWith("!")){let Q$=y.getAbortController()??y.createAbortController();return await A$(X0,Q$.signal)}await h2();let o0=y.getAbortController()??y.createAbortController(),g=P8(_$().session),h=await T4(X0,C,H,o0.signal,T,U,P8(_$().session),{listCheckpoints:v,execute:i},{list:s,resume:u},{getCatalog:_0,refresh:m,getPrompt:o,complete:f,listTasks:a,getTask:e,cancelTask:Z0,getLogs:V,setLoggingLevel:Y0,getInstructions:t},{get:M,set:k},{get:E,set:x},{get:n,set:H0},{get:y0,set:j0},G,{run:z0});if(h.type==="handled")return h.commandResult;if(h.type==="continue_as_agent")P0=h.result.userMessageAlreadyAdded,R0=h.result.onceModelId,Q0=h.result.goalContinuationOnly===!0,$0=h.result.agentInput;let I=D$.getInstance(),p;if(!Q0){let Q$=await I.executeUserPromptSubmitHooks($0.text,{projectDir:G,sessionId:U,permissionMode:_,hasImages:$0.images.length>0,imageCount:$0.images.length});if(!Q$.proceed){if(Q$.warning)H.addAssistantMessage(`${Q$.warning}`);return{success:!1,error:"blocked by hook"}}if(Q$.updatedPrompt)$0={...$0,text:Q$.updatedPrompt,displayText:Q$.updatedPrompt,parts:[{type:"text",text:Q$.updatedPrompt},...$0.parts.filter((Y8)=>Y8.type==="image")]};if(Q$.contextInjection)p=Q$.contextInjection}if(!P0)H.addUserMessage($0.displayText);let q0=y4($0),c0=await D(R0?{modelId:R0}:void 0);if(o0.signal.aborted)return E2.info("[handleCommandSubmit] Agent 创建期间已被中止"),{success:!1,error:"aborted"};if(p)g.push({role:"system",content:`<user-prompt-submit-hook>
|
|
33
|
-
${p}
|
|
34
|
-
</user-prompt-submit-hook>`});let Z$={messages:g,userId:"cli-user",sessionId:U,workspaceRoot:G,signal:o0.signal,confirmationHandler:X,permissionMode:_,onPermissionModeChange:async(Q$)=>{await G$().setPermissionMode(Q$)}},{loopResult:$$,stats:$1}=await e0(c0.chatStream(q0,Z$,{stream:!0,goalContinuationOnly:Q0,onTurnLimitReached:X?async(Q$)=>{let Y8=await X.requestConfirmation({type:"maxTurnsExceeded",message:`已进行 ${Q$.turnsCount} 轮对话。是否继续?`,risks:["继续执行可能导致更长的等待时间","可能产生更多的 API 费用"]});return{continue:Y8.approved,reason:Y8.reason}}:void 0}),o0);if($1.compactionCount>0)H.setCompactedContext(Z$.messages);if($$.success&&$$.metadata?.outputTruncated)H.addAssistantMessage("输出因达到 token 上限被截断,部分内容可能不完整。");let J1=$$.finalMessage||"";if(E2.debug("[handleCommandSubmit] final reply",{success:$$.success,outputLength:J1.length,turnsCount:$$.metadata?.turnsCount,toolCallsCount:$$.metadata?.toolCallsCount}),!$$.success&&!i9($$)){let Q$=$$.error?.message||"任务执行失败";return H.addAssistantMessage(Q$),{success:!1,error:Q$}}if(!J1||J1.trim()===""){let Q$=$$.metadata?.abortReason;if(!A.current&&$1.contentDeltaCount===0&&Q$!=="interrupt")return H.addAssistantMessage("已取消"),{success:!0,output:"已取消"};return{success:!0,output:J1??""}}return{success:!0,output:J1}}catch(o0){if(A.current)return{success:!1,error:"aborted"};let g=B8(o0),h=typeof o0==="object"&&o0!==null&&"name"in o0&&o0.name==="AbortError";if(g.isAbort||h)return{success:!1,error:"aborted"};return H.addAssistantMessage(`${g.displayMessage}`),{success:!1,error:g.displayMessage}}}),h$=O1(async(X0)=>{if(X0.aborted)return{status:"completed"};if(_$().command.isProcessing)return{status:"deferred"};let P0=await g$.hasPendingInbox(G,U),R0=!P0&&await g$.hasActiveGoal(G,U),Q0=!P0&&!R0&&await g$.hasRecoverableTurn(G,U);if(X0.aborted)return{status:"completed"};if(!P0&&!R0&&!Q0)return{status:"completed"};if(_$().command.isProcessing)return{status:"deferred"};if(await h2(),X0.aborted)return{status:"completed"};if(_$().command.isProcessing)return{status:"deferred"};let $0=y.createAbortController(),o0="preflight",g=()=>{if(!$0.signal.aborted)$0.abort("pending-resume-coordinator-disposed")};if(X0.addEventListener("abort",g,{once:!0}),X0.aborted)g();S0.resetStreamingBuffers(),H.clearFinalizingStreamingMessageId(),y.setProcessing(!0);try{let h=await D();if($0.signal.aborted)return $0.signal.reason==="interrupted-by-new-command"?{status:"deferred"}:{status:"completed"};let I=await g$.hasPendingInbox(G,U),p=!I&&await g$.hasActiveGoal(G,U);if($0.signal.aborted)return $0.signal.reason==="interrupted-by-new-command"?{status:"deferred"}:{status:"completed"};if(!I&&!p){let $$=r0();if($$.state!=="none")M4(H,$$);return{status:"completed"}}o0=I?"pending_input":"goal";let q0={messages:P8(_$().session),userId:"cli-user",sessionId:U,workspaceRoot:G,signal:$0.signal,confirmationHandler:X,permissionMode:_,onPermissionModeChange:async($$)=>{await G$().setPermissionMode($$)}},{loopResult:c0,stats:Z$}=await e0(h.chatStream("",q0,{stream:!0,pendingInputOnly:I,goalContinuationOnly:p}),$0);if(Z$.compactionCount>0)H.setCompactedContext(q0.messages);if($0.signal.aborted)return $0.signal.reason==="interrupted-by-new-command"?{status:"deferred"}:{status:"completed"};if(c0.success&&c0.metadata?.outputTruncated)H.addAssistantMessage("输出因达到 token 上限被截断,部分内容可能不完整。");if(!c0.success&&!i9(c0)){let $$=z2(c0.error?.details??c0.error?.message??"恢复排队指令失败");if(o0==="pending_input"){let $1=c0.metadata?.toolCallsCount,J1=typeof $1==="number"&&Number.isInteger($1)&&$1>=0?$1:-1,Q$=await g$.hasPendingInbox(G,U);if($0.signal.aborted)return $0.signal.reason==="interrupted-by-new-command"?{status:"deferred"}:{status:"completed"};return{status:"failed",workKind:o0,workStillPending:Q$,taskFailure:$$,evidence:{taskFailure:$$,outputStarted:Z$.outputStarted,toolExecutionStarted:Z$.toolExecutionStarted,toolCallsCount:J1}}}return{status:"failed",workKind:o0,workStillPending:!1,taskFailure:$$}}return{status:"completed"}}catch(h){let I=B8(h);if($0.signal.reason==="interrupted-by-new-command")return{status:"deferred"};if(I.isAbort||X0.aborted)return{status:"completed"};return{status:"failed",workKind:o0,workStillPending:!1,taskFailure:z2(h)}}finally{if(X0.removeEventListener("abort",g),y.getAbortController()===$0)y.setProcessing(!1),y.clearAbortController($0),H.setCurrentThinkingContent(null)}}),O$=UZ(()=>{let X0="preflight";return new B4({canRun:()=>!_$().command.isProcessing,run:async(P0)=>{X0="preflight";let R0=await h$(P0);if(R0.status==="failed")X0=R0.workKind;return R0},sessionIdentity:JSON.stringify([G,U]),onTerminalFailure:({taskFailure:P0})=>{if(X0==="preflight")H.setError(`恢复排队指令失败: ${P0.message}`);else H.addAssistantMessage(P0.message)}})},[h$,H,U,G]);u1(()=>{return b.current=O$,()=>{if(O$.dispose(),b.current===O$)b.current=null}},[O$]);let e$=O1(async(X0)=>{if(!X0.text.trim()&&X0.images.length===0)return;let P0=s9(X0.text);if(P0){await H$(X0,P0.question);return}if(L.current?.abort("main-conversation-submitted"),L.current=null,C.dismissSideConversation(),X0.text.trimStart().startsWith("!")&&K){let Q0=y.getAbortController();if(!Q0){H.addAssistantMessage("当前任务没有可用的取消边界,无法执行用户 Shell 命令。");return}let $0=await A$(X0,Q0.signal);if(!$0.success&&$0.error&&$0.error!=="aborted")H.setError($0.error);return}if(K){if(X0.text.trimStart().startsWith("/")){if(/^\/goal(?:\s|$)/i.test(X0.text.trim())){await h2();let h=y.getAbortController()??y.createAbortController();await T4(X0,C,H,h.signal,T,U,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,G);return}H.addAssistantMessage("活动回合中不能执行 slash command;请先停止任务或等待完成。");return}await h2();let Q0=await D$.getInstance().executeUserPromptSubmitHooks(X0.text,{projectDir:G,sessionId:U,permissionMode:_,hasImages:X0.images.length>0,imageCount:X0.images.length});if(!Q0.proceed){if(Q0.warning)H.addAssistantMessage(Q0.warning);return}let $0=X0;if(Q0.updatedPrompt)$0={...X0,text:Q0.updatedPrompt,parts:[{type:"text",text:Q0.updatedPrompt},...X0.parts.filter((h)=>h.type==="image")]};if(Q0.contextInjection){let h=`<user-prompt-submit-hook>
|
|
35
|
-
${Q0.contextInjection}
|
|
36
|
-
</user-prompt-submit-hook>`;$0={...$0,text:`${$0.text}
|
|
37
|
-
|
|
38
|
-
${h}`,parts:[...$0.parts,{type:"text",text:`
|
|
39
|
-
|
|
40
|
-
${h}`}]}}let o0=y4($0),g=await S(o0);if(!g.accepted){let h=g.reason==="queue_full"?"补充指令队列已满,请等待当前任务处理后重试。":"当前任务正在结束,补充指令未入队,请稍后重试。";H.addAssistantMessage(h);return}if(y.enqueueCommand(X0),H.addUserMessage(X0.displayText),g.delivery==="next_turn")O$.request();return}C.setTasks([]),y.setRecoveredSteeringCount(0),A.current=!1;let R0=y.createAbortController();S0.resetStreamingBuffers(),H.clearFinalizingStreamingMessageId(),y.setProcessing(!0);try{let Q0=await c1(X0);if(!Q0.success&&Q0.error&&Q0.error!=="aborted")H.setError(Q0.error)}catch(Q0){let $0=B8(Q0);if($0.isAbort);else H.setError(`执行失败: ${$0.displayMessage}`)}finally{if(y.getAbortController()===R0)y.setProcessing(!1),y.clearAbortController(R0),H.setCurrentThinkingContent(null),b.current?.notifyIdle()}});return u1(()=>{let X0=n9.subscribe((P0)=>{if(!o9(P0,{sessionId:U,projectPath:G}))return;if(P0.type.startsWith("team.")){let{teamName:R0,messageId:Q0,content:$0}=P0.properties,o0=P0.properties.metadata;if(P0.type==="team.message.received"&&typeof R0==="string"&&typeof Q0==="string"&&typeof $0==="string"&&$Y(o0,{messageId:Q0,teamName:R0}))(async()=>{let g=await P($0,{messageId:Q0,origin:"team_message",metadata:o0});if(!g.accepted)return;if(await new e9(R0,R4()).markDelivered([Q0]),g.delivery==="next_turn")O$.request()})().catch((g)=>{E2.warn("[useCommandHandler] Failed to deliver teammate message",g)});queueMicrotask(()=>{p0()});return}if(P0.type!=="subagent.completion.queued")return;O$.request()});return()=>{X0()}},[P,O$,p0,U,G]),u1(()=>{let X0=!1;return(async()=>{if(X)await I4.resolvePendingWithHandler(G,U,X);else await I4.cancelPendingNonInteractive(G,U);if(X0)return;let[P0,R0]=await Promise.all([g$.hasPendingInbox(G,U),g$.hasActiveGoal(G,U)]),Q0=!P0&&!R0&&await g$.hasRecoverableTurn(G,U);if(P0||R0||Q0)O$.request()})().catch((P0)=>{if(!X0)E2.warn("[useCommandHandler] Failed to recover pending interaction or inbox",P0)}),()=>{X0=!0}},[X,O$,U,G]),{executeCommand:e$,handleAbort:i0,isProcessing:K||w?.status==="loading",cleanupAgent:T}};import{useMemoizedFn as k8}from"ahooks";import{useRef as GZ,useState as qZ}from"react";var XY=()=>{let[$,J]=qZ([]),X=GZ(-1),Y=k8((U,G)=>{let q={display:U,pasteMappings:G?new Map(G):new Map};J((_)=>[..._,q]),X.current=-1}),Z=k8(()=>{if($.length===0)return null;let U=X.current===-1?$.length-1:Math.max(0,X.current-1);return X.current=U,$[U]||null}),Q=k8(()=>{if(X.current===-1)return null;let U=X.current+1;if(U>=$.length)return X.current=-1,null;else return X.current=U,$[U]||null}),K=k8(()=>{X.current=-1});return{commandHistory:$,historyIndex:X.current,addToHistory:Y,getPreviousCommand:Z,getNextCommand:Q,resetHistoryIndex:K}};import{useMemoizedFn as g2}from"ahooks";import{useMemo as zZ,useRef as ZY,useState as OZ}from"react";var QY=()=>{let[$,J]=OZ({isVisible:!1,details:null,resolver:null}),X=ZY(null),Y=ZY([]),Z=g2((_)=>{X.current=_,J({isVisible:Boolean(_),details:_?.details??null,resolver:_?.resolve??null})}),Q=g2((_,z)=>{if(_.settled)return;if(_.settled=!0,_.signal&&_.abortListener)_.signal.removeEventListener("abort",_.abortListener);_.resolve(z)}),K=g2((_,z)=>{return new Promise((O)=>{let W={details:_,resolve:O,signal:z,settled:!1},F=()=>{if(X.current===W){Q(W,{approved:!1,reason:m2}),Z(Y.current.shift()??null);return}let N=Y.current.indexOf(W);if(N>=0)Y.current.splice(N,1);Q(W,{approved:!1,reason:m2})};if(W.abortListener=F,z?.aborted){F();return}if(z?.addEventListener("abort",F,{once:!0}),!X.current){Z(W);return}Y.current.push(W)})}),U=g2((_)=>{let z=X.current;if(z)Q(z,_);let O=Y.current.shift()??null;Z(O)}),G=g2(()=>{if(X.current)Q(X.current,{approved:!1,reason:m2});for(let _ of Y.current)Q(_,{approved:!1,reason:m2});Y.current=[],Z(null)}),q=zZ(()=>({requestConfirmation:K}),[K]);return{confirmationState:$,confirmationHandler:q,handleResponse:U,dismissAll:G}};import{useMemoizedFn as d1}from"ahooks";import{useRef as KY,useState as _Z}from"react";var S4="␞",k4="␟";function f8($){return`${S4}PASTE:${$}:`}function f4(){return k4}var NZ=`${S4}PASTE:(\\d+):[\\s\\S]*?${k4}`;function HZ($){return $.includes(S4)&&$.includes(k4)}function WZ($,J,X){let Y=[...$.values()].filter((K)=>K.type==="image");if(Y.length>=O2)throw Error(`最多只能粘贴 ${O2} 张图片`);let Z=Y.reduce((K,U)=>K+`data:${U.mimeType};base64,`.length+U.data.length,0),Q=`data:${X};base64,`.length+J.length;if(Z+Q>b8)throw Error("图片编码后总大小不能超过 5 MiB")}function FZ($,J){let X=[],Y=[];if(!HZ($)){let z=$.trim();if(z)Y.push({type:"text",text:z});return{displayText:$,text:$,images:X,parts:Y}}let Z=Array.from($.matchAll(new RegExp(NZ,"g"))),Q=0,K="",U="";for(let z of Z){let O=z.index,W=O+z[0].length,F=parseInt(z[1],10),N=J.get(F);if(O>Q){let w=$.slice(Q,O);Y.push({type:"text",text:w}),K+=w,U+=w}if(!N)K+=z[0],U+=z[0],Y.push({type:"text",text:z[0]});else if(N.type==="text")K+=N.data,U+=N.data,Y.push({type:"text",text:N.data});else{let w={id:F,base64:N.data,mimeType:N.mimeType};X.push(w),Y.push({type:"image",...w}),U+=`[Image #${F}]`}Q=W}if(Q<$.length){let z=$.slice(Q);Y.push({type:"text",text:z}),K+=z,U+=z}let G=[];for(let z of Y){let O=G[G.length-1];if(z.type==="text"&&O?.type==="text")O.text+=z.text;else G.push(z)}let q=0,_=G.length;while(q<G.length){let z=G[q];if(z.type!=="text"||z.text.trim()!=="")break;q++}while(_>q){let z=G[_-1];if(z.type!=="text"||z.text.trim()!=="")break;_--}return{displayText:U.trim(),text:K.trim(),images:X,parts:G.slice(q,_)}}function UY($="",J=0){let[X,Y]=_Z({value:$,cursorPosition:J}),Z=KY(0),Q=KY(new Map),K=d1((W)=>{Y((F)=>({value:W,cursorPosition:F.cursorPosition}));for(let F of Q.current.keys()){let N=f8(F);if(!W.includes(N))Q.current.delete(F)}}),U=d1((W)=>{Y((F)=>({...F,cursorPosition:Math.max(0,Math.min(W,F.value.length))}))}),G=d1(()=>{Y({value:"",cursorPosition:0}),Q.current.clear()}),q=d1((W)=>{Z.current+=1;let F=Z.current;return Q.current.set(F,{type:"text",data:W}),F}),_=d1((W,F)=>{WZ(Q.current,W,F),Z.current+=1;let N=Z.current;return Q.current.set(N,{type:"image",data:W,mimeType:F}),N}),z=d1((W)=>{for(let[F,N]of W)if(Q.current.set(F,N),F>=Z.current)Z.current=F}),O=d1((W)=>FZ(W,Q.current));return{value:X.value,cursorPosition:X.cursorPosition,setValue:K,setCursorPosition:U,clear:G,pasteMap:Q.current,addPasteMapping:q,addImagePasteMapping:_,restorePasteMappings:z,resolveInput:O}}import{useMemoizedFn as wY}from"ahooks";import{useEffect as BY,useRef as AY,useState as V4}from"react";function LZ($){return{supportsThinking:_1().resolveConfig($).reasoning}}function D8($){return LZ($).supportsThinking}import{useInput as GY}from"ink";import{createContext as wZ,useCallback as BZ,useContext as AZ,useEffect as bZ,useMemo as PZ,useRef as v8}from"react";import{jsxDEV as MZ}from"react/jsx-dev-runtime";var qY=wZ(null);function zY({children:$}){let J=v8(new Map),X=v8(0),Y=BZ((Q,K,U)=>{let G=X.current++;return J.current.set(G,{id:G,priority:K,handler:Q}),U?.(),()=>{J.current.delete(G)}},[]),Z=PZ(()=>({register:Y}),[Y]);return GY((Q,K)=>{let U=[...J.current.values()].sort((G,q)=>q.priority-G.priority||G.id-q.id);for(let G of U)if(G.handler(Q,K)===!0)break}),MZ(qY.Provider,{value:Z,children:$},void 0,!1,void 0,this)}function W0($,J={}){let X=AZ(qY),Y=v8($);Y.current=$;let Z=J.isActive??!0,Q=J.priority??0,K=v8(J.onRegistered);K.current=J.onRegistered,GY((U,G)=>{if(!X&&Z)Y.current(U,G)},{isActive:!X&&Z}),bZ(()=>{if(!X||!Z)return;return X.register((U,G)=>Y.current(U,G),Q,()=>K.current?.())},[Z,Q,X])}import yZ from"fast-glob";import TZ from"fuse.js";import{useEffect as OY,useMemo as V8,useState as D4}from"react";var N2=null,RZ=5000;function CZ($,J){let X=[...$.matchAll(/(?:^|\s)(@(?:"[^"]*"|(?:[^\\ ]|\\ )*))/g)];for(let Y of X){let Z=Y[1],Q=Y.index+(Y[0].length-Z.length),K=Q+Z.length;if(J>=Q&&J<=K){let U=Z.slice(1),G=!1;if(U.startsWith('"')){if(G=!0,U=U.slice(1),U.endsWith('"'))U=U.slice(0,-1)}return{hasQuery:!0,query:U,startIndex:Q,endIndex:K,quoted:G}}}return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1}}var IZ=[...v4.map(($)=>`${$}/**`),...v4,..._Y.map(($)=>`**/${$}`)];function NY($,J,X={}){let{cwd:Y=U$(),maxSuggestions:Z=15,ignorePatterns:Q=IZ,debounceDelay:K=300,fuzzyMatch:U=!0}=X,[G,q]=D4([]),[_,z]=D4(!1),[O,W]=D4(0),F=V8(()=>JSON.stringify(Q),[Q]),N=$.includes("@"),w=V8(()=>{if(J===void 0)return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1};return CZ($,J)},[$,J]);OY(()=>{if(!N){q([]),z(!1);return}let C=Date.now();if(N2&&N2.cwd===Y&&N2.ignoreKey===F&&C-N2.timestamp<RZ){q(N2.files),z(!1);return}let y=!1,B=setTimeout(async()=>{z(!0);try{let L=(await yZ("**/*",{cwd:Y,dot:!1,followSymbolicLinks:!1,onlyFiles:!1,markDirectories:!0,unique:!0,ignore:Q})).map((D)=>D.replace(/\\/g,"/"));if(!y)q(L),N2={cwd:Y,ignoreKey:F,files:L,timestamp:C}}catch(b){if(console.error("Failed to load files for @ completion:",b),!y)q([])}finally{if(!y)z(!1)}},K);return()=>{y=!0,clearTimeout(B)}},[N,Y,K,F]);let R=V8(()=>U&&G.length>0?new TZ(G,{threshold:0.4,ignoreLocation:!0,minMatchCharLength:1}):null,[G,U]),H=V8(()=>{if(!w.hasQuery||G.length===0)return[];let C=w.query.toLowerCase();if(C==="")return G.slice(0,Z);if(R)return R.search(C).slice(0,Z).map((A)=>A.item);return G.filter((y)=>y.toLowerCase().includes(C)).slice(0,Z)},[w,G,R,Z]);return OY(()=>{W(0)},[H]),{...w,suggestions:H,selectedIndex:O,loading:_}}function SZ($,J=!1){if($.includes(" ")||J)return`@"${$}"`;return`@${$}`}function HY($,J,X){if(!J.hasQuery)return{newInput:$,newCursorPos:$.length};let Y=SZ(X,J.quoted),Z=$.slice(0,J.startIndex),Q=$.slice(J.endIndex),K=Z+Y+" "+Q,U=J.startIndex+Y.length+1;return{newInput:K,newCursorPos:U}}import{useMemoizedFn as WY}from"ahooks";import{useEffect as FY,useRef as LY}from"react";var n0=($,J)=>{let X=LY(!1),Y=LY(null),Z=WY(()=>{if(Y.current)clearTimeout(Y.current);Y.current=setTimeout(()=>{F$().setAwaitingSecondCtrlC(!1),X.current=!1,Y.current=null},3000)}),Q=()=>{p2().shutdown("SIGINT",0)},K=WY(()=>{if(!X.current){if(X.current=!0,$&&J)J();F$().setAwaitingSecondCtrlC(!0),Z()}else{if(Y.current)clearTimeout(Y.current),Y.current=null;F$().setAwaitingSecondCtrlC(!1),Q()}});return FY(()=>{if($){if(F$().setAwaitingSecondCtrlC(!1),X.current=!1,Y.current)clearTimeout(Y.current),Y.current=null}},[$]),FY(()=>{return()=>{if(Y.current)clearTimeout(Y.current)}},[]),K};var j8=S1("UI"),MY=($,J,X,Y,Z,Q,K,U,G,q)=>{let z=K$()==="main-input",O=$.value,W=$.setValue,F=$.cursorPosition,N=C1(),w=Y1(),R=I1(),H=G8(),C=H?D8(H):!1,[y,A]=V4(!1),[B,b]=V4([]),[L,D]=V4(0),T=NY(O,F,{cwd:w,maxSuggestions:10}),S=n0(K||!1,Q),P=AY(0),v=500,i=AY(!1);BY(()=>{if(K)i.current=!1},[K]),BY(()=>{if(T.hasQuery&&T.suggestions.length>0){let _0=T.suggestions.map((m)=>({command:m,description:bY(m)?`Directory: ${m}`:`File: ${m}`,matchScore:1}));b(_0),A(!0),D(0)}else if(O.startsWith("/"))if(O.includes(" "))A(!1),b([]);else{let m=PY(O,w);b(m),A(m.length>0),D(0)}else A(!1),b([])},[O,T.hasQuery,T.suggestions,w]);let s=wY(()=>{N.clearMessages(),N.setError(null)}),u=wY(()=>{j8.debug("[DIAG] handleSubmit called:",{input:O,showSuggestions:y});let _0=O.trim();if(_0){let m=$.resolveInput(_0);j8.debug("[DIAG] Submitting command:",{displayText:_0,textLength:m.text.length,imageCount:m.images.length}),A(!1),b([]);let o=$.pasteMap.size>0?new Map($.pasteMap):new Map;Z(_0,o),$.clear(),J(m),j8.debug("[DIAG] Command submitted to onSubmit callback")}else j8.debug("[DIAG] Empty command, not submitting")});return W0((_0,m)=>{if(_0==="?"&&!O)return G?.(),setTimeout(()=>$.clear(),0),!0;if(m.backspace||m.delete||m.leftArrow||m.rightArrow||m.pageUp||m.pageDown||!m.ctrl&&!m.meta&&!m.escape&&!m.tab&&!m.upArrow&&!m.downArrow&&!m.return&&!(_0==="?"&&!O))return!1;if(m.ctrl&&_0==="c"||m.meta&&_0==="c"||m.ctrl&&_0==="d"||m.meta&&_0==="d")return S(),!0;if(m.ctrl&&_0==="l"||m.meta&&_0==="l")return s(),!0;if(m.ctrl&&_0==="t"||m.meta&&_0==="t")return N.toggleThinkingExpanded(),!0;if(m.escape){if(q)G?.();else if(K&&Q){if(i.current)return!0;i.current=!0,Q()}else if(y)A(!1),b([]);else if(O){let f=Date.now();if(f-P.current<500)$.clear(),P.current=0;else P.current=f}return!0}if(m.tab&&m.shift)return U?.(),!0;if(m.tab){if(y&&B.length>0){let f=B[L].command;if(T.hasQuery&&T.suggestions.includes(f)){let{newInput:a,newCursorPos:e}=HY(O,T,f);W(a),$.setCursorPosition(e)}else{let a=f+" ";W(a),$.setCursorPosition(a.length)}A(!1),b([])}else if(C)R.toggleThinkingMode();return!0}if(m.return)return u(),!0;if(m.upArrow){if(y&&B.length>0){let f=B.length-1;D((a)=>a>0?a-1:f)}else{let f=X();if(f){if(f.pasteMappings.size>0)$.restorePasteMappings(f.pasteMappings);W(f.display),$.setCursorPosition(f.display.length)}}return!0}if(m.downArrow){if(y&&B.length>0){let f=B.length-1;D((a)=>a<f?a+1:0)}else{let f=Y();if(f){if(f.pasteMappings.size>0)$.restorePasteMappings(f.pasteMappings);W(f.display),$.setCursorPosition(f.display.length)}}return!0}return!1},{isActive:z,priority:20}),{handleSubmit:u,showSuggestions:y,suggestions:B,selectedSuggestionIndex:L}};import gZ from"ansi-escapes";import{useStdout as mZ}from"ink";import{useCallback as pZ,useEffect as xZ,useRef as cZ}from"react";import{useStdout as kZ}from"ink";import{debounce as fZ}from"lodash-es";import{useEffect as DZ,useState as vZ}from"react";var yY={columns:80,rows:24};function VZ($){return{width:$.columns||80,height:$.rows||24}}function jZ($,J){return $.width===J.width&&$.height===J.height}function TY($,J,X){let{stdout:Y}=kZ(),[Z,Q]=vZ(()=>$(Y));return DZ(()=>{let K=()=>{let G=$(Y);Q((q)=>J(q,G)?q:G)},U=fZ(K,X);return K(),Y.on("resize",U),()=>{Y.off("resize",U),U.cancel()}},[Y,X,J,$]),Z}function EZ($){return $.columns||yY.columns}function hZ($){return $.rows||yY.rows}function RY($,J=200){return TY($==="columns"?EZ:hZ,Object.is,J)}function E8($=200){return TY(VZ,jZ,$)}function H2($=200){return RY("columns",$)}function CY(){let{stdout:$}=mZ(),J=H2(),X=cZ(!0),Y=U0((Q)=>Q.session.actions.incrementClearCount),Z=pZ(()=>{if($)$.write(gZ.clearTerminal);Y()},[$,Y]);return xZ(()=>{if(X.current){X.current=!1;return}Z()},[J,Z]),{refreshStatic:Z}}import l1 from"chalk";import uZ from"string-width";var I0={active:!1,renderedLineCount:0,lastRenderedLines:[],terminalWidth:process.stdout.columns||80,terminalHeight:process.stdout.rows||24,prefixIndent:4,isFirstRender:!0},g8="\x1B",j4=`${g8}[2K`,h8=($)=>$>0?`${g8}[${$}A`:"",IY=`${g8}[?25l`,SY=`${g8}[?25h`;function kY($,J){I0.active=!0,I0.renderedLineCount=0,I0.lastRenderedLines=[],I0.terminalWidth=$,I0.terminalHeight=J,I0.isFirstRender=!0}function fY($,J){I0.terminalWidth=$,I0.terminalHeight=J}function DY($,J,X,Y){if(!I0.active)return;let Z=8,Q=Math.max(1,I0.terminalHeight-Z),K=[],U=W$.getTheme(),G=" ".repeat(I0.prefixIndent),q=l1.dim.hex(U.colors.border.light);if(J>0)K.push(`${G}${l1.dim.hex(U.colors.text.muted)(`^ ${J} lines above (streaming...)`)}`);let _=X==="code",z=X==="diff",O="",W=$;if(_&&$.length>0)O=$[0].match(/^```(\w+)?/)?.[1]||"",W=$.slice(1);else if(z&&$.length>0&&$[0]==="<<<DIFF>>>")W=$.slice(1);let F=W.slice(-Q);if(_&&J===0){let w=O?` ${l1.hex(U.colors.text.secondary)(O)}`:"";K.push(`${G}${q("╭─")}${w}`)}for(let w=0;w<F.length;w++){let R=F[w],H=G;if(w===0&&!Y&&I0.isFirstRender&&!_&&!z)H=l1.bold.hex(U.colors.success)("• ")+" ",I0.isFirstRender=!1;let C=_?4:0,y=I0.terminalWidth-I0.prefixIndent-2-C,A=R;if(uZ(R)>y)A=R.slice(0,y);if(_)K.push(`${G}${q("│")} ${A}`);else if(z){let B=A;if(B.startsWith("+"))K.push(`${H}${l1.green(A)}`);else if(B.startsWith("-"))K.push(`${H}${l1.red(A)}`);else if(B.startsWith("@@"))K.push(`${H}${l1.dim(A)}`);else K.push(`${H}${A}`)}else K.push(`${H}${A}`);if(w===0&&!Y&&I0.isFirstRender)I0.isFirstRender=!1}let N=[];if(N.push(IY),I0.renderedLineCount>0)N.push(h8(I0.renderedLineCount)),N.push("\r");for(let w=0;w<K.length;w++){let R=K[w],H=I0.lastRenderedLines[w];if(R!==H)N.push(j4),N.push(R);if(w<K.length-1)N.push(`
|
|
41
|
-
`)}if(K.length<I0.renderedLineCount){for(let R=K.length;R<I0.renderedLineCount;R++)N.push(`
|
|
42
|
-
`),N.push(j4);let w=I0.renderedLineCount-K.length;N.push(h8(w))}N.push(SY),process.stdout.write(N.join("")),I0.renderedLineCount=K.length,I0.lastRenderedLines=K}function m$(){if(!I0.active)return;if(I0.renderedLineCount>0){let $=[];$.push(IY),$.push(h8(I0.renderedLineCount)),$.push("\r");for(let J=0;J<I0.renderedLineCount;J++)if($.push(j4),J<I0.renderedLineCount-1)$.push(`
|
|
43
|
-
`);if(I0.renderedLineCount>1)$.push(h8(I0.renderedLineCount-1)),$.push("\r");$.push(SY),process.stdout.write($.join(""))}I0.active=!1,I0.renderedLineCount=0,I0.lastRenderedLines=[],I0.isFirstRender=!0}function r$(){return I0.active}import vY from"node:fs";import dZ from"node:os";import E4 from"node:path";import{MultiSelect as lZ}from"@inkjs/ui";import{useMemoizedFn as m8}from"ahooks";import{Box as B0,Text as N0,useFocus as rZ,useFocusManager as aZ}from"ink";import p8 from"ink-select-input";import iZ from"ink-spinner";import x2 from"ink-text-input";import{useEffect as VY,useState as W2}from"react";import{jsxDEV as j}from"react/jsx-dev-runtime";var oZ=[{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"}],nZ=[{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 tZ($){if(!$||$.trim()==="")return"名称不能为空";if(!/^[a-z0-9-]+$/.test($))return"名称只能包含小写字母、数字和连字符";if($.startsWith("-")||$.endsWith("-"))return"名称不能以连字符开头或结尾";return null}function c2({onComplete:$,onCancel:J,initialConfig:X}){let[Y,Z]=W2(X?"name":"mode"),[Q,K]=W2({name:X?.name||"",description:X?.description||"",tools:X?.tools||[],color:X?.color,location:X?.location||"project",systemPrompt:X?.systemPrompt||""}),[U,G]=W2(""),[q,_]=W2(!1),[z,O]=W2(""),[W,F]=W2(X?"edit":"manual"),{focus:N}=aZ(),R={manual:["mode","name","description","tools","color","location","systemPrompt","confirm"],ai:["mode","aiPrompt","aiGenerating","confirm"],edit:["name","description","tools","color","location","systemPrompt","confirm"]}[W];VY(()=>{if(Y==="name"||Y==="description"||Y==="systemPrompt"||Y==="aiPrompt")return;N(`step-${Y}`)},[Y,N]);let H=m8(()=>{let b=R.indexOf(Y);if(b<R.length-1)Z(R[b+1])}),C=m8(()=>{if(z)O("");if(Y==="confirm"&&W==="ai"){Z("aiPrompt");return}let b=R.indexOf(Y);if(b>0)Z(R[b-1]);else J()}),y=m8(async()=>{_(!0),O("");try{let b=await j2.create(),L=`你是一个 Subagent 配置生成专家。用户会描述他们想要创建的 agent,你需要根据描述生成一个完整的 agent 配置。
|
|
44
|
-
|
|
45
|
-
## 可用工具列表
|
|
46
|
-
|
|
47
|
-
- **Glob**: 文件模式匹配(例如:查找所有 .ts 文件)
|
|
48
|
-
- **Grep**: 代码内容搜索(例如:搜索特定函数调用)
|
|
49
|
-
- **Read**: 读取文件内容
|
|
50
|
-
- **Write**: 写入/创建文件
|
|
51
|
-
- **Edit**: 编辑文件(字符串替换)
|
|
52
|
-
- **ApplyPatch**: 原子应用多文件文本补丁
|
|
53
|
-
- **Bash**: 执行命令行命令
|
|
54
|
-
|
|
55
|
-
## 可用颜色
|
|
56
|
-
|
|
57
|
-
- red, blue, green, yellow, purple, orange, pink, cyan
|
|
58
|
-
|
|
59
|
-
## 输出格式
|
|
60
|
-
|
|
61
|
-
你必须以 JSON 格式返回配置,格式如下:
|
|
62
|
-
|
|
63
|
-
\`\`\`json
|
|
64
|
-
{
|
|
65
|
-
"name": "agent-name",
|
|
66
|
-
"description": "简洁的一句话描述(英文)",
|
|
67
|
-
"tools": ["Glob", "Grep", "Read"],
|
|
68
|
-
"color": "blue",
|
|
69
|
-
"systemPrompt": "详细的系统提示词,说明这个 agent 的职责、工作方式、输出格式等"
|
|
70
|
-
}
|
|
71
|
-
\`\`\`
|
|
72
|
-
|
|
73
|
-
## 注意事项
|
|
74
|
-
|
|
75
|
-
1. **name**: 只能包含小写字母、数字和连字符(kebab-case),例如:code-reviewer
|
|
76
|
-
2. **description**: 一句话说明用途,建议以 "Fast agent specialized for..." 开头
|
|
77
|
-
3. **tools**: 根据任务选择必要的工具,不要选择太多
|
|
78
|
-
4. **color**: 选择一个合适的颜色用于 UI 区分
|
|
79
|
-
5. **systemPrompt**: 详细说明 agent 的职责、使用的工具、输出格式等,使用 Markdown 格式
|
|
80
|
-
|
|
81
|
-
**重要**:请直接返回 JSON,不要添加任何额外的解释或文字。`,T=(await b.chatWithSystem(`你是一个 Subagent 配置生成专家。用户会描述他们想要创建的 agent,你需要根据描述生成一个完整的 agent 配置。
|
|
82
|
-
|
|
83
|
-
## 可用工具列表
|
|
84
|
-
|
|
85
|
-
- **Glob**: 文件模式匹配(例如:查找所有 .ts 文件)
|
|
86
|
-
- **Grep**: 代码内容搜索(例如:搜索特定函数调用)
|
|
87
|
-
- **Read**: 读取文件内容
|
|
88
|
-
- **Write**: 写入/创建文件
|
|
89
|
-
- **Edit**: 编辑文件(字符串替换)
|
|
90
|
-
- **ApplyPatch**: 原子应用多文件文本补丁
|
|
91
|
-
- **Bash**: 执行命令行命令
|
|
92
|
-
|
|
93
|
-
## 可用颜色
|
|
94
|
-
|
|
95
|
-
- red, blue, green, yellow, purple, orange, pink, cyan
|
|
96
|
-
|
|
97
|
-
## 输出格式
|
|
98
|
-
|
|
99
|
-
你必须以 JSON 格式返回配置,格式如下:
|
|
100
|
-
|
|
101
|
-
\`\`\`json
|
|
102
|
-
{
|
|
103
|
-
"name": "agent-name",
|
|
104
|
-
"description": "简洁的一句话描述(英文)",
|
|
105
|
-
"tools": ["Glob", "Grep", "Read"],
|
|
106
|
-
"color": "blue",
|
|
107
|
-
"systemPrompt": "详细的系统提示词,说明这个 agent 的职责、工作方式、输出格式等"
|
|
108
|
-
}
|
|
109
|
-
\`\`\`
|
|
110
|
-
|
|
111
|
-
## 注意事项
|
|
112
|
-
|
|
113
|
-
1. **name**: 只能包含小写字母、数字和连字符(kebab-case),例如:code-reviewer
|
|
114
|
-
2. **description**: 一句话说明用途,建议以 "Fast agent specialized for..." 开头
|
|
115
|
-
3. **tools**: 根据任务选择必要的工具,不要选择太多
|
|
116
|
-
4. **color**: 选择一个合适的颜色用于 UI 区分
|
|
117
|
-
5. **systemPrompt**: 详细说明 agent 的职责、使用的工具、输出格式等,使用 Markdown 格式
|
|
118
|
-
|
|
119
|
-
**重要**:请直接返回 JSON,不要添加任何额外的解释或文字。`,U)).trim(),S=T.match(/```(?:json)?\s*\n([\s\S]*?)\n```/);if(S)T=S[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)");K({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(b){O(b instanceof Error?b.message:String(b))}finally{_(!1)}});VY(()=>{if(Y==="aiGenerating"&&!q&&!z)y()},[Y,q,z,y]);let A=m8(async()=>{try{let b=Q.location==="project"?E4.join(U$(),".blade","agents"):E4.join(dZ.homedir(),".blade","agents");await vY.promises.mkdir(b,{recursive:!0});let L=["---",`name: ${Q.name}`,`description: ${Q.description}`];if(Q.tools.length>0&&!Q.tools.includes("all")){L.push("tools:");for(let S of Q.tools)L.push(` - ${S}`)}if(Q.color)L.push(`color: ${Q.color}`);L.push("---");let D=[L.join(`
|
|
120
|
-
`),"",`# ${Q.name} Subagent`,"",Q.systemPrompt||"你是一个专门的代理,负责执行特定任务。",""].join(`
|
|
121
|
-
`),T=E4.join(b,`${Q.name}.md`);await vY.promises.writeFile(T,D,"utf-8"),$()}catch(b){console.error("保存配置失败:",b)}}),B=n0(!1,J);if(W0((b,L)=>{if(L.escape)C();else if(L.ctrl&&b==="c"||L.meta&&b==="c")B()},{isActive:Y!=="tools"}),Y==="mode")return j(B0,{flexDirection:"column",paddingY:1,children:[j(B0,{marginBottom:1,children:j(N0,{bold:!0,color:"cyan",children:"选择创建方式"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(B0,{marginBottom:1,children:j(N0,{dimColor:!0,children:"你可以手动配置每个细节,或让 AI 根据你的描述自动生成配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(p8,{items:[{label:"AI 智能生成 - 根据描述自动生成完整配置",value:"ai"},{label:"手动配置 - 逐步配置每个选项",value:"manual"}],onSelect:(b)=>{if(b.value==="ai")F("ai"),Z("aiPrompt");else F("manual"),Z("name")}},void 0,!1,void 0,this),j(B0,{marginTop:1,children:j(N0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 取消"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Y==="aiPrompt")return j(B0,{flexDirection:"column",paddingY:1,children:[j(B0,{marginBottom:1,children:j(N0,{bold:!0,color:"cyan",children:"AI 智能生成"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(B0,{marginBottom:1,children:j(N0,{dimColor:!0,children:'描述你想要创建的 Agent(例如:"一个专门用于代码审查的 agent,能够分析代码质量和潜在bug")'},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(B0,{marginBottom:1,children:[j(N0,{color:"green",children:"描述: "},void 0,!1,void 0,this),j(x2,{value:U,onChange:G,onSubmit:(b)=>{if(!b.trim())return;Z("aiGenerating")}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(B0,{children:j(N0,{dimColor:!0,children:"按 Enter 开始生成 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Y==="aiGenerating"){if(z)return j(B0,{flexDirection:"column",paddingY:1,children:[j(B0,{marginBottom:1,children:j(N0,{bold:!0,color:"red",children:"AI 生成失败"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(B0,{marginBottom:1,children:j(N0,{color:"red",children:z},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(B0,{marginBottom:1,children:j(N0,{dimColor:!0,children:"按 ESC 返回修改描述"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return j(B0,{flexDirection:"column",paddingY:1,children:[j(B0,{marginBottom:1,children:j(N0,{bold:!0,color:"yellow",children:[j(iZ,{type:"dots"},void 0,!1,void 0,this)," AI 正在生成配置..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),j(B0,{marginBottom:1,children:j(N0,{dimColor:!0,children:['根据你的描述:"',U,'"']},void 0,!0,void 0,this)},void 0,!1,void 0,this),j(B0,{marginBottom:1,children:j(N0,{color:"gray",children:"正在调用 LLM 生成 agent 配置,请稍候..."},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}if(Y==="name"){let b=W==="edit";return j(B0,{flexDirection:"column",paddingY:1,children:[j(B0,{marginBottom:1,children:j(N0,{bold:!0,color:"cyan",children:["Step 1/7: ",b?"Agent 名称(不可修改)":"输入 Agent 名称"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),j(B0,{marginBottom:1,children:j(N0,{dimColor:!0,children:b?"编辑模式下名称不可修改(修改名称相当于创建新 Agent)":"名称只能包含小写字母、数字和连字符(例如:code-reviewer)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(B0,{marginBottom:1,children:[j(N0,{color:"green",children:"名称: "},void 0,!1,void 0,this),b?j(N0,{children:Q.name},void 0,!1,void 0,this):j(x2,{value:Q.name,onChange:(L)=>K({...Q,name:L}),onSubmit:(L)=>{if(tZ(L))return;H()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(B0,{children:j(N0,{dimColor:!0,children:b?"按 Enter 继续 | ESC 返回":"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),b&&j(x2,{value:"",onChange:()=>{},onSubmit:H,showCursor:!1},"edit-mode-dummy-input",!1,void 0,this)]},void 0,!0,void 0,this)}if(Y==="description")return j(B0,{flexDirection:"column",paddingY:1,children:[j(B0,{marginBottom:1,children:j(N0,{bold:!0,color:"cyan",children:"Step 2/7: 输入描述信息"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(B0,{marginBottom:1,children:j(N0,{dimColor:!0,children:"简短描述这个 Agent 的用途和使用场景(这将帮助主 Agent 决定何时使用它)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(B0,{marginBottom:1,children:[j(N0,{color:"green",children:"描述: "},void 0,!1,void 0,this),j(x2,{value:Q.description,onChange:(b)=>K({...Q,description:b}),onSubmit:(b)=>{if(!b.trim())return;H()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(B0,{children:j(N0,{dimColor:!0,children:"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Y==="tools")return j(sZ,{config:Q,setConfig:K,onNext:H,onPrev:C},void 0,!1,void 0,this);if(Y==="color")return j(B0,{flexDirection:"column",paddingY:1,children:[j(B0,{marginBottom:1,children:j(N0,{bold:!0,color:"cyan",children:"Step 4/7: 选择背景颜色"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(B0,{marginBottom:1,children:j(N0,{dimColor:!0,children:"为 Agent 选择一个颜色标识(用于在 UI 中区分不同的 Agents)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(p8,{items:nZ,onSelect:(b)=>{let L=b.value==="none"?void 0:b.value;K({...Q,color:L}),H()}},void 0,!1,void 0,this),j(B0,{marginTop:1,children:j(N0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Y==="location")return j(B0,{flexDirection:"column",paddingY:1,children:[j(B0,{marginBottom:1,children:j(N0,{bold:!0,color:"cyan",children:"Step 5/7: 选择保存位置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(B0,{marginBottom:1,children:j(N0,{dimColor:!0,children:"项目级配置仅在当前项目生效,用户级配置全局可用"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(p8,{items:[{label:"项目级 (.blade/agents/) - 仅当前项目",value:"project"},{label:"用户级 (~/.blade/agents/) - 全局可用",value:"user"}],onSelect:(b)=>{K({...Q,location:b.value}),H()}},void 0,!1,void 0,this),j(B0,{marginTop:1,children:j(N0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Y==="systemPrompt")return j(B0,{flexDirection:"column",paddingY:1,children:[j(B0,{marginBottom:1,children:j(N0,{bold:!0,color:"cyan",children:"Step 6/7: 输入系统提示词"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(B0,{marginBottom:1,children:j(N0,{dimColor:!0,children:"定义 Agent 的行为和职责(可选,留空将使用默认提示)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(B0,{marginBottom:1,children:[j(N0,{color:"green",children:"提示词: "},void 0,!1,void 0,this),j(x2,{value:Q.systemPrompt,onChange:(b)=>K({...Q,systemPrompt:b}),onSubmit:()=>H()},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(B0,{children:j(N0,{dimColor:!0,children:"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Y==="confirm")return j(B0,{flexDirection:"column",paddingY:1,children:[j(B0,{marginBottom:1,children:j(N0,{bold:!0,color:"cyan",children:"Step 7/7: 确认配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(B0,{flexDirection:"column",paddingLeft:2,marginBottom:1,children:[j(N0,{children:[j(N0,{bold:!0,color:"green",children:["名称:"," "]},void 0,!0,void 0,this),j(N0,{children:Q.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(N0,{children:[j(N0,{bold:!0,color:"green",children:["描述:"," "]},void 0,!0,void 0,this),j(N0,{children:Q.description},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(N0,{children:[j(N0,{bold:!0,color:"green",children:["工具:"," "]},void 0,!0,void 0,this),j(N0,{children:Q.tools.includes("all")?"所有工具":Q.tools.join(", ")||"所有工具"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(N0,{children:[j(N0,{bold:!0,color:"green",children:["颜色:"," "]},void 0,!0,void 0,this),j(N0,{children:Q.color||"默认"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(N0,{children:[j(N0,{bold:!0,color:"green",children:["位置:"," "]},void 0,!0,void 0,this),j(N0,{children:Q.location==="project"?"项目级":"用户级"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(N0,{children:[j(N0,{bold:!0,color:"green",children:["提示词:"," "]},void 0,!0,void 0,this),j(N0,{children:Q.systemPrompt||"(使用默认)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),j(p8,{items:[{label:"确认并保存",value:"save"},{label:"返回上一步",value:"back"},{label:"取消",value:"cancel"}],onSelect:(b)=>{if(b.value==="save")A();else if(b.value==="back")C();else J()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}function sZ({config:$,setConfig:J,onNext:X,onPrev:Y}){let{isFocused:Z}=rZ({id:"step-tools"});W0((K,U)=>{if(U.escape)Y()},{isActive:Z});let Q=(K)=>{if(K.includes("all"))J({...$,tools:["all"]});else J({...$,tools:K});X()};return j(B0,{flexDirection:"column",paddingY:1,children:[j(B0,{marginBottom:1,children:j(N0,{bold:!0,color:"cyan",children:"Step 3/7: 选择可用工具"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(B0,{marginBottom:1,children:j(N0,{dimColor:!0,children:"方向键导航,空格切换勾选,Enter 确认进入下一步 | ESC 返回上一步"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(lZ,{options:oZ,defaultValue:$.tools,onSubmit:Q},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import eZ from"node:fs";import{useMemoizedFn as r1}from"ahooks";import{Box as u0,Text as t0}from"ink";import h4 from"ink-select-input";import{useEffect as $5,useMemo as jY,useState as x8}from"react";import{jsxDEV as K0}from"react/jsx-dev-runtime";var g4=10;function EY({workspaceRoot:$,initialMode:J="menu",onComplete:X,onCancel:Y}){let Z=S8($),[Q,K]=x8(J),[U,G]=x8(null),[q,_]=x8(0),[z,O]=x8(0),W=r1(()=>{Z.clear(),Z.loadFromStandardLocations(),_((T)=>T+1)}),F=jY(()=>{return Z.getAllSubagents()},[q]),N=Math.ceil(F.length/g4)||1,w=jY(()=>{let T=z*g4;return F.slice(T,T+g4)},[F,z]);$5(()=>{let T=Math.max(0,N-1);if(z>T)O(T)},[N,z]);let R=r1(()=>{if(z<N-1)O((T)=>T+1)}),H=r1(()=>{if(z>0)O((T)=>T-1)}),C=[{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"}],y=r1((T)=>{if(T.value==="cancel"){Y?.();return}K(T.value)}),A=r1((T)=>{if(G(T.value),Q==="edit")K("editWizard");else if(Q==="delete")K("deleteConfirm")}),B=r1(async()=>{if(!U?.configPath)return;try{await eZ.promises.unlink(U.configPath),W(),b()}catch(T){console.error("删除失败:",T)}}),b=r1(()=>{K("menu"),G(null)}),L=n0(!1,Y);if(W0((T,S)=>{if(S.escape){if(Q==="menu")Y?.();else if(Q==="list"||Q==="edit"||Q==="delete")O(0),b();else if(Q==="deleteConfirm")b()}else if(S.ctrl&&T==="c"||S.meta&&T==="c")L();else if(Q==="list"){if(S.leftArrow||T==="h")H();else if(S.rightArrow||T==="l")R()}},{isActive:Q!=="create"&&Q!=="editWizard"}),Q==="menu")return K0(u0,{flexDirection:"column",paddingY:1,children:[K0(u0,{marginBottom:1,children:K0(t0,{bold:!0,color:"cyan",children:"Agents 管理"},void 0,!1,void 0,this)},void 0,!1,void 0,this),K0(h4,{items:C,onSelect:y},void 0,!1,void 0,this),K0(u0,{marginTop:1,children:K0(t0,{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(F.length===0)return K0(u0,{flexDirection:"column",paddingY:1,children:[K0(u0,{marginBottom:1,children:K0(t0,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this)},void 0,!1,void 0,this),K0(u0,{paddingLeft:2,children:K0(t0,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),K0(u0,{marginTop:1,paddingLeft:2,children:K0(t0,{color:"gray",children:"配置文件位置: .blade/agents/ 或 ~/.blade/agents/"},void 0,!1,void 0,this)},void 0,!1,void 0,this),K0(u0,{marginTop:1,paddingLeft:2,children:K0(t0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return K0(u0,{flexDirection:"column",paddingY:1,children:[K0(u0,{marginBottom:1,children:[K0(t0,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this),K0(t0,{color:"gray",children:[" (共 ",F.length," 个)"]},void 0,!0,void 0,this),N>1&&K0(t0,{color:"yellow",children:[" ","第 ",z+1,"/",N," 页"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),w.map((T)=>K0(u0,{flexDirection:"column",paddingLeft:2,children:[K0(u0,{children:K0(t0,{children:[K0(t0,{bold:!0,color:T.color||"white",children:["• ",T.name]},void 0,!0,void 0,this),K0(t0,{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&&K0(u0,{paddingLeft:2,children:K0(t0,{color:"gray",children:["工具: ",T.tools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),T.configPath&&K0(u0,{paddingLeft:2,children:K0(t0,{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)),K0(u0,{marginTop:1,paddingLeft:2,children:N>1?K0(t0,{dimColor:!0,children:"Left/Right to page | ESC 返回菜单"},void 0,!1,void 0,this):K0(t0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}let D=(T)=>{if(F.length===0)return K0(u0,{flexDirection:"column",paddingY:1,children:[K0(u0,{marginBottom:1,children:K0(t0,{bold:!0,color:"cyan",children:T},void 0,!1,void 0,this)},void 0,!1,void 0,this),K0(u0,{paddingLeft:2,children:K0(t0,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),K0(u0,{marginTop:1,paddingLeft:2,children:K0(t0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);let S=F.map((P)=>({key:P.name,label:`${P.name} - ${P.description}`,value:P}));return K0(u0,{flexDirection:"column",paddingY:1,children:[K0(u0,{marginBottom:1,children:K0(t0,{bold:!0,color:"cyan",children:T},void 0,!1,void 0,this)},void 0,!1,void 0,this),K0(h4,{items:S,onSelect:A},void 0,!1,void 0,this),K0(u0,{marginTop:1,children:K0(t0,{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 K0(c2,{onComplete:()=>{W(),b()},onCancel:b},void 0,!1,void 0,this);if(Q==="edit")return D("编辑 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 K0(c2,{initialConfig:T,onComplete:()=>{W(),b()},onCancel:b},void 0,!1,void 0,this)}if(Q==="delete")return D("删除 Agent");if(Q==="deleteConfirm"&&U)return K0(u0,{flexDirection:"column",paddingY:1,children:[K0(u0,{marginBottom:1,children:K0(t0,{bold:!0,color:"red",children:"确认删除"},void 0,!1,void 0,this)},void 0,!1,void 0,this),K0(u0,{marginBottom:1,paddingLeft:2,children:K0(t0,{children:["你确定要删除 Agent"," ",K0(t0,{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),K0(u0,{marginBottom:1,paddingLeft:2,children:K0(t0,{dimColor:!0,children:["文件路径: ",U.configPath]},void 0,!0,void 0,this)},void 0,!1,void 0,this),K0(u0,{marginBottom:1,paddingLeft:2,children:K0(t0,{color:"red",children:"此操作无法撤销!"},void 0,!1,void 0,this)},void 0,!1,void 0,this),K0(h4,{items:[{label:"确认删除",value:"confirm"},{label:"取消",value:"cancel"}],onSelect:(T)=>{if(T.value==="confirm")B();else b()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}import{Box as F2,Text as T0}from"ink";import Y5,{useEffect as X5,useState as Z5}from"react";import{useEffect as J5,useState as hY}from"react";function pY($=U$(),J=5000){let[X,Y]=hY(null),[Z,Q]=hY(!0);return J5(()=>{let K=!0,U=async()=>{try{let q=await gY($);if(!K)return;if(!q){Y(null),Q(!1);return}let _=await mY($);if(!K)return;Y(_)}catch{if(K)Y(null)}finally{if(K)Q(!1)}};U();let G=null;if(J>0)G=setInterval(U,J);return()=>{if(K=!1,G)clearInterval(G)}},[$,J]),{branch:X,loading:Z}}import{jsxDEV as G0,Fragment as a$}from"react/jsx-dev-runtime";var cY=Y5.memo(()=>{let $=U8(),J=U2(),Y=Q8()==="shortcuts",Z=G9(),Q=Y1(),{branch:K}=pY(Q),U=G8(),G=Y9(),q=iJ(),_=z8(),z=O8(),O=_8(),W=N8(),F=H8(),N=oJ(),w=nJ(),R=q2(),H=F9(),C=K2(),[y,A]=Z5(null);X5(()=>{let S=!1;new m4(Q,C).get().then((i)=>{if(!S)A(i)}).catch(()=>{if(!S)A(null)});let v=m4.subscribe((i)=>{if(!S&&i.sessionId===C&&i.workspaceRoot===Q)A(i.goal)});return()=>{S=!0,v()}},[C,Q]);let B=U?D8(U):!1,L=(()=>{if(J==="default")return null;if(J==="autoEdit")return G0(T0,{color:"magenta",children:[">> ","auto edit on ",G0(T0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="plan")return G0(T0,{color:"cyan",children:["‖ plan mode on ",G0(T0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="yolo")return G0(T0,{color:"red",children:["yolo mode on ",G0(T0,{color:"gray",children:"(all tools auto-approved)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null})(),D=L!==null,T=[["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(F2,{flexDirection:"row",justifyContent:"space-between",paddingX:2,paddingY:0,children:[Y?G0(F2,{flexDirection:"column",gap:0,children:T.map((S,P)=>G0(F2,{flexDirection:"row",children:[S.map((v,i)=>{let[s,u]=v.split(":");return G0(F2,{flexDirection:"row",width:20,children:[G0(T0,{color:"yellow",children:s},void 0,!1,void 0,this),G0(T0,{color:"gray",children:":"},void 0,!1,void 0,this),G0(T0,{color:"white",children:u},void 0,!1,void 0,this)]},i,!0,void 0,this)}),P===T.length-1&&G0(T0,{color:"cyan",children:" ? 关闭"},void 0,!1,void 0,this)]},P,!0,void 0,this))},void 0,!1,void 0,this):G0(F2,{flexDirection:"row",gap:1,children:[K&&G0(a$,{children:[G0(T0,{color:"gray",children:[" ",K]},void 0,!0,void 0,this),G0(T0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),L,D&&G0(T0,{color:"gray",children:"·"},void 0,!1,void 0,this),y&&G0(a$,{children:[G0(T0,{color:y.status==="active"?"green":y.status==="verifying"?"cyan":y.status==="blocked"||y.status==="budget_limited"?"yellow":"gray",children:["goal:",y.status," ",y.objective.slice(0,32),y.prematureStop?` recovery:${y.prematureStop.consecutiveCount}`:"",y.verificationStall?` verify-gap:${y.verificationStall.consecutiveCount}`:"",y.frontierStall?` frontier:${y.frontierStall.category}:${y.frontierStall.consecutiveCount}`:""]},void 0,!0,void 0,this),G0(T0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),G0(T0,{color:"gray",children:"? for shortcuts"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),G0(F2,{flexDirection:"row",gap:1,children:!$?G0(T0,{color:"red",children:"[WARN] API 密钥未配置"},void 0,!1,void 0,this):G0(a$,{children:[B&&G0(a$,{children:[_?G0(T0,{color:"cyan",children:["Effort ",z]},void 0,!0,void 0,this):G0(T0,{color:"gray",children:"Tab:Effort"},void 0,!1,void 0,this),G0(T0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),O!=="auto"&&G0(a$,{children:[G0(T0,{color:O==="fast"?"yellow":"gray",children:["Speed ",O]},void 0,!0,void 0,this),G0(T0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),W!=="auto"&&G0(a$,{children:[G0(T0,{color:"gray",children:["Output ",W]},void 0,!0,void 0,this),G0(T0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),F!=="auto"&&G0(a$,{children:[G0(T0,{color:"gray",children:["Style ",F]},void 0,!0,void 0,this),G0(T0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),U&&G0(T0,{color:"gray",children:U.model},void 0,!1,void 0,this),G0(T0,{color:"gray",children:"·"},void 0,!1,void 0,this),q?G0(T0,{color:"yellow",children:"压缩中..."},void 0,!1,void 0,this):G0(T0,{color:G<20?"red":G<50?"yellow":"gray",children:[G,"%"]},void 0,!0,void 0,this),G0(T0,{color:"gray",children:"·"},void 0,!1,void 0,this),G0(T0,{color:w===void 0?"gray":"cyan",children:["Cache ",xY(w)]},void 0,!0,void 0,this),N>0.001&&G0(a$,{children:[G0(T0,{color:"gray",children:"·"},void 0,!1,void 0,this),G0(T0,{color:"green",children:["$",N<0.01?N.toFixed(4):N.toFixed(3)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),R.length>0&&G0(a$,{children:[G0(T0,{color:"gray",children:"·"},void 0,!1,void 0,this),G0(T0,{color:"yellow",children:["已排队 ",R.length]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),H>0&&G0(a$,{children:[G0(T0,{color:"gray",children:"·"},void 0,!1,void 0,this),G0(T0,{color:"cyan",children:["已恢复 ",H," 条指令"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Z&&G0(a$,{children:[G0(T0,{color:"gray",children:"·"},void 0,!1,void 0,this),G0(T0,{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 p4,Text as x4}from"ink";import Q5 from"react";import{jsxDEV as L2}from"react/jsx-dev-runtime";var uY=Q5.memo(({suggestions:$,selectedIndex:J,visible:X,maxDisplay:Y=8})=>{if(!X||$.length===0)return null;let Z=0,Q=Math.min(Y,$.length),K=J>=$.length;if(J>=Y&&!K)Z=J-Y+1,Q=J+1;let U=$.slice(Z,Q),G=$.length>Y;return L2(p4,{flexDirection:"column",paddingX:2,paddingY:0,children:[U.map((q,_)=>{let O=Z+_===J;return L2(p4,{flexDirection:"row",paddingX:1,gap:2,children:[L2(x4,{color:O?"cyan":"white",bold:O,children:q.command},void 0,!1,void 0,this),L2(x4,{color:O?"cyan":"gray",dimColor:!O,children:["- ",q.description]},void 0,!0,void 0,this)]},q.command,!0,void 0,this)}),G&&L2(p4,{paddingX:1,children:L2(x4,{color:K?"cyan":"gray",bold:K,dimColor:!K,children:["... and ",$.length-Y," more"]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as x$,Text as Q1,useStdout as Z7}from"ink";import Q7 from"ink-select-input";import OJ,{useMemo as b6}from"react";import{Box as C0,Text as m0}from"ink";import i1,{useEffect as qJ,useMemo as a1,useRef as w6}from"react";import{Box as e4,Text as J6}from"ink";import B5 from"react";import{Text as i$}from"ink";import F5 from"react";import sY from"string-width";import u2 from"string-width";function c4({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 K5=c4();function u4($){if(typeof $!=="string")throw TypeError(`Expected a \`string\`, got \`${typeof $}\``);if(!$.includes("\x1B")&&!$.includes(""))return $;return $.replace(K5,"")}var dY=($=0)=>(J)=>`\x1B[${J+$}m`,lY=($=0)=>(J)=>`\x1B[${38+$};5;${J}m`,rY=($=0)=>(J,X,Y)=>`\x1B[${38+$};2;${J};${X};${Y}m`,Y$={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]}},Wz=Object.keys(Y$.modifier),U5=Object.keys(Y$.color),G5=Object.keys(Y$.bgColor),Fz=[...U5,...G5];function q5(){let $=new Map;for(let[J,X]of Object.entries(Y$)){for(let[Y,Z]of Object.entries(X))Y$[Y]={open:`\x1B[${Z[0]}m`,close:`\x1B[${Z[1]}m`},X[Y]=Y$[Y],$.set(Z[0],Z[1]);Object.defineProperty(Y$,J,{value:X,enumerable:!1})}return Object.defineProperty(Y$,"codes",{value:$,enumerable:!1}),Y$.color.close="\x1B[39m",Y$.bgColor.close="\x1B[49m",Y$.color.ansi=dY(),Y$.color.ansi256=lY(),Y$.color.ansi16m=rY(),Y$.bgColor.ansi=dY(10),Y$.bgColor.ansi256=lY(10),Y$.bgColor.ansi16m=rY(10),Object.defineProperties(Y$,{rgbToAnsi256:{value(J,X,Y){if(J===X&&X===Y){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(X/255*5)+Math.round(Y/255*5)},enumerable:!1},hexToRgb:{value(J){let X=/[a-f\d]{6}|[a-f\d]{3}/i.exec(J.toString(16));if(!X)return[0,0,0];let[Y]=X;if(Y.length===3)Y=[...Y].map((Q)=>Q+Q).join("");let Z=Number.parseInt(Y,16);return[Z>>16&255,Z>>8&255,Z&255]},enumerable:!1},hexToAnsi256:{value:(J)=>Y$.rgbToAnsi256(...Y$.hexToRgb(J)),enumerable:!1},ansi256ToAnsi:{value(J){if(J<8)return 30+J;if(J<16)return 90+(J-8);let X,Y,Z;if(J>=232)X=((J-232)*10+8)/255,Y=X,Z=X;else{J-=16;let U=J%36;X=Math.floor(J/36)/5,Y=Math.floor(U/6)/5,Z=U%6/5}let Q=Math.max(X,Y,Z)*2;if(Q===0)return 30;let K=30+(Math.round(Z)<<2|Math.round(Y)<<1|Math.round(X));if(Q===2)K+=60;return K},enumerable:!1},rgbToAnsi:{value:(J,X,Y)=>Y$.ansi256ToAnsi(Y$.rgbToAnsi256(J,X,Y)),enumerable:!1},hexToAnsi:{value:(J)=>Y$.ansi256ToAnsi(Y$.hexToAnsi256(J)),enumerable:!1}}),Y$}var z5=q5(),aY=z5;var u8=new Set(["\x1B",""]),O5=39,l4="\x07",nY="[",_5="]",tY="m",c8=`${_5}8;;`,iY=($)=>`${u8.values().next().value}${nY}${$}${tY}`,oY=($)=>`${u8.values().next().value}${c8}${$}${l4}`,N5=($)=>$.split(" ").map((J)=>u2(J)),d4=($,J,X)=>{let Y=[...J],Z=!1,Q=!1,K=u2(u4($.at(-1)));for(let[U,G]of Y.entries()){let q=u2(G);if(K+q<=X)$[$.length-1]+=G;else $.push(G),K=0;if(u8.has(G))Z=!0,Q=Y.slice(U+1,U+1+c8.length).join("")===c8;if(Z){if(Q){if(G===l4)Z=!1,Q=!1}else if(G===tY)Z=!1;continue}if(K+=q,K===X&&U<Y.length-1)$.push(""),K=0}if(!K&&$.at(-1).length>0&&$.length>1)$[$.length-2]+=$.pop()},H5=($)=>{let J=$.split(" "),X=J.length;while(X>0){if(u2(J[X-1])>0)break;X--}if(X===J.length)return $;return J.slice(0,X).join(" ")+J.slice(X).join("")},W5=($,J,X={})=>{if(X.trim!==!1&&$.trim()==="")return"";let Y="",Z,Q,K=N5($),U=[""];for(let[z,O]of $.split(" ").entries()){if(X.trim!==!1)U[U.length-1]=U.at(-1).trimStart();let W=u2(U.at(-1));if(z!==0){if(W>=J&&(X.wordWrap===!1||X.trim===!1))U.push(""),W=0;if(W>0||X.trim===!1)U[U.length-1]+=" ",W++}if(X.hard&&K[z]>J){let F=J-W,N=1+Math.floor((K[z]-F-1)/J);if(Math.floor((K[z]-1)/J)<N)U.push("");d4(U,O,J);continue}if(W+K[z]>J&&W>0&&K[z]>0){if(X.wordWrap===!1&&W<J){d4(U,O,J);continue}U.push("")}if(W+K[z]>J&&X.wordWrap===!1){d4(U,O,J);continue}U[U.length-1]+=O}if(X.trim!==!1)U=U.map((z)=>H5(z));let G=U.join(`
|
|
122
|
-
`),q=[...G],_=0;for(let[z,O]of q.entries()){if(Y+=O,u8.has(O)){let{groups:F}=new RegExp(`(?:\\${nY}(?<code>\\d+)m|\\${c8}(?<uri>.*)${l4})`).exec(G.slice(_))||{groups:{}};if(F.code!==void 0){let N=Number.parseFloat(F.code);Z=N===O5?void 0:N}else if(F.uri!==void 0)Q=F.uri.length===0?void 0:F.uri}let W=aY.codes.get(Number(Z));if(q[z+1]===`
|
|
123
|
-
`){if(Q)Y+=oY("");if(Z&&W)Y+=iY(W)}else if(O===`
|
|
124
|
-
`){if(Z&&W)Y+=iY(Z);if(Q)Y+=oY(Q)}_+=O.length}return Y};function r4($,J,X){return String($).normalize().replaceAll(`\r
|
|
125
|
-
`,`
|
|
126
|
-
`).split(`
|
|
127
|
-
`).map((Y)=>W5(Y,J,X)).join(`
|
|
128
|
-
`)}var a4=($)=>{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 sY(J)};var eY=($)=>{return/[*_~`<[\]https?:]/.test($)},i4=($)=>{let X=$.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((Y)=>Y.length>0);if(X.length===0)return 0;return Math.max(...X.map((Y)=>sY(Y)))},w2=($,J,X=!1)=>{if(J<=0)return[$];let Y=$.trimEnd(),Q=r4(Y,J,{hard:X,trim:!1,wordWrap:!0}).split(`
|
|
129
|
-
`).filter((K)=>K.length>0);return Q.length>0?Q:[""]},$6=($,J,X,Y)=>{let Z=Math.max(0,X-J);if(Y==="center"){let Q=Math.floor(Z/2);return" ".repeat(Q)+$+" ".repeat(Z-Q)}if(Y==="right")return" ".repeat(Z)+$;return $+" ".repeat(Z)};import{jsxDEV as p$,Fragment as w5}from"react/jsx-dev-runtime";var o4=2,n4=1,t4=2;function s4($,J){return`inline-${$}-${J}`}var L5=({text:$})=>{let J=k0();if(!eY($))return p$(i$,{children:$},void 0,!1,void 0,this);let X=[],Y=0,Z=0,Q=0,K=/(\*\*.*?\*\*|\*(?!\s).*?(?<!\s)\*|_(?!\s).*?(?<!\s)_|~~.*?~~|`+[^`]+`+|\[.*?\]\(.*?\)|https?:\/\/\S+)/g,U;while((U=K.exec($))!==null){if(U.index>Y){let z=$.slice(Y,U.index);X.push(p$(i$,{children:z},s4("text",Z++),!1,void 0,this))}let G=U[0],q=null,_=s4("match",Q++);try{if(G.startsWith("**")&&G.endsWith("**")&&G.length>o4*2)q=p$(i$,{bold:!0,children:G.slice(o4,-o4)},_,!1,void 0,this);else if(G.length>n4*2&&(G.startsWith("*")&&G.endsWith("*")||G.startsWith("_")&&G.endsWith("_"))){let z=$.substring(U.index-1,U.index),O=$.substring(K.lastIndex,K.lastIndex+1);if(!(/\w/.test(z)||/\w/.test(O)||/[./\\]/.test(z+O)))q=p$(i$,{italic:!0,children:G.slice(n4,-n4)},_,!1,void 0,this)}else if(G.startsWith("~~")&&G.endsWith("~~")&&G.length>t4*2)q=p$(i$,{strikethrough:!0,children:G.slice(t4,-t4)},_,!1,void 0,this);else if(G.startsWith("`")&&G.endsWith("`")){let z=G.match(/^(`+)([^`]+)\1$/);if(z&&z[2])q=p$(i$,{color:J.colors.syntax.keyword,backgroundColor:J.colors.background.secondary,bold:!0,children:` ${z[2]} `},_,!1,void 0,this)}else if(G.startsWith("[")&&G.includes("](")&&G.endsWith(")")){let z=G.match(/\[(.*?)\]\((.*?)\)/);if(z){let O=z[1],W=z[2];q=p$(i$,{children:[O,p$(i$,{color:J.colors.info,children:[" (",W,")"]},void 0,!0,void 0,this)]},_,!0,void 0,this)}}else if(G.match(/^https?:\/\//))q=p$(i$,{color:J.colors.info,children:G},_,!1,void 0,this)}catch(z){console.error("InlineRenderer 解析错误:",G,z),q=null}X.push(q??p$(i$,{children:G},_,!1,void 0,this)),Y=K.lastIndex}if(Y<$.length){let G=$.slice(Y);X.push(p$(i$,{children:G},s4("text",Z++),!1,void 0,this))}return p$(w5,{children:X.filter((G)=>G!==null)},void 0,!1,void 0,this)},o$=F5.memo(L5);import{jsxDEV as B2}from"react/jsx-dev-runtime";var A5="▎",Y6=B5.memo(({lines:$,level:J})=>{let X=k0(),Y=A5.repeat(J);return B2(e4,{flexDirection:"column",children:$.map((Z,Q)=>{if(Z.trim()==="")return B2(e4,{height:1},Q,!1,void 0,this);return B2(e4,{flexDirection:"row",children:[B2(J6,{dimColor:!0,color:X.colors.text.muted,children:[Y," "]},void 0,!0,void 0,this),B2(J6,{italic:!0,wrap:"wrap",children:B2(o$,{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 l8,Text as W1}from"ink";import{isPlainObject as XJ}from"lodash-es";import{common as k5,createLowlight as f5}from"lowlight";import{LRUCache as D5}from"lru-cache";import q6 from"react";import{Box as d8,Text as d2}from"ink";import H1,{Fragment as U6}from"react";import{LRUCache as K6}from"lru-cache";import b5 from"string-width";var P5=1024,M5=1048576,X6=1000,Z6=new K6({max:P5,maxSize:M5,sizeCalculation:($,J)=>Math.max(1,J.length*2+$.length*8)});function $J($){let J=!0;for(let Y=0;Y<$.length;Y++)if($.charCodeAt(Y)>127){J=!1;break}if(J)return $.split("");if($.length<=X6){let Y=Z6.get($);if(Y)return Y}let X=Array.from($);if($.length<=X6)Z6.set($,X);return X}var y5=2048,T5=524288,R5=4096,Q6=new K6({max:y5,maxSize:T5,sizeCalculation:($,J)=>Math.max(1,J.length*2+8)});function N1($){if(/^[\x20-\x7E]*$/.test($))return $.length;let J=Q6.get($);if(J!==void 0)return J;let X=b5($);if($.length<=R5)Q6.set($,X);return X}import{jsxDEV as A2}from"react/jsx-dev-runtime";var JJ=2,G6=H1.memo(({children:$,maxWidth:J,maxHeight:X,overflowDirection:Y="top",additionalHiddenLinesCount:Z=0})=>{let Q=k0(),K=[],U=Math.max(Math.round(X??Number.MAX_SAFE_INTEGER),JJ);function G(N){if(!H1.isValidElement(N))return;if(N.type===U6){H1.Children.forEach(N.props.children,G);return}if(N.type===d8){I5(N,J,K);return}}H1.Children.forEach($,G);let _=K.length>U||Z>0?U-1:U,z=_!==void 0?Math.max(0,K.length-_):0,O=z+Z,F=(z>0?Y==="top"?K.slice(z):K.slice(0,_):K).map((N,w)=>A2(d8,{children:N.length>0?N.map((R,H)=>A2(d2,{...R.props,children:R.text},H,!1,void 0,this)):A2(d2,{children:" "},void 0,!1,void 0,this)},w,!1,void 0,this));return A2(d8,{flexDirection:"column",width:J,flexShrink:0,children:[O>0&&Y==="top"&&A2(d2,{color:Q.colors.text.muted,dimColor:!0,children:["... ",O," line",O===1?"":"s"," hidden ..."]},void 0,!0,void 0,this),F,O>0&&Y==="bottom"&&A2(d2,{color:Q.colors.text.muted,dimColor:!0,children:["... ",O," line",O===1?"":"s"," hidden ..."]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});function C5($){if(!H1.isValidElement($)||$.type!==d8)return{noWrapSegments:[],segments:[]};let J={noWrapSegments:[],segments:[]},X=!1;function Y(Z,Q){if(Z===null||Z===void 0)return;if(typeof Z==="string"||typeof Z==="number"){let q=String(Z);if(!q)return;let _={text:q,props:Q??{}};if(Q===void 0||Q.wrap==="wrap")X=!0,J.segments.push(_);else if(!X)J.noWrapSegments.push(_);else J.segments.push(_);return}if(!H1.isValidElement(Z))return;if(Z.type===U6){H1.Children.forEach(Z.props.children,(q)=>Y(q,Q));return}if(Z.type!==d2)return;let{children:K,...U}=Z.props,G=Q===void 0?U:{...Q,...U};H1.Children.forEach(K,(q)=>Y(q,G))}return H1.Children.forEach($.props.children,(Z)=>Y(Z,void 0)),J}function I5($,J,X){let Y=C5($);if(Y.segments.length===0&&Y.noWrapSegments.length===0){X.push([]);return}let Z=0;for(let z of Y.noWrapSegments)Z+=N1(z.text);if(Y.segments.length===0){let z=[],O=[];for(let W of Y.noWrapSegments){let F=W.text.split(`
|
|
130
|
-
`);for(let N=0;N<F.length;N++){if(N>0)z.push(O),O=[];if(F[N])O.push({text:F[N],props:W.props})}}if(O.length>0)z.push(O);for(let W of z)X.push(W);return}let Q=J-Z;if(Q<1){S5(Y.noWrapSegments,J,X);return}let K=[],U=[],G=0;function q(){if(K.length===0)K.push([...Y.noWrapSegments,...U]);else if(Z>0)K.push([{text:" ".repeat(Z),props:{}},...U]);else K.push(U);U=[],G=0}function _(z,O){if(U.length>0&&U[U.length-1].props===O)U[U.length-1].text+=z;else U.push({text:z,props:O})}for(let z of Y.segments){let O=z.text.split(`
|
|
131
|
-
`);for(let W=0;W<O.length;W++){if(W>0)q();let N=O[W].split(/(\s+)/);for(let w of N){if(!w)continue;let R=N1(w);if(G+R>Q&&G>0){if(q(),/^\s+$/.test(w))continue}if(R>Q){let C=$J(w);while(C.length>0){let y=0,A=0;for(let B of C){let b=N1(B);if(G+A+b>Q)break;A+=b,y++}if(y>0){let B=C.slice(0,y).join("");_(B,z.props),G+=N1(B),C=C.slice(y)}if(C.length>0)q()}}else _(w,z.props),G+=R}}if(z.text.endsWith(`
|
|
132
|
-
`))q()}if(U.length>0)q();for(let z of K)X.push(z)}function S5($,J,X){let Y=[],Z=[],Q=0;for(let K of $){let U=K.text.split(`
|
|
133
|
-
`);for(let G=0;G<U.length;G++){if(G>0)Y.push(Z),Z=[],Q=0;let q=U[G];if(!q)continue;let _=N1(q),z=Math.max(0,J-N1("…"));if(_<=z&&Q===0)Z.push({text:q,props:K.props}),Q+=_;else{let O=$J(q),W=Q,F=0;for(let w of O){let R=N1(w);if(W+R>z)break;W+=R,F++}let N=O.slice(0,F).join("");if(N)Z.push({text:N,props:K.props});Z.push({text:"…",props:{}}),Q=W+N1("…")}}}if(Z.length>0)Y.push(Z);if(Y.length===0)Y.push([{text:"…",props:{}}]);for(let K of Y)X.push(K)}import{jsxDEV as C$}from"react/jsx-dev-runtime";var YJ=f5(k5),v5=200,V5=524288,j5=4096,z6=new D5({max:v5,maxSize:V5,sizeCalculation:($)=>$.retainedChars});function O6($,J){return`${J??"__auto__"}\x00${$}`}function E5($,J){return z6.get(O6($,J))?.root}function h5($,J,X){if($.length>j5)return;let Y=J?.length??0;z6.set(O6($,J),{root:X,retainedChars:Math.max(1,$.length*2+Y)})}function g5($){return XJ($)&&$.type==="text"&&typeof $.value==="string"}function m5($){return XJ($)&&$.type==="element"}function p5($){return XJ($)&&$.type==="root"&&Array.isArray($.children)}function r8($,J,X=0){if(g5($))return C$(W1,{wrap:"wrap",children:$.value},X,!1,void 0,this);if(m5($)){let Y=$.properties?.className?.[0]||"",Z=J.default;if(Y.includes("comment"))Z=J.comment;else if(Y.includes("string"))Z=J.string;else if(Y.includes("number"))Z=J.number;else if(Y.includes("keyword"))Z=J.keyword;else if(Y.includes("function"))Z=J.function;else if(Y.includes("variable"))Z=J.variable;else if(Y.includes("operator"))Z=J.operator;else if(Y.includes("type"))Z=J.type;else if(Y.includes("tag"))Z=J.tag;else if(Y.includes("attr"))Z=J.attr;let Q=$.children?.map((K,U)=>r8(K,J,U));return C$(W1,{color:Z,wrap:"wrap",children:Q},X,!1,void 0,this)}if(p5($))return C$(q6.Fragment,{children:$.children.map((Y,Z)=>r8(Y,J,Z))},X,!1,void 0,this);return C$(W1,{},X,!1,void 0,this)}function x5($,J,X){let Y=X||W$.getTheme().colors.syntax;try{let Z=E5($,J);if(Z)return r8(Z,Y);let Q;if(!J||!YJ.registered(J))Q=YJ.highlightAuto($);else Q=YJ.highlight(J,$);let K=Q;if(!K.children||K.children.length===0)return C$(W1,{color:Y.default,wrap:"wrap",children:$},void 0,!1,void 0,this);return h5($,J,Q),r8(Q,Y)}catch(Z){return C$(W1,{color:Y.default,wrap:"wrap",children:$},void 0,!1,void 0,this)}}var a8=q6.memo(({content:$,language:J,showLineNumbers:X=!0,terminalWidth:Y,availableHeight:Z})=>{let Q=k0(),K=$.split(`
|
|
134
|
-
`),U=0;if(Z&&K.length>Z){let z=Math.max(Z,JJ);if(K.length>z)U=K.length-z,K=K.slice(U)}let G=K.length+U,q=String(G).length+1,_=Math.max(20,Y-4);return C$(l8,{borderStyle:"round",borderColor:Q.colors.border.light,paddingX:1,paddingY:0,marginY:1,flexDirection:"column",children:[J&&C$(l8,{marginBottom:0,children:C$(W1,{color:Q.colors.text.secondary,children:J},void 0,!1,void 0,this)},void 0,!1,void 0,this),U>0&&C$(l8,{marginBottom:0,children:C$(W1,{color:Q.colors.text.muted,dimColor:!0,children:["... ",U," lines hidden ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),C$(G6,{maxWidth:_,maxHeight:Z,children:K.map((z,O)=>{let W=O+U+1;return C$(l8,{flexDirection:"row",children:[X&&C$(W1,{color:Q.colors.text.muted,dimColor:!0,wrap:"truncate",children:[String(W).padStart(q-1," ")," "]},void 0,!0,void 0,this),z.trim()===""?C$(W1,{wrap:"wrap",children:" "},void 0,!1,void 0,this):x5(z,J,Q.colors.syntax)]},O,!0,void 0,this)})},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as _6,Text as V$}from"ink";import c5,{useState as u5}from"react";import{jsxDEV as I$}from"react/jsx-dev-runtime";var N6=400;function d5($){let J=$.split(`
|
|
135
|
-
`),X=[],Y=0,Z=0;for(let Q of J){if(Q.startsWith("---")||Q.startsWith("+++"))continue;if(Q.startsWith("@@")){let K=Q.match(/@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@/);if(K)Y=parseInt(K[1],10),Z=parseInt(K[3],10);X.push({type:"header",content:Q});continue}if(Q.startsWith("-")){X.push({type:"remove",content:Q.substring(1),lineNumber:Y}),Y++;continue}if(Q.startsWith("+")){X.push({type:"add",content:Q.substring(1),lineNumber:Z}),Z++;continue}if(Q.startsWith(" ")||Q===""){X.push({type:"context",content:Q.substring(1),lineNumber:Z}),Y++,Z++;continue}}return X}var ZJ=c5.memo(({patch:$,startLine:J,matchLine:X,terminalWidth:Y,maxLines:Z=20,isFocused:Q=!1})=>{let K=k0(),U=d5($),[G,q]=u5(!1);W0((H)=>{if(H.toLowerCase()==="e")q((C)=>!C)},{isActive:Q&&U.length>Z});let z=Math.max(...U.map((H)=>H.lineNumber||0)).toString().length+1,O=U.filter((H)=>H.type==="add").length,W=U.filter((H)=>H.type==="remove").length,F=U.length,N=F>Z,w;if(!N)w=U;else if(G)w=U.slice(0,N6);else w=U.slice(0,Z);let R=F-w.length;return I$(_6,{flexDirection:"column",marginTop:1,marginBottom:1,children:[I$(V$,{color:K.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,Y)))},void 0,!1,void 0,this),N&&I$(V$,{color:K.colors.info,children:[G?`已展开 ${w.length}/${F} 行`:`显示前 ${Z} 行,共 ${F} 行`," · ",I$(V$,{color:K.colors.success,children:["+",O]},void 0,!0,void 0,this)," ",I$(V$,{color:K.colors.error,children:["-",W]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),N&&I$(V$,{color:K.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,Y)))},void 0,!1,void 0,this),w.map((H,C)=>{if(H.type==="header")return I$(V$,{color:K.colors.muted,dimColor:!0,children:H.content},C,!1,void 0,this);let y=H.lineNumber?H.lineNumber.toString().padStart(z," "):" ".repeat(z),A=" ",B,b;if(H.type==="add")A="+",b=K.colors.success,B=void 0;else if(H.type==="remove")A="-",b=K.colors.error,B=void 0;else b=K.colors.text.primary;let L=Math.max(0,Y-z-2),D=H.content;if(D.length>L)D=D.substring(0,L-3)+"...";return I$(V$,{color:b,backgroundColor:B,children:[I$(V$,{dimColor:!0,children:y},void 0,!1,void 0,this),I$(V$,{children:A},void 0,!1,void 0,this),I$(V$,{children:[" ",D]},void 0,!0,void 0,this)]},C,!0,void 0,this)}),N&&I$(_6,{marginTop:1,children:G?I$(V$,{color:K.colors.info,dimColor:!0,children:[R>0?`已达显示上限 ${N6} 行,仍有 ${R} 行未显示`:"已显示全部内容",Q?" · 按 E 折叠":""]},void 0,!0,void 0,this):I$(V$,{color:K.colors.info,dimColor:!0,children:["已隐藏剩余 ",R," 行",Q?" · 按 E 展开全部":""]},void 0,!0,void 0,this)},void 0,!1,void 0,this),I$(V$,{color:K.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,Y)))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as QJ,Text as H6}from"ink";import l5 from"react";import{jsxDEV as b2}from"react/jsx-dev-runtime";var r5=({itemText:$,type:J,marker:X,leadingWhitespace:Y=""})=>{let Z=J==="ol"?`${X}. `:`${X} `,Q=Z.length,K=Y.length;return b2(QJ,{paddingLeft:K+1,flexDirection:"row",children:[b2(QJ,{width:Q,children:b2(H6,{children:Z},void 0,!1,void 0,this)},void 0,!1,void 0,this),b2(QJ,{flexGrow:1,children:b2(H6,{wrap:"wrap",children:b2(o$,{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)},KJ=l5.memo(r5);import{Text as UJ}from"ink";import a5,{useMemo as i5}from"react";import W6 from"string-width";import{jsxDEV as GJ}from"react/jsx-dev-runtime";var F6=4,P2=3,o5=4,L6=a5.memo(({headers:$,rows:J,terminalWidth:X})=>{let Y=k0(),Z=i5(()=>{if($.length===0||J.length===0)return null;let z=$.length,O=$.map((b,L)=>{let D=Math.max(i4(b),P2);for(let T of J)D=Math.max(D,i4(T[L]||""));return D}),W=$.map((b,L)=>{let D=Math.max(a4(b),P2);for(let T of J)D=Math.max(D,a4(T[L]||""));return D}),F=1+z*3,N=Math.max(X-F-F6,z*P2),w=O.reduce((b,L)=>b+L,0),R=W.reduce((b,L)=>b+L,0),H=!1,C;if(R<=N)C=W;else if(w<=N){let b=N-w,L=W.map((T,S)=>T-O[S]),D=L.reduce((T,S)=>T+S,0);C=O.map((T,S)=>{if(D===0)return T;let P=Math.floor(L[S]/D*b);return T+P})}else{H=!0;let b=N/w;C=O.map((L)=>Math.max(Math.floor(L*b),P2))}function y(){let b=1;for(let L=0;L<$.length;L++){let D=w2($[L],C[L],H);b=Math.max(b,D.length)}for(let L of J)for(let D=0;D<L.length;D++){let T=w2(L[D]||"",C[D],H);b=Math.max(b,T.length)}return b}if(y()>o5)return{type:"vertical",columnWidths:C,needsHardWrap:H};return{type:"horizontal",columnWidths:C,needsHardWrap:H}},[$,J,X]);if(!Z)return null;if(Z.type==="vertical"){let z=Math.min(X-1,40),O="─".repeat(z);return GJ(UJ,{children:J.map((W,F)=>{let N=[];if(F>0)N.push(O);return W.forEach((w,R)=>{let H=$[R]||`Column ${R+1}`,C=(w||"").replace(/\n+/g," ").trim();N.push(`\x1B[1m${H}:\x1B[22m ${C}`)}),N.join(`
|
|
136
|
-
`)}).join(`
|
|
137
|
-
`)},void 0,!1,void 0,this)}let{columnWidths:Q,needsHardWrap:K}=Z;function U(z){let W={top:{left:"┌",mid:"┬",right:"┐",h:"─"},middle:{left:"├",mid:"┼",right:"┤",h:"─"},bottom:{left:"└",mid:"┴",right:"┘",h:"─"}}[z],F=W.left;return Q.forEach((N,w)=>{F+=W.h.repeat(N+2),F+=w<Q.length-1?W.mid:W.right}),F}function G(z,O){let W=z.map((R,H)=>{let C=Q[H]||P2;return w2(R||"",C,K)}),F=Math.max(...W.map((R)=>R.length),1),N=W.map((R)=>Math.floor((F-R.length)/2)),w=[];for(let R=0;R<F;R++){let H="│";for(let C=0;C<z.length;C++){let y=W[C],A=N[C],B=R-A,b=B>=0&&B<y.length?y[B]:"",L=Q[C]||P2,D=W6(b),T=$6(O?`\x1B[1m${b}\x1B[22m`:b,D,L,O?"center":"left");H+=` ${T} │`}w.push(H)}return w}let q=[];if(q.push(U("top")),q.push(...G($,!0)),q.push(U("middle")),J.forEach((z,O)=>{if(q.push(...G(z,!1)),O<J.length-1)q.push(U("middle"))}),q.push(U("bottom")),Math.max(...q.map((z)=>W6(z)))>X-F6){let z=Math.min(X-1,40),O="─".repeat(z);return GJ(UJ,{children:J.map((W,F)=>{let N=[];if(F>0)N.push(O);return W.forEach((w,R)=>{let H=$[R]||`Column ${R+1}`,C=(w||"").replace(/\n+/g," ").trim();N.push(`\x1B[1m${H}:\x1B[22m ${C}`)}),N.join(`
|
|
138
|
-
`)}).join(`
|
|
139
|
-
`)},void 0,!1,void 0,this)}return GJ(UJ,{color:Y.colors.text.primary,children:q.join(`
|
|
140
|
-
`)},void 0,!1,void 0,this)});import{jsxDEV as c}from"react/jsx-dev-runtime";var n5=($,J,X)=>{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 Y=X&&"phase"in X?X.phase:void 0;return{color:J.text.secondary,prefix:Y==="start"?"• ":Y==="complete"?" └ ":" "}}default:return{color:J.text.primary,prefix:" "}}},t5=i1.memo(({content:$,language:J,terminalWidth:X,isPending:Y=!1,availableHeight:Z})=>{let Q=k0();if(Y&&Z!==void 0){let K=$.split(`
|
|
141
|
-
`),U=4,G=Math.max(1,Z-4);if(K.length>G){let q=K.slice(0,G).join(`
|
|
142
|
-
`);return c(C0,{flexDirection:"column",flexShrink:0,children:[c(a8,{content:q,language:J,showLineNumbers:!0,terminalWidth:X},void 0,!1,void 0,this),c(m0,{color:Q.colors.text.muted,dimColor:!0,children:"... generating more code ..."},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}}return c(a8,{content:$,language:J,showLineNumbers:!0,terminalWidth:X},void 0,!1,void 0,this)}),s5=i1.memo(({content:$,level:J})=>{let X=k0();switch(J){case 1:return c(m0,{bold:!0,color:X.colors.primary,children:c(o$,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 2:return c(m0,{bold:!0,color:X.colors.primary,children:c(o$,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 3:return c(m0,{bold:!0,color:X.colors.text.primary,children:c(o$,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 4:return c(m0,{italic:!0,color:X.colors.text.muted,children:c(o$,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);default:return c(m0,{children:c(o$,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)}}),e5=i1.memo(({terminalWidth:$})=>{let J=k0(),X=Math.max(0,Math.min($-4,80));return c(m0,{dimColor:!0,color:J.colors.text.muted,children:"─".repeat(X)},void 0,!1,void 0,this)}),$7=i1.memo(({content:$})=>{return c(m0,{wrap:"wrap",children:c(o$,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)}),J7=i1.memo(({content:$})=>{let J=k0();return c(C0,{flexDirection:"row",gap:1,children:[c(m0,{color:J.colors.info,children:" "},void 0,!1,void 0,this),c(m0,{color:J.colors.text.muted,italic:!0,children:$},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}),Y7=i1.memo(({detail:$,terminalWidth:J})=>{let X=k0(),Y=50,Z=$.split(`
|
|
143
|
-
`);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,K=Q?Z.slice(0,50):Z,U=K.join(`
|
|
144
|
-
`),G=U.includes("<<<DIFF>>>"),q=U.includes("```");if(G){let _=U.match(/<<<DIFF>>>\s*({[\s\S]*?})\s*<<<\/DIFF>>>/);if(_)try{let z=JSON.parse(_[1]);return c(C0,{flexDirection:"column",children:[c(ZJ,{patch:z.patch,startLine:z.startLine,matchLine:z.matchLine,terminalWidth:J},void 0,!1,void 0,this),Q&&c(C0,{marginTop:1,children:c(m0,{dimColor:!0,color:X.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(q){let _=U.match(/```(\w+)?\s*\n([\s\S]*?)\n```/);if(_){let z=_[1]||"text",O=_[2];return c(C0,{flexDirection:"column",children:[c(a8,{content:O,language:z,showLineNumbers:!1,terminalWidth:J},void 0,!1,void 0,this),Q&&c(C0,{marginTop:1,children:c(m0,{dimColor:!0,color:X.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 c(C0,{flexDirection:"column",children:[K.map((_,z)=>c(m0,{color:X.colors.text.primary,children:_},z,!1,void 0,this)),Q&&c(C0,{marginTop:1,children:c(m0,{dimColor:!0,color:X.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 X7($,J,X,Y=80){if(!X||J===void 0||J<=0)return{content:$,isTruncated:!1,hiddenLines:0};let Q=Math.max(1,J-8),K=Math.max(40,Y*0.8),U=Q*K;if($.length<=U)return{content:$,isTruncated:!1,hiddenLines:0};let G=Math.floor(U*0.9),q=$.length-G,_=q,z=$.indexOf(`
|
|
145
|
-
`,q);if(z!==-1&&z-q<K)_=z+1;let O=$.slice(_),F=($.slice(0,_).match(/\n/g)||[]).length+1;return{content:O,isTruncated:!0,hiddenLines:F}}var Z1=i1.memo(({content:$,role:J,terminalWidth:X,metadata:Y,isPending:Z=!1,availableTerminalHeight:Q,hidePrefix:K=!1,noMargin:U=!1,renderPlainTextOnly:G=!1,streamingLines:q,streamingHiddenLines:_,messageId:z,blocksOverride:O,currentLineOverride:W,streamingMode:F="text",renderCodeBlocksAsPlainText:N=!1})=>{let w=k0(),R=O!==void 0,H=a1(()=>n5(J,w.colors,Y),[J,w.colors,Y]),{color:C,prefix:y}=H,A=y.length+1,B=a1(()=>{if(!Y||typeof Y!=="object")return null;if(!("subtaskRef"in Y))return null;let f=Y.subtaskRef;if(!f||typeof f!=="object")return null;return f},[Y]),b=J==="tool"&&Y?.phase==="start",L=!U&&!b,D=a1(()=>{if(!G)return[];return $.split(/\r?\n/)},[$,G]);if(!R&&Z){let f=q??$.split(/\r?\n/),a=_??0,e=!1,Z0=!1,V=!1;if(F!=="text")e=F==="code",Z0=F==="diff",V=F==="table";return c(C0,{flexDirection:"column",marginBottom:L?1:0,flexShrink:0,children:[a>0&&c(C0,{flexDirection:"row",flexShrink:0,children:[c(C0,{width:A,flexShrink:0},void 0,!1,void 0,this),c(m0,{color:w.colors.text.muted,dimColor:!0,children:["^ ",a," lines above (streaming...)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),f.map((Y0,t)=>{if(F==="text"){if(Y0.match(k1.codeBlock))e=!e;else if(Y0.match(k1.diffStart))Z0=!0;else if(Y0.match(k1.diffEnd))Z0=!1;else if(Y0.match(k1.table))V=!0;else if(V&&!Y0.match(k1.table))V=!1}let M=F==="text"&&!e&&!Z0&&!V,k=M?Y0.match(k1.ulItem):null,E=M?Y0.match(k1.olItem):null,x=k??E;return c(C0,{flexDirection:"row",flexShrink:0,children:[t===0&&!K?c(C0,{marginRight:1,flexShrink:0,children:c(m0,{color:C,bold:!0,children:y},void 0,!1,void 0,this)},void 0,!1,void 0,this):c(C0,{width:A,flexShrink:0},void 0,!1,void 0,this),c(C0,{flexGrow:1,flexShrink:0,children:x?c(KJ,{type:k?"ul":"ol",marker:x[2],itemText:x[3],leadingWhitespace:x[1]},void 0,!1,void 0,this):c(m0,{wrap:"wrap",children:Y0===""?" ":Y0},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},t,!0,void 0,this)})]},void 0,!0,void 0,this)}if(!R&&G)return c(C0,{flexDirection:"column",marginBottom:L?1:0,flexShrink:0,children:D.map((f,a)=>c(C0,{flexDirection:"row",flexShrink:0,children:[a===0&&!K?c(C0,{marginRight:1,flexShrink:0,children:c(m0,{color:C,bold:!0,children:y},void 0,!1,void 0,this)},void 0,!1,void 0,this):c(C0,{width:A,flexShrink:0},void 0,!1,void 0,this),c(C0,{flexGrow:1,flexShrink:0,children:c(m0,{wrap:"wrap",children:f===""?" ":f},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},a,!0,void 0,this))},void 0,!1,void 0,this);let T=w6(null);qJ(()=>{T.current=null},[z]);let S=a1(()=>{if(R)return null;if(!z)return null;return B6(z)},[z,R]);qJ(()=>{if(R)return;if(!S||!z)return;T.current={messageId:z,blocks:S}},[S,z,R]),qJ(()=>{if(R)return;if(!S||!z)return;A6(z)},[S,z,R]);let P=a1(()=>R?{content:$,isTruncated:!1,hiddenLines:0}:X7($,Q,Z,X),[$,Q,Z,X,R]),{content:v,isTruncated:i,hiddenLines:s}=P;if(!R&&J==="tool"&&Y&&"detail"in Y){let f=Y;if(f.detail)return c(C0,{flexDirection:"column",marginBottom:U?0:1,children:[c(C0,{flexDirection:"row",children:[c(C0,{marginRight:1,children:c(m0,{color:C,bold:!0,children:y},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(m0,{color:C,children:$},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(C0,{marginLeft:y.length+1,children:c(Y7,{detail:f.detail,terminalWidth:X-(y.length+1)},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}let{completedContent:u,currentLine:_0}=a1(()=>{if(R)return{completedContent:"",currentLine:W??""};if(!Z)return{completedContent:v,currentLine:""};let f=v.lastIndexOf(`
|
|
146
|
-
`);if(f===-1)return{completedContent:"",currentLine:v};return{completedContent:v.slice(0,f+1),currentLine:v.slice(f+1)}},[v,Z,R,W]),m=w6({content:"",blocks:[]}),o=a1(()=>{if(R)return O??[];if(S)return S;if(T.current&&T.current.messageId===z)return T.current.blocks;let f=m.current;if(!Z||!u.startsWith(f.content)){let V=zJ(u);return m.current={content:u,blocks:V},V}if(u===f.content)return f.blocks;let a=u.slice(f.content.length),e=zJ(a),Z0=[...f.blocks,...e];return m.current={content:u,blocks:Z0},Z0},[u,Z,R,O]);return c(C0,{flexDirection:"column",marginBottom:L?1:0,flexShrink:0,children:[i&&c(C0,{flexDirection:"row",flexShrink:0,children:[c(C0,{width:A,flexShrink:0},void 0,!1,void 0,this),c(m0,{color:w.colors.text.muted,dimColor:!0,children:["^ ",s," lines above (streaming...)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),o.map((f,a)=>{if(f.type==="empty")return c(C0,{height:1,flexShrink:0},a,!1,void 0,this);return c(C0,{flexDirection:"row",flexShrink:0,children:[a===0&&!K&&c(C0,{marginRight:1,flexShrink:0,children:c(m0,{color:C,bold:!0,children:y},void 0,!1,void 0,this)},void 0,!1,void 0,this),(a>0||K)&&c(C0,{width:A,flexShrink:0},void 0,!1,void 0,this),c(C0,{flexGrow:1,flexShrink:0,children:f.type==="code"?N?c(m0,{wrap:"wrap",children:f.content},void 0,!1,void 0,this):c(t5,{content:f.content,language:f.language,terminalWidth:X-A,isPending:Z,availableHeight:Q},void 0,!1,void 0,this):f.type==="table"&&f.tableData?c(L6,{headers:f.tableData.headers,rows:f.tableData.rows,terminalWidth:X-A},void 0,!1,void 0,this):f.type==="heading"?c(s5,{content:f.content,level:f.level||1},void 0,!1,void 0,this):f.type==="list"?c(KJ,{type:f.listType||"ul",marker:f.marker||"-",itemText:f.content,leadingWhitespace:" ".repeat(f.indentation||0)},void 0,!1,void 0,this):f.type==="hr"?c(e5,{terminalWidth:X-A},void 0,!1,void 0,this):f.type==="diff"&&f.diffData?c(ZJ,{patch:f.diffData.patch,startLine:f.diffData.startLine,matchLine:f.diffData.matchLine,terminalWidth:X-A},void 0,!1,void 0,this):f.type==="command-message"?c(J7,{content:f.content},void 0,!1,void 0,this):f.type==="blockquote"&&f.blockquoteLines?c(Y6,{lines:f.blockquoteLines,level:f.blockquoteLevel||1},void 0,!1,void 0,this):c($7,{content:f.content},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},a,!0,void 0,this)}),_0&&c(C0,{flexDirection:"row",flexShrink:0,children:[o.length===0&&!K?c(C0,{marginRight:1,flexShrink:0,children:c(m0,{color:C,bold:!0,children:y},void 0,!1,void 0,this)},void 0,!1,void 0,this):c(C0,{width:A,flexShrink:0},void 0,!1,void 0,this),c(C0,{flexGrow:1,flexShrink:0,children:c(m0,{wrap:"wrap",children:_0},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),B&&c(C0,{flexDirection:"row",flexShrink:0,children:[c(C0,{width:A,flexShrink:0},void 0,!1,void 0,this),c(C0,{flexDirection:"column",flexGrow:1,flexShrink:0,children:[c(m0,{color:w.colors.text.muted,children:["Subtask"," ",typeof B.agentType==="string"?`@${B.agentType}`:"",typeof B.status==="string"?` · ${B.status}`:""]},void 0,!0,void 0,this),typeof B.summary==="string"&&B.summary.trim()!==""&&c(m0,{wrap:"wrap",children:B.summary},void 0,!1,void 0,this),typeof B.childSessionId==="string"&&c(m0,{color:w.colors.text.muted,children:["Session ",B.childSessionId]},void 0,!0,void 0,this),typeof B.resumedFrom==="string"&&c(m0,{color:w.colors.text.muted,children:["Resumed from ",B.resumedFrom,typeof B.resumeDepth==="number"?` · depth ${B.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 d0,Fragment as q7}from"react/jsx-dev-runtime";var K7=OJ.memo(({label:$,isSelected:J})=>d0(Q1,{color:J?"yellow":void 0,children:$},void 0,!1,void 0,this)),U7=OJ.memo(({details:$,headerColor:J,isPlanModeExit:X,isPlanModeEnter:Y,terminalWidth:Z})=>d0(q7,{children:[d0(x$,{marginBottom:1,children:d0(Q1,{children:$.message},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.planContent&&d0(x$,{flexDirection:"column",marginBottom:1,borderStyle:"single",borderColor:J,padding:1,children:[d0(Q1,{bold:!0,color:J,children:"实施方案"},void 0,!1,void 0,this),d0(x$,{marginTop:1,children:d0(Z1,{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&&d0(x$,{flexDirection:"column",marginBottom:1,children:d0(Z1,{content:$.details,role:"assistant",terminalWidth:Z},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.risks&&$.risks.length>0&&d0(x$,{flexDirection:"column",marginBottom:1,children:[d0(Q1,{color:"red",bold:!0,children:"风险提示:"},void 0,!1,void 0,this),$.risks.map((Q,K)=>d0(x$,{marginLeft:2,children:d0(Q1,{color:"red",children:["• ",Q]},void 0,!0,void 0,this)},K,!1,void 0,this))]},void 0,!0,void 0,this),$.affectedFiles&&$.affectedFiles.length>0&&d0(x$,{flexDirection:"column",marginBottom:1,children:[d0(Q1,{color:"yellow",children:"影响的文件:"},void 0,!1,void 0,this),$.affectedFiles.slice(0,3).map((Q,K)=>d0(x$,{marginLeft:2,children:d0(Q1,{children:["• ",Q]},void 0,!0,void 0,this)},K,!1,void 0,this)),$.affectedFiles.length>3&&d0(x$,{marginLeft:2,children:d0(Q1,{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 G7($,J,X,Y){return`使用 ↑↓ 选择,回车确认 · ${J||X||Y?"Y/N":$?"Y/S/N":"Y/S/P/N"} 快捷键 · Esc 取消`}var P6=OJ.memo(({details:$,onResponse:J})=>{let{stdout:X}=Z7(),Y=X.columns||80,Q=K$()==="confirmation-prompt",K=n0(!1),U=$.type==="exitPlanMode",G=$.type==="enterPlanMode",q=$.type==="maxTurnsExceeded",_=$.type==="mcpSampling";W0((W,F)=>{if(F.ctrl&&W==="c"||F.meta&&W==="c"){K();return}if(F.escape){J({approved:!1,reason:"用户取消"});return}let N=W.toLowerCase();if(U){if(N==="y"){J({approved:!0,targetMode:"autoEdit"});return}if(N==="s"){J({approved:!0,targetMode:"default"});return}if(N==="n"){J({approved:!1,reason:"方案需要改进"});return}}else if(G){if(N==="y"){J({approved:!0});return}if(N==="n"){J({approved:!1,reason:"用户拒绝进入 Plan 模式"});return}}else if(q){if(N==="y"){J({approved:!0});return}if(N==="n"){J({approved:!1,reason:"用户选择停止"});return}}else if(_){if(N==="y"){J({approved:!0,scope:"once"});return}if(N==="n"){J({approved:!1,reason:"用户拒绝 MCP Sampling"});return}}else{if(N==="y"){J({approved:!0,scope:"once"});return}if(N==="s"){J({approved:!0,scope:"session"});return}if(N==="p"){J({approved:!0,scope:"project"});return}if(N==="n"){J({approved:!1,reason:"用户拒绝"});return}}},{isActive:Q});let z=b6(()=>{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(G)return[{key:"approve",label:"[Y] 进入规划模式",value:{approved:!0}},{key:"reject",label:"[N] 直接执行",value:{approved:!1,reason:"用户拒绝进入 Plan 模式"}}];if(q)return[{key:"continue",label:"[Y] 继续执行",value:{approved:!0}},{key:"stop",label:"[N] 停止",value:{approved:!1,reason:"用户选择停止"}}];if(_)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,G,q,_]),O=b6(()=>{if(U)return{color:"cyan",title:"方案审核"};if(G)return{color:"magenta",title:"进入规划模式"};if(q)return{color:"yellow",title:"已达最大轮次"};return{color:"yellow",title:$.title||"操作确认"}},[U,G,q,$.title]);return d0(x$,{flexDirection:"column",borderStyle:"round",borderColor:Q?O.color:"gray",padding:1,children:[d0(x$,{marginBottom:1,children:d0(Q1,{bold:!0,color:O.color,children:O.title},void 0,!1,void 0,this)},void 0,!1,void 0,this),d0(U7,{details:$,headerColor:O.color,isPlanModeExit:U,isPlanModeEnter:G,terminalWidth:Y},void 0,!1,void 0,this),d0(x$,{flexDirection:"column",children:[d0(Q1,{color:"gray",children:G7(U,G,q,_)},void 0,!1,void 0,this),d0(Q7,{items:z,isFocused:Q,itemComponent:K7,onSelect:(W)=>{J(W.value)}},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});import{Box as V0,Text as b0}from"ink";import M6 from"ink-text-input";import{useState as F1}from"react";import{jsxDEV as d}from"react/jsx-dev-runtime";var l2=[{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"}],i8=[{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"}],o8=[{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"}],z7=[`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"],y6=({workspaceRoot:$,sessionId:J,onClose:X,onSave:Y})=>{let Z=W$.getTheme(),[Q,K]=F1("action"),[U,G]=F1(0),[q,_]=F1(0),[z,O]=F1(0),[W,F]=F1(""),[N,w]=F1(""),[R,H]=F1(null),[C,y]=F1(!1),[A,B]=F1(null),b=l2[U],L=o8[q],D=i8[z],T=()=>{if(A){B(null);return}switch(Q){case"action":X();break;case"event":K("action");break;case"matcher":K("event");break;case"command":K("matcher");break;case"location":K("command");break;case"confirm":K("location");break}};W0((o,f)=>{if(f.escape){T();return}if(Q==="action"){if(f.upArrow)G((a)=>a>0?a-1:l2.length-1);else if(f.downArrow)G((a)=>a<l2.length-1?a+1:0);else if(f.return)S()}else if(Q==="event"){if(f.upArrow)_((a)=>a>0?a-1:o8.length-1);else if(f.downArrow)_((a)=>a<o8.length-1?a+1:0);else if(f.return)K("matcher")}else if(Q==="location"){if(f.upArrow)O((a)=>a>0?a-1:i8.length-1);else if(f.downArrow)O((a)=>a<i8.length-1?a+1:0);else if(f.return)K("confirm")}else if(Q==="confirm"){if(f.return)m()}});let S=()=>{let o=l2[U].action;if(o==="add")K("event");else if(o==="status")P();else if(o==="list")s();else if(o==="enable")D$.getInstance().enableSession(J,$),B("Hooks enabled for this session");else if(o==="disable")D$.getInstance().disableSession(J,$),B("Hooks disabled for this session");else if(o==="trust")v();else if(o==="revoke")i()},P=async()=>{let o=D$.getInstance(),f=o.isEnabled($,J),a=o.getConfig($),e=await o.getTrustStatus($),Z0={};for(let Y0 of Object.values(NJ)){let t=a[Y0];if(t&&Array.isArray(t)){let M=t.reduce((k,E)=>k+(E.hooks?.length||0),0);if(M>0)Z0[Y0]=M}}let V=[`Status: ${f?"Enabled":"Disabled"}`,`Trust: ${e.state}`,`Digest: ${e.currentDigest??"none"}`,""];if(Object.keys(Z0).length>0){V.push("Configured hooks:");for(let[Y0,t]of Object.entries(Z0))V.push(` ${Y0}: ${t} hook(s)`)}else V.push("No hooks configured");B(V.join(`
|
|
147
|
-
`))},v=async()=>{try{let o=await D$.getInstance().trustProject($);B(`Trust: ${o.state}
|
|
148
|
-
Digest: ${o.currentDigest??"none"}`)}catch(o){H(o instanceof Error?o.message:"Failed to trust hooks")}},i=async()=>{try{let o=await D$.getInstance().revokeProjectTrust($);B(`Trust: ${o.state}`)}catch(o){H(o instanceof Error?o.message:"Failed to revoke hook trust")}},s=()=>{let f=D$.getInstance().getConfig($),a=[],e=!1;for(let Z0 of Object.values(NJ)){let V=f[Z0];if(!V||!Array.isArray(V)||V.length===0)continue;e=!0,a.push(`${Z0}:`);for(let Y0 of V){let t=Y0.matcher,M="all";if(t?.tools)M=`tools: ${Array.isArray(t.tools)?t.tools.join(", "):t.tools}`;a.push(` [${M}]`);for(let k of Y0.hooks||[])if(k.type==="command")a.push(` -> ${k.command}`)}a.push("")}if(!e)a.push("No hooks configured"),a.push(""),a.push("Configure hooks in .blade/settings.local.json");B(a.join(`
|
|
149
|
-
`))},u=()=>{K("command")},_0=()=>{if(!N.trim()){H("Command cannot be empty");return}H(null),K("location")},m=async()=>{y(!0),H(null);try{let o=D$.getInstance(),f=await import("node:fs/promises"),a=await import("node:path"),e=await import("node:os"),Z0={matcher:W.trim()?{tools:W.trim()}:{},hooks:[{type:"command",command:N.trim()}]},V;switch(D.location){case"local":V=a.join($,".blade","settings.local.json");break;case"project":V=a.join($,".blade","settings.json");break;case"user":V=a.join(e.homedir(),".blade","settings.json");break}await f.mkdir(a.dirname(V),{recursive:!0});let Y0={};try{let E=await f.readFile(V,"utf-8");Y0=JSON.parse(E)}catch{}let t=Y0.hooks||{},M=t[L.event]||[],k={...t,enabled:!0,[L.event]:[...M,Z0]};if(Y0.hooks=k,await f.writeFile(V,JSON.stringify(Y0,null,2),"utf-8"),await o.reloadConfig($),Y)Y({event:L.event,matcher:W.trim(),command:N.trim()});X()}catch(o){H(`Failed to save hook: ${o instanceof Error?o.message:"Unknown error"}`),y(!1)}};return d(V0,{flexDirection:"column",padding:1,children:[d(V0,{marginBottom:1,children:d(b0,{bold:!0,color:Z.colors.success,children:"Hooks Manager"},void 0,!1,void 0,this)},void 0,!1,void 0,this),d(V0,{marginBottom:1,children:d(b0,{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),A&&d(V0,{flexDirection:"column",marginBottom:1,children:[d(b0,{children:A},void 0,!1,void 0,this),d(V0,{marginTop:1,children:d(b0,{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"&&!A&&d(V0,{flexDirection:"column",children:[d(V0,{flexDirection:"column",marginTop:1,children:l2.map((o,f)=>d(V0,{children:[d(b0,{color:f===U?Z.colors.primary:void 0,bold:f===U,children:[f===U?"> ":" ",o.action]},void 0,!0,void 0,this),d(b0,{color:Z.colors.muted,children:[" - ",o.description]},void 0,!0,void 0,this)]},o.action,!0,void 0,this))},void 0,!1,void 0,this),d(V0,{marginTop:1,children:d(b0,{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"&&d(V0,{flexDirection:"column",children:[d(b0,{bold:!0,children:"Select Event:"},void 0,!1,void 0,this),d(V0,{flexDirection:"column",marginTop:1,children:o8.map((o,f)=>d(V0,{children:[d(b0,{color:f===q?Z.colors.primary:void 0,bold:f===q,children:[f===q?"> ":" ",o.event]},void 0,!0,void 0,this),d(b0,{color:Z.colors.muted,children:[" - ",o.description]},void 0,!0,void 0,this)]},o.event,!0,void 0,this))},void 0,!1,void 0,this),d(V0,{marginTop:1,children:d(b0,{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"&&d(V0,{marginBottom:1,children:d(b0,{children:["Event:"," ",d(b0,{bold:!0,color:Z.colors.primary,children:L.event},void 0,!1,void 0,this),d(b0,{color:Z.colors.muted,children:[" - ",L.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")&&d(V0,{flexDirection:"column",marginBottom:1,children:[d(b0,{color:Z.colors.muted,children:"Input to command is JSON of tool call arguments."},void 0,!1,void 0,this),d(b0,{color:Z.colors.muted,children:"Exit code 0 - stdout/stderr not shown"},void 0,!1,void 0,this),d(b0,{color:Z.colors.muted,children:"Exit code 2 - show stderr to model and block tool call"},void 0,!1,void 0,this),d(b0,{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"&&d(V0,{flexDirection:"column",children:[d(V0,{children:[d(b0,{bold:!0,children:"Matcher: "},void 0,!1,void 0,this),d(M6,{value:W,onChange:F,onSubmit:u,placeholder:"e.g., Read, Bash, Edit|Write (empty = all tools)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),d(V0,{marginTop:1,children:d(b0,{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),d(V0,{marginTop:1,children:d(b0,{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")&&d(V0,{marginBottom:1,children:d(b0,{children:["Matcher: ",d(b0,{bold:!0,children:W||"(all tools)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),Q==="command"&&d(V0,{flexDirection:"column",children:[d(V0,{children:d(b0,{bold:!0,children:"Command: "},void 0,!1,void 0,this)},void 0,!1,void 0,this),d(V0,{borderStyle:"single",borderColor:Z.colors.border.light,paddingX:1,marginTop:1,children:d(M6,{value:N,onChange:w,onSubmit:_0,placeholder:"Enter shell command..."},void 0,!1,void 0,this)},void 0,!1,void 0,this),d(V0,{flexDirection:"column",marginTop:1,children:[d(b0,{bold:!0,children:"Examples:"},void 0,!1,void 0,this),z7.map((o,f)=>d(b0,{color:Z.colors.muted,children:["• ",o]},f,!0,void 0,this))]},void 0,!0,void 0,this),d(V0,{marginTop:1,children:d(b0,{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"&&d(V0,{flexDirection:"column",children:[d(V0,{flexDirection:"column",borderStyle:"round",borderColor:Z.colors.border.light,paddingX:2,paddingY:1,marginBottom:1,children:[d(b0,{bold:!0,color:Z.colors.primary,children:"Save hook configuration"},void 0,!1,void 0,this),d(b0,{children:" "},void 0,!1,void 0,this),d(b0,{children:[" ","Event: ",L.event," - ",L.description]},void 0,!0,void 0,this),d(b0,{children:[" Matcher: ",W||"(all)"]},void 0,!0,void 0,this),d(b0,{children:[" Command: ",N]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),d(b0,{bold:!0,children:"Where should this hook be saved?"},void 0,!1,void 0,this),d(V0,{flexDirection:"column",marginTop:1,children:i8.map((o,f)=>d(V0,{children:[d(b0,{color:f===z?Z.colors.primary:void 0,bold:f===z,children:[f===z?"> ":" ",f+1,". ",o.name]},void 0,!0,void 0,this),d(b0,{color:Z.colors.muted,children:[" ",o.description]},void 0,!0,void 0,this)]},o.location,!0,void 0,this))},void 0,!1,void 0,this),d(V0,{marginTop:1,children:d(b0,{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"&&d(V0,{flexDirection:"column",children:[d(V0,{flexDirection:"column",borderStyle:"round",borderColor:Z.colors.success,paddingX:2,paddingY:1,children:[d(b0,{bold:!0,children:["Saving hook to ",D.description,"..."]},void 0,!0,void 0,this),d(b0,{children:" "},void 0,!1,void 0,this),d(b0,{children:["Event: ",L.event]},void 0,!0,void 0,this),d(b0,{children:["Matcher: ",W||"(all tools)"]},void 0,!0,void 0,this),d(b0,{children:["Command: ",N]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),d(V0,{marginTop:1,children:d(b0,{color:Z.colors.muted,children:C?"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),R&&d(V0,{marginTop:1,children:d(b0,{color:Z.colors.error,children:R},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as d6}from"ahooks";import{Box as I7,Text as S7}from"ink";import k7 from"react";import{useMemoizedFn as t8}from"ahooks";import n1 from"chalk";import{Text as y7}from"ink";import{useEffect as x6,useRef as r2}from"react";var n8={TIMEOUT_MS:100,RAPID_INPUT_THRESHOLD_MS:150,LARGE_INPUT_THRESHOLD:300,MEDIUM_SIZE_MULTI_CHUNK_THRESHOLD:200};function T6($){return typeof $==="string"&&/^[0-9a-f]{32}$/.test($)}function O7($){if(!T6($))throw Error("TUI composer ready nonce must be 32 lowercase hexadecimal chars");return`\x1B]99;blade-composer-ready=${$}\x07`}function _7($=process.env){let J=$.BLADE_TUI_COMPOSER_READY_NONCE;if(!T6(J))return;return O7(J)}function R6($=process.env,J=(X)=>process.stdout.write(X)){let X=_7($);if(!X)return!1;return J(X),!0}var o1="\x1B",N7=`${o1}[200~`,H7=`${o1}[201~`,W7="[200~",F7="[201~",L7=[`${o1}[I`,`${o1}[O`,"[I","[O"],S6=`${o1}[?2004h`,k6=`${o1}[?2004l`,WJ=`${o1}[?1004l`,w7=[N7,W7],B7=[H7,F7];function f6(){return{pasteBuffer:null,pasteOverflowed:!1}}function C6($,J){let X;for(let Y of J){let Z=$.indexOf(Y);if(Z===-1)continue;if(!X||Z<X.index||Z===X.index&&Y.length>X.marker.length)X={index:Z,marker:Y}}return X}function I6($){return L7.some((J)=>$===J)}function D6($,J){let X=J,Y=$.pasteBuffer,Z=$.pasteOverflowed,Q=Y!==null,K=[];while(X.length>0){if(Y!==null){let q=C6(X,B7);if(!q){if(Y.length+X.length>HJ)Y="",Z=!0;else if(!Z)Y+=X;X="";break}if(Y.length+q.index>HJ)Z=!0;else if(!Z)Y+=X.slice(0,q.index),K.push({kind:"paste",text:Y});Y=null,Z=!1,Q=!0,X=X.slice(q.index+q.marker.length);continue}let U=C6(X,w7);if(!U){if(I6(X))Q=!0;else K.push({kind:"text",text:X});X="";break}let G=X.slice(0,U.index);if(G&&!I6(G))K.push({kind:"text",text:G});Y="",Z=!1,Q=!0,X=X.slice(U.index+U.marker.length)}if(J.length===0&&Y!==null)Q=!0;return{handled:Q,state:{pasteBuffer:Y,pasteOverflowed:Z},segments:K}}import{execSync as M2}from"node:child_process";import{existsSync as A7,readFileSync as FJ}from"node:fs";import{basename as v6,isAbsolute as b7}from"node:path";function V6($){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 j6(){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"},X={darwin:{checkImage:"osascript -e 'the clipboard as «class PNGf»'",saveImage:(Y)=>`osascript -e 'set png_data to (the clipboard as «class PNGf»)' -e 'set fp to open for access POSIX file "${Y}" 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:(Y)=>`rm -f "${Y}"`},linux:{checkImage:'xclip -selection clipboard -t TARGETS -o | grep -E "image/(png|jpeg|jpg|gif|webp)"',saveImage:(Y)=>`xclip -selection clipboard -t image/png -o > "${Y}" || wl-paste --type image/png > "${Y}"`,getPath:"xclip -selection clipboard -t text/plain -o",deleteFile:(Y)=>`rm -f "${Y}"`},win32:{checkImage:'powershell -Command "(Get-Clipboard -Format Image) -ne $null"',saveImage:(Y)=>`powershell -Command "$img = Get-Clipboard -Format Image; if ($img) { $img.Save('${Y.replace(/\\/g,"\\\\")}', [System.Drawing.Imaging.ImageFormat]::Png) }"`,getPath:'powershell -Command "Get-Clipboard"',deleteFile:(Y)=>`del /f "${Y}"`}};return{commands:X[$]||X.linux,screenshotPath:J[$]||J.linux}}function P7(){let{commands:$}=j6();try{return M2($.getPath,{encoding:"utf-8"}).trim()}catch(J){return console.error("Failed to get clipboard path:",J),null}}function E6($){if($.startsWith('"')&&$.endsWith('"')||$.startsWith("'")&&$.endsWith("'"))return $.slice(1,-1);return $}function h6($){if(process.platform==="win32")return $;let J="__DOUBLE_BACKSLASH__";return $.replace(/\\\\/g,J).replace(/\\(.)/g,"$1").replace(new RegExp(J,"g"),"\\")}function LJ($){let J=E6($.trim()),X=h6(J);return/\.(png|jpe?g|gif|webp)$/i.test(X)}function M7($){let J=E6($.trim()),X=h6(J);if(LJ(X))return X;return null}async function g6($){let J=M7($);if(!J)return null;let X;try{if(b7(J))X=FJ(J);else{let K=P7();if(K&&J===v6(K))X=FJ(K);else return null}}catch(K){return console.error("Failed to read image file:",K),null}let Y=X.toString("base64"),Z=V6(Y),Q=v6(J);return{path:J,base64:Y,mediaType:Z,filename:Q}}async function m6(){let $=process.platform,J={darwin:"pbpaste",linux:"xclip -selection clipboard -o || wl-paste",win32:'powershell -Command "Get-Clipboard"'},X=J[$]||J.linux;try{return M2(X,{encoding:"utf-8"})||null}catch{return null}}async function p6(){let{commands:$,screenshotPath:J}=j6();try{if(M2($.checkImage,{stdio:"ignore"}),M2($.saveImage(J),{stdio:"ignore"}),!A7(J))return null;let Y=FJ(J).toString("base64"),Z=V6(Y);return M2($.deleteFile(J),{stdio:"ignore"}),{base64:Y,mediaType:Z}}catch(X){try{M2($.deleteFile(J),{stdio:"ignore"})}catch{}return null}}import{jsxDEV as C7}from"react/jsx-dev-runtime";var T7=/\r\n/g,R7=/\r/g;function wJ($){if(!$.includes("\r"))return $;return $.replace(T7,`
|
|
150
|
-
`).replace(R7,`
|
|
151
|
-
`)}function c6($,J,X){let Y=Math.max(0,Math.min(X,J.length)),Z=J.slice(0,Y),Q=J.slice(Y);return{newValue:Z+$+Q,newCursorPosition:Y+$.length}}function u6({value:$,placeholder:J="",focus:X=!0,onChange:Y,cursorPosition:Z,onChangeCursorPosition:Q,onPaste:K,onImagePaste:U,disabledKeys:G=[]}){let q=r2(f6()),_=r2($),z=r2(Z),O=r2(null),W=r2(!1);x6(()=>{_.current=$,z.current=Z},[$,Z]),x6(()=>{if(Z>$.length)Q($.length)},[$,Z,Q]);let F=t8((A,B)=>{let b=_.current,L=z.current;if(_.current=A,z.current=B,A!==b)Y(A);if(B!==L)Q(B)}),N=t8((A)=>{if(!A)return;let{newValue:B,newCursorPosition:b}=c6(wJ(A),_.current,z.current);F(B,b)}),w=t8(async(A)=>{let B=wJ(A);if(!B)return;if(U&&LJ(B))try{let L=await g6(B);if(L){let D=await U(L.base64,L.mediaType,L.filename);if(D?.prompt)N(D.prompt);return}}catch(L){console.error("Failed to process image path:",L)}if((B.length>n8.LARGE_INPUT_THRESHOLD||B.includes(`
|
|
152
|
-
`))&&K){let L=await K(B);if(L?.prompt){N(L.prompt);return}}N(B)}),R=t8((A)=>{let B=O.current;if(!B){try{let L=A();if(!L)return;let D=L.catch(()=>{return});O.current=D,D.finally(()=>{if(O.current===D)O.current=null})}catch{}return}let b=B.then(A).then(()=>{return}).catch(()=>{return});O.current=b,b.finally(()=>{if(O.current===b)O.current=null})});W0((A,B)=>{return R(()=>{let b=wJ(A),L=D6(q.current,b);if(q.current=L.state,L.handled)return(async()=>{for(let i of L.segments)if(i.kind==="paste")await w(i.text);else N(i.text)})();if(G.some((i)=>B[i])||B.ctrl&&A==="c"||B.ctrl&&A==="l"||B.ctrl&&A==="t"||B.ctrl&&A==="o"||B.meta&&A==="l"||B.meta&&A==="t"||B.meta&&A==="o"||B.shift&&B.tab||b==="?"&&_.current==="")return;let T=_.current,S=z.current,P=S,v=T;if(B.leftArrow)P--;else if(B.rightArrow)P++;else if(B.backspace||B.delete){if(A===""){if(S>0)v=T.slice(0,S-1)+T.slice(S,T.length),P--}else if(S<T.length)v=T.slice(0,S)+T.slice(S+1,T.length)}else if(B.ctrl&&b==="a")P=0;else if(B.ctrl&&b==="e")P=T.length;else if(B.ctrl&&b==="k")v=T.slice(0,S);else if(B.ctrl&&b==="u")v=T.slice(S),P=0;else if(B.ctrl&&b==="w"){let s=T.slice(0,S).match(/\s*\S+\s*$/);if(s){let u=s[0].length;v=T.slice(0,S-u)+T.slice(S),P-=u}}else if(B.ctrl&&b==="v"){let i=process.platform==="darwin";return(async()=>{if(U){let u=await p6();if(u){let _0=await U(u.base64,u.mediaType,"clipboard.png");if(_0?.prompt)N(_0.prompt);return}}if(i)return;let s=await m6();if(s)await w(s)})()}else if(B.pageUp)P=0;else if(B.pageDown)P=T.length;else if(b===`
|
|
153
|
-
`&&(B.shift||B.meta)){let{newValue:i,newCursorPosition:s}=c6(b,T,S);F(i,s);return}else if(!B.ctrl&&!B.meta){if(K&&(b.length>n8.LARGE_INPUT_THRESHOLD||b.includes(`
|
|
154
|
-
`)))return w(b);v=T.slice(0,S)+b+T.slice(S,T.length),P+=b.length}if(P<0)P=0;if(P>v.length)P=v.length;F(v,P)}),!0},{isActive:X,priority:0,onRegistered:()=>{if(W.current)return;W.current=R6()}});let H=X,C=$,y=J?n1.grey(J):void 0;if(H)if(y=J.length>0?n1.inverse(J[0])+n1.grey(J.slice(1)):n1.inverse(" "),$.length===0)C=n1.inverse(" ");else{C="";for(let A=0;A<$.length;A++)if(A===Z&&Z<$.length)C+=n1.inverse($[A]);else C+=$[A];if(Z>=$.length)C+=n1.inverse(" ")}return C7(y7,{children:J?$.length>0?C:y:C},void 0,!1,void 0,this)}import{jsxDEV as BJ}from"react/jsx-dev-runtime";var l6=k7.memo(({input:$,cursorPosition:J,onChange:X,onChangeCursorPosition:Y,onAddPasteMapping:Z,onAddImagePasteMapping:Q})=>{let U=K$()==="main-input",G=$.trimStart().startsWith("!"),q=d6((z)=>{let O=z.split(`
|
|
155
|
-
`).length,W=z.length,F=500,N=10;if(W>500||O>10){let w=Z(z),R=z.slice(0,30).replace(/\n/g," "),H=`${W} chars, ${O} lines: ${R}...`;return{prompt:`${f8(w)}${H}${f4()}`}}return{}}),_=d6(async(z,O,W)=>{try{let F=Q(z,O);return{prompt:`${f8(F)}[Image #${F}]${f4()}`}}catch(F){return console.error("[Image Paste] Failed to process image:",F),{prompt:`[Image paste failed: ${F instanceof Error?F.message:"Unknown error"}] `}}});return BJ(I7,{flexDirection:"row",width:"100%",paddingX:2,paddingY:0,flexShrink:0,flexGrow:0,overflow:"hidden",borderStyle:"round",borderColor:G?"yellow":"gray",children:[BJ(S7,{color:G?"yellow":"blue",bold:!0,children:G?"$ ":"> "},void 0,!1,void 0,this),BJ(u6,{value:$,cursorPosition:J,onChange:X,onChangeCursorPosition:Y,onPaste:q,onImagePaste:_,placeholder:" 输入命令...",focus:U,disabledKeys:["upArrow","downArrow","tab","return","escape"]},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as s8,Text as n$}from"ink";import g7,{useEffect as m7,useState as p7}from"react";import{useEffect as j7,useRef as E7,useState as h7}from"react";import{useEffect as f7,useRef as D7,useState as v7}from"react";var V7=15000,r6="等待用户确认...",a6=["思考中","构思中","推理中","琢磨中","分析中","斟酌中","酝酿中","推敲中","揣摩中","审视中","处理中","编排中","打磨中","编织中","拼装中","调配中","组装中","搭建中","铸造中","雕琢中","搜寻中","梳理中","排查中","勘探中","钻研中","翻阅中","遍历中","扫描中","检索中","追踪中","计算中","编译中","解析中","运算中","推演中","迭代中","收敛中","演绎中","归纳中","求解中","生成中","编写中","起草中","绘制中","勾勒中","渲染中","合成中","调和中","编曲中","烹制中","施工中","酿造中","发酵中","煎熬中","折腾中","捣鼓中","鼓捣中","腾挪中","筹备中","蓄力中"],i6=["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 o6(){if(Math.random()<0.25){let X=Math.floor(Math.random()*i6.length);return i6[X]}let J=Math.floor(Math.random()*a6.length);return a6[J]}function n6($,J,X=!1){let[Y,Z]=v7(""),Q=D7(X);return Q.current=X,f7(()=>{if(J){Z(r6);return}if(!$){Z("");return}Z((U)=>U===""||U===r6?o6():U);let K=setInterval(()=>{if(!Q.current)Z(o6())},V7);return()=>{clearInterval(K)}},[$,J]),Y}function t6($,J=!1,X=!1){let[Y,Z]=h7(0),Q=E7(null),K=n6($,J,X);return j7(()=>{if(!$){Z(0),Q.current=null;return}if(X)return;if(Q.current===null)Q.current=Date.now();let U=setInterval(()=>{if(Q.current!==null){let G=Math.floor((Date.now()-Q.current)/1000);Z(G)}},1000);return()=>{clearInterval(U)}},[$,X]),{currentPhrase:K,elapsedTime:Y}}import{jsxDEV as b$,Fragment as c7}from"react/jsx-dev-runtime";var AJ=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"],x7=80;function y2($){if($<60)return`${$}s`;let J=Math.floor($/60),X=$%60;return`${J}m ${X}s`}var s6=g7.memo(({message:$,paused:J=!1})=>{let X=G2(),Y=U8(),Z=sJ(),Q=tJ(),K=eJ(),U=$9(),G=J9(),q=X||!Y,[_,z]=p7(0),O=k0(),F=H2()>=x7,{currentPhrase:N,elapsedTime:w}=t6(q,!1,J);if(m7(()=>{if(!q||J){z(0);return}let b=setInterval(()=>{z((L)=>(L+1)%AJ.length)},150);return()=>clearInterval(b)},[q,J]),!q)return null;let R=K?.mode==="bounded_foreground"?`Provider 暂时不可用,正在有界恢复 (${K.attempt}/${K.maxRetries}),剩余约 ${y2(Math.max(0,Math.ceil((K.recoveryRemainingMs??0)/1000)))}`:K?.phase==="scheduled"?`Provider 暂时不可用,${K.attempt}/${K.maxRetries} 次重试将在 ${Math.max(0,Math.ceil((K.delayMs??0)/1000))}s 后开始`:K?.phase==="attempt"?`正在重试 Provider (${K.attempt}/${K.maxRetries})`:null,H=Q?Q.phase==="probe"?"Provider 正在执行唯一恢复探测":`Provider 故障已隔离,等待恢复探测${Q.retryAfterMs!==void 0?` (${y2(Math.max(0,Math.ceil(Q.retryAfterMs/1000)))})`:""}${Q.recoveryRemainingMs!==void 0?`,剩余预算 ${y2(Math.max(0,Math.ceil(Q.recoveryRemainingMs/1000)))}`:""}`:null,C=Z?`等待 Provider 容量(${Z.scope},队列 ${Z.queuePosition}/${Math.max(Z.queueDepth,Z.queuePosition)},已等待 ${y2(Math.max(0,Math.ceil(Z.waitMs/1000)))})`:null,y=U?U.outputStarted?`Provider 流已暂停 ${Math.ceil(U.durationMs/1000)}s,仍在等待(空闲超时上限 ${Math.ceil(U.timeoutMs/1000)}s)`:`Provider 尚未返回流数据,已等待 ${Math.ceil(U.durationMs/1000)}s(空闲超时上限 ${Math.ceil(U.timeoutMs/1000)}s)`:null,B=(G?.phase==="detected"?`检测到 ${G.toolName} 连续 ${G.runLength} 次无进展,正在要求 Agent 切换策略`:G?.phase==="halted"?`已停止 ${G.toolName} 空转循环`:null)||H||C||R||y||$||N||"正在思考中...";if(F)return b$(s8,{paddingX:2,paddingBottom:1,flexDirection:"row",gap:1,children:[b$(n$,{color:O.colors.warning,bold:!0,children:AJ[_]},void 0,!1,void 0,this),b$(n$,{color:O.colors.text.primary,children:B},void 0,!1,void 0,this),w>0&&b$(c7,{children:[b$(n$,{color:O.colors.muted,children:"|"},void 0,!1,void 0,this),b$(n$,{color:O.colors.info,children:["已用时: ",y2(w)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),b$(n$,{color:O.colors.muted,children:"|"},void 0,!1,void 0,this),b$(n$,{color:O.colors.secondary,children:"Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return b$(s8,{paddingX:2,paddingBottom:1,flexDirection:"column",children:[b$(s8,{flexDirection:"row",gap:1,children:[b$(n$,{color:O.colors.warning,bold:!0,children:AJ[_]},void 0,!1,void 0,this),b$(n$,{color:O.colors.text.primary,children:B},void 0,!1,void 0,this)]},void 0,!0,void 0,this),w>0&&b$(s8,{marginLeft:2,flexDirection:"row",gap:1,children:[b$(n$,{color:O.colors.info,children:["已用时: ",y2(w)]},void 0,!0,void 0,this),b$(n$,{color:O.colors.muted,children:"|"},void 0,!1,void 0,this),b$(n$,{color:O.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 J4,Text as s0,useStdout as u7}from"ink";import d7 from"ink-text-input";import l7,{useCallback as e8,useEffect as r7,useMemo as a7,useState as t1}from"react";import{jsxDEV as f0}from"react/jsx-dev-runtime";var Y3=l7.memo(({details:$,onComplete:J})=>{let{stdout:X}=u7(),Y=X.columns||80,Z=K$()==="confirmation-prompt",Q=n0(!1),K=$.fields??[],[U,G]=t1("field"),[q,_]=t1(0),[z,O]=t1(()=>e6($)),[W,F]=t1(""),[N,w]=t1(0),[R,H]=t1([]),[C,y]=t1(),A=K[q],B=a7(()=>i7(A),[A]);r7(()=>{if(!A)return;let S=z[A.name];F(typeof S==="string"||typeof S==="number"?String(S):""),H(Array.isArray(S)?[...S]:[]);let P=B.findIndex((v)=>v.value===String(S));w(P>=0?P:0),y(void 0)},[z,A,B]);let b=e8((S)=>{if(O(S),q<K.length-1){_((P)=>P+1);return}G("review")},[q,K.length]),L=e8((S)=>{if(!A)return;let P={...z};if(S===void 0)delete P[A.name];else P[A.name]=S;b(P)},[z,A,b]),D=e8((S)=>{if(!A)return;try{L($3(A,S))}catch(P){y(P instanceof Error?P.message:String(P))}},[A,L]),T=e8(()=>{try{let S=J3($,{action:"accept",content:z});J({action:S.action,...S.content?{content:S.content}:{}})}catch(S){y(S instanceof Error?S.message:String(S))}},[z,$,J]);if(W0((S,P)=>{if(P.ctrl&&S==="c"||P.meta&&S==="c"){Q();return}if(P.escape){J({action:"cancel"});return}if($.mode==="url"){if(S.toLowerCase()==="y")J({action:"accept"},!0);else if(S.toLowerCase()==="n")J({action:"decline"});return}if(U==="review"){if(S.toLowerCase()==="y"||P.return)T();else if(S.toLowerCase()==="e")_(0),G("field");else if(S.toLowerCase()==="d")J({action:"decline"});return}if(!A){if(P.return)T();return}if(bJ(A))return;if(S.toLowerCase()==="d"){J({action:"decline"});return}if(P.upArrow){w((v)=>v>0?v-1:Math.max(B.length-1,0));return}if(P.downArrow||P.tab){w((v)=>v<B.length-1?v+1:0);return}if(S===" "&&A.type==="multi-select"){let v=B[N];if(v)H((i)=>i.includes(v.value)?i.filter((s)=>s!==v.value):[...i,v.value]);return}if(P.return)if(A.type==="multi-select")L(R);else{let v=B[N];if(v)L(v.typedValue)}},{isActive:Z}),$.mode==="url")return f0($4,{width:Y,color:"yellow",children:[f0(s0,{bold:!0,color:"yellow",children:"MCP external authorization"},void 0,!1,void 0,this),f0(s0,{children:$.message},void 0,!1,void 0,this),f0(s0,{color:"yellow",children:['Only continue if you trust MCP server "',$.serverName,'".']},void 0,!0,void 0,this),f0(s0,{children:["Domain: ",f0(s0,{color:"cyan",children:$.domain},void 0,!1,void 0,this)]},void 0,!0,void 0,this),f0(s0,{wrap:"wrap",children:["URL: ",f0(s0,{color:"cyan",children:$.url},void 0,!1,void 0,this)]},void 0,!0,void 0,this),f0(s0,{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($4,{width:Y,color:"green",children:[f0(s0,{bold:!0,color:"green",children:"Review MCP form response"},void 0,!1,void 0,this),f0(s0,{children:$.message},void 0,!1,void 0,this),K.map((S)=>f0(s0,{children:[S.title,": ",n7(z[S.name])]},S.name,!0,void 0,this)),C&&f0(s0,{color:"red",children:C},void 0,!1,void 0,this),f0(s0,{color:"gray",children:"[Y] Submit · [E] Edit · [D] Decline · Esc Cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(!A)return f0($4,{width:Y,color:"cyan",children:[f0(s0,{children:$.message},void 0,!1,void 0,this),f0(s0,{color:"gray",children:"This form has no fields."},void 0,!1,void 0,this),f0(s0,{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($4,{width:Y,color:"cyan",children:[f0(s0,{bold:!0,color:"cyan",children:["MCP input requested by ",$.serverName]},void 0,!0,void 0,this),f0(s0,{children:$.message},void 0,!1,void 0,this),f0(J4,{flexDirection:"column",marginTop:1,children:[f0(s0,{bold:!0,children:[A.title,A.required?" *":""]},void 0,!0,void 0,this),A.description&&f0(s0,{color:"gray",children:A.description},void 0,!1,void 0,this),f0(s0,{color:"gray",children:o7(A)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),bJ(A)?f0(J4,{children:[f0(s0,{color:"cyan",children:"> "},void 0,!1,void 0,this),f0(d7,{value:W,onChange:F,onSubmit:D,focus:Z,placeholder:A.defaultValue===void 0?A.required?"Required":"Optional":String(A.defaultValue)},void 0,!1,void 0,this)]},void 0,!0,void 0,this):f0(J4,{flexDirection:"column",children:B.map((S,P)=>{let v=A.type==="multi-select"&&R.includes(S.value);return f0(s0,{color:N===P?"yellow":void 0,children:[N===P?"> ":" ",A.type==="multi-select"?v?"(*) ":"( ) ":"",S.label]},S.value,!0,void 0,this)})},void 0,!1,void 0,this),C&&f0(s0,{color:"red",children:C},void 0,!1,void 0,this),f0(s0,{color:"gray",children:[bJ(A)?"Enter to continue":A.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(s0,{color:"gray",children:["Field ",q+1," of ",K.length]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});function $4({children:$,width:J,color:X}){return f0(J4,{flexDirection:"column",gap:1,borderStyle:"round",borderColor:X,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 i7($){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 o7($){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 n7($){if($===void 0)return"(omitted)";if(Array.isArray($))return $.join(", ")||"(none)";return String($)}import X4 from"ansi-escapes";import{Box as D1,Static as KQ,useStdout as UQ}from"ink";import GQ,{useEffect as w1,useMemo as CJ,useRef as v1,useState as IJ}from"react";import{Box as t7,Text as X3}from"ink";import s7 from"react";import{jsxDEV as PJ}from"react/jsx-dev-runtime";var MJ=s7.memo(({collapsedCount:$})=>{let J=k0();if($<=0)return null;let X=J.colors.text.muted;return PJ(t7,{flexDirection:"row",marginBottom:1,children:[PJ(X3,{color:X,children:[">"," ",$," 条历史消息"]},void 0,!0,void 0,this),PJ(X3,{color:X,children:" [Ctrl+O 浏览]"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});MJ.displayName="CollapsedHistorySummary";import{Box as a2,Text as i2}from"ink";import e7 from"ink-big-text";import $Q from"ink-gradient";import JQ from"react";import{jsxDEV as c$}from"react/jsx-dev-runtime";var Q3=JQ.memo(()=>{return c$(a2,{flexDirection:"column",paddingX:2,paddingTop:1,paddingBottom:1,children:[c$(a2,{flexDirection:"column",children:c$($Q,{name:"pastel",children:c$(e7,{text:"BLADE",font:"block"},void 0,!1,void 0,this)},void 0,!1,void 0,this)},void 0,!1,void 0,this),c$(a2,{marginBottom:1,children:c$(i2,{color:"white",dimColor:!0,children:Z3()},void 0,!1,void 0,this)},void 0,!1,void 0,this),c$(a2,{flexDirection:"column",marginBottom:1,children:[c$(a2,{marginBottom:1,children:c$(i2,{color:"white",bold:!0,children:"使用指南:"},void 0,!1,void 0,this)},void 0,!1,void 0,this),c$(i2,{color:"white",children:"1. 输入问题、编辑文件或运行命令"},void 0,!1,void 0,this),c$(i2,{color:"white",children:"2. 使用 /init 创建项目配置文件"},void 0,!1,void 0,this),c$(i2,{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 Y4,Text as yJ}from"ink";import K3 from"react";import{jsxDEV as f1}from"react/jsx-dev-runtime";var U3=K3.memo(({tasks:$,visible:J=!0,compact:X=!1})=>{let{colors:Y}=k0();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 f1(Y4,{flexDirection:"column",borderStyle:"single",borderColor:Y.border.light,paddingX:1,paddingY:X?0:1,marginBottom:1,children:[f1(Y4,{marginBottom:X?0:1,children:[f1(yJ,{dimColor:!0,children:"Tasks "},void 0,!1,void 0,this),f1(yJ,{color:Y.text.muted,children:[Z.completed,"/",Z.total]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),f1(Y4,{flexDirection:"column",children:$.map((Q,K)=>f1(YQ,{task:Q,compact:X},Q.id||K,!1,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}),YQ=K3.memo(({task:$,compact:J})=>{let X,Y=!1,Z;switch($.status){case"completed":X="[OK]",Y=!0,Z=$.subject;break;case"in_progress":X=">",Y=!1,Z=$.activeForm||$.subject;break;case"pending":default:X="-",Y=!0,Z=$.subject;break}return f1(Y4,{paddingY:J?0:0,children:f1(yJ,{dimColor:Y,children:[X," ",Z]},void 0,!0,void 0,this)},void 0,!1,void 0,this)});import{Box as TJ,Text as T2}from"ink";import XQ,{useMemo as G3}from"react";import{jsxDEV as L1}from"react/jsx-dev-runtime";function ZQ($,J=60){if(!$)return"";let X=$.split(`
|
|
156
|
-
`)[0]||"";if(X.length<=J)return X;return`${X.slice(0,J)}...`}function QQ($){if(!$)return 0;return $.split(`
|
|
157
|
-
`).length}var RJ=XQ.memo(({content:$,isStreaming:J=!1,isExpanded:X})=>{let Y=k0(),Z=G3(()=>QQ($),[$]),Q=G3(()=>ZQ($),[$]),K=Y.colors.info,U=Y.colors.muted;return L1(TJ,{flexDirection:"column",marginBottom:1,children:[L1(TJ,{flexDirection:"row",children:[L1(T2,{color:K,children:X?"v":">"},void 0,!1,void 0,this),L1(T2,{children:" "},void 0,!1,void 0,this),L1(T2,{color:U,children:["Thinking",J?"...":` (${Z} lines)`]},void 0,!0,void 0,this),!X&&!J&&Q&&L1(T2,{color:U,children:[" - ",Q]},void 0,!0,void 0,this),L1(T2,{color:U,dimColor:!0,children:[" ","[Ctrl+T]"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),X&&$&&L1(TJ,{marginLeft:2,marginTop:1,borderStyle:"round",borderColor:"gray",paddingX:1,paddingY:0,children:L1(T2,{color:U,children:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});RJ.displayName="ThinkingBlock";import{jsxDEV as L$}from"react/jsx-dev-runtime";var qQ=({active:$=!0})=>{let J=Z8(),X=F8(),Y=L8(),Z=w9(),Q=G2(),K=Q9(),U=z9(),G=q2(),q=W8(),_=L9(),z=aJ(),O=A9(),W=B9(),{width:F,height:N}=E8(),{stdout:w}=UQ(),R=C1(),[H,C]=IJ(null),[y,A]=IJ([]),[B,b]=IJ(new Set),L=v1(W),D=v1(null),T=v1(0),S=v1(0),P=v1(new Set),v=v1(new Set),i=v1([]),s=v1(null);w1(()=>{if(L.current!==W){if(L.current=W,!$)return;if(r$())m$();if(w)w.write(X4.clearTerminal);R.incrementClearCount()}},[$,W,w,R]);let u=J,_0=Z;w1(()=>{if(!Z||Q){s.current=null;return}if(s.current===Z)return;if(s.current=Z,r$())m$();if($&&w)w.write(X4.eraseScreen+X4.cursorTo(0,0));P.current=new Set,v.current=new Set(u.filter((V)=>V.role==="tool").map((V)=>V.id)),D.current=null,T.current=0,S.current=0,i.current=[],A([]),b(new Set),R.incrementClearCount(),R.clearFinalizingStreamingMessageId()},[Z,Q,w,R,u,$]);let m=X??Z;w1(()=>{if($&&r$())m$();D.current=null,T.current=0,S.current=0,P.current=new Set,v.current=new Set(u.filter((V)=>V.role==="tool").map((V)=>V.id)),i.current=[],A([]),b(new Set)},[z]),w1(()=>{if(!m)return;if(D.current===m)return;D.current=m,T.current=0,S.current=0,v.current=new Set(u.filter((V)=>V.role==="tool").map((V)=>V.id)),i.current=[],A([])},[m,u]),w1(()=>{if(!m)return;let V=SJ(m);if(!V||V.length<=T.current)return;let Y0=V.slice(T.current);T.current=V.length;let t=Y0,M=i.current;if(M.length>0)if(t.some((n)=>n.type!=="empty"))t=[...M,...t],i.current=[];else{i.current=[...M,...t];return}let k=t.length;while(k>0&&t[k-1].type==="empty")k-=1;if(k!==t.length)i.current=t.slice(k),t=t.slice(0,k);if(t.length===0)return;let E=S.current;S.current+=1;let x=E>0;if(r$())m$();b((n)=>{if(!m||n.has(m))return n;let H0=new Set(n);return H0.add(m),H0}),A((n)=>[...n,L$(D1,{flexDirection:"column",children:L$(Z1,{content:"",role:"assistant",terminalWidth:F,isPending:!1,hidePrefix:x,noMargin:!0,blocksOverride:t,renderCodeBlocksAsPlainText:!1},void 0,!1,void 0,this)},`streaming-${m}-${E}`,!1,void 0,this)])},[m,Y.version,F,z,$]),w1(()=>{if(!m)return;let V=v.current,Y0=u.filter((t)=>t.role==="tool"&&!V.has(t.id)&&!P.current.has(t.id));if(Y0.length===0)return;if($&&r$())m$();for(let t of Y0)P.current.add(t.id);A((t)=>[...t,...Y0.map((M)=>L$(D1,{flexDirection:"column",children:L$(Z1,{content:M.content,role:M.role,terminalWidth:F,metadata:M.metadata,isPending:!1,messageId:M.id},void 0,!1,void 0,this)},`streaming-tool-${M.id}`,!1,void 0,this))])},[$,m,u,F]),w1(()=>{if(!$){if(r$())m$();return}if(!m){if(r$())m$();return}if(!r$())kY(F,N);else fY(F,N);let V=q3(m);if(!V||V.lines.length===0)return;let t=Math.max(1,N-8),M=Math.max(0,V.lines.length-t),k=V.lines.slice(-t),E=(SJ(m)?.length??0)>0;DY(k,M,V.mode,E)},[m,Y.version,N,F,$]),w1(()=>{if(!m&&r$())m$()},[m]),w1(()=>{if(H===null&&u.length>O){if(C(u.length),$&&r$())m$();if($&&w)w.write(X4.clearTerminal);R.incrementClearCount()}},[u.length,O,H,w,R,$]);let o=CJ(()=>{return K.some((V)=>V.status==="pending"||V.status==="in_progress")},[K]),f=W?0:H??0,a=f,e=CJ(()=>{let V=[];if(V.push(L$(Q3,{},"header",!1,void 0,this)),a>0)V.push(L$(MJ,{collapsedCount:a},"collapsed-summary",!1,void 0,this));for(let Y0=f;Y0<u.length;Y0++){let t=u[Y0];if(_0&&t.id===_0)continue;if(t.role==="tool"&&P.current.has(t.id))continue;if(t.role==="assistant"&&B.has(t.id))continue;V.push(L$(D1,{flexDirection:"column",children:L$(Z1,{content:t.content,role:t.role,terminalWidth:F,metadata:t.metadata,isPending:!1,messageId:t.id},void 0,!1,void 0,this)},t.id,!1,void 0,this))}return V},[u,f,a,F,_0,B]),Z0=CJ(()=>y.length>0?[...e,...y]:e,[e,y]);return L$(D1,{flexDirection:"column",paddingX:2,children:L$(D1,{flexDirection:"column",children:[L$(KQ,{items:Z0,children:(V)=>V},z,!1,void 0,this),q&&L$(D1,{marginBottom:1,children:L$(RJ,{content:q,isStreaming:Q,isExpanded:_},void 0,!1,void 0,this)},void 0,!1,void 0,this),U&&o&&L$(D1,{marginTop:1,children:L$(U3,{tasks:K,visible:!0,compact:!1},void 0,!1,void 0,this)},void 0,!1,void 0,this),G.map((V,Y0)=>L$(D1,{flexDirection:"column",children:L$(Z1,{content:V.displayText,role:"user",terminalWidth:F},void 0,!1,void 0,this)},`pending-${Y0}`,!1,void 0,this))]},void 0,!0,void 0,this)},void 0,!1,void 0,this)},z3=GQ.memo(qQ);import{useMemoizedFn as Z4,useMount as zQ}from"ahooks";import{Box as u$,Text as D0,useFocus as OQ,useFocusManager as _Q}from"ink";import NQ from"ink-select-input";import{memo as HQ,useMemo as WQ,useState as Q4}from"react";import{jsxDEV as F0,Fragment as wQ}from"react/jsx-dev-runtime";var FQ=({isSelected:$})=>F0(u$,{marginRight:1,children:F0(D0,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),LQ=({isSelected:$,label:J})=>F0(D0,{bold:$,color:$?"yellow":void 0,children:J},void 0,!1,void 0,this),O3=HQ(({onClose:$,onEdit:J})=>{let X=O9(),Y=q8()??"",{isFocused:Z}=OQ({id:"model-selector"}),Q=_Q(),[K,U]=Q4(""),[G,q]=Q4(!1),[_,z]=Q4(null),O=n0(!1),[W]=Q4(()=>{let b=process.stdout?.columns||80;return Math.max(20,b-8)});zQ(()=>{if(Q?.focus("model-selector"),X.length>0)U(X[0].id)}),W0((b,L)=>{if(G)return;if(L.ctrl&&b==="c"||L.meta&&b==="c"){O();return}if(L.escape){$();return}if(!Z)return;if(b==="d"||b==="D"){N();return}if((b==="e"||b==="E")&&J)w()},{isActive:!0});let F=Z4(async(b)=>{if(G)return;let L=b.value;if(L===Y){$();return}q(!0),z(null);try{await G$().setCurrentModel(L),$()}catch(D){z(D.message),q(!1)}}),N=Z4(async()=>{if(G||K===Y)return;q(!0),z(null);try{if(await G$().removeModel(K),X.length<=1)$()}catch(b){z(b.message)}finally{q(!1)}}),w=Z4(()=>{if(G||!J)return;let b=X.find((L)=>L.id===K);if(!b)return;J(b)}),R=Z4((b)=>{U(b.value)}),H=WQ(()=>{return X.find((b)=>b.id===K)},[X,K]),C=H?K4()?.modelProviders[H.provider]:void 0,y=X.map((b)=>{let L=b.id===Y?" (当前)":"";return{label:kJ(b)+L,value:b.id}}),A=K===Y;return F0(u$,{flexDirection:"column",borderStyle:"round",borderColor:"gray",padding:1,width:"100%",children:[F0(u$,{flexDirection:"row",justifyContent:"space-between",marginBottom:1,children:[F0(D0,{bold:!0,color:"cyan",children:"模型管理"},void 0,!1,void 0,this),F0(D0,{dimColor:!0,children:[G?"处理中...":A?"Enter=关闭 • E=编辑 • Esc=取消":"Enter=切换 • D=删除 • E=编辑 • Esc=取消"," • Ctrl+C=退出"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),F0(u$,{flexDirection:"row",children:[F0(u$,{flexDirection:"column",flexGrow:2,marginRight:2,borderStyle:"single",borderColor:"gray",padding:1,children:[F0(D0,{dimColor:!0,children:["已配置模型 (",X.length,")"]},void 0,!0,void 0,this),F0(u$,{marginTop:1,children:F0(NQ,{items:y,onSelect:F,onHighlight:R,indicatorComponent:FQ,itemComponent:LQ},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),F0(u$,{flexDirection:"column",flexGrow:3,borderStyle:"single",borderColor:"gray",padding:1,children:[F0(D0,{dimColor:!0,children:"模型详情"},void 0,!1,void 0,this),F0(u$,{marginY:1,children:F0(D0,{color:A?"green":"yellow",children:A?"* 当前使用":"* 可切换"},void 0,!1,void 0,this)},void 0,!1,void 0,this),H?F0(u$,{flexDirection:"column",children:[F0(D0,{children:[F0(D0,{dimColor:!0,children:"名称: "},void 0,!1,void 0,this),F0(D0,{bold:!0,color:"cyan",children:kJ(H)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),F0(D0,{children:[F0(D0,{dimColor:!0,children:"Provider: "},void 0,!1,void 0,this),F0(D0,{bold:!0,children:C?.name??H.provider},void 0,!1,void 0,this)]},void 0,!0,void 0,this),C&&F0(wQ,{children:[F0(D0,{children:[F0(D0,{dimColor:!0,children:"Channel ID: "},void 0,!1,void 0,this),F0(D0,{children:H.provider},void 0,!1,void 0,this)]},void 0,!0,void 0,this),F0(D0,{children:[F0(D0,{dimColor:!0,children:"Wire API: "},void 0,!1,void 0,this),F0(D0,{children:C.wireApi},void 0,!1,void 0,this)]},void 0,!0,void 0,this),F0(D0,{children:[F0(D0,{dimColor:!0,children:"Endpoint: "},void 0,!1,void 0,this),F0(D0,{color:"blueBright",children:C.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),F0(D0,{children:[F0(D0,{dimColor:!0,children:"Model: "},void 0,!1,void 0,this),F0(D0,{bold:!0,children:H.model},void 0,!1,void 0,this)]},void 0,!0,void 0,this),H.overrides?.baseUrl&&F0(D0,{children:[F0(D0,{dimColor:!0,children:"Base URL override: "},void 0,!1,void 0,this),F0(D0,{color:"blueBright",children:H.overrides.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this),F0(D0,{children:[F0(D0,{dimColor:!0,children:"Context Window: "},void 0,!1,void 0,this),F0(D0,{children:_1().resolveConfig(H).contextWindow},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this):F0(D0,{dimColor:!0,children:"请选择一个模型查看详情"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),_&&F0(u$,{marginTop:1,children:F0(D0,{color:"red",children:_},void 0,!1,void 0,this)},void 0,!1,void 0,this),F0(u$,{justifyContent:"center",marginTop:1,children:F0(D0,{dimColor:!0,children:"─".repeat(W)},void 0,!1,void 0,this)},void 0,!1,void 0,this),F0(u$,{justifyContent:"center",children:F0(D0,{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 fJ}from"ahooks";import{Box as jQ,Text as DJ}from"ink";import{useState as $2}from"react";import{Box as s1,Text as B1}from"ink";import BQ from"ink-text-input";import{jsxDEV as w$}from"react/jsx-dev-runtime";var _3=({provider:$,value:J,onChange:X,onSubmit:Y,onCancel:Z,error:Q})=>{return W0((K,U)=>{if(U.escape)Z()}),w$(s1,{flexDirection:"column",children:[w$(s1,{marginBottom:1,children:w$(B1,{bold:!0,color:"blue",children:"Step 2: 输入 API Key"},void 0,!1,void 0,this)},void 0,!1,void 0,this),w$(s1,{marginBottom:1,children:w$(B1,{children:["Provider: ",w$(B1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),w$(s1,{marginBottom:1,children:w$(B1,{dimColor:!0,children:"API 密钥将存储在 ~/.blade/auth.json(权限 600),不会写入模型配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),w$(s1,{children:[w$(B1,{bold:!0,color:"cyan",children:[">"," "]},void 0,!0,void 0,this),w$(BQ,{value:J,onChange:X,onSubmit:Y,placeholder:"sk-...",mask:"*"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q&&w$(s1,{marginTop:1,children:w$(B1,{color:"red",children:Q},void 0,!1,void 0,this)},void 0,!1,void 0,this),w$(s1,{marginTop:1,children:w$(B1,{dimColor:!0,children:["输入完成后按 ",w$(B1,{bold:!0,children:"Enter"},void 0,!1,void 0,this),",",w$(B1,{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 U4,Text as V1}from"ink";import AQ from"ink-text-input";import{useState as G4}from"react";import{jsxDEV as j$}from"react/jsx-dev-runtime";var q4=["id","name","baseUrl","model"];function N3($){switch($){case"id":return"Channel ID";case"name":return"Channel name";case"baseUrl":return"Base URL";case"model":return"Model ID"}}function bQ($,J,X){switch($){case"id":return"team-gateway";case"name":return X||"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 PQ($,J){let X=$.id.trim(),Y={name:$.name.trim()||X,baseUrl:$.baseUrl.trim(),wireApi:J},Z=W3(X,Y);if(!$.model.trim())Z.push("Model ID must not be empty");if(Z.length>0)throw Error(Z[0]);return{provider:X,model:$.model.trim(),displayName:$.model.trim(),modelProvider:Y}}var F3=({wireApi:$,initialConfig:J,onSubmit:X,onCancel:Y})=>{let Z={id:J?.provider??"",name:J?.modelProvider?.name??"",baseUrl:J?.modelProvider?.baseUrl??"",model:J?.model??""},[Q,K]=G4(J?3:0),[U,G]=G4(J?.model??""),[q,_]=G4(Z),[z,O]=G4(),W=q4[Q];W0((N,w)=>{if(!w.escape)return;if(O(void 0),Q===0){Y();return}let R=Q-1,H=q4[R];K(R),G(q[H])});let F=(N)=>{let w=N.trim();if(W==="id"&&!H3.test(w)){O("Channel ID 必须以小写字母开头,且仅包含小写字母、数字、.、_ 或 -");return}if(W==="baseUrl")try{let H=new URL(w);if(!["http:","https:"].includes(H.protocol))throw Error()}catch{O("Base URL 必须是绝对 HTTP(S) URL");return}if(W==="model"&&!w){O("Model ID 不能为空");return}let R={...q,[W]:W==="name"&&!w?q.id:w};if(_(R),O(void 0),Q===q4.length-1){try{X(PQ(R,$))}catch(H){O(H instanceof Error?H.message:"渠道配置无效")}return}K(Q+1),G("")};return j$(U4,{flexDirection:"column",children:[j$(U4,{marginBottom:1,children:j$(V1,{bold:!0,color:"blue",children:"配置自定义 Provider 渠道"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j$(V1,{dimColor:!0,children:["Protocol:"," ",$==="anthropic-messages"?"Anthropic Messages":"OpenAI Chat Completions"]},void 0,!0,void 0,this),q4.slice(0,Q).map((N)=>j$(V1,{children:[N3(N),": ",j$(V1,{color:"cyan",children:q[N]},void 0,!1,void 0,this)]},N,!0,void 0,this)),j$(U4,{marginTop:1,children:[j$(V1,{bold:!0,children:[N3(W),": "]},void 0,!0,void 0,this),j$(AQ,{value:U,onChange:(N)=>{G(N),O(void 0)},onSubmit:F,placeholder:bQ(W,$,q.id)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),W==="name"&&j$(V1,{dimColor:!0,children:"留空使用 Channel ID"},void 0,!1,void 0,this),z&&j$(V1,{color:"red",children:z},void 0,!1,void 0,this),j$(U4,{marginTop:1,children:j$(V1,{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 B3,useState as R2}from"react";var A3=()=>{let[$,J]=R2([]),[X,Y]=R2(!0),[Z,Q]=R2(null);return B3(()=>{let K=!1;return(async()=>{try{let G=await L3();if(!K)J(G)}catch(G){if(!K)Q(G instanceof Error?G.message:"加载 Provider 列表失败")}finally{if(!K)Y(!1)}})(),()=>{K=!0}},[]),{providers:$,isLoading:X,error:Z}},b3=($)=>{let[J,X]=R2([]),[Y,Z]=R2(!1),[Q,K]=R2(null);return B3(()=>{if(!$){X([]),Z(!1),K(null);return}let U=!1;return X([]),Z(!0),K(null),(async()=>{try{let q=await w3($);if(!U)X(q)}catch(q){if(!U)K(q instanceof Error?q.message:"加载模型列表失败")}finally{if(!U)Z(!1)}})(),()=>{U=!0}},[$]),{models:J,isLoading:Y,error:Q}};import{Box as A1,Text as t$}from"ink";import MQ from"ink-select-input";import yQ from"ink-text-input";import{useMemo as P3,useState as TQ}from"react";import{jsxDEV as X$,Fragment as SQ}from"react/jsx-dev-runtime";var RQ=({isSelected:$})=>X$(A1,{marginRight:1,children:X$(t$,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),CQ=($)=>{let J=[$.name];if($.contextWindow){let X=$.contextWindow>=1e6?`${($.contextWindow/1e6).toFixed(1)}M`:$.contextWindow>=1000?`${Math.round($.contextWindow/1000)}K`:`${$.contextWindow}`;J.push(`[${X} 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(" ")},IQ=({isSelected:$,label:J})=>X$(t$,{bold:$,color:$?"yellow":void 0,children:J},void 0,!1,void 0,this),M3=({provider:$,models:J,isLoading:X,error:Y,onSelect:Z,onCancel:Q})=>{let[K,U]=TQ("");W0((_,z)=>{if(z.escape)if(K)U("");else Q()});let G=P3(()=>{if(!K)return J;let _=K.toLowerCase();return J.filter((z)=>z.name.toLowerCase().includes(_)||z.id.toLowerCase().includes(_))},[J,K]),q=P3(()=>G.map((_)=>({key:_.id,label:CQ(_),value:_})),[G]);if(X)return X$(A1,{flexDirection:"column",children:X$(t$,{color:"yellow",children:["正在加载 ",$.name," 模型列表..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this);if(Y)return X$(A1,{flexDirection:"column",children:[X$(t$,{color:"red",children:Y},void 0,!1,void 0,this),X$(t$,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return X$(A1,{flexDirection:"column",children:[X$(A1,{marginBottom:1,children:X$(t$,{bold:!0,color:"blue",children:"Step 3: 选择模型"},void 0,!1,void 0,this)},void 0,!1,void 0,this),X$(A1,{marginBottom:1,children:X$(t$,{children:["Provider: ",X$(t$,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),X$(SQ,{children:[X$(A1,{marginBottom:1,children:[X$(t$,{color:"cyan",children:"> "},void 0,!1,void 0,this),X$(yQ,{value:K,onChange:U,placeholder:`搜索 ${J.length} 个模型...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X$(A1,{marginBottom:1,children:X$(t$,{dimColor:!0,children:"模型元数据来自内置 catalog"},void 0,!1,void 0,this)},void 0,!1,void 0,this),X$(A1,{flexDirection:"column",height:12,children:X$(MQ,{items:q,onSelect:(_)=>Z(_.value),indicatorComponent:RQ,itemComponent:IQ,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),G.length===0&&X$(t$,{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 e1,Text as j1}from"ink";import kQ from"ink-select-input";import fQ from"ink-text-input";import{useMemo as y3,useState as DQ}from"react";import{jsxDEV as B$}from"react/jsx-dev-runtime";var vQ=({isSelected:$})=>B$(e1,{marginRight:1,children:B$(j1,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),VQ=({isSelected:$,label:J})=>B$(j1,{bold:$,color:$?"yellow":void 0,children:J},void 0,!1,void 0,this),T3=({providers:$,isLoading:J,error:X,onSelect:Y,onCancel:Z})=>{let[Q,K]=DQ("");W0((q,_)=>{if(_.escape)if(Q)K("");else Z()});let U=y3(()=>{if(!Q)return $;let q=Q.toLowerCase();return $.filter((_)=>_.name.toLowerCase().includes(q)||_.id.toLowerCase().includes(q))},[$,Q]),G=y3(()=>U.map((q)=>({key:q.id,label:`${q.name} - ${q.modelCount} models${q.configured?" [configured]":""}`,value:q})),[U]);if(J)return B$(e1,{flexDirection:"column",children:B$(j1,{color:"yellow",children:"正在加载 Provider 列表..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(X)return B$(e1,{flexDirection:"column",children:[B$(j1,{color:"red",children:X},void 0,!1,void 0,this),B$(j1,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return B$(e1,{flexDirection:"column",children:[B$(e1,{marginBottom:1,children:B$(j1,{bold:!0,color:"blue",children:"Step 1: 选择 API 提供商"},void 0,!1,void 0,this)},void 0,!1,void 0,this),B$(e1,{marginBottom:1,children:[B$(j1,{color:"cyan",children:"> "},void 0,!1,void 0,this),B$(fQ,{value:Q,onChange:K,placeholder:`搜索 ${$.length} 个 Provider...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),B$(e1,{flexDirection:"column",height:12,children:B$(kQ,{items:G,onSelect:(q)=>Y(q.value),indicatorComponent:vQ,itemComponent:VQ,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),U.length===0&&B$(j1,{color:"yellow",children:"未找到匹配的 Provider,按 Esc 清除搜索"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};function R3($){if($==="custom")return"provider";if($==="model")return"provider";if($==="credential")return"model";return}import{jsxDEV as E1}from"react/jsx-dev-runtime";var vJ=({mode:$,initialConfig:J,modelId:X,onComplete:Y,onCancel:Z})=>{let[Q,K]=$2("provider"),[U,G]=$2(),[q,_]=$2(),[z,O]=$2(),[W,F]=$2(""),[N,w]=$2(),[R,H]=$2(!1),C=A3(),y=b3(U?.id),A=n0(!1);W0((D,T)=>{if(T.ctrl&&D==="c"||T.meta&&D==="c")$==="setup"?A():Z()});let B=fJ(async(D)=>{if(!U)return;let T=z??(q?{provider:U.id,model:q.id,displayName:J?.displayName}:void 0);if(!T)return;H(!0),w(void 0);try{if(T.modelProvider)_1().registerModelProvider(T.provider,T.modelProvider,[T.model]);if(D?.trim())await _1().setApiKey(T.provider,D.trim());let S={displayName:T.displayName,provider:T.provider,model:T.model,overrides:T.overrides};if($==="setup")await Y(T);else if($==="add"){let P=T.modelProvider?await G$().addModelWithProvider(S,T.modelProvider):await G$().addModel(S);await G$().setCurrentModel(P.id),await Y(T)}else if(X){if(T.modelProvider)await G$().updateModelWithProvider(X,S,T.modelProvider);else await G$().updateModel(X,S);await Y(T)}}catch(S){if(T.modelProvider){await _1().credentials.delete(T.provider);let P=K4();_1().configureModelProviders(P?.modelProviders??{},P?.models??[])}w(S instanceof Error?S.message:"保存配置失败"),H(!1)}}),b=fJ((D)=>{if(_(D),U?.configured)B();else if(U?.supportsApiKey)K("credential");else w(`${U?.name??"Provider"} 需要 OAuth 或环境凭证,请先在外部完成认证`)}),L=fJ(()=>{if(w(void 0),Q==="credential"&&z){K("custom");return}let D=R3(Q);if(D)K(D)});return E1(jQ,{flexDirection:"column",padding:1,children:[E1(DJ,{bold:!0,color:"blue",children:$==="edit"?"编辑模型":"添加模型"},void 0,!1,void 0,this),Q==="provider"&&E1(T3,{...C,onSelect:(D)=>{G(D),_(void 0),O(void 0),K(D.factoryWireApi?"custom":"model")},onCancel:$==="setup"?()=>{return}:Z},void 0,!1,void 0,this),Q==="custom"&&U?.factoryWireApi&&E1(F3,{wireApi:U.factoryWireApi,initialConfig:z,onSubmit:(D)=>{O(D),K("credential")},onCancel:L},void 0,!1,void 0,this),Q==="model"&&U&&E1(M3,{provider:U,...y,onSelect:b,onCancel:L},void 0,!1,void 0,this),Q==="credential"&&U&&E1(_3,{provider:U,value:W,onChange:F,onSubmit:()=>void B(W),onCancel:L,error:N},void 0,!1,void 0,this),R&&E1(DJ,{color:"yellow",children:"正在保存配置..."},void 0,!1,void 0,this),N&&Q!=="credential"&&E1(DJ,{color:"red",children:N},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as o2}from"ahooks";import{promises as k3}from"fs";import{Box as E$,Text as J$}from"ink";import C3 from"ink-select-input";import EQ from"ink-text-input";import hQ from"os";import z4 from"path";import{useEffect as gQ,useMemo as O4,useRef as mQ,useState as h1}from"react";import{jsxDEV as M0}from"react/jsx-dev-runtime";var n2=[{key:"allow",label:"Allow"},{key:"ask",label:"Ask"},{key:"deny",label:"Deny"},{key:"info",label:"Info"}],pQ={allow:"Add a new rule...",ask:"Add a new rule...",deny:"Add a new rule..."},xQ={allow:"Allow permission rules",ask:"Ask permission rules",deny:"Deny permission rules"},I3={project:"[项目共享配置]",global:"[用户全局配置]",local:"[本地配置]"},cQ=["project","global","local"],uQ={allow:[],ask:[],deny:[]},dQ={localExists:!1,projectExists:!1,globalExists:!1},S3={allow:[],ask:[],deny:[]};function lQ($){let J=(Y)=>Array.isArray(Y)?Y.filter((Z)=>typeof Z==="string"):[],X=$?.permissions??{};return{allow:J(X?.allow),ask:J(X?.ask),deny:J(X?.deny)}}async function rQ($){try{let J=await k3.readFile($,"utf-8"),X=JSON.parse(J);return{exists:!0,raw:X,permissions:lQ(X)}}catch(J){if(J.code==="ENOENT")return{exists:!1,raw:{},permissions:{...S3}};return console.warn(`[PermissionsManager] Failed to read ${$}:`,J),{exists:!0,raw:{},permissions:{...S3}}}}function aQ($,J){let X=$.padEnd(32," "),Y=J==="local"?`${I3[J]} <- 可删除`:I3[J];return`${X} ${Y}`}var f3=({onClose:$})=>{let X=K$()==="permissions-manager",Y=n0(!1),[Z,Q]=h1(0),K=n2[Z].key,[U,G]=h1(uQ),[q,_]=h1(dQ),[z,O]=h1(!0),[W,F]=h1("list"),[N,w]=h1(""),[R,H]=h1(null),[C,y]=h1(null),A=mQ(!1),B=O4(()=>z4.join(U$(),".blade","settings.local.json"),[]),b=O4(()=>z4.join(U$(),".blade","settings.json"),[]),L=O4(()=>z4.join(hQ.homedir(),".blade","settings.json"),[]),D=o2(async()=>{O(!0);let Z0=await Promise.all([{source:"local",path:B},{source:"project",path:b},{source:"global",path:L}].map(async({source:M,path:k})=>{let E=await rQ(k);return{source:M,path:k,...E}})),V={localExists:Z0.find((M)=>M.source==="local")?.exists??!1,projectExists:Z0.find((M)=>M.source==="project")?.exists??!1,globalExists:Z0.find((M)=>M.source==="global")?.exists??!1};_(V);let Y0={allow:[],ask:[],deny:[]},t=Object.fromEntries(Z0.map((M)=>[M.source,M]));["allow","ask","deny"].forEach((M)=>{cQ.forEach((k)=>{(t[k]?.permissions[M]??[]).forEach((x,n)=>{let H0={key:`${k}:${n}:${x}`,rule:x,source:k};Y0[M].push(H0)})})}),G(Y0),O(!1)});gQ(()=>{D()},[D]);let T=o2(async(e,Z0)=>{try{let V=z4.join(U$(),".blade","settings.local.json"),Y0={allow:[],ask:[],deny:[]};try{let M=await k3.readFile(V,"utf-8"),E=JSON.parse(M).permissions||{};Y0={allow:Array.isArray(E.allow)?E.allow:[],ask:Array.isArray(E.ask)?E.ask:[],deny:Array.isArray(E.deny)?E.deny:[]}}catch(M){}let t=Z0(Y0);await G$().updateConfig({permissions:t},{scope:"local",immediate:!0}),await D()}catch(V){throw console.error("[PermissionsManager] 修改权限规则失败:",V),V}});W0((e,Z0)=>{if(Z0.ctrl&&e==="c"||Z0.meta&&e==="c"){Y();return}if(W==="locked"){if(A.current){A.current=!1;return}F("list"),H(null),y(null);return}if(Z0.escape){if(W==="list"||K==="info")$();else F("list"),w(""),H(null),y(null);return}if(W==="list"){if(Z0.tab&&Z0.shift)Q((V)=>(V-1+n2.length)%n2.length);else if(Z0.tab)Q((V)=>(V+1)%n2.length);else if(e?.toLowerCase()==="q")$()}},{isActive:X});let S=o2((e)=>{let Z0=e.value;if(K==="info")return;if(Z0.type==="add"){F("add"),w(""),y(null);return}if(Z0.entry.source!=="local"){F("locked"),A.current=!0,H({tab:K,entry:Z0.entry}),y({type:"error",text:Z0.entry.source==="project"?"此规则定义在项目共享配置中,无法在此删除。":"此规则来自用户全局配置,无法在此删除。"});return}F("confirm-delete"),H({tab:K,entry:Z0.entry}),y(null)}),P=o2(async()=>{if(K==="info")return;let e=N.trim();if(!e){y({type:"error",text:"Permission rule 不能为空"});return}if(U[K].map((V)=>V.rule).includes(e)){y({type:"error",text:"该规则已存在"});return}try{await T(K,(V)=>{let Y0={allow:[...V.allow],ask:[...V.ask],deny:[...V.deny]};return Y0[K]=[...new Set([...V[K],e])],Y0}),F("list"),w(""),y({type:"success",text:"已添加本地权限规则"})}catch(V){y({type:"error",text:`保存失败: ${V instanceof Error?V.message:"未知错误"}`})}}),v=o2(async()=>{if(!R)return;let{tab:e,entry:Z0}=R;try{await T(e,(V)=>{let Y0={allow:[...V.allow],ask:[...V.ask],deny:[...V.deny]};return Y0[e]=V[e].filter((t)=>t!==Z0.rule),Y0}),F("list"),H(null),y({type:"success",text:"已删除本地权限规则"})}catch(V){y({type:"error",text:`删除失败: ${V instanceof Error?V.message:"未知错误"}`})}}),i=O4(()=>{if(K==="info")return[];let e=K;return[{key:"add-new-rule",label:`› ${pQ[e]}`,value:{type:"add"}},...U[e].map((V)=>({key:V.key,label:aQ(V.rule,V.source),value:{type:"rule",entry:V}}))]},[K,U]),s=()=>M0(E$,{marginBottom:1,children:n2.map((e,Z0)=>M0(E$,{marginRight:2,children:M0(J$,{color:Z0===Z?"yellow":"gray",children:["[",e.label,"]"]},void 0,!0,void 0,this)},e.key,!1,void 0,this))},void 0,!1,void 0,this),u=()=>M0(E$,{flexDirection:"column",gap:1,children:[M0(J$,{children:"配置文件优先级(从高到低):"},void 0,!1,void 0,this),M0(E$,{flexDirection:"column",marginLeft:2,children:[M0(J$,{children:["1. .blade/settings.local.json (本地配置,不提交 Git)"," ",q.localExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),M0(J$,{children:["2. .blade/settings.json (项目配置,提交 Git)"," ",q.projectExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),M0(J$,{children:["3. ~/.blade/settings.json (用户全局配置)"," ",q.globalExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),M0(J$,{children:"说明:"},void 0,!1,void 0,this),M0(E$,{flexDirection:"column",marginLeft:2,children:[M0(J$,{children:"- /permissions 命令只管理本地配置 (.blade/settings.local.json)"},void 0,!1,void 0,this),M0(J$,{children:"- 修改全局或项目配置请直接编辑对应文件"},void 0,!1,void 0,this),M0(J$,{children:"- 本地配置不会提交到 Git"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),_0=(e)=>M0(E$,{flexDirection:"column",gap:1,children:[M0(J$,{bold:!0,children:xQ[e]},void 0,!1,void 0,this),M0(J$,{children:"Permission rules are a tool name, optionally followed by a specifier in parentheses."},void 0,!1,void 0,this),M0(J$,{color:"gray",children:"例如: WebFetch 或 Bash(ls:*)"},void 0,!1,void 0,this),M0(E$,{marginTop:1,children:M0(EQ,{value:N,onChange:w,onSubmit:P},void 0,!1,void 0,this)},void 0,!1,void 0,this),M0(J$,{color:"gray",children:"Enter 提交 · Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),m=(e,Z0)=>M0(E$,{flexDirection:"column",gap:1,children:[M0(J$,{bold:!0,children:["Delete ",e," permission rule?"]},void 0,!0,void 0,this),M0(J$,{children:Z0.rule},void 0,!1,void 0,this),M0(J$,{color:"gray",children:"From project local settings"},void 0,!1,void 0,this),M0(J$,{children:"Are you sure you want to delete this permission rule?"},void 0,!1,void 0,this),M0(C3,{items:[{label:"Yes",value:"yes"},{label:"No",value:"no"}],onSelect:(V)=>{if(V.value==="yes")v();else F("list"),H(null)}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),o=(e)=>M0(E$,{flexDirection:"column",gap:1,children:[M0(J$,{bold:!0,children:"Cannot delete this rule"},void 0,!1,void 0,this),M0(J$,{children:e.rule},void 0,!1,void 0,this),M0(J$,{color:"gray",children:e.source==="project"?"This rule is defined in .blade/settings.json. 请手动编辑该文件以移除规则。":"This rule is defined in ~/.blade/settings.json. 请手动编辑该文件以移除规则。"},void 0,!1,void 0,this),M0(J$,{color:"gray",children:"按任意键继续"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),f=(e)=>M0(C3,{items:i,isFocused:W==="list",onSelect:S},void 0,!1,void 0,this),a=()=>{if(z)return M0(J$,{children:"加载中..."},void 0,!1,void 0,this);if(K==="info")return u();if(W==="add")return _0(K);if(W==="confirm-delete"&&R)return m(R.tab,R.entry);if(W==="locked"&&R)return o(R.entry);return f(K)};return M0(E$,{flexDirection:"column",borderStyle:"round",borderColor:X?"cyan":"gray",padding:1,width:80,children:[M0(J$,{color:"cyan",bold:!0,children:"权限管理器"},void 0,!1,void 0,this),s(),M0(E$,{flexDirection:"column",gap:1,children:a()},void 0,!1,void 0,this),C&&M0(E$,{marginTop:1,children:M0(J$,{color:C.type==="success"?"green":"red",children:C.text},void 0,!1,void 0,this)},void 0,!1,void 0,this),M0(E$,{marginTop:1,children:M0(J$,{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 E0,Text as w0}from"ink";import{useEffect as iQ,useState as J2}from"react";import{jsxDEV as l}from"react/jsx-dev-runtime";var VJ=["local","project","global"];function g3({workspaceRoot:$,onCancel:J}){let X=K$()==="plugins-manager",Y=v3($),Z=Y.getAll(),[Q,K]=J2(0),[U,G]=J2(!1),[q,_]=J2(""),[z,O]=J2(null),[W,F]=J2("local"),[N,w]=J2(null),[R,H]=J2(0),C=Y.getBySource(),y=Y.getStats(),A=Y.getSourcePolicy(),B=n0(!1,J);iQ(()=>{let P=!0;return D3.getInstance().loadWorkspacePluginSettingsResolution(Y.getWorkspaceRoot()).then((v)=>{if(P)w(v.settings)}).catch((v)=>{if(P)_(v instanceof Error?v.message:"无法读取插件作用域配置")}),()=>{P=!1}},[Y,R]);let b=()=>{F((P)=>{let v=VJ.indexOf(P);return VJ[(v+1)%VJ.length]}),O(null)},L=async()=>{let P=Z[Q];if(!P||U)return;if(P.source==="cli"){_(`${P.manifest.name} 由 --plugin-dir 管理,不能持久化切换`);return}if(P.status==="error"){_(P.error??`${P.manifest.name} 当前不可用`);return}G(!0),_("");try{let v=await V3(Y.getWorkspaceRoot(),P.manifest.name,P.status!=="active",W);_(v.effectiveEnabled?`已启用 ${P.manifest.name} · 生效层级 ${v.effectiveScope}`:`已禁用 ${P.manifest.name} · 生效层级 ${v.effectiveScope}`),H((i)=>i+1)}catch(v){_(v instanceof Error?v.message:String(v))}finally{G(!1)}},D=async()=>{if(U)return;G(!0),_("");try{await j3(Y.getWorkspaceRoot()),K(0),_("插件列表已刷新"),H((P)=>P+1)}catch(P){_(P instanceof Error?P.message:String(P))}finally{G(!1)}},T=async()=>{let P=Z[Q];if(!P||U)return;if(!P.installation){_(`${P.manifest.name} 不是 Blade 受管安装,不能自动更新`);return}G(!0),O(null),_("");try{let{result:v}=await E3(Y.getWorkspaceRoot(),P.manifest.name,{trusted:!0});if(!v.success)throw Error(v.error);_(v.changed?`已更新 ${P.manifest.name} 到 ${v.installation?.revision}`:`${P.manifest.name} 已是最新版本`),H((i)=>i+1)}catch(v){_(v instanceof Error?v.message:String(v))}finally{G(!1)}},S=async()=>{let P=Z[Q];if(!P||U)return;if(!P.installation){_(`${P.manifest.name} 不是 Blade 受管安装,不能自动卸载`);return}if(z!==P.manifest.name){O(P.manifest.name),_(`再次按 x 确认卸载 ${P.manifest.name}`);return}G(!0),_("");try{let{result:v}=await h3(Y.getWorkspaceRoot(),P.manifest.name,!0);if(!v.success)throw Error(v.error);O(null),K(0),_(`已卸载 ${P.manifest.name}`),H((i)=>i+1)}catch(v){_(v instanceof Error?v.message:String(v))}finally{G(!1)}};if(W0((P,v)=>{if(v.escape)J?.();else if(v.ctrl&&P==="c"||v.meta&&P==="c")B();else if((v.upArrow||P==="k")&&Z.length>0)O(null),K((i)=>(i-1+Z.length)%Z.length);else if((v.downArrow||P==="j")&&Z.length>0)O(null),K((i)=>(i+1)%Z.length);else if(P===" "||v.return)L();else if(P==="r")D();else if(P==="s")b();else if(P==="u")T();else if(P==="x")S()},{isActive:X}),Z.length===0)return l(E0,{flexDirection:"column",paddingY:1,children:[l(E0,{marginBottom:1,children:l(w0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),l(E0,{paddingLeft:2,children:l(w0,{color:"gray",children:"没有已加载的插件"},void 0,!1,void 0,this)},void 0,!1,void 0,this),l(E0,{marginTop:1,paddingLeft:2,flexDirection:"column",children:[l(w0,{color:"gray",children:"插件目录位置:"},void 0,!1,void 0,this),l(w0,{color:"gray",dimColor:!0,children:[" ","• ~/.blade/plugins/ - 用户级插件"]},void 0,!0,void 0,this),l(w0,{color:"gray",dimColor:!0,children:[" ","• .blade/plugins/ - 项目级插件"]},void 0,!0,void 0,this),l(w0,{color:"gray",dimColor:!0,children:[" ","• --plugin-dir - CLI 指定的插件"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),l(E0,{marginTop:1,paddingLeft:2,children:l(w0,{color:"gray",children:"使用 /plugins install <url> 安装新插件"},void 0,!1,void 0,this)},void 0,!1,void 0,this),l(E0,{marginTop:1,children:l(w0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return l(E0,{flexDirection:"column",paddingY:1,children:[l(E0,{marginBottom:1,children:[l(w0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this),l(w0,{color:"gray",children:[" (共 ",y.total," 个插件)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),l(E0,{paddingLeft:2,marginBottom:1,children:l(w0,{color:"gray",children:["启用: ",y.active," | 禁用: ",y.inactive," | 命令: ",y.commands," | 技能:"," ",y.skills," | 代理: ",y.agents]},void 0,!0,void 0,this)},void 0,!1,void 0,this),l(E0,{paddingLeft:2,marginBottom:1,children:l(w0,{color:"gray",children:["来源策略: ",A.restrictToAllowedSources?"restricted":"open"," | Git SHA: ",A.requireGitCommitSha?"required":"optional"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),l(E0,{paddingLeft:2,marginBottom:1,children:l(w0,{color:"gray",children:["写入层级: ",l(w0,{color:"cyan",children:W},void 0,!1,void 0,this)," · 按 s 切换"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),C.cli.length>0&&l(E0,{flexDirection:"column",marginBottom:1,children:[l(E0,{paddingLeft:1,children:[l(w0,{bold:!0,color:"magenta",children:"CLI 指定"},void 0,!1,void 0,this),l(w0,{color:"gray",children:" (--plugin-dir)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),C.cli.map((P)=>{let v=P.status==="active"?"[on]":"[off]",i=Z.indexOf(P)===Q;return l(E0,{flexDirection:"column",paddingLeft:2,children:[l(w0,{children:[l(w0,{bold:!0,color:i?"cyan":"green",children:[i?"› ":" ",v," ",P.manifest.name]},void 0,!0,void 0,this),l(w0,{color:"gray",children:[" v",P.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),l(E0,{paddingLeft:2,children:l(w0,{color:"gray",children:P.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),l(E0,{paddingLeft:2,children:l(w0,{color:"gray",dimColor:!0,children:"生效层级: invocation"},void 0,!1,void 0,this)},void 0,!1,void 0,this),P.commands.length>0&&l(E0,{paddingLeft:2,children:l(w0,{color:"blue",children:["命令:"," ",P.commands.map((s)=>`/${s.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),C.project.length>0&&l(E0,{flexDirection:"column",marginBottom:1,children:[l(E0,{paddingLeft:1,children:[l(w0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),l(w0,{color:"gray",children:" (.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),C.project.map((P)=>{let v=P.status==="active"?"[on]":"[off]",i=Z.indexOf(P)===Q;return l(E0,{flexDirection:"column",paddingLeft:2,children:[l(w0,{children:[l(w0,{bold:!0,color:i?"cyan":"green",children:[i?"› ":" ",v," ",P.manifest.name]},void 0,!0,void 0,this),l(w0,{color:"gray",children:[" v",P.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),l(E0,{paddingLeft:2,children:l(w0,{color:"gray",children:P.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),l(E0,{paddingLeft:2,children:l(w0,{color:"gray",dimColor:!0,children:["生效层级:"," ",N?.[P.manifest.name]?.effectiveScope??"default"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),P.commands.length>0&&l(E0,{paddingLeft:2,children:l(w0,{color:"blue",children:["命令:"," ",P.commands.map((s)=>`/${s.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),C.user.length>0&&l(E0,{flexDirection:"column",marginBottom:1,children:[l(E0,{paddingLeft:1,children:[l(w0,{bold:!0,color:"cyan",children:"用户级"},void 0,!1,void 0,this),l(w0,{color:"gray",children:" (~/.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),C.user.map((P)=>{let v=P.status==="active"?"[on]":"[off]",i=Z.indexOf(P)===Q;return l(E0,{flexDirection:"column",paddingLeft:2,children:[l(w0,{children:[l(w0,{bold:!0,color:i?"cyan":"green",children:[i?"› ":" ",v," ",P.manifest.name]},void 0,!0,void 0,this),l(w0,{color:"gray",children:[" v",P.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),l(E0,{paddingLeft:2,children:l(w0,{color:"gray",children:P.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),l(E0,{paddingLeft:2,children:l(w0,{color:"gray",dimColor:!0,children:["生效层级:"," ",N?.[P.manifest.name]?.effectiveScope??"default"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),P.commands.length>0&&l(E0,{paddingLeft:2,children:l(w0,{color:"blue",children:["命令:"," ",P.commands.map((s)=>`/${s.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),l(E0,{marginTop:1,paddingLeft:2,flexDirection:"column",children:[l(w0,{color:"gray",children:"可用命令:"},void 0,!1,void 0,this),l(w0,{color:"gray",dimColor:!0,children:[" ","• /plugins list - 列出所有插件"]},void 0,!0,void 0,this),l(w0,{color:"gray",dimColor:!0,children:[" ","• /plugins info <name> - 显示插件详情"]},void 0,!0,void 0,this),l(w0,{color:"gray",dimColor:!0,children:[" ","• /plugins install <url> - 安装插件"]},void 0,!0,void 0,this),l(w0,{color:"gray",dimColor:!0,children:[" ","• /plugins enable/disable <name> - 启用/禁用插件"]},void 0,!0,void 0,this),l(w0,{color:"gray",dimColor:!0,children:[" ","• /plugins policy show|set - 来源与 SHA 策略"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),l(E0,{marginTop:1,children:l(w0,{dimColor:!0,children:"↑/↓ 选择 · Space/Enter 启停 · s 切换层级 · u 信任并更新 · x 卸载 · r 刷新 · ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),q&&l(E0,{marginTop:1,children:l(w0,{color:q.includes("失败")?"red":"cyan",children:q},void 0,!1,void 0,this)},void 0,!1,void 0,this),U&&l(w0,{color:"gray",children:"处理中..."},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import{Box as P$,Text as M$,useStdout as oQ}from"ink";import nQ from"ink-text-input";import jJ,{useCallback as t2,useMemo as tQ,useState as g1}from"react";import{jsxDEV as v0}from"react/jsx-dev-runtime";var sQ=jJ.memo(({option:$,index:J,isSelected:X,isMultiSelect:Y,isHighlighted:Z})=>v0(P$,{flexDirection:"column",marginBottom:1,children:[v0(M$,{color:Z?"yellow":X?"green":void 0,bold:Z,children:[Y?X?"(*) ":"( ) ":Z?"> ":" ",J+1,". ",$.label]},void 0,!0,void 0,this),v0(P$,{marginLeft:4,children:v0(M$,{color:"gray",children:$.description},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)),eQ=jJ.memo(({questions:$,answers:J})=>v0(P$,{flexDirection:"column",marginBottom:1,children:$.map((X)=>{let Y=J[X.header],Z=Array.isArray(Y)?Y.join(", "):Y||"(no answer)";return v0(P$,{marginBottom:1,children:[v0(M$,{backgroundColor:"blue",color:"white",children:[" ",X.header," "]},void 0,!0,void 0,this),v0(M$,{color:"green",children:[" ",Z]},void 0,!0,void 0,this)]},X.header,!0,void 0,this)})},void 0,!1,void 0,this)),m3=jJ.memo(({questions:$,onComplete:J,onCancel:X})=>{let{stdout:Y}=oQ(),Z=Y.columns||80,K=K$()==="confirmation-prompt",U=n0(!1),[G,q]=g1("answering"),[_,z]=g1(0),[O,W]=g1({}),[F,N]=g1(0),[w,R]=g1([]),[H,C]=g1(!1),[y,A]=g1(""),[B,b]=g1(0),L=$[_],D=tQ(()=>{if(!L)return[];return[...L.options.map((s)=>({label:s.label,value:s.label,description:s.description})),{label:"Type something...",value:"__other__",description:"Enter custom response"}]},[L]),T=t2((s)=>{let u={...O,[L.header]:s};if(W(u),_<$.length-1)z(_+1),N(0),R([]),C(!1),A("");else q("submit"),b(0)},[O,L?.header,_,$.length]),S=t2((s)=>{let u=D[s];if(!u)return;if(u.value==="__other__"){C(!0);return}if(L.multiSelect)R((_0)=>_0.includes(u.value)?_0.filter((m)=>m!==u.value):[..._0,u.value]);else T(u.value)},[D,L?.multiSelect,T]),P=t2((s)=>{if(s.trim())T(s.trim())},[T]),v=t2(()=>{q("answering"),z(0),N(0),R([]),C(!1)},[]),i=t2(()=>{J(O)},[O,J]);if(W0((s,u)=>{if(u.ctrl&&s==="c"||u.meta&&s==="c"){U();return}if(H){if(u.escape)C(!1),A("");return}if(u.escape){X();return}let _0=parseInt(s);if(_0>=1&&_0<=D.length){S(_0-1);return}if(u.upArrow){N((m)=>m>0?m-1:D.length-1);return}if(u.downArrow||u.tab){N((m)=>m<D.length-1?m+1:0);return}if(u.return){if(L.multiSelect&&w.length>0)T(w);else S(F);return}if(s===" "&&L.multiSelect){let m=D[F];if(m&&m.value!=="__other__")R((o)=>o.includes(m.value)?o.filter((f)=>f!==m.value):[...o,m.value]);return}},{isActive:K&&G==="answering"&&!H}),W0((s,u)=>{if(u.ctrl&&s==="c"||u.meta&&s==="c"){U();return}if(u.escape){X();return}if(u.upArrow||u.downArrow||u.tab){b((_0)=>_0===0?1:0);return}if(u.return){if(B===0)i();else v();return}if(s.toLowerCase()==="y"){i();return}if(s.toLowerCase()==="e"){v();return}},{isActive:K&&G==="submit"}),G==="submit")return v0(P$,{flexDirection:"column",borderStyle:"round",borderColor:K?"green":"gray",padding:1,width:Math.min(Z-4,80),children:[v0(P$,{marginBottom:1,children:v0(M$,{bold:!0,color:"green",children:"[OK] Review Your Answers"},void 0,!1,void 0,this)},void 0,!1,void 0,this),v0(eQ,{questions:$,answers:O},void 0,!1,void 0,this),v0(P$,{flexDirection:"column",marginTop:1,children:[v0(M$,{color:B===0?"yellow":void 0,bold:B===0,children:[B===0?"> ":" ","[Y] Submit answers"]},void 0,!0,void 0,this),v0(M$,{color:B===1?"yellow":void 0,bold:B===1,children:[B===1?"> ":" ","[E] Edit answers"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),v0(P$,{marginTop:1,children:v0(M$,{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(!L)return null;return v0(P$,{flexDirection:"column",borderStyle:"round",borderColor:K?"cyan":"gray",padding:1,width:Math.min(Z-4,80),children:[v0(P$,{marginBottom:1,children:[v0(M$,{backgroundColor:"blue",color:"white",children:[" ",L.header," "]},void 0,!0,void 0,this),v0(M$,{children:[" ",L.question]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),H?v0(P$,{flexDirection:"column",marginTop:1,children:[v0(M$,{color:"yellow",children:"Enter your response:"},void 0,!1,void 0,this),v0(P$,{marginTop:1,children:[v0(M$,{color:"cyan",children:"> "},void 0,!1,void 0,this),v0(nQ,{value:y,onChange:A,onSubmit:P,focus:K},void 0,!1,void 0,this)]},void 0,!0,void 0,this),v0(P$,{marginTop:1,children:v0(M$,{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(P$,{flexDirection:"column",children:D.map((s,u)=>v0(sQ,{option:s,index:u,isSelected:w.includes(s.value),isMultiSelect:L.multiSelect,isHighlighted:F===u},s.value,!1,void 0,this))},void 0,!1,void 0,this),!H&&v0(P$,{marginTop:1,flexDirection:"column",children:[v0(M$,{color:"gray",children:L.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),L.multiSelect&&w.length>0&&v0(M$,{color:"green",children:["Selected: ",w.join(", ")]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$.length>1&&v0(P$,{marginTop:1,children:v0(M$,{color:"gray",children:["Question ",_+1," of ",$.length]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{basename as $K}from"node:path";import{Box as I2,Text as d$}from"ink";import JK from"ink-select-input";import{useEffect as EJ,useMemo as C2,useRef as l3,useState as _4}from"react";function p3($){return`${$.projectPath}\x00${$.sessionId}`}function x3($){return $.title?.trim()||`Session ${$.sessionId.slice(0,8)}`}function c3($){return $.taskDelivery?` | delivery:${$.taskDelivery.status}`:""}function u3($,J){if(J!=="fork")return[...$];return $.filter((X)=>X.relationType!=="subagent")}function d3($){return{title:$==="fork"?"选择要 fork 的会话:":"选择要恢复的会话:",instructions:"(Left/Right to page | Up/Down to select | Enter to confirm | Esc to cancel)"}}import{jsxDEV as N$}from"react/jsx-dev-runtime";function YK($){let J=new Date($),Y=new Date().getTime()-J.getTime(),Z=Math.floor(Y/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()}`}function XK($){return $K($)}function ZK($){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"}}var QK=({isSelected:$})=>N$(I2,{marginRight:1,children:N$(d$,{color:$?"cyan":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),KK=({isSelected:$,label:J})=>N$(d$,{color:$?"cyan":"white",bold:$,children:J},void 0,!1,void 0,this),s2=20,r3=({intent:$,sessions:J,onSelect:X,onCancel:Y})=>{let[Z,Q]=_4([]),[K,U]=_4(!1),[G,q]=_4(0),[_,z]=_4(!1),O=l3(!1),W=l3(!0);EJ(()=>{return W.current=!0,()=>{W.current=!1}},[]);let N=K$()==="session-selector",w=n0(!1);W0((L,D)=>{if(D.ctrl&&L==="c"||D.meta&&L==="c"){w();return}if(O.current)return;if(D.escape&&Y){Y();return}if(D.leftArrow||L==="h"||L==="H"){if(G>0)q((T)=>T-1);return}if(D.rightArrow||L==="l"||L==="L"){if(G<y-1)q((T)=>T+1);return}},{isActive:N}),EJ(()=>{if(J){Q(J);return}(async()=>{U(!0);try{let D=await x0.listSessions({includeSubagents:!1});Q(D)}catch(D){console.error("[SessionSelector] Failed to load sessions:",D),Q([])}finally{U(!1)}})()},[J]);let R=C2(()=>u3(J||Z,$),[$,J,Z]),H=C2(()=>d3($),[$]),C=C2(()=>{return R.map((L)=>{let D=XK(L.taskSourceProjectPath??L.projectPath),T=YK(L.lastMessageTime),S=x3(L),P=`[${ZK(L.taskStatus)}]`,v=L.gitBranch?` (${L.gitBranch})`:"",i=L.hasErrors?" [!]":"",s=L.taskRetriedFrom?` ↻ retry:${L.taskRetriedFrom.sessionId.slice(0,6)}`:L.relationType==="subagent"?" ↳ subagent":L.relationType==="fork"?" ↳ fork":"",u=L.taskIsolation==="worktree"?` | wt:${L.taskWorktreeBranch??"managed"}`:L.taskIsolation==="local"?" | local":"",_0=L.taskDiffStat?` | ${L.taskDiffStat.changedFiles} files +${L.taskDiffStat.additions} -${L.taskDiffStat.deletions}`:"",m=L.taskStatus==="queued"&&L.taskQueuePosition?` | queue:${L.taskQueuePosition}/${L.taskQueueDepth??L.taskQueuePosition}`:"",o=c3(L);return{key:p3(L),label:`${P} ${S} · ${T} | ${D}${v} | ${L.messageCount} 条消息${u}${m}${_0}${o}${i}${s}`,value:L}})},[R]),y=C2(()=>Math.max(1,Math.ceil(C.length/s2)),[C.length]),A=C2(()=>{let L=G*s2;return C.slice(L,L+s2)},[C,G]),B=C2(()=>({start:G*s2+1,end:Math.min((G+1)*s2,C.length)}),[G,C.length]);EJ(()=>{q(0)},[R.length]);let b=(L)=>{if(O.current)return;O.current=!0,z(!0);let D=()=>{if(!W.current)return;O.current=!1,z(!1)};Promise.resolve().then(()=>X(L.value)).then(D,D)};if(K)return N$(I2,{flexDirection:"column",paddingX:2,paddingY:1,children:N$(d$,{children:"正在加载会话列表..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(R.length===0)return N$(I2,{flexDirection:"column",paddingX:2,paddingY:1,children:[N$(d$,{color:"yellow",children:"没有找到历史会话"},void 0,!1,void 0,this),N$(d$,{dimColor:!0,children:[`
|
|
158
|
-
`,"提示: 开始一次对话后,会话历史将保存到 ~/.blade/projects/"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this);return N$(I2,{flexDirection:"column",paddingX:2,paddingY:1,children:[N$(d$,{bold:!0,color:"cyan",children:H.title},void 0,!1,void 0,this),N$(d$,{dimColor:!0,children:[`
|
|
159
|
-
`,H.instructions,`
|
|
160
|
-
`]},void 0,!0,void 0,this),N$(JK,{items:A,onSelect:b,isFocused:N&&!_,indicatorComponent:QK,itemComponent:KK},void 0,!1,void 0,this),_&&N$(d$,{color:"cyan",children:$==="fork"?"Forking…":"Resuming…"},void 0,!1,void 0,this),N$(I2,{marginTop:1,flexDirection:"column",children:[N$(d$,{dimColor:!0,children:["第 ",G+1,"/",y," 页 · 共 ",R.length," 个会话 · 显示"," ",B.start,"-",B.end]},void 0,!0,void 0,this),y>1&&N$(I2,{marginTop:1,children:[N$(d$,{color:G>0?"cyan":"gray",children:G>0?"<< 上一页":" "},void 0,!1,void 0,this),N$(d$,{children:" "},void 0,!1,void 0,this),N$(d$,{color:G<y-1?"cyan":"gray",children:G<y-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 a3,Text as e2}from"ink";import UK,{useEffect as GK,useState as qK}from"react";import{jsxDEV as m1}from"react/jsx-dev-runtime";var i3=["|","/","-","\\"],hJ=UK.memo(()=>{let $=K8(),J=k0(),X=H2(),[Y,Z]=qK(0);if(GK(()=>{if($?.status!=="loading"){Z(0);return}let Q=setInterval(()=>{Z((K)=>(K+1)%i3.length)},100);return()=>clearInterval(Q)},[$?.status]),!$)return null;return m1(a3,{flexDirection:"column",borderStyle:"single",borderColor:J.colors.info,marginX:2,marginBottom:1,paddingX:1,children:[m1(a3,{children:[m1(e2,{bold:!0,color:J.colors.info,children:"BTW"},void 0,!1,void 0,this),m1(e2,{color:J.colors.muted,children:[" | ",$.question]},void 0,!0,void 0,this),$.durationMs!==void 0&&m1(e2,{color:J.colors.muted,dimColor:!0,children:[" ","| ",$.durationMs,"ms"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$.status==="loading"&&m1(e2,{color:J.colors.text.secondary,children:[i3[Y]," Answering..."]},void 0,!0,void 0,this),$.status==="error"&&m1(e2,{color:J.colors.error,children:$.error??"Side conversation failed"},void 0,!1,void 0,this),$.status==="completed"&&$.response&&m1(Z1,{content:$.response,role:"assistant",terminalWidth:Math.max(20,X-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 q$,Text as l0}from"ink";import{jsxDEV as L0}from"react/jsx-dev-runtime";function n3({onCancel:$}){let J=Y1(),X=K$()==="skills-manager",Z=o3({cwd:J}).getAll(),Q=Z.filter((q)=>q.source==="builtin"),K=Z.filter((q)=>q.source==="user"),U=Z.filter((q)=>q.source==="project"),G=n0(!1,$);if(W0((q,_)=>{if(_.escape)$?.();else if(_.ctrl&&q==="c"||_.meta&&q==="c")G()},{isActive:X}),Z.length===0)return L0(q$,{flexDirection:"column",paddingY:1,children:[L0(q$,{marginBottom:1,children:L0(l0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this)},void 0,!1,void 0,this),L0(q$,{paddingLeft:2,children:L0(l0,{color:"gray",children:"没有找到任何 Skill"},void 0,!1,void 0,this)},void 0,!1,void 0,this),L0(q$,{marginTop:1,paddingLeft:2,children:L0(l0,{color:"gray",children:"配置文件位置: ~/.blade/skills/ 或 .blade/skills/"},void 0,!1,void 0,this)},void 0,!1,void 0,this),L0(q$,{marginTop:1,children:L0(l0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return L0(q$,{flexDirection:"column",paddingY:1,children:[L0(q$,{marginBottom:1,children:[L0(l0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this),L0(l0,{color:"gray",children:[" (找到 ",Z.length," 个)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),U.length>0&&L0(q$,{flexDirection:"column",marginBottom:1,children:[L0(q$,{paddingLeft:1,children:[L0(l0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),L0(l0,{color:"gray",children:" (.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),U.map((q)=>{let z=q.description.length>80?`${q.description.substring(0,80)}...`:q.description;return L0(q$,{flexDirection:"column",paddingLeft:2,children:[L0(l0,{children:[L0(l0,{bold:!0,color:"green",children:["• ",q.name]},void 0,!0,void 0,this),L0(l0,{color:"gray",children:[" - ",z]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),q.allowedTools&&q.allowedTools.length>0&&L0(q$,{paddingLeft:2,children:L0(l0,{color:"gray",children:["工具: ",q.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),L0(q$,{paddingLeft:2,children:L0(l0,{color:"gray",dimColor:!0,children:q.path},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},q.name,!0,void 0,this)})]},void 0,!0,void 0,this),K.length>0&&L0(q$,{flexDirection:"column",marginBottom:1,children:[L0(q$,{paddingLeft:1,children:[L0(l0,{bold:!0,color:"yellow",children:"用户级"},void 0,!1,void 0,this),L0(l0,{color:"gray",children:" (~/.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),K.map((q)=>{let z=q.description.length>80?`${q.description.substring(0,80)}...`:q.description;return L0(q$,{flexDirection:"column",paddingLeft:2,children:[L0(l0,{children:[L0(l0,{bold:!0,color:"green",children:["• ",q.name]},void 0,!0,void 0,this),L0(l0,{color:"gray",children:[" - ",z]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),q.allowedTools&&q.allowedTools.length>0&&L0(q$,{paddingLeft:2,children:L0(l0,{color:"gray",children:["工具: ",q.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),L0(q$,{paddingLeft:2,children:L0(l0,{color:"gray",dimColor:!0,children:q.path},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},q.name,!0,void 0,this)})]},void 0,!0,void 0,this),Q.length>0&&L0(q$,{flexDirection:"column",marginBottom:1,children:[L0(q$,{paddingLeft:1,children:[L0(l0,{bold:!0,color:"cyan",children:"内置"},void 0,!1,void 0,this),L0(l0,{color:"gray",children:" (builtin)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q.map((q)=>{let z=q.description.length>80?`${q.description.substring(0,80)}...`:q.description;return L0(q$,{flexDirection:"column",paddingLeft:2,children:[L0(l0,{children:[L0(l0,{bold:!0,color:"green",children:["• ",q.name]},void 0,!0,void 0,this),L0(l0,{color:"gray",children:[" - ",z]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),q.userInvocable&&L0(q$,{paddingLeft:2,children:L0(l0,{color:"blue",children:["命令: /",q.name]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},q.name,!0,void 0,this)})]},void 0,!0,void 0,this),L0(q$,{marginTop:1,children:L0(l0,{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 t3,Text as s$}from"ink";import zK,{useEffect as OK,useMemo as _K,useState as s3}from"react";import{jsxDEV as y$,Fragment as gJ}from"react/jsx-dev-runtime";var e3=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"];function NK($){let J=Math.floor($/1000);if(J<60)return`${J}s`;let X=Math.floor(J/60),Y=J%60;return`${X}m ${Y}s`}var $X=zK.memo(()=>{let $=U0((q)=>q.app.subagentProgresses),J=U0((q)=>q.app.subagentProgress),X=k0(),[Y,Z]=s3(0),[Q,K]=s3(()=>Date.now()),U=_K(()=>{let q=Object.values($);return q.length>0?q:J?[J]:[]},[J,$]),G=U.some((q)=>q.status==="running");if(OK(()=>{if(!G){Z(0);return}let q=setInterval(()=>{Z((z)=>(z+1)%e3.length)},80),_=setInterval(()=>{K(Date.now())},1000);return()=>{clearInterval(q),clearInterval(_)}},[G]),U.length===0)return null;return y$(t3,{paddingX:2,paddingY:0,flexDirection:"column",children:U.map((q)=>{let _=q.status==="running"?e3[Y]:q.status==="completed"?"[OK]":"[X]",z=q.status==="running"?X.colors.info:q.status==="completed"?X.colors.success:X.colors.error,O=Math.max(0,Q-q.startTime);return y$(t3,{flexDirection:"row",gap:1,children:[y$(s$,{color:z,bold:!0,children:_},void 0,!1,void 0,this),y$(s$,{color:X.colors.muted,children:"Subagent"},void 0,!1,void 0,this),y$(s$,{color:X.colors.text.primary,bold:!0,children:q.type},void 0,!1,void 0,this),y$(s$,{color:X.colors.muted,children:"|"},void 0,!1,void 0,this),y$(s$,{color:X.colors.text.secondary,children:q.description},void 0,!1,void 0,this),q.currentTool&&y$(gJ,{children:[y$(s$,{color:X.colors.muted,children:"|"},void 0,!1,void 0,this),y$(s$,{color:X.colors.warning,children:q.currentTool},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.status==="running"&&O>0&&y$(gJ,{children:[y$(s$,{color:X.colors.muted,children:"|"},void 0,!1,void 0,this),y$(s$,{color:X.colors.info,children:NK(O)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.status==="failed"&&q.terminalSummary&&y$(gJ,{children:[y$(s$,{color:X.colors.muted,children:"|"},void 0,!1,void 0,this),y$(s$,{color:X.colors.error,children:q.terminalSummary},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},q.id,!0,void 0,this)})},void 0,!1,void 0,this)});import{Box as S2,Text as b1}from"ink";import HK from"react";import{jsxDEV as S$}from"react/jsx-dev-runtime";var mJ={idle:"-",running:">",completed:"[OK]",failed:"[X]",deleted:"[X]",leader:"*",cancelled:"[X]",unknown:"?",pending:"-",blocked:"x"},pJ=HK.memo(()=>{let $=q9().filter((X)=>X.status!=="deleted"),J=k0();if($.length===0)return null;return S$(S2,{flexDirection:"column",paddingX:2,children:$.map((X)=>{let Y=X.tasks.filter((Z)=>Z.status==="completed").length;return S$(S2,{flexDirection:"column",marginBottom:1,children:[S$(S2,{gap:1,children:[S$(b1,{bold:!0,color:X.status==="failed"?J.colors.error:X.status==="completed"?J.colors.success:J.colors.info,children:[mJ[X.status]," Team"]},void 0,!0,void 0,this),S$(b1,{bold:!0,color:J.colors.text.primary,children:X.name},void 0,!1,void 0,this),S$(b1,{color:J.colors.muted,children:["| ",X.members.length-1," members | ",Y,"/",X.tasks.length," ","tasks"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),S$(S2,{flexDirection:"column",paddingLeft:2,children:[X.members.filter((Z)=>Z.status!=="leader").map((Z)=>S$(S2,{gap:1,children:[S$(b1,{color:J.colors.muted,children:mJ[Z.status]},void 0,!1,void 0,this),S$(b1,{color:J.colors.text.secondary,children:Z.name},void 0,!1,void 0,this),S$(b1,{color:J.colors.muted,children:["(",Z.subagentType,", ",Z.status,Z.worktreePath?", worktree":"",")"]},void 0,!0,void 0,this)]},Z.id,!0,void 0,this)),X.tasks.map((Z)=>S$(S2,{gap:1,children:[S$(b1,{color:J.colors.muted,children:mJ[Z.status]},void 0,!1,void 0,this),S$(b1,{color:J.colors.text.secondary,children:["#",Z.id," ",Z.subject]},void 0,!0,void 0,this),S$(b1,{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)]},X.name,!0,void 0,this)})},void 0,!1,void 0,this)});pJ.displayName="TeamProgress";import{useMemoizedFn as WK}from"ahooks";import{Box as K1,Text as J0}from"ink";import FK from"ink-select-input";import{useState as JX}from"react";import{jsxDEV as r}from"react/jsx-dev-runtime";var YX=Y2.map(($)=>({label:$.label,value:$.id})),LK=({theme:$})=>{let{colors:J}=$;return r(K1,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[r(J0,{bold:!0,color:J.text.primary,children:"代码预览"},void 0,!1,void 0,this),r(J0,{children:" "},void 0,!1,void 0,this),r(J0,{color:J.syntax.comment,children:"# function"},void 0,!1,void 0,this),r(J0,{children:[r(J0,{color:J.syntax.keyword,children:"def"},void 0,!1,void 0,this)," ",r(J0,{color:J.syntax.function,children:"fibonacci"},void 0,!1,void 0,this),r(J0,{color:J.text.primary,children:"("},void 0,!1,void 0,this),r(J0,{color:J.syntax.variable,children:"n"},void 0,!1,void 0,this),r(J0,{color:J.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),r(J0,{children:[" ",r(J0,{color:J.syntax.variable,children:"a"},void 0,!1,void 0,this),r(J0,{color:J.syntax.operator,children:","},void 0,!1,void 0,this)," ",r(J0,{color:J.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",r(J0,{color:J.syntax.operator,children:"="},void 0,!1,void 0,this)," ",r(J0,{color:J.syntax.number,children:"0"},void 0,!1,void 0,this),r(J0,{color:J.syntax.operator,children:","},void 0,!1,void 0,this)," ",r(J0,{color:J.syntax.number,children:"1"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),r(J0,{children:[" ",r(J0,{color:J.syntax.keyword,children:"for"},void 0,!1,void 0,this)," ",r(J0,{color:J.syntax.variable,children:"_"},void 0,!1,void 0,this)," ",r(J0,{color:J.syntax.keyword,children:"in"},void 0,!1,void 0,this)," ",r(J0,{color:J.syntax.function,children:"range"},void 0,!1,void 0,this),r(J0,{color:J.text.primary,children:"("},void 0,!1,void 0,this),r(J0,{color:J.syntax.variable,children:"n"},void 0,!1,void 0,this),r(J0,{color:J.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),r(J0,{children:[" ",r(J0,{color:J.syntax.variable,children:"a"},void 0,!1,void 0,this),r(J0,{color:J.syntax.operator,children:","},void 0,!1,void 0,this)," ",r(J0,{color:J.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",r(J0,{color:J.syntax.operator,children:"="},void 0,!1,void 0,this)," ",r(J0,{color:J.syntax.variable,children:"b"},void 0,!1,void 0,this),r(J0,{color:J.syntax.operator,children:","},void 0,!1,void 0,this)," ",r(J0,{color:J.syntax.variable,children:"a"},void 0,!1,void 0,this)," ",r(J0,{color:J.syntax.operator,children:"+"},void 0,!1,void 0,this)," ",r(J0,{color:J.syntax.variable,children:"b"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),r(J0,{children:[" ",r(J0,{color:J.syntax.keyword,children:"return"},void 0,!1,void 0,this)," ",r(J0,{color:J.syntax.variable,children:"a"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),r(J0,{children:" "},void 0,!1,void 0,this),r(J0,{color:J.error,children:["- print(",r(J0,{color:J.syntax.string,children:'"Hello, "'},void 0,!1,void 0,this)," + name)"]},void 0,!0,void 0,this),r(J0,{color:J.success,children:["+ print(",r(J0,{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)},wK=({theme:$})=>{let{colors:J}=$;return r(K1,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[r(J0,{children:" "},void 0,!1,void 0,this),r(J0,{bold:!0,color:J.text.primary,children:"颜色配置"},void 0,!1,void 0,this),r(J0,{children:" "},void 0,!1,void 0,this),r(J0,{children:[r(J0,{color:J.text.muted,children:"Primary: "},void 0,!1,void 0,this),r(J0,{color:J.primary,children:J.primary},void 0,!1,void 0,this)]},void 0,!0,void 0,this),r(J0,{children:[r(J0,{color:J.text.muted,children:"Success: "},void 0,!1,void 0,this),r(J0,{color:J.success,children:J.success},void 0,!1,void 0,this)]},void 0,!0,void 0,this),r(J0,{children:[r(J0,{color:J.text.muted,children:"Error: "},void 0,!1,void 0,this),r(J0,{color:J.error,children:J.error},void 0,!1,void 0,this)]},void 0,!0,void 0,this),r(J0,{children:[r(J0,{color:J.text.muted,children:"Warning: "},void 0,!1,void 0,this),r(J0,{color:J.warning,children:J.warning},void 0,!1,void 0,this)]},void 0,!0,void 0,this),r(J0,{children:[r(J0,{color:J.text.muted,children:"Info: "},void 0,!1,void 0,this),r(J0,{color:J.info,children:J.info},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},XX=()=>{let $=I1(),J=W$.getCurrentThemeName(),X=Y2.findIndex((F)=>F.label===J),Y=X>=0?Y2[X].theme:Y2[0].theme,[Z,Q]=JX(Y),[K,U]=JX(!1),G=WK(async(F)=>{if(K)return;U(!0);try{await G$().setTheme(F.value),$.closeModal()}catch(N){console.error("主题切换失败:",N instanceof Error?N.message:N)}finally{U(!1)}}),q=(F)=>{let N=Y2.find((w)=>w.id===F.value);if(N)Q(N.theme)},z=K$()==="theme-selector",O=n0(!1);W0((F,N)=>{if(N.ctrl&&F==="c"||N.meta&&F==="c"){O();return}if(N.escape&&!K)$.closeModal()},{isActive:z});let W=(F)=>{let{isSelected:N,label:w}=F,H=w===J?"[OK]":" ";return r(J0,{color:N?Z.colors.primary:Z.colors.text.primary,children:[H," ",w]},void 0,!0,void 0,this)};return r(K1,{flexDirection:"column",height:"100%",children:[r(K1,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:Z.colors.border.light,children:r(J0,{bold:!0,color:Z.colors.primary,children:"主题选择器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),r(K1,{flexDirection:"row",flexGrow:1,children:[r(K1,{width:"40%",borderStyle:"single",borderColor:Z.colors.border.light,paddingX:1,children:r(K1,{flexDirection:"column",children:[r(K1,{paddingTop:1,paddingBottom:1,children:r(J0,{bold:!0,color:Z.colors.text.primary,children:["可用主题 (",YX.length,")"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),r(FK,{items:YX,initialIndex:X>=0?X:0,onSelect:G,onHighlight:q,itemComponent:W},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),r(K1,{width:"60%",flexDirection:"column",borderStyle:"single",borderColor:Z.colors.border.light,children:[r(LK,{theme:Z},void 0,!1,void 0,this),r(wK,{theme:Z},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),r(K1,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:Z.colors.border.light,children:r(J0,{color:Z.colors.text.muted,children:K?"正在保存...":"Enter: 选择主题 | Esc: 取消"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{Box as H4,Text as G1,useStdout as RK}from"ink";import CK,{useCallback as P1,useEffect as X2,useMemo as uJ,useRef as v$,useState as U1}from"react";function BK($,J){return[...$,J].join(`
|
|
161
|
-
`).replace(/\n+$/,"")}function k2($){let J=2166136261;for(let X=0;X<$.length;X++)J^=$.charCodeAt(X),J=Math.imul(J,16777619);return`${$.length}:${(J>>>0).toString(16)}`}function KX({messages:$,currentStreamingMessageId:J,streamingLines:X,streamingTail:Y,currentThinkingContent:Z,pendingCommands:Q}){let K=BK(X,Y),U=[];for(let G of $){let q=G.id===J?K:G.content,_=G.metadata&&"phase"in G.metadata?String(G.metadata.phase):"",z=G.id===J?Z??G.thinkingContent:G.thinkingContent;if(G.role==="assistant"&&z)U.push({id:`${G.id}:thinking`,messageId:G.id,role:"assistant",kind:"thinking",content:z,revision:`${G.timestamp}:thinking:${k2(z)}`,collapsible:!0});let O=G.role==="tool"&&G.metadata&&"detail"in G.metadata&&typeof G.metadata.detail==="string"&&G.metadata.detail.length>0?G.metadata.detail:void 0;U.push({id:G.id,messageId:G.id,role:G.role,kind:G.role==="tool"?"tool":"message",content:q,detail:O,revision:`${G.timestamp}:${k2(q)}:${k2(O??"")}:${_}`,collapsible:O!==void 0})}if(J&&!U.some((G)=>G.id===J)){if(Z)U.push({id:`${J}:thinking`,messageId:J,role:"assistant",kind:"thinking",content:Z,revision:`stream:thinking:${k2(Z)}`,collapsible:!0});U.push({id:J,messageId:J,role:"assistant",kind:"message",content:K,revision:`stream:${k2(K)}`,collapsible:!1})}for(let[G,q]of Q.entries())U.push({id:`pending:${G}:${q.displayText}`,messageId:`pending:${G}`,role:"user",kind:"message",content:q.displayText,revision:`pending:${k2(q.displayText)}`,pending:!0,collapsible:!1});return U}var ZX={user:"> ",assistant:"• ",system:" ",tool:"└ "};function N4($,J,X){let Y=J.text.length>0?J.text.split(`
|
|
162
|
-
`):[""],Z=[];for(let[Q,K]of Y.entries()){let U=Z.length===0?J.firstPrefix:J.nextPrefix,G=Math.max(1,X-U.length),q=w2(K,G,!0),_=0;for(let z of q){let O=z.length>0?K.indexOf(z,_):_,W=O>=0?O:_,F=W+z.length,N=Z.length===0?J.firstPrefix:J.nextPrefix;Z.push({key:`${$.id}:${J.key}:${Q}:${Z.length}`,blockId:$.id,role:$.role,kind:$.kind,text:`${N}${z}`,copyText:z,pending:$.pending===!0,header:J.header&&Z.length===0,sourceLine:J.sourceLineOffset+Q,sourceStart:W,sourceEnd:F,sourceTextOffset:N.length}),_=F}}return Z}function QX($){return $.length===0?0:$.split(`
|
|
163
|
-
`).length}function AK($){let J=$.split(`
|
|
164
|
-
`)[0]?.trim()??"";if(J.length<=48)return J;return`${J.slice(0,45)}...`}function UX($,J,X=!1){if($.kind==="thinking"){let Y=X?"[-]":"[+]",Z=AK($.content),Q=`${Y} Thinking (${QX($.content)} lines)${!X&&Z?` - ${Z}`:""}`,K={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(!X)return[K];return[K,...N4($,{text:$.content,firstPrefix:" ",nextPrefix:" ",sourceLineOffset:0,key:"thinking",header:!1},J)]}if($.kind==="tool"&&$.detail){let Y=X?"[-]":"[+]",Z=N4($,{text:$.content,firstPrefix:`${ZX.tool}${Y} `,nextPrefix:" ",sourceLineOffset:0,key:"summary",header:!0},J);if(!X)return Z;return[...Z,...N4($,{text:$.detail,firstPrefix:" ",nextPrefix:" ",sourceLineOffset:QX($.content),key:"detail",header:!1},J)]}return N4($,{text:$.content.length>0?$.content:"…",firstPrefix:ZX[$.role],nextPrefix:" ",sourceLineOffset:0,key:"content",header:!0},J)}function bK($){if($.kind==="tool"&&$.detail)return[...$.content.split(`
|
|
165
|
-
`),...$.detail.split(`
|
|
166
|
-
`)];return $.content.split(`
|
|
167
|
-
`)}function PK($,J){let X=[];for(let[Y,Z]of bK($).entries())for(let Q of Z.matchAll(J)){let K=Q.index,U=Q[0];if(U.length===0)continue;X.push({blockId:$.id,sourceLine:Y,start:K,end:K+U.length})}return X}class xJ{cache=new Map;search($,J){if(J.length===0)return[];let X=J.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),Y=new RegExp(X,"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 K=this.cache.get(Q.id);if(K?.revision===Q.revision&&K.query===J)return K.matches;let U=PK(Q,Y);return this.cache.set(Q.id,{revision:Q.revision,query:J,matches:U}),U})}}function cJ($,J){let X=$.findIndex((Y)=>Y.blockId===J.blockId&&Y.sourceLine===J.sourceLine&&J.start>=Y.sourceStart&&J.start<Math.max(Y.sourceEnd,Y.sourceStart+1));if(X>=0)return X;return $.findIndex((Y)=>Y.blockId===J.blockId)}function GX($,J){if($.sourceLine===null||$.sourceEnd<=$.sourceStart)return[];let X=[];for(let[Y,Z]of J.entries()){if(Z.blockId!==$.blockId||Z.sourceLine!==$.sourceLine||Z.end<=$.sourceStart||Z.start>=$.sourceEnd)continue;X.push({start:$.sourceTextOffset+Math.max($.sourceStart,Z.start)-$.sourceStart,end:$.sourceTextOffset+Math.min($.sourceEnd,Z.end)-$.sourceStart,matchIndex:Y})}return X}function qX($,J,X){let Y=Math.max(0,Math.min(J,X)),Z=Math.min($.length-1,Math.max(J,X));if(Z<Y)return"";let Q=$.slice(Y,Z+1),K="";for(let[U,G]of Q.entries()){if(U===0){K=G.copyText;continue}let q=Q[U-1],_=G.sourceLine!==null&&G.blockId===q.blockId&&G.sourceLine===q.sourceLine;K+=`${_?"":`
|
|
168
|
-
`}${G.copyText}`}return K}function zX($,J){let X=new Map($.map((Y)=>[Y.id,Y.revision]));return J.filter((Y)=>X.get(Y.id)!==Y.revision).map((Y)=>Y.id)}import{spawn as MK}from"node:child_process";function yK($){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 TK($,J,X){return new Promise((Y)=>{let Z=!1,Q=MK($,[...J],{stdio:["pipe","ignore","ignore"]}),K=setTimeout(()=>{if(Z)return;Z=!0,Q.kill("SIGKILL"),Y(!1)},2000),U=(G)=>{if(Z)return;Z=!0,clearTimeout(K),Y(G)};Q.once("error",()=>U(!1)),Q.once("close",(G)=>U(G===0)),Q.stdin.once("error",()=>U(!1)),Q.stdin.end(X)})}function OX($,J=!1){let X=`\x1B]52;c;${Buffer.from($,"utf8").toString("base64")}\x07`;if(!J)return X;return`\x1BPtmux;${X.replaceAll("\x1B","\x1B\x1B")}\x1B\\`}async function _X($,J={}){if($.length===0)return{success:!1};let X=J.platform??process.platform,Y=J.env??process.env,Z=J.runCommand??TK,Q=J.writeTerminal??((G)=>process.stdout.write(G)),K=Boolean(Y.SSH_CONNECTION),U=async(G)=>{try{return await Z(G.command,G.args,$)}catch{return!1}};if(!K){for(let G of yK(X))if(await U(G))return{success:!0,method:"native"}}if(Y.TMUX){if(await U({command:"tmux",args:["load-buffer","-w","-"]})){try{Q(OX($,!0))}catch{}return{success:!0,method:"tmux"}}}try{return Q(OX($)),{success:!0,method:"osc52"}}catch{return{success:!1}}}import{jsxDEV as T$}from"react/jsx-dev-runtime";function NX($,J){let X=Array.from($.value);return{...$,cursor:Math.max(0,Math.min(X.length,$.cursor+J))}}function IK($,J,X){let Y=Array.from($.value);if(X.leftArrow)return NX($,-1);if(X.rightArrow)return NX($,1);if(X.home)return{...$,cursor:0};if(X.end)return{...$,cursor:Y.length};if(X.backspace&&$.cursor>0)return Y.splice($.cursor-1,1),{value:Y.join(""),cursor:$.cursor-1};if(X.delete&&$.cursor<Y.length)return Y.splice($.cursor,1),{value:Y.join(""),cursor:$.cursor};if(X.ctrl&&J.toLowerCase()==="u")return{value:"",cursor:0};if(X.ctrl||X.meta||J.length===0)return $;let Z=J.replace(/[\r\n\t]+/g," ");if(Z.length===0)return $;let Q=Array.from(Z);return Y.splice($.cursor,0,...Q),{value:Y.join(""),cursor:$.cursor+Q.length}}function SK({editor:$}){let J=Array.from($.value),X=J.slice(0,$.cursor).join(""),Y=J[$.cursor]??" ",Z=J.slice($.cursor+1).join("");return T$(G1,{wrap:"truncate-end",children:["/",X,T$(G1,{inverse:!0,children:Y},void 0,!1,void 0,this),Z,T$(G1,{dimColor:!0,children:" · Enter search · Esc cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}function kK({line:$,matches:J,currentMatchIndex:X,selected:Y,selectedBlock:Z,color:Q,highlightColor:K}){let U=GX($,J);if(Y||U.length===0)return T$(G1,{wrap:"truncate-end",color:Q,inverse:Y,bold:Z,underline:Z,children:$.text||" "},void 0,!1,void 0,this);let G=[],q=0;for(let _ of U){if(_.start>q)G.push($.text.slice(q,_.start));G.push(T$(G1,{color:K,bold:!0,inverse:_.matchIndex===X,children:$.text.slice(_.start,_.end)},`${$.key}:match:${_.matchIndex}`,!1,void 0,this)),q=_.end}if(q<$.text.length)G.push($.text.slice(q));return T$(G1,{wrap:"truncate-end",color:Q,bold:Z,underline:Z,children:G},void 0,!1,void 0,this)}var HX=CK.memo(({isOpen:$,onClose:J,compact:X=!1})=>{let Y=Z8(),Z=F8(),Q=W8(),K=L8(),U=q2(),G=K$(),q=k0(),{stdout:_}=RK(),{width:z,height:O}=E8(),W=X?Math.max(6,Math.floor(O*0.4)):O,F=Math.max(1,W-3),N=Math.max(12,z-4),w=v$(new Map),R=v$(new xJ),[H,C]=U1(new Set),y=v$(H);y.current=H;let A=uJ(()=>KX({messages:Y,currentStreamingMessageId:Z,streamingLines:K.lines,streamingTail:K.tail,currentThinkingContent:Q,pendingCommands:U}),[Y,Z,K.lines,K.tail,Q,U]),B=uJ(()=>{let g=new Set(A.map((h)=>h.id));for(let h of w.current.keys())if(!g.has(h))w.current.delete(h);return A.flatMap((h,I)=>{let p=H.has(h.id),q0=w.current.get(h.id),c0=q0?.revision===h.revision&&q0.width===N&&q0.expanded===p?q0.lines:UX(h,N,p);if(c0!==q0?.lines)w.current.set(h.id,{revision:h.revision,width:N,expanded:p,lines:c0});if(I===A.length-1)return c0;return[...c0,{key:`${h.id}:separator`,blockId:h.id,role:h.role,kind:h.kind,text:"",copyText:"",pending:h.pending===!0,header:!1,sourceLine:null,sourceStart:0,sourceEnd:0,sourceTextOffset:0}]})},[A,N,H]),[b,L]=U1(0),[D,T]=U1(new Set),[S,P]=U1(null),v=v$(null),[i,s]=U1(!1),u=v$(!1),[_0,m]=U1({value:"",cursor:0}),o=v$(_0),[f,a]=U1(""),[e,Z0]=U1(0),V=v$(0),[Y0,t]=U1(null),M=v$(null),[k,E]=U1(null),x=v$(0),n=v$(null),H0=v$(0),y0=v$(A),j0=v$(B.length),z0=v$(N);H0.current=b,v.current=S,u.current=i,o.current=_0,V.current=e,M.current=Y0;let A0=uJ(()=>R.current.search(A,f),[A,f]),O0=Math.max(0,B.length-F),r0=Math.max(0,B.length-b),S0=Math.max(0,r0-F),a0=P1((g)=>{let h=Math.max(0,Math.min(O0,g));if(H0.current=h,L(h),h===0)T(new Set)},[O0]),p0=P1((g)=>{if(B.length===0)return;let h=Math.max(0,Math.min(B.length-1,g)),I=Math.max(0,Math.min(B.length-F,h-Math.floor(F/2))),p=Math.min(B.length,I+F);a0(B.length-p)},[B.length,a0,F]),A$=P1((g,h,I)=>{let p=new Set(y.current);if(h)p.add(g);else p.delete(g);y.current=p,n.current=I,C(p)},[]),i0=P1((g)=>{let h=A.find((p)=>p.id===g.blockId);if(h?.collapsible&&!y.current.has(h.id)){A$(h.id,!0,{blockId:h.id,match:g});return}let I=cJ(B,g);if(I>=0)p0(I)},[A,B,p0,A$]),H$=P1((g,h=A0)=>{if(h.length===0){V.current=0,Z0(0);return}let I=(g%h.length+h.length)%h.length;V.current=I,Z0(I);let p=h[I];v.current=p.blockId,P(p.blockId),i0(p)},[A0,i0]),e0=P1((g)=>{let h=A.filter((Z$)=>Z$.collapsible);if(h.length===0)return;let I=h.findIndex((Z$)=>Z$.id===v.current),p=I<0?g>0?0:h.length-1:(I+g+h.length)%h.length,q0=h[p].id;v.current=q0,P(q0);let c0=B.findIndex((Z$)=>Z$.blockId===q0&&Z$.header);if(c0>=0)p0(c0)},[A,B,p0]),c1=P1(()=>{let g=v.current;if(!g)g=B.slice(S0,r0).find((I)=>A.some((p)=>p.id===I.blockId&&p.collapsible))?.blockId??null;if(!g)return;if(!A.find((I)=>I.id===g)?.collapsible)return;v.current=g,P(g),A$(g,!y.current.has(g),{blockId:g})},[A,r0,B,A$,S0]),h$=P1((g,h)=>{let I=M.current;if(!I||B.length===0)return;let p=h==="top"?0:h==="bottom"?B.length-1:Math.max(0,Math.min(B.length-1,I.head+g)),q0={...I,head:p};M.current=q0,t(q0),p0(p)},[B.length,p0]),O$=P1(()=>{let g=M.current;if(!g)return;let h=qX(B,g.anchor,g.head);if(!h.trim()){E("Nothing selected");return}let I=++x.current;E("Copying..."),_X(h,{writeTerminal:(p)=>_.write(p)}).then((p)=>{if(x.current!==I)return;E(p.success?p.method==="osc52"?"Copy sent via OSC 52":`Copied ${h.split(`
|
|
169
|
-
`).length} lines`:"Copy failed"),M.current=null,t(null)})},[B,_]);X2(()=>{if(!k)return;let g=setTimeout(()=>E(null),2500);return()=>clearTimeout(g)},[k]),X2(()=>{if(!$){x.current++,y0.current=A,j0.current=B.length;return}y.current=new Set,C(new Set),v.current=null,P(null),u.current=!1,s(!1),o.current={value:"",cursor:0},m({value:"",cursor:0}),a(""),V.current=0,Z0(0),M.current=null,t(null),E(null),H0.current=0,L(0),T(new Set),y0.current=A,j0.current=B.length,z0.current=N},[$]),X2(()=>{let g=new Set(A.map((h)=>h.id));if(C((h)=>{let I=new Set([...h].filter((q0)=>g.has(q0)));return y.current=I,I.size===h.size&&[...I].every((q0)=>h.has(q0))?h:I}),v.current&&!g.has(v.current))v.current=null,P(null)},[A]),X2(()=>{let g=j0.current;if(j0.current=B.length,!$)return;let h=n.current;if(h){n.current=null;let p=h.match?cJ(B,h.match):B.findIndex((q0)=>q0.blockId===h.blockId&&q0.header);if(p>=0)p0(p);return}if(H0.current===0){T(new Set);return}let I=Math.max(0,B.length-g);if(I>0)L((p)=>{let q0=Math.min(O0,p+I);return H0.current=q0,q0});else if(H0.current>O0)H0.current=O0,L(O0)},[N,H,$,B.length,O0,p0]),X2(()=>{let g=y0.current;if(y0.current=A,!$||H0.current===0)return;let h=zX(g,A);if(h.length===0)return;T((I)=>{let p=new Set(I);for(let q0 of h)p.add(q0);return p})},[A,$]),X2(()=>{if(A0.length===0)V.current=0,Z0(0);else if(V.current>=A0.length)V.current=A0.length-1,Z0(A0.length-1)},[A0.length]),X2(()=>{if(z0.current===N)return;z0.current=N,M.current=null,t(null);let g=A0[V.current];if(g)i0(g)},[N,A0,i0]),W0((g,h)=>{if(!$)return;let I=h,p=G==="transcript-pager";if((I.ctrl||I.meta)&&g.toLowerCase()==="o")return J(),!0;if(!p){if(I.pageUp)return a0(H0.current+Math.max(1,F-1)),!0;if(I.pageDown)return a0(H0.current-Math.max(1,F-1)),!0;return!1}if(u.current){if(I.escape)return u.current=!1,s(!1),o.current={value:f,cursor:Array.from(f).length},m(o.current),!0;if(I.return){let c0=o.current.value,Z$=R.current.search(A,c0);return a(c0),u.current=!1,s(!1),H$(0,Z$),!0}let q0=IK(o.current,g,I);return o.current=q0,m(q0),!0}if(g==="q")return J(),!0;if(M.current){if(I.escape)return M.current=null,t(null),!0;if(g==="y"||I.ctrl&&!I.meta&&g.toLowerCase()==="c")return O$(),!0;if(I.upArrow||g==="k")return h$(-1),!0;if(I.downArrow||g==="j")return h$(1),!0;if(I.pageUp)return h$(-Math.max(1,F-1)),!0;if(I.pageDown)return h$(Math.max(1,F-1)),!0;if(I.home||g==="g")return h$(0,"top"),!0;if(I.end||g==="G")return h$(0,"bottom"),!0;return!0}if(I.escape)return J(),!0;if(g==="/"){let q0={value:f,cursor:Array.from(f).length};return o.current=q0,m(q0),u.current=!0,s(!0),!0}if(g==="n"&&A0.length>0)return H$(V.current+1),!0;if(g==="N"&&A0.length>0)return H$(V.current-1),!0;if(I.tab)return e0(I.shift?-1:1),!0;if(I.return||g==="e")return c1(),!0;if(g==="v"){if(B.length===0)return!0;let q0=Math.max(0,B.length-H0.current),c0=Math.max(0,q0-F),Z$=v.current?B.findIndex((J1)=>J1.blockId===v.current&&J1.header):-1,$$=Z$>=0?Z$:Math.max(0,Math.min(B.length-1,c0)),$1={anchor:$$,head:$$};return M.current=$1,t($1),p0($$),!0}if(I.upArrow||g==="k")return a0(H0.current+1),!0;if(I.downArrow||g==="j")return a0(H0.current-1),!0;if(I.pageUp)return a0(H0.current+Math.max(1,F-1)),!0;if(I.pageDown)return a0(H0.current-Math.max(1,F-1)),!0;if(I.home||g==="g")return a0(O0),!0;if(I.end||g==="G")return a0(0),!0;return!0},{isActive:$,priority:100});let e$=B.slice(S0,r0),X0=D.size,P0=B.length===0?"0/0":`${Math.min(r0,B.length)}/${B.length}`,R0=Y0?Math.min(Y0.anchor,Y0.head):-1,Q0=Y0?Math.max(Y0.anchor,Y0.head):-1,$0=f.length>0?`/${f} ${A0.length>0?`${e+1}/${A0.length}`:"0/0"}`:null,o0=k?k:Y0?`${Q0-R0+1} lines selected · y copy · Esc cancel`:$0?`${$0} · n/N`:X0>0?`${X0} new · G latest`:"Ctrl+O / Esc / q close";return T$(H4,{flexDirection:"column",width:"100%",height:W,paddingX:2,children:[T$(H4,{justifyContent:"space-between",flexShrink:0,children:[T$(G1,{bold:!0,color:q.colors.primary,children:"Transcript"},void 0,!1,void 0,this),T$(G1,{color:q.colors.text.muted,children:P0},void 0,!1,void 0,this)]},void 0,!0,void 0,this),T$(H4,{flexDirection:"column",height:F,flexShrink:0,overflow:"hidden",children:e$.length===0?T$(G1,{color:q.colors.text.muted,children:"No transcript yet"},void 0,!1,void 0,this):e$.map((g,h)=>{let I=S0+h,p=R0>=0&&I>=R0&&I<=Q0,q0=g.header&&g.blockId===S,c0=g.pending?q.colors.warning:g.kind==="thinking"?q.colors.info:g.role==="user"?q.colors.info:g.role==="assistant"?q.colors.success:q.colors.text.secondary;return T$(kK,{line:g,matches:A0,currentMatchIndex:e,selected:p,selectedBlock:q0,color:c0,highlightColor:q.colors.warning},g.key,!1,void 0,this)})},void 0,!1,void 0,this),T$(H4,{flexShrink:0,children:i?T$(SK,{editor:_0},void 0,!1,void 0,this):T$(G1,{color:k||X0>0?q.colors.warning:q.colors.text.muted,wrap:"truncate-end",children:[o0," · / 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 h0}from"react/jsx-dev-runtime";var k$=S1("UI"),wX=({debug:$,continue:J,...X})=>{if($)k$.debug("[Debug] BladeInterface props:",{permissionMode:X.permissionMode,yolo:X.yolo,maxTurns:X.maxTurns,continue:J});let Y=$8(!1),Z=$8(!1),Q=$8(!1),K=$8(null),U=$8(!1),[G,q]=vK(!1),_=X9(),z=Z9(),O=Q8(),W=U9(),F=K9(),N=I1(),w=C1(),R=K2(),H=Y1(),{stdout:C}=fK(),y=H9(),A=U2(),B=N9();y1(()=>{if(W$.getCurrentThemeName()!==B)try{W$.setTheme(B)}catch{}},[B]);let b=_==="ready",L=_==="needsSetup",D=_==="idle",T=DK(()=>X.agents?LX(X.agents):void 0,[X.agents]),{confirmationState:S,confirmationHandler:P,handleResponse:v,dismissAll:i}=QY(),{executeCommand:s,handleAbort:u,isProcessing:_0,cleanupAgent:m}=YY(X.systemPrompt,X.appendSystemPrompt,P,X.maxTurns,i,T),{getPreviousCommand:o,getNextCommand:f,addToHistory:a}=XY();CY();let e=UY("",0),Z0=z$(()=>{m$(),C.write(WX.eraseScreen+WX.cursorTo(0,0)),w.incrementClearCount()}),V=z$(()=>{if(G)return;q(!0)}),Y0=z$(()=>{if(!G)return;q(!1)}),t=z$(()=>{if(G)Y0();else V()});W0((I,p)=>{if(b&&!L&&(p.ctrl||p.meta)&&I.toLowerCase()==="o")return t(),!0;return!1},{priority:90}),y1(()=>{if(!U.current){U.current=!0;return}Z0()},[Z0,G]);let M=z$(async()=>{let I=A,p;if(I==="default")p="autoEdit";else if(I==="autoEdit")p="plan";else if(I==="plan")p="default";else p="default";try{await x0.setSessionPermissionMode(R,H,p),await G$().setPermissionMode(p)}catch(q0){k$.error("权限模式切换失败:",q0 instanceof Error?q0.message:q0)}}),k=z$(async(I)=>{try{let p={displayName:I.displayName,provider:I.provider,model:I.model,overrides:I.overrides};if(I.modelProvider)await G$().addModelWithProvider(p,I.modelProvider);else await G$().addModel(p);N.setInitializationStatus("ready")}catch(p){throw k$.error("初始化配置保存失败:",p instanceof Error?p.message:p),p}}),E=z$(()=>{if(O==="shortcuts")N.closeModal();else N.setActiveModal("shortcuts")}),x=z$(async(I,p,q0)=>{return y8({intent:p,session:I,newSessionId:q0?.newSessionId,announceFork:q0?.announceFork,permissionModeOverride:X.permissionMode},H,w,m)}),n=z$(async(I,p)=>{let Z$=(await M8(p,H)).filter(($$)=>$$.sessionId===I);if(Z$.length===0)throw Error(`Session not found: ${I}`);if(Z$.length>1)throw Error(`Multiple workspaces contain session ${I}; use the session selector`);return Z$[0]}),{showSuggestions:H0,suggestions:y0,selectedSuggestionIndex:j0}=MY(e,s,o,f,a,u,_0,M,E,O==="shortcuts");y1(()=>{if(e.value&&O==="shortcuts")N.closeModal()},[e.value,O,N]);let z0=z$(async()=>{Q.current=!0;try{let I=X.forkSession?"fork":"resume",p=await M8(I,H);if(p.length===0){if(X.forkSession){k$.error("没有可供 fork 的历史会话"),X1(1);return}w.addAssistantMessage("没有找到历史会话,开始新对话。");return}let q0=p[0];await x(q0,I,{newSessionId:X.forkSession?X.sessionId:void 0,announceFork:X.forkSession?!1:void 0})}catch(I){if(k$.error("[BladeInterface] 继续会话失败:",I),X.forkSession){X1(1);return}w.addAssistantMessage("继续会话失败,开始新对话。")}}),A0=z$(async()=>{Q.current=!0;try{if(typeof X.resume==="string"&&X.resume!=="true"){let q0=X.forkSession?"fork":"resume",c0=await n(X.resume,q0);await x(c0,q0,{newSessionId:X.forkSession?X.sessionId:void 0,announceFork:X.forkSession?!1:void 0});return}let I=X.forkSession?"fork":"resume",p=await M8(I,H);if(p.length===0)k$.error("没有找到历史会话"),X1(1);N.showSessionSelector(p,I)}catch(I){k$.error("[BladeInterface] 加载会话失败:",I),X1(1)}});y1(()=>{if(Y.current)return;if(J){Y.current=!0,z0();return}if(X.resume)Y.current=!0,A0()},[J,X.resume,z0,A0]);let O0=z$(async(I)=>{let p=S.details?.type;if(p==="enterPlanMode"&&I.approved)try{await x0.setSessionPermissionMode(R,H,"plan"),await G$().setPermissionMode("plan"),k$.debug("[BladeInterface] Entered Plan mode")}catch(q0){k$.error("[BladeInterface] Failed to enter Plan mode:",q0)}if(p==="exitPlanMode"&&I.approved)k$.debug("[BladeInterface] ExitPlanMode approved, Store auto-synced");v(I)}),r0=z$(()=>{w.addAssistantMessage("设置已取消"),w.addAssistantMessage("Blade 需要 API 配置才能正常工作。"),w.addAssistantMessage("您可以稍后运行 Blade 重新进入设置向导。"),X1(0)}),S0=z$(()=>{N.closeModal()}),a0=z$(async(I)=>{try{await x(I,W?.intent??"resume"),N.closeModal()}catch(p){k$.error("[BladeInterface] Failed to restore session:",p),w.addAssistantMessage(`会话操作失败: ${p instanceof Error?p.message:"未知错误"}`),N.closeModal()}}),p0=z$(()=>{if(X.resume)X1(0);else N.closeModal()}),A$=z$((I)=>{N.showModelEditWizard(I)}),i0=z$((I)=>{w.addAssistantMessage(`已添加模型配置: ${I.displayName??I.model},并已切换到该模型`),S0()}),H$=z$((I)=>{w.addAssistantMessage(`已更新模型配置: ${I.displayName??I.model}`),S0()});y1(()=>{if(L){y.setFocus("model-config-wizard");return}if(S.isVisible)y.setFocus("confirmation-prompt");else if(O==="sessionSelector")y.setFocus("session-selector");else if(O==="themeSelector")y.setFocus("theme-selector");else if(O==="modelSelector")y.setFocus("model-selector");else if(O==="modelAddWizard"||O==="modelEditWizard")y.setFocus("model-config-wizard");else if(O==="permissionsManager")y.setFocus("permissions-manager");else if(O==="agentsManager")y.setFocus("agents-manager");else if(O==="agentCreationWizard")y.setFocus("agent-creation-wizard");else if(O==="skillsManager")y.setFocus("skills-manager");else if(O==="pluginsManager")y.setFocus("plugins-manager");else if(O==="hooksManager")y.setFocus("hooks-manager");else if(G)y.setFocus("transcript-pager");else if(O==="shortcuts")y.setFocus("main-input");else y.setFocus("main-input")},[L,S.isVisible,O,G,y.setFocus]),y1(()=>{if(!b||Q.current)return;if(FX().length>0){Q.current=!0;return}Q.current=!0,w.addAssistantMessage("请输入您的问题,我将为您提供帮助。")},[b]),y1(()=>{if(!z)return;if(K.current===z)return;if(K.current=z,_==="error")w.addAssistantMessage(`初始化失败: ${z}`);else w.addAssistantMessage(`${z}`),w.addAssistantMessage("请重新尝试设置,或检查文件权限")},[z,_,w.addAssistantMessage]);let e0=z$(async(I)=>{try{await s({displayText:I,text:I,images:[],parts:[{type:"text",text:I}]})}catch(p){let q0=p instanceof Error?p.message:"无法发送初始消息";w.addAssistantMessage(`初始消息发送失败:${q0}`)}});y1(()=>{let I=X.initialMessage?.trim();if(!I||Z.current||!b||L)return;Z.current=!0,a(I),e0(I)},[X.initialMessage,b,L,s,a]);let c1=z$(async(I)=>{try{await G$().setPermissionMode(I)}catch(p){k$.error("权限模式初始化失败:",p instanceof Error?p.message:p)}});if(y1(()=>{let I=X.permissionMode;if($)k$.debug("[Debug] permissionMode from CLI:",I),k$.debug("[Debug] current permissionMode:",A);if(!I||I===A)return;c1(I)},[X.permissionMode,A]),D)return null;if(L)return h0(vJ,{mode:"setup",onComplete:k,onCancel:r0},void 0,!1,void 0,this);if($)k$.debug("[Debug] 渲染主界面,条件检查:",{confirmationVisible:S.isVisible,activeModal:O});let h$=O==="modelSelector",O$=F,e$=O==="modelAddWizard"?"add":O==="modelEditWizard"&&O$?"edit":null,X0=h$||Boolean(e$),P0=O==="agentsManager",R0=O==="agentCreationWizard",Q0=O==="skillsManager",$0=O==="pluginsManager",o0=O$?{displayName:O$.displayName,provider:O$.provider,model:O$.model,overrides:O$.overrides}:void 0,g=S.isVisible&&S.details?S.details.type==="mcpElicitation"&&S.details.mcpElicitation?h0(Y3,{details:S.details.mcpElicitation,onComplete:(I,p)=>O0({approved:I.action==="accept",elicitation:I,...p?{openExternalUrl:!0}:{}})},void 0,!1,void 0,this):S.details.type==="askUserQuestion"&&S.details.questions?h0(m3,{questions:S.details.questions,onComplete:(I)=>O0({approved:!0,answers:I}),onCancel:()=>O0({approved:!1})},void 0,!1,void 0,this):h0(P6,{details:S.details,onResponse:O0},void 0,!1,void 0,this):O==="themeSelector"?h0(XX,{},void 0,!1,void 0,this):O==="permissionsManager"?h0(f3,{onClose:S0},void 0,!1,void 0,this):O==="sessionSelector"?h0(r3,{intent:W?.intent??"resume",sessions:W?.sessions,onSelect:a0,onCancel:p0},void 0,!1,void 0,this):O==="hooksManager"?h0(y6,{workspaceRoot:H,sessionId:R,onClose:S0},void 0,!1,void 0,this):null,h=Boolean(g);return h0(M1,{flexDirection:"column",width:"100%",overflow:"hidden",children:[g,h0(M1,{flexDirection:"column",display:h||G?"none":"flex",children:[h0(z3,{active:!h&&!G},void 0,!1,void 0,this),h0($X,{},void 0,!1,void 0,this),h0(pJ,{},void 0,!1,void 0,this),h0(hJ,{},void 0,!1,void 0,this),h0(s6,{paused:h||G},void 0,!1,void 0,this),h0(l6,{input:e.value,cursorPosition:e.cursorPosition,onChange:e.setValue,onChangeCursorPosition:e.setCursorPosition,onAddPasteMapping:e.addPasteMapping,onAddImagePasteMapping:e.addImagePasteMapping},void 0,!1,void 0,this),h$&&h0(M1,{marginTop:1,paddingX:2,children:h0(O3,{onClose:S0,onEdit:A$},void 0,!1,void 0,this)},void 0,!1,void 0,this),e$&&h0(M1,{marginTop:1,paddingX:2,children:h0(vJ,{mode:e$,modelId:O$?.id,initialConfig:e$==="edit"?o0:void 0,onComplete:e$==="edit"?H$:i0,onCancel:S0},void 0,!1,void 0,this)},void 0,!1,void 0,this),P0&&h0(M1,{marginTop:1,paddingX:2,children:h0(EY,{workspaceRoot:H,onComplete:S0,onCancel:S0},void 0,!1,void 0,this)},void 0,!1,void 0,this),R0&&h0(M1,{marginTop:1,paddingX:2,children:h0(c2,{onComplete:S0,onCancel:S0},void 0,!1,void 0,this)},void 0,!1,void 0,this),Q0&&h0(M1,{marginTop:1,paddingX:2,children:h0(n3,{onComplete:S0,onCancel:S0},void 0,!1,void 0,this)},void 0,!1,void 0,this),$0&&h0(M1,{marginTop:1,paddingX:2,children:h0(g3,{workspaceRoot:H,onComplete:S0,onCancel:S0},void 0,!1,void 0,this)},void 0,!1,void 0,this),h0(uY,{suggestions:y0,selectedIndex:j0,visible:H0&&!X0},void 0,!1,void 0,this),h0(cY,{},void 0,!1,void 0,this)]},void 0,!0,void 0,this),h0(M1,{flexDirection:"column",display:G?"flex":"none",children:h0(HX,{isOpen:G,compact:h,onClose:Y0},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{Box as VK,Text as p1}from"ink";import jK from"react";import{jsxDEV as T1}from"react/jsx-dev-runtime";class J8 extends jK.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 T1(VK,{flexDirection:"column",padding:1,borderStyle:"round",borderColor:"red",children:[T1(p1,{color:"red",children:"应用发生错误"},void 0,!1,void 0,this),T1(p1,{children:" "},void 0,!1,void 0,this),T1(p1,{color:"red",children:this.state.error?.message},void 0,!1,void 0,this),T1(p1,{children:" "},void 0,!1,void 0,this),T1(p1,{color:"gray",children:"错误详情:"},void 0,!1,void 0,this),T1(p1,{color:"gray",children:this.state.error?.stack},void 0,!1,void 0,this),T1(p1,{children:" "},void 0,!1,void 0,this),T1(p1,{color:"yellow",children:"请重启应用或联系开发者"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return this.props.children}}import{Box as Z2,Text as R1}from"ink";import{useState as dJ}from"react";import{jsxDEV as R$}from"react/jsx-dev-runtime";var W4=[{key:"update",label:"Update now",description:`runs \`${AX()}\``},{key:"skip",label:"Skip",description:""},{key:"skip_until_next",label:"Skip until next version",description:""}],PX=({versionInfo:$,onComplete:J})=>{let[X,Y]=dJ(0),[Z,Q]=dJ(!1),[K,U]=dJ(null);W0((q,_)=>{if(_.ctrl&&q==="c"){p2().shutdown("SIGINT",0);return}if(Z||K)return;if(_.upArrow||q==="k")Y((z)=>z>0?z-1:W4.length-1);else if(_.downArrow||q==="j")Y((z)=>z<W4.length-1?z+1:0);else if(_.return)G(W4[X].key);else if(q==="1")G("update");else if(q==="2")G("skip");else if(q==="3")G("skip_until_next")});let G=async(q)=>{switch(q){case"update":{Q(!0);let _=await bX();U(_.message),setTimeout(()=>{p2().shutdown("SIGINT",0)},1500);break}case"skip":J();break;case"skip_until_next":if($.latestVersion)await BX($.latestVersion);J();break}};if(K)return R$(Z2,{flexDirection:"column",marginY:1,children:R$(R1,{children:K},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Z)return R$(Z2,{flexDirection:"column",marginY:1,children:R$(R1,{color:"cyan",children:"Updating..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);return R$(Z2,{flexDirection:"column",marginY:1,children:[R$(R1,{color:"yellow",bold:!0,children:["Update available! ",R$(R1,{color:"gray",children:[$.currentVersion," ","->"," ",$.latestVersion]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),R$(Z2,{marginTop:1,children:R$(R1,{color:"gray",children:["Release notes:"," ",R$(R1,{color:"cyan",underline:!0,children:$.releaseNotesUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),R$(Z2,{flexDirection:"column",marginTop:1,children:W4.map((q,_)=>{let z=_===X,O=z?"› ":" ",W=`${_+1}. `;return R$(Z2,{children:R$(R1,{color:z?"cyan":void 0,children:[O,W,q.label,q.description&&R$(R1,{color:"gray",children:[" (",q.description,")"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},q.key,!1,void 0,this)})},void 0,!1,void 0,this),R$(Z2,{marginTop:1,children:R$(R1,{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 F4,Text as f2}from"ink";import{useState as MX}from"react";import{jsxDEV as q1}from"react/jsx-dev-runtime";var yX=({status:$,onTrust:J,onContinueSafely:X})=>{let Y=W$.getTheme(),[Z,Q]=MX(!1),[K,U]=MX(null);return W0((G,q)=>{if(Z)return;if(q.return||G.toLowerCase()==="t"){Q(!0),U(null),J().catch((_)=>{U(_ instanceof Error?_.message:"Failed to trust workspace"),Q(!1)});return}if(G.toLowerCase()==="s"||q.escape)Q(!0),U(null),X().catch((_)=>{U(_ instanceof Error?_.message:"Failed to continue safely"),Q(!1)})}),q1(F4,{flexDirection:"column",paddingX:1,children:[q1(f2,{bold:!0,color:Y.colors.warning,children:"Workspace review required"},void 0,!1,void 0,this),q1(f2,{dimColor:!0,children:$.projectPath},void 0,!1,void 0,this),q1(F4,{marginTop:1,flexDirection:"column",children:[q1(f2,{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((G)=>q1(f2,{children:[" ",G.path," · ",G.effects.length," effect(s)"]},`${G.kind}:${G.path}`,!0,void 0,this))]},void 0,!0,void 0,this),K&&q1(F4,{marginTop:1,children:q1(f2,{color:Y.colors.error,children:K},void 0,!1,void 0,this)},void 0,!1,void 0,this),q1(F4,{marginTop:1,children:q1(f2,{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 EK}from"ink";import{useEffect as hK}from"react";function TX(){let{stdout:$}=EK();hK(()=>{if(!$.isTTY)return;return $.write(S6),$.write(WJ),()=>{$.write(k6),$.write(WJ)}},[$])}function RX($){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=***")}import{jsxDEV as x1}from"react/jsx-dev-runtime";function mK($){if(_$().config.actions.setConfig($),$.debug)console.log("[Debug] 模型配置检查通过,准备就绪");F$().setInitializationStatus("ready")}var pK=($)=>{TX();let[J,X]=w4(!1),[Y,Z]=w4(null),[Q,K]=w4(!1),[U,G]=w4(null),q=L4((W,F)=>{let N=W instanceof Error?W.message:String(W);if(F$().setInitializationError(N),F$().setInitializationStatus("error"),X(!0),F)console.error("[FAIL] 应用初始化失败:",N)}),_=L4(async()=>{try{let W=_$().config.config??IX,F=SX(W,$);if(mK(F),F.resumeSessionId)kX().restoreSession(F.resumeSessionId,[]);if(F.debug)console.error("[Debug] 运行时配置:",F);let N=F.codeTheme;if(N&&W$.hasTheme(N)){if(W$.setTheme(N),$.debug)console.log(`[OK] 已加载主题: ${N}`)}try{D$.getInstance().loadConfig(F.hooks||{},U$());let R=await fX(U$());if($.debug&&F.hooks?.enabled)console.log("[OK] Hooks 系统已启用");if($.debug)console.log(`[OK] Workspace resources: ${R.subagents.getAllNames().length} agents, ${R.skills.size} skills, ${R.commands.getCommandCount()+R.commands.getPluginCommandCount()} commands, ${R.plugins.getAll().length} plugins`);let C=_$().session.sessionId;CX(C)}catch(w){if($.debug)console.warn("Hooks 初始化失败:",RX(w))}R8(async()=>{await vX.getInstance().killAll(),await DX.getInstance().disconnectAll(),D$.getInstance().cleanup()}),X(!0)}catch(W){q(W,!!$.debug)}}),z=L4(async()=>{let W=await lJ.getInstance().getStatus(U$());if(W.state==="untrusted"||W.state==="error"){G(W);return}await _()}),O=L4(async()=>{if($.versionCheckPromise){let W=await $.versionCheckPromise;if(W){Z(W),K(!0);return}}await z()});if(gK(()=>{O()},[]),Q&&Y)return x1(J8,{children:x1(PX,{versionInfo:Y,onComplete:()=>{K(!1),z()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(U)return x1(J8,{children:x1(yX,{status:U,onTrust:async()=>{await lJ.getInstance().trust(U$()),await VX(),G(null),await _()},onContinueSafely:async()=>{G(null),await _()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(!J)return null;return x1(J8,{children:x1(wX,{...$},void 0,!1,void 0,this)},void 0,!1,void 0,this)},Rw=($)=>x1(zY,{children:x1(pK,{...$},void 0,!1,void 0,this)},void 0,!1,void 0,this);export{Rw as AppWrapper};
|