blade-code 0.11.9 → 0.11.10
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-kaabejqf.js → chunk-0vet7np5.js} +1 -1
- package/dist/{chunk-47rhy4jf.js → chunk-113t7z1d.js} +1 -1
- package/dist/{chunk-agg0r7hf.js → chunk-123x4vv0.js} +1 -1
- package/dist/{chunk-2c8x98q3.js → chunk-1j3y40wn.js} +1 -1
- package/dist/{chunk-jgbkavhw.js → chunk-3ce55d11.js} +1 -1
- package/dist/{chunk-ya1h0x91.js → chunk-54mb3ar4.js} +1 -1
- package/dist/{chunk-0fc2cz08.js → chunk-58t96cyv.js} +1 -1
- package/dist/{chunk-jfhst6aa.js → chunk-5tf0hs46.js} +1 -1
- package/dist/{chunk-x04qm0v9.js → chunk-75an4n90.js} +1 -1
- package/dist/{chunk-3brrdhw9.js → chunk-7bvtz3mm.js} +1 -1
- package/dist/{chunk-98mjd5cf.js → chunk-7me3rm8n.js} +1 -1
- package/dist/{chunk-81ezwggm.js → chunk-8cr35jh6.js} +1 -1
- package/dist/{chunk-ne41rzzb.js → chunk-8fasjabf.js} +1 -1
- package/dist/{chunk-45w61v5m.js → chunk-8hke5rc9.js} +1 -1
- package/dist/{chunk-7wmxf4n8.js → chunk-8httqk7j.js} +1 -1
- package/dist/{chunk-egp3ph5r.js → chunk-8tjh8nzm.js} +1 -1
- package/dist/{chunk-xagbx7qc.js → chunk-8wk4q3bz.js} +223 -223
- package/dist/{chunk-he3bc68s.js → chunk-am63xh9m.js} +1 -1
- package/dist/{chunk-qhg9hak4.js → chunk-bckm03fv.js} +53 -53
- package/dist/{chunk-htn8n0n9.js → chunk-d40j41s5.js} +1 -1
- package/dist/{chunk-k9yda72x.js → chunk-geakn1sr.js} +1 -1
- package/dist/{chunk-hthmvjrr.js → chunk-j5nz7kb4.js} +1 -1
- package/dist/chunk-j63n860q.js +1 -0
- package/dist/{chunk-3rcwpywe.js → chunk-jgmaytrk.js} +1 -1
- package/dist/{chunk-11xk8krn.js → chunk-k5595spk.js} +1 -1
- package/dist/{chunk-g2wynrn4.js → chunk-k6knawfb.js} +9 -9
- package/dist/{chunk-yhtyed6x.js → chunk-katmqxmn.js} +1 -1
- package/dist/{chunk-w7fq53ee.js → chunk-kn7jya27.js} +1 -1
- package/dist/chunk-mnm8epn5.js +2 -0
- package/dist/{chunk-1n5y4m62.js → chunk-mvyrhqrm.js} +2 -2
- package/dist/{chunk-5pnrgh5w.js → chunk-pt4reckf.js} +1 -1
- package/dist/chunk-se9tcqqv.js +1 -0
- package/dist/{chunk-ewe3nv2f.js → chunk-t5hhrj1g.js} +1 -1
- package/dist/{chunk-njt778p0.js → chunk-vh5za5en.js} +1 -1
- package/dist/{chunk-6hja02q7.js → chunk-vhc0z5k0.js} +1 -1
- package/dist/{chunk-egqfnree.js → chunk-vkabej0v.js} +1 -1
- package/dist/{chunk-6ffsdn5e.js → chunk-yzw0e9a5.js} +1 -1
- package/dist/{chunk-gcq0tffx.js → chunk-z7f2a75f.js} +1 -1
- package/package.json +1 -1
- package/dist/chunk-3rmcsb4e.js +0 -2
- package/dist/chunk-gjzf8ct6.js +0 -1
- package/dist/chunk-jbm1k50z.js +0 -1
|
@@ -1,48 +1,48 @@
|
|
|
1
|
-
import{e as x5,f as c5,h as I$,i as M6}from"./chunk-47rhy4jf.js";import{l as c7,m as u7,n as d7}from"./chunk-yhtyed6x.js";import{B as FJ,C as LJ,D as q6}from"./chunk-45w61v5m.js";import{$ as WY,Ba as O3,Ca as N3,Da as ZX,Ea as sJ,Ga as eJ,Ia as xY,L as pY,P as XX,R as E4,S as C4,T as kY,U as fY,_ as HY,ca as FY,ha as a$,ja as bJ,ka as MJ,ma as LY,oa as z8,pa as Z7,qa as Q7,ta as U7,ua as G7,ya as p9,za as W3}from"./chunk-xagbx7qc.js";import"./chunk-nad5spvc.js";import{Qa as M5,Ra as T5,Sa as C5,Va as YX}from"./chunk-kaabejqf.js";import{Xa as NY}from"./chunk-whxkwaz1.js";import{Qb as _Y,Rb as F6,bc as OY,mc as A4}from"./chunk-egp3ph5r.js";import{xc as N8}from"./chunk-9qxch6sy.js";import{$d as PJ,Hd as ZY,Rd as WJ,Sd as g2,Wd as AJ,ae as p2,ce as t8,ke as K8,ne as a0}from"./chunk-3brrdhw9.js";import"./chunk-skktstg8.js";import{Re as RJ,Se as B4,Te as yJ}from"./chunk-s14zayxp.js";import{of as iJ,pf as U6}from"./chunk-b5cz00mt.js";import{Cf as p7}from"./chunk-yjdyzb5z.js";import{Df as H8,Ef as _6,Gf as J1}from"./chunk-he3bc68s.js";import"./chunk-crv3sghv.js";import{Kf as C2,Lf as F$,Mf as r1,Nf as Y9,Of as o8,Pf as wJ,Qf as p3,Rf as P9,Sf as v5,Tf as x3,Uf as D2,Vf as m0,Wf as $X,Xf as L$,Yf as m7,Zf as r6,_f as _8,bg as aJ,eg as K$}from"./chunk-g2wynrn4.js";import"./chunk-x6k5ye1z.js";import"./chunk-v508x7cg.js";import"./chunk-1g7c3f82.js";import"./chunk-3v9epq9s.js";import{wg as b9}from"./chunk-eexs73bz.js";import"./chunk-pm163dfm.js";import"./chunk-81ezwggm.js";import{Jg as W6,Kg as R7,Pg as X7,Yg as JX}from"./chunk-ya1h0x91.js";import"./chunk-kehgewqh.js";import"./chunk-kkzznz4w.js";import"./chunk-1cy4ab77.js";import"./chunk-7ajvrtb3.js";import{Ah as j$,yh as Q9}from"./chunk-egqfnree.js";import"./chunk-ys8gysg8.js";import{Ih as DJ,Pi as s7,Ui as Y7,Vi as e7}from"./chunk-gcq0tffx.js";import{Zi as G$}from"./chunk-b22ab7yw.js";import"./chunk-amabfzc8.js";import{wj as m2,xj as e8,zj as U9}from"./chunk-m2x6pb4f.js";import{Bj as t7,Ej as N1}from"./chunk-saz6mwpq.js";import{Mj as g5,Nj as m5,Qj as C1}from"./chunk-xhwdac1j.js";import"./chunk-0eajnhrj.js";import{_j as I5}from"./chunk-3rmcsb4e.js";import{ck as g9}from"./chunk-asgmmaec.js";import{dk as G8,xk as rJ}from"./chunk-ed2hdrwe.js";import{Jk as Y6}from"./chunk-gmpsfkgg.js";import{useMemoizedFn as Q4}from"ahooks";import{useEffect as pK,useState as U4}from"react";import{useMemoizedFn as i0}from"ahooks";import E7 from"ansi-escapes";import{Box as g1,useStdout as vK}from"ink";import{useEffect as $1,useMemo as VK,useRef as y2,useState as g7}from"react";import{useShallow as KX}from"zustand/react/shallow";import{useStore as UX}from"zustand";import{useShallow as GX}from"zustand/react/shallow";function z0($){return UX(D2,GX($))}var zX=[],v2=()=>z0(($)=>$.session.sessionId),_1=()=>z0(($)=>$.session.workspaceRoot),V8=()=>z0(($)=>$.session.messages),x9=()=>z0(($)=>$.session.clearCount),c9=()=>z0(($)=>$.session.isCompacting);var u9=()=>z0(($)=>{let{totalInputTokens:J,cacheReadTokens:Y,cacheWriteTokens:Z}=$.session.tokenUsage;return p9({totalInputTokens:J,cacheReadTokens:Y,cacheWriteTokens:Z})});var d9=()=>z0(($)=>{let J=$.session.tokenUsage;return{estimatedCostUsd:J.estimatedCostUsd,inputTokens:J.totalInputTokens,outputTokens:J.totalOutputTokens,totalTokens:J.totalTokens,cacheReadTokens:J.cacheReadTokens,cacheWriteTokens:J.cacheWriteTokens}}),j8=()=>z0(($)=>$.session.providerRecovery),l9=()=>z0(($)=>$.session.turnActivity),r9=()=>z0(($)=>$.session.actionStationarity),u1=()=>z0(($)=>$.session.actions),a9=()=>z0(($)=>{let{totalTokens:J,maxContextTokens:Y}=$.session.tokenUsage;if(Y<=0)return 100;let Z=Math.max(0,100-J/Y*100);return Math.round(Z)}),i9=()=>z0(($)=>$.app.initializationStatus),o9=()=>z0(($)=>$.app.initializationError),V2=()=>z0(($)=>$.app.activeModal),n9=()=>z0(($)=>$.app.tasks),t9=()=>z0(($)=>$.app.modelEditorTarget),s9=()=>z0(($)=>$.app.sessionSelectorData),e9=()=>z0(($)=>$.app.sessionHistoryViewerData),$J=()=>z0(($)=>$.app.taskAttentionStatus),h8=()=>z0(($)=>$.app.taskAttentionUnreadKeys),JJ=()=>z0(($)=>$.app.awaitingSecondCtrlC),O1=()=>z0(($)=>$.app.actions),j2=()=>z0(($)=>$.app.sideConversation),YJ=()=>z0(($)=>$.app.teams),E8=()=>z0(($)=>$.app.initializationStatus==="ready"),XJ=()=>z0(($)=>$.app.tasks.length>0),h2=()=>z0(($)=>$.config.config?.permissionMode||"default"),ZJ=()=>z0(($)=>$.config.config?.models??zX),g8=()=>z0(($)=>{let J=$.config.config;if(!J)return;let Y=J.currentModelId;return J.models.find((X)=>X.id===Y)??J.models[0]}),m8=()=>z0(($)=>$.config.config?.currentModelId),QJ=()=>z0(($)=>$.config.config?.agentTeamsEnabled===!0),f0=()=>z0(($)=>{return F$.getTheme()}),UJ=()=>z0(($)=>$.config.config?.codeTheme??"default"),s0=()=>z0(($)=>$.focus.currentFocus),GJ=()=>z0(($)=>$.focus.actions),E2=()=>z0(($)=>$.command.isProcessing),KJ=()=>z0(($)=>$.command.actions),p8=()=>z0(($)=>$.app.followUpQueue),zJ=()=>z0(($)=>$.app.followUpQueueMutation),qJ=()=>z0(($)=>$.command.recoveredSteeringCount),x8=()=>z0(($)=>$.app.reasoningEffort!=="off"),c8=()=>z0(($)=>$.app.reasoningEffort),u8=()=>z0(($)=>$.app.serviceTier),d8=()=>z0(($)=>$.app.responseVerbosity),l8=()=>z0(($)=>$.app.communicationStyle),r8=()=>z0(($)=>$.session.currentThinkingContent),_J=()=>z0(($)=>$.session.thinkingExpanded),a8=()=>z0(($)=>$.session.currentStreamingMessageId),i8=()=>z0(KX(($)=>({lines:$.session.currentStreamingLines,tail:$.session.currentStreamingTail,lineCount:$.session.currentStreamingLineCount,version:$.session.currentStreamingVersion}))),OJ=()=>z0(($)=>$.session.finalizingStreamingMessageId),NJ=()=>z0(($)=>$.session.historyExpanded),HJ=()=>z0(($)=>$.session.expandedMessageCount);import{randomUUID as JZ}from"node:crypto";import{useMemoizedFn as Y1}from"ahooks";import{useEffect as d1,useMemo as zY,useRef as N6}from"react";function qX($,J){try{return $.code===J.code&&$.message===J.message&&$.retryable===J.retryable&&$.resource===J.resource}catch{return!1}}class K4{options;requested=!1;waitingForIdle=!1;disposed=!1;generation=0;wakeEpoch=0;idleEpoch=0;attempt=0;recoveryStartedAt=null;scheduledToken=null;activeAttemptToken=null;activeRunController=null;retryTimer=null;deadlineTimer=null;now;scheduleCallback;setTimerCallback;clearTimerCallback;constructor($){this.options=$;this.now=$.now??Date.now,this.scheduleCallback=$.scheduleMicrotask??queueMicrotask,this.setTimerCallback=$.setTimer??setTimeout,this.clearTimerCallback=$.clearTimer??clearTimeout}request(){if(this.disposed)return;if(this.wakeEpoch++,this.requested=!0,this.waitingForIdle||this.retryTimer)return;this.scheduleIfRunnable()}notifyIdle(){if(this.disposed)return;if(this.idleEpoch++,this.retryTimer)return;this.waitingForIdle=!1,this.scheduleIfRunnable()}dispose(){if(this.disposed)return;this.disposed=!0,this.generation++,this.requested=!1,this.waitingForIdle=!1,this.scheduledToken=null,this.clearOwnedTimer("retry"),this.clearOwnedTimer("deadline"),this.activeAttemptToken=null;let $=this.activeRunController;this.activeRunController=null,$?.abort("pending-resume-coordinator-disposed"),this.resetEpisodeBudget()}scheduleIfRunnable(){if(this.disposed||!this.requested||this.scheduledToken||this.activeAttemptToken||this.retryTimer||this.waitingForIdle)return;if(!this.options.canRun()){this.waitingForIdle=!0;return}let $=this.generation,J={};this.scheduledToken=J;try{this.scheduleCallback(()=>{if(this.disposed||$!==this.generation||this.scheduledToken!==J)return;this.scheduledToken=null,this.flush($).catch((Y)=>{this.handleUnexpectedFailure(Y,$)})})}catch(Y){this.handleUnexpectedFailure(Y,$)}}async flush($){if(this.disposed||$!==this.generation||this.activeAttemptToken||!this.requested||this.retryTimer||this.waitingForIdle)return;if(!this.options.canRun()){this.waitingForIdle=!0;return}let J={},Y=new AbortController,Z=this.wakeEpoch,X=this.idleEpoch;if(this.attempt++,this.recoveryStartedAt===null)this.recoveryStartedAt=this.now(),this.installDeadlineTimer($);this.activeAttemptToken=J,this.activeRunController=Y;let Q;try{Q=await this.options.run(Y.signal)}finally{if(this.activeAttemptToken===J){if(this.activeAttemptToken=null,this.activeRunController=null,!this.disposed&&$!==this.generation)this.scheduleIfRunnable()}}if(this.disposed||$!==this.generation)return;if(Q.status==="completed"){let U=this.wakeEpoch!==Z;if(this.clearEpisode(),U)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!==X)this.waitingForIdle=!1,this.scheduleIfRunnable();else this.waitingForIdle=!0;return}this.handleFailure(Q,$)}handleFailure($,J){let Y=g2($.taskFailure),Z=this.options.sessionIdentity;if($.workKind!=="pending_input"||!$.evidence||!Z||!qX($.taskFailure,$.evidence.taskFailure)){this.terminate("failed",this.attempt,Y);return}let X=LJ({sessionIdentity:Z,failedAttempt:this.attempt,recoveryStartedAt:this.recoveryStartedAt??this.now(),now:this.now(),workStillPending:$.workStillPending,evidence:$.evidence});if(X.phase!=="retry_scheduled"){this.terminate(X.phase,this.attempt,Y);return}this.requested=!0,this.waitingForIdle=!1;let Q={},U=this.setTimerCallback(()=>{if(this.disposed||J!==this.generation||this.retryTimer?.token!==Q)return;this.retryTimer=null,this.scheduleIfRunnable()},X.delayMs);this.retryTimer={handle:U,token:Q},U.unref?.()}handleUnexpectedFailure($,J){if(this.disposed||J!==this.generation)return;this.terminate("failed",Math.max(1,this.attempt),g2($),"pending-resume-coordinator-failed")}installDeadlineTimer($){let J={},Y=this.setTimerCallback(()=>{if(this.disposed||$!==this.generation||this.deadlineTimer?.token!==J)return;this.deadlineTimer=null,this.terminate("exhausted",Math.max(1,this.attempt),WJ("timeout"),"pending-resume-recovery-deadline-exceeded")},FJ);this.deadlineTimer={handle:Y,token:J},Y.unref?.()}terminate($,J,Y,Z){let X=this.activeRunController;if(this.generation++,this.requested=!1,this.waitingForIdle=!1,this.scheduledToken=null,this.clearOwnedTimer("retry"),this.clearOwnedTimer("deadline"),this.resetEpisodeBudget(),Z)X?.abort(Z);try{this.options.onTerminalFailure?.({phase:$,attempt:J,taskFailure:Y})}catch{}}clearEpisode(){this.requested=!1,this.waitingForIdle=!1,this.clearOwnedTimer("retry"),this.clearOwnedTimer("deadline"),this.resetEpisodeBudget()}resetEpisodeBudget(){this.attempt=0,this.recoveryStartedAt=null}clearOwnedTimer($){let J=$==="retry"?this.retryTimer:this.deadlineTimer;if(!J)return;if($==="retry")this.retryTimer=null;else this.deadlineTimer=null;this.clearTimerCallback(J.handle)}}class Q8{options;finalized=!1;constructor($){this.options=$}get isFinalized(){return this.finalized}acceptsDeltas(){return!this.finalized&&!this.options.signal.aborted}startTurn(){this.finalized=!1}finalize(){if(!this.acceptsDeltas())return!1;return this.finalized=!0,this.commit(this.options.streamingBuffer.drainPendingBuffers()),!0}abortAndFinalize($){if(this.finalized)return $(),!1;this.finalized=!0;let J=this.options.streamingBuffer.drainPendingBuffers();return $(),this.commit(J),!0}discard(){this.finalized=!0,this.options.streamingBuffer.resetStreamingBuffers(),this.options.discardStreamingMessage(),this.options.clearThinking()}commit($){let J=this.options.getStreamingMessageId();if(J){if($.extraContent)o8(J,$.extraContent);wJ(J)}this.options.finalizeStreamingMessage($.extraContent,$.extraThinking)}}function _X($){if(!($ instanceof Error))return"未知错误";let Z=$.lastError??$;if(Z.responseBody)try{let U=JSON.parse(Z.responseBody)?.error?.message;if(U){let G=Z.statusCode?` (HTTP ${Z.statusCode})`:"";return`${U}${G}`}}catch{}let X=$.message.match(/Last error:\s*(.+)$/);if(X)return X[1];return $.message}function OX($){if(!($ instanceof Error))return!1;return $.name==="AbortError"||$.message.includes("aborted")}function NX($){if(!($ instanceof Error))return!1;let J=$.message;return J.includes("can only concatenate str")||J.includes("image_url")||J.includes("multimodal")||J.includes("vision")||J.includes("does not support images")}function n8($){let J=OX($),Y=NX($),Z;if(Y)Z="当前模型不支持图片理解功能。请切换到支持视觉能力的模型(如 Claude 4.5、GPT-5.2、Gemini 3 Pro、Qwen3-VL-Plus 等)后重试。";else Z=_X($);return{displayMessage:Z,isAbort:J,isVisionNotSupported:Y}}import{appendFileSync as HX,mkdirSync as WX,writeFileSync as FX}from"node:fs";import LX from"node:os";import z4 from"node:path";var BJ=null;function wX(){let $=process.env.BLADE_STORAGE_ROOT||z4.join(LX.homedir(),".blade");return z4.join($,"logs","stream-debug.log")}function BX($){if(BJ===$)return;let J=z4.dirname($);WX(J,{recursive:!0,mode:493}),FX($,`=== Stream Debug Log Started: ${new Date().toISOString()} ===
|
|
2
|
-
`),
|
|
3
|
-
`;
|
|
4
|
-
`);$.sessionActions.addUserMessage(G)}};return(X)=>{switch(X.kind){case"content_delta":if(X.delta.length>0)J.outputStarted=!0;if(!Y.acceptsDeltas())break;J.contentDeltaCount++,J.contentDeltaTotalLen+=X.delta.length,q4("loopEventHandler","onContentDelta",{callCount:J.contentDeltaCount,deltaLen:X.delta.length,totalLen:J.contentDeltaTotalLen}),$.streamingBuffer.batchAppendContent(X.delta);break;case"thinking_delta":if(X.delta.length>0)J.outputStarted=!0;if(!Y.acceptsDeltas())break;if($.thinkingModeEnabled)$.streamingBuffer.batchAppendThinking(X.delta);break;case"stream_end":{$.sessionActions.setProviderCircuit(null),$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),U8.debug("[loopEventHandler] stream_end",{contentDeltaCount:J.contentDeltaCount,contentDeltaTotalLen:J.contentDeltaTotalLen,streamFinalized:Y.isFinalized,signalAborted:$.signal.aborted}),q4("loopEventHandler","onStreamEnd",{contentDeltaCallCount:J.contentDeltaCount,contentDeltaTotalLen:J.contentDeltaTotalLen,streamFinalized:Y.isFinalized,signalAborted:$.signal.aborted}),Y.finalize();break}case"model_fallback":$.sessionActions.setProviderAdmission(null),$.sessionActions.setProviderCircuit(null),$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),Y.discard();break;case"provider_admission":{let{kind:Q,...U}=X;$.sessionActions.setProviderAdmission(X.phase==="queued"?U:null);break}case"provider_circuit":{let{kind:Q,...U}=X;$.sessionActions.setProviderCircuit(X.phase==="closed"?null:U);break}case"provider_retry":{let{kind:Q,...U}=X;$.sessionActions.setProviderRetry(X.phase==="recovered"?null:U);break}case"provider_stall":{let{kind:Q,...U}=X;$.sessionActions.setProviderStall(X.phase==="detected"?U:null);break}case"provider_recovery":$.sessionActions.setProviderRecovery(X.recovery);break;case"action_stationarity":{let{kind:Q,...U}=X;$.sessionActions.setActionStationarity(X.phase==="recovered"?null:U);break}case"turn_recovery":{_4($.sessionActions,X.assessment);break}case"tool_start":{J.toolExecutionStarted=!0;let Q=X.toolCall;if(!("function"in Q))break;if(Q.function.name===t8)break;if(U8.debug("[loopEventHandler] tool_start",{toolName:Q.function.name,toolKind:X.toolKind}),["TaskCreate","TaskUpdate","TaskList"].includes(Q.function.name))break;try{let U=JSON.parse(Q.function.arguments),G=
|
|
1
|
+
import{e as c5,f as u5,h as S$,i as M6}from"./chunk-113t7z1d.js";import{l as u7,m as d7,n as l7}from"./chunk-katmqxmn.js";import{B as LJ,C as wJ,D as q6}from"./chunk-8hke5rc9.js";import{$ as FY,Ba as N3,Ca as H3,Da as QX,Ea as eJ,Ga as $Y,Ia as cY,L as xY,P as ZX,R as E4,S as C4,T as fY,U as DY,_ as WY,ca as LY,ha as a$,ja as MJ,ka as TJ,ma as wY,oa as z8,pa as Q7,qa as U7,ta as G7,ua as K7,ya as p9,za as F3}from"./chunk-8wk4q3bz.js";import"./chunk-nad5spvc.js";import{Qa as T5,Ra as C5,Sa as R5,Va as XX}from"./chunk-0vet7np5.js";import{Xa as HY}from"./chunk-whxkwaz1.js";import{Qb as OY,Rb as F6,bc as NY,mc as A4}from"./chunk-8tjh8nzm.js";import{xc as N8}from"./chunk-9qxch6sy.js";import{$d as bJ,Hd as QY,Rd as FJ,Sd as g2,Wd as PJ,ae as p2,ce as t8,ke as K8,ne as a0}from"./chunk-7bvtz3mm.js";import"./chunk-skktstg8.js";import{Re as yJ,Se as B4,Te as IJ}from"./chunk-s14zayxp.js";import{of as oJ,pf as U6}from"./chunk-b5cz00mt.js";import{Cf as x7}from"./chunk-yjdyzb5z.js";import{Df as H8,Ef as _6,Gf as J1}from"./chunk-am63xh9m.js";import"./chunk-crv3sghv.js";import{Kf as C2,Lf as F$,Mf as r1,Nf as Y9,Of as o8,Pf as BJ,Qf as x3,Rf as P9,Sf as V5,Tf as c3,Uf as D2,Vf as m0,Wf as JX,Xf as L$,Yf as p7,Zf as r6,_f as _8,bg as iJ,eg as K$}from"./chunk-k6knawfb.js";import"./chunk-x6k5ye1z.js";import"./chunk-v508x7cg.js";import"./chunk-1g7c3f82.js";import"./chunk-3v9epq9s.js";import{wg as b9}from"./chunk-eexs73bz.js";import"./chunk-pm163dfm.js";import"./chunk-8cr35jh6.js";import{Jg as W6,Kg as y7,Pg as Z7,Yg as YX}from"./chunk-54mb3ar4.js";import"./chunk-kehgewqh.js";import"./chunk-kkzznz4w.js";import"./chunk-1cy4ab77.js";import"./chunk-7ajvrtb3.js";import{Ah as h$,yh as Q9}from"./chunk-vkabej0v.js";import"./chunk-ys8gysg8.js";import{Ih as vJ,Pi as e7,Ui as X7,Vi as $X}from"./chunk-z7f2a75f.js";import{Zi as G$}from"./chunk-b22ab7yw.js";import"./chunk-amabfzc8.js";import{wj as m2,xj as e8,zj as U9}from"./chunk-m2x6pb4f.js";import{Bj as s7,Ej as N1}from"./chunk-saz6mwpq.js";import{Mj as m5,Nj as p5,Qj as C1}from"./chunk-xhwdac1j.js";import"./chunk-0eajnhrj.js";import{_j as S5}from"./chunk-mnm8epn5.js";import{ck as g9}from"./chunk-asgmmaec.js";import{dk as G8,xk as aJ}from"./chunk-ed2hdrwe.js";import{Jk as Y6}from"./chunk-gmpsfkgg.js";import{useMemoizedFn as Q4}from"ahooks";import{useEffect as xK,useState as U4}from"react";import{useMemoizedFn as i0}from"ahooks";import g7 from"ansi-escapes";import{Box as g1,useStdout as VK}from"ink";import{useEffect as $1,useMemo as jK,useRef as y2,useState as m7}from"react";import{useShallow as zX}from"zustand/react/shallow";import{useStore as GX}from"zustand";import{useShallow as KX}from"zustand/react/shallow";function z0($){return GX(D2,KX($))}var qX=[],v2=()=>z0(($)=>$.session.sessionId),_1=()=>z0(($)=>$.session.workspaceRoot),V8=()=>z0(($)=>$.session.messages),x9=()=>z0(($)=>$.session.clearCount),c9=()=>z0(($)=>$.session.isCompacting);var u9=()=>z0(($)=>{let{totalInputTokens:J,cacheReadTokens:Y,cacheWriteTokens:Z}=$.session.tokenUsage;return p9({totalInputTokens:J,cacheReadTokens:Y,cacheWriteTokens:Z})});var d9=()=>z0(($)=>{let J=$.session.tokenUsage;return{estimatedCostUsd:J.estimatedCostUsd,inputTokens:J.totalInputTokens,outputTokens:J.totalOutputTokens,totalTokens:J.totalTokens,cacheReadTokens:J.cacheReadTokens,cacheWriteTokens:J.cacheWriteTokens}}),j8=()=>z0(($)=>$.session.providerRecovery),l9=()=>z0(($)=>$.session.turnActivity),r9=()=>z0(($)=>$.session.actionStationarity),a9=()=>z0(($)=>$.session.toolStatus),u1=()=>z0(($)=>$.session.actions),i9=()=>z0(($)=>{let{totalTokens:J,maxContextTokens:Y}=$.session.tokenUsage;if(Y<=0)return 100;let Z=Math.max(0,100-J/Y*100);return Math.round(Z)}),o9=()=>z0(($)=>$.app.initializationStatus),n9=()=>z0(($)=>$.app.initializationError),V2=()=>z0(($)=>$.app.activeModal),t9=()=>z0(($)=>$.app.tasks),s9=()=>z0(($)=>$.app.modelEditorTarget),e9=()=>z0(($)=>$.app.sessionSelectorData),$J=()=>z0(($)=>$.app.sessionHistoryViewerData),JJ=()=>z0(($)=>$.app.taskAttentionStatus),h8=()=>z0(($)=>$.app.taskAttentionUnreadKeys),YJ=()=>z0(($)=>$.app.awaitingSecondCtrlC),O1=()=>z0(($)=>$.app.actions),j2=()=>z0(($)=>$.app.sideConversation),XJ=()=>z0(($)=>$.app.teams),E8=()=>z0(($)=>$.app.initializationStatus==="ready"),ZJ=()=>z0(($)=>$.app.tasks.length>0),h2=()=>z0(($)=>$.config.config?.permissionMode||"default"),QJ=()=>z0(($)=>$.config.config?.models??qX),g8=()=>z0(($)=>{let J=$.config.config;if(!J)return;let Y=J.currentModelId;return J.models.find((X)=>X.id===Y)??J.models[0]}),m8=()=>z0(($)=>$.config.config?.currentModelId),UJ=()=>z0(($)=>$.config.config?.agentTeamsEnabled===!0),f0=()=>z0(($)=>{return F$.getTheme()}),GJ=()=>z0(($)=>$.config.config?.codeTheme??"default"),s0=()=>z0(($)=>$.focus.currentFocus),KJ=()=>z0(($)=>$.focus.actions),E2=()=>z0(($)=>$.command.isProcessing),zJ=()=>z0(($)=>$.command.actions),p8=()=>z0(($)=>$.app.followUpQueue),qJ=()=>z0(($)=>$.app.followUpQueueMutation),_J=()=>z0(($)=>$.command.recoveredSteeringCount),x8=()=>z0(($)=>$.app.reasoningEffort!=="off"),c8=()=>z0(($)=>$.app.reasoningEffort),u8=()=>z0(($)=>$.app.serviceTier),d8=()=>z0(($)=>$.app.responseVerbosity),l8=()=>z0(($)=>$.app.communicationStyle),r8=()=>z0(($)=>$.session.currentThinkingContent),OJ=()=>z0(($)=>$.session.thinkingExpanded),a8=()=>z0(($)=>$.session.currentStreamingMessageId),i8=()=>z0(zX(($)=>({lines:$.session.currentStreamingLines,tail:$.session.currentStreamingTail,lineCount:$.session.currentStreamingLineCount,version:$.session.currentStreamingVersion}))),NJ=()=>z0(($)=>$.session.finalizingStreamingMessageId),HJ=()=>z0(($)=>$.session.historyExpanded),WJ=()=>z0(($)=>$.session.expandedMessageCount);import{randomUUID as YZ}from"node:crypto";import{useMemoizedFn as Y1}from"ahooks";import{useEffect as d1,useMemo as qY,useRef as N6}from"react";function _X($,J){try{return $.code===J.code&&$.message===J.message&&$.retryable===J.retryable&&$.resource===J.resource}catch{return!1}}class K4{options;requested=!1;waitingForIdle=!1;disposed=!1;generation=0;wakeEpoch=0;idleEpoch=0;attempt=0;recoveryStartedAt=null;scheduledToken=null;activeAttemptToken=null;activeRunController=null;retryTimer=null;deadlineTimer=null;now;scheduleCallback;setTimerCallback;clearTimerCallback;constructor($){this.options=$;this.now=$.now??Date.now,this.scheduleCallback=$.scheduleMicrotask??queueMicrotask,this.setTimerCallback=$.setTimer??setTimeout,this.clearTimerCallback=$.clearTimer??clearTimeout}request(){if(this.disposed)return;if(this.wakeEpoch++,this.requested=!0,this.waitingForIdle||this.retryTimer)return;this.scheduleIfRunnable()}notifyIdle(){if(this.disposed)return;if(this.idleEpoch++,this.retryTimer)return;this.waitingForIdle=!1,this.scheduleIfRunnable()}dispose(){if(this.disposed)return;this.disposed=!0,this.generation++,this.requested=!1,this.waitingForIdle=!1,this.scheduledToken=null,this.clearOwnedTimer("retry"),this.clearOwnedTimer("deadline"),this.activeAttemptToken=null;let $=this.activeRunController;this.activeRunController=null,$?.abort("pending-resume-coordinator-disposed"),this.resetEpisodeBudget()}scheduleIfRunnable(){if(this.disposed||!this.requested||this.scheduledToken||this.activeAttemptToken||this.retryTimer||this.waitingForIdle)return;if(!this.options.canRun()){this.waitingForIdle=!0;return}let $=this.generation,J={};this.scheduledToken=J;try{this.scheduleCallback(()=>{if(this.disposed||$!==this.generation||this.scheduledToken!==J)return;this.scheduledToken=null,this.flush($).catch((Y)=>{this.handleUnexpectedFailure(Y,$)})})}catch(Y){this.handleUnexpectedFailure(Y,$)}}async flush($){if(this.disposed||$!==this.generation||this.activeAttemptToken||!this.requested||this.retryTimer||this.waitingForIdle)return;if(!this.options.canRun()){this.waitingForIdle=!0;return}let J={},Y=new AbortController,Z=this.wakeEpoch,X=this.idleEpoch;if(this.attempt++,this.recoveryStartedAt===null)this.recoveryStartedAt=this.now(),this.installDeadlineTimer($);this.activeAttemptToken=J,this.activeRunController=Y;let Q;try{Q=await this.options.run(Y.signal)}finally{if(this.activeAttemptToken===J){if(this.activeAttemptToken=null,this.activeRunController=null,!this.disposed&&$!==this.generation)this.scheduleIfRunnable()}}if(this.disposed||$!==this.generation)return;if(Q.status==="completed"){let U=this.wakeEpoch!==Z;if(this.clearEpisode(),U)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!==X)this.waitingForIdle=!1,this.scheduleIfRunnable();else this.waitingForIdle=!0;return}this.handleFailure(Q,$)}handleFailure($,J){let Y=g2($.taskFailure),Z=this.options.sessionIdentity;if($.workKind!=="pending_input"||!$.evidence||!Z||!_X($.taskFailure,$.evidence.taskFailure)){this.terminate("failed",this.attempt,Y);return}let X=wJ({sessionIdentity:Z,failedAttempt:this.attempt,recoveryStartedAt:this.recoveryStartedAt??this.now(),now:this.now(),workStillPending:$.workStillPending,evidence:$.evidence});if(X.phase!=="retry_scheduled"){this.terminate(X.phase,this.attempt,Y);return}this.requested=!0,this.waitingForIdle=!1;let Q={},U=this.setTimerCallback(()=>{if(this.disposed||J!==this.generation||this.retryTimer?.token!==Q)return;this.retryTimer=null,this.scheduleIfRunnable()},X.delayMs);this.retryTimer={handle:U,token:Q},U.unref?.()}handleUnexpectedFailure($,J){if(this.disposed||J!==this.generation)return;this.terminate("failed",Math.max(1,this.attempt),g2($),"pending-resume-coordinator-failed")}installDeadlineTimer($){let J={},Y=this.setTimerCallback(()=>{if(this.disposed||$!==this.generation||this.deadlineTimer?.token!==J)return;this.deadlineTimer=null,this.terminate("exhausted",Math.max(1,this.attempt),FJ("timeout"),"pending-resume-recovery-deadline-exceeded")},LJ);this.deadlineTimer={handle:Y,token:J},Y.unref?.()}terminate($,J,Y,Z){let X=this.activeRunController;if(this.generation++,this.requested=!1,this.waitingForIdle=!1,this.scheduledToken=null,this.clearOwnedTimer("retry"),this.clearOwnedTimer("deadline"),this.resetEpisodeBudget(),Z)X?.abort(Z);try{this.options.onTerminalFailure?.({phase:$,attempt:J,taskFailure:Y})}catch{}}clearEpisode(){this.requested=!1,this.waitingForIdle=!1,this.clearOwnedTimer("retry"),this.clearOwnedTimer("deadline"),this.resetEpisodeBudget()}resetEpisodeBudget(){this.attempt=0,this.recoveryStartedAt=null}clearOwnedTimer($){let J=$==="retry"?this.retryTimer:this.deadlineTimer;if(!J)return;if($==="retry")this.retryTimer=null;else this.deadlineTimer=null;this.clearTimerCallback(J.handle)}}class Q8{options;finalized=!1;constructor($){this.options=$}get isFinalized(){return this.finalized}acceptsDeltas(){return!this.finalized&&!this.options.signal.aborted}startTurn(){this.finalized=!1}finalize(){if(!this.acceptsDeltas())return!1;return this.finalized=!0,this.commit(this.options.streamingBuffer.drainPendingBuffers()),!0}abortAndFinalize($){if(this.finalized)return $(),!1;this.finalized=!0;let J=this.options.streamingBuffer.drainPendingBuffers();return $(),this.commit(J),!0}discard(){this.finalized=!0,this.options.streamingBuffer.resetStreamingBuffers(),this.options.discardStreamingMessage(),this.options.clearThinking()}commit($){let J=this.options.getStreamingMessageId();if(J){if($.extraContent)o8(J,$.extraContent);BJ(J)}this.options.finalizeStreamingMessage($.extraContent,$.extraThinking)}}function OX($){if(!($ instanceof Error))return"未知错误";let Z=$.lastError??$;if(Z.responseBody)try{let U=JSON.parse(Z.responseBody)?.error?.message;if(U){let G=Z.statusCode?` (HTTP ${Z.statusCode})`:"";return`${U}${G}`}}catch{}let X=$.message.match(/Last error:\s*(.+)$/);if(X)return X[1];return $.message}function NX($){if(!($ instanceof Error))return!1;return $.name==="AbortError"||$.message.includes("aborted")}function HX($){if(!($ instanceof Error))return!1;let J=$.message;return J.includes("can only concatenate str")||J.includes("image_url")||J.includes("multimodal")||J.includes("vision")||J.includes("does not support images")}function n8($){let J=NX($),Y=HX($),Z;if(Y)Z="当前模型不支持图片理解功能。请切换到支持视觉能力的模型(如 Claude 4.5、GPT-5.2、Gemini 3 Pro、Qwen3-VL-Plus 等)后重试。";else Z=OX($);return{displayMessage:Z,isAbort:J,isVisionNotSupported:Y}}import{appendFileSync as WX,mkdirSync as FX,writeFileSync as LX}from"node:fs";import wX from"node:os";import z4 from"node:path";var AJ=null;function BX(){let $=process.env.BLADE_STORAGE_ROOT||z4.join(wX.homedir(),".blade");return z4.join($,"logs","stream-debug.log")}function AX($){if(AJ===$)return;let J=z4.dirname($);FX(J,{recursive:!0,mode:493}),LX($,`=== Stream Debug Log Started: ${new Date().toISOString()} ===
|
|
2
|
+
`),AJ=$}function q4($,J,Y){try{let Z=BX();AX(Z);let X=new Date().toISOString(),Q=Y?` | ${JSON.stringify(Y)}`:"",U=`[${X}] [${$}] ${J}${Q}
|
|
3
|
+
`;WX(Z,U)}catch{}}var U8=N1("UI");function _4($,J){if(J.state==="requires_attention"){let Y=J.reason==="interrupted_tool_call";$.addToolMessage("Turn recovery requires attention",{toolName:"Runtime Recovery",phase:"complete",summary:Y?"An interrupted tool may have partially completed":"A completed tool may already have changed external state",detail:`${J.turnId} · inspect workspace, processes, and external state before retrying`});return}$.addToolMessage(J.state==="completed"?"Recovered completed turn":"Resuming interrupted turn",{toolName:"Runtime Recovery",phase:"complete",summary:J.state==="completed"?"The durable final response was recovered":"No tool execution was recorded before interruption",detail:J.turnId})}function CJ($,J){let Y=$.streamSession??new Q8({signal:$.signal,streamingBuffer:$.streamingBuffer,getStreamingMessageId:$.getStreamingMessageId,finalizeStreamingMessage:$.sessionActions.finalizeStreamingMessage,discardStreamingMessage:$.sessionActions.discardStreamingMessage,clearThinking:()=>$.sessionActions.setCurrentThinkingContent(null)}),Z=(X)=>{for(let Q of X){if((Q.origin??"user")!=="user")continue;let U=$.commandActions.takeFollowUpPresentation(Q.id);if(U){$.sessionActions.addUserMessage(U.displayText);continue}if(!Q.recovered||Q.persisted)continue;let G=typeof Q.content==="string"?Q.content:Q.content.map((z)=>z.type==="text"?z.text:"[Image]").join(`
|
|
4
|
+
`);$.sessionActions.addUserMessage(G)}};return(X)=>{switch(X.kind){case"content_delta":if(X.delta.length>0)J.outputStarted=!0;if(!Y.acceptsDeltas())break;J.contentDeltaCount++,J.contentDeltaTotalLen+=X.delta.length,q4("loopEventHandler","onContentDelta",{callCount:J.contentDeltaCount,deltaLen:X.delta.length,totalLen:J.contentDeltaTotalLen}),$.streamingBuffer.batchAppendContent(X.delta);break;case"thinking_delta":if(X.delta.length>0)J.outputStarted=!0;if(!Y.acceptsDeltas())break;if($.thinkingModeEnabled)$.streamingBuffer.batchAppendThinking(X.delta);break;case"stream_end":{$.sessionActions.setProviderCircuit(null),$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),U8.debug("[loopEventHandler] stream_end",{contentDeltaCount:J.contentDeltaCount,contentDeltaTotalLen:J.contentDeltaTotalLen,streamFinalized:Y.isFinalized,signalAborted:$.signal.aborted}),q4("loopEventHandler","onStreamEnd",{contentDeltaCallCount:J.contentDeltaCount,contentDeltaTotalLen:J.contentDeltaTotalLen,streamFinalized:Y.isFinalized,signalAborted:$.signal.aborted}),Y.finalize();break}case"model_fallback":$.sessionActions.setProviderAdmission(null),$.sessionActions.setProviderCircuit(null),$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),Y.discard();break;case"provider_admission":{let{kind:Q,...U}=X;$.sessionActions.setProviderAdmission(X.phase==="queued"?U:null);break}case"provider_circuit":{let{kind:Q,...U}=X;$.sessionActions.setProviderCircuit(X.phase==="closed"?null:U);break}case"provider_retry":{let{kind:Q,...U}=X;$.sessionActions.setProviderRetry(X.phase==="recovered"?null:U);break}case"provider_stall":{let{kind:Q,...U}=X;$.sessionActions.setProviderStall(X.phase==="detected"?U:null);break}case"provider_recovery":$.sessionActions.setProviderRecovery(X.recovery);break;case"action_stationarity":{let{kind:Q,...U}=X;$.sessionActions.setActionStationarity(X.phase==="recovered"?null:U);break}case"turn_recovery":{_4($.sessionActions,X.assessment);break}case"tool_start":{J.toolExecutionStarted=!0;let Q=X.toolCall;if(!("function"in Q))break;if(Q.function.name===t8)break;if(U8.debug("[loopEventHandler] tool_start",{toolName:Q.function.name,toolKind:X.toolKind}),["TaskCreate","TaskUpdate","TaskList"].includes(Q.function.name))break;try{let U=JSON.parse(Q.function.arguments),G=MJ(Q.function.name,U);$.sessionActions.addToolMessage(G,{toolCallId:Q.id,toolName:Q.function.name,phase:"start",summary:G,params:U})}catch(U){U8.error("[loopEventHandler] onToolStart error:",U)}break}case"tool_progress":{J.toolExecutionStarted=!0;let Q=X.toolCall;if(!("function"in Q))break;if(Q.function.name===t8)break;let U=X.update.total!==void 0?` ${Math.max(0,Math.min(100,Math.round((X.update.progress??0)/X.update.total*100)))}%`:"",G=`${Q.function.name}${U}: ${X.update.message}`;$.sessionActions.addToolMessage(G,{toolCallId:Q.id,toolName:Q.function.name,phase:"progress",summary:G,...X.update.admission?{admission:X.update.admission}:{}});break}case"tool_result":{J.toolExecutionStarted=!0;let Q=X.toolCall;if(!("function"in Q))break;if(Q.function.name===t8)break;U8.debug("[loopEventHandler] tool_result",{toolName:Q.function.name,success:X.result.success});let U=bJ(TJ(Q.function.name,X.result),PJ);$.sessionActions.addToolMessage(U.summary,{toolCallId:Q.id,toolName:Q.function.name,phase:"complete",summary:U.summary,detail:U.detail});break}case"structured_output":J.outputStarted=!0,$.sessionActions.replaceLastAssistantMessage(JSON.stringify(X.output,null,2));break;case"token_usage":$.sessionActions.updateTokenUsage(X.usage);break;case"conversation_recap":if($.signal.aborted)break;$.sessionActions.addMessage({id:X.messageId,role:"assistant",content:X.text,timestamp:Date.now(),metadata:{conversationRecap:!0}});break;case"compaction":if($.sessionActions.setCompacting(X.phase==="start"),X.phase==="end"){if(X.outcome!=="failed")$.sessionActions.resetContextUsage(),J.compactionCount=(J.compactionCount??0)+1;if(X.memory?.outcome==="written"){let Q=`Saved ${X.memory.entries} project memories`;$.sessionActions.addToolMessage(Q,{toolName:"Project Memory",phase:"complete",summary:Q})}}break;case"turn_start":U8.debug("[loopEventHandler] turn_start",{turn:X.turn,maxTurns:X.maxTurns}),$.sessionActions.updateTokenUsage({turnCount:X.turn}),$.sessionActions.setProviderCircuit(null),$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),Y.startTurn();break;case"task_update":$.appActions.setTasks(X.tasks);break;case"goal_frontier_updated":$.appActions.setTasks(X.tasks);break;case"mcp_catalog_changed":{let Q=`MCP catalog r${X.revision}: +${X.added.length} -${X.removed.length} ~${X.updated.length}`;$.sessionActions.addToolMessage(Q,{toolName:"MCP Catalog",phase:"complete",summary:Q,detail:[X.added.length>0?`Added: ${X.added.join(", ")}`:"",X.removed.length>0?`Removed: ${X.removed.join(", ")}`:"",X.updated.length>0?`Updated: ${X.updated.join(", ")}`:""].filter(Boolean).join(`
|
|
5
5
|
`)});break}case"mcp_content_changed":{let Q=`MCP ${X.contentKind} r${X.revision}: +${X.added.length} -${X.removed.length} ~${X.updated.length}`;$.sessionActions.addToolMessage(Q,{toolName:"MCP Content",phase:"complete",summary:Q,detail:[X.added.length>0?`Added: ${X.added.join(", ")}`:"",X.removed.length>0?`Removed: ${X.removed.join(", ")}`:"",X.updated.length>0?`Updated: ${X.updated.join(", ")}`:""].filter(Boolean).join(`
|
|
6
6
|
`)});break}case"mcp_resource_updated":{let Q=`MCP resource updated: ${X.uri}`;$.sessionActions.addToolMessage(Q,{toolName:"MCP Resource",phase:"progress",summary:Q,detail:`${X.serverName} · revision ${X.revision}`});break}case"mcp_connection_changed":{let Q=X.phase==="reconnecting"?"recovering":X.phase==="recovered"?"recovered":"recovery failed",U=`MCP ${X.serverName} ${Q}`+(X.phase==="reconnecting"?` (${X.attempt}/${X.maxAttempts})`:"");$.sessionActions.addToolMessage(U,{toolName:"MCP Connection",phase:"complete",summary:U,detail:[`reason: ${X.reason}`,`revision: ${X.revision}`,X.error?`error: ${X.error}`:""].filter(Boolean).join(`
|
|
7
7
|
`)});break}case"mcp_log":{let Q=X.logger?`${X.serverName} · ${X.logger}`:X.serverName,U=`MCP ${X.level} · ${Q}`;$.sessionActions.addToolMessage(U,{toolName:"MCP Log",phase:"complete",summary:U,detail:[X.message,`revision: ${X.revision}`,`sha256: ${X.dataSha256}`,X.truncated?"truncated: true":"",X.detailsOmitted?"details omitted by runtime policy":""].filter(Boolean).join(`
|
|
8
8
|
`)});break}case"mcp_instructions_changed":{let Q=`MCP instructions ${X.action}: ${X.serverName}`+(X.truncated?" (truncated)":"");$.sessionActions.addToolMessage(Q,{toolName:"MCP Instructions",phase:"complete",summary:Q,detail:[X.text??"",X.sha256?`sha256: ${X.sha256}`:"",X.detailsOmitted?"details omitted by runtime policy":""].filter(Boolean).join(`
|
|
9
9
|
`)});break}case"mcp_task_changed":{let Q=`MCP task ${X.status}: ${X.taskId} (${X.serverName}/${X.toolName})`;$.sessionActions.addToolMessage(Q,{toolName:"MCP Task",phase:"complete",summary:Q,detail:[X.statusMessage??"",`revision: ${X.revision}`,X.hasResult?"result available via TaskOutput":"",X.error?`error: ${X.error}`:""].filter(Boolean).join(`
|
|
10
10
|
`)});break}case"project_rules_loaded":{let Q=`Project rules loaded: ${X.files.length}`+(X.blockedWrite?" (write retry required)":"");$.sessionActions.addToolMessage(Q,{toolName:"Project Rules",phase:"complete",summary:Q,detail:X.files.map((U)=>`${U.relativePath} ${U.source} sha256=${U.contentSha256}`).join(`
|
|
11
|
-
`)});break}case"steering_applied":if(Z(X.messages),$.appActions.projectFollowUpQueue(X.queue,$.followUpQueueOwner),X.recovered>0)$.commandActions.setRecoveredSteeringCount(X.recovered);break;case"follow_up_started":if($.appActions.projectFollowUpQueue(X.queue,$.followUpQueueOwner),X.recovered>0)$.commandActions.setRecoveredSteeringCount(X.recovered);break;case"follow_up_queue_changed":$.appActions.projectFollowUpQueue(X.queue,$.followUpQueueOwner);break;case"goal_updated":case"goal_continuation_started":break;case"turn_activity":$.sessionActions.setTurnActivity(X.activity);break;case"subagent_spawned":case"subagent_completed":break;default:{let Q=X}}}}function O4($){let{text:J,parts:Y}=$,Z=Y.filter((U)=>U.type==="image");if(Z.length===0)return J;if(Z.length>m2)throw Error(`最多只能发送 ${m2} 张图片`);if(Z.reduce((U,G)=>U+`data:${G.mimeType};base64,`.length+G.base64.length,0)>e8)throw Error("图片编码后总大小不能超过 5 MiB");let Q=[];for(let U of Y)if(U.type==="text")Q.push({type:"text",text:U.text});else Q.push({type:"image_url",image_url:{url:`data:${U.mimeType};base64,${U.base64}`}});return Q}function
|
|
12
|
-
`,{mode:384}),Z)throw Error("attention file lock compromised");X=!0,this.pending=[],await this.chmodFile(this.filePath,384)}catch{if(X)return this.reportDiagnostic("TUI task attention persistence unavailable"),J6(this.entries);if(Y===void 0)Y=H4(this.entries,$),this.entries=Y;this.enqueue($),this.reportDiagnostic("TUI task attention persistence unavailable")}finally{if(J)try{await J()}catch{this.reportDiagnostic("TUI task attention persistence unavailable")}}return J6(this.entries)})}enqueue($){if(this.journalOverflowed)return;if(this.pending.length>=
|
|
13
|
-
${$.displayCwd} · ${$.messageCount} messages · ${J}${$.hasErrors?" [!]":""}`}let Q=
|
|
11
|
+
`)});break}case"steering_applied":if(Z(X.messages),$.appActions.projectFollowUpQueue(X.queue,$.followUpQueueOwner),X.recovered>0)$.commandActions.setRecoveredSteeringCount(X.recovered);break;case"follow_up_started":if($.appActions.projectFollowUpQueue(X.queue,$.followUpQueueOwner),X.recovered>0)$.commandActions.setRecoveredSteeringCount(X.recovered);break;case"follow_up_queue_changed":$.appActions.projectFollowUpQueue(X.queue,$.followUpQueueOwner);break;case"goal_updated":case"goal_continuation_started":break;case"turn_activity":$.sessionActions.setTurnActivity(X.activity);break;case"subagent_spawned":case"subagent_completed":break;default:{let Q=X}}}}function O4($){let{text:J,parts:Y}=$,Z=Y.filter((U)=>U.type==="image");if(Z.length===0)return J;if(Z.length>m2)throw Error(`最多只能发送 ${m2} 张图片`);if(Z.reduce((U,G)=>U+`data:${G.mimeType};base64,`.length+G.base64.length,0)>e8)throw Error("图片编码后总大小不能超过 5 MiB");let Q=[];for(let U of Y)if(U.type==="text")Q.push({type:"text",text:U.text});else Q.push({type:"image_url",image_url:{url:`data:${U.mimeType};base64,${U.base64}`}});return Q}function RJ($){let J=IJ($.metadata);return{role:$.role,content:J?yJ(J):$.content,...$.metadata?{metadata:$.metadata}:{}}}function $6($){if(!$.restoredContextMessages||$.restoredVisibleMessageCount<=0)return $.messages.filter((Y)=>!p2(Y)).map(RJ);let J=$.messages.slice($.restoredVisibleMessageCount).filter((Y)=>!p2(Y)).map(RJ);return[...$.restoredContextMessages,...J].filter((Y)=>!p2(Y))}import cX from"node:path";import{basename as EX}from"node:path";import{createHash as PX}from"node:crypto";import*as Q2 from"node:fs/promises";import*as X6 from"node:path";import bX from"write-file-atomic";var N4=1,MX="tui-task-attention-v1.json",TX=/^[a-f0-9]{64}$/,CX=4194304,RX=20000,VJ=1024,SJ=256,yX=/^\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])T(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d\.\d{3}Z$/,IX={realpath:!1,retries:{retries:150,factor:1.2,minTimeout:10,maxTimeout:100,randomize:!0}},kJ;class Z6{static operations=new vJ;filePath;writeFile;openFile;lockFile;chmodFile;reportDiagnostic;entries=[];pending=[];journalOverflowed=!1;constructor($={}){this.filePath=$.filePath??X6.join(G8(),MX),this.writeFile=$.writeFile??bX,this.openFile=$.openFile??Q2.open,this.lockFile=$.lockFile??hX,this.chmodFile=$.chmodFile??Q2.chmod,this.reportDiagnostic=$.reportDiagnostic??(()=>{return})}reconcile($,J){return this.mutate({kind:"reconcile",sessions:$,visibleLocator:J})}acknowledge($){return this.mutate({kind:"acknowledge",summary:$})}snapshot(){return J6(this.entries)}async mutate($){return Z6.operations.runExclusive(this.filePath,async()=>{if(this.journalOverflowed||this.pending.length>=SJ)return this.journalOverflowed=!0,this.entries=H4(this.entries,$),this.reportDiagnostic("TUI task attention persistence unavailable"),J6(this.entries);let J,Y,Z=!1,X=!1;try{await VX(this.filePath),J=await this.lockFile(this.filePath,{...IX,onCompromised:()=>{Z=!0}});let Q=await vX(this.filePath,this.openFile);if(Y=SX(Q,[...this.pending,$]),this.entries=Y,Z)throw Error("attention file lock compromised");let U=JSON.stringify({version:N4,entries:Y},null,2);if(await this.writeFile(this.filePath,U+`
|
|
12
|
+
`,{mode:384}),Z)throw Error("attention file lock compromised");X=!0,this.pending=[],await this.chmodFile(this.filePath,384)}catch{if(X)return this.reportDiagnostic("TUI task attention persistence unavailable"),J6(this.entries);if(Y===void 0)Y=H4(this.entries,$),this.entries=Y;this.enqueue($),this.reportDiagnostic("TUI task attention persistence unavailable")}finally{if(J)try{await J()}catch{this.reportDiagnostic("TUI task attention persistence unavailable")}}return J6(this.entries)})}enqueue($){if(this.journalOverflowed)return;if(this.pending.length>=SJ){this.journalOverflowed=!0;return}this.pending.push($)}}function SX($,J){return J.reduce((Y,Z)=>{return H4(Y,Z)},[...$])}function H4($,J){if(J.kind==="reconcile")return fJ(kX($,J.sessions,J.visibleLocator));let Y=x2(J.summary.locator);return fJ(jJ($,{key:Y,signature:W4(J.summary),unread:!1}))}function kX($,J,Y){let Z=new Map($.map((O)=>[O.key,O])),X=new Set,Q=Y?x2(Y):void 0,U,G=[],z=[];for(let O of J){let q=x2(O.locator);if(X.has(q))continue;X.add(q);let N=W4(O);if(Q===q){U=O;continue}let _=Z.get(q);if(!_){let F={key:q,signature:N,unread:!1};if(N===null)G.push(F);else z.push(F);continue}if(N===null){G.push({key:q,signature:null,unread:_.unread});continue}if(_.signature!==N){G.push({..._,unread:!0});continue}if(_.unread)G.push(_);else z.push(_)}let K=[...z.slice(0,VJ).reverse(),...G.reverse()];if(U)K=jJ(K,{key:x2(U.locator),signature:W4(U),unread:!1});return K}function fJ($){let J=$.map((Z,X)=>({entry:Z,index:X})).filter(({entry:Z})=>Z.signature!==null&&!Z.unread).map(({index:Z})=>Z),Y=new Set(J.slice(0,Math.max(0,J.length-VJ)));return $.filter((Z,X)=>!Y.has(X))}function jJ($,J){return[...$.filter((Y)=>Y.key!==J.key),J]}function J6($){return Object.freeze({unreadKeys:Object.freeze($.filter((J)=>J.unread).map((J)=>J.key))})}function x2($){let J=$.workspace.kind==="local"?[2,"local",$.workspace.projectPath,$.sessionId]:[2,"acp-remote",$.workspace.workspaceRef,$.sessionId];return PX("sha256").update("blade-tui-task-attention-locator-v1\x00").update(JSON.stringify(J)).digest("hex")}function W4($){if($.taskStatus!=="completed"&&$.taskStatus!=="failed"&&$.taskStatus!=="interrupted")return null;return JSON.stringify([$.taskStatus,$.taskCompletedAt??null])}function fX($){try{let J=JSON.parse($);if(!Array.isArray(J)||J.length!==2||J[0]!=="completed"&&J[0]!=="failed"&&J[0]!=="interrupted")return!1;if(J[1]!==null&&(typeof J[1]!=="string"||!yX.test(J[1])||new Date(J[1]).toISOString()!==J[1]))return!1;return JSON.stringify(J)===$}catch{return!1}}function DJ($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function DX($){if(!DJ($)||Object.keys($).some((Z)=>Z!=="version"&&Z!=="entries")||$.version!==N4||!Array.isArray($.entries)||$.entries.length>RX)return;let J=new Set,Y=[];for(let Z of $.entries){if(!DJ(Z)||Object.keys(Z).some((X)=>X!=="key"&&X!=="signature"&&X!=="unread")||typeof Z.key!=="string"||!TX.test(Z.key)||J.has(Z.key)||Z.signature!==null&&(typeof Z.signature!=="string"||!fX(Z.signature))||typeof Z.unread!=="boolean")return;J.add(Z.key),Y.push({key:Z.key,signature:Z.signature,unread:Z.unread})}return{version:N4,entries:Y}}async function vX($,J){let Y;try{Y=await J($,"r");let Z=await Y.readFile();if(Z.byteLength>CX)return[];let X=JSON.parse(Z.toString("utf8"));return DX(X)?.entries??[]}catch(Z){if(Z instanceof SyntaxError||Z instanceof Error&&"code"in Z&&Z.code==="ENOENT")return[];throw Z}finally{await Y?.close()}}async function VX($){let J=X6.dirname($);await Q2.mkdir(J,{recursive:!0,mode:448}),await Q2.chmod(J,448)}async function jX(){return kJ??=await import("proper-lockfile"),kJ}async function hX($,J){return(await jX()).lock($,J)}function M1($){let{locator:J}=$;if(J.workspace.kind==="acp-remote")return[J.version,J.workspace.kind,J.workspace.workspaceRef,J.sessionId].join("\x00");return[J.version,J.workspace.kind,J.workspace.projectPath,J.sessionId].join("\x00")}function hJ($){return x2($.locator)}async function EJ($,J,Y){if(await $.start(),Y.continueSession||Y.resume!==void 0||Y.forkSession)return;if(Y.requestedSessionId!==void 0&&$.getState().status!=="ready")return;if(Y.requestedSessionId!==void 0&&$.getState().sessions.some((Z)=>gX(Z.locator,Y.locator)))return;await J.proveLocal(Y.locator)}function gX($,J){if($.sessionId!==J.sessionId||$.workspace.kind!==J.workspace.kind)return!1;return $.workspace.kind==="local"&&J.workspace.kind==="local"?$.workspace.projectPath===J.workspace.projectPath:$.workspace.kind==="acp-remote"&&J.workspace.kind==="acp-remote"&&$.workspace.workspaceRef===J.workspace.workspaceRef}async function mX($,J,Y,Z){if($==="resume"){await Y.acknowledge(J),await Y.setVisibleLocator(J.locator);return}if(Z)await Y.setVisibleLocator(Z)}function gJ($,J,Y,Z){let X={version:2,sessionId:Y.sessionId,workspace:{kind:"local",projectPath:Y.projectPath}};return mX($,J,{acknowledge:(Q)=>Z.acknowledge(Q),setVisibleLocator:(Q)=>Q?Z.proveLocal(Q):Promise.resolve()},X)}function mJ($,J){return $.proveLocal(J)}class F4{attention;remote;remoteEpoch=0;provenLocalLocator;remoteActive=!1;constructor($){this.attention=$;this.remote=new pJ((J)=>$.acknowledge(J))}acknowledge($){return this.attention.acknowledge($)}async proveLocal($){if(this.provenLocalLocator=$,this.remoteActive)return;this.remoteEpoch+=1,this.remote.reset(),await this.attention.setVisibleLocator($)}async beginRemote($,J){this.remoteActive=!0,this.remoteEpoch+=1,this.remote.begin($,J)}beginRemoteOpening(){this.remoteActive=!0;let $=++this.remoteEpoch;return this.remote.reset(),{epoch:$,cleared:this.attention.setVisibleLocator(void 0)}}isRemoteOpeningCurrent($){return this.remoteActive&&this.remoteEpoch===$}bindRemoteOpening($,J,Y){if(!this.isRemoteOpeningCurrent($))return!1;return this.remote.begin(J,Y),!0}async endRemote(){if(!this.remoteActive)return;this.remoteActive=!1,this.remoteEpoch+=1,this.remote.reset(),await this.attention.setVisibleLocator(this.provenLocalLocator)}async updateRemote($,J){let Y=this.remoteEpoch;if(!await this.remote.update($,J)||Y!==this.remoteEpoch)return;await this.attention.setVisibleLocator(J.session?.locator)}}class pJ{acknowledge;acknowledgedView;pendingView;expectedView;constructor($){this.acknowledge=$}begin($,J){this.expectedView=$.intent==="resume"?{key:M1($.session),generation:J}:void 0}reset(){this.expectedView=void 0}async update($,J){if($.intent!=="resume"||J.status!=="ready"||!J.session||!this.expectedView||J.viewGeneration!==this.expectedView.generation||M1($.session)!==this.expectedView.key||M1($.session)!==M1(J.session))return!1;let Y=`${J.viewGeneration}\x00${M1(J.session)}`;if(Y===this.acknowledgedView||Y===this.pendingView)return!1;this.pendingView=Y;try{if(await this.acknowledge(J.session),this.expectedView?.generation!==J.viewGeneration||this.expectedView.key!==M1(J.session))return!1;return this.acknowledgedView=Y,!0}finally{if(this.pendingView===Y)this.pendingView=void 0}}}function pX($){return $.title?.trim()||`Session ${$.locator.sessionId.slice(0,8)}`}function Q6($,J){let Y=$.filter((Z)=>Z.relationType!=="subagent");if(J!=="fork")return Y;return Y.filter((Z)=>Z.archivedAt===void 0&&Z.capabilities.history.fork)}function xJ($){return $.find((J)=>J.relationType!=="subagent"&&J.locator.workspace.kind==="local")}function cJ($,J,Y=!1){let Z=pX($),X=Y?"[NEW] ":"";if($.locator.workspace.kind==="acp-remote"){let G=$.archivedAt?" · archived":"";return`${X}[remote · ${$.capabilities.connection} · history${G}] ${Z}
|
|
13
|
+
${$.displayCwd} · ${$.messageCount} messages · ${J}${$.hasErrors?" [!]":""}`}let Q=xX($.taskStatus),U=$.relationType==="subagent"?" ↳ subagent":$.relationType==="fork"?" ↳ fork":"";return`${X}[${Q}] ${Z} · ${J} | ${EX($.displayCwd)} | ${$.messageCount} 条消息${$.hasErrors?" [!]":""}${U}`}function uJ($){return{title:$==="fork"?"选择要 fork 的会话:":"选择要恢复的会话:",instructions:"(Left/Right to page | Up/Down to select | Enter to confirm | Esc to cancel)"}}function xX($){switch($){case"queued":return"QUEUED";case"running":return"RUNNING";case"failed":return"FAILED";case"cancelled":return"CANCELLED";case"interrupted":return"INTERRUPTED";case"completed":return"DONE"}}async function nJ($,J,Y,Z={}){if($.locator.workspace.kind==="acp-remote"){if(J==="fork"&&Z.newSessionId)throw Error("Custom Session IDs are unavailable for remote history forks");return await Y.openHistory($,J),"history-only"}let X=await L4($);return await Y.activateLocal(X,J),"interactive"}function G6($){if($.remoteWorkspace)throw Error("Remote history cannot enter the local compatibility path");let J=$.archivedAt!==void 0,Y=oJ($.taskCompletedAt);return U6.parse({locator:{version:2,sessionId:$.sessionId,workspace:{kind:"local",projectPath:$.projectPath}},displayCwd:$.projectPath,title:$.title,rootId:$.rootId,parentId:$.parentId,relationType:$.relationType,taskStatus:$.taskStatus,...Y!==void 0?{taskCompletedAt:Y}:{},messageCount:$.messageCount,firstMessageTime:$.firstMessageTime,lastMessageTime:$.lastMessageTime,hasErrors:$.hasErrors,archivedAt:$.archivedAt,selectedModelId:$.selectedModelId,capabilities:{connection:"local",history:{read:!0,fork:!J},turn:J?{start:!1,reason:"archived"}:{start:!0},files:J?{readText:!1,writeText:!1,browse:"none",reason:"archived"}:{readText:!0,writeText:!0,browse:"tree"},terminal:J?{mode:"none",owner:"none",reason:"archived"}:{mode:"interactive",owner:"local"}}})}async function L4($){if($.locator.workspace.kind!=="local")throw Error("Remote history cannot enter the local activation path");let J=aJ($.locator.workspace.projectPath),Y=await a0.findSessionMetadata($.locator.sessionId,J);if(!Y)throw Error("Session history is no longer available");if(Y.remoteWorkspace)throw Error("Remote history cannot enter the local activation path");return Y}function dJ($){if($.length<=8)return $;return`${$.slice(0,8)}…`}function uX($){return cX.resolve($)}function lJ($){if(!$||!iJ($))return;m0().config.actions.updateConfig({currentModelId:$})}function rJ($){if(!$)return;m0().config.actions.updateConfig({permissionMode:$})}async function K6($,J,Y){let Z=Y?await Y.listAll():(await a0.listSessions({includeSubagents:!1})).map(G6);return Q6(Z,$)}async function z6($,J,Y,Z){let{intent:X,session:Q,newSessionId:U,announceFork:G,permissionModeOverride:z}=$,K=uX(Q.projectPath);if(X==="fork"){let _=await a0.forkSession(Q.sessionId,{...U?{newSessionId:U}:{},sourceProjectPath:K,targetProjectPath:K}),F=await a0.loadSessionModelContext(_.sessionId,_.metadata.projectPath),H=[...a0.toUISafeMessages(_.messages)];if(G!==!1){let P=Date.parse(_.metadata.lastMessageTime);H.push({id:"fork-announcement-"+_.sessionId,role:"assistant",content:"Forked "+dJ(Q.sessionId)+" → "+dJ(_.sessionId),timestamp:Number.isNaN(P)?0:P})}return await Z(),rJ(z??_.metadata.permissionMode),lJ(_.metadata.selectedModelId),Y.restoreSession(_.sessionId,H,F,_.metadata.projectPath),{sessionId:_.sessionId,messages:F,projectPath:_.metadata.projectPath}}await a0.assertSessionWritable(Q.sessionId,Q.projectPath);let[O,q]=await Promise.all([a0.loadSession(Q.sessionId,Q.projectPath),a0.loadSessionModelContext(Q.sessionId,Q.projectPath)]),N=a0.toUISafeMessages(O);return await Z(),rJ(z??Q.permissionMode),lJ(Q.selectedModelId),Y.restoreSession(Q.sessionId,N,q,Q.projectPath),{sessionId:Q.sessionId,messages:q,projectPath:Q.projectPath}}var dX=N1("UI");function JY($){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 YY($){return U6.safeParse($).success}function tJ($){if(typeof $!=="object"||$===null)return!1;return Object.hasOwn($,"locator")?YY($):JY($)}function sJ($){return YY($)?$:G6($)}function lX($){return typeof $==="object"&&$!==null&&$.action==="invoke_skill"&&typeof $.skillName==="string"}function rX($){return typeof $==="object"&&$!==null&&$.action==="invoke_custom_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function aX($){return typeof $==="object"&&$!==null&&$.action==="invoke_plugin_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function iX($){return typeof $==="object"&&$!==null&&$.action==="invoke_once_model"&&typeof $.modelId==="string"&&typeof $.prompt==="string"}function oX($){return typeof $==="object"&&$!==null&&["start_goal","resume_goal"].includes(String($.action))&&typeof $.goal?.objective==="string"}function nX($){return typeof $==="object"&&$!==null&&$.action==="rewind_session"&&typeof $.sessionId==="string"&&Array.isArray($.messages)&&Array.isArray($.visibleMessages)}function tX($){if(typeof $!=="object"||$===null)return!1;let J=$.intent;if(J!=="resume"&&J!=="fork")return!1;let Y=$.action;if(Y==="select_session"){let Z=$.sessions;return Array.isArray(Z)&&Z.every(tJ)}if(Y==="activate_session"){let Z=$.session;return tJ(Z)}return!1}function sX($,J,Y,Z){switch($){case"show_theme_selector":return Y.setActiveModal("themeSelector"),!0;case"show_model_selector":return Y.setActiveModal("modelSelector"),!0;case"show_model_add_wizard":return Y.setActiveModal("modelAddWizard"),!0;case"show_permissions_manager":return Y.setActiveModal("permissionsManager"),!0;case"show_agents_manager":return Y.setActiveModal("agentsManager"),!0;case"show_skills_manager":return Y.setActiveModal("skillsManager"),!0;case"show_hooks_manager":return Y.setActiveModal("hooksManager"),!0;case"show_plugins_manager":return Y.setActiveModal("pluginsManager"),!0;case"show_follow_up_queue":return Y.setActiveModal("followUpQueue"),!0;case"show_agent_creation_wizard":return Y.setActiveModal("agentCreationWizard"),!0;case"show_session_selector":{let X=J?.sessions;return Y.showSessionSelector((X??[]).map(G6),"resume"),!0}case"session_forked":{let X=J;if(X?.action!=="restore_forked_session"||!X.sessionId||!Array.isArray(X.messages)||!Array.isArray(X.visibleMessages))return!1;return Z.restoreSession(X.sessionId,X.visibleMessages,X.messages),!0}case"session_archived":{let X=J?.session;return Z.addAssistantMessage(X?`会话 ${X.sessionId} 已归档。`:"当前会话已归档。"),J1(0),!0}case"clear_screen":return Z.clearMessages(),Z.setError(null),Z.resetTokenUsage(),Y.setTasks([]),!0;case"compact_completed":case"compact_fallback":case"compact_cancelled":{let X=J,Q=X?.compactedMessages;if(Q&&$!=="compact_cancelled")Z.setCompactedContext(Q);if(X?.usage)Z.updateTokenUsage({...$==="compact_cancelled"?{scope:"auxiliary"}:{},inputTokens:X.usage.promptTokens,outputTokens:X.usage.completionTokens,totalTokens:X.usage.totalTokens,maxContextTokens:X.maxContextTokens,cacheReadTokens:X.usage.cacheReadInputTokens??0,cacheWriteTokens:X.usage.cacheCreationInputTokens??0,costUsd:X.usage.costUsd});if($!=="compact_cancelled")Z.resetContextUsage();return!0}case"exit_application":return J1(0),!0;default:return!1}}async function w4($,J,Y,Z,X,Q,U,G,z,K,O,q,N,_,F=G$(),H,P){let{text:T}=$;if(!eJ(T))return{type:"not_slash"};let L=await $Y(T,{cwd:F,surface:"tui",workspaceRoot:F,sessionId:Q,messages:U,rewind:G,lifecycle:Q===void 0?void 0:{archiveCurrent:async()=>{return await X(),a0.archiveSession(Q,F)}},subagents:z,mcp:K,reasoning:O,serviceTier:q,responseVerbosity:N,communicationStyle:_,codeReview:H,sessionSurfaces:P,signal:Z});if(L.success&&tX(L.data)){if(L.data.action==="select_session")return J.showSessionSelector(L.data.sessions.map(sJ),L.data.intent),{type:"handled",commandResult:{success:!0}};let W=sJ(L.data.session);if(W.locator.workspace.kind==="acp-remote")return J.showSessionHistoryViewer(W,L.data.intent),{type:"handled",commandResult:{success:!0}};let b=JY(L.data.session)?L.data.session:await L4(W),A=await z6({...L.data,session:b},F,Y,X);try{if(L.data.intent==="resume")await P?.acknowledge?.(W),await P?.setVisibleLocator?.(W.locator);else await P?.setVisibleLocator?.({version:2,sessionId:A.sessionId,workspace:{kind:"local",projectPath:A.projectPath}})}catch{dX.warn("[slashCommandRouter] Task attention activation unavailable")}return{type:"handled",commandResult:{success:!0}}}if(L.success&&nX(L.data))return Y.restoreSession(L.data.sessionId,L.data.visibleMessages,L.data.messages),J.setTasks([]),{type:"handled",commandResult:{success:!0}};if(L.message){if(sX(L.message,L.data,J,Y))return{type:"handled",commandResult:{success:L.message!=="compact_cancelled"}}}if(lX(L.data)){let{skillName:W,skillArgs:b}=L.data,A=b?`Please use the "${W}" skill to help me with: ${b}`:`Please use the "${W}" skill.`;return Y.addUserMessage(A),{type:"continue_as_agent",result:{userDisplayMessage:A,agentInput:{displayText:A,text:A,images:[],parts:[{type:"text",text:A}]},userMessageAlreadyAdded:!0}}}if(rX(L.data)){let{commandName:W,processedContent:b}=L.data;Y.addUserMessage(T);let A=`# Custom Command: /${W}
|
|
14
14
|
|
|
15
15
|
The user has invoked the custom command "/${W}". Follow the instructions below to complete the task.
|
|
16
16
|
|
|
17
17
|
---
|
|
18
18
|
|
|
19
|
-
${
|
|
19
|
+
${b}
|
|
20
20
|
|
|
21
21
|
---
|
|
22
22
|
|
|
23
|
-
Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:
|
|
23
|
+
Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:T,agentInput:{displayText:T,text:A,images:[],parts:[{type:"text",text:A}]},userMessageAlreadyAdded:!0}}}if(aX(L.data)){let{commandName:W,pluginName:b,processedContent:A}=L.data;Y.addUserMessage(T);let C=`# Plugin Command: /${W}
|
|
24
24
|
|
|
25
|
-
The user has invoked the plugin command "/${W}" from plugin "${
|
|
25
|
+
The user has invoked the plugin command "/${W}" from plugin "${b}". Follow the instructions below to complete the task.
|
|
26
26
|
|
|
27
27
|
---
|
|
28
28
|
|
|
29
|
-
${
|
|
29
|
+
${A}
|
|
30
30
|
|
|
31
31
|
---
|
|
32
32
|
|
|
33
|
-
Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:M,agentInput:{displayText:M,text:y,images:[],parts:[{type:"text",text:y}]},userMessageAlreadyAdded:!0}}}if(aX(L.data)){let{modelId:W,prompt:T}=L.data;return Y.addUserMessage(T),{type:"continue_as_agent",result:{userDisplayMessage:T,agentInput:{displayText:T,text:T,images:[],parts:[{type:"text",text:T}]},userMessageAlreadyAdded:!0,onceModelId:W}}}if(iX(L.data)){let W=L.data.goal.objective;return Y.addUserMessage(M),{type:"continue_as_agent",result:{userDisplayMessage:M,agentInput:{displayText:M,text:W,images:[],parts:[{type:"text",text:W}]},userMessageAlreadyAdded:!0,goalContinuationOnly:!0}}}if(!L.success&&L.error)return Y.addAssistantMessage(`${L.error}`),{type:"handled",commandResult:{success:L.success,output:L.message,error:L.error,metadata:L.data}};let C=L.message;if(L.success&&typeof C==="string"&&C.trim()!=="")Y.addAssistantMessage(C);return{type:"handled",commandResult:{success:L.success,output:L.message,error:L.error,metadata:L.data}}}import{useMemoizedFn as p0}from"ahooks";import{useEffect as sX,useRef as T1}from"react";function eX($,J){return $.sessionId===J.sessionId&&$.workspaceRoot===J.workspaceRoot}function YY($,J){return $.factory===J.factory&&$.sessionId===J.sessionId&&$.workspaceRoot===J.workspaceRoot&&$.runtime===J.runtime&&$.systemPrompt===J.systemPrompt&&$.appendSystemPrompt===J.appendSystemPrompt&&$.maxTurns===J.maxTurns&&$.modelId===J.modelId&&$.permissionMode===J.permissionMode&&$.reasoningEffort===J.reasoningEffort&&$.serviceTier===J.serviceTier&&$.responseVerbosity===J.responseVerbosity&&$.communicationStyle===J.communicationStyle&&$.agents===J.agents}var QY=new WeakSet;function V$(){let $=new DOMException("TUI Agent lifecycle was invalidated","AbortError");return QY.add($),$}function XY($){return typeof $==="object"&&$!==null&&QY.has($)}function UY($){let J=T1(void 0),Y=T1(void 0),Z=T1(void 0),X=T1(void 0),Q=T1(0),U=T1(!1),G=T1(void 0),z=T1(void 0),K=T1(void 0),O=(I)=>{let f=K.current;if(f?.agent===I)return f.promise;let p={agent:I,promise:Promise.resolve()};return p.promise=Promise.resolve().then(()=>I.destroy()).finally(()=>{if(K.current===p)K.current=void 0}),K.current=p,p.promise},q=p0(()=>{Q.current++;let I=G.current;if(I)I.invalidated=!0;let f=z.current;if(f)f.invalidated=!0;if(X.current)return X.current.promise;let p=J.current,E=Y.current;J.current=void 0,Y.current=void 0,Z.current=void 0;let n=z.current,N0=G.current,Z0=K.current?.promise,C0,U0=(async()=>{let X0,E0=async(W$)=>{if(!W$)return;try{await W$}catch(g0){if(!XY(g0))X0??=g0}};if(await E0(n?.promise),n?.cleanupError!==void 0)X0??=n.cleanupError;if(await E0(Z0),p)await E0(O(p));if(await E0(N0?.promise),N0?.cleanupError!==void 0)X0??=N0.cleanupError;if(E)await E0(E.dispose());if(X0!==void 0)throw X0})();C0={promise:U0},X.current=C0;let S0=()=>{if(X.current===C0)X.current=void 0};return U0.then(S0,S0),U0}),N=p0(async(I)=>{let f=X.current;if(f){if(await f.promise,!U.current)throw V$();return N(I)}let p=$.workspaceRoot??Y.current?.workspaceRoot??G$(),E={sessionId:I,workspaceRoot:p};if(!U.current)throw V$();let n=G.current;if(n&&!n.invalidated&&n.generation===Q.current&&eX(n.target,E))return n.promise;if(n){let U0=q(),S0=Q.current;if(await U0,!U.current||Q.current!==S0)throw V$();return N(I)}if(Y.current&&(Y.current.sessionId!==I||Y.current.workspaceRoot!==p)){let U0=q(),S0=Q.current;if(await U0,!U.current||Q.current!==S0)throw V$();return N(I)}if(!U.current)throw V$();if(Y.current)return Y.current;let N0=Q.current,Z0,C0=Promise.resolve().then(async()=>{let U0,S0=()=>{if(!U.current||Z0.invalidated||Q.current!==N0||G.current!==Z0)throw V$()};try{S0();let X0=await a0.findSessionMetadata(I,p);S0();let E0=X0!==void 0&&(await a0.loadSession(I,p)).length>0;S0(),U0=await a$.create({sessionId:I,workspaceRoot:p,modelId:$.modelId,permissionMode:$.permissionMode??X0?.permissionMode,reasoningEffort:X0?.reasoningEffort??$.reasoningEffort,serviceTier:X0?.serviceTier??$.serviceTier,responseVerbosity:X0?.responseVerbosity??$.responseVerbosity,communicationStyle:X0?.communicationStyle??$.communicationStyle,communicationStyleDigest:X0?.communicationStyleDigest,agents:$.agents,...E0?{sessionStart:{isResume:!0,resumeSessionId:I}}:{}}),S0();let W$={sessionId:I,modelId:X0?.selectedModelId,permissionMode:X0?.permissionMode,reasoningEffort:X0?.reasoningEffort,serviceTier:X0?.serviceTier,responseVerbosity:X0?.responseVerbosity,communicationStyle:X0?.communicationStyle,communicationStyleDigest:X0?.communicationStyleDigest},g0=U0.getReasoningConfiguration().selection,O$=U0.getServiceTierConfiguration().selection,l$=U0.getResponseVerbosityConfiguration().selection,r0=U0.getCommunicationStyleConfiguration().selection;return S0(),L$().setReasoningEffort(g0),L$().setServiceTier(O$),L$().setResponseVerbosity(l$),L$().setCommunicationStyle(r0),S0(),Y.current=U0,Z.current=W$,U0}catch(X0){if(U0&&Y.current!==U0)await U0.dispose().catch((E0)=>{Z0.cleanupError??=E0});if(Z0.invalidated||Q.current!==N0||!U.current)throw V$();throw X0}finally{if(G.current===Z0)G.current=void 0}});return Z0={generation:N0,target:E,invalidated:!1,promise:C0},G.current=Z0,C0}),_=async(I,f,p,E,n)=>{let N0;if(p&&f){let Z0=I?.modelId??$.modelId,C0=I?.reasoningEffort??(E?$.reasoningEffort:p.getReasoningConfiguration().selection),U0=I?.serviceTier??(E?$.serviceTier:p.getServiceTierConfiguration().selection),S0=I?.responseVerbosity??(E?$.responseVerbosity:p.getResponseVerbosityConfiguration().selection),X0=I?.communicationStyle??(E?$.communicationStyle:p.getCommunicationStyleConfiguration().selection),E0=p.getCurrentModelId(),W$=p.getReasoningConfiguration(),g0=p.getServiceTierConfiguration(),O$=p.getResponseVerbosityConfiguration(),l$=p.getCommunicationStyleConfiguration();if($.permissionMode&&(Z.current?.sessionId!==f||Z.current.permissionMode!==$.permissionMode)){let d0=await a0.setSessionPermissionMode(f,p.workspaceRoot,$.permissionMode);n(),Z.current={...Z.current,sessionId:f,permissionMode:d0.permissionMode}}await p.refresh({modelId:Z0,...C0?{reasoningEffort:C0}:{},...U0?{serviceTier:U0}:{},...S0?{responseVerbosity:S0}:{},...X0?{communicationStyle:X0}:{}}),n();let r0=p.getCommunicationStyleConfiguration();if(r0.source!=="built-in"&&!r0.contentSha256)throw Error("Custom communication style has no provenance");let U$={...Z0&&Z0!=="inherit"&&(Z.current?.sessionId!==f||Z.current.modelId!==Z0)?{selectedModelId:Z0}:{},...C0&&(Z.current?.sessionId!==f||Z.current.reasoningEffort!==C0)?{reasoningEffort:C0}:{},...U0&&(Z.current?.sessionId!==f||Z.current.serviceTier!==U0)?{serviceTier:U0}:{},...S0&&(Z.current?.sessionId!==f||Z.current.responseVerbosity!==S0)?{responseVerbosity:S0}:{},...X0&&(Z.current?.sessionId!==f||Z.current.communicationStyle!==X0||Z.current.communicationStyleDigest!==r0.contentSha256)?{communicationStyle:X0,communicationStyleDigest:r0.source==="built-in"?null:r0.contentSha256}:{}};if(Object.keys(U$).length>0)try{let d0=await a0.updateSessionMetadata(f,p.workspaceRoot,U$);n(),Z.current={sessionId:f,modelId:d0.selectedModelId,permissionMode:d0.permissionMode,reasoningEffort:d0.reasoningEffort,serviceTier:d0.serviceTier,responseVerbosity:d0.responseVerbosity,communicationStyle:d0.communicationStyle,communicationStyleDigest:d0.communicationStyleDigest}}catch(d0){if(XY(d0))throw d0;throw await p.refresh({...E0?{modelId:E0}:{},reasoningEffort:W$.selection,serviceTier:g0.selection,responseVerbosity:O$.selection,communicationStyle:l$.selection}).catch(()=>{return}),d0}N0=await z8.createWithRuntime(p,{sessionId:f,systemPrompt:I?.systemPrompt??$.systemPrompt,appendSystemPrompt:I?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:I?.maxTurns??$.maxTurns,modelId:I?.modelId??$.modelId,permissionMode:I?.permissionMode??$.permissionMode,agents:$.agents})}else N0=await z8.create({systemPrompt:I?.systemPrompt??$.systemPrompt,appendSystemPrompt:I?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:I?.maxTurns??$.maxTurns,modelId:I?.modelId??$.modelId,permissionMode:I?.permissionMode??$.permissionMode,agents:$.agents});return N0},F=p0(async(I)=>{let f=X.current;if(f){if(await f.promise,!U.current)throw V$();return F(I)}if(!U.current)throw V$();let p=I?.sessionId??$.sessionId,E=!!I?.modelId&&I.modelId!==$.modelId,n=Y.current,N0={factory:!E&&p?"session":"standalone",sessionId:p,workspaceRoot:!E&&p?$.workspaceRoot??n?.workspaceRoot??G$():$.workspaceRoot??G$(),runtime:!E&&p&&n&&n.sessionId===p&&n.workspaceRoot===($.workspaceRoot??n.workspaceRoot)?n:void 0,systemPrompt:I?.systemPrompt??$.systemPrompt,appendSystemPrompt:I?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:I?.maxTurns??$.maxTurns,modelId:I?.modelId??$.modelId,permissionMode:I?.permissionMode??$.permissionMode,reasoningEffort:I?.reasoningEffort??$.reasoningEffort,serviceTier:I?.serviceTier??$.serviceTier,responseVerbosity:I?.responseVerbosity??$.responseVerbosity,communicationStyle:I?.communicationStyle??$.communicationStyle,agents:$.agents},Z0=z.current;if(Z0){if(!Z0.invalidated&&Z0.generation===Q.current&&YY(Z0.target,N0))return Z0.promise;Z0.invalidated=!0,Q.current++;let U$=Q.current;if(await Z0.promise.catch(()=>{return}),Z0.cleanupError!==void 0)throw Z0.cleanupError;if(!U.current||Q.current!==U$)throw V$();return F(I)}let C0=Y.current!==void 0,U0=!E&&p?await N(p):void 0;if(!U.current||U0!==void 0&&Y.current!==U0)throw V$();let S0={factory:U0?"session":"standalone",sessionId:p,workspaceRoot:U0?.workspaceRoot??$.workspaceRoot??G$(),runtime:U0,systemPrompt:I?.systemPrompt??$.systemPrompt,appendSystemPrompt:I?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:I?.maxTurns??$.maxTurns,modelId:I?.modelId??$.modelId,permissionMode:I?.permissionMode??$.permissionMode,reasoningEffort:I?.reasoningEffort??$.reasoningEffort,serviceTier:I?.serviceTier??$.serviceTier,responseVerbosity:I?.responseVerbosity??$.responseVerbosity,communicationStyle:I?.communicationStyle??$.communicationStyle,agents:$.agents},X0=z.current;if(X0&&!X0.invalidated&&X0.generation===Q.current&&YY(X0.target,S0))return X0.promise;if(X0){X0.invalidated=!0,Q.current++;let r0=Q.current;if(await X0.promise.catch(()=>{return}),X0.cleanupError!==void 0)throw X0.cleanupError;if(!U.current||Q.current!==r0)throw V$();return F(I)}let E0=Q.current,W$=J.current,g0;if(W$)J.current=void 0,g0=O(W$);let O$,l$=Promise.resolve().then(async()=>{let r0,U$=()=>{if(!U.current||O$.invalidated||Q.current!==E0||z.current!==O$||U0!==void 0&&Y.current!==U0)throw V$()};try{if(U$(),g0){try{await g0}catch(d0){throw O$.cleanupError??=d0,U$(),d0}U$()}return r0=await _(I,p,U0,C0,U$),U$(),J.current=r0,r0}catch(d0){if(r0&&J.current!==r0)await O(r0).catch((B1)=>{O$.cleanupError??=B1});if(O$.invalidated||Q.current!==E0||!U.current)throw V$();throw d0}finally{if(z.current===O$)z.current=void 0}});return O$={generation:E0,target:S0,invalidated:!1,promise:l$},z.current=O$,l$}),H=p0(async()=>{if(!$.sessionId)throw Error("No active session to rewind");return(await N($.sessionId)).listRewindCheckpoints()}),P=p0(async(I)=>{if(!$.sessionId)throw Error("No active session to rewind");let p=await(await N($.sessionId)).rewindSession(I);return await q(),p}),M=p0(async()=>{if(!$.sessionId)throw Error("No active session for subagent control");return(await N($.sessionId)).listSubagents()}),B=p0(async(I,f)=>{if(!$.sessionId)throw Error("No active session for subagent control");let p=await N($.sessionId),E=!1,n,N0=I,Z0=(U0)=>{let S0=U0.status==="completed"?U0.result?.message:U0.result?.error||U0.result?.message;D2.getState().app.actions.completeSubagentProgress(N0,U0.status==="completed",S0)},C0=p.resumeSubagent({agentId:I,prompt:f,onEvent:(U0)=>{if(U0.kind==="tool_start"&&"function"in U0.toolCall)D2.getState().app.actions.updateSubagentTool(N0,U0.toolCall.function.name)},onCompleted:(U0)=>{if(E)Z0(U0);else n=U0}});if(N0=C0.session.id,D2.getState().app.actions.startSubagentProgress(C0.session.id,C0.session.subagentType,`Resumed from ${C0.source.id}: ${C0.session.description}`),E=!0,n)Z0(n);return C0}),L=p0(async()=>{if(!$.sessionId)throw Error("No active session for MCP content");return(await N($.sessionId)).getMcpContentCatalog()}),C=p0(async(I)=>{if(!$.sessionId)throw Error("No active session for MCP content");await(await N($.sessionId)).refreshMcpContentCatalogs(I)}),W=p0(async(I,f,p)=>{if(!$.sessionId)throw Error("No active session for MCP prompts");return(await N($.sessionId)).getMcpPrompt(I,f,p)}),T=p0(async(I,f,p)=>{if(!$.sessionId)throw Error("No active session for MCP completion");return(await N($.sessionId)).completeMcpArgument(I,f,p)}),w=p0(async(I,f={})=>{if(!$.sessionId)throw Error("No active session for MCP logs");return(await N($.sessionId)).getMcpLogs(I,f)}),y=p0(async(I)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await N($.sessionId)).listMcpTasks(I)}),S=p0(async(I)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await N($.sessionId)).getMcpTask(I)}),b=p0(async(I,f)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await N($.sessionId)).cancelMcpTask(I,f)}),R=p0(async(I,f)=>{if(!$.sessionId)throw Error("No active session for MCP logging");await(await N($.sessionId)).setMcpLoggingLevel(I,f)}),A=p0(async()=>{if(!$.sessionId)throw Error("No active session for MCP instructions");return(await N($.sessionId)).getMcpInstructions()}),V=p0(async()=>{if(!$.sessionId)throw Error("No active session for reasoning effort");return(await N($.sessionId)).getReasoningConfiguration()}),o=p0(async(I)=>{if(!$.sessionId)throw Error("No active session for reasoning effort");let f=await N($.sessionId);if(f.hasTurnOwner())throw Error("Cannot switch reasoning effort while a turn is active");let p=f.getReasoningConfiguration();if(f.resolveReasoningConfiguration(I),p.selection===I)return p;await f.refresh({reasoningEffort:I});try{let E;try{E=await a0.updateSessionMetadata($.sessionId,f.workspaceRoot,{reasoningEffort:I})}catch(n){if(!(n instanceof K8)&&n.code!=="ENOENT")throw n;E=await a0.createSessionMetadata($.sessionId,f.workspaceRoot,{taskStatus:"completed",selectedModelId:f.getCurrentModelId(),reasoningEffort:I,serviceTier:f.getServiceTierConfiguration().selection,responseVerbosity:f.getResponseVerbosityConfiguration().selection,communicationStyle:f.getCommunicationStyleConfiguration().selection})}return Z.current={sessionId:$.sessionId,modelId:E.selectedModelId,permissionMode:E.permissionMode,reasoningEffort:E.reasoningEffort,serviceTier:E.serviceTier,responseVerbosity:E.responseVerbosity,communicationStyle:E.communicationStyle,communicationStyleDigest:E.communicationStyleDigest},L$().setReasoningEffort(I),f.getReasoningConfiguration()}catch(E){throw await f.refresh({reasoningEffort:p.selection}),E}}),d=p0(async()=>{if(!$.sessionId)throw Error("No active session for service tier");return(await N($.sessionId)).getServiceTierConfiguration()}),J0=p0(async(I)=>{if(!$.sessionId)throw Error("No active session for service tier");let f=await N($.sessionId);if(f.hasTurnOwner())throw Error("Cannot switch service tier while a turn is active");let p=f.getServiceTierConfiguration();if(f.resolveServiceTierConfiguration(I),p.selection===I)return p;await f.refresh({serviceTier:I});try{let E;try{E=await a0.updateSessionMetadata($.sessionId,f.workspaceRoot,{serviceTier:I})}catch(n){if(!(n instanceof K8)&&n.code!=="ENOENT")throw n;E=await a0.createSessionMetadata($.sessionId,f.workspaceRoot,{taskStatus:"completed",selectedModelId:f.getCurrentModelId(),reasoningEffort:f.getReasoningConfiguration().selection,serviceTier:I,responseVerbosity:f.getResponseVerbosityConfiguration().selection,communicationStyle:f.getCommunicationStyleConfiguration().selection})}return Z.current={sessionId:$.sessionId,modelId:E.selectedModelId,permissionMode:E.permissionMode,reasoningEffort:E.reasoningEffort,serviceTier:E.serviceTier,responseVerbosity:E.responseVerbosity,communicationStyle:E.communicationStyle,communicationStyleDigest:E.communicationStyleDigest},L$().setServiceTier(I),f.getServiceTierConfiguration()}catch(E){throw await f.refresh({serviceTier:p.selection}),E}}),Q0=p0(async()=>{if(!$.sessionId)throw Error("No active session for response verbosity");return(await N($.sessionId)).getResponseVerbosityConfiguration()}),q0=p0(async(I)=>{if(!$.sessionId)throw Error("No active session for response verbosity");let f=await N($.sessionId);if(f.hasTurnOwner())throw Error("Cannot switch response verbosity while a turn is active");let p=f.getResponseVerbosityConfiguration();if(f.resolveResponseVerbosityConfiguration(I),p.selection===I)return p;await f.refresh({responseVerbosity:I});try{let E;try{E=await a0.updateSessionMetadata($.sessionId,f.workspaceRoot,{responseVerbosity:I})}catch(n){if(!(n instanceof K8)&&n.code!=="ENOENT")throw n;E=await a0.createSessionMetadata($.sessionId,f.workspaceRoot,{taskStatus:"completed",selectedModelId:f.getCurrentModelId(),reasoningEffort:f.getReasoningConfiguration().selection,serviceTier:f.getServiceTierConfiguration().selection,responseVerbosity:I,communicationStyle:f.getCommunicationStyleConfiguration().selection})}return Z.current={sessionId:$.sessionId,modelId:E.selectedModelId,permissionMode:E.permissionMode,reasoningEffort:E.reasoningEffort,serviceTier:E.serviceTier,responseVerbosity:E.responseVerbosity,communicationStyle:E.communicationStyle,communicationStyleDigest:E.communicationStyleDigest},L$().setResponseVerbosity(I),f.getResponseVerbosityConfiguration()}catch(E){throw await f.refresh({responseVerbosity:p.selection}),E}}),a=p0(async()=>{if(!$.sessionId)throw Error("No active session for communication style");return(await N($.sessionId)).getCommunicationStyleConfiguration()}),D=p0(async(I)=>{if(!$.sessionId)throw Error("No active session for communication style");let f=await N($.sessionId);if(f.hasTurnOwner())throw Error("Cannot switch communication style while a turn is active");let p=f.getCommunicationStyleConfiguration(),E=f.resolveCommunicationStyleConfiguration(I);if(E.source!=="built-in"&&!E.contentSha256)throw Error("Custom communication style has no provenance");if(p.selection===I)return p;await f.refresh({communicationStyle:I});try{let n;try{n=await a0.updateSessionMetadata($.sessionId,f.workspaceRoot,{communicationStyle:I,communicationStyleDigest:E.source==="built-in"?null:E.contentSha256})}catch(N0){if(!(N0 instanceof K8)&&N0.code!=="ENOENT")throw N0;n=await a0.createSessionMetadata($.sessionId,f.workspaceRoot,{taskStatus:"completed",selectedModelId:f.getCurrentModelId(),reasoningEffort:f.getReasoningConfiguration().selection,serviceTier:f.getServiceTierConfiguration().selection,responseVerbosity:f.getResponseVerbosityConfiguration().selection,communicationStyle:I,...E.source!=="built-in"&&E.contentSha256?{communicationStyleDigest:E.contentSha256}:{}})}return Z.current={sessionId:$.sessionId,modelId:n.selectedModelId,permissionMode:n.permissionMode,reasoningEffort:n.reasoningEffort,serviceTier:n.serviceTier,responseVerbosity:n.responseVerbosity,communicationStyle:n.communicationStyle,communicationStyleDigest:n.communicationStyleDigest},L$().setCommunicationStyle(I),f.getCommunicationStyleConfiguration()}catch(n){throw await f.refresh({communicationStyle:p.selection}),n}}),v=p0(async(I)=>{if(!Y.current)return{accepted:!1,queued:0,reason:"no_active_turn"};return Y.current.enqueueSteering(I,{allowBeforeTurn:!0})}),K0=p0(async(I,f)=>{let p=$.sessionId;if(!p)return{accepted:!1,queued:0,reason:"no_active_turn"};return(await N(p)).enqueueSteering(I,{allowBeforeTurn:!0,...f})}),h=p0(async()=>{let I=$.sessionId;if(!I)throw Error("Follow-up queue requires a Session");return(await N(I)).getFollowUpQueueSnapshot()}),x=p0(async(I)=>{let f=$.sessionId;if(!f)throw Error("Follow-up queue requires a Session");return(await N(f)).mutateFollowUpQueue(I)}),l=p0(async(I,f)=>{let p=$.sessionId;if(!p)throw Error("Side conversation requires a Session");return(await N(p)).askSideQuestion(I,{signal:f,systemPrompt:$.systemPrompt,appendSystemPrompt:$.appendSystemPrompt})}),H0=p0(async(I,f)=>{let p=$.sessionId;if(!p)throw Error("User shell command requires a Session");return(await N(p)).executeUserShellCommand(I,f)}),F0=p0(()=>Y.current?.getTurnRecoveryAssessment()??{state:"none"}),T0=p0(async(I,f)=>{let p=$.sessionId;if(!p)throw Error("Code review requires a Session");let E=await N(p);await q6.recoverInterrupted(E.workspaceRoot,p,E);let n=await q6.start({sessionId:p,projectPath:E.workspaceRoot,runtime:E,request:I,signal:f}),N0=await n.completion,Z0=(await q6.list(E.workspaceRoot,p)).find((C0)=>C0.start.reviewId===n.reviewId);if(!Z0)throw Error(`Review not found after completion: ${n.reviewId}`);return{reviewId:n.reviewId,status:N0.status,findings:N0.findings.length,content:ZY(Z0.start,N0)}});return sX(()=>{U.current=!0;let f=_6(async()=>{U.current=!1,await q()});return()=>{f(),U.current=!1,q().catch(()=>{return})}},[q]),{agentRef:J,createAgent:F,cleanupAgent:q,steerActiveTurn:v,enqueueSessionInput:K0,getFollowUpQueue:h,mutateFollowUpQueue:x,askSideQuestion:l,runCodeReview:T0,executeUserShellCommand:H0,getTurnRecoveryAssessment:F0,listRewindCheckpoints:H,rewindSession:P,listSubagents:M,resumeSubagent:B,getMcpContentCatalog:L,refreshMcpContentCatalogs:C,getMcpPrompt:W,completeMcpArgument:T,listMcpTasks:y,getMcpTask:S,cancelMcpTask:b,getMcpLogs:w,setMcpLoggingLevel:R,getMcpInstructions:A,getReasoningConfiguration:V,setReasoningEffort:o,getServiceTierConfiguration:d,setServiceTier:J0,getResponseVerbosityConfiguration:Q0,setResponseVerbosity:q0,getCommunicationStyleConfiguration:a,setCommunicationStyle:D}}import{useMemoizedFn as c2}from"ahooks";import{useEffect as $Z,useRef as O6}from"react";function GY($){let J=0;for(let Y of $)if(Y===`
|
|
34
|
-
`)J++;return J}function
|
|
33
|
+
Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:T,agentInput:{displayText:T,text:C,images:[],parts:[{type:"text",text:C}]},userMessageAlreadyAdded:!0}}}if(iX(L.data)){let{modelId:W,prompt:b}=L.data;return Y.addUserMessage(b),{type:"continue_as_agent",result:{userDisplayMessage:b,agentInput:{displayText:b,text:b,images:[],parts:[{type:"text",text:b}]},userMessageAlreadyAdded:!0,onceModelId:W}}}if(oX(L.data)){let W=L.data.goal.objective;return Y.addUserMessage(T),{type:"continue_as_agent",result:{userDisplayMessage:T,agentInput:{displayText:T,text:W,images:[],parts:[{type:"text",text:W}]},userMessageAlreadyAdded:!0,goalContinuationOnly:!0}}}if(!L.success&&L.error)return Y.addAssistantMessage(`${L.error}`),{type:"handled",commandResult:{success:L.success,output:L.message,error:L.error,metadata:L.data}};let R=L.message;if(L.success&&typeof R==="string"&&R.trim()!=="")Y.addAssistantMessage(R);return{type:"handled",commandResult:{success:L.success,output:L.message,error:L.error,metadata:L.data}}}import{useMemoizedFn as p0}from"ahooks";import{useEffect as eX,useRef as T1}from"react";function $Z($,J){return $.sessionId===J.sessionId&&$.workspaceRoot===J.workspaceRoot}function XY($,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 UY=new WeakSet;function j$(){let $=new DOMException("TUI Agent lifecycle was invalidated","AbortError");return UY.add($),$}function ZY($){return typeof $==="object"&&$!==null&&UY.has($)}function GY($){let J=T1(void 0),Y=T1(void 0),Z=T1(void 0),X=T1(void 0),Q=T1(0),U=T1(!1),G=T1(void 0),z=T1(void 0),K=T1(void 0),O=(I)=>{let f=K.current;if(f?.agent===I)return f.promise;let p={agent:I,promise:Promise.resolve()};return p.promise=Promise.resolve().then(()=>I.destroy()).finally(()=>{if(K.current===p)K.current=void 0}),K.current=p,p.promise},q=p0(()=>{Q.current++;let I=G.current;if(I)I.invalidated=!0;let f=z.current;if(f)f.invalidated=!0;if(X.current)return X.current.promise;let p=J.current,E=Y.current;J.current=void 0,Y.current=void 0,Z.current=void 0;let n=z.current,H0=G.current,Z0=K.current?.promise,C0,U0=(async()=>{let X0,E0=async(W$)=>{if(!W$)return;try{await W$}catch(g0){if(!ZY(g0))X0??=g0}};if(await E0(n?.promise),n?.cleanupError!==void 0)X0??=n.cleanupError;if(await E0(Z0),p)await E0(O(p));if(await E0(H0?.promise),H0?.cleanupError!==void 0)X0??=H0.cleanupError;if(E)await E0(E.dispose());if(X0!==void 0)throw X0})();C0={promise:U0},X.current=C0;let S0=()=>{if(X.current===C0)X.current=void 0};return U0.then(S0,S0),U0}),N=p0(async(I)=>{let f=X.current;if(f){if(await f.promise,!U.current)throw j$();return N(I)}let p=$.workspaceRoot??Y.current?.workspaceRoot??G$(),E={sessionId:I,workspaceRoot:p};if(!U.current)throw j$();let n=G.current;if(n&&!n.invalidated&&n.generation===Q.current&&$Z(n.target,E))return n.promise;if(n){let U0=q(),S0=Q.current;if(await U0,!U.current||Q.current!==S0)throw j$();return N(I)}if(Y.current&&(Y.current.sessionId!==I||Y.current.workspaceRoot!==p)){let U0=q(),S0=Q.current;if(await U0,!U.current||Q.current!==S0)throw j$();return N(I)}if(!U.current)throw j$();if(Y.current)return Y.current;let H0=Q.current,Z0,C0=Promise.resolve().then(async()=>{let U0,S0=()=>{if(!U.current||Z0.invalidated||Q.current!==H0||G.current!==Z0)throw j$()};try{S0();let X0=await a0.findSessionMetadata(I,p);S0();let E0=X0!==void 0&&(await a0.loadSession(I,p)).length>0;S0(),U0=await a$.create({sessionId:I,workspaceRoot:p,modelId:$.modelId,permissionMode:$.permissionMode??X0?.permissionMode,reasoningEffort:X0?.reasoningEffort??$.reasoningEffort,serviceTier:X0?.serviceTier??$.serviceTier,responseVerbosity:X0?.responseVerbosity??$.responseVerbosity,communicationStyle:X0?.communicationStyle??$.communicationStyle,communicationStyleDigest:X0?.communicationStyleDigest,agents:$.agents,...E0?{sessionStart:{isResume:!0,resumeSessionId:I}}:{}}),S0();let W$={sessionId:I,modelId:X0?.selectedModelId,permissionMode:X0?.permissionMode,reasoningEffort:X0?.reasoningEffort,serviceTier:X0?.serviceTier,responseVerbosity:X0?.responseVerbosity,communicationStyle:X0?.communicationStyle,communicationStyleDigest:X0?.communicationStyleDigest},g0=U0.getReasoningConfiguration().selection,O$=U0.getServiceTierConfiguration().selection,l$=U0.getResponseVerbosityConfiguration().selection,r0=U0.getCommunicationStyleConfiguration().selection;return S0(),L$().setReasoningEffort(g0),L$().setServiceTier(O$),L$().setResponseVerbosity(l$),L$().setCommunicationStyle(r0),S0(),Y.current=U0,Z.current=W$,U0}catch(X0){if(U0&&Y.current!==U0)await U0.dispose().catch((E0)=>{Z0.cleanupError??=E0});if(Z0.invalidated||Q.current!==H0||!U.current)throw j$();throw X0}finally{if(G.current===Z0)G.current=void 0}});return Z0={generation:H0,target:E,invalidated:!1,promise:C0},G.current=Z0,C0}),_=async(I,f,p,E,n)=>{let H0;if(p&&f){let Z0=I?.modelId??$.modelId,C0=I?.reasoningEffort??(E?$.reasoningEffort:p.getReasoningConfiguration().selection),U0=I?.serviceTier??(E?$.serviceTier:p.getServiceTierConfiguration().selection),S0=I?.responseVerbosity??(E?$.responseVerbosity:p.getResponseVerbosityConfiguration().selection),X0=I?.communicationStyle??(E?$.communicationStyle:p.getCommunicationStyleConfiguration().selection),E0=p.getCurrentModelId(),W$=p.getReasoningConfiguration(),g0=p.getServiceTierConfiguration(),O$=p.getResponseVerbosityConfiguration(),l$=p.getCommunicationStyleConfiguration();if($.permissionMode&&(Z.current?.sessionId!==f||Z.current.permissionMode!==$.permissionMode)){let d0=await a0.setSessionPermissionMode(f,p.workspaceRoot,$.permissionMode);n(),Z.current={...Z.current,sessionId:f,permissionMode:d0.permissionMode}}await p.refresh({modelId:Z0,...C0?{reasoningEffort:C0}:{},...U0?{serviceTier:U0}:{},...S0?{responseVerbosity:S0}:{},...X0?{communicationStyle:X0}:{}}),n();let r0=p.getCommunicationStyleConfiguration();if(r0.source!=="built-in"&&!r0.contentSha256)throw Error("Custom communication style has no provenance");let U$={...Z0&&Z0!=="inherit"&&(Z.current?.sessionId!==f||Z.current.modelId!==Z0)?{selectedModelId:Z0}:{},...C0&&(Z.current?.sessionId!==f||Z.current.reasoningEffort!==C0)?{reasoningEffort:C0}:{},...U0&&(Z.current?.sessionId!==f||Z.current.serviceTier!==U0)?{serviceTier:U0}:{},...S0&&(Z.current?.sessionId!==f||Z.current.responseVerbosity!==S0)?{responseVerbosity:S0}:{},...X0&&(Z.current?.sessionId!==f||Z.current.communicationStyle!==X0||Z.current.communicationStyleDigest!==r0.contentSha256)?{communicationStyle:X0,communicationStyleDigest:r0.source==="built-in"?null:r0.contentSha256}:{}};if(Object.keys(U$).length>0)try{let d0=await a0.updateSessionMetadata(f,p.workspaceRoot,U$);n(),Z.current={sessionId:f,modelId:d0.selectedModelId,permissionMode:d0.permissionMode,reasoningEffort:d0.reasoningEffort,serviceTier:d0.serviceTier,responseVerbosity:d0.responseVerbosity,communicationStyle:d0.communicationStyle,communicationStyleDigest:d0.communicationStyleDigest}}catch(d0){if(ZY(d0))throw d0;throw await p.refresh({...E0?{modelId:E0}:{},reasoningEffort:W$.selection,serviceTier:g0.selection,responseVerbosity:O$.selection,communicationStyle:l$.selection}).catch(()=>{return}),d0}H0=await z8.createWithRuntime(p,{sessionId:f,systemPrompt:I?.systemPrompt??$.systemPrompt,appendSystemPrompt:I?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:I?.maxTurns??$.maxTurns,modelId:I?.modelId??$.modelId,permissionMode:I?.permissionMode??$.permissionMode,agents:$.agents})}else H0=await z8.create({systemPrompt:I?.systemPrompt??$.systemPrompt,appendSystemPrompt:I?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:I?.maxTurns??$.maxTurns,modelId:I?.modelId??$.modelId,permissionMode:I?.permissionMode??$.permissionMode,agents:$.agents});return H0},F=p0(async(I)=>{let f=X.current;if(f){if(await f.promise,!U.current)throw j$();return F(I)}if(!U.current)throw j$();let p=I?.sessionId??$.sessionId,E=!!I?.modelId&&I.modelId!==$.modelId,n=Y.current,H0={factory:!E&&p?"session":"standalone",sessionId:p,workspaceRoot:!E&&p?$.workspaceRoot??n?.workspaceRoot??G$():$.workspaceRoot??G$(),runtime:!E&&p&&n&&n.sessionId===p&&n.workspaceRoot===($.workspaceRoot??n.workspaceRoot)?n:void 0,systemPrompt:I?.systemPrompt??$.systemPrompt,appendSystemPrompt:I?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:I?.maxTurns??$.maxTurns,modelId:I?.modelId??$.modelId,permissionMode:I?.permissionMode??$.permissionMode,reasoningEffort:I?.reasoningEffort??$.reasoningEffort,serviceTier:I?.serviceTier??$.serviceTier,responseVerbosity:I?.responseVerbosity??$.responseVerbosity,communicationStyle:I?.communicationStyle??$.communicationStyle,agents:$.agents},Z0=z.current;if(Z0){if(!Z0.invalidated&&Z0.generation===Q.current&&XY(Z0.target,H0))return Z0.promise;Z0.invalidated=!0,Q.current++;let U$=Q.current;if(await Z0.promise.catch(()=>{return}),Z0.cleanupError!==void 0)throw Z0.cleanupError;if(!U.current||Q.current!==U$)throw j$();return F(I)}let C0=Y.current!==void 0,U0=!E&&p?await N(p):void 0;if(!U.current||U0!==void 0&&Y.current!==U0)throw j$();let S0={factory:U0?"session":"standalone",sessionId:p,workspaceRoot:U0?.workspaceRoot??$.workspaceRoot??G$(),runtime:U0,systemPrompt:I?.systemPrompt??$.systemPrompt,appendSystemPrompt:I?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:I?.maxTurns??$.maxTurns,modelId:I?.modelId??$.modelId,permissionMode:I?.permissionMode??$.permissionMode,reasoningEffort:I?.reasoningEffort??$.reasoningEffort,serviceTier:I?.serviceTier??$.serviceTier,responseVerbosity:I?.responseVerbosity??$.responseVerbosity,communicationStyle:I?.communicationStyle??$.communicationStyle,agents:$.agents},X0=z.current;if(X0&&!X0.invalidated&&X0.generation===Q.current&&XY(X0.target,S0))return X0.promise;if(X0){X0.invalidated=!0,Q.current++;let r0=Q.current;if(await X0.promise.catch(()=>{return}),X0.cleanupError!==void 0)throw X0.cleanupError;if(!U.current||Q.current!==r0)throw j$();return F(I)}let E0=Q.current,W$=J.current,g0;if(W$)J.current=void 0,g0=O(W$);let O$,l$=Promise.resolve().then(async()=>{let r0,U$=()=>{if(!U.current||O$.invalidated||Q.current!==E0||z.current!==O$||U0!==void 0&&Y.current!==U0)throw j$()};try{if(U$(),g0){try{await g0}catch(d0){throw O$.cleanupError??=d0,U$(),d0}U$()}return r0=await _(I,p,U0,C0,U$),U$(),J.current=r0,r0}catch(d0){if(r0&&J.current!==r0)await O(r0).catch((B1)=>{O$.cleanupError??=B1});if(O$.invalidated||Q.current!==E0||!U.current)throw j$();throw d0}finally{if(z.current===O$)z.current=void 0}});return O$={generation:E0,target:S0,invalidated:!1,promise:l$},z.current=O$,l$}),H=p0(async()=>{if(!$.sessionId)throw Error("No active session to rewind");return(await N($.sessionId)).listRewindCheckpoints()}),P=p0(async(I)=>{if(!$.sessionId)throw Error("No active session to rewind");let p=await(await N($.sessionId)).rewindSession(I);return await q(),p}),T=p0(async()=>{if(!$.sessionId)throw Error("No active session for subagent control");return(await N($.sessionId)).listSubagents()}),w=p0(async(I,f)=>{if(!$.sessionId)throw Error("No active session for subagent control");let p=await N($.sessionId),E=!1,n,H0=I,Z0=(U0)=>{let S0=U0.status==="completed"?U0.result?.message:U0.result?.error||U0.result?.message;D2.getState().app.actions.completeSubagentProgress(H0,U0.status==="completed",S0)},C0=p.resumeSubagent({agentId:I,prompt:f,onEvent:(U0)=>{if(U0.kind==="tool_start"&&"function"in U0.toolCall)D2.getState().app.actions.updateSubagentTool(H0,U0.toolCall.function.name)},onCompleted:(U0)=>{if(E)Z0(U0);else n=U0}});if(H0=C0.session.id,D2.getState().app.actions.startSubagentProgress(C0.session.id,C0.session.subagentType,`Resumed from ${C0.source.id}: ${C0.session.description}`),E=!0,n)Z0(n);return C0}),L=p0(async()=>{if(!$.sessionId)throw Error("No active session for MCP content");return(await N($.sessionId)).getMcpContentCatalog()}),R=p0(async(I)=>{if(!$.sessionId)throw Error("No active session for MCP content");await(await N($.sessionId)).refreshMcpContentCatalogs(I)}),W=p0(async(I,f,p)=>{if(!$.sessionId)throw Error("No active session for MCP prompts");return(await N($.sessionId)).getMcpPrompt(I,f,p)}),b=p0(async(I,f,p)=>{if(!$.sessionId)throw Error("No active session for MCP completion");return(await N($.sessionId)).completeMcpArgument(I,f,p)}),A=p0(async(I,f={})=>{if(!$.sessionId)throw Error("No active session for MCP logs");return(await N($.sessionId)).getMcpLogs(I,f)}),C=p0(async(I)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await N($.sessionId)).listMcpTasks(I)}),S=p0(async(I)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await N($.sessionId)).getMcpTask(I)}),M=p0(async(I,f)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await N($.sessionId)).cancelMcpTask(I,f)}),y=p0(async(I,f)=>{if(!$.sessionId)throw Error("No active session for MCP logging");await(await N($.sessionId)).setMcpLoggingLevel(I,f)}),B=p0(async()=>{if(!$.sessionId)throw Error("No active session for MCP instructions");return(await N($.sessionId)).getMcpInstructions()}),V=p0(async()=>{if(!$.sessionId)throw Error("No active session for reasoning effort");return(await N($.sessionId)).getReasoningConfiguration()}),o=p0(async(I)=>{if(!$.sessionId)throw Error("No active session for reasoning effort");let f=await N($.sessionId);if(f.hasTurnOwner())throw Error("Cannot switch reasoning effort while a turn is active");let p=f.getReasoningConfiguration();if(f.resolveReasoningConfiguration(I),p.selection===I)return p;await f.refresh({reasoningEffort:I});try{let E;try{E=await a0.updateSessionMetadata($.sessionId,f.workspaceRoot,{reasoningEffort:I})}catch(n){if(!(n instanceof K8)&&n.code!=="ENOENT")throw n;E=await a0.createSessionMetadata($.sessionId,f.workspaceRoot,{taskStatus:"completed",selectedModelId:f.getCurrentModelId(),reasoningEffort:I,serviceTier:f.getServiceTierConfiguration().selection,responseVerbosity:f.getResponseVerbosityConfiguration().selection,communicationStyle:f.getCommunicationStyleConfiguration().selection})}return Z.current={sessionId:$.sessionId,modelId:E.selectedModelId,permissionMode:E.permissionMode,reasoningEffort:E.reasoningEffort,serviceTier:E.serviceTier,responseVerbosity:E.responseVerbosity,communicationStyle:E.communicationStyle,communicationStyleDigest:E.communicationStyleDigest},L$().setReasoningEffort(I),f.getReasoningConfiguration()}catch(E){throw await f.refresh({reasoningEffort:p.selection}),E}}),a=p0(async()=>{if(!$.sessionId)throw Error("No active session for service tier");return(await N($.sessionId)).getServiceTierConfiguration()}),Y0=p0(async(I)=>{if(!$.sessionId)throw Error("No active session for service tier");let f=await N($.sessionId);if(f.hasTurnOwner())throw Error("Cannot switch service tier while a turn is active");let p=f.getServiceTierConfiguration();if(f.resolveServiceTierConfiguration(I),p.selection===I)return p;await f.refresh({serviceTier:I});try{let E;try{E=await a0.updateSessionMetadata($.sessionId,f.workspaceRoot,{serviceTier:I})}catch(n){if(!(n instanceof K8)&&n.code!=="ENOENT")throw n;E=await a0.createSessionMetadata($.sessionId,f.workspaceRoot,{taskStatus:"completed",selectedModelId:f.getCurrentModelId(),reasoningEffort:f.getReasoningConfiguration().selection,serviceTier:I,responseVerbosity:f.getResponseVerbosityConfiguration().selection,communicationStyle:f.getCommunicationStyleConfiguration().selection})}return Z.current={sessionId:$.sessionId,modelId:E.selectedModelId,permissionMode:E.permissionMode,reasoningEffort:E.reasoningEffort,serviceTier:E.serviceTier,responseVerbosity:E.responseVerbosity,communicationStyle:E.communicationStyle,communicationStyleDigest:E.communicationStyleDigest},L$().setServiceTier(I),f.getServiceTierConfiguration()}catch(E){throw await f.refresh({serviceTier:p.selection}),E}}),Q0=p0(async()=>{if(!$.sessionId)throw Error("No active session for response verbosity");return(await N($.sessionId)).getResponseVerbosityConfiguration()}),N0=p0(async(I)=>{if(!$.sessionId)throw Error("No active session for response verbosity");let f=await N($.sessionId);if(f.hasTurnOwner())throw Error("Cannot switch response verbosity while a turn is active");let p=f.getResponseVerbosityConfiguration();if(f.resolveResponseVerbosityConfiguration(I),p.selection===I)return p;await f.refresh({responseVerbosity:I});try{let E;try{E=await a0.updateSessionMetadata($.sessionId,f.workspaceRoot,{responseVerbosity:I})}catch(n){if(!(n instanceof K8)&&n.code!=="ENOENT")throw n;E=await a0.createSessionMetadata($.sessionId,f.workspaceRoot,{taskStatus:"completed",selectedModelId:f.getCurrentModelId(),reasoningEffort:f.getReasoningConfiguration().selection,serviceTier:f.getServiceTierConfiguration().selection,responseVerbosity:I,communicationStyle:f.getCommunicationStyleConfiguration().selection})}return Z.current={sessionId:$.sessionId,modelId:E.selectedModelId,permissionMode:E.permissionMode,reasoningEffort:E.reasoningEffort,serviceTier:E.serviceTier,responseVerbosity:E.responseVerbosity,communicationStyle:E.communicationStyle,communicationStyleDigest:E.communicationStyleDigest},L$().setResponseVerbosity(I),f.getResponseVerbosityConfiguration()}catch(E){throw await f.refresh({responseVerbosity:p.selection}),E}}),d=p0(async()=>{if(!$.sessionId)throw Error("No active session for communication style");return(await N($.sessionId)).getCommunicationStyleConfiguration()}),D=p0(async(I)=>{if(!$.sessionId)throw Error("No active session for communication style");let f=await N($.sessionId);if(f.hasTurnOwner())throw Error("Cannot switch communication style while a turn is active");let p=f.getCommunicationStyleConfiguration(),E=f.resolveCommunicationStyleConfiguration(I);if(E.source!=="built-in"&&!E.contentSha256)throw Error("Custom communication style has no provenance");if(p.selection===I)return p;await f.refresh({communicationStyle:I});try{let n;try{n=await a0.updateSessionMetadata($.sessionId,f.workspaceRoot,{communicationStyle:I,communicationStyleDigest:E.source==="built-in"?null:E.contentSha256})}catch(H0){if(!(H0 instanceof K8)&&H0.code!=="ENOENT")throw H0;n=await a0.createSessionMetadata($.sessionId,f.workspaceRoot,{taskStatus:"completed",selectedModelId:f.getCurrentModelId(),reasoningEffort:f.getReasoningConfiguration().selection,serviceTier:f.getServiceTierConfiguration().selection,responseVerbosity:f.getResponseVerbosityConfiguration().selection,communicationStyle:I,...E.source!=="built-in"&&E.contentSha256?{communicationStyleDigest:E.contentSha256}:{}})}return Z.current={sessionId:$.sessionId,modelId:n.selectedModelId,permissionMode:n.permissionMode,reasoningEffort:n.reasoningEffort,serviceTier:n.serviceTier,responseVerbosity:n.responseVerbosity,communicationStyle:n.communicationStyle,communicationStyleDigest:n.communicationStyleDigest},L$().setCommunicationStyle(I),f.getCommunicationStyleConfiguration()}catch(n){throw await f.refresh({communicationStyle:p.selection}),n}}),v=p0(async(I)=>{if(!Y.current)return{accepted:!1,queued:0,reason:"no_active_turn"};return Y.current.enqueueSteering(I,{allowBeforeTurn:!0})}),K0=p0(async(I,f)=>{let p=$.sessionId;if(!p)return{accepted:!1,queued:0,reason:"no_active_turn"};return(await N(p)).enqueueSteering(I,{allowBeforeTurn:!0,...f})}),h=p0(async()=>{let I=$.sessionId;if(!I)throw Error("Follow-up queue requires a Session");return(await N(I)).getFollowUpQueueSnapshot()}),x=p0(async(I)=>{let f=$.sessionId;if(!f)throw Error("Follow-up queue requires a Session");return(await N(f)).mutateFollowUpQueue(I)}),l=p0(async(I,f)=>{let p=$.sessionId;if(!p)throw Error("Side conversation requires a Session");return(await N(p)).askSideQuestion(I,{signal:f,systemPrompt:$.systemPrompt,appendSystemPrompt:$.appendSystemPrompt})}),W0=p0(async(I,f)=>{let p=$.sessionId;if(!p)throw Error("User shell command requires a Session");return(await N(p)).executeUserShellCommand(I,f)}),L0=p0(()=>Y.current?.getTurnRecoveryAssessment()??{state:"none"}),T0=p0(async(I,f)=>{let p=$.sessionId;if(!p)throw Error("Code review requires a Session");let E=await N(p);await q6.recoverInterrupted(E.workspaceRoot,p,E);let n=await q6.start({sessionId:p,projectPath:E.workspaceRoot,runtime:E,request:I,signal:f}),H0=await n.completion,Z0=(await q6.list(E.workspaceRoot,p)).find((C0)=>C0.start.reviewId===n.reviewId);if(!Z0)throw Error(`Review not found after completion: ${n.reviewId}`);return{reviewId:n.reviewId,status:H0.status,findings:H0.findings.length,content:QY(Z0.start,H0)}});return eX(()=>{U.current=!0;let f=_6(async()=>{U.current=!1,await q()});return()=>{f(),U.current=!1,q().catch(()=>{return})}},[q]),{agentRef:J,createAgent:F,cleanupAgent:q,steerActiveTurn:v,enqueueSessionInput:K0,getFollowUpQueue:h,mutateFollowUpQueue:x,askSideQuestion:l,runCodeReview:T0,executeUserShellCommand:W0,getTurnRecoveryAssessment:L0,listRewindCheckpoints:H,rewindSession:P,listSubagents:T,resumeSubagent:w,getMcpContentCatalog:L,refreshMcpContentCatalogs:R,getMcpPrompt:W,completeMcpArgument:b,listMcpTasks:C,getMcpTask:S,cancelMcpTask:M,getMcpLogs:A,setMcpLoggingLevel:y,getMcpInstructions:B,getReasoningConfiguration:V,setReasoningEffort:o,getServiceTierConfiguration:a,setServiceTier:Y0,getResponseVerbosityConfiguration:Q0,setResponseVerbosity:N0,getCommunicationStyleConfiguration:d,setCommunicationStyle:D}}import{useMemoizedFn as c2}from"ahooks";import{useEffect as JZ,useRef as O6}from"react";function KY($){let J=0;for(let Y of $)if(Y===`
|
|
34
|
+
`)J++;return J}function zY($,J){let Y=J?.flushTimeout??300,Z=J?.minLinesToFlush??5,X=J?.minCharsToFlush??400,Q=O6(""),U=O6(null),G=O6(""),z=O6(null),K=c2(()=>{if(Q.current){let H=Q.current,P=$.appendAssistantContent(H);o8(P,H),Q.current=""}if(U.current)clearTimeout(U.current),U.current=null}),O=c2(()=>{if(G.current)$.appendThinkingContent(G.current),G.current="";if(z.current)clearTimeout(z.current),z.current=null}),q=c2((H)=>{Q.current+=H;let P=Q.current;if(KY(P)>=Z||P.length>=X){K();return}if(!U.current)U.current=setTimeout(K,Y)}),N=c2((H)=>{G.current+=H;let P=G.current;if(KY(P)>=Z||P.length>=X){O();return}if(!z.current)z.current=setTimeout(O,Y)}),_=c2(()=>{if(Q.current="",U.current)clearTimeout(U.current),U.current=null;if(G.current="",z.current)clearTimeout(z.current),z.current=null}),F=c2(()=>{if(U.current)clearTimeout(U.current),U.current=null;if(z.current)clearTimeout(z.current),z.current=null;let H=Q.current,P=G.current;return Q.current="",G.current="",{extraContent:H,extraThinking:P}});return JZ(()=>{return()=>{_()}},[_]),{batchAppendContent:q,batchAppendThinking:N,flushContentBuffer:K,flushThinkingBuffer:O,resetStreamingBuffers:_,drainPendingBuffers:F}}var q8=N1("UI");function H6($,J){return[...($??[]).filter((Y)=>Y!==J),J].slice(-16)}function _Y($){return $.error?.type==="canceled"||$.error?.type==="aborted"||$.metadata?.abortReason==="interrupt"}var BY=($,J,Y,Z,X,Q,U)=>{let G=E2(),z=v2(),K=_1(),O=m8(),q=h2(),N=x8(),_=c8(),F=u8(),H=d8(),P=l8(),T=j2(),w=UJ(),L=u1(),R=O1(),W=zJ(),b=N6(!1),A=N6(null),C=N6(null),S=N6(null),{createAgent:M,cleanupAgent:y,steerActiveTurn:B,enqueueSessionInput:V,getFollowUpQueue:o,mutateFollowUpQueue:a,listRewindCheckpoints:Y0,rewindSession:Q0,listSubagents:N0,resumeSubagent:d,getMcpContentCatalog:D,refreshMcpContentCatalogs:v,getMcpPrompt:K0,completeMcpArgument:h,listMcpTasks:x,getMcpTask:l,cancelMcpTask:W0,getMcpLogs:L0,setMcpLoggingLevel:T0,getMcpInstructions:I,getReasoningConfiguration:f,setReasoningEffort:p,getServiceTierConfiguration:E,setServiceTier:n,getResponseVerbosityConfiguration:H0,setResponseVerbosity:Z0,getCommunicationStyleConfiguration:C0,setCommunicationStyle:U0,runCodeReview:S0,askSideQuestion:X0,executeUserShellCommand:E0,getTurnRecoveryAssessment:W$}=GY({sessionId:z,workspaceRoot:K,systemPrompt:$,appendSystemPrompt:J,maxTurns:Z,modelId:O,permissionMode:q,reasoningEffort:_,serviceTier:F,responseVerbosity:H,communicationStyle:P,agents:Q}),g0=qY(()=>[K,z,YZ()].join("\x00"),[z,K]),O$=Y1(async()=>{let k=m0().app.followUpQueue?.version,j=m0().app.followUpQueueMutation;try{let m=await o(),c=m0().app.followUpQueue?.version,r=c===k||c===m.version;if(r)R.projectFollowUpQueue(m,g0);let P0=m0().app.followUpQueueMutation.supersededVersions;R.setFollowUpQueueMutation(j.errorCode==="revision_conflict"?{pending:!1,errorCode:j.errorCode,errorMessage:j.errorMessage,supersededVersions:r?P0:H6(P0,m.version)}:{pending:!1,supersededVersions:r?P0:H6(P0,m.version)},g0)}catch{R.setFollowUpQueueMutation({pending:!1,errorMessage:"Follow-up queue is unavailable"},g0)}}),l$=Y1(async(k)=>{let j=m0().app.followUpQueue;if(!j||m0().app.followUpQueueMutation.pending)return!1;R.setFollowUpQueueMutation({pending:!0,messageId:k.messageId},g0);try{let m=await a({expectedVersion:j.version,operation:k}),c=m0().app.followUpQueue?.version;if(c===j.version||c===m.snapshot.version)R.projectFollowUpQueue(m.snapshot,g0);let r=c===j.version||c===m.snapshot.version,P0=m0().app.followUpQueueMutation.supersededVersions;if(R.setFollowUpQueueMutation({pending:!1,supersededVersions:r?P0:H6(P0,m.snapshot.version)},g0),k.type==="remove")W.takeFollowUpPresentation(k.messageId);return!0}catch(m){if(m instanceof LY){let c=m0().app.followUpQueue?.version,r=c===j.version||c===m.snapshot.version;if(r)R.projectFollowUpQueue(m.snapshot,g0);let P0=m0().app.followUpQueueMutation.supersededVersions;R.setFollowUpQueueMutation({pending:!1,errorCode:m.code,errorMessage:m.message,supersededVersions:r?P0:H6(P0,m.snapshot.version)},g0)}else R.setFollowUpQueueMutation({pending:!1,errorMessage:"Follow-up queue is unavailable"},g0);return!1}}),r0=zY(L),U$=Y1((k)=>new Q8({signal:k,streamingBuffer:r0,getStreamingMessageId:()=>m0().session.currentStreamingMessageId,finalizeStreamingMessage:L.finalizeStreamingMessage,discardStreamingMessage:L.discardStreamingMessage,clearThinking:()=>L.setCurrentThinkingContent(null)})),d0=Y1(async()=>{if(!w||!z){R.setTeams([]);return}try{let j=await new wY({configDir:G8(),subagentRegistry:W6(K)}).list({sessionId:z,projectPath:K});if(m0().session.sessionId===z&&m0().session.workspaceRoot===K)R.setTeams(j)}catch(k){q8.warn("[useCommandHandler] Failed to refresh Agent Teams",k)}}),B1=Y1(async(k,j)=>{if(k.images.length>0)return{success:!1,error:"User shell commands do not accept image attachments"};let m=k.text.trimStart().slice(1).trim();if(!m)return{success:!1,error:"User shell command cannot be empty"};L.setCommand(`! ${m}`);try{let c=await E0(m,{signal:j});if(L.addMessage({id:`user-shell-${c.executionId}`,role:"user",content:B4(c.record),timestamp:Date.now(),metadata:{userShellCommand:c.record}}),c.delivery==="next_turn"){let r=m0().session;if(r.sessionId===z&&r.workspaceRoot===K)C.current?.request()}return{success:c.record.status!=="spawn_error",output:B4(c.record),...c.record.status==="spawn_error"?{error:c.record.stderr||"User shell command failed"}:{}}}finally{L.setCommand(null)}});d1(()=>{return()=>{A.current=null,r0.resetStreamingBuffers()}},[r0.resetStreamingBuffers]),d1(()=>{return()=>{S.current?.abort("side-conversation-session-change"),S.current=null,R.dismissSideConversation()}},[R,z,K]),d1(()=>{R.setTeams([]),d0()},[w,R,d0,z,K]),d1(()=>{if(!N)L.setCurrentThinkingContent(null)},[N,L]);let A1=Y1(()=>{if(S.current){S.current.abort("user-cancel"),S.current=null,R.dismissSideConversation();return}if(!G)return;X?.();let k=W.getAbortController()?.signal??new AbortController().signal;if((A.current??U$(k)).abortAndFinalize(()=>{W.abort("user-cancel"),R.setTasks([])}),!b.current)L.addAssistantMessage("任务已停止"),b.current=!0}),Z8=Y1(async(k,j)=>{let m=`side-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;if(R.startSideConversation(m,j),k.images.length>0){R.failSideConversation(m,"Side conversations do not accept image attachments");return}if(!j){R.failSideConversation(m,"Usage: /btw <question>");return}S.current?.abort("side-conversation-replaced");let c=new AbortController;S.current=c;try{let r=await X0(j,c.signal);if(c.signal.aborted||S.current!==c)return;if(R.completeSideConversation(m,r),r.usage)L.updateTokenUsage({scope:"auxiliary",inputTokens:r.usage.promptTokens,outputTokens:r.usage.completionTokens,totalTokens:r.usage.totalTokens,cacheReadTokens:r.usage.cacheReadInputTokens??0,cacheWriteTokens:r.usage.cacheCreationInputTokens??0,costUsd:r.usage.costUsd})}catch(r){if(c.signal.aborted||S.current!==c)return;R.failSideConversation(m,r instanceof Error?r.message:String(r))}finally{if(S.current===c)S.current=null}}),x1=Y1(async(k,j)=>{let m={contentDeltaCount:0,contentDeltaTotalLen:0,outputStarted:!1,toolExecutionStarted:!1,compactionCount:0},c=U$(j.signal);A.current=c;let r=CJ({sessionActions:L,appActions:R,commandActions:W,streamingBuffer:r0,thinkingModeEnabled:N,getStreamingMessageId:()=>m0().session.currentStreamingMessageId,signal:j.signal,streamSession:c,followUpQueueOwner:g0},m);try{return{loopResult:await NY(k,r),stats:m}}finally{if(A.current===c)A.current=null}}),S2=Y1(async(k)=>{let j=!1,m,c=!1,r=k;try{if(k.text.trimStart().startsWith("!")){let Z$=W.getAbortController()??W.createAbortController();return await B1(k,Z$.signal)}await _8();let P0=W.getAbortController()??W.createAbortController(),l0=$6(m0().session),u0=await w4(k,R,L,P0.signal,y,z,$6(m0().session),{listCheckpoints:Y0,execute:Q0},{list:N0,resume:d},{getCatalog:D,refresh:v,getPrompt:K0,complete:h,listTasks:x,getTask:l,cancelTask:W0,getLogs:L0,setLoggingLevel:T0,getInstructions:I},{get:f,set:p},{get:E,set:n},{get:H0,set:Z0},{get:C0,set:U0},K,{run:S0},U);if(u0.type==="handled")return u0.commandResult;if(u0.type==="continue_as_agent")j=u0.result.userMessageAlreadyAdded,m=u0.result.onceModelId,c=u0.result.goalContinuationOnly===!0,r=u0.result.agentInput;let b$=h$.getInstance(),q1;if(!c){let Z$=await b$.executeUserPromptSubmitHooks(r.text,{projectDir:K,sessionId:z,permissionMode:q,hasImages:r.images.length>0,imageCount:r.images.length});if(!Z$.proceed){if(Z$.warning)L.addAssistantMessage(`${Z$.warning}`);return{success:!1,error:"blocked by hook"}}if(Z$.updatedPrompt)r={...r,text:Z$.updatedPrompt,displayText:Z$.updatedPrompt,parts:[{type:"text",text:Z$.updatedPrompt},...r.parts.filter((k2)=>k2.type==="image")]};if(Z$.contextInjection)q1=Z$.contextInjection}if(!j)L.addUserMessage(r.displayText);let Z2=O4(r),w$=await M(m?{modelId:m}:void 0);if(P0.signal.aborted)return q8.info("[handleCommandSubmit] Agent 创建期间已被中止"),{success:!1,error:"aborted"};if(q1)l0.push({role:"system",content:`<user-prompt-submit-hook>
|
|
35
35
|
${q1}
|
|
36
|
-
</user-prompt-submit-hook>`});let r$={messages:l0,userId:"cli-user",sessionId:z,workspaceRoot:K,signal:P0.signal,confirmationHandler:Y,permissionMode:q,onPermissionModeChange:async(Z$)=>{await K$().setPermissionMode(Z$)}},{loopResult:_$,stats:P1}=await x1(w$.chatStream(Z2,r$,{stream:!0,goalContinuationOnly:c,onTurnLimitReached:Y?async(Z$)=>{let k2=await Y.requestConfirmation({type:"maxTurnsExceeded",message:`已进行 ${Z$.turnsCount} 轮对话。是否继续?`,risks:["继续执行可能导致更长的等待时间","可能产生更多的 API 费用"]});return{continue:k2.approved,reason:k2.reason}}:void 0}),P0);if(P1.compactionCount>0)L.setCompactedContext(r$.messages);if(_$.success&&_$.metadata?.outputTruncated)L.addAssistantMessage("输出因达到 token 上限被截断,部分内容可能不完整。");let b1=_$.finalMessage||"";if(q8.debug("[handleCommandSubmit] final reply",{success:_$.success,outputLength:b1.length,turnsCount:_$.metadata?.turnsCount,toolCallsCount:_$.metadata?.toolCallsCount}),!_$.success&&!
|
|
36
|
+
</user-prompt-submit-hook>`});let r$={messages:l0,userId:"cli-user",sessionId:z,workspaceRoot:K,signal:P0.signal,confirmationHandler:Y,permissionMode:q,onPermissionModeChange:async(Z$)=>{await K$().setPermissionMode(Z$)}},{loopResult:_$,stats:P1}=await x1(w$.chatStream(Z2,r$,{stream:!0,goalContinuationOnly:c,onTurnLimitReached:Y?async(Z$)=>{let k2=await Y.requestConfirmation({type:"maxTurnsExceeded",message:`已进行 ${Z$.turnsCount} 轮对话。是否继续?`,risks:["继续执行可能导致更长的等待时间","可能产生更多的 API 费用"]});return{continue:k2.approved,reason:k2.reason}}:void 0}),P0);if(P1.compactionCount>0)L.setCompactedContext(r$.messages);if(_$.success&&_$.metadata?.outputTruncated)L.addAssistantMessage("输出因达到 token 上限被截断,部分内容可能不完整。");let b1=_$.finalMessage||"";if(q8.debug("[handleCommandSubmit] final reply",{success:_$.success,outputLength:b1.length,turnsCount:_$.metadata?.turnsCount,toolCallsCount:_$.metadata?.toolCallsCount}),!_$.success&&!_Y(_$)){let Z$=_$.error?.message||"任务执行失败";return L.addAssistantMessage(Z$),{success:!1,error:Z$}}if(!b1||b1.trim()===""){let Z$=_$.metadata?.abortReason;if(!b.current&&P1.contentDeltaCount===0&&Z$!=="interrupt")return L.addAssistantMessage("已取消"),{success:!0,output:"已取消"};return{success:!0,output:b1??""}}return{success:!0,output:b1}}catch(P0){if(b.current)return{success:!1,error:"aborted"};let l0=n8(P0),u0=typeof P0==="object"&&P0!==null&&"name"in P0&&P0.name==="AbortError";if(l0.isAbort||u0)return{success:!1,error:"aborted"};return L.addAssistantMessage(`${l0.displayMessage}`),{success:!1,error:l0.displayMessage}}}),X2=Y1(async(k)=>{if(k.aborted)return{status:"completed"};if(m0().command.isProcessing)return{status:"deferred"};let j=await a$.hasPendingInbox(K,z),m=!j&&await a$.hasActiveGoal(K,z),c=!j&&!m&&await a$.hasRecoverableTurn(K,z);if(k.aborted)return{status:"completed"};if(!j&&!m&&!c)return{status:"completed"};if(m0().command.isProcessing)return{status:"deferred"};if(await _8(),k.aborted)return{status:"completed"};if(m0().command.isProcessing)return{status:"deferred"};let r=W.createAbortController(),P0="preflight",l0=()=>{if(!r.signal.aborted)r.abort("pending-resume-coordinator-disposed")};if(k.addEventListener("abort",l0,{once:!0}),k.aborted)l0();r0.resetStreamingBuffers(),L.clearFinalizingStreamingMessageId(),W.setProcessing(!0);try{let u0=await M();if(r.signal.aborted)return r.signal.reason==="interrupted-by-new-command"?{status:"deferred"}:{status:"completed"};let b$=await a$.hasPendingInbox(K,z),q1=!b$&&await a$.hasActiveGoal(K,z);if(r.signal.aborted)return r.signal.reason==="interrupted-by-new-command"?{status:"deferred"}:{status:"completed"};if(!b$&&!q1){let _$=W$();if(_$.state!=="none")_4(L,_$);return{status:"completed"}}P0=b$?"pending_input":"goal";let Z2={messages:$6(m0().session),userId:"cli-user",sessionId:z,workspaceRoot:K,signal:r.signal,confirmationHandler:Y,permissionMode:q,onPermissionModeChange:async(_$)=>{await K$().setPermissionMode(_$)}},{loopResult:w$,stats:r$}=await x1(u0.chatStream("",Z2,{stream:!0,pendingInputOnly:b$,goalContinuationOnly:q1}),r);if(r$.compactionCount>0)L.setCompactedContext(Z2.messages);if(r.signal.aborted)return r.signal.reason==="interrupted-by-new-command"?{status:"deferred"}:{status:"completed"};if(w$.success&&w$.metadata?.outputTruncated)L.addAssistantMessage("输出因达到 token 上限被截断,部分内容可能不完整。");if(!w$.success&&!_Y(w$)){let _$=g2(w$.error?.details??w$.error?.message??"恢复排队指令失败");if(P0==="pending_input"){let P1=w$.metadata?.toolCallsCount,b1=typeof P1==="number"&&Number.isInteger(P1)&&P1>=0?P1:-1,Z$=await a$.hasPendingInbox(K,z);if(r.signal.aborted)return r.signal.reason==="interrupted-by-new-command"?{status:"deferred"}:{status:"completed"};return{status:"failed",workKind:P0,workStillPending:Z$,taskFailure:_$,evidence:{taskFailure:_$,outputStarted:r$.outputStarted,toolExecutionStarted:r$.toolExecutionStarted,toolCallsCount:b1}}}return{status:"failed",workKind:P0,workStillPending:!1,taskFailure:_$}}return{status:"completed"}}catch(u0){let b$=n8(u0);if(r.signal.reason==="interrupted-by-new-command")return{status:"deferred"};if(b$.isAbort||k.aborted)return{status:"completed"};return{status:"failed",workKind:P0,workStillPending:!1,taskFailure:g2(u0)}}finally{if(k.removeEventListener("abort",l0),W.getAbortController()===r)W.setProcessing(!1),W.clearAbortController(r),L.setCurrentThinkingContent(null),C.current?.notifyIdle()}}),I$=qY(()=>{let k="preflight";return new K4({canRun:()=>!m0().command.isProcessing,run:async(j)=>{k="preflight";let m=await X2(j);if(m.status==="failed")k=m.workKind;return m},sessionIdentity:JSON.stringify([K,z]),onTerminalFailure:({taskFailure:j})=>{if(k==="preflight")L.setError(`恢复排队指令失败: ${j.message}`);else L.addAssistantMessage(j.message)}})},[X2,L,z,K]);d1(()=>{return C.current=I$,()=>{if(I$.dispose(),C.current===I$)C.current=null}},[I$]),d1(()=>{return R.claimFollowUpQueueOwner(g0),()=>{R.clearFollowUpQueue(g0)}},[R,g0]);let e=Y1(async(k)=>{if(m0().app.activeModal==="sessionHistoryViewer")return;if(!k.text.trim()&&k.images.length===0)return;let j=HY(k.text);if(j){await Z8(k,j.question);return}if(S.current?.abort("main-conversation-submitted"),S.current=null,R.dismissSideConversation(),k.text.trimStart().startsWith("!")&&G){let c=W.getAbortController();if(!c){L.addAssistantMessage("当前任务没有可用的取消边界,无法执行用户 Shell 命令。");return}let r=await B1(k,c.signal);if(!r.success&&r.error&&r.error!=="aborted")L.setError(r.error);return}if(G){if(k.text.trimStart().startsWith("/")){let u0=k.text.trim();if(/^\/(?:goal|queue)(?:\s|$)/i.test(u0)){await _8();let b$=W.getAbortController(),q1=/^\/queue(?:\s|$)/i.test(u0)?b$?.signal??new AbortController().signal:(b$??W.createAbortController()).signal;await w4(k,R,L,q1,y,z,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,K);return}L.addAssistantMessage("活动回合中不能执行 slash command;请先停止任务或等待完成。");return}await _8();let c=await h$.getInstance().executeUserPromptSubmitHooks(k.text,{projectDir:K,sessionId:z,permissionMode:q,hasImages:k.images.length>0,imageCount:k.images.length});if(!c.proceed){if(c.warning)L.addAssistantMessage(c.warning);return}let r=k;if(c.updatedPrompt)r={...k,text:c.updatedPrompt,parts:[{type:"text",text:c.updatedPrompt},...k.parts.filter((u0)=>u0.type==="image")]};if(c.contextInjection){let u0=`<user-prompt-submit-hook>
|
|
37
37
|
${c.contextInjection}
|
|
38
38
|
</user-prompt-submit-hook>`;r={...r,text:`${r.text}
|
|
39
39
|
|
|
40
40
|
${u0}`,parts:[...r.parts,{type:"text",text:`
|
|
41
41
|
|
|
42
|
-
${u0}`}]}}let P0=O4(r),l0=await A(P0);if(!l0.accepted){let u0=l0.reason==="queue_full"?"补充指令队列已满,请等待当前任务处理后重试。":"当前任务正在结束,补充指令未入队,请稍后重试。";L.addAssistantMessage(u0);return}if(l0.messageId)W.rememberFollowUpPresentation(l0.messageId,k);if(l0.queue)C.projectFollowUpQueue(l0.queue,g0);if(l0.delivery==="next_turn")y$.request();return}C.setTasks([]),W.setRecoveredSteeringCount(0),T.current=!1;let m=W.createAbortController();r0.resetStreamingBuffers(),L.clearFinalizingStreamingMessageId(),W.setProcessing(!0);try{let c=await S2(k);if(!c.success&&c.error&&c.error!=="aborted")L.setError(c.error)}catch(c){let r=n8(c);if(r.isAbort);else L.setError(`执行失败: ${r.displayMessage}`)}finally{if(W.getAbortController()===m)W.setProcessing(!1),W.clearAbortController(m),L.setCurrentThinkingContent(null),y.current?.notifyIdle()}});return d1(()=>{let k=F6.subscribe((j)=>{if(!_Y(j,{sessionId:z,projectPath:K}))return;if(j.type.startsWith("team.")){let{teamName:m,messageId:c,content:r}=j.properties,P0=j.properties.metadata;if(j.type==="team.message.received"&&typeof m==="string"&&typeof c==="string"&&typeof r==="string"&&WY(P0,{messageId:c,teamName:m}))(async()=>{let l0=await V(r,{messageId:c,origin:"team_message",metadata:P0});if(!l0.accepted)return;if(await new HY(m,G8()).markDelivered([c]),l0.delivery==="next_turn")y$.request()})().catch((l0)=>{q8.warn("[useCommandHandler] Failed to deliver teammate message",l0)});queueMicrotask(()=>{d0()});return}if(j.type!=="subagent.completion.queued")return;y$.request()});return()=>{k()}},[V,y$,d0,z,K]),d1(()=>{let k=!1;return(async()=>{if(Y)await A4.resolvePendingWithHandler(K,z,Y);else await A4.cancelPendingNonInteractive(K,z);if(k)return;let[j,m]=await Promise.all([a$.hasPendingInbox(K,z),a$.hasActiveGoal(K,z)]),c=!j&&!m&&await a$.hasRecoverableTurn(K,z);if(j||m||c)y$.request()})().catch((j)=>{if(!k)q8.warn("[useCommandHandler] Failed to recover pending interaction or inbox",j)}),()=>{k=!0}},[Y,y$,z,K]),{executeCommand:e,handleAbort:A1,isProcessing:G||M?.status==="loading",cleanupAgent:R,refreshFollowUpQueue:O$,controlFollowUpQueue:l$}};import{useMemoizedFn as L6}from"ahooks";import{useRef as YZ,useState as XZ}from"react";var BY=()=>{let[$,J]=XZ([]),Y=YZ(-1),Z=L6((G,z)=>{let K={display:G,pasteMappings:z?new Map(z):new Map};J((O)=>[...O,K]),Y.current=-1}),X=L6(()=>{if($.length===0)return null;let G=Y.current===-1?$.length-1:Math.max(0,Y.current-1);return Y.current=G,$[G]||null}),Q=L6(()=>{if(Y.current===-1)return null;let G=Y.current+1;if(G>=$.length)return Y.current=-1,null;else return Y.current=G,$[G]||null}),U=L6(()=>{Y.current=-1});return{commandHistory:$,historyIndex:Y.current,addToHistory:Z,getPreviousCommand:X,getNextCommand:Q,resetHistoryIndex:U}};import{useMemoizedFn as O8}from"ahooks";import{useMemo as ZZ,useRef as AY,useState as QZ}from"react";var PY=()=>{let[$,J]=QZ({isVisible:!1,details:null,resolver:null}),Y=AY(null),Z=AY([]),X=O8((O)=>{Y.current=O,J({isVisible:Boolean(O),details:O?.details??null,resolver:O?.resolve??null})}),Q=O8((O,q)=>{if(O.settled)return;if(O.settled=!0,O.signal&&O.abortListener)O.signal.removeEventListener("abort",O.abortListener);O.resolve(q)}),U=O8((O,q)=>{return new Promise((N)=>{let _={details:O,resolve:N,signal:q,settled:!1},F=()=>{if(Y.current===_){Q(_,{approved:!1,reason:N8}),X(Z.current.shift()??null);return}let H=Z.current.indexOf(_);if(H>=0)Z.current.splice(H,1);Q(_,{approved:!1,reason:N8})};if(_.abortListener=F,q?.aborted){F();return}if(q?.addEventListener("abort",F,{once:!0}),!Y.current){X(_);return}Z.current.push(_)})}),G=O8((O)=>{let q=Y.current;if(q)Q(q,O);let N=Z.current.shift()??null;X(N)}),z=O8(()=>{if(Y.current)Q(Y.current,{approved:!1,reason:N8});for(let O of Z.current)Q(O,{approved:!1,reason:N8});Z.current=[],X(null)}),K=ZZ(()=>({requestConfirmation:U}),[U]);return{confirmationState:$,confirmationHandler:K,handleResponse:G,dismissAll:z}};import{useMemoizedFn as U2}from"ahooks";import{useRef as bY,useState as UZ}from"react";var P4="␞",b4="␟";function w6($){return`${P4}PASTE:${$}:`}function M4(){return b4}var GZ=`${P4}PASTE:(\\d+):[\\s\\S]*?${b4}`;function KZ($){return $.includes(P4)&&$.includes(b4)}function zZ($,J,Y){let Z=[...$.values()].filter((U)=>U.type==="image");if(Z.length>=m2)throw Error(`最多只能粘贴 ${m2} 张图片`);let X=Z.reduce((U,G)=>U+`data:${G.mimeType};base64,`.length+G.data.length,0),Q=`data:${Y};base64,`.length+J.length;if(X+Q>e8)throw Error("图片编码后总大小不能超过 5 MiB")}function qZ($,J){let Y=[],Z=[];if(!KZ($)){let q=$.trim();if(q)Z.push({type:"text",text:q});return{displayText:$,text:$,images:Y,parts:Z}}let X=Array.from($.matchAll(new RegExp(GZ,"g"))),Q=0,U="",G="";for(let q of X){let N=q.index,_=N+q[0].length,F=parseInt(q[1],10),H=J.get(F);if(N>Q){let P=$.slice(Q,N);Z.push({type:"text",text:P}),U+=P,G+=P}if(!H)U+=q[0],G+=q[0],Z.push({type:"text",text:q[0]});else if(H.type==="text")U+=H.data,G+=H.data,Z.push({type:"text",text:H.data});else{let P={id:F,base64:H.data,mimeType:H.mimeType};Y.push(P),Z.push({type:"image",...P}),G+=`[Image #${F}]`}Q=_}if(Q<$.length){let q=$.slice(Q);Z.push({type:"text",text:q}),U+=q,G+=q}let z=[];for(let q of Z){let N=z[z.length-1];if(q.type==="text"&&N?.type==="text")N.text+=q.text;else z.push(q)}let K=0,O=z.length;while(K<z.length){let q=z[K];if(q.type!=="text"||q.text.trim()!=="")break;K++}while(O>K){let q=z[O-1];if(q.type!=="text"||q.text.trim()!=="")break;O--}return{displayText:G.trim(),text:U.trim(),images:Y,parts:z.slice(K,O)}}function MY($="",J=0){let[Y,Z]=UZ({value:$,cursorPosition:J}),X=bY(0),Q=bY(new Map),U=U2((_)=>{Z((F)=>({value:_,cursorPosition:F.cursorPosition}));for(let F of Q.current.keys()){let H=w6(F);if(!_.includes(H))Q.current.delete(F)}}),G=U2((_)=>{Z((F)=>({...F,cursorPosition:Math.max(0,Math.min(_,F.value.length))}))}),z=U2(()=>{Z({value:"",cursorPosition:0}),Q.current.clear()}),K=U2((_)=>{X.current+=1;let F=X.current;return Q.current.set(F,{type:"text",data:_}),F}),O=U2((_,F)=>{zZ(Q.current,_,F),X.current+=1;let H=X.current;return Q.current.set(H,{type:"image",data:_,mimeType:F}),H}),q=U2((_)=>{for(let[F,H]of _)if(Q.current.set(F,H),F>=X.current)X.current=F}),N=U2((_)=>qZ(_,Q.current));return{value:Y.value,cursorPosition:Y.cursorPosition,setValue:U,setCursorPosition:G,clear:z,pasteMap:Q.current,addPasteMapping:K,addImagePasteMapping:O,restorePasteMappings:q,resolveInput:N}}import{useMemoizedFn as EY}from"ahooks";import{useEffect as gY,useRef as mY,useState as R4}from"react";function _Z($){return{supportsThinking:C1().resolveConfig($).reasoning}}function B6($){return _Z($).supportsThinking}import{useInput as TY}from"ink";import{createContext as OZ,useCallback as NZ,useContext as HZ,useEffect as WZ,useMemo as FZ,useRef as A6}from"react";import{jsxDEV as LZ}from"react/jsx-dev-runtime";var CY=OZ(null);function RY({children:$}){let J=A6(new Map),Y=A6(0),Z=NZ((Q,U,G)=>{let z=Y.current++;return J.current.set(z,{id:z,priority:U,handler:Q}),G?.(),()=>{J.current.delete(z)}},[]),X=FZ(()=>({register:Z}),[Z]);return TY((Q,U)=>{let G=[...J.current.values()].sort((z,K)=>K.priority-z.priority||z.id-K.id);for(let z of G)if(z.handler(Q,U)===!0)break}),LZ(CY.Provider,{value:X,children:$},void 0,!1,void 0,this)}function O0($,J={}){let Y=HZ(CY),Z=A6($);Z.current=$;let X=J.isActive??!0,Q=J.priority??0,U=A6(J.onRegistered);U.current=J.onRegistered,TY((G,z)=>{if(!Y&&X)Z.current(G,z)},{isActive:!Y&&X}),WZ(()=>{if(!Y||!X)return;return Y.register((G,z)=>Z.current(G,z),Q,()=>U.current?.())},[X,Q,Y])}import{useEffect as yY,useMemo as IY,useRef as SY,useState as T4}from"react";function wZ($,J){let Y=[...$.matchAll(/(?:^|\s)(@(?:"[^"]*"|(?:[^\\ ]|\\ )*))/g)];for(let Z of Y){let X=Z[1],Q=Z.index+(Z[0].length-X.length),U=Q+X.length;if(J>=Q&&J<=U){let G=X.slice(1),z=!1;if(G.startsWith('"')){if(z=!0,G=G.slice(1),G.endsWith('"'))G=G.slice(0,-1)}return{hasQuery:!0,query:G,startIndex:Q,endIndex:U,quoted:z}}}return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1}}var BZ=[...C4.map(($)=>`${$}/**`),...C4,...kY.map(($)=>`**/${$}`)];function DY($,J,Y={}){let{cwd:Z=G$(),maxSuggestions:X=15,ignorePatterns:Q=BZ,debounceDelay:U=300,fuzzyMatch:G=!0,disabled:z=!1,canRequest:K}=Y,O=SY(K),q=SY(null);O.current=K;let[N,_]=T4([]),[F,H]=T4(!1),[P,M]=T4(0),B=IY(()=>JSON.stringify(Q),[Q]),L=!z&&$.includes("@"),C=IY(()=>{if(J===void 0)return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1};return wZ($,J)},[$,J]),W=`${Z}\x00${B}`;return yY(()=>{if(!L||!C.hasQuery){_([]),H(!1);return}let T=!1,w=new AbortController,y=async()=>{if(z||O.current?.()===!1){_([]),H(!1);return}if(q.current!==W)H(!0);try{let b=await fY.search(C.query,{cwd:Z,limit:X,includeDirectories:!0,ignorePatterns:Q,fuzzy:G,signal:w.signal});if(!T)_(b.map((R)=>R.path)),q.current=W}catch(b){if(!T&&!w.signal.aborted)console.error("Failed to search files for @ completion:",b),_([])}finally{if(!T)H(!1)}},S=q.current===W?void 0:setTimeout(y,U);if(S===void 0)y();return()=>{if(T=!0,w.abort(),S!==void 0)clearTimeout(S)}},[C.hasQuery,C.query,Z,U,z,G,Q,W,X,L]),yY(()=>{M(0)},[N]),{...C,suggestions:N,selectedIndex:P,loading:F}}function AZ($,J=!1){if($.includes(" ")||J)return`@"${$}"`;return`@${$}`}function vY($,J,Y){if(!J.hasQuery)return{newInput:$,newCursorPos:$.length};let Z=AZ(Y,J.quoted),X=$.slice(0,J.startIndex),Q=$.slice(J.endIndex),U=X+Z+" "+Q,G=J.startIndex+Z.length+1;return{newInput:U,newCursorPos:G}}import{useMemoizedFn as VY}from"ahooks";import{useEffect as jY,useRef as hY}from"react";var e0=($,J)=>{let Y=hY(!1),Z=hY(null),X=VY(()=>{if(Z.current)clearTimeout(Z.current);Z.current=setTimeout(()=>{L$().setAwaitingSecondCtrlC(!1),Y.current=!1,Z.current=null},3000)}),Q=()=>{H8().shutdown("SIGINT",0)},U=VY(()=>{if(!Y.current){if(Y.current=!0,$&&J)J();L$().setAwaitingSecondCtrlC(!0),X()}else{if(Z.current)clearTimeout(Z.current),Z.current=null;L$().setAwaitingSecondCtrlC(!1),Q()}});return jY(()=>{if($){if(L$().setAwaitingSecondCtrlC(!1),Y.current=!1,Z.current)clearTimeout(Z.current),Z.current=null}},[$]),jY(()=>{return()=>{if(Z.current)clearTimeout(Z.current)}},[]),U};var P6=N1("UI"),cY=($,J,Y,Z,X,Q,U,G,z,K,O=!1)=>{let N=s0()==="main-input",_=$.value,F=$.setValue,H=$.cursorPosition,P=u1(),M=_1(),B=O1(),L=g8(),C=L?B6(L):!1,[W,T]=R4(!1),[w,y]=R4([]),[S,b]=R4(0),R=DY(_,H,{cwd:M,maxSuggestions:10,disabled:O,canRequest:()=>m0().app.activeModal!=="sessionHistoryViewer"}),A=e0(U||!1,Q),V=mY(0),o=500,d=mY(!1),J0=j2(),Q0=J0?.status==="loading"?J0.requestId:void 0;gY(()=>{d.current=!1},[U,Q0]),gY(()=>{if(O){T(!1),y([]);return}if(R.hasQuery&&R.suggestions.length>0){let D=R.suggestions.map((v)=>({command:v,description:pY(v)?`Directory: ${v}`:`File: ${v}`,matchScore:1}));y(D),T(!0),b(0)}else if(_.startsWith("/"))if(_.includes(" "))T(!1),y([]);else{let v=xY(_,M);y(v),T(v.length>0),b(0)}else T(!1),y([])},[_,R.hasQuery,R.suggestions,M,O]);let q0=EY(()=>{P.clearMessages(),P.setError(null)}),a=EY(()=>{if(O)return;P6.debug("[DIAG] handleSubmit called:",{input:_,showSuggestions:W});let D=_.trim();if(D){let v=$.resolveInput(D);P6.debug("[DIAG] Submitting command:",{displayText:D,textLength:v.text.length,imageCount:v.images.length}),T(!1),y([]);let K0=$.pasteMap.size>0?new Map($.pasteMap):new Map;X(D,K0),$.clear(),J(v),P6.debug("[DIAG] Command submitted to onSubmit callback")}else P6.debug("[DIAG] Empty command, not submitting")});return O0((D,v)=>{if(D==="?"&&!_)return z?.(),setTimeout(()=>$.clear(),0),!0;if(v.backspace||v.delete||v.leftArrow||v.rightArrow||v.pageUp||v.pageDown||!v.ctrl&&!v.meta&&!v.escape&&!v.tab&&!v.upArrow&&!v.downArrow&&!v.return&&!(D==="?"&&!_))return!1;if(v.ctrl&&D==="c"||v.meta&&D==="c"||v.ctrl&&D==="d"||v.meta&&D==="d")return A(),!0;if(v.ctrl&&D==="l"||v.meta&&D==="l")return q0(),!0;if(v.ctrl&&D==="t"||v.meta&&D==="t")return P.toggleThinkingExpanded(),!0;if(v.escape){if(K)z?.();else if(U&&Q){if(d.current)return!0;d.current=!0,Q()}else if(W)T(!1),y([]);else if(_){let h=Date.now();if(h-V.current<500)$.clear(),V.current=0;else V.current=h}return!0}if(v.tab&&v.shift)return G?.(),!0;if(v.tab){if(W&&w.length>0){let h=w[S].command;if(R.hasQuery&&R.suggestions.includes(h)){let{newInput:x,newCursorPos:l}=vY(_,R,h);F(x),$.setCursorPosition(l)}else{let x=h+" ";F(x),$.setCursorPosition(x.length)}T(!1),y([])}else if(C)B.toggleThinkingMode();return!0}if(v.return)return a(),!0;if(v.upArrow){if(W&&w.length>0){let h=w.length-1;b((x)=>x>0?x-1:h)}else{let h=Y();if(h){if(h.pasteMappings.size>0)$.restorePasteMappings(h.pasteMappings);F(h.display),$.setCursorPosition(h.display.length)}}return!0}if(v.downArrow){if(W&&w.length>0){let h=w.length-1;b((x)=>x<h?x+1:0)}else{let h=Z();if(h){if(h.pasteMappings.size>0)$.restorePasteMappings(h.pasteMappings);F(h.display),$.setCursorPosition(h.display.length)}}return!0}return!1},{isActive:N&&!O,priority:20}),{handleSubmit:a,showSuggestions:W,suggestions:w,selectedSuggestionIndex:S}};import SZ from"ansi-escapes";import{useStdout as kZ}from"ink";import{useCallback as fZ,useEffect as DZ,useRef as vZ}from"react";import{useStdout as PZ}from"ink";import{debounce as bZ}from"lodash-es";import{useEffect as MZ,useState as TZ}from"react";var uY={columns:80,rows:24};function CZ($){return{width:$.columns||80,height:$.rows||24}}function RZ($,J){return $.width===J.width&&$.height===J.height}function dY($,J,Y){let{stdout:Z}=PZ(),[X,Q]=TZ(()=>$(Z));return MZ(()=>{let U=()=>{let z=$(Z);Q((K)=>J(K,z)?K:z)},G=bZ(U,Y);return U(),Z.on("resize",G),()=>{Z.off("resize",G),G.cancel()}},[Z,Y,J,$]),X}function yZ($){return $.columns||uY.columns}function IZ($){return $.rows||uY.rows}function b6($,J=200){return dY($==="columns"?yZ:IZ,Object.is,J)}function l1($=200){return dY(CZ,RZ,$)}function u2($=200){return b6("columns",$)}function lY(){let{stdout:$}=kZ(),J=u2(),Y=vZ(!0),Z=z0((Q)=>Q.session.actions.incrementClearCount),X=fZ(()=>{if($)$.write(SZ.clearTerminal);Z()},[$,Z]);return DZ(()=>{if(Y.current){Y.current=!1;return}X()},[J,X]),{refreshStatic:X}}import{useEffect as gZ}from"react";var VZ=50,oY=500,jZ=new Set(["session_surface_cursor_invalid","session_surface_snapshot_changed"]);function rY($=0){return{viewGeneration:$,status:"idle",messages:[],truncated:!1}}function y4($,J){if($.version!==J.version||$.sessionId!==J.sessionId)return!1;if($.workspace.kind!==J.workspace.kind)return!1;if($.workspace.kind==="local"&&J.workspace.kind==="local")return $.workspace.projectPath===J.workspace.projectPath;return $.workspace.kind==="acp-remote"&&J.workspace.kind==="acp-remote"&&$.workspace.workspaceRef===J.workspace.workspaceRef}function aY($,J){if($.workspace.kind!==J.workspace.kind)return!1;if($.workspace.kind==="local"&&J.workspace.kind==="local")return $.workspace.projectPath===J.workspace.projectPath;return $.workspace.kind==="acp-remote"&&J.workspace.kind==="acp-remote"&&$.workspace.workspaceRef===J.workspace.workspaceRef}function I4($){switch($){case"session_surface_not_found":return"Session history is no longer available.";case"session_surface_cursor_invalid":case"session_surface_snapshot_changed":return"Session history changed. Reopen it to continue.";case"session_surface_capability_unavailable":case"session_surface_read_only":return"This action is unavailable in history-only mode.";case"session_surface_capacity":return"Session history is busy. Try again.";default:return"Session history is unavailable."}}function W8($){let J=$ instanceof I$?$.code:null;return{code:J,message:I4(J)}}function hZ($){return $.slice(-oY).map((Y)=>({...Y}))}function EZ($,J){let Y=new Set(J.map((Z)=>Z.id));return[...$.filter((Z)=>!Y.has(Z.id)),...J].slice(0,oY).map((Z)=>({...Z}))}class S4{serviceFactory;pageLimit;listeners=new Set;service=null;pendingServiceClose=null;ownerClosePromise=null;activeController=null;generation=0;pageRequest=null;activeActivation=null;disposed=!1;state=rY();constructor($={}){this.serviceFactory=$.serviceFactory??(()=>new M6),this.pageLimit=$.pageLimit??VZ}getState(){return this.state}subscribe($){return this.listeners.add($),()=>this.listeners.delete($)}async listPage($={}){let J=this.generation;if(await this.waitForPendingServiceClose(),this.assertOpen(),!this.isCurrent(J))throw new I$("session_surface_unavailable");let Y=this.service??this.createService(),Z=await Y.listPage($);if(!this.isCurrent(J,Y))throw new I$("session_surface_unavailable");return Z}async listAll(){let $=this.generation,J=[],Y=new Set,Z;do{if(!this.isCurrent($))throw new I$("session_surface_unavailable");let X=await this.listPage({cursor:Z,limit:this.pageLimit});if(!this.isCurrent($))throw new I$("session_surface_unavailable");for(let Q of X.sessions){let U=iY(Q.locator);if(Y.has(U))continue;Y.add(U),J.push(Q)}Z=X.nextCursor}while(Z);return J}async open($){if(this.assertOpen(),$.locator.workspace.kind!=="acp-remote")throw new I$("invalid_session_locator");let J=++this.generation;this.abortActiveRequest("history-view-replaced");let Y=this.service;if(this.service=null,!$.capabilities.history.read){this.setState({status:"error",session:$,messages:[],truncated:!1,error:{code:"session_surface_capability_unavailable",message:I4("session_surface_capability_unavailable")}}),await this.closeService(Y,"history-view-replaced");return}if(this.setState({status:"loading",session:$,messages:[],truncated:!1}),await this.closeService(Y,"history-view-replaced"),!this.isCurrent(J))return;let Z=this.createService(),X=this.beginRequest();try{let Q=await Z.open($.locator,{limit:this.pageLimit});if(!this.isCurrent(J,Z,X))return;if(!y4($.locator,Q.session.locator))throw new I$("workspace_binding_mismatch");this.commitResult(Q,"ready")}catch(Q){if(!this.isCurrent(J,Z,X))return;this.setState({status:"error",session:$,messages:[],truncated:!1,error:W8(Q)})}finally{if(this.activeController===X)this.activeController=null}}activate($,J){let Y=`${J}\x00${iY($.locator)}`;if(this.activeActivation?.key===Y)return this.activeActivation.promise;let Z=this.activateUnshared($,J).finally(()=>{if(this.activeActivation?.promise===Z)this.activeActivation=null});return this.activeActivation={key:Y,promise:Z},Z}async activateUnshared($,J){if(J==="resume")return this.open($);if(this.assertOpen(),$.locator.workspace.kind!=="acp-remote"||!$.capabilities.history.fork)throw new I$("session_surface_capability_unavailable");let Y=++this.generation;this.abortActiveRequest("history-view-replaced"),this.setState({status:"forking",session:$,messages:[],truncated:!1});let Z=this.service;if(this.service=null,await this.closeService(Z,"history-view-replaced"),!this.isCurrent(Y))return;let X=this.createService(),Q=this.beginRequest();try{let U=await X.fork($.locator);if(!this.isCurrent(Y,X,Q))return;if(U.session.locator.workspace.kind!=="acp-remote"||!aY($.locator,U.session.locator))throw new I$("workspace_binding_mismatch");this.commitResult(U,"ready")}catch(U){if(!this.isCurrent(Y,X,Q))return;this.setState({status:"error",session:$,messages:[],truncated:!1,error:W8(U)})}finally{if(this.activeController===Q)this.activeController=null}}loadOlder($){if(this.pageRequest)return this.pageRequest;if(this.state.status!=="ready"&&this.state.status!=="error")return Promise.resolve();let{session:J,olderCursor:Y,snapshot:Z}=this.state,X=this.service;if(!X||!J||!Y||!Z||!J.capabilities.history.read||!this.matchesActionTarget($)||$.olderCursor!==Y)return Promise.resolve();let Q=this.generation,U=this.beginRequest();this.setState({...this.state,status:"loading-older",error:void 0});let G=X.historyPage(J.locator,{cursor:Y,expectedSnapshot:Z,limit:this.pageLimit}).then((z)=>{if(!this.isCurrent(Q,X,U))return;if(z.snapshot!==Z)throw new I$("session_surface_snapshot_changed");this.setState({...this.state,status:"ready",messages:EZ(z.messages,this.state.messages),olderCursor:z.olderCursor,snapshot:z.snapshot,truncated:this.state.truncated||z.truncated,error:void 0})}).catch(async(z)=>{if(!this.isCurrent(Q,X,U))return;if(z instanceof I$&&jZ.has(z.code)){this.setState({status:"loading",session:J,messages:[],truncated:!1});try{let K=await X.open(J.locator,{limit:this.pageLimit});if(!this.isCurrent(Q,X,U))return;if(!y4(J.locator,K.session.locator))throw new I$("workspace_binding_mismatch");this.commitResult(K,"ready")}catch(K){if(!this.isCurrent(Q,X,U))return;this.setState({status:"error",session:J,messages:[],truncated:!1,error:W8(K)})}return}this.setState({...this.state,status:"error",error:W8(z)})}).finally(()=>{if(this.activeController===U)this.activeController=null;if(this.pageRequest===G)this.pageRequest=null});return this.pageRequest=G,G}async fork($){if(this.state.status!=="ready")return;let J=this.state.session,Y=this.service;if(!J||!Y||!this.matchesActionTarget($))return;if(!J.capabilities.history.fork){this.setState({...this.state,status:"error",error:{code:"session_surface_capability_unavailable",message:I4("session_surface_capability_unavailable")}});return}let Z=++this.generation;if(this.abortActiveRequest("history-fork"),this.setState({...this.state,status:"forking",error:void 0}),this.service=null,await this.closeService(Y,"history-fork"),!this.isCurrent(Z))return;let X=this.createService(),Q=this.beginRequest();try{let U=await X.fork(J.locator);if(!this.isCurrent(Z,X,Q))return;if(U.session.locator.workspace.kind!=="acp-remote"||!aY(J.locator,U.session.locator))throw new I$("workspace_binding_mismatch");this.commitResult(U,"ready")}catch(U){if(!this.isCurrent(Z,X,Q))return;this.setState({...this.state,status:"error",error:W8(U)})}finally{if(this.activeController===Q)this.activeController=null}}async closeView(){this.generation+=1,this.activeActivation=null,this.abortActiveRequest("history-view-closed"),this.pageRequest=null;let $=this.service;this.service=null,this.setState(rY(this.generation)),await this.closeService($,"history-view-closed")}close(){if(this.ownerClosePromise)return this.ownerClosePromise;return this.disposed=!0,this.listeners.clear(),this.ownerClosePromise=this.closeView(),this.ownerClosePromise}createService(){let $=this.serviceFactory();return this.service=$,$}closeService($,J){if(!$)return this.waitForPendingServiceClose();let Y=this.pendingServiceClose,Z=(async()=>{if(Y)await Y;await $.close(J)})();this.pendingServiceClose=Z;let X=()=>{if(this.pendingServiceClose===Z)this.pendingServiceClose=null};return Z.then(X,X),Z}waitForPendingServiceClose(){return this.pendingServiceClose??Promise.resolve()}matchesActionTarget($){let J=this.state.session;return J!==void 0&&$.viewGeneration===this.state.viewGeneration&&y4($.locator,J.locator)&&$.snapshot===this.state.snapshot}beginRequest(){this.abortActiveRequest("history-request-replaced");let $=new AbortController;return this.activeController=$,$}abortActiveRequest($){this.activeController?.abort($),this.activeController=null}isCurrent($,J,Y){return!this.disposed&&$===this.generation&&(J===void 0||J===this.service)&&(Y===void 0||!Y.signal.aborted)}commitResult($,J){this.setState({status:J,session:$.session,messages:hZ($.history.messages),olderCursor:$.history.olderCursor,snapshot:$.history.snapshot,truncated:$.history.truncated})}setState($){this.state={...$,viewGeneration:$.viewGeneration??this.generation};for(let J of this.listeners)J(this.state)}assertOpen(){if(this.disposed)throw new I$("session_surface_unavailable")}}function iY($){return $.workspace.kind==="local"?`${$.version}\x00local\x00${$.workspace.projectPath}\x00${$.sessionId}`:`${$.version}\x00acp-remote\x00${$.workspace.workspaceRef}\x00${$.sessionId}`}class k4{factory;active;generation=0;remoteRequestEpoch=0;constructor($=()=>new S4){this.factory=$}acquire($){let J=++this.generation;this.active??=this.factory();let Y=this.active,Z=Y.subscribe($);return async()=>{if(Z(),await Promise.resolve(),this.generation!==J)return;if(this.active===Y)this.active=void 0;await Y.close()}}getState(){return this.active?.getState()??{viewGeneration:0,status:"idle",messages:[],truncated:!1}}activate($,J){return this.active?.activate($,J)??Promise.resolve()}closeView(){return this.cancelRemoteRequest(),this.active?.closeView()??Promise.resolve()}loadOlder($){return this.active?.loadOlder($)??Promise.resolve()}fork($){return this.active?.fork($)??Promise.resolve()}beginRemoteRequest(){return++this.remoteRequestEpoch}cancelRemoteRequest(){this.remoteRequestEpoch+=1}isCurrentRemoteRequest($){return this.active!==void 0&&this.remoteRequestEpoch===$}}async function nY($,J,Y){let Z=$.beginRemoteRequest(),X=J.beginRemoteOpening();if(await X.cleared.catch(()=>{return}),!$.isCurrentRemoteRequest(Z)||!J.isRemoteOpeningCurrent(X.epoch))return;let Q=$.activate(Y.session,Y.intent);if(!$.isCurrentRemoteRequest(Z)||!J.bindRemoteOpening(X.epoch,Y,$.getState().viewGeneration)){await Q;return}await Q}function tY({lifecycle:$,project:J,report:Y}){gZ(()=>{let Z=$.acquire(J);return()=>{Z().catch(Y)}},[$,J,Y])}import{useEffect as dZ}from"react";var mZ=100,pZ=30000,xZ=new Set(["task.status","session.deleted","session.archived"]);class eY{timers=new WeakMap;setInterval($,J){let Y=setInterval($,J),Z={unref:()=>Y.unref()};return this.timers.set(Z,Y),Z}clearInterval($){let J=this.timers.get($);if(!J)return;clearInterval(J),this.timers.delete($)}}var cZ=new eY;class f4{service;store;bus;timerApi;listeners=new Set;ownedOperations=new Set;mutationTail=Promise.resolve();state;visibleLocator;hasCompleteCatalog=!1;activeRefresh=null;dirty=!1;disposed=!1;started=!1;unsubscribeBus;pollTimer;closePromise;constructor($={}){this.service=$.service??new M6,this.store=$.store??new Z6,this.bus=$.bus??F6,this.timerApi=$.timerApi??cZ,this.state=sY("idle",[],this.store.snapshot().unreadKeys)}getState(){return this.state}subscribe($){if(this.disposed)return()=>{return};return this.listeners.add($),()=>this.listeners.delete($)}async start(){if(this.disposed)return;if(!this.started)this.started=!0,this.unsubscribeBus=this.bus.subscribe(($)=>{if(xZ.has($.type))this.consume(this.requestRefresh(!0))}),this.pollTimer=this.timerApi.setInterval(()=>{this.consume(this.requestRefresh(!0))},pZ),this.pollTimer.unref();await this.requestRefresh(!1)}listAll(){return this.requestRefresh(!1)}requestRefresh($){if(this.disposed)return Promise.resolve(G2(this.state.sessions));if(this.activeRefresh){if($)this.dirty=!0;return this.activeRefresh}let J,Y,Z=new Promise((X,Q)=>{J=X,Y=Q});return this.activeRefresh=Z,this.trackOperation(Z),this.consume(this.drainRefresh(Z,J,Y)),Z}acknowledge($){return this.trackOperation(this.acknowledgeInternal($))}async acknowledgeInternal($){if(this.disposed)return;return this.enqueueMutation(async()=>{if(this.disposed)return;let J=await this.store.acknowledge($);if(this.disposed)return;this.publish(this.state.status,this.state.sessions,J.unreadKeys)})}async drainRefresh($,J,Y){try{let Z=G2(this.state.sessions);do this.dirty=!1,Z=await this.refreshOnce();while(!this.disposed&&this.dirty);if(this.activeRefresh===$)this.activeRefresh=null;J(Z)}catch(Z){if(this.activeRefresh===$)this.activeRefresh=null;Y(Z)}}setVisibleLocator($){return this.trackOperation(this.setVisibleLocatorInternal($))}async setVisibleLocatorInternal($){if(this.disposed)return;if(this.visibleLocator=$?$3($):void 0,await this.waitForActiveRefresh(),this.disposed)return;if(!this.hasCompleteCatalog)return;await this.enqueueMutation(async()=>{if(this.disposed)return;let J=await this.store.reconcile(this.state.sessions,this.visibleLocator);if(this.disposed)return;this.publish(this.state.status,this.state.sessions,J.unreadKeys)})}async waitForActiveRefresh(){let $=this.activeRefresh;while($){if(await $,this.disposed)return;$=this.activeRefresh}}close(){if(this.closePromise)return this.closePromise;if(this.disposed=!0,this.dirty=!1,this.unsubscribeBus?.(),this.unsubscribeBus=void 0,this.pollTimer)this.timerApi.clearInterval(this.pollTimer),this.pollTimer=void 0;this.listeners.clear();let $=this.service.close("tui-task-attention-controller-closed");return this.closePromise=this.drainOwnedOperations($),this.closePromise}async drainOwnedOperations($){let J=Promise.allSettled([$]);while(this.ownedOperations.size>0)await Promise.allSettled([...this.ownedOperations]);let[Y]=await J;if(Y?.status==="rejected")throw Y.reason}enqueueMutation($){let J=this.mutationTail.then($,$);return this.mutationTail=J.then(()=>{return},()=>{return}),J}trackOperation($){return this.ownedOperations.add($),$.then(()=>this.ownedOperations.delete($),()=>this.ownedOperations.delete($)),$}consume($){$.catch(()=>{return})}async refreshOnce(){this.publish("loading",this.state.sessions,this.state.unreadKeys);try{let $=await this.readCompleteCatalog();if(this.disposed)return G2(this.state.sessions);return await this.enqueueMutation(async()=>{if(this.disposed)return!1;let Y=await this.store.reconcile($,this.visibleLocator);if(this.disposed)return!1;return this.hasCompleteCatalog=!0,this.publish("ready",$,Y.unreadKeys),!0})?G2($):G2(this.state.sessions)}catch{if(!this.disposed)this.publish("error",this.state.sessions,this.state.unreadKeys);return G2(this.state.sessions)}}async readCompleteCatalog(){let $=[],J;do{let Y=await this.service.listPage({...J?{cursor:J}:{},limit:mZ});if(this.disposed)return[];$.push(...Y.sessions),J=Y.nextCursor}while(J);return $}publish($,J,Y){if(this.disposed)return;this.state=sY($,J,Y);for(let Z of this.listeners)try{let X=Z(this.state);if(X)this.consume(X)}catch{}}}function sY($,J,Y){return Object.freeze({status:$,sessions:Object.freeze(G2(J).map(uZ)),unreadKeys:Object.freeze([...Y])})}function uZ($){return Object.freeze($.locator.workspace),Object.freeze($.locator),Object.freeze($.capabilities.history),Object.freeze($.capabilities.turn),Object.freeze($.capabilities.files),Object.freeze($.capabilities.terminal),Object.freeze($.capabilities),Object.freeze($)}function G2($){return $.map((J)=>({...J,locator:$3(J.locator),capabilities:{...J.capabilities,history:{...J.capabilities.history},turn:{...J.capabilities.turn},files:{...J.capabilities.files},terminal:{...J.capabilities.terminal}}}))}function $3($){return $.workspace.kind==="local"?{...$,workspace:{...$.workspace}}:{...$,workspace:{...$.workspace}}}class D4{factory;active;generation=0;constructor($=()=>new f4){this.factory=$}acquire($){let J=++this.generation;if(!this.active){let U=this.factory();this.active={controller:U,visibility:new F4(U)}}let Y=this.active,{controller:Z,visibility:X}=Y,Q=Z.subscribe($);return{controller:Z,visibility:X,release:async()=>{if(Q(),await Promise.resolve(),this.generation!==J)return;if(this.active===Y)this.active=void 0;await Z.close()}}}listAll(){let $=this.active?.controller;return $?$.listAll():Promise.reject(Error("TUI task attention lifecycle is not active"))}acknowledge($){return this.active?.controller.acknowledge($)??Promise.resolve()}setVisibleLocator($){return this.active?.controller.setVisibleLocator($)??Promise.resolve()}proveLocal($){return this.active?.visibility.proveLocal($)??Promise.resolve()}beginRemote($,J){return this.active?.visibility.beginRemote($,J)??Promise.resolve()}beginRemoteOpening(){return this.active?.visibility.beginRemoteOpening()??{epoch:0,cleared:Promise.resolve()}}isRemoteOpeningCurrent($){return this.active?.visibility.isRemoteOpeningCurrent($)??!1}bindRemoteOpening($,J,Y){return this.active?.visibility.bindRemoteOpening($,J,Y)??!1}endRemote(){return this.active?.visibility.endRemote()??Promise.resolve()}updateRemote($,J){return this.active?.visibility.updateRemote($,J)??Promise.resolve()}controller(){if(!this.active)throw Error("TUI task attention lifecycle is not active");return this.active.controller}visibility(){if(!this.active)throw Error("TUI task attention lifecycle is not active");return this.active.visibility}}function J3({ready:$,lifecycle:J,initialize:Y,project:Z,report:X}){dZ(()=>{if(!$)return;let Q=J.acquire(Z);return Y(Q).catch(()=>X("startup")),()=>{Q.release().catch(()=>X("shutdown"))}},[Y,J,Z,$,X])}import K2 from"chalk";import lZ from"string-width";var k0={active:!1,renderedLineCount:0,lastRenderedLines:[],terminalWidth:process.stdout.columns||80,terminalHeight:process.stdout.rows||24,prefixIndent:4,isFirstRender:!0},C6="\x1B",v4=`${C6}[2K`,T6=($)=>$>0?`${C6}[${$}A`:"",Y3=`${C6}[?25l`,X3=`${C6}[?25h`;function Z3($,J){k0.active=!0,k0.renderedLineCount=0,k0.lastRenderedLines=[],k0.terminalWidth=$,k0.terminalHeight=J,k0.isFirstRender=!0}function Q3($,J){k0.terminalWidth=$,k0.terminalHeight=J}function U3($,J,Y,Z){if(!k0.active)return;let X=8,Q=Math.max(1,k0.terminalHeight-X),U=[],G=F$.getTheme(),z=" ".repeat(k0.prefixIndent),K=K2.dim.hex(G.colors.border.light);if(J>0)U.push(`${z}${K2.dim.hex(G.colors.text.muted)(`^ ${J} lines above (streaming...)`)}`);let O=Y==="code",q=Y==="diff",N="",_=$;if(O&&$.length>0)N=$[0].match(/^```(\w+)?/)?.[1]||"",_=$.slice(1);else if(q&&$.length>0&&$[0]==="<<<DIFF>>>")_=$.slice(1);let F=_.slice(-Q);if(O&&J===0){let P=N?` ${K2.hex(G.colors.text.secondary)(N)}`:"";U.push(`${z}${K("╭─")}${P}`)}for(let P=0;P<F.length;P++){let M=F[P],B=z;if(P===0&&!Z&&k0.isFirstRender&&!O&&!q)B=K2.bold.hex(G.colors.success)("• ")+" ",k0.isFirstRender=!1;let L=O?4:0,C=k0.terminalWidth-k0.prefixIndent-2-L,W=M;if(lZ(M)>C)W=M.slice(0,C);if(O)U.push(`${z}${K("│")} ${W}`);else if(q){let T=W;if(T.startsWith("+"))U.push(`${B}${K2.green(W)}`);else if(T.startsWith("-"))U.push(`${B}${K2.red(W)}`);else if(T.startsWith("@@"))U.push(`${B}${K2.dim(W)}`);else U.push(`${B}${W}`)}else U.push(`${B}${W}`);if(P===0&&!Z&&k0.isFirstRender)k0.isFirstRender=!1}let H=[];if(H.push(Y3),k0.renderedLineCount>0)H.push(T6(k0.renderedLineCount)),H.push("\r");for(let P=0;P<U.length;P++){let M=U[P],B=k0.lastRenderedLines[P];if(M!==B)H.push(v4),H.push(M);if(P<U.length-1)H.push(`
|
|
43
|
-
`)}if(U.length<k0.renderedLineCount){for(let
|
|
44
|
-
`),H.push(v4);let P=k0.renderedLineCount-U.length;H.push(T6(P))}H.push(
|
|
45
|
-
`);if(k0.renderedLineCount>1)$.push(T6(k0.renderedLineCount-1)),$.push("\r");$.push(
|
|
42
|
+
${u0}`}]}}let P0=O4(r),l0=await B(P0);if(!l0.accepted){let u0=l0.reason==="queue_full"?"补充指令队列已满,请等待当前任务处理后重试。":"当前任务正在结束,补充指令未入队,请稍后重试。";L.addAssistantMessage(u0);return}if(l0.messageId)W.rememberFollowUpPresentation(l0.messageId,k);if(l0.queue)R.projectFollowUpQueue(l0.queue,g0);if(l0.delivery==="next_turn")I$.request();return}R.setTasks([]),W.setRecoveredSteeringCount(0),b.current=!1;let m=W.createAbortController();r0.resetStreamingBuffers(),L.clearFinalizingStreamingMessageId(),W.setProcessing(!0);try{let c=await S2(k);if(!c.success&&c.error&&c.error!=="aborted")L.setError(c.error)}catch(c){let r=n8(c);if(r.isAbort);else L.setError(`执行失败: ${r.displayMessage}`)}finally{if(W.getAbortController()===m)W.setProcessing(!1),W.clearAbortController(m),L.setCurrentThinkingContent(null),C.current?.notifyIdle()}});return d1(()=>{let k=F6.subscribe((j)=>{if(!OY(j,{sessionId:z,projectPath:K}))return;if(j.type.startsWith("team.")){let{teamName:m,messageId:c,content:r}=j.properties,P0=j.properties.metadata;if(j.type==="team.message.received"&&typeof m==="string"&&typeof c==="string"&&typeof r==="string"&&FY(P0,{messageId:c,teamName:m}))(async()=>{let l0=await V(r,{messageId:c,origin:"team_message",metadata:P0});if(!l0.accepted)return;if(await new WY(m,G8()).markDelivered([c]),l0.delivery==="next_turn")I$.request()})().catch((l0)=>{q8.warn("[useCommandHandler] Failed to deliver teammate message",l0)});queueMicrotask(()=>{d0()});return}if(j.type!=="subagent.completion.queued")return;I$.request()});return()=>{k()}},[V,I$,d0,z,K]),d1(()=>{let k=!1;return(async()=>{if(Y)await A4.resolvePendingWithHandler(K,z,Y);else await A4.cancelPendingNonInteractive(K,z);if(k)return;let[j,m]=await Promise.all([a$.hasPendingInbox(K,z),a$.hasActiveGoal(K,z)]),c=!j&&!m&&await a$.hasRecoverableTurn(K,z);if(j||m||c)I$.request()})().catch((j)=>{if(!k)q8.warn("[useCommandHandler] Failed to recover pending interaction or inbox",j)}),()=>{k=!0}},[Y,I$,z,K]),{executeCommand:e,handleAbort:A1,isProcessing:G||T?.status==="loading",cleanupAgent:y,refreshFollowUpQueue:O$,controlFollowUpQueue:l$}};import{useMemoizedFn as L6}from"ahooks";import{useRef as XZ,useState as ZZ}from"react";var AY=()=>{let[$,J]=ZZ([]),Y=XZ(-1),Z=L6((G,z)=>{let K={display:G,pasteMappings:z?new Map(z):new Map};J((O)=>[...O,K]),Y.current=-1}),X=L6(()=>{if($.length===0)return null;let G=Y.current===-1?$.length-1:Math.max(0,Y.current-1);return Y.current=G,$[G]||null}),Q=L6(()=>{if(Y.current===-1)return null;let G=Y.current+1;if(G>=$.length)return Y.current=-1,null;else return Y.current=G,$[G]||null}),U=L6(()=>{Y.current=-1});return{commandHistory:$,historyIndex:Y.current,addToHistory:Z,getPreviousCommand:X,getNextCommand:Q,resetHistoryIndex:U}};import{useMemoizedFn as O8}from"ahooks";import{useMemo as QZ,useRef as PY,useState as UZ}from"react";var bY=()=>{let[$,J]=UZ({isVisible:!1,details:null,resolver:null}),Y=PY(null),Z=PY([]),X=O8((O)=>{Y.current=O,J({isVisible:Boolean(O),details:O?.details??null,resolver:O?.resolve??null})}),Q=O8((O,q)=>{if(O.settled)return;if(O.settled=!0,O.signal&&O.abortListener)O.signal.removeEventListener("abort",O.abortListener);O.resolve(q)}),U=O8((O,q)=>{return new Promise((N)=>{let _={details:O,resolve:N,signal:q,settled:!1},F=()=>{if(Y.current===_){Q(_,{approved:!1,reason:N8}),X(Z.current.shift()??null);return}let H=Z.current.indexOf(_);if(H>=0)Z.current.splice(H,1);Q(_,{approved:!1,reason:N8})};if(_.abortListener=F,q?.aborted){F();return}if(q?.addEventListener("abort",F,{once:!0}),!Y.current){X(_);return}Z.current.push(_)})}),G=O8((O)=>{let q=Y.current;if(q)Q(q,O);let N=Z.current.shift()??null;X(N)}),z=O8(()=>{if(Y.current)Q(Y.current,{approved:!1,reason:N8});for(let O of Z.current)Q(O,{approved:!1,reason:N8});Z.current=[],X(null)}),K=QZ(()=>({requestConfirmation:U}),[U]);return{confirmationState:$,confirmationHandler:K,handleResponse:G,dismissAll:z}};import{useMemoizedFn as U2}from"ahooks";import{useRef as MY,useState as GZ}from"react";var P4="␞",b4="␟";function w6($){return`${P4}PASTE:${$}:`}function M4(){return b4}var KZ=`${P4}PASTE:(\\d+):[\\s\\S]*?${b4}`;function zZ($){return $.includes(P4)&&$.includes(b4)}function qZ($,J,Y){let Z=[...$.values()].filter((U)=>U.type==="image");if(Z.length>=m2)throw Error(`最多只能粘贴 ${m2} 张图片`);let X=Z.reduce((U,G)=>U+`data:${G.mimeType};base64,`.length+G.data.length,0),Q=`data:${Y};base64,`.length+J.length;if(X+Q>e8)throw Error("图片编码后总大小不能超过 5 MiB")}function _Z($,J){let Y=[],Z=[];if(!zZ($)){let q=$.trim();if(q)Z.push({type:"text",text:q});return{displayText:$,text:$,images:Y,parts:Z}}let X=Array.from($.matchAll(new RegExp(KZ,"g"))),Q=0,U="",G="";for(let q of X){let N=q.index,_=N+q[0].length,F=parseInt(q[1],10),H=J.get(F);if(N>Q){let P=$.slice(Q,N);Z.push({type:"text",text:P}),U+=P,G+=P}if(!H)U+=q[0],G+=q[0],Z.push({type:"text",text:q[0]});else if(H.type==="text")U+=H.data,G+=H.data,Z.push({type:"text",text:H.data});else{let P={id:F,base64:H.data,mimeType:H.mimeType};Y.push(P),Z.push({type:"image",...P}),G+=`[Image #${F}]`}Q=_}if(Q<$.length){let q=$.slice(Q);Z.push({type:"text",text:q}),U+=q,G+=q}let z=[];for(let q of Z){let N=z[z.length-1];if(q.type==="text"&&N?.type==="text")N.text+=q.text;else z.push(q)}let K=0,O=z.length;while(K<z.length){let q=z[K];if(q.type!=="text"||q.text.trim()!=="")break;K++}while(O>K){let q=z[O-1];if(q.type!=="text"||q.text.trim()!=="")break;O--}return{displayText:G.trim(),text:U.trim(),images:Y,parts:z.slice(K,O)}}function TY($="",J=0){let[Y,Z]=GZ({value:$,cursorPosition:J}),X=MY(0),Q=MY(new Map),U=U2((_)=>{Z((F)=>({value:_,cursorPosition:F.cursorPosition}));for(let F of Q.current.keys()){let H=w6(F);if(!_.includes(H))Q.current.delete(F)}}),G=U2((_)=>{Z((F)=>({...F,cursorPosition:Math.max(0,Math.min(_,F.value.length))}))}),z=U2(()=>{Z({value:"",cursorPosition:0}),Q.current.clear()}),K=U2((_)=>{X.current+=1;let F=X.current;return Q.current.set(F,{type:"text",data:_}),F}),O=U2((_,F)=>{qZ(Q.current,_,F),X.current+=1;let H=X.current;return Q.current.set(H,{type:"image",data:_,mimeType:F}),H}),q=U2((_)=>{for(let[F,H]of _)if(Q.current.set(F,H),F>=X.current)X.current=F}),N=U2((_)=>_Z(_,Q.current));return{value:Y.value,cursorPosition:Y.cursorPosition,setValue:U,setCursorPosition:G,clear:z,pasteMap:Q.current,addPasteMapping:K,addImagePasteMapping:O,restorePasteMappings:q,resolveInput:N}}import{useMemoizedFn as gY}from"ahooks";import{useEffect as mY,useRef as pY,useState as R4}from"react";function OZ($){return{supportsThinking:C1().resolveConfig($).reasoning}}function B6($){return OZ($).supportsThinking}import{useInput as CY}from"ink";import{createContext as NZ,useCallback as HZ,useContext as WZ,useEffect as FZ,useMemo as LZ,useRef as A6}from"react";import{jsxDEV as wZ}from"react/jsx-dev-runtime";var RY=NZ(null);function yY({children:$}){let J=A6(new Map),Y=A6(0),Z=HZ((Q,U,G)=>{let z=Y.current++;return J.current.set(z,{id:z,priority:U,handler:Q}),G?.(),()=>{J.current.delete(z)}},[]),X=LZ(()=>({register:Z}),[Z]);return CY((Q,U)=>{let G=[...J.current.values()].sort((z,K)=>K.priority-z.priority||z.id-K.id);for(let z of G)if(z.handler(Q,U)===!0)break}),wZ(RY.Provider,{value:X,children:$},void 0,!1,void 0,this)}function _0($,J={}){let Y=WZ(RY),Z=A6($);Z.current=$;let X=J.isActive??!0,Q=J.priority??0,U=A6(J.onRegistered);U.current=J.onRegistered,CY((G,z)=>{if(!Y&&X)Z.current(G,z)},{isActive:!Y&&X}),FZ(()=>{if(!Y||!X)return;return Y.register((G,z)=>Z.current(G,z),Q,()=>U.current?.())},[X,Q,Y])}import{useEffect as IY,useMemo as SY,useRef as kY,useState as T4}from"react";function BZ($,J){let Y=[...$.matchAll(/(?:^|\s)(@(?:"[^"]*"|(?:[^\\ ]|\\ )*))/g)];for(let Z of Y){let X=Z[1],Q=Z.index+(Z[0].length-X.length),U=Q+X.length;if(J>=Q&&J<=U){let G=X.slice(1),z=!1;if(G.startsWith('"')){if(z=!0,G=G.slice(1),G.endsWith('"'))G=G.slice(0,-1)}return{hasQuery:!0,query:G,startIndex:Q,endIndex:U,quoted:z}}}return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1}}var AZ=[...C4.map(($)=>`${$}/**`),...C4,...fY.map(($)=>`**/${$}`)];function vY($,J,Y={}){let{cwd:Z=G$(),maxSuggestions:X=15,ignorePatterns:Q=AZ,debounceDelay:U=300,fuzzyMatch:G=!0,disabled:z=!1,canRequest:K}=Y,O=kY(K),q=kY(null);O.current=K;let[N,_]=T4([]),[F,H]=T4(!1),[P,T]=T4(0),w=SY(()=>JSON.stringify(Q),[Q]),L=!z&&$.includes("@"),R=SY(()=>{if(J===void 0)return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1};return BZ($,J)},[$,J]),W=`${Z}\x00${w}`;return IY(()=>{if(!L||!R.hasQuery){_([]),H(!1);return}let b=!1,A=new AbortController,C=async()=>{if(z||O.current?.()===!1){_([]),H(!1);return}if(q.current!==W)H(!0);try{let M=await DY.search(R.query,{cwd:Z,limit:X,includeDirectories:!0,ignorePatterns:Q,fuzzy:G,signal:A.signal});if(!b)_(M.map((y)=>y.path)),q.current=W}catch(M){if(!b&&!A.signal.aborted)console.error("Failed to search files for @ completion:",M),_([])}finally{if(!b)H(!1)}},S=q.current===W?void 0:setTimeout(C,U);if(S===void 0)C();return()=>{if(b=!0,A.abort(),S!==void 0)clearTimeout(S)}},[R.hasQuery,R.query,Z,U,z,G,Q,W,X,L]),IY(()=>{T(0)},[N]),{...R,suggestions:N,selectedIndex:P,loading:F}}function PZ($,J=!1){if($.includes(" ")||J)return`@"${$}"`;return`@${$}`}function VY($,J,Y){if(!J.hasQuery)return{newInput:$,newCursorPos:$.length};let Z=PZ(Y,J.quoted),X=$.slice(0,J.startIndex),Q=$.slice(J.endIndex),U=X+Z+" "+Q,G=J.startIndex+Z.length+1;return{newInput:U,newCursorPos:G}}import{useMemoizedFn as jY}from"ahooks";import{useEffect as hY,useRef as EY}from"react";var e0=($,J)=>{let Y=EY(!1),Z=EY(null),X=jY(()=>{if(Z.current)clearTimeout(Z.current);Z.current=setTimeout(()=>{L$().setAwaitingSecondCtrlC(!1),Y.current=!1,Z.current=null},3000)}),Q=()=>{H8().shutdown("SIGINT",0)},U=jY(()=>{if(!Y.current){if(Y.current=!0,$&&J)J();L$().setAwaitingSecondCtrlC(!0),X()}else{if(Z.current)clearTimeout(Z.current),Z.current=null;L$().setAwaitingSecondCtrlC(!1),Q()}});return hY(()=>{if($){if(L$().setAwaitingSecondCtrlC(!1),Y.current=!1,Z.current)clearTimeout(Z.current),Z.current=null}},[$]),hY(()=>{return()=>{if(Z.current)clearTimeout(Z.current)}},[]),U};var P6=N1("UI"),uY=($,J,Y,Z,X,Q,U,G,z,K,O=!1)=>{let N=s0()==="main-input",_=$.value,F=$.setValue,H=$.cursorPosition,P=u1(),T=_1(),w=O1(),L=g8(),R=L?B6(L):!1,[W,b]=R4(!1),[A,C]=R4([]),[S,M]=R4(0),y=vY(_,H,{cwd:T,maxSuggestions:10,disabled:O,canRequest:()=>m0().app.activeModal!=="sessionHistoryViewer"}),B=e0(U||!1,Q),V=pY(0),o=500,a=pY(!1),Y0=j2(),Q0=Y0?.status==="loading"?Y0.requestId:void 0;mY(()=>{a.current=!1},[U,Q0]),mY(()=>{if(O){b(!1),C([]);return}if(y.hasQuery&&y.suggestions.length>0){let D=y.suggestions.map((v)=>({command:v,description:xY(v)?`Directory: ${v}`:`File: ${v}`,matchScore:1}));C(D),b(!0),M(0)}else if(_.startsWith("/"))if(_.includes(" "))b(!1),C([]);else{let v=cY(_,T);C(v),b(v.length>0),M(0)}else b(!1),C([])},[_,y.hasQuery,y.suggestions,T,O]);let N0=gY(()=>{P.clearMessages(),P.setError(null)}),d=gY(()=>{if(O)return;P6.debug("[DIAG] handleSubmit called:",{input:_,showSuggestions:W});let D=_.trim();if(D){let v=$.resolveInput(D);P6.debug("[DIAG] Submitting command:",{displayText:D,textLength:v.text.length,imageCount:v.images.length}),b(!1),C([]);let K0=$.pasteMap.size>0?new Map($.pasteMap):new Map;X(D,K0),$.clear(),J(v),P6.debug("[DIAG] Command submitted to onSubmit callback")}else P6.debug("[DIAG] Empty command, not submitting")});return _0((D,v)=>{if(D==="?"&&!_)return z?.(),setTimeout(()=>$.clear(),0),!0;if(v.backspace||v.delete||v.leftArrow||v.rightArrow||v.pageUp||v.pageDown||!v.ctrl&&!v.meta&&!v.escape&&!v.tab&&!v.upArrow&&!v.downArrow&&!v.return&&!(D==="?"&&!_))return!1;if(v.ctrl&&D==="c"||v.meta&&D==="c"||v.ctrl&&D==="d"||v.meta&&D==="d")return B(),!0;if(v.ctrl&&D==="l"||v.meta&&D==="l")return N0(),!0;if(v.ctrl&&D==="t"||v.meta&&D==="t")return P.toggleThinkingExpanded(),!0;if(v.escape){if(K)z?.();else if(U&&Q){if(a.current)return!0;a.current=!0,Q()}else if(W)b(!1),C([]);else if(_){let h=Date.now();if(h-V.current<500)$.clear(),V.current=0;else V.current=h}return!0}if(v.tab&&v.shift)return G?.(),!0;if(v.tab){if(W&&A.length>0){let h=A[S].command;if(y.hasQuery&&y.suggestions.includes(h)){let{newInput:x,newCursorPos:l}=VY(_,y,h);F(x),$.setCursorPosition(l)}else{let x=h+" ";F(x),$.setCursorPosition(x.length)}b(!1),C([])}else if(R)w.toggleThinkingMode();return!0}if(v.return)return d(),!0;if(v.upArrow){if(W&&A.length>0){let h=A.length-1;M((x)=>x>0?x-1:h)}else{let h=Y();if(h){if(h.pasteMappings.size>0)$.restorePasteMappings(h.pasteMappings);F(h.display),$.setCursorPosition(h.display.length)}}return!0}if(v.downArrow){if(W&&A.length>0){let h=A.length-1;M((x)=>x<h?x+1:0)}else{let h=Z();if(h){if(h.pasteMappings.size>0)$.restorePasteMappings(h.pasteMappings);F(h.display),$.setCursorPosition(h.display.length)}}return!0}return!1},{isActive:N&&!O,priority:20}),{handleSubmit:d,showSuggestions:W,suggestions:A,selectedSuggestionIndex:S}};import kZ from"ansi-escapes";import{useStdout as fZ}from"ink";import{useCallback as DZ,useEffect as vZ,useRef as VZ}from"react";import{useStdout as bZ}from"ink";import{debounce as MZ}from"lodash-es";import{useEffect as TZ,useState as CZ}from"react";var dY={columns:80,rows:24};function RZ($){return{width:$.columns||80,height:$.rows||24}}function yZ($,J){return $.width===J.width&&$.height===J.height}function lY($,J,Y){let{stdout:Z}=bZ(),[X,Q]=CZ(()=>$(Z));return TZ(()=>{let U=()=>{let z=$(Z);Q((K)=>J(K,z)?K:z)},G=MZ(U,Y);return U(),Z.on("resize",G),()=>{Z.off("resize",G),G.cancel()}},[Z,Y,J,$]),X}function IZ($){return $.columns||dY.columns}function SZ($){return $.rows||dY.rows}function b6($,J=200){return lY($==="columns"?IZ:SZ,Object.is,J)}function l1($=200){return lY(RZ,yZ,$)}function u2($=200){return b6("columns",$)}function rY(){let{stdout:$}=fZ(),J=u2(),Y=VZ(!0),Z=z0((Q)=>Q.session.actions.incrementClearCount),X=DZ(()=>{if($)$.write(kZ.clearTerminal);Z()},[$,Z]);return vZ(()=>{if(Y.current){Y.current=!1;return}X()},[J,X]),{refreshStatic:X}}import{useEffect as mZ}from"react";var jZ=50,nY=500,hZ=new Set(["session_surface_cursor_invalid","session_surface_snapshot_changed"]);function aY($=0){return{viewGeneration:$,status:"idle",messages:[],truncated:!1}}function y4($,J){if($.version!==J.version||$.sessionId!==J.sessionId)return!1;if($.workspace.kind!==J.workspace.kind)return!1;if($.workspace.kind==="local"&&J.workspace.kind==="local")return $.workspace.projectPath===J.workspace.projectPath;return $.workspace.kind==="acp-remote"&&J.workspace.kind==="acp-remote"&&$.workspace.workspaceRef===J.workspace.workspaceRef}function iY($,J){if($.workspace.kind!==J.workspace.kind)return!1;if($.workspace.kind==="local"&&J.workspace.kind==="local")return $.workspace.projectPath===J.workspace.projectPath;return $.workspace.kind==="acp-remote"&&J.workspace.kind==="acp-remote"&&$.workspace.workspaceRef===J.workspace.workspaceRef}function I4($){switch($){case"session_surface_not_found":return"Session history is no longer available.";case"session_surface_cursor_invalid":case"session_surface_snapshot_changed":return"Session history changed. Reopen it to continue.";case"session_surface_capability_unavailable":case"session_surface_read_only":return"This action is unavailable in history-only mode.";case"session_surface_capacity":return"Session history is busy. Try again.";default:return"Session history is unavailable."}}function W8($){let J=$ instanceof S$?$.code:null;return{code:J,message:I4(J)}}function EZ($){return $.slice(-nY).map((Y)=>({...Y}))}function gZ($,J){let Y=new Set(J.map((Z)=>Z.id));return[...$.filter((Z)=>!Y.has(Z.id)),...J].slice(0,nY).map((Z)=>({...Z}))}class S4{serviceFactory;pageLimit;listeners=new Set;service=null;pendingServiceClose=null;ownerClosePromise=null;activeController=null;generation=0;pageRequest=null;activeActivation=null;disposed=!1;state=aY();constructor($={}){this.serviceFactory=$.serviceFactory??(()=>new M6),this.pageLimit=$.pageLimit??jZ}getState(){return this.state}subscribe($){return this.listeners.add($),()=>this.listeners.delete($)}async listPage($={}){let J=this.generation;if(await this.waitForPendingServiceClose(),this.assertOpen(),!this.isCurrent(J))throw new S$("session_surface_unavailable");let Y=this.service??this.createService(),Z=await Y.listPage($);if(!this.isCurrent(J,Y))throw new S$("session_surface_unavailable");return Z}async listAll(){let $=this.generation,J=[],Y=new Set,Z;do{if(!this.isCurrent($))throw new S$("session_surface_unavailable");let X=await this.listPage({cursor:Z,limit:this.pageLimit});if(!this.isCurrent($))throw new S$("session_surface_unavailable");for(let Q of X.sessions){let U=oY(Q.locator);if(Y.has(U))continue;Y.add(U),J.push(Q)}Z=X.nextCursor}while(Z);return J}async open($){if(this.assertOpen(),$.locator.workspace.kind!=="acp-remote")throw new S$("invalid_session_locator");let J=++this.generation;this.abortActiveRequest("history-view-replaced");let Y=this.service;if(this.service=null,!$.capabilities.history.read){this.setState({status:"error",session:$,messages:[],truncated:!1,error:{code:"session_surface_capability_unavailable",message:I4("session_surface_capability_unavailable")}}),await this.closeService(Y,"history-view-replaced");return}if(this.setState({status:"loading",session:$,messages:[],truncated:!1}),await this.closeService(Y,"history-view-replaced"),!this.isCurrent(J))return;let Z=this.createService(),X=this.beginRequest();try{let Q=await Z.open($.locator,{limit:this.pageLimit});if(!this.isCurrent(J,Z,X))return;if(!y4($.locator,Q.session.locator))throw new S$("workspace_binding_mismatch");this.commitResult(Q,"ready")}catch(Q){if(!this.isCurrent(J,Z,X))return;this.setState({status:"error",session:$,messages:[],truncated:!1,error:W8(Q)})}finally{if(this.activeController===X)this.activeController=null}}activate($,J){let Y=`${J}\x00${oY($.locator)}`;if(this.activeActivation?.key===Y)return this.activeActivation.promise;let Z=this.activateUnshared($,J).finally(()=>{if(this.activeActivation?.promise===Z)this.activeActivation=null});return this.activeActivation={key:Y,promise:Z},Z}async activateUnshared($,J){if(J==="resume")return this.open($);if(this.assertOpen(),$.locator.workspace.kind!=="acp-remote"||!$.capabilities.history.fork)throw new S$("session_surface_capability_unavailable");let Y=++this.generation;this.abortActiveRequest("history-view-replaced"),this.setState({status:"forking",session:$,messages:[],truncated:!1});let Z=this.service;if(this.service=null,await this.closeService(Z,"history-view-replaced"),!this.isCurrent(Y))return;let X=this.createService(),Q=this.beginRequest();try{let U=await X.fork($.locator);if(!this.isCurrent(Y,X,Q))return;if(U.session.locator.workspace.kind!=="acp-remote"||!iY($.locator,U.session.locator))throw new S$("workspace_binding_mismatch");this.commitResult(U,"ready")}catch(U){if(!this.isCurrent(Y,X,Q))return;this.setState({status:"error",session:$,messages:[],truncated:!1,error:W8(U)})}finally{if(this.activeController===Q)this.activeController=null}}loadOlder($){if(this.pageRequest)return this.pageRequest;if(this.state.status!=="ready"&&this.state.status!=="error")return Promise.resolve();let{session:J,olderCursor:Y,snapshot:Z}=this.state,X=this.service;if(!X||!J||!Y||!Z||!J.capabilities.history.read||!this.matchesActionTarget($)||$.olderCursor!==Y)return Promise.resolve();let Q=this.generation,U=this.beginRequest();this.setState({...this.state,status:"loading-older",error:void 0});let G=X.historyPage(J.locator,{cursor:Y,expectedSnapshot:Z,limit:this.pageLimit}).then((z)=>{if(!this.isCurrent(Q,X,U))return;if(z.snapshot!==Z)throw new S$("session_surface_snapshot_changed");this.setState({...this.state,status:"ready",messages:gZ(z.messages,this.state.messages),olderCursor:z.olderCursor,snapshot:z.snapshot,truncated:this.state.truncated||z.truncated,error:void 0})}).catch(async(z)=>{if(!this.isCurrent(Q,X,U))return;if(z instanceof S$&&hZ.has(z.code)){this.setState({status:"loading",session:J,messages:[],truncated:!1});try{let K=await X.open(J.locator,{limit:this.pageLimit});if(!this.isCurrent(Q,X,U))return;if(!y4(J.locator,K.session.locator))throw new S$("workspace_binding_mismatch");this.commitResult(K,"ready")}catch(K){if(!this.isCurrent(Q,X,U))return;this.setState({status:"error",session:J,messages:[],truncated:!1,error:W8(K)})}return}this.setState({...this.state,status:"error",error:W8(z)})}).finally(()=>{if(this.activeController===U)this.activeController=null;if(this.pageRequest===G)this.pageRequest=null});return this.pageRequest=G,G}async fork($){if(this.state.status!=="ready")return;let J=this.state.session,Y=this.service;if(!J||!Y||!this.matchesActionTarget($))return;if(!J.capabilities.history.fork){this.setState({...this.state,status:"error",error:{code:"session_surface_capability_unavailable",message:I4("session_surface_capability_unavailable")}});return}let Z=++this.generation;if(this.abortActiveRequest("history-fork"),this.setState({...this.state,status:"forking",error:void 0}),this.service=null,await this.closeService(Y,"history-fork"),!this.isCurrent(Z))return;let X=this.createService(),Q=this.beginRequest();try{let U=await X.fork(J.locator);if(!this.isCurrent(Z,X,Q))return;if(U.session.locator.workspace.kind!=="acp-remote"||!iY(J.locator,U.session.locator))throw new S$("workspace_binding_mismatch");this.commitResult(U,"ready")}catch(U){if(!this.isCurrent(Z,X,Q))return;this.setState({...this.state,status:"error",error:W8(U)})}finally{if(this.activeController===Q)this.activeController=null}}async closeView(){this.generation+=1,this.activeActivation=null,this.abortActiveRequest("history-view-closed"),this.pageRequest=null;let $=this.service;this.service=null,this.setState(aY(this.generation)),await this.closeService($,"history-view-closed")}close(){if(this.ownerClosePromise)return this.ownerClosePromise;return this.disposed=!0,this.listeners.clear(),this.ownerClosePromise=this.closeView(),this.ownerClosePromise}createService(){let $=this.serviceFactory();return this.service=$,$}closeService($,J){if(!$)return this.waitForPendingServiceClose();let Y=this.pendingServiceClose,Z=(async()=>{if(Y)await Y;await $.close(J)})();this.pendingServiceClose=Z;let X=()=>{if(this.pendingServiceClose===Z)this.pendingServiceClose=null};return Z.then(X,X),Z}waitForPendingServiceClose(){return this.pendingServiceClose??Promise.resolve()}matchesActionTarget($){let J=this.state.session;return J!==void 0&&$.viewGeneration===this.state.viewGeneration&&y4($.locator,J.locator)&&$.snapshot===this.state.snapshot}beginRequest(){this.abortActiveRequest("history-request-replaced");let $=new AbortController;return this.activeController=$,$}abortActiveRequest($){this.activeController?.abort($),this.activeController=null}isCurrent($,J,Y){return!this.disposed&&$===this.generation&&(J===void 0||J===this.service)&&(Y===void 0||!Y.signal.aborted)}commitResult($,J){this.setState({status:J,session:$.session,messages:EZ($.history.messages),olderCursor:$.history.olderCursor,snapshot:$.history.snapshot,truncated:$.history.truncated})}setState($){this.state={...$,viewGeneration:$.viewGeneration??this.generation};for(let J of this.listeners)J(this.state)}assertOpen(){if(this.disposed)throw new S$("session_surface_unavailable")}}function oY($){return $.workspace.kind==="local"?`${$.version}\x00local\x00${$.workspace.projectPath}\x00${$.sessionId}`:`${$.version}\x00acp-remote\x00${$.workspace.workspaceRef}\x00${$.sessionId}`}class k4{factory;active;generation=0;remoteRequestEpoch=0;constructor($=()=>new S4){this.factory=$}acquire($){let J=++this.generation;this.active??=this.factory();let Y=this.active,Z=Y.subscribe($);return async()=>{if(Z(),await Promise.resolve(),this.generation!==J)return;if(this.active===Y)this.active=void 0;await Y.close()}}getState(){return this.active?.getState()??{viewGeneration:0,status:"idle",messages:[],truncated:!1}}activate($,J){return this.active?.activate($,J)??Promise.resolve()}closeView(){return this.cancelRemoteRequest(),this.active?.closeView()??Promise.resolve()}loadOlder($){return this.active?.loadOlder($)??Promise.resolve()}fork($){return this.active?.fork($)??Promise.resolve()}beginRemoteRequest(){return++this.remoteRequestEpoch}cancelRemoteRequest(){this.remoteRequestEpoch+=1}isCurrentRemoteRequest($){return this.active!==void 0&&this.remoteRequestEpoch===$}}async function tY($,J,Y){let Z=$.beginRemoteRequest(),X=J.beginRemoteOpening();if(await X.cleared.catch(()=>{return}),!$.isCurrentRemoteRequest(Z)||!J.isRemoteOpeningCurrent(X.epoch))return;let Q=$.activate(Y.session,Y.intent);if(!$.isCurrentRemoteRequest(Z)||!J.bindRemoteOpening(X.epoch,Y,$.getState().viewGeneration)){await Q;return}await Q}function sY({lifecycle:$,project:J,report:Y}){mZ(()=>{let Z=$.acquire(J);return()=>{Z().catch(Y)}},[$,J,Y])}import{useEffect as lZ}from"react";var pZ=100,xZ=30000,cZ=new Set(["task.status","session.deleted","session.archived"]);class $3{timers=new WeakMap;setInterval($,J){let Y=setInterval($,J),Z={unref:()=>Y.unref()};return this.timers.set(Z,Y),Z}clearInterval($){let J=this.timers.get($);if(!J)return;clearInterval(J),this.timers.delete($)}}var uZ=new $3;class f4{service;store;bus;timerApi;listeners=new Set;ownedOperations=new Set;mutationTail=Promise.resolve();state;visibleLocator;hasCompleteCatalog=!1;activeRefresh=null;dirty=!1;disposed=!1;started=!1;unsubscribeBus;pollTimer;closePromise;constructor($={}){this.service=$.service??new M6,this.store=$.store??new Z6,this.bus=$.bus??F6,this.timerApi=$.timerApi??uZ,this.state=eY("idle",[],this.store.snapshot().unreadKeys)}getState(){return this.state}subscribe($){if(this.disposed)return()=>{return};return this.listeners.add($),()=>this.listeners.delete($)}async start(){if(this.disposed)return;if(!this.started)this.started=!0,this.unsubscribeBus=this.bus.subscribe(($)=>{if(cZ.has($.type))this.consume(this.requestRefresh(!0))}),this.pollTimer=this.timerApi.setInterval(()=>{this.consume(this.requestRefresh(!0))},xZ),this.pollTimer.unref();await this.requestRefresh(!1)}listAll(){return this.requestRefresh(!1)}requestRefresh($){if(this.disposed)return Promise.resolve(G2(this.state.sessions));if(this.activeRefresh){if($)this.dirty=!0;return this.activeRefresh}let J,Y,Z=new Promise((X,Q)=>{J=X,Y=Q});return this.activeRefresh=Z,this.trackOperation(Z),this.consume(this.drainRefresh(Z,J,Y)),Z}acknowledge($){return this.trackOperation(this.acknowledgeInternal($))}async acknowledgeInternal($){if(this.disposed)return;return this.enqueueMutation(async()=>{if(this.disposed)return;let J=await this.store.acknowledge($);if(this.disposed)return;this.publish(this.state.status,this.state.sessions,J.unreadKeys)})}async drainRefresh($,J,Y){try{let Z=G2(this.state.sessions);do this.dirty=!1,Z=await this.refreshOnce();while(!this.disposed&&this.dirty);if(this.activeRefresh===$)this.activeRefresh=null;J(Z)}catch(Z){if(this.activeRefresh===$)this.activeRefresh=null;Y(Z)}}setVisibleLocator($){return this.trackOperation(this.setVisibleLocatorInternal($))}async setVisibleLocatorInternal($){if(this.disposed)return;if(this.visibleLocator=$?J3($):void 0,await this.waitForActiveRefresh(),this.disposed)return;if(!this.hasCompleteCatalog)return;await this.enqueueMutation(async()=>{if(this.disposed)return;let J=await this.store.reconcile(this.state.sessions,this.visibleLocator);if(this.disposed)return;this.publish(this.state.status,this.state.sessions,J.unreadKeys)})}async waitForActiveRefresh(){let $=this.activeRefresh;while($){if(await $,this.disposed)return;$=this.activeRefresh}}close(){if(this.closePromise)return this.closePromise;if(this.disposed=!0,this.dirty=!1,this.unsubscribeBus?.(),this.unsubscribeBus=void 0,this.pollTimer)this.timerApi.clearInterval(this.pollTimer),this.pollTimer=void 0;this.listeners.clear();let $=this.service.close("tui-task-attention-controller-closed");return this.closePromise=this.drainOwnedOperations($),this.closePromise}async drainOwnedOperations($){let J=Promise.allSettled([$]);while(this.ownedOperations.size>0)await Promise.allSettled([...this.ownedOperations]);let[Y]=await J;if(Y?.status==="rejected")throw Y.reason}enqueueMutation($){let J=this.mutationTail.then($,$);return this.mutationTail=J.then(()=>{return},()=>{return}),J}trackOperation($){return this.ownedOperations.add($),$.then(()=>this.ownedOperations.delete($),()=>this.ownedOperations.delete($)),$}consume($){$.catch(()=>{return})}async refreshOnce(){this.publish("loading",this.state.sessions,this.state.unreadKeys);try{let $=await this.readCompleteCatalog();if(this.disposed)return G2(this.state.sessions);return await this.enqueueMutation(async()=>{if(this.disposed)return!1;let Y=await this.store.reconcile($,this.visibleLocator);if(this.disposed)return!1;return this.hasCompleteCatalog=!0,this.publish("ready",$,Y.unreadKeys),!0})?G2($):G2(this.state.sessions)}catch{if(!this.disposed)this.publish("error",this.state.sessions,this.state.unreadKeys);return G2(this.state.sessions)}}async readCompleteCatalog(){let $=[],J;do{let Y=await this.service.listPage({...J?{cursor:J}:{},limit:pZ});if(this.disposed)return[];$.push(...Y.sessions),J=Y.nextCursor}while(J);return $}publish($,J,Y){if(this.disposed)return;this.state=eY($,J,Y);for(let Z of this.listeners)try{let X=Z(this.state);if(X)this.consume(X)}catch{}}}function eY($,J,Y){return Object.freeze({status:$,sessions:Object.freeze(G2(J).map(dZ)),unreadKeys:Object.freeze([...Y])})}function dZ($){return Object.freeze($.locator.workspace),Object.freeze($.locator),Object.freeze($.capabilities.history),Object.freeze($.capabilities.turn),Object.freeze($.capabilities.files),Object.freeze($.capabilities.terminal),Object.freeze($.capabilities),Object.freeze($)}function G2($){return $.map((J)=>({...J,locator:J3(J.locator),capabilities:{...J.capabilities,history:{...J.capabilities.history},turn:{...J.capabilities.turn},files:{...J.capabilities.files},terminal:{...J.capabilities.terminal}}}))}function J3($){return $.workspace.kind==="local"?{...$,workspace:{...$.workspace}}:{...$,workspace:{...$.workspace}}}class D4{factory;active;generation=0;constructor($=()=>new f4){this.factory=$}acquire($){let J=++this.generation;if(!this.active){let U=this.factory();this.active={controller:U,visibility:new F4(U)}}let Y=this.active,{controller:Z,visibility:X}=Y,Q=Z.subscribe($);return{controller:Z,visibility:X,release:async()=>{if(Q(),await Promise.resolve(),this.generation!==J)return;if(this.active===Y)this.active=void 0;await Z.close()}}}listAll(){let $=this.active?.controller;return $?$.listAll():Promise.reject(Error("TUI task attention lifecycle is not active"))}acknowledge($){return this.active?.controller.acknowledge($)??Promise.resolve()}setVisibleLocator($){return this.active?.controller.setVisibleLocator($)??Promise.resolve()}proveLocal($){return this.active?.visibility.proveLocal($)??Promise.resolve()}beginRemote($,J){return this.active?.visibility.beginRemote($,J)??Promise.resolve()}beginRemoteOpening(){return this.active?.visibility.beginRemoteOpening()??{epoch:0,cleared:Promise.resolve()}}isRemoteOpeningCurrent($){return this.active?.visibility.isRemoteOpeningCurrent($)??!1}bindRemoteOpening($,J,Y){return this.active?.visibility.bindRemoteOpening($,J,Y)??!1}endRemote(){return this.active?.visibility.endRemote()??Promise.resolve()}updateRemote($,J){return this.active?.visibility.updateRemote($,J)??Promise.resolve()}controller(){if(!this.active)throw Error("TUI task attention lifecycle is not active");return this.active.controller}visibility(){if(!this.active)throw Error("TUI task attention lifecycle is not active");return this.active.visibility}}function Y3({ready:$,lifecycle:J,initialize:Y,project:Z,report:X}){lZ(()=>{if(!$)return;let Q=J.acquire(Z);return Y(Q).catch(()=>X("startup")),()=>{Q.release().catch(()=>X("shutdown"))}},[Y,J,Z,$,X])}import K2 from"chalk";import rZ from"string-width";var k0={active:!1,renderedLineCount:0,lastRenderedLines:[],terminalWidth:process.stdout.columns||80,terminalHeight:process.stdout.rows||24,prefixIndent:4,isFirstRender:!0},C6="\x1B",v4=`${C6}[2K`,T6=($)=>$>0?`${C6}[${$}A`:"",X3=`${C6}[?25l`,Z3=`${C6}[?25h`;function Q3($,J){k0.active=!0,k0.renderedLineCount=0,k0.lastRenderedLines=[],k0.terminalWidth=$,k0.terminalHeight=J,k0.isFirstRender=!0}function U3($,J){k0.terminalWidth=$,k0.terminalHeight=J}function G3($,J,Y,Z){if(!k0.active)return;let X=8,Q=Math.max(1,k0.terminalHeight-X),U=[],G=F$.getTheme(),z=" ".repeat(k0.prefixIndent),K=K2.dim.hex(G.colors.border.light);if(J>0)U.push(`${z}${K2.dim.hex(G.colors.text.muted)(`^ ${J} lines above (streaming...)`)}`);let O=Y==="code",q=Y==="diff",N="",_=$;if(O&&$.length>0)N=$[0].match(/^```(\w+)?/)?.[1]||"",_=$.slice(1);else if(q&&$.length>0&&$[0]==="<<<DIFF>>>")_=$.slice(1);let F=_.slice(-Q);if(O&&J===0){let P=N?` ${K2.hex(G.colors.text.secondary)(N)}`:"";U.push(`${z}${K("╭─")}${P}`)}for(let P=0;P<F.length;P++){let T=F[P],w=z;if(P===0&&!Z&&k0.isFirstRender&&!O&&!q)w=K2.bold.hex(G.colors.success)("• ")+" ",k0.isFirstRender=!1;let L=O?4:0,R=k0.terminalWidth-k0.prefixIndent-2-L,W=T;if(rZ(T)>R)W=T.slice(0,R);if(O)U.push(`${z}${K("│")} ${W}`);else if(q){let b=W;if(b.startsWith("+"))U.push(`${w}${K2.green(W)}`);else if(b.startsWith("-"))U.push(`${w}${K2.red(W)}`);else if(b.startsWith("@@"))U.push(`${w}${K2.dim(W)}`);else U.push(`${w}${W}`)}else U.push(`${w}${W}`);if(P===0&&!Z&&k0.isFirstRender)k0.isFirstRender=!1}let H=[];if(H.push(X3),k0.renderedLineCount>0)H.push(T6(k0.renderedLineCount)),H.push("\r");for(let P=0;P<U.length;P++){let T=U[P],w=k0.lastRenderedLines[P];if(T!==w)H.push(v4),H.push(T);if(P<U.length-1)H.push(`
|
|
43
|
+
`)}if(U.length<k0.renderedLineCount){for(let T=U.length;T<k0.renderedLineCount;T++)H.push(`
|
|
44
|
+
`),H.push(v4);let P=k0.renderedLineCount-U.length;H.push(T6(P))}H.push(Z3),process.stdout.write(H.join("")),k0.renderedLineCount=U.length,k0.lastRenderedLines=U}function i$(){if(!k0.active)return;if(k0.renderedLineCount>0){let $=[];$.push(X3),$.push(T6(k0.renderedLineCount)),$.push("\r");for(let J=0;J<k0.renderedLineCount;J++)if($.push(v4),J<k0.renderedLineCount-1)$.push(`
|
|
45
|
+
`);if(k0.renderedLineCount>1)$.push(T6(k0.renderedLineCount-1)),$.push("\r");$.push(Z3),process.stdout.write($.join(""))}k0.active=!1,k0.renderedLineCount=0,k0.lastRenderedLines=[],k0.isFirstRender=!0}function X1(){return k0.active}import K3 from"node:fs";import aZ from"node:os";import V4 from"node:path";import{MultiSelect as iZ}from"@inkjs/ui";import{useMemoizedFn as R6}from"ahooks";import{Box as M0,Text as F0,useFocus as oZ,useFocusManager as nZ}from"ink";import y6 from"ink-select-input";import tZ from"ink-spinner";import F8 from"ink-text-input";import{useEffect as z3,useState as d2}from"react";import{jsxDEV as g}from"react/jsx-dev-runtime";var sZ=[{label:"FindFiles - 模糊文件搜索",value:"FindFiles"},{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"}],eZ=[{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 $Q($){if(!$||$.trim()==="")return"名称不能为空";if(!/^[a-z0-9-]+$/.test($))return"名称只能包含小写字母、数字和连字符";if($.startsWith("-")||$.endsWith("-"))return"名称不能以连字符开头或结尾";return null}function L8({onComplete:$,onCancel:J,initialConfig:Y}){let[Z,X]=d2(Y?"name":"mode"),[Q,U]=d2({name:Y?.name||"",description:Y?.description||"",tools:Y?.tools||[],color:Y?.color,location:Y?.location||"project",systemPrompt:Y?.systemPrompt||""}),[G,z]=d2(""),[K,O]=d2(!1),[q,N]=d2(""),[_,F]=d2(Y?"edit":"manual"),{focus:H}=nZ(),T={manual:["mode","name","description","tools","color","location","systemPrompt","confirm"],ai:["mode","aiPrompt","aiGenerating","confirm"],edit:["name","description","tools","color","location","systemPrompt","confirm"]}[_];z3(()=>{if(Z==="name"||Z==="description"||Z==="systemPrompt"||Z==="aiPrompt")return;H(`step-${Z}`)},[Z,H]);let w=R6(()=>{let A=T.indexOf(Z);if(A<T.length-1)X(T[A+1])}),L=R6(()=>{if(q)N("");if(Z==="confirm"&&_==="ai"){X("aiPrompt");return}let A=T.indexOf(Z);if(A>0)X(T[A-1]);else J()}),R=R6(async()=>{O(!0),N("");try{let A=await z8.create(),C=`你是一个 Subagent 配置生成专家。用户会描述他们想要创建的 agent,你需要根据描述生成一个完整的 agent 配置。
|
|
46
46
|
|
|
47
47
|
## 可用工具列表
|
|
48
48
|
|
|
@@ -80,7 +80,7 @@ ${u0}`}]}}let P0=O4(r),l0=await A(P0);if(!l0.accepted){let u0=l0.reason==="queue
|
|
|
80
80
|
4. **color**: 选择一个合适的颜色用于 UI 区分
|
|
81
81
|
5. **systemPrompt**: 详细说明 agent 的职责、使用的工具、输出格式等,使用 Markdown 格式
|
|
82
82
|
|
|
83
|
-
**重要**:请直接返回 JSON,不要添加任何额外的解释或文字。`,
|
|
83
|
+
**重要**:请直接返回 JSON,不要添加任何额外的解释或文字。`,M=(await A.chatWithSystem(`你是一个 Subagent 配置生成专家。用户会描述他们想要创建的 agent,你需要根据描述生成一个完整的 agent 配置。
|
|
84
84
|
|
|
85
85
|
## 可用工具列表
|
|
86
86
|
|
|
@@ -118,47 +118,47 @@ ${u0}`}]}}let P0=O4(r),l0=await A(P0);if(!l0.accepted){let u0=l0.reason==="queue
|
|
|
118
118
|
4. **color**: 选择一个合适的颜色用于 UI 区分
|
|
119
119
|
5. **systemPrompt**: 详细说明 agent 的职责、使用的工具、输出格式等,使用 Markdown 格式
|
|
120
120
|
|
|
121
|
-
**重要**:请直接返回 JSON,不要添加任何额外的解释或文字。`,G)).trim(),
|
|
121
|
+
**重要**:请直接返回 JSON,不要添加任何额外的解释或文字。`,G)).trim(),y=M.match(/```(?:json)?\s*\n([\s\S]*?)\n```/);if(y)M=y[1];let B=JSON.parse(M);if(!B.name||!B.description||!B.systemPrompt)throw Error("Missing required fields: name, description, or systemPrompt");if(!/^[a-z0-9]+(-[a-z0-9]+)*$/.test(B.name))throw Error("Invalid name format. Must be kebab-case (lowercase, numbers, hyphens only)");U({name:B.name,description:B.description,tools:Array.isArray(B.tools)?B.tools:[],color:B.color||"blue",location:"project",systemPrompt:B.systemPrompt}),X("confirm")}catch(A){N(A instanceof Error?A.message:String(A))}finally{O(!1)}});z3(()=>{if(Z==="aiGenerating"&&!K&&!q)R()},[Z,K,q,R]);let W=R6(async()=>{try{let A=Q.location==="project"?V4.join(G$(),".blade","agents"):V4.join(aZ.homedir(),".blade","agents");await K3.promises.mkdir(A,{recursive:!0});let C=["---",`name: ${Q.name}`,`description: ${Q.description}`];if(Q.tools.length>0&&!Q.tools.includes("all")){C.push("tools:");for(let y of Q.tools)C.push(` - ${y}`)}if(Q.color)C.push(`color: ${Q.color}`);C.push("---");let S=[C.join(`
|
|
122
122
|
`),"",`# ${Q.name} Subagent`,"",Q.systemPrompt||"你是一个专门的代理,负责执行特定任务。",""].join(`
|
|
123
|
-
`),b=V4.join(w,`${Q.name}.md`);await G3.promises.writeFile(b,S,"utf-8"),$()}catch(w){console.error("保存配置失败:",w)}}),T=e0(!1,J);if(O0((w,y)=>{if(y.escape)L();else if(y.ctrl&&w==="c"||y.meta&&w==="c")T()},{isActive:Z!=="tools"}),Z==="mode")return g(M0,{flexDirection:"column",paddingY:1,children:[g(M0,{marginBottom:1,children:g(W0,{bold:!0,color:"cyan",children:"选择创建方式"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(M0,{marginBottom:1,children:g(W0,{dimColor:!0,children:"你可以手动配置每个细节,或让 AI 根据你的描述自动生成配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(y6,{items:[{label:"AI 智能生成 - 根据描述自动生成完整配置",value:"ai"},{label:"手动配置 - 逐步配置每个选项",value:"manual"}],onSelect:(w)=>{if(w.value==="ai")F("ai"),X("aiPrompt");else F("manual"),X("name")}},void 0,!1,void 0,this),g(M0,{marginTop:1,children:g(W0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 取消"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Z==="aiPrompt")return g(M0,{flexDirection:"column",paddingY:1,children:[g(M0,{marginBottom:1,children:g(W0,{bold:!0,color:"cyan",children:"AI 智能生成"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(M0,{marginBottom:1,children:g(W0,{dimColor:!0,children:'描述你想要创建的 Agent(例如:"一个专门用于代码审查的 agent,能够分析代码质量和潜在bug")'},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(M0,{marginBottom:1,children:[g(W0,{color:"green",children:"描述: "},void 0,!1,void 0,this),g(F8,{value:G,onChange:z,onSubmit:(w)=>{if(!w.trim())return;X("aiGenerating")}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g(M0,{children:g(W0,{dimColor:!0,children:"按 Enter 开始生成 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Z==="aiGenerating"){if(q)return g(M0,{flexDirection:"column",paddingY:1,children:[g(M0,{marginBottom:1,children:g(W0,{bold:!0,color:"red",children:"AI 生成失败"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(M0,{marginBottom:1,children:g(W0,{color:"red",children:q},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(M0,{marginBottom:1,children:g(W0,{dimColor:!0,children:"按 ESC 返回修改描述"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return g(M0,{flexDirection:"column",paddingY:1,children:[g(M0,{marginBottom:1,children:g(W0,{bold:!0,color:"yellow",children:[g(nZ,{type:"dots"},void 0,!1,void 0,this)," AI 正在生成配置..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),g(M0,{marginBottom:1,children:g(W0,{dimColor:!0,children:['根据你的描述:"',G,'"']},void 0,!0,void 0,this)},void 0,!1,void 0,this),g(M0,{marginBottom:1,children:g(W0,{color:"gray",children:"正在调用 LLM 生成 agent 配置,请稍候..."},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}if(Z==="name"){let w=_==="edit";return g(M0,{flexDirection:"column",paddingY:1,children:[g(M0,{marginBottom:1,children:g(W0,{bold:!0,color:"cyan",children:["Step 1/7: ",w?"Agent 名称(不可修改)":"输入 Agent 名称"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),g(M0,{marginBottom:1,children:g(W0,{dimColor:!0,children:w?"编辑模式下名称不可修改(修改名称相当于创建新 Agent)":"名称只能包含小写字母、数字和连字符(例如:code-reviewer)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(M0,{marginBottom:1,children:[g(W0,{color:"green",children:"名称: "},void 0,!1,void 0,this),w?g(W0,{children:Q.name},void 0,!1,void 0,this):g(F8,{value:Q.name,onChange:(y)=>U({...Q,name:y}),onSubmit:(y)=>{if(eZ(y))return;B()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g(M0,{children:g(W0,{dimColor:!0,children:w?"按 Enter 继续 | ESC 返回":"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),w&&g(F8,{value:"",onChange:()=>{},onSubmit:B,showCursor:!1},"edit-mode-dummy-input",!1,void 0,this)]},void 0,!0,void 0,this)}if(Z==="description")return g(M0,{flexDirection:"column",paddingY:1,children:[g(M0,{marginBottom:1,children:g(W0,{bold:!0,color:"cyan",children:"Step 2/7: 输入描述信息"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(M0,{marginBottom:1,children:g(W0,{dimColor:!0,children:"简短描述这个 Agent 的用途和使用场景(这将帮助主 Agent 决定何时使用它)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(M0,{marginBottom:1,children:[g(W0,{color:"green",children:"描述: "},void 0,!1,void 0,this),g(F8,{value:Q.description,onChange:(w)=>U({...Q,description:w}),onSubmit:(w)=>{if(!w.trim())return;B()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g(M0,{children:g(W0,{dimColor:!0,children:"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Z==="tools")return g($Q,{config:Q,setConfig:U,onNext:B,onPrev:L},void 0,!1,void 0,this);if(Z==="color")return g(M0,{flexDirection:"column",paddingY:1,children:[g(M0,{marginBottom:1,children:g(W0,{bold:!0,color:"cyan",children:"Step 4/7: 选择背景颜色"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(M0,{marginBottom:1,children:g(W0,{dimColor:!0,children:"为 Agent 选择一个颜色标识(用于在 UI 中区分不同的 Agents)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(y6,{items:sZ,onSelect:(w)=>{let y=w.value==="none"?void 0:w.value;U({...Q,color:y}),B()}},void 0,!1,void 0,this),g(M0,{marginTop:1,children:g(W0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Z==="location")return g(M0,{flexDirection:"column",paddingY:1,children:[g(M0,{marginBottom:1,children:g(W0,{bold:!0,color:"cyan",children:"Step 5/7: 选择保存位置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(M0,{marginBottom:1,children:g(W0,{dimColor:!0,children:"项目级配置仅在当前项目生效,用户级配置全局可用"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(y6,{items:[{label:"项目级 (.blade/agents/) - 仅当前项目",value:"project"},{label:"用户级 (~/.blade/agents/) - 全局可用",value:"user"}],onSelect:(w)=>{U({...Q,location:w.value}),B()}},void 0,!1,void 0,this),g(M0,{marginTop:1,children:g(W0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Z==="systemPrompt")return g(M0,{flexDirection:"column",paddingY:1,children:[g(M0,{marginBottom:1,children:g(W0,{bold:!0,color:"cyan",children:"Step 6/7: 输入系统提示词"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(M0,{marginBottom:1,children:g(W0,{dimColor:!0,children:"定义 Agent 的行为和职责(可选,留空将使用默认提示)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(M0,{marginBottom:1,children:[g(W0,{color:"green",children:"提示词: "},void 0,!1,void 0,this),g(F8,{value:Q.systemPrompt,onChange:(w)=>U({...Q,systemPrompt:w}),onSubmit:()=>B()},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g(M0,{children:g(W0,{dimColor:!0,children:"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Z==="confirm")return g(M0,{flexDirection:"column",paddingY:1,children:[g(M0,{marginBottom:1,children:g(W0,{bold:!0,color:"cyan",children:"Step 7/7: 确认配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(M0,{flexDirection:"column",paddingLeft:2,marginBottom:1,children:[g(W0,{children:[g(W0,{bold:!0,color:"green",children:["名称:"," "]},void 0,!0,void 0,this),g(W0,{children:Q.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g(W0,{children:[g(W0,{bold:!0,color:"green",children:["描述:"," "]},void 0,!0,void 0,this),g(W0,{children:Q.description},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g(W0,{children:[g(W0,{bold:!0,color:"green",children:["工具:"," "]},void 0,!0,void 0,this),g(W0,{children:Q.tools.includes("all")?"所有工具":Q.tools.join(", ")||"所有工具"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g(W0,{children:[g(W0,{bold:!0,color:"green",children:["颜色:"," "]},void 0,!0,void 0,this),g(W0,{children:Q.color||"默认"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g(W0,{children:[g(W0,{bold:!0,color:"green",children:["位置:"," "]},void 0,!0,void 0,this),g(W0,{children:Q.location==="project"?"项目级":"用户级"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g(W0,{children:[g(W0,{bold:!0,color:"green",children:["提示词:"," "]},void 0,!0,void 0,this),g(W0,{children:Q.systemPrompt||"(使用默认)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),g(y6,{items:[{label:"确认并保存",value:"save"},{label:"返回上一步",value:"back"},{label:"取消",value:"cancel"}],onSelect:(w)=>{if(w.value==="save")W();else if(w.value==="back")L();else J()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}function $Q({config:$,setConfig:J,onNext:Y,onPrev:Z}){let{isFocused:X}=iZ({id:"step-tools"});O0((U,G)=>{if(G.escape)Z()},{isActive:X});let Q=(U)=>{if(U.includes("all"))J({...$,tools:["all"]});else J({...$,tools:U});Y()};return g(M0,{flexDirection:"column",paddingY:1,children:[g(M0,{marginBottom:1,children:g(W0,{bold:!0,color:"cyan",children:"Step 3/7: 选择可用工具"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(M0,{marginBottom:1,children:g(W0,{dimColor:!0,children:"方向键导航,空格切换勾选,Enter 确认进入下一步 | ESC 返回上一步"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(aZ,{options:tZ,defaultValue:$.tools,onSubmit:Q},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import JQ from"node:fs";import{useMemoizedFn as z2}from"ahooks";import{Box as o0,Text as $$}from"ink";import j4 from"ink-select-input";import{useEffect as YQ,useMemo as z3,useState as I6}from"react";import{jsxDEV as _0}from"react/jsx-dev-runtime";var h4=10;function q3({workspaceRoot:$,initialMode:J="menu",onComplete:Y,onCancel:Z}){let X=W6($),[Q,U]=I6(J),[G,z]=I6(null),[K,O]=I6(0),[q,N]=I6(0),_=z2(()=>{X.clear(),X.loadFromStandardLocations(),O((b)=>b+1)}),F=z3(()=>{return X.getAllSubagents()},[K]),H=Math.ceil(F.length/h4)||1,P=z3(()=>{let b=q*h4;return F.slice(b,b+h4)},[F,q]);YQ(()=>{let b=Math.max(0,H-1);if(q>b)N(b)},[H,q]);let M=z2(()=>{if(q<H-1)N((b)=>b+1)}),B=z2(()=>{if(q>0)N((b)=>b-1)}),L=[{key:"list",label:"查看所有 Agents",value:"list"},{key:"create",label:"创建新 Agent",value:"create"},{key:"edit",label:"编辑 Agent",value:"edit"},{key:"delete",label:"删除 Agent",value:"delete"},{key:"cancel",label:"取消",value:"cancel"}],C=z2((b)=>{if(b.value==="cancel"){Z?.();return}U(b.value)}),W=z2((b)=>{if(z(b.value),Q==="edit")U("editWizard");else if(Q==="delete")U("deleteConfirm")}),T=z2(async()=>{if(!G?.configPath)return;try{await JQ.promises.unlink(G.configPath),_(),w()}catch(b){console.error("删除失败:",b)}}),w=z2(()=>{U("menu"),z(null)}),y=e0(!1,Z);if(O0((b,R)=>{if(R.escape){if(Q==="menu")Z?.();else if(Q==="list"||Q==="edit"||Q==="delete")N(0),w();else if(Q==="deleteConfirm")w()}else if(R.ctrl&&b==="c"||R.meta&&b==="c")y();else if(Q==="list"){if(R.leftArrow||b==="h")B();else if(R.rightArrow||b==="l")M()}},{isActive:Q!=="create"&&Q!=="editWizard"}),Q==="menu")return _0(o0,{flexDirection:"column",paddingY:1,children:[_0(o0,{marginBottom:1,children:_0($$,{bold:!0,color:"cyan",children:"Agents 管理"},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(j4,{items:L,onSelect:C},void 0,!1,void 0,this),_0(o0,{marginTop:1,children:_0($$,{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 _0(o0,{flexDirection:"column",paddingY:1,children:[_0(o0,{marginBottom:1,children:_0($$,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(o0,{paddingLeft:2,children:_0($$,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(o0,{marginTop:1,paddingLeft:2,children:_0($$,{color:"gray",children:"配置文件位置: .blade/agents/ 或 ~/.blade/agents/"},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(o0,{marginTop:1,paddingLeft:2,children:_0($$,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return _0(o0,{flexDirection:"column",paddingY:1,children:[_0(o0,{marginBottom:1,children:[_0($$,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this),_0($$,{color:"gray",children:[" (共 ",F.length," 个)"]},void 0,!0,void 0,this),H>1&&_0($$,{color:"yellow",children:[" ","第 ",q+1,"/",H," 页"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),P.map((b)=>_0(o0,{flexDirection:"column",paddingLeft:2,children:[_0(o0,{children:_0($$,{children:[_0($$,{bold:!0,color:b.color||"white",children:["• ",b.name]},void 0,!0,void 0,this),_0($$,{color:"gray",children:[" - ",b.description]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),b.tools&&b.tools.length>0&&_0(o0,{paddingLeft:2,children:_0($$,{color:"gray",children:["工具: ",b.tools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),b.configPath&&_0(o0,{paddingLeft:2,children:_0($$,{color:"gray",dimColor:!0,children:b.configPath},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},b.name,!0,void 0,this)),_0(o0,{marginTop:1,paddingLeft:2,children:H>1?_0($$,{dimColor:!0,children:"Left/Right to page | ESC 返回菜单"},void 0,!1,void 0,this):_0($$,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}let S=(b)=>{if(F.length===0)return _0(o0,{flexDirection:"column",paddingY:1,children:[_0(o0,{marginBottom:1,children:_0($$,{bold:!0,color:"cyan",children:b},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(o0,{paddingLeft:2,children:_0($$,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(o0,{marginTop:1,paddingLeft:2,children:_0($$,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);let R=F.map((A)=>({key:A.name,label:`${A.name} - ${A.description}`,value:A}));return _0(o0,{flexDirection:"column",paddingY:1,children:[_0(o0,{marginBottom:1,children:_0($$,{bold:!0,color:"cyan",children:b},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(j4,{items:R,onSelect:W},void 0,!1,void 0,this),_0(o0,{marginTop:1,children:_0($$,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};if(Q==="create")return _0(L8,{onComplete:()=>{_(),w()},onCancel:w},void 0,!1,void 0,this);if(Q==="edit")return S("编辑 Agent");if(Q==="editWizard"&&G){let b={name:G.name,description:G.description,tools:G.tools||[],color:G.color,location:G.configPath?.includes(".blade/agents")?"project":"user",systemPrompt:G.systemPrompt||""};return _0(L8,{initialConfig:b,onComplete:()=>{_(),w()},onCancel:w},void 0,!1,void 0,this)}if(Q==="delete")return S("删除 Agent");if(Q==="deleteConfirm"&&G)return _0(o0,{flexDirection:"column",paddingY:1,children:[_0(o0,{marginBottom:1,children:_0($$,{bold:!0,color:"red",children:"确认删除"},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(o0,{marginBottom:1,paddingLeft:2,children:_0($$,{children:["你确定要删除 Agent"," ",_0($$,{bold:!0,color:"yellow",children:G.name},void 0,!1,void 0,this)," ","吗?"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),_0(o0,{marginBottom:1,paddingLeft:2,children:_0($$,{dimColor:!0,children:["文件路径: ",G.configPath]},void 0,!0,void 0,this)},void 0,!1,void 0,this),_0(o0,{marginBottom:1,paddingLeft:2,children:_0($$,{color:"red",children:"此操作无法撤销!"},void 0,!1,void 0,this)},void 0,!1,void 0,this),_0(j4,{items:[{label:"确认删除",value:"confirm"},{label:"取消",value:"cancel"}],onSelect:(b)=>{if(b.value==="confirm")T();else w()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}import{Box as l2,Text as L0}from"ink";import QQ,{useEffect as UQ,useState as GQ}from"react";import{useEffect as XQ,useState as _3}from"react";function H3($=G$(),J=5000){let[Y,Z]=_3(null),[X,Q]=_3(!0);return XQ(()=>{let U=!0,G=async()=>{try{let K=await O3($);if(!U)return;if(!K){Z(null),Q(!1);return}let O=await N3($);if(!U)return;Z(O)}catch{if(U)Z(null)}finally{if(U)Q(!1)}};G();let z=null;if(J>0)z=setInterval(G,J);return()=>{if(U=!1,z)clearInterval(z)}},[$,J]),{branch:Y,loading:X}}function q2($){let J=Math.max(0,Math.ceil($/1000)),Y=Math.floor(J/60),Z=J%60;return Y>0?`${Y}m ${Z}s`:`${Z}s`}function ZQ($,J=Date.now()){let Y=$.snapshot?.nextActionAt;return Y===void 0?void 0:Math.max(0,Y-J)}function S6($,J=Date.now()){let Y=$?.snapshot;if(!Y)return null;let Z=ZQ($,J),X=Z===void 0?void 0:q2(Z);switch(Y.activity){case"admission_wait":{let Q=Y.admission;return{primary:"等待 Provider 容量",secondary:Q?`队列 ${Q.queuePosition}/${Math.max(Q.queueDepth,Q.queuePosition)} · ${Q.scope} · 已等待 ${q2(Q.waitMs)}`:"等待可用请求容量",compact:Q?`Provider 排队 · ${Q.queuePosition}/${Math.max(Q.queueDepth,Q.queuePosition)}`:"Provider 排队"}}case"retry_wait":{let Q=Y.retry,U=Y.reason==="rate_limit"?`Provider 请求受限${X?`,${X} 后重试`:""}`:`Provider 暂时不可用${X?`,${X} 后重试`:""}`,G=Q?[`尝试 ${Q.attempt}/${Q.maxRetries}`,Q.recoveryRemainingMs!==void 0?`剩余预算 ${q2(Q.recoveryRemainingMs)}`:void 0].filter((z)=>z!==void 0):[];return{primary:U,secondary:G.join(" · "),compact:`${Y.reason==="rate_limit"?"Provider 限流":"Provider 恢复"}${X?` · ${X}`:""}${Q?` · ${Q.attempt}/${Q.maxRetries}`:""}`}}case"retry_attempt":{let Q=Y.retry;return{primary:"正在重试 Provider",secondary:Q?`尝试 ${Q.attempt}/${Q.maxRetries}`:"",compact:`Provider 重试${Q?` · ${Q.attempt}/${Q.maxRetries}`:""}`}}case"circuit_open":return{primary:`${Y.reason==="rate_limit"?"Provider 请求受限":"Provider 故障已隔离"},等待恢复探测${X?`(${X})`:""}`,secondary:Y.circuit?.recoveryRemainingMs!==void 0?`剩余预算 ${q2(Y.circuit.recoveryRemainingMs)}`:"",compact:`Provider ${Y.reason==="rate_limit"?"限流":"熔断"}${X?` · ${X}`:""}`};case"circuit_probe":return{primary:"Provider 正在执行恢复探测",secondary:"",compact:"Provider 恢复探测"};case"stream_stall":{let Q=Y.stall;return{primary:Q?.outputStarted?"Provider 流暂时停滞":"Provider 尚未返回流数据",secondary:Q?`已等待 ${q2(Q.durationMs)} · 超时上限 ${q2(Q.timeoutMs)}`:"",compact:Q?`Provider 等待 · ${q2(Q.durationMs)}`:"Provider 等待"}}case"fallback":{let Q=Y.fallback;return{primary:Q?`正在切换到 ${Q.to.model}`:"正在切换模型",secondary:Q?`候选 ${Q.candidate}/${Q.candidateCount} · 来源 ${Q.from.model}`:"",compact:Q?`Provider 切换 · ${Q.to.model}`:"Provider 切换"}}}}import{jsxDEV as Y0,Fragment as h$}from"react/jsx-dev-runtime";function k6($){if(!Number.isFinite($)||$<=0)return"0";if($<1000)return $.toString();if($<1e6)return`${($/1000).toFixed(1)}K`;return`${($/1e6).toFixed(2)}M`}function KQ($){return $?`exec-host:${$.category}:${$.consecutiveCount}`:""}function zQ($){if(!$)return"";return`lineage:${$.rootTurnId?.slice(0,8)??"?"}:${$.currentTurnId.slice(0,8)}`}var F3=QQ.memo(()=>{let $=E8(),J=h2(),Z=V2()==="shortcuts",X=JJ(),Q=_1(),{branch:U}=H3(Q),G=g8(),z=a9(),K=c9(),O=x8(),q=c8(),N=u8(),_=d8(),F=l8(),H=u9(),P=d9(),M=j8(),B=p8(),L=qJ(),C=$J(),W=h8(),T=v2(),[w,y]=GQ(null),S=S6(M);UQ(()=>{let d=!1;new E4(Q,T).get().then((q0)=>{if(!d)y(q0)}).catch(()=>{if(!d)y(null)});let Q0=E4.subscribe((q0)=>{if(!d&&q0.sessionId===T&&q0.workspaceRoot===Q)y(q0.goal)});return()=>{d=!0,Q0()}},[T,Q]);let b=G?B6(G):!1,A=(()=>{if(J==="default")return null;if(J==="autoEdit")return Y0(L0,{color:"magenta",children:[">> ","auto edit on ",Y0(L0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="plan")return Y0(L0,{color:"cyan",children:["‖ plan mode on ",Y0(L0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="yolo")return Y0(L0,{color:"red",children:["yolo mode on ",Y0(L0,{color:"gray",children:"(all tools auto-approved)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null})(),V=A!==null,o=[["Enter:发送","Shift+Enter:换行","Esc:中止"],["Shift+Tab:切换模式","Up/Down:历史","Tab:补全"],["Ctrl+A:行首","Ctrl+E:行尾","Ctrl+K:删到尾"],["Ctrl+U:删到首","Ctrl+W:删单词","Ctrl+C:退出"],["Ctrl+O:浏览记录","PgUp/PgDn:翻页","g/G:首尾"]];return Y0(l2,{flexDirection:"row",justifyContent:"space-between",paddingX:2,paddingY:0,children:[Z?Y0(l2,{flexDirection:"column",gap:0,children:o.map((d,J0)=>Y0(l2,{flexDirection:"row",children:[d.map((Q0,q0)=>{let[a,D]=Q0.split(":");return Y0(l2,{flexDirection:"row",width:20,children:[Y0(L0,{color:"yellow",children:a},void 0,!1,void 0,this),Y0(L0,{color:"gray",children:":"},void 0,!1,void 0,this),Y0(L0,{color:"white",children:D},void 0,!1,void 0,this)]},q0,!0,void 0,this)}),J0===o.length-1&&Y0(L0,{color:"cyan",children:" ? 关闭"},void 0,!1,void 0,this)]},J0,!0,void 0,this))},void 0,!1,void 0,this):Y0(l2,{flexDirection:"row",gap:1,children:[U&&Y0(h$,{children:[Y0(L0,{color:"gray",children:[" ",U]},void 0,!0,void 0,this),Y0(L0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),A,V&&Y0(L0,{color:"gray",children:"·"},void 0,!1,void 0,this),w&&Y0(h$,{children:[Y0(L0,{color:w.status==="active"?"green":w.status==="verifying"?"cyan":w.status==="blocked"||w.status==="budget_limited"?"yellow":"gray",children:["goal:",w.status," ",w.objective.slice(0,32),w.prematureStop?` recovery:${w.prematureStop.consecutiveCount}`:"",w.verificationStall?` verify-gap:${w.verificationStall.consecutiveCount}`:"",w.frontierStall?` frontier:${w.frontierStall.category}:${w.frontierStall.consecutiveCount}`:"",w.executionHostFailure?` ${KQ(w.executionHostFailure)}`:"",w.turnLineage?` ${zQ(w.turnLineage)}`:""]},void 0,!0,void 0,this),Y0(L0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Y0(L0,{color:"gray",children:"? for shortcuts"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Y0(l2,{flexDirection:"row",gap:1,children:!$?Y0(L0,{color:"red",children:"[WARN] API 密钥未配置"},void 0,!1,void 0,this):Y0(h$,{children:[b&&Y0(h$,{children:[O?Y0(L0,{color:"cyan",children:["Effort ",q]},void 0,!0,void 0,this):Y0(L0,{color:"gray",children:"Tab:Effort"},void 0,!1,void 0,this),Y0(L0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N!=="auto"&&Y0(h$,{children:[Y0(L0,{color:N==="fast"?"yellow":"gray",children:["Speed ",N]},void 0,!0,void 0,this),Y0(L0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),_!=="auto"&&Y0(h$,{children:[Y0(L0,{color:"gray",children:["Output ",_]},void 0,!0,void 0,this),Y0(L0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),F!=="auto"&&Y0(h$,{children:[Y0(L0,{color:"gray",children:["Style ",F]},void 0,!0,void 0,this),Y0(L0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),G&&Y0(L0,{color:"gray",children:G.model},void 0,!1,void 0,this),S&&Y0(h$,{children:[Y0(L0,{color:"gray",children:"·"},void 0,!1,void 0,this),Y0(L0,{color:"yellow",children:S.compact},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Y0(L0,{color:"gray",children:"·"},void 0,!1,void 0,this),K?Y0(L0,{color:"yellow",children:"压缩中..."},void 0,!1,void 0,this):Y0(L0,{color:z<20?"red":z<50?"yellow":"gray",children:[z,"%"]},void 0,!0,void 0,this),Y0(L0,{color:"gray",children:"·"},void 0,!1,void 0,this),Y0(L0,{color:H.hitRate===void 0?"gray":"cyan",children:["Cache ",W3(H.hitRate),H.hitRate!==void 0&&Y0(L0,{color:"gray",children:[" ","(r ",k6(H.cacheReadTokens)," · w"," ",k6(H.cacheWriteTokens),")"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Y0(L0,{color:"gray",children:"·"},void 0,!1,void 0,this),Y0(L0,{color:"gray",children:[k6(P.inputTokens)," in /"," ",k6(P.outputTokens)," out"]},void 0,!0,void 0,this),P.estimatedCostUsd>0.001&&Y0(h$,{children:[Y0(L0,{color:"gray",children:"·"},void 0,!1,void 0,this),Y0(L0,{color:"green",children:["$",P.estimatedCostUsd<0.01?P.estimatedCostUsd.toFixed(4):P.estimatedCostUsd.toFixed(3)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),(B?.pending??0)>0&&Y0(h$,{children:[Y0(L0,{color:"gray",children:"·"},void 0,!1,void 0,this),Y0(L0,{color:"yellow",children:["Queued ",B?.pending??0," · /queue"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),L>0&&Y0(h$,{children:[Y0(L0,{color:"gray",children:"·"},void 0,!1,void 0,this),Y0(L0,{color:"cyan",children:["已恢复 ",L," 条指令"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),W.length>0&&Y0(h$,{children:[Y0(L0,{color:"gray",children:"·"},void 0,!1,void 0,this),Y0(L0,{color:"cyan",children:["New tasks ",W.length," · /resume"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),C==="error"&&Y0(h$,{children:[Y0(L0,{color:"gray",children:"·"},void 0,!1,void 0,this),Y0(L0,{color:"yellow",children:"Task sync unavailable"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X&&Y0(h$,{children:[Y0(L0,{color:"gray",children:"·"},void 0,!1,void 0,this),Y0(L0,{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 g4,Text as m4}from"ink";import qQ from"react";import{jsxDEV as r2}from"react/jsx-dev-runtime";var L3=qQ.memo(({suggestions:$,selectedIndex:J,visible:Y,maxDisplay:Z=8})=>{if(!Y||$.length===0)return null;let X=0,Q=Math.min(Z,$.length),U=J>=$.length;if(J>=Z&&!U)X=J-Z+1,Q=J+1;let G=$.slice(X,Q),z=$.length>Z;return r2(g4,{flexDirection:"column",paddingX:2,paddingY:0,children:[G.map((K,O)=>{let N=X+O===J;return r2(g4,{flexDirection:"row",paddingX:1,gap:2,children:[r2(m4,{color:N?"cyan":"white",bold:N,children:K.command},void 0,!1,void 0,this),r2(m4,{color:N?"cyan":"gray",dimColor:!N,children:["- ",K.description]},void 0,!0,void 0,this)]},K.command,!0,void 0,this)}),z&&r2(g4,{paddingX:1,children:r2(m4,{color:U?"cyan":"gray",bold:U,dimColor:!U,children:["... and ",$.length-Z," more"]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as n$,Text as H1,useStdout as $U}from"ink";import JU from"ink-select-input";import X9,{useMemo as c3}from"react";import{Box as I0,Text as x0}from"ink";import O2,{useEffect as J9,useMemo as _2,useRef as m3}from"react";import{Box as l4,Text as b3}from"ink";import WQ from"react";import{Text as Z1}from"ink";import OQ from"react";import w3 from"string-width";import _Q from"wrap-ansi";var w8=($)=>{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 w3(J)},B3=($,J,Y="...")=>{if(w8($)<=J)return $;if(J<=Y.length)return Y.substring(0,J);let X=0,Q=$.length,U="";while(X<=Q){let G=Math.floor((X+Q)/2),z=$.substring(0,G);if(w8(z)<=J-Y.length)U=z,X=G+1;else Q=G-1}return U+Y},A3=($)=>{return/[*_~`<[\]https?:]/.test($)},p4=($)=>{let Y=$.replace(/\*\*(.*?)\*\*/g,"$1").replace(/\*(.*?)\*/g,"$1").replace(/_(.*?)_/g,"$1").replace(/~~(.*?)~~/g,"$1").replace(/`(.*?)`/g,"$1").replace(/<u>(.*?)<\/u>/g,"$1").replace(/\[(.*?)\]\(.*?\)/g,"$1").split(/\s+/).filter((Z)=>Z.length>0);if(Y.length===0)return 0;return Math.max(...Y.map((Z)=>w3(Z)))},a2=($,J,Y=!1)=>{if(J<=0)return[$];let Z=$.trimEnd(),Q=_Q(Z,J,{hard:Y,trim:!1,wordWrap:!0}).split(`
|
|
124
|
-
`).filter((U)=>U.length>0);return Q.length>0?Q:[""]},
|
|
125
|
-
`);for(let H=0;H<F.length;H++){if(H>0)q.push(N),N=[];if(F[H])N.push({text:F[H],props:_.props})}}if(N.length>0)q.push(N);for(let _ of q)Y.push(_);return}let Q=J-X;if(Q<1){
|
|
126
|
-
`);for(let _=0;_<N.length;_++){if(_>0)K();let H=N[_].split(/(\s+)/);for(let P of H){if(!P)continue;let
|
|
127
|
-
`))K()}if(G.length>0)K();for(let q of U)Y.push(q)}function
|
|
128
|
-
`);for(let z=0;z<G.length;z++){if(z>0)Z.push(X),X=[],Q=0;let K=G[z];if(!K)continue;let O=R1(K),q=Math.max(0,J-R1("…"));if(O<=q&&Q===0)X.push({text:K,props:U.props}),Q+=O;else{let N=r4(K),_=Q,F=0;for(let P of N){let
|
|
129
|
-
`),G=0;if(X&&U.length>X){let q=Math.max(X,a4);if(U.length>q)G=U.length-q,U=U.slice(G)}let z=U.length+G,K=String(z).length+1,O=Math.max(20,Z-4);return
|
|
130
|
-
`),Y=[],Z=0,X=0;for(let Q of J){if(Q.startsWith("---")||Q.startsWith("+++"))continue;if(Q.startsWith("@@")){let U=Q.match(/@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@/);if(U)Z=parseInt(U[1],10),X=parseInt(U[3],10);Y.push({type:"header",content:Q});continue}if(Q.startsWith("-")){Y.push({type:"remove",content:Q.substring(1),lineNumber:Z}),Z++;continue}if(Q.startsWith("+")){Y.push({type:"add",content:Q.substring(1),lineNumber:X}),X++;continue}if(Q.startsWith(" ")||Q===""){Y.push({type:"context",content:Q.substring(1),lineNumber:X}),Z++,X++;continue}}return Y}var n4=
|
|
123
|
+
`),M=V4.join(A,`${Q.name}.md`);await K3.promises.writeFile(M,S,"utf-8"),$()}catch(A){console.error("保存配置失败:",A)}}),b=e0(!1,J);if(_0((A,C)=>{if(C.escape)L();else if(C.ctrl&&A==="c"||C.meta&&A==="c")b()},{isActive:Z!=="tools"}),Z==="mode")return g(M0,{flexDirection:"column",paddingY:1,children:[g(M0,{marginBottom:1,children:g(F0,{bold:!0,color:"cyan",children:"选择创建方式"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(M0,{marginBottom:1,children:g(F0,{dimColor:!0,children:"你可以手动配置每个细节,或让 AI 根据你的描述自动生成配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(y6,{items:[{label:"AI 智能生成 - 根据描述自动生成完整配置",value:"ai"},{label:"手动配置 - 逐步配置每个选项",value:"manual"}],onSelect:(A)=>{if(A.value==="ai")F("ai"),X("aiPrompt");else F("manual"),X("name")}},void 0,!1,void 0,this),g(M0,{marginTop:1,children:g(F0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 取消"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Z==="aiPrompt")return g(M0,{flexDirection:"column",paddingY:1,children:[g(M0,{marginBottom:1,children:g(F0,{bold:!0,color:"cyan",children:"AI 智能生成"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(M0,{marginBottom:1,children:g(F0,{dimColor:!0,children:'描述你想要创建的 Agent(例如:"一个专门用于代码审查的 agent,能够分析代码质量和潜在bug")'},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(M0,{marginBottom:1,children:[g(F0,{color:"green",children:"描述: "},void 0,!1,void 0,this),g(F8,{value:G,onChange:z,onSubmit:(A)=>{if(!A.trim())return;X("aiGenerating")}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g(M0,{children:g(F0,{dimColor:!0,children:"按 Enter 开始生成 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Z==="aiGenerating"){if(q)return g(M0,{flexDirection:"column",paddingY:1,children:[g(M0,{marginBottom:1,children:g(F0,{bold:!0,color:"red",children:"AI 生成失败"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(M0,{marginBottom:1,children:g(F0,{color:"red",children:q},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(M0,{marginBottom:1,children:g(F0,{dimColor:!0,children:"按 ESC 返回修改描述"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return g(M0,{flexDirection:"column",paddingY:1,children:[g(M0,{marginBottom:1,children:g(F0,{bold:!0,color:"yellow",children:[g(tZ,{type:"dots"},void 0,!1,void 0,this)," AI 正在生成配置..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),g(M0,{marginBottom:1,children:g(F0,{dimColor:!0,children:['根据你的描述:"',G,'"']},void 0,!0,void 0,this)},void 0,!1,void 0,this),g(M0,{marginBottom:1,children:g(F0,{color:"gray",children:"正在调用 LLM 生成 agent 配置,请稍候..."},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}if(Z==="name"){let A=_==="edit";return g(M0,{flexDirection:"column",paddingY:1,children:[g(M0,{marginBottom:1,children:g(F0,{bold:!0,color:"cyan",children:["Step 1/7: ",A?"Agent 名称(不可修改)":"输入 Agent 名称"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),g(M0,{marginBottom:1,children:g(F0,{dimColor:!0,children:A?"编辑模式下名称不可修改(修改名称相当于创建新 Agent)":"名称只能包含小写字母、数字和连字符(例如:code-reviewer)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(M0,{marginBottom:1,children:[g(F0,{color:"green",children:"名称: "},void 0,!1,void 0,this),A?g(F0,{children:Q.name},void 0,!1,void 0,this):g(F8,{value:Q.name,onChange:(C)=>U({...Q,name:C}),onSubmit:(C)=>{if($Q(C))return;w()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g(M0,{children:g(F0,{dimColor:!0,children:A?"按 Enter 继续 | ESC 返回":"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),A&&g(F8,{value:"",onChange:()=>{},onSubmit:w,showCursor:!1},"edit-mode-dummy-input",!1,void 0,this)]},void 0,!0,void 0,this)}if(Z==="description")return g(M0,{flexDirection:"column",paddingY:1,children:[g(M0,{marginBottom:1,children:g(F0,{bold:!0,color:"cyan",children:"Step 2/7: 输入描述信息"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(M0,{marginBottom:1,children:g(F0,{dimColor:!0,children:"简短描述这个 Agent 的用途和使用场景(这将帮助主 Agent 决定何时使用它)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(M0,{marginBottom:1,children:[g(F0,{color:"green",children:"描述: "},void 0,!1,void 0,this),g(F8,{value:Q.description,onChange:(A)=>U({...Q,description:A}),onSubmit:(A)=>{if(!A.trim())return;w()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g(M0,{children:g(F0,{dimColor:!0,children:"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Z==="tools")return g(JQ,{config:Q,setConfig:U,onNext:w,onPrev:L},void 0,!1,void 0,this);if(Z==="color")return g(M0,{flexDirection:"column",paddingY:1,children:[g(M0,{marginBottom:1,children:g(F0,{bold:!0,color:"cyan",children:"Step 4/7: 选择背景颜色"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(M0,{marginBottom:1,children:g(F0,{dimColor:!0,children:"为 Agent 选择一个颜色标识(用于在 UI 中区分不同的 Agents)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(y6,{items:eZ,onSelect:(A)=>{let C=A.value==="none"?void 0:A.value;U({...Q,color:C}),w()}},void 0,!1,void 0,this),g(M0,{marginTop:1,children:g(F0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Z==="location")return g(M0,{flexDirection:"column",paddingY:1,children:[g(M0,{marginBottom:1,children:g(F0,{bold:!0,color:"cyan",children:"Step 5/7: 选择保存位置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(M0,{marginBottom:1,children:g(F0,{dimColor:!0,children:"项目级配置仅在当前项目生效,用户级配置全局可用"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(y6,{items:[{label:"项目级 (.blade/agents/) - 仅当前项目",value:"project"},{label:"用户级 (~/.blade/agents/) - 全局可用",value:"user"}],onSelect:(A)=>{U({...Q,location:A.value}),w()}},void 0,!1,void 0,this),g(M0,{marginTop:1,children:g(F0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Z==="systemPrompt")return g(M0,{flexDirection:"column",paddingY:1,children:[g(M0,{marginBottom:1,children:g(F0,{bold:!0,color:"cyan",children:"Step 6/7: 输入系统提示词"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(M0,{marginBottom:1,children:g(F0,{dimColor:!0,children:"定义 Agent 的行为和职责(可选,留空将使用默认提示)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(M0,{marginBottom:1,children:[g(F0,{color:"green",children:"提示词: "},void 0,!1,void 0,this),g(F8,{value:Q.systemPrompt,onChange:(A)=>U({...Q,systemPrompt:A}),onSubmit:()=>w()},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g(M0,{children:g(F0,{dimColor:!0,children:"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Z==="confirm")return g(M0,{flexDirection:"column",paddingY:1,children:[g(M0,{marginBottom:1,children:g(F0,{bold:!0,color:"cyan",children:"Step 7/7: 确认配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(M0,{flexDirection:"column",paddingLeft:2,marginBottom:1,children:[g(F0,{children:[g(F0,{bold:!0,color:"green",children:["名称:"," "]},void 0,!0,void 0,this),g(F0,{children:Q.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g(F0,{children:[g(F0,{bold:!0,color:"green",children:["描述:"," "]},void 0,!0,void 0,this),g(F0,{children:Q.description},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g(F0,{children:[g(F0,{bold:!0,color:"green",children:["工具:"," "]},void 0,!0,void 0,this),g(F0,{children:Q.tools.includes("all")?"所有工具":Q.tools.join(", ")||"所有工具"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g(F0,{children:[g(F0,{bold:!0,color:"green",children:["颜色:"," "]},void 0,!0,void 0,this),g(F0,{children:Q.color||"默认"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g(F0,{children:[g(F0,{bold:!0,color:"green",children:["位置:"," "]},void 0,!0,void 0,this),g(F0,{children:Q.location==="project"?"项目级":"用户级"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g(F0,{children:[g(F0,{bold:!0,color:"green",children:["提示词:"," "]},void 0,!0,void 0,this),g(F0,{children:Q.systemPrompt||"(使用默认)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),g(y6,{items:[{label:"确认并保存",value:"save"},{label:"返回上一步",value:"back"},{label:"取消",value:"cancel"}],onSelect:(A)=>{if(A.value==="save")W();else if(A.value==="back")L();else J()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}function JQ({config:$,setConfig:J,onNext:Y,onPrev:Z}){let{isFocused:X}=oZ({id:"step-tools"});_0((U,G)=>{if(G.escape)Z()},{isActive:X});let Q=(U)=>{if(U.includes("all"))J({...$,tools:["all"]});else J({...$,tools:U});Y()};return g(M0,{flexDirection:"column",paddingY:1,children:[g(M0,{marginBottom:1,children:g(F0,{bold:!0,color:"cyan",children:"Step 3/7: 选择可用工具"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(M0,{marginBottom:1,children:g(F0,{dimColor:!0,children:"方向键导航,空格切换勾选,Enter 确认进入下一步 | ESC 返回上一步"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(iZ,{options:sZ,defaultValue:$.tools,onSubmit:Q},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import YQ from"node:fs";import{useMemoizedFn as z2}from"ahooks";import{Box as o0,Text as $$}from"ink";import j4 from"ink-select-input";import{useEffect as XQ,useMemo as q3,useState as I6}from"react";import{jsxDEV as q0}from"react/jsx-dev-runtime";var h4=10;function _3({workspaceRoot:$,initialMode:J="menu",onComplete:Y,onCancel:Z}){let X=W6($),[Q,U]=I6(J),[G,z]=I6(null),[K,O]=I6(0),[q,N]=I6(0),_=z2(()=>{X.clear(),X.loadFromStandardLocations(),O((M)=>M+1)}),F=q3(()=>{return X.getAllSubagents()},[K]),H=Math.ceil(F.length/h4)||1,P=q3(()=>{let M=q*h4;return F.slice(M,M+h4)},[F,q]);XQ(()=>{let M=Math.max(0,H-1);if(q>M)N(M)},[H,q]);let T=z2(()=>{if(q<H-1)N((M)=>M+1)}),w=z2(()=>{if(q>0)N((M)=>M-1)}),L=[{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"}],R=z2((M)=>{if(M.value==="cancel"){Z?.();return}U(M.value)}),W=z2((M)=>{if(z(M.value),Q==="edit")U("editWizard");else if(Q==="delete")U("deleteConfirm")}),b=z2(async()=>{if(!G?.configPath)return;try{await YQ.promises.unlink(G.configPath),_(),A()}catch(M){console.error("删除失败:",M)}}),A=z2(()=>{U("menu"),z(null)}),C=e0(!1,Z);if(_0((M,y)=>{if(y.escape){if(Q==="menu")Z?.();else if(Q==="list"||Q==="edit"||Q==="delete")N(0),A();else if(Q==="deleteConfirm")A()}else if(y.ctrl&&M==="c"||y.meta&&M==="c")C();else if(Q==="list"){if(y.leftArrow||M==="h")w();else if(y.rightArrow||M==="l")T()}},{isActive:Q!=="create"&&Q!=="editWizard"}),Q==="menu")return q0(o0,{flexDirection:"column",paddingY:1,children:[q0(o0,{marginBottom:1,children:q0($$,{bold:!0,color:"cyan",children:"Agents 管理"},void 0,!1,void 0,this)},void 0,!1,void 0,this),q0(j4,{items:L,onSelect:R},void 0,!1,void 0,this),q0(o0,{marginTop:1,children:q0($$,{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 q0(o0,{flexDirection:"column",paddingY:1,children:[q0(o0,{marginBottom:1,children:q0($$,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this)},void 0,!1,void 0,this),q0(o0,{paddingLeft:2,children:q0($$,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),q0(o0,{marginTop:1,paddingLeft:2,children:q0($$,{color:"gray",children:"配置文件位置: .blade/agents/ 或 ~/.blade/agents/"},void 0,!1,void 0,this)},void 0,!1,void 0,this),q0(o0,{marginTop:1,paddingLeft:2,children:q0($$,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return q0(o0,{flexDirection:"column",paddingY:1,children:[q0(o0,{marginBottom:1,children:[q0($$,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this),q0($$,{color:"gray",children:[" (共 ",F.length," 个)"]},void 0,!0,void 0,this),H>1&&q0($$,{color:"yellow",children:[" ","第 ",q+1,"/",H," 页"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),P.map((M)=>q0(o0,{flexDirection:"column",paddingLeft:2,children:[q0(o0,{children:q0($$,{children:[q0($$,{bold:!0,color:M.color||"white",children:["• ",M.name]},void 0,!0,void 0,this),q0($$,{color:"gray",children:[" - ",M.description]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),M.tools&&M.tools.length>0&&q0(o0,{paddingLeft:2,children:q0($$,{color:"gray",children:["工具: ",M.tools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),M.configPath&&q0(o0,{paddingLeft:2,children:q0($$,{color:"gray",dimColor:!0,children:M.configPath},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},M.name,!0,void 0,this)),q0(o0,{marginTop:1,paddingLeft:2,children:H>1?q0($$,{dimColor:!0,children:"Left/Right to page | ESC 返回菜单"},void 0,!1,void 0,this):q0($$,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}let S=(M)=>{if(F.length===0)return q0(o0,{flexDirection:"column",paddingY:1,children:[q0(o0,{marginBottom:1,children:q0($$,{bold:!0,color:"cyan",children:M},void 0,!1,void 0,this)},void 0,!1,void 0,this),q0(o0,{paddingLeft:2,children:q0($$,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),q0(o0,{marginTop:1,paddingLeft:2,children:q0($$,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);let y=F.map((B)=>({key:B.name,label:`${B.name} - ${B.description}`,value:B}));return q0(o0,{flexDirection:"column",paddingY:1,children:[q0(o0,{marginBottom:1,children:q0($$,{bold:!0,color:"cyan",children:M},void 0,!1,void 0,this)},void 0,!1,void 0,this),q0(j4,{items:y,onSelect:W},void 0,!1,void 0,this),q0(o0,{marginTop:1,children:q0($$,{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 q0(L8,{onComplete:()=>{_(),A()},onCancel:A},void 0,!1,void 0,this);if(Q==="edit")return S("编辑 Agent");if(Q==="editWizard"&&G){let M={name:G.name,description:G.description,tools:G.tools||[],color:G.color,location:G.configPath?.includes(".blade/agents")?"project":"user",systemPrompt:G.systemPrompt||""};return q0(L8,{initialConfig:M,onComplete:()=>{_(),A()},onCancel:A},void 0,!1,void 0,this)}if(Q==="delete")return S("删除 Agent");if(Q==="deleteConfirm"&&G)return q0(o0,{flexDirection:"column",paddingY:1,children:[q0(o0,{marginBottom:1,children:q0($$,{bold:!0,color:"red",children:"确认删除"},void 0,!1,void 0,this)},void 0,!1,void 0,this),q0(o0,{marginBottom:1,paddingLeft:2,children:q0($$,{children:["你确定要删除 Agent"," ",q0($$,{bold:!0,color:"yellow",children:G.name},void 0,!1,void 0,this)," ","吗?"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),q0(o0,{marginBottom:1,paddingLeft:2,children:q0($$,{dimColor:!0,children:["文件路径: ",G.configPath]},void 0,!0,void 0,this)},void 0,!1,void 0,this),q0(o0,{marginBottom:1,paddingLeft:2,children:q0($$,{color:"red",children:"此操作无法撤销!"},void 0,!1,void 0,this)},void 0,!1,void 0,this),q0(j4,{items:[{label:"确认删除",value:"confirm"},{label:"取消",value:"cancel"}],onSelect:(M)=>{if(M.value==="confirm")b();else A()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}import{Box as l2,Text as O0}from"ink";import UQ,{useEffect as GQ,useState as KQ}from"react";import{useEffect as ZQ,useState as O3}from"react";function W3($=G$(),J=5000){let[Y,Z]=O3(null),[X,Q]=O3(!0);return ZQ(()=>{let U=!0,G=async()=>{try{let K=await N3($);if(!U)return;if(!K){Z(null),Q(!1);return}let O=await H3($);if(!U)return;Z(O)}catch{if(U)Z(null)}finally{if(U)Q(!1)}};G();let z=null;if(J>0)z=setInterval(G,J);return()=>{if(U=!1,z)clearInterval(z)}},[$,J]),{branch:Y,loading:X}}function q2($){let J=Math.max(0,Math.ceil($/1000)),Y=Math.floor(J/60),Z=J%60;return Y>0?`${Y}m ${Z}s`:`${Z}s`}function QQ($,J=Date.now()){let Y=$.snapshot?.nextActionAt;return Y===void 0?void 0:Math.max(0,Y-J)}function S6($,J=Date.now()){let Y=$?.snapshot;if(!Y)return null;let Z=QQ($,J),X=Z===void 0?void 0:q2(Z);switch(Y.activity){case"admission_wait":{let Q=Y.admission;return{primary:"等待 Provider 容量",secondary:Q?`队列 ${Q.queuePosition}/${Math.max(Q.queueDepth,Q.queuePosition)} · ${Q.scope} · 已等待 ${q2(Q.waitMs)}`:"等待可用请求容量",compact:Q?`Provider 排队 · ${Q.queuePosition}/${Math.max(Q.queueDepth,Q.queuePosition)}`:"Provider 排队"}}case"retry_wait":{let Q=Y.retry,U=Y.reason==="rate_limit"?`Provider 请求受限${X?`,${X} 后重试`:""}`:`Provider 暂时不可用${X?`,${X} 后重试`:""}`,G=Q?[`尝试 ${Q.attempt}/${Q.maxRetries}`,Q.recoveryRemainingMs!==void 0?`剩余预算 ${q2(Q.recoveryRemainingMs)}`:void 0].filter((z)=>z!==void 0):[];return{primary:U,secondary:G.join(" · "),compact:`${Y.reason==="rate_limit"?"Provider 限流":"Provider 恢复"}${X?` · ${X}`:""}${Q?` · ${Q.attempt}/${Q.maxRetries}`:""}`}}case"retry_attempt":{let Q=Y.retry;return{primary:"正在重试 Provider",secondary:Q?`尝试 ${Q.attempt}/${Q.maxRetries}`:"",compact:`Provider 重试${Q?` · ${Q.attempt}/${Q.maxRetries}`:""}`}}case"circuit_open":return{primary:`${Y.reason==="rate_limit"?"Provider 请求受限":"Provider 故障已隔离"},等待恢复探测${X?`(${X})`:""}`,secondary:Y.circuit?.recoveryRemainingMs!==void 0?`剩余预算 ${q2(Y.circuit.recoveryRemainingMs)}`:"",compact:`Provider ${Y.reason==="rate_limit"?"限流":"熔断"}${X?` · ${X}`:""}`};case"circuit_probe":return{primary:"Provider 正在执行恢复探测",secondary:"",compact:"Provider 恢复探测"};case"stream_stall":{let Q=Y.stall;return{primary:Q?.outputStarted?"Provider 流暂时停滞":"Provider 尚未返回流数据",secondary:Q?`已等待 ${q2(Q.durationMs)} · 超时上限 ${q2(Q.timeoutMs)}`:"",compact:Q?`Provider 等待 · ${q2(Q.durationMs)}`:"Provider 等待"}}case"fallback":{let Q=Y.fallback;return{primary:Q?`正在切换到 ${Q.to.model}`:"正在切换模型",secondary:Q?`候选 ${Q.candidate}/${Q.candidateCount} · 来源 ${Q.from.model}`:"",compact:Q?`Provider 切换 · ${Q.to.model}`:"Provider 切换"}}}}import{jsxDEV as $0,Fragment as B$}from"react/jsx-dev-runtime";function k6($){if(!Number.isFinite($)||$<=0)return"0";if($<1000)return $.toString();if($<1e6)return`${($/1000).toFixed(1)}K`;return`${($/1e6).toFixed(2)}M`}function zQ($){return $?`exec-host:${$.category}:${$.consecutiveCount}`:""}function qQ($){if(!$)return"";return`lineage:${$.rootTurnId?.slice(0,8)??"?"}:${$.currentTurnId.slice(0,8)}`}var L3=UQ.memo(()=>{let $=E8(),J=h2(),Z=V2()==="shortcuts",X=YJ(),Q=_1(),{branch:U}=W3(Q),G=g8(),z=i9(),K=c9(),O=x8(),q=c8(),N=u8(),_=d8(),F=l8(),H=u9(),P=d9(),T=j8(),w=p8(),L=_J(),R=JJ(),W=h8(),b=a9(),A=v2(),[C,S]=KQ(null),M=S6(T);GQ(()=>{let Y0=!1;new E4(Q,A).get().then((d)=>{if(!Y0)S(d)}).catch(()=>{if(!Y0)S(null)});let N0=E4.subscribe((d)=>{if(!Y0&&d.sessionId===A&&d.workspaceRoot===Q)S(d.goal)});return()=>{Y0=!0,N0()}},[A,Q]);let y=G?B6(G):!1,V=(()=>{if(J==="default")return null;if(J==="autoEdit")return $0(O0,{color:"magenta",children:[">> ","auto edit on ",$0(O0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="plan")return $0(O0,{color:"cyan",children:["‖ plan mode on ",$0(O0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="yolo")return $0(O0,{color:"red",children:["yolo mode on ",$0(O0,{color:"gray",children:"(all tools auto-approved)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null})(),o=V!==null,a=[["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 $0(l2,{flexDirection:"row",justifyContent:"space-between",paddingX:2,paddingY:0,children:[Z?$0(l2,{flexDirection:"column",gap:0,children:a.map((Y0,Q0)=>$0(l2,{flexDirection:"row",children:[Y0.map((N0,d)=>{let[D,v]=N0.split(":");return $0(l2,{flexDirection:"row",width:20,children:[$0(O0,{color:"yellow",children:D},void 0,!1,void 0,this),$0(O0,{color:"gray",children:":"},void 0,!1,void 0,this),$0(O0,{color:"white",children:v},void 0,!1,void 0,this)]},d,!0,void 0,this)}),Q0===a.length-1&&$0(O0,{color:"cyan",children:" ? 关闭"},void 0,!1,void 0,this)]},Q0,!0,void 0,this))},void 0,!1,void 0,this):$0(l2,{flexDirection:"row",gap:1,children:[U&&$0(B$,{children:[$0(O0,{color:"gray",children:[" ",U]},void 0,!0,void 0,this),$0(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),V,o&&$0(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),C&&$0(B$,{children:[$0(O0,{color:C.status==="active"?"green":C.status==="verifying"?"cyan":C.status==="blocked"||C.status==="budget_limited"?"yellow":"gray",children:["goal:",C.status," ",C.objective.slice(0,32),C.prematureStop?` recovery:${C.prematureStop.consecutiveCount}`:"",C.verificationStall?` verify-gap:${C.verificationStall.consecutiveCount}`:"",C.frontierStall?` frontier:${C.frontierStall.category}:${C.frontierStall.consecutiveCount}`:"",C.executionHostFailure?` ${zQ(C.executionHostFailure)}`:"",C.turnLineage?` ${qQ(C.turnLineage)}`:""]},void 0,!0,void 0,this),$0(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(O0,{color:"gray",children:"? for shortcuts"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(l2,{flexDirection:"row",gap:1,children:!$?$0(O0,{color:"red",children:"[WARN] API 密钥未配置"},void 0,!1,void 0,this):$0(B$,{children:[y&&$0(B$,{children:[O?$0(O0,{color:"cyan",children:["Effort ",q]},void 0,!0,void 0,this):$0(O0,{color:"gray",children:"Tab:Effort"},void 0,!1,void 0,this),$0(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N!=="auto"&&$0(B$,{children:[$0(O0,{color:N==="fast"?"yellow":"gray",children:["Speed ",N]},void 0,!0,void 0,this),$0(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),_!=="auto"&&$0(B$,{children:[$0(O0,{color:"gray",children:["Output ",_]},void 0,!0,void 0,this),$0(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),F!=="auto"&&$0(B$,{children:[$0(O0,{color:"gray",children:["Style ",F]},void 0,!0,void 0,this),$0(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),G&&$0(O0,{color:"gray",children:G.model},void 0,!1,void 0,this),M&&$0(B$,{children:[$0(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),$0(O0,{color:"yellow",children:M.compact},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),K?$0(O0,{color:"yellow",children:"压缩中..."},void 0,!1,void 0,this):$0(O0,{color:z<20?"red":z<50?"yellow":"gray",children:[z,"%"]},void 0,!0,void 0,this),$0(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),$0(O0,{color:H.hitRate===void 0?"gray":"cyan",children:["Cache ",F3(H.hitRate),H.hitRate!==void 0&&$0(O0,{color:"gray",children:[" ","(r ",k6(H.cacheReadTokens)," · w"," ",k6(H.cacheWriteTokens),")"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$0(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),$0(O0,{color:"gray",children:[k6(P.inputTokens)," in /"," ",k6(P.outputTokens)," out"]},void 0,!0,void 0,this),P.estimatedCostUsd>0.001&&$0(B$,{children:[$0(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),$0(O0,{color:"green",children:["$",P.estimatedCostUsd<0.01?P.estimatedCostUsd.toFixed(4):P.estimatedCostUsd.toFixed(3)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),b&&$0(B$,{children:[$0(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),$0(O0,{color:"cyan",children:["Tools ",b.registeredCount]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),b&&b.disabledNames.length>0&&$0(B$,{children:[$0(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),$0(O0,{color:"yellow",children:["off ",b.disabledNames.length]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),b&&b.recentFailures.length>0&&$0(B$,{children:[$0(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),$0(O0,{color:"red",children:["fail ",b.recentFailures[0]?.toolName]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),(w?.pending??0)>0&&$0(B$,{children:[$0(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),$0(O0,{color:"yellow",children:["Queued ",w?.pending??0," · /queue"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),L>0&&$0(B$,{children:[$0(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),$0(O0,{color:"cyan",children:["已恢复 ",L," 条指令"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),W.length>0&&$0(B$,{children:[$0(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),$0(O0,{color:"cyan",children:["New tasks ",W.length," · /resume"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),R==="error"&&$0(B$,{children:[$0(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),$0(O0,{color:"yellow",children:"Task sync unavailable"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X&&$0(B$,{children:[$0(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),$0(O0,{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 g4,Text as m4}from"ink";import _Q from"react";import{jsxDEV as r2}from"react/jsx-dev-runtime";var w3=_Q.memo(({suggestions:$,selectedIndex:J,visible:Y,maxDisplay:Z=8})=>{if(!Y||$.length===0)return null;let X=0,Q=Math.min(Z,$.length),U=J>=$.length;if(J>=Z&&!U)X=J-Z+1,Q=J+1;let G=$.slice(X,Q),z=$.length>Z;return r2(g4,{flexDirection:"column",paddingX:2,paddingY:0,children:[G.map((K,O)=>{let N=X+O===J;return r2(g4,{flexDirection:"row",paddingX:1,gap:2,children:[r2(m4,{color:N?"cyan":"white",bold:N,children:K.command},void 0,!1,void 0,this),r2(m4,{color:N?"cyan":"gray",dimColor:!N,children:["- ",K.description]},void 0,!0,void 0,this)]},K.command,!0,void 0,this)}),z&&r2(g4,{paddingX:1,children:r2(m4,{color:U?"cyan":"gray",bold:U,dimColor:!U,children:["... and ",$.length-Z," more"]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as n$,Text as H1,useStdout as JU}from"ink";import YU from"ink-select-input";import X9,{useMemo as u3}from"react";import{Box as I0,Text as x0}from"ink";import O2,{useEffect as J9,useMemo as _2,useRef as p3}from"react";import{Box as l4,Text as M3}from"ink";import FQ from"react";import{Text as Z1}from"ink";import NQ from"react";import B3 from"string-width";import OQ from"wrap-ansi";var w8=($)=>{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 B3(J)},A3=($,J,Y="...")=>{if(w8($)<=J)return $;if(J<=Y.length)return Y.substring(0,J);let X=0,Q=$.length,U="";while(X<=Q){let G=Math.floor((X+Q)/2),z=$.substring(0,G);if(w8(z)<=J-Y.length)U=z,X=G+1;else Q=G-1}return U+Y},P3=($)=>{return/[*_~`<[\]https?:]/.test($)},p4=($)=>{let Y=$.replace(/\*\*(.*?)\*\*/g,"$1").replace(/\*(.*?)\*/g,"$1").replace(/_(.*?)_/g,"$1").replace(/~~(.*?)~~/g,"$1").replace(/`(.*?)`/g,"$1").replace(/<u>(.*?)<\/u>/g,"$1").replace(/\[(.*?)\]\(.*?\)/g,"$1").split(/\s+/).filter((Z)=>Z.length>0);if(Y.length===0)return 0;return Math.max(...Y.map((Z)=>B3(Z)))},a2=($,J,Y=!1)=>{if(J<=0)return[$];let Z=$.trimEnd(),Q=OQ(Z,J,{hard:Y,trim:!1,wordWrap:!0}).split(`
|
|
124
|
+
`).filter((U)=>U.length>0);return Q.length>0?Q:[""]},b3=($,J,Y,Z)=>{let X=Math.max(0,Y-J);if(Z==="center"){let Q=Math.floor(X/2);return" ".repeat(Q)+$+" ".repeat(X-Q)}if(Z==="right")return" ".repeat(X)+$;return $+" ".repeat(X)};import{jsxDEV as o$,Fragment as WQ}from"react/jsx-dev-runtime";var x4=2,c4=1,u4=2;function d4($,J){return`inline-${$}-${J}`}var HQ=({text:$})=>{let J=f0();if(!P3($))return o$(Z1,{children:$},void 0,!1,void 0,this);let Y=[],Z=0,X=0,Q=0,U=/(\*\*.*?\*\*|\*(?!\s).*?(?<!\s)\*|_(?!\s).*?(?<!\s)_|~~.*?~~|`+[^`]+`+|\[.*?\]\(.*?\)|https?:\/\/\S+)/g,G;while((G=U.exec($))!==null){if(G.index>Z){let q=$.slice(Z,G.index);Y.push(o$(Z1,{children:q},d4("text",X++),!1,void 0,this))}let z=G[0],K=null,O=d4("match",Q++);try{if(z.startsWith("**")&&z.endsWith("**")&&z.length>x4*2)K=o$(Z1,{bold:!0,children:z.slice(x4,-x4)},O,!1,void 0,this);else if(z.length>c4*2&&(z.startsWith("*")&&z.endsWith("*")||z.startsWith("_")&&z.endsWith("_"))){let q=$.substring(G.index-1,G.index),N=$.substring(U.lastIndex,U.lastIndex+1);if(!(/\w/.test(q)||/\w/.test(N)||/[./\\]/.test(q+N)))K=o$(Z1,{italic:!0,children:z.slice(c4,-c4)},O,!1,void 0,this)}else if(z.startsWith("~~")&&z.endsWith("~~")&&z.length>u4*2)K=o$(Z1,{strikethrough:!0,children:z.slice(u4,-u4)},O,!1,void 0,this);else if(z.startsWith("`")&&z.endsWith("`")){let q=z.match(/^(`+)([^`]+)\1$/);if(q&&q[2])K=o$(Z1,{color:J.colors.syntax.keyword,backgroundColor:J.colors.background.secondary,bold:!0,children:` ${q[2]} `},O,!1,void 0,this)}else if(z.startsWith("[")&&z.includes("](")&&z.endsWith(")")){let q=z.match(/\[(.*?)\]\((.*?)\)/);if(q){let N=q[1],_=q[2];K=o$(Z1,{children:[N,o$(Z1,{color:J.colors.info,children:[" (",_,")"]},void 0,!0,void 0,this)]},O,!0,void 0,this)}}else if(z.match(/^https?:\/\//))K=o$(Z1,{color:J.colors.info,children:z},O,!1,void 0,this)}catch(q){console.error("InlineRenderer 解析错误:",z,q),K=null}Y.push(K??o$(Z1,{children:z},O,!1,void 0,this)),Z=U.lastIndex}if(Z<$.length){let z=$.slice(Z);Y.push(o$(Z1,{children:z},d4("text",X++),!1,void 0,this))}return o$(WQ,{children:Y.filter((z)=>z!==null)},void 0,!1,void 0,this)},Q1=NQ.memo(HQ);import{jsxDEV as i2}from"react/jsx-dev-runtime";var LQ="▎",T3=FQ.memo(({lines:$,level:J})=>{let Y=f0(),Z=LQ.repeat(J);return i2(l4,{flexDirection:"column",children:$.map((X,Q)=>{if(X.trim()==="")return i2(l4,{height:1},Q,!1,void 0,this);return i2(l4,{flexDirection:"row",children:[i2(M3,{dimColor:!0,color:Y.colors.text.muted,children:[Z," "]},void 0,!0,void 0,this),i2(M3,{italic:!0,wrap:"wrap",children:i2(Q1,{text:X},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 D6,Text as I1}from"ink";import{isPlainObject as o4}from"lodash-es";import{common as yQ,createLowlight as IQ}from"lowlight";import{LRUCache as SQ}from"lru-cache";import f3 from"react";import{Box as f6,Text as B8}from"ink";import y1,{Fragment as S3}from"react";import{LRUCache as I3}from"lru-cache";import wQ from"string-width";var BQ=1024,AQ=1048576,C3=1000,R3=new I3({max:BQ,maxSize:AQ,sizeCalculation:($,J)=>Math.max(1,J.length*2+$.length*8)});function r4($){let J=!0;for(let Z=0;Z<$.length;Z++)if($.charCodeAt(Z)>127){J=!1;break}if(J)return $.split("");if($.length<=C3){let Z=R3.get($);if(Z)return Z}let Y=Array.from($);if($.length<=C3)R3.set($,Y);return Y}var PQ=2048,bQ=524288,MQ=4096,y3=new I3({max:PQ,maxSize:bQ,sizeCalculation:($,J)=>Math.max(1,J.length*2+8)});function R1($){if(/^[\x20-\x7E]*$/.test($))return $.length;let J=y3.get($);if(J!==void 0)return J;let Y=wQ($);if($.length<=MQ)y3.set($,Y);return Y}import{jsxDEV as o2}from"react/jsx-dev-runtime";var a4=2,k3=y1.memo(({children:$,maxWidth:J,maxHeight:Y,overflowDirection:Z="top",additionalHiddenLinesCount:X=0})=>{let Q=f0(),U=[],G=Math.max(Math.round(Y??Number.MAX_SAFE_INTEGER),a4);function z(H){if(!y1.isValidElement(H))return;if(H.type===S3){y1.Children.forEach(H.props.children,z);return}if(H.type===f6){CQ(H,J,U);return}}y1.Children.forEach($,z);let O=U.length>G||X>0?G-1:G,q=O!==void 0?Math.max(0,U.length-O):0,N=q+X,F=(q>0?Z==="top"?U.slice(q):U.slice(0,O):U).map((H,P)=>o2(f6,{children:H.length>0?H.map((T,w)=>o2(B8,{...T.props,children:T.text},w,!1,void 0,this)):o2(B8,{children:" "},void 0,!1,void 0,this)},P,!1,void 0,this));return o2(f6,{flexDirection:"column",width:J,flexShrink:0,children:[N>0&&Z==="top"&&o2(B8,{color:Q.colors.text.muted,dimColor:!0,children:["... ",N," line",N===1?"":"s"," hidden ..."]},void 0,!0,void 0,this),F,N>0&&Z==="bottom"&&o2(B8,{color:Q.colors.text.muted,dimColor:!0,children:["... ",N," line",N===1?"":"s"," hidden ..."]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});function TQ($){if(!y1.isValidElement($)||$.type!==f6)return{noWrapSegments:[],segments:[]};let J={noWrapSegments:[],segments:[]},Y=!1;function Z(X,Q){if(X===null||X===void 0)return;if(typeof X==="string"||typeof X==="number"){let K=String(X);if(!K)return;let O={text:K,props:Q??{}};if(Q===void 0||Q.wrap==="wrap")Y=!0,J.segments.push(O);else if(!Y)J.noWrapSegments.push(O);else J.segments.push(O);return}if(!y1.isValidElement(X))return;if(X.type===S3){y1.Children.forEach(X.props.children,(K)=>Z(K,Q));return}if(X.type!==B8)return;let{children:U,...G}=X.props,z=Q===void 0?G:{...Q,...G};y1.Children.forEach(U,(K)=>Z(K,z))}return y1.Children.forEach($.props.children,(X)=>Z(X,void 0)),J}function CQ($,J,Y){let Z=TQ($);if(Z.segments.length===0&&Z.noWrapSegments.length===0){Y.push([]);return}let X=0;for(let q of Z.noWrapSegments)X+=R1(q.text);if(Z.segments.length===0){let q=[],N=[];for(let _ of Z.noWrapSegments){let F=_.text.split(`
|
|
125
|
+
`);for(let H=0;H<F.length;H++){if(H>0)q.push(N),N=[];if(F[H])N.push({text:F[H],props:_.props})}}if(N.length>0)q.push(N);for(let _ of q)Y.push(_);return}let Q=J-X;if(Q<1){RQ(Z.noWrapSegments,J,Y);return}let U=[],G=[],z=0;function K(){if(U.length===0)U.push([...Z.noWrapSegments,...G]);else if(X>0)U.push([{text:" ".repeat(X),props:{}},...G]);else U.push(G);G=[],z=0}function O(q,N){if(G.length>0&&G[G.length-1].props===N)G[G.length-1].text+=q;else G.push({text:q,props:N})}for(let q of Z.segments){let N=q.text.split(`
|
|
126
|
+
`);for(let _=0;_<N.length;_++){if(_>0)K();let H=N[_].split(/(\s+)/);for(let P of H){if(!P)continue;let T=R1(P);if(z+T>Q&&z>0){if(K(),/^\s+$/.test(P))continue}if(T>Q){let L=r4(P);while(L.length>0){let R=0,W=0;for(let b of L){let A=R1(b);if(z+W+A>Q)break;W+=A,R++}if(R>0){let b=L.slice(0,R).join("");O(b,q.props),z+=R1(b),L=L.slice(R)}if(L.length>0)K()}}else O(P,q.props),z+=T}}if(q.text.endsWith(`
|
|
127
|
+
`))K()}if(G.length>0)K();for(let q of U)Y.push(q)}function RQ($,J,Y){let Z=[],X=[],Q=0;for(let U of $){let G=U.text.split(`
|
|
128
|
+
`);for(let z=0;z<G.length;z++){if(z>0)Z.push(X),X=[],Q=0;let K=G[z];if(!K)continue;let O=R1(K),q=Math.max(0,J-R1("…"));if(O<=q&&Q===0)X.push({text:K,props:U.props}),Q+=O;else{let N=r4(K),_=Q,F=0;for(let P of N){let T=R1(P);if(_+T>q)break;_+=T,F++}let H=N.slice(0,F).join("");if(H)X.push({text:H,props:U.props});X.push({text:"…",props:{}}),Q=_+R1("…")}}}if(X.length>0)Z.push(X);if(Z.length===0)Z.push([{text:"…",props:{}}]);for(let U of Z)Y.push(U)}import{jsxDEV as k$}from"react/jsx-dev-runtime";var i4=IQ(yQ),kQ=200,fQ=524288,DQ=4096,D3=new SQ({max:kQ,maxSize:fQ,sizeCalculation:($)=>$.retainedChars});function v3($,J){return`${J??"__auto__"}\x00${$}`}function vQ($,J){return D3.get(v3($,J))?.root}function VQ($,J,Y){if($.length>DQ)return;let Z=J?.length??0;D3.set(v3($,J),{root:Y,retainedChars:Math.max(1,$.length*2+Z)})}function jQ($){return o4($)&&$.type==="text"&&typeof $.value==="string"}function hQ($){return o4($)&&$.type==="element"}function EQ($){return o4($)&&$.type==="root"&&Array.isArray($.children)}function v6($,J,Y=0){if(jQ($))return k$(I1,{wrap:"wrap",children:$.value},Y,!1,void 0,this);if(hQ($)){let Z=$.properties?.className?.[0]||"",X=J.default;if(Z.includes("comment"))X=J.comment;else if(Z.includes("string"))X=J.string;else if(Z.includes("number"))X=J.number;else if(Z.includes("keyword"))X=J.keyword;else if(Z.includes("function"))X=J.function;else if(Z.includes("variable"))X=J.variable;else if(Z.includes("operator"))X=J.operator;else if(Z.includes("type"))X=J.type;else if(Z.includes("tag"))X=J.tag;else if(Z.includes("attr"))X=J.attr;let Q=$.children?.map((U,G)=>v6(U,J,G));return k$(I1,{color:X,wrap:"wrap",children:Q},Y,!1,void 0,this)}if(EQ($))return k$(f3.Fragment,{children:$.children.map((Z,X)=>v6(Z,J,X))},Y,!1,void 0,this);return k$(I1,{},Y,!1,void 0,this)}function gQ($,J,Y){let Z=Y||F$.getTheme().colors.syntax;try{let X=vQ($,J);if(X)return v6(X,Z);let Q;if(!J||!i4.registered(J))Q=i4.highlightAuto($);else Q=i4.highlight(J,$);let U=Q;if(!U.children||U.children.length===0)return k$(I1,{color:Z.default,wrap:"wrap",children:$},void 0,!1,void 0,this);return VQ($,J,Q),v6(Q,Z)}catch(X){return k$(I1,{color:Z.default,wrap:"wrap",children:$},void 0,!1,void 0,this)}}var V6=f3.memo(({content:$,language:J,showLineNumbers:Y=!0,terminalWidth:Z,availableHeight:X})=>{let Q=f0(),U=$.split(`
|
|
129
|
+
`),G=0;if(X&&U.length>X){let q=Math.max(X,a4);if(U.length>q)G=U.length-q,U=U.slice(G)}let z=U.length+G,K=String(z).length+1,O=Math.max(20,Z-4);return k$(D6,{borderStyle:"round",borderColor:Q.colors.border.light,paddingX:1,paddingY:0,marginY:1,flexDirection:"column",children:[J&&k$(D6,{marginBottom:0,children:k$(I1,{color:Q.colors.text.secondary,children:J},void 0,!1,void 0,this)},void 0,!1,void 0,this),G>0&&k$(D6,{marginBottom:0,children:k$(I1,{color:Q.colors.text.muted,dimColor:!0,children:["... ",G," lines hidden ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),k$(k3,{maxWidth:O,maxHeight:X,children:U.map((q,N)=>{let _=N+G+1;return k$(D6,{flexDirection:"row",children:[Y&&k$(I1,{color:Q.colors.text.muted,dimColor:!0,wrap:"truncate",children:[String(_).padStart(K-1," ")," "]},void 0,!0,void 0,this),q.trim()===""?k$(I1,{wrap:"wrap",children:" "},void 0,!1,void 0,this):gQ(q,J,Q.colors.syntax)]},N,!0,void 0,this)})},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as V3,Text as p$}from"ink";import mQ,{useState as pQ}from"react";import{jsxDEV as f$}from"react/jsx-dev-runtime";var j3=400;function xQ($){let J=$.split(`
|
|
130
|
+
`),Y=[],Z=0,X=0;for(let Q of J){if(Q.startsWith("---")||Q.startsWith("+++"))continue;if(Q.startsWith("@@")){let U=Q.match(/@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@/);if(U)Z=parseInt(U[1],10),X=parseInt(U[3],10);Y.push({type:"header",content:Q});continue}if(Q.startsWith("-")){Y.push({type:"remove",content:Q.substring(1),lineNumber:Z}),Z++;continue}if(Q.startsWith("+")){Y.push({type:"add",content:Q.substring(1),lineNumber:X}),X++;continue}if(Q.startsWith(" ")||Q===""){Y.push({type:"context",content:Q.substring(1),lineNumber:X}),Z++,X++;continue}}return Y}var n4=mQ.memo(({patch:$,startLine:J,matchLine:Y,terminalWidth:Z,maxLines:X=20,isFocused:Q=!1})=>{let U=f0(),G=xQ($),[z,K]=pQ(!1);_0((w)=>{if(w.toLowerCase()==="e")K((L)=>!L)},{isActive:Q&&G.length>X});let q=Math.max(...G.map((w)=>w.lineNumber||0)).toString().length+1,N=G.filter((w)=>w.type==="add").length,_=G.filter((w)=>w.type==="remove").length,F=G.length,H=F>X,P;if(!H)P=G;else if(z)P=G.slice(0,j3);else P=G.slice(0,X);let T=F-P.length;return f$(V3,{flexDirection:"column",marginTop:1,marginBottom:1,children:[f$(p$,{color:U.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,Z)))},void 0,!1,void 0,this),H&&f$(p$,{color:U.colors.info,children:[z?`已展开 ${P.length}/${F} 行`:`显示前 ${X} 行,共 ${F} 行`," · ",f$(p$,{color:U.colors.success,children:["+",N]},void 0,!0,void 0,this)," ",f$(p$,{color:U.colors.error,children:["-",_]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),H&&f$(p$,{color:U.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,Z)))},void 0,!1,void 0,this),P.map((w,L)=>{if(w.type==="header")return f$(p$,{color:U.colors.muted,dimColor:!0,children:w.content},L,!1,void 0,this);let R=w.lineNumber?w.lineNumber.toString().padStart(q," "):" ".repeat(q),W=" ",b,A;if(w.type==="add")W="+",A=U.colors.success,b=void 0;else if(w.type==="remove")W="-",A=U.colors.error,b=void 0;else A=U.colors.text.primary;let C=Math.max(0,Z-q-2),S=w.content;if(S.length>C)S=S.substring(0,C-3)+"...";return f$(p$,{color:A,backgroundColor:b,children:[f$(p$,{dimColor:!0,children:R},void 0,!1,void 0,this),f$(p$,{children:W},void 0,!1,void 0,this),f$(p$,{children:[" ",S]},void 0,!0,void 0,this)]},L,!0,void 0,this)}),H&&f$(V3,{marginTop:1,children:z?f$(p$,{color:U.colors.info,dimColor:!0,children:[T>0?`已达显示上限 ${j3} 行,仍有 ${T} 行未显示`:"已显示全部内容",Q?" · 按 E 折叠":""]},void 0,!0,void 0,this):f$(p$,{color:U.colors.info,dimColor:!0,children:["已隐藏剩余 ",T," 行",Q?" · 按 E 展开全部":""]},void 0,!0,void 0,this)},void 0,!1,void 0,this),f$(p$,{color:U.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,Z)))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as t4,Text as h3}from"ink";import cQ from"react";import{jsxDEV as n2}from"react/jsx-dev-runtime";var uQ=({itemText:$,type:J,marker:Y,leadingWhitespace:Z=""})=>{let X=J==="ol"?`${Y}. `:`${Y} `,Q=X.length,U=Z.length;return n2(t4,{paddingLeft:U+1,flexDirection:"row",children:[n2(t4,{width:Q,children:n2(h3,{children:X},void 0,!1,void 0,this)},void 0,!1,void 0,this),n2(t4,{flexGrow:1,children:n2(h3,{wrap:"wrap",children:n2(Q1,{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)},s4=cQ.memo(uQ);import{Text as e4}from"ink";import dQ,{useMemo as lQ}from"react";import E3 from"string-width";import{jsxDEV as $9}from"react/jsx-dev-runtime";var g3=4,t2=3,rQ=4,m3=dQ.memo(({headers:$,rows:J,terminalWidth:Y})=>{let Z=f0(),X=lQ(()=>{if($.length===0||J.length===0)return null;let q=$.length,N=$.map((A,C)=>{let S=Math.max(p4(A),t2);for(let M of J)S=Math.max(S,p4(M[C]||""));return S}),_=$.map((A,C)=>{let S=Math.max(w8(A),t2);for(let M of J)S=Math.max(S,w8(M[C]||""));return S}),F=1+q*3,H=Math.max(Y-F-g3,q*t2),P=N.reduce((A,C)=>A+C,0),T=_.reduce((A,C)=>A+C,0),w=!1,L;if(T<=H)L=_;else if(P<=H){let A=H-P,C=_.map((M,y)=>M-N[y]),S=C.reduce((M,y)=>M+y,0);L=N.map((M,y)=>{if(S===0)return M;let B=Math.floor(C[y]/S*A);return M+B})}else{w=!0;let A=H/P;L=N.map((C)=>Math.max(Math.floor(C*A),t2))}function R(){let A=1;for(let C=0;C<$.length;C++){let S=a2($[C],L[C],w);A=Math.max(A,S.length)}for(let C of J)for(let S=0;S<C.length;S++){let M=a2(C[S]||"",L[S],w);A=Math.max(A,M.length)}return A}if(R()>rQ)return{type:"vertical",columnWidths:L,needsHardWrap:w};return{type:"horizontal",columnWidths:L,needsHardWrap:w}},[$,J,Y]);if(!X)return null;if(X.type==="vertical"){let q=Math.min(Y-1,40),N="─".repeat(q);return $9(e4,{children:J.map((_,F)=>{let H=[];if(F>0)H.push(N);return _.forEach((P,T)=>{let w=$[T]||`Column ${T+1}`,L=(P||"").replace(/\n+/g," ").trim();H.push(`\x1B[1m${w}:\x1B[22m ${L}`)}),H.join(`
|
|
131
131
|
`)}).join(`
|
|
132
|
-
`)},void 0,!1,void 0,this)}let{columnWidths:Q,needsHardWrap:U}=X;function G(q){let _={top:{left:"┌",mid:"┬",right:"┐",h:"─"},middle:{left:"├",mid:"┼",right:"┤",h:"─"},bottom:{left:"└",mid:"┴",right:"┘",h:"─"}}[q],F=_.left;return Q.forEach((H,P)=>{F+=_.h.repeat(H+2),F+=P<Q.length-1?_.mid:_.right}),F}function z(q,N){let _=q.map((
|
|
132
|
+
`)},void 0,!1,void 0,this)}let{columnWidths:Q,needsHardWrap:U}=X;function G(q){let _={top:{left:"┌",mid:"┬",right:"┐",h:"─"},middle:{left:"├",mid:"┼",right:"┤",h:"─"},bottom:{left:"└",mid:"┴",right:"┘",h:"─"}}[q],F=_.left;return Q.forEach((H,P)=>{F+=_.h.repeat(H+2),F+=P<Q.length-1?_.mid:_.right}),F}function z(q,N){let _=q.map((T,w)=>{let L=Q[w]||t2;return a2(T||"",L,U)}),F=Math.max(..._.map((T)=>T.length),1),H=_.map((T)=>Math.floor((F-T.length)/2)),P=[];for(let T=0;T<F;T++){let w="│";for(let L=0;L<q.length;L++){let R=_[L],W=H[L],b=T-W,A=b>=0&&b<R.length?R[b]:"",C=Q[L]||t2,S=E3(A),M=b3(N?`\x1B[1m${A}\x1B[22m`:A,S,C,N?"center":"left");w+=` ${M} │`}P.push(w)}return P}let K=[];if(K.push(G("top")),K.push(...z($,!0)),K.push(G("middle")),J.forEach((q,N)=>{if(K.push(...z(q,!1)),N<J.length-1)K.push(G("middle"))}),K.push(G("bottom")),Math.max(...K.map((q)=>E3(q)))>Y-g3){let q=Math.min(Y-1,40),N="─".repeat(q);return $9(e4,{children:J.map((_,F)=>{let H=[];if(F>0)H.push(N);return _.forEach((P,T)=>{let w=$[T]||`Column ${T+1}`,L=(P||"").replace(/\n+/g," ").trim();H.push(`\x1B[1m${w}:\x1B[22m ${L}`)}),H.join(`
|
|
133
133
|
`)}).join(`
|
|
134
134
|
`)},void 0,!1,void 0,this)}return $9(e4,{color:Z.colors.text.primary,children:K.join(`
|
|
135
|
-
`)},void 0,!1,void 0,this)});import{jsxDEV as u}from"react/jsx-dev-runtime";var
|
|
135
|
+
`)},void 0,!1,void 0,this)});import{jsxDEV as u}from"react/jsx-dev-runtime";var aQ=($,J,Y)=>{switch($){case"user":return{color:J.info,prefix:"> "};case"assistant":return{color:J.success,prefix:"• "};case"system":return{color:J.warning,prefix:" "};case"tool":{let Z=Y&&"phase"in Y?Y.phase:void 0;return{color:J.text.secondary,prefix:Z==="start"?"• ":Z==="complete"?" └ ":" "}}default:return{color:J.text.primary,prefix:" "}}},iQ=O2.memo(({content:$,language:J,terminalWidth:Y,isPending:Z=!1,availableHeight:X})=>{let Q=f0();if(Z&&X!==void 0){let U=$.split(`
|
|
136
136
|
`),G=4,z=Math.max(1,X-4);if(U.length>z){let K=U.slice(0,z).join(`
|
|
137
|
-
`);return u(I0,{flexDirection:"column",flexShrink:0,children:[u(V6,{content:K,language:J,showLineNumbers:!0,terminalWidth:Y},void 0,!1,void 0,this),u(x0,{color:Q.colors.text.muted,dimColor:!0,children:"... generating more code ..."},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}}return u(V6,{content:$,language:J,showLineNumbers:!0,terminalWidth:Y},void 0,!1,void 0,this)}),
|
|
137
|
+
`);return u(I0,{flexDirection:"column",flexShrink:0,children:[u(V6,{content:K,language:J,showLineNumbers:!0,terminalWidth:Y},void 0,!1,void 0,this),u(x0,{color:Q.colors.text.muted,dimColor:!0,children:"... generating more code ..."},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}}return u(V6,{content:$,language:J,showLineNumbers:!0,terminalWidth:Y},void 0,!1,void 0,this)}),oQ=O2.memo(({content:$,level:J})=>{let Y=f0();switch(J){case 1:return u(x0,{bold:!0,color:Y.colors.primary,children:u(Q1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 2:return u(x0,{bold:!0,color:Y.colors.primary,children:u(Q1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 3:return u(x0,{bold:!0,color:Y.colors.text.primary,children:u(Q1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 4:return u(x0,{italic:!0,color:Y.colors.text.muted,children:u(Q1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);default:return u(x0,{children:u(Q1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)}}),nQ=O2.memo(({terminalWidth:$})=>{let J=f0(),Y=Math.max(0,Math.min($-4,80));return u(x0,{dimColor:!0,color:J.colors.text.muted,children:"─".repeat(Y)},void 0,!1,void 0,this)}),tQ=O2.memo(({content:$})=>{return u(x0,{wrap:"wrap",children:u(Q1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)}),sQ=O2.memo(({content:$})=>{let J=f0();return u(I0,{flexDirection:"row",gap:1,children:[u(x0,{color:J.colors.info,children:" "},void 0,!1,void 0,this),u(x0,{color:J.colors.text.muted,italic:!0,children:$},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}),eQ=O2.memo(({detail:$,terminalWidth:J})=>{let Y=f0(),Z=50,X=$.split(`
|
|
138
138
|
`);while(X.length>0&&X[0].trim()==="")X.shift();while(X.length>0&&X[X.length-1].trim()==="")X.pop();let Q=X.length>50,U=Q?X.slice(0,50):X,G=U.join(`
|
|
139
|
-
`),z=G.includes("<<<DIFF>>>"),K=G.includes("```");if(z){let O=G.match(/<<<DIFF>>>\s*({[\s\S]*?})\s*<<<\/DIFF>>>/);if(O)try{let q=JSON.parse(O[1]);return u(I0,{flexDirection:"column",children:[u(n4,{patch:q.patch,startLine:q.startLine,matchLine:q.matchLine,terminalWidth:J},void 0,!1,void 0,this),Q&&u(I0,{marginTop:1,children:u(x0,{dimColor:!0,color:Y.colors.text.muted,children:["... 省略 ",X.length-50," 行 ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}catch{}}if(K){let O=G.match(/```(\w+)?\s*\n([\s\S]*?)\n```/);if(O){let q=O[1]||"text",N=O[2];return u(I0,{flexDirection:"column",children:[u(V6,{content:N,language:q,showLineNumbers:!1,terminalWidth:J},void 0,!1,void 0,this),Q&&u(I0,{marginTop:1,children:u(x0,{dimColor:!0,color:Y.colors.text.muted,children:["... 省略 ",X.length-50," 行 ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}}return u(I0,{flexDirection:"column",children:[U.map((O,q)=>u(x0,{color:Y.colors.text.primary,children:O},q,!1,void 0,this)),Q&&u(I0,{marginTop:1,children:u(x0,{dimColor:!0,color:Y.colors.text.muted,children:["... 省略 ",X.length-50," 行 ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});function
|
|
140
|
-
`,K);if(q!==-1&&q-K<U)O=q+1;let N=$.slice(O),F=($.slice(0,O).match(/\n/g)||[]).length+1;return{content:N,isTruncated:!0,hiddenLines:F}}var S1=O2.memo(({content:$,role:J,terminalWidth:Y,metadata:Z,isPending:X=!1,availableTerminalHeight:Q,hidePrefix:U=!1,noMargin:G=!1,renderPlainTextOnly:z=!1,streamingLines:K,streamingHiddenLines:O,messageId:q,blocksOverride:N,currentLineOverride:_,streamingMode:F="text",renderCodeBlocksAsPlainText:H=!1})=>{let P=f0(),
|
|
141
|
-
`);if(D===-1)return{completedContent:"",currentLine:V};return{completedContent:V.slice(0,D+1),currentLine:V.slice(D+1)}},[V,X,M,_]),q0=m3({content:"",blocks:[]}),a=_2(()=>{if(M)return N??[];if(R)return R;if(b.current&&b.current.messageId===q)return b.current.blocks;let D=q0.current;if(!X||!J0.startsWith(D.content)){let x=Y9(J0);return q0.current={content:J0,blocks:x},x}if(J0===D.content)return D.blocks;let v=J0.slice(D.content.length),K0=Y9(v),h=[...D.blocks,...K0];return q0.current={content:J0,blocks:h},h},[J0,X,M,N]);return u(I0,{flexDirection:"column",marginBottom:y?1:0,flexShrink:0,children:[o&&u(I0,{flexDirection:"row",flexShrink:0,children:[u(I0,{width:W,flexShrink:0},void 0,!1,void 0,this),u(x0,{color:P.colors.text.muted,dimColor:!0,children:["^ ",d," lines above (streaming...)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),a.map((D,v)=>{if(D.type==="empty")return u(I0,{height:1,flexShrink:0},v,!1,void 0,this);return u(I0,{flexDirection:"row",flexShrink:0,children:[v===0&&!U&&u(I0,{marginRight:1,flexShrink:0,children:u(x0,{color:L,bold:!0,children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this),(v>0||U)&&u(I0,{width:W,flexShrink:0},void 0,!1,void 0,this),u(I0,{flexGrow:1,flexShrink:0,children:D.type==="code"?H?u(x0,{wrap:"wrap",children:D.content},void 0,!1,void 0,this):u(aQ,{content:D.content,language:D.language,terminalWidth:Y-W,isPending:X,availableHeight:Q},void 0,!1,void 0,this):D.type==="table"&&D.tableData?u(g3,{headers:D.tableData.headers,rows:D.tableData.rows,terminalWidth:Y-W},void 0,!1,void 0,this):D.type==="heading"?u(iQ,{content:D.content,level:D.level||1},void 0,!1,void 0,this):D.type==="list"?u(s4,{type:D.listType||"ul",marker:D.marker||"-",itemText:D.content,leadingWhitespace:" ".repeat(D.indentation||0)},void 0,!1,void 0,this):D.type==="hr"?u(oQ,{terminalWidth:Y-W},void 0,!1,void 0,this):D.type==="diff"&&D.diffData?u(n4,{patch:D.diffData.patch,startLine:D.diffData.startLine,matchLine:D.diffData.matchLine,terminalWidth:Y-W},void 0,!1,void 0,this):D.type==="command-message"?u(tQ,{content:D.content},void 0,!1,void 0,this):D.type==="blockquote"&&D.blockquoteLines?u(M3,{lines:D.blockquoteLines,level:D.blockquoteLevel||1},void 0,!1,void 0,this):u(nQ,{content:D.content},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},v,!0,void 0,this)}),Q0&&u(I0,{flexDirection:"row",flexShrink:0,children:[a.length===0&&!U?u(I0,{marginRight:1,flexShrink:0,children:u(x0,{color:L,bold:!0,children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this):u(I0,{width:W,flexShrink:0},void 0,!1,void 0,this),u(I0,{flexGrow:1,flexShrink:0,children:u(x0,{wrap:"wrap",children:Q0},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),T&&u(I0,{flexDirection:"row",flexShrink:0,children:[u(I0,{width:W,flexShrink:0},void 0,!1,void 0,this),u(I0,{flexDirection:"column",flexGrow:1,flexShrink:0,children:[u(x0,{color:P.colors.text.muted,children:["Subtask"," ",typeof T.agentType==="string"?`@${T.agentType}`:"",typeof T.status==="string"?` · ${T.status}`:""]},void 0,!0,void 0,this),typeof T.summary==="string"&&T.summary.trim()!==""&&u(x0,{wrap:"wrap",children:T.summary},void 0,!1,void 0,this),typeof T.childSessionId==="string"&&u(x0,{color:P.colors.text.muted,children:["Session ",T.childSessionId]},void 0,!0,void 0,this),typeof T.resumedFrom==="string"&&u(x0,{color:P.colors.text.muted,children:["Resumed from ",T.resumedFrom,typeof T.resumeDepth==="number"?` · depth ${T.resumeDepth}`:""]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},($,J)=>{return $.content===J.content&&$.role===J.role&&$.terminalWidth===J.terminalWidth&&$.isPending===J.isPending&&$.availableTerminalHeight===J.availableTerminalHeight&&$.hidePrefix===J.hidePrefix&&$.noMargin===J.noMargin&&$.renderPlainTextOnly===J.renderPlainTextOnly&&$.streamingHiddenLines===J.streamingHiddenLines&&$.streamingLines===J.streamingLines&&$.messageId===J.messageId&&$.metadata===J.metadata&&$.blocksOverride===J.blocksOverride&&$.currentLineOverride===J.currentLineOverride&&$.streamingMode===J.streamingMode&&$.renderCodeBlocksAsPlainText===J.renderCodeBlocksAsPlainText});import{jsxDEV as n0,Fragment as QU}from"react/jsx-dev-runtime";var YU=X9.memo(({label:$,isSelected:J})=>n0(H1,{color:J?"yellow":void 0,children:$},void 0,!1,void 0,this)),XU=X9.memo(({details:$,headerColor:J,isPlanModeExit:Y,isPlanModeEnter:Z,terminalWidth:X})=>n0(QU,{children:[n0(n$,{marginBottom:1,children:n0(H1,{children:$.message},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.planContent&&n0(n$,{flexDirection:"column",marginBottom:1,borderStyle:"single",borderColor:J,padding:1,children:[n0(H1,{bold:!0,color:J,children:"实施方案"},void 0,!1,void 0,this),n0(n$,{marginTop:1,children:n0(S1,{content:$.planContent,role:"assistant",terminalWidth:X-4},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),!$.planContent&&$.details&&n0(n$,{flexDirection:"column",marginBottom:1,children:n0(S1,{content:$.details,role:"assistant",terminalWidth:X},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.risks&&$.risks.length>0&&n0(n$,{flexDirection:"column",marginBottom:1,children:[n0(H1,{color:"red",bold:!0,children:"风险提示:"},void 0,!1,void 0,this),$.risks.map((Q,U)=>n0(n$,{marginLeft:2,children:n0(H1,{color:"red",children:["• ",Q]},void 0,!0,void 0,this)},U,!1,void 0,this))]},void 0,!0,void 0,this),$.affectedFiles&&$.affectedFiles.length>0&&n0(n$,{flexDirection:"column",marginBottom:1,children:[n0(H1,{color:"yellow",children:"影响的文件:"},void 0,!1,void 0,this),$.affectedFiles.slice(0,3).map((Q,U)=>n0(n$,{marginLeft:2,children:n0(H1,{children:["• ",Q]},void 0,!0,void 0,this)},U,!1,void 0,this)),$.affectedFiles.length>3&&n0(n$,{marginLeft:2,children:n0(H1,{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 ZU($,J,Y,Z){return`使用 ↑↓ 选择,回车确认 · ${J||Y||Z?"Y/N":$?"Y/S/N":"Y/S/P/N"} 快捷键 · Esc 取消`}var u3=X9.memo(({details:$,onResponse:J})=>{let{stdout:Y}=$U(),Z=Y.columns||80,Q=s0()==="confirmation-prompt",U=e0(!1),G=$.type==="exitPlanMode",z=$.type==="enterPlanMode",K=$.type==="maxTurnsExceeded",O=$.type==="mcpSampling";O0((_,F)=>{if(F.ctrl&&_==="c"||F.meta&&_==="c"){U();return}if(F.escape){J({approved:!1,reason:"用户取消"});return}let H=_.toLowerCase();if(G){if(H==="y"){J({approved:!0,targetMode:"autoEdit"});return}if(H==="s"){J({approved:!0,targetMode:"default"});return}if(H==="n"){J({approved:!1,reason:"方案需要改进"});return}}else if(z){if(H==="y"){J({approved:!0});return}if(H==="n"){J({approved:!1,reason:"用户拒绝进入 Plan 模式"});return}}else if(K){if(H==="y"){J({approved:!0});return}if(H==="n"){J({approved:!1,reason:"用户选择停止"});return}}else if(O){if(H==="y"){J({approved:!0,scope:"once"});return}if(H==="n"){J({approved:!1,reason:"用户拒绝 MCP Sampling"});return}}else{if(H==="y"){J({approved:!0,scope:"once"});return}if(H==="s"){J({approved:!0,scope:"session"});return}if(H==="p"){J({approved:!0,scope:"project"});return}if(H==="n"){J({approved:!1,reason:"用户拒绝"});return}}},{isActive:Q});let q=c3(()=>{if(G)return[{key:"approve-auto",label:"[Y] 批准,自动执行",value:{approved:!0,targetMode:"autoEdit"}},{key:"approve-default",label:"[S] 批准,逐步确认",value:{approved:!0,targetMode:"default"}},{key:"reject",label:"[N] 继续优化方案",value:{approved:!1,reason:"方案需要改进"}}];if(z)return[{key:"approve",label:"[Y] 进入规划模式",value:{approved:!0}},{key:"reject",label:"[N] 直接执行",value:{approved:!1,reason:"用户拒绝进入 Plan 模式"}}];if(K)return[{key:"continue",label:"[Y] 继续执行",value:{approved:!0}},{key:"stop",label:"[N] 停止",value:{approved:!1,reason:"用户选择停止"}}];if(O)return[{key:"approve-once",label:"[Y] 允许本次 Sampling",value:{approved:!0,scope:"once"}},{key:"reject",label:"[N] 拒绝",value:{approved:!1,reason:"用户拒绝 MCP Sampling"}}];return[{key:"approve-once",label:"[Y] 允许(仅本次)",value:{approved:!0,scope:"once"}},{key:"approve-session",label:"[S] 允许(本次会话)",value:{approved:!0,scope:"session"}},{key:"approve-project",label:"[P] 允许并记住(本项目)",value:{approved:!0,scope:"project"}},{key:"reject",label:"[N] 拒绝",value:{approved:!1,reason:"用户拒绝"}}]},[G,z,K,O]),N=c3(()=>{if(G)return{color:"cyan",title:"方案审核"};if(z)return{color:"magenta",title:"进入规划模式"};if(K)return{color:"yellow",title:"已达最大轮次"};return{color:"yellow",title:$.title||"操作确认"}},[G,z,K,$.title]);return n0(n$,{flexDirection:"column",borderStyle:"round",borderColor:Q?N.color:"gray",padding:1,children:[n0(n$,{marginBottom:1,children:n0(H1,{bold:!0,color:N.color,children:N.title},void 0,!1,void 0,this)},void 0,!1,void 0,this),n0(XU,{details:$,headerColor:N.color,isPlanModeExit:G,isPlanModeEnter:z,terminalWidth:Z},void 0,!1,void 0,this),n0(n$,{flexDirection:"column",children:[n0(H1,{color:"gray",children:ZU(G,z,K,O)},void 0,!1,void 0,this),n0(JU,{items:q,isFocused:Q,itemComponent:YU,onSelect:(_)=>{J(_.value)}},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});import{Box as Z9,Text as U1}from"ink";import{useEffect as UU,useMemo as GU,useState as KU}from"react";import{jsxDEV as E$}from"react/jsx-dev-runtime";function zU($,J){let Y=J,Z=J;while(Y>0&&$.items[Y-1]?.mutable)Y--;while(Z<$.items.length-1&&$.items[Z+1]?.mutable)Z++;return{start:Y,end:Z}}function d3({queue:$,mutation:J,onMutate:Y,onRefresh:Z,onClose:X}){let{width:Q,height:U}=l1(),[G,z]=KU($?.items[0]?.id??null),K=Math.max(0,$?.items.findIndex((_)=>_.id===G)??0);UU(()=>{if(!$||$.items.length===0){z(null);return}if(!G||!$.items.some((_)=>_.id===G))z($.items[Math.min(K,$.items.length-1)].id)},[$,G,K]);let O=(_)=>{Promise.resolve(Y(_)).catch(()=>{return})};O0((_,F)=>{if(F.escape||_==="q")return X(),!0;if(_==="r")return Promise.resolve(Z()).catch(()=>{return}),!0;if(!$||$.items.length===0)return!0;if(F.downArrow||_==="j"){let B=Math.min($.items.length-1,K+1);return z($.items[B].id),!0}if(F.upArrow||_==="k"){let B=Math.max(0,K-1);return z($.items[B].id),!0}let H=$.items[K];if(!H?.mutable||J.pending)return!0;let P=zU($,K);if(_==="d")return O({type:"remove",messageId:H.id}),!0;let M=_==="K"?Math.max(P.start,K-1):_==="J"?Math.min(P.end,K+1):_==="g"?P.start:_==="G"?P.end:void 0;if(M!==void 0&&M!==K)O({type:"move",messageId:H.id,toPosition:M});return!0},{priority:120});let q=GU(()=>{if(!$)return[];let _=Math.max(1,U-9),F=Math.max(0,Math.min(K-Math.floor(_/2),$.items.length-_));return $.items.slice(F,F+_)},[U,$,K]),N=Math.max(8,Q-38);return E$(Z9,{flexDirection:"column",borderStyle:"double",borderColor:"yellow",paddingX:1,children:[E$(Z9,{justifyContent:"space-between",children:[E$(U1,{bold:!0,color:"yellow",children:["Follow-up queue · ",$?.pending??0]},void 0,!0,void 0,this),E$(U1,{dimColor:!0,children:"Esc/q close · r refresh"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E$(U1,{dimColor:!0,children:"j/k select · d delete · J/K move · g/G segment edge"},void 0,!1,void 0,this),(J.errorCode||J.errorMessage)&&E$(U1,{color:"red",children:J.errorCode==="revision_conflict"?"Queue changed; showing the latest order":J.errorMessage},void 0,!1,void 0,this),!$||$.items.length===0?E$(U1,{dimColor:!0,children:"No queued follow-ups."},void 0,!1,void 0,this):q.map((_)=>{let F=_.id===G,H=_.kind==="internal"?"Internal runtime item":_.preview||"Attachment-only follow-up";return E$(Z9,{gap:1,children:[E$(U1,{color:F?"cyan":void 0,children:F?"›":" "},void 0,!1,void 0,this),E$(U1,{dimColor:!0,children:String(_.position+1).padStart(2," ")},void 0,!1,void 0,this),E$(U1,{color:_.mutable?"white":"gray",children:B3(H.replace(/\s+/g," "),N,"…")},void 0,!1,void 0,this),_.attachmentCount>0&&E$(U1,{color:"cyan",children:["[",_.attachmentCount," attachment]"]},void 0,!0,void 0,this),E$(U1,{color:_.mutable?"green":"yellow",children:_.mutable?_.delivery.replace("_"," "):"locked"},void 0,!1,void 0,this),J.pending&&J.messageId===_.id&&E$(U1,{color:"yellow",children:"updating…"},void 0,!1,void 0,this)]},_.id,!0,void 0,this)})]},void 0,!0,void 0,this)}import{Box as j0,Text as R0}from"ink";import l3 from"ink-text-input";import{useState as k1}from"react";import{jsxDEV as t}from"react/jsx-dev-runtime";var A8=[{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"}],j6=[{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"}],h6=[{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"}],qU=[`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"],r3=({workspaceRoot:$,sessionId:J,onClose:Y,onSave:Z})=>{let X=F$.getTheme(),[Q,U]=k1("action"),[G,z]=k1(0),[K,O]=k1(0),[q,N]=k1(0),[_,F]=k1(""),[H,P]=k1(""),[M,B]=k1(null),[L,C]=k1(!1),[W,T]=k1(null),w=A8[G],y=h6[K],S=j6[q],b=()=>{if(W){T(null);return}switch(Q){case"action":Y();break;case"event":U("action");break;case"matcher":U("event");break;case"command":U("matcher");break;case"location":U("command");break;case"confirm":U("location");break}};O0((a,D)=>{if(D.escape){b();return}if(Q==="action"){if(D.upArrow)z((v)=>v>0?v-1:A8.length-1);else if(D.downArrow)z((v)=>v<A8.length-1?v+1:0);else if(D.return)R()}else if(Q==="event"){if(D.upArrow)O((v)=>v>0?v-1:h6.length-1);else if(D.downArrow)O((v)=>v<h6.length-1?v+1:0);else if(D.return)U("matcher")}else if(Q==="location"){if(D.upArrow)N((v)=>v>0?v-1:j6.length-1);else if(D.downArrow)N((v)=>v<j6.length-1?v+1:0);else if(D.return)U("confirm")}else if(Q==="confirm"){if(D.return)q0()}});let R=()=>{let a=A8[G].action;if(a==="add")U("event");else if(a==="status")A();else if(a==="list")d();else if(a==="enable")j$.getInstance().enableSession(J,$),T("Hooks enabled for this session");else if(a==="disable")j$.getInstance().disableSession(J,$),T("Hooks disabled for this session");else if(a==="trust")V();else if(a==="revoke")o()},A=async()=>{let a=j$.getInstance(),D=a.isEnabled($,J),v=a.getConfig($),K0=await a.getTrustStatus($),h={};for(let l of Object.values(Q9)){let H0=v[l];if(H0&&Array.isArray(H0)){let F0=H0.reduce((T0,I)=>T0+(I.hooks?.length||0),0);if(F0>0)h[l]=F0}}let x=[`Status: ${D?"Enabled":"Disabled"}`,`Trust: ${K0.state}`,`Digest: ${K0.currentDigest??"none"}`,""];if(Object.keys(h).length>0){x.push("Configured hooks:");for(let[l,H0]of Object.entries(h))x.push(` ${l}: ${H0} hook(s)`)}else x.push("No hooks configured");T(x.join(`
|
|
142
|
-
`))},V=async()=>{try{let
|
|
143
|
-
Digest: ${
|
|
144
|
-
`))},J0=()=>{U("command")},Q0=()=>{if(!H.trim()){B("Command cannot be empty");return}B(null),U("location")},q0=async()=>{C(!0),B(null);try{let a=j$.getInstance(),D=await import("node:fs/promises"),v=await import("node:path"),K0=await import("node:os"),h={matcher:_.trim()?{tools:_.trim()}:{},hooks:[{type:"command",command:H.trim()}]},x;switch(S.location){case"local":x=v.join($,".blade","settings.local.json");break;case"project":x=v.join($,".blade","settings.json");break;case"user":x=v.join(K0.homedir(),".blade","settings.json");break}await D.mkdir(v.dirname(x),{recursive:!0});let l={};try{let I=await D.readFile(x,"utf-8");l=JSON.parse(I)}catch{}let H0=l.hooks||{},F0=H0[y.event]||[],T0={...H0,enabled:!0,[y.event]:[...F0,h]};if(l.hooks=T0,await D.writeFile(x,JSON.stringify(l,null,2),"utf-8"),await a.reloadConfig($),Z)Z({event:y.event,matcher:_.trim(),command:H.trim()});Y()}catch(a){B(`Failed to save hook: ${a instanceof Error?a.message:"Unknown error"}`),C(!1)}};return t(j0,{flexDirection:"column",padding:1,children:[t(j0,{marginBottom:1,children:t(R0,{bold:!0,color:X.colors.success,children:"Hooks Manager"},void 0,!1,void 0,this)},void 0,!1,void 0,this),t(j0,{marginBottom:1,children:t(R0,{color:X.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),W&&t(j0,{flexDirection:"column",marginBottom:1,children:[t(R0,{children:W},void 0,!1,void 0,this),t(j0,{marginTop:1,children:t(R0,{color:X.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"&&!W&&t(j0,{flexDirection:"column",children:[t(j0,{flexDirection:"column",marginTop:1,children:A8.map((a,D)=>t(j0,{children:[t(R0,{color:D===G?X.colors.primary:void 0,bold:D===G,children:[D===G?"> ":" ",a.action]},void 0,!0,void 0,this),t(R0,{color:X.colors.muted,children:[" - ",a.description]},void 0,!0,void 0,this)]},a.action,!0,void 0,this))},void 0,!1,void 0,this),t(j0,{marginTop:1,children:t(R0,{color:X.colors.muted,children:"Up/Down to select · Enter to continue · Esc to close"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q==="event"&&t(j0,{flexDirection:"column",children:[t(R0,{bold:!0,children:"Select Event:"},void 0,!1,void 0,this),t(j0,{flexDirection:"column",marginTop:1,children:h6.map((a,D)=>t(j0,{children:[t(R0,{color:D===K?X.colors.primary:void 0,bold:D===K,children:[D===K?"> ":" ",a.event]},void 0,!0,void 0,this),t(R0,{color:X.colors.muted,children:[" - ",a.description]},void 0,!0,void 0,this)]},a.event,!0,void 0,this))},void 0,!1,void 0,this),t(j0,{marginTop:1,children:t(R0,{color:X.colors.muted,children:"Up/Down to select · Enter to continue · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q!=="event"&&t(j0,{marginBottom:1,children:t(R0,{children:["Event:"," ",t(R0,{bold:!0,color:X.colors.primary,children:y.event},void 0,!1,void 0,this),t(R0,{color:X.colors.muted,children:[" - ",y.description]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),(Q==="matcher"||Q==="command"||Q==="confirm")&&t(j0,{flexDirection:"column",marginBottom:1,children:[t(R0,{color:X.colors.muted,children:"Input to command is JSON of tool call arguments."},void 0,!1,void 0,this),t(R0,{color:X.colors.muted,children:"Exit code 0 - stdout/stderr not shown"},void 0,!1,void 0,this),t(R0,{color:X.colors.muted,children:"Exit code 2 - show stderr to model and block tool call"},void 0,!1,void 0,this),t(R0,{color:X.colors.muted,children:"Other exit codes - show stderr to user only but continue with tool call"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q==="matcher"&&t(j0,{flexDirection:"column",children:[t(j0,{children:[t(R0,{bold:!0,children:"Matcher: "},void 0,!1,void 0,this),t(l3,{value:_,onChange:F,onSubmit:J0,placeholder:"e.g., Read, Bash, Edit|Write (empty = all tools)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),t(j0,{marginTop:1,children:t(R0,{color:X.colors.muted,children:"Tool name pattern (supports | for multiple). Leave empty to match all."},void 0,!1,void 0,this)},void 0,!1,void 0,this),t(j0,{marginTop:1,children:t(R0,{color:X.colors.muted,children:"Enter to continue · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),(Q==="command"||Q==="confirm")&&t(j0,{marginBottom:1,children:t(R0,{children:["Matcher: ",t(R0,{bold:!0,children:_||"(all tools)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),Q==="command"&&t(j0,{flexDirection:"column",children:[t(j0,{children:t(R0,{bold:!0,children:"Command: "},void 0,!1,void 0,this)},void 0,!1,void 0,this),t(j0,{borderStyle:"single",borderColor:X.colors.border.light,paddingX:1,marginTop:1,children:t(l3,{value:H,onChange:P,onSubmit:Q0,placeholder:"Enter shell command..."},void 0,!1,void 0,this)},void 0,!1,void 0,this),t(j0,{flexDirection:"column",marginTop:1,children:[t(R0,{bold:!0,children:"Examples:"},void 0,!1,void 0,this),qU.map((a,D)=>t(R0,{color:X.colors.muted,children:["• ",a]},D,!0,void 0,this))]},void 0,!0,void 0,this),t(j0,{marginTop:1,children:t(R0,{color:X.colors.muted,children:"Enter to continue · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q==="location"&&t(j0,{flexDirection:"column",children:[t(j0,{flexDirection:"column",borderStyle:"round",borderColor:X.colors.border.light,paddingX:2,paddingY:1,marginBottom:1,children:[t(R0,{bold:!0,color:X.colors.primary,children:"Save hook configuration"},void 0,!1,void 0,this),t(R0,{children:" "},void 0,!1,void 0,this),t(R0,{children:[" ","Event: ",y.event," - ",y.description]},void 0,!0,void 0,this),t(R0,{children:[" Matcher: ",_||"(all)"]},void 0,!0,void 0,this),t(R0,{children:[" Command: ",H]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),t(R0,{bold:!0,children:"Where should this hook be saved?"},void 0,!1,void 0,this),t(j0,{flexDirection:"column",marginTop:1,children:j6.map((a,D)=>t(j0,{children:[t(R0,{color:D===q?X.colors.primary:void 0,bold:D===q,children:[D===q?"> ":" ",D+1,". ",a.name]},void 0,!0,void 0,this),t(R0,{color:X.colors.muted,children:[" ",a.description]},void 0,!0,void 0,this)]},a.location,!0,void 0,this))},void 0,!1,void 0,this),t(j0,{marginTop:1,children:t(R0,{color:X.colors.muted,children:"Enter to confirm · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q==="confirm"&&t(j0,{flexDirection:"column",children:[t(j0,{flexDirection:"column",borderStyle:"round",borderColor:X.colors.success,paddingX:2,paddingY:1,children:[t(R0,{bold:!0,children:["Saving hook to ",S.description,"..."]},void 0,!0,void 0,this),t(R0,{children:" "},void 0,!1,void 0,this),t(R0,{children:["Event: ",y.event]},void 0,!0,void 0,this),t(R0,{children:["Matcher: ",_||"(all tools)"]},void 0,!0,void 0,this),t(R0,{children:["Command: ",H]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),t(j0,{marginTop:1,children:t(R0,{color:X.colors.muted,children:L?"Saving...":"Enter to confirm · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),M&&t(j0,{marginTop:1,children:t(R0,{color:X.colors.error,children:M},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as O5}from"ahooks";import{Box as IU,Text as SU}from"ink";import kU from"react";import{useMemoizedFn as g6}from"ahooks";import H2 from"chalk";import{Text as TU}from"ink";import{useEffect as z5,useRef as P8}from"react";var E6={TIMEOUT_MS:100,RAPID_INPUT_THRESHOLD_MS:150,LARGE_INPUT_THRESHOLD:300,MEDIUM_SIZE_MULTI_CHUNK_THRESHOLD:200};var N2="\x1B",_U=`${N2}[200~`,OU=`${N2}[201~`,NU="[200~",HU="[201~",WU=[`${N2}[I`,`${N2}[O`,"[I","[O"],o3=`${N2}[?2004h`,n3=`${N2}[?2004l`,G9=`${N2}[?1004l`,FU=[_U,NU],LU=[OU,HU];function t3(){return{pasteBuffer:null,pasteOverflowed:!1}}function a3($,J){let Y;for(let Z of J){let X=$.indexOf(Z);if(X===-1)continue;if(!Y||X<Y.index||X===Y.index&&Z.length>Y.marker.length)Y={index:X,marker:Z}}return Y}function i3($){return WU.some((J)=>$===J)}function s3($,J){let Y=J,Z=$.pasteBuffer,X=$.pasteOverflowed,Q=Z!==null,U=[];while(Y.length>0){if(Z!==null){let K=a3(Y,LU);if(!K){if(Z.length+Y.length>U9)Z="",X=!0;else if(!X)Z+=Y;Y="";break}if(Z.length+K.index>U9)X=!0;else if(!X)Z+=Y.slice(0,K.index),U.push({kind:"paste",text:Z});Z=null,X=!1,Q=!0,Y=Y.slice(K.index+K.marker.length);continue}let G=a3(Y,FU);if(!G){if(i3(Y))Q=!0;else U.push({kind:"text",text:Y});Y="";break}let z=Y.slice(0,G.index);if(z&&!i3(z))U.push({kind:"text",text:z});Z="",X=!1,Q=!0,Y=Y.slice(G.index+G.marker.length)}if(J.length===0&&Z!==null)Q=!0;return{handled:Q,state:{pasteBuffer:Z,pasteOverflowed:X},segments:U}}function e3($){return typeof $==="string"&&/^[0-9a-f]{32}$/.test($)}function wU($){if(!e3($))throw Error("TUI composer ready nonce must be 32 lowercase hexadecimal chars");return`\x1B]99;blade-composer-ready=${$}\x07`}function BU($=process.env){let J=$.BLADE_TUI_COMPOSER_READY_NONCE;if(!e3(J))return;return wU(J)}function $5($=process.env,J=(Y)=>process.stdout.write(Y)){let Y=BU($);if(!Y)return!1;return J(Y),!0}import{execSync as s2}from"node:child_process";import{existsSync as AU,readFileSync as K9}from"node:fs";import{basename as J5,isAbsolute as PU}from"node:path";function Y5($){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 X5(){let $=process.platform,J={darwin:"/tmp/blade_cli_latest_screenshot.png",linux:"/tmp/blade_cli_latest_screenshot.png",win32:process.env.TEMP?`${process.env.TEMP}\\blade_cli_latest_screenshot.png`:"C:\\Temp\\blade_cli_latest_screenshot.png"},Y={darwin:{checkImage:"osascript -e 'the clipboard as «class PNGf»'",saveImage:(Z)=>`osascript -e 'set png_data to (the clipboard as «class PNGf»)' -e 'set fp to open for access POSIX file "${Z}" 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:(Z)=>`rm -f "${Z}"`},linux:{checkImage:'xclip -selection clipboard -t TARGETS -o | grep -E "image/(png|jpeg|jpg|gif|webp)"',saveImage:(Z)=>`xclip -selection clipboard -t image/png -o > "${Z}" || wl-paste --type image/png > "${Z}"`,getPath:"xclip -selection clipboard -t text/plain -o",deleteFile:(Z)=>`rm -f "${Z}"`},win32:{checkImage:'powershell -Command "(Get-Clipboard -Format Image) -ne $null"',saveImage:(Z)=>`powershell -Command "$img = Get-Clipboard -Format Image; if ($img) { $img.Save('${Z.replace(/\\/g,"\\\\")}', [System.Drawing.Imaging.ImageFormat]::Png) }"`,getPath:'powershell -Command "Get-Clipboard"',deleteFile:(Z)=>`del /f "${Z}"`}};return{commands:Y[$]||Y.linux,screenshotPath:J[$]||J.linux}}function bU(){let{commands:$}=X5();try{return s2($.getPath,{encoding:"utf-8"}).trim()}catch(J){return console.error("Failed to get clipboard path:",J),null}}function Z5($){if($.startsWith('"')&&$.endsWith('"')||$.startsWith("'")&&$.endsWith("'"))return $.slice(1,-1);return $}function Q5($){if(process.platform==="win32")return $;let J="__DOUBLE_BACKSLASH__";return $.replace(/\\\\/g,J).replace(/\\(.)/g,"$1").replace(new RegExp(J,"g"),"\\")}function z9($){let J=Z5($.trim()),Y=Q5(J);return/\.(png|jpe?g|gif|webp)$/i.test(Y)}function MU($){let J=Z5($.trim()),Y=Q5(J);if(z9(Y))return Y;return null}async function U5($){let J=MU($);if(!J)return null;let Y;try{if(PU(J))Y=K9(J);else{let U=bU();if(U&&J===J5(U))Y=K9(U);else return null}}catch(U){return console.error("Failed to read image file:",U),null}let Z=Y.toString("base64"),X=Y5(Z),Q=J5(J);return{path:J,base64:Z,mediaType:X,filename:Q}}async function G5(){let $=process.platform,J={darwin:"pbpaste",linux:"xclip -selection clipboard -o || wl-paste",win32:'powershell -Command "Get-Clipboard"'},Y=J[$]||J.linux;try{return s2(Y,{encoding:"utf-8"})||null}catch{return null}}async function K5(){let{commands:$,screenshotPath:J}=X5();try{if(s2($.checkImage,{stdio:"ignore"}),s2($.saveImage(J),{stdio:"ignore"}),!AU(J))return null;let Z=K9(J).toString("base64"),X=Y5(Z);return s2($.deleteFile(J),{stdio:"ignore"}),{base64:Z,mediaType:X}}catch(Y){try{s2($.deleteFile(J),{stdio:"ignore"})}catch{}return null}}import{jsxDEV as yU}from"react/jsx-dev-runtime";var CU=/\r\n/g,RU=/\r/g;function q9($){if(!$.includes("\r"))return $;return $.replace(CU,`
|
|
145
|
-
`).replace(
|
|
146
|
-
`)}function
|
|
147
|
-
`))&&U){let
|
|
148
|
-
`&&(
|
|
149
|
-
`)))return P(
|
|
150
|
-
`).length,F=N.length,H=500,P=10;if(F>500||_>10){let M=X(N),B=N.slice(0,30).replace(/\n/g," "),L=`${F} chars, ${_} lines: ${B}...`;return{prompt:`${w6(M)}${L}${M4()}`}}return{}}),q=O5(async(N,_,F)=>{try{let H=Q(N,_);return{prompt:`${w6(H)}[Image #${H}]${M4()}`}}catch(H){return console.error("[Image Paste] Failed to process image:",H),{prompt:`[Image paste failed: ${H instanceof Error?H.message:"Unknown error"}] `}}});return _9(IU,{flexDirection:"row",width:"100%",paddingX:2,paddingY:0,flexShrink:0,flexGrow:0,overflow:"hidden",borderStyle:"round",borderColor:K?"yellow":"gray",children:[_9(SU,{color:K?"yellow":"blue",bold:!0,children:K?"$ ":"> "},void 0,!1,void 0,this),_9(_5,{value:$,cursorPosition:J,onChange:Y,onChangeCursorPosition:Z,onPaste:O,onImagePaste:q,placeholder:" 输入命令...",focus:z,disabledKeys:["upArrow","downArrow","tab","return","escape"]},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as e2,Text as f$}from"ink";import pU,{useEffect as B5,useState as A5}from"react";import{useEffect as hU,useRef as EU,useState as gU}from"react";import{useEffect as DU,useRef as vU,useState as VU}from"react";var b8={loading:["思考中","构思中","推理中","琢磨中","分析中","斟酌中","酝酿中","推敲中","揣摩中","审视中","处理中","编排中","打磨中","编织中","拼装中","调配中","组装中","搭建中","铸造中","雕琢中","搜寻中","梳理中","排查中","勘探中","钻研中","翻阅中","遍历中","扫描中","检索中","追踪中","计算中","编译中","解析中","运算中","推演中","迭代中","收敛中","演绎中","归纳中","求解中","生成中","编写中","起草中","绘制中","勾勒中","渲染中","合成中","调和中","编曲中","烹制中","施工中","酿造中","发酵中","煎熬中","折腾中","捣鼓中","鼓捣中","腾挪中","筹备中","蓄力中"],tips:["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 临时切换模型"]};var jU=15000,H5="等待用户确认...";function W5(){if(Math.random()<0.25){let Y=Math.floor(Math.random()*b8.tips.length);return b8.tips[Y]}let J=Math.floor(Math.random()*b8.loading.length);return b8.loading[J]}function F5($,J,Y=!1){let[Z,X]=VU(""),Q=vU(Y);return Q.current=Y,DU(()=>{if(J){X(H5);return}if(!$){X("");return}X((G)=>G===""||G===H5?W5():G);let U=setInterval(()=>{if(!Q.current)X(W5())},jU);return()=>{clearInterval(U)}},[$,J]),Z}function L5($,J=!1,Y=!1){let[Z,X]=gU(0),Q=EU(null),U=F5($,J,Y);return hU(()=>{if(!$){X(0),Q.current=null;return}if(Y)return;if(Q.current===null)Q.current=Date.now();let G=setInterval(()=>{if(Q.current!==null){let z=Math.floor((Date.now()-Q.current)/1000);X(z)}},1000);return()=>{clearInterval(G)}},[$,Y]),{currentPhrase:U,elapsedTime:Z}}function mU($){let J=Math.max(0,Math.floor($/1000));if(J<60)return`${J}s`;let Y=Math.floor(J/60),Z=J%60;if(Y<60)return`${Y}m ${Z}s`;return`${Math.floor(Y/60)}h ${Y%60}m ${Z}s`}function w5($,J=Date.now()){let Y=$?.snapshot;if(!Y)return null;let Z=Y.activeTools.length+Y.activeToolOverflow,X=Y.phase==="starting"?"正在启动任务":Y.phase==="thinking"?"正在思考":Y.phase==="responding"?"正在生成回复":Y.phase==="compacting"?"正在压缩上下文":Y.phase==="continuing"?"正在推进下一步":`正在执行 ${Z} 个工具`,Q=Y.activeTools.slice(0,2).map((K)=>K.progress!==void 0&&K.total!==void 0?`${K.name} ${K.progress}/${K.total}`:K.name),U=Math.max(0,Y.activeTools.length-Q.length+Y.activeToolOverflow);if(U>0)Q.push(`+${U}`);let G=[...Q,Y.toolCallsStarted>0?`工具 ${Y.toolCallsCompleted}/${Y.toolCallsStarted}`:void 0,Y.turn>0?`回合 ${Y.turn}${Y.maxTurns===null?"":`/${Y.maxTurns}`}`:void 0].filter((K)=>K!==void 0),z=mU(J-Y.startedAt);return{primary:X,secondary:G.join(" · "),compact:Y.phase==="executing_tools"?`执行工具 · ${Z} 个 · ${z}`:`${X} · ${z}`,elapsed:z}}import{jsxDEV as z$,Fragment as cU}from"react/jsx-dev-runtime";var O9=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"],xU=80;function P5($){if($<60)return`${$}s`;let J=Math.floor($/60),Y=$%60;return`${J}m ${Y}s`}var b5=pU.memo(({message:$,paused:J=!1})=>{let Y=E2(),Z=E8(),X=j8(),Q=l9(),U=r9(),G=Y||!Z,[z,K]=A5(0),[O,q]=A5(Date.now()),N=f0(),F=u2()>=xU,{currentPhrase:H,elapsedTime:P}=L5(G,!1,J);if(B5(()=>{if(!G||J){K(0);return}let W=setInterval(()=>{K((T)=>(T+1)%O9.length)},150);return()=>clearInterval(W)},[G,J]),B5(()=>{if(!X?.snapshot?.nextActionAt&&!Q?.snapshot||J)return;q(Date.now());let W=setInterval(()=>q(Date.now()),1000);return()=>clearInterval(W)},[J,X?.snapshot?.nextActionAt,Q?.snapshot]),!G)return null;let M=S6(X,O),B=w5(Q,O),C=(U?.phase==="detected"?`检测到 ${U.toolName} 连续 ${U.runLength} 次无进展,正在要求 Agent 切换策略`:U?.phase==="halted"?`已停止 ${U.toolName} 空转循环`:null)||M?.primary||B?.primary||$||H||"正在思考中...";if(F)return z$(e2,{paddingX:2,paddingBottom:1,flexDirection:"row",gap:1,children:[z$(f$,{color:N.colors.warning,bold:!0,children:O9[z]},void 0,!1,void 0,this),z$(f$,{color:N.colors.text.primary,children:C},void 0,!1,void 0,this),M?.secondary&&z$(f$,{color:N.colors.info,children:M.secondary},void 0,!1,void 0,this),!M?.secondary&&B?.secondary&&z$(f$,{color:N.colors.info,children:B.secondary},void 0,!1,void 0,this),(B||P>0)&&z$(cU,{children:[z$(f$,{color:N.colors.muted,children:"|"},void 0,!1,void 0,this),z$(f$,{color:N.colors.info,children:["已用时:"," ",B?.elapsed??P5(P)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),z$(f$,{color:N.colors.muted,children:"|"},void 0,!1,void 0,this),z$(f$,{color:N.colors.secondary,children:"Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return z$(e2,{paddingX:2,paddingBottom:1,flexDirection:"column",children:[z$(e2,{flexDirection:"row",gap:1,children:[z$(f$,{color:N.colors.warning,bold:!0,children:O9[z]},void 0,!1,void 0,this),z$(f$,{color:N.colors.text.primary,children:C},void 0,!1,void 0,this)]},void 0,!0,void 0,this),M?.secondary&&z$(e2,{marginLeft:2,children:z$(f$,{color:N.colors.info,children:M.secondary},void 0,!1,void 0,this)},void 0,!1,void 0,this),!M?.secondary&&B?.secondary&&z$(e2,{marginLeft:2,children:z$(f$,{color:N.colors.info,children:B.secondary},void 0,!1,void 0,this)},void 0,!1,void 0,this),(B||P>0)&&z$(e2,{marginLeft:2,flexDirection:"row",gap:1,children:[z$(f$,{color:N.colors.info,children:["已用时: ",B?.elapsed??P5(P)]},void 0,!0,void 0,this),z$(f$,{color:N.colors.muted,children:"|"},void 0,!1,void 0,this),z$(f$,{color:N.colors.secondary,children:"Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});import{Box as x6,Text as J$,useStdout as uU}from"ink";import dU from"ink-text-input";import lU,{useCallback as m6,useEffect as rU,useMemo as aU,useState as W2}from"react";import{jsxDEV as D0}from"react/jsx-dev-runtime";var R5=lU.memo(({details:$,onComplete:J})=>{let{stdout:Y}=uU(),Z=Y.columns||80,X=s0()==="confirmation-prompt",Q=e0(!1),U=$.fields??[],[G,z]=W2("field"),[K,O]=W2(0),[q,N]=W2(()=>M5($)),[_,F]=W2(""),[H,P]=W2(0),[M,B]=W2([]),[L,C]=W2(),W=U[K],T=aU(()=>iU(W),[W]);rU(()=>{if(!W)return;let R=q[W.name];F(typeof R==="string"||typeof R==="number"?String(R):""),B(Array.isArray(R)?[...R]:[]);let A=T.findIndex((V)=>V.value===String(R));P(A>=0?A:0),C(void 0)},[q,W,T]);let w=m6((R)=>{if(N(R),K<U.length-1){O((A)=>A+1);return}z("review")},[K,U.length]),y=m6((R)=>{if(!W)return;let A={...q};if(R===void 0)delete A[W.name];else A[W.name]=R;w(A)},[q,W,w]),S=m6((R)=>{if(!W)return;try{y(T5(W,R))}catch(A){C(A instanceof Error?A.message:String(A))}},[W,y]),b=m6(()=>{try{let R=C5($,{action:"accept",content:q});J({action:R.action,...R.content?{content:R.content}:{}})}catch(R){C(R instanceof Error?R.message:String(R))}},[q,$,J]);if(O0((R,A)=>{if(A.ctrl&&R==="c"||A.meta&&R==="c"){Q();return}if(A.escape){J({action:"cancel"});return}if($.mode==="url"){if(R.toLowerCase()==="y")J({action:"accept"},!0);else if(R.toLowerCase()==="n")J({action:"decline"});return}if(G==="review"){if(R.toLowerCase()==="y"||A.return)b();else if(R.toLowerCase()==="e")O(0),z("field");else if(R.toLowerCase()==="d")J({action:"decline"});return}if(!W){if(A.return)b();return}if(N9(W))return;if(R.toLowerCase()==="d"){J({action:"decline"});return}if(A.upArrow){P((V)=>V>0?V-1:Math.max(T.length-1,0));return}if(A.downArrow||A.tab){P((V)=>V<T.length-1?V+1:0);return}if(R===" "&&W.type==="multi-select"){let V=T[H];if(V)B((o)=>o.includes(V.value)?o.filter((d)=>d!==V.value):[...o,V.value]);return}if(A.return)if(W.type==="multi-select")y(M);else{let V=T[H];if(V)y(V.typedValue)}},{isActive:X}),$.mode==="url")return D0(p6,{width:Z,color:"yellow",children:[D0(J$,{bold:!0,color:"yellow",children:"MCP external authorization"},void 0,!1,void 0,this),D0(J$,{children:$.message},void 0,!1,void 0,this),D0(J$,{color:"yellow",children:['Only continue if you trust MCP server "',$.serverName,'".']},void 0,!0,void 0,this),D0(J$,{children:["Domain: ",D0(J$,{color:"cyan",children:$.domain},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D0(J$,{wrap:"wrap",children:["URL: ",D0(J$,{color:"cyan",children:$.url},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D0(J$,{color:"gray",children:"[Y] Open URL · [N] Decline · Esc Cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(G==="review")return D0(p6,{width:Z,color:"green",children:[D0(J$,{bold:!0,color:"green",children:"Review MCP form response"},void 0,!1,void 0,this),D0(J$,{children:$.message},void 0,!1,void 0,this),U.map((R)=>D0(J$,{children:[R.title,": ",nU(q[R.name])]},R.name,!0,void 0,this)),L&&D0(J$,{color:"red",children:L},void 0,!1,void 0,this),D0(J$,{color:"gray",children:"[Y] Submit · [E] Edit · [D] Decline · Esc Cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(!W)return D0(p6,{width:Z,color:"cyan",children:[D0(J$,{children:$.message},void 0,!1,void 0,this),D0(J$,{color:"gray",children:"This form has no fields."},void 0,!1,void 0,this),D0(J$,{color:"gray",children:"Press Enter to submit · [D] Decline · Esc Cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return D0(p6,{width:Z,color:"cyan",children:[D0(J$,{bold:!0,color:"cyan",children:["MCP input requested by ",$.serverName]},void 0,!0,void 0,this),D0(J$,{children:$.message},void 0,!1,void 0,this),D0(x6,{flexDirection:"column",marginTop:1,children:[D0(J$,{bold:!0,children:[W.title,W.required?" *":""]},void 0,!0,void 0,this),W.description&&D0(J$,{color:"gray",children:W.description},void 0,!1,void 0,this),D0(J$,{color:"gray",children:oU(W)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N9(W)?D0(x6,{children:[D0(J$,{color:"cyan",children:"> "},void 0,!1,void 0,this),D0(dU,{value:_,onChange:F,onSubmit:S,focus:X,placeholder:W.defaultValue===void 0?W.required?"Required":"Optional":String(W.defaultValue)},void 0,!1,void 0,this)]},void 0,!0,void 0,this):D0(x6,{flexDirection:"column",children:T.map((R,A)=>{let V=W.type==="multi-select"&&M.includes(R.value);return D0(J$,{color:H===A?"yellow":void 0,children:[H===A?"> ":" ",W.type==="multi-select"?V?"(*) ":"( ) ":"",R.label]},R.value,!0,void 0,this)})},void 0,!1,void 0,this),L&&D0(J$,{color:"red",children:L},void 0,!1,void 0,this),D0(J$,{color:"gray",children:[N9(W)?"Enter to continue":W.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),D0(J$,{color:"gray",children:["Field ",K+1," of ",U.length]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});function p6({children:$,width:J,color:Y}){return D0(x6,{flexDirection:"column",gap:1,borderStyle:"round",borderColor:Y,padding:1,width:Math.min(J-4,88),children:$},void 0,!1,void 0,this)}function N9($){return $.type==="string"||$.type==="number"||$.type==="integer"}function iU($){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 oU($){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 nU($){if($===void 0)return"(omitted)";if(Array.isArray($))return $.join(", ")||"(none)";return String($)}import u6 from"ansi-escapes";import{Box as F2,Static as UG,useStdout as GG}from"ink";import KG,{useEffect as D1,useMemo as B9,useRef as i1,useState as A9}from"react";import{Box as tU,Text as y5}from"ink";import sU from"react";import{jsxDEV as H9}from"react/jsx-dev-runtime";var W9=sU.memo(({collapsedCount:$})=>{let J=f0();if($<=0)return null;let Y=J.colors.text.muted;return H9(tU,{flexDirection:"row",marginBottom:1,children:[H9(y5,{color:Y,children:[">"," ",$," 条历史消息"]},void 0,!0,void 0,this),H9(y5,{color:Y,children:" [Ctrl+O 浏览]"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});W9.displayName="CollapsedHistorySummary";import{Box as M8,Text as T8}from"ink";import eU from"ink-big-text";import $G from"ink-gradient";import JG from"react";import{jsxDEV as t$}from"react/jsx-dev-runtime";var S5=JG.memo(()=>{return t$(M8,{flexDirection:"column",paddingX:2,paddingTop:1,paddingBottom:1,children:[t$(M8,{flexDirection:"column",children:t$($G,{name:"pastel",children:t$(eU,{text:"BLADE",font:"block"},void 0,!1,void 0,this)},void 0,!1,void 0,this)},void 0,!1,void 0,this),t$(M8,{marginBottom:1,children:t$(T8,{color:"white",dimColor:!0,children:I5()},void 0,!1,void 0,this)},void 0,!1,void 0,this),t$(M8,{flexDirection:"column",marginBottom:1,children:[t$(M8,{marginBottom:1,children:t$(T8,{color:"white",bold:!0,children:"使用指南:"},void 0,!1,void 0,this)},void 0,!1,void 0,this),t$(T8,{color:"white",children:"1. 输入问题、编辑文件或运行命令"},void 0,!1,void 0,this),t$(T8,{color:"white",children:"2. 使用 /init 创建项目配置文件"},void 0,!1,void 0,this),t$(T8,{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 c6,Text as F9}from"ink";import k5 from"react";import{jsxDEV as a1}from"react/jsx-dev-runtime";var f5=k5.memo(({tasks:$,visible:J=!0,compact:Y=!1})=>{let{colors:Z}=f0();if(!J||$.length===0)return null;let X={total:$.length,completed:$.filter((Q)=>Q.status==="completed").length,inProgress:$.filter((Q)=>Q.status==="in_progress").length};return a1(c6,{flexDirection:"column",borderStyle:"single",borderColor:Z.border.light,paddingX:1,paddingY:Y?0:1,marginBottom:1,children:[a1(c6,{marginBottom:Y?0:1,children:[a1(F9,{dimColor:!0,children:"Tasks "},void 0,!1,void 0,this),a1(F9,{color:Z.text.muted,children:[X.completed,"/",X.total]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),a1(c6,{flexDirection:"column",children:$.map((Q,U)=>a1(YG,{task:Q,compact:Y},Q.id||U,!1,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}),YG=k5.memo(({task:$,compact:J})=>{let Y,Z=!1,X;switch($.status){case"completed":Y="[OK]",Z=!0,X=$.subject;break;case"in_progress":Y=">",Z=!1,X=$.activeForm||$.subject;break;case"pending":default:Y="-",Z=!0,X=$.subject;break}return a1(c6,{paddingY:J?0:0,children:a1(F9,{dimColor:Z,children:[Y," ",X]},void 0,!0,void 0,this)},void 0,!1,void 0,this)});import{Box as L9,Text as $8}from"ink";import XG,{useMemo as D5}from"react";import{jsxDEV as f1}from"react/jsx-dev-runtime";function ZG($,J=60){if(!$)return"";let Y=$.split(`
|
|
151
|
-
`)[0]||"";if(Y.length<=J)return Y;return`${Y.slice(0,J)}...`}function
|
|
152
|
-
`).length}var w9=XG.memo(({content:$,isStreaming:J=!1,isExpanded:Y})=>{let Z=f0(),X=D5(()=>QG($),[$]),Q=D5(()=>ZG($),[$]),U=Z.colors.info,G=Z.colors.muted;return f1(L9,{flexDirection:"column",marginBottom:1,children:[f1(L9,{flexDirection:"row",children:[f1($8,{color:U,children:Y?"v":">"},void 0,!1,void 0,this),f1($8,{children:" "},void 0,!1,void 0,this),f1($8,{color:G,children:["Thinking",J?"...":` (${X} lines)`]},void 0,!0,void 0,this),!Y&&!J&&Q&&f1($8,{color:G,children:[" - ",Q]},void 0,!0,void 0,this),f1($8,{color:G,dimColor:!0,children:[" ","[Ctrl+T]"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Y&&$&&f1(L9,{marginLeft:2,marginTop:1,borderStyle:"round",borderColor:"gray",paddingX:1,paddingY:0,children:f1($8,{color:G,children:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});w9.displayName="ThinkingBlock";import{jsxDEV as D$}from"react/jsx-dev-runtime";var C8=($)=>$.role==="tool"||p2($),zG=({active:$=!0})=>{let J=V8(),Y=a8(),Z=i8(),X=OJ(),Q=E2(),U=n9(),G=XJ(),z=r8(),K=_J(),O=x9(),q=HJ(),N=NJ(),{width:_,height:F}=l1(),{stdout:H}=GG(),P=u1(),[M,B]=A9(null),[L,C]=A9([]),[W,T]=A9(new Set),w=i1(N),y=i1(null),S=i1(0),b=i1(0),R=i1(new Set),A=i1(new Set),V=i1([]),o=i1(null);D1(()=>{if(w.current!==N){if(w.current=N,!$)return;if(X1())i$();if(H)H.write(u6.clearTerminal);P.incrementClearCount()}},[$,N,H,P]);let d=J,J0=X;D1(()=>{if(!X||Q){o.current=null;return}if(o.current===X)return;if(o.current=X,X1())i$();if($&&H)H.write(u6.eraseScreen+u6.cursorTo(0,0));R.current=new Set,A.current=new Set(d.filter(C8).map((h)=>h.id)),y.current=null,S.current=0,b.current=0,V.current=[],C([]),T(new Set),P.incrementClearCount(),P.clearFinalizingStreamingMessageId()},[X,Q,H,P,d,$]);let Q0=Y??X;D1(()=>{if($&&X1())i$();y.current=null,S.current=0,b.current=0,R.current=new Set,A.current=new Set(d.filter(C8).map((h)=>h.id)),V.current=[],C([]),T(new Set)},[O]),D1(()=>{if(!Q0)return;if(y.current===Q0)return;y.current=Q0,S.current=0,b.current=0,A.current=new Set(d.filter(C8).map((h)=>h.id)),V.current=[]},[Q0,O]),D1(()=>{if(!Q0)return;let h=P9(Q0);if(!h||h.length<=S.current)return;let x=h.slice(S.current);S.current=h.length;let l=x,H0=V.current;if(H0.length>0)if(l.some((f)=>f.type!=="empty"))l=[...H0,...l],V.current=[];else{V.current=[...H0,...l];return}let F0=l.length;while(F0>0&&l[F0-1].type==="empty")F0-=1;if(F0!==l.length)V.current=l.slice(F0),l=l.slice(0,F0);if(l.length===0)return;let T0=b.current;b.current+=1;let I=T0>0;if(X1())i$();T((f)=>{if(!Q0||f.has(Q0))return f;let p=new Set(f);return p.add(Q0),p}),C((f)=>[...f,D$(F2,{flexDirection:"column",children:D$(S1,{content:"",role:"assistant",terminalWidth:_,isPending:!1,hidePrefix:I,noMargin:!0,blocksOverride:l,renderCodeBlocksAsPlainText:!1},void 0,!1,void 0,this)},`streaming-${Q0}-${T0}`,!1,void 0,this)])},[Q0,Z.version,_,O,$]),D1(()=>{if(!Q0)return;let h=A.current,x=d.filter((l)=>C8(l)&&!h.has(l.id)&&!R.current.has(l.id));if(x.length===0)return;if($&&X1())i$();for(let l of x)R.current.add(l.id);C((l)=>[...l,...x.map((H0)=>D$(F2,{flexDirection:"column",children:D$(S1,{content:H0.content,role:H0.role,terminalWidth:_,metadata:H0.metadata,isPending:!1,messageId:H0.id},void 0,!1,void 0,this)},`streaming-tool-${H0.id}`,!1,void 0,this))])},[$,Q0,d,_]),D1(()=>{if(!$){if(X1())i$();return}if(!Q0){if(X1())i$();return}if(!X1())Z3(_,F);else Q3(_,F);let h=v5(Q0);if(!h||h.lines.length===0)return;let l=Math.max(1,F-8),H0=Math.max(0,h.lines.length-l),F0=h.lines.slice(-l),T0=(P9(Q0)?.length??0)>0;U3(F0,H0,h.mode,T0)},[Q0,Z.version,F,_,$]),D1(()=>{if(!Q0&&X1())i$()},[Q0]),D1(()=>{if(M===null&&d.length>q){if(B(d.length),$&&X1())i$();if($&&H)H.write(u6.clearTerminal);P.incrementClearCount()}},[d.length,q,M,H,P,$]);let q0=B9(()=>{return U.some((h)=>h.status==="pending"||h.status==="in_progress")},[U]),a=N?0:M??0,D=a,v=B9(()=>{let h=[];if(h.push(D$(S5,{},"header",!1,void 0,this)),D>0)h.push(D$(W9,{collapsedCount:D},"collapsed-summary",!1,void 0,this));for(let x=a;x<d.length;x++){let l=d[x];if(J0&&l.id===J0)continue;if(C8(l)&&(R.current.has(l.id)||Q0&&!A.current.has(l.id)))continue;if(l.role==="assistant"&&W.has(l.id))continue;h.push(D$(F2,{flexDirection:"column",children:D$(S1,{content:l.content,role:l.role,terminalWidth:_,metadata:l.metadata,isPending:!1,messageId:l.id},void 0,!1,void 0,this)},l.id,!1,void 0,this))}return h},[d,a,D,_,J0,W,Q0]),K0=B9(()=>L.length>0?[...v,...L]:v,[v,L]);return D$(F2,{flexDirection:"column",paddingX:2,children:D$(F2,{flexDirection:"column",children:[D$(UG,{items:K0,children:(h)=>h},O,!1,void 0,this),z&&D$(F2,{marginBottom:1,children:D$(w9,{content:z,isStreaming:Q,isExpanded:K},void 0,!1,void 0,this)},void 0,!1,void 0,this),G&&q0&&D$(F2,{marginTop:1,children:D$(f5,{tasks:U,visible:!0,compact:!1},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this)},V5=KG.memo(zG);import{useMemoizedFn as d6,useMount as qG}from"ahooks";import{Box as s$,Text as v0,useFocus as _G,useFocusManager as OG}from"ink";import NG from"ink-select-input";import{memo as HG,useMemo as WG,useState as l6}from"react";import{jsxDEV as w0,Fragment as wG}from"react/jsx-dev-runtime";var FG=({isSelected:$})=>w0(s$,{marginRight:1,children:w0(v0,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),LG=({isSelected:$,label:J})=>w0(v0,{bold:$,color:$?"yellow":void 0,children:J},void 0,!1,void 0,this),j5=HG(({onClose:$,onEdit:J})=>{let Y=ZJ(),Z=m8()??"",{isFocused:X}=_G({id:"model-selector"}),Q=OG(),[U,G]=l6(""),[z,K]=l6(!1),[O,q]=l6(null),N=e0(!1),[_]=l6(()=>{let w=process.stdout?.columns||80;return Math.max(20,w-8)});qG(()=>{if(Q?.focus("model-selector"),Y.length>0)G(Y[0].id)}),O0((w,y)=>{if(z)return;if(y.ctrl&&w==="c"||y.meta&&w==="c"){N();return}if(y.escape){$();return}if(!X)return;if(w==="d"||w==="D"){H();return}if((w==="e"||w==="E")&&J)P()},{isActive:!0});let F=d6(async(w)=>{if(z)return;let y=w.value;if(y===Z){$();return}K(!0),q(null);try{await K$().setCurrentModel(y),$()}catch(S){q(S.message),K(!1)}}),H=d6(async()=>{if(z||U===Z)return;K(!0),q(null);try{if(await K$().removeModel(U),Y.length<=1)$()}catch(w){q(w.message)}finally{K(!1)}}),P=d6(()=>{if(z||!J)return;let w=Y.find((y)=>y.id===U);if(!w)return;J(w)}),M=d6((w)=>{G(w.value)}),B=WG(()=>{return Y.find((w)=>w.id===U)},[Y,U]),L=B?r6()?.modelProviders[B.provider]:void 0,C=Y.map((w)=>{let y=w.id===Z?" (当前)":"";return{label:b9(w)+y,value:w.id}}),W=U===Z;return w0(s$,{flexDirection:"column",borderStyle:"round",borderColor:"gray",padding:1,width:"100%",children:[w0(s$,{flexDirection:"row",justifyContent:"space-between",marginBottom:1,children:[w0(v0,{bold:!0,color:"cyan",children:"模型管理"},void 0,!1,void 0,this),w0(v0,{dimColor:!0,children:[z?"处理中...":W?"Enter=关闭 • E=编辑 • Esc=取消":"Enter=切换 • D=删除 • E=编辑 • Esc=取消"," • Ctrl+C=退出"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),w0(s$,{flexDirection:"row",children:[w0(s$,{flexDirection:"column",flexGrow:2,marginRight:2,borderStyle:"single",borderColor:"gray",padding:1,children:[w0(v0,{dimColor:!0,children:["已配置模型 (",Y.length,")"]},void 0,!0,void 0,this),w0(s$,{marginTop:1,children:w0(NG,{items:C,onSelect:F,onHighlight:M,indicatorComponent:FG,itemComponent:LG},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),w0(s$,{flexDirection:"column",flexGrow:3,borderStyle:"single",borderColor:"gray",padding:1,children:[w0(v0,{dimColor:!0,children:"模型详情"},void 0,!1,void 0,this),w0(s$,{marginY:1,children:w0(v0,{color:W?"green":"yellow",children:W?"* 当前使用":"* 可切换"},void 0,!1,void 0,this)},void 0,!1,void 0,this),B?w0(s$,{flexDirection:"column",children:[w0(v0,{children:[w0(v0,{dimColor:!0,children:"名称: "},void 0,!1,void 0,this),w0(v0,{bold:!0,color:"cyan",children:b9(B)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),w0(v0,{children:[w0(v0,{dimColor:!0,children:"Provider: "},void 0,!1,void 0,this),w0(v0,{bold:!0,children:L?.name??B.provider},void 0,!1,void 0,this)]},void 0,!0,void 0,this),L&&w0(wG,{children:[w0(v0,{children:[w0(v0,{dimColor:!0,children:"Channel ID: "},void 0,!1,void 0,this),w0(v0,{children:B.provider},void 0,!1,void 0,this)]},void 0,!0,void 0,this),w0(v0,{children:[w0(v0,{dimColor:!0,children:"Wire API: "},void 0,!1,void 0,this),w0(v0,{children:L.wireApi},void 0,!1,void 0,this)]},void 0,!0,void 0,this),w0(v0,{children:[w0(v0,{dimColor:!0,children:"Endpoint: "},void 0,!1,void 0,this),w0(v0,{color:"blueBright",children:L.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),w0(v0,{children:[w0(v0,{dimColor:!0,children:"Model: "},void 0,!1,void 0,this),w0(v0,{bold:!0,children:B.model},void 0,!1,void 0,this)]},void 0,!0,void 0,this),B.overrides?.baseUrl&&w0(v0,{children:[w0(v0,{dimColor:!0,children:"Base URL override: "},void 0,!1,void 0,this),w0(v0,{color:"blueBright",children:B.overrides.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this),w0(v0,{children:[w0(v0,{dimColor:!0,children:"Context Window: "},void 0,!1,void 0,this),w0(v0,{children:C1().resolveConfig(B).contextWindow},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this):w0(v0,{dimColor:!0,children:"请选择一个模型查看详情"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),O&&w0(s$,{marginTop:1,children:w0(v0,{color:"red",children:O},void 0,!1,void 0,this)},void 0,!1,void 0,this),w0(s$,{justifyContent:"center",marginTop:1,children:w0(v0,{dimColor:!0,children:"─".repeat(_)},void 0,!1,void 0,this)},void 0,!1,void 0,this),w0(s$,{justifyContent:"center",children:w0(v0,{dimColor:!0,children:"提示:D=删除 * E=编辑 * Up/Down=移动 * Enter/ESC=确认"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{useMemoizedFn as M9}from"ahooks";import{Box as jG,Text as T9}from"ink";import{useState as B2}from"react";import{Box as L2,Text as v1}from"ink";import BG from"ink-text-input";import{jsxDEV as B$}from"react/jsx-dev-runtime";var h5=({provider:$,value:J,onChange:Y,onSubmit:Z,onCancel:X,error:Q})=>{return O0((U,G)=>{if(G.escape)X()}),B$(L2,{flexDirection:"column",children:[B$(L2,{marginBottom:1,children:B$(v1,{bold:!0,color:"blue",children:"Step 2: 输入 API Key"},void 0,!1,void 0,this)},void 0,!1,void 0,this),B$(L2,{marginBottom:1,children:B$(v1,{children:["Provider: ",B$(v1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),B$(L2,{marginBottom:1,children:B$(v1,{dimColor:!0,children:"API 密钥将存储在 ~/.blade/auth.json(权限 600),不会写入模型配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),B$(L2,{children:[B$(v1,{bold:!0,color:"cyan",children:[">"," "]},void 0,!0,void 0,this),B$(BG,{value:J,onChange:Y,onSubmit:Z,placeholder:"sk-...",mask:"*"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q&&B$(L2,{marginTop:1,children:B$(v1,{color:"red",children:Q},void 0,!1,void 0,this)},void 0,!1,void 0,this),B$(L2,{marginTop:1,children:B$(v1,{dimColor:!0,children:["输入完成后按 ",B$(v1,{bold:!0,children:"Enter"},void 0,!1,void 0,this),",",B$(v1,{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 a6,Text as o1}from"ink";import AG from"ink-text-input";import{useState as i6}from"react";import{jsxDEV as x$}from"react/jsx-dev-runtime";var o6=["id","name","baseUrl","model"];function E5($){switch($){case"id":return"Channel ID";case"name":return"Channel name";case"baseUrl":return"Base URL";case"model":return"Model ID"}}function PG($,J,Y){switch($){case"id":return"team-gateway";case"name":return Y||"Team Gateway";case"baseUrl":return J==="anthropic-messages"?"https://gateway.example.com":"https://gateway.example.com/v1";case"model":return J==="anthropic-messages"?"claude-opus-4-8":"vendor-model-2026"}}function bG($,J){let Y=$.id.trim(),Z={name:$.name.trim()||Y,baseUrl:$.baseUrl.trim(),wireApi:J},X=m5(Y,Z);if(!$.model.trim())X.push("Model ID must not be empty");if(X.length>0)throw Error(X[0]);return{provider:Y,model:$.model.trim(),displayName:$.model.trim(),modelProvider:Z}}var p5=({wireApi:$,initialConfig:J,onSubmit:Y,onCancel:Z})=>{let X={id:J?.provider??"",name:J?.modelProvider?.name??"",baseUrl:J?.modelProvider?.baseUrl??"",model:J?.model??""},[Q,U]=i6(J?3:0),[G,z]=i6(J?.model??""),[K,O]=i6(X),[q,N]=i6(),_=o6[Q];O0((H,P)=>{if(!P.escape)return;if(N(void 0),Q===0){Z();return}let M=Q-1,B=o6[M];U(M),z(K[B])});let F=(H)=>{let P=H.trim();if(_==="id"&&!g5.test(P)){N("Channel ID 必须以小写字母开头,且仅包含小写字母、数字、.、_ 或 -");return}if(_==="baseUrl")try{let B=new URL(P);if(!["http:","https:"].includes(B.protocol))throw Error()}catch{N("Base URL 必须是绝对 HTTP(S) URL");return}if(_==="model"&&!P){N("Model ID 不能为空");return}let M={...K,[_]:_==="name"&&!P?K.id:P};if(O(M),N(void 0),Q===o6.length-1){try{Y(bG(M,$))}catch(B){N(B instanceof Error?B.message:"渠道配置无效")}return}U(Q+1),z("")};return x$(a6,{flexDirection:"column",children:[x$(a6,{marginBottom:1,children:x$(o1,{bold:!0,color:"blue",children:"配置自定义 Provider 渠道"},void 0,!1,void 0,this)},void 0,!1,void 0,this),x$(o1,{dimColor:!0,children:["Protocol:"," ",$==="anthropic-messages"?"Anthropic Messages":"OpenAI Chat Completions"]},void 0,!0,void 0,this),o6.slice(0,Q).map((H)=>x$(o1,{children:[E5(H),": ",x$(o1,{color:"cyan",children:K[H]},void 0,!1,void 0,this)]},H,!0,void 0,this)),x$(a6,{marginTop:1,children:[x$(o1,{bold:!0,children:[E5(_),": "]},void 0,!0,void 0,this),x$(AG,{value:G,onChange:(H)=>{z(H),N(void 0)},onSubmit:F,placeholder:PG(_,$,K.id)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),_==="name"&&x$(o1,{dimColor:!0,children:"留空使用 Channel ID"},void 0,!1,void 0,this),q&&x$(o1,{color:"red",children:q},void 0,!1,void 0,this),x$(a6,{marginTop:1,children:x$(o1,{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 u5,useState as J8}from"react";var d5=()=>{let[$,J]=J8([]),[Y,Z]=J8(!0),[X,Q]=J8(null);return u5(()=>{let U=!1;return(async()=>{try{let z=await x5();if(!U)J(z)}catch(z){if(!U)Q(z instanceof Error?z.message:"加载 Provider 列表失败")}finally{if(!U)Z(!1)}})(),()=>{U=!0}},[]),{providers:$,isLoading:Y,error:X}},l5=($)=>{let[J,Y]=J8([]),[Z,X]=J8(!1),[Q,U]=J8(null);return u5(()=>{if(!$){Y([]),X(!1),U(null);return}let G=!1;return Y([]),X(!0),U(null),(async()=>{try{let K=await c5($);if(!G)Y(K)}catch(K){if(!G)U(K instanceof Error?K.message:"加载模型列表失败")}finally{if(!G)X(!1)}})(),()=>{G=!0}},[$]),{models:J,isLoading:Z,error:Q}};import{Box as V1,Text as G1}from"ink";import MG from"ink-select-input";import TG from"ink-text-input";import{useMemo as r5,useState as CG}from"react";import{jsxDEV as Q$,Fragment as SG}from"react/jsx-dev-runtime";var RG=({isSelected:$})=>Q$(V1,{marginRight:1,children:Q$(G1,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),yG=($)=>{let J=[$.name];if($.contextWindow){let Y=$.contextWindow>=1e6?`${($.contextWindow/1e6).toFixed(1)}M`:$.contextWindow>=1000?`${Math.round($.contextWindow/1000)}K`:`${$.contextWindow}`;J.push(`[${Y} ctx]`)}if($.reasoning)J.push("[reasoning]");if($.input.includes("image"))J.push("[vision]");if($.cost.input||$.cost.output)J.push(`[$${$.cost.input}/$${$.cost.output}]`);return J.join(" ")},IG=({isSelected:$,label:J})=>Q$(G1,{bold:$,color:$?"yellow":void 0,children:J},void 0,!1,void 0,this),a5=({provider:$,models:J,isLoading:Y,error:Z,onSelect:X,onCancel:Q})=>{let[U,G]=CG("");O0((O,q)=>{if(q.escape)if(U)G("");else Q()});let z=r5(()=>{if(!U)return J;let O=U.toLowerCase();return J.filter((q)=>q.name.toLowerCase().includes(O)||q.id.toLowerCase().includes(O))},[J,U]),K=r5(()=>z.map((O)=>({key:O.id,label:yG(O),value:O})),[z]);if(Y)return Q$(V1,{flexDirection:"column",children:Q$(G1,{color:"yellow",children:["正在加载 ",$.name," 模型列表..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this);if(Z)return Q$(V1,{flexDirection:"column",children:[Q$(G1,{color:"red",children:Z},void 0,!1,void 0,this),Q$(G1,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return Q$(V1,{flexDirection:"column",children:[Q$(V1,{marginBottom:1,children:Q$(G1,{bold:!0,color:"blue",children:"Step 3: 选择模型"},void 0,!1,void 0,this)},void 0,!1,void 0,this),Q$(V1,{marginBottom:1,children:Q$(G1,{children:["Provider: ",Q$(G1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),Q$(SG,{children:[Q$(V1,{marginBottom:1,children:[Q$(G1,{color:"cyan",children:"> "},void 0,!1,void 0,this),Q$(TG,{value:U,onChange:G,placeholder:`搜索 ${J.length} 个模型...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q$(V1,{marginBottom:1,children:Q$(G1,{dimColor:!0,children:"模型元数据来自内置 catalog"},void 0,!1,void 0,this)},void 0,!1,void 0,this),Q$(V1,{flexDirection:"column",height:12,children:Q$(MG,{items:K,onSelect:(O)=>X(O.value),indicatorComponent:RG,itemComponent:IG,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),z.length===0&&Q$(G1,{color:"yellow",children:"内置 catalog 中没有匹配模型"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)};import{Box as w2,Text as n1}from"ink";import kG from"ink-select-input";import fG from"ink-text-input";import{useMemo as i5,useState as DG}from"react";import{jsxDEV as A$}from"react/jsx-dev-runtime";var vG=({isSelected:$})=>A$(w2,{marginRight:1,children:A$(n1,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),VG=({isSelected:$,label:J})=>A$(n1,{bold:$,color:$?"yellow":void 0,children:J},void 0,!1,void 0,this),o5=({providers:$,isLoading:J,error:Y,onSelect:Z,onCancel:X})=>{let[Q,U]=DG("");O0((K,O)=>{if(O.escape)if(Q)U("");else X()});let G=i5(()=>{if(!Q)return $;let K=Q.toLowerCase();return $.filter((O)=>O.name.toLowerCase().includes(K)||O.id.toLowerCase().includes(K))},[$,Q]),z=i5(()=>G.map((K)=>({key:K.id,label:`${K.name} - ${K.modelCount} models${K.configured?" [configured]":""}`,value:K})),[G]);if(J)return A$(w2,{flexDirection:"column",children:A$(n1,{color:"yellow",children:"正在加载 Provider 列表..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Y)return A$(w2,{flexDirection:"column",children:[A$(n1,{color:"red",children:Y},void 0,!1,void 0,this),A$(n1,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return A$(w2,{flexDirection:"column",children:[A$(w2,{marginBottom:1,children:A$(n1,{bold:!0,color:"blue",children:"Step 1: 选择 API 提供商"},void 0,!1,void 0,this)},void 0,!1,void 0,this),A$(w2,{marginBottom:1,children:[A$(n1,{color:"cyan",children:"> "},void 0,!1,void 0,this),A$(fG,{value:Q,onChange:U,placeholder:`搜索 ${$.length} 个 Provider...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),A$(w2,{flexDirection:"column",height:12,children:A$(kG,{items:z,onSelect:(K)=>Z(K.value),indicatorComponent:vG,itemComponent:VG,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),G.length===0&&A$(n1,{color:"yellow",children:"未找到匹配的 Provider,按 Esc 清除搜索"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};function n5($){if($==="custom")return"provider";if($==="model")return"provider";if($==="credential")return"model";return}import{jsxDEV as t1}from"react/jsx-dev-runtime";var C9=({mode:$,initialConfig:J,modelId:Y,onComplete:Z,onCancel:X})=>{let[Q,U]=B2("provider"),[G,z]=B2(),[K,O]=B2(),[q,N]=B2(),[_,F]=B2(""),[H,P]=B2(),[M,B]=B2(!1),L=d5(),C=l5(G?.id),W=e0(!1);O0((S,b)=>{if(b.ctrl&&S==="c"||b.meta&&S==="c")$==="setup"?W():X()});let T=M9(async(S)=>{if(!G)return;let b=q??(K?{provider:G.id,model:K.id,displayName:J?.displayName}:void 0);if(!b)return;B(!0),P(void 0);try{if(b.modelProvider)C1().registerModelProvider(b.provider,b.modelProvider,[b.model]);if(S?.trim())await C1().setApiKey(b.provider,S.trim());let R={displayName:b.displayName,provider:b.provider,model:b.model,overrides:b.overrides};if($==="setup")await Z(b);else if($==="add"){let A=b.modelProvider?await K$().addModelWithProvider(R,b.modelProvider):await K$().addModel(R);await K$().setCurrentModel(A.id),await Z(b)}else if(Y){if(b.modelProvider)await K$().updateModelWithProvider(Y,R,b.modelProvider);else await K$().updateModel(Y,R);await Z(b)}}catch(R){if(b.modelProvider){await C1().credentials.delete(b.provider);let A=r6();C1().configureModelProviders(A?.modelProviders??{},A?.models??[])}P(R instanceof Error?R.message:"保存配置失败"),B(!1)}}),w=M9((S)=>{if(O(S),G?.configured)T();else if(G?.supportsApiKey)U("credential");else P(`${G?.name??"Provider"} 需要 OAuth 或环境凭证,请先在外部完成认证`)}),y=M9(()=>{if(P(void 0),Q==="credential"&&q){U("custom");return}let S=n5(Q);if(S)U(S)});return t1(jG,{flexDirection:"column",padding:1,children:[t1(T9,{bold:!0,color:"blue",children:$==="edit"?"编辑模型":"添加模型"},void 0,!1,void 0,this),Q==="provider"&&t1(o5,{...L,onSelect:(S)=>{z(S),O(void 0),N(void 0),U(S.factoryWireApi?"custom":"model")},onCancel:$==="setup"?()=>{return}:X},void 0,!1,void 0,this),Q==="custom"&&G?.factoryWireApi&&t1(p5,{wireApi:G.factoryWireApi,initialConfig:q,onSubmit:(S)=>{N(S),U("credential")},onCancel:y},void 0,!1,void 0,this),Q==="model"&&G&&t1(a5,{provider:G,...C,onSelect:w,onCancel:y},void 0,!1,void 0,this),Q==="credential"&&G&&t1(h5,{provider:G,value:_,onChange:F,onSubmit:()=>void T(_),onCancel:y,error:H},void 0,!1,void 0,this),M&&t1(T9,{color:"yellow",children:"正在保存配置..."},void 0,!1,void 0,this),H&&Q!=="credential"&&t1(T9,{color:"red",children:H},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as R8}from"ahooks";import{promises as $7}from"fs";import{Box as c$,Text as X$}from"ink";import t5 from"ink-select-input";import hG from"ink-text-input";import EG from"os";import n6 from"path";import{useEffect as gG,useMemo as t6,useRef as mG,useState as s1}from"react";import{jsxDEV as y0}from"react/jsx-dev-runtime";var y8=[{key:"allow",label:"Allow"},{key:"ask",label:"Ask"},{key:"deny",label:"Deny"},{key:"info",label:"Info"}],pG={allow:"Add a new rule...",ask:"Add a new rule...",deny:"Add a new rule..."},xG={allow:"Allow permission rules",ask:"Ask permission rules",deny:"Deny permission rules"},s5={project:"[项目共享配置]",global:"[用户全局配置]",local:"[本地配置]"},cG=["project","global","local"],uG={allow:[],ask:[],deny:[]},dG={localExists:!1,projectExists:!1,globalExists:!1},e5={allow:[],ask:[],deny:[]};function lG($){let J=(Z)=>Array.isArray(Z)?Z.filter((X)=>typeof X==="string"):[],Y=$?.permissions??{};return{allow:J(Y?.allow),ask:J(Y?.ask),deny:J(Y?.deny)}}async function rG($){try{let J=await $7.readFile($,"utf-8"),Y=JSON.parse(J);return{exists:!0,raw:Y,permissions:lG(Y)}}catch(J){if(J.code==="ENOENT")return{exists:!1,raw:{},permissions:{...e5}};return console.warn(`[PermissionsManager] Failed to read ${$}:`,J),{exists:!0,raw:{},permissions:{...e5}}}}function aG($,J){let Y=$.padEnd(32," "),Z=J==="local"?`${s5[J]} <- 可删除`:s5[J];return`${Y} ${Z}`}var J7=({onClose:$})=>{let Y=s0()==="permissions-manager",Z=e0(!1),[X,Q]=s1(0),U=y8[X].key,[G,z]=s1(uG),[K,O]=s1(dG),[q,N]=s1(!0),[_,F]=s1("list"),[H,P]=s1(""),[M,B]=s1(null),[L,C]=s1(null),W=mG(!1),T=t6(()=>n6.join(G$(),".blade","settings.local.json"),[]),w=t6(()=>n6.join(G$(),".blade","settings.json"),[]),y=t6(()=>n6.join(EG.homedir(),".blade","settings.json"),[]),S=R8(async()=>{N(!0);let h=await Promise.all([{source:"local",path:T},{source:"project",path:w},{source:"global",path:y}].map(async({source:F0,path:T0})=>{let I=await rG(T0);return{source:F0,path:T0,...I}})),x={localExists:h.find((F0)=>F0.source==="local")?.exists??!1,projectExists:h.find((F0)=>F0.source==="project")?.exists??!1,globalExists:h.find((F0)=>F0.source==="global")?.exists??!1};O(x);let l={allow:[],ask:[],deny:[]},H0=Object.fromEntries(h.map((F0)=>[F0.source,F0]));["allow","ask","deny"].forEach((F0)=>{cG.forEach((T0)=>{(H0[T0]?.permissions[F0]??[]).forEach((f,p)=>{let E={key:`${T0}:${p}:${f}`,rule:f,source:T0};l[F0].push(E)})})}),z(l),N(!1)});gG(()=>{S()},[S]);let b=R8(async(K0,h)=>{try{let x=n6.join(G$(),".blade","settings.local.json"),l={allow:[],ask:[],deny:[]};try{let F0=await $7.readFile(x,"utf-8"),I=JSON.parse(F0).permissions||{};l={allow:Array.isArray(I.allow)?I.allow:[],ask:Array.isArray(I.ask)?I.ask:[],deny:Array.isArray(I.deny)?I.deny:[]}}catch(F0){}let H0=h(l);await K$().updateConfig({permissions:H0},{scope:"local",immediate:!0}),await S()}catch(x){throw console.error("[PermissionsManager] 修改权限规则失败:",x),x}});O0((K0,h)=>{if(h.ctrl&&K0==="c"||h.meta&&K0==="c"){Z();return}if(_==="locked"){if(W.current){W.current=!1;return}F("list"),B(null),C(null);return}if(h.escape){if(_==="list"||U==="info")$();else F("list"),P(""),B(null),C(null);return}if(_==="list"){if(h.tab&&h.shift)Q((x)=>(x-1+y8.length)%y8.length);else if(h.tab)Q((x)=>(x+1)%y8.length);else if(K0?.toLowerCase()==="q")$()}},{isActive:Y});let R=R8((K0)=>{let h=K0.value;if(U==="info")return;if(h.type==="add"){F("add"),P(""),C(null);return}if(h.entry.source!=="local"){F("locked"),W.current=!0,B({tab:U,entry:h.entry}),C({type:"error",text:h.entry.source==="project"?"此规则定义在项目共享配置中,无法在此删除。":"此规则来自用户全局配置,无法在此删除。"});return}F("confirm-delete"),B({tab:U,entry:h.entry}),C(null)}),A=R8(async()=>{if(U==="info")return;let K0=H.trim();if(!K0){C({type:"error",text:"Permission rule 不能为空"});return}if(G[U].map((x)=>x.rule).includes(K0)){C({type:"error",text:"该规则已存在"});return}try{await b(U,(x)=>{let l={allow:[...x.allow],ask:[...x.ask],deny:[...x.deny]};return l[U]=[...new Set([...x[U],K0])],l}),F("list"),P(""),C({type:"success",text:"已添加本地权限规则"})}catch(x){C({type:"error",text:`保存失败: ${x instanceof Error?x.message:"未知错误"}`})}}),V=R8(async()=>{if(!M)return;let{tab:K0,entry:h}=M;try{await b(K0,(x)=>{let l={allow:[...x.allow],ask:[...x.ask],deny:[...x.deny]};return l[K0]=x[K0].filter((H0)=>H0!==h.rule),l}),F("list"),B(null),C({type:"success",text:"已删除本地权限规则"})}catch(x){C({type:"error",text:`删除失败: ${x instanceof Error?x.message:"未知错误"}`})}}),o=t6(()=>{if(U==="info")return[];let K0=U;return[{key:"add-new-rule",label:`› ${pG[K0]}`,value:{type:"add"}},...G[K0].map((x)=>({key:x.key,label:aG(x.rule,x.source),value:{type:"rule",entry:x}}))]},[U,G]),d=()=>y0(c$,{marginBottom:1,children:y8.map((K0,h)=>y0(c$,{marginRight:2,children:y0(X$,{color:h===X?"yellow":"gray",children:["[",K0.label,"]"]},void 0,!0,void 0,this)},K0.key,!1,void 0,this))},void 0,!1,void 0,this),J0=()=>y0(c$,{flexDirection:"column",gap:1,children:[y0(X$,{children:"配置文件优先级(从高到低):"},void 0,!1,void 0,this),y0(c$,{flexDirection:"column",marginLeft:2,children:[y0(X$,{children:["1. .blade/settings.local.json (本地配置,不提交 Git)"," ",K.localExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),y0(X$,{children:["2. .blade/settings.json (项目配置,提交 Git)"," ",K.projectExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),y0(X$,{children:["3. ~/.blade/settings.json (用户全局配置)"," ",K.globalExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),y0(X$,{children:"说明:"},void 0,!1,void 0,this),y0(c$,{flexDirection:"column",marginLeft:2,children:[y0(X$,{children:"- /permissions 命令只管理本地配置 (.blade/settings.local.json)"},void 0,!1,void 0,this),y0(X$,{children:"- 修改全局或项目配置请直接编辑对应文件"},void 0,!1,void 0,this),y0(X$,{children:"- 本地配置不会提交到 Git"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Q0=(K0)=>y0(c$,{flexDirection:"column",gap:1,children:[y0(X$,{bold:!0,children:xG[K0]},void 0,!1,void 0,this),y0(X$,{children:"Permission rules are a tool name, optionally followed by a specifier in parentheses."},void 0,!1,void 0,this),y0(X$,{color:"gray",children:"例如: WebFetch 或 Bash(ls:*)"},void 0,!1,void 0,this),y0(c$,{marginTop:1,children:y0(hG,{value:H,onChange:P,onSubmit:A},void 0,!1,void 0,this)},void 0,!1,void 0,this),y0(X$,{color:"gray",children:"Enter 提交 · Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q0=(K0,h)=>y0(c$,{flexDirection:"column",gap:1,children:[y0(X$,{bold:!0,children:["Delete ",K0," permission rule?"]},void 0,!0,void 0,this),y0(X$,{children:h.rule},void 0,!1,void 0,this),y0(X$,{color:"gray",children:"From project local settings"},void 0,!1,void 0,this),y0(X$,{children:"Are you sure you want to delete this permission rule?"},void 0,!1,void 0,this),y0(t5,{items:[{label:"Yes",value:"yes"},{label:"No",value:"no"}],onSelect:(x)=>{if(x.value==="yes")V();else F("list"),B(null)}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),a=(K0)=>y0(c$,{flexDirection:"column",gap:1,children:[y0(X$,{bold:!0,children:"Cannot delete this rule"},void 0,!1,void 0,this),y0(X$,{children:K0.rule},void 0,!1,void 0,this),y0(X$,{color:"gray",children:K0.source==="project"?"This rule is defined in .blade/settings.json. 请手动编辑该文件以移除规则。":"This rule is defined in ~/.blade/settings.json. 请手动编辑该文件以移除规则。"},void 0,!1,void 0,this),y0(X$,{color:"gray",children:"按任意键继续"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D=(K0)=>y0(t5,{items:o,isFocused:_==="list",onSelect:R},void 0,!1,void 0,this),v=()=>{if(q)return y0(X$,{children:"加载中..."},void 0,!1,void 0,this);if(U==="info")return J0();if(_==="add")return Q0(U);if(_==="confirm-delete"&&M)return q0(M.tab,M.entry);if(_==="locked"&&M)return a(M.entry);return D(U)};return y0(c$,{flexDirection:"column",borderStyle:"round",borderColor:Y?"cyan":"gray",padding:1,width:80,children:[y0(X$,{color:"cyan",bold:!0,children:"权限管理器"},void 0,!1,void 0,this),d(),y0(c$,{flexDirection:"column",gap:1,children:v()},void 0,!1,void 0,this),L&&y0(c$,{marginTop:1,children:y0(X$,{color:L.type==="success"?"green":"red",children:L.text},void 0,!1,void 0,this)},void 0,!1,void 0,this),y0(c$,{marginTop:1,children:y0(X$,{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 c0,Text as b0}from"ink";import{useEffect as iG,useState as A2}from"react";import{jsxDEV as s}from"react/jsx-dev-runtime";var R9=["local","project","global"];function K7({workspaceRoot:$,onCancel:J}){let Y=s0()==="plugins-manager",Z=X7($),X=Z.getAll(),[Q,U]=A2(0),[G,z]=A2(!1),[K,O]=A2(""),[q,N]=A2(null),[_,F]=A2("local"),[H,P]=A2(null),[M,B]=A2(0),L=Z.getBySource(),C=Z.getStats(),W=Z.getSourcePolicy(),T=e0(!1,J);iG(()=>{let A=!0;return Y7.getInstance().loadWorkspacePluginSettingsResolution(Z.getWorkspaceRoot()).then((V)=>{if(A)P(V.settings)}).catch((V)=>{if(A)O(V instanceof Error?V.message:"无法读取插件作用域配置")}),()=>{A=!1}},[Z,M]);let w=()=>{F((A)=>{let V=R9.indexOf(A);return R9[(V+1)%R9.length]}),N(null)},y=async()=>{let A=X[Q];if(!A||G)return;if(A.source==="cli"){O(`${A.manifest.name} 由 --plugin-dir 管理,不能持久化切换`);return}if(A.status==="error"){O(A.error??`${A.manifest.name} 当前不可用`);return}z(!0),O("");try{let V=await Z7(Z.getWorkspaceRoot(),A.manifest.name,A.status!=="active",_);O(V.effectiveEnabled?`已启用 ${A.manifest.name} · 生效层级 ${V.effectiveScope}`:`已禁用 ${A.manifest.name} · 生效层级 ${V.effectiveScope}`),B((o)=>o+1)}catch(V){O(V instanceof Error?V.message:String(V))}finally{z(!1)}},S=async()=>{if(G)return;z(!0),O("");try{await Q7(Z.getWorkspaceRoot()),U(0),O("插件列表已刷新"),B((A)=>A+1)}catch(A){O(A instanceof Error?A.message:String(A))}finally{z(!1)}},b=async()=>{let A=X[Q];if(!A||G)return;if(!A.installation){O(`${A.manifest.name} 不是 Blade 受管安装,不能自动更新`);return}z(!0),N(null),O("");try{let{result:V}=await U7(Z.getWorkspaceRoot(),A.manifest.name,{trusted:!0});if(!V.success)throw Error(V.error);O(V.changed?`已更新 ${A.manifest.name} 到 ${V.installation?.revision}`:`${A.manifest.name} 已是最新版本`),B((o)=>o+1)}catch(V){O(V instanceof Error?V.message:String(V))}finally{z(!1)}},R=async()=>{let A=X[Q];if(!A||G)return;if(!A.installation){O(`${A.manifest.name} 不是 Blade 受管安装,不能自动卸载`);return}if(q!==A.manifest.name){N(A.manifest.name),O(`再次按 x 确认卸载 ${A.manifest.name}`);return}z(!0),O("");try{let{result:V}=await G7(Z.getWorkspaceRoot(),A.manifest.name,!0);if(!V.success)throw Error(V.error);N(null),U(0),O(`已卸载 ${A.manifest.name}`),B((o)=>o+1)}catch(V){O(V instanceof Error?V.message:String(V))}finally{z(!1)}};if(O0((A,V)=>{if(V.escape)J?.();else if(V.ctrl&&A==="c"||V.meta&&A==="c")T();else if((V.upArrow||A==="k")&&X.length>0)N(null),U((o)=>(o-1+X.length)%X.length);else if((V.downArrow||A==="j")&&X.length>0)N(null),U((o)=>(o+1)%X.length);else if(A===" "||V.return)y();else if(A==="r")S();else if(A==="s")w();else if(A==="u")b();else if(A==="x")R()},{isActive:Y}),X.length===0)return s(c0,{flexDirection:"column",paddingY:1,children:[s(c0,{marginBottom:1,children:s(b0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),s(c0,{paddingLeft:2,children:s(b0,{color:"gray",children:"没有已加载的插件"},void 0,!1,void 0,this)},void 0,!1,void 0,this),s(c0,{marginTop:1,paddingLeft:2,flexDirection:"column",children:[s(b0,{color:"gray",children:"插件目录位置:"},void 0,!1,void 0,this),s(b0,{color:"gray",dimColor:!0,children:[" ","• ~/.blade/plugins/ - 用户级插件"]},void 0,!0,void 0,this),s(b0,{color:"gray",dimColor:!0,children:[" ","• .blade/plugins/ - 项目级插件"]},void 0,!0,void 0,this),s(b0,{color:"gray",dimColor:!0,children:[" ","• --plugin-dir - CLI 指定的插件"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),s(c0,{marginTop:1,paddingLeft:2,children:s(b0,{color:"gray",children:"使用 /plugins install <url> 安装新插件"},void 0,!1,void 0,this)},void 0,!1,void 0,this),s(c0,{marginTop:1,children:s(b0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return s(c0,{flexDirection:"column",paddingY:1,children:[s(c0,{marginBottom:1,children:[s(b0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this),s(b0,{color:"gray",children:[" (共 ",C.total," 个插件)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),s(c0,{paddingLeft:2,marginBottom:1,children:s(b0,{color:"gray",children:["启用: ",C.active," | 禁用: ",C.inactive," | 命令: ",C.commands," | 技能:"," ",C.skills," | 代理: ",C.agents]},void 0,!0,void 0,this)},void 0,!1,void 0,this),s(c0,{paddingLeft:2,marginBottom:1,children:s(b0,{color:"gray",children:["来源策略: ",W.restrictToAllowedSources?"restricted":"open"," | Git SHA: ",W.requireGitCommitSha?"required":"optional"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),s(c0,{paddingLeft:2,marginBottom:1,children:s(b0,{color:"gray",children:["写入层级: ",s(b0,{color:"cyan",children:_},void 0,!1,void 0,this)," · 按 s 切换"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),L.cli.length>0&&s(c0,{flexDirection:"column",marginBottom:1,children:[s(c0,{paddingLeft:1,children:[s(b0,{bold:!0,color:"magenta",children:"CLI 指定"},void 0,!1,void 0,this),s(b0,{color:"gray",children:" (--plugin-dir)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),L.cli.map((A)=>{let V=A.status==="active"?"[on]":"[off]",o=X.indexOf(A)===Q;return s(c0,{flexDirection:"column",paddingLeft:2,children:[s(b0,{children:[s(b0,{bold:!0,color:o?"cyan":"green",children:[o?"› ":" ",V," ",A.manifest.name]},void 0,!0,void 0,this),s(b0,{color:"gray",children:[" v",A.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),s(c0,{paddingLeft:2,children:s(b0,{color:"gray",children:A.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),s(c0,{paddingLeft:2,children:s(b0,{color:"gray",dimColor:!0,children:"生效层级: invocation"},void 0,!1,void 0,this)},void 0,!1,void 0,this),A.commands.length>0&&s(c0,{paddingLeft:2,children:s(b0,{color:"blue",children:["命令:"," ",A.commands.map((d)=>`/${d.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},A.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),L.project.length>0&&s(c0,{flexDirection:"column",marginBottom:1,children:[s(c0,{paddingLeft:1,children:[s(b0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),s(b0,{color:"gray",children:" (.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),L.project.map((A)=>{let V=A.status==="active"?"[on]":"[off]",o=X.indexOf(A)===Q;return s(c0,{flexDirection:"column",paddingLeft:2,children:[s(b0,{children:[s(b0,{bold:!0,color:o?"cyan":"green",children:[o?"› ":" ",V," ",A.manifest.name]},void 0,!0,void 0,this),s(b0,{color:"gray",children:[" v",A.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),s(c0,{paddingLeft:2,children:s(b0,{color:"gray",children:A.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),s(c0,{paddingLeft:2,children:s(b0,{color:"gray",dimColor:!0,children:["生效层级:"," ",H?.[A.manifest.name]?.effectiveScope??"default"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),A.commands.length>0&&s(c0,{paddingLeft:2,children:s(b0,{color:"blue",children:["命令:"," ",A.commands.map((d)=>`/${d.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},A.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),L.user.length>0&&s(c0,{flexDirection:"column",marginBottom:1,children:[s(c0,{paddingLeft:1,children:[s(b0,{bold:!0,color:"cyan",children:"用户级"},void 0,!1,void 0,this),s(b0,{color:"gray",children:" (~/.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),L.user.map((A)=>{let V=A.status==="active"?"[on]":"[off]",o=X.indexOf(A)===Q;return s(c0,{flexDirection:"column",paddingLeft:2,children:[s(b0,{children:[s(b0,{bold:!0,color:o?"cyan":"green",children:[o?"› ":" ",V," ",A.manifest.name]},void 0,!0,void 0,this),s(b0,{color:"gray",children:[" v",A.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),s(c0,{paddingLeft:2,children:s(b0,{color:"gray",children:A.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),s(c0,{paddingLeft:2,children:s(b0,{color:"gray",dimColor:!0,children:["生效层级:"," ",H?.[A.manifest.name]?.effectiveScope??"default"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),A.commands.length>0&&s(c0,{paddingLeft:2,children:s(b0,{color:"blue",children:["命令:"," ",A.commands.map((d)=>`/${d.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},A.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),s(c0,{marginTop:1,paddingLeft:2,flexDirection:"column",children:[s(b0,{color:"gray",children:"可用命令:"},void 0,!1,void 0,this),s(b0,{color:"gray",dimColor:!0,children:[" ","• /plugins list - 列出所有插件"]},void 0,!0,void 0,this),s(b0,{color:"gray",dimColor:!0,children:[" ","• /plugins info <name> - 显示插件详情"]},void 0,!0,void 0,this),s(b0,{color:"gray",dimColor:!0,children:[" ","• /plugins install <url> - 安装插件"]},void 0,!0,void 0,this),s(b0,{color:"gray",dimColor:!0,children:[" ","• /plugins enable/disable <name> - 启用/禁用插件"]},void 0,!0,void 0,this),s(b0,{color:"gray",dimColor:!0,children:[" ","• /plugins policy show|set - 来源与 SHA 策略"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),s(c0,{marginTop:1,children:s(b0,{dimColor:!0,children:"↑/↓ 选择 · Space/Enter 启停 · s 切换层级 · u 信任并更新 · x 卸载 · r 刷新 · ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),K&&s(c0,{marginTop:1,children:s(b0,{color:K.includes("失败")?"red":"cyan",children:K},void 0,!1,void 0,this)},void 0,!1,void 0,this),G&&s(b0,{color:"gray",children:"处理中..."},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import{Box as b$,Text as M$,useStdout as oG}from"ink";import nG from"ink-text-input";import y9,{useCallback as I8,useMemo as tG,useState as e1}from"react";import{jsxDEV as V0}from"react/jsx-dev-runtime";var sG=y9.memo(({option:$,index:J,isSelected:Y,isMultiSelect:Z,isHighlighted:X})=>V0(b$,{flexDirection:"column",marginBottom:1,children:[V0(M$,{color:X?"yellow":Y?"green":void 0,bold:X,children:[Z?Y?"(*) ":"( ) ":X?"> ":" ",J+1,". ",$.label]},void 0,!0,void 0,this),V0(b$,{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)),eG=y9.memo(({questions:$,answers:J})=>V0(b$,{flexDirection:"column",marginBottom:1,children:$.map((Y)=>{let Z=J[Y.header],X=Array.isArray(Z)?Z.join(", "):Z||"(no answer)";return V0(b$,{marginBottom:1,children:[V0(M$,{backgroundColor:"blue",color:"white",children:[" ",Y.header," "]},void 0,!0,void 0,this),V0(M$,{color:"green",children:[" ",X]},void 0,!0,void 0,this)]},Y.header,!0,void 0,this)})},void 0,!1,void 0,this)),z7=y9.memo(({questions:$,onComplete:J,onCancel:Y})=>{let{stdout:Z}=oG(),X=Z.columns||80,U=s0()==="confirmation-prompt",G=e0(!1),[z,K]=e1("answering"),[O,q]=e1(0),[N,_]=e1({}),[F,H]=e1(0),[P,M]=e1([]),[B,L]=e1(!1),[C,W]=e1(""),[T,w]=e1(0),y=$[O],S=tG(()=>{if(!y)return[];return[...y.options.map((d)=>({label:d.label,value:d.label,description:d.description})),{label:"Type something...",value:"__other__",description:"Enter custom response"}]},[y]),b=I8((d)=>{let J0={...N,[y.header]:d};if(_(J0),O<$.length-1)q(O+1),H(0),M([]),L(!1),W("");else K("submit"),w(0)},[N,y?.header,O,$.length]),R=I8((d)=>{let J0=S[d];if(!J0)return;if(J0.value==="__other__"){L(!0);return}if(y.multiSelect)M((Q0)=>Q0.includes(J0.value)?Q0.filter((q0)=>q0!==J0.value):[...Q0,J0.value]);else b(J0.value)},[S,y?.multiSelect,b]),A=I8((d)=>{if(d.trim())b(d.trim())},[b]),V=I8(()=>{K("answering"),q(0),H(0),M([]),L(!1)},[]),o=I8(()=>{J(N)},[N,J]);if(O0((d,J0)=>{if(J0.ctrl&&d==="c"||J0.meta&&d==="c"){G();return}if(B){if(J0.escape)L(!1),W("");return}if(J0.escape){Y();return}let Q0=parseInt(d);if(Q0>=1&&Q0<=S.length){R(Q0-1);return}if(J0.upArrow){H((q0)=>q0>0?q0-1:S.length-1);return}if(J0.downArrow||J0.tab){H((q0)=>q0<S.length-1?q0+1:0);return}if(J0.return){if(y.multiSelect&&P.length>0)b(P);else R(F);return}if(d===" "&&y.multiSelect){let q0=S[F];if(q0&&q0.value!=="__other__")M((a)=>a.includes(q0.value)?a.filter((D)=>D!==q0.value):[...a,q0.value]);return}},{isActive:U&&z==="answering"&&!B}),O0((d,J0)=>{if(J0.ctrl&&d==="c"||J0.meta&&d==="c"){G();return}if(J0.escape){Y();return}if(J0.upArrow||J0.downArrow||J0.tab){w((Q0)=>Q0===0?1:0);return}if(J0.return){if(T===0)o();else V();return}if(d.toLowerCase()==="y"){o();return}if(d.toLowerCase()==="e"){V();return}},{isActive:U&&z==="submit"}),z==="submit")return V0(b$,{flexDirection:"column",borderStyle:"round",borderColor:U?"green":"gray",padding:1,width:Math.min(X-4,80),children:[V0(b$,{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(eG,{questions:$,answers:N},void 0,!1,void 0,this),V0(b$,{flexDirection:"column",marginTop:1,children:[V0(M$,{color:T===0?"yellow":void 0,bold:T===0,children:[T===0?"> ":" ","[Y] Submit answers"]},void 0,!0,void 0,this),V0(M$,{color:T===1?"yellow":void 0,bold:T===1,children:[T===1?"> ":" ","[E] Edit answers"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),V0(b$,{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(!y)return null;return V0(b$,{flexDirection:"column",borderStyle:"round",borderColor:U?"cyan":"gray",padding:1,width:Math.min(X-4,80),children:[V0(b$,{marginBottom:1,children:[V0(M$,{backgroundColor:"blue",color:"white",children:[" ",y.header," "]},void 0,!0,void 0,this),V0(M$,{children:[" ",y.question]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),B?V0(b$,{flexDirection:"column",marginTop:1,children:[V0(M$,{color:"yellow",children:"Enter your response:"},void 0,!1,void 0,this),V0(b$,{marginTop:1,children:[V0(M$,{color:"cyan",children:"> "},void 0,!1,void 0,this),V0(nG,{value:C,onChange:W,onSubmit:A,focus:U},void 0,!1,void 0,this)]},void 0,!0,void 0,this),V0(b$,{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(b$,{flexDirection:"column",children:S.map((d,J0)=>V0(sG,{option:d,index:J0,isSelected:P.includes(d.value),isMultiSelect:y.multiSelect,isHighlighted:F===J0},d.value,!1,void 0,this))},void 0,!1,void 0,this),!B&&V0(b$,{marginTop:1,flexDirection:"column",children:[V0(M$,{color:"gray",children:y.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),y.multiSelect&&P.length>0&&V0(M$,{color:"green",children:["Selected: ",P.join(", ")]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$.length>1&&V0(b$,{marginTop:1,children:V0(M$,{color:"gray",children:["Question ",O+1," of ",$.length]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as k9,Text as j1,useStdout as GK}from"ink";import{useEffect as f9,useMemo as $4,useRef as P2,useState as b2}from"react";function $K($,J){return[...$,J].join(`
|
|
153
|
-
`).replace(/\n+$/,"")}function S8($){let J=2166136261;for(let Y=0;Y<$.length;Y++)J^=$.charCodeAt(Y),J=Math.imul(J,16777619);return`${$.length}:${(J>>>0).toString(16)}`}function
|
|
154
|
-
`):[""],X=[];for(let[Q,U]of Z.entries()){let G=X.length===0?J.firstPrefix:J.nextPrefix,z=Math.max(1,Y-G.length),K=a2(U,z,!0),O=0;for(let q of K){let N=q.length>0?U.indexOf(q,O):O,_=N>=0?N:O,F=_+q.length,H=X.length===0?J.firstPrefix:J.nextPrefix;X.push({key:`${$.id}:${J.key}:${Q}:${X.length}`,blockId:$.id,role:$.role,kind:$.kind,text:`${H}${q}`,copyText:q,pending:$.pending===!0,header:J.header&&X.length===0,sourceLine:J.sourceLineOffset+Q,sourceStart:_,sourceEnd:F,sourceTextOffset:H.length}),O=F}}return X}function
|
|
155
|
-
`).length}function
|
|
156
|
-
`)[0]?.trim()??"";if(J.length<=48)return J;return`${J.slice(0,45)}...`}function I9($,J,Y=!1){if($.kind==="thinking"){let Z=Y?"[-]":"[+]",X=
|
|
139
|
+
`),z=G.includes("<<<DIFF>>>"),K=G.includes("```");if(z){let O=G.match(/<<<DIFF>>>\s*({[\s\S]*?})\s*<<<\/DIFF>>>/);if(O)try{let q=JSON.parse(O[1]);return u(I0,{flexDirection:"column",children:[u(n4,{patch:q.patch,startLine:q.startLine,matchLine:q.matchLine,terminalWidth:J},void 0,!1,void 0,this),Q&&u(I0,{marginTop:1,children:u(x0,{dimColor:!0,color:Y.colors.text.muted,children:["... 省略 ",X.length-50," 行 ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}catch{}}if(K){let O=G.match(/```(\w+)?\s*\n([\s\S]*?)\n```/);if(O){let q=O[1]||"text",N=O[2];return u(I0,{flexDirection:"column",children:[u(V6,{content:N,language:q,showLineNumbers:!1,terminalWidth:J},void 0,!1,void 0,this),Q&&u(I0,{marginTop:1,children:u(x0,{dimColor:!0,color:Y.colors.text.muted,children:["... 省略 ",X.length-50," 行 ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}}return u(I0,{flexDirection:"column",children:[U.map((O,q)=>u(x0,{color:Y.colors.text.primary,children:O},q,!1,void 0,this)),Q&&u(I0,{marginTop:1,children:u(x0,{dimColor:!0,color:Y.colors.text.muted,children:["... 省略 ",X.length-50," 行 ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});function $U($,J,Y,Z=80){if(!Y||J===void 0||J<=0)return{content:$,isTruncated:!1,hiddenLines:0};let Q=Math.max(1,J-8),U=Math.max(40,Z*0.8),G=Q*U;if($.length<=G)return{content:$,isTruncated:!1,hiddenLines:0};let z=Math.floor(G*0.9),K=$.length-z,O=K,q=$.indexOf(`
|
|
140
|
+
`,K);if(q!==-1&&q-K<U)O=q+1;let N=$.slice(O),F=($.slice(0,O).match(/\n/g)||[]).length+1;return{content:N,isTruncated:!0,hiddenLines:F}}var S1=O2.memo(({content:$,role:J,terminalWidth:Y,metadata:Z,isPending:X=!1,availableTerminalHeight:Q,hidePrefix:U=!1,noMargin:G=!1,renderPlainTextOnly:z=!1,streamingLines:K,streamingHiddenLines:O,messageId:q,blocksOverride:N,currentLineOverride:_,streamingMode:F="text",renderCodeBlocksAsPlainText:H=!1})=>{let P=f0(),T=N!==void 0,w=_2(()=>aQ(J,P.colors,Z),[J,P.colors,Z]),{color:L,prefix:R}=w,W=R.length+1,b=_2(()=>{if(!Z||typeof Z!=="object")return null;if(!("subtaskRef"in Z))return null;let D=Z.subtaskRef;if(!D||typeof D!=="object")return null;return D},[Z]),A=J==="tool"&&Z?.phase==="start",C=!G&&!A,S=_2(()=>{if(!z)return[];return $.split(/\r?\n/)},[$,z]);if(!T&&X){let D=K??$.split(/\r?\n/),v=O??0,K0=!1,h=!1,x=!1;if(F!=="text")K0=F==="code",h=F==="diff",x=F==="table";return u(I0,{flexDirection:"column",marginBottom:C?1:0,flexShrink:0,children:[v>0&&u(I0,{flexDirection:"row",flexShrink:0,children:[u(I0,{width:W,flexShrink:0},void 0,!1,void 0,this),u(x0,{color:P.colors.text.muted,dimColor:!0,children:["^ ",v," lines above (streaming...)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),D.map((l,W0)=>{if(F==="text"){if(l.match(r1.codeBlock))K0=!K0;else if(l.match(r1.diffStart))h=!0;else if(l.match(r1.diffEnd))h=!1;else if(l.match(r1.table))x=!0;else if(x&&!l.match(r1.table))x=!1}let L0=F==="text"&&!K0&&!h&&!x,T0=L0?l.match(r1.ulItem):null,I=L0?l.match(r1.olItem):null,f=T0??I;return u(I0,{flexDirection:"row",flexShrink:0,children:[W0===0&&!U?u(I0,{marginRight:1,flexShrink:0,children:u(x0,{color:L,bold:!0,children:R},void 0,!1,void 0,this)},void 0,!1,void 0,this):u(I0,{width:W,flexShrink:0},void 0,!1,void 0,this),u(I0,{flexGrow:1,flexShrink:0,children:f?u(s4,{type:T0?"ul":"ol",marker:f[2],itemText:f[3],leadingWhitespace:f[1]},void 0,!1,void 0,this):u(x0,{wrap:"wrap",children:l===""?" ":l},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},W0,!0,void 0,this)})]},void 0,!0,void 0,this)}if(!T&&z)return u(I0,{flexDirection:"column",marginBottom:C?1:0,flexShrink:0,children:S.map((D,v)=>u(I0,{flexDirection:"row",flexShrink:0,children:[v===0&&!U?u(I0,{marginRight:1,flexShrink:0,children:u(x0,{color:L,bold:!0,children:R},void 0,!1,void 0,this)},void 0,!1,void 0,this):u(I0,{width:W,flexShrink:0},void 0,!1,void 0,this),u(I0,{flexGrow:1,flexShrink:0,children:u(x0,{wrap:"wrap",children:D===""?" ":D},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},v,!0,void 0,this))},void 0,!1,void 0,this);let M=p3(null);J9(()=>{M.current=null},[q]);let y=_2(()=>{if(T)return null;if(!q)return null;return x3(q)},[q,T]);J9(()=>{if(T)return;if(!y||!q)return;M.current={messageId:q,blocks:y}},[y,q,T]),J9(()=>{if(T)return;if(!y||!q)return;c3(q)},[y,q,T]);let B=_2(()=>T?{content:$,isTruncated:!1,hiddenLines:0}:$U($,Q,X,Y),[$,Q,X,Y,T]),{content:V,isTruncated:o,hiddenLines:a}=B;if(Z?.conversationRecap===!0)return u(I0,{marginBottom:1,flexShrink:0,children:u(x0,{color:P.colors.text.muted,wrap:"wrap",children:[u(x0,{bold:!0,children:"↶ recap: "},void 0,!1,void 0,this),u(x0,{italic:!0,children:$},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this);if(!T&&J==="tool"&&Z&&"detail"in Z){let D=Z;if(D.detail)return u(I0,{flexDirection:"column",marginBottom:G?0:1,children:[u(I0,{flexDirection:"row",children:[u(I0,{marginRight:1,children:u(x0,{color:L,bold:!0,children:R},void 0,!1,void 0,this)},void 0,!1,void 0,this),u(x0,{color:L,children:$},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(I0,{marginLeft:R.length+1,children:u(eQ,{detail:D.detail,terminalWidth:Y-(R.length+1)},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}let{completedContent:Y0,currentLine:Q0}=_2(()=>{if(T)return{completedContent:"",currentLine:_??""};if(!X)return{completedContent:V,currentLine:""};let D=V.lastIndexOf(`
|
|
141
|
+
`);if(D===-1)return{completedContent:"",currentLine:V};return{completedContent:V.slice(0,D+1),currentLine:V.slice(D+1)}},[V,X,T,_]),N0=p3({content:"",blocks:[]}),d=_2(()=>{if(T)return N??[];if(y)return y;if(M.current&&M.current.messageId===q)return M.current.blocks;let D=N0.current;if(!X||!Y0.startsWith(D.content)){let x=Y9(Y0);return N0.current={content:Y0,blocks:x},x}if(Y0===D.content)return D.blocks;let v=Y0.slice(D.content.length),K0=Y9(v),h=[...D.blocks,...K0];return N0.current={content:Y0,blocks:h},h},[Y0,X,T,N]);return u(I0,{flexDirection:"column",marginBottom:C?1:0,flexShrink:0,children:[o&&u(I0,{flexDirection:"row",flexShrink:0,children:[u(I0,{width:W,flexShrink:0},void 0,!1,void 0,this),u(x0,{color:P.colors.text.muted,dimColor:!0,children:["^ ",a," lines above (streaming...)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),d.map((D,v)=>{if(D.type==="empty")return u(I0,{height:1,flexShrink:0},v,!1,void 0,this);return u(I0,{flexDirection:"row",flexShrink:0,children:[v===0&&!U&&u(I0,{marginRight:1,flexShrink:0,children:u(x0,{color:L,bold:!0,children:R},void 0,!1,void 0,this)},void 0,!1,void 0,this),(v>0||U)&&u(I0,{width:W,flexShrink:0},void 0,!1,void 0,this),u(I0,{flexGrow:1,flexShrink:0,children:D.type==="code"?H?u(x0,{wrap:"wrap",children:D.content},void 0,!1,void 0,this):u(iQ,{content:D.content,language:D.language,terminalWidth:Y-W,isPending:X,availableHeight:Q},void 0,!1,void 0,this):D.type==="table"&&D.tableData?u(m3,{headers:D.tableData.headers,rows:D.tableData.rows,terminalWidth:Y-W},void 0,!1,void 0,this):D.type==="heading"?u(oQ,{content:D.content,level:D.level||1},void 0,!1,void 0,this):D.type==="list"?u(s4,{type:D.listType||"ul",marker:D.marker||"-",itemText:D.content,leadingWhitespace:" ".repeat(D.indentation||0)},void 0,!1,void 0,this):D.type==="hr"?u(nQ,{terminalWidth:Y-W},void 0,!1,void 0,this):D.type==="diff"&&D.diffData?u(n4,{patch:D.diffData.patch,startLine:D.diffData.startLine,matchLine:D.diffData.matchLine,terminalWidth:Y-W},void 0,!1,void 0,this):D.type==="command-message"?u(sQ,{content:D.content},void 0,!1,void 0,this):D.type==="blockquote"&&D.blockquoteLines?u(T3,{lines:D.blockquoteLines,level:D.blockquoteLevel||1},void 0,!1,void 0,this):u(tQ,{content:D.content},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},v,!0,void 0,this)}),Q0&&u(I0,{flexDirection:"row",flexShrink:0,children:[d.length===0&&!U?u(I0,{marginRight:1,flexShrink:0,children:u(x0,{color:L,bold:!0,children:R},void 0,!1,void 0,this)},void 0,!1,void 0,this):u(I0,{width:W,flexShrink:0},void 0,!1,void 0,this),u(I0,{flexGrow:1,flexShrink:0,children:u(x0,{wrap:"wrap",children:Q0},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),b&&u(I0,{flexDirection:"row",flexShrink:0,children:[u(I0,{width:W,flexShrink:0},void 0,!1,void 0,this),u(I0,{flexDirection:"column",flexGrow:1,flexShrink:0,children:[u(x0,{color:P.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()!==""&&u(x0,{wrap:"wrap",children:b.summary},void 0,!1,void 0,this),typeof b.childSessionId==="string"&&u(x0,{color:P.colors.text.muted,children:["Session ",b.childSessionId]},void 0,!0,void 0,this),typeof b.resumedFrom==="string"&&u(x0,{color:P.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 n0,Fragment as UU}from"react/jsx-dev-runtime";var XU=X9.memo(({label:$,isSelected:J})=>n0(H1,{color:J?"yellow":void 0,children:$},void 0,!1,void 0,this)),ZU=X9.memo(({details:$,headerColor:J,isPlanModeExit:Y,isPlanModeEnter:Z,terminalWidth:X})=>n0(UU,{children:[n0(n$,{marginBottom:1,children:n0(H1,{children:$.message},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.planContent&&n0(n$,{flexDirection:"column",marginBottom:1,borderStyle:"single",borderColor:J,padding:1,children:[n0(H1,{bold:!0,color:J,children:"实施方案"},void 0,!1,void 0,this),n0(n$,{marginTop:1,children:n0(S1,{content:$.planContent,role:"assistant",terminalWidth:X-4},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),!$.planContent&&$.details&&n0(n$,{flexDirection:"column",marginBottom:1,children:n0(S1,{content:$.details,role:"assistant",terminalWidth:X},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.risks&&$.risks.length>0&&n0(n$,{flexDirection:"column",marginBottom:1,children:[n0(H1,{color:"red",bold:!0,children:"风险提示:"},void 0,!1,void 0,this),$.risks.map((Q,U)=>n0(n$,{marginLeft:2,children:n0(H1,{color:"red",children:["• ",Q]},void 0,!0,void 0,this)},U,!1,void 0,this))]},void 0,!0,void 0,this),$.affectedFiles&&$.affectedFiles.length>0&&n0(n$,{flexDirection:"column",marginBottom:1,children:[n0(H1,{color:"yellow",children:"影响的文件:"},void 0,!1,void 0,this),$.affectedFiles.slice(0,3).map((Q,U)=>n0(n$,{marginLeft:2,children:n0(H1,{children:["• ",Q]},void 0,!0,void 0,this)},U,!1,void 0,this)),$.affectedFiles.length>3&&n0(n$,{marginLeft:2,children:n0(H1,{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 QU($,J,Y,Z){return`使用 ↑↓ 选择,回车确认 · ${J||Y||Z?"Y/N":$?"Y/S/N":"Y/S/P/N"} 快捷键 · Esc 取消`}var d3=X9.memo(({details:$,onResponse:J})=>{let{stdout:Y}=JU(),Z=Y.columns||80,Q=s0()==="confirmation-prompt",U=e0(!1),G=$.type==="exitPlanMode",z=$.type==="enterPlanMode",K=$.type==="maxTurnsExceeded",O=$.type==="mcpSampling";_0((_,F)=>{if(F.ctrl&&_==="c"||F.meta&&_==="c"){U();return}if(F.escape){J({approved:!1,reason:"用户取消"});return}let H=_.toLowerCase();if(G){if(H==="y"){J({approved:!0,targetMode:"autoEdit"});return}if(H==="s"){J({approved:!0,targetMode:"default"});return}if(H==="n"){J({approved:!1,reason:"方案需要改进"});return}}else if(z){if(H==="y"){J({approved:!0});return}if(H==="n"){J({approved:!1,reason:"用户拒绝进入 Plan 模式"});return}}else if(K){if(H==="y"){J({approved:!0});return}if(H==="n"){J({approved:!1,reason:"用户选择停止"});return}}else if(O){if(H==="y"){J({approved:!0,scope:"once"});return}if(H==="n"){J({approved:!1,reason:"用户拒绝 MCP Sampling"});return}}else{if(H==="y"){J({approved:!0,scope:"once"});return}if(H==="s"){J({approved:!0,scope:"session"});return}if(H==="p"){J({approved:!0,scope:"project"});return}if(H==="n"){J({approved:!1,reason:"用户拒绝"});return}}},{isActive:Q});let q=u3(()=>{if(G)return[{key:"approve-auto",label:"[Y] 批准,自动执行",value:{approved:!0,targetMode:"autoEdit"}},{key:"approve-default",label:"[S] 批准,逐步确认",value:{approved:!0,targetMode:"default"}},{key:"reject",label:"[N] 继续优化方案",value:{approved:!1,reason:"方案需要改进"}}];if(z)return[{key:"approve",label:"[Y] 进入规划模式",value:{approved:!0}},{key:"reject",label:"[N] 直接执行",value:{approved:!1,reason:"用户拒绝进入 Plan 模式"}}];if(K)return[{key:"continue",label:"[Y] 继续执行",value:{approved:!0}},{key:"stop",label:"[N] 停止",value:{approved:!1,reason:"用户选择停止"}}];if(O)return[{key:"approve-once",label:"[Y] 允许本次 Sampling",value:{approved:!0,scope:"once"}},{key:"reject",label:"[N] 拒绝",value:{approved:!1,reason:"用户拒绝 MCP Sampling"}}];return[{key:"approve-once",label:"[Y] 允许(仅本次)",value:{approved:!0,scope:"once"}},{key:"approve-session",label:"[S] 允许(本次会话)",value:{approved:!0,scope:"session"}},{key:"approve-project",label:"[P] 允许并记住(本项目)",value:{approved:!0,scope:"project"}},{key:"reject",label:"[N] 拒绝",value:{approved:!1,reason:"用户拒绝"}}]},[G,z,K,O]),N=u3(()=>{if(G)return{color:"cyan",title:"方案审核"};if(z)return{color:"magenta",title:"进入规划模式"};if(K)return{color:"yellow",title:"已达最大轮次"};return{color:"yellow",title:$.title||"操作确认"}},[G,z,K,$.title]);return n0(n$,{flexDirection:"column",borderStyle:"round",borderColor:Q?N.color:"gray",padding:1,children:[n0(n$,{marginBottom:1,children:n0(H1,{bold:!0,color:N.color,children:N.title},void 0,!1,void 0,this)},void 0,!1,void 0,this),n0(ZU,{details:$,headerColor:N.color,isPlanModeExit:G,isPlanModeEnter:z,terminalWidth:Z},void 0,!1,void 0,this),n0(n$,{flexDirection:"column",children:[n0(H1,{color:"gray",children:QU(G,z,K,O)},void 0,!1,void 0,this),n0(YU,{items:q,isFocused:Q,itemComponent:XU,onSelect:(_)=>{J(_.value)}},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});import{Box as Z9,Text as U1}from"ink";import{useEffect as GU,useMemo as KU,useState as zU}from"react";import{jsxDEV as E$}from"react/jsx-dev-runtime";function qU($,J){let Y=J,Z=J;while(Y>0&&$.items[Y-1]?.mutable)Y--;while(Z<$.items.length-1&&$.items[Z+1]?.mutable)Z++;return{start:Y,end:Z}}function l3({queue:$,mutation:J,onMutate:Y,onRefresh:Z,onClose:X}){let{width:Q,height:U}=l1(),[G,z]=zU($?.items[0]?.id??null),K=Math.max(0,$?.items.findIndex((_)=>_.id===G)??0);GU(()=>{if(!$||$.items.length===0){z(null);return}if(!G||!$.items.some((_)=>_.id===G))z($.items[Math.min(K,$.items.length-1)].id)},[$,G,K]);let O=(_)=>{Promise.resolve(Y(_)).catch(()=>{return})};_0((_,F)=>{if(F.escape||_==="q")return X(),!0;if(_==="r")return Promise.resolve(Z()).catch(()=>{return}),!0;if(!$||$.items.length===0)return!0;if(F.downArrow||_==="j"){let w=Math.min($.items.length-1,K+1);return z($.items[w].id),!0}if(F.upArrow||_==="k"){let w=Math.max(0,K-1);return z($.items[w].id),!0}let H=$.items[K];if(!H?.mutable||J.pending)return!0;let P=qU($,K);if(_==="d")return O({type:"remove",messageId:H.id}),!0;let T=_==="K"?Math.max(P.start,K-1):_==="J"?Math.min(P.end,K+1):_==="g"?P.start:_==="G"?P.end:void 0;if(T!==void 0&&T!==K)O({type:"move",messageId:H.id,toPosition:T});return!0},{priority:120});let q=KU(()=>{if(!$)return[];let _=Math.max(1,U-9),F=Math.max(0,Math.min(K-Math.floor(_/2),$.items.length-_));return $.items.slice(F,F+_)},[U,$,K]),N=Math.max(8,Q-38);return E$(Z9,{flexDirection:"column",borderStyle:"double",borderColor:"yellow",paddingX:1,children:[E$(Z9,{justifyContent:"space-between",children:[E$(U1,{bold:!0,color:"yellow",children:["Follow-up queue · ",$?.pending??0]},void 0,!0,void 0,this),E$(U1,{dimColor:!0,children:"Esc/q close · r refresh"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E$(U1,{dimColor:!0,children:"j/k select · d delete · J/K move · g/G segment edge"},void 0,!1,void 0,this),(J.errorCode||J.errorMessage)&&E$(U1,{color:"red",children:J.errorCode==="revision_conflict"?"Queue changed; showing the latest order":J.errorMessage},void 0,!1,void 0,this),!$||$.items.length===0?E$(U1,{dimColor:!0,children:"No queued follow-ups."},void 0,!1,void 0,this):q.map((_)=>{let F=_.id===G,H=_.kind==="internal"?"Internal runtime item":_.preview||"Attachment-only follow-up";return E$(Z9,{gap:1,children:[E$(U1,{color:F?"cyan":void 0,children:F?"›":" "},void 0,!1,void 0,this),E$(U1,{dimColor:!0,children:String(_.position+1).padStart(2," ")},void 0,!1,void 0,this),E$(U1,{color:_.mutable?"white":"gray",children:A3(H.replace(/\s+/g," "),N,"…")},void 0,!1,void 0,this),_.attachmentCount>0&&E$(U1,{color:"cyan",children:["[",_.attachmentCount," attachment]"]},void 0,!0,void 0,this),E$(U1,{color:_.mutable?"green":"yellow",children:_.mutable?_.delivery.replace("_"," "):"locked"},void 0,!1,void 0,this),J.pending&&J.messageId===_.id&&E$(U1,{color:"yellow",children:"updating…"},void 0,!1,void 0,this)]},_.id,!0,void 0,this)})]},void 0,!0,void 0,this)}import{Box as j0,Text as R0}from"ink";import r3 from"ink-text-input";import{useState as k1}from"react";import{jsxDEV as t}from"react/jsx-dev-runtime";var A8=[{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"}],j6=[{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"}],h6=[{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"}],_U=[`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"],a3=({workspaceRoot:$,sessionId:J,onClose:Y,onSave:Z})=>{let X=F$.getTheme(),[Q,U]=k1("action"),[G,z]=k1(0),[K,O]=k1(0),[q,N]=k1(0),[_,F]=k1(""),[H,P]=k1(""),[T,w]=k1(null),[L,R]=k1(!1),[W,b]=k1(null),A=A8[G],C=h6[K],S=j6[q],M=()=>{if(W){b(null);return}switch(Q){case"action":Y();break;case"event":U("action");break;case"matcher":U("event");break;case"command":U("matcher");break;case"location":U("command");break;case"confirm":U("location");break}};_0((d,D)=>{if(D.escape){M();return}if(Q==="action"){if(D.upArrow)z((v)=>v>0?v-1:A8.length-1);else if(D.downArrow)z((v)=>v<A8.length-1?v+1:0);else if(D.return)y()}else if(Q==="event"){if(D.upArrow)O((v)=>v>0?v-1:h6.length-1);else if(D.downArrow)O((v)=>v<h6.length-1?v+1:0);else if(D.return)U("matcher")}else if(Q==="location"){if(D.upArrow)N((v)=>v>0?v-1:j6.length-1);else if(D.downArrow)N((v)=>v<j6.length-1?v+1:0);else if(D.return)U("confirm")}else if(Q==="confirm"){if(D.return)N0()}});let y=()=>{let d=A8[G].action;if(d==="add")U("event");else if(d==="status")B();else if(d==="list")a();else if(d==="enable")h$.getInstance().enableSession(J,$),b("Hooks enabled for this session");else if(d==="disable")h$.getInstance().disableSession(J,$),b("Hooks disabled for this session");else if(d==="trust")V();else if(d==="revoke")o()},B=async()=>{let d=h$.getInstance(),D=d.isEnabled($,J),v=d.getConfig($),K0=await d.getTrustStatus($),h={};for(let l of Object.values(Q9)){let W0=v[l];if(W0&&Array.isArray(W0)){let L0=W0.reduce((T0,I)=>T0+(I.hooks?.length||0),0);if(L0>0)h[l]=L0}}let x=[`Status: ${D?"Enabled":"Disabled"}`,`Trust: ${K0.state}`,`Digest: ${K0.currentDigest??"none"}`,""];if(Object.keys(h).length>0){x.push("Configured hooks:");for(let[l,W0]of Object.entries(h))x.push(` ${l}: ${W0} hook(s)`)}else x.push("No hooks configured");b(x.join(`
|
|
142
|
+
`))},V=async()=>{try{let d=await h$.getInstance().trustProject($);b(`Trust: ${d.state}
|
|
143
|
+
Digest: ${d.currentDigest??"none"}`)}catch(d){w(d instanceof Error?d.message:"Failed to trust hooks")}},o=async()=>{try{let d=await h$.getInstance().revokeProjectTrust($);b(`Trust: ${d.state}`)}catch(d){w(d instanceof Error?d.message:"Failed to revoke hook trust")}},a=()=>{let D=h$.getInstance().getConfig($),v=[],K0=!1;for(let h of Object.values(Q9)){let x=D[h];if(!x||!Array.isArray(x)||x.length===0)continue;K0=!0,v.push(`${h}:`);for(let l of x){let W0=l.matcher,L0="all";if(W0?.tools)L0=`tools: ${Array.isArray(W0.tools)?W0.tools.join(", "):W0.tools}`;v.push(` [${L0}]`);for(let T0 of l.hooks||[])if(T0.type==="command")v.push(` -> ${T0.command}`)}v.push("")}if(!K0)v.push("No hooks configured"),v.push(""),v.push("Configure hooks in .blade/settings.local.json");b(v.join(`
|
|
144
|
+
`))},Y0=()=>{U("command")},Q0=()=>{if(!H.trim()){w("Command cannot be empty");return}w(null),U("location")},N0=async()=>{R(!0),w(null);try{let d=h$.getInstance(),D=await import("node:fs/promises"),v=await import("node:path"),K0=await import("node:os"),h={matcher:_.trim()?{tools:_.trim()}:{},hooks:[{type:"command",command:H.trim()}]},x;switch(S.location){case"local":x=v.join($,".blade","settings.local.json");break;case"project":x=v.join($,".blade","settings.json");break;case"user":x=v.join(K0.homedir(),".blade","settings.json");break}await D.mkdir(v.dirname(x),{recursive:!0});let l={};try{let I=await D.readFile(x,"utf-8");l=JSON.parse(I)}catch{}let W0=l.hooks||{},L0=W0[C.event]||[],T0={...W0,enabled:!0,[C.event]:[...L0,h]};if(l.hooks=T0,await D.writeFile(x,JSON.stringify(l,null,2),"utf-8"),await d.reloadConfig($),Z)Z({event:C.event,matcher:_.trim(),command:H.trim()});Y()}catch(d){w(`Failed to save hook: ${d instanceof Error?d.message:"Unknown error"}`),R(!1)}};return t(j0,{flexDirection:"column",padding:1,children:[t(j0,{marginBottom:1,children:t(R0,{bold:!0,color:X.colors.success,children:"Hooks Manager"},void 0,!1,void 0,this)},void 0,!1,void 0,this),t(j0,{marginBottom:1,children:t(R0,{color:X.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),W&&t(j0,{flexDirection:"column",marginBottom:1,children:[t(R0,{children:W},void 0,!1,void 0,this),t(j0,{marginTop:1,children:t(R0,{color:X.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"&&!W&&t(j0,{flexDirection:"column",children:[t(j0,{flexDirection:"column",marginTop:1,children:A8.map((d,D)=>t(j0,{children:[t(R0,{color:D===G?X.colors.primary:void 0,bold:D===G,children:[D===G?"> ":" ",d.action]},void 0,!0,void 0,this),t(R0,{color:X.colors.muted,children:[" - ",d.description]},void 0,!0,void 0,this)]},d.action,!0,void 0,this))},void 0,!1,void 0,this),t(j0,{marginTop:1,children:t(R0,{color:X.colors.muted,children:"Up/Down to select · Enter to continue · Esc to close"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q==="event"&&t(j0,{flexDirection:"column",children:[t(R0,{bold:!0,children:"Select Event:"},void 0,!1,void 0,this),t(j0,{flexDirection:"column",marginTop:1,children:h6.map((d,D)=>t(j0,{children:[t(R0,{color:D===K?X.colors.primary:void 0,bold:D===K,children:[D===K?"> ":" ",d.event]},void 0,!0,void 0,this),t(R0,{color:X.colors.muted,children:[" - ",d.description]},void 0,!0,void 0,this)]},d.event,!0,void 0,this))},void 0,!1,void 0,this),t(j0,{marginTop:1,children:t(R0,{color:X.colors.muted,children:"Up/Down to select · Enter to continue · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q!=="event"&&t(j0,{marginBottom:1,children:t(R0,{children:["Event:"," ",t(R0,{bold:!0,color:X.colors.primary,children:C.event},void 0,!1,void 0,this),t(R0,{color:X.colors.muted,children:[" - ",C.description]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),(Q==="matcher"||Q==="command"||Q==="confirm")&&t(j0,{flexDirection:"column",marginBottom:1,children:[t(R0,{color:X.colors.muted,children:"Input to command is JSON of tool call arguments."},void 0,!1,void 0,this),t(R0,{color:X.colors.muted,children:"Exit code 0 - stdout/stderr not shown"},void 0,!1,void 0,this),t(R0,{color:X.colors.muted,children:"Exit code 2 - show stderr to model and block tool call"},void 0,!1,void 0,this),t(R0,{color:X.colors.muted,children:"Other exit codes - show stderr to user only but continue with tool call"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q==="matcher"&&t(j0,{flexDirection:"column",children:[t(j0,{children:[t(R0,{bold:!0,children:"Matcher: "},void 0,!1,void 0,this),t(r3,{value:_,onChange:F,onSubmit:Y0,placeholder:"e.g., Read, Bash, Edit|Write (empty = all tools)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),t(j0,{marginTop:1,children:t(R0,{color:X.colors.muted,children:"Tool name pattern (supports | for multiple). Leave empty to match all."},void 0,!1,void 0,this)},void 0,!1,void 0,this),t(j0,{marginTop:1,children:t(R0,{color:X.colors.muted,children:"Enter to continue · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),(Q==="command"||Q==="confirm")&&t(j0,{marginBottom:1,children:t(R0,{children:["Matcher: ",t(R0,{bold:!0,children:_||"(all tools)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),Q==="command"&&t(j0,{flexDirection:"column",children:[t(j0,{children:t(R0,{bold:!0,children:"Command: "},void 0,!1,void 0,this)},void 0,!1,void 0,this),t(j0,{borderStyle:"single",borderColor:X.colors.border.light,paddingX:1,marginTop:1,children:t(r3,{value:H,onChange:P,onSubmit:Q0,placeholder:"Enter shell command..."},void 0,!1,void 0,this)},void 0,!1,void 0,this),t(j0,{flexDirection:"column",marginTop:1,children:[t(R0,{bold:!0,children:"Examples:"},void 0,!1,void 0,this),_U.map((d,D)=>t(R0,{color:X.colors.muted,children:["• ",d]},D,!0,void 0,this))]},void 0,!0,void 0,this),t(j0,{marginTop:1,children:t(R0,{color:X.colors.muted,children:"Enter to continue · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q==="location"&&t(j0,{flexDirection:"column",children:[t(j0,{flexDirection:"column",borderStyle:"round",borderColor:X.colors.border.light,paddingX:2,paddingY:1,marginBottom:1,children:[t(R0,{bold:!0,color:X.colors.primary,children:"Save hook configuration"},void 0,!1,void 0,this),t(R0,{children:" "},void 0,!1,void 0,this),t(R0,{children:[" ","Event: ",C.event," - ",C.description]},void 0,!0,void 0,this),t(R0,{children:[" Matcher: ",_||"(all)"]},void 0,!0,void 0,this),t(R0,{children:[" Command: ",H]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),t(R0,{bold:!0,children:"Where should this hook be saved?"},void 0,!1,void 0,this),t(j0,{flexDirection:"column",marginTop:1,children:j6.map((d,D)=>t(j0,{children:[t(R0,{color:D===q?X.colors.primary:void 0,bold:D===q,children:[D===q?"> ":" ",D+1,". ",d.name]},void 0,!0,void 0,this),t(R0,{color:X.colors.muted,children:[" ",d.description]},void 0,!0,void 0,this)]},d.location,!0,void 0,this))},void 0,!1,void 0,this),t(j0,{marginTop:1,children:t(R0,{color:X.colors.muted,children:"Enter to confirm · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q==="confirm"&&t(j0,{flexDirection:"column",children:[t(j0,{flexDirection:"column",borderStyle:"round",borderColor:X.colors.success,paddingX:2,paddingY:1,children:[t(R0,{bold:!0,children:["Saving hook to ",S.description,"..."]},void 0,!0,void 0,this),t(R0,{children:" "},void 0,!1,void 0,this),t(R0,{children:["Event: ",C.event]},void 0,!0,void 0,this),t(R0,{children:["Matcher: ",_||"(all tools)"]},void 0,!0,void 0,this),t(R0,{children:["Command: ",H]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),t(j0,{marginTop:1,children:t(R0,{color:X.colors.muted,children:L?"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),T&&t(j0,{marginTop:1,children:t(R0,{color:X.colors.error,children:T},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as N5}from"ahooks";import{Box as SU,Text as kU}from"ink";import fU from"react";import{useMemoizedFn as g6}from"ahooks";import H2 from"chalk";import{Text as CU}from"ink";import{useEffect as q5,useRef as P8}from"react";var E6={TIMEOUT_MS:100,RAPID_INPUT_THRESHOLD_MS:150,LARGE_INPUT_THRESHOLD:300,MEDIUM_SIZE_MULTI_CHUNK_THRESHOLD:200};var N2="\x1B",OU=`${N2}[200~`,NU=`${N2}[201~`,HU="[200~",WU="[201~",FU=[`${N2}[I`,`${N2}[O`,"[I","[O"],n3=`${N2}[?2004h`,t3=`${N2}[?2004l`,G9=`${N2}[?1004l`,LU=[OU,HU],wU=[NU,WU];function s3(){return{pasteBuffer:null,pasteOverflowed:!1}}function i3($,J){let Y;for(let Z of J){let X=$.indexOf(Z);if(X===-1)continue;if(!Y||X<Y.index||X===Y.index&&Z.length>Y.marker.length)Y={index:X,marker:Z}}return Y}function o3($){return FU.some((J)=>$===J)}function e3($,J){let Y=J,Z=$.pasteBuffer,X=$.pasteOverflowed,Q=Z!==null,U=[];while(Y.length>0){if(Z!==null){let K=i3(Y,wU);if(!K){if(Z.length+Y.length>U9)Z="",X=!0;else if(!X)Z+=Y;Y="";break}if(Z.length+K.index>U9)X=!0;else if(!X)Z+=Y.slice(0,K.index),U.push({kind:"paste",text:Z});Z=null,X=!1,Q=!0,Y=Y.slice(K.index+K.marker.length);continue}let G=i3(Y,LU);if(!G){if(o3(Y))Q=!0;else U.push({kind:"text",text:Y});Y="";break}let z=Y.slice(0,G.index);if(z&&!o3(z))U.push({kind:"text",text:z});Z="",X=!1,Q=!0,Y=Y.slice(G.index+G.marker.length)}if(J.length===0&&Z!==null)Q=!0;return{handled:Q,state:{pasteBuffer:Z,pasteOverflowed:X},segments:U}}function $5($){return typeof $==="string"&&/^[0-9a-f]{32}$/.test($)}function BU($){if(!$5($))throw Error("TUI composer ready nonce must be 32 lowercase hexadecimal chars");return`\x1B]99;blade-composer-ready=${$}\x07`}function AU($=process.env){let J=$.BLADE_TUI_COMPOSER_READY_NONCE;if(!$5(J))return;return BU(J)}function J5($=process.env,J=(Y)=>process.stdout.write(Y)){let Y=AU($);if(!Y)return!1;return J(Y),!0}import{execSync as s2}from"node:child_process";import{existsSync as PU,readFileSync as K9}from"node:fs";import{basename as Y5,isAbsolute as bU}from"node:path";function X5($){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 Z5(){let $=process.platform,J={darwin:"/tmp/blade_cli_latest_screenshot.png",linux:"/tmp/blade_cli_latest_screenshot.png",win32:process.env.TEMP?`${process.env.TEMP}\\blade_cli_latest_screenshot.png`:"C:\\Temp\\blade_cli_latest_screenshot.png"},Y={darwin:{checkImage:"osascript -e 'the clipboard as «class PNGf»'",saveImage:(Z)=>`osascript -e 'set png_data to (the clipboard as «class PNGf»)' -e 'set fp to open for access POSIX file "${Z}" 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:(Z)=>`rm -f "${Z}"`},linux:{checkImage:'xclip -selection clipboard -t TARGETS -o | grep -E "image/(png|jpeg|jpg|gif|webp)"',saveImage:(Z)=>`xclip -selection clipboard -t image/png -o > "${Z}" || wl-paste --type image/png > "${Z}"`,getPath:"xclip -selection clipboard -t text/plain -o",deleteFile:(Z)=>`rm -f "${Z}"`},win32:{checkImage:'powershell -Command "(Get-Clipboard -Format Image) -ne $null"',saveImage:(Z)=>`powershell -Command "$img = Get-Clipboard -Format Image; if ($img) { $img.Save('${Z.replace(/\\/g,"\\\\")}', [System.Drawing.Imaging.ImageFormat]::Png) }"`,getPath:'powershell -Command "Get-Clipboard"',deleteFile:(Z)=>`del /f "${Z}"`}};return{commands:Y[$]||Y.linux,screenshotPath:J[$]||J.linux}}function MU(){let{commands:$}=Z5();try{return s2($.getPath,{encoding:"utf-8"}).trim()}catch(J){return console.error("Failed to get clipboard path:",J),null}}function Q5($){if($.startsWith('"')&&$.endsWith('"')||$.startsWith("'")&&$.endsWith("'"))return $.slice(1,-1);return $}function U5($){if(process.platform==="win32")return $;let J="__DOUBLE_BACKSLASH__";return $.replace(/\\\\/g,J).replace(/\\(.)/g,"$1").replace(new RegExp(J,"g"),"\\")}function z9($){let J=Q5($.trim()),Y=U5(J);return/\.(png|jpe?g|gif|webp)$/i.test(Y)}function TU($){let J=Q5($.trim()),Y=U5(J);if(z9(Y))return Y;return null}async function G5($){let J=TU($);if(!J)return null;let Y;try{if(bU(J))Y=K9(J);else{let U=MU();if(U&&J===Y5(U))Y=K9(U);else return null}}catch(U){return console.error("Failed to read image file:",U),null}let Z=Y.toString("base64"),X=X5(Z),Q=Y5(J);return{path:J,base64:Z,mediaType:X,filename:Q}}async function K5(){let $=process.platform,J={darwin:"pbpaste",linux:"xclip -selection clipboard -o || wl-paste",win32:'powershell -Command "Get-Clipboard"'},Y=J[$]||J.linux;try{return s2(Y,{encoding:"utf-8"})||null}catch{return null}}async function z5(){let{commands:$,screenshotPath:J}=Z5();try{if(s2($.checkImage,{stdio:"ignore"}),s2($.saveImage(J),{stdio:"ignore"}),!PU(J))return null;let Z=K9(J).toString("base64"),X=X5(Z);return s2($.deleteFile(J),{stdio:"ignore"}),{base64:Z,mediaType:X}}catch(Y){try{s2($.deleteFile(J),{stdio:"ignore"})}catch{}return null}}import{jsxDEV as IU}from"react/jsx-dev-runtime";var RU=/\r\n/g,yU=/\r/g;function q9($){if(!$.includes("\r"))return $;return $.replace(RU,`
|
|
145
|
+
`).replace(yU,`
|
|
146
|
+
`)}function _5($,J,Y){let Z=Math.max(0,Math.min(Y,J.length)),X=J.slice(0,Z),Q=J.slice(Z);return{newValue:X+$+Q,newCursorPosition:Z+$.length}}function O5({value:$,placeholder:J="",focus:Y=!0,onChange:Z,cursorPosition:X,onChangeCursorPosition:Q,onPaste:U,onImagePaste:G,disabledKeys:z=[]}){let K=P8(s3()),O=P8($),q=P8(X),N=P8(null),_=P8(!1);q5(()=>{O.current=$,q.current=X},[$,X]),q5(()=>{if(X>$.length)Q($.length)},[$,X,Q]);let F=g6((W,b)=>{let A=O.current,C=q.current;if(O.current=W,q.current=b,W!==A)Z(W);if(b!==C)Q(b)}),H=g6((W)=>{if(!W)return;let{newValue:b,newCursorPosition:A}=_5(q9(W),O.current,q.current);F(b,A)}),P=g6(async(W)=>{let b=q9(W);if(!b)return;if(G&&z9(b))try{let C=await G5(b);if(C){let S=await G(C.base64,C.mediaType,C.filename);if(S?.prompt)H(S.prompt);return}}catch(C){console.error("Failed to process image path:",C)}if((b.length>E6.LARGE_INPUT_THRESHOLD||b.includes(`
|
|
147
|
+
`))&&U){let C=await U(b);if(C?.prompt){H(C.prompt);return}}H(b)}),T=g6((W)=>{let b=N.current;if(!b){try{let C=W();if(!C)return;let S=C.catch(()=>{return});N.current=S,S.finally(()=>{if(N.current===S)N.current=null})}catch{}return}let A=b.then(W).then(()=>{return}).catch(()=>{return});N.current=A,A.finally(()=>{if(N.current===A)N.current=null})});_0((W,b)=>{return T(()=>{let A=q9(W),C=e3(K.current,A);if(K.current=C.state,C.handled)return(async()=>{for(let o of C.segments)if(o.kind==="paste")await P(o.text);else H(o.text)})();if(z.some((o)=>b[o])||b.ctrl&&W==="c"||b.ctrl&&W==="l"||b.ctrl&&W==="t"||b.ctrl&&W==="o"||b.meta&&W==="l"||b.meta&&W==="t"||b.meta&&W==="o"||b.shift&&b.tab||A==="?"&&O.current==="")return;let M=O.current,y=q.current,B=y,V=M;if(b.leftArrow)B--;else if(b.rightArrow)B++;else if(b.backspace||b.delete){if(W===""){if(y>0)V=M.slice(0,y-1)+M.slice(y,M.length),B--}else if(y<M.length)V=M.slice(0,y)+M.slice(y+1,M.length)}else if(b.ctrl&&A==="a")B=0;else if(b.ctrl&&A==="e")B=M.length;else if(b.ctrl&&A==="k")V=M.slice(0,y);else if(b.ctrl&&A==="u")V=M.slice(y),B=0;else if(b.ctrl&&A==="w"){let a=M.slice(0,y).match(/\s*\S+\s*$/);if(a){let Y0=a[0].length;V=M.slice(0,y-Y0)+M.slice(y),B-=Y0}}else if(b.ctrl&&A==="v"){let o=process.platform==="darwin";return(async()=>{if(G){let Y0=await z5();if(Y0){let Q0=await G(Y0.base64,Y0.mediaType,"clipboard.png");if(Q0?.prompt)H(Q0.prompt);return}}if(o)return;let a=await K5();if(a)await P(a)})()}else if(b.pageUp)B=0;else if(b.pageDown)B=M.length;else if(A===`
|
|
148
|
+
`&&(b.shift||b.meta)){let{newValue:o,newCursorPosition:a}=_5(A,M,y);F(o,a);return}else if(!b.ctrl&&!b.meta){if(U&&(A.length>E6.LARGE_INPUT_THRESHOLD||A.includes(`
|
|
149
|
+
`)))return P(A);V=M.slice(0,y)+A+M.slice(y,M.length),B+=A.length}if(B<0)B=0;if(B>V.length)B=V.length;F(V,B)}),!0},{isActive:Y,priority:0,onRegistered:()=>{if(_.current)return;_.current=J5()}});let w=Y,L=$,R=J?H2.grey(J):void 0;if(w)if(R=J.length>0?H2.inverse(J[0])+H2.grey(J.slice(1)):H2.inverse(" "),$.length===0)L=H2.inverse(" ");else{L="";for(let W=0;W<$.length;W++)if(W===X&&X<$.length)L+=H2.inverse($[W]);else L+=$[W];if(X>=$.length)L+=H2.inverse(" ")}return IU(CU,{children:J?$.length>0?L:R:L},void 0,!1,void 0,this)}import{jsxDEV as _9}from"react/jsx-dev-runtime";var H5=fU.memo(({input:$,cursorPosition:J,onChange:Y,onChangeCursorPosition:Z,onAddPasteMapping:X,onAddImagePasteMapping:Q,disabled:U=!1})=>{let z=s0()==="main-input"&&!U,K=$.trimStart().startsWith("!"),O=N5((N)=>{let _=N.split(`
|
|
150
|
+
`).length,F=N.length,H=500,P=10;if(F>500||_>10){let T=X(N),w=N.slice(0,30).replace(/\n/g," "),L=`${F} chars, ${_} lines: ${w}...`;return{prompt:`${w6(T)}${L}${M4()}`}}return{}}),q=N5(async(N,_,F)=>{try{let H=Q(N,_);return{prompt:`${w6(H)}[Image #${H}]${M4()}`}}catch(H){return console.error("[Image Paste] Failed to process image:",H),{prompt:`[Image paste failed: ${H instanceof Error?H.message:"Unknown error"}] `}}});return _9(SU,{flexDirection:"row",width:"100%",paddingX:2,paddingY:0,flexShrink:0,flexGrow:0,overflow:"hidden",borderStyle:"round",borderColor:K?"yellow":"gray",children:[_9(kU,{color:K?"yellow":"blue",bold:!0,children:K?"$ ":"> "},void 0,!1,void 0,this),_9(O5,{value:$,cursorPosition:J,onChange:Y,onChangeCursorPosition:Z,onPaste:O,onImagePaste:q,placeholder:" 输入命令...",focus:z,disabledKeys:["upArrow","downArrow","tab","return","escape"]},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as e2,Text as D$}from"ink";import xU,{useEffect as A5,useState as P5}from"react";import{useEffect as EU,useRef as gU,useState as mU}from"react";import{useEffect as vU,useRef as VU,useState as jU}from"react";var b8={loading:["思考中","构思中","推理中","琢磨中","分析中","斟酌中","酝酿中","推敲中","揣摩中","审视中","处理中","编排中","打磨中","编织中","拼装中","调配中","组装中","搭建中","铸造中","雕琢中","搜寻中","梳理中","排查中","勘探中","钻研中","翻阅中","遍历中","扫描中","检索中","追踪中","计算中","编译中","解析中","运算中","推演中","迭代中","收敛中","演绎中","归纳中","求解中","生成中","编写中","起草中","绘制中","勾勒中","渲染中","合成中","调和中","编曲中","烹制中","施工中","酿造中","发酵中","煎熬中","折腾中","捣鼓中","鼓捣中","腾挪中","筹备中","蓄力中"],tips:["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 临时切换模型"]};var hU=15000,W5="等待用户确认...";function F5(){if(Math.random()<0.25){let Y=Math.floor(Math.random()*b8.tips.length);return b8.tips[Y]}let J=Math.floor(Math.random()*b8.loading.length);return b8.loading[J]}function L5($,J,Y=!1){let[Z,X]=jU(""),Q=VU(Y);return Q.current=Y,vU(()=>{if(J){X(W5);return}if(!$){X("");return}X((G)=>G===""||G===W5?F5():G);let U=setInterval(()=>{if(!Q.current)X(F5())},hU);return()=>{clearInterval(U)}},[$,J]),Z}function w5($,J=!1,Y=!1){let[Z,X]=mU(0),Q=gU(null),U=L5($,J,Y);return EU(()=>{if(!$){X(0),Q.current=null;return}if(Y)return;if(Q.current===null)Q.current=Date.now();let G=setInterval(()=>{if(Q.current!==null){let z=Math.floor((Date.now()-Q.current)/1000);X(z)}},1000);return()=>{clearInterval(G)}},[$,Y]),{currentPhrase:U,elapsedTime:Z}}function pU($){let J=Math.max(0,Math.floor($/1000));if(J<60)return`${J}s`;let Y=Math.floor(J/60),Z=J%60;if(Y<60)return`${Y}m ${Z}s`;return`${Math.floor(Y/60)}h ${Y%60}m ${Z}s`}function B5($,J=Date.now()){let Y=$?.snapshot;if(!Y)return null;let Z=Y.activeTools.length+Y.activeToolOverflow,X=Y.phase==="starting"?"正在启动任务":Y.phase==="thinking"?"正在思考":Y.phase==="responding"?"正在生成回复":Y.phase==="compacting"?"正在压缩上下文":Y.phase==="continuing"?"正在推进下一步":`正在执行 ${Z} 个工具`,Q=Y.activeTools.slice(0,2).map((K)=>K.progress!==void 0&&K.total!==void 0?`${K.name} ${K.progress}/${K.total}`:K.name),U=Math.max(0,Y.activeTools.length-Q.length+Y.activeToolOverflow);if(U>0)Q.push(`+${U}`);let G=[...Q,Y.toolCallsStarted>0?`工具 ${Y.toolCallsCompleted}/${Y.toolCallsStarted}`:void 0,Y.turn>0?`回合 ${Y.turn}${Y.maxTurns===null?"":`/${Y.maxTurns}`}`:void 0].filter((K)=>K!==void 0),z=pU(J-Y.startedAt);return{primary:X,secondary:G.join(" · "),compact:Y.phase==="executing_tools"?`执行工具 · ${Z} 个 · ${z}`:`${X} · ${z}`,elapsed:z}}import{jsxDEV as z$,Fragment as uU}from"react/jsx-dev-runtime";var O9=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"],cU=80;function b5($){if($<60)return`${$}s`;let J=Math.floor($/60),Y=$%60;return`${J}m ${Y}s`}var M5=xU.memo(({message:$,paused:J=!1})=>{let Y=E2(),Z=E8(),X=j8(),Q=l9(),U=r9(),G=Y||!Z,[z,K]=P5(0),[O,q]=P5(Date.now()),N=f0(),F=u2()>=cU,{currentPhrase:H,elapsedTime:P}=w5(G,!1,J);if(A5(()=>{if(!G||J){K(0);return}let W=setInterval(()=>{K((b)=>(b+1)%O9.length)},150);return()=>clearInterval(W)},[G,J]),A5(()=>{if(!X?.snapshot?.nextActionAt&&!Q?.snapshot||J)return;q(Date.now());let W=setInterval(()=>q(Date.now()),1000);return()=>clearInterval(W)},[J,X?.snapshot?.nextActionAt,Q?.snapshot]),!G)return null;let T=S6(X,O),w=B5(Q,O),R=(U?.phase==="detected"?`检测到 ${U.toolName} 连续 ${U.runLength} 次无进展,正在要求 Agent 切换策略`:U?.phase==="halted"?`已停止 ${U.toolName} 空转循环`:null)||T?.primary||w?.primary||$||H||"正在思考中...";if(F)return z$(e2,{paddingX:2,paddingBottom:1,flexDirection:"row",gap:1,children:[z$(D$,{color:N.colors.warning,bold:!0,children:O9[z]},void 0,!1,void 0,this),z$(D$,{color:N.colors.text.primary,children:R},void 0,!1,void 0,this),T?.secondary&&z$(D$,{color:N.colors.info,children:T.secondary},void 0,!1,void 0,this),!T?.secondary&&w?.secondary&&z$(D$,{color:N.colors.info,children:w.secondary},void 0,!1,void 0,this),(w||P>0)&&z$(uU,{children:[z$(D$,{color:N.colors.muted,children:"|"},void 0,!1,void 0,this),z$(D$,{color:N.colors.info,children:["已用时:"," ",w?.elapsed??b5(P)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),z$(D$,{color:N.colors.muted,children:"|"},void 0,!1,void 0,this),z$(D$,{color:N.colors.secondary,children:"Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return z$(e2,{paddingX:2,paddingBottom:1,flexDirection:"column",children:[z$(e2,{flexDirection:"row",gap:1,children:[z$(D$,{color:N.colors.warning,bold:!0,children:O9[z]},void 0,!1,void 0,this),z$(D$,{color:N.colors.text.primary,children:R},void 0,!1,void 0,this)]},void 0,!0,void 0,this),T?.secondary&&z$(e2,{marginLeft:2,children:z$(D$,{color:N.colors.info,children:T.secondary},void 0,!1,void 0,this)},void 0,!1,void 0,this),!T?.secondary&&w?.secondary&&z$(e2,{marginLeft:2,children:z$(D$,{color:N.colors.info,children:w.secondary},void 0,!1,void 0,this)},void 0,!1,void 0,this),(w||P>0)&&z$(e2,{marginLeft:2,flexDirection:"row",gap:1,children:[z$(D$,{color:N.colors.info,children:["已用时: ",w?.elapsed??b5(P)]},void 0,!0,void 0,this),z$(D$,{color:N.colors.muted,children:"|"},void 0,!1,void 0,this),z$(D$,{color:N.colors.secondary,children:"Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});import{Box as x6,Text as J$,useStdout as dU}from"ink";import lU from"ink-text-input";import rU,{useCallback as m6,useEffect as aU,useMemo as iU,useState as W2}from"react";import{jsxDEV as D0}from"react/jsx-dev-runtime";var y5=rU.memo(({details:$,onComplete:J})=>{let{stdout:Y}=dU(),Z=Y.columns||80,X=s0()==="confirmation-prompt",Q=e0(!1),U=$.fields??[],[G,z]=W2("field"),[K,O]=W2(0),[q,N]=W2(()=>T5($)),[_,F]=W2(""),[H,P]=W2(0),[T,w]=W2([]),[L,R]=W2(),W=U[K],b=iU(()=>oU(W),[W]);aU(()=>{if(!W)return;let y=q[W.name];F(typeof y==="string"||typeof y==="number"?String(y):""),w(Array.isArray(y)?[...y]:[]);let B=b.findIndex((V)=>V.value===String(y));P(B>=0?B:0),R(void 0)},[q,W,b]);let A=m6((y)=>{if(N(y),K<U.length-1){O((B)=>B+1);return}z("review")},[K,U.length]),C=m6((y)=>{if(!W)return;let B={...q};if(y===void 0)delete B[W.name];else B[W.name]=y;A(B)},[q,W,A]),S=m6((y)=>{if(!W)return;try{C(C5(W,y))}catch(B){R(B instanceof Error?B.message:String(B))}},[W,C]),M=m6(()=>{try{let y=R5($,{action:"accept",content:q});J({action:y.action,...y.content?{content:y.content}:{}})}catch(y){R(y instanceof Error?y.message:String(y))}},[q,$,J]);if(_0((y,B)=>{if(B.ctrl&&y==="c"||B.meta&&y==="c"){Q();return}if(B.escape){J({action:"cancel"});return}if($.mode==="url"){if(y.toLowerCase()==="y")J({action:"accept"},!0);else if(y.toLowerCase()==="n")J({action:"decline"});return}if(G==="review"){if(y.toLowerCase()==="y"||B.return)M();else if(y.toLowerCase()==="e")O(0),z("field");else if(y.toLowerCase()==="d")J({action:"decline"});return}if(!W){if(B.return)M();return}if(N9(W))return;if(y.toLowerCase()==="d"){J({action:"decline"});return}if(B.upArrow){P((V)=>V>0?V-1:Math.max(b.length-1,0));return}if(B.downArrow||B.tab){P((V)=>V<b.length-1?V+1:0);return}if(y===" "&&W.type==="multi-select"){let V=b[H];if(V)w((o)=>o.includes(V.value)?o.filter((a)=>a!==V.value):[...o,V.value]);return}if(B.return)if(W.type==="multi-select")C(T);else{let V=b[H];if(V)C(V.typedValue)}},{isActive:X}),$.mode==="url")return D0(p6,{width:Z,color:"yellow",children:[D0(J$,{bold:!0,color:"yellow",children:"MCP external authorization"},void 0,!1,void 0,this),D0(J$,{children:$.message},void 0,!1,void 0,this),D0(J$,{color:"yellow",children:['Only continue if you trust MCP server "',$.serverName,'".']},void 0,!0,void 0,this),D0(J$,{children:["Domain: ",D0(J$,{color:"cyan",children:$.domain},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D0(J$,{wrap:"wrap",children:["URL: ",D0(J$,{color:"cyan",children:$.url},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D0(J$,{color:"gray",children:"[Y] Open URL · [N] Decline · Esc Cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(G==="review")return D0(p6,{width:Z,color:"green",children:[D0(J$,{bold:!0,color:"green",children:"Review MCP form response"},void 0,!1,void 0,this),D0(J$,{children:$.message},void 0,!1,void 0,this),U.map((y)=>D0(J$,{children:[y.title,": ",tU(q[y.name])]},y.name,!0,void 0,this)),L&&D0(J$,{color:"red",children:L},void 0,!1,void 0,this),D0(J$,{color:"gray",children:"[Y] Submit · [E] Edit · [D] Decline · Esc Cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(!W)return D0(p6,{width:Z,color:"cyan",children:[D0(J$,{children:$.message},void 0,!1,void 0,this),D0(J$,{color:"gray",children:"This form has no fields."},void 0,!1,void 0,this),D0(J$,{color:"gray",children:"Press Enter to submit · [D] Decline · Esc Cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return D0(p6,{width:Z,color:"cyan",children:[D0(J$,{bold:!0,color:"cyan",children:["MCP input requested by ",$.serverName]},void 0,!0,void 0,this),D0(J$,{children:$.message},void 0,!1,void 0,this),D0(x6,{flexDirection:"column",marginTop:1,children:[D0(J$,{bold:!0,children:[W.title,W.required?" *":""]},void 0,!0,void 0,this),W.description&&D0(J$,{color:"gray",children:W.description},void 0,!1,void 0,this),D0(J$,{color:"gray",children:nU(W)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N9(W)?D0(x6,{children:[D0(J$,{color:"cyan",children:"> "},void 0,!1,void 0,this),D0(lU,{value:_,onChange:F,onSubmit:S,focus:X,placeholder:W.defaultValue===void 0?W.required?"Required":"Optional":String(W.defaultValue)},void 0,!1,void 0,this)]},void 0,!0,void 0,this):D0(x6,{flexDirection:"column",children:b.map((y,B)=>{let V=W.type==="multi-select"&&T.includes(y.value);return D0(J$,{color:H===B?"yellow":void 0,children:[H===B?"> ":" ",W.type==="multi-select"?V?"(*) ":"( ) ":"",y.label]},y.value,!0,void 0,this)})},void 0,!1,void 0,this),L&&D0(J$,{color:"red",children:L},void 0,!1,void 0,this),D0(J$,{color:"gray",children:[N9(W)?"Enter to continue":W.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),D0(J$,{color:"gray",children:["Field ",K+1," of ",U.length]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});function p6({children:$,width:J,color:Y}){return D0(x6,{flexDirection:"column",gap:1,borderStyle:"round",borderColor:Y,padding:1,width:Math.min(J-4,88),children:$},void 0,!1,void 0,this)}function N9($){return $.type==="string"||$.type==="number"||$.type==="integer"}function oU($){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 nU($){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 tU($){if($===void 0)return"(omitted)";if(Array.isArray($))return $.join(", ")||"(none)";return String($)}import u6 from"ansi-escapes";import{Box as F2,Static as GG,useStdout as KG}from"ink";import zG,{useEffect as D1,useMemo as B9,useRef as i1,useState as A9}from"react";import{Box as sU,Text as I5}from"ink";import eU from"react";import{jsxDEV as H9}from"react/jsx-dev-runtime";var W9=eU.memo(({collapsedCount:$})=>{let J=f0();if($<=0)return null;let Y=J.colors.text.muted;return H9(sU,{flexDirection:"row",marginBottom:1,children:[H9(I5,{color:Y,children:[">"," ",$," 条历史消息"]},void 0,!0,void 0,this),H9(I5,{color:Y,children:" [Ctrl+O 浏览]"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});W9.displayName="CollapsedHistorySummary";import{Box as M8,Text as T8}from"ink";import $G from"ink-big-text";import JG from"ink-gradient";import YG from"react";import{jsxDEV as t$}from"react/jsx-dev-runtime";var k5=YG.memo(()=>{return t$(M8,{flexDirection:"column",paddingX:2,paddingTop:1,paddingBottom:1,children:[t$(M8,{flexDirection:"column",children:t$(JG,{name:"pastel",children:t$($G,{text:"BLADE",font:"block"},void 0,!1,void 0,this)},void 0,!1,void 0,this)},void 0,!1,void 0,this),t$(M8,{marginBottom:1,children:t$(T8,{color:"white",dimColor:!0,children:S5()},void 0,!1,void 0,this)},void 0,!1,void 0,this),t$(M8,{flexDirection:"column",marginBottom:1,children:[t$(M8,{marginBottom:1,children:t$(T8,{color:"white",bold:!0,children:"使用指南:"},void 0,!1,void 0,this)},void 0,!1,void 0,this),t$(T8,{color:"white",children:"1. 输入问题、编辑文件或运行命令"},void 0,!1,void 0,this),t$(T8,{color:"white",children:"2. 使用 /init 创建项目配置文件"},void 0,!1,void 0,this),t$(T8,{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 c6,Text as F9}from"ink";import f5 from"react";import{jsxDEV as a1}from"react/jsx-dev-runtime";var D5=f5.memo(({tasks:$,visible:J=!0,compact:Y=!1})=>{let{colors:Z}=f0();if(!J||$.length===0)return null;let X={total:$.length,completed:$.filter((Q)=>Q.status==="completed").length,inProgress:$.filter((Q)=>Q.status==="in_progress").length};return a1(c6,{flexDirection:"column",borderStyle:"single",borderColor:Z.border.light,paddingX:1,paddingY:Y?0:1,marginBottom:1,children:[a1(c6,{marginBottom:Y?0:1,children:[a1(F9,{dimColor:!0,children:"Tasks "},void 0,!1,void 0,this),a1(F9,{color:Z.text.muted,children:[X.completed,"/",X.total]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),a1(c6,{flexDirection:"column",children:$.map((Q,U)=>a1(XG,{task:Q,compact:Y},Q.id||U,!1,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}),XG=f5.memo(({task:$,compact:J})=>{let Y,Z=!1,X;switch($.status){case"completed":Y="[OK]",Z=!0,X=$.subject;break;case"in_progress":Y=">",Z=!1,X=$.activeForm||$.subject;break;case"pending":default:Y="-",Z=!0,X=$.subject;break}return a1(c6,{paddingY:J?0:0,children:a1(F9,{dimColor:Z,children:[Y," ",X]},void 0,!0,void 0,this)},void 0,!1,void 0,this)});import{Box as L9,Text as $8}from"ink";import ZG,{useMemo as v5}from"react";import{jsxDEV as f1}from"react/jsx-dev-runtime";function QG($,J=60){if(!$)return"";let Y=$.split(`
|
|
151
|
+
`)[0]||"";if(Y.length<=J)return Y;return`${Y.slice(0,J)}...`}function UG($){if(!$)return 0;return $.split(`
|
|
152
|
+
`).length}var w9=ZG.memo(({content:$,isStreaming:J=!1,isExpanded:Y})=>{let Z=f0(),X=v5(()=>UG($),[$]),Q=v5(()=>QG($),[$]),U=Z.colors.info,G=Z.colors.muted;return f1(L9,{flexDirection:"column",marginBottom:1,children:[f1(L9,{flexDirection:"row",children:[f1($8,{color:U,children:Y?"v":">"},void 0,!1,void 0,this),f1($8,{children:" "},void 0,!1,void 0,this),f1($8,{color:G,children:["Thinking",J?"...":` (${X} lines)`]},void 0,!0,void 0,this),!Y&&!J&&Q&&f1($8,{color:G,children:[" - ",Q]},void 0,!0,void 0,this),f1($8,{color:G,dimColor:!0,children:[" ","[Ctrl+T]"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Y&&$&&f1(L9,{marginLeft:2,marginTop:1,borderStyle:"round",borderColor:"gray",paddingX:1,paddingY:0,children:f1($8,{color:G,children:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});w9.displayName="ThinkingBlock";import{jsxDEV as v$}from"react/jsx-dev-runtime";var C8=($)=>$.role==="tool"||p2($),qG=({active:$=!0})=>{let J=V8(),Y=a8(),Z=i8(),X=NJ(),Q=E2(),U=t9(),G=ZJ(),z=r8(),K=OJ(),O=x9(),q=WJ(),N=HJ(),{width:_,height:F}=l1(),{stdout:H}=KG(),P=u1(),[T,w]=A9(null),[L,R]=A9([]),[W,b]=A9(new Set),A=i1(N),C=i1(null),S=i1(0),M=i1(0),y=i1(new Set),B=i1(new Set),V=i1([]),o=i1(null);D1(()=>{if(A.current!==N){if(A.current=N,!$)return;if(X1())i$();if(H)H.write(u6.clearTerminal);P.incrementClearCount()}},[$,N,H,P]);let a=J,Y0=X;D1(()=>{if(!X||Q){o.current=null;return}if(o.current===X)return;if(o.current=X,X1())i$();if($&&H)H.write(u6.eraseScreen+u6.cursorTo(0,0));y.current=new Set,B.current=new Set(a.filter(C8).map((h)=>h.id)),C.current=null,S.current=0,M.current=0,V.current=[],R([]),b(new Set),P.incrementClearCount(),P.clearFinalizingStreamingMessageId()},[X,Q,H,P,a,$]);let Q0=Y??X;D1(()=>{if($&&X1())i$();C.current=null,S.current=0,M.current=0,y.current=new Set,B.current=new Set(a.filter(C8).map((h)=>h.id)),V.current=[],R([]),b(new Set)},[O]),D1(()=>{if(!Q0)return;if(C.current===Q0)return;C.current=Q0,S.current=0,M.current=0,B.current=new Set(a.filter(C8).map((h)=>h.id)),V.current=[]},[Q0,O]),D1(()=>{if(!Q0)return;let h=P9(Q0);if(!h||h.length<=S.current)return;let x=h.slice(S.current);S.current=h.length;let l=x,W0=V.current;if(W0.length>0)if(l.some((f)=>f.type!=="empty"))l=[...W0,...l],V.current=[];else{V.current=[...W0,...l];return}let L0=l.length;while(L0>0&&l[L0-1].type==="empty")L0-=1;if(L0!==l.length)V.current=l.slice(L0),l=l.slice(0,L0);if(l.length===0)return;let T0=M.current;M.current+=1;let I=T0>0;if(X1())i$();b((f)=>{if(!Q0||f.has(Q0))return f;let p=new Set(f);return p.add(Q0),p}),R((f)=>[...f,v$(F2,{flexDirection:"column",children:v$(S1,{content:"",role:"assistant",terminalWidth:_,isPending:!1,hidePrefix:I,noMargin:!0,blocksOverride:l,renderCodeBlocksAsPlainText:!1},void 0,!1,void 0,this)},`streaming-${Q0}-${T0}`,!1,void 0,this)])},[Q0,Z.version,_,O,$]),D1(()=>{if(!Q0)return;let h=B.current,x=a.filter((l)=>C8(l)&&!h.has(l.id)&&!y.current.has(l.id));if(x.length===0)return;if($&&X1())i$();for(let l of x)y.current.add(l.id);R((l)=>[...l,...x.map((W0)=>v$(F2,{flexDirection:"column",children:v$(S1,{content:W0.content,role:W0.role,terminalWidth:_,metadata:W0.metadata,isPending:!1,messageId:W0.id},void 0,!1,void 0,this)},`streaming-tool-${W0.id}`,!1,void 0,this))])},[$,Q0,a,_]),D1(()=>{if(!$){if(X1())i$();return}if(!Q0){if(X1())i$();return}if(!X1())Q3(_,F);else U3(_,F);let h=V5(Q0);if(!h||h.lines.length===0)return;let l=Math.max(1,F-8),W0=Math.max(0,h.lines.length-l),L0=h.lines.slice(-l),T0=(P9(Q0)?.length??0)>0;G3(L0,W0,h.mode,T0)},[Q0,Z.version,F,_,$]),D1(()=>{if(!Q0&&X1())i$()},[Q0]),D1(()=>{if(T===null&&a.length>q){if(w(a.length),$&&X1())i$();if($&&H)H.write(u6.clearTerminal);P.incrementClearCount()}},[a.length,q,T,H,P,$]);let N0=B9(()=>{return U.some((h)=>h.status==="pending"||h.status==="in_progress")},[U]),d=N?0:T??0,D=d,v=B9(()=>{let h=[];if(h.push(v$(k5,{},"header",!1,void 0,this)),D>0)h.push(v$(W9,{collapsedCount:D},"collapsed-summary",!1,void 0,this));for(let x=d;x<a.length;x++){let l=a[x];if(Y0&&l.id===Y0)continue;if(C8(l)&&(y.current.has(l.id)||Q0&&!B.current.has(l.id)))continue;if(l.role==="assistant"&&W.has(l.id))continue;h.push(v$(F2,{flexDirection:"column",children:v$(S1,{content:l.content,role:l.role,terminalWidth:_,metadata:l.metadata,isPending:!1,messageId:l.id},void 0,!1,void 0,this)},l.id,!1,void 0,this))}return h},[a,d,D,_,Y0,W,Q0]),K0=B9(()=>L.length>0?[...v,...L]:v,[v,L]);return v$(F2,{flexDirection:"column",paddingX:2,children:v$(F2,{flexDirection:"column",children:[v$(GG,{items:K0,children:(h)=>h},O,!1,void 0,this),z&&v$(F2,{marginBottom:1,children:v$(w9,{content:z,isStreaming:Q,isExpanded:K},void 0,!1,void 0,this)},void 0,!1,void 0,this),G&&N0&&v$(F2,{marginTop:1,children:v$(D5,{tasks:U,visible:!0,compact:!1},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this)},j5=zG.memo(qG);import{useMemoizedFn as d6,useMount as _G}from"ahooks";import{Box as s$,Text as v0,useFocus as OG,useFocusManager as NG}from"ink";import HG from"ink-select-input";import{memo as WG,useMemo as FG,useState as l6}from"react";import{jsxDEV as w0,Fragment as BG}from"react/jsx-dev-runtime";var LG=({isSelected:$})=>w0(s$,{marginRight:1,children:w0(v0,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),wG=({isSelected:$,label:J})=>w0(v0,{bold:$,color:$?"yellow":void 0,children:J},void 0,!1,void 0,this),h5=WG(({onClose:$,onEdit:J})=>{let Y=QJ(),Z=m8()??"",{isFocused:X}=OG({id:"model-selector"}),Q=NG(),[U,G]=l6(""),[z,K]=l6(!1),[O,q]=l6(null),N=e0(!1),[_]=l6(()=>{let A=process.stdout?.columns||80;return Math.max(20,A-8)});_G(()=>{if(Q?.focus("model-selector"),Y.length>0)G(Y[0].id)}),_0((A,C)=>{if(z)return;if(C.ctrl&&A==="c"||C.meta&&A==="c"){N();return}if(C.escape){$();return}if(!X)return;if(A==="d"||A==="D"){H();return}if((A==="e"||A==="E")&&J)P()},{isActive:!0});let F=d6(async(A)=>{if(z)return;let C=A.value;if(C===Z){$();return}K(!0),q(null);try{await K$().setCurrentModel(C),$()}catch(S){q(S.message),K(!1)}}),H=d6(async()=>{if(z||U===Z)return;K(!0),q(null);try{if(await K$().removeModel(U),Y.length<=1)$()}catch(A){q(A.message)}finally{K(!1)}}),P=d6(()=>{if(z||!J)return;let A=Y.find((C)=>C.id===U);if(!A)return;J(A)}),T=d6((A)=>{G(A.value)}),w=FG(()=>{return Y.find((A)=>A.id===U)},[Y,U]),L=w?r6()?.modelProviders[w.provider]:void 0,R=Y.map((A)=>{let C=A.id===Z?" (当前)":"";return{label:b9(A)+C,value:A.id}}),W=U===Z;return w0(s$,{flexDirection:"column",borderStyle:"round",borderColor:"gray",padding:1,width:"100%",children:[w0(s$,{flexDirection:"row",justifyContent:"space-between",marginBottom:1,children:[w0(v0,{bold:!0,color:"cyan",children:"模型管理"},void 0,!1,void 0,this),w0(v0,{dimColor:!0,children:[z?"处理中...":W?"Enter=关闭 • E=编辑 • Esc=取消":"Enter=切换 • D=删除 • E=编辑 • Esc=取消"," • Ctrl+C=退出"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),w0(s$,{flexDirection:"row",children:[w0(s$,{flexDirection:"column",flexGrow:2,marginRight:2,borderStyle:"single",borderColor:"gray",padding:1,children:[w0(v0,{dimColor:!0,children:["已配置模型 (",Y.length,")"]},void 0,!0,void 0,this),w0(s$,{marginTop:1,children:w0(HG,{items:R,onSelect:F,onHighlight:T,indicatorComponent:LG,itemComponent:wG},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),w0(s$,{flexDirection:"column",flexGrow:3,borderStyle:"single",borderColor:"gray",padding:1,children:[w0(v0,{dimColor:!0,children:"模型详情"},void 0,!1,void 0,this),w0(s$,{marginY:1,children:w0(v0,{color:W?"green":"yellow",children:W?"* 当前使用":"* 可切换"},void 0,!1,void 0,this)},void 0,!1,void 0,this),w?w0(s$,{flexDirection:"column",children:[w0(v0,{children:[w0(v0,{dimColor:!0,children:"名称: "},void 0,!1,void 0,this),w0(v0,{bold:!0,color:"cyan",children:b9(w)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),w0(v0,{children:[w0(v0,{dimColor:!0,children:"Provider: "},void 0,!1,void 0,this),w0(v0,{bold:!0,children:L?.name??w.provider},void 0,!1,void 0,this)]},void 0,!0,void 0,this),L&&w0(BG,{children:[w0(v0,{children:[w0(v0,{dimColor:!0,children:"Channel ID: "},void 0,!1,void 0,this),w0(v0,{children:w.provider},void 0,!1,void 0,this)]},void 0,!0,void 0,this),w0(v0,{children:[w0(v0,{dimColor:!0,children:"Wire API: "},void 0,!1,void 0,this),w0(v0,{children:L.wireApi},void 0,!1,void 0,this)]},void 0,!0,void 0,this),w0(v0,{children:[w0(v0,{dimColor:!0,children:"Endpoint: "},void 0,!1,void 0,this),w0(v0,{color:"blueBright",children:L.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),w0(v0,{children:[w0(v0,{dimColor:!0,children:"Model: "},void 0,!1,void 0,this),w0(v0,{bold:!0,children:w.model},void 0,!1,void 0,this)]},void 0,!0,void 0,this),w.overrides?.baseUrl&&w0(v0,{children:[w0(v0,{dimColor:!0,children:"Base URL override: "},void 0,!1,void 0,this),w0(v0,{color:"blueBright",children:w.overrides.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this),w0(v0,{children:[w0(v0,{dimColor:!0,children:"Context Window: "},void 0,!1,void 0,this),w0(v0,{children:C1().resolveConfig(w).contextWindow},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this):w0(v0,{dimColor:!0,children:"请选择一个模型查看详情"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),O&&w0(s$,{marginTop:1,children:w0(v0,{color:"red",children:O},void 0,!1,void 0,this)},void 0,!1,void 0,this),w0(s$,{justifyContent:"center",marginTop:1,children:w0(v0,{dimColor:!0,children:"─".repeat(_)},void 0,!1,void 0,this)},void 0,!1,void 0,this),w0(s$,{justifyContent:"center",children:w0(v0,{dimColor:!0,children:"提示:D=删除 * E=编辑 * Up/Down=移动 * Enter/ESC=确认"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{useMemoizedFn as M9}from"ahooks";import{Box as hG,Text as T9}from"ink";import{useState as B2}from"react";import{Box as L2,Text as v1}from"ink";import AG from"ink-text-input";import{jsxDEV as A$}from"react/jsx-dev-runtime";var E5=({provider:$,value:J,onChange:Y,onSubmit:Z,onCancel:X,error:Q})=>{return _0((U,G)=>{if(G.escape)X()}),A$(L2,{flexDirection:"column",children:[A$(L2,{marginBottom:1,children:A$(v1,{bold:!0,color:"blue",children:"Step 2: 输入 API Key"},void 0,!1,void 0,this)},void 0,!1,void 0,this),A$(L2,{marginBottom:1,children:A$(v1,{children:["Provider: ",A$(v1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),A$(L2,{marginBottom:1,children:A$(v1,{dimColor:!0,children:"API 密钥将存储在 ~/.blade/auth.json(权限 600),不会写入模型配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),A$(L2,{children:[A$(v1,{bold:!0,color:"cyan",children:[">"," "]},void 0,!0,void 0,this),A$(AG,{value:J,onChange:Y,onSubmit:Z,placeholder:"sk-...",mask:"*"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q&&A$(L2,{marginTop:1,children:A$(v1,{color:"red",children:Q},void 0,!1,void 0,this)},void 0,!1,void 0,this),A$(L2,{marginTop:1,children:A$(v1,{dimColor:!0,children:["输入完成后按 ",A$(v1,{bold:!0,children:"Enter"},void 0,!1,void 0,this),",",A$(v1,{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 a6,Text as o1}from"ink";import PG from"ink-text-input";import{useState as i6}from"react";import{jsxDEV as x$}from"react/jsx-dev-runtime";var o6=["id","name","baseUrl","model"];function g5($){switch($){case"id":return"Channel ID";case"name":return"Channel name";case"baseUrl":return"Base URL";case"model":return"Model ID"}}function bG($,J,Y){switch($){case"id":return"team-gateway";case"name":return Y||"Team Gateway";case"baseUrl":return J==="anthropic-messages"?"https://gateway.example.com":"https://gateway.example.com/v1";case"model":return J==="anthropic-messages"?"claude-opus-4-8":"vendor-model-2026"}}function MG($,J){let Y=$.id.trim(),Z={name:$.name.trim()||Y,baseUrl:$.baseUrl.trim(),wireApi:J},X=p5(Y,Z);if(!$.model.trim())X.push("Model ID must not be empty");if(X.length>0)throw Error(X[0]);return{provider:Y,model:$.model.trim(),displayName:$.model.trim(),modelProvider:Z}}var x5=({wireApi:$,initialConfig:J,onSubmit:Y,onCancel:Z})=>{let X={id:J?.provider??"",name:J?.modelProvider?.name??"",baseUrl:J?.modelProvider?.baseUrl??"",model:J?.model??""},[Q,U]=i6(J?3:0),[G,z]=i6(J?.model??""),[K,O]=i6(X),[q,N]=i6(),_=o6[Q];_0((H,P)=>{if(!P.escape)return;if(N(void 0),Q===0){Z();return}let T=Q-1,w=o6[T];U(T),z(K[w])});let F=(H)=>{let P=H.trim();if(_==="id"&&!m5.test(P)){N("Channel ID 必须以小写字母开头,且仅包含小写字母、数字、.、_ 或 -");return}if(_==="baseUrl")try{let w=new URL(P);if(!["http:","https:"].includes(w.protocol))throw Error()}catch{N("Base URL 必须是绝对 HTTP(S) URL");return}if(_==="model"&&!P){N("Model ID 不能为空");return}let T={...K,[_]:_==="name"&&!P?K.id:P};if(O(T),N(void 0),Q===o6.length-1){try{Y(MG(T,$))}catch(w){N(w instanceof Error?w.message:"渠道配置无效")}return}U(Q+1),z("")};return x$(a6,{flexDirection:"column",children:[x$(a6,{marginBottom:1,children:x$(o1,{bold:!0,color:"blue",children:"配置自定义 Provider 渠道"},void 0,!1,void 0,this)},void 0,!1,void 0,this),x$(o1,{dimColor:!0,children:["Protocol:"," ",$==="anthropic-messages"?"Anthropic Messages":"OpenAI Chat Completions"]},void 0,!0,void 0,this),o6.slice(0,Q).map((H)=>x$(o1,{children:[g5(H),": ",x$(o1,{color:"cyan",children:K[H]},void 0,!1,void 0,this)]},H,!0,void 0,this)),x$(a6,{marginTop:1,children:[x$(o1,{bold:!0,children:[g5(_),": "]},void 0,!0,void 0,this),x$(PG,{value:G,onChange:(H)=>{z(H),N(void 0)},onSubmit:F,placeholder:bG(_,$,K.id)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),_==="name"&&x$(o1,{dimColor:!0,children:"留空使用 Channel ID"},void 0,!1,void 0,this),q&&x$(o1,{color:"red",children:q},void 0,!1,void 0,this),x$(a6,{marginTop:1,children:x$(o1,{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 d5,useState as J8}from"react";var l5=()=>{let[$,J]=J8([]),[Y,Z]=J8(!0),[X,Q]=J8(null);return d5(()=>{let U=!1;return(async()=>{try{let z=await c5();if(!U)J(z)}catch(z){if(!U)Q(z instanceof Error?z.message:"加载 Provider 列表失败")}finally{if(!U)Z(!1)}})(),()=>{U=!0}},[]),{providers:$,isLoading:Y,error:X}},r5=($)=>{let[J,Y]=J8([]),[Z,X]=J8(!1),[Q,U]=J8(null);return d5(()=>{if(!$){Y([]),X(!1),U(null);return}let G=!1;return Y([]),X(!0),U(null),(async()=>{try{let K=await u5($);if(!G)Y(K)}catch(K){if(!G)U(K instanceof Error?K.message:"加载模型列表失败")}finally{if(!G)X(!1)}})(),()=>{G=!0}},[$]),{models:J,isLoading:Z,error:Q}};import{Box as V1,Text as G1}from"ink";import TG from"ink-select-input";import CG from"ink-text-input";import{useMemo as a5,useState as RG}from"react";import{jsxDEV as Q$,Fragment as kG}from"react/jsx-dev-runtime";var yG=({isSelected:$})=>Q$(V1,{marginRight:1,children:Q$(G1,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),IG=($)=>{let J=[$.name];if($.contextWindow){let Y=$.contextWindow>=1e6?`${($.contextWindow/1e6).toFixed(1)}M`:$.contextWindow>=1000?`${Math.round($.contextWindow/1000)}K`:`${$.contextWindow}`;J.push(`[${Y} ctx]`)}if($.reasoning)J.push("[reasoning]");if($.input.includes("image"))J.push("[vision]");if($.cost.input||$.cost.output)J.push(`[$${$.cost.input}/$${$.cost.output}]`);return J.join(" ")},SG=({isSelected:$,label:J})=>Q$(G1,{bold:$,color:$?"yellow":void 0,children:J},void 0,!1,void 0,this),i5=({provider:$,models:J,isLoading:Y,error:Z,onSelect:X,onCancel:Q})=>{let[U,G]=RG("");_0((O,q)=>{if(q.escape)if(U)G("");else Q()});let z=a5(()=>{if(!U)return J;let O=U.toLowerCase();return J.filter((q)=>q.name.toLowerCase().includes(O)||q.id.toLowerCase().includes(O))},[J,U]),K=a5(()=>z.map((O)=>({key:O.id,label:IG(O),value:O})),[z]);if(Y)return Q$(V1,{flexDirection:"column",children:Q$(G1,{color:"yellow",children:["正在加载 ",$.name," 模型列表..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this);if(Z)return Q$(V1,{flexDirection:"column",children:[Q$(G1,{color:"red",children:Z},void 0,!1,void 0,this),Q$(G1,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return Q$(V1,{flexDirection:"column",children:[Q$(V1,{marginBottom:1,children:Q$(G1,{bold:!0,color:"blue",children:"Step 3: 选择模型"},void 0,!1,void 0,this)},void 0,!1,void 0,this),Q$(V1,{marginBottom:1,children:Q$(G1,{children:["Provider: ",Q$(G1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),Q$(kG,{children:[Q$(V1,{marginBottom:1,children:[Q$(G1,{color:"cyan",children:"> "},void 0,!1,void 0,this),Q$(CG,{value:U,onChange:G,placeholder:`搜索 ${J.length} 个模型...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q$(V1,{marginBottom:1,children:Q$(G1,{dimColor:!0,children:"模型元数据来自内置 catalog"},void 0,!1,void 0,this)},void 0,!1,void 0,this),Q$(V1,{flexDirection:"column",height:12,children:Q$(TG,{items:K,onSelect:(O)=>X(O.value),indicatorComponent:yG,itemComponent:SG,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),z.length===0&&Q$(G1,{color:"yellow",children:"内置 catalog 中没有匹配模型"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)};import{Box as w2,Text as n1}from"ink";import fG from"ink-select-input";import DG from"ink-text-input";import{useMemo as o5,useState as vG}from"react";import{jsxDEV as P$}from"react/jsx-dev-runtime";var VG=({isSelected:$})=>P$(w2,{marginRight:1,children:P$(n1,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),jG=({isSelected:$,label:J})=>P$(n1,{bold:$,color:$?"yellow":void 0,children:J},void 0,!1,void 0,this),n5=({providers:$,isLoading:J,error:Y,onSelect:Z,onCancel:X})=>{let[Q,U]=vG("");_0((K,O)=>{if(O.escape)if(Q)U("");else X()});let G=o5(()=>{if(!Q)return $;let K=Q.toLowerCase();return $.filter((O)=>O.name.toLowerCase().includes(K)||O.id.toLowerCase().includes(K))},[$,Q]),z=o5(()=>G.map((K)=>({key:K.id,label:`${K.name} - ${K.modelCount} models${K.configured?" [configured]":""}`,value:K})),[G]);if(J)return P$(w2,{flexDirection:"column",children:P$(n1,{color:"yellow",children:"正在加载 Provider 列表..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Y)return P$(w2,{flexDirection:"column",children:[P$(n1,{color:"red",children:Y},void 0,!1,void 0,this),P$(n1,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return P$(w2,{flexDirection:"column",children:[P$(w2,{marginBottom:1,children:P$(n1,{bold:!0,color:"blue",children:"Step 1: 选择 API 提供商"},void 0,!1,void 0,this)},void 0,!1,void 0,this),P$(w2,{marginBottom:1,children:[P$(n1,{color:"cyan",children:"> "},void 0,!1,void 0,this),P$(DG,{value:Q,onChange:U,placeholder:`搜索 ${$.length} 个 Provider...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),P$(w2,{flexDirection:"column",height:12,children:P$(fG,{items:z,onSelect:(K)=>Z(K.value),indicatorComponent:VG,itemComponent:jG,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),G.length===0&&P$(n1,{color:"yellow",children:"未找到匹配的 Provider,按 Esc 清除搜索"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};function t5($){if($==="custom")return"provider";if($==="model")return"provider";if($==="credential")return"model";return}import{jsxDEV as t1}from"react/jsx-dev-runtime";var C9=({mode:$,initialConfig:J,modelId:Y,onComplete:Z,onCancel:X})=>{let[Q,U]=B2("provider"),[G,z]=B2(),[K,O]=B2(),[q,N]=B2(),[_,F]=B2(""),[H,P]=B2(),[T,w]=B2(!1),L=l5(),R=r5(G?.id),W=e0(!1);_0((S,M)=>{if(M.ctrl&&S==="c"||M.meta&&S==="c")$==="setup"?W():X()});let b=M9(async(S)=>{if(!G)return;let M=q??(K?{provider:G.id,model:K.id,displayName:J?.displayName}:void 0);if(!M)return;w(!0),P(void 0);try{if(M.modelProvider)C1().registerModelProvider(M.provider,M.modelProvider,[M.model]);if(S?.trim())await C1().setApiKey(M.provider,S.trim());let y={displayName:M.displayName,provider:M.provider,model:M.model,overrides:M.overrides};if($==="setup")await Z(M);else if($==="add"){let B=M.modelProvider?await K$().addModelWithProvider(y,M.modelProvider):await K$().addModel(y);await K$().setCurrentModel(B.id),await Z(M)}else if(Y){if(M.modelProvider)await K$().updateModelWithProvider(Y,y,M.modelProvider);else await K$().updateModel(Y,y);await Z(M)}}catch(y){if(M.modelProvider){await C1().credentials.delete(M.provider);let B=r6();C1().configureModelProviders(B?.modelProviders??{},B?.models??[])}P(y instanceof Error?y.message:"保存配置失败"),w(!1)}}),A=M9((S)=>{if(O(S),G?.configured)b();else if(G?.supportsApiKey)U("credential");else P(`${G?.name??"Provider"} 需要 OAuth 或环境凭证,请先在外部完成认证`)}),C=M9(()=>{if(P(void 0),Q==="credential"&&q){U("custom");return}let S=t5(Q);if(S)U(S)});return t1(hG,{flexDirection:"column",padding:1,children:[t1(T9,{bold:!0,color:"blue",children:$==="edit"?"编辑模型":"添加模型"},void 0,!1,void 0,this),Q==="provider"&&t1(n5,{...L,onSelect:(S)=>{z(S),O(void 0),N(void 0),U(S.factoryWireApi?"custom":"model")},onCancel:$==="setup"?()=>{return}:X},void 0,!1,void 0,this),Q==="custom"&&G?.factoryWireApi&&t1(x5,{wireApi:G.factoryWireApi,initialConfig:q,onSubmit:(S)=>{N(S),U("credential")},onCancel:C},void 0,!1,void 0,this),Q==="model"&&G&&t1(i5,{provider:G,...R,onSelect:A,onCancel:C},void 0,!1,void 0,this),Q==="credential"&&G&&t1(E5,{provider:G,value:_,onChange:F,onSubmit:()=>void b(_),onCancel:C,error:H},void 0,!1,void 0,this),T&&t1(T9,{color:"yellow",children:"正在保存配置..."},void 0,!1,void 0,this),H&&Q!=="credential"&&t1(T9,{color:"red",children:H},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as R8}from"ahooks";import{promises as J7}from"fs";import{Box as c$,Text as X$}from"ink";import s5 from"ink-select-input";import EG from"ink-text-input";import gG from"os";import n6 from"path";import{useEffect as mG,useMemo as t6,useRef as pG,useState as s1}from"react";import{jsxDEV as y0}from"react/jsx-dev-runtime";var y8=[{key:"allow",label:"Allow"},{key:"ask",label:"Ask"},{key:"deny",label:"Deny"},{key:"info",label:"Info"}],xG={allow:"Add a new rule...",ask:"Add a new rule...",deny:"Add a new rule..."},cG={allow:"Allow permission rules",ask:"Ask permission rules",deny:"Deny permission rules"},e5={project:"[项目共享配置]",global:"[用户全局配置]",local:"[本地配置]"},uG=["project","global","local"],dG={allow:[],ask:[],deny:[]},lG={localExists:!1,projectExists:!1,globalExists:!1},$7={allow:[],ask:[],deny:[]};function rG($){let J=(Z)=>Array.isArray(Z)?Z.filter((X)=>typeof X==="string"):[],Y=$?.permissions??{};return{allow:J(Y?.allow),ask:J(Y?.ask),deny:J(Y?.deny)}}async function aG($){try{let J=await J7.readFile($,"utf-8"),Y=JSON.parse(J);return{exists:!0,raw:Y,permissions:rG(Y)}}catch(J){if(J.code==="ENOENT")return{exists:!1,raw:{},permissions:{...$7}};return console.warn(`[PermissionsManager] Failed to read ${$}:`,J),{exists:!0,raw:{},permissions:{...$7}}}}function iG($,J){let Y=$.padEnd(32," "),Z=J==="local"?`${e5[J]} <- 可删除`:e5[J];return`${Y} ${Z}`}var Y7=({onClose:$})=>{let Y=s0()==="permissions-manager",Z=e0(!1),[X,Q]=s1(0),U=y8[X].key,[G,z]=s1(dG),[K,O]=s1(lG),[q,N]=s1(!0),[_,F]=s1("list"),[H,P]=s1(""),[T,w]=s1(null),[L,R]=s1(null),W=pG(!1),b=t6(()=>n6.join(G$(),".blade","settings.local.json"),[]),A=t6(()=>n6.join(G$(),".blade","settings.json"),[]),C=t6(()=>n6.join(gG.homedir(),".blade","settings.json"),[]),S=R8(async()=>{N(!0);let h=await Promise.all([{source:"local",path:b},{source:"project",path:A},{source:"global",path:C}].map(async({source:L0,path:T0})=>{let I=await aG(T0);return{source:L0,path:T0,...I}})),x={localExists:h.find((L0)=>L0.source==="local")?.exists??!1,projectExists:h.find((L0)=>L0.source==="project")?.exists??!1,globalExists:h.find((L0)=>L0.source==="global")?.exists??!1};O(x);let l={allow:[],ask:[],deny:[]},W0=Object.fromEntries(h.map((L0)=>[L0.source,L0]));["allow","ask","deny"].forEach((L0)=>{uG.forEach((T0)=>{(W0[T0]?.permissions[L0]??[]).forEach((f,p)=>{let E={key:`${T0}:${p}:${f}`,rule:f,source:T0};l[L0].push(E)})})}),z(l),N(!1)});mG(()=>{S()},[S]);let M=R8(async(K0,h)=>{try{let x=n6.join(G$(),".blade","settings.local.json"),l={allow:[],ask:[],deny:[]};try{let L0=await J7.readFile(x,"utf-8"),I=JSON.parse(L0).permissions||{};l={allow:Array.isArray(I.allow)?I.allow:[],ask:Array.isArray(I.ask)?I.ask:[],deny:Array.isArray(I.deny)?I.deny:[]}}catch(L0){}let W0=h(l);await K$().updateConfig({permissions:W0},{scope:"local",immediate:!0}),await S()}catch(x){throw console.error("[PermissionsManager] 修改权限规则失败:",x),x}});_0((K0,h)=>{if(h.ctrl&&K0==="c"||h.meta&&K0==="c"){Z();return}if(_==="locked"){if(W.current){W.current=!1;return}F("list"),w(null),R(null);return}if(h.escape){if(_==="list"||U==="info")$();else F("list"),P(""),w(null),R(null);return}if(_==="list"){if(h.tab&&h.shift)Q((x)=>(x-1+y8.length)%y8.length);else if(h.tab)Q((x)=>(x+1)%y8.length);else if(K0?.toLowerCase()==="q")$()}},{isActive:Y});let y=R8((K0)=>{let h=K0.value;if(U==="info")return;if(h.type==="add"){F("add"),P(""),R(null);return}if(h.entry.source!=="local"){F("locked"),W.current=!0,w({tab:U,entry:h.entry}),R({type:"error",text:h.entry.source==="project"?"此规则定义在项目共享配置中,无法在此删除。":"此规则来自用户全局配置,无法在此删除。"});return}F("confirm-delete"),w({tab:U,entry:h.entry}),R(null)}),B=R8(async()=>{if(U==="info")return;let K0=H.trim();if(!K0){R({type:"error",text:"Permission rule 不能为空"});return}if(G[U].map((x)=>x.rule).includes(K0)){R({type:"error",text:"该规则已存在"});return}try{await M(U,(x)=>{let l={allow:[...x.allow],ask:[...x.ask],deny:[...x.deny]};return l[U]=[...new Set([...x[U],K0])],l}),F("list"),P(""),R({type:"success",text:"已添加本地权限规则"})}catch(x){R({type:"error",text:`保存失败: ${x instanceof Error?x.message:"未知错误"}`})}}),V=R8(async()=>{if(!T)return;let{tab:K0,entry:h}=T;try{await M(K0,(x)=>{let l={allow:[...x.allow],ask:[...x.ask],deny:[...x.deny]};return l[K0]=x[K0].filter((W0)=>W0!==h.rule),l}),F("list"),w(null),R({type:"success",text:"已删除本地权限规则"})}catch(x){R({type:"error",text:`删除失败: ${x instanceof Error?x.message:"未知错误"}`})}}),o=t6(()=>{if(U==="info")return[];let K0=U;return[{key:"add-new-rule",label:`› ${xG[K0]}`,value:{type:"add"}},...G[K0].map((x)=>({key:x.key,label:iG(x.rule,x.source),value:{type:"rule",entry:x}}))]},[U,G]),a=()=>y0(c$,{marginBottom:1,children:y8.map((K0,h)=>y0(c$,{marginRight:2,children:y0(X$,{color:h===X?"yellow":"gray",children:["[",K0.label,"]"]},void 0,!0,void 0,this)},K0.key,!1,void 0,this))},void 0,!1,void 0,this),Y0=()=>y0(c$,{flexDirection:"column",gap:1,children:[y0(X$,{children:"配置文件优先级(从高到低):"},void 0,!1,void 0,this),y0(c$,{flexDirection:"column",marginLeft:2,children:[y0(X$,{children:["1. .blade/settings.local.json (本地配置,不提交 Git)"," ",K.localExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),y0(X$,{children:["2. .blade/settings.json (项目配置,提交 Git)"," ",K.projectExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),y0(X$,{children:["3. ~/.blade/settings.json (用户全局配置)"," ",K.globalExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),y0(X$,{children:"说明:"},void 0,!1,void 0,this),y0(c$,{flexDirection:"column",marginLeft:2,children:[y0(X$,{children:"- /permissions 命令只管理本地配置 (.blade/settings.local.json)"},void 0,!1,void 0,this),y0(X$,{children:"- 修改全局或项目配置请直接编辑对应文件"},void 0,!1,void 0,this),y0(X$,{children:"- 本地配置不会提交到 Git"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Q0=(K0)=>y0(c$,{flexDirection:"column",gap:1,children:[y0(X$,{bold:!0,children:cG[K0]},void 0,!1,void 0,this),y0(X$,{children:"Permission rules are a tool name, optionally followed by a specifier in parentheses."},void 0,!1,void 0,this),y0(X$,{color:"gray",children:"例如: WebFetch 或 Bash(ls:*)"},void 0,!1,void 0,this),y0(c$,{marginTop:1,children:y0(EG,{value:H,onChange:P,onSubmit:B},void 0,!1,void 0,this)},void 0,!1,void 0,this),y0(X$,{color:"gray",children:"Enter 提交 · Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N0=(K0,h)=>y0(c$,{flexDirection:"column",gap:1,children:[y0(X$,{bold:!0,children:["Delete ",K0," permission rule?"]},void 0,!0,void 0,this),y0(X$,{children:h.rule},void 0,!1,void 0,this),y0(X$,{color:"gray",children:"From project local settings"},void 0,!1,void 0,this),y0(X$,{children:"Are you sure you want to delete this permission rule?"},void 0,!1,void 0,this),y0(s5,{items:[{label:"Yes",value:"yes"},{label:"No",value:"no"}],onSelect:(x)=>{if(x.value==="yes")V();else F("list"),w(null)}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),d=(K0)=>y0(c$,{flexDirection:"column",gap:1,children:[y0(X$,{bold:!0,children:"Cannot delete this rule"},void 0,!1,void 0,this),y0(X$,{children:K0.rule},void 0,!1,void 0,this),y0(X$,{color:"gray",children:K0.source==="project"?"This rule is defined in .blade/settings.json. 请手动编辑该文件以移除规则。":"This rule is defined in ~/.blade/settings.json. 请手动编辑该文件以移除规则。"},void 0,!1,void 0,this),y0(X$,{color:"gray",children:"按任意键继续"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D=(K0)=>y0(s5,{items:o,isFocused:_==="list",onSelect:y},void 0,!1,void 0,this),v=()=>{if(q)return y0(X$,{children:"加载中..."},void 0,!1,void 0,this);if(U==="info")return Y0();if(_==="add")return Q0(U);if(_==="confirm-delete"&&T)return N0(T.tab,T.entry);if(_==="locked"&&T)return d(T.entry);return D(U)};return y0(c$,{flexDirection:"column",borderStyle:"round",borderColor:Y?"cyan":"gray",padding:1,width:80,children:[y0(X$,{color:"cyan",bold:!0,children:"权限管理器"},void 0,!1,void 0,this),a(),y0(c$,{flexDirection:"column",gap:1,children:v()},void 0,!1,void 0,this),L&&y0(c$,{marginTop:1,children:y0(X$,{color:L.type==="success"?"green":"red",children:L.text},void 0,!1,void 0,this)},void 0,!1,void 0,this),y0(c$,{marginTop:1,children:y0(X$,{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 c0,Text as b0}from"ink";import{useEffect as oG,useState as A2}from"react";import{jsxDEV as s}from"react/jsx-dev-runtime";var R9=["local","project","global"];function z7({workspaceRoot:$,onCancel:J}){let Y=s0()==="plugins-manager",Z=Z7($),X=Z.getAll(),[Q,U]=A2(0),[G,z]=A2(!1),[K,O]=A2(""),[q,N]=A2(null),[_,F]=A2("local"),[H,P]=A2(null),[T,w]=A2(0),L=Z.getBySource(),R=Z.getStats(),W=Z.getSourcePolicy(),b=e0(!1,J);oG(()=>{let B=!0;return X7.getInstance().loadWorkspacePluginSettingsResolution(Z.getWorkspaceRoot()).then((V)=>{if(B)P(V.settings)}).catch((V)=>{if(B)O(V instanceof Error?V.message:"无法读取插件作用域配置")}),()=>{B=!1}},[Z,T]);let A=()=>{F((B)=>{let V=R9.indexOf(B);return R9[(V+1)%R9.length]}),N(null)},C=async()=>{let B=X[Q];if(!B||G)return;if(B.source==="cli"){O(`${B.manifest.name} 由 --plugin-dir 管理,不能持久化切换`);return}if(B.status==="error"){O(B.error??`${B.manifest.name} 当前不可用`);return}z(!0),O("");try{let V=await Q7(Z.getWorkspaceRoot(),B.manifest.name,B.status!=="active",_);O(V.effectiveEnabled?`已启用 ${B.manifest.name} · 生效层级 ${V.effectiveScope}`:`已禁用 ${B.manifest.name} · 生效层级 ${V.effectiveScope}`),w((o)=>o+1)}catch(V){O(V instanceof Error?V.message:String(V))}finally{z(!1)}},S=async()=>{if(G)return;z(!0),O("");try{await U7(Z.getWorkspaceRoot()),U(0),O("插件列表已刷新"),w((B)=>B+1)}catch(B){O(B instanceof Error?B.message:String(B))}finally{z(!1)}},M=async()=>{let B=X[Q];if(!B||G)return;if(!B.installation){O(`${B.manifest.name} 不是 Blade 受管安装,不能自动更新`);return}z(!0),N(null),O("");try{let{result:V}=await G7(Z.getWorkspaceRoot(),B.manifest.name,{trusted:!0});if(!V.success)throw Error(V.error);O(V.changed?`已更新 ${B.manifest.name} 到 ${V.installation?.revision}`:`${B.manifest.name} 已是最新版本`),w((o)=>o+1)}catch(V){O(V instanceof Error?V.message:String(V))}finally{z(!1)}},y=async()=>{let B=X[Q];if(!B||G)return;if(!B.installation){O(`${B.manifest.name} 不是 Blade 受管安装,不能自动卸载`);return}if(q!==B.manifest.name){N(B.manifest.name),O(`再次按 x 确认卸载 ${B.manifest.name}`);return}z(!0),O("");try{let{result:V}=await K7(Z.getWorkspaceRoot(),B.manifest.name,!0);if(!V.success)throw Error(V.error);N(null),U(0),O(`已卸载 ${B.manifest.name}`),w((o)=>o+1)}catch(V){O(V instanceof Error?V.message:String(V))}finally{z(!1)}};if(_0((B,V)=>{if(V.escape)J?.();else if(V.ctrl&&B==="c"||V.meta&&B==="c")b();else if((V.upArrow||B==="k")&&X.length>0)N(null),U((o)=>(o-1+X.length)%X.length);else if((V.downArrow||B==="j")&&X.length>0)N(null),U((o)=>(o+1)%X.length);else if(B===" "||V.return)C();else if(B==="r")S();else if(B==="s")A();else if(B==="u")M();else if(B==="x")y()},{isActive:Y}),X.length===0)return s(c0,{flexDirection:"column",paddingY:1,children:[s(c0,{marginBottom:1,children:s(b0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),s(c0,{paddingLeft:2,children:s(b0,{color:"gray",children:"没有已加载的插件"},void 0,!1,void 0,this)},void 0,!1,void 0,this),s(c0,{marginTop:1,paddingLeft:2,flexDirection:"column",children:[s(b0,{color:"gray",children:"插件目录位置:"},void 0,!1,void 0,this),s(b0,{color:"gray",dimColor:!0,children:[" ","• ~/.blade/plugins/ - 用户级插件"]},void 0,!0,void 0,this),s(b0,{color:"gray",dimColor:!0,children:[" ","• .blade/plugins/ - 项目级插件"]},void 0,!0,void 0,this),s(b0,{color:"gray",dimColor:!0,children:[" ","• --plugin-dir - CLI 指定的插件"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),s(c0,{marginTop:1,paddingLeft:2,children:s(b0,{color:"gray",children:"使用 /plugins install <url> 安装新插件"},void 0,!1,void 0,this)},void 0,!1,void 0,this),s(c0,{marginTop:1,children:s(b0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return s(c0,{flexDirection:"column",paddingY:1,children:[s(c0,{marginBottom:1,children:[s(b0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this),s(b0,{color:"gray",children:[" (共 ",R.total," 个插件)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),s(c0,{paddingLeft:2,marginBottom:1,children:s(b0,{color:"gray",children:["启用: ",R.active," | 禁用: ",R.inactive," | 命令: ",R.commands," | 技能:"," ",R.skills," | 代理: ",R.agents]},void 0,!0,void 0,this)},void 0,!1,void 0,this),s(c0,{paddingLeft:2,marginBottom:1,children:s(b0,{color:"gray",children:["来源策略: ",W.restrictToAllowedSources?"restricted":"open"," | Git SHA: ",W.requireGitCommitSha?"required":"optional"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),s(c0,{paddingLeft:2,marginBottom:1,children:s(b0,{color:"gray",children:["写入层级: ",s(b0,{color:"cyan",children:_},void 0,!1,void 0,this)," · 按 s 切换"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),L.cli.length>0&&s(c0,{flexDirection:"column",marginBottom:1,children:[s(c0,{paddingLeft:1,children:[s(b0,{bold:!0,color:"magenta",children:"CLI 指定"},void 0,!1,void 0,this),s(b0,{color:"gray",children:" (--plugin-dir)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),L.cli.map((B)=>{let V=B.status==="active"?"[on]":"[off]",o=X.indexOf(B)===Q;return s(c0,{flexDirection:"column",paddingLeft:2,children:[s(b0,{children:[s(b0,{bold:!0,color:o?"cyan":"green",children:[o?"› ":" ",V," ",B.manifest.name]},void 0,!0,void 0,this),s(b0,{color:"gray",children:[" v",B.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),s(c0,{paddingLeft:2,children:s(b0,{color:"gray",children:B.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),s(c0,{paddingLeft:2,children:s(b0,{color:"gray",dimColor:!0,children:"生效层级: invocation"},void 0,!1,void 0,this)},void 0,!1,void 0,this),B.commands.length>0&&s(c0,{paddingLeft:2,children:s(b0,{color:"blue",children:["命令:"," ",B.commands.map((a)=>`/${a.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},B.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),L.project.length>0&&s(c0,{flexDirection:"column",marginBottom:1,children:[s(c0,{paddingLeft:1,children:[s(b0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),s(b0,{color:"gray",children:" (.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),L.project.map((B)=>{let V=B.status==="active"?"[on]":"[off]",o=X.indexOf(B)===Q;return s(c0,{flexDirection:"column",paddingLeft:2,children:[s(b0,{children:[s(b0,{bold:!0,color:o?"cyan":"green",children:[o?"› ":" ",V," ",B.manifest.name]},void 0,!0,void 0,this),s(b0,{color:"gray",children:[" v",B.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),s(c0,{paddingLeft:2,children:s(b0,{color:"gray",children:B.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),s(c0,{paddingLeft:2,children:s(b0,{color:"gray",dimColor:!0,children:["生效层级:"," ",H?.[B.manifest.name]?.effectiveScope??"default"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),B.commands.length>0&&s(c0,{paddingLeft:2,children:s(b0,{color:"blue",children:["命令:"," ",B.commands.map((a)=>`/${a.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},B.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),L.user.length>0&&s(c0,{flexDirection:"column",marginBottom:1,children:[s(c0,{paddingLeft:1,children:[s(b0,{bold:!0,color:"cyan",children:"用户级"},void 0,!1,void 0,this),s(b0,{color:"gray",children:" (~/.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),L.user.map((B)=>{let V=B.status==="active"?"[on]":"[off]",o=X.indexOf(B)===Q;return s(c0,{flexDirection:"column",paddingLeft:2,children:[s(b0,{children:[s(b0,{bold:!0,color:o?"cyan":"green",children:[o?"› ":" ",V," ",B.manifest.name]},void 0,!0,void 0,this),s(b0,{color:"gray",children:[" v",B.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),s(c0,{paddingLeft:2,children:s(b0,{color:"gray",children:B.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),s(c0,{paddingLeft:2,children:s(b0,{color:"gray",dimColor:!0,children:["生效层级:"," ",H?.[B.manifest.name]?.effectiveScope??"default"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),B.commands.length>0&&s(c0,{paddingLeft:2,children:s(b0,{color:"blue",children:["命令:"," ",B.commands.map((a)=>`/${a.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},B.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),s(c0,{marginTop:1,paddingLeft:2,flexDirection:"column",children:[s(b0,{color:"gray",children:"可用命令:"},void 0,!1,void 0,this),s(b0,{color:"gray",dimColor:!0,children:[" ","• /plugins list - 列出所有插件"]},void 0,!0,void 0,this),s(b0,{color:"gray",dimColor:!0,children:[" ","• /plugins info <name> - 显示插件详情"]},void 0,!0,void 0,this),s(b0,{color:"gray",dimColor:!0,children:[" ","• /plugins install <url> - 安装插件"]},void 0,!0,void 0,this),s(b0,{color:"gray",dimColor:!0,children:[" ","• /plugins enable/disable <name> - 启用/禁用插件"]},void 0,!0,void 0,this),s(b0,{color:"gray",dimColor:!0,children:[" ","• /plugins policy show|set - 来源与 SHA 策略"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),s(c0,{marginTop:1,children:s(b0,{dimColor:!0,children:"↑/↓ 选择 · Space/Enter 启停 · s 切换层级 · u 信任并更新 · x 卸载 · r 刷新 · ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),K&&s(c0,{marginTop:1,children:s(b0,{color:K.includes("失败")?"red":"cyan",children:K},void 0,!1,void 0,this)},void 0,!1,void 0,this),G&&s(b0,{color:"gray",children:"处理中..."},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import{Box as M$,Text as T$,useStdout as nG}from"ink";import tG from"ink-text-input";import y9,{useCallback as I8,useMemo as sG,useState as e1}from"react";import{jsxDEV as V0}from"react/jsx-dev-runtime";var eG=y9.memo(({option:$,index:J,isSelected:Y,isMultiSelect:Z,isHighlighted:X})=>V0(M$,{flexDirection:"column",marginBottom:1,children:[V0(T$,{color:X?"yellow":Y?"green":void 0,bold:X,children:[Z?Y?"(*) ":"( ) ":X?"> ":" ",J+1,". ",$.label]},void 0,!0,void 0,this),V0(M$,{marginLeft:4,children:V0(T$,{color:"gray",children:$.description},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)),$K=y9.memo(({questions:$,answers:J})=>V0(M$,{flexDirection:"column",marginBottom:1,children:$.map((Y)=>{let Z=J[Y.header],X=Array.isArray(Z)?Z.join(", "):Z||"(no answer)";return V0(M$,{marginBottom:1,children:[V0(T$,{backgroundColor:"blue",color:"white",children:[" ",Y.header," "]},void 0,!0,void 0,this),V0(T$,{color:"green",children:[" ",X]},void 0,!0,void 0,this)]},Y.header,!0,void 0,this)})},void 0,!1,void 0,this)),q7=y9.memo(({questions:$,onComplete:J,onCancel:Y})=>{let{stdout:Z}=nG(),X=Z.columns||80,U=s0()==="confirmation-prompt",G=e0(!1),[z,K]=e1("answering"),[O,q]=e1(0),[N,_]=e1({}),[F,H]=e1(0),[P,T]=e1([]),[w,L]=e1(!1),[R,W]=e1(""),[b,A]=e1(0),C=$[O],S=sG(()=>{if(!C)return[];return[...C.options.map((a)=>({label:a.label,value:a.label,description:a.description})),{label:"Type something...",value:"__other__",description:"Enter custom response"}]},[C]),M=I8((a)=>{let Y0={...N,[C.header]:a};if(_(Y0),O<$.length-1)q(O+1),H(0),T([]),L(!1),W("");else K("submit"),A(0)},[N,C?.header,O,$.length]),y=I8((a)=>{let Y0=S[a];if(!Y0)return;if(Y0.value==="__other__"){L(!0);return}if(C.multiSelect)T((Q0)=>Q0.includes(Y0.value)?Q0.filter((N0)=>N0!==Y0.value):[...Q0,Y0.value]);else M(Y0.value)},[S,C?.multiSelect,M]),B=I8((a)=>{if(a.trim())M(a.trim())},[M]),V=I8(()=>{K("answering"),q(0),H(0),T([]),L(!1)},[]),o=I8(()=>{J(N)},[N,J]);if(_0((a,Y0)=>{if(Y0.ctrl&&a==="c"||Y0.meta&&a==="c"){G();return}if(w){if(Y0.escape)L(!1),W("");return}if(Y0.escape){Y();return}let Q0=parseInt(a);if(Q0>=1&&Q0<=S.length){y(Q0-1);return}if(Y0.upArrow){H((N0)=>N0>0?N0-1:S.length-1);return}if(Y0.downArrow||Y0.tab){H((N0)=>N0<S.length-1?N0+1:0);return}if(Y0.return){if(C.multiSelect&&P.length>0)M(P);else y(F);return}if(a===" "&&C.multiSelect){let N0=S[F];if(N0&&N0.value!=="__other__")T((d)=>d.includes(N0.value)?d.filter((D)=>D!==N0.value):[...d,N0.value]);return}},{isActive:U&&z==="answering"&&!w}),_0((a,Y0)=>{if(Y0.ctrl&&a==="c"||Y0.meta&&a==="c"){G();return}if(Y0.escape){Y();return}if(Y0.upArrow||Y0.downArrow||Y0.tab){A((Q0)=>Q0===0?1:0);return}if(Y0.return){if(b===0)o();else V();return}if(a.toLowerCase()==="y"){o();return}if(a.toLowerCase()==="e"){V();return}},{isActive:U&&z==="submit"}),z==="submit")return V0(M$,{flexDirection:"column",borderStyle:"round",borderColor:U?"green":"gray",padding:1,width:Math.min(X-4,80),children:[V0(M$,{marginBottom:1,children:V0(T$,{bold:!0,color:"green",children:"[OK] Review Your Answers"},void 0,!1,void 0,this)},void 0,!1,void 0,this),V0($K,{questions:$,answers:N},void 0,!1,void 0,this),V0(M$,{flexDirection:"column",marginTop:1,children:[V0(T$,{color:b===0?"yellow":void 0,bold:b===0,children:[b===0?"> ":" ","[Y] Submit answers"]},void 0,!0,void 0,this),V0(T$,{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(M$,{marginTop:1,children:V0(T$,{color:"gray",children:"Enter to confirm · Up/Down to navigate · Y/E for quick select"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(!C)return null;return V0(M$,{flexDirection:"column",borderStyle:"round",borderColor:U?"cyan":"gray",padding:1,width:Math.min(X-4,80),children:[V0(M$,{marginBottom:1,children:[V0(T$,{backgroundColor:"blue",color:"white",children:[" ",C.header," "]},void 0,!0,void 0,this),V0(T$,{children:[" ",C.question]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),w?V0(M$,{flexDirection:"column",marginTop:1,children:[V0(T$,{color:"yellow",children:"Enter your response:"},void 0,!1,void 0,this),V0(M$,{marginTop:1,children:[V0(T$,{color:"cyan",children:"> "},void 0,!1,void 0,this),V0(tG,{value:R,onChange:W,onSubmit:B,focus:U},void 0,!1,void 0,this)]},void 0,!0,void 0,this),V0(M$,{marginTop:1,children:V0(T$,{color:"gray",children:"(Press Enter to submit, ESC to go back)"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this):V0(M$,{flexDirection:"column",children:S.map((a,Y0)=>V0(eG,{option:a,index:Y0,isSelected:P.includes(a.value),isMultiSelect:C.multiSelect,isHighlighted:F===Y0},a.value,!1,void 0,this))},void 0,!1,void 0,this),!w&&V0(M$,{marginTop:1,flexDirection:"column",children:[V0(T$,{color:"gray",children:C.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),C.multiSelect&&P.length>0&&V0(T$,{color:"green",children:["Selected: ",P.join(", ")]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$.length>1&&V0(M$,{marginTop:1,children:V0(T$,{color:"gray",children:["Question ",O+1," of ",$.length]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as k9,Text as j1,useStdout as KK}from"ink";import{useEffect as f9,useMemo as $4,useRef as P2,useState as b2}from"react";function JK($,J){return[...$,J].join(`
|
|
153
|
+
`).replace(/\n+$/,"")}function S8($){let J=2166136261;for(let Y=0;Y<$.length;Y++)J^=$.charCodeAt(Y),J=Math.imul(J,16777619);return`${$.length}:${(J>>>0).toString(16)}`}function N7({messages:$,currentStreamingMessageId:J,streamingLines:Y,streamingTail:Z,currentThinkingContent:X}){let Q=JK(Y,Z),U=[];for(let G of $){let z=G.id===J?Q:G.content,K=G.metadata&&"phase"in G.metadata?String(G.metadata.phase):"",O=G.id===J?X??G.thinkingContent:G.thinkingContent;if(G.role==="assistant"&&O)U.push({id:`${G.id}:thinking`,messageId:G.id,role:"assistant",kind:"thinking",content:O,revision:`${G.timestamp}:thinking:${S8(O)}`,collapsible:!0});let q=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:z,detail:q,revision:`${G.timestamp}:${S8(z)}:${S8(q??"")}:${K}`,collapsible:q!==void 0})}if(J&&!U.some((G)=>G.id===J)){if(X)U.push({id:`${J}:thinking`,messageId:J,role:"assistant",kind:"thinking",content:X,revision:`stream:thinking:${S8(X)}`,collapsible:!0});U.push({id:J,messageId:J,role:"assistant",kind:"message",content:Q,revision:`stream:${S8(Q)}`,collapsible:!1})}return U}var _7={user:"> ",assistant:"• ",system:" ",tool:"└ "};function s6($,J,Y){let Z=J.text.length>0?J.text.split(`
|
|
154
|
+
`):[""],X=[];for(let[Q,U]of Z.entries()){let G=X.length===0?J.firstPrefix:J.nextPrefix,z=Math.max(1,Y-G.length),K=a2(U,z,!0),O=0;for(let q of K){let N=q.length>0?U.indexOf(q,O):O,_=N>=0?N:O,F=_+q.length,H=X.length===0?J.firstPrefix:J.nextPrefix;X.push({key:`${$.id}:${J.key}:${Q}:${X.length}`,blockId:$.id,role:$.role,kind:$.kind,text:`${H}${q}`,copyText:q,pending:$.pending===!0,header:J.header&&X.length===0,sourceLine:J.sourceLineOffset+Q,sourceStart:_,sourceEnd:F,sourceTextOffset:H.length}),O=F}}return X}function O7($){return $.length===0?0:$.split(`
|
|
155
|
+
`).length}function YK($){let J=$.split(`
|
|
156
|
+
`)[0]?.trim()??"";if(J.length<=48)return J;return`${J.slice(0,45)}...`}function I9($,J,Y=!1){if($.kind==="thinking"){let Z=Y?"[-]":"[+]",X=YK($.content),Q=`${Z} Thinking (${O7($.content)} lines)${!Y&&X?` - ${X}`:""}`,U={key:`${$.id}:header`,blockId:$.id,role:$.role,kind:$.kind,text:`? ${Q}`,copyText:Q,pending:$.pending===!0,header:!0,sourceLine:null,sourceStart:0,sourceEnd:0,sourceTextOffset:2};if(!Y)return[U];return[U,...s6($,{text:$.content,firstPrefix:" ",nextPrefix:" ",sourceLineOffset:0,key:"thinking",header:!1},J)]}if($.kind==="tool"&&$.detail){let Z=Y?"[-]":"[+]",X=s6($,{text:$.content,firstPrefix:`${_7.tool}${Z} `,nextPrefix:" ",sourceLineOffset:0,key:"summary",header:!0},J);if(!Y)return X;return[...X,...s6($,{text:$.detail,firstPrefix:" ",nextPrefix:" ",sourceLineOffset:O7($.content),key:"detail",header:!1},J)]}return s6($,{text:$.content.length>0?$.content:"…",firstPrefix:_7[$.role],nextPrefix:" ",sourceLineOffset:0,key:"content",header:!0},J)}function H7($,J,Y=new Set){return $.flatMap((Z,X)=>{let Q=I9(Z,J,Y.has(Z.id));if(X===$.length-1)return Q;return[...Q,{key:`${Z.id}:separator`,blockId:Z.id,role:Z.role,kind:Z.kind,text:"",copyText:"",pending:Z.pending===!0,header:!1,sourceLine:null,sourceStart:0,sourceEnd:0,sourceTextOffset:0}]})}function XK($){if($.kind==="tool"&&$.detail)return[...$.content.split(`
|
|
157
157
|
`),...$.detail.split(`
|
|
158
158
|
`)];return $.content.split(`
|
|
159
|
-
`)}function
|
|
160
|
-
`}${z.copyText}`}return U}function
|
|
159
|
+
`)}function ZK($,J){let Y=[];for(let[Z,X]of XK($).entries())for(let Q of X.matchAll(J)){let U=Q.index,G=Q[0];if(G.length===0)continue;Y.push({blockId:$.id,sourceLine:Z,start:U,end:U+G.length})}return Y}class k8{cache=new Map;search($,J){if(J.length===0)return[];let Y=J.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),Z=new RegExp(Y,"giu"),X=new Set($.map((Q)=>Q.id));for(let Q of this.cache.keys())if(!X.has(Q))this.cache.delete(Q);return $.flatMap((Q)=>{let U=this.cache.get(Q.id);if(U?.revision===Q.revision&&U.query===J)return U.matches;let G=ZK(Q,Z);return this.cache.set(Q.id,{revision:Q.revision,query:J,matches:G}),G})}}function S9($,J){let Y=$.findIndex((Z)=>Z.blockId===J.blockId&&Z.sourceLine===J.sourceLine&&J.start>=Z.sourceStart&&J.start<Math.max(Z.sourceEnd,Z.sourceStart+1));if(Y>=0)return Y;return $.findIndex((Z)=>Z.blockId===J.blockId)}function W7($,J){if($.sourceLine===null||$.sourceEnd<=$.sourceStart)return[];let Y=[];for(let[Z,X]of J.entries()){if(X.blockId!==$.blockId||X.sourceLine!==$.sourceLine||X.end<=$.sourceStart||X.start>=$.sourceEnd)continue;Y.push({start:$.sourceTextOffset+Math.max($.sourceStart,X.start)-$.sourceStart,end:$.sourceTextOffset+Math.min($.sourceEnd,X.end)-$.sourceStart,matchIndex:Z})}return Y}function F7($,J,Y){let Z=Math.max(0,Math.min(J,Y)),X=Math.min($.length-1,Math.max(J,Y));if(X<Z)return"";let Q=$.slice(Z,X+1),U="";for(let[G,z]of Q.entries()){if(G===0){U=z.copyText;continue}let K=Q[G-1],O=z.sourceLine!==null&&z.blockId===K.blockId&&z.sourceLine===K.sourceLine;U+=`${O?"":`
|
|
160
|
+
`}${z.copyText}`}return U}function L7($,J){let Y=new Map($.map((Z)=>[Z.id,Z.revision]));return J.filter((Z)=>Y.get(Z.id)!==Z.revision).map((Z)=>Z.id)}import{spawn as QK}from"node:child_process";function UK($){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 GK($,J,Y){return new Promise((Z)=>{let X=!1,Q=QK($,[...J],{stdio:["pipe","ignore","ignore"]}),U=setTimeout(()=>{if(X)return;X=!0,Q.kill("SIGKILL"),Z(!1)},2000),G=(z)=>{if(X)return;X=!0,clearTimeout(U),Z(z)};Q.once("error",()=>G(!1)),Q.once("close",(z)=>G(z===0)),Q.stdin.once("error",()=>G(!1)),Q.stdin.end(Y)})}function w7($,J=!1){let Y=`\x1B]52;c;${Buffer.from($,"utf8").toString("base64")}\x07`;if(!J)return Y;return`\x1BPtmux;${Y.replaceAll("\x1B","\x1B\x1B")}\x1B\\`}async function e6($,J={}){if($.length===0)return{success:!1};let Y=J.platform??process.platform,Z=J.env??process.env,X=J.runCommand??GK,Q=J.writeTerminal??((z)=>process.stdout.write(z)),U=Boolean(Z.SSH_CONNECTION),G=async(z)=>{try{return await X(z.command,z.args,$)}catch{return!1}};if(!U){for(let z of UK(Y))if(await G(z))return{success:!0,method:"native"}}if(Z.TMUX){if(await G({command:"tmux",args:["load-buffer","-w","-"]})){try{Q(w7($,!0))}catch{}return{success:!0,method:"tmux"}}}try{return Q(w7($)),{success:!0,method:"osc52"}}catch{return{success:!1}}}import{jsxDEV as e$}from"react/jsx-dev-runtime";function zK($){return $.map((J)=>({id:J.id,messageId:J.id,role:J.role,kind:"message",content:J.content,revision:`${J.timestamp}:${J.content.length}:${J.truncated===!0}`,collapsible:!1}))}function qK($,J,Y){let Z=Array.from($.value);if(Y.backspace||Y.delete){if($.cursor===0)return $;return Z.splice($.cursor-1,1),{value:Z.join(""),cursor:$.cursor-1}}if(Y.leftArrow)return{...$,cursor:Math.max(0,$.cursor-1)};if(Y.rightArrow)return{...$,cursor:Math.min(Z.length,$.cursor+1)};if(!J||Y.ctrl||Y.meta)return $;return Z.splice($.cursor,0,...Array.from(J)),{value:Z.join(""),cursor:$.cursor+Array.from(J).length}}var B7=({state:$,onLoadOlder:J,onFork:Y,onClose:Z})=>{let X=s0(),{width:Q,height:U}=l1(),{stdout:G}=KK(),z=Math.max(20,Q-4),K=Math.max(1,U-8),O=$4(()=>zK($.messages),[$.messages]),q=$4(()=>H7(O,z),[O,z]),N=Math.max(0,q.length-K),[_,F]=b2(0),H=P2(0),[P,T]=b2(()=>Math.max(0,q.length-1)),w=P2(P),L=P2(q.at(-1)?.key??null),[R,W]=b2(!1),b=P2(!1),[A,C]=b2({value:"",cursor:0}),S=P2(A),[M,y]=b2(""),[B,V]=b2(0),o=P2(new k8),a=P2(null),[Y0,Q0]=b2(null),N0=$4(()=>$.session?{viewGeneration:$.viewGeneration,locator:$.session.locator,snapshot:$.snapshot,olderCursor:$.olderCursor}:void 0,[$.olderCursor,$.session,$.snapshot,$.viewGeneration]);H.current=_,w.current=P,b.current=R,S.current=A;let d=$4(()=>o.current.search(O,M),[O,M]);f9(()=>{a.current=null},[$.olderCursor]),f9(()=>{if($.status==="error")a.current=null},[$.status]),f9(()=>{let E=L.current?q.findIndex((Z0)=>Z0.key===L.current):-1,n=q.length===0?0:E>=0?E:q.length-1;w.current=n,L.current=q[n]?.key??null,T(n);let H0=Math.max(0,Math.min(H.current,N));H.current=H0,F(H0)},[q,N]);let D=()=>{let E=$.olderCursor;if(!E||!N0||!$.session?.capabilities.history.read||$.status!=="ready"&&$.status!=="error")return;if(a.current===E)return;a.current=E,J(N0)},v=(E,n=!0)=>{let H0=Math.max(0,Math.min(N,E));H.current=H0,F(H0);let Z0=Math.max(1,q.length-H0),C0=Math.max(0,Z0-K),U0=Math.max(C0,Math.min(Z0-1,w.current));if(w.current=U0,L.current=q[U0]?.key??null,T(U0),n&&H0===N)D()},K0=(E)=>{if(d.length===0)return;let n=(E%d.length+d.length)%d.length,H0=d[n],Z0=q.findIndex((U0)=>U0.blockId===H0.blockId);if(V(n),Z0<0)return;w.current=Z0,L.current=q[Z0]?.key??null,T(Z0);let C0=Math.max(0,q.length-Math.min(q.length,Z0+1));v(C0,!1)},h=()=>{let E=q[w.current];if(!E)return;e6(E.copyText,{writeTerminal:(n)=>G.write(n)}).then((n)=>{Q0(n.success?"Copied":"Copy failed")})};_0((E,n)=>{let H0=n;if(b.current){if(H0.escape)return b.current=!1,W(!1),!0;if(H0.return){let C0=S.current.value;y(C0),b.current=!1,W(!1);let U0=o.current.search(O,C0);if(U0.length>0){let S0=U0[0],X0=q.findIndex((E0)=>E0.blockId===S0.blockId);if(V(0),X0>=0)w.current=X0,L.current=q[X0]?.key??null,T(X0),v(Math.max(0,q.length-Math.min(q.length,X0+1)),!1)}return!0}let Z0=qK(S.current,E,H0);return S.current=Z0,C(Z0),!0}if(H0.escape||E==="q")return Z(),!0;if(E==="/"){let Z0={value:M,cursor:Array.from(M).length};return S.current=Z0,C(Z0),b.current=!0,W(!0),!0}if(E==="n"&&d.length>0)return K0(B+1),!0;if(E==="N"&&d.length>0)return K0(B-1),!0;if(E==="y")return h(),!0;if(E==="f"){if(N0&&$.session?.capabilities.history.fork&&$.status==="ready")Y(N0);return!0}if(H0.home||E==="g")return w.current=0,L.current=q[0]?.key??null,T(0),v(N),!0;if(H0.end||E==="G")return w.current=Math.max(0,q.length-1),L.current=q[w.current]?.key??null,T(w.current),v(0),!0;if(H0.pageUp)return v(H.current+Math.max(1,K-1)),!0;if(H0.pageDown)return v(H.current-Math.max(1,K-1)),!0;if(H0.upArrow||E==="k")return w.current=Math.max(0,w.current-1),L.current=q[w.current]?.key??null,T(w.current),v(H.current+1),!0;if(H0.downArrow||E==="j")return w.current=Math.min(q.length-1,w.current+1),L.current=q[w.current]?.key??null,T(w.current),v(H.current-1),!0;return!0},{isActive:X==="session-history-viewer",priority:200});let x=Math.max(0,q.length-_),l=Math.max(0,x-K),W0=q.slice(l,x),L0=M?`/${M} ${d.length>0?`${B+1}/${d.length}`:"0/0"} · loaded pages only`:null,T0=$.session,I=[T0&&!T0.capabilities.history.read?"Older history unavailable":null,T0&&!T0.capabilities.history.fork?"Fork unavailable":null].filter((E)=>E!==null).join(" · "),f=$.status==="loading"?"Loading Session history…":$.status==="forking"?"Forking Session history…":$.status==="loading-older"?"Loading older history…":null,p=$.error?.message??f??Y0??L0??(I||`${$.status==="loading-older"?"Loading older history… · ":""}/ search · y copy · f fork · Esc close`);return e$(k9,{flexDirection:"column",width:"100%",height:U,paddingX:2,children:[e$(k9,{justifyContent:"space-between",children:[e$(j1,{bold:!0,color:"cyan",children:T0?.title?.trim()||"Session history"},void 0,!1,void 0,this),e$(j1,{color:"yellow",children:["Remote · ",T0?.capabilities.connection??"offline"," · History only"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),e$(j1,{dimColor:!0,children:T0?.displayCwd??""},void 0,!1,void 0,this),$.truncated?e$(j1,{color:"yellow",children:"History content was truncated."},void 0,!1,void 0,this):null,e$(k9,{flexDirection:"column",height:K,children:W0.map((E,n)=>e$(j1,{color:l+n===P?"cyan":void 0,children:E.text},E.key,!1,void 0,this))},void 0,!1,void 0,this),R?e$(j1,{children:["/",A.value]},void 0,!0,void 0,this):null,e$(j1,{color:$.error?"red":"gray",children:p},void 0,!1,void 0,this),e$(j1,{dimColor:!0,children:"Open this Session from its ACP owner to continue."},void 0,!1,void 0,this),e$(j1,{dimColor:!0,children:"Files and terminal are unavailable in history-only mode."},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{Box as M2,Text as K1}from"ink";import{useEffect as _K,useMemo as $2,useRef as A7,useState as P7}from"react";import{jsxDEV as H$}from"react/jsx-dev-runtime";function OK($){let J=new Date($),Z=new Date().getTime()-J.getTime(),X=Math.floor(Z/86400000);if(X===0)return`今天 ${J.getHours().toString().padStart(2,"0")}:${J.getMinutes().toString().padStart(2,"0")}`;if(X===1)return"昨天";if(X<7)return`${X}天前`;return`${J.getMonth()+1}/${J.getDate()}`}var NK=({isSelected:$})=>H$(M2,{marginRight:1,children:H$(K1,{color:$?"cyan":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),HK=({isSelected:$,label:J})=>H$(K1,{color:$?"cyan":"white",bold:$,children:J},void 0,!1,void 0,this),u$=20,b7=({intent:$,sessions:J,taskAttentionUnreadKeys:Y=[],onSelect:Z,onCancel:X})=>{let[Q,U]=P7(null),[G,z]=P7(!1),K=A7(!1),O=A7(!0);_K(()=>{return O.current=!0,()=>{O.current=!1}},[]);let N=s0()==="session-selector",_=e0(!1);_0((y,B)=>{if(B.ctrl&&y==="c"||B.meta&&y==="c"){_();return}if(K.current)return;if(B.escape&&X){X();return}if(F.length===0)return;if(B.leftArrow||y==="h"||y==="H"){if(R>0)W((R-1)*u$);return}if(B.rightArrow||y==="l"||y==="L"){if(R<b-1)W((R+1)*u$);return}if(B.upArrow||y==="k"){W(R*u$+(w%u$-1+C.length)%C.length);return}if(B.downArrow||y==="j"){W(R*u$+(w%u$+1)%C.length);return}if(/^[1-9]$/.test(y)){let V=C[Number(y)-1];if(V)M(V);return}if(B.return){let V=C[w%u$];if(V)M(V)}},{isActive:N});let F=$2(()=>Q6(J,$),[$,J]),H=$2(()=>uJ($),[$]),P=$2(()=>new Set(Y),[Y]),T=$2(()=>F.map(M1),[F]),w=Math.max(0,Q?.intent===$&&Q.key!==null?T.indexOf(Q.key):-1),L=T[w]??null,R=Math.floor(w/u$),W=(y)=>{U({intent:$,key:T[y]??null})},b=$2(()=>Math.max(1,Math.ceil(F.length/u$)),[F.length]),A=$2(()=>{let y=R*u$;return F.slice(y,y+u$)},[R,F]),C=$2(()=>{return A.map((y)=>{let B=OK(y.lastMessageTime);return{key:M1(y),label:cJ(y,B,$==="resume"&&P.has(hJ(y))),value:y}})},[$,A,P]),S=$2(()=>({start:R*u$+1,end:Math.min((R+1)*u$,F.length)}),[R,F.length]);if(Q?.intent!==$||Q.key!==L)U({intent:$,key:L});let M=(y)=>{if(K.current)return;K.current=!0,z(!0);let B=()=>{if(!O.current)return;K.current=!1,z(!1)};Promise.resolve().then(()=>Z(y.value)).then(B,B)};if(F.length===0)return H$(M2,{flexDirection:"column",paddingX:2,paddingY:1,children:[H$(K1,{color:"yellow",children:"没有找到历史会话"},void 0,!1,void 0,this),H$(K1,{dimColor:!0,children:[`
|
|
161
161
|
`,"提示: 开始一次对话后,会话历史将保存到 ~/.blade/projects/"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this);return H$(M2,{flexDirection:"column",paddingX:2,paddingY:1,children:[H$(K1,{bold:!0,color:"cyan",children:H.title},void 0,!1,void 0,this),H$(K1,{dimColor:!0,children:[`
|
|
162
162
|
`,H.instructions,`
|
|
163
|
-
`]},void 0,!0,void 0,this),H$(M2,{flexDirection:"column",children:y.map((R)=>H$(M2,{children:[H$(OK,{isSelected:R.key===L},void 0,!1,void 0,this),H$(NK,{label:R.label,isSelected:R.key===L},void 0,!1,void 0,this)]},R.key,!0,void 0,this))},void 0,!1,void 0,this),G&&H$(K1,{color:"cyan",children:$==="fork"?"Forking…":"Resuming…"},void 0,!1,void 0,this),H$(M2,{marginTop:1,flexDirection:"column",children:[H$(K1,{dimColor:!0,children:["第 ",C+1,"/",T," 页 · 共 ",F.length," 个会话 · 显示"," ",S.start,"-",S.end]},void 0,!0,void 0,this),T>1&&H$(M2,{marginTop:1,children:[H$(K1,{color:C>0?"cyan":"gray",children:C>0?"<< 上一页":" "},void 0,!1,void 0,this),H$(K1,{children:" "},void 0,!1,void 0,this),H$(K1,{color:C<T-1?"cyan":"gray",children:C<T-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 J4,getInnerHeight as HK,getScrollHeight as WK,Text as T2}from"ink";import FK,{useEffect as M7,useRef as LK,useState as T7}from"react";function b7($=200){return b6("rows",$)}import{jsxDEV as d$,Fragment as wK}from"react/jsx-dev-runtime";var C7=["|","/","-","\\"],D9=FK.memo(()=>{let $=j2(),J=f0(),Y=u2(),Z=b7(),X=V2(),{dismissSideConversation:Q}=O1(),U=s0(),G=LK(null),[z,K]=T7(0),[O,q]=T7(0),N=Math.max(1,Math.floor(Z/2)-3),_=$?.status==="error"||$?.status==="completed"&&Boolean($.response);if(M7(()=>{K(0)},[$?.requestId]),O0((F,H)=>{if(H.escape)return Q(),!0;if(!H.pageDown&&!H.pageUp)return!1;let P=G.current;if(!P)return!1;let M=HK(P),B=Math.max(0,WK(P)-M);return K((L)=>{let C=Math.min(L,B),W=Math.max(1,M-1)*(H.pageDown?1:-1);return Math.max(0,Math.min(B,C+W))}),!0},{isActive:Boolean(_)&&X==="none"&&U==="main-input",priority:30}),M7(()=>{if($?.status!=="loading"){q(0);return}let F=setInterval(()=>{q((H)=>(H+1)%C7.length)},100);return()=>clearInterval(F)},[$?.status]),!$)return null;return d$(J4,{flexDirection:"column",borderStyle:"single",borderColor:J.colors.info,marginX:2,marginBottom:1,paddingX:1,children:[d$(J4,{height:1,flexShrink:0,children:d$(T2,{wrap:"truncate-end",children:[d$(T2,{bold:!0,color:J.colors.info,children:"BTW"},void 0,!1,void 0,this),d$(T2,{color:J.colors.muted,children:[" | ",$.question.replace(/\s+/g," ")]},void 0,!0,void 0,this),$.durationMs!==void 0&&d$(T2,{color:J.colors.muted,dimColor:!0,children:[" ","| ",$.durationMs,"ms"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),$.status==="loading"&&d$(T2,{color:J.colors.text.secondary,children:[C7[O]," Answering..."]},void 0,!0,void 0,this),_&&d$(wK,{children:[d$(J4,{ref:G,flexDirection:"column",maxHeight:N,overflowY:"scroll",scrollTop:z,children:d$(J4,{flexDirection:"column",flexShrink:0,width:"100%",children:$.status==="error"?d$(T2,{color:J.colors.error,children:$.error??"Side conversation failed"},void 0,!1,void 0,this):d$(S1,{content:$.response??"",role:"assistant",terminalWidth:Math.max(1,Y-9),hidePrefix:!0,noMargin:!0,messageId:`side-conversation-${$.requestId}`},void 0,!1,void 0,this)},void 0,!1,void 0,this)},void 0,!1,void 0,this),d$(T2,{color:J.colors.muted,dimColor:!0,wrap:"truncate-end",children:"PgUp/PgDn: scroll side answer · Esc: dismiss"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});D9.displayName="SideConversationPanel";import{Box as q$,Text as t0}from"ink";import{jsxDEV as B0}from"react/jsx-dev-runtime";function y7({onCancel:$}){let J=_1(),Y=s0()==="skills-manager",X=R7({cwd:J}).getAll(),Q=X.filter((K)=>K.source==="builtin"),U=X.filter((K)=>K.source==="user"),G=X.filter((K)=>K.source==="project"),z=e0(!1,$);if(O0((K,O)=>{if(O.escape)$?.();else if(O.ctrl&&K==="c"||O.meta&&K==="c")z()},{isActive:Y}),X.length===0)return B0(q$,{flexDirection:"column",paddingY:1,children:[B0(q$,{marginBottom:1,children:B0(t0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this)},void 0,!1,void 0,this),B0(q$,{paddingLeft:2,children:B0(t0,{color:"gray",children:"没有找到任何 Skill"},void 0,!1,void 0,this)},void 0,!1,void 0,this),B0(q$,{marginTop:1,paddingLeft:2,children:B0(t0,{color:"gray",children:"配置文件位置: ~/.blade/skills/ 或 .blade/skills/"},void 0,!1,void 0,this)},void 0,!1,void 0,this),B0(q$,{marginTop:1,children:B0(t0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return B0(q$,{flexDirection:"column",paddingY:1,children:[B0(q$,{marginBottom:1,children:[B0(t0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this),B0(t0,{color:"gray",children:[" (找到 ",X.length," 个)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),G.length>0&&B0(q$,{flexDirection:"column",marginBottom:1,children:[B0(q$,{paddingLeft:1,children:[B0(t0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),B0(t0,{color:"gray",children:" (.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),G.map((K)=>{let q=K.description.length>80?`${K.description.substring(0,80)}...`:K.description;return B0(q$,{flexDirection:"column",paddingLeft:2,children:[B0(t0,{children:[B0(t0,{bold:!0,color:"green",children:["• ",K.name]},void 0,!0,void 0,this),B0(t0,{color:"gray",children:[" - ",q]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.allowedTools&&K.allowedTools.length>0&&B0(q$,{paddingLeft:2,children:B0(t0,{color:"gray",children:["工具: ",K.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),B0(q$,{paddingLeft:2,children:B0(t0,{color:"gray",dimColor:!0,children:K.path},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},K.name,!0,void 0,this)})]},void 0,!0,void 0,this),U.length>0&&B0(q$,{flexDirection:"column",marginBottom:1,children:[B0(q$,{paddingLeft:1,children:[B0(t0,{bold:!0,color:"yellow",children:"用户级"},void 0,!1,void 0,this),B0(t0,{color:"gray",children:" (~/.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),U.map((K)=>{let q=K.description.length>80?`${K.description.substring(0,80)}...`:K.description;return B0(q$,{flexDirection:"column",paddingLeft:2,children:[B0(t0,{children:[B0(t0,{bold:!0,color:"green",children:["• ",K.name]},void 0,!0,void 0,this),B0(t0,{color:"gray",children:[" - ",q]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.allowedTools&&K.allowedTools.length>0&&B0(q$,{paddingLeft:2,children:B0(t0,{color:"gray",children:["工具: ",K.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),B0(q$,{paddingLeft:2,children:B0(t0,{color:"gray",dimColor:!0,children:K.path},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},K.name,!0,void 0,this)})]},void 0,!0,void 0,this),Q.length>0&&B0(q$,{flexDirection:"column",marginBottom:1,children:[B0(q$,{paddingLeft:1,children:[B0(t0,{bold:!0,color:"cyan",children:"内置"},void 0,!1,void 0,this),B0(t0,{color:"gray",children:" (builtin)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q.map((K)=>{let q=K.description.length>80?`${K.description.substring(0,80)}...`:K.description;return B0(q$,{flexDirection:"column",paddingLeft:2,children:[B0(t0,{children:[B0(t0,{bold:!0,color:"green",children:["• ",K.name]},void 0,!0,void 0,this),B0(t0,{color:"gray",children:[" - ",q]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.userInvocable&&B0(q$,{paddingLeft:2,children:B0(t0,{color:"blue",children:["命令: /",K.name]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},K.name,!0,void 0,this)})]},void 0,!0,void 0,this),B0(q$,{marginTop:1,children:B0(t0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import{Box as I7,Text as z1}from"ink";import BK,{useEffect as AK,useMemo as PK,useState as S7}from"react";import{jsxDEV as T$,Fragment as v9}from"react/jsx-dev-runtime";var k7=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"];function bK($){let J=Math.floor($/1000);if(J<60)return`${J}s`;let Y=Math.floor(J/60),Z=J%60;return`${Y}m ${Z}s`}var f7=BK.memo(()=>{let $=z0((K)=>K.app.subagentProgresses),J=z0((K)=>K.app.subagentProgress),Y=f0(),[Z,X]=S7(0),[Q,U]=S7(()=>Date.now()),G=PK(()=>{let K=Object.values($);return K.length>0?K:J?[J]:[]},[J,$]),z=G.some((K)=>K.status==="running");if(AK(()=>{if(!z){X(0);return}let K=setInterval(()=>{X((q)=>(q+1)%k7.length)},80),O=setInterval(()=>{U(Date.now())},1000);return()=>{clearInterval(K),clearInterval(O)}},[z]),G.length===0)return null;return T$(I7,{paddingX:2,paddingY:0,flexDirection:"column",children:G.map((K)=>{let O=K.status==="running"?k7[Z]:K.status==="completed"?"[OK]":"[X]",q=K.status==="running"?Y.colors.info:K.status==="completed"?Y.colors.success:Y.colors.error,N=Math.max(0,Q-K.startTime);return T$(I7,{flexDirection:"row",gap:1,children:[T$(z1,{color:q,bold:!0,children:O},void 0,!1,void 0,this),T$(z1,{color:Y.colors.muted,children:"Subagent"},void 0,!1,void 0,this),T$(z1,{color:Y.colors.text.primary,bold:!0,children:K.type},void 0,!1,void 0,this),T$(z1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),T$(z1,{color:Y.colors.text.secondary,children:K.description},void 0,!1,void 0,this),K.currentTool&&T$(v9,{children:[T$(z1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),T$(z1,{color:Y.colors.warning,children:K.currentTool},void 0,!1,void 0,this)]},void 0,!0,void 0,this),K.status==="running"&&N>0&&T$(v9,{children:[T$(z1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),T$(z1,{color:Y.colors.info,children:bK(N)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),K.status==="failed"&&K.terminalSummary&&T$(v9,{children:[T$(z1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),T$(z1,{color:Y.colors.error,children:K.terminalSummary},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},K.id,!0,void 0,this)})},void 0,!1,void 0,this)});import{Box as Y8,Text as h1}from"ink";import MK from"react";import{jsxDEV as v$}from"react/jsx-dev-runtime";var V9={idle:"-",running:">",completed:"[OK]",failed:"[X]",deleted:"[X]",leader:"*",cancelled:"[X]",unknown:"?",pending:"-",blocked:"x"},j9=MK.memo(()=>{let $=YJ().filter((Y)=>Y.status!=="deleted"),J=f0();if($.length===0)return null;return v$(Y8,{flexDirection:"column",paddingX:2,children:$.map((Y)=>{let Z=Y.tasks.filter((X)=>X.status==="completed").length;return v$(Y8,{flexDirection:"column",marginBottom:1,children:[v$(Y8,{gap:1,children:[v$(h1,{bold:!0,color:Y.status==="failed"?J.colors.error:Y.status==="completed"?J.colors.success:J.colors.info,children:[V9[Y.status]," Team"]},void 0,!0,void 0,this),v$(h1,{bold:!0,color:J.colors.text.primary,children:Y.name},void 0,!1,void 0,this),v$(h1,{color:J.colors.muted,children:["| ",Y.members.length-1," members | ",Z,"/",Y.tasks.length," ","tasks"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),v$(Y8,{flexDirection:"column",paddingLeft:2,children:[Y.members.filter((X)=>X.status!=="leader").map((X)=>v$(Y8,{gap:1,children:[v$(h1,{color:J.colors.muted,children:V9[X.status]},void 0,!1,void 0,this),v$(h1,{color:J.colors.text.secondary,children:X.name},void 0,!1,void 0,this),v$(h1,{color:J.colors.muted,children:["(",X.subagentType,", ",X.status,X.worktreePath?", worktree":"",")"]},void 0,!0,void 0,this)]},X.id,!0,void 0,this)),Y.tasks.map((X)=>v$(Y8,{gap:1,children:[v$(h1,{color:J.colors.muted,children:V9[X.status]},void 0,!1,void 0,this),v$(h1,{color:J.colors.text.secondary,children:["#",X.id," ",X.subject]},void 0,!0,void 0,this),v$(h1,{color:J.colors.muted,children:["(",X.status,X.owner?`, ${X.owner}`:"",")"]},void 0,!0,void 0,this)]},X.id,!0,void 0,this))]},void 0,!0,void 0,this)]},Y.name,!0,void 0,this)})},void 0,!1,void 0,this)});j9.displayName="TeamProgress";import{useMemoizedFn as TK}from"ahooks";import{Box as W1,Text as G0}from"ink";import CK from"ink-select-input";import{useState as D7}from"react";import{jsxDEV as $0}from"react/jsx-dev-runtime";var v7=C2.map(($)=>({label:$.label,value:$.id})),RK=({theme:$})=>{let{colors:J}=$;return $0(W1,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[$0(G0,{bold:!0,color:J.text.primary,children:"代码预览"},void 0,!1,void 0,this),$0(G0,{children:" "},void 0,!1,void 0,this),$0(G0,{color:J.syntax.comment,children:"# function"},void 0,!1,void 0,this),$0(G0,{children:[$0(G0,{color:J.syntax.keyword,children:"def"},void 0,!1,void 0,this)," ",$0(G0,{color:J.syntax.function,children:"fibonacci"},void 0,!1,void 0,this),$0(G0,{color:J.text.primary,children:"("},void 0,!1,void 0,this),$0(G0,{color:J.syntax.variable,children:"n"},void 0,!1,void 0,this),$0(G0,{color:J.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(G0,{children:[" ",$0(G0,{color:J.syntax.variable,children:"a"},void 0,!1,void 0,this),$0(G0,{color:J.syntax.operator,children:","},void 0,!1,void 0,this)," ",$0(G0,{color:J.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",$0(G0,{color:J.syntax.operator,children:"="},void 0,!1,void 0,this)," ",$0(G0,{color:J.syntax.number,children:"0"},void 0,!1,void 0,this),$0(G0,{color:J.syntax.operator,children:","},void 0,!1,void 0,this)," ",$0(G0,{color:J.syntax.number,children:"1"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(G0,{children:[" ",$0(G0,{color:J.syntax.keyword,children:"for"},void 0,!1,void 0,this)," ",$0(G0,{color:J.syntax.variable,children:"_"},void 0,!1,void 0,this)," ",$0(G0,{color:J.syntax.keyword,children:"in"},void 0,!1,void 0,this)," ",$0(G0,{color:J.syntax.function,children:"range"},void 0,!1,void 0,this),$0(G0,{color:J.text.primary,children:"("},void 0,!1,void 0,this),$0(G0,{color:J.syntax.variable,children:"n"},void 0,!1,void 0,this),$0(G0,{color:J.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(G0,{children:[" ",$0(G0,{color:J.syntax.variable,children:"a"},void 0,!1,void 0,this),$0(G0,{color:J.syntax.operator,children:","},void 0,!1,void 0,this)," ",$0(G0,{color:J.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",$0(G0,{color:J.syntax.operator,children:"="},void 0,!1,void 0,this)," ",$0(G0,{color:J.syntax.variable,children:"b"},void 0,!1,void 0,this),$0(G0,{color:J.syntax.operator,children:","},void 0,!1,void 0,this)," ",$0(G0,{color:J.syntax.variable,children:"a"},void 0,!1,void 0,this)," ",$0(G0,{color:J.syntax.operator,children:"+"},void 0,!1,void 0,this)," ",$0(G0,{color:J.syntax.variable,children:"b"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(G0,{children:[" ",$0(G0,{color:J.syntax.keyword,children:"return"},void 0,!1,void 0,this)," ",$0(G0,{color:J.syntax.variable,children:"a"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(G0,{children:" "},void 0,!1,void 0,this),$0(G0,{color:J.error,children:["- print(",$0(G0,{color:J.syntax.string,children:'"Hello, "'},void 0,!1,void 0,this)," + name)"]},void 0,!0,void 0,this),$0(G0,{color:J.success,children:["+ print(",$0(G0,{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)},yK=({theme:$})=>{let{colors:J}=$;return $0(W1,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[$0(G0,{children:" "},void 0,!1,void 0,this),$0(G0,{bold:!0,color:J.text.primary,children:"颜色配置"},void 0,!1,void 0,this),$0(G0,{children:" "},void 0,!1,void 0,this),$0(G0,{children:[$0(G0,{color:J.text.muted,children:"Primary: "},void 0,!1,void 0,this),$0(G0,{color:J.primary,children:J.primary},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(G0,{children:[$0(G0,{color:J.text.muted,children:"Success: "},void 0,!1,void 0,this),$0(G0,{color:J.success,children:J.success},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(G0,{children:[$0(G0,{color:J.text.muted,children:"Error: "},void 0,!1,void 0,this),$0(G0,{color:J.error,children:J.error},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(G0,{children:[$0(G0,{color:J.text.muted,children:"Warning: "},void 0,!1,void 0,this),$0(G0,{color:J.warning,children:J.warning},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(G0,{children:[$0(G0,{color:J.text.muted,children:"Info: "},void 0,!1,void 0,this),$0(G0,{color:J.info,children:J.info},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},V7=()=>{let $=O1(),J=F$.getCurrentThemeName(),Y=C2.findIndex((F)=>F.label===J),Z=Y>=0?C2[Y].theme:C2[0].theme,[X,Q]=D7(Z),[U,G]=D7(!1),z=TK(async(F)=>{if(U)return;G(!0);try{await K$().setTheme(F.value),$.closeModal()}catch(H){console.error("主题切换失败:",H instanceof Error?H.message:H)}finally{G(!1)}}),K=(F)=>{let H=C2.find((P)=>P.id===F.value);if(H)Q(H.theme)},q=s0()==="theme-selector",N=e0(!1);O0((F,H)=>{if(H.ctrl&&F==="c"||H.meta&&F==="c"){N();return}if(H.escape&&!U)$.closeModal()},{isActive:q});let _=(F)=>{let{isSelected:H,label:P}=F,B=P===J?"[OK]":" ";return $0(G0,{color:H?X.colors.primary:X.colors.text.primary,children:[B," ",P]},void 0,!0,void 0,this)};return $0(W1,{flexDirection:"column",height:"100%",children:[$0(W1,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:X.colors.border.light,children:$0(G0,{bold:!0,color:X.colors.primary,children:"主题选择器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),$0(W1,{flexDirection:"row",flexGrow:1,children:[$0(W1,{width:"40%",borderStyle:"single",borderColor:X.colors.border.light,paddingX:1,children:$0(W1,{flexDirection:"column",children:[$0(W1,{paddingTop:1,paddingBottom:1,children:$0(G0,{bold:!0,color:X.colors.text.primary,children:["可用主题 (",v7.length,")"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),$0(CK,{items:v7,initialIndex:Y>=0?Y:0,onSelect:z,onHighlight:K,itemComponent:_},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),$0(W1,{width:"60%",flexDirection:"column",borderStyle:"single",borderColor:X.colors.border.light,children:[$0(RK,{theme:X},void 0,!1,void 0,this),$0(yK,{theme:X},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$0(W1,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:X.colors.border.light,children:$0(G0,{color:X.colors.text.muted,children:U?"正在保存...":"Enter: 选择主题 | Esc: 取消"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{Box as Y4,Text as L1,useStdout as IK}from"ink";import SK,{useCallback as E1,useEffect as R2,useMemo as h9,useRef as g$,useState as F1}from"react";import{jsxDEV as C$}from"react/jsx-dev-runtime";function j7($,J){let Y=Array.from($.value);return{...$,cursor:Math.max(0,Math.min(Y.length,$.cursor+J))}}function kK($,J,Y){let Z=Array.from($.value);if(Y.leftArrow)return j7($,-1);if(Y.rightArrow)return j7($,1);if(Y.home)return{...$,cursor:0};if(Y.end)return{...$,cursor:Z.length};if(Y.backspace&&$.cursor>0)return Z.splice($.cursor-1,1),{value:Z.join(""),cursor:$.cursor-1};if(Y.delete&&$.cursor<Z.length)return Z.splice($.cursor,1),{value:Z.join(""),cursor:$.cursor};if(Y.ctrl&&J.toLowerCase()==="u")return{value:"",cursor:0};if(Y.ctrl||Y.meta||J.length===0)return $;let X=J.replace(/[\r\n\t]+/g," ");if(X.length===0)return $;let Q=Array.from(X);return Z.splice($.cursor,0,...Q),{value:Z.join(""),cursor:$.cursor+Q.length}}function fK({editor:$}){let J=Array.from($.value),Y=J.slice(0,$.cursor).join(""),Z=J[$.cursor]??" ",X=J.slice($.cursor+1).join("");return C$(L1,{wrap:"truncate-end",children:["/",Y,C$(L1,{inverse:!0,children:Z},void 0,!1,void 0,this),X,C$(L1,{dimColor:!0,children:" · Enter search · Esc cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}function DK({line:$,matches:J,currentMatchIndex:Y,selected:Z,selectedBlock:X,color:Q,highlightColor:U}){let G=H7($,J);if(Z||G.length===0)return C$(L1,{wrap:"truncate-end",color:Q,inverse:Z,bold:X,underline:X,children:$.text||" "},void 0,!1,void 0,this);let z=[],K=0;for(let O of G){if(O.start>K)z.push($.text.slice(K,O.start));z.push(C$(L1,{color:U,bold:!0,inverse:O.matchIndex===Y,children:$.text.slice(O.start,O.end)},`${$.key}:match:${O.matchIndex}`,!1,void 0,this)),K=O.end}if(K<$.text.length)z.push($.text.slice(K));return C$(L1,{wrap:"truncate-end",color:Q,bold:X,underline:X,children:z},void 0,!1,void 0,this)}var h7=SK.memo(({isOpen:$,onClose:J,compact:Y=!1})=>{let Z=V8(),X=a8(),Q=r8(),U=i8(),G=s0(),z=f0(),{stdout:K}=IK(),{width:O,height:q}=l1(),N=Y?Math.max(6,Math.floor(q*0.4)):q,_=Math.max(1,N-3),F=Math.max(12,O-4),H=g$(new Map),P=g$(new k8),[M,B]=F1(new Set),L=g$(M);L.current=M;let C=h9(()=>O7({messages:Z,currentStreamingMessageId:X,streamingLines:U.lines,streamingTail:U.tail,currentThinkingContent:Q}),[Z,X,U.lines,U.tail,Q]),W=h9(()=>{let e=new Set(C.map((k)=>k.id));for(let k of H.current.keys())if(!e.has(k))H.current.delete(k);return C.flatMap((k,j)=>{let m=M.has(k.id),c=H.current.get(k.id),r=c?.revision===k.revision&&c.width===F&&c.expanded===m?c.lines:I9(k,F,m);if(r!==c?.lines)H.current.set(k.id,{revision:k.revision,width:F,expanded:m,lines:r});if(j===C.length-1)return r;return[...r,{key:`${k.id}:separator`,blockId:k.id,role:k.role,kind:k.kind,text:"",copyText:"",pending:k.pending===!0,header:!1,sourceLine:null,sourceStart:0,sourceEnd:0,sourceTextOffset:0}]})},[C,F,M]),[T,w]=F1(0),[y,S]=F1(new Set),[b,R]=F1(null),A=g$(null),[V,o]=F1(!1),d=g$(!1),[J0,Q0]=F1({value:"",cursor:0}),q0=g$(J0),[a,D]=F1(""),[v,K0]=F1(0),h=g$(0),[x,l]=F1(null),H0=g$(null),[F0,T0]=F1(null),I=g$(0),f=g$(null),p=g$(0),E=g$(C),n=g$(W.length),N0=g$(F);p.current=T,A.current=b,d.current=V,q0.current=J0,h.current=v,H0.current=x;let Z0=h9(()=>P.current.search(C,a),[C,a]),C0=Math.max(0,W.length-_),U0=Math.max(0,W.length-T),S0=Math.max(0,U0-_),X0=E1((e)=>{let k=Math.max(0,Math.min(C0,e));if(p.current=k,w(k),k===0)S(new Set)},[C0]),E0=E1((e)=>{if(W.length===0)return;let k=Math.max(0,Math.min(W.length-1,e)),j=Math.max(0,Math.min(W.length-_,k-Math.floor(_/2))),m=Math.min(W.length,j+_);X0(W.length-m)},[W.length,X0,_]),W$=E1((e,k,j)=>{let m=new Set(L.current);if(k)m.add(e);else m.delete(e);L.current=m,f.current=j,B(m)},[]),g0=E1((e)=>{let k=C.find((m)=>m.id===e.blockId);if(k?.collapsible&&!L.current.has(k.id)){W$(k.id,!0,{blockId:k.id,match:e});return}let j=S9(W,e);if(j>=0)E0(j)},[C,W,E0,W$]),O$=E1((e,k=Z0)=>{if(k.length===0){h.current=0,K0(0);return}let j=(e%k.length+k.length)%k.length;h.current=j,K0(j);let m=k[j];A.current=m.blockId,R(m.blockId),g0(m)},[Z0,g0]),l$=E1((e)=>{let k=C.filter((P0)=>P0.collapsible);if(k.length===0)return;let j=k.findIndex((P0)=>P0.id===A.current),m=j<0?e>0?0:k.length-1:(j+e+k.length)%k.length,c=k[m].id;A.current=c,R(c);let r=W.findIndex((P0)=>P0.blockId===c&&P0.header);if(r>=0)E0(r)},[C,W,E0]),r0=E1(()=>{let e=A.current;if(!e)e=W.slice(S0,U0).find((j)=>C.some((m)=>m.id===j.blockId&&m.collapsible))?.blockId??null;if(!e)return;if(!C.find((j)=>j.id===e)?.collapsible)return;A.current=e,R(e),W$(e,!L.current.has(e),{blockId:e})},[C,U0,W,W$,S0]),U$=E1((e,k)=>{let j=H0.current;if(!j||W.length===0)return;let m=k==="top"?0:k==="bottom"?W.length-1:Math.max(0,Math.min(W.length-1,j.head+e)),c={...j,head:m};H0.current=c,l(c),E0(m)},[W.length,E0]),d0=E1(()=>{let e=H0.current;if(!e)return;let k=W7(W,e.anchor,e.head);if(!k.trim()){T0("Nothing selected");return}let j=++I.current;T0("Copying..."),e6(k,{writeTerminal:(m)=>K.write(m)}).then((m)=>{if(I.current!==j)return;T0(m.success?m.method==="osc52"?"Copy sent via OSC 52":`Copied ${k.split(`
|
|
164
|
-
`).length} lines`:"Copy failed"),H0.current=null,l(null)})},[W,K]);R2(()=>{if(!F0)return;let e=setTimeout(()=>T0(null),2500);return()=>clearTimeout(e)},[F0]),R2(()=>{if(!$){I.current++,E.current=C,n.current=W.length;return}L.current=new Set,B(new Set),A.current=null,R(null),d.current=!1,o(!1),q0.current={value:"",cursor:0},Q0({value:"",cursor:0}),D(""),h.current=0,K0(0),H0.current=null,l(null),T0(null),p.current=0,w(0),S(new Set),E.current=C,n.current=W.length,N0.current=F},[$]),R2(()=>{let e=new Set(C.map((k)=>k.id));if(B((k)=>{let j=new Set([...k].filter((c)=>e.has(c)));return L.current=j,j.size===k.size&&[...j].every((c)=>k.has(c))?k:j}),A.current&&!e.has(A.current))A.current=null,R(null)},[C]),R2(()=>{let e=n.current;if(n.current=W.length,!$)return;let k=f.current;if(k){f.current=null;let m=k.match?S9(W,k.match):W.findIndex((c)=>c.blockId===k.blockId&&c.header);if(m>=0)E0(m);return}if(p.current===0){S(new Set);return}let j=Math.max(0,W.length-e);if(j>0)w((m)=>{let c=Math.min(C0,m+j);return p.current=c,c});else if(p.current>C0)p.current=C0,w(C0)},[F,M,$,W.length,C0,E0]),R2(()=>{let e=E.current;if(E.current=C,!$||p.current===0)return;let k=F7(e,C);if(k.length===0)return;S((j)=>{let m=new Set(j);for(let c of k)m.add(c);return m})},[C,$]),R2(()=>{if(Z0.length===0)h.current=0,K0(0);else if(h.current>=Z0.length)h.current=Z0.length-1,K0(Z0.length-1)},[Z0.length]),R2(()=>{if(N0.current===F)return;N0.current=F,H0.current=null,l(null);let e=Z0[h.current];if(e)g0(e)},[F,Z0,g0]),O0((e,k)=>{if(!$)return;let j=k,m=G==="transcript-pager";if((j.ctrl||j.meta)&&e.toLowerCase()==="o")return J(),!0;if(!m){if(j.pageUp)return X0(p.current+Math.max(1,_-1)),!0;if(j.pageDown)return X0(p.current-Math.max(1,_-1)),!0;return!1}if(d.current){if(j.escape)return d.current=!1,o(!1),q0.current={value:a,cursor:Array.from(a).length},Q0(q0.current),!0;if(j.return){let r=q0.current.value,P0=P.current.search(C,r);return D(r),d.current=!1,o(!1),O$(0,P0),!0}let c=kK(q0.current,e,j);return q0.current=c,Q0(c),!0}if(e==="q")return J(),!0;if(H0.current){if(j.escape)return H0.current=null,l(null),!0;if(e==="y"||j.ctrl&&!j.meta&&e.toLowerCase()==="c")return d0(),!0;if(j.upArrow||e==="k")return U$(-1),!0;if(j.downArrow||e==="j")return U$(1),!0;if(j.pageUp)return U$(-Math.max(1,_-1)),!0;if(j.pageDown)return U$(Math.max(1,_-1)),!0;if(j.home||e==="g")return U$(0,"top"),!0;if(j.end||e==="G")return U$(0,"bottom"),!0;return!0}if(j.escape)return J(),!0;if(e==="/"){let c={value:a,cursor:Array.from(a).length};return q0.current=c,Q0(c),d.current=!0,o(!0),!0}if(e==="n"&&Z0.length>0)return O$(h.current+1),!0;if(e==="N"&&Z0.length>0)return O$(h.current-1),!0;if(j.tab)return l$(j.shift?-1:1),!0;if(j.return||e==="e")return r0(),!0;if(e==="v"){if(W.length===0)return!0;let c=Math.max(0,W.length-p.current),r=Math.max(0,c-_),P0=A.current?W.findIndex((P$)=>P$.blockId===A.current&&P$.header):-1,l0=P0>=0?P0:Math.max(0,Math.min(W.length-1,r)),u0={anchor:l0,head:l0};return H0.current=u0,l(u0),E0(l0),!0}if(j.upArrow||e==="k")return X0(p.current+1),!0;if(j.downArrow||e==="j")return X0(p.current-1),!0;if(j.pageUp)return X0(p.current+Math.max(1,_-1)),!0;if(j.pageDown)return X0(p.current-Math.max(1,_-1)),!0;if(j.home||e==="g")return X0(C0),!0;if(j.end||e==="G")return X0(0),!0;return!0},{isActive:$,priority:100});let B1=W.slice(S0,U0),A1=y.size,Z8=W.length===0?"0/0":`${Math.min(U0,W.length)}/${W.length}`,x1=x?Math.min(x.anchor,x.head):-1,S2=x?Math.max(x.anchor,x.head):-1,X2=a.length>0?`/${a} ${Z0.length>0?`${v+1}/${Z0.length}`:"0/0"}`:null,y$=F0?F0:x?`${S2-x1+1} lines selected · y copy · Esc cancel`:X2?`${X2} · n/N`:A1>0?`${A1} new · G latest`:"Ctrl+O / Esc / q close";return C$(Y4,{flexDirection:"column",width:"100%",height:N,paddingX:2,children:[C$(Y4,{justifyContent:"space-between",flexShrink:0,children:[C$(L1,{bold:!0,color:z.colors.primary,children:"Transcript"},void 0,!1,void 0,this),C$(L1,{color:z.colors.text.muted,children:Z8},void 0,!1,void 0,this)]},void 0,!0,void 0,this),C$(Y4,{flexDirection:"column",height:_,flexShrink:0,overflow:"hidden",children:B1.length===0?C$(L1,{color:z.colors.text.muted,children:"No transcript yet"},void 0,!1,void 0,this):B1.map((e,k)=>{let j=S0+k,m=x1>=0&&j>=x1&&j<=S2,c=e.header&&e.blockId===b,r=e.pending?z.colors.warning:e.kind==="thinking"?z.colors.info:e.role==="user"?z.colors.info:e.role==="assistant"?z.colors.success:z.colors.text.secondary;return C$(DK,{line:e,matches:Z0,currentMatchIndex:v,selected:m,selectedBlock:c,color:r,highlightColor:z.colors.warning},e.key,!1,void 0,this)})},void 0,!1,void 0,this),C$(Y4,{flexShrink:0,children:V?C$(fK,{editor:J0},void 0,!1,void 0,this):C$(L1,{color:F0||A1>0?z.colors.warning:z.colors.text.muted,wrap:"truncate-end",children:[y$," · / 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 Y$=N1("UI"),x7=({debug:$,continue:J,...Y})=>{if($)Y$.debug("[Debug] BladeInterface props:",{permissionMode:Y.permissionMode,yolo:Y.yolo,maxTurns:Y.maxTurns,continue:J});let Z=y2(!1),X=y2(!1),Q=y2(!1),U=y2(null),G=y2(!1),z=y2(null);if(!z.current)z.current=new k4;let K=z.current,O=y2(null);if(!O.current)O.current=new D4;let q=O.current,[N,_]=g7(K.getState()),[F,H]=g7(!1),P=i9(),M=o9(),B=V2(),L=s9(),C=e9(),W=h8(),T=p8(),w=zJ(),y=t9(),S=O1(),b=u1(),R=v2(),A=_1(),{stdout:V}=vK(),o=GJ(),d=h2(),J0=UJ();$1(()=>{if(F$.getCurrentThemeName()!==J0)try{F$.setTheme(J0)}catch{}},[J0]);let Q0=P==="ready",q0=P==="needsSetup",a=P==="idle",D=VK(()=>Y.agents?p7(Y.agents):void 0,[Y.agents]),{confirmationState:v,confirmationHandler:K0,handleResponse:h,dismissAll:x}=PY(),{executeCommand:l,handleAbort:H0,isProcessing:F0,cleanupAgent:T0,refreshFollowUpQueue:I,controlFollowUpQueue:f}=wY(Y.systemPrompt,Y.appendSystemPrompt,K0,Y.maxTurns,x,D,{list:()=>q.listAll(),acknowledge:(i)=>q.acknowledge(i),setVisibleLocator:(i)=>i?q.proveLocal(i):q.setVisibleLocator()}),p=i0(async(i)=>{await hJ(i.controller,i.visibility,{continueSession:J===!0,resume:Y.resume,forkSession:Y.forkSession===!0,requestedSessionId:Y.sessionId,locator:{version:2,sessionId:R,workspace:{kind:"local",projectPath:A}}})}),E=i0((i)=>{S.projectTaskAttentionState(i.status,i.unreadKeys,i.sessions)}),n=i0((i)=>{Y$.warn(`[BladeInterface] Task attention ${i} unavailable`)});J3({ready:Q0,lifecycle:q,initialize:p,project:E,report:n});let N0=i0(_),Z0=i0(()=>{Y$.warn("[BladeInterface] Session history shutdown unavailable")});tY({lifecycle:K,project:N0,report:Z0});let{getPreviousCommand:C0,getNextCommand:U0,addToHistory:S0}=BY();lY();let X0=MY("",0),E0=i0(()=>{i$(),V.write(E7.eraseScreen+E7.cursorTo(0,0)),b.incrementClearCount()}),W$=i0(()=>{if(F)return;H(!0)}),g0=i0(()=>{if(!F)return;H(!1)}),O$=i0(()=>{if(F)g0();else W$()});O0((i,A0)=>{if(Q0&&!q0&&(A0.ctrl||A0.meta)&&i.toLowerCase()==="o")return O$(),!0;return!1},{priority:90}),$1(()=>{if(!G.current){G.current=!0;return}E0()},[E0,F]);let l$=i0(async()=>{let i=d,A0;if(i==="default")A0="autoEdit";else if(i==="autoEdit")A0="plan";else if(i==="plan")A0="default";else A0="default";try{await a0.setSessionPermissionMode(R,A,A0),await K$().setPermissionMode(A0)}catch(N$){Y$.error("权限模式切换失败:",N$ instanceof Error?N$.message:N$)}}),r0=i0(async(i)=>{try{let A0={displayName:i.displayName,provider:i.provider,model:i.model,overrides:i.overrides};if(i.modelProvider)await K$().addModelWithProvider(A0,i.modelProvider);else await K$().addModel(A0);S.setInitializationStatus("ready")}catch(A0){throw Y$.error("初始化配置保存失败:",A0 instanceof Error?A0.message:A0),A0}}),U$=i0(()=>{if(B==="shortcuts")S.closeModal();else S.setActiveModal("shortcuts")}),d0=i0(async()=>{try{await gJ(q.visibility(),{version:2,sessionId:R,workspace:{kind:"local",projectPath:A}})}catch{Y$.warn("[BladeInterface] Task attention fallback visibility unavailable")}}),B1=i0(async(i,A0,N$)=>{return z6({intent:A0,session:i,newSessionId:N$?.newSessionId,announceFork:N$?.announceFork,permissionModeOverride:Y.permissionMode},A,b,T0)}),A1=i0(async(i,A0,N$)=>{await oJ(i,A0,{openHistory:(f2,c1)=>{S.showSessionHistoryViewer(f2,c1)},activateLocal:async(f2,c1)=>{await K.closeView();let G4=await B1(f2,c1,N$);try{await EJ(c1,i,G4,q.visibility())}catch{Y$.warn("[BladeInterface] Task attention local activation unavailable")}S.closeModal()}},N$)}),Z8=i0(async(i,A0)=>{let c1=(await K6(A0,A,q)).filter((G4)=>G4.locator.sessionId===i);if(c1.length===0)throw Error(`Session not found: ${i}`);if(c1.length>1)throw Error(`Multiple workspaces contain session ${i}; use the session selector`);return c1[0]}),{showSuggestions:x1,suggestions:S2,selectedSuggestionIndex:X2}=cY(X0,l,C0,U0,S0,H0,F0,l$,U$,B==="shortcuts",B==="sessionHistoryViewer");$1(()=>{if(X0.value&&B==="shortcuts")S.closeModal()},[X0.value,B,S]),$1(()=>{if(B==="followUpQueue")I()},[B,I]);let y$=i0(async()=>{Q.current=!0;try{let i=Y.forkSession?"fork":"resume",A0=await K6(i,A,q);if(A0.length===0){if(Y.forkSession){Y$.error("没有可供 fork 的历史会话"),J1(1);return}b.addAssistantMessage("没有找到历史会话,开始新对话。"),await d0();return}let N$=pJ(A0);if(!N$){if(Y.forkSession){Y$.error("没有可供 fork 的本地历史会话"),J1(1);return}b.addAssistantMessage("没有找到本地历史会话,开始新对话。"),await d0();return}await A1(N$,i,{newSessionId:Y.forkSession?Y.sessionId:void 0,announceFork:Y.forkSession?!1:void 0})}catch(i){if(Y$.error("[BladeInterface] 继续会话失败:",i),Y.forkSession){J1(1);return}b.addAssistantMessage("继续会话失败,开始新对话。"),await d0()}}),e=i0(async()=>{Q.current=!0;try{if(typeof Y.resume==="string"&&Y.resume!=="true"){let N$=Y.forkSession?"fork":"resume",f2=await Z8(Y.resume,N$);await A1(f2,N$,{newSessionId:Y.forkSession?Y.sessionId:void 0,announceFork:Y.forkSession?!1:void 0});return}let i=Y.forkSession?"fork":"resume",A0=await K6(i,A,q);if(A0.length===0)Y$.error("没有找到历史会话"),J1(1);S.showSessionSelector(A0,i)}catch(i){Y$.error("[BladeInterface] 加载会话失败:",i),J1(1)}});$1(()=>{if(Z.current)return;if(J){Z.current=!0,y$();return}if(Y.resume)Z.current=!0,e()},[J,Y.resume,y$,e]);let k=i0(async(i)=>{let A0=v.details?.type;if(A0==="enterPlanMode"&&i.approved)try{await a0.setSessionPermissionMode(R,A,"plan"),await K$().setPermissionMode("plan"),Y$.debug("[BladeInterface] Entered Plan mode")}catch(N$){Y$.error("[BladeInterface] Failed to enter Plan mode:",N$)}if(A0==="exitPlanMode"&&i.approved)Y$.debug("[BladeInterface] ExitPlanMode approved, Store auto-synced");h(i)}),j=i0(()=>{b.addAssistantMessage("设置已取消"),b.addAssistantMessage("Blade 需要 API 配置才能正常工作。"),b.addAssistantMessage("您可以稍后运行 Blade 重新进入设置向导。"),J1(0)}),m=i0(()=>{K.closeView().catch(()=>{Y$.warn("[BladeInterface] Session history close unavailable")}),S.closeModal()}),c=i0(async(i)=>{try{let A0=L?.intent??"resume";await A1(i,A0,{newSessionId:A0==="fork"&&Y.forkSession?Y.sessionId:void 0})}catch(A0){Y$.error("[BladeInterface] Failed to restore session:",A0),b.addAssistantMessage(`会话操作失败: ${A0 instanceof Error?A0.message:"未知错误"}`),S.closeModal()}}),r=i0(()=>{if(K.closeView().catch(()=>{Y$.warn("[BladeInterface] Session history close unavailable")}),Y.resume)J1(0);else S.closeModal()});$1(()=>{if(B==="sessionHistoryViewer"&&C){nY(K,q,C).catch(()=>{Y$.warn("[BladeInterface] Session history activation unavailable")});return}if(K.cancelRemoteRequest(),q.endRemote().catch(()=>{Y$.warn("[BladeInterface] Task attention visibility unavailable")}),K.getState().status!=="idle")K.closeView().catch(()=>{Y$.warn("[BladeInterface] Session history close unavailable")})},[B,K,C,q]),$1(()=>{if(!C)return;q.updateRemote(C,N).catch(()=>{Y$.warn("[BladeInterface] Task attention acknowledgement unavailable")})},[N,C,q]);let P0=i0((i)=>{S.showModelEditWizard(i)}),l0=i0((i)=>{b.addAssistantMessage(`已添加模型配置: ${i.displayName??i.model},并已切换到该模型`),m()}),u0=i0((i)=>{b.addAssistantMessage(`已更新模型配置: ${i.displayName??i.model}`),m()});$1(()=>{if(q0){o.setFocus("model-config-wizard");return}if(v.isVisible)o.setFocus("confirmation-prompt");else if(B==="sessionSelector")o.setFocus("session-selector");else if(B==="sessionHistoryViewer")o.setFocus("session-history-viewer");else if(B==="followUpQueue")o.setFocus("follow-up-queue");else if(B==="themeSelector")o.setFocus("theme-selector");else if(B==="modelSelector")o.setFocus("model-selector");else if(B==="modelAddWizard"||B==="modelEditWizard")o.setFocus("model-config-wizard");else if(B==="permissionsManager")o.setFocus("permissions-manager");else if(B==="agentsManager")o.setFocus("agents-manager");else if(B==="agentCreationWizard")o.setFocus("agent-creation-wizard");else if(B==="skillsManager")o.setFocus("skills-manager");else if(B==="pluginsManager")o.setFocus("plugins-manager");else if(B==="hooksManager")o.setFocus("hooks-manager");else if(F)o.setFocus("transcript-pager");else if(B==="shortcuts")o.setFocus("main-input");else o.setFocus("main-input")},[q0,v.isVisible,B,F,o.setFocus]),$1(()=>{if(!Q0||Q.current)return;if(m7().length>0){Q.current=!0;return}Q.current=!0,b.addAssistantMessage("请输入您的问题,我将为您提供帮助。")},[Q0]),$1(()=>{if(!M)return;if(U.current===M)return;if(U.current=M,P==="error")b.addAssistantMessage(`初始化失败: ${M}`);else b.addAssistantMessage(`${M}`),b.addAssistantMessage("请重新尝试设置,或检查文件权限")},[M,P,b.addAssistantMessage]);let P$=i0(async(i)=>{try{await l({displayText:i,text:i,images:[],parts:[{type:"text",text:i}]})}catch(A0){let N$=A0 instanceof Error?A0.message:"无法发送初始消息";b.addAssistantMessage(`初始消息发送失败:${N$}`)}});$1(()=>{let i=Y.initialMessage?.trim();if(!i||X.current||!Q0||q0)return;X.current=!0,S0(i),P$(i)},[Y.initialMessage,Q0,q0,l,S0]);let q1=i0(async(i)=>{try{await K$().setPermissionMode(i)}catch(A0){Y$.error("权限模式初始化失败:",A0 instanceof Error?A0.message:A0)}});if($1(()=>{let i=Y.permissionMode;if($)Y$.debug("[Debug] permissionMode from CLI:",i),Y$.debug("[Debug] current permissionMode:",d);if(!i||i===d)return;q1(i)},[Y.permissionMode,d]),a)return null;if(q0)return h0(C9,{mode:"setup",onComplete:r0,onCancel:j},void 0,!1,void 0,this);if($)Y$.debug("[Debug] 渲染主界面,条件检查:",{confirmationVisible:v.isVisible,activeModal:B});let Z2=B==="modelSelector",w$=y,r$=B==="modelAddWizard"?"add":B==="modelEditWizard"&&w$?"edit":null,_$=Z2||Boolean(r$),P1=B==="agentsManager",b1=B==="agentCreationWizard",Z$=B==="skillsManager",k2=B==="pluginsManager",QX=w$?{displayName:w$.displayName,provider:w$.provider,model:w$.model,overrides:w$.overrides}:void 0,m9=v.isVisible&&v.details?v.details.type==="mcpElicitation"&&v.details.mcpElicitation?h0(R5,{details:v.details.mcpElicitation,onComplete:(i,A0)=>k({approved:i.action==="accept",elicitation:i,...A0?{openExternalUrl:!0}:{}})},void 0,!1,void 0,this):v.details.type==="askUserQuestion"&&v.details.questions?h0(z7,{questions:v.details.questions,onComplete:(i)=>k({approved:!0,answers:i}),onCancel:()=>k({approved:!1})},void 0,!1,void 0,this):h0(u3,{details:v.details,onResponse:k},void 0,!1,void 0,this):B==="themeSelector"?h0(V7,{},void 0,!1,void 0,this):B==="permissionsManager"?h0(J7,{onClose:m},void 0,!1,void 0,this):B==="sessionSelector"?h0(P7,{intent:L?.intent??"resume",sessions:L?.sessions??[],taskAttentionUnreadKeys:W,onSelect:c,onCancel:r},void 0,!1,void 0,this):B==="sessionHistoryViewer"?h0(w7,{state:N,onLoadOlder:(i)=>K.loadOlder(i),onFork:(i)=>K.fork(i),onClose:m},void 0,!1,void 0,this):B==="followUpQueue"?h0(d3,{queue:T,mutation:w,onMutate:f,onRefresh:I,onClose:m},void 0,!1,void 0,this):B==="hooksManager"?h0(r3,{workspaceRoot:A,sessionId:R,onClose:m},void 0,!1,void 0,this):null,D8=Boolean(m9);return h0(g1,{flexDirection:"column",width:"100%",overflow:"hidden",children:[m9,h0(g1,{flexDirection:"column",display:D8||F?"none":"flex",children:[h0(V5,{active:!D8&&!F},void 0,!1,void 0,this),h0(f7,{},void 0,!1,void 0,this),h0(j9,{},void 0,!1,void 0,this),h0(D9,{},void 0,!1,void 0,this),h0(b5,{paused:D8||F},void 0,!1,void 0,this),h0(N5,{input:X0.value,cursorPosition:X0.cursorPosition,onChange:X0.setValue,onChangeCursorPosition:X0.setCursorPosition,onAddPasteMapping:X0.addPasteMapping,onAddImagePasteMapping:X0.addImagePasteMapping,disabled:B==="sessionHistoryViewer"},void 0,!1,void 0,this),Z2&&h0(g1,{marginTop:1,paddingX:2,children:h0(j5,{onClose:m,onEdit:P0},void 0,!1,void 0,this)},void 0,!1,void 0,this),r$&&h0(g1,{marginTop:1,paddingX:2,children:h0(C9,{mode:r$,modelId:w$?.id,initialConfig:r$==="edit"?QX:void 0,onComplete:r$==="edit"?u0:l0,onCancel:m},void 0,!1,void 0,this)},void 0,!1,void 0,this),P1&&h0(g1,{marginTop:1,paddingX:2,children:h0(q3,{workspaceRoot:A,onComplete:m,onCancel:m},void 0,!1,void 0,this)},void 0,!1,void 0,this),b1&&h0(g1,{marginTop:1,paddingX:2,children:h0(L8,{onComplete:m,onCancel:m},void 0,!1,void 0,this)},void 0,!1,void 0,this),Z$&&h0(g1,{marginTop:1,paddingX:2,children:h0(y7,{onComplete:m,onCancel:m},void 0,!1,void 0,this)},void 0,!1,void 0,this),k2&&h0(g1,{marginTop:1,paddingX:2,children:h0(K7,{workspaceRoot:A,onComplete:m,onCancel:m},void 0,!1,void 0,this)},void 0,!1,void 0,this),h0(L3,{suggestions:S2,selectedIndex:X2,visible:x1&&!_$},void 0,!1,void 0,this),h0(F3,{},void 0,!1,void 0,this)]},void 0,!0,void 0,this),h0(g1,{flexDirection:"column",display:F?"flex":"none",children:h0(h7,{isOpen:F,compact:D8,onClose:g0},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{Box as jK,Text as J2}from"ink";import hK from"react";import{jsxDEV as m1}from"react/jsx-dev-runtime";class f8 extends hK.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 m1(jK,{flexDirection:"column",padding:1,borderStyle:"round",borderColor:"red",children:[m1(J2,{color:"red",children:"应用发生错误"},void 0,!1,void 0,this),m1(J2,{children:" "},void 0,!1,void 0,this),m1(J2,{color:"red",children:this.state.error?.message},void 0,!1,void 0,this),m1(J2,{children:" "},void 0,!1,void 0,this),m1(J2,{color:"gray",children:"错误详情:"},void 0,!1,void 0,this),m1(J2,{color:"gray",children:this.state.error?.stack},void 0,!1,void 0,this),m1(J2,{children:" "},void 0,!1,void 0,this),m1(J2,{color:"yellow",children:"请重启应用或联系开发者"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return this.props.children}}import{Box as I2,Text as p1}from"ink";import{useState as E9}from"react";import{jsxDEV as R$}from"react/jsx-dev-runtime";var X4=[{key:"update",label:"Update now",description:`runs \`${u7()}\``},{key:"skip",label:"Skip",description:""},{key:"skip_until_next",label:"Skip until next version",description:""}],l7=({versionInfo:$,onComplete:J})=>{let[Y,Z]=E9(0),[X,Q]=E9(!1),[U,G]=E9(null);O0((K,O)=>{if(O.ctrl&&K==="c"){H8().shutdown("SIGINT",0);return}if(X||U)return;if(O.upArrow||K==="k")Z((q)=>q>0?q-1:X4.length-1);else if(O.downArrow||K==="j")Z((q)=>q<X4.length-1?q+1:0);else if(O.return)z(X4[Y].key);else if(K==="1")z("update");else if(K==="2")z("skip");else if(K==="3")z("skip_until_next")});let z=async(K)=>{switch(K){case"update":{Q(!0);let O=await d7();G(O.message),setTimeout(()=>{H8().shutdown("SIGINT",0)},1500);break}case"skip":J();break;case"skip_until_next":if($.latestVersion)await c7($.latestVersion);J();break}};if(U)return R$(I2,{flexDirection:"column",marginY:1,children:R$(p1,{children:U},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(X)return R$(I2,{flexDirection:"column",marginY:1,children:R$(p1,{color:"cyan",children:"Updating..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);return R$(I2,{flexDirection:"column",marginY:1,children:[R$(p1,{color:"yellow",bold:!0,children:["Update available! ",R$(p1,{color:"gray",children:[$.currentVersion," ","->"," ",$.latestVersion]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),R$(I2,{marginTop:1,children:R$(p1,{color:"gray",children:["Release notes:"," ",R$(p1,{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$(I2,{flexDirection:"column",marginTop:1,children:X4.map((K,O)=>{let q=O===Y,N=q?"› ":" ",_=`${O+1}. `;return R$(I2,{children:R$(p1,{color:q?"cyan":void 0,children:[N,_,K.label,K.description&&R$(p1,{color:"gray",children:[" (",K.description,")"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},K.key,!1,void 0,this)})},void 0,!1,void 0,this),R$(I2,{marginTop:1,children:R$(p1,{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 Z4,Text as X8}from"ink";import{useState as r7}from"react";import{jsxDEV as w1}from"react/jsx-dev-runtime";var a7=({status:$,onTrust:J,onContinueSafely:Y})=>{let Z=F$.getTheme(),[X,Q]=r7(!1),[U,G]=r7(null);return O0((z,K)=>{if(X)return;if(K.return||z.toLowerCase()==="t"){Q(!0),G(null),J().catch((O)=>{G(O instanceof Error?O.message:"Failed to trust workspace"),Q(!1)});return}if(z.toLowerCase()==="s"||K.escape)Q(!0),G(null),Y().catch((O)=>{G(O instanceof Error?O.message:"Failed to continue safely"),Q(!1)})}),w1(Z4,{flexDirection:"column",paddingX:1,children:[w1(X8,{bold:!0,color:Z.colors.warning,children:"Workspace review required"},void 0,!1,void 0,this),w1(X8,{dimColor:!0,children:$.projectPath},void 0,!1,void 0,this),w1(Z4,{marginTop:1,flexDirection:"column",children:[w1(X8,{children:"This project contains configuration that can change models, start MCP processes, relax permissions, inject environment variables, or load instructions, commands, skills, agents, and plugins."},void 0,!1,void 0,this),$.sources.map((z)=>w1(X8,{children:[" ",z.path," · ",z.effects.length," effect(s)"]},`${z.kind}:${z.path}`,!0,void 0,this))]},void 0,!0,void 0,this),U&&w1(Z4,{marginTop:1,children:w1(X8,{color:Z.colors.error,children:U},void 0,!1,void 0,this)},void 0,!1,void 0,this),w1(Z4,{marginTop:1,children:w1(X8,{bold:!0,children:X?"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 gK}from"react";function i7(){let{stdout:$}=EK();gK(()=>{if(!$.isTTY)return;return $.write(o3),$.write(G9),()=>{$.write(n3),$.write(G9)}},[$])}function o7($){return($ instanceof Error?$.message:String($)).replace(/sk-[a-zA-Z0-9]{32,}/g,"sk-***").replace(/apiKey['":\s]+[a-zA-Z0-9-_]+/gi,"apiKey: ***").replace(/API_KEY['":\s=]+[a-zA-Z0-9-_]+/gi,"API_KEY=***")}function mK($){return $.forkSession?void 0:$.resumeSessionId}function n7($,J){let Y=mK($);if(Y)J(Y)}import{jsxDEV as Y2}from"react/jsx-dev-runtime";function xK($){if(m0().config.actions.setConfig($),$.debug)console.log("[Debug] 模型配置检查通过,准备就绪");L$().setInitializationStatus("ready")}var cK=($)=>{i7();let[J,Y]=U4(!1),[Z,X]=U4(null),[Q,U]=U4(!1),[G,z]=U4(null),K=Q4((_,F)=>{let H=_ instanceof Error?_.message:String(_);if(L$().setInitializationError(H),L$().setInitializationStatus("error"),Y(!0),F)console.error("[FAIL] 应用初始化失败:",H)}),O=Q4(async()=>{try{let _=m0().config.config??s7,F=e7(_,$);if(xK(F),n7(F,(P)=>{$X().restoreSession(P,[])}),F.debug)console.error("[Debug] 运行时配置:",F);let H=F.codeTheme;if(H&&F$.hasTheme(H)){if(F$.setTheme(H),$.debug)console.log(`[OK] 已加载主题: ${H}`)}try{j$.getInstance().loadConfig(F.hooks||{},G$());let M=await JX(G$());if($.debug&&F.hooks?.enabled)console.log("[OK] Hooks 系统已启用");if($.debug)console.log(`[OK] Workspace resources: ${M.subagents.getAllNames().length} agents, ${M.skills.size} skills, ${M.commands.getCommandCount()+M.commands.getPluginCommandCount()} commands, ${M.plugins.getAll().length} plugins`);let L=m0().session.sessionId;t7(L)}catch(P){if($.debug)console.warn("Hooks 初始化失败:",o7(P))}_6(async()=>{await XX.getInstance().killAll(),await YX.getInstance().disconnectAll(),j$.getInstance().cleanup()}),Y(!0)}catch(_){K(_,!!$.debug)}}),q=Q4(async()=>{let _=await g9.getInstance().getStatus(G$());if(_.state==="untrusted"||_.state==="error"){z(_);return}await O()}),N=Q4(async()=>{if($.versionCheckPromise){let _=await $.versionCheckPromise;if(_){X(_),U(!0);return}}await q()});if(pK(()=>{N()},[]),Q&&Z)return Y2(f8,{children:Y2(l7,{versionInfo:Z,onComplete:()=>{U(!1),q()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(G)return Y2(f8,{children:Y2(a7,{status:G,onTrust:async()=>{await g9.getInstance().trust(G$()),await ZX(),z(null),await O()},onContinueSafely:async()=>{z(null),await O()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(!J)return null;return Y2(f8,{children:Y2(x7,{...$},void 0,!1,void 0,this)},void 0,!1,void 0,this)},SP=($)=>Y2(RY,{children:Y2(cK,{...$},void 0,!1,void 0,this)},void 0,!1,void 0,this);export{SP as AppWrapper};
|
|
163
|
+
`]},void 0,!0,void 0,this),H$(M2,{flexDirection:"column",children:C.map((y)=>H$(M2,{children:[H$(NK,{isSelected:y.key===L},void 0,!1,void 0,this),H$(HK,{label:y.label,isSelected:y.key===L},void 0,!1,void 0,this)]},y.key,!0,void 0,this))},void 0,!1,void 0,this),G&&H$(K1,{color:"cyan",children:$==="fork"?"Forking…":"Resuming…"},void 0,!1,void 0,this),H$(M2,{marginTop:1,flexDirection:"column",children:[H$(K1,{dimColor:!0,children:["第 ",R+1,"/",b," 页 · 共 ",F.length," 个会话 · 显示"," ",S.start,"-",S.end]},void 0,!0,void 0,this),b>1&&H$(M2,{marginTop:1,children:[H$(K1,{color:R>0?"cyan":"gray",children:R>0?"<< 上一页":" "},void 0,!1,void 0,this),H$(K1,{children:" "},void 0,!1,void 0,this),H$(K1,{color:R<b-1?"cyan":"gray",children:R<b-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 J4,getInnerHeight as WK,getScrollHeight as FK,Text as T2}from"ink";import LK,{useEffect as T7,useRef as wK,useState as C7}from"react";function M7($=200){return b6("rows",$)}import{jsxDEV as d$,Fragment as BK}from"react/jsx-dev-runtime";var R7=["|","/","-","\\"],D9=LK.memo(()=>{let $=j2(),J=f0(),Y=u2(),Z=M7(),X=V2(),{dismissSideConversation:Q}=O1(),U=s0(),G=wK(null),[z,K]=C7(0),[O,q]=C7(0),N=Math.max(1,Math.floor(Z/2)-3),_=$?.status==="error"||$?.status==="completed"&&Boolean($.response);if(T7(()=>{K(0)},[$?.requestId]),_0((F,H)=>{if(H.escape)return Q(),!0;if(!H.pageDown&&!H.pageUp)return!1;let P=G.current;if(!P)return!1;let T=WK(P),w=Math.max(0,FK(P)-T);return K((L)=>{let R=Math.min(L,w),W=Math.max(1,T-1)*(H.pageDown?1:-1);return Math.max(0,Math.min(w,R+W))}),!0},{isActive:Boolean(_)&&X==="none"&&U==="main-input",priority:30}),T7(()=>{if($?.status!=="loading"){q(0);return}let F=setInterval(()=>{q((H)=>(H+1)%R7.length)},100);return()=>clearInterval(F)},[$?.status]),!$)return null;return d$(J4,{flexDirection:"column",borderStyle:"single",borderColor:J.colors.info,marginX:2,marginBottom:1,paddingX:1,children:[d$(J4,{height:1,flexShrink:0,children:d$(T2,{wrap:"truncate-end",children:[d$(T2,{bold:!0,color:J.colors.info,children:"BTW"},void 0,!1,void 0,this),d$(T2,{color:J.colors.muted,children:[" | ",$.question.replace(/\s+/g," ")]},void 0,!0,void 0,this),$.durationMs!==void 0&&d$(T2,{color:J.colors.muted,dimColor:!0,children:[" ","| ",$.durationMs,"ms"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),$.status==="loading"&&d$(T2,{color:J.colors.text.secondary,children:[R7[O]," Answering..."]},void 0,!0,void 0,this),_&&d$(BK,{children:[d$(J4,{ref:G,flexDirection:"column",maxHeight:N,overflowY:"scroll",scrollTop:z,children:d$(J4,{flexDirection:"column",flexShrink:0,width:"100%",children:$.status==="error"?d$(T2,{color:J.colors.error,children:$.error??"Side conversation failed"},void 0,!1,void 0,this):d$(S1,{content:$.response??"",role:"assistant",terminalWidth:Math.max(1,Y-9),hidePrefix:!0,noMargin:!0,messageId:`side-conversation-${$.requestId}`},void 0,!1,void 0,this)},void 0,!1,void 0,this)},void 0,!1,void 0,this),d$(T2,{color:J.colors.muted,dimColor:!0,wrap:"truncate-end",children:"PgUp/PgDn: scroll side answer · Esc: dismiss"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});D9.displayName="SideConversationPanel";import{Box as q$,Text as t0}from"ink";import{jsxDEV as B0}from"react/jsx-dev-runtime";function I7({onCancel:$}){let J=_1(),Y=s0()==="skills-manager",X=y7({cwd:J}).getAll(),Q=X.filter((K)=>K.source==="builtin"),U=X.filter((K)=>K.source==="user"),G=X.filter((K)=>K.source==="project"),z=e0(!1,$);if(_0((K,O)=>{if(O.escape)$?.();else if(O.ctrl&&K==="c"||O.meta&&K==="c")z()},{isActive:Y}),X.length===0)return B0(q$,{flexDirection:"column",paddingY:1,children:[B0(q$,{marginBottom:1,children:B0(t0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this)},void 0,!1,void 0,this),B0(q$,{paddingLeft:2,children:B0(t0,{color:"gray",children:"没有找到任何 Skill"},void 0,!1,void 0,this)},void 0,!1,void 0,this),B0(q$,{marginTop:1,paddingLeft:2,children:B0(t0,{color:"gray",children:"配置文件位置: ~/.blade/skills/ 或 .blade/skills/"},void 0,!1,void 0,this)},void 0,!1,void 0,this),B0(q$,{marginTop:1,children:B0(t0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return B0(q$,{flexDirection:"column",paddingY:1,children:[B0(q$,{marginBottom:1,children:[B0(t0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this),B0(t0,{color:"gray",children:[" (找到 ",X.length," 个)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),G.length>0&&B0(q$,{flexDirection:"column",marginBottom:1,children:[B0(q$,{paddingLeft:1,children:[B0(t0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),B0(t0,{color:"gray",children:" (.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),G.map((K)=>{let q=K.description.length>80?`${K.description.substring(0,80)}...`:K.description;return B0(q$,{flexDirection:"column",paddingLeft:2,children:[B0(t0,{children:[B0(t0,{bold:!0,color:"green",children:["• ",K.name]},void 0,!0,void 0,this),B0(t0,{color:"gray",children:[" - ",q]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.allowedTools&&K.allowedTools.length>0&&B0(q$,{paddingLeft:2,children:B0(t0,{color:"gray",children:["工具: ",K.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),B0(q$,{paddingLeft:2,children:B0(t0,{color:"gray",dimColor:!0,children:K.path},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},K.name,!0,void 0,this)})]},void 0,!0,void 0,this),U.length>0&&B0(q$,{flexDirection:"column",marginBottom:1,children:[B0(q$,{paddingLeft:1,children:[B0(t0,{bold:!0,color:"yellow",children:"用户级"},void 0,!1,void 0,this),B0(t0,{color:"gray",children:" (~/.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),U.map((K)=>{let q=K.description.length>80?`${K.description.substring(0,80)}...`:K.description;return B0(q$,{flexDirection:"column",paddingLeft:2,children:[B0(t0,{children:[B0(t0,{bold:!0,color:"green",children:["• ",K.name]},void 0,!0,void 0,this),B0(t0,{color:"gray",children:[" - ",q]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.allowedTools&&K.allowedTools.length>0&&B0(q$,{paddingLeft:2,children:B0(t0,{color:"gray",children:["工具: ",K.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),B0(q$,{paddingLeft:2,children:B0(t0,{color:"gray",dimColor:!0,children:K.path},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},K.name,!0,void 0,this)})]},void 0,!0,void 0,this),Q.length>0&&B0(q$,{flexDirection:"column",marginBottom:1,children:[B0(q$,{paddingLeft:1,children:[B0(t0,{bold:!0,color:"cyan",children:"内置"},void 0,!1,void 0,this),B0(t0,{color:"gray",children:" (builtin)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q.map((K)=>{let q=K.description.length>80?`${K.description.substring(0,80)}...`:K.description;return B0(q$,{flexDirection:"column",paddingLeft:2,children:[B0(t0,{children:[B0(t0,{bold:!0,color:"green",children:["• ",K.name]},void 0,!0,void 0,this),B0(t0,{color:"gray",children:[" - ",q]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.userInvocable&&B0(q$,{paddingLeft:2,children:B0(t0,{color:"blue",children:["命令: /",K.name]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},K.name,!0,void 0,this)})]},void 0,!0,void 0,this),B0(q$,{marginTop:1,children:B0(t0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import{Box as S7,Text as z1}from"ink";import AK,{useEffect as PK,useMemo as bK,useState as k7}from"react";import{jsxDEV as C$,Fragment as v9}from"react/jsx-dev-runtime";var f7=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"];function MK($){let J=Math.floor($/1000);if(J<60)return`${J}s`;let Y=Math.floor(J/60),Z=J%60;return`${Y}m ${Z}s`}var D7=AK.memo(()=>{let $=z0((K)=>K.app.subagentProgresses),J=z0((K)=>K.app.subagentProgress),Y=f0(),[Z,X]=k7(0),[Q,U]=k7(()=>Date.now()),G=bK(()=>{let K=Object.values($);return K.length>0?K:J?[J]:[]},[J,$]),z=G.some((K)=>K.status==="running");if(PK(()=>{if(!z){X(0);return}let K=setInterval(()=>{X((q)=>(q+1)%f7.length)},80),O=setInterval(()=>{U(Date.now())},1000);return()=>{clearInterval(K),clearInterval(O)}},[z]),G.length===0)return null;return C$(S7,{paddingX:2,paddingY:0,flexDirection:"column",children:G.map((K)=>{let O=K.status==="running"?f7[Z]:K.status==="completed"?"[OK]":"[X]",q=K.status==="running"?Y.colors.info:K.status==="completed"?Y.colors.success:Y.colors.error,N=Math.max(0,Q-K.startTime);return C$(S7,{flexDirection:"row",gap:1,children:[C$(z1,{color:q,bold:!0,children:O},void 0,!1,void 0,this),C$(z1,{color:Y.colors.muted,children:"Subagent"},void 0,!1,void 0,this),C$(z1,{color:Y.colors.text.primary,bold:!0,children:K.type},void 0,!1,void 0,this),C$(z1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),C$(z1,{color:Y.colors.text.secondary,children:K.description},void 0,!1,void 0,this),K.currentTool&&C$(v9,{children:[C$(z1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),C$(z1,{color:Y.colors.warning,children:K.currentTool},void 0,!1,void 0,this)]},void 0,!0,void 0,this),K.status==="running"&&N>0&&C$(v9,{children:[C$(z1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),C$(z1,{color:Y.colors.info,children:MK(N)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),K.status==="failed"&&K.terminalSummary&&C$(v9,{children:[C$(z1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),C$(z1,{color:Y.colors.error,children:K.terminalSummary},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},K.id,!0,void 0,this)})},void 0,!1,void 0,this)});import{Box as Y8,Text as h1}from"ink";import TK from"react";import{jsxDEV as V$}from"react/jsx-dev-runtime";var V9={idle:"-",running:">",completed:"[OK]",failed:"[X]",deleted:"[X]",leader:"*",cancelled:"[X]",unknown:"?",pending:"-",blocked:"x"},j9=TK.memo(()=>{let $=XJ().filter((Y)=>Y.status!=="deleted"),J=f0();if($.length===0)return null;return V$(Y8,{flexDirection:"column",paddingX:2,children:$.map((Y)=>{let Z=Y.tasks.filter((X)=>X.status==="completed").length;return V$(Y8,{flexDirection:"column",marginBottom:1,children:[V$(Y8,{gap:1,children:[V$(h1,{bold:!0,color:Y.status==="failed"?J.colors.error:Y.status==="completed"?J.colors.success:J.colors.info,children:[V9[Y.status]," Team"]},void 0,!0,void 0,this),V$(h1,{bold:!0,color:J.colors.text.primary,children:Y.name},void 0,!1,void 0,this),V$(h1,{color:J.colors.muted,children:["| ",Y.members.length-1," members | ",Z,"/",Y.tasks.length," ","tasks"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),V$(Y8,{flexDirection:"column",paddingLeft:2,children:[Y.members.filter((X)=>X.status!=="leader").map((X)=>V$(Y8,{gap:1,children:[V$(h1,{color:J.colors.muted,children:V9[X.status]},void 0,!1,void 0,this),V$(h1,{color:J.colors.text.secondary,children:X.name},void 0,!1,void 0,this),V$(h1,{color:J.colors.muted,children:["(",X.subagentType,", ",X.status,X.worktreePath?", worktree":"",")"]},void 0,!0,void 0,this)]},X.id,!0,void 0,this)),Y.tasks.map((X)=>V$(Y8,{gap:1,children:[V$(h1,{color:J.colors.muted,children:V9[X.status]},void 0,!1,void 0,this),V$(h1,{color:J.colors.text.secondary,children:["#",X.id," ",X.subject]},void 0,!0,void 0,this),V$(h1,{color:J.colors.muted,children:["(",X.status,X.owner?`, ${X.owner}`:"",")"]},void 0,!0,void 0,this)]},X.id,!0,void 0,this))]},void 0,!0,void 0,this)]},Y.name,!0,void 0,this)})},void 0,!1,void 0,this)});j9.displayName="TeamProgress";import{useMemoizedFn as CK}from"ahooks";import{Box as W1,Text as G0}from"ink";import RK from"ink-select-input";import{useState as v7}from"react";import{jsxDEV as J0}from"react/jsx-dev-runtime";var V7=C2.map(($)=>({label:$.label,value:$.id})),yK=({theme:$})=>{let{colors:J}=$;return J0(W1,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[J0(G0,{bold:!0,color:J.text.primary,children:"代码预览"},void 0,!1,void 0,this),J0(G0,{children:" "},void 0,!1,void 0,this),J0(G0,{color:J.syntax.comment,children:"# function"},void 0,!1,void 0,this),J0(G0,{children:[J0(G0,{color:J.syntax.keyword,children:"def"},void 0,!1,void 0,this)," ",J0(G0,{color:J.syntax.function,children:"fibonacci"},void 0,!1,void 0,this),J0(G0,{color:J.text.primary,children:"("},void 0,!1,void 0,this),J0(G0,{color:J.syntax.variable,children:"n"},void 0,!1,void 0,this),J0(G0,{color:J.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),J0(G0,{children:[" ",J0(G0,{color:J.syntax.variable,children:"a"},void 0,!1,void 0,this),J0(G0,{color:J.syntax.operator,children:","},void 0,!1,void 0,this)," ",J0(G0,{color:J.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",J0(G0,{color:J.syntax.operator,children:"="},void 0,!1,void 0,this)," ",J0(G0,{color:J.syntax.number,children:"0"},void 0,!1,void 0,this),J0(G0,{color:J.syntax.operator,children:","},void 0,!1,void 0,this)," ",J0(G0,{color:J.syntax.number,children:"1"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),J0(G0,{children:[" ",J0(G0,{color:J.syntax.keyword,children:"for"},void 0,!1,void 0,this)," ",J0(G0,{color:J.syntax.variable,children:"_"},void 0,!1,void 0,this)," ",J0(G0,{color:J.syntax.keyword,children:"in"},void 0,!1,void 0,this)," ",J0(G0,{color:J.syntax.function,children:"range"},void 0,!1,void 0,this),J0(G0,{color:J.text.primary,children:"("},void 0,!1,void 0,this),J0(G0,{color:J.syntax.variable,children:"n"},void 0,!1,void 0,this),J0(G0,{color:J.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),J0(G0,{children:[" ",J0(G0,{color:J.syntax.variable,children:"a"},void 0,!1,void 0,this),J0(G0,{color:J.syntax.operator,children:","},void 0,!1,void 0,this)," ",J0(G0,{color:J.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",J0(G0,{color:J.syntax.operator,children:"="},void 0,!1,void 0,this)," ",J0(G0,{color:J.syntax.variable,children:"b"},void 0,!1,void 0,this),J0(G0,{color:J.syntax.operator,children:","},void 0,!1,void 0,this)," ",J0(G0,{color:J.syntax.variable,children:"a"},void 0,!1,void 0,this)," ",J0(G0,{color:J.syntax.operator,children:"+"},void 0,!1,void 0,this)," ",J0(G0,{color:J.syntax.variable,children:"b"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),J0(G0,{children:[" ",J0(G0,{color:J.syntax.keyword,children:"return"},void 0,!1,void 0,this)," ",J0(G0,{color:J.syntax.variable,children:"a"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),J0(G0,{children:" "},void 0,!1,void 0,this),J0(G0,{color:J.error,children:["- print(",J0(G0,{color:J.syntax.string,children:'"Hello, "'},void 0,!1,void 0,this)," + name)"]},void 0,!0,void 0,this),J0(G0,{color:J.success,children:["+ print(",J0(G0,{color:J.syntax.string,children:['f"Hello, ',"{","name","}",'"']},void 0,!0,void 0,this),")"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},IK=({theme:$})=>{let{colors:J}=$;return J0(W1,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[J0(G0,{children:" "},void 0,!1,void 0,this),J0(G0,{bold:!0,color:J.text.primary,children:"颜色配置"},void 0,!1,void 0,this),J0(G0,{children:" "},void 0,!1,void 0,this),J0(G0,{children:[J0(G0,{color:J.text.muted,children:"Primary: "},void 0,!1,void 0,this),J0(G0,{color:J.primary,children:J.primary},void 0,!1,void 0,this)]},void 0,!0,void 0,this),J0(G0,{children:[J0(G0,{color:J.text.muted,children:"Success: "},void 0,!1,void 0,this),J0(G0,{color:J.success,children:J.success},void 0,!1,void 0,this)]},void 0,!0,void 0,this),J0(G0,{children:[J0(G0,{color:J.text.muted,children:"Error: "},void 0,!1,void 0,this),J0(G0,{color:J.error,children:J.error},void 0,!1,void 0,this)]},void 0,!0,void 0,this),J0(G0,{children:[J0(G0,{color:J.text.muted,children:"Warning: "},void 0,!1,void 0,this),J0(G0,{color:J.warning,children:J.warning},void 0,!1,void 0,this)]},void 0,!0,void 0,this),J0(G0,{children:[J0(G0,{color:J.text.muted,children:"Info: "},void 0,!1,void 0,this),J0(G0,{color:J.info,children:J.info},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},j7=()=>{let $=O1(),J=F$.getCurrentThemeName(),Y=C2.findIndex((F)=>F.label===J),Z=Y>=0?C2[Y].theme:C2[0].theme,[X,Q]=v7(Z),[U,G]=v7(!1),z=CK(async(F)=>{if(U)return;G(!0);try{await K$().setTheme(F.value),$.closeModal()}catch(H){console.error("主题切换失败:",H instanceof Error?H.message:H)}finally{G(!1)}}),K=(F)=>{let H=C2.find((P)=>P.id===F.value);if(H)Q(H.theme)},q=s0()==="theme-selector",N=e0(!1);_0((F,H)=>{if(H.ctrl&&F==="c"||H.meta&&F==="c"){N();return}if(H.escape&&!U)$.closeModal()},{isActive:q});let _=(F)=>{let{isSelected:H,label:P}=F,w=P===J?"[OK]":" ";return J0(G0,{color:H?X.colors.primary:X.colors.text.primary,children:[w," ",P]},void 0,!0,void 0,this)};return J0(W1,{flexDirection:"column",height:"100%",children:[J0(W1,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:X.colors.border.light,children:J0(G0,{bold:!0,color:X.colors.primary,children:"主题选择器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),J0(W1,{flexDirection:"row",flexGrow:1,children:[J0(W1,{width:"40%",borderStyle:"single",borderColor:X.colors.border.light,paddingX:1,children:J0(W1,{flexDirection:"column",children:[J0(W1,{paddingTop:1,paddingBottom:1,children:J0(G0,{bold:!0,color:X.colors.text.primary,children:["可用主题 (",V7.length,")"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),J0(RK,{items:V7,initialIndex:Y>=0?Y:0,onSelect:z,onHighlight:K,itemComponent:_},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),J0(W1,{width:"60%",flexDirection:"column",borderStyle:"single",borderColor:X.colors.border.light,children:[J0(yK,{theme:X},void 0,!1,void 0,this),J0(IK,{theme:X},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),J0(W1,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:X.colors.border.light,children:J0(G0,{color:X.colors.text.muted,children:U?"正在保存...":"Enter: 选择主题 | Esc: 取消"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{Box as Y4,Text as L1,useStdout as SK}from"ink";import kK,{useCallback as E1,useEffect as R2,useMemo as h9,useRef as g$,useState as F1}from"react";import{jsxDEV as R$}from"react/jsx-dev-runtime";function h7($,J){let Y=Array.from($.value);return{...$,cursor:Math.max(0,Math.min(Y.length,$.cursor+J))}}function fK($,J,Y){let Z=Array.from($.value);if(Y.leftArrow)return h7($,-1);if(Y.rightArrow)return h7($,1);if(Y.home)return{...$,cursor:0};if(Y.end)return{...$,cursor:Z.length};if(Y.backspace&&$.cursor>0)return Z.splice($.cursor-1,1),{value:Z.join(""),cursor:$.cursor-1};if(Y.delete&&$.cursor<Z.length)return Z.splice($.cursor,1),{value:Z.join(""),cursor:$.cursor};if(Y.ctrl&&J.toLowerCase()==="u")return{value:"",cursor:0};if(Y.ctrl||Y.meta||J.length===0)return $;let X=J.replace(/[\r\n\t]+/g," ");if(X.length===0)return $;let Q=Array.from(X);return Z.splice($.cursor,0,...Q),{value:Z.join(""),cursor:$.cursor+Q.length}}function DK({editor:$}){let J=Array.from($.value),Y=J.slice(0,$.cursor).join(""),Z=J[$.cursor]??" ",X=J.slice($.cursor+1).join("");return R$(L1,{wrap:"truncate-end",children:["/",Y,R$(L1,{inverse:!0,children:Z},void 0,!1,void 0,this),X,R$(L1,{dimColor:!0,children:" · Enter search · Esc cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}function vK({line:$,matches:J,currentMatchIndex:Y,selected:Z,selectedBlock:X,color:Q,highlightColor:U}){let G=W7($,J);if(Z||G.length===0)return R$(L1,{wrap:"truncate-end",color:Q,inverse:Z,bold:X,underline:X,children:$.text||" "},void 0,!1,void 0,this);let z=[],K=0;for(let O of G){if(O.start>K)z.push($.text.slice(K,O.start));z.push(R$(L1,{color:U,bold:!0,inverse:O.matchIndex===Y,children:$.text.slice(O.start,O.end)},`${$.key}:match:${O.matchIndex}`,!1,void 0,this)),K=O.end}if(K<$.text.length)z.push($.text.slice(K));return R$(L1,{wrap:"truncate-end",color:Q,bold:X,underline:X,children:z},void 0,!1,void 0,this)}var E7=kK.memo(({isOpen:$,onClose:J,compact:Y=!1})=>{let Z=V8(),X=a8(),Q=r8(),U=i8(),G=s0(),z=f0(),{stdout:K}=SK(),{width:O,height:q}=l1(),N=Y?Math.max(6,Math.floor(q*0.4)):q,_=Math.max(1,N-3),F=Math.max(12,O-4),H=g$(new Map),P=g$(new k8),[T,w]=F1(new Set),L=g$(T);L.current=T;let R=h9(()=>N7({messages:Z,currentStreamingMessageId:X,streamingLines:U.lines,streamingTail:U.tail,currentThinkingContent:Q}),[Z,X,U.lines,U.tail,Q]),W=h9(()=>{let e=new Set(R.map((k)=>k.id));for(let k of H.current.keys())if(!e.has(k))H.current.delete(k);return R.flatMap((k,j)=>{let m=T.has(k.id),c=H.current.get(k.id),r=c?.revision===k.revision&&c.width===F&&c.expanded===m?c.lines:I9(k,F,m);if(r!==c?.lines)H.current.set(k.id,{revision:k.revision,width:F,expanded:m,lines:r});if(j===R.length-1)return r;return[...r,{key:`${k.id}:separator`,blockId:k.id,role:k.role,kind:k.kind,text:"",copyText:"",pending:k.pending===!0,header:!1,sourceLine:null,sourceStart:0,sourceEnd:0,sourceTextOffset:0}]})},[R,F,T]),[b,A]=F1(0),[C,S]=F1(new Set),[M,y]=F1(null),B=g$(null),[V,o]=F1(!1),a=g$(!1),[Y0,Q0]=F1({value:"",cursor:0}),N0=g$(Y0),[d,D]=F1(""),[v,K0]=F1(0),h=g$(0),[x,l]=F1(null),W0=g$(null),[L0,T0]=F1(null),I=g$(0),f=g$(null),p=g$(0),E=g$(R),n=g$(W.length),H0=g$(F);p.current=b,B.current=M,a.current=V,N0.current=Y0,h.current=v,W0.current=x;let Z0=h9(()=>P.current.search(R,d),[R,d]),C0=Math.max(0,W.length-_),U0=Math.max(0,W.length-b),S0=Math.max(0,U0-_),X0=E1((e)=>{let k=Math.max(0,Math.min(C0,e));if(p.current=k,A(k),k===0)S(new Set)},[C0]),E0=E1((e)=>{if(W.length===0)return;let k=Math.max(0,Math.min(W.length-1,e)),j=Math.max(0,Math.min(W.length-_,k-Math.floor(_/2))),m=Math.min(W.length,j+_);X0(W.length-m)},[W.length,X0,_]),W$=E1((e,k,j)=>{let m=new Set(L.current);if(k)m.add(e);else m.delete(e);L.current=m,f.current=j,w(m)},[]),g0=E1((e)=>{let k=R.find((m)=>m.id===e.blockId);if(k?.collapsible&&!L.current.has(k.id)){W$(k.id,!0,{blockId:k.id,match:e});return}let j=S9(W,e);if(j>=0)E0(j)},[R,W,E0,W$]),O$=E1((e,k=Z0)=>{if(k.length===0){h.current=0,K0(0);return}let j=(e%k.length+k.length)%k.length;h.current=j,K0(j);let m=k[j];B.current=m.blockId,y(m.blockId),g0(m)},[Z0,g0]),l$=E1((e)=>{let k=R.filter((P0)=>P0.collapsible);if(k.length===0)return;let j=k.findIndex((P0)=>P0.id===B.current),m=j<0?e>0?0:k.length-1:(j+e+k.length)%k.length,c=k[m].id;B.current=c,y(c);let r=W.findIndex((P0)=>P0.blockId===c&&P0.header);if(r>=0)E0(r)},[R,W,E0]),r0=E1(()=>{let e=B.current;if(!e)e=W.slice(S0,U0).find((j)=>R.some((m)=>m.id===j.blockId&&m.collapsible))?.blockId??null;if(!e)return;if(!R.find((j)=>j.id===e)?.collapsible)return;B.current=e,y(e),W$(e,!L.current.has(e),{blockId:e})},[R,U0,W,W$,S0]),U$=E1((e,k)=>{let j=W0.current;if(!j||W.length===0)return;let m=k==="top"?0:k==="bottom"?W.length-1:Math.max(0,Math.min(W.length-1,j.head+e)),c={...j,head:m};W0.current=c,l(c),E0(m)},[W.length,E0]),d0=E1(()=>{let e=W0.current;if(!e)return;let k=F7(W,e.anchor,e.head);if(!k.trim()){T0("Nothing selected");return}let j=++I.current;T0("Copying..."),e6(k,{writeTerminal:(m)=>K.write(m)}).then((m)=>{if(I.current!==j)return;T0(m.success?m.method==="osc52"?"Copy sent via OSC 52":`Copied ${k.split(`
|
|
164
|
+
`).length} lines`:"Copy failed"),W0.current=null,l(null)})},[W,K]);R2(()=>{if(!L0)return;let e=setTimeout(()=>T0(null),2500);return()=>clearTimeout(e)},[L0]),R2(()=>{if(!$){I.current++,E.current=R,n.current=W.length;return}L.current=new Set,w(new Set),B.current=null,y(null),a.current=!1,o(!1),N0.current={value:"",cursor:0},Q0({value:"",cursor:0}),D(""),h.current=0,K0(0),W0.current=null,l(null),T0(null),p.current=0,A(0),S(new Set),E.current=R,n.current=W.length,H0.current=F},[$]),R2(()=>{let e=new Set(R.map((k)=>k.id));if(w((k)=>{let j=new Set([...k].filter((c)=>e.has(c)));return L.current=j,j.size===k.size&&[...j].every((c)=>k.has(c))?k:j}),B.current&&!e.has(B.current))B.current=null,y(null)},[R]),R2(()=>{let e=n.current;if(n.current=W.length,!$)return;let k=f.current;if(k){f.current=null;let m=k.match?S9(W,k.match):W.findIndex((c)=>c.blockId===k.blockId&&c.header);if(m>=0)E0(m);return}if(p.current===0){S(new Set);return}let j=Math.max(0,W.length-e);if(j>0)A((m)=>{let c=Math.min(C0,m+j);return p.current=c,c});else if(p.current>C0)p.current=C0,A(C0)},[F,T,$,W.length,C0,E0]),R2(()=>{let e=E.current;if(E.current=R,!$||p.current===0)return;let k=L7(e,R);if(k.length===0)return;S((j)=>{let m=new Set(j);for(let c of k)m.add(c);return m})},[R,$]),R2(()=>{if(Z0.length===0)h.current=0,K0(0);else if(h.current>=Z0.length)h.current=Z0.length-1,K0(Z0.length-1)},[Z0.length]),R2(()=>{if(H0.current===F)return;H0.current=F,W0.current=null,l(null);let e=Z0[h.current];if(e)g0(e)},[F,Z0,g0]),_0((e,k)=>{if(!$)return;let j=k,m=G==="transcript-pager";if((j.ctrl||j.meta)&&e.toLowerCase()==="o")return J(),!0;if(!m){if(j.pageUp)return X0(p.current+Math.max(1,_-1)),!0;if(j.pageDown)return X0(p.current-Math.max(1,_-1)),!0;return!1}if(a.current){if(j.escape)return a.current=!1,o(!1),N0.current={value:d,cursor:Array.from(d).length},Q0(N0.current),!0;if(j.return){let r=N0.current.value,P0=P.current.search(R,r);return D(r),a.current=!1,o(!1),O$(0,P0),!0}let c=fK(N0.current,e,j);return N0.current=c,Q0(c),!0}if(e==="q")return J(),!0;if(W0.current){if(j.escape)return W0.current=null,l(null),!0;if(e==="y"||j.ctrl&&!j.meta&&e.toLowerCase()==="c")return d0(),!0;if(j.upArrow||e==="k")return U$(-1),!0;if(j.downArrow||e==="j")return U$(1),!0;if(j.pageUp)return U$(-Math.max(1,_-1)),!0;if(j.pageDown)return U$(Math.max(1,_-1)),!0;if(j.home||e==="g")return U$(0,"top"),!0;if(j.end||e==="G")return U$(0,"bottom"),!0;return!0}if(j.escape)return J(),!0;if(e==="/"){let c={value:d,cursor:Array.from(d).length};return N0.current=c,Q0(c),a.current=!0,o(!0),!0}if(e==="n"&&Z0.length>0)return O$(h.current+1),!0;if(e==="N"&&Z0.length>0)return O$(h.current-1),!0;if(j.tab)return l$(j.shift?-1:1),!0;if(j.return||e==="e")return r0(),!0;if(e==="v"){if(W.length===0)return!0;let c=Math.max(0,W.length-p.current),r=Math.max(0,c-_),P0=B.current?W.findIndex((b$)=>b$.blockId===B.current&&b$.header):-1,l0=P0>=0?P0:Math.max(0,Math.min(W.length-1,r)),u0={anchor:l0,head:l0};return W0.current=u0,l(u0),E0(l0),!0}if(j.upArrow||e==="k")return X0(p.current+1),!0;if(j.downArrow||e==="j")return X0(p.current-1),!0;if(j.pageUp)return X0(p.current+Math.max(1,_-1)),!0;if(j.pageDown)return X0(p.current-Math.max(1,_-1)),!0;if(j.home||e==="g")return X0(C0),!0;if(j.end||e==="G")return X0(0),!0;return!0},{isActive:$,priority:100});let B1=W.slice(S0,U0),A1=C.size,Z8=W.length===0?"0/0":`${Math.min(U0,W.length)}/${W.length}`,x1=x?Math.min(x.anchor,x.head):-1,S2=x?Math.max(x.anchor,x.head):-1,X2=d.length>0?`/${d} ${Z0.length>0?`${v+1}/${Z0.length}`:"0/0"}`:null,I$=L0?L0:x?`${S2-x1+1} lines selected · y copy · Esc cancel`:X2?`${X2} · n/N`:A1>0?`${A1} new · G latest`:"Ctrl+O / Esc / q close";return R$(Y4,{flexDirection:"column",width:"100%",height:N,paddingX:2,children:[R$(Y4,{justifyContent:"space-between",flexShrink:0,children:[R$(L1,{bold:!0,color:z.colors.primary,children:"Transcript"},void 0,!1,void 0,this),R$(L1,{color:z.colors.text.muted,children:Z8},void 0,!1,void 0,this)]},void 0,!0,void 0,this),R$(Y4,{flexDirection:"column",height:_,flexShrink:0,overflow:"hidden",children:B1.length===0?R$(L1,{color:z.colors.text.muted,children:"No transcript yet"},void 0,!1,void 0,this):B1.map((e,k)=>{let j=S0+k,m=x1>=0&&j>=x1&&j<=S2,c=e.header&&e.blockId===M,r=e.pending?z.colors.warning:e.kind==="thinking"?z.colors.info:e.role==="user"?z.colors.info:e.role==="assistant"?z.colors.success:z.colors.text.secondary;return R$(vK,{line:e,matches:Z0,currentMatchIndex:v,selected:m,selectedBlock:c,color:r,highlightColor:z.colors.warning},e.key,!1,void 0,this)})},void 0,!1,void 0,this),R$(Y4,{flexShrink:0,children:V?R$(DK,{editor:Y0},void 0,!1,void 0,this):R$(L1,{color:L0||A1>0?z.colors.warning:z.colors.text.muted,wrap:"truncate-end",children:[I$," · / search · Tab/Enter expand · v/y copy · j/k PgUp/PgDn g/G"]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{jsxDEV as h0}from"react/jsx-dev-runtime";var Y$=N1("UI"),c7=({debug:$,continue:J,...Y})=>{if($)Y$.debug("[Debug] BladeInterface props:",{permissionMode:Y.permissionMode,yolo:Y.yolo,maxTurns:Y.maxTurns,continue:J});let Z=y2(!1),X=y2(!1),Q=y2(!1),U=y2(null),G=y2(!1),z=y2(null);if(!z.current)z.current=new k4;let K=z.current,O=y2(null);if(!O.current)O.current=new D4;let q=O.current,[N,_]=m7(K.getState()),[F,H]=m7(!1),P=o9(),T=n9(),w=V2(),L=e9(),R=$J(),W=h8(),b=p8(),A=qJ(),C=s9(),S=O1(),M=u1(),y=v2(),B=_1(),{stdout:V}=VK(),o=KJ(),a=h2(),Y0=GJ();$1(()=>{if(F$.getCurrentThemeName()!==Y0)try{F$.setTheme(Y0)}catch{}},[Y0]);let Q0=P==="ready",N0=P==="needsSetup",d=P==="idle",D=jK(()=>Y.agents?x7(Y.agents):void 0,[Y.agents]),{confirmationState:v,confirmationHandler:K0,handleResponse:h,dismissAll:x}=bY(),{executeCommand:l,handleAbort:W0,isProcessing:L0,cleanupAgent:T0,refreshFollowUpQueue:I,controlFollowUpQueue:f}=BY(Y.systemPrompt,Y.appendSystemPrompt,K0,Y.maxTurns,x,D,{list:()=>q.listAll(),acknowledge:(i)=>q.acknowledge(i),setVisibleLocator:(i)=>i?q.proveLocal(i):q.setVisibleLocator()}),p=i0(async(i)=>{await EJ(i.controller,i.visibility,{continueSession:J===!0,resume:Y.resume,forkSession:Y.forkSession===!0,requestedSessionId:Y.sessionId,locator:{version:2,sessionId:y,workspace:{kind:"local",projectPath:B}}})}),E=i0((i)=>{S.projectTaskAttentionState(i.status,i.unreadKeys,i.sessions)}),n=i0((i)=>{Y$.warn(`[BladeInterface] Task attention ${i} unavailable`)});Y3({ready:Q0,lifecycle:q,initialize:p,project:E,report:n});let H0=i0(_),Z0=i0(()=>{Y$.warn("[BladeInterface] Session history shutdown unavailable")});sY({lifecycle:K,project:H0,report:Z0});let{getPreviousCommand:C0,getNextCommand:U0,addToHistory:S0}=AY();rY();let X0=TY("",0),E0=i0(()=>{i$(),V.write(g7.eraseScreen+g7.cursorTo(0,0)),M.incrementClearCount()}),W$=i0(()=>{if(F)return;H(!0)}),g0=i0(()=>{if(!F)return;H(!1)}),O$=i0(()=>{if(F)g0();else W$()});_0((i,A0)=>{if(Q0&&!N0&&(A0.ctrl||A0.meta)&&i.toLowerCase()==="o")return O$(),!0;return!1},{priority:90}),$1(()=>{if(!G.current){G.current=!0;return}E0()},[E0,F]);let l$=i0(async()=>{let i=a,A0;if(i==="default")A0="autoEdit";else if(i==="autoEdit")A0="plan";else if(i==="plan")A0="default";else A0="default";try{await a0.setSessionPermissionMode(y,B,A0),await K$().setPermissionMode(A0)}catch(N$){Y$.error("权限模式切换失败:",N$ instanceof Error?N$.message:N$)}}),r0=i0(async(i)=>{try{let A0={displayName:i.displayName,provider:i.provider,model:i.model,overrides:i.overrides};if(i.modelProvider)await K$().addModelWithProvider(A0,i.modelProvider);else await K$().addModel(A0);S.setInitializationStatus("ready")}catch(A0){throw Y$.error("初始化配置保存失败:",A0 instanceof Error?A0.message:A0),A0}}),U$=i0(()=>{if(w==="shortcuts")S.closeModal();else S.setActiveModal("shortcuts")}),d0=i0(async()=>{try{await mJ(q.visibility(),{version:2,sessionId:y,workspace:{kind:"local",projectPath:B}})}catch{Y$.warn("[BladeInterface] Task attention fallback visibility unavailable")}}),B1=i0(async(i,A0,N$)=>{return z6({intent:A0,session:i,newSessionId:N$?.newSessionId,announceFork:N$?.announceFork,permissionModeOverride:Y.permissionMode},B,M,T0)}),A1=i0(async(i,A0,N$)=>{await nJ(i,A0,{openHistory:(f2,c1)=>{S.showSessionHistoryViewer(f2,c1)},activateLocal:async(f2,c1)=>{await K.closeView();let G4=await B1(f2,c1,N$);try{await gJ(c1,i,G4,q.visibility())}catch{Y$.warn("[BladeInterface] Task attention local activation unavailable")}S.closeModal()}},N$)}),Z8=i0(async(i,A0)=>{let c1=(await K6(A0,B,q)).filter((G4)=>G4.locator.sessionId===i);if(c1.length===0)throw Error(`Session not found: ${i}`);if(c1.length>1)throw Error(`Multiple workspaces contain session ${i}; use the session selector`);return c1[0]}),{showSuggestions:x1,suggestions:S2,selectedSuggestionIndex:X2}=uY(X0,l,C0,U0,S0,W0,L0,l$,U$,w==="shortcuts",w==="sessionHistoryViewer");$1(()=>{if(X0.value&&w==="shortcuts")S.closeModal()},[X0.value,w,S]),$1(()=>{if(w==="followUpQueue")I()},[w,I]);let I$=i0(async()=>{Q.current=!0;try{let i=Y.forkSession?"fork":"resume",A0=await K6(i,B,q);if(A0.length===0){if(Y.forkSession){Y$.error("没有可供 fork 的历史会话"),J1(1);return}M.addAssistantMessage("没有找到历史会话,开始新对话。"),await d0();return}let N$=xJ(A0);if(!N$){if(Y.forkSession){Y$.error("没有可供 fork 的本地历史会话"),J1(1);return}M.addAssistantMessage("没有找到本地历史会话,开始新对话。"),await d0();return}await A1(N$,i,{newSessionId:Y.forkSession?Y.sessionId:void 0,announceFork:Y.forkSession?!1:void 0})}catch(i){if(Y$.error("[BladeInterface] 继续会话失败:",i),Y.forkSession){J1(1);return}M.addAssistantMessage("继续会话失败,开始新对话。"),await d0()}}),e=i0(async()=>{Q.current=!0;try{if(typeof Y.resume==="string"&&Y.resume!=="true"){let N$=Y.forkSession?"fork":"resume",f2=await Z8(Y.resume,N$);await A1(f2,N$,{newSessionId:Y.forkSession?Y.sessionId:void 0,announceFork:Y.forkSession?!1:void 0});return}let i=Y.forkSession?"fork":"resume",A0=await K6(i,B,q);if(A0.length===0)Y$.error("没有找到历史会话"),J1(1);S.showSessionSelector(A0,i)}catch(i){Y$.error("[BladeInterface] 加载会话失败:",i),J1(1)}});$1(()=>{if(Z.current)return;if(J){Z.current=!0,I$();return}if(Y.resume)Z.current=!0,e()},[J,Y.resume,I$,e]);let k=i0(async(i)=>{let A0=v.details?.type;if(A0==="enterPlanMode"&&i.approved)try{await a0.setSessionPermissionMode(y,B,"plan"),await K$().setPermissionMode("plan"),Y$.debug("[BladeInterface] Entered Plan mode")}catch(N$){Y$.error("[BladeInterface] Failed to enter Plan mode:",N$)}if(A0==="exitPlanMode"&&i.approved)Y$.debug("[BladeInterface] ExitPlanMode approved, Store auto-synced");h(i)}),j=i0(()=>{M.addAssistantMessage("设置已取消"),M.addAssistantMessage("Blade 需要 API 配置才能正常工作。"),M.addAssistantMessage("您可以稍后运行 Blade 重新进入设置向导。"),J1(0)}),m=i0(()=>{K.closeView().catch(()=>{Y$.warn("[BladeInterface] Session history close unavailable")}),S.closeModal()}),c=i0(async(i)=>{try{let A0=L?.intent??"resume";await A1(i,A0,{newSessionId:A0==="fork"&&Y.forkSession?Y.sessionId:void 0})}catch(A0){Y$.error("[BladeInterface] Failed to restore session:",A0),M.addAssistantMessage(`会话操作失败: ${A0 instanceof Error?A0.message:"未知错误"}`),S.closeModal()}}),r=i0(()=>{if(K.closeView().catch(()=>{Y$.warn("[BladeInterface] Session history close unavailable")}),Y.resume)J1(0);else S.closeModal()});$1(()=>{if(w==="sessionHistoryViewer"&&R){tY(K,q,R).catch(()=>{Y$.warn("[BladeInterface] Session history activation unavailable")});return}if(K.cancelRemoteRequest(),q.endRemote().catch(()=>{Y$.warn("[BladeInterface] Task attention visibility unavailable")}),K.getState().status!=="idle")K.closeView().catch(()=>{Y$.warn("[BladeInterface] Session history close unavailable")})},[w,K,R,q]),$1(()=>{if(!R)return;q.updateRemote(R,N).catch(()=>{Y$.warn("[BladeInterface] Task attention acknowledgement unavailable")})},[N,R,q]);let P0=i0((i)=>{S.showModelEditWizard(i)}),l0=i0((i)=>{M.addAssistantMessage(`已添加模型配置: ${i.displayName??i.model},并已切换到该模型`),m()}),u0=i0((i)=>{M.addAssistantMessage(`已更新模型配置: ${i.displayName??i.model}`),m()});$1(()=>{if(N0){o.setFocus("model-config-wizard");return}if(v.isVisible)o.setFocus("confirmation-prompt");else if(w==="sessionSelector")o.setFocus("session-selector");else if(w==="sessionHistoryViewer")o.setFocus("session-history-viewer");else if(w==="followUpQueue")o.setFocus("follow-up-queue");else if(w==="themeSelector")o.setFocus("theme-selector");else if(w==="modelSelector")o.setFocus("model-selector");else if(w==="modelAddWizard"||w==="modelEditWizard")o.setFocus("model-config-wizard");else if(w==="permissionsManager")o.setFocus("permissions-manager");else if(w==="agentsManager")o.setFocus("agents-manager");else if(w==="agentCreationWizard")o.setFocus("agent-creation-wizard");else if(w==="skillsManager")o.setFocus("skills-manager");else if(w==="pluginsManager")o.setFocus("plugins-manager");else if(w==="hooksManager")o.setFocus("hooks-manager");else if(F)o.setFocus("transcript-pager");else if(w==="shortcuts")o.setFocus("main-input");else o.setFocus("main-input")},[N0,v.isVisible,w,F,o.setFocus]),$1(()=>{if(!Q0||Q.current)return;if(p7().length>0){Q.current=!0;return}Q.current=!0,M.addAssistantMessage("请输入您的问题,我将为您提供帮助。")},[Q0]),$1(()=>{if(!T)return;if(U.current===T)return;if(U.current=T,P==="error")M.addAssistantMessage(`初始化失败: ${T}`);else M.addAssistantMessage(`${T}`),M.addAssistantMessage("请重新尝试设置,或检查文件权限")},[T,P,M.addAssistantMessage]);let b$=i0(async(i)=>{try{await l({displayText:i,text:i,images:[],parts:[{type:"text",text:i}]})}catch(A0){let N$=A0 instanceof Error?A0.message:"无法发送初始消息";M.addAssistantMessage(`初始消息发送失败:${N$}`)}});$1(()=>{let i=Y.initialMessage?.trim();if(!i||X.current||!Q0||N0)return;X.current=!0,S0(i),b$(i)},[Y.initialMessage,Q0,N0,l,S0]);let q1=i0(async(i)=>{try{await K$().setPermissionMode(i)}catch(A0){Y$.error("权限模式初始化失败:",A0 instanceof Error?A0.message:A0)}});if($1(()=>{let i=Y.permissionMode;if($)Y$.debug("[Debug] permissionMode from CLI:",i),Y$.debug("[Debug] current permissionMode:",a);if(!i||i===a)return;q1(i)},[Y.permissionMode,a]),d)return null;if(N0)return h0(C9,{mode:"setup",onComplete:r0,onCancel:j},void 0,!1,void 0,this);if($)Y$.debug("[Debug] 渲染主界面,条件检查:",{confirmationVisible:v.isVisible,activeModal:w});let Z2=w==="modelSelector",w$=C,r$=w==="modelAddWizard"?"add":w==="modelEditWizard"&&w$?"edit":null,_$=Z2||Boolean(r$),P1=w==="agentsManager",b1=w==="agentCreationWizard",Z$=w==="skillsManager",k2=w==="pluginsManager",UX=w$?{displayName:w$.displayName,provider:w$.provider,model:w$.model,overrides:w$.overrides}:void 0,m9=v.isVisible&&v.details?v.details.type==="mcpElicitation"&&v.details.mcpElicitation?h0(y5,{details:v.details.mcpElicitation,onComplete:(i,A0)=>k({approved:i.action==="accept",elicitation:i,...A0?{openExternalUrl:!0}:{}})},void 0,!1,void 0,this):v.details.type==="askUserQuestion"&&v.details.questions?h0(q7,{questions:v.details.questions,onComplete:(i)=>k({approved:!0,answers:i}),onCancel:()=>k({approved:!1})},void 0,!1,void 0,this):h0(d3,{details:v.details,onResponse:k},void 0,!1,void 0,this):w==="themeSelector"?h0(j7,{},void 0,!1,void 0,this):w==="permissionsManager"?h0(Y7,{onClose:m},void 0,!1,void 0,this):w==="sessionSelector"?h0(b7,{intent:L?.intent??"resume",sessions:L?.sessions??[],taskAttentionUnreadKeys:W,onSelect:c,onCancel:r},void 0,!1,void 0,this):w==="sessionHistoryViewer"?h0(B7,{state:N,onLoadOlder:(i)=>K.loadOlder(i),onFork:(i)=>K.fork(i),onClose:m},void 0,!1,void 0,this):w==="followUpQueue"?h0(l3,{queue:b,mutation:A,onMutate:f,onRefresh:I,onClose:m},void 0,!1,void 0,this):w==="hooksManager"?h0(a3,{workspaceRoot:B,sessionId:y,onClose:m},void 0,!1,void 0,this):null,D8=Boolean(m9);return h0(g1,{flexDirection:"column",width:"100%",overflow:"hidden",children:[m9,h0(g1,{flexDirection:"column",display:D8||F?"none":"flex",children:[h0(j5,{active:!D8&&!F},void 0,!1,void 0,this),h0(D7,{},void 0,!1,void 0,this),h0(j9,{},void 0,!1,void 0,this),h0(D9,{},void 0,!1,void 0,this),h0(M5,{paused:D8||F},void 0,!1,void 0,this),h0(H5,{input:X0.value,cursorPosition:X0.cursorPosition,onChange:X0.setValue,onChangeCursorPosition:X0.setCursorPosition,onAddPasteMapping:X0.addPasteMapping,onAddImagePasteMapping:X0.addImagePasteMapping,disabled:w==="sessionHistoryViewer"},void 0,!1,void 0,this),Z2&&h0(g1,{marginTop:1,paddingX:2,children:h0(h5,{onClose:m,onEdit:P0},void 0,!1,void 0,this)},void 0,!1,void 0,this),r$&&h0(g1,{marginTop:1,paddingX:2,children:h0(C9,{mode:r$,modelId:w$?.id,initialConfig:r$==="edit"?UX:void 0,onComplete:r$==="edit"?u0:l0,onCancel:m},void 0,!1,void 0,this)},void 0,!1,void 0,this),P1&&h0(g1,{marginTop:1,paddingX:2,children:h0(_3,{workspaceRoot:B,onComplete:m,onCancel:m},void 0,!1,void 0,this)},void 0,!1,void 0,this),b1&&h0(g1,{marginTop:1,paddingX:2,children:h0(L8,{onComplete:m,onCancel:m},void 0,!1,void 0,this)},void 0,!1,void 0,this),Z$&&h0(g1,{marginTop:1,paddingX:2,children:h0(I7,{onComplete:m,onCancel:m},void 0,!1,void 0,this)},void 0,!1,void 0,this),k2&&h0(g1,{marginTop:1,paddingX:2,children:h0(z7,{workspaceRoot:B,onComplete:m,onCancel:m},void 0,!1,void 0,this)},void 0,!1,void 0,this),h0(w3,{suggestions:S2,selectedIndex:X2,visible:x1&&!_$},void 0,!1,void 0,this),h0(L3,{},void 0,!1,void 0,this)]},void 0,!0,void 0,this),h0(g1,{flexDirection:"column",display:F?"flex":"none",children:h0(E7,{isOpen:F,compact:D8,onClose:g0},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{Box as hK,Text as J2}from"ink";import EK from"react";import{jsxDEV as m1}from"react/jsx-dev-runtime";class f8 extends EK.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 m1(hK,{flexDirection:"column",padding:1,borderStyle:"round",borderColor:"red",children:[m1(J2,{color:"red",children:"应用发生错误"},void 0,!1,void 0,this),m1(J2,{children:" "},void 0,!1,void 0,this),m1(J2,{color:"red",children:this.state.error?.message},void 0,!1,void 0,this),m1(J2,{children:" "},void 0,!1,void 0,this),m1(J2,{color:"gray",children:"错误详情:"},void 0,!1,void 0,this),m1(J2,{color:"gray",children:this.state.error?.stack},void 0,!1,void 0,this),m1(J2,{children:" "},void 0,!1,void 0,this),m1(J2,{color:"yellow",children:"请重启应用或联系开发者"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return this.props.children}}import{Box as I2,Text as p1}from"ink";import{useState as E9}from"react";import{jsxDEV as y$}from"react/jsx-dev-runtime";var X4=[{key:"update",label:"Update now",description:`runs \`${d7()}\``},{key:"skip",label:"Skip",description:""},{key:"skip_until_next",label:"Skip until next version",description:""}],r7=({versionInfo:$,onComplete:J})=>{let[Y,Z]=E9(0),[X,Q]=E9(!1),[U,G]=E9(null);_0((K,O)=>{if(O.ctrl&&K==="c"){H8().shutdown("SIGINT",0);return}if(X||U)return;if(O.upArrow||K==="k")Z((q)=>q>0?q-1:X4.length-1);else if(O.downArrow||K==="j")Z((q)=>q<X4.length-1?q+1:0);else if(O.return)z(X4[Y].key);else if(K==="1")z("update");else if(K==="2")z("skip");else if(K==="3")z("skip_until_next")});let z=async(K)=>{switch(K){case"update":{Q(!0);let O=await l7();G(O.message),setTimeout(()=>{H8().shutdown("SIGINT",0)},1500);break}case"skip":J();break;case"skip_until_next":if($.latestVersion)await u7($.latestVersion);J();break}};if(U)return y$(I2,{flexDirection:"column",marginY:1,children:y$(p1,{children:U},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(X)return y$(I2,{flexDirection:"column",marginY:1,children:y$(p1,{color:"cyan",children:"Updating..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);return y$(I2,{flexDirection:"column",marginY:1,children:[y$(p1,{color:"yellow",bold:!0,children:["Update available! ",y$(p1,{color:"gray",children:[$.currentVersion," ","->"," ",$.latestVersion]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),y$(I2,{marginTop:1,children:y$(p1,{color:"gray",children:["Release notes:"," ",y$(p1,{color:"cyan",underline:!0,children:$.releaseNotesUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),y$(I2,{flexDirection:"column",marginTop:1,children:X4.map((K,O)=>{let q=O===Y,N=q?"› ":" ",_=`${O+1}. `;return y$(I2,{children:y$(p1,{color:q?"cyan":void 0,children:[N,_,K.label,K.description&&y$(p1,{color:"gray",children:[" (",K.description,")"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},K.key,!1,void 0,this)})},void 0,!1,void 0,this),y$(I2,{marginTop:1,children:y$(p1,{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 Z4,Text as X8}from"ink";import{useState as a7}from"react";import{jsxDEV as w1}from"react/jsx-dev-runtime";var i7=({status:$,onTrust:J,onContinueSafely:Y})=>{let Z=F$.getTheme(),[X,Q]=a7(!1),[U,G]=a7(null);return _0((z,K)=>{if(X)return;if(K.return||z.toLowerCase()==="t"){Q(!0),G(null),J().catch((O)=>{G(O instanceof Error?O.message:"Failed to trust workspace"),Q(!1)});return}if(z.toLowerCase()==="s"||K.escape)Q(!0),G(null),Y().catch((O)=>{G(O instanceof Error?O.message:"Failed to continue safely"),Q(!1)})}),w1(Z4,{flexDirection:"column",paddingX:1,children:[w1(X8,{bold:!0,color:Z.colors.warning,children:"Workspace review required"},void 0,!1,void 0,this),w1(X8,{dimColor:!0,children:$.projectPath},void 0,!1,void 0,this),w1(Z4,{marginTop:1,flexDirection:"column",children:[w1(X8,{children:"This project contains configuration that can change models, start MCP processes, relax permissions, inject environment variables, or load instructions, commands, skills, agents, and plugins."},void 0,!1,void 0,this),$.sources.map((z)=>w1(X8,{children:[" ",z.path," · ",z.effects.length," effect(s)"]},`${z.kind}:${z.path}`,!0,void 0,this))]},void 0,!0,void 0,this),U&&w1(Z4,{marginTop:1,children:w1(X8,{color:Z.colors.error,children:U},void 0,!1,void 0,this)},void 0,!1,void 0,this),w1(Z4,{marginTop:1,children:w1(X8,{bold:!0,children:X?"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 gK}from"ink";import{useEffect as mK}from"react";function o7(){let{stdout:$}=gK();mK(()=>{if(!$.isTTY)return;return $.write(n3),$.write(G9),()=>{$.write(t3),$.write(G9)}},[$])}function n7($){return($ instanceof Error?$.message:String($)).replace(/sk-[a-zA-Z0-9]{32,}/g,"sk-***").replace(/apiKey['":\s]+[a-zA-Z0-9-_]+/gi,"apiKey: ***").replace(/API_KEY['":\s=]+[a-zA-Z0-9-_]+/gi,"API_KEY=***")}function pK($){return $.forkSession?void 0:$.resumeSessionId}function t7($,J){let Y=pK($);if(Y)J(Y)}import{jsxDEV as Y2}from"react/jsx-dev-runtime";function cK($){if(m0().config.actions.setConfig($),$.debug)console.log("[Debug] 模型配置检查通过,准备就绪");L$().setInitializationStatus("ready")}var uK=($)=>{o7();let[J,Y]=U4(!1),[Z,X]=U4(null),[Q,U]=U4(!1),[G,z]=U4(null),K=Q4((_,F)=>{let H=_ instanceof Error?_.message:String(_);if(L$().setInitializationError(H),L$().setInitializationStatus("error"),Y(!0),F)console.error("[FAIL] 应用初始化失败:",H)}),O=Q4(async()=>{try{let _=m0().config.config??e7,F=$X(_,$);if(cK(F),t7(F,(P)=>{JX().restoreSession(P,[])}),F.debug)console.error("[Debug] 运行时配置:",F);let H=F.codeTheme;if(H&&F$.hasTheme(H)){if(F$.setTheme(H),$.debug)console.log(`[OK] 已加载主题: ${H}`)}try{h$.getInstance().loadConfig(F.hooks||{},G$());let T=await YX(G$());if($.debug&&F.hooks?.enabled)console.log("[OK] Hooks 系统已启用");if($.debug)console.log(`[OK] Workspace resources: ${T.subagents.getAllNames().length} agents, ${T.skills.size} skills, ${T.commands.getCommandCount()+T.commands.getPluginCommandCount()} commands, ${T.plugins.getAll().length} plugins`);let L=m0().session.sessionId;s7(L)}catch(P){if($.debug)console.warn("Hooks 初始化失败:",n7(P))}_6(async()=>{await ZX.getInstance().killAll(),await XX.getInstance().disconnectAll(),h$.getInstance().cleanup()}),Y(!0)}catch(_){K(_,!!$.debug)}}),q=Q4(async()=>{let _=await g9.getInstance().getStatus(G$());if(_.state==="untrusted"||_.state==="error"){z(_);return}await O()}),N=Q4(async()=>{if($.versionCheckPromise){let _=await $.versionCheckPromise;if(_){X(_),U(!0);return}}await q()});if(xK(()=>{N()},[]),Q&&Z)return Y2(f8,{children:Y2(r7,{versionInfo:Z,onComplete:()=>{U(!1),q()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(G)return Y2(f8,{children:Y2(i7,{status:G,onTrust:async()=>{await g9.getInstance().trust(G$()),await QX(),z(null),await O()},onContinueSafely:async()=>{z(null),await O()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(!J)return null;return Y2(f8,{children:Y2(c7,{...$},void 0,!1,void 0,this)},void 0,!1,void 0,this)},kP=($)=>Y2(yY,{children:Y2(uK,{...$},void 0,!1,void 0,this)},void 0,!1,void 0,this);export{kP as AppWrapper};
|