blade-code 0.10.114 → 0.10.116
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-5kygekjq.js → chunk-1hetgc98.js} +1 -1
- package/dist/{chunk-9yn39keb.js → chunk-1kxev3k5.js} +1 -1
- package/dist/{chunk-2br3zb3a.js → chunk-4qvm1786.js} +1 -1
- package/dist/{chunk-tdent43z.js → chunk-59y1c7c8.js} +1 -1
- package/dist/{chunk-f9b06ew7.js → chunk-61bb9kjb.js} +1 -1
- package/dist/{chunk-h0y3rk52.js → chunk-6321bw8w.js} +1 -1
- package/dist/{chunk-prfmqc67.js → chunk-667f1ksp.js} +1 -1
- package/dist/{chunk-9yfpthv2.js → chunk-6sp20f1b.js} +1 -1
- package/dist/{chunk-hk0s60z9.js → chunk-92q9s5w9.js} +1 -1
- package/dist/{chunk-nvty724y.js → chunk-93p6bxep.js} +1 -1
- package/dist/{chunk-c8sxf0w3.js → chunk-9cs45ath.js} +1 -1
- package/dist/{chunk-mvnzc93b.js → chunk-canb6jrj.js} +1 -1
- package/dist/chunk-ccw2786n.js +169 -0
- package/dist/{chunk-172c4qja.js → chunk-dq95vmj7.js} +1 -1
- package/dist/{chunk-svtjekx5.js → chunk-e9xtmkj4.js} +1 -1
- package/dist/{chunk-tnp6c929.js → chunk-fr2aaarj.js} +2 -2
- package/dist/{chunk-x74fkd67.js → chunk-jdzb8w1p.js} +1 -1
- package/dist/{chunk-0ev1dbx3.js → chunk-k60qgbsv.js} +1 -1
- package/dist/{chunk-a55yrrqz.js → chunk-m14jar1a.js} +1 -1
- package/dist/{chunk-my4twryw.js → chunk-n1vttsx4.js} +1 -1
- package/dist/{chunk-xm8fk5xn.js → chunk-n6sh5rz0.js} +1 -1
- package/dist/{chunk-eh0pdgvv.js → chunk-qd491f51.js} +5 -5
- package/dist/{chunk-0zhzqzg5.js → chunk-rj6aqdz9.js} +1 -1
- package/dist/{chunk-skvw1qja.js → chunk-rzg9yeg3.js} +1 -1
- package/dist/{chunk-24y7ekjs.js → chunk-scb86aq4.js} +1 -1
- package/dist/{chunk-q0gw11py.js → chunk-se9ar9b4.js} +1 -1
- package/dist/chunk-t74cwjdf.js +1 -0
- package/dist/{chunk-0vtamgkc.js → chunk-t88qf8dc.js} +1 -1
- package/dist/{chunk-n8h630d5.js → chunk-te5jzx47.js} +1 -1
- package/dist/{chunk-hb4669qa.js → chunk-vr20qr4k.js} +1 -1
- package/dist/{chunk-hjq84jxp.js → chunk-xcsz2qae.js} +1 -1
- package/dist/{chunk-jvmmg3yj.js → chunk-xfknqdp3.js} +1 -1
- package/dist/{chunk-7sw49eke.js → chunk-xmxhnz2f.js} +1 -1
- package/dist/{chunk-mkkrgmwk.js → chunk-ycz0vgss.js} +1 -1
- package/dist/chunk-yn52gmje.js +171 -0
- package/dist/chunk-yt80szvb.js +1 -0
- package/dist/{chunk-d1mk0b44.js → chunk-zpwxeeb4.js} +1 -1
- package/package.json +1 -1
- package/dist/chunk-2fwwc2j6.js +0 -171
- package/dist/chunk-8jb6qn7z.js +0 -1
- package/dist/chunk-jqnaakmv.js +0 -169
- package/dist/chunk-pt6h8re0.js +0 -1
package/dist/chunk-jqnaakmv.js
DELETED
|
@@ -1,169 +0,0 @@
|
|
|
1
|
-
import{e as G3,f as U3}from"./chunk-3pwq56je.js";import{i as qZ,j as zZ,k as OZ}from"./chunk-9yfpthv2.js";import{x as P2}from"./chunk-n8h630d5.js";import{$ as y9,F as N6,J as MZ,L as h4,M as f4,N as X6,T as l9,U as r9,Y as E$,_ as M9,ba as a9,da as v8,ea as y3,fa as R3,ia as T3,ja as C3,na as dJ,oa as D6,qa as k6,ra as f6,sa as yZ,ta as V9,va as j9,xa as H6}from"./chunk-eh0pdgvv.js";import"./chunk-ypbnczjp.js";import{Fa as cY,Ga as dY,Ha as lY,Ka as PZ}from"./chunk-h0y3rk52.js";import{Ma as d9}from"./chunk-23v8c9b8.js";import{Gb as c9,Pb as R4,tb as x9,ub as u9}from"./chunk-2fwwc2j6.js";import{_b as E8}from"./chunk-cnhw5mqv.js";import{Ed as C9,Fd as y4,Gd as I9,Id as W2,Qd as f8,Td as f0,dd as E9,sd as b9,xd as P9}from"./chunk-hk0s60z9.js";import"./chunk-53h87fmt.js";import"./chunk-qdv0n8yt.js";import{we as GZ}from"./chunk-bksfg23m.js";import{Ae as n$,xe as h8,ye as M2}from"./chunk-5kygekjq.js";import"./chunk-ng96f4xd.js";import{Ee as t1,Fe as K$,Ge as R1,He as UJ,Ie as H2,Je as B9,Ke as OY,Le as CJ,Me as eY,Ne as _Y,Oe as J8,Pe as Y$,Qe as AZ,Re as G$,Se as KZ,Te as Z4,Ue as V8,Xe as v9,cf as a0}from"./chunk-jvmmg3yj.js";import"./chunk-v508x7cg.js";import"./chunk-pshyn3yy.js";import"./chunk-q2exry0f.js";import{sf as IJ}from"./chunk-tj2efrs1.js";import"./chunk-hv6hrsnk.js";import"./chunk-prfmqc67.js";import{Ef as T2,Hf as m3,Mf as M3,Vf as bZ}from"./chunk-c8sxf0w3.js";import"./chunk-cqqmkwvn.js";import"./chunk-9g64g1np.js";import"./chunk-935v0gpc.js";import{rg as OJ,tg as y$}from"./chunk-my4twryw.js";import"./chunk-eyb9psbc.js";import{Ah as P3,Bh as BZ,vh as wZ}from"./chunk-f9b06ew7.js";import"./chunk-4w4wjm49.js";import"./chunk-6k5k40p8.js";import{Kh as K8,Lh as L2,Nh as _J}from"./chunk-p3m1jyg5.js";import{Sh as Z$}from"./chunk-ecd727xh.js";import"./chunk-x05zyqzf.js";import{pi as LZ,si as y1}from"./chunk-dvv28pkc.js";import{ui as X3,vi as Q3,yi as Q1}from"./chunk-dgf2xzzd.js";import"./chunk-z52s82k7.js";import{Ki as iY}from"./chunk-a55yrrqz.js";import{Ni as cJ}from"./chunk-vbwvsgs1.js";import"./chunk-sr10jsjs.js";import{Yi as M4}from"./chunk-rkdxqx8m.js";import{_i as zJ}from"./chunk-tf7ezqew.js";import{useMemoizedFn as H4}from"ahooks";import{useEffect as yK,useState as F4}from"react";import{useMemoizedFn as t0}from"ahooks";import QZ from"ansi-escapes";import{Box as W1,useStdout as LK}from"ink";import{useEffect as L1,useMemo as wK,useRef as n8,useState as BK}from"react";import{useShallow as TZ}from"zustand/react/shallow";import{useStore as RZ}from"zustand";function Z0($){return RZ(J8,$)}var CZ=[],Y8=()=>Z0(($)=>$.session.sessionId),o$=()=>Z0(($)=>$.session.workspaceRoot),$2=()=>Z0(($)=>$.session.messages),lJ=()=>Z0(($)=>$.session.clearCount),rJ=()=>Z0(($)=>$.session.isCompacting),aJ=()=>Z0(($)=>$.session.tokenUsage.estimatedCostUsd),iJ=()=>Z0(($)=>{let{totalInputTokens:J,cacheReadTokens:Z,cacheWriteTokens:Y}=$.session.tokenUsage;return dJ({totalInputTokens:J,cacheReadTokens:Z,cacheWriteTokens:Y}).hitRate}),oJ=()=>Z0(($)=>$.session.providerCircuit),nJ=()=>Z0(($)=>$.session.providerAdmission),tJ=()=>Z0(($)=>$.session.providerRetry),sJ=()=>Z0(($)=>$.session.providerStall),eJ=()=>Z0(($)=>$.session.actionStationarity),P1=()=>Z0(($)=>$.session.actions),$9=()=>Z0(($)=>{let{totalTokens:J,maxContextTokens:Z}=$.session.tokenUsage;if(Z<=0)return 100;let Y=Math.max(0,100-J/Z*100);return Math.round(Y)}),J9=()=>Z0(($)=>$.app.initializationStatus),Y9=()=>Z0(($)=>$.app.initializationError),J2=()=>Z0(($)=>$.app.activeModal),Z9=()=>Z0(($)=>$.app.tasks),X9=()=>Z0(($)=>$.app.modelEditorTarget),Q9=()=>Z0(($)=>$.app.sessionSelectorData),K9=()=>Z0(($)=>$.app.awaitingSecondCtrlC),M1=()=>Z0(($)=>$.app.actions),Y2=()=>Z0(($)=>$.app.sideConversation),G9=()=>Z0(($)=>$.app.teams),Z2=()=>Z0(($)=>$.app.initializationStatus==="ready"),U9=()=>Z0(($)=>$.app.tasks.length>0),Z8=()=>Z0(($)=>$.config.config?.permissionMode||"default"),q9=()=>Z0(($)=>$.config.config?.models??CZ),X2=()=>Z0(($)=>{let J=$.config.config;if(!J)return;let Z=J.currentModelId;return J.models.find((X)=>X.id===Z)??J.models[0]}),Q2=()=>Z0(($)=>$.config.config?.currentModelId),z9=()=>Z0(($)=>$.config.config?.agentTeamsEnabled===!0),P0=()=>Z0(($)=>{return K$.getTheme()}),O9=()=>Z0(($)=>$.config.config?.codeTheme??"default"),r0=()=>Z0(($)=>$.focus.currentFocus),_9=()=>Z0(($)=>$.focus.actions),X8=()=>Z0(($)=>$.command.isProcessing),N9=()=>Z0(($)=>$.command.actions),Q8=()=>Z0(($)=>$.command.pendingCommands),H9=()=>Z0(($)=>$.command.recoveredSteeringCount),K2=()=>Z0(($)=>$.app.reasoningEffort!=="off"),G2=()=>Z0(($)=>$.app.reasoningEffort),U2=()=>Z0(($)=>$.app.serviceTier),q2=()=>Z0(($)=>$.app.responseVerbosity),z2=()=>Z0(($)=>$.app.communicationStyle),O2=()=>Z0(($)=>$.session.currentThinkingContent),F9=()=>Z0(($)=>$.session.thinkingExpanded),_2=()=>Z0(($)=>$.session.currentStreamingMessageId),N2=()=>Z0(TZ(($)=>({lines:$.session.currentStreamingLines,tail:$.session.currentStreamingTail,lineCount:$.session.currentStreamingLineCount,version:$.session.currentStreamingVersion}))),W9=()=>Z0(($)=>$.session.finalizingStreamingMessageId),L9=()=>Z0(($)=>$.session.historyExpanded),w9=()=>Z0(($)=>$.session.expandedMessageCount);import{useMemoizedFn as X1}from"ahooks";import{useEffect as g1,useMemo as oZ,useRef as R2}from"react";class W4{options;requested=!1;scheduled=!1;inFlight=!1;disposed=!1;generation=0;activeRunController=null;scheduleCallback;constructor($){this.options=$;this.scheduleCallback=$.schedule??queueMicrotask}request(){if(this.disposed)return;this.requested=!0,this.scheduleIfRunnable()}notifyIdle(){this.scheduleIfRunnable()}dispose(){this.disposed=!0,this.requested=!1,this.scheduled=!1,this.generation++,this.activeRunController?.abort("pending-resume-coordinator-disposed"),this.activeRunController=null}scheduleIfRunnable(){if(this.disposed||!this.requested||this.scheduled||this.inFlight||!this.options.canRun())return;this.scheduled=!0;let $=this.generation;this.scheduleCallback(()=>{if(this.disposed||$!==this.generation)return;this.scheduled=!1,this.flush()})}async flush(){if(this.disposed||this.inFlight||!this.requested||!this.options.canRun())return;this.requested=!1,this.inFlight=!0;let $=new AbortController;this.activeRunController=$;let J="completed";try{J=await this.options.run($.signal)}finally{if(this.activeRunController===$)this.activeRunController=null;if(this.inFlight=!1,J==="deferred")this.requested=!0;this.scheduleIfRunnable()}}}class S8{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)H2(J,$.extraContent);B9(J)}this.options.finalizeStreamingMessage($.extraContent,$.extraThinking)}}function IZ($){if(!($ instanceof Error))return"未知错误";let Y=$.lastError??$;if(Y.responseBody)try{let K=JSON.parse(Y.responseBody)?.error?.message;if(K){let G=Y.statusCode?` (HTTP ${Y.statusCode})`:"";return`${K}${G}`}}catch{}let X=$.message.match(/Last error:\s*(.+)$/);if(X)return X[1];return $.message}function SZ($){if(!($ instanceof Error))return!1;return $.name==="AbortError"||$.message.includes("aborted")}function kZ($){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 F2($){let J=SZ($),Z=kZ($),Y;if(Z)Y="当前模型不支持图片理解功能。请切换到支持视觉能力的模型(如 Claude 4.5、GPT-5.2、Gemini 3 Pro、Qwen3-VL-Plus 等)后重试。";else Y=IZ($);return{displayMessage:Y,isAbort:J,isVisionNotSupported:Z}}import{appendFileSync as fZ,mkdirSync as vZ,writeFileSync as DZ}from"node:fs";import VZ from"node:os";import L4 from"node:path";var A9=null;function jZ(){let $=process.env.BLADE_STORAGE_ROOT||L4.join(VZ.homedir(),".blade");return L4.join($,"logs","stream-debug.log")}function EZ($){if(A9===$)return;let J=L4.dirname($);vZ(J,{recursive:!0,mode:493}),DZ($,`=== Stream Debug Log Started: ${new Date().toISOString()} ===
|
|
2
|
-
`),A9=$}function w4($,J,Z){try{let Y=jZ();EZ(Y);let X=new Date().toISOString(),Q=Z?` | ${JSON.stringify(Z)}`:"",K=`[${X}] [${$}] ${J}${Q}
|
|
3
|
-
`;fZ(Y,K)}catch{}}var k8=y1("UI");function A4($,J){if(J.state==="requires_attention"){let Z=J.reason==="interrupted_tool_call";$.addToolMessage("Turn recovery requires attention",{toolName:"Runtime Recovery",phase:"complete",summary:Z?"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 R9($,J){let Z=$.streamSession??new S8({signal:$.signal,streamingBuffer:$.streamingBuffer,getStreamingMessageId:$.getStreamingMessageId,finalizeStreamingMessage:$.sessionActions.finalizeStreamingMessage,discardStreamingMessage:$.sessionActions.discardStreamingMessage,clearThinking:()=>$.sessionActions.setCurrentThinkingContent(null)});return(Y)=>{switch(Y.kind){case"content_delta":if(!Z.acceptsDeltas())break;J.contentDeltaCount++,J.contentDeltaTotalLen+=Y.delta.length,w4("loopEventHandler","onContentDelta",{callCount:J.contentDeltaCount,deltaLen:Y.delta.length,totalLen:J.contentDeltaTotalLen}),$.streamingBuffer.batchAppendContent(Y.delta);break;case"thinking_delta":if(!Z.acceptsDeltas())break;if($.thinkingModeEnabled)$.streamingBuffer.batchAppendThinking(Y.delta);break;case"stream_end":{$.sessionActions.setProviderCircuit(null),$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),k8.debug("[loopEventHandler] stream_end",{contentDeltaCount:J.contentDeltaCount,contentDeltaTotalLen:J.contentDeltaTotalLen,streamFinalized:Z.isFinalized,signalAborted:$.signal.aborted}),w4("loopEventHandler","onStreamEnd",{contentDeltaCallCount:J.contentDeltaCount,contentDeltaTotalLen:J.contentDeltaTotalLen,streamFinalized:Z.isFinalized,signalAborted:$.signal.aborted}),Z.finalize();break}case"model_fallback":$.sessionActions.setProviderAdmission(null),$.sessionActions.setProviderCircuit(null),$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),Z.discard();break;case"provider_admission":{let{kind:X,...Q}=Y;$.sessionActions.setProviderAdmission(Y.phase==="queued"?Q:null);break}case"provider_circuit":{let{kind:X,...Q}=Y;$.sessionActions.setProviderCircuit(Y.phase==="closed"?null:Q);break}case"provider_retry":{let{kind:X,...Q}=Y;$.sessionActions.setProviderRetry(Y.phase==="recovered"?null:Q);break}case"provider_stall":{let{kind:X,...Q}=Y;$.sessionActions.setProviderStall(Y.phase==="detected"?Q:null);break}case"action_stationarity":{let{kind:X,...Q}=Y;$.sessionActions.setActionStationarity(Y.phase==="recovered"?null:Q);break}case"turn_recovery":{A4($.sessionActions,Y.assessment);break}case"tool_start":{let X=Y.toolCall;if(!("function"in X))break;if(X.function.name===W2)break;if(k8.debug("[loopEventHandler] tool_start",{toolName:X.function.name,toolKind:Y.toolKind}),["TaskCreate","TaskUpdate","TaskList"].includes(X.function.name))break;try{let Q=JSON.parse(X.function.arguments),K=M9(X.function.name,Q);$.sessionActions.addToolMessage(K,{toolCallId:X.id,toolName:X.function.name,phase:"start",summary:K,params:Q})}catch(Q){k8.error("[loopEventHandler] onToolStart error:",Q)}break}case"tool_progress":{let X=Y.toolCall;if(!("function"in X))break;if(X.function.name===W2)break;let Q=Y.update.total!==void 0?` ${Math.max(0,Math.min(100,Math.round((Y.update.progress??0)/Y.update.total*100)))}%`:"",K=`${X.function.name}${Q}: ${Y.update.message}`;$.sessionActions.addToolMessage(K,{toolCallId:X.id,toolName:X.function.name,phase:"progress",summary:K,...Y.update.admission?{admission:Y.update.admission}:{}});break}case"tool_result":{let X=Y.toolCall;if(!("function"in X))break;if(X.function.name===W2)break;k8.debug("[loopEventHandler] tool_result",{toolName:X.function.name,success:Y.result.success});let Q=P9(y9(X.function.name,Y.result),b9);$.sessionActions.addToolMessage(Q.summary,{toolCallId:X.id,toolName:X.function.name,phase:"complete",summary:Q.summary,detail:Q.detail});break}case"structured_output":$.sessionActions.replaceLastAssistantMessage(JSON.stringify(Y.output,null,2));break;case"token_usage":$.sessionActions.updateTokenUsage(Y.usage);break;case"compaction":if($.sessionActions.setCompacting(Y.phase==="start"),Y.phase==="end"){if($.sessionActions.resetContextUsage(),Y.outcome!=="failed")J.compactionCount=(J.compactionCount??0)+1}break;case"turn_start":k8.debug("[loopEventHandler] turn_start",{turn:Y.turn,maxTurns:Y.maxTurns}),$.sessionActions.updateTokenUsage({turnCount:Y.turn}),$.sessionActions.setProviderCircuit(null),$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),Z.startTurn();break;case"task_update":$.appActions.setTasks(Y.tasks);break;case"goal_frontier_updated":$.appActions.setTasks(Y.tasks);break;case"mcp_catalog_changed":{let X=`MCP catalog r${Y.revision}: +${Y.added.length} -${Y.removed.length} ~${Y.updated.length}`;$.sessionActions.addToolMessage(X,{toolName:"MCP Catalog",phase:"complete",summary:X,detail:[Y.added.length>0?`Added: ${Y.added.join(", ")}`:"",Y.removed.length>0?`Removed: ${Y.removed.join(", ")}`:"",Y.updated.length>0?`Updated: ${Y.updated.join(", ")}`:""].filter(Boolean).join(`
|
|
4
|
-
`)});break}case"mcp_content_changed":{let X=`MCP ${Y.contentKind} r${Y.revision}: +${Y.added.length} -${Y.removed.length} ~${Y.updated.length}`;$.sessionActions.addToolMessage(X,{toolName:"MCP Content",phase:"complete",summary:X,detail:[Y.added.length>0?`Added: ${Y.added.join(", ")}`:"",Y.removed.length>0?`Removed: ${Y.removed.join(", ")}`:"",Y.updated.length>0?`Updated: ${Y.updated.join(", ")}`:""].filter(Boolean).join(`
|
|
5
|
-
`)});break}case"mcp_resource_updated":{let X=`MCP resource updated: ${Y.uri}`;$.sessionActions.addToolMessage(X,{toolName:"MCP Resource",phase:"progress",summary:X,detail:`${Y.serverName} · revision ${Y.revision}`});break}case"mcp_connection_changed":{let X=Y.phase==="reconnecting"?"recovering":Y.phase==="recovered"?"recovered":"recovery failed",Q=`MCP ${Y.serverName} ${X}`+(Y.phase==="reconnecting"?` (${Y.attempt}/${Y.maxAttempts})`:"");$.sessionActions.addToolMessage(Q,{toolName:"MCP Connection",phase:"complete",summary:Q,detail:[`reason: ${Y.reason}`,`revision: ${Y.revision}`,Y.error?`error: ${Y.error}`:""].filter(Boolean).join(`
|
|
6
|
-
`)});break}case"mcp_log":{let X=Y.logger?`${Y.serverName} · ${Y.logger}`:Y.serverName,Q=`MCP ${Y.level} · ${X}`;$.sessionActions.addToolMessage(Q,{toolName:"MCP Log",phase:"complete",summary:Q,detail:[Y.message,`revision: ${Y.revision}`,`sha256: ${Y.dataSha256}`,Y.truncated?"truncated: true":"",Y.detailsOmitted?"details omitted by runtime policy":""].filter(Boolean).join(`
|
|
7
|
-
`)});break}case"mcp_instructions_changed":{let X=`MCP instructions ${Y.action}: ${Y.serverName}`+(Y.truncated?" (truncated)":"");$.sessionActions.addToolMessage(X,{toolName:"MCP Instructions",phase:"complete",summary:X,detail:[Y.text??"",Y.sha256?`sha256: ${Y.sha256}`:"",Y.detailsOmitted?"details omitted by runtime policy":""].filter(Boolean).join(`
|
|
8
|
-
`)});break}case"mcp_task_changed":{let X=`MCP task ${Y.status}: ${Y.taskId} (${Y.serverName}/${Y.toolName})`;$.sessionActions.addToolMessage(X,{toolName:"MCP Task",phase:"complete",summary:X,detail:[Y.statusMessage??"",`revision: ${Y.revision}`,Y.hasResult?"result available via TaskOutput":"",Y.error?`error: ${Y.error}`:""].filter(Boolean).join(`
|
|
9
|
-
`)});break}case"project_rules_loaded":{let X=`Project rules loaded: ${Y.files.length}`+(Y.blockedWrite?" (write retry required)":"");$.sessionActions.addToolMessage(X,{toolName:"Project Rules",phase:"complete",summary:X,detail:Y.files.map((Q)=>`${Q.relativePath} ${Q.source} sha256=${Q.contentSha256}`).join(`
|
|
10
|
-
`)});break}case"steering_applied":for(let X=0;X<Y.count;X++)$.commandActions.dequeueCommand();if(Y.recovered>0)$.commandActions.setRecoveredSteeringCount(Y.recovered);break;case"follow_up_started":for(let X of Y.messages){if(!X.recovered||X.persisted)continue;let Q=typeof X.content==="string"?X.content:X.content.map((K)=>K.type==="text"?K.text:"[Image]").join(`
|
|
11
|
-
`);$.sessionActions.addUserMessage(Q)}if(Y.recovered>0)$.commandActions.setRecoveredSteeringCount(Y.recovered);break;case"goal_updated":case"goal_continuation_started":break;case"subagent_spawned":case"subagent_completed":break;default:{let X=Y}}}}function b4($){let{text:J,parts:Z}=$,Y=Z.filter((K)=>K.type==="image");if(Y.length===0)return J;if(Y.length>K8)throw Error(`最多只能发送 ${K8} 张图片`);if(Y.reduce((K,G)=>K+`data:${G.mimeType};base64,`.length+G.base64.length,0)>L2)throw Error("图片编码后总大小不能超过 5 MiB");let Q=[];for(let K of Z)if(K.type==="text")Q.push({type:"text",text:K.text});else Q.push({type:"image_url",image_url:{url:`data:${K.mimeType};base64,${K.base64}`}});return Q}function T9($){let J=I9($.metadata);return{role:$.role,content:J?C9(J):$.content,...$.metadata?{metadata:$.metadata}:{}}}function w2($){if(!$.restoredContextMessages||$.restoredVisibleMessageCount<=0)return $.messages.map(T9);let J=$.messages.slice($.restoredVisibleMessageCount).map(T9);return[...$.restoredContextMessages,...J]}import hZ from"node:path";function S9($){if($.length<=8)return $;return`${$.slice(0,8)}…`}function gZ($){return hZ.resolve($)}function k9($){if(!$||!v9($))return;Y$().config.actions.updateConfig({currentModelId:$})}function f9($){if(!$)return;Y$().config.actions.updateConfig({permissionMode:$})}async function B2($,J){return f0.listSessions({includeSubagents:!1})}async function A2($,J,Z,Y){let{intent:X,session:Q,newSessionId:K,announceFork:G,permissionModeOverride:U}=$,q=gZ(Q.projectPath);if(X==="fork"){let W=await f0.forkSession(Q.sessionId,{...K?{newSessionId:K}:{},sourceProjectPath:q,targetProjectPath:q}),L=await f0.loadSessionModelContext(W.sessionId,W.metadata.projectPath),N=[...f0.toUISafeMessages(W.messages)];if(G!==!1){let A=Date.parse(W.metadata.lastMessageTime);N.push({id:"fork-announcement-"+W.sessionId,role:"assistant",content:"Forked "+S9(Q.sessionId)+" → "+S9(W.sessionId),timestamp:Number.isNaN(A)?0:A})}return await Y(),f9(U??W.metadata.permissionMode),k9(W.metadata.selectedModelId),Z.restoreSession(W.sessionId,N,L,W.metadata.projectPath),{sessionId:W.sessionId,messages:L}}await f0.assertSessionWritable(Q.sessionId,Q.projectPath);let[O,z]=await Promise.all([f0.loadSession(Q.sessionId,Q.projectPath),f0.loadSessionModelContext(Q.sessionId,Q.projectPath)]),_=f0.toUISafeMessages(O);return await Y(),f9(U??Q.permissionMode),k9(Q.selectedModelId),Z.restoreSession(Q.sessionId,_,z,Q.projectPath),{sessionId:Q.sessionId,messages:z}}function D9($){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 mZ($){return typeof $==="object"&&$!==null&&$.action==="invoke_skill"&&typeof $.skillName==="string"}function pZ($){return typeof $==="object"&&$!==null&&$.action==="invoke_custom_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function xZ($){return typeof $==="object"&&$!==null&&$.action==="invoke_plugin_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function uZ($){return typeof $==="object"&&$!==null&&$.action==="invoke_once_model"&&typeof $.modelId==="string"&&typeof $.prompt==="string"}function cZ($){return typeof $==="object"&&$!==null&&["start_goal","resume_goal"].includes(String($.action))&&typeof $.goal?.objective==="string"}function dZ($){return typeof $==="object"&&$!==null&&$.action==="rewind_session"&&typeof $.sessionId==="string"&&Array.isArray($.messages)&&Array.isArray($.visibleMessages)}function lZ($){if(typeof $!=="object"||$===null)return!1;let J=$.intent;if(J!=="resume"&&J!=="fork")return!1;let Z=$.action;if(Z==="select_session"){let Y=$.sessions;return Array.isArray(Y)&&Y.every((X)=>D9(X))}if(Z==="activate_session")return D9($.session);return!1}function rZ($,J,Z,Y){switch($){case"show_theme_selector":return Z.setActiveModal("themeSelector"),!0;case"show_model_selector":return Z.setActiveModal("modelSelector"),!0;case"show_model_add_wizard":return Z.setActiveModal("modelAddWizard"),!0;case"show_permissions_manager":return Z.setActiveModal("permissionsManager"),!0;case"show_agents_manager":return Z.setActiveModal("agentsManager"),!0;case"show_skills_manager":return Z.setActiveModal("skillsManager"),!0;case"show_hooks_manager":return Z.setActiveModal("hooksManager"),!0;case"show_plugins_manager":return Z.setActiveModal("pluginsManager"),!0;case"show_agent_creation_wizard":return Z.setActiveModal("agentCreationWizard"),!0;case"show_session_selector":{let X=J?.sessions;return Z.showSessionSelector(X??[],"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 Y.restoreSession(X.sessionId,X.visibleMessages,X.messages),!0}case"session_archived":{let X=J?.session;return Y.addAssistantMessage(X?`会话 ${X.sessionId} 已归档。`:"当前会话已归档。"),n$(0),!0}case"clear_screen":return Y.clearMessages(),Y.setError(null),Y.resetTokenUsage(),Z.setTasks([]),!0;case"compact_completed":case"compact_fallback":{let X=J,Q=X?.compactedMessages;if(Q)Y.setCompactedContext(Q);if(X?.usage)Y.updateTokenUsage({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});return Y.resetContextUsage(),!0}case"exit_application":return n$(0),!0;default:return!1}}async function P4($,J,Z,Y,X,Q,K,G,U,q,O,z,_,W,L=Z$(),N){let{text:A}=$;if(!V9(A))return{type:"not_slash"};let H=await j9(A,{cwd:L,surface:"tui",workspaceRoot:L,sessionId:Q,messages:K,rewind:G,lifecycle:Q===void 0?void 0:{archiveCurrent:async()=>{return await X(),f0.archiveSession(Q,L)}},subagents:U,mcp:q,reasoning:O,serviceTier:z,responseVerbosity:_,communicationStyle:W,codeReview:N,signal:Y});if(H.success&&lZ(H.data)){if(H.data.action==="select_session")return J.showSessionSelector(H.data.sessions,H.data.intent),{type:"handled",commandResult:{success:!0}};return await A2(H.data,L,Z,X),{type:"handled",commandResult:{success:!0}}}if(H.success&&dZ(H.data))return Z.restoreSession(H.data.sessionId,H.data.visibleMessages,H.data.messages),J.setTasks([]),{type:"handled",commandResult:{success:!0}};if(H.message){if(rZ(H.message,H.data,J,Z))return{type:"handled",commandResult:{success:!0}}}if(mZ(H.data)){let{skillName:B,skillArgs:w}=H.data,M=w?`Please use the "${B}" skill to help me with: ${w}`:`Please use the "${B}" skill.`;return Z.addUserMessage(M),{type:"continue_as_agent",result:{userDisplayMessage:M,agentInput:{displayText:M,text:M,images:[],parts:[{type:"text",text:M}]},userMessageAlreadyAdded:!0}}}if(pZ(H.data)){let{commandName:B,processedContent:w}=H.data;Z.addUserMessage(A);let M=`# Custom Command: /${B}
|
|
12
|
-
|
|
13
|
-
The user has invoked the custom command "/${B}". Follow the instructions below to complete the task.
|
|
14
|
-
|
|
15
|
-
---
|
|
16
|
-
|
|
17
|
-
${w}
|
|
18
|
-
|
|
19
|
-
---
|
|
20
|
-
|
|
21
|
-
Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:A,agentInput:{displayText:A,text:M,images:[],parts:[{type:"text",text:M}]},userMessageAlreadyAdded:!0}}}if(xZ(H.data)){let{commandName:B,pluginName:w,processedContent:M}=H.data;Z.addUserMessage(A);let P=`# Plugin Command: /${B}
|
|
22
|
-
|
|
23
|
-
The user has invoked the plugin command "/${B}" from plugin "${w}". Follow the instructions below to complete the task.
|
|
24
|
-
|
|
25
|
-
---
|
|
26
|
-
|
|
27
|
-
${M}
|
|
28
|
-
|
|
29
|
-
---
|
|
30
|
-
|
|
31
|
-
Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:A,agentInput:{displayText:A,text:P,images:[],parts:[{type:"text",text:P}]},userMessageAlreadyAdded:!0}}}if(uZ(H.data)){let{modelId:B,prompt:w}=H.data;return Z.addUserMessage(w),{type:"continue_as_agent",result:{userDisplayMessage:w,agentInput:{displayText:w,text:w,images:[],parts:[{type:"text",text:w}]},userMessageAlreadyAdded:!0,onceModelId:B}}}if(cZ(H.data)){let B=H.data.goal.objective;return Z.addUserMessage(A),{type:"continue_as_agent",result:{userDisplayMessage:A,agentInput:{displayText:A,text:B,images:[],parts:[{type:"text",text:B}]},userMessageAlreadyAdded:!0,goalContinuationOnly:!0}}}if(!H.success&&H.error)return Z.addAssistantMessage(`${H.error}`),{type:"handled",commandResult:{success:H.success,output:H.message,error:H.error,metadata:H.data}};let S=H.message;if(H.success&&typeof S==="string"&&S.trim()!=="")Z.addAssistantMessage(S);return{type:"handled",commandResult:{success:H.success,output:H.message,error:H.error,metadata:H.data}}}import{useMemoizedFn as S0}from"ahooks";import{useEffect as aZ,useRef as b2}from"react";function h9($){let J=b2(void 0),Z=b2(void 0),Y=b2(void 0),X=b2(void 0),Q=S0(async()=>{if(X.current)return X.current;let F=J.current,R=Z.current;if(!F&&!R)return;J.current=void 0,Z.current=void 0,Y.current=void 0;let D=(async()=>{try{await F?.destroy()}finally{await R?.dispose()}})();X.current=D;try{await D}finally{if(X.current===D)X.current=void 0}}),K=S0(async(F)=>{let R=$.workspaceRoot??Z.current?.workspaceRoot??Z$();if(Z.current&&(Z.current.sessionId!==F||Z.current.workspaceRoot!==R))await Q();if(!Z.current){let D=await f0.findSessionMetadata(F,R),V=D!==void 0&&(await f0.loadSession(F,R)).length>0;Z.current=await E$.create({sessionId:F,workspaceRoot:R,modelId:$.modelId,permissionMode:$.permissionMode??D?.permissionMode,reasoningEffort:D?.reasoningEffort??$.reasoningEffort,serviceTier:D?.serviceTier??$.serviceTier,responseVerbosity:D?.responseVerbosity??$.responseVerbosity,communicationStyle:D?.communicationStyle??$.communicationStyle,communicationStyleDigest:D?.communicationStyleDigest,agents:$.agents,...V?{sessionStart:{isResume:!0,resumeSessionId:F}}:{}});try{Y.current={sessionId:F,modelId:D?.selectedModelId,permissionMode:D?.permissionMode,reasoningEffort:D?.reasoningEffort,serviceTier:D?.serviceTier,responseVerbosity:D?.responseVerbosity,communicationStyle:D?.communicationStyle,communicationStyleDigest:D?.communicationStyleDigest},G$().setReasoningEffort(Z.current.getReasoningConfiguration().selection),G$().setServiceTier(Z.current.getServiceTierConfiguration().selection),G$().setResponseVerbosity(Z.current.getResponseVerbosityConfiguration().selection),G$().setCommunicationStyle(Z.current.getCommunicationStyleConfiguration().selection)}catch(C){let x=Z.current;throw Z.current=void 0,await x.dispose().catch(()=>{return}),C}}return Z.current}),G=S0(async(F)=>{let R=F?.sessionId??$.sessionId,D=!!F?.modelId&&F.modelId!==$.modelId,V;if(!D&&R){let C=Z.current!==void 0,x=await K(R),c=F?.modelId??$.modelId,n=F?.reasoningEffort??(C?$.reasoningEffort:x.getReasoningConfiguration().selection),Q0=F?.serviceTier??(C?$.serviceTier:x.getServiceTierConfiguration().selection),w0=F?.responseVerbosity??(C?$.responseVerbosity:x.getResponseVerbosityConfiguration().selection),p0=F?.communicationStyle??(C?$.communicationStyle:x.getCommunicationStyleConfiguration().selection),s0=x.getCurrentModelId(),j0=x.getReasoningConfiguration(),l$=x.getServiceTierConfiguration(),r$=x.getResponseVerbosityConfiguration(),a$=x.getCommunicationStyleConfiguration();if($.permissionMode&&(Y.current?.sessionId!==R||Y.current.permissionMode!==$.permissionMode)){let o0=await f0.setSessionPermissionMode(R,x.workspaceRoot,$.permissionMode);Y.current={...Y.current,sessionId:R,permissionMode:o0.permissionMode}}await x.refresh({modelId:c,...n?{reasoningEffort:n}:{},...Q0?{serviceTier:Q0}:{},...w0?{responseVerbosity:w0}:{},...p0?{communicationStyle:p0}:{}});let x0=x.getCommunicationStyleConfiguration();if(x0.source!=="built-in"&&!x0.contentSha256)throw Error("Custom communication style has no provenance");let Q$={...c&&c!=="inherit"&&(Y.current?.sessionId!==R||Y.current.modelId!==c)?{selectedModelId:c}:{},...n&&(Y.current?.sessionId!==R||Y.current.reasoningEffort!==n)?{reasoningEffort:n}:{},...Q0&&(Y.current?.sessionId!==R||Y.current.serviceTier!==Q0)?{serviceTier:Q0}:{},...w0&&(Y.current?.sessionId!==R||Y.current.responseVerbosity!==w0)?{responseVerbosity:w0}:{},...p0&&(Y.current?.sessionId!==R||Y.current.communicationStyle!==p0||Y.current.communicationStyleDigest!==x0.contentSha256)?{communicationStyle:p0,communicationStyleDigest:x0.source==="built-in"?null:x0.contentSha256}:{}};if(Object.keys(Q$).length>0)try{let o0=await f0.updateSessionMetadata(R,x.workspaceRoot,Q$);Y.current={sessionId:R,modelId:o0.selectedModelId,permissionMode:o0.permissionMode,reasoningEffort:o0.reasoningEffort,serviceTier:o0.serviceTier,responseVerbosity:o0.responseVerbosity,communicationStyle:o0.communicationStyle,communicationStyleDigest:o0.communicationStyleDigest}}catch(o0){throw await x.refresh({...s0?{modelId:s0}:{},reasoningEffort:j0.selection,serviceTier:l$.selection,responseVerbosity:r$.selection,communicationStyle:a$.selection}).catch(()=>{return}),o0}V=await v8.createWithRuntime(x,{sessionId:R,systemPrompt:F?.systemPrompt??$.systemPrompt,appendSystemPrompt:F?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:F?.maxTurns??$.maxTurns,modelId:F?.modelId??$.modelId,permissionMode:F?.permissionMode??$.permissionMode,agents:$.agents})}else V=await v8.create({systemPrompt:F?.systemPrompt??$.systemPrompt,appendSystemPrompt:F?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:F?.maxTurns??$.maxTurns,modelId:F?.modelId??$.modelId,permissionMode:F?.permissionMode??$.permissionMode,agents:$.agents});return J.current=V,V}),U=S0(async()=>{if(!$.sessionId)throw Error("No active session to rewind");return(await K($.sessionId)).listRewindCheckpoints()}),q=S0(async(F)=>{if(!$.sessionId)throw Error("No active session to rewind");let D=await(await K($.sessionId)).rewindSession(F);return await Q(),D}),O=S0(async()=>{if(!$.sessionId)throw Error("No active session for subagent control");return(await K($.sessionId)).listSubagents()}),z=S0(async(F,R)=>{if(!$.sessionId)throw Error("No active session for subagent control");let D=await K($.sessionId),V=!1,C,x=F,c=(Q0)=>{let w0=Q0.status==="completed"?Q0.result?.message:Q0.result?.error||Q0.result?.message;J8.getState().app.actions.completeSubagentProgress(x,Q0.status==="completed",w0)},n=D.resumeSubagent({agentId:F,prompt:R,onEvent:(Q0)=>{if(Q0.kind==="tool_start"&&"function"in Q0.toolCall)J8.getState().app.actions.updateSubagentTool(x,Q0.toolCall.function.name)},onCompleted:(Q0)=>{if(V)c(Q0);else C=Q0}});if(x=n.session.id,J8.getState().app.actions.startSubagentProgress(n.session.id,n.session.subagentType,`Resumed from ${n.source.id}: ${n.session.description}`),V=!0,C)c(C);return n}),_=S0(async()=>{if(!$.sessionId)throw Error("No active session for MCP content");return(await K($.sessionId)).getMcpContentCatalog()}),W=S0(async(F)=>{if(!$.sessionId)throw Error("No active session for MCP content");await(await K($.sessionId)).refreshMcpContentCatalogs(F)}),L=S0(async(F,R,D)=>{if(!$.sessionId)throw Error("No active session for MCP prompts");return(await K($.sessionId)).getMcpPrompt(F,R,D)}),N=S0(async(F,R,D)=>{if(!$.sessionId)throw Error("No active session for MCP completion");return(await K($.sessionId)).completeMcpArgument(F,R,D)}),A=S0(async(F,R={})=>{if(!$.sessionId)throw Error("No active session for MCP logs");return(await K($.sessionId)).getMcpLogs(F,R)}),I=S0(async(F)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await K($.sessionId)).listMcpTasks(F)}),H=S0(async(F)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await K($.sessionId)).getMcpTask(F)}),S=S0(async(F,R)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await K($.sessionId)).cancelMcpTask(F,R)}),B=S0(async(F,R)=>{if(!$.sessionId)throw Error("No active session for MCP logging");await(await K($.sessionId)).setMcpLoggingLevel(F,R)}),w=S0(async()=>{if(!$.sessionId)throw Error("No active session for MCP instructions");return(await K($.sessionId)).getMcpInstructions()}),M=S0(async()=>{if(!$.sessionId)throw Error("No active session for reasoning effort");return(await K($.sessionId)).getReasoningConfiguration()}),P=S0(async(F)=>{if(!$.sessionId)throw Error("No active session for reasoning effort");let R=await K($.sessionId);if(R.hasTurnOwner())throw Error("Cannot switch reasoning effort while a turn is active");let D=R.getReasoningConfiguration();if(R.resolveReasoningConfiguration(F),D.selection===F)return D;await R.refresh({reasoningEffort:F});try{let V;try{V=await f0.updateSessionMetadata($.sessionId,R.workspaceRoot,{reasoningEffort:F})}catch(C){if(!(C instanceof f8)&&C.code!=="ENOENT")throw C;V=await f0.createSessionMetadata($.sessionId,R.workspaceRoot,{taskStatus:"completed",selectedModelId:R.getCurrentModelId(),reasoningEffort:F,serviceTier:R.getServiceTierConfiguration().selection,responseVerbosity:R.getResponseVerbosityConfiguration().selection,communicationStyle:R.getCommunicationStyleConfiguration().selection})}return Y.current={sessionId:$.sessionId,modelId:V.selectedModelId,permissionMode:V.permissionMode,reasoningEffort:V.reasoningEffort,serviceTier:V.serviceTier,responseVerbosity:V.responseVerbosity,communicationStyle:V.communicationStyle,communicationStyleDigest:V.communicationStyleDigest},G$().setReasoningEffort(F),R.getReasoningConfiguration()}catch(V){throw await R.refresh({reasoningEffort:D.selection}),V}}),b=S0(async()=>{if(!$.sessionId)throw Error("No active session for service tier");return(await K($.sessionId)).getServiceTierConfiguration()}),v=S0(async(F)=>{if(!$.sessionId)throw Error("No active session for service tier");let R=await K($.sessionId);if(R.hasTurnOwner())throw Error("Cannot switch service tier while a turn is active");let D=R.getServiceTierConfiguration();if(R.resolveServiceTierConfiguration(F),D.selection===F)return D;await R.refresh({serviceTier:F});try{let V;try{V=await f0.updateSessionMetadata($.sessionId,R.workspaceRoot,{serviceTier:F})}catch(C){if(!(C instanceof f8)&&C.code!=="ENOENT")throw C;V=await f0.createSessionMetadata($.sessionId,R.workspaceRoot,{taskStatus:"completed",selectedModelId:R.getCurrentModelId(),reasoningEffort:R.getReasoningConfiguration().selection,serviceTier:F,responseVerbosity:R.getResponseVerbosityConfiguration().selection,communicationStyle:R.getCommunicationStyleConfiguration().selection})}return Y.current={sessionId:$.sessionId,modelId:V.selectedModelId,permissionMode:V.permissionMode,reasoningEffort:V.reasoningEffort,serviceTier:V.serviceTier,responseVerbosity:V.responseVerbosity,communicationStyle:V.communicationStyle,communicationStyleDigest:V.communicationStyleDigest},G$().setServiceTier(F),R.getServiceTierConfiguration()}catch(V){throw await R.refresh({serviceTier:D.selection}),V}}),T=S0(async()=>{if(!$.sessionId)throw Error("No active session for response verbosity");return(await K($.sessionId)).getResponseVerbosityConfiguration()}),k=S0(async(F)=>{if(!$.sessionId)throw Error("No active session for response verbosity");let R=await K($.sessionId);if(R.hasTurnOwner())throw Error("Cannot switch response verbosity while a turn is active");let D=R.getResponseVerbosityConfiguration();if(R.resolveResponseVerbosityConfiguration(F),D.selection===F)return D;await R.refresh({responseVerbosity:F});try{let V;try{V=await f0.updateSessionMetadata($.sessionId,R.workspaceRoot,{responseVerbosity:F})}catch(C){if(!(C instanceof f8)&&C.code!=="ENOENT")throw C;V=await f0.createSessionMetadata($.sessionId,R.workspaceRoot,{taskStatus:"completed",selectedModelId:R.getCurrentModelId(),reasoningEffort:R.getReasoningConfiguration().selection,serviceTier:R.getServiceTierConfiguration().selection,responseVerbosity:F,communicationStyle:R.getCommunicationStyleConfiguration().selection})}return Y.current={sessionId:$.sessionId,modelId:V.selectedModelId,permissionMode:V.permissionMode,reasoningEffort:V.reasoningEffort,serviceTier:V.serviceTier,responseVerbosity:V.responseVerbosity,communicationStyle:V.communicationStyle,communicationStyleDigest:V.communicationStyleDigest},G$().setResponseVerbosity(F),R.getResponseVerbosityConfiguration()}catch(V){throw await R.refresh({responseVerbosity:D.selection}),V}}),y=S0(async()=>{if(!$.sessionId)throw Error("No active session for communication style");return(await K($.sessionId)).getCommunicationStyleConfiguration()}),j=S0(async(F)=>{if(!$.sessionId)throw Error("No active session for communication style");let R=await K($.sessionId);if(R.hasTurnOwner())throw Error("Cannot switch communication style while a turn is active");let D=R.getCommunicationStyleConfiguration(),V=R.resolveCommunicationStyleConfiguration(F);if(V.source!=="built-in"&&!V.contentSha256)throw Error("Custom communication style has no provenance");if(D.selection===F)return D;await R.refresh({communicationStyle:F});try{let C;try{C=await f0.updateSessionMetadata($.sessionId,R.workspaceRoot,{communicationStyle:F,communicationStyleDigest:V.source==="built-in"?null:V.contentSha256})}catch(x){if(!(x instanceof f8)&&x.code!=="ENOENT")throw x;C=await f0.createSessionMetadata($.sessionId,R.workspaceRoot,{taskStatus:"completed",selectedModelId:R.getCurrentModelId(),reasoningEffort:R.getReasoningConfiguration().selection,serviceTier:R.getServiceTierConfiguration().selection,responseVerbosity:R.getResponseVerbosityConfiguration().selection,communicationStyle:F,...V.source!=="built-in"&&V.contentSha256?{communicationStyleDigest:V.contentSha256}:{}})}return Y.current={sessionId:$.sessionId,modelId:C.selectedModelId,permissionMode:C.permissionMode,reasoningEffort:C.reasoningEffort,serviceTier:C.serviceTier,responseVerbosity:C.responseVerbosity,communicationStyle:C.communicationStyle,communicationStyleDigest:C.communicationStyleDigest},G$().setCommunicationStyle(F),R.getCommunicationStyleConfiguration()}catch(C){throw await R.refresh({communicationStyle:D.selection}),C}}),o=S0(async(F)=>{if(!Z.current)return{accepted:!1,queued:0,reason:"no_active_turn"};return Z.current.enqueueSteering(F,{allowBeforeTurn:!0})}),t=S0(async(F,R)=>{let D=$.sessionId;if(!D)return{accepted:!1,queued:0,reason:"no_active_turn"};return(await K(D)).enqueueSteering(F,{allowBeforeTurn:!0,...R})}),a=S0(async(F,R)=>{let D=$.sessionId;if(!D)throw Error("Side conversation requires a Session");return(await K(D)).askSideQuestion(F,{signal:R,systemPrompt:$.systemPrompt,appendSystemPrompt:$.appendSystemPrompt})}),U0=S0(async(F,R)=>{let D=$.sessionId;if(!D)throw Error("User shell command requires a Session");return(await K(D)).executeUserShellCommand(F,R)}),m=S0(()=>Z.current?.getTurnRecoveryAssessment()??{state:"none"}),i=S0(async(F,R)=>{let D=$.sessionId;if(!D)throw Error("Code review requires a Session");let V=await K(D);await P2.recoverInterrupted(V.workspaceRoot,D,V);let C=await P2.start({sessionId:D,projectPath:V.workspaceRoot,runtime:V,request:F,signal:R}),x=await C.completion,c=(await P2.list(V.workspaceRoot,D)).find((n)=>n.start.reviewId===C.reviewId);if(!c)throw Error(`Review not found after completion: ${C.reviewId}`);return{reviewId:C.reviewId,status:x.status,findings:x.findings.length,content:E9(c.start,x)}});return aZ(()=>{let F=M2(Q);return()=>{F(),Q().catch(()=>{return})}},[Q]),{agentRef:J,createAgent:G,cleanupAgent:Q,steerActiveTurn:o,enqueueSessionInput:t,askSideQuestion:a,runCodeReview:i,executeUserShellCommand:U0,getTurnRecoveryAssessment:m,listRewindCheckpoints:U,rewindSession:q,listSubagents:O,resumeSubagent:z,getMcpContentCatalog:_,refreshMcpContentCatalogs:W,getMcpPrompt:L,completeMcpArgument:N,listMcpTasks:I,getMcpTask:H,cancelMcpTask:S,getMcpLogs:A,setMcpLoggingLevel:B,getMcpInstructions:w,getReasoningConfiguration:M,setReasoningEffort:P,getServiceTierConfiguration:b,setServiceTier:v,getResponseVerbosityConfiguration:T,setResponseVerbosity:k,getCommunicationStyleConfiguration:y,setCommunicationStyle:j}}import{useMemoizedFn as G8}from"ahooks";import{useEffect as iZ,useRef as y2}from"react";function g9($){let J=0;for(let Z of $)if(Z===`
|
|
32
|
-
`)J++;return J}function m9($,J){let Z=J?.flushTimeout??300,Y=J?.minLinesToFlush??5,X=J?.minCharsToFlush??400,Q=y2(""),K=y2(null),G=y2(""),U=y2(null),q=G8(()=>{if(Q.current){let N=Q.current,A=$.appendAssistantContent(N);H2(A,N),Q.current=""}if(K.current)clearTimeout(K.current),K.current=null}),O=G8(()=>{if(G.current)$.appendThinkingContent(G.current),G.current="";if(U.current)clearTimeout(U.current),U.current=null}),z=G8((N)=>{Q.current+=N;let A=Q.current;if(g9(A)>=Y||A.length>=X){q();return}if(!K.current)K.current=setTimeout(q,Z)}),_=G8((N)=>{G.current+=N;let A=G.current;if(g9(A)>=Y||A.length>=X){O();return}if(!U.current)U.current=setTimeout(O,Z)}),W=G8(()=>{if(Q.current="",K.current)clearTimeout(K.current),K.current=null;if(G.current="",U.current)clearTimeout(U.current),U.current=null}),L=G8(()=>{if(K.current)clearTimeout(K.current),K.current=null;if(U.current)clearTimeout(U.current),U.current=null;let N=Q.current,A=G.current;return Q.current="",G.current="",{extraContent:N,extraThinking:A}});return iZ(()=>{return()=>{W()}},[W]),{batchAppendContent:z,batchAppendThinking:_,flushContentBuffer:q,flushThinkingBuffer:O,resetStreamingBuffers:W,drainPendingBuffers:L}}var D8=y1("UI");function p9($){return $.error?.type==="canceled"||$.error?.type==="aborted"||$.metadata?.abortReason==="interrupt"}var i9=($,J,Z,Y,X,Q)=>{let K=X8(),G=Y8(),U=o$(),q=Q2(),O=Z8(),z=K2(),_=G2(),W=U2(),L=q2(),N=z2(),A=Y2(),I=z9(),H=P1(),S=M1(),B=N9(),w=R2(!1),M=R2(null),P=R2(null),b=R2(null),{createAgent:v,cleanupAgent:T,steerActiveTurn:k,enqueueSessionInput:y,listRewindCheckpoints:j,rewindSession:o,listSubagents:t,resumeSubagent:a,getMcpContentCatalog:U0,refreshMcpContentCatalogs:m,getMcpPrompt:i,completeMcpArgument:F,listMcpTasks:R,getMcpTask:D,cancelMcpTask:V,getMcpLogs:C,setMcpLoggingLevel:x,getMcpInstructions:c,getReasoningConfiguration:n,setReasoningEffort:Q0,getServiceTierConfiguration:w0,setServiceTier:p0,getResponseVerbosityConfiguration:s0,setResponseVerbosity:j0,getCommunicationStyleConfiguration:l$,setCommunicationStyle:r$,runCodeReview:a$,askSideQuestion:x0,executeUserShellCommand:Q$,getTurnRecoveryAssessment:o0}=h9({sessionId:G,workspaceRoot:U,systemPrompt:$,appendSystemPrompt:J,maxTurns:Y,modelId:q,permissionMode:O,reasoningEffort:_,serviceTier:W,responseVerbosity:L,communicationStyle:N,agents:Q}),E0=m9(H),B$=X1((K0)=>new S8({signal:K0,streamingBuffer:E0,getStreamingMessageId:()=>Y$().session.currentStreamingMessageId,finalizeStreamingMessage:H.finalizeStreamingMessage,discardStreamingMessage:H.discardStreamingMessage,clearThinking:()=>H.setCurrentThinkingContent(null)})),O$=X1(async()=>{if(!I||!G){S.setTeams([]);return}try{let B0=await new a9({configDir:M4(),subagentRegistry:T2(U)}).list({sessionId:G,projectPath:U});if(Y$().session.sessionId===G&&Y$().session.workspaceRoot===U)S.setTeams(B0)}catch(K0){D8.warn("[useCommandHandler] Failed to refresh Agent Teams",K0)}}),Z1=X1(async(K0,B0)=>{if(K0.images.length>0)return{success:!1,error:"User shell commands do not accept image attachments"};let b0=K0.text.trimStart().slice(1).trim();if(!b0)return{success:!1,error:"User shell command cannot be empty"};H.setCommand(`! ${b0}`);try{let J0=await Q$(b0,{signal:B0});if(H.addMessage({id:`user-shell-${J0.executionId}`,role:"user",content:y4(J0.record),timestamp:Date.now(),metadata:{userShellCommand:J0.record}}),J0.delivery==="next_turn")P.current?.request();return{success:J0.record.status!=="spawn_error",output:y4(J0.record),...J0.record.status==="spawn_error"?{error:J0.record.stderr||"User shell command failed"}:{}}}finally{H.setCommand(null)}});g1(()=>{return()=>{M.current=null,E0.resetStreamingBuffers()}},[E0.resetStreamingBuffers]),g1(()=>{return()=>{b.current?.abort("side-conversation-session-change"),b.current=null,S.dismissSideConversation()}},[S,G,U]),g1(()=>{S.setTeams([]),O$()},[I,S,O$,G,U]),g1(()=>{if(!z)H.setCurrentThinkingContent(null)},[z,H]);let A1=X1(()=>{if(b.current){b.current.abort("user-cancel"),b.current=null,S.dismissSideConversation();return}if(!K)return;X?.();let K0=B.getAbortController()?.signal??new AbortController().signal;if((M.current??B$(K0)).abortAndFinalize(()=>{B.abort("user-cancel"),S.setTasks([])}),!w.current)H.addAssistantMessage("任务已停止"),w.current=!0}),h1=X1(async(K0,B0)=>{let b0=`side-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;if(S.startSideConversation(b0,B0),K0.images.length>0){S.failSideConversation(b0,"Side conversations do not accept image attachments");return}if(!B0){S.failSideConversation(b0,"Usage: /btw <question>");return}b.current?.abort("side-conversation-replaced");let J0=new AbortController;b.current=J0;try{let e=await x0(B0,J0.signal);if(J0.signal.aborted||b.current!==J0)return;if(S.completeSideConversation(b0,e),e.usage)H.updateTokenUsage({inputTokens:e.usage.promptTokens,outputTokens:e.usage.completionTokens,totalTokens:e.usage.totalTokens,cacheReadTokens:e.usage.cacheReadInputTokens??0,cacheWriteTokens:e.usage.cacheCreationInputTokens??0,costUsd:e.usage.costUsd})}catch(e){if(J0.signal.aborted||b.current!==J0)return;S.failSideConversation(b0,e instanceof Error?e.message:String(e))}finally{if(b.current===J0)b.current=null}}),$8=X1(async(K0,B0)=>{let b0={contentDeltaCount:0,contentDeltaTotalLen:0,compactionCount:0},J0=B$(B0.signal);M.current=J0;let e=R9({sessionActions:H,appActions:S,commandActions:B,streamingBuffer:E0,thinkingModeEnabled:z,getStreamingMessageId:()=>Y$().session.currentStreamingMessageId,signal:B0.signal,streamSession:J0},b0);try{return{loopResult:await c9(K0,e),stats:b0}}finally{if(M.current===J0)M.current=null}}),C8=X1(async(K0)=>{let B0=!1,b0,J0=!1,e=K0;try{if(K0.text.trimStart().startsWith("!")){let J$=B.getAbortController()??B.createAbortController();return await Z1(K0,J$.signal)}await V8();let $$=B.getAbortController()??B.createAbortController(),g=w2(Y$().session),h=await P4(K0,S,H,$$.signal,T,G,w2(Y$().session),{listCheckpoints:j,execute:o},{list:t,resume:a},{getCatalog:U0,refresh:m,getPrompt:i,complete:F,listTasks:R,getTask:D,cancelTask:V,getLogs:C,setLoggingLevel:x,getInstructions:c},{get:n,set:Q0},{get:w0,set:p0},{get:s0,set:j0},{get:l$,set:r$},U,{run:a$});if(h.type==="handled")return h.commandResult;if(h.type==="continue_as_agent")B0=h.result.userMessageAlreadyAdded,b0=h.result.onceModelId,J0=h.result.goalContinuationOnly===!0,e=h.result.agentInput;let f=y$.getInstance(),p;if(!J0){let J$=await f.executeUserPromptSubmitHooks(e.text,{projectDir:U,sessionId:G,permissionMode:O,hasImages:e.images.length>0,imageCount:e.images.length});if(!J$.proceed){if(J$.warning)H.addAssistantMessage(`${J$.warning}`);return{success:!1,error:"blocked by hook"}}if(J$.updatedPrompt)e={...e,text:J$.updatedPrompt,displayText:J$.updatedPrompt,parts:[{type:"text",text:J$.updatedPrompt},...e.parts.filter((s8)=>s8.type==="image")]};if(J$.contextInjection)p=J$.contextInjection}if(!B0)H.addUserMessage(e.displayText);let $0=b4(e),n0=await v(b0?{modelId:b0}:void 0);if($$.signal.aborted)return D8.info("[handleCommandSubmit] Agent 创建期间已被中止"),{success:!1,error:"aborted"};if(p)g.push({role:"system",content:`<user-prompt-submit-hook>
|
|
33
|
-
${p}
|
|
34
|
-
</user-prompt-submit-hook>`});let d0={messages:g,userId:"cli-user",sessionId:G,workspaceRoot:U,signal:$$.signal,confirmationHandler:Z,permissionMode:O,onPermissionModeChange:async(J$)=>{await a0().setPermissionMode(J$)}},{loopResult:_$,stats:I8}=await $8(n0.chatStream($0,d0,{stream:!0,goalContinuationOnly:J0,onTurnLimitReached:Z?async(J$)=>{let s8=await Z.requestConfirmation({type:"maxTurnsExceeded",message:`已进行 ${J$.turnsCount} 轮对话。是否继续?`,risks:["继续执行可能导致更长的等待时间","可能产生更多的 API 费用"]});return{continue:s8.approved,reason:s8.reason}}:void 0}),$$);if(I8.compactionCount>0)H.setCompactedContext(d0.messages);if(_$.success&&_$.metadata?.outputTruncated)H.addAssistantMessage("输出因达到 token 上限被截断,部分内容可能不完整。");let b1=_$.finalMessage||"";if(D8.debug("[handleCommandSubmit] final reply",{success:_$.success,outputLength:b1.length,turnsCount:_$.metadata?.turnsCount,toolCallsCount:_$.metadata?.toolCallsCount}),!_$.success&&!p9(_$)){let J$=_$.error?.message||"任务执行失败";return H.addAssistantMessage(J$),{success:!1,error:J$}}if(!b1||b1.trim()===""){let J$=_$.metadata?.abortReason;if(!w.current&&I8.contentDeltaCount===0&&J$!=="interrupt")return H.addAssistantMessage("已取消"),{success:!0,output:"已取消"};return{success:!0,output:b1??""}}return{success:!0,output:b1}}catch($$){if(w.current)return{success:!1,error:"aborted"};let g=F2($$);return H.addAssistantMessage(`${g.displayMessage}`),{success:!1,error:g.displayMessage}}}),S$=X1(async(K0)=>{if(K0.aborted)return"completed";if(Y$().command.isProcessing)return"deferred";let B0=await E$.hasPendingInbox(U,G),b0=!B0&&await E$.hasActiveGoal(U,G),J0=!B0&&!b0&&await E$.hasRecoverableTurn(U,G);if(K0.aborted)return"completed";if(!B0&&!b0&&!J0)return"completed";if(Y$().command.isProcessing)return"deferred";if(await V8(),K0.aborted)return"completed";if(Y$().command.isProcessing)return"deferred";let e=B.createAbortController(),$$=()=>{if(!e.signal.aborted)e.abort("pending-resume-coordinator-disposed")};if(K0.addEventListener("abort",$$,{once:!0}),K0.aborted)$$();E0.resetStreamingBuffers(),H.clearFinalizingStreamingMessageId(),B.setProcessing(!0);try{let g=await v();if(e.signal.aborted)return e.signal.reason==="interrupted-by-new-command"?"deferred":"completed";let h=await E$.hasPendingInbox(U,G),f=!h&&await E$.hasActiveGoal(U,G);if(e.signal.aborted)return e.signal.reason==="interrupted-by-new-command"?"deferred":"completed";if(!h&&!f){let d0=o0();if(d0.state!=="none")A4(H,d0);return"completed"}let p={messages:w2(Y$().session),userId:"cli-user",sessionId:G,workspaceRoot:U,signal:e.signal,confirmationHandler:Z,permissionMode:O,onPermissionModeChange:async(d0)=>{await a0().setPermissionMode(d0)}},{loopResult:$0,stats:n0}=await $8(g.chatStream("",p,{stream:!0,pendingInputOnly:h,goalContinuationOnly:f}),e);if(n0.compactionCount>0)H.setCompactedContext(p.messages);if($0.success&&$0.metadata?.outputTruncated)H.addAssistantMessage("输出因达到 token 上限被截断,部分内容可能不完整。");if(!$0.success&&!p9($0))H.addAssistantMessage($0.error?.message||"恢复排队指令失败")}catch(g){let h=F2(g);if(!h.isAbort)H.setError(`恢复排队指令失败: ${h.displayMessage}`)}finally{if(K0.removeEventListener("abort",$$),B.getAbortController()===e)B.setProcessing(!1),B.clearAbortController(e),H.setCurrentThinkingContent(null)}return"completed"}),e0=oZ(()=>new W4({canRun:()=>!Y$().command.isProcessing,run:S$}),[S$,G,U]);P.current=e0,g1(()=>{return()=>{e0.dispose()}},[e0]);let i$=X1(async(K0)=>{if(!K0.text.trim()&&K0.images.length===0)return;let B0=d9(K0.text);if(B0){await h1(K0,B0.question);return}if(b.current?.abort("main-conversation-submitted"),b.current=null,S.dismissSideConversation(),K0.text.trimStart().startsWith("!")&&K){let J0=B.getAbortController();if(!J0){H.addAssistantMessage("当前任务没有可用的取消边界,无法执行用户 Shell 命令。");return}let e=await Z1(K0,J0.signal);if(!e.success&&e.error&&e.error!=="aborted")H.setError(e.error);return}if(K){if(K0.text.trimStart().startsWith("/")){if(/^\/goal(?:\s|$)/i.test(K0.text.trim())){await V8();let h=B.getAbortController()??B.createAbortController();await P4(K0,S,H,h.signal,T,G,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,U);return}H.addAssistantMessage("活动回合中不能执行 slash command;请先停止任务或等待完成。");return}await V8();let J0=await y$.getInstance().executeUserPromptSubmitHooks(K0.text,{projectDir:U,sessionId:G,permissionMode:O,hasImages:K0.images.length>0,imageCount:K0.images.length});if(!J0.proceed){if(J0.warning)H.addAssistantMessage(J0.warning);return}let e=K0;if(J0.updatedPrompt)e={...K0,text:J0.updatedPrompt,parts:[{type:"text",text:J0.updatedPrompt},...K0.parts.filter((h)=>h.type==="image")]};if(J0.contextInjection){let h=`<user-prompt-submit-hook>
|
|
35
|
-
${J0.contextInjection}
|
|
36
|
-
</user-prompt-submit-hook>`;e={...e,text:`${e.text}
|
|
37
|
-
|
|
38
|
-
${h}`,parts:[...e.parts,{type:"text",text:`
|
|
39
|
-
|
|
40
|
-
${h}`}]}}let $$=b4(e),g=await k($$);if(!g.accepted){let h=g.reason==="queue_full"?"补充指令队列已满,请等待当前任务处理后重试。":"当前任务正在结束,补充指令未入队,请稍后重试。";H.addAssistantMessage(h);return}if(B.enqueueCommand(K0),H.addUserMessage(K0.displayText),g.delivery==="next_turn")e0.request();return}S.setTasks([]),B.setRecoveredSteeringCount(0),w.current=!1;let b0=B.createAbortController();E0.resetStreamingBuffers(),H.clearFinalizingStreamingMessageId(),B.setProcessing(!0);try{let J0=await C8(K0);if(!J0.success&&J0.error&&J0.error!=="aborted")H.setError(J0.error)}catch(J0){let e=F2(J0);if(e.isAbort);else H.setError(`执行失败: ${e.displayMessage}`)}finally{if(B.getAbortController()===b0)B.setProcessing(!1),B.clearAbortController(b0),H.setCurrentThinkingContent(null),e0.notifyIdle()}});return g1(()=>{let K0=u9.subscribe((B0)=>{if(!x9(B0,{sessionId:G,projectPath:U}))return;if(B0.type.startsWith("team.")){let{teamName:b0,messageId:J0,content:e}=B0.properties,$$=B0.properties.metadata;if(B0.type==="team.message.received"&&typeof b0==="string"&&typeof J0==="string"&&typeof e==="string"&&r9($$,{messageId:J0,teamName:b0}))(async()=>{let g=await y(e,{messageId:J0,origin:"team_message",metadata:$$});if(!g.accepted)return;if(await new l9(b0,M4()).markDelivered([J0]),g.delivery==="next_turn")e0.request()})().catch((g)=>{D8.warn("[useCommandHandler] Failed to deliver teammate message",g)});queueMicrotask(()=>{O$()});return}if(B0.type!=="subagent.completion.queued")return;e0.request()});return()=>{K0()}},[y,e0,O$,G,U]),g1(()=>{let K0=!1;return(async()=>{if(Z)await R4.resolvePendingWithHandler(U,G,Z);else await R4.cancelPendingNonInteractive(U,G);if(K0)return;let[B0,b0]=await Promise.all([E$.hasPendingInbox(U,G),E$.hasActiveGoal(U,G)]),J0=!B0&&!b0&&await E$.hasRecoverableTurn(U,G);if(B0||b0||J0)e0.request()})().catch((B0)=>{if(!K0)D8.warn("[useCommandHandler] Failed to recover pending interaction or inbox",B0)}),()=>{K0=!0}},[Z,e0,G,U]),{executeCommand:i$,handleAbort:A1,isProcessing:K||A?.status==="loading",cleanupAgent:T}};import{useMemoizedFn as C2}from"ahooks";import{useRef as nZ,useState as tZ}from"react";var o9=()=>{let[$,J]=tZ([]),Z=nZ(-1),Y=C2((G,U)=>{let q={display:G,pasteMappings:U?new Map(U):new Map};J((O)=>[...O,q]),Z.current=-1}),X=C2(()=>{if($.length===0)return null;let G=Z.current===-1?$.length-1:Math.max(0,Z.current-1);return Z.current=G,$[G]||null}),Q=C2(()=>{if(Z.current===-1)return null;let G=Z.current+1;if(G>=$.length)return Z.current=-1,null;else return Z.current=G,$[G]||null}),K=C2(()=>{Z.current=-1});return{commandHistory:$,historyIndex:Z.current,addToHistory:Y,getPreviousCommand:X,getNextCommand:Q,resetHistoryIndex:K}};import{useMemoizedFn as j8}from"ahooks";import{useMemo as sZ,useRef as n9,useState as eZ}from"react";var t9=()=>{let[$,J]=eZ({isVisible:!1,details:null,resolver:null}),Z=n9(null),Y=n9([]),X=j8((O)=>{Z.current=O,J({isVisible:Boolean(O),details:O?.details??null,resolver:O?.resolve??null})}),Q=j8((O,z)=>{if(O.settled)return;if(O.settled=!0,O.signal&&O.abortListener)O.signal.removeEventListener("abort",O.abortListener);O.resolve(z)}),K=j8((O,z)=>{return new Promise((_)=>{let W={details:O,resolve:_,signal:z,settled:!1},L=()=>{if(Z.current===W){Q(W,{approved:!1,reason:E8}),X(Y.current.shift()??null);return}let N=Y.current.indexOf(W);if(N>=0)Y.current.splice(N,1);Q(W,{approved:!1,reason:E8})};if(W.abortListener=L,z?.aborted){L();return}if(z?.addEventListener("abort",L,{once:!0}),!Z.current){X(W);return}Y.current.push(W)})}),G=j8((O)=>{let z=Z.current;if(z)Q(z,O);let _=Y.current.shift()??null;X(_)}),U=j8(()=>{if(Z.current)Q(Z.current,{approved:!1,reason:E8});for(let O of Y.current)Q(O,{approved:!1,reason:E8});Y.current=[],X(null)}),q=sZ(()=>({requestConfirmation:K}),[K]);return{confirmationState:$,confirmationHandler:q,handleResponse:G,dismissAll:U}};import{useMemoizedFn as m1}from"ahooks";import{useRef as s9,useState as $5}from"react";var T4="␞",C4="␟";function I2($){return`${T4}PASTE:${$}:`}function I4(){return C4}var J5=`${T4}PASTE:(\\d+):[\\s\\S]*?${C4}`;function Y5($){return $.includes(T4)&&$.includes(C4)}function Z5($,J,Z){let Y=[...$.values()].filter((K)=>K.type==="image");if(Y.length>=K8)throw Error(`最多只能粘贴 ${K8} 张图片`);let X=Y.reduce((K,G)=>K+`data:${G.mimeType};base64,`.length+G.data.length,0),Q=`data:${Z};base64,`.length+J.length;if(X+Q>L2)throw Error("图片编码后总大小不能超过 5 MiB")}function X5($,J){let Z=[],Y=[];if(!Y5($)){let z=$.trim();if(z)Y.push({type:"text",text:z});return{displayText:$,text:$,images:Z,parts:Y}}let X=Array.from($.matchAll(new RegExp(J5,"g"))),Q=0,K="",G="";for(let z of X){let _=z.index,W=_+z[0].length,L=parseInt(z[1],10),N=J.get(L);if(_>Q){let A=$.slice(Q,_);Y.push({type:"text",text:A}),K+=A,G+=A}if(!N)K+=z[0],G+=z[0],Y.push({type:"text",text:z[0]});else if(N.type==="text")K+=N.data,G+=N.data,Y.push({type:"text",text:N.data});else{let A={id:L,base64:N.data,mimeType:N.mimeType};Z.push(A),Y.push({type:"image",...A}),G+=`[Image #${L}]`}Q=W}if(Q<$.length){let z=$.slice(Q);Y.push({type:"text",text:z}),K+=z,G+=z}let U=[];for(let z of Y){let _=U[U.length-1];if(z.type==="text"&&_?.type==="text")_.text+=z.text;else U.push(z)}let q=0,O=U.length;while(q<U.length){let z=U[q];if(z.type!=="text"||z.text.trim()!=="")break;q++}while(O>q){let z=U[O-1];if(z.type!=="text"||z.text.trim()!=="")break;O--}return{displayText:G.trim(),text:K.trim(),images:Z,parts:U.slice(q,O)}}function e9($="",J=0){let[Z,Y]=$5({value:$,cursorPosition:J}),X=s9(0),Q=s9(new Map),K=m1((W)=>{Y((L)=>({value:W,cursorPosition:L.cursorPosition}));for(let L of Q.current.keys()){let N=I2(L);if(!W.includes(N))Q.current.delete(L)}}),G=m1((W)=>{Y((L)=>({...L,cursorPosition:Math.max(0,Math.min(W,L.value.length))}))}),U=m1(()=>{Y({value:"",cursorPosition:0}),Q.current.clear()}),q=m1((W)=>{X.current+=1;let L=X.current;return Q.current.set(L,{type:"text",data:W}),L}),O=m1((W,L)=>{Z5(Q.current,W,L),X.current+=1;let N=X.current;return Q.current.set(N,{type:"image",data:W,mimeType:L}),N}),z=m1((W)=>{for(let[L,N]of W)if(Q.current.set(L,N),L>=X.current)X.current=L}),_=m1((W)=>X5(W,Q.current));return{value:Z.value,cursorPosition:Z.cursorPosition,setValue:K,setCursorPosition:G,clear:U,pasteMap:Q.current,addPasteMapping:q,addImagePasteMapping:O,restorePasteMappings:z,resolveInput:_}}import{useMemoizedFn as z6}from"ahooks";import{useEffect as O6,useRef as _6,useState as v4}from"react";function Q5($){return{supportsThinking:Q1().resolveConfig($).reasoning}}function S2($){return Q5($).supportsThinking}import{useInput as $6}from"ink";import{createContext as K5,useCallback as G5,useContext as U5,useEffect as q5,useMemo as z5,useRef as S4}from"react";import{jsxDEV as O5}from"react/jsx-dev-runtime";var J6=K5(null);function Y6({children:$}){let J=S4(new Map),Z=S4(0),Y=G5((Q,K)=>{let G=Z.current++;return J.current.set(G,{id:G,priority:K,handler:Q}),()=>{J.current.delete(G)}},[]),X=z5(()=>({register:Y}),[Y]);return $6((Q,K)=>{let G=[...J.current.values()].sort((U,q)=>q.priority-U.priority||U.id-q.id);for(let U of G)if(U.handler(Q,K)===!0)break}),O5(J6.Provider,{value:X,children:$},void 0,!1,void 0,this)}function q0($,J={}){let Z=U5(J6),Y=S4($);Y.current=$;let X=J.isActive??!0,Q=J.priority??0;$6((K,G)=>{if(!Z&&X)Y.current(K,G)},{isActive:!Z&&X}),q5(()=>{if(!Z||!X)return;return Z.register((K,G)=>Y.current(K,G),Q)},[X,Q,Z])}import _5 from"fast-glob";import N5 from"fuse.js";import{useEffect as Z6,useMemo as k2,useState as k4}from"react";var U8=null,H5=5000;function F5($,J){let Z=[...$.matchAll(/(?:^|\s)(@(?:"[^"]*"|(?:[^\\ ]|\\ )*))/g)];for(let Y of Z){let X=Y[1],Q=Y.index+(Y[0].length-X.length),K=Q+X.length;if(J>=Q&&J<=K){let G=X.slice(1),U=!1;if(G.startsWith('"')){if(U=!0,G=G.slice(1),G.endsWith('"'))G=G.slice(0,-1)}return{hasQuery:!0,query:G,startIndex:Q,endIndex:K,quoted:U}}}return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1}}var W5=[...f4.map(($)=>`${$}/**`),...f4,...X6.map(($)=>`**/${$}`)];function Q6($,J,Z={}){let{cwd:Y=Z$(),maxSuggestions:X=15,ignorePatterns:Q=W5,debounceDelay:K=300,fuzzyMatch:G=!0}=Z,[U,q]=k4([]),[O,z]=k4(!1),[_,W]=k4(0),L=k2(()=>JSON.stringify(Q),[Q]),N=$.includes("@"),A=k2(()=>{if(J===void 0)return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1};return F5($,J)},[$,J]);Z6(()=>{if(!N){q([]),z(!1);return}let S=Date.now();if(U8&&U8.cwd===Y&&U8.ignoreKey===L&&S-U8.timestamp<H5){q(U8.files),z(!1);return}let B=!1,M=setTimeout(async()=>{z(!0);try{let b=(await _5("**/*",{cwd:Y,dot:!1,followSymbolicLinks:!1,onlyFiles:!1,markDirectories:!0,unique:!0,ignore:Q})).map((v)=>v.replace(/\\/g,"/"));if(!B)q(b),U8={cwd:Y,ignoreKey:L,files:b,timestamp:S}}catch(P){if(console.error("Failed to load files for @ completion:",P),!B)q([])}finally{if(!B)z(!1)}},K);return()=>{B=!0,clearTimeout(M)}},[N,Y,K,L]);let I=k2(()=>G&&U.length>0?new N5(U,{threshold:0.4,ignoreLocation:!0,minMatchCharLength:1}):null,[U,G]),H=k2(()=>{if(!A.hasQuery||U.length===0)return[];let S=A.query.toLowerCase();if(S==="")return U.slice(0,X);if(I)return I.search(S).slice(0,X).map((w)=>w.item);return U.filter((B)=>B.toLowerCase().includes(S)).slice(0,X)},[A,U,I,X]);return Z6(()=>{W(0)},[H]),{...A,suggestions:H,selectedIndex:_,loading:O}}function L5($,J=!1){if($.includes(" ")||J)return`@"${$}"`;return`@${$}`}function K6($,J,Z){if(!J.hasQuery)return{newInput:$,newCursorPos:$.length};let Y=L5(Z,J.quoted),X=$.slice(0,J.startIndex),Q=$.slice(J.endIndex),K=X+Y+" "+Q,G=J.startIndex+Y.length+1;return{newInput:K,newCursorPos:G}}import{useMemoizedFn as G6}from"ahooks";import{useEffect as U6,useRef as q6}from"react";var h0=($,J)=>{let Z=q6(!1),Y=q6(null),X=G6(()=>{if(Y.current)clearTimeout(Y.current);Y.current=setTimeout(()=>{G$().setAwaitingSecondCtrlC(!1),Z.current=!1,Y.current=null},3000)}),Q=()=>{h8().shutdown("SIGINT",0)},K=G6(()=>{if(!Z.current){if(Z.current=!0,$&&J)J();G$().setAwaitingSecondCtrlC(!0),X()}else{if(Y.current)clearTimeout(Y.current),Y.current=null;G$().setAwaitingSecondCtrlC(!1),Q()}});return U6(()=>{if($){if(G$().setAwaitingSecondCtrlC(!1),Z.current=!1,Y.current)clearTimeout(Y.current),Y.current=null}},[$]),U6(()=>{return()=>{if(Y.current)clearTimeout(Y.current)}},[]),K};var f2=y1("UI"),F6=($,J,Z,Y,X,Q,K,G,U,q)=>{let z=r0()==="main-input",_=$.value,W=$.setValue,L=$.cursorPosition,N=P1(),A=o$(),I=M1(),H=X2(),S=H?S2(H):!1,[B,w]=v4(!1),[M,P]=v4([]),[b,v]=v4(0),T=Q6(_,L,{cwd:A,maxSuggestions:10}),k=h0(K||!1,Q),y=_6(0),j=500,o=_6(!1);O6(()=>{if(K)o.current=!1},[K]),O6(()=>{if(T.hasQuery&&T.suggestions.length>0){let U0=T.suggestions.map((m)=>({command:m,description:N6(m)?`Directory: ${m}`:`File: ${m}`,matchScore:1}));P(U0),w(!0),v(0)}else if(_.startsWith("/"))if(_.includes(" "))w(!1),P([]);else{let m=H6(_,A);P(m),w(m.length>0),v(0)}else w(!1),P([])},[_,T.hasQuery,T.suggestions,A]);let t=z6(()=>{N.clearMessages(),N.setError(null)}),a=z6(()=>{f2.debug("[DIAG] handleSubmit called:",{input:_,showSuggestions:B});let U0=_.trim();if(U0){let m=$.resolveInput(U0);f2.debug("[DIAG] Submitting command:",{displayText:U0,textLength:m.text.length,imageCount:m.images.length}),w(!1),P([]);let i=$.pasteMap.size>0?new Map($.pasteMap):new Map;X(U0,i),$.clear(),J(m),f2.debug("[DIAG] Command submitted to onSubmit callback")}else f2.debug("[DIAG] Empty command, not submitting")});return q0((U0,m)=>{if(U0==="?"&&!_)return U?.(),setTimeout(()=>$.clear(),0),!0;if(m.backspace||m.delete||m.leftArrow||m.rightArrow||m.pageUp||m.pageDown||!m.ctrl&&!m.meta&&!m.escape&&!m.tab&&!m.upArrow&&!m.downArrow&&!m.return&&!(U0==="?"&&!_))return!1;if(m.ctrl&&U0==="c"||m.meta&&U0==="c"||m.ctrl&&U0==="d"||m.meta&&U0==="d")return k(),!0;if(m.ctrl&&U0==="l"||m.meta&&U0==="l")return t(),!0;if(m.ctrl&&U0==="t"||m.meta&&U0==="t")return N.toggleThinkingExpanded(),!0;if(m.escape){if(q)U?.();else if(K&&Q){if(o.current)return!0;o.current=!0,Q()}else if(B)w(!1),P([]);else if(_){let F=Date.now();if(F-y.current<500)$.clear(),y.current=0;else y.current=F}return!0}if(m.tab&&m.shift)return G?.(),!0;if(m.tab){if(B&&M.length>0){let F=M[b].command;if(T.hasQuery&&T.suggestions.includes(F)){let{newInput:R,newCursorPos:D}=K6(_,T,F);W(R),$.setCursorPosition(D)}else{let R=F+" ";W(R),$.setCursorPosition(R.length)}w(!1),P([])}else if(S)I.toggleThinkingMode();return!0}if(m.return)return a(),!0;if(m.upArrow){if(B&&M.length>0){let F=M.length-1;v((R)=>R>0?R-1:F)}else{let F=Z();if(F){if(F.pasteMappings.size>0)$.restorePasteMappings(F.pasteMappings);W(F.display),$.setCursorPosition(F.display.length)}}return!0}if(m.downArrow){if(B&&M.length>0){let F=M.length-1;v((R)=>R<F?R+1:0)}else{let F=Y();if(F){if(F.pasteMappings.size>0)$.restorePasteMappings(F.pasteMappings);W(F.display),$.setCursorPosition(F.display.length)}}return!0}return!1},{isActive:z,priority:20}),{handleSubmit:a,showSuggestions:B,suggestions:M,selectedSuggestionIndex:b}};import T5 from"ansi-escapes";import{useStdout as C5}from"ink";import{useCallback as I5,useEffect as S5,useRef as k5}from"react";import{useStdout as w5}from"ink";import{debounce as B5}from"lodash-es";import{useEffect as A5,useState as b5}from"react";var W6={columns:80,rows:24};function P5($){return{width:$.columns||80,height:$.rows||24}}function M5($,J){return $.width===J.width&&$.height===J.height}function L6($,J,Z){let{stdout:Y}=w5(),[X,Q]=b5(()=>$(Y));return A5(()=>{let K=()=>{let U=$(Y);Q((q)=>J(q,U)?q:U)},G=B5(K,Z);return K(),Y.on("resize",G),()=>{Y.off("resize",G),G.cancel()}},[Y,Z,J,$]),X}function y5($){return $.columns||W6.columns}function R5($){return $.rows||W6.rows}function w6($,J=200){return L6($==="columns"?y5:R5,Object.is,J)}function v2($=200){return L6(P5,M5,$)}function q8($=200){return w6("columns",$)}function B6(){let{stdout:$}=C5(),J=q8(),Z=k5(!0),Y=Z0((Q)=>Q.session.actions.incrementClearCount),X=I5(()=>{if($)$.write(T5.clearTerminal);Y()},[$,Y]);return S5(()=>{if(Z.current){Z.current=!1;return}X()},[J,X]),{refreshStatic:X}}import p1 from"chalk";import f5 from"string-width";var A0={active:!1,renderedLineCount:0,lastRenderedLines:[],terminalWidth:process.stdout.columns||80,terminalHeight:process.stdout.rows||24,prefixIndent:4,isFirstRender:!0},V2="\x1B",D4=`${V2}[2K`,D2=($)=>$>0?`${V2}[${$}A`:"",A6=`${V2}[?25l`,b6=`${V2}[?25h`;function P6($,J){A0.active=!0,A0.renderedLineCount=0,A0.lastRenderedLines=[],A0.terminalWidth=$,A0.terminalHeight=J,A0.isFirstRender=!0}function M6($,J){A0.terminalWidth=$,A0.terminalHeight=J}function y6($,J,Z,Y){if(!A0.active)return;let X=8,Q=Math.max(1,A0.terminalHeight-X),K=[],G=K$.getTheme(),U=" ".repeat(A0.prefixIndent),q=p1.dim.hex(G.colors.border.light);if(J>0)K.push(`${U}${p1.dim.hex(G.colors.text.muted)(`^ ${J} lines above (streaming...)`)}`);let O=Z==="code",z=Z==="diff",_="",W=$;if(O&&$.length>0)_=$[0].match(/^```(\w+)?/)?.[1]||"",W=$.slice(1);else if(z&&$.length>0&&$[0]==="<<<DIFF>>>")W=$.slice(1);let L=W.slice(-Q);if(O&&J===0){let A=_?` ${p1.hex(G.colors.text.secondary)(_)}`:"";K.push(`${U}${q("╭─")}${A}`)}for(let A=0;A<L.length;A++){let I=L[A],H=U;if(A===0&&!Y&&A0.isFirstRender&&!O&&!z)H=p1.bold.hex(G.colors.success)("• ")+" ",A0.isFirstRender=!1;let S=O?4:0,B=A0.terminalWidth-A0.prefixIndent-2-S,w=I;if(f5(I)>B)w=I.slice(0,B);if(O)K.push(`${U}${q("│")} ${w}`);else if(z){let M=w;if(M.startsWith("+"))K.push(`${H}${p1.green(w)}`);else if(M.startsWith("-"))K.push(`${H}${p1.red(w)}`);else if(M.startsWith("@@"))K.push(`${H}${p1.dim(w)}`);else K.push(`${H}${w}`)}else K.push(`${H}${w}`);if(A===0&&!Y&&A0.isFirstRender)A0.isFirstRender=!1}let N=[];if(N.push(A6),A0.renderedLineCount>0)N.push(D2(A0.renderedLineCount)),N.push("\r");for(let A=0;A<K.length;A++){let I=K[A],H=A0.lastRenderedLines[A];if(I!==H)N.push(D4),N.push(I);if(A<K.length-1)N.push(`
|
|
41
|
-
`)}if(K.length<A0.renderedLineCount){for(let I=K.length;I<A0.renderedLineCount;I++)N.push(`
|
|
42
|
-
`),N.push(D4);let A=A0.renderedLineCount-K.length;N.push(D2(A))}N.push(b6),process.stdout.write(N.join("")),A0.renderedLineCount=K.length,A0.lastRenderedLines=K}function k$(){if(!A0.active)return;if(A0.renderedLineCount>0){let $=[];$.push(A6),$.push(D2(A0.renderedLineCount)),$.push("\r");for(let J=0;J<A0.renderedLineCount;J++)if($.push(D4),J<A0.renderedLineCount-1)$.push(`
|
|
43
|
-
`);if(A0.renderedLineCount>1)$.push(D2(A0.renderedLineCount-1)),$.push("\r");$.push(b6),process.stdout.write($.join(""))}A0.active=!1,A0.renderedLineCount=0,A0.lastRenderedLines=[],A0.isFirstRender=!0}function g$(){return A0.active}import R6 from"node:fs";import v5 from"node:os";import V4 from"node:path";import{MultiSelect as D5}from"@inkjs/ui";import{useMemoizedFn as j2}from"ahooks";import{Box as N0,Text as G0,useFocus as V5,useFocusManager as j5}from"ink";import E2 from"ink-select-input";import E5 from"ink-spinner";import g8 from"ink-text-input";import{useEffect as T6,useState as z8}from"react";import{jsxDEV as E}from"react/jsx-dev-runtime";var h5=[{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"}],g5=[{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 m5($){if(!$||$.trim()==="")return"名称不能为空";if(!/^[a-z0-9-]+$/.test($))return"名称只能包含小写字母、数字和连字符";if($.startsWith("-")||$.endsWith("-"))return"名称不能以连字符开头或结尾";return null}function m8({onComplete:$,onCancel:J,initialConfig:Z}){let[Y,X]=z8(Z?"name":"mode"),[Q,K]=z8({name:Z?.name||"",description:Z?.description||"",tools:Z?.tools||[],color:Z?.color,location:Z?.location||"project",systemPrompt:Z?.systemPrompt||""}),[G,U]=z8(""),[q,O]=z8(!1),[z,_]=z8(""),[W,L]=z8(Z?"edit":"manual"),{focus:N}=j5(),I={manual:["mode","name","description","tools","color","location","systemPrompt","confirm"],ai:["mode","aiPrompt","aiGenerating","confirm"],edit:["name","description","tools","color","location","systemPrompt","confirm"]}[W];T6(()=>{if(Y==="name"||Y==="description"||Y==="systemPrompt"||Y==="aiPrompt")return;N(`step-${Y}`)},[Y,N]);let H=j2(()=>{let P=I.indexOf(Y);if(P<I.length-1)X(I[P+1])}),S=j2(()=>{if(z)_("");if(Y==="confirm"&&W==="ai"){X("aiPrompt");return}let P=I.indexOf(Y);if(P>0)X(I[P-1]);else J()}),B=j2(async()=>{O(!0),_("");try{let P=await v8.create(),b=`你是一个 Subagent 配置生成专家。用户会描述他们想要创建的 agent,你需要根据描述生成一个完整的 agent 配置。
|
|
44
|
-
|
|
45
|
-
## 可用工具列表
|
|
46
|
-
|
|
47
|
-
- **Glob**: 文件模式匹配(例如:查找所有 .ts 文件)
|
|
48
|
-
- **Grep**: 代码内容搜索(例如:搜索特定函数调用)
|
|
49
|
-
- **Read**: 读取文件内容
|
|
50
|
-
- **Write**: 写入/创建文件
|
|
51
|
-
- **Edit**: 编辑文件(字符串替换)
|
|
52
|
-
- **ApplyPatch**: 原子应用多文件文本补丁
|
|
53
|
-
- **Bash**: 执行命令行命令
|
|
54
|
-
|
|
55
|
-
## 可用颜色
|
|
56
|
-
|
|
57
|
-
- red, blue, green, yellow, purple, orange, pink, cyan
|
|
58
|
-
|
|
59
|
-
## 输出格式
|
|
60
|
-
|
|
61
|
-
你必须以 JSON 格式返回配置,格式如下:
|
|
62
|
-
|
|
63
|
-
\`\`\`json
|
|
64
|
-
{
|
|
65
|
-
"name": "agent-name",
|
|
66
|
-
"description": "简洁的一句话描述(英文)",
|
|
67
|
-
"tools": ["Glob", "Grep", "Read"],
|
|
68
|
-
"color": "blue",
|
|
69
|
-
"systemPrompt": "详细的系统提示词,说明这个 agent 的职责、工作方式、输出格式等"
|
|
70
|
-
}
|
|
71
|
-
\`\`\`
|
|
72
|
-
|
|
73
|
-
## 注意事项
|
|
74
|
-
|
|
75
|
-
1. **name**: 只能包含小写字母、数字和连字符(kebab-case),例如:code-reviewer
|
|
76
|
-
2. **description**: 一句话说明用途,建议以 "Fast agent specialized for..." 开头
|
|
77
|
-
3. **tools**: 根据任务选择必要的工具,不要选择太多
|
|
78
|
-
4. **color**: 选择一个合适的颜色用于 UI 区分
|
|
79
|
-
5. **systemPrompt**: 详细说明 agent 的职责、使用的工具、输出格式等,使用 Markdown 格式
|
|
80
|
-
|
|
81
|
-
**重要**:请直接返回 JSON,不要添加任何额外的解释或文字。`,T=(await P.chatWithSystem(`你是一个 Subagent 配置生成专家。用户会描述他们想要创建的 agent,你需要根据描述生成一个完整的 agent 配置。
|
|
82
|
-
|
|
83
|
-
## 可用工具列表
|
|
84
|
-
|
|
85
|
-
- **Glob**: 文件模式匹配(例如:查找所有 .ts 文件)
|
|
86
|
-
- **Grep**: 代码内容搜索(例如:搜索特定函数调用)
|
|
87
|
-
- **Read**: 读取文件内容
|
|
88
|
-
- **Write**: 写入/创建文件
|
|
89
|
-
- **Edit**: 编辑文件(字符串替换)
|
|
90
|
-
- **ApplyPatch**: 原子应用多文件文本补丁
|
|
91
|
-
- **Bash**: 执行命令行命令
|
|
92
|
-
|
|
93
|
-
## 可用颜色
|
|
94
|
-
|
|
95
|
-
- red, blue, green, yellow, purple, orange, pink, cyan
|
|
96
|
-
|
|
97
|
-
## 输出格式
|
|
98
|
-
|
|
99
|
-
你必须以 JSON 格式返回配置,格式如下:
|
|
100
|
-
|
|
101
|
-
\`\`\`json
|
|
102
|
-
{
|
|
103
|
-
"name": "agent-name",
|
|
104
|
-
"description": "简洁的一句话描述(英文)",
|
|
105
|
-
"tools": ["Glob", "Grep", "Read"],
|
|
106
|
-
"color": "blue",
|
|
107
|
-
"systemPrompt": "详细的系统提示词,说明这个 agent 的职责、工作方式、输出格式等"
|
|
108
|
-
}
|
|
109
|
-
\`\`\`
|
|
110
|
-
|
|
111
|
-
## 注意事项
|
|
112
|
-
|
|
113
|
-
1. **name**: 只能包含小写字母、数字和连字符(kebab-case),例如:code-reviewer
|
|
114
|
-
2. **description**: 一句话说明用途,建议以 "Fast agent specialized for..." 开头
|
|
115
|
-
3. **tools**: 根据任务选择必要的工具,不要选择太多
|
|
116
|
-
4. **color**: 选择一个合适的颜色用于 UI 区分
|
|
117
|
-
5. **systemPrompt**: 详细说明 agent 的职责、使用的工具、输出格式等,使用 Markdown 格式
|
|
118
|
-
|
|
119
|
-
**重要**:请直接返回 JSON,不要添加任何额外的解释或文字。`,G)).trim(),k=T.match(/```(?:json)?\s*\n([\s\S]*?)\n```/);if(k)T=k[1];let y=JSON.parse(T);if(!y.name||!y.description||!y.systemPrompt)throw Error("Missing required fields: name, description, or systemPrompt");if(!/^[a-z0-9]+(-[a-z0-9]+)*$/.test(y.name))throw Error("Invalid name format. Must be kebab-case (lowercase, numbers, hyphens only)");K({name:y.name,description:y.description,tools:Array.isArray(y.tools)?y.tools:[],color:y.color||"blue",location:"project",systemPrompt:y.systemPrompt}),X("confirm")}catch(P){_(P instanceof Error?P.message:String(P))}finally{O(!1)}});T6(()=>{if(Y==="aiGenerating"&&!q&&!z)B()},[Y,q,z,B]);let w=j2(async()=>{try{let P=Q.location==="project"?V4.join(Z$(),".blade","agents"):V4.join(v5.homedir(),".blade","agents");await R6.promises.mkdir(P,{recursive:!0});let b=["---",`name: ${Q.name}`,`description: ${Q.description}`];if(Q.tools.length>0&&!Q.tools.includes("all")){b.push("tools:");for(let k of Q.tools)b.push(` - ${k}`)}if(Q.color)b.push(`color: ${Q.color}`);b.push("---");let v=[b.join(`
|
|
120
|
-
`),"",`# ${Q.name} Subagent`,"",Q.systemPrompt||"你是一个专门的代理,负责执行特定任务。",""].join(`
|
|
121
|
-
`),T=V4.join(P,`${Q.name}.md`);await R6.promises.writeFile(T,v,"utf-8"),$()}catch(P){console.error("保存配置失败:",P)}}),M=h0(!1,J);if(q0((P,b)=>{if(b.escape)S();else if(b.ctrl&&P==="c"||b.meta&&P==="c")M()},{isActive:Y!=="tools"}),Y==="mode")return E(N0,{flexDirection:"column",paddingY:1,children:[E(N0,{marginBottom:1,children:E(G0,{bold:!0,color:"cyan",children:"选择创建方式"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(N0,{marginBottom:1,children:E(G0,{dimColor:!0,children:"你可以手动配置每个细节,或让 AI 根据你的描述自动生成配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(E2,{items:[{label:"AI 智能生成 - 根据描述自动生成完整配置",value:"ai"},{label:"手动配置 - 逐步配置每个选项",value:"manual"}],onSelect:(P)=>{if(P.value==="ai")L("ai"),X("aiPrompt");else L("manual"),X("name")}},void 0,!1,void 0,this),E(N0,{marginTop:1,children:E(G0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 取消"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Y==="aiPrompt")return E(N0,{flexDirection:"column",paddingY:1,children:[E(N0,{marginBottom:1,children:E(G0,{bold:!0,color:"cyan",children:"AI 智能生成"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(N0,{marginBottom:1,children:E(G0,{dimColor:!0,children:'描述你想要创建的 Agent(例如:"一个专门用于代码审查的 agent,能够分析代码质量和潜在bug")'},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(N0,{marginBottom:1,children:[E(G0,{color:"green",children:"描述: "},void 0,!1,void 0,this),E(g8,{value:G,onChange:U,onSubmit:(P)=>{if(!P.trim())return;X("aiGenerating")}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E(N0,{children:E(G0,{dimColor:!0,children:"按 Enter 开始生成 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Y==="aiGenerating"){if(z)return E(N0,{flexDirection:"column",paddingY:1,children:[E(N0,{marginBottom:1,children:E(G0,{bold:!0,color:"red",children:"AI 生成失败"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(N0,{marginBottom:1,children:E(G0,{color:"red",children:z},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(N0,{marginBottom:1,children:E(G0,{dimColor:!0,children:"按 ESC 返回修改描述"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return E(N0,{flexDirection:"column",paddingY:1,children:[E(N0,{marginBottom:1,children:E(G0,{bold:!0,color:"yellow",children:[E(E5,{type:"dots"},void 0,!1,void 0,this)," AI 正在生成配置..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),E(N0,{marginBottom:1,children:E(G0,{dimColor:!0,children:['根据你的描述:"',G,'"']},void 0,!0,void 0,this)},void 0,!1,void 0,this),E(N0,{marginBottom:1,children:E(G0,{color:"gray",children:"正在调用 LLM 生成 agent 配置,请稍候..."},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}if(Y==="name"){let P=W==="edit";return E(N0,{flexDirection:"column",paddingY:1,children:[E(N0,{marginBottom:1,children:E(G0,{bold:!0,color:"cyan",children:["Step 1/7: ",P?"Agent 名称(不可修改)":"输入 Agent 名称"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),E(N0,{marginBottom:1,children:E(G0,{dimColor:!0,children:P?"编辑模式下名称不可修改(修改名称相当于创建新 Agent)":"名称只能包含小写字母、数字和连字符(例如:code-reviewer)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(N0,{marginBottom:1,children:[E(G0,{color:"green",children:"名称: "},void 0,!1,void 0,this),P?E(G0,{children:Q.name},void 0,!1,void 0,this):E(g8,{value:Q.name,onChange:(b)=>K({...Q,name:b}),onSubmit:(b)=>{if(m5(b))return;H()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E(N0,{children:E(G0,{dimColor:!0,children:P?"按 Enter 继续 | ESC 返回":"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),P&&E(g8,{value:"",onChange:()=>{},onSubmit:H,showCursor:!1},"edit-mode-dummy-input",!1,void 0,this)]},void 0,!0,void 0,this)}if(Y==="description")return E(N0,{flexDirection:"column",paddingY:1,children:[E(N0,{marginBottom:1,children:E(G0,{bold:!0,color:"cyan",children:"Step 2/7: 输入描述信息"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(N0,{marginBottom:1,children:E(G0,{dimColor:!0,children:"简短描述这个 Agent 的用途和使用场景(这将帮助主 Agent 决定何时使用它)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(N0,{marginBottom:1,children:[E(G0,{color:"green",children:"描述: "},void 0,!1,void 0,this),E(g8,{value:Q.description,onChange:(P)=>K({...Q,description:P}),onSubmit:(P)=>{if(!P.trim())return;H()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E(N0,{children:E(G0,{dimColor:!0,children:"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Y==="tools")return E(p5,{config:Q,setConfig:K,onNext:H,onPrev:S},void 0,!1,void 0,this);if(Y==="color")return E(N0,{flexDirection:"column",paddingY:1,children:[E(N0,{marginBottom:1,children:E(G0,{bold:!0,color:"cyan",children:"Step 4/7: 选择背景颜色"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(N0,{marginBottom:1,children:E(G0,{dimColor:!0,children:"为 Agent 选择一个颜色标识(用于在 UI 中区分不同的 Agents)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(E2,{items:g5,onSelect:(P)=>{let b=P.value==="none"?void 0:P.value;K({...Q,color:b}),H()}},void 0,!1,void 0,this),E(N0,{marginTop:1,children:E(G0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Y==="location")return E(N0,{flexDirection:"column",paddingY:1,children:[E(N0,{marginBottom:1,children:E(G0,{bold:!0,color:"cyan",children:"Step 5/7: 选择保存位置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(N0,{marginBottom:1,children:E(G0,{dimColor:!0,children:"项目级配置仅在当前项目生效,用户级配置全局可用"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(E2,{items:[{label:"项目级 (.blade/agents/) - 仅当前项目",value:"project"},{label:"用户级 (~/.blade/agents/) - 全局可用",value:"user"}],onSelect:(P)=>{K({...Q,location:P.value}),H()}},void 0,!1,void 0,this),E(N0,{marginTop:1,children:E(G0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Y==="systemPrompt")return E(N0,{flexDirection:"column",paddingY:1,children:[E(N0,{marginBottom:1,children:E(G0,{bold:!0,color:"cyan",children:"Step 6/7: 输入系统提示词"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(N0,{marginBottom:1,children:E(G0,{dimColor:!0,children:"定义 Agent 的行为和职责(可选,留空将使用默认提示)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(N0,{marginBottom:1,children:[E(G0,{color:"green",children:"提示词: "},void 0,!1,void 0,this),E(g8,{value:Q.systemPrompt,onChange:(P)=>K({...Q,systemPrompt:P}),onSubmit:()=>H()},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E(N0,{children:E(G0,{dimColor:!0,children:"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Y==="confirm")return E(N0,{flexDirection:"column",paddingY:1,children:[E(N0,{marginBottom:1,children:E(G0,{bold:!0,color:"cyan",children:"Step 7/7: 确认配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(N0,{flexDirection:"column",paddingLeft:2,marginBottom:1,children:[E(G0,{children:[E(G0,{bold:!0,color:"green",children:["名称:"," "]},void 0,!0,void 0,this),E(G0,{children:Q.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E(G0,{children:[E(G0,{bold:!0,color:"green",children:["描述:"," "]},void 0,!0,void 0,this),E(G0,{children:Q.description},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E(G0,{children:[E(G0,{bold:!0,color:"green",children:["工具:"," "]},void 0,!0,void 0,this),E(G0,{children:Q.tools.includes("all")?"所有工具":Q.tools.join(", ")||"所有工具"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E(G0,{children:[E(G0,{bold:!0,color:"green",children:["颜色:"," "]},void 0,!0,void 0,this),E(G0,{children:Q.color||"默认"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E(G0,{children:[E(G0,{bold:!0,color:"green",children:["位置:"," "]},void 0,!0,void 0,this),E(G0,{children:Q.location==="project"?"项目级":"用户级"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E(G0,{children:[E(G0,{bold:!0,color:"green",children:["提示词:"," "]},void 0,!0,void 0,this),E(G0,{children:Q.systemPrompt||"(使用默认)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),E(E2,{items:[{label:"确认并保存",value:"save"},{label:"返回上一步",value:"back"},{label:"取消",value:"cancel"}],onSelect:(P)=>{if(P.value==="save")w();else if(P.value==="back")S();else J()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}function p5({config:$,setConfig:J,onNext:Z,onPrev:Y}){let{isFocused:X}=V5({id:"step-tools"});q0((K,G)=>{if(G.escape)Y()},{isActive:X});let Q=(K)=>{if(K.includes("all"))J({...$,tools:["all"]});else J({...$,tools:K});Z()};return E(N0,{flexDirection:"column",paddingY:1,children:[E(N0,{marginBottom:1,children:E(G0,{bold:!0,color:"cyan",children:"Step 3/7: 选择可用工具"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(N0,{marginBottom:1,children:E(G0,{dimColor:!0,children:"方向键导航,空格切换勾选,Enter 确认进入下一步 | ESC 返回上一步"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(D5,{options:h5,defaultValue:$.tools,onSubmit:Q},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import x5 from"node:fs";import{useMemoizedFn as x1}from"ahooks";import{Box as v0,Text as g0}from"ink";import j4 from"ink-select-input";import{useEffect as u5,useMemo as C6,useState as h2}from"react";import{jsxDEV as Y0}from"react/jsx-dev-runtime";var E4=10;function I6({workspaceRoot:$,initialMode:J="menu",onComplete:Z,onCancel:Y}){let X=T2($),[Q,K]=h2(J),[G,U]=h2(null),[q,O]=h2(0),[z,_]=h2(0),W=x1(()=>{X.clear(),X.loadFromStandardLocations(),O((T)=>T+1)}),L=C6(()=>{return X.getAllSubagents()},[q]),N=Math.ceil(L.length/E4)||1,A=C6(()=>{let T=z*E4;return L.slice(T,T+E4)},[L,z]);u5(()=>{let T=Math.max(0,N-1);if(z>T)_(T)},[N,z]);let I=x1(()=>{if(z<N-1)_((T)=>T+1)}),H=x1(()=>{if(z>0)_((T)=>T-1)}),S=[{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"}],B=x1((T)=>{if(T.value==="cancel"){Y?.();return}K(T.value)}),w=x1((T)=>{if(U(T.value),Q==="edit")K("editWizard");else if(Q==="delete")K("deleteConfirm")}),M=x1(async()=>{if(!G?.configPath)return;try{await x5.promises.unlink(G.configPath),W(),P()}catch(T){console.error("删除失败:",T)}}),P=x1(()=>{K("menu"),U(null)}),b=h0(!1,Y);if(q0((T,k)=>{if(k.escape){if(Q==="menu")Y?.();else if(Q==="list"||Q==="edit"||Q==="delete")_(0),P();else if(Q==="deleteConfirm")P()}else if(k.ctrl&&T==="c"||k.meta&&T==="c")b();else if(Q==="list"){if(k.leftArrow||T==="h")H();else if(k.rightArrow||T==="l")I()}},{isActive:Q!=="create"&&Q!=="editWizard"}),Q==="menu")return Y0(v0,{flexDirection:"column",paddingY:1,children:[Y0(v0,{marginBottom:1,children:Y0(g0,{bold:!0,color:"cyan",children:"Agents 管理"},void 0,!1,void 0,this)},void 0,!1,void 0,this),Y0(j4,{items:S,onSelect:B},void 0,!1,void 0,this),Y0(v0,{marginTop:1,children:Y0(g0,{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(L.length===0)return Y0(v0,{flexDirection:"column",paddingY:1,children:[Y0(v0,{marginBottom:1,children:Y0(g0,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this)},void 0,!1,void 0,this),Y0(v0,{paddingLeft:2,children:Y0(g0,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),Y0(v0,{marginTop:1,paddingLeft:2,children:Y0(g0,{color:"gray",children:"配置文件位置: .blade/agents/ 或 ~/.blade/agents/"},void 0,!1,void 0,this)},void 0,!1,void 0,this),Y0(v0,{marginTop:1,paddingLeft:2,children:Y0(g0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return Y0(v0,{flexDirection:"column",paddingY:1,children:[Y0(v0,{marginBottom:1,children:[Y0(g0,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this),Y0(g0,{color:"gray",children:[" (共 ",L.length," 个)"]},void 0,!0,void 0,this),N>1&&Y0(g0,{color:"yellow",children:[" ","第 ",z+1,"/",N," 页"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),A.map((T)=>Y0(v0,{flexDirection:"column",paddingLeft:2,children:[Y0(v0,{children:Y0(g0,{children:[Y0(g0,{bold:!0,color:T.color||"white",children:["• ",T.name]},void 0,!0,void 0,this),Y0(g0,{color:"gray",children:[" - ",T.description]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),T.tools&&T.tools.length>0&&Y0(v0,{paddingLeft:2,children:Y0(g0,{color:"gray",children:["工具: ",T.tools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),T.configPath&&Y0(v0,{paddingLeft:2,children:Y0(g0,{color:"gray",dimColor:!0,children:T.configPath},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},T.name,!0,void 0,this)),Y0(v0,{marginTop:1,paddingLeft:2,children:N>1?Y0(g0,{dimColor:!0,children:"Left/Right to page | ESC 返回菜单"},void 0,!1,void 0,this):Y0(g0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}let v=(T)=>{if(L.length===0)return Y0(v0,{flexDirection:"column",paddingY:1,children:[Y0(v0,{marginBottom:1,children:Y0(g0,{bold:!0,color:"cyan",children:T},void 0,!1,void 0,this)},void 0,!1,void 0,this),Y0(v0,{paddingLeft:2,children:Y0(g0,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),Y0(v0,{marginTop:1,paddingLeft:2,children:Y0(g0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);let k=L.map((y)=>({key:y.name,label:`${y.name} - ${y.description}`,value:y}));return Y0(v0,{flexDirection:"column",paddingY:1,children:[Y0(v0,{marginBottom:1,children:Y0(g0,{bold:!0,color:"cyan",children:T},void 0,!1,void 0,this)},void 0,!1,void 0,this),Y0(j4,{items:k,onSelect:w},void 0,!1,void 0,this),Y0(v0,{marginTop:1,children:Y0(g0,{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 Y0(m8,{onComplete:()=>{W(),P()},onCancel:P},void 0,!1,void 0,this);if(Q==="edit")return v("编辑 Agent");if(Q==="editWizard"&&G){let T={name:G.name,description:G.description,tools:G.tools||[],color:G.color,location:G.configPath?.includes(".blade/agents")?"project":"user",systemPrompt:G.systemPrompt||""};return Y0(m8,{initialConfig:T,onComplete:()=>{W(),P()},onCancel:P},void 0,!1,void 0,this)}if(Q==="delete")return v("删除 Agent");if(Q==="deleteConfirm"&&G)return Y0(v0,{flexDirection:"column",paddingY:1,children:[Y0(v0,{marginBottom:1,children:Y0(g0,{bold:!0,color:"red",children:"确认删除"},void 0,!1,void 0,this)},void 0,!1,void 0,this),Y0(v0,{marginBottom:1,paddingLeft:2,children:Y0(g0,{children:["你确定要删除 Agent"," ",Y0(g0,{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),Y0(v0,{marginBottom:1,paddingLeft:2,children:Y0(g0,{dimColor:!0,children:["文件路径: ",G.configPath]},void 0,!0,void 0,this)},void 0,!1,void 0,this),Y0(v0,{marginBottom:1,paddingLeft:2,children:Y0(g0,{color:"red",children:"此操作无法撤销!"},void 0,!1,void 0,this)},void 0,!1,void 0,this),Y0(j4,{items:[{label:"确认删除",value:"confirm"},{label:"取消",value:"cancel"}],onSelect:(T)=>{if(T.value==="confirm")M();else P()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}import{Box as O8,Text as W0}from"ink";import d5,{useEffect as l5,useState as r5}from"react";import{useEffect as c5,useState as S6}from"react";function v6($=Z$(),J=5000){let[Z,Y]=S6(null),[X,Q]=S6(!0);return c5(()=>{let K=!0,G=async()=>{try{let q=await k6($);if(!K)return;if(!q){Y(null),Q(!1);return}let O=await f6($);if(!K)return;Y(O)}catch{if(K)Y(null)}finally{if(K)Q(!1)}};G();let U=null;if(J>0)U=setInterval(G,J);return()=>{if(K=!1,U)clearInterval(U)}},[$,J]),{branch:Z,loading:X}}import{jsxDEV as X0,Fragment as m$}from"react/jsx-dev-runtime";var V6=d5.memo(()=>{let $=Z2(),J=Z8(),Y=J2()==="shortcuts",X=K9(),Q=o$(),{branch:K}=v6(Q),G=X2(),U=$9(),q=rJ(),O=K2(),z=G2(),_=U2(),W=q2(),L=z2(),N=aJ(),A=iJ(),I=Q8(),H=H9(),S=Y8(),[B,w]=r5(null);l5(()=>{let k=!1;new h4(Q,S).get().then((o)=>{if(!k)w(o)}).catch(()=>{if(!k)w(null)});let j=h4.subscribe((o)=>{if(!k&&o.sessionId===S&&o.workspaceRoot===Q)w(o.goal)});return()=>{k=!0,j()}},[S,Q]);let M=G?S2(G):!1,b=(()=>{if(J==="default")return null;if(J==="autoEdit")return X0(W0,{color:"magenta",children:[">> ","auto edit on ",X0(W0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="plan")return X0(W0,{color:"cyan",children:["‖ plan mode on ",X0(W0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="yolo")return X0(W0,{color:"red",children:["yolo mode on ",X0(W0,{color:"gray",children:"(all tools auto-approved)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null})(),v=b!==null,T=[["Enter:发送","Shift+Enter:换行","Esc:中止"],["Shift+Tab:切换模式","Up/Down:历史","Tab:补全"],["Ctrl+A:行首","Ctrl+E:行尾","Ctrl+K:删到尾"],["Ctrl+U:删到首","Ctrl+W:删单词","Ctrl+C:退出"],["Ctrl+O:浏览记录","PgUp/PgDn:翻页","g/G:首尾"]];return X0(O8,{flexDirection:"row",justifyContent:"space-between",paddingX:2,paddingY:0,children:[Y?X0(O8,{flexDirection:"column",gap:0,children:T.map((k,y)=>X0(O8,{flexDirection:"row",children:[k.map((j,o)=>{let[t,a]=j.split(":");return X0(O8,{flexDirection:"row",width:20,children:[X0(W0,{color:"yellow",children:t},void 0,!1,void 0,this),X0(W0,{color:"gray",children:":"},void 0,!1,void 0,this),X0(W0,{color:"white",children:a},void 0,!1,void 0,this)]},o,!0,void 0,this)}),y===T.length-1&&X0(W0,{color:"cyan",children:" ? 关闭"},void 0,!1,void 0,this)]},y,!0,void 0,this))},void 0,!1,void 0,this):X0(O8,{flexDirection:"row",gap:1,children:[K&&X0(m$,{children:[X0(W0,{color:"gray",children:[" ",K]},void 0,!0,void 0,this),X0(W0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),b,v&&X0(W0,{color:"gray",children:"·"},void 0,!1,void 0,this),B&&X0(m$,{children:[X0(W0,{color:B.status==="active"?"green":B.status==="verifying"?"cyan":B.status==="blocked"||B.status==="budget_limited"?"yellow":"gray",children:["goal:",B.status," ",B.objective.slice(0,32),B.prematureStop?` recovery:${B.prematureStop.consecutiveCount}`:"",B.verificationStall?` verify-gap:${B.verificationStall.consecutiveCount}`:"",B.frontierStall?` frontier:${B.frontierStall.category}:${B.frontierStall.consecutiveCount}`:""]},void 0,!0,void 0,this),X0(W0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X0(W0,{color:"gray",children:"? for shortcuts"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X0(O8,{flexDirection:"row",gap:1,children:!$?X0(W0,{color:"red",children:"[WARN] API 密钥未配置"},void 0,!1,void 0,this):X0(m$,{children:[M&&X0(m$,{children:[O?X0(W0,{color:"cyan",children:["Effort ",z]},void 0,!0,void 0,this):X0(W0,{color:"gray",children:"Tab:Effort"},void 0,!1,void 0,this),X0(W0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),_!=="auto"&&X0(m$,{children:[X0(W0,{color:_==="fast"?"yellow":"gray",children:["Speed ",_]},void 0,!0,void 0,this),X0(W0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),W!=="auto"&&X0(m$,{children:[X0(W0,{color:"gray",children:["Output ",W]},void 0,!0,void 0,this),X0(W0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),L!=="auto"&&X0(m$,{children:[X0(W0,{color:"gray",children:["Style ",L]},void 0,!0,void 0,this),X0(W0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),G&&X0(W0,{color:"gray",children:G.model},void 0,!1,void 0,this),X0(W0,{color:"gray",children:"·"},void 0,!1,void 0,this),q?X0(W0,{color:"yellow",children:"压缩中..."},void 0,!1,void 0,this):X0(W0,{color:U<20?"red":U<50?"yellow":"gray",children:[U,"%"]},void 0,!0,void 0,this),X0(W0,{color:"gray",children:"·"},void 0,!1,void 0,this),X0(W0,{color:A===void 0?"gray":"cyan",children:["Cache ",D6(A)]},void 0,!0,void 0,this),N>0.001&&X0(m$,{children:[X0(W0,{color:"gray",children:"·"},void 0,!1,void 0,this),X0(W0,{color:"green",children:["$",N<0.01?N.toFixed(4):N.toFixed(3)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),I.length>0&&X0(m$,{children:[X0(W0,{color:"gray",children:"·"},void 0,!1,void 0,this),X0(W0,{color:"yellow",children:["已排队 ",I.length]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),H>0&&X0(m$,{children:[X0(W0,{color:"gray",children:"·"},void 0,!1,void 0,this),X0(W0,{color:"cyan",children:["已恢复 ",H," 条指令"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),X&&X0(m$,{children:[X0(W0,{color:"gray",children:"·"},void 0,!1,void 0,this),X0(W0,{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 a5 from"react";import{jsxDEV as _8}from"react/jsx-dev-runtime";var j6=a5.memo(({suggestions:$,selectedIndex:J,visible:Z,maxDisplay:Y=8})=>{if(!Z||$.length===0)return null;let X=0,Q=Math.min(Y,$.length),K=J>=$.length;if(J>=Y&&!K)X=J-Y+1,Q=J+1;let G=$.slice(X,Q),U=$.length>Y;return _8(g4,{flexDirection:"column",paddingX:2,paddingY:0,children:[G.map((q,O)=>{let _=X+O===J;return _8(g4,{flexDirection:"row",paddingX:1,gap:2,children:[_8(m4,{color:_?"cyan":"white",bold:_,children:q.command},void 0,!1,void 0,this),_8(m4,{color:_?"cyan":"gray",dimColor:!_,children:["- ",q.description]},void 0,!0,void 0,this)]},q.command,!0,void 0,this)}),U&&_8(g4,{paddingX:1,children:_8(m4,{color:K?"cyan":"gray",bold:K,dimColor:!K,children:["... and ",$.length-Y," more"]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as v$,Text as s$,useStdout as rX}from"ink";import aX from"ink-select-input";import qJ,{useMemo as NY}from"react";import{Box as L0,Text as k0}from"ink";import c1,{useEffect as GJ,useMemo as u1,useRef as zY}from"react";import{Box as t4,Text as a6}from"ink";import GX from"react";import{Text as p$}from"ink";import XX from"react";import d6 from"string-width";import p8 from"string-width";function p4({onlyFirst:$=!1}={}){return new RegExp("(?:\\u001B\\][\\s\\S]*?(?:\\u0007|\\u001B\\u005C|\\u009C))|[\\u001B\\u009B][[\\]()#;?]*(?:\\d{1,4}(?:[;:]\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]",$?void 0:"g")}var i5=p4();function x4($){if(typeof $!=="string")throw TypeError(`Expected a \`string\`, got \`${typeof $}\``);if(!$.includes("\x1B")&&!$.includes(""))return $;return $.replace(i5,"")}var E6=($=0)=>(J)=>`\x1B[${J+$}m`,h6=($=0)=>(J)=>`\x1B[${38+$};5;${J}m`,g6=($=0)=>(J,Z,Y)=>`\x1B[${38+$};2;${J};${Z};${Y}m`,c0={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],overline:[53,55],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],gray:[90,39],grey:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgGray:[100,49],bgGrey:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}},sq=Object.keys(c0.modifier),o5=Object.keys(c0.color),n5=Object.keys(c0.bgColor),eq=[...o5,...n5];function t5(){let $=new Map;for(let[J,Z]of Object.entries(c0)){for(let[Y,X]of Object.entries(Z))c0[Y]={open:`\x1B[${X[0]}m`,close:`\x1B[${X[1]}m`},Z[Y]=c0[Y],$.set(X[0],X[1]);Object.defineProperty(c0,J,{value:Z,enumerable:!1})}return Object.defineProperty(c0,"codes",{value:$,enumerable:!1}),c0.color.close="\x1B[39m",c0.bgColor.close="\x1B[49m",c0.color.ansi=E6(),c0.color.ansi256=h6(),c0.color.ansi16m=g6(),c0.bgColor.ansi=E6(10),c0.bgColor.ansi256=h6(10),c0.bgColor.ansi16m=g6(10),Object.defineProperties(c0,{rgbToAnsi256:{value(J,Z,Y){if(J===Z&&Z===Y){if(J<8)return 16;if(J>248)return 231;return Math.round((J-8)/247*24)+232}return 16+36*Math.round(J/255*5)+6*Math.round(Z/255*5)+Math.round(Y/255*5)},enumerable:!1},hexToRgb:{value(J){let Z=/[a-f\d]{6}|[a-f\d]{3}/i.exec(J.toString(16));if(!Z)return[0,0,0];let[Y]=Z;if(Y.length===3)Y=[...Y].map((Q)=>Q+Q).join("");let X=Number.parseInt(Y,16);return[X>>16&255,X>>8&255,X&255]},enumerable:!1},hexToAnsi256:{value:(J)=>c0.rgbToAnsi256(...c0.hexToRgb(J)),enumerable:!1},ansi256ToAnsi:{value(J){if(J<8)return 30+J;if(J<16)return 90+(J-8);let Z,Y,X;if(J>=232)Z=((J-232)*10+8)/255,Y=Z,X=Z;else{J-=16;let G=J%36;Z=Math.floor(J/36)/5,Y=Math.floor(G/6)/5,X=G%6/5}let Q=Math.max(Z,Y,X)*2;if(Q===0)return 30;let K=30+(Math.round(X)<<2|Math.round(Y)<<1|Math.round(Z));if(Q===2)K+=60;return K},enumerable:!1},rgbToAnsi:{value:(J,Z,Y)=>c0.ansi256ToAnsi(c0.rgbToAnsi256(J,Z,Y)),enumerable:!1},hexToAnsi:{value:(J)=>c0.ansi256ToAnsi(c0.hexToAnsi256(J)),enumerable:!1}}),c0}var s5=t5(),m6=s5;var m2=new Set(["\x1B",""]),e5=39,c4="\x07",u6="[",$X="]",c6="m",g2=`${$X}8;;`,p6=($)=>`${m2.values().next().value}${u6}${$}${c6}`,x6=($)=>`${m2.values().next().value}${g2}${$}${c4}`,JX=($)=>$.split(" ").map((J)=>p8(J)),u4=($,J,Z)=>{let Y=[...J],X=!1,Q=!1,K=p8(x4($.at(-1)));for(let[G,U]of Y.entries()){let q=p8(U);if(K+q<=Z)$[$.length-1]+=U;else $.push(U),K=0;if(m2.has(U))X=!0,Q=Y.slice(G+1,G+1+g2.length).join("")===g2;if(X){if(Q){if(U===c4)X=!1,Q=!1}else if(U===c6)X=!1;continue}if(K+=q,K===Z&&G<Y.length-1)$.push(""),K=0}if(!K&&$.at(-1).length>0&&$.length>1)$[$.length-2]+=$.pop()},YX=($)=>{let J=$.split(" "),Z=J.length;while(Z>0){if(p8(J[Z-1])>0)break;Z--}if(Z===J.length)return $;return J.slice(0,Z).join(" ")+J.slice(Z).join("")},ZX=($,J,Z={})=>{if(Z.trim!==!1&&$.trim()==="")return"";let Y="",X,Q,K=JX($),G=[""];for(let[z,_]of $.split(" ").entries()){if(Z.trim!==!1)G[G.length-1]=G.at(-1).trimStart();let W=p8(G.at(-1));if(z!==0){if(W>=J&&(Z.wordWrap===!1||Z.trim===!1))G.push(""),W=0;if(W>0||Z.trim===!1)G[G.length-1]+=" ",W++}if(Z.hard&&K[z]>J){let L=J-W,N=1+Math.floor((K[z]-L-1)/J);if(Math.floor((K[z]-1)/J)<N)G.push("");u4(G,_,J);continue}if(W+K[z]>J&&W>0&&K[z]>0){if(Z.wordWrap===!1&&W<J){u4(G,_,J);continue}G.push("")}if(W+K[z]>J&&Z.wordWrap===!1){u4(G,_,J);continue}G[G.length-1]+=_}if(Z.trim!==!1)G=G.map((z)=>YX(z));let U=G.join(`
|
|
122
|
-
`),q=[...U],O=0;for(let[z,_]of q.entries()){if(Y+=_,m2.has(_)){let{groups:L}=new RegExp(`(?:\\${u6}(?<code>\\d+)m|\\${g2}(?<uri>.*)${c4})`).exec(U.slice(O))||{groups:{}};if(L.code!==void 0){let N=Number.parseFloat(L.code);X=N===e5?void 0:N}else if(L.uri!==void 0)Q=L.uri.length===0?void 0:L.uri}let W=m6.codes.get(Number(X));if(q[z+1]===`
|
|
123
|
-
`){if(Q)Y+=x6("");if(X&&W)Y+=p6(W)}else if(_===`
|
|
124
|
-
`){if(X&&W)Y+=p6(X);if(Q)Y+=x6(Q)}O+=_.length}return Y};function d4($,J,Z){return String($).normalize().replaceAll(`\r
|
|
125
|
-
`,`
|
|
126
|
-
`).split(`
|
|
127
|
-
`).map((Y)=>ZX(Y,J,Z)).join(`
|
|
128
|
-
`)}var l4=($)=>{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 d6(J)};var l6=($)=>{return/[*_~`<[\]https?:]/.test($)},r4=($)=>{let Z=$.replace(/\*\*(.*?)\*\*/g,"$1").replace(/\*(.*?)\*/g,"$1").replace(/_(.*?)_/g,"$1").replace(/~~(.*?)~~/g,"$1").replace(/`(.*?)`/g,"$1").replace(/<u>(.*?)<\/u>/g,"$1").replace(/\[(.*?)\]\(.*?\)/g,"$1").split(/\s+/).filter((Y)=>Y.length>0);if(Z.length===0)return 0;return Math.max(...Z.map((Y)=>d6(Y)))},N8=($,J,Z=!1)=>{if(J<=0)return[$];let Y=$.trimEnd(),Q=d4(Y,J,{hard:Z,trim:!1,wordWrap:!0}).split(`
|
|
129
|
-
`).filter((K)=>K.length>0);return Q.length>0?Q:[""]},r6=($,J,Z,Y)=>{let X=Math.max(0,Z-J);if(Y==="center"){let Q=Math.floor(X/2);return" ".repeat(Q)+$+" ".repeat(X-Q)}if(Y==="right")return" ".repeat(X)+$;return $+" ".repeat(X)};import{jsxDEV as f$,Fragment as KX}from"react/jsx-dev-runtime";var a4=2,i4=1,o4=2;function n4($,J){return`inline-${$}-${J}`}var QX=({text:$})=>{let J=P0();if(!l6($))return f$(p$,{children:$},void 0,!1,void 0,this);let Z=[],Y=0,X=0,Q=0,K=/(\*\*.*?\*\*|\*(?!\s).*?(?<!\s)\*|_(?!\s).*?(?<!\s)_|~~.*?~~|`+[^`]+`+|\[.*?\]\(.*?\)|https?:\/\/\S+)/g,G;while((G=K.exec($))!==null){if(G.index>Y){let z=$.slice(Y,G.index);Z.push(f$(p$,{children:z},n4("text",X++),!1,void 0,this))}let U=G[0],q=null,O=n4("match",Q++);try{if(U.startsWith("**")&&U.endsWith("**")&&U.length>a4*2)q=f$(p$,{bold:!0,children:U.slice(a4,-a4)},O,!1,void 0,this);else if(U.length>i4*2&&(U.startsWith("*")&&U.endsWith("*")||U.startsWith("_")&&U.endsWith("_"))){let z=$.substring(G.index-1,G.index),_=$.substring(K.lastIndex,K.lastIndex+1);if(!(/\w/.test(z)||/\w/.test(_)||/[./\\]/.test(z+_)))q=f$(p$,{italic:!0,children:U.slice(i4,-i4)},O,!1,void 0,this)}else if(U.startsWith("~~")&&U.endsWith("~~")&&U.length>o4*2)q=f$(p$,{strikethrough:!0,children:U.slice(o4,-o4)},O,!1,void 0,this);else if(U.startsWith("`")&&U.endsWith("`")){let z=U.match(/^(`+)([^`]+)\1$/);if(z&&z[2])q=f$(p$,{color:J.colors.syntax.keyword,backgroundColor:J.colors.background.secondary,bold:!0,children:` ${z[2]} `},O,!1,void 0,this)}else if(U.startsWith("[")&&U.includes("](")&&U.endsWith(")")){let z=U.match(/\[(.*?)\]\((.*?)\)/);if(z){let _=z[1],W=z[2];q=f$(p$,{children:[_,f$(p$,{color:J.colors.info,children:[" (",W,")"]},void 0,!0,void 0,this)]},O,!0,void 0,this)}}else if(U.match(/^https?:\/\//))q=f$(p$,{color:J.colors.info,children:U},O,!1,void 0,this)}catch(z){console.error("InlineRenderer 解析错误:",U,z),q=null}Z.push(q??f$(p$,{children:U},O,!1,void 0,this)),Y=K.lastIndex}if(Y<$.length){let U=$.slice(Y);Z.push(f$(p$,{children:U},n4("text",X++),!1,void 0,this))}return f$(KX,{children:Z.filter((U)=>U!==null)},void 0,!1,void 0,this)},x$=XX.memo(QX);import{jsxDEV as H8}from"react/jsx-dev-runtime";var UX="▎",i6=GX.memo(({lines:$,level:J})=>{let Z=P0(),Y=UX.repeat(J);return H8(t4,{flexDirection:"column",children:$.map((X,Q)=>{if(X.trim()==="")return H8(t4,{height:1},Q,!1,void 0,this);return H8(t4,{flexDirection:"row",children:[H8(a6,{dimColor:!0,color:Z.colors.text.muted,children:[Y," "]},void 0,!0,void 0,this),H8(a6,{italic:!0,wrap:"wrap",children:H8(x$,{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 x2,Text as U1}from"ink";import{isPlainObject as JJ}from"lodash-es";import{common as wX,createLowlight as BX}from"lowlight";import{LRUCache as AX}from"lru-cache";import JY from"react";import{Box as p2,Text as x8}from"ink";import G1,{Fragment as e6}from"react";import{LRUCache as s6}from"lru-cache";import qX from"string-width";var zX=1024,OX=1048576,o6=1000,n6=new s6({max:zX,maxSize:OX,sizeCalculation:($,J)=>Math.max(1,J.length*2+$.length*8)});function s4($){let J=!0;for(let Y=0;Y<$.length;Y++)if($.charCodeAt(Y)>127){J=!1;break}if(J)return $.split("");if($.length<=o6){let Y=n6.get($);if(Y)return Y}let Z=Array.from($);if($.length<=o6)n6.set($,Z);return Z}var _X=2048,NX=524288,HX=4096,t6=new s6({max:_X,maxSize:NX,sizeCalculation:($,J)=>Math.max(1,J.length*2+8)});function K1($){if(/^[\x20-\x7E]*$/.test($))return $.length;let J=t6.get($);if(J!==void 0)return J;let Z=qX($);if($.length<=HX)t6.set($,Z);return Z}import{jsxDEV as F8}from"react/jsx-dev-runtime";var e4=2,$Y=G1.memo(({children:$,maxWidth:J,maxHeight:Z,overflowDirection:Y="top",additionalHiddenLinesCount:X=0})=>{let Q=P0(),K=[],G=Math.max(Math.round(Z??Number.MAX_SAFE_INTEGER),e4);function U(N){if(!G1.isValidElement(N))return;if(N.type===e6){G1.Children.forEach(N.props.children,U);return}if(N.type===p2){WX(N,J,K);return}}G1.Children.forEach($,U);let O=K.length>G||X>0?G-1:G,z=O!==void 0?Math.max(0,K.length-O):0,_=z+X,L=(z>0?Y==="top"?K.slice(z):K.slice(0,O):K).map((N,A)=>F8(p2,{children:N.length>0?N.map((I,H)=>F8(x8,{...I.props,children:I.text},H,!1,void 0,this)):F8(x8,{children:" "},void 0,!1,void 0,this)},A,!1,void 0,this));return F8(p2,{flexDirection:"column",width:J,flexShrink:0,children:[_>0&&Y==="top"&&F8(x8,{color:Q.colors.text.muted,dimColor:!0,children:["... ",_," line",_===1?"":"s"," hidden ..."]},void 0,!0,void 0,this),L,_>0&&Y==="bottom"&&F8(x8,{color:Q.colors.text.muted,dimColor:!0,children:["... ",_," line",_===1?"":"s"," hidden ..."]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});function FX($){if(!G1.isValidElement($)||$.type!==p2)return{noWrapSegments:[],segments:[]};let J={noWrapSegments:[],segments:[]},Z=!1;function Y(X,Q){if(X===null||X===void 0)return;if(typeof X==="string"||typeof X==="number"){let q=String(X);if(!q)return;let O={text:q,props:Q??{}};if(Q===void 0||Q.wrap==="wrap")Z=!0,J.segments.push(O);else if(!Z)J.noWrapSegments.push(O);else J.segments.push(O);return}if(!G1.isValidElement(X))return;if(X.type===e6){G1.Children.forEach(X.props.children,(q)=>Y(q,Q));return}if(X.type!==x8)return;let{children:K,...G}=X.props,U=Q===void 0?G:{...Q,...G};G1.Children.forEach(K,(q)=>Y(q,U))}return G1.Children.forEach($.props.children,(X)=>Y(X,void 0)),J}function WX($,J,Z){let Y=FX($);if(Y.segments.length===0&&Y.noWrapSegments.length===0){Z.push([]);return}let X=0;for(let z of Y.noWrapSegments)X+=K1(z.text);if(Y.segments.length===0){let z=[],_=[];for(let W of Y.noWrapSegments){let L=W.text.split(`
|
|
130
|
-
`);for(let N=0;N<L.length;N++){if(N>0)z.push(_),_=[];if(L[N])_.push({text:L[N],props:W.props})}}if(_.length>0)z.push(_);for(let W of z)Z.push(W);return}let Q=J-X;if(Q<1){LX(Y.noWrapSegments,J,Z);return}let K=[],G=[],U=0;function q(){if(K.length===0)K.push([...Y.noWrapSegments,...G]);else if(X>0)K.push([{text:" ".repeat(X),props:{}},...G]);else K.push(G);G=[],U=0}function O(z,_){if(G.length>0&&G[G.length-1].props===_)G[G.length-1].text+=z;else G.push({text:z,props:_})}for(let z of Y.segments){let _=z.text.split(`
|
|
131
|
-
`);for(let W=0;W<_.length;W++){if(W>0)q();let N=_[W].split(/(\s+)/);for(let A of N){if(!A)continue;let I=K1(A);if(U+I>Q&&U>0){if(q(),/^\s+$/.test(A))continue}if(I>Q){let S=s4(A);while(S.length>0){let B=0,w=0;for(let M of S){let P=K1(M);if(U+w+P>Q)break;w+=P,B++}if(B>0){let M=S.slice(0,B).join("");O(M,z.props),U+=K1(M),S=S.slice(B)}if(S.length>0)q()}}else O(A,z.props),U+=I}}if(z.text.endsWith(`
|
|
132
|
-
`))q()}if(G.length>0)q();for(let z of K)Z.push(z)}function LX($,J,Z){let Y=[],X=[],Q=0;for(let K of $){let G=K.text.split(`
|
|
133
|
-
`);for(let U=0;U<G.length;U++){if(U>0)Y.push(X),X=[],Q=0;let q=G[U];if(!q)continue;let O=K1(q),z=Math.max(0,J-K1("…"));if(O<=z&&Q===0)X.push({text:q,props:K.props}),Q+=O;else{let _=s4(q),W=Q,L=0;for(let A of _){let I=K1(A);if(W+I>z)break;W+=I,L++}let N=_.slice(0,L).join("");if(N)X.push({text:N,props:K.props});X.push({text:"…",props:{}}),Q=W+K1("…")}}}if(X.length>0)Y.push(X);if(Y.length===0)Y.push([{text:"…",props:{}}]);for(let K of Y)Z.push(K)}import{jsxDEV as A$}from"react/jsx-dev-runtime";var $J=BX(wX),bX=200,PX=524288,MX=4096,YY=new AX({max:bX,maxSize:PX,sizeCalculation:($)=>$.retainedChars});function ZY($,J){return`${J??"__auto__"}\x00${$}`}function yX($,J){return YY.get(ZY($,J))?.root}function RX($,J,Z){if($.length>MX)return;let Y=J?.length??0;YY.set(ZY($,J),{root:Z,retainedChars:Math.max(1,$.length*2+Y)})}function TX($){return JJ($)&&$.type==="text"&&typeof $.value==="string"}function CX($){return JJ($)&&$.type==="element"}function IX($){return JJ($)&&$.type==="root"&&Array.isArray($.children)}function u2($,J,Z=0){if(TX($))return A$(U1,{wrap:"wrap",children:$.value},Z,!1,void 0,this);if(CX($)){let Y=$.properties?.className?.[0]||"",X=J.default;if(Y.includes("comment"))X=J.comment;else if(Y.includes("string"))X=J.string;else if(Y.includes("number"))X=J.number;else if(Y.includes("keyword"))X=J.keyword;else if(Y.includes("function"))X=J.function;else if(Y.includes("variable"))X=J.variable;else if(Y.includes("operator"))X=J.operator;else if(Y.includes("type"))X=J.type;else if(Y.includes("tag"))X=J.tag;else if(Y.includes("attr"))X=J.attr;let Q=$.children?.map((K,G)=>u2(K,J,G));return A$(U1,{color:X,wrap:"wrap",children:Q},Z,!1,void 0,this)}if(IX($))return A$(JY.Fragment,{children:$.children.map((Y,X)=>u2(Y,J,X))},Z,!1,void 0,this);return A$(U1,{},Z,!1,void 0,this)}function SX($,J,Z){let Y=Z||K$.getTheme().colors.syntax;try{let X=yX($,J);if(X)return u2(X,Y);let Q;if(!J||!$J.registered(J))Q=$J.highlightAuto($);else Q=$J.highlight(J,$);let K=Q;if(!K.children||K.children.length===0)return A$(U1,{color:Y.default,wrap:"wrap",children:$},void 0,!1,void 0,this);return RX($,J,Q),u2(Q,Y)}catch(X){return A$(U1,{color:Y.default,wrap:"wrap",children:$},void 0,!1,void 0,this)}}var c2=JY.memo(({content:$,language:J,showLineNumbers:Z=!0,terminalWidth:Y,availableHeight:X})=>{let Q=P0(),K=$.split(`
|
|
134
|
-
`),G=0;if(X&&K.length>X){let z=Math.max(X,e4);if(K.length>z)G=K.length-z,K=K.slice(G)}let U=K.length+G,q=String(U).length+1,O=Math.max(20,Y-4);return A$(x2,{borderStyle:"round",borderColor:Q.colors.border.light,paddingX:1,paddingY:0,marginY:1,flexDirection:"column",children:[J&&A$(x2,{marginBottom:0,children:A$(U1,{color:Q.colors.text.secondary,children:J},void 0,!1,void 0,this)},void 0,!1,void 0,this),G>0&&A$(x2,{marginBottom:0,children:A$(U1,{color:Q.colors.text.muted,dimColor:!0,children:["... ",G," lines hidden ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),A$($Y,{maxWidth:O,maxHeight:X,children:K.map((z,_)=>{let W=_+G+1;return A$(x2,{flexDirection:"row",children:[Z&&A$(U1,{color:Q.colors.text.muted,dimColor:!0,wrap:"truncate",children:[String(W).padStart(q-1," ")," "]},void 0,!0,void 0,this),z.trim()===""?A$(U1,{wrap:"wrap",children:" "},void 0,!1,void 0,this):SX(z,J,Q.colors.syntax)]},_,!0,void 0,this)})},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as XY,Text as T$}from"ink";import kX,{useState as fX}from"react";import{jsxDEV as b$}from"react/jsx-dev-runtime";var QY=400;function vX($){let J=$.split(`
|
|
135
|
-
`),Z=[],Y=0,X=0;for(let Q of J){if(Q.startsWith("---")||Q.startsWith("+++"))continue;if(Q.startsWith("@@")){let K=Q.match(/@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@/);if(K)Y=parseInt(K[1],10),X=parseInt(K[3],10);Z.push({type:"header",content:Q});continue}if(Q.startsWith("-")){Z.push({type:"remove",content:Q.substring(1),lineNumber:Y}),Y++;continue}if(Q.startsWith("+")){Z.push({type:"add",content:Q.substring(1),lineNumber:X}),X++;continue}if(Q.startsWith(" ")||Q===""){Z.push({type:"context",content:Q.substring(1),lineNumber:X}),Y++,X++;continue}}return Z}var YJ=kX.memo(({patch:$,startLine:J,matchLine:Z,terminalWidth:Y,maxLines:X=20,isFocused:Q=!1})=>{let K=P0(),G=vX($),[U,q]=fX(!1);q0((H)=>{if(H.toLowerCase()==="e")q((S)=>!S)},{isActive:Q&&G.length>X});let z=Math.max(...G.map((H)=>H.lineNumber||0)).toString().length+1,_=G.filter((H)=>H.type==="add").length,W=G.filter((H)=>H.type==="remove").length,L=G.length,N=L>X,A;if(!N)A=G;else if(U)A=G.slice(0,QY);else A=G.slice(0,X);let I=L-A.length;return b$(XY,{flexDirection:"column",marginTop:1,marginBottom:1,children:[b$(T$,{color:K.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,Y)))},void 0,!1,void 0,this),N&&b$(T$,{color:K.colors.info,children:[U?`已展开 ${A.length}/${L} 行`:`显示前 ${X} 行,共 ${L} 行`," · ",b$(T$,{color:K.colors.success,children:["+",_]},void 0,!0,void 0,this)," ",b$(T$,{color:K.colors.error,children:["-",W]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),N&&b$(T$,{color:K.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,Y)))},void 0,!1,void 0,this),A.map((H,S)=>{if(H.type==="header")return b$(T$,{color:K.colors.muted,dimColor:!0,children:H.content},S,!1,void 0,this);let B=H.lineNumber?H.lineNumber.toString().padStart(z," "):" ".repeat(z),w=" ",M,P;if(H.type==="add")w="+",P=K.colors.success,M=void 0;else if(H.type==="remove")w="-",P=K.colors.error,M=void 0;else P=K.colors.text.primary;let b=Math.max(0,Y-z-2),v=H.content;if(v.length>b)v=v.substring(0,b-3)+"...";return b$(T$,{color:P,backgroundColor:M,children:[b$(T$,{dimColor:!0,children:B},void 0,!1,void 0,this),b$(T$,{children:w},void 0,!1,void 0,this),b$(T$,{children:[" ",v]},void 0,!0,void 0,this)]},S,!0,void 0,this)}),N&&b$(XY,{marginTop:1,children:U?b$(T$,{color:K.colors.info,dimColor:!0,children:[I>0?`已达显示上限 ${QY} 行,仍有 ${I} 行未显示`:"已显示全部内容",Q?" · 按 E 折叠":""]},void 0,!0,void 0,this):b$(T$,{color:K.colors.info,dimColor:!0,children:["已隐藏剩余 ",I," 行",Q?" · 按 E 展开全部":""]},void 0,!0,void 0,this)},void 0,!1,void 0,this),b$(T$,{color:K.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,Y)))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as ZJ,Text as KY}from"ink";import DX from"react";import{jsxDEV as W8}from"react/jsx-dev-runtime";var VX=({itemText:$,type:J,marker:Z,leadingWhitespace:Y=""})=>{let X=J==="ol"?`${Z}. `:`${Z} `,Q=X.length,K=Y.length;return W8(ZJ,{paddingLeft:K+1,flexDirection:"row",children:[W8(ZJ,{width:Q,children:W8(KY,{children:X},void 0,!1,void 0,this)},void 0,!1,void 0,this),W8(ZJ,{flexGrow:1,children:W8(KY,{wrap:"wrap",children:W8(x$,{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)},XJ=DX.memo(VX);import{Text as QJ}from"ink";import jX,{useMemo as EX}from"react";import GY from"string-width";import{jsxDEV as KJ}from"react/jsx-dev-runtime";var UY=4,L8=3,hX=4,qY=jX.memo(({headers:$,rows:J,terminalWidth:Z})=>{let Y=P0(),X=EX(()=>{if($.length===0||J.length===0)return null;let z=$.length,_=$.map((P,b)=>{let v=Math.max(r4(P),L8);for(let T of J)v=Math.max(v,r4(T[b]||""));return v}),W=$.map((P,b)=>{let v=Math.max(l4(P),L8);for(let T of J)v=Math.max(v,l4(T[b]||""));return v}),L=1+z*3,N=Math.max(Z-L-UY,z*L8),A=_.reduce((P,b)=>P+b,0),I=W.reduce((P,b)=>P+b,0),H=!1,S;if(I<=N)S=W;else if(A<=N){let P=N-A,b=W.map((T,k)=>T-_[k]),v=b.reduce((T,k)=>T+k,0);S=_.map((T,k)=>{if(v===0)return T;let y=Math.floor(b[k]/v*P);return T+y})}else{H=!0;let P=N/A;S=_.map((b)=>Math.max(Math.floor(b*P),L8))}function B(){let P=1;for(let b=0;b<$.length;b++){let v=N8($[b],S[b],H);P=Math.max(P,v.length)}for(let b of J)for(let v=0;v<b.length;v++){let T=N8(b[v]||"",S[v],H);P=Math.max(P,T.length)}return P}if(B()>hX)return{type:"vertical",columnWidths:S,needsHardWrap:H};return{type:"horizontal",columnWidths:S,needsHardWrap:H}},[$,J,Z]);if(!X)return null;if(X.type==="vertical"){let z=Math.min(Z-1,40),_="─".repeat(z);return KJ(QJ,{children:J.map((W,L)=>{let N=[];if(L>0)N.push(_);return W.forEach((A,I)=>{let H=$[I]||`Column ${I+1}`,S=(A||"").replace(/\n+/g," ").trim();N.push(`\x1B[1m${H}:\x1B[22m ${S}`)}),N.join(`
|
|
136
|
-
`)}).join(`
|
|
137
|
-
`)},void 0,!1,void 0,this)}let{columnWidths:Q,needsHardWrap:K}=X;function G(z){let W={top:{left:"┌",mid:"┬",right:"┐",h:"─"},middle:{left:"├",mid:"┼",right:"┤",h:"─"},bottom:{left:"└",mid:"┴",right:"┘",h:"─"}}[z],L=W.left;return Q.forEach((N,A)=>{L+=W.h.repeat(N+2),L+=A<Q.length-1?W.mid:W.right}),L}function U(z,_){let W=z.map((I,H)=>{let S=Q[H]||L8;return N8(I||"",S,K)}),L=Math.max(...W.map((I)=>I.length),1),N=W.map((I)=>Math.floor((L-I.length)/2)),A=[];for(let I=0;I<L;I++){let H="│";for(let S=0;S<z.length;S++){let B=W[S],w=N[S],M=I-w,P=M>=0&&M<B.length?B[M]:"",b=Q[S]||L8,v=GY(P),T=r6(_?`\x1B[1m${P}\x1B[22m`:P,v,b,_?"center":"left");H+=` ${T} │`}A.push(H)}return A}let q=[];if(q.push(G("top")),q.push(...U($,!0)),q.push(G("middle")),J.forEach((z,_)=>{if(q.push(...U(z,!1)),_<J.length-1)q.push(G("middle"))}),q.push(G("bottom")),Math.max(...q.map((z)=>GY(z)))>Z-UY){let z=Math.min(Z-1,40),_="─".repeat(z);return KJ(QJ,{children:J.map((W,L)=>{let N=[];if(L>0)N.push(_);return W.forEach((A,I)=>{let H=$[I]||`Column ${I+1}`,S=(A||"").replace(/\n+/g," ").trim();N.push(`\x1B[1m${H}:\x1B[22m ${S}`)}),N.join(`
|
|
138
|
-
`)}).join(`
|
|
139
|
-
`)},void 0,!1,void 0,this)}return KJ(QJ,{color:Y.colors.text.primary,children:q.join(`
|
|
140
|
-
`)},void 0,!1,void 0,this)});import{jsxDEV as u}from"react/jsx-dev-runtime";var gX=($,J,Z)=>{switch($){case"user":return{color:J.info,prefix:"> "};case"assistant":return{color:J.success,prefix:"• "};case"system":return{color:J.warning,prefix:" "};case"tool":{let Y=Z&&"phase"in Z?Z.phase:void 0;return{color:J.text.secondary,prefix:Y==="start"?"• ":Y==="complete"?" └ ":" "}}default:return{color:J.text.primary,prefix:" "}}},mX=c1.memo(({content:$,language:J,terminalWidth:Z,isPending:Y=!1,availableHeight:X})=>{let Q=P0();if(Y&&X!==void 0){let K=$.split(`
|
|
141
|
-
`),G=4,U=Math.max(1,X-4);if(K.length>U){let q=K.slice(0,U).join(`
|
|
142
|
-
`);return u(L0,{flexDirection:"column",flexShrink:0,children:[u(c2,{content:q,language:J,showLineNumbers:!0,terminalWidth:Z},void 0,!1,void 0,this),u(k0,{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(c2,{content:$,language:J,showLineNumbers:!0,terminalWidth:Z},void 0,!1,void 0,this)}),pX=c1.memo(({content:$,level:J})=>{let Z=P0();switch(J){case 1:return u(k0,{bold:!0,color:Z.colors.primary,children:u(x$,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 2:return u(k0,{bold:!0,color:Z.colors.primary,children:u(x$,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 3:return u(k0,{bold:!0,color:Z.colors.text.primary,children:u(x$,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 4:return u(k0,{italic:!0,color:Z.colors.text.muted,children:u(x$,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);default:return u(k0,{children:u(x$,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)}}),xX=c1.memo(({terminalWidth:$})=>{let J=P0(),Z=Math.max(0,Math.min($-4,80));return u(k0,{dimColor:!0,color:J.colors.text.muted,children:"─".repeat(Z)},void 0,!1,void 0,this)}),uX=c1.memo(({content:$})=>{return u(k0,{wrap:"wrap",children:u(x$,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)}),cX=c1.memo(({content:$})=>{let J=P0();return u(L0,{flexDirection:"row",gap:1,children:[u(k0,{color:J.colors.info,children:" "},void 0,!1,void 0,this),u(k0,{color:J.colors.text.muted,italic:!0,children:$},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}),dX=c1.memo(({detail:$,terminalWidth:J})=>{let Z=P0(),Y=50,X=$.split(`
|
|
143
|
-
`);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,K=Q?X.slice(0,50):X,G=K.join(`
|
|
144
|
-
`),U=G.includes("<<<DIFF>>>"),q=G.includes("```");if(U){let O=G.match(/<<<DIFF>>>\s*({[\s\S]*?})\s*<<<\/DIFF>>>/);if(O)try{let z=JSON.parse(O[1]);return u(L0,{flexDirection:"column",children:[u(YJ,{patch:z.patch,startLine:z.startLine,matchLine:z.matchLine,terminalWidth:J},void 0,!1,void 0,this),Q&&u(L0,{marginTop:1,children:u(k0,{dimColor:!0,color:Z.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(q){let O=G.match(/```(\w+)?\s*\n([\s\S]*?)\n```/);if(O){let z=O[1]||"text",_=O[2];return u(L0,{flexDirection:"column",children:[u(c2,{content:_,language:z,showLineNumbers:!1,terminalWidth:J},void 0,!1,void 0,this),Q&&u(L0,{marginTop:1,children:u(k0,{dimColor:!0,color:Z.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(L0,{flexDirection:"column",children:[K.map((O,z)=>u(k0,{color:Z.colors.text.primary,children:O},z,!1,void 0,this)),Q&&u(L0,{marginTop:1,children:u(k0,{dimColor:!0,color:Z.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 lX($,J,Z,Y=80){if(!Z||J===void 0||J<=0)return{content:$,isTruncated:!1,hiddenLines:0};let Q=Math.max(1,J-8),K=Math.max(40,Y*0.8),G=Q*K;if($.length<=G)return{content:$,isTruncated:!1,hiddenLines:0};let U=Math.floor(G*0.9),q=$.length-U,O=q,z=$.indexOf(`
|
|
145
|
-
`,q);if(z!==-1&&z-q<K)O=z+1;let _=$.slice(O),L=($.slice(0,O).match(/\n/g)||[]).length+1;return{content:_,isTruncated:!0,hiddenLines:L}}var t$=c1.memo(({content:$,role:J,terminalWidth:Z,metadata:Y,isPending:X=!1,availableTerminalHeight:Q,hidePrefix:K=!1,noMargin:G=!1,renderPlainTextOnly:U=!1,streamingLines:q,streamingHiddenLines:O,messageId:z,blocksOverride:_,currentLineOverride:W,streamingMode:L="text",renderCodeBlocksAsPlainText:N=!1})=>{let A=P0(),I=_!==void 0,H=u1(()=>gX(J,A.colors,Y),[J,A.colors,Y]),{color:S,prefix:B}=H,w=B.length+1,M=u1(()=>{if(!Y||typeof Y!=="object")return null;if(!("subtaskRef"in Y))return null;let F=Y.subtaskRef;if(!F||typeof F!=="object")return null;return F},[Y]),P=J==="tool"&&Y?.phase==="start",b=!G&&!P,v=u1(()=>{if(!U)return[];return $.split(/\r?\n/)},[$,U]);if(!I&&X){let F=q??$.split(/\r?\n/),R=O??0,D=!1,V=!1,C=!1;if(L!=="text")D=L==="code",V=L==="diff",C=L==="table";return u(L0,{flexDirection:"column",marginBottom:b?1:0,flexShrink:0,children:[R>0&&u(L0,{flexDirection:"row",flexShrink:0,children:[u(L0,{width:w,flexShrink:0},void 0,!1,void 0,this),u(k0,{color:A.colors.text.muted,dimColor:!0,children:["^ ",R," lines above (streaming...)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),F.map((x,c)=>{if(L==="text"){if(x.match(R1.codeBlock))D=!D;else if(x.match(R1.diffStart))V=!0;else if(x.match(R1.diffEnd))V=!1;else if(x.match(R1.table))C=!0;else if(C&&!x.match(R1.table))C=!1}let n=L==="text"&&!D&&!V&&!C,Q0=n?x.match(R1.ulItem):null,w0=n?x.match(R1.olItem):null,p0=Q0??w0;return u(L0,{flexDirection:"row",flexShrink:0,children:[c===0&&!K?u(L0,{marginRight:1,flexShrink:0,children:u(k0,{color:S,bold:!0,children:B},void 0,!1,void 0,this)},void 0,!1,void 0,this):u(L0,{width:w,flexShrink:0},void 0,!1,void 0,this),u(L0,{flexGrow:1,flexShrink:0,children:p0?u(XJ,{type:Q0?"ul":"ol",marker:p0[2],itemText:p0[3],leadingWhitespace:p0[1]},void 0,!1,void 0,this):u(k0,{wrap:"wrap",children:x===""?" ":x},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},c,!0,void 0,this)})]},void 0,!0,void 0,this)}if(!I&&U)return u(L0,{flexDirection:"column",marginBottom:b?1:0,flexShrink:0,children:v.map((F,R)=>u(L0,{flexDirection:"row",flexShrink:0,children:[R===0&&!K?u(L0,{marginRight:1,flexShrink:0,children:u(k0,{color:S,bold:!0,children:B},void 0,!1,void 0,this)},void 0,!1,void 0,this):u(L0,{width:w,flexShrink:0},void 0,!1,void 0,this),u(L0,{flexGrow:1,flexShrink:0,children:u(k0,{wrap:"wrap",children:F===""?" ":F},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},R,!0,void 0,this))},void 0,!1,void 0,this);let T=zY(null);GJ(()=>{T.current=null},[z]);let k=u1(()=>{if(I)return null;if(!z)return null;return OY(z)},[z,I]);GJ(()=>{if(I)return;if(!k||!z)return;T.current={messageId:z,blocks:k}},[k,z,I]),GJ(()=>{if(I)return;if(!k||!z)return;_Y(z)},[k,z,I]);let y=u1(()=>I?{content:$,isTruncated:!1,hiddenLines:0}:lX($,Q,X,Z),[$,Q,X,Z,I]),{content:j,isTruncated:o,hiddenLines:t}=y;if(!I&&J==="tool"&&Y&&"detail"in Y){let F=Y;if(F.detail)return u(L0,{flexDirection:"column",marginBottom:G?0:1,children:[u(L0,{flexDirection:"row",children:[u(L0,{marginRight:1,children:u(k0,{color:S,bold:!0,children:B},void 0,!1,void 0,this)},void 0,!1,void 0,this),u(k0,{color:S,children:$},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(L0,{marginLeft:B.length+1,children:u(dX,{detail:F.detail,terminalWidth:Z-(B.length+1)},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}let{completedContent:a,currentLine:U0}=u1(()=>{if(I)return{completedContent:"",currentLine:W??""};if(!X)return{completedContent:j,currentLine:""};let F=j.lastIndexOf(`
|
|
146
|
-
`);if(F===-1)return{completedContent:"",currentLine:j};return{completedContent:j.slice(0,F+1),currentLine:j.slice(F+1)}},[j,X,I,W]),m=zY({content:"",blocks:[]}),i=u1(()=>{if(I)return _??[];if(k)return k;if(T.current&&T.current.messageId===z)return T.current.blocks;let F=m.current;if(!X||!a.startsWith(F.content)){let C=UJ(a);return m.current={content:a,blocks:C},C}if(a===F.content)return F.blocks;let R=a.slice(F.content.length),D=UJ(R),V=[...F.blocks,...D];return m.current={content:a,blocks:V},V},[a,X,I,_]);return u(L0,{flexDirection:"column",marginBottom:b?1:0,flexShrink:0,children:[o&&u(L0,{flexDirection:"row",flexShrink:0,children:[u(L0,{width:w,flexShrink:0},void 0,!1,void 0,this),u(k0,{color:A.colors.text.muted,dimColor:!0,children:["^ ",t," lines above (streaming...)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),i.map((F,R)=>{if(F.type==="empty")return u(L0,{height:1,flexShrink:0},R,!1,void 0,this);return u(L0,{flexDirection:"row",flexShrink:0,children:[R===0&&!K&&u(L0,{marginRight:1,flexShrink:0,children:u(k0,{color:S,bold:!0,children:B},void 0,!1,void 0,this)},void 0,!1,void 0,this),(R>0||K)&&u(L0,{width:w,flexShrink:0},void 0,!1,void 0,this),u(L0,{flexGrow:1,flexShrink:0,children:F.type==="code"?N?u(k0,{wrap:"wrap",children:F.content},void 0,!1,void 0,this):u(mX,{content:F.content,language:F.language,terminalWidth:Z-w,isPending:X,availableHeight:Q},void 0,!1,void 0,this):F.type==="table"&&F.tableData?u(qY,{headers:F.tableData.headers,rows:F.tableData.rows,terminalWidth:Z-w},void 0,!1,void 0,this):F.type==="heading"?u(pX,{content:F.content,level:F.level||1},void 0,!1,void 0,this):F.type==="list"?u(XJ,{type:F.listType||"ul",marker:F.marker||"-",itemText:F.content,leadingWhitespace:" ".repeat(F.indentation||0)},void 0,!1,void 0,this):F.type==="hr"?u(xX,{terminalWidth:Z-w},void 0,!1,void 0,this):F.type==="diff"&&F.diffData?u(YJ,{patch:F.diffData.patch,startLine:F.diffData.startLine,matchLine:F.diffData.matchLine,terminalWidth:Z-w},void 0,!1,void 0,this):F.type==="command-message"?u(cX,{content:F.content},void 0,!1,void 0,this):F.type==="blockquote"&&F.blockquoteLines?u(i6,{lines:F.blockquoteLines,level:F.blockquoteLevel||1},void 0,!1,void 0,this):u(uX,{content:F.content},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},R,!0,void 0,this)}),U0&&u(L0,{flexDirection:"row",flexShrink:0,children:[i.length===0&&!K?u(L0,{marginRight:1,flexShrink:0,children:u(k0,{color:S,bold:!0,children:B},void 0,!1,void 0,this)},void 0,!1,void 0,this):u(L0,{width:w,flexShrink:0},void 0,!1,void 0,this),u(L0,{flexGrow:1,flexShrink:0,children:u(k0,{wrap:"wrap",children:U0},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),M&&u(L0,{flexDirection:"row",flexShrink:0,children:[u(L0,{width:w,flexShrink:0},void 0,!1,void 0,this),u(L0,{flexDirection:"column",flexGrow:1,flexShrink:0,children:[u(k0,{color:A.colors.text.muted,children:["Subtask"," ",typeof M.agentType==="string"?`@${M.agentType}`:"",typeof M.status==="string"?` · ${M.status}`:""]},void 0,!0,void 0,this),typeof M.summary==="string"&&M.summary.trim()!==""&&u(k0,{wrap:"wrap",children:M.summary},void 0,!1,void 0,this),typeof M.childSessionId==="string"&&u(k0,{color:A.colors.text.muted,children:["Session ",M.childSessionId]},void 0,!0,void 0,this),typeof M.resumedFrom==="string"&&u(k0,{color:A.colors.text.muted,children:["Resumed from ",M.resumedFrom,typeof M.resumeDepth==="number"?` · depth ${M.resumeDepth}`:""]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},($,J)=>{return $.content===J.content&&$.role===J.role&&$.terminalWidth===J.terminalWidth&&$.isPending===J.isPending&&$.availableTerminalHeight===J.availableTerminalHeight&&$.hidePrefix===J.hidePrefix&&$.noMargin===J.noMargin&&$.renderPlainTextOnly===J.renderPlainTextOnly&&$.streamingHiddenLines===J.streamingHiddenLines&&$.streamingLines===J.streamingLines&&$.messageId===J.messageId&&$.metadata===J.metadata&&$.blocksOverride===J.blocksOverride&&$.currentLineOverride===J.currentLineOverride&&$.streamingMode===J.streamingMode&&$.renderCodeBlocksAsPlainText===J.renderCodeBlocksAsPlainText});import{jsxDEV as D0,Fragment as tX}from"react/jsx-dev-runtime";var iX=qJ.memo(({label:$,isSelected:J})=>D0(s$,{color:J?"yellow":void 0,children:$},void 0,!1,void 0,this)),oX=qJ.memo(({details:$,headerColor:J,isPlanModeExit:Z,isPlanModeEnter:Y,terminalWidth:X})=>D0(tX,{children:[D0(v$,{marginBottom:1,children:D0(s$,{children:$.message},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.planContent&&D0(v$,{flexDirection:"column",marginBottom:1,borderStyle:"single",borderColor:J,padding:1,children:[D0(s$,{bold:!0,color:J,children:"实施方案"},void 0,!1,void 0,this),D0(v$,{marginTop:1,children:D0(t$,{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&&D0(v$,{flexDirection:"column",marginBottom:1,children:D0(t$,{content:$.details,role:"assistant",terminalWidth:X},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.risks&&$.risks.length>0&&D0(v$,{flexDirection:"column",marginBottom:1,children:[D0(s$,{color:"red",bold:!0,children:"风险提示:"},void 0,!1,void 0,this),$.risks.map((Q,K)=>D0(v$,{marginLeft:2,children:D0(s$,{color:"red",children:["• ",Q]},void 0,!0,void 0,this)},K,!1,void 0,this))]},void 0,!0,void 0,this),$.affectedFiles&&$.affectedFiles.length>0&&D0(v$,{flexDirection:"column",marginBottom:1,children:[D0(s$,{color:"yellow",children:"影响的文件:"},void 0,!1,void 0,this),$.affectedFiles.slice(0,3).map((Q,K)=>D0(v$,{marginLeft:2,children:D0(s$,{children:["• ",Q]},void 0,!0,void 0,this)},K,!1,void 0,this)),$.affectedFiles.length>3&&D0(v$,{marginLeft:2,children:D0(s$,{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 nX($,J,Z,Y){return`使用 ↑↓ 选择,回车确认 · ${J||Z||Y?"Y/N":$?"Y/S/N":"Y/S/P/N"} 快捷键 · Esc 取消`}var HY=qJ.memo(({details:$,onResponse:J})=>{let{stdout:Z}=rX(),Y=Z.columns||80,Q=r0()==="confirmation-prompt",K=h0(!1),G=$.type==="exitPlanMode",U=$.type==="enterPlanMode",q=$.type==="maxTurnsExceeded",O=$.type==="mcpSampling";q0((W,L)=>{if(L.ctrl&&W==="c"||L.meta&&W==="c"){K();return}if(L.escape){J({approved:!1,reason:"用户取消"});return}let N=W.toLowerCase();if(G){if(N==="y"){J({approved:!0,targetMode:"autoEdit"});return}if(N==="s"){J({approved:!0,targetMode:"default"});return}if(N==="n"){J({approved:!1,reason:"方案需要改进"});return}}else if(U){if(N==="y"){J({approved:!0});return}if(N==="n"){J({approved:!1,reason:"用户拒绝进入 Plan 模式"});return}}else if(q){if(N==="y"){J({approved:!0});return}if(N==="n"){J({approved:!1,reason:"用户选择停止"});return}}else if(O){if(N==="y"){J({approved:!0,scope:"once"});return}if(N==="n"){J({approved:!1,reason:"用户拒绝 MCP Sampling"});return}}else{if(N==="y"){J({approved:!0,scope:"once"});return}if(N==="s"){J({approved:!0,scope:"session"});return}if(N==="p"){J({approved:!0,scope:"project"});return}if(N==="n"){J({approved:!1,reason:"用户拒绝"});return}}},{isActive:Q});let z=NY(()=>{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(U)return[{key:"approve",label:"[Y] 进入规划模式",value:{approved:!0}},{key:"reject",label:"[N] 直接执行",value:{approved:!1,reason:"用户拒绝进入 Plan 模式"}}];if(q)return[{key:"continue",label:"[Y] 继续执行",value:{approved:!0}},{key:"stop",label:"[N] 停止",value:{approved:!1,reason:"用户选择停止"}}];if(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,U,q,O]),_=NY(()=>{if(G)return{color:"cyan",title:"方案审核"};if(U)return{color:"magenta",title:"进入规划模式"};if(q)return{color:"yellow",title:"已达最大轮次"};return{color:"yellow",title:$.title||"操作确认"}},[G,U,q,$.title]);return D0(v$,{flexDirection:"column",borderStyle:"round",borderColor:Q?_.color:"gray",padding:1,children:[D0(v$,{marginBottom:1,children:D0(s$,{bold:!0,color:_.color,children:_.title},void 0,!1,void 0,this)},void 0,!1,void 0,this),D0(oX,{details:$,headerColor:_.color,isPlanModeExit:G,isPlanModeEnter:U,terminalWidth:Y},void 0,!1,void 0,this),D0(v$,{flexDirection:"column",children:[D0(s$,{color:"gray",children:nX(G,U,q,O)},void 0,!1,void 0,this),D0(aX,{items:z,isFocused:Q,itemComponent:iX,onSelect:(W)=>{J(W.value)}},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});import{Box as T0,Text as H0}from"ink";import FY from"ink-text-input";import{useState as q1}from"react";import{jsxDEV as d}from"react/jsx-dev-runtime";var u8=[{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"}],d2=[{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"}],l2=[{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"}],sX=[`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"],WY=({workspaceRoot:$,sessionId:J,onClose:Z,onSave:Y})=>{let X=K$.getTheme(),[Q,K]=q1("action"),[G,U]=q1(0),[q,O]=q1(0),[z,_]=q1(0),[W,L]=q1(""),[N,A]=q1(""),[I,H]=q1(null),[S,B]=q1(!1),[w,M]=q1(null),P=u8[G],b=l2[q],v=d2[z],T=()=>{if(w){M(null);return}switch(Q){case"action":Z();break;case"event":K("action");break;case"matcher":K("event");break;case"command":K("matcher");break;case"location":K("command");break;case"confirm":K("location");break}};q0((i,F)=>{if(F.escape){T();return}if(Q==="action"){if(F.upArrow)U((R)=>R>0?R-1:u8.length-1);else if(F.downArrow)U((R)=>R<u8.length-1?R+1:0);else if(F.return)k()}else if(Q==="event"){if(F.upArrow)O((R)=>R>0?R-1:l2.length-1);else if(F.downArrow)O((R)=>R<l2.length-1?R+1:0);else if(F.return)K("matcher")}else if(Q==="location"){if(F.upArrow)_((R)=>R>0?R-1:d2.length-1);else if(F.downArrow)_((R)=>R<d2.length-1?R+1:0);else if(F.return)K("confirm")}else if(Q==="confirm"){if(F.return)m()}});let k=()=>{let i=u8[G].action;if(i==="add")K("event");else if(i==="status")y();else if(i==="list")t();else if(i==="enable")y$.getInstance().enableSession(J,$),M("Hooks enabled for this session");else if(i==="disable")y$.getInstance().disableSession(J,$),M("Hooks disabled for this session");else if(i==="trust")j();else if(i==="revoke")o()},y=async()=>{let i=y$.getInstance(),F=i.isEnabled($,J),R=i.getConfig($),D=await i.getTrustStatus($),V={};for(let x of Object.values(OJ)){let c=R[x];if(c&&Array.isArray(c)){let n=c.reduce((Q0,w0)=>Q0+(w0.hooks?.length||0),0);if(n>0)V[x]=n}}let C=[`Status: ${F?"Enabled":"Disabled"}`,`Trust: ${D.state}`,`Digest: ${D.currentDigest??"none"}`,""];if(Object.keys(V).length>0){C.push("Configured hooks:");for(let[x,c]of Object.entries(V))C.push(` ${x}: ${c} hook(s)`)}else C.push("No hooks configured");M(C.join(`
|
|
147
|
-
`))},j=async()=>{try{let i=await y$.getInstance().trustProject($);M(`Trust: ${i.state}
|
|
148
|
-
Digest: ${i.currentDigest??"none"}`)}catch(i){H(i instanceof Error?i.message:"Failed to trust hooks")}},o=async()=>{try{let i=await y$.getInstance().revokeProjectTrust($);M(`Trust: ${i.state}`)}catch(i){H(i instanceof Error?i.message:"Failed to revoke hook trust")}},t=()=>{let F=y$.getInstance().getConfig($),R=[],D=!1;for(let V of Object.values(OJ)){let C=F[V];if(!C||!Array.isArray(C)||C.length===0)continue;D=!0,R.push(`${V}:`);for(let x of C){let c=x.matcher,n="all";if(c?.tools)n=`tools: ${Array.isArray(c.tools)?c.tools.join(", "):c.tools}`;R.push(` [${n}]`);for(let Q0 of x.hooks||[])if(Q0.type==="command")R.push(` -> ${Q0.command}`)}R.push("")}if(!D)R.push("No hooks configured"),R.push(""),R.push("Configure hooks in .blade/settings.local.json");M(R.join(`
|
|
149
|
-
`))},a=()=>{K("command")},U0=()=>{if(!N.trim()){H("Command cannot be empty");return}H(null),K("location")},m=async()=>{B(!0),H(null);try{let i=y$.getInstance(),F=await import("node:fs/promises"),R=await import("node:path"),D=await import("node:os"),V={matcher:W.trim()?{tools:W.trim()}:{},hooks:[{type:"command",command:N.trim()}]},C;switch(v.location){case"local":C=R.join($,".blade","settings.local.json");break;case"project":C=R.join($,".blade","settings.json");break;case"user":C=R.join(D.homedir(),".blade","settings.json");break}await F.mkdir(R.dirname(C),{recursive:!0});let x={};try{let w0=await F.readFile(C,"utf-8");x=JSON.parse(w0)}catch{}let c=x.hooks||{},n=c[b.event]||[],Q0={...c,enabled:!0,[b.event]:[...n,V]};if(x.hooks=Q0,await F.writeFile(C,JSON.stringify(x,null,2),"utf-8"),await i.reloadConfig($),Y)Y({event:b.event,matcher:W.trim(),command:N.trim()});Z()}catch(i){H(`Failed to save hook: ${i instanceof Error?i.message:"Unknown error"}`),B(!1)}};return d(T0,{flexDirection:"column",padding:1,children:[d(T0,{marginBottom:1,children:d(H0,{bold:!0,color:X.colors.success,children:"Hooks Manager"},void 0,!1,void 0,this)},void 0,!1,void 0,this),d(T0,{marginBottom:1,children:d(H0,{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&&d(T0,{flexDirection:"column",marginBottom:1,children:[d(H0,{children:w},void 0,!1,void 0,this),d(T0,{marginTop:1,children:d(H0,{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&&d(T0,{flexDirection:"column",children:[d(T0,{flexDirection:"column",marginTop:1,children:u8.map((i,F)=>d(T0,{children:[d(H0,{color:F===G?X.colors.primary:void 0,bold:F===G,children:[F===G?"> ":" ",i.action]},void 0,!0,void 0,this),d(H0,{color:X.colors.muted,children:[" - ",i.description]},void 0,!0,void 0,this)]},i.action,!0,void 0,this))},void 0,!1,void 0,this),d(T0,{marginTop:1,children:d(H0,{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"&&d(T0,{flexDirection:"column",children:[d(H0,{bold:!0,children:"Select Event:"},void 0,!1,void 0,this),d(T0,{flexDirection:"column",marginTop:1,children:l2.map((i,F)=>d(T0,{children:[d(H0,{color:F===q?X.colors.primary:void 0,bold:F===q,children:[F===q?"> ":" ",i.event]},void 0,!0,void 0,this),d(H0,{color:X.colors.muted,children:[" - ",i.description]},void 0,!0,void 0,this)]},i.event,!0,void 0,this))},void 0,!1,void 0,this),d(T0,{marginTop:1,children:d(H0,{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"&&d(T0,{marginBottom:1,children:d(H0,{children:["Event:"," ",d(H0,{bold:!0,color:X.colors.primary,children:b.event},void 0,!1,void 0,this),d(H0,{color:X.colors.muted,children:[" - ",b.description]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),(Q==="matcher"||Q==="command"||Q==="confirm")&&d(T0,{flexDirection:"column",marginBottom:1,children:[d(H0,{color:X.colors.muted,children:"Input to command is JSON of tool call arguments."},void 0,!1,void 0,this),d(H0,{color:X.colors.muted,children:"Exit code 0 - stdout/stderr not shown"},void 0,!1,void 0,this),d(H0,{color:X.colors.muted,children:"Exit code 2 - show stderr to model and block tool call"},void 0,!1,void 0,this),d(H0,{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"&&d(T0,{flexDirection:"column",children:[d(T0,{children:[d(H0,{bold:!0,children:"Matcher: "},void 0,!1,void 0,this),d(FY,{value:W,onChange:L,onSubmit:a,placeholder:"e.g., Read, Bash, Edit|Write (empty = all tools)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),d(T0,{marginTop:1,children:d(H0,{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),d(T0,{marginTop:1,children:d(H0,{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")&&d(T0,{marginBottom:1,children:d(H0,{children:["Matcher: ",d(H0,{bold:!0,children:W||"(all tools)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),Q==="command"&&d(T0,{flexDirection:"column",children:[d(T0,{children:d(H0,{bold:!0,children:"Command: "},void 0,!1,void 0,this)},void 0,!1,void 0,this),d(T0,{borderStyle:"single",borderColor:X.colors.border.light,paddingX:1,marginTop:1,children:d(FY,{value:N,onChange:A,onSubmit:U0,placeholder:"Enter shell command..."},void 0,!1,void 0,this)},void 0,!1,void 0,this),d(T0,{flexDirection:"column",marginTop:1,children:[d(H0,{bold:!0,children:"Examples:"},void 0,!1,void 0,this),sX.map((i,F)=>d(H0,{color:X.colors.muted,children:["• ",i]},F,!0,void 0,this))]},void 0,!0,void 0,this),d(T0,{marginTop:1,children:d(H0,{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"&&d(T0,{flexDirection:"column",children:[d(T0,{flexDirection:"column",borderStyle:"round",borderColor:X.colors.border.light,paddingX:2,paddingY:1,marginBottom:1,children:[d(H0,{bold:!0,color:X.colors.primary,children:"Save hook configuration"},void 0,!1,void 0,this),d(H0,{children:" "},void 0,!1,void 0,this),d(H0,{children:[" ","Event: ",b.event," - ",b.description]},void 0,!0,void 0,this),d(H0,{children:[" Matcher: ",W||"(all)"]},void 0,!0,void 0,this),d(H0,{children:[" Command: ",N]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),d(H0,{bold:!0,children:"Where should this hook be saved?"},void 0,!1,void 0,this),d(T0,{flexDirection:"column",marginTop:1,children:d2.map((i,F)=>d(T0,{children:[d(H0,{color:F===z?X.colors.primary:void 0,bold:F===z,children:[F===z?"> ":" ",F+1,". ",i.name]},void 0,!0,void 0,this),d(H0,{color:X.colors.muted,children:[" ",i.description]},void 0,!0,void 0,this)]},i.location,!0,void 0,this))},void 0,!1,void 0,this),d(T0,{marginTop:1,children:d(H0,{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"&&d(T0,{flexDirection:"column",children:[d(T0,{flexDirection:"column",borderStyle:"round",borderColor:X.colors.success,paddingX:2,paddingY:1,children:[d(H0,{bold:!0,children:["Saving hook to ",v.description,"..."]},void 0,!0,void 0,this),d(H0,{children:" "},void 0,!1,void 0,this),d(H0,{children:["Event: ",b.event]},void 0,!0,void 0,this),d(H0,{children:["Matcher: ",W||"(all tools)"]},void 0,!0,void 0,this),d(H0,{children:["Command: ",N]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),d(T0,{marginTop:1,children:d(H0,{color:X.colors.muted,children:S?"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),I&&d(T0,{marginTop:1,children:d(H0,{color:X.colors.error,children:I},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as VY}from"ahooks";import{Box as H7,Text as F7}from"ink";import W7 from"react";import{useMemoizedFn as a2}from"ahooks";import l1 from"chalk";import{Text as z7}from"ink";import{useEffect as fY,useRef as i2}from"react";var r2={TIMEOUT_MS:100,RAPID_INPUT_THRESHOLD_MS:150,LARGE_INPUT_THRESHOLD:300,MEDIUM_SIZE_MULTI_CHUNK_THRESHOLD:200};var d1="\x1B",eX=`${d1}[200~`,$7=`${d1}[201~`,J7="[200~",Y7="[201~",Z7=[`${d1}[I`,`${d1}[O`,"[I","[O"],BY=`${d1}[?2004h`,AY=`${d1}[?2004l`,NJ=`${d1}[?1004l`,X7=[eX,J7],Q7=[$7,Y7];function bY(){return{pasteBuffer:null,pasteOverflowed:!1}}function LY($,J){let Z;for(let Y of J){let X=$.indexOf(Y);if(X===-1)continue;if(!Z||X<Z.index||X===Z.index&&Y.length>Z.marker.length)Z={index:X,marker:Y}}return Z}function wY($){return Z7.some((J)=>$===J)}function PY($,J){let Z=J,Y=$.pasteBuffer,X=$.pasteOverflowed,Q=Y!==null,K=[];while(Z.length>0){if(Y!==null){let q=LY(Z,Q7);if(!q){if(Y.length+Z.length>_J)Y="",X=!0;else if(!X)Y+=Z;Z="";break}if(Y.length+q.index>_J)X=!0;else if(!X)Y+=Z.slice(0,q.index),K.push({kind:"paste",text:Y});Y=null,X=!1,Q=!0,Z=Z.slice(q.index+q.marker.length);continue}let G=LY(Z,X7);if(!G){if(wY(Z))Q=!0;else K.push({kind:"text",text:Z});Z="";break}let U=Z.slice(0,G.index);if(U&&!wY(U))K.push({kind:"text",text:U});Y="",X=!1,Q=!0,Z=Z.slice(G.index+G.marker.length)}if(J.length===0&&Y!==null)Q=!0;return{handled:Q,state:{pasteBuffer:Y,pasteOverflowed:X},segments:K}}import{execSync as w8}from"node:child_process";import{existsSync as K7,readFileSync as HJ}from"node:fs";import{basename as MY,isAbsolute as G7}from"node:path";function yY($){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 RY(){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"},Z={darwin:{checkImage:"osascript -e 'the clipboard as «class PNGf»'",saveImage:(Y)=>`osascript -e 'set png_data to (the clipboard as «class PNGf»)' -e 'set fp to open for access POSIX file "${Y}" with write permission' -e 'write png_data to fp' -e 'close access fp'`,getPath:"osascript -e 'get POSIX path of (the clipboard as «class furl»)'",deleteFile:(Y)=>`rm -f "${Y}"`},linux:{checkImage:'xclip -selection clipboard -t TARGETS -o | grep -E "image/(png|jpeg|jpg|gif|webp)"',saveImage:(Y)=>`xclip -selection clipboard -t image/png -o > "${Y}" || wl-paste --type image/png > "${Y}"`,getPath:"xclip -selection clipboard -t text/plain -o",deleteFile:(Y)=>`rm -f "${Y}"`},win32:{checkImage:'powershell -Command "(Get-Clipboard -Format Image) -ne $null"',saveImage:(Y)=>`powershell -Command "$img = Get-Clipboard -Format Image; if ($img) { $img.Save('${Y.replace(/\\/g,"\\\\")}', [System.Drawing.Imaging.ImageFormat]::Png) }"`,getPath:'powershell -Command "Get-Clipboard"',deleteFile:(Y)=>`del /f "${Y}"`}};return{commands:Z[$]||Z.linux,screenshotPath:J[$]||J.linux}}function U7(){let{commands:$}=RY();try{return w8($.getPath,{encoding:"utf-8"}).trim()}catch(J){return console.error("Failed to get clipboard path:",J),null}}function TY($){if($.startsWith('"')&&$.endsWith('"')||$.startsWith("'")&&$.endsWith("'"))return $.slice(1,-1);return $}function CY($){if(process.platform==="win32")return $;let J="__DOUBLE_BACKSLASH__";return $.replace(/\\\\/g,J).replace(/\\(.)/g,"$1").replace(new RegExp(J,"g"),"\\")}function FJ($){let J=TY($.trim()),Z=CY(J);return/\.(png|jpe?g|gif|webp)$/i.test(Z)}function q7($){let J=TY($.trim()),Z=CY(J);if(FJ(Z))return Z;return null}async function IY($){let J=q7($);if(!J)return null;let Z;try{if(G7(J))Z=HJ(J);else{let K=U7();if(K&&J===MY(K))Z=HJ(K);else return null}}catch(K){return console.error("Failed to read image file:",K),null}let Y=Z.toString("base64"),X=yY(Y),Q=MY(J);return{path:J,base64:Y,mediaType:X,filename:Q}}async function SY(){let $=process.platform,J={darwin:"pbpaste",linux:"xclip -selection clipboard -o || wl-paste",win32:'powershell -Command "Get-Clipboard"'},Z=J[$]||J.linux;try{return w8(Z,{encoding:"utf-8"})||null}catch{return null}}async function kY(){let{commands:$,screenshotPath:J}=RY();try{if(w8($.checkImage,{stdio:"ignore"}),w8($.saveImage(J),{stdio:"ignore"}),!K7(J))return null;let Y=HJ(J).toString("base64"),X=yY(Y);return w8($.deleteFile(J),{stdio:"ignore"}),{base64:Y,mediaType:X}}catch(Z){try{w8($.deleteFile(J),{stdio:"ignore"})}catch{}return null}}import{jsxDEV as N7}from"react/jsx-dev-runtime";var O7=/\r\n/g,_7=/\r/g;function WJ($){if(!$.includes("\r"))return $;return $.replace(O7,`
|
|
150
|
-
`).replace(_7,`
|
|
151
|
-
`)}function vY($,J,Z){let Y=Math.max(0,Math.min(Z,J.length)),X=J.slice(0,Y),Q=J.slice(Y);return{newValue:X+$+Q,newCursorPosition:Y+$.length}}function DY({value:$,placeholder:J="",focus:Z=!0,onChange:Y,cursorPosition:X,onChangeCursorPosition:Q,onPaste:K,onImagePaste:G,disabledKeys:U=[]}){let q=i2(bY()),O=i2($),z=i2(X),_=i2(null);fY(()=>{O.current=$,z.current=X},[$,X]),fY(()=>{if(X>$.length)Q($.length)},[$,X,Q]);let W=a2((B,w)=>{let M=O.current,P=z.current;if(O.current=B,z.current=w,B!==M)Y(B);if(w!==P)Q(w)}),L=a2((B)=>{if(!B)return;let{newValue:w,newCursorPosition:M}=vY(WJ(B),O.current,z.current);W(w,M)}),N=a2(async(B)=>{let w=WJ(B);if(!w)return;if(G&&FJ(w))try{let P=await IY(w);if(P){let b=await G(P.base64,P.mediaType,P.filename);if(b?.prompt)L(b.prompt);return}}catch(P){console.error("Failed to process image path:",P)}if((w.length>r2.LARGE_INPUT_THRESHOLD||w.includes(`
|
|
152
|
-
`))&&K){let P=await K(w);if(P?.prompt){L(P.prompt);return}}L(w)}),A=a2((B)=>{let w=_.current;if(!w){try{let P=B();if(!P)return;let b=P.catch(()=>{return});_.current=b,b.finally(()=>{if(_.current===b)_.current=null})}catch{}return}let M=w.then(B).then(()=>{return}).catch(()=>{return});_.current=M,M.finally(()=>{if(_.current===M)_.current=null})});q0((B,w)=>{return A(()=>{let M=WJ(B),P=PY(q.current,M);if(q.current=P.state,P.handled)return(async()=>{for(let j of P.segments)if(j.kind==="paste")await N(j.text);else L(j.text)})();if(U.some((j)=>w[j])||w.ctrl&&B==="c"||w.ctrl&&B==="l"||w.ctrl&&B==="t"||w.ctrl&&B==="o"||w.meta&&B==="l"||w.meta&&B==="t"||w.meta&&B==="o"||w.shift&&w.tab||M==="?"&&O.current==="")return;let v=O.current,T=z.current,k=T,y=v;if(w.leftArrow)k--;else if(w.rightArrow)k++;else if(w.backspace||w.delete){if(B===""){if(T>0)y=v.slice(0,T-1)+v.slice(T,v.length),k--}else if(T<v.length)y=v.slice(0,T)+v.slice(T+1,v.length)}else if(w.ctrl&&M==="a")k=0;else if(w.ctrl&&M==="e")k=v.length;else if(w.ctrl&&M==="k")y=v.slice(0,T);else if(w.ctrl&&M==="u")y=v.slice(T),k=0;else if(w.ctrl&&M==="w"){let o=v.slice(0,T).match(/\s*\S+\s*$/);if(o){let t=o[0].length;y=v.slice(0,T-t)+v.slice(T),k-=t}}else if(w.ctrl&&M==="v"){let j=process.platform==="darwin";return(async()=>{if(G){let t=await kY();if(t){let a=await G(t.base64,t.mediaType,"clipboard.png");if(a?.prompt)L(a.prompt);return}}if(j)return;let o=await SY();if(o)await N(o)})()}else if(w.pageUp)k=0;else if(w.pageDown)k=v.length;else if(M===`
|
|
153
|
-
`&&(w.shift||w.meta)){let{newValue:j,newCursorPosition:o}=vY(M,v,T);W(j,o);return}else if(!w.ctrl&&!w.meta){if(K&&(M.length>r2.LARGE_INPUT_THRESHOLD||M.includes(`
|
|
154
|
-
`)))return N(M);y=v.slice(0,T)+M+v.slice(T,v.length),k+=M.length}if(k<0)k=0;if(k>y.length)k=y.length;W(y,k)}),!0},{isActive:Z,priority:0});let I=Z,H=$,S=J?l1.grey(J):void 0;if(I)if(S=J.length>0?l1.inverse(J[0])+l1.grey(J.slice(1)):l1.inverse(" "),$.length===0)H=l1.inverse(" ");else{H="";for(let B=0;B<$.length;B++)if(B===X&&X<$.length)H+=l1.inverse($[B]);else H+=$[B];if(X>=$.length)H+=l1.inverse(" ")}return N7(z7,{children:J?$.length>0?H:S:H},void 0,!1,void 0,this)}import{jsxDEV as LJ}from"react/jsx-dev-runtime";var jY=W7.memo(({input:$,cursorPosition:J,onChange:Z,onChangeCursorPosition:Y,onAddPasteMapping:X,onAddImagePasteMapping:Q})=>{let G=r0()==="main-input",U=$.trimStart().startsWith("!"),q=VY((z)=>{let _=z.split(`
|
|
155
|
-
`).length,W=z.length,L=500,N=10;if(W>500||_>10){let A=X(z),I=z.slice(0,30).replace(/\n/g," "),H=`${W} chars, ${_} lines: ${I}...`;return{prompt:`${I2(A)}${H}${I4()}`}}return{}}),O=VY(async(z,_,W)=>{try{let L=Q(z,_);return{prompt:`${I2(L)}[Image #${L}]${I4()}`}}catch(L){return console.error("[Image Paste] Failed to process image:",L),{prompt:`[Image paste failed: ${L instanceof Error?L.message:"Unknown error"}] `}}});return LJ(H7,{flexDirection:"row",width:"100%",paddingX:2,paddingY:0,flexShrink:0,flexGrow:0,overflow:"hidden",borderStyle:"round",borderColor:U?"yellow":"gray",children:[LJ(F7,{color:U?"yellow":"blue",bold:!0,children:U?"$ ":"> "},void 0,!1,void 0,this),LJ(DY,{value:$,cursorPosition:J,onChange:Z,onChangeCursorPosition:Y,onPaste:q,onImagePaste:O,placeholder:" 输入命令...",focus:G,disabledKeys:["upArrow","downArrow","tab","return","escape"]},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as o2,Text as u$}from"ink";import y7,{useEffect as R7,useState as T7}from"react";import{useEffect as b7,useRef as P7,useState as M7}from"react";import{useEffect as L7,useRef as w7,useState as B7}from"react";var A7=15000,EY="等待用户确认...",hY=["思考中","构思中","推理中","琢磨中","分析中","斟酌中","酝酿中","推敲中","揣摩中","审视中","处理中","编排中","打磨中","编织中","拼装中","调配中","组装中","搭建中","铸造中","雕琢中","搜寻中","梳理中","排查中","勘探中","钻研中","翻阅中","遍历中","扫描中","检索中","追踪中","计算中","编译中","解析中","运算中","推演中","迭代中","收敛中","演绎中","归纳中","求解中","生成中","编写中","起草中","绘制中","勾勒中","渲染中","合成中","调和中","编曲中","烹制中","施工中","酿造中","发酵中","煎熬中","折腾中","捣鼓中","鼓捣中","腾挪中","筹备中","蓄力中"],gY=["Esc - 中止任务 / 隐藏建议 / 双击清空输入","Shift+Tab - 切换模式 (DEFAULT → AUTO_EDIT → PLAN)","Tab - 选中建议 / 切换 thinking 模式","Up/Down - 浏览建议或输入历史","? - 显示快捷键帮助(输入框为空时)","Ctrl+C - 停止任务(双击退出)","Ctrl+L - 清屏","Ctrl+T - 展开/折叠 thinking 内容","Ctrl+O - 打开只读 transcript","Ctrl+A / Ctrl+E - 光标跳到行首/行尾","Ctrl+U / Ctrl+K - 删到行首/行尾","Ctrl+W - 删除前一个单词","Shift+Enter - 插入换行","/help - 显示所有可用命令","/init - 分析项目并生成 BLADE.md","/resume - 恢复历史会话","/compact - 压缩上下文,节省 token","/theme - 切换主题","/model - 管理和切换模型","/permissions - 管理权限规则","/mcp - 查看 MCP 服务器状态","/agents - 管理 subagent 配置","/clear - 清除对话历史","/status - 查看当前配置","/context - 可视化 token 使用情况","/git - Git 查询和 AI 辅助","/git review - AI Code Review","/git commit - AI 生成 commit message","/hooks - 管理 Hook 配置","/tasks - 查看后台任务","/skills - 查看可用 Skills","/plugins - 管理插件","/memory - 管理项目记忆","/ide - 管理 IDE 集成","@ 文件路径 - 附加文件到上下文","@dir/ - 附加整个目录","@file.ts:10-20 - 附加指定行范围","Plan 模式 - 先规划后编码(Shift+Tab 切换)","Auto Edit 模式 - 自动批准工具调用","MCP 协议 - 扩展外部工具集成","Subagents - 并行执行子任务","Hooks - 自定义工具执行流程","Skills - 可复用的技能模板","Plugins - 扩展功能插件","提示:/init 让 AI 理解你的项目结构","提示:Plan 模式适合复杂多步骤任务","提示:Auto Edit 可加速重复性操作","提示:@ 引用可提供更精准的上下文","提示:定期 /compact 节省 token","提示:Esc 可随时中断任务","提示:/resume 继续未完成的对话","提示:/model once 临时切换模型"];function mY(){if(Math.random()<0.25){let Z=Math.floor(Math.random()*gY.length);return gY[Z]}let J=Math.floor(Math.random()*hY.length);return hY[J]}function pY($,J,Z=!1){let[Y,X]=B7(""),Q=w7(Z);return Q.current=Z,L7(()=>{if(J){X(EY);return}if(!$){X("");return}X((G)=>G===""||G===EY?mY():G);let K=setInterval(()=>{if(!Q.current)X(mY())},A7);return()=>{clearInterval(K)}},[$,J]),Y}function xY($,J=!1,Z=!1){let[Y,X]=M7(0),Q=P7(null),K=pY($,J,Z);return b7(()=>{if(!$){X(0),Q.current=null;return}if(Z)return;if(Q.current===null)Q.current=Date.now();let G=setInterval(()=>{if(Q.current!==null){let U=Math.floor((Date.now()-Q.current)/1000);X(U)}},1000);return()=>{clearInterval(G)}},[$,Z]),{currentPhrase:K,elapsedTime:Y}}import{jsxDEV as N$,Fragment as I7}from"react/jsx-dev-runtime";var wJ=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"],C7=80;function B8($){if($<60)return`${$}s`;let J=Math.floor($/60),Z=$%60;return`${J}m ${Z}s`}var uY=y7.memo(({message:$,paused:J=!1})=>{let Z=X8(),Y=Z2(),X=nJ(),Q=oJ(),K=tJ(),G=sJ(),U=eJ(),q=Z||!Y,[O,z]=T7(0),_=P0(),L=q8()>=C7,{currentPhrase:N,elapsedTime:A}=xY(q,!1,J);if(R7(()=>{if(!q||J){z(0);return}let P=setInterval(()=>{z((b)=>(b+1)%wJ.length)},150);return()=>clearInterval(P)},[q,J]),!q)return null;let I=K?.mode==="bounded_foreground"?`Provider 暂时不可用,正在有界恢复 (${K.attempt}/${K.maxRetries}),剩余约 ${B8(Math.max(0,Math.ceil((K.recoveryRemainingMs??0)/1000)))}`:K?.phase==="scheduled"?`Provider 暂时不可用,${K.attempt}/${K.maxRetries} 次重试将在 ${Math.max(0,Math.ceil((K.delayMs??0)/1000))}s 后开始`:K?.phase==="attempt"?`正在重试 Provider (${K.attempt}/${K.maxRetries})`:null,H=Q?Q.phase==="probe"?"Provider 正在执行唯一恢复探测":`Provider 故障已隔离,等待恢复探测${Q.retryAfterMs!==void 0?` (${B8(Math.max(0,Math.ceil(Q.retryAfterMs/1000)))})`:""}${Q.recoveryRemainingMs!==void 0?`,剩余预算 ${B8(Math.max(0,Math.ceil(Q.recoveryRemainingMs/1000)))}`:""}`:null,S=X?`等待 Provider 容量(${X.scope},队列 ${X.queuePosition}/${Math.max(X.queueDepth,X.queuePosition)},已等待 ${B8(Math.max(0,Math.ceil(X.waitMs/1000)))})`:null,B=G?G.outputStarted?`Provider 流已暂停 ${Math.ceil(G.durationMs/1000)}s,仍在等待(空闲超时上限 ${Math.ceil(G.timeoutMs/1000)}s)`:`Provider 尚未返回流数据,已等待 ${Math.ceil(G.durationMs/1000)}s(空闲超时上限 ${Math.ceil(G.timeoutMs/1000)}s)`:null,M=(U?.phase==="detected"?`检测到 ${U.toolName} 连续 ${U.runLength} 次无进展,正在要求 Agent 切换策略`:U?.phase==="halted"?`已停止 ${U.toolName} 空转循环`:null)||H||S||I||B||$||N||"正在思考中...";if(L)return N$(o2,{paddingX:2,paddingBottom:1,flexDirection:"row",gap:1,children:[N$(u$,{color:_.colors.warning,bold:!0,children:wJ[O]},void 0,!1,void 0,this),N$(u$,{color:_.colors.text.primary,children:M},void 0,!1,void 0,this),A>0&&N$(I7,{children:[N$(u$,{color:_.colors.muted,children:"|"},void 0,!1,void 0,this),N$(u$,{color:_.colors.info,children:["已用时: ",B8(A)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),N$(u$,{color:_.colors.muted,children:"|"},void 0,!1,void 0,this),N$(u$,{color:_.colors.secondary,children:"Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return N$(o2,{paddingX:2,paddingBottom:1,flexDirection:"column",children:[N$(o2,{flexDirection:"row",gap:1,children:[N$(u$,{color:_.colors.warning,bold:!0,children:wJ[O]},void 0,!1,void 0,this),N$(u$,{color:_.colors.text.primary,children:M},void 0,!1,void 0,this)]},void 0,!0,void 0,this),A>0&&N$(o2,{marginLeft:2,flexDirection:"row",gap:1,children:[N$(u$,{color:_.colors.info,children:["已用时: ",B8(A)]},void 0,!0,void 0,this),N$(u$,{color:_.colors.muted,children:"|"},void 0,!1,void 0,this),N$(u$,{color:_.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 s2,Text as m0,useStdout as S7}from"ink";import k7 from"ink-text-input";import f7,{useCallback as n2,useEffect as v7,useMemo as D7,useState as r1}from"react";import{jsxDEV as M0}from"react/jsx-dev-runtime";var rY=f7.memo(({details:$,onComplete:J})=>{let{stdout:Z}=S7(),Y=Z.columns||80,X=r0()==="confirmation-prompt",Q=h0(!1),K=$.fields??[],[G,U]=r1("field"),[q,O]=r1(0),[z,_]=r1(()=>cY($)),[W,L]=r1(""),[N,A]=r1(0),[I,H]=r1([]),[S,B]=r1(),w=K[q],M=D7(()=>V7(w),[w]);v7(()=>{if(!w)return;let k=z[w.name];L(typeof k==="string"||typeof k==="number"?String(k):""),H(Array.isArray(k)?[...k]:[]);let y=M.findIndex((j)=>j.value===String(k));A(y>=0?y:0),B(void 0)},[z,w,M]);let P=n2((k)=>{if(_(k),q<K.length-1){O((y)=>y+1);return}U("review")},[q,K.length]),b=n2((k)=>{if(!w)return;let y={...z};if(k===void 0)delete y[w.name];else y[w.name]=k;P(y)},[z,w,P]),v=n2((k)=>{if(!w)return;try{b(dY(w,k))}catch(y){B(y instanceof Error?y.message:String(y))}},[w,b]),T=n2(()=>{try{let k=lY($,{action:"accept",content:z});J({action:k.action,...k.content?{content:k.content}:{}})}catch(k){B(k instanceof Error?k.message:String(k))}},[z,$,J]);if(q0((k,y)=>{if(y.ctrl&&k==="c"||y.meta&&k==="c"){Q();return}if(y.escape){J({action:"cancel"});return}if($.mode==="url"){if(k.toLowerCase()==="y")J({action:"accept"},!0);else if(k.toLowerCase()==="n")J({action:"decline"});return}if(G==="review"){if(k.toLowerCase()==="y"||y.return)T();else if(k.toLowerCase()==="e")O(0),U("field");else if(k.toLowerCase()==="d")J({action:"decline"});return}if(!w){if(y.return)T();return}if(BJ(w))return;if(k.toLowerCase()==="d"){J({action:"decline"});return}if(y.upArrow){A((j)=>j>0?j-1:Math.max(M.length-1,0));return}if(y.downArrow||y.tab){A((j)=>j<M.length-1?j+1:0);return}if(k===" "&&w.type==="multi-select"){let j=M[N];if(j)H((o)=>o.includes(j.value)?o.filter((t)=>t!==j.value):[...o,j.value]);return}if(y.return)if(w.type==="multi-select")b(I);else{let j=M[N];if(j)b(j.typedValue)}},{isActive:X}),$.mode==="url")return M0(t2,{width:Y,color:"yellow",children:[M0(m0,{bold:!0,color:"yellow",children:"MCP external authorization"},void 0,!1,void 0,this),M0(m0,{children:$.message},void 0,!1,void 0,this),M0(m0,{color:"yellow",children:['Only continue if you trust MCP server "',$.serverName,'".']},void 0,!0,void 0,this),M0(m0,{children:["Domain: ",M0(m0,{color:"cyan",children:$.domain},void 0,!1,void 0,this)]},void 0,!0,void 0,this),M0(m0,{wrap:"wrap",children:["URL: ",M0(m0,{color:"cyan",children:$.url},void 0,!1,void 0,this)]},void 0,!0,void 0,this),M0(m0,{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 M0(t2,{width:Y,color:"green",children:[M0(m0,{bold:!0,color:"green",children:"Review MCP form response"},void 0,!1,void 0,this),M0(m0,{children:$.message},void 0,!1,void 0,this),K.map((k)=>M0(m0,{children:[k.title,": ",E7(z[k.name])]},k.name,!0,void 0,this)),S&&M0(m0,{color:"red",children:S},void 0,!1,void 0,this),M0(m0,{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 M0(t2,{width:Y,color:"cyan",children:[M0(m0,{children:$.message},void 0,!1,void 0,this),M0(m0,{color:"gray",children:"This form has no fields."},void 0,!1,void 0,this),M0(m0,{color:"gray",children:"Press Enter to submit · [D] Decline · Esc Cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return M0(t2,{width:Y,color:"cyan",children:[M0(m0,{bold:!0,color:"cyan",children:["MCP input requested by ",$.serverName]},void 0,!0,void 0,this),M0(m0,{children:$.message},void 0,!1,void 0,this),M0(s2,{flexDirection:"column",marginTop:1,children:[M0(m0,{bold:!0,children:[w.title,w.required?" *":""]},void 0,!0,void 0,this),w.description&&M0(m0,{color:"gray",children:w.description},void 0,!1,void 0,this),M0(m0,{color:"gray",children:j7(w)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),BJ(w)?M0(s2,{children:[M0(m0,{color:"cyan",children:"> "},void 0,!1,void 0,this),M0(k7,{value:W,onChange:L,onSubmit:v,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):M0(s2,{flexDirection:"column",children:M.map((k,y)=>{let j=w.type==="multi-select"&&I.includes(k.value);return M0(m0,{color:N===y?"yellow":void 0,children:[N===y?"> ":" ",w.type==="multi-select"?j?"(*) ":"( ) ":"",k.label]},k.value,!0,void 0,this)})},void 0,!1,void 0,this),S&&M0(m0,{color:"red",children:S},void 0,!1,void 0,this),M0(m0,{color:"gray",children:[BJ(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),M0(m0,{color:"gray",children:["Field ",q+1," of ",K.length]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});function t2({children:$,width:J,color:Z}){return M0(s2,{flexDirection:"column",gap:1,borderStyle:"round",borderColor:Z,padding:1,width:Math.min(J-4,88),children:$},void 0,!1,void 0,this)}function BJ($){return $.type==="string"||$.type==="number"||$.type==="integer"}function V7($){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 j7($){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 E7($){if($===void 0)return"(omitted)";if(Array.isArray($))return $.join(", ")||"(none)";return String($)}import $4 from"ansi-escapes";import{Box as C1,Static as r7,useStdout as a7}from"ink";import i7,{useEffect as O1,useMemo as RJ,useRef as I1,useState as TJ}from"react";import{Box as h7,Text as aY}from"ink";import g7 from"react";import{jsxDEV as AJ}from"react/jsx-dev-runtime";var bJ=g7.memo(({collapsedCount:$})=>{let J=P0();if($<=0)return null;let Z=J.colors.text.muted;return AJ(h7,{flexDirection:"row",marginBottom:1,children:[AJ(aY,{color:Z,children:[">"," ",$," 条历史消息"]},void 0,!0,void 0,this),AJ(aY,{color:Z,children:" [Ctrl+O 浏览]"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});bJ.displayName="CollapsedHistorySummary";import{Box as c8,Text as d8}from"ink";import m7 from"ink-big-text";import p7 from"ink-gradient";import x7 from"react";import{jsxDEV as D$}from"react/jsx-dev-runtime";var oY=x7.memo(()=>{return D$(c8,{flexDirection:"column",paddingX:2,paddingTop:1,paddingBottom:1,children:[D$(c8,{flexDirection:"column",children:D$(p7,{name:"pastel",children:D$(m7,{text:"BLADE",font:"block"},void 0,!1,void 0,this)},void 0,!1,void 0,this)},void 0,!1,void 0,this),D$(c8,{marginBottom:1,children:D$(d8,{color:"white",dimColor:!0,children:iY()},void 0,!1,void 0,this)},void 0,!1,void 0,this),D$(c8,{flexDirection:"column",marginBottom:1,children:[D$(c8,{marginBottom:1,children:D$(d8,{color:"white",bold:!0,children:"使用指南:"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D$(d8,{color:"white",children:"1. 输入问题、编辑文件或运行命令"},void 0,!1,void 0,this),D$(d8,{color:"white",children:"2. 使用 /init 创建项目配置文件"},void 0,!1,void 0,this),D$(d8,{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 e2,Text as PJ}from"ink";import nY from"react";import{jsxDEV as T1}from"react/jsx-dev-runtime";var tY=nY.memo(({tasks:$,visible:J=!0,compact:Z=!1})=>{let{colors:Y}=P0();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 T1(e2,{flexDirection:"column",borderStyle:"single",borderColor:Y.border.light,paddingX:1,paddingY:Z?0:1,marginBottom:1,children:[T1(e2,{marginBottom:Z?0:1,children:[T1(PJ,{dimColor:!0,children:"Tasks "},void 0,!1,void 0,this),T1(PJ,{color:Y.text.muted,children:[X.completed,"/",X.total]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),T1(e2,{flexDirection:"column",children:$.map((Q,K)=>T1(u7,{task:Q,compact:Z},Q.id||K,!1,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}),u7=nY.memo(({task:$,compact:J})=>{let Z,Y=!1,X;switch($.status){case"completed":Z="[OK]",Y=!0,X=$.subject;break;case"in_progress":Z=">",Y=!1,X=$.activeForm||$.subject;break;case"pending":default:Z="-",Y=!0,X=$.subject;break}return T1(e2,{paddingY:J?0:0,children:T1(PJ,{dimColor:Y,children:[Z," ",X]},void 0,!0,void 0,this)},void 0,!1,void 0,this)});import{Box as MJ,Text as A8}from"ink";import c7,{useMemo as sY}from"react";import{jsxDEV as z1}from"react/jsx-dev-runtime";function d7($,J=60){if(!$)return"";let Z=$.split(`
|
|
156
|
-
`)[0]||"";if(Z.length<=J)return Z;return`${Z.slice(0,J)}...`}function l7($){if(!$)return 0;return $.split(`
|
|
157
|
-
`).length}var yJ=c7.memo(({content:$,isStreaming:J=!1,isExpanded:Z})=>{let Y=P0(),X=sY(()=>l7($),[$]),Q=sY(()=>d7($),[$]),K=Y.colors.info,G=Y.colors.muted;return z1(MJ,{flexDirection:"column",marginBottom:1,children:[z1(MJ,{flexDirection:"row",children:[z1(A8,{color:K,children:Z?"v":">"},void 0,!1,void 0,this),z1(A8,{children:" "},void 0,!1,void 0,this),z1(A8,{color:G,children:["Thinking",J?"...":` (${X} lines)`]},void 0,!0,void 0,this),!Z&&!J&&Q&&z1(A8,{color:G,children:[" - ",Q]},void 0,!0,void 0,this),z1(A8,{color:G,dimColor:!0,children:[" ","[Ctrl+T]"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Z&&$&&z1(MJ,{marginLeft:2,marginTop:1,borderStyle:"round",borderColor:"gray",paddingX:1,paddingY:0,children:z1(A8,{color:G,children:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});yJ.displayName="ThinkingBlock";import{jsxDEV as U$}from"react/jsx-dev-runtime";var o7=({active:$=!0})=>{let J=$2(),Z=_2(),Y=N2(),X=W9(),Q=X8(),K=Z9(),G=U9(),U=Q8(),q=O2(),O=F9(),z=lJ(),_=w9(),W=L9(),{width:L,height:N}=v2(),{stdout:A}=a7(),I=P1(),[H,S]=TJ(null),[B,w]=TJ([]),[M,P]=TJ(new Set),b=I1(W),v=I1(null),T=I1(0),k=I1(0),y=I1(new Set),j=I1(new Set),o=I1([]),t=I1(null);O1(()=>{if(b.current!==W){if(b.current=W,!$)return;if(g$())k$();if(A)A.write($4.clearTerminal);I.incrementClearCount()}},[$,W,A,I]);let a=J,U0=X;O1(()=>{if(!X||Q){t.current=null;return}if(t.current===X)return;if(t.current=X,g$())k$();if($&&A)A.write($4.eraseScreen+$4.cursorTo(0,0));y.current=new Set,j.current=new Set(a.filter((C)=>C.role==="tool").map((C)=>C.id)),v.current=null,T.current=0,k.current=0,o.current=[],w([]),P(new Set),I.incrementClearCount(),I.clearFinalizingStreamingMessageId()},[X,Q,A,I,a,$]);let m=Z??X;O1(()=>{if($&&g$())k$();v.current=null,T.current=0,k.current=0,y.current=new Set,j.current=new Set(a.filter((C)=>C.role==="tool").map((C)=>C.id)),o.current=[],w([]),P(new Set)},[z]),O1(()=>{if(!m)return;if(v.current===m)return;v.current=m,T.current=0,k.current=0,j.current=new Set(a.filter((C)=>C.role==="tool").map((C)=>C.id)),o.current=[],w([])},[m,a]),O1(()=>{if(!m)return;let C=CJ(m);if(!C||C.length<=T.current)return;let x=C.slice(T.current);T.current=C.length;let c=x,n=o.current;if(n.length>0)if(c.some((s0)=>s0.type!=="empty"))c=[...n,...c],o.current=[];else{o.current=[...n,...c];return}let Q0=c.length;while(Q0>0&&c[Q0-1].type==="empty")Q0-=1;if(Q0!==c.length)o.current=c.slice(Q0),c=c.slice(0,Q0);if(c.length===0)return;let w0=k.current;k.current+=1;let p0=w0>0;if(g$())k$();P((s0)=>{if(!m||s0.has(m))return s0;let j0=new Set(s0);return j0.add(m),j0}),w((s0)=>[...s0,U$(C1,{flexDirection:"column",children:U$(t$,{content:"",role:"assistant",terminalWidth:L,isPending:!1,hidePrefix:p0,noMargin:!0,blocksOverride:c,renderCodeBlocksAsPlainText:!1},void 0,!1,void 0,this)},`streaming-${m}-${w0}`,!1,void 0,this)])},[m,Y.version,L,z,$]),O1(()=>{if(!m)return;let C=j.current,x=a.filter((c)=>c.role==="tool"&&!C.has(c.id)&&!y.current.has(c.id));if(x.length===0)return;if($&&g$())k$();for(let c of x)y.current.add(c.id);w((c)=>[...c,...x.map((n)=>U$(C1,{flexDirection:"column",children:U$(t$,{content:n.content,role:n.role,terminalWidth:L,metadata:n.metadata,isPending:!1,messageId:n.id},void 0,!1,void 0,this)},`streaming-tool-${n.id}`,!1,void 0,this))])},[$,m,a,L]),O1(()=>{if(!$){if(g$())k$();return}if(!m){if(g$())k$();return}if(!g$())P6(L,N);else M6(L,N);let C=eY(m);if(!C||C.lines.length===0)return;let c=Math.max(1,N-8),n=Math.max(0,C.lines.length-c),Q0=C.lines.slice(-c),w0=(CJ(m)?.length??0)>0;y6(Q0,n,C.mode,w0)},[m,Y.version,N,L,$]),O1(()=>{if(!m&&g$())k$()},[m]),O1(()=>{if(H===null&&a.length>_){if(S(a.length),$&&g$())k$();if($&&A)A.write($4.clearTerminal);I.incrementClearCount()}},[a.length,_,H,A,I,$]);let i=RJ(()=>{return K.some((C)=>C.status==="pending"||C.status==="in_progress")},[K]),F=W?0:H??0,R=F,D=RJ(()=>{let C=[];if(C.push(U$(oY,{},"header",!1,void 0,this)),R>0)C.push(U$(bJ,{collapsedCount:R},"collapsed-summary",!1,void 0,this));for(let x=F;x<a.length;x++){let c=a[x];if(U0&&c.id===U0)continue;if(c.role==="tool"&&y.current.has(c.id))continue;if(c.role==="assistant"&&M.has(c.id))continue;C.push(U$(C1,{flexDirection:"column",children:U$(t$,{content:c.content,role:c.role,terminalWidth:L,metadata:c.metadata,isPending:!1,messageId:c.id},void 0,!1,void 0,this)},c.id,!1,void 0,this))}return C},[a,F,R,L,U0,M]),V=RJ(()=>B.length>0?[...D,...B]:D,[D,B]);return U$(C1,{flexDirection:"column",paddingX:2,children:U$(C1,{flexDirection:"column",children:[U$(r7,{items:V,children:(C)=>C},z,!1,void 0,this),q&&U$(C1,{marginBottom:1,children:U$(yJ,{content:q,isStreaming:Q,isExpanded:O},void 0,!1,void 0,this)},void 0,!1,void 0,this),G&&i&&U$(C1,{marginTop:1,children:U$(tY,{tasks:K,visible:!0,compact:!1},void 0,!1,void 0,this)},void 0,!1,void 0,this),U.map((C,x)=>U$(C1,{flexDirection:"column",children:U$(t$,{content:C.displayText,role:"user",terminalWidth:L},void 0,!1,void 0,this)},`pending-${x}`,!1,void 0,this))]},void 0,!0,void 0,this)},void 0,!1,void 0,this)},$3=i7.memo(o7);import{useMemoizedFn as J4,useMount as n7}from"ahooks";import{Box as V$,Text as y0,useFocus as t7,useFocusManager as s7}from"ink";import e7 from"ink-select-input";import{memo as $Q,useMemo as JQ,useState as Y4}from"react";import{jsxDEV as z0,Fragment as XQ}from"react/jsx-dev-runtime";var YQ=({isSelected:$})=>z0(V$,{marginRight:1,children:z0(y0,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),ZQ=({isSelected:$,label:J})=>z0(y0,{bold:$,color:$?"yellow":void 0,children:J},void 0,!1,void 0,this),J3=$Q(({onClose:$,onEdit:J})=>{let Z=q9(),Y=Q2()??"",{isFocused:X}=t7({id:"model-selector"}),Q=s7(),[K,G]=Y4(""),[U,q]=Y4(!1),[O,z]=Y4(null),_=h0(!1),[W]=Y4(()=>{let P=process.stdout?.columns||80;return Math.max(20,P-8)});n7(()=>{if(Q?.focus("model-selector"),Z.length>0)G(Z[0].id)}),q0((P,b)=>{if(U)return;if(b.ctrl&&P==="c"||b.meta&&P==="c"){_();return}if(b.escape){$();return}if(!X)return;if(P==="d"||P==="D"){N();return}if((P==="e"||P==="E")&&J)A()},{isActive:!0});let L=J4(async(P)=>{if(U)return;let b=P.value;if(b===Y){$();return}q(!0),z(null);try{await a0().setCurrentModel(b),$()}catch(v){z(v.message),q(!1)}}),N=J4(async()=>{if(U||K===Y)return;q(!0),z(null);try{if(await a0().removeModel(K),Z.length<=1)$()}catch(P){z(P.message)}finally{q(!1)}}),A=J4(()=>{if(U||!J)return;let P=Z.find((b)=>b.id===K);if(!P)return;J(P)}),I=J4((P)=>{G(P.value)}),H=JQ(()=>{return Z.find((P)=>P.id===K)},[Z,K]),S=H?Z4()?.modelProviders[H.provider]:void 0,B=Z.map((P)=>{let b=P.id===Y?" (当前)":"";return{label:IJ(P)+b,value:P.id}}),w=K===Y;return z0(V$,{flexDirection:"column",borderStyle:"round",borderColor:"gray",padding:1,width:"100%",children:[z0(V$,{flexDirection:"row",justifyContent:"space-between",marginBottom:1,children:[z0(y0,{bold:!0,color:"cyan",children:"模型管理"},void 0,!1,void 0,this),z0(y0,{dimColor:!0,children:[U?"处理中...":w?"Enter=关闭 • E=编辑 • Esc=取消":"Enter=切换 • D=删除 • E=编辑 • Esc=取消"," • Ctrl+C=退出"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),z0(V$,{flexDirection:"row",children:[z0(V$,{flexDirection:"column",flexGrow:2,marginRight:2,borderStyle:"single",borderColor:"gray",padding:1,children:[z0(y0,{dimColor:!0,children:["已配置模型 (",Z.length,")"]},void 0,!0,void 0,this),z0(V$,{marginTop:1,children:z0(e7,{items:B,onSelect:L,onHighlight:I,indicatorComponent:YQ,itemComponent:ZQ},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z0(V$,{flexDirection:"column",flexGrow:3,borderStyle:"single",borderColor:"gray",padding:1,children:[z0(y0,{dimColor:!0,children:"模型详情"},void 0,!1,void 0,this),z0(V$,{marginY:1,children:z0(y0,{color:w?"green":"yellow",children:w?"* 当前使用":"* 可切换"},void 0,!1,void 0,this)},void 0,!1,void 0,this),H?z0(V$,{flexDirection:"column",children:[z0(y0,{children:[z0(y0,{dimColor:!0,children:"名称: "},void 0,!1,void 0,this),z0(y0,{bold:!0,color:"cyan",children:IJ(H)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z0(y0,{children:[z0(y0,{dimColor:!0,children:"Provider: "},void 0,!1,void 0,this),z0(y0,{bold:!0,children:S?.name??H.provider},void 0,!1,void 0,this)]},void 0,!0,void 0,this),S&&z0(XQ,{children:[z0(y0,{children:[z0(y0,{dimColor:!0,children:"Channel ID: "},void 0,!1,void 0,this),z0(y0,{children:H.provider},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z0(y0,{children:[z0(y0,{dimColor:!0,children:"Wire API: "},void 0,!1,void 0,this),z0(y0,{children:S.wireApi},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z0(y0,{children:[z0(y0,{dimColor:!0,children:"Endpoint: "},void 0,!1,void 0,this),z0(y0,{color:"blueBright",children:S.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),z0(y0,{children:[z0(y0,{dimColor:!0,children:"Model: "},void 0,!1,void 0,this),z0(y0,{bold:!0,children:H.model},void 0,!1,void 0,this)]},void 0,!0,void 0,this),H.overrides?.baseUrl&&z0(y0,{children:[z0(y0,{dimColor:!0,children:"Base URL override: "},void 0,!1,void 0,this),z0(y0,{color:"blueBright",children:H.overrides.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z0(y0,{children:[z0(y0,{dimColor:!0,children:"Context Window: "},void 0,!1,void 0,this),z0(y0,{children:Q1().resolveConfig(H).contextWindow},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this):z0(y0,{dimColor:!0,children:"请选择一个模型查看详情"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),O&&z0(V$,{marginTop:1,children:z0(y0,{color:"red",children:O},void 0,!1,void 0,this)},void 0,!1,void 0,this),z0(V$,{justifyContent:"center",marginTop:1,children:z0(y0,{dimColor:!0,children:"─".repeat(W)},void 0,!1,void 0,this)},void 0,!1,void 0,this),z0(V$,{justifyContent:"center",children:z0(y0,{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 SJ}from"ahooks";import{Box as bQ,Text as kJ}from"ink";import{useState as o1}from"react";import{Box as a1,Text as _1}from"ink";import QQ from"ink-text-input";import{jsxDEV as q$}from"react/jsx-dev-runtime";var Y3=({provider:$,value:J,onChange:Z,onSubmit:Y,onCancel:X,error:Q})=>{return q0((K,G)=>{if(G.escape)X()}),q$(a1,{flexDirection:"column",children:[q$(a1,{marginBottom:1,children:q$(_1,{bold:!0,color:"blue",children:"Step 2: 输入 API Key"},void 0,!1,void 0,this)},void 0,!1,void 0,this),q$(a1,{marginBottom:1,children:q$(_1,{children:["Provider: ",q$(_1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),q$(a1,{marginBottom:1,children:q$(_1,{dimColor:!0,children:"API 密钥将存储在 ~/.blade/auth.json(权限 600),不会写入模型配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),q$(a1,{children:[q$(_1,{bold:!0,color:"cyan",children:[">"," "]},void 0,!0,void 0,this),q$(QQ,{value:J,onChange:Z,onSubmit:Y,placeholder:"sk-...",mask:"*"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q&&q$(a1,{marginTop:1,children:q$(_1,{color:"red",children:Q},void 0,!1,void 0,this)},void 0,!1,void 0,this),q$(a1,{marginTop:1,children:q$(_1,{dimColor:!0,children:["输入完成后按 ",q$(_1,{bold:!0,children:"Enter"},void 0,!1,void 0,this),",",q$(_1,{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 X4,Text as S1}from"ink";import KQ from"ink-text-input";import{useState as Q4}from"react";import{jsxDEV as C$}from"react/jsx-dev-runtime";var K4=["id","name","baseUrl","model"];function Z3($){switch($){case"id":return"Channel ID";case"name":return"Channel name";case"baseUrl":return"Base URL";case"model":return"Model ID"}}function GQ($,J,Z){switch($){case"id":return"team-gateway";case"name":return Z||"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 UQ($,J){let Z=$.id.trim(),Y={name:$.name.trim()||Z,baseUrl:$.baseUrl.trim(),wireApi:J},X=Q3(Z,Y);if(!$.model.trim())X.push("Model ID must not be empty");if(X.length>0)throw Error(X[0]);return{provider:Z,model:$.model.trim(),displayName:$.model.trim(),modelProvider:Y}}var K3=({wireApi:$,initialConfig:J,onSubmit:Z,onCancel:Y})=>{let X={id:J?.provider??"",name:J?.modelProvider?.name??"",baseUrl:J?.modelProvider?.baseUrl??"",model:J?.model??""},[Q,K]=Q4(J?3:0),[G,U]=Q4(J?.model??""),[q,O]=Q4(X),[z,_]=Q4(),W=K4[Q];q0((N,A)=>{if(!A.escape)return;if(_(void 0),Q===0){Y();return}let I=Q-1,H=K4[I];K(I),U(q[H])});let L=(N)=>{let A=N.trim();if(W==="id"&&!X3.test(A)){_("Channel ID 必须以小写字母开头,且仅包含小写字母、数字、.、_ 或 -");return}if(W==="baseUrl")try{let H=new URL(A);if(!["http:","https:"].includes(H.protocol))throw Error()}catch{_("Base URL 必须是绝对 HTTP(S) URL");return}if(W==="model"&&!A){_("Model ID 不能为空");return}let I={...q,[W]:W==="name"&&!A?q.id:A};if(O(I),_(void 0),Q===K4.length-1){try{Z(UQ(I,$))}catch(H){_(H instanceof Error?H.message:"渠道配置无效")}return}K(Q+1),U("")};return C$(X4,{flexDirection:"column",children:[C$(X4,{marginBottom:1,children:C$(S1,{bold:!0,color:"blue",children:"配置自定义 Provider 渠道"},void 0,!1,void 0,this)},void 0,!1,void 0,this),C$(S1,{dimColor:!0,children:["Protocol:"," ",$==="anthropic-messages"?"Anthropic Messages":"OpenAI Chat Completions"]},void 0,!0,void 0,this),K4.slice(0,Q).map((N)=>C$(S1,{children:[Z3(N),": ",C$(S1,{color:"cyan",children:q[N]},void 0,!1,void 0,this)]},N,!0,void 0,this)),C$(X4,{marginTop:1,children:[C$(S1,{bold:!0,children:[Z3(W),": "]},void 0,!0,void 0,this),C$(KQ,{value:G,onChange:(N)=>{U(N),_(void 0)},onSubmit:L,placeholder:GQ(W,$,q.id)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),W==="name"&&C$(S1,{dimColor:!0,children:"留空使用 Channel ID"},void 0,!1,void 0,this),z&&C$(S1,{color:"red",children:z},void 0,!1,void 0,this),C$(X4,{marginTop:1,children:C$(S1,{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 q3,useState as b8}from"react";var z3=()=>{let[$,J]=b8([]),[Z,Y]=b8(!0),[X,Q]=b8(null);return q3(()=>{let K=!1;return(async()=>{try{let U=await G3();if(!K)J(U)}catch(U){if(!K)Q(U instanceof Error?U.message:"加载 Provider 列表失败")}finally{if(!K)Y(!1)}})(),()=>{K=!0}},[]),{providers:$,isLoading:Z,error:X}},O3=($)=>{let[J,Z]=b8([]),[Y,X]=b8(!1),[Q,K]=b8(null);return q3(()=>{if(!$){Z([]),X(!1),K(null);return}let G=!1;return Z([]),X(!0),K(null),(async()=>{try{let q=await U3($);if(!G)Z(q)}catch(q){if(!G)K(q instanceof Error?q.message:"加载模型列表失败")}finally{if(!G)X(!1)}})(),()=>{G=!0}},[$]),{models:J,isLoading:Y,error:Q}};import{Box as N1,Text as c$}from"ink";import qQ from"ink-select-input";import zQ from"ink-text-input";import{useMemo as _3,useState as OQ}from"react";import{jsxDEV as l0,Fragment as FQ}from"react/jsx-dev-runtime";var _Q=({isSelected:$})=>l0(N1,{marginRight:1,children:l0(c$,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),NQ=($)=>{let J=[$.name];if($.contextWindow){let Z=$.contextWindow>=1e6?`${($.contextWindow/1e6).toFixed(1)}M`:$.contextWindow>=1000?`${Math.round($.contextWindow/1000)}K`:`${$.contextWindow}`;J.push(`[${Z} 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(" ")},HQ=({isSelected:$,label:J})=>l0(c$,{bold:$,color:$?"yellow":void 0,children:J},void 0,!1,void 0,this),N3=({provider:$,models:J,isLoading:Z,error:Y,onSelect:X,onCancel:Q})=>{let[K,G]=OQ("");q0((O,z)=>{if(z.escape)if(K)G("");else Q()});let U=_3(()=>{if(!K)return J;let O=K.toLowerCase();return J.filter((z)=>z.name.toLowerCase().includes(O)||z.id.toLowerCase().includes(O))},[J,K]),q=_3(()=>U.map((O)=>({key:O.id,label:NQ(O),value:O})),[U]);if(Z)return l0(N1,{flexDirection:"column",children:l0(c$,{color:"yellow",children:["正在加载 ",$.name," 模型列表..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this);if(Y)return l0(N1,{flexDirection:"column",children:[l0(c$,{color:"red",children:Y},void 0,!1,void 0,this),l0(c$,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return l0(N1,{flexDirection:"column",children:[l0(N1,{marginBottom:1,children:l0(c$,{bold:!0,color:"blue",children:"Step 3: 选择模型"},void 0,!1,void 0,this)},void 0,!1,void 0,this),l0(N1,{marginBottom:1,children:l0(c$,{children:["Provider: ",l0(c$,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),l0(FQ,{children:[l0(N1,{marginBottom:1,children:[l0(c$,{color:"cyan",children:"> "},void 0,!1,void 0,this),l0(zQ,{value:K,onChange:G,placeholder:`搜索 ${J.length} 个模型...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),l0(N1,{marginBottom:1,children:l0(c$,{dimColor:!0,children:"模型元数据来自内置 catalog"},void 0,!1,void 0,this)},void 0,!1,void 0,this),l0(N1,{flexDirection:"column",height:12,children:l0(qQ,{items:q,onSelect:(O)=>X(O.value),indicatorComponent:_Q,itemComponent:HQ,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),U.length===0&&l0(c$,{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 i1,Text as k1}from"ink";import WQ from"ink-select-input";import LQ from"ink-text-input";import{useMemo as H3,useState as wQ}from"react";import{jsxDEV as z$}from"react/jsx-dev-runtime";var BQ=({isSelected:$})=>z$(i1,{marginRight:1,children:z$(k1,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),AQ=({isSelected:$,label:J})=>z$(k1,{bold:$,color:$?"yellow":void 0,children:J},void 0,!1,void 0,this),F3=({providers:$,isLoading:J,error:Z,onSelect:Y,onCancel:X})=>{let[Q,K]=wQ("");q0((q,O)=>{if(O.escape)if(Q)K("");else X()});let G=H3(()=>{if(!Q)return $;let q=Q.toLowerCase();return $.filter((O)=>O.name.toLowerCase().includes(q)||O.id.toLowerCase().includes(q))},[$,Q]),U=H3(()=>G.map((q)=>({key:q.id,label:`${q.name} - ${q.modelCount} models${q.configured?" [configured]":""}`,value:q})),[G]);if(J)return z$(i1,{flexDirection:"column",children:z$(k1,{color:"yellow",children:"正在加载 Provider 列表..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Z)return z$(i1,{flexDirection:"column",children:[z$(k1,{color:"red",children:Z},void 0,!1,void 0,this),z$(k1,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return z$(i1,{flexDirection:"column",children:[z$(i1,{marginBottom:1,children:z$(k1,{bold:!0,color:"blue",children:"Step 1: 选择 API 提供商"},void 0,!1,void 0,this)},void 0,!1,void 0,this),z$(i1,{marginBottom:1,children:[z$(k1,{color:"cyan",children:"> "},void 0,!1,void 0,this),z$(LQ,{value:Q,onChange:K,placeholder:`搜索 ${$.length} 个 Provider...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z$(i1,{flexDirection:"column",height:12,children:z$(WQ,{items:U,onSelect:(q)=>Y(q.value),indicatorComponent:BQ,itemComponent:AQ,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),G.length===0&&z$(k1,{color:"yellow",children:"未找到匹配的 Provider,按 Esc 清除搜索"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};function W3($){if($==="custom")return"provider";if($==="model")return"provider";if($==="credential")return"model";return}import{jsxDEV as f1}from"react/jsx-dev-runtime";var fJ=({mode:$,initialConfig:J,modelId:Z,onComplete:Y,onCancel:X})=>{let[Q,K]=o1("provider"),[G,U]=o1(),[q,O]=o1(),[z,_]=o1(),[W,L]=o1(""),[N,A]=o1(),[I,H]=o1(!1),S=z3(),B=O3(G?.id),w=h0(!1);q0((v,T)=>{if(T.ctrl&&v==="c"||T.meta&&v==="c")$==="setup"?w():X()});let M=SJ(async(v)=>{if(!G)return;let T=z??(q?{provider:G.id,model:q.id,displayName:J?.displayName}:void 0);if(!T)return;H(!0),A(void 0);try{if(T.modelProvider)Q1().registerModelProvider(T.provider,T.modelProvider,[T.model]);if(v?.trim())await Q1().setApiKey(T.provider,v.trim());let k={displayName:T.displayName,provider:T.provider,model:T.model,overrides:T.overrides};if($==="setup")await Y(T);else if($==="add"){let y=T.modelProvider?await a0().addModelWithProvider(k,T.modelProvider):await a0().addModel(k);await a0().setCurrentModel(y.id),await Y(T)}else if(Z){if(T.modelProvider)await a0().updateModelWithProvider(Z,k,T.modelProvider);else await a0().updateModel(Z,k);await Y(T)}}catch(k){if(T.modelProvider){await Q1().credentials.delete(T.provider);let y=Z4();Q1().configureModelProviders(y?.modelProviders??{},y?.models??[])}A(k instanceof Error?k.message:"保存配置失败"),H(!1)}}),P=SJ((v)=>{if(O(v),G?.configured)M();else if(G?.supportsApiKey)K("credential");else A(`${G?.name??"Provider"} 需要 OAuth 或环境凭证,请先在外部完成认证`)}),b=SJ(()=>{if(A(void 0),Q==="credential"&&z){K("custom");return}let v=W3(Q);if(v)K(v)});return f1(bQ,{flexDirection:"column",padding:1,children:[f1(kJ,{bold:!0,color:"blue",children:$==="edit"?"编辑模型":"添加模型"},void 0,!1,void 0,this),Q==="provider"&&f1(F3,{...S,onSelect:(v)=>{U(v),O(void 0),_(void 0),K(v.factoryWireApi?"custom":"model")},onCancel:$==="setup"?()=>{return}:X},void 0,!1,void 0,this),Q==="custom"&&G?.factoryWireApi&&f1(K3,{wireApi:G.factoryWireApi,initialConfig:z,onSubmit:(v)=>{_(v),K("credential")},onCancel:b},void 0,!1,void 0,this),Q==="model"&&G&&f1(N3,{provider:G,...B,onSelect:P,onCancel:b},void 0,!1,void 0,this),Q==="credential"&&G&&f1(Y3,{provider:G,value:W,onChange:L,onSubmit:()=>void M(W),onCancel:b,error:N},void 0,!1,void 0,this),I&&f1(kJ,{color:"yellow",children:"正在保存配置..."},void 0,!1,void 0,this),N&&Q!=="credential"&&f1(kJ,{color:"red",children:N},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as l8}from"ahooks";import{promises as A3}from"fs";import{Box as I$,Text as u0}from"ink";import L3 from"ink-select-input";import PQ from"ink-text-input";import MQ from"os";import G4 from"path";import{useEffect as yQ,useMemo as U4,useRef as RQ,useState as v1}from"react";import{jsxDEV as F0}from"react/jsx-dev-runtime";var r8=[{key:"allow",label:"Allow"},{key:"ask",label:"Ask"},{key:"deny",label:"Deny"},{key:"info",label:"Info"}],TQ={allow:"Add a new rule...",ask:"Add a new rule...",deny:"Add a new rule..."},CQ={allow:"Allow permission rules",ask:"Ask permission rules",deny:"Deny permission rules"},w3={project:"[项目共享配置]",global:"[用户全局配置]",local:"[本地配置]"},IQ=["project","global","local"],SQ={allow:[],ask:[],deny:[]},kQ={localExists:!1,projectExists:!1,globalExists:!1},B3={allow:[],ask:[],deny:[]};function fQ($){let J=(Y)=>Array.isArray(Y)?Y.filter((X)=>typeof X==="string"):[],Z=$?.permissions??{};return{allow:J(Z?.allow),ask:J(Z?.ask),deny:J(Z?.deny)}}async function vQ($){try{let J=await A3.readFile($,"utf-8"),Z=JSON.parse(J);return{exists:!0,raw:Z,permissions:fQ(Z)}}catch(J){if(J.code==="ENOENT")return{exists:!1,raw:{},permissions:{...B3}};return console.warn(`[PermissionsManager] Failed to read ${$}:`,J),{exists:!0,raw:{},permissions:{...B3}}}}function DQ($,J){let Z=$.padEnd(32," "),Y=J==="local"?`${w3[J]} <- 可删除`:w3[J];return`${Z} ${Y}`}var b3=({onClose:$})=>{let Z=r0()==="permissions-manager",Y=h0(!1),[X,Q]=v1(0),K=r8[X].key,[G,U]=v1(SQ),[q,O]=v1(kQ),[z,_]=v1(!0),[W,L]=v1("list"),[N,A]=v1(""),[I,H]=v1(null),[S,B]=v1(null),w=RQ(!1),M=U4(()=>G4.join(Z$(),".blade","settings.local.json"),[]),P=U4(()=>G4.join(Z$(),".blade","settings.json"),[]),b=U4(()=>G4.join(MQ.homedir(),".blade","settings.json"),[]),v=l8(async()=>{_(!0);let V=await Promise.all([{source:"local",path:M},{source:"project",path:P},{source:"global",path:b}].map(async({source:n,path:Q0})=>{let w0=await vQ(Q0);return{source:n,path:Q0,...w0}})),C={localExists:V.find((n)=>n.source==="local")?.exists??!1,projectExists:V.find((n)=>n.source==="project")?.exists??!1,globalExists:V.find((n)=>n.source==="global")?.exists??!1};O(C);let x={allow:[],ask:[],deny:[]},c=Object.fromEntries(V.map((n)=>[n.source,n]));["allow","ask","deny"].forEach((n)=>{IQ.forEach((Q0)=>{(c[Q0]?.permissions[n]??[]).forEach((p0,s0)=>{let j0={key:`${Q0}:${s0}:${p0}`,rule:p0,source:Q0};x[n].push(j0)})})}),U(x),_(!1)});yQ(()=>{v()},[v]);let T=l8(async(D,V)=>{try{let C=G4.join(Z$(),".blade","settings.local.json"),x={allow:[],ask:[],deny:[]};try{let n=await A3.readFile(C,"utf-8"),w0=JSON.parse(n).permissions||{};x={allow:Array.isArray(w0.allow)?w0.allow:[],ask:Array.isArray(w0.ask)?w0.ask:[],deny:Array.isArray(w0.deny)?w0.deny:[]}}catch(n){}let c=V(x);await a0().updateConfig({permissions:c},{scope:"local",immediate:!0}),await v()}catch(C){throw console.error("[PermissionsManager] 修改权限规则失败:",C),C}});q0((D,V)=>{if(V.ctrl&&D==="c"||V.meta&&D==="c"){Y();return}if(W==="locked"){if(w.current){w.current=!1;return}L("list"),H(null),B(null);return}if(V.escape){if(W==="list"||K==="info")$();else L("list"),A(""),H(null),B(null);return}if(W==="list"){if(V.tab&&V.shift)Q((C)=>(C-1+r8.length)%r8.length);else if(V.tab)Q((C)=>(C+1)%r8.length);else if(D?.toLowerCase()==="q")$()}},{isActive:Z});let k=l8((D)=>{let V=D.value;if(K==="info")return;if(V.type==="add"){L("add"),A(""),B(null);return}if(V.entry.source!=="local"){L("locked"),w.current=!0,H({tab:K,entry:V.entry}),B({type:"error",text:V.entry.source==="project"?"此规则定义在项目共享配置中,无法在此删除。":"此规则来自用户全局配置,无法在此删除。"});return}L("confirm-delete"),H({tab:K,entry:V.entry}),B(null)}),y=l8(async()=>{if(K==="info")return;let D=N.trim();if(!D){B({type:"error",text:"Permission rule 不能为空"});return}if(G[K].map((C)=>C.rule).includes(D)){B({type:"error",text:"该规则已存在"});return}try{await T(K,(C)=>{let x={allow:[...C.allow],ask:[...C.ask],deny:[...C.deny]};return x[K]=[...new Set([...C[K],D])],x}),L("list"),A(""),B({type:"success",text:"已添加本地权限规则"})}catch(C){B({type:"error",text:`保存失败: ${C instanceof Error?C.message:"未知错误"}`})}}),j=l8(async()=>{if(!I)return;let{tab:D,entry:V}=I;try{await T(D,(C)=>{let x={allow:[...C.allow],ask:[...C.ask],deny:[...C.deny]};return x[D]=C[D].filter((c)=>c!==V.rule),x}),L("list"),H(null),B({type:"success",text:"已删除本地权限规则"})}catch(C){B({type:"error",text:`删除失败: ${C instanceof Error?C.message:"未知错误"}`})}}),o=U4(()=>{if(K==="info")return[];let D=K;return[{key:"add-new-rule",label:`› ${TQ[D]}`,value:{type:"add"}},...G[D].map((C)=>({key:C.key,label:DQ(C.rule,C.source),value:{type:"rule",entry:C}}))]},[K,G]),t=()=>F0(I$,{marginBottom:1,children:r8.map((D,V)=>F0(I$,{marginRight:2,children:F0(u0,{color:V===X?"yellow":"gray",children:["[",D.label,"]"]},void 0,!0,void 0,this)},D.key,!1,void 0,this))},void 0,!1,void 0,this),a=()=>F0(I$,{flexDirection:"column",gap:1,children:[F0(u0,{children:"配置文件优先级(从高到低):"},void 0,!1,void 0,this),F0(I$,{flexDirection:"column",marginLeft:2,children:[F0(u0,{children:["1. .blade/settings.local.json (本地配置,不提交 Git)"," ",q.localExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),F0(u0,{children:["2. .blade/settings.json (项目配置,提交 Git)"," ",q.projectExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),F0(u0,{children:["3. ~/.blade/settings.json (用户全局配置)"," ",q.globalExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),F0(u0,{children:"说明:"},void 0,!1,void 0,this),F0(I$,{flexDirection:"column",marginLeft:2,children:[F0(u0,{children:"- /permissions 命令只管理本地配置 (.blade/settings.local.json)"},void 0,!1,void 0,this),F0(u0,{children:"- 修改全局或项目配置请直接编辑对应文件"},void 0,!1,void 0,this),F0(u0,{children:"- 本地配置不会提交到 Git"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),U0=(D)=>F0(I$,{flexDirection:"column",gap:1,children:[F0(u0,{bold:!0,children:CQ[D]},void 0,!1,void 0,this),F0(u0,{children:"Permission rules are a tool name, optionally followed by a specifier in parentheses."},void 0,!1,void 0,this),F0(u0,{color:"gray",children:"例如: WebFetch 或 Bash(ls:*)"},void 0,!1,void 0,this),F0(I$,{marginTop:1,children:F0(PQ,{value:N,onChange:A,onSubmit:y},void 0,!1,void 0,this)},void 0,!1,void 0,this),F0(u0,{color:"gray",children:"Enter 提交 · Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),m=(D,V)=>F0(I$,{flexDirection:"column",gap:1,children:[F0(u0,{bold:!0,children:["Delete ",D," permission rule?"]},void 0,!0,void 0,this),F0(u0,{children:V.rule},void 0,!1,void 0,this),F0(u0,{color:"gray",children:"From project local settings"},void 0,!1,void 0,this),F0(u0,{children:"Are you sure you want to delete this permission rule?"},void 0,!1,void 0,this),F0(L3,{items:[{label:"Yes",value:"yes"},{label:"No",value:"no"}],onSelect:(C)=>{if(C.value==="yes")j();else L("list"),H(null)}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),i=(D)=>F0(I$,{flexDirection:"column",gap:1,children:[F0(u0,{bold:!0,children:"Cannot delete this rule"},void 0,!1,void 0,this),F0(u0,{children:D.rule},void 0,!1,void 0,this),F0(u0,{color:"gray",children:D.source==="project"?"This rule is defined in .blade/settings.json. 请手动编辑该文件以移除规则。":"This rule is defined in ~/.blade/settings.json. 请手动编辑该文件以移除规则。"},void 0,!1,void 0,this),F0(u0,{color:"gray",children:"按任意键继续"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),F=(D)=>F0(L3,{items:o,isFocused:W==="list",onSelect:k},void 0,!1,void 0,this),R=()=>{if(z)return F0(u0,{children:"加载中..."},void 0,!1,void 0,this);if(K==="info")return a();if(W==="add")return U0(K);if(W==="confirm-delete"&&I)return m(I.tab,I.entry);if(W==="locked"&&I)return i(I.entry);return F(K)};return F0(I$,{flexDirection:"column",borderStyle:"round",borderColor:Z?"cyan":"gray",padding:1,width:80,children:[F0(u0,{color:"cyan",bold:!0,children:"权限管理器"},void 0,!1,void 0,this),t(),F0(I$,{flexDirection:"column",gap:1,children:R()},void 0,!1,void 0,this),S&&F0(I$,{marginTop:1,children:F0(u0,{color:S.type==="success"?"green":"red",children:S.text},void 0,!1,void 0,this)},void 0,!1,void 0,this),F0(I$,{marginTop:1,children:F0(u0,{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 _0}from"ink";import{useEffect as VQ,useState as n1}from"react";import{jsxDEV as l}from"react/jsx-dev-runtime";var vJ=["local","project","global"];function I3({workspaceRoot:$,onCancel:J}){let Z=r0()==="plugins-manager",Y=M3($),X=Y.getAll(),[Q,K]=n1(0),[G,U]=n1(!1),[q,O]=n1(""),[z,_]=n1(null),[W,L]=n1("local"),[N,A]=n1(null),[I,H]=n1(0),S=Y.getBySource(),B=Y.getStats(),w=Y.getSourcePolicy(),M=h0(!1,J);VQ(()=>{let y=!0;return P3.getInstance().loadWorkspacePluginSettingsResolution(Y.getWorkspaceRoot()).then((j)=>{if(y)A(j.settings)}).catch((j)=>{if(y)O(j instanceof Error?j.message:"无法读取插件作用域配置")}),()=>{y=!1}},[Y,I]);let P=()=>{L((y)=>{let j=vJ.indexOf(y);return vJ[(j+1)%vJ.length]}),_(null)},b=async()=>{let y=X[Q];if(!y||G)return;if(y.source==="cli"){O(`${y.manifest.name} 由 --plugin-dir 管理,不能持久化切换`);return}if(y.status==="error"){O(y.error??`${y.manifest.name} 当前不可用`);return}U(!0),O("");try{let j=await y3(Y.getWorkspaceRoot(),y.manifest.name,y.status!=="active",W);O(j.effectiveEnabled?`已启用 ${y.manifest.name} · 生效层级 ${j.effectiveScope}`:`已禁用 ${y.manifest.name} · 生效层级 ${j.effectiveScope}`),H((o)=>o+1)}catch(j){O(j instanceof Error?j.message:String(j))}finally{U(!1)}},v=async()=>{if(G)return;U(!0),O("");try{await R3(Y.getWorkspaceRoot()),K(0),O("插件列表已刷新"),H((y)=>y+1)}catch(y){O(y instanceof Error?y.message:String(y))}finally{U(!1)}},T=async()=>{let y=X[Q];if(!y||G)return;if(!y.installation){O(`${y.manifest.name} 不是 Blade 受管安装,不能自动更新`);return}U(!0),_(null),O("");try{let{result:j}=await T3(Y.getWorkspaceRoot(),y.manifest.name,{trusted:!0});if(!j.success)throw Error(j.error);O(j.changed?`已更新 ${y.manifest.name} 到 ${j.installation?.revision}`:`${y.manifest.name} 已是最新版本`),H((o)=>o+1)}catch(j){O(j instanceof Error?j.message:String(j))}finally{U(!1)}},k=async()=>{let y=X[Q];if(!y||G)return;if(!y.installation){O(`${y.manifest.name} 不是 Blade 受管安装,不能自动卸载`);return}if(z!==y.manifest.name){_(y.manifest.name),O(`再次按 x 确认卸载 ${y.manifest.name}`);return}U(!0),O("");try{let{result:j}=await C3(Y.getWorkspaceRoot(),y.manifest.name,!0);if(!j.success)throw Error(j.error);_(null),K(0),O(`已卸载 ${y.manifest.name}`),H((o)=>o+1)}catch(j){O(j instanceof Error?j.message:String(j))}finally{U(!1)}};if(q0((y,j)=>{if(j.escape)J?.();else if(j.ctrl&&y==="c"||j.meta&&y==="c")M();else if((j.upArrow||y==="k")&&X.length>0)_(null),K((o)=>(o-1+X.length)%X.length);else if((j.downArrow||y==="j")&&X.length>0)_(null),K((o)=>(o+1)%X.length);else if(y===" "||j.return)b();else if(y==="r")v();else if(y==="s")P();else if(y==="u")T();else if(y==="x")k()},{isActive:Z}),X.length===0)return l(C0,{flexDirection:"column",paddingY:1,children:[l(C0,{marginBottom:1,children:l(_0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),l(C0,{paddingLeft:2,children:l(_0,{color:"gray",children:"没有已加载的插件"},void 0,!1,void 0,this)},void 0,!1,void 0,this),l(C0,{marginTop:1,paddingLeft:2,flexDirection:"column",children:[l(_0,{color:"gray",children:"插件目录位置:"},void 0,!1,void 0,this),l(_0,{color:"gray",dimColor:!0,children:[" ","• ~/.blade/plugins/ - 用户级插件"]},void 0,!0,void 0,this),l(_0,{color:"gray",dimColor:!0,children:[" ","• .blade/plugins/ - 项目级插件"]},void 0,!0,void 0,this),l(_0,{color:"gray",dimColor:!0,children:[" ","• --plugin-dir - CLI 指定的插件"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),l(C0,{marginTop:1,paddingLeft:2,children:l(_0,{color:"gray",children:"使用 /plugins install <url> 安装新插件"},void 0,!1,void 0,this)},void 0,!1,void 0,this),l(C0,{marginTop:1,children:l(_0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return l(C0,{flexDirection:"column",paddingY:1,children:[l(C0,{marginBottom:1,children:[l(_0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this),l(_0,{color:"gray",children:[" (共 ",B.total," 个插件)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),l(C0,{paddingLeft:2,marginBottom:1,children:l(_0,{color:"gray",children:["启用: ",B.active," | 禁用: ",B.inactive," | 命令: ",B.commands," | 技能:"," ",B.skills," | 代理: ",B.agents]},void 0,!0,void 0,this)},void 0,!1,void 0,this),l(C0,{paddingLeft:2,marginBottom:1,children:l(_0,{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),l(C0,{paddingLeft:2,marginBottom:1,children:l(_0,{color:"gray",children:["写入层级: ",l(_0,{color:"cyan",children:W},void 0,!1,void 0,this)," · 按 s 切换"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),S.cli.length>0&&l(C0,{flexDirection:"column",marginBottom:1,children:[l(C0,{paddingLeft:1,children:[l(_0,{bold:!0,color:"magenta",children:"CLI 指定"},void 0,!1,void 0,this),l(_0,{color:"gray",children:" (--plugin-dir)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),S.cli.map((y)=>{let j=y.status==="active"?"[on]":"[off]",o=X.indexOf(y)===Q;return l(C0,{flexDirection:"column",paddingLeft:2,children:[l(_0,{children:[l(_0,{bold:!0,color:o?"cyan":"green",children:[o?"› ":" ",j," ",y.manifest.name]},void 0,!0,void 0,this),l(_0,{color:"gray",children:[" v",y.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),l(C0,{paddingLeft:2,children:l(_0,{color:"gray",children:y.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),l(C0,{paddingLeft:2,children:l(_0,{color:"gray",dimColor:!0,children:"生效层级: invocation"},void 0,!1,void 0,this)},void 0,!1,void 0,this),y.commands.length>0&&l(C0,{paddingLeft:2,children:l(_0,{color:"blue",children:["命令:"," ",y.commands.map((t)=>`/${t.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},y.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),S.project.length>0&&l(C0,{flexDirection:"column",marginBottom:1,children:[l(C0,{paddingLeft:1,children:[l(_0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),l(_0,{color:"gray",children:" (.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),S.project.map((y)=>{let j=y.status==="active"?"[on]":"[off]",o=X.indexOf(y)===Q;return l(C0,{flexDirection:"column",paddingLeft:2,children:[l(_0,{children:[l(_0,{bold:!0,color:o?"cyan":"green",children:[o?"› ":" ",j," ",y.manifest.name]},void 0,!0,void 0,this),l(_0,{color:"gray",children:[" v",y.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),l(C0,{paddingLeft:2,children:l(_0,{color:"gray",children:y.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),l(C0,{paddingLeft:2,children:l(_0,{color:"gray",dimColor:!0,children:["生效层级:"," ",N?.[y.manifest.name]?.effectiveScope??"default"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),y.commands.length>0&&l(C0,{paddingLeft:2,children:l(_0,{color:"blue",children:["命令:"," ",y.commands.map((t)=>`/${t.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},y.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),S.user.length>0&&l(C0,{flexDirection:"column",marginBottom:1,children:[l(C0,{paddingLeft:1,children:[l(_0,{bold:!0,color:"cyan",children:"用户级"},void 0,!1,void 0,this),l(_0,{color:"gray",children:" (~/.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),S.user.map((y)=>{let j=y.status==="active"?"[on]":"[off]",o=X.indexOf(y)===Q;return l(C0,{flexDirection:"column",paddingLeft:2,children:[l(_0,{children:[l(_0,{bold:!0,color:o?"cyan":"green",children:[o?"› ":" ",j," ",y.manifest.name]},void 0,!0,void 0,this),l(_0,{color:"gray",children:[" v",y.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),l(C0,{paddingLeft:2,children:l(_0,{color:"gray",children:y.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),l(C0,{paddingLeft:2,children:l(_0,{color:"gray",dimColor:!0,children:["生效层级:"," ",N?.[y.manifest.name]?.effectiveScope??"default"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),y.commands.length>0&&l(C0,{paddingLeft:2,children:l(_0,{color:"blue",children:["命令:"," ",y.commands.map((t)=>`/${t.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},y.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),l(C0,{marginTop:1,paddingLeft:2,flexDirection:"column",children:[l(_0,{color:"gray",children:"可用命令:"},void 0,!1,void 0,this),l(_0,{color:"gray",dimColor:!0,children:[" ","• /plugins list - 列出所有插件"]},void 0,!0,void 0,this),l(_0,{color:"gray",dimColor:!0,children:[" ","• /plugins info <name> - 显示插件详情"]},void 0,!0,void 0,this),l(_0,{color:"gray",dimColor:!0,children:[" ","• /plugins install <url> - 安装插件"]},void 0,!0,void 0,this),l(_0,{color:"gray",dimColor:!0,children:[" ","• /plugins enable/disable <name> - 启用/禁用插件"]},void 0,!0,void 0,this),l(_0,{color:"gray",dimColor:!0,children:[" ","• /plugins policy show|set - 来源与 SHA 策略"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),l(C0,{marginTop:1,children:l(_0,{dimColor:!0,children:"↑/↓ 选择 · Space/Enter 启停 · s 切换层级 · u 信任并更新 · x 卸载 · r 刷新 · ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),q&&l(C0,{marginTop:1,children:l(_0,{color:q.includes("失败")?"red":"cyan",children:q},void 0,!1,void 0,this)},void 0,!1,void 0,this),G&&l(_0,{color:"gray",children:"处理中..."},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import{Box as H$,Text as F$,useStdout as jQ}from"ink";import EQ from"ink-text-input";import DJ,{useCallback as a8,useMemo as hQ,useState as D1}from"react";import{jsxDEV as R0}from"react/jsx-dev-runtime";var gQ=DJ.memo(({option:$,index:J,isSelected:Z,isMultiSelect:Y,isHighlighted:X})=>R0(H$,{flexDirection:"column",marginBottom:1,children:[R0(F$,{color:X?"yellow":Z?"green":void 0,bold:X,children:[Y?Z?"(*) ":"( ) ":X?"> ":" ",J+1,". ",$.label]},void 0,!0,void 0,this),R0(H$,{marginLeft:4,children:R0(F$,{color:"gray",children:$.description},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)),mQ=DJ.memo(({questions:$,answers:J})=>R0(H$,{flexDirection:"column",marginBottom:1,children:$.map((Z)=>{let Y=J[Z.header],X=Array.isArray(Y)?Y.join(", "):Y||"(no answer)";return R0(H$,{marginBottom:1,children:[R0(F$,{backgroundColor:"blue",color:"white",children:[" ",Z.header," "]},void 0,!0,void 0,this),R0(F$,{color:"green",children:[" ",X]},void 0,!0,void 0,this)]},Z.header,!0,void 0,this)})},void 0,!1,void 0,this)),S3=DJ.memo(({questions:$,onComplete:J,onCancel:Z})=>{let{stdout:Y}=jQ(),X=Y.columns||80,K=r0()==="confirmation-prompt",G=h0(!1),[U,q]=D1("answering"),[O,z]=D1(0),[_,W]=D1({}),[L,N]=D1(0),[A,I]=D1([]),[H,S]=D1(!1),[B,w]=D1(""),[M,P]=D1(0),b=$[O],v=hQ(()=>{if(!b)return[];return[...b.options.map((t)=>({label:t.label,value:t.label,description:t.description})),{label:"Type something...",value:"__other__",description:"Enter custom response"}]},[b]),T=a8((t)=>{let a={..._,[b.header]:t};if(W(a),O<$.length-1)z(O+1),N(0),I([]),S(!1),w("");else q("submit"),P(0)},[_,b?.header,O,$.length]),k=a8((t)=>{let a=v[t];if(!a)return;if(a.value==="__other__"){S(!0);return}if(b.multiSelect)I((U0)=>U0.includes(a.value)?U0.filter((m)=>m!==a.value):[...U0,a.value]);else T(a.value)},[v,b?.multiSelect,T]),y=a8((t)=>{if(t.trim())T(t.trim())},[T]),j=a8(()=>{q("answering"),z(0),N(0),I([]),S(!1)},[]),o=a8(()=>{J(_)},[_,J]);if(q0((t,a)=>{if(a.ctrl&&t==="c"||a.meta&&t==="c"){G();return}if(H){if(a.escape)S(!1),w("");return}if(a.escape){Z();return}let U0=parseInt(t);if(U0>=1&&U0<=v.length){k(U0-1);return}if(a.upArrow){N((m)=>m>0?m-1:v.length-1);return}if(a.downArrow||a.tab){N((m)=>m<v.length-1?m+1:0);return}if(a.return){if(b.multiSelect&&A.length>0)T(A);else k(L);return}if(t===" "&&b.multiSelect){let m=v[L];if(m&&m.value!=="__other__")I((i)=>i.includes(m.value)?i.filter((F)=>F!==m.value):[...i,m.value]);return}},{isActive:K&&U==="answering"&&!H}),q0((t,a)=>{if(a.ctrl&&t==="c"||a.meta&&t==="c"){G();return}if(a.escape){Z();return}if(a.upArrow||a.downArrow||a.tab){P((U0)=>U0===0?1:0);return}if(a.return){if(M===0)o();else j();return}if(t.toLowerCase()==="y"){o();return}if(t.toLowerCase()==="e"){j();return}},{isActive:K&&U==="submit"}),U==="submit")return R0(H$,{flexDirection:"column",borderStyle:"round",borderColor:K?"green":"gray",padding:1,width:Math.min(X-4,80),children:[R0(H$,{marginBottom:1,children:R0(F$,{bold:!0,color:"green",children:"[OK] Review Your Answers"},void 0,!1,void 0,this)},void 0,!1,void 0,this),R0(mQ,{questions:$,answers:_},void 0,!1,void 0,this),R0(H$,{flexDirection:"column",marginTop:1,children:[R0(F$,{color:M===0?"yellow":void 0,bold:M===0,children:[M===0?"> ":" ","[Y] Submit answers"]},void 0,!0,void 0,this),R0(F$,{color:M===1?"yellow":void 0,bold:M===1,children:[M===1?"> ":" ","[E] Edit answers"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),R0(H$,{marginTop:1,children:R0(F$,{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(!b)return null;return R0(H$,{flexDirection:"column",borderStyle:"round",borderColor:K?"cyan":"gray",padding:1,width:Math.min(X-4,80),children:[R0(H$,{marginBottom:1,children:[R0(F$,{backgroundColor:"blue",color:"white",children:[" ",b.header," "]},void 0,!0,void 0,this),R0(F$,{children:[" ",b.question]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),H?R0(H$,{flexDirection:"column",marginTop:1,children:[R0(F$,{color:"yellow",children:"Enter your response:"},void 0,!1,void 0,this),R0(H$,{marginTop:1,children:[R0(F$,{color:"cyan",children:"> "},void 0,!1,void 0,this),R0(EQ,{value:B,onChange:w,onSubmit:y,focus:K},void 0,!1,void 0,this)]},void 0,!0,void 0,this),R0(H$,{marginTop:1,children:R0(F$,{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):R0(H$,{flexDirection:"column",children:v.map((t,a)=>R0(gQ,{option:t,index:a,isSelected:A.includes(t.value),isMultiSelect:b.multiSelect,isHighlighted:L===a},t.value,!1,void 0,this))},void 0,!1,void 0,this),!H&&R0(H$,{marginTop:1,flexDirection:"column",children:[R0(F$,{color:"gray",children:b.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),b.multiSelect&&A.length>0&&R0(F$,{color:"green",children:["Selected: ",A.join(", ")]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$.length>1&&R0(H$,{marginTop:1,children:R0(F$,{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{basename as pQ}from"node:path";import{Box as M8,Text as j$}from"ink";import xQ from"ink-select-input";import{useEffect as VJ,useMemo as P8,useRef as j3,useState as q4}from"react";function k3($){return`${$.projectPath}\x00${$.sessionId}`}function f3($){return $.title?.trim()||`Session ${$.sessionId.slice(0,8)}`}function v3($){return $.taskDelivery?` | delivery:${$.taskDelivery.status}`:""}function D3($,J){if(J!=="fork")return[...$];return $.filter((Z)=>Z.relationType!=="subagent")}function V3($){return{title:$==="fork"?"选择要 fork 的会话:":"选择要恢复的会话:",instructions:"(Left/Right to page | Up/Down to select | Enter to confirm | Esc to cancel)"}}import{jsxDEV as X$}from"react/jsx-dev-runtime";function uQ($){let J=new Date($),Y=new Date().getTime()-J.getTime(),X=Math.floor(Y/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()}`}function cQ($){return pQ($)}function dQ($){switch($){case"queued":return"QUEUED";case"running":return"RUNNING";case"failed":return"FAILED";case"cancelled":return"CANCELLED";case"interrupted":return"INTERRUPTED";case"completed":return"DONE"}}var lQ=({isSelected:$})=>X$(M8,{marginRight:1,children:X$(j$,{color:$?"cyan":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),rQ=({isSelected:$,label:J})=>X$(j$,{color:$?"cyan":"white",bold:$,children:J},void 0,!1,void 0,this),i8=20,E3=({intent:$,sessions:J,onSelect:Z,onCancel:Y})=>{let[X,Q]=q4([]),[K,G]=q4(!1),[U,q]=q4(0),[O,z]=q4(!1),_=j3(!1),W=j3(!0);VJ(()=>{return W.current=!0,()=>{W.current=!1}},[]);let N=r0()==="session-selector",A=h0(!1);q0((b,v)=>{if(v.ctrl&&b==="c"||v.meta&&b==="c"){A();return}if(_.current)return;if(v.escape&&Y){Y();return}if(v.leftArrow||b==="h"||b==="H"){if(U>0)q((T)=>T-1);return}if(v.rightArrow||b==="l"||b==="L"){if(U<B-1)q((T)=>T+1);return}},{isActive:N}),VJ(()=>{if(J){Q(J);return}(async()=>{G(!0);try{let v=await f0.listSessions({includeSubagents:!1});Q(v)}catch(v){console.error("[SessionSelector] Failed to load sessions:",v),Q([])}finally{G(!1)}})()},[J]);let I=P8(()=>D3(J||X,$),[$,J,X]),H=P8(()=>V3($),[$]),S=P8(()=>{return I.map((b)=>{let v=cQ(b.taskSourceProjectPath??b.projectPath),T=uQ(b.lastMessageTime),k=f3(b),y=`[${dQ(b.taskStatus)}]`,j=b.gitBranch?` (${b.gitBranch})`:"",o=b.hasErrors?" [!]":"",t=b.taskRetriedFrom?` ↻ retry:${b.taskRetriedFrom.sessionId.slice(0,6)}`:b.relationType==="subagent"?" ↳ subagent":b.relationType==="fork"?" ↳ fork":"",a=b.taskIsolation==="worktree"?` | wt:${b.taskWorktreeBranch??"managed"}`:b.taskIsolation==="local"?" | local":"",U0=b.taskDiffStat?` | ${b.taskDiffStat.changedFiles} files +${b.taskDiffStat.additions} -${b.taskDiffStat.deletions}`:"",m=b.taskStatus==="queued"&&b.taskQueuePosition?` | queue:${b.taskQueuePosition}/${b.taskQueueDepth??b.taskQueuePosition}`:"",i=v3(b);return{key:k3(b),label:`${y} ${k} · ${T} | ${v}${j} | ${b.messageCount} 条消息${a}${m}${U0}${i}${o}${t}`,value:b}})},[I]),B=P8(()=>Math.max(1,Math.ceil(S.length/i8)),[S.length]),w=P8(()=>{let b=U*i8;return S.slice(b,b+i8)},[S,U]),M=P8(()=>({start:U*i8+1,end:Math.min((U+1)*i8,S.length)}),[U,S.length]);VJ(()=>{q(0)},[I.length]);let P=(b)=>{if(_.current)return;_.current=!0,z(!0);let v=()=>{if(!W.current)return;_.current=!1,z(!1)};Promise.resolve().then(()=>Z(b.value)).then(v,v)};if(K)return X$(M8,{flexDirection:"column",paddingX:2,paddingY:1,children:X$(j$,{children:"正在加载会话列表..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(I.length===0)return X$(M8,{flexDirection:"column",paddingX:2,paddingY:1,children:[X$(j$,{color:"yellow",children:"没有找到历史会话"},void 0,!1,void 0,this),X$(j$,{dimColor:!0,children:[`
|
|
158
|
-
`,"提示: 开始一次对话后,会话历史将保存到 ~/.blade/projects/"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this);return X$(M8,{flexDirection:"column",paddingX:2,paddingY:1,children:[X$(j$,{bold:!0,color:"cyan",children:H.title},void 0,!1,void 0,this),X$(j$,{dimColor:!0,children:[`
|
|
159
|
-
`,H.instructions,`
|
|
160
|
-
`]},void 0,!0,void 0,this),X$(xQ,{items:w,onSelect:P,isFocused:N&&!O,indicatorComponent:lQ,itemComponent:rQ},void 0,!1,void 0,this),O&&X$(j$,{color:"cyan",children:$==="fork"?"Forking…":"Resuming…"},void 0,!1,void 0,this),X$(M8,{marginTop:1,flexDirection:"column",children:[X$(j$,{dimColor:!0,children:["第 ",U+1,"/",B," 页 · 共 ",I.length," 个会话 · 显示"," ",M.start,"-",M.end]},void 0,!0,void 0,this),B>1&&X$(M8,{marginTop:1,children:[X$(j$,{color:U>0?"cyan":"gray",children:U>0?"<< 上一页":" "},void 0,!1,void 0,this),X$(j$,{children:" "},void 0,!1,void 0,this),X$(j$,{color:U<B-1?"cyan":"gray",children:U<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 h3,Text as o8}from"ink";import aQ,{useEffect as iQ,useState as oQ}from"react";import{jsxDEV as V1}from"react/jsx-dev-runtime";var g3=["|","/","-","\\"],jJ=aQ.memo(()=>{let $=Y2(),J=P0(),Z=q8(),[Y,X]=oQ(0);if(iQ(()=>{if($?.status!=="loading"){X(0);return}let Q=setInterval(()=>{X((K)=>(K+1)%g3.length)},100);return()=>clearInterval(Q)},[$?.status]),!$)return null;return V1(h3,{flexDirection:"column",borderStyle:"single",borderColor:J.colors.info,marginX:2,marginBottom:1,paddingX:1,children:[V1(h3,{children:[V1(o8,{bold:!0,color:J.colors.info,children:"BTW"},void 0,!1,void 0,this),V1(o8,{color:J.colors.muted,children:[" | ",$.question]},void 0,!0,void 0,this),$.durationMs!==void 0&&V1(o8,{color:J.colors.muted,dimColor:!0,children:[" ","| ",$.durationMs,"ms"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$.status==="loading"&&V1(o8,{color:J.colors.text.secondary,children:[g3[Y]," Answering..."]},void 0,!0,void 0,this),$.status==="error"&&V1(o8,{color:J.colors.error,children:$.error??"Side conversation failed"},void 0,!1,void 0,this),$.status==="completed"&&$.response&&V1(t$,{content:$.response,role:"assistant",terminalWidth:Math.max(20,Z-8),hidePrefix:!0,noMargin:!0,messageId:`side-conversation-${$.requestId}`},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});jJ.displayName="SideConversationPanel";import{Box as i0,Text as V0}from"ink";import{jsxDEV as O0}from"react/jsx-dev-runtime";function p3({onCancel:$}){let J=o$(),Z=r0()==="skills-manager",X=m3({cwd:J}).getAll(),Q=X.filter((q)=>q.source==="builtin"),K=X.filter((q)=>q.source==="user"),G=X.filter((q)=>q.source==="project"),U=h0(!1,$);if(q0((q,O)=>{if(O.escape)$?.();else if(O.ctrl&&q==="c"||O.meta&&q==="c")U()},{isActive:Z}),X.length===0)return O0(i0,{flexDirection:"column",paddingY:1,children:[O0(i0,{marginBottom:1,children:O0(V0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this)},void 0,!1,void 0,this),O0(i0,{paddingLeft:2,children:O0(V0,{color:"gray",children:"没有找到任何 Skill"},void 0,!1,void 0,this)},void 0,!1,void 0,this),O0(i0,{marginTop:1,paddingLeft:2,children:O0(V0,{color:"gray",children:"配置文件位置: ~/.blade/skills/ 或 .blade/skills/"},void 0,!1,void 0,this)},void 0,!1,void 0,this),O0(i0,{marginTop:1,children:O0(V0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return O0(i0,{flexDirection:"column",paddingY:1,children:[O0(i0,{marginBottom:1,children:[O0(V0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this),O0(V0,{color:"gray",children:[" (找到 ",X.length," 个)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),G.length>0&&O0(i0,{flexDirection:"column",marginBottom:1,children:[O0(i0,{paddingLeft:1,children:[O0(V0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),O0(V0,{color:"gray",children:" (.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),G.map((q)=>{let z=q.description.length>80?`${q.description.substring(0,80)}...`:q.description;return O0(i0,{flexDirection:"column",paddingLeft:2,children:[O0(V0,{children:[O0(V0,{bold:!0,color:"green",children:["• ",q.name]},void 0,!0,void 0,this),O0(V0,{color:"gray",children:[" - ",z]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),q.allowedTools&&q.allowedTools.length>0&&O0(i0,{paddingLeft:2,children:O0(V0,{color:"gray",children:["工具: ",q.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),O0(i0,{paddingLeft:2,children:O0(V0,{color:"gray",dimColor:!0,children:q.path},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},q.name,!0,void 0,this)})]},void 0,!0,void 0,this),K.length>0&&O0(i0,{flexDirection:"column",marginBottom:1,children:[O0(i0,{paddingLeft:1,children:[O0(V0,{bold:!0,color:"yellow",children:"用户级"},void 0,!1,void 0,this),O0(V0,{color:"gray",children:" (~/.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),K.map((q)=>{let z=q.description.length>80?`${q.description.substring(0,80)}...`:q.description;return O0(i0,{flexDirection:"column",paddingLeft:2,children:[O0(V0,{children:[O0(V0,{bold:!0,color:"green",children:["• ",q.name]},void 0,!0,void 0,this),O0(V0,{color:"gray",children:[" - ",z]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),q.allowedTools&&q.allowedTools.length>0&&O0(i0,{paddingLeft:2,children:O0(V0,{color:"gray",children:["工具: ",q.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),O0(i0,{paddingLeft:2,children:O0(V0,{color:"gray",dimColor:!0,children:q.path},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},q.name,!0,void 0,this)})]},void 0,!0,void 0,this),Q.length>0&&O0(i0,{flexDirection:"column",marginBottom:1,children:[O0(i0,{paddingLeft:1,children:[O0(V0,{bold:!0,color:"cyan",children:"内置"},void 0,!1,void 0,this),O0(V0,{color:"gray",children:" (builtin)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q.map((q)=>{let z=q.description.length>80?`${q.description.substring(0,80)}...`:q.description;return O0(i0,{flexDirection:"column",paddingLeft:2,children:[O0(V0,{children:[O0(V0,{bold:!0,color:"green",children:["• ",q.name]},void 0,!0,void 0,this),O0(V0,{color:"gray",children:[" - ",z]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),q.userInvocable&&O0(i0,{paddingLeft:2,children:O0(V0,{color:"blue",children:["命令: /",q.name]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},q.name,!0,void 0,this)})]},void 0,!0,void 0,this),O0(i0,{marginTop:1,children:O0(V0,{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 x3,Text as d$}from"ink";import nQ,{useEffect as tQ,useMemo as sQ,useState as u3}from"react";import{jsxDEV as W$,Fragment as EJ}from"react/jsx-dev-runtime";var c3=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"];function eQ($){let J=Math.floor($/1000);if(J<60)return`${J}s`;let Z=Math.floor(J/60),Y=J%60;return`${Z}m ${Y}s`}var d3=nQ.memo(()=>{let $=Z0((q)=>q.app.subagentProgresses),J=Z0((q)=>q.app.subagentProgress),Z=P0(),[Y,X]=u3(0),[Q,K]=u3(()=>Date.now()),G=sQ(()=>{let q=Object.values($);return q.length>0?q:J?[J]:[]},[J,$]),U=G.some((q)=>q.status==="running");if(tQ(()=>{if(!U){X(0);return}let q=setInterval(()=>{X((z)=>(z+1)%c3.length)},80),O=setInterval(()=>{K(Date.now())},1000);return()=>{clearInterval(q),clearInterval(O)}},[U]),G.length===0)return null;return W$(x3,{paddingX:2,paddingY:0,flexDirection:"column",children:G.map((q)=>{let O=q.status==="running"?c3[Y]:q.status==="completed"?"[OK]":"[X]",z=q.status==="running"?Z.colors.info:q.status==="completed"?Z.colors.success:Z.colors.error,_=Math.max(0,Q-q.startTime);return W$(x3,{flexDirection:"row",gap:1,children:[W$(d$,{color:z,bold:!0,children:O},void 0,!1,void 0,this),W$(d$,{color:Z.colors.muted,children:"Subagent"},void 0,!1,void 0,this),W$(d$,{color:Z.colors.text.primary,bold:!0,children:q.type},void 0,!1,void 0,this),W$(d$,{color:Z.colors.muted,children:"|"},void 0,!1,void 0,this),W$(d$,{color:Z.colors.text.secondary,children:q.description},void 0,!1,void 0,this),q.currentTool&&W$(EJ,{children:[W$(d$,{color:Z.colors.muted,children:"|"},void 0,!1,void 0,this),W$(d$,{color:Z.colors.warning,children:q.currentTool},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.status==="running"&&_>0&&W$(EJ,{children:[W$(d$,{color:Z.colors.muted,children:"|"},void 0,!1,void 0,this),W$(d$,{color:Z.colors.info,children:eQ(_)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.status==="failed"&&q.terminalSummary&&W$(EJ,{children:[W$(d$,{color:Z.colors.muted,children:"|"},void 0,!1,void 0,this),W$(d$,{color:Z.colors.error,children:q.terminalSummary},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},q.id,!0,void 0,this)})},void 0,!1,void 0,this)});import{Box as y8,Text as H1}from"ink";import $K from"react";import{jsxDEV as P$}from"react/jsx-dev-runtime";var hJ={idle:"-",running:">",completed:"[OK]",failed:"[X]",deleted:"[X]",leader:"*",cancelled:"[X]",unknown:"?",pending:"-",blocked:"x"},gJ=$K.memo(()=>{let $=G9().filter((Z)=>Z.status!=="deleted"),J=P0();if($.length===0)return null;return P$(y8,{flexDirection:"column",paddingX:2,children:$.map((Z)=>{let Y=Z.tasks.filter((X)=>X.status==="completed").length;return P$(y8,{flexDirection:"column",marginBottom:1,children:[P$(y8,{gap:1,children:[P$(H1,{bold:!0,color:Z.status==="failed"?J.colors.error:Z.status==="completed"?J.colors.success:J.colors.info,children:[hJ[Z.status]," Team"]},void 0,!0,void 0,this),P$(H1,{bold:!0,color:J.colors.text.primary,children:Z.name},void 0,!1,void 0,this),P$(H1,{color:J.colors.muted,children:["| ",Z.members.length-1," members | ",Y,"/",Z.tasks.length," ","tasks"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),P$(y8,{flexDirection:"column",paddingLeft:2,children:[Z.members.filter((X)=>X.status!=="leader").map((X)=>P$(y8,{gap:1,children:[P$(H1,{color:J.colors.muted,children:hJ[X.status]},void 0,!1,void 0,this),P$(H1,{color:J.colors.text.secondary,children:X.name},void 0,!1,void 0,this),P$(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)),Z.tasks.map((X)=>P$(y8,{gap:1,children:[P$(H1,{color:J.colors.muted,children:hJ[X.status]},void 0,!1,void 0,this),P$(H1,{color:J.colors.text.secondary,children:["#",X.id," ",X.subject]},void 0,!0,void 0,this),P$(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)]},Z.name,!0,void 0,this)})},void 0,!1,void 0,this)});gJ.displayName="TeamProgress";import{useMemoizedFn as JK}from"ahooks";import{Box as e$,Text as s}from"ink";import YK from"ink-select-input";import{useState as l3}from"react";import{jsxDEV as r}from"react/jsx-dev-runtime";var r3=t1.map(($)=>({label:$.label,value:$.id})),ZK=({theme:$})=>{let{colors:J}=$;return r(e$,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[r(s,{bold:!0,color:J.text.primary,children:"代码预览"},void 0,!1,void 0,this),r(s,{children:" "},void 0,!1,void 0,this),r(s,{color:J.syntax.comment,children:"# function"},void 0,!1,void 0,this),r(s,{children:[r(s,{color:J.syntax.keyword,children:"def"},void 0,!1,void 0,this)," ",r(s,{color:J.syntax.function,children:"fibonacci"},void 0,!1,void 0,this),r(s,{color:J.text.primary,children:"("},void 0,!1,void 0,this),r(s,{color:J.syntax.variable,children:"n"},void 0,!1,void 0,this),r(s,{color:J.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),r(s,{children:[" ",r(s,{color:J.syntax.variable,children:"a"},void 0,!1,void 0,this),r(s,{color:J.syntax.operator,children:","},void 0,!1,void 0,this)," ",r(s,{color:J.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",r(s,{color:J.syntax.operator,children:"="},void 0,!1,void 0,this)," ",r(s,{color:J.syntax.number,children:"0"},void 0,!1,void 0,this),r(s,{color:J.syntax.operator,children:","},void 0,!1,void 0,this)," ",r(s,{color:J.syntax.number,children:"1"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),r(s,{children:[" ",r(s,{color:J.syntax.keyword,children:"for"},void 0,!1,void 0,this)," ",r(s,{color:J.syntax.variable,children:"_"},void 0,!1,void 0,this)," ",r(s,{color:J.syntax.keyword,children:"in"},void 0,!1,void 0,this)," ",r(s,{color:J.syntax.function,children:"range"},void 0,!1,void 0,this),r(s,{color:J.text.primary,children:"("},void 0,!1,void 0,this),r(s,{color:J.syntax.variable,children:"n"},void 0,!1,void 0,this),r(s,{color:J.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),r(s,{children:[" ",r(s,{color:J.syntax.variable,children:"a"},void 0,!1,void 0,this),r(s,{color:J.syntax.operator,children:","},void 0,!1,void 0,this)," ",r(s,{color:J.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",r(s,{color:J.syntax.operator,children:"="},void 0,!1,void 0,this)," ",r(s,{color:J.syntax.variable,children:"b"},void 0,!1,void 0,this),r(s,{color:J.syntax.operator,children:","},void 0,!1,void 0,this)," ",r(s,{color:J.syntax.variable,children:"a"},void 0,!1,void 0,this)," ",r(s,{color:J.syntax.operator,children:"+"},void 0,!1,void 0,this)," ",r(s,{color:J.syntax.variable,children:"b"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),r(s,{children:[" ",r(s,{color:J.syntax.keyword,children:"return"},void 0,!1,void 0,this)," ",r(s,{color:J.syntax.variable,children:"a"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),r(s,{children:" "},void 0,!1,void 0,this),r(s,{color:J.error,children:["- print(",r(s,{color:J.syntax.string,children:'"Hello, "'},void 0,!1,void 0,this)," + name)"]},void 0,!0,void 0,this),r(s,{color:J.success,children:["+ print(",r(s,{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)},XK=({theme:$})=>{let{colors:J}=$;return r(e$,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[r(s,{children:" "},void 0,!1,void 0,this),r(s,{bold:!0,color:J.text.primary,children:"颜色配置"},void 0,!1,void 0,this),r(s,{children:" "},void 0,!1,void 0,this),r(s,{children:[r(s,{color:J.text.muted,children:"Primary: "},void 0,!1,void 0,this),r(s,{color:J.primary,children:J.primary},void 0,!1,void 0,this)]},void 0,!0,void 0,this),r(s,{children:[r(s,{color:J.text.muted,children:"Success: "},void 0,!1,void 0,this),r(s,{color:J.success,children:J.success},void 0,!1,void 0,this)]},void 0,!0,void 0,this),r(s,{children:[r(s,{color:J.text.muted,children:"Error: "},void 0,!1,void 0,this),r(s,{color:J.error,children:J.error},void 0,!1,void 0,this)]},void 0,!0,void 0,this),r(s,{children:[r(s,{color:J.text.muted,children:"Warning: "},void 0,!1,void 0,this),r(s,{color:J.warning,children:J.warning},void 0,!1,void 0,this)]},void 0,!0,void 0,this),r(s,{children:[r(s,{color:J.text.muted,children:"Info: "},void 0,!1,void 0,this),r(s,{color:J.info,children:J.info},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},a3=()=>{let $=M1(),J=K$.getCurrentThemeName(),Z=t1.findIndex((L)=>L.label===J),Y=Z>=0?t1[Z].theme:t1[0].theme,[X,Q]=l3(Y),[K,G]=l3(!1),U=JK(async(L)=>{if(K)return;G(!0);try{await a0().setTheme(L.value),$.closeModal()}catch(N){console.error("主题切换失败:",N instanceof Error?N.message:N)}finally{G(!1)}}),q=(L)=>{let N=t1.find((A)=>A.id===L.value);if(N)Q(N.theme)},z=r0()==="theme-selector",_=h0(!1);q0((L,N)=>{if(N.ctrl&&L==="c"||N.meta&&L==="c"){_();return}if(N.escape&&!K)$.closeModal()},{isActive:z});let W=(L)=>{let{isSelected:N,label:A}=L,H=A===J?"[OK]":" ";return r(s,{color:N?X.colors.primary:X.colors.text.primary,children:[H," ",A]},void 0,!0,void 0,this)};return r(e$,{flexDirection:"column",height:"100%",children:[r(e$,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:X.colors.border.light,children:r(s,{bold:!0,color:X.colors.primary,children:"主题选择器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),r(e$,{flexDirection:"row",flexGrow:1,children:[r(e$,{width:"40%",borderStyle:"single",borderColor:X.colors.border.light,paddingX:1,children:r(e$,{flexDirection:"column",children:[r(e$,{paddingTop:1,paddingBottom:1,children:r(s,{bold:!0,color:X.colors.text.primary,children:["可用主题 (",r3.length,")"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),r(YK,{items:r3,initialIndex:Z>=0?Z:0,onSelect:U,onHighlight:q,itemComponent:W},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),r(e$,{width:"60%",flexDirection:"column",borderStyle:"single",borderColor:X.colors.border.light,children:[r(ZK,{theme:X},void 0,!1,void 0,this),r(XK,{theme:X},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),r(e$,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:X.colors.border.light,children:r(s,{color:X.colors.text.muted,children:K?"正在保存...":"Enter: 选择主题 | Esc: 取消"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{Box as O4,Text as J1,useStdout as _K}from"ink";import NK,{useCallback as F1,useEffect as s1,useMemo as xJ,useRef as R$,useState as $1}from"react";function QK($,J){return[...$,J].join(`
|
|
161
|
-
`).replace(/\n+$/,"")}function R8($){let J=2166136261;for(let Z=0;Z<$.length;Z++)J^=$.charCodeAt(Z),J=Math.imul(J,16777619);return`${$.length}:${(J>>>0).toString(16)}`}function n3({messages:$,currentStreamingMessageId:J,streamingLines:Z,streamingTail:Y,currentThinkingContent:X,pendingCommands:Q}){let K=QK(Z,Y),G=[];for(let U of $){let q=U.id===J?K:U.content,O=U.metadata&&"phase"in U.metadata?String(U.metadata.phase):"",z=U.id===J?X??U.thinkingContent:U.thinkingContent;if(U.role==="assistant"&&z)G.push({id:`${U.id}:thinking`,messageId:U.id,role:"assistant",kind:"thinking",content:z,revision:`${U.timestamp}:thinking:${R8(z)}`,collapsible:!0});let _=U.role==="tool"&&U.metadata&&"detail"in U.metadata&&typeof U.metadata.detail==="string"&&U.metadata.detail.length>0?U.metadata.detail:void 0;G.push({id:U.id,messageId:U.id,role:U.role,kind:U.role==="tool"?"tool":"message",content:q,detail:_,revision:`${U.timestamp}:${R8(q)}:${R8(_??"")}:${O}`,collapsible:_!==void 0})}if(J&&!G.some((U)=>U.id===J)){if(X)G.push({id:`${J}:thinking`,messageId:J,role:"assistant",kind:"thinking",content:X,revision:`stream:thinking:${R8(X)}`,collapsible:!0});G.push({id:J,messageId:J,role:"assistant",kind:"message",content:K,revision:`stream:${R8(K)}`,collapsible:!1})}for(let[U,q]of Q.entries())G.push({id:`pending:${U}:${q.displayText}`,messageId:`pending:${U}`,role:"user",kind:"message",content:q.displayText,revision:`pending:${R8(q.displayText)}`,pending:!0,collapsible:!1});return G}var i3={user:"> ",assistant:"• ",system:" ",tool:"└ "};function z4($,J,Z){let Y=J.text.length>0?J.text.split(`
|
|
162
|
-
`):[""],X=[];for(let[Q,K]of Y.entries()){let G=X.length===0?J.firstPrefix:J.nextPrefix,U=Math.max(1,Z-G.length),q=N8(K,U,!0),O=0;for(let z of q){let _=z.length>0?K.indexOf(z,O):O,W=_>=0?_:O,L=W+z.length,N=X.length===0?J.firstPrefix:J.nextPrefix;X.push({key:`${$.id}:${J.key}:${Q}:${X.length}`,blockId:$.id,role:$.role,kind:$.kind,text:`${N}${z}`,copyText:z,pending:$.pending===!0,header:J.header&&X.length===0,sourceLine:J.sourceLineOffset+Q,sourceStart:W,sourceEnd:L,sourceTextOffset:N.length}),O=L}}return X}function o3($){return $.length===0?0:$.split(`
|
|
163
|
-
`).length}function KK($){let J=$.split(`
|
|
164
|
-
`)[0]?.trim()??"";if(J.length<=48)return J;return`${J.slice(0,45)}...`}function t3($,J,Z=!1){if($.kind==="thinking"){let Y=Z?"[-]":"[+]",X=KK($.content),Q=`${Y} Thinking (${o3($.content)} lines)${!Z&&X?` - ${X}`:""}`,K={key:`${$.id}:header`,blockId:$.id,role:$.role,kind:$.kind,text:`? ${Q}`,copyText:Q,pending:$.pending===!0,header:!0,sourceLine:null,sourceStart:0,sourceEnd:0,sourceTextOffset:2};if(!Z)return[K];return[K,...z4($,{text:$.content,firstPrefix:" ",nextPrefix:" ",sourceLineOffset:0,key:"thinking",header:!1},J)]}if($.kind==="tool"&&$.detail){let Y=Z?"[-]":"[+]",X=z4($,{text:$.content,firstPrefix:`${i3.tool}${Y} `,nextPrefix:" ",sourceLineOffset:0,key:"summary",header:!0},J);if(!Z)return X;return[...X,...z4($,{text:$.detail,firstPrefix:" ",nextPrefix:" ",sourceLineOffset:o3($.content),key:"detail",header:!1},J)]}return z4($,{text:$.content.length>0?$.content:"…",firstPrefix:i3[$.role],nextPrefix:" ",sourceLineOffset:0,key:"content",header:!0},J)}function GK($){if($.kind==="tool"&&$.detail)return[...$.content.split(`
|
|
165
|
-
`),...$.detail.split(`
|
|
166
|
-
`)];return $.content.split(`
|
|
167
|
-
`)}function UK($,J){let Z=[];for(let[Y,X]of GK($).entries())for(let Q of X.matchAll(J)){let K=Q.index,G=Q[0];if(G.length===0)continue;Z.push({blockId:$.id,sourceLine:Y,start:K,end:K+G.length})}return Z}class mJ{cache=new Map;search($,J){if(J.length===0)return[];let Z=J.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),Y=new RegExp(Z,"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 K=this.cache.get(Q.id);if(K?.revision===Q.revision&&K.query===J)return K.matches;let G=UK(Q,Y);return this.cache.set(Q.id,{revision:Q.revision,query:J,matches:G}),G})}}function pJ($,J){let Z=$.findIndex((Y)=>Y.blockId===J.blockId&&Y.sourceLine===J.sourceLine&&J.start>=Y.sourceStart&&J.start<Math.max(Y.sourceEnd,Y.sourceStart+1));if(Z>=0)return Z;return $.findIndex((Y)=>Y.blockId===J.blockId)}function s3($,J){if($.sourceLine===null||$.sourceEnd<=$.sourceStart)return[];let Z=[];for(let[Y,X]of J.entries()){if(X.blockId!==$.blockId||X.sourceLine!==$.sourceLine||X.end<=$.sourceStart||X.start>=$.sourceEnd)continue;Z.push({start:$.sourceTextOffset+Math.max($.sourceStart,X.start)-$.sourceStart,end:$.sourceTextOffset+Math.min($.sourceEnd,X.end)-$.sourceStart,matchIndex:Y})}return Z}function e3($,J,Z){let Y=Math.max(0,Math.min(J,Z)),X=Math.min($.length-1,Math.max(J,Z));if(X<Y)return"";let Q=$.slice(Y,X+1),K="";for(let[G,U]of Q.entries()){if(G===0){K=U.copyText;continue}let q=Q[G-1],O=U.sourceLine!==null&&U.blockId===q.blockId&&U.sourceLine===q.sourceLine;K+=`${O?"":`
|
|
168
|
-
`}${U.copyText}`}return K}function $Z($,J){let Z=new Map($.map((Y)=>[Y.id,Y.revision]));return J.filter((Y)=>Z.get(Y.id)!==Y.revision).map((Y)=>Y.id)}import{spawn as qK}from"node:child_process";function zK($){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 OK($,J,Z){return new Promise((Y)=>{let X=!1,Q=qK($,[...J],{stdio:["pipe","ignore","ignore"]}),K=setTimeout(()=>{if(X)return;X=!0,Q.kill("SIGKILL"),Y(!1)},2000),G=(U)=>{if(X)return;X=!0,clearTimeout(K),Y(U)};Q.once("error",()=>G(!1)),Q.once("close",(U)=>G(U===0)),Q.stdin.once("error",()=>G(!1)),Q.stdin.end(Z)})}function JZ($,J=!1){let Z=`\x1B]52;c;${Buffer.from($,"utf8").toString("base64")}\x07`;if(!J)return Z;return`\x1BPtmux;${Z.replaceAll("\x1B","\x1B\x1B")}\x1B\\`}async function YZ($,J={}){if($.length===0)return{success:!1};let Z=J.platform??process.platform,Y=J.env??process.env,X=J.runCommand??OK,Q=J.writeTerminal??((U)=>process.stdout.write(U)),K=Boolean(Y.SSH_CONNECTION),G=async(U)=>{try{return await X(U.command,U.args,$)}catch{return!1}};if(!K){for(let U of zK(Z))if(await G(U))return{success:!0,method:"native"}}if(Y.TMUX){if(await G({command:"tmux",args:["load-buffer","-w","-"]})){try{Q(JZ($,!0))}catch{}return{success:!0,method:"tmux"}}}try{return Q(JZ($)),{success:!0,method:"osc52"}}catch{return{success:!1}}}import{jsxDEV as L$}from"react/jsx-dev-runtime";function ZZ($,J){let Z=Array.from($.value);return{...$,cursor:Math.max(0,Math.min(Z.length,$.cursor+J))}}function HK($,J,Z){let Y=Array.from($.value);if(Z.leftArrow)return ZZ($,-1);if(Z.rightArrow)return ZZ($,1);if(Z.home)return{...$,cursor:0};if(Z.end)return{...$,cursor:Y.length};if(Z.backspace&&$.cursor>0)return Y.splice($.cursor-1,1),{value:Y.join(""),cursor:$.cursor-1};if(Z.delete&&$.cursor<Y.length)return Y.splice($.cursor,1),{value:Y.join(""),cursor:$.cursor};if(Z.ctrl&&J.toLowerCase()==="u")return{value:"",cursor:0};if(Z.ctrl||Z.meta||J.length===0)return $;let X=J.replace(/[\r\n\t]+/g," ");if(X.length===0)return $;let Q=Array.from(X);return Y.splice($.cursor,0,...Q),{value:Y.join(""),cursor:$.cursor+Q.length}}function FK({editor:$}){let J=Array.from($.value),Z=J.slice(0,$.cursor).join(""),Y=J[$.cursor]??" ",X=J.slice($.cursor+1).join("");return L$(J1,{wrap:"truncate-end",children:["/",Z,L$(J1,{inverse:!0,children:Y},void 0,!1,void 0,this),X,L$(J1,{dimColor:!0,children:" · Enter search · Esc cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}function WK({line:$,matches:J,currentMatchIndex:Z,selected:Y,selectedBlock:X,color:Q,highlightColor:K}){let G=s3($,J);if(Y||G.length===0)return L$(J1,{wrap:"truncate-end",color:Q,inverse:Y,bold:X,underline:X,children:$.text||" "},void 0,!1,void 0,this);let U=[],q=0;for(let O of G){if(O.start>q)U.push($.text.slice(q,O.start));U.push(L$(J1,{color:K,bold:!0,inverse:O.matchIndex===Z,children:$.text.slice(O.start,O.end)},`${$.key}:match:${O.matchIndex}`,!1,void 0,this)),q=O.end}if(q<$.text.length)U.push($.text.slice(q));return L$(J1,{wrap:"truncate-end",color:Q,bold:X,underline:X,children:U},void 0,!1,void 0,this)}var XZ=NK.memo(({isOpen:$,onClose:J,compact:Z=!1})=>{let Y=$2(),X=_2(),Q=O2(),K=N2(),G=Q8(),U=r0(),q=P0(),{stdout:O}=_K(),{width:z,height:_}=v2(),W=Z?Math.max(6,Math.floor(_*0.4)):_,L=Math.max(1,W-3),N=Math.max(12,z-4),A=R$(new Map),I=R$(new mJ),[H,S]=$1(new Set),B=R$(H);B.current=H;let w=xJ(()=>n3({messages:Y,currentStreamingMessageId:X,streamingLines:K.lines,streamingTail:K.tail,currentThinkingContent:Q,pendingCommands:G}),[Y,X,K.lines,K.tail,Q,G]),M=xJ(()=>{let g=new Set(w.map((h)=>h.id));for(let h of A.current.keys())if(!g.has(h))A.current.delete(h);return w.flatMap((h,f)=>{let p=H.has(h.id),$0=A.current.get(h.id),n0=$0?.revision===h.revision&&$0.width===N&&$0.expanded===p?$0.lines:t3(h,N,p);if(n0!==$0?.lines)A.current.set(h.id,{revision:h.revision,width:N,expanded:p,lines:n0});if(f===w.length-1)return n0;return[...n0,{key:`${h.id}:separator`,blockId:h.id,role:h.role,kind:h.kind,text:"",copyText:"",pending:h.pending===!0,header:!1,sourceLine:null,sourceStart:0,sourceEnd:0,sourceTextOffset:0}]})},[w,N,H]),[P,b]=$1(0),[v,T]=$1(new Set),[k,y]=$1(null),j=R$(null),[o,t]=$1(!1),a=R$(!1),[U0,m]=$1({value:"",cursor:0}),i=R$(U0),[F,R]=$1(""),[D,V]=$1(0),C=R$(0),[x,c]=$1(null),n=R$(null),[Q0,w0]=$1(null),p0=R$(0),s0=R$(null),j0=R$(0),l$=R$(w),r$=R$(M.length),a$=R$(N);j0.current=P,j.current=k,a.current=o,i.current=U0,C.current=D,n.current=x;let x0=xJ(()=>I.current.search(w,F),[w,F]),Q$=Math.max(0,M.length-L),o0=Math.max(0,M.length-P),E0=Math.max(0,o0-L),B$=F1((g)=>{let h=Math.max(0,Math.min(Q$,g));if(j0.current=h,b(h),h===0)T(new Set)},[Q$]),O$=F1((g)=>{if(M.length===0)return;let h=Math.max(0,Math.min(M.length-1,g)),f=Math.max(0,Math.min(M.length-L,h-Math.floor(L/2))),p=Math.min(M.length,f+L);B$(M.length-p)},[M.length,B$,L]),Z1=F1((g,h,f)=>{let p=new Set(B.current);if(h)p.add(g);else p.delete(g);B.current=p,s0.current=f,S(p)},[]),A1=F1((g)=>{let h=w.find((p)=>p.id===g.blockId);if(h?.collapsible&&!B.current.has(h.id)){Z1(h.id,!0,{blockId:h.id,match:g});return}let f=pJ(M,g);if(f>=0)O$(f)},[w,M,O$,Z1]),h1=F1((g,h=x0)=>{if(h.length===0){C.current=0,V(0);return}let f=(g%h.length+h.length)%h.length;C.current=f,V(f);let p=h[f];j.current=p.blockId,y(p.blockId),A1(p)},[x0,A1]),$8=F1((g)=>{let h=w.filter((d0)=>d0.collapsible);if(h.length===0)return;let f=h.findIndex((d0)=>d0.id===j.current),p=f<0?g>0?0:h.length-1:(f+g+h.length)%h.length,$0=h[p].id;j.current=$0,y($0);let n0=M.findIndex((d0)=>d0.blockId===$0&&d0.header);if(n0>=0)O$(n0)},[w,M,O$]),C8=F1(()=>{let g=j.current;if(!g)g=M.slice(E0,o0).find((f)=>w.some((p)=>p.id===f.blockId&&p.collapsible))?.blockId??null;if(!g)return;if(!w.find((f)=>f.id===g)?.collapsible)return;j.current=g,y(g),Z1(g,!B.current.has(g),{blockId:g})},[w,o0,M,Z1,E0]),S$=F1((g,h)=>{let f=n.current;if(!f||M.length===0)return;let p=h==="top"?0:h==="bottom"?M.length-1:Math.max(0,Math.min(M.length-1,f.head+g)),$0={...f,head:p};n.current=$0,c($0),O$(p)},[M.length,O$]),e0=F1(()=>{let g=n.current;if(!g)return;let h=e3(M,g.anchor,g.head);if(!h.trim()){w0("Nothing selected");return}let f=++p0.current;w0("Copying..."),YZ(h,{writeTerminal:(p)=>O.write(p)}).then((p)=>{if(p0.current!==f)return;w0(p.success?p.method==="osc52"?"Copy sent via OSC 52":`Copied ${h.split(`
|
|
169
|
-
`).length} lines`:"Copy failed"),n.current=null,c(null)})},[M,O]);s1(()=>{if(!Q0)return;let g=setTimeout(()=>w0(null),2500);return()=>clearTimeout(g)},[Q0]),s1(()=>{if(!$){p0.current++,l$.current=w,r$.current=M.length;return}B.current=new Set,S(new Set),j.current=null,y(null),a.current=!1,t(!1),i.current={value:"",cursor:0},m({value:"",cursor:0}),R(""),C.current=0,V(0),n.current=null,c(null),w0(null),j0.current=0,b(0),T(new Set),l$.current=w,r$.current=M.length,a$.current=N},[$]),s1(()=>{let g=new Set(w.map((h)=>h.id));if(S((h)=>{let f=new Set([...h].filter(($0)=>g.has($0)));return B.current=f,f.size===h.size&&[...f].every(($0)=>h.has($0))?h:f}),j.current&&!g.has(j.current))j.current=null,y(null)},[w]),s1(()=>{let g=r$.current;if(r$.current=M.length,!$)return;let h=s0.current;if(h){s0.current=null;let p=h.match?pJ(M,h.match):M.findIndex(($0)=>$0.blockId===h.blockId&&$0.header);if(p>=0)O$(p);return}if(j0.current===0){T(new Set);return}let f=Math.max(0,M.length-g);if(f>0)b((p)=>{let $0=Math.min(Q$,p+f);return j0.current=$0,$0});else if(j0.current>Q$)j0.current=Q$,b(Q$)},[N,H,$,M.length,Q$,O$]),s1(()=>{let g=l$.current;if(l$.current=w,!$||j0.current===0)return;let h=$Z(g,w);if(h.length===0)return;T((f)=>{let p=new Set(f);for(let $0 of h)p.add($0);return p})},[w,$]),s1(()=>{if(x0.length===0)C.current=0,V(0);else if(C.current>=x0.length)C.current=x0.length-1,V(x0.length-1)},[x0.length]),s1(()=>{if(a$.current===N)return;a$.current=N,n.current=null,c(null);let g=x0[C.current];if(g)A1(g)},[N,x0,A1]),q0((g,h)=>{if(!$)return;let f=h,p=U==="transcript-pager";if((f.ctrl||f.meta)&&g.toLowerCase()==="o")return J(),!0;if(!p){if(f.pageUp)return B$(j0.current+Math.max(1,L-1)),!0;if(f.pageDown)return B$(j0.current-Math.max(1,L-1)),!0;return!1}if(a.current){if(f.escape)return a.current=!1,t(!1),i.current={value:F,cursor:Array.from(F).length},m(i.current),!0;if(f.return){let n0=i.current.value,d0=I.current.search(w,n0);return R(n0),a.current=!1,t(!1),h1(0,d0),!0}let $0=HK(i.current,g,f);return i.current=$0,m($0),!0}if(g==="q")return J(),!0;if(n.current){if(f.escape)return n.current=null,c(null),!0;if(g==="y"||f.ctrl&&!f.meta&&g.toLowerCase()==="c")return e0(),!0;if(f.upArrow||g==="k")return S$(-1),!0;if(f.downArrow||g==="j")return S$(1),!0;if(f.pageUp)return S$(-Math.max(1,L-1)),!0;if(f.pageDown)return S$(Math.max(1,L-1)),!0;if(f.home||g==="g")return S$(0,"top"),!0;if(f.end||g==="G")return S$(0,"bottom"),!0;return!0}if(f.escape)return J(),!0;if(g==="/"){let $0={value:F,cursor:Array.from(F).length};return i.current=$0,m($0),a.current=!0,t(!0),!0}if(g==="n"&&x0.length>0)return h1(C.current+1),!0;if(g==="N"&&x0.length>0)return h1(C.current-1),!0;if(f.tab)return $8(f.shift?-1:1),!0;if(f.return||g==="e")return C8(),!0;if(g==="v"){if(M.length===0)return!0;let $0=Math.max(0,M.length-j0.current),n0=Math.max(0,$0-L),d0=j.current?M.findIndex((b1)=>b1.blockId===j.current&&b1.header):-1,_$=d0>=0?d0:Math.max(0,Math.min(M.length-1,n0)),I8={anchor:_$,head:_$};return n.current=I8,c(I8),O$(_$),!0}if(f.upArrow||g==="k")return B$(j0.current+1),!0;if(f.downArrow||g==="j")return B$(j0.current-1),!0;if(f.pageUp)return B$(j0.current+Math.max(1,L-1)),!0;if(f.pageDown)return B$(j0.current-Math.max(1,L-1)),!0;if(f.home||g==="g")return B$(Q$),!0;if(f.end||g==="G")return B$(0),!0;return!0},{isActive:$,priority:100});let i$=M.slice(E0,o0),K0=v.size,B0=M.length===0?"0/0":`${Math.min(o0,M.length)}/${M.length}`,b0=x?Math.min(x.anchor,x.head):-1,J0=x?Math.max(x.anchor,x.head):-1,e=F.length>0?`/${F} ${x0.length>0?`${D+1}/${x0.length}`:"0/0"}`:null,$$=Q0?Q0:x?`${J0-b0+1} lines selected · y copy · Esc cancel`:e?`${e} · n/N`:K0>0?`${K0} new · G latest`:"Ctrl+O / Esc / q close";return L$(O4,{flexDirection:"column",width:"100%",height:W,paddingX:2,children:[L$(O4,{justifyContent:"space-between",flexShrink:0,children:[L$(J1,{bold:!0,color:q.colors.primary,children:"Transcript"},void 0,!1,void 0,this),L$(J1,{color:q.colors.text.muted,children:B0},void 0,!1,void 0,this)]},void 0,!0,void 0,this),L$(O4,{flexDirection:"column",height:L,flexShrink:0,overflow:"hidden",children:i$.length===0?L$(J1,{color:q.colors.text.muted,children:"No transcript yet"},void 0,!1,void 0,this):i$.map((g,h)=>{let f=E0+h,p=b0>=0&&f>=b0&&f<=J0,$0=g.header&&g.blockId===k,n0=g.pending?q.colors.warning:g.kind==="thinking"?q.colors.info:g.role==="user"?q.colors.info:g.role==="assistant"?q.colors.success:q.colors.text.secondary;return L$(WK,{line:g,matches:x0,currentMatchIndex:D,selected:p,selectedBlock:$0,color:n0,highlightColor:q.colors.warning},g.key,!1,void 0,this)})},void 0,!1,void 0,this),L$(O4,{flexShrink:0,children:o?L$(FK,{editor:U0},void 0,!1,void 0,this):L$(J1,{color:Q0||K0>0?q.colors.warning:q.colors.text.muted,wrap:"truncate-end",children:[$$," · / 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 I0}from"react/jsx-dev-runtime";var M$=y1("UI"),UZ=({debug:$,continue:J,...Z})=>{if($)M$.debug("[Debug] BladeInterface props:",{permissionMode:Z.permissionMode,yolo:Z.yolo,maxTurns:Z.maxTurns,continue:J});let Y=n8(!1),X=n8(!1),Q=n8(!1),K=n8(null),G=n8(!1),[U,q]=BK(!1),O=J9(),z=Y9(),_=J2(),W=Q9(),L=X9(),N=M1(),A=P1(),I=Y8(),H=o$(),{stdout:S}=LK(),B=_9(),w=Z8(),M=O9();L1(()=>{if(K$.getCurrentThemeName()!==M)try{K$.setTheme(M)}catch{}},[M]);let P=O==="ready",b=O==="needsSetup",v=O==="idle",T=wK(()=>Z.agents?GZ(Z.agents):void 0,[Z.agents]),{confirmationState:k,confirmationHandler:y,handleResponse:j,dismissAll:o}=t9(),{executeCommand:t,handleAbort:a,isProcessing:U0,cleanupAgent:m}=i9(Z.systemPrompt,Z.appendSystemPrompt,y,Z.maxTurns,o,T),{getPreviousCommand:i,getNextCommand:F,addToHistory:R}=o9();B6();let D=e9("",0),V=t0(()=>{k$(),S.write(QZ.eraseScreen+QZ.cursorTo(0,0)),A.incrementClearCount()}),C=t0(()=>{if(U)return;q(!0)}),x=t0(()=>{if(!U)return;q(!1)}),c=t0(()=>{if(U)x();else C()});q0((f,p)=>{if(P&&!b&&(p.ctrl||p.meta)&&f.toLowerCase()==="o")return c(),!0;return!1},{priority:90}),L1(()=>{if(!G.current){G.current=!0;return}V()},[V,U]);let n=t0(async()=>{let f=w,p;if(f==="default")p="autoEdit";else if(f==="autoEdit")p="plan";else if(f==="plan")p="default";else p="default";try{await f0.setSessionPermissionMode(I,H,p),await a0().setPermissionMode(p)}catch($0){M$.error("权限模式切换失败:",$0 instanceof Error?$0.message:$0)}}),Q0=t0(async(f)=>{try{let p={displayName:f.displayName,provider:f.provider,model:f.model,overrides:f.overrides};if(f.modelProvider)await a0().addModelWithProvider(p,f.modelProvider);else await a0().addModel(p);N.setInitializationStatus("ready")}catch(p){throw M$.error("初始化配置保存失败:",p instanceof Error?p.message:p),p}}),w0=t0(()=>{if(_==="shortcuts")N.closeModal();else N.setActiveModal("shortcuts")}),p0=t0(async(f,p,$0)=>{return A2({intent:p,session:f,newSessionId:$0?.newSessionId,announceFork:$0?.announceFork,permissionModeOverride:Z.permissionMode},H,A,m)}),s0=t0(async(f,p)=>{let d0=(await B2(p,H)).filter((_$)=>_$.sessionId===f);if(d0.length===0)throw Error(`Session not found: ${f}`);if(d0.length>1)throw Error(`Multiple workspaces contain session ${f}; use the session selector`);return d0[0]}),{showSuggestions:j0,suggestions:l$,selectedSuggestionIndex:r$}=F6(D,t,i,F,R,a,U0,n,w0,_==="shortcuts");L1(()=>{if(D.value&&_==="shortcuts")N.closeModal()},[D.value,_,N]);let a$=t0(async()=>{Q.current=!0;try{let f=Z.forkSession?"fork":"resume",p=await B2(f,H);if(p.length===0){if(Z.forkSession){M$.error("没有可供 fork 的历史会话"),n$(1);return}A.addAssistantMessage("没有找到历史会话,开始新对话。");return}let $0=p[0];await p0($0,f,{newSessionId:Z.forkSession?Z.sessionId:void 0,announceFork:Z.forkSession?!1:void 0})}catch(f){if(M$.error("[BladeInterface] 继续会话失败:",f),Z.forkSession){n$(1);return}A.addAssistantMessage("继续会话失败,开始新对话。")}}),x0=t0(async()=>{Q.current=!0;try{if(typeof Z.resume==="string"&&Z.resume!=="true"){let $0=Z.forkSession?"fork":"resume",n0=await s0(Z.resume,$0);await p0(n0,$0,{newSessionId:Z.forkSession?Z.sessionId:void 0,announceFork:Z.forkSession?!1:void 0});return}let f=Z.forkSession?"fork":"resume",p=await B2(f,H);if(p.length===0)M$.error("没有找到历史会话"),n$(1);N.showSessionSelector(p,f)}catch(f){M$.error("[BladeInterface] 加载会话失败:",f),n$(1)}});L1(()=>{if(Y.current)return;if(J){Y.current=!0,a$();return}if(Z.resume)Y.current=!0,x0()},[J,Z.resume,a$,x0]);let Q$=t0(async(f)=>{let p=k.details?.type;if(p==="enterPlanMode"&&f.approved)try{await f0.setSessionPermissionMode(I,H,"plan"),await a0().setPermissionMode("plan"),M$.debug("[BladeInterface] Entered Plan mode")}catch($0){M$.error("[BladeInterface] Failed to enter Plan mode:",$0)}if(p==="exitPlanMode"&&f.approved)M$.debug("[BladeInterface] ExitPlanMode approved, Store auto-synced");j(f)}),o0=t0(()=>{A.addAssistantMessage("设置已取消"),A.addAssistantMessage("Blade 需要 API 配置才能正常工作。"),A.addAssistantMessage("您可以稍后运行 Blade 重新进入设置向导。"),n$(0)}),E0=t0(()=>{N.closeModal()}),B$=t0(async(f)=>{try{await p0(f,W?.intent??"resume"),N.closeModal()}catch(p){M$.error("[BladeInterface] Failed to restore session:",p),A.addAssistantMessage(`会话操作失败: ${p instanceof Error?p.message:"未知错误"}`),N.closeModal()}}),O$=t0(()=>{if(Z.resume)n$(0);else N.closeModal()}),Z1=t0((f)=>{N.showModelEditWizard(f)}),A1=t0((f)=>{A.addAssistantMessage(`已添加模型配置: ${f.displayName??f.model},并已切换到该模型`),E0()}),h1=t0((f)=>{A.addAssistantMessage(`已更新模型配置: ${f.displayName??f.model}`),E0()});L1(()=>{if(b){B.setFocus("model-config-wizard");return}if(k.isVisible)B.setFocus("confirmation-prompt");else if(_==="sessionSelector")B.setFocus("session-selector");else if(_==="themeSelector")B.setFocus("theme-selector");else if(_==="modelSelector")B.setFocus("model-selector");else if(_==="modelAddWizard"||_==="modelEditWizard")B.setFocus("model-config-wizard");else if(_==="permissionsManager")B.setFocus("permissions-manager");else if(_==="agentsManager")B.setFocus("agents-manager");else if(_==="agentCreationWizard")B.setFocus("agent-creation-wizard");else if(_==="skillsManager")B.setFocus("skills-manager");else if(_==="pluginsManager")B.setFocus("plugins-manager");else if(_==="hooksManager")B.setFocus("hooks-manager");else if(U)B.setFocus("transcript-pager");else if(_==="shortcuts")B.setFocus("main-input");else B.setFocus("main-input")},[b,k.isVisible,_,U,B.setFocus]),L1(()=>{if(!P||Q.current)return;if(KZ().length>0){Q.current=!0;return}Q.current=!0,A.addAssistantMessage("请输入您的问题,我将为您提供帮助。")},[P]),L1(()=>{if(!z)return;if(K.current===z)return;if(K.current=z,O==="error")A.addAssistantMessage(`初始化失败: ${z}`);else A.addAssistantMessage(`${z}`),A.addAssistantMessage("请重新尝试设置,或检查文件权限")},[z,O,A.addAssistantMessage]);let $8=t0(async(f)=>{try{await t({displayText:f,text:f,images:[],parts:[{type:"text",text:f}]})}catch(p){let $0=p instanceof Error?p.message:"无法发送初始消息";A.addAssistantMessage(`初始消息发送失败:${$0}`)}});L1(()=>{let f=Z.initialMessage?.trim();if(!f||X.current||!P||b)return;X.current=!0,R(f),$8(f)},[Z.initialMessage,P,b,t,R]);let C8=t0(async(f)=>{try{await a0().setPermissionMode(f)}catch(p){M$.error("权限模式初始化失败:",p instanceof Error?p.message:p)}});if(L1(()=>{let f=Z.permissionMode;if($)M$.debug("[Debug] permissionMode from CLI:",f),M$.debug("[Debug] current permissionMode:",w);if(!f||f===w)return;C8(f)},[Z.permissionMode,w]),v)return null;if(b)return I0(fJ,{mode:"setup",onComplete:Q0,onCancel:o0},void 0,!1,void 0,this);if($)M$.debug("[Debug] 渲染主界面,条件检查:",{confirmationVisible:k.isVisible,activeModal:_});let S$=_==="modelSelector",e0=L,i$=_==="modelAddWizard"?"add":_==="modelEditWizard"&&e0?"edit":null,K0=S$||Boolean(i$),B0=_==="agentsManager",b0=_==="agentCreationWizard",J0=_==="skillsManager",e=_==="pluginsManager",$$=e0?{displayName:e0.displayName,provider:e0.provider,model:e0.model,overrides:e0.overrides}:void 0,g=k.isVisible&&k.details?k.details.type==="mcpElicitation"&&k.details.mcpElicitation?I0(rY,{details:k.details.mcpElicitation,onComplete:(f,p)=>Q$({approved:f.action==="accept",elicitation:f,...p?{openExternalUrl:!0}:{}})},void 0,!1,void 0,this):k.details.type==="askUserQuestion"&&k.details.questions?I0(S3,{questions:k.details.questions,onComplete:(f)=>Q$({approved:!0,answers:f}),onCancel:()=>Q$({approved:!1})},void 0,!1,void 0,this):I0(HY,{details:k.details,onResponse:Q$},void 0,!1,void 0,this):_==="themeSelector"?I0(a3,{},void 0,!1,void 0,this):_==="permissionsManager"?I0(b3,{onClose:E0},void 0,!1,void 0,this):_==="sessionSelector"?I0(E3,{intent:W?.intent??"resume",sessions:W?.sessions,onSelect:B$,onCancel:O$},void 0,!1,void 0,this):_==="hooksManager"?I0(WY,{workspaceRoot:H,sessionId:I,onClose:E0},void 0,!1,void 0,this):null,h=Boolean(g);return I0(W1,{flexDirection:"column",width:"100%",overflow:"hidden",children:[g,I0(W1,{flexDirection:"column",display:h||U?"none":"flex",children:[I0($3,{active:!h&&!U},void 0,!1,void 0,this),I0(d3,{},void 0,!1,void 0,this),I0(gJ,{},void 0,!1,void 0,this),I0(jJ,{},void 0,!1,void 0,this),I0(uY,{paused:h||U},void 0,!1,void 0,this),I0(jY,{input:D.value,cursorPosition:D.cursorPosition,onChange:D.setValue,onChangeCursorPosition:D.setCursorPosition,onAddPasteMapping:D.addPasteMapping,onAddImagePasteMapping:D.addImagePasteMapping},void 0,!1,void 0,this),S$&&I0(W1,{marginTop:1,paddingX:2,children:I0(J3,{onClose:E0,onEdit:Z1},void 0,!1,void 0,this)},void 0,!1,void 0,this),i$&&I0(W1,{marginTop:1,paddingX:2,children:I0(fJ,{mode:i$,modelId:e0?.id,initialConfig:i$==="edit"?$$:void 0,onComplete:i$==="edit"?h1:A1,onCancel:E0},void 0,!1,void 0,this)},void 0,!1,void 0,this),B0&&I0(W1,{marginTop:1,paddingX:2,children:I0(I6,{workspaceRoot:H,onComplete:E0,onCancel:E0},void 0,!1,void 0,this)},void 0,!1,void 0,this),b0&&I0(W1,{marginTop:1,paddingX:2,children:I0(m8,{onComplete:E0,onCancel:E0},void 0,!1,void 0,this)},void 0,!1,void 0,this),J0&&I0(W1,{marginTop:1,paddingX:2,children:I0(p3,{onComplete:E0,onCancel:E0},void 0,!1,void 0,this)},void 0,!1,void 0,this),e&&I0(W1,{marginTop:1,paddingX:2,children:I0(I3,{workspaceRoot:H,onComplete:E0,onCancel:E0},void 0,!1,void 0,this)},void 0,!1,void 0,this),I0(j6,{suggestions:l$,selectedIndex:r$,visible:j0&&!K0},void 0,!1,void 0,this),I0(V6,{},void 0,!1,void 0,this)]},void 0,!0,void 0,this),I0(W1,{flexDirection:"column",display:U?"flex":"none",children:I0(XZ,{isOpen:U,compact:h,onClose:x},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{Box as AK,Text as j1}from"ink";import bK from"react";import{jsxDEV as w1}from"react/jsx-dev-runtime";class t8 extends bK.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 w1(AK,{flexDirection:"column",padding:1,borderStyle:"round",borderColor:"red",children:[w1(j1,{color:"red",children:"应用发生错误"},void 0,!1,void 0,this),w1(j1,{children:" "},void 0,!1,void 0,this),w1(j1,{color:"red",children:this.state.error?.message},void 0,!1,void 0,this),w1(j1,{children:" "},void 0,!1,void 0,this),w1(j1,{color:"gray",children:"错误详情:"},void 0,!1,void 0,this),w1(j1,{color:"gray",children:this.state.error?.stack},void 0,!1,void 0,this),w1(j1,{children:" "},void 0,!1,void 0,this),w1(j1,{color:"yellow",children:"请重启应用或联系开发者"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return this.props.children}}import{Box as e1,Text as B1}from"ink";import{useState as uJ}from"react";import{jsxDEV as w$}from"react/jsx-dev-runtime";var _4=[{key:"update",label:"Update now",description:`runs \`${zZ()}\``},{key:"skip",label:"Skip",description:""},{key:"skip_until_next",label:"Skip until next version",description:""}],_Z=({versionInfo:$,onComplete:J})=>{let[Z,Y]=uJ(0),[X,Q]=uJ(!1),[K,G]=uJ(null);q0((q,O)=>{if(O.ctrl&&q==="c"){h8().shutdown("SIGINT",0);return}if(X||K)return;if(O.upArrow||q==="k")Y((z)=>z>0?z-1:_4.length-1);else if(O.downArrow||q==="j")Y((z)=>z<_4.length-1?z+1:0);else if(O.return)U(_4[Z].key);else if(q==="1")U("update");else if(q==="2")U("skip");else if(q==="3")U("skip_until_next")});let U=async(q)=>{switch(q){case"update":{Q(!0);let O=await OZ();G(O.message),setTimeout(()=>{h8().shutdown("SIGINT",0)},1500);break}case"skip":J();break;case"skip_until_next":if($.latestVersion)await qZ($.latestVersion);J();break}};if(K)return w$(e1,{flexDirection:"column",marginY:1,children:w$(B1,{children:K},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(X)return w$(e1,{flexDirection:"column",marginY:1,children:w$(B1,{color:"cyan",children:"Updating..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);return w$(e1,{flexDirection:"column",marginY:1,children:[w$(B1,{color:"yellow",bold:!0,children:["Update available! ",w$(B1,{color:"gray",children:[$.currentVersion," ","->"," ",$.latestVersion]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),w$(e1,{marginTop:1,children:w$(B1,{color:"gray",children:["Release notes:"," ",w$(B1,{color:"cyan",underline:!0,children:$.releaseNotesUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),w$(e1,{flexDirection:"column",marginTop:1,children:_4.map((q,O)=>{let z=O===Z,_=z?"› ":" ",W=`${O+1}. `;return w$(e1,{children:w$(B1,{color:z?"cyan":void 0,children:[_,W,q.label,q.description&&w$(B1,{color:"gray",children:[" (",q.description,")"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},q.key,!1,void 0,this)})},void 0,!1,void 0,this),w$(e1,{marginTop:1,children:w$(B1,{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 N4,Text as T8}from"ink";import{useState as NZ}from"react";import{jsxDEV as Y1}from"react/jsx-dev-runtime";var HZ=({status:$,onTrust:J,onContinueSafely:Z})=>{let Y=K$.getTheme(),[X,Q]=NZ(!1),[K,G]=NZ(null);return q0((U,q)=>{if(X)return;if(q.return||U.toLowerCase()==="t"){Q(!0),G(null),J().catch((O)=>{G(O instanceof Error?O.message:"Failed to trust workspace"),Q(!1)});return}if(U.toLowerCase()==="s"||q.escape)Q(!0),G(null),Z().catch((O)=>{G(O instanceof Error?O.message:"Failed to continue safely"),Q(!1)})}),Y1(N4,{flexDirection:"column",paddingX:1,children:[Y1(T8,{bold:!0,color:Y.colors.warning,children:"Workspace review required"},void 0,!1,void 0,this),Y1(T8,{dimColor:!0,children:$.projectPath},void 0,!1,void 0,this),Y1(N4,{marginTop:1,flexDirection:"column",children:[Y1(T8,{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((U)=>Y1(T8,{children:[" ",U.path," · ",U.effects.length," effect(s)"]},`${U.kind}:${U.path}`,!0,void 0,this))]},void 0,!0,void 0,this),K&&Y1(N4,{marginTop:1,children:Y1(T8,{color:Y.colors.error,children:K},void 0,!1,void 0,this)},void 0,!1,void 0,this),Y1(N4,{marginTop:1,children:Y1(T8,{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 PK}from"ink";import{useEffect as MK}from"react";function FZ(){let{stdout:$}=PK();MK(()=>{if(!$.isTTY)return;return $.write(BY),$.write(NJ),()=>{$.write(AY),$.write(NJ)}},[$])}function WZ($){return($ instanceof Error?$.message:String($)).replace(/sk-[a-zA-Z0-9]{32,}/g,"sk-***").replace(/apiKey['":\s]+[a-zA-Z0-9-_]+/gi,"apiKey: ***").replace(/API_KEY['":\s=]+[a-zA-Z0-9-_]+/gi,"API_KEY=***")}import{jsxDEV as E1}from"react/jsx-dev-runtime";function RK($){if(Y$().config.actions.setConfig($),$.debug)console.log("[Debug] 模型配置检查通过,准备就绪");G$().setInitializationStatus("ready")}var TK=($)=>{FZ();let[J,Z]=F4(!1),[Y,X]=F4(null),[Q,K]=F4(!1),[G,U]=F4(null),q=H4((W,L)=>{let N=W instanceof Error?W.message:String(W);if(G$().setInitializationError(N),G$().setInitializationStatus("error"),Z(!0),L)console.error("[FAIL] 应用初始化失败:",N)}),O=H4(async()=>{try{let W=Y$().config.config??wZ,L=BZ(W,$);if(RK(L),L.resumeSessionId)AZ().restoreSession(L.resumeSessionId,[]);if(L.debug)console.error("[Debug] 运行时配置:",L);let N=L.codeTheme;if(N&&K$.hasTheme(N)){if(K$.setTheme(N),$.debug)console.log(`[OK] 已加载主题: ${N}`)}try{y$.getInstance().loadConfig(L.hooks||{},Z$());let I=await bZ(Z$());if($.debug&&L.hooks?.enabled)console.log("[OK] Hooks 系统已启用");if($.debug)console.log(`[OK] Workspace resources: ${I.subagents.getAllNames().length} agents, ${I.skills.size} skills, ${I.commands.getCommandCount()+I.commands.getPluginCommandCount()} commands, ${I.plugins.getAll().length} plugins`);let S=Y$().session.sessionId;LZ(S)}catch(A){if($.debug)console.warn("Hooks 初始化失败:",WZ(A))}M2(async()=>{await MZ.getInstance().killAll(),await PZ.getInstance().disconnectAll(),y$.getInstance().cleanup()}),Z(!0)}catch(W){q(W,!!$.debug)}}),z=H4(async()=>{let W=await cJ.getInstance().getStatus(Z$());if(W.state==="untrusted"||W.state==="error"){U(W);return}await O()}),_=H4(async()=>{if($.versionCheckPromise){let W=await $.versionCheckPromise;if(W){X(W),K(!0);return}}await z()});if(yK(()=>{_()},[]),Q&&Y)return E1(t8,{children:E1(_Z,{versionInfo:Y,onComplete:()=>{K(!1),z()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(G)return E1(t8,{children:E1(HZ,{status:G,onTrust:async()=>{await cJ.getInstance().trust(Z$()),await yZ(),U(null),await O()},onContinueSafely:async()=>{U(null),await O()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(!J)return null;return E1(t8,{children:E1(UZ,{...$},void 0,!1,void 0,this)},void 0,!1,void 0,this)},Gw=($)=>E1(Y6,{children:E1(TK,{...$},void 0,!1,void 0,this)},void 0,!1,void 0,this);export{Gw as AppWrapper};
|