blade-code 0.7.0 → 0.7.2

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 (73) hide show
  1. package/dist/blade.js +2 -2
  2. package/dist/chunk-108p1xw7.js +1 -0
  3. package/dist/{chunk-nsbhtvqd.js → chunk-1mge0pzv.js} +1 -1
  4. package/dist/{chunk-hc08zg54.js → chunk-1w719wd9.js} +1 -1
  5. package/dist/{chunk-q6c9qs9b.js → chunk-22gxb9qs.js} +2 -2
  6. package/dist/{chunk-sw6ngzbg.js → chunk-275gt6q1.js} +1 -1
  7. package/dist/chunk-42q476bq.js +1 -0
  8. package/dist/{chunk-mt1c5da4.js → chunk-4hk7wfat.js} +2 -2
  9. package/dist/{chunk-tn3xjczg.js → chunk-67zx7ymj.js} +1 -1
  10. package/dist/chunk-7d1pn8a1.js +2 -0
  11. package/dist/{chunk-kk8akm7s.js → chunk-8xdqtspw.js} +1 -1
  12. package/dist/{chunk-c2b6ekqx.js → chunk-9zwf87ne.js} +2 -2
  13. package/dist/chunk-abpvdaq2.js +6 -0
  14. package/dist/{chunk-m22zeqdy.js → chunk-b6mxeey0.js} +2 -2
  15. package/dist/chunk-cadngkwr.js +2 -0
  16. package/dist/{chunk-0afbeec0.js → chunk-cfrbsnfb.js} +1 -1
  17. package/dist/{chunk-k4behavv.js → chunk-cqrkeq20.js} +1 -1
  18. package/dist/{chunk-7z6ba6t9.js → chunk-f9b8h03c.js} +1 -1
  19. package/dist/chunk-g0h3rans.js +6 -0
  20. package/dist/chunk-hv0bzn31.js +1 -0
  21. package/dist/chunk-j3k2c6tm.js +1 -0
  22. package/dist/chunk-je6r01h4.js +1 -0
  23. package/dist/{chunk-31chcjw6.js → chunk-k18bq4mn.js} +2 -2
  24. package/dist/{chunk-ft5nt5b5.js → chunk-m2k4h3bs.js} +1 -1
  25. package/dist/chunk-m4a480k7.js +9 -0
  26. package/dist/chunk-nh37erd3.js +1 -0
  27. package/dist/{chunk-rzz6r1g9.js → chunk-p6d7k1x6.js} +3 -3
  28. package/dist/chunk-p9pthxkm.js +6 -0
  29. package/dist/{chunk-96w1szbp.js → chunk-qw2wy4jc.js} +1 -1
  30. package/dist/{chunk-zmp3vdcj.js → chunk-rmtcqc8q.js} +1 -1
  31. package/dist/{chunk-gxnwrec6.js → chunk-rr62k3ar.js} +2 -2
  32. package/dist/{chunk-pkzy724w.js → chunk-t3pyakvc.js} +2 -2
  33. package/dist/chunk-t6y57501.js +1533 -0
  34. package/dist/chunk-wc2xb6ge.js +24 -0
  35. package/dist/{chunk-f76d6jxg.js → chunk-wcm0nc84.js} +1 -1
  36. package/dist/{chunk-pf33bn8s.js → chunk-xa8szzc6.js} +1 -1
  37. package/dist/{chunk-e21htmg4.js → chunk-z0qxaky4.js} +1 -1
  38. package/dist/chunk-z72cp8f5.js +150 -0
  39. package/dist/chunk-zcreym5g.js +615 -0
  40. package/dist/chunk-ztpseq3n.js +1 -0
  41. package/dist/web/assets/{FilePreview-DLnUh-wQ.js → FilePreview-DXDzoFFc.js} +1 -1
  42. package/dist/web/assets/{MarkdownRenderer-C5KTk9XG.js → MarkdownRenderer-BVPOLK1b.js} +1 -1
  43. package/dist/web/assets/{McpModal-B9qJ4ewt.js → McpModal-DeTf34Fw.js} +1 -1
  44. package/dist/web/assets/{SettingsModal-DpeZ6cJb.js → SettingsModal-CDLkPyL-.js} +1 -1
  45. package/dist/web/assets/{SettingsStore-IzKtyAnM.js → SettingsStore-DYKvNeV_.js} +1 -1
  46. package/dist/web/assets/{SkillsModal-BDfzgJIj.js → SkillsModal-D784AUrt.js} +1 -1
  47. package/dist/web/assets/{TerminalPanel-B2iTF_CR.js → TerminalPanel-BosJuIct.js} +1 -1
  48. package/dist/web/assets/{dialog-sI3ihAze.js → dialog-CgyS_4Eo.js} +1 -1
  49. package/dist/web/assets/index-Abieffcr.js +10 -0
  50. package/dist/web/assets/index-CQ3JnuUf.css +1 -0
  51. package/dist/web/index.html +2 -2
  52. package/package.json +1 -1
  53. package/dist/chunk-2nnak657.js +0 -6
  54. package/dist/chunk-64jv62vs.js +0 -1
  55. package/dist/chunk-6f63v1mk.js +0 -2
  56. package/dist/chunk-93xhspe5.js +0 -1
  57. package/dist/chunk-fehae50v.js +0 -1
  58. package/dist/chunk-gertm8dw.js +0 -157
  59. package/dist/chunk-gscq4fmx.js +0 -49
  60. package/dist/chunk-hscq9623.js +0 -1
  61. package/dist/chunk-kpq18y6v.js +0 -6
  62. package/dist/chunk-mnw1xcwn.js +0 -76
  63. package/dist/chunk-p9s685ta.js +0 -1
  64. package/dist/chunk-phnararg.js +0 -1
  65. package/dist/chunk-v97f7je6.js +0 -2138
  66. package/dist/chunk-vzebrztg.js +0 -9
  67. package/dist/chunk-wre40mf1.js +0 -2
  68. package/dist/chunk-x46rv9sv.js +0 -6
  69. package/dist/chunk-ygta7118.js +0 -1
  70. package/dist/chunk-zd9stbct.js +0 -618
  71. package/dist/chunk-zjh9qqvq.js +0 -1
  72. package/dist/web/assets/index-D8mo0jzF.js +0 -10
  73. package/dist/web/assets/index-DmXmCQOW.css +0 -1
@@ -0,0 +1,150 @@
1
+ import{b as O4,c as z4,d as _4}from"./chunk-9zwf87ne.js";import{j as S2,k as k2}from"./chunk-rr62k3ar.js";import{l as k$,m as o$,o as F1}from"./chunk-xa8szzc6.js";import{y as A4}from"./chunk-cqrkeq20.js";import{C as d8,D as l6,E as b4,F as J8,G as V1,K as k6,M as v6,N as R6,Q as S$,R as y8,S as v4,T as x1,U as OJ,V as zJ,W as M6,X as R4,Y as C6,_ as QJ,z as $J}from"./chunk-t6y57501.js";import"./chunk-z0qxaky4.js";import{ba as w4}from"./chunk-t3pyakvc.js";import"./chunk-22gxb9qs.js";import{Ba as m0,fa as q$,ga as E0,ha as j1,ia as bQ,ja as K$,ka as a$,la as cJ,ma as hQ,na as P2,oa as uJ,pa as oQ,qa as D1,ra as L4,sa as W1,ta as U4,va as p8}from"./chunk-wc2xb6ge.js";import{Ca as W4,Ea as H4}from"./chunk-b6mxeey0.js";import{La as w2}from"./chunk-k18bq4mn.js";import{Pa as e2,Qa as B4,Ya as E6}from"./chunk-zcreym5g.js";import"./chunk-wcm0nc84.js";import{ob as RQ,qb as K1}from"./chunk-p6d7k1x6.js";import{tb as NJ,wb as N0}from"./chunk-cadngkwr.js";import{zb as c2}from"./chunk-m4a480k7.js";import{Kb as F4,Nb as f1}from"./chunk-4hk7wfat.js";import{Pb as vQ}from"./chunk-cfrbsnfb.js";import{useMemoizedFn as xQ}from"ahooks";import{useEffect as M5,useState as dQ}from"react";import{useMemoizedFn as c0}from"ahooks";import{Box as d1}from"ink";import{useEffect as l1,useRef as I8}from"react";import{useShallow as f4}from"zustand/react/shallow";import{useStore as T4}from"zustand";function Q0($){return T4(oQ,$)}var D4=[],iQ=()=>Q0(($)=>$.session.sessionId),nQ=()=>Q0(($)=>$.session.messages),tQ=()=>Q0(($)=>$.session.clearCount),sQ=()=>Q0(($)=>$.session.isCompacting),eQ=()=>Q0(($)=>$.session.tokenUsage.estimatedCostUsd),S1=()=>Q0(($)=>$.session.actions),$6=()=>Q0(($)=>{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)}),Q6=()=>Q0(($)=>$.app.initializationStatus),J6=()=>Q0(($)=>$.app.initializationError),u$=()=>Q0(($)=>$.app.activeModal),Y6=()=>Q0(($)=>$.app.tasks),Z6=()=>Q0(($)=>$.app.modelEditorTarget),X6=()=>Q0(($)=>$.app.sessionSelectorData),q6=()=>Q0(($)=>$.app.awaitingSecondCtrlC),k1=()=>Q0(($)=>$.app.actions),x$=()=>Q0(($)=>$.app.initializationStatus==="ready"),G6=()=>Q0(($)=>$.app.tasks.length>0),U$=()=>Q0(($)=>$.config.config?.permissionMode||"default"),U6=()=>Q0(($)=>$.config.config?.models??D4),d$=()=>Q0(($)=>{let Q=$.config.config;if(!Q)return;let Y=Q.currentModelId;return Q.models.find((Z)=>Z.id===Y)??Q.models[0]}),K6=()=>Q0(($)=>$.config.config?.currentModelId),_0=()=>Q0(($)=>{return E0.getTheme()}),O6=()=>Q0(($)=>$.config.config?.theme??"default"),a0=()=>Q0(($)=>$.focus.currentFocus),z6=()=>Q0(($)=>$.focus.actions),T1=()=>Q0(($)=>$.command.isProcessing),_6=()=>Q0(($)=>$.command.actions),l$=()=>Q0(($)=>$.command.pendingCommands),r$=()=>Q0(($)=>$.app.thinkingModeEnabled),N6=()=>Q0(($)=>$.session.currentThinkingContent),F6=()=>Q0(($)=>$.session.thinkingExpanded),W6=()=>Q0(($)=>$.session.currentStreamingMessageId),H6=()=>Q0(f4(($)=>({lines:$.session.currentStreamingLines,tail:$.session.currentStreamingTail,lineCount:$.session.currentStreamingLineCount,version:$.session.currentStreamingVersion}))),L6=()=>Q0(($)=>$.session.finalizingStreamingMessageId),w6=()=>Q0(($)=>$.session.historyExpanded),B6=()=>Q0(($)=>$.session.expandedMessageCount);import{useMemoizedFn as g8}from"ahooks";import{useEffect as V6,useRef as i4}from"react";function V4($){if(!($ instanceof Error))return"未知错误";let J=$.lastError??$;if(J.responseBody)try{let G=JSON.parse(J.responseBody)?.error?.message;if(G){let X=J.statusCode?` (HTTP ${J.statusCode})`:"";return`${G}${X}`}}catch{}let Z=$.message.match(/Last error:\s*(.+)$/);if(Z)return Z[1];return $.message}function j4($){if(!($ instanceof Error))return!1;return $.name==="AbortError"||$.message.includes("aborted")}function E4($){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 f8($){let Q=j4($),Y=E4($),J;if(Y)J="当前模型不支持图片理解功能。请切换到支持视觉能力的模型(如 Claude 4.5、GPT-5.2、Gemini 3 Pro、Qwen3-VL-Plus 等)后重试。";else J=V4($);return{displayMessage:J,isAbort:Q,isVisionNotSupported:Y}}import{appendFileSync as h4,mkdirSync as m4,writeFileSync as g4}from"node:fs";import p4 from"node:os";import A6 from"node:path";var D8=A6.join(p4.homedir(),".blade","logs","stream-debug.log"),b6=!1;function c4(){if(b6)return;let $=A6.dirname(D8);m4($,{recursive:!0,mode:493}),g4(D8,`=== Stream Debug Log Started: ${new Date().toISOString()} ===
2
+ `),b6=!0}function V8($,Q,Y){c4();let J=new Date().toISOString(),Z=Y?` | ${JSON.stringify(Y)}`:"",q=`[${J}] [${$}] ${Q}${Z}
3
+ `;h4(D8,q)}var C$=f1("UI");function y6($,Q){let Y=!1;return(J)=>{switch(J.kind){case"content_delta":if(Y||$.signal.aborted)break;Q.contentDeltaCount++,Q.contentDeltaTotalLen+=J.delta.length,V8("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(C$.debug("[loopEventHandler] stream_end",{contentDeltaCount:Q.contentDeltaCount,contentDeltaTotalLen:Q.contentDeltaTotalLen,streamFinalized:Y,signalAborted:$.signal.aborted}),V8("loopEventHandler","onStreamEnd",{contentDeltaCallCount:Q.contentDeltaCount,contentDeltaTotalLen:Q.contentDeltaTotalLen,streamFinalized:Y,signalAborted:$.signal.aborted}),Y||$.signal.aborted){Y=!0;break}let{extraContent:Z,extraThinking:q}=$.streamingBuffer.drainPendingBuffers(),G=$.getStreamingMessageId();if(G){if(Z)K$(G,Z);a$(G)}$.sessionActions.finalizeStreamingMessage(Z,q),Y=!0;break}case"model_fallback":Y=!0,$.streamingBuffer.resetStreamingBuffers(),$.sessionActions.discardStreamingMessage(),$.sessionActions.setCurrentThinkingContent(null);break;case"tool_start":{let Z=J.toolCall;if(!("function"in Z))break;if(C$.debug("[loopEventHandler] tool_start",{toolName:Z.function.name,toolKind:J.toolKind}),["TaskCreate","TaskUpdate","TaskList"].includes(Z.function.name))break;try{let q=JSON.parse(Z.function.arguments),G=v6(Z.function.name,q);$.sessionActions.addToolMessage(G,{toolName:Z.function.name,phase:"start",summary:G,params:q})}catch(q){C$.error("[loopEventHandler] onToolStart error:",q)}break}case"tool_result":{let Z=J.toolCall;if(!("function"in Z))break;C$.debug("[loopEventHandler] tool_result",{toolName:Z.function.name,success:J.result.success});let q=R6(Z.function.name,J.result);$.sessionActions.addToolMessage(q.summary,{toolName:Z.function.name,phase:"complete",summary:q.summary,detail:q.detail});break}case"token_usage":$.sessionActions.updateTokenUsage(J.usage);break;case"compaction":if($.sessionActions.setCompacting(J.phase==="start"),J.phase==="end")$.sessionActions.resetTokenUsage();break;case"turn_start":C$.debug("[loopEventHandler] turn_start",{turn:J.turn,maxTurns:J.maxTurns}),$.sessionActions.updateTokenUsage({turnCount:J.turn}),Y=!1;break;case"task_update":$.appActions.setTasks(J.tasks);break;case"steering_applied":for(let Z=0;Z<J.count;Z++)$.commandActions.dequeueCommand();break;case"subagent_spawned":case"subagent_completed":break;default:{let Z=J}}}}function E8($){let{text:Q,images:Y,parts:J}=$;if(Y.length===0)return Q;let Z=[];for(let q of J)if(q.type==="text")Z.push({type:"text",text:q.text});else Z.push({type:"image_url",image_url:{url:`data:${q.mimeType};base64,${q.base64}`}});return Z}function P6($){return{role:$.role,content:$.content}}function I6($){if(!$.restoredContextMessages||$.restoredVisibleMessageCount<=0)return $.messages.map(P6);let Q=$.messages.slice($.restoredVisibleMessageCount).map(P6);return[...$.restoredContextMessages,...Q]}function u4($){return typeof $==="object"&&$!==null&&$.action==="invoke_skill"&&typeof $.skillName==="string"}function x4($){return typeof $==="object"&&$!==null&&$.action==="invoke_custom_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function d4($){return typeof $==="object"&&$!==null&&$.action==="invoke_plugin_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function l4($){return typeof $==="object"&&$!==null&&$.action==="invoke_once_model"&&typeof $.modelId==="string"&&typeof $.prompt==="string"}function r4($,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),!0}case"clear_screen":return J.clearMessages(),J.setError(null),J.resetTokenUsage(),Y.setTasks([]),!0;case"compact_completed":case"compact_fallback":return J.resetTokenUsage(),!0;case"exit_application":return F1(0),!0;default:return!1}}async function S6($,Q,Y,J,Z){let{text:q}=$;if(!M6(q))return{type:"not_slash"};let G={cwd:N0(),sessionId:Z,signal:J},X=await C6(q,G);if(X.message){if(r4(X.message,X.data,Q,Y))return{type:"handled",commandResult:{success:!0}}}if(u4(X.data)){let{skillName:U,skillArgs:F}=X.data,O=F?`Please use the "${U}" skill to help me with: ${F}`:`Please use the "${U}" skill.`;return Y.addUserMessage(O),{type:"continue_as_agent",result:{userDisplayMessage:O,agentInput:{displayText:O,text:O,images:[],parts:[{type:"text",text:O}]},userMessageAlreadyAdded:!0}}}if(x4(X.data)){let{commandName:U,processedContent:F}=X.data;Y.addUserMessage(q);let O=`# Custom Command: /${U}
4
+
5
+ The user has invoked the custom command "/${U}". Follow the instructions below to complete the task.
6
+
7
+ ---
8
+
9
+ ${F}
10
+
11
+ ---
12
+
13
+ Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:q,agentInput:{displayText:q,text:O,images:[],parts:[{type:"text",text:O}]},userMessageAlreadyAdded:!0}}}if(d4(X.data)){let{commandName:U,pluginName:F,processedContent:O}=X.data;Y.addUserMessage(q);let _=`# Plugin Command: /${U}
14
+
15
+ The user has invoked the plugin command "/${U}" from plugin "${F}". Follow the instructions below to complete the task.
16
+
17
+ ---
18
+
19
+ ${O}
20
+
21
+ ---
22
+
23
+ Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:q,agentInput:{displayText:q,text:_,images:[],parts:[{type:"text",text:_}]},userMessageAlreadyAdded:!0}}}if(l4(X.data)){let{modelId:U,prompt:F}=X.data;return Y.addUserMessage(F),{type:"continue_as_agent",result:{userDisplayMessage:F,agentInput:{displayText:F,text:F,images:[],parts:[{type:"text",text:F}]},userMessageAlreadyAdded:!0,onceModelId:U}}}if(!X.success&&X.error)return Y.addAssistantMessage(`${X.error}`),{type:"handled",commandResult:{success:X.success,output:X.message,error:X.error,metadata:X.data}};let K=X.message;if(X.success&&typeof K==="string"&&K.trim()!=="")Y.addAssistantMessage(K);return{type:"handled",commandResult:{success:X.success,output:X.message,error:X.error,metadata:X.data}}}import{useMemoizedFn as h8}from"ahooks";import{useEffect as a4,useRef as m8}from"react";function T6($){let Q=m8(void 0),Y=m8(void 0),J=m8(void 0),Z=h8(async()=>{if(J.current)return J.current;let X=Q.current,K=Y.current;if(!X&&!K)return;Q.current=void 0,Y.current=void 0;let U=(async()=>{try{await X?.destroy()}finally{await K?.dispose()}})();J.current=U;try{await U}finally{if(J.current===U)J.current=void 0}}),q=h8(async(X)=>{let K=X?.sessionId??$.sessionId,U=!!X?.modelId&&X.modelId!==$.modelId,F;if(!U&&K){if(Y.current&&Y.current.sessionId!==K)await Z();if(!Y.current)Y.current=await k6.create({sessionId:K,workspaceRoot:N0(),modelId:X?.modelId??$.modelId});else await Y.current.refresh({modelId:X?.modelId??$.modelId});F=await S$.createWithRuntime(Y.current,{sessionId:K,systemPrompt:X?.systemPrompt??$.systemPrompt,appendSystemPrompt:X?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:X?.maxTurns??$.maxTurns,modelId:X?.modelId??$.modelId})}else F=await S$.create({systemPrompt:X?.systemPrompt??$.systemPrompt,appendSystemPrompt:X?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:X?.maxTurns??$.maxTurns,modelId:X?.modelId??$.modelId});return Q.current=F,F}),G=h8((X)=>{if(!Y.current)return{accepted:!1,queued:0,reason:"no_active_turn"};return Y.current.enqueueSteering(X,{allowBeforeTurn:!0})});return a4(()=>{let X=o$(Z);return()=>{X(),Z().catch(()=>{return})}},[Z]),{agentRef:Q,createAgent:q,cleanupAgent:Z,steerActiveTurn:G}}import{useMemoizedFn as O$}from"ahooks";import{useEffect as o4,useRef as i$}from"react";function f6($){let Q=0;for(let Y of $)if(Y===`
24
+ `)Q++;return Q}function D6($,Q){let Y=Q?.flushTimeout??300,J=Q?.minLinesToFlush??5,Z=Q?.minCharsToFlush??400,q=i$(""),G=i$(null),X=i$(""),K=i$(null),U=O$(()=>{if(q.current){let W=q.current,w=$.appendAssistantContent(W);K$(w,W),q.current=""}if(G.current)clearTimeout(G.current),G.current=null}),F=O$(()=>{if(X.current)$.appendThinkingContent(X.current),X.current="";if(K.current)clearTimeout(K.current),K.current=null}),O=O$((W)=>{q.current+=W;let w=q.current;if(f6(w)>=J||w.length>=Z){U();return}if(!G.current)G.current=setTimeout(U,Y)}),_=O$((W)=>{X.current+=W;let w=X.current;if(f6(w)>=J||w.length>=Z){F();return}if(!K.current)K.current=setTimeout(F,Y)}),z=O$(()=>{if(q.current="",G.current)clearTimeout(G.current),G.current=null;if(X.current="",K.current)clearTimeout(K.current),K.current=null}),N=O$(()=>{if(G.current)clearTimeout(G.current),G.current=null;if(K.current)clearTimeout(K.current),K.current=null;let W=q.current,w=X.current;return q.current="",X.current="",{extraContent:W,extraThinking:w}});return o4(()=>{return()=>{z()}},[z]),{batchAppendContent:O,batchAppendThinking:_,flushContentBuffer:U,flushThinkingBuffer:F,resetStreamingBuffers:z,drainPendingBuffers:N}}var j6=f1("UI"),h6=($,Q,Y,J,Z)=>{let q=T1(),G=iQ(),X=U$(),K=r$(),U=S1(),F=k1(),O=_6(),_=i4(!1),{createAgent:z,steerActiveTurn:N}=T6({sessionId:G,systemPrompt:$,appendSystemPrompt:Q,maxTurns:J}),W=D6(U);V6(()=>{return()=>{W.resetStreamingBuffers()}},[W.resetStreamingBuffers]),V6(()=>{if(!K)U.setCurrentThinkingContent(null)},[K,U]);let w=g8(()=>{if(!q)return;Z?.();let{extraContent:R,extraThinking:S}=W.drainPendingBuffers();O.abort("user-cancel"),F.setTasks([]);let A=D1().session.currentStreamingMessageId;if(A){if(R)K$(A,R);a$(A)}if(U.finalizeStreamingMessage(R,S),!_.current)U.addAssistantMessage("任务已停止"),_.current=!0}),L=g8(async(R)=>{let S=!1,A,b=R;try{await p8();let v=O.getAbortController()??O.createAbortController(),B=await S6(R,F,U,v.signal,G);if(B.type==="handled")return B.commandResult;if(B.type==="continue_as_agent")S=B.result.userMessageAlreadyAdded,A=B.result.onceModelId,b=B.result.agentInput;let I=K1.getInstance(),V,p=await I.executeUserPromptSubmitHooks(b.text,{projectDir:N0(),sessionId:G,permissionMode:X,hasImages:b.images.length>0,imageCount:b.images.length});if(!p.proceed){if(p.warning)U.addAssistantMessage(`${p.warning}`);return{success:!1,error:"blocked by hook"}}if(p.updatedPrompt)b={...b,text:p.updatedPrompt,displayText:p.updatedPrompt,parts:[{type:"text",text:p.updatedPrompt},...b.parts.filter((P)=>P.type==="image")]};if(p.contextInjection)V=p.contextInjection;if(!S)U.addUserMessage(b.displayText);let r=E8(b),a=await z(A?{modelId:A}:void 0);if(v.signal.aborted)return j6.info("[handleCommandSubmit] Agent 创建期间已被中止"),{success:!1,error:"aborted"};let t=I6(D1().session);if(V)t.push({role:"system",content:`<user-prompt-submit-hook>
25
+ ${V}
26
+ </user-prompt-submit-hook>`});let D={messages:t,userId:"cli-user",sessionId:G,workspaceRoot:N0(),signal:v.signal,confirmationHandler:Y,permissionMode:X},C={contentDeltaCount:0,contentDeltaTotalLen:0},y=y6({sessionActions:U,appActions:F,commandActions:O,streamingBuffer:W,thinkingModeEnabled:K,getStreamingMessageId:()=>D1().session.currentStreamingMessageId,signal:v.signal},C),x=await E6(a.chatStream(r,D,{stream:!0,onTurnLimitReached:Y?async(P)=>{let i=await Y.requestConfirmation({type:"maxTurnsExceeded",message:`已进行 ${P.turnsCount} 轮对话。是否继续?`,risks:["继续执行可能导致更长的等待时间","可能产生更多的 API 费用"]});return{continue:i.approved,reason:i.reason}}:void 0}),y);if(x.metadata?.outputTruncated)U.addAssistantMessage("输出因达到 token 上限被截断,部分内容可能不完整。");let u=x.finalMessage||"";if(j6.debug("[handleCommandSubmit] final reply",{success:x.success,outputLength:u.length,turnsCount:x.metadata?.turnsCount,toolCallsCount:x.metadata?.toolCallsCount}),!x.success&&x.error?.type==="api_error"){let P=x.error.message||"请求失败,请检查网络连接和 API 配置";return U.addAssistantMessage(P),{success:!1,error:P}}if(!u||u.trim()===""){let P=x.metadata?.abortReason;if(!_.current&&C.contentDeltaCount===0&&P!=="interrupt")return U.addAssistantMessage("已取消"),{success:!0,output:"已取消"};return{success:!0,output:u??""}}return{success:!0,output:u}}catch(v){if(_.current)return{success:!1,error:"aborted"};let B=f8(v);return U.addAssistantMessage(`${B.displayMessage}`),{success:!1,error:B.displayMessage}}});return{executeCommand:g8(async(R)=>{if(!R.text.trim()&&R.images.length===0)return;if(q){if(R.text.trimStart().startsWith("/")){U.addAssistantMessage("活动回合中不能执行 slash command;请先停止任务或等待完成。");return}await p8();let A=await K1.getInstance().executeUserPromptSubmitHooks(R.text,{projectDir:N0(),sessionId:G,permissionMode:X,hasImages:R.images.length>0,imageCount:R.images.length});if(!A.proceed){if(A.warning)U.addAssistantMessage(A.warning);return}let b=R;if(A.updatedPrompt)b={...R,text:A.updatedPrompt,parts:[{type:"text",text:A.updatedPrompt},...R.parts.filter((I)=>I.type==="image")]};if(A.contextInjection){let I=`<user-prompt-submit-hook>
27
+ ${A.contextInjection}
28
+ </user-prompt-submit-hook>`;b={...b,text:`${b.text}
29
+
30
+ ${I}`,parts:[...b.parts,{type:"text",text:`
31
+
32
+ ${I}`}]}}let v=E8(b),B=N(v);if(!B.accepted){let I=B.reason==="queue_full"?"补充指令队列已满,请等待当前任务处理后重试。":"当前任务正在结束,补充指令未入队,请稍后重试。";U.addAssistantMessage(I);return}O.enqueueCommand(R),U.addUserMessage(R.displayText);return}F.setTasks([]),_.current=!1;let S=O.createAbortController();W.resetStreamingBuffers(),U.clearFinalizingStreamingMessageId(),O.setProcessing(!0);try{let A=await L(R);if(!A.success&&A.error&&A.error!=="aborted")U.setError(A.error)}catch(A){let b=f8(A);if(b.isAbort);else U.setError(`执行失败: ${b.displayMessage}`)}finally{if(O.getAbortController()===S)O.setProcessing(!1),O.clearAbortController(S),U.setCurrentThinkingContent(null)}}),handleAbort:w,isProcessing:q}};import{useMemoizedFn as n$}from"ahooks";import{useState as m6}from"react";var g6=()=>{let[$,Q]=m6([]),[Y,J]=m6(-1),Z=n$((K,U)=>{let F={display:K,pasteMappings:U?new Map(U):new Map};Q((O)=>[...O,F]),J(-1)}),q=n$(()=>{if($.length===0)return null;let K=Y===-1?$.length-1:Math.max(0,Y-1);return J(K),$[K]||null}),G=n$(()=>{if(Y===-1)return null;let K=Y+1;if(K>=$.length)return J(-1),null;else return J(K),$[K]||null}),X=n$(()=>{J(-1)});return{commandHistory:$,historyIndex:Y,addToHistory:Z,getPreviousCommand:q,getNextCommand:G,resetHistoryIndex:X}};import{useMemoizedFn as t$}from"ahooks";import{useMemo as n4,useRef as p6,useState as t4}from"react";var c6=()=>{let[$,Q]=t4({isVisible:!1,details:null,resolver:null}),Y=p6(null),J=p6([]),Z=t$((U)=>{Y.current=U,Q({isVisible:Boolean(U),details:U?.details??null,resolver:U?.resolve??null})}),q=t$((U)=>{return new Promise((F)=>{let O={details:U,resolve:F};if(!Y.current){Z(O);return}J.current.push(O)})}),G=t$((U)=>{if(Y.current)Y.current.resolve(U);let F=J.current.shift()??null;Z(F)}),X=t$(()=>{if(Y.current)Y.current.resolve({approved:!1,reason:"__aborted__"});for(let U of J.current)U.resolve({approved:!1,reason:"__aborted__"});J.current=[],Z(null)}),K=n4(()=>({requestConfirmation:q}),[q]);return{confirmationState:$,confirmationHandler:K,handleResponse:G,dismissAll:X}};import{useMemoizedFn as a1}from"ahooks";import{useRef as u6,useState as s4}from"react";var s$="␞",e$="␟";function $8($){return`${s$}PASTE:${$}:`}function c8(){return e$}var mZ=new RegExp(`${s$}PASTE:(\\d+):[\\s\\S]*?${e$}`,"g");function e4($){return $.includes(s$)&&$.includes(e$)}function x6($="",Q=0){let[Y,J]=s4({value:$,cursorPosition:Q}),Z=u6(0),q=u6(new Map),G=a1((z)=>{J((N)=>({value:z,cursorPosition:N.cursorPosition}));for(let N of q.current.keys()){let W=$8(N);if(!z.includes(W))q.current.delete(N)}}),X=a1((z)=>{J((N)=>({...N,cursorPosition:Math.max(0,Math.min(z,N.value.length))}))}),K=a1(()=>{J({value:"",cursorPosition:0}),q.current.clear()}),U=a1((z)=>{Z.current+=1;let N=Z.current;return q.current.set(N,{type:"text",data:z}),N}),F=a1((z,N)=>{Z.current+=1;let W=Z.current;return q.current.set(W,{type:"image",data:z,mimeType:N}),W}),O=a1((z)=>{for(let[N,W]of z)if(q.current.set(N,W),N>=Z.current)Z.current=N}),_=a1((z)=>{let N=[],W=[];if(!e4(z)){let I=z.trim();if(I)W.push({type:"text",text:I});return{displayText:z,text:z,images:N,parts:W}}let w=new RegExp(`${s$}PASTE:(\\d+):[\\s\\S]*?${e$}`,"g"),L=Array.from(z.matchAll(w)),H=0,R="",S="";for(let I of L){let V=I.index,p=V+I[0].length,r=parseInt(I[1],10),a=q.current.get(r);if(V>H){let t=z.slice(H,V);W.push({type:"text",text:t}),R+=t,S+=t}if(!a)R+=I[0],S+=I[0],W.push({type:"text",text:I[0]});else if(a.type==="text")R+=a.data,S+=a.data,W.push({type:"text",text:a.data});else{let t={id:r,base64:a.data,mimeType:a.mimeType};N.push(t),W.push({type:"image",...t}),S+=`[Image #${r}]`}H=p}if(H<z.length){let I=z.slice(H);W.push({type:"text",text:I}),R+=I,S+=I}let A=[];for(let I of W)if(I.type==="text"&&A.length>0&&A[A.length-1].type==="text")A[A.length-1].text+=I.text;else A.push(I);let b=0,v=A.length;while(b<A.length&&A[b].type==="text"&&A[b].text.trim()==="")b++;while(v>b&&A[v-1].type==="text"&&A[v-1].text.trim()==="")v--;let B=A.slice(b,v);return{displayText:S.trim(),text:R.trim(),images:N,parts:B}});return{value:Y.value,cursorPosition:Y.cursorPosition,setValue:G,setCursorPosition:X,clear:K,pasteMap:q.current,addPasteMapping:U,addImagePasteMapping:F,restorePasteMappings:O,resolveInput:_}}import{useMemoizedFn as t6}from"ahooks";import{useInput as q9}from"ink";import{useEffect as s6,useRef as e6,useState as l8}from"react";import $9 from"fast-glob";import Q9 from"fuse.js";import{useEffect as d6,useMemo as u8,useState as x8}from"react";var z$=null,J9=5000;function Y9($,Q){let Y=[...$.matchAll(/(?:^|\s)(@(?:"[^"]*"|(?:[^\\ ]|\\ )*))/g)];for(let J of Y){let Z=J[1],q=J.index+(J[0].length-Z.length),G=q+Z.length;if(Q>=q&&Q<=G){let X=Z.slice(1),K=!1;if(X.startsWith('"')){if(K=!0,X=X.slice(1),X.endsWith('"'))X=X.slice(0,-1)}return{hasQuery:!0,query:X,startIndex:q,endIndex:G,quoted:K}}}return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1}}var Z9=[...d8.map(($)=>`${$}/**`),...d8,...l6.map(($)=>`**/${$}`)];function r6($,Q,Y={}){let{cwd:J=N0(),maxSuggestions:Z=15,ignorePatterns:q=Z9,debounceDelay:G=300,fuzzyMatch:X=!0}=Y,[K,U]=x8([]),[F,O]=x8(!1),[_,z]=x8(0),N=u8(()=>JSON.stringify(q),[q]),W=u8(()=>{if(Q===void 0)return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1};return Y9($,Q)},[$,Q]);d6(()=>{if(!$.includes("@")){U([]),O(!1);return}let L=Date.now();if(z$&&z$.cwd===J&&z$.ignoreKey===N&&L-z$.timestamp<J9){U(z$.files),O(!1);return}let H=!1,S=setTimeout(async()=>{O(!0);try{let b=(await $9("**/*",{cwd:J,dot:!1,followSymbolicLinks:!1,onlyFiles:!1,markDirectories:!0,unique:!0,ignore:q})).map((v)=>v.replace(/\\/g,"/"));if(!H)U(b),z$={cwd:J,ignoreKey:N,files:b,timestamp:L}}catch(A){if(console.error("Failed to load files for @ completion:",A),!H)U([])}finally{if(!H)O(!1)}},G);return()=>{H=!0,clearTimeout(S)}},[$,J,G,N]);let w=u8(()=>{if(!W.hasQuery||K.length===0)return[];let L=W.query.toLowerCase();if(L==="")return K.slice(0,Z);if(X)return new Q9(K,{threshold:0.4,ignoreLocation:!0,minMatchCharLength:1}).search(L).slice(0,Z).map((S)=>S.item);return K.filter((H)=>H.toLowerCase().includes(L)).slice(0,Z)},[W,K,Z,X]);return d6(()=>{z(0)},[w]),{...W,suggestions:w,selectedIndex:_,loading:F}}function X9($,Q=!1){if($.includes(" ")||Q)return`@"${$}"`;return`@${$}`}function a6($,Q,Y){if(!Q.hasQuery)return{newInput:$,newCursorPos:$.length};let J=X9(Y,Q.quoted),Z=$.slice(0,Q.startIndex),q=$.slice(Q.endIndex),G=Z+J+" "+q,X=Q.startIndex+J.length+1;return{newInput:G,newCursorPos:X}}import{useMemoizedFn as o6}from"ahooks";import{useEffect as i6,useRef as n6}from"react";var I0=($,Q)=>{let Y=n6(!1),J=n6(null),Z=o6(()=>{if(J.current)clearTimeout(J.current);J.current=setTimeout(()=>{W1().setAwaitingSecondCtrlC(!1),Y.current=!1,J.current=null},3000)}),q=()=>{k$().shutdown("SIGINT",0)},G=o6(()=>{if(!Y.current){if(Y.current=!0,$&&Q)Q();W1().setAwaitingSecondCtrlC(!0),Z()}else{if(J.current)clearTimeout(J.current),J.current=null;W1().setAwaitingSecondCtrlC(!1),q()}});return i6(()=>{if($){if(W1().setAwaitingSecondCtrlC(!1),Y.current=!1,J.current)clearTimeout(J.current),J.current=null}},[$]),i6(()=>{return()=>{if(J.current)clearTimeout(J.current)}},[]),G};var Q8=f1("UI"),JJ=($,Q,Y,J,Z,q,G,X,K,U)=>{let O=a0()==="main-input",_=$.value,z=$.setValue,N=$.cursorPosition,W=S1(),w=k1(),L=d$(),H=L?J8(L):!1,[R,S]=l8(!1),[A,b]=l8([]),[v,B]=l8(0),I=r6(_,N,{cwd:N0(),maxSuggestions:10}),V=I0(G||!1,q),p=e6(0),r=500,a=e6(!1);s6(()=>{if(G)a.current=!1},[G]),s6(()=>{if(I.hasQuery&&I.suggestions.length>0){let C=I.suggestions.map((y)=>({command:y,description:$J(y)?`Directory: ${y}`:`File: ${y}`,matchScore:1}));b(C),S(!0),B(0)}else if(_.startsWith("/"))if(_.includes(" "))S(!1),b([]);else{let y=QJ(_);b(y),S(y.length>0),B(0)}else S(!1),b([])},[_,I.hasQuery,I.suggestions]);let t=t6(()=>{W.clearMessages(),W.setError(null)}),D=t6(()=>{Q8.debug("[DIAG] handleSubmit called:",{input:_,showSuggestions:R});let C=_.trim();if(C){let y=$.resolveInput(C);Q8.debug("[DIAG] Submitting command:",{displayText:C,textLength:y.text.length,imageCount:y.images.length}),S(!1),b([]);let x=$.pasteMap.size>0?new Map($.pasteMap):new Map;Z(C,x),$.clear(),Q(y),Q8.debug("[DIAG] Command submitted to onSubmit callback")}else Q8.debug("[DIAG] Empty command, not submitting")});return q9((C,y)=>{if(C==="?"&&!_){K?.(),setTimeout(()=>$.clear(),0);return}if(y.backspace||y.delete||y.leftArrow||y.rightArrow||y.pageUp||y.pageDown||!y.ctrl&&!y.meta&&!y.escape&&!y.tab&&!y.upArrow&&!y.downArrow&&!y.return&&!(C==="?"&&!_))return;if(y.ctrl&&C==="c"||y.meta&&C==="c"||y.ctrl&&C==="d"||y.meta&&C==="d"){V();return}if(y.ctrl&&C==="l"||y.meta&&C==="l"){t();return}if(y.ctrl&&C==="t"||y.meta&&C==="t"){W.toggleThinkingExpanded();return}if(y.ctrl&&C==="o"||y.meta&&C==="o"){W.toggleHistoryExpanded();return}if(y.escape){if(U)K?.();else if(G&&q){if(a.current)return;a.current=!0,q()}else if(R)S(!1),b([]);else if(_){let u=Date.now();if(u-p.current<500)$.clear(),p.current=0;else p.current=u}return}if(y.tab&&y.shift){X?.();return}if(y.tab){if(R&&A.length>0){let u=A[v].command;if(I.hasQuery&&I.suggestions.includes(u)){let{newInput:P,newCursorPos:i}=a6(_,I,u);z(P),$.setCursorPosition(i)}else{let P=u+" ";z(P),$.setCursorPosition(P.length)}S(!1),b([])}else if(H)w.toggleThinkingMode();return}if(y.return){D();return}if(y.upArrow){if(R&&A.length>0){let u=A.length-1;B((P)=>P>0?P-1:u)}else{let u=Y();if(u){if(u.pasteMappings.size>0)$.restorePasteMappings(u.pasteMappings);z(u.display),$.setCursorPosition(u.display.length)}}return}if(y.downArrow){if(R&&A.length>0){let u=A.length-1;B((P)=>P<u?P+1:0)}else{let u=J();if(u){if(u.pasteMappings.size>0)$.restorePasteMappings(u.pasteMappings);z(u.display),$.setCursorPosition(u.display.length)}}return}},{isActive:O}),{handleSubmit:D,showSuggestions:R,suggestions:A,selectedSuggestionIndex:v}};import z9 from"ansi-escapes";import{useStdout as _9}from"ink";import{useCallback as N9,useEffect as F9,useRef as W9}from"react";import{useStdout as G9}from"ink";import{debounce as U9}from"lodash-es";import{useEffect as K9,useState as O9}from"react";function _$($=200){let{stdout:Q}=G9(),[Y,J]=O9(Q.columns||80);return K9(()=>{let Z=U9(()=>{J(Q.columns||80)},$);return Z(),Q.on("resize",Z),()=>{Q.off("resize",Z),Z.cancel()}},[Q,$]),Y}function YJ(){let{stdout:$}=_9(),Q=_$(),Y=W9(!0),J=Q0((q)=>q.session.actions.incrementClearCount),Z=N9(()=>{if($)$.write(z9.clearTerminal);J()},[$,J]);return F9(()=>{if(Y.current){Y.current=!1;return}let q=setTimeout(()=>{Z()},300);return()=>{clearTimeout(q)}},[Q,Z]),{refreshStatic:Z}}import ZJ from"node:fs";import H9 from"node:os";import r8 from"node:path";import{MultiSelect as L9}from"@inkjs/ui";import{useMemoizedFn as Y8}from"ahooks";import{Box as n,Text as l,useFocus as w9,useFocusManager as B9,useInput as qJ}from"ink";import Z8 from"ink-select-input";import b9 from"ink-spinner";import T$ from"ink-text-input";import{useEffect as XJ,useState as N$}from"react";import{jsxDEV as M}from"react/jsx-dev-runtime";var A9=[{label:"Glob - 文件搜索",value:"Glob"},{label:"Grep - 内容搜索",value:"Grep"},{label:"Read - 读取文件",value:"Read"},{label:"Write - 写入文件",value:"Write"},{label:"Edit - 编辑文件",value:"Edit"},{label:"Bash - 执行命令",value:"Bash"},{label:"所有工具 (不限制)",value:"all"}],v9=[{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 R9($){if(!$||$.trim()==="")return"名称不能为空";if(!/^[a-z0-9-]+$/.test($))return"名称只能包含小写字母、数字和连字符";if($.startsWith("-")||$.endsWith("-"))return"名称不能以连字符开头或结尾";return null}function f$({onComplete:$,onCancel:Q,initialConfig:Y}){let[J,Z]=N$(Y?"name":"mode"),[q,G]=N$({name:Y?.name||"",description:Y?.description||"",tools:Y?.tools||[],color:Y?.color,location:Y?.location||"project",systemPrompt:Y?.systemPrompt||""}),[X,K]=N$(""),[U,F]=N$(!1),[O,_]=N$(""),[z,N]=N$(Y?"edit":"manual"),{focus:W}=B9(),L={manual:["mode","name","description","tools","color","location","systemPrompt","confirm"],ai:["mode","aiPrompt","aiGenerating","confirm"],edit:["name","description","tools","color","location","systemPrompt","confirm"]}[z];XJ(()=>{if(J==="name"||J==="description"||J==="systemPrompt"||J==="aiPrompt")return;W(`step-${J}`)},[J,W]);let H=Y8(()=>{let v=L.indexOf(J);if(v<L.length-1)Z(L[v+1])}),R=Y8(()=>{if(O)_("");if(J==="confirm"&&z==="ai"){Z("aiPrompt");return}let v=L.indexOf(J);if(v>0)Z(L[v-1]);else Q()}),S=Y8(async()=>{F(!0),_("");try{let v=await S$.create(),B=`你是一个 Subagent 配置生成专家。用户会描述他们想要创建的 agent,你需要根据描述生成一个完整的 agent 配置。
33
+
34
+ ## 可用工具列表
35
+
36
+ - **Glob**: 文件模式匹配(例如:查找所有 .ts 文件)
37
+ - **Grep**: 代码内容搜索(例如:搜索特定函数调用)
38
+ - **Read**: 读取文件内容
39
+ - **Write**: 写入/创建文件
40
+ - **Edit**: 编辑文件(字符串替换)
41
+ - **Bash**: 执行命令行命令
42
+
43
+ ## 可用颜色
44
+
45
+ - red, blue, green, yellow, purple, orange, pink, cyan
46
+
47
+ ## 输出格式
48
+
49
+ 你必须以 JSON 格式返回配置,格式如下:
50
+
51
+ \`\`\`json
52
+ {
53
+ "name": "agent-name",
54
+ "description": "简洁的一句话描述(英文)",
55
+ "tools": ["Glob", "Grep", "Read"],
56
+ "color": "blue",
57
+ "systemPrompt": "详细的系统提示词,说明这个 agent 的职责、工作方式、输出格式等"
58
+ }
59
+ \`\`\`
60
+
61
+ ## 注意事项
62
+
63
+ 1. **name**: 只能包含小写字母、数字和连字符(kebab-case),例如:code-reviewer
64
+ 2. **description**: 一句话说明用途,建议以 "Fast agent specialized for..." 开头
65
+ 3. **tools**: 根据任务选择必要的工具,不要选择太多
66
+ 4. **color**: 选择一个合适的颜色用于 UI 区分
67
+ 5. **systemPrompt**: 详细说明 agent 的职责、使用的工具、输出格式等,使用 Markdown 格式
68
+
69
+ **重要**:请直接返回 JSON,不要添加任何额外的解释或文字。`,V=(await v.chatWithSystem(`你是一个 Subagent 配置生成专家。用户会描述他们想要创建的 agent,你需要根据描述生成一个完整的 agent 配置。
70
+
71
+ ## 可用工具列表
72
+
73
+ - **Glob**: 文件模式匹配(例如:查找所有 .ts 文件)
74
+ - **Grep**: 代码内容搜索(例如:搜索特定函数调用)
75
+ - **Read**: 读取文件内容
76
+ - **Write**: 写入/创建文件
77
+ - **Edit**: 编辑文件(字符串替换)
78
+ - **Bash**: 执行命令行命令
79
+
80
+ ## 可用颜色
81
+
82
+ - red, blue, green, yellow, purple, orange, pink, cyan
83
+
84
+ ## 输出格式
85
+
86
+ 你必须以 JSON 格式返回配置,格式如下:
87
+
88
+ \`\`\`json
89
+ {
90
+ "name": "agent-name",
91
+ "description": "简洁的一句话描述(英文)",
92
+ "tools": ["Glob", "Grep", "Read"],
93
+ "color": "blue",
94
+ "systemPrompt": "详细的系统提示词,说明这个 agent 的职责、工作方式、输出格式等"
95
+ }
96
+ \`\`\`
97
+
98
+ ## 注意事项
99
+
100
+ 1. **name**: 只能包含小写字母、数字和连字符(kebab-case),例如:code-reviewer
101
+ 2. **description**: 一句话说明用途,建议以 "Fast agent specialized for..." 开头
102
+ 3. **tools**: 根据任务选择必要的工具,不要选择太多
103
+ 4. **color**: 选择一个合适的颜色用于 UI 区分
104
+ 5. **systemPrompt**: 详细说明 agent 的职责、使用的工具、输出格式等,使用 Markdown 格式
105
+
106
+ **重要**:请直接返回 JSON,不要添加任何额外的解释或文字。`,X)).trim(),p=V.match(/```(?:json)?\s*\n([\s\S]*?)\n```/);if(p)V=p[1];let r=JSON.parse(V);if(!r.name||!r.description||!r.systemPrompt)throw Error("Missing required fields: name, description, or systemPrompt");if(!/^[a-z0-9]+(-[a-z0-9]+)*$/.test(r.name))throw Error("Invalid name format. Must be kebab-case (lowercase, numbers, hyphens only)");G({name:r.name,description:r.description,tools:Array.isArray(r.tools)?r.tools:[],color:r.color||"blue",location:"project",systemPrompt:r.systemPrompt}),Z("confirm")}catch(v){_(v instanceof Error?v.message:String(v))}finally{F(!1)}});XJ(()=>{if(J==="aiGenerating"&&!U&&!O)S()},[J,U,O,S]);let A=Y8(async()=>{try{let v=q.location==="project"?r8.join(N0(),".blade","agents"):r8.join(H9.homedir(),".blade","agents");await ZJ.promises.mkdir(v,{recursive:!0});let B=["---",`name: ${q.name}`,`description: ${q.description}`];if(q.tools.length>0&&!q.tools.includes("all")){B.push("tools:");for(let p of q.tools)B.push(` - ${p}`)}if(q.color)B.push(`color: ${q.color}`);B.push("---");let I=[B.join(`
107
+ `),"",`# ${q.name} Subagent`,"",q.systemPrompt||"你是一个专门的代理,负责执行特定任务。",""].join(`
108
+ `),V=r8.join(v,`${q.name}.md`);await ZJ.promises.writeFile(V,I,"utf-8"),$()}catch(v){console.error("保存配置失败:",v)}}),b=I0(!1,Q);if(qJ((v,B)=>{if(B.escape)R();else if(B.ctrl&&v==="c"||B.meta&&v==="c")b()},{isActive:J!=="tools"}),J==="mode")return M(n,{flexDirection:"column",paddingY:1,children:[M(n,{marginBottom:1,children:M(l,{bold:!0,color:"cyan",children:"选择创建方式"},void 0,!1,void 0,this)},void 0,!1,void 0,this),M(n,{marginBottom:1,children:M(l,{dimColor:!0,children:"你可以手动配置每个细节,或让 AI 根据你的描述自动生成配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),M(Z8,{items:[{label:"AI 智能生成 - 根据描述自动生成完整配置",value:"ai"},{label:"手动配置 - 逐步配置每个选项",value:"manual"}],onSelect:(v)=>{if(v.value==="ai")N("ai"),Z("aiPrompt");else N("manual"),Z("name")}},void 0,!1,void 0,this),M(n,{marginTop:1,children:M(l,{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 M(n,{flexDirection:"column",paddingY:1,children:[M(n,{marginBottom:1,children:M(l,{bold:!0,color:"cyan",children:"AI 智能生成"},void 0,!1,void 0,this)},void 0,!1,void 0,this),M(n,{marginBottom:1,children:M(l,{dimColor:!0,children:'描述你想要创建的 Agent(例如:"一个专门用于代码审查的 agent,能够分析代码质量和潜在bug")'},void 0,!1,void 0,this)},void 0,!1,void 0,this),M(n,{marginBottom:1,children:[M(l,{color:"green",children:"描述: "},void 0,!1,void 0,this),M(T$,{value:X,onChange:K,onSubmit:(v)=>{if(!v.trim())return;Z("aiGenerating")}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),M(n,{children:M(l,{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 M(n,{flexDirection:"column",paddingY:1,children:[M(n,{marginBottom:1,children:M(l,{bold:!0,color:"red",children:"AI 生成失败"},void 0,!1,void 0,this)},void 0,!1,void 0,this),M(n,{marginBottom:1,children:M(l,{color:"red",children:O},void 0,!1,void 0,this)},void 0,!1,void 0,this),M(n,{marginBottom:1,children:M(l,{dimColor:!0,children:"按 ESC 返回修改描述"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return M(n,{flexDirection:"column",paddingY:1,children:[M(n,{marginBottom:1,children:M(l,{bold:!0,color:"yellow",children:[M(b9,{type:"dots"},void 0,!1,void 0,this)," AI 正在生成配置..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),M(n,{marginBottom:1,children:M(l,{dimColor:!0,children:['根据你的描述:"',X,'"']},void 0,!0,void 0,this)},void 0,!1,void 0,this),M(n,{marginBottom:1,children:M(l,{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 v=z==="edit";return M(n,{flexDirection:"column",paddingY:1,children:[M(n,{marginBottom:1,children:M(l,{bold:!0,color:"cyan",children:["Step 1/7: ",v?"Agent 名称(不可修改)":"输入 Agent 名称"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),M(n,{marginBottom:1,children:M(l,{dimColor:!0,children:v?"编辑模式下名称不可修改(修改名称相当于创建新 Agent)":"名称只能包含小写字母、数字和连字符(例如:code-reviewer)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),M(n,{marginBottom:1,children:[M(l,{color:"green",children:"名称: "},void 0,!1,void 0,this),v?M(l,{children:q.name},void 0,!1,void 0,this):M(T$,{value:q.name,onChange:(B)=>G({...q,name:B}),onSubmit:(B)=>{if(R9(B))return;H()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),M(n,{children:M(l,{dimColor:!0,children:v?"按 Enter 继续 | ESC 返回":"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),v&&M(T$,{value:"",onChange:()=>{},onSubmit:H,showCursor:!1},"edit-mode-dummy-input",!1,void 0,this)]},void 0,!0,void 0,this)}if(J==="description")return M(n,{flexDirection:"column",paddingY:1,children:[M(n,{marginBottom:1,children:M(l,{bold:!0,color:"cyan",children:"Step 2/7: 输入描述信息"},void 0,!1,void 0,this)},void 0,!1,void 0,this),M(n,{marginBottom:1,children:M(l,{dimColor:!0,children:"简短描述这个 Agent 的用途和使用场景(这将帮助主 Agent 决定何时使用它)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),M(n,{marginBottom:1,children:[M(l,{color:"green",children:"描述: "},void 0,!1,void 0,this),M(T$,{value:q.description,onChange:(v)=>G({...q,description:v}),onSubmit:(v)=>{if(!v.trim())return;H()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),M(n,{children:M(l,{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 M(y9,{config:q,setConfig:G,onNext:H,onPrev:R},void 0,!1,void 0,this);if(J==="color")return M(n,{flexDirection:"column",paddingY:1,children:[M(n,{marginBottom:1,children:M(l,{bold:!0,color:"cyan",children:"Step 4/7: 选择背景颜色"},void 0,!1,void 0,this)},void 0,!1,void 0,this),M(n,{marginBottom:1,children:M(l,{dimColor:!0,children:"为 Agent 选择一个颜色标识(用于在 UI 中区分不同的 Agents)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),M(Z8,{items:v9,onSelect:(v)=>{let B=v.value==="none"?void 0:v.value;G({...q,color:B}),H()}},void 0,!1,void 0,this),M(n,{marginTop:1,children:M(l,{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 M(n,{flexDirection:"column",paddingY:1,children:[M(n,{marginBottom:1,children:M(l,{bold:!0,color:"cyan",children:"Step 5/7: 选择保存位置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),M(n,{marginBottom:1,children:M(l,{dimColor:!0,children:"项目级配置仅在当前项目生效,用户级配置全局可用"},void 0,!1,void 0,this)},void 0,!1,void 0,this),M(Z8,{items:[{label:"项目级 (.blade/agents/) - 仅当前项目",value:"project"},{label:"用户级 (~/.blade/agents/) - 全局可用",value:"user"}],onSelect:(v)=>{G({...q,location:v.value}),H()}},void 0,!1,void 0,this),M(n,{marginTop:1,children:M(l,{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 M(n,{flexDirection:"column",paddingY:1,children:[M(n,{marginBottom:1,children:M(l,{bold:!0,color:"cyan",children:"Step 6/7: 输入系统提示词"},void 0,!1,void 0,this)},void 0,!1,void 0,this),M(n,{marginBottom:1,children:M(l,{dimColor:!0,children:"定义 Agent 的行为和职责(可选,留空将使用默认提示)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),M(n,{marginBottom:1,children:[M(l,{color:"green",children:"提示词: "},void 0,!1,void 0,this),M(T$,{value:q.systemPrompt,onChange:(v)=>G({...q,systemPrompt:v}),onSubmit:()=>H()},void 0,!1,void 0,this)]},void 0,!0,void 0,this),M(n,{children:M(l,{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 M(n,{flexDirection:"column",paddingY:1,children:[M(n,{marginBottom:1,children:M(l,{bold:!0,color:"cyan",children:"Step 7/7: 确认配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),M(n,{flexDirection:"column",paddingLeft:2,marginBottom:1,children:[M(l,{children:[M(l,{bold:!0,color:"green",children:["名称:"," "]},void 0,!0,void 0,this),M(l,{children:q.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this),M(l,{children:[M(l,{bold:!0,color:"green",children:["描述:"," "]},void 0,!0,void 0,this),M(l,{children:q.description},void 0,!1,void 0,this)]},void 0,!0,void 0,this),M(l,{children:[M(l,{bold:!0,color:"green",children:["工具:"," "]},void 0,!0,void 0,this),M(l,{children:q.tools.includes("all")?"所有工具":q.tools.join(", ")||"所有工具"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),M(l,{children:[M(l,{bold:!0,color:"green",children:["颜色:"," "]},void 0,!0,void 0,this),M(l,{children:q.color||"默认"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),M(l,{children:[M(l,{bold:!0,color:"green",children:["位置:"," "]},void 0,!0,void 0,this),M(l,{children:q.location==="project"?"项目级":"用户级"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),M(l,{children:[M(l,{bold:!0,color:"green",children:["提示词:"," "]},void 0,!0,void 0,this),M(l,{children:q.systemPrompt||"(使用默认)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),M(Z8,{items:[{label:"确认并保存",value:"save"},{label:"返回上一步",value:"back"},{label:"取消",value:"cancel"}],onSelect:(v)=>{if(v.value==="save")A();else if(v.value==="back")R();else Q()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}function y9({config:$,setConfig:Q,onNext:Y,onPrev:J}){let{isFocused:Z}=w9({id:"step-tools"});qJ((G,X)=>{if(X.escape)J()},{isActive:Z});let q=(G)=>{if(G.includes("all"))Q({...$,tools:["all"]});else Q({...$,tools:G});Y()};return M(n,{flexDirection:"column",paddingY:1,children:[M(n,{marginBottom:1,children:M(l,{bold:!0,color:"cyan",children:"Step 3/7: 选择可用工具"},void 0,!1,void 0,this)},void 0,!1,void 0,this),M(n,{marginBottom:1,children:M(l,{dimColor:!0,children:"方向键导航,空格切换勾选,Enter 确认进入下一步 | ESC 返回上一步"},void 0,!1,void 0,this)},void 0,!1,void 0,this),M(L9,{options:A9,defaultValue:$.tools,onSubmit:q},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import P9 from"node:fs";import{useMemoizedFn as i1}from"ahooks";import{Box as w0,Text as R0,useInput as I9}from"ink";import a8 from"ink-select-input";import{useEffect as M9,useMemo as GJ,useState as X8}from"react";import{jsxDEV as c}from"react/jsx-dev-runtime";var o8=10;function UJ({initialMode:$="menu",onComplete:Q,onCancel:Y}){let[J,Z]=X8($),[q,G]=X8(null),[X,K]=X8(0),[U,F]=X8(0),O=i1(()=>{V1.clear(),V1.loadFromStandardLocations(),K((B)=>B+1)}),_=GJ(()=>{return V1.getAllSubagents()},[X]),z=Math.ceil(_.length/o8)||1,N=GJ(()=>{let B=U*o8;return _.slice(B,B+o8)},[_,U]);M9(()=>{let B=Math.max(0,z-1);if(U>B)F(B)},[z,U]);let W=i1(()=>{if(U<z-1)F((B)=>B+1)}),w=i1(()=>{if(U>0)F((B)=>B-1)}),L=[{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"}],H=i1((B)=>{if(B.value==="cancel"){Y?.();return}Z(B.value)}),R=i1((B)=>{if(G(B.value),J==="edit")Z("editWizard");else if(J==="delete")Z("deleteConfirm")}),S=i1(async()=>{if(!q?.configPath)return;try{await P9.promises.unlink(q.configPath),O(),A()}catch(B){console.error("删除失败:",B)}}),A=i1(()=>{Z("menu"),G(null)}),b=I0(!1,Y);if(I9((B,I)=>{if(I.escape){if(J==="menu")Y?.();else if(J==="list"||J==="edit"||J==="delete")F(0),A();else if(J==="deleteConfirm")A()}else if(I.ctrl&&B==="c"||I.meta&&B==="c")b();else if(J==="list"){if(I.leftArrow||B==="h")w();else if(I.rightArrow||B==="l")W()}},{isActive:J!=="create"&&J!=="editWizard"}),J==="menu")return c(w0,{flexDirection:"column",paddingY:1,children:[c(w0,{marginBottom:1,children:c(R0,{bold:!0,color:"cyan",children:"Agents 管理"},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(a8,{items:L,onSelect:H},void 0,!1,void 0,this),c(w0,{marginTop:1,children:c(R0,{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==="list"){if(_.length===0)return c(w0,{flexDirection:"column",paddingY:1,children:[c(w0,{marginBottom:1,children:c(R0,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(w0,{paddingLeft:2,children:c(R0,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(w0,{marginTop:1,paddingLeft:2,children:c(R0,{color:"gray",children:"配置文件位置: .blade/agents/ 或 ~/.blade/agents/"},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(w0,{marginTop:1,paddingLeft:2,children:c(R0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return c(w0,{flexDirection:"column",paddingY:1,children:[c(w0,{marginBottom:1,children:[c(R0,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this),c(R0,{color:"gray",children:[" (共 ",_.length," 个)"]},void 0,!0,void 0,this),z>1&&c(R0,{color:"yellow",children:[" ","第 ",U+1,"/",z," 页"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),N.map((B)=>c(w0,{flexDirection:"column",paddingLeft:2,children:[c(w0,{children:c(R0,{children:[c(R0,{bold:!0,color:B.color||"white",children:["• ",B.name]},void 0,!0,void 0,this),c(R0,{color:"gray",children:[" - ",B.description]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),B.tools&&B.tools.length>0&&c(w0,{paddingLeft:2,children:c(R0,{color:"gray",children:["工具: ",B.tools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),B.configPath&&c(w0,{paddingLeft:2,children:c(R0,{color:"gray",dimColor:!0,children:B.configPath},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},B.name,!0,void 0,this)),c(w0,{marginTop:1,paddingLeft:2,children:z>1?c(R0,{dimColor:!0,children:"Left/Right to page | ESC 返回菜单"},void 0,!1,void 0,this):c(R0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}let v=(B)=>{if(_.length===0)return c(w0,{flexDirection:"column",paddingY:1,children:[c(w0,{marginBottom:1,children:c(R0,{bold:!0,color:"cyan",children:B},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(w0,{paddingLeft:2,children:c(R0,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(w0,{marginTop:1,paddingLeft:2,children:c(R0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);let I=_.map((V)=>({key:V.name,label:`${V.name} - ${V.description}`,value:V}));return c(w0,{flexDirection:"column",paddingY:1,children:[c(w0,{marginBottom:1,children:c(R0,{bold:!0,color:"cyan",children:B},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(a8,{items:I,onSelect:R},void 0,!1,void 0,this),c(w0,{marginTop:1,children:c(R0,{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==="create")return c(f$,{onComplete:()=>{O(),A()},onCancel:A},void 0,!1,void 0,this);if(J==="edit")return v("编辑 Agent");if(J==="editWizard"&&q){let B={name:q.name,description:q.description,tools:q.tools||[],color:q.color,location:q.configPath?.includes(".blade/agents")?"project":"user",systemPrompt:q.systemPrompt||""};return c(f$,{initialConfig:B,onComplete:()=>{O(),A()},onCancel:A},void 0,!1,void 0,this)}if(J==="delete")return v("删除 Agent");if(J==="deleteConfirm"&&q)return c(w0,{flexDirection:"column",paddingY:1,children:[c(w0,{marginBottom:1,children:c(R0,{bold:!0,color:"red",children:"确认删除"},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(w0,{marginBottom:1,paddingLeft:2,children:c(R0,{children:["你确定要删除 Agent"," ",c(R0,{bold:!0,color:"yellow",children:q.name},void 0,!1,void 0,this)," ","吗?"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),c(w0,{marginBottom:1,paddingLeft:2,children:c(R0,{dimColor:!0,children:["文件路径: ",q.configPath]},void 0,!0,void 0,this)},void 0,!1,void 0,this),c(w0,{marginBottom:1,paddingLeft:2,children:c(R0,{color:"red",children:"此操作无法撤销!"},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(a8,{items:[{label:"确认删除",value:"confirm"},{label:"取消",value:"cancel"}],onSelect:(B)=>{if(B.value==="confirm")S();else A()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}import{Box as F$,Text as H0}from"ink";import S9 from"react";import{useEffect as C9,useState as KJ}from"react";function _J($=N0(),Q=5000){let[Y,J]=KJ(null),[Z,q]=KJ(!0);return C9(()=>{let G=!0,X=async()=>{try{let U=await OJ($);if(!G)return;if(!U){J(null),q(!1);return}let F=await zJ($);if(!G)return;J(F)}catch{if(G)J(null)}finally{if(G)q(!1)}};X();let K=null;if(Q>0)K=setInterval(X,Q);return()=>{if(G=!1,K)clearInterval(K)}},[$,Q]),{branch:Y,loading:Z}}import{jsxDEV as Y0,Fragment as W$}from"react/jsx-dev-runtime";var FJ=S9.memo(()=>{let $=x$(),Q=U$(),J=u$()==="shortcuts",Z=q6(),{branch:q}=_J(NJ()),G=d$(),X=$6(),K=sQ(),U=r$(),F=eQ(),O=l$(),_=G?J8(G):!1,N=(()=>{if(Q==="default")return null;if(Q==="autoEdit")return Y0(H0,{color:"magenta",children:[">> ","auto edit on ",Y0(H0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Q==="plan")return Y0(H0,{color:"cyan",children:["‖ plan mode on ",Y0(H0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Q==="yolo")return Y0(H0,{color:"red",children:["yolo mode on ",Y0(H0,{color:"gray",children:"(all tools auto-approved)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null})(),W=N!==null,w=[["Enter:发送","Shift+Enter:换行","Esc:中止"],["Shift+Tab:切换模式","Up/Down:历史","Tab:补全"],["Ctrl+A:行首","Ctrl+E:行尾","Ctrl+K:删到尾"],["Ctrl+U:删到首","Ctrl+W:删单词","Ctrl+C:退出"]];return Y0(F$,{flexDirection:"row",justifyContent:"space-between",paddingX:2,paddingY:0,children:[J?Y0(F$,{flexDirection:"column",gap:0,children:w.map((L,H)=>Y0(F$,{flexDirection:"row",children:[L.map((R,S)=>{let[A,b]=R.split(":");return Y0(F$,{flexDirection:"row",width:20,children:[Y0(H0,{color:"yellow",children:A},void 0,!1,void 0,this),Y0(H0,{color:"gray",children:":"},void 0,!1,void 0,this),Y0(H0,{color:"white",children:b},void 0,!1,void 0,this)]},S,!0,void 0,this)}),H===w.length-1&&Y0(H0,{color:"cyan",children:" ? 关闭"},void 0,!1,void 0,this)]},H,!0,void 0,this))},void 0,!1,void 0,this):Y0(F$,{flexDirection:"row",gap:1,children:[q&&Y0(W$,{children:[Y0(H0,{color:"gray",children:[" ",q]},void 0,!0,void 0,this),Y0(H0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N,W&&Y0(H0,{color:"gray",children:"·"},void 0,!1,void 0,this),Y0(H0,{color:"gray",children:"? for shortcuts"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Y0(F$,{flexDirection:"row",gap:1,children:!$?Y0(H0,{color:"red",children:"[WARN] API 密钥未配置"},void 0,!1,void 0,this):Y0(W$,{children:[_&&Y0(W$,{children:[U?Y0(H0,{color:"cyan",children:"Thinking on"},void 0,!1,void 0,this):Y0(H0,{color:"gray",children:"Tab:Thinking"},void 0,!1,void 0,this),Y0(H0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),G&&Y0(H0,{color:"gray",children:G.model},void 0,!1,void 0,this),Y0(H0,{color:"gray",children:"·"},void 0,!1,void 0,this),K?Y0(H0,{color:"yellow",children:"压缩中..."},void 0,!1,void 0,this):Y0(H0,{color:X<20?"red":X<50?"yellow":"gray",children:[X,"%"]},void 0,!0,void 0,this),F>0.001&&Y0(W$,{children:[Y0(H0,{color:"gray",children:"·"},void 0,!1,void 0,this),Y0(H0,{color:"green",children:["$",F<0.01?F.toFixed(4):F.toFixed(3)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),O.length>0&&Y0(W$,{children:[Y0(H0,{color:"gray",children:"·"},void 0,!1,void 0,this),Y0(H0,{color:"yellow",children:["已排队 ",O.length]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Z&&Y0(W$,{children:[Y0(H0,{color:"gray",children:"·"},void 0,!1,void 0,this),Y0(H0,{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 i8,Text as n8}from"ink";import k9 from"react";import{jsxDEV as H$}from"react/jsx-dev-runtime";var WJ=k9.memo(({suggestions:$,selectedIndex:Q,visible:Y,maxDisplay:J=8})=>{if(!Y||$.length===0)return null;let Z=0,q=Math.min(J,$.length),G=Q>=$.length;if(Q>=J&&!G)Z=Q-J+1,q=Q+1;let X=$.slice(Z,q),K=$.length>J;return H$(i8,{flexDirection:"column",paddingX:2,paddingY:0,children:[X.map((U,F)=>{let _=Z+F===Q;return H$(i8,{flexDirection:"row",paddingX:1,gap:2,children:[H$(n8,{color:_?"cyan":"white",bold:_,children:U.command},void 0,!1,void 0,this),H$(n8,{color:_?"cyan":"gray",dimColor:!_,children:["- ",U.description]},void 0,!0,void 0,this)]},U.command,!0,void 0,this)}),K&&H$(i8,{paddingX:1,children:H$(n8,{color:G?"cyan":"gray",bold:G,dimColor:!G,children:["... and ",$.length-J," more"]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as Q1,Text as O1,useInput as v3,useStdout as R3}from"ink";import y3 from"ink-select-input";import AQ,{useMemo as xJ}from"react";import{Box as Z0,Text as F0}from"ink";import s1,{useEffect as BQ,useMemo as t1,useRef as pJ}from"react";import{Box as G8,Text as w1}from"ink";import{isPlainObject as QQ}from"lodash-es";import{common as j9,createLowlight as E9}from"lowlight";import bJ from"react";import{Box as q8,Text as D$}from"ink";import L1,{Fragment as wJ}from"react";import T9 from"string-width";var HJ=new Map,LJ=1000;function s8($){let Q=!0;for(let J=0;J<$.length;J++)if($.charCodeAt(J)>127){Q=!1;break}if(Q)return $.split("");if($.length<=LJ){let J=HJ.get($);if(J)return J}let Y=Array.from($);if($.length<=LJ)HJ.set($,Y);return Y}var t8=new Map;function H1($){if(/^[\x20-\x7E]*$/.test($))return $.length;if(t8.has($))return t8.get($);let Q=T9($);return t8.set($,Q),Q}import{jsxDEV as L$}from"react/jsx-dev-runtime";var e8=2,BJ=L1.memo(({children:$,maxWidth:Q,maxHeight:Y,overflowDirection:J="top",additionalHiddenLinesCount:Z=0})=>{let q=_0(),G=[],X=Math.max(Math.round(Y??Number.MAX_SAFE_INTEGER),e8);function K(W){if(!L1.isValidElement(W))return;if(W.type===wJ){L1.Children.forEach(W.props.children,K);return}if(W.type===q8){D9(W,Q,G);return}}L1.Children.forEach($,K);let F=G.length>X||Z>0?X-1:X,O=F!==void 0?Math.max(0,G.length-F):0,_=O+Z,N=(O>0?J==="top"?G.slice(O):G.slice(0,F):G).map((W,w)=>L$(q8,{children:W.length>0?W.map((L,H)=>L$(D$,{...L.props,children:L.text},H,!1,void 0,this)):L$(D$,{children:" "},void 0,!1,void 0,this)},w,!1,void 0,this));return L$(q8,{flexDirection:"column",width:Q,flexShrink:0,children:[_>0&&J==="top"&&L$(D$,{color:q.colors.text.muted,dimColor:!0,children:["... ",_," line",_===1?"":"s"," hidden ..."]},void 0,!0,void 0,this),N,_>0&&J==="bottom"&&L$(D$,{color:q.colors.text.muted,dimColor:!0,children:["... ",_," line",_===1?"":"s"," hidden ..."]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});function f9($){if(!L1.isValidElement($)||$.type!==q8)return{noWrapSegments:[],segments:[]};let Q={noWrapSegments:[],segments:[]},Y=!1;function J(Z,q){if(Z===null||Z===void 0)return;if(typeof Z==="string"||typeof Z==="number"){let U=String(Z);if(!U)return;let F={text:U,props:q??{}};if(q===void 0||q.wrap==="wrap")Y=!0,Q.segments.push(F);else if(!Y)Q.noWrapSegments.push(F);else Q.segments.push(F);return}if(!L1.isValidElement(Z))return;if(Z.type===wJ){L1.Children.forEach(Z.props.children,(U)=>J(U,q));return}if(Z.type!==D$)return;let{children:G,...X}=Z.props,K=q===void 0?X:{...q,...X};L1.Children.forEach(G,(U)=>J(U,K))}return L1.Children.forEach($.props.children,(Z)=>J(Z,void 0)),Q}function D9($,Q,Y){let J=f9($);if(J.segments.length===0&&J.noWrapSegments.length===0){Y.push([]);return}let Z=0;for(let O of J.noWrapSegments)Z+=H1(O.text);if(J.segments.length===0){let O=[],_=[];for(let z of J.noWrapSegments){let N=z.text.split(`
109
+ `);for(let W=0;W<N.length;W++){if(W>0)O.push(_),_=[];if(N[W])_.push({text:N[W],props:z.props})}}if(_.length>0)O.push(_);for(let z of O)Y.push(z);return}let q=Q-Z;if(q<1){V9(J.noWrapSegments,Q,Y);return}let G=[],X=[],K=0;function U(){if(G.length===0)G.push([...J.noWrapSegments,...X]);else if(Z>0)G.push([{text:" ".repeat(Z),props:{}},...X]);else G.push(X);X=[],K=0}function F(O,_){if(X.length>0&&X[X.length-1].props===_)X[X.length-1].text+=O;else X.push({text:O,props:_})}for(let O of J.segments){let _=O.text.split(`
110
+ `);for(let z=0;z<_.length;z++){if(z>0)U();let W=_[z].split(/(\s+)/);for(let w of W){if(!w)continue;let L=H1(w);if(K+L>q&&K>0){if(U(),/^\s+$/.test(w))continue}if(L>q){let R=s8(w);while(R.length>0){let S=0,A=0;for(let b of R){let v=H1(b);if(K+A+v>q)break;A+=v,S++}if(S>0){let b=R.slice(0,S).join("");F(b,O.props),K+=H1(b),R=R.slice(S)}if(R.length>0)U()}}else F(w,O.props),K+=L}}if(O.text.endsWith(`
111
+ `))U()}if(X.length>0)U();for(let O of G)Y.push(O)}function V9($,Q,Y){let J=[],Z=[],q=0;for(let G of $){let X=G.text.split(`
112
+ `);for(let K=0;K<X.length;K++){if(K>0)J.push(Z),Z=[],q=0;let U=X[K];if(!U)continue;let F=H1(U),O=Math.max(0,Q-H1("…"));if(F<=O&&q===0)Z.push({text:U,props:G.props}),q+=F;else{let _=s8(U),z=q,N=0;for(let w of _){let L=H1(w);if(z+L>O)break;z+=L,N++}let W=_.slice(0,N).join("");if(W)Z.push({text:W,props:G.props});Z.push({text:"…",props:{}}),q=z+H1("…")}}}if(Z.length>0)J.push(Z);if(J.length===0)J.push([{text:"…",props:{}}]);for(let G of J)Y.push(G)}import{jsxDEV as x0}from"react/jsx-dev-runtime";var $Q=E9(j9),h9=200,n1=new Map;function m9($,Q){let Y=`${Q??"__auto__"}:${$}`,J=n1.get(Y);if(J!==void 0)n1.delete(Y),n1.set(Y,J);return J}function g9($,Q,Y){let J=`${Q??"__auto__"}:${$}`;if(n1.size>=h9){let Z=n1.keys().next().value;if(Z!==void 0)n1.delete(Z)}n1.set(J,Y)}function p9($){return QQ($)&&$.type==="text"&&typeof $.value==="string"}function c9($){return QQ($)&&$.type==="element"}function u9($){return QQ($)&&$.type==="root"&&Array.isArray($.children)}function U8($,Q,Y=0){if(p9($))return x0(w1,{wrap:"wrap",children:$.value},Y,!1,void 0,this);if(c9($)){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 q=$.children?.map((G,X)=>U8(G,Q,X));return x0(w1,{color:Z,wrap:"wrap",children:q},Y,!1,void 0,this)}if(u9($))return x0(bJ.Fragment,{children:$.children.map((J,Z)=>U8(J,Q,Z))},Y,!1,void 0,this);return x0(w1,{},Y,!1,void 0,this)}function x9($,Q,Y){let J=Y||E0.getTheme().colors.syntax;try{let Z=m9($,Q);if(Z)return U8(Z,J);let q;if(!Q||!$Q.registered(Q))q=$Q.highlightAuto($);else q=$Q.highlight(Q,$);let G=q;if(!G.children||G.children.length===0)return x0(w1,{color:J.default,wrap:"wrap",children:$},void 0,!1,void 0,this);return g9($,Q,q),U8(q,J)}catch(Z){return x0(w1,{color:J.default,wrap:"wrap",children:$},void 0,!1,void 0,this)}}var K8=bJ.memo(({content:$,language:Q,showLineNumbers:Y=!0,terminalWidth:J,availableHeight:Z})=>{let q=_0(),G=$.split(`
113
+ `),X=0;if(Z&&G.length>Z){let O=Math.max(Z,e8);if(G.length>O)X=G.length-O,G=G.slice(X)}let K=G.length+X,U=String(K).length+1,F=Math.max(20,J-4);return x0(G8,{borderStyle:"round",borderColor:q.colors.border.light,paddingX:1,paddingY:0,marginY:1,flexDirection:"column",children:[Q&&x0(G8,{marginBottom:0,children:x0(w1,{color:q.colors.text.secondary,children:Q},void 0,!1,void 0,this)},void 0,!1,void 0,this),X>0&&x0(G8,{marginBottom:0,children:x0(w1,{color:q.colors.text.muted,dimColor:!0,children:["... ",X," lines hidden ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),x0(BJ,{maxWidth:F,maxHeight:Z,children:G.map((O,_)=>{let z=_+X+1;return x0(G8,{flexDirection:"row",children:[Y&&x0(w1,{color:q.colors.text.muted,dimColor:!0,wrap:"truncate",children:[String(z).padStart(U-1," ")," "]},void 0,!0,void 0,this),O.trim()===""?x0(w1,{wrap:"wrap",children:" "},void 0,!1,void 0,this):x9(O,Q,q.colors.syntax)]},_,!0,void 0,this)})},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as AJ,Text as i0,useInput as d9}from"ink";import l9,{useState as r9}from"react";import{jsxDEV as d0}from"react/jsx-dev-runtime";var vJ=400;function a9($){let Q=$.split(`
114
+ `),Y=[],J=0,Z=0;for(let q of Q){if(q.startsWith("---")||q.startsWith("+++"))continue;if(q.startsWith("@@")){let G=q.match(/@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@/);if(G)J=parseInt(G[1],10),Z=parseInt(G[3],10);Y.push({type:"header",content:q});continue}if(q.startsWith("-")){Y.push({type:"remove",content:q.substring(1),lineNumber:J}),J++;continue}if(q.startsWith("+")){Y.push({type:"add",content:q.substring(1),lineNumber:Z}),Z++;continue}if(q.startsWith(" ")||q===""){Y.push({type:"context",content:q.substring(1),lineNumber:Z}),J++,Z++;continue}}return Y}var JQ=l9.memo(({patch:$,startLine:Q,matchLine:Y,terminalWidth:J,maxLines:Z=20,isFocused:q=!1})=>{let G=_0(),X=a9($),[K,U]=r9(!1);d9((H)=>{if(H.toLowerCase()==="e")U((R)=>!R)},{isActive:q&&X.length>Z});let O=Math.max(...X.map((H)=>H.lineNumber||0)).toString().length+1,_=X.filter((H)=>H.type==="add").length,z=X.filter((H)=>H.type==="remove").length,N=X.length,W=N>Z,w;if(!W)w=X;else if(K)w=X.slice(0,vJ);else w=X.slice(0,Z);let L=N-w.length;return d0(AJ,{flexDirection:"column",marginTop:1,marginBottom:1,children:[d0(i0,{color:G.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,J)))},void 0,!1,void 0,this),W&&d0(i0,{color:G.colors.info,children:[K?`已展开 ${w.length}/${N} 行`:`显示前 ${Z} 行,共 ${N} 行`," · ",d0(i0,{color:G.colors.success,children:["+",_]},void 0,!0,void 0,this)," ",d0(i0,{color:G.colors.error,children:["-",z]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),W&&d0(i0,{color:G.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,J)))},void 0,!1,void 0,this),w.map((H,R)=>{if(H.type==="header")return d0(i0,{color:G.colors.muted,dimColor:!0,children:H.content},R,!1,void 0,this);let S=H.lineNumber?H.lineNumber.toString().padStart(O," "):" ".repeat(O),A=" ",b,v;if(H.type==="add")A="+",v=G.colors.success,b=void 0;else if(H.type==="remove")A="-",v=G.colors.error,b=void 0;else v=G.colors.text.primary;let B=Math.max(0,J-O-2),I=H.content;if(I.length>B)I=I.substring(0,B-3)+"...";return d0(i0,{color:v,backgroundColor:b,children:[d0(i0,{dimColor:!0,children:S},void 0,!1,void 0,this),d0(i0,{children:A},void 0,!1,void 0,this),d0(i0,{children:[" ",I]},void 0,!0,void 0,this)]},R,!0,void 0,this)}),W&&d0(AJ,{marginTop:1,children:K?d0(i0,{color:G.colors.info,dimColor:!0,children:[L>0?`已达显示上限 ${vJ} 行,仍有 ${L} 行未显示`:"已显示全部内容",q?" · 按 E 折叠":""]},void 0,!0,void 0,this):d0(i0,{color:G.colors.info,dimColor:!0,children:["已隐藏剩余 ",L," 行",q?" · 按 E 展开全部":""]},void 0,!0,void 0,this)},void 0,!1,void 0,this),d0(i0,{color:G.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,J)))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as FQ,Text as VJ}from"ink";import G3 from"react";import{Text as X1}from"ink";import Z3 from"react";import TJ from"string-width";import V$ from"string-width";function YQ({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 o9=YQ();function ZQ($){if(typeof $!=="string")throw TypeError(`Expected a \`string\`, got \`${typeof $}\``);if(!$.includes("\x1B")&&!$.includes("›"))return $;return $.replace(o9,"")}var RJ=($=0)=>(Q)=>`\x1B[${Q+$}m`,yJ=($=0)=>(Q)=>`\x1B[${38+$};5;${Q}m`,PJ=($=0)=>(Q,Y,J)=>`\x1B[${38+$};2;${Q};${Y};${J}m`,M0={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]}},D7=Object.keys(M0.modifier),i9=Object.keys(M0.color),n9=Object.keys(M0.bgColor),V7=[...i9,...n9];function t9(){let $=new Map;for(let[Q,Y]of Object.entries(M0)){for(let[J,Z]of Object.entries(Y))M0[J]={open:`\x1B[${Z[0]}m`,close:`\x1B[${Z[1]}m`},Y[J]=M0[J],$.set(Z[0],Z[1]);Object.defineProperty(M0,Q,{value:Y,enumerable:!1})}return Object.defineProperty(M0,"codes",{value:$,enumerable:!1}),M0.color.close="\x1B[39m",M0.bgColor.close="\x1B[49m",M0.color.ansi=RJ(),M0.color.ansi256=yJ(),M0.color.ansi16m=PJ(),M0.bgColor.ansi=RJ(10),M0.bgColor.ansi256=yJ(10),M0.bgColor.ansi16m=PJ(10),Object.defineProperties(M0,{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((q)=>q+q).join("");let Z=Number.parseInt(J,16);return[Z>>16&255,Z>>8&255,Z&255]},enumerable:!1},hexToAnsi256:{value:(Q)=>M0.rgbToAnsi256(...M0.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 X=Q%36;Y=Math.floor(Q/36)/5,J=Math.floor(X/6)/5,Z=X%6/5}let q=Math.max(Y,J,Z)*2;if(q===0)return 30;let G=30+(Math.round(Z)<<2|Math.round(J)<<1|Math.round(Y));if(q===2)G+=60;return G},enumerable:!1},rgbToAnsi:{value:(Q,Y,J)=>M0.ansi256ToAnsi(M0.rgbToAnsi256(Q,Y,J)),enumerable:!1},hexToAnsi:{value:(Q)=>M0.ansi256ToAnsi(M0.hexToAnsi256(Q)),enumerable:!1}}),M0}var s9=t9(),IJ=s9;var z8=new Set(["\x1B","›"]),e9=39,qQ="\x07",SJ="[",$3="]",kJ="m",O8=`${$3}8;;`,MJ=($)=>`${z8.values().next().value}${SJ}${$}${kJ}`,CJ=($)=>`${z8.values().next().value}${O8}${$}${qQ}`,Q3=($)=>$.split(" ").map((Q)=>V$(Q)),XQ=($,Q,Y)=>{let J=[...Q],Z=!1,q=!1,G=V$(ZQ($.at(-1)));for(let[X,K]of J.entries()){let U=V$(K);if(G+U<=Y)$[$.length-1]+=K;else $.push(K),G=0;if(z8.has(K))Z=!0,q=J.slice(X+1,X+1+O8.length).join("")===O8;if(Z){if(q){if(K===qQ)Z=!1,q=!1}else if(K===kJ)Z=!1;continue}if(G+=U,G===Y&&X<J.length-1)$.push(""),G=0}if(!G&&$.at(-1).length>0&&$.length>1)$[$.length-2]+=$.pop()},J3=($)=>{let Q=$.split(" "),Y=Q.length;while(Y>0){if(V$(Q[Y-1])>0)break;Y--}if(Y===Q.length)return $;return Q.slice(0,Y).join(" ")+Q.slice(Y).join("")},Y3=($,Q,Y={})=>{if(Y.trim!==!1&&$.trim()==="")return"";let J="",Z,q,G=Q3($),X=[""];for(let[O,_]of $.split(" ").entries()){if(Y.trim!==!1)X[X.length-1]=X.at(-1).trimStart();let z=V$(X.at(-1));if(O!==0){if(z>=Q&&(Y.wordWrap===!1||Y.trim===!1))X.push(""),z=0;if(z>0||Y.trim===!1)X[X.length-1]+=" ",z++}if(Y.hard&&G[O]>Q){let N=Q-z,W=1+Math.floor((G[O]-N-1)/Q);if(Math.floor((G[O]-1)/Q)<W)X.push("");XQ(X,_,Q);continue}if(z+G[O]>Q&&z>0&&G[O]>0){if(Y.wordWrap===!1&&z<Q){XQ(X,_,Q);continue}X.push("")}if(z+G[O]>Q&&Y.wordWrap===!1){XQ(X,_,Q);continue}X[X.length-1]+=_}if(Y.trim!==!1)X=X.map((O)=>J3(O));let K=X.join(`
115
+ `),U=[...K],F=0;for(let[O,_]of U.entries()){if(J+=_,z8.has(_)){let{groups:N}=new RegExp(`(?:\\${SJ}(?<code>\\d+)m|\\${O8}(?<uri>.*)${qQ})`).exec(K.slice(F))||{groups:{}};if(N.code!==void 0){let W=Number.parseFloat(N.code);Z=W===e9?void 0:W}else if(N.uri!==void 0)q=N.uri.length===0?void 0:N.uri}let z=IJ.codes.get(Number(Z));if(U[O+1]===`
116
+ `){if(q)J+=CJ("");if(Z&&z)J+=MJ(z)}else if(_===`
117
+ `){if(Z&&z)J+=MJ(Z);if(q)J+=CJ(q)}F+=_.length}return J};function GQ($,Q,Y){return String($).normalize().replaceAll(`\r
118
+ `,`
119
+ `).split(`
120
+ `).map((J)=>Y3(J,Q,Y)).join(`
121
+ `)}var UQ=($)=>{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 TJ(Q)};var fJ=($)=>{return/[*_~`<[\]https?:]/.test($)},KQ=($)=>{let Y=$.replace(/\*\*(.*?)\*\*/g,"$1").replace(/\*(.*?)\*/g,"$1").replace(/_(.*?)_/g,"$1").replace(/~~(.*?)~~/g,"$1").replace(/`(.*?)`/g,"$1").replace(/<u>(.*?)<\/u>/g,"$1").replace(/\[(.*?)\]\(.*?\)/g,"$1").split(/\s+/).filter((J)=>J.length>0);if(Y.length===0)return 0;return Math.max(...Y.map((J)=>TJ(J)))},_8=($,Q,Y=!1)=>{if(Q<=0)return[$];let J=$.trimEnd(),q=GQ(J,Q,{hard:Y,trim:!1,wordWrap:!0}).split(`
122
+ `).filter((G)=>G.length>0);return q.length>0?q:[""]},DJ=($,Q,Y,J)=>{let Z=Math.max(0,Y-Q);if(J==="center"){let q=Math.floor(Z/2);return" ".repeat(q)+$+" ".repeat(Z-q)}if(J==="right")return" ".repeat(Z)+$;return $+" ".repeat(Z)};import{jsxDEV as $1,Fragment as q3}from"react/jsx-dev-runtime";var OQ=2,zQ=1,_Q=2;function NQ($,Q){return`inline-${$}-${Q}`}var X3=({text:$})=>{let Q=_0();if(!fJ($))return $1(X1,{children:$},void 0,!1,void 0,this);let Y=[],J=0,Z=0,q=0,G=/(\*\*.*?\*\*|\*(?!\s).*?(?<!\s)\*|_(?!\s).*?(?<!\s)_|~~.*?~~|`+[^`]+`+|\[.*?\]\(.*?\)|https?:\/\/\S+)/g,X;while((X=G.exec($))!==null){if(X.index>J){let O=$.slice(J,X.index);Y.push($1(X1,{children:O},NQ("text",Z++),!1,void 0,this))}let K=X[0],U=null,F=NQ("match",q++);try{if(K.startsWith("**")&&K.endsWith("**")&&K.length>OQ*2)U=$1(X1,{bold:!0,children:K.slice(OQ,-OQ)},F,!1,void 0,this);else if(K.length>zQ*2&&(K.startsWith("*")&&K.endsWith("*")||K.startsWith("_")&&K.endsWith("_"))){let O=$.substring(X.index-1,X.index),_=$.substring(G.lastIndex,G.lastIndex+1);if(!(/\w/.test(O)||/\w/.test(_)||/[./\\]/.test(O+_)))U=$1(X1,{italic:!0,children:K.slice(zQ,-zQ)},F,!1,void 0,this)}else if(K.startsWith("~~")&&K.endsWith("~~")&&K.length>_Q*2)U=$1(X1,{strikethrough:!0,children:K.slice(_Q,-_Q)},F,!1,void 0,this);else if(K.startsWith("`")&&K.endsWith("`")){let O=K.match(/^(`+)([^`]+)\1$/);if(O&&O[2])U=$1(X1,{color:Q.colors.syntax.keyword,backgroundColor:Q.colors.background.secondary,bold:!0,children:` ${O[2]} `},F,!1,void 0,this)}else if(K.startsWith("[")&&K.includes("](")&&K.endsWith(")")){let O=K.match(/\[(.*?)\]\((.*?)\)/);if(O){let _=O[1],z=O[2];U=$1(X1,{children:[_,$1(X1,{color:Q.colors.info,children:[" (",z,")"]},void 0,!0,void 0,this)]},F,!0,void 0,this)}}else if(K.match(/^https?:\/\//))U=$1(X1,{color:Q.colors.info,children:K},F,!1,void 0,this)}catch(O){console.error("InlineRenderer 解析错误:",K,O),U=null}Y.push(U??$1(X1,{children:K},F,!1,void 0,this)),J=G.lastIndex}if(J<$.length){let K=$.slice(J);Y.push($1(X1,{children:K},NQ("text",Z++),!1,void 0,this))}return $1(q3,{children:Y.filter((K)=>K!==null)},void 0,!1,void 0,this)},q1=Z3.memo(X3);import{jsxDEV as w$}from"react/jsx-dev-runtime";var U3="▎",jJ=G3.memo(({lines:$,level:Q})=>{let Y=_0(),J=U3.repeat(Q);return w$(FQ,{flexDirection:"column",children:$.map((Z,q)=>{if(Z.trim()==="")return w$(FQ,{height:1},q,!1,void 0,this);return w$(FQ,{flexDirection:"row",children:[w$(VJ,{dimColor:!0,color:Y.colors.text.muted,children:[J," "]},void 0,!0,void 0,this),w$(VJ,{italic:!0,wrap:"wrap",children:w$(q1,{text:Z},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},q,!0,void 0,this)})},void 0,!1,void 0,this)});import{Box as WQ,Text as EJ}from"ink";import K3 from"react";import{jsxDEV as B$}from"react/jsx-dev-runtime";var O3=({itemText:$,type:Q,marker:Y,leadingWhitespace:J=""})=>{let Z=Q==="ol"?`${Y}. `:`${Y} `,q=Z.length,G=J.length;return B$(WQ,{paddingLeft:G+1,flexDirection:"row",children:[B$(WQ,{width:q,children:B$(EJ,{children:Z},void 0,!1,void 0,this)},void 0,!1,void 0,this),B$(WQ,{flexGrow:1,children:B$(EJ,{wrap:"wrap",children:B$(q1,{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)},HQ=K3.memo(O3);import{Text as LQ}from"ink";import z3,{useMemo as _3}from"react";import hJ from"string-width";import{jsxDEV as wQ}from"react/jsx-dev-runtime";var mJ=4,b$=3,N3=4,gJ=z3.memo(({headers:$,rows:Q,terminalWidth:Y})=>{let J=_0(),Z=_3(()=>{if($.length===0||Q.length===0)return null;let O=$.length,_=$.map((v,B)=>{let I=Math.max(KQ(v),b$);for(let V of Q)I=Math.max(I,KQ(V[B]||""));return I}),z=$.map((v,B)=>{let I=Math.max(UQ(v),b$);for(let V of Q)I=Math.max(I,UQ(V[B]||""));return I}),N=1+O*3,W=Math.max(Y-N-mJ,O*b$),w=_.reduce((v,B)=>v+B,0),L=z.reduce((v,B)=>v+B,0),H=!1,R;if(L<=W)R=z;else if(w<=W){let v=W-w,B=z.map((V,p)=>V-_[p]),I=B.reduce((V,p)=>V+p,0);R=_.map((V,p)=>{if(I===0)return V;let r=Math.floor(B[p]/I*v);return V+r})}else{H=!0;let v=W/w;R=_.map((B)=>Math.max(Math.floor(B*v),b$))}function S(){let v=1;for(let B=0;B<$.length;B++){let I=_8($[B],R[B],H);v=Math.max(v,I.length)}for(let B of Q)for(let I=0;I<B.length;I++){let V=_8(B[I]||"",R[I],H);v=Math.max(v,V.length)}return v}if(S()>N3)return{type:"vertical",columnWidths:R,needsHardWrap:H};return{type:"horizontal",columnWidths:R,needsHardWrap:H}},[$,Q,Y]);if(!Z)return null;if(Z.type==="vertical"){let O=Math.min(Y-1,40),_="─".repeat(O);return wQ(LQ,{children:Q.map((z,N)=>{let W=[];if(N>0)W.push(_);return z.forEach((w,L)=>{let H=$[L]||`Column ${L+1}`,R=(w||"").replace(/\n+/g," ").trim();W.push(`\x1B[1m${H}:\x1B[22m ${R}`)}),W.join(`
123
+ `)}).join(`
124
+ `)},void 0,!1,void 0,this)}let{columnWidths:q,needsHardWrap:G}=Z;function X(O){let z={top:{left:"┌",mid:"┬",right:"┐",h:"─"},middle:{left:"├",mid:"┼",right:"┤",h:"─"},bottom:{left:"└",mid:"┴",right:"┘",h:"─"}}[O],N=z.left;return q.forEach((W,w)=>{N+=z.h.repeat(W+2),N+=w<q.length-1?z.mid:z.right}),N}function K(O,_){let z=O.map((L,H)=>{let R=q[H]||b$;return _8(L||"",R,G)}),N=Math.max(...z.map((L)=>L.length),1),W=z.map((L)=>Math.floor((N-L.length)/2)),w=[];for(let L=0;L<N;L++){let H="│";for(let R=0;R<O.length;R++){let S=z[R],A=W[R],b=L-A,v=b>=0&&b<S.length?S[b]:"",B=q[R]||b$,I=hJ(v),V=DJ(_?`\x1B[1m${v}\x1B[22m`:v,I,B,_?"center":"left");H+=` ${V} │`}w.push(H)}return w}let U=[];if(U.push(X("top")),U.push(...K($,!0)),U.push(X("middle")),Q.forEach((O,_)=>{if(U.push(...K(O,!1)),_<Q.length-1)U.push(X("middle"))}),U.push(X("bottom")),Math.max(...U.map((O)=>hJ(O)))>Y-mJ){let O=Math.min(Y-1,40),_="─".repeat(O);return wQ(LQ,{children:Q.map((z,N)=>{let W=[];if(N>0)W.push(_);return z.forEach((w,L)=>{let H=$[L]||`Column ${L+1}`,R=(w||"").replace(/\n+/g," ").trim();W.push(`\x1B[1m${H}:\x1B[22m ${R}`)}),W.join(`
125
+ `)}).join(`
126
+ `)},void 0,!1,void 0,this)}return wQ(LQ,{color:J.colors.text.primary,children:U.join(`
127
+ `)},void 0,!1,void 0,this)});import{jsxDEV as f}from"react/jsx-dev-runtime";var F3=($,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:" "}}},W3=s1.memo(({content:$,language:Q,terminalWidth:Y,isPending:J=!1,availableHeight:Z})=>{let q=_0();if(J&&Z!==void 0){let G=$.split(`
128
+ `),X=4,K=Math.max(1,Z-4);if(G.length>K){let U=G.slice(0,K).join(`
129
+ `);return f(Z0,{flexDirection:"column",flexShrink:0,children:[f(K8,{content:U,language:Q,showLineNumbers:!0,terminalWidth:Y},void 0,!1,void 0,this),f(F0,{color:q.colors.text.muted,dimColor:!0,children:"... generating more code ..."},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}}return f(K8,{content:$,language:Q,showLineNumbers:!0,terminalWidth:Y},void 0,!1,void 0,this)}),H3=s1.memo(({content:$,level:Q})=>{let Y=_0();switch(Q){case 1:return f(F0,{bold:!0,color:Y.colors.primary,children:f(q1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 2:return f(F0,{bold:!0,color:Y.colors.primary,children:f(q1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 3:return f(F0,{bold:!0,color:Y.colors.text.primary,children:f(q1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 4:return f(F0,{italic:!0,color:Y.colors.text.muted,children:f(q1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);default:return f(F0,{children:f(q1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)}}),L3=s1.memo(({terminalWidth:$})=>{let Q=_0(),Y=Math.max(0,Math.min($-4,80));return f(F0,{dimColor:!0,color:Q.colors.text.muted,children:"─".repeat(Y)},void 0,!1,void 0,this)}),w3=s1.memo(({content:$})=>{return f(F0,{wrap:"wrap",children:f(q1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)}),B3=s1.memo(({content:$})=>{let Q=_0();return f(Z0,{flexDirection:"row",gap:1,children:[f(F0,{color:Q.colors.info,children:" "},void 0,!1,void 0,this),f(F0,{color:Q.colors.text.muted,italic:!0,children:$},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}),b3=s1.memo(({detail:$,terminalWidth:Q})=>{let Y=_0(),J=50,Z=$.split(`
130
+ `);while(Z.length>0&&Z[0].trim()==="")Z.shift();while(Z.length>0&&Z[Z.length-1].trim()==="")Z.pop();let q=Z.length>50,G=q?Z.slice(0,50):Z,X=G.join(`
131
+ `),K=X.includes("<<<DIFF>>>"),U=X.includes("```");if(K){let F=X.match(/<<<DIFF>>>\s*({[\s\S]*?})\s*<<<\/DIFF>>>/);if(F)try{let O=JSON.parse(F[1]);return f(Z0,{flexDirection:"column",children:[f(JQ,{patch:O.patch,startLine:O.startLine,matchLine:O.matchLine,terminalWidth:Q},void 0,!1,void 0,this),q&&f(Z0,{marginTop:1,children:f(F0,{dimColor:!0,color:Y.colors.text.muted,children:["... 省略 ",Z.length-50," 行 ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}catch{}}if(U){let F=X.match(/```(\w+)?\s*\n([\s\S]*?)\n```/);if(F){let O=F[1]||"text",_=F[2];return f(Z0,{flexDirection:"column",children:[f(K8,{content:_,language:O,showLineNumbers:!1,terminalWidth:Q},void 0,!1,void 0,this),q&&f(Z0,{marginTop:1,children:f(F0,{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 f(Z0,{flexDirection:"column",children:[G.map((F,O)=>f(F0,{color:Y.colors.text.primary,children:F},O,!1,void 0,this)),q&&f(Z0,{marginTop:1,children:f(F0,{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 A3($,Q,Y,J=80){if(!Y||Q===void 0||Q<=0)return{content:$,isTruncated:!1,hiddenLines:0};let q=Math.max(1,Q-8),G=Math.max(40,J*0.8),X=q*G;if($.length<=X)return{content:$,isTruncated:!1,hiddenLines:0};let K=Math.floor(X*0.9),U=$.length-K,F=U,O=$.indexOf(`
132
+ `,U);if(O!==-1&&O-U<G)F=O+1;let _=$.slice(F),N=($.slice(0,F).match(/\n/g)||[]).length+1;return{content:_,isTruncated:!0,hiddenLines:N}}var E1=s1.memo(({content:$,role:Q,terminalWidth:Y,metadata:J,isPending:Z=!1,availableTerminalHeight:q,hidePrefix:G=!1,noMargin:X=!1,renderPlainTextOnly:K=!1,streamingLines:U,streamingHiddenLines:F,messageId:O,blocksOverride:_,currentLineOverride:z,streamingMode:N="text",renderCodeBlocksAsPlainText:W=!1})=>{let w=_0(),L=_!==void 0,H=t1(()=>F3(Q,w.colors,J),[Q,w.colors,J]),{color:R,prefix:S}=H,A=S.length+1,b=t1(()=>{if(!J||typeof J!=="object")return null;if(!("subtaskRef"in J))return null;let P=J.subtaskRef;if(!P||typeof P!=="object")return null;return P},[J]),v=Q==="tool"&&J?.phase==="start",B=!X&&!v,I=t1(()=>{if(!K)return[];return $.split(/\r?\n/)},[$,K]);if(!L&&Z){let P=U??$.split(/\r?\n/),i=F??0,T=!1,m=!1,k=!1;if(N!=="text")T=N==="code",m=N==="diff",k=N==="table";return f(Z0,{flexDirection:"column",marginBottom:B?1:0,flexShrink:0,children:[i>0&&f(Z0,{flexDirection:"row",flexShrink:0,children:[f(Z0,{width:A,flexShrink:0},void 0,!1,void 0,this),f(F0,{color:w.colors.text.muted,dimColor:!0,children:["^ ",i," lines above (streaming...)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),P.map((q0,O0)=>{if(N==="text"){if(q0.match(j1.codeBlock))T=!T;else if(q0.match(j1.diffStart))m=!0;else if(q0.match(j1.diffEnd))m=!1;else if(q0.match(j1.table))k=!0;else if(k&&!q0.match(j1.table))k=!1}let v0=N==="text"&&!T&&!m&&!k,r0=v0?q0.match(j1.ulItem):null,k0=v0?q0.match(j1.olItem):null,e0=r0??k0;return f(Z0,{flexDirection:"row",flexShrink:0,children:[O0===0&&!G?f(Z0,{marginRight:1,flexShrink:0,children:f(F0,{color:R,bold:!0,children:S},void 0,!1,void 0,this)},void 0,!1,void 0,this):f(Z0,{width:A,flexShrink:0},void 0,!1,void 0,this),f(Z0,{flexGrow:1,flexShrink:0,children:e0?f(HQ,{type:r0?"ul":"ol",marker:e0[2],itemText:e0[3],leadingWhitespace:e0[1]},void 0,!1,void 0,this):f(F0,{wrap:"wrap",children:q0===""?" ":q0},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},O0,!0,void 0,this)})]},void 0,!0,void 0,this)}if(!L&&K)return f(Z0,{flexDirection:"column",marginBottom:B?1:0,flexShrink:0,children:I.map((P,i)=>f(Z0,{flexDirection:"row",flexShrink:0,children:[i===0&&!G?f(Z0,{marginRight:1,flexShrink:0,children:f(F0,{color:R,bold:!0,children:S},void 0,!1,void 0,this)},void 0,!1,void 0,this):f(Z0,{width:A,flexShrink:0},void 0,!1,void 0,this),f(Z0,{flexGrow:1,flexShrink:0,children:f(F0,{wrap:"wrap",children:P===""?" ":P},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},i,!0,void 0,this))},void 0,!1,void 0,this);let V=pJ(null);BQ(()=>{V.current=null},[O]);let p=t1(()=>{if(L)return null;if(!O)return null;return cJ(O)},[O,L]);BQ(()=>{if(L)return;if(!p||!O)return;V.current={messageId:O,blocks:p}},[p,O,L]),BQ(()=>{if(L)return;if(!p||!O)return;uJ(O)},[p,O,L]);let r=t1(()=>L?{content:$,isTruncated:!1,hiddenLines:0}:A3($,q,Z,Y),[$,q,Z,Y,L]),{content:a,isTruncated:t,hiddenLines:D}=r;if(!L&&Q==="tool"&&J&&"detail"in J){let P=J;if(P.detail)return f(Z0,{flexDirection:"column",marginBottom:X?0:1,children:[f(Z0,{flexDirection:"row",children:[f(Z0,{marginRight:1,children:f(F0,{color:R,bold:!0,children:S},void 0,!1,void 0,this)},void 0,!1,void 0,this),f(F0,{color:R,children:$},void 0,!1,void 0,this)]},void 0,!0,void 0,this),f(Z0,{marginLeft:S.length+1,children:f(b3,{detail:P.detail,terminalWidth:Y-(S.length+1)},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}let{completedContent:C,currentLine:y}=t1(()=>{if(L)return{completedContent:"",currentLine:z??""};if(!Z)return{completedContent:a,currentLine:""};let P=a.lastIndexOf(`
133
+ `);if(P===-1)return{completedContent:"",currentLine:a};return{completedContent:a.slice(0,P+1),currentLine:a.slice(P+1)}},[a,Z,L,z]),x=pJ({content:"",blocks:[]}),u=t1(()=>{if(L)return _??[];if(p)return p;if(V.current&&V.current.messageId===O)return V.current.blocks;let P=x.current;if(!Z||!C.startsWith(P.content)){let k=bQ(C);return x.current={content:C,blocks:k},k}if(C===P.content)return P.blocks;let i=C.slice(P.content.length),T=bQ(i),m=[...P.blocks,...T];return x.current={content:C,blocks:m},m},[C,Z,L,_]);return f(Z0,{flexDirection:"column",marginBottom:B?1:0,flexShrink:0,children:[t&&f(Z0,{flexDirection:"row",flexShrink:0,children:[f(Z0,{width:A,flexShrink:0},void 0,!1,void 0,this),f(F0,{color:w.colors.text.muted,dimColor:!0,children:["^ ",D," lines above (streaming...)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),u.map((P,i)=>{if(P.type==="empty")return f(Z0,{height:1,flexShrink:0},i,!1,void 0,this);return f(Z0,{flexDirection:"row",flexShrink:0,children:[i===0&&!G&&f(Z0,{marginRight:1,flexShrink:0,children:f(F0,{color:R,bold:!0,children:S},void 0,!1,void 0,this)},void 0,!1,void 0,this),(i>0||G)&&f(Z0,{width:A,flexShrink:0},void 0,!1,void 0,this),f(Z0,{flexGrow:1,flexShrink:0,children:P.type==="code"?W?f(F0,{wrap:"wrap",children:P.content},void 0,!1,void 0,this):f(W3,{content:P.content,language:P.language,terminalWidth:Y-A,isPending:Z,availableHeight:q},void 0,!1,void 0,this):P.type==="table"&&P.tableData?f(gJ,{headers:P.tableData.headers,rows:P.tableData.rows,terminalWidth:Y-A},void 0,!1,void 0,this):P.type==="heading"?f(H3,{content:P.content,level:P.level||1},void 0,!1,void 0,this):P.type==="list"?f(HQ,{type:P.listType||"ul",marker:P.marker||"-",itemText:P.content,leadingWhitespace:" ".repeat(P.indentation||0)},void 0,!1,void 0,this):P.type==="hr"?f(L3,{terminalWidth:Y-A},void 0,!1,void 0,this):P.type==="diff"&&P.diffData?f(JQ,{patch:P.diffData.patch,startLine:P.diffData.startLine,matchLine:P.diffData.matchLine,terminalWidth:Y-A},void 0,!1,void 0,this):P.type==="command-message"?f(B3,{content:P.content},void 0,!1,void 0,this):P.type==="blockquote"&&P.blockquoteLines?f(jJ,{lines:P.blockquoteLines,level:P.blockquoteLevel||1},void 0,!1,void 0,this):f(w3,{content:P.content},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},i,!0,void 0,this)}),y&&f(Z0,{flexDirection:"row",flexShrink:0,children:[u.length===0&&!G?f(Z0,{marginRight:1,flexShrink:0,children:f(F0,{color:R,bold:!0,children:S},void 0,!1,void 0,this)},void 0,!1,void 0,this):f(Z0,{width:A,flexShrink:0},void 0,!1,void 0,this),f(Z0,{flexGrow:1,flexShrink:0,children:f(F0,{wrap:"wrap",children:y},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),b&&f(Z0,{flexDirection:"row",flexShrink:0,children:[f(Z0,{width:A,flexShrink:0},void 0,!1,void 0,this),f(Z0,{flexDirection:"column",flexGrow:1,flexShrink:0,children:[f(F0,{color:w.colors.text.muted,children:["Subtask"," ",typeof b.agentType==="string"?`@${b.agentType}`:"",typeof b.status==="string"?` · ${b.status}`:""]},void 0,!0,void 0,this),typeof b.summary==="string"&&b.summary.trim()!==""&&f(F0,{wrap:"wrap",children:b.summary},void 0,!1,void 0,this),typeof b.childSessionId==="string"&&f(F0,{color:w.colors.text.muted,children:["Session ",b.childSessionId]},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 B0,Fragment as C3}from"react/jsx-dev-runtime";var P3=AQ.memo(({label:$,isSelected:Q})=>B0(O1,{color:Q?"yellow":void 0,children:$},void 0,!1,void 0,this)),I3=AQ.memo(({details:$,headerColor:Q,isPlanModeExit:Y,isPlanModeEnter:J,terminalWidth:Z})=>B0(C3,{children:[B0(Q1,{marginBottom:1,children:B0(O1,{children:$.message},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.planContent&&B0(Q1,{flexDirection:"column",marginBottom:1,borderStyle:"single",borderColor:Q,padding:1,children:[B0(O1,{bold:!0,color:Q,children:"实施方案"},void 0,!1,void 0,this),B0(Q1,{marginTop:1,children:B0(E1,{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&&B0(Q1,{flexDirection:"column",marginBottom:1,children:B0(E1,{content:$.details,role:"assistant",terminalWidth:Z},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.risks&&$.risks.length>0&&B0(Q1,{flexDirection:"column",marginBottom:1,children:[B0(O1,{color:"red",bold:!0,children:"风险提示:"},void 0,!1,void 0,this),$.risks.map((q,G)=>B0(Q1,{marginLeft:2,children:B0(O1,{color:"red",children:["• ",q]},void 0,!0,void 0,this)},G,!1,void 0,this))]},void 0,!0,void 0,this),$.affectedFiles&&$.affectedFiles.length>0&&B0(Q1,{flexDirection:"column",marginBottom:1,children:[B0(O1,{color:"yellow",children:"影响的文件:"},void 0,!1,void 0,this),$.affectedFiles.slice(0,3).map((q,G)=>B0(Q1,{marginLeft:2,children:B0(O1,{children:["• ",q]},void 0,!0,void 0,this)},G,!1,void 0,this)),$.affectedFiles.length>3&&B0(Q1,{marginLeft:2,children:B0(O1,{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 M3($,Q){return`使用 ↑↓ 选择,回车确认 · ${$||Q?"Y/N":"Y/S/N"} 快捷键 · Esc 取消`}var dJ=AQ.memo(({details:$,onResponse:Q})=>{let{stdout:Y}=R3(),J=Y.columns||80,q=a0()==="confirmation-prompt",G=I0(!1),X=$.type==="exitPlanMode",K=$.type==="enterPlanMode",U=$.type==="maxTurnsExceeded";v3((_,z)=>{if(z.ctrl&&_==="c"||z.meta&&_==="c"){G();return}if(z.escape){Q({approved:!1,reason:"用户取消"});return}let N=_.toLowerCase();if(X){if(N==="y"){Q({approved:!0,targetMode:"autoEdit"});return}if(N==="s"){Q({approved:!0,targetMode:"default"});return}if(N==="n"){Q({approved:!1,reason:"方案需要改进"});return}}else if(K){if(N==="y"){Q({approved:!0});return}if(N==="n"){Q({approved:!1,reason:"用户拒绝进入 Plan 模式"});return}}else if(U){if(N==="y"){Q({approved:!0});return}if(N==="n"){Q({approved:!1,reason:"用户选择停止"});return}}else{if(N==="y"){Q({approved:!0,scope:"once"});return}if(N==="s"){Q({approved:!0,scope:"session"});return}if(N==="n"){Q({approved:!1,reason:"用户拒绝"});return}}},{isActive:q});let F=xJ(()=>{if(X)return[{key:"approve-auto",label:"[Y] 批准,自动执行",value:{approved:!0,targetMode:"autoEdit"}},{key:"approve-default",label:"[S] 批准,逐步确认",value:{approved:!0,targetMode:"default"}},{key:"reject",label:"[N] 继续优化方案",value:{approved:!1,reason:"方案需要改进"}}];if(K)return[{key:"approve",label:"[Y] 进入规划模式",value:{approved:!0}},{key:"reject",label:"[N] 直接执行",value:{approved:!1,reason:"用户拒绝进入 Plan 模式"}}];if(U)return[{key:"continue",label:"[Y] 继续执行",value:{approved:!0}},{key:"stop",label:"[N] 停止",value:{approved:!1,reason:"用户选择停止"}}];return[{key:"approve-once",label:"[Y] 允许(仅本次)",value:{approved:!0,scope:"once"}},{key:"approve-session",label:"[S] 允许(记住本项目)",value:{approved:!0,scope:"session"}},{key:"reject",label:"[N] 拒绝",value:{approved:!1,reason:"用户拒绝"}}]},[X,K,U]),O=xJ(()=>{if(X)return{color:"cyan",title:"方案审核"};if(K)return{color:"magenta",title:"进入规划模式"};if(U)return{color:"yellow",title:"已达最大轮次"};return{color:"yellow",title:$.title||"操作确认"}},[X,K,U,$.title]);return B0(Q1,{flexDirection:"column",borderStyle:"round",borderColor:q?O.color:"gray",padding:1,children:[B0(Q1,{marginBottom:1,children:B0(O1,{bold:!0,color:O.color,children:O.title},void 0,!1,void 0,this)},void 0,!1,void 0,this),B0(I3,{details:$,headerColor:O.color,isPlanModeExit:X,isPlanModeEnter:K,terminalWidth:J},void 0,!1,void 0,this),B0(Q1,{flexDirection:"column",children:[B0(O1,{color:"gray",children:M3(K,U)},void 0,!1,void 0,this),B0(y3,{items:F,isFocused:q,itemComponent:P3,onSelect:(_)=>{Q(_.value)}},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});import{Box as K0,Text as e,useInput as S3}from"ink";import lJ from"ink-text-input";import{useState as B1}from"react";import{jsxDEV as j}from"react/jsx-dev-runtime";var j$=[{action:"add",description:"Add a new hook"},{action:"status",description:"Show hooks status"},{action:"list",description:"List all configured hooks"}],N8=[{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"}],F8=[{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"}],k3=[`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"],rJ=({onClose:$,onSave:Q})=>{let Y=E0.getTheme(),[J,Z]=B1("action"),[q,G]=B1(0),[X,K]=B1(0),[U,F]=B1(0),[O,_]=B1(""),[z,N]=B1(""),[W,w]=B1(null),[L,H]=B1(!1),[R,S]=B1(null),A=j$[q],b=F8[X],v=N8[U],B=()=>{if(R){S(null);return}switch(J){case"action":$();break;case"event":Z("action");break;case"matcher":Z("event");break;case"command":Z("matcher");break;case"location":Z("command");break;case"confirm":Z("location");break}};S3((D,C)=>{if(C.escape){B();return}if(J==="action"){if(C.upArrow)G((y)=>y>0?y-1:j$.length-1);else if(C.downArrow)G((y)=>y<j$.length-1?y+1:0);else if(C.return)I()}else if(J==="event"){if(C.upArrow)K((y)=>y>0?y-1:F8.length-1);else if(C.downArrow)K((y)=>y<F8.length-1?y+1:0);else if(C.return)Z("matcher")}else if(J==="location"){if(C.upArrow)F((y)=>y>0?y-1:N8.length-1);else if(C.downArrow)F((y)=>y<N8.length-1?y+1:0);else if(C.return)Z("confirm")}else if(J==="confirm"){if(C.return)t()}});let I=()=>{let D=j$[q].action;if(D==="add")Z("event");else if(D==="status")V();else if(D==="list")p()},V=()=>{let D=K1.getInstance(),C=D.isEnabled(),y=D.getConfig(),x={};for(let P of Object.values(RQ)){let i=y[P];if(i&&Array.isArray(i)){let T=i.reduce((m,k)=>m+(k.hooks?.length||0),0);if(T>0)x[P]=T}}let u=[`Status: ${C?"Enabled":"Disabled"}`,""];if(Object.keys(x).length>0){u.push("Configured hooks:");for(let[P,i]of Object.entries(x))u.push(` ${P}: ${i} hook(s)`)}else u.push("No hooks configured");S(u.join(`
134
+ `))},p=()=>{let C=K1.getInstance().getConfig(),y=[],x=!1;for(let u of Object.values(RQ)){let P=C[u];if(!P||!Array.isArray(P)||P.length===0)continue;x=!0,y.push(`${u}:`);for(let i of P){let T=i.matcher,m="all";if(T?.tools)m=`tools: ${Array.isArray(T.tools)?T.tools.join(", "):T.tools}`;y.push(` [${m}]`);for(let k of i.hooks||[])if(k.type==="command")y.push(` -> ${k.command}`)}y.push("")}if(!x)y.push("No hooks configured"),y.push(""),y.push("Configure hooks in .blade/settings.local.json");S(y.join(`
135
+ `))},r=()=>{Z("command")},a=()=>{if(!z.trim()){w("Command cannot be empty");return}w(null),Z("location")},t=async()=>{H(!0),w(null);try{let D=K1.getInstance(),C=await import("node:fs/promises"),y=await import("node:path"),x=await import("node:os"),u={matcher:O.trim()?{tools:O.trim()}:{},hooks:[{type:"command",command:z.trim()}]},P;switch(v.location){case"local":P=y.join(N0(),".blade","settings.local.json");break;case"project":P=y.join(N0(),".blade","settings.json");break;case"user":P=y.join(x.homedir(),".blade","settings.json");break}await C.mkdir(y.dirname(P),{recursive:!0});let i={};try{let q0=await C.readFile(P,"utf-8");i=JSON.parse(q0)}catch{}let T=i.hooks||{},m=T[b.event]||[],k={...T,enabled:!0,[b.event]:[...m,u]};if(i.hooks=k,await C.writeFile(P,JSON.stringify(i,null,2),"utf-8"),await D.reloadConfig(),Q)Q({event:b.event,matcher:O.trim(),command:z.trim()});$()}catch(D){w(`Failed to save hook: ${D instanceof Error?D.message:"Unknown error"}`),H(!1)}};return j(K0,{flexDirection:"column",padding:1,children:[j(K0,{marginBottom:1,children:j(e,{bold:!0,color:Y.colors.success,children:"Hooks Manager"},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(K0,{marginBottom:1,children:j(e,{color:Y.colors.warning,children:"[WARN] Hooks execute shell commands with your full user permissions. Only use hooks from trusted sources."},void 0,!1,void 0,this)},void 0,!1,void 0,this),R&&j(K0,{flexDirection:"column",marginBottom:1,children:[j(e,{children:R},void 0,!1,void 0,this),j(K0,{marginTop:1,children:j(e,{color:Y.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),J==="action"&&!R&&j(K0,{flexDirection:"column",children:[j(K0,{flexDirection:"column",marginTop:1,children:j$.map((D,C)=>j(K0,{children:[j(e,{color:C===q?Y.colors.primary:void 0,bold:C===q,children:[C===q?"> ":" ",D.action]},void 0,!0,void 0,this),j(e,{color:Y.colors.muted,children:[" - ",D.description]},void 0,!0,void 0,this)]},D.action,!0,void 0,this))},void 0,!1,void 0,this),j(K0,{marginTop:1,children:j(e,{color:Y.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),J==="event"&&j(K0,{flexDirection:"column",children:[j(e,{bold:!0,children:"Select Event:"},void 0,!1,void 0,this),j(K0,{flexDirection:"column",marginTop:1,children:F8.map((D,C)=>j(K0,{children:[j(e,{color:C===X?Y.colors.primary:void 0,bold:C===X,children:[C===X?"> ":" ",D.event]},void 0,!0,void 0,this),j(e,{color:Y.colors.muted,children:[" - ",D.description]},void 0,!0,void 0,this)]},D.event,!0,void 0,this))},void 0,!1,void 0,this),j(K0,{marginTop:1,children:j(e,{color:Y.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),J!=="event"&&j(K0,{marginBottom:1,children:j(e,{children:["Event:"," ",j(e,{bold:!0,color:Y.colors.primary,children:b.event},void 0,!1,void 0,this),j(e,{color:Y.colors.muted,children:[" - ",b.description]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),(J==="matcher"||J==="command"||J==="confirm")&&j(K0,{flexDirection:"column",marginBottom:1,children:[j(e,{color:Y.colors.muted,children:"Input to command is JSON of tool call arguments."},void 0,!1,void 0,this),j(e,{color:Y.colors.muted,children:"Exit code 0 - stdout/stderr not shown"},void 0,!1,void 0,this),j(e,{color:Y.colors.muted,children:"Exit code 2 - show stderr to model and block tool call"},void 0,!1,void 0,this),j(e,{color:Y.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),J==="matcher"&&j(K0,{flexDirection:"column",children:[j(K0,{children:[j(e,{bold:!0,children:"Matcher: "},void 0,!1,void 0,this),j(lJ,{value:O,onChange:_,onSubmit:r,placeholder:"e.g., Read, Bash, Edit|Write (empty = all tools)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),j(K0,{marginTop:1,children:j(e,{color:Y.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),j(K0,{marginTop:1,children:j(e,{color:Y.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),(J==="command"||J==="confirm")&&j(K0,{marginBottom:1,children:j(e,{children:["Matcher: ",j(e,{bold:!0,children:O||"(all tools)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),J==="command"&&j(K0,{flexDirection:"column",children:[j(K0,{children:j(e,{bold:!0,children:"Command: "},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(K0,{borderStyle:"single",borderColor:Y.colors.border.light,paddingX:1,marginTop:1,children:j(lJ,{value:z,onChange:N,onSubmit:a,placeholder:"Enter shell command..."},void 0,!1,void 0,this)},void 0,!1,void 0,this),j(K0,{flexDirection:"column",marginTop:1,children:[j(e,{bold:!0,children:"Examples:"},void 0,!1,void 0,this),k3.map((D,C)=>j(e,{color:Y.colors.muted,children:["• ",D]},C,!0,void 0,this))]},void 0,!0,void 0,this),j(K0,{marginTop:1,children:j(e,{color:Y.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),J==="location"&&j(K0,{flexDirection:"column",children:[j(K0,{flexDirection:"column",borderStyle:"round",borderColor:Y.colors.border.light,paddingX:2,paddingY:1,marginBottom:1,children:[j(e,{bold:!0,color:Y.colors.primary,children:"Save hook configuration"},void 0,!1,void 0,this),j(e,{children:" "},void 0,!1,void 0,this),j(e,{children:[" ","Event: ",b.event," - ",b.description]},void 0,!0,void 0,this),j(e,{children:[" Matcher: ",O||"(all)"]},void 0,!0,void 0,this),j(e,{children:[" Command: ",z]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),j(e,{bold:!0,children:"Where should this hook be saved?"},void 0,!1,void 0,this),j(K0,{flexDirection:"column",marginTop:1,children:N8.map((D,C)=>j(K0,{children:[j(e,{color:C===U?Y.colors.primary:void 0,bold:C===U,children:[C===U?"> ":" ",C+1,". ",D.name]},void 0,!0,void 0,this),j(e,{color:Y.colors.muted,children:[" ",D.description]},void 0,!0,void 0,this)]},D.location,!0,void 0,this))},void 0,!1,void 0,this),j(K0,{marginTop:1,children:j(e,{color:Y.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),J==="confirm"&&j(K0,{flexDirection:"column",children:[j(K0,{flexDirection:"column",borderStyle:"round",borderColor:Y.colors.success,paddingX:2,paddingY:1,children:[j(e,{bold:!0,children:["Saving hook to ",v.description,"..."]},void 0,!0,void 0,this),j(e,{children:" "},void 0,!1,void 0,this),j(e,{children:["Event: ",b.event]},void 0,!0,void 0,this),j(e,{children:["Matcher: ",O||"(all tools)"]},void 0,!0,void 0,this),j(e,{children:["Command: ",z]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),j(K0,{marginTop:1,children:j(e,{color:Y.colors.muted,children:L?"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),W&&j(K0,{marginTop:1,children:j(e,{color:Y.colors.error,children:W},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as J2}from"ahooks";import{Box as c3,Text as u3}from"ink";import x3 from"react";import{useMemoizedFn as j3}from"ahooks";import e1 from"chalk";import{Text as E3,useInput as h3}from"ink";import{useEffect as IQ,useRef as MQ}from"react";var b1={TIMEOUT_MS:100,RAPID_INPUT_THRESHOLD_MS:150,LARGE_INPUT_THRESHOLD:300,MEDIUM_SIZE_MULTI_CHUNK_THRESHOLD:200};import{execSync as A$}from"node:child_process";import{existsSync as T3,readFileSync as yQ}from"node:fs";import{basename as aJ,isAbsolute as f3}from"node:path";function oJ($){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 iJ(){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 D3(){let{commands:$}=iJ();try{return A$($.getPath,{encoding:"utf-8"}).trim()}catch(Q){return console.error("Failed to get clipboard path:",Q),null}}function nJ($){if($.startsWith('"')&&$.endsWith('"')||$.startsWith("'")&&$.endsWith("'"))return $.slice(1,-1);return $}function tJ($){if(process.platform==="win32")return $;let Q="__DOUBLE_BACKSLASH__";return $.replace(/\\\\/g,Q).replace(/\\(.)/g,"$1").replace(new RegExp(Q,"g"),"\\")}function PQ($){let Q=nJ($.trim()),Y=tJ(Q);return/\.(png|jpe?g|gif|webp)$/i.test(Y)}function V3($){let Q=nJ($.trim()),Y=tJ(Q);if(PQ(Y))return Y;return null}async function sJ($){let Q=V3($);if(!Q)return null;let Y;try{if(f3(Q))Y=yQ(Q);else{let G=D3();if(G&&Q===aJ(G))Y=yQ(G);else return null}}catch(G){return console.error("Failed to read image file:",G),null}let J=Y.toString("base64"),Z=oJ(J),q=aJ(Q);return{path:Q,base64:J,mediaType:Z,filename:q}}async function eJ(){let $=process.platform,Q={darwin:"pbpaste",linux:"xclip -selection clipboard -o || wl-paste",win32:'powershell -Command "Get-Clipboard"'},Y=Q[$]||Q.linux;try{return A$(Y,{encoding:"utf-8"})||null}catch{return null}}async function $2(){let{commands:$,screenshotPath:Q}=iJ();try{if(A$($.checkImage,{stdio:"ignore"}),A$($.saveImage(Q),{stdio:"ignore"}),!T3(Q))return null;let J=yQ(Q).toString("base64"),Z=oJ(J);return A$($.deleteFile(Q),{stdio:"ignore"}),{base64:J,mediaType:Z}}catch(Y){try{A$($.deleteFile(Q),{stdio:"ignore"})}catch{}return null}}import{jsxDEV as p3}from"react/jsx-dev-runtime";var m3=/\r\n/g,g3=/\r/g;function $$($){if(!$.includes("\r"))return $;return $.replace(m3,`
136
+ `).replace(g3,`
137
+ `)}function Q$($,Q,Y){let J=Math.max(0,Math.min(Y,Q.length)),Z=Q.slice(0,J),q=Q.slice(J);return{newValue:Z+$+q,newCursorPosition:J+$.length}}function Q2({value:$,placeholder:Q="",focus:Y=!0,onChange:J,cursorPosition:Z,onChangeCursorPosition:q,onPaste:G,onImagePaste:X,disabledKeys:K=[]}){let U=MQ({chunks:[],timeoutId:null,firstInputTime:null,lastInputTime:null,totalLength:0}),F=MQ($),O=MQ(Z);IQ(()=>{F.current=$,O.current=Z},[$,Z]),IQ(()=>{return()=>{if(U.current.timeoutId)clearTimeout(U.current.timeoutId)}},[]),IQ(()=>{if(Z>$.length)q($.length)},[$,Z,q]);let _=j3(()=>{let w=U.current;if(w.timeoutId)clearTimeout(w.timeoutId);let L=setTimeout(async()=>{let H=U.current.chunks,R=U.current.totalLength;if(H.length===0)return;let S=$$(H.join(""));U.current={chunks:[],timeoutId:null,firstInputTime:null,lastInputTime:null,totalLength:0};let A=F.current,b=O.current;if(X&&PQ(S))try{let r=await sJ(S);if(r){let a=await X(r.base64,r.mediaType,r.filename);if(a?.prompt){let t=$$(a.prompt),{newValue:D,newCursorPosition:C}=Q$(t,A,b);J(D),q(C)}return}}catch(r){console.error("Failed to process image path:",r)}let v=S.includes(`
138
+ `),B=R>b1.MEDIUM_SIZE_MULTI_CHUNK_THRESHOLD&&H.length>3;if((R>b1.LARGE_INPUT_THRESHOLD||v||B)&&G){let r=await G(S);if(r?.prompt){let a=$$(r.prompt),{newValue:t,newCursorPosition:D}=Q$(a,A,b);J(t),q(D);return}}let{newValue:V,newCursorPosition:p}=Q$(S,A,b);J(V),q(p)},b1.TIMEOUT_MS);U.current.timeoutId=L});h3((w,L)=>{let H=$$(w);if(K.some((B)=>L[B])||L.ctrl&&w==="c"||L.ctrl&&w==="l"||L.ctrl&&w==="t"||L.ctrl&&w==="o"||L.meta&&w==="l"||L.meta&&w==="t"||L.meta&&w==="o"||L.shift&&L.tab||H==="?"&&$==="")return;let S=Date.now(),A=U.current,b=Z,v=$;if(L.leftArrow)b--;else if(L.rightArrow)b++;else if(L.backspace||L.delete){if(w===""){if(Z>0)v=$.slice(0,Z-1)+$.slice(Z,$.length),b--}else if(Z<$.length)v=$.slice(0,Z)+$.slice(Z+1,$.length)}else if(L.ctrl&&H==="a")b=0;else if(L.ctrl&&H==="e")b=$.length;else if(L.ctrl&&H==="k")v=$.slice(0,Z);else if(L.ctrl&&H==="u")v=$.slice(Z),b=0;else if(L.ctrl&&H==="w"){let I=$.slice(0,Z).match(/\s*\S+\s*$/);if(I){let V=I[0].length;v=$.slice(0,Z-V)+$.slice(Z),b-=V}}else if(L.ctrl&&H==="v"){let B=process.platform==="darwin";(async()=>{if(X){let V=await $2();if(V){let p=await X(V.base64,V.mediaType,"clipboard.png");if(p?.prompt){let r=$$(p.prompt),{newValue:a,newCursorPosition:t}=Q$(r,F.current,O.current);J(a),q(t)}return}}if(B)return;let I=await eJ();if(I){let V=$$(I),p=V.includes(`
139
+ `),r=V.length>b1.LARGE_INPUT_THRESHOLD;if((p||r)&&G){let D=await G(V);if(D?.prompt){let C=$$(D.prompt),{newValue:y,newCursorPosition:x}=Q$(C,F.current,O.current);J(y),q(x);return}}let{newValue:a,newCursorPosition:t}=Q$(V,F.current,O.current);J(a),q(t)}})().catch(()=>{});return}else if(L.pageUp)b=0;else if(L.pageDown)b=$.length;else if(H===`
140
+ `&&(L.shift||L.meta)){let{newValue:B,newCursorPosition:I}=Q$(H,$,Z);J(B),q(I);return}else if(!L.ctrl&&!L.meta){if(!A.firstInputTime)A.firstInputTime=S;A.lastInputTime=S;let B=S-(A.firstInputTime||S),I=H.length>b1.LARGE_INPUT_THRESHOLD,V=H.includes(`
141
+ `)&&H.length>1,p=B<b1.RAPID_INPUT_THRESHOLD_MS&&A.chunks.length>0,r=B<b1.RAPID_INPUT_THRESHOLD_MS&&H.length>10,a=A.timeoutId!==null;if(G&&(I||V||p||r||a)){A.chunks.push(H),A.totalLength+=H.length,_();return}if(H.length===1&&!A.timeoutId)A.chunks=[],A.firstInputTime=null,A.lastInputTime=null,A.totalLength=0;v=$.slice(0,Z)+H+$.slice(Z,$.length),b+=H.length}if(b<0)b=0;if(b>v.length)b=v.length;if(v!==$)J(v);if(b!==Z)q(b)},{isActive:Y});let z=Y,N=$,W=Q?e1.grey(Q):void 0;if(z)if(W=Q.length>0?e1.inverse(Q[0])+e1.grey(Q.slice(1)):e1.inverse(" "),$.length===0)N=e1.inverse(" ");else{N="";for(let w=0;w<$.length;w++)if(w===Z&&Z<$.length)N+=e1.inverse($[w]);else N+=$[w];if(Z>=$.length)N+=e1.inverse(" ")}return p3(E3,{children:Q?$.length>0?N:W:N},void 0,!1,void 0,this)}import{jsxDEV as CQ}from"react/jsx-dev-runtime";var Y2=x3.memo(({input:$,cursorPosition:Q,onChange:Y,onChangeCursorPosition:J,onAddPasteMapping:Z,onAddImagePasteMapping:q})=>{let X=a0()==="main-input",K=J2((F)=>{let O=F.split(`
142
+ `).length,_=F.length,z=500,N=10;if(_>500||O>10){let W=Z(F),w=F.slice(0,30).replace(/\n/g," "),L=`${_} chars, ${O} lines: ${w}...`;return{prompt:`${$8(W)}${L}${c8()}`}}return{}}),U=J2(async(F,O,_)=>{try{let z=q(F,O);return{prompt:`${$8(z)}[Image #${z}]${c8()}`}}catch(z){return console.error("[Image Paste] Failed to process image:",z),{prompt:`[Image paste failed: ${z instanceof Error?z.message:"Unknown error"}] `}}});return CQ(c3,{flexDirection:"row",width:"100%",paddingX:2,paddingY:0,flexShrink:0,flexGrow:0,overflow:"hidden",borderStyle:"round",borderColor:"gray",children:[CQ(u3,{color:"blue",bold:!0,children:"> "},void 0,!1,void 0,this),CQ(Q2,{value:$,cursorPosition:Q,onChange:Y,onChangeCursorPosition:J,onPaste:K,onImagePaste:U,placeholder:" 输入命令...",focus:X,disabledKeys:["upArrow","downArrow","tab","return","escape"]},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as W8,Text as G1}from"ink";import o3,{useEffect as i3,useState as n3}from"react";import{useEffect as a3,useState as G2}from"react";import{useEffect as d3,useState as l3}from"react";var r3=15000,Z2=["思考中","构思中","推理中","琢磨中","分析中","斟酌中","酝酿中","推敲中","揣摩中","审视中","处理中","编排中","打磨中","编织中","拼装中","调配中","组装中","搭建中","铸造中","雕琢中","搜寻中","梳理中","排查中","勘探中","钻研中","翻阅中","遍历中","扫描中","检索中","追踪中","计算中","编译中","解析中","运算中","推演中","迭代中","收敛中","演绎中","归纳中","求解中","生成中","编写中","起草中","绘制中","勾勒中","渲染中","合成中","调和中","编曲中","烹制中","施工中","酿造中","发酵中","煎熬中","折腾中","捣鼓中","鼓捣中","腾挪中","筹备中","蓄力中"],X2=["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 q2($,Q,Y=!1){let[J,Z]=l3("");return d3(()=>{if(Q){Z("等待用户确认...");return}if(!$){Z("");return}if(Y)return;let q=()=>{if(Math.random()<0.25){let U=Math.floor(Math.random()*X2.length);return X2[U]}let K=Math.floor(Math.random()*Z2.length);return Z2[K]};Z(q());let G=setInterval(()=>{Z(q())},r3);return()=>{clearInterval(G)}},[$,Q,Y]),J}function U2($,Q=!1,Y=!1){let[J,Z]=G2(0),[q,G]=G2(null),X=q2($,Q,Y);return a3(()=>{if(!$){Z(0),G(null);return}if(Y)return;if(q===null)G(Date.now());let K=setInterval(()=>{if(q!==null){let U=Math.floor((Date.now()-q)/1000);Z(U)}},1000);return()=>{clearInterval(K)}},[$,q,Y]),{currentPhrase:X,elapsedTime:J}}import{jsxDEV as h0,Fragment as s3}from"react/jsx-dev-runtime";var SQ=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"],t3=80;function K2($){if($<60)return`${$}s`;let Q=Math.floor($/60),Y=$%60;return`${Q}m ${Y}s`}var O2=o3.memo(({message:$,paused:Q=!1})=>{let Y=T1(),J=x$(),Z=Y||!J,[q,G]=n3(0),X=_0(),U=_$()>=t3,{currentPhrase:F,elapsedTime:O}=U2(Z,!1,Q);if(i3(()=>{if(!Z||Q){G(0);return}let z=setInterval(()=>{G((N)=>(N+1)%SQ.length)},150);return()=>clearInterval(z)},[Z,Q]),!Z)return null;let _=$||F||"正在思考中...";if(U)return h0(W8,{paddingX:2,paddingBottom:1,flexDirection:"row",gap:1,children:[h0(G1,{color:X.colors.warning,bold:!0,children:SQ[q]},void 0,!1,void 0,this),h0(G1,{color:X.colors.text.primary,children:_},void 0,!1,void 0,this),O>0&&h0(s3,{children:[h0(G1,{color:X.colors.muted,children:"|"},void 0,!1,void 0,this),h0(G1,{color:X.colors.info,children:["已用时: ",K2(O)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),h0(G1,{color:X.colors.muted,children:"|"},void 0,!1,void 0,this),h0(G1,{color:X.colors.secondary,children:"Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return h0(W8,{paddingX:2,paddingBottom:1,flexDirection:"column",children:[h0(W8,{flexDirection:"row",gap:1,children:[h0(G1,{color:X.colors.warning,bold:!0,children:SQ[q]},void 0,!1,void 0,this),h0(G1,{color:X.colors.text.primary,children:_},void 0,!1,void 0,this)]},void 0,!0,void 0,this),O>0&&h0(W8,{marginLeft:2,flexDirection:"row",gap:1,children:[h0(G1,{color:X.colors.info,children:["已用时: ",K2(O)]},void 0,!0,void 0,this),h0(G1,{color:X.colors.muted,children:"|"},void 0,!1,void 0,this),h0(G1,{color:X.colors.secondary,children:"Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});import B8 from"ansi-escapes";import{Box as m1,Static as R2,useStdout as NY}from"ink";import FY,{useEffect as R1,useMemo as y2,useRef as g1,useState as EQ}from"react";import{useStdout as e3}from"ink";import{debounce as $Y}from"lodash-es";import{useEffect as QY,useState as JY}from"react";function z2($=200){let{stdout:Q}=e3(),[Y,J]=JY(Q.rows||24);return QY(()=>{let Z=$Y(()=>{J(Q.rows||24)},$);return Z(),Q.on("resize",Z),()=>{Q.off("resize",Z),Z.cancel()}},[Q,$]),Y}import J$ from"chalk";import YY from"string-width";var G0={active:!1,renderedLineCount:0,lastRenderedLines:[],terminalWidth:process.stdout.columns||80,terminalHeight:process.stdout.rows||24,prefixIndent:4,isFirstRender:!0},L8="\x1B",kQ=`${L8}[2K`,H8=($)=>$>0?`${L8}[${$}A`:"",_2=`${L8}[?25l`,N2=`${L8}[?25h`;function F2($,Q){G0.active=!0,G0.renderedLineCount=0,G0.lastRenderedLines=[],G0.terminalWidth=$,G0.terminalHeight=Q,G0.isFirstRender=!0}function W2($,Q){G0.terminalWidth=$,G0.terminalHeight=Q}function H2($,Q,Y,J){if(!G0.active)return;let Z=8,q=Math.max(1,G0.terminalHeight-Z),G=[],X=E0.getTheme(),K=" ".repeat(G0.prefixIndent),U=J$.dim.hex(X.colors.border.light);if(Q>0)G.push(`${K}${J$.dim.hex(X.colors.text.muted)(`^ ${Q} lines above (streaming...)`)}`);let F=Y==="code",O=Y==="diff",_="",z=$;if(F&&$.length>0)_=$[0].match(/^```(\w+)?/)?.[1]||"",z=$.slice(1);else if(O&&$.length>0&&$[0]==="<<<DIFF>>>")z=$.slice(1);let N=z.slice(-q);if(F&&Q===0){let w=_?` ${J$.hex(X.colors.text.secondary)(_)}`:"";G.push(`${K}${U("╭─")}${w}`)}for(let w=0;w<N.length;w++){let L=N[w],H=K;if(w===0&&!J&&G0.isFirstRender&&!F&&!O)H=J$.bold.hex(X.colors.success)("• ")+" ",G0.isFirstRender=!1;let R=F?4:0,S=G0.terminalWidth-G0.prefixIndent-2-R,A=L;if(YY(L)>S)A=L.slice(0,S);if(F)G.push(`${K}${U("│")} ${A}`);else if(O){let b=A;if(b.startsWith("+"))G.push(`${H}${J$.green(A)}`);else if(b.startsWith("-"))G.push(`${H}${J$.red(A)}`);else if(b.startsWith("@@"))G.push(`${H}${J$.dim(A)}`);else G.push(`${H}${A}`)}else G.push(`${H}${A}`);if(w===0&&!J&&G0.isFirstRender)G0.isFirstRender=!1}let W=[];if(W.push(_2),G0.renderedLineCount>0)W.push(H8(G0.renderedLineCount)),W.push("\r");for(let w=0;w<G.length;w++){let L=G[w],H=G0.lastRenderedLines[w];if(L!==H)W.push(kQ),W.push(L);if(w<G.length-1)W.push(`
143
+ `)}if(G.length<G0.renderedLineCount){for(let L=G.length;L<G0.renderedLineCount;L++)W.push(`
144
+ `),W.push(kQ);let w=G0.renderedLineCount-G.length;W.push(H8(w))}W.push(N2),process.stdout.write(W.join("")),G0.renderedLineCount=G.length,G0.lastRenderedLines=G}function A1(){if(!G0.active)return;if(G0.renderedLineCount>0){let $=[];$.push(_2),$.push(H8(G0.renderedLineCount)),$.push("\r");for(let Q=0;Q<G0.renderedLineCount;Q++)if($.push(kQ),Q<G0.renderedLineCount-1)$.push(`
145
+ `);if(G0.renderedLineCount>1)$.push(H8(G0.renderedLineCount-1)),$.push("\r");$.push(N2),process.stdout.write($.join(""))}G0.active=!1,G0.renderedLineCount=0,G0.lastRenderedLines=[],G0.isFirstRender=!0}function z1(){return G0.active}import{Box as ZY,Text as L2}from"ink";import XY from"react";import{jsxDEV as TQ}from"react/jsx-dev-runtime";var fQ=XY.memo(({collapsedCount:$})=>{let Q=_0();if($<=0)return null;let Y=Q.colors.text.muted;return TQ(ZY,{flexDirection:"row",marginBottom:1,children:[TQ(L2,{color:Y,children:[">"," ",$," 条历史消息"]},void 0,!0,void 0,this),TQ(L2,{color:Y,children:" [Ctrl+O 展开]"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});fQ.displayName="CollapsedHistorySummary";import{Box as E$,Text as h$}from"ink";import qY from"ink-big-text";import GY from"ink-gradient";import UY from"react";import{jsxDEV as J1}from"react/jsx-dev-runtime";var B2=UY.memo(()=>{return J1(E$,{flexDirection:"column",paddingX:2,paddingTop:1,paddingBottom:1,children:[J1(E$,{flexDirection:"column",children:J1(GY,{name:"pastel",children:J1(qY,{text:"BLADE",font:"block"},void 0,!1,void 0,this)},void 0,!1,void 0,this)},void 0,!1,void 0,this),J1(E$,{marginBottom:1,children:J1(h$,{color:"white",dimColor:!0,children:w2()},void 0,!1,void 0,this)},void 0,!1,void 0,this),J1(E$,{flexDirection:"column",marginBottom:1,children:[J1(E$,{marginBottom:1,children:J1(h$,{color:"white",bold:!0,children:"使用指南:"},void 0,!1,void 0,this)},void 0,!1,void 0,this),J1(h$,{color:"white",children:"1. 输入问题、编辑文件或运行命令"},void 0,!1,void 0,this),J1(h$,{color:"white",children:"2. 使用 /init 创建项目配置文件"},void 0,!1,void 0,this),J1(h$,{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 DQ,Text as v$}from"ink";import KY,{useMemo as b2}from"react";import{jsxDEV as v1}from"react/jsx-dev-runtime";function OY($,Q=60){if(!$)return"";let Y=$.split(`
146
+ `)[0]||"";if(Y.length<=Q)return Y;return`${Y.slice(0,Q)}...`}function zY($){if(!$)return 0;return $.split(`
147
+ `).length}var VQ=KY.memo(({content:$,isStreaming:Q=!1,isExpanded:Y})=>{let J=_0(),Z=b2(()=>zY($),[$]),q=b2(()=>OY($),[$]),G=J.colors.info,X=J.colors.muted;return v1(DQ,{flexDirection:"column",marginBottom:1,children:[v1(DQ,{flexDirection:"row",children:[v1(v$,{color:G,children:Y?"v":">"},void 0,!1,void 0,this),v1(v$,{children:" "},void 0,!1,void 0,this),v1(v$,{color:X,children:["Thinking",Q?"...":` (${Z} lines)`]},void 0,!0,void 0,this),!Y&&!Q&&q&&v1(v$,{color:X,children:[" - ",q]},void 0,!0,void 0,this),v1(v$,{color:X,dimColor:!0,children:[" ","[Ctrl+T]"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Y&&$&&v1(DQ,{marginLeft:2,marginTop:1,borderStyle:"round",borderColor:"gray",paddingX:1,paddingY:0,children:v1(v$,{color:X,children:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});VQ.displayName="ThinkingBlock";import{Box as w8,Text as jQ}from"ink";import A2 from"react";import{jsxDEV as h1}from"react/jsx-dev-runtime";var v2=A2.memo(({tasks:$,visible:Q=!0,compact:Y=!1})=>{let{colors:J}=_0();if(!Q||$.length===0)return null;let Z={total:$.length,completed:$.filter((q)=>q.status==="completed").length,inProgress:$.filter((q)=>q.status==="in_progress").length};return h1(w8,{flexDirection:"column",borderStyle:"single",borderColor:J.border.light,paddingX:1,paddingY:Y?0:1,marginBottom:1,children:[h1(w8,{marginBottom:Y?0:1,children:[h1(jQ,{dimColor:!0,children:"Tasks "},void 0,!1,void 0,this),h1(jQ,{color:J.text.muted,children:[Z.completed,"/",Z.total]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),h1(w8,{flexDirection:"column",children:$.map((q,G)=>h1(_Y,{task:q,compact:Y},q.id||G,!1,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}),_Y=A2.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 h1(w8,{paddingY:Q?0:0,children:h1(jQ,{dimColor:J,children:[Y," ",Z]},void 0,!0,void 0,this)},void 0,!1,void 0,this)});import{jsxDEV as f0}from"react/jsx-dev-runtime";var I2=FY.memo(()=>{let $=nQ(),Q=W6(),Y=H6(),J=L6(),Z=T1(),q=Y6(),G=G6(),X=l$(),K=N6(),U=F6(),F=tQ(),O=B6(),_=w6(),z=_$(),N=z2(),{stdout:W}=NY(),w=S1(),[L,H]=EQ(null),[R,S]=EQ([]),[A,b]=EQ(new Set),v=g1(_),B=g1(null),I=g1(0),V=g1(0),p=g1(new Set),r=g1(new Set),a=g1([]),t=g1(null);R1(()=>{if(v.current!==_){if(z1())A1();if(W)W.write(B8.clearTerminal);w.incrementClearCount(),v.current=_}},[_,W,w]);let D=$,C=J;R1(()=>{if(!J||Z){t.current=null;return}if(t.current===J)return;if(t.current=J,z1())A1();if(W)W.write(B8.eraseScreen+B8.cursorTo(0,0));p.current=new Set,r.current=new Set(D.filter((T)=>T.role==="tool").map((T)=>T.id)),B.current=null,I.current=0,V.current=0,a.current=[],S([]),b(new Set),w.incrementClearCount(),w.clearFinalizingStreamingMessageId()},[J,Z,W,w,D]);let y=Q??J;R1(()=>{if(z1())A1();B.current=null,I.current=0,V.current=0,p.current=new Set,r.current=new Set(D.filter((T)=>T.role==="tool").map((T)=>T.id)),a.current=[],S([]),b(new Set)},[F]),R1(()=>{if(!y)return;if(B.current===y)return;B.current=y,I.current=0,V.current=0,r.current=new Set(D.filter((T)=>T.role==="tool").map((T)=>T.id)),a.current=[],S([])},[y,D]),R1(()=>{if(!y)return;let T=hQ(y);if(!T||T.length<=I.current)return;let m=T.slice(I.current);I.current=T.length;let k=m,q0=a.current;if(q0.length>0)if(k.some((k0)=>k0.type!=="empty"))k=[...q0,...k],a.current=[];else{a.current=[...q0,...k];return}let O0=k.length;while(O0>0&&k[O0-1].type==="empty")O0-=1;if(O0!==k.length)a.current=k.slice(O0),k=k.slice(0,O0);if(k.length===0)return;let v0=V.current;V.current+=1;let r0=v0>0;if(z1())A1();b((k0)=>{if(!y||k0.has(y))return k0;let e0=new Set(k0);return e0.add(y),e0}),S((k0)=>[...k0,f0(m1,{flexDirection:"column",children:f0(E1,{content:"",role:"assistant",terminalWidth:z,isPending:!1,hidePrefix:r0,noMargin:!0,blocksOverride:k,renderCodeBlocksAsPlainText:!1},void 0,!1,void 0,this)},`streaming-${y}-${v0}`,!1,void 0,this)])},[y,Y.version,z,F]),R1(()=>{if(!y)return;let T=r.current,m=D.filter((k)=>k.role==="tool"&&!T.has(k.id)&&!p.current.has(k.id));if(m.length===0)return;if(z1())A1();for(let k of m)p.current.add(k.id);S((k)=>[...k,...m.map((q0)=>f0(m1,{flexDirection:"column",children:f0(E1,{content:q0.content,role:q0.role,terminalWidth:z,metadata:q0.metadata,isPending:!1,messageId:q0.id},void 0,!1,void 0,this)},`streaming-tool-${q0.id}`,!1,void 0,this))])},[y,D,z]),R1(()=>{if(!y){if(z1())A1();return}if(!z1())F2(z,N);else W2(z,N);let T=P2(y);if(!T||T.lines.length===0)return;let k=Math.max(1,N-8),q0=Math.max(0,T.lines.length-k),O0=T.lines.slice(-k),v0=(hQ(y)?.length??0)>0;H2(O0,q0,T.mode,v0)},[y,Y.version,N,z]),R1(()=>{if(!y&&z1())A1()},[y]),R1(()=>{if(L===null&&D.length>O){if(H(D.length),z1())A1();if(W)W.write(B8.clearTerminal);w.incrementClearCount()}},[D.length,O,L,W,w]);let x=y2(()=>{return q.some((T)=>T.status==="pending"||T.status==="in_progress")},[q]),u=_?0:L??0,P=u,i=y2(()=>{let T=[];if(T.push(f0(B2,{},"header",!1,void 0,this)),P>0)T.push(f0(fQ,{collapsedCount:P},"collapsed-summary",!1,void 0,this));for(let m=u;m<D.length;m++){let k=D[m];if(C&&k.id===C)continue;if(k.role==="tool"&&p.current.has(k.id))continue;if(k.role==="assistant"&&A.has(k.id))continue;T.push(f0(m1,{flexDirection:"column",children:f0(E1,{content:k.content,role:k.role,terminalWidth:z,metadata:k.metadata,isPending:!1,messageId:k.id},void 0,!1,void 0,this)},k.id,!1,void 0,this))}return T},[D,u,P,z,C,A]);return f0(m1,{flexDirection:"column",paddingX:2,children:f0(m1,{flexDirection:"column",children:[f0(R2,{items:i,children:(T)=>T},F,!1,void 0,this),K&&f0(m1,{marginBottom:1,children:f0(VQ,{content:K,isStreaming:Z,isExpanded:U},void 0,!1,void 0,this)},void 0,!1,void 0,this),R.length>0&&f0(R2,{items:R,children:(T)=>T},`streaming-${F}`,!1,void 0,this),G&&x&&f0(m1,{marginTop:1,children:f0(v2,{tasks:q,visible:!0,compact:!1},void 0,!1,void 0,this)},void 0,!1,void 0,this),X.map((T,m)=>f0(m1,{flexDirection:"column",children:f0(E1,{content:T.displayText,role:"user",terminalWidth:z},void 0,!1,void 0,this)},`pending-${m}`,!1,void 0,this))]},void 0,!0,void 0,this)},void 0,!1,void 0,this)});import{useMemoizedFn as b8,useMount as WY}from"ahooks";import{Box as Y1,Text as W0,useFocus as HY,useFocusManager as LY,useInput as wY}from"ink";import BY from"ink-select-input";import{memo as bY,useMemo as AY,useState as A8}from"react";import{jsxDEV as $0}from"react/jsx-dev-runtime";var vY=({isSelected:$})=>$0(Y1,{marginRight:1,children:$0(W0,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),RY=({isSelected:$,label:Q})=>$0(W0,{bold:$,color:$?"yellow":void 0,children:Q},void 0,!1,void 0,this),M2=bY(({onClose:$,onEdit:Q})=>{let Y=U6(),J=K6()??"",{isFocused:Z}=HY({id:"model-selector"}),q=LY(),[G,X]=A8(""),[K,U]=A8(!1),[F,O]=A8(null),_=I0(!1),[z]=A8(()=>{let b=process.stdout?.columns||80;return Math.max(20,b-8)});WY(()=>{if(q?.focus("model-selector"),Y.length>0)X(Y[0].id)}),wY((b,v)=>{if(K)return;if(v.ctrl&&b==="c"||v.meta&&b==="c"){_();return}if(v.escape){$();return}if(!Z)return;if(b==="d"||b==="D"){W();return}if((b==="e"||b==="E")&&Q)w()},{isActive:!0});let N=b8(async(b)=>{if(K)return;let v=b.value;if(v===J){$();return}U(!0),O(null);try{await m0().setCurrentModel(v),$()}catch(B){O(B.message),U(!1)}}),W=b8(async()=>{if(K||G===J)return;U(!0),O(null);try{if(await m0().removeModel(G),Y.length<=1)$()}catch(b){O(b.message)}finally{U(!1)}}),w=b8(()=>{if(K||!Q)return;let b=Y.find((v)=>v.id===G);if(!b)return;Q(b)}),L=b8((b)=>{X(b.value)}),H=AY(()=>{return Y.find((b)=>b.id===G)},[Y,G]),R=Y.map((b)=>{let v=b.id===J?" (当前)":"";return{label:b.name+v,value:b.id}}),S=G===J;return $0(Y1,{flexDirection:"column",borderStyle:"round",borderColor:"gray",padding:1,width:"100%",children:[$0(Y1,{flexDirection:"row",justifyContent:"space-between",marginBottom:1,children:[$0(W0,{bold:!0,color:"cyan",children:"模型管理"},void 0,!1,void 0,this),$0(W0,{dimColor:!0,children:[K?"处理中...":S?"Enter=关闭 • E=编辑 • Esc=取消":"Enter=切换 • D=删除 • E=编辑 • Esc=取消"," • Ctrl+C=退出"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$0(Y1,{flexDirection:"row",children:[$0(Y1,{flexDirection:"column",flexGrow:2,marginRight:2,borderStyle:"single",borderColor:"gray",padding:1,children:[$0(W0,{dimColor:!0,children:["已配置模型 (",Y.length,")"]},void 0,!0,void 0,this),$0(Y1,{marginTop:1,children:$0(BY,{items:R,onSelect:N,onHighlight:L,indicatorComponent:vY,itemComponent:RY},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(Y1,{flexDirection:"column",flexGrow:3,borderStyle:"single",borderColor:"gray",padding:1,children:[$0(W0,{dimColor:!0,children:"模型详情"},void 0,!1,void 0,this),$0(Y1,{marginY:1,children:$0(W0,{color:S?"green":"yellow",children:S?"* 当前使用":"* 可切换"},void 0,!1,void 0,this)},void 0,!1,void 0,this),H?$0(Y1,{flexDirection:"column",children:[$0(W0,{children:[$0(W0,{dimColor:!0,children:"名称: "},void 0,!1,void 0,this),$0(W0,{bold:!0,color:"cyan",children:H.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(W0,{children:[$0(W0,{dimColor:!0,children:"Provider: "},void 0,!1,void 0,this),$0(W0,{bold:!0,children:H.provider},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(W0,{children:[$0(W0,{dimColor:!0,children:"Model: "},void 0,!1,void 0,this),$0(W0,{bold:!0,children:H.model},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$0(W0,{children:[$0(W0,{dimColor:!0,children:"Base URL: "},void 0,!1,void 0,this),$0(W0,{color:"blueBright",children:H.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this),H.temperature!==void 0&&$0(W0,{children:[$0(W0,{dimColor:!0,children:"Temperature: "},void 0,!1,void 0,this),$0(W0,{children:H.temperature},void 0,!1,void 0,this)]},void 0,!0,void 0,this),H.maxContextTokens!==void 0&&$0(W0,{children:[$0(W0,{dimColor:!0,children:"Context Window: "},void 0,!1,void 0,this),$0(W0,{children:H.maxContextTokens},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this):$0(W0,{dimColor:!0,children:"请选择一个模型查看详情"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),F&&$0(Y1,{marginTop:1,children:$0(W0,{color:"red",children:F},void 0,!1,void 0,this)},void 0,!1,void 0,this),$0(Y1,{justifyContent:"center",marginTop:1,children:$0(W0,{dimColor:!0,children:"─".repeat(z)},void 0,!1,void 0,this)},void 0,!1,void 0,this),$0(Y1,{justifyContent:"center",children:$0(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 Z$}from"ahooks";import{Box as j0,Text as T0,useInput as u2}from"ink";import gY from"ink-text-input";import{useState as X$}from"react";import{Box as y1,Text as n0,useInput as yY}from"ink";import PY from"ink-text-input";import{jsxDEV as C0}from"react/jsx-dev-runtime";var C2=({provider:$,value:Q,onChange:Y,onSubmit:J,onCancel:Z,error:q})=>{yY((X,K)=>{if(K.escape)Z()});let G=$.envVars.length>0?$.envVars[0]:null;return C0(y1,{flexDirection:"column",children:[C0(y1,{marginBottom:1,children:C0(n0,{bold:!0,color:"blue",children:"Step 2: 输入 API Key"},void 0,!1,void 0,this)},void 0,!1,void 0,this),C0(y1,{marginBottom:1,children:C0(n0,{children:["Provider: ",$.icon," ",C0(n0,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),G&&C0(y1,{marginBottom:1,children:C0(n0,{dimColor:!0,children:["环境变量: ",C0(n0,{color:"cyan",children:G},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),$.docUrl&&C0(y1,{marginBottom:1,children:C0(n0,{dimColor:!0,children:["文档: ",C0(n0,{color:"blue",children:$.docUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),C0(y1,{marginBottom:1,children:C0(n0,{dimColor:!0,children:"您的 API 密钥将被安全存储在 ~/.blade/config.json (权限 600)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),C0(y1,{children:[C0(n0,{bold:!0,color:"cyan",children:[">"," "]},void 0,!0,void 0,this),C0(PY,{value:Q,onChange:Y,onSubmit:J,placeholder:"sk-...",mask:"*"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q&&C0(y1,{marginTop:1,children:C0(n0,{color:"red",children:q},void 0,!1,void 0,this)},void 0,!1,void 0,this),C0(y1,{marginTop:1,children:C0(n0,{dimColor:!0,children:["输入完成后按 ",C0(n0,{bold:!0,children:"Enter"},void 0,!1,void 0,this),",",C0(n0,{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{useEffect as T2,useState as R$}from"react";var IY={id:"openai-compatible",name:"自定义 OpenAI Compatible",icon:"",description:"使用自定义 Base URL 和 API Key",envVars:[],isCustom:!0},f2=()=>{let[$,Q]=R$([]),[Y,J]=R$(!0),[Z,q]=R$(null);return T2(()=>{(async()=>{try{let X=await S2();Q([IY,...X])}catch(X){q(X instanceof Error?X.message:"加载 Provider 列表失败")}finally{J(!1)}})()},[]),{providers:$,isLoading:Y,error:Z}},D2=($)=>{let[Q,Y]=R$([]),[J,Z]=R$(!1),[q,G]=R$(null);return T2(()=>{if(!$){Y([]);return}(async()=>{Z(!0),G(null);try{let K=await k2($);Y(K)}catch(K){G(K instanceof Error?K.message:"加载模型列表失败")}finally{Z(!1)}})()},[$]),{models:Q,isLoading:J,error:q}};import{Box as t0,Text as o0,useInput as MY}from"ink";import CY from"ink-select-input";import V2 from"ink-text-input";import{useMemo as j2,useState as mQ}from"react";import{jsxDEV as z0,Fragment as fY}from"react/jsx-dev-runtime";var SY=({isSelected:$})=>z0(t0,{marginRight:1,children:z0(o0,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),kY=($)=>{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($.inputCost!==void 0&&$.outputCost!==void 0)Q.push(`[$${$.inputCost}/$${$.outputCost}]`);return Q.join(" ")},TY=({isSelected:$,label:Q})=>z0(o0,{bold:$,color:$?"yellow":void 0,children:Q},void 0,!1,void 0,this),E2=({provider:$,models:Q,isLoading:Y,error:J,onSelect:Z,onCancel:q,initialModel:G})=>{let[X,K]=mQ(""),U=$.isCustom||Q.length===0,[F,O]=mQ(U),[_,z]=mQ(G||"");MY((L,H)=>{if(H.escape){if(F&&!U)O(!1),z(G||"");else if(X)K("");else q();return}if(L==="+"&&!F)O(!0)});let N=j2(()=>{if(!X)return Q;let L=X.toLowerCase();return Q.filter((H)=>H.name.toLowerCase().includes(L)||H.id.toLowerCase().includes(L))},[Q,X]),W=j2(()=>N.map((L)=>({key:L.id,label:kY(L),value:L})),[N]),w=()=>{if(_.trim())Z({id:_.trim(),name:_.trim()})};if(Y)return z0(t0,{flexDirection:"column",children:z0(o0,{color:"yellow",children:["正在加载 ",$.name," 模型列表..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this);if(J)return z0(t0,{flexDirection:"column",children:[z0(o0,{color:"red",children:J},void 0,!1,void 0,this),z0(o0,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return z0(t0,{flexDirection:"column",children:[z0(t0,{marginBottom:1,children:z0(o0,{bold:!0,color:"blue",children:"Step 3: 选择模型"},void 0,!1,void 0,this)},void 0,!1,void 0,this),z0(t0,{marginBottom:1,children:z0(o0,{children:["Provider: ",$.icon," ",z0(o0,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),F?z0(t0,{flexDirection:"column",children:[z0(t0,{marginBottom:1,children:z0(o0,{dimColor:!0,children:U?"输入 Model ID:":"输入自定义 Model ID(按 Esc 返回列表):"},void 0,!1,void 0,this)},void 0,!1,void 0,this),z0(t0,{marginBottom:1,children:z0(o0,{dimColor:!0,children:"例如: deepseek-v4-pro"},void 0,!1,void 0,this)},void 0,!1,void 0,this),z0(t0,{children:[z0(o0,{bold:!0,color:"cyan",children:"> "},void 0,!1,void 0,this),z0(V2,{value:_,onChange:z,onSubmit:w,placeholder:"例如: deepseek-v4-pro"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this):z0(fY,{children:[z0(t0,{marginBottom:1,children:[z0(o0,{color:"cyan",children:"> "},void 0,!1,void 0,this),z0(V2,{value:X,onChange:K,placeholder:`搜索 ${Q.length} 个模型,按 + 手动输入 Model ID...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z0(t0,{marginBottom:1,children:z0(o0,{dimColor:!0,children:"按 + 手动输入 Model ID,例如: deepseek-v4-pro"},void 0,!1,void 0,this)},void 0,!1,void 0,this),z0(t0,{flexDirection:"column",height:12,children:z0(CY,{items:W,onSelect:(L)=>Z(L.value),indicatorComponent:SY,itemComponent:TY,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),N.length===0&&z0(o0,{color:"yellow",children:"未找到匹配的模型,按 + 输入自定义模型名称"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)};import{Box as Y$,Text as p1,useInput as DY}from"ink";import VY from"ink-select-input";import jY from"ink-text-input";import{useMemo as h2,useState as EY}from"react";import{jsxDEV as V0}from"react/jsx-dev-runtime";var hY=({isSelected:$})=>V0(Y$,{marginRight:1,children:V0(p1,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),mY=({isSelected:$,label:Q})=>V0(p1,{bold:$,color:$?"yellow":void 0,children:Q},void 0,!1,void 0,this),m2=({providers:$,isLoading:Q,error:Y,onSelect:J,onCancel:Z})=>{let[q,G]=EY("");DY((U,F)=>{if(F.escape)if(q)G("");else Z()});let X=h2(()=>{if(!q)return $;let U=q.toLowerCase();return $.filter((F)=>F.name.toLowerCase().includes(U)||F.id.toLowerCase().includes(U))},[$,q]),K=h2(()=>X.map((U)=>({key:U.id,label:`${U.icon} ${U.name} - ${U.description}`,value:U})),[X]);if(Q)return V0(Y$,{flexDirection:"column",children:V0(p1,{color:"yellow",children:"正在加载 Provider 列表..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Y)return V0(Y$,{flexDirection:"column",children:[V0(p1,{color:"red",children:Y},void 0,!1,void 0,this),V0(p1,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return V0(Y$,{flexDirection:"column",children:[V0(Y$,{marginBottom:1,children:V0(p1,{bold:!0,color:"blue",children:"Step 1: 选择 API 提供商"},void 0,!1,void 0,this)},void 0,!1,void 0,this),V0(Y$,{marginBottom:1,children:[V0(p1,{color:"cyan",children:"> "},void 0,!1,void 0,this),V0(jY,{value:q,onChange:G,placeholder:`搜索 ${$.length} 个 Provider...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),V0(Y$,{flexDirection:"column",height:12,children:V0(VY,{items:K,onSelect:(U)=>J(U.value),indicatorComponent:hY,itemComponent:mY,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),X.length===0&&V0(p1,{color:"yellow",children:"未找到匹配的 Provider,按 Esc 清除搜索"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};var g2=()=>"baseUrl",p2=($)=>{switch($){case"apiKey":return"provider";case"baseUrl":return"apiKey";case"model":return"baseUrl";default:return}};import{jsxDEV as s,Fragment as cY}from"react/jsx-dev-runtime";var gQ=({mode:$,initialConfig:Q,modelId:Y,onComplete:J,onCancel:Z})=>{let q=$==="edit",[G,X]=X$("provider"),[K,U]=X$(),[F,O]=X$(q?Q?.apiKey||"":""),[_,z]=X$(q?Q?.baseUrl||"":""),[N]=X$(q?Q?.model||"":""),[W,w]=X$(),[L,H]=X$(!1),{providers:R,isLoading:S,error:A}=f2(),{models:b,isLoading:v,error:B}=D2(K?.id),I=I0(!1);u2((P,i)=>{if(i.ctrl&&P==="c"||i.meta&&P==="c")$==="setup"?I():Z()});let V=Z$((P)=>{return P.defaultBaseUrl||c2[P.id]||""}),p=Z$(async(P)=>{U(P),w(void 0);let i=V(P);if(!q)z(i);X("apiKey")}),r=Z$(()=>{if(!F.trim()){w("API Key 不能为空");return}w(void 0),X(g2())}),a=Z$(()=>{if(!_.trim()){w("Base URL 不能为空");return}try{new URL(_)}catch{w("请输入有效的 URL (例如: https://api.example.com/v1)");return}w(void 0),X("model")}),t=Z$(async(P)=>{w(void 0),H(!0);try{let i=_||(K?V(K):""),m={name:q&&Q?.name?Q.name:`${K?.name||"Model"} - ${P.name}`,provider:K?.id||Q?.provider||"openai-compatible",baseUrl:i,apiKey:F,model:P.id,...P.contextWindow&&{maxContextTokens:P.contextWindow},...P.maxOutput&&{maxOutputTokens:P.maxOutput}};if($==="setup")J(m);else if($==="add"){let k=await m0().addModel(m);await m0().setCurrentModel(k.id),J(m)}else if($==="edit"&&Y)await m0().updateModel(Y,m),J(m)}catch(i){w(i instanceof Error?i.message:"保存配置失败"),H(!1)}}),D=Z$(()=>{w(void 0);let P=p2(G);if(P)X(P)}),C=Z$(()=>{X("apiKey")}),y=G==="provider"?1:G==="apiKey"?2:G==="baseUrl"?2.5:3,x=3;return s(j0,{...$==="setup"?{flexDirection:"column",padding:1}:{flexDirection:"column",borderStyle:"round",borderColor:$==="edit"?"yellow":"blue",padding:1},children:[$==="setup"&&s(cY,{children:[s(j0,{marginBottom:1,children:s(T0,{bold:!0,color:"blue",children:"欢迎使用 Blade Code"},void 0,!1,void 0,this)},void 0,!1,void 0,this),s(j0,{marginBottom:1,children:s(T0,{children:"AI 驱动的代码助手 - 让我们开始配置您的助手"},void 0,!1,void 0,this)},void 0,!1,void 0,this),s(j0,{marginBottom:1,children:[s(T0,{bold:!0,color:"blue",children:"█".repeat(Math.floor((y-1)/(x-1)*40))},void 0,!1,void 0,this),s(T0,{dimColor:!0,children:"░".repeat(40-Math.floor((y-1)/(x-1)*40))},void 0,!1,void 0,this),s(T0,{children:" "},void 0,!1,void 0,this),s(T0,{bold:!0,color:"cyan",children:[Math.ceil(y),"/",x]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),s(j0,{marginBottom:1,children:s(T0,{dimColor:!0,children:"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$!=="setup"&&s(j0,{justifyContent:"center",marginBottom:1,children:s(T0,{bold:!0,color:$==="edit"?"yellow":"blue",children:$==="edit"?"编辑模型配置":"添加新模型配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),G==="provider"&&s(m2,{providers:R,isLoading:S,error:A,onSelect:p,onCancel:$==="setup"?()=>{}:Z},void 0,!1,void 0,this),G==="apiKey"&&K&&s(C2,{provider:K,value:F,onChange:O,onSubmit:r,onCancel:D,error:W},void 0,!1,void 0,this),G==="baseUrl"&&K&&s(pY,{provider:K,value:_,onChange:z,onSubmit:a,onCancel:C,error:W},void 0,!1,void 0,this),G==="model"&&K&&s(E2,{provider:K,models:b,isLoading:v,error:B,onSelect:t,onCancel:D,initialModel:q?N:void 0},void 0,!1,void 0,this),W&&G!=="apiKey"&&G!=="baseUrl"&&s(j0,{marginTop:1,borderStyle:"round",borderColor:"red",paddingX:1,children:s(T0,{color:"red",children:W},void 0,!1,void 0,this)},void 0,!1,void 0,this),L&&s(j0,{marginTop:1,children:s(T0,{color:"yellow",children:"正在保存配置..."},void 0,!1,void 0,this)},void 0,!1,void 0,this),s(j0,{marginTop:1,children:s(T0,{dimColor:!0,children:"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},pY=({provider:$,value:Q,onChange:Y,onSubmit:J,onCancel:Z,error:q})=>{return u2((G,X)=>{if(X.escape)Z()}),s(j0,{flexDirection:"column",children:[s(j0,{marginBottom:1,children:s(T0,{bold:!0,color:"blue",children:"Step 2.5: 确认 Base URL"},void 0,!1,void 0,this)},void 0,!1,void 0,this),s(j0,{marginBottom:1,children:s(T0,{children:["Provider: ",$.icon," ",s(T0,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),s(j0,{marginBottom:1,children:s(T0,{dimColor:!0,children:"默认值已预填,可直接回车继续,也可以手动修改为自定义网关地址"},void 0,!1,void 0,this)},void 0,!1,void 0,this),s(j0,{marginBottom:1,children:s(T0,{dimColor:!0,children:"示例: https://api.example.com/v1"},void 0,!1,void 0,this)},void 0,!1,void 0,this),s(j0,{children:[s(T0,{bold:!0,color:"cyan",children:"> "},void 0,!1,void 0,this),s(gY,{value:Q,onChange:Y,onSubmit:J,placeholder:"https://api.example.com/v1"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q&&s(j0,{marginTop:1,children:s(T0,{color:"red",children:q},void 0,!1,void 0,this)},void 0,!1,void 0,this),s(j0,{marginTop:1,children:s(T0,{dimColor:!0,children:["输入完成后按 ",s(T0,{bold:!0,children:"Enter"},void 0,!1,void 0,this),",",s(T0,{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{useMemoizedFn as m$}from"ahooks";import{promises as r2}from"fs";import{Box as s0,Text as P0,useInput as uY}from"ink";import x2 from"ink-select-input";import xY from"ink-text-input";import dY from"os";import v8 from"path";import{useEffect as lY,useMemo as R8,useRef as rY,useState as c1}from"react";import{jsxDEV as J0}from"react/jsx-dev-runtime";var g$=[{key:"allow",label:"Allow"},{key:"ask",label:"Ask"},{key:"deny",label:"Deny"},{key:"info",label:"Info"}],aY={allow:"Add a new rule...",ask:"Add a new rule...",deny:"Add a new rule..."},oY={allow:"Allow permission rules",ask:"Ask permission rules",deny:"Deny permission rules"},d2={project:"[项目共享配置]",global:"[用户全局配置]",local:"[本地配置]"},iY=["project","global","local"],nY={allow:[],ask:[],deny:[]},tY={localExists:!1,projectExists:!1,globalExists:!1},l2={allow:[],ask:[],deny:[]};function sY($){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 eY($){try{let Q=await r2.readFile($,"utf-8"),Y=JSON.parse(Q);return{exists:!0,raw:Y,permissions:sY(Y)}}catch(Q){if(Q.code==="ENOENT")return{exists:!1,raw:{},permissions:{...l2}};return console.warn(`[PermissionsManager] Failed to read ${$}:`,Q),{exists:!0,raw:{},permissions:{...l2}}}}function $5($,Q){let Y=$.padEnd(32," "),J=Q==="local"?`${d2[Q]} <- 可删除`:d2[Q];return`${Y} ${J}`}var a2=({onClose:$})=>{let Y=a0()==="permissions-manager",J=I0(!1),[Z,q]=c1(0),G=g$[Z].key,[X,K]=c1(nY),[U,F]=c1(tY),[O,_]=c1(!0),[z,N]=c1("list"),[W,w]=c1(""),[L,H]=c1(null),[R,S]=c1(null),A=rY(!1),b=R8(()=>v8.join(N0(),".blade","settings.local.json"),[]),v=R8(()=>v8.join(N0(),".blade","settings.json"),[]),B=R8(()=>v8.join(dY.homedir(),".blade","settings.json"),[]),I=m$(async()=>{_(!0);let m=await Promise.all([{source:"local",path:b},{source:"project",path:v},{source:"global",path:B}].map(async({source:v0,path:r0})=>{let k0=await eY(r0);return{source:v0,path:r0,...k0}})),k={localExists:m.find((v0)=>v0.source==="local")?.exists??!1,projectExists:m.find((v0)=>v0.source==="project")?.exists??!1,globalExists:m.find((v0)=>v0.source==="global")?.exists??!1};F(k);let q0={allow:[],ask:[],deny:[]},O0=Object.fromEntries(m.map((v0)=>[v0.source,v0]));["allow","ask","deny"].forEach((v0)=>{iY.forEach((r0)=>{(O0[r0]?.permissions[v0]??[]).forEach((e0,k8)=>{let T8={key:`${r0}:${k8}:${e0}`,rule:e0,source:r0};q0[v0].push(T8)})})}),K(q0),_(!1)});lY(()=>{I()},[I]);let V=m$(async(T,m)=>{try{let k=v8.join(N0(),".blade","settings.local.json"),q0={allow:[],ask:[],deny:[]};try{let v0=await r2.readFile(k,"utf-8"),k0=JSON.parse(v0).permissions||{};q0={allow:Array.isArray(k0.allow)?k0.allow:[],ask:Array.isArray(k0.ask)?k0.ask:[],deny:Array.isArray(k0.deny)?k0.deny:[]}}catch(v0){}let O0=m(q0);await m0().updateConfig({permissions:O0},{scope:"local",immediate:!0}),await I()}catch(k){throw console.error("[PermissionsManager] 修改权限规则失败:",k),k}});uY((T,m)=>{if(m.ctrl&&T==="c"||m.meta&&T==="c"){J();return}if(z==="locked"){if(A.current){A.current=!1;return}N("list"),H(null),S(null);return}if(m.escape){if(z==="list"||G==="info")$();else N("list"),w(""),H(null),S(null);return}if(z==="list"){if(m.tab&&m.shift)q((k)=>(k-1+g$.length)%g$.length);else if(m.tab)q((k)=>(k+1)%g$.length);else if(T?.toLowerCase()==="q")$()}},{isActive:Y});let p=m$((T)=>{let m=T.value;if(G==="info")return;if(m.type==="add"){N("add"),w(""),S(null);return}if(m.entry.source!=="local"){N("locked"),A.current=!0,H({tab:G,entry:m.entry}),S({type:"error",text:m.entry.source==="project"?"此规则定义在项目共享配置中,无法在此删除。":"此规则来自用户全局配置,无法在此删除。"});return}N("confirm-delete"),H({tab:G,entry:m.entry}),S(null)}),r=m$(async()=>{if(G==="info")return;let T=W.trim();if(!T){S({type:"error",text:"Permission rule 不能为空"});return}if(X[G].map((k)=>k.rule).includes(T)){S({type:"error",text:"该规则已存在"});return}try{await V(G,(k)=>{let q0={allow:[...k.allow],ask:[...k.ask],deny:[...k.deny]};return q0[G]=[...new Set([...k[G],T])],q0}),N("list"),w(""),S({type:"success",text:"已添加本地权限规则"})}catch(k){S({type:"error",text:`保存失败: ${k instanceof Error?k.message:"未知错误"}`})}}),a=m$(async()=>{if(!L)return;let{tab:T,entry:m}=L;try{await V(T,(k)=>{let q0={allow:[...k.allow],ask:[...k.ask],deny:[...k.deny]};return q0[T]=k[T].filter((O0)=>O0!==m.rule),q0}),N("list"),H(null),S({type:"success",text:"已删除本地权限规则"})}catch(k){S({type:"error",text:`删除失败: ${k instanceof Error?k.message:"未知错误"}`})}}),t=R8(()=>{if(G==="info")return[];let T=G;return[{key:"add-new-rule",label:`› ${aY[T]}`,value:{type:"add"}},...X[T].map((k)=>({key:k.key,label:$5(k.rule,k.source),value:{type:"rule",entry:k}}))]},[G,X]),D=()=>J0(s0,{marginBottom:1,children:g$.map((T,m)=>J0(s0,{marginRight:2,children:J0(P0,{color:m===Z?"yellow":"gray",children:["[",T.label,"]"]},void 0,!0,void 0,this)},T.key,!1,void 0,this))},void 0,!1,void 0,this),C=()=>J0(s0,{flexDirection:"column",gap:1,children:[J0(P0,{children:"配置文件优先级(从高到低):"},void 0,!1,void 0,this),J0(s0,{flexDirection:"column",marginLeft:2,children:[J0(P0,{children:["1. .blade/settings.local.json (本地配置,不提交 Git)"," ",U.localExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),J0(P0,{children:["2. .blade/settings.json (项目配置,提交 Git)"," ",U.projectExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),J0(P0,{children:["3. ~/.blade/settings.json (用户全局配置)"," ",U.globalExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),J0(P0,{children:"说明:"},void 0,!1,void 0,this),J0(s0,{flexDirection:"column",marginLeft:2,children:[J0(P0,{children:"- /permissions 命令只管理本地配置 (.blade/settings.local.json)"},void 0,!1,void 0,this),J0(P0,{children:"- 修改全局或项目配置请直接编辑对应文件"},void 0,!1,void 0,this),J0(P0,{children:"- 本地配置不会提交到 Git"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),y=(T)=>J0(s0,{flexDirection:"column",gap:1,children:[J0(P0,{bold:!0,children:oY[T]},void 0,!1,void 0,this),J0(P0,{children:"Permission rules are a tool name, optionally followed by a specifier in parentheses."},void 0,!1,void 0,this),J0(P0,{color:"gray",children:"例如: WebFetch 或 Bash(ls:*)"},void 0,!1,void 0,this),J0(s0,{marginTop:1,children:J0(xY,{value:W,onChange:w,onSubmit:r},void 0,!1,void 0,this)},void 0,!1,void 0,this),J0(P0,{color:"gray",children:"Enter 提交 · Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),x=(T,m)=>J0(s0,{flexDirection:"column",gap:1,children:[J0(P0,{bold:!0,children:["Delete ",T," permission rule?"]},void 0,!0,void 0,this),J0(P0,{children:m.rule},void 0,!1,void 0,this),J0(P0,{color:"gray",children:"From project local settings"},void 0,!1,void 0,this),J0(P0,{children:"Are you sure you want to delete this permission rule?"},void 0,!1,void 0,this),J0(x2,{items:[{label:"Yes",value:"yes"},{label:"No",value:"no"}],onSelect:(k)=>{if(k.value==="yes")a();else N("list"),H(null)}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u=(T)=>J0(s0,{flexDirection:"column",gap:1,children:[J0(P0,{bold:!0,children:"Cannot delete this rule"},void 0,!1,void 0,this),J0(P0,{children:T.rule},void 0,!1,void 0,this),J0(P0,{color:"gray",children:T.source==="project"?"This rule is defined in .blade/settings.json. 请手动编辑该文件以移除规则。":"This rule is defined in ~/.blade/settings.json. 请手动编辑该文件以移除规则。"},void 0,!1,void 0,this),J0(P0,{color:"gray",children:"按任意键继续"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),P=(T)=>J0(x2,{items:t,isFocused:z==="list",onSelect:p},void 0,!1,void 0,this),i=()=>{if(O)return J0(P0,{children:"加载中..."},void 0,!1,void 0,this);if(G==="info")return C();if(z==="add")return y(G);if(z==="confirm-delete"&&L)return x(L.tab,L.entry);if(z==="locked"&&L)return u(L.entry);return P(G)};return J0(s0,{flexDirection:"column",borderStyle:"round",borderColor:Y?"cyan":"gray",padding:1,width:80,children:[J0(P0,{color:"cyan",bold:!0,children:"权限管理器"},void 0,!1,void 0,this),D(),J0(s0,{flexDirection:"column",gap:1,children:i()},void 0,!1,void 0,this),R&&J0(s0,{marginTop:1,children:J0(P0,{color:R.type==="success"?"green":"red",children:R.text},void 0,!1,void 0,this)},void 0,!1,void 0,this),J0(s0,{marginTop:1,children:J0(P0,{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 y0,Text as X0,useInput as Q5}from"ink";import{jsxDEV as g}from"react/jsx-dev-runtime";function o2({onCancel:$}){let Q=y8(),Y=Q.getAll(),J=Q.getBySource(),Z=Q.getStats(),q=I0(!1,$);if(Q5((G,X)=>{if(X.escape)$?.();else if(X.ctrl&&G==="c"||X.meta&&G==="c")q()}),Y.length===0)return g(y0,{flexDirection:"column",paddingY:1,children:[g(y0,{marginBottom:1,children:g(X0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(y0,{paddingLeft:2,children:g(X0,{color:"gray",children:"没有已加载的插件"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(y0,{marginTop:1,paddingLeft:2,flexDirection:"column",children:[g(X0,{color:"gray",children:"插件目录位置:"},void 0,!1,void 0,this),g(X0,{color:"gray",dimColor:!0,children:[" ","• ~/.blade/plugins/ - 用户级插件"]},void 0,!0,void 0,this),g(X0,{color:"gray",dimColor:!0,children:[" ","• .blade/plugins/ - 项目级插件"]},void 0,!0,void 0,this),g(X0,{color:"gray",dimColor:!0,children:[" ","• --plugin-dir - CLI 指定的插件"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),g(y0,{marginTop:1,paddingLeft:2,children:g(X0,{color:"gray",children:"使用 /plugins install <url> 安装新插件"},void 0,!1,void 0,this)},void 0,!1,void 0,this),g(y0,{marginTop:1,children:g(X0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return g(y0,{flexDirection:"column",paddingY:1,children:[g(y0,{marginBottom:1,children:[g(X0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this),g(X0,{color:"gray",children:[" (共 ",Z.total," 个插件)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),g(y0,{paddingLeft:2,marginBottom:1,children:g(X0,{color:"gray",children:["启用: ",Z.active," | 禁用: ",Z.inactive," | 命令: ",Z.commands," | 技能:"," ",Z.skills," | 代理: ",Z.agents]},void 0,!0,void 0,this)},void 0,!1,void 0,this),J.cli.length>0&&g(y0,{flexDirection:"column",marginBottom:1,children:[g(y0,{paddingLeft:1,children:[g(X0,{bold:!0,color:"magenta",children:"CLI 指定"},void 0,!1,void 0,this),g(X0,{color:"gray",children:" (--plugin-dir)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),J.cli.map((G)=>{let X=G.status==="active"?"[on]":"[off]";return g(y0,{flexDirection:"column",paddingLeft:2,children:[g(X0,{children:[g(X0,{bold:!0,color:"green",children:[X," ",G.manifest.name]},void 0,!0,void 0,this),g(X0,{color:"gray",children:[" v",G.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),g(y0,{paddingLeft:2,children:g(X0,{color:"gray",children:G.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),G.commands.length>0&&g(y0,{paddingLeft:2,children:g(X0,{color:"blue",children:["命令:"," ",G.commands.map((K)=>`/${K.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},G.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),J.project.length>0&&g(y0,{flexDirection:"column",marginBottom:1,children:[g(y0,{paddingLeft:1,children:[g(X0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),g(X0,{color:"gray",children:" (.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),J.project.map((G)=>{let X=G.status==="active"?"[on]":"[off]";return g(y0,{flexDirection:"column",paddingLeft:2,children:[g(X0,{children:[g(X0,{bold:!0,color:"green",children:[X," ",G.manifest.name]},void 0,!0,void 0,this),g(X0,{color:"gray",children:[" v",G.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),g(y0,{paddingLeft:2,children:g(X0,{color:"gray",children:G.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),G.commands.length>0&&g(y0,{paddingLeft:2,children:g(X0,{color:"blue",children:["命令:"," ",G.commands.map((K)=>`/${K.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},G.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),J.user.length>0&&g(y0,{flexDirection:"column",marginBottom:1,children:[g(y0,{paddingLeft:1,children:[g(X0,{bold:!0,color:"cyan",children:"用户级"},void 0,!1,void 0,this),g(X0,{color:"gray",children:" (~/.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),J.user.map((G)=>{let X=G.status==="active"?"[on]":"[off]";return g(y0,{flexDirection:"column",paddingLeft:2,children:[g(X0,{children:[g(X0,{bold:!0,color:"green",children:[X," ",G.manifest.name]},void 0,!0,void 0,this),g(X0,{color:"gray",children:[" v",G.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),g(y0,{paddingLeft:2,children:g(X0,{color:"gray",children:G.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),G.commands.length>0&&g(y0,{paddingLeft:2,children:g(X0,{color:"blue",children:["命令:"," ",G.commands.map((K)=>`/${K.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},G.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),g(y0,{marginTop:1,paddingLeft:2,flexDirection:"column",children:[g(X0,{color:"gray",children:"可用命令:"},void 0,!1,void 0,this),g(X0,{color:"gray",dimColor:!0,children:[" ","• /plugins list - 列出所有插件"]},void 0,!0,void 0,this),g(X0,{color:"gray",dimColor:!0,children:[" ","• /plugins info <name> - 显示插件详情"]},void 0,!0,void 0,this),g(X0,{color:"gray",dimColor:!0,children:[" ","• /plugins install <url> - 安装插件"]},void 0,!0,void 0,this),g(X0,{color:"gray",dimColor:!0,children:[" ","• /plugins enable/disable <name> - 启用/禁用插件"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),g(y0,{marginTop:1,children:g(X0,{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 g0,Text as p0,useInput as i2,useStdout as J5}from"ink";import Y5 from"ink-text-input";import pQ,{useCallback as p$,useMemo as Z5,useState as u1}from"react";import{jsxDEV as U0}from"react/jsx-dev-runtime";var X5=pQ.memo(({option:$,index:Q,isSelected:Y,isMultiSelect:J,isHighlighted:Z})=>U0(g0,{flexDirection:"column",marginBottom:1,children:[U0(p0,{color:Z?"yellow":Y?"green":void 0,bold:Z,children:[J?Y?"(*) ":"( ) ":Z?"> ":" ",Q+1,". ",$.label]},void 0,!0,void 0,this),U0(g0,{marginLeft:4,children:U0(p0,{color:"gray",children:$.description},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)),q5=pQ.memo(({questions:$,answers:Q})=>U0(g0,{flexDirection:"column",marginBottom:1,children:$.map((Y)=>{let J=Q[Y.header],Z=Array.isArray(J)?J.join(", "):J||"(no answer)";return U0(g0,{marginBottom:1,children:[U0(p0,{backgroundColor:"blue",color:"white",children:[" ",Y.header," "]},void 0,!0,void 0,this),U0(p0,{color:"green",children:[" ",Z]},void 0,!0,void 0,this)]},Y.header,!0,void 0,this)})},void 0,!1,void 0,this)),n2=pQ.memo(({questions:$,onComplete:Q,onCancel:Y})=>{let{stdout:J}=J5(),Z=J.columns||80,G=a0()==="confirmation-prompt",X=I0(!1),[K,U]=u1("answering"),[F,O]=u1(0),[_,z]=u1({}),[N,W]=u1(0),[w,L]=u1([]),[H,R]=u1(!1),[S,A]=u1(""),[b,v]=u1(0),B=$[F],I=Z5(()=>{if(!B)return[];return[...B.options.map((D)=>({label:D.label,value:D.label,description:D.description})),{label:"Type something...",value:"__other__",description:"Enter custom response"}]},[B]),V=p$((D)=>{let C={..._,[B.header]:D};if(z(C),F<$.length-1)O(F+1),W(0),L([]),R(!1),A("");else U("submit"),v(0)},[_,B?.header,F,$.length]),p=p$((D)=>{let C=I[D];if(!C)return;if(C.value==="__other__"){R(!0);return}if(B.multiSelect)L((y)=>y.includes(C.value)?y.filter((x)=>x!==C.value):[...y,C.value]);else V(C.value)},[I,B?.multiSelect,V]),r=p$((D)=>{if(D.trim())V(D.trim())},[V]),a=p$(()=>{U("answering"),O(0),W(0),L([]),R(!1)},[]),t=p$(()=>{Q(_)},[_,Q]);if(i2((D,C)=>{if(C.ctrl&&D==="c"||C.meta&&D==="c"){X();return}if(H){if(C.escape)R(!1),A("");return}if(C.escape){Y();return}let y=parseInt(D);if(y>=1&&y<=I.length){p(y-1);return}if(C.upArrow){W((x)=>x>0?x-1:I.length-1);return}if(C.downArrow||C.tab){W((x)=>x<I.length-1?x+1:0);return}if(C.return){if(B.multiSelect&&w.length>0)V(w);else p(N);return}if(D===" "&&B.multiSelect){let x=I[N];if(x&&x.value!=="__other__")L((u)=>u.includes(x.value)?u.filter((P)=>P!==x.value):[...u,x.value]);return}},{isActive:G&&K==="answering"&&!H}),i2((D,C)=>{if(C.ctrl&&D==="c"||C.meta&&D==="c"){X();return}if(C.escape){Y();return}if(C.upArrow||C.downArrow||C.tab){v((y)=>y===0?1:0);return}if(C.return){if(b===0)t();else a();return}if(D.toLowerCase()==="y"){t();return}if(D.toLowerCase()==="e"){a();return}},{isActive:G&&K==="submit"}),K==="submit")return U0(g0,{flexDirection:"column",borderStyle:"round",borderColor:G?"green":"gray",padding:1,width:Math.min(Z-4,80),children:[U0(g0,{marginBottom:1,children:U0(p0,{bold:!0,color:"green",children:"[OK] Review Your Answers"},void 0,!1,void 0,this)},void 0,!1,void 0,this),U0(q5,{questions:$,answers:_},void 0,!1,void 0,this),U0(g0,{flexDirection:"column",marginTop:1,children:[U0(p0,{color:b===0?"yellow":void 0,bold:b===0,children:[b===0?"> ":" ","[Y] Submit answers"]},void 0,!0,void 0,this),U0(p0,{color:b===1?"yellow":void 0,bold:b===1,children:[b===1?"> ":" ","[E] Edit answers"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),U0(g0,{marginTop:1,children:U0(p0,{color:"gray",children:"Enter to confirm · Up/Down to navigate · Y/E for quick select"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(!B)return null;return U0(g0,{flexDirection:"column",borderStyle:"round",borderColor:G?"cyan":"gray",padding:1,width:Math.min(Z-4,80),children:[U0(g0,{marginBottom:1,children:[U0(p0,{backgroundColor:"blue",color:"white",children:[" ",B.header," "]},void 0,!0,void 0,this),U0(p0,{children:[" ",B.question]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),H?U0(g0,{flexDirection:"column",marginTop:1,children:[U0(p0,{color:"yellow",children:"Enter your response:"},void 0,!1,void 0,this),U0(g0,{marginTop:1,children:[U0(p0,{color:"cyan",children:"> "},void 0,!1,void 0,this),U0(Y5,{value:S,onChange:A,onSubmit:r,focus:G},void 0,!1,void 0,this)]},void 0,!0,void 0,this),U0(g0,{marginTop:1,children:U0(p0,{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):U0(g0,{flexDirection:"column",children:I.map((D,C)=>U0(X5,{option:D,index:C,isSelected:w.includes(D.value),isMultiSelect:B.multiSelect,isHighlighted:N===C},D.value,!1,void 0,this))},void 0,!1,void 0,this),!H&&U0(g0,{marginTop:1,flexDirection:"column",children:[U0(p0,{color:"gray",children:B.multiSelect?"Space to toggle · Enter to confirm · 1-9 for quick select":"Enter to select · Up/Down or Tab to navigate · 1-9 for quick select"},void 0,!1,void 0,this),B.multiSelect&&w.length>0&&U0(p0,{color:"green",children:["Selected: ",w.join(", ")]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$.length>1&&U0(g0,{marginTop:1,children:U0(p0,{color:"gray",children:["Question ",F+1," of ",$.length]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{basename as G5}from"node:path";import{Box as y$,Text as U1,useInput as U5}from"ink";import K5 from"ink-select-input";import{useEffect as t2,useMemo as P8,useState as cQ}from"react";import{jsxDEV as D0}from"react/jsx-dev-runtime";function O5($){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 z5($){return G5($)}var _5=({isSelected:$})=>D0(y$,{marginRight:1,children:D0(U1,{color:$?"cyan":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),N5=({isSelected:$,label:Q})=>D0(U1,{color:$?"cyan":"white",bold:$,children:Q},void 0,!1,void 0,this),c$=20,s2=({sessions:$,onSelect:Q,onCancel:Y})=>{let[J,Z]=cQ([]),[q,G]=cQ(!1),[X,K]=cQ(0),F=a0()==="session-selector",O=I0(!1);U5((H,R)=>{if(R.ctrl&&H==="c"||R.meta&&H==="c"){O();return}if(R.escape&&Y){Y();return}if(R.leftArrow||H==="h"||H==="H"){if(X>0)K((S)=>S-1);return}if(R.rightArrow||H==="l"||H==="L"){if(X<N-1)K((S)=>S+1);return}},{isActive:F}),t2(()=>{if($){Z($);return}(async()=>{G(!0);try{let R=await x1.listSessions();Z(R)}catch(R){console.error("[SessionSelector] Failed to load sessions:",R),Z([])}finally{G(!1)}})()},[$]);let _=$||J,z=P8(()=>{return _.map((H)=>{let R=z5(H.projectPath),S=O5(H.lastMessageTime),A=H.gitBranch?` (${H.gitBranch})`:"",b=H.hasErrors?" [!]":"",v=H.relationType==="subagent"?" ↳ subagent":H.relationType==="fork"?" ↳ fork":"";return{label:`${S} | ${R}${A} | ${H.messageCount} 条消息${b}${v}`,value:H.sessionId}})},[_]),N=P8(()=>Math.max(1,Math.ceil(z.length/c$)),[z.length]),W=P8(()=>{let H=X*c$;return z.slice(H,H+c$)},[z,X]),w=P8(()=>({start:X*c$+1,end:Math.min((X+1)*c$,z.length)}),[X,z.length]);t2(()=>{K(0)},[_.length]);let L=(H)=>{Q(H.value)};if(q)return D0(y$,{flexDirection:"column",paddingX:2,paddingY:1,children:D0(U1,{children:"正在加载会话列表..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(_.length===0)return D0(y$,{flexDirection:"column",paddingX:2,paddingY:1,children:[D0(U1,{color:"yellow",children:"没有找到历史会话"},void 0,!1,void 0,this),D0(U1,{dimColor:!0,children:[`
148
+ `,"提示: 开始一次对话后,会话历史将保存到 ~/.blade/projects/"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this);return D0(y$,{flexDirection:"column",paddingX:2,paddingY:1,children:[D0(U1,{bold:!0,color:"cyan",children:"选择要恢复的会话:"},void 0,!1,void 0,this),D0(U1,{dimColor:!0,children:[`
149
+ `,"(Left/Right to page | Up/Down to select | Enter to confirm | Esc to cancel)",`
150
+ `]},void 0,!0,void 0,this),D0(K5,{items:W,onSelect:L,indicatorComponent:_5,itemComponent:N5},void 0,!1,void 0,this),D0(y$,{marginTop:1,flexDirection:"column",children:[D0(U1,{dimColor:!0,children:["第 ",X+1,"/",N," 页 · 共 ",_.length," 个会话 · 显示"," ",w.start,"-",w.end]},void 0,!0,void 0,this),N>1&&D0(y$,{marginTop:1,children:[D0(U1,{color:X>0?"cyan":"gray",children:X>0?"<< 上一页":" "},void 0,!1,void 0,this),D0(U1,{children:" "},void 0,!1,void 0,this),D0(U1,{color:X<N-1?"cyan":"gray",children:X<N-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 S0,Text as b0,useInput as F5}from"ink";import{jsxDEV as o}from"react/jsx-dev-runtime";function $4({onCancel:$}){let Y=e2().getAll(),J=Y.filter((X)=>X.source==="builtin"),Z=Y.filter((X)=>X.source==="user"),q=Y.filter((X)=>X.source==="project"),G=I0(!1,$);if(F5((X,K)=>{if(K.escape)$?.();else if(K.ctrl&&X==="c"||K.meta&&X==="c")G()}),Y.length===0)return o(S0,{flexDirection:"column",paddingY:1,children:[o(S0,{marginBottom:1,children:o(b0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this)},void 0,!1,void 0,this),o(S0,{paddingLeft:2,children:o(b0,{color:"gray",children:"没有找到任何 Skill"},void 0,!1,void 0,this)},void 0,!1,void 0,this),o(S0,{marginTop:1,paddingLeft:2,children:o(b0,{color:"gray",children:"配置文件位置: ~/.blade/skills/ 或 .blade/skills/"},void 0,!1,void 0,this)},void 0,!1,void 0,this),o(S0,{marginTop:1,children:o(b0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return o(S0,{flexDirection:"column",paddingY:1,children:[o(S0,{marginBottom:1,children:[o(b0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this),o(b0,{color:"gray",children:[" (找到 ",Y.length," 个)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),q.length>0&&o(S0,{flexDirection:"column",marginBottom:1,children:[o(S0,{paddingLeft:1,children:[o(b0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),o(b0,{color:"gray",children:" (.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.map((X)=>{let U=X.description.length>80?`${X.description.substring(0,80)}...`:X.description;return o(S0,{flexDirection:"column",paddingLeft:2,children:[o(b0,{children:[o(b0,{bold:!0,color:"green",children:["• ",X.name]},void 0,!0,void 0,this),o(b0,{color:"gray",children:[" - ",U]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),X.allowedTools&&X.allowedTools.length>0&&o(S0,{paddingLeft:2,children:o(b0,{color:"gray",children:["工具: ",X.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),o(S0,{paddingLeft:2,children:o(b0,{color:"gray",dimColor:!0,children:X.path},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},X.name,!0,void 0,this)})]},void 0,!0,void 0,this),Z.length>0&&o(S0,{flexDirection:"column",marginBottom:1,children:[o(S0,{paddingLeft:1,children:[o(b0,{bold:!0,color:"yellow",children:"用户级"},void 0,!1,void 0,this),o(b0,{color:"gray",children:" (~/.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Z.map((X)=>{let U=X.description.length>80?`${X.description.substring(0,80)}...`:X.description;return o(S0,{flexDirection:"column",paddingLeft:2,children:[o(b0,{children:[o(b0,{bold:!0,color:"green",children:["• ",X.name]},void 0,!0,void 0,this),o(b0,{color:"gray",children:[" - ",U]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),X.allowedTools&&X.allowedTools.length>0&&o(S0,{paddingLeft:2,children:o(b0,{color:"gray",children:["工具: ",X.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),o(S0,{paddingLeft:2,children:o(b0,{color:"gray",dimColor:!0,children:X.path},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},X.name,!0,void 0,this)})]},void 0,!0,void 0,this),J.length>0&&o(S0,{flexDirection:"column",marginBottom:1,children:[o(S0,{paddingLeft:1,children:[o(b0,{bold:!0,color:"cyan",children:"内置"},void 0,!1,void 0,this),o(b0,{color:"gray",children:" (builtin)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),J.map((X)=>{let U=X.description.length>80?`${X.description.substring(0,80)}...`:X.description;return o(S0,{flexDirection:"column",paddingLeft:2,children:[o(b0,{children:[o(b0,{bold:!0,color:"green",children:["• ",X.name]},void 0,!0,void 0,this),o(b0,{color:"gray",children:[" - ",U]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),X.userInvocable&&o(S0,{paddingLeft:2,children:o(b0,{color:"blue",children:["命令: /",X.name]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},X.name,!0,void 0,this)})]},void 0,!0,void 0,this),o(S0,{marginTop:1,children:o(b0,{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 W5,Text as P1}from"ink";import H5,{useEffect as L5,useState as Q4}from"react";import{jsxDEV as Z1,Fragment as Y4}from"react/jsx-dev-runtime";var J4=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"];function w5($){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 Z4=H5.memo(()=>{let $=Q0((K)=>K.app.subagentProgress),Q=_0(),[Y,J]=Q4(0),[Z,q]=Q4(0);if(L5(()=>{if(!$||$.status!=="running"){J(0),q(0);return}let K=setInterval(()=>{J((F)=>(F+1)%J4.length)},80),U=setInterval(()=>{q(Date.now()-$.startTime)},1000);return()=>{clearInterval(K),clearInterval(U)}},[$]),!$)return null;let G=$.status==="running"?J4[Y]:$.status==="completed"?"[OK]":"[X]",X=$.status==="running"?Q.colors.info:$.status==="completed"?Q.colors.success:Q.colors.error;return Z1(W5,{paddingX:2,paddingY:0,flexDirection:"row",gap:1,children:[Z1(P1,{color:X,bold:!0,children:G},void 0,!1,void 0,this),Z1(P1,{color:Q.colors.muted,children:"Subagent"},void 0,!1,void 0,this),Z1(P1,{color:Q.colors.text.primary,bold:!0,children:$.type},void 0,!1,void 0,this),Z1(P1,{color:Q.colors.muted,children:"|"},void 0,!1,void 0,this),Z1(P1,{color:Q.colors.text.secondary,children:$.description},void 0,!1,void 0,this),$.currentTool&&Z1(Y4,{children:[Z1(P1,{color:Q.colors.muted,children:"|"},void 0,!1,void 0,this),Z1(P1,{color:Q.colors.warning,children:$.currentTool},void 0,!1,void 0,this)]},void 0,!0,void 0,this),$.status==="running"&&Z>0&&Z1(Y4,{children:[Z1(P1,{color:Q.colors.muted,children:"|"},void 0,!1,void 0,this),Z1(P1,{color:Q.colors.info,children:w5(Z)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});import{useMemoizedFn as B5}from"ahooks";import{Box as _1,Text as h,useInput as b5}from"ink";import A5 from"ink-select-input";import{useState as X4}from"react";import{jsxDEV as E}from"react/jsx-dev-runtime";var q4=q$.map(($)=>({label:$.label,value:$.id})),v5=({theme:$})=>{let{colors:Q}=$;return E(_1,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[E(h,{bold:!0,color:Q.text.primary,children:"代码预览"},void 0,!1,void 0,this),E(h,{children:" "},void 0,!1,void 0,this),E(h,{color:Q.syntax.comment,children:"# function"},void 0,!1,void 0,this),E(h,{children:[E(h,{color:Q.syntax.keyword,children:"def"},void 0,!1,void 0,this)," ",E(h,{color:Q.syntax.function,children:"fibonacci"},void 0,!1,void 0,this),E(h,{color:Q.text.primary,children:"("},void 0,!1,void 0,this),E(h,{color:Q.syntax.variable,children:"n"},void 0,!1,void 0,this),E(h,{color:Q.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E(h,{children:[" ",E(h,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this),E(h,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",E(h,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",E(h,{color:Q.syntax.operator,children:"="},void 0,!1,void 0,this)," ",E(h,{color:Q.syntax.number,children:"0"},void 0,!1,void 0,this),E(h,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",E(h,{color:Q.syntax.number,children:"1"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E(h,{children:[" ",E(h,{color:Q.syntax.keyword,children:"for"},void 0,!1,void 0,this)," ",E(h,{color:Q.syntax.variable,children:"_"},void 0,!1,void 0,this)," ",E(h,{color:Q.syntax.keyword,children:"in"},void 0,!1,void 0,this)," ",E(h,{color:Q.syntax.function,children:"range"},void 0,!1,void 0,this),E(h,{color:Q.text.primary,children:"("},void 0,!1,void 0,this),E(h,{color:Q.syntax.variable,children:"n"},void 0,!1,void 0,this),E(h,{color:Q.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E(h,{children:[" ",E(h,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this),E(h,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",E(h,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",E(h,{color:Q.syntax.operator,children:"="},void 0,!1,void 0,this)," ",E(h,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this),E(h,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",E(h,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this)," ",E(h,{color:Q.syntax.operator,children:"+"},void 0,!1,void 0,this)," ",E(h,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E(h,{children:[" ",E(h,{color:Q.syntax.keyword,children:"return"},void 0,!1,void 0,this)," ",E(h,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E(h,{children:" "},void 0,!1,void 0,this),E(h,{color:Q.error,children:["- print(",E(h,{color:Q.syntax.string,children:'"Hello, "'},void 0,!1,void 0,this)," + name)"]},void 0,!0,void 0,this),E(h,{color:Q.success,children:["+ print(",E(h,{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)},R5=({theme:$})=>{let{colors:Q}=$;return E(_1,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[E(h,{children:" "},void 0,!1,void 0,this),E(h,{bold:!0,color:Q.text.primary,children:"颜色配置"},void 0,!1,void 0,this),E(h,{children:" "},void 0,!1,void 0,this),E(h,{children:[E(h,{color:Q.text.muted,children:"Primary: "},void 0,!1,void 0,this),E(h,{color:Q.primary,children:Q.primary},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E(h,{children:[E(h,{color:Q.text.muted,children:"Success: "},void 0,!1,void 0,this),E(h,{color:Q.success,children:Q.success},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E(h,{children:[E(h,{color:Q.text.muted,children:"Error: "},void 0,!1,void 0,this),E(h,{color:Q.error,children:Q.error},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E(h,{children:[E(h,{color:Q.text.muted,children:"Warning: "},void 0,!1,void 0,this),E(h,{color:Q.warning,children:Q.warning},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E(h,{children:[E(h,{color:Q.text.muted,children:"Info: "},void 0,!1,void 0,this),E(h,{color:Q.info,children:Q.info},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},G4=()=>{let $=k1(),Q=E0.getCurrentThemeName(),Y=q$.findIndex((N)=>N.label===Q),J=Y>=0?q$[Y].theme:q$[0].theme,[Z,q]=X4(J),[G,X]=X4(!1),K=B5(async(N)=>{if(G)return;X(!0);try{await m0().setTheme(N.value),$.closeModal()}catch(W){console.error("主题切换失败:",W instanceof Error?W.message:W)}finally{X(!1)}}),U=(N)=>{let W=q$.find((w)=>w.id===N.value);if(W)q(W.theme)},O=a0()==="theme-selector",_=I0(!1);b5((N,W)=>{if(W.ctrl&&N==="c"||W.meta&&N==="c"){_();return}if(W.escape&&!G)$.closeModal()},{isActive:O});let z=(N)=>{let{isSelected:W,label:w}=N,H=w===Q?"[OK]":" ";return E(h,{color:W?Z.colors.primary:Z.colors.text.primary,children:[H," ",w]},void 0,!0,void 0,this)};return E(_1,{flexDirection:"column",height:"100%",children:[E(_1,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:Z.colors.border.light,children:E(h,{bold:!0,color:Z.colors.primary,children:"主题选择器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E(_1,{flexDirection:"row",flexGrow:1,children:[E(_1,{width:"40%",borderStyle:"single",borderColor:Z.colors.border.light,paddingX:1,children:E(_1,{flexDirection:"column",children:[E(_1,{paddingTop:1,paddingBottom:1,children:E(h,{bold:!0,color:Z.colors.text.primary,children:["可用主题 (",q4.length,")"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),E(A5,{items:q4,initialIndex:Y>=0?Y:0,onSelect:K,onHighlight:U,itemComponent:z},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),E(_1,{width:"60%",flexDirection:"column",borderStyle:"single",borderColor:Z.colors.border.light,children:[E(v5,{theme:Z},void 0,!1,void 0,this),E(R5,{theme:Z},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),E(_1,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:Z.colors.border.light,children:E(h,{color:Z.colors.text.muted,children:G?"正在保存...":"Enter: 选择主题 | Esc: 取消"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{jsxDEV as A0}from"react/jsx-dev-runtime";var l0=f1("UI"),K4=({debug:$,continue:Q,...Y})=>{if($)l0.debug("[Debug] BladeInterface props:",{permissionMode:Y.permissionMode,yolo:Y.yolo,maxTurns:Y.maxTurns,continue:Q});let J=I8(!1),Z=I8(!1),q=I8(!1),G=I8(null),X=Q6(),K=J6(),U=u$(),F=X6(),O=Z6(),_=k1(),z=S1(),N=z6(),W=U$(),w=T1(),L=O6();l1(()=>{if(E0.getCurrentThemeName()!==L)try{E0.setTheme(L)}catch{}},[L]);let H=X==="ready",R=X==="needsSetup",S=X==="idle",{confirmationState:A,confirmationHandler:b,handleResponse:v,dismissAll:B}=c6(),{executeCommand:I,handleAbort:V}=h6(Y.systemPrompt,Y.appendSystemPrompt,b,Y.maxTurns,B),{getPreviousCommand:p,getNextCommand:r,addToHistory:a}=g6();YJ();let t=x6("",0),D=c0(async()=>{let d=W,L0;if(d==="default")L0="autoEdit";else if(d==="autoEdit")L0="plan";else if(d==="plan")L0="default";else L0="default";try{await m0().setPermissionMode(L0)}catch(N1){l0.error("权限模式切换失败:",N1 instanceof Error?N1.message:N1)}}),C=c0(async(d)=>{try{await m0().addModel({name:d.name,provider:d.provider,apiKey:d.apiKey,baseUrl:d.baseUrl,model:d.model}),_.setInitializationStatus("ready")}catch(L0){l0.error("初始化配置保存失败:",L0 instanceof Error?L0.message:L0),_.setInitializationStatus("ready")}}),y=c0(()=>{if(U==="shortcuts")_.closeModal();else _.setActiveModal("shortcuts")}),x=c0(async(d)=>{let L0=Y.forkSession?await x1.forkSession(d,{newSessionId:Y.sessionId,targetProjectPath:N0()}):{sessionId:d,messages:await x1.loadSession(d)},N1=x1.toUISafeMessages(L0.messages);z.restoreSession(L0.sessionId,N1,L0.messages)}),{showSuggestions:u,suggestions:P,selectedSuggestionIndex:i}=JJ(t,I,p,r,a,V,w,D,y,U==="shortcuts");l1(()=>{if(t.value&&U==="shortcuts")_.closeModal()},[t.value,U,_]);let T=c0(async()=>{q.current=!0;try{let d=await x1.listSessions();if(d.length===0){if(Y.forkSession){l0.error("没有可供 fork 的历史会话"),F1(1);return}z.addAssistantMessage("没有找到历史会话,开始新对话。");return}let L0=d[0];await x(L0.sessionId)}catch(d){if(l0.error("[BladeInterface] 继续会话失败:",d),Y.forkSession){F1(1);return}z.addAssistantMessage("继续会话失败,开始新对话。")}}),m=c0(async()=>{q.current=!0;try{if(typeof Y.resume==="string"&&Y.resume!=="true"){await x(Y.resume);return}let d=await x1.listSessions();if(d.length===0)l0.error("没有找到历史会话"),F1(1);_.showSessionSelector(d)}catch(d){l0.error("[BladeInterface] 加载会话失败:",d),F1(1)}});l1(()=>{if(J.current)return;if(Q){J.current=!0,T();return}if(Y.resume)J.current=!0,m()},[Q,Y.resume,T,m]);let k=c0(async(d)=>{let L0=A.details?.type;if(L0==="enterPlanMode"&&d.approved)try{await m0().setPermissionMode("plan"),l0.debug("[BladeInterface] Entered Plan mode")}catch(N1){l0.error("[BladeInterface] Failed to enter Plan mode:",N1)}if(L0==="exitPlanMode"&&d.approved)l0.debug("[BladeInterface] ExitPlanMode approved, Store auto-synced");v(d)}),q0=c0(()=>{z.addAssistantMessage("设置已取消"),z.addAssistantMessage("Blade 需要 API 配置才能正常工作。"),z.addAssistantMessage("您可以稍后运行 Blade 重新进入设置向导。"),F1(0)}),O0=c0(()=>{_.closeModal()}),v0=c0(async(d)=>{try{await x(d),_.closeModal()}catch(L0){l0.error("[BladeInterface] Failed to restore session:",L0),_.closeModal()}}),r0=c0(()=>{if(Y.resume)F1(0);else _.closeModal()}),k0=c0((d)=>{_.showModelEditWizard(d)}),e0=c0((d)=>{z.addAssistantMessage(`已添加模型配置: ${d.name},并已切换到该模型`),O0()}),k8=c0((d)=>{z.addAssistantMessage(`已更新模型配置: ${d.name}`),O0()});l1(()=>{if(R){N.setFocus("model-config-wizard");return}if(A.isVisible)N.setFocus("confirmation-prompt");else if(U==="sessionSelector")N.setFocus("session-selector");else if(U==="themeSelector")N.setFocus("theme-selector");else if(U==="modelSelector")N.setFocus("model-selector");else if(U==="modelAddWizard"||U==="modelEditWizard")N.setFocus("model-config-wizard");else if(U==="permissionsManager")N.setFocus("permissions-manager");else if(U==="agentsManager")N.setFocus("agents-manager");else if(U==="agentCreationWizard")N.setFocus("agent-creation-wizard");else if(U==="hooksManager")N.setFocus("hooks-manager");else if(U==="shortcuts")N.setFocus("main-input");else N.setFocus("main-input")},[R,A.isVisible,U,N.setFocus]),l1(()=>{if(!H||q.current)return;if(U4().length>0){q.current=!0;return}q.current=!0,z.addAssistantMessage("请输入您的问题,我将为您提供帮助。")},[H]),l1(()=>{if(!K)return;if(G.current===K)return;if(G.current=K,X==="error")z.addAssistantMessage(`初始化失败: ${K}`);else z.addAssistantMessage(`${K}`),z.addAssistantMessage("请重新尝试设置,或检查文件权限")},[K,X,z.addAssistantMessage]);let T8=c0(async(d)=>{try{await I({displayText:d,text:d,images:[],parts:[{type:"text",text:d}]})}catch(L0){let N1=L0 instanceof Error?L0.message:"无法发送初始消息";z.addAssistantMessage(`初始消息发送失败:${N1}`)}});l1(()=>{let d=Y.initialMessage?.trim();if(!d||Z.current||!H||R)return;Z.current=!0,a(d),T8(d)},[Y.initialMessage,H,R,I,a]);let y4=c0(async(d)=>{try{await m0().setPermissionMode(d)}catch(L0){l0.error("权限模式初始化失败:",L0 instanceof Error?L0.message:L0)}});if(l1(()=>{let d=Y.permissionMode;if($)l0.debug("[Debug] permissionMode from CLI:",d),l0.debug("[Debug] current permissionMode:",W);if(!d||d===W)return;y4(d)},[Y.permissionMode,W]),S)return null;if(R)return A0(gQ,{mode:"setup",onComplete:C,onCancel:q0},void 0,!1,void 0,this);if($)l0.debug("[Debug] 渲染主界面,条件检查:",{confirmationVisible:A.isVisible,activeModal:U});let lQ=U==="modelSelector",C1=O,I$=U==="modelAddWizard"?"add":U==="modelEditWizard"&&C1?"edit":null,P4=lQ||Boolean(I$),I4=U==="agentsManager",M4=U==="agentCreationWizard",C4=U==="skillsManager",S4=U==="pluginsManager",k4=C1?{name:C1.name,provider:C1.provider,baseUrl:C1.baseUrl,apiKey:C1.apiKey,model:C1.model}:void 0,rQ=A.isVisible&&A.details?A.details.type==="askUserQuestion"&&A.details.questions?A0(n2,{questions:A.details.questions,onComplete:(d)=>k({approved:!0,answers:d}),onCancel:()=>k({approved:!1})},void 0,!1,void 0,this):A0(dJ,{details:A.details,onResponse:k},void 0,!1,void 0,this):U==="themeSelector"?A0(G4,{},void 0,!1,void 0,this):U==="permissionsManager"?A0(a2,{onClose:O0},void 0,!1,void 0,this):U==="sessionSelector"?A0(s2,{sessions:F,onSelect:v0,onCancel:r0},void 0,!1,void 0,this):U==="hooksManager"?A0(rJ,{onClose:O0},void 0,!1,void 0,this):null,aQ=Boolean(rQ);return A0(d1,{flexDirection:"column",width:"100%",overflow:"hidden",children:[rQ,A0(d1,{flexDirection:"column",display:aQ?"none":"flex",children:[A0(I2,{},void 0,!1,void 0,this),A0(Z4,{},void 0,!1,void 0,this),A0(O2,{paused:aQ},void 0,!1,void 0,this),A0(Y2,{input:t.value,cursorPosition:t.cursorPosition,onChange:t.setValue,onChangeCursorPosition:t.setCursorPosition,onAddPasteMapping:t.addPasteMapping,onAddImagePasteMapping:t.addImagePasteMapping},void 0,!1,void 0,this),lQ&&A0(d1,{marginTop:1,paddingX:2,children:A0(M2,{onClose:O0,onEdit:k0},void 0,!1,void 0,this)},void 0,!1,void 0,this),I$&&A0(d1,{marginTop:1,paddingX:2,children:A0(gQ,{mode:I$,modelId:C1?.id,initialConfig:I$==="edit"?k4:void 0,onComplete:I$==="edit"?k8:e0,onCancel:O0},void 0,!1,void 0,this)},void 0,!1,void 0,this),I4&&A0(d1,{marginTop:1,paddingX:2,children:A0(UJ,{onComplete:O0,onCancel:O0},void 0,!1,void 0,this)},void 0,!1,void 0,this),M4&&A0(d1,{marginTop:1,paddingX:2,children:A0(f$,{onComplete:O0,onCancel:O0},void 0,!1,void 0,this)},void 0,!1,void 0,this),C4&&A0(d1,{marginTop:1,paddingX:2,children:A0($4,{onComplete:O0,onCancel:O0},void 0,!1,void 0,this)},void 0,!1,void 0,this),S4&&A0(d1,{marginTop:1,paddingX:2,children:A0(o2,{onComplete:O0,onCancel:O0},void 0,!1,void 0,this)},void 0,!1,void 0,this),A0(WJ,{suggestions:P,selectedIndex:i,visible:u&&!P4},void 0,!1,void 0,this),A0(FJ,{},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)};import{Box as y5,Text as r1}from"ink";import P5 from"react";import{jsxDEV as I1}from"react/jsx-dev-runtime";class M8 extends P5.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(y5,{flexDirection:"column",padding:1,borderStyle:"round",borderColor:"red",children:[I1(r1,{color:"red",children:"应用发生错误"},void 0,!1,void 0,this),I1(r1,{children:" "},void 0,!1,void 0,this),I1(r1,{color:"red",children:this.state.error?.message},void 0,!1,void 0,this),I1(r1,{children:" "},void 0,!1,void 0,this),I1(r1,{color:"gray",children:"错误详情:"},void 0,!1,void 0,this),I1(r1,{color:"gray",children:this.state.error?.stack},void 0,!1,void 0,this),I1(r1,{children:" "},void 0,!1,void 0,this),I1(r1,{color:"yellow",children:"请重启应用或联系开发者"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return this.props.children}}import{Box as G$,Text as M1,useInput as I5}from"ink";import{useState as uQ}from"react";import{jsxDEV as u0}from"react/jsx-dev-runtime";var C8=[{key:"update",label:"Update now",description:`runs \`${z4()}\``},{key:"skip",label:"Skip",description:""},{key:"skip_until_next",label:"Skip until next version",description:""}],N4=({versionInfo:$,onComplete:Q})=>{let[Y,J]=uQ(0),[Z,q]=uQ(!1),[G,X]=uQ(null);I5((U,F)=>{if(F.ctrl&&U==="c"){k$().shutdown("SIGINT",0);return}if(Z||G)return;if(F.upArrow||U==="k")J((O)=>O>0?O-1:C8.length-1);else if(F.downArrow||U==="j")J((O)=>O<C8.length-1?O+1:0);else if(F.return)K(C8[Y].key);else if(U==="1")K("update");else if(U==="2")K("skip");else if(U==="3")K("skip_until_next")});let K=async(U)=>{switch(U){case"update":{q(!0);let F=await _4();X(F.message),setTimeout(()=>{k$().shutdown("SIGINT",0)},1500);break}case"skip":Q();break;case"skip_until_next":if($.latestVersion)await O4($.latestVersion);Q();break}};if(G)return u0(G$,{flexDirection:"column",marginY:1,children:u0(M1,{children:G},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Z)return u0(G$,{flexDirection:"column",marginY:1,children:u0(M1,{color:"cyan",children:"Updating..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);return u0(G$,{flexDirection:"column",marginY:1,children:[u0(M1,{color:"yellow",bold:!0,children:["Update available! ",u0(M1,{color:"gray",children:[$.currentVersion," ","->"," ",$.latestVersion]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),u0(G$,{marginTop:1,children:u0(M1,{color:"gray",children:["Release notes:"," ",u0(M1,{color:"cyan",underline:!0,children:$.releaseNotesUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),u0(G$,{flexDirection:"column",marginTop:1,children:C8.map((U,F)=>{let O=F===Y,_=O?"› ":" ",z=`${F+1}. `;return u0(G$,{children:u0(M1,{color:O?"cyan":void 0,children:[_,z,U.label,U.description&&u0(M1,{color:"gray",children:[" (",U.description,")"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},U.key,!1,void 0,this)})},void 0,!1,void 0,this),u0(G$,{marginTop:1,children:u0(M1,{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)};function P$($){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 S8}from"react/jsx-dev-runtime";function C5($){if(D1().config.actions.setConfig($),$.debug)console.log("[Debug] 模型配置检查通过,准备就绪");W1().setInitializationStatus("ready")}var uz=($)=>{let[Q,Y]=dQ(!1),[J,Z]=dQ(null),[q,G]=dQ(!1),X=xQ((F,O)=>{let _=F instanceof Error?F.message:String(F);if(W1().setInitializationError(_),W1().setInitializationStatus("error"),Y(!0),O)console.error("[FAIL] 应用初始化失败:",_)}),K=xQ(async()=>{try{let F=D1().config.config??W4,O=H4(F,$);if(C5(O),O.resumeSessionId)L4().restoreSession(O.resumeSessionId,[]);if(O.debug)console.error("[Debug] 运行时配置:",O);let _=O.theme;if(_&&E0.hasTheme(_)){if(E0.setTheme(_),$.debug)console.log(`[OK] 已加载主题: ${_}`)}try{let z=V1.loadFromStandardLocations();if($.agents)V1.applyOverrides(A4($.agents));if($.debug&&z>0)console.log(`[OK] 已加载 ${z} 个 subagents: ${V1.getAllNames().join(", ")}`)}catch(z){if($.debug)console.warn("Subagents 加载失败:",P$(z))}try{let z=K1.getInstance();if(z.loadConfig(O.hooks||{}),$.debug&&O.hooks?.enabled)console.log("[OK] Hooks 系统已启用");let N=D1(),W=N.session.sessionId;if(F4(W),z.isEnabled()){let w=N.config.config?.permissionMode||"default",L=!!$.resume,H=await z.executeSessionStartHooks({projectDir:N0(),sessionId:W,permissionMode:w,isResume:L,resumeSessionId:typeof $.resume==="string"?$.resume:void 0});if(H.env){for(let[R,S]of Object.entries(H.env))process.env[R]=S;if($.debug)console.log("[OK] SessionStart hooks 注入环境变量:",Object.keys(H.env).join(", "))}if(H.warning&&$.debug)console.warn("SessionStart hooks 警告:",H.warning)}}catch(z){if($.debug)console.warn("Hooks 初始化失败:",P$(z))}try{let z=await B4();if($.debug&&z.skills.length>0)console.log(`[OK] 已加载 ${z.skills.length} 个 skills: ${z.skills.map((N)=>N.name).join(", ")}`);if(z.errors.length>0&&$.debug)for(let N of z.errors)console.warn(`Skill 加载错误 (${N.path}): ${N.error}`)}catch(z){if($.debug)console.warn("Skills 初始化失败:",P$(z))}try{let z=await R4(N0());if($.debug&&z.commands.length>0)console.log(`[OK] 已加载 ${z.commands.length} 个自定义命令: ${z.commands.map((N)=>N.name).join(", ")}`);if(z.errors.length>0&&$.debug)for(let N of z.errors)console.warn(`自定义命令加载错误 (${N.path}): ${N.error}`)}catch(z){if($.debug)console.warn("自定义命令初始化失败:",P$(z))}try{let N=await y8().initialize(N0(),$.pluginDir||[]);if($.debug&&N.plugins.length>0)console.log(`[OK] 已加载 ${N.plugins.length} 个插件: ${N.plugins.map((W)=>W.manifest.name).join(", ")}`);if(N.plugins.length>0){let W=await v4();if($.debug){let{totalCommands:w,totalSkills:L,totalAgents:H,totalMcpServers:R}=W;console.log(` [OK] 已集成: ${w} 命令, ${L} 技能, ${H} 代理, ${R} MCP 服务器`)}}if(N.errors.length>0&&$.debug)for(let W of N.errors)console.warn(`插件加载错误 (${W.path}): ${W.error}`)}catch(z){if($.debug)console.warn("插件系统初始化失败:",P$(z))}o$(async()=>{await b4.getInstance().killAll(),await w4.getInstance().disconnectAll(),K1.getInstance().cleanup()}),Y(!0)}catch(F){X(F,!!$.debug)}}),U=xQ(async()=>{if($.versionCheckPromise){let F=await $.versionCheckPromise;if(F){Z(F),G(!0);return}}await K()});if(M5(()=>{U()},[]),q&&J)return S8(M8,{children:S8(N4,{versionInfo:J,onComplete:()=>{G(!1),K()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(!Q)return null;return S8(M8,{children:S8(K4,{...$},void 0,!1,void 0,this)},void 0,!1,void 0,this)};export{uz as AppWrapper};