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