blade-code 0.10.121 → 0.10.122

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.
Files changed (42) hide show
  1. package/dist/blade.js +2 -2
  2. package/dist/{chunk-n1t4vdw5.js → chunk-0axgw6c3.js} +1 -1
  3. package/dist/{chunk-ssmd3rn9.js → chunk-0gyv0ws4.js} +1 -1
  4. package/dist/{chunk-8myvrket.js → chunk-1dscrttm.js} +1 -1
  5. package/dist/{chunk-pccb23xv.js → chunk-2cdnsdx2.js} +1 -1
  6. package/dist/{chunk-863ynx9m.js → chunk-2kgp4h99.js} +1 -1
  7. package/dist/{chunk-szw16t85.js → chunk-4jt2gxzt.js} +1 -1
  8. package/dist/{chunk-akcn83x5.js → chunk-5h1x1a11.js} +1 -1
  9. package/dist/{chunk-dw9wcrtp.js → chunk-5n1ymw0p.js} +1 -1
  10. package/dist/{chunk-pttzjrg7.js → chunk-6xmz6mn0.js} +1 -1
  11. package/dist/{chunk-pqt9p2tb.js → chunk-7k4ehjfj.js} +1 -1
  12. package/dist/{chunk-ymaxdwy1.js → chunk-7w1z4hdy.js} +1 -1
  13. package/dist/{chunk-kaqz84w8.js → chunk-9byspsen.js} +1 -1
  14. package/dist/{chunk-vsr1g5ke.js → chunk-9vrsygd9.js} +1 -1
  15. package/dist/{chunk-d75myaef.js → chunk-b62w3ceq.js} +1 -1
  16. package/dist/chunk-bn6g1g8k.js +169 -0
  17. package/dist/{chunk-gnvepc4p.js → chunk-cqg8xkmd.js} +1 -1
  18. package/dist/{chunk-vxxcdarq.js → chunk-d1gnxqpg.js} +1 -1
  19. package/dist/{chunk-v9bfzh20.js → chunk-d59y2wwj.js} +1 -1
  20. package/dist/{chunk-6x5c8qa6.js → chunk-dwqqvn2w.js} +1 -1
  21. package/dist/{chunk-vke2en0x.js → chunk-edqe893j.js} +1 -1
  22. package/dist/chunk-gades6fm.js +1 -0
  23. package/dist/{chunk-fwmym1zk.js → chunk-gqfa43gv.js} +1 -1
  24. package/dist/{chunk-v5d7he8r.js → chunk-j0efq6yy.js} +1 -1
  25. package/dist/{chunk-b1rqfaea.js → chunk-j19j9ypt.js} +1 -1
  26. package/dist/{chunk-9p4jkczh.js → chunk-j8ae2jpv.js} +2 -2
  27. package/dist/{chunk-88krdjg8.js → chunk-jg81tz55.js} +1 -1
  28. package/dist/{chunk-rvvvx553.js → chunk-jhcxqhj9.js} +1 -1
  29. package/dist/{chunk-e2b6d9mw.js → chunk-khewsbnt.js} +1 -1
  30. package/dist/{chunk-y7wwx4jn.js → chunk-mzjw10nw.js} +1 -1
  31. package/dist/{chunk-5yd5k1tf.js → chunk-n8xv0whr.js} +1 -1
  32. package/dist/chunk-nm7cm174.js +1 -0
  33. package/dist/{chunk-a31m4s8k.js → chunk-p6spv3yg.js} +1 -1
  34. package/dist/{chunk-w9gj8etn.js → chunk-qk0yyvgk.js} +3 -3
  35. package/dist/{chunk-wgv86d7e.js → chunk-tyvzbbwd.js} +1 -1
  36. package/dist/{chunk-r72e7yj0.js → chunk-xb5g8q82.js} +1 -1
  37. package/dist/{chunk-z2w3d9gy.js → chunk-yyp7awr7.js} +1 -1
  38. package/dist/{chunk-2jx9yez1.js → chunk-zqt0f9hc.js} +1 -1
  39. package/package.json +1 -1
  40. package/dist/chunk-khwmnyjg.js +0 -169
  41. package/dist/chunk-myg02cas.js +0 -1
  42. package/dist/chunk-nhnkbddn.js +0 -1
@@ -1,169 +0,0 @@
1
- import{e as q3,f as z3}from"./chunk-anjpwev3.js";import{i as OX,j as _X,k as NX}from"./chunk-y7wwx4jn.js";import{x as M8}from"./chunk-vsr1g5ke.js";import{$ as M9,F as NY,J as RX,L as h4,M as f4,N as ZY,T as l9,U as r9,Z as E$,aa as y9,ca as a9,ea as v2,fa as T3,ga as C3,ja as I3,ka as S3,oa as dJ,pa as DY,ra as kY,sa as fY,ta as TX,ua as V9,wa as j9,ya as FY}from"./chunk-w9gj8etn.js";import"./chunk-dabq8kdx.js";import{Ga as l6,Ha as r6,Ia as a6,La as yX}from"./chunk-gnvepc4p.js";import{Na as d9}from"./chunk-fpjhg6ce.js";import{Hb as c9,Qb as T4,ub as x9,vb as u9}from"./chunk-fwmym1zk.js";import{$b as E2}from"./chunk-sca5q3tt.js";import{Fd as C9,Gd as R4,Hd as I9,Jd as L8,Rd as f2,Ud as f0,ed as E9,td as b9,yd as P9}from"./chunk-863ynx9m.js";import"./chunk-q265drks.js";import"./chunk-7dykmcjj.js";import{xe as qX}from"./chunk-3jqd18d8.js";import{Be as n$,ye as h2,ze as y8}from"./chunk-v9bfzh20.js";import"./chunk-twdfyk78.js";import{Fe as t1,Ge as K$,He as R1,Ie as GJ,Je as H8,Ke as B9,Le as O6,Me as CJ,Ne as J3,Oe as _6,Pe as J2,Qe as Y$,Re as PX,Se as U$,Te as GX,Ue as Z4,Ve as V2,Ye as v9,df as a0}from"./chunk-szw16t85.js";import"./chunk-v508x7cg.js";import"./chunk-ye4wyq1k.js";import"./chunk-kpqdfn9z.js";import{tf as IJ}from"./chunk-b41den40.js";import"./chunk-8qp8v96d.js";import"./chunk-8myvrket.js";import{Ff as C8,If as x3,Nf as R3,Wf as MX}from"./chunk-e2b6d9mw.js";import"./chunk-0zzh482s.js";import"./chunk-adkpwx6c.js";import"./chunk-85bamng3.js";import{sg as OJ,ug as y$}from"./chunk-b1rqfaea.js";import"./chunk-2t6b962t.js";import{Bh as y3,Ch as bX,wh as AX}from"./chunk-88krdjg8.js";import"./chunk-kz15jy62.js";import"./chunk-9fgkg1vr.js";import{Lh as K2,Mh as w8,Oh as _J}from"./chunk-pykxe413.js";import{Th as X$}from"./chunk-kzzty3v5.js";import"./chunk-9jtjq50j.js";import{qi as BX,ti as y1}from"./chunk-w4xqaw4h.js";import{vi as K3,wi as U3,zi as Q1}from"./chunk-r6svhe3w.js";import"./chunk-a4dmw23t.js";import{Li as n6}from"./chunk-dw9wcrtp.js";import{Oi as cJ}from"./chunk-ncqagb27.js";import"./chunk-207s8tns.js";import{Zi as y4}from"./chunk-spxb931p.js";import{$i as zJ}from"./chunk-m7b779kd.js";import{useMemoizedFn as H4}from"ahooks";import{useEffect as IK,useState as W4}from"react";import{useMemoizedFn as t0}from"ahooks";import UX from"ansi-escapes";import{Box as W1,useStdout as bK}from"ink";import{useEffect as L1,useMemo as PK,useRef as t2,useState as MK}from"react";import{useShallow as IX}from"zustand/react/shallow";import{useStore as CX}from"zustand";function X0($){return CX(J2,$)}var SX=[],Y2=()=>X0(($)=>$.session.sessionId),o$=()=>X0(($)=>$.session.workspaceRoot),J8=()=>X0(($)=>$.session.messages),lJ=()=>X0(($)=>$.session.clearCount),rJ=()=>X0(($)=>$.session.isCompacting),aJ=()=>X0(($)=>$.session.tokenUsage.estimatedCostUsd),iJ=()=>X0(($)=>{let{totalInputTokens:J,cacheReadTokens:X,cacheWriteTokens:Y}=$.session.tokenUsage;return dJ({totalInputTokens:J,cacheReadTokens:X,cacheWriteTokens:Y}).hitRate}),oJ=()=>X0(($)=>$.session.providerCircuit),nJ=()=>X0(($)=>$.session.providerAdmission),tJ=()=>X0(($)=>$.session.providerRetry),sJ=()=>X0(($)=>$.session.providerStall),eJ=()=>X0(($)=>$.session.actionStationarity),P1=()=>X0(($)=>$.session.actions),$9=()=>X0(($)=>{let{totalTokens:J,maxContextTokens:X}=$.session.tokenUsage;if(X<=0)return 100;let Y=Math.max(0,100-J/X*100);return Math.round(Y)}),J9=()=>X0(($)=>$.app.initializationStatus),Y9=()=>X0(($)=>$.app.initializationError),Y8=()=>X0(($)=>$.app.activeModal),X9=()=>X0(($)=>$.app.tasks),Z9=()=>X0(($)=>$.app.modelEditorTarget),Q9=()=>X0(($)=>$.app.sessionSelectorData),K9=()=>X0(($)=>$.app.awaitingSecondCtrlC),M1=()=>X0(($)=>$.app.actions),X8=()=>X0(($)=>$.app.sideConversation),U9=()=>X0(($)=>$.app.teams),Z8=()=>X0(($)=>$.app.initializationStatus==="ready"),G9=()=>X0(($)=>$.app.tasks.length>0),X2=()=>X0(($)=>$.config.config?.permissionMode||"default"),q9=()=>X0(($)=>$.config.config?.models??SX),Q8=()=>X0(($)=>{let J=$.config.config;if(!J)return;let X=J.currentModelId;return J.models.find((Z)=>Z.id===X)??J.models[0]}),K8=()=>X0(($)=>$.config.config?.currentModelId),z9=()=>X0(($)=>$.config.config?.agentTeamsEnabled===!0),P0=()=>X0(($)=>{return K$.getTheme()}),O9=()=>X0(($)=>$.config.config?.codeTheme??"default"),r0=()=>X0(($)=>$.focus.currentFocus),_9=()=>X0(($)=>$.focus.actions),Z2=()=>X0(($)=>$.command.isProcessing),N9=()=>X0(($)=>$.command.actions),Q2=()=>X0(($)=>$.command.pendingCommands),F9=()=>X0(($)=>$.command.recoveredSteeringCount),U8=()=>X0(($)=>$.app.reasoningEffort!=="off"),G8=()=>X0(($)=>$.app.reasoningEffort),q8=()=>X0(($)=>$.app.serviceTier),z8=()=>X0(($)=>$.app.responseVerbosity),O8=()=>X0(($)=>$.app.communicationStyle),_8=()=>X0(($)=>$.session.currentThinkingContent),H9=()=>X0(($)=>$.session.thinkingExpanded),N8=()=>X0(($)=>$.session.currentStreamingMessageId),F8=()=>X0(IX(($)=>({lines:$.session.currentStreamingLines,tail:$.session.currentStreamingTail,lineCount:$.session.currentStreamingLineCount,version:$.session.currentStreamingVersion}))),W9=()=>X0(($)=>$.session.finalizingStreamingMessageId),L9=()=>X0(($)=>$.session.historyExpanded),w9=()=>X0(($)=>$.session.expandedMessageCount);import{useMemoizedFn as Z1}from"ahooks";import{useEffect as g1,useMemo as tX,useRef as T8}from"react";class L4{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 S2{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)H8(J,$.extraContent);B9(J)}this.options.finalizeStreamingMessage($.extraContent,$.extraThinking)}}function kX($){if(!($ instanceof Error))return"未知错误";let Y=$.lastError??$;if(Y.responseBody)try{let K=JSON.parse(Y.responseBody)?.error?.message;if(K){let U=Y.statusCode?` (HTTP ${Y.statusCode})`:"";return`${K}${U}`}}catch{}let Z=$.message.match(/Last error:\s*(.+)$/);if(Z)return Z[1];return $.message}function fX($){if(!($ instanceof Error))return!1;return $.name==="AbortError"||$.message.includes("aborted")}function vX($){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 W8($){let J=fX($),X=vX($),Y;if(X)Y="当前模型不支持图片理解功能。请切换到支持视觉能力的模型(如 Claude 4.5、GPT-5.2、Gemini 3 Pro、Qwen3-VL-Plus 等)后重试。";else Y=kX($);return{displayMessage:Y,isAbort:J,isVisionNotSupported:X}}import{appendFileSync as DX,mkdirSync as VX,writeFileSync as jX}from"node:fs";import EX from"node:os";import w4 from"node:path";var A9=null;function hX(){let $=process.env.BLADE_STORAGE_ROOT||w4.join(EX.homedir(),".blade");return w4.join($,"logs","stream-debug.log")}function gX($){if(A9===$)return;let J=w4.dirname($);VX(J,{recursive:!0,mode:493}),jX($,`=== Stream Debug Log Started: ${new Date().toISOString()} ===
2
- `),A9=$}function B4($,J,X){try{let Y=hX();gX(Y);let Z=new Date().toISOString(),Q=X?` | ${JSON.stringify(X)}`:"",K=`[${Z}] [${$}] ${J}${Q}
3
- `;DX(Y,K)}catch{}}var k2=y1("UI");function b4($,J){if(J.state==="requires_attention"){let X=J.reason==="interrupted_tool_call";$.addToolMessage("Turn recovery requires attention",{toolName:"Runtime Recovery",phase:"complete",summary:X?"An interrupted tool may have partially completed":"A completed tool may already have changed external state",detail:`${J.turnId} · inspect workspace, processes, and external state before retrying`});return}$.addToolMessage(J.state==="completed"?"Recovered completed turn":"Resuming interrupted turn",{toolName:"Runtime Recovery",phase:"complete",summary:J.state==="completed"?"The durable final response was recovered":"No tool execution was recorded before interruption",detail:J.turnId})}function R9($,J){let X=$.streamSession??new S2({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(!X.acceptsDeltas())break;J.contentDeltaCount++,J.contentDeltaTotalLen+=Y.delta.length,B4("loopEventHandler","onContentDelta",{callCount:J.contentDeltaCount,deltaLen:Y.delta.length,totalLen:J.contentDeltaTotalLen}),$.streamingBuffer.batchAppendContent(Y.delta);break;case"thinking_delta":if(!X.acceptsDeltas())break;if($.thinkingModeEnabled)$.streamingBuffer.batchAppendThinking(Y.delta);break;case"stream_end":{$.sessionActions.setProviderCircuit(null),$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),k2.debug("[loopEventHandler] stream_end",{contentDeltaCount:J.contentDeltaCount,contentDeltaTotalLen:J.contentDeltaTotalLen,streamFinalized:X.isFinalized,signalAborted:$.signal.aborted}),B4("loopEventHandler","onStreamEnd",{contentDeltaCallCount:J.contentDeltaCount,contentDeltaTotalLen:J.contentDeltaTotalLen,streamFinalized:X.isFinalized,signalAborted:$.signal.aborted}),X.finalize();break}case"model_fallback":$.sessionActions.setProviderAdmission(null),$.sessionActions.setProviderCircuit(null),$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),X.discard();break;case"provider_admission":{let{kind:Z,...Q}=Y;$.sessionActions.setProviderAdmission(Y.phase==="queued"?Q:null);break}case"provider_circuit":{let{kind:Z,...Q}=Y;$.sessionActions.setProviderCircuit(Y.phase==="closed"?null:Q);break}case"provider_retry":{let{kind:Z,...Q}=Y;$.sessionActions.setProviderRetry(Y.phase==="recovered"?null:Q);break}case"provider_stall":{let{kind:Z,...Q}=Y;$.sessionActions.setProviderStall(Y.phase==="detected"?Q:null);break}case"action_stationarity":{let{kind:Z,...Q}=Y;$.sessionActions.setActionStationarity(Y.phase==="recovered"?null:Q);break}case"turn_recovery":{b4($.sessionActions,Y.assessment);break}case"tool_start":{let Z=Y.toolCall;if(!("function"in Z))break;if(Z.function.name===L8)break;if(k2.debug("[loopEventHandler] tool_start",{toolName:Z.function.name,toolKind:Y.toolKind}),["TaskCreate","TaskUpdate","TaskList"].includes(Z.function.name))break;try{let Q=JSON.parse(Z.function.arguments),K=M9(Z.function.name,Q);$.sessionActions.addToolMessage(K,{toolCallId:Z.id,toolName:Z.function.name,phase:"start",summary:K,params:Q})}catch(Q){k2.error("[loopEventHandler] onToolStart error:",Q)}break}case"tool_progress":{let Z=Y.toolCall;if(!("function"in Z))break;if(Z.function.name===L8)break;let Q=Y.update.total!==void 0?` ${Math.max(0,Math.min(100,Math.round((Y.update.progress??0)/Y.update.total*100)))}%`:"",K=`${Z.function.name}${Q}: ${Y.update.message}`;$.sessionActions.addToolMessage(K,{toolCallId:Z.id,toolName:Z.function.name,phase:"progress",summary:K,...Y.update.admission?{admission:Y.update.admission}:{}});break}case"tool_result":{let Z=Y.toolCall;if(!("function"in Z))break;if(Z.function.name===L8)break;k2.debug("[loopEventHandler] tool_result",{toolName:Z.function.name,success:Y.result.success});let Q=P9(y9(Z.function.name,Y.result),b9);$.sessionActions.addToolMessage(Q.summary,{toolCallId:Z.id,toolName:Z.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":k2.debug("[loopEventHandler] turn_start",{turn:Y.turn,maxTurns:Y.maxTurns}),$.sessionActions.updateTokenUsage({turnCount:Y.turn}),$.sessionActions.setProviderCircuit(null),$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),X.startTurn();break;case"task_update":$.appActions.setTasks(Y.tasks);break;case"goal_frontier_updated":$.appActions.setTasks(Y.tasks);break;case"mcp_catalog_changed":{let Z=`MCP catalog r${Y.revision}: +${Y.added.length} -${Y.removed.length} ~${Y.updated.length}`;$.sessionActions.addToolMessage(Z,{toolName:"MCP Catalog",phase:"complete",summary:Z,detail:[Y.added.length>0?`Added: ${Y.added.join(", ")}`:"",Y.removed.length>0?`Removed: ${Y.removed.join(", ")}`:"",Y.updated.length>0?`Updated: ${Y.updated.join(", ")}`:""].filter(Boolean).join(`
4
- `)});break}case"mcp_content_changed":{let Z=`MCP ${Y.contentKind} r${Y.revision}: +${Y.added.length} -${Y.removed.length} ~${Y.updated.length}`;$.sessionActions.addToolMessage(Z,{toolName:"MCP Content",phase:"complete",summary:Z,detail:[Y.added.length>0?`Added: ${Y.added.join(", ")}`:"",Y.removed.length>0?`Removed: ${Y.removed.join(", ")}`:"",Y.updated.length>0?`Updated: ${Y.updated.join(", ")}`:""].filter(Boolean).join(`
5
- `)});break}case"mcp_resource_updated":{let Z=`MCP resource updated: ${Y.uri}`;$.sessionActions.addToolMessage(Z,{toolName:"MCP Resource",phase:"progress",summary:Z,detail:`${Y.serverName} · revision ${Y.revision}`});break}case"mcp_connection_changed":{let Z=Y.phase==="reconnecting"?"recovering":Y.phase==="recovered"?"recovered":"recovery failed",Q=`MCP ${Y.serverName} ${Z}`+(Y.phase==="reconnecting"?` (${Y.attempt}/${Y.maxAttempts})`:"");$.sessionActions.addToolMessage(Q,{toolName:"MCP Connection",phase:"complete",summary:Q,detail:[`reason: ${Y.reason}`,`revision: ${Y.revision}`,Y.error?`error: ${Y.error}`:""].filter(Boolean).join(`
6
- `)});break}case"mcp_log":{let Z=Y.logger?`${Y.serverName} · ${Y.logger}`:Y.serverName,Q=`MCP ${Y.level} · ${Z}`;$.sessionActions.addToolMessage(Q,{toolName:"MCP Log",phase:"complete",summary:Q,detail:[Y.message,`revision: ${Y.revision}`,`sha256: ${Y.dataSha256}`,Y.truncated?"truncated: true":"",Y.detailsOmitted?"details omitted by runtime policy":""].filter(Boolean).join(`
7
- `)});break}case"mcp_instructions_changed":{let Z=`MCP instructions ${Y.action}: ${Y.serverName}`+(Y.truncated?" (truncated)":"");$.sessionActions.addToolMessage(Z,{toolName:"MCP Instructions",phase:"complete",summary:Z,detail:[Y.text??"",Y.sha256?`sha256: ${Y.sha256}`:"",Y.detailsOmitted?"details omitted by runtime policy":""].filter(Boolean).join(`
8
- `)});break}case"mcp_task_changed":{let Z=`MCP task ${Y.status}: ${Y.taskId} (${Y.serverName}/${Y.toolName})`;$.sessionActions.addToolMessage(Z,{toolName:"MCP Task",phase:"complete",summary:Z,detail:[Y.statusMessage??"",`revision: ${Y.revision}`,Y.hasResult?"result available via TaskOutput":"",Y.error?`error: ${Y.error}`:""].filter(Boolean).join(`
9
- `)});break}case"project_rules_loaded":{let Z=`Project rules loaded: ${Y.files.length}`+(Y.blockedWrite?" (write retry required)":"");$.sessionActions.addToolMessage(Z,{toolName:"Project Rules",phase:"complete",summary:Z,detail:Y.files.map((Q)=>`${Q.relativePath} ${Q.source} sha256=${Q.contentSha256}`).join(`
10
- `)});break}case"steering_applied":for(let Z=0;Z<Y.count;Z++)$.commandActions.dequeueCommand();if(Y.recovered>0)$.commandActions.setRecoveredSteeringCount(Y.recovered);break;case"follow_up_started":for(let Z of Y.messages){if(!Z.recovered||Z.persisted)continue;let Q=typeof Z.content==="string"?Z.content:Z.content.map((K)=>K.type==="text"?K.text:"[Image]").join(`
11
- `);$.sessionActions.addUserMessage(Q)}if(Y.recovered>0)$.commandActions.setRecoveredSteeringCount(Y.recovered);break;case"goal_updated":case"goal_continuation_started":break;case"subagent_spawned":case"subagent_completed":break;default:{let Z=Y}}}}function P4($){let{text:J,parts:X}=$,Y=X.filter((K)=>K.type==="image");if(Y.length===0)return J;if(Y.length>K2)throw Error(`最多只能发送 ${K2} 张图片`);if(Y.reduce((K,U)=>K+`data:${U.mimeType};base64,`.length+U.base64.length,0)>w8)throw Error("图片编码后总大小不能超过 5 MiB");let Q=[];for(let K of X)if(K.type==="text")Q.push({type:"text",text:K.text});else Q.push({type:"image_url",image_url:{url:`data:${K.mimeType};base64,${K.base64}`}});return Q}function T9($){let J=I9($.metadata);return{role:$.role,content:J?C9(J):$.content,...$.metadata?{metadata:$.metadata}:{}}}function B8($){if(!$.restoredContextMessages||$.restoredVisibleMessageCount<=0)return $.messages.map(T9);let J=$.messages.slice($.restoredVisibleMessageCount).map(T9);return[...$.restoredContextMessages,...J]}import mX from"node:path";function S9($){if($.length<=8)return $;return`${$.slice(0,8)}…`}function pX($){return mX.resolve($)}function k9($){if(!$||!v9($))return;Y$().config.actions.updateConfig({currentModelId:$})}function f9($){if(!$)return;Y$().config.actions.updateConfig({permissionMode:$})}async function A8($,J){return f0.listSessions({includeSubagents:!1})}async function b8($,J,X,Y){let{intent:Z,session:Q,newSessionId:K,announceFork:U,permissionModeOverride:G}=$,q=pX(Q.projectPath);if(Z==="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(U!==!1){let B=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(B)?0:B})}return await Y(),f9(G??W.metadata.permissionMode),k9(W.metadata.selectedModelId),X.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(G??Q.permissionMode),k9(Q.selectedModelId),X.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 xX($){return typeof $==="object"&&$!==null&&$.action==="invoke_skill"&&typeof $.skillName==="string"}function uX($){return typeof $==="object"&&$!==null&&$.action==="invoke_custom_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function cX($){return typeof $==="object"&&$!==null&&$.action==="invoke_plugin_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function dX($){return typeof $==="object"&&$!==null&&$.action==="invoke_once_model"&&typeof $.modelId==="string"&&typeof $.prompt==="string"}function lX($){return typeof $==="object"&&$!==null&&["start_goal","resume_goal"].includes(String($.action))&&typeof $.goal?.objective==="string"}function rX($){return typeof $==="object"&&$!==null&&$.action==="rewind_session"&&typeof $.sessionId==="string"&&Array.isArray($.messages)&&Array.isArray($.visibleMessages)}function aX($){if(typeof $!=="object"||$===null)return!1;let J=$.intent;if(J!=="resume"&&J!=="fork")return!1;let X=$.action;if(X==="select_session"){let Y=$.sessions;return Array.isArray(Y)&&Y.every((Z)=>D9(Z))}if(X==="activate_session")return D9($.session);return!1}function iX($,J,X,Y){switch($){case"show_theme_selector":return X.setActiveModal("themeSelector"),!0;case"show_model_selector":return X.setActiveModal("modelSelector"),!0;case"show_model_add_wizard":return X.setActiveModal("modelAddWizard"),!0;case"show_permissions_manager":return X.setActiveModal("permissionsManager"),!0;case"show_agents_manager":return X.setActiveModal("agentsManager"),!0;case"show_skills_manager":return X.setActiveModal("skillsManager"),!0;case"show_hooks_manager":return X.setActiveModal("hooksManager"),!0;case"show_plugins_manager":return X.setActiveModal("pluginsManager"),!0;case"show_agent_creation_wizard":return X.setActiveModal("agentCreationWizard"),!0;case"show_session_selector":{let Z=J?.sessions;return X.showSessionSelector(Z??[],"resume"),!0}case"session_forked":{let Z=J;if(Z?.action!=="restore_forked_session"||!Z.sessionId||!Array.isArray(Z.messages)||!Array.isArray(Z.visibleMessages))return!1;return Y.restoreSession(Z.sessionId,Z.visibleMessages,Z.messages),!0}case"session_archived":{let Z=J?.session;return Y.addAssistantMessage(Z?`会话 ${Z.sessionId} 已归档。`:"当前会话已归档。"),n$(0),!0}case"clear_screen":return Y.clearMessages(),Y.setError(null),Y.resetTokenUsage(),X.setTasks([]),!0;case"compact_completed":case"compact_fallback":{let Z=J,Q=Z?.compactedMessages;if(Q)Y.setCompactedContext(Q);if(Z?.usage)Y.updateTokenUsage({inputTokens:Z.usage.promptTokens,outputTokens:Z.usage.completionTokens,totalTokens:Z.usage.totalTokens,maxContextTokens:Z.maxContextTokens,cacheReadTokens:Z.usage.cacheReadInputTokens??0,cacheWriteTokens:Z.usage.cacheCreationInputTokens??0,costUsd:Z.usage.costUsd});return Y.resetContextUsage(),!0}case"exit_application":return n$(0),!0;default:return!1}}async function M4($,J,X,Y,Z,Q,K,U,G,q,O,z,_,W,L=X$(),N){let{text:B}=$;if(!V9(B))return{type:"not_slash"};let F=await j9(B,{cwd:L,surface:"tui",workspaceRoot:L,sessionId:Q,messages:K,rewind:U,lifecycle:Q===void 0?void 0:{archiveCurrent:async()=>{return await Z(),f0.archiveSession(Q,L)}},subagents:G,mcp:q,reasoning:O,serviceTier:z,responseVerbosity:_,communicationStyle:W,codeReview:N,signal:Y});if(F.success&&aX(F.data)){if(F.data.action==="select_session")return J.showSessionSelector(F.data.sessions,F.data.intent),{type:"handled",commandResult:{success:!0}};return await b8(F.data,L,X,Z),{type:"handled",commandResult:{success:!0}}}if(F.success&&rX(F.data))return X.restoreSession(F.data.sessionId,F.data.visibleMessages,F.data.messages),J.setTasks([]),{type:"handled",commandResult:{success:!0}};if(F.message){if(iX(F.message,F.data,J,X))return{type:"handled",commandResult:{success:!0}}}if(xX(F.data)){let{skillName:y,skillArgs:b}=F.data,A=b?`Please use the "${y}" skill to help me with: ${b}`:`Please use the "${y}" skill.`;return X.addUserMessage(A),{type:"continue_as_agent",result:{userDisplayMessage:A,agentInput:{displayText:A,text:A,images:[],parts:[{type:"text",text:A}]},userMessageAlreadyAdded:!0}}}if(uX(F.data)){let{commandName:y,processedContent:b}=F.data;X.addUserMessage(B);let A=`# Custom Command: /${y}
12
-
13
- The user has invoked the custom command "/${y}". Follow the instructions below to complete the task.
14
-
15
- ---
16
-
17
- ${b}
18
-
19
- ---
20
-
21
- Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:B,agentInput:{displayText:B,text:A,images:[],parts:[{type:"text",text:A}]},userMessageAlreadyAdded:!0}}}if(cX(F.data)){let{commandName:y,pluginName:b,processedContent:A}=F.data;X.addUserMessage(B);let P=`# Plugin Command: /${y}
22
-
23
- The user has invoked the plugin command "/${y}" from plugin "${b}". Follow the instructions below to complete the task.
24
-
25
- ---
26
-
27
- ${A}
28
-
29
- ---
30
-
31
- Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:B,agentInput:{displayText:B,text:P,images:[],parts:[{type:"text",text:P}]},userMessageAlreadyAdded:!0}}}if(dX(F.data)){let{modelId:y,prompt:b}=F.data;return X.addUserMessage(b),{type:"continue_as_agent",result:{userDisplayMessage:b,agentInput:{displayText:b,text:b,images:[],parts:[{type:"text",text:b}]},userMessageAlreadyAdded:!0,onceModelId:y}}}if(lX(F.data)){let y=F.data.goal.objective;return X.addUserMessage(B),{type:"continue_as_agent",result:{userDisplayMessage:B,agentInput:{displayText:B,text:y,images:[],parts:[{type:"text",text:y}]},userMessageAlreadyAdded:!0,goalContinuationOnly:!0}}}if(!F.success&&F.error)return X.addAssistantMessage(`${F.error}`),{type:"handled",commandResult:{success:F.success,output:F.message,error:F.error,metadata:F.data}};let S=F.message;if(F.success&&typeof S==="string"&&S.trim()!=="")X.addAssistantMessage(S);return{type:"handled",commandResult:{success:F.success,output:F.message,error:F.error,metadata:F.data}}}import{useMemoizedFn as S0}from"ahooks";import{useEffect as oX,useRef as P8}from"react";function h9($){let J=P8(void 0),X=P8(void 0),Y=P8(void 0),Z=P8(void 0),Q=S0(async()=>{if(Z.current)return Z.current;let H=J.current,R=X.current;if(!H&&!R)return;J.current=void 0,X.current=void 0,Y.current=void 0;let v=(async()=>{try{await H?.destroy()}finally{await R?.dispose()}})();Z.current=v;try{await v}finally{if(Z.current===v)Z.current=void 0}}),K=S0(async(H)=>{let R=$.workspaceRoot??X.current?.workspaceRoot??X$();if(X.current&&(X.current.sessionId!==H||X.current.workspaceRoot!==R))await Q();if(!X.current){let v=await f0.findSessionMetadata(H,R),D=v!==void 0&&(await f0.loadSession(H,R)).length>0;X.current=await E$.create({sessionId:H,workspaceRoot:R,modelId:$.modelId,permissionMode:$.permissionMode??v?.permissionMode,reasoningEffort:v?.reasoningEffort??$.reasoningEffort,serviceTier:v?.serviceTier??$.serviceTier,responseVerbosity:v?.responseVerbosity??$.responseVerbosity,communicationStyle:v?.communicationStyle??$.communicationStyle,communicationStyleDigest:v?.communicationStyleDigest,agents:$.agents,...D?{sessionStart:{isResume:!0,resumeSessionId:H}}:{}});try{Y.current={sessionId:H,modelId:v?.selectedModelId,permissionMode:v?.permissionMode,reasoningEffort:v?.reasoningEffort,serviceTier:v?.serviceTier,responseVerbosity:v?.responseVerbosity,communicationStyle:v?.communicationStyle,communicationStyleDigest:v?.communicationStyleDigest},U$().setReasoningEffort(X.current.getReasoningConfiguration().selection),U$().setServiceTier(X.current.getServiceTierConfiguration().selection),U$().setResponseVerbosity(X.current.getResponseVerbosityConfiguration().selection),U$().setCommunicationStyle(X.current.getCommunicationStyleConfiguration().selection)}catch(C){let x=X.current;throw X.current=void 0,await x.dispose().catch(()=>{return}),C}}return X.current}),U=S0(async(H)=>{let R=H?.sessionId??$.sessionId,v=!!H?.modelId&&H.modelId!==$.modelId,D;if(!v&&R){let C=X.current!==void 0,x=await K(R),d=H?.modelId??$.modelId,t=H?.reasoningEffort??(C?$.reasoningEffort:x.getReasoningConfiguration().selection),Q0=H?.serviceTier??(C?$.serviceTier:x.getServiceTierConfiguration().selection),w0=H?.responseVerbosity??(C?$.responseVerbosity:x.getResponseVerbosityConfiguration().selection),p0=H?.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:d,...t?{reasoningEffort:t}:{},...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$={...d&&d!=="inherit"&&(Y.current?.sessionId!==R||Y.current.modelId!==d)?{selectedModelId:d}:{},...t&&(Y.current?.sessionId!==R||Y.current.reasoningEffort!==t)?{reasoningEffort:t}:{},...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}D=await v2.createWithRuntime(x,{sessionId:R,systemPrompt:H?.systemPrompt??$.systemPrompt,appendSystemPrompt:H?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:H?.maxTurns??$.maxTurns,modelId:H?.modelId??$.modelId,permissionMode:H?.permissionMode??$.permissionMode,agents:$.agents})}else D=await v2.create({systemPrompt:H?.systemPrompt??$.systemPrompt,appendSystemPrompt:H?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:H?.maxTurns??$.maxTurns,modelId:H?.modelId??$.modelId,permissionMode:H?.permissionMode??$.permissionMode,agents:$.agents});return J.current=D,D}),G=S0(async()=>{if(!$.sessionId)throw Error("No active session to rewind");return(await K($.sessionId)).listRewindCheckpoints()}),q=S0(async(H)=>{if(!$.sessionId)throw Error("No active session to rewind");let v=await(await K($.sessionId)).rewindSession(H);return await Q(),v}),O=S0(async()=>{if(!$.sessionId)throw Error("No active session for subagent control");return(await K($.sessionId)).listSubagents()}),z=S0(async(H,R)=>{if(!$.sessionId)throw Error("No active session for subagent control");let v=await K($.sessionId),D=!1,C,x=H,d=(Q0)=>{let w0=Q0.status==="completed"?Q0.result?.message:Q0.result?.error||Q0.result?.message;J2.getState().app.actions.completeSubagentProgress(x,Q0.status==="completed",w0)},t=v.resumeSubagent({agentId:H,prompt:R,onEvent:(Q0)=>{if(Q0.kind==="tool_start"&&"function"in Q0.toolCall)J2.getState().app.actions.updateSubagentTool(x,Q0.toolCall.function.name)},onCompleted:(Q0)=>{if(D)d(Q0);else C=Q0}});if(x=t.session.id,J2.getState().app.actions.startSubagentProgress(t.session.id,t.session.subagentType,`Resumed from ${t.source.id}: ${t.session.description}`),D=!0,C)d(C);return t}),_=S0(async()=>{if(!$.sessionId)throw Error("No active session for MCP content");return(await K($.sessionId)).getMcpContentCatalog()}),W=S0(async(H)=>{if(!$.sessionId)throw Error("No active session for MCP content");await(await K($.sessionId)).refreshMcpContentCatalogs(H)}),L=S0(async(H,R,v)=>{if(!$.sessionId)throw Error("No active session for MCP prompts");return(await K($.sessionId)).getMcpPrompt(H,R,v)}),N=S0(async(H,R,v)=>{if(!$.sessionId)throw Error("No active session for MCP completion");return(await K($.sessionId)).completeMcpArgument(H,R,v)}),B=S0(async(H,R={})=>{if(!$.sessionId)throw Error("No active session for MCP logs");return(await K($.sessionId)).getMcpLogs(H,R)}),I=S0(async(H)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await K($.sessionId)).listMcpTasks(H)}),F=S0(async(H)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await K($.sessionId)).getMcpTask(H)}),S=S0(async(H,R)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await K($.sessionId)).cancelMcpTask(H,R)}),y=S0(async(H,R)=>{if(!$.sessionId)throw Error("No active session for MCP logging");await(await K($.sessionId)).setMcpLoggingLevel(H,R)}),b=S0(async()=>{if(!$.sessionId)throw Error("No active session for MCP instructions");return(await K($.sessionId)).getMcpInstructions()}),A=S0(async()=>{if(!$.sessionId)throw Error("No active session for reasoning effort");return(await K($.sessionId)).getReasoningConfiguration()}),P=S0(async(H)=>{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 v=R.getReasoningConfiguration();if(R.resolveReasoningConfiguration(H),v.selection===H)return v;await R.refresh({reasoningEffort:H});try{let D;try{D=await f0.updateSessionMetadata($.sessionId,R.workspaceRoot,{reasoningEffort:H})}catch(C){if(!(C instanceof f2)&&C.code!=="ENOENT")throw C;D=await f0.createSessionMetadata($.sessionId,R.workspaceRoot,{taskStatus:"completed",selectedModelId:R.getCurrentModelId(),reasoningEffort:H,serviceTier:R.getServiceTierConfiguration().selection,responseVerbosity:R.getResponseVerbosityConfiguration().selection,communicationStyle:R.getCommunicationStyleConfiguration().selection})}return Y.current={sessionId:$.sessionId,modelId:D.selectedModelId,permissionMode:D.permissionMode,reasoningEffort:D.reasoningEffort,serviceTier:D.serviceTier,responseVerbosity:D.responseVerbosity,communicationStyle:D.communicationStyle,communicationStyleDigest:D.communicationStyleDigest},U$().setReasoningEffort(H),R.getReasoningConfiguration()}catch(D){throw await R.refresh({reasoningEffort:v.selection}),D}}),w=S0(async()=>{if(!$.sessionId)throw Error("No active session for service tier");return(await K($.sessionId)).getServiceTierConfiguration()}),V=S0(async(H)=>{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 v=R.getServiceTierConfiguration();if(R.resolveServiceTierConfiguration(H),v.selection===H)return v;await R.refresh({serviceTier:H});try{let D;try{D=await f0.updateSessionMetadata($.sessionId,R.workspaceRoot,{serviceTier:H})}catch(C){if(!(C instanceof f2)&&C.code!=="ENOENT")throw C;D=await f0.createSessionMetadata($.sessionId,R.workspaceRoot,{taskStatus:"completed",selectedModelId:R.getCurrentModelId(),reasoningEffort:R.getReasoningConfiguration().selection,serviceTier:H,responseVerbosity:R.getResponseVerbosityConfiguration().selection,communicationStyle:R.getCommunicationStyleConfiguration().selection})}return Y.current={sessionId:$.sessionId,modelId:D.selectedModelId,permissionMode:D.permissionMode,reasoningEffort:D.reasoningEffort,serviceTier:D.serviceTier,responseVerbosity:D.responseVerbosity,communicationStyle:D.communicationStyle,communicationStyleDigest:D.communicationStyleDigest},U$().setServiceTier(H),R.getServiceTierConfiguration()}catch(D){throw await R.refresh({serviceTier:v.selection}),D}}),T=S0(async()=>{if(!$.sessionId)throw Error("No active session for response verbosity");return(await K($.sessionId)).getResponseVerbosityConfiguration()}),k=S0(async(H)=>{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 v=R.getResponseVerbosityConfiguration();if(R.resolveResponseVerbosityConfiguration(H),v.selection===H)return v;await R.refresh({responseVerbosity:H});try{let D;try{D=await f0.updateSessionMetadata($.sessionId,R.workspaceRoot,{responseVerbosity:H})}catch(C){if(!(C instanceof f2)&&C.code!=="ENOENT")throw C;D=await f0.createSessionMetadata($.sessionId,R.workspaceRoot,{taskStatus:"completed",selectedModelId:R.getCurrentModelId(),reasoningEffort:R.getReasoningConfiguration().selection,serviceTier:R.getServiceTierConfiguration().selection,responseVerbosity:H,communicationStyle:R.getCommunicationStyleConfiguration().selection})}return Y.current={sessionId:$.sessionId,modelId:D.selectedModelId,permissionMode:D.permissionMode,reasoningEffort:D.reasoningEffort,serviceTier:D.serviceTier,responseVerbosity:D.responseVerbosity,communicationStyle:D.communicationStyle,communicationStyleDigest:D.communicationStyleDigest},U$().setResponseVerbosity(H),R.getResponseVerbosityConfiguration()}catch(D){throw await R.refresh({responseVerbosity:v.selection}),D}}),M=S0(async()=>{if(!$.sessionId)throw Error("No active session for communication style");return(await K($.sessionId)).getCommunicationStyleConfiguration()}),j=S0(async(H)=>{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 v=R.getCommunicationStyleConfiguration(),D=R.resolveCommunicationStyleConfiguration(H);if(D.source!=="built-in"&&!D.contentSha256)throw Error("Custom communication style has no provenance");if(v.selection===H)return v;await R.refresh({communicationStyle:H});try{let C;try{C=await f0.updateSessionMetadata($.sessionId,R.workspaceRoot,{communicationStyle:H,communicationStyleDigest:D.source==="built-in"?null:D.contentSha256})}catch(x){if(!(x instanceof f2)&&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:H,...D.source!=="built-in"&&D.contentSha256?{communicationStyleDigest:D.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},U$().setCommunicationStyle(H),R.getCommunicationStyleConfiguration()}catch(C){throw await R.refresh({communicationStyle:v.selection}),C}}),i=S0(async(H)=>{if(!X.current)return{accepted:!1,queued:0,reason:"no_active_turn"};return X.current.enqueueSteering(H,{allowBeforeTurn:!0})}),n=S0(async(H,R)=>{let v=$.sessionId;if(!v)return{accepted:!1,queued:0,reason:"no_active_turn"};return(await K(v)).enqueueSteering(H,{allowBeforeTurn:!0,...R})}),c=S0(async(H,R)=>{let v=$.sessionId;if(!v)throw Error("Side conversation requires a Session");return(await K(v)).askSideQuestion(H,{signal:R,systemPrompt:$.systemPrompt,appendSystemPrompt:$.appendSystemPrompt})}),U0=S0(async(H,R)=>{let v=$.sessionId;if(!v)throw Error("User shell command requires a Session");return(await K(v)).executeUserShellCommand(H,R)}),m=S0(()=>X.current?.getTurnRecoveryAssessment()??{state:"none"}),o=S0(async(H,R)=>{let v=$.sessionId;if(!v)throw Error("Code review requires a Session");let D=await K(v);await M8.recoverInterrupted(D.workspaceRoot,v,D);let C=await M8.start({sessionId:v,projectPath:D.workspaceRoot,runtime:D,request:H,signal:R}),x=await C.completion,d=(await M8.list(D.workspaceRoot,v)).find((t)=>t.start.reviewId===C.reviewId);if(!d)throw Error(`Review not found after completion: ${C.reviewId}`);return{reviewId:C.reviewId,status:x.status,findings:x.findings.length,content:E9(d.start,x)}});return oX(()=>{let H=y8(Q);return()=>{H(),Q().catch(()=>{return})}},[Q]),{agentRef:J,createAgent:U,cleanupAgent:Q,steerActiveTurn:i,enqueueSessionInput:n,askSideQuestion:c,runCodeReview:o,executeUserShellCommand:U0,getTurnRecoveryAssessment:m,listRewindCheckpoints:G,rewindSession:q,listSubagents:O,resumeSubagent:z,getMcpContentCatalog:_,refreshMcpContentCatalogs:W,getMcpPrompt:L,completeMcpArgument:N,listMcpTasks:I,getMcpTask:F,cancelMcpTask:S,getMcpLogs:B,setMcpLoggingLevel:y,getMcpInstructions:b,getReasoningConfiguration:A,setReasoningEffort:P,getServiceTierConfiguration:w,setServiceTier:V,getResponseVerbosityConfiguration:T,setResponseVerbosity:k,getCommunicationStyleConfiguration:M,setCommunicationStyle:j}}import{useMemoizedFn as U2}from"ahooks";import{useEffect as nX,useRef as R8}from"react";function g9($){let J=0;for(let X of $)if(X===`
32
- `)J++;return J}function m9($,J){let X=J?.flushTimeout??300,Y=J?.minLinesToFlush??5,Z=J?.minCharsToFlush??400,Q=R8(""),K=R8(null),U=R8(""),G=R8(null),q=U2(()=>{if(Q.current){let N=Q.current,B=$.appendAssistantContent(N);H8(B,N),Q.current=""}if(K.current)clearTimeout(K.current),K.current=null}),O=U2(()=>{if(U.current)$.appendThinkingContent(U.current),U.current="";if(G.current)clearTimeout(G.current),G.current=null}),z=U2((N)=>{Q.current+=N;let B=Q.current;if(g9(B)>=Y||B.length>=Z){q();return}if(!K.current)K.current=setTimeout(q,X)}),_=U2((N)=>{U.current+=N;let B=U.current;if(g9(B)>=Y||B.length>=Z){O();return}if(!G.current)G.current=setTimeout(O,X)}),W=U2(()=>{if(Q.current="",K.current)clearTimeout(K.current),K.current=null;if(U.current="",G.current)clearTimeout(G.current),G.current=null}),L=U2(()=>{if(K.current)clearTimeout(K.current),K.current=null;if(G.current)clearTimeout(G.current),G.current=null;let N=Q.current,B=U.current;return Q.current="",U.current="",{extraContent:N,extraThinking:B}});return nX(()=>{return()=>{W()}},[W]),{batchAppendContent:z,batchAppendThinking:_,flushContentBuffer:q,flushThinkingBuffer:O,resetStreamingBuffers:W,drainPendingBuffers:L}}var D2=y1("UI");function p9($){return $.error?.type==="canceled"||$.error?.type==="aborted"||$.metadata?.abortReason==="interrupt"}var i9=($,J,X,Y,Z,Q)=>{let K=Z2(),U=Y2(),G=o$(),q=K8(),O=X2(),z=U8(),_=G8(),W=q8(),L=z8(),N=O8(),B=X8(),I=z9(),F=P1(),S=M1(),y=N9(),b=T8(!1),A=T8(null),P=T8(null),w=T8(null),{createAgent:V,cleanupAgent:T,steerActiveTurn:k,enqueueSessionInput:M,listRewindCheckpoints:j,rewindSession:i,listSubagents:n,resumeSubagent:c,getMcpContentCatalog:U0,refreshMcpContentCatalogs:m,getMcpPrompt:o,completeMcpArgument:H,listMcpTasks:R,getMcpTask:v,cancelMcpTask:D,getMcpLogs:C,setMcpLoggingLevel:x,getMcpInstructions:d,getReasoningConfiguration:t,setReasoningEffort:Q0,getServiceTierConfiguration:w0,setServiceTier:p0,getResponseVerbosityConfiguration:s0,setResponseVerbosity:j0,getCommunicationStyleConfiguration:l$,setCommunicationStyle:r$,runCodeReview:a$,askSideQuestion:x0,executeUserShellCommand:Q$,getTurnRecoveryAssessment:o0}=h9({sessionId:U,workspaceRoot:G,systemPrompt:$,appendSystemPrompt:J,maxTurns:Y,modelId:q,permissionMode:O,reasoningEffort:_,serviceTier:W,responseVerbosity:L,communicationStyle:N,agents:Q}),E0=m9(F),B$=Z1((K0)=>new S2({signal:K0,streamingBuffer:E0,getStreamingMessageId:()=>Y$().session.currentStreamingMessageId,finalizeStreamingMessage:F.finalizeStreamingMessage,discardStreamingMessage:F.discardStreamingMessage,clearThinking:()=>F.setCurrentThinkingContent(null)})),O$=Z1(async()=>{if(!I||!U){S.setTeams([]);return}try{let B0=await new a9({configDir:y4(),subagentRegistry:C8(G)}).list({sessionId:U,projectPath:G});if(Y$().session.sessionId===U&&Y$().session.workspaceRoot===G)S.setTeams(B0)}catch(K0){D2.warn("[useCommandHandler] Failed to refresh Agent Teams",K0)}}),X1=Z1(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"};F.setCommand(`! ${b0}`);try{let J0=await Q$(b0,{signal:B0});if(F.addMessage({id:`user-shell-${J0.executionId}`,role:"user",content:R4(J0.record),timestamp:Date.now(),metadata:{userShellCommand:J0.record}}),J0.delivery==="next_turn")P.current?.request();return{success:J0.record.status!=="spawn_error",output:R4(J0.record),...J0.record.status==="spawn_error"?{error:J0.record.stderr||"User shell command failed"}:{}}}finally{F.setCommand(null)}});g1(()=>{return()=>{A.current=null,E0.resetStreamingBuffers()}},[E0.resetStreamingBuffers]),g1(()=>{return()=>{w.current?.abort("side-conversation-session-change"),w.current=null,S.dismissSideConversation()}},[S,U,G]),g1(()=>{S.setTeams([]),O$()},[I,S,O$,U,G]),g1(()=>{if(!z)F.setCurrentThinkingContent(null)},[z,F]);let A1=Z1(()=>{if(w.current){w.current.abort("user-cancel"),w.current=null,S.dismissSideConversation();return}if(!K)return;Z?.();let K0=y.getAbortController()?.signal??new AbortController().signal;if((A.current??B$(K0)).abortAndFinalize(()=>{y.abort("user-cancel"),S.setTasks([])}),!b.current)F.addAssistantMessage("任务已停止"),b.current=!0}),h1=Z1(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}w.current?.abort("side-conversation-replaced");let J0=new AbortController;w.current=J0;try{let e=await x0(B0,J0.signal);if(J0.signal.aborted||w.current!==J0)return;if(S.completeSideConversation(b0,e),e.usage)F.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||w.current!==J0)return;S.failSideConversation(b0,e instanceof Error?e.message:String(e))}finally{if(w.current===J0)w.current=null}}),$2=Z1(async(K0,B0)=>{let b0={contentDeltaCount:0,contentDeltaTotalLen:0,compactionCount:0},J0=B$(B0.signal);A.current=J0;let e=R9({sessionActions:F,appActions:S,commandActions:y,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(A.current===J0)A.current=null}}),C2=Z1(async(K0)=>{let B0=!1,b0,J0=!1,e=K0;try{if(K0.text.trimStart().startsWith("!")){let J$=y.getAbortController()??y.createAbortController();return await X1(K0,J$.signal)}await V2();let $$=y.getAbortController()??y.createAbortController(),g=B8(Y$().session),h=await M4(K0,S,F,$$.signal,T,U,B8(Y$().session),{listCheckpoints:j,execute:i},{list:n,resume:c},{getCatalog:U0,refresh:m,getPrompt:o,complete:H,listTasks:R,getTask:v,cancelTask:D,getLogs:C,setLoggingLevel:x,getInstructions:d},{get:t,set:Q0},{get:w0,set:p0},{get:s0,set:j0},{get:l$,set:r$},G,{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:G,sessionId:U,permissionMode:O,hasImages:e.images.length>0,imageCount:e.images.length});if(!J$.proceed){if(J$.warning)F.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((e2)=>e2.type==="image")]};if(J$.contextInjection)p=J$.contextInjection}if(!B0)F.addUserMessage(e.displayText);let $0=P4(e),n0=await V(b0?{modelId:b0}:void 0);if($$.signal.aborted)return D2.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:U,workspaceRoot:G,signal:$$.signal,confirmationHandler:X,permissionMode:O,onPermissionModeChange:async(J$)=>{await a0().setPermissionMode(J$)}},{loopResult:_$,stats:I2}=await $2(n0.chatStream($0,d0,{stream:!0,goalContinuationOnly:J0,onTurnLimitReached:X?async(J$)=>{let e2=await X.requestConfirmation({type:"maxTurnsExceeded",message:`已进行 ${J$.turnsCount} 轮对话。是否继续?`,risks:["继续执行可能导致更长的等待时间","可能产生更多的 API 费用"]});return{continue:e2.approved,reason:e2.reason}}:void 0}),$$);if(I2.compactionCount>0)F.setCompactedContext(d0.messages);if(_$.success&&_$.metadata?.outputTruncated)F.addAssistantMessage("输出因达到 token 上限被截断,部分内容可能不完整。");let b1=_$.finalMessage||"";if(D2.debug("[handleCommandSubmit] final reply",{success:_$.success,outputLength:b1.length,turnsCount:_$.metadata?.turnsCount,toolCallsCount:_$.metadata?.toolCallsCount}),!_$.success&&!p9(_$)){let J$=_$.error?.message||"任务执行失败";return F.addAssistantMessage(J$),{success:!1,error:J$}}if(!b1||b1.trim()===""){let J$=_$.metadata?.abortReason;if(!b.current&&I2.contentDeltaCount===0&&J$!=="interrupt")return F.addAssistantMessage("已取消"),{success:!0,output:"已取消"};return{success:!0,output:b1??""}}return{success:!0,output:b1}}catch($$){if(b.current)return{success:!1,error:"aborted"};let g=W8($$);return F.addAssistantMessage(`${g.displayMessage}`),{success:!1,error:g.displayMessage}}}),S$=Z1(async(K0)=>{if(K0.aborted)return"completed";if(Y$().command.isProcessing)return"deferred";let B0=await E$.hasPendingInbox(G,U),b0=!B0&&await E$.hasActiveGoal(G,U),J0=!B0&&!b0&&await E$.hasRecoverableTurn(G,U);if(K0.aborted)return"completed";if(!B0&&!b0&&!J0)return"completed";if(Y$().command.isProcessing)return"deferred";if(await V2(),K0.aborted)return"completed";if(Y$().command.isProcessing)return"deferred";let e=y.createAbortController(),$$=()=>{if(!e.signal.aborted)e.abort("pending-resume-coordinator-disposed")};if(K0.addEventListener("abort",$$,{once:!0}),K0.aborted)$$();E0.resetStreamingBuffers(),F.clearFinalizingStreamingMessageId(),y.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(G,U),f=!h&&await E$.hasActiveGoal(G,U);if(e.signal.aborted)return e.signal.reason==="interrupted-by-new-command"?"deferred":"completed";if(!h&&!f){let d0=o0();if(d0.state!=="none")b4(F,d0);return"completed"}let p={messages:B8(Y$().session),userId:"cli-user",sessionId:U,workspaceRoot:G,signal:e.signal,confirmationHandler:X,permissionMode:O,onPermissionModeChange:async(d0)=>{await a0().setPermissionMode(d0)}},{loopResult:$0,stats:n0}=await $2(g.chatStream("",p,{stream:!0,pendingInputOnly:h,goalContinuationOnly:f}),e);if(n0.compactionCount>0)F.setCompactedContext(p.messages);if($0.success&&$0.metadata?.outputTruncated)F.addAssistantMessage("输出因达到 token 上限被截断,部分内容可能不完整。");if(!$0.success&&!p9($0))F.addAssistantMessage($0.error?.message||"恢复排队指令失败")}catch(g){let h=W8(g);if(!h.isAbort)F.setError(`恢复排队指令失败: ${h.displayMessage}`)}finally{if(K0.removeEventListener("abort",$$),y.getAbortController()===e)y.setProcessing(!1),y.clearAbortController(e),F.setCurrentThinkingContent(null)}return"completed"}),e0=tX(()=>new L4({canRun:()=>!Y$().command.isProcessing,run:S$}),[S$,U,G]);P.current=e0,g1(()=>{return()=>{e0.dispose()}},[e0]);let i$=Z1(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(w.current?.abort("main-conversation-submitted"),w.current=null,S.dismissSideConversation(),K0.text.trimStart().startsWith("!")&&K){let J0=y.getAbortController();if(!J0){F.addAssistantMessage("当前任务没有可用的取消边界,无法执行用户 Shell 命令。");return}let e=await X1(K0,J0.signal);if(!e.success&&e.error&&e.error!=="aborted")F.setError(e.error);return}if(K){if(K0.text.trimStart().startsWith("/")){if(/^\/goal(?:\s|$)/i.test(K0.text.trim())){await V2();let h=y.getAbortController()??y.createAbortController();await M4(K0,S,F,h.signal,T,U,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,G);return}F.addAssistantMessage("活动回合中不能执行 slash command;请先停止任务或等待完成。");return}await V2();let J0=await y$.getInstance().executeUserPromptSubmitHooks(K0.text,{projectDir:G,sessionId:U,permissionMode:O,hasImages:K0.images.length>0,imageCount:K0.images.length});if(!J0.proceed){if(J0.warning)F.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 $$=P4(e),g=await k($$);if(!g.accepted){let h=g.reason==="queue_full"?"补充指令队列已满,请等待当前任务处理后重试。":"当前任务正在结束,补充指令未入队,请稍后重试。";F.addAssistantMessage(h);return}if(y.enqueueCommand(K0),F.addUserMessage(K0.displayText),g.delivery==="next_turn")e0.request();return}S.setTasks([]),y.setRecoveredSteeringCount(0),b.current=!1;let b0=y.createAbortController();E0.resetStreamingBuffers(),F.clearFinalizingStreamingMessageId(),y.setProcessing(!0);try{let J0=await C2(K0);if(!J0.success&&J0.error&&J0.error!=="aborted")F.setError(J0.error)}catch(J0){let e=W8(J0);if(e.isAbort);else F.setError(`执行失败: ${e.displayMessage}`)}finally{if(y.getAbortController()===b0)y.setProcessing(!1),y.clearAbortController(b0),F.setCurrentThinkingContent(null),e0.notifyIdle()}});return g1(()=>{let K0=u9.subscribe((B0)=>{if(!x9(B0,{sessionId:U,projectPath:G}))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 M(e,{messageId:J0,origin:"team_message",metadata:$$});if(!g.accepted)return;if(await new l9(b0,y4()).markDelivered([J0]),g.delivery==="next_turn")e0.request()})().catch((g)=>{D2.warn("[useCommandHandler] Failed to deliver teammate message",g)});queueMicrotask(()=>{O$()});return}if(B0.type!=="subagent.completion.queued")return;e0.request()});return()=>{K0()}},[M,e0,O$,U,G]),g1(()=>{let K0=!1;return(async()=>{if(X)await T4.resolvePendingWithHandler(G,U,X);else await T4.cancelPendingNonInteractive(G,U);if(K0)return;let[B0,b0]=await Promise.all([E$.hasPendingInbox(G,U),E$.hasActiveGoal(G,U)]),J0=!B0&&!b0&&await E$.hasRecoverableTurn(G,U);if(B0||b0||J0)e0.request()})().catch((B0)=>{if(!K0)D2.warn("[useCommandHandler] Failed to recover pending interaction or inbox",B0)}),()=>{K0=!0}},[X,e0,U,G]),{executeCommand:i$,handleAbort:A1,isProcessing:K||B?.status==="loading",cleanupAgent:T}};import{useMemoizedFn as I8}from"ahooks";import{useRef as sX,useState as eX}from"react";var o9=()=>{let[$,J]=eX([]),X=sX(-1),Y=I8((U,G)=>{let q={display:U,pasteMappings:G?new Map(G):new Map};J((O)=>[...O,q]),X.current=-1}),Z=I8(()=>{if($.length===0)return null;let U=X.current===-1?$.length-1:Math.max(0,X.current-1);return X.current=U,$[U]||null}),Q=I8(()=>{if(X.current===-1)return null;let U=X.current+1;if(U>=$.length)return X.current=-1,null;else return X.current=U,$[U]||null}),K=I8(()=>{X.current=-1});return{commandHistory:$,historyIndex:X.current,addToHistory:Y,getPreviousCommand:Z,getNextCommand:Q,resetHistoryIndex:K}};import{useMemoizedFn as j2}from"ahooks";import{useMemo as $Z,useRef as n9,useState as JZ}from"react";var t9=()=>{let[$,J]=JZ({isVisible:!1,details:null,resolver:null}),X=n9(null),Y=n9([]),Z=j2((O)=>{X.current=O,J({isVisible:Boolean(O),details:O?.details??null,resolver:O?.resolve??null})}),Q=j2((O,z)=>{if(O.settled)return;if(O.settled=!0,O.signal&&O.abortListener)O.signal.removeEventListener("abort",O.abortListener);O.resolve(z)}),K=j2((O,z)=>{return new Promise((_)=>{let W={details:O,resolve:_,signal:z,settled:!1},L=()=>{if(X.current===W){Q(W,{approved:!1,reason:E2}),Z(Y.current.shift()??null);return}let N=Y.current.indexOf(W);if(N>=0)Y.current.splice(N,1);Q(W,{approved:!1,reason:E2})};if(W.abortListener=L,z?.aborted){L();return}if(z?.addEventListener("abort",L,{once:!0}),!X.current){Z(W);return}Y.current.push(W)})}),U=j2((O)=>{let z=X.current;if(z)Q(z,O);let _=Y.current.shift()??null;Z(_)}),G=j2(()=>{if(X.current)Q(X.current,{approved:!1,reason:E2});for(let O of Y.current)Q(O,{approved:!1,reason:E2});Y.current=[],Z(null)}),q=$Z(()=>({requestConfirmation:K}),[K]);return{confirmationState:$,confirmationHandler:q,handleResponse:U,dismissAll:G}};import{useMemoizedFn as m1}from"ahooks";import{useRef as s9,useState as YZ}from"react";var C4="␞",I4="␟";function S8($){return`${C4}PASTE:${$}:`}function S4(){return I4}var XZ=`${C4}PASTE:(\\d+):[\\s\\S]*?${I4}`;function ZZ($){return $.includes(C4)&&$.includes(I4)}function QZ($,J,X){let Y=[...$.values()].filter((K)=>K.type==="image");if(Y.length>=K2)throw Error(`最多只能粘贴 ${K2} 张图片`);let Z=Y.reduce((K,U)=>K+`data:${U.mimeType};base64,`.length+U.data.length,0),Q=`data:${X};base64,`.length+J.length;if(Z+Q>w8)throw Error("图片编码后总大小不能超过 5 MiB")}function KZ($,J){let X=[],Y=[];if(!ZZ($)){let z=$.trim();if(z)Y.push({type:"text",text:z});return{displayText:$,text:$,images:X,parts:Y}}let Z=Array.from($.matchAll(new RegExp(XZ,"g"))),Q=0,K="",U="";for(let z of Z){let _=z.index,W=_+z[0].length,L=parseInt(z[1],10),N=J.get(L);if(_>Q){let B=$.slice(Q,_);Y.push({type:"text",text:B}),K+=B,U+=B}if(!N)K+=z[0],U+=z[0],Y.push({type:"text",text:z[0]});else if(N.type==="text")K+=N.data,U+=N.data,Y.push({type:"text",text:N.data});else{let B={id:L,base64:N.data,mimeType:N.mimeType};X.push(B),Y.push({type:"image",...B}),U+=`[Image #${L}]`}Q=W}if(Q<$.length){let z=$.slice(Q);Y.push({type:"text",text:z}),K+=z,U+=z}let G=[];for(let z of Y){let _=G[G.length-1];if(z.type==="text"&&_?.type==="text")_.text+=z.text;else G.push(z)}let q=0,O=G.length;while(q<G.length){let z=G[q];if(z.type!=="text"||z.text.trim()!=="")break;q++}while(O>q){let z=G[O-1];if(z.type!=="text"||z.text.trim()!=="")break;O--}return{displayText:U.trim(),text:K.trim(),images:X,parts:G.slice(q,O)}}function e9($="",J=0){let[X,Y]=YZ({value:$,cursorPosition:J}),Z=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=S8(L);if(!W.includes(N))Q.current.delete(L)}}),U=m1((W)=>{Y((L)=>({...L,cursorPosition:Math.max(0,Math.min(W,L.value.length))}))}),G=m1(()=>{Y({value:"",cursorPosition:0}),Q.current.clear()}),q=m1((W)=>{Z.current+=1;let L=Z.current;return Q.current.set(L,{type:"text",data:W}),L}),O=m1((W,L)=>{QZ(Q.current,W,L),Z.current+=1;let N=Z.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>=Z.current)Z.current=L}),_=m1((W)=>KZ(W,Q.current));return{value:X.value,cursorPosition:X.cursorPosition,setValue:K,setCursorPosition:U,clear:G,pasteMap:Q.current,addPasteMapping:q,addImagePasteMapping:O,restorePasteMappings:z,resolveInput:_}}import{useMemoizedFn as zY}from"ahooks";import{useEffect as OY,useRef as _Y,useState as v4}from"react";function UZ($){return{supportsThinking:Q1().resolveConfig($).reasoning}}function k8($){return UZ($).supportsThinking}import{useInput as $Y}from"ink";import{createContext as GZ,useCallback as qZ,useContext as zZ,useEffect as OZ,useMemo as _Z,useRef as f8}from"react";import{jsxDEV as NZ}from"react/jsx-dev-runtime";var JY=GZ(null);function YY({children:$}){let J=f8(new Map),X=f8(0),Y=qZ((Q,K,U)=>{let G=X.current++;return J.current.set(G,{id:G,priority:K,handler:Q}),U?.(),()=>{J.current.delete(G)}},[]),Z=_Z(()=>({register:Y}),[Y]);return $Y((Q,K)=>{let U=[...J.current.values()].sort((G,q)=>q.priority-G.priority||G.id-q.id);for(let G of U)if(G.handler(Q,K)===!0)break}),NZ(JY.Provider,{value:Z,children:$},void 0,!1,void 0,this)}function q0($,J={}){let X=zZ(JY),Y=f8($);Y.current=$;let Z=J.isActive??!0,Q=J.priority??0,K=f8(J.onRegistered);K.current=J.onRegistered,$Y((U,G)=>{if(!X&&Z)Y.current(U,G)},{isActive:!X&&Z}),OZ(()=>{if(!X||!Z)return;return X.register((U,G)=>Y.current(U,G),Q,()=>K.current?.())},[Z,Q,X])}import FZ from"fast-glob";import HZ from"fuse.js";import{useEffect as XY,useMemo as v8,useState as k4}from"react";var G2=null,WZ=5000;function LZ($,J){let X=[...$.matchAll(/(?:^|\s)(@(?:"[^"]*"|(?:[^\\ ]|\\ )*))/g)];for(let Y of X){let Z=Y[1],Q=Y.index+(Y[0].length-Z.length),K=Q+Z.length;if(J>=Q&&J<=K){let U=Z.slice(1),G=!1;if(U.startsWith('"')){if(G=!0,U=U.slice(1),U.endsWith('"'))U=U.slice(0,-1)}return{hasQuery:!0,query:U,startIndex:Q,endIndex:K,quoted:G}}}return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1}}var wZ=[...f4.map(($)=>`${$}/**`),...f4,...ZY.map(($)=>`**/${$}`)];function QY($,J,X={}){let{cwd:Y=X$(),maxSuggestions:Z=15,ignorePatterns:Q=wZ,debounceDelay:K=300,fuzzyMatch:U=!0}=X,[G,q]=k4([]),[O,z]=k4(!1),[_,W]=k4(0),L=v8(()=>JSON.stringify(Q),[Q]),N=$.includes("@"),B=v8(()=>{if(J===void 0)return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1};return LZ($,J)},[$,J]);XY(()=>{if(!N){q([]),z(!1);return}let S=Date.now();if(G2&&G2.cwd===Y&&G2.ignoreKey===L&&S-G2.timestamp<WZ){q(G2.files),z(!1);return}let y=!1,A=setTimeout(async()=>{z(!0);try{let w=(await FZ("**/*",{cwd:Y,dot:!1,followSymbolicLinks:!1,onlyFiles:!1,markDirectories:!0,unique:!0,ignore:Q})).map((V)=>V.replace(/\\/g,"/"));if(!y)q(w),G2={cwd:Y,ignoreKey:L,files:w,timestamp:S}}catch(P){if(console.error("Failed to load files for @ completion:",P),!y)q([])}finally{if(!y)z(!1)}},K);return()=>{y=!0,clearTimeout(A)}},[N,Y,K,L]);let I=v8(()=>U&&G.length>0?new HZ(G,{threshold:0.4,ignoreLocation:!0,minMatchCharLength:1}):null,[G,U]),F=v8(()=>{if(!B.hasQuery||G.length===0)return[];let S=B.query.toLowerCase();if(S==="")return G.slice(0,Z);if(I)return I.search(S).slice(0,Z).map((b)=>b.item);return G.filter((y)=>y.toLowerCase().includes(S)).slice(0,Z)},[B,G,I,Z]);return XY(()=>{W(0)},[F]),{...B,suggestions:F,selectedIndex:_,loading:O}}function BZ($,J=!1){if($.includes(" ")||J)return`@"${$}"`;return`@${$}`}function KY($,J,X){if(!J.hasQuery)return{newInput:$,newCursorPos:$.length};let Y=BZ(X,J.quoted),Z=$.slice(0,J.startIndex),Q=$.slice(J.endIndex),K=Z+Y+" "+Q,U=J.startIndex+Y.length+1;return{newInput:K,newCursorPos:U}}import{useMemoizedFn as UY}from"ahooks";import{useEffect as GY,useRef as qY}from"react";var h0=($,J)=>{let X=qY(!1),Y=qY(null),Z=UY(()=>{if(Y.current)clearTimeout(Y.current);Y.current=setTimeout(()=>{U$().setAwaitingSecondCtrlC(!1),X.current=!1,Y.current=null},3000)}),Q=()=>{h2().shutdown("SIGINT",0)},K=UY(()=>{if(!X.current){if(X.current=!0,$&&J)J();U$().setAwaitingSecondCtrlC(!0),Z()}else{if(Y.current)clearTimeout(Y.current),Y.current=null;U$().setAwaitingSecondCtrlC(!1),Q()}});return GY(()=>{if($){if(U$().setAwaitingSecondCtrlC(!1),X.current=!1,Y.current)clearTimeout(Y.current),Y.current=null}},[$]),GY(()=>{return()=>{if(Y.current)clearTimeout(Y.current)}},[]),K};var D8=y1("UI"),HY=($,J,X,Y,Z,Q,K,U,G,q)=>{let z=r0()==="main-input",_=$.value,W=$.setValue,L=$.cursorPosition,N=P1(),B=o$(),I=M1(),F=Q8(),S=F?k8(F):!1,[y,b]=v4(!1),[A,P]=v4([]),[w,V]=v4(0),T=QY(_,L,{cwd:B,maxSuggestions:10}),k=h0(K||!1,Q),M=_Y(0),j=500,i=_Y(!1);OY(()=>{if(K)i.current=!1},[K]),OY(()=>{if(T.hasQuery&&T.suggestions.length>0){let U0=T.suggestions.map((m)=>({command:m,description:NY(m)?`Directory: ${m}`:`File: ${m}`,matchScore:1}));P(U0),b(!0),V(0)}else if(_.startsWith("/"))if(_.includes(" "))b(!1),P([]);else{let m=FY(_,B);P(m),b(m.length>0),V(0)}else b(!1),P([])},[_,T.hasQuery,T.suggestions,B]);let n=zY(()=>{N.clearMessages(),N.setError(null)}),c=zY(()=>{D8.debug("[DIAG] handleSubmit called:",{input:_,showSuggestions:y});let U0=_.trim();if(U0){let m=$.resolveInput(U0);D8.debug("[DIAG] Submitting command:",{displayText:U0,textLength:m.text.length,imageCount:m.images.length}),b(!1),P([]);let o=$.pasteMap.size>0?new Map($.pasteMap):new Map;Z(U0,o),$.clear(),J(m),D8.debug("[DIAG] Command submitted to onSubmit callback")}else D8.debug("[DIAG] Empty command, not submitting")});return q0((U0,m)=>{if(U0==="?"&&!_)return G?.(),setTimeout(()=>$.clear(),0),!0;if(m.backspace||m.delete||m.leftArrow||m.rightArrow||m.pageUp||m.pageDown||!m.ctrl&&!m.meta&&!m.escape&&!m.tab&&!m.upArrow&&!m.downArrow&&!m.return&&!(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 n(),!0;if(m.ctrl&&U0==="t"||m.meta&&U0==="t")return N.toggleThinkingExpanded(),!0;if(m.escape){if(q)G?.();else if(K&&Q){if(i.current)return!0;i.current=!0,Q()}else if(y)b(!1),P([]);else if(_){let H=Date.now();if(H-M.current<500)$.clear(),M.current=0;else M.current=H}return!0}if(m.tab&&m.shift)return U?.(),!0;if(m.tab){if(y&&A.length>0){let H=A[w].command;if(T.hasQuery&&T.suggestions.includes(H)){let{newInput:R,newCursorPos:v}=KY(_,T,H);W(R),$.setCursorPosition(v)}else{let R=H+" ";W(R),$.setCursorPosition(R.length)}b(!1),P([])}else if(S)I.toggleThinkingMode();return!0}if(m.return)return c(),!0;if(m.upArrow){if(y&&A.length>0){let H=A.length-1;V((R)=>R>0?R-1:H)}else{let H=X();if(H){if(H.pasteMappings.size>0)$.restorePasteMappings(H.pasteMappings);W(H.display),$.setCursorPosition(H.display.length)}}return!0}if(m.downArrow){if(y&&A.length>0){let H=A.length-1;V((R)=>R<H?R+1:0)}else{let H=Y();if(H){if(H.pasteMappings.size>0)$.restorePasteMappings(H.pasteMappings);W(H.display),$.setCursorPosition(H.display.length)}}return!0}return!1},{isActive:z,priority:20}),{handleSubmit:c,showSuggestions:y,suggestions:A,selectedSuggestionIndex:w}};import IZ from"ansi-escapes";import{useStdout as SZ}from"ink";import{useCallback as kZ,useEffect as fZ,useRef as vZ}from"react";import{useStdout as AZ}from"ink";import{debounce as bZ}from"lodash-es";import{useEffect as PZ,useState as MZ}from"react";var WY={columns:80,rows:24};function yZ($){return{width:$.columns||80,height:$.rows||24}}function RZ($,J){return $.width===J.width&&$.height===J.height}function LY($,J,X){let{stdout:Y}=AZ(),[Z,Q]=MZ(()=>$(Y));return PZ(()=>{let K=()=>{let G=$(Y);Q((q)=>J(q,G)?q:G)},U=bZ(K,X);return K(),Y.on("resize",U),()=>{Y.off("resize",U),U.cancel()}},[Y,X,J,$]),Z}function TZ($){return $.columns||WY.columns}function CZ($){return $.rows||WY.rows}function wY($,J=200){return LY($==="columns"?TZ:CZ,Object.is,J)}function V8($=200){return LY(yZ,RZ,$)}function q2($=200){return wY("columns",$)}function BY(){let{stdout:$}=SZ(),J=q2(),X=vZ(!0),Y=X0((Q)=>Q.session.actions.incrementClearCount),Z=kZ(()=>{if($)$.write(IZ.clearTerminal);Y()},[$,Y]);return fZ(()=>{if(X.current){X.current=!1;return}Z()},[J,Z]),{refreshStatic:Z}}import p1 from"chalk";import DZ from"string-width";var A0={active:!1,renderedLineCount:0,lastRenderedLines:[],terminalWidth:process.stdout.columns||80,terminalHeight:process.stdout.rows||24,prefixIndent:4,isFirstRender:!0},E8="\x1B",D4=`${E8}[2K`,j8=($)=>$>0?`${E8}[${$}A`:"",AY=`${E8}[?25l`,bY=`${E8}[?25h`;function PY($,J){A0.active=!0,A0.renderedLineCount=0,A0.lastRenderedLines=[],A0.terminalWidth=$,A0.terminalHeight=J,A0.isFirstRender=!0}function MY($,J){A0.terminalWidth=$,A0.terminalHeight=J}function yY($,J,X,Y){if(!A0.active)return;let Z=8,Q=Math.max(1,A0.terminalHeight-Z),K=[],U=K$.getTheme(),G=" ".repeat(A0.prefixIndent),q=p1.dim.hex(U.colors.border.light);if(J>0)K.push(`${G}${p1.dim.hex(U.colors.text.muted)(`^ ${J} lines above (streaming...)`)}`);let O=X==="code",z=X==="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 B=_?` ${p1.hex(U.colors.text.secondary)(_)}`:"";K.push(`${G}${q("╭─")}${B}`)}for(let B=0;B<L.length;B++){let I=L[B],F=G;if(B===0&&!Y&&A0.isFirstRender&&!O&&!z)F=p1.bold.hex(U.colors.success)("• ")+" ",A0.isFirstRender=!1;let S=O?4:0,y=A0.terminalWidth-A0.prefixIndent-2-S,b=I;if(DZ(I)>y)b=I.slice(0,y);if(O)K.push(`${G}${q("│")} ${b}`);else if(z){let A=b;if(A.startsWith("+"))K.push(`${F}${p1.green(b)}`);else if(A.startsWith("-"))K.push(`${F}${p1.red(b)}`);else if(A.startsWith("@@"))K.push(`${F}${p1.dim(b)}`);else K.push(`${F}${b}`)}else K.push(`${F}${b}`);if(B===0&&!Y&&A0.isFirstRender)A0.isFirstRender=!1}let N=[];if(N.push(AY),A0.renderedLineCount>0)N.push(j8(A0.renderedLineCount)),N.push("\r");for(let B=0;B<K.length;B++){let I=K[B],F=A0.lastRenderedLines[B];if(I!==F)N.push(D4),N.push(I);if(B<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 B=A0.renderedLineCount-K.length;N.push(j8(B))}N.push(bY),process.stdout.write(N.join("")),A0.renderedLineCount=K.length,A0.lastRenderedLines=K}function k$(){if(!A0.active)return;if(A0.renderedLineCount>0){let $=[];$.push(AY),$.push(j8(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(j8(A0.renderedLineCount-1)),$.push("\r");$.push(bY),process.stdout.write($.join(""))}A0.active=!1,A0.renderedLineCount=0,A0.lastRenderedLines=[],A0.isFirstRender=!0}function g$(){return A0.active}import RY from"node:fs";import VZ from"node:os";import V4 from"node:path";import{MultiSelect as jZ}from"@inkjs/ui";import{useMemoizedFn as h8}from"ahooks";import{Box as N0,Text as G0,useFocus as EZ,useFocusManager as hZ}from"ink";import g8 from"ink-select-input";import gZ from"ink-spinner";import g2 from"ink-text-input";import{useEffect as TY,useState as z2}from"react";import{jsxDEV as E}from"react/jsx-dev-runtime";var mZ=[{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"}],pZ=[{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 xZ($){if(!$||$.trim()==="")return"名称不能为空";if(!/^[a-z0-9-]+$/.test($))return"名称只能包含小写字母、数字和连字符";if($.startsWith("-")||$.endsWith("-"))return"名称不能以连字符开头或结尾";return null}function m2({onComplete:$,onCancel:J,initialConfig:X}){let[Y,Z]=z2(X?"name":"mode"),[Q,K]=z2({name:X?.name||"",description:X?.description||"",tools:X?.tools||[],color:X?.color,location:X?.location||"project",systemPrompt:X?.systemPrompt||""}),[U,G]=z2(""),[q,O]=z2(!1),[z,_]=z2(""),[W,L]=z2(X?"edit":"manual"),{focus:N}=hZ(),I={manual:["mode","name","description","tools","color","location","systemPrompt","confirm"],ai:["mode","aiPrompt","aiGenerating","confirm"],edit:["name","description","tools","color","location","systemPrompt","confirm"]}[W];TY(()=>{if(Y==="name"||Y==="description"||Y==="systemPrompt"||Y==="aiPrompt")return;N(`step-${Y}`)},[Y,N]);let F=h8(()=>{let P=I.indexOf(Y);if(P<I.length-1)Z(I[P+1])}),S=h8(()=>{if(z)_("");if(Y==="confirm"&&W==="ai"){Z("aiPrompt");return}let P=I.indexOf(Y);if(P>0)Z(I[P-1]);else J()}),y=h8(async()=>{O(!0),_("");try{let P=await v2.create(),w=`你是一个 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,不要添加任何额外的解释或文字。`,U)).trim(),k=T.match(/```(?:json)?\s*\n([\s\S]*?)\n```/);if(k)T=k[1];let M=JSON.parse(T);if(!M.name||!M.description||!M.systemPrompt)throw Error("Missing required fields: name, description, or systemPrompt");if(!/^[a-z0-9]+(-[a-z0-9]+)*$/.test(M.name))throw Error("Invalid name format. Must be kebab-case (lowercase, numbers, hyphens only)");K({name:M.name,description:M.description,tools:Array.isArray(M.tools)?M.tools:[],color:M.color||"blue",location:"project",systemPrompt:M.systemPrompt}),Z("confirm")}catch(P){_(P instanceof Error?P.message:String(P))}finally{O(!1)}});TY(()=>{if(Y==="aiGenerating"&&!q&&!z)y()},[Y,q,z,y]);let b=h8(async()=>{try{let P=Q.location==="project"?V4.join(X$(),".blade","agents"):V4.join(VZ.homedir(),".blade","agents");await RY.promises.mkdir(P,{recursive:!0});let w=["---",`name: ${Q.name}`,`description: ${Q.description}`];if(Q.tools.length>0&&!Q.tools.includes("all")){w.push("tools:");for(let k of Q.tools)w.push(` - ${k}`)}if(Q.color)w.push(`color: ${Q.color}`);w.push("---");let V=[w.join(`
120
- `),"",`# ${Q.name} Subagent`,"",Q.systemPrompt||"你是一个专门的代理,负责执行特定任务。",""].join(`
121
- `),T=V4.join(P,`${Q.name}.md`);await RY.promises.writeFile(T,V,"utf-8"),$()}catch(P){console.error("保存配置失败:",P)}}),A=h0(!1,J);if(q0((P,w)=>{if(w.escape)S();else if(w.ctrl&&P==="c"||w.meta&&P==="c")A()},{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(g8,{items:[{label:"AI 智能生成 - 根据描述自动生成完整配置",value:"ai"},{label:"手动配置 - 逐步配置每个选项",value:"manual"}],onSelect:(P)=>{if(P.value==="ai")L("ai"),Z("aiPrompt");else L("manual"),Z("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(g2,{value:U,onChange:G,onSubmit:(P)=>{if(!P.trim())return;Z("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(gZ,{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:['根据你的描述:"',U,'"']},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(g2,{value:Q.name,onChange:(w)=>K({...Q,name:w}),onSubmit:(w)=>{if(xZ(w))return;F()}},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(g2,{value:"",onChange:()=>{},onSubmit:F,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(g2,{value:Q.description,onChange:(P)=>K({...Q,description:P}),onSubmit:(P)=>{if(!P.trim())return;F()}},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(uZ,{config:Q,setConfig:K,onNext:F,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(g8,{items:pZ,onSelect:(P)=>{let w=P.value==="none"?void 0:P.value;K({...Q,color:w}),F()}},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(g8,{items:[{label:"项目级 (.blade/agents/) - 仅当前项目",value:"project"},{label:"用户级 (~/.blade/agents/) - 全局可用",value:"user"}],onSelect:(P)=>{K({...Q,location:P.value}),F()}},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(g2,{value:Q.systemPrompt,onChange:(P)=>K({...Q,systemPrompt:P}),onSubmit:()=>F()},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(g8,{items:[{label:"确认并保存",value:"save"},{label:"返回上一步",value:"back"},{label:"取消",value:"cancel"}],onSelect:(P)=>{if(P.value==="save")b();else if(P.value==="back")S();else J()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}function uZ({config:$,setConfig:J,onNext:X,onPrev:Y}){let{isFocused:Z}=EZ({id:"step-tools"});q0((K,U)=>{if(U.escape)Y()},{isActive:Z});let Q=(K)=>{if(K.includes("all"))J({...$,tools:["all"]});else J({...$,tools:K});X()};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(jZ,{options:mZ,defaultValue:$.tools,onSubmit:Q},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import cZ 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 dZ,useMemo as CY,useState as m8}from"react";import{jsxDEV as Y0}from"react/jsx-dev-runtime";var E4=10;function IY({workspaceRoot:$,initialMode:J="menu",onComplete:X,onCancel:Y}){let Z=C8($),[Q,K]=m8(J),[U,G]=m8(null),[q,O]=m8(0),[z,_]=m8(0),W=x1(()=>{Z.clear(),Z.loadFromStandardLocations(),O((T)=>T+1)}),L=CY(()=>{return Z.getAllSubagents()},[q]),N=Math.ceil(L.length/E4)||1,B=CY(()=>{let T=z*E4;return L.slice(T,T+E4)},[L,z]);dZ(()=>{let T=Math.max(0,N-1);if(z>T)_(T)},[N,z]);let I=x1(()=>{if(z<N-1)_((T)=>T+1)}),F=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"}],y=x1((T)=>{if(T.value==="cancel"){Y?.();return}K(T.value)}),b=x1((T)=>{if(G(T.value),Q==="edit")K("editWizard");else if(Q==="delete")K("deleteConfirm")}),A=x1(async()=>{if(!U?.configPath)return;try{await cZ.promises.unlink(U.configPath),W(),P()}catch(T){console.error("删除失败:",T)}}),P=x1(()=>{K("menu"),G(null)}),w=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")w();else if(Q==="list"){if(k.leftArrow||T==="h")F();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:y},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),B.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((M)=>({key:M.name,label:`${M.name} - ${M.description}`,value:M}));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: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==="create")return Y0(m2,{onComplete:()=>{W(),P()},onCancel:P},void 0,!1,void 0,this);if(Q==="edit")return V("编辑 Agent");if(Q==="editWizard"&&U){let T={name:U.name,description:U.description,tools:U.tools||[],color:U.color,location:U.configPath?.includes(".blade/agents")?"project":"user",systemPrompt:U.systemPrompt||""};return Y0(m2,{initialConfig:T,onComplete:()=>{W(),P()},onCancel:P},void 0,!1,void 0,this)}if(Q==="delete")return V("删除 Agent");if(Q==="deleteConfirm"&&U)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:U.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:["文件路径: ",U.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")A();else P()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}import{Box as O2,Text as W0}from"ink";import rZ,{useEffect as aZ,useState as iZ}from"react";import{useEffect as lZ,useState as SY}from"react";function vY($=X$(),J=5000){let[X,Y]=SY(null),[Z,Q]=SY(!0);return lZ(()=>{let K=!0,U=async()=>{try{let q=await kY($);if(!K)return;if(!q){Y(null),Q(!1);return}let O=await fY($);if(!K)return;Y(O)}catch{if(K)Y(null)}finally{if(K)Q(!1)}};U();let G=null;if(J>0)G=setInterval(U,J);return()=>{if(K=!1,G)clearInterval(G)}},[$,J]),{branch:X,loading:Z}}import{jsxDEV as Z0,Fragment as m$}from"react/jsx-dev-runtime";var VY=rZ.memo(()=>{let $=Z8(),J=X2(),Y=Y8()==="shortcuts",Z=K9(),Q=o$(),{branch:K}=vY(Q),U=Q8(),G=$9(),q=rJ(),O=U8(),z=G8(),_=q8(),W=z8(),L=O8(),N=aJ(),B=iJ(),I=Q2(),F=F9(),S=Y2(),[y,b]=iZ(null);aZ(()=>{let k=!1;new h4(Q,S).get().then((i)=>{if(!k)b(i)}).catch(()=>{if(!k)b(null)});let j=h4.subscribe((i)=>{if(!k&&i.sessionId===S&&i.workspaceRoot===Q)b(i.goal)});return()=>{k=!0,j()}},[S,Q]);let A=U?k8(U):!1,w=(()=>{if(J==="default")return null;if(J==="autoEdit")return Z0(W0,{color:"magenta",children:[">> ","auto edit on ",Z0(W0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="plan")return Z0(W0,{color:"cyan",children:["‖ plan mode on ",Z0(W0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="yolo")return Z0(W0,{color:"red",children:["yolo mode on ",Z0(W0,{color:"gray",children:"(all tools auto-approved)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null})(),V=w!==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 Z0(O2,{flexDirection:"row",justifyContent:"space-between",paddingX:2,paddingY:0,children:[Y?Z0(O2,{flexDirection:"column",gap:0,children:T.map((k,M)=>Z0(O2,{flexDirection:"row",children:[k.map((j,i)=>{let[n,c]=j.split(":");return Z0(O2,{flexDirection:"row",width:20,children:[Z0(W0,{color:"yellow",children:n},void 0,!1,void 0,this),Z0(W0,{color:"gray",children:":"},void 0,!1,void 0,this),Z0(W0,{color:"white",children:c},void 0,!1,void 0,this)]},i,!0,void 0,this)}),M===T.length-1&&Z0(W0,{color:"cyan",children:" ? 关闭"},void 0,!1,void 0,this)]},M,!0,void 0,this))},void 0,!1,void 0,this):Z0(O2,{flexDirection:"row",gap:1,children:[K&&Z0(m$,{children:[Z0(W0,{color:"gray",children:[" ",K]},void 0,!0,void 0,this),Z0(W0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),w,V&&Z0(W0,{color:"gray",children:"·"},void 0,!1,void 0,this),y&&Z0(m$,{children:[Z0(W0,{color:y.status==="active"?"green":y.status==="verifying"?"cyan":y.status==="blocked"||y.status==="budget_limited"?"yellow":"gray",children:["goal:",y.status," ",y.objective.slice(0,32),y.prematureStop?` recovery:${y.prematureStop.consecutiveCount}`:"",y.verificationStall?` verify-gap:${y.verificationStall.consecutiveCount}`:"",y.frontierStall?` frontier:${y.frontierStall.category}:${y.frontierStall.consecutiveCount}`:""]},void 0,!0,void 0,this),Z0(W0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Z0(W0,{color:"gray",children:"? for shortcuts"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Z0(O2,{flexDirection:"row",gap:1,children:!$?Z0(W0,{color:"red",children:"[WARN] API 密钥未配置"},void 0,!1,void 0,this):Z0(m$,{children:[A&&Z0(m$,{children:[O?Z0(W0,{color:"cyan",children:["Effort ",z]},void 0,!0,void 0,this):Z0(W0,{color:"gray",children:"Tab:Effort"},void 0,!1,void 0,this),Z0(W0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),_!=="auto"&&Z0(m$,{children:[Z0(W0,{color:_==="fast"?"yellow":"gray",children:["Speed ",_]},void 0,!0,void 0,this),Z0(W0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),W!=="auto"&&Z0(m$,{children:[Z0(W0,{color:"gray",children:["Output ",W]},void 0,!0,void 0,this),Z0(W0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),L!=="auto"&&Z0(m$,{children:[Z0(W0,{color:"gray",children:["Style ",L]},void 0,!0,void 0,this),Z0(W0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),U&&Z0(W0,{color:"gray",children:U.model},void 0,!1,void 0,this),Z0(W0,{color:"gray",children:"·"},void 0,!1,void 0,this),q?Z0(W0,{color:"yellow",children:"压缩中..."},void 0,!1,void 0,this):Z0(W0,{color:G<20?"red":G<50?"yellow":"gray",children:[G,"%"]},void 0,!0,void 0,this),Z0(W0,{color:"gray",children:"·"},void 0,!1,void 0,this),Z0(W0,{color:B===void 0?"gray":"cyan",children:["Cache ",DY(B)]},void 0,!0,void 0,this),N>0.001&&Z0(m$,{children:[Z0(W0,{color:"gray",children:"·"},void 0,!1,void 0,this),Z0(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&&Z0(m$,{children:[Z0(W0,{color:"gray",children:"·"},void 0,!1,void 0,this),Z0(W0,{color:"yellow",children:["已排队 ",I.length]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),F>0&&Z0(m$,{children:[Z0(W0,{color:"gray",children:"·"},void 0,!1,void 0,this),Z0(W0,{color:"cyan",children:["已恢复 ",F," 条指令"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Z&&Z0(m$,{children:[Z0(W0,{color:"gray",children:"·"},void 0,!1,void 0,this),Z0(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 oZ from"react";import{jsxDEV as _2}from"react/jsx-dev-runtime";var jY=oZ.memo(({suggestions:$,selectedIndex:J,visible:X,maxDisplay:Y=8})=>{if(!X||$.length===0)return null;let Z=0,Q=Math.min(Y,$.length),K=J>=$.length;if(J>=Y&&!K)Z=J-Y+1,Q=J+1;let U=$.slice(Z,Q),G=$.length>Y;return _2(g4,{flexDirection:"column",paddingX:2,paddingY:0,children:[U.map((q,O)=>{let _=Z+O===J;return _2(g4,{flexDirection:"row",paddingX:1,gap:2,children:[_2(m4,{color:_?"cyan":"white",bold:_,children:q.command},void 0,!1,void 0,this),_2(m4,{color:_?"cyan":"gray",dimColor:!_,children:["- ",q.description]},void 0,!0,void 0,this)]},q.command,!0,void 0,this)}),G&&_2(g4,{paddingX:1,children:_2(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 i5}from"ink";import o5 from"ink-select-input";import qJ,{useMemo as N6}from"react";import{Box as L0,Text as k0}from"ink";import c1,{useEffect as UJ,useMemo as u1,useRef as z6}from"react";import{Box as t4,Text as aY}from"ink";import q5 from"react";import{Text as p$}from"ink";import K5 from"react";import dY from"string-width";import p2 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 nZ=p4();function x4($){if(typeof $!=="string")throw TypeError(`Expected a \`string\`, got \`${typeof $}\``);if(!$.includes("\x1B")&&!$.includes("›"))return $;return $.replace(nZ,"")}var EY=($=0)=>(J)=>`\x1B[${J+$}m`,hY=($=0)=>(J)=>`\x1B[${38+$};5;${J}m`,gY=($=0)=>(J,X,Y)=>`\x1B[${38+$};2;${J};${X};${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]}},Yz=Object.keys(c0.modifier),tZ=Object.keys(c0.color),sZ=Object.keys(c0.bgColor),Xz=[...tZ,...sZ];function eZ(){let $=new Map;for(let[J,X]of Object.entries(c0)){for(let[Y,Z]of Object.entries(X))c0[Y]={open:`\x1B[${Z[0]}m`,close:`\x1B[${Z[1]}m`},X[Y]=c0[Y],$.set(Z[0],Z[1]);Object.defineProperty(c0,J,{value:X,enumerable:!1})}return Object.defineProperty(c0,"codes",{value:$,enumerable:!1}),c0.color.close="\x1B[39m",c0.bgColor.close="\x1B[49m",c0.color.ansi=EY(),c0.color.ansi256=hY(),c0.color.ansi16m=gY(),c0.bgColor.ansi=EY(10),c0.bgColor.ansi256=hY(10),c0.bgColor.ansi16m=gY(10),Object.defineProperties(c0,{rgbToAnsi256:{value(J,X,Y){if(J===X&&X===Y){if(J<8)return 16;if(J>248)return 231;return Math.round((J-8)/247*24)+232}return 16+36*Math.round(J/255*5)+6*Math.round(X/255*5)+Math.round(Y/255*5)},enumerable:!1},hexToRgb:{value(J){let X=/[a-f\d]{6}|[a-f\d]{3}/i.exec(J.toString(16));if(!X)return[0,0,0];let[Y]=X;if(Y.length===3)Y=[...Y].map((Q)=>Q+Q).join("");let Z=Number.parseInt(Y,16);return[Z>>16&255,Z>>8&255,Z&255]},enumerable:!1},hexToAnsi256:{value:(J)=>c0.rgbToAnsi256(...c0.hexToRgb(J)),enumerable:!1},ansi256ToAnsi:{value(J){if(J<8)return 30+J;if(J<16)return 90+(J-8);let X,Y,Z;if(J>=232)X=((J-232)*10+8)/255,Y=X,Z=X;else{J-=16;let U=J%36;X=Math.floor(J/36)/5,Y=Math.floor(U/6)/5,Z=U%6/5}let Q=Math.max(X,Y,Z)*2;if(Q===0)return 30;let K=30+(Math.round(Z)<<2|Math.round(Y)<<1|Math.round(X));if(Q===2)K+=60;return K},enumerable:!1},rgbToAnsi:{value:(J,X,Y)=>c0.ansi256ToAnsi(c0.rgbToAnsi256(J,X,Y)),enumerable:!1},hexToAnsi:{value:(J)=>c0.ansi256ToAnsi(c0.hexToAnsi256(J)),enumerable:!1}}),c0}var $5=eZ(),mY=$5;var x8=new Set(["\x1B","›"]),J5=39,c4="\x07",uY="[",Y5="]",cY="m",p8=`${Y5}8;;`,pY=($)=>`${x8.values().next().value}${uY}${$}${cY}`,xY=($)=>`${x8.values().next().value}${p8}${$}${c4}`,X5=($)=>$.split(" ").map((J)=>p2(J)),u4=($,J,X)=>{let Y=[...J],Z=!1,Q=!1,K=p2(x4($.at(-1)));for(let[U,G]of Y.entries()){let q=p2(G);if(K+q<=X)$[$.length-1]+=G;else $.push(G),K=0;if(x8.has(G))Z=!0,Q=Y.slice(U+1,U+1+p8.length).join("")===p8;if(Z){if(Q){if(G===c4)Z=!1,Q=!1}else if(G===cY)Z=!1;continue}if(K+=q,K===X&&U<Y.length-1)$.push(""),K=0}if(!K&&$.at(-1).length>0&&$.length>1)$[$.length-2]+=$.pop()},Z5=($)=>{let J=$.split(" "),X=J.length;while(X>0){if(p2(J[X-1])>0)break;X--}if(X===J.length)return $;return J.slice(0,X).join(" ")+J.slice(X).join("")},Q5=($,J,X={})=>{if(X.trim!==!1&&$.trim()==="")return"";let Y="",Z,Q,K=X5($),U=[""];for(let[z,_]of $.split(" ").entries()){if(X.trim!==!1)U[U.length-1]=U.at(-1).trimStart();let W=p2(U.at(-1));if(z!==0){if(W>=J&&(X.wordWrap===!1||X.trim===!1))U.push(""),W=0;if(W>0||X.trim===!1)U[U.length-1]+=" ",W++}if(X.hard&&K[z]>J){let L=J-W,N=1+Math.floor((K[z]-L-1)/J);if(Math.floor((K[z]-1)/J)<N)U.push("");u4(U,_,J);continue}if(W+K[z]>J&&W>0&&K[z]>0){if(X.wordWrap===!1&&W<J){u4(U,_,J);continue}U.push("")}if(W+K[z]>J&&X.wordWrap===!1){u4(U,_,J);continue}U[U.length-1]+=_}if(X.trim!==!1)U=U.map((z)=>Z5(z));let G=U.join(`
122
- `),q=[...G],O=0;for(let[z,_]of q.entries()){if(Y+=_,x8.has(_)){let{groups:L}=new RegExp(`(?:\\${uY}(?<code>\\d+)m|\\${p8}(?<uri>.*)${c4})`).exec(G.slice(O))||{groups:{}};if(L.code!==void 0){let N=Number.parseFloat(L.code);Z=N===J5?void 0:N}else if(L.uri!==void 0)Q=L.uri.length===0?void 0:L.uri}let W=mY.codes.get(Number(Z));if(q[z+1]===`
123
- `){if(Q)Y+=xY("");if(Z&&W)Y+=pY(W)}else if(_===`
124
- `){if(Z&&W)Y+=pY(Z);if(Q)Y+=xY(Q)}O+=_.length}return Y};function d4($,J,X){return String($).normalize().replaceAll(`\r
125
- `,`
126
- `).split(`
127
- `).map((Y)=>Q5(Y,J,X)).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 dY(J)};var lY=($)=>{return/[*_~`<[\]https?:]/.test($)},r4=($)=>{let X=$.replace(/\*\*(.*?)\*\*/g,"$1").replace(/\*(.*?)\*/g,"$1").replace(/_(.*?)_/g,"$1").replace(/~~(.*?)~~/g,"$1").replace(/`(.*?)`/g,"$1").replace(/<u>(.*?)<\/u>/g,"$1").replace(/\[(.*?)\]\(.*?\)/g,"$1").split(/\s+/).filter((Y)=>Y.length>0);if(X.length===0)return 0;return Math.max(...X.map((Y)=>dY(Y)))},N2=($,J,X=!1)=>{if(J<=0)return[$];let Y=$.trimEnd(),Q=d4(Y,J,{hard:X,trim:!1,wordWrap:!0}).split(`
129
- `).filter((K)=>K.length>0);return Q.length>0?Q:[""]},rY=($,J,X,Y)=>{let Z=Math.max(0,X-J);if(Y==="center"){let Q=Math.floor(Z/2);return" ".repeat(Q)+$+" ".repeat(Z-Q)}if(Y==="right")return" ".repeat(Z)+$;return $+" ".repeat(Z)};import{jsxDEV as f$,Fragment as G5}from"react/jsx-dev-runtime";var a4=2,i4=1,o4=2;function n4($,J){return`inline-${$}-${J}`}var U5=({text:$})=>{let J=P0();if(!lY($))return f$(p$,{children:$},void 0,!1,void 0,this);let X=[],Y=0,Z=0,Q=0,K=/(\*\*.*?\*\*|\*(?!\s).*?(?<!\s)\*|_(?!\s).*?(?<!\s)_|~~.*?~~|`+[^`]+`+|\[.*?\]\(.*?\)|https?:\/\/\S+)/g,U;while((U=K.exec($))!==null){if(U.index>Y){let z=$.slice(Y,U.index);X.push(f$(p$,{children:z},n4("text",Z++),!1,void 0,this))}let G=U[0],q=null,O=n4("match",Q++);try{if(G.startsWith("**")&&G.endsWith("**")&&G.length>a4*2)q=f$(p$,{bold:!0,children:G.slice(a4,-a4)},O,!1,void 0,this);else if(G.length>i4*2&&(G.startsWith("*")&&G.endsWith("*")||G.startsWith("_")&&G.endsWith("_"))){let z=$.substring(U.index-1,U.index),_=$.substring(K.lastIndex,K.lastIndex+1);if(!(/\w/.test(z)||/\w/.test(_)||/[./\\]/.test(z+_)))q=f$(p$,{italic:!0,children:G.slice(i4,-i4)},O,!1,void 0,this)}else if(G.startsWith("~~")&&G.endsWith("~~")&&G.length>o4*2)q=f$(p$,{strikethrough:!0,children:G.slice(o4,-o4)},O,!1,void 0,this);else if(G.startsWith("`")&&G.endsWith("`")){let z=G.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(G.startsWith("[")&&G.includes("](")&&G.endsWith(")")){let z=G.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(G.match(/^https?:\/\//))q=f$(p$,{color:J.colors.info,children:G},O,!1,void 0,this)}catch(z){console.error("InlineRenderer 解析错误:",G,z),q=null}X.push(q??f$(p$,{children:G},O,!1,void 0,this)),Y=K.lastIndex}if(Y<$.length){let G=$.slice(Y);X.push(f$(p$,{children:G},n4("text",Z++),!1,void 0,this))}return f$(G5,{children:X.filter((G)=>G!==null)},void 0,!1,void 0,this)},x$=K5.memo(U5);import{jsxDEV as F2}from"react/jsx-dev-runtime";var z5="▎",iY=q5.memo(({lines:$,level:J})=>{let X=P0(),Y=z5.repeat(J);return F2(t4,{flexDirection:"column",children:$.map((Z,Q)=>{if(Z.trim()==="")return F2(t4,{height:1},Q,!1,void 0,this);return F2(t4,{flexDirection:"row",children:[F2(aY,{dimColor:!0,color:X.colors.text.muted,children:[Y," "]},void 0,!0,void 0,this),F2(aY,{italic:!0,wrap:"wrap",children:F2(x$,{text:Z},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},Q,!0,void 0,this)})},void 0,!1,void 0,this)});import{Box as c8,Text as G1}from"ink";import{isPlainObject as JJ}from"lodash-es";import{common as A5,createLowlight as b5}from"lowlight";import{LRUCache as P5}from"lru-cache";import J6 from"react";import{Box as u8,Text as x2}from"ink";import U1,{Fragment as eY}from"react";import{LRUCache as sY}from"lru-cache";import O5 from"string-width";var _5=1024,N5=1048576,oY=1000,nY=new sY({max:_5,maxSize:N5,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<=oY){let Y=nY.get($);if(Y)return Y}let X=Array.from($);if($.length<=oY)nY.set($,X);return X}var F5=2048,H5=524288,W5=4096,tY=new sY({max:F5,maxSize:H5,sizeCalculation:($,J)=>Math.max(1,J.length*2+8)});function K1($){if(/^[\x20-\x7E]*$/.test($))return $.length;let J=tY.get($);if(J!==void 0)return J;let X=O5($);if($.length<=W5)tY.set($,X);return X}import{jsxDEV as H2}from"react/jsx-dev-runtime";var e4=2,$6=U1.memo(({children:$,maxWidth:J,maxHeight:X,overflowDirection:Y="top",additionalHiddenLinesCount:Z=0})=>{let Q=P0(),K=[],U=Math.max(Math.round(X??Number.MAX_SAFE_INTEGER),e4);function G(N){if(!U1.isValidElement(N))return;if(N.type===eY){U1.Children.forEach(N.props.children,G);return}if(N.type===u8){w5(N,J,K);return}}U1.Children.forEach($,G);let O=K.length>U||Z>0?U-1:U,z=O!==void 0?Math.max(0,K.length-O):0,_=z+Z,L=(z>0?Y==="top"?K.slice(z):K.slice(0,O):K).map((N,B)=>H2(u8,{children:N.length>0?N.map((I,F)=>H2(x2,{...I.props,children:I.text},F,!1,void 0,this)):H2(x2,{children:" "},void 0,!1,void 0,this)},B,!1,void 0,this));return H2(u8,{flexDirection:"column",width:J,flexShrink:0,children:[_>0&&Y==="top"&&H2(x2,{color:Q.colors.text.muted,dimColor:!0,children:["... ",_," line",_===1?"":"s"," hidden ..."]},void 0,!0,void 0,this),L,_>0&&Y==="bottom"&&H2(x2,{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 L5($){if(!U1.isValidElement($)||$.type!==u8)return{noWrapSegments:[],segments:[]};let J={noWrapSegments:[],segments:[]},X=!1;function Y(Z,Q){if(Z===null||Z===void 0)return;if(typeof Z==="string"||typeof Z==="number"){let q=String(Z);if(!q)return;let O={text:q,props:Q??{}};if(Q===void 0||Q.wrap==="wrap")X=!0,J.segments.push(O);else if(!X)J.noWrapSegments.push(O);else J.segments.push(O);return}if(!U1.isValidElement(Z))return;if(Z.type===eY){U1.Children.forEach(Z.props.children,(q)=>Y(q,Q));return}if(Z.type!==x2)return;let{children:K,...U}=Z.props,G=Q===void 0?U:{...Q,...U};U1.Children.forEach(K,(q)=>Y(q,G))}return U1.Children.forEach($.props.children,(Z)=>Y(Z,void 0)),J}function w5($,J,X){let Y=L5($);if(Y.segments.length===0&&Y.noWrapSegments.length===0){X.push([]);return}let Z=0;for(let z of Y.noWrapSegments)Z+=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)X.push(W);return}let Q=J-Z;if(Q<1){B5(Y.noWrapSegments,J,X);return}let K=[],U=[],G=0;function q(){if(K.length===0)K.push([...Y.noWrapSegments,...U]);else if(Z>0)K.push([{text:" ".repeat(Z),props:{}},...U]);else K.push(U);U=[],G=0}function O(z,_){if(U.length>0&&U[U.length-1].props===_)U[U.length-1].text+=z;else U.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 B of N){if(!B)continue;let I=K1(B);if(G+I>Q&&G>0){if(q(),/^\s+$/.test(B))continue}if(I>Q){let S=s4(B);while(S.length>0){let y=0,b=0;for(let A of S){let P=K1(A);if(G+b+P>Q)break;b+=P,y++}if(y>0){let A=S.slice(0,y).join("");O(A,z.props),G+=K1(A),S=S.slice(y)}if(S.length>0)q()}}else O(B,z.props),G+=I}}if(z.text.endsWith(`
132
- `))q()}if(U.length>0)q();for(let z of K)X.push(z)}function B5($,J,X){let Y=[],Z=[],Q=0;for(let K of $){let U=K.text.split(`
133
- `);for(let G=0;G<U.length;G++){if(G>0)Y.push(Z),Z=[],Q=0;let q=U[G];if(!q)continue;let O=K1(q),z=Math.max(0,J-K1("…"));if(O<=z&&Q===0)Z.push({text:q,props:K.props}),Q+=O;else{let _=s4(q),W=Q,L=0;for(let B of _){let I=K1(B);if(W+I>z)break;W+=I,L++}let N=_.slice(0,L).join("");if(N)Z.push({text:N,props:K.props});Z.push({text:"…",props:{}}),Q=W+K1("…")}}}if(Z.length>0)Y.push(Z);if(Y.length===0)Y.push([{text:"…",props:{}}]);for(let K of Y)X.push(K)}import{jsxDEV as A$}from"react/jsx-dev-runtime";var $J=b5(A5),M5=200,y5=524288,R5=4096,Y6=new P5({max:M5,maxSize:y5,sizeCalculation:($)=>$.retainedChars});function X6($,J){return`${J??"__auto__"}\x00${$}`}function T5($,J){return Y6.get(X6($,J))?.root}function C5($,J,X){if($.length>R5)return;let Y=J?.length??0;Y6.set(X6($,J),{root:X,retainedChars:Math.max(1,$.length*2+Y)})}function I5($){return JJ($)&&$.type==="text"&&typeof $.value==="string"}function S5($){return JJ($)&&$.type==="element"}function k5($){return JJ($)&&$.type==="root"&&Array.isArray($.children)}function d8($,J,X=0){if(I5($))return A$(G1,{wrap:"wrap",children:$.value},X,!1,void 0,this);if(S5($)){let Y=$.properties?.className?.[0]||"",Z=J.default;if(Y.includes("comment"))Z=J.comment;else if(Y.includes("string"))Z=J.string;else if(Y.includes("number"))Z=J.number;else if(Y.includes("keyword"))Z=J.keyword;else if(Y.includes("function"))Z=J.function;else if(Y.includes("variable"))Z=J.variable;else if(Y.includes("operator"))Z=J.operator;else if(Y.includes("type"))Z=J.type;else if(Y.includes("tag"))Z=J.tag;else if(Y.includes("attr"))Z=J.attr;let Q=$.children?.map((K,U)=>d8(K,J,U));return A$(G1,{color:Z,wrap:"wrap",children:Q},X,!1,void 0,this)}if(k5($))return A$(J6.Fragment,{children:$.children.map((Y,Z)=>d8(Y,J,Z))},X,!1,void 0,this);return A$(G1,{},X,!1,void 0,this)}function f5($,J,X){let Y=X||K$.getTheme().colors.syntax;try{let Z=T5($,J);if(Z)return d8(Z,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$(G1,{color:Y.default,wrap:"wrap",children:$},void 0,!1,void 0,this);return C5($,J,Q),d8(Q,Y)}catch(Z){return A$(G1,{color:Y.default,wrap:"wrap",children:$},void 0,!1,void 0,this)}}var l8=J6.memo(({content:$,language:J,showLineNumbers:X=!0,terminalWidth:Y,availableHeight:Z})=>{let Q=P0(),K=$.split(`
134
- `),U=0;if(Z&&K.length>Z){let z=Math.max(Z,e4);if(K.length>z)U=K.length-z,K=K.slice(U)}let G=K.length+U,q=String(G).length+1,O=Math.max(20,Y-4);return A$(c8,{borderStyle:"round",borderColor:Q.colors.border.light,paddingX:1,paddingY:0,marginY:1,flexDirection:"column",children:[J&&A$(c8,{marginBottom:0,children:A$(G1,{color:Q.colors.text.secondary,children:J},void 0,!1,void 0,this)},void 0,!1,void 0,this),U>0&&A$(c8,{marginBottom:0,children:A$(G1,{color:Q.colors.text.muted,dimColor:!0,children:["... ",U," lines hidden ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),A$($6,{maxWidth:O,maxHeight:Z,children:K.map((z,_)=>{let W=_+U+1;return A$(c8,{flexDirection:"row",children:[X&&A$(G1,{color:Q.colors.text.muted,dimColor:!0,wrap:"truncate",children:[String(W).padStart(q-1," ")," "]},void 0,!0,void 0,this),z.trim()===""?A$(G1,{wrap:"wrap",children:" "},void 0,!1,void 0,this):f5(z,J,Q.colors.syntax)]},_,!0,void 0,this)})},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as Z6,Text as T$}from"ink";import v5,{useState as D5}from"react";import{jsxDEV as b$}from"react/jsx-dev-runtime";var Q6=400;function V5($){let J=$.split(`
135
- `),X=[],Y=0,Z=0;for(let Q of J){if(Q.startsWith("---")||Q.startsWith("+++"))continue;if(Q.startsWith("@@")){let K=Q.match(/@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@/);if(K)Y=parseInt(K[1],10),Z=parseInt(K[3],10);X.push({type:"header",content:Q});continue}if(Q.startsWith("-")){X.push({type:"remove",content:Q.substring(1),lineNumber:Y}),Y++;continue}if(Q.startsWith("+")){X.push({type:"add",content:Q.substring(1),lineNumber:Z}),Z++;continue}if(Q.startsWith(" ")||Q===""){X.push({type:"context",content:Q.substring(1),lineNumber:Z}),Y++,Z++;continue}}return X}var YJ=v5.memo(({patch:$,startLine:J,matchLine:X,terminalWidth:Y,maxLines:Z=20,isFocused:Q=!1})=>{let K=P0(),U=V5($),[G,q]=D5(!1);q0((F)=>{if(F.toLowerCase()==="e")q((S)=>!S)},{isActive:Q&&U.length>Z});let z=Math.max(...U.map((F)=>F.lineNumber||0)).toString().length+1,_=U.filter((F)=>F.type==="add").length,W=U.filter((F)=>F.type==="remove").length,L=U.length,N=L>Z,B;if(!N)B=U;else if(G)B=U.slice(0,Q6);else B=U.slice(0,Z);let I=L-B.length;return b$(Z6,{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:[G?`已展开 ${B.length}/${L} 行`:`显示前 ${Z} 行,共 ${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),B.map((F,S)=>{if(F.type==="header")return b$(T$,{color:K.colors.muted,dimColor:!0,children:F.content},S,!1,void 0,this);let y=F.lineNumber?F.lineNumber.toString().padStart(z," "):" ".repeat(z),b=" ",A,P;if(F.type==="add")b="+",P=K.colors.success,A=void 0;else if(F.type==="remove")b="-",P=K.colors.error,A=void 0;else P=K.colors.text.primary;let w=Math.max(0,Y-z-2),V=F.content;if(V.length>w)V=V.substring(0,w-3)+"...";return b$(T$,{color:P,backgroundColor:A,children:[b$(T$,{dimColor:!0,children:y},void 0,!1,void 0,this),b$(T$,{children:b},void 0,!1,void 0,this),b$(T$,{children:[" ",V]},void 0,!0,void 0,this)]},S,!0,void 0,this)}),N&&b$(Z6,{marginTop:1,children:G?b$(T$,{color:K.colors.info,dimColor:!0,children:[I>0?`已达显示上限 ${Q6} 行,仍有 ${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 XJ,Text as K6}from"ink";import j5 from"react";import{jsxDEV as W2}from"react/jsx-dev-runtime";var E5=({itemText:$,type:J,marker:X,leadingWhitespace:Y=""})=>{let Z=J==="ol"?`${X}. `:`${X} `,Q=Z.length,K=Y.length;return W2(XJ,{paddingLeft:K+1,flexDirection:"row",children:[W2(XJ,{width:Q,children:W2(K6,{children:Z},void 0,!1,void 0,this)},void 0,!1,void 0,this),W2(XJ,{flexGrow:1,children:W2(K6,{wrap:"wrap",children:W2(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)},ZJ=j5.memo(E5);import{Text as QJ}from"ink";import h5,{useMemo as g5}from"react";import U6 from"string-width";import{jsxDEV as KJ}from"react/jsx-dev-runtime";var G6=4,L2=3,m5=4,q6=h5.memo(({headers:$,rows:J,terminalWidth:X})=>{let Y=P0(),Z=g5(()=>{if($.length===0||J.length===0)return null;let z=$.length,_=$.map((P,w)=>{let V=Math.max(r4(P),L2);for(let T of J)V=Math.max(V,r4(T[w]||""));return V}),W=$.map((P,w)=>{let V=Math.max(l4(P),L2);for(let T of J)V=Math.max(V,l4(T[w]||""));return V}),L=1+z*3,N=Math.max(X-L-G6,z*L2),B=_.reduce((P,w)=>P+w,0),I=W.reduce((P,w)=>P+w,0),F=!1,S;if(I<=N)S=W;else if(B<=N){let P=N-B,w=W.map((T,k)=>T-_[k]),V=w.reduce((T,k)=>T+k,0);S=_.map((T,k)=>{if(V===0)return T;let M=Math.floor(w[k]/V*P);return T+M})}else{F=!0;let P=N/B;S=_.map((w)=>Math.max(Math.floor(w*P),L2))}function y(){let P=1;for(let w=0;w<$.length;w++){let V=N2($[w],S[w],F);P=Math.max(P,V.length)}for(let w of J)for(let V=0;V<w.length;V++){let T=N2(w[V]||"",S[V],F);P=Math.max(P,T.length)}return P}if(y()>m5)return{type:"vertical",columnWidths:S,needsHardWrap:F};return{type:"horizontal",columnWidths:S,needsHardWrap:F}},[$,J,X]);if(!Z)return null;if(Z.type==="vertical"){let z=Math.min(X-1,40),_="─".repeat(z);return KJ(QJ,{children:J.map((W,L)=>{let N=[];if(L>0)N.push(_);return W.forEach((B,I)=>{let F=$[I]||`Column ${I+1}`,S=(B||"").replace(/\n+/g," ").trim();N.push(`\x1B[1m${F}:\x1B[22m ${S}`)}),N.join(`
136
- `)}).join(`
137
- `)},void 0,!1,void 0,this)}let{columnWidths:Q,needsHardWrap:K}=Z;function U(z){let W={top:{left:"┌",mid:"┬",right:"┐",h:"─"},middle:{left:"├",mid:"┼",right:"┤",h:"─"},bottom:{left:"└",mid:"┴",right:"┘",h:"─"}}[z],L=W.left;return Q.forEach((N,B)=>{L+=W.h.repeat(N+2),L+=B<Q.length-1?W.mid:W.right}),L}function G(z,_){let W=z.map((I,F)=>{let S=Q[F]||L2;return N2(I||"",S,K)}),L=Math.max(...W.map((I)=>I.length),1),N=W.map((I)=>Math.floor((L-I.length)/2)),B=[];for(let I=0;I<L;I++){let F="│";for(let S=0;S<z.length;S++){let y=W[S],b=N[S],A=I-b,P=A>=0&&A<y.length?y[A]:"",w=Q[S]||L2,V=U6(P),T=rY(_?`\x1B[1m${P}\x1B[22m`:P,V,w,_?"center":"left");F+=` ${T} │`}B.push(F)}return B}let q=[];if(q.push(U("top")),q.push(...G($,!0)),q.push(U("middle")),J.forEach((z,_)=>{if(q.push(...G(z,!1)),_<J.length-1)q.push(U("middle"))}),q.push(U("bottom")),Math.max(...q.map((z)=>U6(z)))>X-G6){let z=Math.min(X-1,40),_="─".repeat(z);return KJ(QJ,{children:J.map((W,L)=>{let N=[];if(L>0)N.push(_);return W.forEach((B,I)=>{let F=$[I]||`Column ${I+1}`,S=(B||"").replace(/\n+/g," ").trim();N.push(`\x1B[1m${F}:\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 p5=($,J,X)=>{switch($){case"user":return{color:J.info,prefix:"> "};case"assistant":return{color:J.success,prefix:"• "};case"system":return{color:J.warning,prefix:" "};case"tool":{let Y=X&&"phase"in X?X.phase:void 0;return{color:J.text.secondary,prefix:Y==="start"?"• ":Y==="complete"?" └ ":" "}}default:return{color:J.text.primary,prefix:" "}}},x5=c1.memo(({content:$,language:J,terminalWidth:X,isPending:Y=!1,availableHeight:Z})=>{let Q=P0();if(Y&&Z!==void 0){let K=$.split(`
141
- `),U=4,G=Math.max(1,Z-4);if(K.length>G){let q=K.slice(0,G).join(`
142
- `);return u(L0,{flexDirection:"column",flexShrink:0,children:[u(l8,{content:q,language:J,showLineNumbers:!0,terminalWidth:X},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(l8,{content:$,language:J,showLineNumbers:!0,terminalWidth:X},void 0,!1,void 0,this)}),u5=c1.memo(({content:$,level:J})=>{let X=P0();switch(J){case 1:return u(k0,{bold:!0,color:X.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:X.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:X.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:X.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)}}),c5=c1.memo(({terminalWidth:$})=>{let J=P0(),X=Math.max(0,Math.min($-4,80));return u(k0,{dimColor:!0,color:J.colors.text.muted,children:"─".repeat(X)},void 0,!1,void 0,this)}),d5=c1.memo(({content:$})=>{return u(k0,{wrap:"wrap",children:u(x$,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)}),l5=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)}),r5=c1.memo(({detail:$,terminalWidth:J})=>{let X=P0(),Y=50,Z=$.split(`
143
- `);while(Z.length>0&&Z[0].trim()==="")Z.shift();while(Z.length>0&&Z[Z.length-1].trim()==="")Z.pop();let Q=Z.length>50,K=Q?Z.slice(0,50):Z,U=K.join(`
144
- `),G=U.includes("<<<DIFF>>>"),q=U.includes("```");if(G){let O=U.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:X.colors.text.muted,children:["... 省略 ",Z.length-50," 行 ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}catch{}}if(q){let O=U.match(/```(\w+)?\s*\n([\s\S]*?)\n```/);if(O){let z=O[1]||"text",_=O[2];return u(L0,{flexDirection:"column",children:[u(l8,{content:_,language:z,showLineNumbers:!1,terminalWidth:J},void 0,!1,void 0,this),Q&&u(L0,{marginTop:1,children:u(k0,{dimColor:!0,color:X.colors.text.muted,children:["... 省略 ",Z.length-50," 行 ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}}return u(L0,{flexDirection:"column",children:[K.map((O,z)=>u(k0,{color:X.colors.text.primary,children:O},z,!1,void 0,this)),Q&&u(L0,{marginTop:1,children:u(k0,{dimColor:!0,color:X.colors.text.muted,children:["... 省略 ",Z.length-50," 行 ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});function a5($,J,X,Y=80){if(!X||J===void 0||J<=0)return{content:$,isTruncated:!1,hiddenLines:0};let Q=Math.max(1,J-8),K=Math.max(40,Y*0.8),U=Q*K;if($.length<=U)return{content:$,isTruncated:!1,hiddenLines:0};let G=Math.floor(U*0.9),q=$.length-G,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:X,metadata:Y,isPending:Z=!1,availableTerminalHeight:Q,hidePrefix:K=!1,noMargin:U=!1,renderPlainTextOnly:G=!1,streamingLines:q,streamingHiddenLines:O,messageId:z,blocksOverride:_,currentLineOverride:W,streamingMode:L="text",renderCodeBlocksAsPlainText:N=!1})=>{let B=P0(),I=_!==void 0,F=u1(()=>p5(J,B.colors,Y),[J,B.colors,Y]),{color:S,prefix:y}=F,b=y.length+1,A=u1(()=>{if(!Y||typeof Y!=="object")return null;if(!("subtaskRef"in Y))return null;let H=Y.subtaskRef;if(!H||typeof H!=="object")return null;return H},[Y]),P=J==="tool"&&Y?.phase==="start",w=!U&&!P,V=u1(()=>{if(!G)return[];return $.split(/\r?\n/)},[$,G]);if(!I&&Z){let H=q??$.split(/\r?\n/),R=O??0,v=!1,D=!1,C=!1;if(L!=="text")v=L==="code",D=L==="diff",C=L==="table";return u(L0,{flexDirection:"column",marginBottom:w?1:0,flexShrink:0,children:[R>0&&u(L0,{flexDirection:"row",flexShrink:0,children:[u(L0,{width:b,flexShrink:0},void 0,!1,void 0,this),u(k0,{color:B.colors.text.muted,dimColor:!0,children:["^ ",R," lines above (streaming...)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),H.map((x,d)=>{if(L==="text"){if(x.match(R1.codeBlock))v=!v;else if(x.match(R1.diffStart))D=!0;else if(x.match(R1.diffEnd))D=!1;else if(x.match(R1.table))C=!0;else if(C&&!x.match(R1.table))C=!1}let t=L==="text"&&!v&&!D&&!C,Q0=t?x.match(R1.ulItem):null,w0=t?x.match(R1.olItem):null,p0=Q0??w0;return u(L0,{flexDirection:"row",flexShrink:0,children:[d===0&&!K?u(L0,{marginRight:1,flexShrink:0,children:u(k0,{color:S,bold:!0,children:y},void 0,!1,void 0,this)},void 0,!1,void 0,this):u(L0,{width:b,flexShrink:0},void 0,!1,void 0,this),u(L0,{flexGrow:1,flexShrink:0,children:p0?u(ZJ,{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)]},d,!0,void 0,this)})]},void 0,!0,void 0,this)}if(!I&&G)return u(L0,{flexDirection:"column",marginBottom:w?1:0,flexShrink:0,children:V.map((H,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:y},void 0,!1,void 0,this)},void 0,!1,void 0,this):u(L0,{width:b,flexShrink:0},void 0,!1,void 0,this),u(L0,{flexGrow:1,flexShrink:0,children:u(k0,{wrap:"wrap",children:H===""?" ":H},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=z6(null);UJ(()=>{T.current=null},[z]);let k=u1(()=>{if(I)return null;if(!z)return null;return O6(z)},[z,I]);UJ(()=>{if(I)return;if(!k||!z)return;T.current={messageId:z,blocks:k}},[k,z,I]),UJ(()=>{if(I)return;if(!k||!z)return;_6(z)},[k,z,I]);let M=u1(()=>I?{content:$,isTruncated:!1,hiddenLines:0}:a5($,Q,Z,X),[$,Q,Z,X,I]),{content:j,isTruncated:i,hiddenLines:n}=M;if(!I&&J==="tool"&&Y&&"detail"in Y){let H=Y;if(H.detail)return u(L0,{flexDirection:"column",marginBottom:U?0:1,children:[u(L0,{flexDirection:"row",children:[u(L0,{marginRight:1,children:u(k0,{color:S,bold:!0,children:y},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:y.length+1,children:u(r5,{detail:H.detail,terminalWidth:X-(y.length+1)},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}let{completedContent:c,currentLine:U0}=u1(()=>{if(I)return{completedContent:"",currentLine:W??""};if(!Z)return{completedContent:j,currentLine:""};let H=j.lastIndexOf(`
146
- `);if(H===-1)return{completedContent:"",currentLine:j};return{completedContent:j.slice(0,H+1),currentLine:j.slice(H+1)}},[j,Z,I,W]),m=z6({content:"",blocks:[]}),o=u1(()=>{if(I)return _??[];if(k)return k;if(T.current&&T.current.messageId===z)return T.current.blocks;let H=m.current;if(!Z||!c.startsWith(H.content)){let C=GJ(c);return m.current={content:c,blocks:C},C}if(c===H.content)return H.blocks;let R=c.slice(H.content.length),v=GJ(R),D=[...H.blocks,...v];return m.current={content:c,blocks:D},D},[c,Z,I,_]);return u(L0,{flexDirection:"column",marginBottom:w?1:0,flexShrink:0,children:[i&&u(L0,{flexDirection:"row",flexShrink:0,children:[u(L0,{width:b,flexShrink:0},void 0,!1,void 0,this),u(k0,{color:B.colors.text.muted,dimColor:!0,children:["^ ",n," lines above (streaming...)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),o.map((H,R)=>{if(H.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:y},void 0,!1,void 0,this)},void 0,!1,void 0,this),(R>0||K)&&u(L0,{width:b,flexShrink:0},void 0,!1,void 0,this),u(L0,{flexGrow:1,flexShrink:0,children:H.type==="code"?N?u(k0,{wrap:"wrap",children:H.content},void 0,!1,void 0,this):u(x5,{content:H.content,language:H.language,terminalWidth:X-b,isPending:Z,availableHeight:Q},void 0,!1,void 0,this):H.type==="table"&&H.tableData?u(q6,{headers:H.tableData.headers,rows:H.tableData.rows,terminalWidth:X-b},void 0,!1,void 0,this):H.type==="heading"?u(u5,{content:H.content,level:H.level||1},void 0,!1,void 0,this):H.type==="list"?u(ZJ,{type:H.listType||"ul",marker:H.marker||"-",itemText:H.content,leadingWhitespace:" ".repeat(H.indentation||0)},void 0,!1,void 0,this):H.type==="hr"?u(c5,{terminalWidth:X-b},void 0,!1,void 0,this):H.type==="diff"&&H.diffData?u(YJ,{patch:H.diffData.patch,startLine:H.diffData.startLine,matchLine:H.diffData.matchLine,terminalWidth:X-b},void 0,!1,void 0,this):H.type==="command-message"?u(l5,{content:H.content},void 0,!1,void 0,this):H.type==="blockquote"&&H.blockquoteLines?u(iY,{lines:H.blockquoteLines,level:H.blockquoteLevel||1},void 0,!1,void 0,this):u(d5,{content:H.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:[o.length===0&&!K?u(L0,{marginRight:1,flexShrink:0,children:u(k0,{color:S,bold:!0,children:y},void 0,!1,void 0,this)},void 0,!1,void 0,this):u(L0,{width:b,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),A&&u(L0,{flexDirection:"row",flexShrink:0,children:[u(L0,{width:b,flexShrink:0},void 0,!1,void 0,this),u(L0,{flexDirection:"column",flexGrow:1,flexShrink:0,children:[u(k0,{color:B.colors.text.muted,children:["Subtask"," ",typeof A.agentType==="string"?`@${A.agentType}`:"",typeof A.status==="string"?` · ${A.status}`:""]},void 0,!0,void 0,this),typeof A.summary==="string"&&A.summary.trim()!==""&&u(k0,{wrap:"wrap",children:A.summary},void 0,!1,void 0,this),typeof A.childSessionId==="string"&&u(k0,{color:B.colors.text.muted,children:["Session ",A.childSessionId]},void 0,!0,void 0,this),typeof A.resumedFrom==="string"&&u(k0,{color:B.colors.text.muted,children:["Resumed from ",A.resumedFrom,typeof A.resumeDepth==="number"?` · depth ${A.resumeDepth}`:""]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},($,J)=>{return $.content===J.content&&$.role===J.role&&$.terminalWidth===J.terminalWidth&&$.isPending===J.isPending&&$.availableTerminalHeight===J.availableTerminalHeight&&$.hidePrefix===J.hidePrefix&&$.noMargin===J.noMargin&&$.renderPlainTextOnly===J.renderPlainTextOnly&&$.streamingHiddenLines===J.streamingHiddenLines&&$.streamingLines===J.streamingLines&&$.messageId===J.messageId&&$.metadata===J.metadata&&$.blocksOverride===J.blocksOverride&&$.currentLineOverride===J.currentLineOverride&&$.streamingMode===J.streamingMode&&$.renderCodeBlocksAsPlainText===J.renderCodeBlocksAsPlainText});import{jsxDEV as D0,Fragment as e5}from"react/jsx-dev-runtime";var n5=qJ.memo(({label:$,isSelected:J})=>D0(s$,{color:J?"yellow":void 0,children:$},void 0,!1,void 0,this)),t5=qJ.memo(({details:$,headerColor:J,isPlanModeExit:X,isPlanModeEnter:Y,terminalWidth:Z})=>D0(e5,{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:Z-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:Z},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 s5($,J,X,Y){return`使用 ↑↓ 选择,回车确认 · ${J||X||Y?"Y/N":$?"Y/S/N":"Y/S/P/N"} 快捷键 · Esc 取消`}var F6=qJ.memo(({details:$,onResponse:J})=>{let{stdout:X}=i5(),Y=X.columns||80,Q=r0()==="confirmation-prompt",K=h0(!1),U=$.type==="exitPlanMode",G=$.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(U){if(N==="y"){J({approved:!0,targetMode:"autoEdit"});return}if(N==="s"){J({approved:!0,targetMode:"default"});return}if(N==="n"){J({approved:!1,reason:"方案需要改进"});return}}else if(G){if(N==="y"){J({approved:!0});return}if(N==="n"){J({approved:!1,reason:"用户拒绝进入 Plan 模式"});return}}else if(q){if(N==="y"){J({approved:!0});return}if(N==="n"){J({approved:!1,reason:"用户选择停止"});return}}else if(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=N6(()=>{if(U)return[{key:"approve-auto",label:"[Y] 批准,自动执行",value:{approved:!0,targetMode:"autoEdit"}},{key:"approve-default",label:"[S] 批准,逐步确认",value:{approved:!0,targetMode:"default"}},{key:"reject",label:"[N] 继续优化方案",value:{approved:!1,reason:"方案需要改进"}}];if(G)return[{key:"approve",label:"[Y] 进入规划模式",value:{approved:!0}},{key:"reject",label:"[N] 直接执行",value:{approved:!1,reason:"用户拒绝进入 Plan 模式"}}];if(q)return[{key:"continue",label:"[Y] 继续执行",value:{approved:!0}},{key:"stop",label:"[N] 停止",value:{approved:!1,reason:"用户选择停止"}}];if(O)return[{key:"approve-once",label:"[Y] 允许本次 Sampling",value:{approved:!0,scope:"once"}},{key:"reject",label:"[N] 拒绝",value:{approved:!1,reason:"用户拒绝 MCP Sampling"}}];return[{key:"approve-once",label:"[Y] 允许(仅本次)",value:{approved:!0,scope:"once"}},{key:"approve-session",label:"[S] 允许(本次会话)",value:{approved:!0,scope:"session"}},{key:"approve-project",label:"[P] 允许并记住(本项目)",value:{approved:!0,scope:"project"}},{key:"reject",label:"[N] 拒绝",value:{approved:!1,reason:"用户拒绝"}}]},[U,G,q,O]),_=N6(()=>{if(U)return{color:"cyan",title:"方案审核"};if(G)return{color:"magenta",title:"进入规划模式"};if(q)return{color:"yellow",title:"已达最大轮次"};return{color:"yellow",title:$.title||"操作确认"}},[U,G,q,$.title]);return D0(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(t5,{details:$,headerColor:_.color,isPlanModeExit:U,isPlanModeEnter:G,terminalWidth:Y},void 0,!1,void 0,this),D0(v$,{flexDirection:"column",children:[D0(s$,{color:"gray",children:s5(U,G,q,O)},void 0,!1,void 0,this),D0(o5,{items:z,isFocused:Q,itemComponent:n5,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 F0}from"ink";import H6 from"ink-text-input";import{useState as q1}from"react";import{jsxDEV as l}from"react/jsx-dev-runtime";var u2=[{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"}],r8=[{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"}],a8=[{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"}],$7=[`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"],W6=({workspaceRoot:$,sessionId:J,onClose:X,onSave:Y})=>{let Z=K$.getTheme(),[Q,K]=q1("action"),[U,G]=q1(0),[q,O]=q1(0),[z,_]=q1(0),[W,L]=q1(""),[N,B]=q1(""),[I,F]=q1(null),[S,y]=q1(!1),[b,A]=q1(null),P=u2[U],w=a8[q],V=r8[z],T=()=>{if(b){A(null);return}switch(Q){case"action":X();break;case"event":K("action");break;case"matcher":K("event");break;case"command":K("matcher");break;case"location":K("command");break;case"confirm":K("location");break}};q0((o,H)=>{if(H.escape){T();return}if(Q==="action"){if(H.upArrow)G((R)=>R>0?R-1:u2.length-1);else if(H.downArrow)G((R)=>R<u2.length-1?R+1:0);else if(H.return)k()}else if(Q==="event"){if(H.upArrow)O((R)=>R>0?R-1:a8.length-1);else if(H.downArrow)O((R)=>R<a8.length-1?R+1:0);else if(H.return)K("matcher")}else if(Q==="location"){if(H.upArrow)_((R)=>R>0?R-1:r8.length-1);else if(H.downArrow)_((R)=>R<r8.length-1?R+1:0);else if(H.return)K("confirm")}else if(Q==="confirm"){if(H.return)m()}});let k=()=>{let o=u2[U].action;if(o==="add")K("event");else if(o==="status")M();else if(o==="list")n();else if(o==="enable")y$.getInstance().enableSession(J,$),A("Hooks enabled for this session");else if(o==="disable")y$.getInstance().disableSession(J,$),A("Hooks disabled for this session");else if(o==="trust")j();else if(o==="revoke")i()},M=async()=>{let o=y$.getInstance(),H=o.isEnabled($,J),R=o.getConfig($),v=await o.getTrustStatus($),D={};for(let x of Object.values(OJ)){let d=R[x];if(d&&Array.isArray(d)){let t=d.reduce((Q0,w0)=>Q0+(w0.hooks?.length||0),0);if(t>0)D[x]=t}}let C=[`Status: ${H?"Enabled":"Disabled"}`,`Trust: ${v.state}`,`Digest: ${v.currentDigest??"none"}`,""];if(Object.keys(D).length>0){C.push("Configured hooks:");for(let[x,d]of Object.entries(D))C.push(` ${x}: ${d} hook(s)`)}else C.push("No hooks configured");A(C.join(`
147
- `))},j=async()=>{try{let o=await y$.getInstance().trustProject($);A(`Trust: ${o.state}
148
- Digest: ${o.currentDigest??"none"}`)}catch(o){F(o instanceof Error?o.message:"Failed to trust hooks")}},i=async()=>{try{let o=await y$.getInstance().revokeProjectTrust($);A(`Trust: ${o.state}`)}catch(o){F(o instanceof Error?o.message:"Failed to revoke hook trust")}},n=()=>{let H=y$.getInstance().getConfig($),R=[],v=!1;for(let D of Object.values(OJ)){let C=H[D];if(!C||!Array.isArray(C)||C.length===0)continue;v=!0,R.push(`${D}:`);for(let x of C){let d=x.matcher,t="all";if(d?.tools)t=`tools: ${Array.isArray(d.tools)?d.tools.join(", "):d.tools}`;R.push(` [${t}]`);for(let Q0 of x.hooks||[])if(Q0.type==="command")R.push(` -> ${Q0.command}`)}R.push("")}if(!v)R.push("No hooks configured"),R.push(""),R.push("Configure hooks in .blade/settings.local.json");A(R.join(`
149
- `))},c=()=>{K("command")},U0=()=>{if(!N.trim()){F("Command cannot be empty");return}F(null),K("location")},m=async()=>{y(!0),F(null);try{let o=y$.getInstance(),H=await import("node:fs/promises"),R=await import("node:path"),v=await import("node:os"),D={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(v.homedir(),".blade","settings.json");break}await H.mkdir(R.dirname(C),{recursive:!0});let x={};try{let w0=await H.readFile(C,"utf-8");x=JSON.parse(w0)}catch{}let d=x.hooks||{},t=d[w.event]||[],Q0={...d,enabled:!0,[w.event]:[...t,D]};if(x.hooks=Q0,await H.writeFile(C,JSON.stringify(x,null,2),"utf-8"),await o.reloadConfig($),Y)Y({event:w.event,matcher:W.trim(),command:N.trim()});X()}catch(o){F(`Failed to save hook: ${o instanceof Error?o.message:"Unknown error"}`),y(!1)}};return l(T0,{flexDirection:"column",padding:1,children:[l(T0,{marginBottom:1,children:l(F0,{bold:!0,color:Z.colors.success,children:"Hooks Manager"},void 0,!1,void 0,this)},void 0,!1,void 0,this),l(T0,{marginBottom:1,children:l(F0,{color:Z.colors.warning,children:"[WARN] Configured hooks run only after this exact project digest is trusted. Function hooks registered by application code are exempt."},void 0,!1,void 0,this)},void 0,!1,void 0,this),b&&l(T0,{flexDirection:"column",marginBottom:1,children:[l(F0,{children:b},void 0,!1,void 0,this),l(T0,{marginTop:1,children:l(F0,{color:Z.colors.muted,children:"Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q==="action"&&!b&&l(T0,{flexDirection:"column",children:[l(T0,{flexDirection:"column",marginTop:1,children:u2.map((o,H)=>l(T0,{children:[l(F0,{color:H===U?Z.colors.primary:void 0,bold:H===U,children:[H===U?"> ":" ",o.action]},void 0,!0,void 0,this),l(F0,{color:Z.colors.muted,children:[" - ",o.description]},void 0,!0,void 0,this)]},o.action,!0,void 0,this))},void 0,!1,void 0,this),l(T0,{marginTop:1,children:l(F0,{color:Z.colors.muted,children:"Up/Down to select · Enter to continue · Esc to close"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q==="event"&&l(T0,{flexDirection:"column",children:[l(F0,{bold:!0,children:"Select Event:"},void 0,!1,void 0,this),l(T0,{flexDirection:"column",marginTop:1,children:a8.map((o,H)=>l(T0,{children:[l(F0,{color:H===q?Z.colors.primary:void 0,bold:H===q,children:[H===q?"> ":" ",o.event]},void 0,!0,void 0,this),l(F0,{color:Z.colors.muted,children:[" - ",o.description]},void 0,!0,void 0,this)]},o.event,!0,void 0,this))},void 0,!1,void 0,this),l(T0,{marginTop:1,children:l(F0,{color:Z.colors.muted,children:"Up/Down to select · Enter to continue · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q!=="event"&&l(T0,{marginBottom:1,children:l(F0,{children:["Event:"," ",l(F0,{bold:!0,color:Z.colors.primary,children:w.event},void 0,!1,void 0,this),l(F0,{color:Z.colors.muted,children:[" - ",w.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")&&l(T0,{flexDirection:"column",marginBottom:1,children:[l(F0,{color:Z.colors.muted,children:"Input to command is JSON of tool call arguments."},void 0,!1,void 0,this),l(F0,{color:Z.colors.muted,children:"Exit code 0 - stdout/stderr not shown"},void 0,!1,void 0,this),l(F0,{color:Z.colors.muted,children:"Exit code 2 - show stderr to model and block tool call"},void 0,!1,void 0,this),l(F0,{color:Z.colors.muted,children:"Other exit codes - show stderr to user only but continue with tool call"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q==="matcher"&&l(T0,{flexDirection:"column",children:[l(T0,{children:[l(F0,{bold:!0,children:"Matcher: "},void 0,!1,void 0,this),l(H6,{value:W,onChange:L,onSubmit:c,placeholder:"e.g., Read, Bash, Edit|Write (empty = all tools)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),l(T0,{marginTop:1,children:l(F0,{color:Z.colors.muted,children:"Tool name pattern (supports | for multiple). Leave empty to match all."},void 0,!1,void 0,this)},void 0,!1,void 0,this),l(T0,{marginTop:1,children:l(F0,{color:Z.colors.muted,children:"Enter to continue · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),(Q==="command"||Q==="confirm")&&l(T0,{marginBottom:1,children:l(F0,{children:["Matcher: ",l(F0,{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"&&l(T0,{flexDirection:"column",children:[l(T0,{children:l(F0,{bold:!0,children:"Command: "},void 0,!1,void 0,this)},void 0,!1,void 0,this),l(T0,{borderStyle:"single",borderColor:Z.colors.border.light,paddingX:1,marginTop:1,children:l(H6,{value:N,onChange:B,onSubmit:U0,placeholder:"Enter shell command..."},void 0,!1,void 0,this)},void 0,!1,void 0,this),l(T0,{flexDirection:"column",marginTop:1,children:[l(F0,{bold:!0,children:"Examples:"},void 0,!1,void 0,this),$7.map((o,H)=>l(F0,{color:Z.colors.muted,children:["• ",o]},H,!0,void 0,this))]},void 0,!0,void 0,this),l(T0,{marginTop:1,children:l(F0,{color:Z.colors.muted,children:"Enter to continue · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q==="location"&&l(T0,{flexDirection:"column",children:[l(T0,{flexDirection:"column",borderStyle:"round",borderColor:Z.colors.border.light,paddingX:2,paddingY:1,marginBottom:1,children:[l(F0,{bold:!0,color:Z.colors.primary,children:"Save hook configuration"},void 0,!1,void 0,this),l(F0,{children:" "},void 0,!1,void 0,this),l(F0,{children:[" ","Event: ",w.event," - ",w.description]},void 0,!0,void 0,this),l(F0,{children:[" Matcher: ",W||"(all)"]},void 0,!0,void 0,this),l(F0,{children:[" Command: ",N]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),l(F0,{bold:!0,children:"Where should this hook be saved?"},void 0,!1,void 0,this),l(T0,{flexDirection:"column",marginTop:1,children:r8.map((o,H)=>l(T0,{children:[l(F0,{color:H===z?Z.colors.primary:void 0,bold:H===z,children:[H===z?"> ":" ",H+1,". ",o.name]},void 0,!0,void 0,this),l(F0,{color:Z.colors.muted,children:[" ",o.description]},void 0,!0,void 0,this)]},o.location,!0,void 0,this))},void 0,!1,void 0,this),l(T0,{marginTop:1,children:l(F0,{color:Z.colors.muted,children:"Enter to confirm · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Q==="confirm"&&l(T0,{flexDirection:"column",children:[l(T0,{flexDirection:"column",borderStyle:"round",borderColor:Z.colors.success,paddingX:2,paddingY:1,children:[l(F0,{bold:!0,children:["Saving hook to ",V.description,"..."]},void 0,!0,void 0,this),l(F0,{children:" "},void 0,!1,void 0,this),l(F0,{children:["Event: ",w.event]},void 0,!0,void 0,this),l(F0,{children:["Matcher: ",W||"(all tools)"]},void 0,!0,void 0,this),l(F0,{children:["Command: ",N]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),l(T0,{marginTop:1,children:l(F0,{color:Z.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&&l(T0,{marginTop:1,children:l(F0,{color:Z.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 E6}from"ahooks";import{Box as w7,Text as B7}from"ink";import A7 from"react";import{useMemoizedFn as o8}from"ahooks";import l1 from"chalk";import{Text as F7}from"ink";import{useEffect as D6,useRef as c2}from"react";var i8={TIMEOUT_MS:100,RAPID_INPUT_THRESHOLD_MS:150,LARGE_INPUT_THRESHOLD:300,MEDIUM_SIZE_MULTI_CHUNK_THRESHOLD:200};function L6($){return typeof $==="string"&&/^[0-9a-f]{32}$/.test($)}function J7($){if(!L6($))throw Error("TUI composer ready nonce must be 32 lowercase hexadecimal chars");return`\x1B]99;blade-composer-ready=${$}\x07`}function Y7($=process.env){let J=$.BLADE_TUI_COMPOSER_READY_NONCE;if(!L6(J))return;return J7(J)}function w6($=process.env,J=(X)=>process.stdout.write(X)){let X=Y7($);if(!X)return!1;return J(X),!0}var d1="\x1B",X7=`${d1}[200~`,Z7=`${d1}[201~`,Q7="[200~",K7="[201~",U7=[`${d1}[I`,`${d1}[O`,"[I","[O"],b6=`${d1}[?2004h`,P6=`${d1}[?2004l`,NJ=`${d1}[?1004l`,G7=[X7,Q7],q7=[Z7,K7];function M6(){return{pasteBuffer:null,pasteOverflowed:!1}}function B6($,J){let X;for(let Y of J){let Z=$.indexOf(Y);if(Z===-1)continue;if(!X||Z<X.index||Z===X.index&&Y.length>X.marker.length)X={index:Z,marker:Y}}return X}function A6($){return U7.some((J)=>$===J)}function y6($,J){let X=J,Y=$.pasteBuffer,Z=$.pasteOverflowed,Q=Y!==null,K=[];while(X.length>0){if(Y!==null){let q=B6(X,q7);if(!q){if(Y.length+X.length>_J)Y="",Z=!0;else if(!Z)Y+=X;X="";break}if(Y.length+q.index>_J)Z=!0;else if(!Z)Y+=X.slice(0,q.index),K.push({kind:"paste",text:Y});Y=null,Z=!1,Q=!0,X=X.slice(q.index+q.marker.length);continue}let U=B6(X,G7);if(!U){if(A6(X))Q=!0;else K.push({kind:"text",text:X});X="";break}let G=X.slice(0,U.index);if(G&&!A6(G))K.push({kind:"text",text:G});Y="",Z=!1,Q=!0,X=X.slice(U.index+U.marker.length)}if(J.length===0&&Y!==null)Q=!0;return{handled:Q,state:{pasteBuffer:Y,pasteOverflowed:Z},segments:K}}import{execSync as w2}from"node:child_process";import{existsSync as z7,readFileSync as FJ}from"node:fs";import{basename as R6,isAbsolute as O7}from"node:path";function T6($){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 C6(){let $=process.platform,J={darwin:"/tmp/blade_cli_latest_screenshot.png",linux:"/tmp/blade_cli_latest_screenshot.png",win32:process.env.TEMP?`${process.env.TEMP}\\blade_cli_latest_screenshot.png`:"C:\\Temp\\blade_cli_latest_screenshot.png"},X={darwin:{checkImage:"osascript -e 'the clipboard as «class PNGf»'",saveImage:(Y)=>`osascript -e 'set png_data to (the clipboard as «class PNGf»)' -e 'set fp to open for access POSIX file "${Y}" with write permission' -e 'write png_data to fp' -e 'close access fp'`,getPath:"osascript -e 'get POSIX path of (the clipboard as «class furl»)'",deleteFile:(Y)=>`rm -f "${Y}"`},linux:{checkImage:'xclip -selection clipboard -t TARGETS -o | grep -E "image/(png|jpeg|jpg|gif|webp)"',saveImage:(Y)=>`xclip -selection clipboard -t image/png -o > "${Y}" || wl-paste --type image/png > "${Y}"`,getPath:"xclip -selection clipboard -t text/plain -o",deleteFile:(Y)=>`rm -f "${Y}"`},win32:{checkImage:'powershell -Command "(Get-Clipboard -Format Image) -ne $null"',saveImage:(Y)=>`powershell -Command "$img = Get-Clipboard -Format Image; if ($img) { $img.Save('${Y.replace(/\\/g,"\\\\")}', [System.Drawing.Imaging.ImageFormat]::Png) }"`,getPath:'powershell -Command "Get-Clipboard"',deleteFile:(Y)=>`del /f "${Y}"`}};return{commands:X[$]||X.linux,screenshotPath:J[$]||J.linux}}function _7(){let{commands:$}=C6();try{return w2($.getPath,{encoding:"utf-8"}).trim()}catch(J){return console.error("Failed to get clipboard path:",J),null}}function I6($){if($.startsWith('"')&&$.endsWith('"')||$.startsWith("'")&&$.endsWith("'"))return $.slice(1,-1);return $}function S6($){if(process.platform==="win32")return $;let J="__DOUBLE_BACKSLASH__";return $.replace(/\\\\/g,J).replace(/\\(.)/g,"$1").replace(new RegExp(J,"g"),"\\")}function HJ($){let J=I6($.trim()),X=S6(J);return/\.(png|jpe?g|gif|webp)$/i.test(X)}function N7($){let J=I6($.trim()),X=S6(J);if(HJ(X))return X;return null}async function k6($){let J=N7($);if(!J)return null;let X;try{if(O7(J))X=FJ(J);else{let K=_7();if(K&&J===R6(K))X=FJ(K);else return null}}catch(K){return console.error("Failed to read image file:",K),null}let Y=X.toString("base64"),Z=T6(Y),Q=R6(J);return{path:J,base64:Y,mediaType:Z,filename:Q}}async function f6(){let $=process.platform,J={darwin:"pbpaste",linux:"xclip -selection clipboard -o || wl-paste",win32:'powershell -Command "Get-Clipboard"'},X=J[$]||J.linux;try{return w2(X,{encoding:"utf-8"})||null}catch{return null}}async function v6(){let{commands:$,screenshotPath:J}=C6();try{if(w2($.checkImage,{stdio:"ignore"}),w2($.saveImage(J),{stdio:"ignore"}),!z7(J))return null;let Y=FJ(J).toString("base64"),Z=T6(Y);return w2($.deleteFile(J),{stdio:"ignore"}),{base64:Y,mediaType:Z}}catch(X){try{w2($.deleteFile(J),{stdio:"ignore"})}catch{}return null}}import{jsxDEV as L7}from"react/jsx-dev-runtime";var H7=/\r\n/g,W7=/\r/g;function WJ($){if(!$.includes("\r"))return $;return $.replace(H7,`
150
- `).replace(W7,`
151
- `)}function V6($,J,X){let Y=Math.max(0,Math.min(X,J.length)),Z=J.slice(0,Y),Q=J.slice(Y);return{newValue:Z+$+Q,newCursorPosition:Y+$.length}}function j6({value:$,placeholder:J="",focus:X=!0,onChange:Y,cursorPosition:Z,onChangeCursorPosition:Q,onPaste:K,onImagePaste:U,disabledKeys:G=[]}){let q=c2(M6()),O=c2($),z=c2(Z),_=c2(null),W=c2(!1);D6(()=>{O.current=$,z.current=Z},[$,Z]),D6(()=>{if(Z>$.length)Q($.length)},[$,Z,Q]);let L=o8((b,A)=>{let P=O.current,w=z.current;if(O.current=b,z.current=A,b!==P)Y(b);if(A!==w)Q(A)}),N=o8((b)=>{if(!b)return;let{newValue:A,newCursorPosition:P}=V6(WJ(b),O.current,z.current);L(A,P)}),B=o8(async(b)=>{let A=WJ(b);if(!A)return;if(U&&HJ(A))try{let w=await k6(A);if(w){let V=await U(w.base64,w.mediaType,w.filename);if(V?.prompt)N(V.prompt);return}}catch(w){console.error("Failed to process image path:",w)}if((A.length>i8.LARGE_INPUT_THRESHOLD||A.includes(`
152
- `))&&K){let w=await K(A);if(w?.prompt){N(w.prompt);return}}N(A)}),I=o8((b)=>{let A=_.current;if(!A){try{let w=b();if(!w)return;let V=w.catch(()=>{return});_.current=V,V.finally(()=>{if(_.current===V)_.current=null})}catch{}return}let P=A.then(b).then(()=>{return}).catch(()=>{return});_.current=P,P.finally(()=>{if(_.current===P)_.current=null})});q0((b,A)=>{return I(()=>{let P=WJ(b),w=y6(q.current,P);if(q.current=w.state,w.handled)return(async()=>{for(let i of w.segments)if(i.kind==="paste")await B(i.text);else N(i.text)})();if(G.some((i)=>A[i])||A.ctrl&&b==="c"||A.ctrl&&b==="l"||A.ctrl&&b==="t"||A.ctrl&&b==="o"||A.meta&&b==="l"||A.meta&&b==="t"||A.meta&&b==="o"||A.shift&&A.tab||P==="?"&&O.current==="")return;let T=O.current,k=z.current,M=k,j=T;if(A.leftArrow)M--;else if(A.rightArrow)M++;else if(A.backspace||A.delete){if(b===""){if(k>0)j=T.slice(0,k-1)+T.slice(k,T.length),M--}else if(k<T.length)j=T.slice(0,k)+T.slice(k+1,T.length)}else if(A.ctrl&&P==="a")M=0;else if(A.ctrl&&P==="e")M=T.length;else if(A.ctrl&&P==="k")j=T.slice(0,k);else if(A.ctrl&&P==="u")j=T.slice(k),M=0;else if(A.ctrl&&P==="w"){let n=T.slice(0,k).match(/\s*\S+\s*$/);if(n){let c=n[0].length;j=T.slice(0,k-c)+T.slice(k),M-=c}}else if(A.ctrl&&P==="v"){let i=process.platform==="darwin";return(async()=>{if(U){let c=await v6();if(c){let U0=await U(c.base64,c.mediaType,"clipboard.png");if(U0?.prompt)N(U0.prompt);return}}if(i)return;let n=await f6();if(n)await B(n)})()}else if(A.pageUp)M=0;else if(A.pageDown)M=T.length;else if(P===`
153
- `&&(A.shift||A.meta)){let{newValue:i,newCursorPosition:n}=V6(P,T,k);L(i,n);return}else if(!A.ctrl&&!A.meta){if(K&&(P.length>i8.LARGE_INPUT_THRESHOLD||P.includes(`
154
- `)))return B(P);j=T.slice(0,k)+P+T.slice(k,T.length),M+=P.length}if(M<0)M=0;if(M>j.length)M=j.length;L(j,M)}),!0},{isActive:X,priority:0,onRegistered:()=>{if(W.current)return;W.current=w6()}});let F=X,S=$,y=J?l1.grey(J):void 0;if(F)if(y=J.length>0?l1.inverse(J[0])+l1.grey(J.slice(1)):l1.inverse(" "),$.length===0)S=l1.inverse(" ");else{S="";for(let b=0;b<$.length;b++)if(b===Z&&Z<$.length)S+=l1.inverse($[b]);else S+=$[b];if(Z>=$.length)S+=l1.inverse(" ")}return L7(F7,{children:J?$.length>0?S:y:S},void 0,!1,void 0,this)}import{jsxDEV as LJ}from"react/jsx-dev-runtime";var h6=A7.memo(({input:$,cursorPosition:J,onChange:X,onChangeCursorPosition:Y,onAddPasteMapping:Z,onAddImagePasteMapping:Q})=>{let U=r0()==="main-input",G=$.trimStart().startsWith("!"),q=E6((z)=>{let _=z.split(`
155
- `).length,W=z.length,L=500,N=10;if(W>500||_>10){let B=Z(z),I=z.slice(0,30).replace(/\n/g," "),F=`${W} chars, ${_} lines: ${I}...`;return{prompt:`${S8(B)}${F}${S4()}`}}return{}}),O=E6(async(z,_,W)=>{try{let L=Q(z,_);return{prompt:`${S8(L)}[Image #${L}]${S4()}`}}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(w7,{flexDirection:"row",width:"100%",paddingX:2,paddingY:0,flexShrink:0,flexGrow:0,overflow:"hidden",borderStyle:"round",borderColor:G?"yellow":"gray",children:[LJ(B7,{color:G?"yellow":"blue",bold:!0,children:G?"$ ":"> "},void 0,!1,void 0,this),LJ(j6,{value:$,cursorPosition:J,onChange:X,onChangeCursorPosition:Y,onPaste:q,onImagePaste:O,placeholder:" 输入命令...",focus:U,disabledKeys:["upArrow","downArrow","tab","return","escape"]},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as n8,Text as u$}from"ink";import I7,{useEffect as S7,useState as k7}from"react";import{useEffect as R7,useRef as T7,useState as C7}from"react";import{useEffect as b7,useRef as P7,useState as M7}from"react";var y7=15000,g6="等待用户确认...",m6=["思考中","构思中","推理中","琢磨中","分析中","斟酌中","酝酿中","推敲中","揣摩中","审视中","处理中","编排中","打磨中","编织中","拼装中","调配中","组装中","搭建中","铸造中","雕琢中","搜寻中","梳理中","排查中","勘探中","钻研中","翻阅中","遍历中","扫描中","检索中","追踪中","计算中","编译中","解析中","运算中","推演中","迭代中","收敛中","演绎中","归纳中","求解中","生成中","编写中","起草中","绘制中","勾勒中","渲染中","合成中","调和中","编曲中","烹制中","施工中","酿造中","发酵中","煎熬中","折腾中","捣鼓中","鼓捣中","腾挪中","筹备中","蓄力中"],p6=["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 x6(){if(Math.random()<0.25){let X=Math.floor(Math.random()*p6.length);return p6[X]}let J=Math.floor(Math.random()*m6.length);return m6[J]}function u6($,J,X=!1){let[Y,Z]=M7(""),Q=P7(X);return Q.current=X,b7(()=>{if(J){Z(g6);return}if(!$){Z("");return}Z((U)=>U===""||U===g6?x6():U);let K=setInterval(()=>{if(!Q.current)Z(x6())},y7);return()=>{clearInterval(K)}},[$,J]),Y}function c6($,J=!1,X=!1){let[Y,Z]=C7(0),Q=T7(null),K=u6($,J,X);return R7(()=>{if(!$){Z(0),Q.current=null;return}if(X)return;if(Q.current===null)Q.current=Date.now();let U=setInterval(()=>{if(Q.current!==null){let G=Math.floor((Date.now()-Q.current)/1000);Z(G)}},1000);return()=>{clearInterval(U)}},[$,X]),{currentPhrase:K,elapsedTime:Y}}import{jsxDEV as N$,Fragment as v7}from"react/jsx-dev-runtime";var wJ=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"],f7=80;function B2($){if($<60)return`${$}s`;let J=Math.floor($/60),X=$%60;return`${J}m ${X}s`}var d6=I7.memo(({message:$,paused:J=!1})=>{let X=Z2(),Y=Z8(),Z=nJ(),Q=oJ(),K=tJ(),U=sJ(),G=eJ(),q=X||!Y,[O,z]=k7(0),_=P0(),L=q2()>=f7,{currentPhrase:N,elapsedTime:B}=c6(q,!1,J);if(S7(()=>{if(!q||J){z(0);return}let P=setInterval(()=>{z((w)=>(w+1)%wJ.length)},150);return()=>clearInterval(P)},[q,J]),!q)return null;let I=K?.mode==="bounded_foreground"?`Provider 暂时不可用,正在有界恢复 (${K.attempt}/${K.maxRetries}),剩余约 ${B2(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,F=Q?Q.phase==="probe"?"Provider 正在执行唯一恢复探测":`Provider 故障已隔离,等待恢复探测${Q.retryAfterMs!==void 0?` (${B2(Math.max(0,Math.ceil(Q.retryAfterMs/1000)))})`:""}${Q.recoveryRemainingMs!==void 0?`,剩余预算 ${B2(Math.max(0,Math.ceil(Q.recoveryRemainingMs/1000)))}`:""}`:null,S=Z?`等待 Provider 容量(${Z.scope},队列 ${Z.queuePosition}/${Math.max(Z.queueDepth,Z.queuePosition)},已等待 ${B2(Math.max(0,Math.ceil(Z.waitMs/1000)))})`:null,y=U?U.outputStarted?`Provider 流已暂停 ${Math.ceil(U.durationMs/1000)}s,仍在等待(空闲超时上限 ${Math.ceil(U.timeoutMs/1000)}s)`:`Provider 尚未返回流数据,已等待 ${Math.ceil(U.durationMs/1000)}s(空闲超时上限 ${Math.ceil(U.timeoutMs/1000)}s)`:null,A=(G?.phase==="detected"?`检测到 ${G.toolName} 连续 ${G.runLength} 次无进展,正在要求 Agent 切换策略`:G?.phase==="halted"?`已停止 ${G.toolName} 空转循环`:null)||F||S||I||y||$||N||"正在思考中...";if(L)return N$(n8,{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:A},void 0,!1,void 0,this),B>0&&N$(v7,{children:[N$(u$,{color:_.colors.muted,children:"|"},void 0,!1,void 0,this),N$(u$,{color:_.colors.info,children:["已用时: ",B2(B)]},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$(n8,{paddingX:2,paddingBottom:1,flexDirection:"column",children:[N$(n8,{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:A},void 0,!1,void 0,this)]},void 0,!0,void 0,this),B>0&&N$(n8,{marginLeft:2,flexDirection:"row",gap:1,children:[N$(u$,{color:_.colors.info,children:["已用时: ",B2(B)]},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 e8,Text as m0,useStdout as D7}from"ink";import V7 from"ink-text-input";import j7,{useCallback as t8,useEffect as E7,useMemo as h7,useState as r1}from"react";import{jsxDEV as M0}from"react/jsx-dev-runtime";var i6=j7.memo(({details:$,onComplete:J})=>{let{stdout:X}=D7(),Y=X.columns||80,Z=r0()==="confirmation-prompt",Q=h0(!1),K=$.fields??[],[U,G]=r1("field"),[q,O]=r1(0),[z,_]=r1(()=>l6($)),[W,L]=r1(""),[N,B]=r1(0),[I,F]=r1([]),[S,y]=r1(),b=K[q],A=h7(()=>g7(b),[b]);E7(()=>{if(!b)return;let k=z[b.name];L(typeof k==="string"||typeof k==="number"?String(k):""),F(Array.isArray(k)?[...k]:[]);let M=A.findIndex((j)=>j.value===String(k));B(M>=0?M:0),y(void 0)},[z,b,A]);let P=t8((k)=>{if(_(k),q<K.length-1){O((M)=>M+1);return}G("review")},[q,K.length]),w=t8((k)=>{if(!b)return;let M={...z};if(k===void 0)delete M[b.name];else M[b.name]=k;P(M)},[z,b,P]),V=t8((k)=>{if(!b)return;try{w(r6(b,k))}catch(M){y(M instanceof Error?M.message:String(M))}},[b,w]),T=t8(()=>{try{let k=a6($,{action:"accept",content:z});J({action:k.action,...k.content?{content:k.content}:{}})}catch(k){y(k instanceof Error?k.message:String(k))}},[z,$,J]);if(q0((k,M)=>{if(M.ctrl&&k==="c"||M.meta&&k==="c"){Q();return}if(M.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(U==="review"){if(k.toLowerCase()==="y"||M.return)T();else if(k.toLowerCase()==="e")O(0),G("field");else if(k.toLowerCase()==="d")J({action:"decline"});return}if(!b){if(M.return)T();return}if(BJ(b))return;if(k.toLowerCase()==="d"){J({action:"decline"});return}if(M.upArrow){B((j)=>j>0?j-1:Math.max(A.length-1,0));return}if(M.downArrow||M.tab){B((j)=>j<A.length-1?j+1:0);return}if(k===" "&&b.type==="multi-select"){let j=A[N];if(j)F((i)=>i.includes(j.value)?i.filter((n)=>n!==j.value):[...i,j.value]);return}if(M.return)if(b.type==="multi-select")w(I);else{let j=A[N];if(j)w(j.typedValue)}},{isActive:Z}),$.mode==="url")return M0(s8,{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(U==="review")return M0(s8,{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,": ",p7(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(!b)return M0(s8,{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(s8,{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(e8,{flexDirection:"column",marginTop:1,children:[M0(m0,{bold:!0,children:[b.title,b.required?" *":""]},void 0,!0,void 0,this),b.description&&M0(m0,{color:"gray",children:b.description},void 0,!1,void 0,this),M0(m0,{color:"gray",children:m7(b)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),BJ(b)?M0(e8,{children:[M0(m0,{color:"cyan",children:"> "},void 0,!1,void 0,this),M0(V7,{value:W,onChange:L,onSubmit:V,focus:Z,placeholder:b.defaultValue===void 0?b.required?"Required":"Optional":String(b.defaultValue)},void 0,!1,void 0,this)]},void 0,!0,void 0,this):M0(e8,{flexDirection:"column",children:A.map((k,M)=>{let j=b.type==="multi-select"&&I.includes(k.value);return M0(m0,{color:N===M?"yellow":void 0,children:[N===M?"> ":" ",b.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(b)?"Enter to continue":b.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 s8({children:$,width:J,color:X}){return M0(e8,{flexDirection:"column",gap:1,borderStyle:"round",borderColor:X,padding:1,width:Math.min(J-4,88),children:$},void 0,!1,void 0,this)}function BJ($){return $.type==="string"||$.type==="number"||$.type==="integer"}function g7($){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 m7($){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 p7($){if($===void 0)return"(omitted)";if(Array.isArray($))return $.join(", ")||"(none)";return String($)}import J4 from"ansi-escapes";import{Box as C1,Static as n7,useStdout as t7}from"ink";import s7,{useEffect as O1,useMemo as RJ,useRef as I1,useState as TJ}from"react";import{Box as x7,Text as o6}from"ink";import u7 from"react";import{jsxDEV as AJ}from"react/jsx-dev-runtime";var bJ=u7.memo(({collapsedCount:$})=>{let J=P0();if($<=0)return null;let X=J.colors.text.muted;return AJ(x7,{flexDirection:"row",marginBottom:1,children:[AJ(o6,{color:X,children:[">"," ",$," 条历史消息"]},void 0,!0,void 0,this),AJ(o6,{color:X,children:" [Ctrl+O 浏览]"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});bJ.displayName="CollapsedHistorySummary";import{Box as d2,Text as l2}from"ink";import c7 from"ink-big-text";import d7 from"ink-gradient";import l7 from"react";import{jsxDEV as D$}from"react/jsx-dev-runtime";var t6=l7.memo(()=>{return D$(d2,{flexDirection:"column",paddingX:2,paddingTop:1,paddingBottom:1,children:[D$(d2,{flexDirection:"column",children:D$(d7,{name:"pastel",children:D$(c7,{text:"BLADE",font:"block"},void 0,!1,void 0,this)},void 0,!1,void 0,this)},void 0,!1,void 0,this),D$(d2,{marginBottom:1,children:D$(l2,{color:"white",dimColor:!0,children:n6()},void 0,!1,void 0,this)},void 0,!1,void 0,this),D$(d2,{flexDirection:"column",marginBottom:1,children:[D$(d2,{marginBottom:1,children:D$(l2,{color:"white",bold:!0,children:"使用指南:"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D$(l2,{color:"white",children:"1. 输入问题、编辑文件或运行命令"},void 0,!1,void 0,this),D$(l2,{color:"white",children:"2. 使用 /init 创建项目配置文件"},void 0,!1,void 0,this),D$(l2,{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 $4,Text as PJ}from"ink";import s6 from"react";import{jsxDEV as T1}from"react/jsx-dev-runtime";var e6=s6.memo(({tasks:$,visible:J=!0,compact:X=!1})=>{let{colors:Y}=P0();if(!J||$.length===0)return null;let Z={total:$.length,completed:$.filter((Q)=>Q.status==="completed").length,inProgress:$.filter((Q)=>Q.status==="in_progress").length};return T1($4,{flexDirection:"column",borderStyle:"single",borderColor:Y.border.light,paddingX:1,paddingY:X?0:1,marginBottom:1,children:[T1($4,{marginBottom:X?0:1,children:[T1(PJ,{dimColor:!0,children:"Tasks "},void 0,!1,void 0,this),T1(PJ,{color:Y.text.muted,children:[Z.completed,"/",Z.total]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),T1($4,{flexDirection:"column",children:$.map((Q,K)=>T1(r7,{task:Q,compact:X},Q.id||K,!1,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}),r7=s6.memo(({task:$,compact:J})=>{let X,Y=!1,Z;switch($.status){case"completed":X="[OK]",Y=!0,Z=$.subject;break;case"in_progress":X=">",Y=!1,Z=$.activeForm||$.subject;break;case"pending":default:X="-",Y=!0,Z=$.subject;break}return T1($4,{paddingY:J?0:0,children:T1(PJ,{dimColor:Y,children:[X," ",Z]},void 0,!0,void 0,this)},void 0,!1,void 0,this)});import{Box as MJ,Text as A2}from"ink";import a7,{useMemo as $3}from"react";import{jsxDEV as z1}from"react/jsx-dev-runtime";function i7($,J=60){if(!$)return"";let X=$.split(`
156
- `)[0]||"";if(X.length<=J)return X;return`${X.slice(0,J)}...`}function o7($){if(!$)return 0;return $.split(`
157
- `).length}var yJ=a7.memo(({content:$,isStreaming:J=!1,isExpanded:X})=>{let Y=P0(),Z=$3(()=>o7($),[$]),Q=$3(()=>i7($),[$]),K=Y.colors.info,U=Y.colors.muted;return z1(MJ,{flexDirection:"column",marginBottom:1,children:[z1(MJ,{flexDirection:"row",children:[z1(A2,{color:K,children:X?"v":">"},void 0,!1,void 0,this),z1(A2,{children:" "},void 0,!1,void 0,this),z1(A2,{color:U,children:["Thinking",J?"...":` (${Z} lines)`]},void 0,!0,void 0,this),!X&&!J&&Q&&z1(A2,{color:U,children:[" - ",Q]},void 0,!0,void 0,this),z1(A2,{color:U,dimColor:!0,children:[" ","[Ctrl+T]"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),X&&$&&z1(MJ,{marginLeft:2,marginTop:1,borderStyle:"round",borderColor:"gray",paddingX:1,paddingY:0,children:z1(A2,{color:U,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 G$}from"react/jsx-dev-runtime";var e7=({active:$=!0})=>{let J=J8(),X=N8(),Y=F8(),Z=W9(),Q=Z2(),K=X9(),U=G9(),G=Q2(),q=_8(),O=H9(),z=lJ(),_=w9(),W=L9(),{width:L,height:N}=V8(),{stdout:B}=t7(),I=P1(),[F,S]=TJ(null),[y,b]=TJ([]),[A,P]=TJ(new Set),w=I1(W),V=I1(null),T=I1(0),k=I1(0),M=I1(new Set),j=I1(new Set),i=I1([]),n=I1(null);O1(()=>{if(w.current!==W){if(w.current=W,!$)return;if(g$())k$();if(B)B.write(J4.clearTerminal);I.incrementClearCount()}},[$,W,B,I]);let c=J,U0=Z;O1(()=>{if(!Z||Q){n.current=null;return}if(n.current===Z)return;if(n.current=Z,g$())k$();if($&&B)B.write(J4.eraseScreen+J4.cursorTo(0,0));M.current=new Set,j.current=new Set(c.filter((C)=>C.role==="tool").map((C)=>C.id)),V.current=null,T.current=0,k.current=0,i.current=[],b([]),P(new Set),I.incrementClearCount(),I.clearFinalizingStreamingMessageId()},[Z,Q,B,I,c,$]);let m=X??Z;O1(()=>{if($&&g$())k$();V.current=null,T.current=0,k.current=0,M.current=new Set,j.current=new Set(c.filter((C)=>C.role==="tool").map((C)=>C.id)),i.current=[],b([]),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(c.filter((C)=>C.role==="tool").map((C)=>C.id)),i.current=[],b([])},[m,c]),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 d=x,t=i.current;if(t.length>0)if(d.some((s0)=>s0.type!=="empty"))d=[...t,...d],i.current=[];else{i.current=[...t,...d];return}let Q0=d.length;while(Q0>0&&d[Q0-1].type==="empty")Q0-=1;if(Q0!==d.length)i.current=d.slice(Q0),d=d.slice(0,Q0);if(d.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}),b((s0)=>[...s0,G$(C1,{flexDirection:"column",children:G$(t$,{content:"",role:"assistant",terminalWidth:L,isPending:!1,hidePrefix:p0,noMargin:!0,blocksOverride:d,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=c.filter((d)=>d.role==="tool"&&!C.has(d.id)&&!M.current.has(d.id));if(x.length===0)return;if($&&g$())k$();for(let d of x)M.current.add(d.id);b((d)=>[...d,...x.map((t)=>G$(C1,{flexDirection:"column",children:G$(t$,{content:t.content,role:t.role,terminalWidth:L,metadata:t.metadata,isPending:!1,messageId:t.id},void 0,!1,void 0,this)},`streaming-tool-${t.id}`,!1,void 0,this))])},[$,m,c,L]),O1(()=>{if(!$){if(g$())k$();return}if(!m){if(g$())k$();return}if(!g$())PY(L,N);else MY(L,N);let C=J3(m);if(!C||C.lines.length===0)return;let d=Math.max(1,N-8),t=Math.max(0,C.lines.length-d),Q0=C.lines.slice(-d),w0=(CJ(m)?.length??0)>0;yY(Q0,t,C.mode,w0)},[m,Y.version,N,L,$]),O1(()=>{if(!m&&g$())k$()},[m]),O1(()=>{if(F===null&&c.length>_){if(S(c.length),$&&g$())k$();if($&&B)B.write(J4.clearTerminal);I.incrementClearCount()}},[c.length,_,F,B,I,$]);let o=RJ(()=>{return K.some((C)=>C.status==="pending"||C.status==="in_progress")},[K]),H=W?0:F??0,R=H,v=RJ(()=>{let C=[];if(C.push(G$(t6,{},"header",!1,void 0,this)),R>0)C.push(G$(bJ,{collapsedCount:R},"collapsed-summary",!1,void 0,this));for(let x=H;x<c.length;x++){let d=c[x];if(U0&&d.id===U0)continue;if(d.role==="tool"&&M.current.has(d.id))continue;if(d.role==="assistant"&&A.has(d.id))continue;C.push(G$(C1,{flexDirection:"column",children:G$(t$,{content:d.content,role:d.role,terminalWidth:L,metadata:d.metadata,isPending:!1,messageId:d.id},void 0,!1,void 0,this)},d.id,!1,void 0,this))}return C},[c,H,R,L,U0,A]),D=RJ(()=>y.length>0?[...v,...y]:v,[v,y]);return G$(C1,{flexDirection:"column",paddingX:2,children:G$(C1,{flexDirection:"column",children:[G$(n7,{items:D,children:(C)=>C},z,!1,void 0,this),q&&G$(C1,{marginBottom:1,children:G$(yJ,{content:q,isStreaming:Q,isExpanded:O},void 0,!1,void 0,this)},void 0,!1,void 0,this),U&&o&&G$(C1,{marginTop:1,children:G$(e6,{tasks:K,visible:!0,compact:!1},void 0,!1,void 0,this)},void 0,!1,void 0,this),G.map((C,x)=>G$(C1,{flexDirection:"column",children:G$(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)},Y3=s7.memo(e7);import{useMemoizedFn as Y4,useMount as $Q}from"ahooks";import{Box as V$,Text as y0,useFocus as JQ,useFocusManager as YQ}from"ink";import XQ from"ink-select-input";import{memo as ZQ,useMemo as QQ,useState as X4}from"react";import{jsxDEV as z0,Fragment as GQ}from"react/jsx-dev-runtime";var KQ=({isSelected:$})=>z0(V$,{marginRight:1,children:z0(y0,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),UQ=({isSelected:$,label:J})=>z0(y0,{bold:$,color:$?"yellow":void 0,children:J},void 0,!1,void 0,this),X3=ZQ(({onClose:$,onEdit:J})=>{let X=q9(),Y=K8()??"",{isFocused:Z}=JQ({id:"model-selector"}),Q=YQ(),[K,U]=X4(""),[G,q]=X4(!1),[O,z]=X4(null),_=h0(!1),[W]=X4(()=>{let P=process.stdout?.columns||80;return Math.max(20,P-8)});$Q(()=>{if(Q?.focus("model-selector"),X.length>0)U(X[0].id)}),q0((P,w)=>{if(G)return;if(w.ctrl&&P==="c"||w.meta&&P==="c"){_();return}if(w.escape){$();return}if(!Z)return;if(P==="d"||P==="D"){N();return}if((P==="e"||P==="E")&&J)B()},{isActive:!0});let L=Y4(async(P)=>{if(G)return;let w=P.value;if(w===Y){$();return}q(!0),z(null);try{await a0().setCurrentModel(w),$()}catch(V){z(V.message),q(!1)}}),N=Y4(async()=>{if(G||K===Y)return;q(!0),z(null);try{if(await a0().removeModel(K),X.length<=1)$()}catch(P){z(P.message)}finally{q(!1)}}),B=Y4(()=>{if(G||!J)return;let P=X.find((w)=>w.id===K);if(!P)return;J(P)}),I=Y4((P)=>{U(P.value)}),F=QQ(()=>{return X.find((P)=>P.id===K)},[X,K]),S=F?Z4()?.modelProviders[F.provider]:void 0,y=X.map((P)=>{let w=P.id===Y?" (当前)":"";return{label:IJ(P)+w,value:P.id}}),b=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:[G?"处理中...":b?"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:["已配置模型 (",X.length,")"]},void 0,!0,void 0,this),z0(V$,{marginTop:1,children:z0(XQ,{items:y,onSelect:L,onHighlight:I,indicatorComponent:KQ,itemComponent:UQ},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:b?"green":"yellow",children:b?"* 当前使用":"* 可切换"},void 0,!1,void 0,this)},void 0,!1,void 0,this),F?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(F)},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??F.provider},void 0,!1,void 0,this)]},void 0,!0,void 0,this),S&&z0(GQ,{children:[z0(y0,{children:[z0(y0,{dimColor:!0,children:"Channel ID: "},void 0,!1,void 0,this),z0(y0,{children:F.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:F.model},void 0,!1,void 0,this)]},void 0,!0,void 0,this),F.overrides?.baseUrl&&z0(y0,{children:[z0(y0,{dimColor:!0,children:"Base URL override: "},void 0,!1,void 0,this),z0(y0,{color:"blueBright",children:F.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(F).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 RQ,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 Z3=({provider:$,value:J,onChange:X,onSubmit:Y,onCancel:Z,error:Q})=>{return q0((K,U)=>{if(U.escape)Z()}),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:X,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 Q4,Text as S1}from"ink";import zQ from"ink-text-input";import{useState as K4}from"react";import{jsxDEV as C$}from"react/jsx-dev-runtime";var U4=["id","name","baseUrl","model"];function Q3($){switch($){case"id":return"Channel ID";case"name":return"Channel name";case"baseUrl":return"Base URL";case"model":return"Model ID"}}function OQ($,J,X){switch($){case"id":return"team-gateway";case"name":return X||"Team Gateway";case"baseUrl":return J==="anthropic-messages"?"https://gateway.example.com":"https://gateway.example.com/v1";case"model":return J==="anthropic-messages"?"claude-opus-4-8":"vendor-model-2026"}}function _Q($,J){let X=$.id.trim(),Y={name:$.name.trim()||X,baseUrl:$.baseUrl.trim(),wireApi:J},Z=U3(X,Y);if(!$.model.trim())Z.push("Model ID must not be empty");if(Z.length>0)throw Error(Z[0]);return{provider:X,model:$.model.trim(),displayName:$.model.trim(),modelProvider:Y}}var G3=({wireApi:$,initialConfig:J,onSubmit:X,onCancel:Y})=>{let Z={id:J?.provider??"",name:J?.modelProvider?.name??"",baseUrl:J?.modelProvider?.baseUrl??"",model:J?.model??""},[Q,K]=K4(J?3:0),[U,G]=K4(J?.model??""),[q,O]=K4(Z),[z,_]=K4(),W=U4[Q];q0((N,B)=>{if(!B.escape)return;if(_(void 0),Q===0){Y();return}let I=Q-1,F=U4[I];K(I),G(q[F])});let L=(N)=>{let B=N.trim();if(W==="id"&&!K3.test(B)){_("Channel ID 必须以小写字母开头,且仅包含小写字母、数字、.、_ 或 -");return}if(W==="baseUrl")try{let F=new URL(B);if(!["http:","https:"].includes(F.protocol))throw Error()}catch{_("Base URL 必须是绝对 HTTP(S) URL");return}if(W==="model"&&!B){_("Model ID 不能为空");return}let I={...q,[W]:W==="name"&&!B?q.id:B};if(O(I),_(void 0),Q===U4.length-1){try{X(_Q(I,$))}catch(F){_(F instanceof Error?F.message:"渠道配置无效")}return}K(Q+1),G("")};return C$(Q4,{flexDirection:"column",children:[C$(Q4,{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),U4.slice(0,Q).map((N)=>C$(S1,{children:[Q3(N),": ",C$(S1,{color:"cyan",children:q[N]},void 0,!1,void 0,this)]},N,!0,void 0,this)),C$(Q4,{marginTop:1,children:[C$(S1,{bold:!0,children:[Q3(W),": "]},void 0,!0,void 0,this),C$(zQ,{value:U,onChange:(N)=>{G(N),_(void 0)},onSubmit:L,placeholder:OQ(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$(Q4,{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 O3,useState as b2}from"react";var _3=()=>{let[$,J]=b2([]),[X,Y]=b2(!0),[Z,Q]=b2(null);return O3(()=>{let K=!1;return(async()=>{try{let G=await q3();if(!K)J(G)}catch(G){if(!K)Q(G instanceof Error?G.message:"加载 Provider 列表失败")}finally{if(!K)Y(!1)}})(),()=>{K=!0}},[]),{providers:$,isLoading:X,error:Z}},N3=($)=>{let[J,X]=b2([]),[Y,Z]=b2(!1),[Q,K]=b2(null);return O3(()=>{if(!$){X([]),Z(!1),K(null);return}let U=!1;return X([]),Z(!0),K(null),(async()=>{try{let q=await z3($);if(!U)X(q)}catch(q){if(!U)K(q instanceof Error?q.message:"加载模型列表失败")}finally{if(!U)Z(!1)}})(),()=>{U=!0}},[$]),{models:J,isLoading:Y,error:Q}};import{Box as N1,Text as c$}from"ink";import NQ from"ink-select-input";import FQ from"ink-text-input";import{useMemo as F3,useState as HQ}from"react";import{jsxDEV as l0,Fragment as BQ}from"react/jsx-dev-runtime";var WQ=({isSelected:$})=>l0(N1,{marginRight:1,children:l0(c$,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),LQ=($)=>{let J=[$.name];if($.contextWindow){let X=$.contextWindow>=1e6?`${($.contextWindow/1e6).toFixed(1)}M`:$.contextWindow>=1000?`${Math.round($.contextWindow/1000)}K`:`${$.contextWindow}`;J.push(`[${X} ctx]`)}if($.reasoning)J.push("[reasoning]");if($.input.includes("image"))J.push("[vision]");if($.cost.input||$.cost.output)J.push(`[$${$.cost.input}/$${$.cost.output}]`);return J.join(" ")},wQ=({isSelected:$,label:J})=>l0(c$,{bold:$,color:$?"yellow":void 0,children:J},void 0,!1,void 0,this),H3=({provider:$,models:J,isLoading:X,error:Y,onSelect:Z,onCancel:Q})=>{let[K,U]=HQ("");q0((O,z)=>{if(z.escape)if(K)U("");else Q()});let G=F3(()=>{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=F3(()=>G.map((O)=>({key:O.id,label:LQ(O),value:O})),[G]);if(X)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(BQ,{children:[l0(N1,{marginBottom:1,children:[l0(c$,{color:"cyan",children:"> "},void 0,!1,void 0,this),l0(FQ,{value:K,onChange:U,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(NQ,{items:q,onSelect:(O)=>Z(O.value),indicatorComponent:WQ,itemComponent:wQ,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),G.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 AQ from"ink-select-input";import bQ from"ink-text-input";import{useMemo as W3,useState as PQ}from"react";import{jsxDEV as z$}from"react/jsx-dev-runtime";var MQ=({isSelected:$})=>z$(i1,{marginRight:1,children:z$(k1,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),yQ=({isSelected:$,label:J})=>z$(k1,{bold:$,color:$?"yellow":void 0,children:J},void 0,!1,void 0,this),L3=({providers:$,isLoading:J,error:X,onSelect:Y,onCancel:Z})=>{let[Q,K]=PQ("");q0((q,O)=>{if(O.escape)if(Q)K("");else Z()});let U=W3(()=>{if(!Q)return $;let q=Q.toLowerCase();return $.filter((O)=>O.name.toLowerCase().includes(q)||O.id.toLowerCase().includes(q))},[$,Q]),G=W3(()=>U.map((q)=>({key:q.id,label:`${q.name} - ${q.modelCount} models${q.configured?" [configured]":""}`,value:q})),[U]);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(X)return z$(i1,{flexDirection:"column",children:[z$(k1,{color:"red",children:X},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$(bQ,{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$(AQ,{items:G,onSelect:(q)=>Y(q.value),indicatorComponent:MQ,itemComponent:yQ,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),U.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:X,onComplete:Y,onCancel:Z})=>{let[Q,K]=o1("provider"),[U,G]=o1(),[q,O]=o1(),[z,_]=o1(),[W,L]=o1(""),[N,B]=o1(),[I,F]=o1(!1),S=_3(),y=N3(U?.id),b=h0(!1);q0((V,T)=>{if(T.ctrl&&V==="c"||T.meta&&V==="c")$==="setup"?b():Z()});let A=SJ(async(V)=>{if(!U)return;let T=z??(q?{provider:U.id,model:q.id,displayName:J?.displayName}:void 0);if(!T)return;F(!0),B(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 M=T.modelProvider?await a0().addModelWithProvider(k,T.modelProvider):await a0().addModel(k);await a0().setCurrentModel(M.id),await Y(T)}else if(X){if(T.modelProvider)await a0().updateModelWithProvider(X,k,T.modelProvider);else await a0().updateModel(X,k);await Y(T)}}catch(k){if(T.modelProvider){await Q1().credentials.delete(T.provider);let M=Z4();Q1().configureModelProviders(M?.modelProviders??{},M?.models??[])}B(k instanceof Error?k.message:"保存配置失败"),F(!1)}}),P=SJ((V)=>{if(O(V),U?.configured)A();else if(U?.supportsApiKey)K("credential");else B(`${U?.name??"Provider"} 需要 OAuth 或环境凭证,请先在外部完成认证`)}),w=SJ(()=>{if(B(void 0),Q==="credential"&&z){K("custom");return}let V=w3(Q);if(V)K(V)});return f1(RQ,{flexDirection:"column",padding:1,children:[f1(kJ,{bold:!0,color:"blue",children:$==="edit"?"编辑模型":"添加模型"},void 0,!1,void 0,this),Q==="provider"&&f1(L3,{...S,onSelect:(V)=>{G(V),O(void 0),_(void 0),K(V.factoryWireApi?"custom":"model")},onCancel:$==="setup"?()=>{return}:Z},void 0,!1,void 0,this),Q==="custom"&&U?.factoryWireApi&&f1(G3,{wireApi:U.factoryWireApi,initialConfig:z,onSubmit:(V)=>{_(V),K("credential")},onCancel:w},void 0,!1,void 0,this),Q==="model"&&U&&f1(H3,{provider:U,...y,onSelect:P,onCancel:w},void 0,!1,void 0,this),Q==="credential"&&U&&f1(Z3,{provider:U,value:W,onChange:L,onSubmit:()=>void A(W),onCancel:w,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 r2}from"ahooks";import{promises as P3}from"fs";import{Box as I$,Text as u0}from"ink";import B3 from"ink-select-input";import TQ from"ink-text-input";import CQ from"os";import G4 from"path";import{useEffect as IQ,useMemo as q4,useRef as SQ,useState as v1}from"react";import{jsxDEV as H0}from"react/jsx-dev-runtime";var a2=[{key:"allow",label:"Allow"},{key:"ask",label:"Ask"},{key:"deny",label:"Deny"},{key:"info",label:"Info"}],kQ={allow:"Add a new rule...",ask:"Add a new rule...",deny:"Add a new rule..."},fQ={allow:"Allow permission rules",ask:"Ask permission rules",deny:"Deny permission rules"},A3={project:"[项目共享配置]",global:"[用户全局配置]",local:"[本地配置]"},vQ=["project","global","local"],DQ={allow:[],ask:[],deny:[]},VQ={localExists:!1,projectExists:!1,globalExists:!1},b3={allow:[],ask:[],deny:[]};function jQ($){let J=(Y)=>Array.isArray(Y)?Y.filter((Z)=>typeof Z==="string"):[],X=$?.permissions??{};return{allow:J(X?.allow),ask:J(X?.ask),deny:J(X?.deny)}}async function EQ($){try{let J=await P3.readFile($,"utf-8"),X=JSON.parse(J);return{exists:!0,raw:X,permissions:jQ(X)}}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 hQ($,J){let X=$.padEnd(32," "),Y=J==="local"?`${A3[J]} <- 可删除`:A3[J];return`${X} ${Y}`}var M3=({onClose:$})=>{let X=r0()==="permissions-manager",Y=h0(!1),[Z,Q]=v1(0),K=a2[Z].key,[U,G]=v1(DQ),[q,O]=v1(VQ),[z,_]=v1(!0),[W,L]=v1("list"),[N,B]=v1(""),[I,F]=v1(null),[S,y]=v1(null),b=SQ(!1),A=q4(()=>G4.join(X$(),".blade","settings.local.json"),[]),P=q4(()=>G4.join(X$(),".blade","settings.json"),[]),w=q4(()=>G4.join(CQ.homedir(),".blade","settings.json"),[]),V=r2(async()=>{_(!0);let D=await Promise.all([{source:"local",path:A},{source:"project",path:P},{source:"global",path:w}].map(async({source:t,path:Q0})=>{let w0=await EQ(Q0);return{source:t,path:Q0,...w0}})),C={localExists:D.find((t)=>t.source==="local")?.exists??!1,projectExists:D.find((t)=>t.source==="project")?.exists??!1,globalExists:D.find((t)=>t.source==="global")?.exists??!1};O(C);let x={allow:[],ask:[],deny:[]},d=Object.fromEntries(D.map((t)=>[t.source,t]));["allow","ask","deny"].forEach((t)=>{vQ.forEach((Q0)=>{(d[Q0]?.permissions[t]??[]).forEach((p0,s0)=>{let j0={key:`${Q0}:${s0}:${p0}`,rule:p0,source:Q0};x[t].push(j0)})})}),G(x),_(!1)});IQ(()=>{V()},[V]);let T=r2(async(v,D)=>{try{let C=G4.join(X$(),".blade","settings.local.json"),x={allow:[],ask:[],deny:[]};try{let t=await P3.readFile(C,"utf-8"),w0=JSON.parse(t).permissions||{};x={allow:Array.isArray(w0.allow)?w0.allow:[],ask:Array.isArray(w0.ask)?w0.ask:[],deny:Array.isArray(w0.deny)?w0.deny:[]}}catch(t){}let d=D(x);await a0().updateConfig({permissions:d},{scope:"local",immediate:!0}),await V()}catch(C){throw console.error("[PermissionsManager] 修改权限规则失败:",C),C}});q0((v,D)=>{if(D.ctrl&&v==="c"||D.meta&&v==="c"){Y();return}if(W==="locked"){if(b.current){b.current=!1;return}L("list"),F(null),y(null);return}if(D.escape){if(W==="list"||K==="info")$();else L("list"),B(""),F(null),y(null);return}if(W==="list"){if(D.tab&&D.shift)Q((C)=>(C-1+a2.length)%a2.length);else if(D.tab)Q((C)=>(C+1)%a2.length);else if(v?.toLowerCase()==="q")$()}},{isActive:X});let k=r2((v)=>{let D=v.value;if(K==="info")return;if(D.type==="add"){L("add"),B(""),y(null);return}if(D.entry.source!=="local"){L("locked"),b.current=!0,F({tab:K,entry:D.entry}),y({type:"error",text:D.entry.source==="project"?"此规则定义在项目共享配置中,无法在此删除。":"此规则来自用户全局配置,无法在此删除。"});return}L("confirm-delete"),F({tab:K,entry:D.entry}),y(null)}),M=r2(async()=>{if(K==="info")return;let v=N.trim();if(!v){y({type:"error",text:"Permission rule 不能为空"});return}if(U[K].map((C)=>C.rule).includes(v)){y({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],v])],x}),L("list"),B(""),y({type:"success",text:"已添加本地权限规则"})}catch(C){y({type:"error",text:`保存失败: ${C instanceof Error?C.message:"未知错误"}`})}}),j=r2(async()=>{if(!I)return;let{tab:v,entry:D}=I;try{await T(v,(C)=>{let x={allow:[...C.allow],ask:[...C.ask],deny:[...C.deny]};return x[v]=C[v].filter((d)=>d!==D.rule),x}),L("list"),F(null),y({type:"success",text:"已删除本地权限规则"})}catch(C){y({type:"error",text:`删除失败: ${C instanceof Error?C.message:"未知错误"}`})}}),i=q4(()=>{if(K==="info")return[];let v=K;return[{key:"add-new-rule",label:`› ${kQ[v]}`,value:{type:"add"}},...U[v].map((C)=>({key:C.key,label:hQ(C.rule,C.source),value:{type:"rule",entry:C}}))]},[K,U]),n=()=>H0(I$,{marginBottom:1,children:a2.map((v,D)=>H0(I$,{marginRight:2,children:H0(u0,{color:D===Z?"yellow":"gray",children:["[",v.label,"]"]},void 0,!0,void 0,this)},v.key,!1,void 0,this))},void 0,!1,void 0,this),c=()=>H0(I$,{flexDirection:"column",gap:1,children:[H0(u0,{children:"配置文件优先级(从高到低):"},void 0,!1,void 0,this),H0(I$,{flexDirection:"column",marginLeft:2,children:[H0(u0,{children:["1. .blade/settings.local.json (本地配置,不提交 Git)"," ",q.localExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),H0(u0,{children:["2. .blade/settings.json (项目配置,提交 Git)"," ",q.projectExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),H0(u0,{children:["3. ~/.blade/settings.json (用户全局配置)"," ",q.globalExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),H0(u0,{children:"说明:"},void 0,!1,void 0,this),H0(I$,{flexDirection:"column",marginLeft:2,children:[H0(u0,{children:"- /permissions 命令只管理本地配置 (.blade/settings.local.json)"},void 0,!1,void 0,this),H0(u0,{children:"- 修改全局或项目配置请直接编辑对应文件"},void 0,!1,void 0,this),H0(u0,{children:"- 本地配置不会提交到 Git"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),U0=(v)=>H0(I$,{flexDirection:"column",gap:1,children:[H0(u0,{bold:!0,children:fQ[v]},void 0,!1,void 0,this),H0(u0,{children:"Permission rules are a tool name, optionally followed by a specifier in parentheses."},void 0,!1,void 0,this),H0(u0,{color:"gray",children:"例如: WebFetch 或 Bash(ls:*)"},void 0,!1,void 0,this),H0(I$,{marginTop:1,children:H0(TQ,{value:N,onChange:B,onSubmit:M},void 0,!1,void 0,this)},void 0,!1,void 0,this),H0(u0,{color:"gray",children:"Enter 提交 · Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),m=(v,D)=>H0(I$,{flexDirection:"column",gap:1,children:[H0(u0,{bold:!0,children:["Delete ",v," permission rule?"]},void 0,!0,void 0,this),H0(u0,{children:D.rule},void 0,!1,void 0,this),H0(u0,{color:"gray",children:"From project local settings"},void 0,!1,void 0,this),H0(u0,{children:"Are you sure you want to delete this permission rule?"},void 0,!1,void 0,this),H0(B3,{items:[{label:"Yes",value:"yes"},{label:"No",value:"no"}],onSelect:(C)=>{if(C.value==="yes")j();else L("list"),F(null)}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),o=(v)=>H0(I$,{flexDirection:"column",gap:1,children:[H0(u0,{bold:!0,children:"Cannot delete this rule"},void 0,!1,void 0,this),H0(u0,{children:v.rule},void 0,!1,void 0,this),H0(u0,{color:"gray",children:v.source==="project"?"This rule is defined in .blade/settings.json. 请手动编辑该文件以移除规则。":"This rule is defined in ~/.blade/settings.json. 请手动编辑该文件以移除规则。"},void 0,!1,void 0,this),H0(u0,{color:"gray",children:"按任意键继续"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),H=(v)=>H0(B3,{items:i,isFocused:W==="list",onSelect:k},void 0,!1,void 0,this),R=()=>{if(z)return H0(u0,{children:"加载中..."},void 0,!1,void 0,this);if(K==="info")return c();if(W==="add")return U0(K);if(W==="confirm-delete"&&I)return m(I.tab,I.entry);if(W==="locked"&&I)return o(I.entry);return H(K)};return H0(I$,{flexDirection:"column",borderStyle:"round",borderColor:X?"cyan":"gray",padding:1,width:80,children:[H0(u0,{color:"cyan",bold:!0,children:"权限管理器"},void 0,!1,void 0,this),n(),H0(I$,{flexDirection:"column",gap:1,children:R()},void 0,!1,void 0,this),S&&H0(I$,{marginTop:1,children:H0(u0,{color:S.type==="success"?"green":"red",children:S.text},void 0,!1,void 0,this)},void 0,!1,void 0,this),H0(I$,{marginTop:1,children:H0(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 gQ,useState as n1}from"react";import{jsxDEV as r}from"react/jsx-dev-runtime";var vJ=["local","project","global"];function k3({workspaceRoot:$,onCancel:J}){let X=r0()==="plugins-manager",Y=R3($),Z=Y.getAll(),[Q,K]=n1(0),[U,G]=n1(!1),[q,O]=n1(""),[z,_]=n1(null),[W,L]=n1("local"),[N,B]=n1(null),[I,F]=n1(0),S=Y.getBySource(),y=Y.getStats(),b=Y.getSourcePolicy(),A=h0(!1,J);gQ(()=>{let M=!0;return y3.getInstance().loadWorkspacePluginSettingsResolution(Y.getWorkspaceRoot()).then((j)=>{if(M)B(j.settings)}).catch((j)=>{if(M)O(j instanceof Error?j.message:"无法读取插件作用域配置")}),()=>{M=!1}},[Y,I]);let P=()=>{L((M)=>{let j=vJ.indexOf(M);return vJ[(j+1)%vJ.length]}),_(null)},w=async()=>{let M=Z[Q];if(!M||U)return;if(M.source==="cli"){O(`${M.manifest.name} 由 --plugin-dir 管理,不能持久化切换`);return}if(M.status==="error"){O(M.error??`${M.manifest.name} 当前不可用`);return}G(!0),O("");try{let j=await T3(Y.getWorkspaceRoot(),M.manifest.name,M.status!=="active",W);O(j.effectiveEnabled?`已启用 ${M.manifest.name} · 生效层级 ${j.effectiveScope}`:`已禁用 ${M.manifest.name} · 生效层级 ${j.effectiveScope}`),F((i)=>i+1)}catch(j){O(j instanceof Error?j.message:String(j))}finally{G(!1)}},V=async()=>{if(U)return;G(!0),O("");try{await C3(Y.getWorkspaceRoot()),K(0),O("插件列表已刷新"),F((M)=>M+1)}catch(M){O(M instanceof Error?M.message:String(M))}finally{G(!1)}},T=async()=>{let M=Z[Q];if(!M||U)return;if(!M.installation){O(`${M.manifest.name} 不是 Blade 受管安装,不能自动更新`);return}G(!0),_(null),O("");try{let{result:j}=await I3(Y.getWorkspaceRoot(),M.manifest.name,{trusted:!0});if(!j.success)throw Error(j.error);O(j.changed?`已更新 ${M.manifest.name} 到 ${j.installation?.revision}`:`${M.manifest.name} 已是最新版本`),F((i)=>i+1)}catch(j){O(j instanceof Error?j.message:String(j))}finally{G(!1)}},k=async()=>{let M=Z[Q];if(!M||U)return;if(!M.installation){O(`${M.manifest.name} 不是 Blade 受管安装,不能自动卸载`);return}if(z!==M.manifest.name){_(M.manifest.name),O(`再次按 x 确认卸载 ${M.manifest.name}`);return}G(!0),O("");try{let{result:j}=await S3(Y.getWorkspaceRoot(),M.manifest.name,!0);if(!j.success)throw Error(j.error);_(null),K(0),O(`已卸载 ${M.manifest.name}`),F((i)=>i+1)}catch(j){O(j instanceof Error?j.message:String(j))}finally{G(!1)}};if(q0((M,j)=>{if(j.escape)J?.();else if(j.ctrl&&M==="c"||j.meta&&M==="c")A();else if((j.upArrow||M==="k")&&Z.length>0)_(null),K((i)=>(i-1+Z.length)%Z.length);else if((j.downArrow||M==="j")&&Z.length>0)_(null),K((i)=>(i+1)%Z.length);else if(M===" "||j.return)w();else if(M==="r")V();else if(M==="s")P();else if(M==="u")T();else if(M==="x")k()},{isActive:X}),Z.length===0)return r(C0,{flexDirection:"column",paddingY:1,children:[r(C0,{marginBottom:1,children:r(_0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),r(C0,{paddingLeft:2,children:r(_0,{color:"gray",children:"没有已加载的插件"},void 0,!1,void 0,this)},void 0,!1,void 0,this),r(C0,{marginTop:1,paddingLeft:2,flexDirection:"column",children:[r(_0,{color:"gray",children:"插件目录位置:"},void 0,!1,void 0,this),r(_0,{color:"gray",dimColor:!0,children:[" ","• ~/.blade/plugins/ - 用户级插件"]},void 0,!0,void 0,this),r(_0,{color:"gray",dimColor:!0,children:[" ","• .blade/plugins/ - 项目级插件"]},void 0,!0,void 0,this),r(_0,{color:"gray",dimColor:!0,children:[" ","• --plugin-dir - CLI 指定的插件"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),r(C0,{marginTop:1,paddingLeft:2,children:r(_0,{color:"gray",children:"使用 /plugins install <url> 安装新插件"},void 0,!1,void 0,this)},void 0,!1,void 0,this),r(C0,{marginTop:1,children:r(_0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return r(C0,{flexDirection:"column",paddingY:1,children:[r(C0,{marginBottom:1,children:[r(_0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this),r(_0,{color:"gray",children:[" (共 ",y.total," 个插件)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),r(C0,{paddingLeft:2,marginBottom:1,children:r(_0,{color:"gray",children:["启用: ",y.active," | 禁用: ",y.inactive," | 命令: ",y.commands," | 技能:"," ",y.skills," | 代理: ",y.agents]},void 0,!0,void 0,this)},void 0,!1,void 0,this),r(C0,{paddingLeft:2,marginBottom:1,children:r(_0,{color:"gray",children:["来源策略: ",b.restrictToAllowedSources?"restricted":"open"," | Git SHA: ",b.requireGitCommitSha?"required":"optional"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),r(C0,{paddingLeft:2,marginBottom:1,children:r(_0,{color:"gray",children:["写入层级: ",r(_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&&r(C0,{flexDirection:"column",marginBottom:1,children:[r(C0,{paddingLeft:1,children:[r(_0,{bold:!0,color:"magenta",children:"CLI 指定"},void 0,!1,void 0,this),r(_0,{color:"gray",children:" (--plugin-dir)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),S.cli.map((M)=>{let j=M.status==="active"?"[on]":"[off]",i=Z.indexOf(M)===Q;return r(C0,{flexDirection:"column",paddingLeft:2,children:[r(_0,{children:[r(_0,{bold:!0,color:i?"cyan":"green",children:[i?"› ":" ",j," ",M.manifest.name]},void 0,!0,void 0,this),r(_0,{color:"gray",children:[" v",M.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),r(C0,{paddingLeft:2,children:r(_0,{color:"gray",children:M.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),r(C0,{paddingLeft:2,children:r(_0,{color:"gray",dimColor:!0,children:"生效层级: invocation"},void 0,!1,void 0,this)},void 0,!1,void 0,this),M.commands.length>0&&r(C0,{paddingLeft:2,children:r(_0,{color:"blue",children:["命令:"," ",M.commands.map((n)=>`/${n.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},M.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),S.project.length>0&&r(C0,{flexDirection:"column",marginBottom:1,children:[r(C0,{paddingLeft:1,children:[r(_0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),r(_0,{color:"gray",children:" (.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),S.project.map((M)=>{let j=M.status==="active"?"[on]":"[off]",i=Z.indexOf(M)===Q;return r(C0,{flexDirection:"column",paddingLeft:2,children:[r(_0,{children:[r(_0,{bold:!0,color:i?"cyan":"green",children:[i?"› ":" ",j," ",M.manifest.name]},void 0,!0,void 0,this),r(_0,{color:"gray",children:[" v",M.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),r(C0,{paddingLeft:2,children:r(_0,{color:"gray",children:M.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),r(C0,{paddingLeft:2,children:r(_0,{color:"gray",dimColor:!0,children:["生效层级:"," ",N?.[M.manifest.name]?.effectiveScope??"default"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),M.commands.length>0&&r(C0,{paddingLeft:2,children:r(_0,{color:"blue",children:["命令:"," ",M.commands.map((n)=>`/${n.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},M.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),S.user.length>0&&r(C0,{flexDirection:"column",marginBottom:1,children:[r(C0,{paddingLeft:1,children:[r(_0,{bold:!0,color:"cyan",children:"用户级"},void 0,!1,void 0,this),r(_0,{color:"gray",children:" (~/.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),S.user.map((M)=>{let j=M.status==="active"?"[on]":"[off]",i=Z.indexOf(M)===Q;return r(C0,{flexDirection:"column",paddingLeft:2,children:[r(_0,{children:[r(_0,{bold:!0,color:i?"cyan":"green",children:[i?"› ":" ",j," ",M.manifest.name]},void 0,!0,void 0,this),r(_0,{color:"gray",children:[" v",M.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),r(C0,{paddingLeft:2,children:r(_0,{color:"gray",children:M.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),r(C0,{paddingLeft:2,children:r(_0,{color:"gray",dimColor:!0,children:["生效层级:"," ",N?.[M.manifest.name]?.effectiveScope??"default"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),M.commands.length>0&&r(C0,{paddingLeft:2,children:r(_0,{color:"blue",children:["命令:"," ",M.commands.map((n)=>`/${n.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},M.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),r(C0,{marginTop:1,paddingLeft:2,flexDirection:"column",children:[r(_0,{color:"gray",children:"可用命令:"},void 0,!1,void 0,this),r(_0,{color:"gray",dimColor:!0,children:[" ","• /plugins list - 列出所有插件"]},void 0,!0,void 0,this),r(_0,{color:"gray",dimColor:!0,children:[" ","• /plugins info <name> - 显示插件详情"]},void 0,!0,void 0,this),r(_0,{color:"gray",dimColor:!0,children:[" ","• /plugins install <url> - 安装插件"]},void 0,!0,void 0,this),r(_0,{color:"gray",dimColor:!0,children:[" ","• /plugins enable/disable <name> - 启用/禁用插件"]},void 0,!0,void 0,this),r(_0,{color:"gray",dimColor:!0,children:[" ","• /plugins policy show|set - 来源与 SHA 策略"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),r(C0,{marginTop:1,children:r(_0,{dimColor:!0,children:"↑/↓ 选择 · Space/Enter 启停 · s 切换层级 · u 信任并更新 · x 卸载 · r 刷新 · ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),q&&r(C0,{marginTop:1,children:r(_0,{color:q.includes("失败")?"red":"cyan",children:q},void 0,!1,void 0,this)},void 0,!1,void 0,this),U&&r(_0,{color:"gray",children:"处理中..."},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import{Box as F$,Text as H$,useStdout as mQ}from"ink";import pQ from"ink-text-input";import DJ,{useCallback as i2,useMemo as xQ,useState as D1}from"react";import{jsxDEV as R0}from"react/jsx-dev-runtime";var uQ=DJ.memo(({option:$,index:J,isSelected:X,isMultiSelect:Y,isHighlighted:Z})=>R0(F$,{flexDirection:"column",marginBottom:1,children:[R0(H$,{color:Z?"yellow":X?"green":void 0,bold:Z,children:[Y?X?"(*) ":"( ) ":Z?"> ":" ",J+1,". ",$.label]},void 0,!0,void 0,this),R0(F$,{marginLeft:4,children:R0(H$,{color:"gray",children:$.description},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)),cQ=DJ.memo(({questions:$,answers:J})=>R0(F$,{flexDirection:"column",marginBottom:1,children:$.map((X)=>{let Y=J[X.header],Z=Array.isArray(Y)?Y.join(", "):Y||"(no answer)";return R0(F$,{marginBottom:1,children:[R0(H$,{backgroundColor:"blue",color:"white",children:[" ",X.header," "]},void 0,!0,void 0,this),R0(H$,{color:"green",children:[" ",Z]},void 0,!0,void 0,this)]},X.header,!0,void 0,this)})},void 0,!1,void 0,this)),f3=DJ.memo(({questions:$,onComplete:J,onCancel:X})=>{let{stdout:Y}=mQ(),Z=Y.columns||80,K=r0()==="confirmation-prompt",U=h0(!1),[G,q]=D1("answering"),[O,z]=D1(0),[_,W]=D1({}),[L,N]=D1(0),[B,I]=D1([]),[F,S]=D1(!1),[y,b]=D1(""),[A,P]=D1(0),w=$[O],V=xQ(()=>{if(!w)return[];return[...w.options.map((n)=>({label:n.label,value:n.label,description:n.description})),{label:"Type something...",value:"__other__",description:"Enter custom response"}]},[w]),T=i2((n)=>{let c={..._,[w.header]:n};if(W(c),O<$.length-1)z(O+1),N(0),I([]),S(!1),b("");else q("submit"),P(0)},[_,w?.header,O,$.length]),k=i2((n)=>{let c=V[n];if(!c)return;if(c.value==="__other__"){S(!0);return}if(w.multiSelect)I((U0)=>U0.includes(c.value)?U0.filter((m)=>m!==c.value):[...U0,c.value]);else T(c.value)},[V,w?.multiSelect,T]),M=i2((n)=>{if(n.trim())T(n.trim())},[T]),j=i2(()=>{q("answering"),z(0),N(0),I([]),S(!1)},[]),i=i2(()=>{J(_)},[_,J]);if(q0((n,c)=>{if(c.ctrl&&n==="c"||c.meta&&n==="c"){U();return}if(F){if(c.escape)S(!1),b("");return}if(c.escape){X();return}let U0=parseInt(n);if(U0>=1&&U0<=V.length){k(U0-1);return}if(c.upArrow){N((m)=>m>0?m-1:V.length-1);return}if(c.downArrow||c.tab){N((m)=>m<V.length-1?m+1:0);return}if(c.return){if(w.multiSelect&&B.length>0)T(B);else k(L);return}if(n===" "&&w.multiSelect){let m=V[L];if(m&&m.value!=="__other__")I((o)=>o.includes(m.value)?o.filter((H)=>H!==m.value):[...o,m.value]);return}},{isActive:K&&G==="answering"&&!F}),q0((n,c)=>{if(c.ctrl&&n==="c"||c.meta&&n==="c"){U();return}if(c.escape){X();return}if(c.upArrow||c.downArrow||c.tab){P((U0)=>U0===0?1:0);return}if(c.return){if(A===0)i();else j();return}if(n.toLowerCase()==="y"){i();return}if(n.toLowerCase()==="e"){j();return}},{isActive:K&&G==="submit"}),G==="submit")return R0(F$,{flexDirection:"column",borderStyle:"round",borderColor:K?"green":"gray",padding:1,width:Math.min(Z-4,80),children:[R0(F$,{marginBottom:1,children:R0(H$,{bold:!0,color:"green",children:"[OK] Review Your Answers"},void 0,!1,void 0,this)},void 0,!1,void 0,this),R0(cQ,{questions:$,answers:_},void 0,!1,void 0,this),R0(F$,{flexDirection:"column",marginTop:1,children:[R0(H$,{color:A===0?"yellow":void 0,bold:A===0,children:[A===0?"> ":" ","[Y] Submit answers"]},void 0,!0,void 0,this),R0(H$,{color:A===1?"yellow":void 0,bold:A===1,children:[A===1?"> ":" ","[E] Edit answers"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),R0(F$,{marginTop:1,children:R0(H$,{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(!w)return null;return R0(F$,{flexDirection:"column",borderStyle:"round",borderColor:K?"cyan":"gray",padding:1,width:Math.min(Z-4,80),children:[R0(F$,{marginBottom:1,children:[R0(H$,{backgroundColor:"blue",color:"white",children:[" ",w.header," "]},void 0,!0,void 0,this),R0(H$,{children:[" ",w.question]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),F?R0(F$,{flexDirection:"column",marginTop:1,children:[R0(H$,{color:"yellow",children:"Enter your response:"},void 0,!1,void 0,this),R0(F$,{marginTop:1,children:[R0(H$,{color:"cyan",children:"> "},void 0,!1,void 0,this),R0(pQ,{value:y,onChange:b,onSubmit:M,focus:K},void 0,!1,void 0,this)]},void 0,!0,void 0,this),R0(F$,{marginTop:1,children:R0(H$,{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(F$,{flexDirection:"column",children:V.map((n,c)=>R0(uQ,{option:n,index:c,isSelected:B.includes(n.value),isMultiSelect:w.multiSelect,isHighlighted:L===c},n.value,!1,void 0,this))},void 0,!1,void 0,this),!F&&R0(F$,{marginTop:1,flexDirection:"column",children:[R0(H$,{color:"gray",children:w.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),w.multiSelect&&B.length>0&&R0(H$,{color:"green",children:["Selected: ",B.join(", ")]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$.length>1&&R0(F$,{marginTop:1,children:R0(H$,{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 dQ}from"node:path";import{Box as M2,Text as j$}from"ink";import lQ from"ink-select-input";import{useEffect as VJ,useMemo as P2,useRef as h3,useState as z4}from"react";function v3($){return`${$.projectPath}\x00${$.sessionId}`}function D3($){return $.title?.trim()||`Session ${$.sessionId.slice(0,8)}`}function V3($){return $.taskDelivery?` | delivery:${$.taskDelivery.status}`:""}function j3($,J){if(J!=="fork")return[...$];return $.filter((X)=>X.relationType!=="subagent")}function E3($){return{title:$==="fork"?"选择要 fork 的会话:":"选择要恢复的会话:",instructions:"(Left/Right to page | Up/Down to select | Enter to confirm | Esc to cancel)"}}import{jsxDEV as Z$}from"react/jsx-dev-runtime";function rQ($){let J=new Date($),Y=new Date().getTime()-J.getTime(),Z=Math.floor(Y/86400000);if(Z===0)return`今天 ${J.getHours().toString().padStart(2,"0")}:${J.getMinutes().toString().padStart(2,"0")}`;if(Z===1)return"昨天";if(Z<7)return`${Z}天前`;return`${J.getMonth()+1}/${J.getDate()}`}function aQ($){return dQ($)}function iQ($){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 oQ=({isSelected:$})=>Z$(M2,{marginRight:1,children:Z$(j$,{color:$?"cyan":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),nQ=({isSelected:$,label:J})=>Z$(j$,{color:$?"cyan":"white",bold:$,children:J},void 0,!1,void 0,this),o2=20,g3=({intent:$,sessions:J,onSelect:X,onCancel:Y})=>{let[Z,Q]=z4([]),[K,U]=z4(!1),[G,q]=z4(0),[O,z]=z4(!1),_=h3(!1),W=h3(!0);VJ(()=>{return W.current=!0,()=>{W.current=!1}},[]);let N=r0()==="session-selector",B=h0(!1);q0((w,V)=>{if(V.ctrl&&w==="c"||V.meta&&w==="c"){B();return}if(_.current)return;if(V.escape&&Y){Y();return}if(V.leftArrow||w==="h"||w==="H"){if(G>0)q((T)=>T-1);return}if(V.rightArrow||w==="l"||w==="L"){if(G<y-1)q((T)=>T+1);return}},{isActive:N}),VJ(()=>{if(J){Q(J);return}(async()=>{U(!0);try{let V=await f0.listSessions({includeSubagents:!1});Q(V)}catch(V){console.error("[SessionSelector] Failed to load sessions:",V),Q([])}finally{U(!1)}})()},[J]);let I=P2(()=>j3(J||Z,$),[$,J,Z]),F=P2(()=>E3($),[$]),S=P2(()=>{return I.map((w)=>{let V=aQ(w.taskSourceProjectPath??w.projectPath),T=rQ(w.lastMessageTime),k=D3(w),M=`[${iQ(w.taskStatus)}]`,j=w.gitBranch?` (${w.gitBranch})`:"",i=w.hasErrors?" [!]":"",n=w.taskRetriedFrom?` ↻ retry:${w.taskRetriedFrom.sessionId.slice(0,6)}`:w.relationType==="subagent"?" ↳ subagent":w.relationType==="fork"?" ↳ fork":"",c=w.taskIsolation==="worktree"?` | wt:${w.taskWorktreeBranch??"managed"}`:w.taskIsolation==="local"?" | local":"",U0=w.taskDiffStat?` | ${w.taskDiffStat.changedFiles} files +${w.taskDiffStat.additions} -${w.taskDiffStat.deletions}`:"",m=w.taskStatus==="queued"&&w.taskQueuePosition?` | queue:${w.taskQueuePosition}/${w.taskQueueDepth??w.taskQueuePosition}`:"",o=V3(w);return{key:v3(w),label:`${M} ${k} · ${T} | ${V}${j} | ${w.messageCount} 条消息${c}${m}${U0}${o}${i}${n}`,value:w}})},[I]),y=P2(()=>Math.max(1,Math.ceil(S.length/o2)),[S.length]),b=P2(()=>{let w=G*o2;return S.slice(w,w+o2)},[S,G]),A=P2(()=>({start:G*o2+1,end:Math.min((G+1)*o2,S.length)}),[G,S.length]);VJ(()=>{q(0)},[I.length]);let P=(w)=>{if(_.current)return;_.current=!0,z(!0);let V=()=>{if(!W.current)return;_.current=!1,z(!1)};Promise.resolve().then(()=>X(w.value)).then(V,V)};if(K)return Z$(M2,{flexDirection:"column",paddingX:2,paddingY:1,children:Z$(j$,{children:"正在加载会话列表..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(I.length===0)return Z$(M2,{flexDirection:"column",paddingX:2,paddingY:1,children:[Z$(j$,{color:"yellow",children:"没有找到历史会话"},void 0,!1,void 0,this),Z$(j$,{dimColor:!0,children:[`
158
- `,"提示: 开始一次对话后,会话历史将保存到 ~/.blade/projects/"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this);return Z$(M2,{flexDirection:"column",paddingX:2,paddingY:1,children:[Z$(j$,{bold:!0,color:"cyan",children:F.title},void 0,!1,void 0,this),Z$(j$,{dimColor:!0,children:[`
159
- `,F.instructions,`
160
- `]},void 0,!0,void 0,this),Z$(lQ,{items:b,onSelect:P,isFocused:N&&!O,indicatorComponent:oQ,itemComponent:nQ},void 0,!1,void 0,this),O&&Z$(j$,{color:"cyan",children:$==="fork"?"Forking…":"Resuming…"},void 0,!1,void 0,this),Z$(M2,{marginTop:1,flexDirection:"column",children:[Z$(j$,{dimColor:!0,children:["第 ",G+1,"/",y," 页 · 共 ",I.length," 个会话 · 显示"," ",A.start,"-",A.end]},void 0,!0,void 0,this),y>1&&Z$(M2,{marginTop:1,children:[Z$(j$,{color:G>0?"cyan":"gray",children:G>0?"<< 上一页":" "},void 0,!1,void 0,this),Z$(j$,{children:" "},void 0,!1,void 0,this),Z$(j$,{color:G<y-1?"cyan":"gray",children:G<y-1?"下一页 >>":""},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)};import{Box as m3,Text as n2}from"ink";import tQ,{useEffect as sQ,useState as eQ}from"react";import{jsxDEV as V1}from"react/jsx-dev-runtime";var p3=["|","/","-","\\"],jJ=tQ.memo(()=>{let $=X8(),J=P0(),X=q2(),[Y,Z]=eQ(0);if(sQ(()=>{if($?.status!=="loading"){Z(0);return}let Q=setInterval(()=>{Z((K)=>(K+1)%p3.length)},100);return()=>clearInterval(Q)},[$?.status]),!$)return null;return V1(m3,{flexDirection:"column",borderStyle:"single",borderColor:J.colors.info,marginX:2,marginBottom:1,paddingX:1,children:[V1(m3,{children:[V1(n2,{bold:!0,color:J.colors.info,children:"BTW"},void 0,!1,void 0,this),V1(n2,{color:J.colors.muted,children:[" | ",$.question]},void 0,!0,void 0,this),$.durationMs!==void 0&&V1(n2,{color:J.colors.muted,dimColor:!0,children:[" ","| ",$.durationMs,"ms"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$.status==="loading"&&V1(n2,{color:J.colors.text.secondary,children:[p3[Y]," Answering..."]},void 0,!0,void 0,this),$.status==="error"&&V1(n2,{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,X-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 u3({onCancel:$}){let J=o$(),X=r0()==="skills-manager",Z=x3({cwd:J}).getAll(),Q=Z.filter((q)=>q.source==="builtin"),K=Z.filter((q)=>q.source==="user"),U=Z.filter((q)=>q.source==="project"),G=h0(!1,$);if(q0((q,O)=>{if(O.escape)$?.();else if(O.ctrl&&q==="c"||O.meta&&q==="c")G()},{isActive:X}),Z.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:[" (找到 ",Z.length," 个)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),U.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),U.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 c3,Text as d$}from"ink";import $K,{useEffect as JK,useMemo as YK,useState as d3}from"react";import{jsxDEV as W$,Fragment as EJ}from"react/jsx-dev-runtime";var l3=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"];function XK($){let J=Math.floor($/1000);if(J<60)return`${J}s`;let X=Math.floor(J/60),Y=J%60;return`${X}m ${Y}s`}var r3=$K.memo(()=>{let $=X0((q)=>q.app.subagentProgresses),J=X0((q)=>q.app.subagentProgress),X=P0(),[Y,Z]=d3(0),[Q,K]=d3(()=>Date.now()),U=YK(()=>{let q=Object.values($);return q.length>0?q:J?[J]:[]},[J,$]),G=U.some((q)=>q.status==="running");if(JK(()=>{if(!G){Z(0);return}let q=setInterval(()=>{Z((z)=>(z+1)%l3.length)},80),O=setInterval(()=>{K(Date.now())},1000);return()=>{clearInterval(q),clearInterval(O)}},[G]),U.length===0)return null;return W$(c3,{paddingX:2,paddingY:0,flexDirection:"column",children:U.map((q)=>{let O=q.status==="running"?l3[Y]:q.status==="completed"?"[OK]":"[X]",z=q.status==="running"?X.colors.info:q.status==="completed"?X.colors.success:X.colors.error,_=Math.max(0,Q-q.startTime);return W$(c3,{flexDirection:"row",gap:1,children:[W$(d$,{color:z,bold:!0,children:O},void 0,!1,void 0,this),W$(d$,{color:X.colors.muted,children:"Subagent"},void 0,!1,void 0,this),W$(d$,{color:X.colors.text.primary,bold:!0,children:q.type},void 0,!1,void 0,this),W$(d$,{color:X.colors.muted,children:"|"},void 0,!1,void 0,this),W$(d$,{color:X.colors.text.secondary,children:q.description},void 0,!1,void 0,this),q.currentTool&&W$(EJ,{children:[W$(d$,{color:X.colors.muted,children:"|"},void 0,!1,void 0,this),W$(d$,{color:X.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:X.colors.muted,children:"|"},void 0,!1,void 0,this),W$(d$,{color:X.colors.info,children:XK(_)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.status==="failed"&&q.terminalSummary&&W$(EJ,{children:[W$(d$,{color:X.colors.muted,children:"|"},void 0,!1,void 0,this),W$(d$,{color:X.colors.error,children:q.terminalSummary},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},q.id,!0,void 0,this)})},void 0,!1,void 0,this)});import{Box as y2,Text as F1}from"ink";import ZK 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=ZK.memo(()=>{let $=U9().filter((X)=>X.status!=="deleted"),J=P0();if($.length===0)return null;return P$(y2,{flexDirection:"column",paddingX:2,children:$.map((X)=>{let Y=X.tasks.filter((Z)=>Z.status==="completed").length;return P$(y2,{flexDirection:"column",marginBottom:1,children:[P$(y2,{gap:1,children:[P$(F1,{bold:!0,color:X.status==="failed"?J.colors.error:X.status==="completed"?J.colors.success:J.colors.info,children:[hJ[X.status]," Team"]},void 0,!0,void 0,this),P$(F1,{bold:!0,color:J.colors.text.primary,children:X.name},void 0,!1,void 0,this),P$(F1,{color:J.colors.muted,children:["| ",X.members.length-1," members | ",Y,"/",X.tasks.length," ","tasks"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),P$(y2,{flexDirection:"column",paddingLeft:2,children:[X.members.filter((Z)=>Z.status!=="leader").map((Z)=>P$(y2,{gap:1,children:[P$(F1,{color:J.colors.muted,children:hJ[Z.status]},void 0,!1,void 0,this),P$(F1,{color:J.colors.text.secondary,children:Z.name},void 0,!1,void 0,this),P$(F1,{color:J.colors.muted,children:["(",Z.subagentType,", ",Z.status,Z.worktreePath?", worktree":"",")"]},void 0,!0,void 0,this)]},Z.id,!0,void 0,this)),X.tasks.map((Z)=>P$(y2,{gap:1,children:[P$(F1,{color:J.colors.muted,children:hJ[Z.status]},void 0,!1,void 0,this),P$(F1,{color:J.colors.text.secondary,children:["#",Z.id," ",Z.subject]},void 0,!0,void 0,this),P$(F1,{color:J.colors.muted,children:["(",Z.status,Z.owner?`, ${Z.owner}`:"",")"]},void 0,!0,void 0,this)]},Z.id,!0,void 0,this))]},void 0,!0,void 0,this)]},X.name,!0,void 0,this)})},void 0,!1,void 0,this)});gJ.displayName="TeamProgress";import{useMemoizedFn as QK}from"ahooks";import{Box as e$,Text as s}from"ink";import KK from"ink-select-input";import{useState as a3}from"react";import{jsxDEV as a}from"react/jsx-dev-runtime";var i3=t1.map(($)=>({label:$.label,value:$.id})),UK=({theme:$})=>{let{colors:J}=$;return a(e$,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[a(s,{bold:!0,color:J.text.primary,children:"代码预览"},void 0,!1,void 0,this),a(s,{children:" "},void 0,!1,void 0,this),a(s,{color:J.syntax.comment,children:"# function"},void 0,!1,void 0,this),a(s,{children:[a(s,{color:J.syntax.keyword,children:"def"},void 0,!1,void 0,this)," ",a(s,{color:J.syntax.function,children:"fibonacci"},void 0,!1,void 0,this),a(s,{color:J.text.primary,children:"("},void 0,!1,void 0,this),a(s,{color:J.syntax.variable,children:"n"},void 0,!1,void 0,this),a(s,{color:J.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),a(s,{children:[" ",a(s,{color:J.syntax.variable,children:"a"},void 0,!1,void 0,this),a(s,{color:J.syntax.operator,children:","},void 0,!1,void 0,this)," ",a(s,{color:J.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",a(s,{color:J.syntax.operator,children:"="},void 0,!1,void 0,this)," ",a(s,{color:J.syntax.number,children:"0"},void 0,!1,void 0,this),a(s,{color:J.syntax.operator,children:","},void 0,!1,void 0,this)," ",a(s,{color:J.syntax.number,children:"1"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),a(s,{children:[" ",a(s,{color:J.syntax.keyword,children:"for"},void 0,!1,void 0,this)," ",a(s,{color:J.syntax.variable,children:"_"},void 0,!1,void 0,this)," ",a(s,{color:J.syntax.keyword,children:"in"},void 0,!1,void 0,this)," ",a(s,{color:J.syntax.function,children:"range"},void 0,!1,void 0,this),a(s,{color:J.text.primary,children:"("},void 0,!1,void 0,this),a(s,{color:J.syntax.variable,children:"n"},void 0,!1,void 0,this),a(s,{color:J.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),a(s,{children:[" ",a(s,{color:J.syntax.variable,children:"a"},void 0,!1,void 0,this),a(s,{color:J.syntax.operator,children:","},void 0,!1,void 0,this)," ",a(s,{color:J.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",a(s,{color:J.syntax.operator,children:"="},void 0,!1,void 0,this)," ",a(s,{color:J.syntax.variable,children:"b"},void 0,!1,void 0,this),a(s,{color:J.syntax.operator,children:","},void 0,!1,void 0,this)," ",a(s,{color:J.syntax.variable,children:"a"},void 0,!1,void 0,this)," ",a(s,{color:J.syntax.operator,children:"+"},void 0,!1,void 0,this)," ",a(s,{color:J.syntax.variable,children:"b"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),a(s,{children:[" ",a(s,{color:J.syntax.keyword,children:"return"},void 0,!1,void 0,this)," ",a(s,{color:J.syntax.variable,children:"a"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),a(s,{children:" "},void 0,!1,void 0,this),a(s,{color:J.error,children:["- print(",a(s,{color:J.syntax.string,children:'"Hello, "'},void 0,!1,void 0,this)," + name)"]},void 0,!0,void 0,this),a(s,{color:J.success,children:["+ print(",a(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)},GK=({theme:$})=>{let{colors:J}=$;return a(e$,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[a(s,{children:" "},void 0,!1,void 0,this),a(s,{bold:!0,color:J.text.primary,children:"颜色配置"},void 0,!1,void 0,this),a(s,{children:" "},void 0,!1,void 0,this),a(s,{children:[a(s,{color:J.text.muted,children:"Primary: "},void 0,!1,void 0,this),a(s,{color:J.primary,children:J.primary},void 0,!1,void 0,this)]},void 0,!0,void 0,this),a(s,{children:[a(s,{color:J.text.muted,children:"Success: "},void 0,!1,void 0,this),a(s,{color:J.success,children:J.success},void 0,!1,void 0,this)]},void 0,!0,void 0,this),a(s,{children:[a(s,{color:J.text.muted,children:"Error: "},void 0,!1,void 0,this),a(s,{color:J.error,children:J.error},void 0,!1,void 0,this)]},void 0,!0,void 0,this),a(s,{children:[a(s,{color:J.text.muted,children:"Warning: "},void 0,!1,void 0,this),a(s,{color:J.warning,children:J.warning},void 0,!1,void 0,this)]},void 0,!0,void 0,this),a(s,{children:[a(s,{color:J.text.muted,children:"Info: "},void 0,!1,void 0,this),a(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)},o3=()=>{let $=M1(),J=K$.getCurrentThemeName(),X=t1.findIndex((L)=>L.label===J),Y=X>=0?t1[X].theme:t1[0].theme,[Z,Q]=a3(Y),[K,U]=a3(!1),G=QK(async(L)=>{if(K)return;U(!0);try{await a0().setTheme(L.value),$.closeModal()}catch(N){console.error("主题切换失败:",N instanceof Error?N.message:N)}finally{U(!1)}}),q=(L)=>{let N=t1.find((B)=>B.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:B}=L,F=B===J?"[OK]":" ";return a(s,{color:N?Z.colors.primary:Z.colors.text.primary,children:[F," ",B]},void 0,!0,void 0,this)};return a(e$,{flexDirection:"column",height:"100%",children:[a(e$,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:Z.colors.border.light,children:a(s,{bold:!0,color:Z.colors.primary,children:"主题选择器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),a(e$,{flexDirection:"row",flexGrow:1,children:[a(e$,{width:"40%",borderStyle:"single",borderColor:Z.colors.border.light,paddingX:1,children:a(e$,{flexDirection:"column",children:[a(e$,{paddingTop:1,paddingBottom:1,children:a(s,{bold:!0,color:Z.colors.text.primary,children:["可用主题 (",i3.length,")"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),a(KK,{items:i3,initialIndex:X>=0?X:0,onSelect:G,onHighlight:q,itemComponent:W},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),a(e$,{width:"60%",flexDirection:"column",borderStyle:"single",borderColor:Z.colors.border.light,children:[a(UK,{theme:Z},void 0,!1,void 0,this),a(GK,{theme:Z},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),a(e$,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:Z.colors.border.light,children:a(s,{color:Z.colors.text.muted,children:K?"正在保存...":"Enter: 选择主题 | Esc: 取消"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{Box as _4,Text as J1,useStdout as WK}from"ink";import LK,{useCallback as H1,useEffect as s1,useMemo as xJ,useRef as R$,useState as $1}from"react";function qK($,J){return[...$,J].join(`
161
- `).replace(/\n+$/,"")}function R2($){let J=2166136261;for(let X=0;X<$.length;X++)J^=$.charCodeAt(X),J=Math.imul(J,16777619);return`${$.length}:${(J>>>0).toString(16)}`}function s3({messages:$,currentStreamingMessageId:J,streamingLines:X,streamingTail:Y,currentThinkingContent:Z,pendingCommands:Q}){let K=qK(X,Y),U=[];for(let G of $){let q=G.id===J?K:G.content,O=G.metadata&&"phase"in G.metadata?String(G.metadata.phase):"",z=G.id===J?Z??G.thinkingContent:G.thinkingContent;if(G.role==="assistant"&&z)U.push({id:`${G.id}:thinking`,messageId:G.id,role:"assistant",kind:"thinking",content:z,revision:`${G.timestamp}:thinking:${R2(z)}`,collapsible:!0});let _=G.role==="tool"&&G.metadata&&"detail"in G.metadata&&typeof G.metadata.detail==="string"&&G.metadata.detail.length>0?G.metadata.detail:void 0;U.push({id:G.id,messageId:G.id,role:G.role,kind:G.role==="tool"?"tool":"message",content:q,detail:_,revision:`${G.timestamp}:${R2(q)}:${R2(_??"")}:${O}`,collapsible:_!==void 0})}if(J&&!U.some((G)=>G.id===J)){if(Z)U.push({id:`${J}:thinking`,messageId:J,role:"assistant",kind:"thinking",content:Z,revision:`stream:thinking:${R2(Z)}`,collapsible:!0});U.push({id:J,messageId:J,role:"assistant",kind:"message",content:K,revision:`stream:${R2(K)}`,collapsible:!1})}for(let[G,q]of Q.entries())U.push({id:`pending:${G}:${q.displayText}`,messageId:`pending:${G}`,role:"user",kind:"message",content:q.displayText,revision:`pending:${R2(q.displayText)}`,pending:!0,collapsible:!1});return U}var n3={user:"> ",assistant:"• ",system:" ",tool:"└ "};function O4($,J,X){let Y=J.text.length>0?J.text.split(`
162
- `):[""],Z=[];for(let[Q,K]of Y.entries()){let U=Z.length===0?J.firstPrefix:J.nextPrefix,G=Math.max(1,X-U.length),q=N2(K,G,!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=Z.length===0?J.firstPrefix:J.nextPrefix;Z.push({key:`${$.id}:${J.key}:${Q}:${Z.length}`,blockId:$.id,role:$.role,kind:$.kind,text:`${N}${z}`,copyText:z,pending:$.pending===!0,header:J.header&&Z.length===0,sourceLine:J.sourceLineOffset+Q,sourceStart:W,sourceEnd:L,sourceTextOffset:N.length}),O=L}}return Z}function t3($){return $.length===0?0:$.split(`
163
- `).length}function zK($){let J=$.split(`
164
- `)[0]?.trim()??"";if(J.length<=48)return J;return`${J.slice(0,45)}...`}function e3($,J,X=!1){if($.kind==="thinking"){let Y=X?"[-]":"[+]",Z=zK($.content),Q=`${Y} Thinking (${t3($.content)} lines)${!X&&Z?` - ${Z}`:""}`,K={key:`${$.id}:header`,blockId:$.id,role:$.role,kind:$.kind,text:`? ${Q}`,copyText:Q,pending:$.pending===!0,header:!0,sourceLine:null,sourceStart:0,sourceEnd:0,sourceTextOffset:2};if(!X)return[K];return[K,...O4($,{text:$.content,firstPrefix:" ",nextPrefix:" ",sourceLineOffset:0,key:"thinking",header:!1},J)]}if($.kind==="tool"&&$.detail){let Y=X?"[-]":"[+]",Z=O4($,{text:$.content,firstPrefix:`${n3.tool}${Y} `,nextPrefix:" ",sourceLineOffset:0,key:"summary",header:!0},J);if(!X)return Z;return[...Z,...O4($,{text:$.detail,firstPrefix:" ",nextPrefix:" ",sourceLineOffset:t3($.content),key:"detail",header:!1},J)]}return O4($,{text:$.content.length>0?$.content:"…",firstPrefix:n3[$.role],nextPrefix:" ",sourceLineOffset:0,key:"content",header:!0},J)}function OK($){if($.kind==="tool"&&$.detail)return[...$.content.split(`
165
- `),...$.detail.split(`
166
- `)];return $.content.split(`
167
- `)}function _K($,J){let X=[];for(let[Y,Z]of OK($).entries())for(let Q of Z.matchAll(J)){let K=Q.index,U=Q[0];if(U.length===0)continue;X.push({blockId:$.id,sourceLine:Y,start:K,end:K+U.length})}return X}class mJ{cache=new Map;search($,J){if(J.length===0)return[];let X=J.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),Y=new RegExp(X,"giu"),Z=new Set($.map((Q)=>Q.id));for(let Q of this.cache.keys())if(!Z.has(Q))this.cache.delete(Q);return $.flatMap((Q)=>{let K=this.cache.get(Q.id);if(K?.revision===Q.revision&&K.query===J)return K.matches;let U=_K(Q,Y);return this.cache.set(Q.id,{revision:Q.revision,query:J,matches:U}),U})}}function pJ($,J){let X=$.findIndex((Y)=>Y.blockId===J.blockId&&Y.sourceLine===J.sourceLine&&J.start>=Y.sourceStart&&J.start<Math.max(Y.sourceEnd,Y.sourceStart+1));if(X>=0)return X;return $.findIndex((Y)=>Y.blockId===J.blockId)}function $X($,J){if($.sourceLine===null||$.sourceEnd<=$.sourceStart)return[];let X=[];for(let[Y,Z]of J.entries()){if(Z.blockId!==$.blockId||Z.sourceLine!==$.sourceLine||Z.end<=$.sourceStart||Z.start>=$.sourceEnd)continue;X.push({start:$.sourceTextOffset+Math.max($.sourceStart,Z.start)-$.sourceStart,end:$.sourceTextOffset+Math.min($.sourceEnd,Z.end)-$.sourceStart,matchIndex:Y})}return X}function JX($,J,X){let Y=Math.max(0,Math.min(J,X)),Z=Math.min($.length-1,Math.max(J,X));if(Z<Y)return"";let Q=$.slice(Y,Z+1),K="";for(let[U,G]of Q.entries()){if(U===0){K=G.copyText;continue}let q=Q[U-1],O=G.sourceLine!==null&&G.blockId===q.blockId&&G.sourceLine===q.sourceLine;K+=`${O?"":`
168
- `}${G.copyText}`}return K}function YX($,J){let X=new Map($.map((Y)=>[Y.id,Y.revision]));return J.filter((Y)=>X.get(Y.id)!==Y.revision).map((Y)=>Y.id)}import{spawn as NK}from"node:child_process";function FK($){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 HK($,J,X){return new Promise((Y)=>{let Z=!1,Q=NK($,[...J],{stdio:["pipe","ignore","ignore"]}),K=setTimeout(()=>{if(Z)return;Z=!0,Q.kill("SIGKILL"),Y(!1)},2000),U=(G)=>{if(Z)return;Z=!0,clearTimeout(K),Y(G)};Q.once("error",()=>U(!1)),Q.once("close",(G)=>U(G===0)),Q.stdin.once("error",()=>U(!1)),Q.stdin.end(X)})}function XX($,J=!1){let X=`\x1B]52;c;${Buffer.from($,"utf8").toString("base64")}\x07`;if(!J)return X;return`\x1BPtmux;${X.replaceAll("\x1B","\x1B\x1B")}\x1B\\`}async function ZX($,J={}){if($.length===0)return{success:!1};let X=J.platform??process.platform,Y=J.env??process.env,Z=J.runCommand??HK,Q=J.writeTerminal??((G)=>process.stdout.write(G)),K=Boolean(Y.SSH_CONNECTION),U=async(G)=>{try{return await Z(G.command,G.args,$)}catch{return!1}};if(!K){for(let G of FK(X))if(await U(G))return{success:!0,method:"native"}}if(Y.TMUX){if(await U({command:"tmux",args:["load-buffer","-w","-"]})){try{Q(XX($,!0))}catch{}return{success:!0,method:"tmux"}}}try{return Q(XX($)),{success:!0,method:"osc52"}}catch{return{success:!1}}}import{jsxDEV as L$}from"react/jsx-dev-runtime";function QX($,J){let X=Array.from($.value);return{...$,cursor:Math.max(0,Math.min(X.length,$.cursor+J))}}function wK($,J,X){let Y=Array.from($.value);if(X.leftArrow)return QX($,-1);if(X.rightArrow)return QX($,1);if(X.home)return{...$,cursor:0};if(X.end)return{...$,cursor:Y.length};if(X.backspace&&$.cursor>0)return Y.splice($.cursor-1,1),{value:Y.join(""),cursor:$.cursor-1};if(X.delete&&$.cursor<Y.length)return Y.splice($.cursor,1),{value:Y.join(""),cursor:$.cursor};if(X.ctrl&&J.toLowerCase()==="u")return{value:"",cursor:0};if(X.ctrl||X.meta||J.length===0)return $;let Z=J.replace(/[\r\n\t]+/g," ");if(Z.length===0)return $;let Q=Array.from(Z);return Y.splice($.cursor,0,...Q),{value:Y.join(""),cursor:$.cursor+Q.length}}function BK({editor:$}){let J=Array.from($.value),X=J.slice(0,$.cursor).join(""),Y=J[$.cursor]??" ",Z=J.slice($.cursor+1).join("");return L$(J1,{wrap:"truncate-end",children:["/",X,L$(J1,{inverse:!0,children:Y},void 0,!1,void 0,this),Z,L$(J1,{dimColor:!0,children:" · Enter search · Esc cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}function AK({line:$,matches:J,currentMatchIndex:X,selected:Y,selectedBlock:Z,color:Q,highlightColor:K}){let U=$X($,J);if(Y||U.length===0)return L$(J1,{wrap:"truncate-end",color:Q,inverse:Y,bold:Z,underline:Z,children:$.text||" "},void 0,!1,void 0,this);let G=[],q=0;for(let O of U){if(O.start>q)G.push($.text.slice(q,O.start));G.push(L$(J1,{color:K,bold:!0,inverse:O.matchIndex===X,children:$.text.slice(O.start,O.end)},`${$.key}:match:${O.matchIndex}`,!1,void 0,this)),q=O.end}if(q<$.text.length)G.push($.text.slice(q));return L$(J1,{wrap:"truncate-end",color:Q,bold:Z,underline:Z,children:G},void 0,!1,void 0,this)}var KX=LK.memo(({isOpen:$,onClose:J,compact:X=!1})=>{let Y=J8(),Z=N8(),Q=_8(),K=F8(),U=Q2(),G=r0(),q=P0(),{stdout:O}=WK(),{width:z,height:_}=V8(),W=X?Math.max(6,Math.floor(_*0.4)):_,L=Math.max(1,W-3),N=Math.max(12,z-4),B=R$(new Map),I=R$(new mJ),[F,S]=$1(new Set),y=R$(F);y.current=F;let b=xJ(()=>s3({messages:Y,currentStreamingMessageId:Z,streamingLines:K.lines,streamingTail:K.tail,currentThinkingContent:Q,pendingCommands:U}),[Y,Z,K.lines,K.tail,Q,U]),A=xJ(()=>{let g=new Set(b.map((h)=>h.id));for(let h of B.current.keys())if(!g.has(h))B.current.delete(h);return b.flatMap((h,f)=>{let p=F.has(h.id),$0=B.current.get(h.id),n0=$0?.revision===h.revision&&$0.width===N&&$0.expanded===p?$0.lines:e3(h,N,p);if(n0!==$0?.lines)B.current.set(h.id,{revision:h.revision,width:N,expanded:p,lines:n0});if(f===b.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}]})},[b,N,F]),[P,w]=$1(0),[V,T]=$1(new Set),[k,M]=$1(null),j=R$(null),[i,n]=$1(!1),c=R$(!1),[U0,m]=$1({value:"",cursor:0}),o=R$(U0),[H,R]=$1(""),[v,D]=$1(0),C=R$(0),[x,d]=$1(null),t=R$(null),[Q0,w0]=$1(null),p0=R$(0),s0=R$(null),j0=R$(0),l$=R$(b),r$=R$(A.length),a$=R$(N);j0.current=P,j.current=k,c.current=i,o.current=U0,C.current=v,t.current=x;let x0=xJ(()=>I.current.search(b,H),[b,H]),Q$=Math.max(0,A.length-L),o0=Math.max(0,A.length-P),E0=Math.max(0,o0-L),B$=H1((g)=>{let h=Math.max(0,Math.min(Q$,g));if(j0.current=h,w(h),h===0)T(new Set)},[Q$]),O$=H1((g)=>{if(A.length===0)return;let h=Math.max(0,Math.min(A.length-1,g)),f=Math.max(0,Math.min(A.length-L,h-Math.floor(L/2))),p=Math.min(A.length,f+L);B$(A.length-p)},[A.length,B$,L]),X1=H1((g,h,f)=>{let p=new Set(y.current);if(h)p.add(g);else p.delete(g);y.current=p,s0.current=f,S(p)},[]),A1=H1((g)=>{let h=b.find((p)=>p.id===g.blockId);if(h?.collapsible&&!y.current.has(h.id)){X1(h.id,!0,{blockId:h.id,match:g});return}let f=pJ(A,g);if(f>=0)O$(f)},[b,A,O$,X1]),h1=H1((g,h=x0)=>{if(h.length===0){C.current=0,D(0);return}let f=(g%h.length+h.length)%h.length;C.current=f,D(f);let p=h[f];j.current=p.blockId,M(p.blockId),A1(p)},[x0,A1]),$2=H1((g)=>{let h=b.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,M($0);let n0=A.findIndex((d0)=>d0.blockId===$0&&d0.header);if(n0>=0)O$(n0)},[b,A,O$]),C2=H1(()=>{let g=j.current;if(!g)g=A.slice(E0,o0).find((f)=>b.some((p)=>p.id===f.blockId&&p.collapsible))?.blockId??null;if(!g)return;if(!b.find((f)=>f.id===g)?.collapsible)return;j.current=g,M(g),X1(g,!y.current.has(g),{blockId:g})},[b,o0,A,X1,E0]),S$=H1((g,h)=>{let f=t.current;if(!f||A.length===0)return;let p=h==="top"?0:h==="bottom"?A.length-1:Math.max(0,Math.min(A.length-1,f.head+g)),$0={...f,head:p};t.current=$0,d($0),O$(p)},[A.length,O$]),e0=H1(()=>{let g=t.current;if(!g)return;let h=JX(A,g.anchor,g.head);if(!h.trim()){w0("Nothing selected");return}let f=++p0.current;w0("Copying..."),ZX(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"),t.current=null,d(null)})},[A,O]);s1(()=>{if(!Q0)return;let g=setTimeout(()=>w0(null),2500);return()=>clearTimeout(g)},[Q0]),s1(()=>{if(!$){p0.current++,l$.current=b,r$.current=A.length;return}y.current=new Set,S(new Set),j.current=null,M(null),c.current=!1,n(!1),o.current={value:"",cursor:0},m({value:"",cursor:0}),R(""),C.current=0,D(0),t.current=null,d(null),w0(null),j0.current=0,w(0),T(new Set),l$.current=b,r$.current=A.length,a$.current=N},[$]),s1(()=>{let g=new Set(b.map((h)=>h.id));if(S((h)=>{let f=new Set([...h].filter(($0)=>g.has($0)));return y.current=f,f.size===h.size&&[...f].every(($0)=>h.has($0))?h:f}),j.current&&!g.has(j.current))j.current=null,M(null)},[b]),s1(()=>{let g=r$.current;if(r$.current=A.length,!$)return;let h=s0.current;if(h){s0.current=null;let p=h.match?pJ(A,h.match):A.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,A.length-g);if(f>0)w((p)=>{let $0=Math.min(Q$,p+f);return j0.current=$0,$0});else if(j0.current>Q$)j0.current=Q$,w(Q$)},[N,F,$,A.length,Q$,O$]),s1(()=>{let g=l$.current;if(l$.current=b,!$||j0.current===0)return;let h=YX(g,b);if(h.length===0)return;T((f)=>{let p=new Set(f);for(let $0 of h)p.add($0);return p})},[b,$]),s1(()=>{if(x0.length===0)C.current=0,D(0);else if(C.current>=x0.length)C.current=x0.length-1,D(x0.length-1)},[x0.length]),s1(()=>{if(a$.current===N)return;a$.current=N,t.current=null,d(null);let g=x0[C.current];if(g)A1(g)},[N,x0,A1]),q0((g,h)=>{if(!$)return;let f=h,p=G==="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(c.current){if(f.escape)return c.current=!1,n(!1),o.current={value:H,cursor:Array.from(H).length},m(o.current),!0;if(f.return){let n0=o.current.value,d0=I.current.search(b,n0);return R(n0),c.current=!1,n(!1),h1(0,d0),!0}let $0=wK(o.current,g,f);return o.current=$0,m($0),!0}if(g==="q")return J(),!0;if(t.current){if(f.escape)return t.current=null,d(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:H,cursor:Array.from(H).length};return o.current=$0,m($0),c.current=!0,n(!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 $2(f.shift?-1:1),!0;if(f.return||g==="e")return C2(),!0;if(g==="v"){if(A.length===0)return!0;let $0=Math.max(0,A.length-j0.current),n0=Math.max(0,$0-L),d0=j.current?A.findIndex((b1)=>b1.blockId===j.current&&b1.header):-1,_$=d0>=0?d0:Math.max(0,Math.min(A.length-1,n0)),I2={anchor:_$,head:_$};return t.current=I2,d(I2),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$=A.slice(E0,o0),K0=V.size,B0=A.length===0?"0/0":`${Math.min(o0,A.length)}/${A.length}`,b0=x?Math.min(x.anchor,x.head):-1,J0=x?Math.max(x.anchor,x.head):-1,e=H.length>0?`/${H} ${x0.length>0?`${v+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$(_4,{flexDirection:"column",width:"100%",height:W,paddingX:2,children:[L$(_4,{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$(_4,{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$(AK,{line:g,matches:x0,currentMatchIndex:v,selected:p,selectedBlock:$0,color:n0,highlightColor:q.colors.warning},g.key,!1,void 0,this)})},void 0,!1,void 0,this),L$(_4,{flexShrink:0,children:i?L$(BK,{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"),zX=({debug:$,continue:J,...X})=>{if($)M$.debug("[Debug] BladeInterface props:",{permissionMode:X.permissionMode,yolo:X.yolo,maxTurns:X.maxTurns,continue:J});let Y=t2(!1),Z=t2(!1),Q=t2(!1),K=t2(null),U=t2(!1),[G,q]=MK(!1),O=J9(),z=Y9(),_=Y8(),W=Q9(),L=Z9(),N=M1(),B=P1(),I=Y2(),F=o$(),{stdout:S}=bK(),y=_9(),b=X2(),A=O9();L1(()=>{if(K$.getCurrentThemeName()!==A)try{K$.setTheme(A)}catch{}},[A]);let P=O==="ready",w=O==="needsSetup",V=O==="idle",T=PK(()=>X.agents?qX(X.agents):void 0,[X.agents]),{confirmationState:k,confirmationHandler:M,handleResponse:j,dismissAll:i}=t9(),{executeCommand:n,handleAbort:c,isProcessing:U0,cleanupAgent:m}=i9(X.systemPrompt,X.appendSystemPrompt,M,X.maxTurns,i,T),{getPreviousCommand:o,getNextCommand:H,addToHistory:R}=o9();BY();let v=e9("",0),D=t0(()=>{k$(),S.write(UX.eraseScreen+UX.cursorTo(0,0)),B.incrementClearCount()}),C=t0(()=>{if(G)return;q(!0)}),x=t0(()=>{if(!G)return;q(!1)}),d=t0(()=>{if(G)x();else C()});q0((f,p)=>{if(P&&!w&&(p.ctrl||p.meta)&&f.toLowerCase()==="o")return d(),!0;return!1},{priority:90}),L1(()=>{if(!U.current){U.current=!0;return}D()},[D,G]);let t=t0(async()=>{let f=b,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,F,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 b8({intent:p,session:f,newSessionId:$0?.newSessionId,announceFork:$0?.announceFork,permissionModeOverride:X.permissionMode},F,B,m)}),s0=t0(async(f,p)=>{let d0=(await A8(p,F)).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$}=HY(v,n,o,H,R,c,U0,t,w0,_==="shortcuts");L1(()=>{if(v.value&&_==="shortcuts")N.closeModal()},[v.value,_,N]);let a$=t0(async()=>{Q.current=!0;try{let f=X.forkSession?"fork":"resume",p=await A8(f,F);if(p.length===0){if(X.forkSession){M$.error("没有可供 fork 的历史会话"),n$(1);return}B.addAssistantMessage("没有找到历史会话,开始新对话。");return}let $0=p[0];await p0($0,f,{newSessionId:X.forkSession?X.sessionId:void 0,announceFork:X.forkSession?!1:void 0})}catch(f){if(M$.error("[BladeInterface] 继续会话失败:",f),X.forkSession){n$(1);return}B.addAssistantMessage("继续会话失败,开始新对话。")}}),x0=t0(async()=>{Q.current=!0;try{if(typeof X.resume==="string"&&X.resume!=="true"){let $0=X.forkSession?"fork":"resume",n0=await s0(X.resume,$0);await p0(n0,$0,{newSessionId:X.forkSession?X.sessionId:void 0,announceFork:X.forkSession?!1:void 0});return}let f=X.forkSession?"fork":"resume",p=await A8(f,F);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(X.resume)Y.current=!0,x0()},[J,X.resume,a$,x0]);let Q$=t0(async(f)=>{let p=k.details?.type;if(p==="enterPlanMode"&&f.approved)try{await f0.setSessionPermissionMode(I,F,"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(()=>{B.addAssistantMessage("设置已取消"),B.addAssistantMessage("Blade 需要 API 配置才能正常工作。"),B.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),B.addAssistantMessage(`会话操作失败: ${p instanceof Error?p.message:"未知错误"}`),N.closeModal()}}),O$=t0(()=>{if(X.resume)n$(0);else N.closeModal()}),X1=t0((f)=>{N.showModelEditWizard(f)}),A1=t0((f)=>{B.addAssistantMessage(`已添加模型配置: ${f.displayName??f.model},并已切换到该模型`),E0()}),h1=t0((f)=>{B.addAssistantMessage(`已更新模型配置: ${f.displayName??f.model}`),E0()});L1(()=>{if(w){y.setFocus("model-config-wizard");return}if(k.isVisible)y.setFocus("confirmation-prompt");else if(_==="sessionSelector")y.setFocus("session-selector");else if(_==="themeSelector")y.setFocus("theme-selector");else if(_==="modelSelector")y.setFocus("model-selector");else if(_==="modelAddWizard"||_==="modelEditWizard")y.setFocus("model-config-wizard");else if(_==="permissionsManager")y.setFocus("permissions-manager");else if(_==="agentsManager")y.setFocus("agents-manager");else if(_==="agentCreationWizard")y.setFocus("agent-creation-wizard");else if(_==="skillsManager")y.setFocus("skills-manager");else if(_==="pluginsManager")y.setFocus("plugins-manager");else if(_==="hooksManager")y.setFocus("hooks-manager");else if(G)y.setFocus("transcript-pager");else if(_==="shortcuts")y.setFocus("main-input");else y.setFocus("main-input")},[w,k.isVisible,_,G,y.setFocus]),L1(()=>{if(!P||Q.current)return;if(GX().length>0){Q.current=!0;return}Q.current=!0,B.addAssistantMessage("请输入您的问题,我将为您提供帮助。")},[P]),L1(()=>{if(!z)return;if(K.current===z)return;if(K.current=z,O==="error")B.addAssistantMessage(`初始化失败: ${z}`);else B.addAssistantMessage(`${z}`),B.addAssistantMessage("请重新尝试设置,或检查文件权限")},[z,O,B.addAssistantMessage]);let $2=t0(async(f)=>{try{await n({displayText:f,text:f,images:[],parts:[{type:"text",text:f}]})}catch(p){let $0=p instanceof Error?p.message:"无法发送初始消息";B.addAssistantMessage(`初始消息发送失败:${$0}`)}});L1(()=>{let f=X.initialMessage?.trim();if(!f||Z.current||!P||w)return;Z.current=!0,R(f),$2(f)},[X.initialMessage,P,w,n,R]);let C2=t0(async(f)=>{try{await a0().setPermissionMode(f)}catch(p){M$.error("权限模式初始化失败:",p instanceof Error?p.message:p)}});if(L1(()=>{let f=X.permissionMode;if($)M$.debug("[Debug] permissionMode from CLI:",f),M$.debug("[Debug] current permissionMode:",b);if(!f||f===b)return;C2(f)},[X.permissionMode,b]),V)return null;if(w)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(i6,{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(f3,{questions:k.details.questions,onComplete:(f)=>Q$({approved:!0,answers:f}),onCancel:()=>Q$({approved:!1})},void 0,!1,void 0,this):I0(F6,{details:k.details,onResponse:Q$},void 0,!1,void 0,this):_==="themeSelector"?I0(o3,{},void 0,!1,void 0,this):_==="permissionsManager"?I0(M3,{onClose:E0},void 0,!1,void 0,this):_==="sessionSelector"?I0(g3,{intent:W?.intent??"resume",sessions:W?.sessions,onSelect:B$,onCancel:O$},void 0,!1,void 0,this):_==="hooksManager"?I0(W6,{workspaceRoot:F,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||G?"none":"flex",children:[I0(Y3,{active:!h&&!G},void 0,!1,void 0,this),I0(r3,{},void 0,!1,void 0,this),I0(gJ,{},void 0,!1,void 0,this),I0(jJ,{},void 0,!1,void 0,this),I0(d6,{paused:h||G},void 0,!1,void 0,this),I0(h6,{input:v.value,cursorPosition:v.cursorPosition,onChange:v.setValue,onChangeCursorPosition:v.setCursorPosition,onAddPasteMapping:v.addPasteMapping,onAddImagePasteMapping:v.addImagePasteMapping},void 0,!1,void 0,this),S$&&I0(W1,{marginTop:1,paddingX:2,children:I0(X3,{onClose:E0,onEdit:X1},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(IY,{workspaceRoot:F,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(m2,{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(u3,{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(k3,{workspaceRoot:F,onComplete:E0,onCancel:E0},void 0,!1,void 0,this)},void 0,!1,void 0,this),I0(jY,{suggestions:l$,selectedIndex:r$,visible:j0&&!K0},void 0,!1,void 0,this),I0(VY,{},void 0,!1,void 0,this)]},void 0,!0,void 0,this),I0(W1,{flexDirection:"column",display:G?"flex":"none",children:I0(KX,{isOpen:G,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 yK,Text as j1}from"ink";import RK from"react";import{jsxDEV as w1}from"react/jsx-dev-runtime";class s2 extends RK.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(yK,{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 N4=[{key:"update",label:"Update now",description:`runs \`${_X()}\``},{key:"skip",label:"Skip",description:""},{key:"skip_until_next",label:"Skip until next version",description:""}],FX=({versionInfo:$,onComplete:J})=>{let[X,Y]=uJ(0),[Z,Q]=uJ(!1),[K,U]=uJ(null);q0((q,O)=>{if(O.ctrl&&q==="c"){h2().shutdown("SIGINT",0);return}if(Z||K)return;if(O.upArrow||q==="k")Y((z)=>z>0?z-1:N4.length-1);else if(O.downArrow||q==="j")Y((z)=>z<N4.length-1?z+1:0);else if(O.return)G(N4[X].key);else if(q==="1")G("update");else if(q==="2")G("skip");else if(q==="3")G("skip_until_next")});let G=async(q)=>{switch(q){case"update":{Q(!0);let O=await NX();U(O.message),setTimeout(()=>{h2().shutdown("SIGINT",0)},1500);break}case"skip":J();break;case"skip_until_next":if($.latestVersion)await OX($.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(Z)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:N4.map((q,O)=>{let z=O===X,_=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 F4,Text as T2}from"ink";import{useState as HX}from"react";import{jsxDEV as Y1}from"react/jsx-dev-runtime";var WX=({status:$,onTrust:J,onContinueSafely:X})=>{let Y=K$.getTheme(),[Z,Q]=HX(!1),[K,U]=HX(null);return q0((G,q)=>{if(Z)return;if(q.return||G.toLowerCase()==="t"){Q(!0),U(null),J().catch((O)=>{U(O instanceof Error?O.message:"Failed to trust workspace"),Q(!1)});return}if(G.toLowerCase()==="s"||q.escape)Q(!0),U(null),X().catch((O)=>{U(O instanceof Error?O.message:"Failed to continue safely"),Q(!1)})}),Y1(F4,{flexDirection:"column",paddingX:1,children:[Y1(T2,{bold:!0,color:Y.colors.warning,children:"Workspace review required"},void 0,!1,void 0,this),Y1(T2,{dimColor:!0,children:$.projectPath},void 0,!1,void 0,this),Y1(F4,{marginTop:1,flexDirection:"column",children:[Y1(T2,{children:"This project contains configuration that can change models, start MCP processes, relax permissions, inject environment variables, or load instructions, commands, skills, agents, and plugins."},void 0,!1,void 0,this),$.sources.map((G)=>Y1(T2,{children:[" ",G.path," · ",G.effects.length," effect(s)"]},`${G.kind}:${G.path}`,!0,void 0,this))]},void 0,!0,void 0,this),K&&Y1(F4,{marginTop:1,children:Y1(T2,{color:Y.colors.error,children:K},void 0,!1,void 0,this)},void 0,!1,void 0,this),Y1(F4,{marginTop:1,children:Y1(T2,{bold:!0,children:Z?"Applying decision...":"[Enter/T] Trust and load [S/Esc] Continue safely"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useStdout as TK}from"ink";import{useEffect as CK}from"react";function LX(){let{stdout:$}=TK();CK(()=>{if(!$.isTTY)return;return $.write(b6),$.write(NJ),()=>{$.write(P6),$.write(NJ)}},[$])}function wX($){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 SK($){if(Y$().config.actions.setConfig($),$.debug)console.log("[Debug] 模型配置检查通过,准备就绪");U$().setInitializationStatus("ready")}var kK=($)=>{LX();let[J,X]=W4(!1),[Y,Z]=W4(null),[Q,K]=W4(!1),[U,G]=W4(null),q=H4((W,L)=>{let N=W instanceof Error?W.message:String(W);if(U$().setInitializationError(N),U$().setInitializationStatus("error"),X(!0),L)console.error("[FAIL] 应用初始化失败:",N)}),O=H4(async()=>{try{let W=Y$().config.config??AX,L=bX(W,$);if(SK(L),L.resumeSessionId)PX().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||{},X$());let I=await MX(X$());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;BX(S)}catch(B){if($.debug)console.warn("Hooks 初始化失败:",wX(B))}y8(async()=>{await RX.getInstance().killAll(),await yX.getInstance().disconnectAll(),y$.getInstance().cleanup()}),X(!0)}catch(W){q(W,!!$.debug)}}),z=H4(async()=>{let W=await cJ.getInstance().getStatus(X$());if(W.state==="untrusted"||W.state==="error"){G(W);return}await O()}),_=H4(async()=>{if($.versionCheckPromise){let W=await $.versionCheckPromise;if(W){Z(W),K(!0);return}}await z()});if(IK(()=>{_()},[]),Q&&Y)return E1(s2,{children:E1(FX,{versionInfo:Y,onComplete:()=>{K(!1),z()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(U)return E1(s2,{children:E1(WX,{status:U,onTrust:async()=>{await cJ.getInstance().trust(X$()),await TX(),G(null),await O()},onContinueSafely:async()=>{G(null),await O()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(!J)return null;return E1(s2,{children:E1(zX,{...$},void 0,!1,void 0,this)},void 0,!1,void 0,this)},Nw=($)=>E1(YY,{children:E1(kK,{...$},void 0,!1,void 0,this)},void 0,!1,void 0,this);export{Nw as AppWrapper};