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