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