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