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