blade-code 0.10.65 → 0.10.67
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/blade.js +2 -2
- package/dist/{chunk-9ebwtazz.js → chunk-0aja46wq.js} +1 -1
- package/dist/{chunk-czb954vz.js → chunk-0j22w4wh.js} +1 -1
- package/dist/{chunk-eg5mh9m9.js → chunk-0wxkymqv.js} +1 -1
- package/dist/{chunk-ca5mm1gk.js → chunk-1z9wct9w.js} +1 -1
- package/dist/{chunk-57gp2px5.js → chunk-2a9rndk2.js} +1 -1
- package/dist/{chunk-h127mgg2.js → chunk-2kkpn41a.js} +2 -2
- package/dist/{chunk-yrtmkb4a.js → chunk-2wz3mf50.js} +1 -1
- package/dist/chunk-37g8mh93.js +1 -0
- package/dist/{chunk-ka2kn5bs.js → chunk-38x7njj5.js} +2 -2
- package/dist/chunk-3j8q6yrf.js +1 -0
- package/dist/{chunk-5qaacj3x.js → chunk-50jthhfq.js} +1 -1
- package/dist/{chunk-ky32s7az.js → chunk-5147jh26.js} +1 -1
- package/dist/{chunk-rabt8yyf.js → chunk-53xbkvk1.js} +2 -2
- package/dist/{chunk-aphcj8rz.js → chunk-5d2cdvdy.js} +1 -1
- package/dist/{chunk-wzkr0p09.js → chunk-5kz804w9.js} +2 -2
- package/dist/{chunk-s16x4qkb.js → chunk-696t7mzc.js} +1 -1
- package/dist/{chunk-e11kmyt3.js → chunk-6am7zz57.js} +1 -1
- package/dist/{chunk-ngmajm4h.js → chunk-6pyktfa4.js} +1 -1
- package/dist/chunk-7agkmjm7.js +1 -0
- package/dist/{chunk-015t2dey.js → chunk-7pxpwkeg.js} +1 -1
- package/dist/{chunk-rd7jwwse.js → chunk-8mr5vydg.js} +1 -1
- package/dist/chunk-8t2xknh6.js +1 -0
- package/dist/{chunk-1vt7e9e7.js → chunk-98n2rxmq.js} +2 -2
- package/dist/{chunk-zpwasxzh.js → chunk-amaxww4b.js} +2 -2
- package/dist/{chunk-a1m7wr7r.js → chunk-bbcb9jzb.js} +1 -1
- package/dist/{chunk-5gjqdbxb.js → chunk-bjqjdw34.js} +2 -2
- package/dist/{chunk-hbbpe5f0.js → chunk-cdy9efgm.js} +1 -1
- package/dist/chunk-cn9jekw9.js +1 -0
- package/dist/{chunk-s1xp6g8m.js → chunk-dktrankr.js} +1 -1
- package/dist/chunk-e7pssnr9.js +1 -0
- package/dist/chunk-eq99gcj8.js +1 -0
- package/dist/{chunk-5ntrhs8k.js → chunk-eqqxr26g.js} +1 -1
- package/dist/{chunk-y51v2jvh.js → chunk-f99n8812.js} +2 -2
- package/dist/chunk-fs6ashcf.js +1 -0
- package/dist/chunk-gak96awp.js +22 -0
- package/dist/{chunk-98qmtexa.js → chunk-gayy8vky.js} +243 -243
- package/dist/chunk-gn3fxtkj.js +1 -0
- package/dist/chunk-gvxpdb2v.js +1 -0
- package/dist/{chunk-1jm8njkw.js → chunk-h0ft81a3.js} +1 -1
- package/dist/{chunk-k4t45b64.js → chunk-hat9v5c5.js} +1 -1
- package/dist/{chunk-arzhhj0e.js → chunk-hcv17986.js} +1 -1
- package/dist/{chunk-d39xaa7w.js → chunk-k0pa8874.js} +1 -1
- package/dist/{chunk-j6w1vf2q.js → chunk-k5a3n7q5.js} +12 -3
- package/dist/chunk-kccs7c9r.js +10 -0
- package/dist/chunk-kmarzy98.js +1 -0
- package/dist/{chunk-2yxdneb9.js → chunk-m57w4p91.js} +1 -1
- package/dist/{chunk-svczh6hn.js → chunk-nacssmem.js} +2 -2
- package/dist/{chunk-tb4jmrkp.js → chunk-nrh7qjat.js} +1 -1
- package/dist/{chunk-pfmmvpfh.js → chunk-p0gyfy9p.js} +3 -3
- package/dist/{chunk-9yvw5xy3.js → chunk-pf6ftbra.js} +2 -2
- package/dist/{chunk-6tacv9rs.js → chunk-ppsvzgs5.js} +2 -2
- package/dist/{chunk-4t89y8nj.js → chunk-pv576mrv.js} +40 -40
- package/dist/{chunk-m6a1c1tg.js → chunk-rbdd49vr.js} +1 -1
- package/dist/{chunk-53tb8vvv.js → chunk-s7jsadnc.js} +2 -2
- package/dist/{chunk-793067rd.js → chunk-t2gq918a.js} +2 -2
- package/dist/{chunk-gafk33py.js → chunk-t8xmh4w2.js} +1 -1
- package/dist/{chunk-sbpb7pcc.js → chunk-tb363yj8.js} +2 -2
- package/dist/{chunk-ejsggxs4.js → chunk-te88v4a8.js} +2 -2
- package/dist/{chunk-edd8n5r0.js → chunk-th4jjfgm.js} +1 -1
- package/dist/{chunk-7mdbwjxj.js → chunk-v0rsz1rt.js} +1 -1
- package/dist/{chunk-z228cmc5.js → chunk-vavy5dw8.js} +1 -1
- package/dist/{chunk-zxwdtn6q.js → chunk-w5jdnsyz.js} +9 -9
- package/dist/chunk-wr60s2qh.js +1 -0
- package/dist/chunk-xz6y0w4n.js +2 -0
- package/dist/{chunk-5ha0vf37.js → chunk-yn51162x.js} +1 -1
- package/dist/{chunk-eharmsjt.js → chunk-ypqp368c.js} +2 -2
- package/dist/chunk-yq2891kc.js +166 -0
- package/dist/{chunk-r94jtbd2.js → chunk-yvg961q3.js} +1 -1
- package/dist/chunk-yy6h97k0.js +1 -0
- package/dist/chunk-zd05g5qs.js +1 -0
- package/dist/{chunk-a49dy92d.js → chunk-zdxxqchm.js} +2 -2
- package/dist/{chunk-bnp9asmd.js → chunk-zvz2cnt4.js} +1 -1
- package/dist/web/assets/{ChatView-Jfq-sqKG.js → ChatView-BVrhnE2j.js} +6 -6
- package/dist/web/assets/{CodeBlockHighlighter-C9DvlG-V.js → CodeBlockHighlighter-Dy7QpAmC.js} +1 -1
- package/dist/web/assets/{FilePreview-YPtQcXr3.js → FilePreview-BI3nkxz1.js} +2 -2
- package/dist/web/assets/KanbanBoard-D5dYOyPH.js +1 -0
- package/dist/web/assets/{MarkdownRenderer-CpUKw2Gk.js → MarkdownRenderer-Da1vB81L.js} +12 -12
- package/dist/web/assets/{SettingsModal-BfDHa4xn.js → SettingsModal-jcCFqLqS.js} +2 -2
- package/dist/web/assets/TaskSwitcher-CQ--jOLB.js +1 -0
- package/dist/web/assets/{TerminalPanel-CDq3_gCr.js → TerminalPanel-CWzjEXOb.js} +1 -1
- package/dist/web/assets/index-BOgOL4hG.js +11 -0
- package/dist/web/assets/index-DbWgTuT3.css +1 -0
- package/dist/web/assets/{vendor-icons-ICv1v-tf.js → vendor-icons-B63aW_OM.js} +82 -62
- package/dist/web/index.html +3 -3
- package/package.json +2 -2
- package/dist/chunk-0h74p1h8.js +0 -1
- package/dist/chunk-18nkg8hr.js +0 -1
- package/dist/chunk-197qz36b.js +0 -1
- package/dist/chunk-2vdq0fav.js +0 -1
- package/dist/chunk-4a75gwa1.js +0 -1
- package/dist/chunk-76ks3ygm.js +0 -10
- package/dist/chunk-8wvk5rgg.js +0 -1
- package/dist/chunk-98vestg4.js +0 -22
- package/dist/chunk-b7p7ywe6.js +0 -1
- package/dist/chunk-cxc2q3yy.js +0 -1
- package/dist/chunk-fv3aggr5.js +0 -1
- package/dist/chunk-fz60jh3y.js +0 -2
- package/dist/chunk-m19xed90.js +0 -1
- package/dist/chunk-mr5c4yzr.js +0 -1
- package/dist/chunk-pr8a6xfm.js +0 -1
- package/dist/chunk-pwehsv52.js +0 -159
- package/dist/chunk-w4eskwzj.js +0 -1
- package/dist/chunk-y8zk4r3y.js +0 -1
- package/dist/web/assets/TaskSwitcher-DacXxQcV.js +0 -1
- package/dist/web/assets/index-Dxdnbd79.css +0 -1
- package/dist/web/assets/index-t4mGaG1Z.js +0 -11
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import{b as
|
|
2
|
-
`),S4=$}function E2($,Q,Y){try{let J=
|
|
3
|
-
`;
|
|
1
|
+
import{b as QY,c as JY,d as YY}from"./chunk-2wz3mf50.js";import{j as _J,k as NJ}from"./chunk-dktrankr.js";import{u as c8}from"./chunk-696t7mzc.js";import{$ as vJ,B as w6,D as HY,F as s2,G as a2,H as O6,N as h1,P as V4,Q as j4,V as Y8,W as fJ,X as kJ,_ as SJ,da as $4,ea as D6,ga as k6,ha as S6,ia as WY,ja as d4,la as r4,na as b6}from"./chunk-gayy8vky.js";import{ra as x9,sa as u9,ta as l9,wa as FY}from"./chunk-6am7zz57.js";import"./chunk-5147jh26.js";import{cb as e4,db as $6,pb as Q6,yb as u2}from"./chunk-yq2891kc.js";import{Hb as K8}from"./chunk-th4jjfgm.js";import{Ac as m4,Cc as V8,Kc as J8,Nc as P0,_b as a4,mc as v4,rc as D4,yc as g4,zc as x2}from"./chunk-w5jdnsyz.js";import"./chunk-0wxkymqv.js";import"./chunk-zdxxqchm.js";import{od as eJ}from"./chunk-s7jsadnc.js";import{pd as G8,qd as x8,sd as f1}from"./chunk-te88v4a8.js";import"./chunk-bjqjdw34.js";import{Ad as v$,Bd as j8,Cd as z9,Dd as uQ,Ed as ZJ,Fd as _9,Gd as f$,Hd as $1,Id as _Y,Jd as a0,Kd as sJ,Ld as P2,Md as Z8,Pd as u4,Wd as m0,wd as C$,xd as r0,yd as Q$,zd as yQ}from"./chunk-5kz804w9.js";import"./chunk-v508x7cg.js";import"./chunk-0j22w4wh.js";import"./chunk-2kkpn41a.js";import{he as lQ}from"./chunk-f99n8812.js";import"./chunk-yn51162x.js";import"./chunk-tb363yj8.js";import{Ae as TJ,Je as NY,se as I6,ve as uJ}from"./chunk-k5a3n7q5.js";import"./chunk-hat9v5c5.js";import"./chunk-cdy9efgm.js";import"./chunk-zvz2cnt4.js";import{$e as z1,Ze as CQ}from"./chunk-p0gyfy9p.js";import"./chunk-m57w4p91.js";import{bg as OY,gg as IJ,hg as zY}from"./chunk-nacssmem.js";import"./chunk-h0ft81a3.js";import"./chunk-v0rsz1rt.js";import{qg as D$,rg as h8,sg as IQ}from"./chunk-xz6y0w4n.js";import{wg as l0}from"./chunk-k0pa8874.js";import"./chunk-6pyktfa4.js";import{Ug as UY,Xg as e1}from"./chunk-98n2rxmq.js";import{Zg as UJ,_g as OJ,bh as E1}from"./chunk-ypqp368c.js";import"./chunk-t8xmh4w2.js";import{nh as e9}from"./chunk-amaxww4b.js";import{ph as eQ}from"./chunk-t2gq918a.js";import"./chunk-5d2cdvdy.js";import"./chunk-ppsvzgs5.js";import{Bh as MQ}from"./chunk-hcv17986.js";import{useMemoizedFn as v2}from"ahooks";import{useEffect as J7,useState as D2}from"react";import{useMemoizedFn as t0}from"ahooks";import{Box as z$}from"ink";import{useEffect as _$,useMemo as oX,useRef as f2}from"react";import{useShallow as BY}from"zustand/react/shallow";import{useStore as LY}from"zustand";function t($){return LY(f$,$)}var wY=[],k$=()=>t(($)=>$.session.sessionId),T1=()=>t(($)=>$.session.workspaceRoot),Q4=()=>t(($)=>$.session.messages),J4=()=>t(($)=>$.session.clearCount),Y4=()=>t(($)=>$.session.isCompacting),Z4=()=>t(($)=>$.session.tokenUsage.estimatedCostUsd),X4=()=>t(($)=>{let{totalInputTokens:Q,cacheReadTokens:Y,cacheWriteTokens:J}=$.session.tokenUsage;return $4({totalInputTokens:Q,cacheReadTokens:Y,cacheWriteTokens:J}).hitRate}),K4=()=>t(($)=>$.session.providerCircuit),G4=()=>t(($)=>$.session.providerAdmission),q4=()=>t(($)=>$.session.providerRetry),U4=()=>t(($)=>$.session.providerStall),O4=()=>t(($)=>$.session.actionStationarity),n1=()=>t(($)=>$.session.actions),z4=()=>t(($)=>{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)}),_4=()=>t(($)=>$.app.initializationStatus),N4=()=>t(($)=>$.app.initializationError),y8=()=>t(($)=>$.app.activeModal),F4=()=>t(($)=>$.app.tasks),H4=()=>t(($)=>$.app.modelEditorTarget),W4=()=>t(($)=>$.app.sessionSelectorData),L4=()=>t(($)=>$.app.awaitingSecondCtrlC),t1=()=>t(($)=>$.app.actions),R8=()=>t(($)=>$.app.initializationStatus==="ready"),B4=()=>t(($)=>$.app.tasks.length>0),S$=()=>t(($)=>$.config.config?.permissionMode||"default"),w4=()=>t(($)=>$.config.config?.models??wY),M8=()=>t(($)=>{let Q=$.config.config;if(!Q)return;let Y=Q.currentModelId;return Q.models.find((Z)=>Z.id===Y)??Q.models[0]}),C8=()=>t(($)=>$.config.config?.currentModelId),A0=()=>t(($)=>{return r0.getTheme()}),b4=()=>t(($)=>$.config.config?.codeTheme??"default"),e0=()=>t(($)=>$.focus.currentFocus),A4=()=>t(($)=>$.focus.actions),s1=()=>t(($)=>$.command.isProcessing),P4=()=>t(($)=>$.command.actions),I8=()=>t(($)=>$.command.pendingCommands),y4=()=>t(($)=>$.command.recoveredSteeringCount),T8=()=>t(($)=>$.app.thinkingModeEnabled),f8=()=>t(($)=>$.app.reasoningEffort),k8=()=>t(($)=>$.app.serviceTier),S8=()=>t(($)=>$.app.responseVerbosity),v8=()=>t(($)=>$.app.communicationStyle),R4=()=>t(($)=>$.session.currentThinkingContent),M4=()=>t(($)=>$.session.thinkingExpanded),C4=()=>t(($)=>$.session.currentStreamingMessageId),I4=()=>t(BY(($)=>({lines:$.session.currentStreamingLines,tail:$.session.currentStreamingTail,lineCount:$.session.currentStreamingLineCount,version:$.session.currentStreamingVersion}))),T4=()=>t(($)=>$.session.finalizingStreamingMessageId),f4=()=>t(($)=>$.session.historyExpanded),k4=()=>t(($)=>$.session.expandedMessageCount);import{useMemoizedFn as j$}from"ahooks";import{useEffect as l8,useRef as t4}from"react";function bY($){if(!($ instanceof Error))return"未知错误";let J=$.lastError??$;if(J.responseBody)try{let K=JSON.parse(J.responseBody)?.error?.message;if(K){let q=J.statusCode?` (HTTP ${J.statusCode})`:"";return`${K}${q}`}}catch{}let Z=$.message.match(/Last error:\s*(.+)$/);if(Z)return Z[1];return $.message}function AY($){if(!($ instanceof Error))return!1;return $.name==="AbortError"||$.message.includes("aborted")}function PY($){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 D8($){let Q=AY($),Y=PY($),J;if(Y)J="当前模型不支持图片理解功能。请切换到支持视觉能力的模型(如 Claude 4.5、GPT-5.2、Gemini 3 Pro、Qwen3-VL-Plus 等)后重试。";else J=bY($);return{displayMessage:J,isAbort:Q,isVisionNotSupported:Y}}import{appendFileSync as yY,mkdirSync as RY,writeFileSync as MY}from"node:fs";import CY from"node:os";import h2 from"node:path";var S4=null;function IY(){let $=process.env.BLADE_STORAGE_ROOT||h2.join(CY.homedir(),".blade");return h2.join($,"logs","stream-debug.log")}function TY($){if(S4===$)return;let Q=h2.dirname($);RY(Q,{recursive:!0,mode:493}),MY($,`=== Stream Debug Log Started: ${new Date().toISOString()} ===
|
|
2
|
+
`),S4=$}function E2($,Q,Y){try{let J=IY();TY(J);let Z=new Date().toISOString(),X=Y?` | ${JSON.stringify(Y)}`:"",K=`[${Z}] [${$}] ${Q}${X}
|
|
3
|
+
`;yY(J,K)}catch{}}var Q8=e1("UI");function h4($,Q){let Y=!1;return(J)=>{switch(J.kind){case"content_delta":if(Y||$.signal.aborted)break;Q.contentDeltaCount++,Q.contentDeltaTotalLen+=J.delta.length,E2("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($.sessionActions.setProviderCircuit(null),$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),Q8.debug("[loopEventHandler] stream_end",{contentDeltaCount:Q.contentDeltaCount,contentDeltaTotalLen:Q.contentDeltaTotalLen,streamFinalized:Y,signalAborted:$.signal.aborted}),E2("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(),K=$.getStreamingMessageId();if(K){if(Z)v$(K,Z);j8(K)}$.sessionActions.finalizeStreamingMessage(Z,X),Y=!0;break}case"model_fallback":Y=!0,$.sessionActions.setProviderAdmission(null),$.sessionActions.setProviderCircuit(null),$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),$.streamingBuffer.resetStreamingBuffers(),$.sessionActions.discardStreamingMessage(),$.sessionActions.setCurrentThinkingContent(null);break;case"provider_admission":{let{kind:Z,...X}=J;$.sessionActions.setProviderAdmission(J.phase==="queued"?X:null);break}case"provider_circuit":{let{kind:Z,...X}=J;$.sessionActions.setProviderCircuit(J.phase==="closed"?null:X);break}case"provider_retry":{let{kind:Z,...X}=J;$.sessionActions.setProviderRetry(J.phase==="recovered"?null:X);break}case"provider_stall":{let{kind:Z,...X}=J;$.sessionActions.setProviderStall(J.phase==="detected"?X:null);break}case"action_stationarity":{let{kind:Z,...X}=J;$.sessionActions.setActionStationarity(J.phase==="recovered"?null:X);break}case"tool_start":{let Z=J.toolCall;if(!("function"in Z))break;if(Z.function.name===V8)break;if(Q8.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),K=V4(Z.function.name,X);$.sessionActions.addToolMessage(K,{toolCallId:Z.id,toolName:Z.function.name,phase:"start",summary:K,params:X})}catch(X){Q8.error("[loopEventHandler] onToolStart error:",X)}break}case"tool_progress":{let Z=J.toolCall;if(!("function"in Z))break;if(Z.function.name===V8)break;let X=J.update.total!==void 0?` ${Math.max(0,Math.min(100,Math.round((J.update.progress??0)/J.update.total*100)))}%`:"",K=`${Z.function.name}${X}: ${J.update.message}`;$.sessionActions.addToolMessage(K,{toolCallId:Z.id,toolName:Z.function.name,phase:"progress",summary:K,...J.update.admission?{admission:J.update.admission}:{}});break}case"tool_result":{let Z=J.toolCall;if(!("function"in Z))break;if(Z.function.name===V8)break;Q8.debug("[loopEventHandler] tool_result",{toolName:Z.function.name,success:J.result.success});let X=D4(j4(Z.function.name,J.result),v4);$.sessionActions.addToolMessage(X.summary,{toolCallId:Z.id,toolName:Z.function.name,phase:"complete",summary:X.summary,detail:X.detail});break}case"structured_output":$.sessionActions.replaceLastAssistantMessage(JSON.stringify(J.output,null,2));break;case"token_usage":$.sessionActions.updateTokenUsage(J.usage);break;case"compaction":if($.sessionActions.setCompacting(J.phase==="start"),J.phase==="end"){if($.sessionActions.resetContextUsage(),J.outcome!=="failed")Q.compactionCount=(Q.compactionCount??0)+1}break;case"turn_start":Q8.debug("[loopEventHandler] turn_start",{turn:J.turn,maxTurns:J.maxTurns}),$.sessionActions.updateTokenUsage({turnCount:J.turn}),$.sessionActions.setProviderCircuit(null),$.sessionActions.setProviderRetry(null),$.sessionActions.setProviderStall(null),Y=!1;break;case"task_update":$.appActions.setTasks(J.tasks);break;case"mcp_catalog_changed":{let Z=`MCP catalog r${J.revision}: +${J.added.length} -${J.removed.length} ~${J.updated.length}`;$.sessionActions.addToolMessage(Z,{toolName:"MCP Catalog",phase:"complete",summary:Z,detail:[J.added.length>0?`Added: ${J.added.join(", ")}`:"",J.removed.length>0?`Removed: ${J.removed.join(", ")}`:"",J.updated.length>0?`Updated: ${J.updated.join(", ")}`:""].filter(Boolean).join(`
|
|
4
4
|
`)});break}case"mcp_content_changed":{let Z=`MCP ${J.contentKind} r${J.revision}: +${J.added.length} -${J.removed.length} ~${J.updated.length}`;$.sessionActions.addToolMessage(Z,{toolName:"MCP Content",phase:"complete",summary:Z,detail:[J.added.length>0?`Added: ${J.added.join(", ")}`:"",J.removed.length>0?`Removed: ${J.removed.join(", ")}`:"",J.updated.length>0?`Updated: ${J.updated.join(", ")}`:""].filter(Boolean).join(`
|
|
5
5
|
`)});break}case"mcp_resource_updated":{let Z=`MCP resource updated: ${J.uri}`;$.sessionActions.addToolMessage(Z,{toolName:"MCP Resource",phase:"progress",summary:Z,detail:`${J.serverName} · revision ${J.revision}`});break}case"mcp_connection_changed":{let Z=J.phase==="reconnecting"?"recovering":J.phase==="recovered"?"recovered":"recovery failed",X=`MCP ${J.serverName} ${Z}`+(J.phase==="reconnecting"?` (${J.attempt}/${J.maxAttempts})`:"");$.sessionActions.addToolMessage(X,{toolName:"MCP Connection",phase:"complete",summary:X,detail:[`reason: ${J.reason}`,`revision: ${J.revision}`,J.error?`error: ${J.error}`:""].filter(Boolean).join(`
|
|
6
6
|
`)});break}case"mcp_log":{let Z=J.logger?`${J.serverName} · ${J.logger}`:J.serverName,X=`MCP ${J.level} · ${Z}`;$.sessionActions.addToolMessage(X,{toolName:"MCP Log",phase:"complete",summary:X,detail:[J.message,`revision: ${J.revision}`,`sha256: ${J.dataSha256}`,J.truncated?"truncated: true":"",J.detailsOmitted?"details omitted by runtime policy":""].filter(Boolean).join(`
|
|
@@ -8,7 +8,7 @@ import{b as $Y,c as QY,d as JY}from"./chunk-yrtmkb4a.js";import{j as zJ,k as _J}
|
|
|
8
8
|
`)});break}case"mcp_task_changed":{let Z=`MCP task ${J.status}: ${J.taskId} (${J.serverName}/${J.toolName})`;$.sessionActions.addToolMessage(Z,{toolName:"MCP Task",phase:"complete",summary:Z,detail:[J.statusMessage??"",`revision: ${J.revision}`,J.hasResult?"result available via TaskOutput":"",J.error?`error: ${J.error}`:""].filter(Boolean).join(`
|
|
9
9
|
`)});break}case"project_rules_loaded":{let Z=`Project rules loaded: ${J.files.length}`+(J.blockedWrite?" (write retry required)":"");$.sessionActions.addToolMessage(Z,{toolName:"Project Rules",phase:"complete",summary:Z,detail:J.files.map((X)=>`${X.relativePath} ${X.source} sha256=${X.contentSha256}`).join(`
|
|
10
10
|
`)});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((K)=>K.type==="text"?K.text:"[Image]").join(`
|
|
11
|
-
`);$.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 m2($){let{text:Q,parts:Y}=$,J=Y.filter((K)=>K.type==="image");if(J.length===0)return Q;if(J.length>D$)throw Error(`最多只能发送 ${D$} 张图片`);if(J.reduce((K,q)=>K+`data:${q.mimeType};base64,`.length+q.base64.length,0)>h8)throw Error("图片编码后总大小不能超过 5 MiB");let X=[];for(let K of Y)if(K.type==="text")X.push({type:"text",text:K.text});else X.push({type:"image_url",image_url:{url:`data:${K.mimeType};base64,${K.base64}`}});return X}function E4($){let Q=m4($.metadata);return{role:$.role,content:Q?g4(Q):$.content,...$.metadata?{metadata:$.metadata}:{}}}function E8($){if(!$.restoredContextMessages||$.restoredVisibleMessageCount<=0)return $.messages.map(E4);let Q=$.messages.slice($.restoredVisibleMessageCount).map(E4);return[...$.restoredContextMessages,...Q]}import
|
|
11
|
+
`);$.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 m2($){let{text:Q,parts:Y}=$,J=Y.filter((K)=>K.type==="image");if(J.length===0)return Q;if(J.length>D$)throw Error(`最多只能发送 ${D$} 张图片`);if(J.reduce((K,q)=>K+`data:${q.mimeType};base64,`.length+q.base64.length,0)>h8)throw Error("图片编码后总大小不能超过 5 MiB");let X=[];for(let K of Y)if(K.type==="text")X.push({type:"text",text:K.text});else X.push({type:"image_url",image_url:{url:`data:${K.mimeType};base64,${K.base64}`}});return X}function E4($){let Q=m4($.metadata);return{role:$.role,content:Q?g4(Q):$.content,...$.metadata?{metadata:$.metadata}:{}}}function E8($){if(!$.restoredContextMessages||$.restoredVisibleMessageCount<=0)return $.messages.map(E4);let Q=$.messages.slice($.restoredVisibleMessageCount).map(E4);return[...$.restoredContextMessages,...Q]}import fY from"node:path";function p4($){if($.length<=8)return $;return`${$.slice(0,8)}…`}function kY($){return fY.resolve($)}function c4($){if(!$||!u4($))return;$1().config.actions.updateConfig({currentModelId:$})}function x4($){if(!$)return;$1().config.actions.updateConfig({permissionMode:$})}async function g8($,Q){return P0.listSessions({includeSubagents:!1})}async function m8($,Q,Y,J){let{intent:Z,session:X,newSessionId:K,announceFork:q,permissionModeOverride:G}=$,U=kY(X.projectPath);if(Z==="fork"){let z=await P0.forkSession(X.sessionId,{...K?{newSessionId:K}:{},sourceProjectPath:U,targetProjectPath:U}),w=await P0.loadSessionModelContext(z.sessionId,z.metadata.projectPath),_=[...P0.toUISafeMessages(z.messages)];if(q!==!1){let F=Date.parse(z.metadata.lastMessageTime);_.push({id:"fork-announcement-"+z.sessionId,role:"assistant",content:"Forked "+p4(X.sessionId)+" → "+p4(z.sessionId),timestamp:Number.isNaN(F)?0:F})}return await J(),x4(G??z.metadata.permissionMode),c4(z.metadata.selectedModelId),Y.restoreSession(z.sessionId,_,w,z.metadata.projectPath),{sessionId:z.sessionId,messages:w}}await P0.assertSessionWritable(X.sessionId,X.projectPath);let[W,O]=await Promise.all([P0.loadSession(X.sessionId,X.projectPath),P0.loadSessionModelContext(X.sessionId,X.projectPath)]),H=P0.toUISafeMessages(W);return await J(),x4(G??X.permissionMode),c4(X.selectedModelId),Y.restoreSession(X.sessionId,H,O,X.projectPath),{sessionId:X.sessionId,messages:O}}function l4($){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 SY($){return typeof $==="object"&&$!==null&&$.action==="invoke_skill"&&typeof $.skillName==="string"}function vY($){return typeof $==="object"&&$!==null&&$.action==="invoke_custom_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function DY($){return typeof $==="object"&&$!==null&&$.action==="invoke_plugin_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function VY($){return typeof $==="object"&&$!==null&&$.action==="invoke_once_model"&&typeof $.modelId==="string"&&typeof $.prompt==="string"}function jY($){return typeof $==="object"&&$!==null&&["start_goal","resume_goal"].includes(String($.action))&&typeof $.goal?.objective==="string"}function hY($){return typeof $==="object"&&$!==null&&$.action==="rewind_session"&&typeof $.sessionId==="string"&&Array.isArray($.messages)&&Array.isArray($.visibleMessages)}function EY($){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)=>l4(Z))}if(Y==="activate_session")return l4($.session);return!1}function gY($,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"session_archived":{let Z=Q?.session;return J.addAssistantMessage(Z?`会话 ${Z.sessionId} 已归档。`:"当前会话已归档。"),f1(0),!0}case"clear_screen":return J.clearMessages(),J.setError(null),J.resetTokenUsage(),Y.setTasks([]),!0;case"compact_completed":case"compact_fallback":{let Z=Q,X=Z?.compactedMessages;if(X)J.setCompactedContext(X);if(Z?.usage)J.updateTokenUsage({inputTokens:Z.usage.promptTokens,outputTokens:Z.usage.completionTokens,totalTokens:Z.usage.totalTokens,maxContextTokens:Z.maxContextTokens,cacheReadTokens:Z.usage.cacheReadInputTokens??0,cacheWriteTokens:Z.usage.cacheCreationInputTokens??0,costUsd:Z.usage.costUsd});return J.resetContextUsage(),!0}case"exit_application":return f1(0),!0;default:return!1}}async function p2($,Q,Y,J,Z,X,K,q,G,U,W,O,H,z,w=l0(),_){let{text:F}=$;if(!d4(F))return{type:"not_slash"};let N=await r4(F,{cwd:w,surface:"tui",workspaceRoot:w,sessionId:X,messages:K,rewind:q,lifecycle:X===void 0?void 0:{archiveCurrent:async()=>{return await Z(),P0.archiveSession(X,w)}},subagents:G,mcp:U,reasoning:W,serviceTier:O,responseVerbosity:H,communicationStyle:z,codeReview:_,signal:J});if(N.success&&EY(N.data)){if(N.data.action==="select_session")return Q.showSessionSelector(N.data.sessions,N.data.intent),{type:"handled",commandResult:{success:!0}};return await m8(N.data,w,Y,Z),{type:"handled",commandResult:{success:!0}}}if(N.success&&hY(N.data))return Y.restoreSession(N.data.sessionId,N.data.visibleMessages,N.data.messages),Q.setTasks([]),{type:"handled",commandResult:{success:!0}};if(N.message){if(gY(N.message,N.data,Q,Y))return{type:"handled",commandResult:{success:!0}}}if(SY(N.data)){let{skillName:R,skillArgs:B}=N.data,f=B?`Please use the "${R}" skill to help me with: ${B}`:`Please use the "${R}" skill.`;return Y.addUserMessage(f),{type:"continue_as_agent",result:{userDisplayMessage:f,agentInput:{displayText:f,text:f,images:[],parts:[{type:"text",text:f}]},userMessageAlreadyAdded:!0}}}if(vY(N.data)){let{commandName:R,processedContent:B}=N.data;Y.addUserMessage(F);let f=`# Custom Command: /${R}
|
|
12
12
|
|
|
13
13
|
The user has invoked the custom command "/${R}". Follow the instructions below to complete the task.
|
|
14
14
|
|
|
@@ -18,7 +18,7 @@ ${B}
|
|
|
18
18
|
|
|
19
19
|
---
|
|
20
20
|
|
|
21
|
-
Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:F,agentInput:{displayText:F,text:f,images:[],parts:[{type:"text",text:f}]},userMessageAlreadyAdded:!0}}}if(
|
|
21
|
+
Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:F,agentInput:{displayText:F,text:f,images:[],parts:[{type:"text",text:f}]},userMessageAlreadyAdded:!0}}}if(DY(N.data)){let{commandName:R,pluginName:B,processedContent:f}=N.data;Y.addUserMessage(F);let P=`# Plugin Command: /${R}
|
|
22
22
|
|
|
23
23
|
The user has invoked the plugin command "/${R}" from plugin "${B}". Follow the instructions below to complete the task.
|
|
24
24
|
|
|
@@ -28,16 +28,16 @@ ${f}
|
|
|
28
28
|
|
|
29
29
|
---
|
|
30
30
|
|
|
31
|
-
Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:F,agentInput:{displayText:F,text:P,images:[],parts:[{type:"text",text:P}]},userMessageAlreadyAdded:!0}}}if(DY(N.data)){let{modelId:R,prompt:B}=N.data;return Y.addUserMessage(B),{type:"continue_as_agent",result:{userDisplayMessage:B,agentInput:{displayText:B,text:B,images:[],parts:[{type:"text",text:B}]},userMessageAlreadyAdded:!0,onceModelId:R}}}if(VY(N.data)){let R=N.data.goal.objective;return Y.addUserMessage(F),{type:"continue_as_agent",result:{userDisplayMessage:F,agentInput:{displayText:F,text:R,images:[],parts:[{type:"text",text:R}]},userMessageAlreadyAdded:!0,goalContinuationOnly:!0}}}if(!N.success&&N.error)return Y.addAssistantMessage(`${N.error}`),{type:"handled",commandResult:{success:N.success,output:N.message,error:N.error,metadata:N.data}};let S=N.message;if(N.success&&typeof S==="string"&&S.trim()!=="")Y.addAssistantMessage(S);return{type:"handled",commandResult:{success:N.success,output:N.message,error:N.error,metadata:N.data}}}import{useMemoizedFn as R0}from"ahooks";import{useEffect as gY,useRef as p8}from"react";function i4($){let Q=p8(void 0),Y=p8(void 0),J=p8(void 0),Z=p8(void 0),X=R0(async()=>{if(Z.current)return Z.current;let I=Q.current,y=Y.current;if(!I&&!y)return;Q.current=void 0,Y.current=void 0,J.current=void 0;let v=(async()=>{try{await I?.destroy()}finally{await y?.dispose()}})();Z.current=v;try{await v}finally{if(Z.current===v)Z.current=void 0}}),K=R0(async(I)=>{let y=$.workspaceRoot??Y.current?.workspaceRoot??l0();if(Y.current&&(Y.current.sessionId!==I||Y.current.workspaceRoot!==y))await X();if(!Y.current){let v=await P0.findSessionMetadata(I,y),b=v!==void 0&&(await P0.loadSession(I,y)).length>0;Y.current=await h1.create({sessionId:I,workspaceRoot:y,modelId:$.modelId,permissionMode:$.permissionMode??v?.permissionMode,reasoningEffort:v?.reasoningEffort??$.reasoningEffort,serviceTier:v?.serviceTier??$.serviceTier,responseVerbosity:v?.responseVerbosity??$.responseVerbosity,communicationStyle:v?.communicationStyle??$.communicationStyle,communicationStyleDigest:v?.communicationStyleDigest,agents:$.agents,...b?{sessionStart:{isResume:!0,resumeSessionId:I}}:{}});try{J.current={sessionId:I,modelId:v?.selectedModelId,permissionMode:v?.permissionMode,reasoningEffort:v?.reasoningEffort,serviceTier:v?.serviceTier,responseVerbosity:v?.responseVerbosity,communicationStyle:v?.communicationStyle,communicationStyleDigest:v?.communicationStyleDigest},a0().setReasoningEffort(Y.current.getReasoningConfiguration().selection),a0().setServiceTier(Y.current.getServiceTierConfiguration().selection),a0().setResponseVerbosity(Y.current.getResponseVerbosityConfiguration().selection),a0().setCommunicationStyle(Y.current.getCommunicationStyleConfiguration().selection)}catch(V){let p=Y.current;throw Y.current=void 0,await p.dispose().catch(()=>{return}),V}}return Y.current}),q=R0(async(I)=>{let y=I?.sessionId??$.sessionId,v=!!I?.modelId&&I.modelId!==$.modelId,b;if(!v&&y){let V=Y.current!==void 0,p=await K(y),j=I?.modelId??$.modelId,h=I?.reasoningEffort??(V?$.reasoningEffort:p.getReasoningConfiguration().selection),E=I?.serviceTier??(V?$.serviceTier:p.getServiceTierConfiguration().selection),Z0=I?.responseVerbosity??(V?$.responseVerbosity:p.getResponseVerbosityConfiguration().selection),J0=I?.communicationStyle??(V?$.communicationStyle:p.getCommunicationStyleConfiguration().selection),w0=p.getCurrentModelId(),f0=p.getReasoningConfiguration(),c0=p.getServiceTierConfiguration(),h0=p.getResponseVerbosityConfiguration(),H1=p.getCommunicationStyleConfiguration();if($.permissionMode&&(J.current?.sessionId!==y||J.current.permissionMode!==$.permissionMode)){let s0=await P0.setSessionPermissionMode(y,p.workspaceRoot,$.permissionMode);J.current={...J.current,sessionId:y,permissionMode:s0.permissionMode}}await p.refresh({modelId:j,...h?{reasoningEffort:h}:{},...E?{serviceTier:E}:{},...Z0?{responseVerbosity:Z0}:{},...J0?{communicationStyle:J0}:{}});let I1=p.getCommunicationStyleConfiguration();if(I1.source!=="built-in"&&!I1.contentSha256)throw Error("Custom communication style has no provenance");let T$={...j&&j!=="inherit"&&(J.current?.sessionId!==y||J.current.modelId!==j)?{selectedModelId:j}:{},...h&&(J.current?.sessionId!==y||J.current.reasoningEffort!==h)?{reasoningEffort:h}:{},...E&&(J.current?.sessionId!==y||J.current.serviceTier!==E)?{serviceTier:E}:{},...Z0&&(J.current?.sessionId!==y||J.current.responseVerbosity!==Z0)?{responseVerbosity:Z0}:{},...J0&&(J.current?.sessionId!==y||J.current.communicationStyle!==J0||J.current.communicationStyleDigest!==I1.contentSha256)?{communicationStyle:J0,communicationStyleDigest:I1.source==="built-in"?null:I1.contentSha256}:{}};if(Object.keys(T$).length>0)try{let s0=await P0.updateSessionMetadata(y,p.workspaceRoot,T$);J.current={sessionId:y,modelId:s0.selectedModelId,permissionMode:s0.permissionMode,reasoningEffort:s0.reasoningEffort,serviceTier:s0.serviceTier,responseVerbosity:s0.responseVerbosity,communicationStyle:s0.communicationStyle,communicationStyleDigest:s0.communicationStyleDigest}}catch(s0){throw await p.refresh({...w0?{modelId:w0}:{},reasoningEffort:f0.selection,serviceTier:c0.selection,responseVerbosity:h0.selection,communicationStyle:H1.selection}).catch(()=>{return}),s0}b=await Y8.createWithRuntime(p,{sessionId:y,systemPrompt:I?.systemPrompt??$.systemPrompt,appendSystemPrompt:I?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:I?.maxTurns??$.maxTurns,modelId:I?.modelId??$.modelId,permissionMode:I?.permissionMode??$.permissionMode,agents:$.agents})}else b=await Y8.create({systemPrompt:I?.systemPrompt??$.systemPrompt,appendSystemPrompt:I?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:I?.maxTurns??$.maxTurns,modelId:I?.modelId??$.modelId,permissionMode:I?.permissionMode??$.permissionMode,agents:$.agents});return Q.current=b,b}),G=R0(async()=>{if(!$.sessionId)throw Error("No active session to rewind");return(await K($.sessionId)).listRewindCheckpoints()}),U=R0(async(I)=>{if(!$.sessionId)throw Error("No active session to rewind");let v=await(await K($.sessionId)).rewindSession(I);return await X(),v}),W=R0(async()=>{if(!$.sessionId)throw Error("No active session for subagent control");return(await K($.sessionId)).listSubagents()}),O=R0(async(I,y)=>{if(!$.sessionId)throw Error("No active session for subagent control");let v=await K($.sessionId),b=!1,V,p=I,j=(E)=>{let Z0=E.status==="completed"?E.result?.message:E.result?.error||E.result?.message;f$.getState().app.actions.completeSubagentProgress(p,E.status==="completed",Z0)},h=v.resumeSubagent({agentId:I,prompt:y,onEvent:(E)=>{if(E.kind==="tool_start"&&"function"in E.toolCall)f$.getState().app.actions.updateSubagentTool(p,E.toolCall.function.name)},onCompleted:(E)=>{if(b)j(E);else V=E}});if(p=h.session.id,f$.getState().app.actions.startSubagentProgress(h.session.id,h.session.subagentType,`Resumed from ${h.source.id}: ${h.session.description}`),b=!0,V)j(V);return h}),H=R0(async()=>{if(!$.sessionId)throw Error("No active session for MCP content");return(await K($.sessionId)).getMcpContentCatalog()}),z=R0(async(I)=>{if(!$.sessionId)throw Error("No active session for MCP content");await(await K($.sessionId)).refreshMcpContentCatalogs(I)}),w=R0(async(I,y,v)=>{if(!$.sessionId)throw Error("No active session for MCP prompts");return(await K($.sessionId)).getMcpPrompt(I,y,v)}),_=R0(async(I,y,v)=>{if(!$.sessionId)throw Error("No active session for MCP completion");return(await K($.sessionId)).completeMcpArgument(I,y,v)}),F=R0(async(I,y={})=>{if(!$.sessionId)throw Error("No active session for MCP logs");return(await K($.sessionId)).getMcpLogs(I,y)}),C=R0(async(I)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await K($.sessionId)).listMcpTasks(I)}),N=R0(async(I)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await K($.sessionId)).getMcpTask(I)}),S=R0(async(I,y)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await K($.sessionId)).cancelMcpTask(I,y)}),R=R0(async(I,y)=>{if(!$.sessionId)throw Error("No active session for MCP logging");await(await K($.sessionId)).setMcpLoggingLevel(I,y)}),B=R0(async()=>{if(!$.sessionId)throw Error("No active session for MCP instructions");return(await K($.sessionId)).getMcpInstructions()}),f=R0(async()=>{if(!$.sessionId)throw Error("No active session for reasoning effort");return(await K($.sessionId)).getReasoningConfiguration()}),P=R0(async(I)=>{if(!$.sessionId)throw Error("No active session for reasoning effort");let y=await K($.sessionId);if(y.hasTurnOwner())throw Error("Cannot switch reasoning effort while a turn is active");let v=y.getReasoningConfiguration();if(y.resolveReasoningConfiguration(I),v.selection===I)return v;await y.refresh({reasoningEffort:I});try{let b;try{b=await P0.updateSessionMetadata($.sessionId,y.workspaceRoot,{reasoningEffort:I})}catch(V){if(!(V instanceof J8)&&V.code!=="ENOENT")throw V;b=await P0.createSessionMetadata($.sessionId,y.workspaceRoot,{taskStatus:"completed",selectedModelId:y.getCurrentModelId(),reasoningEffort:I,serviceTier:y.getServiceTierConfiguration().selection,responseVerbosity:y.getResponseVerbosityConfiguration().selection,communicationStyle:y.getCommunicationStyleConfiguration().selection})}return J.current={sessionId:$.sessionId,modelId:b.selectedModelId,permissionMode:b.permissionMode,reasoningEffort:b.reasoningEffort,serviceTier:b.serviceTier,responseVerbosity:b.responseVerbosity,communicationStyle:b.communicationStyle,communicationStyleDigest:b.communicationStyleDigest},a0().setReasoningEffort(I),y.getReasoningConfiguration()}catch(b){throw await y.refresh({reasoningEffort:v.selection}),b}}),A=R0(async()=>{if(!$.sessionId)throw Error("No active session for service tier");return(await K($.sessionId)).getServiceTierConfiguration()}),T=R0(async(I)=>{if(!$.sessionId)throw Error("No active session for service tier");let y=await K($.sessionId);if(y.hasTurnOwner())throw Error("Cannot switch service tier while a turn is active");let v=y.getServiceTierConfiguration();if(y.resolveServiceTierConfiguration(I),v.selection===I)return v;await y.refresh({serviceTier:I});try{let b;try{b=await P0.updateSessionMetadata($.sessionId,y.workspaceRoot,{serviceTier:I})}catch(V){if(!(V instanceof J8)&&V.code!=="ENOENT")throw V;b=await P0.createSessionMetadata($.sessionId,y.workspaceRoot,{taskStatus:"completed",selectedModelId:y.getCurrentModelId(),reasoningEffort:y.getReasoningConfiguration().selection,serviceTier:I,responseVerbosity:y.getResponseVerbosityConfiguration().selection,communicationStyle:y.getCommunicationStyleConfiguration().selection})}return J.current={sessionId:$.sessionId,modelId:b.selectedModelId,permissionMode:b.permissionMode,reasoningEffort:b.reasoningEffort,serviceTier:b.serviceTier,responseVerbosity:b.responseVerbosity,communicationStyle:b.communicationStyle,communicationStyleDigest:b.communicationStyleDigest},a0().setServiceTier(I),y.getServiceTierConfiguration()}catch(b){throw await y.refresh({serviceTier:v.selection}),b}}),M=R0(async()=>{if(!$.sessionId)throw Error("No active session for response verbosity");return(await K($.sessionId)).getResponseVerbosityConfiguration()}),L=R0(async(I)=>{if(!$.sessionId)throw Error("No active session for response verbosity");let y=await K($.sessionId);if(y.hasTurnOwner())throw Error("Cannot switch response verbosity while a turn is active");let v=y.getResponseVerbosityConfiguration();if(y.resolveResponseVerbosityConfiguration(I),v.selection===I)return v;await y.refresh({responseVerbosity:I});try{let b;try{b=await P0.updateSessionMetadata($.sessionId,y.workspaceRoot,{responseVerbosity:I})}catch(V){if(!(V instanceof J8)&&V.code!=="ENOENT")throw V;b=await P0.createSessionMetadata($.sessionId,y.workspaceRoot,{taskStatus:"completed",selectedModelId:y.getCurrentModelId(),reasoningEffort:y.getReasoningConfiguration().selection,serviceTier:y.getServiceTierConfiguration().selection,responseVerbosity:I,communicationStyle:y.getCommunicationStyleConfiguration().selection})}return J.current={sessionId:$.sessionId,modelId:b.selectedModelId,permissionMode:b.permissionMode,reasoningEffort:b.reasoningEffort,serviceTier:b.serviceTier,responseVerbosity:b.responseVerbosity,communicationStyle:b.communicationStyle,communicationStyleDigest:b.communicationStyleDigest},a0().setResponseVerbosity(I),y.getResponseVerbosityConfiguration()}catch(b){throw await y.refresh({responseVerbosity:v.selection}),b}}),k=R0(async()=>{if(!$.sessionId)throw Error("No active session for communication style");return(await K($.sessionId)).getCommunicationStyleConfiguration()}),g=R0(async(I)=>{if(!$.sessionId)throw Error("No active session for communication style");let y=await K($.sessionId);if(y.hasTurnOwner())throw Error("Cannot switch communication style while a turn is active");let v=y.getCommunicationStyleConfiguration(),b=y.resolveCommunicationStyleConfiguration(I);if(b.source!=="built-in"&&!b.contentSha256)throw Error("Custom communication style has no provenance");if(v.selection===I)return v;await y.refresh({communicationStyle:I});try{let V;try{V=await P0.updateSessionMetadata($.sessionId,y.workspaceRoot,{communicationStyle:I,communicationStyleDigest:b.source==="built-in"?null:b.contentSha256})}catch(p){if(!(p instanceof J8)&&p.code!=="ENOENT")throw p;V=await P0.createSessionMetadata($.sessionId,y.workspaceRoot,{taskStatus:"completed",selectedModelId:y.getCurrentModelId(),reasoningEffort:y.getReasoningConfiguration().selection,serviceTier:y.getServiceTierConfiguration().selection,responseVerbosity:y.getResponseVerbosityConfiguration().selection,communicationStyle:I,...b.source!=="built-in"&&b.contentSha256?{communicationStyleDigest:b.contentSha256}:{}})}return J.current={sessionId:$.sessionId,modelId:V.selectedModelId,permissionMode:V.permissionMode,reasoningEffort:V.reasoningEffort,serviceTier:V.serviceTier,responseVerbosity:V.responseVerbosity,communicationStyle:V.communicationStyle,communicationStyleDigest:V.communicationStyleDigest},a0().setCommunicationStyle(I),y.getCommunicationStyleConfiguration()}catch(V){throw await y.refresh({communicationStyle:v.selection}),V}}),o=R0(async(I)=>{if(!Y.current)return{accepted:!1,queued:0,reason:"no_active_turn"};return Y.current.enqueueSteering(I,{allowBeforeTurn:!0})}),l=R0(async(I,y)=>{let v=$.sessionId;if(!v)throw Error("User shell command requires a Session");return(await K(v)).executeUserShellCommand(I,y)}),a=R0(async(I,y)=>{let v=$.sessionId;if(!v)throw Error("Code review requires a Session");let b=await K(v);await c8.recoverInterrupted(b.workspaceRoot,v,b);let V=await c8.start({sessionId:v,projectPath:b.workspaceRoot,runtime:b,request:I,signal:y}),p=await V.completion,j=(await c8.list(b.workspaceRoot,v)).find((h)=>h.start.reviewId===V.reviewId);if(!j)throw Error(`Review not found after completion: ${V.reviewId}`);return{reviewId:V.reviewId,status:p.status,findings:p.findings.length,content:a4(j.start,p)}});return gY(()=>{let I=x8(X);return()=>{I(),X().catch(()=>{return})}},[X]),{agentRef:Q,createAgent:q,cleanupAgent:X,steerActiveTurn:o,runCodeReview:a,executeUserShellCommand:l,listRewindCheckpoints:G,rewindSession:U,listSubagents:W,resumeSubagent:O,getMcpContentCatalog:H,refreshMcpContentCatalogs:z,getMcpPrompt:w,completeMcpArgument:_,listMcpTasks:C,getMcpTask:N,cancelMcpTask:S,getMcpLogs:F,setMcpLoggingLevel:R,getMcpInstructions:B,getReasoningConfiguration:f,setReasoningEffort:P,getServiceTierConfiguration:A,setServiceTier:T,getResponseVerbosityConfiguration:M,setResponseVerbosity:L,getCommunicationStyleConfiguration:k,setCommunicationStyle:g}}import{useMemoizedFn as V$}from"ahooks";import{useEffect as mY,useRef as u8}from"react";function o4($){let Q=0;for(let Y of $)if(Y===`
|
|
32
|
-
`)Q++;return Q}function n4($,Q){let Y=Q?.flushTimeout??300,J=Q?.minLinesToFlush??5,Z=Q?.minCharsToFlush??400,X=u8(""),K=u8(null),q=u8(""),G=u8(null),U=V$(()=>{if(X.current){let _=X.current,F=$.appendAssistantContent(_);v$(F,_),X.current=""}if(K.current)clearTimeout(K.current),K.current=null}),W=V$(()=>{if(q.current)$.appendThinkingContent(q.current),q.current="";if(G.current)clearTimeout(G.current),G.current=null}),O=V$((_)=>{X.current+=_;let F=X.current;if(o4(F)>=J||F.length>=Z){U();return}if(!K.current)K.current=setTimeout(U,Y)}),H=V$((_)=>{q.current+=_;let F=q.current;if(o4(F)>=J||F.length>=Z){W();return}if(!G.current)G.current=setTimeout(W,Y)}),z=V$(()=>{if(X.current="",K.current)clearTimeout(K.current),K.current=null;if(q.current="",G.current)clearTimeout(G.current),G.current=null}),w=V$(()=>{if(K.current)clearTimeout(K.current),K.current=null;if(G.current)clearTimeout(G.current),G.current=null;let _=X.current,F=q.current;return X.current="",q.current="",{extraContent:_,extraThinking:F}});return
|
|
31
|
+
Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:F,agentInput:{displayText:F,text:P,images:[],parts:[{type:"text",text:P}]},userMessageAlreadyAdded:!0}}}if(VY(N.data)){let{modelId:R,prompt:B}=N.data;return Y.addUserMessage(B),{type:"continue_as_agent",result:{userDisplayMessage:B,agentInput:{displayText:B,text:B,images:[],parts:[{type:"text",text:B}]},userMessageAlreadyAdded:!0,onceModelId:R}}}if(jY(N.data)){let R=N.data.goal.objective;return Y.addUserMessage(F),{type:"continue_as_agent",result:{userDisplayMessage:F,agentInput:{displayText:F,text:R,images:[],parts:[{type:"text",text:R}]},userMessageAlreadyAdded:!0,goalContinuationOnly:!0}}}if(!N.success&&N.error)return Y.addAssistantMessage(`${N.error}`),{type:"handled",commandResult:{success:N.success,output:N.message,error:N.error,metadata:N.data}};let S=N.message;if(N.success&&typeof S==="string"&&S.trim()!=="")Y.addAssistantMessage(S);return{type:"handled",commandResult:{success:N.success,output:N.message,error:N.error,metadata:N.data}}}import{useMemoizedFn as R0}from"ahooks";import{useEffect as mY,useRef as p8}from"react";function i4($){let Q=p8(void 0),Y=p8(void 0),J=p8(void 0),Z=p8(void 0),X=R0(async()=>{if(Z.current)return Z.current;let I=Q.current,y=Y.current;if(!I&&!y)return;Q.current=void 0,Y.current=void 0,J.current=void 0;let v=(async()=>{try{await I?.destroy()}finally{await y?.dispose()}})();Z.current=v;try{await v}finally{if(Z.current===v)Z.current=void 0}}),K=R0(async(I)=>{let y=$.workspaceRoot??Y.current?.workspaceRoot??l0();if(Y.current&&(Y.current.sessionId!==I||Y.current.workspaceRoot!==y))await X();if(!Y.current){let v=await P0.findSessionMetadata(I,y),b=v!==void 0&&(await P0.loadSession(I,y)).length>0;Y.current=await h1.create({sessionId:I,workspaceRoot:y,modelId:$.modelId,permissionMode:$.permissionMode??v?.permissionMode,reasoningEffort:v?.reasoningEffort??$.reasoningEffort,serviceTier:v?.serviceTier??$.serviceTier,responseVerbosity:v?.responseVerbosity??$.responseVerbosity,communicationStyle:v?.communicationStyle??$.communicationStyle,communicationStyleDigest:v?.communicationStyleDigest,agents:$.agents,...b?{sessionStart:{isResume:!0,resumeSessionId:I}}:{}});try{J.current={sessionId:I,modelId:v?.selectedModelId,permissionMode:v?.permissionMode,reasoningEffort:v?.reasoningEffort,serviceTier:v?.serviceTier,responseVerbosity:v?.responseVerbosity,communicationStyle:v?.communicationStyle,communicationStyleDigest:v?.communicationStyleDigest},a0().setReasoningEffort(Y.current.getReasoningConfiguration().selection),a0().setServiceTier(Y.current.getServiceTierConfiguration().selection),a0().setResponseVerbosity(Y.current.getResponseVerbosityConfiguration().selection),a0().setCommunicationStyle(Y.current.getCommunicationStyleConfiguration().selection)}catch(V){let p=Y.current;throw Y.current=void 0,await p.dispose().catch(()=>{return}),V}}return Y.current}),q=R0(async(I)=>{let y=I?.sessionId??$.sessionId,v=!!I?.modelId&&I.modelId!==$.modelId,b;if(!v&&y){let V=Y.current!==void 0,p=await K(y),j=I?.modelId??$.modelId,h=I?.reasoningEffort??(V?$.reasoningEffort:p.getReasoningConfiguration().selection),E=I?.serviceTier??(V?$.serviceTier:p.getServiceTierConfiguration().selection),Z0=I?.responseVerbosity??(V?$.responseVerbosity:p.getResponseVerbosityConfiguration().selection),J0=I?.communicationStyle??(V?$.communicationStyle:p.getCommunicationStyleConfiguration().selection),w0=p.getCurrentModelId(),k0=p.getReasoningConfiguration(),c0=p.getServiceTierConfiguration(),h0=p.getResponseVerbosityConfiguration(),H1=p.getCommunicationStyleConfiguration();if($.permissionMode&&(J.current?.sessionId!==y||J.current.permissionMode!==$.permissionMode)){let s0=await P0.setSessionPermissionMode(y,p.workspaceRoot,$.permissionMode);J.current={...J.current,sessionId:y,permissionMode:s0.permissionMode}}await p.refresh({modelId:j,...h?{reasoningEffort:h}:{},...E?{serviceTier:E}:{},...Z0?{responseVerbosity:Z0}:{},...J0?{communicationStyle:J0}:{}});let I1=p.getCommunicationStyleConfiguration();if(I1.source!=="built-in"&&!I1.contentSha256)throw Error("Custom communication style has no provenance");let T$={...j&&j!=="inherit"&&(J.current?.sessionId!==y||J.current.modelId!==j)?{selectedModelId:j}:{},...h&&(J.current?.sessionId!==y||J.current.reasoningEffort!==h)?{reasoningEffort:h}:{},...E&&(J.current?.sessionId!==y||J.current.serviceTier!==E)?{serviceTier:E}:{},...Z0&&(J.current?.sessionId!==y||J.current.responseVerbosity!==Z0)?{responseVerbosity:Z0}:{},...J0&&(J.current?.sessionId!==y||J.current.communicationStyle!==J0||J.current.communicationStyleDigest!==I1.contentSha256)?{communicationStyle:J0,communicationStyleDigest:I1.source==="built-in"?null:I1.contentSha256}:{}};if(Object.keys(T$).length>0)try{let s0=await P0.updateSessionMetadata(y,p.workspaceRoot,T$);J.current={sessionId:y,modelId:s0.selectedModelId,permissionMode:s0.permissionMode,reasoningEffort:s0.reasoningEffort,serviceTier:s0.serviceTier,responseVerbosity:s0.responseVerbosity,communicationStyle:s0.communicationStyle,communicationStyleDigest:s0.communicationStyleDigest}}catch(s0){throw await p.refresh({...w0?{modelId:w0}:{},reasoningEffort:k0.selection,serviceTier:c0.selection,responseVerbosity:h0.selection,communicationStyle:H1.selection}).catch(()=>{return}),s0}b=await Y8.createWithRuntime(p,{sessionId:y,systemPrompt:I?.systemPrompt??$.systemPrompt,appendSystemPrompt:I?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:I?.maxTurns??$.maxTurns,modelId:I?.modelId??$.modelId,permissionMode:I?.permissionMode??$.permissionMode,agents:$.agents})}else b=await Y8.create({systemPrompt:I?.systemPrompt??$.systemPrompt,appendSystemPrompt:I?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:I?.maxTurns??$.maxTurns,modelId:I?.modelId??$.modelId,permissionMode:I?.permissionMode??$.permissionMode,agents:$.agents});return Q.current=b,b}),G=R0(async()=>{if(!$.sessionId)throw Error("No active session to rewind");return(await K($.sessionId)).listRewindCheckpoints()}),U=R0(async(I)=>{if(!$.sessionId)throw Error("No active session to rewind");let v=await(await K($.sessionId)).rewindSession(I);return await X(),v}),W=R0(async()=>{if(!$.sessionId)throw Error("No active session for subagent control");return(await K($.sessionId)).listSubagents()}),O=R0(async(I,y)=>{if(!$.sessionId)throw Error("No active session for subagent control");let v=await K($.sessionId),b=!1,V,p=I,j=(E)=>{let Z0=E.status==="completed"?E.result?.message:E.result?.error||E.result?.message;f$.getState().app.actions.completeSubagentProgress(p,E.status==="completed",Z0)},h=v.resumeSubagent({agentId:I,prompt:y,onEvent:(E)=>{if(E.kind==="tool_start"&&"function"in E.toolCall)f$.getState().app.actions.updateSubagentTool(p,E.toolCall.function.name)},onCompleted:(E)=>{if(b)j(E);else V=E}});if(p=h.session.id,f$.getState().app.actions.startSubagentProgress(h.session.id,h.session.subagentType,`Resumed from ${h.source.id}: ${h.session.description}`),b=!0,V)j(V);return h}),H=R0(async()=>{if(!$.sessionId)throw Error("No active session for MCP content");return(await K($.sessionId)).getMcpContentCatalog()}),z=R0(async(I)=>{if(!$.sessionId)throw Error("No active session for MCP content");await(await K($.sessionId)).refreshMcpContentCatalogs(I)}),w=R0(async(I,y,v)=>{if(!$.sessionId)throw Error("No active session for MCP prompts");return(await K($.sessionId)).getMcpPrompt(I,y,v)}),_=R0(async(I,y,v)=>{if(!$.sessionId)throw Error("No active session for MCP completion");return(await K($.sessionId)).completeMcpArgument(I,y,v)}),F=R0(async(I,y={})=>{if(!$.sessionId)throw Error("No active session for MCP logs");return(await K($.sessionId)).getMcpLogs(I,y)}),C=R0(async(I)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await K($.sessionId)).listMcpTasks(I)}),N=R0(async(I)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await K($.sessionId)).getMcpTask(I)}),S=R0(async(I,y)=>{if(!$.sessionId)throw Error("No active session for MCP tasks");return(await K($.sessionId)).cancelMcpTask(I,y)}),R=R0(async(I,y)=>{if(!$.sessionId)throw Error("No active session for MCP logging");await(await K($.sessionId)).setMcpLoggingLevel(I,y)}),B=R0(async()=>{if(!$.sessionId)throw Error("No active session for MCP instructions");return(await K($.sessionId)).getMcpInstructions()}),f=R0(async()=>{if(!$.sessionId)throw Error("No active session for reasoning effort");return(await K($.sessionId)).getReasoningConfiguration()}),P=R0(async(I)=>{if(!$.sessionId)throw Error("No active session for reasoning effort");let y=await K($.sessionId);if(y.hasTurnOwner())throw Error("Cannot switch reasoning effort while a turn is active");let v=y.getReasoningConfiguration();if(y.resolveReasoningConfiguration(I),v.selection===I)return v;await y.refresh({reasoningEffort:I});try{let b;try{b=await P0.updateSessionMetadata($.sessionId,y.workspaceRoot,{reasoningEffort:I})}catch(V){if(!(V instanceof J8)&&V.code!=="ENOENT")throw V;b=await P0.createSessionMetadata($.sessionId,y.workspaceRoot,{taskStatus:"completed",selectedModelId:y.getCurrentModelId(),reasoningEffort:I,serviceTier:y.getServiceTierConfiguration().selection,responseVerbosity:y.getResponseVerbosityConfiguration().selection,communicationStyle:y.getCommunicationStyleConfiguration().selection})}return J.current={sessionId:$.sessionId,modelId:b.selectedModelId,permissionMode:b.permissionMode,reasoningEffort:b.reasoningEffort,serviceTier:b.serviceTier,responseVerbosity:b.responseVerbosity,communicationStyle:b.communicationStyle,communicationStyleDigest:b.communicationStyleDigest},a0().setReasoningEffort(I),y.getReasoningConfiguration()}catch(b){throw await y.refresh({reasoningEffort:v.selection}),b}}),A=R0(async()=>{if(!$.sessionId)throw Error("No active session for service tier");return(await K($.sessionId)).getServiceTierConfiguration()}),T=R0(async(I)=>{if(!$.sessionId)throw Error("No active session for service tier");let y=await K($.sessionId);if(y.hasTurnOwner())throw Error("Cannot switch service tier while a turn is active");let v=y.getServiceTierConfiguration();if(y.resolveServiceTierConfiguration(I),v.selection===I)return v;await y.refresh({serviceTier:I});try{let b;try{b=await P0.updateSessionMetadata($.sessionId,y.workspaceRoot,{serviceTier:I})}catch(V){if(!(V instanceof J8)&&V.code!=="ENOENT")throw V;b=await P0.createSessionMetadata($.sessionId,y.workspaceRoot,{taskStatus:"completed",selectedModelId:y.getCurrentModelId(),reasoningEffort:y.getReasoningConfiguration().selection,serviceTier:I,responseVerbosity:y.getResponseVerbosityConfiguration().selection,communicationStyle:y.getCommunicationStyleConfiguration().selection})}return J.current={sessionId:$.sessionId,modelId:b.selectedModelId,permissionMode:b.permissionMode,reasoningEffort:b.reasoningEffort,serviceTier:b.serviceTier,responseVerbosity:b.responseVerbosity,communicationStyle:b.communicationStyle,communicationStyleDigest:b.communicationStyleDigest},a0().setServiceTier(I),y.getServiceTierConfiguration()}catch(b){throw await y.refresh({serviceTier:v.selection}),b}}),M=R0(async()=>{if(!$.sessionId)throw Error("No active session for response verbosity");return(await K($.sessionId)).getResponseVerbosityConfiguration()}),L=R0(async(I)=>{if(!$.sessionId)throw Error("No active session for response verbosity");let y=await K($.sessionId);if(y.hasTurnOwner())throw Error("Cannot switch response verbosity while a turn is active");let v=y.getResponseVerbosityConfiguration();if(y.resolveResponseVerbosityConfiguration(I),v.selection===I)return v;await y.refresh({responseVerbosity:I});try{let b;try{b=await P0.updateSessionMetadata($.sessionId,y.workspaceRoot,{responseVerbosity:I})}catch(V){if(!(V instanceof J8)&&V.code!=="ENOENT")throw V;b=await P0.createSessionMetadata($.sessionId,y.workspaceRoot,{taskStatus:"completed",selectedModelId:y.getCurrentModelId(),reasoningEffort:y.getReasoningConfiguration().selection,serviceTier:y.getServiceTierConfiguration().selection,responseVerbosity:I,communicationStyle:y.getCommunicationStyleConfiguration().selection})}return J.current={sessionId:$.sessionId,modelId:b.selectedModelId,permissionMode:b.permissionMode,reasoningEffort:b.reasoningEffort,serviceTier:b.serviceTier,responseVerbosity:b.responseVerbosity,communicationStyle:b.communicationStyle,communicationStyleDigest:b.communicationStyleDigest},a0().setResponseVerbosity(I),y.getResponseVerbosityConfiguration()}catch(b){throw await y.refresh({responseVerbosity:v.selection}),b}}),k=R0(async()=>{if(!$.sessionId)throw Error("No active session for communication style");return(await K($.sessionId)).getCommunicationStyleConfiguration()}),g=R0(async(I)=>{if(!$.sessionId)throw Error("No active session for communication style");let y=await K($.sessionId);if(y.hasTurnOwner())throw Error("Cannot switch communication style while a turn is active");let v=y.getCommunicationStyleConfiguration(),b=y.resolveCommunicationStyleConfiguration(I);if(b.source!=="built-in"&&!b.contentSha256)throw Error("Custom communication style has no provenance");if(v.selection===I)return v;await y.refresh({communicationStyle:I});try{let V;try{V=await P0.updateSessionMetadata($.sessionId,y.workspaceRoot,{communicationStyle:I,communicationStyleDigest:b.source==="built-in"?null:b.contentSha256})}catch(p){if(!(p instanceof J8)&&p.code!=="ENOENT")throw p;V=await P0.createSessionMetadata($.sessionId,y.workspaceRoot,{taskStatus:"completed",selectedModelId:y.getCurrentModelId(),reasoningEffort:y.getReasoningConfiguration().selection,serviceTier:y.getServiceTierConfiguration().selection,responseVerbosity:y.getResponseVerbosityConfiguration().selection,communicationStyle:I,...b.source!=="built-in"&&b.contentSha256?{communicationStyleDigest:b.contentSha256}:{}})}return J.current={sessionId:$.sessionId,modelId:V.selectedModelId,permissionMode:V.permissionMode,reasoningEffort:V.reasoningEffort,serviceTier:V.serviceTier,responseVerbosity:V.responseVerbosity,communicationStyle:V.communicationStyle,communicationStyleDigest:V.communicationStyleDigest},a0().setCommunicationStyle(I),y.getCommunicationStyleConfiguration()}catch(V){throw await y.refresh({communicationStyle:v.selection}),V}}),o=R0(async(I)=>{if(!Y.current)return{accepted:!1,queued:0,reason:"no_active_turn"};return Y.current.enqueueSteering(I,{allowBeforeTurn:!0})}),l=R0(async(I,y)=>{let v=$.sessionId;if(!v)throw Error("User shell command requires a Session");return(await K(v)).executeUserShellCommand(I,y)}),a=R0(async(I,y)=>{let v=$.sessionId;if(!v)throw Error("Code review requires a Session");let b=await K(v);await c8.recoverInterrupted(b.workspaceRoot,v,b);let V=await c8.start({sessionId:v,projectPath:b.workspaceRoot,runtime:b,request:I,signal:y}),p=await V.completion,j=(await c8.list(b.workspaceRoot,v)).find((h)=>h.start.reviewId===V.reviewId);if(!j)throw Error(`Review not found after completion: ${V.reviewId}`);return{reviewId:V.reviewId,status:p.status,findings:p.findings.length,content:a4(j.start,p)}});return mY(()=>{let I=x8(X);return()=>{I(),X().catch(()=>{return})}},[X]),{agentRef:Q,createAgent:q,cleanupAgent:X,steerActiveTurn:o,runCodeReview:a,executeUserShellCommand:l,listRewindCheckpoints:G,rewindSession:U,listSubagents:W,resumeSubagent:O,getMcpContentCatalog:H,refreshMcpContentCatalogs:z,getMcpPrompt:w,completeMcpArgument:_,listMcpTasks:C,getMcpTask:N,cancelMcpTask:S,getMcpLogs:F,setMcpLoggingLevel:R,getMcpInstructions:B,getReasoningConfiguration:f,setReasoningEffort:P,getServiceTierConfiguration:A,setServiceTier:T,getResponseVerbosityConfiguration:M,setResponseVerbosity:L,getCommunicationStyleConfiguration:k,setCommunicationStyle:g}}import{useMemoizedFn as V$}from"ahooks";import{useEffect as pY,useRef as u8}from"react";function o4($){let Q=0;for(let Y of $)if(Y===`
|
|
32
|
+
`)Q++;return Q}function n4($,Q){let Y=Q?.flushTimeout??300,J=Q?.minLinesToFlush??5,Z=Q?.minCharsToFlush??400,X=u8(""),K=u8(null),q=u8(""),G=u8(null),U=V$(()=>{if(X.current){let _=X.current,F=$.appendAssistantContent(_);v$(F,_),X.current=""}if(K.current)clearTimeout(K.current),K.current=null}),W=V$(()=>{if(q.current)$.appendThinkingContent(q.current),q.current="";if(G.current)clearTimeout(G.current),G.current=null}),O=V$((_)=>{X.current+=_;let F=X.current;if(o4(F)>=J||F.length>=Z){U();return}if(!K.current)K.current=setTimeout(U,Y)}),H=V$((_)=>{q.current+=_;let F=q.current;if(o4(F)>=J||F.length>=Z){W();return}if(!G.current)G.current=setTimeout(W,Y)}),z=V$(()=>{if(X.current="",K.current)clearTimeout(K.current),K.current=null;if(q.current="",G.current)clearTimeout(G.current),G.current=null}),w=V$(()=>{if(K.current)clearTimeout(K.current),K.current=null;if(G.current)clearTimeout(G.current),G.current=null;let _=X.current,F=q.current;return X.current="",q.current="",{extraContent:_,extraThinking:F}});return pY(()=>{return()=>{z()}},[z]),{batchAppendContent:O,batchAppendThinking:H,flushContentBuffer:U,flushThinkingBuffer:W,resetStreamingBuffers:z,drainPendingBuffers:w}}var c2=e1("UI");function s4($){return $.error?.type==="canceled"||$.error?.type==="aborted"||$.metadata?.abortReason==="interrupt"}var J6=($,Q,Y,J,Z,X)=>{let K=s1(),q=k$(),G=T1(),U=C8(),W=S$(),O=T8(),H=f8(),z=k8(),w=S8(),_=v8(),F=n1(),C=t1(),N=P4(),S=t4(!1),R=t4(!1),{createAgent:B,cleanupAgent:f,steerActiveTurn:P,listRewindCheckpoints:A,rewindSession:T,listSubagents:M,resumeSubagent:L,getMcpContentCatalog:k,refreshMcpContentCatalogs:g,getMcpPrompt:o,completeMcpArgument:l,listMcpTasks:a,getMcpTask:I,cancelMcpTask:y,getMcpLogs:v,setMcpLoggingLevel:b,getMcpInstructions:V,getReasoningConfiguration:p,setReasoningEffort:j,getServiceTierConfiguration:h,setServiceTier:E,getResponseVerbosityConfiguration:Z0,setResponseVerbosity:J0,getCommunicationStyleConfiguration:w0,setCommunicationStyle:k0,runCodeReview:c0,executeUserShellCommand:h0}=i4({sessionId:q,workspaceRoot:G,systemPrompt:$,appendSystemPrompt:Q,maxTurns:J,modelId:U,permissionMode:W,reasoningEffort:H,serviceTier:z,responseVerbosity:w,communicationStyle:_,agents:X}),H1=n4(F),I1=j$(async(q0,y0)=>{if(q0.images.length>0)return{success:!1,error:"User shell commands do not accept image attachments"};let Q0=q0.text.trimStart().slice(1).trim();if(!Q0)return{success:!1,error:"User shell command cannot be empty"};F.setCommand(`! ${Q0}`);try{let _0=await h0(Q0,{signal:y0});if(F.addMessage({id:`user-shell-${_0.executionId}`,role:"user",content:x2(_0.record),timestamp:Date.now(),metadata:{userShellCommand:_0.record}}),_0.delivery==="next_turn")R.current=!0;return{success:_0.record.status!=="spawn_error",output:x2(_0.record),..._0.record.status==="spawn_error"?{error:_0.record.stderr||"User shell command failed"}:{}}}finally{F.setCommand(null)}});l8(()=>{return()=>{H1.resetStreamingBuffers()}},[H1.resetStreamingBuffers]),l8(()=>{if(!O)F.setCurrentThinkingContent(null)},[O,F]);let T$=j$(()=>{if(!K)return;Z?.();let{extraContent:q0,extraThinking:y0}=H1.drainPendingBuffers();N.abort("user-cancel"),C.setTasks([]);let Q0=$1().session.currentStreamingMessageId;if(Q0){if(q0)v$(Q0,q0);j8(Q0)}if(F.finalizeStreamingMessage(q0,y0),!S.current)F.addAssistantMessage("任务已停止"),S.current=!0}),s0=j$(async(q0,y0)=>{let Q0={contentDeltaCount:0,contentDeltaTotalLen:0,compactionCount:0},_0=h4({sessionActions:F,appActions:C,commandActions:N,streamingBuffer:H1,thinkingModeEnabled:O,getStreamingMessageId:()=>$1().session.currentStreamingMessageId,signal:y0.signal},Q0);return{loopResult:await Q6(q0,_0),stats:Q0}}),V2=j$(async(q0)=>{let y0=!1,Q0,_0=!1,x0=q0;try{if(q0.text.trimStart().startsWith("!")){let g0=N.getAbortController()??N.createAbortController();return await I1(q0,g0.signal)}await Z8();let K1=N.getAbortController()??N.createAbortController(),u0=E8($1().session),G1=await p2(q0,C,F,K1.signal,f,q,E8($1().session),{listCheckpoints:A,execute:T},{list:M,resume:L},{getCatalog:k,refresh:g,getPrompt:o,complete:l,listTasks:a,getTask:I,cancelTask:y,getLogs:v,setLoggingLevel:b,getInstructions:V},{get:p,set:j},{get:h,set:E},{get:Z0,set:J0},{get:w0,set:k0},G,{run:c0});if(G1.type==="handled")return G1.commandResult;if(G1.type==="continue_as_agent")y0=G1.result.userMessageAlreadyAdded,Q0=G1.result.onceModelId,_0=G1.result.goalContinuationOnly===!0,x0=G1.result.agentInput;let e$=z1.getInstance(),o1;if(!_0){let g0=await e$.executeUserPromptSubmitHooks(x0.text,{projectDir:G,sessionId:q,permissionMode:W,hasImages:x0.images.length>0,imageCount:x0.images.length});if(!g0.proceed){if(g0.warning)F.addAssistantMessage(`${g0.warning}`);return{success:!1,error:"blocked by hook"}}if(g0.updatedPrompt)x0={...x0,text:g0.updatedPrompt,displayText:g0.updatedPrompt,parts:[{type:"text",text:g0.updatedPrompt},...x0.parts.filter((A8)=>A8.type==="image")]};if(g0.contextInjection)o1=g0.contextInjection}if(!y0)F.addUserMessage(x0.displayText);let b8=m2(x0),r=await B(Q0?{modelId:Q0}:void 0);if(K1.signal.aborted)return c2.info("[handleCommandSubmit] Agent 创建期间已被中止"),{success:!1,error:"aborted"};if(o1)u0.push({role:"system",content:`<user-prompt-submit-hook>
|
|
33
33
|
${o1}
|
|
34
|
-
</user-prompt-submit-hook>`});let K0={messages:u0,userId:"cli-user",sessionId:q,workspaceRoot:G,signal:K1.signal,confirmationHandler:Y,permissionMode:W,onPermissionModeChange:async(g0)=>{await m0().setPermissionMode(g0)}},{loopResult:
|
|
34
|
+
</user-prompt-submit-hook>`});let K0={messages:u0,userId:"cli-user",sessionId:q,workspaceRoot:G,signal:K1.signal,confirmationHandler:Y,permissionMode:W,onPermissionModeChange:async(g0)=>{await m0().setPermissionMode(g0)}},{loopResult:C0,stats:$8}=await s0(r.chatStream(b8,K0,{stream:!0,goalContinuationOnly:_0,onTurnLimitReached:Y?async(g0)=>{let A8=await Y.requestConfirmation({type:"maxTurnsExceeded",message:`已进行 ${g0.turnsCount} 轮对话。是否继续?`,risks:["继续执行可能导致更长的等待时间","可能产生更多的 API 费用"]});return{continue:A8.approved,reason:A8.reason}}:void 0}),K1);if($8.compactionCount>0)F.setCompactedContext(K0.messages);if(C0.success&&C0.metadata?.outputTruncated)F.addAssistantMessage("输出因达到 token 上限被截断,部分内容可能不完整。");let j1=C0.finalMessage||"";if(c2.debug("[handleCommandSubmit] final reply",{success:C0.success,outputLength:j1.length,turnsCount:C0.metadata?.turnsCount,toolCallsCount:C0.metadata?.toolCallsCount}),!C0.success&&!s4(C0)){let g0=C0.error?.message||"任务执行失败";return F.addAssistantMessage(g0),{success:!1,error:g0}}if(!j1||j1.trim()===""){let g0=C0.metadata?.abortReason;if(!S.current&&$8.contentDeltaCount===0&&g0!=="interrupt")return F.addAssistantMessage("已取消"),{success:!0,output:"已取消"};return{success:!0,output:j1??""}}return{success:!0,output:j1}}catch(K1){if(S.current)return{success:!1,error:"aborted"};let u0=D8(K1);return F.addAssistantMessage(`${u0.displayMessage}`),{success:!1,error:u0.displayMessage}}}),V1=j$(async()=>{if($1().command.isProcessing){R.current=!0;return}let q0=await h1.hasPendingInbox(G,q),y0=!q0&&await h1.hasActiveGoal(G,q);if(!q0&&!y0){R.current=!1;return}if($1().command.isProcessing){R.current=!0;return}R.current=!1,await Z8();let Q0=N.createAbortController();H1.resetStreamingBuffers(),F.clearFinalizingStreamingMessageId(),N.setProcessing(!0);try{let _0=await B();if(Q0.signal.aborted)return;let x0=await h1.hasPendingInbox(G,q),K1=!x0&&await h1.hasActiveGoal(G,q);if(!x0&&!K1)return;let u0={messages:E8($1().session),userId:"cli-user",sessionId:q,workspaceRoot:G,signal:Q0.signal,confirmationHandler:Y,permissionMode:W,onPermissionModeChange:async(o1)=>{await m0().setPermissionMode(o1)}},{loopResult:G1,stats:e$}=await s0(_0.chatStream("",u0,{stream:!0,pendingInputOnly:x0,goalContinuationOnly:K1}),Q0);if(e$.compactionCount>0)F.setCompactedContext(u0.messages);if(G1.success&&G1.metadata?.outputTruncated)F.addAssistantMessage("输出因达到 token 上限被截断,部分内容可能不完整。");if(!G1.success&&!s4(G1))F.addAssistantMessage(G1.error?.message||"恢复排队指令失败")}catch(_0){let x0=D8(_0);if(!x0.isAbort)F.setError(`恢复排队指令失败: ${x0.displayMessage}`)}finally{if(N.getAbortController()===Q0)N.setProcessing(!1),N.clearAbortController(Q0),F.setCurrentThinkingContent(null);if(R.current)queueMicrotask(()=>{V1()})}}),j2=j$(async(q0)=>{if(!q0.text.trim()&&q0.images.length===0)return;if(q0.text.trimStart().startsWith("!")&&K){let Q0=N.getAbortController();if(!Q0){F.addAssistantMessage("当前任务没有可用的取消边界,无法执行用户 Shell 命令。");return}let _0=await I1(q0,Q0.signal);if(!_0.success&&_0.error&&_0.error!=="aborted")F.setError(_0.error);return}if(K){if(q0.text.trimStart().startsWith("/")){if(/^\/goal(?:\s|$)/i.test(q0.text.trim())){await Z8();let u0=N.getAbortController()??N.createAbortController();await p2(q0,C,F,u0.signal,f,q,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,G);return}F.addAssistantMessage("活动回合中不能执行 slash command;请先停止任务或等待完成。");return}await Z8();let Q0=await z1.getInstance().executeUserPromptSubmitHooks(q0.text,{projectDir:G,sessionId:q,permissionMode:W,hasImages:q0.images.length>0,imageCount:q0.images.length});if(!Q0.proceed){if(Q0.warning)F.addAssistantMessage(Q0.warning);return}let _0=q0;if(Q0.updatedPrompt)_0={...q0,text:Q0.updatedPrompt,parts:[{type:"text",text:Q0.updatedPrompt},...q0.parts.filter((u0)=>u0.type==="image")]};if(Q0.contextInjection){let u0=`<user-prompt-submit-hook>
|
|
35
35
|
${Q0.contextInjection}
|
|
36
36
|
</user-prompt-submit-hook>`;_0={..._0,text:`${_0.text}
|
|
37
37
|
|
|
38
38
|
${u0}`,parts:[..._0.parts,{type:"text",text:`
|
|
39
39
|
|
|
40
|
-
${u0}`}]}}let x0=m2(_0),K1=await P(x0);if(!K1.accepted){let u0=K1.reason==="queue_full"?"补充指令队列已满,请等待当前任务处理后重试。":"当前任务正在结束,补充指令未入队,请稍后重试。";F.addAssistantMessage(u0);return}if(N.enqueueCommand(q0),F.addUserMessage(q0.displayText),K1.delivery==="next_turn"){if(R.current=!0,!$1().command.isProcessing)queueMicrotask(()=>{V1()})}return}C.setTasks([]),N.setRecoveredSteeringCount(0),S.current=!1;let y0=N.createAbortController();H1.resetStreamingBuffers(),F.clearFinalizingStreamingMessageId(),N.setProcessing(!0);try{let Q0=await V2(q0);if(!Q0.success&&Q0.error&&Q0.error!=="aborted")F.setError(Q0.error)}catch(Q0){let _0=D8(Q0);if(_0.isAbort);else F.setError(`执行失败: ${_0.displayMessage}`)}finally{if(N.getAbortController()===y0){if(N.setProcessing(!1),N.clearAbortController(y0),F.setCurrentThinkingContent(null),R.current)queueMicrotask(()=>{V1()})}}});return l8(()=>{let q0=e4.subscribe((y0)=>{if(y0.type!=="subagent.completion.queued"||!s4(y0,{sessionId:q,projectPath:G}))return;R.current=!0,queueMicrotask(()=>{V1()})});return()=>{q0()}},[V1,q,G]),l8(()=>{let q0=!1;return(async()=>{if(Y)await u2.resolvePendingWithHandler(G,q,Y);else await u2.cancelPendingNonInteractive(G,q);if(q0)return;let[y0,Q0]=await Promise.all([h1.hasPendingInbox(G,q),h1.hasActiveGoal(G,q)]);if(y0||Q0)await V1()})().catch((y0)=>{if(!q0)c2.warn("[useCommandHandler] Failed to recover pending interaction or inbox",y0)}),()=>{q0=!0}},[Y,V1,q,G]),{executeCommand:j2,handleAbort:T$,isProcessing:K,cleanupAgent:f}};import{useMemoizedFn as d8}from"ahooks";import{useState as J6}from"react";var Y6=()=>{let[$,Q]=J6([]),[Y,J]=J6(-1),Z=d8((G,U)=>{let W={display:G,pasteMappings:U?new Map(U):new Map};Q((O)=>[...O,W]),J(-1)}),X=d8(()=>{if($.length===0)return null;let G=Y===-1?$.length-1:Math.max(0,Y-1);return J(G),$[G]||null}),K=d8(()=>{if(Y===-1)return null;let G=Y+1;if(G>=$.length)return J(-1),null;else return J(G),$[G]||null}),q=d8(()=>{J(-1)});return{commandHistory:$,historyIndex:Y,addToHistory:Z,getPreviousCommand:X,getNextCommand:K,resetHistoryIndex:q}};import{useMemoizedFn as X8}from"ahooks";import{useMemo as pY,useRef as Z6,useState as cY}from"react";var X6=()=>{let[$,Q]=cY({isVisible:!1,details:null,resolver:null}),Y=Z6(null),J=Z6([]),Z=X8((W)=>{Y.current=W,Q({isVisible:Boolean(W),details:W?.details??null,resolver:W?.resolve??null})}),X=X8((W,O)=>{if(W.settled)return;if(W.settled=!0,W.signal&&W.abortListener)W.signal.removeEventListener("abort",W.abortListener);W.resolve(O)}),K=X8((W,O)=>{return new Promise((H)=>{let z={details:W,resolve:H,signal:O,settled:!1},w=()=>{if(Y.current===z){X(z,{approved:!1,reason:K8}),Z(J.current.shift()??null);return}let _=J.current.indexOf(z);if(_>=0)J.current.splice(_,1);X(z,{approved:!1,reason:K8})};if(z.abortListener=w,O?.aborted){w();return}if(O?.addEventListener("abort",w,{once:!0}),!Y.current){Z(z);return}J.current.push(z)})}),q=X8((W)=>{let O=Y.current;if(O)X(O,W);let H=J.current.shift()??null;Z(H)}),G=X8(()=>{if(Y.current)X(Y.current,{approved:!1,reason:K8});for(let W of J.current)X(W,{approved:!1,reason:K8});J.current=[],Z(null)}),U=pY(()=>({requestConfirmation:K}),[K]);return{confirmationState:$,confirmationHandler:U,handleResponse:q,dismissAll:G}};import{useMemoizedFn as F$}from"ahooks";import{useRef as K6,useState as xY}from"react";var r8="␞",a8="␟";function i8($){return`${r8}PASTE:${$}:`}function l2(){return a8}var vK=new RegExp(`${r8}PASTE:(\\d+):[\\s\\S]*?${a8}`,"g");function uY($){return $.includes(r8)&&$.includes(a8)}function G6($="",Q=0){let[Y,J]=xY({value:$,cursorPosition:Q}),Z=K6(0),X=K6(new Map),K=F$((z)=>{J((w)=>({value:z,cursorPosition:w.cursorPosition}));for(let w of X.current.keys()){let _=i8(w);if(!z.includes(_))X.current.delete(w)}}),q=F$((z)=>{J((w)=>({...w,cursorPosition:Math.max(0,Math.min(z,w.value.length))}))}),G=F$(()=>{J({value:"",cursorPosition:0}),X.current.clear()}),U=F$((z)=>{Z.current+=1;let w=Z.current;return X.current.set(w,{type:"text",data:z}),w}),W=F$((z,w)=>{let _=[...X.current.values()].filter((S)=>S.type==="image");if(_.length>=D$)throw Error(`最多只能粘贴 ${D$} 张图片`);let F=_.reduce((S,R)=>S+`data:${R.mimeType};base64,`.length+R.data.length,0),C=`data:${w};base64,`.length+z.length;if(F+C>h8)throw Error("图片编码后总大小不能超过 5 MiB");Z.current+=1;let N=Z.current;return X.current.set(N,{type:"image",data:z,mimeType:w}),N}),O=F$((z)=>{for(let[w,_]of z)if(X.current.set(w,_),w>=Z.current)Z.current=w}),H=F$((z)=>{let w=[],_=[];if(!uY(z)){let T=z.trim();if(T)_.push({type:"text",text:T});return{displayText:z,text:z,images:w,parts:_}}let F=new RegExp(`${r8}PASTE:(\\d+):[\\s\\S]*?${a8}`,"g"),C=Array.from(z.matchAll(F)),N=0,S="",R="";for(let T of C){let M=T.index,L=M+T[0].length,k=parseInt(T[1],10),g=X.current.get(k);if(M>N){let o=z.slice(N,M);_.push({type:"text",text:o}),S+=o,R+=o}if(!g)S+=T[0],R+=T[0],_.push({type:"text",text:T[0]});else if(g.type==="text")S+=g.data,R+=g.data,_.push({type:"text",text:g.data});else{let o={id:k,base64:g.data,mimeType:g.mimeType};w.push(o),_.push({type:"image",...o}),R+=`[Image #${k}]`}N=L}if(N<z.length){let T=z.slice(N);_.push({type:"text",text:T}),S+=T,R+=T}let B=[];for(let T of _)if(T.type==="text"&&B.length>0&&B[B.length-1].type==="text")B[B.length-1].text+=T.text;else B.push(T);let f=0,P=B.length;while(f<B.length&&B[f].type==="text"&&B[f].text.trim()==="")f++;while(P>f&&B[P-1].type==="text"&&B[P-1].text.trim()==="")P--;let A=B.slice(f,P);return{displayText:R.trim(),text:S.trim(),images:w,parts:A}});return{value:Y.value,cursorPosition:Y.cursorPosition,setValue:K,setCursorPosition:q,clear:G,pasteMap:X.current,addPasteMapping:U,addImagePasteMapping:W,restorePasteMappings:O,resolveInput:H}}import{useMemoizedFn as H6}from"ahooks";import{useInput as tY}from"ink";import{useEffect as W6,useRef as L6,useState as i2}from"react";function lY($){return{supportsThinking:E1().resolveConfig($).reasoning}}function o8($){return lY($).supportsThinking}import dY from"fast-glob";import rY from"fuse.js";import{useEffect as q6,useMemo as d2,useState as r2}from"react";var h$=null,aY=5000;function iY($,Q){let Y=[...$.matchAll(/(?:^|\s)(@(?:"[^"]*"|(?:[^\\ ]|\\ )*))/g)];for(let J of Y){let Z=J[1],X=J.index+(J[0].length-Z.length),K=X+Z.length;if(Q>=X&&Q<=K){let q=Z.slice(1),G=!1;if(q.startsWith('"')){if(G=!0,q=q.slice(1),q.endsWith('"'))q=q.slice(0,-1)}return{hasQuery:!0,query:q,startIndex:X,endIndex:K,quoted:G}}}return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1}}var oY=[...a2.map(($)=>`${$}/**`),...a2,...U6.map(($)=>`**/${$}`)];function O6($,Q,Y={}){let{cwd:J=l0(),maxSuggestions:Z=15,ignorePatterns:X=oY,debounceDelay:K=300,fuzzyMatch:q=!0}=Y,[G,U]=r2([]),[W,O]=r2(!1),[H,z]=r2(0),w=d2(()=>JSON.stringify(X),[X]),_=d2(()=>{if(Q===void 0)return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1};return iY($,Q)},[$,Q]);q6(()=>{if(!$.includes("@")){U([]),O(!1);return}let C=Date.now();if(h$&&h$.cwd===J&&h$.ignoreKey===w&&C-h$.timestamp<aY){U(h$.files),O(!1);return}let N=!1,R=setTimeout(async()=>{O(!0);try{let f=(await dY("**/*",{cwd:J,dot:!1,followSymbolicLinks:!1,onlyFiles:!1,markDirectories:!0,unique:!0,ignore:X})).map((P)=>P.replace(/\\/g,"/"));if(!N)U(f),h$={cwd:J,ignoreKey:w,files:f,timestamp:C}}catch(B){if(console.error("Failed to load files for @ completion:",B),!N)U([])}finally{if(!N)O(!1)}},K);return()=>{N=!0,clearTimeout(R)}},[$,J,K,w]);let F=d2(()=>{if(!_.hasQuery||G.length===0)return[];let C=_.query.toLowerCase();if(C==="")return G.slice(0,Z);if(q)return new rY(G,{threshold:0.4,ignoreLocation:!0,minMatchCharLength:1}).search(C).slice(0,Z).map((R)=>R.item);return G.filter((N)=>N.toLowerCase().includes(C)).slice(0,Z)},[_,G,Z,q]);return q6(()=>{z(0)},[F]),{..._,suggestions:F,selectedIndex:H,loading:W}}function nY($,Q=!1){if($.includes(" ")||Q)return`@"${$}"`;return`@${$}`}function z6($,Q,Y){if(!Q.hasQuery)return{newInput:$,newCursorPos:$.length};let J=nY(Y,Q.quoted),Z=$.slice(0,Q.startIndex),X=$.slice(Q.endIndex),K=Z+J+" "+X,q=Q.startIndex+J.length+1;return{newInput:K,newCursorPos:q}}import{useMemoizedFn as _6}from"ahooks";import{useEffect as N6,useRef as F6}from"react";var S0=($,Q)=>{let Y=F6(!1),J=F6(null),Z=_6(()=>{if(J.current)clearTimeout(J.current);J.current=setTimeout(()=>{a0().setAwaitingSecondCtrlC(!1),Y.current=!1,J.current=null},3000)}),X=()=>{G8().shutdown("SIGINT",0)},K=_6(()=>{if(!Y.current){if(Y.current=!0,$&&Q)Q();a0().setAwaitingSecondCtrlC(!0),Z()}else{if(J.current)clearTimeout(J.current),J.current=null;a0().setAwaitingSecondCtrlC(!1),X()}});return N6(()=>{if($){if(a0().setAwaitingSecondCtrlC(!1),Y.current=!1,J.current)clearTimeout(J.current),J.current=null}},[$]),N6(()=>{return()=>{if(J.current)clearTimeout(J.current)}},[]),K};var n8=e1("UI"),b6=($,Q,Y,J,Z,X,K,q,G,U)=>{let O=e0()==="main-input",H=$.value,z=$.setValue,w=$.cursorPosition,_=n1(),F=T1(),C=t1(),N=M8(),S=N?o8(N):!1,[R,B]=i2(!1),[f,P]=i2([]),[A,T]=i2(0),M=O6(H,w,{cwd:F,maxSuggestions:10}),L=S0(K||!1,X),k=L6(0),g=500,o=L6(!1);W6(()=>{if(K)o.current=!1},[K]),W6(()=>{if(M.hasQuery&&M.suggestions.length>0){let I=M.suggestions.map((y)=>({command:y,description:B6(y)?`Directory: ${y}`:`File: ${y}`,matchScore:1}));P(I),B(!0),T(0)}else if(H.startsWith("/"))if(H.includes(" "))B(!1),P([]);else{let y=w6(H,F);P(y),B(y.length>0),T(0)}else B(!1),P([])},[H,M.hasQuery,M.suggestions,F]);let l=H6(()=>{_.clearMessages(),_.setError(null)}),a=H6(()=>{n8.debug("[DIAG] handleSubmit called:",{input:H,showSuggestions:R});let I=H.trim();if(I){let y=$.resolveInput(I);n8.debug("[DIAG] Submitting command:",{displayText:I,textLength:y.text.length,imageCount:y.images.length}),B(!1),P([]);let v=$.pasteMap.size>0?new Map($.pasteMap):new Map;Z(I,v),$.clear(),Q(y),n8.debug("[DIAG] Command submitted to onSubmit callback")}else n8.debug("[DIAG] Empty command, not submitting")});return tY((I,y)=>{if(I==="?"&&!H){G?.(),setTimeout(()=>$.clear(),0);return}if(y.backspace||y.delete||y.leftArrow||y.rightArrow||y.pageUp||y.pageDown||!y.ctrl&&!y.meta&&!y.escape&&!y.tab&&!y.upArrow&&!y.downArrow&&!y.return&&!(I==="?"&&!H))return;if(y.ctrl&&I==="c"||y.meta&&I==="c"||y.ctrl&&I==="d"||y.meta&&I==="d"){L();return}if(y.ctrl&&I==="l"||y.meta&&I==="l"){l();return}if(y.ctrl&&I==="t"||y.meta&&I==="t"){_.toggleThinkingExpanded();return}if(y.ctrl&&I==="o"||y.meta&&I==="o"){_.toggleHistoryExpanded();return}if(y.escape){if(U)G?.();else if(K&&X){if(o.current)return;o.current=!0,X()}else if(R)B(!1),P([]);else if(H){let b=Date.now();if(b-k.current<500)$.clear(),k.current=0;else k.current=b}return}if(y.tab&&y.shift){q?.();return}if(y.tab){if(R&&f.length>0){let b=f[A].command;if(M.hasQuery&&M.suggestions.includes(b)){let{newInput:V,newCursorPos:p}=z6(H,M,b);z(V),$.setCursorPosition(p)}else{let V=b+" ";z(V),$.setCursorPosition(V.length)}B(!1),P([])}else if(S)C.toggleThinkingMode();return}if(y.return){a();return}if(y.upArrow){if(R&&f.length>0){let b=f.length-1;T((V)=>V>0?V-1:b)}else{let b=Y();if(b){if(b.pasteMappings.size>0)$.restorePasteMappings(b.pasteMappings);z(b.display),$.setCursorPosition(b.display.length)}}return}if(y.downArrow){if(R&&f.length>0){let b=f.length-1;T((V)=>V<b?V+1:0)}else{let b=J();if(b){if(b.pasteMappings.size>0)$.restorePasteMappings(b.pasteMappings);z(b.display),$.setCursorPosition(b.display.length)}}return}},{isActive:O}),{handleSubmit:a,showSuggestions:R,suggestions:f,selectedSuggestionIndex:A}};import J3 from"ansi-escapes";import{useStdout as Y3}from"ink";import{useCallback as Z3,useEffect as X3,useRef as K3}from"react";import{useStdout as sY}from"ink";import{debounce as eY}from"lodash-es";import{useEffect as $3,useState as Q3}from"react";function E$($=200){let{stdout:Q}=sY(),[Y,J]=Q3(Q.columns||80);return $3(()=>{let Z=eY(()=>{J(Q.columns||80)},$);return Z(),Q.on("resize",Z),()=>{Q.off("resize",Z),Z.cancel()}},[Q,$]),Y}function A6(){let{stdout:$}=Y3(),Q=E$(),Y=K3(!0),J=t((X)=>X.session.actions.incrementClearCount),Z=Z3(()=>{if($)$.write(J3.clearTerminal);J()},[$,J]);return X3(()=>{if(Y.current){Y.current=!1;return}let X=setTimeout(()=>{Z()},300);return()=>{clearTimeout(X)}},[Q,Z]),{refreshStatic:Z}}import P6 from"node:fs";import G3 from"node:os";import o2 from"node:path";import{MultiSelect as q3}from"@inkjs/ui";import{useMemoizedFn as t8}from"ahooks";import{Box as X0,Text as s,useFocus as U3,useFocusManager as O3,useInput as R6}from"ink";import s8 from"ink-select-input";import z3 from"ink-spinner";import q8 from"ink-text-input";import{useEffect as y6,useState as g$}from"react";import{jsxDEV as D}from"react/jsx-dev-runtime";var _3=[{label:"Glob - 文件搜索",value:"Glob"},{label:"Grep - 内容搜索",value:"Grep"},{label:"Read - 读取文件",value:"Read"},{label:"Write - 写入文件",value:"Write"},{label:"Edit - 编辑文件",value:"Edit"},{label:"ApplyPatch - 原子多文件补丁",value:"ApplyPatch"},{label:"Bash - 执行命令",value:"Bash"},{label:"所有工具 (不限制)",value:"all"}],N3=[{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 F3($){if(!$||$.trim()==="")return"名称不能为空";if(!/^[a-z0-9-]+$/.test($))return"名称只能包含小写字母、数字和连字符";if($.startsWith("-")||$.endsWith("-"))return"名称不能以连字符开头或结尾";return null}function U8({onComplete:$,onCancel:Q,initialConfig:Y}){let[J,Z]=g$(Y?"name":"mode"),[X,K]=g$({name:Y?.name||"",description:Y?.description||"",tools:Y?.tools||[],color:Y?.color,location:Y?.location||"project",systemPrompt:Y?.systemPrompt||""}),[q,G]=g$(""),[U,W]=g$(!1),[O,H]=g$(""),[z,w]=g$(Y?"edit":"manual"),{focus:_}=O3(),C={manual:["mode","name","description","tools","color","location","systemPrompt","confirm"],ai:["mode","aiPrompt","aiGenerating","confirm"],edit:["name","description","tools","color","location","systemPrompt","confirm"]}[z];y6(()=>{if(J==="name"||J==="description"||J==="systemPrompt"||J==="aiPrompt")return;_(`step-${J}`)},[J,_]);let N=t8(()=>{let P=C.indexOf(J);if(P<C.length-1)Z(C[P+1])}),S=t8(()=>{if(O)H("");if(J==="confirm"&&z==="ai"){Z("aiPrompt");return}let P=C.indexOf(J);if(P>0)Z(C[P-1]);else Q()}),R=t8(async()=>{W(!0),H("");try{let P=await Y8.create(),A=`你是一个 Subagent 配置生成专家。用户会描述他们想要创建的 agent,你需要根据描述生成一个完整的 agent 配置。
|
|
40
|
+
${u0}`}]}}let x0=m2(_0),K1=await P(x0);if(!K1.accepted){let u0=K1.reason==="queue_full"?"补充指令队列已满,请等待当前任务处理后重试。":"当前任务正在结束,补充指令未入队,请稍后重试。";F.addAssistantMessage(u0);return}if(N.enqueueCommand(q0),F.addUserMessage(q0.displayText),K1.delivery==="next_turn"){if(R.current=!0,!$1().command.isProcessing)queueMicrotask(()=>{V1()})}return}C.setTasks([]),N.setRecoveredSteeringCount(0),S.current=!1;let y0=N.createAbortController();H1.resetStreamingBuffers(),F.clearFinalizingStreamingMessageId(),N.setProcessing(!0);try{let Q0=await V2(q0);if(!Q0.success&&Q0.error&&Q0.error!=="aborted")F.setError(Q0.error)}catch(Q0){let _0=D8(Q0);if(_0.isAbort);else F.setError(`执行失败: ${_0.displayMessage}`)}finally{if(N.getAbortController()===y0){if(N.setProcessing(!1),N.clearAbortController(y0),F.setCurrentThinkingContent(null),R.current)queueMicrotask(()=>{V1()})}}});return l8(()=>{let q0=$6.subscribe((y0)=>{if(y0.type!=="subagent.completion.queued"||!e4(y0,{sessionId:q,projectPath:G}))return;R.current=!0,queueMicrotask(()=>{V1()})});return()=>{q0()}},[V1,q,G]),l8(()=>{let q0=!1;return(async()=>{if(Y)await u2.resolvePendingWithHandler(G,q,Y);else await u2.cancelPendingNonInteractive(G,q);if(q0)return;let[y0,Q0]=await Promise.all([h1.hasPendingInbox(G,q),h1.hasActiveGoal(G,q)]);if(y0||Q0)await V1()})().catch((y0)=>{if(!q0)c2.warn("[useCommandHandler] Failed to recover pending interaction or inbox",y0)}),()=>{q0=!0}},[Y,V1,q,G]),{executeCommand:j2,handleAbort:T$,isProcessing:K,cleanupAgent:f}};import{useMemoizedFn as d8}from"ahooks";import{useState as Y6}from"react";var Z6=()=>{let[$,Q]=Y6([]),[Y,J]=Y6(-1),Z=d8((G,U)=>{let W={display:G,pasteMappings:U?new Map(U):new Map};Q((O)=>[...O,W]),J(-1)}),X=d8(()=>{if($.length===0)return null;let G=Y===-1?$.length-1:Math.max(0,Y-1);return J(G),$[G]||null}),K=d8(()=>{if(Y===-1)return null;let G=Y+1;if(G>=$.length)return J(-1),null;else return J(G),$[G]||null}),q=d8(()=>{J(-1)});return{commandHistory:$,historyIndex:Y,addToHistory:Z,getPreviousCommand:X,getNextCommand:K,resetHistoryIndex:q}};import{useMemoizedFn as X8}from"ahooks";import{useMemo as cY,useRef as X6,useState as xY}from"react";var K6=()=>{let[$,Q]=xY({isVisible:!1,details:null,resolver:null}),Y=X6(null),J=X6([]),Z=X8((W)=>{Y.current=W,Q({isVisible:Boolean(W),details:W?.details??null,resolver:W?.resolve??null})}),X=X8((W,O)=>{if(W.settled)return;if(W.settled=!0,W.signal&&W.abortListener)W.signal.removeEventListener("abort",W.abortListener);W.resolve(O)}),K=X8((W,O)=>{return new Promise((H)=>{let z={details:W,resolve:H,signal:O,settled:!1},w=()=>{if(Y.current===z){X(z,{approved:!1,reason:K8}),Z(J.current.shift()??null);return}let _=J.current.indexOf(z);if(_>=0)J.current.splice(_,1);X(z,{approved:!1,reason:K8})};if(z.abortListener=w,O?.aborted){w();return}if(O?.addEventListener("abort",w,{once:!0}),!Y.current){Z(z);return}J.current.push(z)})}),q=X8((W)=>{let O=Y.current;if(O)X(O,W);let H=J.current.shift()??null;Z(H)}),G=X8(()=>{if(Y.current)X(Y.current,{approved:!1,reason:K8});for(let W of J.current)X(W,{approved:!1,reason:K8});J.current=[],Z(null)}),U=cY(()=>({requestConfirmation:K}),[K]);return{confirmationState:$,confirmationHandler:U,handleResponse:q,dismissAll:G}};import{useMemoizedFn as F$}from"ahooks";import{useRef as G6,useState as uY}from"react";var r8="␞",a8="␟";function i8($){return`${r8}PASTE:${$}:`}function l2(){return a8}var DK=new RegExp(`${r8}PASTE:(\\d+):[\\s\\S]*?${a8}`,"g");function lY($){return $.includes(r8)&&$.includes(a8)}function q6($="",Q=0){let[Y,J]=uY({value:$,cursorPosition:Q}),Z=G6(0),X=G6(new Map),K=F$((z)=>{J((w)=>({value:z,cursorPosition:w.cursorPosition}));for(let w of X.current.keys()){let _=i8(w);if(!z.includes(_))X.current.delete(w)}}),q=F$((z)=>{J((w)=>({...w,cursorPosition:Math.max(0,Math.min(z,w.value.length))}))}),G=F$(()=>{J({value:"",cursorPosition:0}),X.current.clear()}),U=F$((z)=>{Z.current+=1;let w=Z.current;return X.current.set(w,{type:"text",data:z}),w}),W=F$((z,w)=>{let _=[...X.current.values()].filter((S)=>S.type==="image");if(_.length>=D$)throw Error(`最多只能粘贴 ${D$} 张图片`);let F=_.reduce((S,R)=>S+`data:${R.mimeType};base64,`.length+R.data.length,0),C=`data:${w};base64,`.length+z.length;if(F+C>h8)throw Error("图片编码后总大小不能超过 5 MiB");Z.current+=1;let N=Z.current;return X.current.set(N,{type:"image",data:z,mimeType:w}),N}),O=F$((z)=>{for(let[w,_]of z)if(X.current.set(w,_),w>=Z.current)Z.current=w}),H=F$((z)=>{let w=[],_=[];if(!lY(z)){let T=z.trim();if(T)_.push({type:"text",text:T});return{displayText:z,text:z,images:w,parts:_}}let F=new RegExp(`${r8}PASTE:(\\d+):[\\s\\S]*?${a8}`,"g"),C=Array.from(z.matchAll(F)),N=0,S="",R="";for(let T of C){let M=T.index,L=M+T[0].length,k=parseInt(T[1],10),g=X.current.get(k);if(M>N){let o=z.slice(N,M);_.push({type:"text",text:o}),S+=o,R+=o}if(!g)S+=T[0],R+=T[0],_.push({type:"text",text:T[0]});else if(g.type==="text")S+=g.data,R+=g.data,_.push({type:"text",text:g.data});else{let o={id:k,base64:g.data,mimeType:g.mimeType};w.push(o),_.push({type:"image",...o}),R+=`[Image #${k}]`}N=L}if(N<z.length){let T=z.slice(N);_.push({type:"text",text:T}),S+=T,R+=T}let B=[];for(let T of _)if(T.type==="text"&&B.length>0&&B[B.length-1].type==="text")B[B.length-1].text+=T.text;else B.push(T);let f=0,P=B.length;while(f<B.length&&B[f].type==="text"&&B[f].text.trim()==="")f++;while(P>f&&B[P-1].type==="text"&&B[P-1].text.trim()==="")P--;let A=B.slice(f,P);return{displayText:R.trim(),text:S.trim(),images:w,parts:A}});return{value:Y.value,cursorPosition:Y.cursorPosition,setValue:K,setCursorPosition:q,clear:G,pasteMap:X.current,addPasteMapping:U,addImagePasteMapping:W,restorePasteMappings:O,resolveInput:H}}import{useMemoizedFn as W6}from"ahooks";import{useInput as sY}from"ink";import{useEffect as L6,useRef as B6,useState as i2}from"react";function dY($){return{supportsThinking:E1().resolveConfig($).reasoning}}function o8($){return dY($).supportsThinking}import rY from"fast-glob";import aY from"fuse.js";import{useEffect as U6,useMemo as d2,useState as r2}from"react";var h$=null,iY=5000;function oY($,Q){let Y=[...$.matchAll(/(?:^|\s)(@(?:"[^"]*"|(?:[^\\ ]|\\ )*))/g)];for(let J of Y){let Z=J[1],X=J.index+(J[0].length-Z.length),K=X+Z.length;if(Q>=X&&Q<=K){let q=Z.slice(1),G=!1;if(q.startsWith('"')){if(G=!0,q=q.slice(1),q.endsWith('"'))q=q.slice(0,-1)}return{hasQuery:!0,query:q,startIndex:X,endIndex:K,quoted:G}}}return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1}}var nY=[...a2.map(($)=>`${$}/**`),...a2,...O6.map(($)=>`**/${$}`)];function z6($,Q,Y={}){let{cwd:J=l0(),maxSuggestions:Z=15,ignorePatterns:X=nY,debounceDelay:K=300,fuzzyMatch:q=!0}=Y,[G,U]=r2([]),[W,O]=r2(!1),[H,z]=r2(0),w=d2(()=>JSON.stringify(X),[X]),_=d2(()=>{if(Q===void 0)return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1};return oY($,Q)},[$,Q]);U6(()=>{if(!$.includes("@")){U([]),O(!1);return}let C=Date.now();if(h$&&h$.cwd===J&&h$.ignoreKey===w&&C-h$.timestamp<iY){U(h$.files),O(!1);return}let N=!1,R=setTimeout(async()=>{O(!0);try{let f=(await rY("**/*",{cwd:J,dot:!1,followSymbolicLinks:!1,onlyFiles:!1,markDirectories:!0,unique:!0,ignore:X})).map((P)=>P.replace(/\\/g,"/"));if(!N)U(f),h$={cwd:J,ignoreKey:w,files:f,timestamp:C}}catch(B){if(console.error("Failed to load files for @ completion:",B),!N)U([])}finally{if(!N)O(!1)}},K);return()=>{N=!0,clearTimeout(R)}},[$,J,K,w]);let F=d2(()=>{if(!_.hasQuery||G.length===0)return[];let C=_.query.toLowerCase();if(C==="")return G.slice(0,Z);if(q)return new aY(G,{threshold:0.4,ignoreLocation:!0,minMatchCharLength:1}).search(C).slice(0,Z).map((R)=>R.item);return G.filter((N)=>N.toLowerCase().includes(C)).slice(0,Z)},[_,G,Z,q]);return U6(()=>{z(0)},[F]),{..._,suggestions:F,selectedIndex:H,loading:W}}function tY($,Q=!1){if($.includes(" ")||Q)return`@"${$}"`;return`@${$}`}function _6($,Q,Y){if(!Q.hasQuery)return{newInput:$,newCursorPos:$.length};let J=tY(Y,Q.quoted),Z=$.slice(0,Q.startIndex),X=$.slice(Q.endIndex),K=Z+J+" "+X,q=Q.startIndex+J.length+1;return{newInput:K,newCursorPos:q}}import{useMemoizedFn as N6}from"ahooks";import{useEffect as F6,useRef as H6}from"react";var S0=($,Q)=>{let Y=H6(!1),J=H6(null),Z=N6(()=>{if(J.current)clearTimeout(J.current);J.current=setTimeout(()=>{a0().setAwaitingSecondCtrlC(!1),Y.current=!1,J.current=null},3000)}),X=()=>{G8().shutdown("SIGINT",0)},K=N6(()=>{if(!Y.current){if(Y.current=!0,$&&Q)Q();a0().setAwaitingSecondCtrlC(!0),Z()}else{if(J.current)clearTimeout(J.current),J.current=null;a0().setAwaitingSecondCtrlC(!1),X()}});return F6(()=>{if($){if(a0().setAwaitingSecondCtrlC(!1),Y.current=!1,J.current)clearTimeout(J.current),J.current=null}},[$]),F6(()=>{return()=>{if(J.current)clearTimeout(J.current)}},[]),K};var n8=e1("UI"),A6=($,Q,Y,J,Z,X,K,q,G,U)=>{let O=e0()==="main-input",H=$.value,z=$.setValue,w=$.cursorPosition,_=n1(),F=T1(),C=t1(),N=M8(),S=N?o8(N):!1,[R,B]=i2(!1),[f,P]=i2([]),[A,T]=i2(0),M=z6(H,w,{cwd:F,maxSuggestions:10}),L=S0(K||!1,X),k=B6(0),g=500,o=B6(!1);L6(()=>{if(K)o.current=!1},[K]),L6(()=>{if(M.hasQuery&&M.suggestions.length>0){let I=M.suggestions.map((y)=>({command:y,description:w6(y)?`Directory: ${y}`:`File: ${y}`,matchScore:1}));P(I),B(!0),T(0)}else if(H.startsWith("/"))if(H.includes(" "))B(!1),P([]);else{let y=b6(H,F);P(y),B(y.length>0),T(0)}else B(!1),P([])},[H,M.hasQuery,M.suggestions,F]);let l=W6(()=>{_.clearMessages(),_.setError(null)}),a=W6(()=>{n8.debug("[DIAG] handleSubmit called:",{input:H,showSuggestions:R});let I=H.trim();if(I){let y=$.resolveInput(I);n8.debug("[DIAG] Submitting command:",{displayText:I,textLength:y.text.length,imageCount:y.images.length}),B(!1),P([]);let v=$.pasteMap.size>0?new Map($.pasteMap):new Map;Z(I,v),$.clear(),Q(y),n8.debug("[DIAG] Command submitted to onSubmit callback")}else n8.debug("[DIAG] Empty command, not submitting")});return sY((I,y)=>{if(I==="?"&&!H){G?.(),setTimeout(()=>$.clear(),0);return}if(y.backspace||y.delete||y.leftArrow||y.rightArrow||y.pageUp||y.pageDown||!y.ctrl&&!y.meta&&!y.escape&&!y.tab&&!y.upArrow&&!y.downArrow&&!y.return&&!(I==="?"&&!H))return;if(y.ctrl&&I==="c"||y.meta&&I==="c"||y.ctrl&&I==="d"||y.meta&&I==="d"){L();return}if(y.ctrl&&I==="l"||y.meta&&I==="l"){l();return}if(y.ctrl&&I==="t"||y.meta&&I==="t"){_.toggleThinkingExpanded();return}if(y.ctrl&&I==="o"||y.meta&&I==="o"){_.toggleHistoryExpanded();return}if(y.escape){if(U)G?.();else if(K&&X){if(o.current)return;o.current=!0,X()}else if(R)B(!1),P([]);else if(H){let b=Date.now();if(b-k.current<500)$.clear(),k.current=0;else k.current=b}return}if(y.tab&&y.shift){q?.();return}if(y.tab){if(R&&f.length>0){let b=f[A].command;if(M.hasQuery&&M.suggestions.includes(b)){let{newInput:V,newCursorPos:p}=_6(H,M,b);z(V),$.setCursorPosition(p)}else{let V=b+" ";z(V),$.setCursorPosition(V.length)}B(!1),P([])}else if(S)C.toggleThinkingMode();return}if(y.return){a();return}if(y.upArrow){if(R&&f.length>0){let b=f.length-1;T((V)=>V>0?V-1:b)}else{let b=Y();if(b){if(b.pasteMappings.size>0)$.restorePasteMappings(b.pasteMappings);z(b.display),$.setCursorPosition(b.display.length)}}return}if(y.downArrow){if(R&&f.length>0){let b=f.length-1;T((V)=>V<b?V+1:0)}else{let b=J();if(b){if(b.pasteMappings.size>0)$.restorePasteMappings(b.pasteMappings);z(b.display),$.setCursorPosition(b.display.length)}}return}},{isActive:O}),{handleSubmit:a,showSuggestions:R,suggestions:f,selectedSuggestionIndex:A}};import Y3 from"ansi-escapes";import{useStdout as Z3}from"ink";import{useCallback as X3,useEffect as K3,useRef as G3}from"react";import{useStdout as eY}from"ink";import{debounce as $3}from"lodash-es";import{useEffect as Q3,useState as J3}from"react";function E$($=200){let{stdout:Q}=eY(),[Y,J]=J3(Q.columns||80);return Q3(()=>{let Z=$3(()=>{J(Q.columns||80)},$);return Z(),Q.on("resize",Z),()=>{Q.off("resize",Z),Z.cancel()}},[Q,$]),Y}function P6(){let{stdout:$}=Z3(),Q=E$(),Y=G3(!0),J=t((X)=>X.session.actions.incrementClearCount),Z=X3(()=>{if($)$.write(Y3.clearTerminal);J()},[$,J]);return K3(()=>{if(Y.current){Y.current=!1;return}let X=setTimeout(()=>{Z()},300);return()=>{clearTimeout(X)}},[Q,Z]),{refreshStatic:Z}}import y6 from"node:fs";import q3 from"node:os";import o2 from"node:path";import{MultiSelect as U3}from"@inkjs/ui";import{useMemoizedFn as t8}from"ahooks";import{Box as X0,Text as s,useFocus as O3,useFocusManager as z3,useInput as M6}from"ink";import s8 from"ink-select-input";import _3 from"ink-spinner";import q8 from"ink-text-input";import{useEffect as R6,useState as g$}from"react";import{jsxDEV as D}from"react/jsx-dev-runtime";var N3=[{label:"Glob - 文件搜索",value:"Glob"},{label:"Grep - 内容搜索",value:"Grep"},{label:"Read - 读取文件",value:"Read"},{label:"Write - 写入文件",value:"Write"},{label:"Edit - 编辑文件",value:"Edit"},{label:"ApplyPatch - 原子多文件补丁",value:"ApplyPatch"},{label:"Bash - 执行命令",value:"Bash"},{label:"所有工具 (不限制)",value:"all"}],F3=[{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 H3($){if(!$||$.trim()==="")return"名称不能为空";if(!/^[a-z0-9-]+$/.test($))return"名称只能包含小写字母、数字和连字符";if($.startsWith("-")||$.endsWith("-"))return"名称不能以连字符开头或结尾";return null}function U8({onComplete:$,onCancel:Q,initialConfig:Y}){let[J,Z]=g$(Y?"name":"mode"),[X,K]=g$({name:Y?.name||"",description:Y?.description||"",tools:Y?.tools||[],color:Y?.color,location:Y?.location||"project",systemPrompt:Y?.systemPrompt||""}),[q,G]=g$(""),[U,W]=g$(!1),[O,H]=g$(""),[z,w]=g$(Y?"edit":"manual"),{focus:_}=z3(),C={manual:["mode","name","description","tools","color","location","systemPrompt","confirm"],ai:["mode","aiPrompt","aiGenerating","confirm"],edit:["name","description","tools","color","location","systemPrompt","confirm"]}[z];R6(()=>{if(J==="name"||J==="description"||J==="systemPrompt"||J==="aiPrompt")return;_(`step-${J}`)},[J,_]);let N=t8(()=>{let P=C.indexOf(J);if(P<C.length-1)Z(C[P+1])}),S=t8(()=>{if(O)H("");if(J==="confirm"&&z==="ai"){Z("aiPrompt");return}let P=C.indexOf(J);if(P>0)Z(C[P-1]);else Q()}),R=t8(async()=>{W(!0),H("");try{let P=await Y8.create(),A=`你是一个 Subagent 配置生成专家。用户会描述他们想要创建的 agent,你需要根据描述生成一个完整的 agent 配置。
|
|
41
41
|
|
|
42
42
|
## 可用工具列表
|
|
43
43
|
|
|
@@ -113,48 +113,48 @@ ${u0}`}]}}let x0=m2(_0),K1=await P(x0);if(!K1.accepted){let u0=K1.reason==="queu
|
|
|
113
113
|
4. **color**: 选择一个合适的颜色用于 UI 区分
|
|
114
114
|
5. **systemPrompt**: 详细说明 agent 的职责、使用的工具、输出格式等,使用 Markdown 格式
|
|
115
115
|
|
|
116
|
-
**重要**:请直接返回 JSON,不要添加任何额外的解释或文字。`,q)).trim(),L=M.match(/```(?:json)?\s*\n([\s\S]*?)\n```/);if(L)M=L[1];let k=JSON.parse(M);if(!k.name||!k.description||!k.systemPrompt)throw Error("Missing required fields: name, description, or systemPrompt");if(!/^[a-z0-9]+(-[a-z0-9]+)*$/.test(k.name))throw Error("Invalid name format. Must be kebab-case (lowercase, numbers, hyphens only)");K({name:k.name,description:k.description,tools:Array.isArray(k.tools)?k.tools:[],color:k.color||"blue",location:"project",systemPrompt:k.systemPrompt}),Z("confirm")}catch(P){H(P instanceof Error?P.message:String(P))}finally{W(!1)}});
|
|
116
|
+
**重要**:请直接返回 JSON,不要添加任何额外的解释或文字。`,q)).trim(),L=M.match(/```(?:json)?\s*\n([\s\S]*?)\n```/);if(L)M=L[1];let k=JSON.parse(M);if(!k.name||!k.description||!k.systemPrompt)throw Error("Missing required fields: name, description, or systemPrompt");if(!/^[a-z0-9]+(-[a-z0-9]+)*$/.test(k.name))throw Error("Invalid name format. Must be kebab-case (lowercase, numbers, hyphens only)");K({name:k.name,description:k.description,tools:Array.isArray(k.tools)?k.tools:[],color:k.color||"blue",location:"project",systemPrompt:k.systemPrompt}),Z("confirm")}catch(P){H(P instanceof Error?P.message:String(P))}finally{W(!1)}});R6(()=>{if(J==="aiGenerating"&&!U&&!O)R()},[J,U,O,R]);let B=t8(async()=>{try{let P=X.location==="project"?o2.join(l0(),".blade","agents"):o2.join(q3.homedir(),".blade","agents");await y6.promises.mkdir(P,{recursive:!0});let A=["---",`name: ${X.name}`,`description: ${X.description}`];if(X.tools.length>0&&!X.tools.includes("all")){A.push("tools:");for(let L of X.tools)A.push(` - ${L}`)}if(X.color)A.push(`color: ${X.color}`);A.push("---");let T=[A.join(`
|
|
117
117
|
`),"",`# ${X.name} Subagent`,"",X.systemPrompt||"你是一个专门的代理,负责执行特定任务。",""].join(`
|
|
118
|
-
`),M=o2.join(P,`${X.name}.md`);await P6.promises.writeFile(M,T,"utf-8"),$()}catch(P){console.error("保存配置失败:",P)}}),f=S0(!1,Q);if(R6((P,A)=>{if(A.escape)S();else if(A.ctrl&&P==="c"||A.meta&&P==="c")f()},{isActive:J!=="tools"}),J==="mode")return D(X0,{flexDirection:"column",paddingY:1,children:[D(X0,{marginBottom:1,children:D(s,{bold:!0,color:"cyan",children:"选择创建方式"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(X0,{marginBottom:1,children:D(s,{dimColor:!0,children:"你可以手动配置每个细节,或让 AI 根据你的描述自动生成配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(s8,{items:[{label:"AI 智能生成 - 根据描述自动生成完整配置",value:"ai"},{label:"手动配置 - 逐步配置每个选项",value:"manual"}],onSelect:(P)=>{if(P.value==="ai")w("ai"),Z("aiPrompt");else w("manual"),Z("name")}},void 0,!1,void 0,this),D(X0,{marginTop:1,children:D(s,{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 D(X0,{flexDirection:"column",paddingY:1,children:[D(X0,{marginBottom:1,children:D(s,{bold:!0,color:"cyan",children:"AI 智能生成"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(X0,{marginBottom:1,children:D(s,{dimColor:!0,children:'描述你想要创建的 Agent(例如:"一个专门用于代码审查的 agent,能够分析代码质量和潜在bug")'},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(X0,{marginBottom:1,children:[D(s,{color:"green",children:"描述: "},void 0,!1,void 0,this),D(q8,{value:q,onChange:G,onSubmit:(P)=>{if(!P.trim())return;Z("aiGenerating")}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D(X0,{children:D(s,{dimColor:!0,children:"按 Enter 开始生成 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="aiGenerating"){if(O)return D(X0,{flexDirection:"column",paddingY:1,children:[D(X0,{marginBottom:1,children:D(s,{bold:!0,color:"red",children:"AI 生成失败"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(X0,{marginBottom:1,children:D(s,{color:"red",children:O},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(X0,{marginBottom:1,children:D(s,{dimColor:!0,children:"按 ESC 返回修改描述"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return D(X0,{flexDirection:"column",paddingY:1,children:[D(X0,{marginBottom:1,children:D(s,{bold:!0,color:"yellow",children:[D(z3,{type:"dots"},void 0,!1,void 0,this)," AI 正在生成配置..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),D(X0,{marginBottom:1,children:D(s,{dimColor:!0,children:['根据你的描述:"',q,'"']},void 0,!0,void 0,this)},void 0,!1,void 0,this),D(X0,{marginBottom:1,children:D(s,{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 P=z==="edit";return D(X0,{flexDirection:"column",paddingY:1,children:[D(X0,{marginBottom:1,children:D(s,{bold:!0,color:"cyan",children:["Step 1/7: ",P?"Agent 名称(不可修改)":"输入 Agent 名称"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),D(X0,{marginBottom:1,children:D(s,{dimColor:!0,children:P?"编辑模式下名称不可修改(修改名称相当于创建新 Agent)":"名称只能包含小写字母、数字和连字符(例如:code-reviewer)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(X0,{marginBottom:1,children:[D(s,{color:"green",children:"名称: "},void 0,!1,void 0,this),P?D(s,{children:X.name},void 0,!1,void 0,this):D(q8,{value:X.name,onChange:(A)=>K({...X,name:A}),onSubmit:(A)=>{if(F3(A))return;N()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D(X0,{children:D(s,{dimColor:!0,children:P?"按 Enter 继续 | ESC 返回":"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),P&&D(q8,{value:"",onChange:()=>{},onSubmit:N,showCursor:!1},"edit-mode-dummy-input",!1,void 0,this)]},void 0,!0,void 0,this)}if(J==="description")return D(X0,{flexDirection:"column",paddingY:1,children:[D(X0,{marginBottom:1,children:D(s,{bold:!0,color:"cyan",children:"Step 2/7: 输入描述信息"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(X0,{marginBottom:1,children:D(s,{dimColor:!0,children:"简短描述这个 Agent 的用途和使用场景(这将帮助主 Agent 决定何时使用它)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(X0,{marginBottom:1,children:[D(s,{color:"green",children:"描述: "},void 0,!1,void 0,this),D(q8,{value:X.description,onChange:(P)=>K({...X,description:P}),onSubmit:(P)=>{if(!P.trim())return;N()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D(X0,{children:D(s,{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 D(H3,{config:X,setConfig:K,onNext:N,onPrev:S},void 0,!1,void 0,this);if(J==="color")return D(X0,{flexDirection:"column",paddingY:1,children:[D(X0,{marginBottom:1,children:D(s,{bold:!0,color:"cyan",children:"Step 4/7: 选择背景颜色"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(X0,{marginBottom:1,children:D(s,{dimColor:!0,children:"为 Agent 选择一个颜色标识(用于在 UI 中区分不同的 Agents)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(s8,{items:N3,onSelect:(P)=>{let A=P.value==="none"?void 0:P.value;K({...X,color:A}),N()}},void 0,!1,void 0,this),D(X0,{marginTop:1,children:D(s,{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 D(X0,{flexDirection:"column",paddingY:1,children:[D(X0,{marginBottom:1,children:D(s,{bold:!0,color:"cyan",children:"Step 5/7: 选择保存位置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(X0,{marginBottom:1,children:D(s,{dimColor:!0,children:"项目级配置仅在当前项目生效,用户级配置全局可用"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(s8,{items:[{label:"项目级 (.blade/agents/) - 仅当前项目",value:"project"},{label:"用户级 (~/.blade/agents/) - 全局可用",value:"user"}],onSelect:(P)=>{K({...X,location:P.value}),N()}},void 0,!1,void 0,this),D(X0,{marginTop:1,children:D(s,{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 D(X0,{flexDirection:"column",paddingY:1,children:[D(X0,{marginBottom:1,children:D(s,{bold:!0,color:"cyan",children:"Step 6/7: 输入系统提示词"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(X0,{marginBottom:1,children:D(s,{dimColor:!0,children:"定义 Agent 的行为和职责(可选,留空将使用默认提示)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(X0,{marginBottom:1,children:[D(s,{color:"green",children:"提示词: "},void 0,!1,void 0,this),D(q8,{value:X.systemPrompt,onChange:(P)=>K({...X,systemPrompt:P}),onSubmit:()=>N()},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D(X0,{children:D(s,{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 D(X0,{flexDirection:"column",paddingY:1,children:[D(X0,{marginBottom:1,children:D(s,{bold:!0,color:"cyan",children:"Step 7/7: 确认配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(X0,{flexDirection:"column",paddingLeft:2,marginBottom:1,children:[D(s,{children:[D(s,{bold:!0,color:"green",children:["名称:"," "]},void 0,!0,void 0,this),D(s,{children:X.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D(s,{children:[D(s,{bold:!0,color:"green",children:["描述:"," "]},void 0,!0,void 0,this),D(s,{children:X.description},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D(s,{children:[D(s,{bold:!0,color:"green",children:["工具:"," "]},void 0,!0,void 0,this),D(s,{children:X.tools.includes("all")?"所有工具":X.tools.join(", ")||"所有工具"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D(s,{children:[D(s,{bold:!0,color:"green",children:["颜色:"," "]},void 0,!0,void 0,this),D(s,{children:X.color||"默认"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D(s,{children:[D(s,{bold:!0,color:"green",children:["位置:"," "]},void 0,!0,void 0,this),D(s,{children:X.location==="project"?"项目级":"用户级"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D(s,{children:[D(s,{bold:!0,color:"green",children:["提示词:"," "]},void 0,!0,void 0,this),D(s,{children:X.systemPrompt||"(使用默认)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),D(s8,{items:[{label:"确认并保存",value:"save"},{label:"返回上一步",value:"back"},{label:"取消",value:"cancel"}],onSelect:(P)=>{if(P.value==="save")B();else if(P.value==="back")S();else Q()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}function H3({config:$,setConfig:Q,onNext:Y,onPrev:J}){let{isFocused:Z}=U3({id:"step-tools"});R6((K,q)=>{if(q.escape)J()},{isActive:Z});let X=(K)=>{if(K.includes("all"))Q({...$,tools:["all"]});else Q({...$,tools:K});Y()};return D(X0,{flexDirection:"column",paddingY:1,children:[D(X0,{marginBottom:1,children:D(s,{bold:!0,color:"cyan",children:"Step 3/7: 选择可用工具"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(X0,{marginBottom:1,children:D(s,{dimColor:!0,children:"方向键导航,空格切换勾选,Enter 确认进入下一步 | ESC 返回上一步"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(q3,{options:_3,defaultValue:$.tools,onSubmit:X},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import W3 from"node:fs";import{useMemoizedFn as H$}from"ahooks";import{Box as C0,Text as v0,useInput as L3}from"ink";import n2 from"ink-select-input";import{useEffect as B3,useMemo as M6,useState as e8}from"react";import{jsxDEV as i}from"react/jsx-dev-runtime";var t2=10;function I6({workspaceRoot:$,initialMode:Q="menu",onComplete:Y,onCancel:J}){let Z=C6($),[X,K]=e8(Q),[q,G]=e8(null),[U,W]=e8(0),[O,H]=e8(0),z=H$(()=>{Z.clear(),Z.loadFromStandardLocations(),W((M)=>M+1)}),w=M6(()=>{return Z.getAllSubagents()},[U]),_=Math.ceil(w.length/t2)||1,F=M6(()=>{let M=O*t2;return w.slice(M,M+t2)},[w,O]);B3(()=>{let M=Math.max(0,_-1);if(O>M)H(M)},[_,O]);let C=H$(()=>{if(O<_-1)H((M)=>M+1)}),N=H$(()=>{if(O>0)H((M)=>M-1)}),S=[{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"}],R=H$((M)=>{if(M.value==="cancel"){J?.();return}K(M.value)}),B=H$((M)=>{if(G(M.value),X==="edit")K("editWizard");else if(X==="delete")K("deleteConfirm")}),f=H$(async()=>{if(!q?.configPath)return;try{await W3.promises.unlink(q.configPath),z(),P()}catch(M){console.error("删除失败:",M)}}),P=H$(()=>{K("menu"),G(null)}),A=S0(!1,J);if(L3((M,L)=>{if(L.escape){if(X==="menu")J?.();else if(X==="list"||X==="edit"||X==="delete")H(0),P();else if(X==="deleteConfirm")P()}else if(L.ctrl&&M==="c"||L.meta&&M==="c")A();else if(X==="list"){if(L.leftArrow||M==="h")N();else if(L.rightArrow||M==="l")C()}},{isActive:X!=="create"&&X!=="editWizard"}),X==="menu")return i(C0,{flexDirection:"column",paddingY:1,children:[i(C0,{marginBottom:1,children:i(v0,{bold:!0,color:"cyan",children:"Agents 管理"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(n2,{items:S,onSelect:R},void 0,!1,void 0,this),i(C0,{marginTop:1,children:i(v0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 退出"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(X==="list"){if(w.length===0)return i(C0,{flexDirection:"column",paddingY:1,children:[i(C0,{marginBottom:1,children:i(v0,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(C0,{paddingLeft:2,children:i(v0,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(C0,{marginTop:1,paddingLeft:2,children:i(v0,{color:"gray",children:"配置文件位置: .blade/agents/ 或 ~/.blade/agents/"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(C0,{marginTop:1,paddingLeft:2,children:i(v0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return i(C0,{flexDirection:"column",paddingY:1,children:[i(C0,{marginBottom:1,children:[i(v0,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this),i(v0,{color:"gray",children:[" (共 ",w.length," 个)"]},void 0,!0,void 0,this),_>1&&i(v0,{color:"yellow",children:[" ","第 ",O+1,"/",_," 页"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),F.map((M)=>i(C0,{flexDirection:"column",paddingLeft:2,children:[i(C0,{children:i(v0,{children:[i(v0,{bold:!0,color:M.color||"white",children:["• ",M.name]},void 0,!0,void 0,this),i(v0,{color:"gray",children:[" - ",M.description]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),M.tools&&M.tools.length>0&&i(C0,{paddingLeft:2,children:i(v0,{color:"gray",children:["工具: ",M.tools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),M.configPath&&i(C0,{paddingLeft:2,children:i(v0,{color:"gray",dimColor:!0,children:M.configPath},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},M.name,!0,void 0,this)),i(C0,{marginTop:1,paddingLeft:2,children:_>1?i(v0,{dimColor:!0,children:"Left/Right to page | ESC 返回菜单"},void 0,!1,void 0,this):i(v0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}let T=(M)=>{if(w.length===0)return i(C0,{flexDirection:"column",paddingY:1,children:[i(C0,{marginBottom:1,children:i(v0,{bold:!0,color:"cyan",children:M},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(C0,{paddingLeft:2,children:i(v0,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(C0,{marginTop:1,paddingLeft:2,children:i(v0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);let L=w.map((k)=>({key:k.name,label:`${k.name} - ${k.description}`,value:k}));return i(C0,{flexDirection:"column",paddingY:1,children:[i(C0,{marginBottom:1,children:i(v0,{bold:!0,color:"cyan",children:M},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(n2,{items:L,onSelect:B},void 0,!1,void 0,this),i(C0,{marginTop:1,children:i(v0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};if(X==="create")return i(U8,{onComplete:()=>{z(),P()},onCancel:P},void 0,!1,void 0,this);if(X==="edit")return T("编辑 Agent");if(X==="editWizard"&&q){let M={name:q.name,description:q.description,tools:q.tools||[],color:q.color,location:q.configPath?.includes(".blade/agents")?"project":"user",systemPrompt:q.systemPrompt||""};return i(U8,{initialConfig:M,onComplete:()=>{z(),P()},onCancel:P},void 0,!1,void 0,this)}if(X==="delete")return T("删除 Agent");if(X==="deleteConfirm"&&q)return i(C0,{flexDirection:"column",paddingY:1,children:[i(C0,{marginBottom:1,children:i(v0,{bold:!0,color:"red",children:"确认删除"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(C0,{marginBottom:1,paddingLeft:2,children:i(v0,{children:["你确定要删除 Agent"," ",i(v0,{bold:!0,color:"yellow",children:q.name},void 0,!1,void 0,this)," ","吗?"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),i(C0,{marginBottom:1,paddingLeft:2,children:i(v0,{dimColor:!0,children:["文件路径: ",q.configPath]},void 0,!0,void 0,this)},void 0,!1,void 0,this),i(C0,{marginBottom:1,paddingLeft:2,children:i(v0,{color:"red",children:"此操作无法撤销!"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(n2,{items:[{label:"确认删除",value:"confirm"},{label:"取消",value:"cancel"}],onSelect:(M)=>{if(M.value==="confirm")f();else P()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}import{Box as m$,Text as O0}from"ink";import b3,{useEffect as A3,useState as P3}from"react";import{useEffect as w3,useState as T6}from"react";function S6($=l0(),Q=5000){let[Y,J]=T6(null),[Z,X]=T6(!0);return w3(()=>{let K=!0,q=async()=>{try{let U=await f6($);if(!K)return;if(!U){J(null),X(!1);return}let W=await k6($);if(!K)return;J(W)}catch{if(K)J(null)}finally{if(K)X(!1)}};q();let G=null;if(Q>0)G=setInterval(q,Q);return()=>{if(K=!1,G)clearInterval(G)}},[$,Q]),{branch:Y,loading:Z}}import{jsxDEV as n,Fragment as A1}from"react/jsx-dev-runtime";var D6=b3.memo(()=>{let $=R8(),Q=S$(),J=y8()==="shortcuts",Z=L4(),X=T1(),{branch:K}=S6(X),q=M8(),G=z4(),U=Y4(),W=T8(),O=f8(),H=k8(),z=S8(),w=v8(),_=Z4(),F=X4(),C=I8(),N=y4(),S=k$(),[R,B]=P3(null);A3(()=>{let L=!1;new s2(X,S).get().then((o)=>{if(!L)B(o)}).catch(()=>{if(!L)B(null)});let g=s2.subscribe((o)=>{if(!L&&o.sessionId===S&&o.workspaceRoot===X)B(o.goal)});return()=>{L=!0,g()}},[S,X]);let f=q?o8(q):!1,A=(()=>{if(Q==="default")return null;if(Q==="autoEdit")return n(O0,{color:"magenta",children:[">> ","auto edit on ",n(O0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Q==="plan")return n(O0,{color:"cyan",children:["‖ plan mode on ",n(O0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Q==="yolo")return n(O0,{color:"red",children:["yolo mode on ",n(O0,{color:"gray",children:"(all tools auto-approved)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null})(),T=A!==null,M=[["Enter:发送","Shift+Enter:换行","Esc:中止"],["Shift+Tab:切换模式","Up/Down:历史","Tab:补全"],["Ctrl+A:行首","Ctrl+E:行尾","Ctrl+K:删到尾"],["Ctrl+U:删到首","Ctrl+W:删单词","Ctrl+C:退出"]];return n(m$,{flexDirection:"row",justifyContent:"space-between",paddingX:2,paddingY:0,children:[J?n(m$,{flexDirection:"column",gap:0,children:M.map((L,k)=>n(m$,{flexDirection:"row",children:[L.map((g,o)=>{let[l,a]=g.split(":");return n(m$,{flexDirection:"row",width:20,children:[n(O0,{color:"yellow",children:l},void 0,!1,void 0,this),n(O0,{color:"gray",children:":"},void 0,!1,void 0,this),n(O0,{color:"white",children:a},void 0,!1,void 0,this)]},o,!0,void 0,this)}),k===M.length-1&&n(O0,{color:"cyan",children:" ? 关闭"},void 0,!1,void 0,this)]},k,!0,void 0,this))},void 0,!1,void 0,this):n(m$,{flexDirection:"row",gap:1,children:[K&&n(A1,{children:[n(O0,{color:"gray",children:[" ",K]},void 0,!0,void 0,this),n(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),A,T&&n(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),R&&n(A1,{children:[n(O0,{color:R.status==="active"?"green":R.status==="verifying"?"cyan":R.status==="blocked"||R.status==="budget_limited"?"yellow":"gray",children:["goal:",R.status," ",R.objective.slice(0,32)]},void 0,!0,void 0,this),n(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),n(O0,{color:"gray",children:"? for shortcuts"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),n(m$,{flexDirection:"row",gap:1,children:!$?n(O0,{color:"red",children:"[WARN] API 密钥未配置"},void 0,!1,void 0,this):n(A1,{children:[f&&n(A1,{children:[W?n(O0,{color:"cyan",children:["Effort ",O]},void 0,!0,void 0,this):n(O0,{color:"gray",children:"Tab:Effort"},void 0,!1,void 0,this),n(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),H!=="auto"&&n(A1,{children:[n(O0,{color:H==="fast"?"yellow":"gray",children:["Speed ",H]},void 0,!0,void 0,this),n(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z!=="auto"&&n(A1,{children:[n(O0,{color:"gray",children:["Output ",z]},void 0,!0,void 0,this),n(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),w!=="auto"&&n(A1,{children:[n(O0,{color:"gray",children:["Style ",w]},void 0,!0,void 0,this),n(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q&&n(O0,{color:"gray",children:q.model},void 0,!1,void 0,this),n(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),U?n(O0,{color:"yellow",children:"压缩中..."},void 0,!1,void 0,this):n(O0,{color:G<20?"red":G<50?"yellow":"gray",children:[G,"%"]},void 0,!0,void 0,this),n(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),n(O0,{color:F===void 0?"gray":"cyan",children:["Cache ",v6(F)]},void 0,!0,void 0,this),_>0.001&&n(A1,{children:[n(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),n(O0,{color:"green",children:["$",_<0.01?_.toFixed(4):_.toFixed(3)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),C.length>0&&n(A1,{children:[n(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),n(O0,{color:"yellow",children:["已排队 ",C.length]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),N>0&&n(A1,{children:[n(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),n(O0,{color:"cyan",children:["已恢复 ",N," 条指令"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Z&&n(A1,{children:[n(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),n(O0,{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 e2,Text as $Q}from"ink";import y3 from"react";import{jsxDEV as p$}from"react/jsx-dev-runtime";var V6=y3.memo(({suggestions:$,selectedIndex:Q,visible:Y,maxDisplay:J=8})=>{if(!Y||$.length===0)return null;let Z=0,X=Math.min(J,$.length),K=Q>=$.length;if(Q>=J&&!K)Z=Q-J+1,X=Q+1;let q=$.slice(Z,X),G=$.length>J;return p$(e2,{flexDirection:"column",paddingX:2,paddingY:0,children:[q.map((U,W)=>{let H=Z+W===Q;return p$(e2,{flexDirection:"row",paddingX:1,gap:2,children:[p$($Q,{color:H?"cyan":"white",bold:H,children:U.command},void 0,!1,void 0,this),p$($Q,{color:H?"cyan":"gray",dimColor:!H,children:["- ",U.description]},void 0,!0,void 0,this)]},U.command,!0,void 0,this)}),G&&p$(e2,{paddingX:1,children:p$($Q,{color:K?"cyan":"gray",bold:K,dimColor:!K,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 L1,Text as k1,useInput as yZ,useStdout as RZ}from"ink";import MZ from"ink-select-input";import RQ,{useMemo as _9}from"react";import{Box as z0,Text as b0}from"ink";import L$,{useEffect as PQ,useMemo as W$,useRef as U9}from"react";import{Box as _Q,Text as r6}from"ink";import E3 from"react";import{Text as P1}from"ink";import V3 from"react";import u6 from"string-width";import O8 from"string-width";function QQ({onlyFirst:$=!1}={}){return new RegExp("(?:\\u001B\\][\\s\\S]*?(?:\\u0007|\\u001B\\u005C|\\u009C))|[\\u001B\\u009B][[\\]()#;?]*(?:\\d{1,4}(?:[;:]\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]",$?void 0:"g")}var R3=QQ();function JQ($){if(typeof $!=="string")throw TypeError(`Expected a \`string\`, got \`${typeof $}\``);if(!$.includes("\x1B")&&!$.includes(""))return $;return $.replace(R3,"")}var j6=($=0)=>(Q)=>`\x1B[${Q+$}m`,h6=($=0)=>(Q)=>`\x1B[${38+$};5;${Q}m`,E6=($=0)=>(Q,Y,J)=>`\x1B[${38+$};2;${Q};${Y};${J}m`,j0={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]}},Gq=Object.keys(j0.modifier),M3=Object.keys(j0.color),C3=Object.keys(j0.bgColor),qq=[...M3,...C3];function I3(){let $=new Map;for(let[Q,Y]of Object.entries(j0)){for(let[J,Z]of Object.entries(Y))j0[J]={open:`\x1B[${Z[0]}m`,close:`\x1B[${Z[1]}m`},Y[J]=j0[J],$.set(Z[0],Z[1]);Object.defineProperty(j0,Q,{value:Y,enumerable:!1})}return Object.defineProperty(j0,"codes",{value:$,enumerable:!1}),j0.color.close="\x1B[39m",j0.bgColor.close="\x1B[49m",j0.color.ansi=j6(),j0.color.ansi256=h6(),j0.color.ansi16m=E6(),j0.bgColor.ansi=j6(10),j0.bgColor.ansi256=h6(10),j0.bgColor.ansi16m=E6(10),Object.defineProperties(j0,{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)=>j0.rgbToAnsi256(...j0.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 q=Q%36;Y=Math.floor(Q/36)/5,J=Math.floor(q/6)/5,Z=q%6/5}let X=Math.max(Y,J,Z)*2;if(X===0)return 30;let K=30+(Math.round(Z)<<2|Math.round(J)<<1|Math.round(Y));if(X===2)K+=60;return K},enumerable:!1},rgbToAnsi:{value:(Q,Y,J)=>j0.ansi256ToAnsi(j0.rgbToAnsi256(Q,Y,J)),enumerable:!1},hexToAnsi:{value:(Q)=>j0.ansi256ToAnsi(j0.hexToAnsi256(Q)),enumerable:!1}}),j0}var T3=I3(),g6=T3;var Q2=new Set(["\x1B",""]),f3=39,ZQ="\x07",c6="[",k3="]",x6="m",$2=`${k3}8;;`,m6=($)=>`${Q2.values().next().value}${c6}${$}${x6}`,p6=($)=>`${Q2.values().next().value}${$2}${$}${ZQ}`,S3=($)=>$.split(" ").map((Q)=>O8(Q)),YQ=($,Q,Y)=>{let J=[...Q],Z=!1,X=!1,K=O8(JQ($.at(-1)));for(let[q,G]of J.entries()){let U=O8(G);if(K+U<=Y)$[$.length-1]+=G;else $.push(G),K=0;if(Q2.has(G))Z=!0,X=J.slice(q+1,q+1+$2.length).join("")===$2;if(Z){if(X){if(G===ZQ)Z=!1,X=!1}else if(G===x6)Z=!1;continue}if(K+=U,K===Y&&q<J.length-1)$.push(""),K=0}if(!K&&$.at(-1).length>0&&$.length>1)$[$.length-2]+=$.pop()},v3=($)=>{let Q=$.split(" "),Y=Q.length;while(Y>0){if(O8(Q[Y-1])>0)break;Y--}if(Y===Q.length)return $;return Q.slice(0,Y).join(" ")+Q.slice(Y).join("")},D3=($,Q,Y={})=>{if(Y.trim!==!1&&$.trim()==="")return"";let J="",Z,X,K=S3($),q=[""];for(let[O,H]of $.split(" ").entries()){if(Y.trim!==!1)q[q.length-1]=q.at(-1).trimStart();let z=O8(q.at(-1));if(O!==0){if(z>=Q&&(Y.wordWrap===!1||Y.trim===!1))q.push(""),z=0;if(z>0||Y.trim===!1)q[q.length-1]+=" ",z++}if(Y.hard&&K[O]>Q){let w=Q-z,_=1+Math.floor((K[O]-w-1)/Q);if(Math.floor((K[O]-1)/Q)<_)q.push("");YQ(q,H,Q);continue}if(z+K[O]>Q&&z>0&&K[O]>0){if(Y.wordWrap===!1&&z<Q){YQ(q,H,Q);continue}q.push("")}if(z+K[O]>Q&&Y.wordWrap===!1){YQ(q,H,Q);continue}q[q.length-1]+=H}if(Y.trim!==!1)q=q.map((O)=>v3(O));let G=q.join(`
|
|
119
|
-
`),U=[...G],W=0;for(let[O,H]of U.entries()){if(J+=H,Q2.has(H)){let{groups:w}=new RegExp(`(?:\\${
|
|
120
|
-
`){if(X)J+=
|
|
121
|
-
`){if(Z&&z)J+=
|
|
118
|
+
`),M=o2.join(P,`${X.name}.md`);await y6.promises.writeFile(M,T,"utf-8"),$()}catch(P){console.error("保存配置失败:",P)}}),f=S0(!1,Q);if(M6((P,A)=>{if(A.escape)S();else if(A.ctrl&&P==="c"||A.meta&&P==="c")f()},{isActive:J!=="tools"}),J==="mode")return D(X0,{flexDirection:"column",paddingY:1,children:[D(X0,{marginBottom:1,children:D(s,{bold:!0,color:"cyan",children:"选择创建方式"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(X0,{marginBottom:1,children:D(s,{dimColor:!0,children:"你可以手动配置每个细节,或让 AI 根据你的描述自动生成配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(s8,{items:[{label:"AI 智能生成 - 根据描述自动生成完整配置",value:"ai"},{label:"手动配置 - 逐步配置每个选项",value:"manual"}],onSelect:(P)=>{if(P.value==="ai")w("ai"),Z("aiPrompt");else w("manual"),Z("name")}},void 0,!1,void 0,this),D(X0,{marginTop:1,children:D(s,{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 D(X0,{flexDirection:"column",paddingY:1,children:[D(X0,{marginBottom:1,children:D(s,{bold:!0,color:"cyan",children:"AI 智能生成"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(X0,{marginBottom:1,children:D(s,{dimColor:!0,children:'描述你想要创建的 Agent(例如:"一个专门用于代码审查的 agent,能够分析代码质量和潜在bug")'},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(X0,{marginBottom:1,children:[D(s,{color:"green",children:"描述: "},void 0,!1,void 0,this),D(q8,{value:q,onChange:G,onSubmit:(P)=>{if(!P.trim())return;Z("aiGenerating")}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D(X0,{children:D(s,{dimColor:!0,children:"按 Enter 开始生成 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(J==="aiGenerating"){if(O)return D(X0,{flexDirection:"column",paddingY:1,children:[D(X0,{marginBottom:1,children:D(s,{bold:!0,color:"red",children:"AI 生成失败"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(X0,{marginBottom:1,children:D(s,{color:"red",children:O},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(X0,{marginBottom:1,children:D(s,{dimColor:!0,children:"按 ESC 返回修改描述"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return D(X0,{flexDirection:"column",paddingY:1,children:[D(X0,{marginBottom:1,children:D(s,{bold:!0,color:"yellow",children:[D(_3,{type:"dots"},void 0,!1,void 0,this)," AI 正在生成配置..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),D(X0,{marginBottom:1,children:D(s,{dimColor:!0,children:['根据你的描述:"',q,'"']},void 0,!0,void 0,this)},void 0,!1,void 0,this),D(X0,{marginBottom:1,children:D(s,{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 P=z==="edit";return D(X0,{flexDirection:"column",paddingY:1,children:[D(X0,{marginBottom:1,children:D(s,{bold:!0,color:"cyan",children:["Step 1/7: ",P?"Agent 名称(不可修改)":"输入 Agent 名称"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),D(X0,{marginBottom:1,children:D(s,{dimColor:!0,children:P?"编辑模式下名称不可修改(修改名称相当于创建新 Agent)":"名称只能包含小写字母、数字和连字符(例如:code-reviewer)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(X0,{marginBottom:1,children:[D(s,{color:"green",children:"名称: "},void 0,!1,void 0,this),P?D(s,{children:X.name},void 0,!1,void 0,this):D(q8,{value:X.name,onChange:(A)=>K({...X,name:A}),onSubmit:(A)=>{if(H3(A))return;N()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D(X0,{children:D(s,{dimColor:!0,children:P?"按 Enter 继续 | ESC 返回":"按 Enter 继续 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),P&&D(q8,{value:"",onChange:()=>{},onSubmit:N,showCursor:!1},"edit-mode-dummy-input",!1,void 0,this)]},void 0,!0,void 0,this)}if(J==="description")return D(X0,{flexDirection:"column",paddingY:1,children:[D(X0,{marginBottom:1,children:D(s,{bold:!0,color:"cyan",children:"Step 2/7: 输入描述信息"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(X0,{marginBottom:1,children:D(s,{dimColor:!0,children:"简短描述这个 Agent 的用途和使用场景(这将帮助主 Agent 决定何时使用它)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(X0,{marginBottom:1,children:[D(s,{color:"green",children:"描述: "},void 0,!1,void 0,this),D(q8,{value:X.description,onChange:(P)=>K({...X,description:P}),onSubmit:(P)=>{if(!P.trim())return;N()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D(X0,{children:D(s,{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 D(W3,{config:X,setConfig:K,onNext:N,onPrev:S},void 0,!1,void 0,this);if(J==="color")return D(X0,{flexDirection:"column",paddingY:1,children:[D(X0,{marginBottom:1,children:D(s,{bold:!0,color:"cyan",children:"Step 4/7: 选择背景颜色"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(X0,{marginBottom:1,children:D(s,{dimColor:!0,children:"为 Agent 选择一个颜色标识(用于在 UI 中区分不同的 Agents)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(s8,{items:F3,onSelect:(P)=>{let A=P.value==="none"?void 0:P.value;K({...X,color:A}),N()}},void 0,!1,void 0,this),D(X0,{marginTop:1,children:D(s,{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 D(X0,{flexDirection:"column",paddingY:1,children:[D(X0,{marginBottom:1,children:D(s,{bold:!0,color:"cyan",children:"Step 5/7: 选择保存位置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(X0,{marginBottom:1,children:D(s,{dimColor:!0,children:"项目级配置仅在当前项目生效,用户级配置全局可用"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(s8,{items:[{label:"项目级 (.blade/agents/) - 仅当前项目",value:"project"},{label:"用户级 (~/.blade/agents/) - 全局可用",value:"user"}],onSelect:(P)=>{K({...X,location:P.value}),N()}},void 0,!1,void 0,this),D(X0,{marginTop:1,children:D(s,{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 D(X0,{flexDirection:"column",paddingY:1,children:[D(X0,{marginBottom:1,children:D(s,{bold:!0,color:"cyan",children:"Step 6/7: 输入系统提示词"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(X0,{marginBottom:1,children:D(s,{dimColor:!0,children:"定义 Agent 的行为和职责(可选,留空将使用默认提示)"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(X0,{marginBottom:1,children:[D(s,{color:"green",children:"提示词: "},void 0,!1,void 0,this),D(q8,{value:X.systemPrompt,onChange:(P)=>K({...X,systemPrompt:P}),onSubmit:()=>N()},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D(X0,{children:D(s,{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 D(X0,{flexDirection:"column",paddingY:1,children:[D(X0,{marginBottom:1,children:D(s,{bold:!0,color:"cyan",children:"Step 7/7: 确认配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(X0,{flexDirection:"column",paddingLeft:2,marginBottom:1,children:[D(s,{children:[D(s,{bold:!0,color:"green",children:["名称:"," "]},void 0,!0,void 0,this),D(s,{children:X.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D(s,{children:[D(s,{bold:!0,color:"green",children:["描述:"," "]},void 0,!0,void 0,this),D(s,{children:X.description},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D(s,{children:[D(s,{bold:!0,color:"green",children:["工具:"," "]},void 0,!0,void 0,this),D(s,{children:X.tools.includes("all")?"所有工具":X.tools.join(", ")||"所有工具"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D(s,{children:[D(s,{bold:!0,color:"green",children:["颜色:"," "]},void 0,!0,void 0,this),D(s,{children:X.color||"默认"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D(s,{children:[D(s,{bold:!0,color:"green",children:["位置:"," "]},void 0,!0,void 0,this),D(s,{children:X.location==="project"?"项目级":"用户级"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),D(s,{children:[D(s,{bold:!0,color:"green",children:["提示词:"," "]},void 0,!0,void 0,this),D(s,{children:X.systemPrompt||"(使用默认)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),D(s8,{items:[{label:"确认并保存",value:"save"},{label:"返回上一步",value:"back"},{label:"取消",value:"cancel"}],onSelect:(P)=>{if(P.value==="save")B();else if(P.value==="back")S();else Q()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}function W3({config:$,setConfig:Q,onNext:Y,onPrev:J}){let{isFocused:Z}=O3({id:"step-tools"});M6((K,q)=>{if(q.escape)J()},{isActive:Z});let X=(K)=>{if(K.includes("all"))Q({...$,tools:["all"]});else Q({...$,tools:K});Y()};return D(X0,{flexDirection:"column",paddingY:1,children:[D(X0,{marginBottom:1,children:D(s,{bold:!0,color:"cyan",children:"Step 3/7: 选择可用工具"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(X0,{marginBottom:1,children:D(s,{dimColor:!0,children:"方向键导航,空格切换勾选,Enter 确认进入下一步 | ESC 返回上一步"},void 0,!1,void 0,this)},void 0,!1,void 0,this),D(U3,{options:N3,defaultValue:$.tools,onSubmit:X},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import L3 from"node:fs";import{useMemoizedFn as H$}from"ahooks";import{Box as I0,Text as v0,useInput as B3}from"ink";import n2 from"ink-select-input";import{useEffect as w3,useMemo as C6,useState as e8}from"react";import{jsxDEV as i}from"react/jsx-dev-runtime";var t2=10;function T6({workspaceRoot:$,initialMode:Q="menu",onComplete:Y,onCancel:J}){let Z=I6($),[X,K]=e8(Q),[q,G]=e8(null),[U,W]=e8(0),[O,H]=e8(0),z=H$(()=>{Z.clear(),Z.loadFromStandardLocations(),W((M)=>M+1)}),w=C6(()=>{return Z.getAllSubagents()},[U]),_=Math.ceil(w.length/t2)||1,F=C6(()=>{let M=O*t2;return w.slice(M,M+t2)},[w,O]);w3(()=>{let M=Math.max(0,_-1);if(O>M)H(M)},[_,O]);let C=H$(()=>{if(O<_-1)H((M)=>M+1)}),N=H$(()=>{if(O>0)H((M)=>M-1)}),S=[{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"}],R=H$((M)=>{if(M.value==="cancel"){J?.();return}K(M.value)}),B=H$((M)=>{if(G(M.value),X==="edit")K("editWizard");else if(X==="delete")K("deleteConfirm")}),f=H$(async()=>{if(!q?.configPath)return;try{await L3.promises.unlink(q.configPath),z(),P()}catch(M){console.error("删除失败:",M)}}),P=H$(()=>{K("menu"),G(null)}),A=S0(!1,J);if(B3((M,L)=>{if(L.escape){if(X==="menu")J?.();else if(X==="list"||X==="edit"||X==="delete")H(0),P();else if(X==="deleteConfirm")P()}else if(L.ctrl&&M==="c"||L.meta&&M==="c")A();else if(X==="list"){if(L.leftArrow||M==="h")N();else if(L.rightArrow||M==="l")C()}},{isActive:X!=="create"&&X!=="editWizard"}),X==="menu")return i(I0,{flexDirection:"column",paddingY:1,children:[i(I0,{marginBottom:1,children:i(v0,{bold:!0,color:"cyan",children:"Agents 管理"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(n2,{items:S,onSelect:R},void 0,!1,void 0,this),i(I0,{marginTop:1,children:i(v0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 退出"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(X==="list"){if(w.length===0)return i(I0,{flexDirection:"column",paddingY:1,children:[i(I0,{marginBottom:1,children:i(v0,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(I0,{paddingLeft:2,children:i(v0,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(I0,{marginTop:1,paddingLeft:2,children:i(v0,{color:"gray",children:"配置文件位置: .blade/agents/ 或 ~/.blade/agents/"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(I0,{marginTop:1,paddingLeft:2,children:i(v0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return i(I0,{flexDirection:"column",paddingY:1,children:[i(I0,{marginBottom:1,children:[i(v0,{bold:!0,color:"cyan",children:"所有 Agents"},void 0,!1,void 0,this),i(v0,{color:"gray",children:[" (共 ",w.length," 个)"]},void 0,!0,void 0,this),_>1&&i(v0,{color:"yellow",children:[" ","第 ",O+1,"/",_," 页"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),F.map((M)=>i(I0,{flexDirection:"column",paddingLeft:2,children:[i(I0,{children:i(v0,{children:[i(v0,{bold:!0,color:M.color||"white",children:["• ",M.name]},void 0,!0,void 0,this),i(v0,{color:"gray",children:[" - ",M.description]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),M.tools&&M.tools.length>0&&i(I0,{paddingLeft:2,children:i(v0,{color:"gray",children:["工具: ",M.tools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),M.configPath&&i(I0,{paddingLeft:2,children:i(v0,{color:"gray",dimColor:!0,children:M.configPath},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},M.name,!0,void 0,this)),i(I0,{marginTop:1,paddingLeft:2,children:_>1?i(v0,{dimColor:!0,children:"Left/Right to page | ESC 返回菜单"},void 0,!1,void 0,this):i(v0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}let T=(M)=>{if(w.length===0)return i(I0,{flexDirection:"column",paddingY:1,children:[i(I0,{marginBottom:1,children:i(v0,{bold:!0,color:"cyan",children:M},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(I0,{paddingLeft:2,children:i(v0,{color:"gray",children:"没有找到任何 agent 配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(I0,{marginTop:1,paddingLeft:2,children:i(v0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);let L=w.map((k)=>({key:k.name,label:`${k.name} - ${k.description}`,value:k}));return i(I0,{flexDirection:"column",paddingY:1,children:[i(I0,{marginBottom:1,children:i(v0,{bold:!0,color:"cyan",children:M},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(n2,{items:L,onSelect:B},void 0,!1,void 0,this),i(I0,{marginTop:1,children:i(v0,{dimColor:!0,children:"使用方向键选择 | Enter 确认 | ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};if(X==="create")return i(U8,{onComplete:()=>{z(),P()},onCancel:P},void 0,!1,void 0,this);if(X==="edit")return T("编辑 Agent");if(X==="editWizard"&&q){let M={name:q.name,description:q.description,tools:q.tools||[],color:q.color,location:q.configPath?.includes(".blade/agents")?"project":"user",systemPrompt:q.systemPrompt||""};return i(U8,{initialConfig:M,onComplete:()=>{z(),P()},onCancel:P},void 0,!1,void 0,this)}if(X==="delete")return T("删除 Agent");if(X==="deleteConfirm"&&q)return i(I0,{flexDirection:"column",paddingY:1,children:[i(I0,{marginBottom:1,children:i(v0,{bold:!0,color:"red",children:"确认删除"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(I0,{marginBottom:1,paddingLeft:2,children:i(v0,{children:["你确定要删除 Agent"," ",i(v0,{bold:!0,color:"yellow",children:q.name},void 0,!1,void 0,this)," ","吗?"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),i(I0,{marginBottom:1,paddingLeft:2,children:i(v0,{dimColor:!0,children:["文件路径: ",q.configPath]},void 0,!0,void 0,this)},void 0,!1,void 0,this),i(I0,{marginBottom:1,paddingLeft:2,children:i(v0,{color:"red",children:"此操作无法撤销!"},void 0,!1,void 0,this)},void 0,!1,void 0,this),i(n2,{items:[{label:"确认删除",value:"confirm"},{label:"取消",value:"cancel"}],onSelect:(M)=>{if(M.value==="confirm")f();else P()}},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null}import{Box as m$,Text as O0}from"ink";import A3,{useEffect as P3,useState as y3}from"react";import{useEffect as b3,useState as f6}from"react";function v6($=l0(),Q=5000){let[Y,J]=f6(null),[Z,X]=f6(!0);return b3(()=>{let K=!0,q=async()=>{try{let U=await k6($);if(!K)return;if(!U){J(null),X(!1);return}let W=await S6($);if(!K)return;J(W)}catch{if(K)J(null)}finally{if(K)X(!1)}};q();let G=null;if(Q>0)G=setInterval(q,Q);return()=>{if(K=!1,G)clearInterval(G)}},[$,Q]),{branch:Y,loading:Z}}import{jsxDEV as n,Fragment as A1}from"react/jsx-dev-runtime";var V6=A3.memo(()=>{let $=R8(),Q=S$(),J=y8()==="shortcuts",Z=L4(),X=T1(),{branch:K}=v6(X),q=M8(),G=z4(),U=Y4(),W=T8(),O=f8(),H=k8(),z=S8(),w=v8(),_=Z4(),F=X4(),C=I8(),N=y4(),S=k$(),[R,B]=y3(null);P3(()=>{let L=!1;new s2(X,S).get().then((o)=>{if(!L)B(o)}).catch(()=>{if(!L)B(null)});let g=s2.subscribe((o)=>{if(!L&&o.sessionId===S&&o.workspaceRoot===X)B(o.goal)});return()=>{L=!0,g()}},[S,X]);let f=q?o8(q):!1,A=(()=>{if(Q==="default")return null;if(Q==="autoEdit")return n(O0,{color:"magenta",children:[">> ","auto edit on ",n(O0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Q==="plan")return n(O0,{color:"cyan",children:["‖ plan mode on ",n(O0,{color:"gray",children:"(shift+tab to cycle)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(Q==="yolo")return n(O0,{color:"red",children:["yolo mode on ",n(O0,{color:"gray",children:"(all tools auto-approved)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return null})(),T=A!==null,M=[["Enter:发送","Shift+Enter:换行","Esc:中止"],["Shift+Tab:切换模式","Up/Down:历史","Tab:补全"],["Ctrl+A:行首","Ctrl+E:行尾","Ctrl+K:删到尾"],["Ctrl+U:删到首","Ctrl+W:删单词","Ctrl+C:退出"]];return n(m$,{flexDirection:"row",justifyContent:"space-between",paddingX:2,paddingY:0,children:[J?n(m$,{flexDirection:"column",gap:0,children:M.map((L,k)=>n(m$,{flexDirection:"row",children:[L.map((g,o)=>{let[l,a]=g.split(":");return n(m$,{flexDirection:"row",width:20,children:[n(O0,{color:"yellow",children:l},void 0,!1,void 0,this),n(O0,{color:"gray",children:":"},void 0,!1,void 0,this),n(O0,{color:"white",children:a},void 0,!1,void 0,this)]},o,!0,void 0,this)}),k===M.length-1&&n(O0,{color:"cyan",children:" ? 关闭"},void 0,!1,void 0,this)]},k,!0,void 0,this))},void 0,!1,void 0,this):n(m$,{flexDirection:"row",gap:1,children:[K&&n(A1,{children:[n(O0,{color:"gray",children:[" ",K]},void 0,!0,void 0,this),n(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),A,T&&n(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),R&&n(A1,{children:[n(O0,{color:R.status==="active"?"green":R.status==="verifying"?"cyan":R.status==="blocked"||R.status==="budget_limited"?"yellow":"gray",children:["goal:",R.status," ",R.objective.slice(0,32)]},void 0,!0,void 0,this),n(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),n(O0,{color:"gray",children:"? for shortcuts"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),n(m$,{flexDirection:"row",gap:1,children:!$?n(O0,{color:"red",children:"[WARN] API 密钥未配置"},void 0,!1,void 0,this):n(A1,{children:[f&&n(A1,{children:[W?n(O0,{color:"cyan",children:["Effort ",O]},void 0,!0,void 0,this):n(O0,{color:"gray",children:"Tab:Effort"},void 0,!1,void 0,this),n(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),H!=="auto"&&n(A1,{children:[n(O0,{color:H==="fast"?"yellow":"gray",children:["Speed ",H]},void 0,!0,void 0,this),n(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z!=="auto"&&n(A1,{children:[n(O0,{color:"gray",children:["Output ",z]},void 0,!0,void 0,this),n(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),w!=="auto"&&n(A1,{children:[n(O0,{color:"gray",children:["Style ",w]},void 0,!0,void 0,this),n(O0,{color:"gray",children:"·"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q&&n(O0,{color:"gray",children:q.model},void 0,!1,void 0,this),n(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),U?n(O0,{color:"yellow",children:"压缩中..."},void 0,!1,void 0,this):n(O0,{color:G<20?"red":G<50?"yellow":"gray",children:[G,"%"]},void 0,!0,void 0,this),n(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),n(O0,{color:F===void 0?"gray":"cyan",children:["Cache ",D6(F)]},void 0,!0,void 0,this),_>0.001&&n(A1,{children:[n(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),n(O0,{color:"green",children:["$",_<0.01?_.toFixed(4):_.toFixed(3)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),C.length>0&&n(A1,{children:[n(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),n(O0,{color:"yellow",children:["已排队 ",C.length]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),N>0&&n(A1,{children:[n(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),n(O0,{color:"cyan",children:["已恢复 ",N," 条指令"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Z&&n(A1,{children:[n(O0,{color:"gray",children:"·"},void 0,!1,void 0,this),n(O0,{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 e2,Text as $Q}from"ink";import R3 from"react";import{jsxDEV as p$}from"react/jsx-dev-runtime";var j6=R3.memo(({suggestions:$,selectedIndex:Q,visible:Y,maxDisplay:J=8})=>{if(!Y||$.length===0)return null;let Z=0,X=Math.min(J,$.length),K=Q>=$.length;if(Q>=J&&!K)Z=Q-J+1,X=Q+1;let q=$.slice(Z,X),G=$.length>J;return p$(e2,{flexDirection:"column",paddingX:2,paddingY:0,children:[q.map((U,W)=>{let H=Z+W===Q;return p$(e2,{flexDirection:"row",paddingX:1,gap:2,children:[p$($Q,{color:H?"cyan":"white",bold:H,children:U.command},void 0,!1,void 0,this),p$($Q,{color:H?"cyan":"gray",dimColor:!H,children:["- ",U.description]},void 0,!0,void 0,this)]},U.command,!0,void 0,this)}),G&&p$(e2,{paddingX:1,children:p$($Q,{color:K?"cyan":"gray",bold:K,dimColor:!K,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 L1,Text as k1,useInput as RZ,useStdout as MZ}from"ink";import CZ from"ink-select-input";import RQ,{useMemo as N9}from"react";import{Box as z0,Text as b0}from"ink";import L$,{useEffect as PQ,useMemo as W$,useRef as O9}from"react";import{Box as _Q,Text as a6}from"ink";import g3 from"react";import{Text as P1}from"ink";import j3 from"react";import l6 from"string-width";import O8 from"string-width";function QQ({onlyFirst:$=!1}={}){return new RegExp("(?:\\u001B\\][\\s\\S]*?(?:\\u0007|\\u001B\\u005C|\\u009C))|[\\u001B\\u009B][[\\]()#;?]*(?:\\d{1,4}(?:[;:]\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]",$?void 0:"g")}var M3=QQ();function JQ($){if(typeof $!=="string")throw TypeError(`Expected a \`string\`, got \`${typeof $}\``);if(!$.includes("\x1B")&&!$.includes(""))return $;return $.replace(M3,"")}var h6=($=0)=>(Q)=>`\x1B[${Q+$}m`,E6=($=0)=>(Q)=>`\x1B[${38+$};5;${Q}m`,g6=($=0)=>(Q,Y,J)=>`\x1B[${38+$};2;${Q};${Y};${J}m`,j0={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]}},qq=Object.keys(j0.modifier),C3=Object.keys(j0.color),I3=Object.keys(j0.bgColor),Uq=[...C3,...I3];function T3(){let $=new Map;for(let[Q,Y]of Object.entries(j0)){for(let[J,Z]of Object.entries(Y))j0[J]={open:`\x1B[${Z[0]}m`,close:`\x1B[${Z[1]}m`},Y[J]=j0[J],$.set(Z[0],Z[1]);Object.defineProperty(j0,Q,{value:Y,enumerable:!1})}return Object.defineProperty(j0,"codes",{value:$,enumerable:!1}),j0.color.close="\x1B[39m",j0.bgColor.close="\x1B[49m",j0.color.ansi=h6(),j0.color.ansi256=E6(),j0.color.ansi16m=g6(),j0.bgColor.ansi=h6(10),j0.bgColor.ansi256=E6(10),j0.bgColor.ansi16m=g6(10),Object.defineProperties(j0,{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)=>j0.rgbToAnsi256(...j0.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 q=Q%36;Y=Math.floor(Q/36)/5,J=Math.floor(q/6)/5,Z=q%6/5}let X=Math.max(Y,J,Z)*2;if(X===0)return 30;let K=30+(Math.round(Z)<<2|Math.round(J)<<1|Math.round(Y));if(X===2)K+=60;return K},enumerable:!1},rgbToAnsi:{value:(Q,Y,J)=>j0.ansi256ToAnsi(j0.rgbToAnsi256(Q,Y,J)),enumerable:!1},hexToAnsi:{value:(Q)=>j0.ansi256ToAnsi(j0.hexToAnsi256(Q)),enumerable:!1}}),j0}var f3=T3(),m6=f3;var Q2=new Set(["\x1B",""]),k3=39,ZQ="\x07",x6="[",S3="]",u6="m",$2=`${S3}8;;`,p6=($)=>`${Q2.values().next().value}${x6}${$}${u6}`,c6=($)=>`${Q2.values().next().value}${$2}${$}${ZQ}`,v3=($)=>$.split(" ").map((Q)=>O8(Q)),YQ=($,Q,Y)=>{let J=[...Q],Z=!1,X=!1,K=O8(JQ($.at(-1)));for(let[q,G]of J.entries()){let U=O8(G);if(K+U<=Y)$[$.length-1]+=G;else $.push(G),K=0;if(Q2.has(G))Z=!0,X=J.slice(q+1,q+1+$2.length).join("")===$2;if(Z){if(X){if(G===ZQ)Z=!1,X=!1}else if(G===u6)Z=!1;continue}if(K+=U,K===Y&&q<J.length-1)$.push(""),K=0}if(!K&&$.at(-1).length>0&&$.length>1)$[$.length-2]+=$.pop()},D3=($)=>{let Q=$.split(" "),Y=Q.length;while(Y>0){if(O8(Q[Y-1])>0)break;Y--}if(Y===Q.length)return $;return Q.slice(0,Y).join(" ")+Q.slice(Y).join("")},V3=($,Q,Y={})=>{if(Y.trim!==!1&&$.trim()==="")return"";let J="",Z,X,K=v3($),q=[""];for(let[O,H]of $.split(" ").entries()){if(Y.trim!==!1)q[q.length-1]=q.at(-1).trimStart();let z=O8(q.at(-1));if(O!==0){if(z>=Q&&(Y.wordWrap===!1||Y.trim===!1))q.push(""),z=0;if(z>0||Y.trim===!1)q[q.length-1]+=" ",z++}if(Y.hard&&K[O]>Q){let w=Q-z,_=1+Math.floor((K[O]-w-1)/Q);if(Math.floor((K[O]-1)/Q)<_)q.push("");YQ(q,H,Q);continue}if(z+K[O]>Q&&z>0&&K[O]>0){if(Y.wordWrap===!1&&z<Q){YQ(q,H,Q);continue}q.push("")}if(z+K[O]>Q&&Y.wordWrap===!1){YQ(q,H,Q);continue}q[q.length-1]+=H}if(Y.trim!==!1)q=q.map((O)=>D3(O));let G=q.join(`
|
|
119
|
+
`),U=[...G],W=0;for(let[O,H]of U.entries()){if(J+=H,Q2.has(H)){let{groups:w}=new RegExp(`(?:\\${x6}(?<code>\\d+)m|\\${$2}(?<uri>.*)${ZQ})`).exec(G.slice(W))||{groups:{}};if(w.code!==void 0){let _=Number.parseFloat(w.code);Z=_===k3?void 0:_}else if(w.uri!==void 0)X=w.uri.length===0?void 0:w.uri}let z=m6.codes.get(Number(Z));if(U[O+1]===`
|
|
120
|
+
`){if(X)J+=c6("");if(Z&&z)J+=p6(z)}else if(H===`
|
|
121
|
+
`){if(Z&&z)J+=p6(Z);if(X)J+=c6(X)}W+=H.length}return J};function XQ($,Q,Y){return String($).normalize().replaceAll(`\r
|
|
122
122
|
`,`
|
|
123
123
|
`).split(`
|
|
124
|
-
`).map((J)=>
|
|
125
|
-
`)}var KQ=($)=>{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
|
|
126
|
-
`).filter((K)=>K.length>0);return X.length>0?X:[""]},
|
|
127
|
-
`);for(let _=0;_<w.length;_++){if(_>0)O.push(H),H=[];if(w[_])H.push({text:w[_],props:z.props})}}if(H.length>0)O.push(H);for(let z of O)Y.push(z);return}let X=Q-Z;if(X<1){
|
|
124
|
+
`).map((J)=>V3(J,Q,Y)).join(`
|
|
125
|
+
`)}var KQ=($)=>{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 l6(Q)};var d6=($)=>{return/[*_~`<[\]https?:]/.test($)},GQ=($)=>{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)=>l6(J)))},J2=($,Q,Y=!1)=>{if(Q<=0)return[$];let J=$.trimEnd(),X=XQ(J,Q,{hard:Y,trim:!1,wordWrap:!0}).split(`
|
|
126
|
+
`).filter((K)=>K.length>0);return X.length>0?X:[""]},r6=($,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 W1,Fragment as E3}from"react/jsx-dev-runtime";var qQ=2,UQ=1,OQ=2;function zQ($,Q){return`inline-${$}-${Q}`}var h3=({text:$})=>{let Q=A0();if(!d6($))return W1(P1,{children:$},void 0,!1,void 0,this);let Y=[],J=0,Z=0,X=0,K=/(\*\*.*?\*\*|\*(?!\s).*?(?<!\s)\*|_(?!\s).*?(?<!\s)_|~~.*?~~|`+[^`]+`+|\[.*?\]\(.*?\)|https?:\/\/\S+)/g,q;while((q=K.exec($))!==null){if(q.index>J){let O=$.slice(J,q.index);Y.push(W1(P1,{children:O},zQ("text",Z++),!1,void 0,this))}let G=q[0],U=null,W=zQ("match",X++);try{if(G.startsWith("**")&&G.endsWith("**")&&G.length>qQ*2)U=W1(P1,{bold:!0,children:G.slice(qQ,-qQ)},W,!1,void 0,this);else if(G.length>UQ*2&&(G.startsWith("*")&&G.endsWith("*")||G.startsWith("_")&&G.endsWith("_"))){let O=$.substring(q.index-1,q.index),H=$.substring(K.lastIndex,K.lastIndex+1);if(!(/\w/.test(O)||/\w/.test(H)||/[./\\]/.test(O+H)))U=W1(P1,{italic:!0,children:G.slice(UQ,-UQ)},W,!1,void 0,this)}else if(G.startsWith("~~")&&G.endsWith("~~")&&G.length>OQ*2)U=W1(P1,{strikethrough:!0,children:G.slice(OQ,-OQ)},W,!1,void 0,this);else if(G.startsWith("`")&&G.endsWith("`")){let O=G.match(/^(`+)([^`]+)\1$/);if(O&&O[2])U=W1(P1,{color:Q.colors.syntax.keyword,backgroundColor:Q.colors.background.secondary,bold:!0,children:` ${O[2]} `},W,!1,void 0,this)}else if(G.startsWith("[")&&G.includes("](")&&G.endsWith(")")){let O=G.match(/\[(.*?)\]\((.*?)\)/);if(O){let H=O[1],z=O[2];U=W1(P1,{children:[H,W1(P1,{color:Q.colors.info,children:[" (",z,")"]},void 0,!0,void 0,this)]},W,!0,void 0,this)}}else if(G.match(/^https?:\/\//))U=W1(P1,{color:Q.colors.info,children:G},W,!1,void 0,this)}catch(O){console.error("InlineRenderer 解析错误:",G,O),U=null}Y.push(U??W1(P1,{children:G},W,!1,void 0,this)),J=K.lastIndex}if(J<$.length){let G=$.slice(J);Y.push(W1(P1,{children:G},zQ("text",Z++),!1,void 0,this))}return W1(E3,{children:Y.filter((G)=>G!==null)},void 0,!1,void 0,this)},y1=j3.memo(h3);import{jsxDEV as c$}from"react/jsx-dev-runtime";var m3="▎",i6=g3.memo(({lines:$,level:Q})=>{let Y=A0(),J=m3.repeat(Q);return c$(_Q,{flexDirection:"column",children:$.map((Z,X)=>{if(Z.trim()==="")return c$(_Q,{height:1},X,!1,void 0,this);return c$(_Q,{flexDirection:"row",children:[c$(a6,{dimColor:!0,color:Y.colors.text.muted,children:[J," "]},void 0,!0,void 0,this),c$(a6,{italic:!0,wrap:"wrap",children:c$(y1,{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 Z2,Text as p1}from"ink";import{isPlainObject as WQ}from"lodash-es";import{common as o3,createLowlight as n3}from"lowlight";import{LRUCache as t3}from"lru-cache";import Q9 from"react";import{Box as Y2,Text as z8}from"ink";import m1,{Fragment as e6}from"react";import{LRUCache as s6}from"lru-cache";import p3 from"string-width";var c3=1024,x3=1048576,o6=1000,n6=new s6({max:c3,maxSize:x3,sizeCalculation:($,Q)=>Math.max(1,Q.length*2+$.length*8)});function NQ($){let Q=!0;for(let J=0;J<$.length;J++)if($.charCodeAt(J)>127){Q=!1;break}if(Q)return $.split("");if($.length<=o6){let J=n6.get($);if(J)return J}let Y=Array.from($);if($.length<=o6)n6.set($,Y);return Y}var u3=2048,l3=524288,d3=4096,t6=new s6({max:u3,maxSize:l3,sizeCalculation:($,Q)=>Math.max(1,Q.length*2+8)});function g1($){if(/^[\x20-\x7E]*$/.test($))return $.length;let Q=t6.get($);if(Q!==void 0)return Q;let Y=p3($);if($.length<=d3)t6.set($,Y);return Y}import{jsxDEV as x$}from"react/jsx-dev-runtime";var FQ=2,$9=m1.memo(({children:$,maxWidth:Q,maxHeight:Y,overflowDirection:J="top",additionalHiddenLinesCount:Z=0})=>{let X=A0(),K=[],q=Math.max(Math.round(Y??Number.MAX_SAFE_INTEGER),FQ);function G(_){if(!m1.isValidElement(_))return;if(_.type===e6){m1.Children.forEach(_.props.children,G);return}if(_.type===Y2){a3(_,Q,K);return}}m1.Children.forEach($,G);let W=K.length>q||Z>0?q-1:q,O=W!==void 0?Math.max(0,K.length-W):0,H=O+Z,w=(O>0?J==="top"?K.slice(O):K.slice(0,W):K).map((_,F)=>x$(Y2,{children:_.length>0?_.map((C,N)=>x$(z8,{...C.props,children:C.text},N,!1,void 0,this)):x$(z8,{children:" "},void 0,!1,void 0,this)},F,!1,void 0,this));return x$(Y2,{flexDirection:"column",width:Q,flexShrink:0,children:[H>0&&J==="top"&&x$(z8,{color:X.colors.text.muted,dimColor:!0,children:["... ",H," line",H===1?"":"s"," hidden ..."]},void 0,!0,void 0,this),w,H>0&&J==="bottom"&&x$(z8,{color:X.colors.text.muted,dimColor:!0,children:["... ",H," line",H===1?"":"s"," hidden ..."]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});function r3($){if(!m1.isValidElement($)||$.type!==Y2)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 U=String(Z);if(!U)return;let W={text:U,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(!m1.isValidElement(Z))return;if(Z.type===e6){m1.Children.forEach(Z.props.children,(U)=>J(U,X));return}if(Z.type!==z8)return;let{children:K,...q}=Z.props,G=X===void 0?q:{...X,...q};m1.Children.forEach(K,(U)=>J(U,G))}return m1.Children.forEach($.props.children,(Z)=>J(Z,void 0)),Q}function a3($,Q,Y){let J=r3($);if(J.segments.length===0&&J.noWrapSegments.length===0){Y.push([]);return}let Z=0;for(let O of J.noWrapSegments)Z+=g1(O.text);if(J.segments.length===0){let O=[],H=[];for(let z of J.noWrapSegments){let w=z.text.split(`
|
|
127
|
+
`);for(let _=0;_<w.length;_++){if(_>0)O.push(H),H=[];if(w[_])H.push({text:w[_],props:z.props})}}if(H.length>0)O.push(H);for(let z of O)Y.push(z);return}let X=Q-Z;if(X<1){i3(J.noWrapSegments,Q,Y);return}let K=[],q=[],G=0;function U(){if(K.length===0)K.push([...J.noWrapSegments,...q]);else if(Z>0)K.push([{text:" ".repeat(Z),props:{}},...q]);else K.push(q);q=[],G=0}function W(O,H){if(q.length>0&&q[q.length-1].props===H)q[q.length-1].text+=O;else q.push({text:O,props:H})}for(let O of J.segments){let H=O.text.split(`
|
|
128
128
|
`);for(let z=0;z<H.length;z++){if(z>0)U();let _=H[z].split(/(\s+)/);for(let F of _){if(!F)continue;let C=g1(F);if(G+C>X&&G>0){if(U(),/^\s+$/.test(F))continue}if(C>X){let S=NQ(F);while(S.length>0){let R=0,B=0;for(let f of S){let P=g1(f);if(G+B+P>X)break;B+=P,R++}if(R>0){let f=S.slice(0,R).join("");W(f,O.props),G+=g1(f),S=S.slice(R)}if(S.length>0)U()}}else W(F,O.props),G+=C}}if(O.text.endsWith(`
|
|
129
|
-
`))U()}if(q.length>0)U();for(let O of K)Y.push(O)}function
|
|
130
|
-
`);for(let G=0;G<q.length;G++){if(G>0)J.push(Z),Z=[],X=0;let U=q[G];if(!U)continue;let W=g1(U),O=Math.max(0,Q-g1("…"));if(W<=O&&X===0)Z.push({text:U,props:K.props}),X+=W;else{let H=NQ(U),z=X,w=0;for(let F of H){let C=g1(F);if(z+C>O)break;z+=C,w++}let _=H.slice(0,w).join("");if(_)Z.push({text:_,props:K.props});Z.push({text:"…",props:{}}),X=z+g1("…")}}}if(Z.length>0)J.push(Z);if(J.length===0)J.push([{text:"…",props:{}}]);for(let K of J)Y.push(K)}import{jsxDEV as
|
|
131
|
-
`),q=0;if(Z&&K.length>Z){let O=Math.max(Z,FQ);if(K.length>O)q=K.length-O,K=K.slice(q)}let G=K.length+q,U=String(G).length+1,W=Math.max(20,J-4);return
|
|
132
|
-
`),Y=[],J=0,Z=0;for(let X of Q){if(X.startsWith("---")||X.startsWith("+++"))continue;if(X.startsWith("@@")){let K=X.match(/@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@/);if(K)J=parseInt(K[1],10),Z=parseInt(K[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 LQ=
|
|
129
|
+
`))U()}if(q.length>0)U();for(let O of K)Y.push(O)}function i3($,Q,Y){let J=[],Z=[],X=0;for(let K of $){let q=K.text.split(`
|
|
130
|
+
`);for(let G=0;G<q.length;G++){if(G>0)J.push(Z),Z=[],X=0;let U=q[G];if(!U)continue;let W=g1(U),O=Math.max(0,Q-g1("…"));if(W<=O&&X===0)Z.push({text:U,props:K.props}),X+=W;else{let H=NQ(U),z=X,w=0;for(let F of H){let C=g1(F);if(z+C>O)break;z+=C,w++}let _=H.slice(0,w).join("");if(_)Z.push({text:_,props:K.props});Z.push({text:"…",props:{}}),X=z+g1("…")}}}if(Z.length>0)J.push(Z);if(J.length===0)J.push([{text:"…",props:{}}]);for(let K of J)Y.push(K)}import{jsxDEV as q1}from"react/jsx-dev-runtime";var HQ=n3(o3),s3=200,e3=524288,$Z=4096,J9=new t3({max:s3,maxSize:e3,sizeCalculation:($)=>$.retainedChars});function Y9($,Q){return`${Q??"__auto__"}\x00${$}`}function QZ($,Q){return J9.get(Y9($,Q))?.root}function JZ($,Q,Y){if($.length>$Z)return;let J=Q?.length??0;J9.set(Y9($,Q),{root:Y,retainedChars:Math.max(1,$.length*2+J)})}function YZ($){return WQ($)&&$.type==="text"&&typeof $.value==="string"}function ZZ($){return WQ($)&&$.type==="element"}function XZ($){return WQ($)&&$.type==="root"&&Array.isArray($.children)}function X2($,Q,Y=0){if(YZ($))return q1(p1,{wrap:"wrap",children:$.value},Y,!1,void 0,this);if(ZZ($)){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((K,q)=>X2(K,Q,q));return q1(p1,{color:Z,wrap:"wrap",children:X},Y,!1,void 0,this)}if(XZ($))return q1(Q9.Fragment,{children:$.children.map((J,Z)=>X2(J,Q,Z))},Y,!1,void 0,this);return q1(p1,{},Y,!1,void 0,this)}function KZ($,Q,Y){let J=Y||r0.getTheme().colors.syntax;try{let Z=QZ($,Q);if(Z)return X2(Z,J);let X;if(!Q||!HQ.registered(Q))X=HQ.highlightAuto($);else X=HQ.highlight(Q,$);let K=X;if(!K.children||K.children.length===0)return q1(p1,{color:J.default,wrap:"wrap",children:$},void 0,!1,void 0,this);return JZ($,Q,X),X2(X,J)}catch(Z){return q1(p1,{color:J.default,wrap:"wrap",children:$},void 0,!1,void 0,this)}}var K2=Q9.memo(({content:$,language:Q,showLineNumbers:Y=!0,terminalWidth:J,availableHeight:Z})=>{let X=A0(),K=$.split(`
|
|
131
|
+
`),q=0;if(Z&&K.length>Z){let O=Math.max(Z,FQ);if(K.length>O)q=K.length-O,K=K.slice(q)}let G=K.length+q,U=String(G).length+1,W=Math.max(20,J-4);return q1(Z2,{borderStyle:"round",borderColor:X.colors.border.light,paddingX:1,paddingY:0,marginY:1,flexDirection:"column",children:[Q&&q1(Z2,{marginBottom:0,children:q1(p1,{color:X.colors.text.secondary,children:Q},void 0,!1,void 0,this)},void 0,!1,void 0,this),q>0&&q1(Z2,{marginBottom:0,children:q1(p1,{color:X.colors.text.muted,dimColor:!0,children:["... ",q," lines hidden ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this),q1($9,{maxWidth:W,maxHeight:Z,children:K.map((O,H)=>{let z=H+q+1;return q1(Z2,{flexDirection:"row",children:[Y&&q1(p1,{color:X.colors.text.muted,dimColor:!0,wrap:"truncate",children:[String(z).padStart(U-1," ")," "]},void 0,!0,void 0,this),O.trim()===""?q1(p1,{wrap:"wrap",children:" "},void 0,!1,void 0,this):KZ(O,Q,X.colors.syntax)]},H,!0,void 0,this)})},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as Z9,Text as _1,useInput as GZ}from"ink";import qZ,{useState as UZ}from"react";import{jsxDEV as U1}from"react/jsx-dev-runtime";var X9=400;function OZ($){let Q=$.split(`
|
|
132
|
+
`),Y=[],J=0,Z=0;for(let X of Q){if(X.startsWith("---")||X.startsWith("+++"))continue;if(X.startsWith("@@")){let K=X.match(/@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@/);if(K)J=parseInt(K[1],10),Z=parseInt(K[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 LQ=qZ.memo(({patch:$,startLine:Q,matchLine:Y,terminalWidth:J,maxLines:Z=20,isFocused:X=!1})=>{let K=A0(),q=OZ($),[G,U]=UZ(!1);GZ((N)=>{if(N.toLowerCase()==="e")U((S)=>!S)},{isActive:X&&q.length>Z});let O=Math.max(...q.map((N)=>N.lineNumber||0)).toString().length+1,H=q.filter((N)=>N.type==="add").length,z=q.filter((N)=>N.type==="remove").length,w=q.length,_=w>Z,F;if(!_)F=q;else if(G)F=q.slice(0,X9);else F=q.slice(0,Z);let C=w-F.length;return U1(Z9,{flexDirection:"column",marginTop:1,marginBottom:1,children:[U1(_1,{color:K.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,J)))},void 0,!1,void 0,this),_&&U1(_1,{color:K.colors.info,children:[G?`已展开 ${F.length}/${w} 行`:`显示前 ${Z} 行,共 ${w} 行`," · ",U1(_1,{color:K.colors.success,children:["+",H]},void 0,!0,void 0,this)," ",U1(_1,{color:K.colors.error,children:["-",z]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),_&&U1(_1,{color:K.colors.muted,children:"─".repeat(Math.max(0,Math.min(60,J)))},void 0,!1,void 0,this),F.map((N,S)=>{if(N.type==="header")return U1(_1,{color:K.colors.muted,dimColor:!0,children:N.content},S,!1,void 0,this);let R=N.lineNumber?N.lineNumber.toString().padStart(O," "):" ".repeat(O),B=" ",f,P;if(N.type==="add")B="+",P=K.colors.success,f=void 0;else if(N.type==="remove")B="-",P=K.colors.error,f=void 0;else P=K.colors.text.primary;let A=Math.max(0,J-O-2),T=N.content;if(T.length>A)T=T.substring(0,A-3)+"...";return U1(_1,{color:P,backgroundColor:f,children:[U1(_1,{dimColor:!0,children:R},void 0,!1,void 0,this),U1(_1,{children:B},void 0,!1,void 0,this),U1(_1,{children:[" ",T]},void 0,!0,void 0,this)]},S,!0,void 0,this)}),_&&U1(Z9,{marginTop:1,children:G?U1(_1,{color:K.colors.info,dimColor:!0,children:[C>0?`已达显示上限 ${X9} 行,仍有 ${C} 行未显示`:"已显示全部内容",X?" · 按 E 折叠":""]},void 0,!0,void 0,this):U1(_1,{color:K.colors.info,dimColor:!0,children:["已隐藏剩余 ",C," 行",X?" · 按 E 展开全部":""]},void 0,!0,void 0,this)},void 0,!1,void 0,this),U1(_1,{color:K.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 BQ,Text as K9}from"ink";import zZ from"react";import{jsxDEV as u$}from"react/jsx-dev-runtime";var _Z=({itemText:$,type:Q,marker:Y,leadingWhitespace:J=""})=>{let Z=Q==="ol"?`${Y}. `:`${Y} `,X=Z.length,K=J.length;return u$(BQ,{paddingLeft:K+1,flexDirection:"row",children:[u$(BQ,{width:X,children:u$(K9,{children:Z},void 0,!1,void 0,this)},void 0,!1,void 0,this),u$(BQ,{flexGrow:1,children:u$(K9,{wrap:"wrap",children:u$(y1,{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)},wQ=zZ.memo(_Z);import{Text as bQ}from"ink";import NZ,{useMemo as FZ}from"react";import G9 from"string-width";import{jsxDEV as AQ}from"react/jsx-dev-runtime";var q9=4,l$=3,HZ=4,U9=NZ.memo(({headers:$,rows:Q,terminalWidth:Y})=>{let J=A0(),Z=FZ(()=>{if($.length===0||Q.length===0)return null;let O=$.length,H=$.map((P,A)=>{let T=Math.max(GQ(P),l$);for(let M of Q)T=Math.max(T,GQ(M[A]||""));return T}),z=$.map((P,A)=>{let T=Math.max(KQ(P),l$);for(let M of Q)T=Math.max(T,KQ(M[A]||""));return T}),w=1+O*3,_=Math.max(Y-w-q9,O*l$),F=H.reduce((P,A)=>P+A,0),C=z.reduce((P,A)=>P+A,0),N=!1,S;if(C<=_)S=z;else if(F<=_){let P=_-F,A=z.map((M,L)=>M-H[L]),T=A.reduce((M,L)=>M+L,0);S=H.map((M,L)=>{if(T===0)return M;let k=Math.floor(A[L]/T*P);return M+k})}else{N=!0;let P=_/F;S=H.map((A)=>Math.max(Math.floor(A*P),l$))}function R(){let P=1;for(let A=0;A<$.length;A++){let T=J2($[A],S[A],N);P=Math.max(P,T.length)}for(let A of Q)for(let T=0;T<A.length;T++){let M=J2(A[T]||"",S[T],N);P=Math.max(P,M.length)}return P}if(R()>HZ)return{type:"vertical",columnWidths:S,needsHardWrap:N};return{type:"horizontal",columnWidths:S,needsHardWrap:N}},[$,Q,Y]);if(!Z)return null;if(Z.type==="vertical"){let O=Math.min(Y-1,40),H="─".repeat(O);return AQ(bQ,{children:Q.map((z,w)=>{let _=[];if(w>0)_.push(H);return z.forEach((F,C)=>{let N=$[C]||`Column ${C+1}`,S=(F||"").replace(/\n+/g," ").trim();_.push(`\x1B[1m${N}:\x1B[22m ${S}`)}),_.join(`
|
|
133
133
|
`)}).join(`
|
|
134
|
-
`)},void 0,!1,void 0,this)}let{columnWidths:X,needsHardWrap:K}=Z;function q(O){let z={top:{left:"┌",mid:"┬",right:"┐",h:"─"},middle:{left:"├",mid:"┼",right:"┤",h:"─"},bottom:{left:"└",mid:"┴",right:"┘",h:"─"}}[O],w=z.left;return X.forEach((_,F)=>{w+=z.h.repeat(_+2),w+=F<X.length-1?z.mid:z.right}),w}function G(O,H){let z=O.map((C,N)=>{let S=X[N]||l$;return J2(C||"",S,K)}),w=Math.max(...z.map((C)=>C.length),1),_=z.map((C)=>Math.floor((w-C.length)/2)),F=[];for(let C=0;C<w;C++){let N="│";for(let S=0;S<O.length;S++){let R=z[S],B=_[S],f=C-B,P=f>=0&&f<R.length?R[f]:"",A=X[S]||l$,T=
|
|
134
|
+
`)},void 0,!1,void 0,this)}let{columnWidths:X,needsHardWrap:K}=Z;function q(O){let z={top:{left:"┌",mid:"┬",right:"┐",h:"─"},middle:{left:"├",mid:"┼",right:"┤",h:"─"},bottom:{left:"└",mid:"┴",right:"┘",h:"─"}}[O],w=z.left;return X.forEach((_,F)=>{w+=z.h.repeat(_+2),w+=F<X.length-1?z.mid:z.right}),w}function G(O,H){let z=O.map((C,N)=>{let S=X[N]||l$;return J2(C||"",S,K)}),w=Math.max(...z.map((C)=>C.length),1),_=z.map((C)=>Math.floor((w-C.length)/2)),F=[];for(let C=0;C<w;C++){let N="│";for(let S=0;S<O.length;S++){let R=z[S],B=_[S],f=C-B,P=f>=0&&f<R.length?R[f]:"",A=X[S]||l$,T=G9(P),M=r6(H?`\x1B[1m${P}\x1B[22m`:P,T,A,H?"center":"left");N+=` ${M} │`}F.push(N)}return F}let U=[];if(U.push(q("top")),U.push(...G($,!0)),U.push(q("middle")),Q.forEach((O,H)=>{if(U.push(...G(O,!1)),H<Q.length-1)U.push(q("middle"))}),U.push(q("bottom")),Math.max(...U.map((O)=>G9(O)))>Y-q9){let O=Math.min(Y-1,40),H="─".repeat(O);return AQ(bQ,{children:Q.map((z,w)=>{let _=[];if(w>0)_.push(H);return z.forEach((F,C)=>{let N=$[C]||`Column ${C+1}`,S=(F||"").replace(/\n+/g," ").trim();_.push(`\x1B[1m${N}:\x1B[22m ${S}`)}),_.join(`
|
|
135
135
|
`)}).join(`
|
|
136
136
|
`)},void 0,!1,void 0,this)}return AQ(bQ,{color:J.colors.text.primary,children:U.join(`
|
|
137
|
-
`)},void 0,!1,void 0,this)});import{jsxDEV as m}from"react/jsx-dev-runtime";var
|
|
137
|
+
`)},void 0,!1,void 0,this)});import{jsxDEV as m}from"react/jsx-dev-runtime";var WZ=($,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:" "}}},LZ=L$.memo(({content:$,language:Q,terminalWidth:Y,isPending:J=!1,availableHeight:Z})=>{let X=A0();if(J&&Z!==void 0){let K=$.split(`
|
|
138
138
|
`),q=4,G=Math.max(1,Z-4);if(K.length>G){let U=K.slice(0,G).join(`
|
|
139
|
-
`);return m(z0,{flexDirection:"column",flexShrink:0,children:[m(K2,{content:U,language:Q,showLineNumbers:!0,terminalWidth:Y},void 0,!1,void 0,this),m(b0,{color:X.colors.text.muted,dimColor:!0,children:"... generating more code ..."},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}}return m(K2,{content:$,language:Q,showLineNumbers:!0,terminalWidth:Y},void 0,!1,void 0,this)}),
|
|
139
|
+
`);return m(z0,{flexDirection:"column",flexShrink:0,children:[m(K2,{content:U,language:Q,showLineNumbers:!0,terminalWidth:Y},void 0,!1,void 0,this),m(b0,{color:X.colors.text.muted,dimColor:!0,children:"... generating more code ..."},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}}return m(K2,{content:$,language:Q,showLineNumbers:!0,terminalWidth:Y},void 0,!1,void 0,this)}),BZ=L$.memo(({content:$,level:Q})=>{let Y=A0();switch(Q){case 1:return m(b0,{bold:!0,color:Y.colors.primary,children:m(y1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 2:return m(b0,{bold:!0,color:Y.colors.primary,children:m(y1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 3:return m(b0,{bold:!0,color:Y.colors.text.primary,children:m(y1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);case 4:return m(b0,{italic:!0,color:Y.colors.text.muted,children:m(y1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this);default:return m(b0,{children:m(y1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)}}),wZ=L$.memo(({terminalWidth:$})=>{let Q=A0(),Y=Math.max(0,Math.min($-4,80));return m(b0,{dimColor:!0,color:Q.colors.text.muted,children:"─".repeat(Y)},void 0,!1,void 0,this)}),bZ=L$.memo(({content:$})=>{return m(b0,{wrap:"wrap",children:m(y1,{text:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)}),AZ=L$.memo(({content:$})=>{let Q=A0();return m(z0,{flexDirection:"row",gap:1,children:[m(b0,{color:Q.colors.info,children:" "},void 0,!1,void 0,this),m(b0,{color:Q.colors.text.muted,italic:!0,children:$},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}),PZ=L$.memo(({detail:$,terminalWidth:Q})=>{let Y=A0(),J=50,Z=$.split(`
|
|
140
140
|
`);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,K=X?Z.slice(0,50):Z,q=K.join(`
|
|
141
|
-
`),G=q.includes("<<<DIFF>>>"),U=q.includes("```");if(G){let W=q.match(/<<<DIFF>>>\s*({[\s\S]*?})\s*<<<\/DIFF>>>/);if(W)try{let O=JSON.parse(W[1]);return m(z0,{flexDirection:"column",children:[m(LQ,{patch:O.patch,startLine:O.startLine,matchLine:O.matchLine,terminalWidth:Q},void 0,!1,void 0,this),X&&m(z0,{marginTop:1,children:m(b0,{dimColor:!0,color:Y.colors.text.muted,children:["... 省略 ",Z.length-50," 行 ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}catch{}}if(U){let W=q.match(/```(\w+)?\s*\n([\s\S]*?)\n```/);if(W){let O=W[1]||"text",H=W[2];return m(z0,{flexDirection:"column",children:[m(K2,{content:H,language:O,showLineNumbers:!1,terminalWidth:Q},void 0,!1,void 0,this),X&&m(z0,{marginTop:1,children:m(b0,{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 m(z0,{flexDirection:"column",children:[K.map((W,O)=>m(b0,{color:Y.colors.text.primary,children:W},O,!1,void 0,this)),X&&m(z0,{marginTop:1,children:m(b0,{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
|
|
142
|
-
`,U);if(O!==-1&&O-U<K)W=O+1;let H=$.slice(W),w=($.slice(0,W).match(/\n/g)||[]).length+1;return{content:H,isTruncated:!0,hiddenLines:w}}var J$=L$.memo(({content:$,role:Q,terminalWidth:Y,metadata:J,isPending:Z=!1,availableTerminalHeight:X,hidePrefix:K=!1,noMargin:q=!1,renderPlainTextOnly:G=!1,streamingLines:U,streamingHiddenLines:W,messageId:O,blocksOverride:H,currentLineOverride:z,streamingMode:w="text",renderCodeBlocksAsPlainText:_=!1})=>{let F=A0(),C=H!==void 0,N=W$(()=>
|
|
143
|
-
`);if(b===-1)return{completedContent:"",currentLine:g};return{completedContent:g.slice(0,b+1),currentLine:g.slice(b+1)}},[g,Z,C,z]),y=U9({content:"",blocks:[]}),v=W$(()=>{if(C)return H??[];if(L)return L;if(M.current&&M.current.messageId===O)return M.current.blocks;let b=y.current;if(!Z||!a.startsWith(b.content)){let h=yQ(a);return y.current={content:a,blocks:h},h}if(a===b.content)return b.blocks;let V=a.slice(b.content.length),p=yQ(V),j=[...b.blocks,...p];return y.current={content:a,blocks:j},j},[a,Z,C,H]);return m(z0,{flexDirection:"column",marginBottom:A?1:0,flexShrink:0,children:[o&&m(z0,{flexDirection:"row",flexShrink:0,children:[m(z0,{width:B,flexShrink:0},void 0,!1,void 0,this),m(b0,{color:F.colors.text.muted,dimColor:!0,children:["^ ",l," lines above (streaming...)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),v.map((b,V)=>{if(b.type==="empty")return m(z0,{height:1,flexShrink:0},V,!1,void 0,this);return m(z0,{flexDirection:"row",flexShrink:0,children:[V===0&&!K&&m(z0,{marginRight:1,flexShrink:0,children:m(b0,{color:S,bold:!0,children:R},void 0,!1,void 0,this)},void 0,!1,void 0,this),(V>0||K)&&m(z0,{width:B,flexShrink:0},void 0,!1,void 0,this),m(z0,{flexGrow:1,flexShrink:0,children:b.type==="code"?_?m(b0,{wrap:"wrap",children:b.content},void 0,!1,void 0,this):m(WZ,{content:b.content,language:b.language,terminalWidth:Y-B,isPending:Z,availableHeight:X},void 0,!1,void 0,this):b.type==="table"&&b.tableData?m(q9,{headers:b.tableData.headers,rows:b.tableData.rows,terminalWidth:Y-B},void 0,!1,void 0,this):b.type==="heading"?m(LZ,{content:b.content,level:b.level||1},void 0,!1,void 0,this):b.type==="list"?m(wQ,{type:b.listType||"ul",marker:b.marker||"-",itemText:b.content,leadingWhitespace:" ".repeat(b.indentation||0)},void 0,!1,void 0,this):b.type==="hr"?m(BZ,{terminalWidth:Y-B},void 0,!1,void 0,this):b.type==="diff"&&b.diffData?m(LQ,{patch:b.diffData.patch,startLine:b.diffData.startLine,matchLine:b.diffData.matchLine,terminalWidth:Y-B},void 0,!1,void 0,this):b.type==="command-message"?m(bZ,{content:b.content},void 0,!1,void 0,this):b.type==="blockquote"&&b.blockquoteLines?m(a6,{lines:b.blockquoteLines,level:b.blockquoteLevel||1},void 0,!1,void 0,this):m(wZ,{content:b.content},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},V,!0,void 0,this)}),I&&m(z0,{flexDirection:"row",flexShrink:0,children:[v.length===0&&!K?m(z0,{marginRight:1,flexShrink:0,children:m(b0,{color:S,bold:!0,children:R},void 0,!1,void 0,this)},void 0,!1,void 0,this):m(z0,{width:B,flexShrink:0},void 0,!1,void 0,this),m(z0,{flexGrow:1,flexShrink:0,children:m(b0,{wrap:"wrap",children:I},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),f&&m(z0,{flexDirection:"row",flexShrink:0,children:[m(z0,{width:B,flexShrink:0},void 0,!1,void 0,this),m(z0,{flexDirection:"column",flexGrow:1,flexShrink:0,children:[m(b0,{color:F.colors.text.muted,children:["Subtask"," ",typeof f.agentType==="string"?`@${f.agentType}`:"",typeof f.status==="string"?` · ${f.status}`:""]},void 0,!0,void 0,this),typeof f.summary==="string"&&f.summary.trim()!==""&&m(b0,{wrap:"wrap",children:f.summary},void 0,!1,void 0,this),typeof f.childSessionId==="string"&&m(b0,{color:F.colors.text.muted,children:["Session ",f.childSessionId]},void 0,!0,void 0,this),typeof f.resumedFrom==="string"&&m(b0,{color:F.colors.text.muted,children:["Resumed from ",f.resumedFrom,typeof f.resumeDepth==="number"?` · depth ${f.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 I0,Fragment as fZ}from"react/jsx-dev-runtime";var CZ=RQ.memo(({label:$,isSelected:Q})=>I0(k1,{color:Q?"yellow":void 0,children:$},void 0,!1,void 0,this)),IZ=RQ.memo(({details:$,headerColor:Q,isPlanModeExit:Y,isPlanModeEnter:J,terminalWidth:Z})=>I0(fZ,{children:[I0(L1,{marginBottom:1,children:I0(k1,{children:$.message},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.planContent&&I0(L1,{flexDirection:"column",marginBottom:1,borderStyle:"single",borderColor:Q,padding:1,children:[I0(k1,{bold:!0,color:Q,children:"实施方案"},void 0,!1,void 0,this),I0(L1,{marginTop:1,children:I0(J$,{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&&I0(L1,{flexDirection:"column",marginBottom:1,children:I0(J$,{content:$.details,role:"assistant",terminalWidth:Z},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.risks&&$.risks.length>0&&I0(L1,{flexDirection:"column",marginBottom:1,children:[I0(k1,{color:"red",bold:!0,children:"风险提示:"},void 0,!1,void 0,this),$.risks.map((X,K)=>I0(L1,{marginLeft:2,children:I0(k1,{color:"red",children:["• ",X]},void 0,!0,void 0,this)},K,!1,void 0,this))]},void 0,!0,void 0,this),$.affectedFiles&&$.affectedFiles.length>0&&I0(L1,{flexDirection:"column",marginBottom:1,children:[I0(k1,{color:"yellow",children:"影响的文件:"},void 0,!1,void 0,this),$.affectedFiles.slice(0,3).map((X,K)=>I0(L1,{marginLeft:2,children:I0(k1,{children:["• ",X]},void 0,!0,void 0,this)},K,!1,void 0,this)),$.affectedFiles.length>3&&I0(L1,{marginLeft:2,children:I0(k1,{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 TZ($,Q,Y,J){return`使用 ↑↓ 选择,回车确认 · ${Q||Y||J?"Y/N":$?"Y/S/N":"Y/S/P/N"} 快捷键 · Esc 取消`}var N9=RQ.memo(({details:$,onResponse:Q})=>{let{stdout:Y}=RZ(),J=Y.columns||80,X=e0()==="confirmation-prompt",K=S0(!1),q=$.type==="exitPlanMode",G=$.type==="enterPlanMode",U=$.type==="maxTurnsExceeded",W=$.type==="mcpSampling";yZ((z,w)=>{if(w.ctrl&&z==="c"||w.meta&&z==="c"){K();return}if(w.escape){Q({approved:!1,reason:"用户取消"});return}let _=z.toLowerCase();if(q){if(_==="y"){Q({approved:!0,targetMode:"autoEdit"});return}if(_==="s"){Q({approved:!0,targetMode:"default"});return}if(_==="n"){Q({approved:!1,reason:"方案需要改进"});return}}else if(G){if(_==="y"){Q({approved:!0});return}if(_==="n"){Q({approved:!1,reason:"用户拒绝进入 Plan 模式"});return}}else if(U){if(_==="y"){Q({approved:!0});return}if(_==="n"){Q({approved:!1,reason:"用户选择停止"});return}}else if(W){if(_==="y"){Q({approved:!0,scope:"once"});return}if(_==="n"){Q({approved:!1,reason:"用户拒绝 MCP Sampling"});return}}else{if(_==="y"){Q({approved:!0,scope:"once"});return}if(_==="s"){Q({approved:!0,scope:"session"});return}if(_==="p"){Q({approved:!0,scope:"project"});return}if(_==="n"){Q({approved:!1,reason:"用户拒绝"});return}}},{isActive:X});let O=_9(()=>{if(q)return[{key:"approve-auto",label:"[Y] 批准,自动执行",value:{approved:!0,targetMode:"autoEdit"}},{key:"approve-default",label:"[S] 批准,逐步确认",value:{approved:!0,targetMode:"default"}},{key:"reject",label:"[N] 继续优化方案",value:{approved:!1,reason:"方案需要改进"}}];if(G)return[{key:"approve",label:"[Y] 进入规划模式",value:{approved:!0}},{key:"reject",label:"[N] 直接执行",value:{approved:!1,reason:"用户拒绝进入 Plan 模式"}}];if(U)return[{key:"continue",label:"[Y] 继续执行",value:{approved:!0}},{key:"stop",label:"[N] 停止",value:{approved:!1,reason:"用户选择停止"}}];if(W)return[{key:"approve-once",label:"[Y] 允许本次 Sampling",value:{approved:!0,scope:"once"}},{key:"reject",label:"[N] 拒绝",value:{approved:!1,reason:"用户拒绝 MCP Sampling"}}];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:"用户拒绝"}}]},[q,G,U,W]),H=_9(()=>{if(q)return{color:"cyan",title:"方案审核"};if(G)return{color:"magenta",title:"进入规划模式"};if(U)return{color:"yellow",title:"已达最大轮次"};return{color:"yellow",title:$.title||"操作确认"}},[q,G,U,$.title]);return I0(L1,{flexDirection:"column",borderStyle:"round",borderColor:X?H.color:"gray",padding:1,children:[I0(L1,{marginBottom:1,children:I0(k1,{bold:!0,color:H.color,children:H.title},void 0,!1,void 0,this)},void 0,!1,void 0,this),I0(IZ,{details:$,headerColor:H.color,isPlanModeExit:q,isPlanModeEnter:G,terminalWidth:J},void 0,!1,void 0,this),I0(L1,{flexDirection:"column",children:[I0(k1,{color:"gray",children:TZ(q,G,U,W)},void 0,!1,void 0,this),I0(MZ,{items:O,isFocused:X,itemComponent:CZ,onSelect:(z)=>{Q(z.value)}},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});import{Box as L0,Text as G0,useInput as kZ}from"ink";import F9 from"ink-text-input";import{useState as c1}from"react";import{jsxDEV as c}from"react/jsx-dev-runtime";var _8=[{action:"add",description:"Add a new hook"},{action:"status",description:"Show hooks status"},{action:"list",description:"List all configured hooks"},{action:"enable",description:"Enable hooks for this session"},{action:"disable",description:"Disable hooks for this session"},{action:"trust",description:"Trust the current project hook digest"},{action:"revoke",description:"Revoke project hook trust"}],G2=[{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"}],q2=[{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"}],SZ=[`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"],H9=({workspaceRoot:$,sessionId:Q,onClose:Y,onSave:J})=>{let Z=r0.getTheme(),[X,K]=c1("action"),[q,G]=c1(0),[U,W]=c1(0),[O,H]=c1(0),[z,w]=c1(""),[_,F]=c1(""),[C,N]=c1(null),[S,R]=c1(!1),[B,f]=c1(null),P=_8[q],A=q2[U],T=G2[O],M=()=>{if(B){f(null);return}switch(X){case"action":Y();break;case"event":K("action");break;case"matcher":K("event");break;case"command":K("matcher");break;case"location":K("command");break;case"confirm":K("location");break}};kZ((v,b)=>{if(b.escape){M();return}if(X==="action"){if(b.upArrow)G((V)=>V>0?V-1:_8.length-1);else if(b.downArrow)G((V)=>V<_8.length-1?V+1:0);else if(b.return)L()}else if(X==="event"){if(b.upArrow)W((V)=>V>0?V-1:q2.length-1);else if(b.downArrow)W((V)=>V<q2.length-1?V+1:0);else if(b.return)K("matcher")}else if(X==="location"){if(b.upArrow)H((V)=>V>0?V-1:G2.length-1);else if(b.downArrow)H((V)=>V<G2.length-1?V+1:0);else if(b.return)K("confirm")}else if(X==="confirm"){if(b.return)y()}});let L=()=>{let v=_8[q].action;if(v==="add")K("event");else if(v==="status")k();else if(v==="list")l();else if(v==="enable")z1.getInstance().enableSession(Q,$),f("Hooks enabled for this session");else if(v==="disable")z1.getInstance().disableSession(Q,$),f("Hooks disabled for this session");else if(v==="trust")g();else if(v==="revoke")o()},k=async()=>{let v=z1.getInstance(),b=v.isEnabled($,Q),V=v.getConfig($),p=await v.getTrustStatus($),j={};for(let E of Object.values(CQ)){let Z0=V[E];if(Z0&&Array.isArray(Z0)){let J0=Z0.reduce((w0,f0)=>w0+(f0.hooks?.length||0),0);if(J0>0)j[E]=J0}}let h=[`Status: ${b?"Enabled":"Disabled"}`,`Trust: ${p.state}`,`Digest: ${p.currentDigest??"none"}`,""];if(Object.keys(j).length>0){h.push("Configured hooks:");for(let[E,Z0]of Object.entries(j))h.push(` ${E}: ${Z0} hook(s)`)}else h.push("No hooks configured");f(h.join(`
|
|
141
|
+
`),G=q.includes("<<<DIFF>>>"),U=q.includes("```");if(G){let W=q.match(/<<<DIFF>>>\s*({[\s\S]*?})\s*<<<\/DIFF>>>/);if(W)try{let O=JSON.parse(W[1]);return m(z0,{flexDirection:"column",children:[m(LQ,{patch:O.patch,startLine:O.startLine,matchLine:O.matchLine,terminalWidth:Q},void 0,!1,void 0,this),X&&m(z0,{marginTop:1,children:m(b0,{dimColor:!0,color:Y.colors.text.muted,children:["... 省略 ",Z.length-50," 行 ..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}catch{}}if(U){let W=q.match(/```(\w+)?\s*\n([\s\S]*?)\n```/);if(W){let O=W[1]||"text",H=W[2];return m(z0,{flexDirection:"column",children:[m(K2,{content:H,language:O,showLineNumbers:!1,terminalWidth:Q},void 0,!1,void 0,this),X&&m(z0,{marginTop:1,children:m(b0,{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 m(z0,{flexDirection:"column",children:[K.map((W,O)=>m(b0,{color:Y.colors.text.primary,children:W},O,!1,void 0,this)),X&&m(z0,{marginTop:1,children:m(b0,{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 yZ($,Q,Y,J=80){if(!Y||Q===void 0||Q<=0)return{content:$,isTruncated:!1,hiddenLines:0};let X=Math.max(1,Q-8),K=Math.max(40,J*0.8),q=X*K;if($.length<=q)return{content:$,isTruncated:!1,hiddenLines:0};let G=Math.floor(q*0.9),U=$.length-G,W=U,O=$.indexOf(`
|
|
142
|
+
`,U);if(O!==-1&&O-U<K)W=O+1;let H=$.slice(W),w=($.slice(0,W).match(/\n/g)||[]).length+1;return{content:H,isTruncated:!0,hiddenLines:w}}var J$=L$.memo(({content:$,role:Q,terminalWidth:Y,metadata:J,isPending:Z=!1,availableTerminalHeight:X,hidePrefix:K=!1,noMargin:q=!1,renderPlainTextOnly:G=!1,streamingLines:U,streamingHiddenLines:W,messageId:O,blocksOverride:H,currentLineOverride:z,streamingMode:w="text",renderCodeBlocksAsPlainText:_=!1})=>{let F=A0(),C=H!==void 0,N=W$(()=>WZ(Q,F.colors,J),[Q,F.colors,J]),{color:S,prefix:R}=N,B=R.length+1,f=W$(()=>{if(!J||typeof J!=="object")return null;if(!("subtaskRef"in J))return null;let b=J.subtaskRef;if(!b||typeof b!=="object")return null;return b},[J]),P=Q==="tool"&&J?.phase==="start",A=!q&&!P,T=W$(()=>{if(!G)return[];return $.split(/\r?\n/)},[$,G]);if(!C&&Z){let b=U??$.split(/\r?\n/),V=W??0,p=!1,j=!1,h=!1;if(w!=="text")p=w==="code",j=w==="diff",h=w==="table";return m(z0,{flexDirection:"column",marginBottom:A?1:0,flexShrink:0,children:[V>0&&m(z0,{flexDirection:"row",flexShrink:0,children:[m(z0,{width:B,flexShrink:0},void 0,!1,void 0,this),m(b0,{color:F.colors.text.muted,dimColor:!0,children:["^ ",V," lines above (streaming...)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),b.map((E,Z0)=>{if(w==="text"){if(E.match(Q$.codeBlock))p=!p;else if(E.match(Q$.diffStart))j=!0;else if(E.match(Q$.diffEnd))j=!1;else if(E.match(Q$.table))h=!0;else if(h&&!E.match(Q$.table))h=!1}let J0=w==="text"&&!p&&!j&&!h,w0=J0?E.match(Q$.ulItem):null,k0=J0?E.match(Q$.olItem):null,c0=w0??k0;return m(z0,{flexDirection:"row",flexShrink:0,children:[Z0===0&&!K?m(z0,{marginRight:1,flexShrink:0,children:m(b0,{color:S,bold:!0,children:R},void 0,!1,void 0,this)},void 0,!1,void 0,this):m(z0,{width:B,flexShrink:0},void 0,!1,void 0,this),m(z0,{flexGrow:1,flexShrink:0,children:c0?m(wQ,{type:w0?"ul":"ol",marker:c0[2],itemText:c0[3],leadingWhitespace:c0[1]},void 0,!1,void 0,this):m(b0,{wrap:"wrap",children:E===""?" ":E},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},Z0,!0,void 0,this)})]},void 0,!0,void 0,this)}if(!C&&G)return m(z0,{flexDirection:"column",marginBottom:A?1:0,flexShrink:0,children:T.map((b,V)=>m(z0,{flexDirection:"row",flexShrink:0,children:[V===0&&!K?m(z0,{marginRight:1,flexShrink:0,children:m(b0,{color:S,bold:!0,children:R},void 0,!1,void 0,this)},void 0,!1,void 0,this):m(z0,{width:B,flexShrink:0},void 0,!1,void 0,this),m(z0,{flexGrow:1,flexShrink:0,children:m(b0,{wrap:"wrap",children:b===""?" ":b},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},V,!0,void 0,this))},void 0,!1,void 0,this);let M=O9(null);PQ(()=>{M.current=null},[O]);let L=W$(()=>{if(C)return null;if(!O)return null;return z9(O)},[O,C]);PQ(()=>{if(C)return;if(!L||!O)return;M.current={messageId:O,blocks:L}},[L,O,C]),PQ(()=>{if(C)return;if(!L||!O)return;_9(O)},[L,O,C]);let k=W$(()=>C?{content:$,isTruncated:!1,hiddenLines:0}:yZ($,X,Z,Y),[$,X,Z,Y,C]),{content:g,isTruncated:o,hiddenLines:l}=k;if(!C&&Q==="tool"&&J&&"detail"in J){let b=J;if(b.detail)return m(z0,{flexDirection:"column",marginBottom:q?0:1,children:[m(z0,{flexDirection:"row",children:[m(z0,{marginRight:1,children:m(b0,{color:S,bold:!0,children:R},void 0,!1,void 0,this)},void 0,!1,void 0,this),m(b0,{color:S,children:$},void 0,!1,void 0,this)]},void 0,!0,void 0,this),m(z0,{marginLeft:R.length+1,children:m(PZ,{detail:b.detail,terminalWidth:Y-(R.length+1)},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}let{completedContent:a,currentLine:I}=W$(()=>{if(C)return{completedContent:"",currentLine:z??""};if(!Z)return{completedContent:g,currentLine:""};let b=g.lastIndexOf(`
|
|
143
|
+
`);if(b===-1)return{completedContent:"",currentLine:g};return{completedContent:g.slice(0,b+1),currentLine:g.slice(b+1)}},[g,Z,C,z]),y=O9({content:"",blocks:[]}),v=W$(()=>{if(C)return H??[];if(L)return L;if(M.current&&M.current.messageId===O)return M.current.blocks;let b=y.current;if(!Z||!a.startsWith(b.content)){let h=yQ(a);return y.current={content:a,blocks:h},h}if(a===b.content)return b.blocks;let V=a.slice(b.content.length),p=yQ(V),j=[...b.blocks,...p];return y.current={content:a,blocks:j},j},[a,Z,C,H]);return m(z0,{flexDirection:"column",marginBottom:A?1:0,flexShrink:0,children:[o&&m(z0,{flexDirection:"row",flexShrink:0,children:[m(z0,{width:B,flexShrink:0},void 0,!1,void 0,this),m(b0,{color:F.colors.text.muted,dimColor:!0,children:["^ ",l," lines above (streaming...)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),v.map((b,V)=>{if(b.type==="empty")return m(z0,{height:1,flexShrink:0},V,!1,void 0,this);return m(z0,{flexDirection:"row",flexShrink:0,children:[V===0&&!K&&m(z0,{marginRight:1,flexShrink:0,children:m(b0,{color:S,bold:!0,children:R},void 0,!1,void 0,this)},void 0,!1,void 0,this),(V>0||K)&&m(z0,{width:B,flexShrink:0},void 0,!1,void 0,this),m(z0,{flexGrow:1,flexShrink:0,children:b.type==="code"?_?m(b0,{wrap:"wrap",children:b.content},void 0,!1,void 0,this):m(LZ,{content:b.content,language:b.language,terminalWidth:Y-B,isPending:Z,availableHeight:X},void 0,!1,void 0,this):b.type==="table"&&b.tableData?m(U9,{headers:b.tableData.headers,rows:b.tableData.rows,terminalWidth:Y-B},void 0,!1,void 0,this):b.type==="heading"?m(BZ,{content:b.content,level:b.level||1},void 0,!1,void 0,this):b.type==="list"?m(wQ,{type:b.listType||"ul",marker:b.marker||"-",itemText:b.content,leadingWhitespace:" ".repeat(b.indentation||0)},void 0,!1,void 0,this):b.type==="hr"?m(wZ,{terminalWidth:Y-B},void 0,!1,void 0,this):b.type==="diff"&&b.diffData?m(LQ,{patch:b.diffData.patch,startLine:b.diffData.startLine,matchLine:b.diffData.matchLine,terminalWidth:Y-B},void 0,!1,void 0,this):b.type==="command-message"?m(AZ,{content:b.content},void 0,!1,void 0,this):b.type==="blockquote"&&b.blockquoteLines?m(i6,{lines:b.blockquoteLines,level:b.blockquoteLevel||1},void 0,!1,void 0,this):m(bZ,{content:b.content},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},V,!0,void 0,this)}),I&&m(z0,{flexDirection:"row",flexShrink:0,children:[v.length===0&&!K?m(z0,{marginRight:1,flexShrink:0,children:m(b0,{color:S,bold:!0,children:R},void 0,!1,void 0,this)},void 0,!1,void 0,this):m(z0,{width:B,flexShrink:0},void 0,!1,void 0,this),m(z0,{flexGrow:1,flexShrink:0,children:m(b0,{wrap:"wrap",children:I},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),f&&m(z0,{flexDirection:"row",flexShrink:0,children:[m(z0,{width:B,flexShrink:0},void 0,!1,void 0,this),m(z0,{flexDirection:"column",flexGrow:1,flexShrink:0,children:[m(b0,{color:F.colors.text.muted,children:["Subtask"," ",typeof f.agentType==="string"?`@${f.agentType}`:"",typeof f.status==="string"?` · ${f.status}`:""]},void 0,!0,void 0,this),typeof f.summary==="string"&&f.summary.trim()!==""&&m(b0,{wrap:"wrap",children:f.summary},void 0,!1,void 0,this),typeof f.childSessionId==="string"&&m(b0,{color:F.colors.text.muted,children:["Session ",f.childSessionId]},void 0,!0,void 0,this),typeof f.resumedFrom==="string"&&m(b0,{color:F.colors.text.muted,children:["Resumed from ",f.resumedFrom,typeof f.resumeDepth==="number"?` · depth ${f.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 T0,Fragment as kZ}from"react/jsx-dev-runtime";var IZ=RQ.memo(({label:$,isSelected:Q})=>T0(k1,{color:Q?"yellow":void 0,children:$},void 0,!1,void 0,this)),TZ=RQ.memo(({details:$,headerColor:Q,isPlanModeExit:Y,isPlanModeEnter:J,terminalWidth:Z})=>T0(kZ,{children:[T0(L1,{marginBottom:1,children:T0(k1,{children:$.message},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.planContent&&T0(L1,{flexDirection:"column",marginBottom:1,borderStyle:"single",borderColor:Q,padding:1,children:[T0(k1,{bold:!0,color:Q,children:"实施方案"},void 0,!1,void 0,this),T0(L1,{marginTop:1,children:T0(J$,{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&&T0(L1,{flexDirection:"column",marginBottom:1,children:T0(J$,{content:$.details,role:"assistant",terminalWidth:Z},void 0,!1,void 0,this)},void 0,!1,void 0,this),$.risks&&$.risks.length>0&&T0(L1,{flexDirection:"column",marginBottom:1,children:[T0(k1,{color:"red",bold:!0,children:"风险提示:"},void 0,!1,void 0,this),$.risks.map((X,K)=>T0(L1,{marginLeft:2,children:T0(k1,{color:"red",children:["• ",X]},void 0,!0,void 0,this)},K,!1,void 0,this))]},void 0,!0,void 0,this),$.affectedFiles&&$.affectedFiles.length>0&&T0(L1,{flexDirection:"column",marginBottom:1,children:[T0(k1,{color:"yellow",children:"影响的文件:"},void 0,!1,void 0,this),$.affectedFiles.slice(0,3).map((X,K)=>T0(L1,{marginLeft:2,children:T0(k1,{children:["• ",X]},void 0,!0,void 0,this)},K,!1,void 0,this)),$.affectedFiles.length>3&&T0(L1,{marginLeft:2,children:T0(k1,{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 fZ($,Q,Y,J){return`使用 ↑↓ 选择,回车确认 · ${Q||Y||J?"Y/N":$?"Y/S/N":"Y/S/P/N"} 快捷键 · Esc 取消`}var F9=RQ.memo(({details:$,onResponse:Q})=>{let{stdout:Y}=MZ(),J=Y.columns||80,X=e0()==="confirmation-prompt",K=S0(!1),q=$.type==="exitPlanMode",G=$.type==="enterPlanMode",U=$.type==="maxTurnsExceeded",W=$.type==="mcpSampling";RZ((z,w)=>{if(w.ctrl&&z==="c"||w.meta&&z==="c"){K();return}if(w.escape){Q({approved:!1,reason:"用户取消"});return}let _=z.toLowerCase();if(q){if(_==="y"){Q({approved:!0,targetMode:"autoEdit"});return}if(_==="s"){Q({approved:!0,targetMode:"default"});return}if(_==="n"){Q({approved:!1,reason:"方案需要改进"});return}}else if(G){if(_==="y"){Q({approved:!0});return}if(_==="n"){Q({approved:!1,reason:"用户拒绝进入 Plan 模式"});return}}else if(U){if(_==="y"){Q({approved:!0});return}if(_==="n"){Q({approved:!1,reason:"用户选择停止"});return}}else if(W){if(_==="y"){Q({approved:!0,scope:"once"});return}if(_==="n"){Q({approved:!1,reason:"用户拒绝 MCP Sampling"});return}}else{if(_==="y"){Q({approved:!0,scope:"once"});return}if(_==="s"){Q({approved:!0,scope:"session"});return}if(_==="p"){Q({approved:!0,scope:"project"});return}if(_==="n"){Q({approved:!1,reason:"用户拒绝"});return}}},{isActive:X});let O=N9(()=>{if(q)return[{key:"approve-auto",label:"[Y] 批准,自动执行",value:{approved:!0,targetMode:"autoEdit"}},{key:"approve-default",label:"[S] 批准,逐步确认",value:{approved:!0,targetMode:"default"}},{key:"reject",label:"[N] 继续优化方案",value:{approved:!1,reason:"方案需要改进"}}];if(G)return[{key:"approve",label:"[Y] 进入规划模式",value:{approved:!0}},{key:"reject",label:"[N] 直接执行",value:{approved:!1,reason:"用户拒绝进入 Plan 模式"}}];if(U)return[{key:"continue",label:"[Y] 继续执行",value:{approved:!0}},{key:"stop",label:"[N] 停止",value:{approved:!1,reason:"用户选择停止"}}];if(W)return[{key:"approve-once",label:"[Y] 允许本次 Sampling",value:{approved:!0,scope:"once"}},{key:"reject",label:"[N] 拒绝",value:{approved:!1,reason:"用户拒绝 MCP Sampling"}}];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:"用户拒绝"}}]},[q,G,U,W]),H=N9(()=>{if(q)return{color:"cyan",title:"方案审核"};if(G)return{color:"magenta",title:"进入规划模式"};if(U)return{color:"yellow",title:"已达最大轮次"};return{color:"yellow",title:$.title||"操作确认"}},[q,G,U,$.title]);return T0(L1,{flexDirection:"column",borderStyle:"round",borderColor:X?H.color:"gray",padding:1,children:[T0(L1,{marginBottom:1,children:T0(k1,{bold:!0,color:H.color,children:H.title},void 0,!1,void 0,this)},void 0,!1,void 0,this),T0(TZ,{details:$,headerColor:H.color,isPlanModeExit:q,isPlanModeEnter:G,terminalWidth:J},void 0,!1,void 0,this),T0(L1,{flexDirection:"column",children:[T0(k1,{color:"gray",children:fZ(q,G,U,W)},void 0,!1,void 0,this),T0(CZ,{items:O,isFocused:X,itemComponent:IZ,onSelect:(z)=>{Q(z.value)}},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});import{Box as L0,Text as G0,useInput as SZ}from"ink";import H9 from"ink-text-input";import{useState as c1}from"react";import{jsxDEV as c}from"react/jsx-dev-runtime";var _8=[{action:"add",description:"Add a new hook"},{action:"status",description:"Show hooks status"},{action:"list",description:"List all configured hooks"},{action:"enable",description:"Enable hooks for this session"},{action:"disable",description:"Disable hooks for this session"},{action:"trust",description:"Trust the current project hook digest"},{action:"revoke",description:"Revoke project hook trust"}],G2=[{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"}],q2=[{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"}],vZ=[`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"],W9=({workspaceRoot:$,sessionId:Q,onClose:Y,onSave:J})=>{let Z=r0.getTheme(),[X,K]=c1("action"),[q,G]=c1(0),[U,W]=c1(0),[O,H]=c1(0),[z,w]=c1(""),[_,F]=c1(""),[C,N]=c1(null),[S,R]=c1(!1),[B,f]=c1(null),P=_8[q],A=q2[U],T=G2[O],M=()=>{if(B){f(null);return}switch(X){case"action":Y();break;case"event":K("action");break;case"matcher":K("event");break;case"command":K("matcher");break;case"location":K("command");break;case"confirm":K("location");break}};SZ((v,b)=>{if(b.escape){M();return}if(X==="action"){if(b.upArrow)G((V)=>V>0?V-1:_8.length-1);else if(b.downArrow)G((V)=>V<_8.length-1?V+1:0);else if(b.return)L()}else if(X==="event"){if(b.upArrow)W((V)=>V>0?V-1:q2.length-1);else if(b.downArrow)W((V)=>V<q2.length-1?V+1:0);else if(b.return)K("matcher")}else if(X==="location"){if(b.upArrow)H((V)=>V>0?V-1:G2.length-1);else if(b.downArrow)H((V)=>V<G2.length-1?V+1:0);else if(b.return)K("confirm")}else if(X==="confirm"){if(b.return)y()}});let L=()=>{let v=_8[q].action;if(v==="add")K("event");else if(v==="status")k();else if(v==="list")l();else if(v==="enable")z1.getInstance().enableSession(Q,$),f("Hooks enabled for this session");else if(v==="disable")z1.getInstance().disableSession(Q,$),f("Hooks disabled for this session");else if(v==="trust")g();else if(v==="revoke")o()},k=async()=>{let v=z1.getInstance(),b=v.isEnabled($,Q),V=v.getConfig($),p=await v.getTrustStatus($),j={};for(let E of Object.values(CQ)){let Z0=V[E];if(Z0&&Array.isArray(Z0)){let J0=Z0.reduce((w0,k0)=>w0+(k0.hooks?.length||0),0);if(J0>0)j[E]=J0}}let h=[`Status: ${b?"Enabled":"Disabled"}`,`Trust: ${p.state}`,`Digest: ${p.currentDigest??"none"}`,""];if(Object.keys(j).length>0){h.push("Configured hooks:");for(let[E,Z0]of Object.entries(j))h.push(` ${E}: ${Z0} hook(s)`)}else h.push("No hooks configured");f(h.join(`
|
|
144
144
|
`))},g=async()=>{try{let v=await z1.getInstance().trustProject($);f(`Trust: ${v.state}
|
|
145
145
|
Digest: ${v.currentDigest??"none"}`)}catch(v){N(v instanceof Error?v.message:"Failed to trust hooks")}},o=async()=>{try{let v=await z1.getInstance().revokeProjectTrust($);f(`Trust: ${v.state}`)}catch(v){N(v instanceof Error?v.message:"Failed to revoke hook trust")}},l=()=>{let b=z1.getInstance().getConfig($),V=[],p=!1;for(let j of Object.values(CQ)){let h=b[j];if(!h||!Array.isArray(h)||h.length===0)continue;p=!0,V.push(`${j}:`);for(let E of h){let Z0=E.matcher,J0="all";if(Z0?.tools)J0=`tools: ${Array.isArray(Z0.tools)?Z0.tools.join(", "):Z0.tools}`;V.push(` [${J0}]`);for(let w0 of E.hooks||[])if(w0.type==="command")V.push(` -> ${w0.command}`)}V.push("")}if(!p)V.push("No hooks configured"),V.push(""),V.push("Configure hooks in .blade/settings.local.json");f(V.join(`
|
|
146
|
-
`))},a=()=>{K("command")},I=()=>{if(!_.trim()){N("Command cannot be empty");return}N(null),K("location")},y=async()=>{R(!0),N(null);try{let v=z1.getInstance(),b=await import("node:fs/promises"),V=await import("node:path"),p=await import("node:os"),j={matcher:z.trim()?{tools:z.trim()}:{},hooks:[{type:"command",command:_.trim()}]},h;switch(T.location){case"local":h=V.join($,".blade","settings.local.json");break;case"project":h=V.join($,".blade","settings.json");break;case"user":h=V.join(p.homedir(),".blade","settings.json");break}await b.mkdir(V.dirname(h),{recursive:!0});let E={};try{let f0=await b.readFile(h,"utf-8");E=JSON.parse(f0)}catch{}let Z0=E.hooks||{},J0=Z0[A.event]||[],w0={...Z0,enabled:!0,[A.event]:[...J0,j]};if(E.hooks=w0,await b.writeFile(h,JSON.stringify(E,null,2),"utf-8"),await v.reloadConfig($),J)J({event:A.event,matcher:z.trim(),command:_.trim()});Y()}catch(v){N(`Failed to save hook: ${v instanceof Error?v.message:"Unknown error"}`),R(!1)}};return c(L0,{flexDirection:"column",padding:1,children:[c(L0,{marginBottom:1,children:c(G0,{bold:!0,color:Z.colors.success,children:"Hooks Manager"},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(L0,{marginBottom:1,children:c(G0,{color:Z.colors.warning,children:"[WARN] Configured hooks run only after this exact project digest is trusted. Function hooks registered by application code are exempt."},void 0,!1,void 0,this)},void 0,!1,void 0,this),B&&c(L0,{flexDirection:"column",marginBottom:1,children:[c(G0,{children:B},void 0,!1,void 0,this),c(L0,{marginTop:1,children:c(G0,{color:Z.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),X==="action"&&!B&&c(L0,{flexDirection:"column",children:[c(L0,{flexDirection:"column",marginTop:1,children:_8.map((v,b)=>c(L0,{children:[c(G0,{color:b===q?Z.colors.primary:void 0,bold:b===q,children:[b===q?"> ":" ",v.action]},void 0,!0,void 0,this),c(G0,{color:Z.colors.muted,children:[" - ",v.description]},void 0,!0,void 0,this)]},v.action,!0,void 0,this))},void 0,!1,void 0,this),c(L0,{marginTop:1,children:c(G0,{color:Z.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),X==="event"&&c(L0,{flexDirection:"column",children:[c(G0,{bold:!0,children:"Select Event:"},void 0,!1,void 0,this),c(L0,{flexDirection:"column",marginTop:1,children:q2.map((v,b)=>c(L0,{children:[c(G0,{color:b===U?Z.colors.primary:void 0,bold:b===U,children:[b===U?"> ":" ",v.event]},void 0,!0,void 0,this),c(G0,{color:Z.colors.muted,children:[" - ",v.description]},void 0,!0,void 0,this)]},v.event,!0,void 0,this))},void 0,!1,void 0,this),c(L0,{marginTop:1,children:c(G0,{color:Z.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),X!=="event"&&c(L0,{marginBottom:1,children:c(G0,{children:["Event:"," ",c(G0,{bold:!0,color:Z.colors.primary,children:A.event},void 0,!1,void 0,this),c(G0,{color:Z.colors.muted,children:[" - ",A.description]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),(X==="matcher"||X==="command"||X==="confirm")&&c(L0,{flexDirection:"column",marginBottom:1,children:[c(G0,{color:Z.colors.muted,children:"Input to command is JSON of tool call arguments."},void 0,!1,void 0,this),c(G0,{color:Z.colors.muted,children:"Exit code 0 - stdout/stderr not shown"},void 0,!1,void 0,this),c(G0,{color:Z.colors.muted,children:"Exit code 2 - show stderr to model and block tool call"},void 0,!1,void 0,this),c(G0,{color:Z.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),X==="matcher"&&c(L0,{flexDirection:"column",children:[c(L0,{children:[c(G0,{bold:!0,children:"Matcher: "},void 0,!1,void 0,this),c(F9,{value:z,onChange:w,onSubmit:a,placeholder:"e.g., Read, Bash, Edit|Write (empty = all tools)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(L0,{marginTop:1,children:c(G0,{color:Z.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),c(L0,{marginTop:1,children:c(G0,{color:Z.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),(X==="command"||X==="confirm")&&c(L0,{marginBottom:1,children:c(G0,{children:["Matcher: ",c(G0,{bold:!0,children:z||"(all tools)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),X==="command"&&c(L0,{flexDirection:"column",children:[c(L0,{children:c(G0,{bold:!0,children:"Command: "},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(L0,{borderStyle:"single",borderColor:Z.colors.border.light,paddingX:1,marginTop:1,children:c(F9,{value:_,onChange:F,onSubmit:I,placeholder:"Enter shell command..."},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(L0,{flexDirection:"column",marginTop:1,children:[c(G0,{bold:!0,children:"Examples:"},void 0,!1,void 0,this),SZ.map((v,b)=>c(G0,{color:Z.colors.muted,children:["• ",v]},b,!0,void 0,this))]},void 0,!0,void 0,this),c(L0,{marginTop:1,children:c(G0,{color:Z.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),X==="location"&&c(L0,{flexDirection:"column",children:[c(L0,{flexDirection:"column",borderStyle:"round",borderColor:Z.colors.border.light,paddingX:2,paddingY:1,marginBottom:1,children:[c(G0,{bold:!0,color:Z.colors.primary,children:"Save hook configuration"},void 0,!1,void 0,this),c(G0,{children:" "},void 0,!1,void 0,this),c(G0,{children:[" ","Event: ",A.event," - ",A.description]},void 0,!0,void 0,this),c(G0,{children:[" Matcher: ",z||"(all)"]},void 0,!0,void 0,this),c(G0,{children:[" Command: ",_]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),c(G0,{bold:!0,children:"Where should this hook be saved?"},void 0,!1,void 0,this),c(L0,{flexDirection:"column",marginTop:1,children:G2.map((v,b)=>c(L0,{children:[c(G0,{color:b===O?Z.colors.primary:void 0,bold:b===O,children:[b===O?"> ":" ",b+1,". ",v.name]},void 0,!0,void 0,this),c(G0,{color:Z.colors.muted,children:[" ",v.description]},void 0,!0,void 0,this)]},v.location,!0,void 0,this))},void 0,!1,void 0,this),c(L0,{marginTop:1,children:c(G0,{color:Z.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),X==="confirm"&&c(L0,{flexDirection:"column",children:[c(L0,{flexDirection:"column",borderStyle:"round",borderColor:Z.colors.success,paddingX:2,paddingY:1,children:[c(G0,{bold:!0,children:["Saving hook to ",T.description,"..."]},void 0,!0,void 0,this),c(G0,{children:" "},void 0,!1,void 0,this),c(G0,{children:["Event: ",A.event]},void 0,!0,void 0,this),c(G0,{children:["Matcher: ",z||"(all tools)"]},void 0,!0,void 0,this),c(G0,{children:["Command: ",_]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),c(L0,{marginTop:1,children:c(G0,{color:Z.colors.muted,children:S?"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),C&&c(L0,{marginTop:1,children:c(G0,{color:Z.colors.error,children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as D9}from"ahooks";import{Box as iZ,Text as oZ}from"ink";import nZ from"react";import{useMemoizedFn as O2}from"ahooks";import w$ from"chalk";import{Text as uZ,useInput as lZ}from"ink";import{useEffect as k9,useRef as z2}from"react";var U2={TIMEOUT_MS:100,RAPID_INPUT_THRESHOLD_MS:150,LARGE_INPUT_THRESHOLD:300,MEDIUM_SIZE_MULTI_CHUNK_THRESHOLD:200};var B$="\x1B",vZ=`${B$}[200~`,DZ=`${B$}[201~`,VZ="[200~",jZ="[201~",hZ=[`${B$}[I`,`${B$}[O`,"[I","[O"],B9=`${B$}[?2004h`,w9=`${B$}[?2004l`,TQ=`${B$}[?1004l`,EZ=[vZ,VZ],gZ=[DZ,jZ];function b9(){return{pasteBuffer:null,pasteOverflowed:!1}}function W9($,Q){let Y;for(let J of Q){let Z=$.indexOf(J);if(Z===-1)continue;if(!Y||Z<Y.index||Z===Y.index&&J.length>Y.marker.length)Y={index:Z,marker:J}}return Y}function L9($){return hZ.some((Q)=>$===Q)}function A9($,Q){let Y=Q,J=$.pasteBuffer,Z=$.pasteOverflowed,X=J!==null,K=[];while(Y.length>0){if(J!==null){let U=W9(Y,gZ);if(!U){if(J.length+Y.length>IQ)J="",Z=!0;else if(!Z)J+=Y;Y="";break}if(J.length+U.index>IQ)Z=!0;else if(!Z)J+=Y.slice(0,U.index),K.push({kind:"paste",text:J});J=null,Z=!1,X=!0,Y=Y.slice(U.index+U.marker.length);continue}let q=W9(Y,EZ);if(!q){if(L9(Y))X=!0;else K.push({kind:"text",text:Y});Y="";break}let G=Y.slice(0,q.index);if(G&&!L9(G))K.push({kind:"text",text:G});J="",Z=!1,X=!0,Y=Y.slice(q.index+q.marker.length)}if(Q.length===0&&J!==null)X=!0;return{handled:X,state:{pasteBuffer:J,pasteOverflowed:Z},segments:K}}import{execSync as d$}from"node:child_process";import{existsSync as mZ,readFileSync as fQ}from"node:fs";import{basename as P9,isAbsolute as pZ}from"node:path";function y9($){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 R9(){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 cZ(){let{commands:$}=R9();try{return d$($.getPath,{encoding:"utf-8"}).trim()}catch(Q){return console.error("Failed to get clipboard path:",Q),null}}function M9($){if($.startsWith('"')&&$.endsWith('"')||$.startsWith("'")&&$.endsWith("'"))return $.slice(1,-1);return $}function C9($){if(process.platform==="win32")return $;let Q="__DOUBLE_BACKSLASH__";return $.replace(/\\\\/g,Q).replace(/\\(.)/g,"$1").replace(new RegExp(Q,"g"),"\\")}function kQ($){let Q=M9($.trim()),Y=C9(Q);return/\.(png|jpe?g|gif|webp)$/i.test(Y)}function xZ($){let Q=M9($.trim()),Y=C9(Q);if(kQ(Y))return Y;return null}async function I9($){let Q=xZ($);if(!Q)return null;let Y;try{if(pZ(Q))Y=fQ(Q);else{let K=cZ();if(K&&Q===P9(K))Y=fQ(K);else return null}}catch(K){return console.error("Failed to read image file:",K),null}let J=Y.toString("base64"),Z=y9(J),X=P9(Q);return{path:Q,base64:J,mediaType:Z,filename:X}}async function T9(){let $=process.platform,Q={darwin:"pbpaste",linux:"xclip -selection clipboard -o || wl-paste",win32:'powershell -Command "Get-Clipboard"'},Y=Q[$]||Q.linux;try{return d$(Y,{encoding:"utf-8"})||null}catch{return null}}async function f9(){let{commands:$,screenshotPath:Q}=R9();try{if(d$($.checkImage,{stdio:"ignore"}),d$($.saveImage(Q),{stdio:"ignore"}),!mZ(Q))return null;let J=fQ(Q).toString("base64"),Z=y9(J);return d$($.deleteFile(Q),{stdio:"ignore"}),{base64:J,mediaType:Z}}catch(Y){try{d$($.deleteFile(Q),{stdio:"ignore"})}catch{}return null}}import{jsxDEV as aZ}from"react/jsx-dev-runtime";var dZ=/\r\n/g,rZ=/\r/g;function SQ($){if(!$.includes("\r"))return $;return $.replace(dZ,`
|
|
147
|
-
`).replace(
|
|
148
|
-
`)}function
|
|
149
|
-
`))&&K){let P=await K(B);if(P?.prompt){w(P.prompt);return}}w(B)}),F=O2((R)=>{let B=H.current;if(!B){try{let P=R();if(!P)return;let A=P.catch(()=>{return});H.current=A,A.finally(()=>{if(H.current===A)H.current=null})}catch{}return}let f=B.then(R).then(()=>{return}).catch(()=>{return});H.current=f,f.finally(()=>{if(H.current===f)H.current=null})});
|
|
150
|
-
`&&(B.shift||B.meta)){let{newValue:g,newCursorPosition:o}=
|
|
151
|
-
`)))return _(f);k=T.slice(0,M)+f+T.slice(M,T.length),L+=f.length}if(L<0)L=0;if(L>k.length)L=k.length;z(k,L)})},{isActive:Y});let C=Y,N=$,S=Q?w$.grey(Q):void 0;if(C)if(S=Q.length>0?w$.inverse(Q[0])+w$.grey(Q.slice(1)):w$.inverse(" "),$.length===0)N=w$.inverse(" ");else{N="";for(let R=0;R<$.length;R++)if(R===Z&&Z<$.length)N+=w$.inverse($[R]);else N+=$[R];if(Z>=$.length)N+=w$.inverse(" ")}return
|
|
152
|
-
`).length,z=O.length,w=500,_=10;if(z>500||H>10){let F=Z(O),C=O.slice(0,30).replace(/\n/g," "),N=`${z} chars, ${H} lines: ${C}...`;return{prompt:`${i8(F)}${N}${l2()}`}}return{}}),W=D9(async(O,H,z)=>{try{let w=X(O,H);return{prompt:`${i8(w)}[Image #${w}]${l2()}`}}catch(w){return console.error("[Image Paste] Failed to process image:",w),{prompt:`[Image paste failed: ${w instanceof Error?w.message:"Unknown error"}] `}}});return vQ(iZ,{flexDirection:"row",width:"100%",paddingX:2,paddingY:0,flexShrink:0,flexGrow:0,overflow:"hidden",borderStyle:"round",borderColor:G?"yellow":"gray",children:[vQ(oZ,{color:G?"yellow":"blue",bold:!0,children:G?"$ ":"> "},void 0,!1,void 0,this),vQ(v9,{value:$,cursorPosition:Q,onChange:Y,onChangeCursorPosition:J,onPaste:U,onImagePaste:W,placeholder:" 输入命令...",focus:q,disabledKeys:["upArrow","downArrow","tab","return","escape"]},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as _2,Text as R1}from"ink";import Q5,{useEffect as J5,useState as Y5}from"react";import{useEffect as $5,useState as g9}from"react";import{useEffect as tZ,useState as sZ}from"react";var eZ=15000,j9=["思考中","构思中","推理中","琢磨中","分析中","斟酌中","酝酿中","推敲中","揣摩中","审视中","处理中","编排中","打磨中","编织中","拼装中","调配中","组装中","搭建中","铸造中","雕琢中","搜寻中","梳理中","排查中","勘探中","钻研中","翻阅中","遍历中","扫描中","检索中","追踪中","计算中","编译中","解析中","运算中","推演中","迭代中","收敛中","演绎中","归纳中","求解中","生成中","编写中","起草中","绘制中","勾勒中","渲染中","合成中","调和中","编曲中","烹制中","施工中","酿造中","发酵中","煎熬中","折腾中","捣鼓中","鼓捣中","腾挪中","筹备中","蓄力中"],h9=["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 E9($,Q,Y=!1){let[J,Z]=sZ("");return tZ(()=>{if(Q){Z("等待用户确认...");return}if(!$){Z("");return}if(Y)return;let X=()=>{if(Math.random()<0.25){let U=Math.floor(Math.random()*h9.length);return h9[U]}let G=Math.floor(Math.random()*j9.length);return j9[G]};Z(X());let K=setInterval(()=>{Z(X())},eZ);return()=>{clearInterval(K)}},[$,Q,Y]),J}function m9($,Q=!1,Y=!1){let[J,Z]=g9(0),[X,K]=g9(null),q=E9($,Q,Y);return $5(()=>{if(!$){Z(0),K(null);return}if(Y)return;if(X===null)K(Date.now());let G=setInterval(()=>{if(X!==null){let U=Math.floor((Date.now()-X)/1000);Z(U)}},1000);return()=>{clearInterval(G)}},[$,X,Y]),{currentPhrase:q,elapsedTime:J}}import{jsxDEV as Q1,Fragment as X5}from"react/jsx-dev-runtime";var DQ=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"],Z5=80;function r$($){if($<60)return`${$}s`;let Q=Math.floor($/60),Y=$%60;return`${Q}m ${Y}s`}var p9=Q5.memo(({message:$,paused:Q=!1})=>{let Y=s1(),J=R8(),Z=G4(),X=K4(),K=q4(),q=U4(),G=O4(),U=Y||!J,[W,O]=Y5(0),H=A0(),w=E$()>=Z5,{currentPhrase:_,elapsedTime:F}=m9(U,!1,Q);if(J5(()=>{if(!U||Q){O(0);return}let P=setInterval(()=>{O((A)=>(A+1)%DQ.length)},150);return()=>clearInterval(P)},[U,Q]),!U)return null;let C=K?.mode==="bounded_foreground"?`Provider 暂时不可用,正在有界恢复 (${K.attempt}/${K.maxRetries}),剩余约 ${r$(Math.max(0,Math.ceil((K.recoveryRemainingMs??0)/1000)))}`:K?.phase==="scheduled"?`Provider 暂时不可用,${K.attempt}/${K.maxRetries} 次重试将在 ${Math.max(0,Math.ceil((K.delayMs??0)/1000))}s 后开始`:K?.phase==="attempt"?`正在重试 Provider (${K.attempt}/${K.maxRetries})`:null,N=X?X.phase==="probe"?"Provider 正在执行唯一恢复探测":`Provider 故障已隔离,等待恢复探测${X.retryAfterMs!==void 0?` (${r$(Math.max(0,Math.ceil(X.retryAfterMs/1000)))})`:""}${X.recoveryRemainingMs!==void 0?`,剩余预算 ${r$(Math.max(0,Math.ceil(X.recoveryRemainingMs/1000)))}`:""}`:null,S=Z?`等待 Provider 容量(${Z.scope},队列 ${Z.queuePosition}/${Math.max(Z.queueDepth,Z.queuePosition)},已等待 ${r$(Math.max(0,Math.ceil(Z.waitMs/1000)))})`:null,R=q?q.outputStarted?`Provider 流已暂停 ${Math.ceil(q.durationMs/1000)}s,仍在等待(空闲超时上限 ${Math.ceil(q.timeoutMs/1000)}s)`:`Provider 尚未返回流数据,已等待 ${Math.ceil(q.durationMs/1000)}s(空闲超时上限 ${Math.ceil(q.timeoutMs/1000)}s)`:null,f=(G?.phase==="detected"?`检测到 ${G.toolName} 连续 ${G.runLength} 次无进展,正在要求 Agent 切换策略`:G?.phase==="halted"?`已停止 ${G.toolName} 空转循环`:null)||N||S||C||R||$||_||"正在思考中...";if(w)return Q1(_2,{paddingX:2,paddingBottom:1,flexDirection:"row",gap:1,children:[Q1(R1,{color:H.colors.warning,bold:!0,children:DQ[W]},void 0,!1,void 0,this),Q1(R1,{color:H.colors.text.primary,children:f},void 0,!1,void 0,this),F>0&&Q1(X5,{children:[Q1(R1,{color:H.colors.muted,children:"|"},void 0,!1,void 0,this),Q1(R1,{color:H.colors.info,children:["已用时: ",r$(F)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Q1(R1,{color:H.colors.muted,children:"|"},void 0,!1,void 0,this),Q1(R1,{color:H.colors.secondary,children:"Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return Q1(_2,{paddingX:2,paddingBottom:1,flexDirection:"column",children:[Q1(_2,{flexDirection:"row",gap:1,children:[Q1(R1,{color:H.colors.warning,bold:!0,children:DQ[W]},void 0,!1,void 0,this),Q1(R1,{color:H.colors.text.primary,children:f},void 0,!1,void 0,this)]},void 0,!0,void 0,this),F>0&&Q1(_2,{marginLeft:2,flexDirection:"row",gap:1,children:[Q1(R1,{color:H.colors.info,children:["已用时: ",r$(F)]},void 0,!0,void 0,this),Q1(R1,{color:H.colors.muted,children:"|"},void 0,!1,void 0,this),Q1(R1,{color:H.colors.secondary,children:"Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});import{Box as H2,Text as D0,useInput as K5,useStdout as G5}from"ink";import q5 from"ink-text-input";import U5,{useCallback as N2,useEffect as O5,useMemo as z5,useState as b$}from"react";import{jsxDEV as F0}from"react/jsx-dev-runtime";var l9=U5.memo(({details:$,onComplete:Q})=>{let{stdout:Y}=G5(),J=Y.columns||80,Z=e0()==="confirmation-prompt",X=S0(!1),K=$.fields??[],[q,G]=b$("field"),[U,W]=b$(0),[O,H]=b$(()=>c9($)),[z,w]=b$(""),[_,F]=b$(0),[C,N]=b$([]),[S,R]=b$(),B=K[U],f=z5(()=>_5(B),[B]);O5(()=>{if(!B)return;let L=O[B.name];w(typeof L==="string"||typeof L==="number"?String(L):""),N(Array.isArray(L)?[...L]:[]);let k=f.findIndex((g)=>g.value===String(L));F(k>=0?k:0),R(void 0)},[O,B,f]);let P=N2((L)=>{if(H(L),U<K.length-1){W((k)=>k+1);return}G("review")},[U,K.length]),A=N2((L)=>{if(!B)return;let k={...O};if(L===void 0)delete k[B.name];else k[B.name]=L;P(k)},[O,B,P]),T=N2((L)=>{if(!B)return;try{A(x9(B,L))}catch(k){R(k instanceof Error?k.message:String(k))}},[B,A]),M=N2(()=>{try{let L=u9($,{action:"accept",content:O});Q({action:L.action,...L.content?{content:L.content}:{}})}catch(L){R(L instanceof Error?L.message:String(L))}},[O,$,Q]);if(K5((L,k)=>{if(k.ctrl&&L==="c"||k.meta&&L==="c"){X();return}if(k.escape){Q({action:"cancel"});return}if($.mode==="url"){if(L.toLowerCase()==="y")Q({action:"accept"},!0);else if(L.toLowerCase()==="n")Q({action:"decline"});return}if(q==="review"){if(L.toLowerCase()==="y"||k.return)M();else if(L.toLowerCase()==="e")W(0),G("field");else if(L.toLowerCase()==="d")Q({action:"decline"});return}if(!B){if(k.return)M();return}if(VQ(B))return;if(L.toLowerCase()==="d"){Q({action:"decline"});return}if(k.upArrow){F((g)=>g>0?g-1:Math.max(f.length-1,0));return}if(k.downArrow||k.tab){F((g)=>g<f.length-1?g+1:0);return}if(L===" "&&B.type==="multi-select"){let g=f[_];if(g)N((o)=>o.includes(g.value)?o.filter((l)=>l!==g.value):[...o,g.value]);return}if(k.return)if(B.type==="multi-select")A(C);else{let g=f[_];if(g)A(g.typedValue)}},{isActive:Z}),$.mode==="url")return F0(F2,{width:J,color:"yellow",children:[F0(D0,{bold:!0,color:"yellow",children:"MCP external authorization"},void 0,!1,void 0,this),F0(D0,{children:$.message},void 0,!1,void 0,this),F0(D0,{color:"yellow",children:['Only continue if you trust MCP server "',$.serverName,'".']},void 0,!0,void 0,this),F0(D0,{children:["Domain: ",F0(D0,{color:"cyan",children:$.domain},void 0,!1,void 0,this)]},void 0,!0,void 0,this),F0(D0,{wrap:"wrap",children:["URL: ",F0(D0,{color:"cyan",children:$.url},void 0,!1,void 0,this)]},void 0,!0,void 0,this),F0(D0,{color:"gray",children:"[Y] Open URL · [N] Decline · Esc Cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(q==="review")return F0(F2,{width:J,color:"green",children:[F0(D0,{bold:!0,color:"green",children:"Review MCP form response"},void 0,!1,void 0,this),F0(D0,{children:$.message},void 0,!1,void 0,this),K.map((L)=>F0(D0,{children:[L.title,": ",F5(O[L.name])]},L.name,!0,void 0,this)),S&&F0(D0,{color:"red",children:S},void 0,!1,void 0,this),F0(D0,{color:"gray",children:"[Y] Submit · [E] Edit · [D] Decline · Esc Cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(!B)return F0(F2,{width:J,color:"cyan",children:[F0(D0,{children:$.message},void 0,!1,void 0,this),F0(D0,{color:"gray",children:"This form has no fields."},void 0,!1,void 0,this),F0(D0,{color:"gray",children:"Press Enter to submit · [D] Decline · Esc Cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return F0(F2,{width:J,color:"cyan",children:[F0(D0,{bold:!0,color:"cyan",children:["MCP input requested by ",$.serverName]},void 0,!0,void 0,this),F0(D0,{children:$.message},void 0,!1,void 0,this),F0(H2,{flexDirection:"column",marginTop:1,children:[F0(D0,{bold:!0,children:[B.title,B.required?" *":""]},void 0,!0,void 0,this),B.description&&F0(D0,{color:"gray",children:B.description},void 0,!1,void 0,this),F0(D0,{color:"gray",children:N5(B)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),VQ(B)?F0(H2,{children:[F0(D0,{color:"cyan",children:"> "},void 0,!1,void 0,this),F0(q5,{value:z,onChange:w,onSubmit:T,focus:Z,placeholder:B.defaultValue===void 0?B.required?"Required":"Optional":String(B.defaultValue)},void 0,!1,void 0,this)]},void 0,!0,void 0,this):F0(H2,{flexDirection:"column",children:f.map((L,k)=>{let g=B.type==="multi-select"&&C.includes(L.value);return F0(D0,{color:_===k?"yellow":void 0,children:[_===k?"> ":" ",B.type==="multi-select"?g?"(*) ":"( ) ":"",L.label]},L.value,!0,void 0,this)})},void 0,!1,void 0,this),S&&F0(D0,{color:"red",children:S},void 0,!1,void 0,this),F0(D0,{color:"gray",children:[VQ(B)?"Enter to continue":B.type==="multi-select"?"Space to toggle · Enter to continue":"Up/Down to select · Enter to continue"," · [D] Decline · Esc Cancel"]},void 0,!0,void 0,this),F0(D0,{color:"gray",children:["Field ",U+1," of ",K.length]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});function F2({children:$,width:Q,color:Y}){return F0(H2,{flexDirection:"column",gap:1,borderStyle:"round",borderColor:Y,padding:1,width:Math.min(Q-4,88),children:$},void 0,!1,void 0,this)}function VQ($){return $.type==="string"||$.type==="number"||$.type==="integer"}function _5($){if(!$)return[];if($.type==="boolean")return[{value:"true",label:"Yes",typedValue:!0},{value:"false",label:"No",typedValue:!1}];return($.options??[]).map((Q)=>({...Q,typedValue:Q.value}))}function N5($){let Q=[];if($.format)Q.push(`format: ${$.format}`);if($.minimum!==void 0)Q.push(`min: ${$.minimum}`);if($.maximum!==void 0)Q.push(`max: ${$.maximum}`);if($.minLength!==void 0)Q.push(`min length: ${$.minLength}`);if($.maxLength!==void 0)Q.push(`max length: ${$.maxLength}`);if($.minItems!==void 0)Q.push(`min selections: ${$.minItems}`);if($.maxItems!==void 0)Q.push(`max selections: ${$.maxItems}`);return Q.join(" · ")}function F5($){if($===void 0)return"(omitted)";if(Array.isArray($))return $.join(", ")||"(none)";return String($)}import w2 from"ansi-escapes";import{Box as Z$,Static as f5,useStdout as k5}from"ink";import S5,{useEffect as l1,useMemo as cQ,useRef as X$,useState as xQ}from"react";import{useStdout as H5}from"ink";import{debounce as W5}from"lodash-es";import{useEffect as L5,useState as B5}from"react";function d9($=200){let{stdout:Q}=H5(),[Y,J]=B5(Q.rows||24);return L5(()=>{let Z=W5(()=>{J(Q.rows||24)},$);return Z(),Q.on("resize",Z),()=>{Q.off("resize",Z),Z.cancel()}},[Q,$]),Y}import A$ from"chalk";import w5 from"string-width";var N0={active:!1,renderedLineCount:0,lastRenderedLines:[],terminalWidth:process.stdout.columns||80,terminalHeight:process.stdout.rows||24,prefixIndent:4,isFirstRender:!0},L2="\x1B",jQ=`${L2}[2K`,W2=($)=>$>0?`${L2}[${$}A`:"",r9=`${L2}[?25l`,a9=`${L2}[?25h`;function i9($,Q){N0.active=!0,N0.renderedLineCount=0,N0.lastRenderedLines=[],N0.terminalWidth=$,N0.terminalHeight=Q,N0.isFirstRender=!0}function o9($,Q){N0.terminalWidth=$,N0.terminalHeight=Q}function n9($,Q,Y,J){if(!N0.active)return;let Z=8,X=Math.max(1,N0.terminalHeight-Z),K=[],q=r0.getTheme(),G=" ".repeat(N0.prefixIndent),U=A$.dim.hex(q.colors.border.light);if(Q>0)K.push(`${G}${A$.dim.hex(q.colors.text.muted)(`^ ${Q} lines above (streaming...)`)}`);let W=Y==="code",O=Y==="diff",H="",z=$;if(W&&$.length>0)H=$[0].match(/^```(\w+)?/)?.[1]||"",z=$.slice(1);else if(O&&$.length>0&&$[0]==="<<<DIFF>>>")z=$.slice(1);let w=z.slice(-X);if(W&&Q===0){let F=H?` ${A$.hex(q.colors.text.secondary)(H)}`:"";K.push(`${G}${U("╭─")}${F}`)}for(let F=0;F<w.length;F++){let C=w[F],N=G;if(F===0&&!J&&N0.isFirstRender&&!W&&!O)N=A$.bold.hex(q.colors.success)("• ")+" ",N0.isFirstRender=!1;let S=W?4:0,R=N0.terminalWidth-N0.prefixIndent-2-S,B=C;if(w5(C)>R)B=C.slice(0,R);if(W)K.push(`${G}${U("│")} ${B}`);else if(O){let f=B;if(f.startsWith("+"))K.push(`${N}${A$.green(B)}`);else if(f.startsWith("-"))K.push(`${N}${A$.red(B)}`);else if(f.startsWith("@@"))K.push(`${N}${A$.dim(B)}`);else K.push(`${N}${B}`)}else K.push(`${N}${B}`);if(F===0&&!J&&N0.isFirstRender)N0.isFirstRender=!1}let _=[];if(_.push(r9),N0.renderedLineCount>0)_.push(W2(N0.renderedLineCount)),_.push("\r");for(let F=0;F<K.length;F++){let C=K[F],N=N0.lastRenderedLines[F];if(C!==N)_.push(jQ),_.push(C);if(F<K.length-1)_.push(`
|
|
146
|
+
`))},a=()=>{K("command")},I=()=>{if(!_.trim()){N("Command cannot be empty");return}N(null),K("location")},y=async()=>{R(!0),N(null);try{let v=z1.getInstance(),b=await import("node:fs/promises"),V=await import("node:path"),p=await import("node:os"),j={matcher:z.trim()?{tools:z.trim()}:{},hooks:[{type:"command",command:_.trim()}]},h;switch(T.location){case"local":h=V.join($,".blade","settings.local.json");break;case"project":h=V.join($,".blade","settings.json");break;case"user":h=V.join(p.homedir(),".blade","settings.json");break}await b.mkdir(V.dirname(h),{recursive:!0});let E={};try{let k0=await b.readFile(h,"utf-8");E=JSON.parse(k0)}catch{}let Z0=E.hooks||{},J0=Z0[A.event]||[],w0={...Z0,enabled:!0,[A.event]:[...J0,j]};if(E.hooks=w0,await b.writeFile(h,JSON.stringify(E,null,2),"utf-8"),await v.reloadConfig($),J)J({event:A.event,matcher:z.trim(),command:_.trim()});Y()}catch(v){N(`Failed to save hook: ${v instanceof Error?v.message:"Unknown error"}`),R(!1)}};return c(L0,{flexDirection:"column",padding:1,children:[c(L0,{marginBottom:1,children:c(G0,{bold:!0,color:Z.colors.success,children:"Hooks Manager"},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(L0,{marginBottom:1,children:c(G0,{color:Z.colors.warning,children:"[WARN] Configured hooks run only after this exact project digest is trusted. Function hooks registered by application code are exempt."},void 0,!1,void 0,this)},void 0,!1,void 0,this),B&&c(L0,{flexDirection:"column",marginBottom:1,children:[c(G0,{children:B},void 0,!1,void 0,this),c(L0,{marginTop:1,children:c(G0,{color:Z.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),X==="action"&&!B&&c(L0,{flexDirection:"column",children:[c(L0,{flexDirection:"column",marginTop:1,children:_8.map((v,b)=>c(L0,{children:[c(G0,{color:b===q?Z.colors.primary:void 0,bold:b===q,children:[b===q?"> ":" ",v.action]},void 0,!0,void 0,this),c(G0,{color:Z.colors.muted,children:[" - ",v.description]},void 0,!0,void 0,this)]},v.action,!0,void 0,this))},void 0,!1,void 0,this),c(L0,{marginTop:1,children:c(G0,{color:Z.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),X==="event"&&c(L0,{flexDirection:"column",children:[c(G0,{bold:!0,children:"Select Event:"},void 0,!1,void 0,this),c(L0,{flexDirection:"column",marginTop:1,children:q2.map((v,b)=>c(L0,{children:[c(G0,{color:b===U?Z.colors.primary:void 0,bold:b===U,children:[b===U?"> ":" ",v.event]},void 0,!0,void 0,this),c(G0,{color:Z.colors.muted,children:[" - ",v.description]},void 0,!0,void 0,this)]},v.event,!0,void 0,this))},void 0,!1,void 0,this),c(L0,{marginTop:1,children:c(G0,{color:Z.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),X!=="event"&&c(L0,{marginBottom:1,children:c(G0,{children:["Event:"," ",c(G0,{bold:!0,color:Z.colors.primary,children:A.event},void 0,!1,void 0,this),c(G0,{color:Z.colors.muted,children:[" - ",A.description]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),(X==="matcher"||X==="command"||X==="confirm")&&c(L0,{flexDirection:"column",marginBottom:1,children:[c(G0,{color:Z.colors.muted,children:"Input to command is JSON of tool call arguments."},void 0,!1,void 0,this),c(G0,{color:Z.colors.muted,children:"Exit code 0 - stdout/stderr not shown"},void 0,!1,void 0,this),c(G0,{color:Z.colors.muted,children:"Exit code 2 - show stderr to model and block tool call"},void 0,!1,void 0,this),c(G0,{color:Z.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),X==="matcher"&&c(L0,{flexDirection:"column",children:[c(L0,{children:[c(G0,{bold:!0,children:"Matcher: "},void 0,!1,void 0,this),c(H9,{value:z,onChange:w,onSubmit:a,placeholder:"e.g., Read, Bash, Edit|Write (empty = all tools)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),c(L0,{marginTop:1,children:c(G0,{color:Z.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),c(L0,{marginTop:1,children:c(G0,{color:Z.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),(X==="command"||X==="confirm")&&c(L0,{marginBottom:1,children:c(G0,{children:["Matcher: ",c(G0,{bold:!0,children:z||"(all tools)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),X==="command"&&c(L0,{flexDirection:"column",children:[c(L0,{children:c(G0,{bold:!0,children:"Command: "},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(L0,{borderStyle:"single",borderColor:Z.colors.border.light,paddingX:1,marginTop:1,children:c(H9,{value:_,onChange:F,onSubmit:I,placeholder:"Enter shell command..."},void 0,!1,void 0,this)},void 0,!1,void 0,this),c(L0,{flexDirection:"column",marginTop:1,children:[c(G0,{bold:!0,children:"Examples:"},void 0,!1,void 0,this),vZ.map((v,b)=>c(G0,{color:Z.colors.muted,children:["• ",v]},b,!0,void 0,this))]},void 0,!0,void 0,this),c(L0,{marginTop:1,children:c(G0,{color:Z.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),X==="location"&&c(L0,{flexDirection:"column",children:[c(L0,{flexDirection:"column",borderStyle:"round",borderColor:Z.colors.border.light,paddingX:2,paddingY:1,marginBottom:1,children:[c(G0,{bold:!0,color:Z.colors.primary,children:"Save hook configuration"},void 0,!1,void 0,this),c(G0,{children:" "},void 0,!1,void 0,this),c(G0,{children:[" ","Event: ",A.event," - ",A.description]},void 0,!0,void 0,this),c(G0,{children:[" Matcher: ",z||"(all)"]},void 0,!0,void 0,this),c(G0,{children:[" Command: ",_]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),c(G0,{bold:!0,children:"Where should this hook be saved?"},void 0,!1,void 0,this),c(L0,{flexDirection:"column",marginTop:1,children:G2.map((v,b)=>c(L0,{children:[c(G0,{color:b===O?Z.colors.primary:void 0,bold:b===O,children:[b===O?"> ":" ",b+1,". ",v.name]},void 0,!0,void 0,this),c(G0,{color:Z.colors.muted,children:[" ",v.description]},void 0,!0,void 0,this)]},v.location,!0,void 0,this))},void 0,!1,void 0,this),c(L0,{marginTop:1,children:c(G0,{color:Z.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),X==="confirm"&&c(L0,{flexDirection:"column",children:[c(L0,{flexDirection:"column",borderStyle:"round",borderColor:Z.colors.success,paddingX:2,paddingY:1,children:[c(G0,{bold:!0,children:["Saving hook to ",T.description,"..."]},void 0,!0,void 0,this),c(G0,{children:" "},void 0,!1,void 0,this),c(G0,{children:["Event: ",A.event]},void 0,!0,void 0,this),c(G0,{children:["Matcher: ",z||"(all tools)"]},void 0,!0,void 0,this),c(G0,{children:["Command: ",_]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),c(L0,{marginTop:1,children:c(G0,{color:Z.colors.muted,children:S?"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),C&&c(L0,{marginTop:1,children:c(G0,{color:Z.colors.error,children:C},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as V9}from"ahooks";import{Box as oZ,Text as nZ}from"ink";import tZ from"react";import{useMemoizedFn as O2}from"ahooks";import w$ from"chalk";import{Text as lZ,useInput as dZ}from"ink";import{useEffect as S9,useRef as z2}from"react";var U2={TIMEOUT_MS:100,RAPID_INPUT_THRESHOLD_MS:150,LARGE_INPUT_THRESHOLD:300,MEDIUM_SIZE_MULTI_CHUNK_THRESHOLD:200};var B$="\x1B",DZ=`${B$}[200~`,VZ=`${B$}[201~`,jZ="[200~",hZ="[201~",EZ=[`${B$}[I`,`${B$}[O`,"[I","[O"],w9=`${B$}[?2004h`,b9=`${B$}[?2004l`,TQ=`${B$}[?1004l`,gZ=[DZ,jZ],mZ=[VZ,hZ];function A9(){return{pasteBuffer:null,pasteOverflowed:!1}}function L9($,Q){let Y;for(let J of Q){let Z=$.indexOf(J);if(Z===-1)continue;if(!Y||Z<Y.index||Z===Y.index&&J.length>Y.marker.length)Y={index:Z,marker:J}}return Y}function B9($){return EZ.some((Q)=>$===Q)}function P9($,Q){let Y=Q,J=$.pasteBuffer,Z=$.pasteOverflowed,X=J!==null,K=[];while(Y.length>0){if(J!==null){let U=L9(Y,mZ);if(!U){if(J.length+Y.length>IQ)J="",Z=!0;else if(!Z)J+=Y;Y="";break}if(J.length+U.index>IQ)Z=!0;else if(!Z)J+=Y.slice(0,U.index),K.push({kind:"paste",text:J});J=null,Z=!1,X=!0,Y=Y.slice(U.index+U.marker.length);continue}let q=L9(Y,gZ);if(!q){if(B9(Y))X=!0;else K.push({kind:"text",text:Y});Y="";break}let G=Y.slice(0,q.index);if(G&&!B9(G))K.push({kind:"text",text:G});J="",Z=!1,X=!0,Y=Y.slice(q.index+q.marker.length)}if(Q.length===0&&J!==null)X=!0;return{handled:X,state:{pasteBuffer:J,pasteOverflowed:Z},segments:K}}import{execSync as d$}from"node:child_process";import{existsSync as pZ,readFileSync as fQ}from"node:fs";import{basename as y9,isAbsolute as cZ}from"node:path";function R9($){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 M9(){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 xZ(){let{commands:$}=M9();try{return d$($.getPath,{encoding:"utf-8"}).trim()}catch(Q){return console.error("Failed to get clipboard path:",Q),null}}function C9($){if($.startsWith('"')&&$.endsWith('"')||$.startsWith("'")&&$.endsWith("'"))return $.slice(1,-1);return $}function I9($){if(process.platform==="win32")return $;let Q="__DOUBLE_BACKSLASH__";return $.replace(/\\\\/g,Q).replace(/\\(.)/g,"$1").replace(new RegExp(Q,"g"),"\\")}function kQ($){let Q=C9($.trim()),Y=I9(Q);return/\.(png|jpe?g|gif|webp)$/i.test(Y)}function uZ($){let Q=C9($.trim()),Y=I9(Q);if(kQ(Y))return Y;return null}async function T9($){let Q=uZ($);if(!Q)return null;let Y;try{if(cZ(Q))Y=fQ(Q);else{let K=xZ();if(K&&Q===y9(K))Y=fQ(K);else return null}}catch(K){return console.error("Failed to read image file:",K),null}let J=Y.toString("base64"),Z=R9(J),X=y9(Q);return{path:Q,base64:J,mediaType:Z,filename:X}}async function f9(){let $=process.platform,Q={darwin:"pbpaste",linux:"xclip -selection clipboard -o || wl-paste",win32:'powershell -Command "Get-Clipboard"'},Y=Q[$]||Q.linux;try{return d$(Y,{encoding:"utf-8"})||null}catch{return null}}async function k9(){let{commands:$,screenshotPath:Q}=M9();try{if(d$($.checkImage,{stdio:"ignore"}),d$($.saveImage(Q),{stdio:"ignore"}),!pZ(Q))return null;let J=fQ(Q).toString("base64"),Z=R9(J);return d$($.deleteFile(Q),{stdio:"ignore"}),{base64:J,mediaType:Z}}catch(Y){try{d$($.deleteFile(Q),{stdio:"ignore"})}catch{}return null}}import{jsxDEV as iZ}from"react/jsx-dev-runtime";var rZ=/\r\n/g,aZ=/\r/g;function SQ($){if(!$.includes("\r"))return $;return $.replace(rZ,`
|
|
147
|
+
`).replace(aZ,`
|
|
148
|
+
`)}function v9($,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 D9({value:$,placeholder:Q="",focus:Y=!0,onChange:J,cursorPosition:Z,onChangeCursorPosition:X,onPaste:K,onImagePaste:q,disabledKeys:G=[]}){let U=z2(A9()),W=z2($),O=z2(Z),H=z2(null);S9(()=>{W.current=$,O.current=Z},[$,Z]),S9(()=>{if(Z>$.length)X($.length)},[$,Z,X]);let z=O2((R,B)=>{let f=W.current,P=O.current;if(W.current=R,O.current=B,R!==f)J(R);if(B!==P)X(B)}),w=O2((R)=>{if(!R)return;let{newValue:B,newCursorPosition:f}=v9(SQ(R),W.current,O.current);z(B,f)}),_=O2(async(R)=>{let B=SQ(R);if(!B)return;if(q&&kQ(B))try{let P=await T9(B);if(P){let A=await q(P.base64,P.mediaType,P.filename);if(A?.prompt)w(A.prompt);return}}catch(P){console.error("Failed to process image path:",P)}if((B.length>U2.LARGE_INPUT_THRESHOLD||B.includes(`
|
|
149
|
+
`))&&K){let P=await K(B);if(P?.prompt){w(P.prompt);return}}w(B)}),F=O2((R)=>{let B=H.current;if(!B){try{let P=R();if(!P)return;let A=P.catch(()=>{return});H.current=A,A.finally(()=>{if(H.current===A)H.current=null})}catch{}return}let f=B.then(R).then(()=>{return}).catch(()=>{return});H.current=f,f.finally(()=>{if(H.current===f)H.current=null})});dZ((R,B)=>{F(()=>{let f=SQ(R),P=P9(U.current,f);if(U.current=P.state,P.handled)return(async()=>{for(let g of P.segments)if(g.kind==="paste")await _(g.text);else w(g.text)})();if(G.some((g)=>B[g])||B.ctrl&&R==="c"||B.ctrl&&R==="l"||B.ctrl&&R==="t"||B.ctrl&&R==="o"||B.meta&&R==="l"||B.meta&&R==="t"||B.meta&&R==="o"||B.shift&&B.tab||f==="?"&&W.current==="")return;let T=W.current,M=O.current,L=M,k=T;if(B.leftArrow)L--;else if(B.rightArrow)L++;else if(B.backspace||B.delete){if(R===""){if(M>0)k=T.slice(0,M-1)+T.slice(M,T.length),L--}else if(M<T.length)k=T.slice(0,M)+T.slice(M+1,T.length)}else if(B.ctrl&&f==="a")L=0;else if(B.ctrl&&f==="e")L=T.length;else if(B.ctrl&&f==="k")k=T.slice(0,M);else if(B.ctrl&&f==="u")k=T.slice(M),L=0;else if(B.ctrl&&f==="w"){let o=T.slice(0,M).match(/\s*\S+\s*$/);if(o){let l=o[0].length;k=T.slice(0,M-l)+T.slice(M),L-=l}}else if(B.ctrl&&f==="v"){let g=process.platform==="darwin";return(async()=>{if(q){let l=await k9();if(l){let a=await q(l.base64,l.mediaType,"clipboard.png");if(a?.prompt)w(a.prompt);return}}if(g)return;let o=await f9();if(o)await _(o)})()}else if(B.pageUp)L=0;else if(B.pageDown)L=T.length;else if(f===`
|
|
150
|
+
`&&(B.shift||B.meta)){let{newValue:g,newCursorPosition:o}=v9(f,T,M);z(g,o);return}else if(!B.ctrl&&!B.meta){if(K&&(f.length>U2.LARGE_INPUT_THRESHOLD||f.includes(`
|
|
151
|
+
`)))return _(f);k=T.slice(0,M)+f+T.slice(M,T.length),L+=f.length}if(L<0)L=0;if(L>k.length)L=k.length;z(k,L)})},{isActive:Y});let C=Y,N=$,S=Q?w$.grey(Q):void 0;if(C)if(S=Q.length>0?w$.inverse(Q[0])+w$.grey(Q.slice(1)):w$.inverse(" "),$.length===0)N=w$.inverse(" ");else{N="";for(let R=0;R<$.length;R++)if(R===Z&&Z<$.length)N+=w$.inverse($[R]);else N+=$[R];if(Z>=$.length)N+=w$.inverse(" ")}return iZ(lZ,{children:Q?$.length>0?N:S:N},void 0,!1,void 0,this)}import{jsxDEV as vQ}from"react/jsx-dev-runtime";var j9=tZ.memo(({input:$,cursorPosition:Q,onChange:Y,onChangeCursorPosition:J,onAddPasteMapping:Z,onAddImagePasteMapping:X})=>{let q=e0()==="main-input",G=$.trimStart().startsWith("!"),U=V9((O)=>{let H=O.split(`
|
|
152
|
+
`).length,z=O.length,w=500,_=10;if(z>500||H>10){let F=Z(O),C=O.slice(0,30).replace(/\n/g," "),N=`${z} chars, ${H} lines: ${C}...`;return{prompt:`${i8(F)}${N}${l2()}`}}return{}}),W=V9(async(O,H,z)=>{try{let w=X(O,H);return{prompt:`${i8(w)}[Image #${w}]${l2()}`}}catch(w){return console.error("[Image Paste] Failed to process image:",w),{prompt:`[Image paste failed: ${w instanceof Error?w.message:"Unknown error"}] `}}});return vQ(oZ,{flexDirection:"row",width:"100%",paddingX:2,paddingY:0,flexShrink:0,flexGrow:0,overflow:"hidden",borderStyle:"round",borderColor:G?"yellow":"gray",children:[vQ(nZ,{color:G?"yellow":"blue",bold:!0,children:G?"$ ":"> "},void 0,!1,void 0,this),vQ(D9,{value:$,cursorPosition:Q,onChange:Y,onChangeCursorPosition:J,onPaste:U,onImagePaste:W,placeholder:" 输入命令...",focus:q,disabledKeys:["upArrow","downArrow","tab","return","escape"]},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{Box as _2,Text as R1}from"ink";import J5,{useEffect as Y5,useState as Z5}from"react";import{useEffect as Q5,useState as m9}from"react";import{useEffect as sZ,useState as eZ}from"react";var $5=15000,h9=["思考中","构思中","推理中","琢磨中","分析中","斟酌中","酝酿中","推敲中","揣摩中","审视中","处理中","编排中","打磨中","编织中","拼装中","调配中","组装中","搭建中","铸造中","雕琢中","搜寻中","梳理中","排查中","勘探中","钻研中","翻阅中","遍历中","扫描中","检索中","追踪中","计算中","编译中","解析中","运算中","推演中","迭代中","收敛中","演绎中","归纳中","求解中","生成中","编写中","起草中","绘制中","勾勒中","渲染中","合成中","调和中","编曲中","烹制中","施工中","酿造中","发酵中","煎熬中","折腾中","捣鼓中","鼓捣中","腾挪中","筹备中","蓄力中"],E9=["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 g9($,Q,Y=!1){let[J,Z]=eZ("");return sZ(()=>{if(Q){Z("等待用户确认...");return}if(!$){Z("");return}if(Y)return;let X=()=>{if(Math.random()<0.25){let U=Math.floor(Math.random()*E9.length);return E9[U]}let G=Math.floor(Math.random()*h9.length);return h9[G]};Z(X());let K=setInterval(()=>{Z(X())},$5);return()=>{clearInterval(K)}},[$,Q,Y]),J}function p9($,Q=!1,Y=!1){let[J,Z]=m9(0),[X,K]=m9(null),q=g9($,Q,Y);return Q5(()=>{if(!$){Z(0),K(null);return}if(Y)return;if(X===null)K(Date.now());let G=setInterval(()=>{if(X!==null){let U=Math.floor((Date.now()-X)/1000);Z(U)}},1000);return()=>{clearInterval(G)}},[$,X,Y]),{currentPhrase:q,elapsedTime:J}}import{jsxDEV as Q1,Fragment as K5}from"react/jsx-dev-runtime";var DQ=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"],X5=80;function r$($){if($<60)return`${$}s`;let Q=Math.floor($/60),Y=$%60;return`${Q}m ${Y}s`}var c9=J5.memo(({message:$,paused:Q=!1})=>{let Y=s1(),J=R8(),Z=G4(),X=K4(),K=q4(),q=U4(),G=O4(),U=Y||!J,[W,O]=Z5(0),H=A0(),w=E$()>=X5,{currentPhrase:_,elapsedTime:F}=p9(U,!1,Q);if(Y5(()=>{if(!U||Q){O(0);return}let P=setInterval(()=>{O((A)=>(A+1)%DQ.length)},150);return()=>clearInterval(P)},[U,Q]),!U)return null;let C=K?.mode==="bounded_foreground"?`Provider 暂时不可用,正在有界恢复 (${K.attempt}/${K.maxRetries}),剩余约 ${r$(Math.max(0,Math.ceil((K.recoveryRemainingMs??0)/1000)))}`:K?.phase==="scheduled"?`Provider 暂时不可用,${K.attempt}/${K.maxRetries} 次重试将在 ${Math.max(0,Math.ceil((K.delayMs??0)/1000))}s 后开始`:K?.phase==="attempt"?`正在重试 Provider (${K.attempt}/${K.maxRetries})`:null,N=X?X.phase==="probe"?"Provider 正在执行唯一恢复探测":`Provider 故障已隔离,等待恢复探测${X.retryAfterMs!==void 0?` (${r$(Math.max(0,Math.ceil(X.retryAfterMs/1000)))})`:""}${X.recoveryRemainingMs!==void 0?`,剩余预算 ${r$(Math.max(0,Math.ceil(X.recoveryRemainingMs/1000)))}`:""}`:null,S=Z?`等待 Provider 容量(${Z.scope},队列 ${Z.queuePosition}/${Math.max(Z.queueDepth,Z.queuePosition)},已等待 ${r$(Math.max(0,Math.ceil(Z.waitMs/1000)))})`:null,R=q?q.outputStarted?`Provider 流已暂停 ${Math.ceil(q.durationMs/1000)}s,仍在等待(空闲超时上限 ${Math.ceil(q.timeoutMs/1000)}s)`:`Provider 尚未返回流数据,已等待 ${Math.ceil(q.durationMs/1000)}s(空闲超时上限 ${Math.ceil(q.timeoutMs/1000)}s)`:null,f=(G?.phase==="detected"?`检测到 ${G.toolName} 连续 ${G.runLength} 次无进展,正在要求 Agent 切换策略`:G?.phase==="halted"?`已停止 ${G.toolName} 空转循环`:null)||N||S||C||R||$||_||"正在思考中...";if(w)return Q1(_2,{paddingX:2,paddingBottom:1,flexDirection:"row",gap:1,children:[Q1(R1,{color:H.colors.warning,bold:!0,children:DQ[W]},void 0,!1,void 0,this),Q1(R1,{color:H.colors.text.primary,children:f},void 0,!1,void 0,this),F>0&&Q1(K5,{children:[Q1(R1,{color:H.colors.muted,children:"|"},void 0,!1,void 0,this),Q1(R1,{color:H.colors.info,children:["已用时: ",r$(F)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Q1(R1,{color:H.colors.muted,children:"|"},void 0,!1,void 0,this),Q1(R1,{color:H.colors.secondary,children:"Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return Q1(_2,{paddingX:2,paddingBottom:1,flexDirection:"column",children:[Q1(_2,{flexDirection:"row",gap:1,children:[Q1(R1,{color:H.colors.warning,bold:!0,children:DQ[W]},void 0,!1,void 0,this),Q1(R1,{color:H.colors.text.primary,children:f},void 0,!1,void 0,this)]},void 0,!0,void 0,this),F>0&&Q1(_2,{marginLeft:2,flexDirection:"row",gap:1,children:[Q1(R1,{color:H.colors.info,children:["已用时: ",r$(F)]},void 0,!0,void 0,this),Q1(R1,{color:H.colors.muted,children:"|"},void 0,!1,void 0,this),Q1(R1,{color:H.colors.secondary,children:"Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});import{Box as H2,Text as D0,useInput as G5,useStdout as q5}from"ink";import U5 from"ink-text-input";import O5,{useCallback as N2,useEffect as z5,useMemo as _5,useState as b$}from"react";import{jsxDEV as F0}from"react/jsx-dev-runtime";var d9=O5.memo(({details:$,onComplete:Q})=>{let{stdout:Y}=q5(),J=Y.columns||80,Z=e0()==="confirmation-prompt",X=S0(!1),K=$.fields??[],[q,G]=b$("field"),[U,W]=b$(0),[O,H]=b$(()=>x9($)),[z,w]=b$(""),[_,F]=b$(0),[C,N]=b$([]),[S,R]=b$(),B=K[U],f=_5(()=>N5(B),[B]);z5(()=>{if(!B)return;let L=O[B.name];w(typeof L==="string"||typeof L==="number"?String(L):""),N(Array.isArray(L)?[...L]:[]);let k=f.findIndex((g)=>g.value===String(L));F(k>=0?k:0),R(void 0)},[O,B,f]);let P=N2((L)=>{if(H(L),U<K.length-1){W((k)=>k+1);return}G("review")},[U,K.length]),A=N2((L)=>{if(!B)return;let k={...O};if(L===void 0)delete k[B.name];else k[B.name]=L;P(k)},[O,B,P]),T=N2((L)=>{if(!B)return;try{A(u9(B,L))}catch(k){R(k instanceof Error?k.message:String(k))}},[B,A]),M=N2(()=>{try{let L=l9($,{action:"accept",content:O});Q({action:L.action,...L.content?{content:L.content}:{}})}catch(L){R(L instanceof Error?L.message:String(L))}},[O,$,Q]);if(G5((L,k)=>{if(k.ctrl&&L==="c"||k.meta&&L==="c"){X();return}if(k.escape){Q({action:"cancel"});return}if($.mode==="url"){if(L.toLowerCase()==="y")Q({action:"accept"},!0);else if(L.toLowerCase()==="n")Q({action:"decline"});return}if(q==="review"){if(L.toLowerCase()==="y"||k.return)M();else if(L.toLowerCase()==="e")W(0),G("field");else if(L.toLowerCase()==="d")Q({action:"decline"});return}if(!B){if(k.return)M();return}if(VQ(B))return;if(L.toLowerCase()==="d"){Q({action:"decline"});return}if(k.upArrow){F((g)=>g>0?g-1:Math.max(f.length-1,0));return}if(k.downArrow||k.tab){F((g)=>g<f.length-1?g+1:0);return}if(L===" "&&B.type==="multi-select"){let g=f[_];if(g)N((o)=>o.includes(g.value)?o.filter((l)=>l!==g.value):[...o,g.value]);return}if(k.return)if(B.type==="multi-select")A(C);else{let g=f[_];if(g)A(g.typedValue)}},{isActive:Z}),$.mode==="url")return F0(F2,{width:J,color:"yellow",children:[F0(D0,{bold:!0,color:"yellow",children:"MCP external authorization"},void 0,!1,void 0,this),F0(D0,{children:$.message},void 0,!1,void 0,this),F0(D0,{color:"yellow",children:['Only continue if you trust MCP server "',$.serverName,'".']},void 0,!0,void 0,this),F0(D0,{children:["Domain: ",F0(D0,{color:"cyan",children:$.domain},void 0,!1,void 0,this)]},void 0,!0,void 0,this),F0(D0,{wrap:"wrap",children:["URL: ",F0(D0,{color:"cyan",children:$.url},void 0,!1,void 0,this)]},void 0,!0,void 0,this),F0(D0,{color:"gray",children:"[Y] Open URL · [N] Decline · Esc Cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(q==="review")return F0(F2,{width:J,color:"green",children:[F0(D0,{bold:!0,color:"green",children:"Review MCP form response"},void 0,!1,void 0,this),F0(D0,{children:$.message},void 0,!1,void 0,this),K.map((L)=>F0(D0,{children:[L.title,": ",H5(O[L.name])]},L.name,!0,void 0,this)),S&&F0(D0,{color:"red",children:S},void 0,!1,void 0,this),F0(D0,{color:"gray",children:"[Y] Submit · [E] Edit · [D] Decline · Esc Cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);if(!B)return F0(F2,{width:J,color:"cyan",children:[F0(D0,{children:$.message},void 0,!1,void 0,this),F0(D0,{color:"gray",children:"This form has no fields."},void 0,!1,void 0,this),F0(D0,{color:"gray",children:"Press Enter to submit · [D] Decline · Esc Cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return F0(F2,{width:J,color:"cyan",children:[F0(D0,{bold:!0,color:"cyan",children:["MCP input requested by ",$.serverName]},void 0,!0,void 0,this),F0(D0,{children:$.message},void 0,!1,void 0,this),F0(H2,{flexDirection:"column",marginTop:1,children:[F0(D0,{bold:!0,children:[B.title,B.required?" *":""]},void 0,!0,void 0,this),B.description&&F0(D0,{color:"gray",children:B.description},void 0,!1,void 0,this),F0(D0,{color:"gray",children:F5(B)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),VQ(B)?F0(H2,{children:[F0(D0,{color:"cyan",children:"> "},void 0,!1,void 0,this),F0(U5,{value:z,onChange:w,onSubmit:T,focus:Z,placeholder:B.defaultValue===void 0?B.required?"Required":"Optional":String(B.defaultValue)},void 0,!1,void 0,this)]},void 0,!0,void 0,this):F0(H2,{flexDirection:"column",children:f.map((L,k)=>{let g=B.type==="multi-select"&&C.includes(L.value);return F0(D0,{color:_===k?"yellow":void 0,children:[_===k?"> ":" ",B.type==="multi-select"?g?"(*) ":"( ) ":"",L.label]},L.value,!0,void 0,this)})},void 0,!1,void 0,this),S&&F0(D0,{color:"red",children:S},void 0,!1,void 0,this),F0(D0,{color:"gray",children:[VQ(B)?"Enter to continue":B.type==="multi-select"?"Space to toggle · Enter to continue":"Up/Down to select · Enter to continue"," · [D] Decline · Esc Cancel"]},void 0,!0,void 0,this),F0(D0,{color:"gray",children:["Field ",U+1," of ",K.length]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)});function F2({children:$,width:Q,color:Y}){return F0(H2,{flexDirection:"column",gap:1,borderStyle:"round",borderColor:Y,padding:1,width:Math.min(Q-4,88),children:$},void 0,!1,void 0,this)}function VQ($){return $.type==="string"||$.type==="number"||$.type==="integer"}function N5($){if(!$)return[];if($.type==="boolean")return[{value:"true",label:"Yes",typedValue:!0},{value:"false",label:"No",typedValue:!1}];return($.options??[]).map((Q)=>({...Q,typedValue:Q.value}))}function F5($){let Q=[];if($.format)Q.push(`format: ${$.format}`);if($.minimum!==void 0)Q.push(`min: ${$.minimum}`);if($.maximum!==void 0)Q.push(`max: ${$.maximum}`);if($.minLength!==void 0)Q.push(`min length: ${$.minLength}`);if($.maxLength!==void 0)Q.push(`max length: ${$.maxLength}`);if($.minItems!==void 0)Q.push(`min selections: ${$.minItems}`);if($.maxItems!==void 0)Q.push(`max selections: ${$.maxItems}`);return Q.join(" · ")}function H5($){if($===void 0)return"(omitted)";if(Array.isArray($))return $.join(", ")||"(none)";return String($)}import w2 from"ansi-escapes";import{Box as Z$,Static as k5,useStdout as S5}from"ink";import v5,{useEffect as l1,useMemo as cQ,useRef as X$,useState as xQ}from"react";import{useStdout as W5}from"ink";import{debounce as L5}from"lodash-es";import{useEffect as B5,useState as w5}from"react";function r9($=200){let{stdout:Q}=W5(),[Y,J]=w5(Q.rows||24);return B5(()=>{let Z=L5(()=>{J(Q.rows||24)},$);return Z(),Q.on("resize",Z),()=>{Q.off("resize",Z),Z.cancel()}},[Q,$]),Y}import A$ from"chalk";import b5 from"string-width";var N0={active:!1,renderedLineCount:0,lastRenderedLines:[],terminalWidth:process.stdout.columns||80,terminalHeight:process.stdout.rows||24,prefixIndent:4,isFirstRender:!0},L2="\x1B",jQ=`${L2}[2K`,W2=($)=>$>0?`${L2}[${$}A`:"",a9=`${L2}[?25l`,i9=`${L2}[?25h`;function o9($,Q){N0.active=!0,N0.renderedLineCount=0,N0.lastRenderedLines=[],N0.terminalWidth=$,N0.terminalHeight=Q,N0.isFirstRender=!0}function n9($,Q){N0.terminalWidth=$,N0.terminalHeight=Q}function t9($,Q,Y,J){if(!N0.active)return;let Z=8,X=Math.max(1,N0.terminalHeight-Z),K=[],q=r0.getTheme(),G=" ".repeat(N0.prefixIndent),U=A$.dim.hex(q.colors.border.light);if(Q>0)K.push(`${G}${A$.dim.hex(q.colors.text.muted)(`^ ${Q} lines above (streaming...)`)}`);let W=Y==="code",O=Y==="diff",H="",z=$;if(W&&$.length>0)H=$[0].match(/^```(\w+)?/)?.[1]||"",z=$.slice(1);else if(O&&$.length>0&&$[0]==="<<<DIFF>>>")z=$.slice(1);let w=z.slice(-X);if(W&&Q===0){let F=H?` ${A$.hex(q.colors.text.secondary)(H)}`:"";K.push(`${G}${U("╭─")}${F}`)}for(let F=0;F<w.length;F++){let C=w[F],N=G;if(F===0&&!J&&N0.isFirstRender&&!W&&!O)N=A$.bold.hex(q.colors.success)("• ")+" ",N0.isFirstRender=!1;let S=W?4:0,R=N0.terminalWidth-N0.prefixIndent-2-S,B=C;if(b5(C)>R)B=C.slice(0,R);if(W)K.push(`${G}${U("│")} ${B}`);else if(O){let f=B;if(f.startsWith("+"))K.push(`${N}${A$.green(B)}`);else if(f.startsWith("-"))K.push(`${N}${A$.red(B)}`);else if(f.startsWith("@@"))K.push(`${N}${A$.dim(B)}`);else K.push(`${N}${B}`)}else K.push(`${N}${B}`);if(F===0&&!J&&N0.isFirstRender)N0.isFirstRender=!1}let _=[];if(_.push(a9),N0.renderedLineCount>0)_.push(W2(N0.renderedLineCount)),_.push("\r");for(let F=0;F<K.length;F++){let C=K[F],N=N0.lastRenderedLines[F];if(C!==N)_.push(jQ),_.push(C);if(F<K.length-1)_.push(`
|
|
153
153
|
`)}if(K.length<N0.renderedLineCount){for(let C=K.length;C<N0.renderedLineCount;C++)_.push(`
|
|
154
|
-
`),_.push(jQ);let F=N0.renderedLineCount-K.length;_.push(W2(F))}_.push(
|
|
155
|
-
`);if(N0.renderedLineCount>1)$.push(W2(N0.renderedLineCount-1)),$.push("\r");$.push(
|
|
156
|
-
`)[0]||"";if(Y.length<=Q)return Y;return`${Y.slice(0,Q)}...`}function
|
|
157
|
-
`).length}var pQ=C5.memo(({content:$,isStreaming:Q=!1,isExpanded:Y})=>{let J=A0(),Z=JJ(()=>T5($),[$]),X=JJ(()=>I5($),[$]),K=J.colors.info,q=J.colors.muted;return u1(mQ,{flexDirection:"column",marginBottom:1,children:[u1(mQ,{flexDirection:"row",children:[u1(a$,{color:K,children:Y?"v":">"},void 0,!1,void 0,this),u1(a$,{children:" "},void 0,!1,void 0,this),u1(a$,{color:q,children:["Thinking",Q?"...":` (${Z} lines)`]},void 0,!0,void 0,this),!Y&&!Q&&X&&u1(a$,{color:q,children:[" - ",X]},void 0,!0,void 0,this),u1(a$,{color:q,dimColor:!0,children:[" ","[Ctrl+T]"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Y&&$&&u1(mQ,{marginLeft:2,marginTop:1,borderStyle:"round",borderColor:"gray",paddingX:1,paddingY:0,children:u1(a$,{color:q,children:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});pQ.displayName="ThinkingBlock";import{jsxDEV as i0}from"react/jsx-dev-runtime";var ZJ=S5.memo(()=>{let $=Q4(),Q=C4(),Y=I4(),J=T4(),Z=s1(),X=F4(),K=B4(),q=I8(),G=R4(),U=M4(),W=J4(),O=k4(),H=f4(),z=E$(),w=d9(),{stdout:_}=k5(),F=n1(),[C,N]=xQ(null),[S,R]=xQ([]),[B,f]=xQ(new Set),P=X$(H),A=X$(null),T=X$(0),M=X$(0),L=X$(new Set),k=X$(new Set),g=X$([]),o=X$(null);l1(()=>{if(P.current!==H){if(S1())x1();if(_)_.write(w2.clearTerminal);F.incrementClearCount(),P.current=H}},[H,_,F]);let l=$,a=J;l1(()=>{if(!J||Z){o.current=null;return}if(o.current===J)return;if(o.current=J,S1())x1();if(_)_.write(w2.eraseScreen+w2.cursorTo(0,0));L.current=new Set,k.current=new Set(l.filter((j)=>j.role==="tool").map((j)=>j.id)),A.current=null,T.current=0,M.current=0,g.current=[],R([]),f(new Set),F.incrementClearCount(),F.clearFinalizingStreamingMessageId()},[J,Z,_,F,l]);let I=Q??J;l1(()=>{if(S1())x1();A.current=null,T.current=0,M.current=0,L.current=new Set,k.current=new Set(l.filter((j)=>j.role==="tool").map((j)=>j.id)),g.current=[],R([]),f(new Set)},[W]),l1(()=>{if(!I)return;if(A.current===I)return;A.current=I,T.current=0,M.current=0,k.current=new Set(l.filter((j)=>j.role==="tool").map((j)=>j.id)),g.current=[],R([])},[I,l]),l1(()=>{if(!I)return;let j=uQ(I);if(!j||j.length<=T.current)return;let h=j.slice(T.current);T.current=j.length;let E=h,Z0=g.current;if(Z0.length>0)if(E.some((c0)=>c0.type!=="empty"))E=[...Z0,...E],g.current=[];else{g.current=[...Z0,...E];return}let J0=E.length;while(J0>0&&E[J0-1].type==="empty")J0-=1;if(J0!==E.length)g.current=E.slice(J0),E=E.slice(0,J0);if(E.length===0)return;let w0=M.current;M.current+=1;let f0=w0>0;if(S1())x1();f((c0)=>{if(!I||c0.has(I))return c0;let h0=new Set(c0);return h0.add(I),h0}),R((c0)=>[...c0,i0(Z$,{flexDirection:"column",children:i0(J$,{content:"",role:"assistant",terminalWidth:z,isPending:!1,hidePrefix:f0,noMargin:!0,blocksOverride:E,renderCodeBlocksAsPlainText:!1},void 0,!1,void 0,this)},`streaming-${I}-${w0}`,!1,void 0,this)])},[I,Y.version,z,W]),l1(()=>{if(!I)return;let j=k.current,h=l.filter((E)=>E.role==="tool"&&!j.has(E.id)&&!L.current.has(E.id));if(h.length===0)return;if(S1())x1();for(let E of h)L.current.add(E.id);R((E)=>[...E,...h.map((Z0)=>i0(Z$,{flexDirection:"column",children:i0(J$,{content:Z0.content,role:Z0.role,terminalWidth:z,metadata:Z0.metadata,isPending:!1,messageId:Z0.id},void 0,!1,void 0,this)},`streaming-tool-${Z0.id}`,!1,void 0,this))])},[I,l,z]),l1(()=>{if(!I){if(S1())x1();return}if(!S1())i9(z,w);else o9(z,w);let j=YJ(I);if(!j||j.lines.length===0)return;let E=Math.max(1,w-8),Z0=Math.max(0,j.lines.length-E),J0=j.lines.slice(-E),w0=(uQ(I)?.length??0)>0;n9(J0,Z0,j.mode,w0)},[I,Y.version,w,z]),l1(()=>{if(!I&&S1())x1()},[I]),l1(()=>{if(C===null&&l.length>O){if(N(l.length),S1())x1();if(_)_.write(w2.clearTerminal);F.incrementClearCount()}},[l.length,O,C,_,F]);let y=cQ(()=>{return X.some((j)=>j.status==="pending"||j.status==="in_progress")},[X]),v=H?0:C??0,b=v,V=cQ(()=>{let j=[];if(j.push(i0(e9,{},"header",!1,void 0,this)),b>0)j.push(i0(EQ,{collapsedCount:b},"collapsed-summary",!1,void 0,this));for(let h=v;h<l.length;h++){let E=l[h];if(a&&E.id===a)continue;if(E.role==="tool"&&L.current.has(E.id))continue;if(E.role==="assistant"&&B.has(E.id))continue;j.push(i0(Z$,{flexDirection:"column",children:i0(J$,{content:E.content,role:E.role,terminalWidth:z,metadata:E.metadata,isPending:!1,messageId:E.id},void 0,!1,void 0,this)},E.id,!1,void 0,this))}return j},[l,v,b,z,a,B]),p=cQ(()=>S.length>0?[...V,...S]:V,[V,S]);return i0(Z$,{flexDirection:"column",paddingX:2,children:i0(Z$,{flexDirection:"column",children:[i0(f5,{items:p,children:(j)=>j},W,!1,void 0,this),G&&i0(Z$,{marginBottom:1,children:i0(pQ,{content:G,isStreaming:Z,isExpanded:U},void 0,!1,void 0,this)},void 0,!1,void 0,this),K&&y&&i0(Z$,{marginTop:1,children:i0(QJ,{tasks:X,visible:!0,compact:!1},void 0,!1,void 0,this)},void 0,!1,void 0,this),q.map((j,h)=>i0(Z$,{flexDirection:"column",children:i0(J$,{content:j.displayText,role:"user",terminalWidth:z},void 0,!1,void 0,this)},`pending-${h}`,!1,void 0,this))]},void 0,!0,void 0,this)},void 0,!1,void 0,this)});import{useMemoizedFn as b2,useMount as v5}from"ahooks";import{Box as w1,Text as H0,useFocus as D5,useFocusManager as V5,useInput as j5}from"ink";import h5 from"ink-select-input";import{memo as E5,useMemo as g5,useState as A2}from"react";import{jsxDEV as e,Fragment as c5}from"react/jsx-dev-runtime";var m5=({isSelected:$})=>e(w1,{marginRight:1,children:e(H0,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),p5=({isSelected:$,label:Q})=>e(H0,{bold:$,color:$?"yellow":void 0,children:Q},void 0,!1,void 0,this),XJ=E5(({onClose:$,onEdit:Q})=>{let Y=w4(),J=C8()??"",{isFocused:Z}=D5({id:"model-selector"}),X=V5(),[K,q]=A2(""),[G,U]=A2(!1),[W,O]=A2(null),H=S0(!1),[z]=A2(()=>{let P=process.stdout?.columns||80;return Math.max(20,P-8)});v5(()=>{if(X?.focus("model-selector"),Y.length>0)q(Y[0].id)}),j5((P,A)=>{if(G)return;if(A.ctrl&&P==="c"||A.meta&&P==="c"){H();return}if(A.escape){$();return}if(!Z)return;if(P==="d"||P==="D"){_();return}if((P==="e"||P==="E")&&Q)F()},{isActive:!0});let w=b2(async(P)=>{if(G)return;let A=P.value;if(A===J){$();return}U(!0),O(null);try{await m0().setCurrentModel(A),$()}catch(T){O(T.message),U(!1)}}),_=b2(async()=>{if(G||K===J)return;U(!0),O(null);try{if(await m0().removeModel(K),Y.length<=1)$()}catch(P){O(P.message)}finally{U(!1)}}),F=b2(()=>{if(G||!Q)return;let P=Y.find((A)=>A.id===K);if(!P)return;Q(P)}),C=b2((P)=>{q(P.value)}),N=g5(()=>{return Y.find((P)=>P.id===K)},[Y,K]),S=N?P2()?.modelProviders[N.provider]:void 0,R=Y.map((P)=>{let A=P.id===J?" (当前)":"";return{label:lQ(P)+A,value:P.id}}),B=K===J;return e(w1,{flexDirection:"column",borderStyle:"round",borderColor:"gray",padding:1,width:"100%",children:[e(w1,{flexDirection:"row",justifyContent:"space-between",marginBottom:1,children:[e(H0,{bold:!0,color:"cyan",children:"模型管理"},void 0,!1,void 0,this),e(H0,{dimColor:!0,children:[G?"处理中...":B?"Enter=关闭 • E=编辑 • Esc=取消":"Enter=切换 • D=删除 • E=编辑 • Esc=取消"," • Ctrl+C=退出"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),e(w1,{flexDirection:"row",children:[e(w1,{flexDirection:"column",flexGrow:2,marginRight:2,borderStyle:"single",borderColor:"gray",padding:1,children:[e(H0,{dimColor:!0,children:["已配置模型 (",Y.length,")"]},void 0,!0,void 0,this),e(w1,{marginTop:1,children:e(h5,{items:R,onSelect:w,onHighlight:C,indicatorComponent:m5,itemComponent:p5},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),e(w1,{flexDirection:"column",flexGrow:3,borderStyle:"single",borderColor:"gray",padding:1,children:[e(H0,{dimColor:!0,children:"模型详情"},void 0,!1,void 0,this),e(w1,{marginY:1,children:e(H0,{color:B?"green":"yellow",children:B?"* 当前使用":"* 可切换"},void 0,!1,void 0,this)},void 0,!1,void 0,this),N?e(w1,{flexDirection:"column",children:[e(H0,{children:[e(H0,{dimColor:!0,children:"名称: "},void 0,!1,void 0,this),e(H0,{bold:!0,color:"cyan",children:lQ(N)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),e(H0,{children:[e(H0,{dimColor:!0,children:"Provider: "},void 0,!1,void 0,this),e(H0,{bold:!0,children:S?.name??N.provider},void 0,!1,void 0,this)]},void 0,!0,void 0,this),S&&e(c5,{children:[e(H0,{children:[e(H0,{dimColor:!0,children:"Channel ID: "},void 0,!1,void 0,this),e(H0,{children:N.provider},void 0,!1,void 0,this)]},void 0,!0,void 0,this),e(H0,{children:[e(H0,{dimColor:!0,children:"Wire API: "},void 0,!1,void 0,this),e(H0,{children:S.wireApi},void 0,!1,void 0,this)]},void 0,!0,void 0,this),e(H0,{children:[e(H0,{dimColor:!0,children:"Endpoint: "},void 0,!1,void 0,this),e(H0,{color:"blueBright",children:S.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),e(H0,{children:[e(H0,{dimColor:!0,children:"Model: "},void 0,!1,void 0,this),e(H0,{bold:!0,children:N.model},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N.overrides?.baseUrl&&e(H0,{children:[e(H0,{dimColor:!0,children:"Base URL override: "},void 0,!1,void 0,this),e(H0,{color:"blueBright",children:N.overrides.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this),e(H0,{children:[e(H0,{dimColor:!0,children:"Context Window: "},void 0,!1,void 0,this),e(H0,{children:E1().resolveConfig(N).contextWindow},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this):e(H0,{dimColor:!0,children:"请选择一个模型查看详情"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),W&&e(w1,{marginTop:1,children:e(H0,{color:"red",children:W},void 0,!1,void 0,this)},void 0,!1,void 0,this),e(w1,{justifyContent:"center",marginTop:1,children:e(H0,{dimColor:!0,children:"─".repeat(z)},void 0,!1,void 0,this)},void 0,!1,void 0,this),e(w1,{justifyContent:"center",children:e(H0,{dimColor:!0,children:"提示:D=删除 * E=编辑 * Up/Down=移动 * Enter/ESC=确认"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{useMemoizedFn as dQ}from"ahooks";import{Box as qX,Text as rQ,useInput as UX}from"ink";import{useState as R$}from"react";import{Box as P$,Text as d1,useInput as x5}from"ink";import u5 from"ink-text-input";import{jsxDEV as o0}from"react/jsx-dev-runtime";var KJ=({provider:$,value:Q,onChange:Y,onSubmit:J,onCancel:Z,error:X})=>{return x5((K,q)=>{if(q.escape)Z()}),o0(P$,{flexDirection:"column",children:[o0(P$,{marginBottom:1,children:o0(d1,{bold:!0,color:"blue",children:"Step 2: 输入 API Key"},void 0,!1,void 0,this)},void 0,!1,void 0,this),o0(P$,{marginBottom:1,children:o0(d1,{children:["Provider: ",o0(d1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),o0(P$,{marginBottom:1,children:o0(d1,{dimColor:!0,children:"API 密钥将存储在 ~/.blade/auth.json(权限 600),不会写入模型配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),o0(P$,{children:[o0(d1,{bold:!0,color:"cyan",children:[">"," "]},void 0,!0,void 0,this),o0(u5,{value:Q,onChange:Y,onSubmit:J,placeholder:"sk-...",mask:"*"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X&&o0(P$,{marginTop:1,children:o0(d1,{color:"red",children:X},void 0,!1,void 0,this)},void 0,!1,void 0,this),o0(P$,{marginTop:1,children:o0(d1,{dimColor:!0,children:["输入完成后按 ",o0(d1,{bold:!0,children:"Enter"},void 0,!1,void 0,this),",",o0(d1,{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{Box as y2,Text as K$,useInput as l5}from"ink";import d5 from"ink-text-input";import{useState as R2}from"react";import{jsxDEV as N1}from"react/jsx-dev-runtime";var M2=["id","name","baseUrl","model"];function GJ($){switch($){case"id":return"Channel ID";case"name":return"Channel name";case"baseUrl":return"Base URL";case"model":return"Model ID"}}function r5($,Q,Y){switch($){case"id":return"team-gateway";case"name":return Y||"Team Gateway";case"baseUrl":return Q==="anthropic-messages"?"https://gateway.example.com":"https://gateway.example.com/v1";case"model":return Q==="anthropic-messages"?"claude-opus-4-8":"vendor-model-2026"}}function a5($,Q){let Y=$.id.trim(),J={name:$.name.trim()||Y,baseUrl:$.baseUrl.trim(),wireApi:Q},Z=UJ(Y,J);if(!$.model.trim())Z.push("Model ID must not be empty");if(Z.length>0)throw Error(Z[0]);return{provider:Y,model:$.model.trim(),displayName:$.model.trim(),modelProvider:J}}var OJ=({wireApi:$,initialConfig:Q,onSubmit:Y,onCancel:J})=>{let Z={id:Q?.provider??"",name:Q?.modelProvider?.name??"",baseUrl:Q?.modelProvider?.baseUrl??"",model:Q?.model??""},[X,K]=R2(Q?3:0),[q,G]=R2(Q?.model??""),[U,W]=R2(Z),[O,H]=R2(),z=M2[X];l5((_,F)=>{if(!F.escape)return;if(H(void 0),X===0){J();return}let C=X-1,N=M2[C];K(C),G(U[N])});let w=(_)=>{let F=_.trim();if(z==="id"&&!qJ.test(F)){H("Channel ID 必须以小写字母开头,且仅包含小写字母、数字、.、_ 或 -");return}if(z==="baseUrl")try{let N=new URL(F);if(!["http:","https:"].includes(N.protocol))throw Error()}catch{H("Base URL 必须是绝对 HTTP(S) URL");return}if(z==="model"&&!F){H("Model ID 不能为空");return}let C={...U,[z]:z==="name"&&!F?U.id:F};if(W(C),H(void 0),X===M2.length-1){try{Y(a5(C,$))}catch(N){H(N instanceof Error?N.message:"渠道配置无效")}return}K(X+1),G("")};return N1(y2,{flexDirection:"column",children:[N1(y2,{marginBottom:1,children:N1(K$,{bold:!0,color:"blue",children:"配置自定义 Provider 渠道"},void 0,!1,void 0,this)},void 0,!1,void 0,this),N1(K$,{dimColor:!0,children:["Protocol:"," ",$==="anthropic-messages"?"Anthropic Messages":"OpenAI Chat Completions"]},void 0,!0,void 0,this),M2.slice(0,X).map((_)=>N1(K$,{children:[GJ(_),": ",N1(K$,{color:"cyan",children:U[_]},void 0,!1,void 0,this)]},_,!0,void 0,this)),N1(y2,{marginTop:1,children:[N1(K$,{bold:!0,children:[GJ(z),": "]},void 0,!0,void 0,this),N1(d5,{value:q,onChange:(_)=>{G(_),H(void 0)},onSubmit:w,placeholder:r5(z,$,U.id)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z==="name"&&N1(K$,{dimColor:!0,children:"留空使用 Channel ID"},void 0,!1,void 0,this),O&&N1(K$,{color:"red",children:O},void 0,!1,void 0,this),N1(y2,{marginTop:1,children:N1(K$,{dimColor:!0,children:"Enter 继续 · Esc 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useEffect as NJ,useState as i$}from"react";var FJ=()=>{let[$,Q]=i$([]),[Y,J]=i$(!0),[Z,X]=i$(null);return NJ(()=>{(async()=>{try{Q(await zJ())}catch(q){X(q instanceof Error?q.message:"加载 Provider 列表失败")}finally{J(!1)}})()},[]),{providers:$,isLoading:Y,error:Z}},HJ=($)=>{let[Q,Y]=i$([]),[J,Z]=i$(!1),[X,K]=i$(null);return NJ(()=>{if(!$){Y([]);return}(async()=>{Z(!0),K(null);try{Y(await _J($))}catch(G){K(G instanceof Error?G.message:"加载模型列表失败")}finally{Z(!1)}})()},[$]),{models:Q,isLoading:J,error:X}};import{Box as r1,Text as M1,useInput as i5}from"ink";import o5 from"ink-select-input";import n5 from"ink-text-input";import{useMemo as WJ,useState as t5}from"react";import{jsxDEV as E0,Fragment as QX}from"react/jsx-dev-runtime";var s5=({isSelected:$})=>E0(r1,{marginRight:1,children:E0(M1,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),e5=($)=>{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($.reasoning)Q.push("[reasoning]");if($.input.includes("image"))Q.push("[vision]");if($.cost.input||$.cost.output)Q.push(`[$${$.cost.input}/$${$.cost.output}]`);return Q.join(" ")},$X=({isSelected:$,label:Q})=>E0(M1,{bold:$,color:$?"yellow":void 0,children:Q},void 0,!1,void 0,this),LJ=({provider:$,models:Q,isLoading:Y,error:J,onSelect:Z,onCancel:X})=>{let[K,q]=t5("");i5((W,O)=>{if(O.escape)if(K)q("");else X()});let G=WJ(()=>{if(!K)return Q;let W=K.toLowerCase();return Q.filter((O)=>O.name.toLowerCase().includes(W)||O.id.toLowerCase().includes(W))},[Q,K]),U=WJ(()=>G.map((W)=>({key:W.id,label:e5(W),value:W})),[G]);if(Y)return E0(r1,{flexDirection:"column",children:E0(M1,{color:"yellow",children:["正在加载 ",$.name," 模型列表..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this);if(J)return E0(r1,{flexDirection:"column",children:[E0(M1,{color:"red",children:J},void 0,!1,void 0,this),E0(M1,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return E0(r1,{flexDirection:"column",children:[E0(r1,{marginBottom:1,children:E0(M1,{bold:!0,color:"blue",children:"Step 3: 选择模型"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E0(r1,{marginBottom:1,children:E0(M1,{children:["Provider: ",E0(M1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),E0(QX,{children:[E0(r1,{marginBottom:1,children:[E0(M1,{color:"cyan",children:"> "},void 0,!1,void 0,this),E0(n5,{value:K,onChange:q,placeholder:`搜索 ${Q.length} 个模型...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E0(r1,{marginBottom:1,children:E0(M1,{dimColor:!0,children:"模型元数据来自内置 catalog"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E0(r1,{flexDirection:"column",height:12,children:E0(o5,{items:U,onSelect:(W)=>Z(W.value),indicatorComponent:s5,itemComponent:$X,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),G.length===0&&E0(M1,{color:"yellow",children:"内置 catalog 中没有匹配模型"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)};import{Box as y$,Text as G$,useInput as JX}from"ink";import YX from"ink-select-input";import ZX from"ink-text-input";import{useMemo as BJ,useState as XX}from"react";import{jsxDEV as n0}from"react/jsx-dev-runtime";var KX=({isSelected:$})=>n0(y$,{marginRight:1,children:n0(G$,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),GX=({isSelected:$,label:Q})=>n0(G$,{bold:$,color:$?"yellow":void 0,children:Q},void 0,!1,void 0,this),wJ=({providers:$,isLoading:Q,error:Y,onSelect:J,onCancel:Z})=>{let[X,K]=XX("");JX((U,W)=>{if(W.escape)if(X)K("");else Z()});let q=BJ(()=>{if(!X)return $;let U=X.toLowerCase();return $.filter((W)=>W.name.toLowerCase().includes(U)||W.id.toLowerCase().includes(U))},[$,X]),G=BJ(()=>q.map((U)=>({key:U.id,label:`${U.name} - ${U.modelCount} models${U.configured?" [configured]":""}`,value:U})),[q]);if(Q)return n0(y$,{flexDirection:"column",children:n0(G$,{color:"yellow",children:"正在加载 Provider 列表..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Y)return n0(y$,{flexDirection:"column",children:[n0(G$,{color:"red",children:Y},void 0,!1,void 0,this),n0(G$,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return n0(y$,{flexDirection:"column",children:[n0(y$,{marginBottom:1,children:n0(G$,{bold:!0,color:"blue",children:"Step 1: 选择 API 提供商"},void 0,!1,void 0,this)},void 0,!1,void 0,this),n0(y$,{marginBottom:1,children:[n0(G$,{color:"cyan",children:"> "},void 0,!1,void 0,this),n0(ZX,{value:X,onChange:K,placeholder:`搜索 ${$.length} 个 Provider...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),n0(y$,{flexDirection:"column",height:12,children:n0(YX,{items:G,onSelect:(U)=>J(U.value),indicatorComponent:KX,itemComponent:GX,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),q.length===0&&n0(G$,{color:"yellow",children:"未找到匹配的 Provider,按 Esc 清除搜索"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};function bJ($){if($==="custom")return"provider";if($==="model")return"provider";if($==="credential")return"model";return}import{jsxDEV as q$}from"react/jsx-dev-runtime";var aQ=({mode:$,initialConfig:Q,modelId:Y,onComplete:J,onCancel:Z})=>{let[X,K]=R$("provider"),[q,G]=R$(),[U,W]=R$(),[O,H]=R$(),[z,w]=R$(""),[_,F]=R$(),[C,N]=R$(!1),S=FJ(),R=HJ(q?.id),B=S0(!1);UX((T,M)=>{if(M.ctrl&&T==="c"||M.meta&&T==="c")$==="setup"?B():Z()});let f=dQ(async(T)=>{if(!q)return;let M=O??(U?{provider:q.id,model:U.id,displayName:Q?.displayName}:void 0);if(!M)return;N(!0),F(void 0);try{if(M.modelProvider)E1().registerModelProvider(M.provider,M.modelProvider,[M.model]);if(T?.trim())await E1().setApiKey(M.provider,T.trim());let L={displayName:M.displayName,provider:M.provider,model:M.model,overrides:M.overrides};if($==="setup")await J(M);else if($==="add"){let k=M.modelProvider?await m0().addModelWithProvider(L,M.modelProvider):await m0().addModel(L);await m0().setCurrentModel(k.id),await J(M)}else if(Y){if(M.modelProvider)await m0().updateModelWithProvider(Y,L,M.modelProvider);else await m0().updateModel(Y,L);await J(M)}}catch(L){if(M.modelProvider){await E1().credentials.delete(M.provider);let k=P2();E1().configureModelProviders(k?.modelProviders??{},k?.models??[])}F(L instanceof Error?L.message:"保存配置失败"),N(!1)}}),P=dQ((T)=>{if(W(T),q?.configured)f();else if(q?.supportsApiKey)K("credential");else F(`${q?.name??"Provider"} 需要 OAuth 或环境凭证,请先在外部完成认证`)}),A=dQ(()=>{if(F(void 0),X==="credential"&&O){K("custom");return}let T=bJ(X);if(T)K(T)});return q$(qX,{flexDirection:"column",padding:1,children:[q$(rQ,{bold:!0,color:"blue",children:$==="edit"?"编辑模型":"添加模型"},void 0,!1,void 0,this),X==="provider"&&q$(wJ,{...S,onSelect:(T)=>{G(T),W(void 0),H(void 0),K(T.factoryWireApi?"custom":"model")},onCancel:$==="setup"?()=>{return}:Z},void 0,!1,void 0,this),X==="custom"&&q?.factoryWireApi&&q$(OJ,{wireApi:q.factoryWireApi,initialConfig:O,onSubmit:(T)=>{H(T),K("credential")},onCancel:A},void 0,!1,void 0,this),X==="model"&&q&&q$(LJ,{provider:q,...R,onSelect:P,onCancel:A},void 0,!1,void 0,this),X==="credential"&&q&&q$(KJ,{provider:q,value:z,onChange:w,onSubmit:()=>void f(z),onCancel:A,error:_},void 0,!1,void 0,this),C&&q$(rQ,{color:"yellow",children:"正在保存配置..."},void 0,!1,void 0,this),_&&X!=="credential"&&q$(rQ,{color:"red",children:_},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as H8}from"ahooks";import{promises as RJ}from"fs";import{Box as F1,Text as V0,useInput as OX}from"ink";import AJ from"ink-select-input";import zX from"ink-text-input";import _X from"os";import C2 from"path";import{useEffect as NX,useMemo as I2,useRef as FX,useState as U$}from"react";import{jsxDEV as U0}from"react/jsx-dev-runtime";var W8=[{key:"allow",label:"Allow"},{key:"ask",label:"Ask"},{key:"deny",label:"Deny"},{key:"info",label:"Info"}],HX={allow:"Add a new rule...",ask:"Add a new rule...",deny:"Add a new rule..."},WX={allow:"Allow permission rules",ask:"Ask permission rules",deny:"Deny permission rules"},PJ={project:"[项目共享配置]",global:"[用户全局配置]",local:"[本地配置]"},LX=["project","global","local"],BX={allow:[],ask:[],deny:[]},wX={localExists:!1,projectExists:!1,globalExists:!1},yJ={allow:[],ask:[],deny:[]};function bX($){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 AX($){try{let Q=await RJ.readFile($,"utf-8"),Y=JSON.parse(Q);return{exists:!0,raw:Y,permissions:bX(Y)}}catch(Q){if(Q.code==="ENOENT")return{exists:!1,raw:{},permissions:{...yJ}};return console.warn(`[PermissionsManager] Failed to read ${$}:`,Q),{exists:!0,raw:{},permissions:{...yJ}}}}function PX($,Q){let Y=$.padEnd(32," "),J=Q==="local"?`${PJ[Q]} <- 可删除`:PJ[Q];return`${Y} ${J}`}var MJ=({onClose:$})=>{let Y=e0()==="permissions-manager",J=S0(!1),[Z,X]=U$(0),K=W8[Z].key,[q,G]=U$(BX),[U,W]=U$(wX),[O,H]=U$(!0),[z,w]=U$("list"),[_,F]=U$(""),[C,N]=U$(null),[S,R]=U$(null),B=FX(!1),f=I2(()=>C2.join(l0(),".blade","settings.local.json"),[]),P=I2(()=>C2.join(l0(),".blade","settings.json"),[]),A=I2(()=>C2.join(_X.homedir(),".blade","settings.json"),[]),T=H8(async()=>{H(!0);let j=await Promise.all([{source:"local",path:f},{source:"project",path:P},{source:"global",path:A}].map(async({source:J0,path:w0})=>{let f0=await AX(w0);return{source:J0,path:w0,...f0}})),h={localExists:j.find((J0)=>J0.source==="local")?.exists??!1,projectExists:j.find((J0)=>J0.source==="project")?.exists??!1,globalExists:j.find((J0)=>J0.source==="global")?.exists??!1};W(h);let E={allow:[],ask:[],deny:[]},Z0=Object.fromEntries(j.map((J0)=>[J0.source,J0]));["allow","ask","deny"].forEach((J0)=>{LX.forEach((w0)=>{(Z0[w0]?.permissions[J0]??[]).forEach((c0,h0)=>{let H1={key:`${w0}:${h0}:${c0}`,rule:c0,source:w0};E[J0].push(H1)})})}),G(E),H(!1)});NX(()=>{T()},[T]);let M=H8(async(p,j)=>{try{let h=C2.join(l0(),".blade","settings.local.json"),E={allow:[],ask:[],deny:[]};try{let J0=await RJ.readFile(h,"utf-8"),f0=JSON.parse(J0).permissions||{};E={allow:Array.isArray(f0.allow)?f0.allow:[],ask:Array.isArray(f0.ask)?f0.ask:[],deny:Array.isArray(f0.deny)?f0.deny:[]}}catch(J0){}let Z0=j(E);await m0().updateConfig({permissions:Z0},{scope:"local",immediate:!0}),await T()}catch(h){throw console.error("[PermissionsManager] 修改权限规则失败:",h),h}});OX((p,j)=>{if(j.ctrl&&p==="c"||j.meta&&p==="c"){J();return}if(z==="locked"){if(B.current){B.current=!1;return}w("list"),N(null),R(null);return}if(j.escape){if(z==="list"||K==="info")$();else w("list"),F(""),N(null),R(null);return}if(z==="list"){if(j.tab&&j.shift)X((h)=>(h-1+W8.length)%W8.length);else if(j.tab)X((h)=>(h+1)%W8.length);else if(p?.toLowerCase()==="q")$()}},{isActive:Y});let L=H8((p)=>{let j=p.value;if(K==="info")return;if(j.type==="add"){w("add"),F(""),R(null);return}if(j.entry.source!=="local"){w("locked"),B.current=!0,N({tab:K,entry:j.entry}),R({type:"error",text:j.entry.source==="project"?"此规则定义在项目共享配置中,无法在此删除。":"此规则来自用户全局配置,无法在此删除。"});return}w("confirm-delete"),N({tab:K,entry:j.entry}),R(null)}),k=H8(async()=>{if(K==="info")return;let p=_.trim();if(!p){R({type:"error",text:"Permission rule 不能为空"});return}if(q[K].map((h)=>h.rule).includes(p)){R({type:"error",text:"该规则已存在"});return}try{await M(K,(h)=>{let E={allow:[...h.allow],ask:[...h.ask],deny:[...h.deny]};return E[K]=[...new Set([...h[K],p])],E}),w("list"),F(""),R({type:"success",text:"已添加本地权限规则"})}catch(h){R({type:"error",text:`保存失败: ${h instanceof Error?h.message:"未知错误"}`})}}),g=H8(async()=>{if(!C)return;let{tab:p,entry:j}=C;try{await M(p,(h)=>{let E={allow:[...h.allow],ask:[...h.ask],deny:[...h.deny]};return E[p]=h[p].filter((Z0)=>Z0!==j.rule),E}),w("list"),N(null),R({type:"success",text:"已删除本地权限规则"})}catch(h){R({type:"error",text:`删除失败: ${h instanceof Error?h.message:"未知错误"}`})}}),o=I2(()=>{if(K==="info")return[];let p=K;return[{key:"add-new-rule",label:`› ${HX[p]}`,value:{type:"add"}},...q[p].map((h)=>({key:h.key,label:PX(h.rule,h.source),value:{type:"rule",entry:h}}))]},[K,q]),l=()=>U0(F1,{marginBottom:1,children:W8.map((p,j)=>U0(F1,{marginRight:2,children:U0(V0,{color:j===Z?"yellow":"gray",children:["[",p.label,"]"]},void 0,!0,void 0,this)},p.key,!1,void 0,this))},void 0,!1,void 0,this),a=()=>U0(F1,{flexDirection:"column",gap:1,children:[U0(V0,{children:"配置文件优先级(从高到低):"},void 0,!1,void 0,this),U0(F1,{flexDirection:"column",marginLeft:2,children:[U0(V0,{children:["1. .blade/settings.local.json (本地配置,不提交 Git)"," ",U.localExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),U0(V0,{children:["2. .blade/settings.json (项目配置,提交 Git)"," ",U.projectExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),U0(V0,{children:["3. ~/.blade/settings.json (用户全局配置)"," ",U.globalExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),U0(V0,{children:"说明:"},void 0,!1,void 0,this),U0(F1,{flexDirection:"column",marginLeft:2,children:[U0(V0,{children:"- /permissions 命令只管理本地配置 (.blade/settings.local.json)"},void 0,!1,void 0,this),U0(V0,{children:"- 修改全局或项目配置请直接编辑对应文件"},void 0,!1,void 0,this),U0(V0,{children:"- 本地配置不会提交到 Git"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),I=(p)=>U0(F1,{flexDirection:"column",gap:1,children:[U0(V0,{bold:!0,children:WX[p]},void 0,!1,void 0,this),U0(V0,{children:"Permission rules are a tool name, optionally followed by a specifier in parentheses."},void 0,!1,void 0,this),U0(V0,{color:"gray",children:"例如: WebFetch 或 Bash(ls:*)"},void 0,!1,void 0,this),U0(F1,{marginTop:1,children:U0(zX,{value:_,onChange:F,onSubmit:k},void 0,!1,void 0,this)},void 0,!1,void 0,this),U0(V0,{color:"gray",children:"Enter 提交 · Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),y=(p,j)=>U0(F1,{flexDirection:"column",gap:1,children:[U0(V0,{bold:!0,children:["Delete ",p," permission rule?"]},void 0,!0,void 0,this),U0(V0,{children:j.rule},void 0,!1,void 0,this),U0(V0,{color:"gray",children:"From project local settings"},void 0,!1,void 0,this),U0(V0,{children:"Are you sure you want to delete this permission rule?"},void 0,!1,void 0,this),U0(AJ,{items:[{label:"Yes",value:"yes"},{label:"No",value:"no"}],onSelect:(h)=>{if(h.value==="yes")g();else w("list"),N(null)}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),v=(p)=>U0(F1,{flexDirection:"column",gap:1,children:[U0(V0,{bold:!0,children:"Cannot delete this rule"},void 0,!1,void 0,this),U0(V0,{children:p.rule},void 0,!1,void 0,this),U0(V0,{color:"gray",children:p.source==="project"?"This rule is defined in .blade/settings.json. 请手动编辑该文件以移除规则。":"This rule is defined in ~/.blade/settings.json. 请手动编辑该文件以移除规则。"},void 0,!1,void 0,this),U0(V0,{color:"gray",children:"按任意键继续"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),b=(p)=>U0(AJ,{items:o,isFocused:z==="list",onSelect:L},void 0,!1,void 0,this),V=()=>{if(O)return U0(V0,{children:"加载中..."},void 0,!1,void 0,this);if(K==="info")return a();if(z==="add")return I(K);if(z==="confirm-delete"&&C)return y(C.tab,C.entry);if(z==="locked"&&C)return v(C.entry);return b(K)};return U0(F1,{flexDirection:"column",borderStyle:"round",borderColor:Y?"cyan":"gray",padding:1,width:80,children:[U0(V0,{color:"cyan",bold:!0,children:"权限管理器"},void 0,!1,void 0,this),l(),U0(F1,{flexDirection:"column",gap:1,children:V()},void 0,!1,void 0,this),S&&U0(F1,{marginTop:1,children:U0(V0,{color:S.type==="success"?"green":"red",children:S.text},void 0,!1,void 0,this)},void 0,!1,void 0,this),U0(F1,{marginTop:1,children:U0(V0,{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 B0,Text as Y0,useInput as yX}from"ink";import{useEffect as RX,useState as M$}from"react";import{jsxDEV as x}from"react/jsx-dev-runtime";var iQ=["local","project","global"];function vJ({workspaceRoot:$,onCancel:Q}){let Y=IJ($),J=Y.getAll(),[Z,X]=M$(0),[K,q]=M$(!1),[G,U]=M$(""),[W,O]=M$(null),[H,z]=M$("local"),[w,_]=M$(null),[F,C]=M$(0),N=Y.getBySource(),S=Y.getStats(),R=Y.getSourcePolicy(),B=S0(!1,Q);RX(()=>{let L=!0;return CJ.getInstance().loadWorkspacePluginSettingsResolution(Y.getWorkspaceRoot()).then((k)=>{if(L)_(k.settings)}).catch((k)=>{if(L)U(k instanceof Error?k.message:"无法读取插件作用域配置")}),()=>{L=!1}},[Y,F]);let f=()=>{z((L)=>{let k=iQ.indexOf(L);return iQ[(k+1)%iQ.length]}),O(null)},P=async()=>{let L=J[Z];if(!L||K)return;if(L.source==="cli"){U(`${L.manifest.name} 由 --plugin-dir 管理,不能持久化切换`);return}if(L.status==="error"){U(L.error??`${L.manifest.name} 当前不可用`);return}q(!0),U("");try{let k=await TJ(Y.getWorkspaceRoot(),L.manifest.name,L.status!=="active",H);U(k.effectiveEnabled?`已启用 ${L.manifest.name} · 生效层级 ${k.effectiveScope}`:`已禁用 ${L.manifest.name} · 生效层级 ${k.effectiveScope}`),C((g)=>g+1)}catch(k){U(k instanceof Error?k.message:String(k))}finally{q(!1)}},A=async()=>{if(K)return;q(!0),U("");try{await fJ(Y.getWorkspaceRoot()),X(0),U("插件列表已刷新"),C((L)=>L+1)}catch(L){U(L instanceof Error?L.message:String(L))}finally{q(!1)}},T=async()=>{let L=J[Z];if(!L||K)return;if(!L.installation){U(`${L.manifest.name} 不是 Blade 受管安装,不能自动更新`);return}q(!0),O(null),U("");try{let{result:k}=await kJ(Y.getWorkspaceRoot(),L.manifest.name,{trusted:!0});if(!k.success)throw Error(k.error);U(k.changed?`已更新 ${L.manifest.name} 到 ${k.installation?.revision}`:`${L.manifest.name} 已是最新版本`),C((g)=>g+1)}catch(k){U(k instanceof Error?k.message:String(k))}finally{q(!1)}},M=async()=>{let L=J[Z];if(!L||K)return;if(!L.installation){U(`${L.manifest.name} 不是 Blade 受管安装,不能自动卸载`);return}if(W!==L.manifest.name){O(L.manifest.name),U(`再次按 x 确认卸载 ${L.manifest.name}`);return}q(!0),U("");try{let{result:k}=await SJ(Y.getWorkspaceRoot(),L.manifest.name,!0);if(!k.success)throw Error(k.error);O(null),X(0),U(`已卸载 ${L.manifest.name}`),C((g)=>g+1)}catch(k){U(k instanceof Error?k.message:String(k))}finally{q(!1)}};if(yX((L,k)=>{if(k.escape)Q?.();else if(k.ctrl&&L==="c"||k.meta&&L==="c")B();else if((k.upArrow||L==="k")&&J.length>0)O(null),X((g)=>(g-1+J.length)%J.length);else if((k.downArrow||L==="j")&&J.length>0)O(null),X((g)=>(g+1)%J.length);else if(L===" "||k.return)P();else if(L==="r")A();else if(L==="s")f();else if(L==="u")T();else if(L==="x")M()}),J.length===0)return x(B0,{flexDirection:"column",paddingY:1,children:[x(B0,{marginBottom:1,children:x(Y0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(B0,{paddingLeft:2,children:x(Y0,{color:"gray",children:"没有已加载的插件"},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(B0,{marginTop:1,paddingLeft:2,flexDirection:"column",children:[x(Y0,{color:"gray",children:"插件目录位置:"},void 0,!1,void 0,this),x(Y0,{color:"gray",dimColor:!0,children:[" ","• ~/.blade/plugins/ - 用户级插件"]},void 0,!0,void 0,this),x(Y0,{color:"gray",dimColor:!0,children:[" ","• .blade/plugins/ - 项目级插件"]},void 0,!0,void 0,this),x(Y0,{color:"gray",dimColor:!0,children:[" ","• --plugin-dir - CLI 指定的插件"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(B0,{marginTop:1,paddingLeft:2,children:x(Y0,{color:"gray",children:"使用 /plugins install <url> 安装新插件"},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(B0,{marginTop:1,children:x(Y0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return x(B0,{flexDirection:"column",paddingY:1,children:[x(B0,{marginBottom:1,children:[x(Y0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this),x(Y0,{color:"gray",children:[" (共 ",S.total," 个插件)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(B0,{paddingLeft:2,marginBottom:1,children:x(Y0,{color:"gray",children:["启用: ",S.active," | 禁用: ",S.inactive," | 命令: ",S.commands," | 技能:"," ",S.skills," | 代理: ",S.agents]},void 0,!0,void 0,this)},void 0,!1,void 0,this),x(B0,{paddingLeft:2,marginBottom:1,children:x(Y0,{color:"gray",children:["来源策略: ",R.restrictToAllowedSources?"restricted":"open"," | Git SHA: ",R.requireGitCommitSha?"required":"optional"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),x(B0,{paddingLeft:2,marginBottom:1,children:x(Y0,{color:"gray",children:["写入层级: ",x(Y0,{color:"cyan",children:H},void 0,!1,void 0,this)," · 按 s 切换"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),N.cli.length>0&&x(B0,{flexDirection:"column",marginBottom:1,children:[x(B0,{paddingLeft:1,children:[x(Y0,{bold:!0,color:"magenta",children:"CLI 指定"},void 0,!1,void 0,this),x(Y0,{color:"gray",children:" (--plugin-dir)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N.cli.map((L)=>{let k=L.status==="active"?"[on]":"[off]",g=J.indexOf(L)===Z;return x(B0,{flexDirection:"column",paddingLeft:2,children:[x(Y0,{children:[x(Y0,{bold:!0,color:g?"cyan":"green",children:[g?"› ":" ",k," ",L.manifest.name]},void 0,!0,void 0,this),x(Y0,{color:"gray",children:[" v",L.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(B0,{paddingLeft:2,children:x(Y0,{color:"gray",children:L.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(B0,{paddingLeft:2,children:x(Y0,{color:"gray",dimColor:!0,children:"生效层级: invocation"},void 0,!1,void 0,this)},void 0,!1,void 0,this),L.commands.length>0&&x(B0,{paddingLeft:2,children:x(Y0,{color:"blue",children:["命令:"," ",L.commands.map((o)=>`/${o.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},L.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),N.project.length>0&&x(B0,{flexDirection:"column",marginBottom:1,children:[x(B0,{paddingLeft:1,children:[x(Y0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),x(Y0,{color:"gray",children:" (.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N.project.map((L)=>{let k=L.status==="active"?"[on]":"[off]",g=J.indexOf(L)===Z;return x(B0,{flexDirection:"column",paddingLeft:2,children:[x(Y0,{children:[x(Y0,{bold:!0,color:g?"cyan":"green",children:[g?"› ":" ",k," ",L.manifest.name]},void 0,!0,void 0,this),x(Y0,{color:"gray",children:[" v",L.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(B0,{paddingLeft:2,children:x(Y0,{color:"gray",children:L.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(B0,{paddingLeft:2,children:x(Y0,{color:"gray",dimColor:!0,children:["生效层级:"," ",w?.[L.manifest.name]?.effectiveScope??"default"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),L.commands.length>0&&x(B0,{paddingLeft:2,children:x(Y0,{color:"blue",children:["命令:"," ",L.commands.map((o)=>`/${o.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},L.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),N.user.length>0&&x(B0,{flexDirection:"column",marginBottom:1,children:[x(B0,{paddingLeft:1,children:[x(Y0,{bold:!0,color:"cyan",children:"用户级"},void 0,!1,void 0,this),x(Y0,{color:"gray",children:" (~/.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N.user.map((L)=>{let k=L.status==="active"?"[on]":"[off]",g=J.indexOf(L)===Z;return x(B0,{flexDirection:"column",paddingLeft:2,children:[x(Y0,{children:[x(Y0,{bold:!0,color:g?"cyan":"green",children:[g?"› ":" ",k," ",L.manifest.name]},void 0,!0,void 0,this),x(Y0,{color:"gray",children:[" v",L.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(B0,{paddingLeft:2,children:x(Y0,{color:"gray",children:L.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(B0,{paddingLeft:2,children:x(Y0,{color:"gray",dimColor:!0,children:["生效层级:"," ",w?.[L.manifest.name]?.effectiveScope??"default"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),L.commands.length>0&&x(B0,{paddingLeft:2,children:x(Y0,{color:"blue",children:["命令:"," ",L.commands.map((o)=>`/${o.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},L.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),x(B0,{marginTop:1,paddingLeft:2,flexDirection:"column",children:[x(Y0,{color:"gray",children:"可用命令:"},void 0,!1,void 0,this),x(Y0,{color:"gray",dimColor:!0,children:[" ","• /plugins list - 列出所有插件"]},void 0,!0,void 0,this),x(Y0,{color:"gray",dimColor:!0,children:[" ","• /plugins info <name> - 显示插件详情"]},void 0,!0,void 0,this),x(Y0,{color:"gray",dimColor:!0,children:[" ","• /plugins install <url> - 安装插件"]},void 0,!0,void 0,this),x(Y0,{color:"gray",dimColor:!0,children:[" ","• /plugins enable/disable <name> - 启用/禁用插件"]},void 0,!0,void 0,this),x(Y0,{color:"gray",dimColor:!0,children:[" ","• /plugins policy show|set - 来源与 SHA 策略"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(B0,{marginTop:1,children:x(Y0,{dimColor:!0,children:"↑/↓ 选择 · Space/Enter 启停 · s 切换层级 · u 信任并更新 · x 卸载 · r 刷新 · ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),G&&x(B0,{marginTop:1,children:x(Y0,{color:G.includes("失败")?"red":"cyan",children:G},void 0,!1,void 0,this)},void 0,!1,void 0,this),K&&x(Y0,{color:"gray",children:"处理中..."},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import{Box as J1,Text as Y1,useInput as DJ,useStdout as MX}from"ink";import CX from"ink-text-input";import oQ,{useCallback as L8,useMemo as IX,useState as O$}from"react";import{jsxDEV as W0}from"react/jsx-dev-runtime";var TX=oQ.memo(({option:$,index:Q,isSelected:Y,isMultiSelect:J,isHighlighted:Z})=>W0(J1,{flexDirection:"column",marginBottom:1,children:[W0(Y1,{color:Z?"yellow":Y?"green":void 0,bold:Z,children:[J?Y?"(*) ":"( ) ":Z?"> ":" ",Q+1,". ",$.label]},void 0,!0,void 0,this),W0(J1,{marginLeft:4,children:W0(Y1,{color:"gray",children:$.description},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)),fX=oQ.memo(({questions:$,answers:Q})=>W0(J1,{flexDirection:"column",marginBottom:1,children:$.map((Y)=>{let J=Q[Y.header],Z=Array.isArray(J)?J.join(", "):J||"(no answer)";return W0(J1,{marginBottom:1,children:[W0(Y1,{backgroundColor:"blue",color:"white",children:[" ",Y.header," "]},void 0,!0,void 0,this),W0(Y1,{color:"green",children:[" ",Z]},void 0,!0,void 0,this)]},Y.header,!0,void 0,this)})},void 0,!1,void 0,this)),VJ=oQ.memo(({questions:$,onComplete:Q,onCancel:Y})=>{let{stdout:J}=MX(),Z=J.columns||80,K=e0()==="confirmation-prompt",q=S0(!1),[G,U]=O$("answering"),[W,O]=O$(0),[H,z]=O$({}),[w,_]=O$(0),[F,C]=O$([]),[N,S]=O$(!1),[R,B]=O$(""),[f,P]=O$(0),A=$[W],T=IX(()=>{if(!A)return[];return[...A.options.map((l)=>({label:l.label,value:l.label,description:l.description})),{label:"Type something...",value:"__other__",description:"Enter custom response"}]},[A]),M=L8((l)=>{let a={...H,[A.header]:l};if(z(a),W<$.length-1)O(W+1),_(0),C([]),S(!1),B("");else U("submit"),P(0)},[H,A?.header,W,$.length]),L=L8((l)=>{let a=T[l];if(!a)return;if(a.value==="__other__"){S(!0);return}if(A.multiSelect)C((I)=>I.includes(a.value)?I.filter((y)=>y!==a.value):[...I,a.value]);else M(a.value)},[T,A?.multiSelect,M]),k=L8((l)=>{if(l.trim())M(l.trim())},[M]),g=L8(()=>{U("answering"),O(0),_(0),C([]),S(!1)},[]),o=L8(()=>{Q(H)},[H,Q]);if(DJ((l,a)=>{if(a.ctrl&&l==="c"||a.meta&&l==="c"){q();return}if(N){if(a.escape)S(!1),B("");return}if(a.escape){Y();return}let I=parseInt(l);if(I>=1&&I<=T.length){L(I-1);return}if(a.upArrow){_((y)=>y>0?y-1:T.length-1);return}if(a.downArrow||a.tab){_((y)=>y<T.length-1?y+1:0);return}if(a.return){if(A.multiSelect&&F.length>0)M(F);else L(w);return}if(l===" "&&A.multiSelect){let y=T[w];if(y&&y.value!=="__other__")C((v)=>v.includes(y.value)?v.filter((b)=>b!==y.value):[...v,y.value]);return}},{isActive:K&&G==="answering"&&!N}),DJ((l,a)=>{if(a.ctrl&&l==="c"||a.meta&&l==="c"){q();return}if(a.escape){Y();return}if(a.upArrow||a.downArrow||a.tab){P((I)=>I===0?1:0);return}if(a.return){if(f===0)o();else g();return}if(l.toLowerCase()==="y"){o();return}if(l.toLowerCase()==="e"){g();return}},{isActive:K&&G==="submit"}),G==="submit")return W0(J1,{flexDirection:"column",borderStyle:"round",borderColor:K?"green":"gray",padding:1,width:Math.min(Z-4,80),children:[W0(J1,{marginBottom:1,children:W0(Y1,{bold:!0,color:"green",children:"[OK] Review Your Answers"},void 0,!1,void 0,this)},void 0,!1,void 0,this),W0(fX,{questions:$,answers:H},void 0,!1,void 0,this),W0(J1,{flexDirection:"column",marginTop:1,children:[W0(Y1,{color:f===0?"yellow":void 0,bold:f===0,children:[f===0?"> ":" ","[Y] Submit answers"]},void 0,!0,void 0,this),W0(Y1,{color:f===1?"yellow":void 0,bold:f===1,children:[f===1?"> ":" ","[E] Edit answers"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),W0(J1,{marginTop:1,children:W0(Y1,{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(!A)return null;return W0(J1,{flexDirection:"column",borderStyle:"round",borderColor:K?"cyan":"gray",padding:1,width:Math.min(Z-4,80),children:[W0(J1,{marginBottom:1,children:[W0(Y1,{backgroundColor:"blue",color:"white",children:[" ",A.header," "]},void 0,!0,void 0,this),W0(Y1,{children:[" ",A.question]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),N?W0(J1,{flexDirection:"column",marginTop:1,children:[W0(Y1,{color:"yellow",children:"Enter your response:"},void 0,!1,void 0,this),W0(J1,{marginTop:1,children:[W0(Y1,{color:"cyan",children:"> "},void 0,!1,void 0,this),W0(CX,{value:R,onChange:B,onSubmit:k,focus:K},void 0,!1,void 0,this)]},void 0,!0,void 0,this),W0(J1,{marginTop:1,children:W0(Y1,{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):W0(J1,{flexDirection:"column",children:T.map((l,a)=>W0(TX,{option:l,index:a,isSelected:F.includes(l.value),isMultiSelect:A.multiSelect,isHighlighted:w===a},l.value,!1,void 0,this))},void 0,!1,void 0,this),!N&&W0(J1,{marginTop:1,flexDirection:"column",children:[W0(Y1,{color:"gray",children:A.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),A.multiSelect&&F.length>0&&W0(Y1,{color:"green",children:["Selected: ",F.join(", ")]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$.length>1&&W0(J1,{marginTop:1,children:W0(Y1,{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 kX}from"node:path";import{Box as n$,Text as b1,useInput as SX}from"ink";import vX from"ink-select-input";import{useEffect as nQ,useMemo as o$,useRef as pJ,useState as T2}from"react";function jJ($){return`${$.projectPath}\x00${$.sessionId}`}function hJ($){return $.title?.trim()||`Session ${$.sessionId.slice(0,8)}`}function EJ($){return $.taskDelivery?` | delivery:${$.taskDelivery.status}`:""}function gJ($,Q){if(Q!=="fork")return[...$];return $.filter((Y)=>Y.relationType!=="subagent")}function mJ($){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 DX($){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 VX($){return kX($)}function jX($){switch($){case"queued":return"QUEUED";case"running":return"RUNNING";case"failed":return"FAILED";case"cancelled":return"CANCELLED";case"interrupted":return"INTERRUPTED";case"completed":return"DONE"}}var hX=({isSelected:$})=>d0(n$,{marginRight:1,children:d0(b1,{color:$?"cyan":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),EX=({isSelected:$,label:Q})=>d0(b1,{color:$?"cyan":"white",bold:$,children:Q},void 0,!1,void 0,this),B8=20,cJ=({intent:$,sessions:Q,onSelect:Y,onCancel:J})=>{let[Z,X]=T2([]),[K,q]=T2(!1),[G,U]=T2(0),[W,O]=T2(!1),H=pJ(!1),z=pJ(!0);nQ(()=>{return z.current=!0,()=>{z.current=!1}},[]);let _=e0()==="session-selector",F=S0(!1);SX((A,T)=>{if(T.ctrl&&A==="c"||T.meta&&A==="c"){F();return}if(H.current)return;if(T.escape&&J){J();return}if(T.leftArrow||A==="h"||A==="H"){if(G>0)U((M)=>M-1);return}if(T.rightArrow||A==="l"||A==="L"){if(G<R-1)U((M)=>M+1);return}},{isActive:_}),nQ(()=>{if(Q){X(Q);return}(async()=>{q(!0);try{let T=await P0.listSessions({includeSubagents:!1});X(T)}catch(T){console.error("[SessionSelector] Failed to load sessions:",T),X([])}finally{q(!1)}})()},[Q]);let C=o$(()=>gJ(Q||Z,$),[$,Q,Z]),N=o$(()=>mJ($),[$]),S=o$(()=>{return C.map((A)=>{let T=VX(A.taskSourceProjectPath??A.projectPath),M=DX(A.lastMessageTime),L=hJ(A),k=`[${jX(A.taskStatus)}]`,g=A.gitBranch?` (${A.gitBranch})`:"",o=A.hasErrors?" [!]":"",l=A.taskRetriedFrom?` ↻ retry:${A.taskRetriedFrom.sessionId.slice(0,6)}`:A.relationType==="subagent"?" ↳ subagent":A.relationType==="fork"?" ↳ fork":"",a=A.taskIsolation==="worktree"?` | wt:${A.taskWorktreeBranch??"managed"}`:A.taskIsolation==="local"?" | local":"",I=A.taskDiffStat?` | ${A.taskDiffStat.changedFiles} files +${A.taskDiffStat.additions} -${A.taskDiffStat.deletions}`:"",y=A.taskStatus==="queued"&&A.taskQueuePosition?` | queue:${A.taskQueuePosition}/${A.taskQueueDepth??A.taskQueuePosition}`:"",v=EJ(A);return{key:jJ(A),label:`${k} ${L} · ${M} | ${T}${g} | ${A.messageCount} 条消息${a}${y}${I}${v}${o}${l}`,value:A}})},[C]),R=o$(()=>Math.max(1,Math.ceil(S.length/B8)),[S.length]),B=o$(()=>{let A=G*B8;return S.slice(A,A+B8)},[S,G]),f=o$(()=>({start:G*B8+1,end:Math.min((G+1)*B8,S.length)}),[G,S.length]);nQ(()=>{U(0)},[C.length]);let P=(A)=>{if(H.current)return;H.current=!0,O(!0);let T=()=>{if(!z.current)return;H.current=!1,O(!1)};Promise.resolve().then(()=>Y(A.value)).then(T,T)};if(K)return d0(n$,{flexDirection:"column",paddingX:2,paddingY:1,children:d0(b1,{children:"正在加载会话列表..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(C.length===0)return d0(n$,{flexDirection:"column",paddingX:2,paddingY:1,children:[d0(b1,{color:"yellow",children:"没有找到历史会话"},void 0,!1,void 0,this),d0(b1,{dimColor:!0,children:[`
|
|
154
|
+
`),_.push(jQ);let F=N0.renderedLineCount-K.length;_.push(W2(F))}_.push(i9),process.stdout.write(_.join("")),N0.renderedLineCount=K.length,N0.lastRenderedLines=K}function x1(){if(!N0.active)return;if(N0.renderedLineCount>0){let $=[];$.push(a9),$.push(W2(N0.renderedLineCount)),$.push("\r");for(let Q=0;Q<N0.renderedLineCount;Q++)if($.push(jQ),Q<N0.renderedLineCount-1)$.push(`
|
|
155
|
+
`);if(N0.renderedLineCount>1)$.push(W2(N0.renderedLineCount-1)),$.push("\r");$.push(i9),process.stdout.write($.join(""))}N0.active=!1,N0.renderedLineCount=0,N0.lastRenderedLines=[],N0.isFirstRender=!0}function S1(){return N0.active}import{Box as A5,Text as s9}from"ink";import P5 from"react";import{jsxDEV as hQ}from"react/jsx-dev-runtime";var EQ=P5.memo(({collapsedCount:$})=>{let Q=A0();if($<=0)return null;let Y=Q.colors.text.muted;return hQ(A5,{flexDirection:"row",marginBottom:1,children:[hQ(s9,{color:Y,children:[">"," ",$," 条历史消息"]},void 0,!0,void 0,this),hQ(s9,{color:Y,children:" [Ctrl+O 展开]"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});EQ.displayName="CollapsedHistorySummary";import{Box as N8,Text as F8}from"ink";import y5 from"ink-big-text";import R5 from"ink-gradient";import M5 from"react";import{jsxDEV as B1}from"react/jsx-dev-runtime";var $J=M5.memo(()=>{return B1(N8,{flexDirection:"column",paddingX:2,paddingTop:1,paddingBottom:1,children:[B1(N8,{flexDirection:"column",children:B1(R5,{name:"pastel",children:B1(y5,{text:"BLADE",font:"block"},void 0,!1,void 0,this)},void 0,!1,void 0,this)},void 0,!1,void 0,this),B1(N8,{marginBottom:1,children:B1(F8,{color:"white",dimColor:!0,children:e9()},void 0,!1,void 0,this)},void 0,!1,void 0,this),B1(N8,{flexDirection:"column",marginBottom:1,children:[B1(N8,{marginBottom:1,children:B1(F8,{color:"white",bold:!0,children:"使用指南:"},void 0,!1,void 0,this)},void 0,!1,void 0,this),B1(F8,{color:"white",children:"1. 输入问题、编辑文件或运行命令"},void 0,!1,void 0,this),B1(F8,{color:"white",children:"2. 使用 /init 创建项目配置文件"},void 0,!1,void 0,this),B1(F8,{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 B2,Text as gQ}from"ink";import QJ from"react";import{jsxDEV as Y$}from"react/jsx-dev-runtime";var JJ=QJ.memo(({tasks:$,visible:Q=!0,compact:Y=!1})=>{let{colors:J}=A0();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 Y$(B2,{flexDirection:"column",borderStyle:"single",borderColor:J.border.light,paddingX:1,paddingY:Y?0:1,marginBottom:1,children:[Y$(B2,{marginBottom:Y?0:1,children:[Y$(gQ,{dimColor:!0,children:"Tasks "},void 0,!1,void 0,this),Y$(gQ,{color:J.text.muted,children:[Z.completed,"/",Z.total]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Y$(B2,{flexDirection:"column",children:$.map((X,K)=>Y$(C5,{task:X,compact:Y},X.id||K,!1,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}),C5=QJ.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 Y$(B2,{paddingY:Q?0:0,children:Y$(gQ,{dimColor:J,children:[Y," ",Z]},void 0,!0,void 0,this)},void 0,!1,void 0,this)});import{Box as mQ,Text as a$}from"ink";import I5,{useMemo as YJ}from"react";import{jsxDEV as u1}from"react/jsx-dev-runtime";function T5($,Q=60){if(!$)return"";let Y=$.split(`
|
|
156
|
+
`)[0]||"";if(Y.length<=Q)return Y;return`${Y.slice(0,Q)}...`}function f5($){if(!$)return 0;return $.split(`
|
|
157
|
+
`).length}var pQ=I5.memo(({content:$,isStreaming:Q=!1,isExpanded:Y})=>{let J=A0(),Z=YJ(()=>f5($),[$]),X=YJ(()=>T5($),[$]),K=J.colors.info,q=J.colors.muted;return u1(mQ,{flexDirection:"column",marginBottom:1,children:[u1(mQ,{flexDirection:"row",children:[u1(a$,{color:K,children:Y?"v":">"},void 0,!1,void 0,this),u1(a$,{children:" "},void 0,!1,void 0,this),u1(a$,{color:q,children:["Thinking",Q?"...":` (${Z} lines)`]},void 0,!0,void 0,this),!Y&&!Q&&X&&u1(a$,{color:q,children:[" - ",X]},void 0,!0,void 0,this),u1(a$,{color:q,dimColor:!0,children:[" ","[Ctrl+T]"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Y&&$&&u1(mQ,{marginLeft:2,marginTop:1,borderStyle:"round",borderColor:"gray",paddingX:1,paddingY:0,children:u1(a$,{color:q,children:$},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});pQ.displayName="ThinkingBlock";import{jsxDEV as i0}from"react/jsx-dev-runtime";var XJ=v5.memo(()=>{let $=Q4(),Q=C4(),Y=I4(),J=T4(),Z=s1(),X=F4(),K=B4(),q=I8(),G=R4(),U=M4(),W=J4(),O=k4(),H=f4(),z=E$(),w=r9(),{stdout:_}=S5(),F=n1(),[C,N]=xQ(null),[S,R]=xQ([]),[B,f]=xQ(new Set),P=X$(H),A=X$(null),T=X$(0),M=X$(0),L=X$(new Set),k=X$(new Set),g=X$([]),o=X$(null);l1(()=>{if(P.current!==H){if(S1())x1();if(_)_.write(w2.clearTerminal);F.incrementClearCount(),P.current=H}},[H,_,F]);let l=$,a=J;l1(()=>{if(!J||Z){o.current=null;return}if(o.current===J)return;if(o.current=J,S1())x1();if(_)_.write(w2.eraseScreen+w2.cursorTo(0,0));L.current=new Set,k.current=new Set(l.filter((j)=>j.role==="tool").map((j)=>j.id)),A.current=null,T.current=0,M.current=0,g.current=[],R([]),f(new Set),F.incrementClearCount(),F.clearFinalizingStreamingMessageId()},[J,Z,_,F,l]);let I=Q??J;l1(()=>{if(S1())x1();A.current=null,T.current=0,M.current=0,L.current=new Set,k.current=new Set(l.filter((j)=>j.role==="tool").map((j)=>j.id)),g.current=[],R([]),f(new Set)},[W]),l1(()=>{if(!I)return;if(A.current===I)return;A.current=I,T.current=0,M.current=0,k.current=new Set(l.filter((j)=>j.role==="tool").map((j)=>j.id)),g.current=[],R([])},[I,l]),l1(()=>{if(!I)return;let j=uQ(I);if(!j||j.length<=T.current)return;let h=j.slice(T.current);T.current=j.length;let E=h,Z0=g.current;if(Z0.length>0)if(E.some((c0)=>c0.type!=="empty"))E=[...Z0,...E],g.current=[];else{g.current=[...Z0,...E];return}let J0=E.length;while(J0>0&&E[J0-1].type==="empty")J0-=1;if(J0!==E.length)g.current=E.slice(J0),E=E.slice(0,J0);if(E.length===0)return;let w0=M.current;M.current+=1;let k0=w0>0;if(S1())x1();f((c0)=>{if(!I||c0.has(I))return c0;let h0=new Set(c0);return h0.add(I),h0}),R((c0)=>[...c0,i0(Z$,{flexDirection:"column",children:i0(J$,{content:"",role:"assistant",terminalWidth:z,isPending:!1,hidePrefix:k0,noMargin:!0,blocksOverride:E,renderCodeBlocksAsPlainText:!1},void 0,!1,void 0,this)},`streaming-${I}-${w0}`,!1,void 0,this)])},[I,Y.version,z,W]),l1(()=>{if(!I)return;let j=k.current,h=l.filter((E)=>E.role==="tool"&&!j.has(E.id)&&!L.current.has(E.id));if(h.length===0)return;if(S1())x1();for(let E of h)L.current.add(E.id);R((E)=>[...E,...h.map((Z0)=>i0(Z$,{flexDirection:"column",children:i0(J$,{content:Z0.content,role:Z0.role,terminalWidth:z,metadata:Z0.metadata,isPending:!1,messageId:Z0.id},void 0,!1,void 0,this)},`streaming-tool-${Z0.id}`,!1,void 0,this))])},[I,l,z]),l1(()=>{if(!I){if(S1())x1();return}if(!S1())o9(z,w);else n9(z,w);let j=ZJ(I);if(!j||j.lines.length===0)return;let E=Math.max(1,w-8),Z0=Math.max(0,j.lines.length-E),J0=j.lines.slice(-E),w0=(uQ(I)?.length??0)>0;t9(J0,Z0,j.mode,w0)},[I,Y.version,w,z]),l1(()=>{if(!I&&S1())x1()},[I]),l1(()=>{if(C===null&&l.length>O){if(N(l.length),S1())x1();if(_)_.write(w2.clearTerminal);F.incrementClearCount()}},[l.length,O,C,_,F]);let y=cQ(()=>{return X.some((j)=>j.status==="pending"||j.status==="in_progress")},[X]),v=H?0:C??0,b=v,V=cQ(()=>{let j=[];if(j.push(i0($J,{},"header",!1,void 0,this)),b>0)j.push(i0(EQ,{collapsedCount:b},"collapsed-summary",!1,void 0,this));for(let h=v;h<l.length;h++){let E=l[h];if(a&&E.id===a)continue;if(E.role==="tool"&&L.current.has(E.id))continue;if(E.role==="assistant"&&B.has(E.id))continue;j.push(i0(Z$,{flexDirection:"column",children:i0(J$,{content:E.content,role:E.role,terminalWidth:z,metadata:E.metadata,isPending:!1,messageId:E.id},void 0,!1,void 0,this)},E.id,!1,void 0,this))}return j},[l,v,b,z,a,B]),p=cQ(()=>S.length>0?[...V,...S]:V,[V,S]);return i0(Z$,{flexDirection:"column",paddingX:2,children:i0(Z$,{flexDirection:"column",children:[i0(k5,{items:p,children:(j)=>j},W,!1,void 0,this),G&&i0(Z$,{marginBottom:1,children:i0(pQ,{content:G,isStreaming:Z,isExpanded:U},void 0,!1,void 0,this)},void 0,!1,void 0,this),K&&y&&i0(Z$,{marginTop:1,children:i0(JJ,{tasks:X,visible:!0,compact:!1},void 0,!1,void 0,this)},void 0,!1,void 0,this),q.map((j,h)=>i0(Z$,{flexDirection:"column",children:i0(J$,{content:j.displayText,role:"user",terminalWidth:z},void 0,!1,void 0,this)},`pending-${h}`,!1,void 0,this))]},void 0,!0,void 0,this)},void 0,!1,void 0,this)});import{useMemoizedFn as b2,useMount as D5}from"ahooks";import{Box as w1,Text as H0,useFocus as V5,useFocusManager as j5,useInput as h5}from"ink";import E5 from"ink-select-input";import{memo as g5,useMemo as m5,useState as A2}from"react";import{jsxDEV as e,Fragment as x5}from"react/jsx-dev-runtime";var p5=({isSelected:$})=>e(w1,{marginRight:1,children:e(H0,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),c5=({isSelected:$,label:Q})=>e(H0,{bold:$,color:$?"yellow":void 0,children:Q},void 0,!1,void 0,this),KJ=g5(({onClose:$,onEdit:Q})=>{let Y=w4(),J=C8()??"",{isFocused:Z}=V5({id:"model-selector"}),X=j5(),[K,q]=A2(""),[G,U]=A2(!1),[W,O]=A2(null),H=S0(!1),[z]=A2(()=>{let P=process.stdout?.columns||80;return Math.max(20,P-8)});D5(()=>{if(X?.focus("model-selector"),Y.length>0)q(Y[0].id)}),h5((P,A)=>{if(G)return;if(A.ctrl&&P==="c"||A.meta&&P==="c"){H();return}if(A.escape){$();return}if(!Z)return;if(P==="d"||P==="D"){_();return}if((P==="e"||P==="E")&&Q)F()},{isActive:!0});let w=b2(async(P)=>{if(G)return;let A=P.value;if(A===J){$();return}U(!0),O(null);try{await m0().setCurrentModel(A),$()}catch(T){O(T.message),U(!1)}}),_=b2(async()=>{if(G||K===J)return;U(!0),O(null);try{if(await m0().removeModel(K),Y.length<=1)$()}catch(P){O(P.message)}finally{U(!1)}}),F=b2(()=>{if(G||!Q)return;let P=Y.find((A)=>A.id===K);if(!P)return;Q(P)}),C=b2((P)=>{q(P.value)}),N=m5(()=>{return Y.find((P)=>P.id===K)},[Y,K]),S=N?P2()?.modelProviders[N.provider]:void 0,R=Y.map((P)=>{let A=P.id===J?" (当前)":"";return{label:lQ(P)+A,value:P.id}}),B=K===J;return e(w1,{flexDirection:"column",borderStyle:"round",borderColor:"gray",padding:1,width:"100%",children:[e(w1,{flexDirection:"row",justifyContent:"space-between",marginBottom:1,children:[e(H0,{bold:!0,color:"cyan",children:"模型管理"},void 0,!1,void 0,this),e(H0,{dimColor:!0,children:[G?"处理中...":B?"Enter=关闭 • E=编辑 • Esc=取消":"Enter=切换 • D=删除 • E=编辑 • Esc=取消"," • Ctrl+C=退出"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),e(w1,{flexDirection:"row",children:[e(w1,{flexDirection:"column",flexGrow:2,marginRight:2,borderStyle:"single",borderColor:"gray",padding:1,children:[e(H0,{dimColor:!0,children:["已配置模型 (",Y.length,")"]},void 0,!0,void 0,this),e(w1,{marginTop:1,children:e(E5,{items:R,onSelect:w,onHighlight:C,indicatorComponent:p5,itemComponent:c5},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),e(w1,{flexDirection:"column",flexGrow:3,borderStyle:"single",borderColor:"gray",padding:1,children:[e(H0,{dimColor:!0,children:"模型详情"},void 0,!1,void 0,this),e(w1,{marginY:1,children:e(H0,{color:B?"green":"yellow",children:B?"* 当前使用":"* 可切换"},void 0,!1,void 0,this)},void 0,!1,void 0,this),N?e(w1,{flexDirection:"column",children:[e(H0,{children:[e(H0,{dimColor:!0,children:"名称: "},void 0,!1,void 0,this),e(H0,{bold:!0,color:"cyan",children:lQ(N)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),e(H0,{children:[e(H0,{dimColor:!0,children:"Provider: "},void 0,!1,void 0,this),e(H0,{bold:!0,children:S?.name??N.provider},void 0,!1,void 0,this)]},void 0,!0,void 0,this),S&&e(x5,{children:[e(H0,{children:[e(H0,{dimColor:!0,children:"Channel ID: "},void 0,!1,void 0,this),e(H0,{children:N.provider},void 0,!1,void 0,this)]},void 0,!0,void 0,this),e(H0,{children:[e(H0,{dimColor:!0,children:"Wire API: "},void 0,!1,void 0,this),e(H0,{children:S.wireApi},void 0,!1,void 0,this)]},void 0,!0,void 0,this),e(H0,{children:[e(H0,{dimColor:!0,children:"Endpoint: "},void 0,!1,void 0,this),e(H0,{color:"blueBright",children:S.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),e(H0,{children:[e(H0,{dimColor:!0,children:"Model: "},void 0,!1,void 0,this),e(H0,{bold:!0,children:N.model},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N.overrides?.baseUrl&&e(H0,{children:[e(H0,{dimColor:!0,children:"Base URL override: "},void 0,!1,void 0,this),e(H0,{color:"blueBright",children:N.overrides.baseUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this),e(H0,{children:[e(H0,{dimColor:!0,children:"Context Window: "},void 0,!1,void 0,this),e(H0,{children:E1().resolveConfig(N).contextWindow},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this):e(H0,{dimColor:!0,children:"请选择一个模型查看详情"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),W&&e(w1,{marginTop:1,children:e(H0,{color:"red",children:W},void 0,!1,void 0,this)},void 0,!1,void 0,this),e(w1,{justifyContent:"center",marginTop:1,children:e(H0,{dimColor:!0,children:"─".repeat(z)},void 0,!1,void 0,this)},void 0,!1,void 0,this),e(w1,{justifyContent:"center",children:e(H0,{dimColor:!0,children:"提示:D=删除 * E=编辑 * Up/Down=移动 * Enter/ESC=确认"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)});import{useMemoizedFn as dQ}from"ahooks";import{Box as UX,Text as rQ,useInput as OX}from"ink";import{useState as R$}from"react";import{Box as P$,Text as d1,useInput as u5}from"ink";import l5 from"ink-text-input";import{jsxDEV as o0}from"react/jsx-dev-runtime";var GJ=({provider:$,value:Q,onChange:Y,onSubmit:J,onCancel:Z,error:X})=>{return u5((K,q)=>{if(q.escape)Z()}),o0(P$,{flexDirection:"column",children:[o0(P$,{marginBottom:1,children:o0(d1,{bold:!0,color:"blue",children:"Step 2: 输入 API Key"},void 0,!1,void 0,this)},void 0,!1,void 0,this),o0(P$,{marginBottom:1,children:o0(d1,{children:["Provider: ",o0(d1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),o0(P$,{marginBottom:1,children:o0(d1,{dimColor:!0,children:"API 密钥将存储在 ~/.blade/auth.json(权限 600),不会写入模型配置"},void 0,!1,void 0,this)},void 0,!1,void 0,this),o0(P$,{children:[o0(d1,{bold:!0,color:"cyan",children:[">"," "]},void 0,!0,void 0,this),o0(l5,{value:Q,onChange:Y,onSubmit:J,placeholder:"sk-...",mask:"*"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X&&o0(P$,{marginTop:1,children:o0(d1,{color:"red",children:X},void 0,!1,void 0,this)},void 0,!1,void 0,this),o0(P$,{marginTop:1,children:o0(d1,{dimColor:!0,children:["输入完成后按 ",o0(d1,{bold:!0,children:"Enter"},void 0,!1,void 0,this),",",o0(d1,{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{Box as y2,Text as K$,useInput as d5}from"ink";import r5 from"ink-text-input";import{useState as R2}from"react";import{jsxDEV as N1}from"react/jsx-dev-runtime";var M2=["id","name","baseUrl","model"];function qJ($){switch($){case"id":return"Channel ID";case"name":return"Channel name";case"baseUrl":return"Base URL";case"model":return"Model ID"}}function a5($,Q,Y){switch($){case"id":return"team-gateway";case"name":return Y||"Team Gateway";case"baseUrl":return Q==="anthropic-messages"?"https://gateway.example.com":"https://gateway.example.com/v1";case"model":return Q==="anthropic-messages"?"claude-opus-4-8":"vendor-model-2026"}}function i5($,Q){let Y=$.id.trim(),J={name:$.name.trim()||Y,baseUrl:$.baseUrl.trim(),wireApi:Q},Z=OJ(Y,J);if(!$.model.trim())Z.push("Model ID must not be empty");if(Z.length>0)throw Error(Z[0]);return{provider:Y,model:$.model.trim(),displayName:$.model.trim(),modelProvider:J}}var zJ=({wireApi:$,initialConfig:Q,onSubmit:Y,onCancel:J})=>{let Z={id:Q?.provider??"",name:Q?.modelProvider?.name??"",baseUrl:Q?.modelProvider?.baseUrl??"",model:Q?.model??""},[X,K]=R2(Q?3:0),[q,G]=R2(Q?.model??""),[U,W]=R2(Z),[O,H]=R2(),z=M2[X];d5((_,F)=>{if(!F.escape)return;if(H(void 0),X===0){J();return}let C=X-1,N=M2[C];K(C),G(U[N])});let w=(_)=>{let F=_.trim();if(z==="id"&&!UJ.test(F)){H("Channel ID 必须以小写字母开头,且仅包含小写字母、数字、.、_ 或 -");return}if(z==="baseUrl")try{let N=new URL(F);if(!["http:","https:"].includes(N.protocol))throw Error()}catch{H("Base URL 必须是绝对 HTTP(S) URL");return}if(z==="model"&&!F){H("Model ID 不能为空");return}let C={...U,[z]:z==="name"&&!F?U.id:F};if(W(C),H(void 0),X===M2.length-1){try{Y(i5(C,$))}catch(N){H(N instanceof Error?N.message:"渠道配置无效")}return}K(X+1),G("")};return N1(y2,{flexDirection:"column",children:[N1(y2,{marginBottom:1,children:N1(K$,{bold:!0,color:"blue",children:"配置自定义 Provider 渠道"},void 0,!1,void 0,this)},void 0,!1,void 0,this),N1(K$,{dimColor:!0,children:["Protocol:"," ",$==="anthropic-messages"?"Anthropic Messages":"OpenAI Chat Completions"]},void 0,!0,void 0,this),M2.slice(0,X).map((_)=>N1(K$,{children:[qJ(_),": ",N1(K$,{color:"cyan",children:U[_]},void 0,!1,void 0,this)]},_,!0,void 0,this)),N1(y2,{marginTop:1,children:[N1(K$,{bold:!0,children:[qJ(z),": "]},void 0,!0,void 0,this),N1(r5,{value:q,onChange:(_)=>{G(_),H(void 0)},onSubmit:w,placeholder:a5(z,$,U.id)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z==="name"&&N1(K$,{dimColor:!0,children:"留空使用 Channel ID"},void 0,!1,void 0,this),O&&N1(K$,{color:"red",children:O},void 0,!1,void 0,this),N1(y2,{marginTop:1,children:N1(K$,{dimColor:!0,children:"Enter 继续 · Esc 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useEffect as FJ,useState as i$}from"react";var HJ=()=>{let[$,Q]=i$([]),[Y,J]=i$(!0),[Z,X]=i$(null);return FJ(()=>{(async()=>{try{Q(await _J())}catch(q){X(q instanceof Error?q.message:"加载 Provider 列表失败")}finally{J(!1)}})()},[]),{providers:$,isLoading:Y,error:Z}},WJ=($)=>{let[Q,Y]=i$([]),[J,Z]=i$(!1),[X,K]=i$(null);return FJ(()=>{if(!$){Y([]);return}(async()=>{Z(!0),K(null);try{Y(await NJ($))}catch(G){K(G instanceof Error?G.message:"加载模型列表失败")}finally{Z(!1)}})()},[$]),{models:Q,isLoading:J,error:X}};import{Box as r1,Text as M1,useInput as o5}from"ink";import n5 from"ink-select-input";import t5 from"ink-text-input";import{useMemo as LJ,useState as s5}from"react";import{jsxDEV as E0,Fragment as JX}from"react/jsx-dev-runtime";var e5=({isSelected:$})=>E0(r1,{marginRight:1,children:E0(M1,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),$X=($)=>{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($.reasoning)Q.push("[reasoning]");if($.input.includes("image"))Q.push("[vision]");if($.cost.input||$.cost.output)Q.push(`[$${$.cost.input}/$${$.cost.output}]`);return Q.join(" ")},QX=({isSelected:$,label:Q})=>E0(M1,{bold:$,color:$?"yellow":void 0,children:Q},void 0,!1,void 0,this),BJ=({provider:$,models:Q,isLoading:Y,error:J,onSelect:Z,onCancel:X})=>{let[K,q]=s5("");o5((W,O)=>{if(O.escape)if(K)q("");else X()});let G=LJ(()=>{if(!K)return Q;let W=K.toLowerCase();return Q.filter((O)=>O.name.toLowerCase().includes(W)||O.id.toLowerCase().includes(W))},[Q,K]),U=LJ(()=>G.map((W)=>({key:W.id,label:$X(W),value:W})),[G]);if(Y)return E0(r1,{flexDirection:"column",children:E0(M1,{color:"yellow",children:["正在加载 ",$.name," 模型列表..."]},void 0,!0,void 0,this)},void 0,!1,void 0,this);if(J)return E0(r1,{flexDirection:"column",children:[E0(M1,{color:"red",children:J},void 0,!1,void 0,this),E0(M1,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return E0(r1,{flexDirection:"column",children:[E0(r1,{marginBottom:1,children:E0(M1,{bold:!0,color:"blue",children:"Step 3: 选择模型"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E0(r1,{marginBottom:1,children:E0(M1,{children:["Provider: ",E0(M1,{bold:!0,children:$.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),E0(JX,{children:[E0(r1,{marginBottom:1,children:[E0(M1,{color:"cyan",children:"> "},void 0,!1,void 0,this),E0(t5,{value:K,onChange:q,placeholder:`搜索 ${Q.length} 个模型...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),E0(r1,{marginBottom:1,children:E0(M1,{dimColor:!0,children:"模型元数据来自内置 catalog"},void 0,!1,void 0,this)},void 0,!1,void 0,this),E0(r1,{flexDirection:"column",height:12,children:E0(n5,{items:U,onSelect:(W)=>Z(W.value),indicatorComponent:e5,itemComponent:QX,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),G.length===0&&E0(M1,{color:"yellow",children:"内置 catalog 中没有匹配模型"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)};import{Box as y$,Text as G$,useInput as YX}from"ink";import ZX from"ink-select-input";import XX from"ink-text-input";import{useMemo as wJ,useState as KX}from"react";import{jsxDEV as n0}from"react/jsx-dev-runtime";var GX=({isSelected:$})=>n0(y$,{marginRight:1,children:n0(G$,{color:$?"yellow":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),qX=({isSelected:$,label:Q})=>n0(G$,{bold:$,color:$?"yellow":void 0,children:Q},void 0,!1,void 0,this),bJ=({providers:$,isLoading:Q,error:Y,onSelect:J,onCancel:Z})=>{let[X,K]=KX("");YX((U,W)=>{if(W.escape)if(X)K("");else Z()});let q=wJ(()=>{if(!X)return $;let U=X.toLowerCase();return $.filter((W)=>W.name.toLowerCase().includes(U)||W.id.toLowerCase().includes(U))},[$,X]),G=wJ(()=>q.map((U)=>({key:U.id,label:`${U.name} - ${U.modelCount} models${U.configured?" [configured]":""}`,value:U})),[q]);if(Q)return n0(y$,{flexDirection:"column",children:n0(G$,{color:"yellow",children:"正在加载 Provider 列表..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Y)return n0(y$,{flexDirection:"column",children:[n0(G$,{color:"red",children:Y},void 0,!1,void 0,this),n0(G$,{dimColor:!0,children:"按 Esc 返回"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return n0(y$,{flexDirection:"column",children:[n0(y$,{marginBottom:1,children:n0(G$,{bold:!0,color:"blue",children:"Step 1: 选择 API 提供商"},void 0,!1,void 0,this)},void 0,!1,void 0,this),n0(y$,{marginBottom:1,children:[n0(G$,{color:"cyan",children:"> "},void 0,!1,void 0,this),n0(XX,{value:X,onChange:K,placeholder:`搜索 ${$.length} 个 Provider...`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),n0(y$,{flexDirection:"column",height:12,children:n0(ZX,{items:G,onSelect:(U)=>J(U.value),indicatorComponent:GX,itemComponent:qX,limit:10},void 0,!1,void 0,this)},void 0,!1,void 0,this),q.length===0&&n0(G$,{color:"yellow",children:"未找到匹配的 Provider,按 Esc 清除搜索"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};function AJ($){if($==="custom")return"provider";if($==="model")return"provider";if($==="credential")return"model";return}import{jsxDEV as q$}from"react/jsx-dev-runtime";var aQ=({mode:$,initialConfig:Q,modelId:Y,onComplete:J,onCancel:Z})=>{let[X,K]=R$("provider"),[q,G]=R$(),[U,W]=R$(),[O,H]=R$(),[z,w]=R$(""),[_,F]=R$(),[C,N]=R$(!1),S=HJ(),R=WJ(q?.id),B=S0(!1);OX((T,M)=>{if(M.ctrl&&T==="c"||M.meta&&T==="c")$==="setup"?B():Z()});let f=dQ(async(T)=>{if(!q)return;let M=O??(U?{provider:q.id,model:U.id,displayName:Q?.displayName}:void 0);if(!M)return;N(!0),F(void 0);try{if(M.modelProvider)E1().registerModelProvider(M.provider,M.modelProvider,[M.model]);if(T?.trim())await E1().setApiKey(M.provider,T.trim());let L={displayName:M.displayName,provider:M.provider,model:M.model,overrides:M.overrides};if($==="setup")await J(M);else if($==="add"){let k=M.modelProvider?await m0().addModelWithProvider(L,M.modelProvider):await m0().addModel(L);await m0().setCurrentModel(k.id),await J(M)}else if(Y){if(M.modelProvider)await m0().updateModelWithProvider(Y,L,M.modelProvider);else await m0().updateModel(Y,L);await J(M)}}catch(L){if(M.modelProvider){await E1().credentials.delete(M.provider);let k=P2();E1().configureModelProviders(k?.modelProviders??{},k?.models??[])}F(L instanceof Error?L.message:"保存配置失败"),N(!1)}}),P=dQ((T)=>{if(W(T),q?.configured)f();else if(q?.supportsApiKey)K("credential");else F(`${q?.name??"Provider"} 需要 OAuth 或环境凭证,请先在外部完成认证`)}),A=dQ(()=>{if(F(void 0),X==="credential"&&O){K("custom");return}let T=AJ(X);if(T)K(T)});return q$(UX,{flexDirection:"column",padding:1,children:[q$(rQ,{bold:!0,color:"blue",children:$==="edit"?"编辑模型":"添加模型"},void 0,!1,void 0,this),X==="provider"&&q$(bJ,{...S,onSelect:(T)=>{G(T),W(void 0),H(void 0),K(T.factoryWireApi?"custom":"model")},onCancel:$==="setup"?()=>{return}:Z},void 0,!1,void 0,this),X==="custom"&&q?.factoryWireApi&&q$(zJ,{wireApi:q.factoryWireApi,initialConfig:O,onSubmit:(T)=>{H(T),K("credential")},onCancel:A},void 0,!1,void 0,this),X==="model"&&q&&q$(BJ,{provider:q,...R,onSelect:P,onCancel:A},void 0,!1,void 0,this),X==="credential"&&q&&q$(GJ,{provider:q,value:z,onChange:w,onSubmit:()=>void f(z),onCancel:A,error:_},void 0,!1,void 0,this),C&&q$(rQ,{color:"yellow",children:"正在保存配置..."},void 0,!1,void 0,this),_&&X!=="credential"&&q$(rQ,{color:"red",children:_},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useMemoizedFn as H8}from"ahooks";import{promises as MJ}from"fs";import{Box as F1,Text as V0,useInput as zX}from"ink";import PJ from"ink-select-input";import _X from"ink-text-input";import NX from"os";import C2 from"path";import{useEffect as FX,useMemo as I2,useRef as HX,useState as U$}from"react";import{jsxDEV as U0}from"react/jsx-dev-runtime";var W8=[{key:"allow",label:"Allow"},{key:"ask",label:"Ask"},{key:"deny",label:"Deny"},{key:"info",label:"Info"}],WX={allow:"Add a new rule...",ask:"Add a new rule...",deny:"Add a new rule..."},LX={allow:"Allow permission rules",ask:"Ask permission rules",deny:"Deny permission rules"},yJ={project:"[项目共享配置]",global:"[用户全局配置]",local:"[本地配置]"},BX=["project","global","local"],wX={allow:[],ask:[],deny:[]},bX={localExists:!1,projectExists:!1,globalExists:!1},RJ={allow:[],ask:[],deny:[]};function AX($){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 PX($){try{let Q=await MJ.readFile($,"utf-8"),Y=JSON.parse(Q);return{exists:!0,raw:Y,permissions:AX(Y)}}catch(Q){if(Q.code==="ENOENT")return{exists:!1,raw:{},permissions:{...RJ}};return console.warn(`[PermissionsManager] Failed to read ${$}:`,Q),{exists:!0,raw:{},permissions:{...RJ}}}}function yX($,Q){let Y=$.padEnd(32," "),J=Q==="local"?`${yJ[Q]} <- 可删除`:yJ[Q];return`${Y} ${J}`}var CJ=({onClose:$})=>{let Y=e0()==="permissions-manager",J=S0(!1),[Z,X]=U$(0),K=W8[Z].key,[q,G]=U$(wX),[U,W]=U$(bX),[O,H]=U$(!0),[z,w]=U$("list"),[_,F]=U$(""),[C,N]=U$(null),[S,R]=U$(null),B=HX(!1),f=I2(()=>C2.join(l0(),".blade","settings.local.json"),[]),P=I2(()=>C2.join(l0(),".blade","settings.json"),[]),A=I2(()=>C2.join(NX.homedir(),".blade","settings.json"),[]),T=H8(async()=>{H(!0);let j=await Promise.all([{source:"local",path:f},{source:"project",path:P},{source:"global",path:A}].map(async({source:J0,path:w0})=>{let k0=await PX(w0);return{source:J0,path:w0,...k0}})),h={localExists:j.find((J0)=>J0.source==="local")?.exists??!1,projectExists:j.find((J0)=>J0.source==="project")?.exists??!1,globalExists:j.find((J0)=>J0.source==="global")?.exists??!1};W(h);let E={allow:[],ask:[],deny:[]},Z0=Object.fromEntries(j.map((J0)=>[J0.source,J0]));["allow","ask","deny"].forEach((J0)=>{BX.forEach((w0)=>{(Z0[w0]?.permissions[J0]??[]).forEach((c0,h0)=>{let H1={key:`${w0}:${h0}:${c0}`,rule:c0,source:w0};E[J0].push(H1)})})}),G(E),H(!1)});FX(()=>{T()},[T]);let M=H8(async(p,j)=>{try{let h=C2.join(l0(),".blade","settings.local.json"),E={allow:[],ask:[],deny:[]};try{let J0=await MJ.readFile(h,"utf-8"),k0=JSON.parse(J0).permissions||{};E={allow:Array.isArray(k0.allow)?k0.allow:[],ask:Array.isArray(k0.ask)?k0.ask:[],deny:Array.isArray(k0.deny)?k0.deny:[]}}catch(J0){}let Z0=j(E);await m0().updateConfig({permissions:Z0},{scope:"local",immediate:!0}),await T()}catch(h){throw console.error("[PermissionsManager] 修改权限规则失败:",h),h}});zX((p,j)=>{if(j.ctrl&&p==="c"||j.meta&&p==="c"){J();return}if(z==="locked"){if(B.current){B.current=!1;return}w("list"),N(null),R(null);return}if(j.escape){if(z==="list"||K==="info")$();else w("list"),F(""),N(null),R(null);return}if(z==="list"){if(j.tab&&j.shift)X((h)=>(h-1+W8.length)%W8.length);else if(j.tab)X((h)=>(h+1)%W8.length);else if(p?.toLowerCase()==="q")$()}},{isActive:Y});let L=H8((p)=>{let j=p.value;if(K==="info")return;if(j.type==="add"){w("add"),F(""),R(null);return}if(j.entry.source!=="local"){w("locked"),B.current=!0,N({tab:K,entry:j.entry}),R({type:"error",text:j.entry.source==="project"?"此规则定义在项目共享配置中,无法在此删除。":"此规则来自用户全局配置,无法在此删除。"});return}w("confirm-delete"),N({tab:K,entry:j.entry}),R(null)}),k=H8(async()=>{if(K==="info")return;let p=_.trim();if(!p){R({type:"error",text:"Permission rule 不能为空"});return}if(q[K].map((h)=>h.rule).includes(p)){R({type:"error",text:"该规则已存在"});return}try{await M(K,(h)=>{let E={allow:[...h.allow],ask:[...h.ask],deny:[...h.deny]};return E[K]=[...new Set([...h[K],p])],E}),w("list"),F(""),R({type:"success",text:"已添加本地权限规则"})}catch(h){R({type:"error",text:`保存失败: ${h instanceof Error?h.message:"未知错误"}`})}}),g=H8(async()=>{if(!C)return;let{tab:p,entry:j}=C;try{await M(p,(h)=>{let E={allow:[...h.allow],ask:[...h.ask],deny:[...h.deny]};return E[p]=h[p].filter((Z0)=>Z0!==j.rule),E}),w("list"),N(null),R({type:"success",text:"已删除本地权限规则"})}catch(h){R({type:"error",text:`删除失败: ${h instanceof Error?h.message:"未知错误"}`})}}),o=I2(()=>{if(K==="info")return[];let p=K;return[{key:"add-new-rule",label:`› ${WX[p]}`,value:{type:"add"}},...q[p].map((h)=>({key:h.key,label:yX(h.rule,h.source),value:{type:"rule",entry:h}}))]},[K,q]),l=()=>U0(F1,{marginBottom:1,children:W8.map((p,j)=>U0(F1,{marginRight:2,children:U0(V0,{color:j===Z?"yellow":"gray",children:["[",p.label,"]"]},void 0,!0,void 0,this)},p.key,!1,void 0,this))},void 0,!1,void 0,this),a=()=>U0(F1,{flexDirection:"column",gap:1,children:[U0(V0,{children:"配置文件优先级(从高到低):"},void 0,!1,void 0,this),U0(F1,{flexDirection:"column",marginLeft:2,children:[U0(V0,{children:["1. .blade/settings.local.json (本地配置,不提交 Git)"," ",U.localExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),U0(V0,{children:["2. .blade/settings.json (项目配置,提交 Git)"," ",U.projectExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this),U0(V0,{children:["3. ~/.blade/settings.json (用户全局配置)"," ",U.globalExists?"[OK] 存在":"[X] 不存在"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),U0(V0,{children:"说明:"},void 0,!1,void 0,this),U0(F1,{flexDirection:"column",marginLeft:2,children:[U0(V0,{children:"- /permissions 命令只管理本地配置 (.blade/settings.local.json)"},void 0,!1,void 0,this),U0(V0,{children:"- 修改全局或项目配置请直接编辑对应文件"},void 0,!1,void 0,this),U0(V0,{children:"- 本地配置不会提交到 Git"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),I=(p)=>U0(F1,{flexDirection:"column",gap:1,children:[U0(V0,{bold:!0,children:LX[p]},void 0,!1,void 0,this),U0(V0,{children:"Permission rules are a tool name, optionally followed by a specifier in parentheses."},void 0,!1,void 0,this),U0(V0,{color:"gray",children:"例如: WebFetch 或 Bash(ls:*)"},void 0,!1,void 0,this),U0(F1,{marginTop:1,children:U0(_X,{value:_,onChange:F,onSubmit:k},void 0,!1,void 0,this)},void 0,!1,void 0,this),U0(V0,{color:"gray",children:"Enter 提交 · Esc 取消"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),y=(p,j)=>U0(F1,{flexDirection:"column",gap:1,children:[U0(V0,{bold:!0,children:["Delete ",p," permission rule?"]},void 0,!0,void 0,this),U0(V0,{children:j.rule},void 0,!1,void 0,this),U0(V0,{color:"gray",children:"From project local settings"},void 0,!1,void 0,this),U0(V0,{children:"Are you sure you want to delete this permission rule?"},void 0,!1,void 0,this),U0(PJ,{items:[{label:"Yes",value:"yes"},{label:"No",value:"no"}],onSelect:(h)=>{if(h.value==="yes")g();else w("list"),N(null)}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),v=(p)=>U0(F1,{flexDirection:"column",gap:1,children:[U0(V0,{bold:!0,children:"Cannot delete this rule"},void 0,!1,void 0,this),U0(V0,{children:p.rule},void 0,!1,void 0,this),U0(V0,{color:"gray",children:p.source==="project"?"This rule is defined in .blade/settings.json. 请手动编辑该文件以移除规则。":"This rule is defined in ~/.blade/settings.json. 请手动编辑该文件以移除规则。"},void 0,!1,void 0,this),U0(V0,{color:"gray",children:"按任意键继续"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),b=(p)=>U0(PJ,{items:o,isFocused:z==="list",onSelect:L},void 0,!1,void 0,this),V=()=>{if(O)return U0(V0,{children:"加载中..."},void 0,!1,void 0,this);if(K==="info")return a();if(z==="add")return I(K);if(z==="confirm-delete"&&C)return y(C.tab,C.entry);if(z==="locked"&&C)return v(C.entry);return b(K)};return U0(F1,{flexDirection:"column",borderStyle:"round",borderColor:Y?"cyan":"gray",padding:1,width:80,children:[U0(V0,{color:"cyan",bold:!0,children:"权限管理器"},void 0,!1,void 0,this),l(),U0(F1,{flexDirection:"column",gap:1,children:V()},void 0,!1,void 0,this),S&&U0(F1,{marginTop:1,children:U0(V0,{color:S.type==="success"?"green":"red",children:S.text},void 0,!1,void 0,this)},void 0,!1,void 0,this),U0(F1,{marginTop:1,children:U0(V0,{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 B0,Text as Y0,useInput as RX}from"ink";import{useEffect as MX,useState as M$}from"react";import{jsxDEV as x}from"react/jsx-dev-runtime";var iQ=["local","project","global"];function DJ({workspaceRoot:$,onCancel:Q}){let Y=TJ($),J=Y.getAll(),[Z,X]=M$(0),[K,q]=M$(!1),[G,U]=M$(""),[W,O]=M$(null),[H,z]=M$("local"),[w,_]=M$(null),[F,C]=M$(0),N=Y.getBySource(),S=Y.getStats(),R=Y.getSourcePolicy(),B=S0(!1,Q);MX(()=>{let L=!0;return IJ.getInstance().loadWorkspacePluginSettingsResolution(Y.getWorkspaceRoot()).then((k)=>{if(L)_(k.settings)}).catch((k)=>{if(L)U(k instanceof Error?k.message:"无法读取插件作用域配置")}),()=>{L=!1}},[Y,F]);let f=()=>{z((L)=>{let k=iQ.indexOf(L);return iQ[(k+1)%iQ.length]}),O(null)},P=async()=>{let L=J[Z];if(!L||K)return;if(L.source==="cli"){U(`${L.manifest.name} 由 --plugin-dir 管理,不能持久化切换`);return}if(L.status==="error"){U(L.error??`${L.manifest.name} 当前不可用`);return}q(!0),U("");try{let k=await fJ(Y.getWorkspaceRoot(),L.manifest.name,L.status!=="active",H);U(k.effectiveEnabled?`已启用 ${L.manifest.name} · 生效层级 ${k.effectiveScope}`:`已禁用 ${L.manifest.name} · 生效层级 ${k.effectiveScope}`),C((g)=>g+1)}catch(k){U(k instanceof Error?k.message:String(k))}finally{q(!1)}},A=async()=>{if(K)return;q(!0),U("");try{await kJ(Y.getWorkspaceRoot()),X(0),U("插件列表已刷新"),C((L)=>L+1)}catch(L){U(L instanceof Error?L.message:String(L))}finally{q(!1)}},T=async()=>{let L=J[Z];if(!L||K)return;if(!L.installation){U(`${L.manifest.name} 不是 Blade 受管安装,不能自动更新`);return}q(!0),O(null),U("");try{let{result:k}=await SJ(Y.getWorkspaceRoot(),L.manifest.name,{trusted:!0});if(!k.success)throw Error(k.error);U(k.changed?`已更新 ${L.manifest.name} 到 ${k.installation?.revision}`:`${L.manifest.name} 已是最新版本`),C((g)=>g+1)}catch(k){U(k instanceof Error?k.message:String(k))}finally{q(!1)}},M=async()=>{let L=J[Z];if(!L||K)return;if(!L.installation){U(`${L.manifest.name} 不是 Blade 受管安装,不能自动卸载`);return}if(W!==L.manifest.name){O(L.manifest.name),U(`再次按 x 确认卸载 ${L.manifest.name}`);return}q(!0),U("");try{let{result:k}=await vJ(Y.getWorkspaceRoot(),L.manifest.name,!0);if(!k.success)throw Error(k.error);O(null),X(0),U(`已卸载 ${L.manifest.name}`),C((g)=>g+1)}catch(k){U(k instanceof Error?k.message:String(k))}finally{q(!1)}};if(RX((L,k)=>{if(k.escape)Q?.();else if(k.ctrl&&L==="c"||k.meta&&L==="c")B();else if((k.upArrow||L==="k")&&J.length>0)O(null),X((g)=>(g-1+J.length)%J.length);else if((k.downArrow||L==="j")&&J.length>0)O(null),X((g)=>(g+1)%J.length);else if(L===" "||k.return)P();else if(L==="r")A();else if(L==="s")f();else if(L==="u")T();else if(L==="x")M()}),J.length===0)return x(B0,{flexDirection:"column",paddingY:1,children:[x(B0,{marginBottom:1,children:x(Y0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(B0,{paddingLeft:2,children:x(Y0,{color:"gray",children:"没有已加载的插件"},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(B0,{marginTop:1,paddingLeft:2,flexDirection:"column",children:[x(Y0,{color:"gray",children:"插件目录位置:"},void 0,!1,void 0,this),x(Y0,{color:"gray",dimColor:!0,children:[" ","• ~/.blade/plugins/ - 用户级插件"]},void 0,!0,void 0,this),x(Y0,{color:"gray",dimColor:!0,children:[" ","• .blade/plugins/ - 项目级插件"]},void 0,!0,void 0,this),x(Y0,{color:"gray",dimColor:!0,children:[" ","• --plugin-dir - CLI 指定的插件"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(B0,{marginTop:1,paddingLeft:2,children:x(Y0,{color:"gray",children:"使用 /plugins install <url> 安装新插件"},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(B0,{marginTop:1,children:x(Y0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return x(B0,{flexDirection:"column",paddingY:1,children:[x(B0,{marginBottom:1,children:[x(Y0,{bold:!0,color:"cyan",children:"插件管理器"},void 0,!1,void 0,this),x(Y0,{color:"gray",children:[" (共 ",S.total," 个插件)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(B0,{paddingLeft:2,marginBottom:1,children:x(Y0,{color:"gray",children:["启用: ",S.active," | 禁用: ",S.inactive," | 命令: ",S.commands," | 技能:"," ",S.skills," | 代理: ",S.agents]},void 0,!0,void 0,this)},void 0,!1,void 0,this),x(B0,{paddingLeft:2,marginBottom:1,children:x(Y0,{color:"gray",children:["来源策略: ",R.restrictToAllowedSources?"restricted":"open"," | Git SHA: ",R.requireGitCommitSha?"required":"optional"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),x(B0,{paddingLeft:2,marginBottom:1,children:x(Y0,{color:"gray",children:["写入层级: ",x(Y0,{color:"cyan",children:H},void 0,!1,void 0,this)," · 按 s 切换"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),N.cli.length>0&&x(B0,{flexDirection:"column",marginBottom:1,children:[x(B0,{paddingLeft:1,children:[x(Y0,{bold:!0,color:"magenta",children:"CLI 指定"},void 0,!1,void 0,this),x(Y0,{color:"gray",children:" (--plugin-dir)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N.cli.map((L)=>{let k=L.status==="active"?"[on]":"[off]",g=J.indexOf(L)===Z;return x(B0,{flexDirection:"column",paddingLeft:2,children:[x(Y0,{children:[x(Y0,{bold:!0,color:g?"cyan":"green",children:[g?"› ":" ",k," ",L.manifest.name]},void 0,!0,void 0,this),x(Y0,{color:"gray",children:[" v",L.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(B0,{paddingLeft:2,children:x(Y0,{color:"gray",children:L.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(B0,{paddingLeft:2,children:x(Y0,{color:"gray",dimColor:!0,children:"生效层级: invocation"},void 0,!1,void 0,this)},void 0,!1,void 0,this),L.commands.length>0&&x(B0,{paddingLeft:2,children:x(Y0,{color:"blue",children:["命令:"," ",L.commands.map((o)=>`/${o.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},L.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),N.project.length>0&&x(B0,{flexDirection:"column",marginBottom:1,children:[x(B0,{paddingLeft:1,children:[x(Y0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),x(Y0,{color:"gray",children:" (.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N.project.map((L)=>{let k=L.status==="active"?"[on]":"[off]",g=J.indexOf(L)===Z;return x(B0,{flexDirection:"column",paddingLeft:2,children:[x(Y0,{children:[x(Y0,{bold:!0,color:g?"cyan":"green",children:[g?"› ":" ",k," ",L.manifest.name]},void 0,!0,void 0,this),x(Y0,{color:"gray",children:[" v",L.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(B0,{paddingLeft:2,children:x(Y0,{color:"gray",children:L.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(B0,{paddingLeft:2,children:x(Y0,{color:"gray",dimColor:!0,children:["生效层级:"," ",w?.[L.manifest.name]?.effectiveScope??"default"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),L.commands.length>0&&x(B0,{paddingLeft:2,children:x(Y0,{color:"blue",children:["命令:"," ",L.commands.map((o)=>`/${o.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},L.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),N.user.length>0&&x(B0,{flexDirection:"column",marginBottom:1,children:[x(B0,{paddingLeft:1,children:[x(Y0,{bold:!0,color:"cyan",children:"用户级"},void 0,!1,void 0,this),x(Y0,{color:"gray",children:" (~/.blade/plugins/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),N.user.map((L)=>{let k=L.status==="active"?"[on]":"[off]",g=J.indexOf(L)===Z;return x(B0,{flexDirection:"column",paddingLeft:2,children:[x(Y0,{children:[x(Y0,{bold:!0,color:g?"cyan":"green",children:[g?"› ":" ",k," ",L.manifest.name]},void 0,!0,void 0,this),x(Y0,{color:"gray",children:[" v",L.manifest.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(B0,{paddingLeft:2,children:x(Y0,{color:"gray",children:L.manifest.description},void 0,!1,void 0,this)},void 0,!1,void 0,this),x(B0,{paddingLeft:2,children:x(Y0,{color:"gray",dimColor:!0,children:["生效层级:"," ",w?.[L.manifest.name]?.effectiveScope??"default"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),L.commands.length>0&&x(B0,{paddingLeft:2,children:x(Y0,{color:"blue",children:["命令:"," ",L.commands.map((o)=>`/${o.namespacedName}`).join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},L.manifest.name,!0,void 0,this)})]},void 0,!0,void 0,this),x(B0,{marginTop:1,paddingLeft:2,flexDirection:"column",children:[x(Y0,{color:"gray",children:"可用命令:"},void 0,!1,void 0,this),x(Y0,{color:"gray",dimColor:!0,children:[" ","• /plugins list - 列出所有插件"]},void 0,!0,void 0,this),x(Y0,{color:"gray",dimColor:!0,children:[" ","• /plugins info <name> - 显示插件详情"]},void 0,!0,void 0,this),x(Y0,{color:"gray",dimColor:!0,children:[" ","• /plugins install <url> - 安装插件"]},void 0,!0,void 0,this),x(Y0,{color:"gray",dimColor:!0,children:[" ","• /plugins enable/disable <name> - 启用/禁用插件"]},void 0,!0,void 0,this),x(Y0,{color:"gray",dimColor:!0,children:[" ","• /plugins policy show|set - 来源与 SHA 策略"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x(B0,{marginTop:1,children:x(Y0,{dimColor:!0,children:"↑/↓ 选择 · Space/Enter 启停 · s 切换层级 · u 信任并更新 · x 卸载 · r 刷新 · ESC 返回"},void 0,!1,void 0,this)},void 0,!1,void 0,this),G&&x(B0,{marginTop:1,children:x(Y0,{color:G.includes("失败")?"red":"cyan",children:G},void 0,!1,void 0,this)},void 0,!1,void 0,this),K&&x(Y0,{color:"gray",children:"处理中..."},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}import{Box as J1,Text as Y1,useInput as VJ,useStdout as CX}from"ink";import IX from"ink-text-input";import oQ,{useCallback as L8,useMemo as TX,useState as O$}from"react";import{jsxDEV as W0}from"react/jsx-dev-runtime";var fX=oQ.memo(({option:$,index:Q,isSelected:Y,isMultiSelect:J,isHighlighted:Z})=>W0(J1,{flexDirection:"column",marginBottom:1,children:[W0(Y1,{color:Z?"yellow":Y?"green":void 0,bold:Z,children:[J?Y?"(*) ":"( ) ":Z?"> ":" ",Q+1,". ",$.label]},void 0,!0,void 0,this),W0(J1,{marginLeft:4,children:W0(Y1,{color:"gray",children:$.description},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)),kX=oQ.memo(({questions:$,answers:Q})=>W0(J1,{flexDirection:"column",marginBottom:1,children:$.map((Y)=>{let J=Q[Y.header],Z=Array.isArray(J)?J.join(", "):J||"(no answer)";return W0(J1,{marginBottom:1,children:[W0(Y1,{backgroundColor:"blue",color:"white",children:[" ",Y.header," "]},void 0,!0,void 0,this),W0(Y1,{color:"green",children:[" ",Z]},void 0,!0,void 0,this)]},Y.header,!0,void 0,this)})},void 0,!1,void 0,this)),jJ=oQ.memo(({questions:$,onComplete:Q,onCancel:Y})=>{let{stdout:J}=CX(),Z=J.columns||80,K=e0()==="confirmation-prompt",q=S0(!1),[G,U]=O$("answering"),[W,O]=O$(0),[H,z]=O$({}),[w,_]=O$(0),[F,C]=O$([]),[N,S]=O$(!1),[R,B]=O$(""),[f,P]=O$(0),A=$[W],T=TX(()=>{if(!A)return[];return[...A.options.map((l)=>({label:l.label,value:l.label,description:l.description})),{label:"Type something...",value:"__other__",description:"Enter custom response"}]},[A]),M=L8((l)=>{let a={...H,[A.header]:l};if(z(a),W<$.length-1)O(W+1),_(0),C([]),S(!1),B("");else U("submit"),P(0)},[H,A?.header,W,$.length]),L=L8((l)=>{let a=T[l];if(!a)return;if(a.value==="__other__"){S(!0);return}if(A.multiSelect)C((I)=>I.includes(a.value)?I.filter((y)=>y!==a.value):[...I,a.value]);else M(a.value)},[T,A?.multiSelect,M]),k=L8((l)=>{if(l.trim())M(l.trim())},[M]),g=L8(()=>{U("answering"),O(0),_(0),C([]),S(!1)},[]),o=L8(()=>{Q(H)},[H,Q]);if(VJ((l,a)=>{if(a.ctrl&&l==="c"||a.meta&&l==="c"){q();return}if(N){if(a.escape)S(!1),B("");return}if(a.escape){Y();return}let I=parseInt(l);if(I>=1&&I<=T.length){L(I-1);return}if(a.upArrow){_((y)=>y>0?y-1:T.length-1);return}if(a.downArrow||a.tab){_((y)=>y<T.length-1?y+1:0);return}if(a.return){if(A.multiSelect&&F.length>0)M(F);else L(w);return}if(l===" "&&A.multiSelect){let y=T[w];if(y&&y.value!=="__other__")C((v)=>v.includes(y.value)?v.filter((b)=>b!==y.value):[...v,y.value]);return}},{isActive:K&&G==="answering"&&!N}),VJ((l,a)=>{if(a.ctrl&&l==="c"||a.meta&&l==="c"){q();return}if(a.escape){Y();return}if(a.upArrow||a.downArrow||a.tab){P((I)=>I===0?1:0);return}if(a.return){if(f===0)o();else g();return}if(l.toLowerCase()==="y"){o();return}if(l.toLowerCase()==="e"){g();return}},{isActive:K&&G==="submit"}),G==="submit")return W0(J1,{flexDirection:"column",borderStyle:"round",borderColor:K?"green":"gray",padding:1,width:Math.min(Z-4,80),children:[W0(J1,{marginBottom:1,children:W0(Y1,{bold:!0,color:"green",children:"[OK] Review Your Answers"},void 0,!1,void 0,this)},void 0,!1,void 0,this),W0(kX,{questions:$,answers:H},void 0,!1,void 0,this),W0(J1,{flexDirection:"column",marginTop:1,children:[W0(Y1,{color:f===0?"yellow":void 0,bold:f===0,children:[f===0?"> ":" ","[Y] Submit answers"]},void 0,!0,void 0,this),W0(Y1,{color:f===1?"yellow":void 0,bold:f===1,children:[f===1?"> ":" ","[E] Edit answers"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),W0(J1,{marginTop:1,children:W0(Y1,{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(!A)return null;return W0(J1,{flexDirection:"column",borderStyle:"round",borderColor:K?"cyan":"gray",padding:1,width:Math.min(Z-4,80),children:[W0(J1,{marginBottom:1,children:[W0(Y1,{backgroundColor:"blue",color:"white",children:[" ",A.header," "]},void 0,!0,void 0,this),W0(Y1,{children:[" ",A.question]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),N?W0(J1,{flexDirection:"column",marginTop:1,children:[W0(Y1,{color:"yellow",children:"Enter your response:"},void 0,!1,void 0,this),W0(J1,{marginTop:1,children:[W0(Y1,{color:"cyan",children:"> "},void 0,!1,void 0,this),W0(IX,{value:R,onChange:B,onSubmit:k,focus:K},void 0,!1,void 0,this)]},void 0,!0,void 0,this),W0(J1,{marginTop:1,children:W0(Y1,{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):W0(J1,{flexDirection:"column",children:T.map((l,a)=>W0(fX,{option:l,index:a,isSelected:F.includes(l.value),isMultiSelect:A.multiSelect,isHighlighted:w===a},l.value,!1,void 0,this))},void 0,!1,void 0,this),!N&&W0(J1,{marginTop:1,flexDirection:"column",children:[W0(Y1,{color:"gray",children:A.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),A.multiSelect&&F.length>0&&W0(Y1,{color:"green",children:["Selected: ",F.join(", ")]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),$.length>1&&W0(J1,{marginTop:1,children:W0(Y1,{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 SX}from"node:path";import{Box as n$,Text as b1,useInput as vX}from"ink";import DX from"ink-select-input";import{useEffect as nQ,useMemo as o$,useRef as cJ,useState as T2}from"react";function hJ($){return`${$.projectPath}\x00${$.sessionId}`}function EJ($){return $.title?.trim()||`Session ${$.sessionId.slice(0,8)}`}function gJ($){return $.taskDelivery?` | delivery:${$.taskDelivery.status}`:""}function mJ($,Q){if(Q!=="fork")return[...$];return $.filter((Y)=>Y.relationType!=="subagent")}function pJ($){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 VX($){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 jX($){return SX($)}function hX($){switch($){case"queued":return"QUEUED";case"running":return"RUNNING";case"failed":return"FAILED";case"cancelled":return"CANCELLED";case"interrupted":return"INTERRUPTED";case"completed":return"DONE"}}var EX=({isSelected:$})=>d0(n$,{marginRight:1,children:d0(b1,{color:$?"cyan":"gray",children:$?">":" "},void 0,!1,void 0,this)},void 0,!1,void 0,this),gX=({isSelected:$,label:Q})=>d0(b1,{color:$?"cyan":"white",bold:$,children:Q},void 0,!1,void 0,this),B8=20,xJ=({intent:$,sessions:Q,onSelect:Y,onCancel:J})=>{let[Z,X]=T2([]),[K,q]=T2(!1),[G,U]=T2(0),[W,O]=T2(!1),H=cJ(!1),z=cJ(!0);nQ(()=>{return z.current=!0,()=>{z.current=!1}},[]);let _=e0()==="session-selector",F=S0(!1);vX((A,T)=>{if(T.ctrl&&A==="c"||T.meta&&A==="c"){F();return}if(H.current)return;if(T.escape&&J){J();return}if(T.leftArrow||A==="h"||A==="H"){if(G>0)U((M)=>M-1);return}if(T.rightArrow||A==="l"||A==="L"){if(G<R-1)U((M)=>M+1);return}},{isActive:_}),nQ(()=>{if(Q){X(Q);return}(async()=>{q(!0);try{let T=await P0.listSessions({includeSubagents:!1});X(T)}catch(T){console.error("[SessionSelector] Failed to load sessions:",T),X([])}finally{q(!1)}})()},[Q]);let C=o$(()=>mJ(Q||Z,$),[$,Q,Z]),N=o$(()=>pJ($),[$]),S=o$(()=>{return C.map((A)=>{let T=jX(A.taskSourceProjectPath??A.projectPath),M=VX(A.lastMessageTime),L=EJ(A),k=`[${hX(A.taskStatus)}]`,g=A.gitBranch?` (${A.gitBranch})`:"",o=A.hasErrors?" [!]":"",l=A.taskRetriedFrom?` ↻ retry:${A.taskRetriedFrom.sessionId.slice(0,6)}`:A.relationType==="subagent"?" ↳ subagent":A.relationType==="fork"?" ↳ fork":"",a=A.taskIsolation==="worktree"?` | wt:${A.taskWorktreeBranch??"managed"}`:A.taskIsolation==="local"?" | local":"",I=A.taskDiffStat?` | ${A.taskDiffStat.changedFiles} files +${A.taskDiffStat.additions} -${A.taskDiffStat.deletions}`:"",y=A.taskStatus==="queued"&&A.taskQueuePosition?` | queue:${A.taskQueuePosition}/${A.taskQueueDepth??A.taskQueuePosition}`:"",v=gJ(A);return{key:hJ(A),label:`${k} ${L} · ${M} | ${T}${g} | ${A.messageCount} 条消息${a}${y}${I}${v}${o}${l}`,value:A}})},[C]),R=o$(()=>Math.max(1,Math.ceil(S.length/B8)),[S.length]),B=o$(()=>{let A=G*B8;return S.slice(A,A+B8)},[S,G]),f=o$(()=>({start:G*B8+1,end:Math.min((G+1)*B8,S.length)}),[G,S.length]);nQ(()=>{U(0)},[C.length]);let P=(A)=>{if(H.current)return;H.current=!0,O(!0);let T=()=>{if(!z.current)return;H.current=!1,O(!1)};Promise.resolve().then(()=>Y(A.value)).then(T,T)};if(K)return d0(n$,{flexDirection:"column",paddingX:2,paddingY:1,children:d0(b1,{children:"正在加载会话列表..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(C.length===0)return d0(n$,{flexDirection:"column",paddingX:2,paddingY:1,children:[d0(b1,{color:"yellow",children:"没有找到历史会话"},void 0,!1,void 0,this),d0(b1,{dimColor:!0,children:[`
|
|
158
158
|
`,"提示: 开始一次对话后,会话历史将保存到 ~/.blade/projects/"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this);return d0(n$,{flexDirection:"column",paddingX:2,paddingY:1,children:[d0(b1,{bold:!0,color:"cyan",children:N.title},void 0,!1,void 0,this),d0(b1,{dimColor:!0,children:[`
|
|
159
159
|
`,N.instructions,`
|
|
160
|
-
`]},void 0,!0,void 0,this),d0(vX,{items:B,onSelect:P,isFocused:_&&!W,indicatorComponent:hX,itemComponent:EX},void 0,!1,void 0,this),W&&d0(b1,{color:"cyan",children:$==="fork"?"Forking…":"Resuming…"},void 0,!1,void 0,this),d0(n$,{marginTop:1,flexDirection:"column",children:[d0(b1,{dimColor:!0,children:["第 ",G+1,"/",R," 页 · 共 ",C.length," 个会话 · 显示"," ",f.start,"-",f.end]},void 0,!0,void 0,this),R>1&&d0(n$,{marginTop:1,children:[d0(b1,{color:G>0?"cyan":"gray",children:G>0?"<< 上一页":" "},void 0,!1,void 0,this),d0(b1,{children:" "},void 0,!1,void 0,this),d0(b1,{color:G<R-1?"cyan":"gray",children:G<R-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 p0,Text as T0,useInput as gX}from"ink";import{jsxDEV as $0}from"react/jsx-dev-runtime";function uJ({onCancel:$}){let Q=T1(),J=xJ({cwd:Q}).getAll(),Z=J.filter((G)=>G.source==="builtin"),X=J.filter((G)=>G.source==="user"),K=J.filter((G)=>G.source==="project"),q=S0(!1,$);if(gX((G,U)=>{if(U.escape)$?.();else if(U.ctrl&&G==="c"||U.meta&&G==="c")q()}),J.length===0)return $0(p0,{flexDirection:"column",paddingY:1,children:[$0(p0,{marginBottom:1,children:$0(T0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this)},void 0,!1,void 0,this),$0(p0,{paddingLeft:2,children:$0(T0,{color:"gray",children:"没有找到任何 Skill"},void 0,!1,void 0,this)},void 0,!1,void 0,this),$0(p0,{marginTop:1,paddingLeft:2,children:$0(T0,{color:"gray",children:"配置文件位置: ~/.blade/skills/ 或 .blade/skills/"},void 0,!1,void 0,this)},void 0,!1,void 0,this),$0(p0,{marginTop:1,children:$0(T0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return $0(p0,{flexDirection:"column",paddingY:1,children:[$0(p0,{marginBottom:1,children:[$0(T0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this),$0(T0,{color:"gray",children:[" (找到 ",J.length," 个)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.length>0&&$0(p0,{flexDirection:"column",marginBottom:1,children:[$0(p0,{paddingLeft:1,children:[$0(T0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),$0(T0,{color:"gray",children:" (.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),K.map((G)=>{let W=G.description.length>80?`${G.description.substring(0,80)}...`:G.description;return $0(p0,{flexDirection:"column",paddingLeft:2,children:[$0(T0,{children:[$0(T0,{bold:!0,color:"green",children:["• ",G.name]},void 0,!0,void 0,this),$0(T0,{color:"gray",children:[" - ",W]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),G.allowedTools&&G.allowedTools.length>0&&$0(p0,{paddingLeft:2,children:$0(T0,{color:"gray",children:["工具: ",G.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),$0(p0,{paddingLeft:2,children:$0(T0,{color:"gray",dimColor:!0,children:G.path},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},G.name,!0,void 0,this)})]},void 0,!0,void 0,this),X.length>0&&$0(p0,{flexDirection:"column",marginBottom:1,children:[$0(p0,{paddingLeft:1,children:[$0(T0,{bold:!0,color:"yellow",children:"用户级"},void 0,!1,void 0,this),$0(T0,{color:"gray",children:" (~/.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X.map((G)=>{let W=G.description.length>80?`${G.description.substring(0,80)}...`:G.description;return $0(p0,{flexDirection:"column",paddingLeft:2,children:[$0(T0,{children:[$0(T0,{bold:!0,color:"green",children:["• ",G.name]},void 0,!0,void 0,this),$0(T0,{color:"gray",children:[" - ",W]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),G.allowedTools&&G.allowedTools.length>0&&$0(p0,{paddingLeft:2,children:$0(T0,{color:"gray",children:["工具: ",G.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),$0(p0,{paddingLeft:2,children:$0(T0,{color:"gray",dimColor:!0,children:G.path},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},G.name,!0,void 0,this)})]},void 0,!0,void 0,this),Z.length>0&&$0(p0,{flexDirection:"column",marginBottom:1,children:[$0(p0,{paddingLeft:1,children:[$0(T0,{bold:!0,color:"cyan",children:"内置"},void 0,!1,void 0,this),$0(T0,{color:"gray",children:" (builtin)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Z.map((G)=>{let W=G.description.length>80?`${G.description.substring(0,80)}...`:G.description;return $0(p0,{flexDirection:"column",paddingLeft:2,children:[$0(T0,{children:[$0(T0,{bold:!0,color:"green",children:["• ",G.name]},void 0,!0,void 0,this),$0(T0,{color:"gray",children:[" - ",W]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),G.userInvocable&&$0(p0,{paddingLeft:2,children:$0(T0,{color:"blue",children:["命令: /",G.name]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},G.name,!0,void 0,this)})]},void 0,!0,void 0,this),$0(p0,{marginTop:1,children:$0(T0,{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 lJ,Text as C1}from"ink";import mX,{useEffect as pX,useMemo as cX,useState as dJ}from"react";import{jsxDEV as Z1,Fragment as tQ}from"react/jsx-dev-runtime";var rJ=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"];function xX($){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 aJ=mX.memo(()=>{let $=t((U)=>U.app.subagentProgresses),Q=t((U)=>U.app.subagentProgress),Y=A0(),[J,Z]=dJ(0),[X,K]=dJ(()=>Date.now()),q=cX(()=>{let U=Object.values($);return U.length>0?U:Q?[Q]:[]},[Q,$]),G=q.some((U)=>U.status==="running");if(pX(()=>{if(!G){Z(0);return}let U=setInterval(()=>{Z((O)=>(O+1)%rJ.length)},80),W=setInterval(()=>{K(Date.now())},1000);return()=>{clearInterval(U),clearInterval(W)}},[G]),q.length===0)return null;return Z1(lJ,{paddingX:2,paddingY:0,flexDirection:"column",children:q.map((U)=>{let W=U.status==="running"?rJ[J]:U.status==="completed"?"[OK]":"[X]",O=U.status==="running"?Y.colors.info:U.status==="completed"?Y.colors.success:Y.colors.error,H=Math.max(0,X-U.startTime);return Z1(lJ,{flexDirection:"row",gap:1,children:[Z1(C1,{color:O,bold:!0,children:W},void 0,!1,void 0,this),Z1(C1,{color:Y.colors.muted,children:"Subagent"},void 0,!1,void 0,this),Z1(C1,{color:Y.colors.text.primary,bold:!0,children:U.type},void 0,!1,void 0,this),Z1(C1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),Z1(C1,{color:Y.colors.text.secondary,children:U.description},void 0,!1,void 0,this),U.currentTool&&Z1(tQ,{children:[Z1(C1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),Z1(C1,{color:Y.colors.warning,children:U.currentTool},void 0,!1,void 0,this)]},void 0,!0,void 0,this),U.status==="running"&&H>0&&Z1(tQ,{children:[Z1(C1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),Z1(C1,{color:Y.colors.info,children:xX(H)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),U.status==="failed"&&U.terminalSummary&&Z1(tQ,{children:[Z1(C1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),Z1(C1,{color:Y.colors.error,children:U.terminalSummary},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},U.id,!0,void 0,this)})},void 0,!1,void 0,this)});import{useMemoizedFn as uX}from"ahooks";import{Box as v1,Text as d,useInput as lX}from"ink";import dX from"ink-select-input";import{useState as iJ}from"react";import{jsxDEV as u}from"react/jsx-dev-runtime";var oJ=C$.map(($)=>({label:$.label,value:$.id})),rX=({theme:$})=>{let{colors:Q}=$;return u(v1,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[u(d,{bold:!0,color:Q.text.primary,children:"代码预览"},void 0,!1,void 0,this),u(d,{children:" "},void 0,!1,void 0,this),u(d,{color:Q.syntax.comment,children:"# function"},void 0,!1,void 0,this),u(d,{children:[u(d,{color:Q.syntax.keyword,children:"def"},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.function,children:"fibonacci"},void 0,!1,void 0,this),u(d,{color:Q.text.primary,children:"("},void 0,!1,void 0,this),u(d,{color:Q.syntax.variable,children:"n"},void 0,!1,void 0,this),u(d,{color:Q.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(d,{children:[" ",u(d,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this),u(d,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.operator,children:"="},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.number,children:"0"},void 0,!1,void 0,this),u(d,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.number,children:"1"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(d,{children:[" ",u(d,{color:Q.syntax.keyword,children:"for"},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.variable,children:"_"},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.keyword,children:"in"},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.function,children:"range"},void 0,!1,void 0,this),u(d,{color:Q.text.primary,children:"("},void 0,!1,void 0,this),u(d,{color:Q.syntax.variable,children:"n"},void 0,!1,void 0,this),u(d,{color:Q.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(d,{children:[" ",u(d,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this),u(d,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.operator,children:"="},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this),u(d,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.operator,children:"+"},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(d,{children:[" ",u(d,{color:Q.syntax.keyword,children:"return"},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(d,{children:" "},void 0,!1,void 0,this),u(d,{color:Q.error,children:["- print(",u(d,{color:Q.syntax.string,children:'"Hello, "'},void 0,!1,void 0,this)," + name)"]},void 0,!0,void 0,this),u(d,{color:Q.success,children:["+ print(",u(d,{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)},aX=({theme:$})=>{let{colors:Q}=$;return u(v1,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[u(d,{children:" "},void 0,!1,void 0,this),u(d,{bold:!0,color:Q.text.primary,children:"颜色配置"},void 0,!1,void 0,this),u(d,{children:" "},void 0,!1,void 0,this),u(d,{children:[u(d,{color:Q.text.muted,children:"Primary: "},void 0,!1,void 0,this),u(d,{color:Q.primary,children:Q.primary},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(d,{children:[u(d,{color:Q.text.muted,children:"Success: "},void 0,!1,void 0,this),u(d,{color:Q.success,children:Q.success},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(d,{children:[u(d,{color:Q.text.muted,children:"Error: "},void 0,!1,void 0,this),u(d,{color:Q.error,children:Q.error},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(d,{children:[u(d,{color:Q.text.muted,children:"Warning: "},void 0,!1,void 0,this),u(d,{color:Q.warning,children:Q.warning},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(d,{children:[u(d,{color:Q.text.muted,children:"Info: "},void 0,!1,void 0,this),u(d,{color:Q.info,children:Q.info},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},nJ=()=>{let $=t1(),Q=r0.getCurrentThemeName(),Y=C$.findIndex((w)=>w.label===Q),J=Y>=0?C$[Y].theme:C$[0].theme,[Z,X]=iJ(J),[K,q]=iJ(!1),G=uX(async(w)=>{if(K)return;q(!0);try{await m0().setTheme(w.value),$.closeModal()}catch(_){console.error("主题切换失败:",_ instanceof Error?_.message:_)}finally{q(!1)}}),U=(w)=>{let _=C$.find((F)=>F.id===w.value);if(_)X(_.theme)},O=e0()==="theme-selector",H=S0(!1);lX((w,_)=>{if(_.ctrl&&w==="c"||_.meta&&w==="c"){H();return}if(_.escape&&!K)$.closeModal()},{isActive:O});let z=(w)=>{let{isSelected:_,label:F}=w,N=F===Q?"[OK]":" ";return u(d,{color:_?Z.colors.primary:Z.colors.text.primary,children:[N," ",F]},void 0,!0,void 0,this)};return u(v1,{flexDirection:"column",height:"100%",children:[u(v1,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:Z.colors.border.light,children:u(d,{bold:!0,color:Z.colors.primary,children:"主题选择器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),u(v1,{flexDirection:"row",flexGrow:1,children:[u(v1,{width:"40%",borderStyle:"single",borderColor:Z.colors.border.light,paddingX:1,children:u(v1,{flexDirection:"column",children:[u(v1,{paddingTop:1,paddingBottom:1,children:u(d,{bold:!0,color:Z.colors.text.primary,children:["可用主题 (",oJ.length,")"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),u(dX,{items:oJ,initialIndex:Y>=0?Y:0,onSelect:G,onHighlight:U,itemComponent:z},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),u(v1,{width:"60%",flexDirection:"column",borderStyle:"single",borderColor:Z.colors.border.light,children:[u(rX,{theme:Z},void 0,!1,void 0,this),u(aX,{theme:Z},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),u(v1,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:Z.colors.border.light,children:u(d,{color:Z.colors.text.muted,children:K?"正在保存...":"Enter: 选择主题 | Esc: 取消"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{jsxDEV as M0}from"react/jsx-dev-runtime";var U1=e1("UI"),eJ=({debug:$,continue:Q,...Y})=>{if($)U1.debug("[Debug] BladeInterface props:",{permissionMode:Y.permissionMode,yolo:Y.yolo,maxTurns:Y.maxTurns,continue:Q});let J=f2(!1),Z=f2(!1),X=f2(!1),K=f2(null),q=_4(),G=N4(),U=y8(),W=W4(),O=H4(),H=t1(),z=n1(),w=k$(),_=T1(),F=A4(),C=S$(),N=s1(),S=b4();_$(()=>{if(r0.getCurrentThemeName()!==S)try{r0.setTheme(S)}catch{}},[S]);let R=q==="ready",B=q==="needsSetup",f=q==="idle",P=iX(()=>Y.agents?sJ(Y.agents):void 0,[Y.agents]),{confirmationState:A,confirmationHandler:T,handleResponse:M,dismissAll:L}=X6(),{executeCommand:k,handleAbort:g,cleanupAgent:o}=Q6(Y.systemPrompt,Y.appendSystemPrompt,T,Y.maxTurns,L,P),{getPreviousCommand:l,getNextCommand:a,addToHistory:I}=Y6();A6();let y=G6("",0),v=t0(async()=>{let r=C,K0;if(r==="default")K0="autoEdit";else if(r==="autoEdit")K0="plan";else if(r==="plan")K0="default";else K0="default";try{await P0.setSessionPermissionMode(w,_,K0),await m0().setPermissionMode(K0)}catch(k0){U1.error("权限模式切换失败:",k0 instanceof Error?k0.message:k0)}}),b=t0(async(r)=>{try{let K0={displayName:r.displayName,provider:r.provider,model:r.model,overrides:r.overrides};if(r.modelProvider)await m0().addModelWithProvider(K0,r.modelProvider);else await m0().addModel(K0);H.setInitializationStatus("ready")}catch(K0){throw U1.error("初始化配置保存失败:",K0 instanceof Error?K0.message:K0),K0}}),V=t0(()=>{if(U==="shortcuts")H.closeModal();else H.setActiveModal("shortcuts")}),p=t0(async(r,K0,k0)=>{return m8({intent:K0,session:r,newSessionId:k0?.newSessionId,announceFork:k0?.announceFork,permissionModeOverride:Y.permissionMode},_,z,o)}),j=t0(async(r,K0)=>{let j1=(await g8(K0,_)).filter((g0)=>g0.sessionId===r);if(j1.length===0)throw Error(`Session not found: ${r}`);if(j1.length>1)throw Error(`Multiple workspaces contain session ${r}; use the session selector`);return j1[0]}),{showSuggestions:h,suggestions:E,selectedSuggestionIndex:Z0}=b6(y,k,l,a,I,g,N,v,V,U==="shortcuts");_$(()=>{if(y.value&&U==="shortcuts")H.closeModal()},[y.value,U,H]);let J0=t0(async()=>{X.current=!0;try{let r=Y.forkSession?"fork":"resume",K0=await g8(r,_);if(K0.length===0){if(Y.forkSession){U1.error("没有可供 fork 的历史会话"),f1(1);return}z.addAssistantMessage("没有找到历史会话,开始新对话。");return}let k0=K0[0];await p(k0,r,{newSessionId:Y.forkSession?Y.sessionId:void 0,announceFork:Y.forkSession?!1:void 0})}catch(r){if(U1.error("[BladeInterface] 继续会话失败:",r),Y.forkSession){f1(1);return}z.addAssistantMessage("继续会话失败,开始新对话。")}}),w0=t0(async()=>{X.current=!0;try{if(typeof Y.resume==="string"&&Y.resume!=="true"){let k0=Y.forkSession?"fork":"resume",$8=await j(Y.resume,k0);await p($8,k0,{newSessionId:Y.forkSession?Y.sessionId:void 0,announceFork:Y.forkSession?!1:void 0});return}let r=Y.forkSession?"fork":"resume",K0=await g8(r,_);if(K0.length===0)U1.error("没有找到历史会话"),f1(1);H.showSessionSelector(K0,r)}catch(r){U1.error("[BladeInterface] 加载会话失败:",r),f1(1)}});_$(()=>{if(J.current)return;if(Q){J.current=!0,J0();return}if(Y.resume)J.current=!0,w0()},[Q,Y.resume,J0,w0]);let f0=t0(async(r)=>{let K0=A.details?.type;if(K0==="enterPlanMode"&&r.approved)try{await P0.setSessionPermissionMode(w,_,"plan"),await m0().setPermissionMode("plan"),U1.debug("[BladeInterface] Entered Plan mode")}catch(k0){U1.error("[BladeInterface] Failed to enter Plan mode:",k0)}if(K0==="exitPlanMode"&&r.approved)U1.debug("[BladeInterface] ExitPlanMode approved, Store auto-synced");M(r)}),c0=t0(()=>{z.addAssistantMessage("设置已取消"),z.addAssistantMessage("Blade 需要 API 配置才能正常工作。"),z.addAssistantMessage("您可以稍后运行 Blade 重新进入设置向导。"),f1(0)}),h0=t0(()=>{H.closeModal()}),H1=t0(async(r)=>{try{await p(r,W?.intent??"resume"),H.closeModal()}catch(K0){U1.error("[BladeInterface] Failed to restore session:",K0),z.addAssistantMessage(`会话操作失败: ${K0 instanceof Error?K0.message:"未知错误"}`),H.closeModal()}}),I1=t0(()=>{if(Y.resume)f1(0);else H.closeModal()}),T$=t0((r)=>{H.showModelEditWizard(r)}),s0=t0((r)=>{z.addAssistantMessage(`已添加模型配置: ${r.displayName??r.model},并已切换到该模型`),h0()}),V2=t0((r)=>{z.addAssistantMessage(`已更新模型配置: ${r.displayName??r.model}`),h0()});_$(()=>{if(B){F.setFocus("model-config-wizard");return}if(A.isVisible)F.setFocus("confirmation-prompt");else if(U==="sessionSelector")F.setFocus("session-selector");else if(U==="themeSelector")F.setFocus("theme-selector");else if(U==="modelSelector")F.setFocus("model-selector");else if(U==="modelAddWizard"||U==="modelEditWizard")F.setFocus("model-config-wizard");else if(U==="permissionsManager")F.setFocus("permissions-manager");else if(U==="agentsManager")F.setFocus("agents-manager");else if(U==="agentCreationWizard")F.setFocus("agent-creation-wizard");else if(U==="hooksManager")F.setFocus("hooks-manager");else if(U==="shortcuts")F.setFocus("main-input");else F.setFocus("main-input")},[B,A.isVisible,U,F.setFocus]),_$(()=>{if(!R||X.current)return;if(tJ().length>0){X.current=!0;return}X.current=!0,z.addAssistantMessage("请输入您的问题,我将为您提供帮助。")},[R]),_$(()=>{if(!G)return;if(K.current===G)return;if(K.current=G,q==="error")z.addAssistantMessage(`初始化失败: ${G}`);else z.addAssistantMessage(`${G}`),z.addAssistantMessage("请重新尝试设置,或检查文件权限")},[G,q,z.addAssistantMessage]);let V1=t0(async(r)=>{try{await k({displayText:r,text:r,images:[],parts:[{type:"text",text:r}]})}catch(K0){let k0=K0 instanceof Error?K0.message:"无法发送初始消息";z.addAssistantMessage(`初始消息发送失败:${k0}`)}});_$(()=>{let r=Y.initialMessage?.trim();if(!r||Z.current||!R||B)return;Z.current=!0,I(r),V1(r)},[Y.initialMessage,R,B,k,I]);let j2=t0(async(r)=>{try{await m0().setPermissionMode(r)}catch(K0){U1.error("权限模式初始化失败:",K0 instanceof Error?K0.message:K0)}});if(_$(()=>{let r=Y.permissionMode;if($)U1.debug("[Debug] permissionMode from CLI:",r),U1.debug("[Debug] current permissionMode:",C);if(!r||r===C)return;j2(r)},[Y.permissionMode,C]),f)return null;if(B)return M0(aQ,{mode:"setup",onComplete:b,onCancel:c0},void 0,!1,void 0,this);if($)U1.debug("[Debug] 渲染主界面,条件检查:",{confirmationVisible:A.isVisible,activeModal:U});let q0=U==="modelSelector",y0=O,Q0=U==="modelAddWizard"?"add":U==="modelEditWizard"&&y0?"edit":null,_0=q0||Boolean(Q0),x0=U==="agentsManager",K1=U==="agentCreationWizard",u0=U==="skillsManager",O1=U==="pluginsManager",e$=y0?{displayName:y0.displayName,provider:y0.provider,model:y0.model,overrides:y0.overrides}:void 0,o1=A.isVisible&&A.details?A.details.type==="mcpElicitation"&&A.details.mcpElicitation?M0(l9,{details:A.details.mcpElicitation,onComplete:(r,K0)=>f0({approved:r.action==="accept",elicitation:r,...K0?{openExternalUrl:!0}:{}})},void 0,!1,void 0,this):A.details.type==="askUserQuestion"&&A.details.questions?M0(VJ,{questions:A.details.questions,onComplete:(r)=>f0({approved:!0,answers:r}),onCancel:()=>f0({approved:!1})},void 0,!1,void 0,this):M0(N9,{details:A.details,onResponse:f0},void 0,!1,void 0,this):U==="themeSelector"?M0(nJ,{},void 0,!1,void 0,this):U==="permissionsManager"?M0(MJ,{onClose:h0},void 0,!1,void 0,this):U==="sessionSelector"?M0(cJ,{intent:W?.intent??"resume",sessions:W?.sessions,onSelect:H1,onCancel:I1},void 0,!1,void 0,this):U==="hooksManager"?M0(H9,{workspaceRoot:_,sessionId:w,onClose:h0},void 0,!1,void 0,this):null,b8=Boolean(o1);return M0(z$,{flexDirection:"column",width:"100%",overflow:"hidden",children:[o1,M0(z$,{flexDirection:"column",display:b8?"none":"flex",children:[M0(ZJ,{},void 0,!1,void 0,this),M0(aJ,{},void 0,!1,void 0,this),M0(p9,{paused:b8},void 0,!1,void 0,this),M0(V9,{input:y.value,cursorPosition:y.cursorPosition,onChange:y.setValue,onChangeCursorPosition:y.setCursorPosition,onAddPasteMapping:y.addPasteMapping,onAddImagePasteMapping:y.addImagePasteMapping},void 0,!1,void 0,this),q0&&M0(z$,{marginTop:1,paddingX:2,children:M0(XJ,{onClose:h0,onEdit:T$},void 0,!1,void 0,this)},void 0,!1,void 0,this),Q0&&M0(z$,{marginTop:1,paddingX:2,children:M0(aQ,{mode:Q0,modelId:y0?.id,initialConfig:Q0==="edit"?e$:void 0,onComplete:Q0==="edit"?V2:s0,onCancel:h0},void 0,!1,void 0,this)},void 0,!1,void 0,this),x0&&M0(z$,{marginTop:1,paddingX:2,children:M0(I6,{workspaceRoot:_,onComplete:h0,onCancel:h0},void 0,!1,void 0,this)},void 0,!1,void 0,this),K1&&M0(z$,{marginTop:1,paddingX:2,children:M0(U8,{onComplete:h0,onCancel:h0},void 0,!1,void 0,this)},void 0,!1,void 0,this),u0&&M0(z$,{marginTop:1,paddingX:2,children:M0(uJ,{onComplete:h0,onCancel:h0},void 0,!1,void 0,this)},void 0,!1,void 0,this),O1&&M0(z$,{marginTop:1,paddingX:2,children:M0(vJ,{workspaceRoot:_,onComplete:h0,onCancel:h0},void 0,!1,void 0,this)},void 0,!1,void 0,this),M0(V6,{suggestions:E,selectedIndex:Z0,visible:h&&!_0},void 0,!1,void 0,this),M0(D6,{},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)};import{Box as oX,Text as N$}from"ink";import nX from"react";import{jsxDEV as a1}from"react/jsx-dev-runtime";class w8 extends nX.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 a1(oX,{flexDirection:"column",padding:1,borderStyle:"round",borderColor:"red",children:[a1(N$,{color:"red",children:"应用发生错误"},void 0,!1,void 0,this),a1(N$,{children:" "},void 0,!1,void 0,this),a1(N$,{color:"red",children:this.state.error?.message},void 0,!1,void 0,this),a1(N$,{children:" "},void 0,!1,void 0,this),a1(N$,{color:"gray",children:"错误详情:"},void 0,!1,void 0,this),a1(N$,{color:"gray",children:this.state.error?.stack},void 0,!1,void 0,this),a1(N$,{children:" "},void 0,!1,void 0,this),a1(N$,{color:"yellow",children:"请重启应用或联系开发者"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return this.props.children}}import{Box as I$,Text as i1,useInput as tX}from"ink";import{useState as sQ}from"react";import{jsxDEV as X1}from"react/jsx-dev-runtime";var k2=[{key:"update",label:"Update now",description:`runs \`${QY()}\``},{key:"skip",label:"Skip",description:""},{key:"skip_until_next",label:"Skip until next version",description:""}],YY=({versionInfo:$,onComplete:Q})=>{let[Y,J]=sQ(0),[Z,X]=sQ(!1),[K,q]=sQ(null);tX((U,W)=>{if(W.ctrl&&U==="c"){G8().shutdown("SIGINT",0);return}if(Z||K)return;if(W.upArrow||U==="k")J((O)=>O>0?O-1:k2.length-1);else if(W.downArrow||U==="j")J((O)=>O<k2.length-1?O+1:0);else if(W.return)G(k2[Y].key);else if(U==="1")G("update");else if(U==="2")G("skip");else if(U==="3")G("skip_until_next")});let G=async(U)=>{switch(U){case"update":{X(!0);let W=await JY();q(W.message),setTimeout(()=>{G8().shutdown("SIGINT",0)},1500);break}case"skip":Q();break;case"skip_until_next":if($.latestVersion)await $Y($.latestVersion);Q();break}};if(K)return X1(I$,{flexDirection:"column",marginY:1,children:X1(i1,{children:K},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Z)return X1(I$,{flexDirection:"column",marginY:1,children:X1(i1,{color:"cyan",children:"Updating..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);return X1(I$,{flexDirection:"column",marginY:1,children:[X1(i1,{color:"yellow",bold:!0,children:["Update available! ",X1(i1,{color:"gray",children:[$.currentVersion," ","->"," ",$.latestVersion]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),X1(I$,{marginTop:1,children:X1(i1,{color:"gray",children:["Release notes:"," ",X1(i1,{color:"cyan",underline:!0,children:$.releaseNotesUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),X1(I$,{flexDirection:"column",marginTop:1,children:k2.map((U,W)=>{let O=W===Y,H=O?"› ":" ",z=`${W+1}. `;return X1(I$,{children:X1(i1,{color:O?"cyan":void 0,children:[H,z,U.label,U.description&&X1(i1,{color:"gray",children:[" (",U.description,")"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},U.key,!1,void 0,this)})},void 0,!1,void 0,this),X1(I$,{marginTop:1,children:X1(i1,{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)};import{Box as S2,Text as t$,useInput as sX}from"ink";import{useState as ZY}from"react";import{jsxDEV as D1}from"react/jsx-dev-runtime";var XY=({status:$,onTrust:Q,onContinueSafely:Y})=>{let J=r0.getTheme(),[Z,X]=ZY(!1),[K,q]=ZY(null);return sX((G,U)=>{if(Z)return;if(U.return||G.toLowerCase()==="t"){X(!0),q(null),Q().catch((W)=>{q(W instanceof Error?W.message:"Failed to trust workspace"),X(!1)});return}if(G.toLowerCase()==="s"||U.escape)X(!0),q(null),Y().catch((W)=>{q(W instanceof Error?W.message:"Failed to continue safely"),X(!1)})}),D1(S2,{flexDirection:"column",paddingX:1,children:[D1(t$,{bold:!0,color:J.colors.warning,children:"Workspace review required"},void 0,!1,void 0,this),D1(t$,{dimColor:!0,children:$.projectPath},void 0,!1,void 0,this),D1(S2,{marginTop:1,flexDirection:"column",children:[D1(t$,{children:"This project contains configuration that can change models, start MCP processes, relax permissions, inject environment variables, or load instructions, commands, skills, agents, and plugins."},void 0,!1,void 0,this),$.sources.map((G)=>D1(t$,{children:[" ",G.path," · ",G.effects.length," effect(s)"]},`${G.kind}:${G.path}`,!0,void 0,this))]},void 0,!0,void 0,this),K&&D1(S2,{marginTop:1,children:D1(t$,{color:J.colors.error,children:K},void 0,!1,void 0,this)},void 0,!1,void 0,this),D1(S2,{marginTop:1,children:D1(t$,{bold:!0,children:Z?"Applying decision...":"[Enter/T] Trust and load [S/Esc] Continue safely"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useStdout as eX}from"ink";import{useEffect as $7}from"react";function KY(){let{stdout:$}=eX();$7(()=>{if(!$.isTTY)return;return $.write(B9),$.write(TQ),()=>{$.write(w9),$.write(TQ)}},[$])}function GY($){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 s$}from"react/jsx-dev-runtime";function J7($){if($1().config.actions.setConfig($),$.debug)console.log("[Debug] 模型配置检查通过,准备就绪");a0().setInitializationStatus("ready")}var RH=($)=>{KY();let[Q,Y]=D2(!1),[J,Z]=D2(null),[X,K]=D2(!1),[q,G]=D2(null),U=v2((z,w)=>{let _=z instanceof Error?z.message:String(z);if(a0().setInitializationError(_),a0().setInitializationStatus("error"),Y(!0),w)console.error("[FAIL] 应用初始化失败:",_)}),W=v2(async()=>{try{let z=$1().config.config??UY,w=OY(z,$);if(J7(w),w.resumeSessionId)zY().restoreSession(w.resumeSessionId,[]);if(w.debug)console.error("[Debug] 运行时配置:",w);let _=w.codeTheme;if(_&&r0.hasTheme(_)){if(r0.setTheme(_),$.debug)console.log(`[OK] 已加载主题: ${_}`)}try{z1.getInstance().loadConfig(w.hooks||{},l0());let C=await _Y(l0());if($.debug&&w.hooks?.enabled)console.log("[OK] Hooks 系统已启用");if($.debug)console.log(`[OK] Workspace resources: ${C.subagents.getAllNames().length} agents, ${C.skills.size} skills, ${C.commands.getCommandCount()+C.commands.getPluginCommandCount()} commands, ${C.plugins.getAll().length} plugins`);let S=$1().session.sessionId;qY(S)}catch(F){if($.debug)console.warn("Hooks 初始化失败:",GY(F))}x8(async()=>{await FY.getInstance().killAll(),await NY.getInstance().disconnectAll(),z1.getInstance().cleanup()}),Y(!0)}catch(z){U(z,!!$.debug)}}),O=v2(async()=>{let z=await eQ.getInstance().getStatus(l0());if(z.state==="untrusted"||z.state==="error"){G(z);return}await W()}),H=v2(async()=>{if($.versionCheckPromise){let z=await $.versionCheckPromise;if(z){Z(z),K(!0);return}}await O()});if(Q7(()=>{H()},[]),X&&J)return s$(w8,{children:s$(YY,{versionInfo:J,onComplete:()=>{K(!1),O()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(q)return s$(w8,{children:s$(XY,{status:q,onTrust:async()=>{await eQ.getInstance().trust(l0()),await HY(),G(null),await W()},onContinueSafely:async()=>{G(null),await W()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(!Q)return null;return s$(w8,{children:s$(eJ,{...$},void 0,!1,void 0,this)},void 0,!1,void 0,this)};export{RH as AppWrapper};
|
|
160
|
+
`]},void 0,!0,void 0,this),d0(DX,{items:B,onSelect:P,isFocused:_&&!W,indicatorComponent:EX,itemComponent:gX},void 0,!1,void 0,this),W&&d0(b1,{color:"cyan",children:$==="fork"?"Forking…":"Resuming…"},void 0,!1,void 0,this),d0(n$,{marginTop:1,flexDirection:"column",children:[d0(b1,{dimColor:!0,children:["第 ",G+1,"/",R," 页 · 共 ",C.length," 个会话 · 显示"," ",f.start,"-",f.end]},void 0,!0,void 0,this),R>1&&d0(n$,{marginTop:1,children:[d0(b1,{color:G>0?"cyan":"gray",children:G>0?"<< 上一页":" "},void 0,!1,void 0,this),d0(b1,{children:" "},void 0,!1,void 0,this),d0(b1,{color:G<R-1?"cyan":"gray",children:G<R-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 p0,Text as f0,useInput as mX}from"ink";import{jsxDEV as $0}from"react/jsx-dev-runtime";function lJ({onCancel:$}){let Q=T1(),J=uJ({cwd:Q}).getAll(),Z=J.filter((G)=>G.source==="builtin"),X=J.filter((G)=>G.source==="user"),K=J.filter((G)=>G.source==="project"),q=S0(!1,$);if(mX((G,U)=>{if(U.escape)$?.();else if(U.ctrl&&G==="c"||U.meta&&G==="c")q()}),J.length===0)return $0(p0,{flexDirection:"column",paddingY:1,children:[$0(p0,{marginBottom:1,children:$0(f0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this)},void 0,!1,void 0,this),$0(p0,{paddingLeft:2,children:$0(f0,{color:"gray",children:"没有找到任何 Skill"},void 0,!1,void 0,this)},void 0,!1,void 0,this),$0(p0,{marginTop:1,paddingLeft:2,children:$0(f0,{color:"gray",children:"配置文件位置: ~/.blade/skills/ 或 .blade/skills/"},void 0,!1,void 0,this)},void 0,!1,void 0,this),$0(p0,{marginTop:1,children:$0(f0,{dimColor:!0,children:"按 ESC 返回菜单"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return $0(p0,{flexDirection:"column",paddingY:1,children:[$0(p0,{marginBottom:1,children:[$0(f0,{bold:!0,color:"cyan",children:"所有 Skills"},void 0,!1,void 0,this),$0(f0,{color:"gray",children:[" (找到 ",J.length," 个)"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),K.length>0&&$0(p0,{flexDirection:"column",marginBottom:1,children:[$0(p0,{paddingLeft:1,children:[$0(f0,{bold:!0,color:"yellow",children:"项目级"},void 0,!1,void 0,this),$0(f0,{color:"gray",children:" (.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),K.map((G)=>{let W=G.description.length>80?`${G.description.substring(0,80)}...`:G.description;return $0(p0,{flexDirection:"column",paddingLeft:2,children:[$0(f0,{children:[$0(f0,{bold:!0,color:"green",children:["• ",G.name]},void 0,!0,void 0,this),$0(f0,{color:"gray",children:[" - ",W]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),G.allowedTools&&G.allowedTools.length>0&&$0(p0,{paddingLeft:2,children:$0(f0,{color:"gray",children:["工具: ",G.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),$0(p0,{paddingLeft:2,children:$0(f0,{color:"gray",dimColor:!0,children:G.path},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},G.name,!0,void 0,this)})]},void 0,!0,void 0,this),X.length>0&&$0(p0,{flexDirection:"column",marginBottom:1,children:[$0(p0,{paddingLeft:1,children:[$0(f0,{bold:!0,color:"yellow",children:"用户级"},void 0,!1,void 0,this),$0(f0,{color:"gray",children:" (~/.blade/skills/)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),X.map((G)=>{let W=G.description.length>80?`${G.description.substring(0,80)}...`:G.description;return $0(p0,{flexDirection:"column",paddingLeft:2,children:[$0(f0,{children:[$0(f0,{bold:!0,color:"green",children:["• ",G.name]},void 0,!0,void 0,this),$0(f0,{color:"gray",children:[" - ",W]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),G.allowedTools&&G.allowedTools.length>0&&$0(p0,{paddingLeft:2,children:$0(f0,{color:"gray",children:["工具: ",G.allowedTools.join(", ")]},void 0,!0,void 0,this)},void 0,!1,void 0,this),$0(p0,{paddingLeft:2,children:$0(f0,{color:"gray",dimColor:!0,children:G.path},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},G.name,!0,void 0,this)})]},void 0,!0,void 0,this),Z.length>0&&$0(p0,{flexDirection:"column",marginBottom:1,children:[$0(p0,{paddingLeft:1,children:[$0(f0,{bold:!0,color:"cyan",children:"内置"},void 0,!1,void 0,this),$0(f0,{color:"gray",children:" (builtin)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Z.map((G)=>{let W=G.description.length>80?`${G.description.substring(0,80)}...`:G.description;return $0(p0,{flexDirection:"column",paddingLeft:2,children:[$0(f0,{children:[$0(f0,{bold:!0,color:"green",children:["• ",G.name]},void 0,!0,void 0,this),$0(f0,{color:"gray",children:[" - ",W]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),G.userInvocable&&$0(p0,{paddingLeft:2,children:$0(f0,{color:"blue",children:["命令: /",G.name]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},G.name,!0,void 0,this)})]},void 0,!0,void 0,this),$0(p0,{marginTop:1,children:$0(f0,{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 dJ,Text as C1}from"ink";import pX,{useEffect as cX,useMemo as xX,useState as rJ}from"react";import{jsxDEV as Z1,Fragment as tQ}from"react/jsx-dev-runtime";var aJ=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"];function uX($){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 iJ=pX.memo(()=>{let $=t((U)=>U.app.subagentProgresses),Q=t((U)=>U.app.subagentProgress),Y=A0(),[J,Z]=rJ(0),[X,K]=rJ(()=>Date.now()),q=xX(()=>{let U=Object.values($);return U.length>0?U:Q?[Q]:[]},[Q,$]),G=q.some((U)=>U.status==="running");if(cX(()=>{if(!G){Z(0);return}let U=setInterval(()=>{Z((O)=>(O+1)%aJ.length)},80),W=setInterval(()=>{K(Date.now())},1000);return()=>{clearInterval(U),clearInterval(W)}},[G]),q.length===0)return null;return Z1(dJ,{paddingX:2,paddingY:0,flexDirection:"column",children:q.map((U)=>{let W=U.status==="running"?aJ[J]:U.status==="completed"?"[OK]":"[X]",O=U.status==="running"?Y.colors.info:U.status==="completed"?Y.colors.success:Y.colors.error,H=Math.max(0,X-U.startTime);return Z1(dJ,{flexDirection:"row",gap:1,children:[Z1(C1,{color:O,bold:!0,children:W},void 0,!1,void 0,this),Z1(C1,{color:Y.colors.muted,children:"Subagent"},void 0,!1,void 0,this),Z1(C1,{color:Y.colors.text.primary,bold:!0,children:U.type},void 0,!1,void 0,this),Z1(C1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),Z1(C1,{color:Y.colors.text.secondary,children:U.description},void 0,!1,void 0,this),U.currentTool&&Z1(tQ,{children:[Z1(C1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),Z1(C1,{color:Y.colors.warning,children:U.currentTool},void 0,!1,void 0,this)]},void 0,!0,void 0,this),U.status==="running"&&H>0&&Z1(tQ,{children:[Z1(C1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),Z1(C1,{color:Y.colors.info,children:uX(H)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),U.status==="failed"&&U.terminalSummary&&Z1(tQ,{children:[Z1(C1,{color:Y.colors.muted,children:"|"},void 0,!1,void 0,this),Z1(C1,{color:Y.colors.error,children:U.terminalSummary},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},U.id,!0,void 0,this)})},void 0,!1,void 0,this)});import{useMemoizedFn as lX}from"ahooks";import{Box as v1,Text as d,useInput as dX}from"ink";import rX from"ink-select-input";import{useState as oJ}from"react";import{jsxDEV as u}from"react/jsx-dev-runtime";var nJ=C$.map(($)=>({label:$.label,value:$.id})),aX=({theme:$})=>{let{colors:Q}=$;return u(v1,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[u(d,{bold:!0,color:Q.text.primary,children:"代码预览"},void 0,!1,void 0,this),u(d,{children:" "},void 0,!1,void 0,this),u(d,{color:Q.syntax.comment,children:"# function"},void 0,!1,void 0,this),u(d,{children:[u(d,{color:Q.syntax.keyword,children:"def"},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.function,children:"fibonacci"},void 0,!1,void 0,this),u(d,{color:Q.text.primary,children:"("},void 0,!1,void 0,this),u(d,{color:Q.syntax.variable,children:"n"},void 0,!1,void 0,this),u(d,{color:Q.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(d,{children:[" ",u(d,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this),u(d,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.operator,children:"="},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.number,children:"0"},void 0,!1,void 0,this),u(d,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.number,children:"1"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(d,{children:[" ",u(d,{color:Q.syntax.keyword,children:"for"},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.variable,children:"_"},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.keyword,children:"in"},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.function,children:"range"},void 0,!1,void 0,this),u(d,{color:Q.text.primary,children:"("},void 0,!1,void 0,this),u(d,{color:Q.syntax.variable,children:"n"},void 0,!1,void 0,this),u(d,{color:Q.text.primary,children:"):"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(d,{children:[" ",u(d,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this),u(d,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.operator,children:"="},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this),u(d,{color:Q.syntax.operator,children:","},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.operator,children:"+"},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.variable,children:"b"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(d,{children:[" ",u(d,{color:Q.syntax.keyword,children:"return"},void 0,!1,void 0,this)," ",u(d,{color:Q.syntax.variable,children:"a"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(d,{children:" "},void 0,!1,void 0,this),u(d,{color:Q.error,children:["- print(",u(d,{color:Q.syntax.string,children:'"Hello, "'},void 0,!1,void 0,this)," + name)"]},void 0,!0,void 0,this),u(d,{color:Q.success,children:["+ print(",u(d,{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)},iX=({theme:$})=>{let{colors:Q}=$;return u(v1,{flexDirection:"column",paddingLeft:1,paddingTop:1,children:[u(d,{children:" "},void 0,!1,void 0,this),u(d,{bold:!0,color:Q.text.primary,children:"颜色配置"},void 0,!1,void 0,this),u(d,{children:" "},void 0,!1,void 0,this),u(d,{children:[u(d,{color:Q.text.muted,children:"Primary: "},void 0,!1,void 0,this),u(d,{color:Q.primary,children:Q.primary},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(d,{children:[u(d,{color:Q.text.muted,children:"Success: "},void 0,!1,void 0,this),u(d,{color:Q.success,children:Q.success},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(d,{children:[u(d,{color:Q.text.muted,children:"Error: "},void 0,!1,void 0,this),u(d,{color:Q.error,children:Q.error},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(d,{children:[u(d,{color:Q.text.muted,children:"Warning: "},void 0,!1,void 0,this),u(d,{color:Q.warning,children:Q.warning},void 0,!1,void 0,this)]},void 0,!0,void 0,this),u(d,{children:[u(d,{color:Q.text.muted,children:"Info: "},void 0,!1,void 0,this),u(d,{color:Q.info,children:Q.info},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},tJ=()=>{let $=t1(),Q=r0.getCurrentThemeName(),Y=C$.findIndex((w)=>w.label===Q),J=Y>=0?C$[Y].theme:C$[0].theme,[Z,X]=oJ(J),[K,q]=oJ(!1),G=lX(async(w)=>{if(K)return;q(!0);try{await m0().setTheme(w.value),$.closeModal()}catch(_){console.error("主题切换失败:",_ instanceof Error?_.message:_)}finally{q(!1)}}),U=(w)=>{let _=C$.find((F)=>F.id===w.value);if(_)X(_.theme)},O=e0()==="theme-selector",H=S0(!1);dX((w,_)=>{if(_.ctrl&&w==="c"||_.meta&&w==="c"){H();return}if(_.escape&&!K)$.closeModal()},{isActive:O});let z=(w)=>{let{isSelected:_,label:F}=w,N=F===Q?"[OK]":" ";return u(d,{color:_?Z.colors.primary:Z.colors.text.primary,children:[N," ",F]},void 0,!0,void 0,this)};return u(v1,{flexDirection:"column",height:"100%",children:[u(v1,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:Z.colors.border.light,children:u(d,{bold:!0,color:Z.colors.primary,children:"主题选择器"},void 0,!1,void 0,this)},void 0,!1,void 0,this),u(v1,{flexDirection:"row",flexGrow:1,children:[u(v1,{width:"40%",borderStyle:"single",borderColor:Z.colors.border.light,paddingX:1,children:u(v1,{flexDirection:"column",children:[u(v1,{paddingTop:1,paddingBottom:1,children:u(d,{bold:!0,color:Z.colors.text.primary,children:["可用主题 (",nJ.length,")"]},void 0,!0,void 0,this)},void 0,!1,void 0,this),u(rX,{items:nJ,initialIndex:Y>=0?Y:0,onSelect:G,onHighlight:U,itemComponent:z},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),u(v1,{width:"60%",flexDirection:"column",borderStyle:"single",borderColor:Z.colors.border.light,children:[u(aX,{theme:Z},void 0,!1,void 0,this),u(iX,{theme:Z},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),u(v1,{paddingX:2,paddingY:1,borderStyle:"single",borderColor:Z.colors.border.light,children:u(d,{color:Z.colors.text.muted,children:K?"正在保存...":"Enter: 选择主题 | Esc: 取消"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{jsxDEV as M0}from"react/jsx-dev-runtime";var O1=e1("UI"),$Y=({debug:$,continue:Q,...Y})=>{if($)O1.debug("[Debug] BladeInterface props:",{permissionMode:Y.permissionMode,yolo:Y.yolo,maxTurns:Y.maxTurns,continue:Q});let J=f2(!1),Z=f2(!1),X=f2(!1),K=f2(null),q=_4(),G=N4(),U=y8(),W=W4(),O=H4(),H=t1(),z=n1(),w=k$(),_=T1(),F=A4(),C=S$(),N=s1(),S=b4();_$(()=>{if(r0.getCurrentThemeName()!==S)try{r0.setTheme(S)}catch{}},[S]);let R=q==="ready",B=q==="needsSetup",f=q==="idle",P=oX(()=>Y.agents?eJ(Y.agents):void 0,[Y.agents]),{confirmationState:A,confirmationHandler:T,handleResponse:M,dismissAll:L}=K6(),{executeCommand:k,handleAbort:g,cleanupAgent:o}=J6(Y.systemPrompt,Y.appendSystemPrompt,T,Y.maxTurns,L,P),{getPreviousCommand:l,getNextCommand:a,addToHistory:I}=Z6();P6();let y=q6("",0),v=t0(async()=>{let r=C,K0;if(r==="default")K0="autoEdit";else if(r==="autoEdit")K0="plan";else if(r==="plan")K0="default";else K0="default";try{await P0.setSessionPermissionMode(w,_,K0),await m0().setPermissionMode(K0)}catch(C0){O1.error("权限模式切换失败:",C0 instanceof Error?C0.message:C0)}}),b=t0(async(r)=>{try{let K0={displayName:r.displayName,provider:r.provider,model:r.model,overrides:r.overrides};if(r.modelProvider)await m0().addModelWithProvider(K0,r.modelProvider);else await m0().addModel(K0);H.setInitializationStatus("ready")}catch(K0){throw O1.error("初始化配置保存失败:",K0 instanceof Error?K0.message:K0),K0}}),V=t0(()=>{if(U==="shortcuts")H.closeModal();else H.setActiveModal("shortcuts")}),p=t0(async(r,K0,C0)=>{return m8({intent:K0,session:r,newSessionId:C0?.newSessionId,announceFork:C0?.announceFork,permissionModeOverride:Y.permissionMode},_,z,o)}),j=t0(async(r,K0)=>{let j1=(await g8(K0,_)).filter((g0)=>g0.sessionId===r);if(j1.length===0)throw Error(`Session not found: ${r}`);if(j1.length>1)throw Error(`Multiple workspaces contain session ${r}; use the session selector`);return j1[0]}),{showSuggestions:h,suggestions:E,selectedSuggestionIndex:Z0}=A6(y,k,l,a,I,g,N,v,V,U==="shortcuts");_$(()=>{if(y.value&&U==="shortcuts")H.closeModal()},[y.value,U,H]);let J0=t0(async()=>{X.current=!0;try{let r=Y.forkSession?"fork":"resume",K0=await g8(r,_);if(K0.length===0){if(Y.forkSession){O1.error("没有可供 fork 的历史会话"),f1(1);return}z.addAssistantMessage("没有找到历史会话,开始新对话。");return}let C0=K0[0];await p(C0,r,{newSessionId:Y.forkSession?Y.sessionId:void 0,announceFork:Y.forkSession?!1:void 0})}catch(r){if(O1.error("[BladeInterface] 继续会话失败:",r),Y.forkSession){f1(1);return}z.addAssistantMessage("继续会话失败,开始新对话。")}}),w0=t0(async()=>{X.current=!0;try{if(typeof Y.resume==="string"&&Y.resume!=="true"){let C0=Y.forkSession?"fork":"resume",$8=await j(Y.resume,C0);await p($8,C0,{newSessionId:Y.forkSession?Y.sessionId:void 0,announceFork:Y.forkSession?!1:void 0});return}let r=Y.forkSession?"fork":"resume",K0=await g8(r,_);if(K0.length===0)O1.error("没有找到历史会话"),f1(1);H.showSessionSelector(K0,r)}catch(r){O1.error("[BladeInterface] 加载会话失败:",r),f1(1)}});_$(()=>{if(J.current)return;if(Q){J.current=!0,J0();return}if(Y.resume)J.current=!0,w0()},[Q,Y.resume,J0,w0]);let k0=t0(async(r)=>{let K0=A.details?.type;if(K0==="enterPlanMode"&&r.approved)try{await P0.setSessionPermissionMode(w,_,"plan"),await m0().setPermissionMode("plan"),O1.debug("[BladeInterface] Entered Plan mode")}catch(C0){O1.error("[BladeInterface] Failed to enter Plan mode:",C0)}if(K0==="exitPlanMode"&&r.approved)O1.debug("[BladeInterface] ExitPlanMode approved, Store auto-synced");M(r)}),c0=t0(()=>{z.addAssistantMessage("设置已取消"),z.addAssistantMessage("Blade 需要 API 配置才能正常工作。"),z.addAssistantMessage("您可以稍后运行 Blade 重新进入设置向导。"),f1(0)}),h0=t0(()=>{H.closeModal()}),H1=t0(async(r)=>{try{await p(r,W?.intent??"resume"),H.closeModal()}catch(K0){O1.error("[BladeInterface] Failed to restore session:",K0),z.addAssistantMessage(`会话操作失败: ${K0 instanceof Error?K0.message:"未知错误"}`),H.closeModal()}}),I1=t0(()=>{if(Y.resume)f1(0);else H.closeModal()}),T$=t0((r)=>{H.showModelEditWizard(r)}),s0=t0((r)=>{z.addAssistantMessage(`已添加模型配置: ${r.displayName??r.model},并已切换到该模型`),h0()}),V2=t0((r)=>{z.addAssistantMessage(`已更新模型配置: ${r.displayName??r.model}`),h0()});_$(()=>{if(B){F.setFocus("model-config-wizard");return}if(A.isVisible)F.setFocus("confirmation-prompt");else if(U==="sessionSelector")F.setFocus("session-selector");else if(U==="themeSelector")F.setFocus("theme-selector");else if(U==="modelSelector")F.setFocus("model-selector");else if(U==="modelAddWizard"||U==="modelEditWizard")F.setFocus("model-config-wizard");else if(U==="permissionsManager")F.setFocus("permissions-manager");else if(U==="agentsManager")F.setFocus("agents-manager");else if(U==="agentCreationWizard")F.setFocus("agent-creation-wizard");else if(U==="hooksManager")F.setFocus("hooks-manager");else if(U==="shortcuts")F.setFocus("main-input");else F.setFocus("main-input")},[B,A.isVisible,U,F.setFocus]),_$(()=>{if(!R||X.current)return;if(sJ().length>0){X.current=!0;return}X.current=!0,z.addAssistantMessage("请输入您的问题,我将为您提供帮助。")},[R]),_$(()=>{if(!G)return;if(K.current===G)return;if(K.current=G,q==="error")z.addAssistantMessage(`初始化失败: ${G}`);else z.addAssistantMessage(`${G}`),z.addAssistantMessage("请重新尝试设置,或检查文件权限")},[G,q,z.addAssistantMessage]);let V1=t0(async(r)=>{try{await k({displayText:r,text:r,images:[],parts:[{type:"text",text:r}]})}catch(K0){let C0=K0 instanceof Error?K0.message:"无法发送初始消息";z.addAssistantMessage(`初始消息发送失败:${C0}`)}});_$(()=>{let r=Y.initialMessage?.trim();if(!r||Z.current||!R||B)return;Z.current=!0,I(r),V1(r)},[Y.initialMessage,R,B,k,I]);let j2=t0(async(r)=>{try{await m0().setPermissionMode(r)}catch(K0){O1.error("权限模式初始化失败:",K0 instanceof Error?K0.message:K0)}});if(_$(()=>{let r=Y.permissionMode;if($)O1.debug("[Debug] permissionMode from CLI:",r),O1.debug("[Debug] current permissionMode:",C);if(!r||r===C)return;j2(r)},[Y.permissionMode,C]),f)return null;if(B)return M0(aQ,{mode:"setup",onComplete:b,onCancel:c0},void 0,!1,void 0,this);if($)O1.debug("[Debug] 渲染主界面,条件检查:",{confirmationVisible:A.isVisible,activeModal:U});let q0=U==="modelSelector",y0=O,Q0=U==="modelAddWizard"?"add":U==="modelEditWizard"&&y0?"edit":null,_0=q0||Boolean(Q0),x0=U==="agentsManager",K1=U==="agentCreationWizard",u0=U==="skillsManager",G1=U==="pluginsManager",e$=y0?{displayName:y0.displayName,provider:y0.provider,model:y0.model,overrides:y0.overrides}:void 0,o1=A.isVisible&&A.details?A.details.type==="mcpElicitation"&&A.details.mcpElicitation?M0(d9,{details:A.details.mcpElicitation,onComplete:(r,K0)=>k0({approved:r.action==="accept",elicitation:r,...K0?{openExternalUrl:!0}:{}})},void 0,!1,void 0,this):A.details.type==="askUserQuestion"&&A.details.questions?M0(jJ,{questions:A.details.questions,onComplete:(r)=>k0({approved:!0,answers:r}),onCancel:()=>k0({approved:!1})},void 0,!1,void 0,this):M0(F9,{details:A.details,onResponse:k0},void 0,!1,void 0,this):U==="themeSelector"?M0(tJ,{},void 0,!1,void 0,this):U==="permissionsManager"?M0(CJ,{onClose:h0},void 0,!1,void 0,this):U==="sessionSelector"?M0(xJ,{intent:W?.intent??"resume",sessions:W?.sessions,onSelect:H1,onCancel:I1},void 0,!1,void 0,this):U==="hooksManager"?M0(W9,{workspaceRoot:_,sessionId:w,onClose:h0},void 0,!1,void 0,this):null,b8=Boolean(o1);return M0(z$,{flexDirection:"column",width:"100%",overflow:"hidden",children:[o1,M0(z$,{flexDirection:"column",display:b8?"none":"flex",children:[M0(XJ,{},void 0,!1,void 0,this),M0(iJ,{},void 0,!1,void 0,this),M0(c9,{paused:b8},void 0,!1,void 0,this),M0(j9,{input:y.value,cursorPosition:y.cursorPosition,onChange:y.setValue,onChangeCursorPosition:y.setCursorPosition,onAddPasteMapping:y.addPasteMapping,onAddImagePasteMapping:y.addImagePasteMapping},void 0,!1,void 0,this),q0&&M0(z$,{marginTop:1,paddingX:2,children:M0(KJ,{onClose:h0,onEdit:T$},void 0,!1,void 0,this)},void 0,!1,void 0,this),Q0&&M0(z$,{marginTop:1,paddingX:2,children:M0(aQ,{mode:Q0,modelId:y0?.id,initialConfig:Q0==="edit"?e$:void 0,onComplete:Q0==="edit"?V2:s0,onCancel:h0},void 0,!1,void 0,this)},void 0,!1,void 0,this),x0&&M0(z$,{marginTop:1,paddingX:2,children:M0(T6,{workspaceRoot:_,onComplete:h0,onCancel:h0},void 0,!1,void 0,this)},void 0,!1,void 0,this),K1&&M0(z$,{marginTop:1,paddingX:2,children:M0(U8,{onComplete:h0,onCancel:h0},void 0,!1,void 0,this)},void 0,!1,void 0,this),u0&&M0(z$,{marginTop:1,paddingX:2,children:M0(lJ,{onComplete:h0,onCancel:h0},void 0,!1,void 0,this)},void 0,!1,void 0,this),G1&&M0(z$,{marginTop:1,paddingX:2,children:M0(DJ,{workspaceRoot:_,onComplete:h0,onCancel:h0},void 0,!1,void 0,this)},void 0,!1,void 0,this),M0(j6,{suggestions:E,selectedIndex:Z0,visible:h&&!_0},void 0,!1,void 0,this),M0(V6,{},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)};import{Box as nX,Text as N$}from"ink";import tX from"react";import{jsxDEV as a1}from"react/jsx-dev-runtime";class w8 extends tX.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 a1(nX,{flexDirection:"column",padding:1,borderStyle:"round",borderColor:"red",children:[a1(N$,{color:"red",children:"应用发生错误"},void 0,!1,void 0,this),a1(N$,{children:" "},void 0,!1,void 0,this),a1(N$,{color:"red",children:this.state.error?.message},void 0,!1,void 0,this),a1(N$,{children:" "},void 0,!1,void 0,this),a1(N$,{color:"gray",children:"错误详情:"},void 0,!1,void 0,this),a1(N$,{color:"gray",children:this.state.error?.stack},void 0,!1,void 0,this),a1(N$,{children:" "},void 0,!1,void 0,this),a1(N$,{color:"yellow",children:"请重启应用或联系开发者"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return this.props.children}}import{Box as I$,Text as i1,useInput as sX}from"ink";import{useState as sQ}from"react";import{jsxDEV as X1}from"react/jsx-dev-runtime";var k2=[{key:"update",label:"Update now",description:`runs \`${JY()}\``},{key:"skip",label:"Skip",description:""},{key:"skip_until_next",label:"Skip until next version",description:""}],ZY=({versionInfo:$,onComplete:Q})=>{let[Y,J]=sQ(0),[Z,X]=sQ(!1),[K,q]=sQ(null);sX((U,W)=>{if(W.ctrl&&U==="c"){G8().shutdown("SIGINT",0);return}if(Z||K)return;if(W.upArrow||U==="k")J((O)=>O>0?O-1:k2.length-1);else if(W.downArrow||U==="j")J((O)=>O<k2.length-1?O+1:0);else if(W.return)G(k2[Y].key);else if(U==="1")G("update");else if(U==="2")G("skip");else if(U==="3")G("skip_until_next")});let G=async(U)=>{switch(U){case"update":{X(!0);let W=await YY();q(W.message),setTimeout(()=>{G8().shutdown("SIGINT",0)},1500);break}case"skip":Q();break;case"skip_until_next":if($.latestVersion)await QY($.latestVersion);Q();break}};if(K)return X1(I$,{flexDirection:"column",marginY:1,children:X1(i1,{children:K},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Z)return X1(I$,{flexDirection:"column",marginY:1,children:X1(i1,{color:"cyan",children:"Updating..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);return X1(I$,{flexDirection:"column",marginY:1,children:[X1(i1,{color:"yellow",bold:!0,children:["Update available! ",X1(i1,{color:"gray",children:[$.currentVersion," ","->"," ",$.latestVersion]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),X1(I$,{marginTop:1,children:X1(i1,{color:"gray",children:["Release notes:"," ",X1(i1,{color:"cyan",underline:!0,children:$.releaseNotesUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),X1(I$,{flexDirection:"column",marginTop:1,children:k2.map((U,W)=>{let O=W===Y,H=O?"› ":" ",z=`${W+1}. `;return X1(I$,{children:X1(i1,{color:O?"cyan":void 0,children:[H,z,U.label,U.description&&X1(i1,{color:"gray",children:[" (",U.description,")"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},U.key,!1,void 0,this)})},void 0,!1,void 0,this),X1(I$,{marginTop:1,children:X1(i1,{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)};import{Box as S2,Text as t$,useInput as eX}from"ink";import{useState as XY}from"react";import{jsxDEV as D1}from"react/jsx-dev-runtime";var KY=({status:$,onTrust:Q,onContinueSafely:Y})=>{let J=r0.getTheme(),[Z,X]=XY(!1),[K,q]=XY(null);return eX((G,U)=>{if(Z)return;if(U.return||G.toLowerCase()==="t"){X(!0),q(null),Q().catch((W)=>{q(W instanceof Error?W.message:"Failed to trust workspace"),X(!1)});return}if(G.toLowerCase()==="s"||U.escape)X(!0),q(null),Y().catch((W)=>{q(W instanceof Error?W.message:"Failed to continue safely"),X(!1)})}),D1(S2,{flexDirection:"column",paddingX:1,children:[D1(t$,{bold:!0,color:J.colors.warning,children:"Workspace review required"},void 0,!1,void 0,this),D1(t$,{dimColor:!0,children:$.projectPath},void 0,!1,void 0,this),D1(S2,{marginTop:1,flexDirection:"column",children:[D1(t$,{children:"This project contains configuration that can change models, start MCP processes, relax permissions, inject environment variables, or load instructions, commands, skills, agents, and plugins."},void 0,!1,void 0,this),$.sources.map((G)=>D1(t$,{children:[" ",G.path," · ",G.effects.length," effect(s)"]},`${G.kind}:${G.path}`,!0,void 0,this))]},void 0,!0,void 0,this),K&&D1(S2,{marginTop:1,children:D1(t$,{color:J.colors.error,children:K},void 0,!1,void 0,this)},void 0,!1,void 0,this),D1(S2,{marginTop:1,children:D1(t$,{bold:!0,children:Z?"Applying decision...":"[Enter/T] Trust and load [S/Esc] Continue safely"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};import{useStdout as $7}from"ink";import{useEffect as Q7}from"react";function GY(){let{stdout:$}=$7();Q7(()=>{if(!$.isTTY)return;return $.write(w9),$.write(TQ),()=>{$.write(b9),$.write(TQ)}},[$])}function qY($){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 s$}from"react/jsx-dev-runtime";function Y7($){if($1().config.actions.setConfig($),$.debug)console.log("[Debug] 模型配置检查通过,准备就绪");a0().setInitializationStatus("ready")}var MH=($)=>{GY();let[Q,Y]=D2(!1),[J,Z]=D2(null),[X,K]=D2(!1),[q,G]=D2(null),U=v2((z,w)=>{let _=z instanceof Error?z.message:String(z);if(a0().setInitializationError(_),a0().setInitializationStatus("error"),Y(!0),w)console.error("[FAIL] 应用初始化失败:",_)}),W=v2(async()=>{try{let z=$1().config.config??OY,w=zY(z,$);if(Y7(w),w.resumeSessionId)_Y().restoreSession(w.resumeSessionId,[]);if(w.debug)console.error("[Debug] 运行时配置:",w);let _=w.codeTheme;if(_&&r0.hasTheme(_)){if(r0.setTheme(_),$.debug)console.log(`[OK] 已加载主题: ${_}`)}try{z1.getInstance().loadConfig(w.hooks||{},l0());let C=await NY(l0());if($.debug&&w.hooks?.enabled)console.log("[OK] Hooks 系统已启用");if($.debug)console.log(`[OK] Workspace resources: ${C.subagents.getAllNames().length} agents, ${C.skills.size} skills, ${C.commands.getCommandCount()+C.commands.getPluginCommandCount()} commands, ${C.plugins.getAll().length} plugins`);let S=$1().session.sessionId;UY(S)}catch(F){if($.debug)console.warn("Hooks 初始化失败:",qY(F))}x8(async()=>{await HY.getInstance().killAll(),await FY.getInstance().disconnectAll(),z1.getInstance().cleanup()}),Y(!0)}catch(z){U(z,!!$.debug)}}),O=v2(async()=>{let z=await eQ.getInstance().getStatus(l0());if(z.state==="untrusted"||z.state==="error"){G(z);return}await W()}),H=v2(async()=>{if($.versionCheckPromise){let z=await $.versionCheckPromise;if(z){Z(z),K(!0);return}}await O()});if(J7(()=>{H()},[]),X&&J)return s$(w8,{children:s$(ZY,{versionInfo:J,onComplete:()=>{K(!1),O()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(q)return s$(w8,{children:s$(KY,{status:q,onTrust:async()=>{await eQ.getInstance().trust(l0()),await WY(),G(null),await W()},onContinueSafely:async()=>{G(null),await W()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(!Q)return null;return s$(w8,{children:s$($Y,{...$},void 0,!1,void 0,this)},void 0,!1,void 0,this)};export{MH as AppWrapper};
|