blade-code 0.10.71 → 0.10.72

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 (108) hide show
  1. package/dist/blade.js +2 -2
  2. package/dist/{chunk-fcv8b6ny.js → chunk-06y3rada.js} +2 -2
  3. package/dist/{chunk-k0pa8874.js → chunk-0kat01bw.js} +1 -1
  4. package/dist/{chunk-th4jjfgm.js → chunk-0qj8jfj1.js} +1 -1
  5. package/dist/{chunk-ahg9vjb6.js → chunk-11gdqmbm.js} +1 -1
  6. package/dist/chunk-139s7p91.js +1 -0
  7. package/dist/{chunk-zvz2cnt4.js → chunk-18atvz38.js} +1 -1
  8. package/dist/{chunk-9hchc346.js → chunk-28wsyv32.js} +1 -1
  9. package/dist/{chunk-rm9hbew3.js → chunk-2d2bcyn1.js} +1 -1
  10. package/dist/{chunk-0tm20v38.js → chunk-2fd5trh8.js} +2 -2
  11. package/dist/{chunk-cdy9efgm.js → chunk-2sdnmxts.js} +1 -1
  12. package/dist/chunk-2vkzwqv0.js +1 -0
  13. package/dist/chunk-41smvqs8.js +1 -0
  14. package/dist/{chunk-hat9v5c5.js → chunk-4wvsg8cc.js} +1 -1
  15. package/dist/{chunk-6pyktfa4.js → chunk-4xpj0d6y.js} +1 -1
  16. package/dist/{chunk-byqxaa9v.js → chunk-5va3hhfp.js} +1 -1
  17. package/dist/chunk-61arrvhp.js +1 -0
  18. package/dist/{chunk-yn51162x.js → chunk-6j3k4v08.js} +1 -1
  19. package/dist/{chunk-s7jsadnc.js → chunk-6j9t1xbh.js} +2 -2
  20. package/dist/{chunk-nx31fkkf.js → chunk-6v7f2cv9.js} +53 -53
  21. package/dist/{chunk-j9q1wyxg.js → chunk-7am1z065.js} +1 -1
  22. package/dist/{chunk-2428hhvj.js → chunk-7hf1k2c9.js} +2 -2
  23. package/dist/chunk-8geywf8q.js +1 -0
  24. package/dist/{chunk-wrfay5r3.js → chunk-91qsjpm6.js} +2 -2
  25. package/dist/{chunk-1je1xw6v.js → chunk-a38chc6z.js} +18 -18
  26. package/dist/{chunk-0vrgrw71.js → chunk-awj9aqjy.js} +2 -2
  27. package/dist/chunk-bqz8wera.js +1 -0
  28. package/dist/chunk-brm24s69.js +2 -0
  29. package/dist/{chunk-r9d4mjxj.js → chunk-bs77d8hn.js} +1 -1
  30. package/dist/{chunk-mtphps19.js → chunk-c4j2anbm.js} +2 -2
  31. package/dist/{chunk-82htkvz8.js → chunk-ccgq8nrm.js} +2 -2
  32. package/dist/{chunk-be30r8an.js → chunk-cqeqjtxn.js} +1 -1
  33. package/dist/{chunk-93tvxmqg.js → chunk-cyjnza5n.js} +4 -4
  34. package/dist/chunk-d9a0g85f.js +1 -0
  35. package/dist/{chunk-1pjkgfez.js → chunk-e0hf1317.js} +1 -1
  36. package/dist/chunk-e4ynb9qf.js +1 -0
  37. package/dist/chunk-e6ezndyf.js +22 -0
  38. package/dist/{chunk-jzntxp7f.js → chunk-eh4h7fmr.js} +2 -2
  39. package/dist/chunk-eh9gdzk5.js +160 -0
  40. package/dist/chunk-emqbb5xh.js +1 -0
  41. package/dist/{chunk-h0ft81a3.js → chunk-g8425xh4.js} +1 -1
  42. package/dist/{chunk-t2wgf9tq.js → chunk-gv3ed5gw.js} +2 -2
  43. package/dist/chunk-gzysna9c.js +1 -0
  44. package/dist/{chunk-axtzde5k.js → chunk-hhk5ecpv.js} +2 -2
  45. package/dist/{chunk-gtcxybv5.js → chunk-hhvkzn6m.js} +1 -1
  46. package/dist/{chunk-d3ttqmyt.js → chunk-hryhnmwv.js} +277 -262
  47. package/dist/{chunk-2px6hzdc.js → chunk-hwjmm2br.js} +2 -2
  48. package/dist/{chunk-9q852bsc.js → chunk-j0yvwrd7.js} +2 -2
  49. package/dist/{chunk-m57w4p91.js → chunk-jyds9m8p.js} +1 -1
  50. package/dist/{chunk-v0rsz1rt.js → chunk-m6qgme8k.js} +1 -1
  51. package/dist/{chunk-97aywyzn.js → chunk-mhyat4mq.js} +2 -2
  52. package/dist/{chunk-qgrq04hb.js → chunk-mp4bfn57.js} +1 -1
  53. package/dist/chunk-mrh3vs01.js +2 -0
  54. package/dist/chunk-ph5rn44j.js +1 -0
  55. package/dist/chunk-pqhjrdnq.js +10 -0
  56. package/dist/{chunk-0j22w4wh.js → chunk-q6daf441.js} +1 -1
  57. package/dist/{chunk-0wxkymqv.js → chunk-s9brgcgs.js} +1 -1
  58. package/dist/{chunk-trn6r1g3.js → chunk-ss1znmv0.js} +1 -1
  59. package/dist/{chunk-3hy06st1.js → chunk-tms0pr01.js} +2 -2
  60. package/dist/chunk-v7phc78b.js +1 -0
  61. package/dist/{chunk-t8xmh4w2.js → chunk-wvg81sd9.js} +1 -1
  62. package/dist/{chunk-x9tvjkjv.js → chunk-x4hh8yqg.js} +1 -1
  63. package/dist/{chunk-dwb2nmms.js → chunk-xahapj98.js} +1 -1
  64. package/dist/{chunk-s77sbxr7.js → chunk-xszsveq1.js} +1 -1
  65. package/dist/{chunk-azw0jckv.js → chunk-y858e8pb.js} +2 -2
  66. package/dist/{chunk-bjqjdw34.js → chunk-yhnr8vdb.js} +2 -2
  67. package/dist/{chunk-cff9gphh.js → chunk-yjj7q7hy.js} +1 -1
  68. package/dist/{chunk-zdnk7qtn.js → chunk-ypwjzw5x.js} +2 -2
  69. package/dist/{chunk-4ke8k0xw.js → chunk-z7vj2xrg.js} +3 -3
  70. package/dist/{chunk-5te2jqt3.js → chunk-zac26wwd.js} +1 -1
  71. package/dist/{chunk-wfy851et.js → chunk-zf96d5we.js} +1 -1
  72. package/dist/chunk-zqxj65xc.js +1 -0
  73. package/dist/chunk-zssys78z.js +1 -0
  74. package/dist/web/assets/ChatView-CgUC5rxo.js +18 -0
  75. package/dist/web/assets/{CodeBlockHighlighter-Dy7QpAmC.js → CodeBlockHighlighter-B5DRAEhB.js} +1 -1
  76. package/dist/web/assets/{FilePreview-BI3nkxz1.js → FilePreview-DSpvLsjW.js} +1 -1
  77. package/dist/web/assets/{KanbanBoard-D5dYOyPH.js → KanbanBoard-6K7IeCXi.js} +1 -1
  78. package/dist/web/assets/{MarkdownRenderer-Da1vB81L.js → MarkdownRenderer-D6LiW9kF.js} +3 -3
  79. package/dist/web/assets/{SettingsModal-jcCFqLqS.js → SettingsModal-CFHxLfuL.js} +1 -1
  80. package/dist/web/assets/{TaskSwitcher-CQ--jOLB.js → TaskSwitcher-Bng9nDed.js} +1 -1
  81. package/dist/web/assets/{TerminalPanel-CWzjEXOb.js → TerminalPanel-BnyQZwkN.js} +1 -1
  82. package/dist/web/assets/index-CDdYV8kB.css +1 -0
  83. package/dist/web/assets/index-DId2GJVO.js +11 -0
  84. package/dist/web/assets/{vendor-icons-B63aW_OM.js → vendor-icons-C927DZlr.js} +41 -36
  85. package/dist/web/index.html +3 -3
  86. package/package.json +1 -1
  87. package/dist/chunk-1w83z8j0.js +0 -1
  88. package/dist/chunk-3as0bkqy.js +0 -1
  89. package/dist/chunk-4pexpa3h.js +0 -160
  90. package/dist/chunk-8j568nm6.js +0 -1
  91. package/dist/chunk-92x15fzx.js +0 -2
  92. package/dist/chunk-ckqpt15b.js +0 -1
  93. package/dist/chunk-fcmgwzrj.js +0 -10
  94. package/dist/chunk-gvbx0t4j.js +0 -1
  95. package/dist/chunk-j0p54tqt.js +0 -1
  96. package/dist/chunk-n827nys9.js +0 -1
  97. package/dist/chunk-nwzpnx7m.js +0 -22
  98. package/dist/chunk-qnsvae10.js +0 -1
  99. package/dist/chunk-sp3bn8qh.js +0 -1
  100. package/dist/chunk-v7p533ff.js +0 -1
  101. package/dist/chunk-vthgpdbd.js +0 -1
  102. package/dist/chunk-wneeq8cr.js +0 -1
  103. package/dist/chunk-xdz5zrjt.js +0 -1
  104. package/dist/chunk-xz6y0w4n.js +0 -2
  105. package/dist/chunk-xzz69esf.js +0 -1
  106. package/dist/web/assets/ChatView-BVrhnE2j.js +0 -18
  107. package/dist/web/assets/index-BOgOL4hG.js +0 -11
  108. package/dist/web/assets/index-DbWgTuT3.css +0 -1
@@ -0,0 +1,160 @@
1
+ import{b as _Y,c as NY,d as FY}from"./chunk-cqeqjtxn.js";import{j as AJ,k as PJ}from"./chunk-28wsyv32.js";import{u as a2}from"./chunk-11gdqmbm.js";import{$ as cJ,B as C6,D as IY,F as XQ,G as $Q,H as w6,O as E1,Q as u4,R as l4,V as X2,W as gJ,X as mJ,_ as pJ,da as q4,ea as x6,ga as m6,ha as p6,ia as TY,ja as $6,la as Q6,na as f6}from"./chunk-hryhnmwv.js";import{ra as t9,sa as s9,ta as e9,wa as MY}from"./chunk-mp4bfn57.js";import{ya as O6}from"./chunk-brm24s69.js";import{Bb as n8,fb as G6,gb as U6,sb as q6}from"./chunk-6v7f2cv9.js";import{Mb as q2}from"./chunk-0qj8jfj1.js";import{Dc as a4,Ec as o8,Fc as i4,Hc as p2,Pc as Z2,Sc as y0,dc as J6,rc as c4,wc as x4}from"./chunk-mhyat4mq.js";import"./chunk-s9brgcgs.js";import"./chunk-c4j2anbm.js";import{td as OY}from"./chunk-6j9t1xbh.js";import{ud as O2,vd as i2,xd as f1}from"./chunk-awj9aqjy.js";import"./chunk-yhnr8vdb.js";import{$d as m0,Bd as C$,Cd as d0,Dd as Q$,Ed as kQ,Fd as V$,Gd as c2,Hd as b9,Id as nQ,Jd as NJ,Kd as A9,Ld as k$,Md as e0,Nd as yY,Od as r0,Pd as qY,Qd as T8,Rd as G2,Ud as s4}from"./chunk-a38chc6z.js";import"./chunk-v508x7cg.js";import"./chunk-q6daf441.js";import"./chunk-ypwjzw5x.js";import{me as tQ}from"./chunk-91qsjpm6.js";import"./chunk-6j3k4v08.js";import"./chunk-06y3rada.js";import{Ae as $Y,Fe as EJ,Oe as RY,xe as h6}from"./chunk-hhk5ecpv.js";import"./chunk-4wvsg8cc.js";import"./chunk-2sdnmxts.js";import"./chunk-18atvz38.js";import{cf as DQ,ef as O1}from"./chunk-z7vj2xrg.js";import"./chunk-jyds9m8p.js";import{gg as AY,lg as hJ,mg as PY}from"./chunk-ccgq8nrm.js";import"./chunk-g8425xh4.js";import"./chunk-m6qgme8k.js";import{vg as j$,wg as x2,xg as VQ}from"./chunk-mrh3vs01.js";import{Bg as u0}from"./chunk-0kat01bw.js";import"./chunk-4xpj0d6y.js";import{Zg as bY,ah as s1}from"./chunk-gv3ed5gw.js";import{ch as BJ,dh as wJ,gh as g1}from"./chunk-hwjmm2br.js";import"./chunk-wvg81sd9.js";import{sh as UJ}from"./chunk-y858e8pb.js";import{vh as G4}from"./chunk-eh4h7fmr.js";import"./chunk-bs77d8hn.js";import"./chunk-j0yvwrd7.js";import{Ih as vQ}from"./chunk-zf96d5we.js";import{useMemoizedFn as E8}from"ahooks";import{useEffect as H7,useState as g8}from"react";import{useMemoizedFn as n0}from"ahooks";import{Box as z$}from"ink";import{useEffect as _$,useMemo as q7,useRef as V8}from"react";import{useShallow as fY}from"zustand/react/shallow";import{useStore as CY}from"zustand";function s($){return CY(k$,$)}var kY=[],S$=()=>s(($)=>$.session.sessionId),C1=()=>s(($)=>$.session.workspaceRoot),O4=()=>s(($)=>$.session.messages),z4=()=>s(($)=>$.session.clearCount),_4=()=>s(($)=>$.session.isCompacting),N4=()=>s(($)=>$.session.tokenUsage.estimatedCostUsd),F4=()=>s(($)=>{let{totalInputTokens:Q,cacheReadTokens:Y,cacheWriteTokens:J}=$.session.tokenUsage;return q4({totalInputTokens:Q,cacheReadTokens:Y,cacheWriteTokens:J}).hitRate}),W4=()=>s(($)=>$.session.providerCircuit),H4=()=>s(($)=>$.session.providerAdmission),L4=()=>s(($)=>$.session.providerRetry),B4=()=>s(($)=>$.session.providerStall),w4=()=>s(($)=>$.session.actionStationarity),n1=()=>s(($)=>$.session.actions),b4=()=>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)}),A4=()=>s(($)=>$.app.initializationStatus),P4=()=>s(($)=>$.app.initializationError),C2=()=>s(($)=>$.app.activeModal),y4=()=>s(($)=>$.app.tasks),R4=()=>s(($)=>$.app.modelEditorTarget),M4=()=>s(($)=>$.app.sessionSelectorData),I4=()=>s(($)=>$.app.awaitingSecondCtrlC),t1=()=>s(($)=>$.app.actions),f2=()=>s(($)=>$.app.sideConversation),k2=()=>s(($)=>$.app.initializationStatus==="ready"),T4=()=>s(($)=>$.app.tasks.length>0),v$=()=>s(($)=>$.config.config?.permissionMode||"default"),C4=()=>s(($)=>$.config.config?.models??kY),S2=()=>s(($)=>{let Q=$.config.config;if(!Q)return;let Y=Q.currentModelId;return Q.models.find((Z)=>Z.id===Y)??Q.models[0]}),v2=()=>s(($)=>$.config.config?.currentModelId),A0=()=>s(($)=>{return d0.getTheme()}),f4=()=>s(($)=>$.config.config?.codeTheme??"default"),s0=()=>s(($)=>$.focus.currentFocus),k4=()=>s(($)=>$.focus.actions),D$=()=>s(($)=>$.command.isProcessing),S4=()=>s(($)=>$.command.actions),D2=()=>s(($)=>$.command.pendingCommands),v4=()=>s(($)=>$.command.recoveredSteeringCount),V2=()=>s(($)=>$.app.reasoningEffort!=="off"),j2=()=>s(($)=>$.app.reasoningEffort),h2=()=>s(($)=>$.app.serviceTier),E2=()=>s(($)=>$.app.responseVerbosity),g2=()=>s(($)=>$.app.communicationStyle),D4=()=>s(($)=>$.session.currentThinkingContent),V4=()=>s(($)=>$.session.thinkingExpanded),j4=()=>s(($)=>$.session.currentStreamingMessageId),h4=()=>s(fY(($)=>({lines:$.session.currentStreamingLines,tail:$.session.currentStreamingTail,lineCount:$.session.currentStreamingLineCount,version:$.session.currentStreamingVersion}))),E4=()=>s(($)=>$.session.finalizingStreamingMessageId),g4=()=>s(($)=>$.session.historyExpanded),m4=()=>s(($)=>$.session.expandedMessageCount);import{useMemoizedFn as W$}from"ahooks";import{useEffect as K2,useRef as a8}from"react";function SY($){if(!($ instanceof Error))return"未知错误";let J=$.lastError??$;if(J.responseBody)try{let K=JSON.parse(J.responseBody)?.error?.message;if(K){let U=J.statusCode?` (HTTP ${J.statusCode})`:"";return`${K}${U}`}}catch{}let Z=$.message.match(/Last error:\s*(.+)$/);if(Z)return Z[1];return $.message}function vY($){if(!($ instanceof Error))return!1;return $.name==="AbortError"||$.message.includes("aborted")}function DY($){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 m2($){let Q=vY($),Y=DY($),J;if(Y)J="当前模型不支持图片理解功能。请切换到支持视觉能力的模型(如 Claude 4.5、GPT-5.2、Gemini 3 Pro、Qwen3-VL-Plus 等)后重试。";else J=SY($);return{displayMessage:J,isAbort:Q,isVisionNotSupported:Y}}import{appendFileSync as VY,mkdirSync as jY,writeFileSync as hY}from"node:fs";import EY from"node:os";import x8 from"node:path";var p4=null;function gY(){let $=process.env.BLADE_STORAGE_ROOT||x8.join(EY.homedir(),".blade");return x8.join($,"logs","stream-debug.log")}function mY($){if(p4===$)return;let Q=x8.dirname($);jY(Q,{recursive:!0,mode:493}),hY($,`=== Stream Debug Log Started: ${new Date().toISOString()} ===
2
+ `),p4=$}function u8($,Q,Y){try{let J=gY();mY(J);let Z=new Date().toISOString(),X=Y?` | ${JSON.stringify(Y)}`:"",K=`[${Z}] [${$}] ${Q}${X}
3
+ `;VY(J,K)}catch{}}var Y2=s1("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,u8("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),Y2.debug("[loopEventHandler] stream_end",{contentDeltaCount:Q.contentDeltaCount,contentDeltaTotalLen:Q.contentDeltaTotalLen,streamFinalized:Y,signalAborted:$.signal.aborted}),u8("loopEventHandler","onStreamEnd",{contentDeltaCallCount:Q.contentDeltaCount,contentDeltaTotalLen:Q.contentDeltaTotalLen,streamFinalized:Y,signalAborted:$.signal.aborted}),Y||$.signal.aborted){Y=!0;break}let{extraContent:Z,extraThinking:X}=$.streamingBuffer.drainPendingBuffers(),K=$.getStreamingMessageId();if(K){if(Z)V$(K,Z);c2(K)}$.sessionActions.finalizeStreamingMessage(Z,X),Y=!0;break}case"model_fallback":Y=!0,$.sessionActions.setProviderAdmission(null),$.sessionActions.setProviderCircuit(null),$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),$.streamingBuffer.resetStreamingBuffers(),$.sessionActions.discardStreamingMessage(),$.sessionActions.setCurrentThinkingContent(null);break;case"provider_admission":{let{kind:Z,...X}=J;$.sessionActions.setProviderAdmission(J.phase==="queued"?X:null);break}case"provider_circuit":{let{kind:Z,...X}=J;$.sessionActions.setProviderCircuit(J.phase==="closed"?null:X);break}case"provider_retry":{let{kind:Z,...X}=J;$.sessionActions.setProviderRetry(J.phase==="recovered"?null:X);break}case"provider_stall":{let{kind:Z,...X}=J;$.sessionActions.setProviderStall(J.phase==="detected"?X:null);break}case"action_stationarity":{let{kind:Z,...X}=J;$.sessionActions.setActionStationarity(J.phase==="recovered"?null:X);break}case"tool_start":{let Z=J.toolCall;if(!("function"in Z))break;if(Z.function.name===p2)break;if(Y2.debug("[loopEventHandler] tool_start",{toolName:Z.function.name,toolKind:J.toolKind}),["TaskCreate","TaskUpdate","TaskList"].includes(Z.function.name))break;try{let X=JSON.parse(Z.function.arguments),K=u4(Z.function.name,X);$.sessionActions.addToolMessage(K,{toolCallId:Z.id,toolName:Z.function.name,phase:"start",summary:K,params:X})}catch(X){Y2.error("[loopEventHandler] onToolStart error:",X)}break}case"tool_progress":{let Z=J.toolCall;if(!("function"in Z))break;if(Z.function.name===p2)break;let X=J.update.total!==void 0?` ${Math.max(0,Math.min(100,Math.round((J.update.progress??0)/J.update.total*100)))}%`:"",K=`${Z.function.name}${X}: ${J.update.message}`;$.sessionActions.addToolMessage(K,{toolCallId:Z.id,toolName:Z.function.name,phase:"progress",summary:K,...J.update.admission?{admission:J.update.admission}:{}});break}case"tool_result":{let Z=J.toolCall;if(!("function"in Z))break;if(Z.function.name===p2)break;Y2.debug("[loopEventHandler] tool_result",{toolName:Z.function.name,success:J.result.success});let X=x4(l4(Z.function.name,J.result),c4);$.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":Y2.debug("[loopEventHandler] turn_start",{turn:J.turn,maxTurns:J.maxTurns}),$.sessionActions.updateTokenUsage({turnCount:J.turn}),$.sessionActions.setProviderCircuit(null),$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),Y=!1;break;case"task_update":$.appActions.setTasks(J.tasks);break;case"mcp_catalog_changed":{let Z=`MCP catalog r${J.revision}: +${J.added.length} -${J.removed.length} ~${J.updated.length}`;$.sessionActions.addToolMessage(Z,{toolName:"MCP Catalog",phase:"complete",summary:Z,detail:[J.added.length>0?`Added: ${J.added.join(", ")}`:"",J.removed.length>0?`Removed: ${J.removed.join(", ")}`:"",J.updated.length>0?`Updated: ${J.updated.join(", ")}`:""].filter(Boolean).join(`
4
+ `)});break}case"mcp_content_changed":{let Z=`MCP ${J.contentKind} r${J.revision}: +${J.added.length} -${J.removed.length} ~${J.updated.length}`;$.sessionActions.addToolMessage(Z,{toolName:"MCP Content",phase:"complete",summary:Z,detail:[J.added.length>0?`Added: ${J.added.join(", ")}`:"",J.removed.length>0?`Removed: ${J.removed.join(", ")}`:"",J.updated.length>0?`Updated: ${J.updated.join(", ")}`:""].filter(Boolean).join(`
5
+ `)});break}case"mcp_resource_updated":{let Z=`MCP resource updated: ${J.uri}`;$.sessionActions.addToolMessage(Z,{toolName:"MCP Resource",phase:"progress",summary:Z,detail:`${J.serverName} · revision ${J.revision}`});break}case"mcp_connection_changed":{let Z=J.phase==="reconnecting"?"recovering":J.phase==="recovered"?"recovered":"recovery failed",X=`MCP ${J.serverName} ${Z}`+(J.phase==="reconnecting"?` (${J.attempt}/${J.maxAttempts})`:"");$.sessionActions.addToolMessage(X,{toolName:"MCP Connection",phase:"complete",summary:X,detail:[`reason: ${J.reason}`,`revision: ${J.revision}`,J.error?`error: ${J.error}`:""].filter(Boolean).join(`
6
+ `)});break}case"mcp_log":{let Z=J.logger?`${J.serverName} · ${J.logger}`:J.serverName,X=`MCP ${J.level} · ${Z}`;$.sessionActions.addToolMessage(X,{toolName:"MCP Log",phase:"complete",summary:X,detail:[J.message,`revision: ${J.revision}`,`sha256: ${J.dataSha256}`,J.truncated?"truncated: true":"",J.detailsOmitted?"details omitted by runtime policy":""].filter(Boolean).join(`
7
+ `)});break}case"mcp_instructions_changed":{let Z=`MCP instructions ${J.action}: ${J.serverName}`+(J.truncated?" (truncated)":"");$.sessionActions.addToolMessage(Z,{toolName:"MCP Instructions",phase:"complete",summary:Z,detail:[J.text??"",J.sha256?`sha256: ${J.sha256}`:"",J.detailsOmitted?"details omitted by runtime policy":""].filter(Boolean).join(`
8
+ `)});break}case"mcp_task_changed":{let Z=`MCP task ${J.status}: ${J.taskId} (${J.serverName}/${J.toolName})`;$.sessionActions.addToolMessage(Z,{toolName:"MCP Task",phase:"complete",summary:Z,detail:[J.statusMessage??"",`revision: ${J.revision}`,J.hasResult?"result available via TaskOutput":"",J.error?`error: ${J.error}`:""].filter(Boolean).join(`
9
+ `)});break}case"project_rules_loaded":{let Z=`Project rules loaded: ${J.files.length}`+(J.blockedWrite?" (write retry required)":"");$.sessionActions.addToolMessage(Z,{toolName:"Project Rules",phase:"complete",summary:Z,detail:J.files.map((X)=>`${X.relativePath} ${X.source} sha256=${X.contentSha256}`).join(`
10
+ `)});break}case"steering_applied":for(let Z=0;Z<J.count;Z++)$.commandActions.dequeueCommand();if(J.recovered>0)$.commandActions.setRecoveredSteeringCount(J.recovered);break;case"follow_up_started":for(let Z of J.messages){if(!Z.recovered||Z.persisted)continue;let X=typeof Z.content==="string"?Z.content:Z.content.map((K)=>K.type==="text"?K.text:"[Image]").join(`
11
+ `);$.sessionActions.addUserMessage(X)}if(J.recovered>0)$.commandActions.setRecoveredSteeringCount(J.recovered);break;case"goal_updated":case"goal_continuation_started":break;case"subagent_spawned":case"subagent_completed":break;default:{let Z=J}}}}function d8($){let{text:Q,parts:Y}=$,J=Y.filter((K)=>K.type==="image");if(J.length===0)return Q;if(J.length>j$)throw Error(`最多只能发送 ${j$} 张图片`);if(J.reduce((K,U)=>K+`data:${U.mimeType};base64,`.length+U.base64.length,0)>x2)throw Error("图片编码后总大小不能超过 5 MiB");let X=[];for(let K of Y)if(K.type==="text")X.push({type:"text",text:K.text});else X.push({type:"image_url",image_url:{url:`data:${K.mimeType};base64,${K.base64}`}});return X}function r4($){let Q=i4($.metadata);return{role:$.role,content:Q?a4(Q):$.content,...$.metadata?{metadata:$.metadata}:{}}}function u2($){if(!$.restoredContextMessages||$.restoredVisibleMessageCount<=0)return $.messages.map(r4);let Q=$.messages.slice($.restoredVisibleMessageCount).map(r4);return[...$.restoredContextMessages,...Q]}import pY from"node:path";function o4($){if($.length<=8)return $;return`${$.slice(0,8)}…`}function cY($){return pY.resolve($)}function n4($){if(!$||!s4($))return;e0().config.actions.updateConfig({currentModelId:$})}function t4($){if(!$)return;e0().config.actions.updateConfig({permissionMode:$})}async function l2($,Q){return y0.listSessions({includeSubagents:!1})}async function d2($,Q,Y,J){let{intent:Z,session:X,newSessionId:K,announceFork:U,permissionModeOverride:G}=$,q=cY(X.projectPath);if(Z==="fork"){let z=await y0.forkSession(X.sessionId,{...K?{newSessionId:K}:{},sourceProjectPath:q,targetProjectPath:q}),B=await y0.loadSessionModelContext(z.sessionId,z.metadata.projectPath),_=[...y0.toUISafeMessages(z.messages)];if(U!==!1){let P=Date.parse(z.metadata.lastMessageTime);_.push({id:"fork-announcement-"+z.sessionId,role:"assistant",content:"Forked "+o4(X.sessionId)+" → "+o4(z.sessionId),timestamp:Number.isNaN(P)?0:P})}return await J(),t4(G??z.metadata.permissionMode),n4(z.metadata.selectedModelId),Y.restoreSession(z.sessionId,_,B,z.metadata.projectPath),{sessionId:z.sessionId,messages:B}}await y0.assertSessionWritable(X.sessionId,X.projectPath);let[H,O]=await Promise.all([y0.loadSession(X.sessionId,X.projectPath),y0.loadSessionModelContext(X.sessionId,X.projectPath)]),N=y0.toUISafeMessages(H);return await J(),t4(G??X.permissionMode),n4(X.selectedModelId),Y.restoreSession(X.sessionId,N,O,X.projectPath),{sessionId:X.sessionId,messages:O}}function e4($){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 xY($){return typeof $==="object"&&$!==null&&$.action==="invoke_skill"&&typeof $.skillName==="string"}function uY($){return typeof $==="object"&&$!==null&&$.action==="invoke_custom_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function lY($){return typeof $==="object"&&$!==null&&$.action==="invoke_plugin_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function dY($){return typeof $==="object"&&$!==null&&$.action==="invoke_once_model"&&typeof $.modelId==="string"&&typeof $.prompt==="string"}function rY($){return typeof $==="object"&&$!==null&&["start_goal","resume_goal"].includes(String($.action))&&typeof $.goal?.objective==="string"}function aY($){return typeof $==="object"&&$!==null&&$.action==="rewind_session"&&typeof $.sessionId==="string"&&Array.isArray($.messages)&&Array.isArray($.visibleMessages)}function iY($){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)=>e4(Z))}if(Y==="activate_session")return e4($.session);return!1}function oY($,Q,Y,J){switch($){case"show_theme_selector":return Y.setActiveModal("themeSelector"),!0;case"show_model_selector":return Y.setActiveModal("modelSelector"),!0;case"show_model_add_wizard":return Y.setActiveModal("modelAddWizard"),!0;case"show_permissions_manager":return Y.setActiveModal("permissionsManager"),!0;case"show_agents_manager":return Y.setActiveModal("agentsManager"),!0;case"show_skills_manager":return Y.setActiveModal("skillsManager"),!0;case"show_hooks_manager":return Y.setActiveModal("hooksManager"),!0;case"show_plugins_manager":return Y.setActiveModal("pluginsManager"),!0;case"show_agent_creation_wizard":return Y.setActiveModal("agentCreationWizard"),!0;case"show_session_selector":{let Z=Q?.sessions;return Y.showSessionSelector(Z??[],"resume"),!0}case"session_forked":{let Z=Q;if(Z?.action!=="restore_forked_session"||!Z.sessionId||!Array.isArray(Z.messages)||!Array.isArray(Z.visibleMessages))return!1;return J.restoreSession(Z.sessionId,Z.visibleMessages,Z.messages),!0}case"session_archived":{let Z=Q?.session;return J.addAssistantMessage(Z?`会话 ${Z.sessionId} 已归档。`:"当前会话已归档。"),f1(0),!0}case"clear_screen":return J.clearMessages(),J.setError(null),J.resetTokenUsage(),Y.setTasks([]),!0;case"compact_completed":case"compact_fallback":{let Z=Q,X=Z?.compactedMessages;if(X)J.setCompactedContext(X);if(Z?.usage)J.updateTokenUsage({inputTokens:Z.usage.promptTokens,outputTokens:Z.usage.completionTokens,totalTokens:Z.usage.totalTokens,maxContextTokens:Z.maxContextTokens,cacheReadTokens:Z.usage.cacheReadInputTokens??0,cacheWriteTokens:Z.usage.cacheCreationInputTokens??0,costUsd:Z.usage.costUsd});return J.resetContextUsage(),!0}case"exit_application":return f1(0),!0;default:return!1}}async function r8($,Q,Y,J,Z,X,K,U,G,q,H,O,N,z,B=u0(),_){let{text:P}=$;if(!$6(P))return{type:"not_slash"};let F=await Q6(P,{cwd:B,surface:"tui",workspaceRoot:B,sessionId:X,messages:K,rewind:U,lifecycle:X===void 0?void 0:{archiveCurrent:async()=>{return await Z(),y0.archiveSession(X,B)}},subagents:G,mcp:q,reasoning:H,serviceTier:O,responseVerbosity:N,communicationStyle:z,codeReview:_,signal:J});if(F.success&&iY(F.data)){if(F.data.action==="select_session")return Q.showSessionSelector(F.data.sessions,F.data.intent),{type:"handled",commandResult:{success:!0}};return await d2(F.data,B,Y,Z),{type:"handled",commandResult:{success:!0}}}if(F.success&&aY(F.data))return Y.restoreSession(F.data.sessionId,F.data.visibleMessages,F.data.messages),Q.setTasks([]),{type:"handled",commandResult:{success:!0}};if(F.message){if(oY(F.message,F.data,Q,Y))return{type:"handled",commandResult:{success:!0}}}if(xY(F.data)){let{skillName:I,skillArgs:L}=F.data,C=L?`Please use the "${I}" skill to help me with: ${L}`:`Please use the "${I}" skill.`;return Y.addUserMessage(C),{type:"continue_as_agent",result:{userDisplayMessage:C,agentInput:{displayText:C,text:C,images:[],parts:[{type:"text",text:C}]},userMessageAlreadyAdded:!0}}}if(uY(F.data)){let{commandName:I,processedContent:L}=F.data;Y.addUserMessage(P);let C=`# Custom Command: /${I}
12
+
13
+ The user has invoked the custom command "/${I}". Follow the instructions below to complete the task.
14
+
15
+ ---
16
+
17
+ ${L}
18
+
19
+ ---
20
+
21
+ Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:P,agentInput:{displayText:P,text:C,images:[],parts:[{type:"text",text:C}]},userMessageAlreadyAdded:!0}}}if(lY(F.data)){let{commandName:I,pluginName:L,processedContent:C}=F.data;Y.addUserMessage(P);let w=`# Plugin Command: /${I}
22
+
23
+ The user has invoked the plugin command "/${I}" from plugin "${L}". Follow the instructions below to complete the task.
24
+
25
+ ---
26
+
27
+ ${C}
28
+
29
+ ---
30
+
31
+ Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:P,agentInput:{displayText:P,text:w,images:[],parts:[{type:"text",text:w}]},userMessageAlreadyAdded:!0}}}if(dY(F.data)){let{modelId:I,prompt:L}=F.data;return Y.addUserMessage(L),{type:"continue_as_agent",result:{userDisplayMessage:L,agentInput:{displayText:L,text:L,images:[],parts:[{type:"text",text:L}]},userMessageAlreadyAdded:!0,onceModelId:I}}}if(rY(F.data)){let I=F.data.goal.objective;return Y.addUserMessage(P),{type:"continue_as_agent",result:{userDisplayMessage:P,agentInput:{displayText:P,text:I,images:[],parts:[{type:"text",text:I}]},userMessageAlreadyAdded:!0,goalContinuationOnly:!0}}}if(!F.success&&F.error)return Y.addAssistantMessage(`${F.error}`),{type:"handled",commandResult:{success:F.success,output:F.message,error:F.error,metadata:F.data}};let f=F.message;if(F.success&&typeof f==="string"&&f.trim()!=="")Y.addAssistantMessage(f);return{type:"handled",commandResult:{success:F.success,output:F.message,error:F.error,metadata:F.data}}}import{useMemoizedFn as R0}from"ahooks";import{useEffect as nY,useRef as r2}from"react";function Y6($){let Q=r2(void 0),Y=r2(void 0),J=r2(void 0),Z=r2(void 0),X=R0(async()=>{if(Z.current)return Z.current;let R=Q.current,M=Y.current;if(!R&&!M)return;Q.current=void 0,Y.current=void 0,J.current=void 0;let A=(async()=>{try{await R?.destroy()}finally{await M?.dispose()}})();Z.current=A;try{await A}finally{if(Z.current===A)Z.current=void 0}}),K=R0(async(R)=>{let M=$.workspaceRoot??Y.current?.workspaceRoot??u0();if(Y.current&&(Y.current.sessionId!==R||Y.current.workspaceRoot!==M))await X();if(!Y.current){let A=await y0.findSessionMetadata(R,M),v=A!==void 0&&(await y0.loadSession(R,M)).length>0;Y.current=await E1.create({sessionId:R,workspaceRoot:M,modelId:$.modelId,permissionMode:$.permissionMode??A?.permissionMode,reasoningEffort:A?.reasoningEffort??$.reasoningEffort,serviceTier:A?.serviceTier??$.serviceTier,responseVerbosity:A?.responseVerbosity??$.responseVerbosity,communicationStyle:A?.communicationStyle??$.communicationStyle,communicationStyleDigest:A?.communicationStyleDigest,agents:$.agents,...v?{sessionStart:{isResume:!0,resumeSessionId:R}}:{}});try{J.current={sessionId:R,modelId:A?.selectedModelId,permissionMode:A?.permissionMode,reasoningEffort:A?.reasoningEffort,serviceTier:A?.serviceTier,responseVerbosity:A?.responseVerbosity,communicationStyle:A?.communicationStyle,communicationStyleDigest:A?.communicationStyleDigest},r0().setReasoningEffort(Y.current.getReasoningConfiguration().selection),r0().setServiceTier(Y.current.getServiceTierConfiguration().selection),r0().setResponseVerbosity(Y.current.getResponseVerbosityConfiguration().selection),r0().setCommunicationStyle(Y.current.getCommunicationStyleConfiguration().selection)}catch(j){let D=Y.current;throw Y.current=void 0,await D.dispose().catch(()=>{return}),j}}return Y.current}),U=R0(async(R)=>{let M=R?.sessionId??$.sessionId,A=!!R?.modelId&&R.modelId!==$.modelId,v;if(!A&&M){let j=Y.current!==void 0,D=await K(M),E=R?.modelId??$.modelId,m=R?.reasoningEffort??(j?$.reasoningEffort:D.getReasoningConfiguration().selection),n=R?.serviceTier??(j?$.serviceTier:D.getServiceTierConfiguration().selection),$0=R?.responseVerbosity??(j?$.responseVerbosity:D.getResponseVerbosityConfiguration().selection),L0=R?.communicationStyle??(j?$.communicationStyle:D.getCommunicationStyleConfiguration().selection),I0=D.getCurrentModelId(),c0=D.getReasoningConfiguration(),h0=D.getServiceTierConfiguration(),F$=D.getResponseVerbosityConfiguration(),e$=D.getCommunicationStyleConfiguration();if($.permissionMode&&(J.current?.sessionId!==M||J.current.permissionMode!==$.permissionMode)){let t0=await y0.setSessionPermissionMode(M,D.workspaceRoot,$.permissionMode);J.current={...J.current,sessionId:M,permissionMode:t0.permissionMode}}await D.refresh({modelId:E,...m?{reasoningEffort:m}:{},...n?{serviceTier:n}:{},...$0?{responseVerbosity:$0}:{},...L0?{communicationStyle:L0}:{}});let j1=D.getCommunicationStyleConfiguration();if(j1.source!=="built-in"&&!j1.contentSha256)throw Error("Custom communication style has no provenance");let b1={...E&&E!=="inherit"&&(J.current?.sessionId!==M||J.current.modelId!==E)?{selectedModelId:E}:{},...m&&(J.current?.sessionId!==M||J.current.reasoningEffort!==m)?{reasoningEffort:m}:{},...n&&(J.current?.sessionId!==M||J.current.serviceTier!==n)?{serviceTier:n}:{},...$0&&(J.current?.sessionId!==M||J.current.responseVerbosity!==$0)?{responseVerbosity:$0}:{},...L0&&(J.current?.sessionId!==M||J.current.communicationStyle!==L0||J.current.communicationStyleDigest!==j1.contentSha256)?{communicationStyle:L0,communicationStyleDigest:j1.source==="built-in"?null:j1.contentSha256}:{}};if(Object.keys(b1).length>0)try{let t0=await y0.updateSessionMetadata(M,D.workspaceRoot,b1);J.current={sessionId:M,modelId:t0.selectedModelId,permissionMode:t0.permissionMode,reasoningEffort:t0.reasoningEffort,serviceTier:t0.serviceTier,responseVerbosity:t0.responseVerbosity,communicationStyle:t0.communicationStyle,communicationStyleDigest:t0.communicationStyleDigest}}catch(t0){throw await D.refresh({...I0?{modelId:I0}:{},reasoningEffort:c0.selection,serviceTier:h0.selection,responseVerbosity:F$.selection,communicationStyle:e$.selection}).catch(()=>{return}),t0}v=await X2.createWithRuntime(D,{sessionId:M,systemPrompt:R?.systemPrompt??$.systemPrompt,appendSystemPrompt:R?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:R?.maxTurns??$.maxTurns,modelId:R?.modelId??$.modelId,permissionMode:R?.permissionMode??$.permissionMode,agents:$.agents})}else v=await X2.create({systemPrompt:R?.systemPrompt??$.systemPrompt,appendSystemPrompt:R?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:R?.maxTurns??$.maxTurns,modelId:R?.modelId??$.modelId,permissionMode:R?.permissionMode??$.permissionMode,agents:$.agents});return Q.current=v,v}),G=R0(async()=>{if(!$.sessionId)throw Error("No active session to rewind");return(await K($.sessionId)).listRewindCheckpoints()}),q=R0(async(R)=>{if(!$.sessionId)throw Error("No active session to rewind");let A=await(await K($.sessionId)).rewindSession(R);return await X(),A}),H=R0(async()=>{if(!$.sessionId)throw Error("No active session for subagent control");return(await K($.sessionId)).listSubagents()}),O=R0(async(R,M)=>{if(!$.sessionId)throw Error("No active session for subagent control");let A=await K($.sessionId),v=!1,j,D=R,E=(n)=>{let $0=n.status==="completed"?n.result?.message:n.result?.error||n.result?.message;k$.getState().app.actions.completeSubagentProgress(D,n.status==="completed",$0)},m=A.resumeSubagent({agentId:R,prompt:M,onEvent:(n)=>{if(n.kind==="tool_start"&&"function"in n.toolCall)k$.getState().app.actions.updateSubagentTool(D,n.toolCall.function.name)},onCompleted:(n)=>{if(v)E(n);else j=n}});if(D=m.session.id,k$.getState().app.actions.startSubagentProgress(m.session.id,m.session.subagentType,`Resumed from ${m.source.id}: ${m.session.description}`),v=!0,j)E(j);return m}),N=R0(async()=>{if(!$.sessionId)throw Error("No active session for MCP content");return(await K($.sessionId)).getMcpContentCatalog()}),z=R0(async(R)=>{if(!$.sessionId)throw Error("No active session for MCP content");await(await K($.sessionId)).refreshMcpContentCatalogs(R)}),B=R0(async(R,M,A)=>{if(!$.sessionId)throw Error("No active session for MCP prompts");return(await K($.sessionId)).getMcpPrompt(R,M,A)}),_=R0(async(R,M,A)=>{if(!$.sessionId)throw Error("No active session for MCP completion");return(await K($.sessionId)).completeMcpArgument(R,M,A)}),P=R0(async(R,M={})=>{if(!$.sessionId)throw Error("No active session for MCP logs");return(await K($.sessionId)).getMcpLogs(R,M)}),b=R0(async(R)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await K($.sessionId)).listMcpTasks(R)}),F=R0(async(R)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await K($.sessionId)).getMcpTask(R)}),f=R0(async(R,M)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await K($.sessionId)).cancelMcpTask(R,M)}),I=R0(async(R,M)=>{if(!$.sessionId)throw Error("No active session for MCP logging");await(await K($.sessionId)).setMcpLoggingLevel(R,M)}),L=R0(async()=>{if(!$.sessionId)throw Error("No active session for MCP instructions");return(await K($.sessionId)).getMcpInstructions()}),C=R0(async()=>{if(!$.sessionId)throw Error("No active session for reasoning effort");return(await K($.sessionId)).getReasoningConfiguration()}),w=R0(async(R)=>{if(!$.sessionId)throw Error("No active session for reasoning effort");let M=await K($.sessionId);if(M.hasTurnOwner())throw Error("Cannot switch reasoning effort while a turn is active");let A=M.getReasoningConfiguration();if(M.resolveReasoningConfiguration(R),A.selection===R)return A;await M.refresh({reasoningEffort:R});try{let v;try{v=await y0.updateSessionMetadata($.sessionId,M.workspaceRoot,{reasoningEffort:R})}catch(j){if(!(j instanceof Z2)&&j.code!=="ENOENT")throw j;v=await y0.createSessionMetadata($.sessionId,M.workspaceRoot,{taskStatus:"completed",selectedModelId:M.getCurrentModelId(),reasoningEffort:R,serviceTier:M.getServiceTierConfiguration().selection,responseVerbosity:M.getResponseVerbosityConfiguration().selection,communicationStyle:M.getCommunicationStyleConfiguration().selection})}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},r0().setReasoningEffort(R),M.getReasoningConfiguration()}catch(v){throw await M.refresh({reasoningEffort:A.selection}),v}}),y=R0(async()=>{if(!$.sessionId)throw Error("No active session for service tier");return(await K($.sessionId)).getServiceTierConfiguration()}),k=R0(async(R)=>{if(!$.sessionId)throw Error("No active session for service tier");let M=await K($.sessionId);if(M.hasTurnOwner())throw Error("Cannot switch service tier while a turn is active");let A=M.getServiceTierConfiguration();if(M.resolveServiceTierConfiguration(R),A.selection===R)return A;await M.refresh({serviceTier:R});try{let v;try{v=await y0.updateSessionMetadata($.sessionId,M.workspaceRoot,{serviceTier:R})}catch(j){if(!(j instanceof Z2)&&j.code!=="ENOENT")throw j;v=await y0.createSessionMetadata($.sessionId,M.workspaceRoot,{taskStatus:"completed",selectedModelId:M.getCurrentModelId(),reasoningEffort:M.getReasoningConfiguration().selection,serviceTier:R,responseVerbosity:M.getResponseVerbosityConfiguration().selection,communicationStyle:M.getCommunicationStyleConfiguration().selection})}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},r0().setServiceTier(R),M.getServiceTierConfiguration()}catch(v){throw await M.refresh({serviceTier:A.selection}),v}}),T=R0(async()=>{if(!$.sessionId)throw Error("No active session for response verbosity");return(await K($.sessionId)).getResponseVerbosityConfiguration()}),W=R0(async(R)=>{if(!$.sessionId)throw Error("No active session for response verbosity");let M=await K($.sessionId);if(M.hasTurnOwner())throw Error("Cannot switch response verbosity while a turn is active");let A=M.getResponseVerbosityConfiguration();if(M.resolveResponseVerbosityConfiguration(R),A.selection===R)return A;await M.refresh({responseVerbosity:R});try{let v;try{v=await y0.updateSessionMetadata($.sessionId,M.workspaceRoot,{responseVerbosity:R})}catch(j){if(!(j instanceof Z2)&&j.code!=="ENOENT")throw j;v=await y0.createSessionMetadata($.sessionId,M.workspaceRoot,{taskStatus:"completed",selectedModelId:M.getCurrentModelId(),reasoningEffort:M.getReasoningConfiguration().selection,serviceTier:M.getServiceTierConfiguration().selection,responseVerbosity:R,communicationStyle:M.getCommunicationStyleConfiguration().selection})}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},r0().setResponseVerbosity(R),M.getResponseVerbosityConfiguration()}catch(v){throw await M.refresh({responseVerbosity:A.selection}),v}}),S=R0(async()=>{if(!$.sessionId)throw Error("No active session for communication style");return(await K($.sessionId)).getCommunicationStyleConfiguration()}),h=R0(async(R)=>{if(!$.sessionId)throw Error("No active session for communication style");let M=await K($.sessionId);if(M.hasTurnOwner())throw Error("Cannot switch communication style while a turn is active");let A=M.getCommunicationStyleConfiguration(),v=M.resolveCommunicationStyleConfiguration(R);if(v.source!=="built-in"&&!v.contentSha256)throw Error("Custom communication style has no provenance");if(A.selection===R)return A;await M.refresh({communicationStyle:R});try{let j;try{j=await y0.updateSessionMetadata($.sessionId,M.workspaceRoot,{communicationStyle:R,communicationStyleDigest:v.source==="built-in"?null:v.contentSha256})}catch(D){if(!(D instanceof Z2)&&D.code!=="ENOENT")throw D;j=await y0.createSessionMetadata($.sessionId,M.workspaceRoot,{taskStatus:"completed",selectedModelId:M.getCurrentModelId(),reasoningEffort:M.getReasoningConfiguration().selection,serviceTier:M.getServiceTierConfiguration().selection,responseVerbosity:M.getResponseVerbosityConfiguration().selection,communicationStyle:R,...v.source!=="built-in"&&v.contentSha256?{communicationStyleDigest:v.contentSha256}:{}})}return J.current={sessionId:$.sessionId,modelId:j.selectedModelId,permissionMode:j.permissionMode,reasoningEffort:j.reasoningEffort,serviceTier:j.serviceTier,responseVerbosity:j.responseVerbosity,communicationStyle:j.communicationStyle,communicationStyleDigest:j.communicationStyleDigest},r0().setCommunicationStyle(R),M.getCommunicationStyleConfiguration()}catch(j){throw await M.refresh({communicationStyle:A.selection}),j}}),o=R0(async(R)=>{if(!Y.current)return{accepted:!1,queued:0,reason:"no_active_turn"};return Y.current.enqueueSteering(R,{allowBeforeTurn:!0})}),d=R0(async(R,M)=>{let A=$.sessionId;if(!A)throw Error("Side conversation requires a Session");return(await K(A)).askSideQuestion(R,{signal:M,systemPrompt:$.systemPrompt,appendSystemPrompt:$.appendSystemPrompt})}),a=R0(async(R,M)=>{let A=$.sessionId;if(!A)throw Error("User shell command requires a Session");return(await K(A)).executeUserShellCommand(R,M)}),l=R0(async(R,M)=>{let A=$.sessionId;if(!A)throw Error("Code review requires a Session");let v=await K(A);await a2.recoverInterrupted(v.workspaceRoot,A,v);let j=await a2.start({sessionId:A,projectPath:v.workspaceRoot,runtime:v,request:R,signal:M}),D=await j.completion,E=(await a2.list(v.workspaceRoot,A)).find((m)=>m.start.reviewId===j.reviewId);if(!E)throw Error(`Review not found after completion: ${j.reviewId}`);return{reviewId:j.reviewId,status:D.status,findings:D.findings.length,content:J6(E.start,D)}});return nY(()=>{let R=i2(X);return()=>{R(),X().catch(()=>{return})}},[X]),{agentRef:Q,createAgent:U,cleanupAgent:X,steerActiveTurn:o,askSideQuestion:d,runCodeReview:l,executeUserShellCommand:a,listRewindCheckpoints:G,rewindSession:q,listSubagents:H,resumeSubagent:O,getMcpContentCatalog:N,refreshMcpContentCatalogs:z,getMcpPrompt:B,completeMcpArgument:_,listMcpTasks:b,getMcpTask:F,cancelMcpTask:f,getMcpLogs:P,setMcpLoggingLevel:I,getMcpInstructions:L,getReasoningConfiguration:C,setReasoningEffort:w,getServiceTierConfiguration:y,setServiceTier:k,getResponseVerbosityConfiguration:T,setResponseVerbosity:W,getCommunicationStyleConfiguration:S,setCommunicationStyle:h}}import{useMemoizedFn as h$}from"ahooks";import{useEffect as tY,useRef as o2}from"react";function Z6($){let Q=0;for(let Y of $)if(Y===`
32
+ `)Q++;return Q}function X6($,Q){let Y=Q?.flushTimeout??300,J=Q?.minLinesToFlush??5,Z=Q?.minCharsToFlush??400,X=o2(""),K=o2(null),U=o2(""),G=o2(null),q=h$(()=>{if(X.current){let _=X.current,P=$.appendAssistantContent(_);V$(P,_),X.current=""}if(K.current)clearTimeout(K.current),K.current=null}),H=h$(()=>{if(U.current)$.appendThinkingContent(U.current),U.current="";if(G.current)clearTimeout(G.current),G.current=null}),O=h$((_)=>{X.current+=_;let P=X.current;if(Z6(P)>=J||P.length>=Z){q();return}if(!K.current)K.current=setTimeout(q,Y)}),N=h$((_)=>{U.current+=_;let P=U.current;if(Z6(P)>=J||P.length>=Z){H();return}if(!G.current)G.current=setTimeout(H,Y)}),z=h$(()=>{if(X.current="",K.current)clearTimeout(K.current),K.current=null;if(U.current="",G.current)clearTimeout(G.current),G.current=null}),B=h$(()=>{if(K.current)clearTimeout(K.current),K.current=null;if(G.current)clearTimeout(G.current),G.current=null;let _=X.current,P=U.current;return X.current="",U.current="",{extraContent:_,extraThinking:P}});return tY(()=>{return()=>{z()}},[z]),{batchAppendContent:O,batchAppendThinking:N,flushContentBuffer:q,flushThinkingBuffer:H,resetStreamingBuffers:z,drainPendingBuffers:B}}var i8=s1("UI");function K6($){return $.error?.type==="canceled"||$.error?.type==="aborted"||$.metadata?.abortReason==="interrupt"}var z6=($,Q,Y,J,Z,X)=>{let K=D$(),U=S$(),G=C1(),q=v2(),H=v$(),O=V2(),N=j2(),z=h2(),B=E2(),_=g2(),P=f2(),b=n1(),F=t1(),f=S4(),I=a8(!1),L=a8(!1),C=a8(null),{createAgent:w,cleanupAgent:y,steerActiveTurn:k,listRewindCheckpoints:T,rewindSession:W,listSubagents:S,resumeSubagent:h,getMcpContentCatalog:o,refreshMcpContentCatalogs:d,getMcpPrompt:a,completeMcpArgument:l,listMcpTasks:R,getMcpTask:M,cancelMcpTask:A,getMcpLogs:v,setMcpLoggingLevel:j,getMcpInstructions:D,getReasoningConfiguration:E,setReasoningEffort:m,getServiceTierConfiguration:n,setServiceTier:$0,getResponseVerbosityConfiguration:L0,setResponseVerbosity:I0,getCommunicationStyleConfiguration:c0,setCommunicationStyle:h0,runCodeReview:F$,askSideQuestion:e$,executeUserShellCommand:j1}=Y6({sessionId:U,workspaceRoot:G,systemPrompt:$,appendSystemPrompt:Q,maxTurns:J,modelId:q,permissionMode:H,reasoningEffort:N,serviceTier:z,responseVerbosity:B,communicationStyle:_,agents:X}),b1=X6(b),t0=W$(async(G0,k0)=>{if(G0.images.length>0)return{success:!1,error:"User shell commands do not accept image attachments"};let w0=G0.text.trimStart().slice(1).trim();if(!w0)return{success:!1,error:"User shell command cannot be empty"};b.setCommand(`! ${w0}`);try{let Q0=await j1(w0,{signal:k0});if(b.addMessage({id:`user-shell-${Q0.executionId}`,role:"user",content:o8(Q0.record),timestamp:Date.now(),metadata:{userShellCommand:Q0.record}}),Q0.delivery==="next_turn")L.current=!0;return{success:Q0.record.status!=="spawn_error",output:o8(Q0.record),...Q0.record.status==="spawn_error"?{error:Q0.record.stderr||"User shell command failed"}:{}}}finally{b.setCommand(null)}});K2(()=>{return()=>{b1.resetStreamingBuffers()}},[b1.resetStreamingBuffers]),K2(()=>{return()=>{C.current?.abort("side-conversation-session-change"),C.current=null,F.dismissSideConversation()}},[F,U,G]),K2(()=>{if(!O)b.setCurrentThinkingContent(null)},[O,b]);let m8=W$(()=>{if(C.current){C.current.abort("user-cancel"),C.current=null,F.dismissSideConversation();return}if(!K)return;Z?.();let{extraContent:G0,extraThinking:k0}=b1.drainPendingBuffers();f.abort("user-cancel"),F.setTasks([]);let w0=e0().session.currentStreamingMessageId;if(w0){if(G0)V$(w0,G0);c2(w0)}if(b.finalizeStreamingMessage(G0,k0),!I.current)b.addAssistantMessage("任务已停止"),I.current=!0}),p8=W$(async(G0,k0)=>{let w0=`side-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;if(F.startSideConversation(w0,k0),G0.images.length>0){F.failSideConversation(w0,"Side conversations do not accept image attachments");return}if(!k0){F.failSideConversation(w0,"Usage: /btw <question>");return}C.current?.abort("side-conversation-replaced");let Q0=new AbortController;C.current=Q0;try{let Z0=await e$(k0,Q0.signal);if(Q0.signal.aborted||C.current!==Q0)return;if(F.completeSideConversation(w0,Z0),Z0.usage)b.updateTokenUsage({inputTokens:Z0.usage.promptTokens,outputTokens:Z0.usage.completionTokens,totalTokens:Z0.usage.totalTokens,cacheReadTokens:Z0.usage.cacheReadInputTokens??0,cacheWriteTokens:Z0.usage.cacheCreationInputTokens??0,costUsd:Z0.usage.costUsd})}catch(Z0){if(Q0.signal.aborted||C.current!==Q0)return;F.failSideConversation(w0,Z0 instanceof Error?Z0.message:String(Z0))}finally{if(C.current===Q0)C.current=null}}),$2=W$(async(G0,k0)=>{let w0={contentDeltaCount:0,contentDeltaTotalLen:0,compactionCount:0},Q0=d4({sessionActions:b,appActions:F,commandActions:f,streamingBuffer:b1,thinkingModeEnabled:O,getStreamingMessageId:()=>e0().session.currentStreamingMessageId,signal:k0.signal},w0);return{loopResult:await q6(G0,Q0),stats:w0}}),h1=W$(async(G0)=>{let k0=!1,w0,Q0=!1,Z0=G0;try{if(G0.text.trimStart().startsWith("!")){let x0=f.getAbortController()??f.createAbortController();return await t0(G0,x0.signal)}await G2();let q1=f.getAbortController()??f.createAbortController(),X1=u2(e0().session),p=await r8(G0,F,b,q1.signal,y,U,u2(e0().session),{listCheckpoints:T,execute:W},{list:S,resume:h},{getCatalog:o,refresh:d,getPrompt:a,complete:l,listTasks:R,getTask:M,cancelTask:A,getLogs:v,setLoggingLevel:j,getInstructions:D},{get:E,set:m},{get:n,set:$0},{get:L0,set:I0},{get:c0,set:h0},G,{run:F$});if(p.type==="handled")return p.commandResult;if(p.type==="continue_as_agent")k0=p.result.userMessageAlreadyAdded,w0=p.result.onceModelId,Q0=p.result.goalContinuationOnly===!0,Z0=p.result.agentInput;let U0=O1.getInstance(),g0;if(!Q0){let x0=await U0.executeUserPromptSubmitHooks(Z0.text,{projectDir:G,sessionId:U,permissionMode:H,hasImages:Z0.images.length>0,imageCount:Z0.images.length});if(!x0.proceed){if(x0.warning)b.addAssistantMessage(`${x0.warning}`);return{success:!1,error:"blocked by hook"}}if(x0.updatedPrompt)Z0={...Z0,text:x0.updatedPrompt,displayText:x0.updatedPrompt,parts:[{type:"text",text:x0.updatedPrompt},...Z0.parts.filter((I2)=>I2.type==="image")]};if(x0.contextInjection)g0=x0.contextInjection}if(!k0)b.addUserMessage(Z0.displayText);let R2=d8(Z0),Q2=await w(w0?{modelId:w0}:void 0);if(q1.signal.aborted)return i8.info("[handleCommandSubmit] Agent 创建期间已被中止"),{success:!1,error:"aborted"};if(g0)X1.push({role:"system",content:`<user-prompt-submit-hook>
33
+ ${g0}
34
+ </user-prompt-submit-hook>`});let M2={messages:X1,userId:"cli-user",sessionId:U,workspaceRoot:G,signal:q1.signal,confirmationHandler:Y,permissionMode:H,onPermissionModeChange:async(x0)=>{await m0().setPermissionMode(x0)}},{loopResult:T1,stats:U4}=await $2(Q2.chatStream(R2,M2,{stream:!0,goalContinuationOnly:Q0,onTurnLimitReached:Y?async(x0)=>{let I2=await Y.requestConfirmation({type:"maxTurnsExceeded",message:`已进行 ${x0.turnsCount} 轮对话。是否继续?`,risks:["继续执行可能导致更长的等待时间","可能产生更多的 API 费用"]});return{continue:I2.approved,reason:I2.reason}}:void 0}),q1);if(U4.compactionCount>0)b.setCompactedContext(M2.messages);if(T1.success&&T1.metadata?.outputTruncated)b.addAssistantMessage("输出因达到 token 上限被截断,部分内容可能不完整。");let J2=T1.finalMessage||"";if(i8.debug("[handleCommandSubmit] final reply",{success:T1.success,outputLength:J2.length,turnsCount:T1.metadata?.turnsCount,toolCallsCount:T1.metadata?.toolCallsCount}),!T1.success&&!K6(T1)){let x0=T1.error?.message||"任务执行失败";return b.addAssistantMessage(x0),{success:!1,error:x0}}if(!J2||J2.trim()===""){let x0=T1.metadata?.abortReason;if(!I.current&&U4.contentDeltaCount===0&&x0!=="interrupt")return b.addAssistantMessage("已取消"),{success:!0,output:"已取消"};return{success:!0,output:J2??""}}return{success:!0,output:J2}}catch(q1){if(I.current)return{success:!1,error:"aborted"};let X1=m2(q1);return b.addAssistantMessage(`${X1.displayMessage}`),{success:!1,error:X1.displayMessage}}}),z1=W$(async()=>{if(e0().command.isProcessing){L.current=!0;return}let G0=await E1.hasPendingInbox(G,U),k0=!G0&&await E1.hasActiveGoal(G,U);if(!G0&&!k0){L.current=!1;return}if(e0().command.isProcessing){L.current=!0;return}L.current=!1,await G2();let w0=f.createAbortController();b1.resetStreamingBuffers(),b.clearFinalizingStreamingMessageId(),f.setProcessing(!0);try{let Q0=await w();if(w0.signal.aborted)return;let Z0=await E1.hasPendingInbox(G,U),q1=!Z0&&await E1.hasActiveGoal(G,U);if(!Z0&&!q1)return;let X1={messages:u2(e0().session),userId:"cli-user",sessionId:U,workspaceRoot:G,signal:w0.signal,confirmationHandler:Y,permissionMode:H,onPermissionModeChange:async(g0)=>{await m0().setPermissionMode(g0)}},{loopResult:p,stats:U0}=await $2(Q0.chatStream("",X1,{stream:!0,pendingInputOnly:Z0,goalContinuationOnly:q1}),w0);if(U0.compactionCount>0)b.setCompactedContext(X1.messages);if(p.success&&p.metadata?.outputTruncated)b.addAssistantMessage("输出因达到 token 上限被截断,部分内容可能不完整。");if(!p.success&&!K6(p))b.addAssistantMessage(p.error?.message||"恢复排队指令失败")}catch(Q0){let Z0=m2(Q0);if(!Z0.isAbort)b.setError(`恢复排队指令失败: ${Z0.displayMessage}`)}finally{if(f.getAbortController()===w0)f.setProcessing(!1),f.clearAbortController(w0),b.setCurrentThinkingContent(null);if(L.current)queueMicrotask(()=>{z1()})}}),c8=W$(async(G0)=>{if(!G0.text.trim()&&G0.images.length===0)return;let k0=O6(G0.text);if(k0){await p8(G0,k0.question);return}if(C.current?.abort("main-conversation-submitted"),C.current=null,F.dismissSideConversation(),G0.text.trimStart().startsWith("!")&&K){let Q0=f.getAbortController();if(!Q0){b.addAssistantMessage("当前任务没有可用的取消边界,无法执行用户 Shell 命令。");return}let Z0=await t0(G0,Q0.signal);if(!Z0.success&&Z0.error&&Z0.error!=="aborted")b.setError(Z0.error);return}if(K){if(G0.text.trimStart().startsWith("/")){if(/^\/goal(?:\s|$)/i.test(G0.text.trim())){await G2();let p=f.getAbortController()??f.createAbortController();await r8(G0,F,b,p.signal,y,U,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,G);return}b.addAssistantMessage("活动回合中不能执行 slash command;请先停止任务或等待完成。");return}await G2();let Q0=await O1.getInstance().executeUserPromptSubmitHooks(G0.text,{projectDir:G,sessionId:U,permissionMode:H,hasImages:G0.images.length>0,imageCount:G0.images.length});if(!Q0.proceed){if(Q0.warning)b.addAssistantMessage(Q0.warning);return}let Z0=G0;if(Q0.updatedPrompt)Z0={...G0,text:Q0.updatedPrompt,parts:[{type:"text",text:Q0.updatedPrompt},...G0.parts.filter((p)=>p.type==="image")]};if(Q0.contextInjection){let p=`<user-prompt-submit-hook>
35
+ ${Q0.contextInjection}
36
+ </user-prompt-submit-hook>`;Z0={...Z0,text:`${Z0.text}
37
+
38
+ ${p}`,parts:[...Z0.parts,{type:"text",text:`
39
+
40
+ ${p}`}]}}let q1=d8(Z0),X1=await k(q1);if(!X1.accepted){let p=X1.reason==="queue_full"?"补充指令队列已满,请等待当前任务处理后重试。":"当前任务正在结束,补充指令未入队,请稍后重试。";b.addAssistantMessage(p);return}if(f.enqueueCommand(G0),b.addUserMessage(G0.displayText),X1.delivery==="next_turn"){if(L.current=!0,!e0().command.isProcessing)queueMicrotask(()=>{z1()})}return}F.setTasks([]),f.setRecoveredSteeringCount(0),I.current=!1;let w0=f.createAbortController();b1.resetStreamingBuffers(),b.clearFinalizingStreamingMessageId(),f.setProcessing(!0);try{let Q0=await h1(G0);if(!Q0.success&&Q0.error&&Q0.error!=="aborted")b.setError(Q0.error)}catch(Q0){let Z0=m2(Q0);if(Z0.isAbort);else b.setError(`执行失败: ${Z0.displayMessage}`)}finally{if(f.getAbortController()===w0){if(f.setProcessing(!1),f.clearAbortController(w0),b.setCurrentThinkingContent(null),L.current)queueMicrotask(()=>{z1()})}}});return K2(()=>{let G0=U6.subscribe((k0)=>{if(k0.type!=="subagent.completion.queued"||!G6(k0,{sessionId:U,projectPath:G}))return;L.current=!0,queueMicrotask(()=>{z1()})});return()=>{G0()}},[z1,U,G]),K2(()=>{let G0=!1;return(async()=>{if(Y)await n8.resolvePendingWithHandler(G,U,Y);else await n8.cancelPendingNonInteractive(G,U);if(G0)return;let[k0,w0]=await Promise.all([E1.hasPendingInbox(G,U),E1.hasActiveGoal(G,U)]);if(k0||w0)await z1()})().catch((k0)=>{if(!G0)i8.warn("[useCommandHandler] Failed to recover pending interaction or inbox",k0)}),()=>{G0=!0}},[Y,z1,U,G]),{executeCommand:c8,handleAbort:m8,isProcessing:K||P?.status==="loading",cleanupAgent:y}};import{useMemoizedFn as n2}from"ahooks";import{useState as _6}from"react";var N6=()=>{let[$,Q]=_6([]),[Y,J]=_6(-1),Z=n2((G,q)=>{let H={display:G,pasteMappings:q?new Map(q):new Map};Q((O)=>[...O,H]),J(-1)}),X=n2(()=>{if($.length===0)return null;let G=Y===-1?$.length-1:Math.max(0,Y-1);return J(G),$[G]||null}),K=n2(()=>{if(Y===-1)return null;let G=Y+1;if(G>=$.length)return J(-1),null;else return J(G),$[G]||null}),U=n2(()=>{J(-1)});return{commandHistory:$,historyIndex:Y,addToHistory:Z,getPreviousCommand:X,getNextCommand:K,resetHistoryIndex:U}};import{useMemoizedFn as U2}from"ahooks";import{useMemo as sY,useRef as F6,useState as eY}from"react";var W6=()=>{let[$,Q]=eY({isVisible:!1,details:null,resolver:null}),Y=F6(null),J=F6([]),Z=U2((H)=>{Y.current=H,Q({isVisible:Boolean(H),details:H?.details??null,resolver:H?.resolve??null})}),X=U2((H,O)=>{if(H.settled)return;if(H.settled=!0,H.signal&&H.abortListener)H.signal.removeEventListener("abort",H.abortListener);H.resolve(O)}),K=U2((H,O)=>{return new Promise((N)=>{let z={details:H,resolve:N,signal:O,settled:!1},B=()=>{if(Y.current===z){X(z,{approved:!1,reason:q2}),Z(J.current.shift()??null);return}let _=J.current.indexOf(z);if(_>=0)J.current.splice(_,1);X(z,{approved:!1,reason:q2})};if(z.abortListener=B,O?.aborted){B();return}if(O?.addEventListener("abort",B,{once:!0}),!Y.current){Z(z);return}J.current.push(z)})}),U=U2((H)=>{let O=Y.current;if(O)X(O,H);let N=J.current.shift()??null;Z(N)}),G=U2(()=>{if(Y.current)X(Y.current,{approved:!1,reason:q2});for(let H of J.current)X(H,{approved:!1,reason:q2});J.current=[],Z(null)}),q=sY(()=>({requestConfirmation:K}),[K]);return{confirmationState:$,confirmationHandler:q,handleResponse:U,dismissAll:G}};import{useMemoizedFn as H$}from"ahooks";import{useRef as H6,useState as $3}from"react";var t2="␞",s2="␟";function e2($){return`${t2}PASTE:${$}:`}function t8(){return s2}var iK=new RegExp(`${t2}PASTE:(\\d+):[\\s\\S]*?${s2}`,"g");function Q3($){return $.includes(t2)&&$.includes(s2)}function L6($="",Q=0){let[Y,J]=$3({value:$,cursorPosition:Q}),Z=H6(0),X=H6(new Map),K=H$((z)=>{J((B)=>({value:z,cursorPosition:B.cursorPosition}));for(let B of X.current.keys()){let _=e2(B);if(!z.includes(_))X.current.delete(B)}}),U=H$((z)=>{J((B)=>({...B,cursorPosition:Math.max(0,Math.min(z,B.value.length))}))}),G=H$(()=>{J({value:"",cursorPosition:0}),X.current.clear()}),q=H$((z)=>{Z.current+=1;let B=Z.current;return X.current.set(B,{type:"text",data:z}),B}),H=H$((z,B)=>{let _=[...X.current.values()].filter((f)=>f.type==="image");if(_.length>=j$)throw Error(`最多只能粘贴 ${j$} 张图片`);let P=_.reduce((f,I)=>f+`data:${I.mimeType};base64,`.length+I.data.length,0),b=`data:${B};base64,`.length+z.length;if(P+b>x2)throw Error("图片编码后总大小不能超过 5 MiB");Z.current+=1;let F=Z.current;return X.current.set(F,{type:"image",data:z,mimeType:B}),F}),O=H$((z)=>{for(let[B,_]of z)if(X.current.set(B,_),B>=Z.current)Z.current=B}),N=H$((z)=>{let B=[],_=[];if(!Q3(z)){let k=z.trim();if(k)_.push({type:"text",text:k});return{displayText:z,text:z,images:B,parts:_}}let P=new RegExp(`${t2}PASTE:(\\d+):[\\s\\S]*?${s2}`,"g"),b=Array.from(z.matchAll(P)),F=0,f="",I="";for(let k of b){let T=k.index,W=T+k[0].length,S=parseInt(k[1],10),h=X.current.get(S);if(T>F){let o=z.slice(F,T);_.push({type:"text",text:o}),f+=o,I+=o}if(!h)f+=k[0],I+=k[0],_.push({type:"text",text:k[0]});else if(h.type==="text")f+=h.data,I+=h.data,_.push({type:"text",text:h.data});else{let o={id:S,base64:h.data,mimeType:h.mimeType};B.push(o),_.push({type:"image",...o}),I+=`[Image #${S}]`}F=W}if(F<z.length){let k=z.slice(F);_.push({type:"text",text:k}),f+=k,I+=k}let L=[];for(let k of _)if(k.type==="text"&&L.length>0&&L[L.length-1].type==="text")L[L.length-1].text+=k.text;else L.push(k);let C=0,w=L.length;while(C<L.length&&L[C].type==="text"&&L[C].text.trim()==="")C++;while(w>C&&L[w-1].type==="text"&&L[w-1].text.trim()==="")w--;let y=L.slice(C,w);return{displayText:I.trim(),text:f.trim(),images:B,parts:y}});return{value:Y.value,cursorPosition:Y.cursorPosition,setValue:K,setCursorPosition:U,clear:G,pasteMap:X.current,addPasteMapping:q,addImagePasteMapping:H,restorePasteMappings:O,resolveInput:N}}import{useMemoizedFn as M6}from"ahooks";import{useInput as q3}from"ink";import{useEffect as I6,useRef as T6,useState as QQ}from"react";function J3($){return{supportsThinking:g1().resolveConfig($).reasoning}}function $8($){return J3($).supportsThinking}import Y3 from"fast-glob";import Z3 from"fuse.js";import{useEffect as B6,useMemo as s8,useState as e8}from"react";var E$=null,X3=5000;function K3($,Q){let Y=[...$.matchAll(/(?:^|\s)(@(?:"[^"]*"|(?:[^\\ ]|\\ )*))/g)];for(let J of Y){let Z=J[1],X=J.index+(J[0].length-Z.length),K=X+Z.length;if(Q>=X&&Q<=K){let U=Z.slice(1),G=!1;if(U.startsWith('"')){if(G=!0,U=U.slice(1),U.endsWith('"'))U=U.slice(0,-1)}return{hasQuery:!0,query:U,startIndex:X,endIndex:K,quoted:G}}}return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1}}var G3=[...$Q.map(($)=>`${$}/**`),...$Q,...w6.map(($)=>`**/${$}`)];function b6($,Q,Y={}){let{cwd:J=u0(),maxSuggestions:Z=15,ignorePatterns:X=G3,debounceDelay:K=300,fuzzyMatch:U=!0}=Y,[G,q]=e8([]),[H,O]=e8(!1),[N,z]=e8(0),B=s8(()=>JSON.stringify(X),[X]),_=s8(()=>{if(Q===void 0)return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1};return K3($,Q)},[$,Q]);B6(()=>{if(!$.includes("@")){q([]),O(!1);return}let b=Date.now();if(E$&&E$.cwd===J&&E$.ignoreKey===B&&b-E$.timestamp<X3){q(E$.files),O(!1);return}let F=!1,I=setTimeout(async()=>{O(!0);try{let C=(await Y3("**/*",{cwd:J,dot:!1,followSymbolicLinks:!1,onlyFiles:!1,markDirectories:!0,unique:!0,ignore:X})).map((w)=>w.replace(/\\/g,"/"));if(!F)q(C),E$={cwd:J,ignoreKey:B,files:C,timestamp:b}}catch(L){if(console.error("Failed to load files for @ completion:",L),!F)q([])}finally{if(!F)O(!1)}},K);return()=>{F=!0,clearTimeout(I)}},[$,J,K,B]);let P=s8(()=>{if(!_.hasQuery||G.length===0)return[];let b=_.query.toLowerCase();if(b==="")return G.slice(0,Z);if(U)return new Z3(G,{threshold:0.4,ignoreLocation:!0,minMatchCharLength:1}).search(b).slice(0,Z).map((I)=>I.item);return G.filter((F)=>F.toLowerCase().includes(b)).slice(0,Z)},[_,G,Z,U]);return B6(()=>{z(0)},[P]),{..._,suggestions:P,selectedIndex:N,loading:H}}function U3($,Q=!1){if($.includes(" ")||Q)return`@"${$}"`;return`@${$}`}function A6($,Q,Y){if(!Q.hasQuery)return{newInput:$,newCursorPos:$.length};let J=U3(Y,Q.quoted),Z=$.slice(0,Q.startIndex),X=$.slice(Q.endIndex),K=Z+J+" "+X,U=Q.startIndex+J.length+1;return{newInput:K,newCursorPos:U}}import{useMemoizedFn as P6}from"ahooks";import{useEffect as y6,useRef as R6}from"react";var S0=($,Q)=>{let Y=R6(!1),J=R6(null),Z=P6(()=>{if(J.current)clearTimeout(J.current);J.current=setTimeout(()=>{r0().setAwaitingSecondCtrlC(!1),Y.current=!1,J.current=null},3000)}),X=()=>{O2().shutdown("SIGINT",0)},K=P6(()=>{if(!Y.current){if(Y.current=!0,$&&Q)Q();r0().setAwaitingSecondCtrlC(!0),Z()}else{if(J.current)clearTimeout(J.current),J.current=null;r0().setAwaitingSecondCtrlC(!1),X()}});return y6(()=>{if($){if(r0().setAwaitingSecondCtrlC(!1),Y.current=!1,J.current)clearTimeout(J.current),J.current=null}},[$]),y6(()=>{return()=>{if(J.current)clearTimeout(J.current)}},[]),K};var Q8=s1("UI"),k6=($,Q,Y,J,Z,X,K,U,G,q)=>{let O=s0()==="main-input",N=$.value,z=$.setValue,B=$.cursorPosition,_=n1(),P=C1(),b=t1(),F=S2(),f=F?$8(F):!1,[I,L]=QQ(!1),[C,w]=QQ([]),[y,k]=QQ(0),T=b6(N,B,{cwd:P,maxSuggestions:10}),W=S0(K||!1,X),S=T6(0),h=500,o=T6(!1);I6(()=>{if(K)o.current=!1},[K]),I6(()=>{if(T.hasQuery&&T.suggestions.length>0){let l=T.suggestions.map((R)=>({command:R,description:C6(R)?`Directory: ${R}`:`File: ${R}`,matchScore:1}));w(l),L(!0),k(0)}else if(N.startsWith("/"))if(N.includes(" "))L(!1),w([]);else{let R=f6(N,P);w(R),L(R.length>0),k(0)}else L(!1),w([])},[N,T.hasQuery,T.suggestions,P]);let d=M6(()=>{_.clearMessages(),_.setError(null)}),a=M6(()=>{Q8.debug("[DIAG] handleSubmit called:",{input:N,showSuggestions:I});let l=N.trim();if(l){let R=$.resolveInput(l);Q8.debug("[DIAG] Submitting command:",{displayText:l,textLength:R.text.length,imageCount:R.images.length}),L(!1),w([]);let M=$.pasteMap.size>0?new Map($.pasteMap):new Map;Z(l,M),$.clear(),Q(R),Q8.debug("[DIAG] Command submitted to onSubmit callback")}else Q8.debug("[DIAG] Empty command, not submitting")});return q3((l,R)=>{if(l==="?"&&!N){G?.(),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&&!(l==="?"&&!N))return;if(R.ctrl&&l==="c"||R.meta&&l==="c"||R.ctrl&&l==="d"||R.meta&&l==="d"){W();return}if(R.ctrl&&l==="l"||R.meta&&l==="l"){d();return}if(R.ctrl&&l==="t"||R.meta&&l==="t"){_.toggleThinkingExpanded();return}if(R.ctrl&&l==="o"||R.meta&&l==="o"){_.toggleHistoryExpanded();return}if(R.escape){if(q)G?.();else if(K&&X){if(o.current)return;o.current=!0,X()}else if(I)L(!1),w([]);else if(N){let A=Date.now();if(A-S.current<500)$.clear(),S.current=0;else S.current=A}return}if(R.tab&&R.shift){U?.();return}if(R.tab){if(I&&C.length>0){let A=C[y].command;if(T.hasQuery&&T.suggestions.includes(A)){let{newInput:v,newCursorPos:j}=A6(N,T,A);z(v),$.setCursorPosition(j)}else{let v=A+" ";z(v),$.setCursorPosition(v.length)}L(!1),w([])}else if(f)b.toggleThinkingMode();return}if(R.return){a();return}if(R.upArrow){if(I&&C.length>0){let A=C.length-1;k((v)=>v>0?v-1:A)}else{let A=Y();if(A){if(A.pasteMappings.size>0)$.restorePasteMappings(A.pasteMappings);z(A.display),$.setCursorPosition(A.display.length)}}return}if(R.downArrow){if(I&&C.length>0){let A=C.length-1;k((v)=>v<A?v+1:0)}else{let A=J();if(A){if(A.pasteMappings.size>0)$.restorePasteMappings(A.pasteMappings);z(A.display),$.setCursorPosition(A.display.length)}}return}},{isActive:O}),{handleSubmit:a,showSuggestions:I,suggestions:C,selectedSuggestionIndex:y}};import F3 from"ansi-escapes";import{useStdout as W3}from"ink";import{useCallback as H3,useEffect as L3,useRef as B3}from"react";import{useStdout as O3}from"ink";import{debounce as z3}from"lodash-es";import{useEffect as _3,useState as N3}from"react";function $$($=200){let{stdout:Q}=O3(),[Y,J]=N3(Q.columns||80);return _3(()=>{let Z=z3(()=>{J(Q.columns||80)},$);return Z(),Q.on("resize",Z),()=>{Q.off("resize",Z),Z.cancel()}},[Q,$]),Y}function S6(){let{stdout:$}=W3(),Q=$$(),Y=B3(!0),J=s((X)=>X.session.actions.incrementClearCount),Z=H3(()=>{if($)$.write(F3.clearTerminal);J()},[$,J]);return L3(()=>{if(Y.current){Y.current=!1;return}let X=setTimeout(()=>{Z()},300);return()=>{clearTimeout(X)}},[Q,Z]),{refreshStatic:Z}}import v6 from"node:fs";import w3 from"node:os";import JQ from"node:path";import{MultiSelect as b3}from"@inkjs/ui";import{useMemoizedFn as J8}from"ahooks";import{Box as K0,Text as e,useFocus as A3,useFocusManager as P3,useInput as V6}from"ink";import Y8 from"ink-select-input";import y3 from"ink-spinner";import z2 from"ink-text-input";import{useEffect as D6,useState as g$}from"react";import{jsxDEV as V}from"react/jsx-dev-runtime";var R3=[{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"}],M3=[{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 I3($){if(!$||$.trim()==="")return"名称不能为空";if(!/^[a-z0-9-]+$/.test($))return"名称只能包含小写字母、数字和连字符";if($.startsWith("-")||$.endsWith("-"))return"名称不能以连字符开头或结尾";return null}function _2({onComplete:$,onCancel:Q,initialConfig:Y}){let[J,Z]=g$(Y?"name":"mode"),[X,K]=g$({name:Y?.name||"",description:Y?.description||"",tools:Y?.tools||[],color:Y?.color,location:Y?.location||"project",systemPrompt:Y?.systemPrompt||""}),[U,G]=g$(""),[q,H]=g$(!1),[O,N]=g$(""),[z,B]=g$(Y?"edit":"manual"),{focus:_}=P3(),b={manual:["mode","name","description","tools","color","location","systemPrompt","confirm"],ai:["mode","aiPrompt","aiGenerating","confirm"],edit:["name","description","tools","color","location","systemPrompt","confirm"]}[z];D6(()=>{if(J==="name"||J==="description"||J==="systemPrompt"||J==="aiPrompt")return;_(`step-${J}`)},[J,_]);let F=J8(()=>{let w=b.indexOf(J);if(w<b.length-1)Z(b[w+1])}),f=J8(()=>{if(O)N("");if(J==="confirm"&&z==="ai"){Z("aiPrompt");return}let w=b.indexOf(J);if(w>0)Z(b[w-1]);else Q()}),I=J8(async()=>{H(!0),N("");try{let w=await X2.create(),y=`你是一个 Subagent 配置生成专家。用户会描述他们想要创建的 agent,你需要根据描述生成一个完整的 agent 配置。
41
+
42
+ ## 可用工具列表
43
+
44
+ - **Glob**: 文件模式匹配(例如:查找所有 .ts 文件)
45
+ - **Grep**: 代码内容搜索(例如:搜索特定函数调用)
46
+ - **Read**: 读取文件内容
47
+ - **Write**: 写入/创建文件
48
+ - **Edit**: 编辑文件(字符串替换)
49
+ - **ApplyPatch**: 原子应用多文件文本补丁
50
+ - **Bash**: 执行命令行命令
51
+
52
+ ## 可用颜色
53
+
54
+ - red, blue, green, yellow, purple, orange, pink, cyan
55
+
56
+ ## 输出格式
57
+
58
+ 你必须以 JSON 格式返回配置,格式如下:
59
+
60
+ \`\`\`json
61
+ {
62
+ "name": "agent-name",
63
+ "description": "简洁的一句话描述(英文)",
64
+ "tools": ["Glob", "Grep", "Read"],
65
+ "color": "blue",
66
+ "systemPrompt": "详细的系统提示词,说明这个 agent 的职责、工作方式、输出格式等"
67
+ }
68
+ \`\`\`
69
+
70
+ ## 注意事项
71
+
72
+ 1. **name**: 只能包含小写字母、数字和连字符(kebab-case),例如:code-reviewer
73
+ 2. **description**: 一句话说明用途,建议以 "Fast agent specialized for..." 开头
74
+ 3. **tools**: 根据任务选择必要的工具,不要选择太多
75
+ 4. **color**: 选择一个合适的颜色用于 UI 区分
76
+ 5. **systemPrompt**: 详细说明 agent 的职责、使用的工具、输出格式等,使用 Markdown 格式
77
+
78
+ **重要**:请直接返回 JSON,不要添加任何额外的解释或文字。`,T=(await w.chatWithSystem(`你是一个 Subagent 配置生成专家。用户会描述他们想要创建的 agent,你需要根据描述生成一个完整的 agent 配置。
79
+
80
+ ## 可用工具列表
81
+
82
+ - **Glob**: 文件模式匹配(例如:查找所有 .ts 文件)
83
+ - **Grep**: 代码内容搜索(例如:搜索特定函数调用)
84
+ - **Read**: 读取文件内容
85
+ - **Write**: 写入/创建文件
86
+ - **Edit**: 编辑文件(字符串替换)
87
+ - **ApplyPatch**: 原子应用多文件文本补丁
88
+ - **Bash**: 执行命令行命令
89
+
90
+ ## 可用颜色
91
+
92
+ - red, blue, green, yellow, purple, orange, pink, cyan
93
+
94
+ ## 输出格式
95
+
96
+ 你必须以 JSON 格式返回配置,格式如下:
97
+
98
+ \`\`\`json
99
+ {
100
+ "name": "agent-name",
101
+ "description": "简洁的一句话描述(英文)",
102
+ "tools": ["Glob", "Grep", "Read"],
103
+ "color": "blue",
104
+ "systemPrompt": "详细的系统提示词,说明这个 agent 的职责、工作方式、输出格式等"
105
+ }
106
+ \`\`\`
107
+
108
+ ## 注意事项
109
+
110
+ 1. **name**: 只能包含小写字母、数字和连字符(kebab-case),例如:code-reviewer
111
+ 2. **description**: 一句话说明用途,建议以 "Fast agent specialized for..." 开头
112
+ 3. **tools**: 根据任务选择必要的工具,不要选择太多
113
+ 4. **color**: 选择一个合适的颜色用于 UI 区分
114
+ 5. **systemPrompt**: 详细说明 agent 的职责、使用的工具、输出格式等,使用 Markdown 格式
115
+
116
+ **重要**:请直接返回 JSON,不要添加任何额外的解释或文字。`,U)).trim(),W=T.match(/```(?:json)?\s*\n([\s\S]*?)\n```/);if(W)T=W[1];let S=JSON.parse(T);if(!S.name||!S.description||!S.systemPrompt)throw Error("Missing required fields: name, description, or systemPrompt");if(!/^[a-z0-9]+(-[a-z0-9]+)*$/.test(S.name))throw Error("Invalid name format. Must be kebab-case (lowercase, numbers, hyphens only)");K({name:S.name,description:S.description,tools:Array.isArray(S.tools)?S.tools:[],color:S.color||"blue",location:"project",systemPrompt:S.systemPrompt}),Z("confirm")}catch(w){N(w instanceof Error?w.message:String(w))}finally{H(!1)}});D6(()=>{if(J==="aiGenerating"&&!q&&!O)I()},[J,q,O,I]);let L=J8(async()=>{try{let w=X.location==="project"?JQ.join(u0(),".blade","agents"):JQ.join(w3.homedir(),".blade","agents");await v6.promises.mkdir(w,{recursive:!0});let y=["---",`name: ${X.name}`,`description: ${X.description}`];if(X.tools.length>0&&!X.tools.includes("all")){y.push("tools:");for(let W of X.tools)y.push(` - ${W}`)}if(X.color)y.push(`color: ${X.color}`);y.push("---");let k=[y.join(`
117
+ `),"",`# ${X.name} Subagent`,"",X.systemPrompt||"你是一个专门的代理,负责执行特定任务。",""].join(`
118
+ `),T=JQ.join(w,`${X.name}.md`);await v6.promises.writeFile(T,k,"utf-8"),$()}catch(w){console.error("保存配置失败:",w)}}),C=S0(!1,Q);if(V6((w,y)=>{if(y.escape)f();else if(y.ctrl&&w==="c"||y.meta&&w==="c")C()},{isActive:J!=="tools"}),J==="mode")return V(K0,{flexDirection:"column",paddingY:1,children:[V(K0,{marginBottom:1,children:V(e,{bold:!0,color:"cyan",children:"选择创建方式"},void 0,!1,void 0,this)},void 0,!1,void 0,this),V(K0,{marginBottom:1,children:V(e,{dimColor:!0,children:"你可以手动配置每个细节,或让 AI 根据你的描述自动生成配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),V(Y8,{items:[{label:"AI 智能生成 - 根据描述自动生成完整配置",value:"ai"},{label:"手动配置 - 逐步配置每个选项",value:"manual"}],onSelect:(w)=>{if(w.value==="ai")B("ai"),Z("aiPrompt");else B("manual"),Z("name")}},void 0,!1,void 0,this),V(K0,{marginTop:1,children:V(e,{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 V(K0,{flexDirection:"column",paddingY:1,children:[V(K0,{marginBottom:1,children:V(e,{bold:!0,color:"cyan",children:"AI 智能生成"},void 0,!1,void 0,this)},void 0,!1,void 0,this),V(K0,{marginBottom:1,children:V(e,{dimColor:!0,children:'描述你想要创建的 Agent(例如:"一个专门用于代码审查的 agent,能够分析代码质量和潜在bug")'},void 0,!1,void 0,this)},void 0,!1,void 0,this),V(K0,{marginBottom:1,children:[V(e,{color:"green",children:"描述: "},void 0,!1,void 0,this),V(z2,{value:U,onChange:G,onSubmit:(w)=>{if(!w.trim())return;Z("aiGenerating")}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),V(K0,{children:V(e,{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 V(K0,{flexDirection:"column",paddingY:1,children:[V(K0,{marginBottom:1,children:V(e,{bold:!0,color:"red",children:"AI 生成失败"},void 0,!1,void 0,this)},void 0,!1,void 0,this),V(K0,{marginBottom:1,children:V(e,{color:"red",children:O},void 0,!1,void 0,this)},void 0,!1,void 0,this),V(K0,{marginBottom:1,children:V(e,{dimColor:!0,children:"按 ESC 返回修改描述"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return V(K0,{flexDirection:"column",paddingY:1,children:[V(K0,{marginBottom:1,children:V(e,{bold:!0,color:"yellow",children:[V(y3,{type:"dots"},void 0,!1,void 0,this)," AI 正在生成配置..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),V(K0,{marginBottom:1,children:V(e,{dimColor:!0,children:['根据你的描述:"',U,'"']},void 0,!0,void 0,this)},void 0,!1,void 0,this),V(K0,{marginBottom:1,children:V(e,{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 w=z==="edit";return V(K0,{flexDirection:"column",paddingY:1,children:[V(K0,{marginBottom:1,children:V(e,{bold:!0,color:"cyan",children:["Step 1/7: ",w?"Agent 名称(不可修改)":"输入 Agent 名称"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),V(K0,{marginBottom:1,children:V(e,{dimColor:!0,children:w?"编辑模式下名称不可修改(修改名称相当于创建新 Agent)":"名称只能包含小写字母、数字和连字符(例如:code-reviewer)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),V(K0,{marginBottom:1,children:[V(e,{color:"green",children:"名称: "},void 0,!1,void 0,this),w?V(e,{children:X.name},void 0,!1,void 0,this):V(z2,{value:X.name,onChange:(y)=>K({...X,name:y}),onSubmit:(y)=>{if(I3(y))return;F()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),V(K0,{children:V(e,{dimColor:!0,children:w?"按 Enter 继续 | ESC 返回":"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),w&&V(z2,{value:"",onChange:()=>{},onSubmit:F,showCursor:!1},"edit-mode-dummy-input",!1,void 0,this)]},void 0,!0,void 0,this)}if(J==="description")return V(K0,{flexDirection:"column",paddingY:1,children:[V(K0,{marginBottom:1,children:V(e,{bold:!0,color:"cyan",children:"Step 2/7: 输入描述信息"},void 0,!1,void 0,this)},void 0,!1,void 0,this),V(K0,{marginBottom:1,children:V(e,{dimColor:!0,children:"简短描述这个 Agent 的用途和使用场景(这将帮助主 Agent 决定何时使用它)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),V(K0,{marginBottom:1,children:[V(e,{color:"green",children:"描述: "},void 0,!1,void 0,this),V(z2,{value:X.description,onChange:(w)=>K({...X,description:w}),onSubmit:(w)=>{if(!w.trim())return;F()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),V(K0,{children:V(e,{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 V(T3,{config:X,setConfig:K,onNext:F,onPrev:f},void 0,!1,void 0,this);if(J==="color")return V(K0,{flexDirection:"column",paddingY:1,children:[V(K0,{marginBottom:1,children:V(e,{bold:!0,color:"cyan",children:"Step 4/7: 选择背景颜色"},void 0,!1,void 0,this)},void 0,!1,void 0,this),V(K0,{marginBottom:1,children:V(e,{dimColor:!0,children:"为 Agent 选择一个颜色标识(用于在 UI 中区分不同的 Agents)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),V(Y8,{items:M3,onSelect:(w)=>{let y=w.value==="none"?void 0:w.value;K({...X,color:y}),F()}},void 0,!1,void 0,this),V(K0,{marginTop:1,children:V(e,{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 V(K0,{flexDirection:"column",paddingY:1,children:[V(K0,{marginBottom:1,children:V(e,{bold:!0,color:"cyan",children:"Step 5/7: 选择保存位置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),V(K0,{marginBottom:1,children:V(e,{dimColor:!0,children:"项目级配置仅在当前项目生效,用户级配置全局可用"},void 0,!1,void 0,this)},void 0,!1,void 0,this),V(Y8,{items:[{label:"项目级 (.blade/agents/) - 仅当前项目",value:"project"},{label:"用户级 (~/.blade/agents/) - 全局可用",value:"user"}],onSelect:(w)=>{K({...X,location:w.value}),F()}},void 0,!1,void 0,this),V(K0,{marginTop:1,children:V(e,{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 V(K0,{flexDirection:"column",paddingY:1,children:[V(K0,{marginBottom:1,children:V(e,{bold:!0,color:"cyan",children:"Step 6/7: 输入系统提示词"},void 0,!1,void 0,this)},void 0,!1,void 0,this),V(K0,{marginBottom:1,children:V(e,{dimColor:!0,children:"定义 Agent 的行为和职责(可选,留空将使用默认提示)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),V(K0,{marginBottom:1,children:[V(e,{color:"green",children:"提示词: "},void 0,!1,void 0,this),V(z2,{value:X.systemPrompt,onChange:(w)=>K({...X,systemPrompt:w}),onSubmit:()=>F()},void 0,!1,void 0,this)]},void 0,!0,void 0,this),V(K0,{children:V(e,{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 V(K0,{flexDirection:"column",paddingY:1,children:[V(K0,{marginBottom:1,children:V(e,{bold:!0,color:"cyan",children:"Step 7/7: 确认配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),V(K0,{flexDirection:"column",paddingLeft:2,marginBottom:1,children:[V(e,{children:[V(e,{bold:!0,color:"green",children:["名称:"," "]},void 0,!0,void 0,this),V(e,{children:X.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this),V(e,{children:[V(e,{bold:!0,color:"green",children:["描述:"," "]},void 0,!0,void 0,this),V(e,{children:X.description},void 0,!1,void 0,this)]},void 0,!0,void 0,this),V(e,{children:[V(e,{bold:!0,color:"green",children:["工具:"," "]},void 0,!0,void 0,this),V(e,{children:X.tools.includes("all")?"所有工具":X.tools.join(", ")||"所有工具"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),V(e,{children:[V(e,{bold:!0,color:"green",children:["颜色:"," "]},void 0,!0,void 0,this),V(e,{children:X.color||"默认"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),V(e,{children:[V(e,{bold:!0,color:"green",children:["位置:"," "]},void 0,!0,void 0,this),V(e,{children:X.location==="project"?"项目级":"用户级"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),V(e,{children:[V(e,{bold:!0,color:"green",children:["提示词:"," "]},void 0,!0,void 0,this),V(e,{children:X.systemPrompt||"(使用默认)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),V(Y8,{items:[{label:"确认并保存",value:"save"},{label:"返回上一步",value:"back"},{label:"取消",value:"cancel"}],onSelect:(w)=>{if(w.value==="save")L();else if(w.value==="back")f();else Q()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}function T3({config:$,setConfig:Q,onNext:Y,onPrev:J}){let{isFocused:Z}=A3({id:"step-tools"});V6((K,U)=>{if(U.escape)J()},{isActive:Z});let X=(K)=>{if(K.includes("all"))Q({...$,tools:["all"]});else Q({...$,tools:K});Y()};return V(K0,{flexDirection:"column",paddingY:1,children:[V(K0,{marginBottom:1,children:V(e,{bold:!0,color:"cyan",children:"Step 3/7: 选择可用工具"},void 0,!1,void 0,this)},void 0,!1,void 0,this),V(K0,{marginBottom:1,children:V(e,{dimColor:!0,children:"方向键导航,空格切换勾选,Enter 确认进入下一步 | ESC 返回上一步"},void 0,!1,void 0,this)},void 0,!1,void 0,this),V(b3,{options:R3,defaultValue:$.tools,onSubmit:X},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import C3 from"node:fs";import{useMemoizedFn as L$}from"ahooks";import{Box as T0,Text as v0,useInput as f3}from"ink";import YQ from"ink-select-input";import{useEffect as k3,useMemo as j6,useState as Z8}from"react";import{jsxDEV as i}from"react/jsx-dev-runtime";var ZQ=10;function E6({workspaceRoot:$,initialMode:Q="menu",onComplete:Y,onCancel:J}){let Z=h6($),[X,K]=Z8(Q),[U,G]=Z8(null),[q,H]=Z8(0),[O,N]=Z8(0),z=L$(()=>{Z.clear(),Z.loadFromStandardLocations(),H((T)=>T+1)}),B=j6(()=>{return Z.getAllSubagents()},[q]),_=Math.ceil(B.length/ZQ)||1,P=j6(()=>{let T=O*ZQ;return B.slice(T,T+ZQ)},[B,O]);k3(()=>{let T=Math.max(0,_-1);if(O>T)N(T)},[_,O]);let b=L$(()=>{if(O<_-1)N((T)=>T+1)}),F=L$(()=>{if(O>0)N((T)=>T-1)}),f=[{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"}],I=L$((T)=>{if(T.value==="cancel"){J?.();return}K(T.value)}),L=L$((T)=>{if(G(T.value),X==="edit")K("editWizard");else if(X==="delete")K("deleteConfirm")}),C=L$(async()=>{if(!U?.configPath)return;try{await C3.promises.unlink(U.configPath),z(),w()}catch(T){console.error("删除失败:",T)}}),w=L$(()=>{K("menu"),G(null)}),y=S0(!1,J);if(f3((T,W)=>{if(W.escape){if(X==="menu")J?.();else if(X==="list"||X==="edit"||X==="delete")N(0),w();else if(X==="deleteConfirm")w()}else if(W.ctrl&&T==="c"||W.meta&&T==="c")y();else if(X==="list"){if(W.leftArrow||T==="h")F();else if(W.rightArrow||T==="l")b()}},{isActive:X!=="create"&&X!=="editWizard"}),X==="menu")return i(T0,{flexDirection:"column",paddingY:1,children:[i(T0,{marginBottom:1,children:i(v0,{bold:!0,color:"cyan",children:"Agents 管理"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(YQ,{items:f,onSelect:I},void 0,!1,void 0,this),i(T0,{marginTop:1,children:i(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(B.length===0)return i(T0,{flexDirection:"column",paddingY:1,children:[i(T0,{marginBottom:1,children:i(v0,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(T0,{paddingLeft:2,children:i(v0,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(T0,{marginTop:1,paddingLeft:2,children:i(v0,{color:"gray",children:"配置文件位置: .blade/agents/ 或 ~/.blade/agents/"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(T0,{marginTop:1,paddingLeft:2,children:i(v0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return i(T0,{flexDirection:"column",paddingY:1,children:[i(T0,{marginBottom:1,children:[i(v0,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this),i(v0,{color:"gray",children:[" (共 ",B.length," 个)"]},void 0,!0,void 0,this),_>1&&i(v0,{color:"yellow",children:[" ","第 ",O+1,"/",_," 页"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),P.map((T)=>i(T0,{flexDirection:"column",paddingLeft:2,children:[i(T0,{children:i(v0,{children:[i(v0,{bold:!0,color:T.color||"white",children:["• ",T.name]},void 0,!0,void 0,this),i(v0,{color:"gray",children:[" - ",T.description]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),T.tools&&T.tools.length>0&&i(T0,{paddingLeft:2,children:i(v0,{color:"gray",children:["工具: ",T.tools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),T.configPath&&i(T0,{paddingLeft:2,children:i(v0,{color:"gray",dimColor:!0,children:T.configPath},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},T.name,!0,void 0,this)),i(T0,{marginTop:1,paddingLeft:2,children:_>1?i(v0,{dimColor:!0,children:"Left/Right to page | ESC 返回菜单"},void 0,!1,void 0,this):i(v0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}let k=(T)=>{if(B.length===0)return i(T0,{flexDirection:"column",paddingY:1,children:[i(T0,{marginBottom:1,children:i(v0,{bold:!0,color:"cyan",children:T},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(T0,{paddingLeft:2,children:i(v0,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(T0,{marginTop:1,paddingLeft:2,children:i(v0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);let W=B.map((S)=>({key:S.name,label:`${S.name} - ${S.description}`,value:S}));return i(T0,{flexDirection:"column",paddingY:1,children:[i(T0,{marginBottom:1,children:i(v0,{bold:!0,color:"cyan",children:T},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(YQ,{items:W,onSelect:L},void 0,!1,void 0,this),i(T0,{marginTop:1,children:i(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 i(_2,{onComplete:()=>{z(),w()},onCancel:w},void 0,!1,void 0,this);if(X==="edit")return k("编辑 Agent");if(X==="editWizard"&&U){let T={name:U.name,description:U.description,tools:U.tools||[],color:U.color,location:U.configPath?.includes(".blade/agents")?"project":"user",systemPrompt:U.systemPrompt||""};return i(_2,{initialConfig:T,onComplete:()=>{z(),w()},onCancel:w},void 0,!1,void 0,this)}if(X==="delete")return k("删除 Agent");if(X==="deleteConfirm"&&U)return i(T0,{flexDirection:"column",paddingY:1,children:[i(T0,{marginBottom:1,children:i(v0,{bold:!0,color:"red",children:"确认删除"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(T0,{marginBottom:1,paddingLeft:2,children:i(v0,{children:["你确定要删除 Agent"," ",i(v0,{bold:!0,color:"yellow",children:U.name},void 0,!1,void 0,this)," ","吗?"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),i(T0,{marginBottom:1,paddingLeft:2,children:i(v0,{dimColor:!0,children:["文件路径: ",U.configPath]},void 0,!0,void 0,this)},void 0,!1,void 0,this),i(T0,{marginBottom:1,paddingLeft:2,children:i(v0,{color:"red",children:"此操作无法撤销!"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(YQ,{items:[{label:"确认删除",value:"confirm"},{label:"取消",value:"cancel"}],onSelect:(T)=>{if(T.value==="confirm")C();else w()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}import{Box as m$,Text as z0}from"ink";import v3,{useEffect as D3,useState as V3}from"react";import{useEffect as S3,useState as g6}from"react";function c6($=u0(),Q=5000){let[Y,J]=g6(null),[Z,X]=g6(!0);return S3(()=>{let K=!0,U=async()=>{try{let q=await m6($);if(!K)return;if(!q){J(null),X(!1);return}let H=await p6($);if(!K)return;J(H)}catch{if(K)J(null)}finally{if(K)X(!1)}};U();let G=null;if(Q>0)G=setInterval(U,Q);return()=>{if(K=!1,G)clearInterval(G)}},[$,Q]),{branch:Y,loading:Z}}import{jsxDEV as t,Fragment as A1}from"react/jsx-dev-runtime";var u6=v3.memo(()=>{let $=k2(),Q=v$(),J=C2()==="shortcuts",Z=I4(),X=C1(),{branch:K}=c6(X),U=S2(),G=b4(),q=_4(),H=V2(),O=j2(),N=h2(),z=E2(),B=g2(),_=N4(),P=F4(),b=D2(),F=v4(),f=S$(),[I,L]=V3(null);D3(()=>{let W=!1;new XQ(X,f).get().then((o)=>{if(!W)L(o)}).catch(()=>{if(!W)L(null)});let h=XQ.subscribe((o)=>{if(!W&&o.sessionId===f&&o.workspaceRoot===X)L(o.goal)});return()=>{W=!0,h()}},[f,X]);let C=U?$8(U):!1,y=(()=>{if(Q==="default")return null;if(Q==="autoEdit")return t(z0,{color:"magenta",children:[">> ","auto edit on ",t(z0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Q==="plan")return t(z0,{color:"cyan",children:["‖ plan mode on ",t(z0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Q==="yolo")return t(z0,{color:"red",children:["yolo mode on ",t(z0,{color:"gray",children:"(all tools auto-approved)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null})(),k=y!==null,T=[["Enter:发送","Shift+Enter:换行","Esc:中止"],["Shift+Tab:切换模式","Up/Down:历史","Tab:补全"],["Ctrl+A:行首","Ctrl+E:行尾","Ctrl+K:删到尾"],["Ctrl+U:删到首","Ctrl+W:删单词","Ctrl+C:退出"]];return t(m$,{flexDirection:"row",justifyContent:"space-between",paddingX:2,paddingY:0,children:[J?t(m$,{flexDirection:"column",gap:0,children:T.map((W,S)=>t(m$,{flexDirection:"row",children:[W.map((h,o)=>{let[d,a]=h.split(":");return t(m$,{flexDirection:"row",width:20,children:[t(z0,{color:"yellow",children:d},void 0,!1,void 0,this),t(z0,{color:"gray",children:":"},void 0,!1,void 0,this),t(z0,{color:"white",children:a},void 0,!1,void 0,this)]},o,!0,void 0,this)}),S===T.length-1&&t(z0,{color:"cyan",children:" ? 关闭"},void 0,!1,void 0,this)]},S,!0,void 0,this))},void 0,!1,void 0,this):t(m$,{flexDirection:"row",gap:1,children:[K&&t(A1,{children:[t(z0,{color:"gray",children:[" ",K]},void 0,!0,void 0,this),t(z0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),y,k&&t(z0,{color:"gray",children:"·"},void 0,!1,void 0,this),I&&t(A1,{children:[t(z0,{color:I.status==="active"?"green":I.status==="verifying"?"cyan":I.status==="blocked"||I.status==="budget_limited"?"yellow":"gray",children:["goal:",I.status," ",I.objective.slice(0,32)]},void 0,!0,void 0,this),t(z0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),t(z0,{color:"gray",children:"? for shortcuts"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),t(m$,{flexDirection:"row",gap:1,children:!$?t(z0,{color:"red",children:"[WARN] API 密钥未配置"},void 0,!1,void 0,this):t(A1,{children:[C&&t(A1,{children:[H?t(z0,{color:"cyan",children:["Effort ",O]},void 0,!0,void 0,this):t(z0,{color:"gray",children:"Tab:Effort"},void 0,!1,void 0,this),t(z0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N!=="auto"&&t(A1,{children:[t(z0,{color:N==="fast"?"yellow":"gray",children:["Speed ",N]},void 0,!0,void 0,this),t(z0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z!=="auto"&&t(A1,{children:[t(z0,{color:"gray",children:["Output ",z]},void 0,!0,void 0,this),t(z0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),B!=="auto"&&t(A1,{children:[t(z0,{color:"gray",children:["Style ",B]},void 0,!0,void 0,this),t(z0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),U&&t(z0,{color:"gray",children:U.model},void 0,!1,void 0,this),t(z0,{color:"gray",children:"·"},void 0,!1,void 0,this),q?t(z0,{color:"yellow",children:"压缩中..."},void 0,!1,void 0,this):t(z0,{color:G<20?"red":G<50?"yellow":"gray",children:[G,"%"]},void 0,!0,void 0,this),t(z0,{color:"gray",children:"·"},void 0,!1,void 0,this),t(z0,{color:P===void 0?"gray":"cyan",children:["Cache ",x6(P)]},void 0,!0,void 0,this),_>0.001&&t(A1,{children:[t(z0,{color:"gray",children:"·"},void 0,!1,void 0,this),t(z0,{color:"green",children:["$",_<0.01?_.toFixed(4):_.toFixed(3)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),b.length>0&&t(A1,{children:[t(z0,{color:"gray",children:"·"},void 0,!1,void 0,this),t(z0,{color:"yellow",children:["已排队 ",b.length]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),F>0&&t(A1,{children:[t(z0,{color:"gray",children:"·"},void 0,!1,void 0,this),t(z0,{color:"cyan",children:["已恢复 ",F," 条指令"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Z&&t(A1,{children:[t(z0,{color:"gray",children:"·"},void 0,!1,void 0,this),t(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 KQ,Text as GQ}from"ink";import j3 from"react";import{jsxDEV as p$}from"react/jsx-dev-runtime";var l6=j3.memo(({suggestions:$,selectedIndex:Q,visible:Y,maxDisplay:J=8})=>{if(!Y||$.length===0)return null;let Z=0,X=Math.min(J,$.length),K=Q>=$.length;if(Q>=J&&!K)Z=Q-J+1,X=Q+1;let U=$.slice(Z,X),G=$.length>J;return p$(KQ,{flexDirection:"column",paddingX:2,paddingY:0,children:[U.map((q,H)=>{let N=Z+H===Q;return p$(KQ,{flexDirection:"row",paddingX:1,gap:2,children:[p$(GQ,{color:N?"cyan":"white",bold:N,children:q.command},void 0,!1,void 0,this),p$(GQ,{color:N?"cyan":"gray",dimColor:!N,children:["- ",q.description]},void 0,!0,void 0,this)]},q.command,!0,void 0,this)}),G&&p$(KQ,{paddingX:1,children:p$(GQ,{color:K?"cyan":"gray",bold:K,dimColor:!K,children:["... and ",$.length-J," more"]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as H1,Text as S1,useInput as jZ,useStdout as hZ}from"ink";import EZ from"ink-select-input";import SQ,{useMemo as P9}from"react";import{Box as _0,Text as P0}from"ink";import w$,{useEffect as fQ,useMemo as B$,useRef as w9}from"react";import{Box as wQ,Text as J9}from"ink";import o3 from"react";import{Text as P1}from"ink";import r3 from"react";import e6 from"string-width";import N2 from"string-width";function UQ({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 h3=UQ();function qQ($){if(typeof $!=="string")throw TypeError(`Expected a \`string\`, got \`${typeof $}\``);if(!$.includes("\x1B")&&!$.includes("›"))return $;return $.replace(h3,"")}var d6=($=0)=>(Q)=>`\x1B[${Q+$}m`,r6=($=0)=>(Q)=>`\x1B[${38+$};5;${Q}m`,a6=($=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]}},yU=Object.keys(j0.modifier),E3=Object.keys(j0.color),g3=Object.keys(j0.bgColor),RU=[...E3,...g3];function m3(){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=r6(),j0.color.ansi16m=a6(),j0.bgColor.ansi=d6(10),j0.bgColor.ansi256=r6(10),j0.bgColor.ansi16m=a6(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 U=Q%36;Y=Math.floor(Q/36)/5,J=Math.floor(U/6)/5,Z=U%6/5}let X=Math.max(Y,J,Z)*2;if(X===0)return 30;let K=30+(Math.round(Z)<<2|Math.round(J)<<1|Math.round(Y));if(X===2)K+=60;return K},enumerable:!1},rgbToAnsi:{value:(Q,Y,J)=>j0.ansi256ToAnsi(j0.rgbToAnsi256(Q,Y,J)),enumerable:!1},hexToAnsi:{value:(Q)=>j0.ansi256ToAnsi(j0.hexToAnsi256(Q)),enumerable:!1}}),j0}var p3=m3(),i6=p3;var K8=new Set(["\x1B","›"]),c3=39,zQ="\x07",t6="[",x3="]",s6="m",X8=`${x3}8;;`,o6=($)=>`${K8.values().next().value}${t6}${$}${s6}`,n6=($)=>`${K8.values().next().value}${X8}${$}${zQ}`,u3=($)=>$.split(" ").map((Q)=>N2(Q)),OQ=($,Q,Y)=>{let J=[...Q],Z=!1,X=!1,K=N2(qQ($.at(-1)));for(let[U,G]of J.entries()){let q=N2(G);if(K+q<=Y)$[$.length-1]+=G;else $.push(G),K=0;if(K8.has(G))Z=!0,X=J.slice(U+1,U+1+X8.length).join("")===X8;if(Z){if(X){if(G===zQ)Z=!1,X=!1}else if(G===s6)Z=!1;continue}if(K+=q,K===Y&&U<J.length-1)$.push(""),K=0}if(!K&&$.at(-1).length>0&&$.length>1)$[$.length-2]+=$.pop()},l3=($)=>{let Q=$.split(" "),Y=Q.length;while(Y>0){if(N2(Q[Y-1])>0)break;Y--}if(Y===Q.length)return $;return Q.slice(0,Y).join(" ")+Q.slice(Y).join("")},d3=($,Q,Y={})=>{if(Y.trim!==!1&&$.trim()==="")return"";let J="",Z,X,K=u3($),U=[""];for(let[O,N]of $.split(" ").entries()){if(Y.trim!==!1)U[U.length-1]=U.at(-1).trimStart();let z=N2(U.at(-1));if(O!==0){if(z>=Q&&(Y.wordWrap===!1||Y.trim===!1))U.push(""),z=0;if(z>0||Y.trim===!1)U[U.length-1]+=" ",z++}if(Y.hard&&K[O]>Q){let B=Q-z,_=1+Math.floor((K[O]-B-1)/Q);if(Math.floor((K[O]-1)/Q)<_)U.push("");OQ(U,N,Q);continue}if(z+K[O]>Q&&z>0&&K[O]>0){if(Y.wordWrap===!1&&z<Q){OQ(U,N,Q);continue}U.push("")}if(z+K[O]>Q&&Y.wordWrap===!1){OQ(U,N,Q);continue}U[U.length-1]+=N}if(Y.trim!==!1)U=U.map((O)=>l3(O));let G=U.join(`
119
+ `),q=[...G],H=0;for(let[O,N]of q.entries()){if(J+=N,K8.has(N)){let{groups:B}=new RegExp(`(?:\\${t6}(?<code>\\d+)m|\\${X8}(?<uri>.*)${zQ})`).exec(G.slice(H))||{groups:{}};if(B.code!==void 0){let _=Number.parseFloat(B.code);Z=_===c3?void 0:_}else if(B.uri!==void 0)X=B.uri.length===0?void 0:B.uri}let z=i6.codes.get(Number(Z));if(q[O+1]===`
120
+ `){if(X)J+=n6("");if(Z&&z)J+=o6(z)}else if(N===`
121
+ `){if(Z&&z)J+=o6(Z);if(X)J+=n6(X)}H+=N.length}return J};function _Q($,Q,Y){return String($).normalize().replaceAll(`\r
122
+ `,`
123
+ `).split(`
124
+ `).map((J)=>d3(J,Q,Y)).join(`
125
+ `)}var NQ=($)=>{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 e6(Q)};var $9=($)=>{return/[*_~`<[\]https?:]/.test($)},FQ=($)=>{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)=>e6(J)))},G8=($,Q,Y=!1)=>{if(Q<=0)return[$];let J=$.trimEnd(),X=_Q(J,Q,{hard:Y,trim:!1,wordWrap:!0}).split(`
126
+ `).filter((K)=>K.length>0);return X.length>0?X:[""]},Q9=($,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 i3}from"react/jsx-dev-runtime";var WQ=2,HQ=1,LQ=2;function BQ($,Q){return`inline-${$}-${Q}`}var a3=({text:$})=>{let Q=A0();if(!$9($))return W1(P1,{children:$},void 0,!1,void 0,this);let Y=[],J=0,Z=0,X=0,K=/(\*\*.*?\*\*|\*(?!\s).*?(?<!\s)\*|_(?!\s).*?(?<!\s)_|~~.*?~~|`+[^`]+`+|\[.*?\]\(.*?\)|https?:\/\/\S+)/g,U;while((U=K.exec($))!==null){if(U.index>J){let O=$.slice(J,U.index);Y.push(W1(P1,{children:O},BQ("text",Z++),!1,void 0,this))}let G=U[0],q=null,H=BQ("match",X++);try{if(G.startsWith("**")&&G.endsWith("**")&&G.length>WQ*2)q=W1(P1,{bold:!0,children:G.slice(WQ,-WQ)},H,!1,void 0,this);else if(G.length>HQ*2&&(G.startsWith("*")&&G.endsWith("*")||G.startsWith("_")&&G.endsWith("_"))){let O=$.substring(U.index-1,U.index),N=$.substring(K.lastIndex,K.lastIndex+1);if(!(/\w/.test(O)||/\w/.test(N)||/[./\\]/.test(O+N)))q=W1(P1,{italic:!0,children:G.slice(HQ,-HQ)},H,!1,void 0,this)}else if(G.startsWith("~~")&&G.endsWith("~~")&&G.length>LQ*2)q=W1(P1,{strikethrough:!0,children:G.slice(LQ,-LQ)},H,!1,void 0,this);else if(G.startsWith("`")&&G.endsWith("`")){let O=G.match(/^(`+)([^`]+)\1$/);if(O&&O[2])q=W1(P1,{color:Q.colors.syntax.keyword,backgroundColor:Q.colors.background.secondary,bold:!0,children:` ${O[2]} `},H,!1,void 0,this)}else if(G.startsWith("[")&&G.includes("](")&&G.endsWith(")")){let O=G.match(/\[(.*?)\]\((.*?)\)/);if(O){let N=O[1],z=O[2];q=W1(P1,{children:[N,W1(P1,{color:Q.colors.info,children:[" (",z,")"]},void 0,!0,void 0,this)]},H,!0,void 0,this)}}else if(G.match(/^https?:\/\//))q=W1(P1,{color:Q.colors.info,children:G},H,!1,void 0,this)}catch(O){console.error("InlineRenderer 解析错误:",G,O),q=null}Y.push(q??W1(P1,{children:G},H,!1,void 0,this)),J=K.lastIndex}if(J<$.length){let G=$.slice(J);Y.push(W1(P1,{children:G},BQ("text",Z++),!1,void 0,this))}return W1(i3,{children:Y.filter((G)=>G!==null)},void 0,!1,void 0,this)},y1=r3.memo(a3);import{jsxDEV as c$}from"react/jsx-dev-runtime";var n3="▎",Y9=o3.memo(({lines:$,level:Q})=>{let Y=A0(),J=n3.repeat(Q);return c$(wQ,{flexDirection:"column",children:$.map((Z,X)=>{if(Z.trim()==="")return c$(wQ,{height:1},X,!1,void 0,this);return c$(wQ,{flexDirection:"row",children:[c$(J9,{dimColor:!0,color:Y.colors.text.muted,children:[J," "]},void 0,!0,void 0,this),c$(J9,{italic:!0,wrap:"wrap",children:c$(y1,{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 q8,Text as c1}from"ink";import{isPlainObject as yQ}from"lodash-es";import{common as KZ,createLowlight as GZ}from"lowlight";import{LRUCache as UZ}from"lru-cache";import O9 from"react";import{Box as U8,Text as F2}from"ink";import p1,{Fragment as U9}from"react";import{LRUCache as G9}from"lru-cache";import t3 from"string-width";var s3=1024,e3=1048576,Z9=1000,X9=new G9({max:s3,maxSize:e3,sizeCalculation:($,Q)=>Math.max(1,Q.length*2+$.length*8)});function bQ($){let Q=!0;for(let J=0;J<$.length;J++)if($.charCodeAt(J)>127){Q=!1;break}if(Q)return $.split("");if($.length<=Z9){let J=X9.get($);if(J)return J}let Y=Array.from($);if($.length<=Z9)X9.set($,Y);return Y}var $Z=2048,QZ=524288,JZ=4096,K9=new G9({max:$Z,maxSize:QZ,sizeCalculation:($,Q)=>Math.max(1,Q.length*2+8)});function m1($){if(/^[\x20-\x7E]*$/.test($))return $.length;let Q=K9.get($);if(Q!==void 0)return Q;let Y=t3($);if($.length<=JZ)K9.set($,Y);return Y}import{jsxDEV as x$}from"react/jsx-dev-runtime";var AQ=2,q9=p1.memo(({children:$,maxWidth:Q,maxHeight:Y,overflowDirection:J="top",additionalHiddenLinesCount:Z=0})=>{let X=A0(),K=[],U=Math.max(Math.round(Y??Number.MAX_SAFE_INTEGER),AQ);function G(_){if(!p1.isValidElement(_))return;if(_.type===U9){p1.Children.forEach(_.props.children,G);return}if(_.type===U8){ZZ(_,Q,K);return}}p1.Children.forEach($,G);let H=K.length>U||Z>0?U-1:U,O=H!==void 0?Math.max(0,K.length-H):0,N=O+Z,B=(O>0?J==="top"?K.slice(O):K.slice(0,H):K).map((_,P)=>x$(U8,{children:_.length>0?_.map((b,F)=>x$(F2,{...b.props,children:b.text},F,!1,void 0,this)):x$(F2,{children:" "},void 0,!1,void 0,this)},P,!1,void 0,this));return x$(U8,{flexDirection:"column",width:Q,flexShrink:0,children:[N>0&&J==="top"&&x$(F2,{color:X.colors.text.muted,dimColor:!0,children:["... ",N," line",N===1?"":"s"," hidden ..."]},void 0,!0,void 0,this),B,N>0&&J==="bottom"&&x$(F2,{color:X.colors.text.muted,dimColor:!0,children:["... ",N," line",N===1?"":"s"," hidden ..."]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});function YZ($){if(!p1.isValidElement($)||$.type!==U8)return{noWrapSegments:[],segments:[]};let Q={noWrapSegments:[],segments:[]},Y=!1;function J(Z,X){if(Z===null||Z===void 0)return;if(typeof Z==="string"||typeof Z==="number"){let q=String(Z);if(!q)return;let H={text:q,props:X??{}};if(X===void 0||X.wrap==="wrap")Y=!0,Q.segments.push(H);else if(!Y)Q.noWrapSegments.push(H);else Q.segments.push(H);return}if(!p1.isValidElement(Z))return;if(Z.type===U9){p1.Children.forEach(Z.props.children,(q)=>J(q,X));return}if(Z.type!==F2)return;let{children:K,...U}=Z.props,G=X===void 0?U:{...X,...U};p1.Children.forEach(K,(q)=>J(q,G))}return p1.Children.forEach($.props.children,(Z)=>J(Z,void 0)),Q}function ZZ($,Q,Y){let J=YZ($);if(J.segments.length===0&&J.noWrapSegments.length===0){Y.push([]);return}let Z=0;for(let O of J.noWrapSegments)Z+=m1(O.text);if(J.segments.length===0){let O=[],N=[];for(let z of J.noWrapSegments){let B=z.text.split(`
127
+ `);for(let _=0;_<B.length;_++){if(_>0)O.push(N),N=[];if(B[_])N.push({text:B[_],props:z.props})}}if(N.length>0)O.push(N);for(let z of O)Y.push(z);return}let X=Q-Z;if(X<1){XZ(J.noWrapSegments,Q,Y);return}let K=[],U=[],G=0;function q(){if(K.length===0)K.push([...J.noWrapSegments,...U]);else if(Z>0)K.push([{text:" ".repeat(Z),props:{}},...U]);else K.push(U);U=[],G=0}function H(O,N){if(U.length>0&&U[U.length-1].props===N)U[U.length-1].text+=O;else U.push({text:O,props:N})}for(let O of J.segments){let N=O.text.split(`
128
+ `);for(let z=0;z<N.length;z++){if(z>0)q();let _=N[z].split(/(\s+)/);for(let P of _){if(!P)continue;let b=m1(P);if(G+b>X&&G>0){if(q(),/^\s+$/.test(P))continue}if(b>X){let f=bQ(P);while(f.length>0){let I=0,L=0;for(let C of f){let w=m1(C);if(G+L+w>X)break;L+=w,I++}if(I>0){let C=f.slice(0,I).join("");H(C,O.props),G+=m1(C),f=f.slice(I)}if(f.length>0)q()}}else H(P,O.props),G+=b}}if(O.text.endsWith(`
129
+ `))q()}if(U.length>0)q();for(let O of K)Y.push(O)}function XZ($,Q,Y){let J=[],Z=[],X=0;for(let K of $){let U=K.text.split(`
130
+ `);for(let G=0;G<U.length;G++){if(G>0)J.push(Z),Z=[],X=0;let q=U[G];if(!q)continue;let H=m1(q),O=Math.max(0,Q-m1("…"));if(H<=O&&X===0)Z.push({text:q,props:K.props}),X+=H;else{let N=bQ(q),z=X,B=0;for(let P of N){let b=m1(P);if(z+b>O)break;z+=b,B++}let _=N.slice(0,B).join("");if(_)Z.push({text:_,props:K.props});Z.push({text:"…",props:{}}),X=z+m1("…")}}}if(Z.length>0)J.push(Z);if(J.length===0)J.push([{text:"…",props:{}}]);for(let K of J)Y.push(K)}import{jsxDEV as K1}from"react/jsx-dev-runtime";var PQ=GZ(KZ),qZ=200,OZ=524288,zZ=4096,z9=new UZ({max:qZ,maxSize:OZ,sizeCalculation:($)=>$.retainedChars});function _9($,Q){return`${Q??"__auto__"}\x00${$}`}function _Z($,Q){return z9.get(_9($,Q))?.root}function NZ($,Q,Y){if($.length>zZ)return;let J=Q?.length??0;z9.set(_9($,Q),{root:Y,retainedChars:Math.max(1,$.length*2+J)})}function FZ($){return yQ($)&&$.type==="text"&&typeof $.value==="string"}function WZ($){return yQ($)&&$.type==="element"}function HZ($){return yQ($)&&$.type==="root"&&Array.isArray($.children)}function O8($,Q,Y=0){if(FZ($))return K1(c1,{wrap:"wrap",children:$.value},Y,!1,void 0,this);if(WZ($)){let J=$.properties?.className?.[0]||"",Z=Q.default;if(J.includes("comment"))Z=Q.comment;else if(J.includes("string"))Z=Q.string;else if(J.includes("number"))Z=Q.number;else if(J.includes("keyword"))Z=Q.keyword;else if(J.includes("function"))Z=Q.function;else if(J.includes("variable"))Z=Q.variable;else if(J.includes("operator"))Z=Q.operator;else if(J.includes("type"))Z=Q.type;else if(J.includes("tag"))Z=Q.tag;else if(J.includes("attr"))Z=Q.attr;let X=$.children?.map((K,U)=>O8(K,Q,U));return K1(c1,{color:Z,wrap:"wrap",children:X},Y,!1,void 0,this)}if(HZ($))return K1(O9.Fragment,{children:$.children.map((J,Z)=>O8(J,Q,Z))},Y,!1,void 0,this);return K1(c1,{},Y,!1,void 0,this)}function LZ($,Q,Y){let J=Y||d0.getTheme().colors.syntax;try{let Z=_Z($,Q);if(Z)return O8(Z,J);let X;if(!Q||!PQ.registered(Q))X=PQ.highlightAuto($);else X=PQ.highlight(Q,$);let K=X;if(!K.children||K.children.length===0)return K1(c1,{color:J.default,wrap:"wrap",children:$},void 0,!1,void 0,this);return NZ($,Q,X),O8(X,J)}catch(Z){return K1(c1,{color:J.default,wrap:"wrap",children:$},void 0,!1,void 0,this)}}var z8=O9.memo(({content:$,language:Q,showLineNumbers:Y=!0,terminalWidth:J,availableHeight:Z})=>{let X=A0(),K=$.split(`
131
+ `),U=0;if(Z&&K.length>Z){let O=Math.max(Z,AQ);if(K.length>O)U=K.length-O,K=K.slice(U)}let G=K.length+U,q=String(G).length+1,H=Math.max(20,J-4);return K1(q8,{borderStyle:"round",borderColor:X.colors.border.light,paddingX:1,paddingY:0,marginY:1,flexDirection:"column",children:[Q&&K1(q8,{marginBottom:0,children:K1(c1,{color:X.colors.text.secondary,children:Q},void 0,!1,void 0,this)},void 0,!1,void 0,this),U>0&&K1(q8,{marginBottom:0,children:K1(c1,{color:X.colors.text.muted,dimColor:!0,children:["... ",U," lines hidden ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),K1(q9,{maxWidth:H,maxHeight:Z,children:K.map((O,N)=>{let z=N+U+1;return K1(q8,{flexDirection:"row",children:[Y&&K1(c1,{color:X.colors.text.muted,dimColor:!0,wrap:"truncate",children:[String(z).padStart(q-1," ")," "]},void 0,!0,void 0,this),O.trim()===""?K1(c1,{wrap:"wrap",children:" "},void 0,!1,void 0,this):LZ(O,Q,X.colors.syntax)]},N,!0,void 0,this)})},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as N9,Text as _1,useInput as BZ}from"ink";import wZ,{useState as bZ}from"react";import{jsxDEV as G1}from"react/jsx-dev-runtime";var F9=400;function AZ($){let Q=$.split(`
132
+ `),Y=[],J=0,Z=0;for(let X of Q){if(X.startsWith("---")||X.startsWith("+++"))continue;if(X.startsWith("@@")){let K=X.match(/@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@/);if(K)J=parseInt(K[1],10),Z=parseInt(K[3],10);Y.push({type:"header",content:X});continue}if(X.startsWith("-")){Y.push({type:"remove",content:X.substring(1),lineNumber:J}),J++;continue}if(X.startsWith("+")){Y.push({type:"add",content:X.substring(1),lineNumber:Z}),Z++;continue}if(X.startsWith(" ")||X===""){Y.push({type:"context",content:X.substring(1),lineNumber:Z}),J++,Z++;continue}}return Y}var RQ=wZ.memo(({patch:$,startLine:Q,matchLine:Y,terminalWidth:J,maxLines:Z=20,isFocused:X=!1})=>{let K=A0(),U=AZ($),[G,q]=bZ(!1);BZ((F)=>{if(F.toLowerCase()==="e")q((f)=>!f)},{isActive:X&&U.length>Z});let O=Math.max(...U.map((F)=>F.lineNumber||0)).toString().length+1,N=U.filter((F)=>F.type==="add").length,z=U.filter((F)=>F.type==="remove").length,B=U.length,_=B>Z,P;if(!_)P=U;else if(G)P=U.slice(0,F9);else P=U.slice(0,Z);let b=B-P.length;return G1(N9,{flexDirection:"column",marginTop:1,marginBottom:1,children:[G1(_1,{color:K.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,J)))},void 0,!1,void 0,this),_&&G1(_1,{color:K.colors.info,children:[G?`已展开 ${P.length}/${B} 行`:`显示前 ${Z} 行,共 ${B} 行`," · ",G1(_1,{color:K.colors.success,children:["+",N]},void 0,!0,void 0,this)," ",G1(_1,{color:K.colors.error,children:["-",z]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),_&&G1(_1,{color:K.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,J)))},void 0,!1,void 0,this),P.map((F,f)=>{if(F.type==="header")return G1(_1,{color:K.colors.muted,dimColor:!0,children:F.content},f,!1,void 0,this);let I=F.lineNumber?F.lineNumber.toString().padStart(O," "):" ".repeat(O),L=" ",C,w;if(F.type==="add")L="+",w=K.colors.success,C=void 0;else if(F.type==="remove")L="-",w=K.colors.error,C=void 0;else w=K.colors.text.primary;let y=Math.max(0,J-O-2),k=F.content;if(k.length>y)k=k.substring(0,y-3)+"...";return G1(_1,{color:w,backgroundColor:C,children:[G1(_1,{dimColor:!0,children:I},void 0,!1,void 0,this),G1(_1,{children:L},void 0,!1,void 0,this),G1(_1,{children:[" ",k]},void 0,!0,void 0,this)]},f,!0,void 0,this)}),_&&G1(N9,{marginTop:1,children:G?G1(_1,{color:K.colors.info,dimColor:!0,children:[b>0?`已达显示上限 ${F9} 行,仍有 ${b} 行未显示`:"已显示全部内容",X?" · 按 E 折叠":""]},void 0,!0,void 0,this):G1(_1,{color:K.colors.info,dimColor:!0,children:["已隐藏剩余 ",b," 行",X?" · 按 E 展开全部":""]},void 0,!0,void 0,this)},void 0,!1,void 0,this),G1(_1,{color:K.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,J)))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as MQ,Text as W9}from"ink";import PZ from"react";import{jsxDEV as u$}from"react/jsx-dev-runtime";var yZ=({itemText:$,type:Q,marker:Y,leadingWhitespace:J=""})=>{let Z=Q==="ol"?`${Y}. `:`${Y} `,X=Z.length,K=J.length;return u$(MQ,{paddingLeft:K+1,flexDirection:"row",children:[u$(MQ,{width:X,children:u$(W9,{children:Z},void 0,!1,void 0,this)},void 0,!1,void 0,this),u$(MQ,{flexGrow:1,children:u$(W9,{wrap:"wrap",children:u$(y1,{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)},IQ=PZ.memo(yZ);import{Text as TQ}from"ink";import RZ,{useMemo as MZ}from"react";import H9 from"string-width";import{jsxDEV as CQ}from"react/jsx-dev-runtime";var L9=4,l$=3,IZ=4,B9=RZ.memo(({headers:$,rows:Q,terminalWidth:Y})=>{let J=A0(),Z=MZ(()=>{if($.length===0||Q.length===0)return null;let O=$.length,N=$.map((w,y)=>{let k=Math.max(FQ(w),l$);for(let T of Q)k=Math.max(k,FQ(T[y]||""));return k}),z=$.map((w,y)=>{let k=Math.max(NQ(w),l$);for(let T of Q)k=Math.max(k,NQ(T[y]||""));return k}),B=1+O*3,_=Math.max(Y-B-L9,O*l$),P=N.reduce((w,y)=>w+y,0),b=z.reduce((w,y)=>w+y,0),F=!1,f;if(b<=_)f=z;else if(P<=_){let w=_-P,y=z.map((T,W)=>T-N[W]),k=y.reduce((T,W)=>T+W,0);f=N.map((T,W)=>{if(k===0)return T;let S=Math.floor(y[W]/k*w);return T+S})}else{F=!0;let w=_/P;f=N.map((y)=>Math.max(Math.floor(y*w),l$))}function I(){let w=1;for(let y=0;y<$.length;y++){let k=G8($[y],f[y],F);w=Math.max(w,k.length)}for(let y of Q)for(let k=0;k<y.length;k++){let T=G8(y[k]||"",f[k],F);w=Math.max(w,T.length)}return w}if(I()>IZ)return{type:"vertical",columnWidths:f,needsHardWrap:F};return{type:"horizontal",columnWidths:f,needsHardWrap:F}},[$,Q,Y]);if(!Z)return null;if(Z.type==="vertical"){let O=Math.min(Y-1,40),N="─".repeat(O);return CQ(TQ,{children:Q.map((z,B)=>{let _=[];if(B>0)_.push(N);return z.forEach((P,b)=>{let F=$[b]||`Column ${b+1}`,f=(P||"").replace(/\n+/g," ").trim();_.push(`\x1B[1m${F}:\x1B[22m ${f}`)}),_.join(`
133
+ `)}).join(`
134
+ `)},void 0,!1,void 0,this)}let{columnWidths:X,needsHardWrap:K}=Z;function U(O){let z={top:{left:"┌",mid:"┬",right:"┐",h:"─"},middle:{left:"├",mid:"┼",right:"┤",h:"─"},bottom:{left:"└",mid:"┴",right:"┘",h:"─"}}[O],B=z.left;return X.forEach((_,P)=>{B+=z.h.repeat(_+2),B+=P<X.length-1?z.mid:z.right}),B}function G(O,N){let z=O.map((b,F)=>{let f=X[F]||l$;return G8(b||"",f,K)}),B=Math.max(...z.map((b)=>b.length),1),_=z.map((b)=>Math.floor((B-b.length)/2)),P=[];for(let b=0;b<B;b++){let F="│";for(let f=0;f<O.length;f++){let I=z[f],L=_[f],C=b-L,w=C>=0&&C<I.length?I[C]:"",y=X[f]||l$,k=H9(w),T=Q9(N?`\x1B[1m${w}\x1B[22m`:w,k,y,N?"center":"left");F+=` ${T} │`}P.push(F)}return P}let q=[];if(q.push(U("top")),q.push(...G($,!0)),q.push(U("middle")),Q.forEach((O,N)=>{if(q.push(...G(O,!1)),N<Q.length-1)q.push(U("middle"))}),q.push(U("bottom")),Math.max(...q.map((O)=>H9(O)))>Y-L9){let O=Math.min(Y-1,40),N="─".repeat(O);return CQ(TQ,{children:Q.map((z,B)=>{let _=[];if(B>0)_.push(N);return z.forEach((P,b)=>{let F=$[b]||`Column ${b+1}`,f=(P||"").replace(/\n+/g," ").trim();_.push(`\x1B[1m${F}:\x1B[22m ${f}`)}),_.join(`
135
+ `)}).join(`
136
+ `)},void 0,!1,void 0,this)}return CQ(TQ,{color:J.colors.text.primary,children:q.join(`
137
+ `)},void 0,!1,void 0,this)});import{jsxDEV as g}from"react/jsx-dev-runtime";var TZ=($,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:" "}}},CZ=w$.memo(({content:$,language:Q,terminalWidth:Y,isPending:J=!1,availableHeight:Z})=>{let X=A0();if(J&&Z!==void 0){let K=$.split(`
138
+ `),U=4,G=Math.max(1,Z-4);if(K.length>G){let q=K.slice(0,G).join(`
139
+ `);return g(_0,{flexDirection:"column",flexShrink:0,children:[g(z8,{content:q,language:Q,showLineNumbers:!0,terminalWidth:Y},void 0,!1,void 0,this),g(P0,{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(z8,{content:$,language:Q,showLineNumbers:!0,terminalWidth:Y},void 0,!1,void 0,this)}),fZ=w$.memo(({content:$,level:Q})=>{let Y=A0();switch(Q){case 1:return g(P0,{bold:!0,color:Y.colors.primary,children:g(y1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 2:return g(P0,{bold:!0,color:Y.colors.primary,children:g(y1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 3:return g(P0,{bold:!0,color:Y.colors.text.primary,children:g(y1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 4:return g(P0,{italic:!0,color:Y.colors.text.muted,children:g(y1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);default:return g(P0,{children:g(y1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)}}),kZ=w$.memo(({terminalWidth:$})=>{let Q=A0(),Y=Math.max(0,Math.min($-4,80));return g(P0,{dimColor:!0,color:Q.colors.text.muted,children:"─".repeat(Y)},void 0,!1,void 0,this)}),SZ=w$.memo(({content:$})=>{return g(P0,{wrap:"wrap",children:g(y1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)}),vZ=w$.memo(({content:$})=>{let Q=A0();return g(_0,{flexDirection:"row",gap:1,children:[g(P0,{color:Q.colors.info,children:" "},void 0,!1,void 0,this),g(P0,{color:Q.colors.text.muted,italic:!0,children:$},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}),DZ=w$.memo(({detail:$,terminalWidth:Q})=>{let Y=A0(),J=50,Z=$.split(`
140
+ `);while(Z.length>0&&Z[0].trim()==="")Z.shift();while(Z.length>0&&Z[Z.length-1].trim()==="")Z.pop();let X=Z.length>50,K=X?Z.slice(0,50):Z,U=K.join(`
141
+ `),G=U.includes("<<<DIFF>>>"),q=U.includes("```");if(G){let H=U.match(/<<<DIFF>>>\s*({[\s\S]*?})\s*<<<\/DIFF>>>/);if(H)try{let O=JSON.parse(H[1]);return g(_0,{flexDirection:"column",children:[g(RQ,{patch:O.patch,startLine:O.startLine,matchLine:O.matchLine,terminalWidth:Q},void 0,!1,void 0,this),X&&g(_0,{marginTop:1,children:g(P0,{dimColor:!0,color:Y.colors.text.muted,children:["... 省略 ",Z.length-50," 行 ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}catch{}}if(q){let H=U.match(/```(\w+)?\s*\n([\s\S]*?)\n```/);if(H){let O=H[1]||"text",N=H[2];return g(_0,{flexDirection:"column",children:[g(z8,{content:N,language:O,showLineNumbers:!1,terminalWidth:Q},void 0,!1,void 0,this),X&&g(_0,{marginTop:1,children:g(P0,{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(_0,{flexDirection:"column",children:[K.map((H,O)=>g(P0,{color:Y.colors.text.primary,children:H},O,!1,void 0,this)),X&&g(_0,{marginTop:1,children:g(P0,{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 VZ($,Q,Y,J=80){if(!Y||Q===void 0||Q<=0)return{content:$,isTruncated:!1,hiddenLines:0};let X=Math.max(1,Q-8),K=Math.max(40,J*0.8),U=X*K;if($.length<=U)return{content:$,isTruncated:!1,hiddenLines:0};let G=Math.floor(U*0.9),q=$.length-G,H=q,O=$.indexOf(`
142
+ `,q);if(O!==-1&&O-q<K)H=O+1;let N=$.slice(H),B=($.slice(0,H).match(/\n/g)||[]).length+1;return{content:N,isTruncated:!0,hiddenLines:B}}var k1=w$.memo(({content:$,role:Q,terminalWidth:Y,metadata:J,isPending:Z=!1,availableTerminalHeight:X,hidePrefix:K=!1,noMargin:U=!1,renderPlainTextOnly:G=!1,streamingLines:q,streamingHiddenLines:H,messageId:O,blocksOverride:N,currentLineOverride:z,streamingMode:B="text",renderCodeBlocksAsPlainText:_=!1})=>{let P=A0(),b=N!==void 0,F=B$(()=>TZ(Q,P.colors,J),[Q,P.colors,J]),{color:f,prefix:I}=F,L=I.length+1,C=B$(()=>{if(!J||typeof J!=="object")return null;if(!("subtaskRef"in J))return null;let A=J.subtaskRef;if(!A||typeof A!=="object")return null;return A},[J]),w=Q==="tool"&&J?.phase==="start",y=!U&&!w,k=B$(()=>{if(!G)return[];return $.split(/\r?\n/)},[$,G]);if(!b&&Z){let A=q??$.split(/\r?\n/),v=H??0,j=!1,D=!1,E=!1;if(B!=="text")j=B==="code",D=B==="diff",E=B==="table";return g(_0,{flexDirection:"column",marginBottom:y?1:0,flexShrink:0,children:[v>0&&g(_0,{flexDirection:"row",flexShrink:0,children:[g(_0,{width:L,flexShrink:0},void 0,!1,void 0,this),g(P0,{color:P.colors.text.muted,dimColor:!0,children:["^ ",v," lines above (streaming...)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),A.map((m,n)=>{if(B==="text"){if(m.match(Q$.codeBlock))j=!j;else if(m.match(Q$.diffStart))D=!0;else if(m.match(Q$.diffEnd))D=!1;else if(m.match(Q$.table))E=!0;else if(E&&!m.match(Q$.table))E=!1}let $0=B==="text"&&!j&&!D&&!E,L0=$0?m.match(Q$.ulItem):null,I0=$0?m.match(Q$.olItem):null,c0=L0??I0;return g(_0,{flexDirection:"row",flexShrink:0,children:[n===0&&!K?g(_0,{marginRight:1,flexShrink:0,children:g(P0,{color:f,bold:!0,children:I},void 0,!1,void 0,this)},void 0,!1,void 0,this):g(_0,{width:L,flexShrink:0},void 0,!1,void 0,this),g(_0,{flexGrow:1,flexShrink:0,children:c0?g(IQ,{type:L0?"ul":"ol",marker:c0[2],itemText:c0[3],leadingWhitespace:c0[1]},void 0,!1,void 0,this):g(P0,{wrap:"wrap",children:m===""?" ":m},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},n,!0,void 0,this)})]},void 0,!0,void 0,this)}if(!b&&G)return g(_0,{flexDirection:"column",marginBottom:y?1:0,flexShrink:0,children:k.map((A,v)=>g(_0,{flexDirection:"row",flexShrink:0,children:[v===0&&!K?g(_0,{marginRight:1,flexShrink:0,children:g(P0,{color:f,bold:!0,children:I},void 0,!1,void 0,this)},void 0,!1,void 0,this):g(_0,{width:L,flexShrink:0},void 0,!1,void 0,this),g(_0,{flexGrow:1,flexShrink:0,children:g(P0,{wrap:"wrap",children:A===""?" ":A},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},v,!0,void 0,this))},void 0,!1,void 0,this);let T=w9(null);fQ(()=>{T.current=null},[O]);let W=B$(()=>{if(b)return null;if(!O)return null;return b9(O)},[O,b]);fQ(()=>{if(b)return;if(!W||!O)return;T.current={messageId:O,blocks:W}},[W,O,b]),fQ(()=>{if(b)return;if(!W||!O)return;A9(O)},[W,O,b]);let S=B$(()=>b?{content:$,isTruncated:!1,hiddenLines:0}:VZ($,X,Z,Y),[$,X,Z,Y,b]),{content:h,isTruncated:o,hiddenLines:d}=S;if(!b&&Q==="tool"&&J&&"detail"in J){let A=J;if(A.detail)return g(_0,{flexDirection:"column",marginBottom:U?0:1,children:[g(_0,{flexDirection:"row",children:[g(_0,{marginRight:1,children:g(P0,{color:f,bold:!0,children:I},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(P0,{color:f,children:$},void 0,!1,void 0,this)]},void 0,!0,void 0,this),g(_0,{marginLeft:I.length+1,children:g(DZ,{detail:A.detail,terminalWidth:Y-(I.length+1)},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}let{completedContent:a,currentLine:l}=B$(()=>{if(b)return{completedContent:"",currentLine:z??""};if(!Z)return{completedContent:h,currentLine:""};let A=h.lastIndexOf(`
143
+ `);if(A===-1)return{completedContent:"",currentLine:h};return{completedContent:h.slice(0,A+1),currentLine:h.slice(A+1)}},[h,Z,b,z]),R=w9({content:"",blocks:[]}),M=B$(()=>{if(b)return N??[];if(W)return W;if(T.current&&T.current.messageId===O)return T.current.blocks;let A=R.current;if(!Z||!a.startsWith(A.content)){let E=kQ(a);return R.current={content:a,blocks:E},E}if(a===A.content)return A.blocks;let v=a.slice(A.content.length),j=kQ(v),D=[...A.blocks,...j];return R.current={content:a,blocks:D},D},[a,Z,b,N]);return g(_0,{flexDirection:"column",marginBottom:y?1:0,flexShrink:0,children:[o&&g(_0,{flexDirection:"row",flexShrink:0,children:[g(_0,{width:L,flexShrink:0},void 0,!1,void 0,this),g(P0,{color:P.colors.text.muted,dimColor:!0,children:["^ ",d," lines above (streaming...)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),M.map((A,v)=>{if(A.type==="empty")return g(_0,{height:1,flexShrink:0},v,!1,void 0,this);return g(_0,{flexDirection:"row",flexShrink:0,children:[v===0&&!K&&g(_0,{marginRight:1,flexShrink:0,children:g(P0,{color:f,bold:!0,children:I},void 0,!1,void 0,this)},void 0,!1,void 0,this),(v>0||K)&&g(_0,{width:L,flexShrink:0},void 0,!1,void 0,this),g(_0,{flexGrow:1,flexShrink:0,children:A.type==="code"?_?g(P0,{wrap:"wrap",children:A.content},void 0,!1,void 0,this):g(CZ,{content:A.content,language:A.language,terminalWidth:Y-L,isPending:Z,availableHeight:X},void 0,!1,void 0,this):A.type==="table"&&A.tableData?g(B9,{headers:A.tableData.headers,rows:A.tableData.rows,terminalWidth:Y-L},void 0,!1,void 0,this):A.type==="heading"?g(fZ,{content:A.content,level:A.level||1},void 0,!1,void 0,this):A.type==="list"?g(IQ,{type:A.listType||"ul",marker:A.marker||"-",itemText:A.content,leadingWhitespace:" ".repeat(A.indentation||0)},void 0,!1,void 0,this):A.type==="hr"?g(kZ,{terminalWidth:Y-L},void 0,!1,void 0,this):A.type==="diff"&&A.diffData?g(RQ,{patch:A.diffData.patch,startLine:A.diffData.startLine,matchLine:A.diffData.matchLine,terminalWidth:Y-L},void 0,!1,void 0,this):A.type==="command-message"?g(vZ,{content:A.content},void 0,!1,void 0,this):A.type==="blockquote"&&A.blockquoteLines?g(Y9,{lines:A.blockquoteLines,level:A.blockquoteLevel||1},void 0,!1,void 0,this):g(SZ,{content:A.content},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},v,!0,void 0,this)}),l&&g(_0,{flexDirection:"row",flexShrink:0,children:[M.length===0&&!K?g(_0,{marginRight:1,flexShrink:0,children:g(P0,{color:f,bold:!0,children:I},void 0,!1,void 0,this)},void 0,!1,void 0,this):g(_0,{width:L,flexShrink:0},void 0,!1,void 0,this),g(_0,{flexGrow:1,flexShrink:0,children:g(P0,{wrap:"wrap",children:l},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),C&&g(_0,{flexDirection:"row",flexShrink:0,children:[g(_0,{width:L,flexShrink:0},void 0,!1,void 0,this),g(_0,{flexDirection:"column",flexGrow:1,flexShrink:0,children:[g(P0,{color:P.colors.text.muted,children:["Subtask"," ",typeof C.agentType==="string"?`@${C.agentType}`:"",typeof C.status==="string"?` · ${C.status}`:""]},void 0,!0,void 0,this),typeof C.summary==="string"&&C.summary.trim()!==""&&g(P0,{wrap:"wrap",children:C.summary},void 0,!1,void 0,this),typeof C.childSessionId==="string"&&g(P0,{color:P.colors.text.muted,children:["Session ",C.childSessionId]},void 0,!0,void 0,this),typeof C.resumedFrom==="string"&&g(P0,{color:P.colors.text.muted,children:["Resumed from ",C.resumedFrom,typeof C.resumeDepth==="number"?` · depth ${C.resumeDepth}`:""]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},($,Q)=>{return $.content===Q.content&&$.role===Q.role&&$.terminalWidth===Q.terminalWidth&&$.isPending===Q.isPending&&$.availableTerminalHeight===Q.availableTerminalHeight&&$.hidePrefix===Q.hidePrefix&&$.noMargin===Q.noMargin&&$.renderPlainTextOnly===Q.renderPlainTextOnly&&$.streamingHiddenLines===Q.streamingHiddenLines&&$.streamingLines===Q.streamingLines&&$.messageId===Q.messageId&&$.metadata===Q.metadata&&$.blocksOverride===Q.blocksOverride&&$.currentLineOverride===Q.currentLineOverride&&$.streamingMode===Q.streamingMode&&$.renderCodeBlocksAsPlainText===Q.renderCodeBlocksAsPlainText});import{jsxDEV as C0,Fragment as cZ}from"react/jsx-dev-runtime";var gZ=SQ.memo(({label:$,isSelected:Q})=>C0(S1,{color:Q?"yellow":void 0,children:$},void 0,!1,void 0,this)),mZ=SQ.memo(({details:$,headerColor:Q,isPlanModeExit:Y,isPlanModeEnter:J,terminalWidth:Z})=>C0(cZ,{children:[C0(H1,{marginBottom:1,children:C0(S1,{children:$.message},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.planContent&&C0(H1,{flexDirection:"column",marginBottom:1,borderStyle:"single",borderColor:Q,padding:1,children:[C0(S1,{bold:!0,color:Q,children:"实施方案"},void 0,!1,void 0,this),C0(H1,{marginTop:1,children:C0(k1,{content:$.planContent,role:"assistant",terminalWidth:Z-4},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),!$.planContent&&$.details&&C0(H1,{flexDirection:"column",marginBottom:1,children:C0(k1,{content:$.details,role:"assistant",terminalWidth:Z},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.risks&&$.risks.length>0&&C0(H1,{flexDirection:"column",marginBottom:1,children:[C0(S1,{color:"red",bold:!0,children:"风险提示:"},void 0,!1,void 0,this),$.risks.map((X,K)=>C0(H1,{marginLeft:2,children:C0(S1,{color:"red",children:["• ",X]},void 0,!0,void 0,this)},K,!1,void 0,this))]},void 0,!0,void 0,this),$.affectedFiles&&$.affectedFiles.length>0&&C0(H1,{flexDirection:"column",marginBottom:1,children:[C0(S1,{color:"yellow",children:"影响的文件:"},void 0,!1,void 0,this),$.affectedFiles.slice(0,3).map((X,K)=>C0(H1,{marginLeft:2,children:C0(S1,{children:["• ",X]},void 0,!0,void 0,this)},K,!1,void 0,this)),$.affectedFiles.length>3&&C0(H1,{marginLeft:2,children:C0(S1,{color:"gray",children:["...还有 ",$.affectedFiles.length-3," 个文件"]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this));function pZ($,Q,Y,J){return`使用 ↑↓ 选择,回车确认 · ${Q||Y||J?"Y/N":$?"Y/S/N":"Y/S/P/N"} 快捷键 · Esc 取消`}var y9=SQ.memo(({details:$,onResponse:Q})=>{let{stdout:Y}=hZ(),J=Y.columns||80,X=s0()==="confirmation-prompt",K=S0(!1),U=$.type==="exitPlanMode",G=$.type==="enterPlanMode",q=$.type==="maxTurnsExceeded",H=$.type==="mcpSampling";jZ((z,B)=>{if(B.ctrl&&z==="c"||B.meta&&z==="c"){K();return}if(B.escape){Q({approved:!1,reason:"用户取消"});return}let _=z.toLowerCase();if(U){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(G){if(_==="y"){Q({approved:!0});return}if(_==="n"){Q({approved:!1,reason:"用户拒绝进入 Plan 模式"});return}}else if(q){if(_==="y"){Q({approved:!0});return}if(_==="n"){Q({approved:!1,reason:"用户选择停止"});return}}else if(H){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=P9(()=>{if(U)return[{key:"approve-auto",label:"[Y] 批准,自动执行",value:{approved:!0,targetMode:"autoEdit"}},{key:"approve-default",label:"[S] 批准,逐步确认",value:{approved:!0,targetMode:"default"}},{key:"reject",label:"[N] 继续优化方案",value:{approved:!1,reason:"方案需要改进"}}];if(G)return[{key:"approve",label:"[Y] 进入规划模式",value:{approved:!0}},{key:"reject",label:"[N] 直接执行",value:{approved:!1,reason:"用户拒绝进入 Plan 模式"}}];if(q)return[{key:"continue",label:"[Y] 继续执行",value:{approved:!0}},{key:"stop",label:"[N] 停止",value:{approved:!1,reason:"用户选择停止"}}];if(H)return[{key:"approve-once",label:"[Y] 允许本次 Sampling",value:{approved:!0,scope:"once"}},{key:"reject",label:"[N] 拒绝",value:{approved:!1,reason:"用户拒绝 MCP Sampling"}}];return[{key:"approve-once",label:"[Y] 允许(仅本次)",value:{approved:!0,scope:"once"}},{key:"approve-session",label:"[S] 允许(本次会话)",value:{approved:!0,scope:"session"}},{key:"approve-project",label:"[P] 允许并记住(本项目)",value:{approved:!0,scope:"project"}},{key:"reject",label:"[N] 拒绝",value:{approved:!1,reason:"用户拒绝"}}]},[U,G,q,H]),N=P9(()=>{if(U)return{color:"cyan",title:"方案审核"};if(G)return{color:"magenta",title:"进入规划模式"};if(q)return{color:"yellow",title:"已达最大轮次"};return{color:"yellow",title:$.title||"操作确认"}},[U,G,q,$.title]);return C0(H1,{flexDirection:"column",borderStyle:"round",borderColor:X?N.color:"gray",padding:1,children:[C0(H1,{marginBottom:1,children:C0(S1,{bold:!0,color:N.color,children:N.title},void 0,!1,void 0,this)},void 0,!1,void 0,this),C0(mZ,{details:$,headerColor:N.color,isPlanModeExit:U,isPlanModeEnter:G,terminalWidth:J},void 0,!1,void 0,this),C0(H1,{flexDirection:"column",children:[C0(S1,{color:"gray",children:pZ(U,G,q,H)},void 0,!1,void 0,this),C0(EZ,{items:O,isFocused:X,itemComponent:gZ,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 B0,Text as q0,useInput as xZ}from"ink";import R9 from"ink-text-input";import{useState as x1}from"react";import{jsxDEV as c}from"react/jsx-dev-runtime";var W2=[{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"}],_8=[{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"}],N8=[{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"}],uZ=[`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"],M9=({workspaceRoot:$,sessionId:Q,onClose:Y,onSave:J})=>{let Z=d0.getTheme(),[X,K]=x1("action"),[U,G]=x1(0),[q,H]=x1(0),[O,N]=x1(0),[z,B]=x1(""),[_,P]=x1(""),[b,F]=x1(null),[f,I]=x1(!1),[L,C]=x1(null),w=W2[U],y=N8[q],k=_8[O],T=()=>{if(L){C(null);return}switch(X){case"action":Y();break;case"event":K("action");break;case"matcher":K("event");break;case"command":K("matcher");break;case"location":K("command");break;case"confirm":K("location");break}};xZ((M,A)=>{if(A.escape){T();return}if(X==="action"){if(A.upArrow)G((v)=>v>0?v-1:W2.length-1);else if(A.downArrow)G((v)=>v<W2.length-1?v+1:0);else if(A.return)W()}else if(X==="event"){if(A.upArrow)H((v)=>v>0?v-1:N8.length-1);else if(A.downArrow)H((v)=>v<N8.length-1?v+1:0);else if(A.return)K("matcher")}else if(X==="location"){if(A.upArrow)N((v)=>v>0?v-1:_8.length-1);else if(A.downArrow)N((v)=>v<_8.length-1?v+1:0);else if(A.return)K("confirm")}else if(X==="confirm"){if(A.return)R()}});let W=()=>{let M=W2[U].action;if(M==="add")K("event");else if(M==="status")S();else if(M==="list")d();else if(M==="enable")O1.getInstance().enableSession(Q,$),C("Hooks enabled for this session");else if(M==="disable")O1.getInstance().disableSession(Q,$),C("Hooks disabled for this session");else if(M==="trust")h();else if(M==="revoke")o()},S=async()=>{let M=O1.getInstance(),A=M.isEnabled($,Q),v=M.getConfig($),j=await M.getTrustStatus($),D={};for(let m of Object.values(DQ)){let n=v[m];if(n&&Array.isArray(n)){let $0=n.reduce((L0,I0)=>L0+(I0.hooks?.length||0),0);if($0>0)D[m]=$0}}let E=[`Status: ${A?"Enabled":"Disabled"}`,`Trust: ${j.state}`,`Digest: ${j.currentDigest??"none"}`,""];if(Object.keys(D).length>0){E.push("Configured hooks:");for(let[m,n]of Object.entries(D))E.push(` ${m}: ${n} hook(s)`)}else E.push("No hooks configured");C(E.join(`
144
+ `))},h=async()=>{try{let M=await O1.getInstance().trustProject($);C(`Trust: ${M.state}
145
+ Digest: ${M.currentDigest??"none"}`)}catch(M){F(M instanceof Error?M.message:"Failed to trust hooks")}},o=async()=>{try{let M=await O1.getInstance().revokeProjectTrust($);C(`Trust: ${M.state}`)}catch(M){F(M instanceof Error?M.message:"Failed to revoke hook trust")}},d=()=>{let A=O1.getInstance().getConfig($),v=[],j=!1;for(let D of Object.values(DQ)){let E=A[D];if(!E||!Array.isArray(E)||E.length===0)continue;j=!0,v.push(`${D}:`);for(let m of E){let n=m.matcher,$0="all";if(n?.tools)$0=`tools: ${Array.isArray(n.tools)?n.tools.join(", "):n.tools}`;v.push(` [${$0}]`);for(let L0 of m.hooks||[])if(L0.type==="command")v.push(` -> ${L0.command}`)}v.push("")}if(!j)v.push("No hooks configured"),v.push(""),v.push("Configure hooks in .blade/settings.local.json");C(v.join(`
146
+ `))},a=()=>{K("command")},l=()=>{if(!_.trim()){F("Command cannot be empty");return}F(null),K("location")},R=async()=>{I(!0),F(null);try{let M=O1.getInstance(),A=await import("node:fs/promises"),v=await import("node:path"),j=await import("node:os"),D={matcher:z.trim()?{tools:z.trim()}:{},hooks:[{type:"command",command:_.trim()}]},E;switch(k.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(j.homedir(),".blade","settings.json");break}await A.mkdir(v.dirname(E),{recursive:!0});let m={};try{let I0=await A.readFile(E,"utf-8");m=JSON.parse(I0)}catch{}let n=m.hooks||{},$0=n[y.event]||[],L0={...n,enabled:!0,[y.event]:[...$0,D]};if(m.hooks=L0,await A.writeFile(E,JSON.stringify(m,null,2),"utf-8"),await M.reloadConfig($),J)J({event:y.event,matcher:z.trim(),command:_.trim()});Y()}catch(M){F(`Failed to save hook: ${M instanceof Error?M.message:"Unknown error"}`),I(!1)}};return c(B0,{flexDirection:"column",padding:1,children:[c(B0,{marginBottom:1,children:c(q0,{bold:!0,color:Z.colors.success,children:"Hooks Manager"},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(B0,{marginBottom:1,children:c(q0,{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),L&&c(B0,{flexDirection:"column",marginBottom:1,children:[c(q0,{children:L},void 0,!1,void 0,this),c(B0,{marginTop:1,children:c(q0,{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"&&!L&&c(B0,{flexDirection:"column",children:[c(B0,{flexDirection:"column",marginTop:1,children:W2.map((M,A)=>c(B0,{children:[c(q0,{color:A===U?Z.colors.primary:void 0,bold:A===U,children:[A===U?"> ":" ",M.action]},void 0,!0,void 0,this),c(q0,{color:Z.colors.muted,children:[" - ",M.description]},void 0,!0,void 0,this)]},M.action,!0,void 0,this))},void 0,!1,void 0,this),c(B0,{marginTop:1,children:c(q0,{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(B0,{flexDirection:"column",children:[c(q0,{bold:!0,children:"Select Event:"},void 0,!1,void 0,this),c(B0,{flexDirection:"column",marginTop:1,children:N8.map((M,A)=>c(B0,{children:[c(q0,{color:A===q?Z.colors.primary:void 0,bold:A===q,children:[A===q?"> ":" ",M.event]},void 0,!0,void 0,this),c(q0,{color:Z.colors.muted,children:[" - ",M.description]},void 0,!0,void 0,this)]},M.event,!0,void 0,this))},void 0,!1,void 0,this),c(B0,{marginTop:1,children:c(q0,{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(B0,{marginBottom:1,children:c(q0,{children:["Event:"," ",c(q0,{bold:!0,color:Z.colors.primary,children:y.event},void 0,!1,void 0,this),c(q0,{color:Z.colors.muted,children:[" - ",y.description]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),(X==="matcher"||X==="command"||X==="confirm")&&c(B0,{flexDirection:"column",marginBottom:1,children:[c(q0,{color:Z.colors.muted,children:"Input to command is JSON of tool call arguments."},void 0,!1,void 0,this),c(q0,{color:Z.colors.muted,children:"Exit code 0 - stdout/stderr not shown"},void 0,!1,void 0,this),c(q0,{color:Z.colors.muted,children:"Exit code 2 - show stderr to model and block tool call"},void 0,!1,void 0,this),c(q0,{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(B0,{flexDirection:"column",children:[c(B0,{children:[c(q0,{bold:!0,children:"Matcher: "},void 0,!1,void 0,this),c(R9,{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(B0,{marginTop:1,children:c(q0,{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(B0,{marginTop:1,children:c(q0,{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(B0,{marginBottom:1,children:c(q0,{children:["Matcher: ",c(q0,{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(B0,{flexDirection:"column",children:[c(B0,{children:c(q0,{bold:!0,children:"Command: "},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(B0,{borderStyle:"single",borderColor:Z.colors.border.light,paddingX:1,marginTop:1,children:c(R9,{value:_,onChange:P,onSubmit:l,placeholder:"Enter shell command..."},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(B0,{flexDirection:"column",marginTop:1,children:[c(q0,{bold:!0,children:"Examples:"},void 0,!1,void 0,this),uZ.map((M,A)=>c(q0,{color:Z.colors.muted,children:["• ",M]},A,!0,void 0,this))]},void 0,!0,void 0,this),c(B0,{marginTop:1,children:c(q0,{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(B0,{flexDirection:"column",children:[c(B0,{flexDirection:"column",borderStyle:"round",borderColor:Z.colors.border.light,paddingX:2,paddingY:1,marginBottom:1,children:[c(q0,{bold:!0,color:Z.colors.primary,children:"Save hook configuration"},void 0,!1,void 0,this),c(q0,{children:" "},void 0,!1,void 0,this),c(q0,{children:[" ","Event: ",y.event," - ",y.description]},void 0,!0,void 0,this),c(q0,{children:[" Matcher: ",z||"(all)"]},void 0,!0,void 0,this),c(q0,{children:[" Command: ",_]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),c(q0,{bold:!0,children:"Where should this hook be saved?"},void 0,!1,void 0,this),c(B0,{flexDirection:"column",marginTop:1,children:_8.map((M,A)=>c(B0,{children:[c(q0,{color:A===O?Z.colors.primary:void 0,bold:A===O,children:[A===O?"> ":" ",A+1,". ",M.name]},void 0,!0,void 0,this),c(q0,{color:Z.colors.muted,children:[" ",M.description]},void 0,!0,void 0,this)]},M.location,!0,void 0,this))},void 0,!1,void 0,this),c(B0,{marginTop:1,children:c(q0,{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(B0,{flexDirection:"column",children:[c(B0,{flexDirection:"column",borderStyle:"round",borderColor:Z.colors.success,paddingX:2,paddingY:1,children:[c(q0,{bold:!0,children:["Saving hook to ",k.description,"..."]},void 0,!0,void 0,this),c(q0,{children:" "},void 0,!1,void 0,this),c(q0,{children:["Event: ",y.event]},void 0,!0,void 0,this),c(q0,{children:["Matcher: ",z||"(all tools)"]},void 0,!0,void 0,this),c(q0,{children:["Command: ",_]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),c(B0,{marginTop:1,children:c(q0,{color:Z.colors.muted,children:f?"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),b&&c(B0,{marginTop:1,children:c(q0,{color:Z.colors.error,children:b},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as u9}from"ahooks";import{Box as K5,Text as G5}from"ink";import U5 from"react";import{useMemoizedFn as W8}from"ahooks";import A$ from"chalk";import{Text as Q5,useInput as J5}from"ink";import{useEffect as p9,useRef as H8}from"react";var F8={TIMEOUT_MS:100,RAPID_INPUT_THRESHOLD_MS:150,LARGE_INPUT_THRESHOLD:300,MEDIUM_SIZE_MULTI_CHUNK_THRESHOLD:200};var b$="\x1B",lZ=`${b$}[200~`,dZ=`${b$}[201~`,rZ="[200~",aZ="[201~",iZ=[`${b$}[I`,`${b$}[O`,"[I","[O"],C9=`${b$}[?2004h`,f9=`${b$}[?2004l`,jQ=`${b$}[?1004l`,oZ=[lZ,rZ],nZ=[dZ,aZ];function k9(){return{pasteBuffer:null,pasteOverflowed:!1}}function I9($,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 T9($){return iZ.some((Q)=>$===Q)}function S9($,Q){let Y=Q,J=$.pasteBuffer,Z=$.pasteOverflowed,X=J!==null,K=[];while(Y.length>0){if(J!==null){let q=I9(Y,nZ);if(!q){if(J.length+Y.length>VQ)J="",Z=!0;else if(!Z)J+=Y;Y="";break}if(J.length+q.index>VQ)Z=!0;else if(!Z)J+=Y.slice(0,q.index),K.push({kind:"paste",text:J});J=null,Z=!1,X=!0,Y=Y.slice(q.index+q.marker.length);continue}let U=I9(Y,oZ);if(!U){if(T9(Y))X=!0;else K.push({kind:"text",text:Y});Y="";break}let G=Y.slice(0,U.index);if(G&&!T9(G))K.push({kind:"text",text:G});J="",Z=!1,X=!0,Y=Y.slice(U.index+U.marker.length)}if(Q.length===0&&J!==null)X=!0;return{handled:X,state:{pasteBuffer:J,pasteOverflowed:Z},segments:K}}import{execSync as d$}from"node:child_process";import{existsSync as tZ,readFileSync as hQ}from"node:fs";import{basename as v9,isAbsolute as sZ}from"node:path";function D9($){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 V9(){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 eZ(){let{commands:$}=V9();try{return d$($.getPath,{encoding:"utf-8"}).trim()}catch(Q){return console.error("Failed to get clipboard path:",Q),null}}function j9($){if($.startsWith('"')&&$.endsWith('"')||$.startsWith("'")&&$.endsWith("'"))return $.slice(1,-1);return $}function h9($){if(process.platform==="win32")return $;let Q="__DOUBLE_BACKSLASH__";return $.replace(/\\\\/g,Q).replace(/\\(.)/g,"$1").replace(new RegExp(Q,"g"),"\\")}function EQ($){let Q=j9($.trim()),Y=h9(Q);return/\.(png|jpe?g|gif|webp)$/i.test(Y)}function $5($){let Q=j9($.trim()),Y=h9(Q);if(EQ(Y))return Y;return null}async function E9($){let Q=$5($);if(!Q)return null;let Y;try{if(sZ(Q))Y=hQ(Q);else{let K=eZ();if(K&&Q===v9(K))Y=hQ(K);else return null}}catch(K){return console.error("Failed to read image file:",K),null}let J=Y.toString("base64"),Z=D9(J),X=v9(Q);return{path:Q,base64:J,mediaType:Z,filename:X}}async function g9(){let $=process.platform,Q={darwin:"pbpaste",linux:"xclip -selection clipboard -o || wl-paste",win32:'powershell -Command "Get-Clipboard"'},Y=Q[$]||Q.linux;try{return d$(Y,{encoding:"utf-8"})||null}catch{return null}}async function m9(){let{commands:$,screenshotPath:Q}=V9();try{if(d$($.checkImage,{stdio:"ignore"}),d$($.saveImage(Q),{stdio:"ignore"}),!tZ(Q))return null;let J=hQ(Q).toString("base64"),Z=D9(J);return d$($.deleteFile(Q),{stdio:"ignore"}),{base64:J,mediaType:Z}}catch(Y){try{d$($.deleteFile(Q),{stdio:"ignore"})}catch{}return null}}import{jsxDEV as X5}from"react/jsx-dev-runtime";var Y5=/\r\n/g,Z5=/\r/g;function gQ($){if(!$.includes("\r"))return $;return $.replace(Y5,`
147
+ `).replace(Z5,`
148
+ `)}function c9($,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 x9({value:$,placeholder:Q="",focus:Y=!0,onChange:J,cursorPosition:Z,onChangeCursorPosition:X,onPaste:K,onImagePaste:U,disabledKeys:G=[]}){let q=H8(k9()),H=H8($),O=H8(Z),N=H8(null);p9(()=>{H.current=$,O.current=Z},[$,Z]),p9(()=>{if(Z>$.length)X($.length)},[$,Z,X]);let z=W8((I,L)=>{let C=H.current,w=O.current;if(H.current=I,O.current=L,I!==C)J(I);if(L!==w)X(L)}),B=W8((I)=>{if(!I)return;let{newValue:L,newCursorPosition:C}=c9(gQ(I),H.current,O.current);z(L,C)}),_=W8(async(I)=>{let L=gQ(I);if(!L)return;if(U&&EQ(L))try{let w=await E9(L);if(w){let y=await U(w.base64,w.mediaType,w.filename);if(y?.prompt)B(y.prompt);return}}catch(w){console.error("Failed to process image path:",w)}if((L.length>F8.LARGE_INPUT_THRESHOLD||L.includes(`
149
+ `))&&K){let w=await K(L);if(w?.prompt){B(w.prompt);return}}B(L)}),P=W8((I)=>{let L=N.current;if(!L){try{let w=I();if(!w)return;let y=w.catch(()=>{return});N.current=y,y.finally(()=>{if(N.current===y)N.current=null})}catch{}return}let C=L.then(I).then(()=>{return}).catch(()=>{return});N.current=C,C.finally(()=>{if(N.current===C)N.current=null})});J5((I,L)=>{P(()=>{let C=gQ(I),w=S9(q.current,C);if(q.current=w.state,w.handled)return(async()=>{for(let h of w.segments)if(h.kind==="paste")await _(h.text);else B(h.text)})();if(G.some((h)=>L[h])||L.ctrl&&I==="c"||L.ctrl&&I==="l"||L.ctrl&&I==="t"||L.ctrl&&I==="o"||L.meta&&I==="l"||L.meta&&I==="t"||L.meta&&I==="o"||L.shift&&L.tab||C==="?"&&H.current==="")return;let k=H.current,T=O.current,W=T,S=k;if(L.leftArrow)W--;else if(L.rightArrow)W++;else if(L.backspace||L.delete){if(I===""){if(T>0)S=k.slice(0,T-1)+k.slice(T,k.length),W--}else if(T<k.length)S=k.slice(0,T)+k.slice(T+1,k.length)}else if(L.ctrl&&C==="a")W=0;else if(L.ctrl&&C==="e")W=k.length;else if(L.ctrl&&C==="k")S=k.slice(0,T);else if(L.ctrl&&C==="u")S=k.slice(T),W=0;else if(L.ctrl&&C==="w"){let o=k.slice(0,T).match(/\s*\S+\s*$/);if(o){let d=o[0].length;S=k.slice(0,T-d)+k.slice(T),W-=d}}else if(L.ctrl&&C==="v"){let h=process.platform==="darwin";return(async()=>{if(U){let d=await m9();if(d){let a=await U(d.base64,d.mediaType,"clipboard.png");if(a?.prompt)B(a.prompt);return}}if(h)return;let o=await g9();if(o)await _(o)})()}else if(L.pageUp)W=0;else if(L.pageDown)W=k.length;else if(C===`
150
+ `&&(L.shift||L.meta)){let{newValue:h,newCursorPosition:o}=c9(C,k,T);z(h,o);return}else if(!L.ctrl&&!L.meta){if(K&&(C.length>F8.LARGE_INPUT_THRESHOLD||C.includes(`
151
+ `)))return _(C);S=k.slice(0,T)+C+k.slice(T,k.length),W+=C.length}if(W<0)W=0;if(W>S.length)W=S.length;z(S,W)})},{isActive:Y});let b=Y,F=$,f=Q?A$.grey(Q):void 0;if(b)if(f=Q.length>0?A$.inverse(Q[0])+A$.grey(Q.slice(1)):A$.inverse(" "),$.length===0)F=A$.inverse(" ");else{F="";for(let I=0;I<$.length;I++)if(I===Z&&Z<$.length)F+=A$.inverse($[I]);else F+=$[I];if(Z>=$.length)F+=A$.inverse(" ")}return X5(Q5,{children:Q?$.length>0?F:f:F},void 0,!1,void 0,this)}import{jsxDEV as mQ}from"react/jsx-dev-runtime";var l9=U5.memo(({input:$,cursorPosition:Q,onChange:Y,onChangeCursorPosition:J,onAddPasteMapping:Z,onAddImagePasteMapping:X})=>{let U=s0()==="main-input",G=$.trimStart().startsWith("!"),q=u9((O)=>{let N=O.split(`
152
+ `).length,z=O.length,B=500,_=10;if(z>500||N>10){let P=Z(O),b=O.slice(0,30).replace(/\n/g," "),F=`${z} chars, ${N} lines: ${b}...`;return{prompt:`${e2(P)}${F}${t8()}`}}return{}}),H=u9(async(O,N,z)=>{try{let B=X(O,N);return{prompt:`${e2(B)}[Image #${B}]${t8()}`}}catch(B){return console.error("[Image Paste] Failed to process image:",B),{prompt:`[Image paste failed: ${B instanceof Error?B.message:"Unknown error"}] `}}});return mQ(K5,{flexDirection:"row",width:"100%",paddingX:2,paddingY:0,flexShrink:0,flexGrow:0,overflow:"hidden",borderStyle:"round",borderColor:G?"yellow":"gray",children:[mQ(G5,{color:G?"yellow":"blue",bold:!0,children:G?"$ ":"> "},void 0,!1,void 0,this),mQ(x9,{value:$,cursorPosition:Q,onChange:Y,onChangeCursorPosition:J,onPaste:q,onImagePaste:H,placeholder:" 输入命令...",focus:U,disabledKeys:["upArrow","downArrow","tab","return","escape"]},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as L8,Text as R1}from"ink";import N5,{useEffect as F5,useState as W5}from"react";import{useEffect as _5,useState as i9}from"react";import{useEffect as q5,useState as O5}from"react";var z5=15000,d9=["思考中","构思中","推理中","琢磨中","分析中","斟酌中","酝酿中","推敲中","揣摩中","审视中","处理中","编排中","打磨中","编织中","拼装中","调配中","组装中","搭建中","铸造中","雕琢中","搜寻中","梳理中","排查中","勘探中","钻研中","翻阅中","遍历中","扫描中","检索中","追踪中","计算中","编译中","解析中","运算中","推演中","迭代中","收敛中","演绎中","归纳中","求解中","生成中","编写中","起草中","绘制中","勾勒中","渲染中","合成中","调和中","编曲中","烹制中","施工中","酿造中","发酵中","煎熬中","折腾中","捣鼓中","鼓捣中","腾挪中","筹备中","蓄力中"],r9=["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 a9($,Q,Y=!1){let[J,Z]=O5("");return q5(()=>{if(Q){Z("等待用户确认...");return}if(!$){Z("");return}if(Y)return;let X=()=>{if(Math.random()<0.25){let q=Math.floor(Math.random()*r9.length);return r9[q]}let G=Math.floor(Math.random()*d9.length);return d9[G]};Z(X());let K=setInterval(()=>{Z(X())},z5);return()=>{clearInterval(K)}},[$,Q,Y]),J}function o9($,Q=!1,Y=!1){let[J,Z]=i9(0),[X,K]=i9(null),U=a9($,Q,Y);return _5(()=>{if(!$){Z(0),K(null);return}if(Y)return;if(X===null)K(Date.now());let G=setInterval(()=>{if(X!==null){let q=Math.floor((Date.now()-X)/1000);Z(q)}},1000);return()=>{clearInterval(G)}},[$,X,Y]),{currentPhrase:U,elapsedTime:J}}import{jsxDEV as $1,Fragment as L5}from"react/jsx-dev-runtime";var pQ=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"],H5=80;function r$($){if($<60)return`${$}s`;let Q=Math.floor($/60),Y=$%60;return`${Q}m ${Y}s`}var n9=N5.memo(({message:$,paused:Q=!1})=>{let Y=D$(),J=k2(),Z=H4(),X=W4(),K=L4(),U=B4(),G=w4(),q=Y||!J,[H,O]=W5(0),N=A0(),B=$$()>=H5,{currentPhrase:_,elapsedTime:P}=o9(q,!1,Q);if(F5(()=>{if(!q||Q){O(0);return}let w=setInterval(()=>{O((y)=>(y+1)%pQ.length)},150);return()=>clearInterval(w)},[q,Q]),!q)return null;let b=K?.mode==="bounded_foreground"?`Provider 暂时不可用,正在有界恢复 (${K.attempt}/${K.maxRetries}),剩余约 ${r$(Math.max(0,Math.ceil((K.recoveryRemainingMs??0)/1000)))}`:K?.phase==="scheduled"?`Provider 暂时不可用,${K.attempt}/${K.maxRetries} 次重试将在 ${Math.max(0,Math.ceil((K.delayMs??0)/1000))}s 后开始`:K?.phase==="attempt"?`正在重试 Provider (${K.attempt}/${K.maxRetries})`:null,F=X?X.phase==="probe"?"Provider 正在执行唯一恢复探测":`Provider 故障已隔离,等待恢复探测${X.retryAfterMs!==void 0?` (${r$(Math.max(0,Math.ceil(X.retryAfterMs/1000)))})`:""}${X.recoveryRemainingMs!==void 0?`,剩余预算 ${r$(Math.max(0,Math.ceil(X.recoveryRemainingMs/1000)))}`:""}`:null,f=Z?`等待 Provider 容量(${Z.scope},队列 ${Z.queuePosition}/${Math.max(Z.queueDepth,Z.queuePosition)},已等待 ${r$(Math.max(0,Math.ceil(Z.waitMs/1000)))})`:null,I=U?U.outputStarted?`Provider 流已暂停 ${Math.ceil(U.durationMs/1000)}s,仍在等待(空闲超时上限 ${Math.ceil(U.timeoutMs/1000)}s)`:`Provider 尚未返回流数据,已等待 ${Math.ceil(U.durationMs/1000)}s(空闲超时上限 ${Math.ceil(U.timeoutMs/1000)}s)`:null,C=(G?.phase==="detected"?`检测到 ${G.toolName} 连续 ${G.runLength} 次无进展,正在要求 Agent 切换策略`:G?.phase==="halted"?`已停止 ${G.toolName} 空转循环`:null)||F||f||b||I||$||_||"正在思考中...";if(B)return $1(L8,{paddingX:2,paddingBottom:1,flexDirection:"row",gap:1,children:[$1(R1,{color:N.colors.warning,bold:!0,children:pQ[H]},void 0,!1,void 0,this),$1(R1,{color:N.colors.text.primary,children:C},void 0,!1,void 0,this),P>0&&$1(L5,{children:[$1(R1,{color:N.colors.muted,children:"|"},void 0,!1,void 0,this),$1(R1,{color:N.colors.info,children:["已用时: ",r$(P)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$1(R1,{color:N.colors.muted,children:"|"},void 0,!1,void 0,this),$1(R1,{color:N.colors.secondary,children:"Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return $1(L8,{paddingX:2,paddingBottom:1,flexDirection:"column",children:[$1(L8,{flexDirection:"row",gap:1,children:[$1(R1,{color:N.colors.warning,bold:!0,children:pQ[H]},void 0,!1,void 0,this),$1(R1,{color:N.colors.text.primary,children:C},void 0,!1,void 0,this)]},void 0,!0,void 0,this),P>0&&$1(L8,{marginLeft:2,flexDirection:"row",gap:1,children:[$1(R1,{color:N.colors.info,children:["已用时: ",r$(P)]},void 0,!0,void 0,this),$1(R1,{color:N.colors.muted,children:"|"},void 0,!1,void 0,this),$1(R1,{color:N.colors.secondary,children:"Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});import{Box as b8,Text as D0,useInput as B5,useStdout as w5}from"ink";import b5 from"ink-text-input";import A5,{useCallback as B8,useEffect as P5,useMemo as y5,useState as P$}from"react";import{jsxDEV as F0}from"react/jsx-dev-runtime";var $J=A5.memo(({details:$,onComplete:Q})=>{let{stdout:Y}=w5(),J=Y.columns||80,Z=s0()==="confirmation-prompt",X=S0(!1),K=$.fields??[],[U,G]=P$("field"),[q,H]=P$(0),[O,N]=P$(()=>t9($)),[z,B]=P$(""),[_,P]=P$(0),[b,F]=P$([]),[f,I]=P$(),L=K[q],C=y5(()=>R5(L),[L]);P5(()=>{if(!L)return;let W=O[L.name];B(typeof W==="string"||typeof W==="number"?String(W):""),F(Array.isArray(W)?[...W]:[]);let S=C.findIndex((h)=>h.value===String(W));P(S>=0?S:0),I(void 0)},[O,L,C]);let w=B8((W)=>{if(N(W),q<K.length-1){H((S)=>S+1);return}G("review")},[q,K.length]),y=B8((W)=>{if(!L)return;let S={...O};if(W===void 0)delete S[L.name];else S[L.name]=W;w(S)},[O,L,w]),k=B8((W)=>{if(!L)return;try{y(s9(L,W))}catch(S){I(S instanceof Error?S.message:String(S))}},[L,y]),T=B8(()=>{try{let W=e9($,{action:"accept",content:O});Q({action:W.action,...W.content?{content:W.content}:{}})}catch(W){I(W instanceof Error?W.message:String(W))}},[O,$,Q]);if(B5((W,S)=>{if(S.ctrl&&W==="c"||S.meta&&W==="c"){X();return}if(S.escape){Q({action:"cancel"});return}if($.mode==="url"){if(W.toLowerCase()==="y")Q({action:"accept"},!0);else if(W.toLowerCase()==="n")Q({action:"decline"});return}if(U==="review"){if(W.toLowerCase()==="y"||S.return)T();else if(W.toLowerCase()==="e")H(0),G("field");else if(W.toLowerCase()==="d")Q({action:"decline"});return}if(!L){if(S.return)T();return}if(cQ(L))return;if(W.toLowerCase()==="d"){Q({action:"decline"});return}if(S.upArrow){P((h)=>h>0?h-1:Math.max(C.length-1,0));return}if(S.downArrow||S.tab){P((h)=>h<C.length-1?h+1:0);return}if(W===" "&&L.type==="multi-select"){let h=C[_];if(h)F((o)=>o.includes(h.value)?o.filter((d)=>d!==h.value):[...o,h.value]);return}if(S.return)if(L.type==="multi-select")y(b);else{let h=C[_];if(h)y(h.typedValue)}},{isActive:Z}),$.mode==="url")return F0(w8,{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(U==="review")return F0(w8,{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),K.map((W)=>F0(D0,{children:[W.title,": ",I5(O[W.name])]},W.name,!0,void 0,this)),f&&F0(D0,{color:"red",children:f},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(!L)return F0(w8,{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(w8,{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(b8,{flexDirection:"column",marginTop:1,children:[F0(D0,{bold:!0,children:[L.title,L.required?" *":""]},void 0,!0,void 0,this),L.description&&F0(D0,{color:"gray",children:L.description},void 0,!1,void 0,this),F0(D0,{color:"gray",children:M5(L)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),cQ(L)?F0(b8,{children:[F0(D0,{color:"cyan",children:"> "},void 0,!1,void 0,this),F0(b5,{value:z,onChange:B,onSubmit:k,focus:Z,placeholder:L.defaultValue===void 0?L.required?"Required":"Optional":String(L.defaultValue)},void 0,!1,void 0,this)]},void 0,!0,void 0,this):F0(b8,{flexDirection:"column",children:C.map((W,S)=>{let h=L.type==="multi-select"&&b.includes(W.value);return F0(D0,{color:_===S?"yellow":void 0,children:[_===S?"> ":" ",L.type==="multi-select"?h?"(*) ":"( ) ":"",W.label]},W.value,!0,void 0,this)})},void 0,!1,void 0,this),f&&F0(D0,{color:"red",children:f},void 0,!1,void 0,this),F0(D0,{color:"gray",children:[cQ(L)?"Enter to continue":L.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 ",q+1," of ",K.length]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});function w8({children:$,width:Q,color:Y}){return F0(b8,{flexDirection:"column",gap:1,borderStyle:"round",borderColor:Y,padding:1,width:Math.min(Q-4,88),children:$},void 0,!1,void 0,this)}function cQ($){return $.type==="string"||$.type==="number"||$.type==="integer"}function R5($){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 M5($){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 I5($){if($===void 0)return"(omitted)";if(Array.isArray($))return $.join(", ")||"(none)";return String($)}import R8 from"ansi-escapes";import{Box as Y$,Static as c5,useStdout as x5}from"ink";import u5,{useEffect as d1,useMemo as iQ,useRef as Z$,useState as oQ}from"react";import{useStdout as T5}from"ink";import{debounce as C5}from"lodash-es";import{useEffect as f5,useState as k5}from"react";function QJ($=200){let{stdout:Q}=T5(),[Y,J]=k5(Q.rows||24);return f5(()=>{let Z=C5(()=>{J(Q.rows||24)},$);return Z(),Q.on("resize",Z),()=>{Q.off("resize",Z),Z.cancel()}},[Q,$]),Y}import y$ from"chalk";import S5 from"string-width";var N0={active:!1,renderedLineCount:0,lastRenderedLines:[],terminalWidth:process.stdout.columns||80,terminalHeight:process.stdout.rows||24,prefixIndent:4,isFirstRender:!0},P8="\x1B",xQ=`${P8}[2K`,A8=($)=>$>0?`${P8}[${$}A`:"",JJ=`${P8}[?25l`,YJ=`${P8}[?25h`;function ZJ($,Q){N0.active=!0,N0.renderedLineCount=0,N0.lastRenderedLines=[],N0.terminalWidth=$,N0.terminalHeight=Q,N0.isFirstRender=!0}function XJ($,Q){N0.terminalWidth=$,N0.terminalHeight=Q}function KJ($,Q,Y,J){if(!N0.active)return;let Z=8,X=Math.max(1,N0.terminalHeight-Z),K=[],U=d0.getTheme(),G=" ".repeat(N0.prefixIndent),q=y$.dim.hex(U.colors.border.light);if(Q>0)K.push(`${G}${y$.dim.hex(U.colors.text.muted)(`^ ${Q} lines above (streaming...)`)}`);let H=Y==="code",O=Y==="diff",N="",z=$;if(H&&$.length>0)N=$[0].match(/^```(\w+)?/)?.[1]||"",z=$.slice(1);else if(O&&$.length>0&&$[0]==="<<<DIFF>>>")z=$.slice(1);let B=z.slice(-X);if(H&&Q===0){let P=N?` ${y$.hex(U.colors.text.secondary)(N)}`:"";K.push(`${G}${q("╭─")}${P}`)}for(let P=0;P<B.length;P++){let b=B[P],F=G;if(P===0&&!J&&N0.isFirstRender&&!H&&!O)F=y$.bold.hex(U.colors.success)("• ")+" ",N0.isFirstRender=!1;let f=H?4:0,I=N0.terminalWidth-N0.prefixIndent-2-f,L=b;if(S5(b)>I)L=b.slice(0,I);if(H)K.push(`${G}${q("│")} ${L}`);else if(O){let C=L;if(C.startsWith("+"))K.push(`${F}${y$.green(L)}`);else if(C.startsWith("-"))K.push(`${F}${y$.red(L)}`);else if(C.startsWith("@@"))K.push(`${F}${y$.dim(L)}`);else K.push(`${F}${L}`)}else K.push(`${F}${L}`);if(P===0&&!J&&N0.isFirstRender)N0.isFirstRender=!1}let _=[];if(_.push(JJ),N0.renderedLineCount>0)_.push(A8(N0.renderedLineCount)),_.push("\r");for(let P=0;P<K.length;P++){let b=K[P],F=N0.lastRenderedLines[P];if(b!==F)_.push(xQ),_.push(b);if(P<K.length-1)_.push(`
153
+ `)}if(K.length<N0.renderedLineCount){for(let b=K.length;b<N0.renderedLineCount;b++)_.push(`
154
+ `),_.push(xQ);let P=N0.renderedLineCount-K.length;_.push(A8(P))}_.push(YJ),process.stdout.write(_.join("")),N0.renderedLineCount=K.length,N0.lastRenderedLines=K}function u1(){if(!N0.active)return;if(N0.renderedLineCount>0){let $=[];$.push(JJ),$.push(A8(N0.renderedLineCount)),$.push("\r");for(let Q=0;Q<N0.renderedLineCount;Q++)if($.push(xQ),Q<N0.renderedLineCount-1)$.push(`
155
+ `);if(N0.renderedLineCount>1)$.push(A8(N0.renderedLineCount-1)),$.push("\r");$.push(YJ),process.stdout.write($.join(""))}N0.active=!1,N0.renderedLineCount=0,N0.lastRenderedLines=[],N0.isFirstRender=!0}function v1(){return N0.active}import{Box as v5,Text as GJ}from"ink";import D5 from"react";import{jsxDEV as uQ}from"react/jsx-dev-runtime";var lQ=D5.memo(({collapsedCount:$})=>{let Q=A0();if($<=0)return null;let Y=Q.colors.text.muted;return uQ(v5,{flexDirection:"row",marginBottom:1,children:[uQ(GJ,{color:Y,children:[">"," ",$," 条历史消息"]},void 0,!0,void 0,this),uQ(GJ,{color:Y,children:" [Ctrl+O 展开]"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});lQ.displayName="CollapsedHistorySummary";import{Box as H2,Text as L2}from"ink";import V5 from"ink-big-text";import j5 from"ink-gradient";import h5 from"react";import{jsxDEV as L1}from"react/jsx-dev-runtime";var qJ=h5.memo(()=>{return L1(H2,{flexDirection:"column",paddingX:2,paddingTop:1,paddingBottom:1,children:[L1(H2,{flexDirection:"column",children:L1(j5,{name:"pastel",children:L1(V5,{text:"BLADE",font:"block"},void 0,!1,void 0,this)},void 0,!1,void 0,this)},void 0,!1,void 0,this),L1(H2,{marginBottom:1,children:L1(L2,{color:"white",dimColor:!0,children:UJ()},void 0,!1,void 0,this)},void 0,!1,void 0,this),L1(H2,{flexDirection:"column",marginBottom:1,children:[L1(H2,{marginBottom:1,children:L1(L2,{color:"white",bold:!0,children:"使用指南:"},void 0,!1,void 0,this)},void 0,!1,void 0,this),L1(L2,{color:"white",children:"1. 输入问题、编辑文件或运行命令"},void 0,!1,void 0,this),L1(L2,{color:"white",children:"2. 使用 /init 创建项目配置文件"},void 0,!1,void 0,this),L1(L2,{color:"white",children:"3. 输入 /help 查看所有 slash 命令"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});import{Box as y8,Text as dQ}from"ink";import OJ from"react";import{jsxDEV as J$}from"react/jsx-dev-runtime";var zJ=OJ.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 J$(y8,{flexDirection:"column",borderStyle:"single",borderColor:J.border.light,paddingX:1,paddingY:Y?0:1,marginBottom:1,children:[J$(y8,{marginBottom:Y?0:1,children:[J$(dQ,{dimColor:!0,children:"Tasks "},void 0,!1,void 0,this),J$(dQ,{color:J.text.muted,children:[Z.completed,"/",Z.total]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),J$(y8,{flexDirection:"column",children:$.map((X,K)=>J$(E5,{task:X,compact:Y},X.id||K,!1,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}),E5=OJ.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 J$(y8,{paddingY:Q?0:0,children:J$(dQ,{dimColor:J,children:[Y," ",Z]},void 0,!0,void 0,this)},void 0,!1,void 0,this)});import{Box as rQ,Text as a$}from"ink";import g5,{useMemo as _J}from"react";import{jsxDEV as l1}from"react/jsx-dev-runtime";function m5($,Q=60){if(!$)return"";let Y=$.split(`
156
+ `)[0]||"";if(Y.length<=Q)return Y;return`${Y.slice(0,Q)}...`}function p5($){if(!$)return 0;return $.split(`
157
+ `).length}var aQ=g5.memo(({content:$,isStreaming:Q=!1,isExpanded:Y})=>{let J=A0(),Z=_J(()=>p5($),[$]),X=_J(()=>m5($),[$]),K=J.colors.info,U=J.colors.muted;return l1(rQ,{flexDirection:"column",marginBottom:1,children:[l1(rQ,{flexDirection:"row",children:[l1(a$,{color:K,children:Y?"v":">"},void 0,!1,void 0,this),l1(a$,{children:" "},void 0,!1,void 0,this),l1(a$,{color:U,children:["Thinking",Q?"...":` (${Z} lines)`]},void 0,!0,void 0,this),!Y&&!Q&&X&&l1(a$,{color:U,children:[" - ",X]},void 0,!0,void 0,this),l1(a$,{color:U,dimColor:!0,children:[" ","[Ctrl+T]"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Y&&$&&l1(rQ,{marginLeft:2,marginTop:1,borderStyle:"round",borderColor:"gray",paddingX:1,paddingY:0,children:l1(a$,{color:U,children:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});aQ.displayName="ThinkingBlock";import{jsxDEV as a0}from"react/jsx-dev-runtime";var FJ=u5.memo(()=>{let $=O4(),Q=j4(),Y=h4(),J=E4(),Z=D$(),X=y4(),K=T4(),U=D2(),G=D4(),q=V4(),H=z4(),O=m4(),N=g4(),z=$$(),B=QJ(),{stdout:_}=x5(),P=n1(),[b,F]=oQ(null),[f,I]=oQ([]),[L,C]=oQ(new Set),w=Z$(N),y=Z$(null),k=Z$(0),T=Z$(0),W=Z$(new Set),S=Z$(new Set),h=Z$([]),o=Z$(null);d1(()=>{if(w.current!==N){if(v1())u1();if(_)_.write(R8.clearTerminal);P.incrementClearCount(),w.current=N}},[N,_,P]);let d=$,a=J;d1(()=>{if(!J||Z){o.current=null;return}if(o.current===J)return;if(o.current=J,v1())u1();if(_)_.write(R8.eraseScreen+R8.cursorTo(0,0));W.current=new Set,S.current=new Set(d.filter((D)=>D.role==="tool").map((D)=>D.id)),y.current=null,k.current=0,T.current=0,h.current=[],I([]),C(new Set),P.incrementClearCount(),P.clearFinalizingStreamingMessageId()},[J,Z,_,P,d]);let l=Q??J;d1(()=>{if(v1())u1();y.current=null,k.current=0,T.current=0,W.current=new Set,S.current=new Set(d.filter((D)=>D.role==="tool").map((D)=>D.id)),h.current=[],I([]),C(new Set)},[H]),d1(()=>{if(!l)return;if(y.current===l)return;y.current=l,k.current=0,T.current=0,S.current=new Set(d.filter((D)=>D.role==="tool").map((D)=>D.id)),h.current=[],I([])},[l,d]),d1(()=>{if(!l)return;let D=nQ(l);if(!D||D.length<=k.current)return;let E=D.slice(k.current);k.current=D.length;let m=E,n=h.current;if(n.length>0)if(m.some((c0)=>c0.type!=="empty"))m=[...n,...m],h.current=[];else{h.current=[...n,...m];return}let $0=m.length;while($0>0&&m[$0-1].type==="empty")$0-=1;if($0!==m.length)h.current=m.slice($0),m=m.slice(0,$0);if(m.length===0)return;let L0=T.current;T.current+=1;let I0=L0>0;if(v1())u1();C((c0)=>{if(!l||c0.has(l))return c0;let h0=new Set(c0);return h0.add(l),h0}),I((c0)=>[...c0,a0(Y$,{flexDirection:"column",children:a0(k1,{content:"",role:"assistant",terminalWidth:z,isPending:!1,hidePrefix:I0,noMargin:!0,blocksOverride:m,renderCodeBlocksAsPlainText:!1},void 0,!1,void 0,this)},`streaming-${l}-${L0}`,!1,void 0,this)])},[l,Y.version,z,H]),d1(()=>{if(!l)return;let D=S.current,E=d.filter((m)=>m.role==="tool"&&!D.has(m.id)&&!W.current.has(m.id));if(E.length===0)return;if(v1())u1();for(let m of E)W.current.add(m.id);I((m)=>[...m,...E.map((n)=>a0(Y$,{flexDirection:"column",children:a0(k1,{content:n.content,role:n.role,terminalWidth:z,metadata:n.metadata,isPending:!1,messageId:n.id},void 0,!1,void 0,this)},`streaming-tool-${n.id}`,!1,void 0,this))])},[l,d,z]),d1(()=>{if(!l){if(v1())u1();return}if(!v1())ZJ(z,B);else XJ(z,B);let D=NJ(l);if(!D||D.lines.length===0)return;let m=Math.max(1,B-8),n=Math.max(0,D.lines.length-m),$0=D.lines.slice(-m),L0=(nQ(l)?.length??0)>0;KJ($0,n,D.mode,L0)},[l,Y.version,B,z]),d1(()=>{if(!l&&v1())u1()},[l]),d1(()=>{if(b===null&&d.length>O){if(F(d.length),v1())u1();if(_)_.write(R8.clearTerminal);P.incrementClearCount()}},[d.length,O,b,_,P]);let R=iQ(()=>{return X.some((D)=>D.status==="pending"||D.status==="in_progress")},[X]),M=N?0:b??0,A=M,v=iQ(()=>{let D=[];if(D.push(a0(qJ,{},"header",!1,void 0,this)),A>0)D.push(a0(lQ,{collapsedCount:A},"collapsed-summary",!1,void 0,this));for(let E=M;E<d.length;E++){let m=d[E];if(a&&m.id===a)continue;if(m.role==="tool"&&W.current.has(m.id))continue;if(m.role==="assistant"&&L.has(m.id))continue;D.push(a0(Y$,{flexDirection:"column",children:a0(k1,{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 D},[d,M,A,z,a,L]),j=iQ(()=>f.length>0?[...v,...f]:v,[v,f]);return a0(Y$,{flexDirection:"column",paddingX:2,children:a0(Y$,{flexDirection:"column",children:[a0(c5,{items:j,children:(D)=>D},H,!1,void 0,this),G&&a0(Y$,{marginBottom:1,children:a0(aQ,{content:G,isStreaming:Z,isExpanded:q},void 0,!1,void 0,this)},void 0,!1,void 0,this),K&&R&&a0(Y$,{marginTop:1,children:a0(zJ,{tasks:X,visible:!0,compact:!1},void 0,!1,void 0,this)},void 0,!1,void 0,this),U.map((D,E)=>a0(Y$,{flexDirection:"column",children:a0(k1,{content:D.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 M8,useMount as l5}from"ahooks";import{Box as B1,Text as W0,useFocus as d5,useFocusManager as r5,useInput as a5}from"ink";import i5 from"ink-select-input";import{memo as o5,useMemo as n5,useState as I8}from"react";import{jsxDEV as J0,Fragment as e5}from"react/jsx-dev-runtime";var t5=({isSelected:$})=>J0(B1,{marginRight:1,children:J0(W0,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),s5=({isSelected:$,label:Q})=>J0(W0,{bold:$,color:$?"yellow":void 0,children:Q},void 0,!1,void 0,this),WJ=o5(({onClose:$,onEdit:Q})=>{let Y=C4(),J=v2()??"",{isFocused:Z}=d5({id:"model-selector"}),X=r5(),[K,U]=I8(""),[G,q]=I8(!1),[H,O]=I8(null),N=S0(!1),[z]=I8(()=>{let w=process.stdout?.columns||80;return Math.max(20,w-8)});l5(()=>{if(X?.focus("model-selector"),Y.length>0)U(Y[0].id)}),a5((w,y)=>{if(G)return;if(y.ctrl&&w==="c"||y.meta&&w==="c"){N();return}if(y.escape){$();return}if(!Z)return;if(w==="d"||w==="D"){_();return}if((w==="e"||w==="E")&&Q)P()},{isActive:!0});let B=M8(async(w)=>{if(G)return;let y=w.value;if(y===J){$();return}q(!0),O(null);try{await m0().setCurrentModel(y),$()}catch(k){O(k.message),q(!1)}}),_=M8(async()=>{if(G||K===J)return;q(!0),O(null);try{if(await m0().removeModel(K),Y.length<=1)$()}catch(w){O(w.message)}finally{q(!1)}}),P=M8(()=>{if(G||!Q)return;let w=Y.find((y)=>y.id===K);if(!w)return;Q(w)}),b=M8((w)=>{U(w.value)}),F=n5(()=>{return Y.find((w)=>w.id===K)},[Y,K]),f=F?T8()?.modelProviders[F.provider]:void 0,I=Y.map((w)=>{let y=w.id===J?" (当前)":"";return{label:tQ(w)+y,value:w.id}}),L=K===J;return J0(B1,{flexDirection:"column",borderStyle:"round",borderColor:"gray",padding:1,width:"100%",children:[J0(B1,{flexDirection:"row",justifyContent:"space-between",marginBottom:1,children:[J0(W0,{bold:!0,color:"cyan",children:"模型管理"},void 0,!1,void 0,this),J0(W0,{dimColor:!0,children:[G?"处理中...":L?"Enter=关闭 • E=编辑 • Esc=取消":"Enter=切换 • D=删除 • E=编辑 • Esc=取消"," • Ctrl+C=退出"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),J0(B1,{flexDirection:"row",children:[J0(B1,{flexDirection:"column",flexGrow:2,marginRight:2,borderStyle:"single",borderColor:"gray",padding:1,children:[J0(W0,{dimColor:!0,children:["已配置模型 (",Y.length,")"]},void 0,!0,void 0,this),J0(B1,{marginTop:1,children:J0(i5,{items:I,onSelect:B,onHighlight:b,indicatorComponent:t5,itemComponent:s5},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),J0(B1,{flexDirection:"column",flexGrow:3,borderStyle:"single",borderColor:"gray",padding:1,children:[J0(W0,{dimColor:!0,children:"模型详情"},void 0,!1,void 0,this),J0(B1,{marginY:1,children:J0(W0,{color:L?"green":"yellow",children:L?"* 当前使用":"* 可切换"},void 0,!1,void 0,this)},void 0,!1,void 0,this),F?J0(B1,{flexDirection:"column",children:[J0(W0,{children:[J0(W0,{dimColor:!0,children:"名称: "},void 0,!1,void 0,this),J0(W0,{bold:!0,color:"cyan",children:tQ(F)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),J0(W0,{children:[J0(W0,{dimColor:!0,children:"Provider: "},void 0,!1,void 0,this),J0(W0,{bold:!0,children:f?.name??F.provider},void 0,!1,void 0,this)]},void 0,!0,void 0,this),f&&J0(e5,{children:[J0(W0,{children:[J0(W0,{dimColor:!0,children:"Channel ID: "},void 0,!1,void 0,this),J0(W0,{children:F.provider},void 0,!1,void 0,this)]},void 0,!0,void 0,this),J0(W0,{children:[J0(W0,{dimColor:!0,children:"Wire API: "},void 0,!1,void 0,this),J0(W0,{children:f.wireApi},void 0,!1,void 0,this)]},void 0,!0,void 0,this),J0(W0,{children:[J0(W0,{dimColor:!0,children:"Endpoint: "},void 0,!1,void 0,this),J0(W0,{color:"blueBright",children:f.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),J0(W0,{children:[J0(W0,{dimColor:!0,children:"Model: "},void 0,!1,void 0,this),J0(W0,{bold:!0,children:F.model},void 0,!1,void 0,this)]},void 0,!0,void 0,this),F.overrides?.baseUrl&&J0(W0,{children:[J0(W0,{dimColor:!0,children:"Base URL override: "},void 0,!1,void 0,this),J0(W0,{color:"blueBright",children:F.overrides.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this),J0(W0,{children:[J0(W0,{dimColor:!0,children:"Context Window: "},void 0,!1,void 0,this),J0(W0,{children:g1().resolveConfig(F).contextWindow},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this):J0(W0,{dimColor:!0,children:"请选择一个模型查看详情"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),H&&J0(B1,{marginTop:1,children:J0(W0,{color:"red",children:H},void 0,!1,void 0,this)},void 0,!1,void 0,this),J0(B1,{justifyContent:"center",marginTop:1,children:J0(W0,{dimColor:!0,children:"─".repeat(z)},void 0,!1,void 0,this)},void 0,!1,void 0,this),J0(B1,{justifyContent:"center",children:J0(W0,{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 sQ}from"ahooks";import{Box as bX,Text as eQ,useInput as AX}from"ink";import{useState as I$}from"react";import{Box as R$,Text as r1,useInput as $X}from"ink";import QX from"ink-text-input";import{jsxDEV as i0}from"react/jsx-dev-runtime";var HJ=({provider:$,value:Q,onChange:Y,onSubmit:J,onCancel:Z,error:X})=>{return $X((K,U)=>{if(U.escape)Z()}),i0(R$,{flexDirection:"column",children:[i0(R$,{marginBottom:1,children:i0(r1,{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(r1,{children:["Provider: ",i0(r1,{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(r1,{dimColor:!0,children:"API 密钥将存储在 ~/.blade/auth.json(权限 600),不会写入模型配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i0(R$,{children:[i0(r1,{bold:!0,color:"cyan",children:[">"," "]},void 0,!0,void 0,this),i0(QX,{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(r1,{color:"red",children:X},void 0,!1,void 0,this)},void 0,!1,void 0,this),i0(R$,{marginTop:1,children:i0(r1,{dimColor:!0,children:["输入完成后按 ",i0(r1,{bold:!0,children:"Enter"},void 0,!1,void 0,this),",",i0(r1,{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 C8,Text as X$,useInput as JX}from"ink";import YX from"ink-text-input";import{useState as f8}from"react";import{jsxDEV as N1}from"react/jsx-dev-runtime";var k8=["id","name","baseUrl","model"];function LJ($){switch($){case"id":return"Channel ID";case"name":return"Channel name";case"baseUrl":return"Base URL";case"model":return"Model ID"}}function ZX($,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 XX($,Q){let Y=$.id.trim(),J={name:$.name.trim()||Y,baseUrl:$.baseUrl.trim(),wireApi:Q},Z=wJ(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 bJ=({wireApi:$,initialConfig:Q,onSubmit:Y,onCancel:J})=>{let Z={id:Q?.provider??"",name:Q?.modelProvider?.name??"",baseUrl:Q?.modelProvider?.baseUrl??"",model:Q?.model??""},[X,K]=f8(Q?3:0),[U,G]=f8(Q?.model??""),[q,H]=f8(Z),[O,N]=f8(),z=k8[X];JX((_,P)=>{if(!P.escape)return;if(N(void 0),X===0){J();return}let b=X-1,F=k8[b];K(b),G(q[F])});let B=(_)=>{let P=_.trim();if(z==="id"&&!BJ.test(P)){N("Channel ID 必须以小写字母开头,且仅包含小写字母、数字、.、_ 或 -");return}if(z==="baseUrl")try{let F=new URL(P);if(!["http:","https:"].includes(F.protocol))throw Error()}catch{N("Base URL 必须是绝对 HTTP(S) URL");return}if(z==="model"&&!P){N("Model ID 不能为空");return}let b={...q,[z]:z==="name"&&!P?q.id:P};if(H(b),N(void 0),X===k8.length-1){try{Y(XX(b,$))}catch(F){N(F instanceof Error?F.message:"渠道配置无效")}return}K(X+1),G("")};return N1(C8,{flexDirection:"column",children:[N1(C8,{marginBottom:1,children:N1(X$,{bold:!0,color:"blue",children:"配置自定义 Provider 渠道"},void 0,!1,void 0,this)},void 0,!1,void 0,this),N1(X$,{dimColor:!0,children:["Protocol:"," ",$==="anthropic-messages"?"Anthropic Messages":"OpenAI Chat Completions"]},void 0,!0,void 0,this),k8.slice(0,X).map((_)=>N1(X$,{children:[LJ(_),": ",N1(X$,{color:"cyan",children:q[_]},void 0,!1,void 0,this)]},_,!0,void 0,this)),N1(C8,{marginTop:1,children:[N1(X$,{bold:!0,children:[LJ(z),": "]},void 0,!0,void 0,this),N1(YX,{value:U,onChange:(_)=>{G(_),N(void 0)},onSubmit:B,placeholder:ZX(z,$,q.id)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z==="name"&&N1(X$,{dimColor:!0,children:"留空使用 Channel ID"},void 0,!1,void 0,this),O&&N1(X$,{color:"red",children:O},void 0,!1,void 0,this),N1(C8,{marginTop:1,children:N1(X$,{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 yJ,useState as i$}from"react";var RJ=()=>{let[$,Q]=i$([]),[Y,J]=i$(!0),[Z,X]=i$(null);return yJ(()=>{(async()=>{try{Q(await AJ())}catch(U){X(U instanceof Error?U.message:"加载 Provider 列表失败")}finally{J(!1)}})()},[]),{providers:$,isLoading:Y,error:Z}},MJ=($)=>{let[Q,Y]=i$([]),[J,Z]=i$(!1),[X,K]=i$(null);return yJ(()=>{if(!$){Y([]);return}(async()=>{Z(!0),K(null);try{Y(await PJ($))}catch(G){K(G instanceof Error?G.message:"加载模型列表失败")}finally{Z(!1)}})()},[$]),{models:Q,isLoading:J,error:X}};import{Box as a1,Text as M1,useInput as KX}from"ink";import GX from"ink-select-input";import UX from"ink-text-input";import{useMemo as IJ,useState as qX}from"react";import{jsxDEV as E0,Fragment as NX}from"react/jsx-dev-runtime";var OX=({isSelected:$})=>E0(a1,{marginRight:1,children:E0(M1,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),zX=($)=>{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(" ")},_X=({isSelected:$,label:Q})=>E0(M1,{bold:$,color:$?"yellow":void 0,children:Q},void 0,!1,void 0,this),TJ=({provider:$,models:Q,isLoading:Y,error:J,onSelect:Z,onCancel:X})=>{let[K,U]=qX("");KX((H,O)=>{if(O.escape)if(K)U("");else X()});let G=IJ(()=>{if(!K)return Q;let H=K.toLowerCase();return Q.filter((O)=>O.name.toLowerCase().includes(H)||O.id.toLowerCase().includes(H))},[Q,K]),q=IJ(()=>G.map((H)=>({key:H.id,label:zX(H),value:H})),[G]);if(Y)return E0(a1,{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(a1,{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(a1,{flexDirection:"column",children:[E0(a1,{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(a1,{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(NX,{children:[E0(a1,{marginBottom:1,children:[E0(M1,{color:"cyan",children:"> "},void 0,!1,void 0,this),E0(UX,{value:K,onChange:U,placeholder:`搜索 ${Q.length} 个模型...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E0(a1,{marginBottom:1,children:E0(M1,{dimColor:!0,children:"模型元数据来自内置 catalog"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E0(a1,{flexDirection:"column",height:12,children:E0(GX,{items:q,onSelect:(H)=>Z(H.value),indicatorComponent:OX,itemComponent:_X,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),G.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 M$,Text as K$,useInput as FX}from"ink";import WX from"ink-select-input";import HX from"ink-text-input";import{useMemo as CJ,useState as LX}from"react";import{jsxDEV as o0}from"react/jsx-dev-runtime";var BX=({isSelected:$})=>o0(M$,{marginRight:1,children:o0(K$,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),wX=({isSelected:$,label:Q})=>o0(K$,{bold:$,color:$?"yellow":void 0,children:Q},void 0,!1,void 0,this),fJ=({providers:$,isLoading:Q,error:Y,onSelect:J,onCancel:Z})=>{let[X,K]=LX("");FX((q,H)=>{if(H.escape)if(X)K("");else Z()});let U=CJ(()=>{if(!X)return $;let q=X.toLowerCase();return $.filter((H)=>H.name.toLowerCase().includes(q)||H.id.toLowerCase().includes(q))},[$,X]),G=CJ(()=>U.map((q)=>({key:q.id,label:`${q.name} - ${q.modelCount} models${q.configured?" [configured]":""}`,value:q})),[U]);if(Q)return o0(M$,{flexDirection:"column",children:o0(K$,{color:"yellow",children:"正在加载 Provider 列表..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Y)return o0(M$,{flexDirection:"column",children:[o0(K$,{color:"red",children:Y},void 0,!1,void 0,this),o0(K$,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return o0(M$,{flexDirection:"column",children:[o0(M$,{marginBottom:1,children:o0(K$,{bold:!0,color:"blue",children:"Step 1: 选择 API 提供商"},void 0,!1,void 0,this)},void 0,!1,void 0,this),o0(M$,{marginBottom:1,children:[o0(K$,{color:"cyan",children:"> "},void 0,!1,void 0,this),o0(HX,{value:X,onChange:K,placeholder:`搜索 ${$.length} 个 Provider...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),o0(M$,{flexDirection:"column",height:12,children:o0(WX,{items:G,onSelect:(q)=>J(q.value),indicatorComponent:BX,itemComponent:wX,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),U.length===0&&o0(K$,{color:"yellow",children:"未找到匹配的 Provider,按 Esc 清除搜索"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};function kJ($){if($==="custom")return"provider";if($==="model")return"provider";if($==="credential")return"model";return}import{jsxDEV as G$}from"react/jsx-dev-runtime";var $4=({mode:$,initialConfig:Q,modelId:Y,onComplete:J,onCancel:Z})=>{let[X,K]=I$("provider"),[U,G]=I$(),[q,H]=I$(),[O,N]=I$(),[z,B]=I$(""),[_,P]=I$(),[b,F]=I$(!1),f=RJ(),I=MJ(U?.id),L=S0(!1);AX((k,T)=>{if(T.ctrl&&k==="c"||T.meta&&k==="c")$==="setup"?L():Z()});let C=sQ(async(k)=>{if(!U)return;let T=O??(q?{provider:U.id,model:q.id,displayName:Q?.displayName}:void 0);if(!T)return;F(!0),P(void 0);try{if(T.modelProvider)g1().registerModelProvider(T.provider,T.modelProvider,[T.model]);if(k?.trim())await g1().setApiKey(T.provider,k.trim());let W={displayName:T.displayName,provider:T.provider,model:T.model,overrides:T.overrides};if($==="setup")await J(T);else if($==="add"){let S=T.modelProvider?await m0().addModelWithProvider(W,T.modelProvider):await m0().addModel(W);await m0().setCurrentModel(S.id),await J(T)}else if(Y){if(T.modelProvider)await m0().updateModelWithProvider(Y,W,T.modelProvider);else await m0().updateModel(Y,W);await J(T)}}catch(W){if(T.modelProvider){await g1().credentials.delete(T.provider);let S=T8();g1().configureModelProviders(S?.modelProviders??{},S?.models??[])}P(W instanceof Error?W.message:"保存配置失败"),F(!1)}}),w=sQ((k)=>{if(H(k),U?.configured)C();else if(U?.supportsApiKey)K("credential");else P(`${U?.name??"Provider"} 需要 OAuth 或环境凭证,请先在外部完成认证`)}),y=sQ(()=>{if(P(void 0),X==="credential"&&O){K("custom");return}let k=kJ(X);if(k)K(k)});return G$(bX,{flexDirection:"column",padding:1,children:[G$(eQ,{bold:!0,color:"blue",children:$==="edit"?"编辑模型":"添加模型"},void 0,!1,void 0,this),X==="provider"&&G$(fJ,{...f,onSelect:(k)=>{G(k),H(void 0),N(void 0),K(k.factoryWireApi?"custom":"model")},onCancel:$==="setup"?()=>{return}:Z},void 0,!1,void 0,this),X==="custom"&&U?.factoryWireApi&&G$(bJ,{wireApi:U.factoryWireApi,initialConfig:O,onSubmit:(k)=>{N(k),K("credential")},onCancel:y},void 0,!1,void 0,this),X==="model"&&U&&G$(TJ,{provider:U,...I,onSelect:w,onCancel:y},void 0,!1,void 0,this),X==="credential"&&U&&G$(HJ,{provider:U,value:z,onChange:B,onSubmit:()=>void C(z),onCancel:y,error:_},void 0,!1,void 0,this),b&&G$(eQ,{color:"yellow",children:"正在保存配置..."},void 0,!1,void 0,this),_&&X!=="credential"&&G$(eQ,{color:"red",children:_},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as B2}from"ahooks";import{promises as VJ}from"fs";import{Box as F1,Text as V0,useInput as PX}from"ink";import SJ from"ink-select-input";import yX from"ink-text-input";import RX from"os";import S8 from"path";import{useEffect as MX,useMemo as v8,useRef as IX,useState as U$}from"react";import{jsxDEV as O0}from"react/jsx-dev-runtime";var w2=[{key:"allow",label:"Allow"},{key:"ask",label:"Ask"},{key:"deny",label:"Deny"},{key:"info",label:"Info"}],TX={allow:"Add a new rule...",ask:"Add a new rule...",deny:"Add a new rule..."},CX={allow:"Allow permission rules",ask:"Ask permission rules",deny:"Deny permission rules"},vJ={project:"[项目共享配置]",global:"[用户全局配置]",local:"[本地配置]"},fX=["project","global","local"],kX={allow:[],ask:[],deny:[]},SX={localExists:!1,projectExists:!1,globalExists:!1},DJ={allow:[],ask:[],deny:[]};function vX($){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 DX($){try{let Q=await VJ.readFile($,"utf-8"),Y=JSON.parse(Q);return{exists:!0,raw:Y,permissions:vX(Y)}}catch(Q){if(Q.code==="ENOENT")return{exists:!1,raw:{},permissions:{...DJ}};return console.warn(`[PermissionsManager] Failed to read ${$}:`,Q),{exists:!0,raw:{},permissions:{...DJ}}}}function VX($,Q){let Y=$.padEnd(32," "),J=Q==="local"?`${vJ[Q]} <- 可删除`:vJ[Q];return`${Y} ${J}`}var jJ=({onClose:$})=>{let Y=s0()==="permissions-manager",J=S0(!1),[Z,X]=U$(0),K=w2[Z].key,[U,G]=U$(kX),[q,H]=U$(SX),[O,N]=U$(!0),[z,B]=U$("list"),[_,P]=U$(""),[b,F]=U$(null),[f,I]=U$(null),L=IX(!1),C=v8(()=>S8.join(u0(),".blade","settings.local.json"),[]),w=v8(()=>S8.join(u0(),".blade","settings.json"),[]),y=v8(()=>S8.join(RX.homedir(),".blade","settings.json"),[]),k=B2(async()=>{N(!0);let D=await Promise.all([{source:"local",path:C},{source:"project",path:w},{source:"global",path:y}].map(async({source:$0,path:L0})=>{let I0=await DX(L0);return{source:$0,path:L0,...I0}})),E={localExists:D.find(($0)=>$0.source==="local")?.exists??!1,projectExists:D.find(($0)=>$0.source==="project")?.exists??!1,globalExists:D.find(($0)=>$0.source==="global")?.exists??!1};H(E);let m={allow:[],ask:[],deny:[]},n=Object.fromEntries(D.map(($0)=>[$0.source,$0]));["allow","ask","deny"].forEach(($0)=>{fX.forEach((L0)=>{(n[L0]?.permissions[$0]??[]).forEach((c0,h0)=>{let F$={key:`${L0}:${h0}:${c0}`,rule:c0,source:L0};m[$0].push(F$)})})}),G(m),N(!1)});MX(()=>{k()},[k]);let T=B2(async(j,D)=>{try{let E=S8.join(u0(),".blade","settings.local.json"),m={allow:[],ask:[],deny:[]};try{let $0=await VJ.readFile(E,"utf-8"),I0=JSON.parse($0).permissions||{};m={allow:Array.isArray(I0.allow)?I0.allow:[],ask:Array.isArray(I0.ask)?I0.ask:[],deny:Array.isArray(I0.deny)?I0.deny:[]}}catch($0){}let n=D(m);await m0().updateConfig({permissions:n},{scope:"local",immediate:!0}),await k()}catch(E){throw console.error("[PermissionsManager] 修改权限规则失败:",E),E}});PX((j,D)=>{if(D.ctrl&&j==="c"||D.meta&&j==="c"){J();return}if(z==="locked"){if(L.current){L.current=!1;return}B("list"),F(null),I(null);return}if(D.escape){if(z==="list"||K==="info")$();else B("list"),P(""),F(null),I(null);return}if(z==="list"){if(D.tab&&D.shift)X((E)=>(E-1+w2.length)%w2.length);else if(D.tab)X((E)=>(E+1)%w2.length);else if(j?.toLowerCase()==="q")$()}},{isActive:Y});let W=B2((j)=>{let D=j.value;if(K==="info")return;if(D.type==="add"){B("add"),P(""),I(null);return}if(D.entry.source!=="local"){B("locked"),L.current=!0,F({tab:K,entry:D.entry}),I({type:"error",text:D.entry.source==="project"?"此规则定义在项目共享配置中,无法在此删除。":"此规则来自用户全局配置,无法在此删除。"});return}B("confirm-delete"),F({tab:K,entry:D.entry}),I(null)}),S=B2(async()=>{if(K==="info")return;let j=_.trim();if(!j){I({type:"error",text:"Permission rule 不能为空"});return}if(U[K].map((E)=>E.rule).includes(j)){I({type:"error",text:"该规则已存在"});return}try{await T(K,(E)=>{let m={allow:[...E.allow],ask:[...E.ask],deny:[...E.deny]};return m[K]=[...new Set([...E[K],j])],m}),B("list"),P(""),I({type:"success",text:"已添加本地权限规则"})}catch(E){I({type:"error",text:`保存失败: ${E instanceof Error?E.message:"未知错误"}`})}}),h=B2(async()=>{if(!b)return;let{tab:j,entry:D}=b;try{await T(j,(E)=>{let m={allow:[...E.allow],ask:[...E.ask],deny:[...E.deny]};return m[j]=E[j].filter((n)=>n!==D.rule),m}),B("list"),F(null),I({type:"success",text:"已删除本地权限规则"})}catch(E){I({type:"error",text:`删除失败: ${E instanceof Error?E.message:"未知错误"}`})}}),o=v8(()=>{if(K==="info")return[];let j=K;return[{key:"add-new-rule",label:`› ${TX[j]}`,value:{type:"add"}},...U[j].map((E)=>({key:E.key,label:VX(E.rule,E.source),value:{type:"rule",entry:E}}))]},[K,U]),d=()=>O0(F1,{marginBottom:1,children:w2.map((j,D)=>O0(F1,{marginRight:2,children:O0(V0,{color:D===Z?"yellow":"gray",children:["[",j.label,"]"]},void 0,!0,void 0,this)},j.key,!1,void 0,this))},void 0,!1,void 0,this),a=()=>O0(F1,{flexDirection:"column",gap:1,children:[O0(V0,{children:"配置文件优先级(从高到低):"},void 0,!1,void 0,this),O0(F1,{flexDirection:"column",marginLeft:2,children:[O0(V0,{children:["1. .blade/settings.local.json (本地配置,不提交 Git)"," ",q.localExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),O0(V0,{children:["2. .blade/settings.json (项目配置,提交 Git)"," ",q.projectExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),O0(V0,{children:["3. ~/.blade/settings.json (用户全局配置)"," ",q.globalExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),O0(V0,{children:"说明:"},void 0,!1,void 0,this),O0(F1,{flexDirection:"column",marginLeft:2,children:[O0(V0,{children:"- /permissions 命令只管理本地配置 (.blade/settings.local.json)"},void 0,!1,void 0,this),O0(V0,{children:"- 修改全局或项目配置请直接编辑对应文件"},void 0,!1,void 0,this),O0(V0,{children:"- 本地配置不会提交到 Git"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),l=(j)=>O0(F1,{flexDirection:"column",gap:1,children:[O0(V0,{bold:!0,children:CX[j]},void 0,!1,void 0,this),O0(V0,{children:"Permission rules are a tool name, optionally followed by a specifier in parentheses."},void 0,!1,void 0,this),O0(V0,{color:"gray",children:"例如: WebFetch 或 Bash(ls:*)"},void 0,!1,void 0,this),O0(F1,{marginTop:1,children:O0(yX,{value:_,onChange:P,onSubmit:S},void 0,!1,void 0,this)},void 0,!1,void 0,this),O0(V0,{color:"gray",children:"Enter 提交 · Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),R=(j,D)=>O0(F1,{flexDirection:"column",gap:1,children:[O0(V0,{bold:!0,children:["Delete ",j," permission rule?"]},void 0,!0,void 0,this),O0(V0,{children:D.rule},void 0,!1,void 0,this),O0(V0,{color:"gray",children:"From project local settings"},void 0,!1,void 0,this),O0(V0,{children:"Are you sure you want to delete this permission rule?"},void 0,!1,void 0,this),O0(SJ,{items:[{label:"Yes",value:"yes"},{label:"No",value:"no"}],onSelect:(E)=>{if(E.value==="yes")h();else B("list"),F(null)}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),M=(j)=>O0(F1,{flexDirection:"column",gap:1,children:[O0(V0,{bold:!0,children:"Cannot delete this rule"},void 0,!1,void 0,this),O0(V0,{children:j.rule},void 0,!1,void 0,this),O0(V0,{color:"gray",children:j.source==="project"?"This rule is defined in .blade/settings.json. 请手动编辑该文件以移除规则。":"This rule is defined in ~/.blade/settings.json. 请手动编辑该文件以移除规则。"},void 0,!1,void 0,this),O0(V0,{color:"gray",children:"按任意键继续"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),A=(j)=>O0(SJ,{items:o,isFocused:z==="list",onSelect:W},void 0,!1,void 0,this),v=()=>{if(O)return O0(V0,{children:"加载中..."},void 0,!1,void 0,this);if(K==="info")return a();if(z==="add")return l(K);if(z==="confirm-delete"&&b)return R(b.tab,b.entry);if(z==="locked"&&b)return M(b.entry);return A(K)};return O0(F1,{flexDirection:"column",borderStyle:"round",borderColor:Y?"cyan":"gray",padding:1,width:80,children:[O0(V0,{color:"cyan",bold:!0,children:"权限管理器"},void 0,!1,void 0,this),d(),O0(F1,{flexDirection:"column",gap:1,children:v()},void 0,!1,void 0,this),f&&O0(F1,{marginTop:1,children:O0(V0,{color:f.type==="success"?"green":"red",children:f.text},void 0,!1,void 0,this)},void 0,!1,void 0,this),O0(F1,{marginTop:1,children:O0(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 X0,useInput as jX}from"ink";import{useEffect as hX,useState as T$}from"react";import{jsxDEV as x}from"react/jsx-dev-runtime";var Q4=["local","project","global"];function xJ({workspaceRoot:$,onCancel:Q}){let Y=EJ($),J=Y.getAll(),[Z,X]=T$(0),[K,U]=T$(!1),[G,q]=T$(""),[H,O]=T$(null),[N,z]=T$("local"),[B,_]=T$(null),[P,b]=T$(0),F=Y.getBySource(),f=Y.getStats(),I=Y.getSourcePolicy(),L=S0(!1,Q);hX(()=>{let W=!0;return hJ.getInstance().loadWorkspacePluginSettingsResolution(Y.getWorkspaceRoot()).then((S)=>{if(W)_(S.settings)}).catch((S)=>{if(W)q(S instanceof Error?S.message:"无法读取插件作用域配置")}),()=>{W=!1}},[Y,P]);let C=()=>{z((W)=>{let S=Q4.indexOf(W);return Q4[(S+1)%Q4.length]}),O(null)},w=async()=>{let W=J[Z];if(!W||K)return;if(W.source==="cli"){q(`${W.manifest.name} 由 --plugin-dir 管理,不能持久化切换`);return}if(W.status==="error"){q(W.error??`${W.manifest.name} 当前不可用`);return}U(!0),q("");try{let S=await gJ(Y.getWorkspaceRoot(),W.manifest.name,W.status!=="active",N);q(S.effectiveEnabled?`已启用 ${W.manifest.name} · 生效层级 ${S.effectiveScope}`:`已禁用 ${W.manifest.name} · 生效层级 ${S.effectiveScope}`),b((h)=>h+1)}catch(S){q(S instanceof Error?S.message:String(S))}finally{U(!1)}},y=async()=>{if(K)return;U(!0),q("");try{await mJ(Y.getWorkspaceRoot()),X(0),q("插件列表已刷新"),b((W)=>W+1)}catch(W){q(W instanceof Error?W.message:String(W))}finally{U(!1)}},k=async()=>{let W=J[Z];if(!W||K)return;if(!W.installation){q(`${W.manifest.name} 不是 Blade 受管安装,不能自动更新`);return}U(!0),O(null),q("");try{let{result:S}=await pJ(Y.getWorkspaceRoot(),W.manifest.name,{trusted:!0});if(!S.success)throw Error(S.error);q(S.changed?`已更新 ${W.manifest.name} 到 ${S.installation?.revision}`:`${W.manifest.name} 已是最新版本`),b((h)=>h+1)}catch(S){q(S instanceof Error?S.message:String(S))}finally{U(!1)}},T=async()=>{let W=J[Z];if(!W||K)return;if(!W.installation){q(`${W.manifest.name} 不是 Blade 受管安装,不能自动卸载`);return}if(H!==W.manifest.name){O(W.manifest.name),q(`再次按 x 确认卸载 ${W.manifest.name}`);return}U(!0),q("");try{let{result:S}=await cJ(Y.getWorkspaceRoot(),W.manifest.name,!0);if(!S.success)throw Error(S.error);O(null),X(0),q(`已卸载 ${W.manifest.name}`),b((h)=>h+1)}catch(S){q(S instanceof Error?S.message:String(S))}finally{U(!1)}};if(jX((W,S)=>{if(S.escape)Q?.();else if(S.ctrl&&W==="c"||S.meta&&W==="c")L();else if((S.upArrow||W==="k")&&J.length>0)O(null),X((h)=>(h-1+J.length)%J.length);else if((S.downArrow||W==="j")&&J.length>0)O(null),X((h)=>(h+1)%J.length);else if(W===" "||S.return)w();else if(W==="r")y();else if(W==="s")C();else if(W==="u")k();else if(W==="x")T()}),J.length===0)return x(b0,{flexDirection:"column",paddingY:1,children:[x(b0,{marginBottom:1,children:x(X0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(b0,{paddingLeft:2,children:x(X0,{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(X0,{color:"gray",children:"插件目录位置:"},void 0,!1,void 0,this),x(X0,{color:"gray",dimColor:!0,children:[" ","• ~/.blade/plugins/ - 用户级插件"]},void 0,!0,void 0,this),x(X0,{color:"gray",dimColor:!0,children:[" ","• .blade/plugins/ - 项目级插件"]},void 0,!0,void 0,this),x(X0,{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(X0,{color:"gray",children:"使用 /plugins install <url> 安装新插件"},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(b0,{marginTop:1,children:x(X0,{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(X0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this),x(X0,{color:"gray",children:[" (共 ",f.total," 个插件)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(b0,{paddingLeft:2,marginBottom:1,children:x(X0,{color:"gray",children:["启用: ",f.active," | 禁用: ",f.inactive," | 命令: ",f.commands," | 技能:"," ",f.skills," | 代理: ",f.agents]},void 0,!0,void 0,this)},void 0,!1,void 0,this),x(b0,{paddingLeft:2,marginBottom:1,children:x(X0,{color:"gray",children:["来源策略: ",I.restrictToAllowedSources?"restricted":"open"," | Git SHA: ",I.requireGitCommitSha?"required":"optional"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),x(b0,{paddingLeft:2,marginBottom:1,children:x(X0,{color:"gray",children:["写入层级: ",x(X0,{color:"cyan",children:N},void 0,!1,void 0,this)," · 按 s 切换"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),F.cli.length>0&&x(b0,{flexDirection:"column",marginBottom:1,children:[x(b0,{paddingLeft:1,children:[x(X0,{bold:!0,color:"magenta",children:"CLI 指定"},void 0,!1,void 0,this),x(X0,{color:"gray",children:" (--plugin-dir)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),F.cli.map((W)=>{let S=W.status==="active"?"[on]":"[off]",h=J.indexOf(W)===Z;return x(b0,{flexDirection:"column",paddingLeft:2,children:[x(X0,{children:[x(X0,{bold:!0,color:h?"cyan":"green",children:[h?"› ":" ",S," ",W.manifest.name]},void 0,!0,void 0,this),x(X0,{color:"gray",children:[" v",W.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(b0,{paddingLeft:2,children:x(X0,{color:"gray",children:W.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(b0,{paddingLeft:2,children:x(X0,{color:"gray",dimColor:!0,children:"生效层级: invocation"},void 0,!1,void 0,this)},void 0,!1,void 0,this),W.commands.length>0&&x(b0,{paddingLeft:2,children:x(X0,{color:"blue",children:["命令:"," ",W.commands.map((o)=>`/${o.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},W.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),F.project.length>0&&x(b0,{flexDirection:"column",marginBottom:1,children:[x(b0,{paddingLeft:1,children:[x(X0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),x(X0,{color:"gray",children:" (.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),F.project.map((W)=>{let S=W.status==="active"?"[on]":"[off]",h=J.indexOf(W)===Z;return x(b0,{flexDirection:"column",paddingLeft:2,children:[x(X0,{children:[x(X0,{bold:!0,color:h?"cyan":"green",children:[h?"› ":" ",S," ",W.manifest.name]},void 0,!0,void 0,this),x(X0,{color:"gray",children:[" v",W.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(b0,{paddingLeft:2,children:x(X0,{color:"gray",children:W.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(b0,{paddingLeft:2,children:x(X0,{color:"gray",dimColor:!0,children:["生效层级:"," ",B?.[W.manifest.name]?.effectiveScope??"default"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),W.commands.length>0&&x(b0,{paddingLeft:2,children:x(X0,{color:"blue",children:["命令:"," ",W.commands.map((o)=>`/${o.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},W.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),F.user.length>0&&x(b0,{flexDirection:"column",marginBottom:1,children:[x(b0,{paddingLeft:1,children:[x(X0,{bold:!0,color:"cyan",children:"用户级"},void 0,!1,void 0,this),x(X0,{color:"gray",children:" (~/.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),F.user.map((W)=>{let S=W.status==="active"?"[on]":"[off]",h=J.indexOf(W)===Z;return x(b0,{flexDirection:"column",paddingLeft:2,children:[x(X0,{children:[x(X0,{bold:!0,color:h?"cyan":"green",children:[h?"› ":" ",S," ",W.manifest.name]},void 0,!0,void 0,this),x(X0,{color:"gray",children:[" v",W.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(b0,{paddingLeft:2,children:x(X0,{color:"gray",children:W.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(b0,{paddingLeft:2,children:x(X0,{color:"gray",dimColor:!0,children:["生效层级:"," ",B?.[W.manifest.name]?.effectiveScope??"default"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),W.commands.length>0&&x(b0,{paddingLeft:2,children:x(X0,{color:"blue",children:["命令:"," ",W.commands.map((o)=>`/${o.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},W.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),x(b0,{marginTop:1,paddingLeft:2,flexDirection:"column",children:[x(X0,{color:"gray",children:"可用命令:"},void 0,!1,void 0,this),x(X0,{color:"gray",dimColor:!0,children:[" ","• /plugins list - 列出所有插件"]},void 0,!0,void 0,this),x(X0,{color:"gray",dimColor:!0,children:[" ","• /plugins info <name> - 显示插件详情"]},void 0,!0,void 0,this),x(X0,{color:"gray",dimColor:!0,children:[" ","• /plugins install <url> - 安装插件"]},void 0,!0,void 0,this),x(X0,{color:"gray",dimColor:!0,children:[" ","• /plugins enable/disable <name> - 启用/禁用插件"]},void 0,!0,void 0,this),x(X0,{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(X0,{dimColor:!0,children:"↑/↓ 选择 · Space/Enter 启停 · s 切换层级 · u 信任并更新 · x 卸载 · r 刷新 · ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),G&&x(b0,{marginTop:1,children:x(X0,{color:G.includes("失败")?"red":"cyan",children:G},void 0,!1,void 0,this)},void 0,!1,void 0,this),K&&x(X0,{color:"gray",children:"处理中..."},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import{Box as Q1,Text as J1,useInput as uJ,useStdout as EX}from"ink";import gX from"ink-text-input";import J4,{useCallback as b2,useMemo as mX,useState as q$}from"react";import{jsxDEV as H0}from"react/jsx-dev-runtime";var pX=J4.memo(({option:$,index:Q,isSelected:Y,isMultiSelect:J,isHighlighted:Z})=>H0(Q1,{flexDirection:"column",marginBottom:1,children:[H0(J1,{color:Z?"yellow":Y?"green":void 0,bold:Z,children:[J?Y?"(*) ":"( ) ":Z?"> ":" ",Q+1,". ",$.label]},void 0,!0,void 0,this),H0(Q1,{marginLeft:4,children:H0(J1,{color:"gray",children:$.description},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)),cX=J4.memo(({questions:$,answers:Q})=>H0(Q1,{flexDirection:"column",marginBottom:1,children:$.map((Y)=>{let J=Q[Y.header],Z=Array.isArray(J)?J.join(", "):J||"(no answer)";return H0(Q1,{marginBottom:1,children:[H0(J1,{backgroundColor:"blue",color:"white",children:[" ",Y.header," "]},void 0,!0,void 0,this),H0(J1,{color:"green",children:[" ",Z]},void 0,!0,void 0,this)]},Y.header,!0,void 0,this)})},void 0,!1,void 0,this)),lJ=J4.memo(({questions:$,onComplete:Q,onCancel:Y})=>{let{stdout:J}=EX(),Z=J.columns||80,K=s0()==="confirmation-prompt",U=S0(!1),[G,q]=q$("answering"),[H,O]=q$(0),[N,z]=q$({}),[B,_]=q$(0),[P,b]=q$([]),[F,f]=q$(!1),[I,L]=q$(""),[C,w]=q$(0),y=$[H],k=mX(()=>{if(!y)return[];return[...y.options.map((d)=>({label:d.label,value:d.label,description:d.description})),{label:"Type something...",value:"__other__",description:"Enter custom response"}]},[y]),T=b2((d)=>{let a={...N,[y.header]:d};if(z(a),H<$.length-1)O(H+1),_(0),b([]),f(!1),L("");else q("submit"),w(0)},[N,y?.header,H,$.length]),W=b2((d)=>{let a=k[d];if(!a)return;if(a.value==="__other__"){f(!0);return}if(y.multiSelect)b((l)=>l.includes(a.value)?l.filter((R)=>R!==a.value):[...l,a.value]);else T(a.value)},[k,y?.multiSelect,T]),S=b2((d)=>{if(d.trim())T(d.trim())},[T]),h=b2(()=>{q("answering"),O(0),_(0),b([]),f(!1)},[]),o=b2(()=>{Q(N)},[N,Q]);if(uJ((d,a)=>{if(a.ctrl&&d==="c"||a.meta&&d==="c"){U();return}if(F){if(a.escape)f(!1),L("");return}if(a.escape){Y();return}let l=parseInt(d);if(l>=1&&l<=k.length){W(l-1);return}if(a.upArrow){_((R)=>R>0?R-1:k.length-1);return}if(a.downArrow||a.tab){_((R)=>R<k.length-1?R+1:0);return}if(a.return){if(y.multiSelect&&P.length>0)T(P);else W(B);return}if(d===" "&&y.multiSelect){let R=k[B];if(R&&R.value!=="__other__")b((M)=>M.includes(R.value)?M.filter((A)=>A!==R.value):[...M,R.value]);return}},{isActive:K&&G==="answering"&&!F}),uJ((d,a)=>{if(a.ctrl&&d==="c"||a.meta&&d==="c"){U();return}if(a.escape){Y();return}if(a.upArrow||a.downArrow||a.tab){w((l)=>l===0?1:0);return}if(a.return){if(C===0)o();else h();return}if(d.toLowerCase()==="y"){o();return}if(d.toLowerCase()==="e"){h();return}},{isActive:K&&G==="submit"}),G==="submit")return H0(Q1,{flexDirection:"column",borderStyle:"round",borderColor:K?"green":"gray",padding:1,width:Math.min(Z-4,80),children:[H0(Q1,{marginBottom:1,children:H0(J1,{bold:!0,color:"green",children:"[OK] Review Your Answers"},void 0,!1,void 0,this)},void 0,!1,void 0,this),H0(cX,{questions:$,answers:N},void 0,!1,void 0,this),H0(Q1,{flexDirection:"column",marginTop:1,children:[H0(J1,{color:C===0?"yellow":void 0,bold:C===0,children:[C===0?"> ":" ","[Y] Submit answers"]},void 0,!0,void 0,this),H0(J1,{color:C===1?"yellow":void 0,bold:C===1,children:[C===1?"> ":" ","[E] Edit answers"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),H0(Q1,{marginTop:1,children:H0(J1,{color:"gray",children:"Enter to confirm · Up/Down to navigate · Y/E for quick select"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(!y)return null;return H0(Q1,{flexDirection:"column",borderStyle:"round",borderColor:K?"cyan":"gray",padding:1,width:Math.min(Z-4,80),children:[H0(Q1,{marginBottom:1,children:[H0(J1,{backgroundColor:"blue",color:"white",children:[" ",y.header," "]},void 0,!0,void 0,this),H0(J1,{children:[" ",y.question]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),F?H0(Q1,{flexDirection:"column",marginTop:1,children:[H0(J1,{color:"yellow",children:"Enter your response:"},void 0,!1,void 0,this),H0(Q1,{marginTop:1,children:[H0(J1,{color:"cyan",children:"> "},void 0,!1,void 0,this),H0(gX,{value:I,onChange:L,onSubmit:S,focus:K},void 0,!1,void 0,this)]},void 0,!0,void 0,this),H0(Q1,{marginTop:1,children:H0(J1,{color:"gray",children:"(Press Enter to submit, ESC to go back)"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this):H0(Q1,{flexDirection:"column",children:k.map((d,a)=>H0(pX,{option:d,index:a,isSelected:P.includes(d.value),isMultiSelect:y.multiSelect,isHighlighted:B===a},d.value,!1,void 0,this))},void 0,!1,void 0,this),!F&&H0(Q1,{marginTop:1,flexDirection:"column",children:[H0(J1,{color:"gray",children:y.multiSelect?"Space to toggle · Enter to confirm · 1-9 for quick select":"Enter to select · Up/Down or Tab to navigate · 1-9 for quick select"},void 0,!1,void 0,this),y.multiSelect&&P.length>0&&H0(J1,{color:"green",children:["Selected: ",P.join(", ")]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$.length>1&&H0(Q1,{marginTop:1,children:H0(J1,{color:"gray",children:["Question ",H+1," of ",$.length]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{basename as xX}from"node:path";import{Box as n$,Text as w1,useInput as uX}from"ink";import lX from"ink-select-input";import{useEffect as Y4,useMemo as o$,useRef as nJ,useState as D8}from"react";function dJ($){return`${$.projectPath}\x00${$.sessionId}`}function rJ($){return $.title?.trim()||`Session ${$.sessionId.slice(0,8)}`}function aJ($){return $.taskDelivery?` | delivery:${$.taskDelivery.status}`:""}function iJ($,Q){if(Q!=="fork")return[...$];return $.filter((Y)=>Y.relationType!=="subagent")}function oJ($){return{title:$==="fork"?"选择要 fork 的会话:":"选择要恢复的会话:",instructions:"(Left/Right to page | Up/Down to select | Enter to confirm | Esc to cancel)"}}import{jsxDEV as l0}from"react/jsx-dev-runtime";function dX($){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 rX($){return xX($)}function aX($){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 iX=({isSelected:$})=>l0(n$,{marginRight:1,children:l0(w1,{color:$?"cyan":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),oX=({isSelected:$,label:Q})=>l0(w1,{color:$?"cyan":"white",bold:$,children:Q},void 0,!1,void 0,this),A2=20,tJ=({intent:$,sessions:Q,onSelect:Y,onCancel:J})=>{let[Z,X]=D8([]),[K,U]=D8(!1),[G,q]=D8(0),[H,O]=D8(!1),N=nJ(!1),z=nJ(!0);Y4(()=>{return z.current=!0,()=>{z.current=!1}},[]);let _=s0()==="session-selector",P=S0(!1);uX((y,k)=>{if(k.ctrl&&y==="c"||k.meta&&y==="c"){P();return}if(N.current)return;if(k.escape&&J){J();return}if(k.leftArrow||y==="h"||y==="H"){if(G>0)q((T)=>T-1);return}if(k.rightArrow||y==="l"||y==="L"){if(G<I-1)q((T)=>T+1);return}},{isActive:_}),Y4(()=>{if(Q){X(Q);return}(async()=>{U(!0);try{let k=await y0.listSessions({includeSubagents:!1});X(k)}catch(k){console.error("[SessionSelector] Failed to load sessions:",k),X([])}finally{U(!1)}})()},[Q]);let b=o$(()=>iJ(Q||Z,$),[$,Q,Z]),F=o$(()=>oJ($),[$]),f=o$(()=>{return b.map((y)=>{let k=rX(y.taskSourceProjectPath??y.projectPath),T=dX(y.lastMessageTime),W=rJ(y),S=`[${aX(y.taskStatus)}]`,h=y.gitBranch?` (${y.gitBranch})`:"",o=y.hasErrors?" [!]":"",d=y.taskRetriedFrom?` ↻ retry:${y.taskRetriedFrom.sessionId.slice(0,6)}`:y.relationType==="subagent"?" ↳ subagent":y.relationType==="fork"?" ↳ fork":"",a=y.taskIsolation==="worktree"?` | wt:${y.taskWorktreeBranch??"managed"}`:y.taskIsolation==="local"?" | local":"",l=y.taskDiffStat?` | ${y.taskDiffStat.changedFiles} files +${y.taskDiffStat.additions} -${y.taskDiffStat.deletions}`:"",R=y.taskStatus==="queued"&&y.taskQueuePosition?` | queue:${y.taskQueuePosition}/${y.taskQueueDepth??y.taskQueuePosition}`:"",M=aJ(y);return{key:dJ(y),label:`${S} ${W} · ${T} | ${k}${h} | ${y.messageCount} 条消息${a}${R}${l}${M}${o}${d}`,value:y}})},[b]),I=o$(()=>Math.max(1,Math.ceil(f.length/A2)),[f.length]),L=o$(()=>{let y=G*A2;return f.slice(y,y+A2)},[f,G]),C=o$(()=>({start:G*A2+1,end:Math.min((G+1)*A2,f.length)}),[G,f.length]);Y4(()=>{q(0)},[b.length]);let w=(y)=>{if(N.current)return;N.current=!0,O(!0);let k=()=>{if(!z.current)return;N.current=!1,O(!1)};Promise.resolve().then(()=>Y(y.value)).then(k,k)};if(K)return l0(n$,{flexDirection:"column",paddingX:2,paddingY:1,children:l0(w1,{children:"正在加载会话列表..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(b.length===0)return l0(n$,{flexDirection:"column",paddingX:2,paddingY:1,children:[l0(w1,{color:"yellow",children:"没有找到历史会话"},void 0,!1,void 0,this),l0(w1,{dimColor:!0,children:[`
158
+ `,"提示: 开始一次对话后,会话历史将保存到 ~/.blade/projects/"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this);return l0(n$,{flexDirection:"column",paddingX:2,paddingY:1,children:[l0(w1,{bold:!0,color:"cyan",children:F.title},void 0,!1,void 0,this),l0(w1,{dimColor:!0,children:[`
159
+ `,F.instructions,`
160
+ `]},void 0,!0,void 0,this),l0(lX,{items:L,onSelect:w,isFocused:_&&!H,indicatorComponent:iX,itemComponent:oX},void 0,!1,void 0,this),H&&l0(w1,{color:"cyan",children:$==="fork"?"Forking…":"Resuming…"},void 0,!1,void 0,this),l0(n$,{marginTop:1,flexDirection:"column",children:[l0(w1,{dimColor:!0,children:["第 ",G+1,"/",I," 页 · 共 ",b.length," 个会话 · 显示"," ",C.start,"-",C.end]},void 0,!0,void 0,this),I>1&&l0(n$,{marginTop:1,children:[l0(w1,{color:G>0?"cyan":"gray",children:G>0?"<< 上一页":" "},void 0,!1,void 0,this),l0(w1,{children:" "},void 0,!1,void 0,this),l0(w1,{color:G<I-1?"cyan":"gray",children:G<I-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 sJ,Text as P2}from"ink";import nX,{useEffect as tX,useState as sX}from"react";import{jsxDEV as O$}from"react/jsx-dev-runtime";var eJ=["|","/","-","\\"],Z4=nX.memo(()=>{let $=f2(),Q=A0(),Y=$$(),[J,Z]=sX(0);if(tX(()=>{if($?.status!=="loading"){Z(0);return}let X=setInterval(()=>{Z((K)=>(K+1)%eJ.length)},100);return()=>clearInterval(X)},[$?.status]),!$)return null;return O$(sJ,{flexDirection:"column",borderStyle:"single",borderColor:Q.colors.info,marginX:2,marginBottom:1,paddingX:1,children:[O$(sJ,{children:[O$(P2,{bold:!0,color:Q.colors.info,children:"BTW"},void 0,!1,void 0,this),O$(P2,{color:Q.colors.muted,children:[" | ",$.question]},void 0,!0,void 0,this),$.durationMs!==void 0&&O$(P2,{color:Q.colors.muted,dimColor:!0,children:[" ","| ",$.durationMs,"ms"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$.status==="loading"&&O$(P2,{color:Q.colors.text.secondary,children:[eJ[J]," Answering..."]},void 0,!0,void 0,this),$.status==="error"&&O$(P2,{color:Q.colors.error,children:$.error??"Side conversation failed"},void 0,!1,void 0,this),$.status==="completed"&&$.response&&O$(k1,{content:$.response,role:"assistant",terminalWidth:Math.max(20,Y-8),hidePrefix:!0,noMargin:!0,messageId:`side-conversation-${$.requestId}`},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});Z4.displayName="SideConversationPanel";import{Box as p0,Text as f0,useInput as eX}from"ink";import{jsxDEV as Y0}from"react/jsx-dev-runtime";function QY({onCancel:$}){let Q=C1(),J=$Y({cwd:Q}).getAll(),Z=J.filter((G)=>G.source==="builtin"),X=J.filter((G)=>G.source==="user"),K=J.filter((G)=>G.source==="project"),U=S0(!1,$);if(eX((G,q)=>{if(q.escape)$?.();else if(q.ctrl&&G==="c"||q.meta&&G==="c")U()}),J.length===0)return Y0(p0,{flexDirection:"column",paddingY:1,children:[Y0(p0,{marginBottom:1,children:Y0(f0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this)},void 0,!1,void 0,this),Y0(p0,{paddingLeft:2,children:Y0(f0,{color:"gray",children:"没有找到任何 Skill"},void 0,!1,void 0,this)},void 0,!1,void 0,this),Y0(p0,{marginTop:1,paddingLeft:2,children:Y0(f0,{color:"gray",children:"配置文件位置: ~/.blade/skills/ 或 .blade/skills/"},void 0,!1,void 0,this)},void 0,!1,void 0,this),Y0(p0,{marginTop:1,children:Y0(f0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return Y0(p0,{flexDirection:"column",paddingY:1,children:[Y0(p0,{marginBottom:1,children:[Y0(f0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this),Y0(f0,{color:"gray",children:[" (找到 ",J.length," 个)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.length>0&&Y0(p0,{flexDirection:"column",marginBottom:1,children:[Y0(p0,{paddingLeft:1,children:[Y0(f0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),Y0(f0,{color:"gray",children:" (.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),K.map((G)=>{let H=G.description.length>80?`${G.description.substring(0,80)}...`:G.description;return Y0(p0,{flexDirection:"column",paddingLeft:2,children:[Y0(f0,{children:[Y0(f0,{bold:!0,color:"green",children:["• ",G.name]},void 0,!0,void 0,this),Y0(f0,{color:"gray",children:[" - ",H]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),G.allowedTools&&G.allowedTools.length>0&&Y0(p0,{paddingLeft:2,children:Y0(f0,{color:"gray",children:["工具: ",G.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),Y0(p0,{paddingLeft:2,children:Y0(f0,{color:"gray",dimColor:!0,children:G.path},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},G.name,!0,void 0,this)})]},void 0,!0,void 0,this),X.length>0&&Y0(p0,{flexDirection:"column",marginBottom:1,children:[Y0(p0,{paddingLeft:1,children:[Y0(f0,{bold:!0,color:"yellow",children:"用户级"},void 0,!1,void 0,this),Y0(f0,{color:"gray",children:" (~/.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X.map((G)=>{let H=G.description.length>80?`${G.description.substring(0,80)}...`:G.description;return Y0(p0,{flexDirection:"column",paddingLeft:2,children:[Y0(f0,{children:[Y0(f0,{bold:!0,color:"green",children:["• ",G.name]},void 0,!0,void 0,this),Y0(f0,{color:"gray",children:[" - ",H]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),G.allowedTools&&G.allowedTools.length>0&&Y0(p0,{paddingLeft:2,children:Y0(f0,{color:"gray",children:["工具: ",G.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),Y0(p0,{paddingLeft:2,children:Y0(f0,{color:"gray",dimColor:!0,children:G.path},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},G.name,!0,void 0,this)})]},void 0,!0,void 0,this),Z.length>0&&Y0(p0,{flexDirection:"column",marginBottom:1,children:[Y0(p0,{paddingLeft:1,children:[Y0(f0,{bold:!0,color:"cyan",children:"内置"},void 0,!1,void 0,this),Y0(f0,{color:"gray",children:" (builtin)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Z.map((G)=>{let H=G.description.length>80?`${G.description.substring(0,80)}...`:G.description;return Y0(p0,{flexDirection:"column",paddingLeft:2,children:[Y0(f0,{children:[Y0(f0,{bold:!0,color:"green",children:["• ",G.name]},void 0,!0,void 0,this),Y0(f0,{color:"gray",children:[" - ",H]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),G.userInvocable&&Y0(p0,{paddingLeft:2,children:Y0(f0,{color:"blue",children:["命令: /",G.name]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},G.name,!0,void 0,this)})]},void 0,!0,void 0,this),Y0(p0,{marginTop:1,children:Y0(f0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import{Box as JY,Text as I1}from"ink";import $7,{useEffect as Q7,useMemo as J7,useState as YY}from"react";import{jsxDEV as Y1,Fragment as X4}from"react/jsx-dev-runtime";var ZY=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"];function Y7($){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 XY=$7.memo(()=>{let $=s((q)=>q.app.subagentProgresses),Q=s((q)=>q.app.subagentProgress),Y=A0(),[J,Z]=YY(0),[X,K]=YY(()=>Date.now()),U=J7(()=>{let q=Object.values($);return q.length>0?q:Q?[Q]:[]},[Q,$]),G=U.some((q)=>q.status==="running");if(Q7(()=>{if(!G){Z(0);return}let q=setInterval(()=>{Z((O)=>(O+1)%ZY.length)},80),H=setInterval(()=>{K(Date.now())},1000);return()=>{clearInterval(q),clearInterval(H)}},[G]),U.length===0)return null;return Y1(JY,{paddingX:2,paddingY:0,flexDirection:"column",children:U.map((q)=>{let H=q.status==="running"?ZY[J]:q.status==="completed"?"[OK]":"[X]",O=q.status==="running"?Y.colors.info:q.status==="completed"?Y.colors.success:Y.colors.error,N=Math.max(0,X-q.startTime);return Y1(JY,{flexDirection:"row",gap:1,children:[Y1(I1,{color:O,bold:!0,children:H},void 0,!1,void 0,this),Y1(I1,{color:Y.colors.muted,children:"Subagent"},void 0,!1,void 0,this),Y1(I1,{color:Y.colors.text.primary,bold:!0,children:q.type},void 0,!1,void 0,this),Y1(I1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),Y1(I1,{color:Y.colors.text.secondary,children:q.description},void 0,!1,void 0,this),q.currentTool&&Y1(X4,{children:[Y1(I1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),Y1(I1,{color:Y.colors.warning,children:q.currentTool},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.status==="running"&&N>0&&Y1(X4,{children:[Y1(I1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),Y1(I1,{color:Y.colors.info,children:Y7(N)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.status==="failed"&&q.terminalSummary&&Y1(X4,{children:[Y1(I1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),Y1(I1,{color:Y.colors.error,children:q.terminalSummary},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},q.id,!0,void 0,this)})},void 0,!1,void 0,this)});import{useMemoizedFn as Z7}from"ahooks";import{Box as D1,Text as r,useInput as X7}from"ink";import K7 from"ink-select-input";import{useState as KY}from"react";import{jsxDEV as u}from"react/jsx-dev-runtime";var GY=C$.map(($)=>({label:$.label,value:$.id})),G7=({theme:$})=>{let{colors:Q}=$;return u(D1,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[u(r,{bold:!0,color:Q.text.primary,children:"代码预览"},void 0,!1,void 0,this),u(r,{children:" "},void 0,!1,void 0,this),u(r,{color:Q.syntax.comment,children:"# function"},void 0,!1,void 0,this),u(r,{children:[u(r,{color:Q.syntax.keyword,children:"def"},void 0,!1,void 0,this)," ",u(r,{color:Q.syntax.function,children:"fibonacci"},void 0,!1,void 0,this),u(r,{color:Q.text.primary,children:"("},void 0,!1,void 0,this),u(r,{color:Q.syntax.variable,children:"n"},void 0,!1,void 0,this),u(r,{color:Q.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(r,{children:[" ",u(r,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this),u(r,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",u(r,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",u(r,{color:Q.syntax.operator,children:"="},void 0,!1,void 0,this)," ",u(r,{color:Q.syntax.number,children:"0"},void 0,!1,void 0,this),u(r,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",u(r,{color:Q.syntax.number,children:"1"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(r,{children:[" ",u(r,{color:Q.syntax.keyword,children:"for"},void 0,!1,void 0,this)," ",u(r,{color:Q.syntax.variable,children:"_"},void 0,!1,void 0,this)," ",u(r,{color:Q.syntax.keyword,children:"in"},void 0,!1,void 0,this)," ",u(r,{color:Q.syntax.function,children:"range"},void 0,!1,void 0,this),u(r,{color:Q.text.primary,children:"("},void 0,!1,void 0,this),u(r,{color:Q.syntax.variable,children:"n"},void 0,!1,void 0,this),u(r,{color:Q.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(r,{children:[" ",u(r,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this),u(r,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",u(r,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",u(r,{color:Q.syntax.operator,children:"="},void 0,!1,void 0,this)," ",u(r,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this),u(r,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",u(r,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this)," ",u(r,{color:Q.syntax.operator,children:"+"},void 0,!1,void 0,this)," ",u(r,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(r,{children:[" ",u(r,{color:Q.syntax.keyword,children:"return"},void 0,!1,void 0,this)," ",u(r,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(r,{children:" "},void 0,!1,void 0,this),u(r,{color:Q.error,children:["- print(",u(r,{color:Q.syntax.string,children:'"Hello, "'},void 0,!1,void 0,this)," + name)"]},void 0,!0,void 0,this),u(r,{color:Q.success,children:["+ print(",u(r,{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)},U7=({theme:$})=>{let{colors:Q}=$;return u(D1,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[u(r,{children:" "},void 0,!1,void 0,this),u(r,{bold:!0,color:Q.text.primary,children:"颜色配置"},void 0,!1,void 0,this),u(r,{children:" "},void 0,!1,void 0,this),u(r,{children:[u(r,{color:Q.text.muted,children:"Primary: "},void 0,!1,void 0,this),u(r,{color:Q.primary,children:Q.primary},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(r,{children:[u(r,{color:Q.text.muted,children:"Success: "},void 0,!1,void 0,this),u(r,{color:Q.success,children:Q.success},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(r,{children:[u(r,{color:Q.text.muted,children:"Error: "},void 0,!1,void 0,this),u(r,{color:Q.error,children:Q.error},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(r,{children:[u(r,{color:Q.text.muted,children:"Warning: "},void 0,!1,void 0,this),u(r,{color:Q.warning,children:Q.warning},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(r,{children:[u(r,{color:Q.text.muted,children:"Info: "},void 0,!1,void 0,this),u(r,{color:Q.info,children:Q.info},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},UY=()=>{let $=t1(),Q=d0.getCurrentThemeName(),Y=C$.findIndex((B)=>B.label===Q),J=Y>=0?C$[Y].theme:C$[0].theme,[Z,X]=KY(J),[K,U]=KY(!1),G=Z7(async(B)=>{if(K)return;U(!0);try{await m0().setTheme(B.value),$.closeModal()}catch(_){console.error("主题切换失败:",_ instanceof Error?_.message:_)}finally{U(!1)}}),q=(B)=>{let _=C$.find((P)=>P.id===B.value);if(_)X(_.theme)},O=s0()==="theme-selector",N=S0(!1);X7((B,_)=>{if(_.ctrl&&B==="c"||_.meta&&B==="c"){N();return}if(_.escape&&!K)$.closeModal()},{isActive:O});let z=(B)=>{let{isSelected:_,label:P}=B,F=P===Q?"[OK]":" ";return u(r,{color:_?Z.colors.primary:Z.colors.text.primary,children:[F," ",P]},void 0,!0,void 0,this)};return u(D1,{flexDirection:"column",height:"100%",children:[u(D1,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:Z.colors.border.light,children:u(r,{bold:!0,color:Z.colors.primary,children:"主题选择器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),u(D1,{flexDirection:"row",flexGrow:1,children:[u(D1,{width:"40%",borderStyle:"single",borderColor:Z.colors.border.light,paddingX:1,children:u(D1,{flexDirection:"column",children:[u(D1,{paddingTop:1,paddingBottom:1,children:u(r,{bold:!0,color:Z.colors.text.primary,children:["可用主题 (",GY.length,")"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),u(K7,{items:GY,initialIndex:Y>=0?Y:0,onSelect:G,onHighlight:q,itemComponent:z},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),u(D1,{width:"60%",flexDirection:"column",borderStyle:"single",borderColor:Z.colors.border.light,children:[u(G7,{theme:Z},void 0,!1,void 0,this),u(U7,{theme:Z},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),u(D1,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:Z.colors.border.light,children:u(r,{color:Z.colors.text.muted,children:K?"正在保存...":"Enter: 选择主题 | Esc: 取消"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{jsxDEV as M0}from"react/jsx-dev-runtime";var U1=s1("UI"),zY=({debug:$,continue:Q,...Y})=>{if($)U1.debug("[Debug] BladeInterface props:",{permissionMode:Y.permissionMode,yolo:Y.yolo,maxTurns:Y.maxTurns,continue:Q});let J=V8(!1),Z=V8(!1),X=V8(!1),K=V8(null),U=A4(),G=P4(),q=C2(),H=M4(),O=R4(),N=t1(),z=n1(),B=S$(),_=C1(),P=k4(),b=v$(),F=f4();_$(()=>{if(d0.getCurrentThemeName()!==F)try{d0.setTheme(F)}catch{}},[F]);let f=U==="ready",I=U==="needsSetup",L=U==="idle",C=q7(()=>Y.agents?OY(Y.agents):void 0,[Y.agents]),{confirmationState:w,confirmationHandler:y,handleResponse:k,dismissAll:T}=W6(),{executeCommand:W,handleAbort:S,isProcessing:h,cleanupAgent:o}=z6(Y.systemPrompt,Y.appendSystemPrompt,y,Y.maxTurns,T,C),{getPreviousCommand:d,getNextCommand:a,addToHistory:l}=N6();S6();let R=L6("",0),M=n0(async()=>{let p=b,U0;if(p==="default")U0="autoEdit";else if(p==="autoEdit")U0="plan";else if(p==="plan")U0="default";else U0="default";try{await y0.setSessionPermissionMode(B,_,U0),await m0().setPermissionMode(U0)}catch(g0){U1.error("权限模式切换失败:",g0 instanceof Error?g0.message:g0)}}),A=n0(async(p)=>{try{let U0={displayName:p.displayName,provider:p.provider,model:p.model,overrides:p.overrides};if(p.modelProvider)await m0().addModelWithProvider(U0,p.modelProvider);else await m0().addModel(U0);N.setInitializationStatus("ready")}catch(U0){throw U1.error("初始化配置保存失败:",U0 instanceof Error?U0.message:U0),U0}}),v=n0(()=>{if(q==="shortcuts")N.closeModal();else N.setActiveModal("shortcuts")}),j=n0(async(p,U0,g0)=>{return d2({intent:U0,session:p,newSessionId:g0?.newSessionId,announceFork:g0?.announceFork,permissionModeOverride:Y.permissionMode},_,z,o)}),D=n0(async(p,U0)=>{let Q2=(await l2(U0,_)).filter((M2)=>M2.sessionId===p);if(Q2.length===0)throw Error(`Session not found: ${p}`);if(Q2.length>1)throw Error(`Multiple workspaces contain session ${p}; use the session selector`);return Q2[0]}),{showSuggestions:E,suggestions:m,selectedSuggestionIndex:n}=k6(R,W,d,a,l,S,h,M,v,q==="shortcuts");_$(()=>{if(R.value&&q==="shortcuts")N.closeModal()},[R.value,q,N]);let $0=n0(async()=>{X.current=!0;try{let p=Y.forkSession?"fork":"resume",U0=await l2(p,_);if(U0.length===0){if(Y.forkSession){U1.error("没有可供 fork 的历史会话"),f1(1);return}z.addAssistantMessage("没有找到历史会话,开始新对话。");return}let g0=U0[0];await j(g0,p,{newSessionId:Y.forkSession?Y.sessionId:void 0,announceFork:Y.forkSession?!1:void 0})}catch(p){if(U1.error("[BladeInterface] 继续会话失败:",p),Y.forkSession){f1(1);return}z.addAssistantMessage("继续会话失败,开始新对话。")}}),L0=n0(async()=>{X.current=!0;try{if(typeof Y.resume==="string"&&Y.resume!=="true"){let g0=Y.forkSession?"fork":"resume",R2=await D(Y.resume,g0);await j(R2,g0,{newSessionId:Y.forkSession?Y.sessionId:void 0,announceFork:Y.forkSession?!1:void 0});return}let p=Y.forkSession?"fork":"resume",U0=await l2(p,_);if(U0.length===0)U1.error("没有找到历史会话"),f1(1);N.showSessionSelector(U0,p)}catch(p){U1.error("[BladeInterface] 加载会话失败:",p),f1(1)}});_$(()=>{if(J.current)return;if(Q){J.current=!0,$0();return}if(Y.resume)J.current=!0,L0()},[Q,Y.resume,$0,L0]);let I0=n0(async(p)=>{let U0=w.details?.type;if(U0==="enterPlanMode"&&p.approved)try{await y0.setSessionPermissionMode(B,_,"plan"),await m0().setPermissionMode("plan"),U1.debug("[BladeInterface] Entered Plan mode")}catch(g0){U1.error("[BladeInterface] Failed to enter Plan mode:",g0)}if(U0==="exitPlanMode"&&p.approved)U1.debug("[BladeInterface] ExitPlanMode approved, Store auto-synced");k(p)}),c0=n0(()=>{z.addAssistantMessage("设置已取消"),z.addAssistantMessage("Blade 需要 API 配置才能正常工作。"),z.addAssistantMessage("您可以稍后运行 Blade 重新进入设置向导。"),f1(0)}),h0=n0(()=>{N.closeModal()}),F$=n0(async(p)=>{try{await j(p,H?.intent??"resume"),N.closeModal()}catch(U0){U1.error("[BladeInterface] Failed to restore session:",U0),z.addAssistantMessage(`会话操作失败: ${U0 instanceof Error?U0.message:"未知错误"}`),N.closeModal()}}),e$=n0(()=>{if(Y.resume)f1(0);else N.closeModal()}),j1=n0((p)=>{N.showModelEditWizard(p)}),b1=n0((p)=>{z.addAssistantMessage(`已添加模型配置: ${p.displayName??p.model},并已切换到该模型`),h0()}),t0=n0((p)=>{z.addAssistantMessage(`已更新模型配置: ${p.displayName??p.model}`),h0()});_$(()=>{if(I){P.setFocus("model-config-wizard");return}if(w.isVisible)P.setFocus("confirmation-prompt");else if(q==="sessionSelector")P.setFocus("session-selector");else if(q==="themeSelector")P.setFocus("theme-selector");else if(q==="modelSelector")P.setFocus("model-selector");else if(q==="modelAddWizard"||q==="modelEditWizard")P.setFocus("model-config-wizard");else if(q==="permissionsManager")P.setFocus("permissions-manager");else if(q==="agentsManager")P.setFocus("agents-manager");else if(q==="agentCreationWizard")P.setFocus("agent-creation-wizard");else if(q==="hooksManager")P.setFocus("hooks-manager");else if(q==="shortcuts")P.setFocus("main-input");else P.setFocus("main-input")},[I,w.isVisible,q,P.setFocus]),_$(()=>{if(!f||X.current)return;if(qY().length>0){X.current=!0;return}X.current=!0,z.addAssistantMessage("请输入您的问题,我将为您提供帮助。")},[f]),_$(()=>{if(!G)return;if(K.current===G)return;if(K.current=G,U==="error")z.addAssistantMessage(`初始化失败: ${G}`);else z.addAssistantMessage(`${G}`),z.addAssistantMessage("请重新尝试设置,或检查文件权限")},[G,U,z.addAssistantMessage]);let m8=n0(async(p)=>{try{await W({displayText:p,text:p,images:[],parts:[{type:"text",text:p}]})}catch(U0){let g0=U0 instanceof Error?U0.message:"无法发送初始消息";z.addAssistantMessage(`初始消息发送失败:${g0}`)}});_$(()=>{let p=Y.initialMessage?.trim();if(!p||Z.current||!f||I)return;Z.current=!0,l(p),m8(p)},[Y.initialMessage,f,I,W,l]);let p8=n0(async(p)=>{try{await m0().setPermissionMode(p)}catch(U0){U1.error("权限模式初始化失败:",U0 instanceof Error?U0.message:U0)}});if(_$(()=>{let p=Y.permissionMode;if($)U1.debug("[Debug] permissionMode from CLI:",p),U1.debug("[Debug] current permissionMode:",b);if(!p||p===b)return;p8(p)},[Y.permissionMode,b]),L)return null;if(I)return M0($4,{mode:"setup",onComplete:A,onCancel:c0},void 0,!1,void 0,this);if($)U1.debug("[Debug] 渲染主界面,条件检查:",{confirmationVisible:w.isVisible,activeModal:q});let $2=q==="modelSelector",h1=O,z1=q==="modelAddWizard"?"add":q==="modelEditWizard"&&h1?"edit":null,c8=$2||Boolean(z1),G0=q==="agentsManager",k0=q==="agentCreationWizard",w0=q==="skillsManager",Q0=q==="pluginsManager",Z0=h1?{displayName:h1.displayName,provider:h1.provider,model:h1.model,overrides:h1.overrides}:void 0,q1=w.isVisible&&w.details?w.details.type==="mcpElicitation"&&w.details.mcpElicitation?M0($J,{details:w.details.mcpElicitation,onComplete:(p,U0)=>I0({approved:p.action==="accept",elicitation:p,...U0?{openExternalUrl:!0}:{}})},void 0,!1,void 0,this):w.details.type==="askUserQuestion"&&w.details.questions?M0(lJ,{questions:w.details.questions,onComplete:(p)=>I0({approved:!0,answers:p}),onCancel:()=>I0({approved:!1})},void 0,!1,void 0,this):M0(y9,{details:w.details,onResponse:I0},void 0,!1,void 0,this):q==="themeSelector"?M0(UY,{},void 0,!1,void 0,this):q==="permissionsManager"?M0(jJ,{onClose:h0},void 0,!1,void 0,this):q==="sessionSelector"?M0(tJ,{intent:H?.intent??"resume",sessions:H?.sessions,onSelect:F$,onCancel:e$},void 0,!1,void 0,this):q==="hooksManager"?M0(M9,{workspaceRoot:_,sessionId:B,onClose:h0},void 0,!1,void 0,this):null,X1=Boolean(q1);return M0(z$,{flexDirection:"column",width:"100%",overflow:"hidden",children:[q1,M0(z$,{flexDirection:"column",display:X1?"none":"flex",children:[M0(FJ,{},void 0,!1,void 0,this),M0(XY,{},void 0,!1,void 0,this),M0(Z4,{},void 0,!1,void 0,this),M0(n9,{paused:X1},void 0,!1,void 0,this),M0(l9,{input:R.value,cursorPosition:R.cursorPosition,onChange:R.setValue,onChangeCursorPosition:R.setCursorPosition,onAddPasteMapping:R.addPasteMapping,onAddImagePasteMapping:R.addImagePasteMapping},void 0,!1,void 0,this),$2&&M0(z$,{marginTop:1,paddingX:2,children:M0(WJ,{onClose:h0,onEdit:j1},void 0,!1,void 0,this)},void 0,!1,void 0,this),z1&&M0(z$,{marginTop:1,paddingX:2,children:M0($4,{mode:z1,modelId:h1?.id,initialConfig:z1==="edit"?Z0:void 0,onComplete:z1==="edit"?t0:b1,onCancel:h0},void 0,!1,void 0,this)},void 0,!1,void 0,this),G0&&M0(z$,{marginTop:1,paddingX:2,children:M0(E6,{workspaceRoot:_,onComplete:h0,onCancel:h0},void 0,!1,void 0,this)},void 0,!1,void 0,this),k0&&M0(z$,{marginTop:1,paddingX:2,children:M0(_2,{onComplete:h0,onCancel:h0},void 0,!1,void 0,this)},void 0,!1,void 0,this),w0&&M0(z$,{marginTop:1,paddingX:2,children:M0(QY,{onComplete:h0,onCancel:h0},void 0,!1,void 0,this)},void 0,!1,void 0,this),Q0&&M0(z$,{marginTop:1,paddingX:2,children:M0(xJ,{workspaceRoot:_,onComplete:h0,onCancel:h0},void 0,!1,void 0,this)},void 0,!1,void 0,this),M0(l6,{suggestions:m,selectedIndex:n,visible:E&&!c8},void 0,!1,void 0,this),M0(u6,{},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)};import{Box as O7,Text as N$}from"ink";import z7 from"react";import{jsxDEV as i1}from"react/jsx-dev-runtime";class y2 extends z7.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 i1(O7,{flexDirection:"column",padding:1,borderStyle:"round",borderColor:"red",children:[i1(N$,{color:"red",children:"应用发生错误"},void 0,!1,void 0,this),i1(N$,{children:" "},void 0,!1,void 0,this),i1(N$,{color:"red",children:this.state.error?.message},void 0,!1,void 0,this),i1(N$,{children:" "},void 0,!1,void 0,this),i1(N$,{color:"gray",children:"错误详情:"},void 0,!1,void 0,this),i1(N$,{color:"gray",children:this.state.error?.stack},void 0,!1,void 0,this),i1(N$,{children:" "},void 0,!1,void 0,this),i1(N$,{color:"yellow",children:"请重启应用或联系开发者"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return this.props.children}}import{Box as f$,Text as o1,useInput as _7}from"ink";import{useState as K4}from"react";import{jsxDEV as Z1}from"react/jsx-dev-runtime";var j8=[{key:"update",label:"Update now",description:`runs \`${NY()}\``},{key:"skip",label:"Skip",description:""},{key:"skip_until_next",label:"Skip until next version",description:""}],WY=({versionInfo:$,onComplete:Q})=>{let[Y,J]=K4(0),[Z,X]=K4(!1),[K,U]=K4(null);_7((q,H)=>{if(H.ctrl&&q==="c"){O2().shutdown("SIGINT",0);return}if(Z||K)return;if(H.upArrow||q==="k")J((O)=>O>0?O-1:j8.length-1);else if(H.downArrow||q==="j")J((O)=>O<j8.length-1?O+1:0);else if(H.return)G(j8[Y].key);else if(q==="1")G("update");else if(q==="2")G("skip");else if(q==="3")G("skip_until_next")});let G=async(q)=>{switch(q){case"update":{X(!0);let H=await FY();U(H.message),setTimeout(()=>{O2().shutdown("SIGINT",0)},1500);break}case"skip":Q();break;case"skip_until_next":if($.latestVersion)await _Y($.latestVersion);Q();break}};if(K)return Z1(f$,{flexDirection:"column",marginY:1,children:Z1(o1,{children:K},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Z)return Z1(f$,{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(f$,{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(f$,{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(f$,{flexDirection:"column",marginTop:1,children:j8.map((q,H)=>{let O=H===Y,N=O?"› ":" ",z=`${H+1}. `;return Z1(f$,{children:Z1(o1,{color:O?"cyan":void 0,children:[N,z,q.label,q.description&&Z1(o1,{color:"gray",children:[" (",q.description,")"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},q.key,!1,void 0,this)})},void 0,!1,void 0,this),Z1(f$,{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 h8,Text as t$,useInput as N7}from"ink";import{useState as HY}from"react";import{jsxDEV as V1}from"react/jsx-dev-runtime";var LY=({status:$,onTrust:Q,onContinueSafely:Y})=>{let J=d0.getTheme(),[Z,X]=HY(!1),[K,U]=HY(null);return N7((G,q)=>{if(Z)return;if(q.return||G.toLowerCase()==="t"){X(!0),U(null),Q().catch((H)=>{U(H instanceof Error?H.message:"Failed to trust workspace"),X(!1)});return}if(G.toLowerCase()==="s"||q.escape)X(!0),U(null),Y().catch((H)=>{U(H instanceof Error?H.message:"Failed to continue safely"),X(!1)})}),V1(h8,{flexDirection:"column",paddingX:1,children:[V1(t$,{bold:!0,color:J.colors.warning,children:"Workspace review required"},void 0,!1,void 0,this),V1(t$,{dimColor:!0,children:$.projectPath},void 0,!1,void 0,this),V1(h8,{marginTop:1,flexDirection:"column",children:[V1(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((G)=>V1(t$,{children:[" ",G.path," · ",G.effects.length," effect(s)"]},`${G.kind}:${G.path}`,!0,void 0,this))]},void 0,!0,void 0,this),K&&V1(h8,{marginTop:1,children:V1(t$,{color:J.colors.error,children:K},void 0,!1,void 0,this)},void 0,!1,void 0,this),V1(h8,{marginTop:1,children:V1(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 F7}from"ink";import{useEffect as W7}from"react";function BY(){let{stdout:$}=F7();W7(()=>{if(!$.isTTY)return;return $.write(C9),$.write(jQ),()=>{$.write(f9),$.write(jQ)}},[$])}function wY($){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 L7($){if(e0().config.actions.setConfig($),$.debug)console.log("[Debug] 模型配置检查通过,准备就绪");r0().setInitializationStatus("ready")}var iW=($)=>{BY();let[Q,Y]=g8(!1),[J,Z]=g8(null),[X,K]=g8(!1),[U,G]=g8(null),q=E8((z,B)=>{let _=z instanceof Error?z.message:String(z);if(r0().setInitializationError(_),r0().setInitializationStatus("error"),Y(!0),B)console.error("[FAIL] 应用初始化失败:",_)}),H=E8(async()=>{try{let z=e0().config.config??AY,B=PY(z,$);if(L7(B),B.resumeSessionId)yY().restoreSession(B.resumeSessionId,[]);if(B.debug)console.error("[Debug] 运行时配置:",B);let _=B.codeTheme;if(_&&d0.hasTheme(_)){if(d0.setTheme(_),$.debug)console.log(`[OK] 已加载主题: ${_}`)}try{O1.getInstance().loadConfig(B.hooks||{},u0());let b=await RY(u0());if($.debug&&B.hooks?.enabled)console.log("[OK] Hooks 系统已启用");if($.debug)console.log(`[OK] Workspace resources: ${b.subagents.getAllNames().length} agents, ${b.skills.size} skills, ${b.commands.getCommandCount()+b.commands.getPluginCommandCount()} commands, ${b.plugins.getAll().length} plugins`);let f=e0().session.sessionId;bY(f)}catch(P){if($.debug)console.warn("Hooks 初始化失败:",wY(P))}i2(async()=>{await IY.getInstance().killAll(),await MY.getInstance().disconnectAll(),O1.getInstance().cleanup()}),Y(!0)}catch(z){q(z,!!$.debug)}}),O=E8(async()=>{let z=await G4.getInstance().getStatus(u0());if(z.state==="untrusted"||z.state==="error"){G(z);return}await H()}),N=E8(async()=>{if($.versionCheckPromise){let z=await $.versionCheckPromise;if(z){Z(z),K(!0);return}}await O()});if(H7(()=>{N()},[]),X&&J)return s$(y2,{children:s$(WY,{versionInfo:J,onComplete:()=>{K(!1),O()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(U)return s$(y2,{children:s$(LY,{status:U,onTrust:async()=>{await G4.getInstance().trust(u0()),await TY(),G(null),await H()},onContinueSafely:async()=>{G(null),await H()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(!Q)return null;return s$(y2,{children:s$(zY,{...$},void 0,!1,void 0,this)},void 0,!1,void 0,this)};export{iW as AppWrapper};