blade-code 0.10.100 → 0.10.101

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 (69) hide show
  1. package/dist/blade.js +2 -2
  2. package/dist/{chunk-gkdynynx.js → chunk-2191220r.js} +1 -1
  3. package/dist/{chunk-rmhgyrgh.js → chunk-2cg8f38t.js} +1 -1
  4. package/dist/{chunk-hx55j0d0.js → chunk-2f5kkhan.js} +274 -274
  5. package/dist/chunk-2r0f3b4t.js +1 -0
  6. package/dist/{chunk-q1cc7kwn.js → chunk-3an3vxzt.js} +1 -1
  7. package/dist/{chunk-8zm5r6g8.js → chunk-3c01jje5.js} +1 -1
  8. package/dist/{chunk-ttg3xrsc.js → chunk-8yt4nmyb.js} +1 -1
  9. package/dist/{chunk-tagtjbw9.js → chunk-8z9d0zd0.js} +1 -1
  10. package/dist/chunk-9ajkzcqj.js +12 -0
  11. package/dist/chunk-as2ezx8p.js +1 -0
  12. package/dist/{chunk-axycs651.js → chunk-bswjne5v.js} +1 -1
  13. package/dist/{chunk-dfxfcsm1.js → chunk-c663rajb.js} +1 -1
  14. package/dist/chunk-cjgpas7y.js +23 -0
  15. package/dist/{chunk-c3yd59qh.js → chunk-dcjh1cj6.js} +1 -1
  16. package/dist/{chunk-ara0zd89.js → chunk-f8z5v101.js} +1 -1
  17. package/dist/{chunk-6p9p71qm.js → chunk-fqbc1ppx.js} +1 -1
  18. package/dist/{chunk-h8qjkxee.js → chunk-hpjnk87v.js} +18 -18
  19. package/dist/{chunk-qc4fe1j6.js → chunk-j22d84s7.js} +1 -1
  20. package/dist/{chunk-jac8cc04.js → chunk-jvxskq6a.js} +1 -1
  21. package/dist/{chunk-sgzqcr55.js → chunk-kdatgrjy.js} +1 -1
  22. package/dist/{chunk-njctfzqw.js → chunk-kfcs62nw.js} +1 -1
  23. package/dist/{chunk-3ktsyk2g.js → chunk-mzab7qak.js} +1 -1
  24. package/dist/{chunk-s15phq98.js → chunk-n5jfmzp2.js} +1 -1
  25. package/dist/{chunk-cc74b8qp.js → chunk-nh4jy5cs.js} +1 -1
  26. package/dist/{chunk-x677fstt.js → chunk-qgjgjzbx.js} +1 -1
  27. package/dist/{chunk-5dkzqgxa.js → chunk-qjeadpj2.js} +1 -1
  28. package/dist/chunk-qjv5kz7q.js +171 -0
  29. package/dist/chunk-sa7t9kht.js +6 -0
  30. package/dist/{chunk-pzp42zf0.js → chunk-tazb5tze.js} +1 -1
  31. package/dist/chunk-tc9rq0st.js +160 -0
  32. package/dist/{chunk-1nwc2wt6.js → chunk-tp5bep1y.js} +1 -1
  33. package/dist/{chunk-6jhndjnq.js → chunk-twhf09qs.js} +1 -1
  34. package/dist/{chunk-6rd8x9j0.js → chunk-vc7gh3wc.js} +1 -1
  35. package/dist/{chunk-y7bsjbsa.js → chunk-wbf4qcws.js} +2 -2
  36. package/dist/chunk-ykf4cqpg.js +8 -0
  37. package/dist/{chunk-v9pcf4w4.js → chunk-z0dmm227.js} +1 -1
  38. package/dist/{chunk-gcnke6s4.js → chunk-z5a8ay9s.js} +1 -1
  39. package/dist/{chunk-gr6e2vsy.js → chunk-zjpph3ys.js} +1 -1
  40. package/dist/{chunk-6hr7mv7f.js → chunk-zydvg30x.js} +1 -1
  41. package/dist/web/assets/{ChatView-Cwc3fRAC.js → ChatView-Cc4bXZ6x.js} +14 -14
  42. package/dist/web/assets/{CodeBlockHighlighter-IGDocZUy.js → CodeBlockHighlighter-DZcVFtJE.js} +1 -1
  43. package/dist/web/assets/{FilePreview-EWE-k9VN.js → FilePreview-CzNS6kfM.js} +1 -1
  44. package/dist/web/assets/{KanbanBoard-FiiVQgTQ.js → KanbanBoard-cdh2g0r0.js} +1 -1
  45. package/dist/web/assets/{MarkdownRenderer-DjhWmikM.js → MarkdownRenderer-BqBOUlXa.js} +3 -3
  46. package/dist/web/assets/{SettingsModal-bHPx0fVG.js → SettingsModal-meSWhCOP.js} +1 -1
  47. package/dist/web/assets/{TaskSwitcher-CclOfJEl.js → TaskSwitcher-CiQi64Yl.js} +1 -1
  48. package/dist/web/assets/{TerminalPanel-Bnep8jE2.js → TerminalPanel-Bze9t5mz.js} +1 -1
  49. package/dist/web/assets/{arrow-left-CiX0E9Mt.js → arrow-left-DpTnLOBT.js} +1 -1
  50. package/dist/web/assets/{calendar-clock-Bgfr-twh.js → calendar-clock-DlAXXpl_.js} +1 -1
  51. package/dist/web/assets/{chevrons-up-down-B4T5fHUs.js → chevrons-up-down-CmAktdaR.js} +1 -1
  52. package/dist/web/assets/{clock-3-CGIhJjon.js → clock-3-_w8nIuEK.js} +1 -1
  53. package/dist/web/assets/{external-link-DnQv1VYE.js → external-link-AlymrIfc.js} +1 -1
  54. package/dist/web/assets/{folder-C5f8TpGj.js → folder-CrxO-9Rc.js} +1 -1
  55. package/dist/web/assets/{index-DNoVz0u1.js → index-JJH0FKfo.js} +5 -5
  56. package/dist/web/assets/{pause-Cb0ijwnO.js → pause-GQZaG_P3.js} +1 -1
  57. package/dist/web/assets/{play-Dsw1qmpk.js → play-BPhmPVpi.js} +1 -1
  58. package/dist/web/assets/{session-events-B4Cq2TwN.js → session-events-CO2pRY9U.js} +8 -8
  59. package/dist/web/assets/{teamService-C69fFhny.js → teamService-BqS4iOx0.js} +1 -1
  60. package/dist/web/index.html +2 -2
  61. package/package.json +1 -1
  62. package/dist/chunk-2s86w4yb.js +0 -171
  63. package/dist/chunk-73t5j9dn.js +0 -160
  64. package/dist/chunk-8wzn2p00.js +0 -6
  65. package/dist/chunk-hx3c0qn6.js +0 -9
  66. package/dist/chunk-p4h3p1at.js +0 -23
  67. package/dist/chunk-t29x8420.js +0 -1
  68. package/dist/chunk-tsthz2ex.js +0 -8
  69. package/dist/chunk-vgevdm8b.js +0 -1
@@ -0,0 +1,160 @@
1
+ import{e as hJ,f as EJ}from"./chunk-j00px1es.js";import{i as CY,j as IY,k as fY}from"./chunk-f8z5v101.js";import{u as e2}from"./chunk-tp5bep1y.js";import{B as l6,F as cY,H as NQ,I as UQ,J as j6,P as R6,Q as M6,U as B1,W as J6,X as Y6,_ as T6,aa as _2,ba as eJ,ca as $Y,fa as QY,ga as JY,ka as b4,la as Y9,na as $9,oa as Q9,pa as xY,qa as N6,sa as F6,ua as d6}from"./chunk-2f5kkhan.js";import"./chunk-0zhdjaen.js";import{Ca as _J,Da as NJ,Ea as FJ,Ha as pY}from"./chunk-2cg8f38t.js";import{Ja as y6}from"./chunk-hz5rsfxv.js";import{Db as P6,Mb as ZQ,qb as b6,rb as A6}from"./chunk-qjv5kz7q.js";import{Xb as H2}from"./chunk-8hprmrd5.js";import{Bd as K6,Cd as YQ,Dd as G6,Fd as r2,Nd as z2,Qd as T0,ad as W6,pd as $6,ud as Q6}from"./chunk-zydvg30x.js";import"./chunk-s0tq8gyx.js";import"./chunk-hpjnk87v.js";import{te as MY}from"./chunk-10taec1j.js";import{ue as L2,ve as $8,xe as f1}from"./chunk-8yt4nmyb.js";import"./chunk-rej5bbbs.js";import{$e as m0,Be as k$,Ce as a0,De as J$,Ee as gQ,Fe as g$,Ge as a2,He as j9,Ie as Z4,Je as IJ,Ke as h9,Le as V$,Me as l0,Ne as gY,Oe as o0,Pe as RY,Qe as V8,Re as F2,Ue as z6}from"./chunk-z0dmm227.js";import"./chunk-v508x7cg.js";import"./chunk-dg0d3303.js";import"./chunk-3awjdsef.js";import{pf as X4}from"./chunk-53xtssbf.js";import"./chunk-2hb222re.js";import"./chunk-2191220r.js";import{Bf as J8,Ef as WY,Jf as sJ,Sf as mY}from"./chunk-nh4jy5cs.js";import"./chunk-fvfc95g3.js";import"./chunk-qcy79mva.js";import"./chunk-p0rvgzpx.js";import{mg as cQ,og as q1}from"./chunk-dcjh1cj6.js";import"./chunk-c6tq09mt.js";import{qh as hY,vh as tJ,wh as EY}from"./chunk-z5a8ay9s.js";import"./chunk-f9asjkfz.js";import"./chunk-czcxx8tb.js";import{Fh as m$,Gh as o2,Ih as xQ}from"./chunk-maebpz1j.js";import{Nh as d0}from"./chunk-9sx3vsyj.js";import"./chunk-70hwyc2w.js";import{ki as jY,ni as s1}from"./chunk-d8wzc602.js";import{pi as DJ,qi as VJ,ti as E1}from"./chunk-425p4nwx.js";import"./chunk-k7vv9vne.js";import{Fi as yJ}from"./chunk-8z9d0zd0.js";import{Ii as L4}from"./chunk-cp7xsjj2.js";import"./chunk-2va6ex5v.js";import{Ti as JQ}from"./chunk-q3vza5gt.js";import{Vi as pQ}from"./chunk-w9xfks7f.js";import{useMemoizedFn as l8}from"ahooks";import{useEffect as D7,useState as d8}from"react";import{useMemoizedFn as s0}from"ahooks";import{Box as _$}from"ink";import{useEffect as N$,useMemo as T7,useRef as c8}from"react";import{useShallow as dY}from"zustand/react/shallow";import{useStore as lY}from"zustand";function t($){return lY(V$,$)}var rY=[],j$=()=>t(($)=>$.session.sessionId),I1=()=>t(($)=>$.session.workspaceRoot),A4=()=>t(($)=>$.session.messages),P4=()=>t(($)=>$.session.clearCount),y4=()=>t(($)=>$.session.isCompacting),R4=()=>t(($)=>$.session.tokenUsage.estimatedCostUsd),M4=()=>t(($)=>{let{totalInputTokens:Q,cacheReadTokens:Y,cacheWriteTokens:J}=$.session.tokenUsage;return b4({totalInputTokens:Q,cacheReadTokens:Y,cacheWriteTokens:J}).hitRate}),T4=()=>t(($)=>$.session.providerCircuit),C4=()=>t(($)=>$.session.providerAdmission),I4=()=>t(($)=>$.session.providerRetry),f4=()=>t(($)=>$.session.providerStall),k4=()=>t(($)=>$.session.actionStationarity),n1=()=>t(($)=>$.session.actions),S4=()=>t(($)=>{let{totalTokens:Q,maxContextTokens:Y}=$.session.tokenUsage;if(Y<=0)return 100;let J=Math.max(0,100-Q/Y*100);return Math.round(J)}),v4=()=>t(($)=>$.app.initializationStatus),D4=()=>t(($)=>$.app.initializationError),V2=()=>t(($)=>$.app.activeModal),V4=()=>t(($)=>$.app.tasks),j4=()=>t(($)=>$.app.modelEditorTarget),h4=()=>t(($)=>$.app.sessionSelectorData),E4=()=>t(($)=>$.app.awaitingSecondCtrlC),t1=()=>t(($)=>$.app.actions),j2=()=>t(($)=>$.app.sideConversation),g4=()=>t(($)=>$.app.teams),h2=()=>t(($)=>$.app.initializationStatus==="ready"),m4=()=>t(($)=>$.app.tasks.length>0),h$=()=>t(($)=>$.config.config?.permissionMode||"default"),p4=()=>t(($)=>$.config.config?.models??rY),E2=()=>t(($)=>{let Q=$.config.config;if(!Q)return;let Y=Q.currentModelId;return Q.models.find((Z)=>Z.id===Y)??Q.models[0]}),g2=()=>t(($)=>$.config.config?.currentModelId),c4=()=>t(($)=>$.config.config?.agentTeamsEnabled===!0),b0=()=>t(($)=>{return a0.getTheme()}),x4=()=>t(($)=>$.config.config?.codeTheme??"default"),e0=()=>t(($)=>$.focus.currentFocus),u4=()=>t(($)=>$.focus.actions),E$=()=>t(($)=>$.command.isProcessing),l4=()=>t(($)=>$.command.actions),m2=()=>t(($)=>$.command.pendingCommands),d4=()=>t(($)=>$.command.recoveredSteeringCount),p2=()=>t(($)=>$.app.reasoningEffort!=="off"),c2=()=>t(($)=>$.app.reasoningEffort),x2=()=>t(($)=>$.app.serviceTier),u2=()=>t(($)=>$.app.responseVerbosity),l2=()=>t(($)=>$.app.communicationStyle),r4=()=>t(($)=>$.session.currentThinkingContent),a4=()=>t(($)=>$.session.thinkingExpanded),o4=()=>t(($)=>$.session.currentStreamingMessageId),i4=()=>t(dY(($)=>({lines:$.session.currentStreamingLines,tail:$.session.currentStreamingTail,lineCount:$.session.currentStreamingLineCount,version:$.session.currentStreamingVersion}))),n4=()=>t(($)=>$.session.finalizingStreamingMessageId),t4=()=>t(($)=>$.session.historyExpanded),s4=()=>t(($)=>$.session.expandedMessageCount);import{useMemoizedFn as e1}from"ahooks";import{useEffect as c$,useRef as QQ}from"react";function aY($){if(!($ instanceof Error))return"未知错误";let J=$.lastError??$;if(J.responseBody)try{let K=JSON.parse(J.responseBody)?.error?.message;if(K){let U=J.statusCode?` (HTTP ${J.statusCode})`:"";return`${K}${U}`}}catch{}let Z=$.message.match(/Last error:\s*(.+)$/);if(Z)return Z[1];return $.message}function oY($){if(!($ instanceof Error))return!1;return $.name==="AbortError"||$.message.includes("aborted")}function iY($){if(!($ instanceof Error))return!1;let Q=$.message;return Q.includes("can only concatenate str")||Q.includes("image_url")||Q.includes("multimodal")||Q.includes("vision")||Q.includes("does not support images")}function d2($){let Q=oY($),Y=iY($),J;if(Y)J="当前模型不支持图片理解功能。请切换到支持视觉能力的模型(如 Claude 4.5、GPT-5.2、Gemini 3 Pro、Qwen3-VL-Plus 等)后重试。";else J=aY($);return{displayMessage:J,isAbort:Q,isVisionNotSupported:Y}}import{appendFileSync as nY,mkdirSync as tY,writeFileSync as sY}from"node:fs";import eY from"node:os";import i8 from"node:path";var e4=null;function $3(){let $=process.env.BLADE_STORAGE_ROOT||i8.join(eY.homedir(),".blade");return i8.join($,"logs","stream-debug.log")}function Q3($){if(e4===$)return;let Q=i8.dirname($);tY(Q,{recursive:!0,mode:493}),sY($,`=== Stream Debug Log Started: ${new Date().toISOString()} ===
2
+ `),e4=$}function n8($,Q,Y){try{let J=$3();Q3(J);let Z=new Date().toISOString(),X=Y?` | ${JSON.stringify(Y)}`:"",K=`[${Z}] [${$}] ${Q}${X}
3
+ `;nY(J,K)}catch{}}var O2=s1("UI");function s8($,Q){if(Q.state==="requires_attention"){let Y=Q.reason==="interrupted_tool_call";$.addToolMessage("Turn recovery requires attention",{toolName:"Runtime Recovery",phase:"complete",summary:Y?"An interrupted tool may have partially completed":"A completed tool may already have changed external state",detail:`${Q.turnId} · inspect workspace, processes, and external state before retrying`});return}$.addToolMessage(Q.state==="completed"?"Recovered completed turn":"Resuming interrupted turn",{toolName:"Runtime Recovery",phase:"complete",summary:Q.state==="completed"?"The durable final response was recovered":"No tool execution was recorded before interruption",detail:Q.turnId})}function Z6($,Q){let Y=!1;return(J)=>{switch(J.kind){case"content_delta":if(Y||$.signal.aborted)break;Q.contentDeltaCount++,Q.contentDeltaTotalLen+=J.delta.length,n8("loopEventHandler","onContentDelta",{callCount:Q.contentDeltaCount,deltaLen:J.delta.length,totalLen:Q.contentDeltaTotalLen}),$.streamingBuffer.batchAppendContent(J.delta);break;case"thinking_delta":if(Y||$.signal.aborted)break;if($.thinkingModeEnabled)$.streamingBuffer.batchAppendThinking(J.delta);break;case"stream_end":{if($.sessionActions.setProviderCircuit(null),$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),O2.debug("[loopEventHandler] stream_end",{contentDeltaCount:Q.contentDeltaCount,contentDeltaTotalLen:Q.contentDeltaTotalLen,streamFinalized:Y,signalAborted:$.signal.aborted}),n8("loopEventHandler","onStreamEnd",{contentDeltaCallCount:Q.contentDeltaCount,contentDeltaTotalLen:Q.contentDeltaTotalLen,streamFinalized:Y,signalAborted:$.signal.aborted}),Y||$.signal.aborted){Y=!0;break}let{extraContent:Z,extraThinking:X}=$.streamingBuffer.drainPendingBuffers(),K=$.getStreamingMessageId();if(K){if(Z)g$(K,Z);a2(K)}$.sessionActions.finalizeStreamingMessage(Z,X),Y=!0;break}case"model_fallback":Y=!0,$.sessionActions.setProviderAdmission(null),$.sessionActions.setProviderCircuit(null),$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),$.streamingBuffer.resetStreamingBuffers(),$.sessionActions.discardStreamingMessage(),$.sessionActions.setCurrentThinkingContent(null);break;case"provider_admission":{let{kind:Z,...X}=J;$.sessionActions.setProviderAdmission(J.phase==="queued"?X:null);break}case"provider_circuit":{let{kind:Z,...X}=J;$.sessionActions.setProviderCircuit(J.phase==="closed"?null:X);break}case"provider_retry":{let{kind:Z,...X}=J;$.sessionActions.setProviderRetry(J.phase==="recovered"?null:X);break}case"provider_stall":{let{kind:Z,...X}=J;$.sessionActions.setProviderStall(J.phase==="detected"?X:null);break}case"action_stationarity":{let{kind:Z,...X}=J;$.sessionActions.setActionStationarity(J.phase==="recovered"?null:X);break}case"turn_recovery":{s8($.sessionActions,J.assessment);break}case"tool_start":{let Z=J.toolCall;if(!("function"in Z))break;if(Z.function.name===r2)break;if(O2.debug("[loopEventHandler] tool_start",{toolName:Z.function.name,toolKind:J.toolKind}),["TaskCreate","TaskUpdate","TaskList"].includes(Z.function.name))break;try{let X=JSON.parse(Z.function.arguments),K=J6(Z.function.name,X);$.sessionActions.addToolMessage(K,{toolCallId:Z.id,toolName:Z.function.name,phase:"start",summary:K,params:X})}catch(X){O2.error("[loopEventHandler] onToolStart error:",X)}break}case"tool_progress":{let Z=J.toolCall;if(!("function"in Z))break;if(Z.function.name===r2)break;let X=J.update.total!==void 0?` ${Math.max(0,Math.min(100,Math.round((J.update.progress??0)/J.update.total*100)))}%`:"",K=`${Z.function.name}${X}: ${J.update.message}`;$.sessionActions.addToolMessage(K,{toolCallId:Z.id,toolName:Z.function.name,phase:"progress",summary:K,...J.update.admission?{admission:J.update.admission}:{}});break}case"tool_result":{let Z=J.toolCall;if(!("function"in Z))break;if(Z.function.name===r2)break;O2.debug("[loopEventHandler] tool_result",{toolName:Z.function.name,success:J.result.success});let X=Q6(Y6(Z.function.name,J.result),$6);$.sessionActions.addToolMessage(X.summary,{toolCallId:Z.id,toolName:Z.function.name,phase:"complete",summary:X.summary,detail:X.detail});break}case"structured_output":$.sessionActions.replaceLastAssistantMessage(JSON.stringify(J.output,null,2));break;case"token_usage":$.sessionActions.updateTokenUsage(J.usage);break;case"compaction":if($.sessionActions.setCompacting(J.phase==="start"),J.phase==="end"){if($.sessionActions.resetContextUsage(),J.outcome!=="failed")Q.compactionCount=(Q.compactionCount??0)+1}break;case"turn_start":O2.debug("[loopEventHandler] turn_start",{turn:J.turn,maxTurns:J.maxTurns}),$.sessionActions.updateTokenUsage({turnCount:J.turn}),$.sessionActions.setProviderCircuit(null),$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),Y=!1;break;case"task_update":$.appActions.setTasks(J.tasks);break;case"mcp_catalog_changed":{let Z=`MCP catalog r${J.revision}: +${J.added.length} -${J.removed.length} ~${J.updated.length}`;$.sessionActions.addToolMessage(Z,{toolName:"MCP Catalog",phase:"complete",summary:Z,detail:[J.added.length>0?`Added: ${J.added.join(", ")}`:"",J.removed.length>0?`Removed: ${J.removed.join(", ")}`:"",J.updated.length>0?`Updated: ${J.updated.join(", ")}`:""].filter(Boolean).join(`
4
+ `)});break}case"mcp_content_changed":{let Z=`MCP ${J.contentKind} r${J.revision}: +${J.added.length} -${J.removed.length} ~${J.updated.length}`;$.sessionActions.addToolMessage(Z,{toolName:"MCP Content",phase:"complete",summary:Z,detail:[J.added.length>0?`Added: ${J.added.join(", ")}`:"",J.removed.length>0?`Removed: ${J.removed.join(", ")}`:"",J.updated.length>0?`Updated: ${J.updated.join(", ")}`:""].filter(Boolean).join(`
5
+ `)});break}case"mcp_resource_updated":{let Z=`MCP resource updated: ${J.uri}`;$.sessionActions.addToolMessage(Z,{toolName:"MCP Resource",phase:"progress",summary:Z,detail:`${J.serverName} · revision ${J.revision}`});break}case"mcp_connection_changed":{let Z=J.phase==="reconnecting"?"recovering":J.phase==="recovered"?"recovered":"recovery failed",X=`MCP ${J.serverName} ${Z}`+(J.phase==="reconnecting"?` (${J.attempt}/${J.maxAttempts})`:"");$.sessionActions.addToolMessage(X,{toolName:"MCP Connection",phase:"complete",summary:X,detail:[`reason: ${J.reason}`,`revision: ${J.revision}`,J.error?`error: ${J.error}`:""].filter(Boolean).join(`
6
+ `)});break}case"mcp_log":{let Z=J.logger?`${J.serverName} · ${J.logger}`:J.serverName,X=`MCP ${J.level} · ${Z}`;$.sessionActions.addToolMessage(X,{toolName:"MCP Log",phase:"complete",summary:X,detail:[J.message,`revision: ${J.revision}`,`sha256: ${J.dataSha256}`,J.truncated?"truncated: true":"",J.detailsOmitted?"details omitted by runtime policy":""].filter(Boolean).join(`
7
+ `)});break}case"mcp_instructions_changed":{let Z=`MCP instructions ${J.action}: ${J.serverName}`+(J.truncated?" (truncated)":"");$.sessionActions.addToolMessage(Z,{toolName:"MCP Instructions",phase:"complete",summary:Z,detail:[J.text??"",J.sha256?`sha256: ${J.sha256}`:"",J.detailsOmitted?"details omitted by runtime policy":""].filter(Boolean).join(`
8
+ `)});break}case"mcp_task_changed":{let Z=`MCP task ${J.status}: ${J.taskId} (${J.serverName}/${J.toolName})`;$.sessionActions.addToolMessage(Z,{toolName:"MCP Task",phase:"complete",summary:Z,detail:[J.statusMessage??"",`revision: ${J.revision}`,J.hasResult?"result available via TaskOutput":"",J.error?`error: ${J.error}`:""].filter(Boolean).join(`
9
+ `)});break}case"project_rules_loaded":{let Z=`Project rules loaded: ${J.files.length}`+(J.blockedWrite?" (write retry required)":"");$.sessionActions.addToolMessage(Z,{toolName:"Project Rules",phase:"complete",summary:Z,detail:J.files.map((X)=>`${X.relativePath} ${X.source} sha256=${X.contentSha256}`).join(`
10
+ `)});break}case"steering_applied":for(let Z=0;Z<J.count;Z++)$.commandActions.dequeueCommand();if(J.recovered>0)$.commandActions.setRecoveredSteeringCount(J.recovered);break;case"follow_up_started":for(let Z of J.messages){if(!Z.recovered||Z.persisted)continue;let X=typeof Z.content==="string"?Z.content:Z.content.map((K)=>K.type==="text"?K.text:"[Image]").join(`
11
+ `);$.sessionActions.addUserMessage(X)}if(J.recovered>0)$.commandActions.setRecoveredSteeringCount(J.recovered);break;case"goal_updated":case"goal_continuation_started":break;case"subagent_spawned":case"subagent_completed":break;default:{let Z=J}}}}function e8($){let{text:Q,parts:Y}=$,J=Y.filter((K)=>K.type==="image");if(J.length===0)return Q;if(J.length>m$)throw Error(`最多只能发送 ${m$} 张图片`);if(J.reduce((K,U)=>K+`data:${U.mimeType};base64,`.length+U.base64.length,0)>o2)throw Error("图片编码后总大小不能超过 5 MiB");let X=[];for(let K of Y)if(K.type==="text")X.push({type:"text",text:K.text});else X.push({type:"image_url",image_url:{url:`data:${K.mimeType};base64,${K.base64}`}});return X}function X6($){let Q=G6($.metadata);return{role:$.role,content:Q?K6(Q):$.content,...$.metadata?{metadata:$.metadata}:{}}}function i2($){if(!$.restoredContextMessages||$.restoredVisibleMessageCount<=0)return $.messages.map(X6);let Q=$.messages.slice($.restoredVisibleMessageCount).map(X6);return[...$.restoredContextMessages,...Q]}import J3 from"node:path";function U6($){if($.length<=8)return $;return`${$.slice(0,8)}…`}function Y3($){return J3.resolve($)}function q6($){if(!$||!z6($))return;l0().config.actions.updateConfig({currentModelId:$})}function O6($){if(!$)return;l0().config.actions.updateConfig({permissionMode:$})}async function n2($,Q){return T0.listSessions({includeSubagents:!1})}async function t2($,Q,Y,J){let{intent:Z,session:X,newSessionId:K,announceFork:U,permissionModeOverride:G}=$,q=Y3(X.projectPath);if(Z==="fork"){let z=await T0.forkSession(X.sessionId,{...K?{newSessionId:K}:{},sourceProjectPath:q,targetProjectPath:q}),b=await T0.loadSessionModelContext(z.sessionId,z.metadata.projectPath),N=[...T0.toUISafeMessages(z.messages)];if(U!==!1){let A=Date.parse(z.metadata.lastMessageTime);N.push({id:"fork-announcement-"+z.sessionId,role:"assistant",content:"Forked "+U6(X.sessionId)+" → "+U6(z.sessionId),timestamp:Number.isNaN(A)?0:A})}return await J(),O6(G??z.metadata.permissionMode),q6(z.metadata.selectedModelId),Y.restoreSession(z.sessionId,N,b,z.metadata.projectPath),{sessionId:z.sessionId,messages:b}}await T0.assertSessionWritable(X.sessionId,X.projectPath);let[L,O]=await Promise.all([T0.loadSession(X.sessionId,X.projectPath),T0.loadSessionModelContext(X.sessionId,X.projectPath)]),W=T0.toUISafeMessages(L);return await J(),O6(G??X.permissionMode),q6(X.selectedModelId),Y.restoreSession(X.sessionId,W,O,X.projectPath),{sessionId:X.sessionId,messages:O}}function _6($){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 Z3($){return typeof $==="object"&&$!==null&&$.action==="invoke_skill"&&typeof $.skillName==="string"}function X3($){return typeof $==="object"&&$!==null&&$.action==="invoke_custom_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function K3($){return typeof $==="object"&&$!==null&&$.action==="invoke_plugin_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function G3($){return typeof $==="object"&&$!==null&&$.action==="invoke_once_model"&&typeof $.modelId==="string"&&typeof $.prompt==="string"}function U3($){return typeof $==="object"&&$!==null&&["start_goal","resume_goal"].includes(String($.action))&&typeof $.goal?.objective==="string"}function q3($){return typeof $==="object"&&$!==null&&$.action==="rewind_session"&&typeof $.sessionId==="string"&&Array.isArray($.messages)&&Array.isArray($.visibleMessages)}function O3($){if(typeof $!=="object"||$===null)return!1;let Q=$.intent;if(Q!=="resume"&&Q!=="fork")return!1;let Y=$.action;if(Y==="select_session"){let J=$.sessions;return Array.isArray(J)&&J.every((Z)=>_6(Z))}if(Y==="activate_session")return _6($.session);return!1}function z3($,Q,Y,J){switch($){case"show_theme_selector":return Y.setActiveModal("themeSelector"),!0;case"show_model_selector":return Y.setActiveModal("modelSelector"),!0;case"show_model_add_wizard":return Y.setActiveModal("modelAddWizard"),!0;case"show_permissions_manager":return Y.setActiveModal("permissionsManager"),!0;case"show_agents_manager":return Y.setActiveModal("agentsManager"),!0;case"show_skills_manager":return Y.setActiveModal("skillsManager"),!0;case"show_hooks_manager":return Y.setActiveModal("hooksManager"),!0;case"show_plugins_manager":return Y.setActiveModal("pluginsManager"),!0;case"show_agent_creation_wizard":return Y.setActiveModal("agentCreationWizard"),!0;case"show_session_selector":{let Z=Q?.sessions;return Y.showSessionSelector(Z??[],"resume"),!0}case"session_forked":{let Z=Q;if(Z?.action!=="restore_forked_session"||!Z.sessionId||!Array.isArray(Z.messages)||!Array.isArray(Z.visibleMessages))return!1;return J.restoreSession(Z.sessionId,Z.visibleMessages,Z.messages),!0}case"session_archived":{let Z=Q?.session;return J.addAssistantMessage(Z?`会话 ${Z.sessionId} 已归档。`:"当前会话已归档。"),f1(0),!0}case"clear_screen":return J.clearMessages(),J.setError(null),J.resetTokenUsage(),Y.setTasks([]),!0;case"compact_completed":case"compact_fallback":{let Z=Q,X=Z?.compactedMessages;if(X)J.setCompactedContext(X);if(Z?.usage)J.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 J.resetContextUsage(),!0}case"exit_application":return f1(0),!0;default:return!1}}async function $Q($,Q,Y,J,Z,X,K,U,G,q,L,O,W,z,b=d0(),N){let{text:A}=$;if(!N6(A))return{type:"not_slash"};let _=await F6(A,{cwd:b,surface:"tui",workspaceRoot:b,sessionId:X,messages:K,rewind:U,lifecycle:X===void 0?void 0:{archiveCurrent:async()=>{return await Z(),T0.archiveSession(X,b)}},subagents:G,mcp:q,reasoning:L,serviceTier:O,responseVerbosity:W,communicationStyle:z,codeReview:N,signal:J});if(_.success&&O3(_.data)){if(_.data.action==="select_session")return Q.showSessionSelector(_.data.sessions,_.data.intent),{type:"handled",commandResult:{success:!0}};return await t2(_.data,b,Y,Z),{type:"handled",commandResult:{success:!0}}}if(_.success&&q3(_.data))return Y.restoreSession(_.data.sessionId,_.data.visibleMessages,_.data.messages),Q.setTasks([]),{type:"handled",commandResult:{success:!0}};if(_.message){if(z3(_.message,_.data,Q,Y))return{type:"handled",commandResult:{success:!0}}}if(Z3(_.data)){let{skillName:P,skillArgs:w}=_.data,C=w?`Please use the "${P}" skill to help me with: ${w}`:`Please use the "${P}" skill.`;return Y.addUserMessage(C),{type:"continue_as_agent",result:{userDisplayMessage:C,agentInput:{displayText:C,text:C,images:[],parts:[{type:"text",text:C}]},userMessageAlreadyAdded:!0}}}if(X3(_.data)){let{commandName:P,processedContent:w}=_.data;Y.addUserMessage(A);let C=`# Custom Command: /${P}
12
+
13
+ The user has invoked the custom command "/${P}". Follow the instructions below to complete the task.
14
+
15
+ ---
16
+
17
+ ${w}
18
+
19
+ ---
20
+
21
+ Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:A,agentInput:{displayText:A,text:C,images:[],parts:[{type:"text",text:C}]},userMessageAlreadyAdded:!0}}}if(K3(_.data)){let{commandName:P,pluginName:w,processedContent:C}=_.data;Y.addUserMessage(A);let B=`# Plugin Command: /${P}
22
+
23
+ The user has invoked the plugin command "/${P}" from plugin "${w}". Follow the instructions below to complete the task.
24
+
25
+ ---
26
+
27
+ ${C}
28
+
29
+ ---
30
+
31
+ Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:A,agentInput:{displayText:A,text:B,images:[],parts:[{type:"text",text:B}]},userMessageAlreadyAdded:!0}}}if(G3(_.data)){let{modelId:P,prompt:w}=_.data;return Y.addUserMessage(w),{type:"continue_as_agent",result:{userDisplayMessage:w,agentInput:{displayText:w,text:w,images:[],parts:[{type:"text",text:w}]},userMessageAlreadyAdded:!0,onceModelId:P}}}if(U3(_.data)){let P=_.data.goal.objective;return Y.addUserMessage(A),{type:"continue_as_agent",result:{userDisplayMessage:A,agentInput:{displayText:A,text:P,images:[],parts:[{type:"text",text:P}]},userMessageAlreadyAdded:!0,goalContinuationOnly:!0}}}if(!_.success&&_.error)return Y.addAssistantMessage(`${_.error}`),{type:"handled",commandResult:{success:_.success,output:_.message,error:_.error,metadata:_.data}};let k=_.message;if(_.success&&typeof k==="string"&&k.trim()!=="")Y.addAssistantMessage(k);return{type:"handled",commandResult:{success:_.success,output:_.message,error:_.error,metadata:_.data}}}import{useMemoizedFn as y0}from"ahooks";import{useEffect as _3,useRef as s2}from"react";function H6($){let Q=s2(void 0),Y=s2(void 0),J=s2(void 0),Z=s2(void 0),X=y0(async()=>{if(Z.current)return Z.current;let F=Q.current,R=Y.current;if(!F&&!R)return;Q.current=void 0,Y.current=void 0,J.current=void 0;let V=(async()=>{try{await F?.destroy()}finally{await R?.dispose()}})();Z.current=V;try{await V}finally{if(Z.current===V)Z.current=void 0}}),K=y0(async(F)=>{let R=$.workspaceRoot??Y.current?.workspaceRoot??d0();if(Y.current&&(Y.current.sessionId!==F||Y.current.workspaceRoot!==R))await X();if(!Y.current){let V=await T0.findSessionMetadata(F,R),I=V!==void 0&&(await T0.loadSession(F,R)).length>0;Y.current=await B1.create({sessionId:F,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,...I?{sessionStart:{isResume:!0,resumeSessionId:F}}:{}});try{J.current={sessionId:F,modelId:V?.selectedModelId,permissionMode:V?.permissionMode,reasoningEffort:V?.reasoningEffort,serviceTier:V?.serviceTier,responseVerbosity:V?.responseVerbosity,communicationStyle:V?.communicationStyle,communicationStyleDigest:V?.communicationStyleDigest},o0().setReasoningEffort(Y.current.getReasoningConfiguration().selection),o0().setServiceTier(Y.current.getServiceTierConfiguration().selection),o0().setResponseVerbosity(Y.current.getResponseVerbosityConfiguration().selection),o0().setCommunicationStyle(Y.current.getCommunicationStyleConfiguration().selection)}catch(v){let h=Y.current;throw Y.current=void 0,await h.dispose().catch(()=>{return}),v}}return Y.current}),U=y0(async(F)=>{let R=F?.sessionId??$.sessionId,V=!!F?.modelId&&F.modelId!==$.modelId,I;if(!V&&R){let v=Y.current!==void 0,h=await K(R),Q0=F?.modelId??$.modelId,e=F?.reasoningEffort??(v?$.reasoningEffort:h.getReasoningConfiguration().selection),X0=F?.serviceTier??(v?$.serviceTier:h.getServiceTierConfiguration().selection),A0=F?.responseVerbosity??(v?$.responseVerbosity:h.getResponseVerbosityConfiguration().selection),D0=F?.communicationStyle??(v?$.communicationStyle:h.getCommunicationStyleConfiguration().selection),j0=h.getCurrentModelId(),W$=h.getReasoningConfiguration(),X2=h.getServiceTierConfiguration(),K2=h.getResponseVerbosityConfiguration(),G2=h.getCommunicationStyleConfiguration();if($.permissionMode&&(J.current?.sessionId!==R||J.current.permissionMode!==$.permissionMode)){let c0=await T0.setSessionPermissionMode(R,h.workspaceRoot,$.permissionMode);J.current={...J.current,sessionId:R,permissionMode:c0.permissionMode}}await h.refresh({modelId:Q0,...e?{reasoningEffort:e}:{},...X0?{serviceTier:X0}:{},...A0?{responseVerbosity:A0}:{},...D0?{communicationStyle:D0}:{}});let j1=h.getCommunicationStyleConfiguration();if(j1.source!=="built-in"&&!j1.contentSha256)throw Error("Custom communication style has no provenance");let v$={...Q0&&Q0!=="inherit"&&(J.current?.sessionId!==R||J.current.modelId!==Q0)?{selectedModelId:Q0}:{},...e&&(J.current?.sessionId!==R||J.current.reasoningEffort!==e)?{reasoningEffort:e}:{},...X0&&(J.current?.sessionId!==R||J.current.serviceTier!==X0)?{serviceTier:X0}:{},...A0&&(J.current?.sessionId!==R||J.current.responseVerbosity!==A0)?{responseVerbosity:A0}:{},...D0&&(J.current?.sessionId!==R||J.current.communicationStyle!==D0||J.current.communicationStyleDigest!==j1.contentSha256)?{communicationStyle:D0,communicationStyleDigest:j1.source==="built-in"?null:j1.contentSha256}:{}};if(Object.keys(v$).length>0)try{let c0=await T0.updateSessionMetadata(R,h.workspaceRoot,v$);J.current={sessionId:R,modelId:c0.selectedModelId,permissionMode:c0.permissionMode,reasoningEffort:c0.reasoningEffort,serviceTier:c0.serviceTier,responseVerbosity:c0.responseVerbosity,communicationStyle:c0.communicationStyle,communicationStyleDigest:c0.communicationStyleDigest}}catch(c0){throw await h.refresh({...j0?{modelId:j0}:{},reasoningEffort:W$.selection,serviceTier:X2.selection,responseVerbosity:K2.selection,communicationStyle:G2.selection}).catch(()=>{return}),c0}I=await _2.createWithRuntime(h,{sessionId:R,systemPrompt:F?.systemPrompt??$.systemPrompt,appendSystemPrompt:F?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:F?.maxTurns??$.maxTurns,modelId:F?.modelId??$.modelId,permissionMode:F?.permissionMode??$.permissionMode,agents:$.agents})}else I=await _2.create({systemPrompt:F?.systemPrompt??$.systemPrompt,appendSystemPrompt:F?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:F?.maxTurns??$.maxTurns,modelId:F?.modelId??$.modelId,permissionMode:F?.permissionMode??$.permissionMode,agents:$.agents});return Q.current=I,I}),G=y0(async()=>{if(!$.sessionId)throw Error("No active session to rewind");return(await K($.sessionId)).listRewindCheckpoints()}),q=y0(async(F)=>{if(!$.sessionId)throw Error("No active session to rewind");let V=await(await K($.sessionId)).rewindSession(F);return await X(),V}),L=y0(async()=>{if(!$.sessionId)throw Error("No active session for subagent control");return(await K($.sessionId)).listSubagents()}),O=y0(async(F,R)=>{if(!$.sessionId)throw Error("No active session for subagent control");let V=await K($.sessionId),I=!1,v,h=F,Q0=(X0)=>{let A0=X0.status==="completed"?X0.result?.message:X0.result?.error||X0.result?.message;V$.getState().app.actions.completeSubagentProgress(h,X0.status==="completed",A0)},e=V.resumeSubagent({agentId:F,prompt:R,onEvent:(X0)=>{if(X0.kind==="tool_start"&&"function"in X0.toolCall)V$.getState().app.actions.updateSubagentTool(h,X0.toolCall.function.name)},onCompleted:(X0)=>{if(I)Q0(X0);else v=X0}});if(h=e.session.id,V$.getState().app.actions.startSubagentProgress(e.session.id,e.session.subagentType,`Resumed from ${e.source.id}: ${e.session.description}`),I=!0,v)Q0(v);return e}),W=y0(async()=>{if(!$.sessionId)throw Error("No active session for MCP content");return(await K($.sessionId)).getMcpContentCatalog()}),z=y0(async(F)=>{if(!$.sessionId)throw Error("No active session for MCP content");await(await K($.sessionId)).refreshMcpContentCatalogs(F)}),b=y0(async(F,R,V)=>{if(!$.sessionId)throw Error("No active session for MCP prompts");return(await K($.sessionId)).getMcpPrompt(F,R,V)}),N=y0(async(F,R,V)=>{if(!$.sessionId)throw Error("No active session for MCP completion");return(await K($.sessionId)).completeMcpArgument(F,R,V)}),A=y0(async(F,R={})=>{if(!$.sessionId)throw Error("No active session for MCP logs");return(await K($.sessionId)).getMcpLogs(F,R)}),T=y0(async(F)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await K($.sessionId)).listMcpTasks(F)}),_=y0(async(F)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await K($.sessionId)).getMcpTask(F)}),k=y0(async(F,R)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await K($.sessionId)).cancelMcpTask(F,R)}),P=y0(async(F,R)=>{if(!$.sessionId)throw Error("No active session for MCP logging");await(await K($.sessionId)).setMcpLoggingLevel(F,R)}),w=y0(async()=>{if(!$.sessionId)throw Error("No active session for MCP instructions");return(await K($.sessionId)).getMcpInstructions()}),C=y0(async()=>{if(!$.sessionId)throw Error("No active session for reasoning effort");return(await K($.sessionId)).getReasoningConfiguration()}),B=y0(async(F)=>{if(!$.sessionId)throw Error("No active session for reasoning effort");let R=await K($.sessionId);if(R.hasTurnOwner())throw Error("Cannot switch reasoning effort while a turn is active");let V=R.getReasoningConfiguration();if(R.resolveReasoningConfiguration(F),V.selection===F)return V;await R.refresh({reasoningEffort:F});try{let I;try{I=await T0.updateSessionMetadata($.sessionId,R.workspaceRoot,{reasoningEffort:F})}catch(v){if(!(v instanceof z2)&&v.code!=="ENOENT")throw v;I=await T0.createSessionMetadata($.sessionId,R.workspaceRoot,{taskStatus:"completed",selectedModelId:R.getCurrentModelId(),reasoningEffort:F,serviceTier:R.getServiceTierConfiguration().selection,responseVerbosity:R.getResponseVerbosityConfiguration().selection,communicationStyle:R.getCommunicationStyleConfiguration().selection})}return J.current={sessionId:$.sessionId,modelId:I.selectedModelId,permissionMode:I.permissionMode,reasoningEffort:I.reasoningEffort,serviceTier:I.serviceTier,responseVerbosity:I.responseVerbosity,communicationStyle:I.communicationStyle,communicationStyleDigest:I.communicationStyleDigest},o0().setReasoningEffort(F),R.getReasoningConfiguration()}catch(I){throw await R.refresh({reasoningEffort:V.selection}),I}}),y=y0(async()=>{if(!$.sessionId)throw Error("No active session for service tier");return(await K($.sessionId)).getServiceTierConfiguration()}),f=y0(async(F)=>{if(!$.sessionId)throw Error("No active session for service tier");let R=await K($.sessionId);if(R.hasTurnOwner())throw Error("Cannot switch service tier while a turn is active");let V=R.getServiceTierConfiguration();if(R.resolveServiceTierConfiguration(F),V.selection===F)return V;await R.refresh({serviceTier:F});try{let I;try{I=await T0.updateSessionMetadata($.sessionId,R.workspaceRoot,{serviceTier:F})}catch(v){if(!(v instanceof z2)&&v.code!=="ENOENT")throw v;I=await T0.createSessionMetadata($.sessionId,R.workspaceRoot,{taskStatus:"completed",selectedModelId:R.getCurrentModelId(),reasoningEffort:R.getReasoningConfiguration().selection,serviceTier:F,responseVerbosity:R.getResponseVerbosityConfiguration().selection,communicationStyle:R.getCommunicationStyleConfiguration().selection})}return J.current={sessionId:$.sessionId,modelId:I.selectedModelId,permissionMode:I.permissionMode,reasoningEffort:I.reasoningEffort,serviceTier:I.serviceTier,responseVerbosity:I.responseVerbosity,communicationStyle:I.communicationStyle,communicationStyleDigest:I.communicationStyleDigest},o0().setServiceTier(F),R.getServiceTierConfiguration()}catch(I){throw await R.refresh({serviceTier:V.selection}),I}}),M=y0(async()=>{if(!$.sessionId)throw Error("No active session for response verbosity");return(await K($.sessionId)).getResponseVerbosityConfiguration()}),H=y0(async(F)=>{if(!$.sessionId)throw Error("No active session for response verbosity");let R=await K($.sessionId);if(R.hasTurnOwner())throw Error("Cannot switch response verbosity while a turn is active");let V=R.getResponseVerbosityConfiguration();if(R.resolveResponseVerbosityConfiguration(F),V.selection===F)return V;await R.refresh({responseVerbosity:F});try{let I;try{I=await T0.updateSessionMetadata($.sessionId,R.workspaceRoot,{responseVerbosity:F})}catch(v){if(!(v instanceof z2)&&v.code!=="ENOENT")throw v;I=await T0.createSessionMetadata($.sessionId,R.workspaceRoot,{taskStatus:"completed",selectedModelId:R.getCurrentModelId(),reasoningEffort:R.getReasoningConfiguration().selection,serviceTier:R.getServiceTierConfiguration().selection,responseVerbosity:F,communicationStyle:R.getCommunicationStyleConfiguration().selection})}return J.current={sessionId:$.sessionId,modelId:I.selectedModelId,permissionMode:I.permissionMode,reasoningEffort:I.reasoningEffort,serviceTier:I.serviceTier,responseVerbosity:I.responseVerbosity,communicationStyle:I.communicationStyle,communicationStyleDigest:I.communicationStyleDigest},o0().setResponseVerbosity(F),R.getResponseVerbosityConfiguration()}catch(I){throw await R.refresh({responseVerbosity:V.selection}),I}}),S=y0(async()=>{if(!$.sessionId)throw Error("No active session for communication style");return(await K($.sessionId)).getCommunicationStyleConfiguration()}),E=y0(async(F)=>{if(!$.sessionId)throw Error("No active session for communication style");let R=await K($.sessionId);if(R.hasTurnOwner())throw Error("Cannot switch communication style while a turn is active");let V=R.getCommunicationStyleConfiguration(),I=R.resolveCommunicationStyleConfiguration(F);if(I.source!=="built-in"&&!I.contentSha256)throw Error("Custom communication style has no provenance");if(V.selection===F)return V;await R.refresh({communicationStyle:F});try{let v;try{v=await T0.updateSessionMetadata($.sessionId,R.workspaceRoot,{communicationStyle:F,communicationStyleDigest:I.source==="built-in"?null:I.contentSha256})}catch(h){if(!(h instanceof z2)&&h.code!=="ENOENT")throw h;v=await T0.createSessionMetadata($.sessionId,R.workspaceRoot,{taskStatus:"completed",selectedModelId:R.getCurrentModelId(),reasoningEffort:R.getReasoningConfiguration().selection,serviceTier:R.getServiceTierConfiguration().selection,responseVerbosity:R.getResponseVerbosityConfiguration().selection,communicationStyle:F,...I.source!=="built-in"&&I.contentSha256?{communicationStyleDigest:I.contentSha256}:{}})}return J.current={sessionId:$.sessionId,modelId:v.selectedModelId,permissionMode:v.permissionMode,reasoningEffort:v.reasoningEffort,serviceTier:v.serviceTier,responseVerbosity:v.responseVerbosity,communicationStyle:v.communicationStyle,communicationStyleDigest:v.communicationStyleDigest},o0().setCommunicationStyle(F),R.getCommunicationStyleConfiguration()}catch(v){throw await R.refresh({communicationStyle:V.selection}),v}}),n=y0(async(F)=>{if(!Y.current)return{accepted:!1,queued:0,reason:"no_active_turn"};return Y.current.enqueueSteering(F,{allowBeforeTurn:!0})}),r=y0(async(F,R)=>{let V=$.sessionId;if(!V)return{accepted:!1,queued:0,reason:"no_active_turn"};return(await K(V)).enqueueSteering(F,{allowBeforeTurn:!0,...R})}),o=y0(async(F,R)=>{let V=$.sessionId;if(!V)throw Error("Side conversation requires a Session");return(await K(V)).askSideQuestion(F,{signal:R,systemPrompt:$.systemPrompt,appendSystemPrompt:$.appendSystemPrompt})}),l=y0(async(F,R)=>{let V=$.sessionId;if(!V)throw Error("User shell command requires a Session");return(await K(V)).executeUserShellCommand(F,R)}),p=y0(()=>Y.current?.getTurnRecoveryAssessment()??{state:"none"}),d=y0(async(F,R)=>{let V=$.sessionId;if(!V)throw Error("Code review requires a Session");let I=await K(V);await e2.recoverInterrupted(I.workspaceRoot,V,I);let v=await e2.start({sessionId:V,projectPath:I.workspaceRoot,runtime:I,request:F,signal:R}),h=await v.completion,Q0=(await e2.list(I.workspaceRoot,V)).find((e)=>e.start.reviewId===v.reviewId);if(!Q0)throw Error(`Review not found after completion: ${v.reviewId}`);return{reviewId:v.reviewId,status:h.status,findings:h.findings.length,content:W6(Q0.start,h)}});return _3(()=>{let F=$8(X);return()=>{F(),X().catch(()=>{return})}},[X]),{agentRef:Q,createAgent:U,cleanupAgent:X,steerActiveTurn:n,enqueueSessionInput:r,askSideQuestion:o,runCodeReview:d,executeUserShellCommand:l,getTurnRecoveryAssessment:p,listRewindCheckpoints:G,rewindSession:q,listSubagents:L,resumeSubagent:O,getMcpContentCatalog:W,refreshMcpContentCatalogs:z,getMcpPrompt:b,completeMcpArgument:N,listMcpTasks:T,getMcpTask:_,cancelMcpTask:k,getMcpLogs:A,setMcpLoggingLevel:P,getMcpInstructions:w,getReasoningConfiguration:C,setReasoningEffort:B,getServiceTierConfiguration:y,setServiceTier:f,getResponseVerbosityConfiguration:M,setResponseVerbosity:H,getCommunicationStyleConfiguration:S,setCommunicationStyle:E}}import{useMemoizedFn as p$}from"ahooks";import{useEffect as N3,useRef as Q8}from"react";function L6($){let Q=0;for(let Y of $)if(Y===`
32
+ `)Q++;return Q}function B6($,Q){let Y=Q?.flushTimeout??300,J=Q?.minLinesToFlush??5,Z=Q?.minCharsToFlush??400,X=Q8(""),K=Q8(null),U=Q8(""),G=Q8(null),q=p$(()=>{if(X.current){let N=X.current,A=$.appendAssistantContent(N);g$(A,N),X.current=""}if(K.current)clearTimeout(K.current),K.current=null}),L=p$(()=>{if(U.current)$.appendThinkingContent(U.current),U.current="";if(G.current)clearTimeout(G.current),G.current=null}),O=p$((N)=>{X.current+=N;let A=X.current;if(L6(A)>=J||A.length>=Z){q();return}if(!K.current)K.current=setTimeout(q,Y)}),W=p$((N)=>{U.current+=N;let A=U.current;if(L6(A)>=J||A.length>=Z){L();return}if(!G.current)G.current=setTimeout(L,Y)}),z=p$(()=>{if(X.current="",K.current)clearTimeout(K.current),K.current=null;if(U.current="",G.current)clearTimeout(G.current),G.current=null}),b=p$(()=>{if(K.current)clearTimeout(K.current),K.current=null;if(G.current)clearTimeout(G.current),G.current=null;let N=X.current,A=U.current;return X.current="",U.current="",{extraContent:N,extraThinking:A}});return N3(()=>{return()=>{z()}},[z]),{batchAppendContent:O,batchAppendThinking:W,flushContentBuffer:q,flushThinkingBuffer:L,resetStreamingBuffers:z,drainPendingBuffers:b}}var N2=s1("UI");function w6($){return $.error?.type==="canceled"||$.error?.type==="aborted"||$.metadata?.abortReason==="interrupt"}var C6=($,Q,Y,J,Z,X)=>{let K=E$(),U=j$(),G=I1(),q=g2(),L=h$(),O=p2(),W=c2(),z=x2(),b=u2(),N=l2(),A=j2(),T=c4(),_=n1(),k=t1(),P=l4(),w=QQ(!1),C=QQ(!1),B=QQ(null),{createAgent:y,cleanupAgent:f,steerActiveTurn:M,enqueueSessionInput:H,listRewindCheckpoints:S,rewindSession:E,listSubagents:n,resumeSubagent:r,getMcpContentCatalog:o,refreshMcpContentCatalogs:l,getMcpPrompt:p,completeMcpArgument:d,listMcpTasks:F,getMcpTask:R,cancelMcpTask:V,getMcpLogs:I,setMcpLoggingLevel:v,getMcpInstructions:h,getReasoningConfiguration:Q0,setReasoningEffort:e,getServiceTierConfiguration:X0,setServiceTier:A0,getResponseVerbosityConfiguration:D0,setResponseVerbosity:j0,getCommunicationStyleConfiguration:W$,setCommunicationStyle:X2,runCodeReview:K2,askSideQuestion:G2,executeUserShellCommand:j1,getTurnRecoveryAssessment:v$}=H6({sessionId:U,workspaceRoot:G,systemPrompt:$,appendSystemPrompt:Q,maxTurns:J,modelId:q,permissionMode:L,reasoningEffort:W,serviceTier:z,responseVerbosity:b,communicationStyle:N,agents:X}),c0=B6(_),H$=e1(async()=>{if(!T||!U){k.setTeams([]);return}try{let N0=await new T6({configDir:JQ(),subagentRegistry:J8(G)}).list({sessionId:U,projectPath:G});if(l0().session.sessionId===U&&l0().session.workspaceRoot===G)k.setTeams(N0)}catch(J0){N2.warn("[useCommandHandler] Failed to refresh Agent Teams",J0)}}),M1=e1(async(J0,N0)=>{if(J0.images.length>0)return{success:!1,error:"User shell commands do not accept image attachments"};let F0=J0.text.trimStart().slice(1).trim();if(!F0)return{success:!1,error:"User shell command cannot be empty"};_.setCommand(`! ${F0}`);try{let D=await j1(F0,{signal:N0});if(_.addMessage({id:`user-shell-${D.executionId}`,role:"user",content:YQ(D.record),timestamp:Date.now(),metadata:{userShellCommand:D.record}}),D.delivery==="next_turn")C.current=!0;return{success:D.record.status!=="spawn_error",output:YQ(D.record),...D.record.status==="spawn_error"?{error:D.record.stderr||"User shell command failed"}:{}}}finally{_.setCommand(null)}});c$(()=>{return()=>{c0.resetStreamingBuffers()}},[c0.resetStreamingBuffers]),c$(()=>{return()=>{B.current?.abort("side-conversation-session-change"),B.current=null,k.dismissSideConversation()}},[k,U,G]),c$(()=>{k.setTeams([]),H$()},[T,k,H$,U,G]),c$(()=>{if(!O)_.setCurrentThinkingContent(null)},[O,_]);let L$=e1(()=>{if(B.current){B.current.abort("user-cancel"),B.current=null,k.dismissSideConversation();return}if(!K)return;Z?.();let{extraContent:J0,extraThinking:N0}=c0.drainPendingBuffers();P.abort("user-cancel"),k.setTasks([]);let F0=l0().session.currentStreamingMessageId;if(F0){if(J0)g$(F0,J0);a2(F0)}if(_.finalizeStreamingMessage(J0,N0),!w.current)_.addAssistantMessage("任务已停止"),w.current=!0}),r8=e1(async(J0,N0)=>{let F0=`side-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;if(k.startSideConversation(F0,N0),J0.images.length>0){k.failSideConversation(F0,"Side conversations do not accept image attachments");return}if(!N0){k.failSideConversation(F0,"Usage: /btw <question>");return}B.current?.abort("side-conversation-replaced");let D=new AbortController;B.current=D;try{let m=await G2(N0,D.signal);if(D.signal.aborted||B.current!==D)return;if(k.completeSideConversation(F0,m),m.usage)_.updateTokenUsage({inputTokens:m.usage.promptTokens,outputTokens:m.usage.completionTokens,totalTokens:m.usage.totalTokens,cacheReadTokens:m.usage.cacheReadInputTokens??0,cacheWriteTokens:m.usage.cacheCreationInputTokens??0,costUsd:m.usage.costUsd})}catch(m){if(D.signal.aborted||B.current!==D)return;k.failSideConversation(F0,m instanceof Error?m.message:String(m))}finally{if(B.current===D)B.current=null}}),S2=e1(async(J0,N0)=>{let F0={contentDeltaCount:0,contentDeltaTotalLen:0,compactionCount:0},D=Z6({sessionActions:_,appActions:k,commandActions:P,streamingBuffer:c0,thinkingModeEnabled:O,getStreamingMessageId:()=>l0().session.currentStreamingMessageId,signal:N0.signal},F0);return{loopResult:await P6(J0,D),stats:F0}}),a8=e1(async(J0)=>{let N0=!1,F0,D=!1,m=J0;try{if(J0.text.trimStart().startsWith("!")){let u0=P.getAbortController()??P.createAbortController();return await M1(J0,u0.signal)}await F2();let W0=P.getAbortController()??P.createAbortController(),x0=i2(l0().session),E0=await $Q(J0,k,_,W0.signal,f,U,i2(l0().session),{listCheckpoints:S,execute:E},{list:n,resume:r},{getCatalog:o,refresh:l,getPrompt:p,complete:d,listTasks:F,getTask:R,cancelTask:V,getLogs:I,setLoggingLevel:v,getInstructions:h},{get:Q0,set:e},{get:X0,set:A0},{get:D0,set:j0},{get:W$,set:X2},G,{run:K2});if(E0.type==="handled")return E0.commandResult;if(E0.type==="continue_as_agent")N0=E0.result.userMessageAlreadyAdded,F0=E0.result.onceModelId,D=E0.result.goalContinuationOnly===!0,m=E0.result.agentInput;let h1=q1.getInstance(),U2;if(!D){let u0=await h1.executeUserPromptSubmitHooks(m.text,{projectDir:G,sessionId:U,permissionMode:L,hasImages:m.images.length>0,imageCount:m.images.length});if(!u0.proceed){if(u0.warning)_.addAssistantMessage(`${u0.warning}`);return{success:!1,error:"blocked by hook"}}if(u0.updatedPrompt)m={...m,text:u0.updatedPrompt,displayText:u0.updatedPrompt,parts:[{type:"text",text:u0.updatedPrompt},...m.parts.filter((v2)=>v2.type==="image")]};if(u0.contextInjection)U2=u0.contextInjection}if(!N0)_.addUserMessage(m.displayText);let D$=e8(m),uY=await y(F0?{modelId:F0}:void 0);if(W0.signal.aborted)return N2.info("[handleCommandSubmit] Agent 创建期间已被中止"),{success:!1,error:"aborted"};if(U2)x0.push({role:"system",content:`<user-prompt-submit-hook>
33
+ ${U2}
34
+ </user-prompt-submit-hook>`});let B4={messages:x0,userId:"cli-user",sessionId:U,workspaceRoot:G,signal:W0.signal,confirmationHandler:Y,permissionMode:L,onPermissionModeChange:async(u0)=>{await m0().setPermissionMode(u0)}},{loopResult:C1,stats:w4}=await S2(uY.chatStream(D$,B4,{stream:!0,goalContinuationOnly:D,onTurnLimitReached:Y?async(u0)=>{let v2=await Y.requestConfirmation({type:"maxTurnsExceeded",message:`已进行 ${u0.turnsCount} 轮对话。是否继续?`,risks:["继续执行可能导致更长的等待时间","可能产生更多的 API 费用"]});return{continue:v2.approved,reason:v2.reason}}:void 0}),W0);if(w4.compactionCount>0)_.setCompactedContext(B4.messages);if(C1.success&&C1.metadata?.outputTruncated)_.addAssistantMessage("输出因达到 token 上限被截断,部分内容可能不完整。");let q2=C1.finalMessage||"";if(N2.debug("[handleCommandSubmit] final reply",{success:C1.success,outputLength:q2.length,turnsCount:C1.metadata?.turnsCount,toolCallsCount:C1.metadata?.toolCallsCount}),!C1.success&&!w6(C1)){let u0=C1.error?.message||"任务执行失败";return _.addAssistantMessage(u0),{success:!1,error:u0}}if(!q2||q2.trim()===""){let u0=C1.metadata?.abortReason;if(!w.current&&w4.contentDeltaCount===0&&u0!=="interrupt")return _.addAssistantMessage("已取消"),{success:!0,output:"已取消"};return{success:!0,output:q2??""}}return{success:!0,output:q2}}catch(W0){if(w.current)return{success:!1,error:"aborted"};let x0=d2(W0);return _.addAssistantMessage(`${x0.displayMessage}`),{success:!1,error:x0.displayMessage}}}),T1=e1(async()=>{if(l0().command.isProcessing){C.current=!0;return}let J0=await B1.hasPendingInbox(G,U),N0=!J0&&await B1.hasActiveGoal(G,U),F0=!J0&&!N0&&await B1.hasRecoverableTurn(G,U);if(!J0&&!N0&&!F0){C.current=!1;return}if(l0().command.isProcessing){C.current=!0;return}C.current=!1,await F2();let D=P.createAbortController();c0.resetStreamingBuffers(),_.clearFinalizingStreamingMessageId(),P.setProcessing(!0);try{let m=await y();if(D.signal.aborted)return;let W0=await B1.hasPendingInbox(G,U),x0=!W0&&await B1.hasActiveGoal(G,U);if(!W0&&!x0){let D$=v$();if(D$.state!=="none")s8(_,D$);return}let E0={messages:i2(l0().session),userId:"cli-user",sessionId:U,workspaceRoot:G,signal:D.signal,confirmationHandler:Y,permissionMode:L,onPermissionModeChange:async(D$)=>{await m0().setPermissionMode(D$)}},{loopResult:h1,stats:U2}=await S2(m.chatStream("",E0,{stream:!0,pendingInputOnly:W0,goalContinuationOnly:x0}),D);if(U2.compactionCount>0)_.setCompactedContext(E0.messages);if(h1.success&&h1.metadata?.outputTruncated)_.addAssistantMessage("输出因达到 token 上限被截断,部分内容可能不完整。");if(!h1.success&&!w6(h1))_.addAssistantMessage(h1.error?.message||"恢复排队指令失败")}catch(m){let W0=d2(m);if(!W0.isAbort)_.setError(`恢复排队指令失败: ${W0.displayMessage}`)}finally{if(P.getAbortController()===D)P.setProcessing(!1),P.clearAbortController(D),_.setCurrentThinkingContent(null);if(C.current)queueMicrotask(()=>{T1()})}}),o8=e1(async(J0)=>{if(!J0.text.trim()&&J0.images.length===0)return;let N0=y6(J0.text);if(N0){await r8(J0,N0.question);return}if(B.current?.abort("main-conversation-submitted"),B.current=null,k.dismissSideConversation(),J0.text.trimStart().startsWith("!")&&K){let D=P.getAbortController();if(!D){_.addAssistantMessage("当前任务没有可用的取消边界,无法执行用户 Shell 命令。");return}let m=await M1(J0,D.signal);if(!m.success&&m.error&&m.error!=="aborted")_.setError(m.error);return}if(K){if(J0.text.trimStart().startsWith("/")){if(/^\/goal(?:\s|$)/i.test(J0.text.trim())){await F2();let E0=P.getAbortController()??P.createAbortController();await $Q(J0,k,_,E0.signal,f,U,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,G);return}_.addAssistantMessage("活动回合中不能执行 slash command;请先停止任务或等待完成。");return}await F2();let D=await q1.getInstance().executeUserPromptSubmitHooks(J0.text,{projectDir:G,sessionId:U,permissionMode:L,hasImages:J0.images.length>0,imageCount:J0.images.length});if(!D.proceed){if(D.warning)_.addAssistantMessage(D.warning);return}let m=J0;if(D.updatedPrompt)m={...J0,text:D.updatedPrompt,parts:[{type:"text",text:D.updatedPrompt},...J0.parts.filter((E0)=>E0.type==="image")]};if(D.contextInjection){let E0=`<user-prompt-submit-hook>
35
+ ${D.contextInjection}
36
+ </user-prompt-submit-hook>`;m={...m,text:`${m.text}
37
+
38
+ ${E0}`,parts:[...m.parts,{type:"text",text:`
39
+
40
+ ${E0}`}]}}let W0=e8(m),x0=await M(W0);if(!x0.accepted){let E0=x0.reason==="queue_full"?"补充指令队列已满,请等待当前任务处理后重试。":"当前任务正在结束,补充指令未入队,请稍后重试。";_.addAssistantMessage(E0);return}if(P.enqueueCommand(J0),_.addUserMessage(J0.displayText),x0.delivery==="next_turn"){if(C.current=!0,!l0().command.isProcessing)queueMicrotask(()=>{T1()})}return}k.setTasks([]),P.setRecoveredSteeringCount(0),w.current=!1;let F0=P.createAbortController();c0.resetStreamingBuffers(),_.clearFinalizingStreamingMessageId(),P.setProcessing(!0);try{let D=await a8(J0);if(!D.success&&D.error&&D.error!=="aborted")_.setError(D.error)}catch(D){let m=d2(D);if(m.isAbort);else _.setError(`执行失败: ${m.displayMessage}`)}finally{if(P.getAbortController()===F0){if(P.setProcessing(!1),P.clearAbortController(F0),_.setCurrentThinkingContent(null),C.current)queueMicrotask(()=>{T1()})}}});return c$(()=>{let J0=A6.subscribe((N0)=>{if(!b6(N0,{sessionId:U,projectPath:G}))return;if(N0.type.startsWith("team.")){let{teamName:F0,messageId:D,content:m}=N0.properties,W0=N0.properties.metadata;if(N0.type==="team.message.received"&&typeof F0==="string"&&typeof D==="string"&&typeof m==="string"&&M6(W0,{messageId:D,teamName:F0}))(async()=>{let x0=await H(m,{messageId:D,origin:"team_message",metadata:W0});if(!x0.accepted)return;if(await new R6(F0,JQ()).markDelivered([D]),x0.delivery==="next_turn"){if(C.current=!0,!l0().command.isProcessing)await T1()}})().catch((x0)=>{N2.warn("[useCommandHandler] Failed to deliver teammate message",x0)});queueMicrotask(()=>{H$()});return}if(N0.type!=="subagent.completion.queued")return;C.current=!0,queueMicrotask(()=>{T1()})});return()=>{J0()}},[H,H$,T1,U,G]),c$(()=>{let J0=!1;return(async()=>{if(Y)await ZQ.resolvePendingWithHandler(G,U,Y);else await ZQ.cancelPendingNonInteractive(G,U);if(J0)return;let[N0,F0]=await Promise.all([B1.hasPendingInbox(G,U),B1.hasActiveGoal(G,U)]),D=!N0&&!F0&&await B1.hasRecoverableTurn(G,U);if(N0||F0||D)await T1()})().catch((N0)=>{if(!J0)N2.warn("[useCommandHandler] Failed to recover pending interaction or inbox",N0)}),()=>{J0=!0}},[Y,T1,U,G]),{executeCommand:o8,handleAbort:L$,isProcessing:K||A?.status==="loading",cleanupAgent:f}};import{useMemoizedFn as Y8}from"ahooks";import{useState as I6}from"react";var f6=()=>{let[$,Q]=I6([]),[Y,J]=I6(-1),Z=Y8((G,q)=>{let L={display:G,pasteMappings:q?new Map(q):new Map};Q((O)=>[...O,L]),J(-1)}),X=Y8(()=>{if($.length===0)return null;let G=Y===-1?$.length-1:Math.max(0,Y-1);return J(G),$[G]||null}),K=Y8(()=>{if(Y===-1)return null;let G=Y+1;if(G>=$.length)return J(-1),null;else return J(G),$[G]||null}),U=Y8(()=>{J(-1)});return{commandHistory:$,historyIndex:Y,addToHistory:Z,getPreviousCommand:X,getNextCommand:K,resetHistoryIndex:U}};import{useMemoizedFn as W2}from"ahooks";import{useMemo as F3,useRef as k6,useState as W3}from"react";var S6=()=>{let[$,Q]=W3({isVisible:!1,details:null,resolver:null}),Y=k6(null),J=k6([]),Z=W2((L)=>{Y.current=L,Q({isVisible:Boolean(L),details:L?.details??null,resolver:L?.resolve??null})}),X=W2((L,O)=>{if(L.settled)return;if(L.settled=!0,L.signal&&L.abortListener)L.signal.removeEventListener("abort",L.abortListener);L.resolve(O)}),K=W2((L,O)=>{return new Promise((W)=>{let z={details:L,resolve:W,signal:O,settled:!1},b=()=>{if(Y.current===z){X(z,{approved:!1,reason:H2}),Z(J.current.shift()??null);return}let N=J.current.indexOf(z);if(N>=0)J.current.splice(N,1);X(z,{approved:!1,reason:H2})};if(z.abortListener=b,O?.aborted){b();return}if(O?.addEventListener("abort",b,{once:!0}),!Y.current){Z(z);return}J.current.push(z)})}),U=W2((L)=>{let O=Y.current;if(O)X(O,L);let W=J.current.shift()??null;Z(W)}),G=W2(()=>{if(Y.current)X(Y.current,{approved:!1,reason:H2});for(let L of J.current)X(L,{approved:!1,reason:H2});J.current=[],Z(null)}),q=F3(()=>({requestConfirmation:K}),[K]);return{confirmationState:$,confirmationHandler:q,handleResponse:U,dismissAll:G}};import{useMemoizedFn as B$}from"ahooks";import{useRef as v6,useState as H3}from"react";var Z8="␞",X8="␟";function K8($){return`${Z8}PASTE:${$}:`}function XQ(){return X8}var WG=new RegExp(`${Z8}PASTE:(\\d+):[\\s\\S]*?${X8}`,"g");function L3($){return $.includes(Z8)&&$.includes(X8)}function D6($="",Q=0){let[Y,J]=H3({value:$,cursorPosition:Q}),Z=v6(0),X=v6(new Map),K=B$((z)=>{J((b)=>({value:z,cursorPosition:b.cursorPosition}));for(let b of X.current.keys()){let N=K8(b);if(!z.includes(N))X.current.delete(b)}}),U=B$((z)=>{J((b)=>({...b,cursorPosition:Math.max(0,Math.min(z,b.value.length))}))}),G=B$(()=>{J({value:"",cursorPosition:0}),X.current.clear()}),q=B$((z)=>{Z.current+=1;let b=Z.current;return X.current.set(b,{type:"text",data:z}),b}),L=B$((z,b)=>{let N=[...X.current.values()].filter((k)=>k.type==="image");if(N.length>=m$)throw Error(`最多只能粘贴 ${m$} 张图片`);let A=N.reduce((k,P)=>k+`data:${P.mimeType};base64,`.length+P.data.length,0),T=`data:${b};base64,`.length+z.length;if(A+T>o2)throw Error("图片编码后总大小不能超过 5 MiB");Z.current+=1;let _=Z.current;return X.current.set(_,{type:"image",data:z,mimeType:b}),_}),O=B$((z)=>{for(let[b,N]of z)if(X.current.set(b,N),b>=Z.current)Z.current=b}),W=B$((z)=>{let b=[],N=[];if(!L3(z)){let f=z.trim();if(f)N.push({type:"text",text:f});return{displayText:z,text:z,images:b,parts:N}}let A=new RegExp(`${Z8}PASTE:(\\d+):[\\s\\S]*?${X8}`,"g"),T=Array.from(z.matchAll(A)),_=0,k="",P="";for(let f of T){let M=f.index,H=M+f[0].length,S=parseInt(f[1],10),E=X.current.get(S);if(M>_){let n=z.slice(_,M);N.push({type:"text",text:n}),k+=n,P+=n}if(!E)k+=f[0],P+=f[0],N.push({type:"text",text:f[0]});else if(E.type==="text")k+=E.data,P+=E.data,N.push({type:"text",text:E.data});else{let n={id:S,base64:E.data,mimeType:E.mimeType};b.push(n),N.push({type:"image",...n}),P+=`[Image #${S}]`}_=H}if(_<z.length){let f=z.slice(_);N.push({type:"text",text:f}),k+=f,P+=f}let w=[];for(let f of N)if(f.type==="text"&&w.length>0&&w[w.length-1].type==="text")w[w.length-1].text+=f.text;else w.push(f);let C=0,B=w.length;while(C<w.length&&w[C].type==="text"&&w[C].text.trim()==="")C++;while(B>C&&w[B-1].type==="text"&&w[B-1].text.trim()==="")B--;let y=w.slice(C,B);return{displayText:P.trim(),text:k.trim(),images:b,parts:y}});return{value:Y.value,cursorPosition:Y.cursorPosition,setValue:K,setCursorPosition:U,clear:G,pasteMap:X.current,addPasteMapping:q,addImagePasteMapping:L,restorePasteMappings:O,resolveInput:W}}import{useMemoizedFn as c6}from"ahooks";import{useInput as M3}from"ink";import{useEffect as x6,useRef as u6,useState as qQ}from"react";function B3($){return{supportsThinking:E1().resolveConfig($).reasoning}}function G8($){return B3($).supportsThinking}import w3 from"fast-glob";import b3 from"fuse.js";import{useEffect as V6,useMemo as KQ,useState as GQ}from"react";var x$=null,A3=5000;function P3($,Q){let Y=[...$.matchAll(/(?:^|\s)(@(?:"[^"]*"|(?:[^\\ ]|\\ )*))/g)];for(let J of Y){let Z=J[1],X=J.index+(J[0].length-Z.length),K=X+Z.length;if(Q>=X&&Q<=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:X,endIndex:K,quoted:G}}}return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1}}var y3=[...UQ.map(($)=>`${$}/**`),...UQ,...j6.map(($)=>`**/${$}`)];function h6($,Q,Y={}){let{cwd:J=d0(),maxSuggestions:Z=15,ignorePatterns:X=y3,debounceDelay:K=300,fuzzyMatch:U=!0}=Y,[G,q]=GQ([]),[L,O]=GQ(!1),[W,z]=GQ(0),b=KQ(()=>JSON.stringify(X),[X]),N=KQ(()=>{if(Q===void 0)return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1};return P3($,Q)},[$,Q]);V6(()=>{if(!$.includes("@")){q([]),O(!1);return}let T=Date.now();if(x$&&x$.cwd===J&&x$.ignoreKey===b&&T-x$.timestamp<A3){q(x$.files),O(!1);return}let _=!1,P=setTimeout(async()=>{O(!0);try{let C=(await w3("**/*",{cwd:J,dot:!1,followSymbolicLinks:!1,onlyFiles:!1,markDirectories:!0,unique:!0,ignore:X})).map((B)=>B.replace(/\\/g,"/"));if(!_)q(C),x$={cwd:J,ignoreKey:b,files:C,timestamp:T}}catch(w){if(console.error("Failed to load files for @ completion:",w),!_)q([])}finally{if(!_)O(!1)}},K);return()=>{_=!0,clearTimeout(P)}},[$,J,K,b]);let A=KQ(()=>{if(!N.hasQuery||G.length===0)return[];let T=N.query.toLowerCase();if(T==="")return G.slice(0,Z);if(U)return new b3(G,{threshold:0.4,ignoreLocation:!0,minMatchCharLength:1}).search(T).slice(0,Z).map((P)=>P.item);return G.filter((_)=>_.toLowerCase().includes(T)).slice(0,Z)},[N,G,Z,U]);return V6(()=>{z(0)},[A]),{...N,suggestions:A,selectedIndex:W,loading:L}}function R3($,Q=!1){if($.includes(" ")||Q)return`@"${$}"`;return`@${$}`}function E6($,Q,Y){if(!Q.hasQuery)return{newInput:$,newCursorPos:$.length};let J=R3(Y,Q.quoted),Z=$.slice(0,Q.startIndex),X=$.slice(Q.endIndex),K=Z+J+" "+X,U=Q.startIndex+J.length+1;return{newInput:K,newCursorPos:U}}import{useMemoizedFn as g6}from"ahooks";import{useEffect as m6,useRef as p6}from"react";var k0=($,Q)=>{let Y=p6(!1),J=p6(null),Z=g6(()=>{if(J.current)clearTimeout(J.current);J.current=setTimeout(()=>{o0().setAwaitingSecondCtrlC(!1),Y.current=!1,J.current=null},3000)}),X=()=>{L2().shutdown("SIGINT",0)},K=g6(()=>{if(!Y.current){if(Y.current=!0,$&&Q)Q();o0().setAwaitingSecondCtrlC(!0),Z()}else{if(J.current)clearTimeout(J.current),J.current=null;o0().setAwaitingSecondCtrlC(!1),X()}});return m6(()=>{if($){if(o0().setAwaitingSecondCtrlC(!1),Y.current=!1,J.current)clearTimeout(J.current),J.current=null}},[$]),m6(()=>{return()=>{if(J.current)clearTimeout(J.current)}},[]),K};var U8=s1("UI"),r6=($,Q,Y,J,Z,X,K,U,G,q)=>{let O=e0()==="main-input",W=$.value,z=$.setValue,b=$.cursorPosition,N=n1(),A=I1(),T=t1(),_=E2(),k=_?G8(_):!1,[P,w]=qQ(!1),[C,B]=qQ([]),[y,f]=qQ(0),M=h6(W,b,{cwd:A,maxSuggestions:10}),H=k0(K||!1,X),S=u6(0),E=500,n=u6(!1);x6(()=>{if(K)n.current=!1},[K]),x6(()=>{if(M.hasQuery&&M.suggestions.length>0){let l=M.suggestions.map((p)=>({command:p,description:l6(p)?`Directory: ${p}`:`File: ${p}`,matchScore:1}));B(l),w(!0),f(0)}else if(W.startsWith("/"))if(W.includes(" "))w(!1),B([]);else{let p=d6(W,A);B(p),w(p.length>0),f(0)}else w(!1),B([])},[W,M.hasQuery,M.suggestions,A]);let r=c6(()=>{N.clearMessages(),N.setError(null)}),o=c6(()=>{U8.debug("[DIAG] handleSubmit called:",{input:W,showSuggestions:P});let l=W.trim();if(l){let p=$.resolveInput(l);U8.debug("[DIAG] Submitting command:",{displayText:l,textLength:p.text.length,imageCount:p.images.length}),w(!1),B([]);let d=$.pasteMap.size>0?new Map($.pasteMap):new Map;Z(l,d),$.clear(),Q(p),U8.debug("[DIAG] Command submitted to onSubmit callback")}else U8.debug("[DIAG] Empty command, not submitting")});return M3((l,p)=>{if(l==="?"&&!W){G?.(),setTimeout(()=>$.clear(),0);return}if(p.backspace||p.delete||p.leftArrow||p.rightArrow||p.pageUp||p.pageDown||!p.ctrl&&!p.meta&&!p.escape&&!p.tab&&!p.upArrow&&!p.downArrow&&!p.return&&!(l==="?"&&!W))return;if(p.ctrl&&l==="c"||p.meta&&l==="c"||p.ctrl&&l==="d"||p.meta&&l==="d"){H();return}if(p.ctrl&&l==="l"||p.meta&&l==="l"){r();return}if(p.ctrl&&l==="t"||p.meta&&l==="t"){N.toggleThinkingExpanded();return}if(p.ctrl&&l==="o"||p.meta&&l==="o"){N.toggleHistoryExpanded();return}if(p.escape){if(q)G?.();else if(K&&X){if(n.current)return;n.current=!0,X()}else if(P)w(!1),B([]);else if(W){let F=Date.now();if(F-S.current<500)$.clear(),S.current=0;else S.current=F}return}if(p.tab&&p.shift){U?.();return}if(p.tab){if(P&&C.length>0){let F=C[y].command;if(M.hasQuery&&M.suggestions.includes(F)){let{newInput:R,newCursorPos:V}=E6(W,M,F);z(R),$.setCursorPosition(V)}else{let R=F+" ";z(R),$.setCursorPosition(R.length)}w(!1),B([])}else if(k)T.toggleThinkingMode();return}if(p.return){o();return}if(p.upArrow){if(P&&C.length>0){let F=C.length-1;f((R)=>R>0?R-1:F)}else{let F=Y();if(F){if(F.pasteMappings.size>0)$.restorePasteMappings(F.pasteMappings);z(F.display),$.setCursorPosition(F.display.length)}}return}if(p.downArrow){if(P&&C.length>0){let F=C.length-1;f((R)=>R<F?R+1:0)}else{let F=J();if(F){if(F.pasteMappings.size>0)$.restorePasteMappings(F.pasteMappings);z(F.display),$.setCursorPosition(F.display.length)}}return}},{isActive:O}),{handleSubmit:o,showSuggestions:P,suggestions:C,selectedSuggestionIndex:y}};import k3 from"ansi-escapes";import{useStdout as S3}from"ink";import{useCallback as v3,useEffect as D3,useRef as V3}from"react";import{useStdout as T3}from"ink";import{debounce as C3}from"lodash-es";import{useEffect as I3,useState as f3}from"react";function Q$($=200){let{stdout:Q}=T3(),[Y,J]=f3(Q.columns||80);return I3(()=>{let Z=C3(()=>{J(Q.columns||80)},$);return Z(),Q.on("resize",Z),()=>{Q.off("resize",Z),Z.cancel()}},[Q,$]),Y}function a6(){let{stdout:$}=S3(),Q=Q$(),Y=V3(!0),J=t((X)=>X.session.actions.incrementClearCount),Z=v3(()=>{if($)$.write(k3.clearTerminal);J()},[$,J]);return D3(()=>{if(Y.current){Y.current=!1;return}let X=setTimeout(()=>{Z()},300);return()=>{clearTimeout(X)}},[Q,Z]),{refreshStatic:Z}}import o6 from"node:fs";import j3 from"node:os";import OQ from"node:path";import{MultiSelect as h3}from"@inkjs/ui";import{useMemoizedFn as q8}from"ahooks";import{Box as G0,Text as $0,useFocus as E3,useFocusManager as g3,useInput as n6}from"ink";import O8 from"ink-select-input";import m3 from"ink-spinner";import B2 from"ink-text-input";import{useEffect as i6,useState as u$}from"react";import{jsxDEV as j}from"react/jsx-dev-runtime";var p3=[{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"}],c3=[{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 x3($){if(!$||$.trim()==="")return"名称不能为空";if(!/^[a-z0-9-]+$/.test($))return"名称只能包含小写字母、数字和连字符";if($.startsWith("-")||$.endsWith("-"))return"名称不能以连字符开头或结尾";return null}function w2({onComplete:$,onCancel:Q,initialConfig:Y}){let[J,Z]=u$(Y?"name":"mode"),[X,K]=u$({name:Y?.name||"",description:Y?.description||"",tools:Y?.tools||[],color:Y?.color,location:Y?.location||"project",systemPrompt:Y?.systemPrompt||""}),[U,G]=u$(""),[q,L]=u$(!1),[O,W]=u$(""),[z,b]=u$(Y?"edit":"manual"),{focus:N}=g3(),T={manual:["mode","name","description","tools","color","location","systemPrompt","confirm"],ai:["mode","aiPrompt","aiGenerating","confirm"],edit:["name","description","tools","color","location","systemPrompt","confirm"]}[z];i6(()=>{if(J==="name"||J==="description"||J==="systemPrompt"||J==="aiPrompt")return;N(`step-${J}`)},[J,N]);let _=q8(()=>{let B=T.indexOf(J);if(B<T.length-1)Z(T[B+1])}),k=q8(()=>{if(O)W("");if(J==="confirm"&&z==="ai"){Z("aiPrompt");return}let B=T.indexOf(J);if(B>0)Z(T[B-1]);else Q()}),P=q8(async()=>{L(!0),W("");try{let B=await _2.create(),y=`你是一个 Subagent 配置生成专家。用户会描述他们想要创建的 agent,你需要根据描述生成一个完整的 agent 配置。
41
+
42
+ ## 可用工具列表
43
+
44
+ - **Glob**: 文件模式匹配(例如:查找所有 .ts 文件)
45
+ - **Grep**: 代码内容搜索(例如:搜索特定函数调用)
46
+ - **Read**: 读取文件内容
47
+ - **Write**: 写入/创建文件
48
+ - **Edit**: 编辑文件(字符串替换)
49
+ - **ApplyPatch**: 原子应用多文件文本补丁
50
+ - **Bash**: 执行命令行命令
51
+
52
+ ## 可用颜色
53
+
54
+ - red, blue, green, yellow, purple, orange, pink, cyan
55
+
56
+ ## 输出格式
57
+
58
+ 你必须以 JSON 格式返回配置,格式如下:
59
+
60
+ \`\`\`json
61
+ {
62
+ "name": "agent-name",
63
+ "description": "简洁的一句话描述(英文)",
64
+ "tools": ["Glob", "Grep", "Read"],
65
+ "color": "blue",
66
+ "systemPrompt": "详细的系统提示词,说明这个 agent 的职责、工作方式、输出格式等"
67
+ }
68
+ \`\`\`
69
+
70
+ ## 注意事项
71
+
72
+ 1. **name**: 只能包含小写字母、数字和连字符(kebab-case),例如:code-reviewer
73
+ 2. **description**: 一句话说明用途,建议以 "Fast agent specialized for..." 开头
74
+ 3. **tools**: 根据任务选择必要的工具,不要选择太多
75
+ 4. **color**: 选择一个合适的颜色用于 UI 区分
76
+ 5. **systemPrompt**: 详细说明 agent 的职责、使用的工具、输出格式等,使用 Markdown 格式
77
+
78
+ **重要**:请直接返回 JSON,不要添加任何额外的解释或文字。`,M=(await B.chatWithSystem(`你是一个 Subagent 配置生成专家。用户会描述他们想要创建的 agent,你需要根据描述生成一个完整的 agent 配置。
79
+
80
+ ## 可用工具列表
81
+
82
+ - **Glob**: 文件模式匹配(例如:查找所有 .ts 文件)
83
+ - **Grep**: 代码内容搜索(例如:搜索特定函数调用)
84
+ - **Read**: 读取文件内容
85
+ - **Write**: 写入/创建文件
86
+ - **Edit**: 编辑文件(字符串替换)
87
+ - **ApplyPatch**: 原子应用多文件文本补丁
88
+ - **Bash**: 执行命令行命令
89
+
90
+ ## 可用颜色
91
+
92
+ - red, blue, green, yellow, purple, orange, pink, cyan
93
+
94
+ ## 输出格式
95
+
96
+ 你必须以 JSON 格式返回配置,格式如下:
97
+
98
+ \`\`\`json
99
+ {
100
+ "name": "agent-name",
101
+ "description": "简洁的一句话描述(英文)",
102
+ "tools": ["Glob", "Grep", "Read"],
103
+ "color": "blue",
104
+ "systemPrompt": "详细的系统提示词,说明这个 agent 的职责、工作方式、输出格式等"
105
+ }
106
+ \`\`\`
107
+
108
+ ## 注意事项
109
+
110
+ 1. **name**: 只能包含小写字母、数字和连字符(kebab-case),例如:code-reviewer
111
+ 2. **description**: 一句话说明用途,建议以 "Fast agent specialized for..." 开头
112
+ 3. **tools**: 根据任务选择必要的工具,不要选择太多
113
+ 4. **color**: 选择一个合适的颜色用于 UI 区分
114
+ 5. **systemPrompt**: 详细说明 agent 的职责、使用的工具、输出格式等,使用 Markdown 格式
115
+
116
+ **重要**:请直接返回 JSON,不要添加任何额外的解释或文字。`,U)).trim(),H=M.match(/```(?:json)?\s*\n([\s\S]*?)\n```/);if(H)M=H[1];let S=JSON.parse(M);if(!S.name||!S.description||!S.systemPrompt)throw Error("Missing required fields: name, description, or systemPrompt");if(!/^[a-z0-9]+(-[a-z0-9]+)*$/.test(S.name))throw Error("Invalid name format. Must be kebab-case (lowercase, numbers, hyphens only)");K({name:S.name,description:S.description,tools:Array.isArray(S.tools)?S.tools:[],color:S.color||"blue",location:"project",systemPrompt:S.systemPrompt}),Z("confirm")}catch(B){W(B instanceof Error?B.message:String(B))}finally{L(!1)}});i6(()=>{if(J==="aiGenerating"&&!q&&!O)P()},[J,q,O,P]);let w=q8(async()=>{try{let B=X.location==="project"?OQ.join(d0(),".blade","agents"):OQ.join(j3.homedir(),".blade","agents");await o6.promises.mkdir(B,{recursive:!0});let y=["---",`name: ${X.name}`,`description: ${X.description}`];if(X.tools.length>0&&!X.tools.includes("all")){y.push("tools:");for(let H of X.tools)y.push(` - ${H}`)}if(X.color)y.push(`color: ${X.color}`);y.push("---");let f=[y.join(`
117
+ `),"",`# ${X.name} Subagent`,"",X.systemPrompt||"你是一个专门的代理,负责执行特定任务。",""].join(`
118
+ `),M=OQ.join(B,`${X.name}.md`);await o6.promises.writeFile(M,f,"utf-8"),$()}catch(B){console.error("保存配置失败:",B)}}),C=k0(!1,Q);if(n6((B,y)=>{if(y.escape)k();else if(y.ctrl&&B==="c"||y.meta&&B==="c")C()},{isActive:J!=="tools"}),J==="mode")return j(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j($0,{bold:!0,color:"cyan",children:"选择创建方式"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j($0,{dimColor:!0,children:"你可以手动配置每个细节,或让 AI 根据你的描述自动生成配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(O8,{items:[{label:"AI 智能生成 - 根据描述自动生成完整配置",value:"ai"},{label:"手动配置 - 逐步配置每个选项",value:"manual"}],onSelect:(B)=>{if(B.value==="ai")b("ai"),Z("aiPrompt");else b("manual"),Z("name")}},void 0,!1,void 0,this),j(G0,{marginTop:1,children:j($0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 取消"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="aiPrompt")return j(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j($0,{bold:!0,color:"cyan",children:"AI 智能生成"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j($0,{dimColor:!0,children:'描述你想要创建的 Agent(例如:"一个专门用于代码审查的 agent,能够分析代码质量和潜在bug")'},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:[j($0,{color:"green",children:"描述: "},void 0,!1,void 0,this),j(B2,{value:U,onChange:G,onSubmit:(B)=>{if(!B.trim())return;Z("aiGenerating")}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(G0,{children:j($0,{dimColor:!0,children:"按 Enter 开始生成 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="aiGenerating"){if(O)return j(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j($0,{bold:!0,color:"red",children:"AI 生成失败"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j($0,{color:"red",children:O},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j($0,{dimColor:!0,children:"按 ESC 返回修改描述"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return j(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j($0,{bold:!0,color:"yellow",children:[j(m3,{type:"dots"},void 0,!1,void 0,this)," AI 正在生成配置..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j($0,{dimColor:!0,children:['根据你的描述:"',U,'"']},void 0,!0,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j($0,{color:"gray",children:"正在调用 LLM 生成 agent 配置,请稍候..."},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}if(J==="name"){let B=z==="edit";return j(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j($0,{bold:!0,color:"cyan",children:["Step 1/7: ",B?"Agent 名称(不可修改)":"输入 Agent 名称"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j($0,{dimColor:!0,children:B?"编辑模式下名称不可修改(修改名称相当于创建新 Agent)":"名称只能包含小写字母、数字和连字符(例如:code-reviewer)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:[j($0,{color:"green",children:"名称: "},void 0,!1,void 0,this),B?j($0,{children:X.name},void 0,!1,void 0,this):j(B2,{value:X.name,onChange:(y)=>K({...X,name:y}),onSubmit:(y)=>{if(x3(y))return;_()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(G0,{children:j($0,{dimColor:!0,children:B?"按 Enter 继续 | ESC 返回":"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),B&&j(B2,{value:"",onChange:()=>{},onSubmit:_,showCursor:!1},"edit-mode-dummy-input",!1,void 0,this)]},void 0,!0,void 0,this)}if(J==="description")return j(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j($0,{bold:!0,color:"cyan",children:"Step 2/7: 输入描述信息"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j($0,{dimColor:!0,children:"简短描述这个 Agent 的用途和使用场景(这将帮助主 Agent 决定何时使用它)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:[j($0,{color:"green",children:"描述: "},void 0,!1,void 0,this),j(B2,{value:X.description,onChange:(B)=>K({...X,description:B}),onSubmit:(B)=>{if(!B.trim())return;_()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(G0,{children:j($0,{dimColor:!0,children:"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="tools")return j(u3,{config:X,setConfig:K,onNext:_,onPrev:k},void 0,!1,void 0,this);if(J==="color")return j(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j($0,{bold:!0,color:"cyan",children:"Step 4/7: 选择背景颜色"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j($0,{dimColor:!0,children:"为 Agent 选择一个颜色标识(用于在 UI 中区分不同的 Agents)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(O8,{items:c3,onSelect:(B)=>{let y=B.value==="none"?void 0:B.value;K({...X,color:y}),_()}},void 0,!1,void 0,this),j(G0,{marginTop:1,children:j($0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="location")return j(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j($0,{bold:!0,color:"cyan",children:"Step 5/7: 选择保存位置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j($0,{dimColor:!0,children:"项目级配置仅在当前项目生效,用户级配置全局可用"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(O8,{items:[{label:"项目级 (.blade/agents/) - 仅当前项目",value:"project"},{label:"用户级 (~/.blade/agents/) - 全局可用",value:"user"}],onSelect:(B)=>{K({...X,location:B.value}),_()}},void 0,!1,void 0,this),j(G0,{marginTop:1,children:j($0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="systemPrompt")return j(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j($0,{bold:!0,color:"cyan",children:"Step 6/7: 输入系统提示词"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j($0,{dimColor:!0,children:"定义 Agent 的行为和职责(可选,留空将使用默认提示)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:[j($0,{color:"green",children:"提示词: "},void 0,!1,void 0,this),j(B2,{value:X.systemPrompt,onChange:(B)=>K({...X,systemPrompt:B}),onSubmit:()=>_()},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(G0,{children:j($0,{dimColor:!0,children:"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="confirm")return j(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j($0,{bold:!0,color:"cyan",children:"Step 7/7: 确认配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{flexDirection:"column",paddingLeft:2,marginBottom:1,children:[j($0,{children:[j($0,{bold:!0,color:"green",children:["名称:"," "]},void 0,!0,void 0,this),j($0,{children:X.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j($0,{children:[j($0,{bold:!0,color:"green",children:["描述:"," "]},void 0,!0,void 0,this),j($0,{children:X.description},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j($0,{children:[j($0,{bold:!0,color:"green",children:["工具:"," "]},void 0,!0,void 0,this),j($0,{children:X.tools.includes("all")?"所有工具":X.tools.join(", ")||"所有工具"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j($0,{children:[j($0,{bold:!0,color:"green",children:["颜色:"," "]},void 0,!0,void 0,this),j($0,{children:X.color||"默认"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j($0,{children:[j($0,{bold:!0,color:"green",children:["位置:"," "]},void 0,!0,void 0,this),j($0,{children:X.location==="project"?"项目级":"用户级"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j($0,{children:[j($0,{bold:!0,color:"green",children:["提示词:"," "]},void 0,!0,void 0,this),j($0,{children:X.systemPrompt||"(使用默认)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),j(O8,{items:[{label:"确认并保存",value:"save"},{label:"返回上一步",value:"back"},{label:"取消",value:"cancel"}],onSelect:(B)=>{if(B.value==="save")w();else if(B.value==="back")k();else Q()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}function u3({config:$,setConfig:Q,onNext:Y,onPrev:J}){let{isFocused:Z}=E3({id:"step-tools"});n6((K,U)=>{if(U.escape)J()},{isActive:Z});let X=(K)=>{if(K.includes("all"))Q({...$,tools:["all"]});else Q({...$,tools:K});Y()};return j(G0,{flexDirection:"column",paddingY:1,children:[j(G0,{marginBottom:1,children:j($0,{bold:!0,color:"cyan",children:"Step 3/7: 选择可用工具"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(G0,{marginBottom:1,children:j($0,{dimColor:!0,children:"方向键导航,空格切换勾选,Enter 确认进入下一步 | ESC 返回上一步"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(h3,{options:p3,defaultValue:$.tools,onSubmit:X},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import l3 from"node:fs";import{useMemoizedFn as w$}from"ahooks";import{Box as C0,Text as S0,useInput as d3}from"ink";import zQ from"ink-select-input";import{useEffect as r3,useMemo as t6,useState as z8}from"react";import{jsxDEV as i}from"react/jsx-dev-runtime";var _Q=10;function s6({workspaceRoot:$,initialMode:Q="menu",onComplete:Y,onCancel:J}){let Z=J8($),[X,K]=z8(Q),[U,G]=z8(null),[q,L]=z8(0),[O,W]=z8(0),z=w$(()=>{Z.clear(),Z.loadFromStandardLocations(),L((M)=>M+1)}),b=t6(()=>{return Z.getAllSubagents()},[q]),N=Math.ceil(b.length/_Q)||1,A=t6(()=>{let M=O*_Q;return b.slice(M,M+_Q)},[b,O]);r3(()=>{let M=Math.max(0,N-1);if(O>M)W(M)},[N,O]);let T=w$(()=>{if(O<N-1)W((M)=>M+1)}),_=w$(()=>{if(O>0)W((M)=>M-1)}),k=[{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"}],P=w$((M)=>{if(M.value==="cancel"){J?.();return}K(M.value)}),w=w$((M)=>{if(G(M.value),X==="edit")K("editWizard");else if(X==="delete")K("deleteConfirm")}),C=w$(async()=>{if(!U?.configPath)return;try{await l3.promises.unlink(U.configPath),z(),B()}catch(M){console.error("删除失败:",M)}}),B=w$(()=>{K("menu"),G(null)}),y=k0(!1,J);if(d3((M,H)=>{if(H.escape){if(X==="menu")J?.();else if(X==="list"||X==="edit"||X==="delete")W(0),B();else if(X==="deleteConfirm")B()}else if(H.ctrl&&M==="c"||H.meta&&M==="c")y();else if(X==="list"){if(H.leftArrow||M==="h")_();else if(H.rightArrow||M==="l")T()}},{isActive:X!=="create"&&X!=="editWizard"}),X==="menu")return i(C0,{flexDirection:"column",paddingY:1,children:[i(C0,{marginBottom:1,children:i(S0,{bold:!0,color:"cyan",children:"Agents 管理"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(zQ,{items:k,onSelect:P},void 0,!1,void 0,this),i(C0,{marginTop:1,children:i(S0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 退出"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(X==="list"){if(b.length===0)return i(C0,{flexDirection:"column",paddingY:1,children:[i(C0,{marginBottom:1,children:i(S0,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(C0,{paddingLeft:2,children:i(S0,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(C0,{marginTop:1,paddingLeft:2,children:i(S0,{color:"gray",children:"配置文件位置: .blade/agents/ 或 ~/.blade/agents/"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(C0,{marginTop:1,paddingLeft:2,children:i(S0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return i(C0,{flexDirection:"column",paddingY:1,children:[i(C0,{marginBottom:1,children:[i(S0,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this),i(S0,{color:"gray",children:[" (共 ",b.length," 个)"]},void 0,!0,void 0,this),N>1&&i(S0,{color:"yellow",children:[" ","第 ",O+1,"/",N," 页"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),A.map((M)=>i(C0,{flexDirection:"column",paddingLeft:2,children:[i(C0,{children:i(S0,{children:[i(S0,{bold:!0,color:M.color||"white",children:["• ",M.name]},void 0,!0,void 0,this),i(S0,{color:"gray",children:[" - ",M.description]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),M.tools&&M.tools.length>0&&i(C0,{paddingLeft:2,children:i(S0,{color:"gray",children:["工具: ",M.tools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),M.configPath&&i(C0,{paddingLeft:2,children:i(S0,{color:"gray",dimColor:!0,children:M.configPath},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},M.name,!0,void 0,this)),i(C0,{marginTop:1,paddingLeft:2,children:N>1?i(S0,{dimColor:!0,children:"Left/Right to page | ESC 返回菜单"},void 0,!1,void 0,this):i(S0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}let f=(M)=>{if(b.length===0)return i(C0,{flexDirection:"column",paddingY:1,children:[i(C0,{marginBottom:1,children:i(S0,{bold:!0,color:"cyan",children:M},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(C0,{paddingLeft:2,children:i(S0,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(C0,{marginTop:1,paddingLeft:2,children:i(S0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);let H=b.map((S)=>({key:S.name,label:`${S.name} - ${S.description}`,value:S}));return i(C0,{flexDirection:"column",paddingY:1,children:[i(C0,{marginBottom:1,children:i(S0,{bold:!0,color:"cyan",children:M},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(zQ,{items:H,onSelect:w},void 0,!1,void 0,this),i(C0,{marginTop:1,children:i(S0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};if(X==="create")return i(w2,{onComplete:()=>{z(),B()},onCancel:B},void 0,!1,void 0,this);if(X==="edit")return f("编辑 Agent");if(X==="editWizard"&&U){let M={name:U.name,description:U.description,tools:U.tools||[],color:U.color,location:U.configPath?.includes(".blade/agents")?"project":"user",systemPrompt:U.systemPrompt||""};return i(w2,{initialConfig:M,onComplete:()=>{z(),B()},onCancel:B},void 0,!1,void 0,this)}if(X==="delete")return f("删除 Agent");if(X==="deleteConfirm"&&U)return i(C0,{flexDirection:"column",paddingY:1,children:[i(C0,{marginBottom:1,children:i(S0,{bold:!0,color:"red",children:"确认删除"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(C0,{marginBottom:1,paddingLeft:2,children:i(S0,{children:["你确定要删除 Agent"," ",i(S0,{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),i(C0,{marginBottom:1,paddingLeft:2,children:i(S0,{dimColor:!0,children:["文件路径: ",U.configPath]},void 0,!0,void 0,this)},void 0,!1,void 0,this),i(C0,{marginBottom:1,paddingLeft:2,children:i(S0,{color:"red",children:"此操作无法撤销!"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(zQ,{items:[{label:"确认删除",value:"confirm"},{label:"取消",value:"cancel"}],onSelect:(M)=>{if(M.value==="confirm")C();else B()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}import{Box as l$,Text as O0}from"ink";import o3,{useEffect as i3,useState as n3}from"react";import{useEffect as a3,useState as e6}from"react";function J9($=d0(),Q=5000){let[Y,J]=e6(null),[Z,X]=e6(!0);return a3(()=>{let K=!0,U=async()=>{try{let q=await $9($);if(!K)return;if(!q){J(null),X(!1);return}let L=await Q9($);if(!K)return;J(L)}catch{if(K)J(null)}finally{if(K)X(!1)}};U();let G=null;if(Q>0)G=setInterval(U,Q);return()=>{if(K=!1,G)clearInterval(G)}},[$,Q]),{branch:Y,loading:Z}}import{jsxDEV as s,Fragment as w1}from"react/jsx-dev-runtime";var Z9=o3.memo(()=>{let $=h2(),Q=h$(),J=V2()==="shortcuts",Z=E4(),X=I1(),{branch:K}=J9(X),U=E2(),G=S4(),q=y4(),L=p2(),O=c2(),W=x2(),z=u2(),b=l2(),N=R4(),A=M4(),T=m2(),_=d4(),k=j$(),[P,w]=n3(null);i3(()=>{let H=!1;new NQ(X,k).get().then((n)=>{if(!H)w(n)}).catch(()=>{if(!H)w(null)});let E=NQ.subscribe((n)=>{if(!H&&n.sessionId===k&&n.workspaceRoot===X)w(n.goal)});return()=>{H=!0,E()}},[k,X]);let C=U?G8(U):!1,y=(()=>{if(Q==="default")return null;if(Q==="autoEdit")return s(O0,{color:"magenta",children:[">> ","auto edit on ",s(O0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Q==="plan")return s(O0,{color:"cyan",children:["‖ plan mode on ",s(O0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Q==="yolo")return s(O0,{color:"red",children:["yolo mode on ",s(O0,{color:"gray",children:"(all tools auto-approved)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null})(),f=y!==null,M=[["Enter:发送","Shift+Enter:换行","Esc:中止"],["Shift+Tab:切换模式","Up/Down:历史","Tab:补全"],["Ctrl+A:行首","Ctrl+E:行尾","Ctrl+K:删到尾"],["Ctrl+U:删到首","Ctrl+W:删单词","Ctrl+C:退出"]];return s(l$,{flexDirection:"row",justifyContent:"space-between",paddingX:2,paddingY:0,children:[J?s(l$,{flexDirection:"column",gap:0,children:M.map((H,S)=>s(l$,{flexDirection:"row",children:[H.map((E,n)=>{let[r,o]=E.split(":");return s(l$,{flexDirection:"row",width:20,children:[s(O0,{color:"yellow",children:r},void 0,!1,void 0,this),s(O0,{color:"gray",children:":"},void 0,!1,void 0,this),s(O0,{color:"white",children:o},void 0,!1,void 0,this)]},n,!0,void 0,this)}),S===M.length-1&&s(O0,{color:"cyan",children:" ? 关闭"},void 0,!1,void 0,this)]},S,!0,void 0,this))},void 0,!1,void 0,this):s(l$,{flexDirection:"row",gap:1,children:[K&&s(w1,{children:[s(O0,{color:"gray",children:[" ",K]},void 0,!0,void 0,this),s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),y,f&&s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),P&&s(w1,{children:[s(O0,{color:P.status==="active"?"green":P.status==="verifying"?"cyan":P.status==="blocked"||P.status==="budget_limited"?"yellow":"gray",children:["goal:",P.status," ",P.objective.slice(0,32),P.prematureStop?` recovery:${P.prematureStop.consecutiveCount}`:"",P.verificationStall?` verify-gap:${P.verificationStall.consecutiveCount}`:""]},void 0,!0,void 0,this),s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),s(O0,{color:"gray",children:"? for shortcuts"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),s(l$,{flexDirection:"row",gap:1,children:!$?s(O0,{color:"red",children:"[WARN] API 密钥未配置"},void 0,!1,void 0,this):s(w1,{children:[C&&s(w1,{children:[L?s(O0,{color:"cyan",children:["Effort ",O]},void 0,!0,void 0,this):s(O0,{color:"gray",children:"Tab:Effort"},void 0,!1,void 0,this),s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),W!=="auto"&&s(w1,{children:[s(O0,{color:W==="fast"?"yellow":"gray",children:["Speed ",W]},void 0,!0,void 0,this),s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z!=="auto"&&s(w1,{children:[s(O0,{color:"gray",children:["Output ",z]},void 0,!0,void 0,this),s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),b!=="auto"&&s(w1,{children:[s(O0,{color:"gray",children:["Style ",b]},void 0,!0,void 0,this),s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),U&&s(O0,{color:"gray",children:U.model},void 0,!1,void 0,this),s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),q?s(O0,{color:"yellow",children:"压缩中..."},void 0,!1,void 0,this):s(O0,{color:G<20?"red":G<50?"yellow":"gray",children:[G,"%"]},void 0,!0,void 0,this),s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),s(O0,{color:A===void 0?"gray":"cyan",children:["Cache ",Y9(A)]},void 0,!0,void 0,this),N>0.001&&s(w1,{children:[s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),s(O0,{color:"green",children:["$",N<0.01?N.toFixed(4):N.toFixed(3)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),T.length>0&&s(w1,{children:[s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),s(O0,{color:"yellow",children:["已排队 ",T.length]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),_>0&&s(w1,{children:[s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),s(O0,{color:"cyan",children:["已恢复 ",_," 条指令"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Z&&s(w1,{children:[s(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),s(O0,{color:"yellow",children:"再按一次 Ctrl+C 退出"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as FQ,Text as WQ}from"ink";import t3 from"react";import{jsxDEV as d$}from"react/jsx-dev-runtime";var X9=t3.memo(({suggestions:$,selectedIndex:Q,visible:Y,maxDisplay:J=8})=>{if(!Y||$.length===0)return null;let Z=0,X=Math.min(J,$.length),K=Q>=$.length;if(Q>=J&&!K)Z=Q-J+1,X=Q+1;let U=$.slice(Z,X),G=$.length>J;return d$(FQ,{flexDirection:"column",paddingX:2,paddingY:0,children:[U.map((q,L)=>{let W=Z+L===Q;return d$(FQ,{flexDirection:"row",paddingX:1,gap:2,children:[d$(WQ,{color:W?"cyan":"white",bold:W,children:q.command},void 0,!1,void 0,this),d$(WQ,{color:W?"cyan":"gray",dimColor:!W,children:["- ",q.description]},void 0,!0,void 0,this)]},q.command,!0,void 0,this)}),G&&d$(FQ,{paddingX:1,children:d$(WQ,{color:K?"cyan":"gray",bold:K,dimColor:!K,children:["... and ",$.length-J," more"]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as F1,Text as S1,useInput as tZ,useStdout as sZ}from"ink";import eZ from"ink-select-input";import mQ,{useMemo as E9}from"react";import{Box as z0,Text as R0}from"ink";import A$,{useEffect as EQ,useMemo as b$,useRef as V9}from"react";import{Box as CQ,Text as L9}from"ink";import zZ from"react";import{Text as b1}from"ink";import UZ from"react";import F9 from"string-width";import b2 from"string-width";function HQ({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 s3=HQ();function LQ($){if(typeof $!=="string")throw TypeError(`Expected a \`string\`, got \`${typeof $}\``);if(!$.includes("\x1B")&&!$.includes("›"))return $;return $.replace(s3,"")}var K9=($=0)=>(Q)=>`\x1B[${Q+$}m`,G9=($=0)=>(Q)=>`\x1B[${38+$};5;${Q}m`,U9=($=0)=>(Q,Y,J)=>`\x1B[${38+$};2;${Q};${Y};${J}m`,h0={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]}},lU=Object.keys(h0.modifier),e3=Object.keys(h0.color),$Z=Object.keys(h0.bgColor),dU=[...e3,...$Z];function QZ(){let $=new Map;for(let[Q,Y]of Object.entries(h0)){for(let[J,Z]of Object.entries(Y))h0[J]={open:`\x1B[${Z[0]}m`,close:`\x1B[${Z[1]}m`},Y[J]=h0[J],$.set(Z[0],Z[1]);Object.defineProperty(h0,Q,{value:Y,enumerable:!1})}return Object.defineProperty(h0,"codes",{value:$,enumerable:!1}),h0.color.close="\x1B[39m",h0.bgColor.close="\x1B[49m",h0.color.ansi=K9(),h0.color.ansi256=G9(),h0.color.ansi16m=U9(),h0.bgColor.ansi=K9(10),h0.bgColor.ansi256=G9(10),h0.bgColor.ansi16m=U9(10),Object.defineProperties(h0,{rgbToAnsi256:{value(Q,Y,J){if(Q===Y&&Y===J){if(Q<8)return 16;if(Q>248)return 231;return Math.round((Q-8)/247*24)+232}return 16+36*Math.round(Q/255*5)+6*Math.round(Y/255*5)+Math.round(J/255*5)},enumerable:!1},hexToRgb:{value(Q){let Y=/[a-f\d]{6}|[a-f\d]{3}/i.exec(Q.toString(16));if(!Y)return[0,0,0];let[J]=Y;if(J.length===3)J=[...J].map((X)=>X+X).join("");let Z=Number.parseInt(J,16);return[Z>>16&255,Z>>8&255,Z&255]},enumerable:!1},hexToAnsi256:{value:(Q)=>h0.rgbToAnsi256(...h0.hexToRgb(Q)),enumerable:!1},ansi256ToAnsi:{value(Q){if(Q<8)return 30+Q;if(Q<16)return 90+(Q-8);let Y,J,Z;if(Q>=232)Y=((Q-232)*10+8)/255,J=Y,Z=Y;else{Q-=16;let U=Q%36;Y=Math.floor(Q/36)/5,J=Math.floor(U/6)/5,Z=U%6/5}let X=Math.max(Y,J,Z)*2;if(X===0)return 30;let K=30+(Math.round(Z)<<2|Math.round(J)<<1|Math.round(Y));if(X===2)K+=60;return K},enumerable:!1},rgbToAnsi:{value:(Q,Y,J)=>h0.ansi256ToAnsi(h0.rgbToAnsi256(Q,Y,J)),enumerable:!1},hexToAnsi:{value:(Q)=>h0.ansi256ToAnsi(h0.hexToAnsi256(Q)),enumerable:!1}}),h0}var JZ=QZ(),q9=JZ;var N8=new Set(["\x1B","›"]),YZ=39,wQ="\x07",_9="[",ZZ="]",N9="m",_8=`${ZZ}8;;`,O9=($)=>`${N8.values().next().value}${_9}${$}${N9}`,z9=($)=>`${N8.values().next().value}${_8}${$}${wQ}`,XZ=($)=>$.split(" ").map((Q)=>b2(Q)),BQ=($,Q,Y)=>{let J=[...Q],Z=!1,X=!1,K=b2(LQ($.at(-1)));for(let[U,G]of J.entries()){let q=b2(G);if(K+q<=Y)$[$.length-1]+=G;else $.push(G),K=0;if(N8.has(G))Z=!0,X=J.slice(U+1,U+1+_8.length).join("")===_8;if(Z){if(X){if(G===wQ)Z=!1,X=!1}else if(G===N9)Z=!1;continue}if(K+=q,K===Y&&U<J.length-1)$.push(""),K=0}if(!K&&$.at(-1).length>0&&$.length>1)$[$.length-2]+=$.pop()},KZ=($)=>{let Q=$.split(" "),Y=Q.length;while(Y>0){if(b2(Q[Y-1])>0)break;Y--}if(Y===Q.length)return $;return Q.slice(0,Y).join(" ")+Q.slice(Y).join("")},GZ=($,Q,Y={})=>{if(Y.trim!==!1&&$.trim()==="")return"";let J="",Z,X,K=XZ($),U=[""];for(let[O,W]of $.split(" ").entries()){if(Y.trim!==!1)U[U.length-1]=U.at(-1).trimStart();let z=b2(U.at(-1));if(O!==0){if(z>=Q&&(Y.wordWrap===!1||Y.trim===!1))U.push(""),z=0;if(z>0||Y.trim===!1)U[U.length-1]+=" ",z++}if(Y.hard&&K[O]>Q){let b=Q-z,N=1+Math.floor((K[O]-b-1)/Q);if(Math.floor((K[O]-1)/Q)<N)U.push("");BQ(U,W,Q);continue}if(z+K[O]>Q&&z>0&&K[O]>0){if(Y.wordWrap===!1&&z<Q){BQ(U,W,Q);continue}U.push("")}if(z+K[O]>Q&&Y.wordWrap===!1){BQ(U,W,Q);continue}U[U.length-1]+=W}if(Y.trim!==!1)U=U.map((O)=>KZ(O));let G=U.join(`
119
+ `),q=[...G],L=0;for(let[O,W]of q.entries()){if(J+=W,N8.has(W)){let{groups:b}=new RegExp(`(?:\\${_9}(?<code>\\d+)m|\\${_8}(?<uri>.*)${wQ})`).exec(G.slice(L))||{groups:{}};if(b.code!==void 0){let N=Number.parseFloat(b.code);Z=N===YZ?void 0:N}else if(b.uri!==void 0)X=b.uri.length===0?void 0:b.uri}let z=q9.codes.get(Number(Z));if(q[O+1]===`
120
+ `){if(X)J+=z9("");if(Z&&z)J+=O9(z)}else if(W===`
121
+ `){if(Z&&z)J+=O9(Z);if(X)J+=z9(X)}L+=W.length}return J};function bQ($,Q,Y){return String($).normalize().replaceAll(`\r
122
+ `,`
123
+ `).split(`
124
+ `).map((J)=>GZ(J,Q,Y)).join(`
125
+ `)}var AQ=($)=>{let Q=$.replace(/\*\*(.*?)\*\*/g,"$1").replace(/\*(.*?)\*/g,"$1").replace(/_(.*?)_/g,"$1").replace(/~~(.*?)~~/g,"$1").replace(/`(.*?)`/g,"$1").replace(/<u>(.*?)<\/u>/g,"$1").replace(/\[(.*?)\]\(.*?\)/g,"$1");return F9(Q)};var W9=($)=>{return/[*_~`<[\]https?:]/.test($)},PQ=($)=>{let Y=$.replace(/\*\*(.*?)\*\*/g,"$1").replace(/\*(.*?)\*/g,"$1").replace(/_(.*?)_/g,"$1").replace(/~~(.*?)~~/g,"$1").replace(/`(.*?)`/g,"$1").replace(/<u>(.*?)<\/u>/g,"$1").replace(/\[(.*?)\]\(.*?\)/g,"$1").split(/\s+/).filter((J)=>J.length>0);if(Y.length===0)return 0;return Math.max(...Y.map((J)=>F9(J)))},F8=($,Q,Y=!1)=>{if(Q<=0)return[$];let J=$.trimEnd(),X=bQ(J,Q,{hard:Y,trim:!1,wordWrap:!0}).split(`
126
+ `).filter((K)=>K.length>0);return X.length>0?X:[""]},H9=($,Q,Y,J)=>{let Z=Math.max(0,Y-Q);if(J==="center"){let X=Math.floor(Z/2);return" ".repeat(X)+$+" ".repeat(Z-X)}if(J==="right")return" ".repeat(Z)+$;return $+" ".repeat(Z)};import{jsxDEV as N1,Fragment as OZ}from"react/jsx-dev-runtime";var yQ=2,RQ=1,MQ=2;function TQ($,Q){return`inline-${$}-${Q}`}var qZ=({text:$})=>{let Q=b0();if(!W9($))return N1(b1,{children:$},void 0,!1,void 0,this);let Y=[],J=0,Z=0,X=0,K=/(\*\*.*?\*\*|\*(?!\s).*?(?<!\s)\*|_(?!\s).*?(?<!\s)_|~~.*?~~|`+[^`]+`+|\[.*?\]\(.*?\)|https?:\/\/\S+)/g,U;while((U=K.exec($))!==null){if(U.index>J){let O=$.slice(J,U.index);Y.push(N1(b1,{children:O},TQ("text",Z++),!1,void 0,this))}let G=U[0],q=null,L=TQ("match",X++);try{if(G.startsWith("**")&&G.endsWith("**")&&G.length>yQ*2)q=N1(b1,{bold:!0,children:G.slice(yQ,-yQ)},L,!1,void 0,this);else if(G.length>RQ*2&&(G.startsWith("*")&&G.endsWith("*")||G.startsWith("_")&&G.endsWith("_"))){let O=$.substring(U.index-1,U.index),W=$.substring(K.lastIndex,K.lastIndex+1);if(!(/\w/.test(O)||/\w/.test(W)||/[./\\]/.test(O+W)))q=N1(b1,{italic:!0,children:G.slice(RQ,-RQ)},L,!1,void 0,this)}else if(G.startsWith("~~")&&G.endsWith("~~")&&G.length>MQ*2)q=N1(b1,{strikethrough:!0,children:G.slice(MQ,-MQ)},L,!1,void 0,this);else if(G.startsWith("`")&&G.endsWith("`")){let O=G.match(/^(`+)([^`]+)\1$/);if(O&&O[2])q=N1(b1,{color:Q.colors.syntax.keyword,backgroundColor:Q.colors.background.secondary,bold:!0,children:` ${O[2]} `},L,!1,void 0,this)}else if(G.startsWith("[")&&G.includes("](")&&G.endsWith(")")){let O=G.match(/\[(.*?)\]\((.*?)\)/);if(O){let W=O[1],z=O[2];q=N1(b1,{children:[W,N1(b1,{color:Q.colors.info,children:[" (",z,")"]},void 0,!0,void 0,this)]},L,!0,void 0,this)}}else if(G.match(/^https?:\/\//))q=N1(b1,{color:Q.colors.info,children:G},L,!1,void 0,this)}catch(O){console.error("InlineRenderer 解析错误:",G,O),q=null}Y.push(q??N1(b1,{children:G},L,!1,void 0,this)),J=K.lastIndex}if(J<$.length){let G=$.slice(J);Y.push(N1(b1,{children:G},TQ("text",Z++),!1,void 0,this))}return N1(OZ,{children:Y.filter((G)=>G!==null)},void 0,!1,void 0,this)},A1=UZ.memo(qZ);import{jsxDEV as r$}from"react/jsx-dev-runtime";var _Z="▎",B9=zZ.memo(({lines:$,level:Q})=>{let Y=b0(),J=_Z.repeat(Q);return r$(CQ,{flexDirection:"column",children:$.map((Z,X)=>{if(Z.trim()==="")return r$(CQ,{height:1},X,!1,void 0,this);return r$(CQ,{flexDirection:"row",children:[r$(L9,{dimColor:!0,color:Y.colors.text.muted,children:[J," "]},void 0,!0,void 0,this),r$(L9,{italic:!0,wrap:"wrap",children:r$(A1,{text:Z},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},X,!0,void 0,this)})},void 0,!1,void 0,this)});import{Box as H8,Text as p1}from"ink";import{isPlainObject as SQ}from"lodash-es";import{common as PZ,createLowlight as yZ}from"lowlight";import{LRUCache as RZ}from"lru-cache";import M9 from"react";import{Box as W8,Text as A2}from"ink";import m1,{Fragment as y9}from"react";import{LRUCache as P9}from"lru-cache";import NZ from"string-width";var FZ=1024,WZ=1048576,w9=1000,b9=new P9({max:FZ,maxSize:WZ,sizeCalculation:($,Q)=>Math.max(1,Q.length*2+$.length*8)});function IQ($){let Q=!0;for(let J=0;J<$.length;J++)if($.charCodeAt(J)>127){Q=!1;break}if(Q)return $.split("");if($.length<=w9){let J=b9.get($);if(J)return J}let Y=Array.from($);if($.length<=w9)b9.set($,Y);return Y}var HZ=2048,LZ=524288,BZ=4096,A9=new P9({max:HZ,maxSize:LZ,sizeCalculation:($,Q)=>Math.max(1,Q.length*2+8)});function g1($){if(/^[\x20-\x7E]*$/.test($))return $.length;let Q=A9.get($);if(Q!==void 0)return Q;let Y=NZ($);if($.length<=BZ)A9.set($,Y);return Y}import{jsxDEV as a$}from"react/jsx-dev-runtime";var fQ=2,R9=m1.memo(({children:$,maxWidth:Q,maxHeight:Y,overflowDirection:J="top",additionalHiddenLinesCount:Z=0})=>{let X=b0(),K=[],U=Math.max(Math.round(Y??Number.MAX_SAFE_INTEGER),fQ);function G(N){if(!m1.isValidElement(N))return;if(N.type===y9){m1.Children.forEach(N.props.children,G);return}if(N.type===W8){bZ(N,Q,K);return}}m1.Children.forEach($,G);let L=K.length>U||Z>0?U-1:U,O=L!==void 0?Math.max(0,K.length-L):0,W=O+Z,b=(O>0?J==="top"?K.slice(O):K.slice(0,L):K).map((N,A)=>a$(W8,{children:N.length>0?N.map((T,_)=>a$(A2,{...T.props,children:T.text},_,!1,void 0,this)):a$(A2,{children:" "},void 0,!1,void 0,this)},A,!1,void 0,this));return a$(W8,{flexDirection:"column",width:Q,flexShrink:0,children:[W>0&&J==="top"&&a$(A2,{color:X.colors.text.muted,dimColor:!0,children:["... ",W," line",W===1?"":"s"," hidden ..."]},void 0,!0,void 0,this),b,W>0&&J==="bottom"&&a$(A2,{color:X.colors.text.muted,dimColor:!0,children:["... ",W," line",W===1?"":"s"," hidden ..."]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});function wZ($){if(!m1.isValidElement($)||$.type!==W8)return{noWrapSegments:[],segments:[]};let Q={noWrapSegments:[],segments:[]},Y=!1;function J(Z,X){if(Z===null||Z===void 0)return;if(typeof Z==="string"||typeof Z==="number"){let q=String(Z);if(!q)return;let L={text:q,props:X??{}};if(X===void 0||X.wrap==="wrap")Y=!0,Q.segments.push(L);else if(!Y)Q.noWrapSegments.push(L);else Q.segments.push(L);return}if(!m1.isValidElement(Z))return;if(Z.type===y9){m1.Children.forEach(Z.props.children,(q)=>J(q,X));return}if(Z.type!==A2)return;let{children:K,...U}=Z.props,G=X===void 0?U:{...X,...U};m1.Children.forEach(K,(q)=>J(q,G))}return m1.Children.forEach($.props.children,(Z)=>J(Z,void 0)),Q}function bZ($,Q,Y){let J=wZ($);if(J.segments.length===0&&J.noWrapSegments.length===0){Y.push([]);return}let Z=0;for(let O of J.noWrapSegments)Z+=g1(O.text);if(J.segments.length===0){let O=[],W=[];for(let z of J.noWrapSegments){let b=z.text.split(`
127
+ `);for(let N=0;N<b.length;N++){if(N>0)O.push(W),W=[];if(b[N])W.push({text:b[N],props:z.props})}}if(W.length>0)O.push(W);for(let z of O)Y.push(z);return}let X=Q-Z;if(X<1){AZ(J.noWrapSegments,Q,Y);return}let K=[],U=[],G=0;function q(){if(K.length===0)K.push([...J.noWrapSegments,...U]);else if(Z>0)K.push([{text:" ".repeat(Z),props:{}},...U]);else K.push(U);U=[],G=0}function L(O,W){if(U.length>0&&U[U.length-1].props===W)U[U.length-1].text+=O;else U.push({text:O,props:W})}for(let O of J.segments){let W=O.text.split(`
128
+ `);for(let z=0;z<W.length;z++){if(z>0)q();let N=W[z].split(/(\s+)/);for(let A of N){if(!A)continue;let T=g1(A);if(G+T>X&&G>0){if(q(),/^\s+$/.test(A))continue}if(T>X){let k=IQ(A);while(k.length>0){let P=0,w=0;for(let C of k){let B=g1(C);if(G+w+B>X)break;w+=B,P++}if(P>0){let C=k.slice(0,P).join("");L(C,O.props),G+=g1(C),k=k.slice(P)}if(k.length>0)q()}}else L(A,O.props),G+=T}}if(O.text.endsWith(`
129
+ `))q()}if(U.length>0)q();for(let O of K)Y.push(O)}function AZ($,Q,Y){let J=[],Z=[],X=0;for(let K of $){let U=K.text.split(`
130
+ `);for(let G=0;G<U.length;G++){if(G>0)J.push(Z),Z=[],X=0;let q=U[G];if(!q)continue;let L=g1(q),O=Math.max(0,Q-g1("…"));if(L<=O&&X===0)Z.push({text:q,props:K.props}),X+=L;else{let W=IQ(q),z=X,b=0;for(let A of W){let T=g1(A);if(z+T>O)break;z+=T,b++}let N=W.slice(0,b).join("");if(N)Z.push({text:N,props:K.props});Z.push({text:"…",props:{}}),X=z+g1("…")}}}if(Z.length>0)J.push(Z);if(J.length===0)J.push([{text:"…",props:{}}]);for(let K of J)Y.push(K)}import{jsxDEV as X1}from"react/jsx-dev-runtime";var kQ=yZ(PZ),MZ=200,TZ=524288,CZ=4096,T9=new RZ({max:MZ,maxSize:TZ,sizeCalculation:($)=>$.retainedChars});function C9($,Q){return`${Q??"__auto__"}\x00${$}`}function IZ($,Q){return T9.get(C9($,Q))?.root}function fZ($,Q,Y){if($.length>CZ)return;let J=Q?.length??0;T9.set(C9($,Q),{root:Y,retainedChars:Math.max(1,$.length*2+J)})}function kZ($){return SQ($)&&$.type==="text"&&typeof $.value==="string"}function SZ($){return SQ($)&&$.type==="element"}function vZ($){return SQ($)&&$.type==="root"&&Array.isArray($.children)}function L8($,Q,Y=0){if(kZ($))return X1(p1,{wrap:"wrap",children:$.value},Y,!1,void 0,this);if(SZ($)){let J=$.properties?.className?.[0]||"",Z=Q.default;if(J.includes("comment"))Z=Q.comment;else if(J.includes("string"))Z=Q.string;else if(J.includes("number"))Z=Q.number;else if(J.includes("keyword"))Z=Q.keyword;else if(J.includes("function"))Z=Q.function;else if(J.includes("variable"))Z=Q.variable;else if(J.includes("operator"))Z=Q.operator;else if(J.includes("type"))Z=Q.type;else if(J.includes("tag"))Z=Q.tag;else if(J.includes("attr"))Z=Q.attr;let X=$.children?.map((K,U)=>L8(K,Q,U));return X1(p1,{color:Z,wrap:"wrap",children:X},Y,!1,void 0,this)}if(vZ($))return X1(M9.Fragment,{children:$.children.map((J,Z)=>L8(J,Q,Z))},Y,!1,void 0,this);return X1(p1,{},Y,!1,void 0,this)}function DZ($,Q,Y){let J=Y||a0.getTheme().colors.syntax;try{let Z=IZ($,Q);if(Z)return L8(Z,J);let X;if(!Q||!kQ.registered(Q))X=kQ.highlightAuto($);else X=kQ.highlight(Q,$);let K=X;if(!K.children||K.children.length===0)return X1(p1,{color:J.default,wrap:"wrap",children:$},void 0,!1,void 0,this);return fZ($,Q,X),L8(X,J)}catch(Z){return X1(p1,{color:J.default,wrap:"wrap",children:$},void 0,!1,void 0,this)}}var B8=M9.memo(({content:$,language:Q,showLineNumbers:Y=!0,terminalWidth:J,availableHeight:Z})=>{let X=b0(),K=$.split(`
131
+ `),U=0;if(Z&&K.length>Z){let O=Math.max(Z,fQ);if(K.length>O)U=K.length-O,K=K.slice(U)}let G=K.length+U,q=String(G).length+1,L=Math.max(20,J-4);return X1(H8,{borderStyle:"round",borderColor:X.colors.border.light,paddingX:1,paddingY:0,marginY:1,flexDirection:"column",children:[Q&&X1(H8,{marginBottom:0,children:X1(p1,{color:X.colors.text.secondary,children:Q},void 0,!1,void 0,this)},void 0,!1,void 0,this),U>0&&X1(H8,{marginBottom:0,children:X1(p1,{color:X.colors.text.muted,dimColor:!0,children:["... ",U," lines hidden ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),X1(R9,{maxWidth:L,maxHeight:Z,children:K.map((O,W)=>{let z=W+U+1;return X1(H8,{flexDirection:"row",children:[Y&&X1(p1,{color:X.colors.text.muted,dimColor:!0,wrap:"truncate",children:[String(z).padStart(q-1," ")," "]},void 0,!0,void 0,this),O.trim()===""?X1(p1,{wrap:"wrap",children:" "},void 0,!1,void 0,this):DZ(O,Q,X.colors.syntax)]},W,!0,void 0,this)})},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as I9,Text as O1,useInput as VZ}from"ink";import jZ,{useState as hZ}from"react";import{jsxDEV as K1}from"react/jsx-dev-runtime";var f9=400;function EZ($){let Q=$.split(`
132
+ `),Y=[],J=0,Z=0;for(let X of Q){if(X.startsWith("---")||X.startsWith("+++"))continue;if(X.startsWith("@@")){let K=X.match(/@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@/);if(K)J=parseInt(K[1],10),Z=parseInt(K[3],10);Y.push({type:"header",content:X});continue}if(X.startsWith("-")){Y.push({type:"remove",content:X.substring(1),lineNumber:J}),J++;continue}if(X.startsWith("+")){Y.push({type:"add",content:X.substring(1),lineNumber:Z}),Z++;continue}if(X.startsWith(" ")||X===""){Y.push({type:"context",content:X.substring(1),lineNumber:Z}),J++,Z++;continue}}return Y}var vQ=jZ.memo(({patch:$,startLine:Q,matchLine:Y,terminalWidth:J,maxLines:Z=20,isFocused:X=!1})=>{let K=b0(),U=EZ($),[G,q]=hZ(!1);VZ((_)=>{if(_.toLowerCase()==="e")q((k)=>!k)},{isActive:X&&U.length>Z});let O=Math.max(...U.map((_)=>_.lineNumber||0)).toString().length+1,W=U.filter((_)=>_.type==="add").length,z=U.filter((_)=>_.type==="remove").length,b=U.length,N=b>Z,A;if(!N)A=U;else if(G)A=U.slice(0,f9);else A=U.slice(0,Z);let T=b-A.length;return K1(I9,{flexDirection:"column",marginTop:1,marginBottom:1,children:[K1(O1,{color:K.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,J)))},void 0,!1,void 0,this),N&&K1(O1,{color:K.colors.info,children:[G?`已展开 ${A.length}/${b} 行`:`显示前 ${Z} 行,共 ${b} 行`," · ",K1(O1,{color:K.colors.success,children:["+",W]},void 0,!0,void 0,this)," ",K1(O1,{color:K.colors.error,children:["-",z]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),N&&K1(O1,{color:K.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,J)))},void 0,!1,void 0,this),A.map((_,k)=>{if(_.type==="header")return K1(O1,{color:K.colors.muted,dimColor:!0,children:_.content},k,!1,void 0,this);let P=_.lineNumber?_.lineNumber.toString().padStart(O," "):" ".repeat(O),w=" ",C,B;if(_.type==="add")w="+",B=K.colors.success,C=void 0;else if(_.type==="remove")w="-",B=K.colors.error,C=void 0;else B=K.colors.text.primary;let y=Math.max(0,J-O-2),f=_.content;if(f.length>y)f=f.substring(0,y-3)+"...";return K1(O1,{color:B,backgroundColor:C,children:[K1(O1,{dimColor:!0,children:P},void 0,!1,void 0,this),K1(O1,{children:w},void 0,!1,void 0,this),K1(O1,{children:[" ",f]},void 0,!0,void 0,this)]},k,!0,void 0,this)}),N&&K1(I9,{marginTop:1,children:G?K1(O1,{color:K.colors.info,dimColor:!0,children:[T>0?`已达显示上限 ${f9} 行,仍有 ${T} 行未显示`:"已显示全部内容",X?" · 按 E 折叠":""]},void 0,!0,void 0,this):K1(O1,{color:K.colors.info,dimColor:!0,children:["已隐藏剩余 ",T," 行",X?" · 按 E 展开全部":""]},void 0,!0,void 0,this)},void 0,!1,void 0,this),K1(O1,{color:K.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,J)))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as DQ,Text as k9}from"ink";import gZ from"react";import{jsxDEV as o$}from"react/jsx-dev-runtime";var mZ=({itemText:$,type:Q,marker:Y,leadingWhitespace:J=""})=>{let Z=Q==="ol"?`${Y}. `:`${Y} `,X=Z.length,K=J.length;return o$(DQ,{paddingLeft:K+1,flexDirection:"row",children:[o$(DQ,{width:X,children:o$(k9,{children:Z},void 0,!1,void 0,this)},void 0,!1,void 0,this),o$(DQ,{flexGrow:1,children:o$(k9,{wrap:"wrap",children:o$(A1,{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)},VQ=gZ.memo(mZ);import{Text as jQ}from"ink";import pZ,{useMemo as cZ}from"react";import S9 from"string-width";import{jsxDEV as hQ}from"react/jsx-dev-runtime";var v9=4,i$=3,xZ=4,D9=pZ.memo(({headers:$,rows:Q,terminalWidth:Y})=>{let J=b0(),Z=cZ(()=>{if($.length===0||Q.length===0)return null;let O=$.length,W=$.map((B,y)=>{let f=Math.max(PQ(B),i$);for(let M of Q)f=Math.max(f,PQ(M[y]||""));return f}),z=$.map((B,y)=>{let f=Math.max(AQ(B),i$);for(let M of Q)f=Math.max(f,AQ(M[y]||""));return f}),b=1+O*3,N=Math.max(Y-b-v9,O*i$),A=W.reduce((B,y)=>B+y,0),T=z.reduce((B,y)=>B+y,0),_=!1,k;if(T<=N)k=z;else if(A<=N){let B=N-A,y=z.map((M,H)=>M-W[H]),f=y.reduce((M,H)=>M+H,0);k=W.map((M,H)=>{if(f===0)return M;let S=Math.floor(y[H]/f*B);return M+S})}else{_=!0;let B=N/A;k=W.map((y)=>Math.max(Math.floor(y*B),i$))}function P(){let B=1;for(let y=0;y<$.length;y++){let f=F8($[y],k[y],_);B=Math.max(B,f.length)}for(let y of Q)for(let f=0;f<y.length;f++){let M=F8(y[f]||"",k[f],_);B=Math.max(B,M.length)}return B}if(P()>xZ)return{type:"vertical",columnWidths:k,needsHardWrap:_};return{type:"horizontal",columnWidths:k,needsHardWrap:_}},[$,Q,Y]);if(!Z)return null;if(Z.type==="vertical"){let O=Math.min(Y-1,40),W="─".repeat(O);return hQ(jQ,{children:Q.map((z,b)=>{let N=[];if(b>0)N.push(W);return z.forEach((A,T)=>{let _=$[T]||`Column ${T+1}`,k=(A||"").replace(/\n+/g," ").trim();N.push(`\x1B[1m${_}:\x1B[22m ${k}`)}),N.join(`
133
+ `)}).join(`
134
+ `)},void 0,!1,void 0,this)}let{columnWidths:X,needsHardWrap:K}=Z;function U(O){let z={top:{left:"┌",mid:"┬",right:"┐",h:"─"},middle:{left:"├",mid:"┼",right:"┤",h:"─"},bottom:{left:"└",mid:"┴",right:"┘",h:"─"}}[O],b=z.left;return X.forEach((N,A)=>{b+=z.h.repeat(N+2),b+=A<X.length-1?z.mid:z.right}),b}function G(O,W){let z=O.map((T,_)=>{let k=X[_]||i$;return F8(T||"",k,K)}),b=Math.max(...z.map((T)=>T.length),1),N=z.map((T)=>Math.floor((b-T.length)/2)),A=[];for(let T=0;T<b;T++){let _="│";for(let k=0;k<O.length;k++){let P=z[k],w=N[k],C=T-w,B=C>=0&&C<P.length?P[C]:"",y=X[k]||i$,f=S9(B),M=H9(W?`\x1B[1m${B}\x1B[22m`:B,f,y,W?"center":"left");_+=` ${M} │`}A.push(_)}return A}let q=[];if(q.push(U("top")),q.push(...G($,!0)),q.push(U("middle")),Q.forEach((O,W)=>{if(q.push(...G(O,!1)),W<Q.length-1)q.push(U("middle"))}),q.push(U("bottom")),Math.max(...q.map((O)=>S9(O)))>Y-v9){let O=Math.min(Y-1,40),W="─".repeat(O);return hQ(jQ,{children:Q.map((z,b)=>{let N=[];if(b>0)N.push(W);return z.forEach((A,T)=>{let _=$[T]||`Column ${T+1}`,k=(A||"").replace(/\n+/g," ").trim();N.push(`\x1B[1m${_}:\x1B[22m ${k}`)}),N.join(`
135
+ `)}).join(`
136
+ `)},void 0,!1,void 0,this)}return hQ(jQ,{color:J.colors.text.primary,children:q.join(`
137
+ `)},void 0,!1,void 0,this)});import{jsxDEV as g}from"react/jsx-dev-runtime";var uZ=($,Q,Y)=>{switch($){case"user":return{color:Q.info,prefix:"> "};case"assistant":return{color:Q.success,prefix:"• "};case"system":return{color:Q.warning,prefix:" "};case"tool":{let J=Y&&"phase"in Y?Y.phase:void 0;return{color:Q.text.secondary,prefix:J==="start"?"• ":J==="complete"?" └ ":" "}}default:return{color:Q.text.primary,prefix:" "}}},lZ=A$.memo(({content:$,language:Q,terminalWidth:Y,isPending:J=!1,availableHeight:Z})=>{let X=b0();if(J&&Z!==void 0){let K=$.split(`
138
+ `),U=4,G=Math.max(1,Z-4);if(K.length>G){let q=K.slice(0,G).join(`
139
+ `);return g(z0,{flexDirection:"column",flexShrink:0,children:[g(B8,{content:q,language:Q,showLineNumbers:!0,terminalWidth:Y},void 0,!1,void 0,this),g(R0,{color:X.colors.text.muted,dimColor:!0,children:"... generating more code ..."},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}}return g(B8,{content:$,language:Q,showLineNumbers:!0,terminalWidth:Y},void 0,!1,void 0,this)}),dZ=A$.memo(({content:$,level:Q})=>{let Y=b0();switch(Q){case 1:return g(R0,{bold:!0,color:Y.colors.primary,children:g(A1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 2:return g(R0,{bold:!0,color:Y.colors.primary,children:g(A1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 3:return g(R0,{bold:!0,color:Y.colors.text.primary,children:g(A1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 4:return g(R0,{italic:!0,color:Y.colors.text.muted,children:g(A1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);default:return g(R0,{children:g(A1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)}}),rZ=A$.memo(({terminalWidth:$})=>{let Q=b0(),Y=Math.max(0,Math.min($-4,80));return g(R0,{dimColor:!0,color:Q.colors.text.muted,children:"─".repeat(Y)},void 0,!1,void 0,this)}),aZ=A$.memo(({content:$})=>{return g(R0,{wrap:"wrap",children:g(A1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)}),oZ=A$.memo(({content:$})=>{let Q=b0();return g(z0,{flexDirection:"row",gap:1,children:[g(R0,{color:Q.colors.info,children:" "},void 0,!1,void 0,this),g(R0,{color:Q.colors.text.muted,italic:!0,children:$},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}),iZ=A$.memo(({detail:$,terminalWidth:Q})=>{let Y=b0(),J=50,Z=$.split(`
140
+ `);while(Z.length>0&&Z[0].trim()==="")Z.shift();while(Z.length>0&&Z[Z.length-1].trim()==="")Z.pop();let X=Z.length>50,K=X?Z.slice(0,50):Z,U=K.join(`
141
+ `),G=U.includes("<<<DIFF>>>"),q=U.includes("```");if(G){let L=U.match(/<<<DIFF>>>\s*({[\s\S]*?})\s*<<<\/DIFF>>>/);if(L)try{let O=JSON.parse(L[1]);return g(z0,{flexDirection:"column",children:[g(vQ,{patch:O.patch,startLine:O.startLine,matchLine:O.matchLine,terminalWidth:Q},void 0,!1,void 0,this),X&&g(z0,{marginTop:1,children:g(R0,{dimColor:!0,color:Y.colors.text.muted,children:["... 省略 ",Z.length-50," 行 ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}catch{}}if(q){let L=U.match(/```(\w+)?\s*\n([\s\S]*?)\n```/);if(L){let O=L[1]||"text",W=L[2];return g(z0,{flexDirection:"column",children:[g(B8,{content:W,language:O,showLineNumbers:!1,terminalWidth:Q},void 0,!1,void 0,this),X&&g(z0,{marginTop:1,children:g(R0,{dimColor:!0,color:Y.colors.text.muted,children:["... 省略 ",Z.length-50," 行 ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}}return g(z0,{flexDirection:"column",children:[K.map((L,O)=>g(R0,{color:Y.colors.text.primary,children:L},O,!1,void 0,this)),X&&g(z0,{marginTop:1,children:g(R0,{dimColor:!0,color:Y.colors.text.muted,children:["... 省略 ",Z.length-50," 行 ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});function nZ($,Q,Y,J=80){if(!Y||Q===void 0||Q<=0)return{content:$,isTruncated:!1,hiddenLines:0};let X=Math.max(1,Q-8),K=Math.max(40,J*0.8),U=X*K;if($.length<=U)return{content:$,isTruncated:!1,hiddenLines:0};let G=Math.floor(U*0.9),q=$.length-G,L=q,O=$.indexOf(`
142
+ `,q);if(O!==-1&&O-q<K)L=O+1;let W=$.slice(L),b=($.slice(0,L).match(/\n/g)||[]).length+1;return{content:W,isTruncated:!0,hiddenLines:b}}var k1=A$.memo(({content:$,role:Q,terminalWidth:Y,metadata:J,isPending:Z=!1,availableTerminalHeight:X,hidePrefix:K=!1,noMargin:U=!1,renderPlainTextOnly:G=!1,streamingLines:q,streamingHiddenLines:L,messageId:O,blocksOverride:W,currentLineOverride:z,streamingMode:b="text",renderCodeBlocksAsPlainText:N=!1})=>{let A=b0(),T=W!==void 0,_=b$(()=>uZ(Q,A.colors,J),[Q,A.colors,J]),{color:k,prefix:P}=_,w=P.length+1,C=b$(()=>{if(!J||typeof J!=="object")return null;if(!("subtaskRef"in J))return null;let F=J.subtaskRef;if(!F||typeof F!=="object")return null;return F},[J]),B=Q==="tool"&&J?.phase==="start",y=!U&&!B,f=b$(()=>{if(!G)return[];return $.split(/\r?\n/)},[$,G]);if(!T&&Z){let F=q??$.split(/\r?\n/),R=L??0,V=!1,I=!1,v=!1;if(b!=="text")V=b==="code",I=b==="diff",v=b==="table";return g(z0,{flexDirection:"column",marginBottom:y?1:0,flexShrink:0,children:[R>0&&g(z0,{flexDirection:"row",flexShrink:0,children:[g(z0,{width:w,flexShrink:0},void 0,!1,void 0,this),g(R0,{color:A.colors.text.muted,dimColor:!0,children:["^ ",R," lines above (streaming...)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),F.map((h,Q0)=>{if(b==="text"){if(h.match(J$.codeBlock))V=!V;else if(h.match(J$.diffStart))I=!0;else if(h.match(J$.diffEnd))I=!1;else if(h.match(J$.table))v=!0;else if(v&&!h.match(J$.table))v=!1}let e=b==="text"&&!V&&!I&&!v,X0=e?h.match(J$.ulItem):null,A0=e?h.match(J$.olItem):null,D0=X0??A0;return g(z0,{flexDirection:"row",flexShrink:0,children:[Q0===0&&!K?g(z0,{marginRight:1,flexShrink:0,children:g(R0,{color:k,bold:!0,children:P},void 0,!1,void 0,this)},void 0,!1,void 0,this):g(z0,{width:w,flexShrink:0},void 0,!1,void 0,this),g(z0,{flexGrow:1,flexShrink:0,children:D0?g(VQ,{type:X0?"ul":"ol",marker:D0[2],itemText:D0[3],leadingWhitespace:D0[1]},void 0,!1,void 0,this):g(R0,{wrap:"wrap",children:h===""?" ":h},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},Q0,!0,void 0,this)})]},void 0,!0,void 0,this)}if(!T&&G)return g(z0,{flexDirection:"column",marginBottom:y?1:0,flexShrink:0,children:f.map((F,R)=>g(z0,{flexDirection:"row",flexShrink:0,children:[R===0&&!K?g(z0,{marginRight:1,flexShrink:0,children:g(R0,{color:k,bold:!0,children:P},void 0,!1,void 0,this)},void 0,!1,void 0,this):g(z0,{width:w,flexShrink:0},void 0,!1,void 0,this),g(z0,{flexGrow:1,flexShrink:0,children:g(R0,{wrap:"wrap",children:F===""?" ":F},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},R,!0,void 0,this))},void 0,!1,void 0,this);let M=V9(null);EQ(()=>{M.current=null},[O]);let H=b$(()=>{if(T)return null;if(!O)return null;return j9(O)},[O,T]);EQ(()=>{if(T)return;if(!H||!O)return;M.current={messageId:O,blocks:H}},[H,O,T]),EQ(()=>{if(T)return;if(!H||!O)return;h9(O)},[H,O,T]);let S=b$(()=>T?{content:$,isTruncated:!1,hiddenLines:0}:nZ($,X,Z,Y),[$,X,Z,Y,T]),{content:E,isTruncated:n,hiddenLines:r}=S;if(!T&&Q==="tool"&&J&&"detail"in J){let F=J;if(F.detail)return g(z0,{flexDirection:"column",marginBottom:U?0:1,children:[g(z0,{flexDirection:"row",children:[g(z0,{marginRight:1,children:g(R0,{color:k,bold:!0,children:P},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(R0,{color:k,children:$},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g(z0,{marginLeft:P.length+1,children:g(iZ,{detail:F.detail,terminalWidth:Y-(P.length+1)},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}let{completedContent:o,currentLine:l}=b$(()=>{if(T)return{completedContent:"",currentLine:z??""};if(!Z)return{completedContent:E,currentLine:""};let F=E.lastIndexOf(`
143
+ `);if(F===-1)return{completedContent:"",currentLine:E};return{completedContent:E.slice(0,F+1),currentLine:E.slice(F+1)}},[E,Z,T,z]),p=V9({content:"",blocks:[]}),d=b$(()=>{if(T)return W??[];if(H)return H;if(M.current&&M.current.messageId===O)return M.current.blocks;let F=p.current;if(!Z||!o.startsWith(F.content)){let v=gQ(o);return p.current={content:o,blocks:v},v}if(o===F.content)return F.blocks;let R=o.slice(F.content.length),V=gQ(R),I=[...F.blocks,...V];return p.current={content:o,blocks:I},I},[o,Z,T,W]);return g(z0,{flexDirection:"column",marginBottom:y?1:0,flexShrink:0,children:[n&&g(z0,{flexDirection:"row",flexShrink:0,children:[g(z0,{width:w,flexShrink:0},void 0,!1,void 0,this),g(R0,{color:A.colors.text.muted,dimColor:!0,children:["^ ",r," lines above (streaming...)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),d.map((F,R)=>{if(F.type==="empty")return g(z0,{height:1,flexShrink:0},R,!1,void 0,this);return g(z0,{flexDirection:"row",flexShrink:0,children:[R===0&&!K&&g(z0,{marginRight:1,flexShrink:0,children:g(R0,{color:k,bold:!0,children:P},void 0,!1,void 0,this)},void 0,!1,void 0,this),(R>0||K)&&g(z0,{width:w,flexShrink:0},void 0,!1,void 0,this),g(z0,{flexGrow:1,flexShrink:0,children:F.type==="code"?N?g(R0,{wrap:"wrap",children:F.content},void 0,!1,void 0,this):g(lZ,{content:F.content,language:F.language,terminalWidth:Y-w,isPending:Z,availableHeight:X},void 0,!1,void 0,this):F.type==="table"&&F.tableData?g(D9,{headers:F.tableData.headers,rows:F.tableData.rows,terminalWidth:Y-w},void 0,!1,void 0,this):F.type==="heading"?g(dZ,{content:F.content,level:F.level||1},void 0,!1,void 0,this):F.type==="list"?g(VQ,{type:F.listType||"ul",marker:F.marker||"-",itemText:F.content,leadingWhitespace:" ".repeat(F.indentation||0)},void 0,!1,void 0,this):F.type==="hr"?g(rZ,{terminalWidth:Y-w},void 0,!1,void 0,this):F.type==="diff"&&F.diffData?g(vQ,{patch:F.diffData.patch,startLine:F.diffData.startLine,matchLine:F.diffData.matchLine,terminalWidth:Y-w},void 0,!1,void 0,this):F.type==="command-message"?g(oZ,{content:F.content},void 0,!1,void 0,this):F.type==="blockquote"&&F.blockquoteLines?g(B9,{lines:F.blockquoteLines,level:F.blockquoteLevel||1},void 0,!1,void 0,this):g(aZ,{content:F.content},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},R,!0,void 0,this)}),l&&g(z0,{flexDirection:"row",flexShrink:0,children:[d.length===0&&!K?g(z0,{marginRight:1,flexShrink:0,children:g(R0,{color:k,bold:!0,children:P},void 0,!1,void 0,this)},void 0,!1,void 0,this):g(z0,{width:w,flexShrink:0},void 0,!1,void 0,this),g(z0,{flexGrow:1,flexShrink:0,children:g(R0,{wrap:"wrap",children:l},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),C&&g(z0,{flexDirection:"row",flexShrink:0,children:[g(z0,{width:w,flexShrink:0},void 0,!1,void 0,this),g(z0,{flexDirection:"column",flexGrow:1,flexShrink:0,children:[g(R0,{color:A.colors.text.muted,children:["Subtask"," ",typeof C.agentType==="string"?`@${C.agentType}`:"",typeof C.status==="string"?` · ${C.status}`:""]},void 0,!0,void 0,this),typeof C.summary==="string"&&C.summary.trim()!==""&&g(R0,{wrap:"wrap",children:C.summary},void 0,!1,void 0,this),typeof C.childSessionId==="string"&&g(R0,{color:A.colors.text.muted,children:["Session ",C.childSessionId]},void 0,!0,void 0,this),typeof C.resumedFrom==="string"&&g(R0,{color:A.colors.text.muted,children:["Resumed from ",C.resumedFrom,typeof C.resumeDepth==="number"?` · depth ${C.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)},($,Q)=>{return $.content===Q.content&&$.role===Q.role&&$.terminalWidth===Q.terminalWidth&&$.isPending===Q.isPending&&$.availableTerminalHeight===Q.availableTerminalHeight&&$.hidePrefix===Q.hidePrefix&&$.noMargin===Q.noMargin&&$.renderPlainTextOnly===Q.renderPlainTextOnly&&$.streamingHiddenLines===Q.streamingHiddenLines&&$.streamingLines===Q.streamingLines&&$.messageId===Q.messageId&&$.metadata===Q.metadata&&$.blocksOverride===Q.blocksOverride&&$.currentLineOverride===Q.currentLineOverride&&$.streamingMode===Q.streamingMode&&$.renderCodeBlocksAsPlainText===Q.renderCodeBlocksAsPlainText});import{jsxDEV as I0,Fragment as Y5}from"react/jsx-dev-runtime";var $5=mQ.memo(({label:$,isSelected:Q})=>I0(S1,{color:Q?"yellow":void 0,children:$},void 0,!1,void 0,this)),Q5=mQ.memo(({details:$,headerColor:Q,isPlanModeExit:Y,isPlanModeEnter:J,terminalWidth:Z})=>I0(Y5,{children:[I0(F1,{marginBottom:1,children:I0(S1,{children:$.message},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.planContent&&I0(F1,{flexDirection:"column",marginBottom:1,borderStyle:"single",borderColor:Q,padding:1,children:[I0(S1,{bold:!0,color:Q,children:"实施方案"},void 0,!1,void 0,this),I0(F1,{marginTop:1,children:I0(k1,{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&&I0(F1,{flexDirection:"column",marginBottom:1,children:I0(k1,{content:$.details,role:"assistant",terminalWidth:Z},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.risks&&$.risks.length>0&&I0(F1,{flexDirection:"column",marginBottom:1,children:[I0(S1,{color:"red",bold:!0,children:"风险提示:"},void 0,!1,void 0,this),$.risks.map((X,K)=>I0(F1,{marginLeft:2,children:I0(S1,{color:"red",children:["• ",X]},void 0,!0,void 0,this)},K,!1,void 0,this))]},void 0,!0,void 0,this),$.affectedFiles&&$.affectedFiles.length>0&&I0(F1,{flexDirection:"column",marginBottom:1,children:[I0(S1,{color:"yellow",children:"影响的文件:"},void 0,!1,void 0,this),$.affectedFiles.slice(0,3).map((X,K)=>I0(F1,{marginLeft:2,children:I0(S1,{children:["• ",X]},void 0,!0,void 0,this)},K,!1,void 0,this)),$.affectedFiles.length>3&&I0(F1,{marginLeft:2,children:I0(S1,{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 J5($,Q,Y,J){return`使用 ↑↓ 选择,回车确认 · ${Q||Y||J?"Y/N":$?"Y/S/N":"Y/S/P/N"} 快捷键 · Esc 取消`}var g9=mQ.memo(({details:$,onResponse:Q})=>{let{stdout:Y}=sZ(),J=Y.columns||80,X=e0()==="confirmation-prompt",K=k0(!1),U=$.type==="exitPlanMode",G=$.type==="enterPlanMode",q=$.type==="maxTurnsExceeded",L=$.type==="mcpSampling";tZ((z,b)=>{if(b.ctrl&&z==="c"||b.meta&&z==="c"){K();return}if(b.escape){Q({approved:!1,reason:"用户取消"});return}let N=z.toLowerCase();if(U){if(N==="y"){Q({approved:!0,targetMode:"autoEdit"});return}if(N==="s"){Q({approved:!0,targetMode:"default"});return}if(N==="n"){Q({approved:!1,reason:"方案需要改进"});return}}else if(G){if(N==="y"){Q({approved:!0});return}if(N==="n"){Q({approved:!1,reason:"用户拒绝进入 Plan 模式"});return}}else if(q){if(N==="y"){Q({approved:!0});return}if(N==="n"){Q({approved:!1,reason:"用户选择停止"});return}}else if(L){if(N==="y"){Q({approved:!0,scope:"once"});return}if(N==="n"){Q({approved:!1,reason:"用户拒绝 MCP Sampling"});return}}else{if(N==="y"){Q({approved:!0,scope:"once"});return}if(N==="s"){Q({approved:!0,scope:"session"});return}if(N==="p"){Q({approved:!0,scope:"project"});return}if(N==="n"){Q({approved:!1,reason:"用户拒绝"});return}}},{isActive:X});let O=E9(()=>{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(L)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,L]),W=E9(()=>{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 I0(F1,{flexDirection:"column",borderStyle:"round",borderColor:X?W.color:"gray",padding:1,children:[I0(F1,{marginBottom:1,children:I0(S1,{bold:!0,color:W.color,children:W.title},void 0,!1,void 0,this)},void 0,!1,void 0,this),I0(Q5,{details:$,headerColor:W.color,isPlanModeExit:U,isPlanModeEnter:G,terminalWidth:J},void 0,!1,void 0,this),I0(F1,{flexDirection:"column",children:[I0(S1,{color:"gray",children:J5(U,G,q,L)},void 0,!1,void 0,this),I0(eZ,{items:O,isFocused:X,itemComponent:$5,onSelect:(z)=>{Q(z.value)}},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});import{Box as w0,Text as U0,useInput as Z5}from"ink";import m9 from"ink-text-input";import{useState as c1}from"react";import{jsxDEV as c}from"react/jsx-dev-runtime";var P2=[{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"}],w8=[{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"}],b8=[{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"}],X5=[`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"],p9=({workspaceRoot:$,sessionId:Q,onClose:Y,onSave:J})=>{let Z=a0.getTheme(),[X,K]=c1("action"),[U,G]=c1(0),[q,L]=c1(0),[O,W]=c1(0),[z,b]=c1(""),[N,A]=c1(""),[T,_]=c1(null),[k,P]=c1(!1),[w,C]=c1(null),B=P2[U],y=b8[q],f=w8[O],M=()=>{if(w){C(null);return}switch(X){case"action":Y();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}};Z5((d,F)=>{if(F.escape){M();return}if(X==="action"){if(F.upArrow)G((R)=>R>0?R-1:P2.length-1);else if(F.downArrow)G((R)=>R<P2.length-1?R+1:0);else if(F.return)H()}else if(X==="event"){if(F.upArrow)L((R)=>R>0?R-1:b8.length-1);else if(F.downArrow)L((R)=>R<b8.length-1?R+1:0);else if(F.return)K("matcher")}else if(X==="location"){if(F.upArrow)W((R)=>R>0?R-1:w8.length-1);else if(F.downArrow)W((R)=>R<w8.length-1?R+1:0);else if(F.return)K("confirm")}else if(X==="confirm"){if(F.return)p()}});let H=()=>{let d=P2[U].action;if(d==="add")K("event");else if(d==="status")S();else if(d==="list")r();else if(d==="enable")q1.getInstance().enableSession(Q,$),C("Hooks enabled for this session");else if(d==="disable")q1.getInstance().disableSession(Q,$),C("Hooks disabled for this session");else if(d==="trust")E();else if(d==="revoke")n()},S=async()=>{let d=q1.getInstance(),F=d.isEnabled($,Q),R=d.getConfig($),V=await d.getTrustStatus($),I={};for(let h of Object.values(cQ)){let Q0=R[h];if(Q0&&Array.isArray(Q0)){let e=Q0.reduce((X0,A0)=>X0+(A0.hooks?.length||0),0);if(e>0)I[h]=e}}let v=[`Status: ${F?"Enabled":"Disabled"}`,`Trust: ${V.state}`,`Digest: ${V.currentDigest??"none"}`,""];if(Object.keys(I).length>0){v.push("Configured hooks:");for(let[h,Q0]of Object.entries(I))v.push(` ${h}: ${Q0} hook(s)`)}else v.push("No hooks configured");C(v.join(`
144
+ `))},E=async()=>{try{let d=await q1.getInstance().trustProject($);C(`Trust: ${d.state}
145
+ Digest: ${d.currentDigest??"none"}`)}catch(d){_(d instanceof Error?d.message:"Failed to trust hooks")}},n=async()=>{try{let d=await q1.getInstance().revokeProjectTrust($);C(`Trust: ${d.state}`)}catch(d){_(d instanceof Error?d.message:"Failed to revoke hook trust")}},r=()=>{let F=q1.getInstance().getConfig($),R=[],V=!1;for(let I of Object.values(cQ)){let v=F[I];if(!v||!Array.isArray(v)||v.length===0)continue;V=!0,R.push(`${I}:`);for(let h of v){let Q0=h.matcher,e="all";if(Q0?.tools)e=`tools: ${Array.isArray(Q0.tools)?Q0.tools.join(", "):Q0.tools}`;R.push(` [${e}]`);for(let X0 of h.hooks||[])if(X0.type==="command")R.push(` -> ${X0.command}`)}R.push("")}if(!V)R.push("No hooks configured"),R.push(""),R.push("Configure hooks in .blade/settings.local.json");C(R.join(`
146
+ `))},o=()=>{K("command")},l=()=>{if(!N.trim()){_("Command cannot be empty");return}_(null),K("location")},p=async()=>{P(!0),_(null);try{let d=q1.getInstance(),F=await import("node:fs/promises"),R=await import("node:path"),V=await import("node:os"),I={matcher:z.trim()?{tools:z.trim()}:{},hooks:[{type:"command",command:N.trim()}]},v;switch(f.location){case"local":v=R.join($,".blade","settings.local.json");break;case"project":v=R.join($,".blade","settings.json");break;case"user":v=R.join(V.homedir(),".blade","settings.json");break}await F.mkdir(R.dirname(v),{recursive:!0});let h={};try{let A0=await F.readFile(v,"utf-8");h=JSON.parse(A0)}catch{}let Q0=h.hooks||{},e=Q0[y.event]||[],X0={...Q0,enabled:!0,[y.event]:[...e,I]};if(h.hooks=X0,await F.writeFile(v,JSON.stringify(h,null,2),"utf-8"),await d.reloadConfig($),J)J({event:y.event,matcher:z.trim(),command:N.trim()});Y()}catch(d){_(`Failed to save hook: ${d instanceof Error?d.message:"Unknown error"}`),P(!1)}};return c(w0,{flexDirection:"column",padding:1,children:[c(w0,{marginBottom:1,children:c(U0,{bold:!0,color:Z.colors.success,children:"Hooks Manager"},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(w0,{marginBottom:1,children:c(U0,{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),w&&c(w0,{flexDirection:"column",marginBottom:1,children:[c(U0,{children:w},void 0,!1,void 0,this),c(w0,{marginTop:1,children:c(U0,{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),X==="action"&&!w&&c(w0,{flexDirection:"column",children:[c(w0,{flexDirection:"column",marginTop:1,children:P2.map((d,F)=>c(w0,{children:[c(U0,{color:F===U?Z.colors.primary:void 0,bold:F===U,children:[F===U?"> ":" ",d.action]},void 0,!0,void 0,this),c(U0,{color:Z.colors.muted,children:[" - ",d.description]},void 0,!0,void 0,this)]},d.action,!0,void 0,this))},void 0,!1,void 0,this),c(w0,{marginTop:1,children:c(U0,{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),X==="event"&&c(w0,{flexDirection:"column",children:[c(U0,{bold:!0,children:"Select Event:"},void 0,!1,void 0,this),c(w0,{flexDirection:"column",marginTop:1,children:b8.map((d,F)=>c(w0,{children:[c(U0,{color:F===q?Z.colors.primary:void 0,bold:F===q,children:[F===q?"> ":" ",d.event]},void 0,!0,void 0,this),c(U0,{color:Z.colors.muted,children:[" - ",d.description]},void 0,!0,void 0,this)]},d.event,!0,void 0,this))},void 0,!1,void 0,this),c(w0,{marginTop:1,children:c(U0,{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),X!=="event"&&c(w0,{marginBottom:1,children:c(U0,{children:["Event:"," ",c(U0,{bold:!0,color:Z.colors.primary,children:y.event},void 0,!1,void 0,this),c(U0,{color:Z.colors.muted,children:[" - ",y.description]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),(X==="matcher"||X==="command"||X==="confirm")&&c(w0,{flexDirection:"column",marginBottom:1,children:[c(U0,{color:Z.colors.muted,children:"Input to command is JSON of tool call arguments."},void 0,!1,void 0,this),c(U0,{color:Z.colors.muted,children:"Exit code 0 - stdout/stderr not shown"},void 0,!1,void 0,this),c(U0,{color:Z.colors.muted,children:"Exit code 2 - show stderr to model and block tool call"},void 0,!1,void 0,this),c(U0,{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),X==="matcher"&&c(w0,{flexDirection:"column",children:[c(w0,{children:[c(U0,{bold:!0,children:"Matcher: "},void 0,!1,void 0,this),c(m9,{value:z,onChange:b,onSubmit:o,placeholder:"e.g., Read, Bash, Edit|Write (empty = all tools)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(w0,{marginTop:1,children:c(U0,{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),c(w0,{marginTop:1,children:c(U0,{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),(X==="command"||X==="confirm")&&c(w0,{marginBottom:1,children:c(U0,{children:["Matcher: ",c(U0,{bold:!0,children:z||"(all tools)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),X==="command"&&c(w0,{flexDirection:"column",children:[c(w0,{children:c(U0,{bold:!0,children:"Command: "},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(w0,{borderStyle:"single",borderColor:Z.colors.border.light,paddingX:1,marginTop:1,children:c(m9,{value:N,onChange:A,onSubmit:l,placeholder:"Enter shell command..."},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(w0,{flexDirection:"column",marginTop:1,children:[c(U0,{bold:!0,children:"Examples:"},void 0,!1,void 0,this),X5.map((d,F)=>c(U0,{color:Z.colors.muted,children:["• ",d]},F,!0,void 0,this))]},void 0,!0,void 0,this),c(w0,{marginTop:1,children:c(U0,{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),X==="location"&&c(w0,{flexDirection:"column",children:[c(w0,{flexDirection:"column",borderStyle:"round",borderColor:Z.colors.border.light,paddingX:2,paddingY:1,marginBottom:1,children:[c(U0,{bold:!0,color:Z.colors.primary,children:"Save hook configuration"},void 0,!1,void 0,this),c(U0,{children:" "},void 0,!1,void 0,this),c(U0,{children:[" ","Event: ",y.event," - ",y.description]},void 0,!0,void 0,this),c(U0,{children:[" Matcher: ",z||"(all)"]},void 0,!0,void 0,this),c(U0,{children:[" Command: ",N]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),c(U0,{bold:!0,children:"Where should this hook be saved?"},void 0,!1,void 0,this),c(w0,{flexDirection:"column",marginTop:1,children:w8.map((d,F)=>c(w0,{children:[c(U0,{color:F===O?Z.colors.primary:void 0,bold:F===O,children:[F===O?"> ":" ",F+1,". ",d.name]},void 0,!0,void 0,this),c(U0,{color:Z.colors.muted,children:[" ",d.description]},void 0,!0,void 0,this)]},d.location,!0,void 0,this))},void 0,!1,void 0,this),c(w0,{marginTop:1,children:c(U0,{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),X==="confirm"&&c(w0,{flexDirection:"column",children:[c(w0,{flexDirection:"column",borderStyle:"round",borderColor:Z.colors.success,paddingX:2,paddingY:1,children:[c(U0,{bold:!0,children:["Saving hook to ",f.description,"..."]},void 0,!0,void 0,this),c(U0,{children:" "},void 0,!1,void 0,this),c(U0,{children:["Event: ",y.event]},void 0,!0,void 0,this),c(U0,{children:["Matcher: ",z||"(all tools)"]},void 0,!0,void 0,this),c(U0,{children:["Command: ",N]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),c(w0,{marginTop:1,children:c(U0,{color:Z.colors.muted,children:k?"Saving...":"Enter to confirm · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),T&&c(w0,{marginTop:1,children:c(U0,{color:Z.colors.error,children:T},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as ZJ}from"ahooks";import{Box as P5,Text as y5}from"ink";import R5 from"react";import{useMemoizedFn as P8}from"ahooks";import y$ from"chalk";import{Text as L5,useInput as B5}from"ink";import{useEffect as QJ,useRef as y8}from"react";var A8={TIMEOUT_MS:100,RAPID_INPUT_THRESHOLD_MS:150,LARGE_INPUT_THRESHOLD:300,MEDIUM_SIZE_MULTI_CHUNK_THRESHOLD:200};var P$="\x1B",K5=`${P$}[200~`,G5=`${P$}[201~`,U5="[200~",q5="[201~",O5=[`${P$}[I`,`${P$}[O`,"[I","[O"],u9=`${P$}[?2004h`,l9=`${P$}[?2004l`,uQ=`${P$}[?1004l`,z5=[K5,U5],_5=[G5,q5];function d9(){return{pasteBuffer:null,pasteOverflowed:!1}}function c9($,Q){let Y;for(let J of Q){let Z=$.indexOf(J);if(Z===-1)continue;if(!Y||Z<Y.index||Z===Y.index&&J.length>Y.marker.length)Y={index:Z,marker:J}}return Y}function x9($){return O5.some((Q)=>$===Q)}function r9($,Q){let Y=Q,J=$.pasteBuffer,Z=$.pasteOverflowed,X=J!==null,K=[];while(Y.length>0){if(J!==null){let q=c9(Y,_5);if(!q){if(J.length+Y.length>xQ)J="",Z=!0;else if(!Z)J+=Y;Y="";break}if(J.length+q.index>xQ)Z=!0;else if(!Z)J+=Y.slice(0,q.index),K.push({kind:"paste",text:J});J=null,Z=!1,X=!0,Y=Y.slice(q.index+q.marker.length);continue}let U=c9(Y,z5);if(!U){if(x9(Y))X=!0;else K.push({kind:"text",text:Y});Y="";break}let G=Y.slice(0,U.index);if(G&&!x9(G))K.push({kind:"text",text:G});J="",Z=!1,X=!0,Y=Y.slice(U.index+U.marker.length)}if(Q.length===0&&J!==null)X=!0;return{handled:X,state:{pasteBuffer:J,pasteOverflowed:Z},segments:K}}import{execSync as n$}from"node:child_process";import{existsSync as N5,readFileSync as lQ}from"node:fs";import{basename as a9,isAbsolute as F5}from"node:path";function o9($){try{let Q=Buffer.from($,"base64");if(Q.length<4)return"image/png";if(Q[0]===137&&Q[1]===80&&Q[2]===78&&Q[3]===71)return"image/png";if(Q[0]===255&&Q[1]===216&&Q[2]===255)return"image/jpeg";if(Q[0]===71&&Q[1]===73&&Q[2]===70)return"image/gif";if(Q[0]===82&&Q[1]===73&&Q[2]===70&&Q[3]===70){if(Q.length>=12&&Q[8]===87&&Q[9]===69&&Q[10]===66&&Q[11]===80)return"image/webp"}return"image/png"}catch{return"image/png"}}function i9(){let $=process.platform,Q={darwin:"/tmp/blade_cli_latest_screenshot.png",linux:"/tmp/blade_cli_latest_screenshot.png",win32:process.env.TEMP?`${process.env.TEMP}\\blade_cli_latest_screenshot.png`:"C:\\Temp\\blade_cli_latest_screenshot.png"},Y={darwin:{checkImage:"osascript -e 'the clipboard as «class PNGf»'",saveImage:(J)=>`osascript -e 'set png_data to (the clipboard as «class PNGf»)' -e 'set fp to open for access POSIX file "${J}" 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:(J)=>`rm -f "${J}"`},linux:{checkImage:'xclip -selection clipboard -t TARGETS -o | grep -E "image/(png|jpeg|jpg|gif|webp)"',saveImage:(J)=>`xclip -selection clipboard -t image/png -o > "${J}" || wl-paste --type image/png > "${J}"`,getPath:"xclip -selection clipboard -t text/plain -o",deleteFile:(J)=>`rm -f "${J}"`},win32:{checkImage:'powershell -Command "(Get-Clipboard -Format Image) -ne $null"',saveImage:(J)=>`powershell -Command "$img = Get-Clipboard -Format Image; if ($img) { $img.Save('${J.replace(/\\/g,"\\\\")}', [System.Drawing.Imaging.ImageFormat]::Png) }"`,getPath:'powershell -Command "Get-Clipboard"',deleteFile:(J)=>`del /f "${J}"`}};return{commands:Y[$]||Y.linux,screenshotPath:Q[$]||Q.linux}}function W5(){let{commands:$}=i9();try{return n$($.getPath,{encoding:"utf-8"}).trim()}catch(Q){return console.error("Failed to get clipboard path:",Q),null}}function n9($){if($.startsWith('"')&&$.endsWith('"')||$.startsWith("'")&&$.endsWith("'"))return $.slice(1,-1);return $}function t9($){if(process.platform==="win32")return $;let Q="__DOUBLE_BACKSLASH__";return $.replace(/\\\\/g,Q).replace(/\\(.)/g,"$1").replace(new RegExp(Q,"g"),"\\")}function dQ($){let Q=n9($.trim()),Y=t9(Q);return/\.(png|jpe?g|gif|webp)$/i.test(Y)}function H5($){let Q=n9($.trim()),Y=t9(Q);if(dQ(Y))return Y;return null}async function s9($){let Q=H5($);if(!Q)return null;let Y;try{if(F5(Q))Y=lQ(Q);else{let K=W5();if(K&&Q===a9(K))Y=lQ(K);else return null}}catch(K){return console.error("Failed to read image file:",K),null}let J=Y.toString("base64"),Z=o9(J),X=a9(Q);return{path:Q,base64:J,mediaType:Z,filename:X}}async function e9(){let $=process.platform,Q={darwin:"pbpaste",linux:"xclip -selection clipboard -o || wl-paste",win32:'powershell -Command "Get-Clipboard"'},Y=Q[$]||Q.linux;try{return n$(Y,{encoding:"utf-8"})||null}catch{return null}}async function $J(){let{commands:$,screenshotPath:Q}=i9();try{if(n$($.checkImage,{stdio:"ignore"}),n$($.saveImage(Q),{stdio:"ignore"}),!N5(Q))return null;let J=lQ(Q).toString("base64"),Z=o9(J);return n$($.deleteFile(Q),{stdio:"ignore"}),{base64:J,mediaType:Z}}catch(Y){try{n$($.deleteFile(Q),{stdio:"ignore"})}catch{}return null}}import{jsxDEV as A5}from"react/jsx-dev-runtime";var w5=/\r\n/g,b5=/\r/g;function rQ($){if(!$.includes("\r"))return $;return $.replace(w5,`
147
+ `).replace(b5,`
148
+ `)}function JJ($,Q,Y){let J=Math.max(0,Math.min(Y,Q.length)),Z=Q.slice(0,J),X=Q.slice(J);return{newValue:Z+$+X,newCursorPosition:J+$.length}}function YJ({value:$,placeholder:Q="",focus:Y=!0,onChange:J,cursorPosition:Z,onChangeCursorPosition:X,onPaste:K,onImagePaste:U,disabledKeys:G=[]}){let q=y8(d9()),L=y8($),O=y8(Z),W=y8(null);QJ(()=>{L.current=$,O.current=Z},[$,Z]),QJ(()=>{if(Z>$.length)X($.length)},[$,Z,X]);let z=P8((P,w)=>{let C=L.current,B=O.current;if(L.current=P,O.current=w,P!==C)J(P);if(w!==B)X(w)}),b=P8((P)=>{if(!P)return;let{newValue:w,newCursorPosition:C}=JJ(rQ(P),L.current,O.current);z(w,C)}),N=P8(async(P)=>{let w=rQ(P);if(!w)return;if(U&&dQ(w))try{let B=await s9(w);if(B){let y=await U(B.base64,B.mediaType,B.filename);if(y?.prompt)b(y.prompt);return}}catch(B){console.error("Failed to process image path:",B)}if((w.length>A8.LARGE_INPUT_THRESHOLD||w.includes(`
149
+ `))&&K){let B=await K(w);if(B?.prompt){b(B.prompt);return}}b(w)}),A=P8((P)=>{let w=W.current;if(!w){try{let B=P();if(!B)return;let y=B.catch(()=>{return});W.current=y,y.finally(()=>{if(W.current===y)W.current=null})}catch{}return}let C=w.then(P).then(()=>{return}).catch(()=>{return});W.current=C,C.finally(()=>{if(W.current===C)W.current=null})});B5((P,w)=>{A(()=>{let C=rQ(P),B=r9(q.current,C);if(q.current=B.state,B.handled)return(async()=>{for(let E of B.segments)if(E.kind==="paste")await N(E.text);else b(E.text)})();if(G.some((E)=>w[E])||w.ctrl&&P==="c"||w.ctrl&&P==="l"||w.ctrl&&P==="t"||w.ctrl&&P==="o"||w.meta&&P==="l"||w.meta&&P==="t"||w.meta&&P==="o"||w.shift&&w.tab||C==="?"&&L.current==="")return;let f=L.current,M=O.current,H=M,S=f;if(w.leftArrow)H--;else if(w.rightArrow)H++;else if(w.backspace||w.delete){if(P===""){if(M>0)S=f.slice(0,M-1)+f.slice(M,f.length),H--}else if(M<f.length)S=f.slice(0,M)+f.slice(M+1,f.length)}else if(w.ctrl&&C==="a")H=0;else if(w.ctrl&&C==="e")H=f.length;else if(w.ctrl&&C==="k")S=f.slice(0,M);else if(w.ctrl&&C==="u")S=f.slice(M),H=0;else if(w.ctrl&&C==="w"){let n=f.slice(0,M).match(/\s*\S+\s*$/);if(n){let r=n[0].length;S=f.slice(0,M-r)+f.slice(M),H-=r}}else if(w.ctrl&&C==="v"){let E=process.platform==="darwin";return(async()=>{if(U){let r=await $J();if(r){let o=await U(r.base64,r.mediaType,"clipboard.png");if(o?.prompt)b(o.prompt);return}}if(E)return;let n=await e9();if(n)await N(n)})()}else if(w.pageUp)H=0;else if(w.pageDown)H=f.length;else if(C===`
150
+ `&&(w.shift||w.meta)){let{newValue:E,newCursorPosition:n}=JJ(C,f,M);z(E,n);return}else if(!w.ctrl&&!w.meta){if(K&&(C.length>A8.LARGE_INPUT_THRESHOLD||C.includes(`
151
+ `)))return N(C);S=f.slice(0,M)+C+f.slice(M,f.length),H+=C.length}if(H<0)H=0;if(H>S.length)H=S.length;z(S,H)})},{isActive:Y});let T=Y,_=$,k=Q?y$.grey(Q):void 0;if(T)if(k=Q.length>0?y$.inverse(Q[0])+y$.grey(Q.slice(1)):y$.inverse(" "),$.length===0)_=y$.inverse(" ");else{_="";for(let P=0;P<$.length;P++)if(P===Z&&Z<$.length)_+=y$.inverse($[P]);else _+=$[P];if(Z>=$.length)_+=y$.inverse(" ")}return A5(L5,{children:Q?$.length>0?_:k:_},void 0,!1,void 0,this)}import{jsxDEV as aQ}from"react/jsx-dev-runtime";var XJ=R5.memo(({input:$,cursorPosition:Q,onChange:Y,onChangeCursorPosition:J,onAddPasteMapping:Z,onAddImagePasteMapping:X})=>{let U=e0()==="main-input",G=$.trimStart().startsWith("!"),q=ZJ((O)=>{let W=O.split(`
152
+ `).length,z=O.length,b=500,N=10;if(z>500||W>10){let A=Z(O),T=O.slice(0,30).replace(/\n/g," "),_=`${z} chars, ${W} lines: ${T}...`;return{prompt:`${K8(A)}${_}${XQ()}`}}return{}}),L=ZJ(async(O,W,z)=>{try{let b=X(O,W);return{prompt:`${K8(b)}[Image #${b}]${XQ()}`}}catch(b){return console.error("[Image Paste] Failed to process image:",b),{prompt:`[Image paste failed: ${b instanceof Error?b.message:"Unknown error"}] `}}});return aQ(P5,{flexDirection:"row",width:"100%",paddingX:2,paddingY:0,flexShrink:0,flexGrow:0,overflow:"hidden",borderStyle:"round",borderColor:G?"yellow":"gray",children:[aQ(y5,{color:G?"yellow":"blue",bold:!0,children:G?"$ ":"> "},void 0,!1,void 0,this),aQ(YJ,{value:$,cursorPosition:Q,onChange:Y,onChangeCursorPosition:J,onPaste:q,onImagePaste:L,placeholder:" 输入命令...",focus:U,disabledKeys:["upArrow","downArrow","tab","return","escape"]},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as R8,Text as P1}from"ink";import f5,{useEffect as k5,useState as S5}from"react";import{useEffect as I5,useState as qJ}from"react";import{useEffect as M5,useState as T5}from"react";var C5=15000,KJ=["思考中","构思中","推理中","琢磨中","分析中","斟酌中","酝酿中","推敲中","揣摩中","审视中","处理中","编排中","打磨中","编织中","拼装中","调配中","组装中","搭建中","铸造中","雕琢中","搜寻中","梳理中","排查中","勘探中","钻研中","翻阅中","遍历中","扫描中","检索中","追踪中","计算中","编译中","解析中","运算中","推演中","迭代中","收敛中","演绎中","归纳中","求解中","生成中","编写中","起草中","绘制中","勾勒中","渲染中","合成中","调和中","编曲中","烹制中","施工中","酿造中","发酵中","煎熬中","折腾中","捣鼓中","鼓捣中","腾挪中","筹备中","蓄力中"],GJ=["Esc - 中止任务 / 隐藏建议 / 双击清空输入","Shift+Tab - 切换模式 (DEFAULT → AUTO_EDIT → PLAN)","Tab - 选中建议 / 切换 thinking 模式","Up/Down - 浏览建议或输入历史","? - 显示快捷键帮助(输入框为空时)","Ctrl+C - 停止任务(双击退出)","Ctrl+L - 清屏","Ctrl+T - 展开/折叠 thinking 内容","Ctrl+O - 展开/折叠历史消息","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 UJ($,Q,Y=!1){let[J,Z]=T5("");return M5(()=>{if(Q){Z("等待用户确认...");return}if(!$){Z("");return}if(Y)return;let X=()=>{if(Math.random()<0.25){let q=Math.floor(Math.random()*GJ.length);return GJ[q]}let G=Math.floor(Math.random()*KJ.length);return KJ[G]};Z(X());let K=setInterval(()=>{Z(X())},C5);return()=>{clearInterval(K)}},[$,Q,Y]),J}function OJ($,Q=!1,Y=!1){let[J,Z]=qJ(0),[X,K]=qJ(null),U=UJ($,Q,Y);return I5(()=>{if(!$){Z(0),K(null);return}if(Y)return;if(X===null)K(Date.now());let G=setInterval(()=>{if(X!==null){let q=Math.floor((Date.now()-X)/1000);Z(q)}},1000);return()=>{clearInterval(G)}},[$,X,Y]),{currentPhrase:U,elapsedTime:J}}import{jsxDEV as $1,Fragment as D5}from"react/jsx-dev-runtime";var oQ=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"],v5=80;function t$($){if($<60)return`${$}s`;let Q=Math.floor($/60),Y=$%60;return`${Q}m ${Y}s`}var zJ=f5.memo(({message:$,paused:Q=!1})=>{let Y=E$(),J=h2(),Z=C4(),X=T4(),K=I4(),U=f4(),G=k4(),q=Y||!J,[L,O]=S5(0),W=b0(),b=Q$()>=v5,{currentPhrase:N,elapsedTime:A}=OJ(q,!1,Q);if(k5(()=>{if(!q||Q){O(0);return}let B=setInterval(()=>{O((y)=>(y+1)%oQ.length)},150);return()=>clearInterval(B)},[q,Q]),!q)return null;let T=K?.mode==="bounded_foreground"?`Provider 暂时不可用,正在有界恢复 (${K.attempt}/${K.maxRetries}),剩余约 ${t$(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,_=X?X.phase==="probe"?"Provider 正在执行唯一恢复探测":`Provider 故障已隔离,等待恢复探测${X.retryAfterMs!==void 0?` (${t$(Math.max(0,Math.ceil(X.retryAfterMs/1000)))})`:""}${X.recoveryRemainingMs!==void 0?`,剩余预算 ${t$(Math.max(0,Math.ceil(X.recoveryRemainingMs/1000)))}`:""}`:null,k=Z?`等待 Provider 容量(${Z.scope},队列 ${Z.queuePosition}/${Math.max(Z.queueDepth,Z.queuePosition)},已等待 ${t$(Math.max(0,Math.ceil(Z.waitMs/1000)))})`:null,P=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,C=(G?.phase==="detected"?`检测到 ${G.toolName} 连续 ${G.runLength} 次无进展,正在要求 Agent 切换策略`:G?.phase==="halted"?`已停止 ${G.toolName} 空转循环`:null)||_||k||T||P||$||N||"正在思考中...";if(b)return $1(R8,{paddingX:2,paddingBottom:1,flexDirection:"row",gap:1,children:[$1(P1,{color:W.colors.warning,bold:!0,children:oQ[L]},void 0,!1,void 0,this),$1(P1,{color:W.colors.text.primary,children:C},void 0,!1,void 0,this),A>0&&$1(D5,{children:[$1(P1,{color:W.colors.muted,children:"|"},void 0,!1,void 0,this),$1(P1,{color:W.colors.info,children:["已用时: ",t$(A)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$1(P1,{color:W.colors.muted,children:"|"},void 0,!1,void 0,this),$1(P1,{color:W.colors.secondary,children:"Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return $1(R8,{paddingX:2,paddingBottom:1,flexDirection:"column",children:[$1(R8,{flexDirection:"row",gap:1,children:[$1(P1,{color:W.colors.warning,bold:!0,children:oQ[L]},void 0,!1,void 0,this),$1(P1,{color:W.colors.text.primary,children:C},void 0,!1,void 0,this)]},void 0,!0,void 0,this),A>0&&$1(R8,{marginLeft:2,flexDirection:"row",gap:1,children:[$1(P1,{color:W.colors.info,children:["已用时: ",t$(A)]},void 0,!0,void 0,this),$1(P1,{color:W.colors.muted,children:"|"},void 0,!1,void 0,this),$1(P1,{color:W.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 C8,Text as v0,useInput as V5,useStdout as j5}from"ink";import h5 from"ink-text-input";import E5,{useCallback as M8,useEffect as g5,useMemo as m5,useState as R$}from"react";import{jsxDEV as H0}from"react/jsx-dev-runtime";var WJ=E5.memo(({details:$,onComplete:Q})=>{let{stdout:Y}=j5(),J=Y.columns||80,Z=e0()==="confirmation-prompt",X=k0(!1),K=$.fields??[],[U,G]=R$("field"),[q,L]=R$(0),[O,W]=R$(()=>_J($)),[z,b]=R$(""),[N,A]=R$(0),[T,_]=R$([]),[k,P]=R$(),w=K[q],C=m5(()=>p5(w),[w]);g5(()=>{if(!w)return;let H=O[w.name];b(typeof H==="string"||typeof H==="number"?String(H):""),_(Array.isArray(H)?[...H]:[]);let S=C.findIndex((E)=>E.value===String(H));A(S>=0?S:0),P(void 0)},[O,w,C]);let B=M8((H)=>{if(W(H),q<K.length-1){L((S)=>S+1);return}G("review")},[q,K.length]),y=M8((H)=>{if(!w)return;let S={...O};if(H===void 0)delete S[w.name];else S[w.name]=H;B(S)},[O,w,B]),f=M8((H)=>{if(!w)return;try{y(NJ(w,H))}catch(S){P(S instanceof Error?S.message:String(S))}},[w,y]),M=M8(()=>{try{let H=FJ($,{action:"accept",content:O});Q({action:H.action,...H.content?{content:H.content}:{}})}catch(H){P(H instanceof Error?H.message:String(H))}},[O,$,Q]);if(V5((H,S)=>{if(S.ctrl&&H==="c"||S.meta&&H==="c"){X();return}if(S.escape){Q({action:"cancel"});return}if($.mode==="url"){if(H.toLowerCase()==="y")Q({action:"accept"},!0);else if(H.toLowerCase()==="n")Q({action:"decline"});return}if(U==="review"){if(H.toLowerCase()==="y"||S.return)M();else if(H.toLowerCase()==="e")L(0),G("field");else if(H.toLowerCase()==="d")Q({action:"decline"});return}if(!w){if(S.return)M();return}if(iQ(w))return;if(H.toLowerCase()==="d"){Q({action:"decline"});return}if(S.upArrow){A((E)=>E>0?E-1:Math.max(C.length-1,0));return}if(S.downArrow||S.tab){A((E)=>E<C.length-1?E+1:0);return}if(H===" "&&w.type==="multi-select"){let E=C[N];if(E)_((n)=>n.includes(E.value)?n.filter((r)=>r!==E.value):[...n,E.value]);return}if(S.return)if(w.type==="multi-select")y(T);else{let E=C[N];if(E)y(E.typedValue)}},{isActive:Z}),$.mode==="url")return H0(T8,{width:J,color:"yellow",children:[H0(v0,{bold:!0,color:"yellow",children:"MCP external authorization"},void 0,!1,void 0,this),H0(v0,{children:$.message},void 0,!1,void 0,this),H0(v0,{color:"yellow",children:['Only continue if you trust MCP server "',$.serverName,'".']},void 0,!0,void 0,this),H0(v0,{children:["Domain: ",H0(v0,{color:"cyan",children:$.domain},void 0,!1,void 0,this)]},void 0,!0,void 0,this),H0(v0,{wrap:"wrap",children:["URL: ",H0(v0,{color:"cyan",children:$.url},void 0,!1,void 0,this)]},void 0,!0,void 0,this),H0(v0,{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 H0(T8,{width:J,color:"green",children:[H0(v0,{bold:!0,color:"green",children:"Review MCP form response"},void 0,!1,void 0,this),H0(v0,{children:$.message},void 0,!1,void 0,this),K.map((H)=>H0(v0,{children:[H.title,": ",x5(O[H.name])]},H.name,!0,void 0,this)),k&&H0(v0,{color:"red",children:k},void 0,!1,void 0,this),H0(v0,{color:"gray",children:"[Y] Submit · [E] Edit · [D] Decline · Esc Cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(!w)return H0(T8,{width:J,color:"cyan",children:[H0(v0,{children:$.message},void 0,!1,void 0,this),H0(v0,{color:"gray",children:"This form has no fields."},void 0,!1,void 0,this),H0(v0,{color:"gray",children:"Press Enter to submit · [D] Decline · Esc Cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return H0(T8,{width:J,color:"cyan",children:[H0(v0,{bold:!0,color:"cyan",children:["MCP input requested by ",$.serverName]},void 0,!0,void 0,this),H0(v0,{children:$.message},void 0,!1,void 0,this),H0(C8,{flexDirection:"column",marginTop:1,children:[H0(v0,{bold:!0,children:[w.title,w.required?" *":""]},void 0,!0,void 0,this),w.description&&H0(v0,{color:"gray",children:w.description},void 0,!1,void 0,this),H0(v0,{color:"gray",children:c5(w)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),iQ(w)?H0(C8,{children:[H0(v0,{color:"cyan",children:"> "},void 0,!1,void 0,this),H0(h5,{value:z,onChange:b,onSubmit:f,focus:Z,placeholder:w.defaultValue===void 0?w.required?"Required":"Optional":String(w.defaultValue)},void 0,!1,void 0,this)]},void 0,!0,void 0,this):H0(C8,{flexDirection:"column",children:C.map((H,S)=>{let E=w.type==="multi-select"&&T.includes(H.value);return H0(v0,{color:N===S?"yellow":void 0,children:[N===S?"> ":" ",w.type==="multi-select"?E?"(*) ":"( ) ":"",H.label]},H.value,!0,void 0,this)})},void 0,!1,void 0,this),k&&H0(v0,{color:"red",children:k},void 0,!1,void 0,this),H0(v0,{color:"gray",children:[iQ(w)?"Enter to continue":w.type==="multi-select"?"Space to toggle · Enter to continue":"Up/Down to select · Enter to continue"," · [D] Decline · Esc Cancel"]},void 0,!0,void 0,this),H0(v0,{color:"gray",children:["Field ",q+1," of ",K.length]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});function T8({children:$,width:Q,color:Y}){return H0(C8,{flexDirection:"column",gap:1,borderStyle:"round",borderColor:Y,padding:1,width:Math.min(Q-4,88),children:$},void 0,!1,void 0,this)}function iQ($){return $.type==="string"||$.type==="number"||$.type==="integer"}function p5($){if(!$)return[];if($.type==="boolean")return[{value:"true",label:"Yes",typedValue:!0},{value:"false",label:"No",typedValue:!1}];return($.options??[]).map((Q)=>({...Q,typedValue:Q.value}))}function c5($){let Q=[];if($.format)Q.push(`format: ${$.format}`);if($.minimum!==void 0)Q.push(`min: ${$.minimum}`);if($.maximum!==void 0)Q.push(`max: ${$.maximum}`);if($.minLength!==void 0)Q.push(`min length: ${$.minLength}`);if($.maxLength!==void 0)Q.push(`max length: ${$.maxLength}`);if($.minItems!==void 0)Q.push(`min selections: ${$.minItems}`);if($.maxItems!==void 0)Q.push(`max selections: ${$.maxItems}`);return Q.join(" · ")}function x5($){if($===void 0)return"(omitted)";if(Array.isArray($))return $.join(", ")||"(none)";return String($)}import S8 from"ansi-escapes";import{Box as Z$,Static as YX,useStdout as ZX}from"ink";import XX,{useEffect as l1,useMemo as J4,useRef as X$,useState as Y4}from"react";import{useStdout as u5}from"ink";import{debounce as l5}from"lodash-es";import{useEffect as d5,useState as r5}from"react";function HJ($=200){let{stdout:Q}=u5(),[Y,J]=r5(Q.rows||24);return d5(()=>{let Z=l5(()=>{J(Q.rows||24)},$);return Z(),Q.on("resize",Z),()=>{Q.off("resize",Z),Z.cancel()}},[Q,$]),Y}import M$ from"chalk";import a5 from"string-width";var _0={active:!1,renderedLineCount:0,lastRenderedLines:[],terminalWidth:process.stdout.columns||80,terminalHeight:process.stdout.rows||24,prefixIndent:4,isFirstRender:!0},f8="\x1B",nQ=`${f8}[2K`,I8=($)=>$>0?`${f8}[${$}A`:"",LJ=`${f8}[?25l`,BJ=`${f8}[?25h`;function wJ($,Q){_0.active=!0,_0.renderedLineCount=0,_0.lastRenderedLines=[],_0.terminalWidth=$,_0.terminalHeight=Q,_0.isFirstRender=!0}function bJ($,Q){_0.terminalWidth=$,_0.terminalHeight=Q}function AJ($,Q,Y,J){if(!_0.active)return;let Z=8,X=Math.max(1,_0.terminalHeight-Z),K=[],U=a0.getTheme(),G=" ".repeat(_0.prefixIndent),q=M$.dim.hex(U.colors.border.light);if(Q>0)K.push(`${G}${M$.dim.hex(U.colors.text.muted)(`^ ${Q} lines above (streaming...)`)}`);let L=Y==="code",O=Y==="diff",W="",z=$;if(L&&$.length>0)W=$[0].match(/^```(\w+)?/)?.[1]||"",z=$.slice(1);else if(O&&$.length>0&&$[0]==="<<<DIFF>>>")z=$.slice(1);let b=z.slice(-X);if(L&&Q===0){let A=W?` ${M$.hex(U.colors.text.secondary)(W)}`:"";K.push(`${G}${q("╭─")}${A}`)}for(let A=0;A<b.length;A++){let T=b[A],_=G;if(A===0&&!J&&_0.isFirstRender&&!L&&!O)_=M$.bold.hex(U.colors.success)("• ")+" ",_0.isFirstRender=!1;let k=L?4:0,P=_0.terminalWidth-_0.prefixIndent-2-k,w=T;if(a5(T)>P)w=T.slice(0,P);if(L)K.push(`${G}${q("│")} ${w}`);else if(O){let C=w;if(C.startsWith("+"))K.push(`${_}${M$.green(w)}`);else if(C.startsWith("-"))K.push(`${_}${M$.red(w)}`);else if(C.startsWith("@@"))K.push(`${_}${M$.dim(w)}`);else K.push(`${_}${w}`)}else K.push(`${_}${w}`);if(A===0&&!J&&_0.isFirstRender)_0.isFirstRender=!1}let N=[];if(N.push(LJ),_0.renderedLineCount>0)N.push(I8(_0.renderedLineCount)),N.push("\r");for(let A=0;A<K.length;A++){let T=K[A],_=_0.lastRenderedLines[A];if(T!==_)N.push(nQ),N.push(T);if(A<K.length-1)N.push(`
153
+ `)}if(K.length<_0.renderedLineCount){for(let T=K.length;T<_0.renderedLineCount;T++)N.push(`
154
+ `),N.push(nQ);let A=_0.renderedLineCount-K.length;N.push(I8(A))}N.push(BJ),process.stdout.write(N.join("")),_0.renderedLineCount=K.length,_0.lastRenderedLines=K}function x1(){if(!_0.active)return;if(_0.renderedLineCount>0){let $=[];$.push(LJ),$.push(I8(_0.renderedLineCount)),$.push("\r");for(let Q=0;Q<_0.renderedLineCount;Q++)if($.push(nQ),Q<_0.renderedLineCount-1)$.push(`
155
+ `);if(_0.renderedLineCount>1)$.push(I8(_0.renderedLineCount-1)),$.push("\r");$.push(BJ),process.stdout.write($.join(""))}_0.active=!1,_0.renderedLineCount=0,_0.lastRenderedLines=[],_0.isFirstRender=!0}function v1(){return _0.active}import{Box as o5,Text as PJ}from"ink";import i5 from"react";import{jsxDEV as tQ}from"react/jsx-dev-runtime";var sQ=i5.memo(({collapsedCount:$})=>{let Q=b0();if($<=0)return null;let Y=Q.colors.text.muted;return tQ(o5,{flexDirection:"row",marginBottom:1,children:[tQ(PJ,{color:Y,children:[">"," ",$," 条历史消息"]},void 0,!0,void 0,this),tQ(PJ,{color:Y,children:" [Ctrl+O 展开]"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});sQ.displayName="CollapsedHistorySummary";import{Box as y2,Text as R2}from"ink";import n5 from"ink-big-text";import t5 from"ink-gradient";import s5 from"react";import{jsxDEV as W1}from"react/jsx-dev-runtime";var RJ=s5.memo(()=>{return W1(y2,{flexDirection:"column",paddingX:2,paddingTop:1,paddingBottom:1,children:[W1(y2,{flexDirection:"column",children:W1(t5,{name:"pastel",children:W1(n5,{text:"BLADE",font:"block"},void 0,!1,void 0,this)},void 0,!1,void 0,this)},void 0,!1,void 0,this),W1(y2,{marginBottom:1,children:W1(R2,{color:"white",dimColor:!0,children:yJ()},void 0,!1,void 0,this)},void 0,!1,void 0,this),W1(y2,{flexDirection:"column",marginBottom:1,children:[W1(y2,{marginBottom:1,children:W1(R2,{color:"white",bold:!0,children:"使用指南:"},void 0,!1,void 0,this)},void 0,!1,void 0,this),W1(R2,{color:"white",children:"1. 输入问题、编辑文件或运行命令"},void 0,!1,void 0,this),W1(R2,{color:"white",children:"2. 使用 /init 创建项目配置文件"},void 0,!1,void 0,this),W1(R2,{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 k8,Text as eQ}from"ink";import MJ from"react";import{jsxDEV as Y$}from"react/jsx-dev-runtime";var TJ=MJ.memo(({tasks:$,visible:Q=!0,compact:Y=!1})=>{let{colors:J}=b0();if(!Q||$.length===0)return null;let Z={total:$.length,completed:$.filter((X)=>X.status==="completed").length,inProgress:$.filter((X)=>X.status==="in_progress").length};return Y$(k8,{flexDirection:"column",borderStyle:"single",borderColor:J.border.light,paddingX:1,paddingY:Y?0:1,marginBottom:1,children:[Y$(k8,{marginBottom:Y?0:1,children:[Y$(eQ,{dimColor:!0,children:"Tasks "},void 0,!1,void 0,this),Y$(eQ,{color:J.text.muted,children:[Z.completed,"/",Z.total]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Y$(k8,{flexDirection:"column",children:$.map((X,K)=>Y$(e5,{task:X,compact:Y},X.id||K,!1,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}),e5=MJ.memo(({task:$,compact:Q})=>{let Y,J=!1,Z;switch($.status){case"completed":Y="[OK]",J=!0,Z=$.subject;break;case"in_progress":Y=">",J=!1,Z=$.activeForm||$.subject;break;case"pending":default:Y="-",J=!0,Z=$.subject;break}return Y$(k8,{paddingY:Q?0:0,children:Y$(eQ,{dimColor:J,children:[Y," ",Z]},void 0,!0,void 0,this)},void 0,!1,void 0,this)});import{Box as $4,Text as s$}from"ink";import $X,{useMemo as CJ}from"react";import{jsxDEV as u1}from"react/jsx-dev-runtime";function QX($,Q=60){if(!$)return"";let Y=$.split(`
156
+ `)[0]||"";if(Y.length<=Q)return Y;return`${Y.slice(0,Q)}...`}function JX($){if(!$)return 0;return $.split(`
157
+ `).length}var Q4=$X.memo(({content:$,isStreaming:Q=!1,isExpanded:Y})=>{let J=b0(),Z=CJ(()=>JX($),[$]),X=CJ(()=>QX($),[$]),K=J.colors.info,U=J.colors.muted;return u1($4,{flexDirection:"column",marginBottom:1,children:[u1($4,{flexDirection:"row",children:[u1(s$,{color:K,children:Y?"v":">"},void 0,!1,void 0,this),u1(s$,{children:" "},void 0,!1,void 0,this),u1(s$,{color:U,children:["Thinking",Q?"...":` (${Z} lines)`]},void 0,!0,void 0,this),!Y&&!Q&&X&&u1(s$,{color:U,children:[" - ",X]},void 0,!0,void 0,this),u1(s$,{color:U,dimColor:!0,children:[" ","[Ctrl+T]"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Y&&$&&u1($4,{marginLeft:2,marginTop:1,borderStyle:"round",borderColor:"gray",paddingX:1,paddingY:0,children:u1(s$,{color:U,children:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});Q4.displayName="ThinkingBlock";import{jsxDEV as i0}from"react/jsx-dev-runtime";var fJ=XX.memo(()=>{let $=A4(),Q=o4(),Y=i4(),J=n4(),Z=E$(),X=V4(),K=m4(),U=m2(),G=r4(),q=a4(),L=P4(),O=s4(),W=t4(),z=Q$(),b=HJ(),{stdout:N}=ZX(),A=n1(),[T,_]=Y4(null),[k,P]=Y4([]),[w,C]=Y4(new Set),B=X$(W),y=X$(null),f=X$(0),M=X$(0),H=X$(new Set),S=X$(new Set),E=X$([]),n=X$(null);l1(()=>{if(B.current!==W){if(v1())x1();if(N)N.write(S8.clearTerminal);A.incrementClearCount(),B.current=W}},[W,N,A]);let r=$,o=J;l1(()=>{if(!J||Z){n.current=null;return}if(n.current===J)return;if(n.current=J,v1())x1();if(N)N.write(S8.eraseScreen+S8.cursorTo(0,0));H.current=new Set,S.current=new Set(r.filter((I)=>I.role==="tool").map((I)=>I.id)),y.current=null,f.current=0,M.current=0,E.current=[],P([]),C(new Set),A.incrementClearCount(),A.clearFinalizingStreamingMessageId()},[J,Z,N,A,r]);let l=Q??J;l1(()=>{if(v1())x1();y.current=null,f.current=0,M.current=0,H.current=new Set,S.current=new Set(r.filter((I)=>I.role==="tool").map((I)=>I.id)),E.current=[],P([]),C(new Set)},[L]),l1(()=>{if(!l)return;if(y.current===l)return;y.current=l,f.current=0,M.current=0,S.current=new Set(r.filter((I)=>I.role==="tool").map((I)=>I.id)),E.current=[],P([])},[l,r]),l1(()=>{if(!l)return;let I=Z4(l);if(!I||I.length<=f.current)return;let v=I.slice(f.current);f.current=I.length;let h=v,Q0=E.current;if(Q0.length>0)if(h.some((D0)=>D0.type!=="empty"))h=[...Q0,...h],E.current=[];else{E.current=[...Q0,...h];return}let e=h.length;while(e>0&&h[e-1].type==="empty")e-=1;if(e!==h.length)E.current=h.slice(e),h=h.slice(0,e);if(h.length===0)return;let X0=M.current;M.current+=1;let A0=X0>0;if(v1())x1();C((D0)=>{if(!l||D0.has(l))return D0;let j0=new Set(D0);return j0.add(l),j0}),P((D0)=>[...D0,i0(Z$,{flexDirection:"column",children:i0(k1,{content:"",role:"assistant",terminalWidth:z,isPending:!1,hidePrefix:A0,noMargin:!0,blocksOverride:h,renderCodeBlocksAsPlainText:!1},void 0,!1,void 0,this)},`streaming-${l}-${X0}`,!1,void 0,this)])},[l,Y.version,z,L]),l1(()=>{if(!l)return;let I=S.current,v=r.filter((h)=>h.role==="tool"&&!I.has(h.id)&&!H.current.has(h.id));if(v.length===0)return;if(v1())x1();for(let h of v)H.current.add(h.id);P((h)=>[...h,...v.map((Q0)=>i0(Z$,{flexDirection:"column",children:i0(k1,{content:Q0.content,role:Q0.role,terminalWidth:z,metadata:Q0.metadata,isPending:!1,messageId:Q0.id},void 0,!1,void 0,this)},`streaming-tool-${Q0.id}`,!1,void 0,this))])},[l,r,z]),l1(()=>{if(!l){if(v1())x1();return}if(!v1())wJ(z,b);else bJ(z,b);let I=IJ(l);if(!I||I.lines.length===0)return;let h=Math.max(1,b-8),Q0=Math.max(0,I.lines.length-h),e=I.lines.slice(-h),X0=(Z4(l)?.length??0)>0;AJ(e,Q0,I.mode,X0)},[l,Y.version,b,z]),l1(()=>{if(!l&&v1())x1()},[l]),l1(()=>{if(T===null&&r.length>O){if(_(r.length),v1())x1();if(N)N.write(S8.clearTerminal);A.incrementClearCount()}},[r.length,O,T,N,A]);let p=J4(()=>{return X.some((I)=>I.status==="pending"||I.status==="in_progress")},[X]),d=W?0:T??0,F=d,R=J4(()=>{let I=[];if(I.push(i0(RJ,{},"header",!1,void 0,this)),F>0)I.push(i0(sQ,{collapsedCount:F},"collapsed-summary",!1,void 0,this));for(let v=d;v<r.length;v++){let h=r[v];if(o&&h.id===o)continue;if(h.role==="tool"&&H.current.has(h.id))continue;if(h.role==="assistant"&&w.has(h.id))continue;I.push(i0(Z$,{flexDirection:"column",children:i0(k1,{content:h.content,role:h.role,terminalWidth:z,metadata:h.metadata,isPending:!1,messageId:h.id},void 0,!1,void 0,this)},h.id,!1,void 0,this))}return I},[r,d,F,z,o,w]),V=J4(()=>k.length>0?[...R,...k]:R,[R,k]);return i0(Z$,{flexDirection:"column",paddingX:2,children:i0(Z$,{flexDirection:"column",children:[i0(YX,{items:V,children:(I)=>I},L,!1,void 0,this),G&&i0(Z$,{marginBottom:1,children:i0(Q4,{content:G,isStreaming:Z,isExpanded:q},void 0,!1,void 0,this)},void 0,!1,void 0,this),K&&p&&i0(Z$,{marginTop:1,children:i0(TJ,{tasks:X,visible:!0,compact:!1},void 0,!1,void 0,this)},void 0,!1,void 0,this),U.map((I,v)=>i0(Z$,{flexDirection:"column",children:i0(k1,{content:I.displayText,role:"user",terminalWidth:z},void 0,!1,void 0,this)},`pending-${v}`,!1,void 0,this))]},void 0,!0,void 0,this)},void 0,!1,void 0,this)});import{useMemoizedFn as v8,useMount as KX}from"ahooks";import{Box as H1,Text as L0,useFocus as GX,useFocusManager as UX,useInput as qX}from"ink";import OX from"ink-select-input";import{memo as zX,useMemo as _X,useState as D8}from"react";import{jsxDEV as Y0,Fragment as WX}from"react/jsx-dev-runtime";var NX=({isSelected:$})=>Y0(H1,{marginRight:1,children:Y0(L0,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),FX=({isSelected:$,label:Q})=>Y0(L0,{bold:$,color:$?"yellow":void 0,children:Q},void 0,!1,void 0,this),kJ=zX(({onClose:$,onEdit:Q})=>{let Y=p4(),J=g2()??"",{isFocused:Z}=GX({id:"model-selector"}),X=UX(),[K,U]=D8(""),[G,q]=D8(!1),[L,O]=D8(null),W=k0(!1),[z]=D8(()=>{let B=process.stdout?.columns||80;return Math.max(20,B-8)});KX(()=>{if(X?.focus("model-selector"),Y.length>0)U(Y[0].id)}),qX((B,y)=>{if(G)return;if(y.ctrl&&B==="c"||y.meta&&B==="c"){W();return}if(y.escape){$();return}if(!Z)return;if(B==="d"||B==="D"){N();return}if((B==="e"||B==="E")&&Q)A()},{isActive:!0});let b=v8(async(B)=>{if(G)return;let y=B.value;if(y===J){$();return}q(!0),O(null);try{await m0().setCurrentModel(y),$()}catch(f){O(f.message),q(!1)}}),N=v8(async()=>{if(G||K===J)return;q(!0),O(null);try{if(await m0().removeModel(K),Y.length<=1)$()}catch(B){O(B.message)}finally{q(!1)}}),A=v8(()=>{if(G||!Q)return;let B=Y.find((y)=>y.id===K);if(!B)return;Q(B)}),T=v8((B)=>{U(B.value)}),_=_X(()=>{return Y.find((B)=>B.id===K)},[Y,K]),k=_?V8()?.modelProviders[_.provider]:void 0,P=Y.map((B)=>{let y=B.id===J?" (当前)":"";return{label:X4(B)+y,value:B.id}}),w=K===J;return Y0(H1,{flexDirection:"column",borderStyle:"round",borderColor:"gray",padding:1,width:"100%",children:[Y0(H1,{flexDirection:"row",justifyContent:"space-between",marginBottom:1,children:[Y0(L0,{bold:!0,color:"cyan",children:"模型管理"},void 0,!1,void 0,this),Y0(L0,{dimColor:!0,children:[G?"处理中...":w?"Enter=关闭 • E=编辑 • Esc=取消":"Enter=切换 • D=删除 • E=编辑 • Esc=取消"," • Ctrl+C=退出"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Y0(H1,{flexDirection:"row",children:[Y0(H1,{flexDirection:"column",flexGrow:2,marginRight:2,borderStyle:"single",borderColor:"gray",padding:1,children:[Y0(L0,{dimColor:!0,children:["已配置模型 (",Y.length,")"]},void 0,!0,void 0,this),Y0(H1,{marginTop:1,children:Y0(OX,{items:P,onSelect:b,onHighlight:T,indicatorComponent:NX,itemComponent:FX},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Y0(H1,{flexDirection:"column",flexGrow:3,borderStyle:"single",borderColor:"gray",padding:1,children:[Y0(L0,{dimColor:!0,children:"模型详情"},void 0,!1,void 0,this),Y0(H1,{marginY:1,children:Y0(L0,{color:w?"green":"yellow",children:w?"* 当前使用":"* 可切换"},void 0,!1,void 0,this)},void 0,!1,void 0,this),_?Y0(H1,{flexDirection:"column",children:[Y0(L0,{children:[Y0(L0,{dimColor:!0,children:"名称: "},void 0,!1,void 0,this),Y0(L0,{bold:!0,color:"cyan",children:X4(_)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Y0(L0,{children:[Y0(L0,{dimColor:!0,children:"Provider: "},void 0,!1,void 0,this),Y0(L0,{bold:!0,children:k?.name??_.provider},void 0,!1,void 0,this)]},void 0,!0,void 0,this),k&&Y0(WX,{children:[Y0(L0,{children:[Y0(L0,{dimColor:!0,children:"Channel ID: "},void 0,!1,void 0,this),Y0(L0,{children:_.provider},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Y0(L0,{children:[Y0(L0,{dimColor:!0,children:"Wire API: "},void 0,!1,void 0,this),Y0(L0,{children:k.wireApi},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Y0(L0,{children:[Y0(L0,{dimColor:!0,children:"Endpoint: "},void 0,!1,void 0,this),Y0(L0,{color:"blueBright",children:k.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Y0(L0,{children:[Y0(L0,{dimColor:!0,children:"Model: "},void 0,!1,void 0,this),Y0(L0,{bold:!0,children:_.model},void 0,!1,void 0,this)]},void 0,!0,void 0,this),_.overrides?.baseUrl&&Y0(L0,{children:[Y0(L0,{dimColor:!0,children:"Base URL override: "},void 0,!1,void 0,this),Y0(L0,{color:"blueBright",children:_.overrides.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Y0(L0,{children:[Y0(L0,{dimColor:!0,children:"Context Window: "},void 0,!1,void 0,this),Y0(L0,{children:E1().resolveConfig(_).contextWindow},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this):Y0(L0,{dimColor:!0,children:"请选择一个模型查看详情"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),L&&Y0(H1,{marginTop:1,children:Y0(L0,{color:"red",children:L},void 0,!1,void 0,this)},void 0,!1,void 0,this),Y0(H1,{justifyContent:"center",marginTop:1,children:Y0(L0,{dimColor:!0,children:"─".repeat(z)},void 0,!1,void 0,this)},void 0,!1,void 0,this),Y0(H1,{justifyContent:"center",children:Y0(L0,{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 K4}from"ahooks";import{Box as hX,Text as G4,useInput as EX}from"ink";import{useState as I$}from"react";import{Box as T$,Text as d1,useInput as HX}from"ink";import LX from"ink-text-input";import{jsxDEV as n0}from"react/jsx-dev-runtime";var SJ=({provider:$,value:Q,onChange:Y,onSubmit:J,onCancel:Z,error:X})=>{return HX((K,U)=>{if(U.escape)Z()}),n0(T$,{flexDirection:"column",children:[n0(T$,{marginBottom:1,children:n0(d1,{bold:!0,color:"blue",children:"Step 2: 输入 API Key"},void 0,!1,void 0,this)},void 0,!1,void 0,this),n0(T$,{marginBottom:1,children:n0(d1,{children:["Provider: ",n0(d1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),n0(T$,{marginBottom:1,children:n0(d1,{dimColor:!0,children:"API 密钥将存储在 ~/.blade/auth.json(权限 600),不会写入模型配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),n0(T$,{children:[n0(d1,{bold:!0,color:"cyan",children:[">"," "]},void 0,!0,void 0,this),n0(LX,{value:Q,onChange:Y,onSubmit:J,placeholder:"sk-...",mask:"*"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X&&n0(T$,{marginTop:1,children:n0(d1,{color:"red",children:X},void 0,!1,void 0,this)},void 0,!1,void 0,this),n0(T$,{marginTop:1,children:n0(d1,{dimColor:!0,children:["输入完成后按 ",n0(d1,{bold:!0,children:"Enter"},void 0,!1,void 0,this),",",n0(d1,{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 j8,Text as K$,useInput as BX}from"ink";import wX from"ink-text-input";import{useState as h8}from"react";import{jsxDEV as z1}from"react/jsx-dev-runtime";var E8=["id","name","baseUrl","model"];function vJ($){switch($){case"id":return"Channel ID";case"name":return"Channel name";case"baseUrl":return"Base URL";case"model":return"Model ID"}}function bX($,Q,Y){switch($){case"id":return"team-gateway";case"name":return Y||"Team Gateway";case"baseUrl":return Q==="anthropic-messages"?"https://gateway.example.com":"https://gateway.example.com/v1";case"model":return Q==="anthropic-messages"?"claude-opus-4-8":"vendor-model-2026"}}function AX($,Q){let Y=$.id.trim(),J={name:$.name.trim()||Y,baseUrl:$.baseUrl.trim(),wireApi:Q},Z=VJ(Y,J);if(!$.model.trim())Z.push("Model ID must not be empty");if(Z.length>0)throw Error(Z[0]);return{provider:Y,model:$.model.trim(),displayName:$.model.trim(),modelProvider:J}}var jJ=({wireApi:$,initialConfig:Q,onSubmit:Y,onCancel:J})=>{let Z={id:Q?.provider??"",name:Q?.modelProvider?.name??"",baseUrl:Q?.modelProvider?.baseUrl??"",model:Q?.model??""},[X,K]=h8(Q?3:0),[U,G]=h8(Q?.model??""),[q,L]=h8(Z),[O,W]=h8(),z=E8[X];BX((N,A)=>{if(!A.escape)return;if(W(void 0),X===0){J();return}let T=X-1,_=E8[T];K(T),G(q[_])});let b=(N)=>{let A=N.trim();if(z==="id"&&!DJ.test(A)){W("Channel ID 必须以小写字母开头,且仅包含小写字母、数字、.、_ 或 -");return}if(z==="baseUrl")try{let _=new URL(A);if(!["http:","https:"].includes(_.protocol))throw Error()}catch{W("Base URL 必须是绝对 HTTP(S) URL");return}if(z==="model"&&!A){W("Model ID 不能为空");return}let T={...q,[z]:z==="name"&&!A?q.id:A};if(L(T),W(void 0),X===E8.length-1){try{Y(AX(T,$))}catch(_){W(_ instanceof Error?_.message:"渠道配置无效")}return}K(X+1),G("")};return z1(j8,{flexDirection:"column",children:[z1(j8,{marginBottom:1,children:z1(K$,{bold:!0,color:"blue",children:"配置自定义 Provider 渠道"},void 0,!1,void 0,this)},void 0,!1,void 0,this),z1(K$,{dimColor:!0,children:["Protocol:"," ",$==="anthropic-messages"?"Anthropic Messages":"OpenAI Chat Completions"]},void 0,!0,void 0,this),E8.slice(0,X).map((N)=>z1(K$,{children:[vJ(N),": ",z1(K$,{color:"cyan",children:q[N]},void 0,!1,void 0,this)]},N,!0,void 0,this)),z1(j8,{marginTop:1,children:[z1(K$,{bold:!0,children:[vJ(z),": "]},void 0,!0,void 0,this),z1(wX,{value:U,onChange:(N)=>{G(N),W(void 0)},onSubmit:b,placeholder:bX(z,$,q.id)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z==="name"&&z1(K$,{dimColor:!0,children:"留空使用 Channel ID"},void 0,!1,void 0,this),O&&z1(K$,{color:"red",children:O},void 0,!1,void 0,this),z1(j8,{marginTop:1,children:z1(K$,{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 gJ,useState as e$}from"react";var mJ=()=>{let[$,Q]=e$([]),[Y,J]=e$(!0),[Z,X]=e$(null);return gJ(()=>{(async()=>{try{Q(await hJ())}catch(U){X(U instanceof Error?U.message:"加载 Provider 列表失败")}finally{J(!1)}})()},[]),{providers:$,isLoading:Y,error:Z}},pJ=($)=>{let[Q,Y]=e$([]),[J,Z]=e$(!1),[X,K]=e$(null);return gJ(()=>{if(!$){Y([]);return}(async()=>{Z(!0),K(null);try{Y(await EJ($))}catch(G){K(G instanceof Error?G.message:"加载模型列表失败")}finally{Z(!1)}})()},[$]),{models:Q,isLoading:J,error:X}};import{Box as r1,Text as y1,useInput as PX}from"ink";import yX from"ink-select-input";import RX from"ink-text-input";import{useMemo as cJ,useState as MX}from"react";import{jsxDEV as g0,Fragment as fX}from"react/jsx-dev-runtime";var TX=({isSelected:$})=>g0(r1,{marginRight:1,children:g0(y1,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),CX=($)=>{let Q=[$.name];if($.contextWindow){let Y=$.contextWindow>=1e6?`${($.contextWindow/1e6).toFixed(1)}M`:$.contextWindow>=1000?`${Math.round($.contextWindow/1000)}K`:`${$.contextWindow}`;Q.push(`[${Y} ctx]`)}if($.reasoning)Q.push("[reasoning]");if($.input.includes("image"))Q.push("[vision]");if($.cost.input||$.cost.output)Q.push(`[$${$.cost.input}/$${$.cost.output}]`);return Q.join(" ")},IX=({isSelected:$,label:Q})=>g0(y1,{bold:$,color:$?"yellow":void 0,children:Q},void 0,!1,void 0,this),xJ=({provider:$,models:Q,isLoading:Y,error:J,onSelect:Z,onCancel:X})=>{let[K,U]=MX("");PX((L,O)=>{if(O.escape)if(K)U("");else X()});let G=cJ(()=>{if(!K)return Q;let L=K.toLowerCase();return Q.filter((O)=>O.name.toLowerCase().includes(L)||O.id.toLowerCase().includes(L))},[Q,K]),q=cJ(()=>G.map((L)=>({key:L.id,label:CX(L),value:L})),[G]);if(Y)return g0(r1,{flexDirection:"column",children:g0(y1,{color:"yellow",children:["正在加载 ",$.name," 模型列表..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this);if(J)return g0(r1,{flexDirection:"column",children:[g0(y1,{color:"red",children:J},void 0,!1,void 0,this),g0(y1,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return g0(r1,{flexDirection:"column",children:[g0(r1,{marginBottom:1,children:g0(y1,{bold:!0,color:"blue",children:"Step 3: 选择模型"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g0(r1,{marginBottom:1,children:g0(y1,{children:["Provider: ",g0(y1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),g0(fX,{children:[g0(r1,{marginBottom:1,children:[g0(y1,{color:"cyan",children:"> "},void 0,!1,void 0,this),g0(RX,{value:K,onChange:U,placeholder:`搜索 ${Q.length} 个模型...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g0(r1,{marginBottom:1,children:g0(y1,{dimColor:!0,children:"模型元数据来自内置 catalog"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g0(r1,{flexDirection:"column",height:12,children:g0(yX,{items:q,onSelect:(L)=>Z(L.value),indicatorComponent:TX,itemComponent:IX,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),G.length===0&&g0(y1,{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 C$,Text as G$,useInput as kX}from"ink";import SX from"ink-select-input";import vX from"ink-text-input";import{useMemo as uJ,useState as DX}from"react";import{jsxDEV as t0}from"react/jsx-dev-runtime";var VX=({isSelected:$})=>t0(C$,{marginRight:1,children:t0(G$,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),jX=({isSelected:$,label:Q})=>t0(G$,{bold:$,color:$?"yellow":void 0,children:Q},void 0,!1,void 0,this),lJ=({providers:$,isLoading:Q,error:Y,onSelect:J,onCancel:Z})=>{let[X,K]=DX("");kX((q,L)=>{if(L.escape)if(X)K("");else Z()});let U=uJ(()=>{if(!X)return $;let q=X.toLowerCase();return $.filter((L)=>L.name.toLowerCase().includes(q)||L.id.toLowerCase().includes(q))},[$,X]),G=uJ(()=>U.map((q)=>({key:q.id,label:`${q.name} - ${q.modelCount} models${q.configured?" [configured]":""}`,value:q})),[U]);if(Q)return t0(C$,{flexDirection:"column",children:t0(G$,{color:"yellow",children:"正在加载 Provider 列表..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Y)return t0(C$,{flexDirection:"column",children:[t0(G$,{color:"red",children:Y},void 0,!1,void 0,this),t0(G$,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return t0(C$,{flexDirection:"column",children:[t0(C$,{marginBottom:1,children:t0(G$,{bold:!0,color:"blue",children:"Step 1: 选择 API 提供商"},void 0,!1,void 0,this)},void 0,!1,void 0,this),t0(C$,{marginBottom:1,children:[t0(G$,{color:"cyan",children:"> "},void 0,!1,void 0,this),t0(vX,{value:X,onChange:K,placeholder:`搜索 ${$.length} 个 Provider...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),t0(C$,{flexDirection:"column",height:12,children:t0(SX,{items:G,onSelect:(q)=>J(q.value),indicatorComponent:VX,itemComponent:jX,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),U.length===0&&t0(G$,{color:"yellow",children:"未找到匹配的 Provider,按 Esc 清除搜索"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};function dJ($){if($==="custom")return"provider";if($==="model")return"provider";if($==="credential")return"model";return}import{jsxDEV as U$}from"react/jsx-dev-runtime";var U4=({mode:$,initialConfig:Q,modelId:Y,onComplete:J,onCancel:Z})=>{let[X,K]=I$("provider"),[U,G]=I$(),[q,L]=I$(),[O,W]=I$(),[z,b]=I$(""),[N,A]=I$(),[T,_]=I$(!1),k=mJ(),P=pJ(U?.id),w=k0(!1);EX((f,M)=>{if(M.ctrl&&f==="c"||M.meta&&f==="c")$==="setup"?w():Z()});let C=K4(async(f)=>{if(!U)return;let M=O??(q?{provider:U.id,model:q.id,displayName:Q?.displayName}:void 0);if(!M)return;_(!0),A(void 0);try{if(M.modelProvider)E1().registerModelProvider(M.provider,M.modelProvider,[M.model]);if(f?.trim())await E1().setApiKey(M.provider,f.trim());let H={displayName:M.displayName,provider:M.provider,model:M.model,overrides:M.overrides};if($==="setup")await J(M);else if($==="add"){let S=M.modelProvider?await m0().addModelWithProvider(H,M.modelProvider):await m0().addModel(H);await m0().setCurrentModel(S.id),await J(M)}else if(Y){if(M.modelProvider)await m0().updateModelWithProvider(Y,H,M.modelProvider);else await m0().updateModel(Y,H);await J(M)}}catch(H){if(M.modelProvider){await E1().credentials.delete(M.provider);let S=V8();E1().configureModelProviders(S?.modelProviders??{},S?.models??[])}A(H instanceof Error?H.message:"保存配置失败"),_(!1)}}),B=K4((f)=>{if(L(f),U?.configured)C();else if(U?.supportsApiKey)K("credential");else A(`${U?.name??"Provider"} 需要 OAuth 或环境凭证,请先在外部完成认证`)}),y=K4(()=>{if(A(void 0),X==="credential"&&O){K("custom");return}let f=dJ(X);if(f)K(f)});return U$(hX,{flexDirection:"column",padding:1,children:[U$(G4,{bold:!0,color:"blue",children:$==="edit"?"编辑模型":"添加模型"},void 0,!1,void 0,this),X==="provider"&&U$(lJ,{...k,onSelect:(f)=>{G(f),L(void 0),W(void 0),K(f.factoryWireApi?"custom":"model")},onCancel:$==="setup"?()=>{return}:Z},void 0,!1,void 0,this),X==="custom"&&U?.factoryWireApi&&U$(jJ,{wireApi:U.factoryWireApi,initialConfig:O,onSubmit:(f)=>{W(f),K("credential")},onCancel:y},void 0,!1,void 0,this),X==="model"&&U&&U$(xJ,{provider:U,...P,onSelect:B,onCancel:y},void 0,!1,void 0,this),X==="credential"&&U&&U$(SJ,{provider:U,value:z,onChange:b,onSubmit:()=>void C(z),onCancel:y,error:N},void 0,!1,void 0,this),T&&U$(G4,{color:"yellow",children:"正在保存配置..."},void 0,!1,void 0,this),N&&X!=="credential"&&U$(G4,{color:"red",children:N},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as M2}from"ahooks";import{promises as iJ}from"fs";import{Box as _1,Text as V0,useInput as gX}from"ink";import rJ from"ink-select-input";import mX from"ink-text-input";import pX from"os";import g8 from"path";import{useEffect as cX,useMemo as m8,useRef as xX,useState as q$}from"react";import{jsxDEV as q0}from"react/jsx-dev-runtime";var T2=[{key:"allow",label:"Allow"},{key:"ask",label:"Ask"},{key:"deny",label:"Deny"},{key:"info",label:"Info"}],uX={allow:"Add a new rule...",ask:"Add a new rule...",deny:"Add a new rule..."},lX={allow:"Allow permission rules",ask:"Ask permission rules",deny:"Deny permission rules"},aJ={project:"[项目共享配置]",global:"[用户全局配置]",local:"[本地配置]"},dX=["project","global","local"],rX={allow:[],ask:[],deny:[]},aX={localExists:!1,projectExists:!1,globalExists:!1},oJ={allow:[],ask:[],deny:[]};function oX($){let Q=(J)=>Array.isArray(J)?J.filter((Z)=>typeof Z==="string"):[],Y=$?.permissions??{};return{allow:Q(Y?.allow),ask:Q(Y?.ask),deny:Q(Y?.deny)}}async function iX($){try{let Q=await iJ.readFile($,"utf-8"),Y=JSON.parse(Q);return{exists:!0,raw:Y,permissions:oX(Y)}}catch(Q){if(Q.code==="ENOENT")return{exists:!1,raw:{},permissions:{...oJ}};return console.warn(`[PermissionsManager] Failed to read ${$}:`,Q),{exists:!0,raw:{},permissions:{...oJ}}}}function nX($,Q){let Y=$.padEnd(32," "),J=Q==="local"?`${aJ[Q]} <- 可删除`:aJ[Q];return`${Y} ${J}`}var nJ=({onClose:$})=>{let Y=e0()==="permissions-manager",J=k0(!1),[Z,X]=q$(0),K=T2[Z].key,[U,G]=q$(rX),[q,L]=q$(aX),[O,W]=q$(!0),[z,b]=q$("list"),[N,A]=q$(""),[T,_]=q$(null),[k,P]=q$(null),w=xX(!1),C=m8(()=>g8.join(d0(),".blade","settings.local.json"),[]),B=m8(()=>g8.join(d0(),".blade","settings.json"),[]),y=m8(()=>g8.join(pX.homedir(),".blade","settings.json"),[]),f=M2(async()=>{W(!0);let I=await Promise.all([{source:"local",path:C},{source:"project",path:B},{source:"global",path:y}].map(async({source:e,path:X0})=>{let A0=await iX(X0);return{source:e,path:X0,...A0}})),v={localExists:I.find((e)=>e.source==="local")?.exists??!1,projectExists:I.find((e)=>e.source==="project")?.exists??!1,globalExists:I.find((e)=>e.source==="global")?.exists??!1};L(v);let h={allow:[],ask:[],deny:[]},Q0=Object.fromEntries(I.map((e)=>[e.source,e]));["allow","ask","deny"].forEach((e)=>{dX.forEach((X0)=>{(Q0[X0]?.permissions[e]??[]).forEach((D0,j0)=>{let W$={key:`${X0}:${j0}:${D0}`,rule:D0,source:X0};h[e].push(W$)})})}),G(h),W(!1)});cX(()=>{f()},[f]);let M=M2(async(V,I)=>{try{let v=g8.join(d0(),".blade","settings.local.json"),h={allow:[],ask:[],deny:[]};try{let e=await iJ.readFile(v,"utf-8"),A0=JSON.parse(e).permissions||{};h={allow:Array.isArray(A0.allow)?A0.allow:[],ask:Array.isArray(A0.ask)?A0.ask:[],deny:Array.isArray(A0.deny)?A0.deny:[]}}catch(e){}let Q0=I(h);await m0().updateConfig({permissions:Q0},{scope:"local",immediate:!0}),await f()}catch(v){throw console.error("[PermissionsManager] 修改权限规则失败:",v),v}});gX((V,I)=>{if(I.ctrl&&V==="c"||I.meta&&V==="c"){J();return}if(z==="locked"){if(w.current){w.current=!1;return}b("list"),_(null),P(null);return}if(I.escape){if(z==="list"||K==="info")$();else b("list"),A(""),_(null),P(null);return}if(z==="list"){if(I.tab&&I.shift)X((v)=>(v-1+T2.length)%T2.length);else if(I.tab)X((v)=>(v+1)%T2.length);else if(V?.toLowerCase()==="q")$()}},{isActive:Y});let H=M2((V)=>{let I=V.value;if(K==="info")return;if(I.type==="add"){b("add"),A(""),P(null);return}if(I.entry.source!=="local"){b("locked"),w.current=!0,_({tab:K,entry:I.entry}),P({type:"error",text:I.entry.source==="project"?"此规则定义在项目共享配置中,无法在此删除。":"此规则来自用户全局配置,无法在此删除。"});return}b("confirm-delete"),_({tab:K,entry:I.entry}),P(null)}),S=M2(async()=>{if(K==="info")return;let V=N.trim();if(!V){P({type:"error",text:"Permission rule 不能为空"});return}if(U[K].map((v)=>v.rule).includes(V)){P({type:"error",text:"该规则已存在"});return}try{await M(K,(v)=>{let h={allow:[...v.allow],ask:[...v.ask],deny:[...v.deny]};return h[K]=[...new Set([...v[K],V])],h}),b("list"),A(""),P({type:"success",text:"已添加本地权限规则"})}catch(v){P({type:"error",text:`保存失败: ${v instanceof Error?v.message:"未知错误"}`})}}),E=M2(async()=>{if(!T)return;let{tab:V,entry:I}=T;try{await M(V,(v)=>{let h={allow:[...v.allow],ask:[...v.ask],deny:[...v.deny]};return h[V]=v[V].filter((Q0)=>Q0!==I.rule),h}),b("list"),_(null),P({type:"success",text:"已删除本地权限规则"})}catch(v){P({type:"error",text:`删除失败: ${v instanceof Error?v.message:"未知错误"}`})}}),n=m8(()=>{if(K==="info")return[];let V=K;return[{key:"add-new-rule",label:`› ${uX[V]}`,value:{type:"add"}},...U[V].map((v)=>({key:v.key,label:nX(v.rule,v.source),value:{type:"rule",entry:v}}))]},[K,U]),r=()=>q0(_1,{marginBottom:1,children:T2.map((V,I)=>q0(_1,{marginRight:2,children:q0(V0,{color:I===Z?"yellow":"gray",children:["[",V.label,"]"]},void 0,!0,void 0,this)},V.key,!1,void 0,this))},void 0,!1,void 0,this),o=()=>q0(_1,{flexDirection:"column",gap:1,children:[q0(V0,{children:"配置文件优先级(从高到低):"},void 0,!1,void 0,this),q0(_1,{flexDirection:"column",marginLeft:2,children:[q0(V0,{children:["1. .blade/settings.local.json (本地配置,不提交 Git)"," ",q.localExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),q0(V0,{children:["2. .blade/settings.json (项目配置,提交 Git)"," ",q.projectExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),q0(V0,{children:["3. ~/.blade/settings.json (用户全局配置)"," ",q.globalExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),q0(V0,{children:"说明:"},void 0,!1,void 0,this),q0(_1,{flexDirection:"column",marginLeft:2,children:[q0(V0,{children:"- /permissions 命令只管理本地配置 (.blade/settings.local.json)"},void 0,!1,void 0,this),q0(V0,{children:"- 修改全局或项目配置请直接编辑对应文件"},void 0,!1,void 0,this),q0(V0,{children:"- 本地配置不会提交到 Git"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),l=(V)=>q0(_1,{flexDirection:"column",gap:1,children:[q0(V0,{bold:!0,children:lX[V]},void 0,!1,void 0,this),q0(V0,{children:"Permission rules are a tool name, optionally followed by a specifier in parentheses."},void 0,!1,void 0,this),q0(V0,{color:"gray",children:"例如: WebFetch 或 Bash(ls:*)"},void 0,!1,void 0,this),q0(_1,{marginTop:1,children:q0(mX,{value:N,onChange:A,onSubmit:S},void 0,!1,void 0,this)},void 0,!1,void 0,this),q0(V0,{color:"gray",children:"Enter 提交 · Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),p=(V,I)=>q0(_1,{flexDirection:"column",gap:1,children:[q0(V0,{bold:!0,children:["Delete ",V," permission rule?"]},void 0,!0,void 0,this),q0(V0,{children:I.rule},void 0,!1,void 0,this),q0(V0,{color:"gray",children:"From project local settings"},void 0,!1,void 0,this),q0(V0,{children:"Are you sure you want to delete this permission rule?"},void 0,!1,void 0,this),q0(rJ,{items:[{label:"Yes",value:"yes"},{label:"No",value:"no"}],onSelect:(v)=>{if(v.value==="yes")E();else b("list"),_(null)}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),d=(V)=>q0(_1,{flexDirection:"column",gap:1,children:[q0(V0,{bold:!0,children:"Cannot delete this rule"},void 0,!1,void 0,this),q0(V0,{children:V.rule},void 0,!1,void 0,this),q0(V0,{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),q0(V0,{color:"gray",children:"按任意键继续"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),F=(V)=>q0(rJ,{items:n,isFocused:z==="list",onSelect:H},void 0,!1,void 0,this),R=()=>{if(O)return q0(V0,{children:"加载中..."},void 0,!1,void 0,this);if(K==="info")return o();if(z==="add")return l(K);if(z==="confirm-delete"&&T)return p(T.tab,T.entry);if(z==="locked"&&T)return d(T.entry);return F(K)};return q0(_1,{flexDirection:"column",borderStyle:"round",borderColor:Y?"cyan":"gray",padding:1,width:80,children:[q0(V0,{color:"cyan",bold:!0,children:"权限管理器"},void 0,!1,void 0,this),r(),q0(_1,{flexDirection:"column",gap:1,children:R()},void 0,!1,void 0,this),k&&q0(_1,{marginTop:1,children:q0(V0,{color:k.type==="success"?"green":"red",children:k.text},void 0,!1,void 0,this)},void 0,!1,void 0,this),q0(_1,{marginTop:1,children:q0(V0,{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 P0,Text as K0,useInput as tX}from"ink";import{useEffect as sX,useState as f$}from"react";import{jsxDEV as x}from"react/jsx-dev-runtime";var q4=["local","project","global"];function YY({workspaceRoot:$,onCancel:Q}){let Y=sJ($),J=Y.getAll(),[Z,X]=f$(0),[K,U]=f$(!1),[G,q]=f$(""),[L,O]=f$(null),[W,z]=f$("local"),[b,N]=f$(null),[A,T]=f$(0),_=Y.getBySource(),k=Y.getStats(),P=Y.getSourcePolicy(),w=k0(!1,Q);sX(()=>{let H=!0;return tJ.getInstance().loadWorkspacePluginSettingsResolution(Y.getWorkspaceRoot()).then((S)=>{if(H)N(S.settings)}).catch((S)=>{if(H)q(S instanceof Error?S.message:"无法读取插件作用域配置")}),()=>{H=!1}},[Y,A]);let C=()=>{z((H)=>{let S=q4.indexOf(H);return q4[(S+1)%q4.length]}),O(null)},B=async()=>{let H=J[Z];if(!H||K)return;if(H.source==="cli"){q(`${H.manifest.name} 由 --plugin-dir 管理,不能持久化切换`);return}if(H.status==="error"){q(H.error??`${H.manifest.name} 当前不可用`);return}U(!0),q("");try{let S=await eJ(Y.getWorkspaceRoot(),H.manifest.name,H.status!=="active",W);q(S.effectiveEnabled?`已启用 ${H.manifest.name} · 生效层级 ${S.effectiveScope}`:`已禁用 ${H.manifest.name} · 生效层级 ${S.effectiveScope}`),T((E)=>E+1)}catch(S){q(S instanceof Error?S.message:String(S))}finally{U(!1)}},y=async()=>{if(K)return;U(!0),q("");try{await $Y(Y.getWorkspaceRoot()),X(0),q("插件列表已刷新"),T((H)=>H+1)}catch(H){q(H instanceof Error?H.message:String(H))}finally{U(!1)}},f=async()=>{let H=J[Z];if(!H||K)return;if(!H.installation){q(`${H.manifest.name} 不是 Blade 受管安装,不能自动更新`);return}U(!0),O(null),q("");try{let{result:S}=await QY(Y.getWorkspaceRoot(),H.manifest.name,{trusted:!0});if(!S.success)throw Error(S.error);q(S.changed?`已更新 ${H.manifest.name} 到 ${S.installation?.revision}`:`${H.manifest.name} 已是最新版本`),T((E)=>E+1)}catch(S){q(S instanceof Error?S.message:String(S))}finally{U(!1)}},M=async()=>{let H=J[Z];if(!H||K)return;if(!H.installation){q(`${H.manifest.name} 不是 Blade 受管安装,不能自动卸载`);return}if(L!==H.manifest.name){O(H.manifest.name),q(`再次按 x 确认卸载 ${H.manifest.name}`);return}U(!0),q("");try{let{result:S}=await JY(Y.getWorkspaceRoot(),H.manifest.name,!0);if(!S.success)throw Error(S.error);O(null),X(0),q(`已卸载 ${H.manifest.name}`),T((E)=>E+1)}catch(S){q(S instanceof Error?S.message:String(S))}finally{U(!1)}};if(tX((H,S)=>{if(S.escape)Q?.();else if(S.ctrl&&H==="c"||S.meta&&H==="c")w();else if((S.upArrow||H==="k")&&J.length>0)O(null),X((E)=>(E-1+J.length)%J.length);else if((S.downArrow||H==="j")&&J.length>0)O(null),X((E)=>(E+1)%J.length);else if(H===" "||S.return)B();else if(H==="r")y();else if(H==="s")C();else if(H==="u")f();else if(H==="x")M()}),J.length===0)return x(P0,{flexDirection:"column",paddingY:1,children:[x(P0,{marginBottom:1,children:x(K0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(P0,{paddingLeft:2,children:x(K0,{color:"gray",children:"没有已加载的插件"},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(P0,{marginTop:1,paddingLeft:2,flexDirection:"column",children:[x(K0,{color:"gray",children:"插件目录位置:"},void 0,!1,void 0,this),x(K0,{color:"gray",dimColor:!0,children:[" ","• ~/.blade/plugins/ - 用户级插件"]},void 0,!0,void 0,this),x(K0,{color:"gray",dimColor:!0,children:[" ","• .blade/plugins/ - 项目级插件"]},void 0,!0,void 0,this),x(K0,{color:"gray",dimColor:!0,children:[" ","• --plugin-dir - CLI 指定的插件"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(P0,{marginTop:1,paddingLeft:2,children:x(K0,{color:"gray",children:"使用 /plugins install <url> 安装新插件"},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(P0,{marginTop:1,children:x(K0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return x(P0,{flexDirection:"column",paddingY:1,children:[x(P0,{marginBottom:1,children:[x(K0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this),x(K0,{color:"gray",children:[" (共 ",k.total," 个插件)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(P0,{paddingLeft:2,marginBottom:1,children:x(K0,{color:"gray",children:["启用: ",k.active," | 禁用: ",k.inactive," | 命令: ",k.commands," | 技能:"," ",k.skills," | 代理: ",k.agents]},void 0,!0,void 0,this)},void 0,!1,void 0,this),x(P0,{paddingLeft:2,marginBottom:1,children:x(K0,{color:"gray",children:["来源策略: ",P.restrictToAllowedSources?"restricted":"open"," | Git SHA: ",P.requireGitCommitSha?"required":"optional"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),x(P0,{paddingLeft:2,marginBottom:1,children:x(K0,{color:"gray",children:["写入层级: ",x(K0,{color:"cyan",children:W},void 0,!1,void 0,this)," · 按 s 切换"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),_.cli.length>0&&x(P0,{flexDirection:"column",marginBottom:1,children:[x(P0,{paddingLeft:1,children:[x(K0,{bold:!0,color:"magenta",children:"CLI 指定"},void 0,!1,void 0,this),x(K0,{color:"gray",children:" (--plugin-dir)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),_.cli.map((H)=>{let S=H.status==="active"?"[on]":"[off]",E=J.indexOf(H)===Z;return x(P0,{flexDirection:"column",paddingLeft:2,children:[x(K0,{children:[x(K0,{bold:!0,color:E?"cyan":"green",children:[E?"› ":" ",S," ",H.manifest.name]},void 0,!0,void 0,this),x(K0,{color:"gray",children:[" v",H.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(P0,{paddingLeft:2,children:x(K0,{color:"gray",children:H.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(P0,{paddingLeft:2,children:x(K0,{color:"gray",dimColor:!0,children:"生效层级: invocation"},void 0,!1,void 0,this)},void 0,!1,void 0,this),H.commands.length>0&&x(P0,{paddingLeft:2,children:x(K0,{color:"blue",children:["命令:"," ",H.commands.map((n)=>`/${n.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},H.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),_.project.length>0&&x(P0,{flexDirection:"column",marginBottom:1,children:[x(P0,{paddingLeft:1,children:[x(K0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),x(K0,{color:"gray",children:" (.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),_.project.map((H)=>{let S=H.status==="active"?"[on]":"[off]",E=J.indexOf(H)===Z;return x(P0,{flexDirection:"column",paddingLeft:2,children:[x(K0,{children:[x(K0,{bold:!0,color:E?"cyan":"green",children:[E?"› ":" ",S," ",H.manifest.name]},void 0,!0,void 0,this),x(K0,{color:"gray",children:[" v",H.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(P0,{paddingLeft:2,children:x(K0,{color:"gray",children:H.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(P0,{paddingLeft:2,children:x(K0,{color:"gray",dimColor:!0,children:["生效层级:"," ",b?.[H.manifest.name]?.effectiveScope??"default"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),H.commands.length>0&&x(P0,{paddingLeft:2,children:x(K0,{color:"blue",children:["命令:"," ",H.commands.map((n)=>`/${n.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},H.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),_.user.length>0&&x(P0,{flexDirection:"column",marginBottom:1,children:[x(P0,{paddingLeft:1,children:[x(K0,{bold:!0,color:"cyan",children:"用户级"},void 0,!1,void 0,this),x(K0,{color:"gray",children:" (~/.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),_.user.map((H)=>{let S=H.status==="active"?"[on]":"[off]",E=J.indexOf(H)===Z;return x(P0,{flexDirection:"column",paddingLeft:2,children:[x(K0,{children:[x(K0,{bold:!0,color:E?"cyan":"green",children:[E?"› ":" ",S," ",H.manifest.name]},void 0,!0,void 0,this),x(K0,{color:"gray",children:[" v",H.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(P0,{paddingLeft:2,children:x(K0,{color:"gray",children:H.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(P0,{paddingLeft:2,children:x(K0,{color:"gray",dimColor:!0,children:["生效层级:"," ",b?.[H.manifest.name]?.effectiveScope??"default"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),H.commands.length>0&&x(P0,{paddingLeft:2,children:x(K0,{color:"blue",children:["命令:"," ",H.commands.map((n)=>`/${n.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},H.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),x(P0,{marginTop:1,paddingLeft:2,flexDirection:"column",children:[x(K0,{color:"gray",children:"可用命令:"},void 0,!1,void 0,this),x(K0,{color:"gray",dimColor:!0,children:[" ","• /plugins list - 列出所有插件"]},void 0,!0,void 0,this),x(K0,{color:"gray",dimColor:!0,children:[" ","• /plugins info <name> - 显示插件详情"]},void 0,!0,void 0,this),x(K0,{color:"gray",dimColor:!0,children:[" ","• /plugins install <url> - 安装插件"]},void 0,!0,void 0,this),x(K0,{color:"gray",dimColor:!0,children:[" ","• /plugins enable/disable <name> - 启用/禁用插件"]},void 0,!0,void 0,this),x(K0,{color:"gray",dimColor:!0,children:[" ","• /plugins policy show|set - 来源与 SHA 策略"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(P0,{marginTop:1,children:x(K0,{dimColor:!0,children:"↑/↓ 选择 · Space/Enter 启停 · s 切换层级 · u 信任并更新 · x 卸载 · r 刷新 · ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),G&&x(P0,{marginTop:1,children:x(K0,{color:G.includes("失败")?"red":"cyan",children:G},void 0,!1,void 0,this)},void 0,!1,void 0,this),K&&x(K0,{color:"gray",children:"处理中..."},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import{Box as Q1,Text as J1,useInput as ZY,useStdout as eX}from"ink";import $7 from"ink-text-input";import O4,{useCallback as C2,useMemo as Q7,useState as O$}from"react";import{jsxDEV as B0}from"react/jsx-dev-runtime";var J7=O4.memo(({option:$,index:Q,isSelected:Y,isMultiSelect:J,isHighlighted:Z})=>B0(Q1,{flexDirection:"column",marginBottom:1,children:[B0(J1,{color:Z?"yellow":Y?"green":void 0,bold:Z,children:[J?Y?"(*) ":"( ) ":Z?"> ":" ",Q+1,". ",$.label]},void 0,!0,void 0,this),B0(Q1,{marginLeft:4,children:B0(J1,{color:"gray",children:$.description},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)),Y7=O4.memo(({questions:$,answers:Q})=>B0(Q1,{flexDirection:"column",marginBottom:1,children:$.map((Y)=>{let J=Q[Y.header],Z=Array.isArray(J)?J.join(", "):J||"(no answer)";return B0(Q1,{marginBottom:1,children:[B0(J1,{backgroundColor:"blue",color:"white",children:[" ",Y.header," "]},void 0,!0,void 0,this),B0(J1,{color:"green",children:[" ",Z]},void 0,!0,void 0,this)]},Y.header,!0,void 0,this)})},void 0,!1,void 0,this)),XY=O4.memo(({questions:$,onComplete:Q,onCancel:Y})=>{let{stdout:J}=eX(),Z=J.columns||80,K=e0()==="confirmation-prompt",U=k0(!1),[G,q]=O$("answering"),[L,O]=O$(0),[W,z]=O$({}),[b,N]=O$(0),[A,T]=O$([]),[_,k]=O$(!1),[P,w]=O$(""),[C,B]=O$(0),y=$[L],f=Q7(()=>{if(!y)return[];return[...y.options.map((r)=>({label:r.label,value:r.label,description:r.description})),{label:"Type something...",value:"__other__",description:"Enter custom response"}]},[y]),M=C2((r)=>{let o={...W,[y.header]:r};if(z(o),L<$.length-1)O(L+1),N(0),T([]),k(!1),w("");else q("submit"),B(0)},[W,y?.header,L,$.length]),H=C2((r)=>{let o=f[r];if(!o)return;if(o.value==="__other__"){k(!0);return}if(y.multiSelect)T((l)=>l.includes(o.value)?l.filter((p)=>p!==o.value):[...l,o.value]);else M(o.value)},[f,y?.multiSelect,M]),S=C2((r)=>{if(r.trim())M(r.trim())},[M]),E=C2(()=>{q("answering"),O(0),N(0),T([]),k(!1)},[]),n=C2(()=>{Q(W)},[W,Q]);if(ZY((r,o)=>{if(o.ctrl&&r==="c"||o.meta&&r==="c"){U();return}if(_){if(o.escape)k(!1),w("");return}if(o.escape){Y();return}let l=parseInt(r);if(l>=1&&l<=f.length){H(l-1);return}if(o.upArrow){N((p)=>p>0?p-1:f.length-1);return}if(o.downArrow||o.tab){N((p)=>p<f.length-1?p+1:0);return}if(o.return){if(y.multiSelect&&A.length>0)M(A);else H(b);return}if(r===" "&&y.multiSelect){let p=f[b];if(p&&p.value!=="__other__")T((d)=>d.includes(p.value)?d.filter((F)=>F!==p.value):[...d,p.value]);return}},{isActive:K&&G==="answering"&&!_}),ZY((r,o)=>{if(o.ctrl&&r==="c"||o.meta&&r==="c"){U();return}if(o.escape){Y();return}if(o.upArrow||o.downArrow||o.tab){B((l)=>l===0?1:0);return}if(o.return){if(C===0)n();else E();return}if(r.toLowerCase()==="y"){n();return}if(r.toLowerCase()==="e"){E();return}},{isActive:K&&G==="submit"}),G==="submit")return B0(Q1,{flexDirection:"column",borderStyle:"round",borderColor:K?"green":"gray",padding:1,width:Math.min(Z-4,80),children:[B0(Q1,{marginBottom:1,children:B0(J1,{bold:!0,color:"green",children:"[OK] Review Your Answers"},void 0,!1,void 0,this)},void 0,!1,void 0,this),B0(Y7,{questions:$,answers:W},void 0,!1,void 0,this),B0(Q1,{flexDirection:"column",marginTop:1,children:[B0(J1,{color:C===0?"yellow":void 0,bold:C===0,children:[C===0?"> ":" ","[Y] Submit answers"]},void 0,!0,void 0,this),B0(J1,{color:C===1?"yellow":void 0,bold:C===1,children:[C===1?"> ":" ","[E] Edit answers"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),B0(Q1,{marginTop:1,children:B0(J1,{color:"gray",children:"Enter to confirm · Up/Down to navigate · Y/E for quick select"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(!y)return null;return B0(Q1,{flexDirection:"column",borderStyle:"round",borderColor:K?"cyan":"gray",padding:1,width:Math.min(Z-4,80),children:[B0(Q1,{marginBottom:1,children:[B0(J1,{backgroundColor:"blue",color:"white",children:[" ",y.header," "]},void 0,!0,void 0,this),B0(J1,{children:[" ",y.question]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),_?B0(Q1,{flexDirection:"column",marginTop:1,children:[B0(J1,{color:"yellow",children:"Enter your response:"},void 0,!1,void 0,this),B0(Q1,{marginTop:1,children:[B0(J1,{color:"cyan",children:"> "},void 0,!1,void 0,this),B0($7,{value:P,onChange:w,onSubmit:S,focus:K},void 0,!1,void 0,this)]},void 0,!0,void 0,this),B0(Q1,{marginTop:1,children:B0(J1,{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):B0(Q1,{flexDirection:"column",children:f.map((r,o)=>B0(J7,{option:r,index:o,isSelected:A.includes(r.value),isMultiSelect:y.multiSelect,isHighlighted:b===o},r.value,!1,void 0,this))},void 0,!1,void 0,this),!_&&B0(Q1,{marginTop:1,flexDirection:"column",children:[B0(J1,{color:"gray",children:y.multiSelect?"Space to toggle · Enter to confirm · 1-9 for quick select":"Enter to select · Up/Down or Tab to navigate · 1-9 for quick select"},void 0,!1,void 0,this),y.multiSelect&&A.length>0&&B0(J1,{color:"green",children:["Selected: ",A.join(", ")]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$.length>1&&B0(Q1,{marginTop:1,children:B0(J1,{color:"gray",children:["Question ",L+1," of ",$.length]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{basename as Z7}from"node:path";import{Box as Q2,Text as L1,useInput as X7}from"ink";import K7 from"ink-select-input";import{useEffect as z4,useMemo as $2,useRef as zY,useState as p8}from"react";function KY($){return`${$.projectPath}\x00${$.sessionId}`}function GY($){return $.title?.trim()||`Session ${$.sessionId.slice(0,8)}`}function UY($){return $.taskDelivery?` | delivery:${$.taskDelivery.status}`:""}function qY($,Q){if(Q!=="fork")return[...$];return $.filter((Y)=>Y.relationType!=="subagent")}function OY($){return{title:$==="fork"?"选择要 fork 的会话:":"选择要恢复的会话:",instructions:"(Left/Right to page | Up/Down to select | Enter to confirm | Esc to cancel)"}}import{jsxDEV as r0}from"react/jsx-dev-runtime";function G7($){let Q=new Date($),J=new Date().getTime()-Q.getTime(),Z=Math.floor(J/86400000);if(Z===0)return`今天 ${Q.getHours().toString().padStart(2,"0")}:${Q.getMinutes().toString().padStart(2,"0")}`;if(Z===1)return"昨天";if(Z<7)return`${Z}天前`;return`${Q.getMonth()+1}/${Q.getDate()}`}function U7($){return Z7($)}function q7($){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 O7=({isSelected:$})=>r0(Q2,{marginRight:1,children:r0(L1,{color:$?"cyan":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),z7=({isSelected:$,label:Q})=>r0(L1,{color:$?"cyan":"white",bold:$,children:Q},void 0,!1,void 0,this),I2=20,_Y=({intent:$,sessions:Q,onSelect:Y,onCancel:J})=>{let[Z,X]=p8([]),[K,U]=p8(!1),[G,q]=p8(0),[L,O]=p8(!1),W=zY(!1),z=zY(!0);z4(()=>{return z.current=!0,()=>{z.current=!1}},[]);let N=e0()==="session-selector",A=k0(!1);X7((y,f)=>{if(f.ctrl&&y==="c"||f.meta&&y==="c"){A();return}if(W.current)return;if(f.escape&&J){J();return}if(f.leftArrow||y==="h"||y==="H"){if(G>0)q((M)=>M-1);return}if(f.rightArrow||y==="l"||y==="L"){if(G<P-1)q((M)=>M+1);return}},{isActive:N}),z4(()=>{if(Q){X(Q);return}(async()=>{U(!0);try{let f=await T0.listSessions({includeSubagents:!1});X(f)}catch(f){console.error("[SessionSelector] Failed to load sessions:",f),X([])}finally{U(!1)}})()},[Q]);let T=$2(()=>qY(Q||Z,$),[$,Q,Z]),_=$2(()=>OY($),[$]),k=$2(()=>{return T.map((y)=>{let f=U7(y.taskSourceProjectPath??y.projectPath),M=G7(y.lastMessageTime),H=GY(y),S=`[${q7(y.taskStatus)}]`,E=y.gitBranch?` (${y.gitBranch})`:"",n=y.hasErrors?" [!]":"",r=y.taskRetriedFrom?` ↻ retry:${y.taskRetriedFrom.sessionId.slice(0,6)}`:y.relationType==="subagent"?" ↳ subagent":y.relationType==="fork"?" ↳ fork":"",o=y.taskIsolation==="worktree"?` | wt:${y.taskWorktreeBranch??"managed"}`:y.taskIsolation==="local"?" | local":"",l=y.taskDiffStat?` | ${y.taskDiffStat.changedFiles} files +${y.taskDiffStat.additions} -${y.taskDiffStat.deletions}`:"",p=y.taskStatus==="queued"&&y.taskQueuePosition?` | queue:${y.taskQueuePosition}/${y.taskQueueDepth??y.taskQueuePosition}`:"",d=UY(y);return{key:KY(y),label:`${S} ${H} · ${M} | ${f}${E} | ${y.messageCount} 条消息${o}${p}${l}${d}${n}${r}`,value:y}})},[T]),P=$2(()=>Math.max(1,Math.ceil(k.length/I2)),[k.length]),w=$2(()=>{let y=G*I2;return k.slice(y,y+I2)},[k,G]),C=$2(()=>({start:G*I2+1,end:Math.min((G+1)*I2,k.length)}),[G,k.length]);z4(()=>{q(0)},[T.length]);let B=(y)=>{if(W.current)return;W.current=!0,O(!0);let f=()=>{if(!z.current)return;W.current=!1,O(!1)};Promise.resolve().then(()=>Y(y.value)).then(f,f)};if(K)return r0(Q2,{flexDirection:"column",paddingX:2,paddingY:1,children:r0(L1,{children:"正在加载会话列表..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(T.length===0)return r0(Q2,{flexDirection:"column",paddingX:2,paddingY:1,children:[r0(L1,{color:"yellow",children:"没有找到历史会话"},void 0,!1,void 0,this),r0(L1,{dimColor:!0,children:[`
158
+ `,"提示: 开始一次对话后,会话历史将保存到 ~/.blade/projects/"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this);return r0(Q2,{flexDirection:"column",paddingX:2,paddingY:1,children:[r0(L1,{bold:!0,color:"cyan",children:_.title},void 0,!1,void 0,this),r0(L1,{dimColor:!0,children:[`
159
+ `,_.instructions,`
160
+ `]},void 0,!0,void 0,this),r0(K7,{items:w,onSelect:B,isFocused:N&&!L,indicatorComponent:O7,itemComponent:z7},void 0,!1,void 0,this),L&&r0(L1,{color:"cyan",children:$==="fork"?"Forking…":"Resuming…"},void 0,!1,void 0,this),r0(Q2,{marginTop:1,flexDirection:"column",children:[r0(L1,{dimColor:!0,children:["第 ",G+1,"/",P," 页 · 共 ",T.length," 个会话 · 显示"," ",C.start,"-",C.end]},void 0,!0,void 0,this),P>1&&r0(Q2,{marginTop:1,children:[r0(L1,{color:G>0?"cyan":"gray",children:G>0?"<< 上一页":" "},void 0,!1,void 0,this),r0(L1,{children:" "},void 0,!1,void 0,this),r0(L1,{color:G<P-1?"cyan":"gray",children:G<P-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 NY,Text as f2}from"ink";import _7,{useEffect as N7,useState as F7}from"react";import{jsxDEV as z$}from"react/jsx-dev-runtime";var FY=["|","/","-","\\"],_4=_7.memo(()=>{let $=j2(),Q=b0(),Y=Q$(),[J,Z]=F7(0);if(N7(()=>{if($?.status!=="loading"){Z(0);return}let X=setInterval(()=>{Z((K)=>(K+1)%FY.length)},100);return()=>clearInterval(X)},[$?.status]),!$)return null;return z$(NY,{flexDirection:"column",borderStyle:"single",borderColor:Q.colors.info,marginX:2,marginBottom:1,paddingX:1,children:[z$(NY,{children:[z$(f2,{bold:!0,color:Q.colors.info,children:"BTW"},void 0,!1,void 0,this),z$(f2,{color:Q.colors.muted,children:[" | ",$.question]},void 0,!0,void 0,this),$.durationMs!==void 0&&z$(f2,{color:Q.colors.muted,dimColor:!0,children:[" ","| ",$.durationMs,"ms"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$.status==="loading"&&z$(f2,{color:Q.colors.text.secondary,children:[FY[J]," Answering..."]},void 0,!0,void 0,this),$.status==="error"&&z$(f2,{color:Q.colors.error,children:$.error??"Side conversation failed"},void 0,!1,void 0,this),$.status==="completed"&&$.response&&z$(k1,{content:$.response,role:"assistant",terminalWidth:Math.max(20,Y-8),hidePrefix:!0,noMargin:!0,messageId:`side-conversation-${$.requestId}`},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});_4.displayName="SideConversationPanel";import{Box as p0,Text as f0,useInput as W7}from"ink";import{jsxDEV as Z0}from"react/jsx-dev-runtime";function HY({onCancel:$}){let Q=I1(),J=WY({cwd:Q}).getAll(),Z=J.filter((G)=>G.source==="builtin"),X=J.filter((G)=>G.source==="user"),K=J.filter((G)=>G.source==="project"),U=k0(!1,$);if(W7((G,q)=>{if(q.escape)$?.();else if(q.ctrl&&G==="c"||q.meta&&G==="c")U()}),J.length===0)return Z0(p0,{flexDirection:"column",paddingY:1,children:[Z0(p0,{marginBottom:1,children:Z0(f0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this)},void 0,!1,void 0,this),Z0(p0,{paddingLeft:2,children:Z0(f0,{color:"gray",children:"没有找到任何 Skill"},void 0,!1,void 0,this)},void 0,!1,void 0,this),Z0(p0,{marginTop:1,paddingLeft:2,children:Z0(f0,{color:"gray",children:"配置文件位置: ~/.blade/skills/ 或 .blade/skills/"},void 0,!1,void 0,this)},void 0,!1,void 0,this),Z0(p0,{marginTop:1,children:Z0(f0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return Z0(p0,{flexDirection:"column",paddingY:1,children:[Z0(p0,{marginBottom:1,children:[Z0(f0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this),Z0(f0,{color:"gray",children:[" (找到 ",J.length," 个)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.length>0&&Z0(p0,{flexDirection:"column",marginBottom:1,children:[Z0(p0,{paddingLeft:1,children:[Z0(f0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),Z0(f0,{color:"gray",children:" (.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),K.map((G)=>{let L=G.description.length>80?`${G.description.substring(0,80)}...`:G.description;return Z0(p0,{flexDirection:"column",paddingLeft:2,children:[Z0(f0,{children:[Z0(f0,{bold:!0,color:"green",children:["• ",G.name]},void 0,!0,void 0,this),Z0(f0,{color:"gray",children:[" - ",L]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),G.allowedTools&&G.allowedTools.length>0&&Z0(p0,{paddingLeft:2,children:Z0(f0,{color:"gray",children:["工具: ",G.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),Z0(p0,{paddingLeft:2,children:Z0(f0,{color:"gray",dimColor:!0,children:G.path},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},G.name,!0,void 0,this)})]},void 0,!0,void 0,this),X.length>0&&Z0(p0,{flexDirection:"column",marginBottom:1,children:[Z0(p0,{paddingLeft:1,children:[Z0(f0,{bold:!0,color:"yellow",children:"用户级"},void 0,!1,void 0,this),Z0(f0,{color:"gray",children:" (~/.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X.map((G)=>{let L=G.description.length>80?`${G.description.substring(0,80)}...`:G.description;return Z0(p0,{flexDirection:"column",paddingLeft:2,children:[Z0(f0,{children:[Z0(f0,{bold:!0,color:"green",children:["• ",G.name]},void 0,!0,void 0,this),Z0(f0,{color:"gray",children:[" - ",L]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),G.allowedTools&&G.allowedTools.length>0&&Z0(p0,{paddingLeft:2,children:Z0(f0,{color:"gray",children:["工具: ",G.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),Z0(p0,{paddingLeft:2,children:Z0(f0,{color:"gray",dimColor:!0,children:G.path},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},G.name,!0,void 0,this)})]},void 0,!0,void 0,this),Z.length>0&&Z0(p0,{flexDirection:"column",marginBottom:1,children:[Z0(p0,{paddingLeft:1,children:[Z0(f0,{bold:!0,color:"cyan",children:"内置"},void 0,!1,void 0,this),Z0(f0,{color:"gray",children:" (builtin)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Z.map((G)=>{let L=G.description.length>80?`${G.description.substring(0,80)}...`:G.description;return Z0(p0,{flexDirection:"column",paddingLeft:2,children:[Z0(f0,{children:[Z0(f0,{bold:!0,color:"green",children:["• ",G.name]},void 0,!0,void 0,this),Z0(f0,{color:"gray",children:[" - ",L]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),G.userInvocable&&Z0(p0,{paddingLeft:2,children:Z0(f0,{color:"blue",children:["命令: /",G.name]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},G.name,!0,void 0,this)})]},void 0,!0,void 0,this),Z0(p0,{marginTop:1,children:Z0(f0,{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 LY,Text as R1}from"ink";import H7,{useEffect as L7,useMemo as B7,useState as BY}from"react";import{jsxDEV as Y1,Fragment as N4}from"react/jsx-dev-runtime";var wY=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"];function w7($){let Q=Math.floor($/1000);if(Q<60)return`${Q}s`;let Y=Math.floor(Q/60),J=Q%60;return`${Y}m ${J}s`}var bY=H7.memo(()=>{let $=t((q)=>q.app.subagentProgresses),Q=t((q)=>q.app.subagentProgress),Y=b0(),[J,Z]=BY(0),[X,K]=BY(()=>Date.now()),U=B7(()=>{let q=Object.values($);return q.length>0?q:Q?[Q]:[]},[Q,$]),G=U.some((q)=>q.status==="running");if(L7(()=>{if(!G){Z(0);return}let q=setInterval(()=>{Z((O)=>(O+1)%wY.length)},80),L=setInterval(()=>{K(Date.now())},1000);return()=>{clearInterval(q),clearInterval(L)}},[G]),U.length===0)return null;return Y1(LY,{paddingX:2,paddingY:0,flexDirection:"column",children:U.map((q)=>{let L=q.status==="running"?wY[J]:q.status==="completed"?"[OK]":"[X]",O=q.status==="running"?Y.colors.info:q.status==="completed"?Y.colors.success:Y.colors.error,W=Math.max(0,X-q.startTime);return Y1(LY,{flexDirection:"row",gap:1,children:[Y1(R1,{color:O,bold:!0,children:L},void 0,!1,void 0,this),Y1(R1,{color:Y.colors.muted,children:"Subagent"},void 0,!1,void 0,this),Y1(R1,{color:Y.colors.text.primary,bold:!0,children:q.type},void 0,!1,void 0,this),Y1(R1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),Y1(R1,{color:Y.colors.text.secondary,children:q.description},void 0,!1,void 0,this),q.currentTool&&Y1(N4,{children:[Y1(R1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),Y1(R1,{color:Y.colors.warning,children:q.currentTool},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.status==="running"&&W>0&&Y1(N4,{children:[Y1(R1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),Y1(R1,{color:Y.colors.info,children:w7(W)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.status==="failed"&&q.terminalSummary&&Y1(N4,{children:[Y1(R1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),Y1(R1,{color:Y.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 J2,Text as a1}from"ink";import b7 from"react";import{jsxDEV as G1}from"react/jsx-dev-runtime";var F4={idle:"-",running:">",completed:"[OK]",failed:"[X]",deleted:"[X]",leader:"*",cancelled:"[X]",unknown:"?",pending:"-",blocked:"x"},W4=b7.memo(()=>{let $=g4().filter((Y)=>Y.status!=="deleted"),Q=b0();if($.length===0)return null;return G1(J2,{flexDirection:"column",paddingX:2,children:$.map((Y)=>{let J=Y.tasks.filter((Z)=>Z.status==="completed").length;return G1(J2,{flexDirection:"column",marginBottom:1,children:[G1(J2,{gap:1,children:[G1(a1,{bold:!0,color:Y.status==="failed"?Q.colors.error:Y.status==="completed"?Q.colors.success:Q.colors.info,children:[F4[Y.status]," Team"]},void 0,!0,void 0,this),G1(a1,{bold:!0,color:Q.colors.text.primary,children:Y.name},void 0,!1,void 0,this),G1(a1,{color:Q.colors.muted,children:["| ",Y.members.length-1," members | ",J,"/",Y.tasks.length," ","tasks"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),G1(J2,{flexDirection:"column",paddingLeft:2,children:[Y.members.filter((Z)=>Z.status!=="leader").map((Z)=>G1(J2,{gap:1,children:[G1(a1,{color:Q.colors.muted,children:F4[Z.status]},void 0,!1,void 0,this),G1(a1,{color:Q.colors.text.secondary,children:Z.name},void 0,!1,void 0,this),G1(a1,{color:Q.colors.muted,children:["(",Z.subagentType,", ",Z.status,Z.worktreePath?", worktree":"",")"]},void 0,!0,void 0,this)]},Z.id,!0,void 0,this)),Y.tasks.map((Z)=>G1(J2,{gap:1,children:[G1(a1,{color:Q.colors.muted,children:F4[Z.status]},void 0,!1,void 0,this),G1(a1,{color:Q.colors.text.secondary,children:["#",Z.id," ",Z.subject]},void 0,!0,void 0,this),G1(a1,{color:Q.colors.muted,children:["(",Z.status,Z.owner?`, ${Z.owner}`:"",")"]},void 0,!0,void 0,this)]},Z.id,!0,void 0,this))]},void 0,!0,void 0,this)]},Y.name,!0,void 0,this)})},void 0,!1,void 0,this)});W4.displayName="TeamProgress";import{useMemoizedFn as A7}from"ahooks";import{Box as D1,Text as a,useInput as P7}from"ink";import y7 from"ink-select-input";import{useState as AY}from"react";import{jsxDEV as u}from"react/jsx-dev-runtime";var PY=k$.map(($)=>({label:$.label,value:$.id})),R7=({theme:$})=>{let{colors:Q}=$;return u(D1,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[u(a,{bold:!0,color:Q.text.primary,children:"代码预览"},void 0,!1,void 0,this),u(a,{children:" "},void 0,!1,void 0,this),u(a,{color:Q.syntax.comment,children:"# function"},void 0,!1,void 0,this),u(a,{children:[u(a,{color:Q.syntax.keyword,children:"def"},void 0,!1,void 0,this)," ",u(a,{color:Q.syntax.function,children:"fibonacci"},void 0,!1,void 0,this),u(a,{color:Q.text.primary,children:"("},void 0,!1,void 0,this),u(a,{color:Q.syntax.variable,children:"n"},void 0,!1,void 0,this),u(a,{color:Q.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(a,{children:[" ",u(a,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this),u(a,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",u(a,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",u(a,{color:Q.syntax.operator,children:"="},void 0,!1,void 0,this)," ",u(a,{color:Q.syntax.number,children:"0"},void 0,!1,void 0,this),u(a,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",u(a,{color:Q.syntax.number,children:"1"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(a,{children:[" ",u(a,{color:Q.syntax.keyword,children:"for"},void 0,!1,void 0,this)," ",u(a,{color:Q.syntax.variable,children:"_"},void 0,!1,void 0,this)," ",u(a,{color:Q.syntax.keyword,children:"in"},void 0,!1,void 0,this)," ",u(a,{color:Q.syntax.function,children:"range"},void 0,!1,void 0,this),u(a,{color:Q.text.primary,children:"("},void 0,!1,void 0,this),u(a,{color:Q.syntax.variable,children:"n"},void 0,!1,void 0,this),u(a,{color:Q.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(a,{children:[" ",u(a,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this),u(a,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",u(a,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",u(a,{color:Q.syntax.operator,children:"="},void 0,!1,void 0,this)," ",u(a,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this),u(a,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",u(a,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this)," ",u(a,{color:Q.syntax.operator,children:"+"},void 0,!1,void 0,this)," ",u(a,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(a,{children:[" ",u(a,{color:Q.syntax.keyword,children:"return"},void 0,!1,void 0,this)," ",u(a,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(a,{children:" "},void 0,!1,void 0,this),u(a,{color:Q.error,children:["- print(",u(a,{color:Q.syntax.string,children:'"Hello, "'},void 0,!1,void 0,this)," + name)"]},void 0,!0,void 0,this),u(a,{color:Q.success,children:["+ print(",u(a,{color:Q.syntax.string,children:['f"Hello, ',"{","name","}",'"']},void 0,!0,void 0,this),")"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},M7=({theme:$})=>{let{colors:Q}=$;return u(D1,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[u(a,{children:" "},void 0,!1,void 0,this),u(a,{bold:!0,color:Q.text.primary,children:"颜色配置"},void 0,!1,void 0,this),u(a,{children:" "},void 0,!1,void 0,this),u(a,{children:[u(a,{color:Q.text.muted,children:"Primary: "},void 0,!1,void 0,this),u(a,{color:Q.primary,children:Q.primary},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(a,{children:[u(a,{color:Q.text.muted,children:"Success: "},void 0,!1,void 0,this),u(a,{color:Q.success,children:Q.success},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(a,{children:[u(a,{color:Q.text.muted,children:"Error: "},void 0,!1,void 0,this),u(a,{color:Q.error,children:Q.error},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(a,{children:[u(a,{color:Q.text.muted,children:"Warning: "},void 0,!1,void 0,this),u(a,{color:Q.warning,children:Q.warning},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(a,{children:[u(a,{color:Q.text.muted,children:"Info: "},void 0,!1,void 0,this),u(a,{color:Q.info,children:Q.info},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},yY=()=>{let $=t1(),Q=a0.getCurrentThemeName(),Y=k$.findIndex((b)=>b.label===Q),J=Y>=0?k$[Y].theme:k$[0].theme,[Z,X]=AY(J),[K,U]=AY(!1),G=A7(async(b)=>{if(K)return;U(!0);try{await m0().setTheme(b.value),$.closeModal()}catch(N){console.error("主题切换失败:",N instanceof Error?N.message:N)}finally{U(!1)}}),q=(b)=>{let N=k$.find((A)=>A.id===b.value);if(N)X(N.theme)},O=e0()==="theme-selector",W=k0(!1);P7((b,N)=>{if(N.ctrl&&b==="c"||N.meta&&b==="c"){W();return}if(N.escape&&!K)$.closeModal()},{isActive:O});let z=(b)=>{let{isSelected:N,label:A}=b,_=A===Q?"[OK]":" ";return u(a,{color:N?Z.colors.primary:Z.colors.text.primary,children:[_," ",A]},void 0,!0,void 0,this)};return u(D1,{flexDirection:"column",height:"100%",children:[u(D1,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:Z.colors.border.light,children:u(a,{bold:!0,color:Z.colors.primary,children:"主题选择器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),u(D1,{flexDirection:"row",flexGrow:1,children:[u(D1,{width:"40%",borderStyle:"single",borderColor:Z.colors.border.light,paddingX:1,children:u(D1,{flexDirection:"column",children:[u(D1,{paddingTop:1,paddingBottom:1,children:u(a,{bold:!0,color:Z.colors.text.primary,children:["可用主题 (",PY.length,")"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),u(y7,{items:PY,initialIndex:Y>=0?Y:0,onSelect:G,onHighlight:q,itemComponent:z},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),u(D1,{width:"60%",flexDirection:"column",borderStyle:"single",borderColor:Z.colors.border.light,children:[u(R7,{theme:Z},void 0,!1,void 0,this),u(M7,{theme:Z},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),u(D1,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:Z.colors.border.light,children:u(a,{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{jsxDEV as M0}from"react/jsx-dev-runtime";var U1=s1("UI"),TY=({debug:$,continue:Q,...Y})=>{if($)U1.debug("[Debug] BladeInterface props:",{permissionMode:Y.permissionMode,yolo:Y.yolo,maxTurns:Y.maxTurns,continue:Q});let J=c8(!1),Z=c8(!1),X=c8(!1),K=c8(null),U=v4(),G=D4(),q=V2(),L=h4(),O=j4(),W=t1(),z=n1(),b=j$(),N=I1(),A=u4(),T=h$(),_=x4();N$(()=>{if(a0.getCurrentThemeName()!==_)try{a0.setTheme(_)}catch{}},[_]);let k=U==="ready",P=U==="needsSetup",w=U==="idle",C=T7(()=>Y.agents?MY(Y.agents):void 0,[Y.agents]),{confirmationState:B,confirmationHandler:y,handleResponse:f,dismissAll:M}=S6(),{executeCommand:H,handleAbort:S,isProcessing:E,cleanupAgent:n}=C6(Y.systemPrompt,Y.appendSystemPrompt,y,Y.maxTurns,M,C),{getPreviousCommand:r,getNextCommand:o,addToHistory:l}=f6();a6();let p=D6("",0),d=s0(async()=>{let D=T,m;if(D==="default")m="autoEdit";else if(D==="autoEdit")m="plan";else if(D==="plan")m="default";else m="default";try{await T0.setSessionPermissionMode(b,N,m),await m0().setPermissionMode(m)}catch(W0){U1.error("权限模式切换失败:",W0 instanceof Error?W0.message:W0)}}),F=s0(async(D)=>{try{let m={displayName:D.displayName,provider:D.provider,model:D.model,overrides:D.overrides};if(D.modelProvider)await m0().addModelWithProvider(m,D.modelProvider);else await m0().addModel(m);W.setInitializationStatus("ready")}catch(m){throw U1.error("初始化配置保存失败:",m instanceof Error?m.message:m),m}}),R=s0(()=>{if(q==="shortcuts")W.closeModal();else W.setActiveModal("shortcuts")}),V=s0(async(D,m,W0)=>{return t2({intent:m,session:D,newSessionId:W0?.newSessionId,announceFork:W0?.announceFork,permissionModeOverride:Y.permissionMode},N,z,n)}),I=s0(async(D,m)=>{let E0=(await n2(m,N)).filter((h1)=>h1.sessionId===D);if(E0.length===0)throw Error(`Session not found: ${D}`);if(E0.length>1)throw Error(`Multiple workspaces contain session ${D}; use the session selector`);return E0[0]}),{showSuggestions:v,suggestions:h,selectedSuggestionIndex:Q0}=r6(p,H,r,o,l,S,E,d,R,q==="shortcuts");N$(()=>{if(p.value&&q==="shortcuts")W.closeModal()},[p.value,q,W]);let e=s0(async()=>{X.current=!0;try{let D=Y.forkSession?"fork":"resume",m=await n2(D,N);if(m.length===0){if(Y.forkSession){U1.error("没有可供 fork 的历史会话"),f1(1);return}z.addAssistantMessage("没有找到历史会话,开始新对话。");return}let W0=m[0];await V(W0,D,{newSessionId:Y.forkSession?Y.sessionId:void 0,announceFork:Y.forkSession?!1:void 0})}catch(D){if(U1.error("[BladeInterface] 继续会话失败:",D),Y.forkSession){f1(1);return}z.addAssistantMessage("继续会话失败,开始新对话。")}}),X0=s0(async()=>{X.current=!0;try{if(typeof Y.resume==="string"&&Y.resume!=="true"){let W0=Y.forkSession?"fork":"resume",x0=await I(Y.resume,W0);await V(x0,W0,{newSessionId:Y.forkSession?Y.sessionId:void 0,announceFork:Y.forkSession?!1:void 0});return}let D=Y.forkSession?"fork":"resume",m=await n2(D,N);if(m.length===0)U1.error("没有找到历史会话"),f1(1);W.showSessionSelector(m,D)}catch(D){U1.error("[BladeInterface] 加载会话失败:",D),f1(1)}});N$(()=>{if(J.current)return;if(Q){J.current=!0,e();return}if(Y.resume)J.current=!0,X0()},[Q,Y.resume,e,X0]);let A0=s0(async(D)=>{let m=B.details?.type;if(m==="enterPlanMode"&&D.approved)try{await T0.setSessionPermissionMode(b,N,"plan"),await m0().setPermissionMode("plan"),U1.debug("[BladeInterface] Entered Plan mode")}catch(W0){U1.error("[BladeInterface] Failed to enter Plan mode:",W0)}if(m==="exitPlanMode"&&D.approved)U1.debug("[BladeInterface] ExitPlanMode approved, Store auto-synced");f(D)}),D0=s0(()=>{z.addAssistantMessage("设置已取消"),z.addAssistantMessage("Blade 需要 API 配置才能正常工作。"),z.addAssistantMessage("您可以稍后运行 Blade 重新进入设置向导。"),f1(0)}),j0=s0(()=>{W.closeModal()}),W$=s0(async(D)=>{try{await V(D,L?.intent??"resume"),W.closeModal()}catch(m){U1.error("[BladeInterface] Failed to restore session:",m),z.addAssistantMessage(`会话操作失败: ${m instanceof Error?m.message:"未知错误"}`),W.closeModal()}}),X2=s0(()=>{if(Y.resume)f1(0);else W.closeModal()}),K2=s0((D)=>{W.showModelEditWizard(D)}),G2=s0((D)=>{z.addAssistantMessage(`已添加模型配置: ${D.displayName??D.model},并已切换到该模型`),j0()}),j1=s0((D)=>{z.addAssistantMessage(`已更新模型配置: ${D.displayName??D.model}`),j0()});N$(()=>{if(P){A.setFocus("model-config-wizard");return}if(B.isVisible)A.setFocus("confirmation-prompt");else if(q==="sessionSelector")A.setFocus("session-selector");else if(q==="themeSelector")A.setFocus("theme-selector");else if(q==="modelSelector")A.setFocus("model-selector");else if(q==="modelAddWizard"||q==="modelEditWizard")A.setFocus("model-config-wizard");else if(q==="permissionsManager")A.setFocus("permissions-manager");else if(q==="agentsManager")A.setFocus("agents-manager");else if(q==="agentCreationWizard")A.setFocus("agent-creation-wizard");else if(q==="hooksManager")A.setFocus("hooks-manager");else if(q==="shortcuts")A.setFocus("main-input");else A.setFocus("main-input")},[P,B.isVisible,q,A.setFocus]),N$(()=>{if(!k||X.current)return;if(RY().length>0){X.current=!0;return}X.current=!0,z.addAssistantMessage("请输入您的问题,我将为您提供帮助。")},[k]),N$(()=>{if(!G)return;if(K.current===G)return;if(K.current=G,U==="error")z.addAssistantMessage(`初始化失败: ${G}`);else z.addAssistantMessage(`${G}`),z.addAssistantMessage("请重新尝试设置,或检查文件权限")},[G,U,z.addAssistantMessage]);let v$=s0(async(D)=>{try{await H({displayText:D,text:D,images:[],parts:[{type:"text",text:D}]})}catch(m){let W0=m instanceof Error?m.message:"无法发送初始消息";z.addAssistantMessage(`初始消息发送失败:${W0}`)}});N$(()=>{let D=Y.initialMessage?.trim();if(!D||Z.current||!k||P)return;Z.current=!0,l(D),v$(D)},[Y.initialMessage,k,P,H,l]);let c0=s0(async(D)=>{try{await m0().setPermissionMode(D)}catch(m){U1.error("权限模式初始化失败:",m instanceof Error?m.message:m)}});if(N$(()=>{let D=Y.permissionMode;if($)U1.debug("[Debug] permissionMode from CLI:",D),U1.debug("[Debug] current permissionMode:",T);if(!D||D===T)return;c0(D)},[Y.permissionMode,T]),w)return null;if(P)return M0(U4,{mode:"setup",onComplete:F,onCancel:D0},void 0,!1,void 0,this);if($)U1.debug("[Debug] 渲染主界面,条件检查:",{confirmationVisible:B.isVisible,activeModal:q});let H$=q==="modelSelector",M1=O,L$=q==="modelAddWizard"?"add":q==="modelEditWizard"&&M1?"edit":null,r8=H$||Boolean(L$),S2=q==="agentsManager",a8=q==="agentCreationWizard",T1=q==="skillsManager",o8=q==="pluginsManager",J0=M1?{displayName:M1.displayName,provider:M1.provider,model:M1.model,overrides:M1.overrides}:void 0,N0=B.isVisible&&B.details?B.details.type==="mcpElicitation"&&B.details.mcpElicitation?M0(WJ,{details:B.details.mcpElicitation,onComplete:(D,m)=>A0({approved:D.action==="accept",elicitation:D,...m?{openExternalUrl:!0}:{}})},void 0,!1,void 0,this):B.details.type==="askUserQuestion"&&B.details.questions?M0(XY,{questions:B.details.questions,onComplete:(D)=>A0({approved:!0,answers:D}),onCancel:()=>A0({approved:!1})},void 0,!1,void 0,this):M0(g9,{details:B.details,onResponse:A0},void 0,!1,void 0,this):q==="themeSelector"?M0(yY,{},void 0,!1,void 0,this):q==="permissionsManager"?M0(nJ,{onClose:j0},void 0,!1,void 0,this):q==="sessionSelector"?M0(_Y,{intent:L?.intent??"resume",sessions:L?.sessions,onSelect:W$,onCancel:X2},void 0,!1,void 0,this):q==="hooksManager"?M0(p9,{workspaceRoot:N,sessionId:b,onClose:j0},void 0,!1,void 0,this):null,F0=Boolean(N0);return M0(_$,{flexDirection:"column",width:"100%",overflow:"hidden",children:[N0,M0(_$,{flexDirection:"column",display:F0?"none":"flex",children:[M0(fJ,{},void 0,!1,void 0,this),M0(bY,{},void 0,!1,void 0,this),M0(W4,{},void 0,!1,void 0,this),M0(_4,{},void 0,!1,void 0,this),M0(zJ,{paused:F0},void 0,!1,void 0,this),M0(XJ,{input:p.value,cursorPosition:p.cursorPosition,onChange:p.setValue,onChangeCursorPosition:p.setCursorPosition,onAddPasteMapping:p.addPasteMapping,onAddImagePasteMapping:p.addImagePasteMapping},void 0,!1,void 0,this),H$&&M0(_$,{marginTop:1,paddingX:2,children:M0(kJ,{onClose:j0,onEdit:K2},void 0,!1,void 0,this)},void 0,!1,void 0,this),L$&&M0(_$,{marginTop:1,paddingX:2,children:M0(U4,{mode:L$,modelId:M1?.id,initialConfig:L$==="edit"?J0:void 0,onComplete:L$==="edit"?j1:G2,onCancel:j0},void 0,!1,void 0,this)},void 0,!1,void 0,this),S2&&M0(_$,{marginTop:1,paddingX:2,children:M0(s6,{workspaceRoot:N,onComplete:j0,onCancel:j0},void 0,!1,void 0,this)},void 0,!1,void 0,this),a8&&M0(_$,{marginTop:1,paddingX:2,children:M0(w2,{onComplete:j0,onCancel:j0},void 0,!1,void 0,this)},void 0,!1,void 0,this),T1&&M0(_$,{marginTop:1,paddingX:2,children:M0(HY,{onComplete:j0,onCancel:j0},void 0,!1,void 0,this)},void 0,!1,void 0,this),o8&&M0(_$,{marginTop:1,paddingX:2,children:M0(YY,{workspaceRoot:N,onComplete:j0,onCancel:j0},void 0,!1,void 0,this)},void 0,!1,void 0,this),M0(X9,{suggestions:h,selectedIndex:Q0,visible:v&&!r8},void 0,!1,void 0,this),M0(Z9,{},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)};import{Box as C7,Text as F$}from"ink";import I7 from"react";import{jsxDEV as o1}from"react/jsx-dev-runtime";class k2 extends I7.Component{constructor($){super($);this.state={hasError:!1,error:null,errorInfo:null}}static getDerivedStateFromError($){return{hasError:!0,error:$,errorInfo:null}}componentDidCatch($,Q){this.setState({error:$,errorInfo:Q}),console.error("未捕获的错误:",$,Q)}render(){if(this.state.hasError)return o1(C7,{flexDirection:"column",padding:1,borderStyle:"round",borderColor:"red",children:[o1(F$,{color:"red",children:"应用发生错误"},void 0,!1,void 0,this),o1(F$,{children:" "},void 0,!1,void 0,this),o1(F$,{color:"red",children:this.state.error?.message},void 0,!1,void 0,this),o1(F$,{children:" "},void 0,!1,void 0,this),o1(F$,{color:"gray",children:"错误详情:"},void 0,!1,void 0,this),o1(F$,{color:"gray",children:this.state.error?.stack},void 0,!1,void 0,this),o1(F$,{children:" "},void 0,!1,void 0,this),o1(F$,{color:"yellow",children:"请重启应用或联系开发者"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return this.props.children}}import{Box as S$,Text as i1,useInput as f7}from"ink";import{useState as H4}from"react";import{jsxDEV as Z1}from"react/jsx-dev-runtime";var x8=[{key:"update",label:"Update now",description:`runs \`${IY()}\``},{key:"skip",label:"Skip",description:""},{key:"skip_until_next",label:"Skip until next version",description:""}],kY=({versionInfo:$,onComplete:Q})=>{let[Y,J]=H4(0),[Z,X]=H4(!1),[K,U]=H4(null);f7((q,L)=>{if(L.ctrl&&q==="c"){L2().shutdown("SIGINT",0);return}if(Z||K)return;if(L.upArrow||q==="k")J((O)=>O>0?O-1:x8.length-1);else if(L.downArrow||q==="j")J((O)=>O<x8.length-1?O+1:0);else if(L.return)G(x8[Y].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":{X(!0);let L=await fY();U(L.message),setTimeout(()=>{L2().shutdown("SIGINT",0)},1500);break}case"skip":Q();break;case"skip_until_next":if($.latestVersion)await CY($.latestVersion);Q();break}};if(K)return Z1(S$,{flexDirection:"column",marginY:1,children:Z1(i1,{children:K},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Z)return Z1(S$,{flexDirection:"column",marginY:1,children:Z1(i1,{color:"cyan",children:"Updating..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);return Z1(S$,{flexDirection:"column",marginY:1,children:[Z1(i1,{color:"yellow",bold:!0,children:["Update available! ",Z1(i1,{color:"gray",children:[$.currentVersion," ","->"," ",$.latestVersion]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Z1(S$,{marginTop:1,children:Z1(i1,{color:"gray",children:["Release notes:"," ",Z1(i1,{color:"cyan",underline:!0,children:$.releaseNotesUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),Z1(S$,{flexDirection:"column",marginTop:1,children:x8.map((q,L)=>{let O=L===Y,W=O?"› ":" ",z=`${L+1}. `;return Z1(S$,{children:Z1(i1,{color:O?"cyan":void 0,children:[W,z,q.label,q.description&&Z1(i1,{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),Z1(S$,{marginTop:1,children:Z1(i1,{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 u8,Text as Y2,useInput as k7}from"ink";import{useState as SY}from"react";import{jsxDEV as V1}from"react/jsx-dev-runtime";var vY=({status:$,onTrust:Q,onContinueSafely:Y})=>{let J=a0.getTheme(),[Z,X]=SY(!1),[K,U]=SY(null);return k7((G,q)=>{if(Z)return;if(q.return||G.toLowerCase()==="t"){X(!0),U(null),Q().catch((L)=>{U(L instanceof Error?L.message:"Failed to trust workspace"),X(!1)});return}if(G.toLowerCase()==="s"||q.escape)X(!0),U(null),Y().catch((L)=>{U(L instanceof Error?L.message:"Failed to continue safely"),X(!1)})}),V1(u8,{flexDirection:"column",paddingX:1,children:[V1(Y2,{bold:!0,color:J.colors.warning,children:"Workspace review required"},void 0,!1,void 0,this),V1(Y2,{dimColor:!0,children:$.projectPath},void 0,!1,void 0,this),V1(u8,{marginTop:1,flexDirection:"column",children:[V1(Y2,{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)=>V1(Y2,{children:[" ",G.path," · ",G.effects.length," effect(s)"]},`${G.kind}:${G.path}`,!0,void 0,this))]},void 0,!0,void 0,this),K&&V1(u8,{marginTop:1,children:V1(Y2,{color:J.colors.error,children:K},void 0,!1,void 0,this)},void 0,!1,void 0,this),V1(u8,{marginTop:1,children:V1(Y2,{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 S7}from"ink";import{useEffect as v7}from"react";function DY(){let{stdout:$}=S7();v7(()=>{if(!$.isTTY)return;return $.write(u9),$.write(uQ),()=>{$.write(l9),$.write(uQ)}},[$])}function VY($){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 Z2}from"react/jsx-dev-runtime";function V7($){if(l0().config.actions.setConfig($),$.debug)console.log("[Debug] 模型配置检查通过,准备就绪");o0().setInitializationStatus("ready")}var AH=($)=>{DY();let[Q,Y]=d8(!1),[J,Z]=d8(null),[X,K]=d8(!1),[U,G]=d8(null),q=l8((z,b)=>{let N=z instanceof Error?z.message:String(z);if(o0().setInitializationError(N),o0().setInitializationStatus("error"),Y(!0),b)console.error("[FAIL] 应用初始化失败:",N)}),L=l8(async()=>{try{let z=l0().config.config??hY,b=EY(z,$);if(V7(b),b.resumeSessionId)gY().restoreSession(b.resumeSessionId,[]);if(b.debug)console.error("[Debug] 运行时配置:",b);let N=b.codeTheme;if(N&&a0.hasTheme(N)){if(a0.setTheme(N),$.debug)console.log(`[OK] 已加载主题: ${N}`)}try{q1.getInstance().loadConfig(b.hooks||{},d0());let T=await mY(d0());if($.debug&&b.hooks?.enabled)console.log("[OK] Hooks 系统已启用");if($.debug)console.log(`[OK] Workspace resources: ${T.subagents.getAllNames().length} agents, ${T.skills.size} skills, ${T.commands.getCommandCount()+T.commands.getPluginCommandCount()} commands, ${T.plugins.getAll().length} plugins`);let k=l0().session.sessionId;jY(k)}catch(A){if($.debug)console.warn("Hooks 初始化失败:",VY(A))}$8(async()=>{await cY.getInstance().killAll(),await pY.getInstance().disconnectAll(),q1.getInstance().cleanup()}),Y(!0)}catch(z){q(z,!!$.debug)}}),O=l8(async()=>{let z=await L4.getInstance().getStatus(d0());if(z.state==="untrusted"||z.state==="error"){G(z);return}await L()}),W=l8(async()=>{if($.versionCheckPromise){let z=await $.versionCheckPromise;if(z){Z(z),K(!0);return}}await O()});if(D7(()=>{W()},[]),X&&J)return Z2(k2,{children:Z2(kY,{versionInfo:J,onComplete:()=>{K(!1),O()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(U)return Z2(k2,{children:Z2(vY,{status:U,onTrust:async()=>{await L4.getInstance().trust(d0()),await xY(),G(null),await L()},onContinueSafely:async()=>{G(null),await L()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(!Q)return null;return Z2(k2,{children:Z2(TY,{...$},void 0,!1,void 0,this)},void 0,!1,void 0,this)};export{AH as AppWrapper};