blade-code 0.10.38 → 0.10.40

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 (87) hide show
  1. package/dist/blade.js +2 -2
  2. package/dist/{chunk-m0a2zdm8.js → chunk-03bzxkdg.js} +1 -1
  3. package/dist/chunk-0442z8f4.js +1 -0
  4. package/dist/{chunk-6aw2ts3m.js → chunk-0s11h8yd.js} +1 -1
  5. package/dist/{chunk-vxpj2jgx.js → chunk-1hea2ad2.js} +1 -1
  6. package/dist/chunk-2b4h0nb5.js +1 -0
  7. package/dist/{chunk-6t2bkj8s.js → chunk-2fgmsnh6.js} +1 -1
  8. package/dist/{chunk-gh0vdddb.js → chunk-34cexc50.js} +1 -1
  9. package/dist/{chunk-atdb1pks.js → chunk-3azdwanx.js} +1 -1
  10. package/dist/chunk-3nj2f0q9.js +2 -0
  11. package/dist/chunk-3w64mkc3.js +22 -0
  12. package/dist/{chunk-g7v01gjg.js → chunk-4dq8rbq2.js} +187 -187
  13. package/dist/{chunk-r863t0fx.js → chunk-4p8sp6p3.js} +1 -1
  14. package/dist/{chunk-9zfr1ydk.js → chunk-4wk9cc2b.js} +1 -1
  15. package/dist/{chunk-kzr5n83y.js → chunk-74jd1hcs.js} +57 -57
  16. package/dist/{chunk-gvx3707k.js → chunk-7qj2tbew.js} +1 -1
  17. package/dist/{chunk-jtjcg93t.js → chunk-8jexqfqg.js} +1 -1
  18. package/dist/{chunk-asqah231.js → chunk-8kqnezvc.js} +1 -1
  19. package/dist/{chunk-m3yb3rek.js → chunk-9dxkfqxg.js} +1 -1
  20. package/dist/{chunk-9yd3av82.js → chunk-9wxj0gxa.js} +1 -1
  21. package/dist/chunk-bqpqh6re.js +2 -0
  22. package/dist/{chunk-5xfef98g.js → chunk-dhcm8958.js} +1 -1
  23. package/dist/{chunk-0tdc8pg9.js → chunk-dhsdn91x.js} +1 -1
  24. package/dist/{chunk-tczrjn95.js → chunk-ew5dmar1.js} +2 -2
  25. package/dist/chunk-fa1gxd12.js +1 -0
  26. package/dist/{chunk-0dw58ycv.js → chunk-fk8jf873.js} +2 -2
  27. package/dist/{chunk-e6ttz45s.js → chunk-h188kz0p.js} +1 -1
  28. package/dist/{chunk-b9zfq3et.js → chunk-h7bat4ws.js} +1 -1
  29. package/dist/chunk-h9620q2d.js +1 -0
  30. package/dist/{chunk-rj1z55m8.js → chunk-hpqhk0jf.js} +1 -1
  31. package/dist/{chunk-y3sb4wda.js → chunk-k2hzhw9f.js} +1 -1
  32. package/dist/{chunk-a9r3w0t9.js → chunk-keart8yy.js} +2 -2
  33. package/dist/chunk-kpr5nqh2.js +5 -0
  34. package/dist/{chunk-aw4r1zhr.js → chunk-mc42kjv9.js} +2 -2
  35. package/dist/{chunk-ak37gg0n.js → chunk-np8f17zg.js} +1 -1
  36. package/dist/{chunk-kw543czm.js → chunk-nxc705wc.js} +1 -1
  37. package/dist/chunk-nzyc8z6k.js +6 -0
  38. package/dist/{chunk-cm4t4cz6.js → chunk-p504jme7.js} +2 -2
  39. package/dist/chunk-px491bge.js +1 -0
  40. package/dist/{chunk-921c6fm5.js → chunk-r01spp7a.js} +1 -1
  41. package/dist/{chunk-ydy9bvcp.js → chunk-rb1fv7en.js} +1 -1
  42. package/dist/{chunk-htvt9e1j.js → chunk-rs43m9d9.js} +4 -4
  43. package/dist/chunk-s3nz9qx8.js +1 -0
  44. package/dist/{chunk-qc5qwgpt.js → chunk-ts3pgkmz.js} +2 -2
  45. package/dist/chunk-v53vv0e9.js +6 -0
  46. package/dist/chunk-v85q852a.js +44 -0
  47. package/dist/{chunk-a1shhh83.js → chunk-vs7tcyse.js} +1 -1
  48. package/dist/{chunk-rfec0k27.js → chunk-vtb0m80j.js} +7 -7
  49. package/dist/chunk-vtdg5cb1.js +1 -0
  50. package/dist/chunk-vv0vk8bp.js +1 -0
  51. package/dist/chunk-w69qkark.js +1 -0
  52. package/dist/{chunk-199as76m.js → chunk-x6c6yqpx.js} +2 -2
  53. package/dist/chunk-xpmr9bf7.js +1 -0
  54. package/dist/{chunk-fj6frvhd.js → chunk-xtfy56qh.js} +1 -1
  55. package/dist/chunk-y10jqqyg.js +1 -0
  56. package/dist/{chunk-7t97xngf.js → chunk-ydz6bvs1.js} +48 -48
  57. package/dist/{chunk-e8wpd0s4.js → chunk-zfn7w33a.js} +1 -1
  58. package/dist/{chunk-jpzrwcm7.js → chunk-zv9jxwdp.js} +1 -1
  59. package/dist/web/assets/{ChatView-BB4nYdEf.js → ChatView-BP89vdT_.js} +14 -14
  60. package/dist/web/assets/{CodeBlockHighlighter-CAFugWXU.js → CodeBlockHighlighter-UnjC3KVk.js} +1 -1
  61. package/dist/web/assets/{FilePreview-O5aDfFS4.js → FilePreview-D0BiZowf.js} +1 -1
  62. package/dist/web/assets/{MarkdownRenderer-C_qekwq_.js → MarkdownRenderer-CPu_rkPT.js} +3 -3
  63. package/dist/web/assets/{SettingsModal-FADlD0Da.js → SettingsModal-CM9pcJas.js} +1 -1
  64. package/dist/web/assets/{TaskSwitcher-D3k3tRpI.js → TaskSwitcher-BOCm7kPO.js} +1 -1
  65. package/dist/web/assets/{TerminalPanel-DBmKVVbI.js → TerminalPanel-CUZ4slSS.js} +1 -1
  66. package/dist/web/assets/{index-CMIW4J1Q.js → index-CthLsVgC.js} +7 -7
  67. package/dist/web/assets/{session-events-Dk20sSDo.js → session-events-109FkhOM.js} +6 -6
  68. package/dist/web/index.html +2 -2
  69. package/package.json +1 -1
  70. package/dist/chunk-0b3fnxry.js +0 -22
  71. package/dist/chunk-13bzyvs2.js +0 -1
  72. package/dist/chunk-169rpaqn.js +0 -1
  73. package/dist/chunk-2mkdj63h.js +0 -1
  74. package/dist/chunk-4mpx8rad.js +0 -1
  75. package/dist/chunk-572gdsjd.js +0 -1
  76. package/dist/chunk-8xp6djrk.js +0 -1
  77. package/dist/chunk-ahkpjvaq.js +0 -2
  78. package/dist/chunk-fjpqxdct.js +0 -1
  79. package/dist/chunk-gc7bk6v0.js +0 -1
  80. package/dist/chunk-h4k801hr.js +0 -6
  81. package/dist/chunk-hcrfkqc1.js +0 -1
  82. package/dist/chunk-hkrbsqsw.js +0 -6
  83. package/dist/chunk-jd764yqg.js +0 -5
  84. package/dist/chunk-jtv91ez8.js +0 -2
  85. package/dist/chunk-n5nj8d8f.js +0 -1
  86. package/dist/chunk-ts8h7mx5.js +0 -44
  87. package/dist/chunk-vxxhd72z.js +0 -1
@@ -1,6 +1,6 @@
1
- import{b as aJ,c as iJ,d as oJ}from"./chunk-y3sb4wda.js";import{j as YJ,k as ZJ}from"./chunk-ak37gg0n.js";import{s as c8}from"./chunk-6t2bkj8s.js";import{B as KY,D as s2,E as a2,F as G6,L as j1,N as v4,O as S4,S as Y8,T as bJ,U as AJ,X as PJ,Y as RJ,ba as C6,ca as I6,da as qY,ea as x4,ga as u4,ia as W6,z as H6}from"./chunk-g7v01gjg.js";import{ma as D9,na as V9,oa as j9,ra as GY}from"./chunk-9yd3av82.js";import"./chunk-gh0vdddb.js";import{Ua as o4,Va as n4,ib as t4,rb as u2}from"./chunk-kzr5n83y.js";import{Ab as G8}from"./chunk-5cgyevqj.js";import{Tb as l4,Yb as k4,bc as f4,ic as j4,jc as x2,kc as h4,mc as V8,uc as J8,xc as P0}from"./chunk-gvx3707k.js";import"./chunk-qgez5vw6.js";import"./chunk-atdb1pks.js";import{Zc as dJ}from"./chunk-qggnvzkc.js";import{$c as x8,_c as K8,bd as T1}from"./chunk-r863t0fx.js";import"./chunk-0evyrnx0.js";import{Fd as m0,fd as I$,gd as r0,hd as Q$,id as yQ,jd as D$,kd as j8,ld as J9,md as dQ,nd as o9,od as Y9,pd as f$,qd as $1,rd as ZY,sd as a0,td as lJ,ud as P2,vd as Z8,yd as p4}from"./chunk-rfec0k27.js";import"./chunk-v508x7cg.js";import"./chunk-atsw605q.js";import"./chunk-jd764yqg.js";import{Qd as rQ}from"./chunk-ahkpjvaq.js";import"./chunk-3rjmkaey.js";import"./chunk-6aw2ts3m.js";import{$d as R6,ce as VJ,ie as wJ,oe as XY}from"./chunk-a1shhh83.js";import"./chunk-hq18c6r9.js";import"./chunk-zwt7f9ab.js";import"./chunk-ckfc7j7m.js";import{Ce as IQ,Ee as O1}from"./chunk-a9r3w0t9.js";import"./chunk-v11r4ahz.js";import{nf as JY,yf as BJ,zf as YY}from"./chunk-ts8h7mx5.js";import"./chunk-a7pvtxvz.js";import"./chunk-93jx06kq.js";import{Hf as V$,If as h8,Jf as TQ}from"./chunk-thstqcg3.js";import{Nf as l0}from"./chunk-6360fg4j.js";import"./chunk-jtv91ez8.js";import{Vf as QY,Yf as e1}from"./chunk-0dw58ycv.js";import{$f as QJ,_f as $J,cg as h1}from"./chunk-cm4t4cz6.js";import"./chunk-asqah231.js";import{og as l9}from"./chunk-aw4r1zhr.js";import{pg as $4}from"./chunk-tczrjn95.js";import"./chunk-m0a2zdm8.js";import"./chunk-qc5qwgpt.js";import{Bg as CQ}from"./chunk-jtjcg93t.js";import{useMemoizedFn as S2}from"ahooks";import{useEffect as pX,useState as D2}from"react";import{useMemoizedFn as t0}from"ahooks";import{Box as z$}from"ink";import{useEffect as _$,useMemo as DX,useRef as k2}from"react";import{useShallow as OY}from"zustand/react/shallow";import{useStore as UY}from"zustand";function s($){return UY(f$,$)}var zY=[],v$=()=>s(($)=>$.session.sessionId),I1=()=>s(($)=>$.session.workspaceRoot),Q4=()=>s(($)=>$.session.messages),J4=()=>s(($)=>$.session.clearCount),Y4=()=>s(($)=>$.session.isCompacting),Z4=()=>s(($)=>$.session.tokenUsage.estimatedCostUsd),X4=()=>s(($)=>$.session.providerRetry),G4=()=>s(($)=>$.session.providerStall),K4=()=>s(($)=>$.session.actionStationarity),n1=()=>s(($)=>$.session.actions),q4=()=>s(($)=>{let{inputTokens:Q,maxContextTokens:Y}=$.session.tokenUsage;if(Y<=0)return 100;let J=Math.max(0,100-Q/Y*100);return Math.round(J)}),U4=()=>s(($)=>$.app.initializationStatus),O4=()=>s(($)=>$.app.initializationError),R8=()=>s(($)=>$.app.activeModal),z4=()=>s(($)=>$.app.tasks),_4=()=>s(($)=>$.app.modelEditorTarget),N4=()=>s(($)=>$.app.sessionSelectorData),F4=()=>s(($)=>$.app.awaitingSecondCtrlC),t1=()=>s(($)=>$.app.actions),y8=()=>s(($)=>$.app.initializationStatus==="ready"),H4=()=>s(($)=>$.app.tasks.length>0),S$=()=>s(($)=>$.config.config?.permissionMode||"default"),W4=()=>s(($)=>$.config.config?.models??zY),M8=()=>s(($)=>{let Q=$.config.config;if(!Q)return;let Y=Q.currentModelId;return Q.models.find((Z)=>Z.id===Y)??Q.models[0]}),C8=()=>s(($)=>$.config.config?.currentModelId),A0=()=>s(($)=>{return r0.getTheme()}),L4=()=>s(($)=>$.config.config?.codeTheme??"default"),e0=()=>s(($)=>$.focus.currentFocus),B4=()=>s(($)=>$.focus.actions),s1=()=>s(($)=>$.command.isProcessing),w4=()=>s(($)=>$.command.actions),I8=()=>s(($)=>$.command.pendingCommands),b4=()=>s(($)=>$.command.recoveredSteeringCount),T8=()=>s(($)=>$.app.thinkingModeEnabled),k8=()=>s(($)=>$.app.reasoningEffort),f8=()=>s(($)=>$.app.serviceTier),v8=()=>s(($)=>$.app.responseVerbosity),S8=()=>s(($)=>$.app.communicationStyle),A4=()=>s(($)=>$.session.currentThinkingContent),P4=()=>s(($)=>$.session.thinkingExpanded),R4=()=>s(($)=>$.session.currentStreamingMessageId),y4=()=>s(OY(($)=>({lines:$.session.currentStreamingLines,tail:$.session.currentStreamingTail,lineCount:$.session.currentStreamingLineCount,version:$.session.currentStreamingVersion}))),M4=()=>s(($)=>$.session.finalizingStreamingMessageId),C4=()=>s(($)=>$.session.historyExpanded),I4=()=>s(($)=>$.session.expandedMessageCount);import{useMemoizedFn as h$}from"ahooks";import{useEffect as l8,useRef as i4}from"react";function _Y($){if(!($ instanceof Error))return"未知错误";let J=$.lastError??$;if(J.responseBody)try{let G=JSON.parse(J.responseBody)?.error?.message;if(G){let q=J.statusCode?` (HTTP ${J.statusCode})`:"";return`${G}${q}`}}catch{}let Z=$.message.match(/Last error:\s*(.+)$/);if(Z)return Z[1];return $.message}function NY($){if(!($ instanceof Error))return!1;return $.name==="AbortError"||$.message.includes("aborted")}function FY($){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 D8($){let Q=NY($),Y=FY($),J;if(Y)J="当前模型不支持图片理解功能。请切换到支持视觉能力的模型(如 Claude 4.5、GPT-5.2、Gemini 3 Pro、Qwen3-VL-Plus 等)后重试。";else J=_Y($);return{displayMessage:J,isAbort:Q,isVisionNotSupported:Y}}import{appendFileSync as HY,mkdirSync as WY,writeFileSync as LY}from"node:fs";import BY from"node:os";import h2 from"node:path";var T4=null;function wY(){let $=process.env.BLADE_STORAGE_ROOT||h2.join(BY.homedir(),".blade");return h2.join($,"logs","stream-debug.log")}function bY($){if(T4===$)return;let Q=h2.dirname($);WY(Q,{recursive:!0,mode:493}),LY($,`=== Stream Debug Log Started: ${new Date().toISOString()} ===
2
- `),T4=$}function E2($,Q,Y){try{let J=wY();bY(J);let Z=new Date().toISOString(),X=Y?` | ${JSON.stringify(Y)}`:"",G=`[${Z}] [${$}] ${Q}${X}
3
- `;HY(J,G)}catch{}}var Q8=e1("UI");function D4($,Q){let Y=!1;return(J)=>{switch(J.kind){case"content_delta":if(Y||$.signal.aborted)break;Q.contentDeltaCount++,Q.contentDeltaTotalLen+=J.delta.length,E2("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.setProviderRetry(null),$.sessionActions.setProviderStall(null),Q8.debug("[loopEventHandler] stream_end",{contentDeltaCount:Q.contentDeltaCount,contentDeltaTotalLen:Q.contentDeltaTotalLen,streamFinalized:Y,signalAborted:$.signal.aborted}),E2("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(),G=$.getStreamingMessageId();if(G){if(Z)D$(G,Z);j8(G)}$.sessionActions.finalizeStreamingMessage(Z,X),Y=!0;break}case"model_fallback":Y=!0,$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),$.streamingBuffer.resetStreamingBuffers(),$.sessionActions.discardStreamingMessage(),$.sessionActions.setCurrentThinkingContent(null);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"tool_start":{let Z=J.toolCall;if(!("function"in Z))break;if(Z.function.name===V8)break;if(Q8.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),G=v4(Z.function.name,X);$.sessionActions.addToolMessage(G,{toolCallId:Z.id,toolName:Z.function.name,phase:"start",summary:G,params:X})}catch(X){Q8.error("[loopEventHandler] onToolStart error:",X)}break}case"tool_progress":{let Z=J.toolCall;if(!("function"in Z))break;if(Z.function.name===V8)break;let X=J.update.total!==void 0?` ${Math.max(0,Math.min(100,Math.round((J.update.progress??0)/J.update.total*100)))}%`:"",G=`${Z.function.name}${X}: ${J.update.message}`;$.sessionActions.addToolMessage(G,{toolCallId:Z.id,toolName:Z.function.name,phase:"progress",summary:G,...J.update.admission?{admission:J.update.admission}:{}});break}case"tool_result":{let Z=J.toolCall;if(!("function"in Z))break;if(Z.function.name===V8)break;Q8.debug("[loopEventHandler] tool_result",{toolName:Z.function.name,success:J.result.success});let X=f4(S4(Z.function.name,J.result),k4);$.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":Q8.debug("[loopEventHandler] turn_start",{turn:J.turn,maxTurns:J.maxTurns}),$.sessionActions.updateTokenUsage({turnCount:J.turn}),$.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(`
1
+ import{b as iJ,c as nJ,d as tJ}from"./chunk-k2hzhw9f.js";import{j as XJ,k as GJ}from"./chunk-np8f17zg.js";import{s as x8}from"./chunk-2fgmsnh6.js";import{B as UY,D as e2,E as o2,F as q6,L as j1,N as D4,O as V4,S as Z8,T as PJ,U as RJ,X as yJ,Y as MJ,ba as T6,ca as k6,da as OY,ea as l4,ga as d4,ia as B6,z as L6}from"./chunk-4dq8rbq2.js";import{ma as j9,na as h9,oa as E9,ra as qY}from"./chunk-9wxj0gxa.js";import"./chunk-34cexc50.js";import{Ua as t4,Va as s4,ib as e4,rb as l2}from"./chunk-74jd1hcs.js";import{Ab as K8}from"./chunk-5cgyevqj.js";import{Tb as r4,Yb as S4,bc as v4,ic as E4,jc as u2,kc as g4,mc as j8,uc as Y8,xc as P0}from"./chunk-7qj2tbew.js";import"./chunk-qgez5vw6.js";import"./chunk-3azdwanx.js";import{Zc as aJ}from"./chunk-qggnvzkc.js";import{$c as u8,_c as q8,bd as T1}from"./chunk-4p8sp6p3.js";import"./chunk-0evyrnx0.js";import{Fd as m0,fd as I$,gd as r0,hd as Q$,id as MQ,jd as D$,kd as h8,ld as Z9,md as dQ,nd as t9,od as X9,pd as f$,qd as $1,rd as GY,sd as a0,td as rJ,ud as R2,vd as X8,yd as x4}from"./chunk-vtb0m80j.js";import"./chunk-v508x7cg.js";import"./chunk-atsw605q.js";import"./chunk-kpr5nqh2.js";import{Qd as rQ}from"./chunk-3nj2f0q9.js";import"./chunk-3rjmkaey.js";import"./chunk-0s11h8yd.js";import{$d as M6,ce as hJ,ie as AJ,oe as KY}from"./chunk-vs7tcyse.js";import"./chunk-hq18c6r9.js";import"./chunk-zwt7f9ab.js";import"./chunk-ckfc7j7m.js";import{Ce as TQ,Ee as O1}from"./chunk-keart8yy.js";import"./chunk-v11r4ahz.js";import{nf as ZY,yf as bJ,zf as XY}from"./chunk-v85q852a.js";import"./chunk-a7pvtxvz.js";import"./chunk-93jx06kq.js";import{Hf as V$,If as E8,Jf as kQ}from"./chunk-thstqcg3.js";import{Nf as l0}from"./chunk-6360fg4j.js";import"./chunk-bqpqh6re.js";import{fg as YY,ig as e1}from"./chunk-fk8jf873.js";import{kg as JJ,lg as YJ,og as h1}from"./chunk-p504jme7.js";import"./chunk-8kqnezvc.js";import{Ag as r9}from"./chunk-mc42kjv9.js";import{Bg as $4}from"./chunk-ew5dmar1.js";import"./chunk-03bzxkdg.js";import"./chunk-ts3pgkmz.js";import{Ng as IQ}from"./chunk-8jexqfqg.js";import{useMemoizedFn as D2}from"ahooks";import{useEffect as xX,useState as V2}from"react";import{useMemoizedFn as t0}from"ahooks";import{Box as z$}from"ink";import{useEffect as _$,useMemo as jX,useRef as f2}from"react";import{useShallow as _Y}from"zustand/react/shallow";import{useStore as zY}from"zustand";function n($){return zY(f$,$)}var NY=[],S$=()=>n(($)=>$.session.sessionId),I1=()=>n(($)=>$.session.workspaceRoot),Q4=()=>n(($)=>$.session.messages),J4=()=>n(($)=>$.session.clearCount),Y4=()=>n(($)=>$.session.isCompacting),Z4=()=>n(($)=>$.session.tokenUsage.estimatedCostUsd),X4=()=>n(($)=>$.session.providerCircuit),G4=()=>n(($)=>$.session.providerAdmission),K4=()=>n(($)=>$.session.providerRetry),q4=()=>n(($)=>$.session.providerStall),U4=()=>n(($)=>$.session.actionStationarity),n1=()=>n(($)=>$.session.actions),O4=()=>n(($)=>{let{inputTokens:Q,maxContextTokens:Y}=$.session.tokenUsage;if(Y<=0)return 100;let J=Math.max(0,100-Q/Y*100);return Math.round(J)}),z4=()=>n(($)=>$.app.initializationStatus),_4=()=>n(($)=>$.app.initializationError),y8=()=>n(($)=>$.app.activeModal),N4=()=>n(($)=>$.app.tasks),F4=()=>n(($)=>$.app.modelEditorTarget),H4=()=>n(($)=>$.app.sessionSelectorData),W4=()=>n(($)=>$.app.awaitingSecondCtrlC),t1=()=>n(($)=>$.app.actions),M8=()=>n(($)=>$.app.initializationStatus==="ready"),L4=()=>n(($)=>$.app.tasks.length>0),v$=()=>n(($)=>$.config.config?.permissionMode||"default"),B4=()=>n(($)=>$.config.config?.models??NY),C8=()=>n(($)=>{let Q=$.config.config;if(!Q)return;let Y=Q.currentModelId;return Q.models.find((Z)=>Z.id===Y)??Q.models[0]}),I8=()=>n(($)=>$.config.config?.currentModelId),A0=()=>n(($)=>{return r0.getTheme()}),w4=()=>n(($)=>$.config.config?.codeTheme??"default"),e0=()=>n(($)=>$.focus.currentFocus),b4=()=>n(($)=>$.focus.actions),s1=()=>n(($)=>$.command.isProcessing),A4=()=>n(($)=>$.command.actions),T8=()=>n(($)=>$.command.pendingCommands),P4=()=>n(($)=>$.command.recoveredSteeringCount),k8=()=>n(($)=>$.app.thinkingModeEnabled),f8=()=>n(($)=>$.app.reasoningEffort),S8=()=>n(($)=>$.app.serviceTier),v8=()=>n(($)=>$.app.responseVerbosity),D8=()=>n(($)=>$.app.communicationStyle),R4=()=>n(($)=>$.session.currentThinkingContent),y4=()=>n(($)=>$.session.thinkingExpanded),M4=()=>n(($)=>$.session.currentStreamingMessageId),C4=()=>n(_Y(($)=>({lines:$.session.currentStreamingLines,tail:$.session.currentStreamingTail,lineCount:$.session.currentStreamingLineCount,version:$.session.currentStreamingVersion}))),I4=()=>n(($)=>$.session.finalizingStreamingMessageId),T4=()=>n(($)=>$.session.historyExpanded),k4=()=>n(($)=>$.session.expandedMessageCount);import{useMemoizedFn as h$}from"ahooks";import{useEffect as d8,useRef as n4}from"react";function FY($){if(!($ instanceof Error))return"未知错误";let J=$.lastError??$;if(J.responseBody)try{let G=JSON.parse(J.responseBody)?.error?.message;if(G){let q=J.statusCode?` (HTTP ${J.statusCode})`:"";return`${G}${q}`}}catch{}let Z=$.message.match(/Last error:\s*(.+)$/);if(Z)return Z[1];return $.message}function HY($){if(!($ instanceof Error))return!1;return $.name==="AbortError"||$.message.includes("aborted")}function WY($){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 V8($){let Q=HY($),Y=WY($),J;if(Y)J="当前模型不支持图片理解功能。请切换到支持视觉能力的模型(如 Claude 4.5、GPT-5.2、Gemini 3 Pro、Qwen3-VL-Plus 等)后重试。";else J=FY($);return{displayMessage:J,isAbort:Q,isVisionNotSupported:Y}}import{appendFileSync as LY,mkdirSync as BY,writeFileSync as wY}from"node:fs";import bY from"node:os";import E2 from"node:path";var f4=null;function AY(){let $=process.env.BLADE_STORAGE_ROOT||E2.join(bY.homedir(),".blade");return E2.join($,"logs","stream-debug.log")}function PY($){if(f4===$)return;let Q=E2.dirname($);BY(Q,{recursive:!0,mode:493}),wY($,`=== Stream Debug Log Started: ${new Date().toISOString()} ===
2
+ `),f4=$}function g2($,Q,Y){try{let J=AY();PY(J);let Z=new Date().toISOString(),X=Y?` | ${JSON.stringify(Y)}`:"",G=`[${Z}] [${$}] ${Q}${X}
3
+ `;LY(J,G)}catch{}}var J8=e1("UI");function j4($,Q){let Y=!1;return(J)=>{switch(J.kind){case"content_delta":if(Y||$.signal.aborted)break;Q.contentDeltaCount++,Q.contentDeltaTotalLen+=J.delta.length,g2("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),J8.debug("[loopEventHandler] stream_end",{contentDeltaCount:Q.contentDeltaCount,contentDeltaTotalLen:Q.contentDeltaTotalLen,streamFinalized:Y,signalAborted:$.signal.aborted}),g2("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(),G=$.getStreamingMessageId();if(G){if(Z)D$(G,Z);h8(G)}$.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"tool_start":{let Z=J.toolCall;if(!("function"in Z))break;if(Z.function.name===j8)break;if(J8.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),G=D4(Z.function.name,X);$.sessionActions.addToolMessage(G,{toolCallId:Z.id,toolName:Z.function.name,phase:"start",summary:G,params:X})}catch(X){J8.error("[loopEventHandler] onToolStart error:",X)}break}case"tool_progress":{let Z=J.toolCall;if(!("function"in Z))break;if(Z.function.name===j8)break;let X=J.update.total!==void 0?` ${Math.max(0,Math.min(100,Math.round((J.update.progress??0)/J.update.total*100)))}%`:"",G=`${Z.function.name}${X}: ${J.update.message}`;$.sessionActions.addToolMessage(G,{toolCallId:Z.id,toolName:Z.function.name,phase:"progress",summary:G,...J.update.admission?{admission:J.update.admission}:{}});break}case"tool_result":{let Z=J.toolCall;if(!("function"in Z))break;if(Z.function.name===j8)break;J8.debug("[loopEventHandler] tool_result",{toolName:Z.function.name,success:J.result.success});let X=v4(V4(Z.function.name,J.result),S4);$.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":J8.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
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
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
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(`
@@ -8,19 +8,19 @@ import{b as aJ,c as iJ,d as oJ}from"./chunk-y3sb4wda.js";import{j as YJ,k as ZJ}
8
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
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
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((G)=>G.type==="text"?G.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 m2($){let{text:Q,parts:Y}=$,J=Y.filter((G)=>G.type==="image");if(J.length===0)return Q;if(J.length>V$)throw Error(`最多只能发送 ${V$} 张图片`);if(J.reduce((G,q)=>G+`data:${q.mimeType};base64,`.length+q.base64.length,0)>h8)throw Error("图片编码后总大小不能超过 5 MiB");let X=[];for(let G of Y)if(G.type==="text")X.push({type:"text",text:G.text});else X.push({type:"image_url",image_url:{url:`data:${G.mimeType};base64,${G.base64}`}});return X}function V4($){let Q=h4($.metadata);return{role:$.role,content:Q?j4(Q):$.content,...$.metadata?{metadata:$.metadata}:{}}}function E8($){if(!$.restoredContextMessages||$.restoredVisibleMessageCount<=0)return $.messages.map(V4);let Q=$.messages.slice($.restoredVisibleMessageCount).map(V4);return[...$.restoredContextMessages,...Q]}import AY from"node:path";function E4($){if($.length<=8)return $;return`${$.slice(0,8)}…`}function PY($){return AY.resolve($)}function g4($){if(!$||!p4($))return;$1().config.actions.updateConfig({currentModelId:$})}function m4($){if(!$)return;$1().config.actions.updateConfig({permissionMode:$})}async function g8($,Q){return P0.listSessions({includeSubagents:!1})}async function m8($,Q,Y,J){let{intent:Z,session:X,newSessionId:G,announceFork:q,permissionModeOverride:K}=$,U=PY(X.projectPath);if(Z==="fork"){let z=await P0.forkSession(X.sessionId,{...G?{newSessionId:G}:{},sourceProjectPath:U,targetProjectPath:U}),B=await P0.loadSessionModelContext(z.sessionId,z.metadata.projectPath),_=[...P0.toUISafeMessages(z.messages)];if(q!==!1){let H=Date.parse(z.metadata.lastMessageTime);_.push({id:"fork-announcement-"+z.sessionId,role:"assistant",content:"Forked "+E4(X.sessionId)+" → "+E4(z.sessionId),timestamp:Number.isNaN(H)?0:H})}return await J(),m4(K??z.metadata.permissionMode),g4(z.metadata.selectedModelId),Y.restoreSession(z.sessionId,_,B,z.metadata.projectPath),{sessionId:z.sessionId,messages:B}}await P0.assertSessionWritable(X.sessionId,X.projectPath);let[F,O]=await Promise.all([P0.loadSession(X.sessionId,X.projectPath),P0.loadSessionModelContext(X.sessionId,X.projectPath)]),W=P0.toUISafeMessages(F);return await J(),m4(K??X.permissionMode),g4(X.selectedModelId),Y.restoreSession(X.sessionId,W,O,X.projectPath),{sessionId:X.sessionId,messages:O}}function c4($){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 RY($){return typeof $==="object"&&$!==null&&$.action==="invoke_skill"&&typeof $.skillName==="string"}function yY($){return typeof $==="object"&&$!==null&&$.action==="invoke_custom_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function MY($){return typeof $==="object"&&$!==null&&$.action==="invoke_plugin_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function CY($){return typeof $==="object"&&$!==null&&$.action==="invoke_once_model"&&typeof $.modelId==="string"&&typeof $.prompt==="string"}function IY($){return typeof $==="object"&&$!==null&&["start_goal","resume_goal"].includes(String($.action))&&typeof $.goal?.objective==="string"}function TY($){return typeof $==="object"&&$!==null&&$.action==="rewind_session"&&typeof $.sessionId==="string"&&Array.isArray($.messages)&&Array.isArray($.visibleMessages)}function kY($){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)=>c4(Z))}if(Y==="activate_session")return c4($.session);return!1}function fY($,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} 已归档。`:"当前会话已归档。"),T1(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 T1(0),!0;default:return!1}}async function p2($,Q,Y,J,Z,X,G,q,K,U,F,O,W,z,B=l0(),_){let{text:H}=$;if(!x4(H))return{type:"not_slash"};let N=await u4(H,{cwd:B,surface:"tui",workspaceRoot:B,sessionId:X,messages:G,rewind:q,lifecycle:X===void 0?void 0:{archiveCurrent:async()=>{return await Z(),P0.archiveSession(X,B)}},subagents:K,mcp:U,reasoning:F,serviceTier:O,responseVerbosity:W,communicationStyle:z,codeReview:_,signal:J});if(N.success&&kY(N.data)){if(N.data.action==="select_session")return Q.showSessionSelector(N.data.sessions,N.data.intent),{type:"handled",commandResult:{success:!0}};return await m8(N.data,B,Y,Z),{type:"handled",commandResult:{success:!0}}}if(N.success&&TY(N.data))return Y.restoreSession(N.data.sessionId,N.data.visibleMessages,N.data.messages),Q.setTasks([]),{type:"handled",commandResult:{success:!0}};if(N.message){if(fY(N.message,N.data,Q,Y))return{type:"handled",commandResult:{success:!0}}}if(RY(N.data)){let{skillName:M,skillArgs:w}=N.data,k=w?`Please use the "${M}" skill to help me with: ${w}`:`Please use the "${M}" skill.`;return Y.addUserMessage(k),{type:"continue_as_agent",result:{userDisplayMessage:k,agentInput:{displayText:k,text:k,images:[],parts:[{type:"text",text:k}]},userMessageAlreadyAdded:!0}}}if(yY(N.data)){let{commandName:M,processedContent:w}=N.data;Y.addUserMessage(H);let k=`# Custom Command: /${M}
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 p2($){let{text:Q,parts:Y}=$,J=Y.filter((G)=>G.type==="image");if(J.length===0)return Q;if(J.length>V$)throw Error(`最多只能发送 ${V$} 张图片`);if(J.reduce((G,q)=>G+`data:${q.mimeType};base64,`.length+q.base64.length,0)>E8)throw Error("图片编码后总大小不能超过 5 MiB");let X=[];for(let G of Y)if(G.type==="text")X.push({type:"text",text:G.text});else X.push({type:"image_url",image_url:{url:`data:${G.mimeType};base64,${G.base64}`}});return X}function h4($){let Q=g4($.metadata);return{role:$.role,content:Q?E4(Q):$.content,...$.metadata?{metadata:$.metadata}:{}}}function g8($){if(!$.restoredContextMessages||$.restoredVisibleMessageCount<=0)return $.messages.map(h4);let Q=$.messages.slice($.restoredVisibleMessageCount).map(h4);return[...$.restoredContextMessages,...Q]}import RY from"node:path";function m4($){if($.length<=8)return $;return`${$.slice(0,8)}…`}function yY($){return RY.resolve($)}function p4($){if(!$||!x4($))return;$1().config.actions.updateConfig({currentModelId:$})}function c4($){if(!$)return;$1().config.actions.updateConfig({permissionMode:$})}async function m8($,Q){return P0.listSessions({includeSubagents:!1})}async function p8($,Q,Y,J){let{intent:Z,session:X,newSessionId:G,announceFork:q,permissionModeOverride:K}=$,U=yY(X.projectPath);if(Z==="fork"){let z=await P0.forkSession(X.sessionId,{...G?{newSessionId:G}:{},sourceProjectPath:U,targetProjectPath:U}),w=await P0.loadSessionModelContext(z.sessionId,z.metadata.projectPath),_=[...P0.toUISafeMessages(z.messages)];if(q!==!1){let F=Date.parse(z.metadata.lastMessageTime);_.push({id:"fork-announcement-"+z.sessionId,role:"assistant",content:"Forked "+m4(X.sessionId)+" → "+m4(z.sessionId),timestamp:Number.isNaN(F)?0:F})}return await J(),c4(K??z.metadata.permissionMode),p4(z.metadata.selectedModelId),Y.restoreSession(z.sessionId,_,w,z.metadata.projectPath),{sessionId:z.sessionId,messages:w}}await P0.assertSessionWritable(X.sessionId,X.projectPath);let[W,O]=await Promise.all([P0.loadSession(X.sessionId,X.projectPath),P0.loadSessionModelContext(X.sessionId,X.projectPath)]),H=P0.toUISafeMessages(W);return await J(),c4(K??X.permissionMode),p4(X.selectedModelId),Y.restoreSession(X.sessionId,H,O,X.projectPath),{sessionId:X.sessionId,messages:O}}function u4($){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 MY($){return typeof $==="object"&&$!==null&&$.action==="invoke_skill"&&typeof $.skillName==="string"}function CY($){return typeof $==="object"&&$!==null&&$.action==="invoke_custom_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function IY($){return typeof $==="object"&&$!==null&&$.action==="invoke_plugin_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function TY($){return typeof $==="object"&&$!==null&&$.action==="invoke_once_model"&&typeof $.modelId==="string"&&typeof $.prompt==="string"}function kY($){return typeof $==="object"&&$!==null&&["start_goal","resume_goal"].includes(String($.action))&&typeof $.goal?.objective==="string"}function fY($){return typeof $==="object"&&$!==null&&$.action==="rewind_session"&&typeof $.sessionId==="string"&&Array.isArray($.messages)&&Array.isArray($.visibleMessages)}function SY($){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)=>u4(Z))}if(Y==="activate_session")return u4($.session);return!1}function vY($,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} 已归档。`:"当前会话已归档。"),T1(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 T1(0),!0;default:return!1}}async function c2($,Q,Y,J,Z,X,G,q,K,U,W,O,H,z,w=l0(),_){let{text:F}=$;if(!l4(F))return{type:"not_slash"};let N=await d4(F,{cwd:w,surface:"tui",workspaceRoot:w,sessionId:X,messages:G,rewind:q,lifecycle:X===void 0?void 0:{archiveCurrent:async()=>{return await Z(),P0.archiveSession(X,w)}},subagents:K,mcp:U,reasoning:W,serviceTier:O,responseVerbosity:H,communicationStyle:z,codeReview:_,signal:J});if(N.success&&SY(N.data)){if(N.data.action==="select_session")return Q.showSessionSelector(N.data.sessions,N.data.intent),{type:"handled",commandResult:{success:!0}};return await p8(N.data,w,Y,Z),{type:"handled",commandResult:{success:!0}}}if(N.success&&fY(N.data))return Y.restoreSession(N.data.sessionId,N.data.visibleMessages,N.data.messages),Q.setTasks([]),{type:"handled",commandResult:{success:!0}};if(N.message){if(vY(N.message,N.data,Q,Y))return{type:"handled",commandResult:{success:!0}}}if(MY(N.data)){let{skillName:M,skillArgs:B}=N.data,k=B?`Please use the "${M}" skill to help me with: ${B}`:`Please use the "${M}" skill.`;return Y.addUserMessage(k),{type:"continue_as_agent",result:{userDisplayMessage:k,agentInput:{displayText:k,text:k,images:[],parts:[{type:"text",text:k}]},userMessageAlreadyAdded:!0}}}if(CY(N.data)){let{commandName:M,processedContent:B}=N.data;Y.addUserMessage(F);let k=`# Custom Command: /${M}
12
12
 
13
13
  The user has invoked the custom command "/${M}". Follow the instructions below to complete the task.
14
14
 
15
15
  ---
16
16
 
17
- ${w}
17
+ ${B}
18
18
 
19
19
  ---
20
20
 
21
- Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:H,agentInput:{displayText:H,text:k,images:[],parts:[{type:"text",text:k}]},userMessageAlreadyAdded:!0}}}if(MY(N.data)){let{commandName:M,pluginName:w,processedContent:k}=N.data;Y.addUserMessage(H);let P=`# Plugin Command: /${M}
21
+ Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:F,agentInput:{displayText:F,text:k,images:[],parts:[{type:"text",text:k}]},userMessageAlreadyAdded:!0}}}if(IY(N.data)){let{commandName:M,pluginName:B,processedContent:k}=N.data;Y.addUserMessage(F);let P=`# Plugin Command: /${M}
22
22
 
23
- The user has invoked the plugin command "/${M}" from plugin "${w}". Follow the instructions below to complete the task.
23
+ The user has invoked the plugin command "/${M}" from plugin "${B}". Follow the instructions below to complete the task.
24
24
 
25
25
  ---
26
26
 
@@ -28,16 +28,16 @@ ${k}
28
28
 
29
29
  ---
30
30
 
31
- Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:H,agentInput:{displayText:H,text:P,images:[],parts:[{type:"text",text:P}]},userMessageAlreadyAdded:!0}}}if(CY(N.data)){let{modelId:M,prompt:w}=N.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:M}}}if(IY(N.data)){let M=N.data.goal.objective;return Y.addUserMessage(H),{type:"continue_as_agent",result:{userDisplayMessage:H,agentInput:{displayText:H,text:M,images:[],parts:[{type:"text",text:M}]},userMessageAlreadyAdded:!0,goalContinuationOnly:!0}}}if(!N.success&&N.error)return Y.addAssistantMessage(`${N.error}`),{type:"handled",commandResult:{success:N.success,output:N.message,error:N.error,metadata:N.data}};let v=N.message;if(N.success&&typeof v==="string"&&v.trim()!=="")Y.addAssistantMessage(v);return{type:"handled",commandResult:{success:N.success,output:N.message,error:N.error,metadata:N.data}}}import{useMemoizedFn as y0}from"ahooks";import{useEffect as vY,useRef as p8}from"react";function d4($){let Q=p8(void 0),Y=p8(void 0),J=p8(void 0),Z=p8(void 0),X=y0(async()=>{if(Z.current)return Z.current;let I=Q.current,R=Y.current;if(!I&&!R)return;Q.current=void 0,Y.current=void 0,J.current=void 0;let S=(async()=>{try{await I?.destroy()}finally{await R?.dispose()}})();Z.current=S;try{await S}finally{if(Z.current===S)Z.current=void 0}}),G=y0(async(I)=>{let R=$.workspaceRoot??Y.current?.workspaceRoot??l0();if(Y.current&&(Y.current.sessionId!==I||Y.current.workspaceRoot!==R))await X();if(!Y.current){let S=await P0.findSessionMetadata(I,R),b=S!==void 0&&(await P0.loadSession(I,R)).length>0;Y.current=await j1.create({sessionId:I,workspaceRoot:R,modelId:$.modelId,permissionMode:$.permissionMode??S?.permissionMode,reasoningEffort:S?.reasoningEffort??$.reasoningEffort,serviceTier:S?.serviceTier??$.serviceTier,responseVerbosity:S?.responseVerbosity??$.responseVerbosity,communicationStyle:S?.communicationStyle??$.communicationStyle,communicationStyleDigest:S?.communicationStyleDigest,agents:$.agents,...b?{sessionStart:{isResume:!0,resumeSessionId:I}}:{}});try{J.current={sessionId:I,modelId:S?.selectedModelId,permissionMode:S?.permissionMode,reasoningEffort:S?.reasoningEffort,serviceTier:S?.serviceTier,responseVerbosity:S?.responseVerbosity,communicationStyle:S?.communicationStyle,communicationStyleDigest:S?.communicationStyleDigest},a0().setReasoningEffort(Y.current.getReasoningConfiguration().selection),a0().setServiceTier(Y.current.getServiceTierConfiguration().selection),a0().setResponseVerbosity(Y.current.getResponseVerbosityConfiguration().selection),a0().setCommunicationStyle(Y.current.getCommunicationStyleConfiguration().selection)}catch(V){let p=Y.current;throw Y.current=void 0,await p.dispose().catch(()=>{return}),V}}return Y.current}),q=y0(async(I)=>{let R=I?.sessionId??$.sessionId,S=!!I?.modelId&&I.modelId!==$.modelId,b;if(!S&&R){let V=Y.current!==void 0,p=await G(R),j=I?.modelId??$.modelId,E=I?.reasoningEffort??(V?$.reasoningEffort:p.getReasoningConfiguration().selection),m=I?.serviceTier??(V?$.serviceTier:p.getServiceTierConfiguration().selection),X0=I?.responseVerbosity??(V?$.responseVerbosity:p.getResponseVerbosityConfiguration().selection),J0=I?.communicationStyle??(V?$.communicationStyle:p.getCommunicationStyleConfiguration().selection),w0=p.getCurrentModelId(),k0=p.getReasoningConfiguration(),c0=p.getServiceTierConfiguration(),h0=p.getResponseVerbosityConfiguration(),H1=p.getCommunicationStyleConfiguration();if($.permissionMode&&(J.current?.sessionId!==R||J.current.permissionMode!==$.permissionMode)){let s0=await P0.setSessionPermissionMode(R,p.workspaceRoot,$.permissionMode);J.current={...J.current,sessionId:R,permissionMode:s0.permissionMode}}await p.refresh({modelId:j,...E?{reasoningEffort:E}:{},...m?{serviceTier:m}:{},...X0?{responseVerbosity:X0}:{},...J0?{communicationStyle:J0}:{}});let C1=p.getCommunicationStyleConfiguration();if(C1.source!=="built-in"&&!C1.contentSha256)throw Error("Custom communication style has no provenance");let k$={...j&&j!=="inherit"&&(J.current?.sessionId!==R||J.current.modelId!==j)?{selectedModelId:j}:{},...E&&(J.current?.sessionId!==R||J.current.reasoningEffort!==E)?{reasoningEffort:E}:{},...m&&(J.current?.sessionId!==R||J.current.serviceTier!==m)?{serviceTier:m}:{},...X0&&(J.current?.sessionId!==R||J.current.responseVerbosity!==X0)?{responseVerbosity:X0}:{},...J0&&(J.current?.sessionId!==R||J.current.communicationStyle!==J0||J.current.communicationStyleDigest!==C1.contentSha256)?{communicationStyle:J0,communicationStyleDigest:C1.source==="built-in"?null:C1.contentSha256}:{}};if(Object.keys(k$).length>0)try{let s0=await P0.updateSessionMetadata(R,p.workspaceRoot,k$);J.current={sessionId:R,modelId:s0.selectedModelId,permissionMode:s0.permissionMode,reasoningEffort:s0.reasoningEffort,serviceTier:s0.serviceTier,responseVerbosity:s0.responseVerbosity,communicationStyle:s0.communicationStyle,communicationStyleDigest:s0.communicationStyleDigest}}catch(s0){throw await p.refresh({...w0?{modelId:w0}:{},reasoningEffort:k0.selection,serviceTier:c0.selection,responseVerbosity:h0.selection,communicationStyle:H1.selection}).catch(()=>{return}),s0}b=await Y8.createWithRuntime(p,{sessionId:R,systemPrompt:I?.systemPrompt??$.systemPrompt,appendSystemPrompt:I?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:I?.maxTurns??$.maxTurns,modelId:I?.modelId??$.modelId,permissionMode:I?.permissionMode??$.permissionMode,agents:$.agents})}else b=await Y8.create({systemPrompt:I?.systemPrompt??$.systemPrompt,appendSystemPrompt:I?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:I?.maxTurns??$.maxTurns,modelId:I?.modelId??$.modelId,permissionMode:I?.permissionMode??$.permissionMode,agents:$.agents});return Q.current=b,b}),K=y0(async()=>{if(!$.sessionId)throw Error("No active session to rewind");return(await G($.sessionId)).listRewindCheckpoints()}),U=y0(async(I)=>{if(!$.sessionId)throw Error("No active session to rewind");let S=await(await G($.sessionId)).rewindSession(I);return await X(),S}),F=y0(async()=>{if(!$.sessionId)throw Error("No active session for subagent control");return(await G($.sessionId)).listSubagents()}),O=y0(async(I,R)=>{if(!$.sessionId)throw Error("No active session for subagent control");let S=await G($.sessionId),b=!1,V,p=I,j=(m)=>{f$.getState().app.actions.completeSubagentProgress(p,m.status==="completed")},E=S.resumeSubagent({agentId:I,prompt:R,onEvent:(m)=>{if(m.kind==="tool_start"&&"function"in m.toolCall)f$.getState().app.actions.updateSubagentTool(p,m.toolCall.function.name)},onCompleted:(m)=>{if(b)j(m);else V=m}});if(p=E.session.id,f$.getState().app.actions.startSubagentProgress(E.session.id,E.session.subagentType,`Resumed from ${E.source.id}: ${E.session.description}`),b=!0,V)j(V);return E}),W=y0(async()=>{if(!$.sessionId)throw Error("No active session for MCP content");return(await G($.sessionId)).getMcpContentCatalog()}),z=y0(async(I)=>{if(!$.sessionId)throw Error("No active session for MCP content");await(await G($.sessionId)).refreshMcpContentCatalogs(I)}),B=y0(async(I,R,S)=>{if(!$.sessionId)throw Error("No active session for MCP prompts");return(await G($.sessionId)).getMcpPrompt(I,R,S)}),_=y0(async(I,R,S)=>{if(!$.sessionId)throw Error("No active session for MCP completion");return(await G($.sessionId)).completeMcpArgument(I,R,S)}),H=y0(async(I,R={})=>{if(!$.sessionId)throw Error("No active session for MCP logs");return(await G($.sessionId)).getMcpLogs(I,R)}),C=y0(async(I)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await G($.sessionId)).listMcpTasks(I)}),N=y0(async(I)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await G($.sessionId)).getMcpTask(I)}),v=y0(async(I,R)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await G($.sessionId)).cancelMcpTask(I,R)}),M=y0(async(I,R)=>{if(!$.sessionId)throw Error("No active session for MCP logging");await(await G($.sessionId)).setMcpLoggingLevel(I,R)}),w=y0(async()=>{if(!$.sessionId)throw Error("No active session for MCP instructions");return(await G($.sessionId)).getMcpInstructions()}),k=y0(async()=>{if(!$.sessionId)throw Error("No active session for reasoning effort");return(await G($.sessionId)).getReasoningConfiguration()}),P=y0(async(I)=>{if(!$.sessionId)throw Error("No active session for reasoning effort");let R=await G($.sessionId);if(R.hasTurnOwner())throw Error("Cannot switch reasoning effort while a turn is active");let S=R.getReasoningConfiguration();if(R.resolveReasoningConfiguration(I),S.selection===I)return S;await R.refresh({reasoningEffort:I});try{let b;try{b=await P0.updateSessionMetadata($.sessionId,R.workspaceRoot,{reasoningEffort:I})}catch(V){if(!(V instanceof J8)&&V.code!=="ENOENT")throw V;b=await P0.createSessionMetadata($.sessionId,R.workspaceRoot,{taskStatus:"completed",selectedModelId:R.getCurrentModelId(),reasoningEffort:I,serviceTier:R.getServiceTierConfiguration().selection,responseVerbosity:R.getResponseVerbosityConfiguration().selection,communicationStyle:R.getCommunicationStyleConfiguration().selection})}return J.current={sessionId:$.sessionId,modelId:b.selectedModelId,permissionMode:b.permissionMode,reasoningEffort:b.reasoningEffort,serviceTier:b.serviceTier,responseVerbosity:b.responseVerbosity,communicationStyle:b.communicationStyle,communicationStyleDigest:b.communicationStyleDigest},a0().setReasoningEffort(I),R.getReasoningConfiguration()}catch(b){throw await R.refresh({reasoningEffort:S.selection}),b}}),A=y0(async()=>{if(!$.sessionId)throw Error("No active session for service tier");return(await G($.sessionId)).getServiceTierConfiguration()}),T=y0(async(I)=>{if(!$.sessionId)throw Error("No active session for service tier");let R=await G($.sessionId);if(R.hasTurnOwner())throw Error("Cannot switch service tier while a turn is active");let S=R.getServiceTierConfiguration();if(R.resolveServiceTierConfiguration(I),S.selection===I)return S;await R.refresh({serviceTier:I});try{let b;try{b=await P0.updateSessionMetadata($.sessionId,R.workspaceRoot,{serviceTier:I})}catch(V){if(!(V instanceof J8)&&V.code!=="ENOENT")throw V;b=await P0.createSessionMetadata($.sessionId,R.workspaceRoot,{taskStatus:"completed",selectedModelId:R.getCurrentModelId(),reasoningEffort:R.getReasoningConfiguration().selection,serviceTier:I,responseVerbosity:R.getResponseVerbosityConfiguration().selection,communicationStyle:R.getCommunicationStyleConfiguration().selection})}return J.current={sessionId:$.sessionId,modelId:b.selectedModelId,permissionMode:b.permissionMode,reasoningEffort:b.reasoningEffort,serviceTier:b.serviceTier,responseVerbosity:b.responseVerbosity,communicationStyle:b.communicationStyle,communicationStyleDigest:b.communicationStyleDigest},a0().setServiceTier(I),R.getServiceTierConfiguration()}catch(b){throw await R.refresh({serviceTier:S.selection}),b}}),y=y0(async()=>{if(!$.sessionId)throw Error("No active session for response verbosity");return(await G($.sessionId)).getResponseVerbosityConfiguration()}),L=y0(async(I)=>{if(!$.sessionId)throw Error("No active session for response verbosity");let R=await G($.sessionId);if(R.hasTurnOwner())throw Error("Cannot switch response verbosity while a turn is active");let S=R.getResponseVerbosityConfiguration();if(R.resolveResponseVerbosityConfiguration(I),S.selection===I)return S;await R.refresh({responseVerbosity:I});try{let b;try{b=await P0.updateSessionMetadata($.sessionId,R.workspaceRoot,{responseVerbosity:I})}catch(V){if(!(V instanceof J8)&&V.code!=="ENOENT")throw V;b=await P0.createSessionMetadata($.sessionId,R.workspaceRoot,{taskStatus:"completed",selectedModelId:R.getCurrentModelId(),reasoningEffort:R.getReasoningConfiguration().selection,serviceTier:R.getServiceTierConfiguration().selection,responseVerbosity:I,communicationStyle:R.getCommunicationStyleConfiguration().selection})}return J.current={sessionId:$.sessionId,modelId:b.selectedModelId,permissionMode:b.permissionMode,reasoningEffort:b.reasoningEffort,serviceTier:b.serviceTier,responseVerbosity:b.responseVerbosity,communicationStyle:b.communicationStyle,communicationStyleDigest:b.communicationStyleDigest},a0().setResponseVerbosity(I),R.getResponseVerbosityConfiguration()}catch(b){throw await R.refresh({responseVerbosity:S.selection}),b}}),f=y0(async()=>{if(!$.sessionId)throw Error("No active session for communication style");return(await G($.sessionId)).getCommunicationStyleConfiguration()}),h=y0(async(I)=>{if(!$.sessionId)throw Error("No active session for communication style");let R=await G($.sessionId);if(R.hasTurnOwner())throw Error("Cannot switch communication style while a turn is active");let S=R.getCommunicationStyleConfiguration(),b=R.resolveCommunicationStyleConfiguration(I);if(b.source!=="built-in"&&!b.contentSha256)throw Error("Custom communication style has no provenance");if(S.selection===I)return S;await R.refresh({communicationStyle:I});try{let V;try{V=await P0.updateSessionMetadata($.sessionId,R.workspaceRoot,{communicationStyle:I,communicationStyleDigest:b.source==="built-in"?null:b.contentSha256})}catch(p){if(!(p instanceof J8)&&p.code!=="ENOENT")throw p;V=await P0.createSessionMetadata($.sessionId,R.workspaceRoot,{taskStatus:"completed",selectedModelId:R.getCurrentModelId(),reasoningEffort:R.getReasoningConfiguration().selection,serviceTier:R.getServiceTierConfiguration().selection,responseVerbosity:R.getResponseVerbosityConfiguration().selection,communicationStyle:I,...b.source!=="built-in"&&b.contentSha256?{communicationStyleDigest:b.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},a0().setCommunicationStyle(I),R.getCommunicationStyleConfiguration()}catch(V){throw await R.refresh({communicationStyle:S.selection}),V}}),t=y0(async(I)=>{if(!Y.current)return{accepted:!1,queued:0,reason:"no_active_turn"};return Y.current.enqueueSteering(I,{allowBeforeTurn:!0})}),l=y0(async(I,R)=>{let S=$.sessionId;if(!S)throw Error("User shell command requires a Session");return(await G(S)).executeUserShellCommand(I,R)}),a=y0(async(I,R)=>{let S=$.sessionId;if(!S)throw Error("Code review requires a Session");let b=await G(S);await c8.recoverInterrupted(b.workspaceRoot,S,b);let V=await c8.start({sessionId:S,projectPath:b.workspaceRoot,runtime:b,request:I,signal:R}),p=await V.completion,j=(await c8.list(b.workspaceRoot,S)).find((E)=>E.start.reviewId===V.reviewId);if(!j)throw Error(`Review not found after completion: ${V.reviewId}`);return{reviewId:V.reviewId,status:p.status,findings:p.findings.length,content:l4(j.start,p)}});return vY(()=>{let I=x8(X);return()=>{I(),X().catch(()=>{return})}},[X]),{agentRef:Q,createAgent:q,cleanupAgent:X,steerActiveTurn:t,runCodeReview:a,executeUserShellCommand:l,listRewindCheckpoints:K,rewindSession:U,listSubagents:F,resumeSubagent:O,getMcpContentCatalog:W,refreshMcpContentCatalogs:z,getMcpPrompt:B,completeMcpArgument:_,listMcpTasks:C,getMcpTask:N,cancelMcpTask:v,getMcpLogs:H,setMcpLoggingLevel:M,getMcpInstructions:w,getReasoningConfiguration:k,setReasoningEffort:P,getServiceTierConfiguration:A,setServiceTier:T,getResponseVerbosityConfiguration:y,setResponseVerbosity:L,getCommunicationStyleConfiguration:f,setCommunicationStyle:h}}import{useMemoizedFn as j$}from"ahooks";import{useEffect as SY,useRef as u8}from"react";function r4($){let Q=0;for(let Y of $)if(Y===`
32
- `)Q++;return Q}function a4($,Q){let Y=Q?.flushTimeout??300,J=Q?.minLinesToFlush??5,Z=Q?.minCharsToFlush??400,X=u8(""),G=u8(null),q=u8(""),K=u8(null),U=j$(()=>{if(X.current){let _=X.current,H=$.appendAssistantContent(_);D$(H,_),X.current=""}if(G.current)clearTimeout(G.current),G.current=null}),F=j$(()=>{if(q.current)$.appendThinkingContent(q.current),q.current="";if(K.current)clearTimeout(K.current),K.current=null}),O=j$((_)=>{X.current+=_;let H=X.current;if(r4(H)>=J||H.length>=Z){U();return}if(!G.current)G.current=setTimeout(U,Y)}),W=j$((_)=>{q.current+=_;let H=q.current;if(r4(H)>=J||H.length>=Z){F();return}if(!K.current)K.current=setTimeout(F,Y)}),z=j$(()=>{if(X.current="",G.current)clearTimeout(G.current),G.current=null;if(q.current="",K.current)clearTimeout(K.current),K.current=null}),B=j$(()=>{if(G.current)clearTimeout(G.current),G.current=null;if(K.current)clearTimeout(K.current),K.current=null;let _=X.current,H=q.current;return X.current="",q.current="",{extraContent:_,extraThinking:H}});return SY(()=>{return()=>{z()}},[z]),{batchAppendContent:O,batchAppendThinking:W,flushContentBuffer:U,flushThinkingBuffer:F,resetStreamingBuffers:z,drainPendingBuffers:B}}var c2=e1("UI"),s4=($,Q,Y,J,Z,X)=>{let G=s1(),q=v$(),K=I1(),U=C8(),F=S$(),O=T8(),W=k8(),z=f8(),B=v8(),_=S8(),H=n1(),C=t1(),N=w4(),v=i4(!1),M=i4(!1),{createAgent:w,cleanupAgent:k,steerActiveTurn:P,listRewindCheckpoints:A,rewindSession:T,listSubagents:y,resumeSubagent:L,getMcpContentCatalog:f,refreshMcpContentCatalogs:h,getMcpPrompt:t,completeMcpArgument:l,listMcpTasks:a,getMcpTask:I,cancelMcpTask:R,getMcpLogs:S,setMcpLoggingLevel:b,getMcpInstructions:V,getReasoningConfiguration:p,setReasoningEffort:j,getServiceTierConfiguration:E,setServiceTier:m,getResponseVerbosityConfiguration:X0,setResponseVerbosity:J0,getCommunicationStyleConfiguration:w0,setCommunicationStyle:k0,runCodeReview:c0,executeUserShellCommand:h0}=d4({sessionId:q,workspaceRoot:K,systemPrompt:$,appendSystemPrompt:Q,maxTurns:J,modelId:U,permissionMode:F,reasoningEffort:W,serviceTier:z,responseVerbosity:B,communicationStyle:_,agents:X}),H1=a4(H),C1=h$(async(q0,R0)=>{if(q0.images.length>0)return{success:!1,error:"User shell commands do not accept image attachments"};let Q0=q0.text.trimStart().slice(1).trim();if(!Q0)return{success:!1,error:"User shell command cannot be empty"};H.setCommand(`! ${Q0}`);try{let _0=await h0(Q0,{signal:R0});if(H.addMessage({id:`user-shell-${_0.executionId}`,role:"user",content:x2(_0.record),timestamp:Date.now(),metadata:{userShellCommand:_0.record}}),_0.delivery==="next_turn")M.current=!0;return{success:_0.record.status!=="spawn_error",output:x2(_0.record),..._0.record.status==="spawn_error"?{error:_0.record.stderr||"User shell command failed"}:{}}}finally{H.setCommand(null)}});l8(()=>{return()=>{H1.resetStreamingBuffers()}},[H1.resetStreamingBuffers]),l8(()=>{if(!O)H.setCurrentThinkingContent(null)},[O,H]);let k$=h$(()=>{if(!G)return;Z?.();let{extraContent:q0,extraThinking:R0}=H1.drainPendingBuffers();N.abort("user-cancel"),C.setTasks([]);let Q0=$1().session.currentStreamingMessageId;if(Q0){if(q0)D$(Q0,q0);j8(Q0)}if(H.finalizeStreamingMessage(q0,R0),!v.current)H.addAssistantMessage("任务已停止"),v.current=!0}),s0=h$(async(q0,R0)=>{let Q0={contentDeltaCount:0,contentDeltaTotalLen:0,compactionCount:0},_0=D4({sessionActions:H,appActions:C,commandActions:N,streamingBuffer:H1,thinkingModeEnabled:O,getStreamingMessageId:()=>$1().session.currentStreamingMessageId,signal:R0.signal},Q0);return{loopResult:await t4(q0,_0),stats:Q0}}),V2=h$(async(q0)=>{let R0=!1,Q0,_0=!1,x0=q0;try{if(q0.text.trimStart().startsWith("!")){let g0=N.getAbortController()??N.createAbortController();return await C1(q0,g0.signal)}await Z8();let X1=N.getAbortController()??N.createAbortController(),u0=E8($1().session),U1=await p2(q0,C,H,X1.signal,k,q,E8($1().session),{listCheckpoints:A,execute:T},{list:y,resume:L},{getCatalog:f,refresh:h,getPrompt:t,complete:l,listTasks:a,getTask:I,cancelTask:R,getLogs:S,setLoggingLevel:b,getInstructions:V},{get:p,set:j},{get:E,set:m},{get:X0,set:J0},{get:w0,set:k0},K,{run:c0});if(U1.type==="handled")return U1.commandResult;if(U1.type==="continue_as_agent")R0=U1.result.userMessageAlreadyAdded,Q0=U1.result.onceModelId,_0=U1.result.goalContinuationOnly===!0,x0=U1.result.agentInput;let e$=O1.getInstance(),o1;if(!_0){let g0=await e$.executeUserPromptSubmitHooks(x0.text,{projectDir:K,sessionId:q,permissionMode:F,hasImages:x0.images.length>0,imageCount:x0.images.length});if(!g0.proceed){if(g0.warning)H.addAssistantMessage(`${g0.warning}`);return{success:!1,error:"blocked by hook"}}if(g0.updatedPrompt)x0={...x0,text:g0.updatedPrompt,displayText:g0.updatedPrompt,parts:[{type:"text",text:g0.updatedPrompt},...x0.parts.filter((A8)=>A8.type==="image")]};if(g0.contextInjection)o1=g0.contextInjection}if(!R0)H.addUserMessage(x0.displayText);let b8=m2(x0),r=await w(Q0?{modelId:Q0}:void 0);if(X1.signal.aborted)return c2.info("[handleCommandSubmit] Agent 创建期间已被中止"),{success:!1,error:"aborted"};if(o1)u0.push({role:"system",content:`<user-prompt-submit-hook>
33
- ${o1}
34
- </user-prompt-submit-hook>`});let G0={messages:u0,userId:"cli-user",sessionId:q,workspaceRoot:K,signal:X1.signal,confirmationHandler:Y,permissionMode:F,onPermissionModeChange:async(g0)=>{await m0().setPermissionMode(g0)}},{loopResult:f0,stats:$8}=await s0(r.chatStream(b8,G0,{stream:!0,goalContinuationOnly:_0,onTurnLimitReached:Y?async(g0)=>{let A8=await Y.requestConfirmation({type:"maxTurnsExceeded",message:`已进行 ${g0.turnsCount} 轮对话。是否继续?`,risks:["继续执行可能导致更长的等待时间","可能产生更多的 API 费用"]});return{continue:A8.approved,reason:A8.reason}}:void 0}),X1);if($8.compactionCount>0)H.setCompactedContext(G0.messages);if(f0.metadata?.outputTruncated)H.addAssistantMessage("输出因达到 token 上限被截断,部分内容可能不完整。");let V1=f0.finalMessage||"";if(c2.debug("[handleCommandSubmit] final reply",{success:f0.success,outputLength:V1.length,turnsCount:f0.metadata?.turnsCount,toolCallsCount:f0.metadata?.toolCallsCount}),!f0.success&&f0.error?.type==="api_error"){let g0=f0.error.message||"请求失败,请检查网络连接和 API 配置";return H.addAssistantMessage(g0),{success:!1,error:g0}}if(!V1||V1.trim()===""){let g0=f0.metadata?.abortReason;if(!v.current&&$8.contentDeltaCount===0&&g0!=="interrupt")return H.addAssistantMessage("已取消"),{success:!0,output:"已取消"};return{success:!0,output:V1??""}}return{success:!0,output:V1}}catch(X1){if(v.current)return{success:!1,error:"aborted"};let u0=D8(X1);return H.addAssistantMessage(`${u0.displayMessage}`),{success:!1,error:u0.displayMessage}}}),D1=h$(async()=>{if($1().command.isProcessing){M.current=!0;return}let q0=await j1.hasPendingInbox(K,q),R0=!q0&&await j1.hasActiveGoal(K,q);if(!q0&&!R0){M.current=!1;return}if($1().command.isProcessing){M.current=!0;return}M.current=!1,await Z8();let Q0=N.createAbortController();H1.resetStreamingBuffers(),H.clearFinalizingStreamingMessageId(),N.setProcessing(!0);try{let _0=await w();if(Q0.signal.aborted)return;let x0=await j1.hasPendingInbox(K,q),X1=!x0&&await j1.hasActiveGoal(K,q);if(!x0&&!X1)return;let u0={messages:E8($1().session),userId:"cli-user",sessionId:q,workspaceRoot:K,signal:Q0.signal,confirmationHandler:Y,permissionMode:F,onPermissionModeChange:async(o1)=>{await m0().setPermissionMode(o1)}},{loopResult:U1,stats:e$}=await s0(_0.chatStream("",u0,{stream:!0,pendingInputOnly:x0,goalContinuationOnly:X1}),Q0);if(e$.compactionCount>0)H.setCompactedContext(u0.messages);if(U1.metadata?.outputTruncated)H.addAssistantMessage("输出因达到 token 上限被截断,部分内容可能不完整。");if(!U1.success&&U1.error?.type==="api_error")H.addAssistantMessage(U1.error.message||"恢复排队指令失败,请检查网络和 API 配置")}catch(_0){let x0=D8(_0);if(!x0.isAbort)H.setError(`恢复排队指令失败: ${x0.displayMessage}`)}finally{if(N.getAbortController()===Q0)N.setProcessing(!1),N.clearAbortController(Q0),H.setCurrentThinkingContent(null);if(M.current)queueMicrotask(()=>{D1()})}}),j2=h$(async(q0)=>{if(!q0.text.trim()&&q0.images.length===0)return;if(q0.text.trimStart().startsWith("!")&&G){let Q0=N.getAbortController();if(!Q0){H.addAssistantMessage("当前任务没有可用的取消边界,无法执行用户 Shell 命令。");return}let _0=await C1(q0,Q0.signal);if(!_0.success&&_0.error&&_0.error!=="aborted")H.setError(_0.error);return}if(G){if(q0.text.trimStart().startsWith("/")){if(/^\/goal(?:\s|$)/i.test(q0.text.trim())){await Z8();let u0=N.getAbortController()??N.createAbortController();await p2(q0,C,H,u0.signal,k,q,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,K);return}H.addAssistantMessage("活动回合中不能执行 slash command;请先停止任务或等待完成。");return}await Z8();let Q0=await O1.getInstance().executeUserPromptSubmitHooks(q0.text,{projectDir:K,sessionId:q,permissionMode:F,hasImages:q0.images.length>0,imageCount:q0.images.length});if(!Q0.proceed){if(Q0.warning)H.addAssistantMessage(Q0.warning);return}let _0=q0;if(Q0.updatedPrompt)_0={...q0,text:Q0.updatedPrompt,parts:[{type:"text",text:Q0.updatedPrompt},...q0.parts.filter((u0)=>u0.type==="image")]};if(Q0.contextInjection){let u0=`<user-prompt-submit-hook>
31
+ Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:F,agentInput:{displayText:F,text:P,images:[],parts:[{type:"text",text:P}]},userMessageAlreadyAdded:!0}}}if(TY(N.data)){let{modelId:M,prompt:B}=N.data;return Y.addUserMessage(B),{type:"continue_as_agent",result:{userDisplayMessage:B,agentInput:{displayText:B,text:B,images:[],parts:[{type:"text",text:B}]},userMessageAlreadyAdded:!0,onceModelId:M}}}if(kY(N.data)){let M=N.data.goal.objective;return Y.addUserMessage(F),{type:"continue_as_agent",result:{userDisplayMessage:F,agentInput:{displayText:F,text:M,images:[],parts:[{type:"text",text:M}]},userMessageAlreadyAdded:!0,goalContinuationOnly:!0}}}if(!N.success&&N.error)return Y.addAssistantMessage(`${N.error}`),{type:"handled",commandResult:{success:N.success,output:N.message,error:N.error,metadata:N.data}};let S=N.message;if(N.success&&typeof S==="string"&&S.trim()!=="")Y.addAssistantMessage(S);return{type:"handled",commandResult:{success:N.success,output:N.message,error:N.error,metadata:N.data}}}import{useMemoizedFn as y0}from"ahooks";import{useEffect as DY,useRef as c8}from"react";function a4($){let Q=c8(void 0),Y=c8(void 0),J=c8(void 0),Z=c8(void 0),X=y0(async()=>{if(Z.current)return Z.current;let I=Q.current,R=Y.current;if(!I&&!R)return;Q.current=void 0,Y.current=void 0,J.current=void 0;let v=(async()=>{try{await I?.destroy()}finally{await R?.dispose()}})();Z.current=v;try{await v}finally{if(Z.current===v)Z.current=void 0}}),G=y0(async(I)=>{let R=$.workspaceRoot??Y.current?.workspaceRoot??l0();if(Y.current&&(Y.current.sessionId!==I||Y.current.workspaceRoot!==R))await X();if(!Y.current){let v=await P0.findSessionMetadata(I,R),b=v!==void 0&&(await P0.loadSession(I,R)).length>0;Y.current=await j1.create({sessionId:I,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,...b?{sessionStart:{isResume:!0,resumeSessionId:I}}:{}});try{J.current={sessionId:I,modelId:v?.selectedModelId,permissionMode:v?.permissionMode,reasoningEffort:v?.reasoningEffort,serviceTier:v?.serviceTier,responseVerbosity:v?.responseVerbosity,communicationStyle:v?.communicationStyle,communicationStyleDigest:v?.communicationStyleDigest},a0().setReasoningEffort(Y.current.getReasoningConfiguration().selection),a0().setServiceTier(Y.current.getServiceTierConfiguration().selection),a0().setResponseVerbosity(Y.current.getResponseVerbosityConfiguration().selection),a0().setCommunicationStyle(Y.current.getCommunicationStyleConfiguration().selection)}catch(V){let p=Y.current;throw Y.current=void 0,await p.dispose().catch(()=>{return}),V}}return Y.current}),q=y0(async(I)=>{let R=I?.sessionId??$.sessionId,v=!!I?.modelId&&I.modelId!==$.modelId,b;if(!v&&R){let V=Y.current!==void 0,p=await G(R),j=I?.modelId??$.modelId,E=I?.reasoningEffort??(V?$.reasoningEffort:p.getReasoningConfiguration().selection),m=I?.serviceTier??(V?$.serviceTier:p.getServiceTierConfiguration().selection),X0=I?.responseVerbosity??(V?$.responseVerbosity:p.getResponseVerbosityConfiguration().selection),J0=I?.communicationStyle??(V?$.communicationStyle:p.getCommunicationStyleConfiguration().selection),w0=p.getCurrentModelId(),k0=p.getReasoningConfiguration(),c0=p.getServiceTierConfiguration(),h0=p.getResponseVerbosityConfiguration(),H1=p.getCommunicationStyleConfiguration();if($.permissionMode&&(J.current?.sessionId!==R||J.current.permissionMode!==$.permissionMode)){let s0=await P0.setSessionPermissionMode(R,p.workspaceRoot,$.permissionMode);J.current={...J.current,sessionId:R,permissionMode:s0.permissionMode}}await p.refresh({modelId:j,...E?{reasoningEffort:E}:{},...m?{serviceTier:m}:{},...X0?{responseVerbosity:X0}:{},...J0?{communicationStyle:J0}:{}});let C1=p.getCommunicationStyleConfiguration();if(C1.source!=="built-in"&&!C1.contentSha256)throw Error("Custom communication style has no provenance");let k$={...j&&j!=="inherit"&&(J.current?.sessionId!==R||J.current.modelId!==j)?{selectedModelId:j}:{},...E&&(J.current?.sessionId!==R||J.current.reasoningEffort!==E)?{reasoningEffort:E}:{},...m&&(J.current?.sessionId!==R||J.current.serviceTier!==m)?{serviceTier:m}:{},...X0&&(J.current?.sessionId!==R||J.current.responseVerbosity!==X0)?{responseVerbosity:X0}:{},...J0&&(J.current?.sessionId!==R||J.current.communicationStyle!==J0||J.current.communicationStyleDigest!==C1.contentSha256)?{communicationStyle:J0,communicationStyleDigest:C1.source==="built-in"?null:C1.contentSha256}:{}};if(Object.keys(k$).length>0)try{let s0=await P0.updateSessionMetadata(R,p.workspaceRoot,k$);J.current={sessionId:R,modelId:s0.selectedModelId,permissionMode:s0.permissionMode,reasoningEffort:s0.reasoningEffort,serviceTier:s0.serviceTier,responseVerbosity:s0.responseVerbosity,communicationStyle:s0.communicationStyle,communicationStyleDigest:s0.communicationStyleDigest}}catch(s0){throw await p.refresh({...w0?{modelId:w0}:{},reasoningEffort:k0.selection,serviceTier:c0.selection,responseVerbosity:h0.selection,communicationStyle:H1.selection}).catch(()=>{return}),s0}b=await Z8.createWithRuntime(p,{sessionId:R,systemPrompt:I?.systemPrompt??$.systemPrompt,appendSystemPrompt:I?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:I?.maxTurns??$.maxTurns,modelId:I?.modelId??$.modelId,permissionMode:I?.permissionMode??$.permissionMode,agents:$.agents})}else b=await Z8.create({systemPrompt:I?.systemPrompt??$.systemPrompt,appendSystemPrompt:I?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:I?.maxTurns??$.maxTurns,modelId:I?.modelId??$.modelId,permissionMode:I?.permissionMode??$.permissionMode,agents:$.agents});return Q.current=b,b}),K=y0(async()=>{if(!$.sessionId)throw Error("No active session to rewind");return(await G($.sessionId)).listRewindCheckpoints()}),U=y0(async(I)=>{if(!$.sessionId)throw Error("No active session to rewind");let v=await(await G($.sessionId)).rewindSession(I);return await X(),v}),W=y0(async()=>{if(!$.sessionId)throw Error("No active session for subagent control");return(await G($.sessionId)).listSubagents()}),O=y0(async(I,R)=>{if(!$.sessionId)throw Error("No active session for subagent control");let v=await G($.sessionId),b=!1,V,p=I,j=(m)=>{f$.getState().app.actions.completeSubagentProgress(p,m.status==="completed")},E=v.resumeSubagent({agentId:I,prompt:R,onEvent:(m)=>{if(m.kind==="tool_start"&&"function"in m.toolCall)f$.getState().app.actions.updateSubagentTool(p,m.toolCall.function.name)},onCompleted:(m)=>{if(b)j(m);else V=m}});if(p=E.session.id,f$.getState().app.actions.startSubagentProgress(E.session.id,E.session.subagentType,`Resumed from ${E.source.id}: ${E.session.description}`),b=!0,V)j(V);return E}),H=y0(async()=>{if(!$.sessionId)throw Error("No active session for MCP content");return(await G($.sessionId)).getMcpContentCatalog()}),z=y0(async(I)=>{if(!$.sessionId)throw Error("No active session for MCP content");await(await G($.sessionId)).refreshMcpContentCatalogs(I)}),w=y0(async(I,R,v)=>{if(!$.sessionId)throw Error("No active session for MCP prompts");return(await G($.sessionId)).getMcpPrompt(I,R,v)}),_=y0(async(I,R,v)=>{if(!$.sessionId)throw Error("No active session for MCP completion");return(await G($.sessionId)).completeMcpArgument(I,R,v)}),F=y0(async(I,R={})=>{if(!$.sessionId)throw Error("No active session for MCP logs");return(await G($.sessionId)).getMcpLogs(I,R)}),C=y0(async(I)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await G($.sessionId)).listMcpTasks(I)}),N=y0(async(I)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await G($.sessionId)).getMcpTask(I)}),S=y0(async(I,R)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await G($.sessionId)).cancelMcpTask(I,R)}),M=y0(async(I,R)=>{if(!$.sessionId)throw Error("No active session for MCP logging");await(await G($.sessionId)).setMcpLoggingLevel(I,R)}),B=y0(async()=>{if(!$.sessionId)throw Error("No active session for MCP instructions");return(await G($.sessionId)).getMcpInstructions()}),k=y0(async()=>{if(!$.sessionId)throw Error("No active session for reasoning effort");return(await G($.sessionId)).getReasoningConfiguration()}),P=y0(async(I)=>{if(!$.sessionId)throw Error("No active session for reasoning effort");let R=await G($.sessionId);if(R.hasTurnOwner())throw Error("Cannot switch reasoning effort while a turn is active");let v=R.getReasoningConfiguration();if(R.resolveReasoningConfiguration(I),v.selection===I)return v;await R.refresh({reasoningEffort:I});try{let b;try{b=await P0.updateSessionMetadata($.sessionId,R.workspaceRoot,{reasoningEffort:I})}catch(V){if(!(V instanceof Y8)&&V.code!=="ENOENT")throw V;b=await P0.createSessionMetadata($.sessionId,R.workspaceRoot,{taskStatus:"completed",selectedModelId:R.getCurrentModelId(),reasoningEffort:I,serviceTier:R.getServiceTierConfiguration().selection,responseVerbosity:R.getResponseVerbosityConfiguration().selection,communicationStyle:R.getCommunicationStyleConfiguration().selection})}return J.current={sessionId:$.sessionId,modelId:b.selectedModelId,permissionMode:b.permissionMode,reasoningEffort:b.reasoningEffort,serviceTier:b.serviceTier,responseVerbosity:b.responseVerbosity,communicationStyle:b.communicationStyle,communicationStyleDigest:b.communicationStyleDigest},a0().setReasoningEffort(I),R.getReasoningConfiguration()}catch(b){throw await R.refresh({reasoningEffort:v.selection}),b}}),A=y0(async()=>{if(!$.sessionId)throw Error("No active session for service tier");return(await G($.sessionId)).getServiceTierConfiguration()}),T=y0(async(I)=>{if(!$.sessionId)throw Error("No active session for service tier");let R=await G($.sessionId);if(R.hasTurnOwner())throw Error("Cannot switch service tier while a turn is active");let v=R.getServiceTierConfiguration();if(R.resolveServiceTierConfiguration(I),v.selection===I)return v;await R.refresh({serviceTier:I});try{let b;try{b=await P0.updateSessionMetadata($.sessionId,R.workspaceRoot,{serviceTier:I})}catch(V){if(!(V instanceof Y8)&&V.code!=="ENOENT")throw V;b=await P0.createSessionMetadata($.sessionId,R.workspaceRoot,{taskStatus:"completed",selectedModelId:R.getCurrentModelId(),reasoningEffort:R.getReasoningConfiguration().selection,serviceTier:I,responseVerbosity:R.getResponseVerbosityConfiguration().selection,communicationStyle:R.getCommunicationStyleConfiguration().selection})}return J.current={sessionId:$.sessionId,modelId:b.selectedModelId,permissionMode:b.permissionMode,reasoningEffort:b.reasoningEffort,serviceTier:b.serviceTier,responseVerbosity:b.responseVerbosity,communicationStyle:b.communicationStyle,communicationStyleDigest:b.communicationStyleDigest},a0().setServiceTier(I),R.getServiceTierConfiguration()}catch(b){throw await R.refresh({serviceTier:v.selection}),b}}),y=y0(async()=>{if(!$.sessionId)throw Error("No active session for response verbosity");return(await G($.sessionId)).getResponseVerbosityConfiguration()}),L=y0(async(I)=>{if(!$.sessionId)throw Error("No active session for response verbosity");let R=await G($.sessionId);if(R.hasTurnOwner())throw Error("Cannot switch response verbosity while a turn is active");let v=R.getResponseVerbosityConfiguration();if(R.resolveResponseVerbosityConfiguration(I),v.selection===I)return v;await R.refresh({responseVerbosity:I});try{let b;try{b=await P0.updateSessionMetadata($.sessionId,R.workspaceRoot,{responseVerbosity:I})}catch(V){if(!(V instanceof Y8)&&V.code!=="ENOENT")throw V;b=await P0.createSessionMetadata($.sessionId,R.workspaceRoot,{taskStatus:"completed",selectedModelId:R.getCurrentModelId(),reasoningEffort:R.getReasoningConfiguration().selection,serviceTier:R.getServiceTierConfiguration().selection,responseVerbosity:I,communicationStyle:R.getCommunicationStyleConfiguration().selection})}return J.current={sessionId:$.sessionId,modelId:b.selectedModelId,permissionMode:b.permissionMode,reasoningEffort:b.reasoningEffort,serviceTier:b.serviceTier,responseVerbosity:b.responseVerbosity,communicationStyle:b.communicationStyle,communicationStyleDigest:b.communicationStyleDigest},a0().setResponseVerbosity(I),R.getResponseVerbosityConfiguration()}catch(b){throw await R.refresh({responseVerbosity:v.selection}),b}}),f=y0(async()=>{if(!$.sessionId)throw Error("No active session for communication style");return(await G($.sessionId)).getCommunicationStyleConfiguration()}),h=y0(async(I)=>{if(!$.sessionId)throw Error("No active session for communication style");let R=await G($.sessionId);if(R.hasTurnOwner())throw Error("Cannot switch communication style while a turn is active");let v=R.getCommunicationStyleConfiguration(),b=R.resolveCommunicationStyleConfiguration(I);if(b.source!=="built-in"&&!b.contentSha256)throw Error("Custom communication style has no provenance");if(v.selection===I)return v;await R.refresh({communicationStyle:I});try{let V;try{V=await P0.updateSessionMetadata($.sessionId,R.workspaceRoot,{communicationStyle:I,communicationStyleDigest:b.source==="built-in"?null:b.contentSha256})}catch(p){if(!(p instanceof Y8)&&p.code!=="ENOENT")throw p;V=await P0.createSessionMetadata($.sessionId,R.workspaceRoot,{taskStatus:"completed",selectedModelId:R.getCurrentModelId(),reasoningEffort:R.getReasoningConfiguration().selection,serviceTier:R.getServiceTierConfiguration().selection,responseVerbosity:R.getResponseVerbosityConfiguration().selection,communicationStyle:I,...b.source!=="built-in"&&b.contentSha256?{communicationStyleDigest:b.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},a0().setCommunicationStyle(I),R.getCommunicationStyleConfiguration()}catch(V){throw await R.refresh({communicationStyle:v.selection}),V}}),s=y0(async(I)=>{if(!Y.current)return{accepted:!1,queued:0,reason:"no_active_turn"};return Y.current.enqueueSteering(I,{allowBeforeTurn:!0})}),l=y0(async(I,R)=>{let v=$.sessionId;if(!v)throw Error("User shell command requires a Session");return(await G(v)).executeUserShellCommand(I,R)}),a=y0(async(I,R)=>{let v=$.sessionId;if(!v)throw Error("Code review requires a Session");let b=await G(v);await x8.recoverInterrupted(b.workspaceRoot,v,b);let V=await x8.start({sessionId:v,projectPath:b.workspaceRoot,runtime:b,request:I,signal:R}),p=await V.completion,j=(await x8.list(b.workspaceRoot,v)).find((E)=>E.start.reviewId===V.reviewId);if(!j)throw Error(`Review not found after completion: ${V.reviewId}`);return{reviewId:V.reviewId,status:p.status,findings:p.findings.length,content:r4(j.start,p)}});return DY(()=>{let I=u8(X);return()=>{I(),X().catch(()=>{return})}},[X]),{agentRef:Q,createAgent:q,cleanupAgent:X,steerActiveTurn:s,runCodeReview:a,executeUserShellCommand:l,listRewindCheckpoints:K,rewindSession:U,listSubagents:W,resumeSubagent:O,getMcpContentCatalog:H,refreshMcpContentCatalogs:z,getMcpPrompt:w,completeMcpArgument:_,listMcpTasks:C,getMcpTask:N,cancelMcpTask:S,getMcpLogs:F,setMcpLoggingLevel:M,getMcpInstructions:B,getReasoningConfiguration:k,setReasoningEffort:P,getServiceTierConfiguration:A,setServiceTier:T,getResponseVerbosityConfiguration:y,setResponseVerbosity:L,getCommunicationStyleConfiguration:f,setCommunicationStyle:h}}import{useMemoizedFn as j$}from"ahooks";import{useEffect as VY,useRef as l8}from"react";function o4($){let Q=0;for(let Y of $)if(Y===`
32
+ `)Q++;return Q}function i4($,Q){let Y=Q?.flushTimeout??300,J=Q?.minLinesToFlush??5,Z=Q?.minCharsToFlush??400,X=l8(""),G=l8(null),q=l8(""),K=l8(null),U=j$(()=>{if(X.current){let _=X.current,F=$.appendAssistantContent(_);D$(F,_),X.current=""}if(G.current)clearTimeout(G.current),G.current=null}),W=j$(()=>{if(q.current)$.appendThinkingContent(q.current),q.current="";if(K.current)clearTimeout(K.current),K.current=null}),O=j$((_)=>{X.current+=_;let F=X.current;if(o4(F)>=J||F.length>=Z){U();return}if(!G.current)G.current=setTimeout(U,Y)}),H=j$((_)=>{q.current+=_;let F=q.current;if(o4(F)>=J||F.length>=Z){W();return}if(!K.current)K.current=setTimeout(W,Y)}),z=j$(()=>{if(X.current="",G.current)clearTimeout(G.current),G.current=null;if(q.current="",K.current)clearTimeout(K.current),K.current=null}),w=j$(()=>{if(G.current)clearTimeout(G.current),G.current=null;if(K.current)clearTimeout(K.current),K.current=null;let _=X.current,F=q.current;return X.current="",q.current="",{extraContent:_,extraThinking:F}});return VY(()=>{return()=>{z()}},[z]),{batchAppendContent:O,batchAppendThinking:H,flushContentBuffer:U,flushThinkingBuffer:W,resetStreamingBuffers:z,drainPendingBuffers:w}}var x2=e1("UI"),$6=($,Q,Y,J,Z,X)=>{let G=s1(),q=S$(),K=I1(),U=I8(),W=v$(),O=k8(),H=f8(),z=S8(),w=v8(),_=D8(),F=n1(),C=t1(),N=A4(),S=n4(!1),M=n4(!1),{createAgent:B,cleanupAgent:k,steerActiveTurn:P,listRewindCheckpoints:A,rewindSession:T,listSubagents:y,resumeSubagent:L,getMcpContentCatalog:f,refreshMcpContentCatalogs:h,getMcpPrompt:s,completeMcpArgument:l,listMcpTasks:a,getMcpTask:I,cancelMcpTask:R,getMcpLogs:v,setMcpLoggingLevel:b,getMcpInstructions:V,getReasoningConfiguration:p,setReasoningEffort:j,getServiceTierConfiguration:E,setServiceTier:m,getResponseVerbosityConfiguration:X0,setResponseVerbosity:J0,getCommunicationStyleConfiguration:w0,setCommunicationStyle:k0,runCodeReview:c0,executeUserShellCommand:h0}=a4({sessionId:q,workspaceRoot:K,systemPrompt:$,appendSystemPrompt:Q,maxTurns:J,modelId:U,permissionMode:W,reasoningEffort:H,serviceTier:z,responseVerbosity:w,communicationStyle:_,agents:X}),H1=i4(F),C1=h$(async(q0,R0)=>{if(q0.images.length>0)return{success:!1,error:"User shell commands do not accept image attachments"};let Q0=q0.text.trimStart().slice(1).trim();if(!Q0)return{success:!1,error:"User shell command cannot be empty"};F.setCommand(`! ${Q0}`);try{let _0=await h0(Q0,{signal:R0});if(F.addMessage({id:`user-shell-${_0.executionId}`,role:"user",content:u2(_0.record),timestamp:Date.now(),metadata:{userShellCommand:_0.record}}),_0.delivery==="next_turn")M.current=!0;return{success:_0.record.status!=="spawn_error",output:u2(_0.record),..._0.record.status==="spawn_error"?{error:_0.record.stderr||"User shell command failed"}:{}}}finally{F.setCommand(null)}});d8(()=>{return()=>{H1.resetStreamingBuffers()}},[H1.resetStreamingBuffers]),d8(()=>{if(!O)F.setCurrentThinkingContent(null)},[O,F]);let k$=h$(()=>{if(!G)return;Z?.();let{extraContent:q0,extraThinking:R0}=H1.drainPendingBuffers();N.abort("user-cancel"),C.setTasks([]);let Q0=$1().session.currentStreamingMessageId;if(Q0){if(q0)D$(Q0,q0);h8(Q0)}if(F.finalizeStreamingMessage(q0,R0),!S.current)F.addAssistantMessage("任务已停止"),S.current=!0}),s0=h$(async(q0,R0)=>{let Q0={contentDeltaCount:0,contentDeltaTotalLen:0,compactionCount:0},_0=j4({sessionActions:F,appActions:C,commandActions:N,streamingBuffer:H1,thinkingModeEnabled:O,getStreamingMessageId:()=>$1().session.currentStreamingMessageId,signal:R0.signal},Q0);return{loopResult:await e4(q0,_0),stats:Q0}}),j2=h$(async(q0)=>{let R0=!1,Q0,_0=!1,x0=q0;try{if(q0.text.trimStart().startsWith("!")){let g0=N.getAbortController()??N.createAbortController();return await C1(q0,g0.signal)}await X8();let X1=N.getAbortController()??N.createAbortController(),u0=g8($1().session),U1=await c2(q0,C,F,X1.signal,k,q,g8($1().session),{listCheckpoints:A,execute:T},{list:y,resume:L},{getCatalog:f,refresh:h,getPrompt:s,complete:l,listTasks:a,getTask:I,cancelTask:R,getLogs:v,setLoggingLevel:b,getInstructions:V},{get:p,set:j},{get:E,set:m},{get:X0,set:J0},{get:w0,set:k0},K,{run:c0});if(U1.type==="handled")return U1.commandResult;if(U1.type==="continue_as_agent")R0=U1.result.userMessageAlreadyAdded,Q0=U1.result.onceModelId,_0=U1.result.goalContinuationOnly===!0,x0=U1.result.agentInput;let $8=O1.getInstance(),i1;if(!_0){let g0=await $8.executeUserPromptSubmitHooks(x0.text,{projectDir:K,sessionId:q,permissionMode:W,hasImages:x0.images.length>0,imageCount:x0.images.length});if(!g0.proceed){if(g0.warning)F.addAssistantMessage(`${g0.warning}`);return{success:!1,error:"blocked by hook"}}if(g0.updatedPrompt)x0={...x0,text:g0.updatedPrompt,displayText:g0.updatedPrompt,parts:[{type:"text",text:g0.updatedPrompt},...x0.parts.filter((P8)=>P8.type==="image")]};if(g0.contextInjection)i1=g0.contextInjection}if(!R0)F.addUserMessage(x0.displayText);let A8=p2(x0),r=await B(Q0?{modelId:Q0}:void 0);if(X1.signal.aborted)return x2.info("[handleCommandSubmit] Agent 创建期间已被中止"),{success:!1,error:"aborted"};if(i1)u0.push({role:"system",content:`<user-prompt-submit-hook>
33
+ ${i1}
34
+ </user-prompt-submit-hook>`});let G0={messages:u0,userId:"cli-user",sessionId:q,workspaceRoot:K,signal:X1.signal,confirmationHandler:Y,permissionMode:W,onPermissionModeChange:async(g0)=>{await m0().setPermissionMode(g0)}},{loopResult:f0,stats:Q8}=await s0(r.chatStream(A8,G0,{stream:!0,goalContinuationOnly:_0,onTurnLimitReached:Y?async(g0)=>{let P8=await Y.requestConfirmation({type:"maxTurnsExceeded",message:`已进行 ${g0.turnsCount} 轮对话。是否继续?`,risks:["继续执行可能导致更长的等待时间","可能产生更多的 API 费用"]});return{continue:P8.approved,reason:P8.reason}}:void 0}),X1);if(Q8.compactionCount>0)F.setCompactedContext(G0.messages);if(f0.metadata?.outputTruncated)F.addAssistantMessage("输出因达到 token 上限被截断,部分内容可能不完整。");let V1=f0.finalMessage||"";if(x2.debug("[handleCommandSubmit] final reply",{success:f0.success,outputLength:V1.length,turnsCount:f0.metadata?.turnsCount,toolCallsCount:f0.metadata?.toolCallsCount}),!f0.success&&f0.error?.type==="api_error"){let g0=f0.error.message||"请求失败,请检查网络连接和 API 配置";return F.addAssistantMessage(g0),{success:!1,error:g0}}if(!V1||V1.trim()===""){let g0=f0.metadata?.abortReason;if(!S.current&&Q8.contentDeltaCount===0&&g0!=="interrupt")return F.addAssistantMessage("已取消"),{success:!0,output:"已取消"};return{success:!0,output:V1??""}}return{success:!0,output:V1}}catch(X1){if(S.current)return{success:!1,error:"aborted"};let u0=V8(X1);return F.addAssistantMessage(`${u0.displayMessage}`),{success:!1,error:u0.displayMessage}}}),D1=h$(async()=>{if($1().command.isProcessing){M.current=!0;return}let q0=await j1.hasPendingInbox(K,q),R0=!q0&&await j1.hasActiveGoal(K,q);if(!q0&&!R0){M.current=!1;return}if($1().command.isProcessing){M.current=!0;return}M.current=!1,await X8();let Q0=N.createAbortController();H1.resetStreamingBuffers(),F.clearFinalizingStreamingMessageId(),N.setProcessing(!0);try{let _0=await B();if(Q0.signal.aborted)return;let x0=await j1.hasPendingInbox(K,q),X1=!x0&&await j1.hasActiveGoal(K,q);if(!x0&&!X1)return;let u0={messages:g8($1().session),userId:"cli-user",sessionId:q,workspaceRoot:K,signal:Q0.signal,confirmationHandler:Y,permissionMode:W,onPermissionModeChange:async(i1)=>{await m0().setPermissionMode(i1)}},{loopResult:U1,stats:$8}=await s0(_0.chatStream("",u0,{stream:!0,pendingInputOnly:x0,goalContinuationOnly:X1}),Q0);if($8.compactionCount>0)F.setCompactedContext(u0.messages);if(U1.metadata?.outputTruncated)F.addAssistantMessage("输出因达到 token 上限被截断,部分内容可能不完整。");if(!U1.success&&U1.error?.type==="api_error")F.addAssistantMessage(U1.error.message||"恢复排队指令失败,请检查网络和 API 配置")}catch(_0){let x0=V8(_0);if(!x0.isAbort)F.setError(`恢复排队指令失败: ${x0.displayMessage}`)}finally{if(N.getAbortController()===Q0)N.setProcessing(!1),N.clearAbortController(Q0),F.setCurrentThinkingContent(null);if(M.current)queueMicrotask(()=>{D1()})}}),h2=h$(async(q0)=>{if(!q0.text.trim()&&q0.images.length===0)return;if(q0.text.trimStart().startsWith("!")&&G){let Q0=N.getAbortController();if(!Q0){F.addAssistantMessage("当前任务没有可用的取消边界,无法执行用户 Shell 命令。");return}let _0=await C1(q0,Q0.signal);if(!_0.success&&_0.error&&_0.error!=="aborted")F.setError(_0.error);return}if(G){if(q0.text.trimStart().startsWith("/")){if(/^\/goal(?:\s|$)/i.test(q0.text.trim())){await X8();let u0=N.getAbortController()??N.createAbortController();await c2(q0,C,F,u0.signal,k,q,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,K);return}F.addAssistantMessage("活动回合中不能执行 slash command;请先停止任务或等待完成。");return}await X8();let Q0=await O1.getInstance().executeUserPromptSubmitHooks(q0.text,{projectDir:K,sessionId:q,permissionMode:W,hasImages:q0.images.length>0,imageCount:q0.images.length});if(!Q0.proceed){if(Q0.warning)F.addAssistantMessage(Q0.warning);return}let _0=q0;if(Q0.updatedPrompt)_0={...q0,text:Q0.updatedPrompt,parts:[{type:"text",text:Q0.updatedPrompt},...q0.parts.filter((u0)=>u0.type==="image")]};if(Q0.contextInjection){let u0=`<user-prompt-submit-hook>
35
35
  ${Q0.contextInjection}
36
36
  </user-prompt-submit-hook>`;_0={..._0,text:`${_0.text}
37
37
 
38
38
  ${u0}`,parts:[..._0.parts,{type:"text",text:`
39
39
 
40
- ${u0}`}]}}let x0=m2(_0),X1=await P(x0);if(!X1.accepted){let u0=X1.reason==="queue_full"?"补充指令队列已满,请等待当前任务处理后重试。":"当前任务正在结束,补充指令未入队,请稍后重试。";H.addAssistantMessage(u0);return}if(N.enqueueCommand(q0),H.addUserMessage(q0.displayText),X1.delivery==="next_turn"){if(M.current=!0,!$1().command.isProcessing)queueMicrotask(()=>{D1()})}return}C.setTasks([]),N.setRecoveredSteeringCount(0),v.current=!1;let R0=N.createAbortController();H1.resetStreamingBuffers(),H.clearFinalizingStreamingMessageId(),N.setProcessing(!0);try{let Q0=await V2(q0);if(!Q0.success&&Q0.error&&Q0.error!=="aborted")H.setError(Q0.error)}catch(Q0){let _0=D8(Q0);if(_0.isAbort);else H.setError(`执行失败: ${_0.displayMessage}`)}finally{if(N.getAbortController()===R0){if(N.setProcessing(!1),N.clearAbortController(R0),H.setCurrentThinkingContent(null),M.current)queueMicrotask(()=>{D1()})}}});return l8(()=>{let q0=n4.subscribe((R0)=>{if(R0.type!=="subagent.completion.queued"||!o4(R0,{sessionId:q,projectPath:K}))return;M.current=!0,queueMicrotask(()=>{D1()})});return()=>{q0()}},[D1,q,K]),l8(()=>{let q0=!1;return(async()=>{if(Y)await u2.resolvePendingWithHandler(K,q,Y);else await u2.cancelPendingNonInteractive(K,q);if(q0)return;let[R0,Q0]=await Promise.all([j1.hasPendingInbox(K,q),j1.hasActiveGoal(K,q)]);if(R0||Q0)await D1()})().catch((R0)=>{if(!q0)c2.warn("[useCommandHandler] Failed to recover pending interaction or inbox",R0)}),()=>{q0=!0}},[Y,D1,q,K]),{executeCommand:j2,handleAbort:k$,isProcessing:G,cleanupAgent:k}};import{useMemoizedFn as d8}from"ahooks";import{useState as e4}from"react";var $6=()=>{let[$,Q]=e4([]),[Y,J]=e4(-1),Z=d8((K,U)=>{let F={display:K,pasteMappings:U?new Map(U):new Map};Q((O)=>[...O,F]),J(-1)}),X=d8(()=>{if($.length===0)return null;let K=Y===-1?$.length-1:Math.max(0,Y-1);return J(K),$[K]||null}),G=d8(()=>{if(Y===-1)return null;let K=Y+1;if(K>=$.length)return J(-1),null;else return J(K),$[K]||null}),q=d8(()=>{J(-1)});return{commandHistory:$,historyIndex:Y,addToHistory:Z,getPreviousCommand:X,getNextCommand:G,resetHistoryIndex:q}};import{useMemoizedFn as X8}from"ahooks";import{useMemo as DY,useRef as Q6,useState as VY}from"react";var J6=()=>{let[$,Q]=VY({isVisible:!1,details:null,resolver:null}),Y=Q6(null),J=Q6([]),Z=X8((F)=>{Y.current=F,Q({isVisible:Boolean(F),details:F?.details??null,resolver:F?.resolve??null})}),X=X8((F,O)=>{if(F.settled)return;if(F.settled=!0,F.signal&&F.abortListener)F.signal.removeEventListener("abort",F.abortListener);F.resolve(O)}),G=X8((F,O)=>{return new Promise((W)=>{let z={details:F,resolve:W,signal:O,settled:!1},B=()=>{if(Y.current===z){X(z,{approved:!1,reason:G8}),Z(J.current.shift()??null);return}let _=J.current.indexOf(z);if(_>=0)J.current.splice(_,1);X(z,{approved:!1,reason:G8})};if(z.abortListener=B,O?.aborted){B();return}if(O?.addEventListener("abort",B,{once:!0}),!Y.current){Z(z);return}J.current.push(z)})}),q=X8((F)=>{let O=Y.current;if(O)X(O,F);let W=J.current.shift()??null;Z(W)}),K=X8(()=>{if(Y.current)X(Y.current,{approved:!1,reason:G8});for(let F of J.current)X(F,{approved:!1,reason:G8});J.current=[],Z(null)}),U=DY(()=>({requestConfirmation:G}),[G]);return{confirmationState:$,confirmationHandler:U,handleResponse:q,dismissAll:K}};import{useMemoizedFn as F$}from"ahooks";import{useRef as Y6,useState as jY}from"react";var r8="␞",a8="␟";function i8($){return`${r8}PASTE:${$}:`}function l2(){return a8}var WG=new RegExp(`${r8}PASTE:(\\d+):[\\s\\S]*?${a8}`,"g");function hY($){return $.includes(r8)&&$.includes(a8)}function Z6($="",Q=0){let[Y,J]=jY({value:$,cursorPosition:Q}),Z=Y6(0),X=Y6(new Map),G=F$((z)=>{J((B)=>({value:z,cursorPosition:B.cursorPosition}));for(let B of X.current.keys()){let _=i8(B);if(!z.includes(_))X.current.delete(B)}}),q=F$((z)=>{J((B)=>({...B,cursorPosition:Math.max(0,Math.min(z,B.value.length))}))}),K=F$(()=>{J({value:"",cursorPosition:0}),X.current.clear()}),U=F$((z)=>{Z.current+=1;let B=Z.current;return X.current.set(B,{type:"text",data:z}),B}),F=F$((z,B)=>{let _=[...X.current.values()].filter((v)=>v.type==="image");if(_.length>=V$)throw Error(`最多只能粘贴 ${V$} 张图片`);let H=_.reduce((v,M)=>v+`data:${M.mimeType};base64,`.length+M.data.length,0),C=`data:${B};base64,`.length+z.length;if(H+C>h8)throw Error("图片编码后总大小不能超过 5 MiB");Z.current+=1;let N=Z.current;return X.current.set(N,{type:"image",data:z,mimeType:B}),N}),O=F$((z)=>{for(let[B,_]of z)if(X.current.set(B,_),B>=Z.current)Z.current=B}),W=F$((z)=>{let B=[],_=[];if(!hY(z)){let T=z.trim();if(T)_.push({type:"text",text:T});return{displayText:z,text:z,images:B,parts:_}}let H=new RegExp(`${r8}PASTE:(\\d+):[\\s\\S]*?${a8}`,"g"),C=Array.from(z.matchAll(H)),N=0,v="",M="";for(let T of C){let y=T.index,L=y+T[0].length,f=parseInt(T[1],10),h=X.current.get(f);if(y>N){let t=z.slice(N,y);_.push({type:"text",text:t}),v+=t,M+=t}if(!h)v+=T[0],M+=T[0],_.push({type:"text",text:T[0]});else if(h.type==="text")v+=h.data,M+=h.data,_.push({type:"text",text:h.data});else{let t={id:f,base64:h.data,mimeType:h.mimeType};B.push(t),_.push({type:"image",...t}),M+=`[Image #${f}]`}N=L}if(N<z.length){let T=z.slice(N);_.push({type:"text",text:T}),v+=T,M+=T}let w=[];for(let T of _)if(T.type==="text"&&w.length>0&&w[w.length-1].type==="text")w[w.length-1].text+=T.text;else w.push(T);let k=0,P=w.length;while(k<w.length&&w[k].type==="text"&&w[k].text.trim()==="")k++;while(P>k&&w[P-1].type==="text"&&w[P-1].text.trim()==="")P--;let A=w.slice(k,P);return{displayText:M.trim(),text:v.trim(),images:B,parts:A}});return{value:Y.value,cursorPosition:Y.cursorPosition,setValue:G,setCursorPosition:q,clear:K,pasteMap:X.current,addPasteMapping:U,addImagePasteMapping:F,restorePasteMappings:O,resolveInput:W}}import{useMemoizedFn as _6}from"ahooks";import{useInput as lY}from"ink";import{useEffect as N6,useRef as F6,useState as i2}from"react";function EY($){return{supportsThinking:h1().resolveConfig($).reasoning}}function o8($){return EY($).supportsThinking}import gY from"fast-glob";import mY from"fuse.js";import{useEffect as X6,useMemo as d2,useState as r2}from"react";var E$=null,pY=5000;function cY($,Q){let Y=[...$.matchAll(/(?:^|\s)(@(?:"[^"]*"|(?:[^\\ ]|\\ )*))/g)];for(let J of Y){let Z=J[1],X=J.index+(J[0].length-Z.length),G=X+Z.length;if(Q>=X&&Q<=G){let q=Z.slice(1),K=!1;if(q.startsWith('"')){if(K=!0,q=q.slice(1),q.endsWith('"'))q=q.slice(0,-1)}return{hasQuery:!0,query:q,startIndex:X,endIndex:G,quoted:K}}}return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1}}var xY=[...a2.map(($)=>`${$}/**`),...a2,...G6.map(($)=>`**/${$}`)];function K6($,Q,Y={}){let{cwd:J=l0(),maxSuggestions:Z=15,ignorePatterns:X=xY,debounceDelay:G=300,fuzzyMatch:q=!0}=Y,[K,U]=r2([]),[F,O]=r2(!1),[W,z]=r2(0),B=d2(()=>JSON.stringify(X),[X]),_=d2(()=>{if(Q===void 0)return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1};return cY($,Q)},[$,Q]);X6(()=>{if(!$.includes("@")){U([]),O(!1);return}let C=Date.now();if(E$&&E$.cwd===J&&E$.ignoreKey===B&&C-E$.timestamp<pY){U(E$.files),O(!1);return}let N=!1,M=setTimeout(async()=>{O(!0);try{let k=(await gY("**/*",{cwd:J,dot:!1,followSymbolicLinks:!1,onlyFiles:!1,markDirectories:!0,unique:!0,ignore:X})).map((P)=>P.replace(/\\/g,"/"));if(!N)U(k),E$={cwd:J,ignoreKey:B,files:k,timestamp:C}}catch(w){if(console.error("Failed to load files for @ completion:",w),!N)U([])}finally{if(!N)O(!1)}},G);return()=>{N=!0,clearTimeout(M)}},[$,J,G,B]);let H=d2(()=>{if(!_.hasQuery||K.length===0)return[];let C=_.query.toLowerCase();if(C==="")return K.slice(0,Z);if(q)return new mY(K,{threshold:0.4,ignoreLocation:!0,minMatchCharLength:1}).search(C).slice(0,Z).map((M)=>M.item);return K.filter((N)=>N.toLowerCase().includes(C)).slice(0,Z)},[_,K,Z,q]);return X6(()=>{z(0)},[H]),{..._,suggestions:H,selectedIndex:W,loading:F}}function uY($,Q=!1){if($.includes(" ")||Q)return`@"${$}"`;return`@${$}`}function q6($,Q,Y){if(!Q.hasQuery)return{newInput:$,newCursorPos:$.length};let J=uY(Y,Q.quoted),Z=$.slice(0,Q.startIndex),X=$.slice(Q.endIndex),G=Z+J+" "+X,q=Q.startIndex+J.length+1;return{newInput:G,newCursorPos:q}}import{useMemoizedFn as U6}from"ahooks";import{useEffect as O6,useRef as z6}from"react";var v0=($,Q)=>{let Y=z6(!1),J=z6(null),Z=U6(()=>{if(J.current)clearTimeout(J.current);J.current=setTimeout(()=>{a0().setAwaitingSecondCtrlC(!1),Y.current=!1,J.current=null},3000)}),X=()=>{K8().shutdown("SIGINT",0)},G=U6(()=>{if(!Y.current){if(Y.current=!0,$&&Q)Q();a0().setAwaitingSecondCtrlC(!0),Z()}else{if(J.current)clearTimeout(J.current),J.current=null;a0().setAwaitingSecondCtrlC(!1),X()}});return O6(()=>{if($){if(a0().setAwaitingSecondCtrlC(!1),Y.current=!1,J.current)clearTimeout(J.current),J.current=null}},[$]),O6(()=>{return()=>{if(J.current)clearTimeout(J.current)}},[]),G};var n8=e1("UI"),L6=($,Q,Y,J,Z,X,G,q,K,U)=>{let O=e0()==="main-input",W=$.value,z=$.setValue,B=$.cursorPosition,_=n1(),H=I1(),C=t1(),N=M8(),v=N?o8(N):!1,[M,w]=i2(!1),[k,P]=i2([]),[A,T]=i2(0),y=K6(W,B,{cwd:H,maxSuggestions:10}),L=v0(G||!1,X),f=F6(0),h=500,t=F6(!1);N6(()=>{if(G)t.current=!1},[G]),N6(()=>{if(y.hasQuery&&y.suggestions.length>0){let I=y.suggestions.map((R)=>({command:R,description:H6(R)?`Directory: ${R}`:`File: ${R}`,matchScore:1}));P(I),w(!0),T(0)}else if(W.startsWith("/"))if(W.includes(" "))w(!1),P([]);else{let R=W6(W,H);P(R),w(R.length>0),T(0)}else w(!1),P([])},[W,y.hasQuery,y.suggestions,H]);let l=_6(()=>{_.clearMessages(),_.setError(null)}),a=_6(()=>{n8.debug("[DIAG] handleSubmit called:",{input:W,showSuggestions:M});let I=W.trim();if(I){let R=$.resolveInput(I);n8.debug("[DIAG] Submitting command:",{displayText:I,textLength:R.text.length,imageCount:R.images.length}),w(!1),P([]);let S=$.pasteMap.size>0?new Map($.pasteMap):new Map;Z(I,S),$.clear(),Q(R),n8.debug("[DIAG] Command submitted to onSubmit callback")}else n8.debug("[DIAG] Empty command, not submitting")});return lY((I,R)=>{if(I==="?"&&!W){K?.(),setTimeout(()=>$.clear(),0);return}if(R.backspace||R.delete||R.leftArrow||R.rightArrow||R.pageUp||R.pageDown||!R.ctrl&&!R.meta&&!R.escape&&!R.tab&&!R.upArrow&&!R.downArrow&&!R.return&&!(I==="?"&&!W))return;if(R.ctrl&&I==="c"||R.meta&&I==="c"||R.ctrl&&I==="d"||R.meta&&I==="d"){L();return}if(R.ctrl&&I==="l"||R.meta&&I==="l"){l();return}if(R.ctrl&&I==="t"||R.meta&&I==="t"){_.toggleThinkingExpanded();return}if(R.ctrl&&I==="o"||R.meta&&I==="o"){_.toggleHistoryExpanded();return}if(R.escape){if(U)K?.();else if(G&&X){if(t.current)return;t.current=!0,X()}else if(M)w(!1),P([]);else if(W){let b=Date.now();if(b-f.current<500)$.clear(),f.current=0;else f.current=b}return}if(R.tab&&R.shift){q?.();return}if(R.tab){if(M&&k.length>0){let b=k[A].command;if(y.hasQuery&&y.suggestions.includes(b)){let{newInput:V,newCursorPos:p}=q6(W,y,b);z(V),$.setCursorPosition(p)}else{let V=b+" ";z(V),$.setCursorPosition(V.length)}w(!1),P([])}else if(v)C.toggleThinkingMode();return}if(R.return){a();return}if(R.upArrow){if(M&&k.length>0){let b=k.length-1;T((V)=>V>0?V-1:b)}else{let b=Y();if(b){if(b.pasteMappings.size>0)$.restorePasteMappings(b.pasteMappings);z(b.display),$.setCursorPosition(b.display.length)}}return}if(R.downArrow){if(M&&k.length>0){let b=k.length-1;T((V)=>V<b?V+1:0)}else{let b=J();if(b){if(b.pasteMappings.size>0)$.restorePasteMappings(b.pasteMappings);z(b.display),$.setCursorPosition(b.display.length)}}return}},{isActive:O}),{handleSubmit:a,showSuggestions:M,suggestions:k,selectedSuggestionIndex:A}};import oY from"ansi-escapes";import{useStdout as nY}from"ink";import{useCallback as tY,useEffect as sY,useRef as eY}from"react";import{useStdout as dY}from"ink";import{debounce as rY}from"lodash-es";import{useEffect as aY,useState as iY}from"react";function g$($=200){let{stdout:Q}=dY(),[Y,J]=iY(Q.columns||80);return aY(()=>{let Z=rY(()=>{J(Q.columns||80)},$);return Z(),Q.on("resize",Z),()=>{Q.off("resize",Z),Z.cancel()}},[Q,$]),Y}function B6(){let{stdout:$}=nY(),Q=g$(),Y=eY(!0),J=s((X)=>X.session.actions.incrementClearCount),Z=tY(()=>{if($)$.write(oY.clearTerminal);J()},[$,J]);return sY(()=>{if(Y.current){Y.current=!1;return}let X=setTimeout(()=>{Z()},300);return()=>{clearTimeout(X)}},[Q,Z]),{refreshStatic:Z}}import w6 from"node:fs";import $3 from"node:os";import o2 from"node:path";import{MultiSelect as Q3}from"@inkjs/ui";import{useMemoizedFn as t8}from"ahooks";import{Box as Z0,Text as n,useFocus as J3,useFocusManager as Y3,useInput as A6}from"ink";import s8 from"ink-select-input";import Z3 from"ink-spinner";import q8 from"ink-text-input";import{useEffect as b6,useState as m$}from"react";import{jsxDEV as D}from"react/jsx-dev-runtime";var X3=[{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"}],G3=[{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 K3($){if(!$||$.trim()==="")return"名称不能为空";if(!/^[a-z0-9-]+$/.test($))return"名称只能包含小写字母、数字和连字符";if($.startsWith("-")||$.endsWith("-"))return"名称不能以连字符开头或结尾";return null}function U8({onComplete:$,onCancel:Q,initialConfig:Y}){let[J,Z]=m$(Y?"name":"mode"),[X,G]=m$({name:Y?.name||"",description:Y?.description||"",tools:Y?.tools||[],color:Y?.color,location:Y?.location||"project",systemPrompt:Y?.systemPrompt||""}),[q,K]=m$(""),[U,F]=m$(!1),[O,W]=m$(""),[z,B]=m$(Y?"edit":"manual"),{focus:_}=Y3(),C={manual:["mode","name","description","tools","color","location","systemPrompt","confirm"],ai:["mode","aiPrompt","aiGenerating","confirm"],edit:["name","description","tools","color","location","systemPrompt","confirm"]}[z];b6(()=>{if(J==="name"||J==="description"||J==="systemPrompt"||J==="aiPrompt")return;_(`step-${J}`)},[J,_]);let N=t8(()=>{let P=C.indexOf(J);if(P<C.length-1)Z(C[P+1])}),v=t8(()=>{if(O)W("");if(J==="confirm"&&z==="ai"){Z("aiPrompt");return}let P=C.indexOf(J);if(P>0)Z(C[P-1]);else Q()}),M=t8(async()=>{F(!0),W("");try{let P=await Y8.create(),A=`你是一个 Subagent 配置生成专家。用户会描述他们想要创建的 agent,你需要根据描述生成一个完整的 agent 配置。
40
+ ${u0}`}]}}let x0=p2(_0),X1=await P(x0);if(!X1.accepted){let u0=X1.reason==="queue_full"?"补充指令队列已满,请等待当前任务处理后重试。":"当前任务正在结束,补充指令未入队,请稍后重试。";F.addAssistantMessage(u0);return}if(N.enqueueCommand(q0),F.addUserMessage(q0.displayText),X1.delivery==="next_turn"){if(M.current=!0,!$1().command.isProcessing)queueMicrotask(()=>{D1()})}return}C.setTasks([]),N.setRecoveredSteeringCount(0),S.current=!1;let R0=N.createAbortController();H1.resetStreamingBuffers(),F.clearFinalizingStreamingMessageId(),N.setProcessing(!0);try{let Q0=await j2(q0);if(!Q0.success&&Q0.error&&Q0.error!=="aborted")F.setError(Q0.error)}catch(Q0){let _0=V8(Q0);if(_0.isAbort);else F.setError(`执行失败: ${_0.displayMessage}`)}finally{if(N.getAbortController()===R0){if(N.setProcessing(!1),N.clearAbortController(R0),F.setCurrentThinkingContent(null),M.current)queueMicrotask(()=>{D1()})}}});return d8(()=>{let q0=s4.subscribe((R0)=>{if(R0.type!=="subagent.completion.queued"||!t4(R0,{sessionId:q,projectPath:K}))return;M.current=!0,queueMicrotask(()=>{D1()})});return()=>{q0()}},[D1,q,K]),d8(()=>{let q0=!1;return(async()=>{if(Y)await l2.resolvePendingWithHandler(K,q,Y);else await l2.cancelPendingNonInteractive(K,q);if(q0)return;let[R0,Q0]=await Promise.all([j1.hasPendingInbox(K,q),j1.hasActiveGoal(K,q)]);if(R0||Q0)await D1()})().catch((R0)=>{if(!q0)x2.warn("[useCommandHandler] Failed to recover pending interaction or inbox",R0)}),()=>{q0=!0}},[Y,D1,q,K]),{executeCommand:h2,handleAbort:k$,isProcessing:G,cleanupAgent:k}};import{useMemoizedFn as r8}from"ahooks";import{useState as Q6}from"react";var J6=()=>{let[$,Q]=Q6([]),[Y,J]=Q6(-1),Z=r8((K,U)=>{let W={display:K,pasteMappings:U?new Map(U):new Map};Q((O)=>[...O,W]),J(-1)}),X=r8(()=>{if($.length===0)return null;let K=Y===-1?$.length-1:Math.max(0,Y-1);return J(K),$[K]||null}),G=r8(()=>{if(Y===-1)return null;let K=Y+1;if(K>=$.length)return J(-1),null;else return J(K),$[K]||null}),q=r8(()=>{J(-1)});return{commandHistory:$,historyIndex:Y,addToHistory:Z,getPreviousCommand:X,getNextCommand:G,resetHistoryIndex:q}};import{useMemoizedFn as G8}from"ahooks";import{useMemo as jY,useRef as Y6,useState as hY}from"react";var Z6=()=>{let[$,Q]=hY({isVisible:!1,details:null,resolver:null}),Y=Y6(null),J=Y6([]),Z=G8((W)=>{Y.current=W,Q({isVisible:Boolean(W),details:W?.details??null,resolver:W?.resolve??null})}),X=G8((W,O)=>{if(W.settled)return;if(W.settled=!0,W.signal&&W.abortListener)W.signal.removeEventListener("abort",W.abortListener);W.resolve(O)}),G=G8((W,O)=>{return new Promise((H)=>{let z={details:W,resolve:H,signal:O,settled:!1},w=()=>{if(Y.current===z){X(z,{approved:!1,reason:K8}),Z(J.current.shift()??null);return}let _=J.current.indexOf(z);if(_>=0)J.current.splice(_,1);X(z,{approved:!1,reason:K8})};if(z.abortListener=w,O?.aborted){w();return}if(O?.addEventListener("abort",w,{once:!0}),!Y.current){Z(z);return}J.current.push(z)})}),q=G8((W)=>{let O=Y.current;if(O)X(O,W);let H=J.current.shift()??null;Z(H)}),K=G8(()=>{if(Y.current)X(Y.current,{approved:!1,reason:K8});for(let W of J.current)X(W,{approved:!1,reason:K8});J.current=[],Z(null)}),U=jY(()=>({requestConfirmation:G}),[G]);return{confirmationState:$,confirmationHandler:U,handleResponse:q,dismissAll:K}};import{useMemoizedFn as F$}from"ahooks";import{useRef as X6,useState as EY}from"react";var a8="␞",o8="␟";function i8($){return`${a8}PASTE:${$}:`}function d2(){return o8}var BG=new RegExp(`${a8}PASTE:(\\d+):[\\s\\S]*?${o8}`,"g");function gY($){return $.includes(a8)&&$.includes(o8)}function G6($="",Q=0){let[Y,J]=EY({value:$,cursorPosition:Q}),Z=X6(0),X=X6(new Map),G=F$((z)=>{J((w)=>({value:z,cursorPosition:w.cursorPosition}));for(let w of X.current.keys()){let _=i8(w);if(!z.includes(_))X.current.delete(w)}}),q=F$((z)=>{J((w)=>({...w,cursorPosition:Math.max(0,Math.min(z,w.value.length))}))}),K=F$(()=>{J({value:"",cursorPosition:0}),X.current.clear()}),U=F$((z)=>{Z.current+=1;let w=Z.current;return X.current.set(w,{type:"text",data:z}),w}),W=F$((z,w)=>{let _=[...X.current.values()].filter((S)=>S.type==="image");if(_.length>=V$)throw Error(`最多只能粘贴 ${V$} 张图片`);let F=_.reduce((S,M)=>S+`data:${M.mimeType};base64,`.length+M.data.length,0),C=`data:${w};base64,`.length+z.length;if(F+C>E8)throw Error("图片编码后总大小不能超过 5 MiB");Z.current+=1;let N=Z.current;return X.current.set(N,{type:"image",data:z,mimeType:w}),N}),O=F$((z)=>{for(let[w,_]of z)if(X.current.set(w,_),w>=Z.current)Z.current=w}),H=F$((z)=>{let w=[],_=[];if(!gY(z)){let T=z.trim();if(T)_.push({type:"text",text:T});return{displayText:z,text:z,images:w,parts:_}}let F=new RegExp(`${a8}PASTE:(\\d+):[\\s\\S]*?${o8}`,"g"),C=Array.from(z.matchAll(F)),N=0,S="",M="";for(let T of C){let y=T.index,L=y+T[0].length,f=parseInt(T[1],10),h=X.current.get(f);if(y>N){let s=z.slice(N,y);_.push({type:"text",text:s}),S+=s,M+=s}if(!h)S+=T[0],M+=T[0],_.push({type:"text",text:T[0]});else if(h.type==="text")S+=h.data,M+=h.data,_.push({type:"text",text:h.data});else{let s={id:f,base64:h.data,mimeType:h.mimeType};w.push(s),_.push({type:"image",...s}),M+=`[Image #${f}]`}N=L}if(N<z.length){let T=z.slice(N);_.push({type:"text",text:T}),S+=T,M+=T}let B=[];for(let T of _)if(T.type==="text"&&B.length>0&&B[B.length-1].type==="text")B[B.length-1].text+=T.text;else B.push(T);let k=0,P=B.length;while(k<B.length&&B[k].type==="text"&&B[k].text.trim()==="")k++;while(P>k&&B[P-1].type==="text"&&B[P-1].text.trim()==="")P--;let A=B.slice(k,P);return{displayText:M.trim(),text:S.trim(),images:w,parts:A}});return{value:Y.value,cursorPosition:Y.cursorPosition,setValue:G,setCursorPosition:q,clear:K,pasteMap:X.current,addPasteMapping:U,addImagePasteMapping:W,restorePasteMappings:O,resolveInput:H}}import{useMemoizedFn as F6}from"ahooks";import{useInput as rY}from"ink";import{useEffect as H6,useRef as W6,useState as i2}from"react";function mY($){return{supportsThinking:h1().resolveConfig($).reasoning}}function n8($){return mY($).supportsThinking}import pY from"fast-glob";import cY from"fuse.js";import{useEffect as K6,useMemo as r2,useState as a2}from"react";var E$=null,xY=5000;function uY($,Q){let Y=[...$.matchAll(/(?:^|\s)(@(?:"[^"]*"|(?:[^\\ ]|\\ )*))/g)];for(let J of Y){let Z=J[1],X=J.index+(J[0].length-Z.length),G=X+Z.length;if(Q>=X&&Q<=G){let q=Z.slice(1),K=!1;if(q.startsWith('"')){if(K=!0,q=q.slice(1),q.endsWith('"'))q=q.slice(0,-1)}return{hasQuery:!0,query:q,startIndex:X,endIndex:G,quoted:K}}}return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1}}var lY=[...o2.map(($)=>`${$}/**`),...o2,...q6.map(($)=>`**/${$}`)];function U6($,Q,Y={}){let{cwd:J=l0(),maxSuggestions:Z=15,ignorePatterns:X=lY,debounceDelay:G=300,fuzzyMatch:q=!0}=Y,[K,U]=a2([]),[W,O]=a2(!1),[H,z]=a2(0),w=r2(()=>JSON.stringify(X),[X]),_=r2(()=>{if(Q===void 0)return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1};return uY($,Q)},[$,Q]);K6(()=>{if(!$.includes("@")){U([]),O(!1);return}let C=Date.now();if(E$&&E$.cwd===J&&E$.ignoreKey===w&&C-E$.timestamp<xY){U(E$.files),O(!1);return}let N=!1,M=setTimeout(async()=>{O(!0);try{let k=(await pY("**/*",{cwd:J,dot:!1,followSymbolicLinks:!1,onlyFiles:!1,markDirectories:!0,unique:!0,ignore:X})).map((P)=>P.replace(/\\/g,"/"));if(!N)U(k),E$={cwd:J,ignoreKey:w,files:k,timestamp:C}}catch(B){if(console.error("Failed to load files for @ completion:",B),!N)U([])}finally{if(!N)O(!1)}},G);return()=>{N=!0,clearTimeout(M)}},[$,J,G,w]);let F=r2(()=>{if(!_.hasQuery||K.length===0)return[];let C=_.query.toLowerCase();if(C==="")return K.slice(0,Z);if(q)return new cY(K,{threshold:0.4,ignoreLocation:!0,minMatchCharLength:1}).search(C).slice(0,Z).map((M)=>M.item);return K.filter((N)=>N.toLowerCase().includes(C)).slice(0,Z)},[_,K,Z,q]);return K6(()=>{z(0)},[F]),{..._,suggestions:F,selectedIndex:H,loading:W}}function dY($,Q=!1){if($.includes(" ")||Q)return`@"${$}"`;return`@${$}`}function O6($,Q,Y){if(!Q.hasQuery)return{newInput:$,newCursorPos:$.length};let J=dY(Y,Q.quoted),Z=$.slice(0,Q.startIndex),X=$.slice(Q.endIndex),G=Z+J+" "+X,q=Q.startIndex+J.length+1;return{newInput:G,newCursorPos:q}}import{useMemoizedFn as z6}from"ahooks";import{useEffect as _6,useRef as N6}from"react";var S0=($,Q)=>{let Y=N6(!1),J=N6(null),Z=z6(()=>{if(J.current)clearTimeout(J.current);J.current=setTimeout(()=>{a0().setAwaitingSecondCtrlC(!1),Y.current=!1,J.current=null},3000)}),X=()=>{q8().shutdown("SIGINT",0)},G=z6(()=>{if(!Y.current){if(Y.current=!0,$&&Q)Q();a0().setAwaitingSecondCtrlC(!0),Z()}else{if(J.current)clearTimeout(J.current),J.current=null;a0().setAwaitingSecondCtrlC(!1),X()}});return _6(()=>{if($){if(a0().setAwaitingSecondCtrlC(!1),Y.current=!1,J.current)clearTimeout(J.current),J.current=null}},[$]),_6(()=>{return()=>{if(J.current)clearTimeout(J.current)}},[]),G};var t8=e1("UI"),w6=($,Q,Y,J,Z,X,G,q,K,U)=>{let O=e0()==="main-input",H=$.value,z=$.setValue,w=$.cursorPosition,_=n1(),F=I1(),C=t1(),N=C8(),S=N?n8(N):!1,[M,B]=i2(!1),[k,P]=i2([]),[A,T]=i2(0),y=U6(H,w,{cwd:F,maxSuggestions:10}),L=S0(G||!1,X),f=W6(0),h=500,s=W6(!1);H6(()=>{if(G)s.current=!1},[G]),H6(()=>{if(y.hasQuery&&y.suggestions.length>0){let I=y.suggestions.map((R)=>({command:R,description:L6(R)?`Directory: ${R}`:`File: ${R}`,matchScore:1}));P(I),B(!0),T(0)}else if(H.startsWith("/"))if(H.includes(" "))B(!1),P([]);else{let R=B6(H,F);P(R),B(R.length>0),T(0)}else B(!1),P([])},[H,y.hasQuery,y.suggestions,F]);let l=F6(()=>{_.clearMessages(),_.setError(null)}),a=F6(()=>{t8.debug("[DIAG] handleSubmit called:",{input:H,showSuggestions:M});let I=H.trim();if(I){let R=$.resolveInput(I);t8.debug("[DIAG] Submitting command:",{displayText:I,textLength:R.text.length,imageCount:R.images.length}),B(!1),P([]);let v=$.pasteMap.size>0?new Map($.pasteMap):new Map;Z(I,v),$.clear(),Q(R),t8.debug("[DIAG] Command submitted to onSubmit callback")}else t8.debug("[DIAG] Empty command, not submitting")});return rY((I,R)=>{if(I==="?"&&!H){K?.(),setTimeout(()=>$.clear(),0);return}if(R.backspace||R.delete||R.leftArrow||R.rightArrow||R.pageUp||R.pageDown||!R.ctrl&&!R.meta&&!R.escape&&!R.tab&&!R.upArrow&&!R.downArrow&&!R.return&&!(I==="?"&&!H))return;if(R.ctrl&&I==="c"||R.meta&&I==="c"||R.ctrl&&I==="d"||R.meta&&I==="d"){L();return}if(R.ctrl&&I==="l"||R.meta&&I==="l"){l();return}if(R.ctrl&&I==="t"||R.meta&&I==="t"){_.toggleThinkingExpanded();return}if(R.ctrl&&I==="o"||R.meta&&I==="o"){_.toggleHistoryExpanded();return}if(R.escape){if(U)K?.();else if(G&&X){if(s.current)return;s.current=!0,X()}else if(M)B(!1),P([]);else if(H){let b=Date.now();if(b-f.current<500)$.clear(),f.current=0;else f.current=b}return}if(R.tab&&R.shift){q?.();return}if(R.tab){if(M&&k.length>0){let b=k[A].command;if(y.hasQuery&&y.suggestions.includes(b)){let{newInput:V,newCursorPos:p}=O6(H,y,b);z(V),$.setCursorPosition(p)}else{let V=b+" ";z(V),$.setCursorPosition(V.length)}B(!1),P([])}else if(S)C.toggleThinkingMode();return}if(R.return){a();return}if(R.upArrow){if(M&&k.length>0){let b=k.length-1;T((V)=>V>0?V-1:b)}else{let b=Y();if(b){if(b.pasteMappings.size>0)$.restorePasteMappings(b.pasteMappings);z(b.display),$.setCursorPosition(b.display.length)}}return}if(R.downArrow){if(M&&k.length>0){let b=k.length-1;T((V)=>V<b?V+1:0)}else{let b=J();if(b){if(b.pasteMappings.size>0)$.restorePasteMappings(b.pasteMappings);z(b.display),$.setCursorPosition(b.display.length)}}return}},{isActive:O}),{handleSubmit:a,showSuggestions:M,suggestions:k,selectedSuggestionIndex:A}};import tY from"ansi-escapes";import{useStdout as sY}from"ink";import{useCallback as eY,useEffect as $3,useRef as Q3}from"react";import{useStdout as aY}from"ink";import{debounce as oY}from"lodash-es";import{useEffect as iY,useState as nY}from"react";function g$($=200){let{stdout:Q}=aY(),[Y,J]=nY(Q.columns||80);return iY(()=>{let Z=oY(()=>{J(Q.columns||80)},$);return Z(),Q.on("resize",Z),()=>{Q.off("resize",Z),Z.cancel()}},[Q,$]),Y}function b6(){let{stdout:$}=sY(),Q=g$(),Y=Q3(!0),J=n((X)=>X.session.actions.incrementClearCount),Z=eY(()=>{if($)$.write(tY.clearTerminal);J()},[$,J]);return $3(()=>{if(Y.current){Y.current=!1;return}let X=setTimeout(()=>{Z()},300);return()=>{clearTimeout(X)}},[Q,Z]),{refreshStatic:Z}}import A6 from"node:fs";import J3 from"node:os";import n2 from"node:path";import{MultiSelect as Y3}from"@inkjs/ui";import{useMemoizedFn as s8}from"ahooks";import{Box as Z0,Text as t,useFocus as Z3,useFocusManager as X3,useInput as R6}from"ink";import e8 from"ink-select-input";import G3 from"ink-spinner";import U8 from"ink-text-input";import{useEffect as P6,useState as m$}from"react";import{jsxDEV as D}from"react/jsx-dev-runtime";var K3=[{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"}],q3=[{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 U3($){if(!$||$.trim()==="")return"名称不能为空";if(!/^[a-z0-9-]+$/.test($))return"名称只能包含小写字母、数字和连字符";if($.startsWith("-")||$.endsWith("-"))return"名称不能以连字符开头或结尾";return null}function O8({onComplete:$,onCancel:Q,initialConfig:Y}){let[J,Z]=m$(Y?"name":"mode"),[X,G]=m$({name:Y?.name||"",description:Y?.description||"",tools:Y?.tools||[],color:Y?.color,location:Y?.location||"project",systemPrompt:Y?.systemPrompt||""}),[q,K]=m$(""),[U,W]=m$(!1),[O,H]=m$(""),[z,w]=m$(Y?"edit":"manual"),{focus:_}=X3(),C={manual:["mode","name","description","tools","color","location","systemPrompt","confirm"],ai:["mode","aiPrompt","aiGenerating","confirm"],edit:["name","description","tools","color","location","systemPrompt","confirm"]}[z];P6(()=>{if(J==="name"||J==="description"||J==="systemPrompt"||J==="aiPrompt")return;_(`step-${J}`)},[J,_]);let N=s8(()=>{let P=C.indexOf(J);if(P<C.length-1)Z(C[P+1])}),S=s8(()=>{if(O)H("");if(J==="confirm"&&z==="ai"){Z("aiPrompt");return}let P=C.indexOf(J);if(P>0)Z(C[P-1]);else Q()}),M=s8(async()=>{W(!0),H("");try{let P=await Z8.create(),A=`你是一个 Subagent 配置生成专家。用户会描述他们想要创建的 agent,你需要根据描述生成一个完整的 agent 配置。
41
41
 
42
42
  ## 可用工具列表
43
43
 
@@ -113,48 +113,48 @@ ${u0}`}]}}let x0=m2(_0),X1=await P(x0);if(!X1.accepted){let u0=X1.reason==="queu
113
113
  4. **color**: 选择一个合适的颜色用于 UI 区分
114
114
  5. **systemPrompt**: 详细说明 agent 的职责、使用的工具、输出格式等,使用 Markdown 格式
115
115
 
116
- **重要**:请直接返回 JSON,不要添加任何额外的解释或文字。`,q)).trim(),L=y.match(/```(?:json)?\s*\n([\s\S]*?)\n```/);if(L)y=L[1];let f=JSON.parse(y);if(!f.name||!f.description||!f.systemPrompt)throw Error("Missing required fields: name, description, or systemPrompt");if(!/^[a-z0-9]+(-[a-z0-9]+)*$/.test(f.name))throw Error("Invalid name format. Must be kebab-case (lowercase, numbers, hyphens only)");G({name:f.name,description:f.description,tools:Array.isArray(f.tools)?f.tools:[],color:f.color||"blue",location:"project",systemPrompt:f.systemPrompt}),Z("confirm")}catch(P){W(P instanceof Error?P.message:String(P))}finally{F(!1)}});b6(()=>{if(J==="aiGenerating"&&!U&&!O)M()},[J,U,O,M]);let w=t8(async()=>{try{let P=X.location==="project"?o2.join(l0(),".blade","agents"):o2.join($3.homedir(),".blade","agents");await w6.promises.mkdir(P,{recursive:!0});let A=["---",`name: ${X.name}`,`description: ${X.description}`];if(X.tools.length>0&&!X.tools.includes("all")){A.push("tools:");for(let L of X.tools)A.push(` - ${L}`)}if(X.color)A.push(`color: ${X.color}`);A.push("---");let T=[A.join(`
116
+ **重要**:请直接返回 JSON,不要添加任何额外的解释或文字。`,q)).trim(),L=y.match(/```(?:json)?\s*\n([\s\S]*?)\n```/);if(L)y=L[1];let f=JSON.parse(y);if(!f.name||!f.description||!f.systemPrompt)throw Error("Missing required fields: name, description, or systemPrompt");if(!/^[a-z0-9]+(-[a-z0-9]+)*$/.test(f.name))throw Error("Invalid name format. Must be kebab-case (lowercase, numbers, hyphens only)");G({name:f.name,description:f.description,tools:Array.isArray(f.tools)?f.tools:[],color:f.color||"blue",location:"project",systemPrompt:f.systemPrompt}),Z("confirm")}catch(P){H(P instanceof Error?P.message:String(P))}finally{W(!1)}});P6(()=>{if(J==="aiGenerating"&&!U&&!O)M()},[J,U,O,M]);let B=s8(async()=>{try{let P=X.location==="project"?n2.join(l0(),".blade","agents"):n2.join(J3.homedir(),".blade","agents");await A6.promises.mkdir(P,{recursive:!0});let A=["---",`name: ${X.name}`,`description: ${X.description}`];if(X.tools.length>0&&!X.tools.includes("all")){A.push("tools:");for(let L of X.tools)A.push(` - ${L}`)}if(X.color)A.push(`color: ${X.color}`);A.push("---");let T=[A.join(`
117
117
  `),"",`# ${X.name} Subagent`,"",X.systemPrompt||"你是一个专门的代理,负责执行特定任务。",""].join(`
118
- `),y=o2.join(P,`${X.name}.md`);await w6.promises.writeFile(y,T,"utf-8"),$()}catch(P){console.error("保存配置失败:",P)}}),k=v0(!1,Q);if(A6((P,A)=>{if(A.escape)v();else if(A.ctrl&&P==="c"||A.meta&&P==="c")k()},{isActive:J!=="tools"}),J==="mode")return D(Z0,{flexDirection:"column",paddingY:1,children:[D(Z0,{marginBottom:1,children:D(n,{bold:!0,color:"cyan",children:"选择创建方式"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(Z0,{marginBottom:1,children:D(n,{dimColor:!0,children:"你可以手动配置每个细节,或让 AI 根据你的描述自动生成配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(s8,{items:[{label:"AI 智能生成 - 根据描述自动生成完整配置",value:"ai"},{label:"手动配置 - 逐步配置每个选项",value:"manual"}],onSelect:(P)=>{if(P.value==="ai")B("ai"),Z("aiPrompt");else B("manual"),Z("name")}},void 0,!1,void 0,this),D(Z0,{marginTop:1,children:D(n,{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 D(Z0,{flexDirection:"column",paddingY:1,children:[D(Z0,{marginBottom:1,children:D(n,{bold:!0,color:"cyan",children:"AI 智能生成"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(Z0,{marginBottom:1,children:D(n,{dimColor:!0,children:'描述你想要创建的 Agent(例如:"一个专门用于代码审查的 agent,能够分析代码质量和潜在bug")'},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(Z0,{marginBottom:1,children:[D(n,{color:"green",children:"描述: "},void 0,!1,void 0,this),D(q8,{value:q,onChange:K,onSubmit:(P)=>{if(!P.trim())return;Z("aiGenerating")}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D(Z0,{children:D(n,{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 D(Z0,{flexDirection:"column",paddingY:1,children:[D(Z0,{marginBottom:1,children:D(n,{bold:!0,color:"red",children:"AI 生成失败"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(Z0,{marginBottom:1,children:D(n,{color:"red",children:O},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(Z0,{marginBottom:1,children:D(n,{dimColor:!0,children:"按 ESC 返回修改描述"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return D(Z0,{flexDirection:"column",paddingY:1,children:[D(Z0,{marginBottom:1,children:D(n,{bold:!0,color:"yellow",children:[D(Z3,{type:"dots"},void 0,!1,void 0,this)," AI 正在生成配置..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),D(Z0,{marginBottom:1,children:D(n,{dimColor:!0,children:['根据你的描述:"',q,'"']},void 0,!0,void 0,this)},void 0,!1,void 0,this),D(Z0,{marginBottom:1,children:D(n,{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 P=z==="edit";return D(Z0,{flexDirection:"column",paddingY:1,children:[D(Z0,{marginBottom:1,children:D(n,{bold:!0,color:"cyan",children:["Step 1/7: ",P?"Agent 名称(不可修改)":"输入 Agent 名称"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),D(Z0,{marginBottom:1,children:D(n,{dimColor:!0,children:P?"编辑模式下名称不可修改(修改名称相当于创建新 Agent)":"名称只能包含小写字母、数字和连字符(例如:code-reviewer)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(Z0,{marginBottom:1,children:[D(n,{color:"green",children:"名称: "},void 0,!1,void 0,this),P?D(n,{children:X.name},void 0,!1,void 0,this):D(q8,{value:X.name,onChange:(A)=>G({...X,name:A}),onSubmit:(A)=>{if(K3(A))return;N()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D(Z0,{children:D(n,{dimColor:!0,children:P?"按 Enter 继续 | ESC 返回":"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),P&&D(q8,{value:"",onChange:()=>{},onSubmit:N,showCursor:!1},"edit-mode-dummy-input",!1,void 0,this)]},void 0,!0,void 0,this)}if(J==="description")return D(Z0,{flexDirection:"column",paddingY:1,children:[D(Z0,{marginBottom:1,children:D(n,{bold:!0,color:"cyan",children:"Step 2/7: 输入描述信息"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(Z0,{marginBottom:1,children:D(n,{dimColor:!0,children:"简短描述这个 Agent 的用途和使用场景(这将帮助主 Agent 决定何时使用它)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(Z0,{marginBottom:1,children:[D(n,{color:"green",children:"描述: "},void 0,!1,void 0,this),D(q8,{value:X.description,onChange:(P)=>G({...X,description:P}),onSubmit:(P)=>{if(!P.trim())return;N()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D(Z0,{children:D(n,{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 D(q3,{config:X,setConfig:G,onNext:N,onPrev:v},void 0,!1,void 0,this);if(J==="color")return D(Z0,{flexDirection:"column",paddingY:1,children:[D(Z0,{marginBottom:1,children:D(n,{bold:!0,color:"cyan",children:"Step 4/7: 选择背景颜色"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(Z0,{marginBottom:1,children:D(n,{dimColor:!0,children:"为 Agent 选择一个颜色标识(用于在 UI 中区分不同的 Agents)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(s8,{items:G3,onSelect:(P)=>{let A=P.value==="none"?void 0:P.value;G({...X,color:A}),N()}},void 0,!1,void 0,this),D(Z0,{marginTop:1,children:D(n,{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 D(Z0,{flexDirection:"column",paddingY:1,children:[D(Z0,{marginBottom:1,children:D(n,{bold:!0,color:"cyan",children:"Step 5/7: 选择保存位置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(Z0,{marginBottom:1,children:D(n,{dimColor:!0,children:"项目级配置仅在当前项目生效,用户级配置全局可用"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(s8,{items:[{label:"项目级 (.blade/agents/) - 仅当前项目",value:"project"},{label:"用户级 (~/.blade/agents/) - 全局可用",value:"user"}],onSelect:(P)=>{G({...X,location:P.value}),N()}},void 0,!1,void 0,this),D(Z0,{marginTop:1,children:D(n,{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 D(Z0,{flexDirection:"column",paddingY:1,children:[D(Z0,{marginBottom:1,children:D(n,{bold:!0,color:"cyan",children:"Step 6/7: 输入系统提示词"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(Z0,{marginBottom:1,children:D(n,{dimColor:!0,children:"定义 Agent 的行为和职责(可选,留空将使用默认提示)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(Z0,{marginBottom:1,children:[D(n,{color:"green",children:"提示词: "},void 0,!1,void 0,this),D(q8,{value:X.systemPrompt,onChange:(P)=>G({...X,systemPrompt:P}),onSubmit:()=>N()},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D(Z0,{children:D(n,{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 D(Z0,{flexDirection:"column",paddingY:1,children:[D(Z0,{marginBottom:1,children:D(n,{bold:!0,color:"cyan",children:"Step 7/7: 确认配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(Z0,{flexDirection:"column",paddingLeft:2,marginBottom:1,children:[D(n,{children:[D(n,{bold:!0,color:"green",children:["名称:"," "]},void 0,!0,void 0,this),D(n,{children:X.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D(n,{children:[D(n,{bold:!0,color:"green",children:["描述:"," "]},void 0,!0,void 0,this),D(n,{children:X.description},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D(n,{children:[D(n,{bold:!0,color:"green",children:["工具:"," "]},void 0,!0,void 0,this),D(n,{children:X.tools.includes("all")?"所有工具":X.tools.join(", ")||"所有工具"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D(n,{children:[D(n,{bold:!0,color:"green",children:["颜色:"," "]},void 0,!0,void 0,this),D(n,{children:X.color||"默认"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D(n,{children:[D(n,{bold:!0,color:"green",children:["位置:"," "]},void 0,!0,void 0,this),D(n,{children:X.location==="project"?"项目级":"用户级"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D(n,{children:[D(n,{bold:!0,color:"green",children:["提示词:"," "]},void 0,!0,void 0,this),D(n,{children:X.systemPrompt||"(使用默认)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),D(s8,{items:[{label:"确认并保存",value:"save"},{label:"返回上一步",value:"back"},{label:"取消",value:"cancel"}],onSelect:(P)=>{if(P.value==="save")w();else if(P.value==="back")v();else Q()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}function q3({config:$,setConfig:Q,onNext:Y,onPrev:J}){let{isFocused:Z}=J3({id:"step-tools"});A6((G,q)=>{if(q.escape)J()},{isActive:Z});let X=(G)=>{if(G.includes("all"))Q({...$,tools:["all"]});else Q({...$,tools:G});Y()};return D(Z0,{flexDirection:"column",paddingY:1,children:[D(Z0,{marginBottom:1,children:D(n,{bold:!0,color:"cyan",children:"Step 3/7: 选择可用工具"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(Z0,{marginBottom:1,children:D(n,{dimColor:!0,children:"方向键导航,空格切换勾选,Enter 确认进入下一步 | ESC 返回上一步"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(Q3,{options:X3,defaultValue:$.tools,onSubmit:X},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import U3 from"node:fs";import{useMemoizedFn as H$}from"ahooks";import{Box as C0,Text as S0,useInput as O3}from"ink";import n2 from"ink-select-input";import{useEffect as z3,useMemo as P6,useState as e8}from"react";import{jsxDEV as i}from"react/jsx-dev-runtime";var t2=10;function y6({workspaceRoot:$,initialMode:Q="menu",onComplete:Y,onCancel:J}){let Z=R6($),[X,G]=e8(Q),[q,K]=e8(null),[U,F]=e8(0),[O,W]=e8(0),z=H$(()=>{Z.clear(),Z.loadFromStandardLocations(),F((y)=>y+1)}),B=P6(()=>{return Z.getAllSubagents()},[U]),_=Math.ceil(B.length/t2)||1,H=P6(()=>{let y=O*t2;return B.slice(y,y+t2)},[B,O]);z3(()=>{let y=Math.max(0,_-1);if(O>y)W(y)},[_,O]);let C=H$(()=>{if(O<_-1)W((y)=>y+1)}),N=H$(()=>{if(O>0)W((y)=>y-1)}),v=[{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"}],M=H$((y)=>{if(y.value==="cancel"){J?.();return}G(y.value)}),w=H$((y)=>{if(K(y.value),X==="edit")G("editWizard");else if(X==="delete")G("deleteConfirm")}),k=H$(async()=>{if(!q?.configPath)return;try{await U3.promises.unlink(q.configPath),z(),P()}catch(y){console.error("删除失败:",y)}}),P=H$(()=>{G("menu"),K(null)}),A=v0(!1,J);if(O3((y,L)=>{if(L.escape){if(X==="menu")J?.();else if(X==="list"||X==="edit"||X==="delete")W(0),P();else if(X==="deleteConfirm")P()}else if(L.ctrl&&y==="c"||L.meta&&y==="c")A();else if(X==="list"){if(L.leftArrow||y==="h")N();else if(L.rightArrow||y==="l")C()}},{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(n2,{items:v,onSelect:M},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),_>1&&i(S0,{color:"yellow",children:[" ","第 ",O+1,"/",_," 页"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),H.map((y)=>i(C0,{flexDirection:"column",paddingLeft:2,children:[i(C0,{children:i(S0,{children:[i(S0,{bold:!0,color:y.color||"white",children:["• ",y.name]},void 0,!0,void 0,this),i(S0,{color:"gray",children:[" - ",y.description]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),y.tools&&y.tools.length>0&&i(C0,{paddingLeft:2,children:i(S0,{color:"gray",children:["工具: ",y.tools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),y.configPath&&i(C0,{paddingLeft:2,children:i(S0,{color:"gray",dimColor:!0,children:y.configPath},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},y.name,!0,void 0,this)),i(C0,{marginTop:1,paddingLeft:2,children:_>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 T=(y)=>{if(B.length===0)return i(C0,{flexDirection:"column",paddingY:1,children:[i(C0,{marginBottom:1,children:i(S0,{bold:!0,color:"cyan",children:y},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 L=B.map((f)=>({key:f.name,label:`${f.name} - ${f.description}`,value:f}));return i(C0,{flexDirection:"column",paddingY:1,children:[i(C0,{marginBottom:1,children:i(S0,{bold:!0,color:"cyan",children:y},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(n2,{items:L,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(U8,{onComplete:()=>{z(),P()},onCancel:P},void 0,!1,void 0,this);if(X==="edit")return T("编辑 Agent");if(X==="editWizard"&&q){let y={name:q.name,description:q.description,tools:q.tools||[],color:q.color,location:q.configPath?.includes(".blade/agents")?"project":"user",systemPrompt:q.systemPrompt||""};return i(U8,{initialConfig:y,onComplete:()=>{z(),P()},onCancel:P},void 0,!1,void 0,this)}if(X==="delete")return T("删除 Agent");if(X==="deleteConfirm"&&q)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:q.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:["文件路径: ",q.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(n2,{items:[{label:"确认删除",value:"confirm"},{label:"取消",value:"cancel"}],onSelect:(y)=>{if(y.value==="confirm")k();else P()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}import{Box as p$,Text as z0}from"ink";import N3,{useEffect as F3,useState as H3}from"react";import{useEffect as _3,useState as M6}from"react";function T6($=l0(),Q=5000){let[Y,J]=M6(null),[Z,X]=M6(!0);return _3(()=>{let G=!0,q=async()=>{try{let U=await C6($);if(!G)return;if(!U){J(null),X(!1);return}let F=await I6($);if(!G)return;J(F)}catch{if(G)J(null)}finally{if(G)X(!1)}};q();let K=null;if(Q>0)K=setInterval(q,Q);return()=>{if(G=!1,K)clearInterval(K)}},[$,Q]),{branch:Y,loading:Z}}import{jsxDEV as o,Fragment as A1}from"react/jsx-dev-runtime";var k6=N3.memo(()=>{let $=y8(),Q=S$(),J=R8()==="shortcuts",Z=F4(),X=I1(),{branch:G}=T6(X),q=M8(),K=q4(),U=Y4(),F=T8(),O=k8(),W=f8(),z=v8(),B=S8(),_=Z4(),H=I8(),C=b4(),N=v$(),[v,M]=H3(null);F3(()=>{let y=!1;new s2(X,N).get().then((h)=>{if(!y)M(h)}).catch(()=>{if(!y)M(null)});let f=s2.subscribe((h)=>{if(!y&&h.sessionId===N&&h.workspaceRoot===X)M(h.goal)});return()=>{y=!0,f()}},[N,X]);let w=q?o8(q):!1,P=(()=>{if(Q==="default")return null;if(Q==="autoEdit")return o(z0,{color:"magenta",children:[">> ","auto edit on ",o(z0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Q==="plan")return o(z0,{color:"cyan",children:["‖ plan mode on ",o(z0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Q==="yolo")return o(z0,{color:"red",children:["yolo mode on ",o(z0,{color:"gray",children:"(all tools auto-approved)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null})(),A=P!==null,T=[["Enter:发送","Shift+Enter:换行","Esc:中止"],["Shift+Tab:切换模式","Up/Down:历史","Tab:补全"],["Ctrl+A:行首","Ctrl+E:行尾","Ctrl+K:删到尾"],["Ctrl+U:删到首","Ctrl+W:删单词","Ctrl+C:退出"]];return o(p$,{flexDirection:"row",justifyContent:"space-between",paddingX:2,paddingY:0,children:[J?o(p$,{flexDirection:"column",gap:0,children:T.map((y,L)=>o(p$,{flexDirection:"row",children:[y.map((f,h)=>{let[t,l]=f.split(":");return o(p$,{flexDirection:"row",width:20,children:[o(z0,{color:"yellow",children:t},void 0,!1,void 0,this),o(z0,{color:"gray",children:":"},void 0,!1,void 0,this),o(z0,{color:"white",children:l},void 0,!1,void 0,this)]},h,!0,void 0,this)}),L===T.length-1&&o(z0,{color:"cyan",children:" ? 关闭"},void 0,!1,void 0,this)]},L,!0,void 0,this))},void 0,!1,void 0,this):o(p$,{flexDirection:"row",gap:1,children:[G&&o(A1,{children:[o(z0,{color:"gray",children:[" ",G]},void 0,!0,void 0,this),o(z0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),P,A&&o(z0,{color:"gray",children:"·"},void 0,!1,void 0,this),v&&o(A1,{children:[o(z0,{color:v.status==="active"?"green":v.status==="verifying"?"cyan":v.status==="blocked"||v.status==="budget_limited"?"yellow":"gray",children:["goal:",v.status," ",v.objective.slice(0,32)]},void 0,!0,void 0,this),o(z0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),o(z0,{color:"gray",children:"? for shortcuts"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),o(p$,{flexDirection:"row",gap:1,children:!$?o(z0,{color:"red",children:"[WARN] API 密钥未配置"},void 0,!1,void 0,this):o(A1,{children:[w&&o(A1,{children:[F?o(z0,{color:"cyan",children:["Effort ",O]},void 0,!0,void 0,this):o(z0,{color:"gray",children:"Tab:Effort"},void 0,!1,void 0,this),o(z0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),W!=="auto"&&o(A1,{children:[o(z0,{color:W==="fast"?"yellow":"gray",children:["Speed ",W]},void 0,!0,void 0,this),o(z0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z!=="auto"&&o(A1,{children:[o(z0,{color:"gray",children:["Output ",z]},void 0,!0,void 0,this),o(z0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),B!=="auto"&&o(A1,{children:[o(z0,{color:"gray",children:["Style ",B]},void 0,!0,void 0,this),o(z0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q&&o(z0,{color:"gray",children:q.model},void 0,!1,void 0,this),o(z0,{color:"gray",children:"·"},void 0,!1,void 0,this),U?o(z0,{color:"yellow",children:"压缩中..."},void 0,!1,void 0,this):o(z0,{color:K<20?"red":K<50?"yellow":"gray",children:[K,"%"]},void 0,!0,void 0,this),_>0.001&&o(A1,{children:[o(z0,{color:"gray",children:"·"},void 0,!1,void 0,this),o(z0,{color:"green",children:["$",_<0.01?_.toFixed(4):_.toFixed(3)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),H.length>0&&o(A1,{children:[o(z0,{color:"gray",children:"·"},void 0,!1,void 0,this),o(z0,{color:"yellow",children:["已排队 ",H.length]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),C>0&&o(A1,{children:[o(z0,{color:"gray",children:"·"},void 0,!1,void 0,this),o(z0,{color:"cyan",children:["已恢复 ",C," 条指令"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Z&&o(A1,{children:[o(z0,{color:"gray",children:"·"},void 0,!1,void 0,this),o(z0,{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 e2,Text as $Q}from"ink";import W3 from"react";import{jsxDEV as c$}from"react/jsx-dev-runtime";var f6=W3.memo(({suggestions:$,selectedIndex:Q,visible:Y,maxDisplay:J=8})=>{if(!Y||$.length===0)return null;let Z=0,X=Math.min(J,$.length),G=Q>=$.length;if(Q>=J&&!G)Z=Q-J+1,X=Q+1;let q=$.slice(Z,X),K=$.length>J;return c$(e2,{flexDirection:"column",paddingX:2,paddingY:0,children:[q.map((U,F)=>{let W=Z+F===Q;return c$(e2,{flexDirection:"row",paddingX:1,gap:2,children:[c$($Q,{color:W?"cyan":"white",bold:W,children:U.command},void 0,!1,void 0,this),c$($Q,{color:W?"cyan":"gray",dimColor:!W,children:["- ",U.description]},void 0,!0,void 0,this)]},U.command,!0,void 0,this)}),K&&c$(e2,{paddingX:1,children:c$($Q,{color:G?"cyan":"gray",bold:G,dimColor:!G,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 L1,Text as k1,useInput as qZ,useStdout as UZ}from"ink";import OZ from"ink-select-input";import MQ,{useMemo as Z9}from"react";import{Box as O0,Text as b0}from"ink";import B$,{useEffect as RQ,useMemo as L$,useRef as Q9}from"react";import{Box as _Q,Text as x6}from"ink";import f3 from"react";import{Text as P1}from"ink";import I3 from"react";import m6 from"string-width";import O8 from"string-width";function QQ({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 L3=QQ();function JQ($){if(typeof $!=="string")throw TypeError(`Expected a \`string\`, got \`${typeof $}\``);if(!$.includes("\x1B")&&!$.includes("›"))return $;return $.replace(L3,"")}var v6=($=0)=>(Q)=>`\x1B[${Q+$}m`,S6=($=0)=>(Q)=>`\x1B[${38+$};5;${Q}m`,D6=($=0)=>(Q,Y,J)=>`\x1B[${38+$};2;${Q};${Y};${J}m`,j0={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]}},lK=Object.keys(j0.modifier),B3=Object.keys(j0.color),w3=Object.keys(j0.bgColor),dK=[...B3,...w3];function b3(){let $=new Map;for(let[Q,Y]of Object.entries(j0)){for(let[J,Z]of Object.entries(Y))j0[J]={open:`\x1B[${Z[0]}m`,close:`\x1B[${Z[1]}m`},Y[J]=j0[J],$.set(Z[0],Z[1]);Object.defineProperty(j0,Q,{value:Y,enumerable:!1})}return Object.defineProperty(j0,"codes",{value:$,enumerable:!1}),j0.color.close="\x1B[39m",j0.bgColor.close="\x1B[49m",j0.color.ansi=v6(),j0.color.ansi256=S6(),j0.color.ansi16m=D6(),j0.bgColor.ansi=v6(10),j0.bgColor.ansi256=S6(10),j0.bgColor.ansi16m=D6(10),Object.defineProperties(j0,{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)=>j0.rgbToAnsi256(...j0.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 q=Q%36;Y=Math.floor(Q/36)/5,J=Math.floor(q/6)/5,Z=q%6/5}let X=Math.max(Y,J,Z)*2;if(X===0)return 30;let G=30+(Math.round(Z)<<2|Math.round(J)<<1|Math.round(Y));if(X===2)G+=60;return G},enumerable:!1},rgbToAnsi:{value:(Q,Y,J)=>j0.ansi256ToAnsi(j0.rgbToAnsi256(Q,Y,J)),enumerable:!1},hexToAnsi:{value:(Q)=>j0.ansi256ToAnsi(j0.hexToAnsi256(Q)),enumerable:!1}}),j0}var A3=b3(),V6=A3;var Q2=new Set(["\x1B","›"]),P3=39,ZQ="\x07",E6="[",R3="]",g6="m",$2=`${R3}8;;`,j6=($)=>`${Q2.values().next().value}${E6}${$}${g6}`,h6=($)=>`${Q2.values().next().value}${$2}${$}${ZQ}`,y3=($)=>$.split(" ").map((Q)=>O8(Q)),YQ=($,Q,Y)=>{let J=[...Q],Z=!1,X=!1,G=O8(JQ($.at(-1)));for(let[q,K]of J.entries()){let U=O8(K);if(G+U<=Y)$[$.length-1]+=K;else $.push(K),G=0;if(Q2.has(K))Z=!0,X=J.slice(q+1,q+1+$2.length).join("")===$2;if(Z){if(X){if(K===ZQ)Z=!1,X=!1}else if(K===g6)Z=!1;continue}if(G+=U,G===Y&&q<J.length-1)$.push(""),G=0}if(!G&&$.at(-1).length>0&&$.length>1)$[$.length-2]+=$.pop()},M3=($)=>{let Q=$.split(" "),Y=Q.length;while(Y>0){if(O8(Q[Y-1])>0)break;Y--}if(Y===Q.length)return $;return Q.slice(0,Y).join(" ")+Q.slice(Y).join("")},C3=($,Q,Y={})=>{if(Y.trim!==!1&&$.trim()==="")return"";let J="",Z,X,G=y3($),q=[""];for(let[O,W]of $.split(" ").entries()){if(Y.trim!==!1)q[q.length-1]=q.at(-1).trimStart();let z=O8(q.at(-1));if(O!==0){if(z>=Q&&(Y.wordWrap===!1||Y.trim===!1))q.push(""),z=0;if(z>0||Y.trim===!1)q[q.length-1]+=" ",z++}if(Y.hard&&G[O]>Q){let B=Q-z,_=1+Math.floor((G[O]-B-1)/Q);if(Math.floor((G[O]-1)/Q)<_)q.push("");YQ(q,W,Q);continue}if(z+G[O]>Q&&z>0&&G[O]>0){if(Y.wordWrap===!1&&z<Q){YQ(q,W,Q);continue}q.push("")}if(z+G[O]>Q&&Y.wordWrap===!1){YQ(q,W,Q);continue}q[q.length-1]+=W}if(Y.trim!==!1)q=q.map((O)=>M3(O));let K=q.join(`
119
- `),U=[...K],F=0;for(let[O,W]of U.entries()){if(J+=W,Q2.has(W)){let{groups:B}=new RegExp(`(?:\\${E6}(?<code>\\d+)m|\\${$2}(?<uri>.*)${ZQ})`).exec(K.slice(F))||{groups:{}};if(B.code!==void 0){let _=Number.parseFloat(B.code);Z=_===P3?void 0:_}else if(B.uri!==void 0)X=B.uri.length===0?void 0:B.uri}let z=V6.codes.get(Number(Z));if(U[O+1]===`
120
- `){if(X)J+=h6("");if(Z&&z)J+=j6(z)}else if(W===`
121
- `){if(Z&&z)J+=j6(Z);if(X)J+=h6(X)}F+=W.length}return J};function XQ($,Q,Y){return String($).normalize().replaceAll(`\r
118
+ `),y=n2.join(P,`${X.name}.md`);await A6.promises.writeFile(y,T,"utf-8"),$()}catch(P){console.error("保存配置失败:",P)}}),k=S0(!1,Q);if(R6((P,A)=>{if(A.escape)S();else if(A.ctrl&&P==="c"||A.meta&&P==="c")k()},{isActive:J!=="tools"}),J==="mode")return D(Z0,{flexDirection:"column",paddingY:1,children:[D(Z0,{marginBottom:1,children:D(t,{bold:!0,color:"cyan",children:"选择创建方式"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(Z0,{marginBottom:1,children:D(t,{dimColor:!0,children:"你可以手动配置每个细节,或让 AI 根据你的描述自动生成配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(e8,{items:[{label:"AI 智能生成 - 根据描述自动生成完整配置",value:"ai"},{label:"手动配置 - 逐步配置每个选项",value:"manual"}],onSelect:(P)=>{if(P.value==="ai")w("ai"),Z("aiPrompt");else w("manual"),Z("name")}},void 0,!1,void 0,this),D(Z0,{marginTop:1,children:D(t,{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 D(Z0,{flexDirection:"column",paddingY:1,children:[D(Z0,{marginBottom:1,children:D(t,{bold:!0,color:"cyan",children:"AI 智能生成"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(Z0,{marginBottom:1,children:D(t,{dimColor:!0,children:'描述你想要创建的 Agent(例如:"一个专门用于代码审查的 agent,能够分析代码质量和潜在bug")'},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(Z0,{marginBottom:1,children:[D(t,{color:"green",children:"描述: "},void 0,!1,void 0,this),D(U8,{value:q,onChange:K,onSubmit:(P)=>{if(!P.trim())return;Z("aiGenerating")}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D(Z0,{children:D(t,{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 D(Z0,{flexDirection:"column",paddingY:1,children:[D(Z0,{marginBottom:1,children:D(t,{bold:!0,color:"red",children:"AI 生成失败"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(Z0,{marginBottom:1,children:D(t,{color:"red",children:O},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(Z0,{marginBottom:1,children:D(t,{dimColor:!0,children:"按 ESC 返回修改描述"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return D(Z0,{flexDirection:"column",paddingY:1,children:[D(Z0,{marginBottom:1,children:D(t,{bold:!0,color:"yellow",children:[D(G3,{type:"dots"},void 0,!1,void 0,this)," AI 正在生成配置..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),D(Z0,{marginBottom:1,children:D(t,{dimColor:!0,children:['根据你的描述:"',q,'"']},void 0,!0,void 0,this)},void 0,!1,void 0,this),D(Z0,{marginBottom:1,children:D(t,{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 P=z==="edit";return D(Z0,{flexDirection:"column",paddingY:1,children:[D(Z0,{marginBottom:1,children:D(t,{bold:!0,color:"cyan",children:["Step 1/7: ",P?"Agent 名称(不可修改)":"输入 Agent 名称"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),D(Z0,{marginBottom:1,children:D(t,{dimColor:!0,children:P?"编辑模式下名称不可修改(修改名称相当于创建新 Agent)":"名称只能包含小写字母、数字和连字符(例如:code-reviewer)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(Z0,{marginBottom:1,children:[D(t,{color:"green",children:"名称: "},void 0,!1,void 0,this),P?D(t,{children:X.name},void 0,!1,void 0,this):D(U8,{value:X.name,onChange:(A)=>G({...X,name:A}),onSubmit:(A)=>{if(U3(A))return;N()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D(Z0,{children:D(t,{dimColor:!0,children:P?"按 Enter 继续 | ESC 返回":"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),P&&D(U8,{value:"",onChange:()=>{},onSubmit:N,showCursor:!1},"edit-mode-dummy-input",!1,void 0,this)]},void 0,!0,void 0,this)}if(J==="description")return D(Z0,{flexDirection:"column",paddingY:1,children:[D(Z0,{marginBottom:1,children:D(t,{bold:!0,color:"cyan",children:"Step 2/7: 输入描述信息"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(Z0,{marginBottom:1,children:D(t,{dimColor:!0,children:"简短描述这个 Agent 的用途和使用场景(这将帮助主 Agent 决定何时使用它)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(Z0,{marginBottom:1,children:[D(t,{color:"green",children:"描述: "},void 0,!1,void 0,this),D(U8,{value:X.description,onChange:(P)=>G({...X,description:P}),onSubmit:(P)=>{if(!P.trim())return;N()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D(Z0,{children:D(t,{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 D(O3,{config:X,setConfig:G,onNext:N,onPrev:S},void 0,!1,void 0,this);if(J==="color")return D(Z0,{flexDirection:"column",paddingY:1,children:[D(Z0,{marginBottom:1,children:D(t,{bold:!0,color:"cyan",children:"Step 4/7: 选择背景颜色"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(Z0,{marginBottom:1,children:D(t,{dimColor:!0,children:"为 Agent 选择一个颜色标识(用于在 UI 中区分不同的 Agents)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(e8,{items:q3,onSelect:(P)=>{let A=P.value==="none"?void 0:P.value;G({...X,color:A}),N()}},void 0,!1,void 0,this),D(Z0,{marginTop:1,children:D(t,{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 D(Z0,{flexDirection:"column",paddingY:1,children:[D(Z0,{marginBottom:1,children:D(t,{bold:!0,color:"cyan",children:"Step 5/7: 选择保存位置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(Z0,{marginBottom:1,children:D(t,{dimColor:!0,children:"项目级配置仅在当前项目生效,用户级配置全局可用"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(e8,{items:[{label:"项目级 (.blade/agents/) - 仅当前项目",value:"project"},{label:"用户级 (~/.blade/agents/) - 全局可用",value:"user"}],onSelect:(P)=>{G({...X,location:P.value}),N()}},void 0,!1,void 0,this),D(Z0,{marginTop:1,children:D(t,{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 D(Z0,{flexDirection:"column",paddingY:1,children:[D(Z0,{marginBottom:1,children:D(t,{bold:!0,color:"cyan",children:"Step 6/7: 输入系统提示词"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(Z0,{marginBottom:1,children:D(t,{dimColor:!0,children:"定义 Agent 的行为和职责(可选,留空将使用默认提示)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(Z0,{marginBottom:1,children:[D(t,{color:"green",children:"提示词: "},void 0,!1,void 0,this),D(U8,{value:X.systemPrompt,onChange:(P)=>G({...X,systemPrompt:P}),onSubmit:()=>N()},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D(Z0,{children:D(t,{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 D(Z0,{flexDirection:"column",paddingY:1,children:[D(Z0,{marginBottom:1,children:D(t,{bold:!0,color:"cyan",children:"Step 7/7: 确认配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(Z0,{flexDirection:"column",paddingLeft:2,marginBottom:1,children:[D(t,{children:[D(t,{bold:!0,color:"green",children:["名称:"," "]},void 0,!0,void 0,this),D(t,{children:X.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D(t,{children:[D(t,{bold:!0,color:"green",children:["描述:"," "]},void 0,!0,void 0,this),D(t,{children:X.description},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D(t,{children:[D(t,{bold:!0,color:"green",children:["工具:"," "]},void 0,!0,void 0,this),D(t,{children:X.tools.includes("all")?"所有工具":X.tools.join(", ")||"所有工具"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D(t,{children:[D(t,{bold:!0,color:"green",children:["颜色:"," "]},void 0,!0,void 0,this),D(t,{children:X.color||"默认"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D(t,{children:[D(t,{bold:!0,color:"green",children:["位置:"," "]},void 0,!0,void 0,this),D(t,{children:X.location==="project"?"项目级":"用户级"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D(t,{children:[D(t,{bold:!0,color:"green",children:["提示词:"," "]},void 0,!0,void 0,this),D(t,{children:X.systemPrompt||"(使用默认)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),D(e8,{items:[{label:"确认并保存",value:"save"},{label:"返回上一步",value:"back"},{label:"取消",value:"cancel"}],onSelect:(P)=>{if(P.value==="save")B();else if(P.value==="back")S();else Q()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}function O3({config:$,setConfig:Q,onNext:Y,onPrev:J}){let{isFocused:Z}=Z3({id:"step-tools"});R6((G,q)=>{if(q.escape)J()},{isActive:Z});let X=(G)=>{if(G.includes("all"))Q({...$,tools:["all"]});else Q({...$,tools:G});Y()};return D(Z0,{flexDirection:"column",paddingY:1,children:[D(Z0,{marginBottom:1,children:D(t,{bold:!0,color:"cyan",children:"Step 3/7: 选择可用工具"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(Z0,{marginBottom:1,children:D(t,{dimColor:!0,children:"方向键导航,空格切换勾选,Enter 确认进入下一步 | ESC 返回上一步"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(Y3,{options:K3,defaultValue:$.tools,onSubmit:X},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import z3 from"node:fs";import{useMemoizedFn as H$}from"ahooks";import{Box as C0,Text as v0,useInput as _3}from"ink";import t2 from"ink-select-input";import{useEffect as N3,useMemo as y6,useState as $2}from"react";import{jsxDEV as o}from"react/jsx-dev-runtime";var s2=10;function C6({workspaceRoot:$,initialMode:Q="menu",onComplete:Y,onCancel:J}){let Z=M6($),[X,G]=$2(Q),[q,K]=$2(null),[U,W]=$2(0),[O,H]=$2(0),z=H$(()=>{Z.clear(),Z.loadFromStandardLocations(),W((y)=>y+1)}),w=y6(()=>{return Z.getAllSubagents()},[U]),_=Math.ceil(w.length/s2)||1,F=y6(()=>{let y=O*s2;return w.slice(y,y+s2)},[w,O]);N3(()=>{let y=Math.max(0,_-1);if(O>y)H(y)},[_,O]);let C=H$(()=>{if(O<_-1)H((y)=>y+1)}),N=H$(()=>{if(O>0)H((y)=>y-1)}),S=[{key:"list",label:"查看所有 Agents",value:"list"},{key:"create",label:"创建新 Agent",value:"create"},{key:"edit",label:"编辑 Agent",value:"edit"},{key:"delete",label:"删除 Agent",value:"delete"},{key:"cancel",label:"取消",value:"cancel"}],M=H$((y)=>{if(y.value==="cancel"){J?.();return}G(y.value)}),B=H$((y)=>{if(K(y.value),X==="edit")G("editWizard");else if(X==="delete")G("deleteConfirm")}),k=H$(async()=>{if(!q?.configPath)return;try{await z3.promises.unlink(q.configPath),z(),P()}catch(y){console.error("删除失败:",y)}}),P=H$(()=>{G("menu"),K(null)}),A=S0(!1,J);if(_3((y,L)=>{if(L.escape){if(X==="menu")J?.();else if(X==="list"||X==="edit"||X==="delete")H(0),P();else if(X==="deleteConfirm")P()}else if(L.ctrl&&y==="c"||L.meta&&y==="c")A();else if(X==="list"){if(L.leftArrow||y==="h")N();else if(L.rightArrow||y==="l")C()}},{isActive:X!=="create"&&X!=="editWizard"}),X==="menu")return o(C0,{flexDirection:"column",paddingY:1,children:[o(C0,{marginBottom:1,children:o(v0,{bold:!0,color:"cyan",children:"Agents 管理"},void 0,!1,void 0,this)},void 0,!1,void 0,this),o(t2,{items:S,onSelect:M},void 0,!1,void 0,this),o(C0,{marginTop:1,children:o(v0,{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(w.length===0)return o(C0,{flexDirection:"column",paddingY:1,children:[o(C0,{marginBottom:1,children:o(v0,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this)},void 0,!1,void 0,this),o(C0,{paddingLeft:2,children:o(v0,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),o(C0,{marginTop:1,paddingLeft:2,children:o(v0,{color:"gray",children:"配置文件位置: .blade/agents/ 或 ~/.blade/agents/"},void 0,!1,void 0,this)},void 0,!1,void 0,this),o(C0,{marginTop:1,paddingLeft:2,children:o(v0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return o(C0,{flexDirection:"column",paddingY:1,children:[o(C0,{marginBottom:1,children:[o(v0,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this),o(v0,{color:"gray",children:[" (共 ",w.length," 个)"]},void 0,!0,void 0,this),_>1&&o(v0,{color:"yellow",children:[" ","第 ",O+1,"/",_," 页"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),F.map((y)=>o(C0,{flexDirection:"column",paddingLeft:2,children:[o(C0,{children:o(v0,{children:[o(v0,{bold:!0,color:y.color||"white",children:["• ",y.name]},void 0,!0,void 0,this),o(v0,{color:"gray",children:[" - ",y.description]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),y.tools&&y.tools.length>0&&o(C0,{paddingLeft:2,children:o(v0,{color:"gray",children:["工具: ",y.tools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),y.configPath&&o(C0,{paddingLeft:2,children:o(v0,{color:"gray",dimColor:!0,children:y.configPath},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},y.name,!0,void 0,this)),o(C0,{marginTop:1,paddingLeft:2,children:_>1?o(v0,{dimColor:!0,children:"Left/Right to page | ESC 返回菜单"},void 0,!1,void 0,this):o(v0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}let T=(y)=>{if(w.length===0)return o(C0,{flexDirection:"column",paddingY:1,children:[o(C0,{marginBottom:1,children:o(v0,{bold:!0,color:"cyan",children:y},void 0,!1,void 0,this)},void 0,!1,void 0,this),o(C0,{paddingLeft:2,children:o(v0,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),o(C0,{marginTop:1,paddingLeft:2,children:o(v0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);let L=w.map((f)=>({key:f.name,label:`${f.name} - ${f.description}`,value:f}));return o(C0,{flexDirection:"column",paddingY:1,children:[o(C0,{marginBottom:1,children:o(v0,{bold:!0,color:"cyan",children:y},void 0,!1,void 0,this)},void 0,!1,void 0,this),o(t2,{items:L,onSelect:B},void 0,!1,void 0,this),o(C0,{marginTop:1,children:o(v0,{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 o(O8,{onComplete:()=>{z(),P()},onCancel:P},void 0,!1,void 0,this);if(X==="edit")return T("编辑 Agent");if(X==="editWizard"&&q){let y={name:q.name,description:q.description,tools:q.tools||[],color:q.color,location:q.configPath?.includes(".blade/agents")?"project":"user",systemPrompt:q.systemPrompt||""};return o(O8,{initialConfig:y,onComplete:()=>{z(),P()},onCancel:P},void 0,!1,void 0,this)}if(X==="delete")return T("删除 Agent");if(X==="deleteConfirm"&&q)return o(C0,{flexDirection:"column",paddingY:1,children:[o(C0,{marginBottom:1,children:o(v0,{bold:!0,color:"red",children:"确认删除"},void 0,!1,void 0,this)},void 0,!1,void 0,this),o(C0,{marginBottom:1,paddingLeft:2,children:o(v0,{children:["你确定要删除 Agent"," ",o(v0,{bold:!0,color:"yellow",children:q.name},void 0,!1,void 0,this)," ","吗?"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),o(C0,{marginBottom:1,paddingLeft:2,children:o(v0,{dimColor:!0,children:["文件路径: ",q.configPath]},void 0,!0,void 0,this)},void 0,!1,void 0,this),o(C0,{marginBottom:1,paddingLeft:2,children:o(v0,{color:"red",children:"此操作无法撤销!"},void 0,!1,void 0,this)},void 0,!1,void 0,this),o(t2,{items:[{label:"确认删除",value:"confirm"},{label:"取消",value:"cancel"}],onSelect:(y)=>{if(y.value==="confirm")k();else P()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}import{Box as p$,Text as z0}from"ink";import H3,{useEffect as W3,useState as L3}from"react";import{useEffect as F3,useState as I6}from"react";function f6($=l0(),Q=5000){let[Y,J]=I6(null),[Z,X]=I6(!0);return F3(()=>{let G=!0,q=async()=>{try{let U=await T6($);if(!G)return;if(!U){J(null),X(!1);return}let W=await k6($);if(!G)return;J(W)}catch{if(G)J(null)}finally{if(G)X(!1)}};q();let K=null;if(Q>0)K=setInterval(q,Q);return()=>{if(G=!1,K)clearInterval(K)}},[$,Q]),{branch:Y,loading:Z}}import{jsxDEV as i,Fragment as A1}from"react/jsx-dev-runtime";var S6=H3.memo(()=>{let $=M8(),Q=v$(),J=y8()==="shortcuts",Z=W4(),X=I1(),{branch:G}=f6(X),q=C8(),K=O4(),U=Y4(),W=k8(),O=f8(),H=S8(),z=v8(),w=D8(),_=Z4(),F=T8(),C=P4(),N=S$(),[S,M]=L3(null);W3(()=>{let y=!1;new e2(X,N).get().then((h)=>{if(!y)M(h)}).catch(()=>{if(!y)M(null)});let f=e2.subscribe((h)=>{if(!y&&h.sessionId===N&&h.workspaceRoot===X)M(h.goal)});return()=>{y=!0,f()}},[N,X]);let B=q?n8(q):!1,P=(()=>{if(Q==="default")return null;if(Q==="autoEdit")return i(z0,{color:"magenta",children:[">> ","auto edit on ",i(z0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Q==="plan")return i(z0,{color:"cyan",children:["‖ plan mode on ",i(z0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Q==="yolo")return i(z0,{color:"red",children:["yolo mode on ",i(z0,{color:"gray",children:"(all tools auto-approved)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null})(),A=P!==null,T=[["Enter:发送","Shift+Enter:换行","Esc:中止"],["Shift+Tab:切换模式","Up/Down:历史","Tab:补全"],["Ctrl+A:行首","Ctrl+E:行尾","Ctrl+K:删到尾"],["Ctrl+U:删到首","Ctrl+W:删单词","Ctrl+C:退出"]];return i(p$,{flexDirection:"row",justifyContent:"space-between",paddingX:2,paddingY:0,children:[J?i(p$,{flexDirection:"column",gap:0,children:T.map((y,L)=>i(p$,{flexDirection:"row",children:[y.map((f,h)=>{let[s,l]=f.split(":");return i(p$,{flexDirection:"row",width:20,children:[i(z0,{color:"yellow",children:s},void 0,!1,void 0,this),i(z0,{color:"gray",children:":"},void 0,!1,void 0,this),i(z0,{color:"white",children:l},void 0,!1,void 0,this)]},h,!0,void 0,this)}),L===T.length-1&&i(z0,{color:"cyan",children:" ? 关闭"},void 0,!1,void 0,this)]},L,!0,void 0,this))},void 0,!1,void 0,this):i(p$,{flexDirection:"row",gap:1,children:[G&&i(A1,{children:[i(z0,{color:"gray",children:[" ",G]},void 0,!0,void 0,this),i(z0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),P,A&&i(z0,{color:"gray",children:"·"},void 0,!1,void 0,this),S&&i(A1,{children:[i(z0,{color:S.status==="active"?"green":S.status==="verifying"?"cyan":S.status==="blocked"||S.status==="budget_limited"?"yellow":"gray",children:["goal:",S.status," ",S.objective.slice(0,32)]},void 0,!0,void 0,this),i(z0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),i(z0,{color:"gray",children:"? for shortcuts"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),i(p$,{flexDirection:"row",gap:1,children:!$?i(z0,{color:"red",children:"[WARN] API 密钥未配置"},void 0,!1,void 0,this):i(A1,{children:[B&&i(A1,{children:[W?i(z0,{color:"cyan",children:["Effort ",O]},void 0,!0,void 0,this):i(z0,{color:"gray",children:"Tab:Effort"},void 0,!1,void 0,this),i(z0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),H!=="auto"&&i(A1,{children:[i(z0,{color:H==="fast"?"yellow":"gray",children:["Speed ",H]},void 0,!0,void 0,this),i(z0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z!=="auto"&&i(A1,{children:[i(z0,{color:"gray",children:["Output ",z]},void 0,!0,void 0,this),i(z0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),w!=="auto"&&i(A1,{children:[i(z0,{color:"gray",children:["Style ",w]},void 0,!0,void 0,this),i(z0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q&&i(z0,{color:"gray",children:q.model},void 0,!1,void 0,this),i(z0,{color:"gray",children:"·"},void 0,!1,void 0,this),U?i(z0,{color:"yellow",children:"压缩中..."},void 0,!1,void 0,this):i(z0,{color:K<20?"red":K<50?"yellow":"gray",children:[K,"%"]},void 0,!0,void 0,this),_>0.001&&i(A1,{children:[i(z0,{color:"gray",children:"·"},void 0,!1,void 0,this),i(z0,{color:"green",children:["$",_<0.01?_.toFixed(4):_.toFixed(3)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),F.length>0&&i(A1,{children:[i(z0,{color:"gray",children:"·"},void 0,!1,void 0,this),i(z0,{color:"yellow",children:["已排队 ",F.length]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),C>0&&i(A1,{children:[i(z0,{color:"gray",children:"·"},void 0,!1,void 0,this),i(z0,{color:"cyan",children:["已恢复 ",C," 条指令"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Z&&i(A1,{children:[i(z0,{color:"gray",children:"·"},void 0,!1,void 0,this),i(z0,{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 $Q,Text as QQ}from"ink";import B3 from"react";import{jsxDEV as c$}from"react/jsx-dev-runtime";var v6=B3.memo(({suggestions:$,selectedIndex:Q,visible:Y,maxDisplay:J=8})=>{if(!Y||$.length===0)return null;let Z=0,X=Math.min(J,$.length),G=Q>=$.length;if(Q>=J&&!G)Z=Q-J+1,X=Q+1;let q=$.slice(Z,X),K=$.length>J;return c$($Q,{flexDirection:"column",paddingX:2,paddingY:0,children:[q.map((U,W)=>{let H=Z+W===Q;return c$($Q,{flexDirection:"row",paddingX:1,gap:2,children:[c$(QQ,{color:H?"cyan":"white",bold:H,children:U.command},void 0,!1,void 0,this),c$(QQ,{color:H?"cyan":"gray",dimColor:!H,children:["- ",U.description]},void 0,!0,void 0,this)]},U.command,!0,void 0,this)}),K&&c$($Q,{paddingX:1,children:c$(QQ,{color:G?"cyan":"gray",bold:G,dimColor:!G,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 L1,Text as k1,useInput as OZ,useStdout as zZ}from"ink";import _Z from"ink-select-input";import CQ,{useMemo as G9}from"react";import{Box as O0,Text as b0}from"ink";import B$,{useEffect as yQ,useMemo as L$,useRef as Y9}from"react";import{Box as NQ,Text as l6}from"ink";import v3 from"react";import{Text as P1}from"ink";import k3 from"react";import c6 from"string-width";import z8 from"string-width";function JQ({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 w3=JQ();function YQ($){if(typeof $!=="string")throw TypeError(`Expected a \`string\`, got \`${typeof $}\``);if(!$.includes("\x1B")&&!$.includes("›"))return $;return $.replace(w3,"")}var D6=($=0)=>(Q)=>`\x1B[${Q+$}m`,V6=($=0)=>(Q)=>`\x1B[${38+$};5;${Q}m`,j6=($=0)=>(Q,Y,J)=>`\x1B[${38+$};2;${Q};${Y};${J}m`,j0={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]}},rK=Object.keys(j0.modifier),b3=Object.keys(j0.color),A3=Object.keys(j0.bgColor),aK=[...b3,...A3];function P3(){let $=new Map;for(let[Q,Y]of Object.entries(j0)){for(let[J,Z]of Object.entries(Y))j0[J]={open:`\x1B[${Z[0]}m`,close:`\x1B[${Z[1]}m`},Y[J]=j0[J],$.set(Z[0],Z[1]);Object.defineProperty(j0,Q,{value:Y,enumerable:!1})}return Object.defineProperty(j0,"codes",{value:$,enumerable:!1}),j0.color.close="\x1B[39m",j0.bgColor.close="\x1B[49m",j0.color.ansi=D6(),j0.color.ansi256=V6(),j0.color.ansi16m=j6(),j0.bgColor.ansi=D6(10),j0.bgColor.ansi256=V6(10),j0.bgColor.ansi16m=j6(10),Object.defineProperties(j0,{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)=>j0.rgbToAnsi256(...j0.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 q=Q%36;Y=Math.floor(Q/36)/5,J=Math.floor(q/6)/5,Z=q%6/5}let X=Math.max(Y,J,Z)*2;if(X===0)return 30;let G=30+(Math.round(Z)<<2|Math.round(J)<<1|Math.round(Y));if(X===2)G+=60;return G},enumerable:!1},rgbToAnsi:{value:(Q,Y,J)=>j0.ansi256ToAnsi(j0.rgbToAnsi256(Q,Y,J)),enumerable:!1},hexToAnsi:{value:(Q)=>j0.ansi256ToAnsi(j0.hexToAnsi256(Q)),enumerable:!1}}),j0}var R3=P3(),h6=R3;var J2=new Set(["\x1B","›"]),y3=39,XQ="\x07",m6="[",M3="]",p6="m",Q2=`${M3}8;;`,E6=($)=>`${J2.values().next().value}${m6}${$}${p6}`,g6=($)=>`${J2.values().next().value}${Q2}${$}${XQ}`,C3=($)=>$.split(" ").map((Q)=>z8(Q)),ZQ=($,Q,Y)=>{let J=[...Q],Z=!1,X=!1,G=z8(YQ($.at(-1)));for(let[q,K]of J.entries()){let U=z8(K);if(G+U<=Y)$[$.length-1]+=K;else $.push(K),G=0;if(J2.has(K))Z=!0,X=J.slice(q+1,q+1+Q2.length).join("")===Q2;if(Z){if(X){if(K===XQ)Z=!1,X=!1}else if(K===p6)Z=!1;continue}if(G+=U,G===Y&&q<J.length-1)$.push(""),G=0}if(!G&&$.at(-1).length>0&&$.length>1)$[$.length-2]+=$.pop()},I3=($)=>{let Q=$.split(" "),Y=Q.length;while(Y>0){if(z8(Q[Y-1])>0)break;Y--}if(Y===Q.length)return $;return Q.slice(0,Y).join(" ")+Q.slice(Y).join("")},T3=($,Q,Y={})=>{if(Y.trim!==!1&&$.trim()==="")return"";let J="",Z,X,G=C3($),q=[""];for(let[O,H]of $.split(" ").entries()){if(Y.trim!==!1)q[q.length-1]=q.at(-1).trimStart();let z=z8(q.at(-1));if(O!==0){if(z>=Q&&(Y.wordWrap===!1||Y.trim===!1))q.push(""),z=0;if(z>0||Y.trim===!1)q[q.length-1]+=" ",z++}if(Y.hard&&G[O]>Q){let w=Q-z,_=1+Math.floor((G[O]-w-1)/Q);if(Math.floor((G[O]-1)/Q)<_)q.push("");ZQ(q,H,Q);continue}if(z+G[O]>Q&&z>0&&G[O]>0){if(Y.wordWrap===!1&&z<Q){ZQ(q,H,Q);continue}q.push("")}if(z+G[O]>Q&&Y.wordWrap===!1){ZQ(q,H,Q);continue}q[q.length-1]+=H}if(Y.trim!==!1)q=q.map((O)=>I3(O));let K=q.join(`
119
+ `),U=[...K],W=0;for(let[O,H]of U.entries()){if(J+=H,J2.has(H)){let{groups:w}=new RegExp(`(?:\\${m6}(?<code>\\d+)m|\\${Q2}(?<uri>.*)${XQ})`).exec(K.slice(W))||{groups:{}};if(w.code!==void 0){let _=Number.parseFloat(w.code);Z=_===y3?void 0:_}else if(w.uri!==void 0)X=w.uri.length===0?void 0:w.uri}let z=h6.codes.get(Number(Z));if(U[O+1]===`
120
+ `){if(X)J+=g6("");if(Z&&z)J+=E6(z)}else if(H===`
121
+ `){if(Z&&z)J+=E6(Z);if(X)J+=g6(X)}W+=H.length}return J};function GQ($,Q,Y){return String($).normalize().replaceAll(`\r
122
122
  `,`
123
123
  `).split(`
124
- `).map((J)=>C3(J,Q,Y)).join(`
125
- `)}var GQ=($)=>{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 m6(Q)};var p6=($)=>{return/[*_~`<[\]https?:]/.test($)},KQ=($)=>{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)=>m6(J)))},J2=($,Q,Y=!1)=>{if(Q<=0)return[$];let J=$.trimEnd(),X=XQ(J,Q,{hard:Y,trim:!1,wordWrap:!0}).split(`
126
- `).filter((G)=>G.length>0);return X.length>0?X:[""]},c6=($,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 W1,Fragment as k3}from"react/jsx-dev-runtime";var qQ=2,UQ=1,OQ=2;function zQ($,Q){return`inline-${$}-${Q}`}var T3=({text:$})=>{let Q=A0();if(!p6($))return W1(P1,{children:$},void 0,!1,void 0,this);let Y=[],J=0,Z=0,X=0,G=/(\*\*.*?\*\*|\*(?!\s).*?(?<!\s)\*|_(?!\s).*?(?<!\s)_|~~.*?~~|`+[^`]+`+|\[.*?\]\(.*?\)|https?:\/\/\S+)/g,q;while((q=G.exec($))!==null){if(q.index>J){let O=$.slice(J,q.index);Y.push(W1(P1,{children:O},zQ("text",Z++),!1,void 0,this))}let K=q[0],U=null,F=zQ("match",X++);try{if(K.startsWith("**")&&K.endsWith("**")&&K.length>qQ*2)U=W1(P1,{bold:!0,children:K.slice(qQ,-qQ)},F,!1,void 0,this);else if(K.length>UQ*2&&(K.startsWith("*")&&K.endsWith("*")||K.startsWith("_")&&K.endsWith("_"))){let O=$.substring(q.index-1,q.index),W=$.substring(G.lastIndex,G.lastIndex+1);if(!(/\w/.test(O)||/\w/.test(W)||/[./\\]/.test(O+W)))U=W1(P1,{italic:!0,children:K.slice(UQ,-UQ)},F,!1,void 0,this)}else if(K.startsWith("~~")&&K.endsWith("~~")&&K.length>OQ*2)U=W1(P1,{strikethrough:!0,children:K.slice(OQ,-OQ)},F,!1,void 0,this);else if(K.startsWith("`")&&K.endsWith("`")){let O=K.match(/^(`+)([^`]+)\1$/);if(O&&O[2])U=W1(P1,{color:Q.colors.syntax.keyword,backgroundColor:Q.colors.background.secondary,bold:!0,children:` ${O[2]} `},F,!1,void 0,this)}else if(K.startsWith("[")&&K.includes("](")&&K.endsWith(")")){let O=K.match(/\[(.*?)\]\((.*?)\)/);if(O){let W=O[1],z=O[2];U=W1(P1,{children:[W,W1(P1,{color:Q.colors.info,children:[" (",z,")"]},void 0,!0,void 0,this)]},F,!0,void 0,this)}}else if(K.match(/^https?:\/\//))U=W1(P1,{color:Q.colors.info,children:K},F,!1,void 0,this)}catch(O){console.error("InlineRenderer 解析错误:",K,O),U=null}Y.push(U??W1(P1,{children:K},F,!1,void 0,this)),J=G.lastIndex}if(J<$.length){let K=$.slice(J);Y.push(W1(P1,{children:K},zQ("text",Z++),!1,void 0,this))}return W1(k3,{children:Y.filter((K)=>K!==null)},void 0,!1,void 0,this)},R1=I3.memo(T3);import{jsxDEV as x$}from"react/jsx-dev-runtime";var v3="▎",u6=f3.memo(({lines:$,level:Q})=>{let Y=A0(),J=v3.repeat(Q);return x$(_Q,{flexDirection:"column",children:$.map((Z,X)=>{if(Z.trim()==="")return x$(_Q,{height:1},X,!1,void 0,this);return x$(_Q,{flexDirection:"row",children:[x$(x6,{dimColor:!0,color:Y.colors.text.muted,children:[J," "]},void 0,!0,void 0,this),x$(x6,{italic:!0,wrap:"wrap",children:x$(R1,{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 Z2,Text as m1}from"ink";import{isPlainObject as LQ}from"lodash-es";import{common as h3,createLowlight as E3}from"lowlight";import i6 from"react";import{Box as Y2,Text as z8}from"ink";import g1,{Fragment as r6}from"react";import S3 from"string-width";var l6=new Map,d6=1000;function FQ($){let Q=!0;for(let J=0;J<$.length;J++)if($.charCodeAt(J)>127){Q=!1;break}if(Q)return $.split("");if($.length<=d6){let J=l6.get($);if(J)return J}let Y=Array.from($);if($.length<=d6)l6.set($,Y);return Y}var NQ=new Map;function E1($){if(/^[\x20-\x7E]*$/.test($))return $.length;if(NQ.has($))return NQ.get($);let Q=S3($);return NQ.set($,Q),Q}import{jsxDEV as u$}from"react/jsx-dev-runtime";var HQ=2,a6=g1.memo(({children:$,maxWidth:Q,maxHeight:Y,overflowDirection:J="top",additionalHiddenLinesCount:Z=0})=>{let X=A0(),G=[],q=Math.max(Math.round(Y??Number.MAX_SAFE_INTEGER),HQ);function K(_){if(!g1.isValidElement(_))return;if(_.type===r6){g1.Children.forEach(_.props.children,K);return}if(_.type===Y2){V3(_,Q,G);return}}g1.Children.forEach($,K);let F=G.length>q||Z>0?q-1:q,O=F!==void 0?Math.max(0,G.length-F):0,W=O+Z,B=(O>0?J==="top"?G.slice(O):G.slice(0,F):G).map((_,H)=>u$(Y2,{children:_.length>0?_.map((C,N)=>u$(z8,{...C.props,children:C.text},N,!1,void 0,this)):u$(z8,{children:" "},void 0,!1,void 0,this)},H,!1,void 0,this));return u$(Y2,{flexDirection:"column",width:Q,flexShrink:0,children:[W>0&&J==="top"&&u$(z8,{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"&&u$(z8,{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 D3($){if(!g1.isValidElement($)||$.type!==Y2)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 U=String(Z);if(!U)return;let F={text:U,props:X??{}};if(X===void 0||X.wrap==="wrap")Y=!0,Q.segments.push(F);else if(!Y)Q.noWrapSegments.push(F);else Q.segments.push(F);return}if(!g1.isValidElement(Z))return;if(Z.type===r6){g1.Children.forEach(Z.props.children,(U)=>J(U,X));return}if(Z.type!==z8)return;let{children:G,...q}=Z.props,K=X===void 0?q:{...X,...q};g1.Children.forEach(G,(U)=>J(U,K))}return g1.Children.forEach($.props.children,(Z)=>J(Z,void 0)),Q}function V3($,Q,Y){let J=D3($);if(J.segments.length===0&&J.noWrapSegments.length===0){Y.push([]);return}let Z=0;for(let O of J.noWrapSegments)Z+=E1(O.text);if(J.segments.length===0){let O=[],W=[];for(let z of J.noWrapSegments){let B=z.text.split(`
127
- `);for(let _=0;_<B.length;_++){if(_>0)O.push(W),W=[];if(B[_])W.push({text:B[_],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){j3(J.noWrapSegments,Q,Y);return}let G=[],q=[],K=0;function U(){if(G.length===0)G.push([...J.noWrapSegments,...q]);else if(Z>0)G.push([{text:" ".repeat(Z),props:{}},...q]);else G.push(q);q=[],K=0}function F(O,W){if(q.length>0&&q[q.length-1].props===W)q[q.length-1].text+=O;else q.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)U();let _=W[z].split(/(\s+)/);for(let H of _){if(!H)continue;let C=E1(H);if(K+C>X&&K>0){if(U(),/^\s+$/.test(H))continue}if(C>X){let v=FQ(H);while(v.length>0){let M=0,w=0;for(let k of v){let P=E1(k);if(K+w+P>X)break;w+=P,M++}if(M>0){let k=v.slice(0,M).join("");F(k,O.props),K+=E1(k),v=v.slice(M)}if(v.length>0)U()}}else F(H,O.props),K+=C}}if(O.text.endsWith(`
129
- `))U()}if(q.length>0)U();for(let O of G)Y.push(O)}function j3($,Q,Y){let J=[],Z=[],X=0;for(let G of $){let q=G.text.split(`
130
- `);for(let K=0;K<q.length;K++){if(K>0)J.push(Z),Z=[],X=0;let U=q[K];if(!U)continue;let F=E1(U),O=Math.max(0,Q-E1("…"));if(F<=O&&X===0)Z.push({text:U,props:G.props}),X+=F;else{let W=FQ(U),z=X,B=0;for(let H of W){let C=E1(H);if(z+C>O)break;z+=C,B++}let _=W.slice(0,B).join("");if(_)Z.push({text:_,props:G.props});Z.push({text:"…",props:{}}),X=z+E1("…")}}}if(Z.length>0)J.push(Z);if(J.length===0)J.push([{text:"…",props:{}}]);for(let G of J)Y.push(G)}import{jsxDEV as G1}from"react/jsx-dev-runtime";var WQ=E3(h3),g3=200,W$=new Map;function m3($,Q){let Y=`${Q??"__auto__"}:${$}`,J=W$.get(Y);if(J!==void 0)W$.delete(Y),W$.set(Y,J);return J}function p3($,Q,Y){let J=`${Q??"__auto__"}:${$}`;if(W$.size>=g3){let Z=W$.keys().next().value;if(Z!==void 0)W$.delete(Z)}W$.set(J,Y)}function c3($){return LQ($)&&$.type==="text"&&typeof $.value==="string"}function x3($){return LQ($)&&$.type==="element"}function u3($){return LQ($)&&$.type==="root"&&Array.isArray($.children)}function X2($,Q,Y=0){if(c3($))return G1(m1,{wrap:"wrap",children:$.value},Y,!1,void 0,this);if(x3($)){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((G,q)=>X2(G,Q,q));return G1(m1,{color:Z,wrap:"wrap",children:X},Y,!1,void 0,this)}if(u3($))return G1(i6.Fragment,{children:$.children.map((J,Z)=>X2(J,Q,Z))},Y,!1,void 0,this);return G1(m1,{},Y,!1,void 0,this)}function l3($,Q,Y){let J=Y||r0.getTheme().colors.syntax;try{let Z=m3($,Q);if(Z)return X2(Z,J);let X;if(!Q||!WQ.registered(Q))X=WQ.highlightAuto($);else X=WQ.highlight(Q,$);let G=X;if(!G.children||G.children.length===0)return G1(m1,{color:J.default,wrap:"wrap",children:$},void 0,!1,void 0,this);return p3($,Q,X),X2(X,J)}catch(Z){return G1(m1,{color:J.default,wrap:"wrap",children:$},void 0,!1,void 0,this)}}var G2=i6.memo(({content:$,language:Q,showLineNumbers:Y=!0,terminalWidth:J,availableHeight:Z})=>{let X=A0(),G=$.split(`
131
- `),q=0;if(Z&&G.length>Z){let O=Math.max(Z,HQ);if(G.length>O)q=G.length-O,G=G.slice(q)}let K=G.length+q,U=String(K).length+1,F=Math.max(20,J-4);return G1(Z2,{borderStyle:"round",borderColor:X.colors.border.light,paddingX:1,paddingY:0,marginY:1,flexDirection:"column",children:[Q&&G1(Z2,{marginBottom:0,children:G1(m1,{color:X.colors.text.secondary,children:Q},void 0,!1,void 0,this)},void 0,!1,void 0,this),q>0&&G1(Z2,{marginBottom:0,children:G1(m1,{color:X.colors.text.muted,dimColor:!0,children:["... ",q," lines hidden ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),G1(a6,{maxWidth:F,maxHeight:Z,children:G.map((O,W)=>{let z=W+q+1;return G1(Z2,{flexDirection:"row",children:[Y&&G1(m1,{color:X.colors.text.muted,dimColor:!0,wrap:"truncate",children:[String(z).padStart(U-1," ")," "]},void 0,!0,void 0,this),O.trim()===""?G1(m1,{wrap:"wrap",children:" "},void 0,!1,void 0,this):l3(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 o6,Text as z1,useInput as d3}from"ink";import r3,{useState as a3}from"react";import{jsxDEV as K1}from"react/jsx-dev-runtime";var n6=400;function i3($){let Q=$.split(`
132
- `),Y=[],J=0,Z=0;for(let X of Q){if(X.startsWith("---")||X.startsWith("+++"))continue;if(X.startsWith("@@")){let G=X.match(/@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@/);if(G)J=parseInt(G[1],10),Z=parseInt(G[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 BQ=r3.memo(({patch:$,startLine:Q,matchLine:Y,terminalWidth:J,maxLines:Z=20,isFocused:X=!1})=>{let G=A0(),q=i3($),[K,U]=a3(!1);d3((N)=>{if(N.toLowerCase()==="e")U((v)=>!v)},{isActive:X&&q.length>Z});let O=Math.max(...q.map((N)=>N.lineNumber||0)).toString().length+1,W=q.filter((N)=>N.type==="add").length,z=q.filter((N)=>N.type==="remove").length,B=q.length,_=B>Z,H;if(!_)H=q;else if(K)H=q.slice(0,n6);else H=q.slice(0,Z);let C=B-H.length;return K1(o6,{flexDirection:"column",marginTop:1,marginBottom:1,children:[K1(z1,{color:G.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,J)))},void 0,!1,void 0,this),_&&K1(z1,{color:G.colors.info,children:[K?`已展开 ${H.length}/${B} 行`:`显示前 ${Z} 行,共 ${B} 行`," · ",K1(z1,{color:G.colors.success,children:["+",W]},void 0,!0,void 0,this)," ",K1(z1,{color:G.colors.error,children:["-",z]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),_&&K1(z1,{color:G.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,J)))},void 0,!1,void 0,this),H.map((N,v)=>{if(N.type==="header")return K1(z1,{color:G.colors.muted,dimColor:!0,children:N.content},v,!1,void 0,this);let M=N.lineNumber?N.lineNumber.toString().padStart(O," "):" ".repeat(O),w=" ",k,P;if(N.type==="add")w="+",P=G.colors.success,k=void 0;else if(N.type==="remove")w="-",P=G.colors.error,k=void 0;else P=G.colors.text.primary;let A=Math.max(0,J-O-2),T=N.content;if(T.length>A)T=T.substring(0,A-3)+"...";return K1(z1,{color:P,backgroundColor:k,children:[K1(z1,{dimColor:!0,children:M},void 0,!1,void 0,this),K1(z1,{children:w},void 0,!1,void 0,this),K1(z1,{children:[" ",T]},void 0,!0,void 0,this)]},v,!0,void 0,this)}),_&&K1(o6,{marginTop:1,children:K?K1(z1,{color:G.colors.info,dimColor:!0,children:[C>0?`已达显示上限 ${n6} 行,仍有 ${C} 行未显示`:"已显示全部内容",X?" · 按 E 折叠":""]},void 0,!0,void 0,this):K1(z1,{color:G.colors.info,dimColor:!0,children:["已隐藏剩余 ",C," 行",X?" · 按 E 展开全部":""]},void 0,!0,void 0,this)},void 0,!1,void 0,this),K1(z1,{color:G.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 wQ,Text as t6}from"ink";import o3 from"react";import{jsxDEV as l$}from"react/jsx-dev-runtime";var n3=({itemText:$,type:Q,marker:Y,leadingWhitespace:J=""})=>{let Z=Q==="ol"?`${Y}. `:`${Y} `,X=Z.length,G=J.length;return l$(wQ,{paddingLeft:G+1,flexDirection:"row",children:[l$(wQ,{width:X,children:l$(t6,{children:Z},void 0,!1,void 0,this)},void 0,!1,void 0,this),l$(wQ,{flexGrow:1,children:l$(t6,{wrap:"wrap",children:l$(R1,{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)},bQ=o3.memo(n3);import{Text as AQ}from"ink";import t3,{useMemo as s3}from"react";import s6 from"string-width";import{jsxDEV as PQ}from"react/jsx-dev-runtime";var e6=4,d$=3,e3=4,$9=t3.memo(({headers:$,rows:Q,terminalWidth:Y})=>{let J=A0(),Z=s3(()=>{if($.length===0||Q.length===0)return null;let O=$.length,W=$.map((P,A)=>{let T=Math.max(KQ(P),d$);for(let y of Q)T=Math.max(T,KQ(y[A]||""));return T}),z=$.map((P,A)=>{let T=Math.max(GQ(P),d$);for(let y of Q)T=Math.max(T,GQ(y[A]||""));return T}),B=1+O*3,_=Math.max(Y-B-e6,O*d$),H=W.reduce((P,A)=>P+A,0),C=z.reduce((P,A)=>P+A,0),N=!1,v;if(C<=_)v=z;else if(H<=_){let P=_-H,A=z.map((y,L)=>y-W[L]),T=A.reduce((y,L)=>y+L,0);v=W.map((y,L)=>{if(T===0)return y;let f=Math.floor(A[L]/T*P);return y+f})}else{N=!0;let P=_/H;v=W.map((A)=>Math.max(Math.floor(A*P),d$))}function M(){let P=1;for(let A=0;A<$.length;A++){let T=J2($[A],v[A],N);P=Math.max(P,T.length)}for(let A of Q)for(let T=0;T<A.length;T++){let y=J2(A[T]||"",v[T],N);P=Math.max(P,y.length)}return P}if(M()>e3)return{type:"vertical",columnWidths:v,needsHardWrap:N};return{type:"horizontal",columnWidths:v,needsHardWrap:N}},[$,Q,Y]);if(!Z)return null;if(Z.type==="vertical"){let O=Math.min(Y-1,40),W="─".repeat(O);return PQ(AQ,{children:Q.map((z,B)=>{let _=[];if(B>0)_.push(W);return z.forEach((H,C)=>{let N=$[C]||`Column ${C+1}`,v=(H||"").replace(/\n+/g," ").trim();_.push(`\x1B[1m${N}:\x1B[22m ${v}`)}),_.join(`
124
+ `).map((J)=>T3(J,Q,Y)).join(`
125
+ `)}var KQ=($)=>{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 c6(Q)};var x6=($)=>{return/[*_~`<[\]https?:]/.test($)},qQ=($)=>{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)=>c6(J)))},Y2=($,Q,Y=!1)=>{if(Q<=0)return[$];let J=$.trimEnd(),X=GQ(J,Q,{hard:Y,trim:!1,wordWrap:!0}).split(`
126
+ `).filter((G)=>G.length>0);return X.length>0?X:[""]},u6=($,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 W1,Fragment as S3}from"react/jsx-dev-runtime";var UQ=2,OQ=1,zQ=2;function _Q($,Q){return`inline-${$}-${Q}`}var f3=({text:$})=>{let Q=A0();if(!x6($))return W1(P1,{children:$},void 0,!1,void 0,this);let Y=[],J=0,Z=0,X=0,G=/(\*\*.*?\*\*|\*(?!\s).*?(?<!\s)\*|_(?!\s).*?(?<!\s)_|~~.*?~~|`+[^`]+`+|\[.*?\]\(.*?\)|https?:\/\/\S+)/g,q;while((q=G.exec($))!==null){if(q.index>J){let O=$.slice(J,q.index);Y.push(W1(P1,{children:O},_Q("text",Z++),!1,void 0,this))}let K=q[0],U=null,W=_Q("match",X++);try{if(K.startsWith("**")&&K.endsWith("**")&&K.length>UQ*2)U=W1(P1,{bold:!0,children:K.slice(UQ,-UQ)},W,!1,void 0,this);else if(K.length>OQ*2&&(K.startsWith("*")&&K.endsWith("*")||K.startsWith("_")&&K.endsWith("_"))){let O=$.substring(q.index-1,q.index),H=$.substring(G.lastIndex,G.lastIndex+1);if(!(/\w/.test(O)||/\w/.test(H)||/[./\\]/.test(O+H)))U=W1(P1,{italic:!0,children:K.slice(OQ,-OQ)},W,!1,void 0,this)}else if(K.startsWith("~~")&&K.endsWith("~~")&&K.length>zQ*2)U=W1(P1,{strikethrough:!0,children:K.slice(zQ,-zQ)},W,!1,void 0,this);else if(K.startsWith("`")&&K.endsWith("`")){let O=K.match(/^(`+)([^`]+)\1$/);if(O&&O[2])U=W1(P1,{color:Q.colors.syntax.keyword,backgroundColor:Q.colors.background.secondary,bold:!0,children:` ${O[2]} `},W,!1,void 0,this)}else if(K.startsWith("[")&&K.includes("](")&&K.endsWith(")")){let O=K.match(/\[(.*?)\]\((.*?)\)/);if(O){let H=O[1],z=O[2];U=W1(P1,{children:[H,W1(P1,{color:Q.colors.info,children:[" (",z,")"]},void 0,!0,void 0,this)]},W,!0,void 0,this)}}else if(K.match(/^https?:\/\//))U=W1(P1,{color:Q.colors.info,children:K},W,!1,void 0,this)}catch(O){console.error("InlineRenderer 解析错误:",K,O),U=null}Y.push(U??W1(P1,{children:K},W,!1,void 0,this)),J=G.lastIndex}if(J<$.length){let K=$.slice(J);Y.push(W1(P1,{children:K},_Q("text",Z++),!1,void 0,this))}return W1(S3,{children:Y.filter((K)=>K!==null)},void 0,!1,void 0,this)},R1=k3.memo(f3);import{jsxDEV as x$}from"react/jsx-dev-runtime";var D3="▎",d6=v3.memo(({lines:$,level:Q})=>{let Y=A0(),J=D3.repeat(Q);return x$(NQ,{flexDirection:"column",children:$.map((Z,X)=>{if(Z.trim()==="")return x$(NQ,{height:1},X,!1,void 0,this);return x$(NQ,{flexDirection:"row",children:[x$(l6,{dimColor:!0,color:Y.colors.text.muted,children:[J," "]},void 0,!0,void 0,this),x$(l6,{italic:!0,wrap:"wrap",children:x$(R1,{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 X2,Text as m1}from"ink";import{isPlainObject as BQ}from"lodash-es";import{common as g3,createLowlight as m3}from"lowlight";import n6 from"react";import{Box as Z2,Text as _8}from"ink";import g1,{Fragment as o6}from"react";import V3 from"string-width";var r6=new Map,a6=1000;function HQ($){let Q=!0;for(let J=0;J<$.length;J++)if($.charCodeAt(J)>127){Q=!1;break}if(Q)return $.split("");if($.length<=a6){let J=r6.get($);if(J)return J}let Y=Array.from($);if($.length<=a6)r6.set($,Y);return Y}var FQ=new Map;function E1($){if(/^[\x20-\x7E]*$/.test($))return $.length;if(FQ.has($))return FQ.get($);let Q=V3($);return FQ.set($,Q),Q}import{jsxDEV as u$}from"react/jsx-dev-runtime";var WQ=2,i6=g1.memo(({children:$,maxWidth:Q,maxHeight:Y,overflowDirection:J="top",additionalHiddenLinesCount:Z=0})=>{let X=A0(),G=[],q=Math.max(Math.round(Y??Number.MAX_SAFE_INTEGER),WQ);function K(_){if(!g1.isValidElement(_))return;if(_.type===o6){g1.Children.forEach(_.props.children,K);return}if(_.type===Z2){h3(_,Q,G);return}}g1.Children.forEach($,K);let W=G.length>q||Z>0?q-1:q,O=W!==void 0?Math.max(0,G.length-W):0,H=O+Z,w=(O>0?J==="top"?G.slice(O):G.slice(0,W):G).map((_,F)=>u$(Z2,{children:_.length>0?_.map((C,N)=>u$(_8,{...C.props,children:C.text},N,!1,void 0,this)):u$(_8,{children:" "},void 0,!1,void 0,this)},F,!1,void 0,this));return u$(Z2,{flexDirection:"column",width:Q,flexShrink:0,children:[H>0&&J==="top"&&u$(_8,{color:X.colors.text.muted,dimColor:!0,children:["... ",H," line",H===1?"":"s"," hidden ..."]},void 0,!0,void 0,this),w,H>0&&J==="bottom"&&u$(_8,{color:X.colors.text.muted,dimColor:!0,children:["... ",H," line",H===1?"":"s"," hidden ..."]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});function j3($){if(!g1.isValidElement($)||$.type!==Z2)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 U=String(Z);if(!U)return;let W={text:U,props:X??{}};if(X===void 0||X.wrap==="wrap")Y=!0,Q.segments.push(W);else if(!Y)Q.noWrapSegments.push(W);else Q.segments.push(W);return}if(!g1.isValidElement(Z))return;if(Z.type===o6){g1.Children.forEach(Z.props.children,(U)=>J(U,X));return}if(Z.type!==_8)return;let{children:G,...q}=Z.props,K=X===void 0?q:{...X,...q};g1.Children.forEach(G,(U)=>J(U,K))}return g1.Children.forEach($.props.children,(Z)=>J(Z,void 0)),Q}function h3($,Q,Y){let J=j3($);if(J.segments.length===0&&J.noWrapSegments.length===0){Y.push([]);return}let Z=0;for(let O of J.noWrapSegments)Z+=E1(O.text);if(J.segments.length===0){let O=[],H=[];for(let z of J.noWrapSegments){let w=z.text.split(`
127
+ `);for(let _=0;_<w.length;_++){if(_>0)O.push(H),H=[];if(w[_])H.push({text:w[_],props:z.props})}}if(H.length>0)O.push(H);for(let z of O)Y.push(z);return}let X=Q-Z;if(X<1){E3(J.noWrapSegments,Q,Y);return}let G=[],q=[],K=0;function U(){if(G.length===0)G.push([...J.noWrapSegments,...q]);else if(Z>0)G.push([{text:" ".repeat(Z),props:{}},...q]);else G.push(q);q=[],K=0}function W(O,H){if(q.length>0&&q[q.length-1].props===H)q[q.length-1].text+=O;else q.push({text:O,props:H})}for(let O of J.segments){let H=O.text.split(`
128
+ `);for(let z=0;z<H.length;z++){if(z>0)U();let _=H[z].split(/(\s+)/);for(let F of _){if(!F)continue;let C=E1(F);if(K+C>X&&K>0){if(U(),/^\s+$/.test(F))continue}if(C>X){let S=HQ(F);while(S.length>0){let M=0,B=0;for(let k of S){let P=E1(k);if(K+B+P>X)break;B+=P,M++}if(M>0){let k=S.slice(0,M).join("");W(k,O.props),K+=E1(k),S=S.slice(M)}if(S.length>0)U()}}else W(F,O.props),K+=C}}if(O.text.endsWith(`
129
+ `))U()}if(q.length>0)U();for(let O of G)Y.push(O)}function E3($,Q,Y){let J=[],Z=[],X=0;for(let G of $){let q=G.text.split(`
130
+ `);for(let K=0;K<q.length;K++){if(K>0)J.push(Z),Z=[],X=0;let U=q[K];if(!U)continue;let W=E1(U),O=Math.max(0,Q-E1("…"));if(W<=O&&X===0)Z.push({text:U,props:G.props}),X+=W;else{let H=HQ(U),z=X,w=0;for(let F of H){let C=E1(F);if(z+C>O)break;z+=C,w++}let _=H.slice(0,w).join("");if(_)Z.push({text:_,props:G.props});Z.push({text:"…",props:{}}),X=z+E1("…")}}}if(Z.length>0)J.push(Z);if(J.length===0)J.push([{text:"…",props:{}}]);for(let G of J)Y.push(G)}import{jsxDEV as G1}from"react/jsx-dev-runtime";var LQ=m3(g3),p3=200,W$=new Map;function c3($,Q){let Y=`${Q??"__auto__"}:${$}`,J=W$.get(Y);if(J!==void 0)W$.delete(Y),W$.set(Y,J);return J}function x3($,Q,Y){let J=`${Q??"__auto__"}:${$}`;if(W$.size>=p3){let Z=W$.keys().next().value;if(Z!==void 0)W$.delete(Z)}W$.set(J,Y)}function u3($){return BQ($)&&$.type==="text"&&typeof $.value==="string"}function l3($){return BQ($)&&$.type==="element"}function d3($){return BQ($)&&$.type==="root"&&Array.isArray($.children)}function G2($,Q,Y=0){if(u3($))return G1(m1,{wrap:"wrap",children:$.value},Y,!1,void 0,this);if(l3($)){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((G,q)=>G2(G,Q,q));return G1(m1,{color:Z,wrap:"wrap",children:X},Y,!1,void 0,this)}if(d3($))return G1(n6.Fragment,{children:$.children.map((J,Z)=>G2(J,Q,Z))},Y,!1,void 0,this);return G1(m1,{},Y,!1,void 0,this)}function r3($,Q,Y){let J=Y||r0.getTheme().colors.syntax;try{let Z=c3($,Q);if(Z)return G2(Z,J);let X;if(!Q||!LQ.registered(Q))X=LQ.highlightAuto($);else X=LQ.highlight(Q,$);let G=X;if(!G.children||G.children.length===0)return G1(m1,{color:J.default,wrap:"wrap",children:$},void 0,!1,void 0,this);return x3($,Q,X),G2(X,J)}catch(Z){return G1(m1,{color:J.default,wrap:"wrap",children:$},void 0,!1,void 0,this)}}var K2=n6.memo(({content:$,language:Q,showLineNumbers:Y=!0,terminalWidth:J,availableHeight:Z})=>{let X=A0(),G=$.split(`
131
+ `),q=0;if(Z&&G.length>Z){let O=Math.max(Z,WQ);if(G.length>O)q=G.length-O,G=G.slice(q)}let K=G.length+q,U=String(K).length+1,W=Math.max(20,J-4);return G1(X2,{borderStyle:"round",borderColor:X.colors.border.light,paddingX:1,paddingY:0,marginY:1,flexDirection:"column",children:[Q&&G1(X2,{marginBottom:0,children:G1(m1,{color:X.colors.text.secondary,children:Q},void 0,!1,void 0,this)},void 0,!1,void 0,this),q>0&&G1(X2,{marginBottom:0,children:G1(m1,{color:X.colors.text.muted,dimColor:!0,children:["... ",q," lines hidden ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),G1(i6,{maxWidth:W,maxHeight:Z,children:G.map((O,H)=>{let z=H+q+1;return G1(X2,{flexDirection:"row",children:[Y&&G1(m1,{color:X.colors.text.muted,dimColor:!0,wrap:"truncate",children:[String(z).padStart(U-1," ")," "]},void 0,!0,void 0,this),O.trim()===""?G1(m1,{wrap:"wrap",children:" "},void 0,!1,void 0,this):r3(O,Q,X.colors.syntax)]},H,!0,void 0,this)})},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as t6,Text as z1,useInput as a3}from"ink";import o3,{useState as i3}from"react";import{jsxDEV as K1}from"react/jsx-dev-runtime";var s6=400;function n3($){let Q=$.split(`
132
+ `),Y=[],J=0,Z=0;for(let X of Q){if(X.startsWith("---")||X.startsWith("+++"))continue;if(X.startsWith("@@")){let G=X.match(/@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@/);if(G)J=parseInt(G[1],10),Z=parseInt(G[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 wQ=o3.memo(({patch:$,startLine:Q,matchLine:Y,terminalWidth:J,maxLines:Z=20,isFocused:X=!1})=>{let G=A0(),q=n3($),[K,U]=i3(!1);a3((N)=>{if(N.toLowerCase()==="e")U((S)=>!S)},{isActive:X&&q.length>Z});let O=Math.max(...q.map((N)=>N.lineNumber||0)).toString().length+1,H=q.filter((N)=>N.type==="add").length,z=q.filter((N)=>N.type==="remove").length,w=q.length,_=w>Z,F;if(!_)F=q;else if(K)F=q.slice(0,s6);else F=q.slice(0,Z);let C=w-F.length;return K1(t6,{flexDirection:"column",marginTop:1,marginBottom:1,children:[K1(z1,{color:G.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,J)))},void 0,!1,void 0,this),_&&K1(z1,{color:G.colors.info,children:[K?`已展开 ${F.length}/${w} 行`:`显示前 ${Z} 行,共 ${w} 行`," · ",K1(z1,{color:G.colors.success,children:["+",H]},void 0,!0,void 0,this)," ",K1(z1,{color:G.colors.error,children:["-",z]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),_&&K1(z1,{color:G.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,J)))},void 0,!1,void 0,this),F.map((N,S)=>{if(N.type==="header")return K1(z1,{color:G.colors.muted,dimColor:!0,children:N.content},S,!1,void 0,this);let M=N.lineNumber?N.lineNumber.toString().padStart(O," "):" ".repeat(O),B=" ",k,P;if(N.type==="add")B="+",P=G.colors.success,k=void 0;else if(N.type==="remove")B="-",P=G.colors.error,k=void 0;else P=G.colors.text.primary;let A=Math.max(0,J-O-2),T=N.content;if(T.length>A)T=T.substring(0,A-3)+"...";return K1(z1,{color:P,backgroundColor:k,children:[K1(z1,{dimColor:!0,children:M},void 0,!1,void 0,this),K1(z1,{children:B},void 0,!1,void 0,this),K1(z1,{children:[" ",T]},void 0,!0,void 0,this)]},S,!0,void 0,this)}),_&&K1(t6,{marginTop:1,children:K?K1(z1,{color:G.colors.info,dimColor:!0,children:[C>0?`已达显示上限 ${s6} 行,仍有 ${C} 行未显示`:"已显示全部内容",X?" · 按 E 折叠":""]},void 0,!0,void 0,this):K1(z1,{color:G.colors.info,dimColor:!0,children:["已隐藏剩余 ",C," 行",X?" · 按 E 展开全部":""]},void 0,!0,void 0,this)},void 0,!1,void 0,this),K1(z1,{color:G.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 bQ,Text as e6}from"ink";import t3 from"react";import{jsxDEV as l$}from"react/jsx-dev-runtime";var s3=({itemText:$,type:Q,marker:Y,leadingWhitespace:J=""})=>{let Z=Q==="ol"?`${Y}. `:`${Y} `,X=Z.length,G=J.length;return l$(bQ,{paddingLeft:G+1,flexDirection:"row",children:[l$(bQ,{width:X,children:l$(e6,{children:Z},void 0,!1,void 0,this)},void 0,!1,void 0,this),l$(bQ,{flexGrow:1,children:l$(e6,{wrap:"wrap",children:l$(R1,{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)},AQ=t3.memo(s3);import{Text as PQ}from"ink";import e3,{useMemo as $Z}from"react";import $9 from"string-width";import{jsxDEV as RQ}from"react/jsx-dev-runtime";var Q9=4,d$=3,QZ=4,J9=e3.memo(({headers:$,rows:Q,terminalWidth:Y})=>{let J=A0(),Z=$Z(()=>{if($.length===0||Q.length===0)return null;let O=$.length,H=$.map((P,A)=>{let T=Math.max(qQ(P),d$);for(let y of Q)T=Math.max(T,qQ(y[A]||""));return T}),z=$.map((P,A)=>{let T=Math.max(KQ(P),d$);for(let y of Q)T=Math.max(T,KQ(y[A]||""));return T}),w=1+O*3,_=Math.max(Y-w-Q9,O*d$),F=H.reduce((P,A)=>P+A,0),C=z.reduce((P,A)=>P+A,0),N=!1,S;if(C<=_)S=z;else if(F<=_){let P=_-F,A=z.map((y,L)=>y-H[L]),T=A.reduce((y,L)=>y+L,0);S=H.map((y,L)=>{if(T===0)return y;let f=Math.floor(A[L]/T*P);return y+f})}else{N=!0;let P=_/F;S=H.map((A)=>Math.max(Math.floor(A*P),d$))}function M(){let P=1;for(let A=0;A<$.length;A++){let T=Y2($[A],S[A],N);P=Math.max(P,T.length)}for(let A of Q)for(let T=0;T<A.length;T++){let y=Y2(A[T]||"",S[T],N);P=Math.max(P,y.length)}return P}if(M()>QZ)return{type:"vertical",columnWidths:S,needsHardWrap:N};return{type:"horizontal",columnWidths:S,needsHardWrap:N}},[$,Q,Y]);if(!Z)return null;if(Z.type==="vertical"){let O=Math.min(Y-1,40),H="─".repeat(O);return RQ(PQ,{children:Q.map((z,w)=>{let _=[];if(w>0)_.push(H);return z.forEach((F,C)=>{let N=$[C]||`Column ${C+1}`,S=(F||"").replace(/\n+/g," ").trim();_.push(`\x1B[1m${N}:\x1B[22m ${S}`)}),_.join(`
133
133
  `)}).join(`
134
- `)},void 0,!1,void 0,this)}let{columnWidths:X,needsHardWrap:G}=Z;function q(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((_,H)=>{B+=z.h.repeat(_+2),B+=H<X.length-1?z.mid:z.right}),B}function K(O,W){let z=O.map((C,N)=>{let v=X[N]||d$;return J2(C||"",v,G)}),B=Math.max(...z.map((C)=>C.length),1),_=z.map((C)=>Math.floor((B-C.length)/2)),H=[];for(let C=0;C<B;C++){let N="│";for(let v=0;v<O.length;v++){let M=z[v],w=_[v],k=C-w,P=k>=0&&k<M.length?M[k]:"",A=X[v]||d$,T=s6(P),y=c6(W?`\x1B[1m${P}\x1B[22m`:P,T,A,W?"center":"left");N+=` ${y} │`}H.push(N)}return H}let U=[];if(U.push(q("top")),U.push(...K($,!0)),U.push(q("middle")),Q.forEach((O,W)=>{if(U.push(...K(O,!1)),W<Q.length-1)U.push(q("middle"))}),U.push(q("bottom")),Math.max(...U.map((O)=>s6(O)))>Y-e6){let O=Math.min(Y-1,40),W="─".repeat(O);return PQ(AQ,{children:Q.map((z,B)=>{let _=[];if(B>0)_.push(W);return z.forEach((H,C)=>{let N=$[C]||`Column ${C+1}`,v=(H||"").replace(/\n+/g," ").trim();_.push(`\x1B[1m${N}:\x1B[22m ${v}`)}),_.join(`
134
+ `)},void 0,!1,void 0,this)}let{columnWidths:X,needsHardWrap:G}=Z;function q(O){let z={top:{left:"┌",mid:"┬",right:"┐",h:"─"},middle:{left:"├",mid:"┼",right:"┤",h:"─"},bottom:{left:"└",mid:"┴",right:"┘",h:"─"}}[O],w=z.left;return X.forEach((_,F)=>{w+=z.h.repeat(_+2),w+=F<X.length-1?z.mid:z.right}),w}function K(O,H){let z=O.map((C,N)=>{let S=X[N]||d$;return Y2(C||"",S,G)}),w=Math.max(...z.map((C)=>C.length),1),_=z.map((C)=>Math.floor((w-C.length)/2)),F=[];for(let C=0;C<w;C++){let N="│";for(let S=0;S<O.length;S++){let M=z[S],B=_[S],k=C-B,P=k>=0&&k<M.length?M[k]:"",A=X[S]||d$,T=$9(P),y=u6(H?`\x1B[1m${P}\x1B[22m`:P,T,A,H?"center":"left");N+=` ${y} │`}F.push(N)}return F}let U=[];if(U.push(q("top")),U.push(...K($,!0)),U.push(q("middle")),Q.forEach((O,H)=>{if(U.push(...K(O,!1)),H<Q.length-1)U.push(q("middle"))}),U.push(q("bottom")),Math.max(...U.map((O)=>$9(O)))>Y-Q9){let O=Math.min(Y-1,40),H="─".repeat(O);return RQ(PQ,{children:Q.map((z,w)=>{let _=[];if(w>0)_.push(H);return z.forEach((F,C)=>{let N=$[C]||`Column ${C+1}`,S=(F||"").replace(/\n+/g," ").trim();_.push(`\x1B[1m${N}:\x1B[22m ${S}`)}),_.join(`
135
135
  `)}).join(`
136
- `)},void 0,!1,void 0,this)}return PQ(AQ,{color:J.colors.text.primary,children:U.join(`
137
- `)},void 0,!1,void 0,this)});import{jsxDEV as g}from"react/jsx-dev-runtime";var $Z=($,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:" "}}},QZ=B$.memo(({content:$,language:Q,terminalWidth:Y,isPending:J=!1,availableHeight:Z})=>{let X=A0();if(J&&Z!==void 0){let G=$.split(`
136
+ `)},void 0,!1,void 0,this)}return RQ(PQ,{color:J.colors.text.primary,children:U.join(`
137
+ `)},void 0,!1,void 0,this)});import{jsxDEV as g}from"react/jsx-dev-runtime";var JZ=($,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:" "}}},YZ=B$.memo(({content:$,language:Q,terminalWidth:Y,isPending:J=!1,availableHeight:Z})=>{let X=A0();if(J&&Z!==void 0){let G=$.split(`
138
138
  `),q=4,K=Math.max(1,Z-4);if(G.length>K){let U=G.slice(0,K).join(`
139
- `);return g(O0,{flexDirection:"column",flexShrink:0,children:[g(G2,{content:U,language:Q,showLineNumbers:!0,terminalWidth:Y},void 0,!1,void 0,this),g(b0,{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(G2,{content:$,language:Q,showLineNumbers:!0,terminalWidth:Y},void 0,!1,void 0,this)}),JZ=B$.memo(({content:$,level:Q})=>{let Y=A0();switch(Q){case 1:return g(b0,{bold:!0,color:Y.colors.primary,children:g(R1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 2:return g(b0,{bold:!0,color:Y.colors.primary,children:g(R1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 3:return g(b0,{bold:!0,color:Y.colors.text.primary,children:g(R1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 4:return g(b0,{italic:!0,color:Y.colors.text.muted,children:g(R1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);default:return g(b0,{children:g(R1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)}}),YZ=B$.memo(({terminalWidth:$})=>{let Q=A0(),Y=Math.max(0,Math.min($-4,80));return g(b0,{dimColor:!0,color:Q.colors.text.muted,children:"─".repeat(Y)},void 0,!1,void 0,this)}),ZZ=B$.memo(({content:$})=>{return g(b0,{wrap:"wrap",children:g(R1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)}),XZ=B$.memo(({content:$})=>{let Q=A0();return g(O0,{flexDirection:"row",gap:1,children:[g(b0,{color:Q.colors.info,children:" "},void 0,!1,void 0,this),g(b0,{color:Q.colors.text.muted,italic:!0,children:$},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}),GZ=B$.memo(({detail:$,terminalWidth:Q})=>{let Y=A0(),J=50,Z=$.split(`
139
+ `);return g(O0,{flexDirection:"column",flexShrink:0,children:[g(K2,{content:U,language:Q,showLineNumbers:!0,terminalWidth:Y},void 0,!1,void 0,this),g(b0,{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(K2,{content:$,language:Q,showLineNumbers:!0,terminalWidth:Y},void 0,!1,void 0,this)}),ZZ=B$.memo(({content:$,level:Q})=>{let Y=A0();switch(Q){case 1:return g(b0,{bold:!0,color:Y.colors.primary,children:g(R1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 2:return g(b0,{bold:!0,color:Y.colors.primary,children:g(R1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 3:return g(b0,{bold:!0,color:Y.colors.text.primary,children:g(R1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 4:return g(b0,{italic:!0,color:Y.colors.text.muted,children:g(R1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);default:return g(b0,{children:g(R1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)}}),XZ=B$.memo(({terminalWidth:$})=>{let Q=A0(),Y=Math.max(0,Math.min($-4,80));return g(b0,{dimColor:!0,color:Q.colors.text.muted,children:"─".repeat(Y)},void 0,!1,void 0,this)}),GZ=B$.memo(({content:$})=>{return g(b0,{wrap:"wrap",children:g(R1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)}),KZ=B$.memo(({content:$})=>{let Q=A0();return g(O0,{flexDirection:"row",gap:1,children:[g(b0,{color:Q.colors.info,children:" "},void 0,!1,void 0,this),g(b0,{color:Q.colors.text.muted,italic:!0,children:$},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}),qZ=B$.memo(({detail:$,terminalWidth:Q})=>{let Y=A0(),J=50,Z=$.split(`
140
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,G=X?Z.slice(0,50):Z,q=G.join(`
141
- `),K=q.includes("<<<DIFF>>>"),U=q.includes("```");if(K){let F=q.match(/<<<DIFF>>>\s*({[\s\S]*?})\s*<<<\/DIFF>>>/);if(F)try{let O=JSON.parse(F[1]);return g(O0,{flexDirection:"column",children:[g(BQ,{patch:O.patch,startLine:O.startLine,matchLine:O.matchLine,terminalWidth:Q},void 0,!1,void 0,this),X&&g(O0,{marginTop:1,children:g(b0,{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(U){let F=q.match(/```(\w+)?\s*\n([\s\S]*?)\n```/);if(F){let O=F[1]||"text",W=F[2];return g(O0,{flexDirection:"column",children:[g(G2,{content:W,language:O,showLineNumbers:!1,terminalWidth:Q},void 0,!1,void 0,this),X&&g(O0,{marginTop:1,children:g(b0,{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(O0,{flexDirection:"column",children:[G.map((F,O)=>g(b0,{color:Y.colors.text.primary,children:F},O,!1,void 0,this)),X&&g(O0,{marginTop:1,children:g(b0,{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 KZ($,Q,Y,J=80){if(!Y||Q===void 0||Q<=0)return{content:$,isTruncated:!1,hiddenLines:0};let X=Math.max(1,Q-8),G=Math.max(40,J*0.8),q=X*G;if($.length<=q)return{content:$,isTruncated:!1,hiddenLines:0};let K=Math.floor(q*0.9),U=$.length-K,F=U,O=$.indexOf(`
142
- `,U);if(O!==-1&&O-U<G)F=O+1;let W=$.slice(F),B=($.slice(0,F).match(/\n/g)||[]).length+1;return{content:W,isTruncated:!0,hiddenLines:B}}var J$=B$.memo(({content:$,role:Q,terminalWidth:Y,metadata:J,isPending:Z=!1,availableTerminalHeight:X,hidePrefix:G=!1,noMargin:q=!1,renderPlainTextOnly:K=!1,streamingLines:U,streamingHiddenLines:F,messageId:O,blocksOverride:W,currentLineOverride:z,streamingMode:B="text",renderCodeBlocksAsPlainText:_=!1})=>{let H=A0(),C=W!==void 0,N=L$(()=>$Z(Q,H.colors,J),[Q,H.colors,J]),{color:v,prefix:M}=N,w=M.length+1,k=L$(()=>{if(!J||typeof J!=="object")return null;if(!("subtaskRef"in J))return null;let b=J.subtaskRef;if(!b||typeof b!=="object")return null;return b},[J]),P=Q==="tool"&&J?.phase==="start",A=!q&&!P,T=L$(()=>{if(!K)return[];return $.split(/\r?\n/)},[$,K]);if(!C&&Z){let b=U??$.split(/\r?\n/),V=F??0,p=!1,j=!1,E=!1;if(B!=="text")p=B==="code",j=B==="diff",E=B==="table";return g(O0,{flexDirection:"column",marginBottom:A?1:0,flexShrink:0,children:[V>0&&g(O0,{flexDirection:"row",flexShrink:0,children:[g(O0,{width:w,flexShrink:0},void 0,!1,void 0,this),g(b0,{color:H.colors.text.muted,dimColor:!0,children:["^ ",V," lines above (streaming...)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),b.map((m,X0)=>{if(B==="text"){if(m.match(Q$.codeBlock))p=!p;else if(m.match(Q$.diffStart))j=!0;else if(m.match(Q$.diffEnd))j=!1;else if(m.match(Q$.table))E=!0;else if(E&&!m.match(Q$.table))E=!1}let J0=B==="text"&&!p&&!j&&!E,w0=J0?m.match(Q$.ulItem):null,k0=J0?m.match(Q$.olItem):null,c0=w0??k0;return g(O0,{flexDirection:"row",flexShrink:0,children:[X0===0&&!G?g(O0,{marginRight:1,flexShrink:0,children:g(b0,{color:v,bold:!0,children:M},void 0,!1,void 0,this)},void 0,!1,void 0,this):g(O0,{width:w,flexShrink:0},void 0,!1,void 0,this),g(O0,{flexGrow:1,flexShrink:0,children:c0?g(bQ,{type:w0?"ul":"ol",marker:c0[2],itemText:c0[3],leadingWhitespace:c0[1]},void 0,!1,void 0,this):g(b0,{wrap:"wrap",children:m===""?" ":m},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},X0,!0,void 0,this)})]},void 0,!0,void 0,this)}if(!C&&K)return g(O0,{flexDirection:"column",marginBottom:A?1:0,flexShrink:0,children:T.map((b,V)=>g(O0,{flexDirection:"row",flexShrink:0,children:[V===0&&!G?g(O0,{marginRight:1,flexShrink:0,children:g(b0,{color:v,bold:!0,children:M},void 0,!1,void 0,this)},void 0,!1,void 0,this):g(O0,{width:w,flexShrink:0},void 0,!1,void 0,this),g(O0,{flexGrow:1,flexShrink:0,children:g(b0,{wrap:"wrap",children:b===""?" ":b},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},V,!0,void 0,this))},void 0,!1,void 0,this);let y=Q9(null);RQ(()=>{y.current=null},[O]);let L=L$(()=>{if(C)return null;if(!O)return null;return J9(O)},[O,C]);RQ(()=>{if(C)return;if(!L||!O)return;y.current={messageId:O,blocks:L}},[L,O,C]),RQ(()=>{if(C)return;if(!L||!O)return;Y9(O)},[L,O,C]);let f=L$(()=>C?{content:$,isTruncated:!1,hiddenLines:0}:KZ($,X,Z,Y),[$,X,Z,Y,C]),{content:h,isTruncated:t,hiddenLines:l}=f;if(!C&&Q==="tool"&&J&&"detail"in J){let b=J;if(b.detail)return g(O0,{flexDirection:"column",marginBottom:q?0:1,children:[g(O0,{flexDirection:"row",children:[g(O0,{marginRight:1,children:g(b0,{color:v,bold:!0,children:M},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(b0,{color:v,children:$},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g(O0,{marginLeft:M.length+1,children:g(GZ,{detail:b.detail,terminalWidth:Y-(M.length+1)},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}let{completedContent:a,currentLine:I}=L$(()=>{if(C)return{completedContent:"",currentLine:z??""};if(!Z)return{completedContent:h,currentLine:""};let b=h.lastIndexOf(`
143
- `);if(b===-1)return{completedContent:"",currentLine:h};return{completedContent:h.slice(0,b+1),currentLine:h.slice(b+1)}},[h,Z,C,z]),R=Q9({content:"",blocks:[]}),S=L$(()=>{if(C)return W??[];if(L)return L;if(y.current&&y.current.messageId===O)return y.current.blocks;let b=R.current;if(!Z||!a.startsWith(b.content)){let E=yQ(a);return R.current={content:a,blocks:E},E}if(a===b.content)return b.blocks;let V=a.slice(b.content.length),p=yQ(V),j=[...b.blocks,...p];return R.current={content:a,blocks:j},j},[a,Z,C,W]);return g(O0,{flexDirection:"column",marginBottom:A?1:0,flexShrink:0,children:[t&&g(O0,{flexDirection:"row",flexShrink:0,children:[g(O0,{width:w,flexShrink:0},void 0,!1,void 0,this),g(b0,{color:H.colors.text.muted,dimColor:!0,children:["^ ",l," lines above (streaming...)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),S.map((b,V)=>{if(b.type==="empty")return g(O0,{height:1,flexShrink:0},V,!1,void 0,this);return g(O0,{flexDirection:"row",flexShrink:0,children:[V===0&&!G&&g(O0,{marginRight:1,flexShrink:0,children:g(b0,{color:v,bold:!0,children:M},void 0,!1,void 0,this)},void 0,!1,void 0,this),(V>0||G)&&g(O0,{width:w,flexShrink:0},void 0,!1,void 0,this),g(O0,{flexGrow:1,flexShrink:0,children:b.type==="code"?_?g(b0,{wrap:"wrap",children:b.content},void 0,!1,void 0,this):g(QZ,{content:b.content,language:b.language,terminalWidth:Y-w,isPending:Z,availableHeight:X},void 0,!1,void 0,this):b.type==="table"&&b.tableData?g($9,{headers:b.tableData.headers,rows:b.tableData.rows,terminalWidth:Y-w},void 0,!1,void 0,this):b.type==="heading"?g(JZ,{content:b.content,level:b.level||1},void 0,!1,void 0,this):b.type==="list"?g(bQ,{type:b.listType||"ul",marker:b.marker||"-",itemText:b.content,leadingWhitespace:" ".repeat(b.indentation||0)},void 0,!1,void 0,this):b.type==="hr"?g(YZ,{terminalWidth:Y-w},void 0,!1,void 0,this):b.type==="diff"&&b.diffData?g(BQ,{patch:b.diffData.patch,startLine:b.diffData.startLine,matchLine:b.diffData.matchLine,terminalWidth:Y-w},void 0,!1,void 0,this):b.type==="command-message"?g(XZ,{content:b.content},void 0,!1,void 0,this):b.type==="blockquote"&&b.blockquoteLines?g(u6,{lines:b.blockquoteLines,level:b.blockquoteLevel||1},void 0,!1,void 0,this):g(ZZ,{content:b.content},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},V,!0,void 0,this)}),I&&g(O0,{flexDirection:"row",flexShrink:0,children:[S.length===0&&!G?g(O0,{marginRight:1,flexShrink:0,children:g(b0,{color:v,bold:!0,children:M},void 0,!1,void 0,this)},void 0,!1,void 0,this):g(O0,{width:w,flexShrink:0},void 0,!1,void 0,this),g(O0,{flexGrow:1,flexShrink:0,children:g(b0,{wrap:"wrap",children:I},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),k&&g(O0,{flexDirection:"row",flexShrink:0,children:[g(O0,{width:w,flexShrink:0},void 0,!1,void 0,this),g(O0,{flexDirection:"column",flexGrow:1,flexShrink:0,children:[g(b0,{color:H.colors.text.muted,children:["Subtask"," ",typeof k.agentType==="string"?`@${k.agentType}`:"",typeof k.status==="string"?` · ${k.status}`:""]},void 0,!0,void 0,this),typeof k.summary==="string"&&k.summary.trim()!==""&&g(b0,{wrap:"wrap",children:k.summary},void 0,!1,void 0,this),typeof k.childSessionId==="string"&&g(b0,{color:H.colors.text.muted,children:["Session ",k.childSessionId]},void 0,!0,void 0,this),typeof k.resumedFrom==="string"&&g(b0,{color:H.colors.text.muted,children:["Resumed from ",k.resumedFrom,typeof k.resumeDepth==="number"?` · depth ${k.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 FZ}from"react/jsx-dev-runtime";var zZ=MQ.memo(({label:$,isSelected:Q})=>I0(k1,{color:Q?"yellow":void 0,children:$},void 0,!1,void 0,this)),_Z=MQ.memo(({details:$,headerColor:Q,isPlanModeExit:Y,isPlanModeEnter:J,terminalWidth:Z})=>I0(FZ,{children:[I0(L1,{marginBottom:1,children:I0(k1,{children:$.message},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.planContent&&I0(L1,{flexDirection:"column",marginBottom:1,borderStyle:"single",borderColor:Q,padding:1,children:[I0(k1,{bold:!0,color:Q,children:"实施方案"},void 0,!1,void 0,this),I0(L1,{marginTop:1,children:I0(J$,{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(L1,{flexDirection:"column",marginBottom:1,children:I0(J$,{content:$.details,role:"assistant",terminalWidth:Z},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.risks&&$.risks.length>0&&I0(L1,{flexDirection:"column",marginBottom:1,children:[I0(k1,{color:"red",bold:!0,children:"风险提示:"},void 0,!1,void 0,this),$.risks.map((X,G)=>I0(L1,{marginLeft:2,children:I0(k1,{color:"red",children:["• ",X]},void 0,!0,void 0,this)},G,!1,void 0,this))]},void 0,!0,void 0,this),$.affectedFiles&&$.affectedFiles.length>0&&I0(L1,{flexDirection:"column",marginBottom:1,children:[I0(k1,{color:"yellow",children:"影响的文件:"},void 0,!1,void 0,this),$.affectedFiles.slice(0,3).map((X,G)=>I0(L1,{marginLeft:2,children:I0(k1,{children:["• ",X]},void 0,!0,void 0,this)},G,!1,void 0,this)),$.affectedFiles.length>3&&I0(L1,{marginLeft:2,children:I0(k1,{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 NZ($,Q,Y,J){return`使用 ↑↓ 选择,回车确认 · ${Q||Y||J?"Y/N":$?"Y/S/N":"Y/S/P/N"} 快捷键 · Esc 取消`}var X9=MQ.memo(({details:$,onResponse:Q})=>{let{stdout:Y}=UZ(),J=Y.columns||80,X=e0()==="confirmation-prompt",G=v0(!1),q=$.type==="exitPlanMode",K=$.type==="enterPlanMode",U=$.type==="maxTurnsExceeded",F=$.type==="mcpSampling";qZ((z,B)=>{if(B.ctrl&&z==="c"||B.meta&&z==="c"){G();return}if(B.escape){Q({approved:!1,reason:"用户取消"});return}let _=z.toLowerCase();if(q){if(_==="y"){Q({approved:!0,targetMode:"autoEdit"});return}if(_==="s"){Q({approved:!0,targetMode:"default"});return}if(_==="n"){Q({approved:!1,reason:"方案需要改进"});return}}else if(K){if(_==="y"){Q({approved:!0});return}if(_==="n"){Q({approved:!1,reason:"用户拒绝进入 Plan 模式"});return}}else if(U){if(_==="y"){Q({approved:!0});return}if(_==="n"){Q({approved:!1,reason:"用户选择停止"});return}}else if(F){if(_==="y"){Q({approved:!0,scope:"once"});return}if(_==="n"){Q({approved:!1,reason:"用户拒绝 MCP Sampling"});return}}else{if(_==="y"){Q({approved:!0,scope:"once"});return}if(_==="s"){Q({approved:!0,scope:"session"});return}if(_==="p"){Q({approved:!0,scope:"project"});return}if(_==="n"){Q({approved:!1,reason:"用户拒绝"});return}}},{isActive:X});let O=Z9(()=>{if(q)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(K)return[{key:"approve",label:"[Y] 进入规划模式",value:{approved:!0}},{key:"reject",label:"[N] 直接执行",value:{approved:!1,reason:"用户拒绝进入 Plan 模式"}}];if(U)return[{key:"continue",label:"[Y] 继续执行",value:{approved:!0}},{key:"stop",label:"[N] 停止",value:{approved:!1,reason:"用户选择停止"}}];if(F)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:"用户拒绝"}}]},[q,K,U,F]),W=Z9(()=>{if(q)return{color:"cyan",title:"方案审核"};if(K)return{color:"magenta",title:"进入规划模式"};if(U)return{color:"yellow",title:"已达最大轮次"};return{color:"yellow",title:$.title||"操作确认"}},[q,K,U,$.title]);return I0(L1,{flexDirection:"column",borderStyle:"round",borderColor:X?W.color:"gray",padding:1,children:[I0(L1,{marginBottom:1,children:I0(k1,{bold:!0,color:W.color,children:W.title},void 0,!1,void 0,this)},void 0,!1,void 0,this),I0(_Z,{details:$,headerColor:W.color,isPlanModeExit:q,isPlanModeEnter:K,terminalWidth:J},void 0,!1,void 0,this),I0(L1,{flexDirection:"column",children:[I0(k1,{color:"gray",children:NZ(q,K,U,F)},void 0,!1,void 0,this),I0(OZ,{items:O,isFocused:X,itemComponent:zZ,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 L0,Text as K0,useInput as HZ}from"ink";import G9 from"ink-text-input";import{useState as p1}from"react";import{jsxDEV as c}from"react/jsx-dev-runtime";var _8=[{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"}],K2=[{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"}],q2=[{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"}],WZ=[`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"],K9=({workspaceRoot:$,sessionId:Q,onClose:Y,onSave:J})=>{let Z=r0.getTheme(),[X,G]=p1("action"),[q,K]=p1(0),[U,F]=p1(0),[O,W]=p1(0),[z,B]=p1(""),[_,H]=p1(""),[C,N]=p1(null),[v,M]=p1(!1),[w,k]=p1(null),P=_8[q],A=q2[U],T=K2[O],y=()=>{if(w){k(null);return}switch(X){case"action":Y();break;case"event":G("action");break;case"matcher":G("event");break;case"command":G("matcher");break;case"location":G("command");break;case"confirm":G("location");break}};HZ((S,b)=>{if(b.escape){y();return}if(X==="action"){if(b.upArrow)K((V)=>V>0?V-1:_8.length-1);else if(b.downArrow)K((V)=>V<_8.length-1?V+1:0);else if(b.return)L()}else if(X==="event"){if(b.upArrow)F((V)=>V>0?V-1:q2.length-1);else if(b.downArrow)F((V)=>V<q2.length-1?V+1:0);else if(b.return)G("matcher")}else if(X==="location"){if(b.upArrow)W((V)=>V>0?V-1:K2.length-1);else if(b.downArrow)W((V)=>V<K2.length-1?V+1:0);else if(b.return)G("confirm")}else if(X==="confirm"){if(b.return)R()}});let L=()=>{let S=_8[q].action;if(S==="add")G("event");else if(S==="status")f();else if(S==="list")l();else if(S==="enable")O1.getInstance().enableSession(Q,$),k("Hooks enabled for this session");else if(S==="disable")O1.getInstance().disableSession(Q,$),k("Hooks disabled for this session");else if(S==="trust")h();else if(S==="revoke")t()},f=async()=>{let S=O1.getInstance(),b=S.isEnabled($,Q),V=S.getConfig($),p=await S.getTrustStatus($),j={};for(let m of Object.values(IQ)){let X0=V[m];if(X0&&Array.isArray(X0)){let J0=X0.reduce((w0,k0)=>w0+(k0.hooks?.length||0),0);if(J0>0)j[m]=J0}}let E=[`Status: ${b?"Enabled":"Disabled"}`,`Trust: ${p.state}`,`Digest: ${p.currentDigest??"none"}`,""];if(Object.keys(j).length>0){E.push("Configured hooks:");for(let[m,X0]of Object.entries(j))E.push(` ${m}: ${X0} hook(s)`)}else E.push("No hooks configured");k(E.join(`
144
- `))},h=async()=>{try{let S=await O1.getInstance().trustProject($);k(`Trust: ${S.state}
145
- Digest: ${S.currentDigest??"none"}`)}catch(S){N(S instanceof Error?S.message:"Failed to trust hooks")}},t=async()=>{try{let S=await O1.getInstance().revokeProjectTrust($);k(`Trust: ${S.state}`)}catch(S){N(S instanceof Error?S.message:"Failed to revoke hook trust")}},l=()=>{let b=O1.getInstance().getConfig($),V=[],p=!1;for(let j of Object.values(IQ)){let E=b[j];if(!E||!Array.isArray(E)||E.length===0)continue;p=!0,V.push(`${j}:`);for(let m of E){let X0=m.matcher,J0="all";if(X0?.tools)J0=`tools: ${Array.isArray(X0.tools)?X0.tools.join(", "):X0.tools}`;V.push(` [${J0}]`);for(let w0 of m.hooks||[])if(w0.type==="command")V.push(` -> ${w0.command}`)}V.push("")}if(!p)V.push("No hooks configured"),V.push(""),V.push("Configure hooks in .blade/settings.local.json");k(V.join(`
146
- `))},a=()=>{G("command")},I=()=>{if(!_.trim()){N("Command cannot be empty");return}N(null),G("location")},R=async()=>{M(!0),N(null);try{let S=O1.getInstance(),b=await import("node:fs/promises"),V=await import("node:path"),p=await import("node:os"),j={matcher:z.trim()?{tools:z.trim()}:{},hooks:[{type:"command",command:_.trim()}]},E;switch(T.location){case"local":E=V.join($,".blade","settings.local.json");break;case"project":E=V.join($,".blade","settings.json");break;case"user":E=V.join(p.homedir(),".blade","settings.json");break}await b.mkdir(V.dirname(E),{recursive:!0});let m={};try{let k0=await b.readFile(E,"utf-8");m=JSON.parse(k0)}catch{}let X0=m.hooks||{},J0=X0[A.event]||[],w0={...X0,enabled:!0,[A.event]:[...J0,j]};if(m.hooks=w0,await b.writeFile(E,JSON.stringify(m,null,2),"utf-8"),await S.reloadConfig($),J)J({event:A.event,matcher:z.trim(),command:_.trim()});Y()}catch(S){N(`Failed to save hook: ${S instanceof Error?S.message:"Unknown error"}`),M(!1)}};return c(L0,{flexDirection:"column",padding:1,children:[c(L0,{marginBottom:1,children:c(K0,{bold:!0,color:Z.colors.success,children:"Hooks Manager"},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(L0,{marginBottom:1,children:c(K0,{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(L0,{flexDirection:"column",marginBottom:1,children:[c(K0,{children:w},void 0,!1,void 0,this),c(L0,{marginTop:1,children:c(K0,{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(L0,{flexDirection:"column",children:[c(L0,{flexDirection:"column",marginTop:1,children:_8.map((S,b)=>c(L0,{children:[c(K0,{color:b===q?Z.colors.primary:void 0,bold:b===q,children:[b===q?"> ":" ",S.action]},void 0,!0,void 0,this),c(K0,{color:Z.colors.muted,children:[" - ",S.description]},void 0,!0,void 0,this)]},S.action,!0,void 0,this))},void 0,!1,void 0,this),c(L0,{marginTop:1,children:c(K0,{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(L0,{flexDirection:"column",children:[c(K0,{bold:!0,children:"Select Event:"},void 0,!1,void 0,this),c(L0,{flexDirection:"column",marginTop:1,children:q2.map((S,b)=>c(L0,{children:[c(K0,{color:b===U?Z.colors.primary:void 0,bold:b===U,children:[b===U?"> ":" ",S.event]},void 0,!0,void 0,this),c(K0,{color:Z.colors.muted,children:[" - ",S.description]},void 0,!0,void 0,this)]},S.event,!0,void 0,this))},void 0,!1,void 0,this),c(L0,{marginTop:1,children:c(K0,{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(L0,{marginBottom:1,children:c(K0,{children:["Event:"," ",c(K0,{bold:!0,color:Z.colors.primary,children:A.event},void 0,!1,void 0,this),c(K0,{color:Z.colors.muted,children:[" - ",A.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(L0,{flexDirection:"column",marginBottom:1,children:[c(K0,{color:Z.colors.muted,children:"Input to command is JSON of tool call arguments."},void 0,!1,void 0,this),c(K0,{color:Z.colors.muted,children:"Exit code 0 - stdout/stderr not shown"},void 0,!1,void 0,this),c(K0,{color:Z.colors.muted,children:"Exit code 2 - show stderr to model and block tool call"},void 0,!1,void 0,this),c(K0,{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(L0,{flexDirection:"column",children:[c(L0,{children:[c(K0,{bold:!0,children:"Matcher: "},void 0,!1,void 0,this),c(G9,{value:z,onChange:B,onSubmit:a,placeholder:"e.g., Read, Bash, Edit|Write (empty = all tools)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(L0,{marginTop:1,children:c(K0,{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(L0,{marginTop:1,children:c(K0,{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(L0,{marginBottom:1,children:c(K0,{children:["Matcher: ",c(K0,{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(L0,{flexDirection:"column",children:[c(L0,{children:c(K0,{bold:!0,children:"Command: "},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(L0,{borderStyle:"single",borderColor:Z.colors.border.light,paddingX:1,marginTop:1,children:c(G9,{value:_,onChange:H,onSubmit:I,placeholder:"Enter shell command..."},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(L0,{flexDirection:"column",marginTop:1,children:[c(K0,{bold:!0,children:"Examples:"},void 0,!1,void 0,this),WZ.map((S,b)=>c(K0,{color:Z.colors.muted,children:["• ",S]},b,!0,void 0,this))]},void 0,!0,void 0,this),c(L0,{marginTop:1,children:c(K0,{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(L0,{flexDirection:"column",children:[c(L0,{flexDirection:"column",borderStyle:"round",borderColor:Z.colors.border.light,paddingX:2,paddingY:1,marginBottom:1,children:[c(K0,{bold:!0,color:Z.colors.primary,children:"Save hook configuration"},void 0,!1,void 0,this),c(K0,{children:" "},void 0,!1,void 0,this),c(K0,{children:[" ","Event: ",A.event," - ",A.description]},void 0,!0,void 0,this),c(K0,{children:[" Matcher: ",z||"(all)"]},void 0,!0,void 0,this),c(K0,{children:[" Command: ",_]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),c(K0,{bold:!0,children:"Where should this hook be saved?"},void 0,!1,void 0,this),c(L0,{flexDirection:"column",marginTop:1,children:K2.map((S,b)=>c(L0,{children:[c(K0,{color:b===O?Z.colors.primary:void 0,bold:b===O,children:[b===O?"> ":" ",b+1,". ",S.name]},void 0,!0,void 0,this),c(K0,{color:Z.colors.muted,children:[" ",S.description]},void 0,!0,void 0,this)]},S.location,!0,void 0,this))},void 0,!1,void 0,this),c(L0,{marginTop:1,children:c(K0,{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(L0,{flexDirection:"column",children:[c(L0,{flexDirection:"column",borderStyle:"round",borderColor:Z.colors.success,paddingX:2,paddingY:1,children:[c(K0,{bold:!0,children:["Saving hook to ",T.description,"..."]},void 0,!0,void 0,this),c(K0,{children:" "},void 0,!1,void 0,this),c(K0,{children:["Event: ",A.event]},void 0,!0,void 0,this),c(K0,{children:["Matcher: ",z||"(all tools)"]},void 0,!0,void 0,this),c(K0,{children:["Command: ",_]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),c(L0,{marginTop:1,children:c(K0,{color:Z.colors.muted,children:v?"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),C&&c(L0,{marginTop:1,children:c(K0,{color:Z.colors.error,children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as M9}from"ahooks";import{Box as DZ,Text as VZ}from"ink";import jZ from"react";import{useMemoizedFn as O2}from"ahooks";import b$ from"chalk";import{Text as TZ,useInput as kZ}from"ink";import{useEffect as P9,useRef as z2}from"react";var U2={TIMEOUT_MS:100,RAPID_INPUT_THRESHOLD_MS:150,LARGE_INPUT_THRESHOLD:300,MEDIUM_SIZE_MULTI_CHUNK_THRESHOLD:200};var w$="\x1B",LZ=`${w$}[200~`,BZ=`${w$}[201~`,wZ="[200~",bZ="[201~",AZ=[`${w$}[I`,`${w$}[O`,"[I","[O"],O9=`${w$}[?2004h`,z9=`${w$}[?2004l`,kQ=`${w$}[?1004l`,PZ=[LZ,wZ],RZ=[BZ,bZ];function _9(){return{pasteBuffer:null,pasteOverflowed:!1}}function q9($,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 U9($){return AZ.some((Q)=>$===Q)}function N9($,Q){let Y=Q,J=$.pasteBuffer,Z=$.pasteOverflowed,X=J!==null,G=[];while(Y.length>0){if(J!==null){let U=q9(Y,RZ);if(!U){if(J.length+Y.length>TQ)J="",Z=!0;else if(!Z)J+=Y;Y="";break}if(J.length+U.index>TQ)Z=!0;else if(!Z)J+=Y.slice(0,U.index),G.push({kind:"paste",text:J});J=null,Z=!1,X=!0,Y=Y.slice(U.index+U.marker.length);continue}let q=q9(Y,PZ);if(!q){if(U9(Y))X=!0;else G.push({kind:"text",text:Y});Y="";break}let K=Y.slice(0,q.index);if(K&&!U9(K))G.push({kind:"text",text:K});J="",Z=!1,X=!0,Y=Y.slice(q.index+q.marker.length)}if(Q.length===0&&J!==null)X=!0;return{handled:X,state:{pasteBuffer:J,pasteOverflowed:Z},segments:G}}import{execSync as r$}from"node:child_process";import{existsSync as yZ,readFileSync as fQ}from"node:fs";import{basename as F9,isAbsolute as MZ}from"node:path";function H9($){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 W9(){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 CZ(){let{commands:$}=W9();try{return r$($.getPath,{encoding:"utf-8"}).trim()}catch(Q){return console.error("Failed to get clipboard path:",Q),null}}function L9($){if($.startsWith('"')&&$.endsWith('"')||$.startsWith("'")&&$.endsWith("'"))return $.slice(1,-1);return $}function B9($){if(process.platform==="win32")return $;let Q="__DOUBLE_BACKSLASH__";return $.replace(/\\\\/g,Q).replace(/\\(.)/g,"$1").replace(new RegExp(Q,"g"),"\\")}function vQ($){let Q=L9($.trim()),Y=B9(Q);return/\.(png|jpe?g|gif|webp)$/i.test(Y)}function IZ($){let Q=L9($.trim()),Y=B9(Q);if(vQ(Y))return Y;return null}async function w9($){let Q=IZ($);if(!Q)return null;let Y;try{if(MZ(Q))Y=fQ(Q);else{let G=CZ();if(G&&Q===F9(G))Y=fQ(G);else return null}}catch(G){return console.error("Failed to read image file:",G),null}let J=Y.toString("base64"),Z=H9(J),X=F9(Q);return{path:Q,base64:J,mediaType:Z,filename:X}}async function b9(){let $=process.platform,Q={darwin:"pbpaste",linux:"xclip -selection clipboard -o || wl-paste",win32:'powershell -Command "Get-Clipboard"'},Y=Q[$]||Q.linux;try{return r$(Y,{encoding:"utf-8"})||null}catch{return null}}async function A9(){let{commands:$,screenshotPath:Q}=W9();try{if(r$($.checkImage,{stdio:"ignore"}),r$($.saveImage(Q),{stdio:"ignore"}),!yZ(Q))return null;let J=fQ(Q).toString("base64"),Z=H9(J);return r$($.deleteFile(Q),{stdio:"ignore"}),{base64:J,mediaType:Z}}catch(Y){try{r$($.deleteFile(Q),{stdio:"ignore"})}catch{}return null}}import{jsxDEV as SZ}from"react/jsx-dev-runtime";var fZ=/\r\n/g,vZ=/\r/g;function SQ($){if(!$.includes("\r"))return $;return $.replace(fZ,`
147
- `).replace(vZ,`
148
- `)}function R9($,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 y9({value:$,placeholder:Q="",focus:Y=!0,onChange:J,cursorPosition:Z,onChangeCursorPosition:X,onPaste:G,onImagePaste:q,disabledKeys:K=[]}){let U=z2(_9()),F=z2($),O=z2(Z),W=z2(null);P9(()=>{F.current=$,O.current=Z},[$,Z]),P9(()=>{if(Z>$.length)X($.length)},[$,Z,X]);let z=O2((M,w)=>{let k=F.current,P=O.current;if(F.current=M,O.current=w,M!==k)J(M);if(w!==P)X(w)}),B=O2((M)=>{if(!M)return;let{newValue:w,newCursorPosition:k}=R9(SQ(M),F.current,O.current);z(w,k)}),_=O2(async(M)=>{let w=SQ(M);if(!w)return;if(q&&vQ(w))try{let P=await w9(w);if(P){let A=await q(P.base64,P.mediaType,P.filename);if(A?.prompt)B(A.prompt);return}}catch(P){console.error("Failed to process image path:",P)}if((w.length>U2.LARGE_INPUT_THRESHOLD||w.includes(`
149
- `))&&G){let P=await G(w);if(P?.prompt){B(P.prompt);return}}B(w)}),H=O2((M)=>{let w=W.current;if(!w){try{let P=M();if(!P)return;let A=P.catch(()=>{return});W.current=A,A.finally(()=>{if(W.current===A)W.current=null})}catch{}return}let k=w.then(M).then(()=>{return}).catch(()=>{return});W.current=k,k.finally(()=>{if(W.current===k)W.current=null})});kZ((M,w)=>{H(()=>{let k=SQ(M),P=N9(U.current,k);if(U.current=P.state,P.handled)return(async()=>{for(let h of P.segments)if(h.kind==="paste")await _(h.text);else B(h.text)})();if(K.some((h)=>w[h])||w.ctrl&&M==="c"||w.ctrl&&M==="l"||w.ctrl&&M==="t"||w.ctrl&&M==="o"||w.meta&&M==="l"||w.meta&&M==="t"||w.meta&&M==="o"||w.shift&&w.tab||k==="?"&&F.current==="")return;let T=F.current,y=O.current,L=y,f=T;if(w.leftArrow)L--;else if(w.rightArrow)L++;else if(w.backspace||w.delete){if(M===""){if(y>0)f=T.slice(0,y-1)+T.slice(y,T.length),L--}else if(y<T.length)f=T.slice(0,y)+T.slice(y+1,T.length)}else if(w.ctrl&&k==="a")L=0;else if(w.ctrl&&k==="e")L=T.length;else if(w.ctrl&&k==="k")f=T.slice(0,y);else if(w.ctrl&&k==="u")f=T.slice(y),L=0;else if(w.ctrl&&k==="w"){let t=T.slice(0,y).match(/\s*\S+\s*$/);if(t){let l=t[0].length;f=T.slice(0,y-l)+T.slice(y),L-=l}}else if(w.ctrl&&k==="v"){let h=process.platform==="darwin";return(async()=>{if(q){let l=await A9();if(l){let a=await q(l.base64,l.mediaType,"clipboard.png");if(a?.prompt)B(a.prompt);return}}if(h)return;let t=await b9();if(t)await _(t)})()}else if(w.pageUp)L=0;else if(w.pageDown)L=T.length;else if(k===`
150
- `&&(w.shift||w.meta)){let{newValue:h,newCursorPosition:t}=R9(k,T,y);z(h,t);return}else if(!w.ctrl&&!w.meta){if(G&&(k.length>U2.LARGE_INPUT_THRESHOLD||k.includes(`
151
- `)))return _(k);f=T.slice(0,y)+k+T.slice(y,T.length),L+=k.length}if(L<0)L=0;if(L>f.length)L=f.length;z(f,L)})},{isActive:Y});let C=Y,N=$,v=Q?b$.grey(Q):void 0;if(C)if(v=Q.length>0?b$.inverse(Q[0])+b$.grey(Q.slice(1)):b$.inverse(" "),$.length===0)N=b$.inverse(" ");else{N="";for(let M=0;M<$.length;M++)if(M===Z&&Z<$.length)N+=b$.inverse($[M]);else N+=$[M];if(Z>=$.length)N+=b$.inverse(" ")}return SZ(TZ,{children:Q?$.length>0?N:v:N},void 0,!1,void 0,this)}import{jsxDEV as DQ}from"react/jsx-dev-runtime";var C9=jZ.memo(({input:$,cursorPosition:Q,onChange:Y,onChangeCursorPosition:J,onAddPasteMapping:Z,onAddImagePasteMapping:X})=>{let q=e0()==="main-input",K=$.trimStart().startsWith("!"),U=M9((O)=>{let W=O.split(`
152
- `).length,z=O.length,B=500,_=10;if(z>500||W>10){let H=Z(O),C=O.slice(0,30).replace(/\n/g," "),N=`${z} chars, ${W} lines: ${C}...`;return{prompt:`${i8(H)}${N}${l2()}`}}return{}}),F=M9(async(O,W,z)=>{try{let B=X(O,W);return{prompt:`${i8(B)}[Image #${B}]${l2()}`}}catch(B){return console.error("[Image Paste] Failed to process image:",B),{prompt:`[Image paste failed: ${B instanceof Error?B.message:"Unknown error"}] `}}});return DQ(DZ,{flexDirection:"row",width:"100%",paddingX:2,paddingY:0,flexShrink:0,flexGrow:0,overflow:"hidden",borderStyle:"round",borderColor:K?"yellow":"gray",children:[DQ(VZ,{color:K?"yellow":"blue",bold:!0,children:K?"$ ":"> "},void 0,!1,void 0,this),DQ(y9,{value:$,cursorPosition:Q,onChange:Y,onChangeCursorPosition:J,onPaste:U,onImagePaste:F,placeholder:" 输入命令...",focus:q,disabledKeys:["upArrow","downArrow","tab","return","escape"]},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as _2,Text as y1}from"ink";import pZ,{useEffect as cZ,useState as xZ}from"react";import{useEffect as mZ,useState as f9}from"react";import{useEffect as hZ,useState as EZ}from"react";var gZ=15000,I9=["思考中","构思中","推理中","琢磨中","分析中","斟酌中","酝酿中","推敲中","揣摩中","审视中","处理中","编排中","打磨中","编织中","拼装中","调配中","组装中","搭建中","铸造中","雕琢中","搜寻中","梳理中","排查中","勘探中","钻研中","翻阅中","遍历中","扫描中","检索中","追踪中","计算中","编译中","解析中","运算中","推演中","迭代中","收敛中","演绎中","归纳中","求解中","生成中","编写中","起草中","绘制中","勾勒中","渲染中","合成中","调和中","编曲中","烹制中","施工中","酿造中","发酵中","煎熬中","折腾中","捣鼓中","鼓捣中","腾挪中","筹备中","蓄力中"],T9=["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 k9($,Q,Y=!1){let[J,Z]=EZ("");return hZ(()=>{if(Q){Z("等待用户确认...");return}if(!$){Z("");return}if(Y)return;let X=()=>{if(Math.random()<0.25){let U=Math.floor(Math.random()*T9.length);return T9[U]}let K=Math.floor(Math.random()*I9.length);return I9[K]};Z(X());let G=setInterval(()=>{Z(X())},gZ);return()=>{clearInterval(G)}},[$,Q,Y]),J}function v9($,Q=!1,Y=!1){let[J,Z]=f9(0),[X,G]=f9(null),q=k9($,Q,Y);return mZ(()=>{if(!$){Z(0),G(null);return}if(Y)return;if(X===null)G(Date.now());let K=setInterval(()=>{if(X!==null){let U=Math.floor((Date.now()-X)/1000);Z(U)}},1000);return()=>{clearInterval(K)}},[$,X,Y]),{currentPhrase:q,elapsedTime:J}}import{jsxDEV as Q1,Fragment as lZ}from"react/jsx-dev-runtime";var VQ=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"],uZ=80;function jQ($){if($<60)return`${$}s`;let Q=Math.floor($/60),Y=$%60;return`${Q}m ${Y}s`}var S9=pZ.memo(({message:$,paused:Q=!1})=>{let Y=s1(),J=y8(),Z=X4(),X=G4(),G=K4(),q=Y||!J,[K,U]=xZ(0),F=A0(),W=g$()>=uZ,{currentPhrase:z,elapsedTime:B}=v9(q,!1,Q);if(cZ(()=>{if(!q||Q){U(0);return}let v=setInterval(()=>{U((M)=>(M+1)%VQ.length)},150);return()=>clearInterval(v)},[q,Q]),!q)return null;let _=Z?.mode==="bounded_foreground"?`Provider 暂时不可用,正在有界恢复 (${Z.attempt}/${Z.maxRetries}),剩余约 ${jQ(Math.max(0,Math.ceil((Z.recoveryRemainingMs??0)/1000)))}`:Z?.phase==="scheduled"?`Provider 暂时不可用,${Z.attempt}/${Z.maxRetries} 次重试将在 ${Math.max(0,Math.ceil((Z.delayMs??0)/1000))}s 后开始`:Z?.phase==="attempt"?`正在重试 Provider (${Z.attempt}/${Z.maxRetries})`:null,H=X?X.outputStarted?`Provider 流已暂停 ${Math.ceil(X.durationMs/1000)}s,仍在等待(空闲超时上限 ${Math.ceil(X.timeoutMs/1000)}s)`:`Provider 尚未返回流数据,已等待 ${Math.ceil(X.durationMs/1000)}s(空闲超时上限 ${Math.ceil(X.timeoutMs/1000)}s)`:null,N=(G?.phase==="detected"?`检测到 ${G.toolName} 连续 ${G.runLength} 次无进展,正在要求 Agent 切换策略`:G?.phase==="halted"?`已停止 ${G.toolName} 空转循环`:null)||H||_||$||z||"正在思考中...";if(W)return Q1(_2,{paddingX:2,paddingBottom:1,flexDirection:"row",gap:1,children:[Q1(y1,{color:F.colors.warning,bold:!0,children:VQ[K]},void 0,!1,void 0,this),Q1(y1,{color:F.colors.text.primary,children:N},void 0,!1,void 0,this),B>0&&Q1(lZ,{children:[Q1(y1,{color:F.colors.muted,children:"|"},void 0,!1,void 0,this),Q1(y1,{color:F.colors.info,children:["已用时: ",jQ(B)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Q1(y1,{color:F.colors.muted,children:"|"},void 0,!1,void 0,this),Q1(y1,{color:F.colors.secondary,children:"Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return Q1(_2,{paddingX:2,paddingBottom:1,flexDirection:"column",children:[Q1(_2,{flexDirection:"row",gap:1,children:[Q1(y1,{color:F.colors.warning,bold:!0,children:VQ[K]},void 0,!1,void 0,this),Q1(y1,{color:F.colors.text.primary,children:N},void 0,!1,void 0,this)]},void 0,!0,void 0,this),B>0&&Q1(_2,{marginLeft:2,flexDirection:"row",gap:1,children:[Q1(y1,{color:F.colors.info,children:["已用时: ",jQ(B)]},void 0,!0,void 0,this),Q1(y1,{color:F.colors.muted,children:"|"},void 0,!1,void 0,this),Q1(y1,{color:F.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 H2,Text as D0,useInput as dZ,useStdout as rZ}from"ink";import aZ from"ink-text-input";import iZ,{useCallback as N2,useEffect as oZ,useMemo as nZ,useState as A$}from"react";import{jsxDEV as F0}from"react/jsx-dev-runtime";var h9=iZ.memo(({details:$,onComplete:Q})=>{let{stdout:Y}=rZ(),J=Y.columns||80,Z=e0()==="confirmation-prompt",X=v0(!1),G=$.fields??[],[q,K]=A$("field"),[U,F]=A$(0),[O,W]=A$(()=>D9($)),[z,B]=A$(""),[_,H]=A$(0),[C,N]=A$([]),[v,M]=A$(),w=G[U],k=nZ(()=>tZ(w),[w]);oZ(()=>{if(!w)return;let L=O[w.name];B(typeof L==="string"||typeof L==="number"?String(L):""),N(Array.isArray(L)?[...L]:[]);let f=k.findIndex((h)=>h.value===String(L));H(f>=0?f:0),M(void 0)},[O,w,k]);let P=N2((L)=>{if(W(L),U<G.length-1){F((f)=>f+1);return}K("review")},[U,G.length]),A=N2((L)=>{if(!w)return;let f={...O};if(L===void 0)delete f[w.name];else f[w.name]=L;P(f)},[O,w,P]),T=N2((L)=>{if(!w)return;try{A(V9(w,L))}catch(f){M(f instanceof Error?f.message:String(f))}},[w,A]),y=N2(()=>{try{let L=j9($,{action:"accept",content:O});Q({action:L.action,...L.content?{content:L.content}:{}})}catch(L){M(L instanceof Error?L.message:String(L))}},[O,$,Q]);if(dZ((L,f)=>{if(f.ctrl&&L==="c"||f.meta&&L==="c"){X();return}if(f.escape){Q({action:"cancel"});return}if($.mode==="url"){if(L.toLowerCase()==="y")Q({action:"accept"},!0);else if(L.toLowerCase()==="n")Q({action:"decline"});return}if(q==="review"){if(L.toLowerCase()==="y"||f.return)y();else if(L.toLowerCase()==="e")F(0),K("field");else if(L.toLowerCase()==="d")Q({action:"decline"});return}if(!w){if(f.return)y();return}if(hQ(w))return;if(L.toLowerCase()==="d"){Q({action:"decline"});return}if(f.upArrow){H((h)=>h>0?h-1:Math.max(k.length-1,0));return}if(f.downArrow||f.tab){H((h)=>h<k.length-1?h+1:0);return}if(L===" "&&w.type==="multi-select"){let h=k[_];if(h)N((t)=>t.includes(h.value)?t.filter((l)=>l!==h.value):[...t,h.value]);return}if(f.return)if(w.type==="multi-select")A(C);else{let h=k[_];if(h)A(h.typedValue)}},{isActive:Z}),$.mode==="url")return F0(F2,{width:J,color:"yellow",children:[F0(D0,{bold:!0,color:"yellow",children:"MCP external authorization"},void 0,!1,void 0,this),F0(D0,{children:$.message},void 0,!1,void 0,this),F0(D0,{color:"yellow",children:['Only continue if you trust MCP server "',$.serverName,'".']},void 0,!0,void 0,this),F0(D0,{children:["Domain: ",F0(D0,{color:"cyan",children:$.domain},void 0,!1,void 0,this)]},void 0,!0,void 0,this),F0(D0,{wrap:"wrap",children:["URL: ",F0(D0,{color:"cyan",children:$.url},void 0,!1,void 0,this)]},void 0,!0,void 0,this),F0(D0,{color:"gray",children:"[Y] Open URL · [N] Decline · Esc Cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(q==="review")return F0(F2,{width:J,color:"green",children:[F0(D0,{bold:!0,color:"green",children:"Review MCP form response"},void 0,!1,void 0,this),F0(D0,{children:$.message},void 0,!1,void 0,this),G.map((L)=>F0(D0,{children:[L.title,": ",eZ(O[L.name])]},L.name,!0,void 0,this)),v&&F0(D0,{color:"red",children:v},void 0,!1,void 0,this),F0(D0,{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 F0(F2,{width:J,color:"cyan",children:[F0(D0,{children:$.message},void 0,!1,void 0,this),F0(D0,{color:"gray",children:"This form has no fields."},void 0,!1,void 0,this),F0(D0,{color:"gray",children:"Press Enter to submit · [D] Decline · Esc Cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return F0(F2,{width:J,color:"cyan",children:[F0(D0,{bold:!0,color:"cyan",children:["MCP input requested by ",$.serverName]},void 0,!0,void 0,this),F0(D0,{children:$.message},void 0,!1,void 0,this),F0(H2,{flexDirection:"column",marginTop:1,children:[F0(D0,{bold:!0,children:[w.title,w.required?" *":""]},void 0,!0,void 0,this),w.description&&F0(D0,{color:"gray",children:w.description},void 0,!1,void 0,this),F0(D0,{color:"gray",children:sZ(w)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),hQ(w)?F0(H2,{children:[F0(D0,{color:"cyan",children:"> "},void 0,!1,void 0,this),F0(aZ,{value:z,onChange:B,onSubmit:T,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):F0(H2,{flexDirection:"column",children:k.map((L,f)=>{let h=w.type==="multi-select"&&C.includes(L.value);return F0(D0,{color:_===f?"yellow":void 0,children:[_===f?"> ":" ",w.type==="multi-select"?h?"(*) ":"( ) ":"",L.label]},L.value,!0,void 0,this)})},void 0,!1,void 0,this),v&&F0(D0,{color:"red",children:v},void 0,!1,void 0,this),F0(D0,{color:"gray",children:[hQ(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),F0(D0,{color:"gray",children:["Field ",U+1," of ",G.length]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});function F2({children:$,width:Q,color:Y}){return F0(H2,{flexDirection:"column",gap:1,borderStyle:"round",borderColor:Y,padding:1,width:Math.min(Q-4,88),children:$},void 0,!1,void 0,this)}function hQ($){return $.type==="string"||$.type==="number"||$.type==="integer"}function tZ($){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 sZ($){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 eZ($){if($===void 0)return"(omitted)";if(Array.isArray($))return $.join(", ")||"(none)";return String($)}import w2 from"ansi-escapes";import{Box as Z$,Static as F5,useStdout as H5}from"ink";import W5,{useEffect as u1,useMemo as uQ,useRef as X$,useState as lQ}from"react";import{useStdout as $5}from"ink";import{debounce as Q5}from"lodash-es";import{useEffect as J5,useState as Y5}from"react";function E9($=200){let{stdout:Q}=$5(),[Y,J]=Y5(Q.rows||24);return J5(()=>{let Z=Q5(()=>{J(Q.rows||24)},$);return Z(),Q.on("resize",Z),()=>{Q.off("resize",Z),Z.cancel()}},[Q,$]),Y}import P$ from"chalk";import Z5 from"string-width";var N0={active:!1,renderedLineCount:0,lastRenderedLines:[],terminalWidth:process.stdout.columns||80,terminalHeight:process.stdout.rows||24,prefixIndent:4,isFirstRender:!0},L2="\x1B",EQ=`${L2}[2K`,W2=($)=>$>0?`${L2}[${$}A`:"",g9=`${L2}[?25l`,m9=`${L2}[?25h`;function p9($,Q){N0.active=!0,N0.renderedLineCount=0,N0.lastRenderedLines=[],N0.terminalWidth=$,N0.terminalHeight=Q,N0.isFirstRender=!0}function c9($,Q){N0.terminalWidth=$,N0.terminalHeight=Q}function x9($,Q,Y,J){if(!N0.active)return;let Z=8,X=Math.max(1,N0.terminalHeight-Z),G=[],q=r0.getTheme(),K=" ".repeat(N0.prefixIndent),U=P$.dim.hex(q.colors.border.light);if(Q>0)G.push(`${K}${P$.dim.hex(q.colors.text.muted)(`^ ${Q} lines above (streaming...)`)}`);let F=Y==="code",O=Y==="diff",W="",z=$;if(F&&$.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(F&&Q===0){let H=W?` ${P$.hex(q.colors.text.secondary)(W)}`:"";G.push(`${K}${U("╭─")}${H}`)}for(let H=0;H<B.length;H++){let C=B[H],N=K;if(H===0&&!J&&N0.isFirstRender&&!F&&!O)N=P$.bold.hex(q.colors.success)("• ")+" ",N0.isFirstRender=!1;let v=F?4:0,M=N0.terminalWidth-N0.prefixIndent-2-v,w=C;if(Z5(C)>M)w=C.slice(0,M);if(F)G.push(`${K}${U("│")} ${w}`);else if(O){let k=w;if(k.startsWith("+"))G.push(`${N}${P$.green(w)}`);else if(k.startsWith("-"))G.push(`${N}${P$.red(w)}`);else if(k.startsWith("@@"))G.push(`${N}${P$.dim(w)}`);else G.push(`${N}${w}`)}else G.push(`${N}${w}`);if(H===0&&!J&&N0.isFirstRender)N0.isFirstRender=!1}let _=[];if(_.push(g9),N0.renderedLineCount>0)_.push(W2(N0.renderedLineCount)),_.push("\r");for(let H=0;H<G.length;H++){let C=G[H],N=N0.lastRenderedLines[H];if(C!==N)_.push(EQ),_.push(C);if(H<G.length-1)_.push(`
141
+ `),K=q.includes("<<<DIFF>>>"),U=q.includes("```");if(K){let W=q.match(/<<<DIFF>>>\s*({[\s\S]*?})\s*<<<\/DIFF>>>/);if(W)try{let O=JSON.parse(W[1]);return g(O0,{flexDirection:"column",children:[g(wQ,{patch:O.patch,startLine:O.startLine,matchLine:O.matchLine,terminalWidth:Q},void 0,!1,void 0,this),X&&g(O0,{marginTop:1,children:g(b0,{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(U){let W=q.match(/```(\w+)?\s*\n([\s\S]*?)\n```/);if(W){let O=W[1]||"text",H=W[2];return g(O0,{flexDirection:"column",children:[g(K2,{content:H,language:O,showLineNumbers:!1,terminalWidth:Q},void 0,!1,void 0,this),X&&g(O0,{marginTop:1,children:g(b0,{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(O0,{flexDirection:"column",children:[G.map((W,O)=>g(b0,{color:Y.colors.text.primary,children:W},O,!1,void 0,this)),X&&g(O0,{marginTop:1,children:g(b0,{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 UZ($,Q,Y,J=80){if(!Y||Q===void 0||Q<=0)return{content:$,isTruncated:!1,hiddenLines:0};let X=Math.max(1,Q-8),G=Math.max(40,J*0.8),q=X*G;if($.length<=q)return{content:$,isTruncated:!1,hiddenLines:0};let K=Math.floor(q*0.9),U=$.length-K,W=U,O=$.indexOf(`
142
+ `,U);if(O!==-1&&O-U<G)W=O+1;let H=$.slice(W),w=($.slice(0,W).match(/\n/g)||[]).length+1;return{content:H,isTruncated:!0,hiddenLines:w}}var J$=B$.memo(({content:$,role:Q,terminalWidth:Y,metadata:J,isPending:Z=!1,availableTerminalHeight:X,hidePrefix:G=!1,noMargin:q=!1,renderPlainTextOnly:K=!1,streamingLines:U,streamingHiddenLines:W,messageId:O,blocksOverride:H,currentLineOverride:z,streamingMode:w="text",renderCodeBlocksAsPlainText:_=!1})=>{let F=A0(),C=H!==void 0,N=L$(()=>JZ(Q,F.colors,J),[Q,F.colors,J]),{color:S,prefix:M}=N,B=M.length+1,k=L$(()=>{if(!J||typeof J!=="object")return null;if(!("subtaskRef"in J))return null;let b=J.subtaskRef;if(!b||typeof b!=="object")return null;return b},[J]),P=Q==="tool"&&J?.phase==="start",A=!q&&!P,T=L$(()=>{if(!K)return[];return $.split(/\r?\n/)},[$,K]);if(!C&&Z){let b=U??$.split(/\r?\n/),V=W??0,p=!1,j=!1,E=!1;if(w!=="text")p=w==="code",j=w==="diff",E=w==="table";return g(O0,{flexDirection:"column",marginBottom:A?1:0,flexShrink:0,children:[V>0&&g(O0,{flexDirection:"row",flexShrink:0,children:[g(O0,{width:B,flexShrink:0},void 0,!1,void 0,this),g(b0,{color:F.colors.text.muted,dimColor:!0,children:["^ ",V," lines above (streaming...)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),b.map((m,X0)=>{if(w==="text"){if(m.match(Q$.codeBlock))p=!p;else if(m.match(Q$.diffStart))j=!0;else if(m.match(Q$.diffEnd))j=!1;else if(m.match(Q$.table))E=!0;else if(E&&!m.match(Q$.table))E=!1}let J0=w==="text"&&!p&&!j&&!E,w0=J0?m.match(Q$.ulItem):null,k0=J0?m.match(Q$.olItem):null,c0=w0??k0;return g(O0,{flexDirection:"row",flexShrink:0,children:[X0===0&&!G?g(O0,{marginRight:1,flexShrink:0,children:g(b0,{color:S,bold:!0,children:M},void 0,!1,void 0,this)},void 0,!1,void 0,this):g(O0,{width:B,flexShrink:0},void 0,!1,void 0,this),g(O0,{flexGrow:1,flexShrink:0,children:c0?g(AQ,{type:w0?"ul":"ol",marker:c0[2],itemText:c0[3],leadingWhitespace:c0[1]},void 0,!1,void 0,this):g(b0,{wrap:"wrap",children:m===""?" ":m},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},X0,!0,void 0,this)})]},void 0,!0,void 0,this)}if(!C&&K)return g(O0,{flexDirection:"column",marginBottom:A?1:0,flexShrink:0,children:T.map((b,V)=>g(O0,{flexDirection:"row",flexShrink:0,children:[V===0&&!G?g(O0,{marginRight:1,flexShrink:0,children:g(b0,{color:S,bold:!0,children:M},void 0,!1,void 0,this)},void 0,!1,void 0,this):g(O0,{width:B,flexShrink:0},void 0,!1,void 0,this),g(O0,{flexGrow:1,flexShrink:0,children:g(b0,{wrap:"wrap",children:b===""?" ":b},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},V,!0,void 0,this))},void 0,!1,void 0,this);let y=Y9(null);yQ(()=>{y.current=null},[O]);let L=L$(()=>{if(C)return null;if(!O)return null;return Z9(O)},[O,C]);yQ(()=>{if(C)return;if(!L||!O)return;y.current={messageId:O,blocks:L}},[L,O,C]),yQ(()=>{if(C)return;if(!L||!O)return;X9(O)},[L,O,C]);let f=L$(()=>C?{content:$,isTruncated:!1,hiddenLines:0}:UZ($,X,Z,Y),[$,X,Z,Y,C]),{content:h,isTruncated:s,hiddenLines:l}=f;if(!C&&Q==="tool"&&J&&"detail"in J){let b=J;if(b.detail)return g(O0,{flexDirection:"column",marginBottom:q?0:1,children:[g(O0,{flexDirection:"row",children:[g(O0,{marginRight:1,children:g(b0,{color:S,bold:!0,children:M},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(b0,{color:S,children:$},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g(O0,{marginLeft:M.length+1,children:g(qZ,{detail:b.detail,terminalWidth:Y-(M.length+1)},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}let{completedContent:a,currentLine:I}=L$(()=>{if(C)return{completedContent:"",currentLine:z??""};if(!Z)return{completedContent:h,currentLine:""};let b=h.lastIndexOf(`
143
+ `);if(b===-1)return{completedContent:"",currentLine:h};return{completedContent:h.slice(0,b+1),currentLine:h.slice(b+1)}},[h,Z,C,z]),R=Y9({content:"",blocks:[]}),v=L$(()=>{if(C)return H??[];if(L)return L;if(y.current&&y.current.messageId===O)return y.current.blocks;let b=R.current;if(!Z||!a.startsWith(b.content)){let E=MQ(a);return R.current={content:a,blocks:E},E}if(a===b.content)return b.blocks;let V=a.slice(b.content.length),p=MQ(V),j=[...b.blocks,...p];return R.current={content:a,blocks:j},j},[a,Z,C,H]);return g(O0,{flexDirection:"column",marginBottom:A?1:0,flexShrink:0,children:[s&&g(O0,{flexDirection:"row",flexShrink:0,children:[g(O0,{width:B,flexShrink:0},void 0,!1,void 0,this),g(b0,{color:F.colors.text.muted,dimColor:!0,children:["^ ",l," lines above (streaming...)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),v.map((b,V)=>{if(b.type==="empty")return g(O0,{height:1,flexShrink:0},V,!1,void 0,this);return g(O0,{flexDirection:"row",flexShrink:0,children:[V===0&&!G&&g(O0,{marginRight:1,flexShrink:0,children:g(b0,{color:S,bold:!0,children:M},void 0,!1,void 0,this)},void 0,!1,void 0,this),(V>0||G)&&g(O0,{width:B,flexShrink:0},void 0,!1,void 0,this),g(O0,{flexGrow:1,flexShrink:0,children:b.type==="code"?_?g(b0,{wrap:"wrap",children:b.content},void 0,!1,void 0,this):g(YZ,{content:b.content,language:b.language,terminalWidth:Y-B,isPending:Z,availableHeight:X},void 0,!1,void 0,this):b.type==="table"&&b.tableData?g(J9,{headers:b.tableData.headers,rows:b.tableData.rows,terminalWidth:Y-B},void 0,!1,void 0,this):b.type==="heading"?g(ZZ,{content:b.content,level:b.level||1},void 0,!1,void 0,this):b.type==="list"?g(AQ,{type:b.listType||"ul",marker:b.marker||"-",itemText:b.content,leadingWhitespace:" ".repeat(b.indentation||0)},void 0,!1,void 0,this):b.type==="hr"?g(XZ,{terminalWidth:Y-B},void 0,!1,void 0,this):b.type==="diff"&&b.diffData?g(wQ,{patch:b.diffData.patch,startLine:b.diffData.startLine,matchLine:b.diffData.matchLine,terminalWidth:Y-B},void 0,!1,void 0,this):b.type==="command-message"?g(KZ,{content:b.content},void 0,!1,void 0,this):b.type==="blockquote"&&b.blockquoteLines?g(d6,{lines:b.blockquoteLines,level:b.blockquoteLevel||1},void 0,!1,void 0,this):g(GZ,{content:b.content},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},V,!0,void 0,this)}),I&&g(O0,{flexDirection:"row",flexShrink:0,children:[v.length===0&&!G?g(O0,{marginRight:1,flexShrink:0,children:g(b0,{color:S,bold:!0,children:M},void 0,!1,void 0,this)},void 0,!1,void 0,this):g(O0,{width:B,flexShrink:0},void 0,!1,void 0,this),g(O0,{flexGrow:1,flexShrink:0,children:g(b0,{wrap:"wrap",children:I},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),k&&g(O0,{flexDirection:"row",flexShrink:0,children:[g(O0,{width:B,flexShrink:0},void 0,!1,void 0,this),g(O0,{flexDirection:"column",flexGrow:1,flexShrink:0,children:[g(b0,{color:F.colors.text.muted,children:["Subtask"," ",typeof k.agentType==="string"?`@${k.agentType}`:"",typeof k.status==="string"?` · ${k.status}`:""]},void 0,!0,void 0,this),typeof k.summary==="string"&&k.summary.trim()!==""&&g(b0,{wrap:"wrap",children:k.summary},void 0,!1,void 0,this),typeof k.childSessionId==="string"&&g(b0,{color:F.colors.text.muted,children:["Session ",k.childSessionId]},void 0,!0,void 0,this),typeof k.resumedFrom==="string"&&g(b0,{color:F.colors.text.muted,children:["Resumed from ",k.resumedFrom,typeof k.resumeDepth==="number"?` · depth ${k.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 WZ}from"react/jsx-dev-runtime";var NZ=CQ.memo(({label:$,isSelected:Q})=>I0(k1,{color:Q?"yellow":void 0,children:$},void 0,!1,void 0,this)),FZ=CQ.memo(({details:$,headerColor:Q,isPlanModeExit:Y,isPlanModeEnter:J,terminalWidth:Z})=>I0(WZ,{children:[I0(L1,{marginBottom:1,children:I0(k1,{children:$.message},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.planContent&&I0(L1,{flexDirection:"column",marginBottom:1,borderStyle:"single",borderColor:Q,padding:1,children:[I0(k1,{bold:!0,color:Q,children:"实施方案"},void 0,!1,void 0,this),I0(L1,{marginTop:1,children:I0(J$,{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(L1,{flexDirection:"column",marginBottom:1,children:I0(J$,{content:$.details,role:"assistant",terminalWidth:Z},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.risks&&$.risks.length>0&&I0(L1,{flexDirection:"column",marginBottom:1,children:[I0(k1,{color:"red",bold:!0,children:"风险提示:"},void 0,!1,void 0,this),$.risks.map((X,G)=>I0(L1,{marginLeft:2,children:I0(k1,{color:"red",children:["• ",X]},void 0,!0,void 0,this)},G,!1,void 0,this))]},void 0,!0,void 0,this),$.affectedFiles&&$.affectedFiles.length>0&&I0(L1,{flexDirection:"column",marginBottom:1,children:[I0(k1,{color:"yellow",children:"影响的文件:"},void 0,!1,void 0,this),$.affectedFiles.slice(0,3).map((X,G)=>I0(L1,{marginLeft:2,children:I0(k1,{children:["• ",X]},void 0,!0,void 0,this)},G,!1,void 0,this)),$.affectedFiles.length>3&&I0(L1,{marginLeft:2,children:I0(k1,{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 HZ($,Q,Y,J){return`使用 ↑↓ 选择,回车确认 · ${Q||Y||J?"Y/N":$?"Y/S/N":"Y/S/P/N"} 快捷键 · Esc 取消`}var K9=CQ.memo(({details:$,onResponse:Q})=>{let{stdout:Y}=zZ(),J=Y.columns||80,X=e0()==="confirmation-prompt",G=S0(!1),q=$.type==="exitPlanMode",K=$.type==="enterPlanMode",U=$.type==="maxTurnsExceeded",W=$.type==="mcpSampling";OZ((z,w)=>{if(w.ctrl&&z==="c"||w.meta&&z==="c"){G();return}if(w.escape){Q({approved:!1,reason:"用户取消"});return}let _=z.toLowerCase();if(q){if(_==="y"){Q({approved:!0,targetMode:"autoEdit"});return}if(_==="s"){Q({approved:!0,targetMode:"default"});return}if(_==="n"){Q({approved:!1,reason:"方案需要改进"});return}}else if(K){if(_==="y"){Q({approved:!0});return}if(_==="n"){Q({approved:!1,reason:"用户拒绝进入 Plan 模式"});return}}else if(U){if(_==="y"){Q({approved:!0});return}if(_==="n"){Q({approved:!1,reason:"用户选择停止"});return}}else if(W){if(_==="y"){Q({approved:!0,scope:"once"});return}if(_==="n"){Q({approved:!1,reason:"用户拒绝 MCP Sampling"});return}}else{if(_==="y"){Q({approved:!0,scope:"once"});return}if(_==="s"){Q({approved:!0,scope:"session"});return}if(_==="p"){Q({approved:!0,scope:"project"});return}if(_==="n"){Q({approved:!1,reason:"用户拒绝"});return}}},{isActive:X});let O=G9(()=>{if(q)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(K)return[{key:"approve",label:"[Y] 进入规划模式",value:{approved:!0}},{key:"reject",label:"[N] 直接执行",value:{approved:!1,reason:"用户拒绝进入 Plan 模式"}}];if(U)return[{key:"continue",label:"[Y] 继续执行",value:{approved:!0}},{key:"stop",label:"[N] 停止",value:{approved:!1,reason:"用户选择停止"}}];if(W)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:"用户拒绝"}}]},[q,K,U,W]),H=G9(()=>{if(q)return{color:"cyan",title:"方案审核"};if(K)return{color:"magenta",title:"进入规划模式"};if(U)return{color:"yellow",title:"已达最大轮次"};return{color:"yellow",title:$.title||"操作确认"}},[q,K,U,$.title]);return I0(L1,{flexDirection:"column",borderStyle:"round",borderColor:X?H.color:"gray",padding:1,children:[I0(L1,{marginBottom:1,children:I0(k1,{bold:!0,color:H.color,children:H.title},void 0,!1,void 0,this)},void 0,!1,void 0,this),I0(FZ,{details:$,headerColor:H.color,isPlanModeExit:q,isPlanModeEnter:K,terminalWidth:J},void 0,!1,void 0,this),I0(L1,{flexDirection:"column",children:[I0(k1,{color:"gray",children:HZ(q,K,U,W)},void 0,!1,void 0,this),I0(_Z,{items:O,isFocused:X,itemComponent:NZ,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 L0,Text as K0,useInput as LZ}from"ink";import q9 from"ink-text-input";import{useState as p1}from"react";import{jsxDEV as c}from"react/jsx-dev-runtime";var N8=[{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"}],q2=[{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"}],U2=[{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"}],BZ=[`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"],U9=({workspaceRoot:$,sessionId:Q,onClose:Y,onSave:J})=>{let Z=r0.getTheme(),[X,G]=p1("action"),[q,K]=p1(0),[U,W]=p1(0),[O,H]=p1(0),[z,w]=p1(""),[_,F]=p1(""),[C,N]=p1(null),[S,M]=p1(!1),[B,k]=p1(null),P=N8[q],A=U2[U],T=q2[O],y=()=>{if(B){k(null);return}switch(X){case"action":Y();break;case"event":G("action");break;case"matcher":G("event");break;case"command":G("matcher");break;case"location":G("command");break;case"confirm":G("location");break}};LZ((v,b)=>{if(b.escape){y();return}if(X==="action"){if(b.upArrow)K((V)=>V>0?V-1:N8.length-1);else if(b.downArrow)K((V)=>V<N8.length-1?V+1:0);else if(b.return)L()}else if(X==="event"){if(b.upArrow)W((V)=>V>0?V-1:U2.length-1);else if(b.downArrow)W((V)=>V<U2.length-1?V+1:0);else if(b.return)G("matcher")}else if(X==="location"){if(b.upArrow)H((V)=>V>0?V-1:q2.length-1);else if(b.downArrow)H((V)=>V<q2.length-1?V+1:0);else if(b.return)G("confirm")}else if(X==="confirm"){if(b.return)R()}});let L=()=>{let v=N8[q].action;if(v==="add")G("event");else if(v==="status")f();else if(v==="list")l();else if(v==="enable")O1.getInstance().enableSession(Q,$),k("Hooks enabled for this session");else if(v==="disable")O1.getInstance().disableSession(Q,$),k("Hooks disabled for this session");else if(v==="trust")h();else if(v==="revoke")s()},f=async()=>{let v=O1.getInstance(),b=v.isEnabled($,Q),V=v.getConfig($),p=await v.getTrustStatus($),j={};for(let m of Object.values(TQ)){let X0=V[m];if(X0&&Array.isArray(X0)){let J0=X0.reduce((w0,k0)=>w0+(k0.hooks?.length||0),0);if(J0>0)j[m]=J0}}let E=[`Status: ${b?"Enabled":"Disabled"}`,`Trust: ${p.state}`,`Digest: ${p.currentDigest??"none"}`,""];if(Object.keys(j).length>0){E.push("Configured hooks:");for(let[m,X0]of Object.entries(j))E.push(` ${m}: ${X0} hook(s)`)}else E.push("No hooks configured");k(E.join(`
144
+ `))},h=async()=>{try{let v=await O1.getInstance().trustProject($);k(`Trust: ${v.state}
145
+ Digest: ${v.currentDigest??"none"}`)}catch(v){N(v instanceof Error?v.message:"Failed to trust hooks")}},s=async()=>{try{let v=await O1.getInstance().revokeProjectTrust($);k(`Trust: ${v.state}`)}catch(v){N(v instanceof Error?v.message:"Failed to revoke hook trust")}},l=()=>{let b=O1.getInstance().getConfig($),V=[],p=!1;for(let j of Object.values(TQ)){let E=b[j];if(!E||!Array.isArray(E)||E.length===0)continue;p=!0,V.push(`${j}:`);for(let m of E){let X0=m.matcher,J0="all";if(X0?.tools)J0=`tools: ${Array.isArray(X0.tools)?X0.tools.join(", "):X0.tools}`;V.push(` [${J0}]`);for(let w0 of m.hooks||[])if(w0.type==="command")V.push(` -> ${w0.command}`)}V.push("")}if(!p)V.push("No hooks configured"),V.push(""),V.push("Configure hooks in .blade/settings.local.json");k(V.join(`
146
+ `))},a=()=>{G("command")},I=()=>{if(!_.trim()){N("Command cannot be empty");return}N(null),G("location")},R=async()=>{M(!0),N(null);try{let v=O1.getInstance(),b=await import("node:fs/promises"),V=await import("node:path"),p=await import("node:os"),j={matcher:z.trim()?{tools:z.trim()}:{},hooks:[{type:"command",command:_.trim()}]},E;switch(T.location){case"local":E=V.join($,".blade","settings.local.json");break;case"project":E=V.join($,".blade","settings.json");break;case"user":E=V.join(p.homedir(),".blade","settings.json");break}await b.mkdir(V.dirname(E),{recursive:!0});let m={};try{let k0=await b.readFile(E,"utf-8");m=JSON.parse(k0)}catch{}let X0=m.hooks||{},J0=X0[A.event]||[],w0={...X0,enabled:!0,[A.event]:[...J0,j]};if(m.hooks=w0,await b.writeFile(E,JSON.stringify(m,null,2),"utf-8"),await v.reloadConfig($),J)J({event:A.event,matcher:z.trim(),command:_.trim()});Y()}catch(v){N(`Failed to save hook: ${v instanceof Error?v.message:"Unknown error"}`),M(!1)}};return c(L0,{flexDirection:"column",padding:1,children:[c(L0,{marginBottom:1,children:c(K0,{bold:!0,color:Z.colors.success,children:"Hooks Manager"},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(L0,{marginBottom:1,children:c(K0,{color:Z.colors.warning,children:"[WARN] Configured hooks run only after this exact project digest is trusted. Function hooks registered by application code are exempt."},void 0,!1,void 0,this)},void 0,!1,void 0,this),B&&c(L0,{flexDirection:"column",marginBottom:1,children:[c(K0,{children:B},void 0,!1,void 0,this),c(L0,{marginTop:1,children:c(K0,{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"&&!B&&c(L0,{flexDirection:"column",children:[c(L0,{flexDirection:"column",marginTop:1,children:N8.map((v,b)=>c(L0,{children:[c(K0,{color:b===q?Z.colors.primary:void 0,bold:b===q,children:[b===q?"> ":" ",v.action]},void 0,!0,void 0,this),c(K0,{color:Z.colors.muted,children:[" - ",v.description]},void 0,!0,void 0,this)]},v.action,!0,void 0,this))},void 0,!1,void 0,this),c(L0,{marginTop:1,children:c(K0,{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(L0,{flexDirection:"column",children:[c(K0,{bold:!0,children:"Select Event:"},void 0,!1,void 0,this),c(L0,{flexDirection:"column",marginTop:1,children:U2.map((v,b)=>c(L0,{children:[c(K0,{color:b===U?Z.colors.primary:void 0,bold:b===U,children:[b===U?"> ":" ",v.event]},void 0,!0,void 0,this),c(K0,{color:Z.colors.muted,children:[" - ",v.description]},void 0,!0,void 0,this)]},v.event,!0,void 0,this))},void 0,!1,void 0,this),c(L0,{marginTop:1,children:c(K0,{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(L0,{marginBottom:1,children:c(K0,{children:["Event:"," ",c(K0,{bold:!0,color:Z.colors.primary,children:A.event},void 0,!1,void 0,this),c(K0,{color:Z.colors.muted,children:[" - ",A.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(L0,{flexDirection:"column",marginBottom:1,children:[c(K0,{color:Z.colors.muted,children:"Input to command is JSON of tool call arguments."},void 0,!1,void 0,this),c(K0,{color:Z.colors.muted,children:"Exit code 0 - stdout/stderr not shown"},void 0,!1,void 0,this),c(K0,{color:Z.colors.muted,children:"Exit code 2 - show stderr to model and block tool call"},void 0,!1,void 0,this),c(K0,{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(L0,{flexDirection:"column",children:[c(L0,{children:[c(K0,{bold:!0,children:"Matcher: "},void 0,!1,void 0,this),c(q9,{value:z,onChange:w,onSubmit:a,placeholder:"e.g., Read, Bash, Edit|Write (empty = all tools)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(L0,{marginTop:1,children:c(K0,{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(L0,{marginTop:1,children:c(K0,{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(L0,{marginBottom:1,children:c(K0,{children:["Matcher: ",c(K0,{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(L0,{flexDirection:"column",children:[c(L0,{children:c(K0,{bold:!0,children:"Command: "},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(L0,{borderStyle:"single",borderColor:Z.colors.border.light,paddingX:1,marginTop:1,children:c(q9,{value:_,onChange:F,onSubmit:I,placeholder:"Enter shell command..."},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(L0,{flexDirection:"column",marginTop:1,children:[c(K0,{bold:!0,children:"Examples:"},void 0,!1,void 0,this),BZ.map((v,b)=>c(K0,{color:Z.colors.muted,children:["• ",v]},b,!0,void 0,this))]},void 0,!0,void 0,this),c(L0,{marginTop:1,children:c(K0,{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(L0,{flexDirection:"column",children:[c(L0,{flexDirection:"column",borderStyle:"round",borderColor:Z.colors.border.light,paddingX:2,paddingY:1,marginBottom:1,children:[c(K0,{bold:!0,color:Z.colors.primary,children:"Save hook configuration"},void 0,!1,void 0,this),c(K0,{children:" "},void 0,!1,void 0,this),c(K0,{children:[" ","Event: ",A.event," - ",A.description]},void 0,!0,void 0,this),c(K0,{children:[" Matcher: ",z||"(all)"]},void 0,!0,void 0,this),c(K0,{children:[" Command: ",_]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),c(K0,{bold:!0,children:"Where should this hook be saved?"},void 0,!1,void 0,this),c(L0,{flexDirection:"column",marginTop:1,children:q2.map((v,b)=>c(L0,{children:[c(K0,{color:b===O?Z.colors.primary:void 0,bold:b===O,children:[b===O?"> ":" ",b+1,". ",v.name]},void 0,!0,void 0,this),c(K0,{color:Z.colors.muted,children:[" ",v.description]},void 0,!0,void 0,this)]},v.location,!0,void 0,this))},void 0,!1,void 0,this),c(L0,{marginTop:1,children:c(K0,{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(L0,{flexDirection:"column",children:[c(L0,{flexDirection:"column",borderStyle:"round",borderColor:Z.colors.success,paddingX:2,paddingY:1,children:[c(K0,{bold:!0,children:["Saving hook to ",T.description,"..."]},void 0,!0,void 0,this),c(K0,{children:" "},void 0,!1,void 0,this),c(K0,{children:["Event: ",A.event]},void 0,!0,void 0,this),c(K0,{children:["Matcher: ",z||"(all tools)"]},void 0,!0,void 0,this),c(K0,{children:["Command: ",_]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),c(L0,{marginTop:1,children:c(K0,{color:Z.colors.muted,children:S?"Saving...":"Enter to confirm · Esc to go back"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),C&&c(L0,{marginTop:1,children:c(K0,{color:Z.colors.error,children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as I9}from"ahooks";import{Box as jZ,Text as hZ}from"ink";import EZ from"react";import{useMemoizedFn as z2}from"ahooks";import b$ from"chalk";import{Text as fZ,useInput as SZ}from"ink";import{useEffect as y9,useRef as _2}from"react";var O2={TIMEOUT_MS:100,RAPID_INPUT_THRESHOLD_MS:150,LARGE_INPUT_THRESHOLD:300,MEDIUM_SIZE_MULTI_CHUNK_THRESHOLD:200};var w$="\x1B",wZ=`${w$}[200~`,bZ=`${w$}[201~`,AZ="[200~",PZ="[201~",RZ=[`${w$}[I`,`${w$}[O`,"[I","[O"],_9=`${w$}[?2004h`,N9=`${w$}[?2004l`,fQ=`${w$}[?1004l`,yZ=[wZ,AZ],MZ=[bZ,PZ];function F9(){return{pasteBuffer:null,pasteOverflowed:!1}}function O9($,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 z9($){return RZ.some((Q)=>$===Q)}function H9($,Q){let Y=Q,J=$.pasteBuffer,Z=$.pasteOverflowed,X=J!==null,G=[];while(Y.length>0){if(J!==null){let U=O9(Y,MZ);if(!U){if(J.length+Y.length>kQ)J="",Z=!0;else if(!Z)J+=Y;Y="";break}if(J.length+U.index>kQ)Z=!0;else if(!Z)J+=Y.slice(0,U.index),G.push({kind:"paste",text:J});J=null,Z=!1,X=!0,Y=Y.slice(U.index+U.marker.length);continue}let q=O9(Y,yZ);if(!q){if(z9(Y))X=!0;else G.push({kind:"text",text:Y});Y="";break}let K=Y.slice(0,q.index);if(K&&!z9(K))G.push({kind:"text",text:K});J="",Z=!1,X=!0,Y=Y.slice(q.index+q.marker.length)}if(Q.length===0&&J!==null)X=!0;return{handled:X,state:{pasteBuffer:J,pasteOverflowed:Z},segments:G}}import{execSync as r$}from"node:child_process";import{existsSync as CZ,readFileSync as SQ}from"node:fs";import{basename as W9,isAbsolute as IZ}from"node:path";function L9($){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 B9(){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 TZ(){let{commands:$}=B9();try{return r$($.getPath,{encoding:"utf-8"}).trim()}catch(Q){return console.error("Failed to get clipboard path:",Q),null}}function w9($){if($.startsWith('"')&&$.endsWith('"')||$.startsWith("'")&&$.endsWith("'"))return $.slice(1,-1);return $}function b9($){if(process.platform==="win32")return $;let Q="__DOUBLE_BACKSLASH__";return $.replace(/\\\\/g,Q).replace(/\\(.)/g,"$1").replace(new RegExp(Q,"g"),"\\")}function vQ($){let Q=w9($.trim()),Y=b9(Q);return/\.(png|jpe?g|gif|webp)$/i.test(Y)}function kZ($){let Q=w9($.trim()),Y=b9(Q);if(vQ(Y))return Y;return null}async function A9($){let Q=kZ($);if(!Q)return null;let Y;try{if(IZ(Q))Y=SQ(Q);else{let G=TZ();if(G&&Q===W9(G))Y=SQ(G);else return null}}catch(G){return console.error("Failed to read image file:",G),null}let J=Y.toString("base64"),Z=L9(J),X=W9(Q);return{path:Q,base64:J,mediaType:Z,filename:X}}async function P9(){let $=process.platform,Q={darwin:"pbpaste",linux:"xclip -selection clipboard -o || wl-paste",win32:'powershell -Command "Get-Clipboard"'},Y=Q[$]||Q.linux;try{return r$(Y,{encoding:"utf-8"})||null}catch{return null}}async function R9(){let{commands:$,screenshotPath:Q}=B9();try{if(r$($.checkImage,{stdio:"ignore"}),r$($.saveImage(Q),{stdio:"ignore"}),!CZ(Q))return null;let J=SQ(Q).toString("base64"),Z=L9(J);return r$($.deleteFile(Q),{stdio:"ignore"}),{base64:J,mediaType:Z}}catch(Y){try{r$($.deleteFile(Q),{stdio:"ignore"})}catch{}return null}}import{jsxDEV as VZ}from"react/jsx-dev-runtime";var vZ=/\r\n/g,DZ=/\r/g;function DQ($){if(!$.includes("\r"))return $;return $.replace(vZ,`
147
+ `).replace(DZ,`
148
+ `)}function M9($,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 C9({value:$,placeholder:Q="",focus:Y=!0,onChange:J,cursorPosition:Z,onChangeCursorPosition:X,onPaste:G,onImagePaste:q,disabledKeys:K=[]}){let U=_2(F9()),W=_2($),O=_2(Z),H=_2(null);y9(()=>{W.current=$,O.current=Z},[$,Z]),y9(()=>{if(Z>$.length)X($.length)},[$,Z,X]);let z=z2((M,B)=>{let k=W.current,P=O.current;if(W.current=M,O.current=B,M!==k)J(M);if(B!==P)X(B)}),w=z2((M)=>{if(!M)return;let{newValue:B,newCursorPosition:k}=M9(DQ(M),W.current,O.current);z(B,k)}),_=z2(async(M)=>{let B=DQ(M);if(!B)return;if(q&&vQ(B))try{let P=await A9(B);if(P){let A=await q(P.base64,P.mediaType,P.filename);if(A?.prompt)w(A.prompt);return}}catch(P){console.error("Failed to process image path:",P)}if((B.length>O2.LARGE_INPUT_THRESHOLD||B.includes(`
149
+ `))&&G){let P=await G(B);if(P?.prompt){w(P.prompt);return}}w(B)}),F=z2((M)=>{let B=H.current;if(!B){try{let P=M();if(!P)return;let A=P.catch(()=>{return});H.current=A,A.finally(()=>{if(H.current===A)H.current=null})}catch{}return}let k=B.then(M).then(()=>{return}).catch(()=>{return});H.current=k,k.finally(()=>{if(H.current===k)H.current=null})});SZ((M,B)=>{F(()=>{let k=DQ(M),P=H9(U.current,k);if(U.current=P.state,P.handled)return(async()=>{for(let h of P.segments)if(h.kind==="paste")await _(h.text);else w(h.text)})();if(K.some((h)=>B[h])||B.ctrl&&M==="c"||B.ctrl&&M==="l"||B.ctrl&&M==="t"||B.ctrl&&M==="o"||B.meta&&M==="l"||B.meta&&M==="t"||B.meta&&M==="o"||B.shift&&B.tab||k==="?"&&W.current==="")return;let T=W.current,y=O.current,L=y,f=T;if(B.leftArrow)L--;else if(B.rightArrow)L++;else if(B.backspace||B.delete){if(M===""){if(y>0)f=T.slice(0,y-1)+T.slice(y,T.length),L--}else if(y<T.length)f=T.slice(0,y)+T.slice(y+1,T.length)}else if(B.ctrl&&k==="a")L=0;else if(B.ctrl&&k==="e")L=T.length;else if(B.ctrl&&k==="k")f=T.slice(0,y);else if(B.ctrl&&k==="u")f=T.slice(y),L=0;else if(B.ctrl&&k==="w"){let s=T.slice(0,y).match(/\s*\S+\s*$/);if(s){let l=s[0].length;f=T.slice(0,y-l)+T.slice(y),L-=l}}else if(B.ctrl&&k==="v"){let h=process.platform==="darwin";return(async()=>{if(q){let l=await R9();if(l){let a=await q(l.base64,l.mediaType,"clipboard.png");if(a?.prompt)w(a.prompt);return}}if(h)return;let s=await P9();if(s)await _(s)})()}else if(B.pageUp)L=0;else if(B.pageDown)L=T.length;else if(k===`
150
+ `&&(B.shift||B.meta)){let{newValue:h,newCursorPosition:s}=M9(k,T,y);z(h,s);return}else if(!B.ctrl&&!B.meta){if(G&&(k.length>O2.LARGE_INPUT_THRESHOLD||k.includes(`
151
+ `)))return _(k);f=T.slice(0,y)+k+T.slice(y,T.length),L+=k.length}if(L<0)L=0;if(L>f.length)L=f.length;z(f,L)})},{isActive:Y});let C=Y,N=$,S=Q?b$.grey(Q):void 0;if(C)if(S=Q.length>0?b$.inverse(Q[0])+b$.grey(Q.slice(1)):b$.inverse(" "),$.length===0)N=b$.inverse(" ");else{N="";for(let M=0;M<$.length;M++)if(M===Z&&Z<$.length)N+=b$.inverse($[M]);else N+=$[M];if(Z>=$.length)N+=b$.inverse(" ")}return VZ(fZ,{children:Q?$.length>0?N:S:N},void 0,!1,void 0,this)}import{jsxDEV as VQ}from"react/jsx-dev-runtime";var T9=EZ.memo(({input:$,cursorPosition:Q,onChange:Y,onChangeCursorPosition:J,onAddPasteMapping:Z,onAddImagePasteMapping:X})=>{let q=e0()==="main-input",K=$.trimStart().startsWith("!"),U=I9((O)=>{let H=O.split(`
152
+ `).length,z=O.length,w=500,_=10;if(z>500||H>10){let F=Z(O),C=O.slice(0,30).replace(/\n/g," "),N=`${z} chars, ${H} lines: ${C}...`;return{prompt:`${i8(F)}${N}${d2()}`}}return{}}),W=I9(async(O,H,z)=>{try{let w=X(O,H);return{prompt:`${i8(w)}[Image #${w}]${d2()}`}}catch(w){return console.error("[Image Paste] Failed to process image:",w),{prompt:`[Image paste failed: ${w instanceof Error?w.message:"Unknown error"}] `}}});return VQ(jZ,{flexDirection:"row",width:"100%",paddingX:2,paddingY:0,flexShrink:0,flexGrow:0,overflow:"hidden",borderStyle:"round",borderColor:K?"yellow":"gray",children:[VQ(hZ,{color:K?"yellow":"blue",bold:!0,children:K?"$ ":"> "},void 0,!1,void 0,this),VQ(C9,{value:$,cursorPosition:Q,onChange:Y,onChangeCursorPosition:J,onPaste:U,onImagePaste:W,placeholder:" 输入命令...",focus:q,disabledKeys:["upArrow","downArrow","tab","return","escape"]},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as N2,Text as y1}from"ink";import xZ,{useEffect as uZ,useState as lZ}from"react";import{useEffect as cZ,useState as v9}from"react";import{useEffect as gZ,useState as mZ}from"react";var pZ=15000,k9=["思考中","构思中","推理中","琢磨中","分析中","斟酌中","酝酿中","推敲中","揣摩中","审视中","处理中","编排中","打磨中","编织中","拼装中","调配中","组装中","搭建中","铸造中","雕琢中","搜寻中","梳理中","排查中","勘探中","钻研中","翻阅中","遍历中","扫描中","检索中","追踪中","计算中","编译中","解析中","运算中","推演中","迭代中","收敛中","演绎中","归纳中","求解中","生成中","编写中","起草中","绘制中","勾勒中","渲染中","合成中","调和中","编曲中","烹制中","施工中","酿造中","发酵中","煎熬中","折腾中","捣鼓中","鼓捣中","腾挪中","筹备中","蓄力中"],f9=["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 S9($,Q,Y=!1){let[J,Z]=mZ("");return gZ(()=>{if(Q){Z("等待用户确认...");return}if(!$){Z("");return}if(Y)return;let X=()=>{if(Math.random()<0.25){let U=Math.floor(Math.random()*f9.length);return f9[U]}let K=Math.floor(Math.random()*k9.length);return k9[K]};Z(X());let G=setInterval(()=>{Z(X())},pZ);return()=>{clearInterval(G)}},[$,Q,Y]),J}function D9($,Q=!1,Y=!1){let[J,Z]=v9(0),[X,G]=v9(null),q=S9($,Q,Y);return cZ(()=>{if(!$){Z(0),G(null);return}if(Y)return;if(X===null)G(Date.now());let K=setInterval(()=>{if(X!==null){let U=Math.floor((Date.now()-X)/1000);Z(U)}},1000);return()=>{clearInterval(K)}},[$,X,Y]),{currentPhrase:q,elapsedTime:J}}import{jsxDEV as Q1,Fragment as rZ}from"react/jsx-dev-runtime";var jQ=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"],dZ=80;function a$($){if($<60)return`${$}s`;let Q=Math.floor($/60),Y=$%60;return`${Q}m ${Y}s`}var V9=xZ.memo(({message:$,paused:Q=!1})=>{let Y=s1(),J=M8(),Z=G4(),X=X4(),G=K4(),q=q4(),K=U4(),U=Y||!J,[W,O]=lZ(0),H=A0(),w=g$()>=dZ,{currentPhrase:_,elapsedTime:F}=D9(U,!1,Q);if(uZ(()=>{if(!U||Q){O(0);return}let P=setInterval(()=>{O((A)=>(A+1)%jQ.length)},150);return()=>clearInterval(P)},[U,Q]),!U)return null;let C=G?.mode==="bounded_foreground"?`Provider 暂时不可用,正在有界恢复 (${G.attempt}/${G.maxRetries}),剩余约 ${a$(Math.max(0,Math.ceil((G.recoveryRemainingMs??0)/1000)))}`:G?.phase==="scheduled"?`Provider 暂时不可用,${G.attempt}/${G.maxRetries} 次重试将在 ${Math.max(0,Math.ceil((G.delayMs??0)/1000))}s 后开始`:G?.phase==="attempt"?`正在重试 Provider (${G.attempt}/${G.maxRetries})`:null,N=X?X.phase==="probe"?"Provider 正在执行唯一恢复探测":`Provider 故障已隔离,等待恢复探测${X.retryAfterMs!==void 0?` (${a$(Math.max(0,Math.ceil(X.retryAfterMs/1000)))})`:""}${X.recoveryRemainingMs!==void 0?`,剩余预算 ${a$(Math.max(0,Math.ceil(X.recoveryRemainingMs/1000)))}`:""}`:null,S=Z?`等待 Provider 容量(${Z.scope},队列 ${Z.queuePosition}/${Math.max(Z.queueDepth,Z.queuePosition)},已等待 ${a$(Math.max(0,Math.ceil(Z.waitMs/1000)))})`:null,M=q?q.outputStarted?`Provider 流已暂停 ${Math.ceil(q.durationMs/1000)}s,仍在等待(空闲超时上限 ${Math.ceil(q.timeoutMs/1000)}s)`:`Provider 尚未返回流数据,已等待 ${Math.ceil(q.durationMs/1000)}s(空闲超时上限 ${Math.ceil(q.timeoutMs/1000)}s)`:null,k=(K?.phase==="detected"?`检测到 ${K.toolName} 连续 ${K.runLength} 次无进展,正在要求 Agent 切换策略`:K?.phase==="halted"?`已停止 ${K.toolName} 空转循环`:null)||N||S||C||M||$||_||"正在思考中...";if(w)return Q1(N2,{paddingX:2,paddingBottom:1,flexDirection:"row",gap:1,children:[Q1(y1,{color:H.colors.warning,bold:!0,children:jQ[W]},void 0,!1,void 0,this),Q1(y1,{color:H.colors.text.primary,children:k},void 0,!1,void 0,this),F>0&&Q1(rZ,{children:[Q1(y1,{color:H.colors.muted,children:"|"},void 0,!1,void 0,this),Q1(y1,{color:H.colors.info,children:["已用时: ",a$(F)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Q1(y1,{color:H.colors.muted,children:"|"},void 0,!1,void 0,this),Q1(y1,{color:H.colors.secondary,children:"Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return Q1(N2,{paddingX:2,paddingBottom:1,flexDirection:"column",children:[Q1(N2,{flexDirection:"row",gap:1,children:[Q1(y1,{color:H.colors.warning,bold:!0,children:jQ[W]},void 0,!1,void 0,this),Q1(y1,{color:H.colors.text.primary,children:k},void 0,!1,void 0,this)]},void 0,!0,void 0,this),F>0&&Q1(N2,{marginLeft:2,flexDirection:"row",gap:1,children:[Q1(y1,{color:H.colors.info,children:["已用时: ",a$(F)]},void 0,!0,void 0,this),Q1(y1,{color:H.colors.muted,children:"|"},void 0,!1,void 0,this),Q1(y1,{color:H.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 W2,Text as D0,useInput as aZ,useStdout as oZ}from"ink";import iZ from"ink-text-input";import nZ,{useCallback as F2,useEffect as tZ,useMemo as sZ,useState as A$}from"react";import{jsxDEV as F0}from"react/jsx-dev-runtime";var g9=nZ.memo(({details:$,onComplete:Q})=>{let{stdout:Y}=oZ(),J=Y.columns||80,Z=e0()==="confirmation-prompt",X=S0(!1),G=$.fields??[],[q,K]=A$("field"),[U,W]=A$(0),[O,H]=A$(()=>j9($)),[z,w]=A$(""),[_,F]=A$(0),[C,N]=A$([]),[S,M]=A$(),B=G[U],k=sZ(()=>eZ(B),[B]);tZ(()=>{if(!B)return;let L=O[B.name];w(typeof L==="string"||typeof L==="number"?String(L):""),N(Array.isArray(L)?[...L]:[]);let f=k.findIndex((h)=>h.value===String(L));F(f>=0?f:0),M(void 0)},[O,B,k]);let P=F2((L)=>{if(H(L),U<G.length-1){W((f)=>f+1);return}K("review")},[U,G.length]),A=F2((L)=>{if(!B)return;let f={...O};if(L===void 0)delete f[B.name];else f[B.name]=L;P(f)},[O,B,P]),T=F2((L)=>{if(!B)return;try{A(h9(B,L))}catch(f){M(f instanceof Error?f.message:String(f))}},[B,A]),y=F2(()=>{try{let L=E9($,{action:"accept",content:O});Q({action:L.action,...L.content?{content:L.content}:{}})}catch(L){M(L instanceof Error?L.message:String(L))}},[O,$,Q]);if(aZ((L,f)=>{if(f.ctrl&&L==="c"||f.meta&&L==="c"){X();return}if(f.escape){Q({action:"cancel"});return}if($.mode==="url"){if(L.toLowerCase()==="y")Q({action:"accept"},!0);else if(L.toLowerCase()==="n")Q({action:"decline"});return}if(q==="review"){if(L.toLowerCase()==="y"||f.return)y();else if(L.toLowerCase()==="e")W(0),K("field");else if(L.toLowerCase()==="d")Q({action:"decline"});return}if(!B){if(f.return)y();return}if(hQ(B))return;if(L.toLowerCase()==="d"){Q({action:"decline"});return}if(f.upArrow){F((h)=>h>0?h-1:Math.max(k.length-1,0));return}if(f.downArrow||f.tab){F((h)=>h<k.length-1?h+1:0);return}if(L===" "&&B.type==="multi-select"){let h=k[_];if(h)N((s)=>s.includes(h.value)?s.filter((l)=>l!==h.value):[...s,h.value]);return}if(f.return)if(B.type==="multi-select")A(C);else{let h=k[_];if(h)A(h.typedValue)}},{isActive:Z}),$.mode==="url")return F0(H2,{width:J,color:"yellow",children:[F0(D0,{bold:!0,color:"yellow",children:"MCP external authorization"},void 0,!1,void 0,this),F0(D0,{children:$.message},void 0,!1,void 0,this),F0(D0,{color:"yellow",children:['Only continue if you trust MCP server "',$.serverName,'".']},void 0,!0,void 0,this),F0(D0,{children:["Domain: ",F0(D0,{color:"cyan",children:$.domain},void 0,!1,void 0,this)]},void 0,!0,void 0,this),F0(D0,{wrap:"wrap",children:["URL: ",F0(D0,{color:"cyan",children:$.url},void 0,!1,void 0,this)]},void 0,!0,void 0,this),F0(D0,{color:"gray",children:"[Y] Open URL · [N] Decline · Esc Cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(q==="review")return F0(H2,{width:J,color:"green",children:[F0(D0,{bold:!0,color:"green",children:"Review MCP form response"},void 0,!1,void 0,this),F0(D0,{children:$.message},void 0,!1,void 0,this),G.map((L)=>F0(D0,{children:[L.title,": ",Q5(O[L.name])]},L.name,!0,void 0,this)),S&&F0(D0,{color:"red",children:S},void 0,!1,void 0,this),F0(D0,{color:"gray",children:"[Y] Submit · [E] Edit · [D] Decline · Esc Cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(!B)return F0(H2,{width:J,color:"cyan",children:[F0(D0,{children:$.message},void 0,!1,void 0,this),F0(D0,{color:"gray",children:"This form has no fields."},void 0,!1,void 0,this),F0(D0,{color:"gray",children:"Press Enter to submit · [D] Decline · Esc Cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return F0(H2,{width:J,color:"cyan",children:[F0(D0,{bold:!0,color:"cyan",children:["MCP input requested by ",$.serverName]},void 0,!0,void 0,this),F0(D0,{children:$.message},void 0,!1,void 0,this),F0(W2,{flexDirection:"column",marginTop:1,children:[F0(D0,{bold:!0,children:[B.title,B.required?" *":""]},void 0,!0,void 0,this),B.description&&F0(D0,{color:"gray",children:B.description},void 0,!1,void 0,this),F0(D0,{color:"gray",children:$5(B)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),hQ(B)?F0(W2,{children:[F0(D0,{color:"cyan",children:"> "},void 0,!1,void 0,this),F0(iZ,{value:z,onChange:w,onSubmit:T,focus:Z,placeholder:B.defaultValue===void 0?B.required?"Required":"Optional":String(B.defaultValue)},void 0,!1,void 0,this)]},void 0,!0,void 0,this):F0(W2,{flexDirection:"column",children:k.map((L,f)=>{let h=B.type==="multi-select"&&C.includes(L.value);return F0(D0,{color:_===f?"yellow":void 0,children:[_===f?"> ":" ",B.type==="multi-select"?h?"(*) ":"( ) ":"",L.label]},L.value,!0,void 0,this)})},void 0,!1,void 0,this),S&&F0(D0,{color:"red",children:S},void 0,!1,void 0,this),F0(D0,{color:"gray",children:[hQ(B)?"Enter to continue":B.type==="multi-select"?"Space to toggle · Enter to continue":"Up/Down to select · Enter to continue"," · [D] Decline · Esc Cancel"]},void 0,!0,void 0,this),F0(D0,{color:"gray",children:["Field ",U+1," of ",G.length]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});function H2({children:$,width:Q,color:Y}){return F0(W2,{flexDirection:"column",gap:1,borderStyle:"round",borderColor:Y,padding:1,width:Math.min(Q-4,88),children:$},void 0,!1,void 0,this)}function hQ($){return $.type==="string"||$.type==="number"||$.type==="integer"}function eZ($){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 $5($){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 Q5($){if($===void 0)return"(omitted)";if(Array.isArray($))return $.join(", ")||"(none)";return String($)}import b2 from"ansi-escapes";import{Box as Z$,Static as W5,useStdout as L5}from"ink";import B5,{useEffect as u1,useMemo as uQ,useRef as X$,useState as lQ}from"react";import{useStdout as J5}from"ink";import{debounce as Y5}from"lodash-es";import{useEffect as Z5,useState as X5}from"react";function m9($=200){let{stdout:Q}=J5(),[Y,J]=X5(Q.rows||24);return Z5(()=>{let Z=Y5(()=>{J(Q.rows||24)},$);return Z(),Q.on("resize",Z),()=>{Q.off("resize",Z),Z.cancel()}},[Q,$]),Y}import P$ from"chalk";import G5 from"string-width";var N0={active:!1,renderedLineCount:0,lastRenderedLines:[],terminalWidth:process.stdout.columns||80,terminalHeight:process.stdout.rows||24,prefixIndent:4,isFirstRender:!0},B2="\x1B",EQ=`${B2}[2K`,L2=($)=>$>0?`${B2}[${$}A`:"",p9=`${B2}[?25l`,c9=`${B2}[?25h`;function x9($,Q){N0.active=!0,N0.renderedLineCount=0,N0.lastRenderedLines=[],N0.terminalWidth=$,N0.terminalHeight=Q,N0.isFirstRender=!0}function u9($,Q){N0.terminalWidth=$,N0.terminalHeight=Q}function l9($,Q,Y,J){if(!N0.active)return;let Z=8,X=Math.max(1,N0.terminalHeight-Z),G=[],q=r0.getTheme(),K=" ".repeat(N0.prefixIndent),U=P$.dim.hex(q.colors.border.light);if(Q>0)G.push(`${K}${P$.dim.hex(q.colors.text.muted)(`^ ${Q} lines above (streaming...)`)}`);let W=Y==="code",O=Y==="diff",H="",z=$;if(W&&$.length>0)H=$[0].match(/^```(\w+)?/)?.[1]||"",z=$.slice(1);else if(O&&$.length>0&&$[0]==="<<<DIFF>>>")z=$.slice(1);let w=z.slice(-X);if(W&&Q===0){let F=H?` ${P$.hex(q.colors.text.secondary)(H)}`:"";G.push(`${K}${U("╭─")}${F}`)}for(let F=0;F<w.length;F++){let C=w[F],N=K;if(F===0&&!J&&N0.isFirstRender&&!W&&!O)N=P$.bold.hex(q.colors.success)("• ")+" ",N0.isFirstRender=!1;let S=W?4:0,M=N0.terminalWidth-N0.prefixIndent-2-S,B=C;if(G5(C)>M)B=C.slice(0,M);if(W)G.push(`${K}${U("│")} ${B}`);else if(O){let k=B;if(k.startsWith("+"))G.push(`${N}${P$.green(B)}`);else if(k.startsWith("-"))G.push(`${N}${P$.red(B)}`);else if(k.startsWith("@@"))G.push(`${N}${P$.dim(B)}`);else G.push(`${N}${B}`)}else G.push(`${N}${B}`);if(F===0&&!J&&N0.isFirstRender)N0.isFirstRender=!1}let _=[];if(_.push(p9),N0.renderedLineCount>0)_.push(L2(N0.renderedLineCount)),_.push("\r");for(let F=0;F<G.length;F++){let C=G[F],N=N0.lastRenderedLines[F];if(C!==N)_.push(EQ),_.push(C);if(F<G.length-1)_.push(`
153
153
  `)}if(G.length<N0.renderedLineCount){for(let C=G.length;C<N0.renderedLineCount;C++)_.push(`
154
- `),_.push(EQ);let H=N0.renderedLineCount-G.length;_.push(W2(H))}_.push(m9),process.stdout.write(_.join("")),N0.renderedLineCount=G.length,N0.lastRenderedLines=G}function c1(){if(!N0.active)return;if(N0.renderedLineCount>0){let $=[];$.push(g9),$.push(W2(N0.renderedLineCount)),$.push("\r");for(let Q=0;Q<N0.renderedLineCount;Q++)if($.push(EQ),Q<N0.renderedLineCount-1)$.push(`
155
- `);if(N0.renderedLineCount>1)$.push(W2(N0.renderedLineCount-1)),$.push("\r");$.push(m9),process.stdout.write($.join(""))}N0.active=!1,N0.renderedLineCount=0,N0.lastRenderedLines=[],N0.isFirstRender=!0}function f1(){return N0.active}import{Box as X5,Text as u9}from"ink";import G5 from"react";import{jsxDEV as gQ}from"react/jsx-dev-runtime";var mQ=G5.memo(({collapsedCount:$})=>{let Q=A0();if($<=0)return null;let Y=Q.colors.text.muted;return gQ(X5,{flexDirection:"row",marginBottom:1,children:[gQ(u9,{color:Y,children:[">"," ",$," 条历史消息"]},void 0,!0,void 0,this),gQ(u9,{color:Y,children:" [Ctrl+O 展开]"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});mQ.displayName="CollapsedHistorySummary";import{Box as N8,Text as F8}from"ink";import K5 from"ink-big-text";import q5 from"ink-gradient";import U5 from"react";import{jsxDEV as B1}from"react/jsx-dev-runtime";var d9=U5.memo(()=>{return B1(N8,{flexDirection:"column",paddingX:2,paddingTop:1,paddingBottom:1,children:[B1(N8,{flexDirection:"column",children:B1(q5,{name:"pastel",children:B1(K5,{text:"BLADE",font:"block"},void 0,!1,void 0,this)},void 0,!1,void 0,this)},void 0,!1,void 0,this),B1(N8,{marginBottom:1,children:B1(F8,{color:"white",dimColor:!0,children:l9()},void 0,!1,void 0,this)},void 0,!1,void 0,this),B1(N8,{flexDirection:"column",marginBottom:1,children:[B1(N8,{marginBottom:1,children:B1(F8,{color:"white",bold:!0,children:"使用指南:"},void 0,!1,void 0,this)},void 0,!1,void 0,this),B1(F8,{color:"white",children:"1. 输入问题、编辑文件或运行命令"},void 0,!1,void 0,this),B1(F8,{color:"white",children:"2. 使用 /init 创建项目配置文件"},void 0,!1,void 0,this),B1(F8,{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 B2,Text as pQ}from"ink";import r9 from"react";import{jsxDEV as Y$}from"react/jsx-dev-runtime";var a9=r9.memo(({tasks:$,visible:Q=!0,compact:Y=!1})=>{let{colors:J}=A0();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$(B2,{flexDirection:"column",borderStyle:"single",borderColor:J.border.light,paddingX:1,paddingY:Y?0:1,marginBottom:1,children:[Y$(B2,{marginBottom:Y?0:1,children:[Y$(pQ,{dimColor:!0,children:"Tasks "},void 0,!1,void 0,this),Y$(pQ,{color:J.text.muted,children:[Z.completed,"/",Z.total]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Y$(B2,{flexDirection:"column",children:$.map((X,G)=>Y$(O5,{task:X,compact:Y},X.id||G,!1,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}),O5=r9.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$(B2,{paddingY:Q?0:0,children:Y$(pQ,{dimColor:J,children:[Y," ",Z]},void 0,!0,void 0,this)},void 0,!1,void 0,this)});import{Box as cQ,Text as a$}from"ink";import z5,{useMemo as i9}from"react";import{jsxDEV as x1}from"react/jsx-dev-runtime";function _5($,Q=60){if(!$)return"";let Y=$.split(`
156
- `)[0]||"";if(Y.length<=Q)return Y;return`${Y.slice(0,Q)}...`}function N5($){if(!$)return 0;return $.split(`
157
- `).length}var xQ=z5.memo(({content:$,isStreaming:Q=!1,isExpanded:Y})=>{let J=A0(),Z=i9(()=>N5($),[$]),X=i9(()=>_5($),[$]),G=J.colors.info,q=J.colors.muted;return x1(cQ,{flexDirection:"column",marginBottom:1,children:[x1(cQ,{flexDirection:"row",children:[x1(a$,{color:G,children:Y?"v":">"},void 0,!1,void 0,this),x1(a$,{children:" "},void 0,!1,void 0,this),x1(a$,{color:q,children:["Thinking",Q?"...":` (${Z} lines)`]},void 0,!0,void 0,this),!Y&&!Q&&X&&x1(a$,{color:q,children:[" - ",X]},void 0,!0,void 0,this),x1(a$,{color:q,dimColor:!0,children:[" ","[Ctrl+T]"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Y&&$&&x1(cQ,{marginLeft:2,marginTop:1,borderStyle:"round",borderColor:"gray",paddingX:1,paddingY:0,children:x1(a$,{color:q,children:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});xQ.displayName="ThinkingBlock";import{jsxDEV as i0}from"react/jsx-dev-runtime";var n9=W5.memo(()=>{let $=Q4(),Q=R4(),Y=y4(),J=M4(),Z=s1(),X=z4(),G=H4(),q=I8(),K=A4(),U=P4(),F=J4(),O=I4(),W=C4(),z=g$(),B=E9(),{stdout:_}=H5(),H=n1(),[C,N]=lQ(null),[v,M]=lQ([]),[w,k]=lQ(new Set),P=X$(W),A=X$(null),T=X$(0),y=X$(0),L=X$(new Set),f=X$(new Set),h=X$([]),t=X$(null);u1(()=>{if(P.current!==W){if(f1())c1();if(_)_.write(w2.clearTerminal);H.incrementClearCount(),P.current=W}},[W,_,H]);let l=$,a=J;u1(()=>{if(!J||Z){t.current=null;return}if(t.current===J)return;if(t.current=J,f1())c1();if(_)_.write(w2.eraseScreen+w2.cursorTo(0,0));L.current=new Set,f.current=new Set(l.filter((j)=>j.role==="tool").map((j)=>j.id)),A.current=null,T.current=0,y.current=0,h.current=[],M([]),k(new Set),H.incrementClearCount(),H.clearFinalizingStreamingMessageId()},[J,Z,_,H,l]);let I=Q??J;u1(()=>{if(f1())c1();A.current=null,T.current=0,y.current=0,L.current=new Set,f.current=new Set(l.filter((j)=>j.role==="tool").map((j)=>j.id)),h.current=[],M([]),k(new Set)},[F]),u1(()=>{if(!I)return;if(A.current===I)return;A.current=I,T.current=0,y.current=0,f.current=new Set(l.filter((j)=>j.role==="tool").map((j)=>j.id)),h.current=[],M([])},[I,l]),u1(()=>{if(!I)return;let j=dQ(I);if(!j||j.length<=T.current)return;let E=j.slice(T.current);T.current=j.length;let m=E,X0=h.current;if(X0.length>0)if(m.some((c0)=>c0.type!=="empty"))m=[...X0,...m],h.current=[];else{h.current=[...X0,...m];return}let J0=m.length;while(J0>0&&m[J0-1].type==="empty")J0-=1;if(J0!==m.length)h.current=m.slice(J0),m=m.slice(0,J0);if(m.length===0)return;let w0=y.current;y.current+=1;let k0=w0>0;if(f1())c1();k((c0)=>{if(!I||c0.has(I))return c0;let h0=new Set(c0);return h0.add(I),h0}),M((c0)=>[...c0,i0(Z$,{flexDirection:"column",children:i0(J$,{content:"",role:"assistant",terminalWidth:z,isPending:!1,hidePrefix:k0,noMargin:!0,blocksOverride:m,renderCodeBlocksAsPlainText:!1},void 0,!1,void 0,this)},`streaming-${I}-${w0}`,!1,void 0,this)])},[I,Y.version,z,F]),u1(()=>{if(!I)return;let j=f.current,E=l.filter((m)=>m.role==="tool"&&!j.has(m.id)&&!L.current.has(m.id));if(E.length===0)return;if(f1())c1();for(let m of E)L.current.add(m.id);M((m)=>[...m,...E.map((X0)=>i0(Z$,{flexDirection:"column",children:i0(J$,{content:X0.content,role:X0.role,terminalWidth:z,metadata:X0.metadata,isPending:!1,messageId:X0.id},void 0,!1,void 0,this)},`streaming-tool-${X0.id}`,!1,void 0,this))])},[I,l,z]),u1(()=>{if(!I){if(f1())c1();return}if(!f1())p9(z,B);else c9(z,B);let j=o9(I);if(!j||j.lines.length===0)return;let m=Math.max(1,B-8),X0=Math.max(0,j.lines.length-m),J0=j.lines.slice(-m),w0=(dQ(I)?.length??0)>0;x9(J0,X0,j.mode,w0)},[I,Y.version,B,z]),u1(()=>{if(!I&&f1())c1()},[I]),u1(()=>{if(C===null&&l.length>O){if(N(l.length),f1())c1();if(_)_.write(w2.clearTerminal);H.incrementClearCount()}},[l.length,O,C,_,H]);let R=uQ(()=>{return X.some((j)=>j.status==="pending"||j.status==="in_progress")},[X]),S=W?0:C??0,b=S,V=uQ(()=>{let j=[];if(j.push(i0(d9,{},"header",!1,void 0,this)),b>0)j.push(i0(mQ,{collapsedCount:b},"collapsed-summary",!1,void 0,this));for(let E=S;E<l.length;E++){let m=l[E];if(a&&m.id===a)continue;if(m.role==="tool"&&L.current.has(m.id))continue;if(m.role==="assistant"&&w.has(m.id))continue;j.push(i0(Z$,{flexDirection:"column",children:i0(J$,{content:m.content,role:m.role,terminalWidth:z,metadata:m.metadata,isPending:!1,messageId:m.id},void 0,!1,void 0,this)},m.id,!1,void 0,this))}return j},[l,S,b,z,a,w]),p=uQ(()=>v.length>0?[...V,...v]:V,[V,v]);return i0(Z$,{flexDirection:"column",paddingX:2,children:i0(Z$,{flexDirection:"column",children:[i0(F5,{items:p,children:(j)=>j},F,!1,void 0,this),K&&i0(Z$,{marginBottom:1,children:i0(xQ,{content:K,isStreaming:Z,isExpanded:U},void 0,!1,void 0,this)},void 0,!1,void 0,this),G&&R&&i0(Z$,{marginTop:1,children:i0(a9,{tasks:X,visible:!0,compact:!1},void 0,!1,void 0,this)},void 0,!1,void 0,this),q.map((j,E)=>i0(Z$,{flexDirection:"column",children:i0(J$,{content:j.displayText,role:"user",terminalWidth:z},void 0,!1,void 0,this)},`pending-${E}`,!1,void 0,this))]},void 0,!0,void 0,this)},void 0,!1,void 0,this)});import{useMemoizedFn as b2,useMount as L5}from"ahooks";import{Box as w1,Text as H0,useFocus as B5,useFocusManager as w5,useInput as b5}from"ink";import A5 from"ink-select-input";import{memo as P5,useMemo as R5,useState as A2}from"react";import{jsxDEV as e,Fragment as C5}from"react/jsx-dev-runtime";var y5=({isSelected:$})=>e(w1,{marginRight:1,children:e(H0,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),M5=({isSelected:$,label:Q})=>e(H0,{bold:$,color:$?"yellow":void 0,children:Q},void 0,!1,void 0,this),t9=P5(({onClose:$,onEdit:Q})=>{let Y=W4(),J=C8()??"",{isFocused:Z}=B5({id:"model-selector"}),X=w5(),[G,q]=A2(""),[K,U]=A2(!1),[F,O]=A2(null),W=v0(!1),[z]=A2(()=>{let P=process.stdout?.columns||80;return Math.max(20,P-8)});L5(()=>{if(X?.focus("model-selector"),Y.length>0)q(Y[0].id)}),b5((P,A)=>{if(K)return;if(A.ctrl&&P==="c"||A.meta&&P==="c"){W();return}if(A.escape){$();return}if(!Z)return;if(P==="d"||P==="D"){_();return}if((P==="e"||P==="E")&&Q)H()},{isActive:!0});let B=b2(async(P)=>{if(K)return;let A=P.value;if(A===J){$();return}U(!0),O(null);try{await m0().setCurrentModel(A),$()}catch(T){O(T.message),U(!1)}}),_=b2(async()=>{if(K||G===J)return;U(!0),O(null);try{if(await m0().removeModel(G),Y.length<=1)$()}catch(P){O(P.message)}finally{U(!1)}}),H=b2(()=>{if(K||!Q)return;let P=Y.find((A)=>A.id===G);if(!P)return;Q(P)}),C=b2((P)=>{q(P.value)}),N=R5(()=>{return Y.find((P)=>P.id===G)},[Y,G]),v=N?P2()?.modelProviders[N.provider]:void 0,M=Y.map((P)=>{let A=P.id===J?" (当前)":"";return{label:rQ(P)+A,value:P.id}}),w=G===J;return e(w1,{flexDirection:"column",borderStyle:"round",borderColor:"gray",padding:1,width:"100%",children:[e(w1,{flexDirection:"row",justifyContent:"space-between",marginBottom:1,children:[e(H0,{bold:!0,color:"cyan",children:"模型管理"},void 0,!1,void 0,this),e(H0,{dimColor:!0,children:[K?"处理中...":w?"Enter=关闭 • E=编辑 • Esc=取消":"Enter=切换 • D=删除 • E=编辑 • Esc=取消"," • Ctrl+C=退出"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),e(w1,{flexDirection:"row",children:[e(w1,{flexDirection:"column",flexGrow:2,marginRight:2,borderStyle:"single",borderColor:"gray",padding:1,children:[e(H0,{dimColor:!0,children:["已配置模型 (",Y.length,")"]},void 0,!0,void 0,this),e(w1,{marginTop:1,children:e(A5,{items:M,onSelect:B,onHighlight:C,indicatorComponent:y5,itemComponent:M5},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),e(w1,{flexDirection:"column",flexGrow:3,borderStyle:"single",borderColor:"gray",padding:1,children:[e(H0,{dimColor:!0,children:"模型详情"},void 0,!1,void 0,this),e(w1,{marginY:1,children:e(H0,{color:w?"green":"yellow",children:w?"* 当前使用":"* 可切换"},void 0,!1,void 0,this)},void 0,!1,void 0,this),N?e(w1,{flexDirection:"column",children:[e(H0,{children:[e(H0,{dimColor:!0,children:"名称: "},void 0,!1,void 0,this),e(H0,{bold:!0,color:"cyan",children:rQ(N)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),e(H0,{children:[e(H0,{dimColor:!0,children:"Provider: "},void 0,!1,void 0,this),e(H0,{bold:!0,children:v?.name??N.provider},void 0,!1,void 0,this)]},void 0,!0,void 0,this),v&&e(C5,{children:[e(H0,{children:[e(H0,{dimColor:!0,children:"Channel ID: "},void 0,!1,void 0,this),e(H0,{children:N.provider},void 0,!1,void 0,this)]},void 0,!0,void 0,this),e(H0,{children:[e(H0,{dimColor:!0,children:"Wire API: "},void 0,!1,void 0,this),e(H0,{children:v.wireApi},void 0,!1,void 0,this)]},void 0,!0,void 0,this),e(H0,{children:[e(H0,{dimColor:!0,children:"Endpoint: "},void 0,!1,void 0,this),e(H0,{color:"blueBright",children:v.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),e(H0,{children:[e(H0,{dimColor:!0,children:"Model: "},void 0,!1,void 0,this),e(H0,{bold:!0,children:N.model},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N.overrides?.baseUrl&&e(H0,{children:[e(H0,{dimColor:!0,children:"Base URL override: "},void 0,!1,void 0,this),e(H0,{color:"blueBright",children:N.overrides.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this),e(H0,{children:[e(H0,{dimColor:!0,children:"Context Window: "},void 0,!1,void 0,this),e(H0,{children:h1().resolveConfig(N).contextWindow},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this):e(H0,{dimColor:!0,children:"请选择一个模型查看详情"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),F&&e(w1,{marginTop:1,children:e(H0,{color:"red",children:F},void 0,!1,void 0,this)},void 0,!1,void 0,this),e(w1,{justifyContent:"center",marginTop:1,children:e(H0,{dimColor:!0,children:"─".repeat(z)},void 0,!1,void 0,this)},void 0,!1,void 0,this),e(w1,{justifyContent:"center",children:e(H0,{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 aQ}from"ahooks";import{Box as a5,Text as iQ,useInput as i5}from"ink";import{useState as M$}from"react";import{Box as R$,Text as l1,useInput as I5}from"ink";import T5 from"ink-text-input";import{jsxDEV as o0}from"react/jsx-dev-runtime";var s9=({provider:$,value:Q,onChange:Y,onSubmit:J,onCancel:Z,error:X})=>{return I5((G,q)=>{if(q.escape)Z()}),o0(R$,{flexDirection:"column",children:[o0(R$,{marginBottom:1,children:o0(l1,{bold:!0,color:"blue",children:"Step 2: 输入 API Key"},void 0,!1,void 0,this)},void 0,!1,void 0,this),o0(R$,{marginBottom:1,children:o0(l1,{children:["Provider: ",o0(l1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),o0(R$,{marginBottom:1,children:o0(l1,{dimColor:!0,children:"API 密钥将存储在 ~/.blade/auth.json(权限 600),不会写入模型配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),o0(R$,{children:[o0(l1,{bold:!0,color:"cyan",children:[">"," "]},void 0,!0,void 0,this),o0(T5,{value:Q,onChange:Y,onSubmit:J,placeholder:"sk-...",mask:"*"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X&&o0(R$,{marginTop:1,children:o0(l1,{color:"red",children:X},void 0,!1,void 0,this)},void 0,!1,void 0,this),o0(R$,{marginTop:1,children:o0(l1,{dimColor:!0,children:["输入完成后按 ",o0(l1,{bold:!0,children:"Enter"},void 0,!1,void 0,this),",",o0(l1,{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 R2,Text as G$,useInput as k5}from"ink";import f5 from"ink-text-input";import{useState as y2}from"react";import{jsxDEV as _1}from"react/jsx-dev-runtime";var M2=["id","name","baseUrl","model"];function e9($){switch($){case"id":return"Channel ID";case"name":return"Channel name";case"baseUrl":return"Base URL";case"model":return"Model ID"}}function v5($,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 S5($,Q){let Y=$.id.trim(),J={name:$.name.trim()||Y,baseUrl:$.baseUrl.trim(),wireApi:Q},Z=QJ(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,G]=y2(Q?3:0),[q,K]=y2(Q?.model??""),[U,F]=y2(Z),[O,W]=y2(),z=M2[X];k5((_,H)=>{if(!H.escape)return;if(W(void 0),X===0){J();return}let C=X-1,N=M2[C];G(C),K(U[N])});let B=(_)=>{let H=_.trim();if(z==="id"&&!$J.test(H)){W("Channel ID 必须以小写字母开头,且仅包含小写字母、数字、.、_ 或 -");return}if(z==="baseUrl")try{let N=new URL(H);if(!["http:","https:"].includes(N.protocol))throw Error()}catch{W("Base URL 必须是绝对 HTTP(S) URL");return}if(z==="model"&&!H){W("Model ID 不能为空");return}let C={...U,[z]:z==="name"&&!H?U.id:H};if(F(C),W(void 0),X===M2.length-1){try{Y(S5(C,$))}catch(N){W(N instanceof Error?N.message:"渠道配置无效")}return}G(X+1),K("")};return _1(R2,{flexDirection:"column",children:[_1(R2,{marginBottom:1,children:_1(G$,{bold:!0,color:"blue",children:"配置自定义 Provider 渠道"},void 0,!1,void 0,this)},void 0,!1,void 0,this),_1(G$,{dimColor:!0,children:["Protocol:"," ",$==="anthropic-messages"?"Anthropic Messages":"OpenAI Chat Completions"]},void 0,!0,void 0,this),M2.slice(0,X).map((_)=>_1(G$,{children:[e9(_),": ",_1(G$,{color:"cyan",children:U[_]},void 0,!1,void 0,this)]},_,!0,void 0,this)),_1(R2,{marginTop:1,children:[_1(G$,{bold:!0,children:[e9(z),": "]},void 0,!0,void 0,this),_1(f5,{value:q,onChange:(_)=>{K(_),W(void 0)},onSubmit:B,placeholder:v5(z,$,U.id)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z==="name"&&_1(G$,{dimColor:!0,children:"留空使用 Channel ID"},void 0,!1,void 0,this),O&&_1(G$,{color:"red",children:O},void 0,!1,void 0,this),_1(R2,{marginTop:1,children:_1(G$,{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 XJ,useState as i$}from"react";var GJ=()=>{let[$,Q]=i$([]),[Y,J]=i$(!0),[Z,X]=i$(null);return XJ(()=>{(async()=>{try{Q(await YJ())}catch(q){X(q instanceof Error?q.message:"加载 Provider 列表失败")}finally{J(!1)}})()},[]),{providers:$,isLoading:Y,error:Z}},KJ=($)=>{let[Q,Y]=i$([]),[J,Z]=i$(!1),[X,G]=i$(null);return XJ(()=>{if(!$){Y([]);return}(async()=>{Z(!0),G(null);try{Y(await ZJ($))}catch(K){G(K instanceof Error?K.message:"加载模型列表失败")}finally{Z(!1)}})()},[$]),{models:Q,isLoading:J,error:X}};import{Box as d1,Text as M1,useInput as D5}from"ink";import V5 from"ink-select-input";import j5 from"ink-text-input";import{useMemo as qJ,useState as h5}from"react";import{jsxDEV as E0,Fragment as p5}from"react/jsx-dev-runtime";var E5=({isSelected:$})=>E0(d1,{marginRight:1,children:E0(M1,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),g5=($)=>{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(" ")},m5=({isSelected:$,label:Q})=>E0(M1,{bold:$,color:$?"yellow":void 0,children:Q},void 0,!1,void 0,this),UJ=({provider:$,models:Q,isLoading:Y,error:J,onSelect:Z,onCancel:X})=>{let[G,q]=h5("");D5((F,O)=>{if(O.escape)if(G)q("");else X()});let K=qJ(()=>{if(!G)return Q;let F=G.toLowerCase();return Q.filter((O)=>O.name.toLowerCase().includes(F)||O.id.toLowerCase().includes(F))},[Q,G]),U=qJ(()=>K.map((F)=>({key:F.id,label:g5(F),value:F})),[K]);if(Y)return E0(d1,{flexDirection:"column",children:E0(M1,{color:"yellow",children:["正在加载 ",$.name," 模型列表..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this);if(J)return E0(d1,{flexDirection:"column",children:[E0(M1,{color:"red",children:J},void 0,!1,void 0,this),E0(M1,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return E0(d1,{flexDirection:"column",children:[E0(d1,{marginBottom:1,children:E0(M1,{bold:!0,color:"blue",children:"Step 3: 选择模型"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E0(d1,{marginBottom:1,children:E0(M1,{children:["Provider: ",E0(M1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),E0(p5,{children:[E0(d1,{marginBottom:1,children:[E0(M1,{color:"cyan",children:"> "},void 0,!1,void 0,this),E0(j5,{value:G,onChange:q,placeholder:`搜索 ${Q.length} 个模型...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E0(d1,{marginBottom:1,children:E0(M1,{dimColor:!0,children:"模型元数据来自内置 catalog"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E0(d1,{flexDirection:"column",height:12,children:E0(V5,{items:U,onSelect:(F)=>Z(F.value),indicatorComponent:E5,itemComponent:m5,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),K.length===0&&E0(M1,{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 y$,Text as K$,useInput as c5}from"ink";import x5 from"ink-select-input";import u5 from"ink-text-input";import{useMemo as OJ,useState as l5}from"react";import{jsxDEV as n0}from"react/jsx-dev-runtime";var d5=({isSelected:$})=>n0(y$,{marginRight:1,children:n0(K$,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),r5=({isSelected:$,label:Q})=>n0(K$,{bold:$,color:$?"yellow":void 0,children:Q},void 0,!1,void 0,this),zJ=({providers:$,isLoading:Q,error:Y,onSelect:J,onCancel:Z})=>{let[X,G]=l5("");c5((U,F)=>{if(F.escape)if(X)G("");else Z()});let q=OJ(()=>{if(!X)return $;let U=X.toLowerCase();return $.filter((F)=>F.name.toLowerCase().includes(U)||F.id.toLowerCase().includes(U))},[$,X]),K=OJ(()=>q.map((U)=>({key:U.id,label:`${U.name} - ${U.modelCount} models${U.configured?" [configured]":""}`,value:U})),[q]);if(Q)return n0(y$,{flexDirection:"column",children:n0(K$,{color:"yellow",children:"正在加载 Provider 列表..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Y)return n0(y$,{flexDirection:"column",children:[n0(K$,{color:"red",children:Y},void 0,!1,void 0,this),n0(K$,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return n0(y$,{flexDirection:"column",children:[n0(y$,{marginBottom:1,children:n0(K$,{bold:!0,color:"blue",children:"Step 1: 选择 API 提供商"},void 0,!1,void 0,this)},void 0,!1,void 0,this),n0(y$,{marginBottom:1,children:[n0(K$,{color:"cyan",children:"> "},void 0,!1,void 0,this),n0(u5,{value:X,onChange:G,placeholder:`搜索 ${$.length} 个 Provider...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),n0(y$,{flexDirection:"column",height:12,children:n0(x5,{items:K,onSelect:(U)=>J(U.value),indicatorComponent:d5,itemComponent:r5,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),q.length===0&&n0(K$,{color:"yellow",children:"未找到匹配的 Provider,按 Esc 清除搜索"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};function _J($){if($==="custom")return"provider";if($==="model")return"provider";if($==="credential")return"model";return}import{jsxDEV as q$}from"react/jsx-dev-runtime";var oQ=({mode:$,initialConfig:Q,modelId:Y,onComplete:J,onCancel:Z})=>{let[X,G]=M$("provider"),[q,K]=M$(),[U,F]=M$(),[O,W]=M$(),[z,B]=M$(""),[_,H]=M$(),[C,N]=M$(!1),v=GJ(),M=KJ(q?.id),w=v0(!1);i5((T,y)=>{if(y.ctrl&&T==="c"||y.meta&&T==="c")$==="setup"?w():Z()});let k=aQ(async(T)=>{if(!q)return;let y=O??(U?{provider:q.id,model:U.id,displayName:Q?.displayName}:void 0);if(!y)return;N(!0),H(void 0);try{if(y.modelProvider)h1().registerModelProvider(y.provider,y.modelProvider,[y.model]);if(T?.trim())await h1().setApiKey(y.provider,T.trim());let L={displayName:y.displayName,provider:y.provider,model:y.model,overrides:y.overrides};if($==="setup")await J(y);else if($==="add"){let f=y.modelProvider?await m0().addModelWithProvider(L,y.modelProvider):await m0().addModel(L);await m0().setCurrentModel(f.id),await J(y)}else if(Y){if(y.modelProvider)await m0().updateModelWithProvider(Y,L,y.modelProvider);else await m0().updateModel(Y,L);await J(y)}}catch(L){if(y.modelProvider){await h1().credentials.delete(y.provider);let f=P2();h1().configureModelProviders(f?.modelProviders??{},f?.models??[])}H(L instanceof Error?L.message:"保存配置失败"),N(!1)}}),P=aQ((T)=>{if(F(T),q?.configured)k();else if(q?.supportsApiKey)G("credential");else H(`${q?.name??"Provider"} 需要 OAuth 或环境凭证,请先在外部完成认证`)}),A=aQ(()=>{if(H(void 0),X==="credential"&&O){G("custom");return}let T=_J(X);if(T)G(T)});return q$(a5,{flexDirection:"column",padding:1,children:[q$(iQ,{bold:!0,color:"blue",children:$==="edit"?"编辑模型":"添加模型"},void 0,!1,void 0,this),X==="provider"&&q$(zJ,{...v,onSelect:(T)=>{K(T),F(void 0),W(void 0),G(T.factoryWireApi?"custom":"model")},onCancel:$==="setup"?()=>{return}:Z},void 0,!1,void 0,this),X==="custom"&&q?.factoryWireApi&&q$(JJ,{wireApi:q.factoryWireApi,initialConfig:O,onSubmit:(T)=>{W(T),G("credential")},onCancel:A},void 0,!1,void 0,this),X==="model"&&q&&q$(UJ,{provider:q,...M,onSelect:P,onCancel:A},void 0,!1,void 0,this),X==="credential"&&q&&q$(s9,{provider:q,value:z,onChange:B,onSubmit:()=>void k(z),onCancel:A,error:_},void 0,!1,void 0,this),C&&q$(iQ,{color:"yellow",children:"正在保存配置..."},void 0,!1,void 0,this),_&&X!=="credential"&&q$(iQ,{color:"red",children:_},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as H8}from"ahooks";import{promises as WJ}from"fs";import{Box as N1,Text as V0,useInput as o5}from"ink";import NJ from"ink-select-input";import n5 from"ink-text-input";import t5 from"os";import C2 from"path";import{useEffect as s5,useMemo as I2,useRef as e5,useState as U$}from"react";import{jsxDEV as U0}from"react/jsx-dev-runtime";var W8=[{key:"allow",label:"Allow"},{key:"ask",label:"Ask"},{key:"deny",label:"Deny"},{key:"info",label:"Info"}],$X={allow:"Add a new rule...",ask:"Add a new rule...",deny:"Add a new rule..."},QX={allow:"Allow permission rules",ask:"Ask permission rules",deny:"Deny permission rules"},FJ={project:"[项目共享配置]",global:"[用户全局配置]",local:"[本地配置]"},JX=["project","global","local"],YX={allow:[],ask:[],deny:[]},ZX={localExists:!1,projectExists:!1,globalExists:!1},HJ={allow:[],ask:[],deny:[]};function XX($){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 GX($){try{let Q=await WJ.readFile($,"utf-8"),Y=JSON.parse(Q);return{exists:!0,raw:Y,permissions:XX(Y)}}catch(Q){if(Q.code==="ENOENT")return{exists:!1,raw:{},permissions:{...HJ}};return console.warn(`[PermissionsManager] Failed to read ${$}:`,Q),{exists:!0,raw:{},permissions:{...HJ}}}}function KX($,Q){let Y=$.padEnd(32," "),J=Q==="local"?`${FJ[Q]} <- 可删除`:FJ[Q];return`${Y} ${J}`}var LJ=({onClose:$})=>{let Y=e0()==="permissions-manager",J=v0(!1),[Z,X]=U$(0),G=W8[Z].key,[q,K]=U$(YX),[U,F]=U$(ZX),[O,W]=U$(!0),[z,B]=U$("list"),[_,H]=U$(""),[C,N]=U$(null),[v,M]=U$(null),w=e5(!1),k=I2(()=>C2.join(l0(),".blade","settings.local.json"),[]),P=I2(()=>C2.join(l0(),".blade","settings.json"),[]),A=I2(()=>C2.join(t5.homedir(),".blade","settings.json"),[]),T=H8(async()=>{W(!0);let j=await Promise.all([{source:"local",path:k},{source:"project",path:P},{source:"global",path:A}].map(async({source:J0,path:w0})=>{let k0=await GX(w0);return{source:J0,path:w0,...k0}})),E={localExists:j.find((J0)=>J0.source==="local")?.exists??!1,projectExists:j.find((J0)=>J0.source==="project")?.exists??!1,globalExists:j.find((J0)=>J0.source==="global")?.exists??!1};F(E);let m={allow:[],ask:[],deny:[]},X0=Object.fromEntries(j.map((J0)=>[J0.source,J0]));["allow","ask","deny"].forEach((J0)=>{JX.forEach((w0)=>{(X0[w0]?.permissions[J0]??[]).forEach((c0,h0)=>{let H1={key:`${w0}:${h0}:${c0}`,rule:c0,source:w0};m[J0].push(H1)})})}),K(m),W(!1)});s5(()=>{T()},[T]);let y=H8(async(p,j)=>{try{let E=C2.join(l0(),".blade","settings.local.json"),m={allow:[],ask:[],deny:[]};try{let J0=await WJ.readFile(E,"utf-8"),k0=JSON.parse(J0).permissions||{};m={allow:Array.isArray(k0.allow)?k0.allow:[],ask:Array.isArray(k0.ask)?k0.ask:[],deny:Array.isArray(k0.deny)?k0.deny:[]}}catch(J0){}let X0=j(m);await m0().updateConfig({permissions:X0},{scope:"local",immediate:!0}),await T()}catch(E){throw console.error("[PermissionsManager] 修改权限规则失败:",E),E}});o5((p,j)=>{if(j.ctrl&&p==="c"||j.meta&&p==="c"){J();return}if(z==="locked"){if(w.current){w.current=!1;return}B("list"),N(null),M(null);return}if(j.escape){if(z==="list"||G==="info")$();else B("list"),H(""),N(null),M(null);return}if(z==="list"){if(j.tab&&j.shift)X((E)=>(E-1+W8.length)%W8.length);else if(j.tab)X((E)=>(E+1)%W8.length);else if(p?.toLowerCase()==="q")$()}},{isActive:Y});let L=H8((p)=>{let j=p.value;if(G==="info")return;if(j.type==="add"){B("add"),H(""),M(null);return}if(j.entry.source!=="local"){B("locked"),w.current=!0,N({tab:G,entry:j.entry}),M({type:"error",text:j.entry.source==="project"?"此规则定义在项目共享配置中,无法在此删除。":"此规则来自用户全局配置,无法在此删除。"});return}B("confirm-delete"),N({tab:G,entry:j.entry}),M(null)}),f=H8(async()=>{if(G==="info")return;let p=_.trim();if(!p){M({type:"error",text:"Permission rule 不能为空"});return}if(q[G].map((E)=>E.rule).includes(p)){M({type:"error",text:"该规则已存在"});return}try{await y(G,(E)=>{let m={allow:[...E.allow],ask:[...E.ask],deny:[...E.deny]};return m[G]=[...new Set([...E[G],p])],m}),B("list"),H(""),M({type:"success",text:"已添加本地权限规则"})}catch(E){M({type:"error",text:`保存失败: ${E instanceof Error?E.message:"未知错误"}`})}}),h=H8(async()=>{if(!C)return;let{tab:p,entry:j}=C;try{await y(p,(E)=>{let m={allow:[...E.allow],ask:[...E.ask],deny:[...E.deny]};return m[p]=E[p].filter((X0)=>X0!==j.rule),m}),B("list"),N(null),M({type:"success",text:"已删除本地权限规则"})}catch(E){M({type:"error",text:`删除失败: ${E instanceof Error?E.message:"未知错误"}`})}}),t=I2(()=>{if(G==="info")return[];let p=G;return[{key:"add-new-rule",label:`› ${$X[p]}`,value:{type:"add"}},...q[p].map((E)=>({key:E.key,label:KX(E.rule,E.source),value:{type:"rule",entry:E}}))]},[G,q]),l=()=>U0(N1,{marginBottom:1,children:W8.map((p,j)=>U0(N1,{marginRight:2,children:U0(V0,{color:j===Z?"yellow":"gray",children:["[",p.label,"]"]},void 0,!0,void 0,this)},p.key,!1,void 0,this))},void 0,!1,void 0,this),a=()=>U0(N1,{flexDirection:"column",gap:1,children:[U0(V0,{children:"配置文件优先级(从高到低):"},void 0,!1,void 0,this),U0(N1,{flexDirection:"column",marginLeft:2,children:[U0(V0,{children:["1. .blade/settings.local.json (本地配置,不提交 Git)"," ",U.localExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),U0(V0,{children:["2. .blade/settings.json (项目配置,提交 Git)"," ",U.projectExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),U0(V0,{children:["3. ~/.blade/settings.json (用户全局配置)"," ",U.globalExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),U0(V0,{children:"说明:"},void 0,!1,void 0,this),U0(N1,{flexDirection:"column",marginLeft:2,children:[U0(V0,{children:"- /permissions 命令只管理本地配置 (.blade/settings.local.json)"},void 0,!1,void 0,this),U0(V0,{children:"- 修改全局或项目配置请直接编辑对应文件"},void 0,!1,void 0,this),U0(V0,{children:"- 本地配置不会提交到 Git"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),I=(p)=>U0(N1,{flexDirection:"column",gap:1,children:[U0(V0,{bold:!0,children:QX[p]},void 0,!1,void 0,this),U0(V0,{children:"Permission rules are a tool name, optionally followed by a specifier in parentheses."},void 0,!1,void 0,this),U0(V0,{color:"gray",children:"例如: WebFetch 或 Bash(ls:*)"},void 0,!1,void 0,this),U0(N1,{marginTop:1,children:U0(n5,{value:_,onChange:H,onSubmit:f},void 0,!1,void 0,this)},void 0,!1,void 0,this),U0(V0,{color:"gray",children:"Enter 提交 · Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),R=(p,j)=>U0(N1,{flexDirection:"column",gap:1,children:[U0(V0,{bold:!0,children:["Delete ",p," permission rule?"]},void 0,!0,void 0,this),U0(V0,{children:j.rule},void 0,!1,void 0,this),U0(V0,{color:"gray",children:"From project local settings"},void 0,!1,void 0,this),U0(V0,{children:"Are you sure you want to delete this permission rule?"},void 0,!1,void 0,this),U0(NJ,{items:[{label:"Yes",value:"yes"},{label:"No",value:"no"}],onSelect:(E)=>{if(E.value==="yes")h();else B("list"),N(null)}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),S=(p)=>U0(N1,{flexDirection:"column",gap:1,children:[U0(V0,{bold:!0,children:"Cannot delete this rule"},void 0,!1,void 0,this),U0(V0,{children:p.rule},void 0,!1,void 0,this),U0(V0,{color:"gray",children:p.source==="project"?"This rule is defined in .blade/settings.json. 请手动编辑该文件以移除规则。":"This rule is defined in ~/.blade/settings.json. 请手动编辑该文件以移除规则。"},void 0,!1,void 0,this),U0(V0,{color:"gray",children:"按任意键继续"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),b=(p)=>U0(NJ,{items:t,isFocused:z==="list",onSelect:L},void 0,!1,void 0,this),V=()=>{if(O)return U0(V0,{children:"加载中..."},void 0,!1,void 0,this);if(G==="info")return a();if(z==="add")return I(G);if(z==="confirm-delete"&&C)return R(C.tab,C.entry);if(z==="locked"&&C)return S(C.entry);return b(G)};return U0(N1,{flexDirection:"column",borderStyle:"round",borderColor:Y?"cyan":"gray",padding:1,width:80,children:[U0(V0,{color:"cyan",bold:!0,children:"权限管理器"},void 0,!1,void 0,this),l(),U0(N1,{flexDirection:"column",gap:1,children:V()},void 0,!1,void 0,this),v&&U0(N1,{marginTop:1,children:U0(V0,{color:v.type==="success"?"green":"red",children:v.text},void 0,!1,void 0,this)},void 0,!1,void 0,this),U0(N1,{marginTop:1,children:U0(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 B0,Text as Y0,useInput as qX}from"ink";import{useEffect as UX,useState as C$}from"react";import{jsxDEV as x}from"react/jsx-dev-runtime";var nQ=["local","project","global"];function yJ({workspaceRoot:$,onCancel:Q}){let Y=wJ($),J=Y.getAll(),[Z,X]=C$(0),[G,q]=C$(!1),[K,U]=C$(""),[F,O]=C$(null),[W,z]=C$("local"),[B,_]=C$(null),[H,C]=C$(0),N=Y.getBySource(),v=Y.getStats(),M=Y.getSourcePolicy(),w=v0(!1,Q);UX(()=>{let L=!0;return BJ.getInstance().loadWorkspacePluginSettingsResolution(Y.getWorkspaceRoot()).then((f)=>{if(L)_(f.settings)}).catch((f)=>{if(L)U(f instanceof Error?f.message:"无法读取插件作用域配置")}),()=>{L=!1}},[Y,H]);let k=()=>{z((L)=>{let f=nQ.indexOf(L);return nQ[(f+1)%nQ.length]}),O(null)},P=async()=>{let L=J[Z];if(!L||G)return;if(L.source==="cli"){U(`${L.manifest.name} 由 --plugin-dir 管理,不能持久化切换`);return}if(L.status==="error"){U(L.error??`${L.manifest.name} 当前不可用`);return}q(!0),U("");try{let f=await bJ(Y.getWorkspaceRoot(),L.manifest.name,L.status!=="active",W);U(f.effectiveEnabled?`已启用 ${L.manifest.name} · 生效层级 ${f.effectiveScope}`:`已禁用 ${L.manifest.name} · 生效层级 ${f.effectiveScope}`),C((h)=>h+1)}catch(f){U(f instanceof Error?f.message:String(f))}finally{q(!1)}},A=async()=>{if(G)return;q(!0),U("");try{await AJ(Y.getWorkspaceRoot()),X(0),U("插件列表已刷新"),C((L)=>L+1)}catch(L){U(L instanceof Error?L.message:String(L))}finally{q(!1)}},T=async()=>{let L=J[Z];if(!L||G)return;if(!L.installation){U(`${L.manifest.name} 不是 Blade 受管安装,不能自动更新`);return}q(!0),O(null),U("");try{let{result:f}=await PJ(Y.getWorkspaceRoot(),L.manifest.name,{trusted:!0});if(!f.success)throw Error(f.error);U(f.changed?`已更新 ${L.manifest.name} 到 ${f.installation?.revision}`:`${L.manifest.name} 已是最新版本`),C((h)=>h+1)}catch(f){U(f instanceof Error?f.message:String(f))}finally{q(!1)}},y=async()=>{let L=J[Z];if(!L||G)return;if(!L.installation){U(`${L.manifest.name} 不是 Blade 受管安装,不能自动卸载`);return}if(F!==L.manifest.name){O(L.manifest.name),U(`再次按 x 确认卸载 ${L.manifest.name}`);return}q(!0),U("");try{let{result:f}=await RJ(Y.getWorkspaceRoot(),L.manifest.name,!0);if(!f.success)throw Error(f.error);O(null),X(0),U(`已卸载 ${L.manifest.name}`),C((h)=>h+1)}catch(f){U(f instanceof Error?f.message:String(f))}finally{q(!1)}};if(qX((L,f)=>{if(f.escape)Q?.();else if(f.ctrl&&L==="c"||f.meta&&L==="c")w();else if((f.upArrow||L==="k")&&J.length>0)O(null),X((h)=>(h-1+J.length)%J.length);else if((f.downArrow||L==="j")&&J.length>0)O(null),X((h)=>(h+1)%J.length);else if(L===" "||f.return)P();else if(L==="r")A();else if(L==="s")k();else if(L==="u")T();else if(L==="x")y()}),J.length===0)return x(B0,{flexDirection:"column",paddingY:1,children:[x(B0,{marginBottom:1,children:x(Y0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(B0,{paddingLeft:2,children:x(Y0,{color:"gray",children:"没有已加载的插件"},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(B0,{marginTop:1,paddingLeft:2,flexDirection:"column",children:[x(Y0,{color:"gray",children:"插件目录位置:"},void 0,!1,void 0,this),x(Y0,{color:"gray",dimColor:!0,children:[" ","• ~/.blade/plugins/ - 用户级插件"]},void 0,!0,void 0,this),x(Y0,{color:"gray",dimColor:!0,children:[" ","• .blade/plugins/ - 项目级插件"]},void 0,!0,void 0,this),x(Y0,{color:"gray",dimColor:!0,children:[" ","• --plugin-dir - CLI 指定的插件"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(B0,{marginTop:1,paddingLeft:2,children:x(Y0,{color:"gray",children:"使用 /plugins install <url> 安装新插件"},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(B0,{marginTop:1,children:x(Y0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return x(B0,{flexDirection:"column",paddingY:1,children:[x(B0,{marginBottom:1,children:[x(Y0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this),x(Y0,{color:"gray",children:[" (共 ",v.total," 个插件)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(B0,{paddingLeft:2,marginBottom:1,children:x(Y0,{color:"gray",children:["启用: ",v.active," | 禁用: ",v.inactive," | 命令: ",v.commands," | 技能:"," ",v.skills," | 代理: ",v.agents]},void 0,!0,void 0,this)},void 0,!1,void 0,this),x(B0,{paddingLeft:2,marginBottom:1,children:x(Y0,{color:"gray",children:["来源策略: ",M.restrictToAllowedSources?"restricted":"open"," | Git SHA: ",M.requireGitCommitSha?"required":"optional"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),x(B0,{paddingLeft:2,marginBottom:1,children:x(Y0,{color:"gray",children:["写入层级: ",x(Y0,{color:"cyan",children:W},void 0,!1,void 0,this)," · 按 s 切换"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),N.cli.length>0&&x(B0,{flexDirection:"column",marginBottom:1,children:[x(B0,{paddingLeft:1,children:[x(Y0,{bold:!0,color:"magenta",children:"CLI 指定"},void 0,!1,void 0,this),x(Y0,{color:"gray",children:" (--plugin-dir)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N.cli.map((L)=>{let f=L.status==="active"?"[on]":"[off]",h=J.indexOf(L)===Z;return x(B0,{flexDirection:"column",paddingLeft:2,children:[x(Y0,{children:[x(Y0,{bold:!0,color:h?"cyan":"green",children:[h?"› ":" ",f," ",L.manifest.name]},void 0,!0,void 0,this),x(Y0,{color:"gray",children:[" v",L.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(B0,{paddingLeft:2,children:x(Y0,{color:"gray",children:L.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(B0,{paddingLeft:2,children:x(Y0,{color:"gray",dimColor:!0,children:"生效层级: invocation"},void 0,!1,void 0,this)},void 0,!1,void 0,this),L.commands.length>0&&x(B0,{paddingLeft:2,children:x(Y0,{color:"blue",children:["命令:"," ",L.commands.map((t)=>`/${t.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},L.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),N.project.length>0&&x(B0,{flexDirection:"column",marginBottom:1,children:[x(B0,{paddingLeft:1,children:[x(Y0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),x(Y0,{color:"gray",children:" (.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N.project.map((L)=>{let f=L.status==="active"?"[on]":"[off]",h=J.indexOf(L)===Z;return x(B0,{flexDirection:"column",paddingLeft:2,children:[x(Y0,{children:[x(Y0,{bold:!0,color:h?"cyan":"green",children:[h?"› ":" ",f," ",L.manifest.name]},void 0,!0,void 0,this),x(Y0,{color:"gray",children:[" v",L.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(B0,{paddingLeft:2,children:x(Y0,{color:"gray",children:L.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(B0,{paddingLeft:2,children:x(Y0,{color:"gray",dimColor:!0,children:["生效层级:"," ",B?.[L.manifest.name]?.effectiveScope??"default"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),L.commands.length>0&&x(B0,{paddingLeft:2,children:x(Y0,{color:"blue",children:["命令:"," ",L.commands.map((t)=>`/${t.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},L.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),N.user.length>0&&x(B0,{flexDirection:"column",marginBottom:1,children:[x(B0,{paddingLeft:1,children:[x(Y0,{bold:!0,color:"cyan",children:"用户级"},void 0,!1,void 0,this),x(Y0,{color:"gray",children:" (~/.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N.user.map((L)=>{let f=L.status==="active"?"[on]":"[off]",h=J.indexOf(L)===Z;return x(B0,{flexDirection:"column",paddingLeft:2,children:[x(Y0,{children:[x(Y0,{bold:!0,color:h?"cyan":"green",children:[h?"› ":" ",f," ",L.manifest.name]},void 0,!0,void 0,this),x(Y0,{color:"gray",children:[" v",L.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(B0,{paddingLeft:2,children:x(Y0,{color:"gray",children:L.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(B0,{paddingLeft:2,children:x(Y0,{color:"gray",dimColor:!0,children:["生效层级:"," ",B?.[L.manifest.name]?.effectiveScope??"default"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),L.commands.length>0&&x(B0,{paddingLeft:2,children:x(Y0,{color:"blue",children:["命令:"," ",L.commands.map((t)=>`/${t.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},L.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),x(B0,{marginTop:1,paddingLeft:2,flexDirection:"column",children:[x(Y0,{color:"gray",children:"可用命令:"},void 0,!1,void 0,this),x(Y0,{color:"gray",dimColor:!0,children:[" ","• /plugins list - 列出所有插件"]},void 0,!0,void 0,this),x(Y0,{color:"gray",dimColor:!0,children:[" ","• /plugins info <name> - 显示插件详情"]},void 0,!0,void 0,this),x(Y0,{color:"gray",dimColor:!0,children:[" ","• /plugins install <url> - 安装插件"]},void 0,!0,void 0,this),x(Y0,{color:"gray",dimColor:!0,children:[" ","• /plugins enable/disable <name> - 启用/禁用插件"]},void 0,!0,void 0,this),x(Y0,{color:"gray",dimColor:!0,children:[" ","• /plugins policy show|set - 来源与 SHA 策略"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(B0,{marginTop:1,children:x(Y0,{dimColor:!0,children:"↑/↓ 选择 · Space/Enter 启停 · s 切换层级 · u 信任并更新 · x 卸载 · r 刷新 · ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),K&&x(B0,{marginTop:1,children:x(Y0,{color:K.includes("失败")?"red":"cyan",children:K},void 0,!1,void 0,this)},void 0,!1,void 0,this),G&&x(Y0,{color:"gray",children:"处理中..."},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import{Box as J1,Text as Y1,useInput as MJ,useStdout as OX}from"ink";import zX from"ink-text-input";import tQ,{useCallback as L8,useMemo as _X,useState as O$}from"react";import{jsxDEV as W0}from"react/jsx-dev-runtime";var NX=tQ.memo(({option:$,index:Q,isSelected:Y,isMultiSelect:J,isHighlighted:Z})=>W0(J1,{flexDirection:"column",marginBottom:1,children:[W0(Y1,{color:Z?"yellow":Y?"green":void 0,bold:Z,children:[J?Y?"(*) ":"( ) ":Z?"> ":" ",Q+1,". ",$.label]},void 0,!0,void 0,this),W0(J1,{marginLeft:4,children:W0(Y1,{color:"gray",children:$.description},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)),FX=tQ.memo(({questions:$,answers:Q})=>W0(J1,{flexDirection:"column",marginBottom:1,children:$.map((Y)=>{let J=Q[Y.header],Z=Array.isArray(J)?J.join(", "):J||"(no answer)";return W0(J1,{marginBottom:1,children:[W0(Y1,{backgroundColor:"blue",color:"white",children:[" ",Y.header," "]},void 0,!0,void 0,this),W0(Y1,{color:"green",children:[" ",Z]},void 0,!0,void 0,this)]},Y.header,!0,void 0,this)})},void 0,!1,void 0,this)),CJ=tQ.memo(({questions:$,onComplete:Q,onCancel:Y})=>{let{stdout:J}=OX(),Z=J.columns||80,G=e0()==="confirmation-prompt",q=v0(!1),[K,U]=O$("answering"),[F,O]=O$(0),[W,z]=O$({}),[B,_]=O$(0),[H,C]=O$([]),[N,v]=O$(!1),[M,w]=O$(""),[k,P]=O$(0),A=$[F],T=_X(()=>{if(!A)return[];return[...A.options.map((l)=>({label:l.label,value:l.label,description:l.description})),{label:"Type something...",value:"__other__",description:"Enter custom response"}]},[A]),y=L8((l)=>{let a={...W,[A.header]:l};if(z(a),F<$.length-1)O(F+1),_(0),C([]),v(!1),w("");else U("submit"),P(0)},[W,A?.header,F,$.length]),L=L8((l)=>{let a=T[l];if(!a)return;if(a.value==="__other__"){v(!0);return}if(A.multiSelect)C((I)=>I.includes(a.value)?I.filter((R)=>R!==a.value):[...I,a.value]);else y(a.value)},[T,A?.multiSelect,y]),f=L8((l)=>{if(l.trim())y(l.trim())},[y]),h=L8(()=>{U("answering"),O(0),_(0),C([]),v(!1)},[]),t=L8(()=>{Q(W)},[W,Q]);if(MJ((l,a)=>{if(a.ctrl&&l==="c"||a.meta&&l==="c"){q();return}if(N){if(a.escape)v(!1),w("");return}if(a.escape){Y();return}let I=parseInt(l);if(I>=1&&I<=T.length){L(I-1);return}if(a.upArrow){_((R)=>R>0?R-1:T.length-1);return}if(a.downArrow||a.tab){_((R)=>R<T.length-1?R+1:0);return}if(a.return){if(A.multiSelect&&H.length>0)y(H);else L(B);return}if(l===" "&&A.multiSelect){let R=T[B];if(R&&R.value!=="__other__")C((S)=>S.includes(R.value)?S.filter((b)=>b!==R.value):[...S,R.value]);return}},{isActive:G&&K==="answering"&&!N}),MJ((l,a)=>{if(a.ctrl&&l==="c"||a.meta&&l==="c"){q();return}if(a.escape){Y();return}if(a.upArrow||a.downArrow||a.tab){P((I)=>I===0?1:0);return}if(a.return){if(k===0)t();else h();return}if(l.toLowerCase()==="y"){t();return}if(l.toLowerCase()==="e"){h();return}},{isActive:G&&K==="submit"}),K==="submit")return W0(J1,{flexDirection:"column",borderStyle:"round",borderColor:G?"green":"gray",padding:1,width:Math.min(Z-4,80),children:[W0(J1,{marginBottom:1,children:W0(Y1,{bold:!0,color:"green",children:"[OK] Review Your Answers"},void 0,!1,void 0,this)},void 0,!1,void 0,this),W0(FX,{questions:$,answers:W},void 0,!1,void 0,this),W0(J1,{flexDirection:"column",marginTop:1,children:[W0(Y1,{color:k===0?"yellow":void 0,bold:k===0,children:[k===0?"> ":" ","[Y] Submit answers"]},void 0,!0,void 0,this),W0(Y1,{color:k===1?"yellow":void 0,bold:k===1,children:[k===1?"> ":" ","[E] Edit answers"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),W0(J1,{marginTop:1,children:W0(Y1,{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(!A)return null;return W0(J1,{flexDirection:"column",borderStyle:"round",borderColor:G?"cyan":"gray",padding:1,width:Math.min(Z-4,80),children:[W0(J1,{marginBottom:1,children:[W0(Y1,{backgroundColor:"blue",color:"white",children:[" ",A.header," "]},void 0,!0,void 0,this),W0(Y1,{children:[" ",A.question]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),N?W0(J1,{flexDirection:"column",marginTop:1,children:[W0(Y1,{color:"yellow",children:"Enter your response:"},void 0,!1,void 0,this),W0(J1,{marginTop:1,children:[W0(Y1,{color:"cyan",children:"> "},void 0,!1,void 0,this),W0(zX,{value:M,onChange:w,onSubmit:f,focus:G},void 0,!1,void 0,this)]},void 0,!0,void 0,this),W0(J1,{marginTop:1,children:W0(Y1,{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):W0(J1,{flexDirection:"column",children:T.map((l,a)=>W0(NX,{option:l,index:a,isSelected:H.includes(l.value),isMultiSelect:A.multiSelect,isHighlighted:B===a},l.value,!1,void 0,this))},void 0,!1,void 0,this),!N&&W0(J1,{marginTop:1,flexDirection:"column",children:[W0(Y1,{color:"gray",children:A.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),A.multiSelect&&H.length>0&&W0(Y1,{color:"green",children:["Selected: ",H.join(", ")]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$.length>1&&W0(J1,{marginTop:1,children:W0(Y1,{color:"gray",children:["Question ",F+1," of ",$.length]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{basename as HX}from"node:path";import{Box as n$,Text as b1,useInput as WX}from"ink";import LX from"ink-select-input";import{useEffect as sQ,useMemo as o$,useRef as SJ,useState as T2}from"react";function IJ($){return`${$.projectPath}\x00${$.sessionId}`}function TJ($){return $.title?.trim()||`Session ${$.sessionId.slice(0,8)}`}function kJ($){return $.taskDelivery?` | delivery:${$.taskDelivery.status}`:""}function fJ($,Q){if(Q!=="fork")return[...$];return $.filter((Y)=>Y.relationType!=="subagent")}function vJ($){return{title:$==="fork"?"选择要 fork 的会话:":"选择要恢复的会话:",instructions:"(Left/Right to page | Up/Down to select | Enter to confirm | Esc to cancel)"}}import{jsxDEV as d0}from"react/jsx-dev-runtime";function BX($){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 wX($){return HX($)}function bX($){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 AX=({isSelected:$})=>d0(n$,{marginRight:1,children:d0(b1,{color:$?"cyan":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),PX=({isSelected:$,label:Q})=>d0(b1,{color:$?"cyan":"white",bold:$,children:Q},void 0,!1,void 0,this),B8=20,DJ=({intent:$,sessions:Q,onSelect:Y,onCancel:J})=>{let[Z,X]=T2([]),[G,q]=T2(!1),[K,U]=T2(0),[F,O]=T2(!1),W=SJ(!1),z=SJ(!0);sQ(()=>{return z.current=!0,()=>{z.current=!1}},[]);let _=e0()==="session-selector",H=v0(!1);WX((A,T)=>{if(T.ctrl&&A==="c"||T.meta&&A==="c"){H();return}if(W.current)return;if(T.escape&&J){J();return}if(T.leftArrow||A==="h"||A==="H"){if(K>0)U((y)=>y-1);return}if(T.rightArrow||A==="l"||A==="L"){if(K<M-1)U((y)=>y+1);return}},{isActive:_}),sQ(()=>{if(Q){X(Q);return}(async()=>{q(!0);try{let T=await P0.listSessions({includeSubagents:!1});X(T)}catch(T){console.error("[SessionSelector] Failed to load sessions:",T),X([])}finally{q(!1)}})()},[Q]);let C=o$(()=>fJ(Q||Z,$),[$,Q,Z]),N=o$(()=>vJ($),[$]),v=o$(()=>{return C.map((A)=>{let T=wX(A.taskSourceProjectPath??A.projectPath),y=BX(A.lastMessageTime),L=TJ(A),f=`[${bX(A.taskStatus)}]`,h=A.gitBranch?` (${A.gitBranch})`:"",t=A.hasErrors?" [!]":"",l=A.taskRetriedFrom?` ↻ retry:${A.taskRetriedFrom.sessionId.slice(0,6)}`:A.relationType==="subagent"?" ↳ subagent":A.relationType==="fork"?" ↳ fork":"",a=A.taskIsolation==="worktree"?` | wt:${A.taskWorktreeBranch??"managed"}`:A.taskIsolation==="local"?" | local":"",I=A.taskDiffStat?` | ${A.taskDiffStat.changedFiles} files +${A.taskDiffStat.additions} -${A.taskDiffStat.deletions}`:"",R=A.taskStatus==="queued"&&A.taskQueuePosition?` | queue:${A.taskQueuePosition}/${A.taskQueueDepth??A.taskQueuePosition}`:"",S=kJ(A);return{key:IJ(A),label:`${f} ${L} · ${y} | ${T}${h} | ${A.messageCount} 条消息${a}${R}${I}${S}${t}${l}`,value:A}})},[C]),M=o$(()=>Math.max(1,Math.ceil(v.length/B8)),[v.length]),w=o$(()=>{let A=K*B8;return v.slice(A,A+B8)},[v,K]),k=o$(()=>({start:K*B8+1,end:Math.min((K+1)*B8,v.length)}),[K,v.length]);sQ(()=>{U(0)},[C.length]);let P=(A)=>{if(W.current)return;W.current=!0,O(!0);let T=()=>{if(!z.current)return;W.current=!1,O(!1)};Promise.resolve().then(()=>Y(A.value)).then(T,T)};if(G)return d0(n$,{flexDirection:"column",paddingX:2,paddingY:1,children:d0(b1,{children:"正在加载会话列表..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(C.length===0)return d0(n$,{flexDirection:"column",paddingX:2,paddingY:1,children:[d0(b1,{color:"yellow",children:"没有找到历史会话"},void 0,!1,void 0,this),d0(b1,{dimColor:!0,children:[`
158
- `,"提示: 开始一次对话后,会话历史将保存到 ~/.blade/projects/"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this);return d0(n$,{flexDirection:"column",paddingX:2,paddingY:1,children:[d0(b1,{bold:!0,color:"cyan",children:N.title},void 0,!1,void 0,this),d0(b1,{dimColor:!0,children:[`
154
+ `),_.push(EQ);let F=N0.renderedLineCount-G.length;_.push(L2(F))}_.push(c9),process.stdout.write(_.join("")),N0.renderedLineCount=G.length,N0.lastRenderedLines=G}function c1(){if(!N0.active)return;if(N0.renderedLineCount>0){let $=[];$.push(p9),$.push(L2(N0.renderedLineCount)),$.push("\r");for(let Q=0;Q<N0.renderedLineCount;Q++)if($.push(EQ),Q<N0.renderedLineCount-1)$.push(`
155
+ `);if(N0.renderedLineCount>1)$.push(L2(N0.renderedLineCount-1)),$.push("\r");$.push(c9),process.stdout.write($.join(""))}N0.active=!1,N0.renderedLineCount=0,N0.lastRenderedLines=[],N0.isFirstRender=!0}function f1(){return N0.active}import{Box as K5,Text as d9}from"ink";import q5 from"react";import{jsxDEV as gQ}from"react/jsx-dev-runtime";var mQ=q5.memo(({collapsedCount:$})=>{let Q=A0();if($<=0)return null;let Y=Q.colors.text.muted;return gQ(K5,{flexDirection:"row",marginBottom:1,children:[gQ(d9,{color:Y,children:[">"," ",$," 条历史消息"]},void 0,!0,void 0,this),gQ(d9,{color:Y,children:" [Ctrl+O 展开]"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});mQ.displayName="CollapsedHistorySummary";import{Box as F8,Text as H8}from"ink";import U5 from"ink-big-text";import O5 from"ink-gradient";import z5 from"react";import{jsxDEV as B1}from"react/jsx-dev-runtime";var a9=z5.memo(()=>{return B1(F8,{flexDirection:"column",paddingX:2,paddingTop:1,paddingBottom:1,children:[B1(F8,{flexDirection:"column",children:B1(O5,{name:"pastel",children:B1(U5,{text:"BLADE",font:"block"},void 0,!1,void 0,this)},void 0,!1,void 0,this)},void 0,!1,void 0,this),B1(F8,{marginBottom:1,children:B1(H8,{color:"white",dimColor:!0,children:r9()},void 0,!1,void 0,this)},void 0,!1,void 0,this),B1(F8,{flexDirection:"column",marginBottom:1,children:[B1(F8,{marginBottom:1,children:B1(H8,{color:"white",bold:!0,children:"使用指南:"},void 0,!1,void 0,this)},void 0,!1,void 0,this),B1(H8,{color:"white",children:"1. 输入问题、编辑文件或运行命令"},void 0,!1,void 0,this),B1(H8,{color:"white",children:"2. 使用 /init 创建项目配置文件"},void 0,!1,void 0,this),B1(H8,{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 w2,Text as pQ}from"ink";import o9 from"react";import{jsxDEV as Y$}from"react/jsx-dev-runtime";var i9=o9.memo(({tasks:$,visible:Q=!0,compact:Y=!1})=>{let{colors:J}=A0();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$(w2,{flexDirection:"column",borderStyle:"single",borderColor:J.border.light,paddingX:1,paddingY:Y?0:1,marginBottom:1,children:[Y$(w2,{marginBottom:Y?0:1,children:[Y$(pQ,{dimColor:!0,children:"Tasks "},void 0,!1,void 0,this),Y$(pQ,{color:J.text.muted,children:[Z.completed,"/",Z.total]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Y$(w2,{flexDirection:"column",children:$.map((X,G)=>Y$(_5,{task:X,compact:Y},X.id||G,!1,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}),_5=o9.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$(w2,{paddingY:Q?0:0,children:Y$(pQ,{dimColor:J,children:[Y," ",Z]},void 0,!0,void 0,this)},void 0,!1,void 0,this)});import{Box as cQ,Text as o$}from"ink";import N5,{useMemo as n9}from"react";import{jsxDEV as x1}from"react/jsx-dev-runtime";function F5($,Q=60){if(!$)return"";let Y=$.split(`
156
+ `)[0]||"";if(Y.length<=Q)return Y;return`${Y.slice(0,Q)}...`}function H5($){if(!$)return 0;return $.split(`
157
+ `).length}var xQ=N5.memo(({content:$,isStreaming:Q=!1,isExpanded:Y})=>{let J=A0(),Z=n9(()=>H5($),[$]),X=n9(()=>F5($),[$]),G=J.colors.info,q=J.colors.muted;return x1(cQ,{flexDirection:"column",marginBottom:1,children:[x1(cQ,{flexDirection:"row",children:[x1(o$,{color:G,children:Y?"v":">"},void 0,!1,void 0,this),x1(o$,{children:" "},void 0,!1,void 0,this),x1(o$,{color:q,children:["Thinking",Q?"...":` (${Z} lines)`]},void 0,!0,void 0,this),!Y&&!Q&&X&&x1(o$,{color:q,children:[" - ",X]},void 0,!0,void 0,this),x1(o$,{color:q,dimColor:!0,children:[" ","[Ctrl+T]"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Y&&$&&x1(cQ,{marginLeft:2,marginTop:1,borderStyle:"round",borderColor:"gray",paddingX:1,paddingY:0,children:x1(o$,{color:q,children:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});xQ.displayName="ThinkingBlock";import{jsxDEV as o0}from"react/jsx-dev-runtime";var s9=B5.memo(()=>{let $=Q4(),Q=M4(),Y=C4(),J=I4(),Z=s1(),X=N4(),G=L4(),q=T8(),K=R4(),U=y4(),W=J4(),O=k4(),H=T4(),z=g$(),w=m9(),{stdout:_}=L5(),F=n1(),[C,N]=lQ(null),[S,M]=lQ([]),[B,k]=lQ(new Set),P=X$(H),A=X$(null),T=X$(0),y=X$(0),L=X$(new Set),f=X$(new Set),h=X$([]),s=X$(null);u1(()=>{if(P.current!==H){if(f1())c1();if(_)_.write(b2.clearTerminal);F.incrementClearCount(),P.current=H}},[H,_,F]);let l=$,a=J;u1(()=>{if(!J||Z){s.current=null;return}if(s.current===J)return;if(s.current=J,f1())c1();if(_)_.write(b2.eraseScreen+b2.cursorTo(0,0));L.current=new Set,f.current=new Set(l.filter((j)=>j.role==="tool").map((j)=>j.id)),A.current=null,T.current=0,y.current=0,h.current=[],M([]),k(new Set),F.incrementClearCount(),F.clearFinalizingStreamingMessageId()},[J,Z,_,F,l]);let I=Q??J;u1(()=>{if(f1())c1();A.current=null,T.current=0,y.current=0,L.current=new Set,f.current=new Set(l.filter((j)=>j.role==="tool").map((j)=>j.id)),h.current=[],M([]),k(new Set)},[W]),u1(()=>{if(!I)return;if(A.current===I)return;A.current=I,T.current=0,y.current=0,f.current=new Set(l.filter((j)=>j.role==="tool").map((j)=>j.id)),h.current=[],M([])},[I,l]),u1(()=>{if(!I)return;let j=dQ(I);if(!j||j.length<=T.current)return;let E=j.slice(T.current);T.current=j.length;let m=E,X0=h.current;if(X0.length>0)if(m.some((c0)=>c0.type!=="empty"))m=[...X0,...m],h.current=[];else{h.current=[...X0,...m];return}let J0=m.length;while(J0>0&&m[J0-1].type==="empty")J0-=1;if(J0!==m.length)h.current=m.slice(J0),m=m.slice(0,J0);if(m.length===0)return;let w0=y.current;y.current+=1;let k0=w0>0;if(f1())c1();k((c0)=>{if(!I||c0.has(I))return c0;let h0=new Set(c0);return h0.add(I),h0}),M((c0)=>[...c0,o0(Z$,{flexDirection:"column",children:o0(J$,{content:"",role:"assistant",terminalWidth:z,isPending:!1,hidePrefix:k0,noMargin:!0,blocksOverride:m,renderCodeBlocksAsPlainText:!1},void 0,!1,void 0,this)},`streaming-${I}-${w0}`,!1,void 0,this)])},[I,Y.version,z,W]),u1(()=>{if(!I)return;let j=f.current,E=l.filter((m)=>m.role==="tool"&&!j.has(m.id)&&!L.current.has(m.id));if(E.length===0)return;if(f1())c1();for(let m of E)L.current.add(m.id);M((m)=>[...m,...E.map((X0)=>o0(Z$,{flexDirection:"column",children:o0(J$,{content:X0.content,role:X0.role,terminalWidth:z,metadata:X0.metadata,isPending:!1,messageId:X0.id},void 0,!1,void 0,this)},`streaming-tool-${X0.id}`,!1,void 0,this))])},[I,l,z]),u1(()=>{if(!I){if(f1())c1();return}if(!f1())x9(z,w);else u9(z,w);let j=t9(I);if(!j||j.lines.length===0)return;let m=Math.max(1,w-8),X0=Math.max(0,j.lines.length-m),J0=j.lines.slice(-m),w0=(dQ(I)?.length??0)>0;l9(J0,X0,j.mode,w0)},[I,Y.version,w,z]),u1(()=>{if(!I&&f1())c1()},[I]),u1(()=>{if(C===null&&l.length>O){if(N(l.length),f1())c1();if(_)_.write(b2.clearTerminal);F.incrementClearCount()}},[l.length,O,C,_,F]);let R=uQ(()=>{return X.some((j)=>j.status==="pending"||j.status==="in_progress")},[X]),v=H?0:C??0,b=v,V=uQ(()=>{let j=[];if(j.push(o0(a9,{},"header",!1,void 0,this)),b>0)j.push(o0(mQ,{collapsedCount:b},"collapsed-summary",!1,void 0,this));for(let E=v;E<l.length;E++){let m=l[E];if(a&&m.id===a)continue;if(m.role==="tool"&&L.current.has(m.id))continue;if(m.role==="assistant"&&B.has(m.id))continue;j.push(o0(Z$,{flexDirection:"column",children:o0(J$,{content:m.content,role:m.role,terminalWidth:z,metadata:m.metadata,isPending:!1,messageId:m.id},void 0,!1,void 0,this)},m.id,!1,void 0,this))}return j},[l,v,b,z,a,B]),p=uQ(()=>S.length>0?[...V,...S]:V,[V,S]);return o0(Z$,{flexDirection:"column",paddingX:2,children:o0(Z$,{flexDirection:"column",children:[o0(W5,{items:p,children:(j)=>j},W,!1,void 0,this),K&&o0(Z$,{marginBottom:1,children:o0(xQ,{content:K,isStreaming:Z,isExpanded:U},void 0,!1,void 0,this)},void 0,!1,void 0,this),G&&R&&o0(Z$,{marginTop:1,children:o0(i9,{tasks:X,visible:!0,compact:!1},void 0,!1,void 0,this)},void 0,!1,void 0,this),q.map((j,E)=>o0(Z$,{flexDirection:"column",children:o0(J$,{content:j.displayText,role:"user",terminalWidth:z},void 0,!1,void 0,this)},`pending-${E}`,!1,void 0,this))]},void 0,!0,void 0,this)},void 0,!1,void 0,this)});import{useMemoizedFn as A2,useMount as w5}from"ahooks";import{Box as w1,Text as H0,useFocus as b5,useFocusManager as A5,useInput as P5}from"ink";import R5 from"ink-select-input";import{memo as y5,useMemo as M5,useState as P2}from"react";import{jsxDEV as e,Fragment as T5}from"react/jsx-dev-runtime";var C5=({isSelected:$})=>e(w1,{marginRight:1,children:e(H0,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),I5=({isSelected:$,label:Q})=>e(H0,{bold:$,color:$?"yellow":void 0,children:Q},void 0,!1,void 0,this),e9=y5(({onClose:$,onEdit:Q})=>{let Y=B4(),J=I8()??"",{isFocused:Z}=b5({id:"model-selector"}),X=A5(),[G,q]=P2(""),[K,U]=P2(!1),[W,O]=P2(null),H=S0(!1),[z]=P2(()=>{let P=process.stdout?.columns||80;return Math.max(20,P-8)});w5(()=>{if(X?.focus("model-selector"),Y.length>0)q(Y[0].id)}),P5((P,A)=>{if(K)return;if(A.ctrl&&P==="c"||A.meta&&P==="c"){H();return}if(A.escape){$();return}if(!Z)return;if(P==="d"||P==="D"){_();return}if((P==="e"||P==="E")&&Q)F()},{isActive:!0});let w=A2(async(P)=>{if(K)return;let A=P.value;if(A===J){$();return}U(!0),O(null);try{await m0().setCurrentModel(A),$()}catch(T){O(T.message),U(!1)}}),_=A2(async()=>{if(K||G===J)return;U(!0),O(null);try{if(await m0().removeModel(G),Y.length<=1)$()}catch(P){O(P.message)}finally{U(!1)}}),F=A2(()=>{if(K||!Q)return;let P=Y.find((A)=>A.id===G);if(!P)return;Q(P)}),C=A2((P)=>{q(P.value)}),N=M5(()=>{return Y.find((P)=>P.id===G)},[Y,G]),S=N?R2()?.modelProviders[N.provider]:void 0,M=Y.map((P)=>{let A=P.id===J?" (当前)":"";return{label:rQ(P)+A,value:P.id}}),B=G===J;return e(w1,{flexDirection:"column",borderStyle:"round",borderColor:"gray",padding:1,width:"100%",children:[e(w1,{flexDirection:"row",justifyContent:"space-between",marginBottom:1,children:[e(H0,{bold:!0,color:"cyan",children:"模型管理"},void 0,!1,void 0,this),e(H0,{dimColor:!0,children:[K?"处理中...":B?"Enter=关闭 • E=编辑 • Esc=取消":"Enter=切换 • D=删除 • E=编辑 • Esc=取消"," • Ctrl+C=退出"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),e(w1,{flexDirection:"row",children:[e(w1,{flexDirection:"column",flexGrow:2,marginRight:2,borderStyle:"single",borderColor:"gray",padding:1,children:[e(H0,{dimColor:!0,children:["已配置模型 (",Y.length,")"]},void 0,!0,void 0,this),e(w1,{marginTop:1,children:e(R5,{items:M,onSelect:w,onHighlight:C,indicatorComponent:C5,itemComponent:I5},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),e(w1,{flexDirection:"column",flexGrow:3,borderStyle:"single",borderColor:"gray",padding:1,children:[e(H0,{dimColor:!0,children:"模型详情"},void 0,!1,void 0,this),e(w1,{marginY:1,children:e(H0,{color:B?"green":"yellow",children:B?"* 当前使用":"* 可切换"},void 0,!1,void 0,this)},void 0,!1,void 0,this),N?e(w1,{flexDirection:"column",children:[e(H0,{children:[e(H0,{dimColor:!0,children:"名称: "},void 0,!1,void 0,this),e(H0,{bold:!0,color:"cyan",children:rQ(N)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),e(H0,{children:[e(H0,{dimColor:!0,children:"Provider: "},void 0,!1,void 0,this),e(H0,{bold:!0,children:S?.name??N.provider},void 0,!1,void 0,this)]},void 0,!0,void 0,this),S&&e(T5,{children:[e(H0,{children:[e(H0,{dimColor:!0,children:"Channel ID: "},void 0,!1,void 0,this),e(H0,{children:N.provider},void 0,!1,void 0,this)]},void 0,!0,void 0,this),e(H0,{children:[e(H0,{dimColor:!0,children:"Wire API: "},void 0,!1,void 0,this),e(H0,{children:S.wireApi},void 0,!1,void 0,this)]},void 0,!0,void 0,this),e(H0,{children:[e(H0,{dimColor:!0,children:"Endpoint: "},void 0,!1,void 0,this),e(H0,{color:"blueBright",children:S.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),e(H0,{children:[e(H0,{dimColor:!0,children:"Model: "},void 0,!1,void 0,this),e(H0,{bold:!0,children:N.model},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N.overrides?.baseUrl&&e(H0,{children:[e(H0,{dimColor:!0,children:"Base URL override: "},void 0,!1,void 0,this),e(H0,{color:"blueBright",children:N.overrides.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this),e(H0,{children:[e(H0,{dimColor:!0,children:"Context Window: "},void 0,!1,void 0,this),e(H0,{children:h1().resolveConfig(N).contextWindow},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this):e(H0,{dimColor:!0,children:"请选择一个模型查看详情"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),W&&e(w1,{marginTop:1,children:e(H0,{color:"red",children:W},void 0,!1,void 0,this)},void 0,!1,void 0,this),e(w1,{justifyContent:"center",marginTop:1,children:e(H0,{dimColor:!0,children:"─".repeat(z)},void 0,!1,void 0,this)},void 0,!1,void 0,this),e(w1,{justifyContent:"center",children:e(H0,{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 aQ}from"ahooks";import{Box as i5,Text as oQ,useInput as n5}from"ink";import{useState as M$}from"react";import{Box as R$,Text as l1,useInput as k5}from"ink";import f5 from"ink-text-input";import{jsxDEV as i0}from"react/jsx-dev-runtime";var $J=({provider:$,value:Q,onChange:Y,onSubmit:J,onCancel:Z,error:X})=>{return k5((G,q)=>{if(q.escape)Z()}),i0(R$,{flexDirection:"column",children:[i0(R$,{marginBottom:1,children:i0(l1,{bold:!0,color:"blue",children:"Step 2: 输入 API Key"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i0(R$,{marginBottom:1,children:i0(l1,{children:["Provider: ",i0(l1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),i0(R$,{marginBottom:1,children:i0(l1,{dimColor:!0,children:"API 密钥将存储在 ~/.blade/auth.json(权限 600),不会写入模型配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i0(R$,{children:[i0(l1,{bold:!0,color:"cyan",children:[">"," "]},void 0,!0,void 0,this),i0(f5,{value:Q,onChange:Y,onSubmit:J,placeholder:"sk-...",mask:"*"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X&&i0(R$,{marginTop:1,children:i0(l1,{color:"red",children:X},void 0,!1,void 0,this)},void 0,!1,void 0,this),i0(R$,{marginTop:1,children:i0(l1,{dimColor:!0,children:["输入完成后按 ",i0(l1,{bold:!0,children:"Enter"},void 0,!1,void 0,this),",",i0(l1,{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 y2,Text as G$,useInput as S5}from"ink";import v5 from"ink-text-input";import{useState as M2}from"react";import{jsxDEV as _1}from"react/jsx-dev-runtime";var C2=["id","name","baseUrl","model"];function QJ($){switch($){case"id":return"Channel ID";case"name":return"Channel name";case"baseUrl":return"Base URL";case"model":return"Model ID"}}function D5($,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 V5($,Q){let Y=$.id.trim(),J={name:$.name.trim()||Y,baseUrl:$.baseUrl.trim(),wireApi:Q},Z=YJ(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 ZJ=({wireApi:$,initialConfig:Q,onSubmit:Y,onCancel:J})=>{let Z={id:Q?.provider??"",name:Q?.modelProvider?.name??"",baseUrl:Q?.modelProvider?.baseUrl??"",model:Q?.model??""},[X,G]=M2(Q?3:0),[q,K]=M2(Q?.model??""),[U,W]=M2(Z),[O,H]=M2(),z=C2[X];S5((_,F)=>{if(!F.escape)return;if(H(void 0),X===0){J();return}let C=X-1,N=C2[C];G(C),K(U[N])});let w=(_)=>{let F=_.trim();if(z==="id"&&!JJ.test(F)){H("Channel ID 必须以小写字母开头,且仅包含小写字母、数字、.、_ 或 -");return}if(z==="baseUrl")try{let N=new URL(F);if(!["http:","https:"].includes(N.protocol))throw Error()}catch{H("Base URL 必须是绝对 HTTP(S) URL");return}if(z==="model"&&!F){H("Model ID 不能为空");return}let C={...U,[z]:z==="name"&&!F?U.id:F};if(W(C),H(void 0),X===C2.length-1){try{Y(V5(C,$))}catch(N){H(N instanceof Error?N.message:"渠道配置无效")}return}G(X+1),K("")};return _1(y2,{flexDirection:"column",children:[_1(y2,{marginBottom:1,children:_1(G$,{bold:!0,color:"blue",children:"配置自定义 Provider 渠道"},void 0,!1,void 0,this)},void 0,!1,void 0,this),_1(G$,{dimColor:!0,children:["Protocol:"," ",$==="anthropic-messages"?"Anthropic Messages":"OpenAI Chat Completions"]},void 0,!0,void 0,this),C2.slice(0,X).map((_)=>_1(G$,{children:[QJ(_),": ",_1(G$,{color:"cyan",children:U[_]},void 0,!1,void 0,this)]},_,!0,void 0,this)),_1(y2,{marginTop:1,children:[_1(G$,{bold:!0,children:[QJ(z),": "]},void 0,!0,void 0,this),_1(v5,{value:q,onChange:(_)=>{K(_),H(void 0)},onSubmit:w,placeholder:D5(z,$,U.id)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z==="name"&&_1(G$,{dimColor:!0,children:"留空使用 Channel ID"},void 0,!1,void 0,this),O&&_1(G$,{color:"red",children:O},void 0,!1,void 0,this),_1(y2,{marginTop:1,children:_1(G$,{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 KJ,useState as i$}from"react";var qJ=()=>{let[$,Q]=i$([]),[Y,J]=i$(!0),[Z,X]=i$(null);return KJ(()=>{(async()=>{try{Q(await XJ())}catch(q){X(q instanceof Error?q.message:"加载 Provider 列表失败")}finally{J(!1)}})()},[]),{providers:$,isLoading:Y,error:Z}},UJ=($)=>{let[Q,Y]=i$([]),[J,Z]=i$(!1),[X,G]=i$(null);return KJ(()=>{if(!$){Y([]);return}(async()=>{Z(!0),G(null);try{Y(await GJ($))}catch(K){G(K instanceof Error?K.message:"加载模型列表失败")}finally{Z(!1)}})()},[$]),{models:Q,isLoading:J,error:X}};import{Box as d1,Text as M1,useInput as j5}from"ink";import h5 from"ink-select-input";import E5 from"ink-text-input";import{useMemo as OJ,useState as g5}from"react";import{jsxDEV as E0,Fragment as x5}from"react/jsx-dev-runtime";var m5=({isSelected:$})=>E0(d1,{marginRight:1,children:E0(M1,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),p5=($)=>{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(" ")},c5=({isSelected:$,label:Q})=>E0(M1,{bold:$,color:$?"yellow":void 0,children:Q},void 0,!1,void 0,this),zJ=({provider:$,models:Q,isLoading:Y,error:J,onSelect:Z,onCancel:X})=>{let[G,q]=g5("");j5((W,O)=>{if(O.escape)if(G)q("");else X()});let K=OJ(()=>{if(!G)return Q;let W=G.toLowerCase();return Q.filter((O)=>O.name.toLowerCase().includes(W)||O.id.toLowerCase().includes(W))},[Q,G]),U=OJ(()=>K.map((W)=>({key:W.id,label:p5(W),value:W})),[K]);if(Y)return E0(d1,{flexDirection:"column",children:E0(M1,{color:"yellow",children:["正在加载 ",$.name," 模型列表..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this);if(J)return E0(d1,{flexDirection:"column",children:[E0(M1,{color:"red",children:J},void 0,!1,void 0,this),E0(M1,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return E0(d1,{flexDirection:"column",children:[E0(d1,{marginBottom:1,children:E0(M1,{bold:!0,color:"blue",children:"Step 3: 选择模型"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E0(d1,{marginBottom:1,children:E0(M1,{children:["Provider: ",E0(M1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),E0(x5,{children:[E0(d1,{marginBottom:1,children:[E0(M1,{color:"cyan",children:"> "},void 0,!1,void 0,this),E0(E5,{value:G,onChange:q,placeholder:`搜索 ${Q.length} 个模型...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E0(d1,{marginBottom:1,children:E0(M1,{dimColor:!0,children:"模型元数据来自内置 catalog"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E0(d1,{flexDirection:"column",height:12,children:E0(h5,{items:U,onSelect:(W)=>Z(W.value),indicatorComponent:m5,itemComponent:c5,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),K.length===0&&E0(M1,{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 y$,Text as K$,useInput as u5}from"ink";import l5 from"ink-select-input";import d5 from"ink-text-input";import{useMemo as _J,useState as r5}from"react";import{jsxDEV as n0}from"react/jsx-dev-runtime";var a5=({isSelected:$})=>n0(y$,{marginRight:1,children:n0(K$,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),o5=({isSelected:$,label:Q})=>n0(K$,{bold:$,color:$?"yellow":void 0,children:Q},void 0,!1,void 0,this),NJ=({providers:$,isLoading:Q,error:Y,onSelect:J,onCancel:Z})=>{let[X,G]=r5("");u5((U,W)=>{if(W.escape)if(X)G("");else Z()});let q=_J(()=>{if(!X)return $;let U=X.toLowerCase();return $.filter((W)=>W.name.toLowerCase().includes(U)||W.id.toLowerCase().includes(U))},[$,X]),K=_J(()=>q.map((U)=>({key:U.id,label:`${U.name} - ${U.modelCount} models${U.configured?" [configured]":""}`,value:U})),[q]);if(Q)return n0(y$,{flexDirection:"column",children:n0(K$,{color:"yellow",children:"正在加载 Provider 列表..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Y)return n0(y$,{flexDirection:"column",children:[n0(K$,{color:"red",children:Y},void 0,!1,void 0,this),n0(K$,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return n0(y$,{flexDirection:"column",children:[n0(y$,{marginBottom:1,children:n0(K$,{bold:!0,color:"blue",children:"Step 1: 选择 API 提供商"},void 0,!1,void 0,this)},void 0,!1,void 0,this),n0(y$,{marginBottom:1,children:[n0(K$,{color:"cyan",children:"> "},void 0,!1,void 0,this),n0(d5,{value:X,onChange:G,placeholder:`搜索 ${$.length} 个 Provider...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),n0(y$,{flexDirection:"column",height:12,children:n0(l5,{items:K,onSelect:(U)=>J(U.value),indicatorComponent:a5,itemComponent:o5,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),q.length===0&&n0(K$,{color:"yellow",children:"未找到匹配的 Provider,按 Esc 清除搜索"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};function FJ($){if($==="custom")return"provider";if($==="model")return"provider";if($==="credential")return"model";return}import{jsxDEV as q$}from"react/jsx-dev-runtime";var iQ=({mode:$,initialConfig:Q,modelId:Y,onComplete:J,onCancel:Z})=>{let[X,G]=M$("provider"),[q,K]=M$(),[U,W]=M$(),[O,H]=M$(),[z,w]=M$(""),[_,F]=M$(),[C,N]=M$(!1),S=qJ(),M=UJ(q?.id),B=S0(!1);n5((T,y)=>{if(y.ctrl&&T==="c"||y.meta&&T==="c")$==="setup"?B():Z()});let k=aQ(async(T)=>{if(!q)return;let y=O??(U?{provider:q.id,model:U.id,displayName:Q?.displayName}:void 0);if(!y)return;N(!0),F(void 0);try{if(y.modelProvider)h1().registerModelProvider(y.provider,y.modelProvider,[y.model]);if(T?.trim())await h1().setApiKey(y.provider,T.trim());let L={displayName:y.displayName,provider:y.provider,model:y.model,overrides:y.overrides};if($==="setup")await J(y);else if($==="add"){let f=y.modelProvider?await m0().addModelWithProvider(L,y.modelProvider):await m0().addModel(L);await m0().setCurrentModel(f.id),await J(y)}else if(Y){if(y.modelProvider)await m0().updateModelWithProvider(Y,L,y.modelProvider);else await m0().updateModel(Y,L);await J(y)}}catch(L){if(y.modelProvider){await h1().credentials.delete(y.provider);let f=R2();h1().configureModelProviders(f?.modelProviders??{},f?.models??[])}F(L instanceof Error?L.message:"保存配置失败"),N(!1)}}),P=aQ((T)=>{if(W(T),q?.configured)k();else if(q?.supportsApiKey)G("credential");else F(`${q?.name??"Provider"} 需要 OAuth 或环境凭证,请先在外部完成认证`)}),A=aQ(()=>{if(F(void 0),X==="credential"&&O){G("custom");return}let T=FJ(X);if(T)G(T)});return q$(i5,{flexDirection:"column",padding:1,children:[q$(oQ,{bold:!0,color:"blue",children:$==="edit"?"编辑模型":"添加模型"},void 0,!1,void 0,this),X==="provider"&&q$(NJ,{...S,onSelect:(T)=>{K(T),W(void 0),H(void 0),G(T.factoryWireApi?"custom":"model")},onCancel:$==="setup"?()=>{return}:Z},void 0,!1,void 0,this),X==="custom"&&q?.factoryWireApi&&q$(ZJ,{wireApi:q.factoryWireApi,initialConfig:O,onSubmit:(T)=>{H(T),G("credential")},onCancel:A},void 0,!1,void 0,this),X==="model"&&q&&q$(zJ,{provider:q,...M,onSelect:P,onCancel:A},void 0,!1,void 0,this),X==="credential"&&q&&q$($J,{provider:q,value:z,onChange:w,onSubmit:()=>void k(z),onCancel:A,error:_},void 0,!1,void 0,this),C&&q$(oQ,{color:"yellow",children:"正在保存配置..."},void 0,!1,void 0,this),_&&X!=="credential"&&q$(oQ,{color:"red",children:_},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as W8}from"ahooks";import{promises as BJ}from"fs";import{Box as N1,Text as V0,useInput as t5}from"ink";import HJ from"ink-select-input";import s5 from"ink-text-input";import e5 from"os";import I2 from"path";import{useEffect as $X,useMemo as T2,useRef as QX,useState as U$}from"react";import{jsxDEV as U0}from"react/jsx-dev-runtime";var L8=[{key:"allow",label:"Allow"},{key:"ask",label:"Ask"},{key:"deny",label:"Deny"},{key:"info",label:"Info"}],JX={allow:"Add a new rule...",ask:"Add a new rule...",deny:"Add a new rule..."},YX={allow:"Allow permission rules",ask:"Ask permission rules",deny:"Deny permission rules"},WJ={project:"[项目共享配置]",global:"[用户全局配置]",local:"[本地配置]"},ZX=["project","global","local"],XX={allow:[],ask:[],deny:[]},GX={localExists:!1,projectExists:!1,globalExists:!1},LJ={allow:[],ask:[],deny:[]};function KX($){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 qX($){try{let Q=await BJ.readFile($,"utf-8"),Y=JSON.parse(Q);return{exists:!0,raw:Y,permissions:KX(Y)}}catch(Q){if(Q.code==="ENOENT")return{exists:!1,raw:{},permissions:{...LJ}};return console.warn(`[PermissionsManager] Failed to read ${$}:`,Q),{exists:!0,raw:{},permissions:{...LJ}}}}function UX($,Q){let Y=$.padEnd(32," "),J=Q==="local"?`${WJ[Q]} <- 可删除`:WJ[Q];return`${Y} ${J}`}var wJ=({onClose:$})=>{let Y=e0()==="permissions-manager",J=S0(!1),[Z,X]=U$(0),G=L8[Z].key,[q,K]=U$(XX),[U,W]=U$(GX),[O,H]=U$(!0),[z,w]=U$("list"),[_,F]=U$(""),[C,N]=U$(null),[S,M]=U$(null),B=QX(!1),k=T2(()=>I2.join(l0(),".blade","settings.local.json"),[]),P=T2(()=>I2.join(l0(),".blade","settings.json"),[]),A=T2(()=>I2.join(e5.homedir(),".blade","settings.json"),[]),T=W8(async()=>{H(!0);let j=await Promise.all([{source:"local",path:k},{source:"project",path:P},{source:"global",path:A}].map(async({source:J0,path:w0})=>{let k0=await qX(w0);return{source:J0,path:w0,...k0}})),E={localExists:j.find((J0)=>J0.source==="local")?.exists??!1,projectExists:j.find((J0)=>J0.source==="project")?.exists??!1,globalExists:j.find((J0)=>J0.source==="global")?.exists??!1};W(E);let m={allow:[],ask:[],deny:[]},X0=Object.fromEntries(j.map((J0)=>[J0.source,J0]));["allow","ask","deny"].forEach((J0)=>{ZX.forEach((w0)=>{(X0[w0]?.permissions[J0]??[]).forEach((c0,h0)=>{let H1={key:`${w0}:${h0}:${c0}`,rule:c0,source:w0};m[J0].push(H1)})})}),K(m),H(!1)});$X(()=>{T()},[T]);let y=W8(async(p,j)=>{try{let E=I2.join(l0(),".blade","settings.local.json"),m={allow:[],ask:[],deny:[]};try{let J0=await BJ.readFile(E,"utf-8"),k0=JSON.parse(J0).permissions||{};m={allow:Array.isArray(k0.allow)?k0.allow:[],ask:Array.isArray(k0.ask)?k0.ask:[],deny:Array.isArray(k0.deny)?k0.deny:[]}}catch(J0){}let X0=j(m);await m0().updateConfig({permissions:X0},{scope:"local",immediate:!0}),await T()}catch(E){throw console.error("[PermissionsManager] 修改权限规则失败:",E),E}});t5((p,j)=>{if(j.ctrl&&p==="c"||j.meta&&p==="c"){J();return}if(z==="locked"){if(B.current){B.current=!1;return}w("list"),N(null),M(null);return}if(j.escape){if(z==="list"||G==="info")$();else w("list"),F(""),N(null),M(null);return}if(z==="list"){if(j.tab&&j.shift)X((E)=>(E-1+L8.length)%L8.length);else if(j.tab)X((E)=>(E+1)%L8.length);else if(p?.toLowerCase()==="q")$()}},{isActive:Y});let L=W8((p)=>{let j=p.value;if(G==="info")return;if(j.type==="add"){w("add"),F(""),M(null);return}if(j.entry.source!=="local"){w("locked"),B.current=!0,N({tab:G,entry:j.entry}),M({type:"error",text:j.entry.source==="project"?"此规则定义在项目共享配置中,无法在此删除。":"此规则来自用户全局配置,无法在此删除。"});return}w("confirm-delete"),N({tab:G,entry:j.entry}),M(null)}),f=W8(async()=>{if(G==="info")return;let p=_.trim();if(!p){M({type:"error",text:"Permission rule 不能为空"});return}if(q[G].map((E)=>E.rule).includes(p)){M({type:"error",text:"该规则已存在"});return}try{await y(G,(E)=>{let m={allow:[...E.allow],ask:[...E.ask],deny:[...E.deny]};return m[G]=[...new Set([...E[G],p])],m}),w("list"),F(""),M({type:"success",text:"已添加本地权限规则"})}catch(E){M({type:"error",text:`保存失败: ${E instanceof Error?E.message:"未知错误"}`})}}),h=W8(async()=>{if(!C)return;let{tab:p,entry:j}=C;try{await y(p,(E)=>{let m={allow:[...E.allow],ask:[...E.ask],deny:[...E.deny]};return m[p]=E[p].filter((X0)=>X0!==j.rule),m}),w("list"),N(null),M({type:"success",text:"已删除本地权限规则"})}catch(E){M({type:"error",text:`删除失败: ${E instanceof Error?E.message:"未知错误"}`})}}),s=T2(()=>{if(G==="info")return[];let p=G;return[{key:"add-new-rule",label:`› ${JX[p]}`,value:{type:"add"}},...q[p].map((E)=>({key:E.key,label:UX(E.rule,E.source),value:{type:"rule",entry:E}}))]},[G,q]),l=()=>U0(N1,{marginBottom:1,children:L8.map((p,j)=>U0(N1,{marginRight:2,children:U0(V0,{color:j===Z?"yellow":"gray",children:["[",p.label,"]"]},void 0,!0,void 0,this)},p.key,!1,void 0,this))},void 0,!1,void 0,this),a=()=>U0(N1,{flexDirection:"column",gap:1,children:[U0(V0,{children:"配置文件优先级(从高到低):"},void 0,!1,void 0,this),U0(N1,{flexDirection:"column",marginLeft:2,children:[U0(V0,{children:["1. .blade/settings.local.json (本地配置,不提交 Git)"," ",U.localExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),U0(V0,{children:["2. .blade/settings.json (项目配置,提交 Git)"," ",U.projectExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),U0(V0,{children:["3. ~/.blade/settings.json (用户全局配置)"," ",U.globalExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),U0(V0,{children:"说明:"},void 0,!1,void 0,this),U0(N1,{flexDirection:"column",marginLeft:2,children:[U0(V0,{children:"- /permissions 命令只管理本地配置 (.blade/settings.local.json)"},void 0,!1,void 0,this),U0(V0,{children:"- 修改全局或项目配置请直接编辑对应文件"},void 0,!1,void 0,this),U0(V0,{children:"- 本地配置不会提交到 Git"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),I=(p)=>U0(N1,{flexDirection:"column",gap:1,children:[U0(V0,{bold:!0,children:YX[p]},void 0,!1,void 0,this),U0(V0,{children:"Permission rules are a tool name, optionally followed by a specifier in parentheses."},void 0,!1,void 0,this),U0(V0,{color:"gray",children:"例如: WebFetch 或 Bash(ls:*)"},void 0,!1,void 0,this),U0(N1,{marginTop:1,children:U0(s5,{value:_,onChange:F,onSubmit:f},void 0,!1,void 0,this)},void 0,!1,void 0,this),U0(V0,{color:"gray",children:"Enter 提交 · Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),R=(p,j)=>U0(N1,{flexDirection:"column",gap:1,children:[U0(V0,{bold:!0,children:["Delete ",p," permission rule?"]},void 0,!0,void 0,this),U0(V0,{children:j.rule},void 0,!1,void 0,this),U0(V0,{color:"gray",children:"From project local settings"},void 0,!1,void 0,this),U0(V0,{children:"Are you sure you want to delete this permission rule?"},void 0,!1,void 0,this),U0(HJ,{items:[{label:"Yes",value:"yes"},{label:"No",value:"no"}],onSelect:(E)=>{if(E.value==="yes")h();else w("list"),N(null)}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),v=(p)=>U0(N1,{flexDirection:"column",gap:1,children:[U0(V0,{bold:!0,children:"Cannot delete this rule"},void 0,!1,void 0,this),U0(V0,{children:p.rule},void 0,!1,void 0,this),U0(V0,{color:"gray",children:p.source==="project"?"This rule is defined in .blade/settings.json. 请手动编辑该文件以移除规则。":"This rule is defined in ~/.blade/settings.json. 请手动编辑该文件以移除规则。"},void 0,!1,void 0,this),U0(V0,{color:"gray",children:"按任意键继续"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),b=(p)=>U0(HJ,{items:s,isFocused:z==="list",onSelect:L},void 0,!1,void 0,this),V=()=>{if(O)return U0(V0,{children:"加载中..."},void 0,!1,void 0,this);if(G==="info")return a();if(z==="add")return I(G);if(z==="confirm-delete"&&C)return R(C.tab,C.entry);if(z==="locked"&&C)return v(C.entry);return b(G)};return U0(N1,{flexDirection:"column",borderStyle:"round",borderColor:Y?"cyan":"gray",padding:1,width:80,children:[U0(V0,{color:"cyan",bold:!0,children:"权限管理器"},void 0,!1,void 0,this),l(),U0(N1,{flexDirection:"column",gap:1,children:V()},void 0,!1,void 0,this),S&&U0(N1,{marginTop:1,children:U0(V0,{color:S.type==="success"?"green":"red",children:S.text},void 0,!1,void 0,this)},void 0,!1,void 0,this),U0(N1,{marginTop:1,children:U0(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 B0,Text as Y0,useInput as OX}from"ink";import{useEffect as zX,useState as C$}from"react";import{jsxDEV as x}from"react/jsx-dev-runtime";var nQ=["local","project","global"];function CJ({workspaceRoot:$,onCancel:Q}){let Y=AJ($),J=Y.getAll(),[Z,X]=C$(0),[G,q]=C$(!1),[K,U]=C$(""),[W,O]=C$(null),[H,z]=C$("local"),[w,_]=C$(null),[F,C]=C$(0),N=Y.getBySource(),S=Y.getStats(),M=Y.getSourcePolicy(),B=S0(!1,Q);zX(()=>{let L=!0;return bJ.getInstance().loadWorkspacePluginSettingsResolution(Y.getWorkspaceRoot()).then((f)=>{if(L)_(f.settings)}).catch((f)=>{if(L)U(f instanceof Error?f.message:"无法读取插件作用域配置")}),()=>{L=!1}},[Y,F]);let k=()=>{z((L)=>{let f=nQ.indexOf(L);return nQ[(f+1)%nQ.length]}),O(null)},P=async()=>{let L=J[Z];if(!L||G)return;if(L.source==="cli"){U(`${L.manifest.name} 由 --plugin-dir 管理,不能持久化切换`);return}if(L.status==="error"){U(L.error??`${L.manifest.name} 当前不可用`);return}q(!0),U("");try{let f=await PJ(Y.getWorkspaceRoot(),L.manifest.name,L.status!=="active",H);U(f.effectiveEnabled?`已启用 ${L.manifest.name} · 生效层级 ${f.effectiveScope}`:`已禁用 ${L.manifest.name} · 生效层级 ${f.effectiveScope}`),C((h)=>h+1)}catch(f){U(f instanceof Error?f.message:String(f))}finally{q(!1)}},A=async()=>{if(G)return;q(!0),U("");try{await RJ(Y.getWorkspaceRoot()),X(0),U("插件列表已刷新"),C((L)=>L+1)}catch(L){U(L instanceof Error?L.message:String(L))}finally{q(!1)}},T=async()=>{let L=J[Z];if(!L||G)return;if(!L.installation){U(`${L.manifest.name} 不是 Blade 受管安装,不能自动更新`);return}q(!0),O(null),U("");try{let{result:f}=await yJ(Y.getWorkspaceRoot(),L.manifest.name,{trusted:!0});if(!f.success)throw Error(f.error);U(f.changed?`已更新 ${L.manifest.name} 到 ${f.installation?.revision}`:`${L.manifest.name} 已是最新版本`),C((h)=>h+1)}catch(f){U(f instanceof Error?f.message:String(f))}finally{q(!1)}},y=async()=>{let L=J[Z];if(!L||G)return;if(!L.installation){U(`${L.manifest.name} 不是 Blade 受管安装,不能自动卸载`);return}if(W!==L.manifest.name){O(L.manifest.name),U(`再次按 x 确认卸载 ${L.manifest.name}`);return}q(!0),U("");try{let{result:f}=await MJ(Y.getWorkspaceRoot(),L.manifest.name,!0);if(!f.success)throw Error(f.error);O(null),X(0),U(`已卸载 ${L.manifest.name}`),C((h)=>h+1)}catch(f){U(f instanceof Error?f.message:String(f))}finally{q(!1)}};if(OX((L,f)=>{if(f.escape)Q?.();else if(f.ctrl&&L==="c"||f.meta&&L==="c")B();else if((f.upArrow||L==="k")&&J.length>0)O(null),X((h)=>(h-1+J.length)%J.length);else if((f.downArrow||L==="j")&&J.length>0)O(null),X((h)=>(h+1)%J.length);else if(L===" "||f.return)P();else if(L==="r")A();else if(L==="s")k();else if(L==="u")T();else if(L==="x")y()}),J.length===0)return x(B0,{flexDirection:"column",paddingY:1,children:[x(B0,{marginBottom:1,children:x(Y0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(B0,{paddingLeft:2,children:x(Y0,{color:"gray",children:"没有已加载的插件"},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(B0,{marginTop:1,paddingLeft:2,flexDirection:"column",children:[x(Y0,{color:"gray",children:"插件目录位置:"},void 0,!1,void 0,this),x(Y0,{color:"gray",dimColor:!0,children:[" ","• ~/.blade/plugins/ - 用户级插件"]},void 0,!0,void 0,this),x(Y0,{color:"gray",dimColor:!0,children:[" ","• .blade/plugins/ - 项目级插件"]},void 0,!0,void 0,this),x(Y0,{color:"gray",dimColor:!0,children:[" ","• --plugin-dir - CLI 指定的插件"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(B0,{marginTop:1,paddingLeft:2,children:x(Y0,{color:"gray",children:"使用 /plugins install <url> 安装新插件"},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(B0,{marginTop:1,children:x(Y0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return x(B0,{flexDirection:"column",paddingY:1,children:[x(B0,{marginBottom:1,children:[x(Y0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this),x(Y0,{color:"gray",children:[" (共 ",S.total," 个插件)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(B0,{paddingLeft:2,marginBottom:1,children:x(Y0,{color:"gray",children:["启用: ",S.active," | 禁用: ",S.inactive," | 命令: ",S.commands," | 技能:"," ",S.skills," | 代理: ",S.agents]},void 0,!0,void 0,this)},void 0,!1,void 0,this),x(B0,{paddingLeft:2,marginBottom:1,children:x(Y0,{color:"gray",children:["来源策略: ",M.restrictToAllowedSources?"restricted":"open"," | Git SHA: ",M.requireGitCommitSha?"required":"optional"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),x(B0,{paddingLeft:2,marginBottom:1,children:x(Y0,{color:"gray",children:["写入层级: ",x(Y0,{color:"cyan",children:H},void 0,!1,void 0,this)," · 按 s 切换"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),N.cli.length>0&&x(B0,{flexDirection:"column",marginBottom:1,children:[x(B0,{paddingLeft:1,children:[x(Y0,{bold:!0,color:"magenta",children:"CLI 指定"},void 0,!1,void 0,this),x(Y0,{color:"gray",children:" (--plugin-dir)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N.cli.map((L)=>{let f=L.status==="active"?"[on]":"[off]",h=J.indexOf(L)===Z;return x(B0,{flexDirection:"column",paddingLeft:2,children:[x(Y0,{children:[x(Y0,{bold:!0,color:h?"cyan":"green",children:[h?"› ":" ",f," ",L.manifest.name]},void 0,!0,void 0,this),x(Y0,{color:"gray",children:[" v",L.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(B0,{paddingLeft:2,children:x(Y0,{color:"gray",children:L.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(B0,{paddingLeft:2,children:x(Y0,{color:"gray",dimColor:!0,children:"生效层级: invocation"},void 0,!1,void 0,this)},void 0,!1,void 0,this),L.commands.length>0&&x(B0,{paddingLeft:2,children:x(Y0,{color:"blue",children:["命令:"," ",L.commands.map((s)=>`/${s.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},L.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),N.project.length>0&&x(B0,{flexDirection:"column",marginBottom:1,children:[x(B0,{paddingLeft:1,children:[x(Y0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),x(Y0,{color:"gray",children:" (.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N.project.map((L)=>{let f=L.status==="active"?"[on]":"[off]",h=J.indexOf(L)===Z;return x(B0,{flexDirection:"column",paddingLeft:2,children:[x(Y0,{children:[x(Y0,{bold:!0,color:h?"cyan":"green",children:[h?"› ":" ",f," ",L.manifest.name]},void 0,!0,void 0,this),x(Y0,{color:"gray",children:[" v",L.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(B0,{paddingLeft:2,children:x(Y0,{color:"gray",children:L.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(B0,{paddingLeft:2,children:x(Y0,{color:"gray",dimColor:!0,children:["生效层级:"," ",w?.[L.manifest.name]?.effectiveScope??"default"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),L.commands.length>0&&x(B0,{paddingLeft:2,children:x(Y0,{color:"blue",children:["命令:"," ",L.commands.map((s)=>`/${s.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},L.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),N.user.length>0&&x(B0,{flexDirection:"column",marginBottom:1,children:[x(B0,{paddingLeft:1,children:[x(Y0,{bold:!0,color:"cyan",children:"用户级"},void 0,!1,void 0,this),x(Y0,{color:"gray",children:" (~/.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N.user.map((L)=>{let f=L.status==="active"?"[on]":"[off]",h=J.indexOf(L)===Z;return x(B0,{flexDirection:"column",paddingLeft:2,children:[x(Y0,{children:[x(Y0,{bold:!0,color:h?"cyan":"green",children:[h?"› ":" ",f," ",L.manifest.name]},void 0,!0,void 0,this),x(Y0,{color:"gray",children:[" v",L.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(B0,{paddingLeft:2,children:x(Y0,{color:"gray",children:L.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(B0,{paddingLeft:2,children:x(Y0,{color:"gray",dimColor:!0,children:["生效层级:"," ",w?.[L.manifest.name]?.effectiveScope??"default"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),L.commands.length>0&&x(B0,{paddingLeft:2,children:x(Y0,{color:"blue",children:["命令:"," ",L.commands.map((s)=>`/${s.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},L.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),x(B0,{marginTop:1,paddingLeft:2,flexDirection:"column",children:[x(Y0,{color:"gray",children:"可用命令:"},void 0,!1,void 0,this),x(Y0,{color:"gray",dimColor:!0,children:[" ","• /plugins list - 列出所有插件"]},void 0,!0,void 0,this),x(Y0,{color:"gray",dimColor:!0,children:[" ","• /plugins info <name> - 显示插件详情"]},void 0,!0,void 0,this),x(Y0,{color:"gray",dimColor:!0,children:[" ","• /plugins install <url> - 安装插件"]},void 0,!0,void 0,this),x(Y0,{color:"gray",dimColor:!0,children:[" ","• /plugins enable/disable <name> - 启用/禁用插件"]},void 0,!0,void 0,this),x(Y0,{color:"gray",dimColor:!0,children:[" ","• /plugins policy show|set - 来源与 SHA 策略"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(B0,{marginTop:1,children:x(Y0,{dimColor:!0,children:"↑/↓ 选择 · Space/Enter 启停 · s 切换层级 · u 信任并更新 · x 卸载 · r 刷新 · ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),K&&x(B0,{marginTop:1,children:x(Y0,{color:K.includes("失败")?"red":"cyan",children:K},void 0,!1,void 0,this)},void 0,!1,void 0,this),G&&x(Y0,{color:"gray",children:"处理中..."},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import{Box as J1,Text as Y1,useInput as IJ,useStdout as _X}from"ink";import NX from"ink-text-input";import tQ,{useCallback as B8,useMemo as FX,useState as O$}from"react";import{jsxDEV as W0}from"react/jsx-dev-runtime";var HX=tQ.memo(({option:$,index:Q,isSelected:Y,isMultiSelect:J,isHighlighted:Z})=>W0(J1,{flexDirection:"column",marginBottom:1,children:[W0(Y1,{color:Z?"yellow":Y?"green":void 0,bold:Z,children:[J?Y?"(*) ":"( ) ":Z?"> ":" ",Q+1,". ",$.label]},void 0,!0,void 0,this),W0(J1,{marginLeft:4,children:W0(Y1,{color:"gray",children:$.description},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)),WX=tQ.memo(({questions:$,answers:Q})=>W0(J1,{flexDirection:"column",marginBottom:1,children:$.map((Y)=>{let J=Q[Y.header],Z=Array.isArray(J)?J.join(", "):J||"(no answer)";return W0(J1,{marginBottom:1,children:[W0(Y1,{backgroundColor:"blue",color:"white",children:[" ",Y.header," "]},void 0,!0,void 0,this),W0(Y1,{color:"green",children:[" ",Z]},void 0,!0,void 0,this)]},Y.header,!0,void 0,this)})},void 0,!1,void 0,this)),TJ=tQ.memo(({questions:$,onComplete:Q,onCancel:Y})=>{let{stdout:J}=_X(),Z=J.columns||80,G=e0()==="confirmation-prompt",q=S0(!1),[K,U]=O$("answering"),[W,O]=O$(0),[H,z]=O$({}),[w,_]=O$(0),[F,C]=O$([]),[N,S]=O$(!1),[M,B]=O$(""),[k,P]=O$(0),A=$[W],T=FX(()=>{if(!A)return[];return[...A.options.map((l)=>({label:l.label,value:l.label,description:l.description})),{label:"Type something...",value:"__other__",description:"Enter custom response"}]},[A]),y=B8((l)=>{let a={...H,[A.header]:l};if(z(a),W<$.length-1)O(W+1),_(0),C([]),S(!1),B("");else U("submit"),P(0)},[H,A?.header,W,$.length]),L=B8((l)=>{let a=T[l];if(!a)return;if(a.value==="__other__"){S(!0);return}if(A.multiSelect)C((I)=>I.includes(a.value)?I.filter((R)=>R!==a.value):[...I,a.value]);else y(a.value)},[T,A?.multiSelect,y]),f=B8((l)=>{if(l.trim())y(l.trim())},[y]),h=B8(()=>{U("answering"),O(0),_(0),C([]),S(!1)},[]),s=B8(()=>{Q(H)},[H,Q]);if(IJ((l,a)=>{if(a.ctrl&&l==="c"||a.meta&&l==="c"){q();return}if(N){if(a.escape)S(!1),B("");return}if(a.escape){Y();return}let I=parseInt(l);if(I>=1&&I<=T.length){L(I-1);return}if(a.upArrow){_((R)=>R>0?R-1:T.length-1);return}if(a.downArrow||a.tab){_((R)=>R<T.length-1?R+1:0);return}if(a.return){if(A.multiSelect&&F.length>0)y(F);else L(w);return}if(l===" "&&A.multiSelect){let R=T[w];if(R&&R.value!=="__other__")C((v)=>v.includes(R.value)?v.filter((b)=>b!==R.value):[...v,R.value]);return}},{isActive:G&&K==="answering"&&!N}),IJ((l,a)=>{if(a.ctrl&&l==="c"||a.meta&&l==="c"){q();return}if(a.escape){Y();return}if(a.upArrow||a.downArrow||a.tab){P((I)=>I===0?1:0);return}if(a.return){if(k===0)s();else h();return}if(l.toLowerCase()==="y"){s();return}if(l.toLowerCase()==="e"){h();return}},{isActive:G&&K==="submit"}),K==="submit")return W0(J1,{flexDirection:"column",borderStyle:"round",borderColor:G?"green":"gray",padding:1,width:Math.min(Z-4,80),children:[W0(J1,{marginBottom:1,children:W0(Y1,{bold:!0,color:"green",children:"[OK] Review Your Answers"},void 0,!1,void 0,this)},void 0,!1,void 0,this),W0(WX,{questions:$,answers:H},void 0,!1,void 0,this),W0(J1,{flexDirection:"column",marginTop:1,children:[W0(Y1,{color:k===0?"yellow":void 0,bold:k===0,children:[k===0?"> ":" ","[Y] Submit answers"]},void 0,!0,void 0,this),W0(Y1,{color:k===1?"yellow":void 0,bold:k===1,children:[k===1?"> ":" ","[E] Edit answers"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),W0(J1,{marginTop:1,children:W0(Y1,{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(!A)return null;return W0(J1,{flexDirection:"column",borderStyle:"round",borderColor:G?"cyan":"gray",padding:1,width:Math.min(Z-4,80),children:[W0(J1,{marginBottom:1,children:[W0(Y1,{backgroundColor:"blue",color:"white",children:[" ",A.header," "]},void 0,!0,void 0,this),W0(Y1,{children:[" ",A.question]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),N?W0(J1,{flexDirection:"column",marginTop:1,children:[W0(Y1,{color:"yellow",children:"Enter your response:"},void 0,!1,void 0,this),W0(J1,{marginTop:1,children:[W0(Y1,{color:"cyan",children:"> "},void 0,!1,void 0,this),W0(NX,{value:M,onChange:B,onSubmit:f,focus:G},void 0,!1,void 0,this)]},void 0,!0,void 0,this),W0(J1,{marginTop:1,children:W0(Y1,{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):W0(J1,{flexDirection:"column",children:T.map((l,a)=>W0(HX,{option:l,index:a,isSelected:F.includes(l.value),isMultiSelect:A.multiSelect,isHighlighted:w===a},l.value,!1,void 0,this))},void 0,!1,void 0,this),!N&&W0(J1,{marginTop:1,flexDirection:"column",children:[W0(Y1,{color:"gray",children:A.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),A.multiSelect&&F.length>0&&W0(Y1,{color:"green",children:["Selected: ",F.join(", ")]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$.length>1&&W0(J1,{marginTop:1,children:W0(Y1,{color:"gray",children:["Question ",W+1," of ",$.length]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{basename as LX}from"node:path";import{Box as t$,Text as b1,useInput as BX}from"ink";import wX from"ink-select-input";import{useEffect as sQ,useMemo as n$,useRef as VJ,useState as k2}from"react";function kJ($){return`${$.projectPath}\x00${$.sessionId}`}function fJ($){return $.title?.trim()||`Session ${$.sessionId.slice(0,8)}`}function SJ($){return $.taskDelivery?` | delivery:${$.taskDelivery.status}`:""}function vJ($,Q){if(Q!=="fork")return[...$];return $.filter((Y)=>Y.relationType!=="subagent")}function DJ($){return{title:$==="fork"?"选择要 fork 的会话:":"选择要恢复的会话:",instructions:"(Left/Right to page | Up/Down to select | Enter to confirm | Esc to cancel)"}}import{jsxDEV as d0}from"react/jsx-dev-runtime";function bX($){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 AX($){return LX($)}function PX($){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 RX=({isSelected:$})=>d0(t$,{marginRight:1,children:d0(b1,{color:$?"cyan":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),yX=({isSelected:$,label:Q})=>d0(b1,{color:$?"cyan":"white",bold:$,children:Q},void 0,!1,void 0,this),w8=20,jJ=({intent:$,sessions:Q,onSelect:Y,onCancel:J})=>{let[Z,X]=k2([]),[G,q]=k2(!1),[K,U]=k2(0),[W,O]=k2(!1),H=VJ(!1),z=VJ(!0);sQ(()=>{return z.current=!0,()=>{z.current=!1}},[]);let _=e0()==="session-selector",F=S0(!1);BX((A,T)=>{if(T.ctrl&&A==="c"||T.meta&&A==="c"){F();return}if(H.current)return;if(T.escape&&J){J();return}if(T.leftArrow||A==="h"||A==="H"){if(K>0)U((y)=>y-1);return}if(T.rightArrow||A==="l"||A==="L"){if(K<M-1)U((y)=>y+1);return}},{isActive:_}),sQ(()=>{if(Q){X(Q);return}(async()=>{q(!0);try{let T=await P0.listSessions({includeSubagents:!1});X(T)}catch(T){console.error("[SessionSelector] Failed to load sessions:",T),X([])}finally{q(!1)}})()},[Q]);let C=n$(()=>vJ(Q||Z,$),[$,Q,Z]),N=n$(()=>DJ($),[$]),S=n$(()=>{return C.map((A)=>{let T=AX(A.taskSourceProjectPath??A.projectPath),y=bX(A.lastMessageTime),L=fJ(A),f=`[${PX(A.taskStatus)}]`,h=A.gitBranch?` (${A.gitBranch})`:"",s=A.hasErrors?" [!]":"",l=A.taskRetriedFrom?` ↻ retry:${A.taskRetriedFrom.sessionId.slice(0,6)}`:A.relationType==="subagent"?" ↳ subagent":A.relationType==="fork"?" ↳ fork":"",a=A.taskIsolation==="worktree"?` | wt:${A.taskWorktreeBranch??"managed"}`:A.taskIsolation==="local"?" | local":"",I=A.taskDiffStat?` | ${A.taskDiffStat.changedFiles} files +${A.taskDiffStat.additions} -${A.taskDiffStat.deletions}`:"",R=A.taskStatus==="queued"&&A.taskQueuePosition?` | queue:${A.taskQueuePosition}/${A.taskQueueDepth??A.taskQueuePosition}`:"",v=SJ(A);return{key:kJ(A),label:`${f} ${L} · ${y} | ${T}${h} | ${A.messageCount} 条消息${a}${R}${I}${v}${s}${l}`,value:A}})},[C]),M=n$(()=>Math.max(1,Math.ceil(S.length/w8)),[S.length]),B=n$(()=>{let A=K*w8;return S.slice(A,A+w8)},[S,K]),k=n$(()=>({start:K*w8+1,end:Math.min((K+1)*w8,S.length)}),[K,S.length]);sQ(()=>{U(0)},[C.length]);let P=(A)=>{if(H.current)return;H.current=!0,O(!0);let T=()=>{if(!z.current)return;H.current=!1,O(!1)};Promise.resolve().then(()=>Y(A.value)).then(T,T)};if(G)return d0(t$,{flexDirection:"column",paddingX:2,paddingY:1,children:d0(b1,{children:"正在加载会话列表..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(C.length===0)return d0(t$,{flexDirection:"column",paddingX:2,paddingY:1,children:[d0(b1,{color:"yellow",children:"没有找到历史会话"},void 0,!1,void 0,this),d0(b1,{dimColor:!0,children:[`
158
+ `,"提示: 开始一次对话后,会话历史将保存到 ~/.blade/projects/"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this);return d0(t$,{flexDirection:"column",paddingX:2,paddingY:1,children:[d0(b1,{bold:!0,color:"cyan",children:N.title},void 0,!1,void 0,this),d0(b1,{dimColor:!0,children:[`
159
159
  `,N.instructions,`
160
- `]},void 0,!0,void 0,this),d0(LX,{items:w,onSelect:P,isFocused:_&&!F,indicatorComponent:AX,itemComponent:PX},void 0,!1,void 0,this),F&&d0(b1,{color:"cyan",children:$==="fork"?"Forking…":"Resuming…"},void 0,!1,void 0,this),d0(n$,{marginTop:1,flexDirection:"column",children:[d0(b1,{dimColor:!0,children:["第 ",K+1,"/",M," 页 · 共 ",C.length," 个会话 · 显示"," ",k.start,"-",k.end]},void 0,!0,void 0,this),M>1&&d0(n$,{marginTop:1,children:[d0(b1,{color:K>0?"cyan":"gray",children:K>0?"<< 上一页":" "},void 0,!1,void 0,this),d0(b1,{children:" "},void 0,!1,void 0,this),d0(b1,{color:K<M-1?"cyan":"gray",children:K<M-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 p0,Text as T0,useInput as RX}from"ink";import{jsxDEV as $0}from"react/jsx-dev-runtime";function jJ({onCancel:$}){let Q=I1(),J=VJ({cwd:Q}).getAll(),Z=J.filter((K)=>K.source==="builtin"),X=J.filter((K)=>K.source==="user"),G=J.filter((K)=>K.source==="project"),q=v0(!1,$);if(RX((K,U)=>{if(U.escape)$?.();else if(U.ctrl&&K==="c"||U.meta&&K==="c")q()}),J.length===0)return $0(p0,{flexDirection:"column",paddingY:1,children:[$0(p0,{marginBottom:1,children:$0(T0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this)},void 0,!1,void 0,this),$0(p0,{paddingLeft:2,children:$0(T0,{color:"gray",children:"没有找到任何 Skill"},void 0,!1,void 0,this)},void 0,!1,void 0,this),$0(p0,{marginTop:1,paddingLeft:2,children:$0(T0,{color:"gray",children:"配置文件位置: ~/.blade/skills/ 或 .blade/skills/"},void 0,!1,void 0,this)},void 0,!1,void 0,this),$0(p0,{marginTop:1,children:$0(T0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return $0(p0,{flexDirection:"column",paddingY:1,children:[$0(p0,{marginBottom:1,children:[$0(T0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this),$0(T0,{color:"gray",children:[" (找到 ",J.length," 个)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),G.length>0&&$0(p0,{flexDirection:"column",marginBottom:1,children:[$0(p0,{paddingLeft:1,children:[$0(T0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),$0(T0,{color:"gray",children:" (.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),G.map((K)=>{let F=K.description.length>80?`${K.description.substring(0,80)}...`:K.description;return $0(p0,{flexDirection:"column",paddingLeft:2,children:[$0(T0,{children:[$0(T0,{bold:!0,color:"green",children:["• ",K.name]},void 0,!0,void 0,this),$0(T0,{color:"gray",children:[" - ",F]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.allowedTools&&K.allowedTools.length>0&&$0(p0,{paddingLeft:2,children:$0(T0,{color:"gray",children:["工具: ",K.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),$0(p0,{paddingLeft:2,children:$0(T0,{color:"gray",dimColor:!0,children:K.path},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},K.name,!0,void 0,this)})]},void 0,!0,void 0,this),X.length>0&&$0(p0,{flexDirection:"column",marginBottom:1,children:[$0(p0,{paddingLeft:1,children:[$0(T0,{bold:!0,color:"yellow",children:"用户级"},void 0,!1,void 0,this),$0(T0,{color:"gray",children:" (~/.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X.map((K)=>{let F=K.description.length>80?`${K.description.substring(0,80)}...`:K.description;return $0(p0,{flexDirection:"column",paddingLeft:2,children:[$0(T0,{children:[$0(T0,{bold:!0,color:"green",children:["• ",K.name]},void 0,!0,void 0,this),$0(T0,{color:"gray",children:[" - ",F]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.allowedTools&&K.allowedTools.length>0&&$0(p0,{paddingLeft:2,children:$0(T0,{color:"gray",children:["工具: ",K.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),$0(p0,{paddingLeft:2,children:$0(T0,{color:"gray",dimColor:!0,children:K.path},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},K.name,!0,void 0,this)})]},void 0,!0,void 0,this),Z.length>0&&$0(p0,{flexDirection:"column",marginBottom:1,children:[$0(p0,{paddingLeft:1,children:[$0(T0,{bold:!0,color:"cyan",children:"内置"},void 0,!1,void 0,this),$0(T0,{color:"gray",children:" (builtin)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Z.map((K)=>{let F=K.description.length>80?`${K.description.substring(0,80)}...`:K.description;return $0(p0,{flexDirection:"column",paddingLeft:2,children:[$0(T0,{children:[$0(T0,{bold:!0,color:"green",children:["• ",K.name]},void 0,!0,void 0,this),$0(T0,{color:"gray",children:[" - ",F]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.userInvocable&&$0(p0,{paddingLeft:2,children:$0(T0,{color:"blue",children:["命令: /",K.name]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},K.name,!0,void 0,this)})]},void 0,!0,void 0,this),$0(p0,{marginTop:1,children:$0(T0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import{Box as hJ,Text as r1}from"ink";import yX,{useEffect as MX,useMemo as CX,useState as EJ}from"react";import{jsxDEV as F1,Fragment as mJ}from"react/jsx-dev-runtime";var gJ=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"];function IX($){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 pJ=yX.memo(()=>{let $=s((U)=>U.app.subagentProgresses),Q=s((U)=>U.app.subagentProgress),Y=A0(),[J,Z]=EJ(0),[X,G]=EJ(()=>Date.now()),q=CX(()=>{let U=Object.values($);return U.length>0?U:Q?[Q]:[]},[Q,$]),K=q.some((U)=>U.status==="running");if(MX(()=>{if(!K){Z(0);return}let U=setInterval(()=>{Z((O)=>(O+1)%gJ.length)},80),F=setInterval(()=>{G(Date.now())},1000);return()=>{clearInterval(U),clearInterval(F)}},[K]),q.length===0)return null;return F1(hJ,{paddingX:2,paddingY:0,flexDirection:"column",children:q.map((U)=>{let F=U.status==="running"?gJ[J]:U.status==="completed"?"[OK]":"[X]",O=U.status==="running"?Y.colors.info:U.status==="completed"?Y.colors.success:Y.colors.error,W=Math.max(0,X-U.startTime);return F1(hJ,{flexDirection:"row",gap:1,children:[F1(r1,{color:O,bold:!0,children:F},void 0,!1,void 0,this),F1(r1,{color:Y.colors.muted,children:"Subagent"},void 0,!1,void 0,this),F1(r1,{color:Y.colors.text.primary,bold:!0,children:U.type},void 0,!1,void 0,this),F1(r1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),F1(r1,{color:Y.colors.text.secondary,children:U.description},void 0,!1,void 0,this),U.currentTool&&F1(mJ,{children:[F1(r1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),F1(r1,{color:Y.colors.warning,children:U.currentTool},void 0,!1,void 0,this)]},void 0,!0,void 0,this),U.status==="running"&&W>0&&F1(mJ,{children:[F1(r1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),F1(r1,{color:Y.colors.info,children:IX(W)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},U.id,!0,void 0,this)})},void 0,!1,void 0,this)});import{useMemoizedFn as TX}from"ahooks";import{Box as v1,Text as d,useInput as kX}from"ink";import fX from"ink-select-input";import{useState as cJ}from"react";import{jsxDEV as u}from"react/jsx-dev-runtime";var xJ=I$.map(($)=>({label:$.label,value:$.id})),vX=({theme:$})=>{let{colors:Q}=$;return u(v1,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[u(d,{bold:!0,color:Q.text.primary,children:"代码预览"},void 0,!1,void 0,this),u(d,{children:" "},void 0,!1,void 0,this),u(d,{color:Q.syntax.comment,children:"# function"},void 0,!1,void 0,this),u(d,{children:[u(d,{color:Q.syntax.keyword,children:"def"},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.function,children:"fibonacci"},void 0,!1,void 0,this),u(d,{color:Q.text.primary,children:"("},void 0,!1,void 0,this),u(d,{color:Q.syntax.variable,children:"n"},void 0,!1,void 0,this),u(d,{color:Q.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(d,{children:[" ",u(d,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this),u(d,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.operator,children:"="},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.number,children:"0"},void 0,!1,void 0,this),u(d,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.number,children:"1"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(d,{children:[" ",u(d,{color:Q.syntax.keyword,children:"for"},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.variable,children:"_"},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.keyword,children:"in"},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.function,children:"range"},void 0,!1,void 0,this),u(d,{color:Q.text.primary,children:"("},void 0,!1,void 0,this),u(d,{color:Q.syntax.variable,children:"n"},void 0,!1,void 0,this),u(d,{color:Q.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(d,{children:[" ",u(d,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this),u(d,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.operator,children:"="},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this),u(d,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.operator,children:"+"},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(d,{children:[" ",u(d,{color:Q.syntax.keyword,children:"return"},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(d,{children:" "},void 0,!1,void 0,this),u(d,{color:Q.error,children:["- print(",u(d,{color:Q.syntax.string,children:'"Hello, "'},void 0,!1,void 0,this)," + name)"]},void 0,!0,void 0,this),u(d,{color:Q.success,children:["+ print(",u(d,{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)},SX=({theme:$})=>{let{colors:Q}=$;return u(v1,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[u(d,{children:" "},void 0,!1,void 0,this),u(d,{bold:!0,color:Q.text.primary,children:"颜色配置"},void 0,!1,void 0,this),u(d,{children:" "},void 0,!1,void 0,this),u(d,{children:[u(d,{color:Q.text.muted,children:"Primary: "},void 0,!1,void 0,this),u(d,{color:Q.primary,children:Q.primary},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(d,{children:[u(d,{color:Q.text.muted,children:"Success: "},void 0,!1,void 0,this),u(d,{color:Q.success,children:Q.success},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(d,{children:[u(d,{color:Q.text.muted,children:"Error: "},void 0,!1,void 0,this),u(d,{color:Q.error,children:Q.error},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(d,{children:[u(d,{color:Q.text.muted,children:"Warning: "},void 0,!1,void 0,this),u(d,{color:Q.warning,children:Q.warning},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(d,{children:[u(d,{color:Q.text.muted,children:"Info: "},void 0,!1,void 0,this),u(d,{color:Q.info,children:Q.info},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},uJ=()=>{let $=t1(),Q=r0.getCurrentThemeName(),Y=I$.findIndex((B)=>B.label===Q),J=Y>=0?I$[Y].theme:I$[0].theme,[Z,X]=cJ(J),[G,q]=cJ(!1),K=TX(async(B)=>{if(G)return;q(!0);try{await m0().setTheme(B.value),$.closeModal()}catch(_){console.error("主题切换失败:",_ instanceof Error?_.message:_)}finally{q(!1)}}),U=(B)=>{let _=I$.find((H)=>H.id===B.value);if(_)X(_.theme)},O=e0()==="theme-selector",W=v0(!1);kX((B,_)=>{if(_.ctrl&&B==="c"||_.meta&&B==="c"){W();return}if(_.escape&&!G)$.closeModal()},{isActive:O});let z=(B)=>{let{isSelected:_,label:H}=B,N=H===Q?"[OK]":" ";return u(d,{color:_?Z.colors.primary:Z.colors.text.primary,children:[N," ",H]},void 0,!0,void 0,this)};return u(v1,{flexDirection:"column",height:"100%",children:[u(v1,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:Z.colors.border.light,children:u(d,{bold:!0,color:Z.colors.primary,children:"主题选择器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),u(v1,{flexDirection:"row",flexGrow:1,children:[u(v1,{width:"40%",borderStyle:"single",borderColor:Z.colors.border.light,paddingX:1,children:u(v1,{flexDirection:"column",children:[u(v1,{paddingTop:1,paddingBottom:1,children:u(d,{bold:!0,color:Z.colors.text.primary,children:["可用主题 (",xJ.length,")"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),u(fX,{items:xJ,initialIndex:Y>=0?Y:0,onSelect:K,onHighlight:U,itemComponent:z},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),u(v1,{width:"60%",flexDirection:"column",borderStyle:"single",borderColor:Z.colors.border.light,children:[u(vX,{theme:Z},void 0,!1,void 0,this),u(SX,{theme:Z},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),u(v1,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:Z.colors.border.light,children:u(d,{color:Z.colors.text.muted,children:G?"正在保存...":"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 q1=e1("UI"),rJ=({debug:$,continue:Q,...Y})=>{if($)q1.debug("[Debug] BladeInterface props:",{permissionMode:Y.permissionMode,yolo:Y.yolo,maxTurns:Y.maxTurns,continue:Q});let J=k2(!1),Z=k2(!1),X=k2(!1),G=k2(null),q=U4(),K=O4(),U=R8(),F=N4(),O=_4(),W=t1(),z=n1(),B=v$(),_=I1(),H=B4(),C=S$(),N=s1(),v=L4();_$(()=>{if(r0.getCurrentThemeName()!==v)try{r0.setTheme(v)}catch{}},[v]);let M=q==="ready",w=q==="needsSetup",k=q==="idle",P=DX(()=>Y.agents?dJ(Y.agents):void 0,[Y.agents]),{confirmationState:A,confirmationHandler:T,handleResponse:y,dismissAll:L}=J6(),{executeCommand:f,handleAbort:h,cleanupAgent:t}=s4(Y.systemPrompt,Y.appendSystemPrompt,T,Y.maxTurns,L,P),{getPreviousCommand:l,getNextCommand:a,addToHistory:I}=$6();B6();let R=Z6("",0),S=t0(async()=>{let r=C,G0;if(r==="default")G0="autoEdit";else if(r==="autoEdit")G0="plan";else if(r==="plan")G0="default";else G0="default";try{await P0.setSessionPermissionMode(B,_,G0),await m0().setPermissionMode(G0)}catch(f0){q1.error("权限模式切换失败:",f0 instanceof Error?f0.message:f0)}}),b=t0(async(r)=>{try{let G0={displayName:r.displayName,provider:r.provider,model:r.model,overrides:r.overrides};if(r.modelProvider)await m0().addModelWithProvider(G0,r.modelProvider);else await m0().addModel(G0);W.setInitializationStatus("ready")}catch(G0){throw q1.error("初始化配置保存失败:",G0 instanceof Error?G0.message:G0),G0}}),V=t0(()=>{if(U==="shortcuts")W.closeModal();else W.setActiveModal("shortcuts")}),p=t0(async(r,G0,f0)=>{return m8({intent:G0,session:r,newSessionId:f0?.newSessionId,announceFork:f0?.announceFork,permissionModeOverride:Y.permissionMode},_,z,t)}),j=t0(async(r,G0)=>{let V1=(await g8(G0,_)).filter((g0)=>g0.sessionId===r);if(V1.length===0)throw Error(`Session not found: ${r}`);if(V1.length>1)throw Error(`Multiple workspaces contain session ${r}; use the session selector`);return V1[0]}),{showSuggestions:E,suggestions:m,selectedSuggestionIndex:X0}=L6(R,f,l,a,I,h,N,S,V,U==="shortcuts");_$(()=>{if(R.value&&U==="shortcuts")W.closeModal()},[R.value,U,W]);let J0=t0(async()=>{X.current=!0;try{let r=Y.forkSession?"fork":"resume",G0=await g8(r,_);if(G0.length===0){if(Y.forkSession){q1.error("没有可供 fork 的历史会话"),T1(1);return}z.addAssistantMessage("没有找到历史会话,开始新对话。");return}let f0=G0[0];await p(f0,r,{newSessionId:Y.forkSession?Y.sessionId:void 0,announceFork:Y.forkSession?!1:void 0})}catch(r){if(q1.error("[BladeInterface] 继续会话失败:",r),Y.forkSession){T1(1);return}z.addAssistantMessage("继续会话失败,开始新对话。")}}),w0=t0(async()=>{X.current=!0;try{if(typeof Y.resume==="string"&&Y.resume!=="true"){let f0=Y.forkSession?"fork":"resume",$8=await j(Y.resume,f0);await p($8,f0,{newSessionId:Y.forkSession?Y.sessionId:void 0,announceFork:Y.forkSession?!1:void 0});return}let r=Y.forkSession?"fork":"resume",G0=await g8(r,_);if(G0.length===0)q1.error("没有找到历史会话"),T1(1);W.showSessionSelector(G0,r)}catch(r){q1.error("[BladeInterface] 加载会话失败:",r),T1(1)}});_$(()=>{if(J.current)return;if(Q){J.current=!0,J0();return}if(Y.resume)J.current=!0,w0()},[Q,Y.resume,J0,w0]);let k0=t0(async(r)=>{let G0=A.details?.type;if(G0==="enterPlanMode"&&r.approved)try{await P0.setSessionPermissionMode(B,_,"plan"),await m0().setPermissionMode("plan"),q1.debug("[BladeInterface] Entered Plan mode")}catch(f0){q1.error("[BladeInterface] Failed to enter Plan mode:",f0)}if(G0==="exitPlanMode"&&r.approved)q1.debug("[BladeInterface] ExitPlanMode approved, Store auto-synced");y(r)}),c0=t0(()=>{z.addAssistantMessage("设置已取消"),z.addAssistantMessage("Blade 需要 API 配置才能正常工作。"),z.addAssistantMessage("您可以稍后运行 Blade 重新进入设置向导。"),T1(0)}),h0=t0(()=>{W.closeModal()}),H1=t0(async(r)=>{try{await p(r,F?.intent??"resume"),W.closeModal()}catch(G0){q1.error("[BladeInterface] Failed to restore session:",G0),z.addAssistantMessage(`会话操作失败: ${G0 instanceof Error?G0.message:"未知错误"}`),W.closeModal()}}),C1=t0(()=>{if(Y.resume)T1(0);else W.closeModal()}),k$=t0((r)=>{W.showModelEditWizard(r)}),s0=t0((r)=>{z.addAssistantMessage(`已添加模型配置: ${r.displayName??r.model},并已切换到该模型`),h0()}),V2=t0((r)=>{z.addAssistantMessage(`已更新模型配置: ${r.displayName??r.model}`),h0()});_$(()=>{if(w){H.setFocus("model-config-wizard");return}if(A.isVisible)H.setFocus("confirmation-prompt");else if(U==="sessionSelector")H.setFocus("session-selector");else if(U==="themeSelector")H.setFocus("theme-selector");else if(U==="modelSelector")H.setFocus("model-selector");else if(U==="modelAddWizard"||U==="modelEditWizard")H.setFocus("model-config-wizard");else if(U==="permissionsManager")H.setFocus("permissions-manager");else if(U==="agentsManager")H.setFocus("agents-manager");else if(U==="agentCreationWizard")H.setFocus("agent-creation-wizard");else if(U==="hooksManager")H.setFocus("hooks-manager");else if(U==="shortcuts")H.setFocus("main-input");else H.setFocus("main-input")},[w,A.isVisible,U,H.setFocus]),_$(()=>{if(!M||X.current)return;if(lJ().length>0){X.current=!0;return}X.current=!0,z.addAssistantMessage("请输入您的问题,我将为您提供帮助。")},[M]),_$(()=>{if(!K)return;if(G.current===K)return;if(G.current=K,q==="error")z.addAssistantMessage(`初始化失败: ${K}`);else z.addAssistantMessage(`${K}`),z.addAssistantMessage("请重新尝试设置,或检查文件权限")},[K,q,z.addAssistantMessage]);let D1=t0(async(r)=>{try{await f({displayText:r,text:r,images:[],parts:[{type:"text",text:r}]})}catch(G0){let f0=G0 instanceof Error?G0.message:"无法发送初始消息";z.addAssistantMessage(`初始消息发送失败:${f0}`)}});_$(()=>{let r=Y.initialMessage?.trim();if(!r||Z.current||!M||w)return;Z.current=!0,I(r),D1(r)},[Y.initialMessage,M,w,f,I]);let j2=t0(async(r)=>{try{await m0().setPermissionMode(r)}catch(G0){q1.error("权限模式初始化失败:",G0 instanceof Error?G0.message:G0)}});if(_$(()=>{let r=Y.permissionMode;if($)q1.debug("[Debug] permissionMode from CLI:",r),q1.debug("[Debug] current permissionMode:",C);if(!r||r===C)return;j2(r)},[Y.permissionMode,C]),k)return null;if(w)return M0(oQ,{mode:"setup",onComplete:b,onCancel:c0},void 0,!1,void 0,this);if($)q1.debug("[Debug] 渲染主界面,条件检查:",{confirmationVisible:A.isVisible,activeModal:U});let q0=U==="modelSelector",R0=O,Q0=U==="modelAddWizard"?"add":U==="modelEditWizard"&&R0?"edit":null,_0=q0||Boolean(Q0),x0=U==="agentsManager",X1=U==="agentCreationWizard",u0=U==="skillsManager",U1=U==="pluginsManager",e$=R0?{displayName:R0.displayName,provider:R0.provider,model:R0.model,overrides:R0.overrides}:void 0,o1=A.isVisible&&A.details?A.details.type==="mcpElicitation"&&A.details.mcpElicitation?M0(h9,{details:A.details.mcpElicitation,onComplete:(r,G0)=>k0({approved:r.action==="accept",elicitation:r,...G0?{openExternalUrl:!0}:{}})},void 0,!1,void 0,this):A.details.type==="askUserQuestion"&&A.details.questions?M0(CJ,{questions:A.details.questions,onComplete:(r)=>k0({approved:!0,answers:r}),onCancel:()=>k0({approved:!1})},void 0,!1,void 0,this):M0(X9,{details:A.details,onResponse:k0},void 0,!1,void 0,this):U==="themeSelector"?M0(uJ,{},void 0,!1,void 0,this):U==="permissionsManager"?M0(LJ,{onClose:h0},void 0,!1,void 0,this):U==="sessionSelector"?M0(DJ,{intent:F?.intent??"resume",sessions:F?.sessions,onSelect:H1,onCancel:C1},void 0,!1,void 0,this):U==="hooksManager"?M0(K9,{workspaceRoot:_,sessionId:B,onClose:h0},void 0,!1,void 0,this):null,b8=Boolean(o1);return M0(z$,{flexDirection:"column",width:"100%",overflow:"hidden",children:[o1,M0(z$,{flexDirection:"column",display:b8?"none":"flex",children:[M0(n9,{},void 0,!1,void 0,this),M0(pJ,{},void 0,!1,void 0,this),M0(S9,{paused:b8},void 0,!1,void 0,this),M0(C9,{input:R.value,cursorPosition:R.cursorPosition,onChange:R.setValue,onChangeCursorPosition:R.setCursorPosition,onAddPasteMapping:R.addPasteMapping,onAddImagePasteMapping:R.addImagePasteMapping},void 0,!1,void 0,this),q0&&M0(z$,{marginTop:1,paddingX:2,children:M0(t9,{onClose:h0,onEdit:k$},void 0,!1,void 0,this)},void 0,!1,void 0,this),Q0&&M0(z$,{marginTop:1,paddingX:2,children:M0(oQ,{mode:Q0,modelId:R0?.id,initialConfig:Q0==="edit"?e$:void 0,onComplete:Q0==="edit"?V2:s0,onCancel:h0},void 0,!1,void 0,this)},void 0,!1,void 0,this),x0&&M0(z$,{marginTop:1,paddingX:2,children:M0(y6,{workspaceRoot:_,onComplete:h0,onCancel:h0},void 0,!1,void 0,this)},void 0,!1,void 0,this),X1&&M0(z$,{marginTop:1,paddingX:2,children:M0(U8,{onComplete:h0,onCancel:h0},void 0,!1,void 0,this)},void 0,!1,void 0,this),u0&&M0(z$,{marginTop:1,paddingX:2,children:M0(jJ,{onComplete:h0,onCancel:h0},void 0,!1,void 0,this)},void 0,!1,void 0,this),U1&&M0(z$,{marginTop:1,paddingX:2,children:M0(yJ,{workspaceRoot:_,onComplete:h0,onCancel:h0},void 0,!1,void 0,this)},void 0,!1,void 0,this),M0(f6,{suggestions:m,selectedIndex:X0,visible:E&&!_0},void 0,!1,void 0,this),M0(k6,{},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)};import{Box as VX,Text as N$}from"ink";import jX from"react";import{jsxDEV as a1}from"react/jsx-dev-runtime";class w8 extends jX.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 a1(VX,{flexDirection:"column",padding:1,borderStyle:"round",borderColor:"red",children:[a1(N$,{color:"red",children:"应用发生错误"},void 0,!1,void 0,this),a1(N$,{children:" "},void 0,!1,void 0,this),a1(N$,{color:"red",children:this.state.error?.message},void 0,!1,void 0,this),a1(N$,{children:" "},void 0,!1,void 0,this),a1(N$,{color:"gray",children:"错误详情:"},void 0,!1,void 0,this),a1(N$,{color:"gray",children:this.state.error?.stack},void 0,!1,void 0,this),a1(N$,{children:" "},void 0,!1,void 0,this),a1(N$,{color:"yellow",children:"请重启应用或联系开发者"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return this.props.children}}import{Box as T$,Text as i1,useInput as hX}from"ink";import{useState as eQ}from"react";import{jsxDEV as Z1}from"react/jsx-dev-runtime";var f2=[{key:"update",label:"Update now",description:`runs \`${iJ()}\``},{key:"skip",label:"Skip",description:""},{key:"skip_until_next",label:"Skip until next version",description:""}],nJ=({versionInfo:$,onComplete:Q})=>{let[Y,J]=eQ(0),[Z,X]=eQ(!1),[G,q]=eQ(null);hX((U,F)=>{if(F.ctrl&&U==="c"){K8().shutdown("SIGINT",0);return}if(Z||G)return;if(F.upArrow||U==="k")J((O)=>O>0?O-1:f2.length-1);else if(F.downArrow||U==="j")J((O)=>O<f2.length-1?O+1:0);else if(F.return)K(f2[Y].key);else if(U==="1")K("update");else if(U==="2")K("skip");else if(U==="3")K("skip_until_next")});let K=async(U)=>{switch(U){case"update":{X(!0);let F=await oJ();q(F.message),setTimeout(()=>{K8().shutdown("SIGINT",0)},1500);break}case"skip":Q();break;case"skip_until_next":if($.latestVersion)await aJ($.latestVersion);Q();break}};if(G)return Z1(T$,{flexDirection:"column",marginY:1,children:Z1(i1,{children:G},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Z)return Z1(T$,{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(T$,{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(T$,{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(T$,{flexDirection:"column",marginTop:1,children:f2.map((U,F)=>{let O=F===Y,W=O?"› ":" ",z=`${F+1}. `;return Z1(T$,{children:Z1(i1,{color:O?"cyan":void 0,children:[W,z,U.label,U.description&&Z1(i1,{color:"gray",children:[" (",U.description,")"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},U.key,!1,void 0,this)})},void 0,!1,void 0,this),Z1(T$,{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 v2,Text as t$,useInput as EX}from"ink";import{useState as tJ}from"react";import{jsxDEV as S1}from"react/jsx-dev-runtime";var sJ=({status:$,onTrust:Q,onContinueSafely:Y})=>{let J=r0.getTheme(),[Z,X]=tJ(!1),[G,q]=tJ(null);return EX((K,U)=>{if(Z)return;if(U.return||K.toLowerCase()==="t"){X(!0),q(null),Q().catch((F)=>{q(F instanceof Error?F.message:"Failed to trust workspace"),X(!1)});return}if(K.toLowerCase()==="s"||U.escape)X(!0),q(null),Y().catch((F)=>{q(F instanceof Error?F.message:"Failed to continue safely"),X(!1)})}),S1(v2,{flexDirection:"column",paddingX:1,children:[S1(t$,{bold:!0,color:J.colors.warning,children:"Workspace review required"},void 0,!1,void 0,this),S1(t$,{dimColor:!0,children:$.projectPath},void 0,!1,void 0,this),S1(v2,{marginTop:1,flexDirection:"column",children:[S1(t$,{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((K)=>S1(t$,{children:[" ",K.path," · ",K.effects.length," effect(s)"]},`${K.kind}:${K.path}`,!0,void 0,this))]},void 0,!0,void 0,this),G&&S1(v2,{marginTop:1,children:S1(t$,{color:J.colors.error,children:G},void 0,!1,void 0,this)},void 0,!1,void 0,this),S1(v2,{marginTop:1,children:S1(t$,{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 gX}from"ink";import{useEffect as mX}from"react";function eJ(){let{stdout:$}=gX();mX(()=>{if(!$.isTTY)return;return $.write(O9),$.write(kQ),()=>{$.write(z9),$.write(kQ)}},[$])}function $Y($){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 s$}from"react/jsx-dev-runtime";function cX($){if($1().config.actions.setConfig($),$.debug)console.log("[Debug] 模型配置检查通过,准备就绪");a0().setInitializationStatus("ready")}var XH=($)=>{eJ();let[Q,Y]=D2(!1),[J,Z]=D2(null),[X,G]=D2(!1),[q,K]=D2(null),U=S2((z,B)=>{let _=z instanceof Error?z.message:String(z);if(a0().setInitializationError(_),a0().setInitializationStatus("error"),Y(!0),B)console.error("[FAIL] 应用初始化失败:",_)}),F=S2(async()=>{try{let z=$1().config.config??JY,B=YY(z,$);if(cX(B),B.resumeSessionId)ZY().restoreSession(B.resumeSessionId,[]);if(B.debug)console.error("[Debug] 运行时配置:",B);let _=B.codeTheme;if(_&&r0.hasTheme(_)){if(r0.setTheme(_),$.debug)console.log(`[OK] 已加载主题: ${_}`)}try{O1.getInstance().loadConfig(B.hooks||{},l0());let C=await XY(l0());if($.debug&&B.hooks?.enabled)console.log("[OK] Hooks 系统已启用");if($.debug)console.log(`[OK] Workspace resources: ${C.subagents.getAllNames().length} agents, ${C.skills.size} skills, ${C.commands.getCommandCount()+C.commands.getPluginCommandCount()} commands, ${C.plugins.getAll().length} plugins`);let v=$1().session.sessionId;QY(v)}catch(H){if($.debug)console.warn("Hooks 初始化失败:",$Y(H))}x8(async()=>{await KY.getInstance().killAll(),await GY.getInstance().disconnectAll(),O1.getInstance().cleanup()}),Y(!0)}catch(z){U(z,!!$.debug)}}),O=S2(async()=>{let z=await $4.getInstance().getStatus(l0());if(z.state==="untrusted"||z.state==="error"){K(z);return}await F()}),W=S2(async()=>{if($.versionCheckPromise){let z=await $.versionCheckPromise;if(z){Z(z),G(!0);return}}await O()});if(pX(()=>{W()},[]),X&&J)return s$(w8,{children:s$(nJ,{versionInfo:J,onComplete:()=>{G(!1),O()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(q)return s$(w8,{children:s$(sJ,{status:q,onTrust:async()=>{await $4.getInstance().trust(l0()),await qY(),K(null),await F()},onContinueSafely:async()=>{K(null),await F()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(!Q)return null;return s$(w8,{children:s$(rJ,{...$},void 0,!1,void 0,this)},void 0,!1,void 0,this)};export{XH as AppWrapper};
160
+ `]},void 0,!0,void 0,this),d0(wX,{items:B,onSelect:P,isFocused:_&&!W,indicatorComponent:RX,itemComponent:yX},void 0,!1,void 0,this),W&&d0(b1,{color:"cyan",children:$==="fork"?"Forking…":"Resuming…"},void 0,!1,void 0,this),d0(t$,{marginTop:1,flexDirection:"column",children:[d0(b1,{dimColor:!0,children:["第 ",K+1,"/",M," 页 · 共 ",C.length," 个会话 · 显示"," ",k.start,"-",k.end]},void 0,!0,void 0,this),M>1&&d0(t$,{marginTop:1,children:[d0(b1,{color:K>0?"cyan":"gray",children:K>0?"<< 上一页":" "},void 0,!1,void 0,this),d0(b1,{children:" "},void 0,!1,void 0,this),d0(b1,{color:K<M-1?"cyan":"gray",children:K<M-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 p0,Text as T0,useInput as MX}from"ink";import{jsxDEV as $0}from"react/jsx-dev-runtime";function EJ({onCancel:$}){let Q=I1(),J=hJ({cwd:Q}).getAll(),Z=J.filter((K)=>K.source==="builtin"),X=J.filter((K)=>K.source==="user"),G=J.filter((K)=>K.source==="project"),q=S0(!1,$);if(MX((K,U)=>{if(U.escape)$?.();else if(U.ctrl&&K==="c"||U.meta&&K==="c")q()}),J.length===0)return $0(p0,{flexDirection:"column",paddingY:1,children:[$0(p0,{marginBottom:1,children:$0(T0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this)},void 0,!1,void 0,this),$0(p0,{paddingLeft:2,children:$0(T0,{color:"gray",children:"没有找到任何 Skill"},void 0,!1,void 0,this)},void 0,!1,void 0,this),$0(p0,{marginTop:1,paddingLeft:2,children:$0(T0,{color:"gray",children:"配置文件位置: ~/.blade/skills/ 或 .blade/skills/"},void 0,!1,void 0,this)},void 0,!1,void 0,this),$0(p0,{marginTop:1,children:$0(T0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return $0(p0,{flexDirection:"column",paddingY:1,children:[$0(p0,{marginBottom:1,children:[$0(T0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this),$0(T0,{color:"gray",children:[" (找到 ",J.length," 个)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),G.length>0&&$0(p0,{flexDirection:"column",marginBottom:1,children:[$0(p0,{paddingLeft:1,children:[$0(T0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),$0(T0,{color:"gray",children:" (.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),G.map((K)=>{let W=K.description.length>80?`${K.description.substring(0,80)}...`:K.description;return $0(p0,{flexDirection:"column",paddingLeft:2,children:[$0(T0,{children:[$0(T0,{bold:!0,color:"green",children:["• ",K.name]},void 0,!0,void 0,this),$0(T0,{color:"gray",children:[" - ",W]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.allowedTools&&K.allowedTools.length>0&&$0(p0,{paddingLeft:2,children:$0(T0,{color:"gray",children:["工具: ",K.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),$0(p0,{paddingLeft:2,children:$0(T0,{color:"gray",dimColor:!0,children:K.path},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},K.name,!0,void 0,this)})]},void 0,!0,void 0,this),X.length>0&&$0(p0,{flexDirection:"column",marginBottom:1,children:[$0(p0,{paddingLeft:1,children:[$0(T0,{bold:!0,color:"yellow",children:"用户级"},void 0,!1,void 0,this),$0(T0,{color:"gray",children:" (~/.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X.map((K)=>{let W=K.description.length>80?`${K.description.substring(0,80)}...`:K.description;return $0(p0,{flexDirection:"column",paddingLeft:2,children:[$0(T0,{children:[$0(T0,{bold:!0,color:"green",children:["• ",K.name]},void 0,!0,void 0,this),$0(T0,{color:"gray",children:[" - ",W]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.allowedTools&&K.allowedTools.length>0&&$0(p0,{paddingLeft:2,children:$0(T0,{color:"gray",children:["工具: ",K.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),$0(p0,{paddingLeft:2,children:$0(T0,{color:"gray",dimColor:!0,children:K.path},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},K.name,!0,void 0,this)})]},void 0,!0,void 0,this),Z.length>0&&$0(p0,{flexDirection:"column",marginBottom:1,children:[$0(p0,{paddingLeft:1,children:[$0(T0,{bold:!0,color:"cyan",children:"内置"},void 0,!1,void 0,this),$0(T0,{color:"gray",children:" (builtin)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Z.map((K)=>{let W=K.description.length>80?`${K.description.substring(0,80)}...`:K.description;return $0(p0,{flexDirection:"column",paddingLeft:2,children:[$0(T0,{children:[$0(T0,{bold:!0,color:"green",children:["• ",K.name]},void 0,!0,void 0,this),$0(T0,{color:"gray",children:[" - ",W]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.userInvocable&&$0(p0,{paddingLeft:2,children:$0(T0,{color:"blue",children:["命令: /",K.name]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},K.name,!0,void 0,this)})]},void 0,!0,void 0,this),$0(p0,{marginTop:1,children:$0(T0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import{Box as gJ,Text as r1}from"ink";import CX,{useEffect as IX,useMemo as TX,useState as mJ}from"react";import{jsxDEV as F1,Fragment as cJ}from"react/jsx-dev-runtime";var pJ=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"];function kX($){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 xJ=CX.memo(()=>{let $=n((U)=>U.app.subagentProgresses),Q=n((U)=>U.app.subagentProgress),Y=A0(),[J,Z]=mJ(0),[X,G]=mJ(()=>Date.now()),q=TX(()=>{let U=Object.values($);return U.length>0?U:Q?[Q]:[]},[Q,$]),K=q.some((U)=>U.status==="running");if(IX(()=>{if(!K){Z(0);return}let U=setInterval(()=>{Z((O)=>(O+1)%pJ.length)},80),W=setInterval(()=>{G(Date.now())},1000);return()=>{clearInterval(U),clearInterval(W)}},[K]),q.length===0)return null;return F1(gJ,{paddingX:2,paddingY:0,flexDirection:"column",children:q.map((U)=>{let W=U.status==="running"?pJ[J]:U.status==="completed"?"[OK]":"[X]",O=U.status==="running"?Y.colors.info:U.status==="completed"?Y.colors.success:Y.colors.error,H=Math.max(0,X-U.startTime);return F1(gJ,{flexDirection:"row",gap:1,children:[F1(r1,{color:O,bold:!0,children:W},void 0,!1,void 0,this),F1(r1,{color:Y.colors.muted,children:"Subagent"},void 0,!1,void 0,this),F1(r1,{color:Y.colors.text.primary,bold:!0,children:U.type},void 0,!1,void 0,this),F1(r1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),F1(r1,{color:Y.colors.text.secondary,children:U.description},void 0,!1,void 0,this),U.currentTool&&F1(cJ,{children:[F1(r1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),F1(r1,{color:Y.colors.warning,children:U.currentTool},void 0,!1,void 0,this)]},void 0,!0,void 0,this),U.status==="running"&&H>0&&F1(cJ,{children:[F1(r1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),F1(r1,{color:Y.colors.info,children:kX(H)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},U.id,!0,void 0,this)})},void 0,!1,void 0,this)});import{useMemoizedFn as fX}from"ahooks";import{Box as S1,Text as d,useInput as SX}from"ink";import vX from"ink-select-input";import{useState as uJ}from"react";import{jsxDEV as u}from"react/jsx-dev-runtime";var lJ=I$.map(($)=>({label:$.label,value:$.id})),DX=({theme:$})=>{let{colors:Q}=$;return u(S1,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[u(d,{bold:!0,color:Q.text.primary,children:"代码预览"},void 0,!1,void 0,this),u(d,{children:" "},void 0,!1,void 0,this),u(d,{color:Q.syntax.comment,children:"# function"},void 0,!1,void 0,this),u(d,{children:[u(d,{color:Q.syntax.keyword,children:"def"},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.function,children:"fibonacci"},void 0,!1,void 0,this),u(d,{color:Q.text.primary,children:"("},void 0,!1,void 0,this),u(d,{color:Q.syntax.variable,children:"n"},void 0,!1,void 0,this),u(d,{color:Q.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(d,{children:[" ",u(d,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this),u(d,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.operator,children:"="},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.number,children:"0"},void 0,!1,void 0,this),u(d,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.number,children:"1"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(d,{children:[" ",u(d,{color:Q.syntax.keyword,children:"for"},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.variable,children:"_"},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.keyword,children:"in"},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.function,children:"range"},void 0,!1,void 0,this),u(d,{color:Q.text.primary,children:"("},void 0,!1,void 0,this),u(d,{color:Q.syntax.variable,children:"n"},void 0,!1,void 0,this),u(d,{color:Q.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(d,{children:[" ",u(d,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this),u(d,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.operator,children:"="},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this),u(d,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.operator,children:"+"},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(d,{children:[" ",u(d,{color:Q.syntax.keyword,children:"return"},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(d,{children:" "},void 0,!1,void 0,this),u(d,{color:Q.error,children:["- print(",u(d,{color:Q.syntax.string,children:'"Hello, "'},void 0,!1,void 0,this)," + name)"]},void 0,!0,void 0,this),u(d,{color:Q.success,children:["+ print(",u(d,{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)},VX=({theme:$})=>{let{colors:Q}=$;return u(S1,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[u(d,{children:" "},void 0,!1,void 0,this),u(d,{bold:!0,color:Q.text.primary,children:"颜色配置"},void 0,!1,void 0,this),u(d,{children:" "},void 0,!1,void 0,this),u(d,{children:[u(d,{color:Q.text.muted,children:"Primary: "},void 0,!1,void 0,this),u(d,{color:Q.primary,children:Q.primary},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(d,{children:[u(d,{color:Q.text.muted,children:"Success: "},void 0,!1,void 0,this),u(d,{color:Q.success,children:Q.success},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(d,{children:[u(d,{color:Q.text.muted,children:"Error: "},void 0,!1,void 0,this),u(d,{color:Q.error,children:Q.error},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(d,{children:[u(d,{color:Q.text.muted,children:"Warning: "},void 0,!1,void 0,this),u(d,{color:Q.warning,children:Q.warning},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(d,{children:[u(d,{color:Q.text.muted,children:"Info: "},void 0,!1,void 0,this),u(d,{color:Q.info,children:Q.info},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},dJ=()=>{let $=t1(),Q=r0.getCurrentThemeName(),Y=I$.findIndex((w)=>w.label===Q),J=Y>=0?I$[Y].theme:I$[0].theme,[Z,X]=uJ(J),[G,q]=uJ(!1),K=fX(async(w)=>{if(G)return;q(!0);try{await m0().setTheme(w.value),$.closeModal()}catch(_){console.error("主题切换失败:",_ instanceof Error?_.message:_)}finally{q(!1)}}),U=(w)=>{let _=I$.find((F)=>F.id===w.value);if(_)X(_.theme)},O=e0()==="theme-selector",H=S0(!1);SX((w,_)=>{if(_.ctrl&&w==="c"||_.meta&&w==="c"){H();return}if(_.escape&&!G)$.closeModal()},{isActive:O});let z=(w)=>{let{isSelected:_,label:F}=w,N=F===Q?"[OK]":" ";return u(d,{color:_?Z.colors.primary:Z.colors.text.primary,children:[N," ",F]},void 0,!0,void 0,this)};return u(S1,{flexDirection:"column",height:"100%",children:[u(S1,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:Z.colors.border.light,children:u(d,{bold:!0,color:Z.colors.primary,children:"主题选择器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),u(S1,{flexDirection:"row",flexGrow:1,children:[u(S1,{width:"40%",borderStyle:"single",borderColor:Z.colors.border.light,paddingX:1,children:u(S1,{flexDirection:"column",children:[u(S1,{paddingTop:1,paddingBottom:1,children:u(d,{bold:!0,color:Z.colors.text.primary,children:["可用主题 (",lJ.length,")"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),u(vX,{items:lJ,initialIndex:Y>=0?Y:0,onSelect:K,onHighlight:U,itemComponent:z},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),u(S1,{width:"60%",flexDirection:"column",borderStyle:"single",borderColor:Z.colors.border.light,children:[u(DX,{theme:Z},void 0,!1,void 0,this),u(VX,{theme:Z},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),u(S1,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:Z.colors.border.light,children:u(d,{color:Z.colors.text.muted,children:G?"正在保存...":"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 q1=e1("UI"),oJ=({debug:$,continue:Q,...Y})=>{if($)q1.debug("[Debug] BladeInterface props:",{permissionMode:Y.permissionMode,yolo:Y.yolo,maxTurns:Y.maxTurns,continue:Q});let J=f2(!1),Z=f2(!1),X=f2(!1),G=f2(null),q=z4(),K=_4(),U=y8(),W=H4(),O=F4(),H=t1(),z=n1(),w=S$(),_=I1(),F=b4(),C=v$(),N=s1(),S=w4();_$(()=>{if(r0.getCurrentThemeName()!==S)try{r0.setTheme(S)}catch{}},[S]);let M=q==="ready",B=q==="needsSetup",k=q==="idle",P=jX(()=>Y.agents?aJ(Y.agents):void 0,[Y.agents]),{confirmationState:A,confirmationHandler:T,handleResponse:y,dismissAll:L}=Z6(),{executeCommand:f,handleAbort:h,cleanupAgent:s}=$6(Y.systemPrompt,Y.appendSystemPrompt,T,Y.maxTurns,L,P),{getPreviousCommand:l,getNextCommand:a,addToHistory:I}=J6();b6();let R=G6("",0),v=t0(async()=>{let r=C,G0;if(r==="default")G0="autoEdit";else if(r==="autoEdit")G0="plan";else if(r==="plan")G0="default";else G0="default";try{await P0.setSessionPermissionMode(w,_,G0),await m0().setPermissionMode(G0)}catch(f0){q1.error("权限模式切换失败:",f0 instanceof Error?f0.message:f0)}}),b=t0(async(r)=>{try{let G0={displayName:r.displayName,provider:r.provider,model:r.model,overrides:r.overrides};if(r.modelProvider)await m0().addModelWithProvider(G0,r.modelProvider);else await m0().addModel(G0);H.setInitializationStatus("ready")}catch(G0){throw q1.error("初始化配置保存失败:",G0 instanceof Error?G0.message:G0),G0}}),V=t0(()=>{if(U==="shortcuts")H.closeModal();else H.setActiveModal("shortcuts")}),p=t0(async(r,G0,f0)=>{return p8({intent:G0,session:r,newSessionId:f0?.newSessionId,announceFork:f0?.announceFork,permissionModeOverride:Y.permissionMode},_,z,s)}),j=t0(async(r,G0)=>{let V1=(await m8(G0,_)).filter((g0)=>g0.sessionId===r);if(V1.length===0)throw Error(`Session not found: ${r}`);if(V1.length>1)throw Error(`Multiple workspaces contain session ${r}; use the session selector`);return V1[0]}),{showSuggestions:E,suggestions:m,selectedSuggestionIndex:X0}=w6(R,f,l,a,I,h,N,v,V,U==="shortcuts");_$(()=>{if(R.value&&U==="shortcuts")H.closeModal()},[R.value,U,H]);let J0=t0(async()=>{X.current=!0;try{let r=Y.forkSession?"fork":"resume",G0=await m8(r,_);if(G0.length===0){if(Y.forkSession){q1.error("没有可供 fork 的历史会话"),T1(1);return}z.addAssistantMessage("没有找到历史会话,开始新对话。");return}let f0=G0[0];await p(f0,r,{newSessionId:Y.forkSession?Y.sessionId:void 0,announceFork:Y.forkSession?!1:void 0})}catch(r){if(q1.error("[BladeInterface] 继续会话失败:",r),Y.forkSession){T1(1);return}z.addAssistantMessage("继续会话失败,开始新对话。")}}),w0=t0(async()=>{X.current=!0;try{if(typeof Y.resume==="string"&&Y.resume!=="true"){let f0=Y.forkSession?"fork":"resume",Q8=await j(Y.resume,f0);await p(Q8,f0,{newSessionId:Y.forkSession?Y.sessionId:void 0,announceFork:Y.forkSession?!1:void 0});return}let r=Y.forkSession?"fork":"resume",G0=await m8(r,_);if(G0.length===0)q1.error("没有找到历史会话"),T1(1);H.showSessionSelector(G0,r)}catch(r){q1.error("[BladeInterface] 加载会话失败:",r),T1(1)}});_$(()=>{if(J.current)return;if(Q){J.current=!0,J0();return}if(Y.resume)J.current=!0,w0()},[Q,Y.resume,J0,w0]);let k0=t0(async(r)=>{let G0=A.details?.type;if(G0==="enterPlanMode"&&r.approved)try{await P0.setSessionPermissionMode(w,_,"plan"),await m0().setPermissionMode("plan"),q1.debug("[BladeInterface] Entered Plan mode")}catch(f0){q1.error("[BladeInterface] Failed to enter Plan mode:",f0)}if(G0==="exitPlanMode"&&r.approved)q1.debug("[BladeInterface] ExitPlanMode approved, Store auto-synced");y(r)}),c0=t0(()=>{z.addAssistantMessage("设置已取消"),z.addAssistantMessage("Blade 需要 API 配置才能正常工作。"),z.addAssistantMessage("您可以稍后运行 Blade 重新进入设置向导。"),T1(0)}),h0=t0(()=>{H.closeModal()}),H1=t0(async(r)=>{try{await p(r,W?.intent??"resume"),H.closeModal()}catch(G0){q1.error("[BladeInterface] Failed to restore session:",G0),z.addAssistantMessage(`会话操作失败: ${G0 instanceof Error?G0.message:"未知错误"}`),H.closeModal()}}),C1=t0(()=>{if(Y.resume)T1(0);else H.closeModal()}),k$=t0((r)=>{H.showModelEditWizard(r)}),s0=t0((r)=>{z.addAssistantMessage(`已添加模型配置: ${r.displayName??r.model},并已切换到该模型`),h0()}),j2=t0((r)=>{z.addAssistantMessage(`已更新模型配置: ${r.displayName??r.model}`),h0()});_$(()=>{if(B){F.setFocus("model-config-wizard");return}if(A.isVisible)F.setFocus("confirmation-prompt");else if(U==="sessionSelector")F.setFocus("session-selector");else if(U==="themeSelector")F.setFocus("theme-selector");else if(U==="modelSelector")F.setFocus("model-selector");else if(U==="modelAddWizard"||U==="modelEditWizard")F.setFocus("model-config-wizard");else if(U==="permissionsManager")F.setFocus("permissions-manager");else if(U==="agentsManager")F.setFocus("agents-manager");else if(U==="agentCreationWizard")F.setFocus("agent-creation-wizard");else if(U==="hooksManager")F.setFocus("hooks-manager");else if(U==="shortcuts")F.setFocus("main-input");else F.setFocus("main-input")},[B,A.isVisible,U,F.setFocus]),_$(()=>{if(!M||X.current)return;if(rJ().length>0){X.current=!0;return}X.current=!0,z.addAssistantMessage("请输入您的问题,我将为您提供帮助。")},[M]),_$(()=>{if(!K)return;if(G.current===K)return;if(G.current=K,q==="error")z.addAssistantMessage(`初始化失败: ${K}`);else z.addAssistantMessage(`${K}`),z.addAssistantMessage("请重新尝试设置,或检查文件权限")},[K,q,z.addAssistantMessage]);let D1=t0(async(r)=>{try{await f({displayText:r,text:r,images:[],parts:[{type:"text",text:r}]})}catch(G0){let f0=G0 instanceof Error?G0.message:"无法发送初始消息";z.addAssistantMessage(`初始消息发送失败:${f0}`)}});_$(()=>{let r=Y.initialMessage?.trim();if(!r||Z.current||!M||B)return;Z.current=!0,I(r),D1(r)},[Y.initialMessage,M,B,f,I]);let h2=t0(async(r)=>{try{await m0().setPermissionMode(r)}catch(G0){q1.error("权限模式初始化失败:",G0 instanceof Error?G0.message:G0)}});if(_$(()=>{let r=Y.permissionMode;if($)q1.debug("[Debug] permissionMode from CLI:",r),q1.debug("[Debug] current permissionMode:",C);if(!r||r===C)return;h2(r)},[Y.permissionMode,C]),k)return null;if(B)return M0(iQ,{mode:"setup",onComplete:b,onCancel:c0},void 0,!1,void 0,this);if($)q1.debug("[Debug] 渲染主界面,条件检查:",{confirmationVisible:A.isVisible,activeModal:U});let q0=U==="modelSelector",R0=O,Q0=U==="modelAddWizard"?"add":U==="modelEditWizard"&&R0?"edit":null,_0=q0||Boolean(Q0),x0=U==="agentsManager",X1=U==="agentCreationWizard",u0=U==="skillsManager",U1=U==="pluginsManager",$8=R0?{displayName:R0.displayName,provider:R0.provider,model:R0.model,overrides:R0.overrides}:void 0,i1=A.isVisible&&A.details?A.details.type==="mcpElicitation"&&A.details.mcpElicitation?M0(g9,{details:A.details.mcpElicitation,onComplete:(r,G0)=>k0({approved:r.action==="accept",elicitation:r,...G0?{openExternalUrl:!0}:{}})},void 0,!1,void 0,this):A.details.type==="askUserQuestion"&&A.details.questions?M0(TJ,{questions:A.details.questions,onComplete:(r)=>k0({approved:!0,answers:r}),onCancel:()=>k0({approved:!1})},void 0,!1,void 0,this):M0(K9,{details:A.details,onResponse:k0},void 0,!1,void 0,this):U==="themeSelector"?M0(dJ,{},void 0,!1,void 0,this):U==="permissionsManager"?M0(wJ,{onClose:h0},void 0,!1,void 0,this):U==="sessionSelector"?M0(jJ,{intent:W?.intent??"resume",sessions:W?.sessions,onSelect:H1,onCancel:C1},void 0,!1,void 0,this):U==="hooksManager"?M0(U9,{workspaceRoot:_,sessionId:w,onClose:h0},void 0,!1,void 0,this):null,A8=Boolean(i1);return M0(z$,{flexDirection:"column",width:"100%",overflow:"hidden",children:[i1,M0(z$,{flexDirection:"column",display:A8?"none":"flex",children:[M0(s9,{},void 0,!1,void 0,this),M0(xJ,{},void 0,!1,void 0,this),M0(V9,{paused:A8},void 0,!1,void 0,this),M0(T9,{input:R.value,cursorPosition:R.cursorPosition,onChange:R.setValue,onChangeCursorPosition:R.setCursorPosition,onAddPasteMapping:R.addPasteMapping,onAddImagePasteMapping:R.addImagePasteMapping},void 0,!1,void 0,this),q0&&M0(z$,{marginTop:1,paddingX:2,children:M0(e9,{onClose:h0,onEdit:k$},void 0,!1,void 0,this)},void 0,!1,void 0,this),Q0&&M0(z$,{marginTop:1,paddingX:2,children:M0(iQ,{mode:Q0,modelId:R0?.id,initialConfig:Q0==="edit"?$8:void 0,onComplete:Q0==="edit"?j2:s0,onCancel:h0},void 0,!1,void 0,this)},void 0,!1,void 0,this),x0&&M0(z$,{marginTop:1,paddingX:2,children:M0(C6,{workspaceRoot:_,onComplete:h0,onCancel:h0},void 0,!1,void 0,this)},void 0,!1,void 0,this),X1&&M0(z$,{marginTop:1,paddingX:2,children:M0(O8,{onComplete:h0,onCancel:h0},void 0,!1,void 0,this)},void 0,!1,void 0,this),u0&&M0(z$,{marginTop:1,paddingX:2,children:M0(EJ,{onComplete:h0,onCancel:h0},void 0,!1,void 0,this)},void 0,!1,void 0,this),U1&&M0(z$,{marginTop:1,paddingX:2,children:M0(CJ,{workspaceRoot:_,onComplete:h0,onCancel:h0},void 0,!1,void 0,this)},void 0,!1,void 0,this),M0(v6,{suggestions:m,selectedIndex:X0,visible:E&&!_0},void 0,!1,void 0,this),M0(S6,{},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)};import{Box as hX,Text as N$}from"ink";import EX from"react";import{jsxDEV as a1}from"react/jsx-dev-runtime";class b8 extends EX.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 a1(hX,{flexDirection:"column",padding:1,borderStyle:"round",borderColor:"red",children:[a1(N$,{color:"red",children:"应用发生错误"},void 0,!1,void 0,this),a1(N$,{children:" "},void 0,!1,void 0,this),a1(N$,{color:"red",children:this.state.error?.message},void 0,!1,void 0,this),a1(N$,{children:" "},void 0,!1,void 0,this),a1(N$,{color:"gray",children:"错误详情:"},void 0,!1,void 0,this),a1(N$,{color:"gray",children:this.state.error?.stack},void 0,!1,void 0,this),a1(N$,{children:" "},void 0,!1,void 0,this),a1(N$,{color:"yellow",children:"请重启应用或联系开发者"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return this.props.children}}import{Box as T$,Text as o1,useInput as gX}from"ink";import{useState as eQ}from"react";import{jsxDEV as Z1}from"react/jsx-dev-runtime";var S2=[{key:"update",label:"Update now",description:`runs \`${nJ()}\``},{key:"skip",label:"Skip",description:""},{key:"skip_until_next",label:"Skip until next version",description:""}],sJ=({versionInfo:$,onComplete:Q})=>{let[Y,J]=eQ(0),[Z,X]=eQ(!1),[G,q]=eQ(null);gX((U,W)=>{if(W.ctrl&&U==="c"){q8().shutdown("SIGINT",0);return}if(Z||G)return;if(W.upArrow||U==="k")J((O)=>O>0?O-1:S2.length-1);else if(W.downArrow||U==="j")J((O)=>O<S2.length-1?O+1:0);else if(W.return)K(S2[Y].key);else if(U==="1")K("update");else if(U==="2")K("skip");else if(U==="3")K("skip_until_next")});let K=async(U)=>{switch(U){case"update":{X(!0);let W=await tJ();q(W.message),setTimeout(()=>{q8().shutdown("SIGINT",0)},1500);break}case"skip":Q();break;case"skip_until_next":if($.latestVersion)await iJ($.latestVersion);Q();break}};if(G)return Z1(T$,{flexDirection:"column",marginY:1,children:Z1(o1,{children:G},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Z)return Z1(T$,{flexDirection:"column",marginY:1,children:Z1(o1,{color:"cyan",children:"Updating..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);return Z1(T$,{flexDirection:"column",marginY:1,children:[Z1(o1,{color:"yellow",bold:!0,children:["Update available! ",Z1(o1,{color:"gray",children:[$.currentVersion," ","->"," ",$.latestVersion]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Z1(T$,{marginTop:1,children:Z1(o1,{color:"gray",children:["Release notes:"," ",Z1(o1,{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(T$,{flexDirection:"column",marginTop:1,children:S2.map((U,W)=>{let O=W===Y,H=O?"› ":" ",z=`${W+1}. `;return Z1(T$,{children:Z1(o1,{color:O?"cyan":void 0,children:[H,z,U.label,U.description&&Z1(o1,{color:"gray",children:[" (",U.description,")"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},U.key,!1,void 0,this)})},void 0,!1,void 0,this),Z1(T$,{marginTop:1,children:Z1(o1,{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 v2,Text as s$,useInput as mX}from"ink";import{useState as eJ}from"react";import{jsxDEV as v1}from"react/jsx-dev-runtime";var $Y=({status:$,onTrust:Q,onContinueSafely:Y})=>{let J=r0.getTheme(),[Z,X]=eJ(!1),[G,q]=eJ(null);return mX((K,U)=>{if(Z)return;if(U.return||K.toLowerCase()==="t"){X(!0),q(null),Q().catch((W)=>{q(W instanceof Error?W.message:"Failed to trust workspace"),X(!1)});return}if(K.toLowerCase()==="s"||U.escape)X(!0),q(null),Y().catch((W)=>{q(W instanceof Error?W.message:"Failed to continue safely"),X(!1)})}),v1(v2,{flexDirection:"column",paddingX:1,children:[v1(s$,{bold:!0,color:J.colors.warning,children:"Workspace review required"},void 0,!1,void 0,this),v1(s$,{dimColor:!0,children:$.projectPath},void 0,!1,void 0,this),v1(v2,{marginTop:1,flexDirection:"column",children:[v1(s$,{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((K)=>v1(s$,{children:[" ",K.path," · ",K.effects.length," effect(s)"]},`${K.kind}:${K.path}`,!0,void 0,this))]},void 0,!0,void 0,this),G&&v1(v2,{marginTop:1,children:v1(s$,{color:J.colors.error,children:G},void 0,!1,void 0,this)},void 0,!1,void 0,this),v1(v2,{marginTop:1,children:v1(s$,{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 pX}from"ink";import{useEffect as cX}from"react";function QY(){let{stdout:$}=pX();cX(()=>{if(!$.isTTY)return;return $.write(_9),$.write(fQ),()=>{$.write(N9),$.write(fQ)}},[$])}function JY($){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 e$}from"react/jsx-dev-runtime";function uX($){if($1().config.actions.setConfig($),$.debug)console.log("[Debug] 模型配置检查通过,准备就绪");a0().setInitializationStatus("ready")}var KH=($)=>{QY();let[Q,Y]=V2(!1),[J,Z]=V2(null),[X,G]=V2(!1),[q,K]=V2(null),U=D2((z,w)=>{let _=z instanceof Error?z.message:String(z);if(a0().setInitializationError(_),a0().setInitializationStatus("error"),Y(!0),w)console.error("[FAIL] 应用初始化失败:",_)}),W=D2(async()=>{try{let z=$1().config.config??ZY,w=XY(z,$);if(uX(w),w.resumeSessionId)GY().restoreSession(w.resumeSessionId,[]);if(w.debug)console.error("[Debug] 运行时配置:",w);let _=w.codeTheme;if(_&&r0.hasTheme(_)){if(r0.setTheme(_),$.debug)console.log(`[OK] 已加载主题: ${_}`)}try{O1.getInstance().loadConfig(w.hooks||{},l0());let C=await KY(l0());if($.debug&&w.hooks?.enabled)console.log("[OK] Hooks 系统已启用");if($.debug)console.log(`[OK] Workspace resources: ${C.subagents.getAllNames().length} agents, ${C.skills.size} skills, ${C.commands.getCommandCount()+C.commands.getPluginCommandCount()} commands, ${C.plugins.getAll().length} plugins`);let S=$1().session.sessionId;YY(S)}catch(F){if($.debug)console.warn("Hooks 初始化失败:",JY(F))}u8(async()=>{await UY.getInstance().killAll(),await qY.getInstance().disconnectAll(),O1.getInstance().cleanup()}),Y(!0)}catch(z){U(z,!!$.debug)}}),O=D2(async()=>{let z=await $4.getInstance().getStatus(l0());if(z.state==="untrusted"||z.state==="error"){K(z);return}await W()}),H=D2(async()=>{if($.versionCheckPromise){let z=await $.versionCheckPromise;if(z){Z(z),G(!0);return}}await O()});if(xX(()=>{H()},[]),X&&J)return e$(b8,{children:e$(sJ,{versionInfo:J,onComplete:()=>{G(!1),O()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(q)return e$(b8,{children:e$($Y,{status:q,onTrust:async()=>{await $4.getInstance().trust(l0()),await OY(),K(null),await W()},onContinueSafely:async()=>{K(null),await W()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(!Q)return null;return e$(b8,{children:e$(oJ,{...$},void 0,!1,void 0,this)},void 0,!1,void 0,this)};export{KH as AppWrapper};